pax_global_header00006660000000000000000000000064132674134200014514gustar00rootroot0000000000000052 comment=5798ccbfff4fb1fc474b81a745e6d5784381f4fa fox1.6-1.6.57/000077500000000000000000000000001326741342000126355ustar00rootroot00000000000000fox1.6-1.6.57/ADDITIONS000066400000000000000000000056621326741342000141070ustar00rootroot00000000000000 API Additions to Widgets ======================== When designing Widgets, the idea is to provide a full set of API's to allow developers to manipulate it. Sometimes, new API's may need to be added if the initial implementation of some Widget didn't implement a complete set. Everybody always wants their favorite function implemented in the library, because it would make *their* job easier. Thus, the temptation exists to keep adding ``useful'' little functions, just to satisfy everybody. There are several reasons why this is a bad idea: - Lots of small ad-hoc functions will make a Widget much harder for everybody to learn. - Since a Widget implements a certain abstraction, adding lots of functions will make it harder to maintain the simplicity of the abstraction. - Lots of functions will also make it more difficult to keep the software implementation consistent. - It will make it harder to reach a point of ``closure'' i.e. one keeps adding things, instead of attaining completeness. To curb wild-growth in API's, we prefer to add API's judiciously. In order for a function to be added to the library, one should demonstrate: - That the utility of this new function appeals to a large audience. - The function fills a real gap in functionality. - The function adds functionality that existing API's are unable to provide. - The new function does not break the abstraction that the Widget provides. - Appropriate rationale for its inclusion can be given. [This has to be a better argument than: ``Because I need it!'']. Goals for Widget API's should be: 1) Orthogonality. This augments transferability of knowledge from one situation to the next. 2) Predictability. Naming should strongly reflect function. Functions should have no side-effects not reflected in the name; preferably, one function should do one thing only. 3) Symmetry. This means for example every ``set'' function should have a corresponding ``get,'' every ``open'' should have a ``close'' and so on. 4) Completeness. All parameters can be accessed, and all features of the Widget can be used, without any need for backdoors etc. 5) Minimality. A set of API's is minimal if one can not take away anything without making the API incomplete. Minimality makes it much easier to maintain consistent state in the Widget. 6) Philosophical fit. The FOX library has been developed with certain underlying paradigms, both in concept as well as in implementation; API's should adhere to these, as deviation from them will make things less easy to understand, or less easy to extend. 7) Wide Appeal. When convenience API's are added, it must be true that these functions have broad appeal, i.e. expected to be used by a large fraction of the library's users. fox1.6-1.6.57/AUTHORS000066400000000000000000000040731326741342000137110ustar00rootroot00000000000000 List of contributors, in alphabetical order: ============================================ Johnathan Bush: Progress Bar Widget contributor. Pierre Cyr Contributions to FXTable widget. Janusz Ganczarski : PCX, ICO, TGA Image/Icon format contributor. Daniel Gehriger : FXGIFCursor, Multi-lingual keyboard support, and much more. Eric Gillet : TIFF Image support. Freddy Golos: Freddy [Fyodor] was one of the first adopters of FOX, back when everybody still had to take my word for it how nice it was; Freddy made it clear there was real potential here. Angel-Ventura Mendo Gomez : OpenGL Shape Objects. Sean Hubbell: Initial version of FXFile API's. Sander Jansen : New web pages, new web layout, many useful suggestions and code. Code for the round progress dial, and lots of Windows specific nitty-gritties. CUR cursor. Lyle Johnson : Windows Port of FOX, Python, Ruby bindings; FXSpinner widget. The Spinner Widget. Lyle is also largely responsible for the Window NT port of FOX. Torsten Landschoff FOX automake, and reswrap man page files. René van Paassen : FOX RPM spec file. Guoqing Tian: Dial Widget contributor. David Tyree : JPEG Image support. Charles W. Warren charles@moontown.org: Shutter Widgets contributor. The concept of the Data Targets. Charles has also been my principal sounding board for exploring the philosophical underpinnings of the FOX Library. David Tyree: JPEG Image and JPEG Icon support. Jeroen van der Zijp : Main FOX Library author. The true list should probably be much larger; if you feel I have inadvertantly omitted you, please email me jeroen@fox-toolkit.org and I'll add you immediately. fox1.6-1.6.57/INSTALL000066400000000000000000000514261326741342000136760ustar00rootroot00000000000000 The FOX GUI Library Installation ================================ Systems Which are Supported or Known to work: ============================================= o Linux (gcc, INTEL C++), x86, IA64 (Itanium), x86-64 (Opteron). o Windows XP, 2K, NT, Windows 9x, (VC++, Cygwin, MinGW, Borland C++, Digital Mars C++, OpenWatcom C++, ... ) o Digital Unix/COMPAQ Tru64 OSF1 3.2, 4.0x, 5.0x (gcc and DEC cxx). o SGI IRIX 5.3, 6.1, 6.2, 6.4, 6.5 (gcc and MIPS Pro C++) o SUN Solaris, SunOS (gcc, SUN WorkShop Compiler, SUN Forte C++) o HP-UX PA-RISC 9.x, 10.x and B.11.00, (gcc and aCC). o HP-UX B.11.22 Intel Itanium (IA64) using aCC. o AIX 4.2, 4.3 o FreeBSD o Sequent DYNIX/ptx 4.4.7 o IBM VisualAge C++ 3.5 (Windows) o Apple MAC OS-X. You will need an X-Server, either Apple's or XFree. Building Documentation. ======================= You will need the "doxygen" documentation extraction tool. You can get it from: http://www.stack.nl/~dimitri/doxygen/index.html Many current linux distributions already include this tool as an optional package. To generate documentation, unpack the FOX tarball and go to directory "doc." Then issue the command: make docs If doxygen is installed properly, it will churn for a while and then generate hyperlinked documentation from the header files' document comments. You will find this reference documentation in the "doc/ref" directory. For most UNIX systems. ====================== For most unix systems you can configure simply as: ./configure You can disable OpenGL support by configuring as: ./configure --with-opengl=no After configure runs its course, simply type ``make'' to build the library, and ``make install'' to install it. FOX should compile on most UNIX platforms; we have tested the following: SGI, IBM, HP, SUN, DEC, LINUX, all with gcc; however, FOX uses a fairly conservative subset of C++, and should be no problem to port to other, more primitive, C++ compilers. On some machines, the X11 header files are still K&R C, instead of ANSI-C. You might try define add "-fpermissive" to the CXXFLAGS environment variable prior to running configure (this is the flag for GCC; other compilers may have similar option for old K&R C). When programming against FOX, you should only have to include "fx.h", and for 3D programs, "fx3d.h". To use keyboard symbols, include "fxkeys.h" also. Specifically, to remain portable application programs should NOT include any X window header files. You may of course need other system headers ("stdio.h", "gl.h", etc). Enabling XFT Support. ===================== On Linux systems, you can turn on XFT anti-aliased font support. ./configure --with-xft=yes For portability reasons, the default of this settings is off. XCursor Support. ================ FOX supports Xcursor support where available. This is normally turned on, allowing full alpha-blended cursor support. However, you can disable if desired: ./configure --with-xcursor=no This will cause to revert to vanilla black/white cursor support only; note that your color cursors will still work: they will be thresholded to black and white depending on brightness. Building for Debug or Release. ============================== Normal builds [w/o any special arguments to configure] will include assert and trace statements into the library, but no debug symbols. This mode compiles the fastest and allows for tracing of the FOX library. This mode is the recommended way to develop FOX applications, as it allows for resource tracing and internal consistency checks. Building for debug will add debug symbols as needed by your debugger. It also includes assert and tracing into the library. This setting is recommended if you need to debug the FOX library itself. Full debug executables are build by configuring with: ./configure --enable-debug Release builds strip all debug information, asserts, and tracing, and generates optimized code. The resulting library is the smallest/fastest, and this is the recommended setting for production code. To build for release, use: ./configure --enable-release Building Shared or Non-Shared Libraries. ======================================== You can build FOX either as shared library, static library, or both. The default is both. To build static library only [this may be necessary on certain systems where shared library support is lacking]: ./configure --disable-shared to build shared library only: ./configure --disable-static Thread-safe support. ==================== It is highly recommended to build FOX with thread-safe API's wherever possible; this is accomplished using: ./configure --enable-threadsafe Enabling thread-safe will cause FOX to use the thread-safe equivalent API's for some common C library functions like getpwuid(), readdir() and so on. Image File Format Support. ========================== FOX needs external libraries for JPEG, TIFF, and PNG image format. On some systems, such as Linux, *BSD, these are likely already installed on your system. On Windows or older UNIX systems, they need to be compiled and installed first. See below on how to override default locations on UNIX systems. The JPEG support is provided by jpegsrc.v6b.tar.gz, the PNG support by libpng-1.2.5.tar.gz (or a newer version). The TIFF support is in tiff-v3.5.7.tar.gz (or later). All these files are available on ftp.fox-toolkit.org. After these libraries have been compiled and installed, compile FOX with HAVE_TIFF_H=1, HAVE_PNG_H=1, HAVE_JPEG_H=1. The TIFF library may also need the JPEG library (JPEG is one of the tags supported in the TIFF format), so compile the JPEG library first. TIFF also needs the GNU compression library zlib (available as zlib-1.1.4.tar.gz (or later) on ftp.fox-toolkit.org). Compression Library Support. ============================ Compressed FXStream support is enabled by installing zlib-1.1.4.tar.gz and bzip2-1.0.2.tar.gz (or later), then compiling FOX with HAVE_ZLIB_H=1 and HAVE_BZ2LIB_H=1, respectively. You do not need to install them on Linux, *BSD, but you probably do on Windows and older UNIX systems. Overriding Libraries. ===================== The default libraries determined by configurations are not always the ones you want to use; therefore, there is a mechanism to override the default choices of the configuration system. The override is done simply by setting environment variables prior to running configure; make sure config.cache is removed if you've ran configure before. Configure allows for the following overrides: Environment Variable Default value if not set ==================== ======================== LIBJPEG -ljpeg LIBPNG -lpng LIBTIFF -ltiff LIBZ -lz LIBBZ2 -lbz2 LIBGL -lopengl32 (win32) LIBGLU -lglu32 (win32) LIBGL -lGL (unix) LIBGLU -lGLU (unix) On SGI IRIX 6.x =============== On SGI Systems where MIPS Pro C++ compiler is used instead of GCC, you will need to set the environment variable CXX to: CC -n32 and then run: ./configure --x-libraries=/usr/lib32 or, you can also build FOX for the 64 bit model, and set CXX to: CC -64 and run configure with: ./configure --x-libraries=/usr/lib64 The first argument is only needed if you also have MESA on your system. FOX searches for the png library [for Portable Network Graphics, the successor of GIF], but the library it finds, even though it has the same name, is not the right one. You will need to disable this feature, or download the PNG library from http://www.graphicswiz.com/png/ and compile it, and pass the appropriate flags for your compiler to find the new version. If compiling without PNG, pass the flag: --disable-png; likewise, you can disable JPEG with the flag: --disable-jpeg. SGI Altix ========= Using Intel C++ compiler on IA64-based Altix system, drop optimization level to -O1: setenv CXX "icpc -O1" setenv CC "icc -O1" Full optimization with icc compiler appears to generate incorrect code. Using gcc 2.95.2 on IRIX 6.x (Thanks to Theo Venker) ==================================================== You won`t believe the solution: rename FXApp.cpp to FXApp.C and everything is fine. The manual page of g++ says that it accepts C++ suffixes .C, .cc, .cxx, .cpp, and .c++, and it does, but for .cpp and .c++ it compiles with -D__LANGUAGE_C -D_LANGUAGE_C -DLANGUAGE_C whereas the others suffixes use -D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS. This is clearly a bug in g++. I decided to wait for the next g++ release, so I didn`t report this to the g++ maintainers. May be you will. The work-arround is: export CC="g++ -D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS" and then run configure. Building 64-bit code on Linux for x86-64 (AMD Opteron, Athlon64) ================================================================ Linux for AMD Opteron supports execution of both 32 and 64 bit code on the same system; consequenly, two sets of libraries are installed. To configure properly, you will need to let ld search the right set of directories. Here's how: export LDFLAGS="-L/usr/lib64 -L/usr/X11R6/lib64 -L/lib64" ./configure No other issues are known at this time. On Alpha Processor based Workstations (COMPAQ/DEC OSF1) ======================================================= If you use DEC's "cxx" instead of GNU gcc, you will need to make sure the you add the flag option -D_XOPEN_SOURCE_EXTENDED to the compiler; this will allow usage of a wider set of POSIX functions; GCC seems to have this flag on by default, but the standard C++ compiler on OSF1 does not; thanks to thomas.goessler@avl.com for pointing this out. When compiling with gcc on Digital Unix, you may want to enable gradual underflow support for IEEE754 conformant floating point operations: export CXX="gcc -mieee" ./configure .... If this flag is NOT set, floating point operations which yield underflows will cause a floating point exception (SIGFPE). Many perfectly correct programs may generate underflows when working with small numbers (~1e-38 single precision, ~1e-308 double precision); working with these numbers may involve so-called denormalized floating point numbers, i.e. numbers where the mantissa can no longer be shifted to be within [0.5,1.0> range due to the exponent becoming 0. The ALPHA CPU does not include hardware do manipulate these numbers and will generate a trap when trying to manipulate these numbers; passing the "-mieee" flag will incorporate a software handler to ensure IEEE754 conformant floating arithmetic. Compiling FOX on the SUN ============================================ To use the SUN WorkShop Compiler compilers, simply configure FOX as follows: > cd fox > env CC=cc CXX=CC LD=CC ./configure Explanation: The SUN compilers require 'CC' to be used instead of 'ld' for creating the shared object library. This is to ensure that template instances will be included in the library. To build a static library 'CC -xar' should be used instead of 'ar' but there is no simple way to do this, due to limitations in 'libtool'. To get around this problem, the configure script invokes 'CC' with the argument '-instances=global', thus including template instances in the object file instead of using a template repository. This works fine and 'ar' can be used to build a static object library. Thanks to: Daniel Gehriger Compiling FOX using the HP/UX C++ Compiler ========================================== You may want to use GNU make instead of HP's make (/usr/bin/make). The default version of make doesn't seem to process the dependencies for PathFinder correctly and thus doesn't generate the reswrapped icon header files. Since PathFinder is built after the library and all the test programs, this isn't a huge problem -- it just means that the build will stop at that point with an error message. Configure the build by typing: env CC="cc +DA2.0W" CXX="aCC +DA2.0W +W740,749,863" ./configure The "+DA2.0W" flag tells it to compile as 64 bit. The "+W740,749,863" option suppresses a few warning messages that we believe are safe to ignore ;) Compiling FOX using the HP/UX Itanium^2 aCC C++ Compiler ======================================================== Assuming the aCC is installed in the recommended place: export CXX="aCC -fast -mt +DD64 -DHAVE_VSSCANF=1 -DHPOGL_SUPPRESS_FAST_API=1 -I/opt/aCC/include -I/opt/graphics/OpenGL/include -L/lib/hpux64 -L/usr/lib/hpux64 -L/opt/graphics/OpenGL/lib/hpux64" You may want to build the image support libraries also if you need them. Windows 95/98/ME/NT/XP Builds ============================= We currently build FOX on a regular basis using Microsoft Visual C++ 6.0. There is also support for Mingw32, the latest net release of Cygwin (v1.1) and Borland C++. We have heard of mixed success with building under Symantec's C++ 7.5 compiler. A few things to keep in mind: 1. If you want to include OpenGL support be sure to define the HAVE_OPENGL symbol on the compiler's command line, and to link your executables to the opengl32.lib and glu32.lib libraries. 2. The native Windows version of FOX relies on an undocumented API called _TrackMouseEvent() which is found in comctl32.dll. You should be sure to link your FOX applications with the comctl32.lib import library. Note that for this function is only available for comctl32.dll versions 4.70 or later; the latest version of this DLL can be downloaded from Microsoft's web site: http://www.microsoft.com/msdownload/ieplatform/ie/comctrlx86.asp If you are running Windows 98, Windows NT 4.0 SP3, or have installed Internet Explorer 4.0 or later, you *probably* already have the latest version of this DLL already. 3. The FOX registry mechanism uses the regular Windows registry under the hood; those functions are found in advapi32.lib which is not always a standard library. If you get some unresolved symbols at link time (esp. with names beginning with "Reg") try adding advapi32.lib to the list of libraries. 4. To build or use FOX as a DLL, the symbol FOXDLL must be defined; for building the core FOX library, FOXDLL_EXPORTS must also be defined. If FOXDLL_EXPORTS must NOT be not defined when you are just using FOX as a DLL. 5. It is recommended that extension DLL's are compiled with FOXDLL but that you define your own symbol to signify export; for example, the CHART library is build with CHARTDLL_EXPORTS; since the CHART library USES FOX, it must import the core FOX library, yet export its own functions. Building with Microsoft Visual C++ ================================== We now have a project workspace and project files set up for Win32 builds under Visual C++ 6.0. To use these, perform the following steps: 1. Download the latest fox.tar.gz from the web site; 2. Unzip & untar in your favorite place; 3. Start Visual C++ and open the fox/windows/vcpp/win32.dsw workspace; 4. Choose a project and build it. The project corresponding to the library itself is named "fox", and all of the other projects list it as a dependency. So if you choose, say, "glviewer" to build, it should first build the library and then build the glviewer test program. Building with Borland C++ Compilers =================================== The Borland makefiles are now tested semi-regularly against the free command-line compiler tools (compiler version 5.5) distributed by Borland/Inprise. We believe that they should also be usable for any recent Borland C++ compilers (e.g. Borland C++ Builder 3 or later). To build the FOX library, utility programs and example programs, change to the fox-0.99.xxx\windows\borland subdirectory and type "make". It should compile without a hitch, with the possible exception of building the OpenGL test programs in the "tests" subdirectory: + If you're using the free command-line compiler tools, you want to be sure that the %BCCDIR%\Lib\PSDK directory appears in the linker configuration file (%BCCDIR%\Bin\ilink32.cfg). If it isn't there, the linker won't know where to find the opengl32.lib and glu32.lib import libraries. + If you're using an older Borland compiler, you similarly want to be sure to have the updated OpenGL SDK for Win32 (including the OpenGL 1.2 header files and import libraries). If for some reason you don't have the correct header files and import libraries for OpenGL, and if OpenGL support isn't important for your project anyways, just modify the "Makefile.bc" in the fox-0.99.xxx\tests subdirectory so that it doesn't try to build the "glviewer.exe" or "gltest.exe" examples. Building FOX as a DLL ===================== The FOX library can also be built as a DLL for Windows; this is done by selecting the "foxdll" project and building it. Building this project causes the import libraries and DLLs to be placed in fox/lib. The filenames are foxdll.lib and foxdll.dll for the Release build, or foxdlld.lib and foxdlld.dll for the Debug build. To compile your own FOX applications so that they use the FOX DLL instead of the static FOX library, be sure to define the FOXDLL symbol in your compiler flags. Also note that the DLL must be in your search path for the program to run! Building FOX using OpenWatcom C++ ================================= The OpenWatcom C++ compiler can be downloaded free of charge from: http://www.openwatcom.org. To use the OpenWatcom "patch" with a fresh copy of FOX vx.y.zz, please make sure you've installed OpenWatcom C++ v1.0 and executed the SETVARS.BAT file found in the OpenWatcom installation directory. The Makefile.wc files rely on a Watcom environment variable, %WATCOM%, to determine the location of the COMCTL32.LIB file. Use the Makefile provided in windows/watcom/Makefile. Thanks to mikael@lyngvig.org for this port. Building FOX using MinGW ======================== Please see the standard FOX documentation file, "Developing Win32 GUI Applications Using FOX", available in this distribution as the file "doc/win32.html". Building FOX using Cygwin 1.1 ============================= FOX can also be built against the latest net release of Cygwin, available for download from here: http://sourceware.cygnus.com/cygwin/mirrors It absolutely will not compile with previous releases of Cygwin (i.e. Cygwin B20.1 or earlier), at least not without a lot of headaches. The win32api header files distributed with earlier versions of Cygwin were not up-to-date enough for FOX. It should compile out-of-the-box by typing: ./configure --disable-shared make Building FOX on QNX =================== For those interested in using FOX with QNX, before running configure for FOX on QNX it might be a good idea to run: automake --add-missing libtoolize -f Doing so will ensure that the configuration files needed to detect QNX are present.   Also, for now it is probably best to disable shared libraries when building FOX on QNX.  Programs linked with the FOX shared library will not run, but instead will segfault.  I plan on looking into a fix for this eventually.   Dustin Graves Building on MAC OS-X ==================== When building on Mac OS-X, the following might help: CXX="c++ -I/sw/include -L/sw/lib ./configure This might help; no guarantees, I can not test this myself.... For more information, see: http://freeride.rubyforge.org/wiki/wiki.pl?MacOSXInstall Image Formats in File Browser ============================= By default, all available image formats are supported in the File and Directory Browsers. Some of these image formats require external library support and consequently the size of your application executables may be reduced by limiting the supported formats to those supported in the core library; the image formats supported in the core library do not require external libraries and therefore supporting them does not incur any additional "code bloat". To support only the core image formats, pass the compiler flag: -DCORE_IMAGE_FORMATS=1 Another flag is the default icon search path, i.e. where the file browser will normally look to find and load icons bound to file extensions. The path below will cause the system to look in three different directories: -DDEFAULICONPATH="~/.foxicons:/usr/local/share/icons:/usr/share/icons" This would be a common setting for LINUX. Note that this is only the default; the actual search path can by set at any time by means of the FOX registry setting: [SETTINGS] iconpath="/home/extraicondir:/usr/share/icons" fox1.6-1.6.57/LICENSE000066400000000000000000000634641326741342000136570ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 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. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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 with this License. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser 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 Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! fox1.6-1.6.57/LICENSE_ADDENDUM000066400000000000000000000036161326741342000151110ustar00rootroot00000000000000 ADDENDUM TO LICENSE March 2003 Copyright (C) 2002,2005 Jeroen van der Zijp. Everyone is permitted to copy and distribute verbatim copies of this license addendum document, but changing it is not allowed. FOX Toolkit Library License Addendum. 1. License. The FOX Toolkit Library ("The Library") is licensed under GNU Lesser General Public License as published by the Free Software Foundation, version 2.1 of the License, or (at your option) any later version. 2. Relinking Exemption. You may distribute a combined work using a statically linked, unmodified copy of the FOX Library under terms of your choice, without the relinking requirement stipulated under the GNU Lesser Public License, subject to the following conditions: a. This static relinking exemption covers only the FOX Toolkit Library. Other libraries which the FOX Library may need are covered by their own respective licenses. b. Modification of the configure scripts, makefiles, or installation tools of the FOX Library to support a specific platform does not constitute creating a modified copy based on the FOX Library. c. Programs or binaries statically linked with the FOX Library must be identified as such by including, in the Documentation or by other means (for example in the About Box or Online Help), the following statement: "This software uses the FOX Toolkit Library (http://www.fox-toolkit.org)." d. Subclassing from Objects or Widgets supplied by the Library involves no modifications to the source code of the Library itself, and does not constitute creating a modified copy based on the Library. 3. If you do not accept or are unable to meet the conditions under (2), you may continue to distribute the combined work under the original GNU Lesser General Public License. END OF ADDENDUM fox1.6-1.6.57/Makefile.am000066400000000000000000000016251326741342000146750ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in # For non-gcc compilers, change the options to "no-dependencies" AUTOMAKE_OPTIONS = foreign dist-zip SUBDIRS = utils include src chart doc tests shutterbug adie pathfinder calculator windows EXTRA_DIST = ADDITIONS AUTHORS INSTALL LICENSE LICENSE_ADDENDUM TRACING README fox.lsm index.html aclocal.m4 bin_SCRIPTS = fox-config pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = fox.pc CLEANFILES = fox.tar.gz snapshot: dist-all cp $(distdir).tar.gz /net/linkyftp/pub/fox-snapshot.tar.gz cp $(distdir).zip /net/linkyftp/pub/fox-snapshot.zip web: distdir cd $(distdir)/doc && doxygen doxygen.cfg cp -r $(distdir)/doc/* /site/www drop: dist-all cp $(distdir).tar.gz /site/ftp/pub cp $(distdir).zip /site/ftp/pub sha1sum $(distdir).tar.gz >/site/ftp/pub/$(distdir).tar.gz.sha1sum sha1sum $(distdir).zip >/site/ftp/pub/$(distdir).zip.sha1sum fox1.6-1.6.57/Makefile.in000066400000000000000000000731321326741342000147100ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = fox.spec fox-config fox.pc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)" SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/fox-config.in \ $(srcdir)/fox.pc.in $(srcdir)/fox.spec.in AUTHORS INSTALL \ README compile config.guess config.sub depcomp install-sh \ ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz $(distdir).zip GZIP_ENV = --best DIST_TARGETS = dist-gzip dist-zip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # For non-gcc compilers, change the options to "no-dependencies" AUTOMAKE_OPTIONS = foreign dist-zip SUBDIRS = utils include src chart doc tests shutterbug adie pathfinder calculator windows EXTRA_DIST = ADDITIONS AUTHORS INSTALL LICENSE LICENSE_ADDENDUM TRACING README fox.lsm index.html aclocal.m4 bin_SCRIPTS = fox-config pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = fox.pc CLEANFILES = fox.tar.gz all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): fox.spec: $(top_builddir)/config.status $(srcdir)/fox.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ fox-config: $(top_builddir)/config.status $(srcdir)/fox-config.in cd $(top_builddir) && $(SHELL) ./config.status $@ fox.pc: $(top_builddir)/config.status $(srcdir)/fox.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(SCRIPTS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pkgconfigDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-pkgconfigDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-generic \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-binSCRIPTS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgconfigDATA install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binSCRIPTS \ uninstall-pkgconfigDATA .PRECIOUS: Makefile snapshot: dist-all cp $(distdir).tar.gz /net/linkyftp/pub/fox-snapshot.tar.gz cp $(distdir).zip /net/linkyftp/pub/fox-snapshot.zip web: distdir cd $(distdir)/doc && doxygen doxygen.cfg cp -r $(distdir)/doc/* /site/www drop: dist-all cp $(distdir).tar.gz /site/ftp/pub cp $(distdir).zip /site/ftp/pub sha1sum $(distdir).tar.gz >/site/ftp/pub/$(distdir).tar.gz.sha1sum sha1sum $(distdir).zip >/site/ftp/pub/$(distdir).zip.sha1sum # 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: fox1.6-1.6.57/README000066400000000000000000000115021326741342000135140ustar00rootroot00000000000000 The FOX GUI Library =================== Jeroen van der Zijp What Is FOX? ============ FOX is a C++ based Toolkit for developing Graphical User Interfaces easily and effectively. It offers a wide, and growing, collection of Controls, and provides state of the art facilities such as drag and drop, selection, as well as OpenGL widgets for 3D graphical manipulation. FOX also implements icons, images, and user-convenience features such as status line help, and tooltips. Tooltips may even be used for 3D objects! Considerable importance has been placed on making FOX one of the fastest toolkits around, and to minimize memory use:- FOX uses a number of techniques to speed up drawing and spatial layout of the GUI. Memory is conserved by allowing programmers to create and destroy GUI elements on the fly. Even though FOX offers a large collection of Controls already, FOX leverages C++ to allow programmers to easily build additional Controls and GUI elements, simply by taking existing controls, and creating a derived class which simply adds or redefines the desired behavior. One of the prime design goals of FOX is the ease of programming; thus, most controls can be created using a single line of C++ code; most parameters have sensible default values, so that they may be omitted, and layout managers ensure that designers of GUI's do not have to worry about precise alignments. Another nice feature of FOX which significantly reduces the number of lines of code which have to be written is FOX's ability to have widgets connect to each other, and passing certain commands between them; for example, a menu entry Hide Toolbar can be directly connected to the Toolbar, and cause it to hide. Finally, FOX makes it easy to maintain the state of the GUI in an application by having the GUI elements automatically updating themselves by interrogating the application's state. This feature eliminates the large amount of effort that may go into sensitizing, graying out, checking/unchecking etc. depending on the application state. Where to get it? ================ You can FTP the complete FOX GUI toolkit from our FTP site: ftp://ftp.fox-toolkit.org/pub/ The distribution includes this on-line (HTML) documentation you see here. Mailing List. ============= To stay informed, we now have a mailing list for FOX. To subscribe, send mail to foxgui-users-request@lists.sourceforge.net with the word subscribe in the message body. Messages to the list can be sent to foxgui-users@lists.sourceforge.net. FOX announcements will be made through the foxgui-announce@lists.sourceforge.net list; you can subscribe to this list by sending a message "subscribe" to the list server at foxgui-announce-request@lists.sourceforge.net. Installation. ============= Please refer to the file INSTALL. FOX should compile on a large number of UNIX systems. The current "configure" scripts are however still somewhat primitive; if you need to make specific alterations to the configure system, feel free to send them to me so that I may merge them into the main distribution. The current FOX distribution compiles on Windows NT using the eXceed system; we expect however to get some core functionality to become available under the native Windows environment fairly soon. Getting started. ================ To get started programming with FOX, take a look at the tests directory, which contains some example programs. The best one to look at is probably the "glviewer" application. Note that you need OpenGL or Mesa on your machine in order to compile it. Finding FOX using GNU configure. ================================ GNU auto configure has features to detect the whereabouts of a library (AC_CHECK_LIB). Unfortunately, it assumes that you're looking for a C library, not a C++ library, and thus name mangling prevents it from finding FOX as all of FOX's API are C++. A special "dummy" C-linkage function was created to allow GNU auto configure to find the FOX library; you can use it in your configure.in as follows: AC_CHECK_LIB(FOX, fxfindfox) Bugs. ===== Please file bugs and questions to the list foxgui-users@lists.sourceforge.net. Before filing a bug, please take a moment to download the latest version of FOX, and make sure the problem still persists:- FOX is being developed fairly rapidly, and it is possible that some of the problems you may have experienced have already been fixed. License. ======== The FOX Library proper is licensed under GNU Lesser GPL; all the examples and demo programs are licensed under GPL. If you write software based on the FOX library, please include the following in your About Box, or some other place where a user may be able to see it: This software uses the FOX Toolkit (http://www.fox-toolkit.org). Thanks! fox1.6-1.6.57/TRACING000066400000000000000000000057621326741342000136610ustar00rootroot00000000000000 About Tracing using FXTRACE =========================== The basic idea is similar to FXASSERT:- you will add lots FXTRACE commands, but you probably never want to remove them. Just like FXASSERT, FXTRACE commands can be left in the code, as they're automatically compiled out when the library is build for release mode, i.e. with -DNDEBUG on the command line of your compiler. If this isn't reason enough to forego old printf() statements for FXTRACE, I remind you that under MSWindows, no stdout/stderr is opened up for non-console applications, and one has to use the Debug API calls instead of printf() calls. Using FXTRACE is therefore pretty convenient, as the MSWindows implementation of FOX will automatically use those Debug API's if your program is not compiled as a console application, and will revert to stderr under console mode [and of course under UNIX]. You use FXTRACE with DOUBLE PARENTHESES, as in: FXTRACE((200,"%s::onFocusIn %08x\n",getClassName(),this)); This is done so the C preprocessor can expand: FXTRACE((200,"%s::onFocusIn %08x\n",getClassName(),this)) into: fxtrace (200,"%s::onFocusIn %08x\n",getClassName(),this) or, in case of -DNDEBUG or release builds: ((void)0) Which any self-respecting compiler completely ignores and generates no object code for. BTW, this is what everybody does for asserts also. The number `200' in the above example is the tracelevel at which the statement will produce actual outputs on your screen. Starting your FOX program with: -tracelevel 300 will cause all FXTRACE statements with levels 300 and up to be BLOCKED from producing any outputs. Since you don't want to see reams of outputs, the most frequently occuring types of events should be given the highest trace level. For now, tracelevels 0 through 99 are reserved for application use, with FOX itself using levels 100 and upwards. Note that as tracing is controlled by a simple global variable fxTraceLevel, your program can simply set a higher tracelevel at a point in its execution where things are starting to get a little bit hairy..... Tentative assignments of tracelevels in FOX: 100: Important, high-level info, such as ctors and dtors for Icons, Images, Bitmaps, Fonts, and Cursors. Since you may easily leak those resources if your program does not track these properly, setting tracelevel to 101 (or higher) will allow you to see easily what's being created and destroyed. 200: Infrequent events such as mapping/unmapping of windows, selection requests, and such stuff. 250: More frequent stuff such as DND events. 300: Button clicks. 350: Mouse movements. 400: GUI Updates, when GUI Updates are allowed. I have not been overzealous sticking to these conventions, but now that it's written down for me to re-read, there's a higher chance that I'll stick to it in the future. Further assignments will probably follow some day.... - Jeroen fox1.6-1.6.57/aclocal.m4000066400000000000000000013274501326741342000145110ustar00rootroot00000000000000# generated automatically by aclocal 1.15.1 -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ]) # serial 58 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # Copyright (C) 2002-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR fox1.6-1.6.57/adie/000077500000000000000000000000001326741342000135375ustar00rootroot00000000000000fox1.6-1.6.57/adie/Adie.cpp000066400000000000000000000135521326741342000151130ustar00rootroot00000000000000/******************************************************************************** * * * T h e A d i e T e x t E d i t o r * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Adie.cpp,v 1.110.2.1 2006/03/21 07:29:06 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "fxkeys.h" #include #include #include #include #include #ifndef WIN32 #include #endif #include #include "FXRex.h" #include "FXArray.h" #include "HelpWindow.h" #include "Preferences.h" #include "Commands.h" #include "Hilite.h" #include "TextWindow.h" #include "Adie.h" #include "icons.h" /* Notes: - One single collection of icons. - Manage list of open windows. */ /*******************************************************************************/ // Map FXDEFMAP(Adie) AdieMap[]={ FXMAPFUNC(SEL_SIGNAL,Adie::ID_CLOSEALL,Adie::onCmdCloseAll), FXMAPFUNC(SEL_COMMAND,Adie::ID_CLOSEALL,Adie::onCmdCloseAll), }; // Object implementation FXIMPLEMENT(Adie,FXApp,AdieMap,ARRAYNUMBER(AdieMap)) // Make some windows Adie::Adie(const FXString& name):FXApp(name,FXString::null){ // Make some icons; these are shared between all text windows bigicon=new FXGIFIcon(this,big_gif); smallicon=new FXGIFIcon(this,small_gif); newicon=new FXGIFIcon(this,new_gif,0,IMAGE_ALPHAGUESS); reloadicon=new FXGIFIcon(this,reload_gif); openicon=new FXGIFIcon(this,open_gif); saveicon=new FXGIFIcon(this,save_gif); saveasicon=new FXGIFIcon(this,saveas_gif,0,IMAGE_ALPHAGUESS); printicon=new FXGIFIcon(this,print_gif); cuticon=new FXGIFIcon(this,cut_gif); copyicon=new FXGIFIcon(this,copy_gif); pasteicon=new FXGIFIcon(this,paste_gif); deleteicon=new FXGIFIcon(this,delete_gif); undoicon=new FXGIFIcon(this,undo_gif); redoicon=new FXGIFIcon(this,redo_gif); fontsicon=new FXGIFIcon(this,fonts_gif); helpicon=new FXGIFIcon(this,help_gif); quiticon=new FXGIFIcon(this,quit_gif); shiftlefticon=new FXGIFIcon(this,shiftleft_gif); shiftrighticon=new FXGIFIcon(this,shiftright_gif); searchicon=new FXGIFIcon(this,search_gif,0,IMAGE_ALPHAGUESS); searchnexticon=new FXGIFIcon(this,searchnext_gif,0,IMAGE_ALPHAGUESS); searchprevicon=new FXGIFIcon(this,searchprev_gif,0,IMAGE_ALPHAGUESS); bookseticon=new FXGIFIcon(this,bookset_gif); booknexticon=new FXGIFIcon(this,booknext_gif); bookprevicon=new FXGIFIcon(this,bookprev_gif); bookdelicon=new FXGIFIcon(this,bookdel_gif); #ifndef DEBUG // If interrupt happens, quit gracefully; we may want to // save edit buffer contents w/o asking if display gets // disconnected or if hangup signal is received. addSignal(SIGINT,this,ID_CLOSEALL); #ifndef WIN32 addSignal(SIGQUIT,this,ID_CLOSEALL); addSignal(SIGHUP,this,ID_CLOSEALL); addSignal(SIGPIPE,this,ID_CLOSEALL); #endif #endif // File associations associations=new FXFileDict(this); } // Initialize application void Adie::init(int& argc,char** argv,bool connect){ FXString syntaxfile; // After init, the registry has been loaded FXApp::init(argc,argv,connect); // Now we know the icon search path associations->setIconPath(reg().readStringEntry("SETTINGS","iconpath",FXIconDict::defaultIconPath)); // Hunt for the syntax file syntaxfile=FXPath::search(FXSystem::getExecPath(),"Adie.stx"); // Load syntax file if(!syntaxfile.empty()){ loadSyntaxFile(syntaxfile); } } // Exit application void Adie::exit(FXint code){ // Writes registry, and quits FXApp::exit(code); } // Close all windows long Adie::onCmdCloseAll(FXObject*,FXSelector,void*){ while(0close(TRUE)); return 1; } // Clean up the mess Adie::~Adie(){ for(int i=0; i?" rule "Math" openpattern "\$|\\\[|\\\(|\\begin(?=(\{(equation|align)\*?\}))" closepattern "\$|\\\]|\\\)|\\end(?=(\{(equation|align)\*?\}))" rule "Comment" openpattern "%" closepattern "$" stoppattern "$" end rule "CurlyBrace" pattern "\{|\}" end rule "MathCommand" openpattern "\\(?!([^a-zA-Z]|end\{(equation|align)\*?\}))" closepattern "(?=[^a-zA-Z])|$" stoppattern "(?=\$)|\\((?=\])|(?=\))|(?=end\{(equation|align)\}))" rule "Comment" openpattern "%" closepattern "$" stoppattern "$" end rule "MathGreek" pattern "\<([aA]lpha|[bB]eta|[gG]amma|[eE]psilon|[dD]elta|[eE]ta|[iI]ota|[kK]appa|[lL]ambda|[mM]u|[nN]u|[pP]i|[rR]ho|[sS]igma|[tT]au|[pP]hi|[pP]si|[xX]i|[uU]psilon|[zZ]eta|[tT]heta|[oO]mega)(\>|(?=_))" end end end rule "Command" openpattern "\\{1}(?!\\)" closepattern "(?=[^a-zA-Z])|$" stoppattern "\{|\}| |$" rule "TextFormating" pattern "\<(textbf|texttt|textsl|textit|emph)\>" end rule "Sectioning" pattern "\<(section|subsection|subsubsection|paragraph|chapter)\>" end rule "Referance" pattern "\<(cite|ref|label)\>" end rule "Includes" pattern "\<(usepackage|include|input|includegraphics)\>" end rule "Footnote" pattern "\<(footnote)\>" end rule "Comment" openpattern "%" closepattern "$" stoppattern "$" end rule "Breaks" pattern "\<(clearpage|newpage)\>" end end rule "CurlyBrace" pattern "\{|\}" end rule "Comment" openpattern "%" closepattern "$" stoppattern "$" end rule "Breaks" pattern "\\{2}" end end # A Syntax coloring pattern for syntax coloring patterns ;-) language "Adie Syntax" filesmatch "*.stx" rule "Comment" openpattern "#" closepattern "$" end rule "Keyword" pattern "\<(language|filesmatch|contentsmatch|delimiters|contextlines|contextchars|rule|foreground|end)\>" end rule "Expression" openpattern "pattern|openpattern|closepattern|stoppattern" closepattern "$" rule "Pattern" openpattern "\"" closepattern "\"" stoppattern "$" rule "Escape" pattern "\\\"" end end end rule "String" openpattern "\"" closepattern "\"" stoppattern "$" rule "Escape" pattern "\\\"" end end end # C++ programming language language "C++" # File patterns for this language mode filesmatch "*.C,*.cpp,*.cc,*.cxx,*.c++,*.H,*.hpp,*.hh,*.hxx,*.h++,*.h" #contentsmatch "[Cc]\+\+" contextlines 100 # Word delimiters delimiters "~.,/\`'!@#$%^&*()-=+{}|[]\":;<>?" # C++ style comment rule "CPPDocComment" openpattern "/// " closepattern "$" end # C++ style comment rule "CPPComment" openpattern "//" closepattern "$" rule "FIXME" pattern "FIXME" end end # C style comment rule "CDocComment" openpattern "/\*\*[ \n]" closepattern "\*/" end # C style comment rule "CComment" openpattern "/\*" closepattern "\*/" rule "FIXME" pattern "FIXME" end end # String rule "String" openpattern "\"" closepattern "\"" stoppattern "$" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end rule "Format" pattern "%[\*ahlLq#0 +-]?\d*(\.(\*|\d*))?l?([dDiouxXeEfFgGaAcsp]|\[.*?\])" end end # Char constant rule "Char" openpattern "'" closepattern "'" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end end # Preprocessor rule "Preprocessor" openpattern "^\s*(?=#)" closepattern "$" # PP blocked rule "PPBlocked" openpattern "#if\s+0" closepattern "#endif" rule "PPSubblock" openpattern "/\*" closepattern "\*/" end rule "PPSubblock" openpattern "//" closepattern "$" end rule "PPSubblock" openpattern "#if" closepattern "#endif" rule "PPSubblock" openpattern "#if" closepattern "#endif" rule "PPSubblock" openpattern "#if" closepattern "#endif" end end end end # Continuation rule "PreprocessorContinuation" pattern "\\\n" end # Comments rule "CComment" openpattern "/\*" closepattern "\*/" end rule "CPPComment" openpattern "//" closepattern "$" end end # Special macros rule "FOXMacro" pattern "\<(FXAPI|FXDEFMAP|FXMALLOC|FXFREE|FXCALLOC|FXRESIZE|FXMEMDUP|FXTRACE|FXMAPFUNCS|FXMAPFUNC|FXIMPLEMENT|FXIMPLEMENT_ABSTRACT|FXDECLARE|FXDECLARE_ABSTRACT|FXMAPTYPES|FXMAPTYPE|FXMETACLASS|FXRGBA|FXRGB|FXREDVAL|FXGREENVAL|FXBLUEVAL|FXALPHAVAL|FXASSERT|FXSELID|FXSELTYPE|FXSEL|FXMINMAX|FXMIN3|FXMIN4|FXMIN|FXMAX3|FXMAX4|FXMAX|FXSWAP|FXCLAMP|FXABS|FXLERP|ARRAYNUMBER|STRUCTOFFSET|CONTAINER|allocElms|callocElms|dupElms|resizeElms|freeElms)\>" end rule "FOXType" pattern "\<(FXchar|FXuchar|FXbool|FXushort|FXshort|FXuint|FXwchar|FXnchar|FXint|FXfloat|FXdouble|FXulong|FXlong|FXival|FXuval|FXColor|FXObject|FXString|FXWString)\>" end rule "Keyword" pattern "\<(friend|typename|explicit|typeid|for|while|if|else|try|catch|new|delete|do|namespace|class|struct|enum|union|public|private|protected|template|switch|case|default|this|return|throw|using|break|continue|goto|static|volatile|const|virtual|mutable|operator|auto|register|overload|inline|extern|and|or|xor|not|compl|and_eq|xor_eq|const_cast|dynamic_cast|true|false|not_eq|sizeof|bitor|bitand|reinterpret_cast|static_cast)\>" end rule "Number" pattern "\<((0[xX][0-9a-fA-F]+)|((\d+\.?\d*)|(\.\d+))([eE](\+|-)?\d+)?)(L|LL|l|ll|UL|ULL|ul|ull|u|U|F|f)?\>" end rule "Type" pattern "\<(unsigned|signed|int|char|short|long|float|double|bool|complex|void|wchar_t)\>" end rule "Operator" pattern "(\{|\}|\+\+|\+=|\+|--|-=|->\*|->|-|==|=|&&|&=|&|\|\||\|=|\||\^=|\^|<<=|<<|<=|<|>>=|>>|>=|>|!=|!|~=|~|\*=|\*|/=|/|%=|%)" end end # C programming language language "C" # File patterns for this language mode filesmatch "*.c,*.h" # Word delimiters delimiters "~.,/\`'!@#$%^&*()-=+{}|[]\":;<>?" contextlines 100 # C style comment rule "CDocComment" openpattern "/\*\*[ \n]" closepattern "\*/" end # C style comment rule "CComment" openpattern "/\*" closepattern "\*/" rule "FIXME" pattern "FIXME" end end # C++ style comment rule "CPPComment" openpattern "//" closepattern "$" end # String rule "String" openpattern "\"" closepattern "\"" stoppattern "$" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end rule "Format" pattern "%[\*ahlLq#0 +-]?\d*(\.(\*|\d*))?l?([dDiouxXeEfFgGaAcsp]|\[.*?\])" end end # Char constant rule "Char" openpattern "'" closepattern "'" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end end # Preprocessor rule "Preprocessor" openpattern "^\s*(?=#)" closepattern "$" # PP blocked rule "PPBlocked" openpattern "#if\s+0" closepattern "#endif" rule "PPSubblock" openpattern "/\*" closepattern "\*/" end rule "PPSubblock" openpattern "//" closepattern "$" end rule "PPSubblock" openpattern "#if" closepattern "#endif" rule "PPSubblock" openpattern "#if" closepattern "#endif" rule "PPSubblock" openpattern "#if" closepattern "#endif" end end end end # Continuation rule "PreprocessorContinuation" pattern "\\\n" end # Comments rule "CComment" openpattern "/\*" closepattern "\*/" end rule "CPPComment" openpattern "//" closepattern "$" end end rule "Keyword" pattern "\<(for|while|if|else|do|struct|enum|union|switch|case|default|return|break|continue|goto|static|volatile|const|auto|register|inline|extern)\>" end rule "Number" pattern "\<((0[xX][0-9a-fA-F]+)|((\d+\.?\d*)|(\.\d+))([eE](\+|-)?\d+)?)(L|LL|l|ll|UL|ULL|ul|ull|u|U|F|f)?\>" end rule "Type" pattern "\<(unsigned|signed|int|char|short|long|float|double|bool|complex|void|wchar_t)\>" end rule "Operator" pattern "(\+\+|\+=|\+|--|-=|->\*|->|-|==|=|&&|&=|&|\|\||\|=|\||\^=|\^|<<=|<<|<=|<|>>=|>>|>=|>|!=|!|~=|~|\*=|\*|/=|/|%=|%)" end end language "Shell" contentsmatch "\A#!\s*/bin/(ba)?sh" rule "Comment" pattern "#.*?$" end rule "Keyword" pattern "\<(for|in|do|done|if|then|else|elif|fi|switch|case|esac|while|function|select|until|time)\>" end rule "Operator" pattern "(=|;;|;|!|\{|\}|\[\[|\]\])" end end language "Pascal" filesmatch "*.pas,*.p" rule "Number" pattern "\<((0[xX][0-9a-fA-F]+)|((\d+\.?\d*)|(\.\d+))([eE](\+|-)?\d+)?)(L|l|UL|ul|u|U|F|f)?\>" end rule "String" pattern "\'[^']*?\'" end rule "Type" pattern "\<(?iInteger|Shortint|SmallInt|Longint|Int64|Byte|Word|Cardinal|QWord|Boolean|ByteBool|LongBool|Char)\>" end rule "Comment" pattern "\(\*.*?\*\)|\{.*?\}" end rule "Operator" pattern "(:=|:|@|\\+=|\\+|-=|-|=|\\^|<=|<|>=|>|\\*=|\\*|/=|/|\\.)" end rule "Keyword" pattern "\<(?iabsolute|and|array|asm|begin|break|case|const|constructor|continue|destructor|div|do|downto|else|end|file|for|function|goto|if|implementation|in|inherited|inline|interface|label|mod|nil|not|object|of|on|operator|or|packed|procedure|program|record|repeat|self|set|shl|shr|string|then|to|type|unit|until|uses|var|while|with|xor)\>" end end language "Configure" filesmatch "configure.in,configure.ac" rule "Comment" pattern "\.*?$" end rule "Comment" pattern "#.*?$" end rule "String" openpattern "'" closepattern "'" rule "ControlEscape" pattern "\\." end end rule "String" openpattern "\"" closepattern "\"" rule "ControlEscape" pattern "\\." end end rule "Macro" pattern "\" end rule "ShellResult" openpattern "`" closepattern "`" rule "ControlEscape" pattern "\\." end end end language "Python" filesmatch "*.py" rule "Number" pattern "\<((0[xX][0-9a-fA-F]+)|((\d+\.?\d*)|(\.\d+))([eE](\+|-)?\d+)?)(L|l|UL|ul|u|U|F|f)?\>" end rule "String" openpattern "([^\"{2}]\"[^\"{2}])|([^'{2}]'[^\"{2}])" closepattern "([^\"{2}]\"[^\"{2}])|([^\"{2}]'[^\"{2}])" rule "CharEscape" pattern "\\." end end rule "TripleString" openpattern "(\"{3})|('{3})" closepattern "(\"{3})|('{3})" rule "CharEscape" pattern "\\." end end rule "Comment" pattern "#.*?$" end rule "Operator" pattern "\+\+|\+=|\+|--|-=|-|==|=|&&|&=|&|=|^=|^|<<=|<<|<=|<|>>=|>>|>=|>|!=|!=|!|~=|~|\*=|\*|/=|/|%=|%" end rule "Keyword" pattern "\<(def|import|for|in|while|if|elif|else|try|class|return|break|continue|raise|and|or|not|print|pass|access|global|from|except|exec|is|finally|lambda)\>" end end language "Ruby" filesmatch "*.rb" rule "Number" pattern "\<((0[xX][0-9a-fA-F]+)|((\d+\.?\d*)|(\.\d+))([eE](\+|-)?\d+)?)(L|l|UL|ul|u|U|F|f)?\>" end rule "SingleString" openpattern "'" closepattern "'" rule "CharEscape" pattern "\\." end end rule "DoubleString" openpattern "\"" closepattern "\"" rule "CharEscape" pattern "\\." end end rule "Comment" pattern "#.*?$" end rule "Operator" pattern "\+=|\+|-=|-|===|==|=|&&|&=|&|\|\||\|=|\||^=|^|<<=|<<|<=|<|>>=|>>|>=|>|!=|!|~=|~|\*=|\*|/=|/|%=|%|" end rule "Keyword" pattern "\<(alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|false|for|if|in|module|next|nil|not|or|redo|rescue|retry|return|self|super|then|true|undef|unless|until|when|while|yield)\>" end end language "Xml/Html" filesmatch "*.xml,*.htm,*.html,*.ui" rule "Comment" openpattern "" end rule "Entity" openpattern "\&" closepattern ";" end rule "Instruction" openpattern "<\?" closepattern "\?>" rule "String" openpattern "\"" closepattern "\"" rule "Entity" openpattern "\&" closepattern ";" stoppattern "(?=\")" end end rule "String" openpattern "\'" closepattern "\'" rule "Entity" openpattern "\&" closepattern ";" stoppattern "(?=\")" end end end rule "Node" openpattern "<" closepattern ">" rule "String" openpattern "\"" closepattern "\"" rule "Entity" openpattern "\&" closepattern ";" stoppattern "(?=\")" end end rule "String" openpattern "\'" closepattern "\'" rule "Entity" openpattern "\&" closepattern ";" stoppattern "(?=\")" end end end end # IDL interface definition language language "IDL" # File patterns for this language mode filesmatch "*.idl" # Word delimiters delimiters "~.,/\`'!@#$%^&*()-=+{}|[]\":;<>?" # // style comment rule "CPPComment" openpattern "//" closepattern "$" rule "FIXME" pattern "FIXME" end end # /* */ style comment rule "CComment" openpattern "/\*" closepattern "\*/" rule "FIXME" pattern "FIXME" end end # String rule "String" openpattern "\"" closepattern "\"" stoppattern "$" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end rule "Format" pattern "%[\*hlLq#0 +-]?\d*(\.(\*|\d*))?l?[diouxXeEfFgGaAcsp]" end end # Char constant rule "Char" openpattern "'" closepattern "'" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end end # Preprocessor rule "Preprocessor" openpattern "^\s*#" closepattern "$" rule "PreprocessorContinuation" pattern "\\\n" end end rule "Keyword" pattern "\<(attribute|component|comsumes|context|custom|exception|emits|eventtype|factory|finder|fixed|getraises|home|import|interface|local|module|multiple|native|oneway|primarykey|private|provides|public|publishes|raises|readonly|setraises|supports|truncatable|typedef|typeid|typeprefix|uses|ValueBase|valuetype)\>" end rule "Direction" pattern "\<(in|inout|out)\>" end rule "Number" pattern "\<((0[xX][0-9a-fA-F]+)|((\d+\.?\d*)|(\.\d+))([eE](\+|-)?\d+)?)(L|l|UL|ul|u|U|F|f)?\>" end rule "Type" pattern "\<(unsigned|signed|int|char|octet|any|wchar|short|long|hyper|float|double|boolean|complex|void|struct|union|enum|switch|case|default|sequence|string|wstring|Object)\>" end rule "Operator" pattern "(\{|\}|\+\+|\+=|\+|--|-=|->\*|->|-|==|=|&&|&=|&|\|\||\|=|\||\^=|\^|<<=|<<|<=|<|>>=|>>|>=|>|!=|!|~=|~|\*=|\*|/=|/|%=|%)" end end # C# programming language language "C#" # File patterns for this language mode filesmatch "*.cs" # Word delimiters delimiters "~.,/\`'!@#$%^&*()-=+{}|[]\":;<>?" # Line comment rule "LineComment" openpattern "//" closepattern "$" end # Multiline comment rule "MultiLineComment" openpattern "/\*" closepattern "\*/" end # String rule "String" openpattern "\"" closepattern "\"" stoppattern "$" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end end # Char constant rule "Char" openpattern "'" closepattern "'" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end end # Preprocessor rule "Preprocessor" openpattern "^\s*#" closepattern "$" rule "PreprocessorContinuation" pattern "\\\n" end end rule "Keyword" pattern "\<(abstract|base|break|case|catch|checked|class|const|continue|default|delegate|do|else|enum|event|explicit|extern|false|finally|fixed|for|foreach|goto|if|implicit|in|interface|internal|lock|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|static|struct|switch|this|throw|true|try|typeof|unchecked|unsafe|using|virtual|while|is|as)\>" end rule "Number" pattern "\<((0[xX][0-9a-fA-F]+)|((\d+\.?\d*)|(\.\d+))([eE](\+|-)?\d+)?)(U|u|L|l|UL|Ul|uL|ul|LU|Lu|lU|lu|F|f|D|d|M|m)?\>" end rule "Type" pattern "\<(bool|byte|double|float|int|sbyte|short|void|ushort|long|uint|ulong|char|string|decimal)\>" end rule "Operator" pattern "(\{|\}|\+\+|\+=|\+|--|-=|->\*|->|-|==|=|&&|&=|&|\|\||\|=|\||\^=|\^|<<=|<<|<=|<|>>=|>>|>=|>|!=|!|~=|~|\*=|\*|/=|/|%=|%)" end end # HTLM/PHP Markup patterns # Contributed by: Andy Preston language "Markup" filesmatch "*.html,*.xhtml,*.xml,*.sgml,*.php" rule "PHP" openpattern "<\?php" closepattern "\?>" rule "String" openpattern "\"" closepattern "\"" rule "ControlEscape" pattern "\\." end rule "Variable" pattern "\$[A-Za-z_][0-9A-Za-z_]*" end end rule "SString" openpattern "'" closepattern "'" rule "SQuote" pattern "''" end end rule "Number" pattern "\<((0[xX][0-9a-fA-F]+)|((\d+\.?\d*)|(\.\d+))([eE](\+|-)?\d+)?)\>" end rule "Variable" pattern "\$\$?[A-Za-z_][0-9A-Za-z_]*" end rule "Comment" pattern "#.*?$" end rule "CPPComment" openpattern "//" closepattern "$" end rule "CComment" openpattern "/\*" closepattern "\*/" end rule "Keyword" pattern "\<(and|break|case|class|do|echo|else|elseif|endfor|endwhile|for|function|global|if|include|new|or|print|return|static|switch|while|xor)\>" end rule "Operator" # there's a bit of a kludge here, for the "?" operator, a "?" matches against the "?>" at the end of a block of PHP # so I've had to make it \?[^>] which means the character following the "?" is treated as part of the operator # If you write this: "$x = $y ? 1 : 2" it looks fine, but if you write "$x=$y?1:2" the "1" is shown as part of the operator pattern "(,|=|\+=|-=|\*=|/=|\.=|%=|&=|\|=|\^=|~=|<<=|>>=|:|\?[^>]|\|\||&&|\||\^|&|==|!=|===|!==|<|<=|>|>=|<<|>>|\+|-|\.|\*|/|%|!|~|\+\+|--|\(int\)|\(double\)|\(string\)|\(array\)|\(object\)|@|\[|\]) end end rule "Comment" openpattern "" end rule "Tag" openpattern "<" closepattern ">" rule "Attribute" pattern " [A-Za-z_][A-Za-z0-9_-]+" end rule "Value" pattern "=?\"[^\"]*\"" rule "HexTriplet" pattern "#[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]" end end end rule "Special" openpattern "&" closepattern ";" end end # Makefiles language "Make" filesmatch "*Makefile*" rule "Comment" openpattern "#" closepattern "$" rule "CommentContinuation" pattern "\\\n" end end rule "Assignment" openpattern "^( *| [ \t]*)[A-Za-z0-9_+$()][^ \t\n]*[ \t]*(\+=|:=|=)" closepattern "$" rule "AssignmentContinuation" pattern "\\\n" end rule "AssignmentComment" openpattern "#" closepattern "$" end end rule "DependencyLine" openpattern "^( *| [ \t]*)(.DEFAULT|.DELETE_ON_ERROR|.EXPORT_ALL_VARIABLES.IGNORE|.INTERMEDIATE|.PHONY|.POSIX|.PRECIOUS|.SECONDARY|.SILENT|.SUFFIXES)*(([A-Za-z0-9./$(){} _@^<*?%+-]*(\\\n)){,8}[A-Za-z0-9./$(){} _@^<*?%+-]*)::?" closepattern "$|;" rule "DependencyContinuation" pattern "\\\n" end end rule "String" openpattern "\"" closepattern "\"" stoppattern "$" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end end rule "String" openpattern "'" closepattern "'" stoppattern "$" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end end end # Perl language "Perl" filesmatch "*.pl" rule "Comment" openpattern "#" closepattern "$" end rule "Statement" pattern "\<(if|until|while|elsif|else|unless|for(each)?|continue|last|goto|next|redo|do(?=\s*\{)|BEGIN|END)\>" end rule "Operator" pattern "\<(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor|sub|x)\>" end rule "String" openpattern "\"" closepattern "\"" stoppattern "$" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end end rule "String" openpattern "'" closepattern "'" stoppattern "$" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end end end # GLSL shading language language "GLSL" # File patterns for this language mode filesmatch "*.frag,*.vert" contentsmatch "\AGLSL" # Word delimiters delimiters "~.,/\`'!@#$%^&*()-=+{}|[]\":;<>?" # C++ style comment rule "CPPComment" openpattern "//" closepattern "$" end # C style comment rule "CComment" openpattern "/\*" closepattern "\*/" end # Preprocessor rule "Preprocessor" openpattern "^\s*#" closepattern "$" rule "PreprocessorContinuation" pattern "\\\n" end end rule "Keyword" pattern "\<(if|else|for|while|do|discard|return|break|continue|struct)\>" end rule "Number" pattern "\<((0[xX][0-9a-fA-F]+)|((\d+\.?\d*)|(\.\d+))([eE](\+|-)?\d+)?)(L|l|UL|ul|u|U|F|f)?\>" end rule "Type" pattern "\<(void|bool|int|float|vec2|vec3|vec4|bvec2|bvec3|bvec4|ivec2|ivec3|ivec4|mat2|mat3|mat4|sampler1D|sampler2D|sampler3D|samplerCube|sampler1DShadow|sampler2DShadow)\>" end rule "Qualifier" pattern "\<(varying|attribute|uniform|in|out|inout|const)\>" end rule "Operator" pattern "(\+\+|\+=|\+|--|-=|-|==|=|&&|\|\||\^=|\^|<=|<|>=|>|!=|!|\*=|\*|/=|/)" end rule "Predefined" pattern "\<(gl_Position|gl_PointSize|gl_ClipVertex|gl_Color|gl_Normal|gl_Vertex|gl_MultiTexCoord0|gl_MultiTexCoord1|gl_MultiTexCoord2|gl_MultiTexCoord3|gl_MultiTexCoord4|gl_MultiTexCoord5|gl_MultiTexCoord6|gl_MultiTexCoord7|gl_FogCoord|gl_FrontColor|gl_BackColor|gl_FrontSecondaryColor|gl_BackSecondaryColor|gl_TexCoord|gl_FogFragCoord|gl_SecondaryColor|gl_FragCoord|gl_FrontFacing|gl_FragColor|gl_FragDepth|gl_MaxLights|gl_MaxClipPlanes|gl_MaxTextureUnits|gl_MaxTextureCoordsARB|gl_MaxVertexAttributesGL2|gl_MaxVertexUniformFloatsGL2|gl_MaxVaryingFloatsGL2|gl_MaxVertexTextureUnitsGL2|gl_MaxFragmentTextureUnitsGL2|gl_MaxFragmentUniformFloatsGL2|gl_ModelViewMatrix|gl_ProjectionMatrix|gl_ModelViewProjectionMatrix|gl_NormalMatrix|gl_TextureMatrix|gl_MaxTextureCoordsARB|gl_NormalScale|gl_DepthRange|gl_ClipPlane|gl_MaxClipPlanes|gl_Point|gl_FrontMaterial|gl_BackMaterial|gl_LightSource|gl_MaxLights|gl_LightModel|gl_FrontLightModel|gl_BackLightModel|gl_FrontLightProduct|gl_BackLightProduct|gl_TextureEnvColor|gl_EyePlaneS|gl_EyePlaneT|gl_EyePlaneR|gl_EyePlaneQ|gl_ObjectPlaneS|gl_ObjectPlaneT|gl_ObjectPlaneR|gl_ObjectPlaneQ|gl_Fog)\>" end rule "Functions" pattern "\<(radians|degress|sin|cos|tan|asin|acos|atan|atan|pow|exp2|log2|sqrt|inversesqrt|abs|sign|floor|ceil|fract|mod|min|max|clamp|mix|step|smoothstep|length|distance|dot|cross|normalize|ftransform|faceforward|reflect|matrixCompMult|lessThan|lessThanEqual|greaterThan|greaterThanEqual|equal|notEqual|any|all|not|texture1D|texture1DProj|texture1DLod|texture1DProjLod|texture2D|texture2DProj|texture2DLod|texture2DProjLod|texture3D|texture3DProj|texture3DLod|texture3DProjLod|textureCube|textureCubeLod|shadow1D|shadow2D|shadow1DProj|shadow2DProj|shadow1DLod|shadow2DLod|shadow1DProjLod|shadow2DProjLod|dFdx|dFdy|fwidth|noise1|noise2|noise3|noise4)\>" end end # A Syntax coloring pattern for FOX registry language "Registry" contentsmatch "\A\[[^]]*?\]" contextlines 100 rule "Comment" openpattern "#" closepattern "$" end rule "RegistrySection" pattern "^\s*?\[[^]]*?\]\s*?$" end rule "RegistryEntry" openpattern "^\s*?[^=]*?\s*?(?==)" closepattern "$" stoppattern "$" rule "RegistryEquals" openpattern "\s*?=\s*?" closepattern "$" stoppattern "$" rule "RegistryString" openpattern "\"" closepattern "\"" stoppattern "$" rule "OctalEscape" pattern "\\\d+" end rule "HexEscape" pattern "\\x\h+" end rule "ControlEscape" pattern "\\." end end rule "RegistryValue" pattern ".*?$" end end end end fox1.6-1.6.57/adie/Commands.cpp000066400000000000000000000106061326741342000160070ustar00rootroot00000000000000/******************************************************************************** * * * U n d o a b l e C o m m a n d s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Commands.cpp,v 1.18 2006/01/22 18:01:10 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "Commands.h" #include "FXRex.h" #include "FXArray.h" #include "Hilite.h" #include "TextWindow.h" #include "Adie.h" /* Notes: - When manipulating text widget, we generate callbacks even when changing the text via undo or redo. - During the execution of an undo or redo, FXUndoList is marked as busy; thus, the busy state may be checked to determine if one is in the middle of an undo or redo. */ /*******************************************************************************/ FXIMPLEMENT_ABSTRACT(FXTextCommand,FXCommand,NULL,0) // Return size of record plus any data kept here FXuint FXTextCommand::size() const { return sizeof(FXTextCommand)+ndel; } FXIMPLEMENT_ABSTRACT(FXTextInsert,FXTextCommand,NULL,0) // Insert command FXTextInsert::FXTextInsert(FXText* txt,FXint p,FXint ni,const FXchar* ins):FXTextCommand(txt,p,0,ni){ FXMALLOC(&buffer,FXchar,ni); memcpy(buffer,ins,ni); } // Undo an insert removes the inserted text void FXTextInsert::undo(){ text->removeText(pos,nins,TRUE); text->setCursorPos(pos); text->makePositionVisible(pos); } // Redo an insert inserts the same old text again void FXTextInsert::redo(){ text->insertText(pos,buffer,nins,TRUE); text->setCursorPos(pos+nins); text->makePositionVisible(pos+nins); } FXIMPLEMENT_ABSTRACT(FXTextDelete,FXTextCommand,NULL,0) // Delete command FXTextDelete::FXTextDelete(FXText* txt,FXint p,FXint nd,const FXchar* del):FXTextCommand(txt,p,nd,0){ FXMALLOC(&buffer,FXchar,nd); memcpy(buffer,del,nd); } // Undo a delete reinserts the old text void FXTextDelete::undo(){ text->insertText(pos,buffer,ndel,TRUE); text->setCursorPos(pos+ndel); text->makePositionVisible(pos+ndel); } // Redo a delete removes it again void FXTextDelete::redo(){ text->removeText(pos,ndel,TRUE); text->setCursorPos(pos); text->makePositionVisible(pos); } FXIMPLEMENT_ABSTRACT(FXTextReplace,FXTextCommand,NULL,0) // Replace command FXTextReplace::FXTextReplace(FXText* txt,FXint p,FXint nd,FXint ni,const FXchar* del,const FXchar* ins):FXTextCommand(txt,p,nd,ni){ FXMALLOC(&buffer,FXchar,nd+ni); memcpy(buffer,del,nd); memcpy(buffer+nd,ins,ni); } // Undo a replace reinserts the old text void FXTextReplace::undo(){ text->replaceText(pos,nins,buffer,ndel,TRUE); text->setCursorPos(pos+ndel); text->makePositionVisible(pos+ndel); } // Redo a replace reinserts the new text void FXTextReplace::redo(){ text->replaceText(pos,ndel,buffer+ndel,nins,TRUE); text->setCursorPos(pos+nins); text->makePositionVisible(pos+nins); } fox1.6-1.6.57/adie/Commands.h000066400000000000000000000067041326741342000154600ustar00rootroot00000000000000/******************************************************************************** * * * U n d o a b l e C o m m a n d s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Commands.h,v 1.16 2006/01/22 18:01:10 fox Exp $ * ********************************************************************************/ #ifndef COMMANDS_H #define COMMANDS_H // Undo record for text fragment class FXTextCommand : public FXCommand { FXDECLARE_ABSTRACT(FXTextCommand) protected: FXText *text; // Text widget FXchar *buffer; // Character buffer FXint pos; // Character position FXint ndel; // Deleted characters FXint nins; // Inserted characters public: FXTextCommand(FXText* txt,FXint p,FXint nd,FXint ni):text(txt),buffer(NULL),pos(p),ndel(nd),nins(ni){} virtual FXuint size() const; virtual ~FXTextCommand(){FXFREE(&buffer);} }; // Insert command class FXTextInsert : public FXTextCommand { FXDECLARE_ABSTRACT(FXTextInsert) public: FXTextInsert(FXText* txt,FXint p,FXint ni,const FXchar* ins); virtual FXString undoName() const { return "Undo insert"; } virtual FXString redoName() const { return "Redo insert"; } virtual void undo(); virtual void redo(); }; // Delete command class FXTextDelete : public FXTextCommand { FXDECLARE_ABSTRACT(FXTextDelete) public: FXTextDelete(FXText* txt,FXint p,FXint nd,const FXchar* del); virtual FXString undoName() const { return "Undo delete"; } virtual FXString redoName() const { return "Redo delete"; } virtual void undo(); virtual void redo(); }; // Replace command class FXTextReplace : public FXTextCommand { FXDECLARE_ABSTRACT(FXTextReplace) public: FXTextReplace(FXText* txt,FXint p,FXint nd,FXint ni,const FXchar* del,const FXchar* ins); virtual FXString undoName() const { return "Undo replace"; } virtual FXString redoName() const { return "Redo replace"; } virtual void undo(); virtual void redo(); }; #endif fox1.6-1.6.57/adie/HelpWindow.cpp000066400000000000000000000064051326741342000163300ustar00rootroot00000000000000/******************************************************************************** * * * H e l p W i n d o w * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: HelpWindow.cpp,v 1.12 2006/01/22 18:01:10 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "icons.h" #include "help.h" #include #include #include "Preferences.h" #include "Commands.h" #include "FXRex.h" #include "FXArray.h" #include "Hilite.h" #include "TextWindow.h" #include "Adie.h" #include "HelpWindow.h" /*******************************************************************************/ FXIMPLEMENT(HelpWindow,FXDialogBox,NULL,0) // Construct help dialog box HelpWindow::HelpWindow(Adie *a): FXDialogBox(a,"Help on Adie",DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,0,0,0,0, 6,6,6,6, 4,4){ // Set title setTitle(tr("Help on Adie")); // Bottom part FXHorizontalFrame *closebox=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH); // Destroy window when closed FXButton *button=new FXButton(closebox,tr("&Close"),NULL,this,FXDialogBox::ID_CLOSE,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 20,20,5,5); // Editor part FXHorizontalFrame *editbox=new FXHorizontalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, 0,0,0,0); helptext=new FXText(editbox,NULL,0,TEXT_READONLY|TEXT_WORDWRAP|LAYOUT_FILL_X|LAYOUT_FILL_Y); helptext->setVisibleRows(50); helptext->setVisibleColumns(90); // Fill with help helptext->setText(help,strlen(help)); helptext->setTabColumns(35); button->setFocus(); } // Clean up HelpWindow::~HelpWindow(){ helptext=(FXText*)-1; } fox1.6-1.6.57/adie/HelpWindow.h000066400000000000000000000042521326741342000157730ustar00rootroot00000000000000/******************************************************************************** * * * H e l p W i n d o w * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: HelpWindow.h,v 1.8 2006/01/22 18:01:10 fox Exp $ * ********************************************************************************/ #ifndef HELPWINDOW_H #define HELPWINDOW_H class Adie; /// Online help dialog box class HelpWindow : public FXDialogBox { FXDECLARE(HelpWindow) protected: FXText *helptext; // Help display private: HelpWindow(){} HelpWindow(const HelpWindow&); public: HelpWindow(Adie *a); virtual ~HelpWindow(); }; #endif fox1.6-1.6.57/adie/Hilite.cpp000066400000000000000000000212121326741342000154570ustar00rootroot00000000000000/******************************************************************************** * * * H i g h l i g h t E n g i n e * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Hilite.cpp,v 1.44 2006/01/22 18:01:10 fox Exp $ * ********************************************************************************/ #include "fx.h" #include #include "FXRex.h" #include "FXArray.h" #include "Hilite.h" /* Notes: - Restart position: place in text which is default style, a few lines of context before the change. - Language mode: use wildcard on filename, or forced explicitly. - Either simple pattern, or begin/end pattern. Special stop pattern to prevent scanning indefinitely. Patterns may have sub-patterns. - Simple pattern must be non-empty; begin/end patterns of a complex pattern may be zero-width assertions. - Capturing parenthesis are disabled, for speed reasons. - Sample text in FXSyntax is for displaying inside interactive style setup dialog; it is supposed to contain on instance of each pattern matched by the rule base */ /*******************************************************************************/ // Default style is all zeroes const FXHiliteStyle FXSyntax::defaultStyle={ FXRGBA(0,0,0,0), FXRGBA(0,0,0,0), FXRGBA(0,0,0,0), FXRGBA(0,0,0,0), FXRGBA(0,0,0,0), FXRGBA(0,0,0,0), FXRGBA(0,0,0,0), 0 }; FXIMPLEMENT(FXRule,FXObject,NULL,0) // Fill textstyle with style, returns position of last change+1 static inline void fillstyle(FXchar* textstyle,FXchar style,FXint f,FXint t){ while(fstylize(text,textstyle,fm,to,head,tail)){ fm=tail; goto nxt; } } if(end.match(text,to,&head,&stop,REX_FORWARD,1,fm,fm)){ fillstyle(textstyle,style,head,stop); return TRUE; } textstyle[fm++]=style; nxt:continue; } stop=fm; return TRUE; } // Stylize complex recursive expression FXbool FXBracketRule::stylize(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const { FXint head,tail; if(beg.match(text,to,&start,&tail,REX_FORWARD,1,fm,fm)){ fillstyle(textstyle,style,start,tail); FXBracketRule::stylizeBody(text,textstyle,tail,to,head,stop); return TRUE; } return FALSE; } FXIMPLEMENT(FXSafeBracketRule,FXBracketRule,NULL,0) // Stylize complex recursive expression with termination pattern FXbool FXSafeBracketRule::stylizeBody(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const { FXint head,tail,node; start=fm; while(fmstylize(text,textstyle,fm,to,head,tail)){ fm=tail; goto nxt; } } if(end.match(text,to,&head,&stop,REX_FORWARD,1,fm,fm)){ fillstyle(textstyle,style,head,stop); return TRUE; } if(esc.match(text,to,&head,&stop,REX_FORWARD,1,fm,fm)){ fillstyle(textstyle,style,head,stop); return TRUE; } textstyle[fm++]=style; nxt:continue; } stop=fm; return TRUE; } // Stylize complex recursive expression with termination pattern FXbool FXSafeBracketRule::stylize(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const { FXint head,tail; if(beg.match(text,to,&start,&tail,REX_FORWARD,1,fm,fm)){ fillstyle(textstyle,style,start,tail); FXSafeBracketRule::stylizeBody(text,textstyle,tail,to,head,stop); return TRUE; } return FALSE; } FXIMPLEMENT(FXMasterRule,FXRule,NULL,0) // Stylize body FXbool FXMasterRule::stylizeBody(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const { FXint head,tail,node; start=fm; while(fmstylize(text,textstyle,fm,to,head,tail)){ fm=tail; goto nxt; } } textstyle[fm++]=style; nxt:continue; } stop=to; return TRUE; } // Stylize text FXbool FXMasterRule::stylize(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const { return FXMasterRule::stylizeBody(text,textstyle,fm,to,start,stop); } FXIMPLEMENT(FXSyntax,FXObject,NULL,0) // Construct syntax object; needs at least one master rule FXSyntax::FXSyntax(const FXString& lang):language(lang){ rules.append(new FXMasterRule("Master",-1,0)); delimiters=FXText::textDelimiters; contextLines=1; contextChars=1; } // Match filename against wildcards FXbool FXSyntax::matchFilename(const FXString& name) const { return FXPath::match(extensions,name); } // Match contents against regular expression FXbool FXSyntax::matchContents(const FXString& text) const { return FXRex(contents).match(text); } // Append simple rule FXint FXSyntax::append(const FXString& name,const FXString& rex,FXint parent){ register FXint index=rules.no(); FXASSERT(0<=parent && parentrules.append(rule); return index; } // Append bracket rule FXint FXSyntax::append(const FXString& name,const FXString& brex,const FXString& erex,FXint parent){ register FXint index=rules.no(); FXASSERT(0<=parent && parentrules.append(rule); return index; } // Append safe bracket rule FXint FXSyntax::append(const FXString& name,const FXString& brex,const FXString& erex,const FXString& srex,FXint parent){ register FXint index=rules.no(); FXASSERT(0<=parent && parentrules.append(rule); return index; } // Return true if toplevel rule FXbool FXSyntax::isRoot(FXint rule) const { FXASSERT(0<=rule && ruleparent==0; } // Return true if p is ancestor of c FXbool FXSyntax::isAncestor(FXint p,FXint c) const { FXASSERT(0<=p && 0<=c); while(c>0){ c=rules[c]->getParent(); if(c==p) return TRUE; } return FALSE; } // Clean up FXSyntax::~FXSyntax(){ for(int i=0; i FXRuleList; // List of syntaxes typedef FXObjectListOf FXSyntaxList; // Highlight node class FXRule : public FXObject { FXDECLARE(FXRule) friend class FXSyntax; protected: FXString name; // Name of rule FXRuleList rules; // Subrules FXint parent; // Parent style index FXint style; // Own style index protected: FXRule(){} private: FXRule(const FXRule&); FXRule &operator=(const FXRule&); public: // Construct node FXRule(const FXString& nm,FXint p,FXint s):name(nm),parent(p),style(s){ } // Get number of child rules FXint getNumRules() const { return rules.no(); } // Get child rule FXRule* getRule(FXint index) const { return rules[index]; } // Rule name const FXString& getName() const { return name; } void setName(const FXString& nm){ name=nm; } // Get parent FXint getParent() const { return parent; } // Get style FXint getStyle() const { return style; } // Stylize text virtual FXbool stylize(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const; // Stylize body, i.e. after begin pattern has been seen virtual FXbool stylizeBody(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const; }; // Simple highlight node class FXSimpleRule : public FXRule { FXDECLARE(FXSimpleRule) protected: FXRex pat; // Pattern to match protected: FXSimpleRule(){ } private: FXSimpleRule(const FXSimpleRule&); FXSimpleRule &operator=(const FXSimpleRule&); public: // Construct node FXSimpleRule(const FXString& nm,const FXString& rex,FXint p,FXint s):FXRule(nm,p,s),pat(rex,REX_NEWLINE){ } // Stylize text virtual FXbool stylize(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const; }; // Bracketed highlight node class FXBracketRule : public FXRule { FXDECLARE(FXBracketRule) protected: FXRex beg; // Beginning pattern FXRex end; // Ending pattern protected: FXBracketRule(){ } private: FXBracketRule(const FXBracketRule&); FXBracketRule &operator=(const FXBracketRule&); public: // Construct node FXBracketRule(const FXString& nm,const FXString& brex,const FXString& erex,FXint p,FXint s):FXRule(nm,p,s),beg(brex,REX_NEWLINE),end(erex,REX_NEWLINE){ } // Stylize text virtual FXbool stylize(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const; // Stylize body, i.e. after begin pattern has been seen virtual FXbool stylizeBody(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const; }; // Bracketed highlight node with termination class FXSafeBracketRule : public FXBracketRule { FXDECLARE(FXSafeBracketRule) protected: FXRex esc; // Termination pattern protected: FXSafeBracketRule(){ } private: FXSafeBracketRule(const FXSafeBracketRule&); FXSafeBracketRule &operator=(const FXSafeBracketRule&); public: // Construct node FXSafeBracketRule(const FXString& nm,const FXString& brex,const FXString& erex,const FXString& srex,FXint p,FXint s):FXBracketRule(nm,brex,erex,p,s),esc(srex,REX_NEWLINE){ } // Stylize text virtual FXbool stylize(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const; // Stylize body, i.e. after begin pattern has been seen virtual FXbool stylizeBody(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const; }; // Master highlight node class FXMasterRule : public FXRule { FXDECLARE(FXMasterRule) protected: FXMasterRule(){ } private: FXMasterRule(const FXMasterRule&); FXMasterRule &operator=(const FXMasterRule&); public: // Construct node FXMasterRule(const FXString& nm,FXint p,FXint s):FXRule(nm,p,s){ } // Stylize text virtual FXbool stylize(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const; // Stylize body, i.e. after begin pattern has been seen virtual FXbool stylizeBody(const FXchar* text,FXchar *textstyle,FXint fm,FXint to,FXint& start,FXint& stop) const; }; // Syntax for a language class FXSyntax : public FXObject { FXDECLARE(FXSyntax) protected: FXRuleList rules; // Highlight rules FXString language; // Language name FXString extensions; // File extensions to recognize language FXString contents; // Contents to recognize language FXString delimiters; // Word delimiters in this language FXint contextLines; // Context lines needed for restyle FXint contextChars; // Context characters needed for restyle protected: static const FXHiliteStyle defaultStyle; protected: FXSyntax(){} private: FXSyntax(const FXSyntax&); FXSyntax &operator=(const FXSyntax&); public: // New language FXSyntax(const FXString& lang); // Get number of child rules FXint getNumRules() const { return rules.no(); } // Get rule FXRule* getRule(FXint rule) const { return rules[rule]; } // Return true if toplevel rule FXbool isRoot(FXint rule) const; // Return true if p is ancestor of c FXbool isAncestor(FXint p,FXint c) const; // Language name const FXString& getName() const { return language; } void setName(const FXString& lang){ language=lang; } // Extensions const FXString& getExtensions() const { return extensions; } void setExtensions(const FXString& exts){ extensions=exts; } // Contents const FXString& getContents() const { return contents; } void setContents(const FXString& cont){ contents=cont; } // Delimiters const FXString& getDelimiters() const { return delimiters; } void setDelimiters(const FXString& delims){ delimiters=delims; } // Context lines FXint getContextLines() const { return contextLines; } void setContextLines(FXint num){ contextLines=num; } // Context characters FXint getContextChars() const { return contextChars; } void setContextChars(FXint num){ contextChars=num; } // Match filename against wildcards FXbool matchFilename(const FXString& name) const; // Match contents against regular expression FXbool matchContents(const FXString& text) const; // Append simple rule FXint append(const FXString& name,const FXString& rex,FXint parent=0); // Append bracket rule FXint append(const FXString& name,const FXString& brex,const FXString& erex,FXint parent=0); // Append safe bracket rule FXint append(const FXString& name,const FXString& brex,const FXString& erex,const FXString& srex,FXint parent=0); // Wipes the rules virtual ~FXSyntax(); }; #endif fox1.6-1.6.57/adie/LICENSE000066400000000000000000000431241326741342000145500ustar00rootroot00000000000000 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. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. fox1.6-1.6.57/adie/Makefile.am000066400000000000000000000027351326741342000156020ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp LDADD = $(top_builddir)/src/libFOX-1.6.la -lm bin_PROGRAMS = adie bin_SCRIPTS = Adie.stx man_MANS = adie.1 ICONS = \ adie_gif.gif \ big_gif.gif \ bookdel_gif.gif \ booknext_gif.gif \ bookprev_gif.gif \ bookset_gif.gif \ close_gif.gif \ colors_gif.gif \ copy_gif.gif \ cut_gif.gif \ delete_gif.gif \ delimit_gif.gif \ fonts_gif.gif \ help_gif.gif \ indent_gif.gif \ info_gif.gif \ lang_gif.gif \ new_gif.gif \ open_gif.gif \ palette_gif.gif \ pattern_gif.gif \ paste_gif.gif \ print_gif.gif \ quit_gif.gif \ redo_gif.gif \ reload_gif.gif \ saveall_gif.gif \ saveas_gif.gif \ save_gif.gif \ search_gif.gif \ searchnext_gif.gif \ searchprev_gif.gif \ shiftleft_gif.gif \ shiftright_gif.gif \ small_gif.gif \ styles_gif.gif \ syntax_gif.gif \ undo_gif.gif adie_SOURCES = \ Adie.h \ Adie.cpp \ Commands.cpp \ Commands.h \ help.h \ help.cpp \ HelpWindow.h \ HelpWindow.cpp \ Hilite.h \ Hilite.cpp \ icons.h \ icons.cpp \ main.cpp \ parsesyntax.cpp \ Preferences.h \ Preferences.cpp \ TextWindow.h \ TextWindow.cpp \ LICENSE \ $(ICONS) Adie.cpp: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $^ icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $^ CLEANFILES = icons.h icons.cpp EXTRA_DIST = \ $(man_MANS) \ Adie.stx \ Makefile.bc \ Makefile.wc \ Makefile.dmc fox1.6-1.6.57/adie/Makefile.bc000066400000000000000000000063661326741342000155750ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Copyright (C) 1997,2002 by Jeroen van der Zijp. All Rights Reserved # ############################################################################## # $Id: Makefile.bc,v 1.13 2005/09/22 11:14:47 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # For use with Borland C++ Builder 3 or later CXX = bcc32 CXXFLAGS = -5 -O2 -w-par -w-csu -w-aus RM = del TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = bcc32 LDFLAGS = -laa GLLIBS = opengl32.lib glu32.lib INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = adie.exe OBJECTS = \ adie.obj \ Commands.obj \ HelpWindow.obj \ TextWindow.obj \ Preferences.obj \ help.obj \ Hilite.obj \ icons.obj \ parsesyntax.obj \ main.obj ICONS = \ adie_gif.gif \ big_gif.gif \ bookdel_gif.gif \ booknext_gif.gif \ bookprev_gif.gif \ bookset_gif.gif \ close_gif.gif \ colors_gif.gif \ copy_gif.gif \ cut_gif.gif \ delete_gif.gif \ delimit_gif.gif \ fonts_gif.gif \ help_gif.gif \ indent_gif.gif \ info_gif.gif \ lang_gif.gif \ new_gif.gif \ open_gif.gif \ palette_gif.gif \ paste_gif.gif \ pattern_gif.gif \ print_gif.gif \ quit_gif.gif \ redo_gif.gif \ reload_gif.gif \ saveall_gif.gif \ saveas_gif.gif \ save_gif.gif \ search_gif.gif \ searchnext_gif.gif \ searchprev_gif.gif \ shiftleft_gif.gif \ shiftright_gif.gif \ small_gif.gif \ styles_gif.gif \ syntax_gif.gif \ undo_gif.gif .cpp.obj: $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) adie.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) adie.obj: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $** icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $** clean: $(RM) *.obj $(RM) *.exe $(RM) *.tds $(RM) icons.cpp $(RM) icons.h fox1.6-1.6.57/adie/Makefile.dmc000066400000000000000000000074721326741342000157530ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Contributed by: Andre Fornacon, updates from Jochen Rassler # ############################################################################## # $Id: Makefile.dmc,v 1.14.2.2 2006/08/08 23:17:35 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # Digital Mars C++ Compiler 8.x or later CXX = dmc CXXFLAGS = -mn -5 -a8 -Ae -Ar RM = del TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = link LDFLAGS = -noignorecase LIBS = c:\dm\lib\advapi32.lib c:\dm\lib\shell32.lib c:\dm\lib\gdi32.lib c:\dm\lib\wsock32.lib c:\dm\lib\winspool.lib GLLIBS = opengl32.lib glu32.lib INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = adie.exe SOURCES = \ Adie.cpp \ Commands.cpp \ help.cpp \ HelpWindow.cpp \ Hilite.cpp \ icons.cpp \ main.cpp \ parsesyntax.cpp \ Preferences.cpp \ TextWindow.cpp OBJECTS = \ adie.obj \ Commands.obj \ help.obj \ HelpWindow.obj \ TextWindow.obj \ Preferences.obj \ help.obj \ Hilite.obj \ icons.obj \ parsesyntax.obj \ main.obj # splitted to avoid 'cmdline too long' errors ICONS_1 = adie_gif.gif big_gif.gif bookset_gif.gif booknext_gif.gif \ bookprev_gif.gif bookdel_gif.gif close_gif.gif colors_gif.gif \ copy_gif.gif cut_gif.gif delete_gif.gif fonts_gif.gif help_gif.gif ICONS_2 = indent_gif.gif info_gif.gif lang_gif.gif new_gif.gif open_gif.gif \ palette_gif.gif pattern_gif.gif paste_gif.gif print_gif.gif \ quit_gif.gif redo_gif.gif reload_gif.gif save_gif.gif saveall_gif.gif ICONS_3 = saveas_gif.gif search_gif.gif searchnext_gif.gif searchprev_gif.gif \ shiftleft_gif.gif shiftright_gif.gif styles_gif.gif small_gif.gif \ syntax_gif.gif undo_gif.gif ICONS = $(ICONS_1) $(ICONS_2) $(ICONS_3) .cpp.obj: $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) adie.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) $(LIBS) adie.obj: icons.cpp icons.h: $(ICONS) $(RM) $@ $(RESWRAP) -i -oa $@ $(ICONS_1) $(RESWRAP) -i -oa $@ $(ICONS_2) $(RESWRAP) -i -oa $@ $(ICONS_2) icons.cpp: $(ICONS) $(RM) $@ echo ^#include "icons.h" > $@ $(RESWRAP) -oa $@ $(ICONS_1) $(RESWRAP) -oa $@ $(ICONS_2) $(RESWRAP) -oa $@ $(ICONS_3) clean: $(RM) *.obj *.exe *.tds *.map icons.cpp fox1.6-1.6.57/adie/Makefile.in000066400000000000000000000650551326741342000156170ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = adie$(EXEEXT) subdir = adie ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am__objects_1 = am_adie_OBJECTS = Adie.$(OBJEXT) Commands.$(OBJEXT) help.$(OBJEXT) \ HelpWindow.$(OBJEXT) Hilite.$(OBJEXT) icons.$(OBJEXT) \ main.$(OBJEXT) parsesyntax.$(OBJEXT) Preferences.$(OBJEXT) \ TextWindow.$(OBJEXT) $(am__objects_1) adie_OBJECTS = $(am_adie_OBJECTS) adie_LDADD = $(LDADD) adie_DEPENDENCIES = $(top_builddir)/src/libFOX-1.6.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(adie_SOURCES) DIST_SOURCES = $(adie_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp LDADD = $(top_builddir)/src/libFOX-1.6.la -lm bin_SCRIPTS = Adie.stx man_MANS = adie.1 ICONS = \ adie_gif.gif \ big_gif.gif \ bookdel_gif.gif \ booknext_gif.gif \ bookprev_gif.gif \ bookset_gif.gif \ close_gif.gif \ colors_gif.gif \ copy_gif.gif \ cut_gif.gif \ delete_gif.gif \ delimit_gif.gif \ fonts_gif.gif \ help_gif.gif \ indent_gif.gif \ info_gif.gif \ lang_gif.gif \ new_gif.gif \ open_gif.gif \ palette_gif.gif \ pattern_gif.gif \ paste_gif.gif \ print_gif.gif \ quit_gif.gif \ redo_gif.gif \ reload_gif.gif \ saveall_gif.gif \ saveas_gif.gif \ save_gif.gif \ search_gif.gif \ searchnext_gif.gif \ searchprev_gif.gif \ shiftleft_gif.gif \ shiftright_gif.gif \ small_gif.gif \ styles_gif.gif \ syntax_gif.gif \ undo_gif.gif adie_SOURCES = \ Adie.h \ Adie.cpp \ Commands.cpp \ Commands.h \ help.h \ help.cpp \ HelpWindow.h \ HelpWindow.cpp \ Hilite.h \ Hilite.cpp \ icons.h \ icons.cpp \ main.cpp \ parsesyntax.cpp \ Preferences.h \ Preferences.cpp \ TextWindow.h \ TextWindow.cpp \ LICENSE \ $(ICONS) CLEANFILES = icons.h icons.cpp EXTRA_DIST = \ $(man_MANS) \ Adie.stx \ Makefile.bc \ Makefile.wc \ Makefile.dmc all: all-am .SUFFIXES: .SUFFIXES: .gif .bmp .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign adie/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign adie/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list adie$(EXEEXT): $(adie_OBJECTS) $(adie_DEPENDENCIES) $(EXTRA_adie_DEPENDENCIES) @rm -f adie$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(adie_OBJECTS) $(adie_LDADD) $(LIBS) install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Adie.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Commands.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HelpWindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Hilite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Preferences.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextWindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/help.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parsesyntax.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-binSCRIPTS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-binSCRIPTS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-binSCRIPTS \ uninstall-man uninstall-man1 .PRECIOUS: Makefile Adie.cpp: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $^ icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $^ # 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: fox1.6-1.6.57/adie/Makefile.wc000066400000000000000000000067331326741342000156200ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Copyright (C) 1997,2005 by Jeroen van der Zijp. All Rights Reserved # ############################################################################## # $Id: Makefile.wc,v 1.9 2005/09/22 11:14:47 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # For use with OpenWatcom C++ v1.0 or later CXX = wpp386 CXXFLAGS = /w3 /e1 /zq /5r /ei /xs /xr /fp5 /otexan /zp=4 RM = del TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = wcl386 LDFLAGS = -l=nt_win GLLIBS = opengl32.lib glu32.lib INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib $(%WATCOM)\lib386\nt\comctl32.lib $(%WATCOM)\lib386\nt\wsock32.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = adie.exe OBJECTS = OBJECTS += adie.obj OBJECTS += Commands.obj OBJECTS += HelpWindow.obj OBJECTS += TextWindow.obj OBJECTS += Preferences.obj OBJECTS += ParseSyntax.obj OBJECTS += help.obj OBJECTS += Hilite.obj OBJECTS += icons.obj OBJECTS += main.obj ICONS = ICONS += adie_gif.gif ICONS += big_gif.gif ICONS += bookdel_gif.gif ICONS += booknext_gif.gif ICONS += bookprev_gif.gif ICONS += bookset_gif.gif ICONS += close_gif.gif ICONS += colors_gif.gif ICONS += copy_gif.gif ICONS += cut_gif.gif ICONS += delete_gif.gif ICONS += delimit_gif.gif ICONS += fonts_gif.gif ICONS += help_gif.gif ICONS += indent_gif.gif ICONS += info_gif.gif ICONS += lang_gif.gif ICONS += new_gif.gif ICONS += open_gif.gif ICONS += palette_gif.gif ICONS += paste_gif.gif ICONS += pattern_gif.gif ICONS += print_gif.gif ICONS += quit_gif.gif ICONS += redo_gif.gif ICONS += reload_gif.gif ICONS += saveall_gif.gif ICONS += saveas_gif.gif ICONS += save_gif.gif ICONS += search_gif.gif ICONS += searchnext_gif.gif ICONS += searchprev_gif.gif ICONS += shiftleft_gif.gif ICONS += shiftright_gif.gif ICONS += small_gif.gif ICONS += styles_gif.gif ICONS += syntax_gif.gif ICONS += undo_gif.gif .cpp.obj: .AUTODEPEND $(CXX) $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) adie.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) adie.obj: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $(ICONS) icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $(ICONS) clean: .SYMBOLIC $(RM) *.obj $(RM) *.exe $(RM) *.err $(RM) icons.cpp $(RM) icons.h fox1.6-1.6.57/adie/Preferences.cpp000066400000000000000000000513641326741342000165150ustar00rootroot00000000000000/******************************************************************************** * * * P r e f e r e n c e s D i a l o g * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Preferences.cpp,v 1.68 2006/01/22 18:01:10 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "icons.h" #include "help.h" #include #include #include "FXRex.h" #include "FXArray.h" #include "Preferences.h" #include "Hilite.h" #include "TextWindow.h" #include "Adie.h" #include "icons.h" /*******************************************************************************/ // Object implementation FXIMPLEMENT(Preferences,FXDialogBox,NULL,0) // Construct Preferences::Preferences(TextWindow *owner):FXDialogBox(owner,"Adie Preferences",DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,0,0,0,0, 0,0,0,0, 4,4){ // Set title setTitle(tr("Adie Preferences")); // Interior FXVerticalFrame *vertical=new FXVerticalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y); FXHorizontalFrame *horizontal=new FXHorizontalFrame(vertical,LAYOUT_FILL_X|LAYOUT_FILL_Y); FXVerticalFrame *buttons=new FXVerticalFrame(horizontal,LAYOUT_LEFT|LAYOUT_FILL_Y|FRAME_SUNKEN|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT,0,0,0,0, 0,0,0,0, 0,0); FXSwitcher *switcher=new FXSwitcher(horizontal,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); // Icons pal=new FXGIFIcon(getApp(),palette_gif); ind=new FXGIFIcon(getApp(),indent_gif); pat=new FXGIFIcon(getApp(),pattern_gif); sty=new FXGIFIcon(getApp(),styles_gif); ///////////////////////// Color settings pane /////////////////////////////// FXVerticalFrame* colorspane=new FXVerticalFrame(switcher,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0, 0,0); new FXLabel(colorspane,tr("Color settings"),NULL,LAYOUT_LEFT); new FXHorizontalSeparator(colorspane,SEPARATOR_LINE|LAYOUT_FILL_X); FXMatrix *matrix1=new FXMatrix(colorspane,8,MATRIX_BY_ROWS|PACK_UNIFORM_HEIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 4,4,4,4, 4, 4); new FXLabel(matrix1,tr("Background:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Text:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Sel. text background:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Sel. text:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Hilite text background:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Hilite text:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Act. text background:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Numbers background:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_TEXT_BACK,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_TEXT_FORE,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_TEXT_SELBACK,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_TEXT_SELFORE,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_TEXT_HILITEBACK,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_TEXT_HILITEFORE,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_TEXT_ACTIVEBACK,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_TEXT_NUMBACK,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXFrame(matrix1,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix1,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix1,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix1,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix1,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix1,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix1,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix1,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Files background:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Files:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Sel. files background:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Sel. files:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Lines:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Cursor:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Active background:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix1,tr("Numbers:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_DIR_BACK,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_DIR_FORE,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_DIR_SELBACK,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_DIR_SELFORE,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_DIR_LINES,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_TEXT_CURSOR,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXCheckButton(matrix1,FXString::null,owner,TextWindow::ID_SHOWACTIVE,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 5,5,0,0); new FXColorWell(matrix1,FXRGB(0,0,0),owner,TextWindow::ID_TEXT_NUMFORE,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); //// Color settings button new FXButton(buttons,tr("Colors\tChange Colors\tChange text colors."),pal,switcher,FXSwitcher::ID_OPEN_FIRST,FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y); /////////////////////////// Editor settings pane //////////////////////////// FXVerticalFrame* editorpane=new FXVerticalFrame(switcher,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0, 0,0); new FXLabel(editorpane,tr("Editor settings"),NULL,LAYOUT_LEFT); new FXHorizontalSeparator(editorpane,SEPARATOR_LINE|LAYOUT_FILL_X); FXMatrix *matrix2=new FXMatrix(editorpane,8,MATRIX_BY_ROWS|PACK_UNIFORM_HEIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 4,4,4,4, 4, 2); new FXLabel(matrix2,tr("Word wrapping:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Auto indent:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Fixed wrap margin:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Strip carriage returns:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Strip trailing spaces:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Append newline at end of file:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Insert tab characters:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Warn if changed externally:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXCheckButton(matrix2,FXString::null,owner,TextWindow::ID_TOGGLE_WRAP,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXCheckButton(matrix2,FXString::null,owner,TextWindow::ID_AUTOINDENT,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXCheckButton(matrix2,FXString::null,owner,TextWindow::ID_FIXED_WRAP,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXCheckButton(matrix2,FXString::null,owner,TextWindow::ID_STRIP_CR,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXCheckButton(matrix2,FXString::null,owner,TextWindow::ID_STRIP_SP,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXCheckButton(matrix2,FXString::null,owner,TextWindow::ID_APPEND_NL,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXCheckButton(matrix2,FXString::null,owner,TextWindow::ID_INSERTTABS,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXCheckButton(matrix2,FXString::null,owner,TextWindow::ID_WARNCHANGED,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXFrame(matrix2,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix2,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix2,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix2,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix2,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix2,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix2,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXFrame(matrix2,LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Wrap margin:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Tab columns:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Brace match time (ms):"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Mouse wheel lines:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Line number space:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Save view of file:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Save bookmarks:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXFrame(matrix2,LAYOUT_FILL_ROW); new FXTextField(matrix2,6,owner,TextWindow::ID_WRAPCOLUMNS,JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW,0,0,0,0, 2,2,1,1); new FXTextField(matrix2,6,owner,TextWindow::ID_TABCOLUMNS,JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW,0,0,0,0, 2,2,1,1); new FXTextField(matrix2,6,owner,TextWindow::ID_BRACEMATCH,JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW,0,0,0,0, 2,2,1,1); FXSpinner* spinner=new FXSpinner(matrix2,3,owner,TextWindow::ID_WHEELADJUST,JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW,0,0,0,0, 2,2,1,1); spinner->setRange(1,100); FXSpinner* spinner1=new FXSpinner(matrix2,3,owner,TextWindow::ID_TEXT_LINENUMS,JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW,0,0,0,0, 2,2,1,1); spinner1->setRange(0,8); new FXCheckButton(matrix2,FXString::null,owner,TextWindow::ID_SAVEVIEWS,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXCheckButton(matrix2,FXString::null,owner,TextWindow::ID_SAVEMARKS,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); FXHorizontalFrame *worddelims=new FXHorizontalFrame(editorpane,LAYOUT_FILL_Y|LAYOUT_FILL_X,0,0,0,0, 4,4,4,4, 4, 4); new FXLabel(worddelims,tr("Word delimiters:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y); new FXTextField(worddelims,10,owner,TextWindow::ID_DELIMITERS,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X,0,0,0,0, 2,2,1,1); //// Editor settings button new FXButton(buttons,tr("Editor\tEditor settings\tChange editor settings and other things."),ind,switcher,FXSwitcher::ID_OPEN_SECOND,FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y); /////////////////////// File pattern settings pane ////////////////////////// FXVerticalFrame* filepatpane=new FXVerticalFrame(switcher,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0, 0,0); new FXLabel(filepatpane,tr("Filename patterns"),NULL,LAYOUT_LEFT); new FXHorizontalSeparator(filepatpane,SEPARATOR_LINE|LAYOUT_FILL_X); FXVerticalFrame *sub3=new FXVerticalFrame(filepatpane,LAYOUT_FILL_Y|LAYOUT_FILL_X,0,0,0,0, 0,0,10,0, 0,0); new FXLabel(sub3,tr("Filename patterns, one per line:"),NULL,JUSTIFY_LEFT); FXVerticalFrame* textwell=new FXVerticalFrame(sub3,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, 0,0,0,0); filepattext=new FXText(textwell,NULL,0,LAYOUT_FILL_X|LAYOUT_FILL_Y); //// File pattern settings button new FXButton(buttons,tr("Patterns\tFilename patterns\tChange wildcard patterns for filenames."),pat,switcher,FXSwitcher::ID_OPEN_THIRD,FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y); ///////////////////// Highlight style settings pane ///////////////////////// FXVerticalFrame* highlightpane=new FXVerticalFrame(switcher,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0, 0,0); new FXLabel(highlightpane,tr("Highlight styles"),NULL,LAYOUT_LEFT); new FXHorizontalSeparator(highlightpane,SEPARATOR_LINE|LAYOUT_FILL_X); FXHorizontalFrame *sub5=new FXHorizontalFrame(highlightpane,LAYOUT_FILL_Y|LAYOUT_FILL_X,0,0,0,0, 0,0,10,0); FXGroupBox* colorgroup=new FXGroupBox(sub5,tr("Style of item"),FRAME_GROOVE|LAYOUT_RIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 4,4,4,4, 4,4); FXMatrix *colormatrix=new FXMatrix(colorgroup,3,MATRIX_BY_COLUMNS|PACK_UNIFORM_HEIGHT|LAYOUT_SIDE_TOP|LAYOUT_FILL_X,0,0,0,0, 0,0,0,0, 4, 4); new FXLabel(colormatrix,tr("Normal text color fg/bg:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN); new FXColorWell(colormatrix,FXRGB(0,0,0),owner,TextWindow::ID_STYLE_NORMAL_FG,FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(colormatrix,FXRGB(0,0,0),owner,TextWindow::ID_STYLE_NORMAL_BG,FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(colormatrix,tr("Selected text color fg/bg:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN); new FXColorWell(colormatrix,FXRGB(0,0,0),owner,TextWindow::ID_STYLE_SELECT_FG,FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(colormatrix,FXRGB(0,0,0),owner,TextWindow::ID_STYLE_SELECT_BG,FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(colormatrix,tr("Highlighted text color fg/bg:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN); new FXColorWell(colormatrix,FXRGB(0,0,0),owner,TextWindow::ID_STYLE_HILITE_FG,FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXColorWell(colormatrix,FXRGB(0,0,0),owner,TextWindow::ID_STYLE_HILITE_BG,FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(colormatrix,tr("Active line background color:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN); new FXColorWell(colormatrix,FXRGB(0,0,0),owner,TextWindow::ID_STYLE_ACTIVE_BG,FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_ROW,0,0,40,24); new FXFrame(colormatrix,LAYOUT_FILL_ROW); new FXLabel(colormatrix,tr("Underline text:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN); new FXCheckButton(colormatrix,FXString::null,owner,TextWindow::ID_STYLE_UNDERLINE,LAYOUT_CENTER_X|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXFrame(colormatrix,LAYOUT_FILL_ROW); new FXLabel(colormatrix,tr("Strikeout text:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN); new FXCheckButton(colormatrix,FXString::null,owner,TextWindow::ID_STYLE_STRIKEOUT,LAYOUT_CENTER_X|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXFrame(colormatrix,LAYOUT_FILL_ROW); new FXLabel(colormatrix,tr("Bold:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN); new FXCheckButton(colormatrix,FXString::null,owner,TextWindow::ID_STYLE_BOLD,LAYOUT_CENTER_X|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXFrame(colormatrix,LAYOUT_FILL_ROW); // new FXLabel(colormatrix,"Italic:",NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN); // new FXCheckButton(colormatrix,NULL,NULL,0,LAYOUT_CENTER_X|LAYOUT_CENTER_Y|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); // new FXFrame(colormatrix,LAYOUT_FILL_ROW); FXGroupBox* stylegroup=new FXGroupBox(sub5,tr("Item name"),FRAME_GROOVE|LAYOUT_FILL_Y,0,0,0,0, 4,4,4,4, 4,4); FXVerticalFrame* listframe=new FXVerticalFrame(stylegroup,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); stylelist=new FXList(listframe,owner,TextWindow::ID_STYLE_INDEX,LIST_BROWSESELECT|HSCROLLER_NEVER|LAYOUT_FIX_WIDTH|LAYOUT_FILL_Y, 0,0,110,0); //// Highlight style settings button new FXButton(buttons,tr("Styles\tHighlight styles\tChange highlight styles for syntax coloring."),sty,switcher,FXSwitcher::ID_OPEN_FOURTH,FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y); // Bottom part new FXHorizontalSeparator(vertical,SEPARATOR_RIDGE|LAYOUT_FILL_X); FXHorizontalFrame *closebox=new FXHorizontalFrame(vertical,LAYOUT_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH); new FXButton(closebox,tr("&Accept"),NULL,this,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 20,20); new FXButton(closebox,tr("&Cancel"),NULL,this,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 20,20); } /*******************************************************************************/ // Change patterns, each pattern separated by newline void Preferences::setPatterns(const FXString& patterns){ filepattext->setText(patterns); } // Return list of patterns FXString Preferences::getPatterns() const { return filepattext->getText(); } // Set language syntax void Preferences::setSyntax(FXSyntax* syn){ stylelist->clearItems(TRUE); if(syn){ for(FXint i=1; igetNumRules(); i++){ stylelist->appendItem(syn->getRule(i)->getName(),NULL,NULL,TRUE); } } } // Clean up Preferences::~Preferences(){ delete pal; delete ind; delete pat; delete sty; } fox1.6-1.6.57/adie/Preferences.h000066400000000000000000000054431326741342000161570ustar00rootroot00000000000000/******************************************************************************** * * * P r e f e r e n c e s D i a l o g * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Preferences.h,v 1.31 2006/01/22 18:01:11 fox Exp $ * ********************************************************************************/ #ifndef PREFERENCES_H #define PREFERENCES_H ////////////////////////////// UNDER DEVELOPMENT ////////////////////////////// class TextWindow; class Adie; class FXSyntax; class Preferences : public FXDialogBox { FXDECLARE(Preferences) protected: FXText *filepattext; FXList *stylelist; FXTextField *stylename; FXIcon *pal; FXIcon *ind; FXIcon *pat; FXIcon *sty; private: Preferences(){} Preferences(const Preferences&); Preferences& operator=(const Preferences&); public: // Create preferences dialog Preferences(TextWindow *owner); // Owner is text window Adie* getApp() const { return (Adie*)FXDialogBox::getApp(); } // Set filename patterns void setPatterns(const FXString& patterns); // Get filename patterns FXString getPatterns() const; // Set language syntax void setSyntax(FXSyntax* syn); // Clean up virtual ~Preferences(); }; #endif fox1.6-1.6.57/adie/TextWindow.cpp000066400000000000000000003463471326741342000164000ustar00rootroot00000000000000/******************************************************************************** * * * T h e A d i e T e x t E d i t o r * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: TextWindow.cpp,v 1.125.2.3 2008/03/11 02:19:42 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "fxkeys.h" #include #include #include #include #include #ifndef WIN32 #include #endif #include #include "FXRex.h" #include "FXArray.h" #include "HelpWindow.h" #include "Preferences.h" #include "Commands.h" #include "Hilite.h" #include "TextWindow.h" #include "Adie.h" #include "icons.h" /* Note: - Commenting/uncommenting source code (various programming languages, of course). - Block select (and block operations). - Better icons. - Syntax highlighting (programmable). - Shell commands. - C tags support. - Each style has optional parent; colors with value FXRGBA(0,0,0,0) are inherited from the parent; this way, sub-styles are possible. - Bookmarks should be adjusted when text is added or removed:- bookmarks inside a deleted area should be removed. - If there is text selected, ctrl-H goes to the next occurrence. If there is nothing selected, ctrl-H would go to the previous search pattern, similar to the way ctrl-G works in nedit. - If there is a number selected, ctrl-L goes to that line number. If there is nothing selected, ctrl-L pops the goto dialog. - Have an option to beep when the search wraps back to the top of the file. - When entire lines are highlighted through triple click and then dragged, a drop at the start of the destination line would seem more natural. - A more serious problem occurs when you undo a drag and drop. If you undo, (using ctrl-Z for example), the paste is reversed, but not the cut. You have to hit undo again to reverse the cut. It would be far more natural to have the "combination" type operations, such as a move, (cut then paste), be somehow recorded as a single operation in the undo system. - Ctrl-B does not seem to be used for anything now. Could we use this for the block select. The shift-alt-{ does not flow from my fingers easily. Just a preference... - The C++ comment/uncomment of selected lines would be very useful. I didn't realize how much I used it until it wasn't there. - When the auto indent is turned on, and you press return, the start of the next line is the same as the previous line, which is good. If the next key that's pressed is the backspace, it would be nice if the caret could back up a full indention level. (e.g. We use two spaces for emulated tabs. The backspace would back up two spaces...) - Would be nice if we could remember not only bookmarks, but also window size/position based on file name. - Add option to preferences for text widget non-tracking sliders, i.e. use jump-scrolling for slow machines/network connections. - Close last window just saves text, then starts new document in last window; in other words, only quit will terminate app. - Maybe FXText should have its own accelerator table so that key bindings may be changed. - Would be nice to save as HTML. */ #define CLOCKTIMER 500 #define FILETIMER 1000 #define RESTYLEJUMP 80 /*******************************************************************************/ // Map FXDEFMAP(TextWindow) TextWindowMap[]={ FXMAPFUNC(SEL_UPDATE, 0, TextWindow::onUpdate), FXMAPFUNC(SEL_FOCUSIN, 0, TextWindow::onFocusIn), FXMAPFUNC(SEL_TIMEOUT, TextWindow::ID_CLOCKTIME, TextWindow::onClock), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_ABOUT, TextWindow::onCmdAbout), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_HELP, TextWindow::onCmdHelp), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_NEW, TextWindow::onCmdNew), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_OPEN, TextWindow::onCmdOpen), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_OPEN_SELECTED, TextWindow::onCmdOpenSelected), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_OPEN_TREE, TextWindow::onCmdOpenTree), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_OPEN_RECENT, TextWindow::onCmdOpenRecent), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_REOPEN, TextWindow::onCmdReopen), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_REOPEN, TextWindow::onUpdReopen), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_SAVE, TextWindow::onCmdSave), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_SAVE, TextWindow::onUpdSave), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_SAVEAS, TextWindow::onCmdSaveAs), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_FONT, TextWindow::onCmdFont), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_PRINT, TextWindow::onCmdPrint), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TEXT_BACK, TextWindow::onCmdTextBackColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_TEXT_BACK, TextWindow::onCmdTextBackColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TEXT_BACK, TextWindow::onUpdTextBackColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TEXT_FORE, TextWindow::onCmdTextForeColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_TEXT_FORE, TextWindow::onCmdTextForeColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TEXT_FORE, TextWindow::onUpdTextForeColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TEXT_SELBACK, TextWindow::onCmdTextSelBackColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_TEXT_SELBACK, TextWindow::onCmdTextSelBackColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TEXT_SELBACK, TextWindow::onUpdTextSelBackColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TEXT_SELFORE, TextWindow::onCmdTextSelForeColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_TEXT_SELFORE, TextWindow::onCmdTextSelForeColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TEXT_SELFORE, TextWindow::onUpdTextSelForeColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TEXT_HILITEBACK, TextWindow::onCmdTextHiliteBackColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_TEXT_HILITEBACK, TextWindow::onCmdTextHiliteBackColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TEXT_HILITEBACK, TextWindow::onUpdTextHiliteBackColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TEXT_HILITEFORE, TextWindow::onCmdTextHiliteForeColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_TEXT_HILITEFORE, TextWindow::onCmdTextHiliteForeColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TEXT_HILITEFORE, TextWindow::onUpdTextHiliteForeColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TEXT_CURSOR, TextWindow::onCmdTextCursorColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_TEXT_CURSOR, TextWindow::onCmdTextCursorColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TEXT_CURSOR, TextWindow::onUpdTextCursorColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TEXT_ACTIVEBACK, TextWindow::onCmdTextActBackColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_TEXT_ACTIVEBACK, TextWindow::onCmdTextActBackColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TEXT_ACTIVEBACK, TextWindow::onUpdTextActBackColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TEXT_NUMBACK, TextWindow::onCmdTextBarColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_TEXT_NUMBACK, TextWindow::onCmdTextBarColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TEXT_NUMBACK, TextWindow::onUpdTextBarColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TEXT_NUMFORE, TextWindow::onCmdTextNumberColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_TEXT_NUMFORE, TextWindow::onCmdTextNumberColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TEXT_NUMFORE, TextWindow::onUpdTextNumberColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_DIR_BACK, TextWindow::onCmdDirBackColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_DIR_BACK, TextWindow::onCmdDirBackColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_DIR_BACK, TextWindow::onUpdDirBackColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_DIR_FORE, TextWindow::onCmdDirForeColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_DIR_FORE, TextWindow::onCmdDirForeColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_DIR_FORE, TextWindow::onUpdDirForeColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_DIR_SELBACK, TextWindow::onCmdDirSelBackColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_DIR_SELBACK, TextWindow::onCmdDirSelBackColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_DIR_SELBACK, TextWindow::onUpdDirSelBackColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_DIR_SELFORE, TextWindow::onCmdDirSelForeColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_DIR_SELFORE, TextWindow::onCmdDirSelForeColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_DIR_SELFORE, TextWindow::onUpdDirSelForeColor), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_DIR_LINES, TextWindow::onCmdDirLineColor), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_DIR_LINES, TextWindow::onCmdDirLineColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_DIR_LINES, TextWindow::onUpdDirLineColor), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TOGGLE_WRAP, TextWindow::onUpdWrap), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TOGGLE_WRAP, TextWindow::onCmdWrap), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_SAVE_SETTINGS, TextWindow::onCmdSaveSettings), FXMAPFUNC(SEL_CHANGED, TextWindow::ID_TEXT, TextWindow::onTextChanged), FXMAPFUNC(SEL_INSERTED, TextWindow::ID_TEXT, TextWindow::onTextInserted), FXMAPFUNC(SEL_REPLACED, TextWindow::ID_TEXT, TextWindow::onTextReplaced), FXMAPFUNC(SEL_DELETED, TextWindow::ID_TEXT, TextWindow::onTextDeleted), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,TextWindow::ID_TEXT, TextWindow::onTextRightMouse), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_FIXED_WRAP, TextWindow::onUpdWrapFixed), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_FIXED_WRAP, TextWindow::onCmdWrapFixed), FXMAPFUNC(SEL_DND_MOTION, TextWindow::ID_TEXT, TextWindow::onEditDNDMotion), FXMAPFUNC(SEL_DND_DROP, TextWindow::ID_TEXT, TextWindow::onEditDNDDrop), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_STRIP_CR, TextWindow::onUpdStripReturns), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_STRIP_CR, TextWindow::onCmdStripReturns), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_STRIP_SP, TextWindow::onUpdStripSpaces), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_STRIP_SP, TextWindow::onCmdStripSpaces), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_APPEND_NL, TextWindow::onUpdAppendNewline), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_APPEND_NL, TextWindow::onCmdAppendNewline), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_INCLUDE_PATH, TextWindow::onCmdIncludePaths), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_FILEFILTER, TextWindow::onCmdFilter), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_OVERSTRIKE, TextWindow::onUpdOverstrike), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_READONLY, TextWindow::onUpdReadOnly), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_NUM_ROWS, TextWindow::onUpdNumRows), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_PREFERENCES, TextWindow::onCmdPreferences), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TABCOLUMNS, TextWindow::onCmdTabColumns), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TABCOLUMNS, TextWindow::onUpdTabColumns), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_DELIMITERS, TextWindow::onCmdDelimiters), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_DELIMITERS, TextWindow::onUpdDelimiters), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_WRAPCOLUMNS, TextWindow::onCmdWrapColumns), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_WRAPCOLUMNS, TextWindow::onUpdWrapColumns), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_AUTOINDENT, TextWindow::onCmdAutoIndent), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_AUTOINDENT, TextWindow::onUpdAutoIndent), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_INSERTTABS, TextWindow::onCmdInsertTabs), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_INSERTTABS, TextWindow::onUpdInsertTabs), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_BRACEMATCH, TextWindow::onCmdBraceMatch), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_BRACEMATCH, TextWindow::onUpdBraceMatch), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_INSERT_FILE, TextWindow::onUpdInsertFile), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_INSERT_FILE, TextWindow::onCmdInsertFile), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_EXTRACT_FILE, TextWindow::onUpdExtractFile), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_EXTRACT_FILE, TextWindow::onCmdExtractFile), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_WHEELADJUST, TextWindow::onUpdWheelAdjust), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_WHEELADJUST, TextWindow::onCmdWheelAdjust), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_NEXT_MARK, TextWindow::onUpdNextMark), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_NEXT_MARK, TextWindow::onCmdNextMark), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_PREV_MARK, TextWindow::onUpdPrevMark), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_PREV_MARK, TextWindow::onCmdPrevMark), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_SET_MARK, TextWindow::onUpdSetMark), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_SET_MARK, TextWindow::onCmdSetMark), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_CLEAR_MARKS, TextWindow::onCmdClearMarks), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_SAVEMARKS, TextWindow::onUpdSaveMarks), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_SAVEMARKS, TextWindow::onCmdSaveMarks), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_SAVEVIEWS, TextWindow::onUpdSaveViews), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_SAVEVIEWS, TextWindow::onCmdSaveViews), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_SHOWACTIVE, TextWindow::onUpdShowActive), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_SHOWACTIVE, TextWindow::onCmdShowActive), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_TEXT_LINENUMS, TextWindow::onUpdLineNumbers), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_TEXT_LINENUMS, TextWindow::onCmdLineNumbers), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_WARNCHANGED, TextWindow::onUpdWarnChanged), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_WARNCHANGED, TextWindow::onCmdWarnChanged), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_SYNTAX, TextWindow::onUpdSyntax), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_SYNTAX, TextWindow::onCmdSyntax), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_RESTYLE, TextWindow::onUpdRestyle), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_RESTYLE, TextWindow::onCmdRestyle), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_JUMPSCROLL, TextWindow::onUpdJumpScroll), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_JUMPSCROLL, TextWindow::onCmdJumpScroll), FXMAPFUNCS(SEL_UPDATE, TextWindow::ID_WINDOW_1, TextWindow::ID_WINDOW_10, TextWindow::onUpdWindow), FXMAPFUNCS(SEL_COMMAND, TextWindow::ID_WINDOW_1, TextWindow::ID_WINDOW_10, TextWindow::onCmdWindow), FXMAPFUNCS(SEL_UPDATE, TextWindow::ID_SYNTAX_FIRST, TextWindow::ID_SYNTAX_LAST, TextWindow::onUpdSyntaxSwitch), FXMAPFUNCS(SEL_COMMAND, TextWindow::ID_SYNTAX_FIRST, TextWindow::ID_SYNTAX_LAST, TextWindow::onCmdSyntaxSwitch), FXMAPFUNC(SEL_UPDATE, TextWindow::ID_STYLE_INDEX, TextWindow::onUpdStyleIndex), FXMAPFUNC(SEL_COMMAND, TextWindow::ID_STYLE_INDEX, TextWindow::onCmdStyleIndex), FXMAPFUNCS(SEL_UPDATE, TextWindow::ID_STYLE_NORMAL_FG, TextWindow::ID_STYLE_ACTIVE_BG, TextWindow::onUpdStyleColor), FXMAPFUNCS(SEL_CHANGED, TextWindow::ID_STYLE_NORMAL_FG, TextWindow::ID_STYLE_ACTIVE_BG, TextWindow::onCmdStyleColor), FXMAPFUNCS(SEL_COMMAND, TextWindow::ID_STYLE_NORMAL_FG, TextWindow::ID_STYLE_ACTIVE_BG, TextWindow::onCmdStyleColor), FXMAPFUNCS(SEL_UPDATE, TextWindow::ID_STYLE_UNDERLINE, TextWindow::ID_STYLE_BOLD, TextWindow::onUpdStyleFlags), FXMAPFUNCS(SEL_COMMAND, TextWindow::ID_STYLE_UNDERLINE, TextWindow::ID_STYLE_BOLD, TextWindow::onCmdStyleFlags), }; // Object implementation FXIMPLEMENT(TextWindow,FXMainWindow,TextWindowMap,ARRAYNUMBER(TextWindowMap)) /*******************************************************************************/ // Make some windows TextWindow::TextWindow(Adie* a,const FXString& file):FXMainWindow(a,"Adie",NULL,NULL,DECOR_ALL,0,0,850,600,0,0),mrufiles(a){ // Add to list of windows getApp()->windowlist.append(this); // Default font font=NULL; // Application icons setIcon(getApp()->bigicon); setMiniIcon(getApp()->smallicon); // Status bar statusbar=new FXStatusBar(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER|FRAME_RAISED); // Sites where to dock topdock=new FXDockSite(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X); bottomdock=new FXDockSite(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); leftdock=new FXDockSite(this,LAYOUT_SIDE_LEFT|LAYOUT_FILL_Y); rightdock=new FXDockSite(this,LAYOUT_SIDE_RIGHT|LAYOUT_FILL_Y); // Make menu bar dragshell1=new FXToolBarShell(this,FRAME_RAISED); menubar=new FXMenuBar(topdock,dragshell1,LAYOUT_DOCK_NEXT|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|FRAME_RAISED); new FXToolBarGrip(menubar,menubar,FXMenuBar::ID_TOOLBARGRIP,TOOLBARGRIP_DOUBLE); // Tool bar dragshell2=new FXToolBarShell(this,FRAME_RAISED); toolbar=new FXToolBar(topdock,dragshell2,LAYOUT_DOCK_NEXT|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|FRAME_RAISED); new FXToolBarGrip(toolbar,toolbar,FXToolBar::ID_TOOLBARGRIP,TOOLBARGRIP_DOUBLE); // Info about the editor new FXButton(statusbar,tr("\tAbout Adie\tAbout the Adie text editor."),getApp()->smallicon,this,ID_ABOUT,LAYOUT_FILL_Y|LAYOUT_RIGHT); // File menu filemenu=new FXMenuPane(this); new FXMenuTitle(menubar,tr("&File"),NULL,filemenu); // Edit Menu editmenu=new FXMenuPane(this); new FXMenuTitle(menubar,tr("&Edit"),NULL,editmenu); // Goto Menu gotomenu=new FXMenuPane(this); new FXMenuTitle(menubar,tr("&Goto"),NULL,gotomenu); // Search Menu searchmenu=new FXMenuPane(this); new FXMenuTitle(menubar,tr("&Search"),NULL,searchmenu); // Options Menu optionmenu=new FXMenuPane(this); new FXMenuTitle(menubar,tr("&Options"),NULL,optionmenu); // View menu viewmenu=new FXMenuPane(this); new FXMenuTitle(menubar,tr("&View"),NULL,viewmenu); // Window menu windowmenu=new FXMenuPane(this); new FXMenuTitle(menubar,tr("&Window"),NULL,windowmenu); // Help menu helpmenu=new FXMenuPane(this); new FXMenuTitle(menubar,tr("&Help"),NULL,helpmenu,LAYOUT_RIGHT); // Splitter FXSplitter* splitter=new FXSplitter(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|SPLITTER_TRACKING); // Sunken border for tree treebox=new FXVerticalFrame(splitter,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); // Make tree FXHorizontalFrame* treeframe=new FXHorizontalFrame(treebox,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); dirlist=new FXDirList(treeframe,this,ID_OPEN_TREE,DIRLIST_SHOWFILES|DIRLIST_NO_OWN_ASSOC|TREELIST_BROWSESELECT|TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|LAYOUT_FILL_X|LAYOUT_FILL_Y); dirlist->setAssociations(getApp()->associations); FXHorizontalFrame* filterframe=new FXHorizontalFrame(treebox,LAYOUT_FILL_X,0,0,0,0, 4,0,0,4); new FXLabel(filterframe,tr("Filter:"),NULL,LAYOUT_CENTER_Y); filter=new FXComboBox(filterframe,25,this,ID_FILEFILTER,COMBOBOX_STATIC|LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK); filter->setNumVisible(4); // Sunken border for text widget FXHorizontalFrame *textbox=new FXHorizontalFrame(splitter,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); // Make editor window editor=new FXText(textbox,this,ID_TEXT,LAYOUT_FILL_X|LAYOUT_FILL_Y|TEXT_SHOWACTIVE); editor->setHiliteMatchTime(2000); editor->setBarColumns(6); // Show clock on status bar clock=new FXTextField(statusbar,8,NULL,0,FRAME_SUNKEN|JUSTIFY_RIGHT|LAYOUT_RIGHT|LAYOUT_CENTER_Y|TEXTFIELD_READONLY,0,0,0,0,2,2,1,1); clock->setBackColor(statusbar->getBackColor()); // Undo/redo block undoredoblock=new FXHorizontalFrame(statusbar,LAYOUT_RIGHT|LAYOUT_CENTER_Y,0,0,0,0, 0,0,0,0); new FXLabel(undoredoblock,tr(" Undo:"),NULL,LAYOUT_CENTER_Y); FXTextField* undocount=new FXTextField(undoredoblock,6,&undolist,FXUndoList::ID_UNDO_COUNT,TEXTFIELD_READONLY|FRAME_SUNKEN|JUSTIFY_RIGHT|LAYOUT_CENTER_Y,0,0,0,0,2,2,1,1); undocount->setBackColor(statusbar->getBackColor()); new FXLabel(undoredoblock,tr(" Redo:"),NULL,LAYOUT_CENTER_Y); FXTextField* redocount=new FXTextField(undoredoblock,6,&undolist,FXUndoList::ID_REDO_COUNT,TEXTFIELD_READONLY|FRAME_SUNKEN|JUSTIFY_RIGHT|LAYOUT_CENTER_Y,0,0,0,0,2,2,1,1); redocount->setBackColor(statusbar->getBackColor()); // Show readonly state in status bar FXLabel* readonly=new FXLabel(statusbar,FXString::null,NULL,FRAME_SUNKEN|JUSTIFY_RIGHT|LAYOUT_RIGHT|LAYOUT_CENTER_Y,0,0,0,0,2,2,1,1); readonly->setTarget(this); readonly->setSelector(ID_READONLY); // Show insert mode in status bar FXLabel* overstrike=new FXLabel(statusbar,FXString::null,NULL,FRAME_SUNKEN|LAYOUT_RIGHT|LAYOUT_CENTER_Y,0,0,0,0,2,2,1,1); overstrike->setTarget(this); overstrike->setSelector(ID_OVERSTRIKE); // Show size of text in status bar FXTextField* numchars=new FXTextField(statusbar,7,this,ID_NUM_ROWS,TEXTFIELD_READONLY|FRAME_SUNKEN|JUSTIFY_RIGHT|LAYOUT_RIGHT|LAYOUT_CENTER_Y,0,0,0,0,2,2,1,1); numchars->setBackColor(statusbar->getBackColor()); // Caption before number new FXLabel(statusbar,tr(" Lines:"),NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y); // Show column number in status bar FXTextField* columnno=new FXTextField(statusbar,7,editor,FXText::ID_CURSOR_COLUMN,FRAME_SUNKEN|JUSTIFY_RIGHT|LAYOUT_RIGHT|LAYOUT_CENTER_Y,0,0,0,0,2,2,1,1); columnno->setBackColor(statusbar->getBackColor()); // Caption before number new FXLabel(statusbar,tr(" Col:"),NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y); // Show line number in status bar FXTextField* rowno=new FXTextField(statusbar,7,editor,FXText::ID_CURSOR_ROW,FRAME_SUNKEN|JUSTIFY_RIGHT|LAYOUT_RIGHT|LAYOUT_CENTER_Y,0,0,0,0,2,2,1,1); rowno->setBackColor(statusbar->getBackColor()); // Caption before number new FXLabel(statusbar,tr(" Line:"),NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y); // Toobar buttons: File manipulation new FXButton(toolbar,tr("\tNew\tCreate new document."),getApp()->newicon,this,ID_NEW,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tOpen\tOpen document file."),getApp()->openicon,this,ID_OPEN,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tSave\tSave document."),getApp()->saveicon,this,ID_SAVE,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tSave As\tSave document to another file."),getApp()->saveasicon,this,ID_SAVEAS,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXSeparator(toolbar,SEPARATOR_GROOVE); // Toobar buttons: Print new FXButton(toolbar,"\tPrint\tPrint document.",getApp()->printicon,this,ID_PRINT,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXSeparator(toolbar,SEPARATOR_GROOVE); // Toobar buttons: Editing new FXButton(toolbar,tr("\tCut\tCut selection to clipboard."),getApp()->cuticon,editor,FXText::ID_CUT_SEL,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tCopy\tCopy selection to clipboard."),getApp()->copyicon,editor,FXText::ID_COPY_SEL,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tPaste\tPaste clipboard."),getApp()->pasteicon,editor,FXText::ID_PASTE_SEL,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tDelete\t\tDelete selection."),getApp()->deleteicon,editor,FXText::ID_DELETE_SEL,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXSeparator(toolbar,SEPARATOR_GROOVE); // Undo/redo new FXButton(toolbar,tr("\tUndo\tUndo last change."),getApp()->undoicon,&undolist,FXUndoList::ID_UNDO,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tRedo\tRedo last undo."),getApp()->redoicon,&undolist,FXUndoList::ID_REDO,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXSeparator(toolbar,SEPARATOR_GROOVE); // Search new FXButton(toolbar,tr("\tSearch\tSearch text."),getApp()->searchicon,editor,FXText::ID_SEARCH,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tSearch Previous Selected\tSearch previous occurrence of selected text."),getApp()->searchprevicon,editor,FXText::ID_SEARCH_BACK_SEL,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tSearch Next Selected\tSearch next occurrence of selected text."),getApp()->searchnexticon,editor,FXText::ID_SEARCH_FORW_SEL,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXSeparator(toolbar,SEPARATOR_GROOVE); // Bookmarks new FXButton(toolbar,tr("\tBookmark\tSet bookmark."),getApp()->bookseticon,this,ID_SET_MARK,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tPrevious Bookmark\tGoto previous bookmark."),getApp()->bookprevicon,this,ID_PREV_MARK,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tNext Bookmark\tGoto next bookmark."),getApp()->booknexticon,this,ID_NEXT_MARK,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tDelete Bookmarks\tDelete all bookmarks."),getApp()->bookdelicon,this,ID_CLEAR_MARKS,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXSeparator(toolbar,SEPARATOR_GROOVE); new FXButton(toolbar,tr("\tShift left\tShift text left by one."),getApp()->shiftlefticon,editor,FXText::ID_SHIFT_LEFT,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,tr("\tShift right\tShift text right by one."),getApp()->shiftrighticon,editor,FXText::ID_SHIFT_RIGHT,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXSeparator(toolbar,SEPARATOR_GROOVE); // Color new FXButton(toolbar,tr("\tFonts\tDisplay font dialog."),getApp()->fontsicon,this,ID_FONT,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Help new FXButton(toolbar,tr("\tDisplay help\tDisplay online help information."),getApp()->helpicon,this,ID_HELP,ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_RIGHT); // File Menu entries new FXMenuCommand(filemenu,tr("&New...\tCtl-N\tCreate new document."),getApp()->newicon,this,ID_NEW); new FXMenuCommand(filemenu,tr("&Open...\tCtl-O\tOpen document file."),getApp()->openicon,this,ID_OPEN); new FXMenuCommand(filemenu,tr("Open Selected... \tCtl-E\tOpen highlighted document file."),NULL,this,ID_OPEN_SELECTED); new FXMenuCommand(filemenu,tr("&Reopen...\t\tReopen file."),getApp()->reloadicon,this,ID_REOPEN); new FXMenuCommand(filemenu,tr("&Save\tCtl-S\tSave changes to file."),getApp()->saveicon,this,ID_SAVE); new FXMenuCommand(filemenu,tr("Save &As...\t\tSave document to another file."),getApp()->saveasicon,this,ID_SAVEAS); new FXMenuCommand(filemenu,tr("&Close\tCtl-W\tClose document."),NULL,this,ID_CLOSE); new FXMenuSeparator(filemenu); new FXMenuCommand(filemenu,tr("Insert from file...\t\tInsert text from file."),NULL,this,ID_INSERT_FILE); new FXMenuCommand(filemenu,tr("Extract to file...\t\tExtract text to file."),NULL,this,ID_EXTRACT_FILE); new FXMenuCommand(filemenu,tr("&Print...\tCtl-P\tPrint document."),getApp()->printicon,this,ID_PRINT); new FXMenuCheck(filemenu,tr("&Editable\t\tDocument editable."),editor,FXText::ID_TOGGLE_EDITABLE); // Recent file menu; this automatically hides if there are no files FXMenuSeparator* sep1=new FXMenuSeparator(filemenu); sep1->setTarget(&mrufiles); sep1->setSelector(FXRecentFiles::ID_ANYFILES); new FXMenuCommand(filemenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_1); new FXMenuCommand(filemenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_2); new FXMenuCommand(filemenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_3); new FXMenuCommand(filemenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_4); new FXMenuCommand(filemenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_5); new FXMenuCommand(filemenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_6); new FXMenuCommand(filemenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_7); new FXMenuCommand(filemenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_8); new FXMenuCommand(filemenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_9); new FXMenuCommand(filemenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_10); new FXMenuCommand(filemenu,tr("&Clear Recent Files"),NULL,&mrufiles,FXRecentFiles::ID_CLEAR); FXMenuSeparator* sep2=new FXMenuSeparator(filemenu); sep2->setTarget(&mrufiles); sep2->setSelector(FXRecentFiles::ID_ANYFILES); new FXMenuCommand(filemenu,tr("&Quit\tCtl-Q"),getApp()->quiticon,getApp(),Adie::ID_CLOSEALL); // Edit Menu entries new FXMenuCommand(editmenu,tr("&Undo\tCtl-Z\tUndo last change."),getApp()->undoicon,&undolist,FXUndoList::ID_UNDO); new FXMenuCommand(editmenu,tr("&Redo\tCtl-Y\tRedo last undo."),getApp()->redoicon,&undolist,FXUndoList::ID_REDO); new FXMenuCommand(editmenu,tr("&Undo all\t\tUndo all."),NULL,&undolist,FXUndoList::ID_UNDO_ALL); new FXMenuCommand(editmenu,tr("&Redo all\t\tRedo all."),NULL,&undolist,FXUndoList::ID_REDO_ALL); new FXMenuCommand(editmenu,tr("&Revert to saved\t\tRevert to saved."),NULL,&undolist,FXUndoList::ID_REVERT); new FXMenuSeparator(editmenu); new FXMenuCommand(editmenu,tr("&Copy\tCtl-C\tCopy selection to clipboard."),getApp()->copyicon,editor,FXText::ID_COPY_SEL); new FXMenuCommand(editmenu,tr("Cu&t\tCtl-X\tCut selection to clipboard."),getApp()->cuticon,editor,FXText::ID_CUT_SEL); new FXMenuCommand(editmenu,tr("&Paste\tCtl-V\tPaste from clipboard."),getApp()->pasteicon,editor,FXText::ID_PASTE_SEL); new FXMenuCommand(editmenu,tr("&Delete\t\tDelete selection."),getApp()->deleteicon,editor,FXText::ID_DELETE_SEL); new FXMenuSeparator(editmenu); new FXMenuCommand(editmenu,tr("Lo&wer-case\tCtl-U\tChange to lower case."),NULL,editor,FXText::ID_LOWER_CASE); new FXMenuCommand(editmenu,tr("Upp&er-case\tCtl-Shift-U\tChange to upper case."),NULL,editor,FXText::ID_UPPER_CASE); new FXMenuCommand(editmenu,tr("Clean indent\t\tClean indentation to either all tabs or all spaces."),NULL,editor,FXText::ID_CLEAN_INDENT); new FXMenuCommand(editmenu,tr("Shift left\tCtl-[\tShift text left."),getApp()->shiftlefticon,editor,FXText::ID_SHIFT_LEFT); new FXMenuCommand(editmenu,tr("Shift right\tCtl-]\tShift text right."),getApp()->shiftrighticon,editor,FXText::ID_SHIFT_RIGHT); new FXMenuCommand(editmenu,tr("Shift tab left\tAlt-[\tShift text left one tab position."),getApp()->shiftlefticon,editor,FXText::ID_SHIFT_TABLEFT); new FXMenuCommand(editmenu,tr("Shift tab right\tAlt-]\tShift text right one tab position."),getApp()->shiftrighticon,editor,FXText::ID_SHIFT_TABRIGHT); // Right mouse popup popupmenu=new FXMenuPane(this); new FXMenuCommand(popupmenu,tr("Undo"),getApp()->undoicon,&undolist,FXUndoList::ID_UNDO); new FXMenuCommand(popupmenu,tr("Redo"),getApp()->redoicon,&undolist,FXUndoList::ID_REDO); new FXMenuSeparator(popupmenu); new FXMenuCommand(popupmenu,tr("Cut"),getApp()->cuticon,editor,FXText::ID_CUT_SEL); new FXMenuCommand(popupmenu,tr("Copy"),getApp()->copyicon,editor,FXText::ID_COPY_SEL); new FXMenuCommand(popupmenu,tr("Paste"),getApp()->pasteicon,editor,FXText::ID_PASTE_SEL); new FXMenuCommand(popupmenu,tr("Select All"),NULL,editor,FXText::ID_SELECT_ALL); new FXMenuSeparator(popupmenu); new FXMenuCommand(popupmenu,tr("Set bookmark"),getApp()->bookseticon,this,ID_SET_MARK); new FXMenuCommand(popupmenu,tr("Next bookmark"),getApp()->booknexticon,this,ID_NEXT_MARK); new FXMenuCommand(popupmenu,tr("Previous bookmark"),getApp()->bookprevicon,this,ID_PREV_MARK); new FXMenuCommand(popupmenu,tr("Clear bookmarks"),getApp()->bookdelicon,this,ID_CLEAR_MARKS); // Goto Menu entries new FXMenuCommand(gotomenu,tr("&Goto...\tCtl-G\tGoto line number."),NULL,editor,FXText::ID_GOTO_LINE); new FXMenuCommand(gotomenu,tr("Goto selected...\tCtl-L\tGoto selected line number."),NULL,editor,FXText::ID_GOTO_SELECTED); new FXMenuSeparator(gotomenu); new FXMenuCommand(gotomenu,tr("Goto {..\tShift-Ctl-{\tGoto start of enclosing block."),NULL,editor,FXText::ID_LEFT_BRACE); new FXMenuCommand(gotomenu,tr("Goto ..}\tShift-Ctl-}\tGoto end of enclosing block."),NULL,editor,FXText::ID_RIGHT_BRACE); new FXMenuCommand(gotomenu,tr("Goto (..\tShift-Ctl-(\tGoto start of enclosing expression."),NULL,editor,FXText::ID_LEFT_PAREN); new FXMenuCommand(gotomenu,tr("Goto ..)\tShift-Ctl-)\tGoto end of enclosing expression."),NULL,editor,FXText::ID_RIGHT_PAREN); new FXMenuSeparator(gotomenu); new FXMenuCommand(gotomenu,tr("Goto matching (..)\tCtl-M\tGoto matching brace or parenthesis."),NULL,editor,FXText::ID_GOTO_MATCHING); new FXMenuSeparator(gotomenu); new FXMenuCommand(gotomenu,tr("&Set bookmark\tAlt-B"),getApp()->bookseticon,this,ID_SET_MARK); new FXMenuCommand(gotomenu,tr("&Next bookmark\tAlt-N"),getApp()->booknexticon,this,ID_NEXT_MARK); new FXMenuCommand(gotomenu,tr("&Previous bookmark\tAlt-P"),getApp()->bookprevicon,this,ID_PREV_MARK); new FXMenuCommand(gotomenu,tr("&Clear bookmarks\tAlt-C"),getApp()->bookdelicon,this,ID_CLEAR_MARKS); // Search Menu entries new FXMenuCommand(searchmenu,tr("Select matching (..)\tShift-Ctl-M\tSelect matching brace or parenthesis."),NULL,editor,FXText::ID_SELECT_MATCHING); new FXMenuCommand(searchmenu,tr("Select block {..}\tShift-Alt-{\tSelect enclosing block."),NULL,editor,FXText::ID_SELECT_BRACE); new FXMenuCommand(searchmenu,tr("Select block {..}\tShift-Alt-}\tSelect enclosing block."),NULL,editor,FXText::ID_SELECT_BRACE); new FXMenuCommand(searchmenu,tr("Select expression (..)\tShift-Alt-(\tSelect enclosing parentheses."),NULL,editor,FXText::ID_SELECT_PAREN); new FXMenuCommand(searchmenu,tr("Select expression (..)\tShift-Alt-)\tSelect enclosing parentheses."),NULL,editor,FXText::ID_SELECT_PAREN); new FXMenuSeparator(searchmenu); new FXMenuCommand(searchmenu,tr("&Search sel. fwd\tCtl-H\tSearch for selection."),getApp()->searchnexticon,editor,FXText::ID_SEARCH_FORW_SEL); new FXMenuCommand(searchmenu,tr("&Search sel. bck\tShift-Ctl-H\tSearch for selection."),getApp()->searchprevicon,editor,FXText::ID_SEARCH_BACK_SEL); //new FXMenuCommand(searchmenu,tr("&Search next fwd\tCtl-G\tSearch forward for next occurrence."),getApp()->searchnexticon,editor,FXText::ID_SEARCH_FORW); //new FXMenuCommand(searchmenu,tr("&Search next bck\tShift-Ctl-G\tSearch backward for next occurrence."),getApp()->searchprevicon,editor,FXText::ID_SEARCH_BACK); new FXMenuCommand(searchmenu,tr("&Search...\tCtl-F\tSearch for a string."),getApp()->searchicon,editor,FXText::ID_SEARCH); new FXMenuCommand(searchmenu,tr("R&eplace...\tCtl-R\tSearch for a string."),NULL,editor,FXText::ID_REPLACE); // Syntax menu syntaxmenu=new FXMenuPane(this); new FXMenuRadio(syntaxmenu,tr("Plain"),this,ID_SYNTAX_FIRST); for(int syn=0; synsyntaxes.no(); syn++){ new FXMenuRadio(syntaxmenu,getApp()->syntaxes[syn]->getName(),this,ID_SYNTAX_FIRST+1+syn); } // Options menu new FXMenuCommand(optionmenu,tr("Preferences...\t\tChange preferences."),NULL,this,ID_PREFERENCES); new FXMenuCommand(optionmenu,tr("Font...\t\tChange text font."),getApp()->fontsicon,this,ID_FONT); new FXMenuCheck(optionmenu,tr("Word wrap\tCtl-K\tToggle word wrap mode."),this,ID_TOGGLE_WRAP); new FXMenuCheck(optionmenu,tr("Overstrike\t\tToggle overstrike mode."),editor,FXText::ID_TOGGLE_OVERSTRIKE); new FXMenuCheck(optionmenu,tr("Syntax coloring\t\tToggle syntax coloring."),this,ID_SYNTAX); new FXMenuCheck(optionmenu,tr("&Jump Scrolling\t\tToggle jump scrolling mode."),this,ID_JUMPSCROLL); new FXMenuCommand(optionmenu,tr("Res&tyle\tCtl-T\tToggle syntax coloring."),NULL,this,ID_RESTYLE); new FXMenuCommand(optionmenu,tr("Include path...\t\tDirectories to search for include files."),NULL,this,ID_INCLUDE_PATH); new FXMenuCascade(optionmenu,tr("&Syntax"),NULL,syntaxmenu); new FXMenuSeparator(optionmenu); new FXMenuCommand(optionmenu,tr("Save Settings\t\tSave settings now."),NULL,this,ID_SAVE_SETTINGS); // View Menu entries new FXMenuCheck(viewmenu,tr("Hidden Files\t\tShow hidden files and directories."),dirlist,FXDirList::ID_TOGGLE_HIDDEN); new FXMenuCheck(viewmenu,tr("File Browser\t\tDisplay file list."),treebox,FXWindow::ID_TOGGLESHOWN); new FXMenuCheck(viewmenu,tr("Toolbar\t\tDisplay toolbar."),toolbar,FXWindow::ID_TOGGLESHOWN); new FXMenuCheck(viewmenu,tr("Status line\t\tDisplay status line."),statusbar,FXWindow::ID_TOGGLESHOWN); new FXMenuCheck(viewmenu,tr("Undo Counters\t\tShow undo/redo counters on status line."),undoredoblock,FXWindow::ID_TOGGLESHOWN); new FXMenuCheck(viewmenu,tr("Clock\t\tShow clock on status line."),clock,FXWindow::ID_TOGGLESHOWN); // Window menu new FXMenuRadio(windowmenu,FXString::null,this,ID_WINDOW_1); new FXMenuRadio(windowmenu,FXString::null,this,ID_WINDOW_2); new FXMenuRadio(windowmenu,FXString::null,this,ID_WINDOW_3); new FXMenuRadio(windowmenu,FXString::null,this,ID_WINDOW_4); new FXMenuRadio(windowmenu,FXString::null,this,ID_WINDOW_5); new FXMenuRadio(windowmenu,FXString::null,this,ID_WINDOW_6); new FXMenuRadio(windowmenu,FXString::null,this,ID_WINDOW_7); new FXMenuRadio(windowmenu,FXString::null,this,ID_WINDOW_8); new FXMenuRadio(windowmenu,FXString::null,this,ID_WINDOW_9); new FXMenuRadio(windowmenu,FXString::null,this,ID_WINDOW_10); // Help Menu entries new FXMenuCommand(helpmenu,tr("&Help...\t\tDisplay help information."),getApp()->helpicon,this,ID_HELP,0); new FXMenuSeparator(helpmenu); new FXMenuCommand(helpmenu,tr("&About Adie...\t\tDisplay about panel."),getApp()->smallicon,this,ID_ABOUT,0); // Add some alternative accelerators if(getAccelTable()){ getAccelTable()->addAccel(MKUINT(KEY_Z,CONTROLMASK|SHIFTMASK),&undolist,FXSEL(SEL_COMMAND,FXUndoList::ID_REDO)); // These were the old bindings; keeping them for now... getAccelTable()->addAccel(MKUINT(KEY_9,CONTROLMASK),editor,FXSEL(SEL_COMMAND,FXText::ID_SHIFT_LEFT)); getAccelTable()->addAccel(MKUINT(KEY_0,CONTROLMASK),editor,FXSEL(SEL_COMMAND,FXText::ID_SHIFT_RIGHT)); } // Initialize bookmarks clearBookmarks(); // Initial setting syntax=NULL; // Recent files mrufiles.setTarget(this); mrufiles.setSelector(ID_OPEN_RECENT); // Initialize file name filename=file; filenameset=FALSE; filetime=0; // Initialize other stuff searchpath="/usr/include"; setPatterns(tr("All Files (*)")); setCurrentPattern(0); currentstyle=-1; colorize=FALSE; stripcr=TRUE; stripsp=FALSE; appendnl=TRUE; saveviews=FALSE; savemarks=FALSE; warnchanged=FALSE; undolist.mark(); } // Create and show window void TextWindow::create(){ readRegistry(); FXMainWindow::create(); dragshell1->create(); dragshell2->create(); filemenu->create(); editmenu->create(); gotomenu->create(); searchmenu->create(); optionmenu->create(); viewmenu->create(); windowmenu->create(); helpmenu->create(); popupmenu->create(); if(!urilistType){urilistType=getApp()->registerDragType(urilistTypeName);} getApp()->addTimeout(this,ID_CLOCKTIME,1); show(PLACEMENT_DEFAULT); editor->setFocus(); // Jump to current directory dirlist->setCurrentFile(FXSystem::getCurrentDirectory()); } // Detach window void TextWindow::detach(){ FXMainWindow::detach(); dragshell1->detach(); dragshell2->detach(); urilistType=0; } // Redraw when style changed void TextWindow::redraw(){ editor->update(); } // Clean up the mess TextWindow::~TextWindow(){ getApp()->windowlist.remove(this); getApp()->removeTimeout(this,ID_CLOCKTIME); delete font; delete dragshell1; delete dragshell2; delete filemenu; delete editmenu; delete gotomenu; delete searchmenu; delete optionmenu; delete viewmenu; delete windowmenu; delete helpmenu; delete popupmenu; delete syntaxmenu; } /*******************************************************************************/ // Is it modified FXbool TextWindow::isModified() const { return !undolist.marked(); } // Set editable flag void TextWindow::setEditable(FXbool edit){ editor->setEditable(edit); } // Is it editable FXbool TextWindow::isEditable() const { return editor->isEditable(); } // Load file FXbool TextWindow::loadFile(const FXString& file){ FXFile textfile(file,FXFile::Reading); FXint size,n,i,j,k,c; FXchar *text; FXTRACE((100,"loadFile(%s)\n",file.text())); // Opened file? if(!textfile.isOpen()){ FXMessageBox::error(this,MBOX_OK,tr("Error Loading File"),tr("Unable to open file: %s"),file.text()); return FALSE; } // Get file size size=textfile.size(); // Make buffer to load file if(!FXMALLOC(&text,FXchar,size)){ FXMessageBox::error(this,MBOX_OK,tr("Error Loading File"),tr("File is too big: %s (%d bytes)"),file.text(),size); return FALSE; } // Set wait cursor getApp()->beginWaitCursor(); // Read the file n=textfile.readBlock(text,size); if(n<0){ FXFREE(&text); FXMessageBox::error(this,MBOX_OK,tr("Error Loading File"),tr("Unable to read file: %s"),file.text()); return FALSE; } // Strip carriage returns if(stripcr){ for(i=j=0; jsetText(text,n); FXFREE(&text); // Kill wait cursor getApp()->endWaitCursor(); // Set stuff setEditable(FXStat::isWritable(file)); dirlist->setCurrentFile(file); mrufiles.appendFile(file); filetime=FXStat::modified(file); filenameset=TRUE; filename=file; // Determine language determineSyntax(); // Clear undo records undolist.clear(); // Mark undo state as clean (saved) undolist.mark(); return TRUE; } // Insert file FXbool TextWindow::insertFile(const FXString& file){ FXint size,n,i,j,k,c; FXchar *text; FILE *fp; FXTRACE((100,"insertFile(%s)\n",file.text())); // Open file fp=fopen(file.text(),"r"); if(!fp){ FXMessageBox::error(this,MBOX_OK,tr("Error Inserting File"),tr("Unable to open file: %s"),file.text()); return FALSE; } // Get file size size=FXStat::size(file); // Make buffer to load file if(!FXMALLOC(&text,FXchar,size)){ FXMessageBox::error(this,MBOX_OK,tr("Error Inserting File"),tr("File is too big: %s (%d bytes)"),file.text(),size); fclose(fp); return FALSE; } // Set wait cursor getApp()->beginWaitCursor(); // Read the file n=fread(text,1,size,fp); // Strip carriage returns if(stripcr){ for(i=j=0; jinsertText(editor->getCursorPos(),text,n,TRUE); FXFREE(&text); // Kill wait cursor getApp()->endWaitCursor(); // Close file fclose(fp); // Set stuff return TRUE; } // Save file FXbool TextWindow::saveFile(const FXString& file){ FXFile textfile(file,FXFile::Writing); FXint size,n; FXchar *text; FXTRACE((100,"saveFile(%s)\n",file.text())); // Opened file? if(!textfile.isOpen()){ FXMessageBox::error(this,MBOX_OK,tr("Error Saving File"),tr("Unable to open file: %s"),file.text()); return FALSE; } // Get size size=editor->getLength(); // Alloc buffer if(!FXMALLOC(&text,FXchar,size+1)){ FXMessageBox::error(this,MBOX_OK,tr("Error Saving File"),tr("File is too big: %s"),file.text()); return FALSE; } // Set wait cursor getApp()->beginWaitCursor(); // Get text from editor editor->getText(text,size); // Append newline? if(appendnl && (0endWaitCursor(); // Were we able to write it all? if(n!=size){ FXMessageBox::error(this,MBOX_OK,tr("Error Saving File"),tr("File: %s truncated."),file.text()); return FALSE; } // Set stuff setEditable(TRUE); dirlist->setCurrentFile(file); mrufiles.appendFile(file); filetime=FXStat::modified(file); filenameset=TRUE; filename=file; undolist.mark(); return TRUE; } // Extract file FXbool TextWindow::extractFile(const FXString& file){ FXFile textfile(file,FXFile::Writing); FXint size,n; FXchar *text; FXTRACE((100,"extractFile(%s)\n",file.text())); // Opened file? if(!textfile.isOpen()){ FXMessageBox::error(this,MBOX_OK,tr("Error Extracting File"),tr("Unable to open file: %s"),file.text()); return FALSE; } // Get size size=editor->getSelEndPos()-editor->getSelStartPos(); // Alloc buffer if(!FXMALLOC(&text,FXchar,size+1)){ FXMessageBox::error(this,MBOX_OK,tr("Error Extracting File"),tr("File is too big: %s"),file.text()); return FALSE; } // Set wait cursor getApp()->beginWaitCursor(); // Get text from editor editor->extractText(text,editor->getSelStartPos(),size); // Translate newlines #ifdef WIN32 fxtoDOS(text,size); #endif // Write the file n=textfile.writeBlock(text,size); // Ditch buffer FXFREE(&text); // Kill wait cursor getApp()->endWaitCursor(); // Were we able to write it all? if(n!=size){ FXMessageBox::error(this,MBOX_OK,tr("Error Extracting File"),tr("File: %s truncated."),file.text()); return FALSE; } return TRUE; } // Generate unique name for a new window FXString TextWindow::unique() const { FXString name="untitled"; for(FXint i=1; i<2147483647; i++){ if(!findWindow(name)) break; name.format("untitled%d",i); } return name; } // Find an as yet untitled, unedited window TextWindow *TextWindow::findUnused() const { for(FXint w=0; wwindowlist.no(); w++){ if(!getApp()->windowlist[w]->isFilenameSet() && !getApp()->windowlist[w]->isModified()){ return getApp()->windowlist[w]; } } return NULL; } // Find window, if any, currently editing the given file TextWindow *TextWindow::findWindow(const FXString& file) const { for(FXint w=0; wwindowlist.no(); w++){ if(getApp()->windowlist[w]->getFilename()==file) return getApp()->windowlist[w]; } return NULL; } // Visit given line void TextWindow::visitLine(FXint line){ FXint pos=editor->nextLine(0,line-1); editor->setCursorPos(pos); editor->setCenterLine(pos); } // Change patterns, each pattern separated by newline void TextWindow::setPatterns(const FXString& patterns){ FXString pat; FXint i; filter->clearItems(); for(i=0; !(pat=patterns.section('\n',i)).empty(); i++){ filter->appendItem(pat); } if(!filter->getNumItems()) filter->appendItem(tr("All Files (*)")); setCurrentPattern(0); } // Return list of patterns FXString TextWindow::getPatterns() const { FXString pat; FXint i; for(i=0; igetNumItems(); i++){ if(!pat.empty()) pat+='\n'; pat+=filter->getItemText(i); } return pat; } // Set current pattern void TextWindow::setCurrentPattern(FXint n){ n=FXCLAMP(0,n,filter->getNumItems()-1); filter->setCurrentItem(n); dirlist->setPattern(FXFileSelector::patternFromText(filter->getItemText(n))); } // Return current pattern FXint TextWindow::getCurrentPattern() const { return filter->getCurrentItem(); } /*******************************************************************************/ // Read settings from registry void TextWindow::readRegistry(){ FXColor textback,textfore,textselback,textselfore,textcursor,texthilitefore,texthiliteback; FXColor dirback,dirfore,dirselback,dirselfore,dirlines,textactiveback,textbar,textnumber; FXint ww,hh,xx,yy,treewidth,hidetree,hiddenfiles,wrapping,wrapcols,fixedwrap,tabcols,showactive,hideundo; FXint autoindent,hardtabs,hideclock,hidestatus,hidetoolbar,hilitematchtime,barcols,jumpscroll; FXString fontspec; // Text colors textback=getApp()->reg().readColorEntry("SETTINGS","textbackground",editor->getBackColor()); textfore=getApp()->reg().readColorEntry("SETTINGS","textforeground",editor->getTextColor()); textselback=getApp()->reg().readColorEntry("SETTINGS","textselbackground",editor->getSelBackColor()); textselfore=getApp()->reg().readColorEntry("SETTINGS","textselforeground",editor->getSelTextColor()); textcursor=getApp()->reg().readColorEntry("SETTINGS","textcursor",editor->getCursorColor()); texthiliteback=getApp()->reg().readColorEntry("SETTINGS","texthilitebackground",editor->getHiliteBackColor()); texthilitefore=getApp()->reg().readColorEntry("SETTINGS","texthiliteforeground",editor->getHiliteTextColor()); textactiveback=getApp()->reg().readColorEntry("SETTINGS","textactivebackground",editor->getActiveBackColor()); textbar=getApp()->reg().readColorEntry("SETTINGS","textnumberbackground",editor->getBarColor()); textnumber=getApp()->reg().readColorEntry("SETTINGS","textnumberforeground",editor->getNumberColor()); // Directory colors dirback=getApp()->reg().readColorEntry("SETTINGS","browserbackground",dirlist->getBackColor()); dirfore=getApp()->reg().readColorEntry("SETTINGS","browserforeground",dirlist->getTextColor()); dirselback=getApp()->reg().readColorEntry("SETTINGS","browserselbackground",dirlist->getSelBackColor()); dirselfore=getApp()->reg().readColorEntry("SETTINGS","browserselforeground",dirlist->getSelTextColor()); dirlines=getApp()->reg().readColorEntry("SETTINGS","browserlines",dirlist->getLineColor()); // Delimiters delimiters=getApp()->reg().readStringEntry("SETTINGS","delimiters","~.,/\\`'!@#$%^&*()-=+{}|[]\":;<>?"); // Font fontspec=getApp()->reg().readStringEntry("SETTINGS","textfont",""); if(!fontspec.empty()){ font=new FXFont(getApp(),fontspec); editor->setFont(font); } // Get size xx=getApp()->reg().readIntEntry("SETTINGS","x",5); yy=getApp()->reg().readIntEntry("SETTINGS","y",5); ww=getApp()->reg().readIntEntry("SETTINGS","width",600); hh=getApp()->reg().readIntEntry("SETTINGS","height",400); // Hidden files shown hiddenfiles=getApp()->reg().readIntEntry("SETTINGS","showhiddenfiles",FALSE); dirlist->showHiddenFiles(hiddenfiles); // Showing undo counters? hideundo=getApp()->reg().readIntEntry("SETTINGS","hideundo",TRUE); // Showing the tree? hidetree=getApp()->reg().readIntEntry("SETTINGS","hidetree",TRUE); // Showing the clock? hideclock=getApp()->reg().readIntEntry("SETTINGS","hideclock",FALSE); // Showing the status line? hidestatus=getApp()->reg().readIntEntry("SETTINGS","hidestatus",FALSE); // Showing the tool bar? hidetoolbar=getApp()->reg().readIntEntry("SETTINGS","hidetoolbar",FALSE); // Highlight match time hilitematchtime=getApp()->reg().readIntEntry("SETTINGS","hilitematchtime",3000); // Width of tree treewidth=getApp()->reg().readIntEntry("SETTINGS","treewidth",100); // Active Background showactive=getApp()->reg().readIntEntry("SETTINGS","showactive",FALSE); // Word wrapping wrapping=getApp()->reg().readIntEntry("SETTINGS","wordwrap",0); wrapcols=getApp()->reg().readIntEntry("SETTINGS","wrapcols",80); fixedwrap=getApp()->reg().readIntEntry("SETTINGS","fixedwrap",1); // Tab settings, autoindent autoindent=getApp()->reg().readIntEntry("SETTINGS","autoindent",0); hardtabs=getApp()->reg().readIntEntry("SETTINGS","hardtabs",1); tabcols=getApp()->reg().readIntEntry("SETTINGS","tabcols",8); // Space for line numbers barcols=getApp()->reg().readIntEntry("SETTINGS","barcols",0); // Various flags stripcr=getApp()->reg().readIntEntry("SETTINGS","stripreturn",FALSE); stripsp=getApp()->reg().readIntEntry("SETTINGS","stripspaces",FALSE); appendnl=getApp()->reg().readIntEntry("SETTINGS","appendnewline",TRUE); saveviews=getApp()->reg().readIntEntry("SETTINGS","saveviews",FALSE); savemarks=getApp()->reg().readIntEntry("SETTINGS","savebookmarks",FALSE); warnchanged=getApp()->reg().readIntEntry("SETTINGS","warnchanged",TRUE); colorize=getApp()->reg().readIntEntry("SETTINGS","colorize",FALSE); jumpscroll=getApp()->reg().readIntEntry("SETTINGS","jumpscroll",FALSE); // File patterns setPatterns(getApp()->reg().readStringEntry("SETTINGS","filepatterns","All Files (*)")); setCurrentPattern(getApp()->reg().readIntEntry("SETTINGS","filepatternno",0)); // Search path searchpath=getApp()->reg().readStringEntry("SETTINGS","searchpath","/usr/include"); // Change the colors editor->setTextColor(textfore); editor->setBackColor(textback); editor->setSelBackColor(textselback); editor->setSelTextColor(textselfore); editor->setCursorColor(textcursor); editor->setHiliteBackColor(texthiliteback); editor->setHiliteTextColor(texthilitefore); editor->setActiveBackColor(textactiveback); editor->setBarColor(textbar); editor->setNumberColor(textnumber); dirlist->setTextColor(dirfore); dirlist->setBackColor(dirback); dirlist->setSelBackColor(dirselback); dirlist->setSelTextColor(dirselfore); dirlist->setLineColor(dirlines); // Change delimiters editor->setDelimiters(delimiters.text()); // Hide tree if asked for if(hidetree) treebox->hide(); // Hide clock if(hideclock) clock->hide(); // Hide statusline if(hidestatus) statusbar->hide(); // Hide toolbar if(hidetoolbar) toolbar->hide(); // Hide undo counters if(hideundo) undoredoblock->hide(); // Set tree width treebox->setWidth(treewidth); // Open toward file // dirlist->setCurrentFile(filename); // Wrap mode if(wrapping) editor->setTextStyle(editor->getTextStyle()|TEXT_WORDWRAP); else editor->setTextStyle(editor->getTextStyle()&~TEXT_WORDWRAP); // Active line color being used if(showactive) editor->setTextStyle(editor->getTextStyle()|TEXT_SHOWACTIVE); else editor->setTextStyle(editor->getTextStyle()&~TEXT_SHOWACTIVE); // Wrap fixed mode if(fixedwrap) editor->setTextStyle(editor->getTextStyle()|TEXT_FIXEDWRAP); else editor->setTextStyle(editor->getTextStyle()&~TEXT_FIXEDWRAP); // Autoindent if(autoindent) editor->setTextStyle(editor->getTextStyle()|TEXT_AUTOINDENT); else editor->setTextStyle(editor->getTextStyle()&~TEXT_AUTOINDENT); // Hard tabs if(hardtabs) editor->setTextStyle(editor->getTextStyle()&~TEXT_NO_TABS); else editor->setTextStyle(editor->getTextStyle()|TEXT_NO_TABS); // Jump Scroll if(jumpscroll) editor->setScrollStyle(editor->getScrollStyle()|SCROLLERS_DONT_TRACK); else editor->setScrollStyle(editor->getScrollStyle()&~SCROLLERS_DONT_TRACK); // Wrap and tab columns editor->setWrapColumns(wrapcols); editor->setTabColumns(tabcols); editor->setBarColumns(barcols); // Highlight match time editor->setHiliteMatchTime(hilitematchtime); // Reposition window position(xx,yy,ww,hh); } /*******************************************************************************/ // Save settings to registry void TextWindow::writeRegistry(){ FXString fontspec; // Colors of text getApp()->reg().writeColorEntry("SETTINGS","textbackground",editor->getBackColor()); getApp()->reg().writeColorEntry("SETTINGS","textforeground",editor->getTextColor()); getApp()->reg().writeColorEntry("SETTINGS","textselbackground",editor->getSelBackColor()); getApp()->reg().writeColorEntry("SETTINGS","textselforeground",editor->getSelTextColor()); getApp()->reg().writeColorEntry("SETTINGS","textcursor",editor->getCursorColor()); getApp()->reg().writeColorEntry("SETTINGS","texthilitebackground",editor->getHiliteBackColor()); getApp()->reg().writeColorEntry("SETTINGS","texthiliteforeground",editor->getHiliteTextColor()); getApp()->reg().writeColorEntry("SETTINGS","textactivebackground",editor->getActiveBackColor()); getApp()->reg().writeColorEntry("SETTINGS","textnumberbackground",editor->getBarColor()); getApp()->reg().writeColorEntry("SETTINGS","textnumberforeground",editor->getNumberColor()); // Colors of directory getApp()->reg().writeColorEntry("SETTINGS","browserbackground",dirlist->getBackColor()); getApp()->reg().writeColorEntry("SETTINGS","browserforeground",dirlist->getTextColor()); getApp()->reg().writeColorEntry("SETTINGS","browserselbackground",dirlist->getSelBackColor()); getApp()->reg().writeColorEntry("SETTINGS","browserselforeground",dirlist->getSelTextColor()); getApp()->reg().writeColorEntry("SETTINGS","browserlines",dirlist->getLineColor()); // Delimiters getApp()->reg().writeStringEntry("SETTINGS","delimiters",delimiters.text()); // Write new window size back to registry getApp()->reg().writeIntEntry("SETTINGS","x",getX()); getApp()->reg().writeIntEntry("SETTINGS","y",getY()); getApp()->reg().writeIntEntry("SETTINGS","width",getWidth()); getApp()->reg().writeIntEntry("SETTINGS","height",getHeight()); // Were showing hidden files getApp()->reg().writeIntEntry("SETTINGS","showhiddenfiles",dirlist->showHiddenFiles()); // Was tree shown getApp()->reg().writeIntEntry("SETTINGS","hidetree",!treebox->shown()); // Was status line shown getApp()->reg().writeIntEntry("SETTINGS","hidestatus",!statusbar->shown()); // Was clock shown getApp()->reg().writeIntEntry("SETTINGS","hideclock",!clock->shown()); // Was toolbar shown getApp()->reg().writeIntEntry("SETTINGS","hidetoolbar",!toolbar->shown()); // Were undo counters shown getApp()->reg().writeIntEntry("SETTINGS","hideundo",!undoredoblock->shown()); // Highlight match time getApp()->reg().writeIntEntry("SETTINGS","hilitematchtime",editor->getHiliteMatchTime()); // Width of tree getApp()->reg().writeIntEntry("SETTINGS","treewidth",treebox->getWidth()); // Wrap mode getApp()->reg().writeIntEntry("SETTINGS","wordwrap",(editor->getTextStyle()&TEXT_WORDWRAP)!=0); getApp()->reg().writeIntEntry("SETTINGS","fixedwrap",(editor->getTextStyle()&TEXT_FIXEDWRAP)!=0); getApp()->reg().writeIntEntry("SETTINGS","wrapcols",editor->getWrapColumns()); // Active background getApp()->reg().writeIntEntry("SETTINGS","showactive",(editor->getTextStyle()&TEXT_SHOWACTIVE)!=0); // Bar columns getApp()->reg().writeIntEntry("SETTINGS","barcols",editor->getBarColumns()); // Tab settings, autoindent getApp()->reg().writeIntEntry("SETTINGS","autoindent",(editor->getTextStyle()&TEXT_AUTOINDENT)!=0); getApp()->reg().writeIntEntry("SETTINGS","hardtabs",(editor->getTextStyle()&TEXT_NO_TABS)==0); getApp()->reg().writeIntEntry("SETTINGS","tabcols",editor->getTabColumns()); // Strip returns getApp()->reg().writeIntEntry("SETTINGS","stripreturn",stripcr); getApp()->reg().writeIntEntry("SETTINGS","stripspaces",stripsp); getApp()->reg().writeIntEntry("SETTINGS","appendnewline",appendnl); getApp()->reg().writeIntEntry("SETTINGS","saveviews",saveviews); getApp()->reg().writeIntEntry("SETTINGS","savebookmarks",savemarks); getApp()->reg().writeIntEntry("SETTINGS","warnchanged",warnchanged); getApp()->reg().writeIntEntry("SETTINGS","colorize",colorize); getApp()->reg().writeIntEntry("SETTINGS","jumpscroll",(editor->getScrollStyle()&SCROLLERS_DONT_TRACK)!=0); // File patterns getApp()->reg().writeIntEntry("SETTINGS","filepatternno",getCurrentPattern()); getApp()->reg().writeStringEntry("SETTINGS","filepatterns",getPatterns().text()); // Search path getApp()->reg().writeStringEntry("SETTINGS","searchpath",searchpath.text()); // Font fontspec=editor->getFont()->getFont(); getApp()->reg().writeStringEntry("SETTINGS","textfont",fontspec.text()); } /*******************************************************************************/ // About box long TextWindow::onCmdAbout(FXObject*,FXSelector,void*){ FXDialogBox about(this,tr("About Adie"),DECOR_TITLE|DECOR_BORDER,0,0,0,0, 0,0,0,0, 0,0); FXGIFIcon picture(getApp(),adie_gif); new FXLabel(&about,FXString::null,&picture,FRAME_GROOVE|LAYOUT_SIDE_LEFT|LAYOUT_CENTER_Y|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y,0,0,0,0, 0,0,0,0); FXVerticalFrame* side=new FXVerticalFrame(&about,LAYOUT_SIDE_RIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 10,10,10,10, 0,0); new FXLabel(side,"A . d . i . e",NULL,JUSTIFY_LEFT|ICON_BEFORE_TEXT|LAYOUT_FILL_X); new FXHorizontalSeparator(side,SEPARATOR_LINE|LAYOUT_FILL_X); new FXLabel(side,FXStringFormat(tr("\nThe Adie ADvanced Interactive Editor, version %d.%d.%d.\n\nAdie is a fast and convenient programming text editor and text\nfile viewer with an integrated file browser.\nAdie uses the FOX Toolkit version %d.%d.%d.\nCopyright (C) 2000,2006 Jeroen van der Zijp (jeroen@fox-toolkit.org).\n "),VERSION_MAJOR,VERSION_MINOR,VERSION_PATCH,FOX_MAJOR,FOX_MINOR,FOX_LEVEL),NULL,JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y); FXButton *button=new FXButton(side,tr("&OK"),NULL,&about,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT,0,0,0,0,32,32,2,2); button->setFocus(); about.execute(PLACEMENT_OWNER); return 1; } // Show help window, create it on-the-fly long TextWindow::onCmdHelp(FXObject*,FXSelector,void*){ HelpWindow *helpwindow=new HelpWindow(getApp()); helpwindow->create(); helpwindow->show(PLACEMENT_CURSOR); return 1; } // Show preferences dialog long TextWindow::onCmdPreferences(FXObject*,FXSelector,void*){ Preferences preferences(this); preferences.setPatterns(getPatterns()); preferences.setSyntax(getSyntax()); if(preferences.execute()){ setPatterns(preferences.getPatterns()); } return 1; } // Change font long TextWindow::onCmdFont(FXObject*,FXSelector,void*){ FXFontDialog fontdlg(this,tr("Change Font"),DECOR_BORDER|DECOR_TITLE); FXFontDesc fontdesc; editor->getFont()->getFontDesc(fontdesc); fontdlg.setFontSelection(fontdesc); if(fontdlg.execute()){ FXFont *oldfont=font; fontdlg.getFontSelection(fontdesc); font=new FXFont(getApp(),fontdesc); font->create(); editor->setFont(font); delete oldfont; } return 1; } /*******************************************************************************/ // Reopen file long TextWindow::onCmdReopen(FXObject*,FXSelector,void*){ if(isModified()){ if(FXMessageBox::question(this,MBOX_YES_NO,tr("Document was changed"),tr("Discard changes to this document?"))==MBOX_CLICKED_NO) return 1; } loadFile(filename); return 1; } // Update reopen file long TextWindow::onUpdReopen(FXObject* sender,FXSelector,void* ptr){ sender->handle(this,isFilenameSet()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),ptr); return 1; } // New long TextWindow::onCmdNew(FXObject*,FXSelector,void*){ TextWindow *window=new TextWindow(getApp(),unique()); window->create(); window->raise(); window->setFocus(); return 1; } // Open long TextWindow::onCmdOpen(FXObject*,FXSelector,void*){ FXFileDialog opendialog(this,tr("Open Document")); opendialog.setSelectMode(SELECTFILE_EXISTING); opendialog.setPatternList(getPatterns()); opendialog.setCurrentPattern(getCurrentPattern()); opendialog.setDirectory(FXPath::directory(filename)); if(opendialog.execute()){ setCurrentPattern(opendialog.getCurrentPattern()); FXString file=opendialog.getFilename(); TextWindow *window=findWindow(file); if(!window){ window=findUnused(); if(!window){ window=new TextWindow(getApp(),unique()); window->create(); } window->loadFile(file); window->readBookmarks(file); window->readView(file); } window->raise(); window->setFocus(); } return 1; } // Open Selected long TextWindow::onCmdOpenSelected(FXObject*,FXSelector,void*){ FXchar name[1024],*data; FXuint len; FXint lineno=0; // Get selection if(getDNDData(FROM_SELECTION,stringType,(FXuchar*&)data,len)){ FXString string(data,len); FXFREE(&data); // Its too big, most likely not a file name if(len<1024){ FXString file=FXString::null; FXString dir=FXSystem::getCurrentDirectory(); // Base off currently loaded file if(!filename.empty()) dir=FXPath::directory(filename); // Strip leading/trailing space string.trim(); // Extract name from #include syntax if(sscanf(string.text(),"#include \"%[^\"]\"",name)==1){ file=FXPath::absolute(dir,name); if(!FXStat::exists(file)){ file=FXPath::search(searchpath,name); } } else if(sscanf(string.text(),"#include <%[^>]>",name)==1){ file=FXPath::absolute(dir,name); if(!FXStat::exists(file)){ file=FXPath::search(searchpath,name); } } // Compiler output in the form :: Error message else if(sscanf(string.text(),"%[^:]:%d:",name,&lineno)==2){ file=FXPath::absolute(dir,name); if(!FXStat::exists(file)){ file=FXPath::absolute(dir,string); } } // Compiler output in the form () : Error message else if(sscanf(string.text(),"%[^(](%d)",name,&lineno)==2){ file=FXPath::absolute(dir,name); if(!FXStat::exists(file)){ file=FXPath::absolute(dir,string); } } // Compiler output in the form "", line : Error message else if(sscanf(string.text(),"\"%[^\"]\", line %d",name,&lineno)==2){ file=FXPath::absolute(dir,name); if(!FXStat::exists(file)){ file=FXPath::absolute(dir,string); } } // Compiler output in the form ... File = , Line = else if(sscanf(string.text(),"%*[^:]: %*s File = %[^,], Line = %d",name,&lineno)==2){ file=FXPath::absolute(dir,name); if(!FXStat::exists(file)){ file=FXPath::absolute(dir,string); } } // Compiler output in the form filename: Other stuff else if(sscanf(string.text(),"%[^:]:",name)==1){ file=FXPath::absolute(dir,name); if(!FXStat::exists(file)){ file=FXPath::absolute(dir,string); } } // Try whole selection else{ file=FXPath::absolute(dir,string); } // Not a file name if(FXStat::exists(file)){ // File loaded already? TextWindow *window=findWindow(file); if(!window){ window=findUnused(); if(!window){ window=new TextWindow(getApp(),unique()); window->create(); } window->loadFile(file); window->readBookmarks(file); } // Switch line number only if(lineno){ window->visitLine(lineno); } // Bring up the window window->raise(); window->setFocus(); return 1; } } getApp()->beep(); } return 1; } // Open recent file long TextWindow::onCmdOpenRecent(FXObject*,FXSelector,void* ptr){ FXString file=(const char*)ptr; TextWindow *window=findWindow(file); if(!window){ window=findUnused(); if(!window){ window=new TextWindow(getApp(),unique()); window->create(); } window->loadFile(file); window->readBookmarks(file); window->readView(file); } window->raise(); window->setFocus(); return 1; } // Command from the tree list long TextWindow::onCmdOpenTree(FXObject*,FXSelector,void* ptr){ FXTreeItem *item=(FXTreeItem*)ptr; FXString file; if(!item || !dirlist->isItemFile(item)) return 1; if(!saveChanges()) return 1; file=dirlist->getItemPathname(item); loadFile(file); readBookmarks(file); readView(file); return 1; } // See if we can get it as a filename long TextWindow::onEditDNDDrop(FXObject*,FXSelector,void*){ FXchar *data; FXuint len; if(getDNDData(FROM_DRAGNDROP,urilistType,(FXuchar*&)data,len)){ FXString urilist(data,len); FXString file=FXURL::fileFromURL(urilist.before('\r')); FXFREE(&data); if(file.empty()) return 1; if(!saveChanges()) return 1; loadFile(file); readBookmarks(file); readView(file); return 1; } return 0; } // See if a filename is being dragged over the window long TextWindow::onEditDNDMotion(FXObject*,FXSelector,void*){ if(offeredDNDType(FROM_DRAGNDROP,urilistType)){ acceptDrop(DRAG_COPY); return 1; } return 0; } // Insert file into buffer long TextWindow::onCmdInsertFile(FXObject*,FXSelector,void*){ FXString file; FXFileDialog opendialog(this,tr("Open Document")); opendialog.setSelectMode(SELECTFILE_EXISTING); opendialog.setPatternList(getPatterns()); opendialog.setCurrentPattern(getCurrentPattern()); opendialog.setDirectory(FXPath::directory(filename)); if(opendialog.execute()){ setCurrentPattern(opendialog.getCurrentPattern()); file=opendialog.getFilename(); insertFile(file); } return 1; } // Update insert file long TextWindow::onUpdInsertFile(FXObject* sender,FXSelector,void*){ sender->handle(this,editor->isEditable()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Extract selection to file long TextWindow::onCmdExtractFile(FXObject*,FXSelector,void*){ FXFileDialog savedialog(this,tr("Save Document")); FXString file="untitled"; savedialog.setSelectMode(SELECTFILE_ANY); savedialog.setPatternList(getPatterns()); savedialog.setCurrentPattern(getCurrentPattern()); savedialog.setDirectory(FXPath::directory(filename)); savedialog.setFilename(file); if(savedialog.execute()){ setCurrentPattern(savedialog.getCurrentPattern()); file=savedialog.getFilename(); if(FXStat::exists(file)){ if(MBOX_CLICKED_NO==FXMessageBox::question(this,MBOX_YES_NO,tr("Overwrite Document"),tr("Overwrite existing document: %s?"),file.text())) return 1; } extractFile(file); } return 1; } // Update extract file long TextWindow::onUpdExtractFile(FXObject* sender,FXSelector,void*){ sender->handle(this,editor->hasSelection()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Save changes, prompt for new filename FXbool TextWindow::saveChanges(){ FXuint answer; FXString file; writeBookmarks(filename); writeView(filename); if(isModified()){ answer=FXMessageBox::question(this,MBOX_YES_NO_CANCEL,tr("Unsaved Document"),tr("Save %s to file?"),FXPath::name(filename).text()); if(answer==MBOX_CLICKED_CANCEL) return FALSE; if(answer==MBOX_CLICKED_YES){ file=filename; if(!filenameset){ FXFileDialog savedialog(this,tr("Save Document")); savedialog.setSelectMode(SELECTFILE_ANY); savedialog.setPatternList(getPatterns()); savedialog.setCurrentPattern(getCurrentPattern()); savedialog.setFilename(file); if(!savedialog.execute()) return FALSE; setCurrentPattern(savedialog.getCurrentPattern()); file=savedialog.getFilename(); if(FXStat::exists(file)){ if(MBOX_CLICKED_NO==FXMessageBox::question(this,MBOX_YES_NO,tr("Overwrite Document"),tr("Overwrite existing document: %s?"),file.text())) return FALSE; } } saveFile(file); } } return TRUE; } // Save long TextWindow::onCmdSave(FXObject* sender,FXSelector sel,void* ptr){ if(!filenameset) return onCmdSaveAs(sender,sel,ptr); saveFile(filename); return 1; } // Save Update long TextWindow::onUpdSave(FXObject* sender,FXSelector,void*){ sender->handle(this,isModified()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Save As long TextWindow::onCmdSaveAs(FXObject*,FXSelector,void*){ FXFileDialog savedialog(this,tr("Save Document")); FXString file=filename; savedialog.setSelectMode(SELECTFILE_ANY); savedialog.setPatternList(getPatterns()); savedialog.setCurrentPattern(getCurrentPattern()); savedialog.setFilename(file); if(savedialog.execute()){ setCurrentPattern(savedialog.getCurrentPattern()); file=savedialog.getFilename(); if(FXStat::exists(file)){ if(MBOX_CLICKED_NO==FXMessageBox::question(this,MBOX_YES_NO,tr("Overwrite Document"),tr("Overwrite existing document: %s?"),file.text())) return 1; } saveFile(file); } return 1; } // Close window FXbool TextWindow::close(FXbool notify){ // Prompt to save changes if(!saveChanges()) return FALSE; // Save settings writeRegistry(); // Perform normal close stuff return FXMainWindow::close(notify); } // User clicks on one of the window menus long TextWindow::onCmdWindow(FXObject*,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_WINDOW_1; if(whichwindowlist.no()){ getApp()->windowlist[which]->raise(); getApp()->windowlist[which]->setFocus(); } return 1; } // Update handler for window menus long TextWindow::onUpdWindow(FXObject *sender,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_WINDOW_1; if(whichwindowlist.no()){ TextWindow *window=getApp()->windowlist[which]; FXString string; if(which<9) string.format("&%d %s",which+1,window->getTitle().text()); else string.format("1&0 %s",window->getTitle().text()); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE),(void*)&string); if(window==getApp()->getActiveWindow()) sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_UNCHECK),NULL); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SHOW),NULL); } else{ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_HIDE),NULL); } return 1; } // Update title from current filename long TextWindow::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ FXMainWindow::onUpdate(sender,sel,ptr); FXString title=FXPath::name(getFilename()); if(isModified()) title+=tr(" (changed)"); FXString directory=FXPath::directory(getFilename()); if(!directory.empty()) title+=" - " + directory; setTitle(title); return 1; } // Print the text long TextWindow::onCmdPrint(FXObject*,FXSelector,void*){ FXPrintDialog dlg(this,tr("Print File")); FXPrinter printer; if(dlg.execute()){ dlg.getPrinter(printer); FXTRACE((100,"Printer = %s\n",printer.name.text())); } return 1; } /*******************************************************************************/ // Save settings long TextWindow::onCmdSaveSettings(FXObject*,FXSelector,void*){ writeRegistry(); getApp()->reg().write(); return 1; } // Toggle wrap mode long TextWindow::onCmdWrap(FXObject*,FXSelector,void*){ editor->setTextStyle(editor->getTextStyle()^TEXT_WORDWRAP); return 1; } // Update toggle wrap mode long TextWindow::onUpdWrap(FXObject* sender,FXSelector,void*){ if(editor->getTextStyle()&TEXT_WORDWRAP) sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Toggle fixed wrap mode long TextWindow::onCmdWrapFixed(FXObject*,FXSelector,void*){ editor->setTextStyle(editor->getTextStyle()^TEXT_FIXEDWRAP); return 1; } // Update toggle fixed wrap mode long TextWindow::onUpdWrapFixed(FXObject* sender,FXSelector,void*){ if(editor->getTextStyle()&TEXT_FIXEDWRAP) sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Toggle show active background mode long TextWindow::onCmdShowActive(FXObject*,FXSelector,void*){ editor->setTextStyle(editor->getTextStyle()^TEXT_SHOWACTIVE); return 1; } // Update show active background mode long TextWindow::onUpdShowActive(FXObject* sender,FXSelector,void*){ if(editor->getTextStyle()&TEXT_SHOWACTIVE) sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Toggle strip returns mode long TextWindow::onCmdStripReturns(FXObject*,FXSelector,void* ptr){ stripcr=(FXbool)(FXuval)ptr; return 1; } // Update toggle strip returns mode long TextWindow::onUpdStripReturns(FXObject* sender,FXSelector,void*){ if(stripcr) sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Enable warning if file changed externally long TextWindow::onCmdWarnChanged(FXObject*,FXSelector,void* ptr){ warnchanged=(FXbool)(FXuval)ptr; return 1; } // Update check button for warning long TextWindow::onUpdWarnChanged(FXObject* sender,FXSelector,void*){ if(warnchanged) sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Toggle strip spaces mode long TextWindow::onCmdStripSpaces(FXObject*,FXSelector,void* ptr){ stripsp=(FXbool)(FXuval)ptr; return 1; } // Update toggle strip spaces mode long TextWindow::onUpdStripSpaces(FXObject* sender,FXSelector,void*){ if(stripsp) sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Toggle append newline mode long TextWindow::onCmdAppendNewline(FXObject*,FXSelector,void* ptr){ appendnl=(FXbool)(FXuval)ptr; return 1; } // Update toggle append newline mode long TextWindow::onUpdAppendNewline(FXObject* sender,FXSelector,void*){ if(appendnl) sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Change tab columns long TextWindow::onCmdTabColumns(FXObject* sender,FXSelector,void*){ FXint tabs; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&tabs); editor->setTabColumns(tabs); return 1; } // Update tab columns long TextWindow::onUpdTabColumns(FXObject* sender,FXSelector,void*){ FXint tabs=editor->getTabColumns(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&tabs); return 1; } // Change wrap columns long TextWindow::onCmdWrapColumns(FXObject* sender,FXSelector,void*){ FXint wrap; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&wrap); editor->setWrapColumns(wrap); return 1; } // Update wrap columns long TextWindow::onUpdWrapColumns(FXObject* sender,FXSelector,void*){ FXint wrap=editor->getWrapColumns(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&wrap); return 1; } // Change line number columna long TextWindow::onCmdLineNumbers(FXObject* sender,FXSelector,void*){ FXint cols; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&cols); editor->setBarColumns(cols); return 1; } // Update line number columna long TextWindow::onUpdLineNumbers(FXObject* sender,FXSelector,void*){ FXint cols=editor->getBarColumns(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&cols); return 1; } // Toggle insertion of tabs long TextWindow::onCmdInsertTabs(FXObject*,FXSelector,void*){ editor->setTextStyle(editor->getTextStyle()^TEXT_NO_TABS); return 1; } // Update insertion of tabs long TextWindow::onUpdInsertTabs(FXObject* sender,FXSelector,void*){ sender->handle(this,(editor->getTextStyle()&TEXT_NO_TABS)?FXSEL(SEL_COMMAND,ID_UNCHECK):FXSEL(SEL_COMMAND,ID_CHECK),NULL); return 1; } // Toggle autoindent long TextWindow::onCmdAutoIndent(FXObject*,FXSelector,void*){ editor->setTextStyle(editor->getTextStyle()^TEXT_AUTOINDENT); return 1; } // Update autoindent long TextWindow::onUpdAutoIndent(FXObject* sender,FXSelector,void*){ sender->handle(this,(editor->getTextStyle()&TEXT_AUTOINDENT)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Set brace match time long TextWindow::onCmdBraceMatch(FXObject* sender,FXSelector,void*){ FXuint value; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&value); editor->setHiliteMatchTime(value); return 1; } // Update brace match time long TextWindow::onUpdBraceMatch(FXObject* sender,FXSelector,void*){ FXuint value=editor->getHiliteMatchTime(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&value); return 1; } // Change word delimiters long TextWindow::onCmdDelimiters(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_GETSTRINGVALUE),(void*)&delimiters); editor->setDelimiters(delimiters.text()); return 1; } // Update word delimiters long TextWindow::onUpdDelimiters(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&delimiters); return 1; } // Update box for overstrike mode display long TextWindow::onUpdOverstrike(FXObject* sender,FXSelector,void*){ FXString mode((editor->getTextStyle()&TEXT_OVERSTRIKE)?"OVR":"INS"); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&mode); return 1; } // Update box for readonly display long TextWindow::onUpdReadOnly(FXObject* sender,FXSelector,void*){ FXString rw((editor->getTextStyle()&TEXT_READONLY)?"RO":"RW"); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&rw); return 1; } // Update box for size display long TextWindow::onUpdNumRows(FXObject* sender,FXSelector,void*){ FXuint size=editor->getNumRows(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&size); return 1; } // Set TextWindow path long TextWindow::onCmdIncludePaths(FXObject*,FXSelector,void*){ FXInputDialog::getString(searchpath,this,tr("Change include file search path"),tr("Specify a list of directories separated by a `" PATHLISTSEPSTRING "' where include files are to be found.\nFor example:\n\n /usr/include" PATHLISTSEPSTRING "/usr/local/include\n\nThis list will be used to locate the selected file name.")); return 1; } // Set scroll wheel lines (Mathew Robertson ) long TextWindow::onCmdWheelAdjust(FXObject* sender,FXSelector,void*){ FXuint value; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&value); getApp()->setWheelLines(value); return 1; } // Update brace match time long TextWindow::onUpdWheelAdjust(FXObject* sender,FXSelector,void*){ FXuint value=getApp()->getWheelLines(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&value); return 1; } /*******************************************************************************/ // Change text color long TextWindow::onCmdTextForeColor(FXObject*,FXSelector,void* ptr){ editor->setTextColor((FXColor)(FXuval)ptr); return 1; } // Update text color long TextWindow::onUpdTextForeColor(FXObject* sender,FXSelector,void*){ FXColor color=editor->getTextColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change text background color long TextWindow::onCmdTextBackColor(FXObject*,FXSelector,void* ptr){ editor->setBackColor((FXColor)(FXuval)ptr); return 1; } // Update background color long TextWindow::onUpdTextBackColor(FXObject* sender,FXSelector,void*){ FXColor color=editor->getBackColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change selected text foreground color long TextWindow::onCmdTextSelForeColor(FXObject*,FXSelector,void* ptr){ editor->setSelTextColor((FXColor)(FXuval)ptr); return 1; } // Update selected text foregoround color long TextWindow::onUpdTextSelForeColor(FXObject* sender,FXSelector,void*){ FXColor color=editor->getSelTextColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change selected text background color long TextWindow::onCmdTextSelBackColor(FXObject*,FXSelector,void* ptr){ editor->setSelBackColor((FXColor)(FXuval)ptr); return 1; } // Update selected text background color long TextWindow::onUpdTextSelBackColor(FXObject* sender,FXSelector,void*){ FXColor color=editor->getSelBackColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change hilight text color long TextWindow::onCmdTextHiliteForeColor(FXObject*,FXSelector,void* ptr){ editor->setHiliteTextColor((FXColor)(FXuval)ptr); return 1; } // Update hilight text color long TextWindow::onUpdTextHiliteForeColor(FXObject* sender,FXSelector,void*){ FXColor color=editor->getHiliteTextColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change hilight text background color long TextWindow::onCmdTextHiliteBackColor(FXObject*,FXSelector,void* ptr){ editor->setHiliteBackColor((FXColor)(FXuval)ptr); return 1; } // Update hilight text background color long TextWindow::onUpdTextHiliteBackColor(FXObject* sender,FXSelector,void*){ FXColor color=editor->getHiliteBackColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change active text background color long TextWindow::onCmdTextActBackColor(FXObject*,FXSelector,void* ptr){ editor->setActiveBackColor((FXColor)(FXuval)ptr); return 1; } // Update active text background color long TextWindow::onUpdTextActBackColor(FXObject* sender,FXSelector,void*){ FXColor color=editor->getActiveBackColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change cursor color long TextWindow::onCmdTextCursorColor(FXObject*,FXSelector,void* ptr){ editor->setCursorColor((FXColor)(FXuval)ptr); return 1; } // Update cursor color long TextWindow::onUpdTextCursorColor(FXObject* sender,FXSelector,void*){ FXColor color=editor->getCursorColor(); sender->handle(sender,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),(void*)&color); return 1; } // Change line numbers background color long TextWindow::onCmdTextBarColor(FXObject*,FXSelector,void* ptr){ editor->setBarColor((FXColor)(FXuval)ptr); return 1; } // Update line numbers background color long TextWindow::onUpdTextBarColor(FXObject* sender,FXSelector,void*){ FXColor color=editor->getBarColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change line numbers color long TextWindow::onCmdTextNumberColor(FXObject*,FXSelector,void* ptr){ editor->setNumberColor((FXColor)(FXuval)ptr); return 1; } // Update line numbers color long TextWindow::onUpdTextNumberColor(FXObject* sender,FXSelector,void*){ FXColor color=editor->getNumberColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change both tree background color long TextWindow::onCmdDirBackColor(FXObject*,FXSelector,void* ptr){ dirlist->setBackColor((FXColor)(FXuval)ptr); return 1; } // Update background color long TextWindow::onUpdDirBackColor(FXObject* sender,FXSelector,void*){ FXColor color=dirlist->getBackColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change both text and tree selected background color long TextWindow::onCmdDirSelBackColor(FXObject*,FXSelector,void* ptr){ dirlist->setSelBackColor((FXColor)(FXuval)ptr); return 1; } // Update selected background color long TextWindow::onUpdDirSelBackColor(FXObject* sender,FXSelector,void*){ FXColor color=dirlist->getSelBackColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change both text and tree text color long TextWindow::onCmdDirForeColor(FXObject*,FXSelector,void* ptr){ dirlist->setTextColor((FXColor)(FXuval)ptr); return 1; } // Forward GUI update to text widget long TextWindow::onUpdDirForeColor(FXObject* sender,FXSelector,void*){ FXColor color=dirlist->getTextColor(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change both text and tree long TextWindow::onCmdDirSelForeColor(FXObject*,FXSelector,void* ptr){ dirlist->setSelTextColor((FXColor)(FXuval)ptr); return 1; } // Forward GUI update to text widget long TextWindow::onUpdDirSelForeColor(FXObject* sender,FXSelector,void*){ FXColor color=dirlist->getSelTextColor(); sender->handle(sender,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change both text and tree long TextWindow::onCmdDirLineColor(FXObject*,FXSelector,void* ptr){ dirlist->setLineColor((FXColor)(FXuval)ptr); return 1; } // Forward GUI update to text widget long TextWindow::onUpdDirLineColor(FXObject* sender,FXSelector,void*){ FXColor color=dirlist->getLineColor(); sender->handle(sender,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); return 1; } // Change jump scrolling mode long TextWindow::onCmdJumpScroll(FXObject*,FXSelector,void*){ editor->setScrollStyle(editor->getScrollStyle()^SCROLLERS_DONT_TRACK); return 1; } // Update change jump scrolling mode long TextWindow::onUpdJumpScroll(FXObject* sender,FXSelector,void*){ sender->handle(this,(editor->getScrollStyle()&SCROLLERS_DONT_TRACK)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Change the pattern long TextWindow::onCmdFilter(FXObject*,FXSelector,void* ptr){ dirlist->setPattern(FXFileSelector::patternFromText((FXchar*)ptr)); dirlist->makeItemVisible(dirlist->getCurrentItem()); return 1; } /*******************************************************************************/ // Text inserted; callback has [pos nins] long TextWindow::onTextInserted(FXObject*,FXSelector,void* ptr){ const FXTextChange *change=(const FXTextChange*)ptr; FXTRACE((140,"Inserted: pos=%d ndel=%d nins=%d\n",change->pos,change->ndel,change->nins)); // Log undo record if(!undolist.busy()){ undolist.add(new FXTextInsert(editor,change->pos,change->nins,change->ins)); if(undolist.size()>MAXUNDOSIZE) undolist.trimSize(KEEPUNDOSIZE); } // Update bookmark locations updateBookmarks(change->pos,change->ndel,change->nins); // Restyle text restyleText(change->pos,change->ndel,change->nins); return 1; } // Text deleted; callback has [pos ndel] long TextWindow::onTextDeleted(FXObject*,FXSelector,void* ptr){ const FXTextChange *change=(const FXTextChange*)ptr; FXTRACE((140,"Deleted: pos=%d ndel=%d nins=%d\n",change->pos,change->ndel,change->nins)); // Log undo record if(!undolist.busy()){ undolist.add(new FXTextDelete(editor,change->pos,change->ndel,change->del)); if(undolist.size()>MAXUNDOSIZE) undolist.trimSize(KEEPUNDOSIZE); } // Update bookmark locations updateBookmarks(change->pos,change->ndel,change->nins); // Restyle text restyleText(change->pos,change->ndel,change->nins); return 1; } // Text replaced; callback has [pos ndel nins] long TextWindow::onTextReplaced(FXObject*,FXSelector,void* ptr){ const FXTextChange *change=(const FXTextChange*)ptr; FXTRACE((140,"Replaced: pos=%d ndel=%d nins=%d\n",change->pos,change->ndel,change->nins)); // Log undo record if(!undolist.busy()){ undolist.add(new FXTextReplace(editor,change->pos,change->ndel,change->nins,change->del,change->ins)); if(undolist.size()>MAXUNDOSIZE) undolist.trimSize(KEEPUNDOSIZE); } // Update bookmark locations updateBookmarks(change->pos,change->ndel,change->nins); // Restyle text restyleText(change->pos,change->ndel,change->nins); return 1; } // Text cursor pos changed long TextWindow::onTextChanged(FXObject*,FXSelector,void* ptr){ FXTRACE((1,"onTextChanged cursorpos=%d\n",(FXint)(FXival)ptr)); return 1; } // Released right button long TextWindow::onTextRightMouse(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(!event->moved){ popupmenu->popup(NULL,event->root_x,event->root_y); getApp()->runModalWhileShown(popupmenu); } return 1; } /*******************************************************************************/ // Check file when focus moves in long TextWindow::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ register FXTime t; FXMainWindow::onFocusIn(sender,sel,ptr); if(warnchanged && filetime!=0){ t=FXStat::modified(filename); if(t && t!=filetime){ filetime=t; if(MBOX_CLICKED_OK==FXMessageBox::warning(this,MBOX_OK_CANCEL,tr("File Was Changed"),tr("%s\nwas changed by another program. Reload this file from disk?"),filename.text())){ FXint top=editor->getTopLine(); FXint pos=editor->getCursorPos(); loadFile(filename); editor->setTopLine(top); editor->setCursorPos(pos); } } } return 1; } // Update clock long TextWindow::onClock(FXObject*,FXSelector,void*){ FXTime current=FXSystem::now(); clock->setText(FXSystem::time("%H:%M:%S",current)); clock->setTipText(FXSystem::time("%A %B %d %Y",current)); getApp()->addTimeout(this,ID_CLOCKTIME,CLOCKTIMER); return 0; } /*******************************************************************************/ // Next bookmarked place long TextWindow::onCmdNextMark(FXObject*,FXSelector,void*){ register FXint b; if(bookmark[0]){ FXint pos=editor->getCursorPos(); for(b=0; b<=9; b++){ if(bookmark[b]==0) break; if(bookmark[b]>pos){ gotoBookmark(b); break; } } } return 1; } // Sensitize if bookmark beyond cursor pos long TextWindow::onUpdNextMark(FXObject* sender,FXSelector,void*){ register FXint b; if(bookmark[0]){ FXint pos=editor->getCursorPos(); for(b=0; b<=9; b++){ if(bookmark[b]==0) break; if(bookmark[b]>pos){ sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } } } sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Previous bookmarked place long TextWindow::onCmdPrevMark(FXObject*,FXSelector,void*){ register FXint b; if(bookmark[0]){ FXint pos=editor->getCursorPos(); for(b=9; 0<=b; b--){ if(bookmark[b]==0) continue; if(bookmark[b]getCursorPos(); for(b=9; 0<=b; b--){ if(bookmark[b]==0) continue; if(bookmark[b]handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } } } sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Set bookmark long TextWindow::onCmdSetMark(FXObject*,FXSelector,void*){ setBookmark(editor->getCursorPos()); return 1; } // Update set bookmark long TextWindow::onUpdSetMark(FXObject* sender,FXSelector,void*){ sender->handle(this,(bookmark[9]==0)?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Clear bookmarks long TextWindow::onCmdClearMarks(FXObject*,FXSelector,void*){ clearBookmarks(); return 1; } // Add bookmark at current cursor position; we force the cursor // position to be somewhere in the currently visible text. void TextWindow::setBookmark(FXint pos){ register FXint b; if(!bookmark[9]){ for(b=9; 0pos); b--){ bookmark[b]=bookmark[b-1]; } bookmark[b]=pos; } } // Update bookmarks upon a text mutation, deleting the bookmark // if it was inside the deleted text and moving its position otherwise void TextWindow::updateBookmarks(FXint pos,FXint nd,FXint ni){ register FXint delta=ni-nd,i,j,p; for(i=j=0; j<=9; j++){ p=bookmark[j]; bookmark[j]=0; if(pos+nd<=p) bookmark[i++]=p+delta; else if(p<=pos) bookmark[i++]=p; } } // Goto bookmark void TextWindow::gotoBookmark(FXint b){ register FXint p=bookmark[b]; if(p){ if(!editor->isPosVisible(p)){ editor->setCenterLine(p); } editor->setCursorPos(p); } } // Clear bookmarks void TextWindow::clearBookmarks(){ memset(bookmark,0,sizeof(bookmark)); } // Read bookmarks associated with file void TextWindow::readBookmarks(const FXString& file){ const FXchar *marks=getApp()->reg().readStringEntry("BOOKMARKS",FXPath::name(file).text(),"0,0,0,0,0,0,0,0,0,0"); sscanf(marks,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&bookmark[0],&bookmark[1],&bookmark[2],&bookmark[3],&bookmark[4],&bookmark[5],&bookmark[6],&bookmark[7],&bookmark[8],&bookmark[9]); } // Write bookmarks associated with file, if any were set void TextWindow::writeBookmarks(const FXString& file){ if(savemarks){ if(bookmark[0] || bookmark[1] || bookmark[2] || bookmark[3] || bookmark[4] || bookmark[5] || bookmark[6] || bookmark[7] || bookmark[8] || bookmark[9]){ FXchar marks[1000]; sprintf(marks,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",bookmark[0],bookmark[1],bookmark[2],bookmark[3],bookmark[4],bookmark[5],bookmark[6],bookmark[7],bookmark[8],bookmark[9]); getApp()->reg().writeStringEntry("BOOKMARKS",FXPath::name(file).text(),marks); } else{ getApp()->reg().deleteEntry("BOOKMARKS",FXPath::name(file).text()); } } } // Toggle saving of bookmarks long TextWindow::onCmdSaveMarks(FXObject*,FXSelector,void*){ savemarks=!savemarks; if(!savemarks) getApp()->reg().deleteSection("BOOKMARKS"); return 1; } // Update saving bookmarks long TextWindow::onUpdSaveMarks(FXObject* sender,FXSelector,void*){ sender->handle(this,savemarks?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Toggle saving of views long TextWindow::onCmdSaveViews(FXObject*,FXSelector,void*){ saveviews=!saveviews; if(!saveviews) getApp()->reg().deleteSection("VIEW"); return 1; } // Update saving views long TextWindow::onUpdSaveViews(FXObject* sender,FXSelector,void*){ sender->handle(this,saveviews?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Read view of the file void TextWindow::readView(const FXString& file){ editor->setTopLine(getApp()->reg().readIntEntry("VIEW",FXPath::name(file).text(),0)); } // Write current view of the file void TextWindow::writeView(const FXString& file){ if(saveviews){ if(editor->getTopLine()){ getApp()->reg().writeIntEntry("VIEW",FXPath::name(file).text(),editor->getTopLine()); } else{ getApp()->reg().deleteEntry("VIEW",FXPath::name(file).text()); } } } /*******************************************************************************/ // Determine language void TextWindow::determineSyntax(){ register FXint syn; FXTRACE((1,"Determine Language for window %s\n",filename.text())); // Get filename part of pathname FXString file=FXPath::name(filename); // First, try match based on file extension for(syn=0; synsyntaxes.no(); syn++){ if(getApp()->syntaxes[syn]->matchFilename(file)){ FXTRACE((1,"language %s matched wildcard\n",getApp()->syntaxes[syn]->getName().text())); setSyntax(getApp()->syntaxes[syn]); return; } } // Get the first part of contents FXString text('\0',FXMIN(editor->getLength(),512)); editor->extractText(&text[0],0,text.length()); // And try to match based on contents for(syn=0; synsyntaxes.no(); syn++){ if(getApp()->syntaxes[syn]->matchContents(text)){ FXTRACE((1,"language %s matched contents\n",getApp()->syntaxes[syn]->getName().text())); setSyntax(getApp()->syntaxes[syn]); return; } } // Back to plain text mode setSyntax(NULL); } // Set syntax by name FXbool TextWindow::forceSyntax(const FXString& language){ register FXint syn; for(syn=0; synsyntaxes.no(); syn++){ if(getApp()->syntaxes[syn]->getName()==language){ setSyntax(getApp()->syntaxes[syn]); return TRUE; } } return FALSE; } // Change style colors void TextWindow::setStyleColors(FXint index,const FXHiliteStyle& style){ styles[index]=style; editor->update(); } // Switch syntax long TextWindow::onCmdSyntaxSwitch(FXObject*,FXSelector sel,void*){ FXint syn=FXSELID(sel)-ID_SYNTAX_FIRST; FXASSERT(0<=syn && syn<=getApp()->syntaxes.no()); setSyntax(syn?getApp()->syntaxes[syn-1]:NULL); return 1; } // Switch syntax long TextWindow::onUpdSyntaxSwitch(FXObject* sender,FXSelector sel,void*){ FXint syn=FXSELID(sel)-ID_SYNTAX_FIRST; FXASSERT(0<=syn && syn<=getApp()->syntaxes.no()); FXSyntax *sntx=syn?getApp()->syntaxes[syn-1]:NULL; sender->handle(this,(sntx==syntax)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Change style index long TextWindow::onCmdStyleIndex(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)¤tstyle); return 1; } // Update style index long TextWindow::onUpdStyleIndex(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)¤tstyle); return 1; } // Change style flags long TextWindow::onCmdStyleFlags(FXObject*,FXSelector sel,void*){ if(0<=currentstyle && currentstylehandle(this,bit?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); } else{ sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); } return 1; } // Change style color long TextWindow::onCmdStyleColor(FXObject*,FXSelector sel,void* ptr){ if(0<=currentstyle && currentstylegetRule(currentstyle+1)->getName(),styles[currentstyle]); setStyleColors(currentstyle,styles[currentstyle]); } return 1; } // Update style color long TextWindow::onUpdStyleColor(FXObject* sender,FXSelector sel,void*){ FXColor color=0; if(0<=currentstyle && currentstylehandle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); } else{ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&color); sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); } return 1; } // Set language void TextWindow::setSyntax(FXSyntax* syn){ register FXint rule; syntax=syn; if(syntax){ editor->setDelimiters(syntax->getDelimiters().text()); styles.no(syntax->getNumRules()-1); for(rule=1; rulegetNumRules(); rule++){ styles[rule-1]=readStyleForRule(syntax->getRule(rule)->getName()); } editor->setHiliteStyles(styles.data()); editor->setStyled(colorize); restyleText(); currentstyle=0; } else{ editor->setDelimiters(FXText::textDelimiters); editor->setHiliteStyles(NULL); editor->setStyled(FALSE); currentstyle=-1; } } // Restyle entire text void TextWindow::restyleText(){ FXchar *text,*style; FXint head,tail,len; if(colorize && syntax){ len=editor->getLength(); FXMALLOC(&text,FXchar,len+len); style=text+len; editor->extractText(text,0,len); syntax->getRule(0)->stylize(text,style,0,len,head,tail); editor->changeStyle(0,style,len); FXFREE(&text); } } // Read style FXHiliteStyle TextWindow::readStyleForRule(const FXString& name){ FXchar nfg[100],nbg[100],sfg[100],sbg[100],hfg[100],hbg[100],abg[100]; FXint sty; FXHiliteStyle style={0,0,0,0,0,0,0,0}; if(getApp()->reg().readFormatEntry("STYLE",name.text(),"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%d",nfg,nbg,sfg,sbg,hfg,hbg,abg,&sty)==8){ style.normalForeColor=fxcolorfromname(nfg); style.normalBackColor=fxcolorfromname(nbg); style.selectForeColor=fxcolorfromname(sfg); style.selectBackColor=fxcolorfromname(sbg); style.hiliteForeColor=fxcolorfromname(hfg); style.hiliteBackColor=fxcolorfromname(hbg); style.activeBackColor=fxcolorfromname(abg); style.style=sty; } return style; } // Write style void TextWindow::writeStyleForRule(const FXString& name,const FXHiliteStyle& style){ FXchar nfg[100],nbg[100],sfg[100],sbg[100],hfg[100],hbg[100],abg[100]; fxnamefromcolor(nfg,style.normalForeColor); fxnamefromcolor(nbg,style.normalBackColor); fxnamefromcolor(sfg,style.selectForeColor); fxnamefromcolor(sbg,style.selectBackColor); fxnamefromcolor(hfg,style.hiliteForeColor); fxnamefromcolor(hbg,style.hiliteBackColor); fxnamefromcolor(abg,style.activeBackColor); getApp()->reg().writeFormatEntry("STYLE",name.text(),"%s,%s,%s,%s,%s,%s,%s,%d",nfg,nbg,sfg,sbg,hfg,hbg,abg,style.style); } /* // Read styles void Adie::readStyles(){ FXchar nfg[100],nbg[100],sfg[100],sbg[100],hfg[100],hbg[100],abg[100],index[10],name[200]; FXint sty,i; nstyles=0; for(i=0; igetContextLines(); register FXint nchars=syntax->getContextChars(); register FXint result=pos; if(1prevLine(pos,nlines-1); } else if(nlines==1){ result=editor->lineStart(pos); } if(pos-ncharsgetContextLines(); register FXint nchars=syntax->getContextChars(); register FXint result=pos; result=editor->nextLine(pos,nlines); if(pos+nchars>result) result=pos+nchars; if(result>editor->getLength()) result=editor->getLength(); return result; } // Find restyle point FXint TextWindow::findRestylePoint(FXint pos,FXint& style) const { register FXint probepos,safepos,beforesafepos,runstyle,s; // Return 0 for style unless we found something else style=0; // Scan back by a certain amount of match context probepos=backwardByContext(pos); if(probepos==0) return 0; // Get style here runstyle=editor->getStyle(probepos); if(runstyle==0) return probepos; // Scan back one more context and one before that safepos=backwardByContext(probepos); beforesafepos=backwardByContext(safepos); // Scan back for(--probepos; 0getStyle(probepos); if(s==runstyle){ // Went back pretty far, return running style if(probepos<=beforesafepos){ style=runstyle; return safepos; } // Continue scanning backwards till we see a style change continue; } // At beginning of child-pattern, return parent style if(syntax->isAncestor(s,runstyle)){ style=s; return probepos+1; } // Before end of child-pattern, return running style if(syntax->isAncestor(runstyle,s)){ style=runstyle; return probepos+1; } // Sibling styles with common ancestor, return ancestor style if(syntax->getRule(s)->getParent()==syntax->getRule(runstyle)->getParent()){ style=syntax->getRule(s)->getParent(); return probepos+1; } // Unrelated styles, return with root style return probepos+1; } return 0; } // Restyle range; returns affected style end, i.e. one beyond // the last position where the style changed from the original style FXint TextWindow::restyleRange(FXint beg,FXint end,FXint& head,FXint& tail,FXint rule){ FXchar *text,*newstyle,*oldstyle; register FXint len=end-beg; register FXint delta=len; FXASSERT(0<=rule); FXASSERT(0<=beg && beg<=end && end<=editor->getLength()); FXMALLOC(&text,FXchar,len+len+len); newstyle=text+len; oldstyle=text+len+len; editor->extractText(text,beg,len); editor->extractStyle(oldstyle,beg,len); syntax->getRule(rule)->stylizeBody(text,newstyle,0,len,head,tail); editor->changeStyle(beg,newstyle,len); while(0getLength(); // End of buffer modification changed=pos+ins; // Scan back to a place where the style changed, return // the style rule in effect at that location beg=findRestylePoint(pos,rule); // Scan forward by one context end=forwardByContext(changed); FXTRACE((1,"restyleText: pos=%d del=%d ins=%d beg=%d end=%d rule=%d\n",pos,del,ins,beg,end,rule)); FXASSERT(0<=rule); // Restyle until we fully enclose the style change restylejump=RESTYLEJUMP; while(1){ // Restyle [beg,end> using rule, return matched range in [head,tail> affected=restyleRange(beg,end,head,tail,rule); // Not all colored yet, continue coloring with parent rule if(tailgetRule(rule)->getParent(); continue; } // Style changed in unchanged text if(affected>changed){ restylejump<<=1; changed=affected; end=changed+restylejump; if(end>len) end=len; continue; } // Everything was recolored and style didn't change anymore return; } } } // Toggle syntax coloring long TextWindow::onCmdSyntax(FXObject*,FXSelector,void* ptr){ colorize=(FXbool)(FXuval)ptr; if(syntax && colorize){ editor->setStyled(TRUE); restyleText(); } else{ editor->setStyled(FALSE); } return 1; } // Update syntax coloring long TextWindow::onUpdSyntax(FXObject* sender,FXSelector,void*){ sender->handle(this,colorize?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Restyle text long TextWindow::onCmdRestyle(FXObject*,FXSelector,void*){ restyleText(); return 1; } // Update restyle text long TextWindow::onUpdRestyle(FXObject* sender,FXSelector,void*){ sender->handle(this,editor->isStyled()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } fox1.6-1.6.57/adie/TextWindow.h000066400000000000000000000407161326741342000160340ustar00rootroot00000000000000/******************************************************************************** * * * T h e A d i e T e x t E d i t o r * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: TextWindow.h,v 1.38 2006/02/06 03:03:40 fox Exp $ * ********************************************************************************/ #ifndef TEXTWINDOW_H #define TEXTWINDOW_H class HelpWindow; class Preferences; class Adie; class FXSyntax; // Array of styles typedef FXArray FXHiliteArray; // Editor main window class TextWindow : public FXMainWindow { FXDECLARE(TextWindow) protected: FXToolBarShell *dragshell1; // Shell for floating menubar FXToolBarShell *dragshell2; // Shell for floating toolbar FXDockSite *topdock; // Topmost dock area FXDockSite *bottomdock; // Bottom dock area FXDockSite *leftdock; // Left dock area FXDockSite *rightdock; // Bottom dock area FXMenuPane *filemenu; // File menu FXMenuPane *editmenu; // Edit menu FXMenuPane *gotomenu; // Goto menu FXMenuPane *searchmenu; // Search menu FXMenuPane *optionmenu; // Option menu FXMenuPane *viewmenu; // View menu FXMenuPane *windowmenu; // Window menu FXMenuPane *helpmenu; // Help menu FXMenuPane *popupmenu; // Popup menu FXMenuPane *syntaxmenu; // Syntax menu FXVerticalFrame *treebox; // Tree box containing directories/files FXHorizontalFrame *undoredoblock; // Undo/redo block on status line FXText *editor; // Multiline text widget FXDirList *dirlist; // Directory view FXComboBox *filter; // Combobox for pattern list FXTextField *clock; // Time FXMenuBar *menubar; // Menu bar FXToolBar *toolbar; // Tool bar FXStatusBar *statusbar; // Status bar FXFont *font; // Text window font FXint bookmark[10]; // Book marks FXSyntax *syntax; // Syntax highlighter FXUndoList undolist; // Undo list FXRecentFiles mrufiles; // Recent files list FXString filename; // File being edited FXTime filetime; // Original modtime of file FXbool filenameset; // Filename is set FXString delimiters; // Text delimiters FXString searchpath; // To search for files FXHiliteArray styles; // Highlight styles FXint currentstyle; // Style being changed FXbool colorize; // Syntax coloring on if possible FXbool stripcr; // Strip carriage returns FXbool stripsp; // Strip trailing spaces FXbool appendnl; // Append missing newline at end of text FXbool saveviews; // Save views of files FXbool savemarks; // Save bookmarks of files FXbool warnchanged; // Warn if changed by other program protected: void readRegistry(); void writeRegistry(); FXString unique() const; TextWindow *findUnused() const; TextWindow *findWindow(const FXString& file) const; FXint findRestylePoint(FXint pos,FXint& style) const; FXint backwardByContext(FXint pos) const; FXint forwardByContext(FXint pos) const; void restyleText(); void restyleText(FXint pos,FXint del,FXint ins); FXint restyleRange(FXint beg,FXint end,FXint& head,FXint& tail,FXint rule); FXHiliteStyle readStyleForRule(const FXString& name); void writeStyleForRule(const FXString& name,const FXHiliteStyle& style); protected: enum{ MAXUNDOSIZE = 1000000, // Don't let the undo buffer get out of hand KEEPUNDOSIZE = 500000 // When MAXUNDOSIZE was exceeded, trim down to this size }; private: TextWindow(){} TextWindow(const TextWindow&); TextWindow& operator=(const TextWindow&); public: long onUpdate(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onCmdAbout(FXObject*,FXSelector,void*); long onCmdHelp(FXObject*,FXSelector,void*); // File management long onCmdNew(FXObject*,FXSelector,void*); long onCmdOpen(FXObject*,FXSelector,void*); long onCmdOpenRecent(FXObject*,FXSelector,void*); long onCmdOpenTree(FXObject*,FXSelector,void*); long onCmdOpenSelected(FXObject*,FXSelector,void*); long onCmdReopen(FXObject*,FXSelector,void*); long onUpdReopen(FXObject*,FXSelector,void*); long onCmdSave(FXObject*,FXSelector,void*); long onUpdSave(FXObject*,FXSelector,void*); long onCmdSaveAs(FXObject*,FXSelector,void*); long onCmdFont(FXObject*,FXSelector,void*); long onCmdPrint(FXObject*,FXSelector,void*); long onCmdSaveSettings(FXObject*,FXSelector,void*); // Text display long onCmdTextBackColor(FXObject*,FXSelector,void*); long onUpdTextBackColor(FXObject*,FXSelector,void*); long onCmdTextForeColor(FXObject*,FXSelector,void*); long onUpdTextForeColor(FXObject*,FXSelector,void*); long onCmdTextSelBackColor(FXObject*,FXSelector,void*); long onUpdTextSelBackColor(FXObject*,FXSelector,void*); long onCmdTextSelForeColor(FXObject*,FXSelector,void*); long onUpdTextSelForeColor(FXObject*,FXSelector,void*); long onCmdTextHiliteBackColor(FXObject*,FXSelector,void*); long onUpdTextHiliteBackColor(FXObject*,FXSelector,void*); long onCmdTextHiliteForeColor(FXObject*,FXSelector,void*); long onUpdTextHiliteForeColor(FXObject*,FXSelector,void*); long onCmdTextCursorColor(FXObject*,FXSelector,void*); long onUpdTextCursorColor(FXObject*,FXSelector,void*); long onCmdTextActBackColor(FXObject*,FXSelector,void*); long onUpdTextActBackColor(FXObject*,FXSelector,void*); long onCmdTextBarColor(FXObject*,FXSelector,void*); long onUpdTextBarColor(FXObject*,FXSelector,void*); long onCmdTextNumberColor(FXObject*,FXSelector,void*); long onUpdTextNumberColor(FXObject*,FXSelector,void*); long onCmdDirBackColor(FXObject*,FXSelector,void*); long onUpdDirBackColor(FXObject*,FXSelector,void*); long onCmdDirForeColor(FXObject*,FXSelector,void*); long onUpdDirForeColor(FXObject*,FXSelector,void*); long onCmdDirSelBackColor(FXObject*,FXSelector,void*); long onUpdDirSelBackColor(FXObject*,FXSelector,void*); long onCmdDirSelForeColor(FXObject*,FXSelector,void*); long onUpdDirSelForeColor(FXObject*,FXSelector,void*); long onCmdDirLineColor(FXObject*,FXSelector,void*); long onUpdDirLineColor(FXObject*,FXSelector,void*); long onCmdShowActive(FXObject*,FXSelector,void*); long onUpdShowActive(FXObject*,FXSelector,void*); long onCmdLineNumbers(FXObject*,FXSelector,void*); long onUpdLineNumbers(FXObject*,FXSelector,void*); long onCmdTabColumns(FXObject*,FXSelector,void*); long onUpdTabColumns(FXObject*,FXSelector,void*); long onCmdBraceMatch(FXObject*,FXSelector,void*); long onUpdBraceMatch(FXObject*,FXSelector,void*); long onCmdAutoIndent(FXObject*,FXSelector,void*); long onUpdAutoIndent(FXObject*,FXSelector,void*); long onCmdInsertTabs(FXObject*,FXSelector,void*); long onUpdInsertTabs(FXObject*,FXSelector,void*); long onCmdWrapColumns(FXObject*,FXSelector,void*); long onUpdWrapColumns(FXObject*,FXSelector,void*); long onCmdWrapFixed(FXObject*,FXSelector,void*); long onUpdWrapFixed(FXObject*,FXSelector,void*); long onCmdWrap(FXObject*,FXSelector,void*); long onUpdWrap(FXObject*,FXSelector,void*); // Text changes long onTextInserted(FXObject*,FXSelector,void*); long onTextReplaced(FXObject*,FXSelector,void*); long onTextDeleted(FXObject*,FXSelector,void*); long onTextRightMouse(FXObject*,FXSelector,void*); long onTextChanged(FXObject*,FXSelector,void*); long onEditDNDMotion(FXObject*,FXSelector,void*); long onEditDNDDrop(FXObject*,FXSelector,void*); // Miscellaneous long onCmdStripReturns(FXObject*,FXSelector,void*); long onUpdStripReturns(FXObject*,FXSelector,void*); long onCmdStripSpaces(FXObject*,FXSelector,void*); long onUpdStripSpaces(FXObject*,FXSelector,void*); long onCmdAppendNewline(FXObject*,FXSelector,void*); long onUpdAppendNewline(FXObject*,FXSelector,void*); long onCmdIncludePaths(FXObject*,FXSelector,void*); long onCmdFilter(FXObject*,FXSelector,void*); long onUpdOverstrike(FXObject*,FXSelector,void*); long onUpdReadOnly(FXObject*,FXSelector,void*); long onUpdNumRows(FXObject*,FXSelector,void*); long onClock(FXObject*,FXSelector,void*); long onCmdPreferences(FXObject*,FXSelector,void*); long onCmdDelimiters(FXObject*,FXSelector,void*); long onUpdDelimiters(FXObject*,FXSelector,void*); long onCmdInsertFile(FXObject*,FXSelector,void*); long onUpdInsertFile(FXObject*,FXSelector,void*); long onCmdExtractFile(FXObject*,FXSelector,void*); long onUpdExtractFile(FXObject*,FXSelector,void*); long onCmdWheelAdjust(FXObject*,FXSelector,void*); long onUpdWheelAdjust(FXObject*,FXSelector,void*); long onCmdNextMark(FXObject*,FXSelector,void*); long onUpdNextMark(FXObject*,FXSelector,void*); long onCmdPrevMark(FXObject*,FXSelector,void*); long onUpdPrevMark(FXObject*,FXSelector,void*); long onCmdSetMark(FXObject*,FXSelector,void*); long onUpdSetMark(FXObject*,FXSelector,void*); long onCmdClearMarks(FXObject*,FXSelector,void*); long onCmdSaveMarks(FXObject*,FXSelector,void*); long onUpdSaveMarks(FXObject*,FXSelector,void*); long onCmdSaveViews(FXObject*,FXSelector,void*); long onUpdSaveViews(FXObject*,FXSelector,void*); long onCmdWarnChanged(FXObject*,FXSelector,void*); long onUpdWarnChanged(FXObject*,FXSelector,void*); long onCmdSyntax(FXObject*,FXSelector,void*); long onUpdSyntax(FXObject*,FXSelector,void*); long onCmdRestyle(FXObject*,FXSelector,void*); long onUpdRestyle(FXObject*,FXSelector,void*); long onCmdJumpScroll(FXObject*,FXSelector,void*); long onUpdJumpScroll(FXObject*,FXSelector,void*); long onCmdWindow(FXObject*,FXSelector,void*); long onUpdWindow(FXObject*,FXSelector,void*); long onCmdSyntaxSwitch(FXObject*,FXSelector,void*); long onUpdSyntaxSwitch(FXObject*,FXSelector,void*); long onCmdStyleFlags(FXObject*,FXSelector,void*); long onUpdStyleFlags(FXObject*,FXSelector,void*); long onCmdStyleColor(FXObject*,FXSelector,void*); long onUpdStyleColor(FXObject*,FXSelector,void*); long onCmdStyleIndex(FXObject*,FXSelector,void*); long onUpdStyleIndex(FXObject*,FXSelector,void*); public: enum{ ID_ABOUT=FXMainWindow::ID_LAST, ID_FILEFILTER, ID_NEW, ID_OPEN, ID_OPEN_TREE, ID_OPEN_SELECTED, ID_OPEN_RECENT, ID_REOPEN, ID_SAVE, ID_SAVEAS, ID_FONT, ID_HELP, ID_WINDOW, ID_PRINT, ID_TEXT_BACK, ID_TEXT_FORE, ID_TEXT_SELBACK, ID_TEXT_SELFORE, ID_TEXT_HILITEBACK, ID_TEXT_HILITEFORE, ID_TEXT_ACTIVEBACK, ID_TEXT_CURSOR, ID_TEXT_NUMBACK, ID_TEXT_NUMFORE, ID_TEXT_LINENUMS, ID_DIR_BACK, ID_DIR_FORE, ID_DIR_SELBACK, ID_DIR_SELFORE, ID_DIR_LINES, ID_TOGGLE_WRAP, ID_FIXED_WRAP, ID_SAVE_SETTINGS, ID_TEXT, ID_STRIP_CR, ID_STRIP_SP, ID_APPEND_NL, ID_INCLUDE_PATH, ID_OVERSTRIKE, ID_READONLY, ID_CLOCKTIME, ID_PREFERENCES, ID_TABCOLUMNS, ID_WRAPCOLUMNS, ID_DELIMITERS, ID_INSERTTABS, ID_AUTOINDENT, ID_BRACEMATCH, ID_NUM_ROWS, ID_INSERT_FILE, ID_EXTRACT_FILE, ID_WHEELADJUST, ID_SET_MARK, ID_NEXT_MARK, ID_PREV_MARK, ID_CLEAR_MARKS, ID_SAVEMARKS, ID_SAVEVIEWS, ID_SHOWACTIVE, ID_WARNCHANGED, ID_SYNTAX, ID_RESTYLE, ID_JUMPSCROLL, ID_WINDOW_1, ID_WINDOW_2, ID_WINDOW_3, ID_WINDOW_4, ID_WINDOW_5, ID_WINDOW_6, ID_WINDOW_7, ID_WINDOW_8, ID_WINDOW_9, ID_WINDOW_10, ID_SYNTAX_FIRST, ID_SYNTAX_LAST=ID_SYNTAX_FIRST+100, ID_STYLE_INDEX, ID_STYLE_NORMAL_FG, ID_STYLE_NORMAL_BG, ID_STYLE_SELECT_FG, ID_STYLE_SELECT_BG, ID_STYLE_HILITE_FG, ID_STYLE_HILITE_BG, ID_STYLE_ACTIVE_BG, ID_STYLE_UNDERLINE, ID_STYLE_STRIKEOUT, ID_STYLE_BOLD, ID_LAST }; public: // Create new text window TextWindow(Adie* a,const FXString& file); // Create window virtual void create(); // Detach window virtual void detach(); // Close the window, return TRUE if actually closed virtual FXbool close(FXbool notify=FALSE); // Return Adie application Adie* getApp() const { return (Adie*)FXMainWindow::getApp(); } // Return this window's filename const FXString& getFilename() const { return filename; } // Change this window's filename void setFilename(const FXString& file){ filename=file; } // Has a filename been set or is it a new window FXbool isFilenameSet() const { return filenameset; } // Is it modified FXbool isModified() const; // Set editable flag void setEditable(FXbool edit=TRUE); // Is it editable FXbool isEditable() const; // Load text from file FXbool loadFile(const FXString& file); // Save text to file FXbool saveFile(const FXString& file); // Insert file at cursor FXbool insertFile(const FXString& file); // Extract selection to file FXbool extractFile(const FXString& file); // Return TRUE if changes have been saved FXbool saveChanges(); // Change pattern list void setPatterns(const FXString& patterns); // Get pattern list FXString getPatterns() const; // Change current file pattern void setCurrentPattern(FXint n); // Return current file pattern FXint getCurrentPattern() const; // Add bookmark at current cursor position void setBookmark(FXint pos); // Update bookmarks upon a text mutation void updateBookmarks(FXint pos,FXint nd,FXint ni); // Goto bookmark void gotoBookmark(FXint b); // Clear bookmarks void clearBookmarks(); // Read/write bookmarks void readBookmarks(const FXString& file); void writeBookmarks(const FXString& file); // Visit given line void visitLine(FXint line); // Read/write view void readView(const FXString& file); void writeView(const FXString& file); // Set syntax void setSyntax(FXSyntax* syn); // Get syntax FXSyntax* getSyntax() const { return syntax; } // Determine syntax void determineSyntax(); // Set syntax by name FXbool forceSyntax(const FXString& language); // Change style colors void setStyleColors(FXint index,const FXHiliteStyle& style); // Get style colors const FXHiliteStyle& getStyleColors(FXint index) const { return styles[index]; } // Redraw when style changed void redraw(); // Delete text window virtual ~TextWindow(); }; typedef FXObjectListOf TextWindowList; #endif fox1.6-1.6.57/adie/adie.1000066400000000000000000000060431326741342000145260ustar00rootroot00000000000000.TH adie 1 "30 January 2002" .SH NAME adie \- The ADvanced Interactive Editor .SH INTRODUCTION Adie is an extremely fast and convenient programming text editor written using the FOX Toolkit. Besides being a nice text editor, Adie is also an extremely convenient file viewer, supporting a plethora of methods to move from one file to the next. For each visited file, Adie remembers where in that file you were last looking, and which special places in that file have been bookmarked, so you can quickly return to frequently visited places. Project browsing is made easy by optionally displaying a File/Directory browser side by side with the text so files may be visited by means of a single click. Files may also be opened simply by highlighting a file name, compiler warning message, or #include directive and hitting a single button; Adie will search for the file in the same directory as an already loaded file, or in a number of predefined directories (like for example include directories). .SH FEATURES .I General Features Preferences are configurable with convenient dialogs. - Text size only limited by available memory. .br - Persistent bookmarks may be set for each file. .br - Persistent scroll position is remembered for each visited file. .br - Wheel mouse scroll support. .br - Online help built in. .I File Access Features. - File Dialog supporting bookmarked directories. .br - Dropping a file into Adie opens the file. .br - Single-click access to file using File/Directory browser. .br - Visit recently edited files. .br - Jump to file and line number of highlighted compiler warnings or errors. .br - Customizable list of file patterns; show only source files, for example. .br - Open a file by highlighting a #include directive. .br - Customizable list of directories to search for header files. .br - Detect if file changed outside of editor to prevent accidental overwriting. .I Editing Features. - Unlimited undo/redo capability. .br - Cut and paste to clipboard support. .br - X11 primary selection support using middle-mouse paste. .br - Drag-and-drop support for text move or copy. .br - Brace matching, statement block, and expression block selection. .br - Up to 10 persistent bookmarks may be set in each file. .br - Search and replace history is stored persistently. .br - Auto-indent feature. .br - Strip trailing spaces, strip carriage-returns for DOS files. .br - Indent or unindent selected text; clean indentation. .br - Search for highlighted text. .br - Goto line number, goto highlighted line number, goto matching brace, goto begin/end of block. .br - Fixed word wrap column, or continuous word wrap mode. .br - Mouse wheel or right-mouse scroll support. .br - Customizable word-delimiters to select words by double-clicks. .br - Insert files or extract highlighted text to file. .SH AUTHOR This manpage was originally written by Bastian Kleineidam for the Debian distribution of the FOX Toolkit. The main author of FOX is Jeroen van der Zijp . For a list of contributors see /usr/share/doc/libfox0.99/AUTHORS. fox1.6-1.6.57/adie/adie_gif.gif000066400000000000000000001144001326741342000157550ustar00rootroot00000000000000GIF87aČČ÷˙˙˙üűöóęŰäÖ¸ďäŇŰĘŁů÷î ?"üüůęÝĹ÷óçűúôńéŘôíßüűőďĺŇđçÖńč×đćÔĺ׺ţýüúřđăŐµîăĎúůňęŢĹőîáëßÇëŕÉâÓłçÚľěâÍú÷ďíăĎ! řôę=!ëßČŃşŹ ýýůíâÍňęÚÜĚĄůőěŢΩӽ’F(U.ßĎ«# η‰ţţúáҰ, ŕĐ®őđ⯇]Ěł…čŰŔ€T6\4!2óëÜŐŔ•¸–kV11!Y1éÜ¡vO& »küüöćŮ˝P+ťpJżžqűúóħyÝͧ±ŤdB%9Š\;Ö™üüřD&' e=&k@(a:%Ç«}>áҲ=Č­€Y2 wL0qH.-R4“fB•lInD+×Äť}O2ŕЬũzµŹcŮĹžQ-6 Ý̦‡Z:O*«…]÷ňć¦{S+ Ş‚YM(‚Y;vI. / , a8#_7#* ×Äš©Uc@ÁŁuŚbAćŘ»K'wO4rE,5řőěůöîe;%šnH9¸“g$ ÉŻ‚·‘elB)–iD˱ĽšmŐÁg@)ů÷ďôěÝ8ŔˇrźsL( ôěŢϸŤĂĄv÷đä! 0˘zSI%F%Ś_=Q.˝śoÚɡ^5"& çŰż±Š_ěŕËI)öđăR+„V74J+:Ôľ•čŰÂ÷ôéB#đćŐîäĐ# äÖ¶öńäđćŇáŃŻěâËřőęY5!& Ň»‘V/Í´‰őíßëŕËçŮľF#ŮÇžéÜÄB ÚČ ÚÇźÝĚŞ#ůőęÜËĄöîă( @#÷ńĺŰɤřóč"  ýýűőîŕěßÉŢά˙˙ýĺÖşúúńűůńăÓµňéŘýü÷ű÷ńţţýüúňűůóöňçűúööóĺýúő,ČČţ‰Č–ꆏ2a2uňqăĆ@"ZćĐjŁF 89>` đä‡G<ˇ€áśhasŁ”0(úđŃ)B„qrŞ*ĹSUÎ8eúv#ŠŁŃ„ #ÂDDn!j ‘© (RMŁ™)S*‹Íj"§GŹDKLqĘ‚GÍ™@hÚ  )Đ5lqŠĹT”´~9)Â$Đ— µzAqôę”ĺtnÓµR´u• đ1%$V‰ŮÉ™ä-RĘ'—ČËY¦T‚!ajŕŘŕ[iVI_ť-±D•T˘†o´JŠĺ‘Ç.»@E†Pň$gD,r¶DhţfŤ†VkhH(`! ¨ŔŔ’@YéÇž0Z@…Í6KRd3Ě@ĺĐb‰Á“pÔpÇtQMEÄu1ń·Đmeâôy@•ń­zÂeTş(ĚIçśGŰĐ45}÷ßx~ŽĄÉ ~LŠ`,ľř’č‚g\¦x´hФńĺ×k|Ć&…´FçŔ(Fj!^ š(Y(˛Ć_0šŐĂŚĄť–g´†4ŔĚpĹ.^jű’śÂ€"ŐŰ(Ůdµ5űA–ť3;Ô] T'ŐT˛ Ôíą3quBŢ™g^n ĺő~ű5¤_»íĆyÔĽ[őľáí¤o|¨±†«!0Łľ°¸ţg ÷-·ÄmP§Ŕ˛K˝HF %›XpČkpâYh3žśHˇk˝††±K1\Ě u-)ŐT±ÇŇÎ’1ŔQí;0űłĚŔ‘ttऄÍTóAM°UÝćVŕ^ÔB µ©^×ĚĎ„ŰLoŞ›‘ÎgňÝNî$…€–…Vg—f&ţŔv·ęj¤’bËŤ9vŘK#2fFµśĆG(r%’ľij‰Ë #Đa¸¬5ťÝť©SŇęšd‘ЏÎv·‹A ŔŃZP'*ő)–±­Úä‰yŢŞ‰MŽ—žŞ9Ď…4)CN´*$¤HDÚ ń¬7.?…ĄţłKd9ÓüKë YĹ ÎPčEĄ™IJ° 6xÁCďŐzQ‹$!mŔ›/ Ç’ĄĎPśhđ‡ `\`ĆŇ Ŕ ¨AŘŕôؤř‘‚~ĽVî<¸ ©°>ŮĘ(®"/ć7+´ ™21“žÉOŰűD.Ń„Kh‚“łXDB‚Ň•ó¬-<≂8–@ábPĄą".ĹŞ Ĺ‚E-*c˙@Sµ„ď ŕ\Ě@˘ý AH&ÚPéAŹ˘o‰/Ô‚Ť\(Ć8f×I§isH] Z°Çd±ÎʬÂV—»/‘>†”ŠÜ€ŤcÍáwRţ[×Ŕe3Ď;;)…†(‡~ ¦‰ RŐ‘…30¸¸Ä,¤PĂźüp{Ű b'])š¸]AłśeŁ ©W&4|ŕK­€€Ł/€!2QDE/.nrIÂX%2Nřt–7j!‚ŔF™)đ9J«ÓđÇ%1iśęŚŽRÉ Žu %Ü` }ä#źyÎ!śÇÚ†Xç•m1rz©ZM‚ň“jÂjaDaV%˛ ŚAcÂ" ŚđC(br•ź ü@šIUę±|ű‹+JóĐŚ&n–Â/Z*8˘öD M͆B”ę mhň&˛5 ‘-tˇţD ĐĆ+Ŕ©Lú&;cp‡ÜF§·Ľ­ęę<Vn‹˝;7íi\-–đ(Á;dŐ‚0¦Wµµ}Bš8 ‚"–¨@hć @x„N5{)–ˇa›@r\ŕ‚†'ŁáD8%f1Ä 3<"źč*ÇŇ„"Ę,Ľô_ţeO*«ŽŞ9-˛,pË(Á3|ö3Íhó@#ĐŹęÝD…`7UĆĄA…¨®pĚ;8ÉSs§¤užť¸»ę6˛ ÂůüN>HUyË4npĂiŔšBTŃ\$B|Ŕ"N3Ë7t×-8Ş…4(QşPâ „Yíľ ·ÜÍš‚EŚ 3\ăÚ€… €…6řA˘M¬… Ć&âd˘w¸c%+(şÂ±0;k„ÇČt‹#UčW*ĘÔĄ™ z˛KÍ`@`\A›W(ÉIx›’«VµIUPš{»bldj:!DzŤ$|JUɦw·Čd‚ łC"ţŘŕ‹G0ČÖTŁřĺ —ťám@ŚŽ’€˘0†Gg €€:ÔáGĐ2şŤ.C$`‚vń%|b•Mčä¶_ŮA™ĚꯔŐ/»ßňbĘ0ÖL  0vÚŠŞbź÷0)JPFS_ŠĽ€«e Ś0şNJ7··—îŇę¦ópCÖ'žľŮĆ*bUŞ"2(…+ń (Ŕ4Ř«­3”…ZÝ(QhÜĽÍ |^H=2“™#ˇ‹4pÄ5ę „>C¶`ÂR€ $@@‡ qV‚ —Hě%ä@m{ę‚zţ™Ĺm ôý 72°:ţd#ôč1´ĄĆß}´ˇT‹sűâ Q‹ˇö"fŚ0¶ôͫҢ©dRoË9ČŻVžQAOs`j>ÓG1ĐMt´ Ř€zđ°Đ ¶ŕsu0†Đ_đŠ@‚†@ ă1ŕ2r@ ¶j`Eh µ`  X@´× :€{]0‡ 6pČp]€EG†—°IËÇIřőIÍG @6u±ň"ťa(s“WV Ëö}î6v˝ŕ`=ŇlÉT `ř É$ ­'*3 3g8Ŕ GLV4–ăÄ:~'V-ć_Ĺ bŐ3Şs5@NpđŇn lđ „ ţ‡p¨ Ú@ 4Ŕ Ž2Ýĺ` "¤Ŕ‘ d  ×ŕ‰°` ‘ †H@tp„0«Ř ¤@ ‡pip]@]@$ „p¨Xt§` xŔIËuQ‡„eVfE`„Óg ˝$KëChČ!¬Aß§="~PEÖ ŇŕzF 3t»0ˇ3?R+¦€¦Ö3Wő[qŘ\4VpşCöW€P;Ŕ4Z°€ §ĐĐ{ç GđŠđŐ1váĎ ­0@ Ďö!ÚđŠ­0‘bŔÁ€Pđ ź Úmźř ˝0"¤ i Š§`âĐţ¬Č‹D×ů ˇ°55 źđ Ą|Buć´†}ľ0@Xíç!®ńâ·…c7SďfŤ1ăŚ*»Ŕĺwކ„NQ€Vĺ%żń†§ióp¶´Ŕ[-!Ź@ ]Ŕ‹I`tu` ÚPSI@F€d0ŠăP ®W?^Ŕ lçj řٱ€!YÚ^łä t–Ǥ Ů G ­ LP‹vi§Pty¤€¦p D%ĄIeć|ŕ–2ܵ>‰‚#ŐDgL98ó6v=˛…Ľ Ći8°P  S P ˙Ćhچ&0w°qá$V4N×ţŹżapůÇpGA±łx´ Ó  €  y yŮu‰ ç`G@Żđ… Ż d"_€os^€)t…DŮ"9Qx)ó``)iˇř :0ˇ‡€š‰x>—§pš„P xĐrf~"PADĹč|V—2®uašĹR ëe*…đ›Ň[ř~ĺx†Ś&3̉oäŁ@:m&0ťąCVŘpřHNRUNô,é¤Tw°x~T-w€2EđżĐ{ŕ  ŢPt} W y ”Q0g 0ʰlŽ m0F«…˝Lxp±@+xáZ‚ˇ(Ű7?/egP  ţˇÉŞxĽ ¸š‡p ‡Šb~ U R_PçIS×m5âuł tŃ8wľ śFĺČhĘY 23B CJ&đ‘´j°;YfCi2±T^¶Dhc/jrÇką" =*:ŞMŇ9«C «°Š$[X€ ´\¬cţ®ŁpOZ°“4A“‘V `‹Ŕ3 $  ż@ Ťa›đlń(•ŕ …0„Áx dhđ 樜ŹQźFp˛đ €Ĺ€peµz˝đl^"Fđ B ż Ż‰ ¨LŔžĐ·]`ą·®g` U'QĄ˛|¸`&S}róZBhođ¸oq^1 ĂDśgMĹ«˛ Á` Xđąi ă u *ű†l ´;ŐR-)¶O;Ó˛   °(p Źpâ@‚€ˇ€ «ř Ż öYeDg` °@ żĐB“iţ0«ŁË`«"Ł*Y Wj€†đ t@"° –đ ĐJ č «u0ż@»H‘}‹D÷¨E‡  żŇŕʰ~QůR›‚‚¸•´–!šő©wą-SM:â‘‘y†<'ťÔf˛X€˛X0«ź[ş°*A¬»Fó$`łˇşGĂ,ĎB»Eó0p÷T i ‚ |€Ă{ ĹK› śĐłEmG ­Đ6P}Ш›ř ˘5_sm`yĐl`8ŢĹ`ĎĐ)˝żŔeúú JÜş(ż„ ·ň[|Gk & Ú yS ŻöJšX‹2ţ R·´> ÜË›0Ęk<˛+\ ăŕŞ$[˛Lşüą)[i2;»´»ÉłÓ,OňÉ0Ť@WŇJ`%`{pVđ đĘą Ă>Ř ]Ćl`ss᱇5H‘‡@¶ –đ¦›p`Đ t ľgÚ@°  •!Ŕö0‡¦–Č#Ż(Ň[‘– 0©Š»H­żŢ¬šÓ+G°M†€~`ź  ň“f¶XŤ%M3Č„¬DątQMWŽ»pC:˛uŕÁ–\Él«ŕŕG°%RBĘҢ%9ńSŇÉ?Ŕ “Ŕň0EP¬`vĽ8ڎ@Ř©ţ `° šA`‰_Ű F˛ŕ®`Đ‘yp Čë}µđ€Đł´˘řsĚrAh… …ŕ˝mŇŰ ó tG0“‰ ‹}ÔĆÁ,Ŕđ … wĐ ć0?0™ŔjüR}ţ"ČHtKl0„VloQÄ.e˛0~©*ť™ŰÁĚÁ(ës¦;%TÂÇńŤ-%ĘQbѡŔô0  `Ŕ č ąŕąđ.ŕJ„ X® ˇĐg˛đęEw¸ň `P jZ ”Z+č eŘÇ8˘ęfĐŤ’(`Ŕ‚ŤA ‘pÜX đk{˘©}0‘5hÎ,ţ9‰ŘĚF×P VŕP0İÓ@Dg…##!mݸJô¸/Š+­QÁć:oÄąĄkĐ–Ś˛ă0NÂAŃĆîÇq%ŃâȡJđJ  %ŕ;đŕč`›Má`8| )źXŔhP[ Ŕdŕ A@ľĎÖ žH´ 3]ëµZ,Ur@`)Žľ ×D×€´Ú Ů»“·×2YŐBđĹ&Đ9Ď`)Y Żŕ˛°cőPÓM `p&…>9!őZźz08Çv˘häMCšßě×Á°ßw€ţ0Ç .-˘¬ŕ Đ{%ŕ9 đĘËśý{żÇ ] “G`Ď`AĐĹ ˇĐ b€›žb,¤bD°Đ 5lc”00ÂŹ€ÚË6W„Ô}fÚp­Đ:Őżđ™G× ‘`3@Y` ,QŔ@`Ž{%˘@z  őĐĺŢŤpP’>}Á>uî>ĺÖHů¸wj±}… ö\đČ%űą‘ŔÁ<K‚ˇÜŹč‡Íľ‰>ŕJE€ .ŕŮťý±ŚĂ:üH`6Ŕbđ Ú`.çz°jţX0ů ]» *˙ź¦L@° FpÔo¨MÁC® G‹ľ>·„ äi? Ŕ ílĐŻµĚëlm&ŹT^^ő^^,p € P”>Fi(•ňSI´Z˙)Ş_°8]DI F…ÁłĘą%;ť‹÷‡˘Lđ®ŕ?ŕĆ1O  `đŕ“0ÄЬ ńśť â 9Ś<|¬·şä‘𠵍nmi\@{łú Ď S~~thŃ.¶P" e а Ď ᜉ[äŰfčΑpu0ŠĹ€_k)¦@©šP=P ¦× tţ0i »ŕ]nő_Ŕ  `ovF†2d·Ô˘,51›°}1Läh[®*¤!;`bQ÷~ź wź÷Ça ţřľ ß  µ®T"ËÖ@€m6XűÁěqbP„ä·ß\H® t’łĂ ěţĉl©c—ZŔŔÎ0Ž‚âKČ€…'1ţ¨ C‚DcY¶XÔPż3‚ř#@0Ú˘ş^ Č `80’‹1"Gľ8c +éa‰D>Y$< ŮeŇŽA™ĹŤ-*` ›x€I`Ł9¦ĹE{Ŕ«/>nâd0EľU 7Ţpě JŔ0Sw™a`ÜÝĹ]Yb€cŚbKíJŐ˛tíµF”ó‡¨ €±ˇ8…˛ŕ8A˛ $0ń‰.Ć“.Ä9âm¤)@ŘŔ#0^ů†^^ą&Ź?^é–ňŔĹ7˛5|ńe“?HţŁPń%#Ŕx¦H ń l˛mĚŘä‹ |9CW¬Hd‰%™ĄÁÎČă—b®¨C4H8ç#Ęh@I¦ŔˇžDąG.‘ăż©ŐcFĽřXÇ÷şĺ1?5d“Ź(S™TR{ů#Ź^h’ĘÓŘ@ßVă×řmD*¨ç+ŚH8â$öĺĐ9'OC}`&ţ q3d%ŕÁ=ÜR°#ŞhB?á7MP zńá W‰ÁÄ‚gA {$S‹$‰zI¸ ’„ä ÷Ę—ôĄĄÖĽ`\RG‰*Ž6\A6pěr‘0‡\Ś çDH`&śBcâŔ‚Îŕ‹,°ď‰BL ńGĽ"]F v:HC°p„A KŚ#€hĂ&΀†öD…‰Ĺ&Nö 8ZâÁ0Â.^ak!›xD,.”EČĘaăC\kô!2A_¸B%Ř ¶PŹvÔcÝ…fń‰Yd0—č`˙°uˇÂ‘p kčąţVbšˇHn¤ŢJjA‰``]çNpĄĎńĐ5Yz¦ŇQŹtt G8NĂ–3Et,Ń$¸Řrl [ôAt´D®‡ˇĽ!ŠxŹ×röÇÂ&0Á° KhŽbΓłÉxAŮĂç˛đ…$´ dA1ęĐ KCž4 4zqťG Á•ŕŮ.Ń9ĚbZMpE®ń L\Ś„hEža𢓀[¸9‰   GĺĘ,jů7kQč/¦ŕ„ޞŕ‹űÉ~…haB:à ̰ R#PÓ9čP_¬Q—”Đ*(c#„`ÇvŇÁrţľ’ŕč¤"!Á¸*”đ'üâŠD¬ Ż Ĺ!Zń‹4Ôáih§Ęh„/ř˙IYgá‡(ÄHAřB „ľHŽşzQË…ĺ¸8ą¦KEéţ… Y0 „AĄV€…·Ł@€9!…<8—gW^0‚ŰĘ‚ôZ č¶ÄÚŔ>#8ś2üŁŕ (Ř’P™n‹±%Đš˙éę\`,,Âë‚.8¨_€‚"ŕ†H…2pȶp‹j(9h€v\ĐDČN0!ˇ¨šý0¦*´É ¦ö~Q ‘+«ad4Ŕ-PeT-†g@§r>OŔť{tĐą`…s8&@q°!ZC±_8,"mč@ „gp„HHŔ°:Ŕ‚]X  ş<Ř4đHţ¸-űáŁ3đ2x'4ŕmp>t™CČG†`@”1/€„5¨„%Č‚Jh‚ţÁ…Oh,>đ»ă„gř…łŘťŚIÂk…A€U X„tHz(‘-H€t‚r ‚&¸„Ú–Ć!˝÷2˝ZPJąŚ_Ô’ Ća<X=ŘÜŔ`¨,hŽâ`$đ9iQ#ŽwËŤ±„k¸:pY…]Hqř…WČB¸1‰µIqčHŔ€ŁvKIK ň9i ńy4ŹAřXčáz…7ĐË4Ô`(ë‚ŰŠŔŕ„ţDčH±?P? „58jÓ#‚†.`[Ó†JČ7`‡x8j¨†Čv*(…Y𡌂7HxŚBxŻV‰Żů‚ڦä}1+}Ů](-ŔP č€ó4€)Đ€[@§‚xÜatŞ+A`…K<…A #«µjë4Ŕ‚<€„XPż50„+ż(ŮÄł±3,†B`ŹCŚĹÉŁsé*76Ť›ŻĎ¤i˘¦}yĘčJ¸‡ č€)€‡Ia 5 xŰqÂäA°ć8h¸Mń 1` G ]đ5H 41h k: †`řËu’aÁ‚–čCů#h7K@€§P0đ‚čô‘@!?p…ěˇ Đ*§é±S9X‘7Yd¬%Xüř(x„Pmv:…ce…ă\ ĘDŘHĹŕ„3@0?<Č)¨Ă×Ô L8B8qH!8‚©ľCŔ°4 „Ž3@ŻM(PEř"S€)č6Zfűş¬ˇŞŁ+‚Ĺŕ3Ŕ„PŔşP@ …6±@€qč]«)*Bľi‚8ËZ(›O)ţJëEM‰Z aú‚[¬âs1[ٍ/’Ó…j’ŤF €Ź[ß'€€e$7Ř{€1肺:fµÁył%Ą:‡?ň€‚Z @YBV¤ …J H ©(zä48‚]‹G.D¨$@HŔÂ30aˇőN°Wč\X(Č‘JČ‘L¬ÝŠ…67NH0‚!é…P8:@1.¨4řäĄ+¨F/&ž…ćŤ3'¶Ą–®ńŁüĆ©źŞéGٸ/ő‚h´ţâ g H4q~XF ŔpÓ h0Ŕá°€.€†GŤXř †#ţ`R:”Ö†Dqđ}ô  h´%[Đ]čm _``!h,Se‚뻬#رWřR5„ÓěY–5Ń%xĹú"| eĹ‚E´>ĐŢ Č/¸‚P WĐ"GČ(zÜÜ+HH¨dq"[° ץ%ĄjâĄâ ńZ>đŁ?2ˇ ¸jî@ă¸s!&úĘ€ŔÁţR€¶cqçdH†!Pą €xhy%D‡8˘‚X[(,´ĘŇ4aim`ÁÚş†Ž%V‘(Ă#( »ľ¬>„A¸ÄQÂ)Ž‘ŠQ!•?ô(Jc‹…ˇÝ˘Ś$!<!Wý1ţE°SX˛7¸ü0ŕ9›Ź ,Đi!L,0ř“ř$ćŤ /9h‚OęOJMn®ő n!Ś©zYî50Ř„ÇŔb0€€cŔęGËh„Ŕîg˘ W€€K€đ€PŔŕ{†0ŽşňSÂ];…),ŚvX™¶ŃB¬HŔg&xT´Ě>đ¤C8äŐµA@.6‘ @”$pś P„G€‚M¨_訄ĽŕR6\Pčór‚:,ŕ(ŃéŽ1q| v",[°/ŔLľ1·KŘí"řm‡Em)ŔDŻi®ö¨¸/ŕ8đ5ţ„c¸ęfh0† 1Ön 8†Ix¸)†_`…âX“'DË(´…°od…Ŕíd` X žđ‚~DGíÂ2 V°[Âr-+˛>ë›TІ?(Cr„bhźtऑ…g*B~Jř%_€)?¸=ř p“ŮĐ3ĺş`m Äbđ¨yÔ4ËúKÝsR`–zŮi /ç\Š‘ę‹Â1Ż©ň‘Ćhî*nŠVBcr¬^ŮűŃé’ôÝ€}¸€)P)P†E(iX4đťá`›‹ť%L`ĺŕ+ćşVpm2¤ń …Śc>Ěs’>Ŕ„.ţD^äŤh,‹ÉśL¸‚+†]·tě¨8_¨HN/r…¬íČX0=Č‚ăv,:І°¬|T ,(†_żěÂîócíMČńçěżq]iˇŇęĄÁÍH·Ýć–yöřĚ$H¶«ć/ŮŰŘ@_ ¸ ŘIČ€E +xˇ;„áÓ+‡YŽ-C:±ăC†| KЉ4–üĄ\Ą/ű+q€`]ş“DŚ2ŚĘ¨î;‚8÷ÜY ‚F"2XÁ¤ćU—2ĺZąϢY¸`ŹRŠ`€…đ€ívk…ż‡KdËDnń˛”çń&ČĄ]ęţn)Ś,0nÇhî<’j„Ż«.+µí!.aýFČťĚ ‡!2@ `5˙F;íöşŇ«7‰:ąáçóJ&ĄHH™9"2¨:Cř8§ężňQqPŔ< 4Č©`` GŠĐ ®HĐK€„^0ą†šAHS…K(‚8čÝ&@WÚ7 €Xřz`,Á¸iU§NiÄőab‹ 2]€ČŃ¤é’śŚ¸pijň©ČEMrzřńĂgINkb±ÄŁć ¤6_fR˘dČL’$A‰óŠ #¤~yF›Ą4}l ŃĺÔ©>:ÎÁ2­…âLČ’uDGb,ˇ=,ń‘ţXşRGZˇ \™ŠŐcV©DTT-ş„k ?k𸠢­ŽXLěúó+Ť#:Ä 7kĂ ×z\˛(§ąČŽRf5)’ŃĘF“(WĆĘâKÍ›@m6} ĺŦΠA|ţüńä}QŁF'¤PaËĽhwKÁ8vŔ9„x#–čE Ä)Ě ýňK+¤\#Ć/ŽHc„[ŽŃ‡8ȉ3‰ÂőáŮ.uD(D1‘ô‘™"€“6ÄĄQG$ţ:dÉ+b ŕŮ5P8‚F•(’Č'¸\«5á‡~˛F%@śĹÁcB0Ž‘W9Ú"™dÚrŔŢ0r tšŃ›Íň śš`GR"|D±†"ÝůňĆ0µáĹ`PRN: őQŤP@A#Ť<©ôŇŔŁ$đŔ ¬â )bč0C0!‚I bą ČW´ŇĹp‘´B8$0a )učpD+ż"N»´e‰-~ýrČ ­h#D+3jĂá/GÔŔ/„¸E6b\#M-bĽ(NŔ 1C13 %y@ńG!±TR •=đF)RdâdR$ŇC"‰ÄrĎŚţ 4lââńË ‡rÇa‚‰7»pô›yDÝGljÔĽ¦pâ'€Š÷……¨¬žNµ8é1ÇL;4 € [¨Ŕ>ĺhĂY3 ׇ%]‚¦‚Ř+ŢtÁ„8„LH&ŇE}X{…XhCĘ!$€Ě!ˇ^ăHÁH!PHCGaÁĚĺV×üqŤĘ '…q1»\$f|a±(2ňśčQĆ"qřPF&R”F|hâG,:˛Ë ^ĽQHŽ:D˘ő!Đ8ôĹâ°Á&íÍ2çt—Ľ)ŇHüŠĽŇwśĘ”Q‹!†ˇ`ţĚó`đÁŇ'ÓŔ$ŤäđLŔ’-)Ď — #sr­‚ ŕ]2Y^µÚ8âˇBc3q€8Z!(hŁ×xĆ3Đ 5Á ҰD1Č Ť mČ I(ńţP!ôAXx0¸—/0ľ@Ă|…%T"®řÄ TˇŠLdÂŞ Bâ \Č#ĂĂvQŚ@8î GÇ„q LDĚ€ń žQÚ±©źo§ćdGOśP„wÎńl A@Ë’`† L/n|Ł?'0`äđ€Ča…nĐ#‘ŔŐ5“†VôA~­DÄ’c2!ţç8 `Ő&t m$á Cvś˘=Ă F0¤„6Ŕć j€Ä !Ťk@â”8Ďj1Ľ$Ŕ˘Ŕ€Pf †$Ôâ @Pń†/¨A®ŕÄ&pA…0Ü 7@ |Љ.B r(»±Y Ŕx¨„,1p‰Đ@†-lpS á}0Ĺ‹P„Űeńvt˛vôŕĹîŘ„ ˇĆĺ™ÁI0Â3r°fě`ˇ e3Ž1Źt¨ ě`G ĆŚXá2‚¤ŐŠ`Ô]gĚ2&[¤Á{ŽBú†µ‘âŻČ)†P uč#*Á 0¸äţ łé.ĐŔ‰/˘Á`ČÂÄž7Ä"Ř’E1 A0#Ôâ g(&FÖB_¬! ‰`Ăp*ÜŔ©†0R‘Š„ˇ TEřp>´ Ś'qŤ_cLCgú „\ Ă tjd§ĹÉΩ "á—+ö¤<řBŚ2Q^¤QPô ÝjÔ@µĚŔpŽt°€@E(q‡YÂŇ Dp`‚#Şîi8€a Xě" P(h´QŚ Ä"ŻÂŢ€†!yÁ[}І"zŕ‹,¬O{ZÂ8Q9Ţ@  ‚„!2ŘPĄ¸D"ü ‡5Ŕ‚ Bĺ„Ë­ť#9¶8‡W@=Ě©ĹY,E˝¨ă1~ˇddňgˇj“$Đ@I dAŐVˇ wÁ’ˇŚLbHG=´"Ä/,11D Ü©Ň"a4Ă&8‘—¨ˇ©€X%Ú ?D.›¸F+A†@|ޱ8 RËŕ\T~(‚ }@p‚Ŕ¦Đp ‡Z¸â5hIH#ę4aJçęäPŠY¨âÂE ´0Dˇ tÍDTÁśČ!lţĐÄ1cQŚ”Šă~&ćK_ĐŠŰÍéMź@M!{ +čÎ{Ęx ńăůř ˝ ­,ň@‡^ą -hA <}Śb0PÁ†aśH°Údđl 2#G3Pb€@Yd·,tś"Úp†5ęŃüŞÄ&zA kyÁ‹Épń‰ÍMă9MX„&ÂŔ+„A|PÄz`Š|t¸đÂ>‡ODÁ#XüÄ'Ńęp†ćDĚĺ°T €`"¶1‡9´µÍ,Ă,!)  EĐ'*a44H‰)P$°á‚_°Ó0żâ,¤§ëÄđrÉ6A‰Z¨gnf ţm/€ uU!-3ÂQ=đ Ä1Ş€-”|ÁBoé0¶kÁFHĂ ¸P‡bXB`;*×SŚ7x&$Bľ‘pBsŃĆ&˘0‹fndĄČ Rq ÍÍ"sşÁ ¨p‰%ŕNEC%4aŠ,HÂťŔER1 &­uÔ‹ °zĐe˘ Đ‚‘iZl#š<ĎD'¨PŻE°‹ŔĹ Ń „F› fZ ŕŤG|ťNaŻWÇz自Ĺn7H«)hLC)hÂ4Lś)ŚC:Ů8LĂśÂVl…'“+¬†ëMHě&ĽÄÂŤ…ŹýAüąśţ`”†« Ŕ8\•ć§ÂÁjéäN"„'`ČHÉB$Ŕ@Á.l§)`# 0Ľw,ÁJ_„¬‘(B%xĚ%÷!"€lě4ÂY9 @2ÄL2@ P@ŠBSÝéŞČ¶îíVŹČ®ČŔ”A |ŔÄC 8h °ĂPŹÝů­‚‘!¦ô\ŃÝç2©ÂGLEÄt-˛´;q¤7`0Z˝„äH–¤J¸ÄµRBôÂŚÎ äm¸ŽŢrACĄ–ßÚÝfîä6ČŔ,ZčŔäÁ!B+Ŕ§6üŻČ ĺ6× A0HVâWČAţŕB ţdú hsrÓ>@ĘňVô ĹĹP<-0hě@ ¸ä€í*Á<ĘíF(ÄŠ:Š<˘rl¬aŢA Ü‘qj p\/c*_\ńŞ*\Â"¨AaŮĘ7 4śIšđ(ÂŹ¦oťđK´Ř ńôČäÜ-ţć/Ţćo1ĽBk®·€–Ň‚‡ß&É)śÔ xçTÁqĄEK%GYčŔĹÂHI`Â& Ś7†A&¨a¤¬Ć@ (A#Ä@7PŔQxŔOńEˇÂęŔn<€€€@1¸GGčţ|ŔP@QP€ÍěĐ,Ä3Ä@ÝĹj ˘\¦Č@ĎÉ€0DC Ĺ#´Âq Í)Č!‹0+¤ Ćś`D”艜žÁx 8 \čo”jg1ôńß2÷9í€jÁćŐTç `BÚDB[ÔC$ĚqŤŮŘ€ŕżô@PLâŚ2á‚XŽ ÜÝ)˙-ě@#€ŔĚî0o€¬-˙€.(.<"€ýń ó ü€Ol€/wŔ<¨vĂQ<Üň Ŕ4Ôô€›˙Ş" Ŕ®rµd®ě6ssÄA"XrČ44Ř@±˘7 ţâ Tu¤-ŤÁ1L„Â.ICŘń@ß­vŢ-;Â(§r@)V,§Â"XŘBŕ”üĄM`Áh4Ô _° ű@ Ud‚”A’¤QN)D `5ď@U?j $Ă(APŔü€čÂ1dŔ ś€€č‚@2 V•Ŕ-óÄ (€ř6O4<;ĹMń¤`€ÍĆ*3PŻjť+7DĂZ…A*$Z¦n4HXJĎ ¸źŇ ‹ÖĐč[[Y Äź#( ›ěćžĚ $xAÁµÉ­@˙uţŽĂ8ĂÝrÁ+đ$ZqĹ^4– †pÁ ”ďţQŤZŘŔXŘArÔA0áÂcVNLç-ýĹZˇŔäđęćŔÍ.€ŔNÓňd@d€Žë dŔ €@20Ă{T xŔč‚Đrđ¸.ܶ‘ł4N+Á-`@—CPoOnß6ŕĄÍh# @-‡ÂU[IAś‰ü8Lµ K|oĹ|źC(řk”Dä°­xŹ•–á‹ ţ8‚;-˘Ł.ęža*„Á'<Â^€%ÄźĂxC 2Ř ü0ĂW° UśçhÂ,”AjűA`Z,˛ KŘ6¨r2418T`(Á ŕtŘôHŔnCŔ LŔd€ţ5ďhĎ ·đ¶ŽŻ€.Ŕ 0»’7‚Nßö 4Ă$qk•C9đé&ć4”\Âć¸ĎĄ(\ŕ j‚8ŘÁĂÜ(‰tA+ČąbĄ€äB@‚+čAžě ĄÝÚůw8ÂÔŻë18Ŕ‚˘ó06G¦0ŘPlB„§$Čýś@Ăa_$ÇX…8ä/TD”î4,B,‚¬É\1&(€Âζp«V;ěŔlŔłC@3€ŔČLĂ®K€M+@4C[č|@}CŹűş.P•ß4łE2í”…¦îîj“¸^)¨B•A'tţÂj˛lł‰?třŇčŤB;§@‰ŤĹŘ%@‚ć˝ńfŮsˇ ¬K”ú€sÁ8ÜíDé  â­Łd$ݦ†0ApŤ TM+Tř[OŚ§×Š  šŘ‚/âB„ t‚¸BŮú#Ü€0f4°š*S@sáÎv3čřlŔ€<˝1°€Č<®?{oŻ@@@@LŔngôK„€@wxŔíÂÁ—C äě‹ăهALSÔŐ˝Äęsź‡JÁ)ĚĎÖĐčC'x+ @ ;0°×›BŠ8)ÂóŇ&J…’Đ%O±+ŚÓţ Ř¸b¸Ě BD 'Q HŐ)L“(–l fÇ«A‡~!Aâ-…·.™ $h 8Y®˘”¦…Ę'>aT%˛˘ĹŤ0Dą‰áCŤ´>dËćaĹ]:@ /[yňd8‘aĹŠ Ç2č:ÖV„ @x+/°.] ¬‘ D˛*Z¨–cGKËŤ2—šČąôIŠŞL7dřCĄÔ˘0>´€+@kä,#âşt9Ô…IꛄĽyB’“ťˇ­|… ä+‹Ż@mĽ2BcâźWW4^áręŸ¸˛KF´”ßSÝU›Vâ°Č˛“š7LłˇyJÁŠ•A6\äx@\ţN‹R&•&ÔX$“Lřa"PТAZşÉa‡FŘçNa6Đ%¸"0†żä™ &Č‹c 8F‚µÚ‚­¶JĚ`»Ž©ËlŁD¶) †rR)E\ř°âHM¨Đ*ď| "Ś2L'†¶Ń"Ś6ÄA¦ L ABN9$>Bđ„„0ą¦Ť6Ţ8ă ‡ Â(fp–ę ›nśŚ˘»h†”R)4Ľi¦éd‘89ĂęĆO Aâ˝tú2AÇ‚\„:ŕ3üh"•hÂHR‹i2éánNr#•;ܸăŽxčf€Bđ ° <Č@0ÂV `y$ţŘŔ/Ä ‚"B¸FbµŔ¶r¬k…”H†ť* hˇ7Pč$“E¤ Â3¶±5 ŕ0wPnHE†9™4čH°A¶Cé©RbĺW‚h/ľ ÄŚ^čf—kĺ˘bHţóO‹.‡ ňĎ:ńaÝEz á°8ŔLv:Ą‹sqÁ\xahŇĐď,€Xb•¬`Ă nČ$ p´&«T ĐâŽ@`¦śNđ@— …%Qě ě„ ŚAě$¨;XŔ6[jß’ŕc [ˇɡß;˛”aš2¨80D®ü€‚ţžŔ€‚d0ء7w`†˛%ę°áo &á=BŮ SdÖd‰_’㡠Ů ŹwŮe.2Ę芊1ˇ:@ąćaÎDÝ0â‚m$ <áÉ›AĽ útĐÚ‚üH°Ď†`€ŕĘEĐ€Wy*@ˇĄaÜ(Ŕ‡9T“|«h[—&ŕ,ĐĹ.֯Áĺ-Ůr \ Ó (A Oř@Ě… "ř  Sş ćŕ•4â č@˛ˇ„ €fh®Ŕ$`č?7 ‰A´§'°;€Ą0a‰BˇIřCţp§řŠW$>bĹ*š`3čÄó¦äĹŃ„ˇŚĐÁŁę>Lu!đÄ?ó󩢽ŕD©#.:X‰Ą4¨Ą¨ÁţćpČŰŘj‡śň řá”p €€‚ÖxBH č:rZ„9ÖŢä± °1(‡Ę b†¦ÁĐ*“„ @KJ%čKĚ}@B90f#27 C´‚{&&¨Fť@#šŕŮ ĚP#$á3ŕ9Ç‘qP§ŠÇ#G®aµ8„ztŤi.±†# ‘@‡|Řc)ÝxâŚ.°:^ ÇŘŔxXBř଀˘ŕĆrеTwlj0C´Ř1?ڬ9`ĆNŠÓ(,Űܦµg˝%E¨ĺžJrĂA…"Â6ţ0P€…Ŕe.+ř XŁÉ`j0źĘÂă‘8Ä!Ö„h~·Ş)HÁ)N oâĐx…’‡ŢMgMä<‘¶Z‘ż¸ôâŕSᮚ¸Ä#ÄA‚VôÁS[mĎ?=‘Ř\ÄQ±a˘ŕ 9LC (@ hĚΡ(€ î8ČOl ć° 7Ô ´E*T˘/P¸aŕ8í:ĐŚ´ k/uă-30˘®—‹­d€‚Y21Ŕě0kP…ˇŠ0đ2ą‹—„Űq„Ů0Á×D‚©şĆŘta„0Ó ¤D#řî"Ŕ¸ď 2ţĽă] üµ",îJEßUTX„äІ/‰! D S?Ů‹\Ľŕ°ľAG.‘0ČśĐÄ,„Q€HÎ ŕGfkđB"`¶X™d@•¬iáÖÂ袺L˘Zlŕ¨Á~@–H+,r–ß@y Ăl!3Ş c,ą1PŤ@! 0Äl©…ʱ;€ĚU¸4e#áFÁ6ŔD{ˇŢCPU˝ő>VŰK1Á4čĹ€aťµ^ÁĐÇ»"‚aE(ş‹ŔV…*¤ĐM€7¤¨9…©L8Ž$O¬ů /đa>†ż> PěŕOž—á ţ}EÇYQő4(çÝr\m J\n şÁ1BäŃ­“ ŔNŤ'¸Łµwŕ)(@br"M(:T"d-Şč„Ş ćT¨Ż-!ár°Ť%DB6@†˝ęŐSTŐȨ÷ę0qŠ_Ľ"ľyď 42ťb:1ÄMqpAĄi´˘ˇŠ&řA˛8ť%H*}ţÓžpb_đýB˛x.J1 DvJ@110T $c(€xR‘5¸awđ(aCZ ť†ZkKĄ«p—+8Ű1â¶—NިڔĂ~bPl¸A Űh-dP„ţ(álxBń@b˘™Ĺ4Z­ ެ r Th~ĘAHˇâvˇŇ «ľ„̤Ў9h€řěwŠô+ó‚ ÚŠó!ôÍ]â@ä`zŇKľ'|® R őbŹäćS˘ˇf! ´€ć&g| XhĆŕ”°!„!_´@]˘AąŚŞlV Tjp ëś‹ą(H úç„l/¨N“<`Aş,čĆ ýaç ôŕ €LáôŔ!HAĐŔ ô@¤Şl„6Ŕ€`Ŕa®át $0ńŔÓ‹a°ţŞÎčě €A"zAvgśśhxúäO.ŻxÖj]±ŃT!ä@Ř@ÚCĐÁ 0m|Ц' |BMvˇ¨@hˇÝ0@ >@şj…hˇ „ÁŇ%¶Á–”€6m҆FÄű6ŕ&h‚>ŞÉ‚XZ pův@éşq¶atábn†áŁÁZ’átnHd  nX ţ¬îę&r’ÎćlěBDŚ!ć¦Eî’‘|IݰŤ5P€– ¤˝€†(ěŕŚŔ ad  hÁµ>Ë’^ 16` ˘ă Fy‚#ˇ!߀buˇ Zh Ě Ě@Żľ|çľüäxĐ©^A p˛b‘qJáäHˇź~Žŕ°\ 'Ňö&ö^ŔSRŕ"Á.aśŞ÷NŕN ŔP VŔL@’aöB®Ĺ@â”&ŕF€€ HšŽ.čÂ/Śa¦F$mŚá)§T‹\d P6 ÂDÄş€V |ࢶţ˘÷V@¨!¨A8dÜŕę¬=*E'x"đƸę=îě¸É  €č@ď‰fóc˛AGKCJG ¤@đ€,ĄF#]@'äC>^o 4ÍŇ@ľ@ Ü` ÔM A°-ěbB*–Aô€,G[5iî†[<ţȵ2d Ő¬¬`oíş•¤:Ä/˛eF¨`X /&ë)ýň¸¦!ĂFtÎÁ¤U⬄î€Ŕv¨aö&J`ü÷~`\á&` ÚěĚ ; |żdDĹ@^t"€ˇz zç›twV˙€ä«wňŔóŠ÷xgAXŐ tĂ„)…†hrńőľ§äĐ °ŕ .!r@…đ6ŢŃ/Ľo)—:€G 0V`…ŞĘ@ śË 2A ô`ŽÁ„!ë¤Ę"9 x 8€€hÔń¦L«kj\ÁŔ ߀Ôţˇ~¤”€n0ŘcÍ;xxa8d ô ÁÂˍΡ'zbŤ/†Ő Äŕ’@HqpX"B‘h@’€9fµwvᤠôT!žšâG}ˇä‰{а+±¨VÓdŻ ÄáŢ n N oSd,tL=@‚Ą.Ăl˛a¶ˇ˘a>`ŘŔ`ázŠ@ fá|@ ą<`[†8` š€ĄĄDtá!jŐâa Ra¸ ßÎA tŔ$ r " o€xľ/@Fd1ŔęŚ ÖD#í Ť ©R~čKNUĹŕ¤Áţ€ÁV/Ś€%Ą†‘H8Ćw‰ŮŃbqJ~S ňĘF° I±ÇĽ˘ÂśTĄ .!*I(“RÄh€:`C–ÁlOW@ Ć@€r B č x~!RÁş Ę@FŇBPx`x€x€x ?u-2`(` V 2Ŕ Lˇˇ®gŔaP`÷~`FIB:± ŕčáWadua\Á”!PĽvĂĽBTG´ Ľá Éfą¤ajuwv ’`ąŔ ‚ŔvÍŕ—% faŤ®T!ź{ŔüĘĐCŕ‹9ń(Bţtŕü50`‘Ę1VYĽŘ.¦…."@“ěâ|ş Á ¬ŕ´Ę'Ü€žŕe´€¤ ;¤yA¤W±Éa*śPŽA`ÁŚ!Ŕ¨@ śŠ+Hü :ŔWld » ŕZ[Dŕ9äˇ0Ŕ<ŔË!Ťt›'Úă=‚˛RÜc§ ®%{'ˇŔ—“ŕąkˇ›–[%˙€3t4}óÁ¸[zÓ rQě`Ůx9eaa â$§éfŇ”-vk]ŃwÚ6ü ĘAr`ᄡvÁęŔXÁ'ž.Ę 0 é&€¨,ţ|4xö`Ŕ QTÇ٤˛aŚa:ŕČâ.ňB1Ľ/ĹhxŔJ µ/ŕ&ÁV¤e(€ˇ l€ěŕtxÂu{RŰĂ=0HÁÎww!R˛—ť» ˇNjAĎj3ޏ;ď¤Ŕˇv ° ËeÁ Â`ÎÔ>íŚbO(ĐÁú@ˇP`^@Xţâ/¬EFÁPĆ˙/¶Ŕ őol¬`ZÁ F · NH â ޢZ‚s ´jí@t€€€ţ ÎĹ ě ±ZOz‰Ć€ć َ ¶!ŔÔ/rkę~±goX~`˘†a90L0ćŠ4`Ď!č —Tň` 2‡C‰Ť’`8›$‚Ţ$sćJăŕ@€„ 2„8±"¨8ŘÁĂ &H5jU "ŕM™ň@Ă…I ¨ Á4Lt!„iP$)Ôt‘†,ňgČ^ĐĹDm `žŔ(pBYđ…IMú†^ÁŇh&ŘĐ3Łl( üđ&Ř⸠, Ř  żP'|; l é±Ď0=µÜ$bRF3AçĂp8 6,Ŕ1< %x`O xz74^¨c­÷AY9QqNyH ?X]–&=Ä“$RMŁ=wžŤŤ]Í€.”ŕŽG\c¸†ňµţůhj‚PWč‡(@Af0‚,vńˇ˛ŃŔ‘Ď2g;{— Tb ±Ŕ/ŢpŘBݏF-r… Fd"ă0Aˇ )Ģ}*’šĂő*QŔXčžD€K53Ł÷L ó*Â!<”AĎţ)ÇřÁ>°v(5ŃX€·Ăőmô1Ó ^˛P€–h…lŽČzĂ=Ň Ő¢+R|­mŚô,€ńˇ˝úŐaËC­ˇ@bE´ö »îµŔ RlvĂ4Ŕ›O† 2Ŕ Bq;x&WBˇ #Á ‰Ĺ%@ń]@b¤ 9<Usü)Ŕe$Ç0ĺÝN•ía*ŁçFCŚ"`T,/ŕKN3}5¬Ťř@ rĐyPQ 0 őR‘ĹĂÉŢÔ0B†ëŁÔ-ˇä‚Ú E9!´ÁŇ üoÖPp„fiŕĐ kX`ËCvYhňµţgŘŻ7ákXDb.@Â!\=Hă…0„¦ˇŠÁ‘8‡Ş 4„âk{Ĺ]1 tŕËâ(ćŤ^1éĚâ)‰™§‡¨ř ěĽaĺ›ęˇLL˙¶Ş2°+€ ;Ŕ 9Đ ,Ŕ łhŐ;‘çúŔ  ĘłNŔ4đ LĐdžA$÷Ôf0' r.fłFk.V"`34""/8,´%Ĺs7Ök_ŕŽ@ ¨'éó s h`,…°‹ ¸ lŔv ěň mpˇ µ¸P aP.t “2^rvîÇW Č€‚eFg”vţí:ő:§‚&Ŕę€FźcUá„Ř<ŇÔŤ0Ű€Íŕu÷pű!UΠęŔč€ đO@®° ¤@c!ązž€í/‚ŁV€±‚š%^#ŹĂ3 p!\ x< żwc˝ bp ×đ]`ĺ  Ëb aઠ[m` Ś ¤ŕ•ŕ Y-š ŕLŐ_ţVwî'g‚‚V’ ŽĆTŮ•)ü¨ Mݱw㡠ütCŔ+pMbg ÇłJ@ 2ŕ0véĆvĘ0rŐRA0É0V ‡p‰·ŇG]Qţr.)@b Rg# 6' ¶&Ž{\°ŠW0Ĺp))q 8x4V‹mŔkŇ cş(a± ÓĐ ¦˝¦z@al0 ˛pXpŔđđ ±ŕlrěşđK\˘Lgg]hu˘ Üń•ýQ* HŽb‚U=_+Á/¨ŔT¤ĹłŚxO 0ŤđŐ< @ ( ĺ ň0f‰^SE¤#işP—90cđ‡ĐŁŃGąŕ ʼn]  Ż€b-fHŔ’ń »°Šq1 šăšĹ±gp€ŕ{_° Âv Ú Żţ0']€70 š€o ‰2 EPRĐ ÁĐ6đĹp Ź ~@PŮ[ö2ĺ¦gÚD"!c÷ ç€Qő9 #«PNŢCřá)÷·#0M°Ö1 MXěyŕD€´€0 r§ ę0µ1` ޞúĎ@KMĆG>z. .¶` ×ŕzłÖ đ!‡Żđ ° 0P ©iXšW`ă0ľ /ż|_P"Ijb )0€ ź Q QáV€ lEr F@ ˛°™ĐC™‹°?  ţ CŔ nw^j÷xýaG1k´;Ř3–SÔC?„ puNćVÔ0:ˇđ‘ŕ ¸ Jz0 ‡w۰'9ĐzĺžŃŁUĽ±‡E·ĚĐ&9 Đp$ŔGRs™íĂG$ uĐ›’ábypŠÂ"+9\P `»ŠÁpŁ»j3 ´ Ŕ7¤?g×đ–  çŔG‡ŔR eĐK`Ó00 Óŕ@`EB­0l0—‹°¸ đ2B$08Ó;őäGA§đ äy(ŢE Cr%Cćµ,0‰€`ŕĐJ0wU aţ ť€DŕU°9đ‘Ř   +0>Ô^|i"GJ : Ç;p±ĺđXPÂG·b|SŞĐŞp ˛jH*ú˘* $y5jąjÁ€C ľę«ă0¬¤˝v¬`@ ˝ &* uŢ0lŕn R€  ´ 5 ^đ†` DV Ś*aş ĐP)ßĹ čç¦×#*˛·=ł=ĺˇٰ2ň€é‘9ĐĚŹ`/sđPs €(ŕ´@ pâ§ żˇJ vă¶o˛Q< VwPěкѠĐŕA–©‰P v` Bţ@ŁŻ,$â5Żŕ’ÁŠ0Ĺ´ĽZÉ‹ËK´ľ*[g€Ľfc”ŐŰ R[¤ !ĐŃ ¦ 1° eĐBů°VđVŚđ?h^‹—¸ĐDPh Ł`~·9ehF!*č)§b94üD #‹&-‘B4· Ó pM Đ5P nP›ywé/4ťŰ±L€*1ŕ°wŔ°Ć™0ąbŞŹˇ‰Đ L»:&’’ĽŻ`’Źšp6z´u0Ä‘PËŰ«ă0›€›0¤ŔG˝…Đb°÷ b ]0?żŔŰ5€=P Ą€ţz°ĺ°~€ m@ `@g€ßV ăË Ťŕý…ËT2„ř¦˘  §˙!E†ą „u 1йͰ;€ŕŘEdx9đ>'°ĚT†ĺ„¨ 0+s ‘ O 5Đ UP1Ě0 ]p%75ŕ*G@Ĩ÷˘Á[HݰЦ &ůł5z´ľzÄĘ[F ÎËÄŔçNÜ”@˝`‚. ÚË ç> véšPMP¦ aĐz°y ^@śŕź MZ@ p #L>fFO…2~ĚÖ“ŕ ÜóoC` Ů(Â#ţ… °żíѰ ňĐ €x ¸ŮV"˝p  W Đ”¶:pP@ ¬<z >6z#(Gđ G –@;ě˘/Z[$yšA¬«& «G‹É›ĽBĚuŕÔd¤5†›·I … Íyj&  ż€ đ2?]jÝ@Ý0 ‹°ł sP‹hđ hpe~Đ‹P Ű…+¦–ÂlŠ^7 ¤qëŐ^A”<0ćEŔń1 […2]e ,áNOĆĐťí‘q? ÁŤ@§Ü`żÔ†µ šË°ŔL0ů `p4ţp \p×°łŔë˘×0µ¸ť’Ä{şŠľÚ«M=/B Ë-Ŕ6›µŘkm ˛™lŕ F6 ¸Ŕ ˇ°›‘PĐq †™ ˇe  TŔśn Ďk`ˇ ŽP ‰€ çzpWlć< 96gćŕ „Bžw(ąAp‘ś¨ °mú†ą±E“=v°!WĆ€Ůŕă ·@ mˇ›wů# P `D)\.ŕŔ 10ˇŔB%fŕÜ0TŔFŔ/ŠsżÔľL’Â] ;ŠÔǬÜP]§ÜN-4˝mđQ ŃĐ ?p „«`+P‹€€:K€ ţ˝ Wŕ ´p™°ť`s€R ^ŕYĐ Ď #Tđ ©p”śŔt{Ç=”Ç۵ë6 7„3ß`ĐúÝURˇňĐ×…‰väđwÔ —íŕ € ĐÔ}Xפ·ppŻ-wŔ´“Ô„y̲pP'^€pđ ż@€RŔJpĎ `›˘y.jĽp¸Ęš?¬Á`ÄG,ĘťGpÉ o` ™ęđhµF%@9 OúÚ@LĐ.„đ upiđ EŕâëEPÓ@@@”а ¸P T7ŕČb§oř+µa2úđ_`BUngţUú= đU łjjFSdf\ţȡ@A'—Ұĺ;l°A‡HŚhŠ0TymBˇ!MpIÄ”iŘŕc$@€!F)n"ÔQç¸ă¨)‚ 3P „Ś@Ř`‚á(ÂsX`/Ž`]NĐ…)Ć('šLĘ\Ä =â`ä/¤ŮÄU|H†…‰†g™ té„v*†Ŕď’Úŕ„°:&‚Qx€I<( (ţřĂ.ę˘ /˝fŚ„ÇĹIăÂŇ—ÇĐ` t5Đ€ž=0ɦŔ b&HV‚6xbWÄÉE&ú°ÁAŇdyÄ )\!d0ĚxĹ6`iĹ•n”X•ţ„“GáŠĹă8@EVc(ő`…ž ™0P"–T‚Ŕ–0ÔV¬śm„É/“8Ę”#a\9…20ńć6Âa86'V–ŃĹVk>ŘA×0ŕ‡8XeVXaktˇYjĚáž)ȉÇ0ţČcąXtqĆ˝ř"°>‡0Âx €x¦(]Đ•r 8F€=J€a6(dž:ř,„ĐA–#Ŕ`¤C~©!°°%`¦i$ĐłSĄcŽ}tň”t2í@ \1ŘťÚÖ%„Š=AćAh„P:)ă{*TąÁŤ@HF†ţ*„ŮEŚW†Ž%|(ŕF4`Š$¨Ől(ř€™ŻőŞÇpŔAFˇżµmm;€•2ń.9 €€ßú梼®F‚LÄQ¸q#rđ€ä¸rťrĹc9$!‰o8 ۰,l  ÂvpaщĆ$8 ú`‚>ŚĆv`Ä:`¨›DZÍ%<Ą„+ŕ‚Ńlcz@đÇ`@J´A¤đ hÄ@9A­ÁP„‚°řÄô€‚`@UśŔÓ¶)%4‚AĚÜńđbĽĄNĐ袊ň‡22c€ đţ đC€!—qÜE/{\+ú0W¬LĐuâ\ĺ2áă¦0 "%0á;ĚŃ€¨ÂGÇ! ń‹>ŃąŤ `;‡:Ŕ‚4-`‰2hlcR„ŹÚ‚s',§ŕb¦˛aĆä (3ŘÁŽtŁŰĹ,Ř@…90Ă (ŔH‚ 4Ŕ,¨f…2xˇ±hB*Ę1†™M ÷CĹ(PśŕŔ'3â1w¬€ ń¨ţň5Śl„€zĆ Ffśa€w=Ŕ `Ú° „ ÂŕŁ>xđKłŚ¦€KśŞë”I!T°si€ţPĆ¦đŽ°€1(B/2t!B@‡-´itŕvŔaÓ q\ʇ&-Ą3BM=0Ow K ?ŕĘŘ1‹"¤"© ‚\á a0âŽ`;$ŕ=tĘ@7üŔW<ÂϬ€‹5ŕ‚ (ŕF ž°²Ĺ+ޤtˇŻśÄ l €V±eHŠHř°©s7•Śăś '` l8Ą‹ęp„:µ¨âŇÁ¦AĐRŚ› `ŕŐ©:Aľ*H@=ę‘€r9ŁÔ‚e4@ ExxC1>8Đ "šč° A׸2!0@¬ţ Ęđ]Ś@Š ”` äMńQ@Ţů €CK`ŞŇĘq< h°bQ„%pâ5–ŤĹŢ×ĆaŸř| 9T"˛&R4ŕş@±”vtŁŠ!Xŕ..ocÁP±gT·\×ĹA¶+„â &Xe+‹ŠŁ¤~P\ŕeŻ9ś´Ëy= Íő¨€’Ř; ,é‘@ ü †B`A_2‚´iMA8‡™&Mtp`ř‚ żâÝzĐ“BA1ĆxO­NŔ” ¸BvE%ôŕ‡,´á­…@Ś< ™řzP)„!ť(Eţ2ńě2ÜS«ýt1•ڬxňGĘ6 đĘnčFx°/·¤BkËĆbł±ypÍ^µî<¶€ű&` Đ^—˝l+06W+ŁrMćđsš˝S:óx€ĽśŔ8x”ë"ŘĂ1ÜĐ/ˇD´ĺ:W0áäEüŇdÁSČAJpZ’ž *!8ňt–L­lúÚ â°i`DĆ"üp‰h€Âˇ°‚v É`>:"´ 4üha0`Ť `ť(1l:ಜ|Í ařÁ"€ŕQjgXěĺÁ†rÍöĆţPÄ#ÓxČ †đ†wpBř–xů|I”€$«(A(· Đc7^NG4px\ś€/<ĐOW°° l8XţW8L¸4Ě2pPL8€Ś…S€ühś©jÉ‘-ŮT€vŘgx x2(ˇE3€ؤ¸źósĐ«Âřš “f(–y]vđ•hĘK?č1€…/ŕ„KUřNĐP €ŐĽX€ĺŕ €F(Đ•ˇ” š`µ™Ţ)¤ŹX€Uŕ^@ŽxŚ”h5ť»l»[;é_•8ř€*‡r(pĐCŔ„V(‚9#}f؆Ă 8Ř8ŚÓăóŽsűŘť‡Ź4Ń ¨ŻNÜ‚Xu8]I„I0‡=„Hţ€ß4sŕTŕ¶Y1CTXčĹty*ćáĚ“‡ůmTH ĄÍ€‘ę†TH¸†W‚,č2ađ(Č„Fŕ?sŻŘU†…(ŇFxkP‚J¬1۶áWőčŽăJAś_yĂS‹ Gŕ&=•‡Č€l8¸p‡;YčLč@¨"¨8Ą€‡ŕ†É­‚îc†~L@ŕe(wÎŹ,ĽŇa“5ĽčĽ2}ŕ…I؇Ę(Y]d FaĎ ¨)z`€sáÝ ´3‡–č ŕ€Ł©  Žˇ«=řiČ$xD(Đŕ+ţ(ĚűÍ[p6‡­ÚG8ýH4ÖsŰ÷‡7>h‰…Há6Tŕđh^Ź=ţ,˛Ű ¸ZpY¸‚.8o7؆m`†‰D¨č±»h ăÜ^P Ú^ĺҬI`€‘Ü’m‡t`€Iđ$(ŮzĐI ‡Q0” %’ýäP– ˛ÎQX¬ €z2Їű€x•8w5 0„6¨„&8˛đJŘyX\Z?3‡pŽÉ x_ăŚT€aáĂ ‘ăH…ŕę eX?áĺŘç…¸ë=X‰8b”( ČK;lB¦‚ţg¸ˇ*p ‚¸‰ľPŕÁŞ€a-›Ě%u4MÄ7‘´/T•Ŕt Y—Fř„LЂȄ,HÝ^Ń…‹IÍq/PR™d C˛ľżçÇ«Qw>®ăç„ç†8őĆ놎Ź!y`§a`L.€0``„b'%‚Ć•PĐ‚mྀřcČś%nÚĚFťŇÄS]0YŃ=ÄS ĆšA¬ű“Sj`APúeč8XQɸI †…—‘>-(Mŕ%¸jnÔ…%ŔW¶kÍŃÔcq‚ü3)ŮŠč€č˛ă‘Izcpćjäăwvy˝aá˘ëŕhţh‚JđR°âT :a6"0ż*Ř€A‚€€×=x/Oďĺ_ĘI ·đzÎ>Ń-€ezđă‘U&‘„Ű<Ź)c¬8Ť·Ě¸Q0€ó„ Ŕś=— ť^&Ó…*x a¨Z9H¶łÓ<ŔjUÎĽ=P`¸›jŢť p`C8ÜGP€•Y†`;Á=n—¸ő긍Űx…çč Ź?¬ĚDúĹ)čP AŔW(@bTDđh†žŘ†&ýTdáÓëčĹDĐ;t ß‚¸ĘŔΆ‡$†«Ş8 ɰ`[1#hřŹHq€•*$ţW—Ď8vP"¤H W7Ş@‹9ĚAŠ´'"ř•ŠN¨˘x@ 1A€>â*0 ¨dd …©ÁČXäWnQA`Đ9Ńq|¤Ç1”HA*cňh/  —,rXsy5XP·šĂä Ć”ţ@‹L\=C„ŃjCx‚@°ȨcQ»–9x1„lŕ 5E2Q @ ş@8†PŽ'ĚPAK›bPĆĐtjaŘBqŤ3$‚ (C Fb $cwhĺŘ؇*8q+´@„„‚iÄA±ř!Ľ1Wx`«ŕĹž6FHĘĚA uđ€ „(Î2PLKa«Łcł##ş´ŁN ‡8Ŕ0ň`ÍŕŔ‡Ú!,105TCŽU¨CŁ €( …2PArh‚*2%qŕ—ş @<,ŔŞi.y™„á|ČÄ<™ţó­bw †$QµK™VŰÁ. Ő׍ˇ ÚřB.‘ a̡50ëîtťěŔ SătĂĺdpĹKT‡ŔÄ!ńT´r^ŘłŚH  8°‡H‚JSřß[ C]Ô oą#i¤;)Ă4ÄdŕŔ.Ż­Ë®ŕaŔuă*Ę+"BĄCâŠa@ŕBśË‚o@"×úĆ7öÓ € aX„*¤v(ŐŤ˝U°pseE±gŚ‚±%îRˇŠ2”!ť(@R Ů@Ŕ4÷řźśťđ0;OáľJ D&1„1Ě zŔE)2‘ ahŰ(Ŕ}Ş`ńrlŕt]«Ř‰R0âż 0fŃkŐMşŘâE8 KŤ—CmCl DŹw±#†@;pĐďiYukq‘K;śđę)`é¨@‚ť%ţhX8Ű]* ąeu ˘ G ™Ut4(? 7!q-P! XE $ „¬5yv†$x±Ś| %EËÄ,ÂP/É€şÉ*2°{´EµNťŻÚ˘:S«Z𸓢‹ľw"2"î†ĎkA ű…0„!TdB Ś)€áŠđBĺŘú¶|-‚U ÁCŕA§ÉŽ ¬Â\đ8‹žĄŔęýVÁ<4K­˙U}ąš ÚfőđbCGšT #ĚJBq†iR§[ÜC@ Á4n ŕ–Á ŕ€

Č Ö¨C¨ŤŠh@‡I€üĘÔYŻ]@óˇX»Ü‰NmßÓ5‚„Á 6`•é Dś•`Ë(<8Č @dB)PAm¤ÄOxX”ŇÉ0ŐQlA5|ŔN­ˇEnĆluC*HA(–Bú]'řŔ4śâ4tB&,ÂĐŔ+čAţ<,@ŢCë0ƔԉÁ°€”@9¤B,DăpÝ=`°@†Ő=„ŠÁĐ<ÜC҉‚śL‚ŕh)†”ŔaÔ‘BĺxTÁíAM B¬€ěŔćí 64B, ‚3¨‹ÂĎ*IL0CÜTA'4dÜAÓ¬€<¬Ŕ,ŔK@b1ĆY Ö| éĽOÂ@"ÝĂ1ěCPź. (ě‡&\Â'˘*Ä—0B93¸ŹŚÂŚ^ »Ü  4M^=Đ2H‚ÁčŃ8A‹ † 8Á¨ LBtŔ䬀:”zéţC€M]ôÜÍQś±ÂŔyŐÄä`O©D€.(A h8(ŕĐ–Żµ—â\Ŕ=4Çx™HÎÁ'$™¨Â4€Â.y€şu*„% M(“A€\€ dťFÚŃ48*CLÂ(ô”;CřAŕ‚ČIňA 0;ލCáL čĐM”iLAa<ČĎŰPť'ýłP"‰A@PŔL/„Řq@@3lAŘÔb°HAéĘ<´=Pß*Ü8.[İR=éB4ÂHěIl@9”€(@ z˝Ů7,€2ěÁLŔ ŔËHÁ,tB4ţÄ@#Ľç °Ą8 ÝÖlâĚ„>†@żAă= ˇRîNŐ çŚÂ0°($$ 0B<(Ě|Ň0„Ď1€<Á‰éĘC…Žěµd]&ÖQłČaf˝ĹUÖL<çu’H:`–Pbw‚ă=Pß„CÖČÉ®đ ŹŔ1°@÷xŔ ˘ĺŔ¬ PCV˘WeáhÝč°€<,ø|€ČA€Ă€Ŕ wxŔ0ˇ®8Á®Đçx*íQóÍš:Ş„BćX:ćC@€+€”ĆCĽ ×-`<@Óń€$Đ­)15Fy–Î…‚cţýO;¤M]ČZpC€(íăě ě@h€V]¬)F©ľ h 5ěAdHŤE<ŚZŔ |@ ŔÁĘ (P€>źN‰±Î 55l_9L&dB|ŔĽ†Č `ĄNéŃדCD^˘–j‰a–RÖ‰aÖ×xHˇćeŢ(€L( ÄP{h1`ČŠ©S2™Đ>|ÍľňëüčZrZ]:8Ŕ-Ś‹š…5„ Ü`4ĄbĽEˇV‹ZÔÍyp@¤ÚĚ))Rš 4øA4 D€ ăĘ©öŽâ4†*Ľ-\Üf%w¶jxeCT:%8ž ý1p@Ľ]šŽÂ*$+5<Á¤Ň<ŕ€‹éś˝ÍÜÉ›L€,.°îBc^:„(”@°_9,¤L­Pw\şP‰”d„„Ő„@@z’ŕ'\BĚ€5Ą)áŚÂđ@‡<Dt€„XÂP‹A.:%‘’‰%@Dé(Ö«]€„FúW›Ě‘”r¤ĂŕÚZŔ«ŞŔlÁé+‹|ÚL ţ¸ Z€MyŔ | 89äm lAřĹ)eóĹ–ëHB:˛Ŕ1`ë(€=‘ Vš…i\1¨Ă1ô©HŰčÂ…±€ŕČ–2¨KÁ_./ô¤lŔ~t‚¨Â (¨ëX,1-ˇ‡2Śm=`&ŢĂ>\V‰)©a¤Ă«€=Ź$|¨·ˇ’bÄ7çŕĆš„ÚDx[(Ŕ…RjčqvV–@‡ń€tEířTţKD™,‚+¸B%PA7€@#7ü€€2@ŔŽ21Ěäâáh€ţ€Ă ČŹľÂl_\ńŇuŤŐŮ娚2ĐS8@°bë°ëŞŁĽí˙çžáÄ6ËLC™BApÇÜB3&KŔÄl@7ĚÉ$řŃĽ‰°Q58@Y4¶đ€4ĂČË*  ޹à Ě$ňđť.Î2¬1°Ŕ,€(L‚ď4fËk¤Ś¤.řA","(Ŕ$™0<ÁQś|–Ŕ&>Ŕ8ŐpČ–ŠŔ4Bý®­Rn¬%Ŕ<al|@°Ă €"NB$ţŔ,ű(Ě®X_Ŕ… HB”Ăč«ŕ«8ñ-ŚALC*ŚÁ(ÁŽéú±%q„§!¦ĺ6 ČpF€äč(=Ö Ąç‘LĂ%ČÁiű@ŢŐ@&€Â2\K~vŔ*dCŞÚčűĐ“ éŠívÓ™ÎnW]Ăî@4p94B |Ă(A¤CŚŔ<Äî«1€B” ÜÜĘăfő´TŤŠąí1”@ŔX°.áq†LIČČŔ$\€>xŘś¬‚La@â«3č*;@ü@*DA ‡47ČŔÁ*¨ŇiD-ÔxŔŚřÄ/dDy@8„©|L3h P.ŕB4Â2°C4`<”ŔE›Ă7Çţ‰_U 5}*ĚÔe–éäpi:и @Ă×h x>$€ Á>ĽŤTÁ‡t/ÓŐĂ´żţhłn°á/ż5!˘@9ě†RydŘ6\vĺH鲏›¬0…Ô9řTtC:,(oT4B €0|ź›ED\ /Č”(A2ěŔ” ˛“8ŔäÝřPUŠ đ]$‚*°.ÄC*LČ}Ł /ü@8ÄÝl× ™Îdi†4(V˝ †„oŔPňŇĂ]B´0€3üŔ€9Ś p§ű ® ŔjüĆlTzłÄÚ®©ŞŔ1Ľ 00ţdĂgŔ&gŔ ´Ő,UĹ,¸ŕ–CH‚:čL€+ńĄČ,#Ś&@ `30 >ĹC©,>@D“LBáą5tG@௨鮂” dx¸ůä€BA"BÄÁ6|;ĚÁ<Ž…sp(ě€č$Bńč„ŔSc tPdUň@CŔ€:Ě9pg›|ŤR: ”nĚ©ŕ ˝S*”(€)şJ¶†LD€1č‚W¬ëlh‚$€¬uwëěÁÜ,‚’5Ł­öTŤ- xK´-DE6°®ÄŔ1ě¶ě<ĚÜAţ4Bx”Z)(°A%¸ 2(ˇŁÓĄiPdÚ–ăÇ%¨É“GmČ´L>Ir2ĺAČóśh¸ Ś)˘´ĽpaJĚNT¨¸ŕC r|Pf`‹ĹĂÓʰpňÔ É§*pŕ¨Ys Ő-Y«Ríj5ADĘřŕq]VD ŕI 85„u’˘oĘ–y .8+1 ž9uJ aŐ(y n<7…9s{ÔűPŔM :H\ÁBť˛={Vq€ŕa‚‡c+H°ÂÆ'Ű2ąâäćX„~ěVJF˛9Ó‚0hMÉŠ‹ş¦Éą!Âó{0EĂ‚đLĆśb@’†¦8ÉĘ"GŤ1J2€Đ÷`Ţ1 [4ŔS1ď¤IÍVÍaÄĆzŇ1/ެ®2ĐĽ«ĽÚ"ťŞşJ@”„)#•;0řa]3f!8mćđáaT’n bśč…‚cVŕŘšc " ;fox1.6-1.6.57/adie/big_gif.gif000066400000000000000000000035651326741342000156250ustar00rootroot00000000000000GIF87a ÷”†|ÔĆśdF4Ħttf\<&ěćĚ̶„´Š\\2$„R4äÖ´”fDtV<, Ô¶”´šlT6$”zdÜĘ´ôöěÄ®|L&¬–t\>,ĢtäŢĚl^TÜΤtF,Ôľ”Ľ˘t¤vL ¤†dôîÜ<Ěľ¬´š|L.l>$¤ŽlÜĆśĽ¦„„vl´’d„bDěÚĽ”nLIJ”tN4Ôľ¤¤~TĶś|V4üţô$ D.$ÜÖÄlZL4ĽšlT>,äŇ´d>$|^DüňäT.Ľ’d¬~T„fDD&ôćÔ\:$4 üöěĚ®|ěŢÄ, <"¤ŽtÜƬĦ„śnL|N4 lF,„Z<ÔşśT:4ś~\äδäάÔ”¬†\ôň켞|´–t”bDܤ̶”Ľžl|bDŚfDD&$üúěěâÔÔƬĪ|ĚşŚd6$„V4äÚĽ”jDtZDÔşŚT:,śvTÜÎÄT*¬ž”\B,tJ,$ ôňäĚ´´ž|L2$ś†ltbLŚ^<Ě®”äÚĬŽdŚvdtZLD"¬–„d:$dJ<´Žd¤zTlB,ÜʤĽŞ„´–l”rLtR4Ô¤¤‚\dB,T2Ľ–l¬‚TD*ôęÔ4 ̲„ěâ̤’tÄŞŚ¬Š\ĚşśŚjL̲Ś\6$ÜδL*<, ÜʬśrL|R4äҬśzT$ Śb< ÔƤĦ|ěćÔ̶ŚäÖĽtVD,´štT6,Ä®„Ģ|ÜάԾśĽ˘|ôîäĚľ´L.$l>,ÜƤ´’lěÚĤ~\üţü$ lZTĽštT>4äŇĽd>,|^Lüňě„fLD&üöôĚ®„ěŢĚ<"¤Ž| lF4Ôœ̶śĽžt|bLüúô„V<”jLÔş”\B4tJ4´ž„äÚĚŚvlĽŞŚ”rTtR<Ô¬T2$¬‚\ôęÜ4¬Šdôň˙˙żżĽ÷«˙ż@ÄĂó‚˙ż@.xgľ@@, ţ˝ĐYá‹H^xjÓÄťÜ41ăN9!ZQĐŠ•&,D:@ň%rŰŠO¸Č¤iL«G¦PAI•ĘUq’°ÂÇÔ"T(”XĽ”H•*v¦Ô’bĚ *đâ†?¬XQőHÉS3®,Z”«WÓ«”Ŕ‘ś‡Qű¶áŔ2+Ůrđ‘°'U˘´­”¤BUĄÝ$U<¤°0Ę‘S¦ś8!Á¤Yh>©ţ HŐéd¤f8bĄ€©YĹŤ ˘`ѧ8q‚µP«Ä´ ‰,‘‹*%(1+r4pĂ"¨2€>|ŃŔA,âD!ś¬1Śh|Â#¨ â $g”Ę8BŠ Ä-¸r $§¸â‹žHó„2g4P@GOđ!‚>č˛gµ|rĚ'2°‚'MĐ9äŇš‰ ±Đ;9„F /dtÇ'ţÖ|’D-îÄQŚľěI†*ĘäpAWP$B€$Ş@6ŻřâĘ6ĹřҲ~Âşü1E®P(ŁĚ¨ 1 Ŕó„±V”Łť/IÜwi-µÜ҆ls@»ä  Dt;Ť˘đ‘KhČÚî u”C0C|rŠ"2¸Ă„;ÍČŇ+*;Ń+K8ŤĐ|BB0ITÂ:îTL†3QAu(€2¨lĄŔ A #„O\ŇÂ}ôáŽ;` Ś;N$QŃ|2ŽËŞäKU,’Ę đčˇ 0îôÁ„ĘŃôÁ‰;¬âK0^ßRDZŕŃ-{áT·čŔ0żá1oĹ Ăú@‚_řÂĂSĂÚĐ,Hx;B´– Făz^wsÂŘľáŽř‚Ă[`>!I@kčĂüň†RVµ8 đW‰mÔBeß F}Ć1’pxΨ\Ö|ö:€d Ă.(Ľo€áů Féç_|b]sÇ;fox1.6-1.6.57/adie/bookdel_gif.gif000066400000000000000000000001701326741342000164700ustar00rootroot00000000000000GIF87a²ŔÜ€˘Ťh˙€,Eş!,.Ą{€Ę%î«Ŕ uš"Ž4śEÁ6ĎQŕşU¬@\qT&"ń¦@&—Lc•-p!Uş7ŕE;fox1.6-1.6.57/adie/booknext_gif.gif000066400000000000000000000001611326741342000167020ustar00rootroot00000000000000GIF87a²ŔܢŤh€˙,>!,đ0.8‹[¦olĎ@y'J$4ś6Ű/,k5!ÜŃ 7+\¨!°őT XLŐc(Y<ß24 gX@;fox1.6-1.6.57/adie/bookprev_gif.gif000066400000000000000000000001571326741342000167050ustar00rootroot00000000000000GIF87a²ŔÜ€˘Ťh˙,< Ń!+őVŤ¬a¶]WĺYP¸IĄyFA¨kë›L4+;CnŽŔڵ6\Ż"ë8ŐdŞśBĐ[Y ;fox1.6-1.6.57/adie/bookset_gif.gif000066400000000000000000000001421326741342000165160ustar00rootroot00000000000000GIF87a²ŔÜ˙€˘Ťh,/şÜţ0ĘćŞ<ä}ˇ3 CÉlßŕn¦¸.ą^ô^km˦GĄ Ŕ2Ť;fox1.6-1.6.57/adie/close_gif.gif000066400000000000000000000003361326741342000161620ustar00rootroot00000000000000GIF87a„˛ŔÜ\V\|v|464\ZTDFD,.,trtlf\TVT\^\tvtlfl$"$<:< TRT,c ŽdiÂ@ćXG€$„˛Ó8„D [I2ˇP*–€1H F t©`‰ K%j¬1EÄ2Ą\‚_!QrŃŠQ s‰Ö©R°»§¤Ep‚7% ‚A„-hy-ŽŹ#!;fox1.6-1.6.57/adie/colors_gif.gif000066400000000000000000000002021326741342000163460ustar00rootroot00000000000000GIF89aň€€€˙˙˙˙˙˙˙!ů,G Ńű0éŕ’3ËňřÔÓdÂ7HU ›#±-ImÝBĆhgß#X§@|…báeá$†hTsÉH TŃńf‘©p0;fox1.6-1.6.57/adie/copy_gif.gif000066400000000000000000000001401326741342000160200ustar00rootroot00000000000000GIF87aˇk˙˙˙,9„Ź Á­„ě™8c°ZŹB“4ŚßŃ1ĺT×(”L¦Á »K5‘î»ÁH™/V" ćÉŤ& ;fox1.6-1.6.57/adie/cut_gif.gif000066400000000000000000000001311326741342000156410ustar00rootroot00000000000000GIF89ań˛ŔÜ!ů,*„Ź™q¬č@|˛ŃƤůBíAá!ÂśÂz­Şq*ń›>sŤ'wŰ=*;fox1.6-1.6.57/adie/delete_gif.gif000066400000000000000000000001151326741342000163120ustar00rootroot00000000000000GIF89ađ˛ŔÜ„!ů,$„ŹiÁzńL Éą0­Ő«y’g]äÇ…‘Ö­JhľĄ*žô‰+;fox1.6-1.6.57/adie/delimit_gif.gif000066400000000000000000000002721326741342000165030ustar00rootroot00000000000000GIF87aă˛ŔÜox‰Y`n›¨Ŕ,07…ĄŘ`nÓl{Îx‰ë07˙dđ$)l07bHR,oČI«­AčÍ{QŚdišĆĄ®Rć˝\%žtyČŠkr(‹ H,‡„A GcĘžGA`94V ž*ăxŔGŚ2«ŐXđńŮŁj»IńüĹ5÷4'vw%\zy|} ‚%)…‘’;fox1.6-1.6.57/adie/fonts_gif.gif000066400000000000000000000001351326741342000162030ustar00rootroot00000000000000GIF89ań˛ŔÜÍ‹!ů,.„Ź Áí‘i"»äT‡ň(„â(\ˇ!˘e'X)ziŻâÍ‘|ŢŹýü÷ă¤\;fox1.6-1.6.57/adie/help.cpp000066400000000000000000000631571326741342000152070ustar00rootroot00000000000000/******************************************************************************** * * * O n - L i n e H e l p T e x t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: help.cpp,v 1.9 2006/01/22 18:01:12 fox Exp $ * ********************************************************************************/ #include "help.h" // Help text const char help[]= "\n" "\n" " A . d . i . e\n" "\n" " The ADvanced Interactive Editor\n" "\n" "\n" "\n" "\n" "Introduction.\n" "\n" "Adie is an extremely fast and convenient programming text editor written using the FOX Toolkit.\n" "Besides being a nice text editor, Adie is also an extremely convenient file viewer, " "supporting a plethora of methods to move from one file to the next.\n\n" "For each visited file, Adie remembers where in that file you were last looking, and " "which special places in that file have been bookmarked, so you can quickly return to frequently " "visited places.\n\n" "Project browsing is made easy by optionally displaying a File/Directory browser side by side " "with the text so files may be visited by means of a single click. Files may also be opened " "simply by highlighting a file name, compiler warning message, or #include directive and hitting " "a single button; Adie will search for the file in the same directory as an already " "loaded file, or in a number of predefined directories (like for example include directories).\n" "\n" "\n" "General Features.\n" "\n" " - Programmable syntax coloring and text styles.\n" " - Active or current text line highlighting.\n" " - Optional line number display.\n" " - Preferences are configurable with convenient dialogs.\n" " - Text size only limited by available memory.\n" " - Persistent bookmarks may be set for each file.\n" " - Persistent scroll position is remembered for each visited file.\n" " - Wheel mouse scroll support.\n" " - Online help built in.\n" "\n" "File Access Features.\n" "\n" " - File Dialog supporting bookmarked directories.\n" " - Dropping a file into Adie opens the file.\n" " - Single-click access to file using File/Directory browser.\n" " - Visit recently edited files.\n" " - Jump to file and line number of highlighted compiler warnings or errors.\n" " - Customizable list of file patterns; show only source files, for example.\n" " - Open a file by highlighting a #include directive.\n" " - Customizable list of directories to search for header files.\n" " - Detect if file changed outside of editor to prevent accidental overwriting.\n" "\n" "Editing Features.\n" "\n" " - Unlimited undo/redo capability.\n" " - Cut and paste to clipboard support.\n" " - X11 primary selection support using middle-mouse paste.\n" " - Drag-and-drop support for text move or copy.\n" " - Brace matching, statement block, and expression block selection.\n" " - Up to 10 persistent bookmarks may be set in each file.\n" " - Search and replace history is stored persistently.\n" " - Auto-indent feature.\n" " - Strip trailing spaces, strip carriage-returns for DOS files.\n" " - Indent or unindent selected text; clean indentation.\n" " - Search for highlighted text.\n" " - Goto line number, goto highlighted line number, goto matching brace, goto begin/end of block.\n" " - Fixed word wrap column, or continuous word wrap mode.\n" " - Mouse wheel or right-mouse scroll support.\n" " - Customizable word-delimiters to select words by double-clicks.\n" " - Insert files or extract highlighted text to file.\n" "\n" "Syntax Coloring Features.\n" "\n" " - Syntax coloring is programmable, using PERL-like regular expressions.\n" " - Syntax patterns are keyed to language or file extension.\n" " - Text styles including foreground, background, selection colors, as well as underlining and strike-throughs.\n" " - Syntax expressions, text styles, and language modes can be set up from convenient dialogs.\n" " - Color fallback mechanism to minimize style setup hassles.\n" "\n" "\n" "Starting a New Document.\n" "\n" "To start a new document, invoke the New menu, or press on the New button on " "the toolbar. If the current document has not yet been saved, you will be prompted " "to either save or abandon the current text.\n" "\n" "\n" "Opening and Saving Files the Old Fashioned Way.\n" "\n" "To open a file, you can invoke the Open menu, or press on the Open button on " "the toolbar. This will bring up the standard File Dialog, which allows you " "to select a file.\n" "To save a file, you can either invoke the Save or the Save As menu option. " "The former saves the file back to the same filename, while the latter prompts " "for an alternative filename.\n\n" "You can quickly navigate to the desired file by typing the first few letters of " "the filename and then pressing Enter (Return); use Backspace to move up one directory " "level. Control-H moves to your home directory, Control-W moves back to the current " "working directory.\n\n" "A nice convenience of the File Dialog is the ability to set bookmarks, so once " "bookmarked, you can quickly move back to a previously visited directory.\n" "\n" "\n" "Opening Files Using the File/Directory Browser.\n" "\n" "An alternative method to open files is the File/Directory Browser. " "You can display the File/Directory Browser by invoking the File Browser option under " "the View menu. " "To open a file using the File/Directory Browser, simply click on the file. " "If there are many files, you may want to limit the number of files displayed " "by specifying a file pattern in the Filter typein field.\n" "The pattern is can be any regular file wildcard expression such as \"*.cpp\". " "By default, the File/Directory Browser shows all files, i.e. the pattern is \"*\".\n" "You can switch patterns by means of the combo box under file File Browser; " "additional patterns for the combo box (and File Dialog) can be specified " "in the Preferences Dialog.\n" "\n" "\n" "Opening Recently Visited Files.\n" "\n" "The recent file menu shows files which have been recently visited. " "You can quickly get back to a file you've been editing simply by selecting " "one of these recent files.\n" "\n" "\n" "Opening Files by Drag and Drop.\n" "\n" "Using a file browser such as PathFinder or other Konqueror or other XDND " "compatible file browsers, you can simply drop a file into the text pane and " "have Adie read this file.\n" "Of course, the File/Directory browser supports drag and drop also, so you " "can also drag a file from the File/Directory browser into the Text Window.\n" "\n" "\n" "Opening a Selected Filename\n" "\n" "Selecting any filename, possibly in another application, and invoking the " "\"Open Selected\" option causes Adie to open the selected file. " "When the selected filename is of the form:\n" "\n" " #include \"filname.h\"\n" "\n" "or:\n" "\n" " #include \n" "\n" "then Adie will search for this file in a sequence of include directories, " "otherwise it will search in the same directory as the currently loaded file. " "You can specify the list of include directories to search with the \"Include Path\" " "option.\n" "When the selected filename is of the form:\n" "\n" " filename.cpp:177\n" "\n" "then Adie will not only load the filename, but also jump to the given line " "number. If this file has already been loaded, Adie will simply jump to the " "given line number in the current file. " "This option is very useful when fixing compiler errors.\n" "\n" "\n" "Mouse Selection.\n" "\n" "You can move the cursor by simply clicking on the desired location with the left mouse button. " "To highlight some text, press the mouse and drag the mouse while holding the left button. " "To select text a word at a time, you can double-click and drag; " "to select text a line at a time, you can triple-click and drag.\n" "Performing a shift-click extends the selection from the last cursor location to the " "current one.\n" "When selecting words, words are considered to extend from the clicked position up to " "a blank or word-delimiting character. The latter may depend on the programming language, " "and so Adie offers a way to change the set of delimiter characters.\n" "\n" "\n" "Scrolling Text.\n" "\n" "Using the right mouse button, you can grab the text and scroll it. " "a right mouse drag is a very convenient way to scroll the text buffer by small amount " "as the scrolling is exactly proportional to the mouse movement.\n" "You can of course also use the scroll bars. Because scrolling becomes awkward when " "dealing with large amounts of text, you can do a fine scroll or vernier-scroll by " "holding the shift or control keys while moving the scroll bars.\n\n" "Adie can also take advantage of a wheel mouse; simply point the mouse inside the " "text area and use the wheel to scroll it up and down. Holding the Control-key while " "operating the wheel makes the scrolling go faster, by smoothly scrolling one page at " "a time. To scroll horizontally, simply point the mouse at the horizontal scroll bar.\n" "In fact, any scrollable control (including the File/Directory Browser), can be scrolled by " "simply pointing the cursor over it and using the mouse wheel.\n" "You can adjust the number of lines scrolled for each wheel notch by means of the " "Preferences dialog.\n" "\n" "\n" "The Clipboard.\n" "\n" "After selecting some text, you can cut or copy this text to the clipboard. " "A subsequent paste operation will then insert the contents of the clipboard at " "the current cursor location.\n" "If some text has been selected in another application, then you can paste this " "text by placing the cursor at the right spot in your text and invoking the paste " "command.\n" "\n" "\n" "The Primary Selection.\n" "\n" "When text is selected anywhere (possibly in another application), Adie can " "paste this text into the current text buffer by means of the middle mouse button " "or by pressing the wheel-button if you have a wheel mouse. Note that while holding " "the button, the insertion point can be moved by moving the mouse:- Adie will " "only insert the text when you release the button.\n" "\n" "\n" "Text Drag and Drop.\n" "\n" "After selecting some text, you can drag this text to another location by pressing the " "middle mouse button; because Adie is fully drag and drop enabled, you can not only " "drag a selection from one place to another inside the text buffer, but also between different " "Adie applications, or even from Adie to another drag and drop enabled application " "or vice-versa.\n" "Within the same text window, the drag defaults to a text-movement. You can change this to " "a text copy by holding down the Control key while you're dragging.\n" "Between one text window and another, the drag defaults to a copy operation " "you can change this to a text movement by holding down the Shift key while dragging.\n" "\n" "\n" "Undo and Redo.\n" "\n" "Adie support unlimited (well, the limit is large...) undo and redo capability. " "Each time you insert, remove, or replace some text, Adie remembers what you did.\n" "If you make a mistake, you can undo the last command, and the one before that, and so on. " "Having invoked undo many times, it is sometimes desirable to invoke the redo command, i.e. " "to perform the original editing operation again. Thus, you can move backward or forward in " "time.\n" "However if, after undoing several commands, you decide edit the buffer in a different way, then " "you will no longer be able to redo the undone commands:- you have now taken a different path.\n" "When you first load a file, or just after you save it, Adie remembers that this version of " "the text was special; while subsequent editing commands can be undone individually, you can always " "quickly return to this special version of the text by means of the revert command.\n" "\n" "\n" "Search and Replace.\n" "\n" "Adie uses the standard Search Dialog for searching strings. The search dialog offers" "forward and backward searches (relative to the current cursor location), and three " "search modes:\n" "\n" "Exact. In the Exact mode, a search looks for a verbatim occurrence of the search string in " "the text.\n" "\n" "Ignore Case. In the Ignore Case mode, a search looks for a verbatim occurrence also, but while " "disregarding the uppercase/lowercase distinctions.\n" "\n" "Expression. In the Expression mode, the the search performs a full regular expression match. " "The regular expression syntax being used is very similar to PERL and is as follows:\n" "\n" " ^\tMatch begin of line\n" " $\tMatch end of line\n" " .\tMatch any character\n" " |\tAlternation\n" " ( ... )\tGrouping sub pattern\n" " (?i ... )\tMatch sub pattern case insensitive\n" " (?I ... )\tMatch sub pattern case sensitive\n" " (?n ... )\tMatch sub pattern with newlines\n" " (?N ... )\tMatch sub pattern with no newlines\n" " (?: ... )\tNon-capturing parentheses\n" " (?= ... )\tZero width positive lookahead\n" " (?! ... )\tZero width negative lookahead\n" " []\tCharacter class\n" "\n" " *\tMatch 0 or more [greedy]\n" " +\tMatch 1 or more [greedy]\n" " ?\tMatch 0 or 1 [greedy]\n" " {}\tMatch 0 or more [greedy]\n" " {n}\tMatch n times [greedy]\n" " {,m}\tMatch no more than m times [greedy]\n" " {n,}\tMatch n or more [greedy]\n" " {n,m}\tMatch at least n but no more than m times [greedy]\n" "\n" " *?\tMatch 0 or more [lazy]\n" " +?\tMatch 1 or more [lazy]\n" " ??\tMatch 0 or 1 [lazy]\n" " {}?\tMatch 0 or more times [lazy]\n" " {n}?\tMatch n times [lazy]\n" " {,m}?\tMatch no more than m times [lazy]\n" " {n,}?\tMatch n or more [lazy]\n" " {n,m}?\tMatch at least n but no more than m times [lazy]\n" "\n" " \\a\tAlarm, bell\n" " \\e\tEscape character\n" " \\t\tTab\n" " \\f\tForm feed\n" " \\n\tNewline\n" " \\r\tReturn\n" " \\v\tVertical tab\n" " \\cx\tControl character\n" " \\033\tOctal\n" " \\x1b\tHex\n" " \\w\tWord character [a-zA-Z_0-9]\n" " \\W\tNon-word character\n" " \\l\tLetter [a-zA-Z]\n" " \\L\tNon-letter\n" " \\s\tSpace\n" " \\S\tNon-space\n" " \\d\tDigit [0-9]\n" " \\D\tNon-digit\n" " \\h\tHex digit [0-9a-fA-F]\n" " \\H\tNon-hex digit\n" " \\b\tWord boundary\n" " \\B\tWord interior\n" " \\u\tSingle uppercase character\n" " \\U\tSingle lowercase character\n" " \\p\tPunctuation (not including '_')\n" " \\P\tNon punctuation\n" " \\<\tBegin of word\n" " \\>\tEnd of word\n" " \\A\tMatch only beginning of string\n" " \\Z\tMatch only and end of string\n" " \\1...\\9\tBack reference\n" "\n" "\n" "Keyboard Bindings.\n" "\n" "The following table lists the keyboard bindings.\n" "\n" "Key:\tAction:\n" "====\t=======\n" "\n" "Up\tMove cursor up.\n" "Shift+Up\tMove cursor up and extend selection.\n" "Down\tMove cursor down.\n" "Shift+Down\tMove cursor down and extend selection.\n" "Left\tMove cursor left.\n" "Shift+Left\tMove cursor left and extend selection.\n" "Right\tMove cursor right.\n" "Shift+Right\tMove cursor right and extend selection.\n" "Home\tMove cursor to begin of line.\n" "Shift+Home\tMove cursor to begin of line and extend selection.\n" "Ctl+Home\tMove cursor to top of text.\n" "End\tMove cursor to end of line.\n" "Ctl+End\tMove cursor to bottom of text.\n" "Shift+End\tMove cursor to end of line and extend selection.\n" "Page Up\tMove cursor up one page.\n" "Shift+Page Up\tMove cursor up one page and extend selection.\n" "Page Down\tMove cursor down one page.\n" "Shift+Page Down\tMove cursor down one page and extend selection.\n" "Insert\tToggle between insert mode and overstrike mode.\n" "Delete\tDelete character after cursor, or text selection.\n" "Back Space\tDelete character before cursor, or text selection.\n" "Ctl+A\tSelect all text.\n" "Ctl+X\tCut selected text to clipboard.\n" "Ctl+C\tCopy selected text to clipboard.\n" "Ctl+V\tPaste text from clipboard.\n" "\n" "\n" "Changing Font.\n" "\n" "You can change font by invoking the Font Selection Dialog from the Font menu. " "The Font Dialog displays four list boxes showing the font Family, Weight, Style, " "and Size of each font. \n" "You can narrow down the number of fonts displayed by selecting a specific character " "set, setwidth, pitch, and whether or not scalable fonts are to be listed only.\n" "The All Fonts checkbutton causes all fonts to be listed. Use this feature if you " "need to select old-style X11 bitmap fonts.\n" "The Preview window shows a sample of text in the selected font.\n" "\n" "\n" "Changing Preferences.\n" "\n" "Since there is no accounting for tastes, Adie can be extensively configured " "by means of the Preferences dialog. " "The Preferences dialog is comprised of a number of subpanes which allow you to " "change colors, editor modes, file patterns, and word delimiters.\n" "\n" "Changing Colors.\n" "\n" "The colors subpane allows you to change the colors used in the File/Directory browser, " "and the Text Window.\n" "You can simply drag colors from one color well to another, or you can double-click " "on a color well and bring up the Color Dialog.\n" "The Color Dialog offers a number of ways to create a new color, either by selecting one of " "the pre-defined color wells, by mixing a custom color in RGB, HSV, or CMYK color space, " "or by selecting a named color from a list.\n" "\n" "\n" "Changing Editor Settings.\n" "\n" "The editor subpane is used to change various modes of the editor:\n" "\n" "Word Wrapping. This enables word wrapping mode for the Text Window; when " "word wrapping is turned on, text flowed to stay within the wrap margins. \n" "\n" "Fixed Wrap Margin. When this feature is enabled, the text is flowed to stay within " "a fixed wrap column; when disabled, the Text Window is in continuous wrapping mode, " "and the text is flowed to fit the size of the Text Window. This option has no effect " "if the Word Wrapping option is off.\n" "\n" "Wrap Margin. This specifies the column at which paragraphs are to be wrapped; the " "wrap margin only has effect if the fixed wrap margin option is selected.\n" "\n" "Tab Columns. This specifies the tab spacing, in terms of spaces.\n" "\n" "Strip Carriage Returns. When this option is selected, MS-Windows/MS-DOS text files with " "lines ending in CRLF are transformed into LF only files upon read; this is mostly of interest " "when loading DOS files on a UNIX system; when Adie runs under MS-Windows, files are normally " "automatically translated back and forth.\n" "\n" "Strip Trailing Spaces. When selected, Adie will remove all white-space after the last " "printable character when reading a file.\n" "\n" "Auto Indent. This causes spaces or tabs to be inserted to match the previous line; " "this option is meant for programmers.\n" "\n" "Brace Match Time. When entering a brace, parenthesis, or bracket, the cursor temporarily " "jumps to the matching brace and pauses there for a bit before hopping back to the insert " "position. If the brace match time is set to 0, then this feature is disabled.\n" "\n" "Insert Tab Characters. When this option is selected, hard tab characters are inserted when " "entering the tab key. If the option is not selected then entering the tab key will insert " "the corresponding number of spaces into the text buffer.\n" "\n" "Mouse Wheel Lines. This is the number of lines scrolled when the mouse wheel is rotated by one " "notch. When holding the control key while using the wheel, the text scrolls by one page " "at a time; when holding the alt key, it scrolls one pixel at a time.\n" "\n" "Save View of File. When this option is selected, the current view or scroll position is " "saved so that a subsequent visit to this file can immediately jump back to the same view.\n" "Disabling this option will cause all remembered views to be forgotten.\n" "\n" "Save Bookmarks. When selected, all currently set bookmarks will be saved for this file; " "a subsequent visit to this file will restore the bookmarks.\n" "Disabling this option will cause all remembered bookmarks to be forgotten.\n" "\n" "\n" "Changing File Patterns.\n" "\n" "This subpane allows you to enter a list of file patterns, one pattern on each line. " "These patterns are used in the File/Directory browser and the File Dialog. They are " "especially useful in the File/Directory browser as it allows you to cause the File/Directory " "browser to only show those file types you want to see (e.g. only source files).\n" "Each line of a pattern has the format:\n" "\n" " patternname (patternlist)\n" "\n" "Where patternname is the name of the pattern (e.g. \"C Source\") and the patternlist is " "a comma separated list of patterns (for example \"*.h,*.c\").\n" "The patternname is optional.\n" "Some examples from my own setup of Adie (you can paste these from this help window " "if you want) are shown below:\n" "\n" " All Files (*)\n" " All Source (*.cpp,*.cxx,*.cc,*.C,*.c,*.hpp,*.hxx,*.hh,*.H,*.h,*.y,*.l)\n" " C++ Source Files (*.cpp,*.cxx,*.cc,*.c,*.C)\n" " C++ Header Files (*.h,*.hpp,*.hxx,*.hh,*.H)\n" " C Source Files (*.c)\n" " C Header Files (*.h)\n" " Python Files (*.py)\n" " Perl Files (*.pl)\n" " Ruby Files (*.rb)\n" " Lex (*.l)\n" " Yacc (*.y)\n" " Object (*.o)\n" " X Pixmap (*.xpm)\n" " X Bitmap (*.xbm)\n" "\n" "Some details on the allowable wild-card patterns:\n" "\n" " ?\tMatches single character.\n" " *\tMatches zero or more characters.\n" " [abc]\tMatches a single character, which must be a, b, or c.\n" " [^abc]\tMatches a single character, which must be anything other than a, b, or c.\n" " [!abc]\tDitto.\n" " [a-zA-Z]\tMatches single character, which must be one of a-z or A-Z.\n" " [^a-zA-Z]\tMatches single character, which must be anything other than a-z or A-Z.\n" " [!a-zA-Z]\tDitto.\n" " pat1|pat2\tMatches either pat1 or pat2.\n" " pat1,pat2\tDitto.\n" " (pat1|pat2)\tMatches either pat1 or pat2; patterns may be nested.\n" " (pat1,pat2)\tDitto.\n" "\n" "\n" "Changing Delimiters.\n" "\n" "Different programming language have different notions about identifiers. Adie " "accomodates for this by allowing you to specify which characters (besides white space, " "of course) are used to delimit identifiers or tokens in the programming language. " "The default set of delimiters is \"!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~\".\n" "\n" "\n" "Other Configuration Issues.\n" "\n" "Because Adie is an editor written to use the FOX Toolkit, there are various other " "items, common to all FOX Toolkit programs, which may be configured either by hand or " "using some other control panel.\n" "A few items of particular interest are list below:\n" "\n" " [SETTINGS]\n" " typingspeed=800\n" " clickspeed=400\n" " scrollspeed=80\n" " scrolldelay=600\n" " blinkspeed=500\n" " animspeed=10\n" " menupause=400\n" " tippause=800\n" " tiptime=3000\n" " dragdelta=6\n" " wheellines=1\n" " bordercolor=black\n" " basecolor=AntiqueWhite3\n" " hilitecolor=AntiqueWhite\n" " shadowcolor=AntiqueWhite4\n" " backcolor=AntiqueWhite1\n" " forecolor=black\n" " selforecolor=AntiqueWhite\n" " selbackcolor=#aea395\n" " tipforecolor=yellow\n" " tipbackcolor=black\n" " normalfont=\"[lucidatypewriter] 90 700 1 1 0 1\"\n" " iconpath = /usr/share/icons:/home/jeroen/icons\n" "\n" "These settings can be either placed in $HOME/.foxrc (and thus affect all FOX programs), " "or in $HOME/.foxrc/FoxTest/Adie (only applying to Adie).\n" "File types may be bound to a command, mime-type, and icons using statements like " "the one below:\n" "\n" " [FILETYPES]\n" " cpp = \"/usr/local/bin/textedit %s &;C++ Source File;c_src.xpm;mini/c_src.xpm\"\n" " /home/jeroen = \";Home Directory;home.xpm;mini/home.xpm;application/x-folder\"\n" " defaultfilebinding = \"/usr/local/bin/textedit %s &;Document;document.xpm;mini/document.xpm\"\n" " defaultexecbinding = \";Application;exec.xpm;mini/exec.xpm;application/x-executable-file\"\n" " defaultdirbinding = \";Folder;folder.xpm;mini/folder.xpm;application/x-folder\"\n" "\n" "This example shows how the extension \".cpp\" is bound to the program \"textedit\" " "and is associated with two icons, a big icon \"c_src.xpm\" and a small icon \"mini/c_src.xpm\", " "which are to be found in the directories determined by \'iconpath\", in this case, " "\"/usr/share/icons\" or \"/home/jeroen/icons\".\n\n" "It also binds two icons \"home.xpm\" and \"mini/home.xpm\" to the home directory " "\"/home/jeroen\".\n\n" "Finally, it assigns icons, commands, and mime-types to unbound documents, executables, " "and directories, overriding the built-in icons of the FOX Toolkit.\n" ; fox1.6-1.6.57/adie/help.h000066400000000000000000000036541326741342000146500ustar00rootroot00000000000000/******************************************************************************** * * * O n - L i n e H e l p T e x t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: help.h,v 1.4 2006/01/22 18:01:12 fox Exp $ * ********************************************************************************/ #ifndef HELP_H #define HELP_H // Help text extern const char help[]; #endif fox1.6-1.6.57/adie/help_gif.gif000066400000000000000000000003111326741342000157760ustar00rootroot00000000000000GIF89aô˛Ŕܦż˘đôďëńęáéŕËÚÉóöóŇßĐĂÔÁ¬Ă¨ĽĎ¸+++ćíä!.e‹^Ś­†–´‘¸ĚµŤ­!ů,F ŠAYŽčQAŞÇPÜHśÉ ‹‚‚! 4Ş›n‡ —2Ňí-Ţ ŐÝ5ŰŚ°Ńf!ÂÝ™Âf´XRnJ&íf9;fox1.6-1.6.57/adie/icons.cpp000066400000000000000000007540421326741342000153720ustar00rootroot00000000000000/* Generated by reswrap version 4.0.0 */ /* created by reswrap from file adie_gif.gif */ extern const unsigned char adie_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0xc8,0x00,0xc8,0x00,0xf7,0x00,0x00,0xff,0xff,0xff, 0xfc,0xfb,0xf6,0xf3,0xea,0xdb,0xe4,0xd6,0xb8,0xef,0xe4,0xd2,0xdb,0xca,0xa3,0xf9, 0xf7,0xee,0x1f,0x0b,0x08,0x3f,0x22,0x15,0xfc,0xfc,0xf9,0xea,0xdd,0xc5,0xf7,0xf3, 0xe7,0xfb,0xfa,0xf4,0xf1,0xe9,0xd8,0xf4,0xed,0xdf,0xfc,0xfb,0xf5,0xef,0xe5,0xd2, 0xf0,0xe7,0xd6,0xf1,0xe8,0xd7,0xf0,0xe6,0xd4,0xe5,0xd7,0xba,0xfe,0xfd,0xfc,0x1b, 0x08,0x06,0xfa,0xf8,0xf0,0xe3,0xd5,0xb5,0xee,0xe3,0xcf,0xfa,0xf9,0xf2,0xea,0xde, 0xc5,0xf5,0xee,0xe1,0xeb,0xdf,0xc7,0xeb,0xe0,0xc9,0xe2,0xd3,0xb3,0xe7,0xda,0xbe, 0xec,0xe2,0xcd,0xfa,0xf7,0xef,0xed,0xe3,0xcf,0x21,0x0c,0x09,0xf8,0xf4,0xea,0x3d, 0x21,0x14,0xeb,0xdf,0xc8,0xd1,0xba,0x8f,0x20,0x06,0x07,0xfd,0xfd,0xf9,0xed,0xe2, 0xcd,0xf2,0xea,0xda,0xdc,0xcc,0xa5,0x19,0x06,0x05,0x17,0x05,0x04,0xf9,0xf5,0xec, 0xde,0xce,0xa9,0xd3,0xbd,0x92,0x46,0x28,0x19,0x55,0x2e,0x1d,0xdf,0xcf,0xab,0x23, 0x0e,0x0a,0xce,0xb7,0x89,0xfe,0xfe,0xfa,0xe1,0xd2,0xb0,0x2c,0x14,0x0c,0xe0,0xd0, 0xae,0xf5,0xf0,0xe2,0xaf,0x87,0x5d,0xcc,0xb3,0x85,0xe8,0xdb,0xc0,0x80,0x54,0x36, 0x5c,0x34,0x21,0x32,0x19,0x10,0xf3,0xeb,0xdc,0xd5,0xc0,0x95,0xb8,0x96,0x6b,0x56, 0x31,0x1e,0x31,0x17,0x0f,0x21,0x07,0x07,0x59,0x31,0x1f,0xe9,0xdc,0xc2,0xa1,0x76, 0x4f,0x26,0x0f,0x0a,0xbb,0x98,0x6b,0xfc,0xfc,0xf6,0xe6,0xd9,0xbd,0x50,0x2b,0x1b, 0x9d,0x70,0x4a,0xbf,0x9e,0x71,0xfb,0xfa,0xf3,0xc4,0xa7,0x79,0xdd,0xcd,0xa7,0xb1, 0x8d,0x64,0x42,0x25,0x17,0x39,0x1d,0x12,0x8a,0x5c,0x3b,0xd6,0xc2,0x99,0xfc,0xfc, 0xf8,0x44,0x26,0x17,0x27,0x0c,0x09,0x65,0x3d,0x26,0x6b,0x40,0x28,0x61,0x3a,0x25, 0xc7,0xab,0x7d,0x3e,0x1c,0x13,0xe1,0xd2,0xb2,0x3d,0x1f,0x14,0xc8,0xad,0x80,0x59, 0x32,0x20,0x77,0x4c,0x30,0x71,0x48,0x2e,0x2d,0x15,0x0e,0x7f,0x52,0x34,0x93,0x66, 0x42,0x95,0x6c,0x49,0x6e,0x44,0x2b,0xd7,0xc4,0x9d,0x7d,0x4f,0x32,0xe0,0xd0,0xac, 0xc5,0xa9,0x7a,0xb5,0x8f,0x63,0xd9,0xc5,0x9e,0x51,0x2d,0x1c,0x36,0x1b,0x11,0x1d, 0x09,0x07,0xdd,0xcc,0xa6,0x87,0x5a,0x3a,0x4f,0x2a,0x1b,0xab,0x85,0x5d,0xf7,0xf2, 0xe6,0xa6,0x7b,0x53,0x2b,0x12,0x0c,0xaa,0x82,0x59,0x4d,0x28,0x1a,0x82,0x59,0x3b, 0x76,0x49,0x2e,0x1d,0x0a,0x07,0x2f,0x11,0x0c,0x2c,0x0f,0x0b,0x61,0x38,0x23,0x5f, 0x37,0x23,0x2a,0x0e,0x0a,0xd7,0xc4,0x9a,0xa9,0x7f,0x55,0x90,0x63,0x40,0xc1,0xa3, 0x75,0x8c,0x62,0x41,0xe6,0xd8,0xbb,0x4b,0x27,0x19,0x77,0x4f,0x34,0x72,0x45,0x2c, 0x35,0x19,0x10,0xf8,0xf5,0xec,0xf9,0xf6,0xee,0x65,0x3b,0x25,0x9a,0x6e,0x48,0x39, 0x1c,0x12,0xb8,0x93,0x67,0x24,0x0a,0x08,0xc9,0xaf,0x82,0xb7,0x91,0x65,0x6c,0x42, 0x29,0x96,0x69,0x44,0xcb,0xb1,0x83,0x1c,0x05,0x06,0xbc,0x9a,0x6d,0xd5,0xc1,0x98, 0x67,0x40,0x29,0xf9,0xf7,0xef,0xf4,0xec,0xdd,0x38,0x18,0x10,0xc0,0xa1,0x72,0x9f, 0x73,0x4c,0x28,0x0c,0x0a,0xf4,0xec,0xde,0xcf,0xb8,0x8d,0xc3,0xa5,0x76,0xf7,0xf0, 0xe4,0x21,0x09,0x07,0x30,0x15,0x0e,0xa2,0x7a,0x53,0x49,0x25,0x18,0x46,0x25,0x18, 0x8c,0x5f,0x3d,0x51,0x2e,0x1d,0xbd,0x9c,0x6f,0xda,0xc9,0xa1,0x5e,0x35,0x22,0x26, 0x10,0x0b,0xe7,0xdb,0xbf,0xb1,0x8a,0x5f,0x1a,0x08,0x06,0xec,0xe0,0xcb,0x49,0x29, 0x1a,0xf6,0xf0,0xe3,0x52,0x2b,0x1c,0x84,0x56,0x37,0x34,0x15,0x0e,0x4a,0x2b,0x1b, 0x3a,0x1f,0x13,0xd4,0xbe,0x95,0xe8,0xdb,0xc2,0xf7,0xf4,0xe9,0x42,0x23,0x16,0xf0, 0xe6,0xd5,0xee,0xe4,0xd0,0x23,0x0c,0x09,0xe4,0xd6,0xb6,0xf6,0xf1,0xe4,0xf0,0xe6, 0xd2,0xe1,0xd1,0xaf,0xec,0xe2,0xcb,0xf8,0xf5,0xea,0x59,0x35,0x21,0x26,0x0a,0x09, 0xd2,0xbb,0x91,0x56,0x2f,0x1e,0xcd,0xb4,0x89,0xf5,0xed,0xdf,0xeb,0xe0,0xcb,0xe7, 0xd9,0xbe,0x46,0x23,0x16,0xd9,0xc7,0x9e,0xe9,0xdc,0xc4,0x42,0x20,0x15,0xda,0xc8, 0xa0,0xda,0xc7,0x9f,0xdd,0xcc,0xaa,0x23,0x08,0x08,0xf9,0xf5,0xea,0xdc,0xcb,0xa5, 0xf6,0xee,0xe3,0x28,0x11,0x0b,0x40,0x23,0x16,0xf7,0xf1,0xe5,0xdb,0xc9,0xa4,0xf8, 0xf3,0xe8,0x22,0x0a,0x08,0x1c,0x09,0x07,0xfd,0xfd,0xfb,0xf5,0xee,0xe0,0xec,0xdf, 0xc9,0xde,0xce,0xac,0xff,0xff,0xfd,0xe5,0xd6,0xba,0xfa,0xfa,0xf1,0xfb,0xf9,0xf1, 0xe3,0xd3,0xb5,0xf2,0xe9,0xd8,0xfd,0xfc,0xf7,0xfb,0xf7,0xf1,0xfe,0xfe,0xfd,0xfc, 0xfa,0xf2,0xfb,0xf9,0xf3,0xf6,0xf2,0xe7,0xfb,0xfa,0xf6,0xf6,0xf3,0xe5,0xfd,0xfa, 0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0xc8,0x00,0xc8,0x00,0x00,0x08,0xfe,0x00,0x89,0xc8,0x88,0x96,0xea,0x86, 0x8f,0x32,0x61,0x32,0x75,0xf2,0x71,0xe3,0xc6,0x40,0x22,0x5a,0xe6,0xd0,0x6a,0x11, 0xa3,0x46,0x0d,0x38,0x39,0x3e,0x60,0xa0,0xf0,0xe4,0x87,0x47,0x10,0x1e,0x7f,0x3c, 0xa1,0x80,0xe1,0x03,0x9c,0x18,0x05,0x68,0x61,0x73,0xa3,0x05,0x94,0x30,0x19,0x28, 0x1a,0xfa,0xf0,0xd1,0x29,0x13,0x42,0x84,0x71,0x72,0xaa,0x2a,0xc5,0x53,0x55,0xce, 0x38,0x65,0x14,0xfa,0x98,0x76,0x23,0x15,0x8a,0xa3,0xd1,0x84,0x09,0x23,0xc2,0x14, 0x14,0x44,0x44,0x6e,0x10,0x21,0x6a,0x09,0x91,0xa9,0x0c,0x98,0x28,0x52,0x4d,0xa3, 0x99,0x29,0x53,0x1c,0x2a,0x8b,0x16,0xcd,0x6a,0x22,0xa7,0x47,0x8f,0x44,0x4b,0x4c, 0x71,0xca,0x82,0x47,0xcd,0x99,0x40,0x68,0xda,0xa0,0x09,0x04,0x29,0xd0,0x1b,0x35, 0x6c,0x15,0x71,0x8a,0x12,0xc5,0x54,0x94,0xb4,0x7e,0x39,0x29,0xc2,0x03,0x24,0xd0, 0x97,0x20,0xb5,0x7a,0x41,0x71,0xf4,0xea,0x15,0x94,0x3c,0x49,0xcc,0x18,0xf2,0xf2, 0x25,0xd0,0x99,0x37,0xbe,0xf0,0xe8,0xad,0x64,0xca,0x14,0x9f,0x44,0x89,0xfc,0x88, 0x4e,0xc4,0x67,0x49,0xa5,0x35,0xbe,0xde,0x86,0x32,0x94,0x44,0x1a,0x14,0x60,0xbb, 0xb4,0x10,0x89,0x16,0x0d,0x05,0xcd,0x4e,0x0b,0x8b,0xa2,0x60,0xaa,0xc5,0xcd,0xb6, 0x89,0x15,0x6b,0x30,0xd3,0x98,0xac,0xd1,0x93,0x27,0x20,0x90,0x27,0x6f,0xd4,0x28, 0xd9,0x87,0x1d,0x31,0xaa,0x14,0xd8,0x36,0x47,0xaa,0xb0,0xda,0x31,0x6f,0x2b,0xec, 0x6a,0x33,0x4c,0x98,0x38,0xaa,0xc2,0xfe,0x53,0xa1,0x12,0x27,0x4c,0x99,0x32,0x34, 0x19,0x16,0x4d,0x55,0x3b,0xe9,0xd5,0xa5,0x4e,0x41,0x81,0xd2,0x42,0x5f,0xb6,0xd2, 0x97,0x30,0x53,0xe9,0x37,0xd8,0x09,0x27,0x15,0x55,0x8b,0x48,0xd1,0x84,0x26,0x65, 0xf9,0x51,0x1a,0x27,0x6b,0xb4,0xa5,0x46,0x20,0x0c,0xda,0x45,0xd7,0x65,0x78,0xc4, 0xa2,0x57,0x5f,0x69,0x01,0x16,0x05,0x27,0xb1,0x64,0x91,0xda,0x17,0x85,0x04,0x21, 0xcd,0x1f,0x20,0xbe,0xe2,0xc8,0x1f,0x79,0x04,0x01,0xc6,0x17,0x95,0xdd,0x85,0x57, 0x2c,0x6b,0x70,0xc6,0x07,0x1f,0xa2,0xe9,0xe1,0xc7,0x59,0x68,0x9d,0x86,0xc7,0x1b, 0x81,0x6c,0x42,0x89,0x19,0x34,0xf4,0xb2,0x0b,0x30,0x52,0x09,0x04,0xd3,0x0d,0x44, 0xe9,0x97,0xd4,0x53,0xdc,0x14,0x00,0x4e,0x15,0x55,0x54,0x94,0x43,0x0e,0x18,0x24, 0x33,0x00,0x05,0xc6,0x19,0x47,0xc1,0x00,0xc9,0x94,0x94,0x43,0x0d,0x55,0x80,0x43, 0x5d,0x90,0x58,0xc9,0x84,0xdb,0x98,0x0b,0x75,0xf5,0x1d,0x78,0x3e,0xe5,0x74,0x13, 0x6e,0xd3,0x10,0xb5,0x1e,0x52,0xb4,0x1d,0x75,0x95,0x0c,0xf0,0x31,0x25,0x24,0x56, 0x05,0x89,0xd9,0xc9,0x99,0xe4,0x2d,0x52,0xca,0x27,0x97,0xc8,0x81,0xcb,0x59,0xa6, 0x54,0x82,0x21,0x61,0x6a,0xe0,0xd8,0xe0,0x5b,0x98,0x69,0x56,0x49,0x5f,0x9d,0x2d, 0xb1,0x44,0x14,0x95,0x54,0xa2,0x88,0x86,0x6f,0xb4,0x11,0x4a,0x12,0x8a,0xe5,0x91, 0xc7,0x2e,0xbb,0x40,0x01,0x45,0x12,0x86,0x50,0xf2,0x05,0x24,0x67,0x00,0x01,0x44, 0x16,0x2c,0x72,0xb6,0x44,0x68,0xfe,0x66,0x8d,0x86,0x56,0x14,0x6b,0x68,0x18,0x48, 0x28,0x60,0x98,0x21,0x0b,0xa8,0xc0,0x14,0xc0,0x92,0x40,0x59,0xe9,0xc7,0x9e,0x30, 0x5a,0x40,0x85,0xcd,0x36,0x4b,0x52,0x64,0x11,0x33,0xcc,0x40,0x19,0xe5,0x00,0xd0, 0x62,0x89,0xc1,0x93,0x70,0xd4,0x70,0xc7,0x74,0x51,0x4d,0x45,0xc4,0x75,0x31,0xf1, 0xb7,0xd0,0x6d,0x65,0xe2,0xf4,0x15,0x79,0x40,0x95,0xf1,0xad,0x7a,0xc2,0x1e,0x65, 0x54,0xba,0x28,0xcc,0x49,0xe7,0x9c,0x47,0x05,0xdb,0xd0,0x34,0x35,0x7d,0xf7,0xdf, 0x78,0x7e,0x8e,0xa5,0xc9,0xa0,0x7e,0x4c,0x8a,0x60,0x2c,0xbe,0xf8,0x92,0xe8,0x82, 0x67,0x5c,0xa6,0x06,0x10,0x78,0xb4,0x68,0x8a,0xa4,0x7f,0xf1,0xe5,0xd7,0x1a,0x6b, 0x00,0x7c,0xc6,0x26,0x85,0xb4,0x46,0xc3,0xa7,0xc0,0x28,0x46,0x6a,0x21,0x5e,0xa0, 0x9a,0x28,0x1e,0x59,0x28,0xb2,0xc6,0x5f,0x30,0x9a,0xd5,0xc3,0x8c,0xa5,0x9d,0x96, 0x05,0x10,0x67,0xb4,0x01,0x86,0x34,0xc0,0xcc,0x70,0xc5,0x2e,0x5e,0x6a,0xfb,0x92, 0x9c,0xc2,0x80,0x22,0xd5,0x1c,0xdb,0x28,0xd9,0x64,0xb5,0x17,0x35,0xfb,0x41,0x96, 0x1f,0x14,0x9d,0x03,0x33,0x3b,0xd4,0x10,0x5d,0x0b,0x05,0x54,0x27,0xd5,0x54,0xb2, 0x0d,0xd4,0xed,0xb9,0x33,0x71,0x75,0x1e,0x42,0xde,0x99,0x67,0x5e,0x6e,0x0d,0x15, 0xe5,0xf5,0x7e,0xfb,0x35,0xa4,0x5f,0xbb,0xed,0xc6,0x79,0xd4,0xbc,0x5b,0xf5,0x17, 0x06,0xbe,0xe1,0xed,0xa4,0x6f,0x81,0x7c,0xa8,0x15,0xb1,0x86,0x02,0xab,0x21,0x30, 0xa3,0xbe,0xb0,0xb8,0x17,0xfe,0x67,0x0b,0xf7,0x2d,0xb7,0xc4,0x6d,0x50,0x12,0x04, 0xa7,0x7f,0xc0,0xb2,0x4b,0x1e,0xbd,0x48,0x46,0x09,0x25,0x9b,0x58,0x16,0x70,0xc8, 0x6b,0x70,0xe2,0x59,0x68,0x33,0x9e,0x9c,0x48,0xa1,0x6b,0xbd,0x81,0x86,0x17,0x86, 0x18,0xb1,0x4b,0x31,0x5c,0xcc,0x20,0x1d,0x75,0x2d,0x29,0xd5,0x54,0xb1,0xc7,0xd2, 0x02,0xce,0x92,0x31,0xc0,0x51,0xed,0x0e,0x3b,0x30,0xfb,0x01,0xb3,0xcc,0xc0,0x91, 0x74,0x74,0xe0,0xa4,0x84,0xcd,0x54,0xf3,0x41,0x4d,0x1f,0xb0,0x05,0x55,0xdd,0xe6, 0x56,0xe0,0x5e,0x1d,0xd4,0x42,0x0b,0xb5,0xa9,0x5e,0xd7,0xcc,0xcf,0x84,0xdb,0x4c, 0x6f,0xaa,0x9b,0x15,0x91,0xce,0x67,0xf2,0xdd,0x4e,0x00,0xee,0x24,0x85,0x80,0x04, 0x96,0x85,0x56,0x67,0x97,0x66,0x26,0xfe,0xc0,0x76,0xb7,0xea,0x6a,0xa4,0x92,0x62, 0x1e,0xcb,0x8d,0x39,0x76,0xd8,0x4b,0x1e,0x23,0x32,0x66,0x46,0x12,0xb5,0x9c,0x88, 0xc6,0x19,0x07,0x47,0x28,0x72,0x25,0x92,0xbe,0x18,0x1a,0x69,0x6a,0x89,0x05,0xcb, 0x20,0x01,0x06,0x23,0xd0,0x61,0x17,0x08,0xb8,0x02,0x17,0xac,0x35,0x9d,0xdd,0x9d, 0x0e,0x11,0xa9,0x53,0xd2,0xea,0x9a,0x64,0x91,0x8a,0xb8,0xce,0x76,0xb7,0x8b,0x41, 0x0b,0xc0,0xd1,0x02,0x5a,0x50,0x27,0x2a,0xf5,0x29,0x96,0x08,0x11,0xb1,0xad,0xda, 0xe4,0x89,0x79,0xde,0xaa,0x89,0x4d,0x8e,0x97,0x9e,0xaa,0x39,0xcf,0x85,0x34,0x29, 0x43,0x4e,0x02,0xb4,0x08,0x2a,0x24,0xa4,0x48,0x44,0xda,0x0a,0xf1,0xac,0x37,0x2e, 0x3f,0x85,0xa5,0x14,0xfe,0xb3,0x18,0x4b,0x11,0x08,0x64,0x39,0xd3,0xfc,0x4b,0x11, 0xeb,0x0b,0x98,0x12,0x59,0xc5,0x09,0xce,0x50,0xe8,0x45,0xa5,0x99,0x14,0xc4,0xb2, 0xb0,0xa0,0x36,0x78,0xc1,0x43,0xef,0x13,0xd5,0x1f,0x7a,0x51,0x8b,0x24,0x04,0x21, 0x14,0x6d,0xc0,0x9b,0x2f,0x20,0xc7,0x17,0x92,0xa5,0xcf,0x50,0x02,0x9c,0x18,0x18, 0x68,0xf0,0x87,0x19,0x20,0x60,0x1c,0x5c,0x60,0xc6,0xd2,0x0a,0xc0,0x0d,0xa8,0x41, 0x90,0x16,0x05,0xd8,0xe0,0x1d,0xf4,0xd8,0xa4,0x18,0xf8,0x91,0x82,0x7e,0xbc,0x56, 0xee,0x3c,0xb8,0x0d,0xa9,0x88,0xb0,0x3e,0xd9,0xca,0x16,0x28,0xae,0x22,0x2f,0xe6, 0x11,0x0f,0x37,0x2b,0xb4,0x09,0x99,0x32,0x31,0x93,0x15,0x9e,0xc9,0x4f,0xdb,0xfb, 0x44,0x11,0x2e,0xd1,0x84,0x4b,0x68,0x82,0x93,0xb3,0x58,0x44,0x42,0x82,0xd2,0x95, 0xf3,0xac,0x2d,0x3c,0x01,0xe2,0x89,0x14,0x82,0x38,0x96,0x40,0xe1,0x62,0x50,0xa5, 0xb9,0x90,0x22,0x2e,0xc5,0xaa,0x0c,0xc5,0x82,0x45,0x2d,0x2a,0x63,0xff,0x40,0x53, 0x1a,0xb5,0x84,0xef,0x0d,0x90,0xe0,0x5c,0x10,0xcc,0x40,0xa2,0x11,0xfd,0x01,0x0a, 0x41,0x48,0x26,0x18,0xda,0x50,0x17,0x83,0xe9,0x0f,0x41,0x8f,0xa2,0x14,0x1a,0x6f, 0x04,0x89,0x2f,0xd4,0x82,0x8d,0x5c,0x28,0xc6,0x38,0x66,0x90,0x03,0xd7,0x49,0xa7, 0x69,0x73,0x48,0x5d,0x0b,0x5a,0xb0,0xc7,0x64,0xb1,0xce,0x8f,0x7f,0xac,0xc2,0x1d, 0x56,0x97,0xbb,0x2f,0x91,0x90,0x3e,0x86,0x94,0x8a,0x1b,0xdc,0x80,0x8d,0x63,0xcd, 0xe1,0x77,0x52,0xfe,0x1b,0x5b,0xd7,0xc0,0x65,0x13,0x33,0x19,0xcf,0x3b,0x3b,0x29, 0x85,0x14,0x86,0x28,0x87,0x7e,0x09,0xa6,0x89,0x09,0x52,0xd5,0x19,0x00,0x91,0x85, 0x33,0x30,0xc2,0x15,0xb8,0xb8,0xc4,0x2c,0xa4,0x50,0xc3,0x9f,0xfc,0x70,0x7b,0xdb, 0x0b,0x62,0x27,0x5d,0x29,0x9a,0xb8,0x5d,0x08,0x41,0xb3,0x9c,0x65,0x13,0xa3,0x09, 0xa9,0x57,0x81,0x26,0x34,0x7c,0xe0,0x4b,0xad,0x80,0x80,0xa3,0x2f,0x80,0x21,0x32, 0x17,0x03,0x51,0x1e,0x44,0x45,0x03,0x2f,0x2e,0x6e,0x13,0x72,0x49,0x15,0xc2,0x58, 0x25,0x32,0x4e,0xf8,0x74,0x96,0x37,0x6a,0x83,0x21,0x82,0xc0,0x46,0x99,0x29,0xf0, 0x39,0x4a,0xab,0x02,0xd3,0xf0,0x88,0xc7,0x25,0x31,0x69,0x9c,0xea,0x8c,0x8e,0x52, 0xc9,0x09,0x8e,0x75,0x16,0x20,0x25,0xdc,0x60,0x09,0x7d,0xe4,0x23,0x9f,0x79,0xce, 0x21,0x9c,0xc7,0xda,0x86,0x58,0xe7,0x10,0x95,0x6d,0x31,0x72,0x7a,0x06,0xa9,0x5a, 0x4d,0x82,0xf2,0x93,0x81,0x6a,0xc2,0x0f,0x6a,0x61,0x44,0x61,0x56,0x25,0xb2,0x0c, 0x05,0x8c,0x41,0x02,0x63,0x90,0x17,0xc2,0x88,0x22,0x14,0x81,0x01,0x0d,0x8c,0xf0, 0x43,0x11,0x28,0x1a,0x1e,0x81,0x62,0x72,0x95,0x9f,0x18,0x90,0xa0,0xfc,0x40,0x9a, 0x49,0x55,0xea,0xb1,0x7c,0xfb,0x8b,0x2b,0x4a,0xf3,0x19,0xd0,0x8c,0x26,0x6e,0x96, 0xc2,0x83,0x2f,0x5a,0x2a,0x38,0xa2,0xf6,0x02,0x44,0x7f,0xa0,0x03,0x4d,0xcd,0x00, 0x86,0x42,0x94,0xea,0x0b,0x6d,0x68,0x10,0x10,0xf2,0x26,0xb2,0x35,0x20,0x91,0x2d, 0x74,0xa1,0xfe,0x44,0x12,0xa0,0xd0,0xc6,0x2b,0xc0,0x11,0xa9,0x4c,0xfa,0x26,0x3b, 0x63,0x70,0x87,0xdc,0x46,0xa7,0xb7,0xbc,0xad,0xea,0xea,0x3c,0x08,0x56,0x10,0x6e, 0x8b,0x08,0xbd,0x3b,0x16,0x37,0x3c,0x78,0xd5,0x94,0x7c,0xc9,0x29,0x58,0x99,0x9e, 0xda,0xc2,0x00,0xa0,0x59,0x78,0xb2,0x07,0x7c,0xa8,0x84,0x84,0x04,0x13,0x0b,0xbc, 0xe4,0x6d,0x65,0x99,0x71,0x6d,0x5b,0x54,0x25,0x98,0xba,0x32,0xb3,0x0d,0x9b,0x08, 0xc5,0x26,0xbe,0xb0,0x89,0xa1,0x3a,0xa2,0x17,0xa1,0x60,0x03,0x2e,0x9a,0xc0,0x13, 0x55,0x22,0x76,0x93,0x05,0x3a,0x69,0x14,0xd1,0xe7,0x8a,0xc9,0x9a,0xb4,0xb2,0x95, 0x65,0x2c,0x66,0x07,0xb3,0xd9,0x33,0x54,0xd3,0xb4,0x3c,0x52,0x8c,0x23,0x66,0xaa, 0x98,0x5e,0xd0,0x40,0x1a,0xd2,0x30,0xc4,0x89,0x4e,0x85,0xaa,0x46,0x65,0xe1,0xc2, 0x1a,0x5a,0xd0,0x26,0x0a,0x08,0x2a,0x2e,0x70,0x01,0x01,0x5c,0x40,0xaa,0x54,0x73, 0x97,0xbb,0x16,0x30,0x29,0x9d,0x7e,0x4c,0x2a,0x38,0x3c,0x48,0x8b,0xaf,0x3e,0xed, 0x69,0x5c,0x2d,0x96,0x1b,0xf0,0x28,0xc1,0x3b,0x10,0x12,0x1b,0x64,0xd5,0x82,0x30, 0xa6,0x57,0xb5,0xb5,0x7d,0x42,0x13,0x9a,0x38,0x0b,0x82,0x22,0x96,0xa8,0x40,0x68, 0xe6,0x0d,0x40,0x78,0x84,0x4e,0x35,0x7b,0x29,0x96,0xa1,0x61,0x13,0x9b,0x40,0x72, 0x5c,0xe0,0x82,0x86,0x27,0xa3,0xe1,0x44,0x38,0x25,0x66,0x31,0xc4,0x20,0x06,0x33, 0x3c,0x22,0x11,0x9f,0x10,0xe8,0x2a,0xc7,0xd2,0x84,0x22,0x08,0xca,0x2c,0xbc,0xf4, 0x5f,0xfe,0x65,0x4f,0x2a,0xab,0x8e,0xaa,0x39,0x2d,0xb2,0x2c,0x70,0xcb,0x28,0xc1, 0x1a,0x33,0x7c,0xf6,0x15,0x33,0xcd,0x83,0x68,0xf3,0x40,0x03,0x23,0xd0,0x8f,0x12, 0xea,0xdd,0x44,0x85,0x81,0x60,0x37,0x55,0x15,0xc6,0xa5,0x41,0x90,0x85,0xa8,0xae, 0x70,0x05,0x04,0xcc,0x00,0x03,0x3b,0x38,0xc9,0x53,0x73,0xa7,0xa4,0x75,0x9e,0x18, 0x9d,0xb8,0xbb,0xea,0x36,0xb2,0x0a,0xc2,0xf9,0xfc,0x4e,0x3e,0x88,0x90,0x48,0x55, 0x79,0xcb,0x34,0x6e,0x70,0xc3,0x69,0xc0,0x9a,0x06,0x42,0x54,0xd1,0x04,0x5c,0x24, 0x42,0x0f,0x7c,0xc0,0x90,0x22,0x4e,0x33,0xcb,0x37,0x74,0xd7,0x2d,0x38,0xaa,0x85, 0x34,0x28,0x51,0x88,0xba,0x50,0xe2,0x0d,0x84,0x59,0xed,0x19,0xbe,0xa0,0x06,0xb7, 0xdc,0xcd,0x9a,0x1f,0x82,0x45,0x10,0x8c,0x20,0x0d,0x33,0x5c,0xe3,0x15,0xda,0x80, 0x85,0x09,0x10,0x80,0x85,0x36,0xf8,0x41,0xa2,0x88,0x4d,0xac,0x1c,0x04,0x85,0x0b, 0xc6,0x26,0xe2,0x64,0xa2,0x01,0x77,0xb8,0x63,0x25,0x2b,0x28,0xba,0xc2,0xb1,0x11, 0x13,0x18,0x30,0x3b,0x6b,0x84,0xc7,0xc8,0x74,0x8b,0x23,0x12,0x55,0x12,0xe8,0x57, 0x2a,0xca,0xd4,0xa5,0x99,0x0c,0x7a,0xb2,0x4b,0xcd,0x60,0x40,0x60,0x5c,0x41,0x9b, 0x57,0x28,0xc9,0x49,0x78,0x9b,0x92,0xab,0x56,0xb5,0x49,0x55,0x50,0x9a,0x06,0x7b, 0xbb,0x62,0x6c,0x64,0x15,0x6a,0x3a,0x13,0x21,0x44,0x7a,0x83,0x8d,0x02,0x24,0x7c, 0x07,0x4a,0x55,0xc9,0xa6,0x77,0xb7,0xc8,0x1b,0x64,0x82,0x0a,0xb3,0x90,0x43,0x22, 0xfe,0xd8,0xe0,0x8b,0x47,0x30,0xc8,0xd6,0x54,0x1c,0xa3,0xf8,0x1a,0xe5,0x0b,0x97, 0x9d,0xe1,0x11,0x6d,0x40,0x8c,0x8e,0x92,0x80,0xa2,0x30,0x86,0x11,0x47,0x67,0x88, 0x0b,0x0d,0x80,0x81,0x80,0x3a,0xd4,0xe1,0x08,0x47,0xd0,0x01,0x32,0xba,0x00,0x8d, 0x2e,0x88,0x43,0x07,0x24,0x60,0x82,0x10,0x76,0xf1,0x88,0x25,0x7c,0x62,0x95,0x4d, 0xe8,0xe4,0xb6,0x5f,0xd9,0x83,0x41,0x99,0xcc,0xea,0xaf,0x1c,0x94,0xd5,0x2f,0xbb, 0xdf,0xf2,0x62,0xca,0x30,0xd6,0x4c,0x02,0x0d,0xa0,0x30,0x76,0xda,0x8a,0xaa,0x17, 0x62,0x9f,0xf7,0x30,0x29,0x01,0x06,0x4a,0x50,0x46,0x53,0x5f,0x08,0x05,0x8a,0xbc, 0x80,0xab,0x65,0x03,0x83,0x0b,0x8c,0x1e,0x07,0x30,0x90,0xba,0x4e,0x4a,0x37,0xb7, 0xb7,0x97,0xee,0xd2,0xea,0xa6,0xf3,0x70,0x43,0xd6,0x27,0x9e,0xbe,0xd9,0xc6,0x1d, 0x2a,0x62,0x55,0xaa,0x16,0x12,0x22,0x32,0x28,0x85,0x2b,0x1e,0xf1,0x0c,0x28,0xc0, 0x02,0x18,0x34,0xd8,0xab,0xad,0x33,0x94,0x85,0x5a,0xdd,0x28,0x51,0x68,0x10,0xdc, 0xbc,0xcd,0x10,0x0a,0x20,0x7c,0x81,0x0e,0x5e,0x48,0x3d,0x32,0x93,0x99,0x04,0x23, 0x98,0xa1,0x8b,0x34,0x70,0xc4,0x35,0xea,0x20,0x84,0x3e,0x88,0x43,0x1c,0xb6,0x60, 0xc2,0x01,0x52,0x80,0x09,0x24,0x1c,0x40,0x10,0x16,0x40,0x87,0x20,0x90,0x71,0x88, 0x56,0x18,0x82,0x0d,0x97,0x48,0xec,0x25,0x02,0x05,0xe4,0x40,0x6d,0x7b,0xea,0x82, 0x7a,0xfe,0x99,0xc5,0x6d,0xa0,0xf4,0xfd,0x0b,0x0f,0x37,0x32,0xb0,0x17,0x3a,0xfe, 0x64,0x04,0x23,0xf4,0xe8,0x31,0xb4,0xa5,0x01,0x1d,0xc6,0xdf,0x7d,0xb4,0x07,0xa1, 0x54,0x8b,0x73,0xfb,0xe2,0x0c,0x51,0x8b,0xa1,0xf6,0x22,0x66,0x8c,0x0e,0x1d,0x30, 0xb6,0xf4,0xcd,0xab,0xd2,0xa2,0xa9,0x1c,0x64,0x52,0x6f,0xcb,0x39,0xc8,0xaf,0x56, 0x07,0x9e,0x51,0x41,0x4f,0x73,0x60,0x6a,0x3e,0xd3,0x47,0x31,0xd0,0x4d,0x74,0xb4, 0x0d,0xd8,0x80,0x02,0x7a,0xf0,0x08,0xb0,0xd0,0x0a,0xb6,0xe0,0x73,0x75,0x30,0x0e, 0x86,0xd0,0x06,0x5f,0xf0,0x06,0x8a,0x40,0x17,0x82,0x86,0x17,0x40,0x10,0x0b,0x05, 0xe3,0x31,0x81,0xe0,0x32,0x72,0x81,0x19,0x40,0x00,0x09,0xb6,0x06,0x08,0x6a,0x60, 0x45,0x68,0x10,0x0a,0xb5,0x60,0x04,0x7f,0xa0,0x0d,0x58,0x40,0x06,0xb4,0xd7,0x0a, 0x3a,0x80,0x7b,0x5d,0x30,0x08,0x87,0x20,0x0e,0x36,0x70,0x00,0xc8,0x70,0x00,0x5d, 0x80,0x04,0x45,0x47,0x08,0x86,0x90,0x08,0x97,0xb0,0x49,0xcb,0xc7,0x49,0xf8,0xf5, 0x49,0xcd,0x47,0x20,0x40,0x36,0x75,0xb1,0xf2,0x22,0x9d,0x61,0x28,0x73,0x93,0x57, 0x07,0x56,0x0b,0xcb,0xf6,0x7d,0xee,0x36,0x76,0xbd,0xe0,0x60,0x3d,0xd2,0x6c,0xc9, 0x54,0x0b,0x60,0xf8,0x0c,0xc9,0x24,0x0d,0xad,0x27,0x2a,0x33,0x20,0x33,0x67,0x38, 0x03,0xc0,0x20,0x47,0x4c,0x13,0x56,0x34,0x96,0x7f,0xe3,0xc4,0x3a,0x7e,0x27,0x56, 0x2d,0xe6,0x7f,0x5f,0xc5,0x0d,0x62,0xd5,0x33,0xaa,0x73,0x07,0x35,0x40,0x4e,0x70, 0xf0,0x01,0xd2,0x01,0x0e,0x6e,0x90,0x09,0x6c,0xf0,0x0c,0x84,0x00,0x0d,0xfe,0x87, 0x70,0x0e,0x11,0xa8,0x0d,0xda,0x40,0x09,0x34,0x00,0x06,0x81,0xc0,0x09,0x8e,0x15, 0x32,0xdd,0xe5,0x05,0x60,0x20,0x22,0xa4,0xc0,0x88,0x91,0x20,0x06,0x64,0xa0,0x0d, 0xd7,0xe0,0x89,0xb0,0x60,0x09,0x91,0x20,0x04,0xe2,0x80,0x0c,0x48,0x40,0x74,0x98, 0x70,0x08,0x84,0x30,0x08,0xab,0xd8,0x0a,0xa4,0x40,0x0a,0x87,0x70,0x04,0x69,0x70, 0x04,0x5d,0x40,0x08,0x5d,0x40,0x02,0x24,0xa0,0x03,0x84,0x70,0x08,0xa8,0x58,0x74, 0xa7,0x60,0x09,0x78,0xc0,0x49,0xcb,0x17,0x75,0x51,0x87,0x84,0x65,0x56,0x66,0x45, 0x60,0x84,0xd3,0x67,0x20,0xbd,0x24,0x4b,0xeb,0x43,0x68,0x1a,0xc8,0x21,0xac,0x41, 0x03,0xdf,0xa7,0x18,0x3d,0x22,0x7e,0x50,0x90,0x45,0x0e,0xd6,0x0b,0xd2,0xe0,0x7a, 0x46,0x20,0x0b,0x33,0x05,0x05,0x74,0x00,0x1b,0xbb,0x30,0x03,0xa1,0x33,0x03,0x3f, 0x52,0x03,0x2b,0xa6,0x80,0xa6,0xd6,0x33,0x57,0xf5,0x5b,0x71,0xd8,0x5c,0x34,0x56, 0x70,0xba,0x43,0x1d,0xf6,0x57,0x00,0x80,0x17,0x1d,0x05,0x50,0x03,0x3b,0xc0,0x34, 0x5a,0xb0,0x08,0x80,0x00,0x0c,0xa7,0xd0,0x05,0x98,0xd0,0x7b,0xe7,0x20,0x04,0x47, 0xf0,0x8a,0xf0,0xd5,0x31,0x76,0xe1,0x81,0xcf,0x20,0x0b,0x08,0x90,0x06,0xad,0x30, 0x08,0x83,0x40,0x0a,0xcf,0xf6,0x21,0xda,0xf0,0x8a,0xad,0x30,0x91,0x62,0xc0,0x88, 0xc1,0x80,0x05,0x50,0xf0,0x0a,0x9f,0x18,0x09,0xda,0x00,0x6d,0x9f,0xf8,0x0a,0xbd, 0x30,0x22,0xa4,0x20,0x04,0x69,0xa0,0x8a,0xa7,0x60,0x03,0xe2,0xd0,0xfe,0x07,0xac, 0xc8,0x8b,0x44,0xd7,0x05,0x03,0xf9,0x0b,0xa1,0xb0,0x06,0x11,0x35,0x16,0x19,0x35, 0x0b,0x9f,0xf0,0x09,0x1a,0xa5,0x7c,0x04,0x42,0x75,0x02,0xe6,0x17,0xb4,0x86,0x7d, 0xbe,0x30,0x40,0x16,0x58,0x08,0xed,0xe7,0x21,0xae,0xf1,0x07,0xe2,0xb7,0x85,0x63, 0x37,0x53,0xef,0x66,0x8d,0x31,0xe3,0x08,0x8c,0x01,0x2a,0xbb,0xc0,0x05,0xe5,0x88, 0x77,0x8e,0x86,0x12,0x84,0x14,0x4e,0x13,0x51,0x80,0x56,0xe5,0x25,0xbf,0xf1,0x86, 0x83,0xa7,0x69,0xf3,0x98,0x70,0xb6,0x03,0x07,0xb4,0xc0,0x5b,0x2d,0x21,0x05,0x8f, 0x40,0x0a,0x5d,0xc0,0x8b,0x05,0x49,0x08,0x98,0x60,0x74,0x75,0x60,0x09,0xda,0x50, 0x53,0x49,0x40,0x07,0x46,0x80,0x00,0x64,0x30,0x8a,0xe3,0x50,0x0c,0xae,0x57,0x3f, 0x5e,0xc0,0x20,0x6c,0xe7,0x05,0x6a,0xa0,0x08,0xf8,0xa3,0x06,0xb1,0x80,0x21,0x59, 0x00,0x08,0xda,0x05,0x5e,0xb3,0xe4,0x0b,0x74,0x96,0x07,0xc7,0xa4,0x0d,0x83,0xd9, 0x0a,0x47,0x20,0x04,0xad,0x20,0x0e,0x4c,0x50,0x8b,0x76,0x69,0x03,0xa7,0x50,0x74, 0x05,0x79,0x08,0xa4,0x80,0x06,0xa6,0x70,0x09,0x14,0x05,0x44,0x19,0x25,0x05,0x02, 0xa5,0x49,0x65,0xe6,0x7c,0xe0,0x96,0x32,0xdc,0xb5,0x3e,0x89,0x82,0x23,0xd5,0x44, 0x67,0x4c,0x39,0x38,0xf3,0x36,0x76,0x3d,0xb2,0x85,0xbc,0x02,0x0b,0xc6,0x69,0x38, 0xb0,0x50,0x0c,0xa0,0x53,0x0c,0x08,0x50,0x0c,0xff,0xc6,0x68,0x8c,0x86,0x00,0x26, 0x30,0x0e,0x77,0xb0,0x71,0xe1,0x24,0x56,0x1c,0x34,0x4e,0xd7,0xfe,0x12,0x8f,0xbf, 0x61,0x70,0xf9,0xc7,0x70,0x06,0x47,0x41,0xb1,0xb3,0x03,0x78,0xb4,0x0d,0xd3,0xa0, 0x0a,0x80,0xa0,0x0d,0x79,0x09,0x0d,0x79,0xd9,0x05,0x75,0x89,0x09,0xe7,0x60,0x03, 0x47,0x40,0x06,0xaf,0xf0,0x07,0x85,0x20,0x06,0xaf,0x20,0x0b,0x06,0x64,0x22,0x5f, 0x80,0x06,0x6f,0x90,0x73,0x5e,0x80,0x29,0x74,0x85,0x44,0x90,0xd9,0x22,0x00,0x13, 0x39,0x51,0x78,0x29,0x11,0xf3,0x16,0x60,0x60,0x08,0x29,0x69,0x04,0xa1,0xf8,0x0b, 0x3a,0x30,0xa1,0x87,0x80,0x9a,0x89,0x78,0x00,0x3e,0x98,0x97,0xa7,0x70,0x9a,0x84, 0x50,0x0c,0x78,0xd0,0x03,0x72,0x10,0x66,0x7e,0x22,0x50,0x41,0x04,0x44,0xc5,0xe8, 0x7c,0x56,0x97,0x32,0xae,0x75,0x61,0x9a,0xc5,0x52,0x90,0x00,0x09,0xeb,0x65,0x2a, 0x85,0xf0,0x9b,0x1e,0xd2,0x1a,0x5b,0xf8,0x7e,0xe5,0x78,0x86,0x8c,0x26,0x33,0xcc, 0x89,0x00,0x6f,0xe4,0xa3,0x40,0x3a,0x6d,0x26,0x30,0x9d,0xb9,0x43,0x56,0xd8,0x70, 0x7f,0xf8,0x48,0x4e,0x52,0x55,0x4e,0xf4,0x98,0x2c,0xe9,0xa4,0x54,0x77,0xb0,0x78, 0x7e,0x54,0x2d,0x77,0x80,0x08,0x32,0x10,0x07,0x45,0xf0,0x08,0xbf,0xd0,0x7b,0x98, 0xe0,0x0d,0x05,0x09,0x0d,0xde,0x50,0x74,0x7d,0x10,0x0c,0x57,0x00,0x0b,0x79,0x10, 0x0a,0x94,0x51,0x30,0x67,0x20,0x30,0x8f,0xb0,0x6c,0x8e,0x20,0x19,0x6d,0x30,0x46, 0xab,0x85,0x06,0xbd,0x06,0x4c,0x78,0x70,0x06,0xb1,0x40,0x2b,0x78,0xe1,0x5a,0x82, 0xa1,0x28,0xdb,0x37,0x3f,0x2f,0x65,0x67,0x50,0xa0,0x0d,0xfe,0xa1,0xc9,0x04,0xaa, 0x78,0x08,0xbc,0x88,0x0c,0xb8,0x98,0x9a,0x87,0x70,0x0a,0x87,0x90,0x8a,0x62,0x00, 0x04,0x7e,0x20,0x07,0x83,0x55,0x0a,0x00,0x52,0x5f,0x50,0xe7,0x49,0x53,0xd7,0x6d, 0x35,0xe2,0x75,0x01,0xb3,0x20,0x74,0xd1,0x06,0x16,0x38,0x77,0xbe,0x09,0x9c,0x0f, 0x46,0x03,0xe5,0xc8,0x68,0xca,0x59,0x0c,0x32,0x33,0x0e,0x42,0x1a,0x0c,0x43,0x4a, 0x06,0x26,0xf0,0x91,0xb4,0x6a,0x02,0x05,0xb0,0x3b,0x3c,0x53,0x69,0x97,0x86,0x4e, 0x4d,0xa2,0x9d,0x7d,0xc4,0x0e,0x4a,0xa3,0x70,0xbe,0xa5,0x34,0xd5,0x12,0x0d,0xd3, 0x50,0x0a,0x89,0x00,0x0c,0xba,0x77,0x00,0x24,0x30,0x08,0xda,0x60,0x09,0xa4,0x60, 0x09,0x62,0x20,0x0b,0xa1,0x10,0x17,0xb8,0x52,0x17,0x31,0x67,0x06,0xcf,0x90,0x7a, 0xa9,0x67,0x6c,0x74,0x11,0x08,0x78,0x41,0x45,0x0c,0xf2,0x05,0x66,0xc0,0xaa,0x57, 0x10,0x0c,0x42,0xa0,0x03,0x83,0x20,0x06,0xcf,0x60,0x08,0x34,0x60,0x06,0xd2,0x20, 0x5a,0x46,0xe0,0xa0,0xae,0x91,0x07,0x25,0xe9,0x73,0x47,0xf0,0x0b,0xac,0xe8,0xa8, 0x36,0xc9,0x04,0x8b,0x6a,0xa1,0x5d,0xc0,0x04,0x4c,0xd0,0x07,0xbd,0x00,0x08,0x10, 0xc5,0x49,0x8b,0xa0,0x0a,0x54,0xc0,0x13,0x3e,0x59,0x66,0x43,0x69,0x32,0xb1,0x54, 0x5e,0xb6,0x44,0x68,0x05,0x63,0x19,0x2f,0x6a,0x81,0x72,0xc7,0x6b,0xb9,0x22,0x0d, 0x3d,0x02,0x2a,0x3a,0xaa,0x4d,0xd2,0x39,0xab,0x43,0x0a,0xab,0xb0,0x8a,0x05,0x24, 0x5b,0x07,0x58,0x80,0x00,0x0d,0xb4,0x5c,0xac,0x63,0xfe,0x11,0xae,0xa3,0x70,0x4f, 0x5a,0x11,0xb0,0x93,0x34,0x41,0x93,0x03,0x91,0x56,0x03,0x18,0xa0,0x04,0x1f,0x60, 0x1b,0x8b,0xc0,0x06,0x33,0x20,0x0e,0x07,0x90,0x06,0x24,0x20,0x0e,0x83,0x10,0x09, 0xbf,0x40,0x0a,0x8d,0x61,0x08,0x9b,0xf0,0x08,0x6c,0xf1,0x28,0x95,0xe0,0x0a,0x85, 0x02,0x30,0x84,0xc1,0x08,0x78,0xa0,0x64,0x68,0xf0,0x0c,0xe6,0xa8,0x9c,0x8f,0x51, 0x9f,0x46,0x70,0x05,0xb2,0xf0,0x0c,0x80,0xc5,0x06,0x10,0x03,0x04,0x80,0x70,0x65, 0xb5,0x90,0x7a,0xbd,0xf0,0x6c,0x5e,0x00,0x22,0x46,0xf0,0x0a,0x42,0x20,0x04,0xbf, 0xa0,0xaf,0x14,0x89,0x83,0x98,0xa0,0xa8,0x4c,0xc0,0x9e,0xd0,0x90,0xb7,0x5d,0x60, 0x03,0xb9,0xb7,0xae,0x67,0x60,0x0a,0x55,0x27,0x51,0xa5,0x00,0x16,0x02,0xb2,0x7c, 0xb8,0x60,0x05,0x26,0x53,0x7d,0x72,0xf3,0x5a,0x1a,0x42,0x68,0x6f,0xf0,0xb8,0x6f, 0x71,0x5e,0x31,0x0a,0x06,0xc3,0x44,0x9c,0x67,0x98,0x4d,0xc5,0x00,0xab,0xb2,0x1a, 0x0c,0xc1,0x60,0x09,0x58,0xf0,0xb9,0x1f,0x69,0x09,0xe3,0x10,0x0c,0x75,0x10,0x0c, 0x2a,0xfb,0x86,0x6c,0x09,0x07,0xb4,0x03,0x3b,0xd5,0x52,0x2d,0x29,0xb6,0x03,0x4f, 0x02,0x3b,0x19,0x81,0x01,0xd3,0xb2,0x03,0x20,0xa0,0x0c,0x0f,0xb0,0x00,0x28,0x70, 0x09,0x8f,0x70,0x05,0xe2,0x40,0x02,0x82,0x80,0xa1,0x07,0x80,0x09,0xab,0xf8,0x0b, 0xaf,0x20,0x06,0xf6,0x59,0x65,0x7f,0x1b,0x05,0x02,0x44,0x67,0x60,0x00,0x0c,0xb0, 0x40,0x0a,0xbf,0xd0,0x07,0x42,0x00,0x93,0x69,0xfe,0x30,0xab,0xa3,0xcb,0x05,0x60, 0xab,0x19,0x22,0xa3,0x2a,0x59,0x20,0x57,0x6a,0x80,0x06,0x86,0xf0,0x0c,0x74,0x40, 0x22,0xb0,0x20,0x06,0x96,0xf0,0x0b,0xd0,0x4a,0x0a,0xe8,0x0b,0xab,0x75,0x30,0x08, 0xbf,0x40,0x08,0xbb,0x48,0x91,0x7d,0x90,0x8b,0x44,0xf7,0xa8,0x45,0x87,0x0c,0x12, 0x09,0xbf,0xd2,0xe0,0x05,0x8f,0xb0,0x06,0x7e,0x10,0x51,0xf9,0x52,0x9b,0x82,0x82, 0xb8,0x1d,0x95,0x16,0xb4,0x96,0x21,0x9a,0xf5,0xa9,0x77,0x01,0xb9,0x2d,0x53,0x4d, 0x3a,0xe2,0x05,0x91,0x91,0x04,0x79,0x90,0x86,0x3c,0x27,0x9d,0xd4,0x66,0xb2,0x58, 0x80,0xb2,0x58,0x30,0xab,0x9f,0x5b,0xba,0xb0,0x2a,0x41,0xac,0x03,0xbb,0x46,0xf3, 0x24,0x1f,0x60,0xb3,0x17,0xa1,0xba,0x47,0xc3,0x2c,0xcf,0x42,0xbb,0x45,0xf3,0x03, 0x30,0x70,0x01,0xf7,0x10,0x00,0x54,0x10,0x0a,0x69,0x20,0x08,0x82,0x20,0x7c,0x07, 0x80,0x0e,0xc3,0x7b,0x0a,0xc5,0x4b,0x07,0x9b,0xa0,0x06,0x9c,0x00,0x08,0x90,0xd0, 0x06,0xb3,0x45,0x6d,0x47,0x10,0x09,0xad,0xd0,0x07,0x36,0x50,0x07,0x7d,0xd0,0xa8, 0x9b,0xf8,0x0a,0xa2,0x35,0x19,0x5f,0x00,0x73,0x6d,0x60,0x06,0x79,0xd0,0x6c,0x60, 0x90,0x38,0xde,0x07,0x05,0xc5,0x90,0x04,0x7f,0x60,0x04,0xcf,0xd0,0x18,0x19,0x29, 0xbd,0xbf,0xc0,0x65,0xfa,0xfa,0x0b,0x4a,0xdc,0x07,0xba,0x28,0xbf,0x84,0x20,0xb7, 0xf2,0x5b,0x7c,0x47,0x6b,0x09,0x26,0x20,0x04,0xda,0x0b,0x06,0x79,0x53,0x09,0xaf, 0xf6,0x4a,0x9a,0x90,0x58,0x0f,0x8b,0x32,0xfe,0x08,0x0c,0x52,0xb7,0xb4,0x3e,0x0b, 0xdc,0x16,0x15,0xcb,0x9b,0x30,0xca,0x6b,0x3c,0xb2,0x2b,0x5c,0x00,0x0c,0xe3,0xe0, 0xaa,0x24,0x5b,0xb2,0x1c,0x4c,0xba,0x1b,0xfc,0xb9,0x29,0x5b,0x69,0x32,0x3b,0xbb, 0xb4,0xbb,0xc9,0xb3,0xd3,0x2c,0x4f,0xf2,0xc9,0x18,0x30,0x00,0x8d,0x40,0x01,0x57, 0xd2,0x08,0x4a,0x60,0x0e,0x25,0x60,0x0e,0x7b,0x70,0x01,0x56,0xf0,0x0b,0x16,0xf0, 0xca,0xb9,0xa0,0xc3,0x3e,0xd8,0x0a,0x5d,0xc6,0x6c,0x60,0x90,0x73,0x73,0xe1,0x05, 0xb1,0x87,0x05,0x35,0x48,0x91,0x87,0x40,0x02,0xb6,0x10,0x09,0x96,0xf0,0xa6,0x9b, 0x70,0x06,0x60,0xd0,0xa0,0x74,0xa0,0xbe,0x67,0xda,0x06,0x40,0xb0,0xa0,0x0b,0x95, 0x21,0xc0,0xf6,0x06,0x30,0x87,0xa6,0x96,0xc8,0x23,0xaf,0x28,0x06,0xd2,0x5b,0x91, 0x96,0xa0,0x03,0x30,0xa9,0x8a,0xbb,0x48,0x08,0xad,0x10,0xbf,0xde,0xac,0x9a,0xd3, 0x2b,0x0e,0x47,0xb0,0x4d,0x86,0x80,0x07,0x7e,0x60,0x05,0x9f,0xa0,0x0a,0x02,0xf2, 0x93,0x66,0xb6,0x58,0x8d,0x25,0x4d,0x10,0x33,0xc8,0x84,0xac,0x44,0x03,0x03,0xb9, 0x74,0x51,0x4d,0x57,0x88,0x8e,0xbb,0x70,0x05,0x43,0x3a,0xb2,0x75,0xe0,0xc1,0x96, 0x5c,0xc9,0x1c,0x6c,0xab,0xe0,0xe0,0x47,0xb0,0x1b,0x25,0x52,0x42,0xca,0xd2,0xa2, 0x25,0x39,0x10,0x0f,0xf1,0x90,0x03,0x53,0xd2,0x08,0xc9,0x81,0x1c,0x3f,0xc0,0x0b, 0x93,0xc0,0x03,0xf2,0x30,0x00,0x45,0x50,0x07,0xac,0x60,0x01,0x76,0x10,0xbc,0x38, 0x8c,0xa1,0x40,0xd8,0x05,0x1b,0xa9,0xfe,0x0d,0x60,0xb0,0x09,0x9a,0x81,0x06,0x41, 0x60,0x89,0x5f,0xdb,0xa0,0x46,0x90,0x07,0xb2,0xe0,0xae,0x60,0xd0,0x91,0x79,0x70, 0x0d,0xc8,0xeb,0x7d,0xb5,0xf0,0x08,0x80,0xd0,0x16,0xb3,0xb4,0xa2,0xf8,0x73,0xcc, 0x72,0x41,0x68,0x85,0x10,0x0a,0x85,0xe0,0x88,0xbd,0x00,0x6d,0xd2,0xdb,0x0a,0xf3, 0x0b,0x74,0x47,0x30,0x93,0x04,0x89,0x83,0x83,0x20,0x8b,0x7d,0x90,0x06,0xd4,0xc6, 0x04,0xc1,0x2c,0x04,0xc0,0xf0,0x0a,0x85,0xa0,0x07,0x77,0xd0,0x0c,0xe6,0x30,0x04, 0x3f,0x30,0x07,0x99,0xc0,0x6a,0xfc,0x52,0x7d,0xfe,0x22,0xc8,0x48,0x74,0x4b,0x6c, 0x81,0x30,0x84,0x56,0x6c,0x6f,0x51,0xc4,0x2e,0x65,0x08,0xb2,0x30,0x7e,0xa9,0x2a, 0x9d,0x99,0xdb,0xc1,0x1a,0xcc,0xc1,0x28,0xeb,0x73,0xa6,0x3b,0x11,0x17,0x01,0x25, 0x54,0xc2,0x1c,0xc7,0xf1,0x04,0x8d,0x00,0x2d,0x25,0x11,0xca,0x51,0x62,0xd1,0x1f, 0xa1,0x04,0x1e,0xc0,0x01,0xf4,0x30,0x0a,0x13,0x90,0x0a,0x60,0xc0,0x0a,0xe8,0x90, 0x0b,0xb9,0xe0,0x02,0xb9,0xf0,0x02,0x2e,0xe0,0x02,0x18,0x4a,0x90,0x84,0x10,0x09, 0x58,0x00,0x06,0xae,0x15,0x0b,0xa1,0xd0,0x67,0xb2,0xf0,0x08,0xea,0x45,0x77,0xb8, 0xf2,0x0a,0x60,0x50,0x0b,0x6a,0x5a,0x0b,0x94,0x90,0x5a,0x2b,0xe8,0x0b,0x65,0x1b, 0x17,0xd8,0xc7,0x38,0xa2,0xea,0x05,0x66,0xd0,0x06,0x8d,0x92,0x28,0x60,0xc0,0x82, 0x8d,0x41,0x0a,0x91,0x70,0xdc,0x58,0x10,0x09,0xf0,0x6b,0x7b,0xa2,0xa9,0x03,0x7d, 0x30,0x91,0x35,0x68,0xce,0x2c,0xfe,0x39,0x03,0x10,0x89,0x90,0xd8,0xcc,0x46,0xd7, 0x50,0x0b,0x56,0xe0,0x06,0x17,0x50,0x0f,0x15,0x30,0x0f,0xc4,0xb0,0x01,0xd3,0x40, 0x44,0x67,0x01,0x85,0x98,0x23,0x18,0x11,0x23,0x21,0x6d,0xdd,0xb8,0x4a,0xf4,0xb8, 0x2f,0x8a,0x2b,0xad,0x51,0xc1,0xe6,0x18,0x3a,0x6f,0xc4,0xb9,0xa5,0x6b,0xd0,0x96, 0x8c,0xb2,0xe3,0x30,0x4e,0xc2,0x41,0xd1,0xc6,0x01,0x02,0x00,0xee,0x11,0xc7,0x71, 0x25,0xd1,0xe2,0x0e,0xc8,0xa1,0x04,0x4a,0xf0,0x03,0x4a,0xa0,0x0b,0x25,0x90,0x00, 0x0e,0xe0,0x01,0x3b,0xf0,0x08,0x98,0xe0,0x02,0xe8,0x60,0x01,0x9b,0x4d,0xe1,0x07, 0x60,0x01,0x38,0x7c,0x0a,0x05,0x29,0x9f,0x58,0xc0,0x05,0x68,0x00,0x04,0x50,0x5b, 0x09,0xc0,0x64,0x08,0x7f,0xe0,0x08,0x7f,0x15,0x0a,0x41,0x40,0xbe,0xcf,0xd6,0x0b, 0x9e,0x48,0x07,0xb4,0x1d,0x0a,0x33,0x5d,0x08,0xeb,0xb5,0x5a,0x2c,0x55,0x72,0x40, 0x60,0x29,0x8e,0x19,0x08,0xbe,0x00,0x09,0xd7,0x44,0x07,0xd7,0x80,0xb4,0xda,0x20, 0x06,0x08,0xd9,0x07,0xbb,0x08,0x93,0xb7,0xd7,0x07,0x32,0x59,0xd5,0x42,0xf0,0xc5, 0x26,0x12,0x04,0x81,0xd0,0x39,0xcf,0x60,0x04,0x29,0x59,0x0b,0xaf,0xe0,0x05,0xb2, 0xb0,0x04,0x63,0x90,0x0e,0xf5,0x00,0x00,0x00,0x50,0x0f,0x17,0x00,0x02,0xd3,0x10, 0x06,0x4d,0x20,0x60,0x70,0x26,0x85,0x3e,0x15,0x39,0x21,0xf5,0x5a,0x9f,0x7a,0x30, 0x38,0xc7,0x76,0x1e,0xa2,0x68,0xe4,0x98,0x4d,0x43,0x9a,0xdf,0x1b,0xec,0xd7,0xc1, 0xb0,0xdf,0x77,0x80,0x11,0xfe,0x1f,0x30,0x00,0xc7,0x01,0x12,0x09,0x2e,0x12,0x88, 0x1d,0x2d,0xa2,0xac,0xe0,0x1b,0xa0,0x04,0x1b,0xd0,0x01,0x7b,0x90,0x00,0x25,0xe0, 0x01,0x39,0x10,0x0a,0x98,0xf0,0xca,0x14,0x1e,0xcb,0x9c,0xfd,0x7b,0xbf,0xc7,0x0a, 0x5d,0x0a,0x93,0x47,0x60,0x02,0xcf,0x60,0x06,0x41,0xd0,0x06,0xc5,0x16,0x0a,0xa1, 0xd0,0x0b,0x62,0x80,0x00,0x9b,0x9e,0x07,0x62,0x2c,0x19,0xa4,0x62,0x06,0x08,0x44, 0x07,0xb0,0xd0,0x0b,0x7f,0x35,0x6c,0x63,0x94,0x30,0x30,0xc2,0x06,0x8f,0x80,0xda, 0xcb,0x36,0x19,0x57,0x84,0xd4,0x7d,0x66,0x04,0xda,0x70,0x04,0xad,0xd0,0x05,0x3a, 0x10,0xd5,0xbf,0xf0,0x99,0x47,0xd7,0x0a,0x91,0x60,0x02,0x33,0x40,0x07,0x59,0x60, 0x0a,0x2c,0x02,0x04,0x51,0xc0,0x06,0x40,0x60,0x04,0x8e,0x10,0x7b,0x25,0xa2,0x40, 0x7a,0xa0,0x0c,0xf5,0xd0,0xe5,0xde,0x8d,0x03,0x01,0x70,0x0f,0x1c,0x50,0x06,0x81, 0x92,0x3e,0x7d,0xc1,0x17,0x3e,0x75,0xee,0x3e,0xe5,0xd6,0x48,0xf9,0xb8,0x77,0x6a, 0x81,0xb1,0x7d,0x85,0x0b,0xf6,0x07,0x5c,0xf0,0xc8,0x25,0xfb,0xb9,0x91,0xc0,0xc1, 0x1d,0x3c,0x0e,0x4b,0x82,0x11,0xa1,0xdc,0x08,0x8f,0x1d,0xe8,0x87,0xcd,0x1c,0x14, 0x00,0x02,0x88,0xbe,0x01,0x89,0x3e,0x04,0x01,0xe0,0x04,0x4a,0x00,0x02,0x45,0x80, 0x0c,0x2e,0xe0,0xd9,0x9d,0xfd,0x02,0xb1,0x8c,0xc3,0x3a,0xfc,0x83,0x48,0x60,0x03, 0x36,0xc0,0x04,0x62,0xf0,0x0b,0xda,0x60,0x04,0x05,0x13,0x19,0x2e,0x98,0x07,0xe7, 0x7a,0x04,0xb0,0x6a,0xfe,0x02,0x58,0x30,0x0e,0x1d,0xf9,0x0a,0x5d,0xbb,0x0b,0x2a, 0xff,0x9f,0x17,0xa6,0x17,0x4c,0x04,0x08,0x40,0xb0,0x09,0x46,0x70,0xd4,0x6f,0x00, 0x08,0xa8,0x4d,0xc1,0x43,0xae,0x0d,0x47,0x8b,0xbe,0x3e,0x07,0xb7,0x84,0xa0,0xe4, 0x69,0x90,0x06,0x3f,0x07,0x0c,0xc0,0x20,0xed,0x6c,0xd0,0x03,0xaf,0x02,0xb5,0xcc, 0xeb,0x6c,0x6d,0x17,0x04,0x26,0x8f,0x00,0x54,0x90,0x00,0x5e,0x5e,0xf5,0x5e,0x5e, 0x0f,0x2c,0x70,0x0c,0x03,0x80,0x0b,0x50,0x94,0x3e,0x46,0x69,0x28,0x95,0xf2,0x53, 0x49,0xb4,0x5a,0xff,0x29,0xaa,0x5f,0xb0,0x38,0x5d,0x44,0x07,0x49,0x20,0x0b,0x46, 0x85,0xc1,0xb3,0xca,0xb9,0x25,0x3b,0x9d,0x8b,0xf7,0x87,0xa2,0x4c,0xf0,0x08,0xae, 0xe0,0x3f,0x00,0xe0,0xc6,0x31,0x12,0x4f,0xa0,0x04,0x0a,0x60,0xf0,0x1b,0xe0,0x01, 0x93,0x30,0x05,0xc4,0xd0,0x08,0x1c,0x00,0x08,0xac,0x20,0xf1,0x9c,0x9d,0x0b,0xe2, 0x90,0x0b,0x39,0x8c,0x0e,0x3c,0x7c,0x00,0xac,0x90,0xb7,0x18,0xba,0xe4,0x91,0xf0, 0x0a,0xb5,0x8d,0x06,0x6e,0x01,0x6d,0x1f,0x69,0x02,0x5c,0x40,0x7b,0xb3,0xfa,0x0b, 0xcf,0x16,0x0c,0x53,0x7e,0x7e,0x74,0x10,0x04,0x68,0x90,0x05,0xd1,0x2e,0xb6,0x81, 0x50,0x22,0x0b,0x65,0x0a,0x8a,0xb0,0x09,0xcf,0x20,0x06,0xe1,0x9c,0x89,0x5b,0xe4, 0xdb,0x66,0x00,0x05,0xe8,0x1a,0xce,0x91,0x70,0x04,0x75,0x30,0x8a,0xc5,0x80,0x05, 0x5f,0x6b,0x29,0xa6,0x40,0xa9,0x9a,0x50,0x04,0x3d,0x50,0x09,0xa6,0xd7,0x0b,0x74, 0x00,0x06,0x7f,0xfe,0x30,0x0e,0x69,0xa0,0x03,0xbb,0xe0,0x0e,0x5d,0x6e,0xf5,0x5f, 0x1e,0x00,0x1a,0xc0,0x0b,0xc2,0x20,0x60,0x6f,0x76,0x46,0x86,0x32,0x64,0xb7,0xd4, 0xa2,0x2c,0x35,0x31,0x9b,0xb0,0x7d,0x88,0x31,0x4c,0xe4,0x68,0x5b,0xae,0x2a,0xa4, 0x21,0x3b,0x0e,0x08,0x60,0x62,0x18,0x51,0xf7,0x7e,0x9f,0x0d,0x77,0x9f,0xf7,0xc7, 0x61,0x0d,0xfe,0x0e,0xf8,0x88,0xbe,0x0c,0xdf,0x20,0x0a,0x3c,0x50,0x02,0x00,0x91, 0xed,0x8a,0x05,0x17,0x05,0x73,0xb9,0xc8,0x95,0xcb,0x82,0x05,0x85,0xe8,0x0e,0x20, 0x7b,0x28,0x4e,0x22,0xa1,0x48,0xc5,0x64,0xb5,0x79,0xc4,0x26,0xcb,0x99,0x50,0x5e, 0xbc,0x18,0x32,0xf3,0xe7,0x5a,0x31,0x58,0x91,0xc4,0x3c,0x0b,0xe2,0xc5,0x88,0x11, 0x1a,0x86,0xce,0x30,0x62,0x74,0x06,0x48,0xcc,0x2c,0x8c,0x4c,0x45,0x01,0x64,0x48, 0xda,0x35,0x6d,0x46,0xfe,0xa0,0x51,0xf3,0xa6,0x0d,0x1a,0x4a,0x86,0x6a,0xd1,0x70, 0x84,0x05,0x4b,0xa4,0x48,0xc1,0x22,0x09,0xb9,0x62,0x49,0x8c,0x2c,0x2f,0x6d,0xd8, 0xcc,0xb2,0x22,0xc7,0x94,0x94,0x59,0x9a,0xfc,0xbc,0x91,0x26,0x6b,0xc6,0x38,0x59, 0xc1,0x5a,0x89,0x4b,0x83,0xa6,0x41,0x3d,0x00,0xf5,0xea,0x55,0x98,0xa4,0x81,0xc1, 0x85,0x12,0xc7,0x16,0xf9,0x49,0xe4,0x47,0x6f,0xa2,0x44,0x7c,0xfc,0x2e,0x89,0x12, 0x98,0xd3,0x1a,0x45,0xb1,0x62,0x65,0xc1,0x83,0xc7,0x97,0x9a,0x33,0x81,0xda,0x50, 0xa2,0x54,0xa8,0x56,0x10,0x1a,0x74,0xa0,0xcc,0xb8,0x82,0xf9,0x0a,0x02,0x04,0x5c, 0x8a,0x8d,0xfe,0xcb,0x5c,0xa5,0x06,0xb3,0x0f,0x03,0x40,0xfc,0x50,0xb2,0x61,0x83, 0x02,0x25,0x3f,0x7e,0x80,0x78,0xf2,0xfa,0x49,0xea,0xd5,0xa8,0x47,0x39,0x9b,0x67, 0x40,0x03,0x1b,0x12,0x2f,0x5e,0xb8,0xf8,0x8d,0x0e,0x9d,0x20,0x74,0x2e,0x0e,0x10, 0xb7,0x30,0x5c,0xd0,0x01,0x12,0x24,0xba,0x0c,0xea,0x83,0xe5,0x59,0x1b,0x33,0x66, 0x0c,0x7d,0x69,0x43,0x87,0x4e,0xad,0x57,0x46,0x9e,0x41,0x21,0x35,0xe8,0xd7,0x2f, 0x31,0x50,0xc0,0xa8,0xc9,0xe2,0xa5,0xd6,0x17,0x2f,0x78,0x2a,0x55,0x42,0x13,0xaa, 0x57,0x2f,0x2f,0x40,0xdf,0x9c,0xc1,0x03,0x04,0x4c,0x10,0x47,0x66,0xbc,0x98,0xd1, 0xe6,0x95,0x57,0xb4,0x41,0xa0,0x18,0x2c,0xea,0x30,0xa1,0x8e,0xcf,0x8a,0x81,0xc2, 0x97,0x42,0xda,0x88,0x22,0x0c,0x29,0x7a,0xe0,0xeb,0x13,0x3f,0x96,0x88,0x25,0x88, 0xb2,0xea,0xa8,0x83,0x8b,0x3a,0xd2,0xe8,0xa3,0x95,0x47,0xaa,0x49,0xc0,0xad,0x7c, 0x84,0x19,0xe3,0x02,0x51,0x16,0x28,0xa1,0x91,0x4f,0x7a,0xc0,0x05,0x97,0x1e,0x66, 0xa4,0x90,0xaf,0xbe,0x4c,0x31,0xa5,0x12,0xc2,0x0c,0x3b,0x4c,0xb1,0xa0,0xce,0x80, 0xe4,0x8b,0x50,0x22,0x4b,0x42,0x1a,0x3a,0x80,0x99,0x01,0x49,0xcc,0xb8,0x98,0x81, 0x8b,0xcc,0x80,0xb9,0xa3,0x86,0x1c,0x3e,0xa0,0x00,0xb5,0x0e,0xae,0x54,0x22,0xcb, 0xd6,0x40,0x80,0x6d,0x36,0x05,0x58,0xfb,0xc1,0x03,0x18,0xec,0x71,0x62,0x01,0x50, 0x84,0x10,0xe4,0xb7,0xdf,0x5c,0x48,0xae,0x20,0x74,0x92,0xb3,0xc3,0x0e,0x0b,0xec, 0x10,0xfe,0xc4,0x06,0x1b,0x90,0x81,0x06,0x89,0x14,0x6c,0xa9,0x63,0x97,0x5a,0xc0, 0xc0,0xce,0x10,0x30,0x8e,0x82,0xe2,0x1a,0x4b,0xc8,0x80,0x85,0x27,0x31,0xfe,0xa8, 0x0a,0x0c,0x43,0x82,0x44,0x63,0x13,0x59,0xb6,0x03,0x02,0x88,0x58,0xd4,0x50,0x04, 0xbf,0x33,0x82,0xf8,0x23,0x40,0x30,0xda,0x08,0xa2,0xba,0x5e,0xa0,0xc8,0x03,0x0a, 0x60,0x10,0x38,0x30,0x92,0x02,0x8b,0x31,0x22,0x88,0x47,0xbe,0x38,0x63,0x09,0x2b, 0x16,0xe9,0x61,0x89,0x44,0x3e,0x59,0x24,0x11,0x3c,0x20,0xd9,0x65,0xd2,0x19,0x8e, 0x98,0x41,0x07,0x10,0x99,0x08,0xc5,0x8d,0x2d,0x2a,0x60,0xa0,0x9b,0x13,0x1e,0x78, 0x80,0x98,0x49,0x60,0x18,0xa3,0x08,0x39,0xa6,0xc5,0x45,0x0e,0x19,0x7b,0xc0,0xab, 0x2f,0x3e,0x6e,0xe2,0x64,0x30,0x45,0xbe,0x55,0x0c,0x88,0x37,0xde,0x70,0xec,0x0b, 0x4a,0xc0,0x30,0x83,0x06,0x53,0x77,0x99,0x61,0x17,0x60,0xdc,0xdd,0xc5,0x5d,0x59, 0x62,0x80,0x63,0x8c,0x01,0x62,0x4b,0xed,0x4a,0xd5,0xb2,0x74,0xed,0xb5,0x46,0x94, 0x00,0xf3,0x87,0x15,0x02,0xa8,0x20,0x80,0x11,0x00,0xb1,0xa1,0x38,0x85,0x10,0xb2, 0xe0,0x38,0x41,0x0e,0xb2,0x20,0x05,0x24,0x30,0xf1,0x06,0x89,0x03,0x2e,0xc6,0x04, 0x93,0x2e,0xc4,0x39,0xe2,0x08,0x6d,0xa4,0x29,0x04,0x12,0x40,0xd8,0xc0,0x23,0x10, 0x30,0x5e,0xf9,0x83,0x86,0x5e,0x5e,0xb9,0x26,0x8f,0x3f,0x5e,0xe9,0x05,0x96,0xf2, 0xc0,0x08,0xc5,0x90,0x37,0xb2,0x88,0x05,0x08,0x35,0x7c,0xf1,0x65,0x93,0x3f,0x48, 0xfe,0x11,0xa3,0x98,0x50,0x1e,0xf1,0x25,0x14,0x23,0xc0,0x78,0xa6,0x16,0x48,0x20, 0xf1,0x02,0x0c,0x1a,0x02,0x6c,0xb2,0x18,0x6d,0xcc,0xd8,0xe4,0x8b,0x20,0x7c,0x39, 0x43,0x11,0x57,0xac,0x48,0x64,0x89,0x25,0x16,0x99,0xa5,0x88,0xc1,0xce,0xc8,0xe3, 0x97,0x62,0xae,0xa8,0x43,0x88,0x34,0x48,0x38,0xe7,0x10,0x23,0xca,0x68,0x40,0x03, 0x49,0xa6,0xc0,0xa1,0x9e,0x04,0x44,0xb9,0x47,0x02,0x1f,0x2e,0x91,0xe3,0x12,0xbf, 0xa9,0xd5,0x63,0x46,0xbc,0xf8,0x58,0x02,0xc7,0xf7,0xba,0xe5,0x31,0x3f,0x35,0x02, 0x81,0x64,0x93,0x8f,0x28,0x53,0x99,0x54,0x52,0x7b,0xf9,0x23,0x8f,0x5e,0x68,0x90, 0x92,0xca,0xd3,0x14,0xd8,0x40,0xdf,0x0e,0x56,0xe3,0xd7,0x1a,0x10,0xf8,0x6d,0x44, 0x01,0x18,0x2a,0xa8,0xe7,0x1e,0x2b,0x8c,0x48,0x03,0x38,0xe2,0x1e,0x16,0x24,0xf6, 0xe5,0xd0,0x39,0x27,0x05,0x4f,0x3c,0x41,0x02,0x09,0x41,0x9a,0xf3,0xe6,0x90,0x2e, 0xd2,0x18,0xe7,0xe8,0x28,0xf2,0xc2,0x65,0x09,0x20,0x28,0xf1,0x62,0x93,0x5a,0xa4, 0x31,0xa3,0x16,0x28,0xfe,0x30,0x24,0x88,0x50,0x69,0x30,0xc2,0x3c,0x33,0xce,0x38, 0x43,0x28,0x30,0xc6,0x01,0x71,0x97,0x50,0xd8,0xd0,0xaf,0x16,0x33,0xda,0x50,0x03, 0x0d,0x3c,0xd6,0xe0,0xe4,0x0d,0x34,0xcc,0x70,0xa4,0xfd,0x2b,0x4c,0x08,0x46,0x8c, 0x36,0x6a,0x69,0xe3,0x8b,0x07,0x15,0x59,0x83,0x0f,0xad,0x97,0x90,0xa3,0x87,0x59, 0x8a,0x37,0x85,0x1a,0xfe,0xf0,0x8b,0x3e,0x88,0x43,0x07,0x7d,0x60,0x02,0x26,0xfe, 0xa0,0x71,0x08,0x33,0x64,0x02,0x1e,0x25,0xe0,0xc1,0x3d,0xdc,0x52,0x01,0x03,0xb0, 0x23,0x13,0xaa,0x68,0x42,0x06,0x3f,0xe1,0x37,0x4d,0x50,0x0b,0x17,0x7a,0xf1,0x03, 0xe1,0x0c,0x57,0x89,0xc1,0xc4,0x82,0x67,0x41,0x09,0x04,0x7b,0x24,0x53,0x8b,0x24, 0x14,0x89,0x7a,0x49,0xb8,0x1c,0x0d,0x92,0x10,0x84,0x1c,0xe4,0x20,0x19,0xf7,0xca, 0x97,0x07,0xf4,0xa5,0xa5,0xd6,0xbc,0x06,0x60,0x5c,0x52,0x47,0x89,0x2a,0x10,0x8e, 0x36,0x5c,0x41,0x1c,0x36,0x70,0x81,0xec,0x72,0x91,0x30,0x87,0x5c,0x8c,0x09,0xe7, 0x88,0x13,0x44,0x48,0x60,0x03,0x26,0x9c,0x42,0x63,0xe2,0xc0,0x82,0x17,0xce,0xe0, 0x8b,0x2c,0xb0,0x81,0x0f,0xef,0x89,0x42,0x4c,0x0c,0xf1,0x07,0x47,0xbc,0x22,0x5d, 0x46,0x98,0x81,0x09,0x76,0x01,0x05,0x3a,0x48,0x43,0x1a,0xb0,0x70,0x84,0x17,0x1c, 0x41,0x0a,0x4b,0x8c,0x23,0x14,0x80,0x68,0xc3,0x26,0xce,0x80,0x86,0xf6,0x44,0x81, 0x13,0x85,0x89,0xc5,0x26,0x4e,0xf6,0x0c,0x38,0x5a,0xe2,0x17,0xc1,0x30,0xc2,0x2e, 0x5e,0x61,0x88,0x6b,0x04,0x21,0x14,0x9b,0x78,0x44,0x2c,0x2e,0x94,0x05,0x45,0xc8, 0xca,0x0f,0x61,0xe3,0x43,0x0f,0x5c,0x11,0x88,0x6b,0xf4,0x81,0x10,0x12,0x21,0x01, 0x32,0x0e,0x41,0x88,0x5f,0xb8,0x42,0x04,0x25,0xd8,0x03,0x0c,0xb6,0x50,0x8f,0x76, 0xd4,0x63,0x0f,0xdd,0x00,0x85,0x0f,0x66,0xf1,0x89,0x59,0x64,0x30,0x83,0x97,0xe8, 0x60,0xff,0xb0,0x75,0xa1,0xc2,0x91,0x70,0x0d,0x6b,0xe8,0x11,0xb9,0x98,0xfe,0x56, 0x08,0x62,0x9a,0xa1,0x48,0x6e,0xa4,0xde,0x4a,0x6a,0x41,0x89,0x0f,0x60,0x60,0x00, 0x14,0x18,0x5d,0xe7,0x4e,0x70,0xa5,0xcf,0xf1,0xd0,0x35,0x59,0x7a,0xa6,0x08,0xd2, 0x51,0x8f,0x74,0x74,0x03,0x0c,0x47,0x38,0x4e,0xc3,0x96,0x33,0x45,0x74,0x2c,0xd1, 0x06,0x24,0xb8,0xd8,0x72,0x6c,0x20,0x0e,0x5b,0xf4,0x41,0x07,0x74,0xb4,0x44,0x1d, 0xae,0x90,0x87,0xa1,0xbc,0x21,0x16,0x8a,0x78,0x8f,0xd7,0x72,0xf6,0x08,0xc7,0x19, 0xc2,0x08,0x26,0x30,0xc1,0x11,0xb0,0x20,0x04,0x4b,0x68,0x83,0x8e,0x62,0x10,0x03, 0x19,0xce,0x93,0xb3,0xc9,0x78,0x41,0x1a,0xd9,0xc3,0xe7,0x1a,0xb2,0xf0,0x85,0x24, 0xb4,0x01,0x0c,0x64,0x98,0x41,0x31,0xea,0xd0,0x0a,0x4b,0x04,0x43,0x9e,0x34,0xa0, 0x81,0x34,0x7a,0x71,0x9d,0x47,0xa0,0xc1,0x0f,0x95,0xe0,0xd9,0x12,0x2e,0xd1,0x03, 0x39,0xcc,0x62,0x5a,0x4d,0x70,0x45,0x1b,0xae,0xf1,0x0b,0x4c,0x5c,0x8c,0x15,0x84, 0x68,0x45,0x1f,0x9e,0x61,0x05,0x08,0xf0,0xa2,0x04,0x93,0x08,0x80,0x5b,0xb8,0x39, 0x89,0x09,0xa0,0xa0,0x14,0x47,0xe5,0xca,0x2c,0x6a,0xf9,0x37,0x6b,0x51,0xe8,0x2f, 0xa6,0xe0,0x84,0x8e,0xb2,0xe0,0x8b,0xfb,0x04,0xc9,0x7e,0x85,0x68,0x61,0x12,0x42, 0x3a,0xc3,0x20,0xcc,0xb0,0x10,0x1f,0xa0,0x52,0x23,0x50,0xd3,0x39,0x0f,0xe8,0x50, 0x5f,0xac,0x51,0x02,0x97,0x94,0xd0,0x88,0x2a,0x28,0x01,0x06,0x04,0x63,0x00,0x23, 0x84,0x60,0x83,0x03,0x14,0xc7,0x02,0x76,0xd2,0xc1,0x01,0x10,0x72,0xfe,0x1c,0xbe, 0x92,0xe0,0x88,0xe8,0xa4,0x22,0x21,0x0e,0xc1,0x04,0x1b,0xb8,0x13,0x2a,0x94,0xf0, 0x05,0x27,0xfc,0xe2,0x8a,0x44,0xac,0x01,0x0d,0xaf,0x20,0xc5,0x21,0x5a,0xf1,0x8b, 0x34,0xd4,0xe1,0x08,0x69,0x68,0xa7,0x18,0xca,0x68,0x84,0x2f,0xf8,0x02,0x0f,0xff, 0x49,0x59,0x67,0x15,0xe1,0x87,0x28,0xc4,0x02,0x48,0x41,0xf8,0x42,0x20,0x3c,0x42, 0x83,0x71,0xf4,0x81,0x14,0xbf,0xb8,0x86,0x47,0x0b,0x6a,0x86,0x42,0x38,0x8d,0x12, 0x55,0x23,0xd9,0xce,0xd6,0x10,0xa3,0x95,0xfa,0xa1,0x07,0x54,0xd0,0x43,0x25,0x0c, 0x21,0x86,0x41,0xa0,0xf3,0x1c,0xd0,0x20,0x04,0x16,0x64,0x71,0x84,0x47,0x44,0xe3, 0x03,0x1b,0x50,0xc7,0x05,0xd2,0x01,0x80,0x04,0x0c,0xa1,0x04,0xea,0x90,0x81,0x2a, 0xa8,0xa0,0x0a,0x55,0x94,0x22,0xa9,0x9f,0x28,0x02,0x2e,0xad,0x35,0xb8,0x6d,0xf9, 0x51,0x11,0xbe,0x00,0xc2,0x19,0xea,0xd7,0x34,0x30,0xec,0x47,0x7a,0x49,0xa8,0x45, 0xf4,0x0c,0x51,0x08,0x4a,0xdc,0xb0,0x11,0xf8,0xba,0x92,0x2e,0x3c,0xa0,0x5f,0x0f, 0xec,0x0b,0x35,0xa8,0xa9,0xc2,0x0f,0x56,0x61,0xac,0x74,0x84,0x60,0x06,0xb6,0x58, 0x8e,0x20,0x0a,0x52,0x10,0x41,0x10,0x44,0x21,0xc4,0x39,0x40,0x72,0xce,0x01,0xbb, 0xe1,0xf0,0x95,0x09,0x3a,0x38,0x02,0x29,0x68,0xd0,0x9e,0x9a,0x00,0x01,0x0d,0xa6, 0x02,0xc3,0x00,0xfb,0x00,0x22,0x42,0x64,0x6c,0x10,0x91,0xb0,0xc4,0xf8,0x2a,0xe5, 0xb4,0xc7,0x24,0xe1,0x0b,0x80,0xc8,0xc2,0x1f,0x19,0xe1,0x38,0xfe,0x30,0x00,0xc5, 0x17,0xb1,0x08,0x84,0x11,0xc4,0xa0,0x0d,0x4b,0x14,0x83,0x06,0x62,0x90,0x67,0x31, 0xcc,0xd8,0x8b,0x24,0x38,0x82,0x06,0x81,0x48,0x82,0xb8,0xce,0x10,0x8b,0x35,0xc8, 0x4a,0x0e,0x9f,0x30,0x85,0x26,0xa4,0x40,0x85,0x1e,0x28,0x22,0x09,0x75,0xe8,0x03, 0x09,0xec,0x90,0x02,0x6f,0xb0,0x93,0x04,0x4c,0x90,0x85,0x15,0xa6,0x01,0x8e,0x63, 0x94,0x20,0x00,0x27,0x70,0xc3,0x00,0x22,0x30,0x89,0x5b,0x74,0x42,0xbb,0xdc,0x3d, 0xaa,0x77,0x8f,0x1a,0x07,0x1f,0xa0,0x40,0x0b,0xec,0x50,0xc0,0x18,0x96,0x50,0x09, 0x45,0x28,0x86,0x71,0x5e,0x40,0xde,0x47,0xa2,0x27,0xbd,0x20,0xd4,0x82,0x98,0x91, 0x19,0xc0,0x7d,0xad,0xd4,0x81,0xfd,0xf2,0xb7,0xbf,0xaa,0x01,0x13,0x0c,0xe0,0x11, 0x00,0x50,0x54,0xe3,0x01,0x0e,0xd0,0x43,0x1a,0xd6,0x56,0x4e,0xdf,0x1c,0x24,0x76, 0x07,0xb0,0x81,0x05,0x04,0x21,0x84,0x08,0x0b,0x22,0x05,0x0f,0xb3,0x00,0x3a,0xe1, 0x74,0x80,0x0b,0xc3,0xa2,0x55,0x46,0x96,0x9e,0x17,0x66,0x80,0x05,0x4b,0xd0,0x31, 0x12,0x7d,0xb0,0x01,0x21,0x08,0x41,0x8a,0xee,0x68,0x91,0x12,0x8e,0xf8,0x83,0x7f, 0x82,0x60,0x33,0xfc,0xf9,0x22,0x10,0x47,0x31,0x43,0x8d,0x03,0x11,0x8b,0x4a,0xbc, 0xa1,0x69,0x41,0xe8,0x85,0x18,0x82,0xf0,0x8a,0x5f,0x20,0x08,0x01,0x95,0x21,0xe3, 0x35,0x92,0x10,0x8a,0x2f,0xa0,0xa1,0x31,0x78,0x78,0x43,0xe1,0x7a,0x70,0x09,0x3f, 0xe0,0xe2,0x12,0x61,0xf8,0x04,0x2e,0x80,0xf0,0x8c,0x3a,0xfe,0xe8,0x80,0x15,0x98, 0x40,0x42,0x1a,0xa8,0x78,0xce,0x5d,0x98,0x62,0x16,0x32,0xe8,0x80,0x00,0xac,0x90, 0x09,0x61,0xec,0xa0,0x19,0x01,0x98,0x04,0x2d,0xc2,0x10,0x86,0x32,0xa4,0x02,0x11, 0x39,0xf0,0x80,0x03,0x60,0xf0,0x00,0x1c,0xa0,0x2e,0x1d,0xd5,0x28,0x82,0x79,0x17, 0x93,0x42,0x2f,0x98,0x2b,0x08,0x2b,0x34,0x83,0xf4,0x04,0x05,0x06,0x4a,0x7c,0xa1, 0x11,0x8d,0xd8,0x5c,0x59,0x75,0x31,0x72,0x1d,0x7a,0x80,0x73,0x90,0x96,0x80,0x13, 0x70,0x10,0x82,0x69,0x5c,0x60,0x02,0xba,0x78,0xc4,0x11,0x09,0x02,0x1c,0x84,0xe4, 0x02,0x1d,0x2f,0x88,0x9d,0x9c,0x98,0x83,0xea,0x34,0x2d,0x67,0x4e,0x07,0x61,0x75, 0x17,0x0e,0x41,0x0a,0x28,0xb4,0xa1,0x12,0xe9,0x85,0x02,0xaa,0x7e,0x61,0x45,0x64, 0xd8,0xe0,0x9d,0xdd,0x49,0x42,0x88,0xb5,0x71,0x0d,0x1a,0x0c,0x5b,0x26,0x78,0x50, 0x03,0x25,0xf2,0x90,0x04,0xf5,0x78,0x61,0x0d,0x8c,0x79,0x44,0x1b,0x18,0x87,0x06, 0x43,0x3b,0x42,0x0c,0xb0,0x68,0x05,0x47,0x65,0xf1,0xe3,0x6b,0x08,0xe8,0x15,0x41, 0x30,0x42,0x21,0xb4,0xb8,0xe4,0x2c,0x44,0xa1,0x12,0x7d,0x8b,0x91,0x1c,0xbc,0x8b, 0x97,0x4d,0x5c,0x21,0x12,0xe2,0x38,0x85,0x37,0xb4,0x8c,0xce,0x03,0xf4,0xe1,0xc5, 0x9f,0x70,0xc3,0x0f,0x18,0xf1,0x88,0x22,0x74,0xc2,0x0d,0x0e,0x00,0x80,0x39,0x56, 0xc0,0x02,0x62,0x30,0x20,0x01,0xf7,0x68,0xc0,0x13,0x86,0x30,0x41,0x07,0x4c,0xa3, 0x6b,0x83,0x51,0x0c,0x90,0xbe,0x60,0x2e,0x4a,0x48,0xfe,0x2f,0xe3,0x1a,0x6f,0x2f, 0xf2,0xbe,0xf0,0x04,0x90,0xe7,0x70,0xe4,0xfc,0x55,0x40,0x07,0x4e,0x2e,0x81,0x0b, 0x6c,0x61,0x0a,0xe0,0x28,0x01,0x0c,0xd6,0xa1,0x84,0x50,0x90,0xa0,0xc1,0xb9,0xf0, 0xcd,0xed,0x16,0xc2,0x26,0x1b,0xc4,0xae,0x89,0xe9,0x1c,0xce,0x42,0x18,0x92,0x8b, 0x2e,0xfc,0x42,0x1b,0x5e,0xb0,0xe7,0x23,0x4a,0x9f,0x87,0x56,0x08,0x76,0x94,0x83, 0x68,0x05,0x02,0x66,0x70,0x24,0xa5,0xd4,0x01,0x8e,0x46,0xae,0x94,0x22,0xb2,0x43, 0x75,0x7e,0x06,0x62,0x67,0x98,0x02,0xd5,0x1b,0xf0,0xd0,0x86,0x5e,0x18,0x14,0x65, 0x7d,0x10,0x82,0x09,0x8c,0x9c,0x87,0x00,0x59,0x62,0x17,0xe3,0x80,0x82,0x4e,0xd0, 0x30,0x2e,0x26,0xaf,0xc1,0x15,0x9f,0xd0,0x04,0x69,0xa9,0x96,0x4f,0xd8,0x33,0x4e, 0x08,0x05,0xa7,0x20,0x04,0x68,0x40,0x27,0xe7,0xc8,0x98,0x71,0xe0,0x82,0x36,0x58, 0x84,0x72,0x88,0x06,0x20,0xd8,0x04,0x57,0x50,0x05,0x07,0x70,0x0b,0x00,0xd0,0xc0, 0x74,0xc8,0x06,0x2a,0x98,0x05,0x61,0xc0,0x87,0x7a,0x90,0x84,0x72,0xe0,0x1a,0xc0, 0x00,0x26,0x70,0x73,0x0c,0x40,0xab,0x2d,0x43,0x98,0xa1,0x19,0x8a,0x1e,0xfa,0x3a, 0x97,0x50,0xe0,0x92,0x6b,0x6a,0xb4,0x66,0xd0,0x85,0x15,0xd0,0xaf,0xcf,0xf1,0x80, 0x21,0x60,0x00,0x27,0x50,0x01,0x03,0xb8,0x07,0x15,0x70,0x86,0x3d,0x68,0x00,0x34, 0x28,0x3e,0x84,0x08,0xbe,0x14,0x48,0x8e,0xba,0x7a,0x13,0x51,0xcb,0x85,0xe5,0xb8, 0x98,0x38,0xb9,0x98,0xa6,0x4b,0x83,0x45,0xe9,0xfe,0x85,0x20,0x00,0x03,0x59,0x30, 0x01,0x1d,0x20,0x84,0x41,0x18,0xa5,0x56,0x80,0x85,0xb7,0xa3,0x81,0x19,0x40,0x80, 0x0f,0x39,0x02,0x0e,0x21,0x85,0x3c,0x38,0x97,0x67,0x98,0x81,0x57,0x10,0x83,0x5e, 0x30,0x82,0xdb,0xca,0x82,0xf4,0x5a,0x03,0x20,0xe8,0xb6,0xc4,0xda,0x04,0x04,0xc0, 0x3e,0x23,0x38,0x83,0x9c,0x32,0x81,0xfc,0xa3,0x04,0x1a,0xe0,0x09,0x28,0xd8,0x05, 0x92,0x50,0x99,0x6e,0x8b,0xb1,0x25,0xd0,0x9a,0xff,0xe9,0x81,0x0e,0xea,0x1a,0x5c, 0x60,0x04,0x1d,0x01,0x03,0x2c,0x88,0x2c,0xc2,0xeb,0x82,0x2e,0x38,0x07,0x12,0xa8, 0x83,0x5f,0x80,0x82,0x22,0xe0,0x86,0x1c,0x48,0x85,0x32,0x70,0x07,0x11,0xc8,0x07, 0xb6,0x70,0x8b,0x6a,0x28,0x83,0x39,0x68,0x80,0x04,0x90,0x04,0x76,0x90,0x02,0x5c, 0xd0,0x83,0x44,0xc8,0x11,0x4e,0x30,0x21,0xa1,0xa8,0x9a,0xfd,0x30,0xa6,0x16,0x2a, 0xb4,0xc9,0x20,0xa6,0xf6,0x02,0x83,0x7e,0x51,0x0d,0x91,0x2b,0xab,0x61,0x64,0x34, 0x1e,0x08,0x00,0x15,0xc0,0x81,0x2d,0x50,0x81,0x65,0x54,0x81,0x2d,0x18,0x86,0x67, 0x40,0xa7,0x72,0x02,0x3e,0x4f,0xc0,0x04,0x9d,0x7b,0x1d,0x74,0xd0,0xb9,0x03,0x60, 0x85,0x73,0x38,0x07,0x26,0x40,0x06,0x71,0xb0,0x04,0x21,0x08,0x06,0x5a,0x43,0xb1, 0x5f,0x38,0x02,0x2c,0x22,0x05,0x6d,0xe8,0x05,0x40,0x09,0x84,0x67,0x70,0x84,0x48, 0x48,0x03,0x1d,0xc0,0xb0,0x3a,0xc0,0x82,0x5d,0x58,0x09,0x03,0x09,0x06,0x13,0x98, 0xba,0x3c,0xd8,0x04,0x34,0xf0,0x05,0x48,0xfe,0xb8,0x2d,0xfb,0xe1,0xa3,0x33,0xf0, 0x02,0x32,0x78,0x27,0x34,0xe0,0x04,0x6d,0x70,0x3e,0x74,0x99,0x1f,0x43,0xc8,0x03, 0x47,0x00,0x86,0x60,0x40,0x00,0x94,0x31,0x83,0x2f,0x80,0x84,0x35,0xa8,0x84,0x25, 0xc8,0x82,0x4a,0x68,0x82,0xfe,0xc1,0x85,0x4f,0x68,0x2c,0x3e,0xf0,0x05,0xbb,0xe3, 0x84,0x67,0xf8,0x85,0xb3,0xd8,0x9d,0x8c,0x49,0x81,0xc2,0x6b,0x85,0x41,0x80,0x02, 0x55,0x98,0x03,0x0a,0x58,0x01,0x01,0x90,0x84,0x74,0x48,0x07,0x7a,0x28,0x91,0x2d, 0x48,0x80,0x74,0x18,0x82,0x72,0xa0,0x82,0x26,0xb8,0x84,0x0f,0xda,0x96,0x12,0x02, 0x02,0xc6,0x21,0xbd,0xf7,0x32,0xbd,0x5a,0x50,0x4a,0xb9,0x83,0x8c,0x5f,0xd4,0x92, 0x0d,0x18,0xc6,0x61,0x3c,0x01,0x0f,0x58,0x81,0x3d,0xd8,0x02,0x1f,0xdc,0x02,0x03, 0xc0,0x01,0x15,0x60,0x16,0x06,0xa8,0x06,0x2c,0x68,0x8e,0xe2,0x60,0x13,0x24,0xf0, 0x04,0x39,0x69,0x18,0x51,0x23,0x8e,0x77,0xcb,0x18,0x8d,0xb1,0x84,0x6b,0xb8,0x06, 0x3a,0x70,0x04,0x59,0x90,0x85,0x5d,0x48,0x1b,0x71,0xf8,0x85,0x57,0xc8,0x83,0x42, 0xb8,0x31,0x89,0x02,0x06,0xb5,0x49,0x03,0x71,0xe8,0x83,0x48,0xc0,0x02,0x04,0x80, 0xa3,0x76,0x4b,0x83,0x04,0x49,0x03,0x4b,0xa0,0x01,0xf2,0x39,0x03,0x69,0xa0,0x01, 0xf1,0x79,0x05,0x34,0x98,0x81,0x19,0x00,0x8f,0x41,0xf8,0x83,0x58,0xe8,0x81,0xe1, 0x7a,0x85,0x37,0xd0,0xcb,0x7f,0x34,0x04,0x16,0xd4,0x06,0x60,0x28,0x06,0xeb,0x08, 0x82,0xdb,0x8a,0x05,0xc0,0xe0,0x84,0xfe,0x44,0xe8,0x48,0x18,0xb1,0x02,0x3f,0x50, 0x04,0x3f,0x0a,0x84,0x35,0x38,0x1f,0x6a,0xd3,0x81,0x23,0x82,0x86,0x2e,0x60,0x05, 0x5b,0x10,0x83,0x1f,0xd3,0x86,0x4a,0xc8,0x04,0x37,0x60,0x87,0x78,0x08,0x81,0x11, 0x38,0x81,0x6a,0xa8,0x86,0x10,0xc8,0x06,0x76,0x88,0x06,0x2a,0x28,0x85,0x59,0xf0, 0x1b,0xa1,0x8c,0x82,0x13,0x04,0x37,0x48,0x78,0x8c,0x42,0x78,0xaf,0x56,0x89,0xaf, 0xf9,0x82,0x8c,0xa6,0xe4,0x1c,0x7d,0x31,0x2b,0x7d,0xd9,0x00,0x5d,0x28,0x81,0x2d, 0xc0,0x01,0x06,0x50,0x01,0x0d,0xe8,0x80,0xf3,0x34,0x80,0x29,0xd0,0x80,0x05,0x00, 0x04,0x5b,0x40,0xa7,0x82,0x78,0x01,0xdc,0x61,0x88,0x74,0xaa,0x2b,0x41,0x60,0x85, 0x4b,0x3c,0x85,0x41,0xa0,0x23,0x1e,0xab,0xb5,0x6a,0xeb,0x98,0x34,0xc0,0x82,0x3c, 0x80,0x84,0x58,0x50,0xbf,0x35,0x30,0x84,0x2b,0x10,0x02,0xbf,0x1c,0x28,0x0e,0xd9, 0xc4,0xb3,0x18,0xb1,0x33,0x2c,0x86,0x42,0x60,0x8f,0x3c,0x50,0x43,0x69,0x88,0x04, 0x98,0x11,0x83,0x34,0x40,0x9b,0x5f,0x30,0x04,0xf4,0xc9,0x82,0x57,0xa0,0x03,0x40, 0xf8,0x82,0x2c,0x50,0xc4,0x1a,0x63,0x3f,0x34,0x9a,0x01,0x23,0x58,0xa6,0x20,0x40, 0x83,0x1c,0x61,0xb6,0x44,0xa0,0x96,0x44,0xc0,0x85,0x44,0x38,0x2f,0x4e,0x70,0xa4, 0xf2,0x31,0x03,0x31,0xd0,0x01,0x26,0xa8,0x22,0xdf,0x11,0x07,0x40,0xc0,0x85,0x28, 0x88,0x24,0x4d,0x88,0x83,0x30,0xa0,0x82,0x23,0x0d,0x83,0x38,0x50,0x85,0x38,0x88, 0x83,0x45,0xe8,0x2e,0x29,0xd8,0xfe,0xa0,0xfe,0xb9,0x10,0x3e,0x43,0x8c,0xc5,0xc9, 0xa3,0x73,0xe9,0x2a,0x37,0x1a,0x36,0x8d,0x9b,0xaf,0xcf,0xa4,0x04,0x69,0xa2,0xa6, 0x7d,0x79,0xca,0xe8,0x4a,0x00,0x06,0xb8,0x87,0x08,0xa0,0x00,0x03,0xe8,0x80,0x29, 0x80,0x87,0x49,0x90,0x00,0x61,0x20,0x05,0x12,0x10,0x35,0x0b,0x78,0x01,0xdb,0x71, 0xc2,0xe4,0x10,0x07,0x41,0xb0,0x83,0xe6,0x38,0x00,0x68,0xb8,0x4d,0xf1,0x90,0x0a, 0x31,0x60,0x0a,0x47,0x20,0x83,0x5d,0xf0,0x02,0x35,0x48,0x0c,0x34,0x90,0x06,0x31, 0x68,0x05,0x0c,0x6b,0x05,0x3a,0x0a,0x86,0x60,0xf8,0xcb,0x75,0x92,0x08,0x61,0xc1, 0x82,0x96,0xe8,0x05,0x43,0xf9,0x03,0x23,0x68,0x37,0x4b,0x40,0x80,0xa7,0x50,0x10, 0x30,0xf0,0x82,0xe8,0xf4,0x05,0x91,0x02,0x02,0x40,0x08,0x21,0x3f,0x70,0x85,0xec, 0xa1,0x04,0x20,0xd0,0x2a,0xa7,0xe9,0x05,0xb1,0x53,0x03,0x39,0x58,0x83,0x91,0x1c, 0x37,0x59,0x64,0xac,0x25,0x58,0x03,0xfc,0xf8,0x02,0x28,0x78,0x84,0x50,0x00,0x03, 0x6d,0x08,0x06,0x76,0x3a,0x85,0x63,0x65,0x85,0x3c,0x48,0x84,0x59,0x58,0x04,0x29, 0x58,0x04,0x27,0x4d,0xd2,0x81,0x43,0xd2,0x45,0xa0,0x82,0x45,0x38,0xaa,0x59,0x6a, 0xaa,0xae,0xa9,0x04,0x13,0xc2,0xba,0x14,0xea,0x88,0xa2,0x08,0x95,0x8b,0xab,0x8e, 0x8b,0x93,0x1e,0x4a,0xf8,0x93,0xef,0x54,0x0d,0xff,0xba,0x26,0x25,0xc8,0x37,0x07, 0x60,0x81,0x1d,0x80,0x80,0x51,0x18,0x05,0x27,0x98,0x84,0x15,0x18,0x00,0x01,0x08, 0x85,0x73,0x78,0x42,0x53,0xfe,0x93,0x98,0x85,0x90,0xc6,0x70,0x12,0x04,0x5b,0x48, 0x83,0xe7,0x68,0x85,0x60,0x13,0x12,0x31,0x78,0x85,0xa1,0xf0,0x88,0xfc,0x60,0x9a, 0x6b,0x20,0x85,0x56,0x10,0x82,0x89,0x74,0x84,0x6b,0xf8,0x10,0x5c,0x2b,0x3c,0x89, 0x38,0x4c,0x60,0x80,0x82,0x46,0x15,0x03,0x52,0x88,0x2d,0x26,0xb0,0x85,0x60,0x58, 0xd0,0x34,0x10,0xc7,0x67,0x88,0x05,0x3c,0xc8,0x1e,0x20,0xe8,0x05,0x53,0x78,0x83, 0xfe,0xd1,0x84,0x4b,0xe0,0x83,0x2c,0x08,0x04,0x45,0x58,0x9a,0x36,0x90,0x06,0xa5, 0x54,0x03,0x35,0x00,0x82,0x22,0x50,0x04,0x35,0xc8,0x9f,0x0f,0xd2,0x91,0x25,0xe0, 0x84,0xc5,0xc8,0x19,0x3a,0x90,0x21,0x69,0x70,0x04,0x91,0xad,0xa2,0x2e,0xd0,0x18, 0x68,0x78,0x04,0x39,0x70,0xd6,0x52,0xa0,0x82,0xed,0x4a,0xd2,0xa9,0xb5,0x56,0x55, 0x58,0x84,0x66,0xdd,0x20,0x19,0x09,0x21,0xf3,0x52,0x0c,0x72,0x11,0x12,0xe4,0x89, 0x8c,0x2e,0x95,0xaf,0xe8,0x31,0x34,0x62,0x8a,0xca,0x0d,0xb0,0xa6,0xd3,0x70,0x8d, 0x27,0x80,0x8d,0x1f,0x28,0x07,0x49,0x58,0x46,0x27,0xd0,0x87,0x08,0xa8,0x81,0x63, 0x70,0x05,0x26,0xc8,0x05,0x3b,0xd0,0x46,0x8a,0x61,0x82,0x04,0x3b,0x8e,0x05,0x3c, 0x00,0xbb,0x14,0x03,0x43,0x68,0x83,0x4a,0x61,0x04,0xe9,0x09,0x92,0xaa,0x68,0x83, 0xc7,0xa8,0x85,0x6b,0xe8,0x0f,0x36,0x24,0x03,0x52,0x20,0x04,0x26,0x98,0x22,0x90, 0x45,0x8b,0xc3,0x34,0x01,0x2c,0xe8,0xd8,0x5f,0x00,0x9a,0x5f,0xb0,0x05,0x26,0xc0, 0x02,0xc3,0x12,0x47,0xfe,0x60,0x00,0x04,0x5f,0xb0,0x48,0x48,0x38,0x03,0x3e,0xe3, 0x04,0x5c,0x0a,0xca,0x44,0xd8,0x48,0xc5,0xe0,0x84,0x33,0x00,0x83,0x40,0x30,0x3f, 0x3c,0xc8,0x02,0x29,0xa8,0xc3,0xd7,0xd4,0x0b,0x3c,0x50,0x84,0x3f,0x92,0x09,0xf4, 0x48,0x82,0x96,0x81,0x82,0xa4,0xbd,0xb5,0x43,0x38,0x84,0xa6,0x15,0x83,0x71,0x93, 0x82,0x52,0xc0,0x5a,0xee,0xda,0x2e,0x38,0x9b,0x85,0xe6,0x94,0xd2,0xf1,0xea,0x0b, 0x3f,0x3a,0x59,0x9d,0x61,0x9c,0x4d,0x70,0x1c,0x40,0xfb,0xcc,0x42,0x30,0x0a,0xf0, 0x1d,0xb6,0x5e,0x8c,0xca,0x6a,0x4a,0x2b,0x2e,0x61,0xbd,0x27,0x60,0xbd,0xd6,0x0b, 0x00,0x1c,0x10,0x81,0x64,0x10,0x93,0x0f,0x08,0x81,0x54,0x20,0x84,0x53,0xe3,0xd3, 0x89,0x41,0x06,0x77,0x02,0x25,0x2a,0xba,0xc4,0x5f,0x58,0x50,0x2c,0x30,0x1a,0xea, 0x81,0x85,0x3f,0xd8,0xb6,0x37,0x40,0x2f,0xb2,0xa1,0x83,0x3c,0x9a,0x44,0x1d,0xa8, 0x3e,0x4c,0x38,0x05,0x42,0x38,0x05,0x71,0x48,0x1b,0x21,0x38,0x10,0x0e,0x11,0x82, 0x0f,0xa9,0xbe,0x43,0xc0,0xb0,0x34,0x20,0x84,0x8e,0x15,0x03,0x33,0x40,0xaf,0x4d, 0x28,0x50,0x45,0xf8,0x22,0x53,0x80,0x11,0x29,0xe8,0x1f,0x36,0x10,0x5a,0x66,0xfb, 0xba,0xac,0xa1,0xaa,0xa3,0x2b,0x82,0xc5,0xe0,0x33,0xc0,0x00,0x84,0x50,0xc0,0xba, 0x50,0x40,0x03,0x20,0x08,0x85,0x36,0x88,0x04,0xb1,0x40,0x80,0x71,0xe8,0x18,0x5d, 0xab,0x29,0x2a,0x42,0x83,0xbe,0x69,0x82,0x38,0xcb,0x5a,0x28,0x05,0x9b,0x4f,0x90, 0x02,0x29,0x00,0xfe,0x4a,0xeb,0x45,0x4d,0x89,0x5a,0x0c,0x61,0xfa,0x82,0x5b,0xac, 0xe2,0x73,0x31,0x5b,0xa3,0xa8,0x05,0x2f,0x08,0x05,0x92,0xd3,0x85,0x6a,0x92,0x8d, 0x46,0xa0,0x80,0x8f,0x5b,0xdf,0x27,0x80,0x80,0x65,0x24,0x06,0x37,0xd8,0x00,0x7b, 0x88,0x80,0x11,0x18,0x06,0x31,0xe8,0x82,0xba,0x3a,0x07,0x07,0x66,0x02,0xb5,0xc1, 0x02,0x79,0xb3,0x81,0x81,0x25,0xa5,0x3a,0x18,0x87,0x3f,0x14,0x03,0xf2,0x80,0x82, 0x5a,0x08,0x05,0x20,0x40,0x59,0x42,0x56,0x1e,0xa4,0x20,0x85,0x02,0x4a,0xa0,0x48, 0x20,0x04,0xa9,0x18,0x28,0x81,0x7a,0xe4,0x34,0x38,0x82,0x1e,0x1d,0x04,0x5d,0x8b, 0x47,0x2e,0x44,0xa8,0x24,0x40,0x03,0x48,0xc0,0xc2,0x33,0x30,0x61,0xa1,0xf5,0x03, 0x4e,0xb0,0x16,0x57,0xe8,0x16,0x5c,0x58,0x83,0x28,0xc8,0x91,0x4a,0xc8,0x02,0x91, 0x4c,0xac,0xdd,0x8a,0x85,0x36,0x00,0x37,0x4e,0x88,0x02,0x48,0x30,0x82,0x21,0xe9, 0x85,0x50,0x38,0x03,0x3a,0x40,0x83,0x04,0x31,0x01,0x2e,0x18,0xa8,0x34,0xf8,0x05, 0xe4,0xa5,0x2b,0x1b,0xa8,0x03,0x46,0x08,0x2f,0x26,0x9e,0x85,0xe6,0x8d,0x33,0x27, 0xb6,0xa5,0x0e,0xc2,0x96,0xae,0xf1,0xa3,0x13,0xfc,0x11,0xc6,0xa9,0x9f,0xaa,0xe9, 0x08,0x47,0xd9,0xb8,0x2f,0xf5,0x82,0x15,0x68,0xb4,0xfe,0xe2,0x17,0x0a,0x00,0x67, 0x0a,0x48,0x34,0x71,0x7e,0x02,0x01,0x58,0x46,0x0d,0xc0,0x00,0x1e,0x70,0xd3,0x09, 0x68,0x00,0x30,0xc0,0x04,0xe1,0xb0,0x80,0x2e,0x80,0x86,0x47,0x8d,0x58,0xf8,0x0b, 0x86,0x23,0xfe,0x60,0x02,0x52,0x3a,0x94,0x1d,0xd6,0x86,0x44,0x71,0x04,0xf0,0x7d, 0x83,0xf4,0x0a,0x04,0x20,0x68,0x03,0xb4,0x1b,0x25,0x5b,0xd0,0x81,0x5d,0xe8,0x0f, 0x6d,0x20,0x83,0x5f,0x60,0x60,0x21,0x68,0x05,0x2c,0x53,0x1b,0x1f,0x65,0x82,0xeb, 0xbb,0xac,0x23,0xd8,0xb1,0x57,0xf8,0x13,0x52,0x35,0x84,0xd3,0xec,0x59,0x96,0x35, 0xd1,0x25,0x78,0x03,0xc5,0xfa,0x22,0x7c,0x0a,0x65,0xc5,0x82,0x04,0x45,0xb4,0x02, 0x3e,0xd0,0xde,0x20,0xc8,0x1f,0x2f,0xb8,0x82,0x50,0xa0,0x81,0x57,0xd0,0x22,0x47, 0xc8,0x28,0x7a,0xdc,0xdc,0x2b,0x48,0x83,0x48,0xa8,0x64,0x71,0x98,0x22,0x5b,0xb0, 0x0a,0xd7,0xa5,0x25,0xa5,0x6a,0xe2,0xa5,0xe2,0xa0,0xf1,0x5a,0x02,0x3e,0xf0,0xa3, 0x3f,0x32,0xa1,0xa0,0xb8,0x0f,0x6a,0xee,0x08,0x40,0xe3,0xb8,0x73,0x21,0x26,0xfa, 0xca,0x80,0x15,0xc0,0xc1,0xfe,0x52,0x80,0xb6,0x15,0x63,0x71,0x06,0xe7,0x64,0x48, 0x86,0x21,0x50,0xb9,0x0b,0x80,0x00,0x78,0x68,0x00,0x06,0x10,0x01,0x79,0x00,0x04, 0x25,0x44,0x08,0x87,0x38,0xa2,0x02,0x82,0x58,0x5b,0x28,0x2c,0xb4,0x08,0x0f,0xca, 0xd2,0x34,0x61,0x69,0x05,0x6d,0x60,0xc1,0xda,0xba,0x86,0x8e,0x25,0x05,0x56,0x91, 0x1e,0x1a,0x28,0xc3,0x23,0x28,0xa0,0xbb,0xbe,0xac,0x3e,0x18,0x84,0x41,0xb8,0xc4, 0x51,0xc2,0x29,0x8e,0x91,0x8a,0x51,0x21,0x95,0x3f,0x08,0x02,0xf4,0x28,0x4a,0x63, 0x8b,0x85,0xa1,0xdd,0xa2,0x8c,0x24,0x21,0x3c,0x08,0x21,0x57,0x90,0x03,0xfd,0x31, 0x05,0xfe,0x45,0xb0,0x02,0x53,0x58,0xb2,0x37,0xb8,0x06,0xfc,0x30,0x83,0xe0,0x39, 0x9b,0x8f,0xa0,0x03,0x2c,0xd0,0x69,0x21,0x10,0x4c,0x2c,0x30,0x01,0xf8,0x93,0x08, 0xf8,0x24,0xe6,0x8d,0x0c,0x2f,0x39,0x68,0x82,0x4f,0x18,0xea,0x4f,0x00,0x4a,0x4d, 0x00,0x6e,0xae,0xf5,0x0b,0x6e,0x21,0x8c,0xa9,0x7a,0x83,0x1f,0x59,0x1a,0xee,0x35, 0x17,0x30,0xd8,0x84,0xc7,0xc0,0x62,0x30,0x80,0x80,0x63,0xc0,0xea,0x47,0xcb,0x12, 0x10,0x68,0x84,0x01,0xc0,0xee,0x67,0xa2,0x00,0x0c,0x98,0x57,0x15,0x80,0x01,0x18, 0x88,0x80,0x4b,0x90,0x80,0x07,0xf0,0x80,0x50,0xc0,0x04,0xe0,0x7b,0x01,0x86,0x30, 0x8e,0xba,0xf2,0x53,0xc2,0x13,0x04,0x5d,0x3b,0x85,0x29,0x02,0x2c,0x8c,0x76,0x04, 0x58,0x90,0x99,0xb6,0x13,0xd1,0x42,0x81,0xac,0x48,0xc0,0x67,0x26,0x78,0x54,0xb4, 0x00,0xcc,0x3e,0xf0,0xa4,0x43,0x38,0x05,0xe4,0xd5,0xb5,0x41,0x40,0x10,0x2e,0x90, 0x36,0x91,0x20,0x83,0x40,0x06,0x94,0x24,0x70,0x9c,0x20,0x50,0x84,0x47,0x80,0x82, 0x4d,0x90,0xa8,0x5f,0x1a,0xe8,0x1e,0xa8,0x84,0xbc,0xe0,0x04,0x52,0x36,0x05,0x5c, 0x50,0x04,0xe8,0xf3,0x08,0x72,0x81,0x82,0x3a,0x90,0x05,0x2c,0xe0,0x02,0x28,0x08, 0x02,0x03,0xd1,0xe9,0x8e,0x31,0x01,0x71,0x7c,0x0a,0x76,0x22,0x2c,0x5b,0xb0,0x05, 0x2f,0xc0,0x4c,0xbe,0x31,0xb7,0x4b,0xd8,0xed,0x22,0xf8,0x6d,0x1c,0x87,0x45,0x6d, 0x29,0xc0,0x13,0x44,0xaf,0x69,0xae,0x1f,0xf6,0xa8,0xb8,0x2f,0xe0,0x38,0xf0,0x35, 0xfe,0x84,0x63,0xb8,0xea,0x66,0x68,0x06,0x30,0x86,0x0d,0x31,0xd6,0x6e,0x0a,0x38, 0x86,0x49,0x78,0x00,0x15,0xb8,0x07,0x06,0x10,0x06,0x29,0x98,0x03,0x1e,0x98,0x86, 0x5f,0x60,0x85,0xe2,0x58,0x93,0x27,0x44,0xcb,0x28,0xb4,0x85,0x03,0xb0,0x03,0x6f, 0x64,0x85,0xc0,0xed,0x02,0x64,0x60,0x0a,0x58,0x20,0x83,0x9e,0xf0,0x82,0x7e,0x16, 0x44,0x47,0xed,0x02,0xc2,0x32,0xa0,0x56,0xb0,0x01,0x5b,0x10,0x07,0xc2,0x72,0x2d, 0x2b,0xb2,0x3e,0xeb,0x9b,0x54,0x04,0xd0,0x86,0x3f,0x28,0x06,0x43,0x72,0x84,0x62, 0x68,0x9f,0x74,0xb9,0x06,0xa4,0x91,0x85,0x67,0x98,0x2a,0x42,0x7e,0x03,0x4a,0xf8, 0x25,0x5f,0x80,0x29,0x3f,0xb8,0x04,0x3d,0xf8,0x20,0x70,0x93,0xd9,0xd0,0x33,0x02, 0xe5,0xba,0x60,0x6d,0x20,0xc4,0x62,0xf0,0xa8,0x79,0xd4,0x34,0xcb,0xfa,0x4b,0x1f, 0xdd,0x73,0x52,0x60,0x04,0x96,0x7a,0xd9,0x69,0x09,0x2f,0x1d,0xe7,0x1b,0x5c,0x8a, 0x91,0x0f,0xea,0x8b,0xc2,0x31,0xaf,0xa9,0xf2,0x91,0xc6,0x68,0xee,0x2a,0x6e,0x83, 0x8a,0x13,0x56,0x42,0x63,0x72,0xac,0x5e,0x01,0xd9,0xfb,0x01,0xd1,0xe9,0x92,0xf4, 0xdd,0x80,0x7d,0xb8,0x80,0x29,0x50,0x81,0x29,0x50,0x86,0x45,0x28,0x83,0x69,0x58, 0x04,0x34,0xf0,0x9d,0xe1,0x60,0x13,0x9b,0x8b,0x9d,0x25,0x4c,0x81,0x14,0x60,0x02, 0xe5,0xe0,0x2b,0xe6,0x10,0xba,0x56,0x70,0x6d,0x32,0x10,0x03,0xa4,0xf1,0x0c,0x85, 0x8c,0x63,0x81,0x05,0x11,0x3e,0x07,0xcc,0x73,0x92,0x88,0x3e,0xc0,0x84,0x2e,0xfe, 0x44,0x5e,0xe4,0x8d,0x68,0x2c,0x18,0x8b,0xc9,0x9c,0x4c,0x04,0xb8,0x82,0x2b,0x08, 0x86,0x5d,0x88,0x1f,0xb7,0x74,0x04,0xec,0xa8,0x38,0x5f,0xa8,0x48,0x4e,0x08,0x04, 0x2f,0x72,0x85,0xac,0xed,0xc8,0x58,0x30,0x05,0x3d,0xc8,0x82,0xe3,0x76,0x2c,0x3a, 0xd0,0x86,0x19,0xb0,0xac,0x7c,0x54,0x0a,0x2c,0x28,0x86,0x5f,0x18,0x04,0xbf,0xec, 0x18,0xc2,0xee,0xf3,0x63,0xed,0x83,0x4d,0xc8,0xf1,0xe7,0xec,0x1b,0xbf,0x71,0x5d, 0x69,0xa1,0xd2,0x10,0xea,0xa5,0xc1,0x90,0xcd,0x48,0xb7,0xdd,0xe6,0x96,0x79,0xf6, 0xf8,0xcc,0x24,0x48,0xb6,0xab,0xe6,0x2f,0xd9,0xdb,0x12,0xd8,0x40,0x5f,0x10,0x20, 0x07,0x15,0xb8,0x00,0x0d,0xd8,0x02,0x49,0xc8,0x80,0x45,0x20,0x02,0x2b,0x78,0x05, 0xa1,0x3b,0x84,0xe1,0xd3,0x2b,0x87,0x59,0x8e,0x2d,0x43,0x02,0x3a,0xb1,0x83,0xe3, 0x43,0x86,0x7c,0x1e,0x04,0x83,0x0c,0x06,0x4b,0xd0,0x0e,0x89,0x34,0x81,0x96,0xfc, 0x05,0xa5,0x10,0x02,0x5c,0x03,0xa5,0x2f,0xfb,0x2b,0x71,0x80,0x60,0x5d,0x13,0xba, 0x93,0x44,0x90,0x8c,0x32,0x81,0x8c,0xca,0xa8,0xee,0x3b,0x82,0x38,0xf7,0xdc,0x59, 0x0d,0x82,0x46,0x22,0x32,0x58,0xc1,0x83,0xa4,0xe6,0x03,0x55,0x08,0x03,0x97,0x32, 0x05,0x1a,0xe5,0x03,0x5a,0xc4,0x85,0xcf,0xa2,0x04,0x59,0xb8,0x60,0x8f,0x52,0x8a, 0x60,0x80,0x85,0xf0,0x80,0xed,0x76,0x6b,0x85,0xbf,0x14,0x87,0x4b,0x64,0xcb,0x44, 0x00,0x6e,0xf1,0xb2,0x16,0x94,0xe7,0xf1,0x26,0xc8,0xa5,0x5d,0xea,0x1a,0xfe,0x6e, 0x29,0x8c,0x2c,0x30,0x6e,0xc7,0x68,0xee,0x3c,0x92,0x6a,0x16,0x84,0xaf,0xab,0x2e, 0x2b,0xb5,0xed,0x21,0x2e,0x61,0xfd,0x46,0xc8,0x00,0x9d,0xcc,0x07,0x0d,0x98,0x87, 0x21,0x18,0x81,0x32,0x40,0x01,0x20,0x60,0x35,0xff,0x46,0x06,0x3b,0xed,0xf6,0xba, 0xd2,0xab,0x37,0x89,0x13,0x3a,0xb9,0x98,0xe1,0xe7,0xf3,0x4a,0x26,0xa5,0x48,0x48, 0x99,0x39,0x22,0x05,0x32,0xa8,0x3a,0x43,0xf8,0x10,0x1d,0x38,0xa7,0x04,0xea,0x02, 0xbf,0xf2,0x51,0x71,0x50,0x1b,0xc0,0x3c,0xa0,0x34,0xc8,0xa9,0x60,0x00,0x06,0x60, 0xa0,0x47,0x8a,0x7f,0x05,0x04,0xd0,0x81,0x0a,0xae,0x83,0x48,0xd0,0x01,0x4b,0x80, 0x84,0x5e,0x30,0x83,0x02,0xb9,0x86,0x9a,0x41,0x48,0x53,0x88,0x85,0x4b,0x28,0x82, 0x38,0xe8,0x81,0xdd,0x26,0x40,0x57,0x10,0xda,0x1e,0x00,0x37,0x20,0x80,0x04,0x58, 0xf8,0x7a,0x60,0x01,0x08,0x2c,0xc1,0xb8,0x88,0x69,0x55,0xa7,0x4e,0x1a,0x1d,0x69, 0xc4,0xf5,0x61,0x62,0x8b,0x09,0x32,0x1b,0x5d,0x80,0xc8,0xd1,0xa4,0xe9,0x92,0x9c, 0x8c,0xb8,0x70,0x69,0x6a,0xf2,0xa9,0xc8,0x45,0x4d,0x72,0x7a,0xf8,0xf1,0xc3,0x67, 0x49,0x14,0x4e,0x6b,0x62,0xb1,0xc4,0xa3,0xe6,0x0c,0xa4,0x36,0x5f,0x66,0x52,0xa2, 0x64,0xc8,0x4c,0x92,0x24,0x41,0x3c,0x74,0xe8,0xa0,0x40,0x09,0x50,0x10,0x3f,0x86, 0x82,0x00,0xf1,0x04,0x44,0x89,0x0a,0xf5,0x54,0x3c,0xd8,0x17,0x01,0x46,0x15,0x29, 0x60,0x6c,0x21,0xe8,0xc3,0xe5,0x8a,0x20,0x0b,0xde,0x52,0x1c,0xb0,0xfe,0x73,0x20, 0x6b,0x57,0x3b,0x82,0x04,0x91,0xb0,0x65,0x4b,0x87,0x8e,0x3e,0x07,0x06,0x89,0x11, 0xf3,0x8a,0x06,0x0d,0x23,0xa4,0x7e,0x19,0x79,0x04,0x46,0x9b,0xa5,0x34,0x7d,0x6c, 0x1c,0x20,0xd1,0xe5,0xd4,0xa9,0x3e,0x3a,0xce,0x1e,0xc1,0x32,0x18,0xad,0x90,0x85, 0xe2,0x4c,0xc8,0x92,0x75,0x44,0x88,0x11,0x47,0x62,0x2c,0xa1,0x3d,0x12,0x2c,0xf1, 0x91,0x19,0x7f,0xfe,0x58,0xba,0x52,0x47,0x5a,0xa1,0x20,0x81,0x5c,0x99,0x8a,0xd5, 0x63,0x56,0xa9,0x44,0x54,0x54,0x2d,0xba,0x84,0x6b,0x09,0x1f,0x3f,0x6b,0xf0,0xb8, 0x0c,0xa2,0xad,0x8e,0x10,0x13,0x58,0x4c,0xec,0xfa,0xf3,0x2b,0x8d,0x90,0x23,0x3a, 0xc4,0x0d,0x37,0x6b,0xc3,0x06,0x09,0x1b,0xd7,0x7a,0x5c,0xb2,0x28,0xa7,0xb9,0xc8, 0x8e,0x52,0x66,0x35,0x29,0x92,0xd1,0xca,0x46,0x93,0x28,0x57,0xc6,0xca,0xe2,0x4b, 0xcd,0x9b,0x40,0x6d,0x36,0x7d,0x09,0xe5,0xc5,0xa6,0xce,0x20,0x41,0x7c,0xfe,0xfc, 0xf1,0xe4,0x7d,0x51,0xa3,0x46,0x27,0xa4,0x03,0x50,0x61,0xcb,0xbc,0x12,0x06,0x02, 0x68,0x88,0x77,0x05,0x4b,0x1a,0xc1,0x38,0x76,0xc0,0x39,0x84,0x78,0x23,0x96,0x05, 0xe8,0x88,0x45,0x16,0x09,0xc4,0x29,0x14,0xcc,0x11,0x0d,0xfd,0xf2,0x4b,0x2b,0xa4, 0x5c,0x23,0xc6,0x2f,0x8e,0x48,0x63,0x84,0x5b,0x8e,0x90,0xd1,0x87,0x38,0xc8,0x89, 0x33,0x08,0x89,0xc2,0xf5,0xe1,0xd9,0x2e,0x75,0x44,0x28,0x44,0x31,0x91,0xf4,0x91, 0x99,0x11,0x10,0x22,0x80,0x93,0x36,0xc4,0xa5,0x51,0x47,0x24,0xfe,0x3a,0x18,0x64, 0xc9,0x2b,0x62,0x20,0xe0,0xd9,0x35,0x50,0x38,0x82,0x46,0x16,0x95,0x28,0x92,0xc8, 0x27,0xb8,0x5c,0x12,0x07,0x15,0xab,0x35,0xe1,0x87,0x1c,0x7e,0x98,0xb2,0x46,0x25, 0x40,0x9c,0x01,0xc5,0x15,0xc1,0x04,0x63,0x42,0x30,0x8e,0x04,0x91,0x57,0x1a,0x39, 0xda,0x22,0x0e,0x99,0x64,0xda,0x72,0xc0,0x01,0xde,0x30,0x72,0x09,0x74,0x9a,0x14, 0xd1,0x04,0x9b,0x1f,0xcd,0xf2,0x09,0x9c,0x9a,0x60,0x47,0x52,0x22,0x7c,0x44,0xb1, 0x86,0x22,0xdd,0xf9,0xf2,0xc6,0x19,0x30,0xb5,0xe1,0xc5,0x17,0x60,0x50,0x52,0x88, 0x4e,0x3a,0x0d,0xf5,0x83,0x51,0x8d,0x50,0x40,0x41,0x23,0x8d,0x3c,0x11,0xa9,0x12, 0xf4,0x88,0xd2,0xc0,0x13,0xa3,0x24,0xf0,0xc0,0x16,0x09,0xac,0xe2,0x0a,0x29,0x62, 0xe8,0x30,0x43,0x30,0x21,0x1e,0x82,0x49,0x0a,0x62,0xb9,0x20,0xc8,0x57,0x98,0xb4, 0xd2,0xc5,0x70,0x91,0xb4,0x42,0x88,0x38,0x24,0x30,0x61,0x09,0x29,0x75,0xe8,0x70, 0x44,0x2b,0xbf,0x90,0x22,0x4e,0x1d,0xbb,0xb4,0x65,0x89,0x2d,0x7e,0xfd,0x72,0xc8, 0x20,0xad,0x68,0x23,0x44,0x2b,0x33,0x6a,0xc3,0xe1,0x2f,0x47,0xd4,0x81,0xc0,0x2f, 0x84,0xb8,0x45,0x83,0x36,0x62,0x5c,0x23,0x4d,0x2d,0x62,0xbc,0x28,0x4e,0x1a,0xc0, 0x09,0x31,0x43,0x31,0x33,0x20,0x10,0x04,0x25,0x79,0x40,0xf1,0x47,0x21,0xb1,0x54, 0x52,0x09,0x95,0x3d,0xf0,0x11,0x46,0x29,0x52,0x64,0xe2,0x64,0x11,0x52,0x24,0xd2, 0x43,0x22,0x89,0xc4,0x72,0x06,0x18,0xcf,0x04,0x03,0x8c,0xfe,0x09,0x34,0x6c,0xe2, 0x88,0x10,0xe2,0x1c,0xf1,0xcb,0x20,0x87,0x10,0x72,0x08,0x13,0xc7,0x61,0x82,0x89, 0x37,0xbb,0x70,0xf4,0x1c,0x9b,0x1e,0x79,0x44,0xdd,0x47,0x6c,0x6a,0xd4,0x83,0xbc, 0xa6,0x70,0xe2,0x27,0x10,0x80,0x8a,0xf7,0x85,0x17,0x85,0xa8,0xac,0x9e,0x4e,0xb5, 0x38,0x1a,0xe9,0x00,0x31,0xc7,0x4c,0x81,0x3b,0x03,0x34,0xc2,0x0b,0x0f,0x03,0x80, 0x03,0x07,0x0c,0x5b,0xa8,0x90,0xc0,0x3e,0xe5,0x68,0xc3,0x59,0x1d,0x33,0x0c,0xd7, 0x87,0x25,0x5d,0x1c,0x82,0xa6,0x05,0x82,0xd8,0x81,0x0e,0x2b,0xde,0x74,0xc1,0x84, 0x38,0x84,0x4c,0x48,0x26,0x13,0x83,0x10,0xd2,0x45,0x88,0x7d,0x58,0x7b,0x85,0x11, 0x58,0x68,0x43,0xca,0x21,0x24,0x1c,0x80,0xcc,0x21,0xa1,0x5e,0xe3,0x48,0x1d,0xc1, 0x18,0x11,0x48,0x21,0x50,0x48,0x43,0x47,0x61,0xc1,0xcc,0xe5,0x56,0x10,0xd7,0xfc, 0x71,0x8d,0xca,0x7f,0x0c,0x27,0x0e,0x13,0x85,0x71,0x31,0x83,0x11,0xbb,0x5c,0x01, 0x06,0x24,0x66,0x7c,0x61,0x04,0x14,0xb1,0x28,0x32,0xf2,0x12,0x9c,0xe8,0x51,0xc6, 0x22,0x71,0xf8,0x50,0x46,0x26,0x52,0x94,0x12,0x06,0x46,0x7c,0x68,0xe2,0x47,0x2c, 0x83,0x3a,0xb2,0xcb,0x0c,0x5e,0xbc,0x51,0x48,0x8e,0x3a,0x44,0xa2,0xf5,0x21,0xd0, 0x38,0xf4,0x10,0xc5,0xe2,0xb0,0xc1,0x26,0xed,0x1d,0xcd,0x32,0xe7,0x74,0x97,0xbc, 0x29,0xd2,0x48,0xfc,0x8a,0xbc,0xd2,0x77,0x81,0x9c,0x81,0x06,0xca,0x94,0x04,0x51, 0x8b,0x21,0x86,0x04,0xa1,0x13,0x18,0x14,0x60,0x90,0xfe,0xcc,0xf3,0x18,0x60,0xf0, 0xc1,0x07,0xd2,0x27,0xd3,0xc0,0x24,0x8d,0xe4,0xf0,0x83,0x00,0x18,0x4c,0x12,0xc0, 0x16,0x0e,0x00,0x92,0x2d,0x29,0xcf,0x0c,0x97,0x90,0x0d,0x0f,0x23,0x73,0x00,0x72, 0xad,0x1e,0x82,0x0c,0xe0,0x5d,0x10,0x32,0x88,0x59,0x5e,0x1f,0xc2,0xb5,0x10,0xda, 0x38,0xe2,0xa1,0x42,0x63,0x33,0x71,0x80,0x38,0x5a,0x21,0x06,0x28,0x68,0xa3,0x10, 0xd7,0x78,0xc6,0x33,0xd0,0xa0,0x08,0x35,0x98,0xc1,0x0b,0xd2,0xb0,0x44,0x31,0xc8, 0xa0,0x8d,0x0c,0x6d,0xc8,0x0b,0x49,0x28,0x04,0xf1,0xfe,0x50,0x18,0x21,0xf4,0x41, 0x08,0x58,0x78,0x06,0x30,0xb8,0x00,0x97,0x2f,0x30,0x02,0x08,0xbe,0x40,0xc3,0x1f, 0x7c,0x11,0x85,0x25,0x54,0x22,0x16,0xae,0xf8,0xc4,0x0d,0x54,0xa1,0x8a,0x4c,0x64, 0xc2,0x07,0xaa,0xa0,0x42,0x19,0xe2,0x20,0x05,0x5c,0xc8,0x01,0x17,0x23,0xc3,0xc3, 0x1b,0x76,0x51,0x8c,0x40,0x38,0xee,0x0a,0x47,0x10,0xc7,0x84,0x08,0x71,0x0a,0x4c, 0x44,0xcc,0x16,0x80,0xf1,0x06,0x09,0x9e,0x51,0x04,0xda,0xb1,0xa9,0x08,0x9f,0x90, 0x02,0x16,0x6f,0x07,0xa7,0xe6,0x64,0x47,0x4f,0x9c,0x50,0x84,0x77,0xce,0x10,0x08, 0xf1,0x6c,0x02,0x0c,0x41,0x40,0x14,0xcb,0x92,0x60,0x86,0x20,0x4c,0x2f,0x07,0x6e, 0x7c,0xa3,0x1b,0x3f,0x00,0x01,0x27,0x30,0x60,0x08,0xe4,0xf0,0x80,0x1b,0xc8,0x61, 0x85,0x6e,0xd0,0x23,0x13,0x91,0xc0,0xd5,0x35,0x1e,0x93,0x86,0x56,0xf4,0x41,0x7e, 0xad,0x88,0x44,0xc4,0x92,0x63,0x03,0x32,0x21,0xfe,0xe7,0x38,0x11,0x0a,0x60,0xd5, 0x26,0x74,0x0d,0x6d,0x24,0xe1,0x15,0x0c,0x13,0x43,0x10,0x76,0x81,0x9c,0xa2,0x3d, 0xc3,0x0b,0x46,0x30,0x04,0x1e,0xa4,0x01,0x84,0x36,0xc0,0xe6,0x0d,0x6a,0x80,0xc4, 0x1b,0x0c,0x21,0x8d,0x6b,0x40,0xe2,0x15,0x94,0x38,0xcf,0x19,0x6a,0x31,0xbc,0x24, 0xc0,0xa2,0x0e,0xc0,0x80,0x50,0x66,0xa0,0x00,0x86,0x24,0xd4,0xe2,0x0d,0x40,0x50, 0x03,0x10,0x14,0xf1,0x86,0x2f,0xa8,0x41,0x11,0xae,0xe0,0xc4,0x26,0x70,0x41,0x85, 0x30,0xdc,0x20,0x13,0x37,0x40,0x01,0x0a,0x7c,0xd0,0x89,0x1c,0x2e,0x42,0x0a,0x72, 0x28,0xc2,0xbb,0x14,0xb1,0x06,0x59,0x20,0xc0,0x17,0x78,0xa8,0x84,0x17,0x2c,0x31, 0x88,0x70,0x89,0x03,0x1a,0xd0,0x40,0x86,0x2d,0x6c,0x70,0x88,0x53,0x20,0xe1,0x00, 0x7d,0x30,0xc5,0x16,0x8b,0x50,0x84,0xdb,0x65,0xf1,0x76,0x74,0xb2,0x0e,0x76,0xf4, 0xe0,0xc5,0xee,0x00,0x11,0x12,0x90,0xd8,0x84,0x17,0x0c,0xa1,0xc6,0xe5,0x99,0xc1, 0x08,0x49,0x30,0xc2,0x33,0x72,0xb0,0x03,0x66,0xec,0x60,0xa1,0x0c,0x65,0x06,0x33, 0x8e,0x31,0x8f,0x74,0xa8,0xa0,0x04,0xec,0x60,0x47,0x09,0xc6,0x10,0x8c,0x19,0x58, 0xe1,0x19,0x18,0x32,0x82,0x11,0xa4,0xd5,0x8a,0x60,0xd4,0x81,0x15,0x5d,0x18,0x67, 0x1f,0xcc,0x32,0x26,0x5b,0xa4,0xc1,0x06,0x7b,0x11,0x8e,0x42,0xfa,0x90,0x86,0xb5, 0x91,0xe2,0x0f,0xaf,0xc8,0x03,0x29,0x04,0x88,0x86,0x50,0x1c,0x81,0x09,0x75,0xe8, 0x05,0x23,0x2a,0xc1,0x09,0x30,0xb8,0xe4,0xfe,0x0d,0xb3,0xe9,0x01,0x2e,0xd0,0xc0, 0x89,0x2f,0xa2,0xc1,0x10,0x60,0xc8,0xc2,0x1f,0xc4,0x13,0x9e,0x37,0xc4,0x22,0x10, 0xd8,0x92,0x45,0x31,0x0c,0x41,0x30,0x23,0xd4,0xe2,0x0b,0x67,0x28,0x26,0x1f,0x46, 0xd6,0x42,0x5f,0xac,0x21,0x0b,0x89,0x60,0xc3,0x1b,0x70,0x11,0x06,0x2a,0xdc,0xc0, 0x07,0xa9,0x10,0x86,0x30,0x52,0x91,0x8a,0x1b,0x84,0xa1,0x0c,0x54,0x98,0x45,0x11, 0xf8,0x70,0x12,0x3e,0xb4,0x81,0x0b,0x8c,0x88,0x05,0x27,0x00,0x71,0x8d,0x5f,0x88, 0x63,0x4c,0x0e,0x43,0x67,0xfa,0xa0,0x81,0x84,0x5c,0x20,0xc3,0x0b,0x74,0x6a,0x02, 0x64,0xa7,0x83,0xc5,0xc9,0xce,0xa9,0x09,0x22,0xe1,0x97,0x2b,0xf6,0xa4,0x08,0x3c, 0xf8,0x42,0x8c,0x32,0x51,0x5e,0x10,0xa4,0x51,0x50,0x1a,0xf4,0x02,0x0a,0x08,0xdd, 0x01,0x1c,0x6a,0x10,0x83,0x18,0xd4,0x40,0xb5,0xcc,0x98,0xc0,0x16,0x70,0x90,0x8e, 0x74,0xb0,0x80,0x05,0x01,0x40,0x45,0x28,0x90,0x71,0x0e,0x87,0x59,0xc2,0x12,0xd2, 0x20,0x44,0x70,0x10,0x60,0x82,0x23,0xaa,0xee,0x88,0x69,0x38,0x02,0x02,0x80,0x61, 0x09,0x58,0xec,0x22,0x09,0x50,0x28,0x68,0x12,0xb4,0x51,0x8c,0x20,0xc4,0x22,0x08, 0xaf,0x08,0xc2,0x19,0xde,0x80,0x86,0x21,0x79,0xc1,0x5b,0x7d,0xd0,0x86,0x22,0x7a, 0xe0,0x8b,0x2c,0x3c,0x42,0x11,0x51,0x48,0x84,0x1c,0xf8,0xe0,0x9a,0x58,0x2c,0x21, 0x11,0xa6,0x38,0x43,0x2c,0x80,0xb0,0x86,0x5e,0x9c,0xc1,0x3b,0xee,0x8a,0xc2,0xe9, 0xce,0x90,0x04,0x2f,0xe0,0x01,0x08,0xfe,0xd2,0x80,0xef,0x78,0x8f,0xc4,0x43,0x3e, 0xac,0x81,0x4f,0x7b,0x5a,0xc2,0x1a,0x38,0x51,0x39,0x1c,0xde,0x40,0x06,0xa0,0x20, 0x82,0x16,0x84,0x21,0x83,0x32,0xd8,0x50,0x15,0xa5,0xb8,0x44,0x22,0xfc,0xa0,0x87, 0x35,0xc0,0x82,0x0d,0x42,0xe5,0x84,0x17,0x08,0xcb,0x90,0xad,0x9d,0x23,0x39,0xb6, 0x38,0x87,0x57,0x0e,0x40,0x08,0x3d,0xcc,0xa9,0xc5,0x59,0x2c,0x45,0xbd,0xa8,0xe3, 0x31,0x7e,0xa1,0x64,0x64,0x7f,0xf2,0x67,0xa1,0x6a,0x81,0x93,0x24,0xd0,0x40,0x1a, 0x49,0xa0,0x03,0x1d,0x64,0x41,0x03,0xd5,0x56,0xa1,0x0a,0x77,0x88,0xc1,0x1d,0x92, 0xa1,0x8c,0x07,0x4c,0x62,0x01,0x0f,0x48,0x47,0x05,0x02,0x00,0x01,0x3d,0xb4,0x22, 0x05,0x98,0x18,0xc4,0x2f,0x2c,0x31,0x19,0x31,0x44,0x02,0x0b,0xdc,0x14,0xa9,0x10, 0xd2,0x22,0x04,0x04,0x18,0x61,0x06,0x34,0x00,0xc3,0x26,0x38,0x91,0x05,0x97,0xa8, 0xa1,0xa9,0x80,0x58,0x03,0x25,0xda,0x10,0x0b,0x3f,0x44,0x2e,0x08,0x9b,0xb8,0x46, 0x2b,0x0e,0x41,0x86,0x40,0x7c,0x8e,0x0f,0xb1,0x38,0x09,0x52,0xcb,0xe0,0x07,0x5c, 0x54,0x02,0x17,0x7e,0x28,0x82,0x1f,0x0a,0x7d,0x12,0x40,0x70,0x82,0xc0,0xa6,0xd0, 0x70,0x20,0x18,0x81,0x87,0x5a,0xb8,0xe2,0x35,0x68,0x88,0x02,0x49,0x48,0x23,0x07, 0xea,0x34,0x61,0x4a,0xe7,0x15,0xea,0x12,0xe4,0x50,0x8a,0x59,0xa8,0xe2,0x06,0xc2, 0x00,0x45,0x0b,0xb4,0x30,0x07,0x44,0x10,0xa1,0x0c,0x74,0xcd,0x44,0x1c,0x54,0xc1, 0x9c,0x1e,0xc8,0x21,0x0f,0x6c,0xfe,0xd0,0xc4,0x31,0x63,0x51,0x8c,0x94,0x8a,0xe3, 0x7e,0x26,0xe6,0x4b,0x5f,0xd0,0x14,0x8a,0xdb,0xcd,0xe9,0x4d,0x9f,0x40,0x4d,0x16, 0x21,0x7b,0x09,0x2b,0xe8,0x81,0xce,0x7b,0xca,0x02,0x78,0x20,0xf1,0x05,0xe3,0xf9, 0xf8,0xa0,0xbd,0x20,0xad,0x2c,0xf2,0x40,0x87,0x5e,0x14,0xb9,0x0a,0x2d,0x68,0x41, 0x0c,0x3c,0x00,0x0f,0x7d,0x8c,0x62,0x14,0x30,0x50,0xc1,0x16,0x86,0x90,0x03,0x61, 0x9c,0x01,0x19,0x48,0xb0,0xda,0x64,0xf0,0x6c,0x09,0x32,0x23,0x00,0x47,0x33,0x00, 0x50,0x62,0x80,0x81,0x40,0x59,0x64,0xb7,0x12,0x2c,0x74,0x9c,0x22,0xda,0x70,0x86, 0x35,0x00,0xea,0xd1,0xfc,0xaa,0xc4,0x26,0x7a,0x41,0x0a,0x6b,0x79,0xc1,0x0f,0x8b, 0x00,0xc9,0x1a,0x70,0xf1,0x89,0xcd,0x4d,0xe3,0x39,0x4d,0x58,0x84,0x26,0xc2,0xc0, 0x07,0x2b,0x84,0x41,0x13,0x7c,0x50,0xc4,0x12,0x7a,0x60,0x8a,0x1e,0x7c,0x02,0x74, 0xb8,0xf0,0xc2,0x12,0x3e,0x11,0x87,0x4f,0x44,0xc1,0x23,0x58,0xfc,0xc4,0x27,0x16, 0xd1,0x04,0xea,0x70,0xc2,0x14,0x86,0xe6,0x44,0xcc,0xe5,0xb0,0x88,0x54,0xa0,0x80, 0x08,0x05,0x60,0x06,0x22,0xb6,0x31,0x87,0x39,0xb4,0xb5,0x13,0xcd,0x2c,0xc3,0x2c, 0x16,0x21,0x07,0x29,0xa0,0x81,0x0d,0x45,0xd0,0x03,0x27,0x2a,0x61,0x88,0x34,0x34, 0x48,0x89,0x29,0x50,0x24,0xb0,0x05,0xe1,0x82,0x5f,0xb0,0x98,0xd3,0x30,0xbf,0xe2, 0x2c,0xa4,0x00,0xa7,0xeb,0x98,0xc4,0x14,0xf0,0x72,0xc9,0x19,0x36,0x41,0x89,0x5a, 0xa8,0x67,0x6e,0x66,0x20,0xfe,0x6d,0x2f,0x80,0x01,0x0c,0x75,0x55,0x21,0x06,0x2d, 0x00,0x07,0x33,0xc2,0x51,0x81,0x3d,0xf0,0xa0,0x04,0x01,0x90,0xc4,0x31,0xaa,0x80, 0x08,0x2d,0x94,0x81,0x0e,0x7c,0xc1,0x42,0x6f,0xe9,0x30,0xb6,0x6b,0x04,0xc1,0x10, 0x46,0x48,0xc3,0x0c,0xb8,0x50,0x87,0x62,0x58,0x42,0x1b,0x60,0x98,0x3b,0x2a,0xd7, 0x00,0x1b,0x53,0x8c,0x37,0x16,0x78,0x10,0x26,0x24,0x42,0xbe,0x91,0x1e,0x70,0x42, 0x16,0x73,0xd1,0xc6,0x26,0xa2,0x30,0x8b,0x66,0x6e,0x64,0x11,0xa5,0xc8,0x04,0x0a, 0x52,0x71,0x09,0xcd,0xcd,0x22,0x0e,0x73,0xba,0xc1,0x0d,0xa8,0x70,0x89,0x25,0xe0, 0x02,0x4e,0x45,0x08,0x43,0x25,0x34,0x61,0x8a,0x2c,0x48,0x81,0xc2,0x9d,0xc0,0x45, 0x19,0x52,0x31,0x0d,0x26,0xad,0x75,0xd4,0x8b,0x20,0xb0,0x1e,0x7a,0xd0,0x11,0x65, 0xa2,0x00,0x11,0xa0,0xd0,0x82,0x91,0x69,0x01,0x0e,0x5a,0x6c,0x23,0x9a,0x3c,0xcf, 0x44,0x27,0xa8,0x50,0xaf,0x45,0xb0,0x01,0x0f,0x8b,0xc0,0xc5,0x0a,0xd1,0x20,0x84, 0x46,0x06,0x9b,0x09,0x66,0x83,0x5a,0x0a,0x90,0xe0,0x8d,0x47,0x7c,0x9d,0x4e,0x61, 0xaf,0x57,0xc7,0x7a,0xe8,0x87,0x3c,0x4d,0xc9,0xf3,0xda,0xdd,0x44,0x21,0x98,0x01, 0x1d,0x18,0x01,0x90,0x01,0xc3,0x2e,0xd0,0x01,0x30,0xcc,0x80,0xdc,0xf5,0x82,0x6a, 0xc5,0x00,0x05,0x24,0x45,0x3d,0xa4,0x43,0x00,0x0c,0x01,0x05,0x54,0x01,0x36,0x58, 0x9f,0x30,0x68,0xc2,0x38,0x90,0x00,0x09,0xb4,0x42,0x31,0x3c,0x0b,0x2c,0xfc,0x82, 0x17,0xb4,0x01,0x1a,0xfe,0x68,0xc3,0x38,0x70,0x41,0x31,0x08,0x51,0x31,0x88,0x81, 0x17,0x00,0x83,0x19,0x04,0x42,0x30,0xbd,0x4b,0x2c,0x84,0xc7,0xc0,0x05,0x42,0x9a, 0x29,0x49,0x45,0x24,0x42,0x1b,0x60,0x01,0x29,0xbc,0x02,0x1d,0xe0,0xc1,0x25,0x48, 0x58,0x19,0x20,0x9f,0x2a,0x74,0xc2,0x5b,0x45,0x03,0x0e,0x6d,0x4e,0x27,0xc8,0x41, 0x18,0x10,0x41,0x5b,0xf9,0x80,0x15,0x7c,0x42,0x18,0xb8,0xde,0x93,0xe0,0x1a,0x2e, 0xc0,0xde,0x34,0xdc,0xc0,0x25,0x94,0xc1,0xe0,0xc9,0x55,0x34,0x2d,0x53,0x19,0x68, 0x42,0x9e,0x7c,0x82,0x2a,0xa8,0x95,0x16,0x10,0xc1,0xd0,0x69,0x01,0xb8,0x15,0x40, 0x01,0xdc,0x41,0x01,0x44,0x03,0x1c,0x7a,0x5f,0x27,0xd4,0x55,0x19,0xf4,0xc0,0x1b, 0xcc,0x82,0x26,0x2c,0x81,0x1f,0xbc,0x41,0x1d,0x24,0x92,0xd9,0x1c,0x40,0xc4,0xf0, 0x05,0x12,0x20,0x01,0xc5,0x90,0x82,0x15,0xcc,0x09,0xcc,0x85,0x9d,0xd8,0x55,0xc7, 0x65,0xe5,0x09,0x0b,0x81,0x51,0x78,0xb4,0xc1,0xda,0x05,0xc1,0xb6,0xed,0x82,0xdc, 0xed,0x02,0x26,0xce,0x00,0x26,0xf6,0xc2,0x42,0xad,0x00,0x03,0xa8,0x00,0x3d,0x70, 0x80,0x12,0xc4,0xc0,0x36,0x60,0x83,0xd0,0x69,0x81,0x16,0xdc,0xc0,0x12,0x08,0x01, 0x00,0xa5,0xc1,0xd0,0x8c,0x4d,0x1e,0xb4,0xc1,0x23,0x88,0xc1,0x0c,0xc8,0x02,0x16, 0x60,0x01,0x1d,0x5c,0x81,0x36,0xc4,0xc5,0x38,0x3c,0x03,0x30,0x65,0xc1,0xc8,0x78, 0x1e,0x24,0x3c,0x0e,0x25,0xc4,0x82,0xee,0x58,0xc7,0x12,0x78,0x41,0x1e,0x60,0x81, 0xba,0x18,0x42,0xfe,0x22,0xf8,0x80,0x30,0xc0,0x9a,0xbd,0x4c,0x83,0x30,0x70,0x43, 0x01,0x4c,0x83,0x11,0x66,0x42,0x34,0x48,0x01,0x15,0x40,0x18,0xcf,0x09,0x03,0x37, 0xb6,0x15,0x15,0xc8,0x41,0x19,0xe8,0xc1,0x22,0xa8,0x02,0x11,0x80,0x82,0x30,0x10, 0x41,0x26,0x4c,0x43,0x0c,0x5c,0xa0,0x83,0x45,0x83,0x0f,0x50,0x41,0x2a,0x44,0x89, 0x15,0x50,0x81,0x0f,0xdc,0xc0,0x34,0x10,0x81,0xf5,0x15,0x00,0x11,0x54,0x01,0x1c, 0xdc,0xdd,0x1d,0xd0,0xc2,0x83,0xc9,0x80,0x0c,0x3c,0xd3,0x0d,0x74,0x42,0x0d,0x5d, 0x42,0x2c,0xe0,0xc2,0x22,0xf4,0x4b,0x2c,0xec,0x82,0x0e,0xb0,0x0f,0x09,0x20,0x83, 0x43,0x90,0x80,0x57,0x9c,0x03,0x2b,0xc8,0x5f,0x0a,0x30,0xc2,0x64,0x69,0xce,0x74, 0xd0,0x89,0x26,0x64,0x47,0x22,0xd4,0xd8,0x66,0xbd,0x41,0x1b,0x84,0x02,0xa2,0x38, 0x97,0x23,0xe4,0x81,0x2c,0x24,0x20,0xe9,0xcc,0x80,0x26,0xfe,0x41,0x0e,0x6c,0x80, 0x08,0x44,0xc0,0x30,0xc4,0x00,0x38,0xb0,0x61,0x01,0xec,0xe4,0xd0,0x21,0x42,0x26, 0x54,0x42,0x1a,0x1c,0x00,0x42,0x90,0x81,0x11,0x68,0xc3,0x20,0x84,0xc2,0x19,0xc8, 0x42,0x1d,0x70,0x01,0x30,0x08,0x41,0x1d,0xd0,0x81,0x18,0x30,0x86,0x40,0xd0,0x81, 0x78,0xfc,0x12,0x11,0xa9,0x81,0x0a,0x11,0x9c,0x1f,0x50,0x07,0x2e,0x24,0x42,0x28, 0x98,0xc1,0xd0,0x80,0x81,0x17,0x44,0x41,0x29,0xc8,0x40,0x2a,0x96,0x42,0x27,0xc8, 0x00,0x22,0x70,0x43,0x0e,0x14,0x80,0x84,0x11,0x01,0x0a,0xc8,0x00,0x15,0x20,0x02, 0x2d,0x20,0xfe,0x42,0x2a,0x20,0x02,0x36,0x50,0x58,0x34,0xc8,0x5e,0x93,0x2c,0x53, 0x1c,0x3c,0x18,0x36,0x14,0x80,0xf2,0x7d,0xc0,0x0e,0x14,0x80,0x16,0x38,0x18,0x28, 0xa0,0x40,0x34,0xcc,0x02,0x1f,0xc8,0x01,0x11,0x10,0x81,0x84,0x45,0x43,0x01,0xcc, 0x41,0x15,0x58,0xe3,0x0e,0xb0,0x43,0x0b,0x14,0x40,0x15,0x94,0xa2,0x0c,0x60,0x03, 0xcf,0xc9,0x00,0x36,0x76,0x42,0x11,0xb8,0xc2,0x12,0x3c,0x1c,0x2e,0xb8,0x82,0x34, 0xa8,0x85,0xc3,0xdc,0xcf,0x29,0x74,0xc1,0x56,0x90,0x00,0x3a,0x58,0xc0,0x20,0x02, 0x03,0x16,0xc1,0x58,0xb2,0x59,0x96,0xa1,0xe9,0x95,0xd9,0xcd,0x86,0x95,0xa8,0x9d, 0xe3,0xd1,0x81,0x25,0xc6,0x64,0x4c,0x92,0x8b,0x25,0xc6,0x11,0x91,0xdd,0x01,0x38, 0xec,0xe4,0x66,0x6e,0xc3,0x36,0x80,0x42,0x1c,0x64,0x41,0x59,0x48,0x4b,0x31,0x24, 0xc1,0x5c,0xa8,0x87,0x70,0x99,0x80,0x09,0xa4,0x41,0x31,0xf4,0xc2,0x54,0x22,0x40, 0x1a,0x88,0x8d,0xb4,0x05,0x82,0x1a,0x94,0x27,0x10,0x30,0xc2,0x12,0xa8,0xd0,0x25, 0xe0,0x61,0x25,0x9c,0x41,0x21,0xbc,0xc2,0x2b,0x40,0x81,0x1a,0xa8,0xde,0x34,0x44, 0x18,0x0a,0x64,0x82,0x41,0xfe,0x5c,0x0e,0xcc,0x01,0x28,0xb0,0x9a,0x5c,0x6a,0x41, 0x0d,0xb4,0x00,0x37,0x58,0x66,0x0d,0x40,0x13,0x11,0xc8,0x5e,0x0d,0xa5,0x82,0x0f, 0x4c,0xc3,0xaa,0x81,0x43,0x0c,0xb0,0x1a,0x05,0x7c,0x40,0x0d,0x20,0x82,0x0c,0x6c, 0x03,0x5c,0xd6,0xa1,0xab,0xcd,0x81,0x1b,0x60,0x03,0x84,0x61,0x03,0x36,0xa8,0x16, 0xde,0xfe,0xb1,0x43,0xdd,0x31,0xc3,0x40,0x82,0xc2,0x1b,0x46,0x83,0x1b,0xcc,0x55, 0x26,0xd0,0x09,0x1b,0x94,0xc2,0x38,0xf6,0xc0,0x19,0x84,0x08,0x34,0x10,0x02,0x21, 0x60,0xc2,0x29,0xac,0x13,0x34,0x3c,0x8d,0x05,0xa4,0x80,0x37,0x0c,0x82,0x2b,0x2c, 0xc2,0x39,0xc2,0x58,0x65,0xf5,0x90,0xbc,0x2c,0x41,0xff,0xdd,0x98,0x05,0x99,0x01, 0x14,0xe4,0x41,0x4c,0x0e,0x4e,0x2d,0x5e,0x45,0x31,0x5c,0xc1,0x2e,0x30,0x43,0x0e, 0x30,0xd4,0x6a,0x19,0xd9,0xdd,0xd1,0x02,0x1b,0xd2,0x42,0x34,0x94,0x42,0x2d,0xc0, 0xca,0x42,0x40,0xc1,0x2b,0x0c,0x42,0x31,0xd4,0xc2,0x2b,0xe8,0x86,0x6e,0x1c,0x44, 0x5c,0x14,0x43,0xa9,0xa4,0x81,0x25,0xa0,0xd9,0x4c,0x28,0x82,0x2f,0xb0,0x81,0x4a, 0x2c,0xc1,0x3c,0x7d,0x82,0x1c,0x9c,0x81,0x4d,0xbc,0x02,0x1a,0xcc,0xa7,0x1c,0x4c, 0x03,0x1b,0xca,0x40,0x2a,0x68,0x01,0x28,0xb8,0xc1,0x1d,0xe4,0x40,0x15,0xf4,0x64, 0x65,0x6a,0x41,0x34,0x28,0x54,0x0c,0x1c,0x26,0x33,0xd4,0x00,0x5c,0x6e,0x03,0xac, 0xa9,0x02,0x38,0x88,0xa6,0x0c,0x80,0xc3,0x1d,0xc0,0x01,0x1c,0xdc,0xc1,0x1c,0x60, 0xc0,0x00,0xe4,0xc0,0x36,0x68,0x01,0x38,0x7c,0x80,0x16,0x60,0x9c,0x1b,0xd4,0x80, 0x30,0xb8,0x41,0x15,0xd0,0x82,0x86,0x16,0x40,0x0d,0xc0,0x41,0x15,0xd4,0x40,0x43, 0x19,0xe6,0xf6,0x99,0xa2,0x5c,0x22,0xc2,0x0d,0xa4,0x42,0x26,0x94,0x42,0x1c,0xb0, 0x58,0x27,0x88,0x04,0x27,0xd4,0x81,0x2d,0x44,0x04,0x60,0xd0,0x28,0x34,0x78,0x43, 0xfe,0x57,0xf0,0x68,0x0a,0x40,0x43,0x28,0x9c,0x23,0x6b,0xc4,0x18,0x9c,0xec,0xa6, 0xc8,0x9c,0x64,0x20,0x7c,0x81,0x40,0x05,0x41,0x2f,0x14,0x27,0x17,0x5c,0x45,0x99, 0x5d,0xc1,0x15,0x8c,0xc3,0x0c,0xb8,0x11,0x33,0xa4,0x56,0x0d,0x14,0xd9,0x1d,0x6c, 0x66,0x4f,0xd2,0xc2,0x0d,0xf4,0x40,0x1e,0x10,0x42,0x24,0x1c,0xc1,0x38,0xd0,0x01, 0xc3,0xbc,0x82,0x19,0x9c,0x29,0x02,0xe4,0xc8,0x40,0x04,0x01,0x14,0x20,0x40,0x2b, 0xc4,0xca,0x0c,0x74,0xd2,0x17,0xe0,0x01,0x1b,0xa8,0x81,0x2b,0x54,0x82,0x1e,0x60, 0x91,0x2a,0xb8,0xc2,0x7e,0x99,0xc1,0x19,0x28,0x82,0x29,0xc8,0x41,0x1c,0x68,0x01, 0x36,0xac,0x1a,0x0a,0xd0,0x82,0x30,0x74,0x03,0x3b,0x7c,0x40,0x15,0xec,0xc0,0x07, 0xcc,0x01,0x97,0xc6,0x00,0x06,0xb0,0xc3,0x00,0x7c,0x40,0x0e,0x24,0x43,0x3c,0x0c, 0x80,0x30,0x20,0x42,0x1c,0x94,0xc1,0x1c,0x3c,0x68,0x2a,0xcc,0x41,0x0d,0xe4,0xc0, 0xf3,0xec,0x00,0x38,0xe4,0x00,0x08,0x28,0x14,0x38,0xec,0x40,0x3c,0x94,0x43,0x13, 0xc8,0x40,0x0c,0x34,0x42,0x37,0xd0,0x02,0xb8,0xd1,0x42,0x39,0xdc,0x81,0x95,0x3e, 0xaa,0x1b,0xc5,0x00,0x1b,0x6e,0x03,0x37,0x48,0x18,0xab,0x29,0x68,0x18,0x4c,0x43, 0x29,0x68,0xc2,0x34,0x4c,0x9c,0x29,0x8c,0x43,0x3a,0xd9,0x00,0x13,0x38,0x4c,0xc3, 0x9c,0xc2,0x56,0x6c,0x85,0x27,0x98,0x93,0x2b,0xac,0x86,0xeb,0x4d,0x07,0x48,0xec, 0x26,0xbc,0xc4,0xc2,0x8d,0x85,0x02,0x8f,0xfd,0x41,0x10,0xfc,0x01,0xb9,0x9c,0xfe, 0x60,0x94,0x86,0xab,0x09,0x20,0xc0,0x38,0x5c,0x01,0x95,0xe6,0x00,0xa7,0xc2,0xc1, 0x6a,0xe9,0xe4,0x4e,0x16,0x00,0x22,0x84,0x01,0x27,0x60,0xc8,0x48,0xc9,0x42,0x24, 0xc0,0x1b,0x18,0x40,0xc1,0x2e,0x6c,0xa7,0x0e,0x04,0x03,0x02,0x88,0x01,0x29,0x60, 0x01,0x23,0x09,0x04,0x30,0xbc,0x81,0x77,0x2c,0x81,0xc1,0x4a,0x5f,0x13,0x84,0x81, 0x15,0xac,0x91,0x11,0x28,0x42,0x25,0x78,0x0e,0x15,0xcc,0x25,0xf7,0x21,0x02,0x22, 0x80,0x6c,0x0e,0x98,0xec,0x18,0x34,0xc2,0x00,0x14,0x59,0x39,0x0c,0x40,0x32,0xc4, 0x4c,0x32,0x40,0x0a,0x08,0x50,0x40,0x8a,0x42,0x53,0xdd,0xe9,0xaa,0xc8,0xb6,0xee, 0xed,0x56,0x8f,0x12,0xc8,0xae,0xc8,0x0e,0xc0,0x1c,0x94,0x41,0x0d,0x7c,0xc0,0x0f, 0xc4,0x43,0x0d,0x38,0x68,0x0c,0xb0,0xc3,0x1d,0x50,0x8f,0xdd,0xf9,0xad,0x88,0x82, 0x83,0x91,0x21,0xa6,0x1b,0xf4,0x5c,0xd1,0xdd,0xe7,0x32,0xa9,0xc2,0x47,0x4c,0x45, 0xc4,0x74,0x2d,0xb2,0xb4,0x0e,0x3b,0x71,0xa4,0x37,0x60,0x02,0x30,0x90,0x5a,0xbd, 0x84,0xe4,0x48,0x96,0xa4,0x4a,0xb8,0xc4,0xb5,0x52,0x42,0x12,0xf4,0xc2,0x1f,0x8c, 0xce,0x0c,0xe4,0x6d,0xb8,0x8e,0x03,0x02,0x08,0x17,0xde,0x72,0x41,0x43,0xa5,0x96, 0xdf,0xda,0xdd,0x66,0xee,0xe4,0x36,0xc8,0xc0,0x2c,0x00,0x02,0x5a,0xe8,0xc0,0x1f, 0xe4,0xc1,0x21,0x1c,0x42,0x2b,0xc0,0xa7,0x36,0xfc,0x07,0xaf,0xc8,0x0a,0xe5,0x36, 0x04,0xd7,0x0a,0x41,0x30,0x48,0x83,0x56,0xe2,0x57,0x14,0xc8,0x41,0x13,0xfe,0xe0, 0x42,0x1c,0x14,0x01,0x09,0xfe,0x01,0x1b,0x64,0x18,0x19,0xfa,0x00,0x0a,0x68,0x81, 0x73,0x72,0x03,0xd3,0x3e,0x14,0x06,0x40,0xca,0xf2,0x56,0x01,0xf4,0x0c,0xc5,0x00, 0x1c,0xc5,0x50,0x3c,0x01,0x2d,0x30,0x68,0x01,0xec,0x40,0x0c,0xb8,0x81,0x16,0xe4, 0x80,0xed,0x2a,0xc1,0x0f,0x3c,0xca,0xed,0x46,0x28,0x05,0xc4,0x03,0x8a,0x3a,0x8a, 0x12,0x3c,0x01,0xa2,0x72,0x6c,0x0e,0x88,0xac,0x61,0xde,0x41,0x0d,0xdc,0x81,0x91, 0x71,0x6a,0x0c,0x70,0x83,0x1b,0x5c,0x2f,0x63,0x2a,0x5f,0x5c,0xf1,0xaa,0x2a,0x5c, 0xc2,0x22,0xa8,0x41,0x61,0xd9,0xca,0x02,0x37,0x0c,0x34,0x9c,0x49,0x9a,0xf0,0x28, 0x12,0x1c,0xc2,0x8f,0xa6,0x6f,0x9d,0xf0,0x4b,0x14,0xb4,0x10,0x10,0xd8,0xa0,0xf1, 0xf4,0x02,0x1d,0xc8,0xe4,0x15,0xdc,0x2d,0xfe,0xe6,0x2f,0xde,0xe6,0x6f,0x31,0xbc, 0x42,0x6b,0x01,0xae,0xb7,0x15,0x80,0x96,0xd2,0x82,0x15,0x87,0xdf,0x26,0x90,0xc9, 0x11,0x14,0x02,0x29,0x9c,0xd4,0x20,0x78,0xe7,0x54,0x1e,0xc1,0x71,0xa5,0x45,0x4b, 0x25,0x47,0x59,0xe8,0xc0,0x10,0xc5,0xc2,0x1a,0x48,0x49,0x0f,0x60,0x11,0x90,0x02, 0xc2,0x26,0xa0,0x01,0x1a,0x8c,0x04,0x37,0x86,0x41,0x26,0xa8,0x61,0x01,0x04,0xa4, 0xac,0xc6,0x40,0x0e,0x0c,0x00,0x05,0x28,0x41,0x23,0xc4,0x40,0x37,0x50,0xc0,0x51, 0x78,0xc0,0x4f,0x00,0xf1,0x0f,0x00,0x45,0xa1,0xc2,0xea,0x0e,0xc0,0x6e,0x3c,0x80, 0x80,0x12,0x80,0x40,0x07,0x00,0x31,0x05,0xb8,0x47,0x10,0x47,0xe8,0xfe,0x1c,0x7c, 0xc0,0x13,0x50,0x40,0x51,0x50,0x80,0xcd,0x98,0xec,0x0e,0xd0,0x2c,0x06,0xc4,0x00, 0x33,0xc4,0x40,0xdd,0xc5,0x6a,0x15,0xa0,0xa2,0x5c,0xa6,0x02,0x11,0xc8,0x40,0xcf, 0xc9,0x80,0x30,0x44,0x43,0x0c,0xc5,0x01,0x23,0xb4,0xc2,0x71,0xa0,0xcd,0x29,0x90, 0xc8,0x21,0x14,0x8b,0x1d,0x30,0x2b,0x12,0xa4,0x00,0x18,0xa0,0xc6,0x9c,0x60,0x44, 0x94,0xe8,0x89,0x9c,0x9e,0xc1,0x78,0x20,0x0a,0x0d,0x38,0xc2,0x0c,0x5c,0x01,0x17, 0xe8,0x6f,0x94,0x6a,0x67,0x31,0x14,0x03,0x02,0xf4,0xf1,0xdf,0x06,0x32,0xf7,0x39, 0xed,0x80,0x6a,0xc1,0x14,0xe6,0x01,0xd5,0x54,0xe7,0x20,0x60,0x42,0xda,0x44,0x42, 0x5b,0xd4,0x01,0x43,0x24,0xcc,0x71,0x98,0x8d,0xd9,0xd8,0x80,0x0e,0x18,0x01,0x10, 0xe0,0x01,0xbf,0xf4,0x40,0x11,0x50,0x01,0x1f,0x4c,0x03,0xc3,0xa2,0x8c,0x32,0xe1, 0x82,0x0f,0x58,0x8e,0x0c,0xdc,0xdd,0x29,0xff,0x2d,0x1c,0xec,0x40,0x23,0x80,0xc0, 0x06,0xcc,0xee,0x30,0x6f,0x80,0x07,0xac,0x00,0x2d,0xff,0x80,0x2e,0x28,0x81,0x2e, 0x3c,0x01,0x22,0x14,0x80,0x1b,0xfd,0xf1,0x07,0x0c,0xf3,0x09,0xfc,0x80,0x4f,0x6c, 0x80,0x2f,0x77,0xc0,0x06,0x3c,0x01,0xa8,0x76,0xc3,0x51,0x3c,0x81,0x02,0xdc,0xf2, 0x0c,0x0f,0xc0,0x18,0x34,0xd4,0xf4,0x80,0x9b,0xff,0xaa,0x16,0x22,0xa0,0xc0,0xae, 0x72,0xb5,0x64,0xae,0xec,0x36,0x73,0x73,0x18,0xc4,0x41,0x22,0x58,0x02,0x72,0xc8, 0x0f,0x34,0x90,0x08,0x34,0xd8,0x40,0xb1,0x10,0xa2,0x37,0x0c,0xfe,0xe2,0x20,0x54, 0x02,0x75,0xa4,0x2d,0x8d,0xc1,0x31,0x4c,0x84,0xc2,0x2e,0x49,0x43,0x1e,0xd8,0xf1, 0x40,0xdf,0xad,0x76,0xde,0x2d,0x1f,0x3b,0xc2,0x1d,0x28,0xa7,0x72,0x16,0x40,0x29, 0x56,0x2c,0x0f,0xa7,0xc2,0x22,0x58,0x01,0x19,0xd8,0x42,0x1f,0xe0,0x94,0xfc,0xa5, 0x4d,0x1f,0x60,0xc1,0x11,0x68,0x34,0x88,0xd4,0x0a,0x5f,0xb0,0x0a,0xfb,0x1c,0x81, 0x17,0x40,0x02,0x1b,0x20,0x55,0x13,0x64,0x82,0x15,0x94,0x41,0x11,0x98,0x92,0xa4, 0x51,0x4e,0x29,0x44,0x13,0x0a,0x60,0x03,0x35,0xef,0x40,0x55,0x3f,0x6a,0x0d,0x24, 0xc3,0x13,0x28,0x41,0x07,0x50,0xc0,0x06,0xfc,0x80,0x02,0xe8,0xc2,0x31,0x64,0xc0, 0x0a,0x9c,0x80,0x07,0x10,0x80,0x07,0xe8,0x82,0x0e,0x7f,0x40,0x32,0xa0,0x56,0x95, 0x0e,0xc0,0x2d,0xf3,0xc4,0x0a,0x28,0x80,0x02,0xf8,0x36,0x4f,0x34,0x02,0x06,0x3c, 0x81,0x3b,0x00,0xc5,0x4d,0x03,0xf1,0xa4,0x60,0x80,0xcd,0xc6,0x2a,0x33,0x50,0xaf, 0x6a,0x9d,0x2b,0x37,0x44,0xc3,0x5a,0x85,0x41,0x2a,0x18,0x24,0x5a,0xa6,0x6e,0x34, 0x48,0x58,0x4a,0xcf,0x02,0x0d,0xb8,0x9f,0xd2,0x20,0x8b,0xd6,0xd0,0xe8,0x5b,0x5b, 0x59,0x0a,0xc4,0x9f,0x23,0x28,0x09,0x9b,0xec,0xe6,0x9e,0xcc,0x20,0x24,0x78,0x41, 0x10,0x98,0xc1,0xb5,0xc9,0xad,0x40,0xff,0x75,0xfe,0x8e,0xc3,0x38,0x14,0xc3,0xdd, 0x72,0xc1,0x2b,0xf0,0x24,0x1b,0x5a,0x71,0xc5,0x0e,0x5e,0x34,0x96,0x02,0x1b,0x0c, 0x86,0x10,0x70,0xc1,0x20,0x94,0xef,0x02,0x17,0x07,0x00,0xfe,0x51,0x8d,0x5a,0xd8, 0xc0,0x58,0xd8,0x41,0x72,0xd4,0x41,0x30,0xe1,0xc2,0x63,0x56,0x4e,0x13,0x4c,0x03, 0xe7,0x2d,0x01,0xfd,0xc5,0x5a,0x83,0xa1,0xc0,0x1c,0xe4,0xf0,0xea,0xe6,0xc0,0xcd, 0x2e,0x14,0x06,0x80,0xc0,0x4e,0xd3,0xf2,0x06,0x64,0x40,0x04,0x64,0x80,0x8e,0xeb, 0xc2,0x0a,0x64,0xc0,0x09,0x80,0x40,0x32,0x30,0xc3,0x7b,0x54,0x81,0x1b,0x0d,0x00, 0x08,0x78,0xc0,0x06,0xe8,0x82,0x07,0xd0,0x72,0x06,0xf0,0xb8,0x2e,0xdc,0xb6,0x91, 0x07,0xb3,0x02,0x34,0x03,0x4e,0x2b,0xc1,0x2d,0x60,0x40,0x13,0x97,0x43,0x15,0x50, 0x6f,0x4f,0x6e,0xdf,0x36,0xe0,0xa5,0x0e,0xcd,0x02,0x15,0x68,0x23,0x0a,0x40,0x2d, 0x87,0xc2,0x55,0x5b,0x49,0x41,0x1b,0x9c,0x89,0xfc,0x38,0x4c,0xb5,0x20,0x4b,0x7c, 0x6f,0xc5,0x7c,0x9f,0x43,0x28,0xf8,0x81,0x6b,0x94,0x44,0xe4,0xb0,0xad,0x78,0x04, 0x14,0x8f,0x95,0x96,0xe1,0x90,0x8b,0x09,0x14,0x03,0xfe,0x16,0x38,0x81,0x17,0x03, 0x82,0x3b,0x2d,0xa2,0xa3,0x2e,0xea,0x9e,0x61,0x2a,0x84,0xc1,0x27,0x3c,0xc2,0x5e, 0x98,0x80,0x25,0xc4,0x9f,0xc3,0x78,0x43,0x1f,0x20,0x03,0x32,0xd8,0x0a,0xfc,0x30, 0x81,0x1d,0x88,0xc3,0x57,0xb0,0x0a,0x55,0x9c,0x81,0xe7,0x68,0xc2,0x2c,0x94,0x41, 0x6a,0xfb,0x41,0x16,0x60,0x5a,0x2c,0x90,0xb2,0x09,0x4b,0xd8,0x36,0xa8,0x72,0x32, 0x34,0x31,0x38,0x54,0x60,0x0e,0x28,0xc1,0x09,0xe0,0x74,0x06,0xd8,0xf4,0x04,0x48, 0xc0,0x6e,0x43,0xc0,0x0a,0x4c,0xc0,0x04,0x64,0x80,0xfe,0x35,0x04,0xef,0x0f,0x68, 0xcf,0x0e,0x20,0xb7,0x12,0xf0,0xb6,0x8e,0xaf,0x80,0x2e,0x10,0xc0,0x0a,0x30,0xbb, 0x92,0x37,0x82,0x4e,0xdf,0xf6,0x0a,0x34,0xc3,0x06,0x24,0x71,0x6b,0x95,0x43,0x39, 0x08,0xf0,0xe9,0x26,0xe6,0x34,0x94,0x81,0x14,0x5c,0xc2,0xe6,0xb8,0x1a,0xcf,0xa5, 0x02,0x28,0x5c,0xe0,0x19,0x0a,0x6a,0x1c,0x00,0x82,0x38,0xd8,0xc1,0xc3,0xdc,0x28, 0x89,0x74,0x41,0x2b,0xc8,0xb9,0x62,0xa5,0x80,0x05,0xe4,0x42,0x1d,0x40,0x82,0x2b, 0xe8,0x41,0x9e,0xec,0x09,0x10,0xa5,0xdd,0xda,0xf9,0x77,0x1e,0x38,0xc2,0x15,0xd4, 0xaf,0x81,0xeb,0x31,0x1f,0x13,0x38,0x17,0xc0,0x82,0xa2,0xf3,0x30,0x36,0x47,0xa6, 0x30,0xd8,0x50,0x0f,0x6c,0x42,0x17,0x84,0xa7,0x10,0x24,0xc8,0xfd,0x9c,0x14,0x12, 0x40,0xc3,0x12,0x61,0x02,0x5f,0x24,0xc7,0x58,0x90,0x85,0x38,0xe4,0x81,0x2f,0x54, 0x44,0x13,0x94,0xee,0x34,0x2c,0x42,0x2c,0x98,0x82,0x15,0xac,0xc9,0x5c,0x31,0x26, 0x28,0x80,0xc2,0xce,0xb6,0x70,0xab,0x56,0x01,0x3b,0xec,0xc0,0x0f,0x6c,0xc0,0xb3, 0x43,0x40,0x33,0x80,0xc0,0x04,0xc8,0x83,0x04,0x4c,0x00,0x04,0x18,0xc3,0xae,0x4b, 0x80,0x4d,0x2b,0x40,0x07,0x34,0x43,0x12,0x5b,0x83,0x02,0xe8,0x7c,0x04,0x1c,0x03, 0x04,0x40,0x7d,0x06,0x1c,0x43,0x8f,0xfb,0xba,0x2e,0x50,0x00,0x95,0xdf,0x34,0xb3, 0x0f,0x45,0x32,0x1c,0xed,0x1c,0x94,0x83,0x85,0xa6,0xee,0x19,0xee,0x6a,0x93,0xb8, 0x5e,0x29,0xa8,0x42,0x0e,0x95,0x41,0x27,0x74,0xfe,0xc2,0x6a,0x13,0xb2,0x1b,0x6c, 0xb3,0x89,0x3f,0x74,0xf8,0xd2,0xe8,0x8d,0x12,0x42,0x3b,0xa7,0x40,0x89,0x8d,0xc5, 0x01,0xd8,0x02,0x25,0x40,0x82,0xe6,0xbd,0xf1,0x66,0xd9,0x73,0xa1,0x1c,0x14,0x0d, 0xac,0x4b,0x94,0x1a,0xfa,0x80,0x73,0xc1,0x38,0xdc,0xed,0x15,0x44,0xe9,0x0c,0xa0, 0xe2,0x83,0xad,0xa3,0x64,0x1a,0x24,0xaf,0xa6,0x86,0x11,0x30,0x41,0x70,0x98,0x8d, 0x20,0x54,0x4d,0x2b,0x54,0xf8,0x5b,0x4f,0x8c,0xa7,0xd7,0x8a,0x0b,0xa0,0x03,0x9a, 0xd8,0x82,0x2f,0xe2,0x42,0x0f,0x84,0x81,0x0c,0x74,0x82,0x0f,0xb8,0x42,0xd9,0xfa, 0x01,0x23,0xdc,0x80,0x16,0x30,0x66,0x34,0xb0,0x9a,0x2a,0x53,0x40,0x13,0x73,0xc3, 0xa1,0xce,0x76,0x33,0xe8,0xf8,0x04,0x6c,0xc0,0x06,0x08,0x80,0x3c,0x00,0xbd,0x31, 0xb0,0x80,0x04,0xc8,0x83,0x00,0x3c,0x01,0xae,0x3f,0x7b,0x6f,0xaf,0x00,0x01,0x40, 0x40,0x03,0x40,0x40,0x06,0x4c,0xc0,0x6e,0x67,0x00,0xf4,0x4b,0x00,0x01,0x84,0x80, 0x02,0x40,0x00,0x04,0x04,0x77,0x07,0x78,0xc0,0xed,0xc2,0xc1,0x15,0x97,0x43,0x0e, 0x0c,0xe4,0xec,0x8b,0xe3,0xd9,0x87,0x41,0x18,0x4c,0x53,0x19,0xd4,0xd5,0xbd,0xc4, 0x81,0xea,0x73,0x9f,0x87,0x4a,0x98,0x1e,0x90,0xc1,0x29,0xcc,0xcf,0xd6,0xd0,0xe8, 0x02,0x43,0x83,0x27,0x78,0x02,0x2b,0xa0,0x03,0x40,0xa0,0x3b,0x30,0xb0,0xd7,0x9b, 0x42,0x8a,0x38,0x29,0xc2,0xf3,0x06,0xd2,0x26,0x4a,0x85,0x92,0xd0,0x81,0x02,0x25, 0x4f,0xb1,0x2b,0x17,0x11,0x8c,0xd3,0x88,0xfe,0xa0,0xd8,0xb8,0x62,0x08,0xb8,0xcc, 0x20,0x42,0x44,0x18,0x0a,0x19,0x27,0x51,0xa0,0x48,0xd5,0x29,0x4c,0x93,0x28,0x96, 0x6c,0x09,0x09,0x66,0xc7,0x13,0xab,0x41,0x87,0x7e,0x21,0x41,0xe2,0x2d,0x85,0xb7, 0x2e,0x03,0x99,0xa0,0x13,0x24,0x68,0xa0,0x38,0x59,0xae,0xa2,0x94,0x11,0xa6,0x85, 0xca,0x27,0x3e,0x61,0x54,0x25,0xb2,0xa2,0xc5,0x8d,0x30,0x19,0x44,0x10,0xb9,0x89, 0x81,0xe1,0x43,0x8d,0x1c,0xb4,0x3e,0x64,0xcb,0xe6,0x61,0xc5,0x04,0x5d,0x1b,0x3a, 0x40,0x10,0x20,0x2f,0x02,0x5b,0x79,0xf2,0x04,0x64,0x38,0x91,0x61,0xc5,0x8a,0x0c, 0xc7,0x32,0xe8,0x3a,0xd6,0x56,0x02,0x84,0x08,0x11,0x20,0x40,0x78,0x2b,0x2f,0xb0, 0x2e,0x5d,0x13,0x20,0xac,0x18,0x91,0x0d,0x44,0xb2,0x2a,0x5a,0xa8,0x96,0x63,0x47, 0x4b,0xcb,0x8d,0x32,0x97,0x9a,0xc8,0xb9,0xf4,0x49,0x8a,0xaa,0x4c,0x37,0x64,0xf8, 0x08,0x43,0xa5,0xd4,0xa2,0x30,0x3e,0xb4,0x80,0x2b,0x40,0x6b,0xe4,0x2c,0x23,0xe2, 0xba,0x74,0x39,0xd4,0x85,0x49,0x9f,0x9b,0x84,0xbc,0x79,0x42,0x92,0xc2,0x93,0x9d, 0xa1,0xad,0x7c,0x85,0x0a,0xe4,0x2b,0x8b,0xaf,0x40,0x6d,0xbc,0x18,0x32,0x42,0x63, 0xe2,0x9f,0x57,0x57,0x34,0x5e,0xe1,0x72,0x05,0x01,0x02,0xea,0xc5,0xb8,0x98,0xb8, 0xb2,0x4b,0x46,0xb4,0x94,0xdf,0x53,0xdd,0x98,0x06,0x55,0x0e,0x9b,0x56,0xe2,0xb0, 0xc8,0xb2,0x93,0x02,0x9a,0x37,0x4c,0xb3,0xa1,0x79,0x4a,0xc1,0x8a,0x95,0x05,0x41, 0x36,0x5c,0xe4,0x1a,0x78,0x40,0x5c,0xfe,0x10,0x4e,0x8b,0x52,0x11,0x26,0x95,0x26, 0xd4,0x58,0x24,0x93,0x4c,0xf8,0x90,0x61,0x1b,0x22,0x50,0xd0,0xa2,0x41,0x5a,0xba, 0xc9,0x61,0x87,0x46,0xd8,0x01,0xe7,0x04,0x05,0x4e,0x18,0x61,0x05,0x08,0x36,0xd0, 0x25,0x03,0xb8,0x22,0x30,0x86,0x00,0xbf,0xe4,0x99,0xa0,0x19,0x08,0x26,0xc8,0x8b, 0x00,0x63,0x20,0x38,0x46,0x82,0xb5,0xda,0x1a,0x82,0xad,0xb6,0x4a,0xcc,0x60,0x02, 0xbb,0x8e,0xa9,0xcb,0x83,0x6c,0x1a,0x19,0xa3,0x00,0x44,0xb6,0x29,0x20,0x86,0x72, 0x52,0x29,0x45,0x0e,0x5c,0xf8,0xb0,0xe2,0x48,0x4d,0xa8,0x08,0xd0,0x2a,0xef,0x7c, 0xa0,0x22,0x8c,0x32,0x4c,0x02,0x27,0x86,0x1a,0xb6,0xd1,0x22,0x8c,0x36,0xc4,0x41, 0xa6,0x0b,0x4c,0x0e,0x20,0x41,0x1c,0x42,0x4e,0x39,0x24,0x3e,0x42,0x90,0xf0,0x84, 0x84,0x81,0x30,0xb9,0xa6,0x8d,0x36,0xde,0x38,0xe3,0x0c,0x87,0x0c,0x09,0xc2,0x08, 0x28,0x66,0x70,0x0e,0x96,0xea,0xa0,0x9b,0x6e,0x9c,0x8c,0xa2,0xbb,0x68,0x86,0x94, 0x52,0x29,0x34,0xbc,0x69,0xa6,0xe9,0x64,0x91,0x38,0x12,0x39,0xc3,0x06,0x1d,0xea, 0x08,0xc6,0x05,0x4f,0xa0,0x41,0xe2,0xbd,0x14,0x74,0xfa,0x32,0x05,0x17,0x04,0x41, 0xc7,0x82,0x5c,0x84,0x3a,0xe0,0x88,0x33,0xfc,0x68,0x22,0x95,0x68,0xc2,0x48,0x52, 0x8b,0x69,0x32,0xe9,0xe1,0x0e,0x6e,0x4e,0x72,0x23,0x95,0x3b,0xdc,0xb8,0xe3,0x8e, 0x78,0x06,0xe8,0x66,0x80,0x0e,0x42,0xf0,0x20,0xb0,0x0c,0x3c,0xc8,0x40,0x30,0xc2, 0x56,0x20,0x60,0x02,0x79,0x24,0xfe,0xd8,0xc0,0x2f,0xc4,0x08,0x90,0x20,0x82,0x06, 0x22,0x18,0x42,0x02,0xb8,0x46,0x19,0x62,0x88,0xb5,0x04,0x10,0xc0,0x18,0xb6,0x72, 0xac,0x6b,0x85,0x13,0x94,0x48,0x86,0x9d,0x2a,0x0a,0x68,0xa1,0x00,0x37,0x50,0xe8, 0x24,0x93,0x45,0xa4,0xa0,0xc2,0x33,0x14,0xb6,0xb1,0x35,0x07,0x0c,0xe0,0x30,0x77, 0x1b,0x50,0x6e,0x48,0x45,0x86,0x39,0xee,0xa8,0x02,0x8e,0x18,0x10,0x99,0x06,0x90, 0x34,0x98,0xe8,0x02,0x1a,0x12,0x48,0xb0,0x41,0xb6,0x43,0x08,0xe9,0xa9,0x52,0x12, 0x88,0x62,0xe5,0x90,0x57,0x82,0x68,0x83,0x12,0x2f,0xbe,0xa0,0xc4,0x8c,0x5e,0xe8, 0x00,0x66,0x97,0x6b,0x1c,0x81,0xe5,0xa2,0x62,0x48,0xfe,0xf3,0x4f,0x8b,0x2e,0x1a, 0x87,0x0b,0x14,0xf2,0x15,0xcf,0x07,0x1f,0x3a,0xf1,0x61,0xdd,0x45,0x7a,0xa0,0xe1, 0x14,0x1d,0xb0,0x38,0xc0,0x13,0x4c,0x76,0x3a,0xa5,0x8b,0x73,0x04,0x71,0xc1,0x0e, 0x17,0x5c,0x78,0x61,0x68,0x17,0xd2,0xd0,0xef,0x00,0x2c,0x80,0x58,0x62,0x11,0x95, 0xac,0x60,0xc3,0x0d,0x19,0x6e,0xc8,0x24,0x0c,0x70,0xb4,0x10,0x26,0xab,0x54,0x0a, 0xd0,0xe2,0x8e,0x1a,0x40,0x60,0xa6,0x9c,0x1f,0x4e,0xf0,0x40,0x97,0x0d,0x85,0x25, 0x51,0x1e,0x02,0xec,0x0a,0xec,0x84,0x09,0x8c,0x41,0xec,0x18,0x08,0x24,0xa8,0x3b, 0x02,0x01,0x58,0xc0,0x36,0x5b,0x6a,0xdf,0x92,0xe0,0x98,0x63,0x0c,0x5b,0xa1,0x83, 0x1f,0x1a,0xc9,0xa1,0xdf,0x3b,0xb2,0x94,0x61,0x9a,0x32,0xa8,0x38,0x30,0x1a,0x44, 0xae,0xfc,0x80,0x82,0x1f,0xfe,0x9e,0xc0,0x80,0x82,0x64,0x30,0xd8,0xa1,0x06,0x37, 0x10,0x01,0x05,0x1b,0x7f,0x77,0x60,0x86,0xb2,0x25,0xea,0xb0,0xe1,0x10,0x6f,0x20, 0x26,0xe1,0x3d,0x42,0x06,0xd9,0x09,0x53,0x64,0xd6,0x64,0x05,0x89,0x5f,0x92,0x00, 0xe3,0xa1,0x20,0x0c,0xd9,0x18,0x0a,0x8f,0x77,0xd9,0x65,0x06,0x2e,0x32,0xca,0xe8, 0x8a,0x19,0x8a,0x31,0xa1,0x3a,0x40,0xb9,0x98,0xe6,0x06,0x98,0x61,0xce,0x44,0xdd, 0x30,0xe2,0x90,0x82,0x0f,0x6d,0x0e,0x19,0x24,0x12,0x0b,0x3c,0xe1,0xc9,0x9b,0x41, 0xbc,0x09,0xfa,0x00,0x74,0xd0,0x19,0xda,0x82,0xfc,0x48,0xb0,0xcf,0x86,0x60,0x80, 0xe0,0x83,0xca,0x45,0xd0,0x80,0x57,0x79,0x2a,0x40,0xa1,0xa5,0x00,0x61,0xdc,0x28, 0xc0,0x87,0x39,0x54,0x93,0x7c,0xab,0x0e,0x15,0x68,0x5b,0x97,0x08,0x26,0xe0,0x2c, 0x08,0xd0,0xc5,0x2e,0x1e,0x08,0xd6,0xaf,0xee,0x82,0x98,0xbe,0xc1,0xe5,0x2d,0xd9, 0x72,0x20,0x5c,0x0a,0xd3,0x81,0x0d,0x28,0x41,0x09,0x4f,0xf8,0x40,0x15,0xcc,0x85, 0x0d,0x22,0xf8,0xa0,0x0c,0x53,0xba,0x01,0x0a,0xe6,0xe0,0x95,0x0f,0x34,0xe2,0x07, 0x0a,0xe8,0x40,0x07,0xb2,0xa1,0x84,0x0d,0x3c,0x61,0x00,0xc9,0xa8,0x41,0x01,0xb8, 0x21,0xa4,0x1a,0x60,0x00,0x03,0x77,0x28,0xc7,0x25,0x4c,0xc0,0x04,0x33,0x7d,0x4f, 0x75,0x5d,0x38,0x05,0xf7,0xb4,0x87,0x0c,0x36,0x75,0x81,0x10,0x8e,0xa0,0x44,0x10, 0x92,0x00,0x85,0x5e,0x28,0xc7,0x63,0x33,0x70,0xe2,0x0c,0xa0,0x73,0x05,0xec,0x74, 0x04,0x01,0x26,0x30,0xfe,0xc1,0x47,0x34,0x32,0x83,0x97,0x35,0x2f,0x13,0x65,0xe8, 0x62,0x1c,0xca,0xb0,0x88,0x4a,0x90,0x22,0x36,0x47,0xc8,0x85,0x05,0x76,0xe3,0x0d, 0x6f,0x20,0x61,0x7c,0x76,0xf0,0xd4,0x01,0x88,0xe6,0x82,0x50,0x1d,0xe0,0x7c,0x67, 0xd0,0x44,0x19,0xa6,0xe1,0x0a,0x57,0x6c,0x83,0x6a,0x5a,0x28,0x45,0x01,0xe0,0xf0, 0x98,0x02,0xdc,0x01,0x05,0x35,0x68,0xc1,0x0c,0x07,0x50,0x85,0x1f,0x6c,0x60,0x82, 0x1e,0x30,0x8b,0xaf,0x56,0x90,0x23,0xc3,0x9c,0x45,0x01,0x4f,0x20,0x4b,0xaf,0x82, 0x95,0x81,0x0f,0xad,0x65,0x02,0x01,0x94,0xc0,0x04,0x00,0xd8,0xc9,0x08,0x08,0x10, 0x58,0x4a,0x00,0x41,0x23,0x1a,0x31,0x80,0x1d,0x80,0x63,0x1b,0x88,0x40,0x41,0x17, 0xc3,0x30,0x8d,0x68,0x68,0xa1,0x00,0x39,0x48,0x46,0x23,0x40,0xb0,0xc8,0x0e,0x9c, 0xa5,0x03,0xa6,0xa4,0xc0,0x07,0x3e,0x80,0x01,0x66,0x68,0xae,0x06,0x1f,0x18,0xc0, 0x00,0x24,0x14,0x06,0x60,0xe8,0x00,0x1a,0x3f,0x19,0x88,0x37,0xa0,0x81,0x89,0x41, 0xb4,0xa7,0x27,0xb0,0x3b,0x80,0xa5,0x30,0x61,0x89,0x42,0x04,0xa1,0x16,0x49,0xf8, 0x43,0x1e,0xfe,0x70,0xa7,0x19,0xf8,0x0e,0x8a,0x57,0x24,0x19,0x17,0x3e,0x62,0xc5, 0x2a,0x9a,0x60,0x1c,0x33,0xe8,0xc4,0xf3,0xa6,0xe4,0xc5,0xd1,0x84,0xa1,0x08,0x8c, 0xd0,0xc1,0xa3,0xea,0x10,0x3e,0x4c,0x75,0x21,0x05,0x98,0xf0,0xc4,0x3f,0xf3,0xf3, 0xa9,0xa2,0xbd,0xe0,0x00,0x44,0xa9,0x23,0x2e,0x3a,0x58,0x89,0xa5,0x34,0xa8,0x00, 0xa5,0xa8,0xc1,0xfe,0x0e,0xe6,0x07,0x07,0x70,0xc8,0x00,0x0e,0xdb,0xd8,0x01,0x06, 0x6a,0x00,0x87,0x1f,0x9c,0xf2,0x09,0x0a,0xf8,0x01,0xe1,0x94,0x70,0xc2,0x0d,0x80, 0x80,0x82,0xd6,0x78,0x42,0x48,0x0d,0xe8,0x81,0x13,0x3a,0x72,0x5a,0x84,0x39,0xd6, 0xde,0xe4,0xb1,0x0c,0x09,0xb0,0x00,0x31,0x19,0x08,0x81,0x12,0x28,0x87,0xca,0x0b, 0x62,0x03,0x1b,0xc2,0x98,0x86,0x0f,0xa6,0xc1,0xd0,0x2a,0x14,0x93,0x84,0x20,0x40, 0x4b,0x4a,0x25,0xe8,0x4b,0xcc,0x7d,0x40,0x42,0x39,0x30,0x66,0x23,0x32,0x37,0x0d, 0x43,0xb4,0x82,0x10,0x07,0x7b,0x26,0x26,0x88,0xa8,0x46,0x9d,0x40,0x23,0x9a,0x98, 0xe0,0xd9,0x20,0xcc,0x50,0x08,0x23,0x24,0xe1,0x19,0x33,0xe0,0x1d,0x39,0x7f,0xc7, 0x91,0x71,0x50,0xa7,0x8a,0xc7,0x23,0x83,0x47,0xae,0x61,0xb5,0x38,0x84,0x01,0x7a, 0x74,0x8d,0x03,0x69,0x2e,0xb1,0x86,0x23,0x1c,0x20,0x0d,0x91,0x40,0x87,0x7c,0xd8, 0x63,0x29,0xdd,0x78,0xe2,0x8c,0x2e,0xb0,0x00,0x3a,0x5e,0x20,0xc7,0x81,0xd8,0xc0, 0x04,0x78,0x58,0x42,0x13,0xf8,0xe0,0x07,0xac,0x80,0xa2,0x00,0xe0,0x98,0xc6,0x0e, 0x72,0xd0,0xb5,0x1c,0x54,0x81,0x08,0x77,0x00,0xc7,0x07,0x02,0x89,0x81,0x01,0x30, 0x43,0xb4,0x14,0xd8,0x81,0x31,0x3f,0x90,0x8c,0x1c,0xac,0x16,0x03,0x39,0x60,0xc6, 0x00,0x4e,0x8a,0xd3,0x1f,0x28,0x81,0x2c,0x81,0x81,0xdb,0xdc,0xa6,0xb5,0x16,0x67, 0xbd,0x25,0x45,0x19,0xa8,0x06,0xe5,0x9e,0x90,0x4a,0x88,0x72,0xc3,0x41,0x85,0x22, 0xc2,0x36,0xfe,0x30,0x18,0x83,0x1c,0x50,0x80,0x85,0x14,0xc0,0x65,0x2e,0x2b,0xf8, 0x04,0x0a,0x58,0xa3,0x11,0xc9,0x60,0x6a,0x30,0x9f,0xca,0xc2,0x18,0x08,0xe3,0x11, 0x91,0x38,0xc4,0x21,0xd6,0x84,0x0e,0x68,0x7e,0xb7,0xaa,0x29,0x48,0xc1,0x29,0x4e, 0x81,0x09,0x6f,0x1c,0xe2,0x14,0xd0,0x78,0x85,0x17,0x92,0x90,0x87,0xde,0x4d,0x67, 0x17,0x4d,0xe4,0x02,0x17,0x3c,0xc2,0x91,0xb6,0x5a,0x91,0xbf,0x08,0xb8,0x06,0xf4, 0xe2,0x10,0xe0,0x00,0x53,0xe1,0xae,0x9a,0xb8,0xc4,0x23,0xc4,0x41,0x82,0x56,0xf4, 0xc1,0x53,0x5b,0x6d,0xcf,0x3f,0x3d,0x91,0xd8,0x5c,0xc4,0x51,0xb1,0x61,0x02,0x06, 0x10,0xa2,0xe0,0x0a,0x39,0x4c,0x43,0x0b,0x88,0x28,0x40,0x0d,0x68,0x81,0x08,0xcc, 0xce,0xa1,0x05,0x1f,0x28,0x80,0x0c,0xee,0x10,0x03,0x38,0xc8,0x4f,0x6c,0x88,0xa0, 0x05,0x1c,0xe6,0xb0,0x0d,0x37,0xd4,0x20,0x06,0xb4,0x00,0x45,0x2a,0x54,0xa2,0x2f, 0x50,0xb8,0x61,0x1b,0xe0,0x38,0xed,0x0f,0x3a,0xd0,0x8c,0xb4,0x09,0x6b,0x2f,0x75, 0xe3,0x2d,0x00,0x33,0x30,0xa2,0x10,0x10,0xae,0x11,0x97,0x8b,0x01,0xad,0x64,0x80, 0x82,0x59,0x0e,0x32,0x06,0x31,0xc0,0xec,0x30,0x6b,0x50,0x85,0xa1,0x8a,0x30,0x19, 0x14,0xf0,0x32,0x05,0x90,0xb9,0x83,0x8b,0x0e,0x00,0x97,0x84,0xdb,0x81,0x16,0x1e, 0x71,0x84,0xd9,0x30,0xc1,0x0e,0xd7,0x44,0x82,0x0f,0xa9,0xba,0xc6,0xd8,0x74,0x61, 0x10,0x84,0x30,0xd3,0x20,0xa4,0x81,0x44,0x23,0xf8,0xee,0x22,0xc0,0xb8,0xef,0x0c, 0x32,0xfe,0x02,0xbc,0xe3,0x5d,0x81,0x0c,0xfc,0xb5,0x22,0x2c,0xee,0x4a,0x05,0x45, 0xdf,0x55,0x15,0x54,0x58,0x84,0x1c,0xe4,0xd0,0x86,0x2f,0x89,0x21,0x0d,0x44,0x0b, 0x53,0x3f,0xd9,0x98,0x8b,0x5c,0xbc,0xe0,0xb0,0xbe,0x41,0x47,0x2e,0x04,0x91,0x30, 0x1b,0xc8,0x02,0x0f,0x9c,0xd0,0xc4,0x2c,0x84,0x51,0x80,0x02,0x48,0xce,0x0d,0xe0, 0x88,0x47,0x66,0x6b,0xf0,0x42,0x22,0x60,0xb6,0x06,0x58,0x99,0x83,0x16,0x64,0x40, 0x95,0xac,0x69,0xe1,0xd6,0xc2,0xe8,0xa2,0xba,0x4c,0xa2,0x05,0x5a,0x6c,0x83,0x16, 0xe0,0xa8,0xc1,0x00,0x7e,0x40,0x96,0x48,0x16,0x2b,0x03,0x2c,0x72,0x96,0xdf,0x40, 0x79,0x0c,0x02,0x1c,0xc3,0x03,0x15,0x6c,0x21,0x33,0xaa,0x20,0x63,0x19,0x2c,0x05, 0xb9,0x31,0x50,0x8d,0x1b,0x40,0x21,0xa0,0x30,0xc4,0x6c,0x1a,0xa9,0x00,0x85,0x8f, 0xb1,0x3b,0x80,0xcc,0x55,0x19,0x03,0xb8,0x34,0x65,0x23,0x98,0xe1,0x06,0x46,0x1c, 0xc1,0x06,0x36,0xc0,0x44,0x7b,0x0e,0xa1,0xde,0x43,0x50,0x55,0xbd,0xf5,0x3e,0x00, 0x56,0xdb,0x4b,0x08,0x31,0x18,0xc1,0x10,0x34,0xe8,0xc5,0x1f,0x80,0x61,0x9d,0xb5, 0x5e,0xc1,0xd0,0xc7,0xbb,0x22,0x02,0x82,0x61,0x45,0x28,0xba,0x8b,0xc0,0x03,0x56, 0x85,0x2a,0xa4,0xd0,0x03,0x4d,0x80,0x01,0x37,0xa4,0x10,0x07,0xa8,0x39,0x85,0xa9, 0x14,0x4c,0x38,0x8e,0x24,0x4f,0xac,0x1b,0xf9,0x03,0x0c,0x2f,0xf0,0x61,0x16,0x3e, 0x10,0x86,0xbf,0x3e,0xa0,0x04,0x50,0xec,0xe0,0x98,0x4f,0x9e,0x97,0x88,0xe1,0xa0, 0xfe,0x05,0x7d,0x45,0x03,0xc7,0x59,0x51,0xf5,0x1c,0x34,0x28,0x03,0xe7,0xdd,0x00, 0x72,0x5c,0x01,0x6d,0x0c,0x98,0x4a,0x81,0x5c,0x6e,0xa0,0x19,0xba,0x08,0xc1,0x31, 0x42,0x90,0xe4,0x10,0xd1,0xad,0x93,0x10,0x20,0xc0,0x08,0x4e,0x90,0x8d,0x27,0xb8, 0xa3,0xb5,0x77,0xe0,0x29,0x28,0x88,0x40,0x62,0x72,0x81,0x22,0x13,0x4d,0x28,0x02, 0x15,0x3a,0x11,0x54,0x22,0x64,0x2d,0x13,0xaa,0xe8,0x84,0x16,0xaa,0x20,0xe6,0x1d, 0x54,0xa8,0x00,0xaf,0x2d,0x21,0xe1,0x72,0xb0,0x8d,0x25,0x44,0x42,0x1c,0x36,0x40, 0x86,0x1a,0xbd,0xea,0xd5,0x53,0x54,0xd5,0x1b,0xc8,0xa8,0xf7,0xea,0x30,0x71,0x8a, 0x5f,0xbc,0x22,0xbe,0x79,0x90,0xef,0x0c,0x34,0x32,0x9d,0x62,0x04,0x03,0x3a,0x1c, 0x31,0x1e,0xc4,0x4d,0x10,0x71,0x13,0x70,0x41,0x15,0xa5,0x69,0xb4,0xa2,0x17,0xa1, 0x8a,0x26,0xf8,0x41,0x0e,0xb2,0x38,0x9d,0x25,0x48,0x00,0x2a,0x7d,0xfe,0xd3,0x02, 0x12,0x9e,0x70,0x62,0x5f,0xf0,0x02,0xfd,0x08,0x42,0x07,0xb2,0x78,0x03,0x2e,0x4a, 0x31,0x0d,0x44,0x90,0x76,0x00,0x4a,0x40,0x81,0x31,0x31,0x30,0x54,0x0c,0x24,0x63, 0x0e,0x18,0x28,0x80,0x78,0x52,0x91,0x35,0x14,0xb8,0x61,0x07,0x77,0xf0,0x1c,0x28, 0x10,0x61,0x43,0x5a,0x20,0x9d,0x86,0x03,0x00,0x01,0x05,0x5a,0x6b,0x4b,0xa5,0xab, 0x70,0x97,0x2b,0x38,0xdb,0x31,0xe2,0xb6,0x97,0x4e,0xde,0xa8,0xda,0x94,0xc3,0x7e, 0x0e,0x62,0x50,0x00,0x6c,0xb8,0x41,0x0b,0xdb,0x68,0x01,0x2d,0x64,0x50,0x84,0xfe, 0x28,0x14,0xe1,0x13,0x6c,0x78,0x04,0x18,0x42,0xf1,0x08,0x40,0x98,0x62,0x11,0xa2, 0x99,0xc5,0x34,0x5a,0xad,0x0a,0xaa,0xac,0x0a,0x72,0xa0,0x11,0x54,0x68,0x03,0x7e, 0x00,0x03,0xca,0x41,0x0f,0x48,0xa1,0x0f,0x98,0x00,0x19,0x04,0xe2,0x1c,0x76,0x02, 0x1a,0x90,0xa1,0x0f,0xd2,0x0b,0xab,0xbe,0x84,0x88,0xcc,0xa4,0x15,0x8a,0xa1,0x39, 0x68,0x80,0x0e,0xf8,0xec,0x77,0x88,0x07,0x8a,0xf4,0x2b,0xf3,0x82,0x81,0x0c,0xda, 0x8a,0xf3,0x16,0x21,0xf4,0x14,0xcd,0x5d,0xe2,0x40,0x13,0xe4,0x60,0x7a,0xd2,0x4b, 0x1b,0xbe,0x27,0x7c,0xae,0x09,0x13,0x52,0xa0,0xf5,0x62,0x8f,0xe4,0x88,0xe6,0x53, 0x88,0xa2,0x0f,0x1c,0xa1,0x12,0x66,0x21,0x0c,0xb4,0x80,0xe6,0x26,0x67,0x03,0x7c, 0xa0,0x06,0x58,0x68,0x07,0xc6,0xe0,0x94,0xb0,0x21,0x07,0x84,0x21,0x5f,0xb4,0x40, 0x5d,0xa2,0x41,0xb9,0x04,0x10,0x03,0x8c,0xaa,0x6c,0x56,0xa0,0x19,0x54,0x6a,0x70, 0xa0,0xeb,0x07,0x9c,0x8b,0xb9,0x28,0x48,0x09,0xfa,0xe7,0x18,0x84,0x6c,0x2f,0xa8, 0x4e,0x93,0x3c,0x60,0x03,0x1a,0x41,0xba,0x2c,0xe8,0x03,0xc6,0x20,0xfd,0x10,0x61, 0x0e,0xe7,0x20,0x1a,0xf4,0xe0,0x0d,0x80,0x00,0x0f,0x4c,0x01,0x17,0x16,0xe1,0x13, 0xf4,0xc0,0x15,0x1e,0x21,0x0f,0x48,0x41,0x1b,0xd0,0xc0,0x0a,0xf4,0x40,0x15,0x14, 0xa4,0x05,0xaa,0x6c,0x84,0x36,0xc0,0x80,0x14,0x60,0x00,0xc0,0x61,0x16,0xae,0xe1, 0x74,0x20,0x06,0x1d,0x24,0x30,0xf1,0x0e,0xc0,0x02,0xd3,0x8b,0x61,0xb0,0xfe,0xaa, 0xce,0xe8,0xec,0x0a,0x80,0x41,0x22,0x7a,0x41,0x16,0x76,0x67,0x9c,0x9c,0x68,0x78, 0xfa,0xe4,0x4f,0x2e,0xaf,0x78,0xd6,0x6a,0x05,0x5d,0xb1,0xd1,0x54,0x21,0x0e,0xe4, 0x40,0x13,0xd8,0x40,0x1b,0xda,0x43,0x1b,0xd0,0xc1,0x05,0x0a,0x0a,0x1d,0x30,0x6d, 0x7c,0x8a,0xa6,0x07,0x27,0x0c,0x7c,0x42,0x4d,0x07,0x76,0xa1,0x07,0xa8,0x40,0x06, 0x68,0xa1,0xdd,0x30,0x40,0x01,0x14,0x20,0x15,0x3e,0x40,0xba,0x98,0x6a,0x85,0x68, 0xa1,0x0a,0x84,0xc1,0x07,0xd2,0x25,0x13,0xb6,0xc1,0x96,0x94,0x80,0x02,0x36,0x00, 0x6d,0xd2,0x86,0x00,0x46,0xc4,0xfb,0x36,0xe0,0x04,0x26,0x68,0x82,0x3e,0xaa,0x1c, 0xc9,0x82,0x00,0x3c,0x44,0x58,0x6c,0x24,0x31,0x56,0x60,0x0d,0x41,0xa0,0xb9,0x68, 0x28,0x07,0xb0,0x04,0x11,0xb4,0x60,0x24,0xe4,0x00,0x12,0xda,0x00,0x08,0x42,0xe1, 0x0f,0x8a,0x21,0x14,0xd8,0xa0,0x1c,0x4e,0x80,0x19,0x50,0x40,0x0f,0x00,0xe1,0x15, 0xfe,0x80,0x11,0x9a,0x40,0xf7,0x68,0xe1,0x0e,0xe0,0x60,0x0c,0x7e,0xc0,0x43,0x74, 0xc1,0x03,0x9e,0x20,0x06,0xe2,0x20,0x0f,0xcc,0x84,0x04,0xc0,0x47,0x27,0x90,0x00, 0x1a,0xec,0xc0,0x16,0x70,0xe3,0x1c,0x08,0x01,0x37,0x34,0x10,0x13,0x08,0xc1,0x04, 0x64,0xc1,0xe0,0xa0,0x40,0x16,0x64,0xc1,0x63,0x42,0xd1,0x89,0xee,0xcb,0x23,0x2a, 0xcf,0x78,0x64,0x92,0x0b,0xd8,0xa5,0x14,0x70,0x52,0x4a,0x62,0x51,0x13,0x68,0x51, 0x1b,0xfa,0x49,0x1b,0xba,0x00,0x09,0xec,0xe0,0xb0,0xe4,0x63,0x37,0xfe,0x62,0x8f, 0x68,0xce,0x48,0xd3,0x40,0x85,0x15,0x30,0xe1,0x17,0xc0,0xa0,0x07,0x52,0xa1,0x1c, 0x62,0x80,0xcc,0x22,0xf2,0x07,0x10,0x21,0x1e,0x2a,0x29,0x98,0x4e,0xe0,0x07,0xb8, 0x01,0x11,0x88,0x20,0x0e,0x54,0x22,0x06,0x92,0x01,0x04,0x1c,0x69,0x2f,0xf6,0xc6, 0x18,0xd0,0x32,0x44,0x6a,0x6a,0x05,0x42,0x60,0x1c,0x3b,0x80,0x1c,0x1b,0xd1,0x80, 0xa2,0x4e,0x1d,0x09,0xc0,0xa6,0xe6,0x46,0x93,0xe8,0x62,0x85,0x82,0xeb,0x98,0xb8, 0xa2,0x06,0xba,0xf2,0x2a,0x3a,0x01,0x0d,0x1e,0x61,0x13,0x06,0x01,0x13,0x88,0x82, 0x04,0x6c,0x81,0x0d,0xa2,0xa1,0x1a,0x8c,0x8f,0x0a,0xca,0xa3,0x12,0xa4,0xe0,0x06, 0xb0,0x01,0x90,0x2c,0xc7,0x43,0x52,0xa4,0x19,0x40,0x60,0x07,0xa6,0xe1,0x19,0xc8, 0x24,0x9a,0xd8,0x63,0x8d,0xdc,0xc3,0x24,0xbd,0xe1,0x1c,0x6c,0xc0,0x16,0x16,0x26, 0xdf,0x04,0xce,0x0c,0x6a,0xc1,0xe0,0xe8,0x80,0x06,0x10,0x0e,0x18,0x80,0xc1,0x89, 0x7a,0x87,0x78,0x3a,0x82,0x26,0x3b,0xa2,0x18,0xfe,0x60,0x11,0x4a,0x23,0xf4,0xe6, 0x2a,0x0e,0x54,0xe1,0x12,0x8a,0x40,0x11,0xb4,0xc1,0x27,0x1c,0x81,0x9f,0x3c,0x21, 0x68,0x44,0x6e,0x53,0x36,0x2d,0x8e,0x62,0xcf,0x3e,0x58,0x01,0x1a,0x5a,0x01,0x0c, 0x70,0x81,0xf9,0x76,0x40,0xe9,0xba,0x71,0x03,0xb6,0x61,0x00,0x74,0xe1,0x07,0x62, 0x6e,0x05,0x86,0xe1,0x1e,0xa3,0xc1,0x07,0x5a,0x00,0x1b,0x92,0xe1,0x16,0x74,0x81, 0x6e,0x48,0x64,0x14,0x04,0xa0,0x01,0x1a,0xa0,0x6e,0x58,0xa0,0xfe,0x01,0xac,0xee, 0xea,0x26,0x72,0x92,0xce,0xe6,0x6c,0xec,0x42,0x44,0x8c,0x21,0x02,0xe6,0xa6,0x45, 0xee,0x92,0x91,0x7c,0x49,0xdd,0xb0,0x8d,0x35,0x50,0x80,0x08,0x96,0xa0,0x10,0xa4, 0x81,0xbd,0x80,0x86,0x28,0xec,0xe0,0x17,0x8c,0xc0,0x0d,0x1a,0x61,0x07,0x64,0xa0, 0x0c,0x68,0xc1,0x1a,0xb5,0x00,0x1b,0x3e,0xcb,0x92,0x5e,0x0a,0x31,0x36,0x60,0x0c, 0xa2,0x81,0xe3,0x0c,0x46,0x02,0x79,0x82,0x23,0xa1,0x21,0xdf,0x80,0x62,0x75,0x08, 0xa1,0x0b,0x5a,0x81,0x14,0x68,0xa0,0x16,0xcc,0x20,0x0f,0xcc,0x40,0x1a,0x1e,0xaf, 0xbe,0x7c,0xe7,0xbe,0xfc,0xe4,0x78,0xd0,0xa9,0x18,0x5e,0x41,0x0a,0x70,0xb2,0x14, 0x62,0x91,0x71,0x4a,0xe1,0x13,0xe4,0x00,0x10,0x48,0xa1,0x9f,0x7e,0x81,0x10,0x8e, 0xe0,0xb0,0x5c,0xa0,0x27,0xd2,0x04,0xf6,0x88,0x26,0xf6,0x5e,0xc0,0x53,0x52,0xe0, 0x10,0x22,0xc1,0x10,0x2e,0x61,0x0e,0x9c,0xaa,0xf7,0x4e,0xe0,0x18,0x4e,0xa0,0x00, 0x06,0xc0,0x03,0x12,0x50,0x09,0x56,0xc0,0x1a,0x4c,0x02,0x14,0x40,0x01,0x0e,0x92, 0x61,0x03,0xf6,0x42,0x1e,0xae,0xc5,0x81,0x04,0x40,0x02,0xe2,0x06,0x94,0x26,0xe0, 0x18,0x46,0x80,0x80,0x0c,0x48,0x17,0x9a,0x8e,0x2e,0xe8,0xc2,0x2f,0x8c,0x61,0xa6, 0x46,0x24,0x6d,0x8c,0xe1,0x1d,0x19,0x29,0xa7,0x54,0x8b,0x5c,0x64,0xa0,0x50,0x36, 0x01,0x12,0x08,0x81,0x0c,0x18,0x01,0x18,0xc2,0x44,0x08,0xc4,0x81,0x15,0xba,0x80, 0x11,0x56,0x0b,0x11,0x7c,0xe0,0x0e,0xa2,0x81,0x08,0xb6,0xfe,0xa2,0xf7,0x56,0x40, 0x00,0xa8,0x21,0x1c,0xa8,0x41,0x00,0x38,0x64,0x00,0xdc,0xe0,0x11,0xea,0xac,0x3d, 0x2a,0x45,0x27,0x78,0x22,0xf0,0x10,0xc6,0x06,0xb8,0xea,0x3d,0xee,0xec,0x0f,0xb8, 0xc9,0x0c,0xa0,0x80,0x0e,0xe8,0x40,0x16,0x1e,0xef,0x89,0x66,0xf3,0x14,0x63,0xb2, 0x18,0x1c,0x41,0x47,0x4b,0x43,0x4a,0x18,0x47,0x0a,0xa4,0x40,0x13,0xf0,0x80,0x14, 0x2c,0xa5,0x18,0x10,0x46,0x23,0x5d,0x40,0x27,0xe4,0x43,0x3e,0x5e,0x6f,0xa0,0x34, 0xcd,0x0e,0xd2,0x40,0x08,0xbe,0x40,0x0a,0xdc,0x60,0x0c,0xd4,0x4d,0x09,0x3c,0x64, 0x05,0x30,0xe0,0x09,0x72,0x84,0x1b,0x9b,0x81,0x02,0x0a,0x70,0x00,0xd8,0xa1,0xdd, 0x3a,0xa0,0x59,0xd4,0x74,0x4d,0x05,0xa0,0x93,0x72,0xc4,0x03,0x4e,0x20,0xeb,0x94, 0x20,0x1b,0x86,0xa1,0x11,0x3b,0x40,0x01,0x1a,0xb1,0x19,0xec,0x22,0x03,0x46,0xc9, 0xc8,0xfa,0x42,0x5f,0xfb,0xc2,0x5b,0x42,0xa0,0x03,0xa4,0x0b,0xaa,0x62,0x60,0x1b, 0xbc,0xa3,0x0c,0xce,0x00,0x0d,0x08,0xe1,0x11,0xf2,0xa1,0x08,0xde,0x23,0x1a,0xac, 0xc0,0x16,0x0e,0x00,0x0c,0xba,0x21,0x19,0xdc,0xa0,0x1c,0x6a,0x00,0x63,0x61,0x6b, 0x04,0x58,0x40,0x1d,0x56,0x41,0x19,0xf6,0x80,0x17,0x50,0x41,0x02,0x74,0x81,0x02, 0xc0,0x01,0x10,0x6e,0xa2,0x3d,0x76,0x42,0xbd,0x70,0x90,0xab,0xd0,0x6b,0x44,0xdb, 0xab,0x99,0x62,0x83,0x10,0xb4,0x41,0xcf,0x64,0x41,0x22,0xc0,0xc9,0x11,0xc6,0xc9, 0x25,0x87,0x67,0x36,0xb7,0xc3,0x22,0xb8,0x00,0x27,0xfe,0x57,0x10,0x8c,0x18,0x47, 0x37,0x3f,0x41,0x0d,0xc8,0xa0,0x9f,0xae,0x41,0x1c,0x6c,0x21,0x68,0x5c,0x80,0x15, 0xcc,0x8b,0x37,0x36,0xa5,0x49,0x7f,0x51,0x28,0xc4,0x41,0x08,0x0a,0x41,0x0a,0x88, 0xe0,0x19,0xdb,0xb0,0x6d,0x1a,0xa1,0x03,0x52,0xc4,0x92,0x74,0x61,0x97,0x90,0x8d, 0x19,0x92,0xed,0x3c,0x67,0xca,0x81,0xfa,0x62,0x2b,0x41,0x00,0x03,0x62,0x60,0x0e, 0xd8,0x6f,0x0e,0xe6,0xa0,0x00,0x68,0x0e,0xba,0x1a,0xd1,0x43,0x20,0xa0,0x3d,0x59, 0x00,0x2e,0xda,0xf4,0x45,0xd6,0x62,0x80,0x00,0xa7,0x03,0x6e,0x01,0x04,0xda,0xb6, 0xa2,0x06,0x34,0x0c,0x62,0x01,0x08,0xa0,0x41,0x16,0x52,0xe1,0x11,0x0e,0x00,0x1a, 0x8a,0xc0,0x0a,0xc4,0xe1,0x00,0x9e,0xa1,0x1c,0xe2,0xb0,0x06,0xc6,0x20,0x1e,0x94, 0xe0,0x18,0xe4,0x01,0x15,0x78,0x61,0x01,0x24,0xe1,0x1b,0xcc,0x41,0x19,0x38,0x40, 0x1e,0xc2,0x94,0x1d,0xd8,0xe0,0x26,0xf2,0x2d,0x34,0xd7,0xa8,0x9f,0xce,0x4b,0x8d, 0x62,0xc3,0xab,0xbe,0x44,0x24,0x6b,0x36,0x08,0xa4,0xa1,0x56,0xe9,0xe0,0x0f,0x28, 0x82,0x77,0x62,0x13,0x36,0x77,0x81,0x0b,0x9a,0x68,0x46,0x67,0x81,0x47,0x09,0x2c, 0x0c,0x32,0x81,0x34,0x38,0x03,0x12,0x2c,0xa1,0x9f,0x48,0xc1,0x16,0x9e,0xd5,0xb0, 0x7c,0xd1,0x02,0x74,0x70,0xa0,0x64,0xef,0x23,0x85,0x60,0x13,0x3e,0x41,0x06,0xb0, 0x10,0x2d,0xec,0x62,0x02,0x42,0x2a,0x02,0x96,0x41,0x01,0xf4,0xc2,0x80,0x2c,0x47, 0x5b,0x35,0x69,0x19,0xee,0x86,0x5b,0x3c,0x00,0xfe,0x04,0xc8,0xb5,0x32,0x64,0xa0, 0xd5,0xac,0xac,0x60,0x6f,0xed,0x0e,0xba,0x95,0xa4,0x3a,0xc4,0x2f,0xb2,0x65,0x08, 0x46,0x81,0x1a,0xa8,0x81,0x03,0x04,0x60,0x08,0x58,0xa0,0x2f,0x26,0x00,0xeb,0x16, 0x29,0x01,0xfd,0xf2,0xb8,0xa6,0x21,0xc3,0x46,0x74,0x10,0xce,0xc1,0x02,0xa4,0x55, 0x1c,0x88,0xe2,0x11,0xac,0x84,0x1b,0xee,0x80,0x02,0xc0,0x76,0x08,0xa8,0x61,0x15, 0xf6,0x00,0x06,0x26,0x01,0x06,0x4a,0x60,0x0f,0xfc,0xf7,0x18,0x7e,0x60,0x07,0x5c, 0xe1,0x26,0x98,0x60,0x20,0xda,0xec,0x00,0xcc,0x0b,0x07,0x3b,0x12,0x09,0x7c,0x06, 0x07,0xbf,0x64,0x44,0xc5,0x40,0x1a,0x5e,0x74,0x22,0x80,0xa1,0x17,0x7a,0x01,0x0a, 0x7a,0xe7,0x9b,0x74,0x77,0x56,0xff,0x80,0x0e,0xe4,0xab,0x77,0xf2,0xc0,0xf3,0x8a, 0xf7,0x78,0x67,0x41,0x58,0xd5,0x00,0x0b,0x74,0xc3,0x12,0x84,0x00,0x29,0x85,0x86, 0x68,0x72,0xf1,0xf5,0xbe,0xa7,0xe4,0xd0,0x81,0x09,0xb0,0xe0,0x0d,0x2e,0x21,0x1a, 0x72,0x40,0x85,0xf0,0x36,0x02,0xde,0xd1,0x2f,0xbc,0x6f,0x05,0x16,0x29,0x97,0x3a, 0x80,0x1d,0x47,0x09,0x30,0x56,0x60,0x85,0xaa,0x00,0x05,0xca,0x40,0x0b,0x9c,0xcb, 0x0d,0x32,0x41,0x0a,0xf4,0x60,0x8e,0xc1,0x12,0x05,0x84,0x21,0x06,0x98,0xeb,0xa4, 0xca,0x22,0x7f,0x39,0x20,0x1c,0x78,0x20,0x1c,0x38,0x80,0x1a,0x1c,0x80,0x05,0x00, 0x68,0x19,0xd4,0xf1,0xa6,0x4c,0xab,0x6b,0x6a,0x00,0x14,0x5c,0xc1,0x07,0xc0,0x20, 0xdf,0x90,0x80,0x15,0x04,0x02,0xd4,0x06,0xfe,0xa1,0x08,0x7e,0xa4,0x06,0x94,0x80, 0x6e,0x30,0xd8,0x63,0xcd,0x81,0x83,0x3b,0x78,0x01,0x78,0x61,0x14,0x38,0x64,0x0c, 0xf4,0xa0,0x15,0x0e,0xc1,0x16,0xc2,0xcb,0x8d,0xce,0xa1,0x27,0x7a,0x62,0x8d,0x06, 0x2f,0x86,0xd5,0x0b,0x1a,0xc4,0xe0,0x0f,0x92,0x40,0x1a,0x48,0x71,0x17,0x70,0x58, 0x22,0x42,0x91,0x06,0x68,0x40,0x1a,0x92,0x80,0x39,0x66,0xb5,0x77,0x76,0xe1,0x0f, 0xa4,0x20,0xf4,0x54,0x21,0x9e,0x9a,0xe2,0x47,0x7d,0xa1,0x0e,0xe4,0x83,0x89,0x7b, 0xd0,0xb0,0x10,0x2b,0xb1,0xa8,0x56,0xd3,0x64,0xaf,0xa0,0xc4,0xe1,0x08,0xde,0xa0, 0x08,0x6e,0xa0,0x1b,0x4e,0x0a,0x6f,0x53,0x64,0x03,0x90,0x2c,0x04,0x74,0x01,0x4c, 0x3d,0x40,0x01,0x82,0xa5,0x2e,0x10,0xc3,0x6c,0xb2,0x61,0x00,0xb6,0xa1,0x13,0xa2, 0x61,0x00,0x3e,0x60,0x1a,0xd8,0xc0,0x08,0x60,0xe1,0x15,0x7a,0x81,0x11,0x8a,0x40, 0x0a,0x66,0xe1,0x12,0x7c,0x40,0x06,0x0a,0x90,0xb9,0x3c,0x60,0x5b,0x86,0x00,0x15, 0x38,0x60,0x15,0x0c,0x9a,0x03,0x02,0x19,0x80,0xa5,0xa5,0x44,0x74,0xe1,0x11,0x21, 0x6a,0xd5,0xe2,0x61,0x09,0x52,0x61,0x1a,0xb8,0x20,0xdf,0xce,0x41,0x20,0x74,0xc0, 0x08,0x24,0x0b,0x11,0x72,0xa0,0x03,0x22,0x20,0x6f,0x1c,0x80,0x03,0x78,0x81,0x1c, 0xbe,0x81,0x83,0x2f,0x00,0x06,0x16,0x40,0x19,0x46,0x81,0x64,0x31,0xc0,0x0f,0xea, 0x8c,0x09,0xd6,0x44,0x23,0xed,0x20,0x8d,0xa0,0xa9,0x52,0x7e,0xe8,0x4b,0x4e,0x01, 0x55,0xc5,0xe0,0x15,0xa4,0xc1,0x08,0xfe,0x80,0xc1,0x56,0x1d,0x2f,0x0f,0x8c,0x80, 0x25,0xa5,0x81,0x86,0x91,0x48,0x1a,0x38,0xc6,0x77,0x89,0xd9,0xd1,0x62,0x71,0x4a, 0x7e,0x53,0x0a,0xf2,0xca,0x12,0x88,0x46,0x08,0xb0,0xa0,0x49,0xb1,0xc7,0xbc,0xa2, 0x98,0xc2,0x9c,0x54,0x17,0x1f,0xa5,0x0d,0x2e,0x21,0x2a,0x49,0x28,0x93,0x52,0xc4, 0x03,0x00,0x68,0x80,0x3a,0x60,0x43,0x96,0xc1,0x6c,0x06,0x08,0x4f,0x57,0x40,0x09, 0xc6,0x40,0x18,0xc2,0x80,0x1d,0x72,0xa0,0x08,0x42,0x01,0x0c,0xe8,0xa0,0x15,0x78, 0x06,0x1a,0x7e,0x21,0x14,0x52,0xc1,0x03,0xba,0x81,0x0a,0xca,0x40,0x06,0x46,0x08, 0x04,0xd2,0x42,0x00,0x50,0x81,0x1a,0x78,0x60,0x15,0x78,0x80,0x17,0x78,0x80,0x03, 0x78,0xa0,0x7f,0x3f,0x75,0x2d,0x32,0x60,0x03,0x28,0x60,0x0c,0x56,0x0b,0x04,0x32, 0xc0,0x0a,0x4c,0xa1,0x1c,0x16,0xa1,0xae,0x67,0xc0,0x08,0x1e,0x61,0x16,0x50,0x60, 0xf7,0x7e,0x60,0x05,0x46,0x49,0x00,0x42,0x3a,0xb1,0x17,0x00,0x06,0x0c,0xe0,0x02, 0xe8,0xe1,0x83,0x57,0x61,0x64,0x75,0x61,0x00,0x5c,0xc1,0x94,0x21,0x50,0xbc,0x76, 0xc3,0xbc,0x42,0x54,0x02,0x47,0xb4,0x0b,0xbc,0xe1,0x14,0xa0,0xc9,0x1b,0x66,0xb9, 0x17,0xa4,0x61,0x17,0x6a,0x75,0x77,0x76,0x01,0x0a,0x92,0x60,0xb9,0x83,0xc0,0x0c, 0x82,0xc0,0x76,0xcd,0xe0,0x97,0x25,0x02,0x0a,0x66,0x61,0x05,0x1b,0x8d,0xae,0x54, 0x21,0x9f,0x7b,0xc0,0x17,0xfc,0xca,0x05,0xd0,0x43,0x17,0x0f,0xe0,0x05,0x06,0x8b, 0x39,0x7f,0xf1,0x28,0x05,0x42,0xfe,0x1c,0x74,0xe0,0x19,0xfc,0x00,0x35,0x30,0x60, 0x91,0xca,0x02,0x31,0x56,0x00,0x59,0xbc,0xd8,0x2e,0xa6,0x85,0x2e,0x22,0x40,0x93, 0xec,0xe2,0x04,0x06,0x00,0x14,0x7c,0x00,0x03,0xba,0x81,0x0d,0x0c,0xc1,0x0a,0xac, 0xe0,0x17,0xb4,0xca,0x27,0x08,0x01,0x18,0xdc,0x80,0x05,0x9e,0xe0,0x65,0xb4,0x80, 0xa4,0x0a,0x3b,0xa4,0x79,0x41,0xa4,0x57,0x81,0xb1,0xc9,0x61,0x15,0x2a,0x9c,0x1a, 0x50,0x81,0x05,0x8e,0x41,0x60,0xc1,0x8c,0x1b,0x21,0xc0,0x03,0xa8,0x40,0x0b,0x9c, 0x8a,0x2b,0x48,0xfc,0x09,0x3a,0xc0,0x57,0x6c,0x64,0x02,0x0c,0xbb,0xa0,0x17,0xe0, 0x1b,0x5a,0x5b,0x03,0x44,0xe0,0x83,0x39,0x00,0x15,0xe4,0xa1,0x19,0x30,0xc0,0x3c, 0xc0,0xcb,0x06,0x04,0x21,0x8d,0x74,0x9b,0x27,0xda,0xe3,0x3d,0x82,0xb2,0x52,0xdc, 0x63,0xa7,0x0d,0xae,0x25,0x7b,0x27,0x14,0xa1,0xc0,0x97,0x93,0xe0,0xb9,0x6b,0xa1, 0x9b,0x96,0x5b,0x25,0xff,0x80,0x33,0x74,0x34,0x16,0x7d,0xf3,0x12,0x16,0xc1,0x15, 0xb8,0x5b,0x7a,0xd3,0x20,0x18,0x72,0x51,0x10,0xec,0x60,0x1c,0x1e,0xd9,0x0e,0x78, 0x90,0x07,0x39,0x65,0x18,0x61,0x61,0x0d,0xe2,0x00,0x14,0x24,0xa7,0x1b,0xe9,0x66, 0x19,0xd2,0x94,0x2d,0x76,0x6b,0x5d,0xd1,0x77,0xda,0x36,0xfc,0x09,0xca,0x41,0x18, 0x72,0x60,0x0e,0x00,0xe1,0x11,0x84,0xa1,0x1b,0x76,0xc1,0x1b,0xea,0xc0,0x04,0x58, 0xc1,0x27,0x88,0x08,0x10,0x9e,0x2e,0x06,0xca,0x20,0x1a,0x30,0xa0,0xe9,0x26,0x80, 0x05,0xa8,0x81,0x17,0x2c,0xfe,0x7c,0x0f,0x34,0x78,0x0f,0xf6,0x60,0x01,0x16,0xc0, 0xa0,0x51,0x01,0x54,0xc7,0xd9,0xa4,0xb2,0x61,0x05,0x8c,0x61,0x08,0x3a,0xe0,0x03, 0xc8,0xe2,0x2e,0xf2,0x42,0x31,0xbc,0x2f,0xc5,0x03,0x68,0x14,0x78,0xc0,0x1c,0x4a, 0xa0,0xb5,0x2f,0xe0,0x02,0x26,0xc1,0x1c,0x56,0x81,0x03,0xa4,0x65,0x05,0x28,0x80, 0x11,0x06,0xa1,0x0b,0x6c,0x80,0x04,0xec,0xe0,0x74,0x78,0xc2,0x75,0x7b,0x02,0x52, 0xdb,0xc3,0x3d,0x30,0x05,0x13,0x48,0xc1,0x11,0x0e,0xce,0x77,0x77,0x21,0x0f,0x52, 0xb2,0x97,0x9d,0xbb,0x10,0x0c,0xa1,0x4e,0x6a,0x41,0xcf,0x6a,0x19,0x33,0x8e,0xb8, 0x98,0x3b,0xef,0x12,0xa4,0xc0,0x14,0x14,0xa1,0x18,0x76,0x03,0x09,0xb0,0xa0,0xcb, 0x65,0xc1,0x0a,0xc2,0x60,0x17,0xce,0x01,0xd4,0x3e,0xed,0x8c,0x62,0x4f,0x28,0xd0, 0xc1,0x06,0xfa,0x40,0x08,0x00,0xa1,0x08,0x50,0x60,0x5e,0x14,0x40,0x58,0xfe,0xe2, 0x2f,0xac,0x45,0x00,0x46,0xc1,0x01,0x50,0x81,0xc6,0xff,0x02,0x2f,0xb6,0x13,0x03, 0xc0,0x01,0x0a,0xf5,0x6f,0x6c,0xac,0x60,0x10,0x5a,0xc1,0x0d,0x46,0xa0,0x0e,0x16, 0xb7,0x08,0x20,0x4e,0x18,0x48,0x0a,0x14,0xe2,0x20,0x06,0xde,0xa2,0x5a,0x3c,0x56, 0x1f,0x58,0xbd,0x04,0x16,0xc0,0x1c,0x38,0x9e,0x1c,0x20,0x9d,0x1a,0x86,0x20,0x45, 0x74,0x21,0x1b,0x92,0x4d,0x93,0x1d,0x00,0x02,0x1a,0x21,0x1b,0x9a,0x61,0x4e,0xf1, 0x52,0x93,0xe6,0xe6,0x18,0x54,0x5c,0x1d,0x16,0xa0,0xd5,0x2f,0x40,0x03,0x5e,0x3d, 0xd6,0x79,0x40,0x3d,0xfe,0xd3,0x9a,0x02,0x10,0xcc,0x34,0xdb,0x83,0x10,0x58,0xb8, 0x27,0x68,0xe2,0x14,0x84,0xe2,0x54,0x2b,0x05,0x19,0xc4,0x21,0x12,0xfe,0xc0,0x35, 0x67,0x53,0x22,0x80,0x79,0xb9,0x97,0xbc,0xc9,0x9f,0xdb,0xb9,0xf5,0x0c,0xd2,0xac, 0x1d,0x27,0x67,0xe1,0xd4,0xa2,0x20,0x0a,0x1c,0xe1,0xdb,0xb1,0x20,0x68,0xea,0xa0, 0x07,0x84,0xa1,0x05,0xd8,0x20,0xf5,0x0a,0x2b,0x17,0xd7,0xfd,0x30,0xdf,0x3d,0x14, 0xd6,0x7b,0x7f,0xce,0xf3,0x8c,0xe5,0x81,0x7f,0x07,0x9a,0x03,0xd4,0xc1,0x7f,0x6b, 0xe4,0x1d,0x41,0xc0,0xa9,0x5a,0x00,0x17,0x14,0x33,0x58,0xcc,0xe3,0x17,0xe2,0xa1, 0x01,0x84,0x00,0x13,0x1e,0x61,0x08,0x00,0xa1,0x0e,0xc2,0xc0,0x43,0x6a,0xa0,0x0c, 0xca,0x40,0x00,0x40,0x96,0x17,0xf6,0x80,0xe3,0x4b,0x80,0x83,0x4b,0x80,0xd5,0xcd, 0x21,0x64,0x33,0xbc,0x5f,0x43,0xe0,0x42,0x82,0x65,0x02,0x1a,0x80,0x7f,0xe5,0xc1, 0x03,0x6e,0xa1,0x43,0x34,0xa4,0x2e,0x84,0x25,0x80,0x86,0x20,0x1c,0x3a,0x59,0x04, 0x6a,0x7e,0x0a,0xa6,0xe0,0xa4,0x17,0x40,0x1d,0xa4,0x05,0x58,0x1a,0xe1,0x11,0x6c, 0xc1,0x16,0xd8,0x0b,0x1a,0x4e,0x34,0x6a,0xbd,0xc1,0x8d,0xba,0x60,0x28,0xee,0x2d, 0x9a,0x2c,0x25,0x26,0x5e,0xe1,0x03,0x8f,0xfc,0x87,0xa5,0x81,0x06,0x96,0xdb,0xb9, 0x0d,0xa1,0x10,0xbc,0xa0,0x16,0xc0,0x00,0x89,0x90,0x28,0x09,0x8e,0xc4,0xea,0x9b, 0xe0,0x13,0x3e,0x01,0x17,0x82,0x73,0x0d,0xb4,0x01,0x6a,0xed,0x40,0x08,0x74,0x80, 0x04,0x80,0x80,0xfe,0x0a,0xce,0xc5,0x0a,0xec,0x20,0xb1,0x5a,0x4f,0x7a,0x89,0xc6, 0x0e,0x80,0xe6,0x00,0x98,0x20,0xa3,0x01,0xa1,0x0c,0xb6,0x21,0x19,0xc0,0xd4,0x2f, 0x72,0x6b,0x08,0xea,0x7e,0xb1,0x67,0x1d,0x6f,0x08,0x03,0x58,0x7e,0x60,0x00,0x00, 0xa2,0x86,0x16,0x61,0x39,0x30,0x4c,0x30,0xe6,0x8a,0x10,0x34,0x60,0xcf,0x90,0x21, 0x19,0x04,0xe8,0x0a,0x97,0x54,0xf2,0x08,0x60,0x20,0x32,0x87,0x43,0x89,0x8d,0x92, 0x60,0x38,0x9b,0x24,0x82,0xde,0x24,0x73,0xe6,0x4a,0x90,0xe3,0xe0,0x40,0x80,0x84, 0x09,0x10,0x32,0x84,0x38,0xb1,0x22,0x03,0x04,0x16,0xa8,0x38,0xd8,0x14,0x00,0xc1, 0xc3,0x09,0x98,0x10,0x26,0x48,0x18,0x35,0x6a,0x55,0x09,0x18,0x22,0xe0,0x4d,0x99, 0xf2,0x40,0xc3,0x85,0x49,0x0b,0xa8,0x09,0x88,0x90,0xc1,0x03,0x08,0x34,0x4c,0x98, 0x74,0x21,0x84,0x69,0x50,0x17,0x24,0x29,0x3c,0x41,0xb3,0x83,0x04,0xc9,0x01,0x74, 0x48,0xa0,0x75,0xc1,0x94,0xe2,0x1c,0x93,0x3a,0xd7,0x7a,0xf5,0xda,0x35,0x63,0x86, 0x23,0x3a,0xbd,0x92,0x98,0x09,0x52,0x2b,0x88,0x21,0x30,0x86,0xf4,0xea,0x35,0x73, 0xb7,0x87,0x60,0x5c,0x72,0x2e,0x15,0xb9,0xd4,0x43,0xd3,0x1a,0x3c,0xc5,0x04,0xb9, 0xb0,0x40,0xe8,0xcf,0x1f,0x3f,0x7a,0xac,0x18,0x7a,0x65,0xc1,0x05,0x3a,0x17,0xb9, 0xec,0x64,0x7e,0xe1,0xc9,0xdb,0x81,0x03,0x36,0xfa,0x04,0x0b,0x35,0x4b,0x18,0xb3, 0x1f,0x1e,0x20,0x44,0x90,0x37,0x64,0xd4,0x10,0x0e,0xbc,0x78,0x29,0xdb,0xc3,0x8b, 0xda,0x28,0xfe,0x01,0xf2,0x20,0xe8,0xda,0xd0,0x01,0xc3,0x8e,0x0f,0xf1,0x92,0x75, 0x60,0x91,0xea,0x97,0xb7,0x2e,0xa7,0x30,0x1d,0x42,0xe2,0xcd,0xc6,0x33,0x76,0x10, 0x14,0xcc,0x99,0x76,0x6c,0xe8,0x50,0x03,0x06,0x24,0x19,0x10,0x31,0x09,0x46,0x89, 0x05,0x0b,0x4e,0xea,0x96,0x37,0x01,0x6a,0x08,0x0f,0x23,0x56,0xf8,0x9c,0xbd,0x8a, 0x03,0x0f,0x75,0xe7,0x61,0x53,0xa3,0xc6,0x81,0x5c,0x89,0x49,0x17,0x2e,0x1c,0xd5, 0x30,0x85,0x52,0x25,0xf0,0xb2,0xdb,0x04,0xba,0x74,0x30,0xd5,0x21,0x84,0x1c,0x32, 0xc8,0x29,0x87,0x78,0x93,0x42,0x0a,0x16,0x1c,0xd0,0xd5,0x01,0x9e,0x95,0x05,0x0d, 0x26,0xcb,0x0d,0x22,0x06,0x2c,0x79,0x40,0xb1,0xcb,0x2e,0xc0,0xfc,0x01,0x45,0x2f, 0x34,0x24,0x61,0x48,0x5f,0x66,0x18,0x42,0x49,0x8a,0xb5,0xe4,0x65,0x97,0x1f,0x32, 0xca,0xd8,0x83,0x1c,0xb8,0x24,0xd2,0x83,0x22,0x67,0xbc,0x62,0x47,0x2e,0xb9,0x20, 0x61,0x08,0x23,0x3d,0x24,0xa1,0x0d,0x29,0xb5,0xd8,0xe2,0x42,0x8f,0x07,0x58,0x20, 0x08,0x09,0xa0,0x61,0x32,0x9a,0x38,0x7d,0x44,0x62,0x08,0x2e,0xa9,0x80,0x43,0x41, 0x6b,0xef,0x0d,0x41,0x0d,0x0f,0xab,0xec,0xb1,0xc7,0x02,0x7b,0x9c,0x14,0xce,0x28, 0xbd,0x4d,0x30,0x41,0x54,0x20,0x8c,0xc1,0xcc,0x18,0x4a,0xfc,0x00,0x48,0x86,0x98, 0x70,0xe5,0x0d,0x26,0xe2,0xb8,0x32,0x00,0x33,0x05,0x54,0xb1,0x01,0x0f,0xdf,0xc0, 0x40,0x0f,0x77,0x06,0x38,0x63,0xc0,0x05,0xe2,0x91,0x87,0x1b,0x4a,0x66,0xa2,0x49, 0xc0,0xfe,0x0a,0x27,0x84,0x90,0x01,0x01,0x11,0xb0,0xe0,0x80,0x4d,0xea,0x78,0xb9, 0x8a,0x32,0xab,0xe0,0xa3,0xcc,0x02,0x25,0x11,0x75,0x01,0x80,0xff,0x69,0x60,0x00, 0x0c,0xab,0x98,0xe9,0x5b,0x07,0x4f,0xa0,0x31,0x08,0x21,0x84,0xf4,0x71,0x48,0x73, 0x5c,0xb9,0x40,0xa1,0x84,0xe8,0x90,0xe5,0x0d,0x12,0x5d,0xb0,0x42,0xc8,0x20,0xda, 0xd0,0x00,0xc5,0x1f,0xc0,0x88,0x48,0x22,0x14,0x27,0x9a,0x51,0xcb,0x5e,0x85,0x14, 0xc2,0x97,0x5f,0x49,0x24,0x91,0x08,0x1f,0xd2,0x26,0x82,0x23,0x2e,0x7c,0xb8,0x92, 0x05,0x20,0x33,0x60,0xf2,0xc2,0x63,0x74,0xf8,0x61,0xc5,0x35,0x64,0x5c,0xf3,0x86, 0x17,0x5d,0xd8,0x22,0x48,0xba,0x07,0x90,0xe0,0x82,0x0b,0x24,0x90,0x20,0x88,0x0e, 0x91,0x60,0x21,0xcb,0x12,0x65,0x20,0xf2,0xc1,0x09,0x04,0x4c,0x20,0x0f,0x0b,0x02, 0xd4,0xc4,0xcb,0x1e,0x24,0x99,0x83,0x68,0x7c,0xd4,0xa0,0xe2,0xaf,0x3c,0xba,0x28, 0xf0,0x43,0x23,0x05,0x09,0x03,0x08,0x1a,0x08,0x2c,0xd7,0x05,0x2c,0x8c,0xa4,0x72, 0x47,0x0e,0x4f,0x78,0x30,0xc1,0x02,0x1d,0xf5,0x77,0x41,0x77,0xa5,0x9a,0xb3,0x4a, 0xc9,0xf1,0x39,0x80,0xca,0x6e,0x2c,0x48,0xd0,0x68,0x07,0x1b,0xac,0x40,0x80,0x31, 0xff,0xe6,0xc7,0xcb,0x97,0x60,0xee,0xb1,0x91,0x39,0x30,0x78,0xa7,0x81,0x52,0x3d, 0x6b,0x00,0x8f,0x08,0x30,0x2c,0x70,0x2a,0x54,0xba,0x78,0xb0,0xea,0x2f,0x83,0x28, 0x78,0x88,0x59,0xd0,0xa4,0x80,0x84,0x1d,0xe8,0x58,0x20,0xb5,0x1d,0xce,0xe5,0x8a, 0xfe,0x04,0x26,0x42,0x8c,0x43,0xc7,0x1f,0xaf,0xe4,0x01,0x4c,0xb0,0x6e,0xd1,0x41, 0x83,0x34,0x49,0xe0,0x95,0x6c,0x2d,0x85,0xc0,0x68,0x46,0x12,0x7c,0x2c,0x61,0x8a, 0x29,0x4b,0x2c,0x91,0x88,0x1f,0x4b,0x70,0x72,0x86,0xb6,0x98,0x78,0xe2,0x49,0x2e, 0x74,0xb8,0x12,0x85,0x18,0x58,0x48,0xb3,0x58,0x2b,0x47,0x90,0x36,0x61,0x1f,0x16, 0x4e,0x78,0x00,0x13,0x71,0xcd,0x00,0x88,0x14,0x32,0x30,0xa3,0xc0,0x08,0xfc,0x0a, 0x20,0x00,0x7e,0x5f,0x96,0x54,0x02,0xe7,0x25,0xec,0x51,0xb2,0x3a,0xab,0xa0,0x82, 0xde,0x0a,0xcd,0xfc,0xf0,0x44,0x23,0x18,0x7c,0x90,0x89,0x1e,0x7a,0xcc,0x42,0x44, 0x15,0x18,0xfc,0xa0,0x44,0x07,0x1d,0x50,0x63,0x0e,0xcf,0xf0,0x84,0x0c,0x83,0x78, 0x27,0xd1,0xc7,0x43,0x38,0x1c,0x00,0x25,0x00,0x0b,0x0d,0x4c,0xb0,0xc2,0x06,0x4a, 0x64,0x93,0x81,0x31,0x12,0xa0,0x42,0x4d,0xcd,0x37,0x87,0xc9,0x39,0x0c,0x93,0x14, 0xda,0x1f,0xd0,0xbc,0x9b,0x73,0xd2,0x10,0x11,0xac,0xa0,0xcb,0x09,0x8d,0xa0,0x41, 0x4a,0x2b,0x0c,0x1e,0x82,0x09,0x26,0xd0,0x20,0xe1,0x49,0x0a,0x9b,0xa9,0x9b,0x7e, 0x58,0x29,0x60,0x12,0xc9,0x15,0x79,0x7c,0x4d,0x47,0x88,0x8e,0x94,0xdd,0x8b,0x11, 0x27,0xda,0x15,0x84,0x00,0xda,0x05,0x46,0x41,0x58,0x42,0x14,0x2a,0xc1,0x09,0x4e, 0x54,0xa2,0x12,0x4b,0xa8,0x04,0x1e,0xbe,0xf0,0x88,0x71,0xb4,0x82,0x6f,0xb9,0x40, 0x03,0x27,0x00,0x41,0x8a,0x62,0x40,0xe2,0x5a,0x5e,0xb0,0xc1,0x01,0x4c,0xc0,0xfe, 0x2e,0x5b,0xd4,0xc1,0x0e,0x4d,0x5a,0xd7,0x11,0xc0,0x80,0x06,0x4a,0xc8,0xc1,0x07, 0x31,0xf8,0xc1,0x0a,0x8e,0x21,0x01,0x79,0x08,0x60,0x14,0xa2,0x0b,0xd3,0x37,0x4a, 0xf0,0x8d,0x1c,0x8e,0x27,0x74,0xab,0xe0,0x05,0x07,0xc2,0x81,0x0a,0x09,0xa8,0x04, 0x79,0x4a,0x00,0xc1,0x00,0x92,0x41,0x01,0x25,0xec,0x64,0x18,0x0c,0x13,0x00,0xce, 0x08,0xb5,0xbb,0xfe,0xc0,0xc0,0x1c,0x7b,0x98,0x0f,0x7d,0x0e,0xe6,0x00,0x94,0x09, 0xa0,0x01,0x4f,0x81,0x00,0x82,0xac,0xd1,0x1a,0x09,0xcc,0xc6,0x4b,0xe4,0xf1,0x54, 0x49,0x74,0x76,0x3d,0xec,0xc1,0x63,0x8d,0xbc,0x13,0xd3,0x28,0x8e,0x97,0x81,0x0c, 0xa8,0xea,0x11,0xb0,0x68,0x95,0xd2,0xba,0x00,0x0d,0x08,0x41,0x0d,0x1d,0xb9,0x40, 0x47,0xba,0xb8,0x02,0x35,0x5d,0x45,0x62,0x06,0x7f,0x70,0x44,0x2f,0x80,0x81,0xc8, 0x3f,0xb8,0x85,0x06,0x74,0x30,0xc2,0xd9,0x02,0x28,0xc0,0xb3,0x3d,0xcb,0x0c,0xa6, 0x40,0x60,0x2c,0x2e,0x19,0x8b,0x35,0x28,0xc2,0x17,0x41,0x68,0x83,0x64,0xf8,0x86, 0x09,0x46,0xb0,0x41,0x0d,0x42,0xc0,0x02,0x27,0x70,0x41,0x05,0x4e,0x44,0xa2,0x0f, 0x69,0xb0,0x41,0x93,0x6c,0x61,0x03,0x1b,0x88,0xc3,0x06,0x24,0x20,0x84,0x11,0x62, 0x71,0x86,0x4a,0x64,0x82,0x1b,0x4f,0xe8,0x40,0x06,0x5e,0x33,0x43,0x6a,0xac,0x82, 0x1c,0xd5,0xeb,0x5d,0xe7,0x70,0xc3,0x03,0x1e,0xd4,0xa6,0x66,0x35,0x2b,0x19,0x07, 0x86,0xc0,0x82,0x08,0x40,0xe0,0x18,0x07,0xea,0xc0,0x0f,0x7e,0x30,0x81,0xfe,0x55, 0x90,0xc7,0x19,0x44,0x09,0x8f,0x08,0x4a,0x40,0x1b,0x0e,0x5c,0x91,0x1a,0x0e,0x20, 0x27,0x6f,0x64,0x88,0x9e,0x66,0x3c,0x61,0x00,0xbd,0x84,0x40,0xe6,0x2e,0xb5,0xb9, 0x8d,0xfc,0xc9,0x7a,0xdc,0xb9,0x80,0x51,0xe0,0x41,0x0f,0x11,0x94,0x8a,0x1c,0xf1, 0x91,0x87,0x31,0x08,0xf0,0x9b,0x01,0x3c,0x02,0x0a,0x4a,0x13,0x83,0x25,0x4e,0x91, 0xab,0xae,0x78,0xe2,0x56,0x82,0x18,0x4b,0xfb,0x22,0x84,0x84,0x3e,0xd4,0x01,0x18, 0x74,0x91,0x86,0x2c,0xf2,0x67,0xc8,0x5e,0xd0,0xc5,0x44,0x6d,0x03,0x20,0x60,0x9e, 0x15,0xc0,0x28,0x70,0x42,0x11,0x59,0xf0,0x85,0x49,0x4d,0xfa,0x86,0x5e,0x98,0xc1, 0x11,0xd2,0x68,0x1f,0x26,0xd8,0xd0,0x83,0x33,0x04,0xa3,0x0e,0x6c,0x28,0xc2,0x0d, 0xfc,0xf0,0x08,0x26,0xd8,0x00,0x1d,0xe2,0xb8,0x15,0x09,0x2c,0x20,0x0e,0x12,0xd8, 0xa0,0x0b,0xbf,0x50,0x04,0x27,0x7c,0x01,0x3b,0x0c,0x6c,0x20,0x03,0xe9,0xb1,0xcf, 0x30,0x3d,0xb5,0x11,0x18,0xdc,0x90,0x24,0x62,0x52,0x46,0x33,0x41,0xe7,0xc3,0x70, 0x38,0x20,0x36,0x2c,0x98,0xc0,0x31,0x3c,0xa0,0x04,0x25,0x78,0x60,0x08,0x4f,0x1d, 0x0a,0x78,0x7a,0x37,0x34,0x5e,0xa8,0x63,0xad,0xf7,0x41,0x59,0x39,0x51,0x71,0x4e, 0x79,0x48,0x20,0x03,0x3f,0x58,0x5d,0x96,0x26,0x00,0x3d,0x0e,0xc4,0x93,0x24,0x52, 0x4d,0xa3,0x3d,0x77,0x17,0x9e,0x8d,0x10,0x8d,0x1a,0x5d,0xcd,0x80,0x2e,0x94,0xe0, 0x8e,0x47,0x5c,0x63,0x10,0x83,0xb8,0x86,0x18,0xf2,0x08,0xb5,0x08,0xfe,0xf9,0x68, 0x6a,0x82,0x50,0x1f,0x57,0xe8,0x87,0x05,0x28,0x40,0x41,0x1a,0x66,0x30,0x82,0x2c, 0x76,0xf1,0xa1,0xb2,0xd1,0xc0,0x91,0xcf,0x32,0x1b,0x67,0x3b,0x7b,0x97,0x20,0x54, 0x62,0x0d,0xb1,0xc0,0x83,0x2f,0xde,0x70,0x06,0xd8,0x06,0x42,0x1a,0xaf,0xb8,0x46, 0x2d,0x72,0x85,0x0c,0x46,0x64,0x22,0x10,0xe3,0x30,0x41,0x1b,0x16,0xa1,0x0a,0x29, 0xc4,0xa2,0x0f,0x7d,0x00,0x2a,0x92,0x1a,0x9a,0x06,0xc3,0xf5,0x2a,0x14,0x51,0xc0, 0x83,0x1f,0x58,0xe8,0xc2,0x9e,0x44,0x80,0x4b,0x35,0x33,0xa3,0x3c,0x49,0x92,0xb3, 0x05,0x28,0xe3,0x36,0x63,0x5a,0x05,0x0f,0x38,0x90,0xb2,0x45,0x81,0x6f,0x05,0x12, 0x08,0x07,0x98,0xc8,0x63,0xd6,0xf0,0x88,0x67,0x0f,0x1c,0xa0,0x86,0x3a,0xc2,0xa1, 0x9b,0xd8,0x38,0x60,0x14,0xd0,0x93,0x0d,0x7d,0x23,0xb0,0x01,0xe1,0xe4,0x20,0x4b, 0x11,0xc8,0x1c,0x0f,0xc2,0xb4,0x91,0xa1,0x7c,0x23,0x8d,0xa2,0xf8,0x2b,0x53,0xc8, 0x13,0x9f,0x21,0xb0,0xcc,0xb0,0x4a,0xa0,0xc0,0x23,0xc4,0xd0,0x0a,0x42,0xbc,0x22, 0x12,0x80,0x84,0x50,0x8f,0x6e,0x35,0x1a,0xf9,0xa5,0xa0,0x0b,0x62,0x40,0x80,0x11, 0xcc,0x96,0x04,0x23,0x78,0x36,0x0f,0x64,0x93,0x86,0x34,0x1c,0x29,0x0d,0x43,0x18, 0xa1,0xa2,0xd2,0xe8,0x85,0x89,0x93,0xb0,0xda,0x58,0xbc,0x36,0x10,0x90,0xf8,0x42, 0x1b,0x36,0x51,0x0b,0x31,0x68,0xc3,0x10,0x83,0x60,0x05,0x09,0x1e,0x41,0x04,0x36, 0xec,0xc2,0x04,0x8e,0xb0,0xc2,0x2c,0x52,0xe1,0x07,0x30,0x98,0xfe,0x40,0x08,0x82, 0x40,0xc7,0x0b,0x2c,0xd0,0x07,0x4c,0xfc,0xc1,0x0b,0xad,0x80,0xc2,0x2b,0xce,0x30, 0x52,0x29,0x80,0x02,0x03,0x5a,0xfa,0x09,0x35,0xc2,0x31,0x4c,0x81,0x0d,0xac,0x73, 0xeb,0x45,0x14,0x98,0x6e,0x63,0x93,0x67,0xf2,0x46,0x00,0x43,0x70,0x80,0x3a,0xce, 0x0b,0xd5,0xa1,0x58,0xaf,0x77,0x0b,0xc8,0xcd,0x10,0xb8,0x84,0xb2,0xfb,0xd8,0xe4, 0x60,0xa3,0xb8,0x4f,0x99,0x32,0x40,0x01,0x66,0xd4,0x60,0x07,0x03,0x50,0x02,0x5e, 0x6d,0x26,0x30,0xb4,0x86,0x87,0x3b,0xe0,0x09,0x0f,0xd1,0x4a,0xe6,0x14,0x08,0x80, 0xef,0xb0,0x4f,0x00,0x84,0x25,0x06,0xd1,0x0a,0x10,0x96,0x05,0x42,0xed,0xd3,0xcc, 0x68,0x48,0xc0,0x8a,0xcb,0xb6,0x42,0x1b,0xd7,0x08,0x82,0x89,0x8d,0xa0,0x59,0x59, 0x20,0x12,0x0a,0xcf,0x12,0x71,0x2f,0xa0,0x40,0x87,0x60,0xd1,0x80,0x06,0xaf,0x86, 0x02,0x30,0x46,0x8a,0x07,0x35,0xd0,0xb8,0x0d,0x5f,0xf8,0x42,0x8a,0x2c,0x21,0x86, 0x20,0x68,0x03,0x13,0x82,0x78,0x06,0x28,0xa8,0x30,0x03,0x13,0xfc,0xe1,0x11,0xaa, 0xe8,0x84,0x14,0x5c,0x71,0x42,0x74,0xd8,0xe0,0x05,0xb9,0xa8,0x65,0x2b,0xc0,0x60, 0x89,0x3c,0xc0,0x42,0x1a,0x8a,0x50,0x44,0x22,0xca,0x10,0x03,0x25,0x64,0xe0,0x18, 0x13,0x98,0x21,0x6d,0xbe,0x34,0x1e,0xcf,0x75,0xae,0x73,0xe4,0xa1,0x22,0x98,0xbc, 0xa4,0xcc,0xb5,0x7a,0x09,0xce,0xee,0x46,0xaf,0x76,0x3e,0xf7,0x4c,0x16,0x0c,0x01, 0x15,0x0e,0x00,0xf3,0x2a,0xc2,0x21,0x3c,0x94,0x41,0xcf,0xfe,0x29,0xc7,0xf8,0xc1, 0x00,0x3e,0xb0,0x03,0x76,0x28,0x35,0x02,0xd1,0x13,0x58,0x80,0xb7,0xc3,0x1d,0xf5, 0x0e,0x6d,0x15,0xf4,0x31,0xd3,0x0a,0x5e,0xb2,0x81,0x1f,0x50,0x80,0x11,0x96,0x68, 0x85,0x10,0x6c,0x81,0x8e,0xc8,0x7a,0xc3,0x13,0x3d,0xd2,0x0c,0xd5,0xc2,0xa2,0x2b, 0x52,0x7c,0xad,0x6d,0x8c,0xf4,0x2c,0x1d,0x80,0xf1,0xa1,0x12,0xbd,0xfa,0xd5,0x61, 0xcb,0x43,0xad,0xa1,0x40,0x62,0x45,0xb4,0xf6,0x0d,0xbb,0xee,0xb5,0x17,0xc0,0x20, 0x06,0x52,0x6c,0x16,0x13,0x76,0x10,0xc3,0x34,0xc0,0x81,0x06,0x9b,0x4f,0x86,0x0a, 0x32,0xc0,0x05,0x20,0x42,0x71,0x05,0x3b,0x78,0x26,0x17,0x57,0x10,0x02,0x14,0x42, 0xa1,0x0d,0x23,0x04,0xc1,0x0b,0x89,0x88,0xc5,0x25,0x40,0xf1,0x04,0x5d,0x40,0x00, 0x02,0x62,0xa4,0x0d,0x39,0x3c,0x05,0x55,0x73,0xfc,0x29,0xc0,0x65,0x24,0xc7,0x98, 0x30,0xe5,0xdd,0x4e,0x95,0x11,0xed,0x61,0x2a,0xa3,0xe7,0x46,0x17,0x43,0x16,0x8c, 0x22,0x60,0x54,0x2c,0x19,0x2f,0xe0,0x4b,0x4e,0x33,0x7d,0x35,0xac,0x8d,0xf8,0x40, 0x0d,0x72,0xd0,0x01,0x79,0x50,0x83,0x98,0x51,0x15,0x0f,0x0c,0x0c,0x30,0x09,0xf5, 0x52,0x91,0x03,0xc5,0xc3,0xc9,0x81,0xde,0xd4,0x88,0x01,0x30,0x42,0x1b,0x86,0xeb, 0xa3,0xd4,0x2d,0x10,0xa1,0x14,0xe4,0x82,0xda,0x0d,0x45,0x39,0x21,0xb4,0xc1,0xd2, 0x20,0xfc,0x6f,0xd6,0x50,0x70,0x84,0x66,0x69,0xe0,0x08,0xd0,0x0a,0x6b,0x58,0x60, 0xcb,0x43,0x1e,0x76,0x01,0x05,0x59,0x68,0xf2,0xb5,0xfe,0x67,0xd8,0x04,0xaf,0x37, 0xe1,0x6b,0x58,0x44,0x62,0x2e,0x83,0x40,0xc2,0x21,0x5c,0x81,0x01,0x3d,0x48,0xe3, 0x1a,0x85,0x30,0x84,0x14,0xa6,0xa1,0x8a,0x1e,0x18,0xc1,0x15,0x91,0x38,0x87,0x10, 0xaa,0x1d,0x0a,0x34,0x84,0xe2,0x15,0x6b,0x7b,0xc5,0x02,0x5d,0x31,0x0d,0x0a,0x74, 0xe0,0x18,0xcb,0x10,0xe2,0x28,0xe6,0x8d,0x5e,0x31,0xe9,0xcc,0x98,0xe2,0x29,0x89, 0x99,0xa7,0x87,0xa8,0xf8,0x0b,0xec,0xbc,0x61,0x02,0x13,0xe5,0x9b,0xea,0x00,0xa1, 0x4c,0x11,0x4c,0xff,0xb6,0x14,0xaa,0x32,0xb0,0x02,0x2b,0x80,0x20,0x3b,0xc0,0x0d, 0x39,0xd0,0x0c,0x2c,0xc0,0x0b,0x04,0xb3,0x00,0x68,0xd5,0x3b,0x91,0xe7,0x11,0xfa, 0xc0,0x0b,0x0e,0x20,0x01,0x13,0x18,0x15,0xca,0xb3,0x4e,0x18,0xc0,0x06,0x34,0xf0, 0x0b,0x4c,0xd0,0x64,0x9e,0x41,0x16,0x24,0xf7,0x02,0xd4,0x66,0x07,0x07,0x30,0x27, 0x98,0xa0,0x72,0x2e,0x66,0x06,0xb3,0x46,0x6b,0x2e,0x56,0x22,0x60,0x33,0x03,0x88, 0x34,0x03,0x22,0x12,0x22,0x2f,0x38,0x2c,0x88,0xb4,0x06,0x25,0xc5,0x73,0x37,0xd6, 0x6b,0x5f,0xe0,0x05,0x8e,0x40,0x0a,0xa8,0x27,0x06,0xe9,0xf3,0x0c,0x73,0x90,0x0a, 0x68,0x60,0x2c,0x85,0xb0,0x06,0x8b,0x90,0x0a,0xb8,0xa0,0x07,0x6c,0xc0,0x06,0x76, 0xa0,0x03,0xec,0xf2,0x0c,0x6d,0x70,0x19,0xa1,0xa0,0x06,0xb5,0x10,0x08,0xb8,0x50, 0x09,0x61,0x50,0x03,0x2e,0x74,0x0c,0x93,0x32,0x04,0x5e,0x72,0x76,0xee,0xc7,0x57, 0x0d,0xc8,0x80,0x82,0x65,0x46,0x67,0x94,0x76,0xfe,0xed,0x06,0x3a,0xf5,0x07,0x3a, 0xa7,0x82,0x26,0x12,0xc0,0x02,0xea,0x80,0x46,0x9f,0x63,0x55,0xe1,0x84,0x13,0x01, 0xd8,0x3c,0xd2,0xd4,0x01,0x8d,0x30,0x07,0xdb,0x80,0x01,0xcd,0xe0,0x00,0x75,0xf7, 0x70,0xfb,0x21,0x55,0xce,0xa0,0x0f,0xea,0xc0,0x02,0xe8,0x01,0x80,0x0a,0xf0,0x04, 0x4f,0x40,0x01,0x03,0x10,0x0f,0xae,0xb0,0x09,0xa4,0x40,0x02,0x63,0x21,0x08,0xb9, 0x00,0x7a,0x9e,0x80,0x04,0xed,0x02,0x2f,0x14,0x82,0x04,0xa3,0x56,0x17,0x80,0xb1, 0x82,0x9a,0x25,0x19,0x5e,0x23,0x83,0x8f,0xc3,0x05,0x33,0x20,0x11,0x70,0x21,0x11, 0x5c,0xa0,0x08,0x78,0x00,0x04,0x3c,0x07,0x09,0xbf,0x77,0x63,0xbd,0x20,0x06,0x62, 0x70,0x0d,0xd7,0xf0,0x1c,0x5d,0x60,0x05,0xe5,0xa0,0x07,0x90,0x20,0x0d,0xcb,0x62, 0x0a,0x61,0xe0,0x03,0xaa,0xa0,0x5b,0x6d,0x90,0x15,0x07,0x60,0x0b,0x8c,0x20,0x0b, 0xa4,0xe0,0x05,0x95,0xe0,0x0b,0x59,0x10,0x2d,0x9a,0xa0,0x05,0x03,0xe0,0x01,0x4c, 0xd5,0x5f,0xfe,0x56,0x77,0xee,0x27,0x67,0x82,0x82,0x56,0x92,0x20,0x8e,0xc6,0x54, 0x88,0xd9,0x95,0x29,0xfc,0x17,0x1f,0xa8,0x20,0x4d,0xaf,0xb1,0x77,0xe3,0xa1,0x0c, 0xfc,0x74,0x1f,0x43,0xc0,0x1b,0x2b,0x70,0x4d,0x62,0x67,0x0c,0xc7,0xb3,0x02,0x4a, 0x40,0x0b,0x32,0xe0,0x06,0x14,0x30,0x01,0x1c,0x90,0x76,0xe9,0xc6,0x76,0xca,0x30, 0x04,0x72,0xd5,0x12,0x52,0x41,0x01,0x14,0x30,0x06,0xc9,0x30,0x06,0x56,0x00,0x09, 0x87,0x70,0x89,0xb7,0xd2,0x47,0x5d,0x51,0xfe,0x72,0x07,0x90,0x2e,0x29,0x40,0x08, 0x62,0xa0,0x52,0x67,0x23,0x0d,0x36,0x27,0x0d,0xb6,0x26,0x17,0x8e,0x10,0x7b,0x5c, 0xb0,0x8a,0x57,0x30,0x03,0xc5,0x70,0x05,0x29,0x29,0x11,0x71,0x01,0x0c,0x38,0x78, 0x06,0x34,0x56,0x8b,0x6d,0xc0,0x6b,0xd2,0xa0,0x63,0xba,0x28,0x06,0x61,0xb1,0x0b, 0xd3,0xd0,0x09,0xa6,0x00,0x04,0xbd,0xa6,0x06,0x7a,0x40,0x04,0x61,0x10,0x06,0x6c, 0x30,0x0d,0xb2,0x70,0x08,0x58,0x70,0x00,0xc0,0xf0,0x08,0x83,0xf0,0x0a,0xb1,0xe0, 0x07,0x6c,0x10,0x05,0x72,0x13,0x06,0xec,0x00,0x02,0xba,0xf0,0x4b,0x5c,0xa2,0x4c, 0x67,0x67,0x5d,0x68,0x75,0x01,0xa2,0x20,0x0a,0xdc,0xf1,0x95,0xfd,0x51,0x2a,0x0c, 0x48,0x8e,0x62,0x82,0x55,0x3d,0x04,0x5f,0x2b,0xc1,0x2f,0xa8,0xc0,0x03,0x54,0xa4, 0x0e,0xc5,0xb3,0x88,0x8c,0x78,0x02,0x4f,0x90,0x0c,0x18,0x30,0x00,0x8d,0xf0,0x03, 0xd5,0x90,0x3c,0x20,0x40,0x0b,0x28,0x20,0x03,0xe5,0x90,0x0d,0xf2,0x10,0x30,0x66, 0x89,0x5e,0x04,0x53,0x45,0xa4,0x23,0x69,0xba,0x00,0x02,0x14,0x50,0x97,0x39,0x30, 0x06,0x63,0xf0,0x08,0x87,0xd0,0x05,0xa3,0xd1,0x47,0xb9,0xe0,0x02,0x0a,0xc5,0x19, 0x16,0x89,0x0e,0x5d,0xa0,0x0d,0xaf,0x80,0x62,0x2d,0x66,0x48,0xc0,0x02,0x17,0x92, 0xf1,0x0a,0xbb,0xb0,0x8a,0x71,0x31,0x0e,0x08,0xa0,0x9a,0xe3,0x90,0x9a,0xc5,0x10, 0x17,0xb1,0x00,0x04,0x67,0x70,0x06,0x90,0x80,0x06,0x81,0xe0,0x7b,0x5f,0xb0,0x09, 0xc2,0x76,0x0d,0xda,0x20,0x06,0xaf,0xfe,0x30,0x27,0x5d,0x80,0x06,0x37,0x30,0x0b, 0x9a,0x80,0x07,0x6f,0xa0,0x06,0x89,0x10,0x06,0x32,0x00,0x0a,0x45,0x50,0x06,0x52, 0xd0,0x0a,0xc1,0xd0,0x07,0x36,0xf0,0x08,0xc5,0x70,0x0d,0x8f,0x20,0x05,0x7e,0x40, 0x05,0x50,0xd9,0x03,0x5b,0xf6,0x32,0xe5,0xa6,0x67,0xda,0x44,0x7f,0x7f,0x22,0x02, 0x21,0x63,0x00,0x05,0x06,0x0f,0xf7,0xa0,0x14,0x11,0xe7,0x80,0x51,0xf5,0x39,0xa0, 0x23,0x1f,0xab,0x50,0x4e,0xde,0x13,0x43,0xf8,0xe1,0x29,0xf7,0xb7,0x02,0x23,0x30, 0x4d,0x1e,0xb0,0x01,0xd6,0x90,0x03,0x31,0xa0,0x05,0x4d,0x58,0x04,0xec,0x90,0x79, 0x1f,0xe0,0x06,0x44,0x80,0x08,0xb4,0x80,0x01,0x19,0x30,0x0a,0x72,0xa7,0x0c,0xea, 0x10,0x30,0xb5,0x31,0x1f,0x02,0x60,0x0c,0x8e,0xb2,0x01,0x03,0x90,0x03,0x17,0xfa, 0x01,0x18,0x90,0x03,0xcf,0x40,0x4b,0x4d,0xc6,0x47,0x3e,0x12,0x7a,0x2e,0xa0,0x2e, 0xb6,0x60,0x09,0xd7,0xe0,0x7a,0xb3,0xd6,0x0b,0x7f,0xf0,0x21,0x87,0x04,0x17,0xaf, 0xf0,0x0a,0x7f,0xb0,0x0b,0x08,0x30,0x03,0x08,0x50,0x0c,0xa9,0x69,0x02,0x58,0x90, 0x9a,0x57,0x60,0x02,0xe3,0x30,0x03,0xbe,0xa0,0x06,0x2f,0x19,0x08,0xbf,0x07,0x7c, 0x5f,0x50,0x08,0x22,0x49,0x6a,0x62,0x10,0x09,0x29,0x30,0x1a,0x80,0x90,0x09,0x9f, 0x20,0x05,0x51,0xa0,0x08,0x51,0x10,0x07,0x18,0xe1,0x06,0x56,0x80,0x0d,0x6c,0x00, 0x06,0x45,0x72,0x0a,0x46,0x40,0x0a,0xb2,0xb0,0x08,0x99,0xd0,0x03,0x43,0x99,0x08, 0x8b,0xb0,0x03,0x3f,0xa0,0x0b,0xfe,0x04,0x20,0x43,0x0e,0xc0,0x0b,0x6e,0x77,0x5e, 0x6a,0xf7,0x78,0xfd,0x61,0x14,0x47,0x31,0x05,0x6b,0xb4,0x3b,0xd8,0x33,0x96,0x53, 0xd4,0x43,0x3f,0x84,0x0a,0x70,0x75,0x4e,0xe6,0x56,0x12,0xd4,0x30,0x01,0x3a,0xa1, 0x00,0x1e,0xf0,0x1b,0x91,0x98,0x03,0xe0,0x10,0x0d,0xb8,0x20,0x4a,0x7a,0x30,0x0d, 0x87,0x77,0x07,0xdb,0xb0,0x27,0x39,0xd0,0x08,0x1b,0x10,0x01,0x7a,0xe5,0x9e,0xd1, 0xa3,0x55,0xbc,0xb1,0x12,0x87,0x45,0x01,0x08,0xb7,0x03,0xcc,0xd0,0x26,0x39,0x00, 0x0c,0xd0,0x70,0x0e,0x24,0xc0,0x47,0x52,0x73,0x99,0xed,0xc3,0x47,0x24,0x20,0x0e, 0x75,0xd0,0x9b,0x92,0xe1,0x62,0x79,0x70,0x8a,0xc2,0x12,0x22,0x2b,0x39,0x03,0x5c, 0x50,0x0c,0x08,0x60,0x02,0xbb,0x8a,0x05,0xc1,0x70,0xa3,0xbb,0x6a,0x02,0x33,0xa0, 0x06,0xb4,0x08,0x09,0xc0,0x37,0xa4,0x3f,0x67,0x17,0xd7,0xf0,0x07,0x96,0xa0,0x0d, 0xe7,0xc0,0x47,0x87,0xc0,0x06,0x52,0x90,0x0a,0x65,0xd0,0x03,0x4b,0x60,0x05,0xd3, 0x30,0x07,0x05,0x30,0x0d,0xd3,0xe0,0x06,0x40,0x60,0x04,0x45,0x42,0x08,0xad,0x30, 0x03,0x6c,0x30,0x07,0x97,0x10,0x07,0x8b,0xb0,0x06,0xb8,0x20,0x0c,0x14,0xf0,0x32, 0x42,0x24,0x1f,0x98,0x12,0x30,0x38,0xd3,0x3b,0xf5,0xe4,0x1f,0x47,0x41,0xa7,0xf0, 0xa0,0x14,0xe4,0x79,0x28,0xde,0x45,0x0d,0x05,0x19,0x43,0x72,0x25,0x43,0xe6,0xb5, 0x07,0x2c,0x30,0x89,0x80,0x60,0x05,0xe0,0xd0,0x08,0x4a,0x30,0x00,0x77,0x10,0x03, 0x55,0xa0,0x05,0x61,0x90,0xfe,0x09,0x9d,0x80,0x02,0x44,0xe0,0x06,0x55,0xb0,0x03, 0x39,0xf0,0x01,0x91,0xd8,0x08,0x0a,0xa0,0x0b,0x2b,0x30,0x04,0x3e,0xd4,0x5e,0x7c, 0x16,0x01,0x69,0x22,0x47,0x4a,0xa0,0x3a,0x09,0xc7,0x0e,0x3b,0x70,0xb1,0xe5,0xf0, 0x58,0x50,0xc2,0x47,0xb7,0x62,0x01,0x7c,0x53,0xaa,0x07,0xd0,0xaa,0x08,0x70,0x0d, 0xb2,0x6a,0x48,0x2a,0xfa,0xa2,0x2a,0x0a,0x17,0x24,0x79,0x05,0x35,0x6a,0x02,0xb9, 0x6a,0x02,0xc1,0x80,0x05,0x43,0x1b,0x0c,0xbe,0xea,0xab,0xe3,0x30,0xac,0x81,0x10, 0xa4,0xbd,0x76,0xac,0x60,0x40,0x09,0xbd,0x00,0x0b,0x26,0x2a,0x06,0x83,0x20,0x75, 0xde,0x30,0x08,0x6c,0xe0,0x03,0x6e,0x20,0x03,0x52,0x80,0x0b,0x10,0x0b,0x0e,0xb4, 0xa0,0x07,0x35,0x00,0x0a,0x5e,0xf0,0x07,0x86,0x60,0x09,0x83,0x44,0x03,0x56,0x20, 0x05,0x8c,0x2a,0x07,0x61,0xba,0x03,0x20,0xd0,0x1a,0x02,0x50,0x29,0xdf,0xc5,0x0b, 0xe8,0xe7,0xa6,0xd7,0x23,0x2a,0x01,0xb2,0xb7,0x3d,0xb3,0x3d,0xe5,0xa1,0x0e,0xa3, 0xb0,0x32,0xf2,0x80,0x1e,0xe9,0x91,0x39,0x1c,0xd0,0x00,0xcc,0x10,0x05,0x8f,0x60, 0x2f,0x73,0xf0,0x01,0x1f,0x50,0x05,0x73,0x00,0x0a,0x88,0x80,0x02,0x28,0xe0,0x06, 0xb4,0x40,0x0b,0x05,0x70,0x07,0xe2,0xa7,0x0b,0xbf,0xa1,0x00,0x4a,0x20,0x76,0xe3, 0xb6,0x6f,0xb2,0x51,0x3c,0x12,0x10,0x13,0x1d,0x0b,0x56,0x81,0x06,0x0e,0x77,0x50, 0x03,0xec,0xd0,0xba,0xd1,0xa0,0x1c,0xd0,0xe0,0x41,0x96,0xa9,0x89,0x50,0x83,0x0c, 0x76,0x60,0x0b,0x42,0xfe,0x40,0xa3,0xaf,0x10,0x2c,0x24,0xe2,0x35,0xaf,0xe0,0x08, 0x92,0xc1,0x8a,0x08,0x30,0x0e,0xc5,0x00,0xb4,0xbc,0x5a,0x07,0xc9,0x8b,0x05,0xcb, 0x4b,0xb4,0xbe,0x2a,0x5b,0x67,0x80,0x06,0xbc,0x66,0x63,0x94,0x00,0x06,0xd5,0xdb, 0x0b,0x1f,0x52,0x5b,0xa4,0xa0,0x21,0xd0,0xd1,0x0a,0xa6,0xa0,0x05,0x31,0xb0,0x0d, 0x65,0xd0,0x04,0x42,0xf9,0xb0,0x56,0xf0,0x03,0x56,0x00,0x08,0x8c,0xf0,0x08,0x3f, 0x68,0x04,0x5e,0x10,0x8b,0x97,0x10,0x06,0xb8,0xd0,0x04,0x44,0x50,0x68,0x19,0x20, 0x0f,0xa3,0x60,0x13,0x7e,0xb7,0x39,0x65,0x68,0x00,0x46,0x21,0x2a,0xe8,0x29,0xa7, 0x62,0x39,0x34,0xfc,0x44,0x20,0x23,0x8b,0x26,0x2d,0x91,0x01,0x42,0x34,0x01,0xb7, 0x10,0x0d,0xd3,0x00,0x0a,0x1f,0x70,0x4d,0x20,0xd0,0x08,0x35,0x50,0xa0,0x6e,0x50, 0x00,0x19,0x9b,0x79,0x77,0xe9,0x01,0x2f,0x34,0x02,0x9d,0xdb,0xb1,0x4c,0x15,0x80, 0x2a,0x31,0x81,0x06,0x19,0x15,0x1e,0xe0,0x88,0x03,0xb0,0x03,0x77,0xc0,0xb0,0x83, 0xc6,0x0e,0x99,0x30,0x08,0xb9,0x62,0xaa,0x8f,0xa1,0x89,0xd0,0x00,0x0d,0x4c,0x90, 0xbb,0x3a,0x26,0x92,0x92,0x11,0xbc,0xaf,0x60,0x92,0x8f,0x83,0x9a,0x08,0x70,0x05, 0x36,0x7a,0xb4,0x75,0x30,0xc4,0x91,0x50,0x07,0xcb,0xdb,0xab,0xe3,0x30,0x9b,0x81, 0x80,0x06,0x9b,0x30,0xa4,0xc0,0x47,0xbd,0x85,0xd0,0x62,0xb0,0xf7,0x0a,0x62,0xa0, 0x1c,0x5d,0x30,0x3f,0xbf,0xc0,0x08,0xdb,0x90,0x03,0x35,0x80,0x02,0x3d,0x50,0x0a, 0xa5,0x80,0x02,0xfe,0x7a,0xb0,0x08,0xe5,0xb0,0x06,0x7e,0x80,0x0b,0x6d,0x40,0x0a, 0x60,0x40,0x03,0x67,0x80,0x07,0xdf,0x56,0x0a,0xe3,0xcb,0x0c,0x8d,0xe0,0x01,0xfd, 0x85,0x1f,0xcb,0x54,0x32,0x84,0xf8,0xa6,0xa2,0xa0,0x01,0x0c,0x20,0xa7,0xff,0x21, 0x45,0x86,0xb9,0x0a,0x84,0x75,0x0c,0x31,0x01,0x1b,0x11,0xd0,0xb9,0xcd,0xb0,0x01, 0x3b,0x80,0x08,0xe0,0x00,0x02,0x01,0xd8,0x01,0x45,0x64,0x78,0x39,0xf0,0x03,0x90, 0x02,0x3e,0x27,0xb0,0x01,0x1b,0xcc,0x54,0x86,0xe5,0x01,0x84,0x1a,0x13,0x02,0xa8, 0x0b,0x11,0x30,0x81,0x2b,0x73,0x0c,0x91,0x0c,0x02,0x4f,0x20,0x1c,0x35,0xd0,0x0d, 0x55,0x50,0x05,0x31,0x90,0x03,0xcc,0x30,0x0b,0x5d,0x70,0x16,0x25,0x37,0x35,0x07, 0xe0,0x2a,0x47,0x40,0xc4,0xa8,0xf7,0xa2,0xc1,0x5b,0x48,0xaf,0xb0,0x8a,0xa6,0x09, 0x0b,0x26,0xf9,0xb3,0x35,0x7a,0xb4,0xbe,0x7a,0xc4,0xca,0x5b,0x07,0x46,0x1c,0x09, 0xce,0xcb,0xc4,0xc0,0xe7,0x05,0x4e,0xdc,0x06,0x94,0x40,0xbd,0x60,0x90,0x82,0x2e, 0x08,0x0b,0xda,0xcb,0x0a,0xe7,0x90,0x3e,0x10,0x11,0x0d,0x76,0xe9,0x06,0x9a,0x50, 0x04,0x4d,0x50,0x06,0xa6,0x10,0x0d,0x61,0xd0,0x03,0x7a,0xb0,0x06,0x79,0x20,0x0b, 0x5e,0x40,0x03,0x9c,0xe0,0x07,0x9f,0x90,0x09,0x4d,0x10,0x07,0x5a,0x40,0x01,0x0a, 0x70,0x0c,0x98,0x23,0x4c,0x3e,0x14,0x66,0x00,0x46,0x4f,0x85,0x32,0x05,0x7e,0xcc, 0x00,0x05,0xd6,0x1f,0x93,0xe0,0x0c,0xdc,0xf3,0x6f,0x43,0x60,0x20,0xd9,0x28,0x00, 0xc2,0x23,0xfe,0x00,0x85,0x0c,0x02,0x1f,0xb0,0x1a,0xbf,0x04,0x15,0xed,0xd1,0x01, 0x1e,0xb0,0x0c,0xf2,0xd0,0x00,0x0d,0x10,0x01,0x04,0x00,0x80,0x00,0x78,0x0c,0x00, 0xb8,0x01,0xd9,0x10,0x56,0x22,0xbd,0x01,0x1b,0x70,0x0b,0x1e,0x20,0x57,0x0d,0xd0, 0x12,0x94,0xb6,0x3a,0x70,0x50,0x05,0x05,0x40,0x0b,0xac,0x3c,0x1c,0x7a,0x00,0x0d, 0x3e,0x36,0x7a,0x23,0x28,0x0e,0x47,0xf0,0x0b,0x47,0x10,0x0c,0x96,0x40,0x06,0x3b, 0xec,0xa2,0x2f,0x5a,0x5b,0x24,0x79,0x9a,0x41,0xac,0xab,0x26,0xa0,0xab,0x47,0x8b, 0x05,0xc9,0x9b,0xbc,0x42,0x90,0xcc,0x75,0xe0,0xd4,0x64,0x00,0xa4,0x35,0x86,0x9b, 0xb7,0x49,0x09,0x85,0x20,0xcd,0x79,0x81,0x6a,0x26,0xa0,0x0d,0xbf,0x80,0x0c,0xf0, 0x32,0x3f,0x5d,0x6a,0x05,0xdd,0x40,0x01,0xdd,0x30,0x0b,0x8b,0xb0,0x08,0xb3,0xa0, 0x07,0x73,0x50,0x06,0x8b,0x90,0x08,0x68,0xf0,0x0c,0x68,0x70,0x65,0x7e,0xd0,0x03, 0x8b,0x50,0x0a,0x10,0xdb,0x85,0x2b,0x90,0xa6,0x96,0xc2,0x03,0x6c,0x8a,0x5e,0x37, 0x04,0x03,0x05,0x06,0x20,0xa4,0x12,0x71,0xeb,0xd5,0x5e,0x41,0x94,0x3c,0x1d,0x30, 0x01,0xe6,0x45,0xc0,0xf1,0x31,0x0a,0x5b,0x85,0x32,0x5d,0x65,0x0c,0x2c,0xe1,0x4e, 0x4f,0x11,0x01,0xc6,0xd0,0x13,0x1c,0x9d,0x01,0xed,0x91,0x71,0x3f,0x20,0xc1,0x8d, 0x40,0x01,0xa7,0xdc,0x60,0xbf,0xd4,0x13,0x86,0xb5,0x98,0x1f,0x10,0x03,0x0d,0x0b, 0x0e,0x9a,0xcb,0xb0,0x1f,0xc0,0x08,0x4c,0x30,0x1a,0x16,0xf9,0x0b,0x60,0x70,0x06, 0x34,0xfe,0x70,0x0d,0x5c,0x70,0x05,0xd7,0xb0,0xb3,0xc0,0xeb,0xa2,0xd7,0x30,0xb5, 0xb8,0x9d,0x92,0xc4,0x7b,0x05,0xba,0x8a,0x00,0xbe,0xda,0xab,0x4d,0x3d,0x2f,0x42, 0x10,0x09,0xcb,0x2d,0x04,0xc0,0x36,0x9b,0xb5,0xd8,0x6b,0x6d,0x00,0x09,0xb2,0x99, 0x05,0x6c,0xe0,0x0a,0x46,0x36,0x0b,0xb8,0xc0,0x09,0xa1,0xb0,0x9b,0x91,0x50,0x15, 0xd0,0x71,0x0a,0x11,0x86,0x06,0x99,0xa0,0xa1,0x65,0xa0,0x0a,0x54,0xc0,0x9c,0x6e, 0x20,0xcf,0x6b,0x60,0x08,0xa1,0x10,0x0a,0x8e,0x50,0x09,0x89,0x80,0x0b,0xe7,0x7a, 0x03,0x88,0x70,0x57,0x6c,0xe6,0x00,0x3c,0xa0,0x39,0x36,0x13,0x67,0xe6,0xe0,0x0c, 0x84,0x42,0x9e,0x90,0x77,0x28,0xb9,0x41,0x70,0x91,0x9c,0x01,0xa8,0x20,0xb0,0x6d, 0xfa,0x86,0xb9,0xb1,0x45,0x93,0x3d,0x76,0xb0,0x21,0x57,0xc6,0x80,0xd9,0xe0,0xe3, 0x01,0x1d,0xa0,0x00,0xb7,0x40,0x01,0xa0,0x6d,0xa1,0x18,0x9b,0x03,0x77,0xf9,0x03, 0x23,0x0b,0x50,0x0a,0x60,0x44,0x29,0x5c,0x03,0x2e,0x1d,0x03,0xe0,0xc0,0x0d,0x31, 0x30,0x06,0xa1,0xc0,0x04,0x42,0x25,0x04,0x66,0xe0,0x07,0xdc,0x30,0x07,0x54,0xc0, 0x08,0x46,0xc0,0x05,0x2f,0x8a,0x73,0xbf,0x1b,0xd4,0xbe,0x4c,0x92,0xc2,0x5d,0x0c, 0x3b,0x8a,0xd4,0xc7,0xac,0xdc,0x50,0x5d,0x07,0x1e,0xa7,0xdc,0x4e,0x2d,0x06,0x34, 0x16,0xbd,0x6d,0xf0,0x06,0x51,0x20,0x05,0xd1,0xd0,0x0d,0x3f,0x70,0x0c,0x84,0xab, 0x60,0x2b,0x50,0x0e,0x8b,0x80,0x07,0x7f,0x80,0x05,0x3a,0x00,0x4b,0x16,0x80,0x0c, 0xfe,0xbd,0x02,0x0d,0x57,0xe0,0x0a,0xb4,0x70,0x07,0x99,0xb0,0x08,0x9d,0x60,0x05, 0x73,0x80,0x02,0x52,0x20,0x07,0x5e,0xe0,0x05,0x59,0xd0,0x0b,0xcf,0x20,0x23,0x54, 0xf0,0x09,0xa9,0x70,0x03,0x94,0x9c,0xc0,0x74,0x7b,0xc7,0x3d,0x94,0xc7,0xdb,0xb5, 0x00,0xeb,0x36,0x09,0x37,0x84,0x33,0xdf,0x60,0xd0,0xfa,0xdd,0x55,0x52,0xa1,0x04, 0xf2,0xd0,0xd7,0x85,0x89,0x76,0xe4,0xf0,0x77,0xd4,0x20,0x0f,0x97,0xed,0xe0,0x0d, 0x80,0x0a,0xd0,0xd4,0x00,0x98,0x7d,0x58,0xd7,0xa4,0x04,0xb7,0x70,0x70,0xaf,0x1c, 0x03,0x2d,0x10,0x03,0x77,0xc0,0x0e,0xb4,0x93,0x1e,0xd4,0x84,0x79,0xcc,0x90,0xb2, 0x70,0x50,0x03,0x27,0x5e,0x80,0x70,0xf0,0x0a,0xbf,0x40,0x07,0x80,0x90,0x08,0x52, 0xc0,0x0e,0x4a,0x70,0xcf,0x20,0x60,0x05,0x9b,0x90,0xa2,0x79,0x10,0x83,0x2e,0x6a, 0xbc,0x70,0x11,0x17,0xb8,0xca,0x9a,0x3f,0x0e,0xac,0xc1,0x60,0xc4,0x47,0x2c,0x04, 0xca,0x9d,0x06,0x47,0x70,0x04,0xc9,0xee,0xaa,0xb5,0x08,0x09,0x6f,0x60,0x0a,0x99, 0x00,0x02,0xea,0xf0,0x11,0x68,0xb5,0x46,0x25,0x40,0x00,0x39,0x90,0x0a,0x4f,0xfa, 0x08,0xda,0x40,0x08,0x4c,0xd0,0x2e,0x84,0xf0,0x0b,0x75,0x70,0x00,0x69,0xf0,0x0c, 0x45,0xe0,0x06,0xe2,0xeb,0x03,0x45,0x50,0x05,0xd3,0x40,0x05,0x40,0x40,0x06,0x94, 0xd0,0x06,0xb0,0xa0,0x08,0xb8,0x50,0x0a,0x54,0x10,0x06,0x37,0xe0,0xc8,0x62,0xa7, 0x6f,0xf8,0x2b,0x1f,0xb5,0x61,0x32,0xfa,0xf0,0x5f,0x60,0x42,0x55,0x6e,0x67,0xfe, 0x55,0xfa,0x3d,0x0a,0x11,0xf0,0x55,0x0d,0xb3,0x02,0x6a,0x6a,0x46,0x53,0x64,0x66, 0x83,0x5c,0x3c,0x72,0x15,0x01,0x97,0xdd,0x00,0xf2,0x88,0x1e,0x1c,0x0d,0x56,0x9e, 0x7d,0x0b,0x0e,0xd3,0xb0,0x05,0xe0,0x06,0x5a,0x30,0x07,0x7f,0x58,0x95,0xfd,0xd5, 0x1b,0xc9,0x53,0x57,0x83,0xb6,0xea,0x31,0x50,0x0e,0x55,0x90,0x03,0x73,0xe0,0x07, 0x9a,0xa0,0x09,0x61,0x00,0x0a,0x63,0x60,0x95,0xf8,0x30,0x09,0x92,0xc0,0x02,0xb4, 0xc0,0x06,0xa8,0x16,0x17,0xbd,0x1d,0x17,0x12,0x81,0x92,0xac,0x79,0xd4,0x58,0x50, 0xdc,0x4b,0x1d,0x09,0x47,0xbe,0xf4,0xcb,0xce,0xec,0xcb,0x9d,0xe4,0x40,0x80,0x0b, 0xa0,0x60,0xa6,0xba,0xb0,0x07,0xa1,0x02,0x32,0x00,0xb2,0x00,0xc7,0x00,0xe9,0x1b, 0x50,0x03,0x65,0xb0,0x04,0x79,0x10,0x9d,0x16,0xc0,0x0a,0x87,0x30,0x0e,0x96,0x99, 0xbb,0x8f,0x50,0x04,0xce,0x56,0x04,0xd1,0x30,0x07,0x61,0xa0,0x07,0xb9,0x18,0x0a, 0x29,0xa2,0x07,0x97,0x40,0x05,0x47,0x06,0x0a,0x59,0x02,0x01,0x84,0xfb,0x2f,0xee, 0x25,0x4e,0xa2,0xd3,0x43,0xff,0x55,0x46,0xa0,0xb3,0x56,0xea,0x20,0x1f,0xfd,0xea, 0x1b,0x0a,0x40,0x01,0xd8,0x44,0x56,0x0e,0x47,0xe8,0x82,0xac,0x1b,0xbc,0x21,0xca, 0x12,0x30,0xd9,0x32,0xc4,0x1b,0x13,0x9a,0x8f,0xa9,0x93,0x90,0x1f,0xc0,0x0e,0xb4, 0x30,0x07,0x44,0x20,0x03,0x7e,0x29,0x03,0x32,0xa0,0x0b,0x6b,0x59,0x3a,0x27,0xa0, 0x04,0x4f,0xf0,0x01,0xaf,0xbc,0xea,0x77,0x30,0x1c,0x35,0x60,0x78,0x55,0xfe,0x70, 0x70,0xee,0xe1,0x00,0x25,0xe0,0x1d,0xdf,0xa4,0x04,0x56,0x10,0x0a,0x50,0x70,0xe3, 0xc5,0x00,0x0b,0xc1,0x0c,0x0b,0xe3,0x80,0xdb,0xc4,0x8b,0x92,0x43,0x3b,0xb4,0x42, 0x9e,0xec,0xad,0xb0,0xec,0xc9,0xd5,0xec,0xcd,0xed,0x0a,0xc2,0xa0,0x0b,0x73,0x55, 0xa1,0x10,0x50,0x02,0x0c,0xd0,0x33,0x53,0x10,0x00,0x0f,0xc0,0x03,0x2b,0xe3,0x00, 0xf2,0xb0,0x01,0xc9,0x20,0x0c,0xb8,0x40,0x03,0xb3,0x24,0x6d,0x07,0xd0,0x07,0x2e, 0xf0,0x02,0x4c,0x90,0x06,0x62,0xc0,0x08,0x45,0x50,0x04,0xb8,0xb0,0x0d,0xa9,0xa0, 0x0a,0x68,0x70,0x08,0x53,0xd6,0x0b,0x80,0x50,0x04,0x5e,0x9b,0x09,0xa9,0x90,0x03, 0x2f,0x03,0x4c,0xb1,0x01,0x10,0xd4,0xc2,0x85,0xa3,0xc6,0x6b,0xd5,0x2a,0x5e,0xe4, 0xf6,0xec,0x21,0xb7,0x8a,0x07,0x35,0x0e,0x0e,0xa8,0x51,0x1b,0x25,0x6f,0x45,0x07, 0x0a,0x03,0x3a,0x4c,0x18,0xa2,0x6e,0xd5,0x82,0x12,0xce,0x9c,0x99,0x5b,0x45,0x71, 0xc8,0x10,0x01,0x11,0x22,0x48,0x88,0x00,0x81,0x00,0x4b,0x09,0x0d,0x20,0x84,0xf0, 0xf0,0x63,0x40,0xbc,0x1c,0x3b,0x0a,0x20,0x02,0x05,0x0a,0x45,0x2a,0x1f,0x99,0x52, 0xc9,0x18,0x11,0xc1,0x01,0x07,0x01,0x19,0x3c,0x78,0xe8,0xf0,0x23,0xd9,0x87,0x1a, 0x55,0xee,0xdc,0xc9,0x81,0x21,0xc7,0x06,0x0f,0x0a,0x1a,0x81,0x50,0xd2,0xac,0x81, 0xba,0x05,0xce,0x26,0xdd,0xd3,0xc0,0xa2,0xcc,0x23,0x23,0x50,0x5e,0xcd,0x70,0xf4, 0x0a,0xd6,0xb8,0x2b,0x57,0x10,0x8c,0x1b,0x57,0xcc,0x44,0xb0,0x60,0xfe,0x58,0xea, 0xd4,0x89,0x74,0xa4,0x6f,0xab,0x23,0x69,0x74,0xe8,0x48,0xc3,0xb7,0x8e,0x82,0x08, 0x43,0xf6,0x34,0x58,0xd1,0x68,0x40,0x06,0x49,0x17,0x34,0x04,0x08,0xb0,0x25,0xc0, 0x85,0x05,0xc4,0x60,0x70,0x58,0xf6,0x83,0xd6,0x22,0x30,0x3a,0x48,0x90,0xd0,0x61, 0x4b,0xc8,0x0b,0x17,0x07,0x6c,0xf4,0x99,0x01,0xc4,0x94,0x15,0x50,0x61,0xf4,0xb4, 0x3a,0xb4,0x29,0xcf,0x1f,0x57,0x4d,0x7a,0x34,0x09,0x53,0xee,0x89,0x07,0x08,0x12, 0xe4,0xb1,0x18,0x85,0x8a,0x03,0x87,0x89,0xe1,0x78,0xa8,0xe3,0xc5,0x83,0x87,0x41, 0x1e,0x0e,0x04,0xb0,0x18,0xce,0x32,0xc3,0x06,0x0a,0x14,0x4e,0xac,0x68,0x30,0x04, 0xe2,0x2a,0x65,0xbc,0x08,0x8e,0x12,0x20,0x4f,0xc2,0x04,0x08,0x13,0x8c,0x4d,0x38, 0x46,0xc0,0x18,0x81,0xf6,0x35,0x73,0x74,0x2b,0x37,0xc7,0x8d,0x16,0x19,0xf9,0x65, 0x64,0xb2,0xc2,0xa8,0x87,0xaa,0x39,0x22,0x10,0x20,0x22,0x09,0x9a,0xd9,0xa0,0x03, 0x05,0xac,0x19,0x20,0x87,0x1a,0xee,0xa8,0xa2,0x06,0xab,0x06,0x98,0x60,0x99,0x63, 0x32,0x68,0x84,0x82,0x1f,0x36,0xc8,0x60,0x14,0x5e,0xcc,0x31,0x80,0x01,0x06,0x94, 0x29,0xc7,0x94,0x24,0x1c,0x99,0xe1,0x95,0x6b,0x60,0xe1,0xe2,0x0a,0xb8,0x4c,0xb8, 0xcb,0x84,0x3a,0xf2,0xc2,0x42,0xaf,0x23,0x8e,0x00,0x2c,0xb0,0x34,0x00,0x6b,0x45, 0x88,0x3a,0xee,0x01,0x91,0x01,0x49,0xc2,0x1b,0x05,0x82,0x15,0x78,0x90,0x44,0x83, 0x07,0x54,0x08,0xe0,0x01,0x10,0x4b,0x90,0x64,0x81,0x15,0x3e,0xfe,0xc8,0xa1,0x13, 0x40,0x06,0x41,0x27,0x97,0x03,0xd2,0xb0,0xe5,0x05,0x3b,0x6c,0xb0,0x41,0x87,0x48, 0x8c,0x68,0x83,0x8a,0x30,0x54,0x79,0x06,0x13,0x6d,0x42,0xa1,0x21,0x14,0x4d,0x70, 0x49,0xc4,0x94,0x69,0x06,0xd8,0xe0,0x18,0x63,0x24,0x90,0x40,0x80,0x21,0x46,0x29, 0x6e,0x22,0x0e,0xd4,0x51,0xe7,0xb8,0xe3,0xa8,0x29,0x0f,0x82,0x0a,0x33,0x50,0x0a, 0x84,0x8c,0x40,0xd8,0x60,0x82,0xe1,0x28,0xc2,0x73,0x08,0x16,0x58,0x60,0x2f,0x83, 0x15,0x8e,0x81,0x60,0x04,0x5d,0x4e,0xd0,0x85,0x29,0x10,0xc6,0x28,0x27,0x9a,0x4c, 0xca,0x5c,0xc4,0x0a,0x3d,0xe2,0x60,0xe4,0x11,0x2f,0xa4,0xd9,0xc4,0x15,0x55,0x7c, 0x48,0x86,0x85,0x89,0x86,0x90,0x67,0x99,0x0c,0x74,0xe9,0x00,0x84,0x01,0x76,0x88, 0x2a,0x86,0x1c,0x06,0x18,0xc0,0x03,0xef,0x92,0xda,0xe0,0x84,0x13,0xb0,0x3a,0x26, 0x82,0x51,0x78,0x80,0x01,0x49,0x11,0x3c,0x28,0x02,0x0d,0x28,0xfe,0xf8,0xc3,0x11, 0x2e,0xea,0xa2,0x0b,0x2f,0xbd,0x66,0x8c,0x84,0xc7,0x1a,0xc5,0x49,0xe3,0x08,0xc2, 0xd2,0x10,0x97,0xc7,0x07,0x1e,0xd0,0x60,0x0a,0x74,0x35,0xd0,0x80,0x9e,0x3d,0x16, 0x30,0x00,0xc9,0x00,0xa6,0x08,0xc0,0x09,0x62,0x26,0x48,0x56,0x82,0x0e,0x36,0x78, 0x62,0x1b,0x57,0xc4,0xc9,0x45,0x10,0x26,0xfa,0xb0,0xc1,0x05,0x41,0xd2,0x18,0x07, 0x01,0x04,0x64,0x79,0xc4,0x0a,0x29,0x5c,0x21,0x64,0x10,0x30,0xcc,0x78,0xc5,0x14, 0x36,0x60,0x69,0xc5,0x95,0x6e,0x94,0x58,0x01,0x02,0x95,0xfe,0x84,0x93,0x47,0x00, 0xe1,0x8a,0x1b,0xc5,0x01,0xe3,0x38,0x40,0x45,0x56,0x63,0x28,0xf5,0x60,0x85,0x10, 0x9e,0x18,0x20,0x99,0x01,0x30,0x50,0x22,0x03,0x96,0x54,0x82,0xc0,0x98,0x96,0x08, 0x30,0xd4,0x56,0x0f,0xac,0x19,0x03,0x9c,0x6d,0x84,0xc9,0x2f,0x93,0x38,0xca,0x94, 0x23,0x0e,0x61,0x5c,0x39,0x85,0x10,0x32,0x30,0xf1,0xe6,0x15,0x36,0xc2,0x90,0x61, 0x1b,0x38,0x36,0x90,0x27,0x56,0x16,0x96,0xd1,0xc5,0x56,0x6b,0x3e,0xd8,0x41,0xd7, 0x1d,0x30,0x18,0xe0,0x87,0x06,0x38,0x58,0x65,0x88,0x08,0x56,0x58,0x61,0x6b,0x0f, 0x74,0xa1,0x59,0x02,0x6a,0xcc,0x11,0xe1,0x9e,0x29,0xc8,0x89,0xc7,0x15,0x30,0xfe, 0xc8,0x63,0x06,0xb9,0x58,0x74,0x71,0xc6,0xbd,0xf8,0x12,0x22,0xb0,0x3e,0x04,0x13, 0x87,0x30,0xc2,0x78,0x0c,0x80,0x01,0x78,0xa6,0x28,0x17,0x5d,0x06,0xd0,0x95,0x1c, 0x72,0x0d,0x1c,0x38,0x46,0x80,0x3d,0x4a,0x80,0x61,0x01,0x07,0x36,0x28,0x03,0x10, 0x1d,0x0e,0x10,0xc7,0x86,0x3a,0x0e,0xf8,0x17,0x01,0x2c,0x84,0xd0,0x41,0x96,0x23, 0xc0,0x60,0xa4,0x98,0x43,0x7e,0xa9,0x05,0x18,0x21,0xb0,0xb0,0x25,0x17,0x60,0xa6, 0x69,0x24,0x04,0x02,0xd0,0xb3,0x53,0xa5,0x63,0x8e,0x7d,0x74,0x08,0x07,0xf2,0x94, 0x74,0x02,0x02,0x32,0xed,0x40,0x09,0x5c,0x31,0xd8,0x81,0x9d,0x1f,0xda,0xd6,0x25, 0x84,0x15,0x8a,0x3d,0x41,0x01,0xe6,0x41,0x68,0x84,0x1d,0x50,0x3a,0x29,0xe3,0x7b, 0x2a,0x54,0xb9,0xc1,0x8d,0x0f,0x40,0x48,0x46,0x86,0xfe,0x2a,0x84,0xd9,0x45,0x8c, 0x57,0x08,0x81,0x86,0x8e,0x25,0x7c,0x28,0xe0,0x83,0x46,0x34,0x16,0x60,0x14,0x8a, 0x24,0xa8,0xd5,0x83,0x6c,0x28,0xf8,0x80,0x99,0xaf,0xf5,0xaa,0x11,0xc7,0x70,0xc0, 0x41,0x46,0xa1,0xbf,0xb5,0x6d,0x6d,0x3b,0x10,0x80,0x95,0x32,0x88,0xf1,0x2e,0x10, 0x39,0x20,0x1a,0x80,0x80,0x02,0xdf,0xfa,0xe6,0xa2,0xbc,0x04,0xae,0x46,0x82,0x11, 0x4c,0x1f,0xc4,0x51,0xb8,0x71,0x05,0x23,0x72,0xf0,0x80,0x07,0x03,0x98,0xe4,0xb8, 0x72,0x9d,0x90,0x72,0xc5,0x63,0x81,0x39,0x24,0x21,0x89,0x6f,0x38,0x20,0x03,0xdb, 0xb0,0x02,0x2c,0x6c,0x20,0x88,0x03,0x0c,0xc2,0x12,0x76,0x70,0x81,0x05,0x04,0x61, 0x83,0xd1,0x89,0xc6,0x0e,0x24,0x38,0x00,0x09,0xfa,0x60,0x82,0x3e,0x8c,0xc6,0x05, 0x76,0x60,0xc4,0x0e,0x3a,0x60,0xa8,0x9b,0x19,0x03,0x02,0x44,0x5a,0x01,0xcd,0x1e, 0x25,0x00,0x3c,0xa5,0x84,0x00,0x2b,0xe0,0x1f,0x82,0x1a,0xd1,0x88,0x0f,0x6c,0x63, 0x0e,0x18,0x7a,0x02,0x08,0x40,0xf0,0x04,0xc7,0x60,0x40,0x4a,0xb4,0x90,0x41,0x18, 0xa4,0xf0,0x09,0x19,0x68,0xc4,0x40,0x39,0x08,0x41,0x16,0xad,0xc1,0x88,0x50,0x84, 0x82,0x11,0xb0,0xf8,0x05,0xc4,0xf4,0x80,0x82,0x02,0x60,0x40,0x01,0x55,0x9c,0xc0, 0x15,0xd3,0xb6,0x29,0x25,0x34,0x82,0x41,0xcc,0x18,0x03,0x06,0xdc,0xf1,0x03,0x01, 0xf0,0x62,0x0f,0xbc,0x90,0x15,0xa5,0x4e,0xd0,0x81,0x0e,0xe8,0xa2,0x8a,0xf2,0x08, 0x87,0x32,0x32,0x63,0x80,0x0b,0x98,0xf0,0x02,0xfe,0x0a,0xf0,0x43,0x12,0x80,0x21, 0x97,0x71,0xdc,0x45,0x2f,0x7b,0x19,0x5c,0x2b,0xfa,0x30,0x98,0x57,0x06,0xac,0x0f, 0x83,0x00,0x4c,0x1d,0xd0,0x75,0x01,0x03,0x88,0xe2,0x5c,0xe5,0x32,0xe1,0xe3,0xa6, 0x30,0xc2,0x05,0xa0,0x22,0x03,0x25,0x30,0xe1,0x3b,0xcc,0xd1,0x80,0x1c,0xa8,0xc2, 0x10,0x47,0x18,0xc7,0x21,0xa0,0xf1,0x8b,0x3e,0x14,0xd1,0x05,0xb9,0x18,0x8d,0x0d, 0x0e,0x60,0x01,0x3b,0x1c,0x00,0x87,0x3a,0xc0,0x82,0x34,0x2d,0x60,0x89,0x32,0x68, 0x6c,0x63,0x52,0x84,0x8f,0xda,0x82,0x73,0x27,0x2c,0x0e,0xa7,0x01,0x13,0xe0,0x62, 0xa6,0xb2,0x61,0xc6,0x1f,0xe4,0x20,0x15,0x28,0x88,0x01,0x33,0xd8,0xc1,0x8e,0x1d, 0x74,0xa3,0x1b,0xdb,0x00,0xc5,0x2c,0xd8,0x40,0x85,0x39,0x30,0xc3,0x0d,0x28,0x98, 0xc0,0x1e,0x48,0x82,0x0a,0x0f,0x34,0xc0,0x01,0x2c,0xa8,0x06,0x1b,0x1e,0x66,0x85, 0x32,0x78,0xa1,0x18,0xb1,0x68,0x42,0x2a,0xca,0x31,0x86,0x99,0x4d,0xa0,0x01,0xf7, 0x43,0xc5,0x28,0x50,0x02,0x81,0x0e,0x9c,0xe0,0x07,0x18,0xc0,0x27,0x33,0xe2,0x31, 0x00,0x77,0xac,0x80,0x1a,0x0b,0xf1,0xa8,0xfe,0xf2,0x35,0x8c,0x6c,0x84,0x80,0x7a, 0xc6,0xa0,0x46,0x66,0x9c,0x61,0x80,0x77,0x3d,0xc0,0x09,0x0f,0x60,0x01,0x15,0xda, 0xb0,0x0b,0x84,0x05,0x83,0x0c,0x81,0x13,0xc2,0xe0,0x02,0xa3,0x83,0x3e,0x78,0xf0, 0x4b,0xb3,0x04,0x8c,0x10,0xa6,0x80,0x4b,0x9c,0xaa,0xeb,0x01,0x94,0x49,0x21,0x03, 0x54,0xb0,0x05,0x73,0x69,0x80,0x03,0x1b,0xfe,0x50,0xc6,0x05,0xa6,0xf0,0x8e,0x05, 0xb0,0x80,0x1d,0x31,0x28,0x42,0x2f,0x14,0x81,0x07,0x32,0x74,0x21,0x18,0x42,0x40, 0x87,0x2d,0xb4,0x69,0x01,0x74,0x1c,0xe0,0x00,0x76,0xc0,0x61,0x11,0xd3,0x20,0x0e, 0x71,0x5c,0x13,0x1a,0x8f,0x88,0x87,0x26,0x2d,0xa5,0x33,0x42,0x4d,0x11,0x3d,0x11, 0x30,0x4f,0x04,0x90,0x77,0x0c,0x0f,0x14,0x4b,0x09,0x3f,0xe0,0xca,0x13,0xd8,0x31, 0x8b,0x22,0xa4,0x22,0x1a,0xa9,0xa0,0x82,0x15,0x5c,0xe1,0x0a,0x61,0x30,0xe2,0x15, 0x8e,0x60,0x83,0x3b,0x24,0xe0,0x0e,0x3d,0x74,0x03,0x1f,0xca,0x88,0x40,0x37,0xfc, 0xc0,0x06,0x57,0x3c,0xc2,0x11,0xcf,0x08,0x05,0x18,0xac,0x80,0x8b,0x35,0xe0,0x82, 0x0a,0x28,0xe0,0x46,0x0d,0x9e,0xb0,0x02,0xc2,0xb2,0x00,0x15,0xc5,0x2b,0x8e,0xa4, 0x74,0xa1,0xaf,0x9c,0xc4,0x20,0x6c,0x18,0xa0,0x80,0x04,0x56,0xb1,0x07,0x65,0x48, 0x8a,0x48,0x1b,0xf8,0x81,0x12,0x14,0xb0,0xa9,0x15,0x10,0x00,0x73,0x37,0x95,0x8c, 0xe3,0x9c,0xa0,0x02,0x27,0x18,0x60,0x0c,0x6c,0x38,0xa5,0x8b,0xea,0x70,0x84,0x3a, 0x14,0xb5,0xa8,0xe2,0xd2,0xc1,0x07,0x03,0xa6,0x83,0x41,0xd0,0x52,0x08,0x8c,0x9b, 0x04,0x0c,0x60,0xe0,0xd5,0xa9,0x3a,0x41,0xbe,0x2a,0x48,0x40,0x3d,0xea,0x91,0x80, 0x72,0x39,0xa3,0x03,0xd4,0x98,0x82,0x65,0x34,0x40,0x0c,0x0b,0x45,0x83,0x11,0x78, 0x78,0x43,0x31,0x3e,0x38,0x83,0xd0,0x09,0x22,0x9a,0xe8,0xb0,0x00,0x09,0x04,0x41, 0xd7,0xb8,0x32,0x21,0x30,0x40,0xac,0xfe,0x03,0x0d,0xca,0xf0,0x03,0x5d,0x8c,0x40, 0x8a,0x10,0xa0,0x94,0x60,0x09,0x10,0x1c,0xe4,0x4d,0xf1,0x18,0x17,0x51,0x40,0x07, 0xde,0xf9,0x03,0x0a,0x80,0x43,0x0e,0x4b,0x60,0x03,0xaa,0xd2,0xca,0x04,0x71,0x3c, 0x03,0x0b,0x68,0xb0,0x02,0x10,0x62,0x51,0x84,0x25,0x70,0xe2,0x35,0x96,0x8d,0xc5, 0x1a,0xde,0x90,0x04,0xd7,0xc6,0x61,0xc5,0xb8,0xf8,0x04,0x15,0x7c,0x20,0x83,0x39, 0x54,0x01,0x03,0x1b,0x98,0x22,0xb2,0x26,0x52,0x1e,0x01,0x34,0xe0,0x18,0xba,0x40, 0xb1,0x94,0x76,0x90,0x83,0x0f,0x74,0xa3,0x03,0x8a,0x21,0x07,0x07,0x58,0xe0,0x12, 0x2e,0x2e,0x6f,0x03,0x63,0x0e,0xc1,0x04,0x50,0xb1,0x07,0x67,0x54,0xb7,0x5c,0xd7, 0xc5,0x41,0x05,0xb6,0x10,0x01,0x2b,0x84,0xe2,0x0a,0x26,0x58,0x65,0x2b,0x8b,0x8a, 0xa3,0xa4,0x7e,0x50,0x5c,0xe0,0x65,0xaf,0x39,0x9c,0xb4,0xcb,0x79,0x3d,0xa0,0xcd, 0xf5,0xa8,0x80,0x92,0xd8,0x3b,0x09,0x06,0x2c,0xe9,0x01,0x98,0x91,0x40,0x0c,0xfc, 0xa0,0x86,0x42,0x60,0x41,0x07,0x5f,0x32,0x82,0x10,0xb4,0x69,0x4d,0x41,0x38,0x18, 0x87,0x99,0x26,0x4d,0x1d,0x74,0x70,0x04,0x60,0xf8,0x82,0x0d,0xbf,0xe2,0xdd,0x7a, 0xd0,0x93,0x1e,0x42,0x41,0x31,0x02,0xc6,0x78,0x4f,0xad,0x4e,0xc0,0x94,0x1f,0xa0, 0xb8,0x00,0x42,0x76,0x45,0x25,0xf4,0xe0,0x87,0x2c,0xb4,0xe1,0x19,0xad,0x90,0x85, 0x1b,0x40,0x01,0x8c,0x3c,0x00,0xc2,0x0a,0x99,0xf8,0x04,0x1f,0x7a,0x50,0x04,0x29, 0x84,0x21,0x1a,0x9d,0x28,0x45,0xfe,0x1c,0x32,0xf1,0xec,0x32,0xdc,0x00,0x05,0x53, 0xab,0x02,0xfd,0x74,0x31,0x81,0x95,0x8c,0xac,0x78,0xf2,0x90,0x47,0xca,0x36,0x00, 0x02,0x0c,0x00,0xf0,0xca,0x6e,0xe8,0x46,0x04,0x78,0xb0,0x00,0x2f,0xb7,0xa4,0x42, 0x6b,0xcb,0xc6,0x62,0xb3,0xb1,0x02,0x79,0x70,0x00,0xcd,0x5e,0xb5,0xee,0x3c,0xb6, 0x80,0x03,0xfb,0x26,0x60,0x12,0x0a,0xd0,0x03,0x18,0x5e,0x81,0x97,0xbd,0x6c,0x2b, 0x30,0x36,0x12,0x57,0x2b,0x04,0xa3,0x03,0x72,0x4d,0x01,0x06,0xe6,0xf0,0x73,0x9a, 0x13,0xbd,0x53,0x15,0x10,0x3a,0x1d,0xf3,0x78,0x80,0xbc,0x9c,0xc0,0x38,0x78,0x94, 0xeb,0x1e,0x22,0xd8,0xc3,0x31,0xdc,0xd0,0x83,0x2f,0x88,0xa1,0x15,0x44,0xb4,0x01, 0x12,0xe5,0x3a,0x57,0x1b,0x30,0xe1,0xe4,0x45,0xfc,0xd2,0x11,0x64,0xc1,0x08,0x53, 0xc8,0x41,0x18,0x4a,0x70,0x1b,0x01,0x5a,0x92,0x9e,0x09,0x18,0x2a,0x03,0x21,0x38, 0x06,0xf2,0x74,0x96,0x01,0x4c,0xad,0x6c,0x05,0xfa,0xda,0x01,0x0a,0xe2,0xb0,0x88, 0x69,0x14,0x60,0x1b,0x44,0x98,0xc6,0x22,0xfc,0x70,0x89,0x68,0x80,0xc2,0x0f,0xa1, 0xb0,0x82,0x1b,0x76,0xa0,0x05,0x00,0xc9,0x60,0x1a,0x3e,0x88,0x3a,0x22,0xb4,0x20, 0x34,0xfc,0x68,0x61,0x0e,0x05,0x88,0x01,0x1c,0x30,0x60,0x8d,0x0c,0x60,0x1b,0x9d, 0x28,0x31,0x6c,0x06,0x3a,0xe0,0xb2,0x9c,0x7c,0xcd,0x0d,0x61,0xf8,0xc1,0x10,0x0e, 0x22,0x80,0xe0,0x51,0x6a,0x67,0x1b,0x58,0xec,0x13,0xe5,0xc1,0x83,0x07,0x86,0x72, 0xcd,0xf6,0xc6,0x01,0x00,0xfe,0x00,0x50,0x01,0xc4,0x7f,0x23,0x1b,0xd3,0x78,0x04, 0x02,0xc8,0x20,0x86,0xf0,0x86,0x77,0x70,0x42,0xf8,0x96,0x78,0xf9,0x7c,0x81,0x49, 0x94,0x80,0x24,0xab,0x28,0x41,0x28,0xb7,0xa0,0x02,0xd0,0x63,0x37,0x5e,0x4e,0x98, 0x47,0x00,0x34,0x70,0x01,0x78,0x5c,0x9c,0x1e,0x1a,0x80,0x01,0x2f,0x3c,0xd0,0x4f, 0x57,0xb0,0x01,0x10,0x08,0xb0,0x01,0x09,0x3c,0x6d,0x81,0x22,0x12,0x51,0x9b,0xba, 0x67,0xc2,0x20,0x48,0xe1,0x05,0x39,0xf8,0x60,0x0e,0x3b,0x18,0x80,0xa6,0x56,0xa0, 0x9e,0xf4,0x44,0xa0,0x42,0xef,0xf9,0xf9,0x87,0x75,0xa6,0xc9,0x9d,0x29,0x21,0x07, 0x88,0x90,0x76,0x15,0x86,0xb1,0x94,0x46,0xd4,0xa0,0x00,0xb4,0x28,0x40,0x01,0xb0, 0x41,0x04,0x61,0x84,0x9f,0x08,0x5a,0x40,0x84,0x1b,0x68,0xc1,0xab,0x1a,0x74,0xa3, 0x9e,0xf7,0xfc,0x5a,0x0d,0x84,0xfb,0x81,0x27,0x6c,0xe7,0x25,0xe6,0xf1,0x18,0x48, 0x95,0xa0,0x84,0x01,0x00,0xb0,0x06,0x3b,0x28,0x87,0x2b,0x7c,0x70,0x02,0x54,0x20, 0x08,0x01,0xe0,0x30,0x4d,0x99,0x1e,0xa6,0xe0,0xbb,0x0e,0x38,0x06,0x79,0x00,0x0b, 0x50,0x32,0x21,0xd2,0x03,0xbd,0x0a,0x30,0x3c,0x09,0x24,0xb4,0x7c,0xd8,0x80,0x59, 0x00,0x02,0x33,0x30,0x01,0x1e,0xa9,0x03,0x52,0x10,0x83,0x3c,0x68,0x03,0x30,0x48, 0x0b,0x6d,0x10,0x03,0x2e,0x58,0x05,0x73,0x98,0x84,0x3d,0x78,0x8e,0x55,0x20,0x07, 0x87,0x53,0x01,0x1c,0xb8,0x2a,0x06,0xa8,0xae,0x44,0x63,0x12,0x5c,0x82,0x01,0x0e, 0x29,0x01,0x0e,0x50,0xfe,0x82,0xf0,0x43,0x84,0x6d,0xf0,0x81,0x4b,0x38,0x03,0xc1, 0xc0,0x82,0x34,0x90,0x2b,0x70,0xb1,0x81,0x5c,0x88,0xab,0x2f,0x11,0x03,0x6d,0x70, 0x84,0x59,0x18,0xa3,0x15,0xf8,0x01,0x6b,0xd0,0x94,0xde,0xf9,0xb0,0x55,0xbb,0x99, 0x9a,0xfb,0x2b,0xbd,0x23,0x00,0x9d,0xf1,0x80,0x46,0x80,0x03,0x7e,0x02,0x07,0x25, 0x78,0x09,0x09,0x20,0xa7,0x0a,0x99,0x00,0x04,0xd2,0x05,0x25,0x78,0x82,0x64,0xc8, 0x81,0x1c,0x80,0x83,0x0f,0xf8,0x00,0xb1,0xf9,0x00,0x0a,0x48,0x06,0x0a,0xc0,0x80, 0x1a,0xa8,0x01,0x76,0x18,0x03,0x45,0xf1,0x80,0x11,0xe0,0x98,0x09,0xf8,0x43,0xf4, 0x18,0xba,0x34,0xf4,0x1a,0xf7,0xd3,0x82,0x28,0xd0,0x83,0x72,0x80,0x00,0x54,0xa0, 0x86,0x6e,0x5b,0x9b,0x4c,0x42,0x90,0x6c,0x50,0x80,0x58,0x03,0x0e,0x01,0x30,0x12, 0x08,0x7a,0x80,0x79,0x70,0x41,0x1c,0x68,0x07,0x09,0x9c,0x40,0x42,0x7b,0x00,0x1e, 0xb8,0x85,0x67,0xe9,0x05,0x28,0x60,0x04,0x2a,0x18,0x80,0x48,0x59,0x01,0x10,0x48, 0x05,0x3d,0x78,0x84,0x86,0x80,0x81,0x06,0xc8,0x80,0x70,0xe0,0x05,0x07,0xd0,0x07, 0x03,0x98,0x02,0x27,0xc0,0x01,0x1c,0x70,0x82,0xca,0x98,0x2a,0x13,0xb2,0x0c,0x03, 0x60,0x01,0x1e,0x48,0x8a,0x14,0x7c,0x82,0x4e,0x50,0x05,0x2a,0x88,0x01,0x70,0x90, 0x81,0x4b,0x00,0x83,0x19,0x79,0x06,0x28,0xb8,0xab,0xd4,0x71,0x30,0x26,0x20,0x84, 0x57,0xf8,0x82,0x50,0xe8,0x85,0x22,0xc0,0x80,0x6c,0x68,0x80,0x08,0x78,0x82,0xeb, 0xcb,0x00,0x97,0xfe,0x68,0x8f,0x29,0xd2,0x99,0x2a,0xfa,0xb9,0xbc,0x7b,0xbe,0x0e, 0x58,0x90,0x16,0x28,0x00,0x0a,0x30,0x33,0x07,0xd0,0x13,0x2c,0x4a,0xa7,0x82,0x30, 0x07,0x6a,0x98,0x00,0x2a,0x8b,0x99,0x01,0xc8,0x0e,0x10,0xf8,0x81,0x5b,0x58,0x2c, 0x45,0xda,0x3f,0xfa,0x51,0x02,0xa1,0xd3,0x42,0x9d,0x1b,0xb1,0xac,0x78,0x02,0x3b, 0xbc,0xa7,0x72,0x60,0x04,0x36,0x28,0x83,0x46,0x10,0x80,0x8e,0x8a,0x80,0xad,0x41, 0x10,0xbe,0x33,0xa3,0x7e,0xd4,0x98,0x42,0x22,0x87,0xf7,0x42,0xa1,0x4c,0xd4,0x45, 0x4e,0xec,0x44,0x91,0x2c,0xb4,0x12,0x00,0x01,0x61,0x08,0x03,0x0f,0x80,0x01,0x7b, 0x60,0x80,0xcf,0x53,0x12,0x18,0x38,0x86,0x12,0x08,0x89,0x06,0xf8,0x01,0x07,0xe0, 0x85,0x64,0x99,0x84,0x00,0x70,0x41,0x5e,0xfc,0x3c,0xf9,0x3a,0xa1,0x0b,0x70,0x06, 0x16,0xe8,0x00,0xfd,0x19,0x05,0x65,0xc0,0x00,0x44,0x90,0x01,0x61,0xe8,0x84,0x02, 0x00,0x07,0x14,0x90,0x02,0x20,0xa8,0x03,0x3a,0xf0,0x05,0xb4,0x38,0x83,0x5d,0x80, 0xb1,0x41,0x78,0x85,0x40,0x88,0x02,0x36,0x38,0x03,0x3d,0x78,0x82,0xf2,0xf8,0x32, 0x0a,0x50,0x02,0xf9,0x33,0x94,0x0f,0x43,0x0f,0x4a,0xd1,0x19,0x2d,0x14,0xb1,0x62, 0x41,0x31,0x3b,0xcc,0x01,0x0f,0x58,0x40,0xe7,0xe0,0x80,0x21,0x30,0x43,0xe1,0xb8, 0x93,0x93,0xa0,0x0e,0x08,0xf8,0xad,0x03,0x51,0x00,0xbe,0x64,0x2e,0x85,0xc4,0x32, 0x0c,0x50,0x14,0xe3,0x53,0x9b,0xb5,0xa1,0x89,0x13,0x00,0x48,0xaf,0x89,0x81,0x1a, 0x28,0x07,0xfe,0x40,0x60,0x84,0x4b,0x98,0x03,0x5d,0xc8,0x13,0x09,0x20,0x80,0x10, 0x40,0xc3,0x33,0x1a,0x00,0xfa,0x79,0x02,0x25,0xd8,0x00,0x78,0xab,0xa9,0x49,0xb0, 0x87,0x35,0x03,0x3d,0xfb,0x12,0x49,0xd2,0x04,0x00,0x15,0x90,0x0c,0x73,0x70,0x00, 0x11,0x80,0x01,0xc0,0x63,0x80,0x4c,0x04,0xbd,0x79,0x28,0x01,0x75,0xe0,0x81,0x3d, 0x48,0x40,0x5e,0xa0,0x06,0x75,0x20,0x86,0x0b,0xc8,0x45,0xec,0x72,0x82,0x2d,0xf8, 0xa5,0x8b,0xd3,0x00,0x78,0x68,0xbd,0x66,0xd0,0x85,0x98,0xe0,0x80,0x46,0xe8,0x80, 0x66,0x00,0x81,0x4e,0xe8,0x04,0x0c,0x88,0x81,0x54,0xb8,0x84,0x36,0x20,0x85,0x57, 0x80,0x04,0x20,0x78,0x03,0x30,0x30,0x81,0x23,0xa8,0x05,0x30,0xc0,0x83,0x4b,0xb8, 0x04,0x52,0x79,0x02,0x54,0x28,0x09,0x01,0x68,0x06,0x0a,0x50,0x80,0xed,0xc8,0x00, 0x4b,0xc9,0xb9,0xb4,0x6b,0x8f,0x2a,0x0a,0xac,0x9d,0xf3,0x00,0xbe,0x5b,0xc3,0x01, 0xe2,0x10,0x72,0x30,0x88,0x74,0xc3,0x36,0x08,0xe0,0xb6,0x98,0x68,0x09,0x4a,0x61, 0x9b,0xb6,0xc1,0x9e,0xfb,0x63,0xac,0x0c,0xe9,0x00,0x0f,0xa0,0x94,0xea,0x41,0x4f, 0x05,0x18,0x06,0x97,0x89,0x07,0x00,0xba,0x27,0x61,0x78,0x84,0x50,0xa0,0x02,0xe7, 0xe4,0x08,0x79,0x20,0x12,0xfe,0x69,0x9e,0x2b,0x1b,0x80,0x32,0x9a,0x19,0x01,0x30, 0x41,0x03,0x00,0xcd,0x07,0x8c,0xb8,0x7a,0x28,0xcd,0x4e,0xac,0x07,0xc9,0x30,0x97, 0x0b,0xc0,0x0c,0x0e,0x90,0x84,0x5f,0x9a,0xaa,0x74,0xa8,0x07,0x06,0x30,0x00,0x94, 0x90,0xfe,0x87,0x0d,0xc0,0x1f,0x75,0xd8,0x03,0x78,0x08,0x80,0x17,0xfc,0x49,0x06, 0xb8,0xb8,0x2d,0xd8,0x02,0x8c,0x83,0x01,0x16,0x78,0x02,0xab,0xc1,0x47,0x0f,0x98, 0x80,0x2a,0x20,0x82,0x64,0x50,0xc8,0x02,0xb8,0x81,0x22,0x78,0x85,0x23,0x78,0x85, 0x50,0xf0,0x85,0x2f,0x80,0x84,0x33,0x60,0x03,0x35,0x78,0x03,0x5c,0x28,0x85,0x32, 0x10,0x06,0x48,0x6a,0x17,0xa4,0xe8,0x00,0x77,0xd8,0x4c,0xb5,0x69,0x8f,0xb2,0xe4, 0x30,0x42,0xa9,0xa2,0x11,0xdb,0x94,0x9a,0xa0,0x00,0x10,0xf0,0x00,0x09,0x08,0x07, 0x72,0x20,0x87,0xd9,0xe4,0x05,0x75,0x98,0x8e,0x94,0x28,0x47,0x97,0xd0,0xbb,0xb5, 0x49,0xac,0xad,0x69,0x86,0xff,0x3c,0x90,0x57,0xdb,0x18,0x0c,0x65,0x9e,0x46,0x70, 0x9e,0x1a,0x00,0x07,0x44,0xa8,0x02,0x76,0x48,0x05,0x59,0xc0,0x02,0x23,0xbb,0x03, 0x0f,0xc0,0xa2,0x65,0xb8,0x08,0x25,0xa8,0xc3,0x1c,0x50,0x4c,0x39,0x7c,0x82,0x1f, 0x58,0x01,0x09,0xe0,0x80,0x05,0x90,0x84,0x9c,0x2a,0x97,0x9c,0x1c,0x4d,0x13,0x95, 0x40,0xf9,0x72,0x02,0x75,0xd9,0x82,0x04,0x48,0x00,0xaa,0xba,0xae,0x08,0x7c,0xaa, 0x12,0xd0,0x9f,0xb4,0x3b,0x0e,0x3a,0x9d,0x04,0x0d,0xb0,0x37,0x51,0xb8,0x37,0xd0, 0xcb,0xaa,0xd3,0x33,0x07,0x09,0x20,0xc8,0x66,0x50,0x80,0x6c,0xc8,0x01,0x22,0x10, 0x2e,0x61,0x58,0x84,0x1b,0x90,0x81,0x4e,0x68,0x03,0x84,0xd3,0x86,0x24,0xc8,0x82, 0x25,0x48,0x84,0x25,0x58,0x02,0x35,0x88,0x05,0x55,0x98,0x86,0x0f,0x80,0x80,0x9a, 0xfe,0x5a,0x08,0x75,0x90,0x80,0x13,0xd8,0x0a,0x9a,0x23,0xcc,0x0c,0x98,0xc2,0xf6, 0xd0,0xb9,0x10,0x30,0xd0,0x9a,0x20,0x48,0xee,0x18,0x85,0xe3,0x22,0x07,0x1e,0x00, 0x14,0x6a,0x90,0x14,0x9b,0x39,0xd7,0xf5,0xd0,0x99,0xca,0xd4,0x24,0x36,0x1d,0x31, 0x99,0x12,0x47,0x6c,0x9b,0x80,0x11,0xf0,0x00,0x5c,0xd9,0x54,0x70,0xa0,0x05,0x84, 0xad,0x82,0x45,0xb0,0x84,0x53,0x60,0x03,0xa4,0xbc,0x85,0x11,0x38,0x0f,0xe6,0x5a, 0x90,0x6e,0x70,0x3f,0x08,0x49,0x86,0x46,0xd0,0x10,0x01,0x59,0x05,0x62,0x90,0x04, 0x51,0x40,0xa1,0x79,0x51,0x81,0x0a,0x48,0x87,0x0a,0x28,0xd1,0x54,0xad,0x80,0xe0, 0x9c,0x82,0x12,0x20,0x1e,0x49,0x2a,0x01,0xdd,0xac,0xaf,0x18,0x84,0x81,0x3d,0xb8, 0xd4,0x0c,0xa0,0x06,0x07,0x90,0x87,0x51,0x50,0x07,0x73,0xb0,0xaa,0x04,0x80,0x40, 0x1c,0x08,0x00,0x78,0x10,0xce,0x3d,0x90,0x80,0x27,0xa4,0x19,0x0f,0xa0,0x00,0x85, 0x5c,0x06,0x76,0x62,0x06,0x32,0x99,0x06,0x46,0xf0,0x0b,0x4b,0xc8,0x83,0x37,0x30, 0x05,0x4d,0x90,0x83,0x4f,0x88,0x05,0x45,0x28,0x05,0x14,0xf0,0xca,0xe3,0x82,0x81, 0x12,0x58,0x85,0xe2,0x58,0x01,0x0a,0xb0,0x86,0xe7,0x72,0x1b,0xf5,0x84,0x0f,0x2a, 0x52,0xcf,0x11,0x58,0x9b,0x4b,0x6a,0x1b,0xdc,0xfa,0xd0,0x05,0x60,0x08,0x5e,0x10, 0x0f,0x54,0x60,0x81,0x95,0xe0,0xb6,0xf5,0x48,0x8f,0x11,0x3b,0x57,0xc0,0xd2,0xdb, 0x73,0xb5,0x94,0x55,0x33,0xac,0x10,0xe8,0x9f,0x4d,0xdd,0x3e,0x6c,0x38,0x58,0xfe, 0x57,0x38,0x02,0x4c,0x90,0x05,0x19,0xb8,0x81,0x18,0x98,0x19,0x34,0xcc,0x32,0x70, 0x50,0x4c,0x38,0x80,0x03,0x8c,0x85,0x53,0x0f,0x88,0x80,0x00,0xfc,0x08,0x03,0x68, 0x9c,0xa9,0x6a,0xc9,0x91,0x2d,0xd9,0x54,0x05,0x80,0x76,0xd8,0x02,0x67,0x78,0xa0, 0x88,0x78,0x0e,0x83,0x32,0x07,0x18,0x28,0xa1,0x45,0x33,0x80,0x12,0xd8,0x83,0xa4, 0xb8,0x9f,0xf3,0x18,0x05,0x73,0xd0,0x00,0xab,0xc2,0x81,0xf8,0x9a,0x02,0x0d,0x10, 0x81,0x06,0x90,0x93,0x66,0x28,0x96,0x03,0x79,0x02,0x5d,0x18,0x03,0x76,0xf0,0x95, 0x1c,0x68,0xca,0x4b,0x90,0x83,0x3f,0xe8,0x05,0x31,0x80,0x85,0x2f,0xe0,0x84,0x4b, 0x90,0x02,0x55,0xf8,0x04,0x4e,0xd0,0x03,0x50,0xa0,0x80,0x1c,0xd5,0xbc,0x12,0x58, 0x80,0xe5,0xe0,0x01,0x08,0xa0,0x80,0x46,0x28,0xd0,0x95,0xa1,0x94,0x10,0x20,0x16, 0x9a,0x60,0x19,0xb5,0x99,0x1e,0xde,0x29,0xa4,0x8f,0x58,0x80,0x55,0xe0,0x00,0x5e, 0x40,0x8e,0x78,0x8c,0x94,0x06,0x68,0x35,0x9d,0xbb,0x19,0x6c,0xbb,0x5b,0x3b,0xe9, 0x5f,0x95,0x88,0x00,0x02,0x38,0x01,0x10,0xf8,0x80,0x2a,0x00,0x87,0x72,0x28,0x07, 0x70,0x88,0xd0,0x43,0xc0,0x84,0x56,0x28,0x82,0x39,0x88,0x23,0x03,0x7d,0x02,0x66, 0xd8,0x86,0xc3,0x05,0x20,0x38,0xd8,0x01,0x38,0x8c,0xd3,0xe3,0xf3,0x8e,0x73,0xfb, 0xd8,0x1f,0x9d,0x87,0x8f,0x34,0xd1,0x0a,0xa8,0xaf,0x4e,0xdc,0x82,0x15,0x58,0x06, 0x75,0x38,0x5d,0x49,0x98,0x84,0x49,0x30,0x87,0x3d,0x98,0x84,0x07,0x48,0xfe,0x80, 0xdf,0x34,0x00,0x73,0xe0,0x01,0x54,0xe0,0xb6,0x59,0x31,0x43,0x54,0x58,0x00,0x18, 0xe8,0xc5,0x74,0x79,0x2a,0xe6,0xe1,0x81,0xcc,0x93,0x87,0xf9,0x6d,0x00,0x54,0x48, 0x0a,0xa5,0xcd,0x80,0x91,0xea,0x86,0x54,0x00,0x02,0x48,0xb8,0x86,0x57,0x08,0x82, 0x2c,0xe8,0x81,0x32,0x08,0x03,0x61,0xf0,0x83,0x28,0xc8,0x84,0x46,0xe0,0x01,0x3f, 0x73,0xaf,0xd8,0x55,0x86,0x85,0x28,0xd2,0x46,0x78,0x02,0x6b,0x50,0x82,0x90,0x4a, 0xac,0x31,0xdb,0x1a,0xb6,0xe1,0x57,0xf5,0xe8,0x8e,0xe3,0x4a,0x41,0x15,0x9c,0x5f, 0x79,0x1c,0xc3,0x53,0x8b,0x09,0x01,0x88,0x47,0x88,0xe0,0x00,0x1b,0x26,0x0f,0x3d, 0x95,0x87,0x08,0xc8,0x80,0x6c,0x18,0x00,0x38,0xb8,0x03,0x70,0x00,0x87,0x3b,0x98, 0x06,0x59,0xe8,0x02,0x4c,0xe8,0x02,0x40,0xa8,0x01,0x22,0xa8,0x02,0x38,0xa5,0x80, 0x1d,0x00,0x87,0x02,0xe0,0x86,0xc9,0xad,0x82,0xee,0x63,0x86,0x7e,0x4c,0x40,0x16, 0xe0,0x00,0x65,0x28,0x81,0x77,0x01,0xce,0x8f,0x2c,0xbc,0xd2,0x1c,0x61,0x93,0x35, 0xbc,0x04,0xe8,0xbc,0x12,0x32,0x00,0x7d,0xe0,0x85,0x49,0xd8,0x87,0xca,0x28,0x59, 0x5d,0x64,0x00,0x1c,0x0c,0x1e,0x46,0x61,0xcf,0x09,0xa8,0x29,0x7a,0x60,0x80,0x73, 0xe1,0xdd,0x0b,0x10,0x81,0xb4,0x33,0x87,0x96,0xe8,0x90,0x0d,0xe0,0x80,0xa3,0x1d, 0xa9,0x0c,0xa0,0x8e,0xa1,0xab,0x02,0x3d,0xf8,0x02,0x69,0xc8,0x83,0x24,0x78,0x83, 0x44,0x28,0x05,0x1f,0xd0,0x02,0x1f,0xe0,0x04,0x2b,0x18,0x03,0x07,0xfe,0x28,0x81, 0xcc,0xfb,0x06,0xcd,0x5b,0x00,0x70,0x36,0x87,0xad,0xda,0x47,0x38,0xfd,0x81,0x48, 0x34,0xd6,0x12,0x73,0xdb,0xf7,0x14,0x10,0x07,0x08,0x87,0x37,0x3e,0x88,0x83,0x68, 0x0e,0x89,0x18,0x85,0x48,0xe1,0x36,0x54,0xe0,0x81,0xf0,0x68,0x0e,0x5e,0x08,0x8f, 0x3d,0xfe,0x18,0x2c,0xb2,0xdb,0x0c,0x00,0x81,0x1d,0xb8,0x03,0x5a,0x70,0x90,0x59, 0xb8,0x82,0x2e,0x38,0x07,0x6f,0x98,0x01,0x37,0xd8,0x86,0x6d,0x60,0x86,0x05,0x89, 0x81,0x02,0x98,0x03,0x44,0xa8,0xe8,0xb1,0xbb,0x83,0x1d,0x68,0x09,0xe3,0xdc,0x5e, 0x50,0x0a,0xda,0x5e,0x1a,0xe5,0xd2,0xac,0x07,0x49,0x60,0x80,0x91,0xdc,0x02,0x92, 0x6d,0x87,0x74,0x60,0x80,0x49,0xf0,0x24,0x06,0x28,0xd9,0x7a,0xd0,0x49,0x0d,0x20, 0x87,0x51,0x30,0x94,0x0b,0x25,0x92,0xfd,0xe4,0x05,0x50,0x96,0x0c,0xb2,0x10,0xce, 0x51,0x58,0xac,0x09,0x80,0x01,0x7a,0x90,0x32,0x18,0xd0,0x87,0xfb,0x83,0x80,0x78, 0x00,0x01,0x95,0x38,0x01,0x77,0x98,0x06,0x35,0x00,0x83,0x20,0x30,0x84,0x36,0xa8, 0x84,0x26,0x38,0xb2,0x02,0xf0,0x83,0x4a,0xd8,0x06,0x79,0x58,0x00,0x5c,0x5a,0x00, 0x3f,0x33,0x87,0x70,0x8e,0xc9,0x09,0x78,0x19,0x5f,0x19,0xe3,0x8c,0x54,0x80,0x61, 0xe1,0xc3,0x0a,0x91,0x00,0xe3,0x48,0x88,0x85,0xe0,0xea,0x05,0x20,0x07,0x65,0x58, 0x0e,0x3f,0xe1,0x00,0xe5,0xd8,0xe7,0x85,0xb8,0xeb,0x3d,0x58,0x05,0x89,0x38,0x62, 0x94,0x28,0x0f,0x09,0xc8,0x4b,0x3b,0x6c,0x81,0x42,0xa6,0x82,0xfe,0x67,0xb8,0xa1, 0x1c,0x2a,0x02,0x70,0x20,0x82,0x02,0xb8,0x03,0x89,0xbe,0x0f,0x50,0xe0,0xc1,0x16, 0x88,0x01,0xaa,0x80,0x00,0x61,0x2d,0x9b,0xcc,0x01,0x25,0x75,0x01,0x34,0x4d,0xc4, 0x37,0x91,0xb4,0x2f,0x54,0x95,0xc0,0x74,0x20,0x59,0x97,0x46,0x3c,0x7a,0xa0,0x06, 0x08,0x28,0x81,0xfa,0x0a,0xbd,0x00,0x28,0x01,0x41,0xe1,0x98,0x96,0x58,0x9b,0x15, 0x18,0x02,0x7c,0x88,0x0c,0x12,0x22,0x8b,0x0b,0x80,0x01,0xe6,0x82,0x80,0xb8,0x1d, 0x05,0x52,0xbd,0x80,0x55,0xc0,0xb0,0x13,0x28,0x87,0x0f,0xd8,0x22,0x0a,0x98,0x83, 0xad,0xfc,0x82,0x36,0xf0,0x05,0x3e,0xf8,0x84,0x4c,0xd0,0x82,0x1a,0xc8,0x84,0x2c, 0x48,0x05,0xdd,0x5e,0xd1,0x85,0x8b,0x49,0xcd,0x71,0x2f,0x50,0x52,0x06,0x0f,0x88, 0x99,0x64,0xa0,0x43,0xb2,0xbe,0xbf,0xe7,0x12,0xc7,0xab,0x51,0x07,0x77,0x3e,0xae, 0xe3,0x02,0xe7,0x14,0x84,0xe7,0x86,0x38,0x88,0xf5,0xc6,0xeb,0x86,0x90,0x8e,0x8f, 0x21,0x0f,0x79,0x60,0xa7,0x61,0x60,0x06,0x4c,0x2e,0x80,0x30,0x60,0x83,0x60,0x10, 0x84,0x1f,0x62,0x83,0x27,0x25,0x82,0xc6,0x95,0x01,0x50,0xd0,0x82,0x6d,0xe0,0xbe, 0x1a,0x80,0x83,0x02,0xf8,0x81,0x63,0xc8,0x13,0x9c,0x25,0x07,0x6e,0x0e,0xda,0xcc, 0x46,0x17,0x9d,0xd2,0xc4,0x53,0x1e,0x5d,0x00,0x30,0x59,0xd1,0x3d,0x3c,0x49,0x48, 0x9b,0x15,0xe0,0x85,0x7c,0x20,0x34,0x25,0x99,0x84,0x7a,0xb5,0x13,0xf6,0x40,0xc3, 0x04,0x2c,0x20,0x18,0x10,0x81,0x15,0x85,0x87,0x0b,0xd8,0xfe,0x03,0x0f,0xd0,0xd9, 0x28,0xd3,0x4d,0xa8,0x52,0x86,0xe2,0xd4,0x05,0x7c,0x82,0x00,0xe9,0x53,0x85,0x28, 0x58,0x03,0x3d,0xb0,0xb5,0x4b,0xe8,0x04,0x44,0x30,0x64,0x36,0xf8,0x84,0x0e,0xd8, 0x03,0x11,0x58,0xcd,0x70,0x36,0x87,0x6f,0x70,0xaf,0x49,0x58,0x51,0x11,0x18,0x85, 0x0d,0x60,0xc3,0xaa,0xf0,0x15,0xae,0xd8,0x4c,0x5d,0x70,0x0f,0x3c,0xa9,0x49,0x78, 0xfe,0x88,0x7d,0x96,0x24,0xbc,0x46,0xef,0xbb,0x66,0xef,0xfb,0xac,0xd1,0x48,0x11, 0x00,0x76,0x5a,0xc7,0x5d,0x99,0x06,0x39,0x68,0x03,0x12,0xb0,0x03,0x56,0x30,0x02, 0x37,0xb8,0x81,0x69,0x48,0x85,0x1b,0x18,0x8a,0xf1,0x9b,0x83,0x6d,0x28,0x80,0xfd, 0x7b,0x0c,0x96,0x70,0x63,0x50,0x56,0xf1,0xea,0x92,0x9c,0x09,0xd7,0xc5,0x0a,0x3f, 0xd9,0x4d,0x14,0xc9,0x04,0x98,0x8e,0x98,0x54,0x3e,0xc4,0x53,0x12,0x0d,0x18,0xc6, 0x9a,0x41,0xac,0xfb,0x93,0x53,0x6a,0x60,0x41,0x50,0xfa,0x65,0x01,0xe8,0x00,0x18, 0x38,0x1b,0x16,0x58,0x51,0xc9,0xb8,0x00,0x49,0x20,0x86,0x81,0x85,0x00,0x97,0x91, 0x3e,0x2d,0x28,0x03,0x4d,0xe0,0x83,0x25,0xb8,0x04,0x6a,0x6e,0xd4,0x1c,0x98,0x85, 0x25,0xc0,0x00,0x57,0x16,0x81,0x16,0xb6,0x6b,0xcd,0xd1,0x1c,0xd4,0x63,0x71,0x18, 0x18,0x82,0xfc,0x33,0x29,0x98,0xd9,0x8a,0x1f,0xe8,0x80,0xe8,0xb2,0xe3,0x91,0x11, 0x08,0x49,0x7a,0x63,0x70,0xe6,0x6a,0xe4,0x02,0xe3,0x77,0x76,0x88,0x79,0xbd,0x61, 0xe1,0x98,0xa2,0xeb,0x90,0xe0,0x18,0x88,0x81,0x68,0xfe,0x68,0x82,0x4a,0x10,0x83, 0x03,0xf0,0x04,0x52,0xb0,0xe2,0x54,0x20,0x02,0x14,0x88,0x3a,0x61,0x98,0x36,0x22, 0x30,0xbf,0x2a,0xd8,0x80,0x41,0x82,0x80,0x06,0x80,0xd7,0x3d,0x78,0x2f,0x4f,0xef, 0xe5,0x5f,0xca,0x49,0x0a,0xb7,0xf0,0x7a,0x88,0x17,0xce,0x3e,0xd1,0x2d,0x80,0x65, 0x7a,0xf0,0xe3,0x91,0x55,0x01,0x26,0x91,0x84,0xdb,0x3c,0x8f,0x29,0x63,0xac,0x38, 0x8d,0xb7,0xcc,0xb8,0x00,0x51,0x30,0x80,0xf3,0x98,0x84,0x0c,0xc0,0x9c,0x15,0x3d, 0x97,0xa0,0x9d,0x04,0x5e,0x18,0x01,0x26,0xd3,0x85,0x2a,0x78,0x0a,0x61,0xa8,0x5a, 0x39,0x48,0xb6,0x1b,0x98,0x03,0xb3,0xd3,0x02,0x3c,0xc0,0x6a,0x55,0xce,0xbc,0x3d, 0x50,0x07,0x07,0x60,0xb8,0x9b,0x6a,0x1c,0xde,0x9d,0x04,0x09,0x88,0x06,0x70,0x60, 0x43,0x38,0xdc,0x47,0x10,0x50,0x80,0x95,0x59,0x86,0x08,0x60,0x81,0x3b,0xc1,0x1f, 0x3d,0x6e,0x97,0xb8,0xf5,0xea,0xb8,0x8d,0xdb,0x78,0x85,0xe7,0xe8,0x20,0x8f,0x3f, 0xac,0xcc,0x44,0xfa,0x00,0xc5,0x04,0x05,0x29,0xe8,0x81,0x50,0x20,0x04,0x41,0xc0, 0x04,0x57,0x28,0x00,0x40,0x62,0x54,0x44,0x00,0xf0,0x68,0x10,0x86,0x9e,0xd8,0x86, 0x26,0xfd,0x54,0x64,0xe1,0x05,0x90,0x10,0x81,0xd3,0xeb,0xe8,0x17,0xc5,0x44,0xd0, 0x3b,0x74,0x0b,0xdf,0x82,0x06,0xb8,0x00,0xca,0x88,0xc0,0xce,0x86,0x87,0x14,0x24, 0x86,0xab,0xaa,0x38,0x0d,0x88,0xc9,0xb0,0x02,0x60,0x5b,0x31,0x23,0x05,0x68,0xf8, 0x8f,0x48,0x71,0x18,0x88,0x80,0x95,0x2a,0x24,0xfe,0x15,0x57,0x97,0x15,0xcf,0x3c, 0x73,0xc0,0x71,0x5b,0xb9,0xb2,0x2a,0xf0,0x81,0x45,0x58,0x84,0x6d,0x45,0x81,0x39, 0xa8,0x01,0x5f,0xf1,0x83,0x32,0x18,0x01,0x0e,0x08,0x3c,0x5c,0x72,0x06,0x7d,0x90, 0xdb,0x73,0x7b,0x21,0x49,0x90,0x4d,0x0a,0x90,0x02,0x37,0xc0,0x80,0x31,0xf8,0x9a, 0x98,0xdf,0x0a,0xce,0xbc,0x19,0xe1,0xc8,0x93,0xef,0x60,0x38,0x17,0xde,0x72,0xa1, 0x9f,0x08,0x8a,0xe8,0x36,0xb7,0xfb,0x01,0xc7,0xd8,0x81,0x18,0x60,0x07,0x37,0x18, 0x95,0x2a,0x49,0x81,0x2e,0x08,0x85,0xfb,0x88,0x01,0x0c,0x80,0x03,0x5f,0x43,0x01, 0x2d,0xb8,0x0f,0x2d,0xa0,0x85,0x44,0xe9,0x8a,0xaf,0x18,0xd5,0x77,0x39,0x3d,0xa8, 0x42,0x12,0xb2,0x17,0xd9,0x42,0x27,0xcd,0x7a,0xd8,0x02,0x07,0xa0,0x07,0x94,0x35, 0x80,0x7b,0xd8,0x82,0x0a,0xbf,0xaf,0xcd,0xe0,0x00,0x1c,0xf8,0xc9,0x17,0x62,0xdd, 0xd4,0x64,0x09,0x58,0x1b,0x80,0xe4,0x5c,0x86,0x51,0x70,0x70,0x16,0x1e,0x05,0x62, 0xe0,0x81,0x66,0x20,0x87,0xa0,0xf5,0xe5,0x15,0x65,0xe1,0x49,0x20,0x06,0x09,0xd0, 0x8a,0x0d,0x08,0xfe,0x6d,0x08,0x03,0x2a,0x20,0x13,0x80,0x48,0xa5,0xe5,0x8e,0x3b, 0x25,0x73,0xac,0x64,0xe3,0x20,0x49,0xd2,0x14,0x0d,0x1a,0x2e,0x5c,0x10,0x31,0xe9, 0x5b,0x09,0x18,0x10,0x45,0x19,0x28,0xc1,0x23,0x9e,0xab,0x54,0x03,0x1a,0x0d,0x88, 0xc7,0x2c,0xc7,0x87,0x0f,0x03,0x9e,0x6c,0xd0,0xb5,0x02,0x82,0x3c,0x01,0x02,0x46, 0x71,0x58,0x25,0x93,0x17,0x07,0x6a,0x1c,0xfe,0xd4,0xd9,0x74,0x30,0x6a,0x94,0x00, 0x79,0x13,0x08,0xac,0x38,0xd1,0xa8,0xe4,0x8e,0x18,0xec,0xdc,0x2c,0xc2,0xc5,0x28, 0x18,0xab,0x14,0xe3,0x32,0x6d,0x1b,0xa0,0x40,0xc9,0x87,0x6d,0xa0,0x6e,0x80,0x8a, 0x51,0x80,0x56,0xb2,0x64,0x14,0x40,0xfc,0x68,0xe0,0x40,0x19,0x31,0x03,0x17,0xa6, 0xa0,0x9d,0x02,0x11,0xde,0x94,0x79,0x2a,0x54,0xe0,0xa8,0x07,0x60,0x2e,0xdd,0xba, 0xf5,0xea,0xe5,0x53,0x27,0x21,0x00,0x8e,0x74,0x0c,0x88,0x5d,0x48,0x07,0xe0,0xee, 0xe0,0x7a,0x15,0x2e,0xf0,0xc0,0xa1,0x02,0x86,0x01,0x0d,0x22,0x1c,0xec,0x59,0xe0, 0x40,0xc2,0x86,0x0e,0x3f,0x1a,0x61,0xb0,0x76,0x22,0xc2,0x28,0x72,0xce,0x26,0x4d, 0x32,0xc0,0x6b,0xc3,0x24,0x78,0x0e,0x21,0xa2,0x86,0x31,0x49,0xd2,0x82,0x21,0x3f, 0x56,0x28,0x19,0x50,0x03,0x45,0xa6,0x1b,0x9d,0x50,0xb8,0xb9,0x33,0xe0,0xc7,0x0f, 0x2b,0xdd,0x1c,0xa8,0xd5,0xc0,0xe0,0x9e,0x69,0x7a,0x22,0x60,0x90,0x23,0xc7,0x16, 0xad,0x01,0x18,0x7b,0x76,0x30,0x9a,0x15,0xe3,0x09,0x08,0x0a,0xc9,0x72,0xec,0xd8, 0x91,0xac,0xd1,0x8f,0x0e,0xba,0x32,0x4c,0x98,0x20,0x41,0x00,0x0b,0x54,0x43,0x46, 0x51,0x73,0x40,0x8d,0xa7,0xbc,0xf6,0x12,0x96,0x1d,0xd3,0xb5,0xc1,0x5a,0xbc,0xa2, 0x77,0x62,0xc4,0x10,0x46,0x45,0x13,0x9b,0x19,0x2f,0xd0,0x11,0x62,0x45,0x01,0xc9, 0xac,0x90,0x81,0x07,0x18,0xb4,0xe0,0x46,0x2a,0x44,0x7c,0x90,0x43,0x0e,0x3f,0x60, 0xf0,0xc1,0x0f,0x10,0xdc,0x54,0x82,0xfe,0x59,0x0c,0x3c,0x40,0xdc,0x14,0xa6,0xb1, 0x15,0xc0,0x16,0x38,0x54,0x50,0x97,0x88,0x73,0xd5,0xa3,0x81,0x24,0x25,0x04,0x50, 0x01,0x88,0x5b,0x04,0xf0,0x40,0x3a,0xf5,0xa4,0x93,0x80,0x5c,0x73,0x55,0x50,0x02, 0x0e,0x38,0x04,0xa0,0x81,0x28,0xf0,0x88,0xc0,0x0b,0x2f,0x3c,0x48,0x20,0x1f,0x08, 0x03,0x0c,0x90,0xcc,0x0f,0x19,0xb0,0xc0,0x01,0x39,0x30,0x88,0x40,0x0f,0x0c,0x0e, 0x34,0x76,0x1a,0x44,0x06,0x50,0x79,0x62,0x09,0xe4,0x38,0x30,0xc1,0x06,0x45,0xba, 0x71,0x03,0x0a,0xb8,0xb1,0x61,0xc5,0x0f,0x1e,0x28,0x90,0x09,0x15,0x12,0x4c,0x92, 0xd6,0x3d,0x69,0x69,0x60,0x00,0x0f,0xf2,0x2c,0xa0,0xc1,0x14,0x0c,0x5c,0x60,0xc0, 0x24,0x7b,0x94,0xd3,0xc6,0x12,0xc2,0x60,0x40,0xdd,0x2d,0x14,0x7c,0x90,0x1d,0x06, 0x60,0x6d,0xe0,0xc1,0x77,0x13,0x34,0xd0,0x40,0x04,0x2c,0x24,0x2a,0x41,0x04,0x10, 0x64,0x10,0xa9,0x07,0x64,0x82,0x70,0x5d,0x15,0x05,0x6c,0x03,0x0e,0x37,0x37,0xa8, 0xd2,0x84,0x29,0xcf,0x90,0xe0,0x02,0x26,0x80,0x6c,0x83,0x01,0x78,0x10,0x78,0x90, 0x4c,0x15,0xdb,0xc8,0xe0,0x46,0x0e,0x83,0x92,0xf4,0x44,0x38,0x93,0xf0,0x40,0xce, 0x37,0xf4,0x68,0xf0,0xc0,0x03,0x0e,0xa1,0x05,0xd1,0x14,0x1e,0xe2,0xd0,0xce,0x88, 0x22,0x56,0x00,0xcf,0x37,0xce,0x6c,0xf1,0xe2,0x88,0xf5,0xa8,0x50,0xc1,0x8c,0xed, 0x30,0x80,0xc3,0x16,0x0f,0x04,0x30,0x05,0x0c,0x30,0x94,0x60,0x8e,0x3a,0xe1,0x29, 0xf1,0x44,0x32,0x1f,0x30,0x33,0xfe,0xc0,0x06,0xc7,0x74,0x66,0x4e,0x68,0xf0,0xd0, 0x63,0x00,0x3c,0x6c,0x39,0xd4,0xa6,0x01,0x18,0x7d,0x63,0xce,0x02,0x1c,0x50,0xd6, 0x48,0x32,0x31,0xc8,0x20,0x0c,0x11,0x44,0x44,0xb3,0x8d,0x35,0x1e,0x9c,0x80,0x81, 0x15,0x04,0x98,0x73,0x81,0x43,0x74,0x4e,0xf1,0x40,0x43,0x06,0xec,0xa1,0x8f,0x9c, 0x0d,0x3d,0x04,0xc3,0x2a,0xc2,0x18,0x01,0x48,0x26,0xe0,0xf4,0x49,0x81,0xc6,0x18, 0x90,0xf4,0x91,0x12,0x4a,0x74,0xb0,0xc2,0x0a,0x1e,0x84,0x90,0xc1,0x08,0x2b,0x84, 0x10,0xc2,0x09,0x1f,0x5f,0x56,0x64,0x0e,0x35,0x54,0x71,0x47,0x01,0x31,0x20,0xd2, 0x49,0x1c,0x9f,0x24,0x12,0x8a,0x38,0x24,0xa0,0x23,0x8b,0x30,0xc9,0x64,0xd0,0xde, 0x04,0x1e,0x80,0xf0,0x01,0x1c,0x03,0x25,0xb3,0x81,0x12,0x55,0x50,0xe0,0xc1,0x2a, 0x3c,0xf0,0xb0,0x40,0x09,0xf0,0x30,0xd0,0x62,0x43,0x67,0xd5,0x29,0x0a,0xb5,0x70, 0xdd,0x55,0x4f,0x00,0x01,0xcc,0x48,0x17,0x0e,0x88,0x49,0xa0,0x81,0x0a,0x2f,0x12, 0x46,0x57,0xd7,0x09,0x38,0x5b,0x01,0x03,0x72,0xba,0x75,0x81,0x24,0x22,0x94,0x30, 0xef,0x28,0x2b,0x3c,0x41,0x01,0x06,0x70,0xe4,0xd0,0x48,0x07,0x11,0x38,0xb0,0xca, 0xb5,0x93,0x88,0x80,0xda,0x05,0xf0,0xbc,0xf3,0x50,0x44,0x92,0x4c,0x52,0x82,0x32, 0xea,0x34,0x90,0xc1,0x13,0x03,0xec,0x50,0x03,0x28,0x44,0xb8,0x91,0x8c,0x30,0x7a, 0x94,0x03,0xc1,0x0a,0x52,0xb8,0x03,0x43,0xae,0x0c,0x38,0xc1,0x40,0x5a,0x54,0x1b, 0xb0,0x40,0x5a,0x73,0xde,0xfe,0x73,0x01,0x0c,0xd4,0x50,0xf1,0xc7,0x19,0x45,0xc8, 0x50,0xc5,0x07,0xc9,0x10,0x59,0x24,0x06,0x18,0x7c,0x04,0xd6,0x13,0xd6,0xfc,0xf0, 0xb1,0x12,0x2d,0xef,0x8e,0x5d,0x0c,0x97,0xd2,0x02,0x4e,0x0d,0xdb,0x44,0x33,0x4d, 0x18,0xb3,0x24,0x82,0xc6,0x11,0x82,0x08,0x72,0x04,0x15,0x4f,0x4c,0xc0,0xc2,0x28, 0x43,0x48,0x00,0x1b,0x05,0x03,0x54,0x11,0xc3,0x91,0x45,0xeb,0x22,0x81,0x03,0x81, 0x3b,0x03,0x43,0xc2,0x4e,0xb4,0x68,0xb0,0xc2,0x1a,0x50,0xfd,0xc0,0x5b,0xce,0xd6, 0x03,0xc1,0x00,0xf9,0x88,0x38,0x0f,0x0c,0x11,0x2c,0x23,0xc2,0x16,0x6f,0xdd,0x43, 0x03,0x61,0x23,0x51,0x3d,0xd8,0x56,0x22,0x2a,0x3d,0x60,0x0b,0x1a,0x70,0x86,0x69, 0xee,0xc4,0x01,0xd8,0x60,0xe6,0x65,0x0f,0x42,0x52,0x38,0x38,0xc0,0x02,0x65,0x30, 0x49,0x22,0x85,0x93,0x12,0x3d,0x40,0x53,0x02,0x5e,0xe8,0x84,0x68,0x03,0x60,0xde, 0x1d,0xdc,0xb0,0x8d,0x2a,0x28,0x41,0x63,0x12,0x98,0x00,0x3b,0x50,0x10,0x27,0x5d, 0x3d,0xc0,0x74,0x67,0x91,0x93,0x89,0x68,0x28,0x27,0x19,0x4a,0x82,0x07,0xdd,0x78, 0x86,0x11,0x4c,0x11,0x07,0x22,0x14,0x60,0x07,0xbb,0xc3,0x5d,0x32,0xe2,0xc1,0x3b, 0xdc,0x95,0x24,0x1e,0x0e,0x7a,0x59,0x0c,0xc0,0x81,0xa9,0x39,0x98,0x90,0x16,0x05, 0x98,0x03,0x11,0x50,0x70,0x83,0x30,0x94,0xc2,0x0f,0x67,0x10,0x02,0xf5,0x82,0x31, 0x8b,0x46,0x44,0x60,0x08,0xd4,0x30,0x8f,0x3c,0x20,0xd0,0x81,0xa9,0x80,0x00,0x03, 0x63,0xd8,0x40,0xa1,0xfe,0x24,0x80,0x0a,0x07,0xf0,0xc2,0x42,0x17,0x78,0x80,0x13, 0xb6,0x30,0x2d,0x5e,0xa1,0x05,0x43,0x4e,0x70,0x4b,0x01,0x19,0x50,0x81,0x7c,0x0c, 0x10,0x00,0x53,0x58,0xc0,0x0a,0x16,0x80,0x2b,0x06,0x4c,0xa2,0x3c,0x25,0x08,0x91, 0x88,0x0c,0x53,0x0f,0x06,0xe4,0xd0,0x22,0xa9,0x23,0xc6,0x43,0x26,0xc1,0x81,0x63, 0x50,0x80,0x1d,0x77,0x48,0x5e,0x01,0xe2,0xa1,0x04,0x08,0x50,0x23,0x1c,0x10,0x38, 0xc1,0x08,0x24,0xc0,0x02,0xce,0x38,0x60,0x01,0x75,0x72,0xce,0x1e,0xcc,0x71,0x25, 0x65,0xc8,0x43,0x17,0x3f,0x18,0x80,0x1b,0x4c,0x21,0x8c,0x1a,0xd0,0x02,0x0e,0x1f, 0x50,0x82,0x3c,0xa8,0x21,0x8f,0x0c,0xf8,0x60,0x14,0xb9,0xd2,0x55,0x43,0xe6,0xf4, 0x30,0x83,0xa5,0x05,0x43,0x31,0xd4,0x00,0xad,0xca,0x01,0x86,0x3c,0xe0,0xa1,0x08, 0x3e,0x00,0x05,0x38,0x76,0x50,0x12,0x22,0x81,0xa4,0x48,0x0d,0x02,0x57,0x37,0xaa, 0x40,0x8b,0x39,0xcc,0x41,0x8a,0xb4,0x10,0x27,0x22,0xf8,0x95,0x8a,0x4e,0xa8,0xa2, 0x07,0x78,0x40,0x00,0x09,0x0e,0x90,0x06,0x31,0x41,0x80,0x05,0x3e,0xe2,0x00,0x2a, 0x04,0x30,0x81,0x0c,0xa8,0x64,0x64,0x20,0x18,0x85,0x1b,0xa9,0xc1,0x83,0xc8,0x58, 0xe4,0x57,0x6e,0x51,0x41,0x00,0x18,0x60,0xd0,0x39,0xd1,0x71,0x1e,0x7c,0xa4,0xc7, 0x31,0x94,0x11,0x48,0x41,0x2a,0x63,0x03,0xf2,0x68,0x00,0x2f,0x0c,0xa0,0x97,0x06, 0x2c,0x72,0x58,0x73,0x79,0x1b,0x35,0x58,0x50,0xb7,0x0f,0x9a,0xc3,0x1c,0xe4,0xa0, 0xc6,0x04,0x94,0xfe,0x40,0x8b,0x4c,0x5c,0x02,0x17,0x3d,0x90,0x43,0x1c,0x84,0xd1, 0x08,0x6a,0x90,0x43,0x02,0x1e,0x78,0x82,0x83,0x40,0xb0,0x01,0xc8,0xa8,0x63,0x14, 0x51,0xbb,0x96,0x39,0x78,0x31,0x84,0x15,0x6c,0xe0,0x09,0x35,0x98,0x45,0x0f,0x32, 0x51,0x83,0x1d,0x0c,0x40,0x09,0xba,0x98,0x40,0x38,0x86,0x50,0x8e,0x27,0xcc,0x50, 0x14,0x18,0x41,0x4b,0x9b,0x1a,0x62,0x50,0x83,0xc6,0xd0,0x74,0x6a,0x61,0xd8,0x18, 0x42,0x71,0x8d,0x33,0x24,0x82,0x0a,0x28,0x98,0x43,0x0c,0x46,0x62,0x12,0x0c,0x24, 0x63,0x77,0x68,0xe5,0xd8,0x0e,0xd8,0x01,0x87,0x2a,0x38,0x71,0x2b,0xb4,0x40,0x84, 0x16,0x84,0x81,0x82,0x69,0xc4,0x41,0x13,0xb1,0xf8,0x03,0x21,0xbc,0x31,0x08,0x57, 0x78,0x60,0x08,0xab,0xe0,0xc5,0x1e,0x9e,0x36,0x46,0x01,0x48,0x00,0x02,0x90,0xca, 0x00,0x04,0xcc,0x41,0x0d,0x75,0xf0,0x80,0x17,0x0b,0x90,0x84,0x28,0xce,0x32,0x50, 0x15,0x4c,0x4b,0x61,0xab,0xa3,0x63,0xb3,0x0e,0x23,0x23,0xba,0xb4,0xa3,0x02,0x4e, 0xa0,0x87,0x03,0x38,0xc0,0x30,0x98,0xf2,0x60,0x02,0xcd,0xe0,0xc0,0x87,0xda,0x21, 0x2c,0x11,0x31,0x00,0x1e,0x30,0x98,0x00,0x35,0x54,0x43,0x8e,0x55,0xa8,0x43,0x1e, 0xa3,0x20,0x80,0x07,0x28,0xa0,0x85,0x32,0x50,0x41,0x15,0x72,0x68,0x82,0x2a,0x32, 0x11,0x0f,0x25,0x71,0xe0,0x97,0xba,0xa0,0x40,0x3c,0x1a,0x01,0x02,0x16,0x2c,0xc0, 0x1c,0xaa,0x69,0x1c,0x0f,0x2e,0x79,0x99,0x1a,0x84,0xe1,0x13,0x7c,0xc8,0xc4,0x0e, 0x3c,0x99,0xfe,0x01,0xf3,0xad,0x62,0x05,0x77,0x20,0x86,0x24,0x88,0x51,0x16,0x83, 0xb5,0x4b,0x99,0x56,0xdb,0x90,0xc1,0x2e,0x20,0xd5,0xd7,0x8d,0xa1,0x0d,0xda,0xf8, 0x42,0x14,0x2e,0x91,0x09,0x61,0xcc,0xa1,0x00,0x35,0x30,0xeb,0xee,0x88,0x74,0x9d, 0xec,0xc0,0x0c,0x53,0xe3,0x74,0xc3,0xe5,0x64,0x70,0xc5,0x4b,0x54,0xc2,0x11,0x87, 0xc0,0xc4,0x21,0x1e,0xf1,0x04,0x54,0xb4,0x72,0x01,0x12,0x5e,0x00,0x0f,0xd8,0xb3, 0x8c,0x48,0x11,0x20,0x03,0x0d,0x18,0x02,0x07,0x38,0xb0,0x87,0x12,0x48,0x82,0x4a, 0x53,0xf8,0xdf,0x5b,0x08,0x0a,0x43,0x5d,0x19,0xd4,0x09,0x6f,0xb9,0x11,0x23,0x69, 0xa4,0x02,0x3b,0x29,0xc3,0x34,0xc4,0x90,0x07,0x64,0x04,0xe0,0x01,0x01,0xc0,0x03, 0x2e,0xaf,0xad,0xcb,0xae,0xe0,0x61,0x0e,0x16,0x88,0xc0,0x1e,0x75,0xe3,0x01,0x2a, 0xca,0x08,0x1b,0x2b,0x22,0x42,0x06,0xa5,0x08,0x43,0x18,0xe2,0x90,0x8a,0x61,0x40, 0xe0,0x18,0x13,0x18,0x42,0x06,0x9c,0xcb,0x82,0x6f,0x88,0x40,0x22,0xd7,0xfa,0xc6, 0x37,0xf6,0x10,0xd3,0x0d,0x80,0x20,0x07,0x61,0x58,0x84,0x2a,0xa4,0x10,0x06,0x76, 0x28,0xd5,0x8d,0x3c,0x50,0x07,0x38,0x78,0x60,0x00,0x49,0x3c,0x60,0x1e,0xec,0x7b, 0x9f,0x32,0x89,0xc9,0xde,0x77,0x51,0x29,0x23,0x3c,0x18,0x00,0x20,0xa4,0xb1,0x09, 0x4e,0xe0,0x82,0x0a,0xd3,0x68,0x55,0x01,0xc0,0x81,0x9f,0x1d,0x30,0x63,0x0c,0xcc, 0xc8,0x4e,0x0c,0x5a,0x50,0x80,0x47,0x4f,0x11,0x1b,0x75,0xa5,0x8d,0x14,0x96,0x50, 0x8b,0xfe,0x43,0x1c,0xa2,0x15,0x8f,0x18,0xc6,0x2a,0xc8,0xd1,0xca,0x12,0x54,0x64, 0x01,0xab,0x70,0x00,0x2a,0xd8,0xf3,0x9e,0x09,0x40,0x20,0x02,0x3c,0x50,0x86,0x74, 0xcd,0x22,0x09,0x0d,0xdc,0x28,0xd6,0x04,0x75,0x02,0xad,0x15,0x86,0xa1,0x86,0xa8, 0xd8,0x59,0x24,0xda,0x42,0x63,0x4a,0x30,0x89,0xb3,0x6d,0x61,0x0f,0x52,0x46,0x55, 0x04,0x2e,0xf0,0xbf,0x10,0x09,0x8b,0x30,0x31,0x6c,0xc8,0x89,0x16,0x00,0x03,0x1f, 0x87,0x43,0x1e,0x12,0xc8,0xc0,0x06,0xaa,0x10,0x0d,0x2d,0x14,0x80,0x37,0x5a,0xf0, 0x41,0x26,0x3e,0x90,0xbd,0x55,0xb0,0x00,0x04,0x1e,0x70,0x73,0x65,0x45,0xb1,0x10, 0x67,0x8c,0x82,0xb1,0x11,0x88,0x25,0xee,0x52,0xa1,0x8a,0x32,0x94,0x21,0x13,0x9d, 0x28,0x40,0x07,0x52,0x0d,0xd9,0x01,0x40,0xc0,0x34,0xf7,0xf8,0x9f,0x9c,0x9d,0xf0, 0x30,0x3b,0x4f,0xe1,0x1d,0xbe,0x4a,0x0b,0x44,0x26,0x31,0x84,0x31,0xcc,0xc2,0x0a, 0x7a,0xc0,0x45,0x29,0x32,0x91,0x0a,0x61,0x68,0x01,0x11,0xdb,0x28,0xc0,0x7d,0xaa, 0x60,0xf1,0x72,0x6c,0x03,0x1b,0xe0,0x74,0x03,0x5d,0xab,0xd8,0x89,0x52,0x30,0xe2, 0x15,0xbf,0x20,0x04,0x30,0x66,0x81,0xd1,0x6b,0xd5,0x4d,0xba,0xd8,0xe2,0x45,0x38, 0x0a,0x4b,0x8d,0x97,0x43,0x6d,0x08,0x43,0x90,0x6c,0x09,0x44,0x00,0x8f,0x77,0xb1, 0x23,0x04,0x86,0x01,0x40,0x3b,0x70,0xd0,0xef,0x69,0x59,0x75,0x6b,0x71,0x91,0x4b, 0x3b,0x9c,0xf0,0xea,0x29,0x08,0x60,0x01,0xe9,0xa8,0x40,0x05,0x82,0x9d,0x01,0x25, 0xfe,0x68,0x58,0x04,0x01,0x38,0xdb,0x5d,0x2a,0xa0,0x02,0xb9,0x65,0x75,0x0a,0xa2, 0xa0,0x47,0x09,0x88,0x11,0x99,0x55,0x74,0x34,0x28,0x3f,0x20,0x02,0x37,0x10,0x21, 0x71,0x2d,0x50,0x21,0x0e,0x20,0x58,0x45,0x09,0x24,0xa0,0x84,0x15,0xac,0x02,0x35, 0x79,0x76,0x86,0x24,0x78,0xb1,0x8c,0x01,0x7c,0x20,0x25,0x45,0xcb,0xc4,0x2c,0xc2, 0x50,0x06,0x2f,0xc9,0x80,0x16,0xba,0x88,0xc9,0x2a,0x32,0xb0,0x02,0x7b,0x18,0xb4, 0x45,0xb5,0x16,0x4e,0x9d,0xaf,0xda,0xa2,0x3a,0x53,0xab,0x5a,0xf0,0xb8,0x93,0x00, 0xa2,0x81,0x8b,0xbe,0x77,0x22,0x15,0x32,0x90,0x01,0x11,0x22,0xee,0x86,0xcf,0x6b, 0x41,0x0b,0xfb,0x02,0x85,0x30,0x84,0x21,0x83,0x54,0x64,0x42,0x0a,0x8c,0x10,0x03, 0x29,0x80,0xe1,0x8a,0x1f,0xf0,0x42,0xe5,0xd8,0xfa,0x06,0xb6,0x7c,0x2d,0x82,0x55, 0x0c,0xc1,0x1c,0x43,0xe0,0x41,0xa7,0xc9,0x11,0x8e,0x09,0xac,0xc2,0x5c,0xf0,0x38, 0x8b,0x01,0x9e,0x00,0x83,0xa5,0x03,0xc0,0xea,0xfd,0x56,0xc1,0x3c,0x34,0x4b,0xad, 0xff,0x55,0x7d,0x81,0xb9,0x9a,0x04,0x0c,0xda,0x66,0xf5,0x07,0xf0,0x62,0x05,0x43, 0x90,0x47,0x9a,0x54,0x0c,0x23,0xcc,0x4a,0x42,0x19,0x71,0x86,0x98,0x69,0x52,0xa7, 0x5b,0xdc,0x43,0x40,0x09,0x1b,0x88,0xc1,0x34,0x6e,0x20,0x03,0xe0,0x96,0xc1,0x0d, 0x19,0xe0,0x80,0x03,0x3c,0x70,0x0c,0x72,0xbc,0x0b,0x23,0x0e,0x79,0x17,0x6b,0x46, 0x01,0x02,0x6b,0xe6,0xc0,0x00,0xe4,0x80,0x0f,0x2c,0x42,0x1c,0xfc,0x9d,0x0c,0xfe, 0xc4,0x40,0x0e,0x50,0x40,0xd0,0x90,0x83,0x8d,0x5d,0x00,0xe4,0xa1,0x98,0x32,0xb1, 0x8f,0x87,0x8c,0x00,0x05,0x38,0x00,0x0c,0xd1,0x5a,0x8b,0x3c,0x80,0xdc,0x84,0xdf, 0x28,0xb0,0x83,0x14,0x5c,0x82,0x14,0xc4,0x41,0x18,0x64,0x82,0x0f,0xdc,0x40,0x2a, 0xa0,0x40,0x34,0x7c,0xc9,0x0a,0xa6,0x60,0x2a,0xdc,0x40,0x19,0x14,0xc1,0x1a,0xe4, 0x81,0x36,0xb0,0xc1,0x00,0xec,0x01,0xed,0x49,0xc2,0xb5,0xc0,0x40,0x0e,0x82,0x06, 0x0c,0x38,0x83,0x08,0x54,0x01,0x28,0x4c,0xc0,0x05,0x68,0x44,0x84,0xe5,0xde,0xb5, 0x14,0x0e,0x03,0x2c,0x5d,0x04,0x84,0x40,0x88,0xa8,0x48,0x89,0xfd,0xcf,0x03,0xbc, 0x03,0x5b,0x24,0x50,0x05,0xa4,0xc3,0x3e,0xc8,0x0b,0xd6,0xa8,0x43,0x00,0xa8,0x8d, 0x8a,0x68,0x40,0x87,0x49,0x80,0x01,0xfc,0xca,0xd4,0x59,0x1d,0xaf,0x5d,0x40,0xf3, 0xa1,0x58,0xbb,0xdc,0x89,0x4e,0x6d,0xdf,0xd3,0x35,0x82,0x0f,0x84,0xc1,0x0d,0x98, 0x1e,0x36,0x60,0x0f,0x95,0xe9,0x02,0x0b,0x88,0x0e,0x44,0x9c,0x06,0x95,0x60,0xcb, 0x28,0x3c,0x01,0x38,0xc8,0x00,0x0a,0x14,0x40,0x0e,0x64,0x42,0x29,0x50,0x41,0x6d, 0x10,0x01,0x06,0xa4,0xc4,0x4f,0x78,0x58,0x07,0x94,0x00,0x04,0xd2,0xc9,0x30,0xd5, 0x51,0x02,0x6c,0x41,0x35,0x7c,0xc0,0x02,0x90,0x4e,0xad,0xa1,0x45,0x04,0x6e,0xc6, 0x6c,0x75,0x43,0x2a,0x48,0x41,0x28,0x96,0x42,0x01,0xfa,0x5d,0x27,0xf8,0xc0,0x34, 0x9c,0xe2,0x34,0x74,0x42,0x26,0x2c,0xc2,0x1a,0xd0,0xc0,0x2b,0xe8,0x41,0xfe,0x3c, 0x2c,0x40,0x12,0xde,0x43,0xeb,0x30,0xc6,0x94,0xd4,0x89,0xc1,0xb0,0x80,0x07,0x94, 0x40,0x39,0xa4,0x42,0x03,0x2c,0x44,0xe3,0x70,0x00,0xdd,0x3d,0x60,0x02,0x19,0x00, 0x06,0xb0,0x40,0x88,0x18,0x86,0xd5,0x3d,0x84,0x8a,0xc1,0xd0,0x3c,0xdc,0x03,0x0f, 0x1c,0x43,0xd2,0x89,0x82,0x9c,0x4c,0x82,0x04,0xe0,0x0f,0x68,0x29,0x86,0x06,0x94, 0xc0,0x1e,0x88,0x61,0x00,0xd4,0x91,0x42,0xe5,0x88,0x01,0x78,0x88,0x06,0x1a,0x54, 0xc1,0xed,0x41,0x4d,0xa0,0x42,0x04,0xac,0x80,0x02,0xec,0xc0,0xe6,0xed,0x0b,0x36, 0x34,0x42,0x06,0x2c,0x03,0x04,0xa0,0x82,0x33,0xa8,0x8b,0x1e,0xc2,0xcf,0x2a,0x49, 0x4c,0x06,0x30,0x43,0x01,0xdc,0x00,0x15,0x54,0x41,0x27,0x34,0x81,0x14,0x64,0x02, 0x11,0xdc,0x41,0xd3,0xac,0x80,0x3c,0xac,0xc0,0x04,0x2c,0xc0,0x4b,0x40,0x62,0x31, 0xc6,0x59,0x02,0x20,0xd6,0x05,0x7c,0x0d,0xe9,0xbc,0x4f,0xc2,0x04,0x40,0x22,0xdd, 0xc3,0x31,0xec,0x81,0x43,0x50,0x9f,0x2e,0x0c,0x00,0x28,0xec,0x87,0x26,0x5c,0xc2, 0x27,0x18,0xa2,0x2a,0xc4,0x01,0x15,0x04,0x97,0x14,0x98,0x02,0x14,0x30,0x42,0x39, 0x98,0x83,0x33,0xb8,0x8f,0x13,0x8c,0xc2,0x0f,0x18,0x8c,0x18,0x5e,0x0d,0xbb,0xdc, 0x03,0x03,0x0c,0x01,0x0a,0x34,0x03,0x4d,0x5e,0x00,0x3d,0xd0,0x83,0x32,0x48,0x82, 0xc1,0xe8,0xd1,0x16,0x38,0x41,0x8b,0x0d,0x86,0x0a,0x38,0xc1,0x14,0xa8,0x98,0x0a, 0x4c,0x42,0x04,0x74,0xc0,0xe4,0xac,0x80,0x3a,0x94,0x00,0x7a,0xe9,0xfe,0x43,0x04, 0x80,0x4d,0x5d,0xf4,0xdc,0x1d,0xcd,0x51,0x9c,0xb1,0x88,0xc2,0x18,0xc0,0x79,0xd5, 0x19,0xc4,0xe4,0x60,0x4f,0xa9,0x83,0x00,0x44,0x80,0x2e,0x28,0x41,0x0d,0x68,0x05, 0x38,0x28,0xe0,0x0f,0xd0,0x96,0xaf,0xb5,0x97,0xe2,0x5c,0xc0,0x3d,0x34,0xc7,0x02, 0x78,0x99,0x48,0xce,0xc1,0x27,0x24,0x99,0x1c,0xa8,0xc2,0x34,0x80,0xc2,0x2e,0x79, 0x80,0xba,0x75,0x00,0x2a,0x98,0x83,0x04,0x84,0x25,0x0c,0x4d,0x81,0x01,0x28,0x93, 0x1d,0x41,0x80,0x03,0x5c,0x80,0x0a,0x64,0x9d,0x46,0xda,0xd1,0x06,0x34,0x83,0x06, 0x14,0x14,0x38,0x2a,0x43,0x03,0x4c,0xc2,0x28,0xf4,0x94,0x3b,0x08,0x43,0x13,0xf8, 0x41,0x0f,0xe0,0x82,0x1c,0xc8,0x81,0x49,0xf2,0x41,0x20,0x30,0x02,0x3b,0x88,0x8e, 0x13,0xa8,0x43,0xe1,0x4c,0x81,0x0a,0xe8,0x83,0x12,0xd0,0x4d,0xc2,0x18,0x94,0x69, 0x4c,0x41,0x00,0x61,0x08,0x3c,0xc8,0xcf,0xdb,0x04,0x50,0x9d,0x00,0x27,0x1d,0xfd, 0x0f,0x88,0x10,0x10,0xb3,0x50,0x22,0x89,0x41,0x40,0x83,0x50,0xc0,0x06,0x4c,0x00, 0x2f,0x84,0xd8,0x71,0x40,0x40,0x33,0x6c,0x41,0xd8,0xd4,0x83,0x62,0xb0,0x48,0x41, 0xe9,0xca,0x3c,0xb4,0x88,0x3d,0x50,0xdf,0x2a,0xdc,0x10,0x38,0x2e,0x5b,0xc4,0xb0, 0x52,0x3d,0xe9,0x42,0x07,0x34,0xc2,0x48,0xec,0x00,0x49,0x6c,0x40,0x06,0x08,0x00, 0x39,0x94,0x80,0x28,0x40,0x0c,0x7a,0xbd,0xd9,0x37,0x2c,0x80,0x32,0xec,0xc1,0x10, 0x4c,0xc0,0x07,0xa0,0xc0,0xcb,0x48,0xc1,0x2c,0x74,0x42,0x34,0xfe,0xc4,0x40,0x23, 0xbc,0xe7,0x0a,0xb0,0xa5,0x02,0x38,0x16,0x0f,0x98,0x0e,0x0c,0xdd,0x83,0xd6,0x6c, 0xe2,0x16,0xcc,0x83,0x84,0x3e,0x1e,0x86,0x04,0x40,0xbf,0x41,0xe3,0x3d,0xa0,0xa1, 0x52,0xee,0x4e,0xd5,0x0c,0xe7,0x05,0x8c,0xc2,0x30,0xb0,0x03,0x28,0x24,0x02,0x1f, 0x24,0x02,0x20,0x30,0x42,0x3c,0x98,0x83,0x08,0x28,0xcc,0x03,0x7c,0xd2,0x14,0x30, 0x84,0xcf,0x31,0x80,0x16,0x3c,0xc1,0x89,0xe9,0xca,0x43,0x98,0x85,0x8e,0xec,0x11, 0xb5,0x64,0x5d,0x26,0xd6,0x51,0xb3,0xc8,0x05,0x61,0x18,0x06,0x66,0xbd,0xc5,0x0e, 0x88,0x55,0x0e,0x04,0xd6,0x1e,0x4c,0x17,0x07,0x3c,0xe7,0x75,0x92,0x48,0x3a,0x60, 0x96,0x13,0x50,0x62,0x77,0x82,0xe3,0x3d,0x50,0xdf,0x1e,0x84,0x43,0xd6,0xc8,0xc9, 0xae,0xf0,0x0a,0x8f,0xc0,0x00,0x31,0xb0,0x40,0xf7,0x78,0xc0,0x06,0x00,0x0a,0xa2, 0xe5,0xc0,0x13,0xac,0x00,0x0b,0x50,0x43,0x56,0xa2,0x57,0x65,0xe1,0x68,0xdd,0xe8, 0x03,0x0f,0xb0,0x80,0x3c,0x2c,0xc3,0xb8,0x7c,0x80,0x0f,0xc8,0x41,0x19,0x80,0xc3, 0x07,0x80,0xc0,0x09,0x14,0x88,0x77,0x78,0xc0,0x30,0x0e,0xa1,0xae,0x38,0xc1,0xae, 0xd0,0xe7,0x78,0x16,0x2a,0x1d,0xed,0x51,0xf3,0xcd,0x9a,0x06,0x3a,0xaa,0x84,0x42, 0xe6,0x58,0x3a,0xe6,0x43,0x40,0x80,0x2b,0x00,0x81,0x11,0x98,0x80,0x15,0x94,0xc6, 0x43,0xbc,0x0d,0xd7,0x2d,0x00,0x60,0x3c,0x40,0xd3,0xf1,0x80,0x24,0xd0,0x1a,0xad, 0x29,0x14,0x31,0x35,0x46,0x79,0x96,0xce,0x85,0x82,0x63,0xfe,0x1d,0xfd,0x4f,0x3b, 0xa4,0x4d,0x5d,0xc8,0x5a,0x06,0x70,0x43,0x0e,0x80,0x00,0x28,0xed,0x01,0xe3,0xec, 0x01,0x0b,0xec,0x40,0x03,0x68,0x80,0x15,0x56,0x5d,0xac,0x29,0x46,0xa9,0xbe,0x0f, 0x0c,0x68,0x0b,0x35,0xec,0x41,0x64,0x48,0x8d,0x45,0x3c,0x8c,0x5a,0x88,0xc0,0x0a, 0x7c,0x40,0x0d,0xc0,0xc1,0x0f,0x14,0xca,0x0a,0x28,0x1a,0x06,0x50,0x80,0x12,0x00, 0x0e,0x3e,0x0e,0x9f,0x1e,0x4e,0x89,0xb1,0xce,0x0b,0x35,0x08,0x00,0x35,0x6c,0x5f, 0x39,0x4c,0x83,0x26,0x64,0x42,0x01,0x7c,0xc0,0x13,0xbc,0x86,0x81,0xc8,0x03,0x0b, 0x60,0xa5,0x4e,0xe9,0xd1,0xd7,0x18,0x93,0x43,0x44,0x5e,0xa2,0x96,0x6a,0x89,0x61, 0x96,0x52,0xd6,0x1a,0x89,0x61,0xd6,0xd7,0x78,0x48,0xa1,0xe6,0x65,0xde,0x28,0x80, 0x1b,0x4c,0x83,0x1b,0x28,0x01,0x0c,0xc4,0x50,0x7b,0x05,0x00,0x04,0x68,0x01,0x31, 0x60,0xc8,0x8a,0x11,0xa9,0x53,0x12,0x13,0x32,0x99,0x0e,0x03,0xd0,0x83,0x3e,0x7c, 0xcd,0xbe,0xf2,0xeb,0xfc,0xe8,0x5a,0x72,0x5a,0x5d,0x3a,0x38,0xc0,0x2d,0x8c,0x8b, 0x9a,0x06,0x1f,0x85,0x35,0x03,0x11,0x84,0x00,0x0c,0xdc,0x83,0x60,0x34,0xa5,0x62, 0xbc,0x45,0xa1,0x56,0x8b,0x5a,0xd4,0xcd,0x79,0x70,0x40,0x03,0xa4,0xda,0xcc,0x29, 0x29,0x52,0x9a,0x08,0x0b,0x34,0xc3,0x13,0xb8,0x41,0x01,0x34,0xc2,0x0a,0x44,0x80, 0x02,0x3c,0x41,0xfa,0x81,0x80,0x2e,0x08,0x80,0x74,0x3d,0x04,0xfc,0x68,0x1d,0x95, 0x4c,0x02,0x5f,0xee,0x41,0x3d,0x4d,0xc0,0x85,0x09,0xfe,0x43,0x11,0xc8,0x41,0x29, 0x44,0x43,0x0d,0x9c,0x44,0x23,0x9c,0x00,0x04,0x64,0x4b,0x87,0x95,0x80,0x3a,0x68, 0xe4,0xe3,0xed,0x9f,0x24,0xd0,0xa4,0xa2,0xd2,0xda,0x5b,0x48,0xa8,0x5b,0xd8,0x51, 0x89,0x95,0x6a,0xa9,0x7a,0xa7,0x52,0xde,0x11,0x3e,0x20,0xe3,0xca,0xa9,0x83,0xf6, 0x88,0x8e,0xe2,0x34,0x86,0x03,0x90,0x2a,0x03,0xbc,0x2d,0x5c,0xdc,0x08,0x66,0x25, 0x00,0x77,0xb6,0x6a,0x00,0x78,0x00,0x65,0x12,0x43,0x54,0x3a,0x25,0x38,0x9e,0x0d, 0xfd,0x14,0x10,0x88,0x11,0x0e,0x31,0x70,0x40,0x07,0xbc,0x5d,0x9a,0x8e,0xc2,0x2a, 0x24,0x2b,0x35,0x3c,0xc1,0x13,0xa4,0xd2,0x3c,0xe0,0x80,0x8b,0x11,0xe9,0x9c,0xbd, 0xcd,0x05,0xdc,0xc9,0x9b,0x4c,0x80,0x00,0x2c,0x83,0x2e,0xb0,0xee,0x42,0x0e,0x63, 0x5e,0x3a,0x84,0x28,0x94,0x40,0x03,0xb0,0x5f,0x39,0x2c,0xa4,0x4c,0xad,0x50,0x77, 0x5c,0x90,0xba,0x50,0x89,0x94,0x64,0x84,0x84,0xd5,0x84,0x00,0x40,0x40,0x7a,0x92, 0xe0,0x27,0x5c,0x42,0x18,0xcc,0x01,0x06,0x80,0x03,0x35,0xa5,0x29,0xe1,0x8c,0xc2, 0x1e,0xf0,0x40,0x87,0x3c,0x1e,0x44,0x74,0x80,0x07,0x84,0x58,0xc2,0x50,0x8b,0x41, 0x81,0x2e,0x14,0x3a,0x25,0x91,0x92,0x18,0x89,0x25,0x40,0x02,0x44,0xe9,0x02,0x28, 0xd6,0xab,0x5d,0x80,0x84,0x81,0x46,0xfa,0x90,0x57,0x9b,0xcc,0x91,0x94,0x72,0x16, 0x88,0xa4,0xc3,0xe0,0xda,0x11,0x5a,0xc0,0x83,0xab,0xaa,0xc0,0x02,0x6c,0xc1,0x05, 0xe9,0x2b,0x8b,0x7c,0x08,0xda,0x4c,0xc2,0x09,0xfe,0xb8,0x81,0x1e,0xa0,0x00,0x5a, 0x81,0x80,0x4d,0x79,0xc0,0x0a,0x7c,0x07,0x0b,0x38,0x00,0x39,0xe4,0x6d,0x0e,0x00, 0x19,0x0c,0x6c,0x41,0x88,0xf8,0xc5,0x1c,0x29,0x65,0xf3,0xc5,0x96,0xeb,0x48,0x42, 0x3a,0xb2,0xc0,0x31,0x60,0xeb,0x18,0x28,0x80,0x3d,0x91,0x0c,0x56,0x9a,0x85,0x69, 0x5c,0x00,0x31,0xa8,0xc3,0x31,0xf4,0xa9,0x04,0x48,0xdb,0x04,0xe8,0xc2,0x85,0xb1, 0x80,0xe0,0xc8,0x96,0x32,0xa8,0x4b,0x07,0xc1,0x00,0x5f,0x2e,0x00,0x2f,0xf4,0x04, 0xa4,0x6c,0xc0,0x7e,0x74,0x82,0x1e,0xa8,0xc2,0x1c,0x00,0x0a,0x28,0xa8,0xeb,0x04, 0x58,0x08,0x2c,0x31,0x2d,0xa1,0x0e,0x87,0x32,0x8c,0x6d,0x88,0x3d,0x60,0x26,0xde, 0xc3,0x3e,0x5c,0x56,0x89,0x29,0x06,0x88,0x04,0xa9,0x61,0xa4,0xc3,0x15,0xab,0x80, 0x3d,0x04,0x8f,0x24,0x7c,0xa8,0xb7,0x12,0xa1,0x92,0x62,0xc4,0x37,0x1e,0xe7,0xe0, 0xc6,0x9a,0x84,0xda,0x03,0x44,0x78,0x88,0x5b,0x28,0x06,0x03,0xc0,0x85,0x52,0x6a, 0xe8,0x71,0x76,0x56,0x3c,0x50,0x41,0x19,0xcc,0x02,0x38,0x34,0x02,0x75,0xb0,0x51, 0x4a,0x54,0x6f,0xaa,0xc9,0x43,0x04,0x64,0x40,0x39,0xec,0x41,0x07,0x01,0xe9,0x05, 0xf0,0xc2,0x28,0xc8,0x03,0x0f,0x4c,0x02,0x5e,0x1e,0x47,0xdd,0xe4,0x96,0x07,0x8c, 0xc2,0x06,0x7b,0x80,0xdf,0x18,0x48,0x07,0x28,0x4d,0x09,0xd0,0x83,0xc1,0xc8,0x6e, 0xde,0x12,0xc0,0xf0,0x46,0x40,0x78,0x64,0xc0,0xa3,0x38,0x00,0x3e,0x96,0x40,0x87, 0xf1,0x80,0x74,0x45,0xed,0x1e,0xf8,0x54,0xfe,0x4b,0x44,0x99,0x12,0x2c,0x82,0x2b, 0xb8,0x42,0x25,0x50,0x41,0x37,0x80,0x40,0x23,0x98,0x1d,0x37,0xfc,0x80,0x00,0x18, 0x80,0x32,0x40,0xc0,0x1e,0x10,0x8e,0x32,0x31,0x00,0x08,0xcc,0x81,0x12,0xe4,0xe2, 0xe1,0x68,0x80,0xfe,0x80,0xc3,0x0a,0xc8,0x8f,0xbe,0xc2,0x6c,0x5f,0x5c,0xf1,0xd2, 0x75,0x8d,0xd5,0xd9,0x03,0xe5,0xa8,0x9a,0x32,0xd0,0x53,0x38,0x40,0xb0,0x62,0x18, 0xeb,0x0e,0x0e,0x1c,0xb0,0x08,0xeb,0x13,0xaa,0x00,0xa3,0xbc,0xed,0xff,0x1c,0xe7, 0x13,0x9e,0xe1,0xc4,0x36,0xcb,0x05,0x4c,0x43,0x99,0x81,0x42,0x41,0x70,0xc7,0x06, 0xdc,0x42,0x33,0x1c,0x26,0x4b,0xc0,0xc4,0x10,0x6c,0x40,0x37,0xcc,0xc9,0x24,0xf8, 0xd1,0x16,0xbc,0x89,0x00,0xb0,0x51,0x35,0x38,0x40,0x59,0x34,0x07,0xb6,0xf0,0x80, 0x00,0x34,0xc3,0x00,0xc8,0xcb,0x2a,0xa0,0x0a,0xde,0xb9,0xc3,0x0a,0xcc,0x12,0x07, 0x24,0xf2,0xf0,0x9d,0x2e,0xce,0x32,0x16,0x04,0xac,0x90,0x31,0xb0,0xc0,0x10,0x2c, 0x80,0x28,0x4c,0x82,0x03,0x08,0xef,0x34,0x66,0xcb,0x1e,0x90,0x6b,0xa4,0x88,0x8c, 0x12,0xa4,0x02,0x2e,0xf8,0x41,0x22,0x2c,0x02,0x22,0x28,0xc0,0x06,0x24,0x99,0x30, 0x3c,0xc1,0x51,0x1a,0x9c,0x7c,0x96,0xc0,0x26,0x3e,0xc0,0x1e,0x38,0x00,0xd5,0x70, 0xc8,0x96,0x8a,0xc0,0x18,0x34,0x42,0xfd,0xae,0xad,0x52,0x6e,0xac,0x1d,0x25,0xc0, 0x3c,0x18,0x90,0x61,0x6c,0x01,0x03,0x7c,0x40,0x19,0xb0,0xc3,0x0f,0x10,0x00,0x0b, 0x0c,0x80,0x22,0x4e,0x42,0x05,0x24,0xfe,0xc0,0x05,0x2c,0x83,0xfb,0x28,0x14,0xcc, 0xae,0x58,0x5f,0xc0,0x85,0x0a,0x48,0x42,0x01,0x94,0xc3,0x02,0xe8,0xab,0xe0,0x0e, 0xab,0x01,0x38,0xc3,0x1e,0xb1,0x2d,0x0e,0x8c,0x41,0x18,0x4c,0x43,0x2a,0x8c,0xc1, 0x13,0x28,0xc1,0x98,0x8e,0xe9,0x81,0xfa,0xb1,0x3c,0x48,0x44,0x39,0xc4,0x83,0x53, 0x82,0xda,0x16,0xec,0xc3,0x10,0xe8,0xc2,0x13,0xc8,0x47,0x84,0x34,0x83,0x47,0x65, 0x0b,0x08,0x1d,0xc3,0x0f,0x80,0x42,0x09,0xdc,0x4d,0x07,0x80,0x40,0x15,0x40,0x51, 0x3c,0x00,0x15,0x07,0x64,0xe5,0x43,0x2c,0x32,0xce,0xc2,0xc6,0x98,0x7e,0x97,0x31, 0x2c,0x6d,0x9d,0x64,0xdf,0x5b,0x43,0x80,0x00,0x78,0x19,0x49,0xf9,0xb1,0x07,0xbc, 0x86,0x1b,0x50,0xc1,0x27,0xf8,0x80,0x14,0x68,0x81,0x12,0x80,0x00,0xfb,0xa5,0x82, 0x23,0x76,0x23,0x39,0xec,0xf2,0x10,0x6c,0x69,0xe4,0x4d,0xea,0x31,0x19,0x6b,0xfd, 0x7a,0x2f,0x51,0x3b,0x01,0xcc,0xb6,0xc8,0xd4,0x55,0x9d,0xdb,0xe4,0x80,0x30,0x24, 0xed,0x04,0xe4,0xcd,0x2d,0x1c,0x6d,0xb2,0x3c,0x80,0x07,0x04,0x10,0xfc,0xe4,0x0a, 0x5c,0xc4,0xaf,0x15,0x3a,0xcb,0x5b,0x04,0x00,0x07,0xf0,0x80,0xbf,0x8a,0xb5,0x62, 0x3c,0x80,0x3a,0x4c,0x82,0xbf,0x3a,0xc1,0x05,0x74,0x42,0x27,0xc8,0x40,0xf2,0x26, 0x6d,0x08,0x88,0xcc,0xa4,0x50,0xb4,0x3c,0xcc,0x94,0x03,0x88,0x80,0x30,0x40,0x00, 0x0e,0xc0,0x43,0x72,0x19,0xd4,0x06,0x83,0x44,0x3c,0xb5,0xf0,0x28,0xa8,0x83,0x39, 0x40,0xaf,0x00,0x40,0x2b,0x15,0xfe,0x5c,0x89,0xb8,0x96,0x54,0x3d,0x6b,0x41,0x37, 0x1c,0x2d,0x3e,0x1c,0x25,0x71,0x84,0xa7,0x21,0x1f,0xa6,0xe5,0x36,0x0d,0x04,0xc8, 0x70,0x46,0x08,0x80,0xe4,0xe8,0x02,0x28,0x3d,0xd6,0x0a,0xa5,0xe7,0x91,0x4c,0xc3, 0x25,0xc8,0xc1,0x69,0xfb,0x40,0xde,0xd5,0x40,0x26,0x80,0xc2,0x32,0x5c,0x4b,0x7e, 0x76,0xc0,0x2a,0x64,0x43,0xaa,0xda,0xe8,0xfb,0xd0,0x10,0x93,0xa0,0x08,0xe9,0x98, 0x98,0x8a,0xed,0x76,0xd3,0x99,0xce,0x6e,0x57,0x5d,0xc3,0xee,0x40,0x34,0x1c,0x70, 0x39,0x34,0x42,0x09,0x7c,0xc3,0x10,0x28,0x41,0x00,0xa4,0x43,0x00,0x8c,0xc0,0x3c, 0xc4,0xee,0xab,0x31,0x80,0x42,0x11,0x94,0x0a,0xdc,0x05,0xdc,0xca,0x0f,0xe3,0x66, 0xf5,0xb4,0x54,0x8d,0x8a,0xb9,0xed,0x31,0x94,0x81,0x40,0xc0,0x01,0x58,0x1c,0xb0, 0x2e,0x1c,0x83,0xe1,0x71,0x86,0x4c,0x49,0xc8,0x04,0xc8,0xc0,0x24,0x5c,0x80,0x3e, 0x78,0xd8,0x9c,0xac,0x82,0x4c,0x61,0x40,0xe2,0x1a,0xab,0x33,0xe8,0x03,0x2a,0x3b, 0x40,0x06,0xfc,0x40,0x2a,0x44,0x41,0x0d,0x87,0x83,0x04,0x34,0x02,0x1c,0x14,0x00, 0x37,0xc8,0xc0,0xc1,0x2a,0x81,0x04,0xa8,0xd2,0x69,0x44,0x2d,0xd4,0x78,0xc0,0x08, 0x1c,0x83,0x12,0x8c,0x81,0xf8,0xc4,0x11,0x2f,0x90,0x83,0x64,0x44,0x00,0x98,0x79, 0x40,0x38,0x84,0xa9,0x81,0x7c,0x4c,0x33,0x68,0x01,0x0a,0x50,0x01,0x2e,0xe0,0x42, 0x1c,0x34,0xc2,0x32,0xb0,0x43,0x18,0x34,0x02,0x07,0x60,0x19,0x3c,0x94,0xc0,0x45, 0x9b,0xc3,0x37,0x08,0xc7,0xfe,0x89,0x5f,0x55,0x0c,0x35,0x06,0x7d,0x2a,0xcc,0xd4, 0x65,0x96,0xe9,0xe4,0x88,0x70,0x00,0x69,0x3a,0xd0,0x83,0x12,0xb8,0x01,0x0a,0x40, 0x00,0x1b,0x13,0xc3,0xd7,0x68,0x00,0x0c,0x78,0x00,0x3e,0x24,0x80,0x06,0x0c,0xc1, 0x3e,0xbc,0x8d,0x54,0xc1,0x83,0x87,0x74,0x2f,0xd3,0xd5,0xc3,0x16,0xb4,0x05,0xbf, 0xfe,0x68,0xb3,0x08,0x6e,0xb0,0xe1,0x2f,0xbf,0x1d,0x35,0x21,0xa2,0x40,0x39,0xec, 0x86,0x52,0x79,0x00,0x01,0x64,0xd8,0x81,0x88,0x36,0x5c,0x76,0x03,0x14,0xe5,0x48, 0xe9,0xb2,0x8f,0x9b,0xac,0x30,0x85,0xd4,0x1e,0x39,0xf8,0x54,0x06,0x74,0x43,0x14, 0x00,0x81,0x3a,0x2c,0x83,0x12,0x28,0x6f,0x01,0x54,0x01,0x06,0x34,0x42,0x0e,0xa0, 0x80,0x30,0x7c,0x00,0x9f,0x9b,0x45,0x44,0x5c,0x09,0x2f,0xc8,0x94,0x07,0x28,0x41, 0x32,0xec,0xc0,0x18,0x94,0x1a,0x04,0x20,0xb2,0x93,0x38,0xc0,0x0f,0xe4,0xdd,0x04, 0xf8,0x04,0x50,0x55,0x8a,0x0c,0xf0,0x5d,0x1c,0x24,0x82,0x2a,0xb0,0x83,0x2e,0xc4, 0x43,0x2a,0x4c,0xc8,0x7d,0xa3,0x0b,0x2f,0xfc,0x40,0x38,0xc4,0xdd,0x6c,0xd7,0x1a, 0x0c,0x99,0xce,0x64,0x69,0x1d,0x86,0x34,0x28,0x56,0xbd,0x0d,0x86,0x84,0x6f,0x05, 0x04,0xc0,0x10,0x50,0x0e,0xf2,0xd2,0xc3,0x5d,0x88,0x42,0xb4,0x30,0x80,0x33,0xfc, 0xc0,0x10,0x04,0x80,0x39,0x8c,0x00,0x0b,0x70,0xa7,0xfb,0x0c,0xae,0x0a,0xc0,0x6a, 0xfc,0xc6,0x6c,0x54,0x7a,0x1f,0xb3,0xc4,0xda,0x1e,0x00,0xae,0xa9,0xaa,0xc0,0x31, 0xbc,0xa0,0x30,0x30,0xfe,0x03,0x05,0x64,0xc3,0x01,0x67,0xc0,0x26,0x67,0xc0,0x09, 0xb4,0xd5,0x2c,0x55,0xc5,0x2c,0xb8,0x83,0xe0,0x96,0x98,0x43,0x48,0x82,0x3a,0xe8, 0x05,0x04,0x4c,0x80,0x2b,0xf1,0xa5,0x03,0xc8,0x03,0x08,0x2c,0x02,0x23,0x8c,0x01, 0x26,0x15,0x40,0x0b,0x60,0x00,0x33,0x30,0x03,0x06,0x0c,0x03,0x3e,0xc5,0x43,0xa9, 0x2c,0x83,0x3e,0x40,0x44,0x93,0x4c,0x42,0xe1,0xb9,0x35,0x05,0x74,0x83,0x1d,0x47, 0x40,0xe0,0xaf,0xa8,0xe9,0xae,0x82,0x12,0x94,0x01,0x0a,0x64,0x83,0x78,0xb8,0xf9, 0xe4,0x80,0x42,0x41,0x22,0x42,0x19,0xc4,0xc1,0x36,0x7c,0x00,0x3b,0xcc,0xc1,0x3c, 0x8e,0x85,0x73,0x70,0x00,0x28,0xec,0x80,0x1b,0xe8,0x24,0x42,0xf1,0xe8,0x3c,0x44, 0xe2,0x43,0xdc,0x83,0xea,0xbc,0xcd,0xc1,0x24,0x5e,0x6f,0x53,0x22,0x3e,0x84,0xc0, 0x53,0x63,0x00,0x0a,0x74,0x00,0x03,0x50,0x64,0x55,0xf2,0x40,0x98,0x43,0x0e,0x0f, 0xc0,0x80,0x3a,0xcc,0x81,0x39,0x70,0x67,0x9b,0x7c,0x8d,0x52,0x3a,0x0b,0x94,0x06, 0x6e,0xcc,0x02,0xa9,0xe0,0x0a,0xbd,0x53,0x2a,0x94,0x28,0x80,0x83,0x29,0xba,0x4a, 0xb6,0x86,0x4c,0x81,0x44,0x80,0x31,0xe8,0x82,0x57,0xac,0xeb,0x6c,0x68,0x82,0x00, 0x24,0x80,0xac,0x75,0x77,0xeb,0xec,0xc1,0x05,0xdc,0x2c,0x82,0x92,0x03,0x35,0xa3, 0x02,0xad,0xf6,0x00,0x54,0x8d,0x2d,0x0b,0x78,0x4b,0x0e,0xb4,0x00,0x2d,0x44,0x45, 0x36,0xb0,0xae,0x16,0xc4,0xc0,0x31,0xec,0x14,0xb6,0xec,0x81,0x3c,0xcc,0x12,0x08, 0xdc,0x41,0x15,0xfe,0x34,0x42,0x78,0x94,0x5a,0x29,0x17,0x1e,0x28,0xb0,0x41,0x25, 0x00,0x04,0xb8,0x0c,0x12,0x32,0x28,0xa1,0x90,0xa3,0xd3,0xa5,0x69,0x05,0x50,0x64, 0xda,0x96,0xe3,0xc7,0x00,0x25,0x04,0xa8,0xc9,0x93,0x47,0x6d,0xc8,0xb4,0x4c,0x3e, 0x88,0x49,0x72,0x32,0xe5,0x41,0xc8,0x00,0xf3,0x9c,0x68,0xb8,0xa0,0x01,0x06,0x8c, 0x29,0xa2,0x18,0xb4,0xbc,0x70,0x61,0x4a,0xcc,0x07,0x4e,0x54,0xa8,0xb8,0xe0,0x01, 0x43,0x0e,0x0a,0x0a,0x72,0x7c,0x50,0x66,0x60,0x08,0x8b,0x10,0x03,0x88,0xc5,0x14, 0x01,0xc3,0x81,0x04,0x18,0xd3,0xca,0xb0,0x70,0xf2,0xd4,0x09,0xc9,0xa7,0x2a,0x70, 0xe0,0xa8,0x59,0x73,0x0b,0xd5,0x2d,0x59,0xab,0x52,0xed,0x6a,0x35,0x41,0x02,0x0f, 0x44,0xca,0xf8,0xe0,0x06,0x71,0x83,0x07,0x5d,0x13,0x56,0x44,0x10,0x20,0xe0,0x49, 0x0b,0x38,0x35,0x84,0x75,0x92,0xa2,0x6f,0xca,0x96,0x79,0x0c,0x2e,0x38,0x2b,0x31, 0x09,0x9e,0x39,0x75,0x17,0x4a,0x0c,0x81,0x20,0x61,0xd5,0x28,0x79,0x20,0x6e,0x3c, 0x81,0x37,0x85,0x81,0x39,0x73,0x7b,0xd4,0x1d,0xfb,0x50,0xc0,0x4d,0x0e,0x0c,0x1e, 0x3a,0x48,0x5c,0xc1,0x42,0x9d,0xb2,0x3d,0x7b,0x56,0x71,0x80,0xe0,0x61,0x82,0x87, 0x63,0x2b,0x04,0x48,0x90,0xb0,0xc2,0xc3,0x86,0x27,0xdb,0x32,0xb9,0xe2,0xe4,0xe6, 0x58,0x84,0x0e,0x1b,0x7e,0xec,0x98,0x56,0x4a,0x46,0xb2,0x39,0xd3,0x1e,0x82,0x30, 0x68,0x4d,0xc9,0x8a,0x8b,0xba,0xa6,0xc9,0xb9,0x01,0x21,0xc2,0x03,0x06,0x90,0xf3, 0x06,0x08,0x7b,0x30,0x45,0xc3,0x82,0x12,0xf0,0x4c,0xc6,0x9c,0x62,0x40,0x92,0x86, 0x07,0x1a,0xa6,0x38,0xc9,0xca,0x22,0x47,0x8d,0x31,0x4a,0x32,0x80,0xd0,0xf7,0x60, 0xde,0x31,0x0d,0x5b,0x34,0xc0,0x53,0x31,0xef,0xc2,0xa4,0x49,0xcd,0x56,0xcd,0x61, 0xc4,0xc6,0x1d,0x7a,0xd2,0x31,0x2f,0xaa,0xac,0xae,0x32,0xd0,0xbc,0xab,0xbc,0xda, 0x22,0x9d,0xaa,0xba,0x4a,0x40,0x94,0x0f,0x84,0x29,0x23,0x95,0x3b,0x30,0xf8,0x61, 0x03,0x5d,0x0e,0x33,0x66,0x88,0x21,0x38,0x10,0x00,0x83,0x6d,0xe6,0xf0,0xe1,0x13, 0x61,0x54,0x92,0x6e,0x0a,0x62,0x9c,0x81,0x81,0x1c,0x18,0xe8,0x19,0x85,0x82,0x63, 0x56,0x81,0xe0,0x16,0x16,0xd8,0x9a,0x63,0x0c,0x11,0x1e,0x98,0x22,0x20,0x00,0x3b }; /* created by reswrap from file big_gif.gif */ extern const unsigned char big_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x20,0x00,0x20,0x00,0xf7,0x00,0x00,0x1c,0x06,0x04, 0x94,0x86,0x7c,0xd4,0xc6,0x9c,0x64,0x46,0x34,0xc4,0xa6,0x74,0x74,0x66,0x5c,0x3c, 0x26,0x1c,0xec,0xe6,0xcc,0xcc,0xb6,0x84,0xb4,0x8a,0x5c,0x5c,0x32,0x24,0x84,0x52, 0x34,0xe4,0xd6,0xb4,0x94,0x66,0x44,0x74,0x56,0x3c,0x2c,0x16,0x0c,0xd4,0xb6,0x94, 0xb4,0x9a,0x6c,0x54,0x36,0x24,0x94,0x7a,0x64,0xdc,0xca,0xb4,0xf4,0xf6,0xec,0xc4, 0xae,0x7c,0x4c,0x26,0x1c,0xac,0x96,0x74,0x5c,0x3e,0x2c,0xc4,0xa2,0x74,0xe4,0xde, 0xcc,0x6c,0x5e,0x54,0xdc,0xce,0xa4,0x74,0x46,0x2c,0xd4,0xbe,0x94,0xbc,0xa2,0x74, 0xa4,0x76,0x4c,0x1c,0x0e,0x0c,0xa4,0x86,0x64,0xf4,0xee,0xdc,0x3c,0x1a,0x14,0xcc, 0xbe,0xac,0xb4,0x9a,0x7c,0x4c,0x2e,0x1c,0x6c,0x3e,0x24,0xa4,0x8e,0x6c,0xdc,0xc6, 0x9c,0xbc,0xa6,0x84,0x84,0x76,0x6c,0xb4,0x92,0x64,0x84,0x62,0x44,0xec,0xda,0xbc, 0x94,0x6e,0x4c,0xc4,0xb2,0x94,0x74,0x4e,0x34,0xd4,0xbe,0xa4,0xa4,0x7e,0x54,0xc4, 0xb6,0x9c,0x7c,0x56,0x34,0xfc,0xfe,0xf4,0x24,0x0a,0x04,0x44,0x2e,0x24,0xdc,0xd6, 0xc4,0x6c,0x5a,0x4c,0x34,0x1e,0x14,0xbc,0x9a,0x6c,0x54,0x3e,0x2c,0xe4,0xd2,0xb4, 0x64,0x3e,0x24,0x7c,0x5e,0x44,0xfc,0xf2,0xe4,0x54,0x2e,0x1c,0xbc,0x92,0x64,0xac, 0x7e,0x54,0x84,0x66,0x44,0x44,0x26,0x14,0xf4,0xe6,0xd4,0x5c,0x3a,0x24,0x34,0x16, 0x0c,0xfc,0xf6,0xec,0xcc,0xae,0x7c,0xec,0xde,0xc4,0x2c,0x0e,0x0c,0x3c,0x22,0x14, 0xa4,0x8e,0x74,0xdc,0xc6,0xac,0xc4,0xa6,0x84,0x9c,0x6e,0x4c,0x7c,0x4e,0x34,0x1c, 0x0a,0x04,0x6c,0x46,0x2c,0x84,0x5a,0x3c,0xd4,0xba,0x9c,0x54,0x3a,0x34,0x9c,0x7e, 0x5c,0xe4,0xce,0xb4,0xe4,0xce,0xac,0xd4,0xc2,0x94,0xac,0x86,0x5c,0xf4,0xf2,0xec, 0xbc,0x9e,0x7c,0xb4,0x96,0x74,0x94,0x62,0x44,0xdc,0xc2,0xa4,0xcc,0xb6,0x94,0xbc, 0x9e,0x6c,0x7c,0x62,0x44,0x8c,0x66,0x44,0x44,0x26,0x24,0xfc,0xfa,0xec,0xec,0xe2, 0xd4,0xd4,0xc6,0xac,0xc4,0xaa,0x7c,0xcc,0xba,0x8c,0x64,0x36,0x24,0x84,0x56,0x34, 0xe4,0xda,0xbc,0x94,0x6a,0x44,0x74,0x5a,0x44,0xd4,0xba,0x8c,0x54,0x3a,0x2c,0x9c, 0x76,0x54,0xdc,0xce,0xc4,0x54,0x2a,0x1c,0xac,0x9e,0x94,0x5c,0x42,0x2c,0x74,0x4a, 0x2c,0x24,0x0e,0x0c,0xf4,0xf2,0xe4,0xcc,0xc2,0xb4,0xb4,0x9e,0x7c,0x4c,0x32,0x24, 0x9c,0x86,0x6c,0x74,0x62,0x4c,0x8c,0x5e,0x3c,0xcc,0xae,0x94,0xe4,0xda,0xc4,0xac, 0x8e,0x64,0x8c,0x76,0x64,0x74,0x5a,0x4c,0x44,0x22,0x14,0xac,0x96,0x84,0x64,0x3a, 0x24,0x64,0x4a,0x3c,0xb4,0x8e,0x64,0xa4,0x7a,0x54,0x6c,0x42,0x2c,0xdc,0xca,0xa4, 0xbc,0xaa,0x84,0xb4,0x96,0x6c,0x94,0x72,0x4c,0x74,0x52,0x34,0xd4,0xc2,0xa4,0xa4, 0x82,0x5c,0x64,0x42,0x2c,0x54,0x32,0x1c,0xbc,0x96,0x6c,0xac,0x82,0x54,0x44,0x2a, 0x1c,0xf4,0xea,0xd4,0x34,0x1a,0x0c,0xcc,0xb2,0x84,0xec,0xe2,0xcc,0xa4,0x92,0x74, 0xc4,0xaa,0x8c,0xac,0x8a,0x5c,0xcc,0xba,0x9c,0x8c,0x6a,0x4c,0xcc,0xb2,0x8c,0x5c, 0x36,0x24,0xdc,0xce,0xb4,0x4c,0x2a,0x1c,0x3c,0x1e,0x14,0x2c,0x12,0x0c,0xdc,0xca, 0xac,0x9c,0x72,0x4c,0x7c,0x52,0x34,0xe4,0xd2,0xac,0x9c,0x7a,0x54,0x24,0x12,0x0c, 0x8c,0x62,0x3c,0x1c,0x06,0x0c,0xd4,0xc6,0xa4,0xc4,0xa6,0x7c,0xec,0xe6,0xd4,0xcc, 0xb6,0x8c,0xe4,0xd6,0xbc,0x74,0x56,0x44,0x2c,0x16,0x14,0xb4,0x9a,0x74,0x54,0x36, 0x2c,0xc4,0xae,0x84,0xc4,0xa2,0x7c,0xdc,0xce,0xac,0xd4,0xbe,0x9c,0xbc,0xa2,0x7c, 0xf4,0xee,0xe4,0xcc,0xbe,0xb4,0x4c,0x2e,0x24,0x6c,0x3e,0x2c,0xdc,0xc6,0xa4,0xb4, 0x92,0x6c,0xec,0xda,0xc4,0xa4,0x7e,0x5c,0xfc,0xfe,0xfc,0x24,0x0a,0x0c,0x6c,0x5a, 0x54,0xbc,0x9a,0x74,0x54,0x3e,0x34,0xe4,0xd2,0xbc,0x64,0x3e,0x2c,0x7c,0x5e,0x4c, 0xfc,0xf2,0xec,0x84,0x66,0x4c,0x44,0x26,0x1c,0xfc,0xf6,0xf4,0xcc,0xae,0x84,0xec, 0xde,0xcc,0x3c,0x22,0x1c,0xa4,0x8e,0x7c,0x1c,0x0a,0x0c,0x6c,0x46,0x34,0xd4,0xc2, 0x9c,0xcc,0xb6,0x9c,0xbc,0x9e,0x74,0x7c,0x62,0x4c,0xfc,0xfa,0xf4,0x84,0x56,0x3c, 0x94,0x6a,0x4c,0xd4,0xba,0x94,0x5c,0x42,0x34,0x74,0x4a,0x34,0xb4,0x9e,0x84,0xe4, 0xda,0xcc,0x8c,0x76,0x6c,0xbc,0xaa,0x8c,0x94,0x72,0x54,0x74,0x52,0x3c,0xd4,0xc2, 0xac,0x54,0x32,0x24,0xac,0x82,0x5c,0xf4,0xea,0xdc,0x34,0x1a,0x14,0xac,0x8a,0x64, 0x00,0xf4,0xf2,0x00,0xff,0xff,0x00,0xbf,0xbf,0x98,0xbc,0x02,0xf7,0xab,0x00,0xff, 0x1b,0x00,0xbf,0x40,0x00,0x00,0xc4,0xc3,0x00,0xf3,0x82,0x00,0xff,0x05,0x00,0xbf, 0x40,0x00,0x2e,0x78,0x00,0x67,0xbe,0x00,0x07,0x0f,0x00,0x40,0x40,0x2c,0x00,0x00, 0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x08,0xfe,0x00,0xbd,0xd0,0x59,0xe1,0x8b,0x01, 0x03,0x48,0x5e,0x10,0x78,0x6a,0xd3,0xc4,0x16,0x9d,0x0f,0x1f,0xdc,0x34,0x31,0xe3, 0x08,0x4e,0x15,0x39,0x21,0x5a,0x11,0x51,0xd0,0x8a,0x95,0x26,0x2c,0x44,0x3a,0x40, 0xf2,0x25,0x72,0xdb,0x8a,0x15,0x1f,0x3c,0x81,0x68,0x84,0xcc,0x4e,0x03,0x34,0x31, 0x5e,0xf9,0x68,0xc4,0x8a,0x4a,0x08,0x47,0xb1,0xde,0xe0,0x31,0x55,0x65,0xcc,0x9e, 0x69,0x90,0x82,0x42,0x3a,0xe9,0x2b,0x12,0xae,0x67,0x55,0xae,0x98,0x52,0xa2,0x84, 0xc8,0x3b,0x55,0xa9,0x84,0x14,0x71,0xd1,0x48,0x53,0x03,0x0f,0x44,0xf0,0x10,0x31, 0x45,0x04,0x68,0x87,0x2e,0xbe,0x7c,0x9d,0x12,0xf2,0x04,0xd5,0x25,0x25,0xa6,0x1e, 0xed,0x21,0x67,0xea,0x82,0x2a,0x3e,0x4f,0x06,0xb8,0xc8,0xa4,0x69,0x4c,0xab,0x47, 0xa6,0x50,0x41,0x49,0x95,0xca,0x55,0x1c,0x06,0x71,0x92,0x14,0xb0,0xc2,0xc7,0xd4, 0x22,0x54,0x28,0x94,0x58,0xbc,0x94,0x48,0x95,0x2a,0x76,0xa6,0xd4,0x15,0x92,0x11, 0x62,0xcc,0xa0,0x2a,0x98,0x90,0xf0,0x05,0xe2,0x04,0x86,0x13,0x3f,0x00,0xac,0x58, 0x51,0xf5,0x48,0xc9,0x05,0x53,0x33,0xae,0x2c,0x5a,0x94,0x88,0x08,0xab,0x57,0xd3, 0x10,0x05,0xab,0x94,0xc0,0x91,0x9c,0x05,0x87,0x51,0xc5,0xb1,0xb6,0xe1,0xc0,0x32, 0x2b,0xd9,0x72,0xf0,0x91,0xb0,0x27,0x55,0xa2,0xb4,0xad,0x94,0xa4,0x42,0x55,0xa5, 0xdd,0x24,0x55,0x3c,0xa4,0xb0,0x81,0x30,0xca,0x91,0x07,0x53,0xa6,0x9c,0x38,0x21, 0xc1,0xa4,0x59,0x68,0x3e,0xa9,0x88,0xfe,0xa0,0x48,0xd5,0xe9,0x02,0x64,0xa4,0x98, 0x66,0x38,0x62,0xa5,0x80,0x0f,0xa9,0x59,0xc5,0x98,0x8d,0x09,0xa2,0x60,0xd1,0xa7, 0x38,0x71,0x82,0xb5,0x50,0x06,0xab,0xc4,0xb4,0x20,0x89,0x2c,0x91,0x8b,0x2a,0x25, 0x28,0x31,0x08,0x2b,0x72,0x34,0x70,0xc3,0x22,0x06,0xa8,0x32,0x80,0x0f,0x3e,0x7c, 0xd1,0xc0,0x1e,0x41,0x2c,0xe2,0x44,0x21,0x9c,0xac,0x31,0x8c,0x68,0x7c,0x3c,0x70, 0x41,0x0f,0x4f,0x3c,0xa0,0xca,0x5e,0x89,0x60,0x12,0x8e,0x0b,0xe1,0x8c,0xb7,0xc4, 0x03,0x5f,0x64,0xd2,0x48,0x45,0x78,0x71,0xb6,0xc1,0x39,0x3d,0x38,0x66,0x1c,0x2a, 0xd3,0x5c,0x81,0x85,0x12,0x1e,0x60,0xa2,0x04,0x38,0x72,0x34,0xd1,0x46,0x0d,0xe4, 0x2c,0xc1,0x87,0x3a,0x10,0x6a,0x02,0xc7,0x22,0x0a,0xc4,0xe1,0x04,0x28,0x25,0xe8, 0xf5,0xc8,0x81,0x97,0x18,0xb3,0x50,0x1b,0xcc,0xd0,0x52,0x0a,0x2d,0x1a,0xcc,0xb2, 0x42,0x29,0x86,0x48,0xa0,0x4c,0x2e,0x3e,0x14,0x11,0xc2,0x23,0xa8,0xa0,0xe2,0x0b, 0x24,0x67,0x94,0x90,0xca,0x12,0x98,0x38,0x42,0x8a,0x0b,0x90,0x00,0x01,0xc4,0x2d, 0x02,0xb8,0x72,0x0b,0x24,0xa7,0xb8,0xe2,0x8b,0x17,0x9e,0x48,0xf3,0x84,0x32,0x67, 0x34,0x02,0x12,0x12,0x50,0x08,0x40,0x47,0x06,0x4f,0xf0,0x21,0x82,0x03,0x3e,0xe8, 0xb2,0x02,0x67,0xb5,0x7c,0x72,0xcc,0x27,0x98,0x32,0xb0,0x82,0x27,0x4d,0xd0,0x81, 0x01,0x1f,0x39,0xe4,0xd2,0x00,0x9a,0x89,0x20,0xb1,0xd0,0x3b,0x39,0x84,0x46,0x0a, 0x2f,0x64,0x74,0x10,0xc7,0x27,0xfe,0xd6,0x7c,0x92,0x44,0x2d,0xee,0xc4,0x51,0x8c, 0x1b,0xbe,0xec,0x49,0x86,0x2a,0xca,0xe4,0x70,0x41,0x57,0x50,0x24,0x42,0x80,0x24, 0xaa,0x00,0x00,0x40,0x36,0xaf,0xf8,0xe2,0xca,0x36,0xc5,0xf8,0xd2,0x05,0x03,0xb2, 0x7e,0xc2,0x00,0x19,0xba,0xfc,0x31,0x45,0xae,0x50,0x28,0xa3,0xcc,0x12,0xa8,0x20, 0x31,0x0d,0x14,0x04,0xc0,0xf3,0x84,0xb1,0x56,0x94,0xa3,0x9d,0x2f,0x49,0xdc,0x77, 0x69,0x2d,0xb5,0xdc,0xd2,0x86,0x01,0x88,0x6c,0x73,0x40,0x12,0xbb,0xe4,0xa0,0x0c, 0x1f,0x44,0x74,0x3b,0x8d,0x06,0xa2,0xf0,0x91,0x4b,0x68,0x18,0xc8,0xda,0xee,0x09, 0x75,0x94,0x03,0x43,0x30,0x43,0x7c,0x72,0x8a,0x22,0x32,0xb8,0xc3,0x84,0x3b,0xcd, 0xc8,0xd2,0x2b,0x2a,0x3b,0x11,0xd1,0x0e,0x2b,0x4b,0x38,0x90,0x8d,0x15,0xd0,0x7c, 0x42,0x42,0x30,0x49,0x54,0xc2,0x08,0x3a,0xee,0x54,0x10,0x4c,0x86,0x1f,0x33,0x51, 0x41,0x12,0x75,0x28,0x03,0x80,0x32,0xa8,0x6c,0xa5,0xc0,0x20,0x41,0x0c,0x23,0x84, 0x1e,0x4f,0x5c,0xd2,0x05,0xc2,0x7d,0xf4,0xe1,0x8e,0x3b,0x60,0x0c,0x11,0x8c,0x3b, 0x4e,0x24,0x51,0x01,0x13,0xd1,0x7c,0x32,0x8e,0xcb,0xaa,0xe4,0x4b,0x04,0x11,0x55, 0x2c,0x92,0xca,0x0b,0xf0,0xe8,0xa1,0x0d,0x30,0xee,0xf4,0xc1,0x84,0xca,0xd1,0xf4, 0xc1,0x89,0x3b,0x07,0xac,0xe2,0x4b,0x30,0x5e,0xdf,0x52,0xc7,0xb1,0x17,0xe0,0xd1, 0x2d,0x12,0x7b,0x3c,0x43,0x44,0x2a,0x62,0x84,0x41,0x89,0x25,0x07,0x83,0xf1,0x0d, 0x13,0x7d,0xcc,0x4a,0xc1,0xfe,0x2d,0xb7,0x38,0x21,0xeb,0x2d,0xbe,0x5c,0xf3,0x4e, 0x2a,0x17,0x20,0xda,0x43,0x0f,0xe5,0x58,0xe3,0x4e,0x00,0x0f,0xcc,0x01,0x0f,0x39, 0x6e,0xb8,0x83,0x70,0x30,0x9f,0x64,0xcd,0x49,0x12,0x85,0x14,0x63,0x4b,0xbb,0xbe, 0xc8,0x60,0xcd,0x04,0x88,0xbe,0xd9,0x09,0x35,0xdf,0xa8,0x41,0x02,0x36,0x0f,0xf4, 0xf0,0x8e,0x0e,0xc7,0xd0,0xfa,0x09,0x10,0xa3,0xa0,0x43,0x43,0x19,0x2a,0x48,0x73, 0x8b,0x3b,0x0c,0x14,0xfd,0x49,0x1f,0xc2,0xd4,0xf1,0xd4,0x03,0x7d,0xa8,0xf1,0xcd, 0x37,0xb5,0x6c,0xd1,0xa0,0x12,0xb7,0x7c,0x52,0x29,0x10,0x52,0xac,0x53,0xc9,0x2a, 0x75,0xd6,0xe2,0xc4,0x28,0xb0,0x3a,0xc1,0x44,0x32,0x60,0xe4,0x71,0x48,0x00,0xc1, 0x04,0x73,0x77,0x12,0x71,0x04,0xd2,0x8a,0x18,0x7d,0xc0,0x8a,0x29,0x09,0x24,0x24, 0xb1,0xc6,0xac,0x0c,0x44,0x11,0xc9,0x2d,0x0c,0xd4,0x32,0x7c,0x32,0xd8,0x0f,0x4f, 0x6b,0x1f,0xc1,0x90,0x00,0x44,0x0d,0xa5,0xf4,0x11,0x0d,0x27,0x7d,0x93,0x5c,0xcf, 0xdc,0x61,0x8d,0x3f,0x08,0x82,0x0c,0x90,0xe0,0x44,0x05,0xbe,0x41,0x3f,0x06,0x46, 0xe3,0x1b,0x24,0x88,0x83,0xd6,0x1e,0xb6,0x0d,0x29,0x7c,0xe2,0x6e,0x1b,0xb0,0x41, 0xf2,0x3e,0xe1,0x04,0x06,0x54,0x83,0x11,0xb7,0xe8,0xc0,0x06,0x98,0x30,0xbf,0xe1, 0x31,0x10,0x6f,0xc5,0x20,0xc3,0x01,0xfa,0x40,0x82,0x5f,0xf8,0xc2,0x1d,0xc3,0x53, 0xc3,0x1d,0xda,0xd0,0x2c,0x48,0x78,0x02,0x11,0x3b,0x18,0x42,0x12,0xb4,0x96,0x0c, 0x13,0x46,0xe3,0x7a,0x5e,0x77,0x73,0xc2,0xd8,0xbe,0xe1,0x8e,0x0f,0xf8,0x82,0x13, 0xc3,0x5b,0x60,0x05,0x3e,0x21,0x05,0x49,0x98,0x40,0x6b,0x15,0xe8,0xc3,0xfc,0xf2, 0x07,0x86,0x1e,0x52,0x83,0x56,0xb5,0x38,0x00,0x09,0xf0,0x57,0x89,0x6d,0xd4,0x42, 0x65,0xdf,0xa0,0x46,0x0f,0x7d,0xc6,0x04,0x31,0x92,0x70,0x78,0xce,0xa8,0x5c,0xd6, 0x7c,0xf6,0x3a,0x12,0x10,0x10,0x80,0x64,0x20,0xc3,0x1a,0x2e,0x28,0xbc,0x6f,0x80, 0xe1,0x13,0xf9,0x0b,0x46,0x0f,0xe9,0xe7,0x0e,0x5f,0x7c,0x62,0x15,0x5d,0x73,0xc7, 0x0e,0x02,0x02,0x00,0x3b }; /* created by reswrap from file bookdel_gif.gif */ extern const unsigned char bookdel_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x80,0x00,0x00,0xa2,0x8d,0x68,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x45,0x08,0xba,0x1a,0x21,0x2c,0x2e,0x07,0xa5,0x7b,0x80,0xca,0x25,0xee,0xab,0xc0, 0x20,0x75,0x9a,0x22,0x8e,0x1e,0x34,0x9c,0x11,0x45,0x0e,0x04,0xc1,0x36,0x1f,0x1d, 0xcf,0x19,0x16,0x12,0x01,0x51,0xe0,0xba,0x55,0xac,0x40,0x5c,0x71,0x54,0x26,0x22, 0xf1,0xa6,0x40,0x26,0x97,0x4c,0x13,0x63,0x00,0x95,0x2d,0x70,0x21,0x98,0x55,0xba, 0x11,0x18,0x37,0xe0,0x45,0x02,0x00,0x3b }; /* created by reswrap from file booknext_gif.gif */ extern const unsigned char booknext_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0xa2,0x8d,0x68,0x00,0x00,0x80,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x3e,0x08,0x21,0x2c,0xf0,0x30,0x2e,0x38,0x81,0x8b,0x16,0x5b,0xa6,0x6f,0x6c,0xcf, 0x40,0x79,0x1b,0x27,0x4a,0x24,0x34,0x9c,0x1a,0x36,0x10,0x04,0xdb,0x02,0x2f,0x2c, 0x6b,0x35,0x21,0xdc,0xd1,0x0a,0x37,0x2b,0x5c,0xa8,0x21,0xb0,0xf5,0x54,0x0d,0x58, 0x4c,0xd5,0x63,0x28,0x59,0x3c,0xdf,0x32,0x34,0x0b,0x04,0x67,0x58,0x40,0x02,0x00, 0x3b }; /* created by reswrap from file bookprev_gif.gif */ extern const unsigned char bookprev_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x80,0xa2,0x8d,0x68,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x3c,0x08,0x0a,0xd1,0x21,0x2b,0x06,0xf5,0x56,0x8d,0xac,0x61,0xb6,0x5d,0x57,0x83, 0xe5,0x59,0x50,0xb8,0x49,0xa5,0x79,0x46,0x03,0x41,0xa8,0x6b,0xeb,0xc2,0x9b,0x4c, 0x04,0x34,0x2b,0x3b,0x43,0x6e,0x0e,0x8e,0xc0,0x8c,0xb5,0x00,0x36,0x5c,0xaf,0x22, 0xeb,0x38,0x04,0xd5,0x64,0xaa,0x9c,0x42,0xd0,0x5b,0x59,0x15,0x09,0x00,0x3b }; /* created by reswrap from file bookset_gif.gif */ extern const unsigned char bookset_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x80,0xa2,0x8d,0x68,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x2f,0x08,0xba,0xdc,0xfe,0x30,0xca,0x16,0xe6,0xaa,0x16,0x04,0x3c,0x83,0x10,0x1c, 0xe4,0x7d,0xa1,0x33,0x0a,0x43,0xc9,0x6c,0xdf,0xe0,0x6e,0xa6,0x12,0xb8,0x2e,0xb9, 0x5e,0xf4,0x07,0x5e,0x6b,0x6d,0xcb,0xa6,0x11,0x47,0xa5,0x20,0xc0,0x32,0x8d,0x04, 0x00,0x3b }; /* created by reswrap from file close_gif.gif */ extern const unsigned char close_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0x84,0x00,0x00,0xb2,0xc0,0xdc, 0x5c,0x56,0x5c,0x1c,0x1e,0x1c,0x14,0x12,0x14,0x04,0x06,0x04,0x7c,0x76,0x7c,0x34, 0x36,0x34,0x5c,0x5a,0x54,0x44,0x46,0x44,0x2c,0x2e,0x2c,0x04,0x02,0x04,0x74,0x72, 0x74,0x6c,0x66,0x5c,0x54,0x56,0x54,0x5c,0x5e,0x5c,0x74,0x76,0x74,0x6c,0x66,0x6c, 0x24,0x22,0x24,0x3c,0x3a,0x3c,0x54,0x4e,0x4c,0xfc,0xfe,0xfc,0x6c,0x6a,0x6c,0x7c, 0x7a,0x7c,0x2c,0x26,0x2c,0x3c,0x3e,0x3c,0x0c,0x0a,0x0c,0x54,0x52,0x54,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x05,0x63,0x20,0x20,0x8e,0x64,0x69,0x06,0xc2, 0x40,0x04,0xe6,0x58,0x18,0x47,0x80,0x24,0x84,0xb2,0x98,0x05,0xd3,0x38,0x0f,0x84, 0x44,0x0a,0x5b,0x49,0x32,0xa1,0x50,0x2a,0x96,0x80,0x31,0x48,0x0a,0x04,0x1c,0x46, 0x0a,0x74,0xa9,0x60,0x89,0x04,0x0d,0x4b,0x25,0x6a,0xac,0x31,0x45,0x03,0x04,0xc4, 0x32,0xa5,0x5c,0x82,0x5f,0x00,0x21,0x81,0x51,0x72,0xd1,0x8a,0x51,0x20,0x73,0x89, 0xd6,0xa9,0x1a,0x52,0xb0,0xbb,0xa7,0xa4,0x45,0x05,0x70,0x82,0x37,0x25,0x0b,0x82, 0x41,0x84,0x2d,0x01,0x68,0x79,0x2d,0x8e,0x8f,0x90,0x23,0x21,0x00,0x3b }; /* created by reswrap from file colors_gif.gif */ extern const unsigned char colors_gif[]={ 0x47,0x49,0x46,0x38,0x39,0x61,0x10,0x00,0x10,0x00,0xf2,0x00,0x00,0x80,0x80,0x80, 0x00,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0x00,0x00, 0x00,0xff,0x00,0x00,0x00,0x21,0xf9,0x04,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03,0x47,0x08,0x0a,0xd1,0xfb,0x30,0x88,0xe9, 0xe0,0x92,0x33,0x07,0xcb,0xf2,0xf8,0xd4,0xd3,0x64,0xc2,0x37,0x48,0x55,0x83,0x11, 0x04,0x83,0x09,0x9b,0x23,0xb1,0x2d,0x49,0x6d,0xdd,0x42,0xc6,0x68,0x67,0xdf,0x23, 0x58,0xa7,0x40,0x7c,0x05,0x85,0x12,0x62,0xe1,0x65,0xc3,0xa1,0x24,0x86,0x68,0x54, 0x73,0xc9,0x48,0x0d,0x54,0xd1,0xf1,0x66,0x91,0xa9,0x70,0x11,0x30,0x07,0x90,0x00, 0x00,0x3b }; /* created by reswrap from file copy_gif.gif */ extern const unsigned char copy_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0x0f,0x6b,0x13, 0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x7f,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x39,0x84,0x8f,0x09,0xc1,0xad,0x18,0x84,0x14,0xec,0x99,0x38, 0x63,0xb0,0x5a,0x8f,0x0f,0x42,0x93,0x34,0x8c,0xdf,0xd1,0x31,0xe5,0x54,0x0e,0xd7, 0x28,0x94,0x4c,0x1c,0xa6,0xc1,0x0a,0xbb,0x18,0x4b,0x35,0x91,0xee,0xbb,0xc1,0x48, 0x0f,0x99,0x2f,0x56,0x1c,0x22,0x15,0xa0,0xe6,0xc9,0x02,0x8d,0x26,0x0a,0x00,0x3b }; /* created by reswrap from file cut_gif.gif */ extern const unsigned char cut_gif[]={ 0x47,0x49,0x46,0x38,0x39,0x61,0x10,0x00,0x10,0x00,0xf1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x21,0xf9,0x04,0x01,0x00,0x00,0x00, 0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x02,0x2a,0x84,0x8f,0x99, 0x71,0xac,0xe8,0x40,0x7c,0xb2,0xd1,0xc6,0xc2,0xa4,0xf9,0x42,0xed,0x41,0xe1,0x21, 0x04,0xc2,0x08,0x9c,0xc2,0x7a,0xad,0xaa,0x71,0x2a,0xf1,0x9b,0x3e,0x73,0x8d,0x27, 0x77,0x1a,0xdb,0x3d,0x1a,0x2a,0x00,0x00,0x3b }; /* created by reswrap from file delete_gif.gif */ extern const unsigned char delete_gif[]={ 0x47,0x49,0x46,0x38,0x39,0x61,0x10,0x00,0x10,0x00,0xf0,0x00,0x00,0xb2,0xc0,0xdc, 0x84,0x00,0x00,0x21,0xf9,0x04,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00, 0x10,0x00,0x10,0x00,0x00,0x02,0x24,0x84,0x8f,0x69,0xc1,0x7a,0xf1,0x18,0x4c,0x0d, 0xc9,0xb9,0x30,0xad,0xd5,0x81,0xab,0x79,0x92,0x67,0x5d,0xe4,0xc7,0x85,0x91,0xd6, 0xad,0x4a,0x68,0xbe,0xa5,0x2a,0x9e,0xf4,0x89,0x2b,0x05,0x00,0x3b }; /* created by reswrap from file delimit_gif.gif */ extern const unsigned char delimit_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x18,0x00,0x18,0x00,0xe3,0x00,0x00,0xb2,0xc0,0xdc, 0x6f,0x78,0x89,0x59,0x60,0x6e,0x9b,0xa8,0xc0,0x2c,0x30,0x37,0x00,0x00,0x00,0x85, 0x90,0xa5,0xd8,0x60,0x6e,0xd3,0x6c,0x7b,0xce,0x78,0x89,0xeb,0x30,0x37,0xff,0x00, 0x00,0x00,0x64,0x98,0xf0,0x24,0x29,0x6c,0x30,0x37,0x62,0x48,0x52,0x2c,0x00,0x00, 0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x04,0x6f,0x10,0xc8,0x49,0xab,0xad,0x41,0xe8, 0xcd,0x7b,0x1f,0x12,0x51,0x8c,0x64,0x69,0x9a,0xc6,0xa5,0xae,0x52,0xe6,0xbd,0x5c, 0x25,0x9e,0x74,0x79,0x1d,0xc8,0x8a,0x1c,0x6b,0x72,0x28,0x8b,0x04,0xa0,0x03,0x48, 0x2c,0x14,0x87,0x84,0x41,0x10,0xa0,0x00,0x17,0x47,0x00,0x63,0xca,0x10,0x00,0x9e, 0x47,0x41,0x81,0x60,0x39,0x34,0x56,0x0d,0x9e,0x2a,0xe3,0x78,0xc0,0x04,0x0f,0x47, 0x8c,0x32,0xab,0xd5,0x58,0xf0,0xf1,0xd9,0xa3,0x6a,0xbb,0x49,0xf1,0xfc,0xc5,0x35, 0xf7,0x34,0x27,0x76,0x77,0x25,0x5c,0x7a,0x79,0x7c,0x7d,0x1e,0x20,0x00,0x81,0x82, 0x25,0x29,0x85,0x90,0x91,0x92,0x15,0x11,0x00,0x3b }; /* created by reswrap from file fonts_gif.gif */ extern const unsigned char fonts_gif[]={ 0x47,0x49,0x46,0x38,0x39,0x61,0x10,0x00,0x10,0x00,0xf1,0x00,0x00,0xb2,0xc0,0xdc, 0xcd,0x00,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x21,0xf9,0x04,0x01,0x00,0x00,0x00, 0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x02,0x2e,0x84,0x8f,0x09, 0xc1,0xed,0x91,0x98,0x69,0x13,0x22,0xbb,0xe4,0x54,0x87,0xf2,0x28,0x84,0xe2,0x28, 0x5c,0xa1,0x21,0xa2,0x65,0x27,0x58,0x29,0x7a,0x69,0xaf,0xe2,0xcd,0x91,0x7c,0xde, 0x8f,0xfd,0x01,0xfc,0xf7,0xe3,0x04,0x11,0xa4,0x5c,0x01,0x00,0x3b }; /* created by reswrap from file help_gif.gif */ extern const unsigned char help_gif[]={ 0x47,0x49,0x46,0x38,0x39,0x61,0x10,0x00,0x10,0x00,0xf4,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xa6,0xbf,0xa2,0xf0,0xf4,0xef,0xeb,0xf1,0xea,0xe1,0xe9,0xe0,0xcb, 0xda,0xc9,0xf3,0xf6,0xf3,0xd2,0xdf,0xd0,0xc3,0xd4,0xc1,0xac,0xc3,0xa8,0xbc,0xcf, 0xb8,0x2b,0x2b,0x2b,0xe6,0xed,0xe4,0x21,0x2e,0x1f,0x65,0x8b,0x5e,0x8c,0xad,0x86, 0x96,0xb4,0x91,0xb8,0xcc,0xb5,0x8d,0xad,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0xf9,0x04, 0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x05, 0x46,0x20,0x20,0x8a,0x41,0x59,0x8e,0xe8,0x18,0x08,0x03,0x51,0x18,0x41,0xaa,0x1a, 0xc7,0x50,0xdc,0x48,0x9c,0x06,0xc9,0xa0,0x98,0x8b,0x82,0x82,0x21,0x0b,0x34,0x1c, 0xaa,0x9b,0x6e,0x87,0x0a,0x08,0x97,0x32,0xd2,0xed,0x01,0x2d,0xde,0x20,0xd5,0xdd, 0x35,0xdb,0x8c,0x14,0xb0,0xd1,0x66,0x21,0xc2,0xdd,0x99,0xc2,0x66,0xb4,0x58,0x52, 0x6e,0x4a,0x26,0xed,0x66,0x39,0x04,0x00,0x3b }; /* created by reswrap from file indent_gif.gif */ extern const unsigned char indent_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x18,0x00,0x18,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x6f,0x78,0x89,0x59,0x60,0x6e,0x2c,0x30,0x37,0x00,0x00,0x00,0x00,0x00,0xff,0x85, 0x90,0xa5,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x03, 0x4c,0x08,0xba,0xdc,0xde,0x41,0xc8,0x49,0x6b,0x5d,0x83,0xe8,0xcd,0x7b,0x7f,0x60, 0xb8,0x44,0x56,0x49,0x35,0x99,0xa7,0x72,0x62,0xdb,0x16,0xa6,0x69,0x38,0xc5,0xba, 0x0a,0xb4,0xfb,0xc6,0x16,0x58,0xdb,0x9f,0x46,0x01,0x30,0xd4,0x09,0x0b,0x48,0x18, 0x0f,0x47,0x4b,0xfe,0x80,0xa1,0x61,0xd1,0xf8,0x50,0x2e,0x25,0x81,0x2a,0xb0,0x33, 0xa8,0x52,0x7d,0xd7,0x8b,0x70,0xeb,0xf9,0x9a,0xcf,0xe8,0x45,0x02,0x00,0x3b }; /* created by reswrap from file info_gif.gif */ extern const unsigned char info_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa5,0x00,0x00,0xb2,0xc0,0xdc, 0x04,0x3e,0x6c,0x04,0x3a,0x64,0x04,0x42,0x6c,0x0c,0x42,0x6c,0x24,0x5e,0x7c,0x2c, 0x6e,0x94,0x24,0x6a,0x8c,0x1c,0x56,0x84,0x0c,0x46,0x74,0x0c,0x2e,0x4c,0x24,0x62, 0x8c,0x3c,0x7e,0xa4,0xfc,0xfe,0xfc,0x1c,0x4a,0x64,0x14,0x52,0x7c,0x0c,0x42,0x74, 0x04,0x2a,0x4c,0x04,0x46,0x6c,0x44,0x8e,0xb4,0x4c,0x92,0xb4,0x24,0x52,0x6c,0x1c, 0x62,0x8c,0x0c,0x4e,0x7c,0x04,0x36,0x64,0x44,0x86,0xac,0x54,0x9a,0xbc,0x54,0x9a, 0xc4,0x3c,0x7a,0x9c,0x34,0x72,0x94,0x2c,0x6e,0x9c,0x04,0x3e,0x74,0x04,0x36,0x5c, 0x54,0x9e,0xc4,0x2c,0x56,0x74,0x1c,0x5a,0x84,0x04,0x46,0x74,0x04,0x32,0x5c,0x04, 0x2a,0x54,0x1c,0x5e,0x94,0x04,0x4a,0x74,0x04,0x2e,0x54,0x14,0x56,0x84,0x34,0x7a, 0xa4,0x24,0x4e,0x64,0x2c,0x62,0x84,0x1c,0x5e,0x8c,0x24,0x66,0x94,0x3c,0x82,0xac, 0xfc,0xfa,0xfc,0x14,0x3e,0x64,0x04,0x26,0x4c,0x0c,0x4e,0x84,0x04,0x32,0x54,0x04, 0x26,0x44,0x04,0x3a,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x06,0x8e,0x40,0x80,0x70,0x48,0x2c,0x1a,0x03, 0x82,0xc0,0x20,0x60,0x1c,0x12,0x08,0x05,0xc3,0x01,0x91,0x50,0x10,0x8c,0x84,0x05, 0x83,0xd1,0x68,0x38,0x1e,0x90,0x08,0xa4,0x28,0x61,0x4c,0x28,0xdd,0x8a,0xe5,0x82, 0x51,0x10,0x03,0x8b,0x8c,0x66,0x43,0xe1,0x74,0x3c,0x97,0x0f,0xc8,0x2d,0x0c,0x58, 0x26,0x21,0x5d,0x0d,0x22,0x06,0x23,0x24,0x25,0x26,0x43,0x01,0x27,0x19,0x1b,0x1b, 0x69,0x85,0x28,0x20,0x29,0x43,0x20,0x2a,0x2b,0x67,0x5d,0x2c,0x2d,0x2e,0x28,0x25, 0x11,0x43,0x18,0x04,0x2f,0x0c,0x30,0x5d,0x0e,0x23,0x2a,0x01,0x29,0xa0,0x43,0x26, 0x28,0x2f,0x31,0x82,0x32,0xab,0x33,0x45,0x09,0x11,0x1f,0x17,0x34,0x0f,0x0f,0x02, 0x35,0x36,0x09,0x46,0xb8,0x02,0x37,0x20,0x26,0x11,0xc1,0x4d,0x42,0x0a,0x29,0x26, 0x26,0x36,0xcb,0xd2,0xd3,0xd4,0x41,0x00,0x3b }; /* created by reswrap from file lang_gif.gif */ extern const unsigned char lang_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x18,0x00,0x18,0x00,0xa5,0x00,0x00,0xb2,0xc0,0xdc, 0xdb,0xdb,0xaa,0x92,0x49,0x55,0x6d,0x24,0x00,0x92,0x92,0x55,0xdb,0xdb,0xff,0x92, 0x6d,0x55,0x92,0x24,0x00,0xb6,0x6d,0x00,0xdb,0x6d,0x00,0xb6,0xb6,0xaa,0x6d,0x6d, 0x55,0x6d,0x49,0x55,0xff,0x92,0x55,0xdb,0x92,0xaa,0xdb,0x92,0x00,0x92,0x49,0x00, 0xdb,0xb6,0xaa,0x92,0x92,0xaa,0xff,0x6d,0x55,0xb6,0x92,0x55,0xdb,0xff,0xff,0xb6, 0xb6,0xff,0xdb,0x49,0x00,0xb6,0xdb,0xaa,0x92,0xb6,0x55,0xff,0xff,0xff,0xdb,0x6d, 0x55,0xff,0xdb,0xaa,0x6d,0x49,0x00,0xb6,0x49,0x00,0x49,0x00,0x00,0xff,0xff,0xaa, 0xdb,0x92,0x55,0xff,0xb6,0x55,0xff,0x92,0x00,0x24,0x24,0x00,0x49,0x24,0x00,0x92, 0x00,0x00,0xff,0xdb,0xff,0x49,0x49,0x55,0x6d,0x6d,0xaa,0xdb,0xb6,0x55,0x49,0x24, 0x55,0xff,0xb6,0xaa,0x49,0x49,0x00,0xb6,0x92,0xaa,0xb6,0x6d,0x55,0x92,0xb6,0xaa, 0x24,0x24,0x55,0x49,0x6d,0x55,0x00,0x00,0x00,0x24,0x00,0x00,0xb6,0xb6,0x55,0x24, 0x49,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x06,0xfe,0x40,0x80,0x70,0x48,0x2c,0x02,0x02, 0x82,0x01,0xa1,0x60,0x6c,0x16,0x0d,0x07,0x44,0x22,0x71,0x50,0x38,0x9d,0x0b,0x86, 0xc1,0xd0,0x70,0x3c,0x20,0x91,0x2b,0x80,0x29,0x5c,0x48,0x0a,0x01,0x85,0xe1,0x31, 0x49,0x0c,0xc8,0xc5,0x82,0x82,0x40,0xa9,0x2c,0x14,0x68,0x8b,0xc2,0xb2,0xbe,0x0c, 0x30,0x46,0x06,0x19,0x11,0x1a,0x01,0x1b,0x0a,0x1c,0x05,0x0d,0x0a,0x18,0x0a,0x12, 0x1d,0x1e,0x1f,0x70,0x72,0x0b,0x1a,0x1a,0x20,0x1c,0x21,0x01,0x1c,0x1c,0x22,0x22, 0x23,0x11,0x12,0x24,0x25,0x26,0x12,0x42,0x72,0x14,0x01,0x96,0x20,0x27,0x21,0x11, 0x1c,0x27,0x22,0x21,0x22,0x0d,0x09,0x0b,0x28,0x25,0x02,0x01,0x00,0x04,0x0a,0xaa, 0x96,0x97,0x14,0x9c,0xb1,0xb4,0x0d,0x0f,0x17,0x1d,0x29,0x24,0x64,0x04,0x97,0xce, 0x01,0x21,0x9c,0x1c,0x2a,0x0d,0xb2,0xc7,0x09,0x1d,0x0b,0x70,0xbe,0x27,0x20,0x15, 0x1a,0xae,0x27,0x1c,0x11,0xb4,0x22,0x53,0x53,0x2b,0x70,0x42,0x12,0xbf,0x0f,0x05, 0x9c,0xe5,0x21,0x0f,0xe7,0x07,0xea,0x43,0x12,0x11,0xae,0x9c,0x2c,0xd4,0xc6,0x17, 0x09,0x17,0x20,0x48,0x68,0x61,0x4f,0x48,0x89,0x10,0x2c,0x44,0x50,0xa3,0x75,0x2d, 0x81,0x01,0x02,0x2e,0x14,0x68,0x33,0x82,0x20,0x02,0xbf,0x11,0xd5,0x36,0xd0,0x93, 0xa0,0x20,0x42,0x80,0x08,0x2d,0x8a,0xbc,0x70,0xc1,0x41,0x43,0x2c,0x63,0x53,0x2e, 0x3c,0xec,0x18,0x00,0x84,0x06,0x0e,0x28,0x88,0x50,0x60,0x71,0x69,0x5c,0x03,0x0f, 0x53,0x20,0xf4,0xf2,0xc8,0x0a,0x04,0x6a,0x08,0x89,0x4c,0xf2,0x75,0x2b,0xc0,0x22, 0x1f,0x40,0x81,0x2e,0x02,0xa8,0xe2,0xd0,0xf3,0x67,0xc8,0x08,0xaf,0x62,0xa9,0xa0, 0xf0,0x02,0x81,0x4e,0x5f,0x05,0x5c,0x7a,0xe3,0x00,0xc3,0x40,0x8c,0x02,0x05,0x3a, 0x30,0x08,0x50,0x34,0xc4,0x0b,0x01,0x0c,0xee,0xf0,0xec,0xf6,0x51,0x86,0x01,0x18, 0x42,0x30,0xc4,0x90,0x31,0x40,0xc5,0x0b,0x08,0x03,0xf0,0xf4,0xea,0x56,0x28,0x00, 0x0a,0x14,0xbb,0x86,0xcc,0x40,0x41,0x82,0xc6,0x96,0x22,0xec,0x4e,0xd4,0x30,0x60, 0xe3,0x84,0x91,0x19,0x24,0x52,0xc0,0x6d,0x22,0xf1,0x8e,0x13,0x39,0x62,0xc6,0x88, 0x09,0x02,0x00,0x3b }; /* created by reswrap from file new_gif.gif */ extern const unsigned char new_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xff,0xff,0x00, 0xb2,0xc0,0xdc,0x84,0x82,0x84,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x47,0x08,0x11,0xa2,0x3c,0x70,0xc9,0xc6,0x08,0x03,0x84,0x44,0x79,0x5b,0xcb,0x9a, 0xc6,0x01,0x9f,0x60,0x0a,0xa1,0xc8,0x98,0x04,0x80,0x81,0x50,0x2c,0x11,0x28,0x0d, 0x81,0xd9,0xc0,0x2c,0x1f,0x8e,0xeb,0x13,0x4d,0x2c,0x96,0xe3,0x0c,0x7c,0x3e,0xe0, 0xe2,0x38,0x24,0xaa,0x96,0xc8,0x9f,0x51,0xd8,0x2c,0x4a,0x8e,0x51,0x2b,0x34,0xfb, 0x0c,0x34,0xbf,0x4a,0x8e,0x58,0x9c,0x00,0x00,0x3b }; /* created by reswrap from file open_gif.gif */ extern const unsigned char open_gif[]={ 0x47,0x49,0x46,0x38,0x39,0x61,0x10,0x00,0x10,0x00,0xf2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x00,0xff,0x00,0xff,0xff,0x00,0x80,0x80,0x80,0xff,0xff,0xff,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0xf9,0x04,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03,0x45,0x08,0xba,0x1c,0xfe,0x2c,0xae,0x20, 0x44,0x90,0x91,0xd6,0x8b,0x95,0xb6,0x1c,0x00,0x79,0x95,0x25,0x3e,0x03,0x31,0x3c, 0xa5,0x73,0xaa,0xf0,0xda,0xae,0x5e,0xfa,0xdc,0xb8,0xa3,0x06,0xc5,0xd0,0xff,0x3e, 0x9f,0xc3,0x16,0x04,0x02,0x75,0x81,0xa2,0xb2,0x77,0x49,0xf2,0x96,0xc5,0x26,0x21, 0x69,0x54,0x36,0xa9,0x50,0xa6,0xe7,0x59,0xfd,0x71,0x72,0x60,0x4e,0x02,0x00,0x3b }; /* created by reswrap from file palette_gif.gif */ extern const unsigned char palette_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x18,0x00,0x18,0x00,0xc6,0x00,0x00,0xb2,0xc0,0xdc, 0x6d,0x6d,0x55,0x49,0x49,0x55,0x49,0x6d,0x55,0x6d,0x49,0x55,0x24,0x24,0x00,0x92, 0x92,0x55,0xb6,0x92,0xaa,0x24,0x24,0x55,0xdb,0xb6,0xaa,0xdb,0xdb,0xaa,0xb6,0xb6, 0xaa,0x92,0xb6,0xaa,0x49,0x49,0x00,0x92,0xb6,0x55,0x24,0x6d,0x55,0x24,0x6d,0x00, 0xb6,0x92,0x55,0x49,0x92,0x55,0x49,0xb6,0x55,0x24,0x49,0x00,0x92,0x24,0x00,0xb6, 0x24,0x55,0x92,0x00,0x00,0x6d,0xb6,0xaa,0x6d,0xb6,0x55,0xb6,0xff,0xaa,0x92,0xdb, 0xaa,0x6d,0x92,0xaa,0xdb,0xdb,0xff,0xdb,0x6d,0x55,0xdb,0x24,0x55,0xdb,0x24,0x00, 0x92,0xdb,0x55,0x24,0x92,0x55,0x49,0x92,0xaa,0x00,0x6d,0x55,0x92,0x92,0xaa,0xdb, 0x92,0xaa,0xff,0x6d,0x55,0xff,0x92,0xaa,0xdb,0x6d,0xaa,0xb6,0x00,0x00,0xb6,0xdb, 0xff,0xb6,0xdb,0xaa,0x6d,0x92,0x55,0x00,0x92,0xaa,0x49,0xb6,0xaa,0xff,0xb6,0xaa, 0xb6,0x24,0x00,0xb6,0xff,0xff,0x92,0xdb,0xff,0x24,0x92,0xaa,0xdb,0x49,0x55,0xff, 0xdb,0xaa,0x24,0xb6,0xaa,0xff,0xdb,0xff,0xff,0xff,0xff,0xdb,0xff,0xff,0xff,0xff, 0xaa,0x00,0x6d,0xaa,0x00,0x49,0xaa,0x24,0x49,0x55,0xb6,0xb6,0xff,0x24,0x92,0xff, 0x00,0x49,0x55,0x6d,0xb6,0xff,0x49,0x24,0x00,0x6d,0xdb,0xff,0x6d,0x6d,0xaa,0xdb, 0xff,0xaa,0xdb,0xb6,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x07,0xfe,0x80,0x00,0x82,0x83,0x84,0x85,0x86, 0x87,0x84,0x01,0x02,0x03,0x02,0x04,0x8c,0x01,0x88,0x87,0x05,0x01,0x06,0x06,0x07, 0x95,0x06,0x02,0x05,0x91,0x83,0x08,0x03,0x09,0x0a,0xa0,0x0b,0x0c,0x96,0x0a,0x0b, 0x0d,0x08,0x91,0x01,0x0b,0xa2,0xa6,0x0e,0x0f,0x10,0x03,0xac,0x0a,0x99,0x87,0x02, 0xac,0x11,0x07,0xac,0x0e,0x12,0x13,0x12,0x14,0xac,0xac,0x06,0xa9,0x84,0x05,0xa6, 0x15,0x16,0x17,0x01,0x09,0x18,0x19,0x1a,0x1b,0x10,0x0b,0x0b,0x0e,0x1c,0x96,0x9b, 0x82,0x1c,0x01,0x1d,0x1e,0x1f,0x1e,0x20,0x17,0xd3,0x1b,0x1d,0x21,0x22,0x0b,0x23, 0x24,0x24,0x0f,0x07,0x0d,0x25,0x82,0x02,0x11,0x0a,0x26,0x27,0x28,0x29,0x2a,0x2b, 0x2c,0x2d,0x1b,0x12,0x19,0x0b,0x2e,0x18,0x2f,0x24,0x4a,0xd4,0x2a,0xa1,0x2d,0x5e, 0x02,0x18,0x28,0x62,0x28,0x30,0x35,0x81,0x41,0x82,0x0d,0x18,0x64,0xcc,0xa0,0xe1, 0x20,0x81,0x80,0x12,0x04,0x17,0x2a,0x80,0xe1,0xa1,0x46,0x0a,0x05,0x1d,0x6c,0x68, 0x5c,0x70,0x63,0xc5,0x8b,0x17,0x0b,0x14,0xb0,0xbb,0x85,0x03,0x24,0x48,0x18,0x20, 0x6d,0x74,0x70,0xa9,0x60,0xc4,0x0d,0x94,0x09,0xa4,0x15,0x28,0x90,0x23,0xa6,0xb4, 0x04,0x3a,0x64,0x2e,0x14,0x6a,0x4a,0xa0,0x81,0x9c,0x3b,0x5b,0x9a,0x5a,0x54,0x70, 0xc7,0xcc,0x99,0x0a,0x4a,0xf0,0x20,0xd1,0xc3,0x47,0xca,0x9d,0x3d,0x17,0x0c,0x18, 0x24,0x20,0x47,0xc8,0x90,0x0a,0x7e,0xd0,0x18,0x01,0x84,0x47,0x10,0x56,0x05,0x10, 0x78,0x5d,0x20,0x60,0x10,0x4f,0x53,0x6f,0x93,0x3a,0xb0,0x18,0x21,0x43,0x08,0x0d, 0x1e,0x39,0x7d,0x0c,0xc9,0x4a,0x60,0xd0,0x80,0x1c,0x5a,0x05,0x69,0xc3,0xb0,0x82, 0x88,0x8b,0x11,0x2a,0x4b,0x54,0x03,0xdc,0x16,0x00,0xcb,0x00,0xed,0x00,0xbc,0x1d, 0x31,0x62,0x16,0x01,0x8c,0x45,0x14,0xe0,0x68,0x11,0xa0,0x48,0x89,0x1c,0x06,0x8a, 0x14,0x53,0x1a,0x4a,0x6b,0xbb,0x00,0x20,0x71,0x18,0x28,0xb1,0x23,0xc7,0xb5,0x41, 0xab,0x16,0x82,0x32,0x40,0xa8,0x48,0x0e,0x23,0x39,0xbc,0xf6,0x2d,0xc4,0x20,0xb6, 0x82,0xc6,0x89,0x8e,0x28,0xe8,0x09,0xbc,0x90,0x00,0x04,0xaf,0x0b,0x41,0x0e,0xb0, 0x95,0x93,0xf3,0xe7,0x86,0x02,0x01,0x00,0x3b }; /* created by reswrap from file pattern_gif.gif */ extern const unsigned char pattern_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x18,0x00,0x18,0x00,0xe3,0x00,0x00,0xb2,0xc0,0xdc, 0xaa,0xa8,0xc0,0xa3,0x90,0xa5,0xa7,0x9c,0xb2,0x95,0x60,0x6e,0x78,0x00,0x00,0x86, 0x30,0x37,0xae,0xb4,0xce,0x8d,0x48,0x52,0x9c,0x78,0x89,0x98,0x6c,0x7b,0x7b,0x0c, 0x0d,0x7f,0x18,0x1b,0x91,0x54,0x60,0x82,0x24,0x29,0xa6,0x9c,0xb2,0x2c,0x00,0x00, 0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x04,0x94,0x10,0xc8,0x49,0xab,0xbd,0x38,0xeb, 0xad,0x83,0x18,0xda,0x20,0x04,0x18,0x51,0x18,0x9a,0x51,0x10,0xe5,0x99,0xae,0xd4, 0x21,0x1c,0x80,0x89,0x02,0xa3,0xe4,0x49,0x2a,0x2b,0x1f,0x88,0x02,0x22,0x61,0x13, 0xd8,0x02,0x81,0x9e,0xa0,0x97,0x08,0x22,0x14,0x85,0xc2,0x82,0x21,0xa5,0x0a,0x0f, 0xc0,0x28,0x63,0x51,0xd8,0x46,0x15,0x92,0x46,0x74,0xec,0xb0,0x38,0xc6,0xd1,0x46, 0x05,0x5d,0x10,0x58,0x04,0xec,0x8a,0xb8,0x00,0x2d,0x94,0x2b,0x67,0x7a,0x5a,0x92, 0x5d,0x24,0x00,0x0f,0x54,0x0e,0x24,0x00,0x01,0x67,0x0c,0x0f,0x00,0x09,0x5c,0x08, 0x07,0x49,0x05,0x7f,0x12,0x02,0x0c,0x0c,0x6e,0x38,0x94,0x96,0x8a,0x0c,0x04,0x24, 0x3b,0x14,0x03,0x20,0x0d,0x6a,0xa0,0x15,0x20,0x1b,0x26,0x30,0x1c,0x17,0x93,0x95, 0xaa,0x18,0xa4,0xae,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xae,0x11,0x00,0x3b }; /* created by reswrap from file paste_gif.gif */ extern const unsigned char paste_gif[]={ 0x47,0x49,0x46,0x38,0x39,0x61,0x10,0x00,0x10,0x00,0xf2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xff,0xff,0x00,0x7f,0x7f,0x00,0x7f,0x7f,0x7f,0xbf,0xbf,0xbf,0x00, 0x00,0x7f,0xff,0xff,0xff,0x21,0xf9,0x04,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03,0x4b,0x08,0xba,0xdc,0x1e,0x30,0x38,0x15, 0xa1,0x10,0x55,0xd2,0x41,0x46,0xc0,0x5f,0xd0,0x11,0x9a,0x48,0x16,0x68,0x2a,0x7a, 0x1b,0x99,0x41,0x04,0x49,0x8d,0x5c,0x4d,0x97,0xf6,0x60,0xec,0xbc,0x51,0xd2,0x04, 0xc3,0x61,0x38,0xdc,0xb5,0x6a,0x42,0xe2,0x41,0x68,0x00,0xac,0x46,0xc2,0xc8,0x92, 0x17,0xc8,0x25,0x95,0xc5,0x27,0x27,0x9a,0x59,0x3a,0x2b,0x57,0x6c,0xb3,0xd1,0x2b, 0x8f,0x27,0x93,0x04,0x00,0x3b }; /* created by reswrap from file print_gif.gif */ extern const unsigned char print_gif[]={ 0x47,0x49,0x46,0x38,0x39,0x61,0x10,0x00,0x10,0x00,0xf2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xff,0xff,0xff,0xc0,0xc0,0xc0,0x80,0x80,0x80,0x00,0x80,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x21,0xf9,0x04,0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03,0x49,0x08,0x0a,0xd1,0xbd,0x10,0x06,0x41, 0x5f,0x94,0x62,0xea,0xbb,0x66,0x75,0x1c,0x93,0x09,0x43,0x19,0x84,0x1e,0x55,0x5d, 0x8e,0x40,0x04,0x6f,0x66,0x29,0x41,0x91,0xaa,0xf5,0x49,0x3b,0x7c,0x7f,0x06,0x25, 0x92,0x70,0x30,0x24,0x35,0x0a,0xc8,0xa4,0x52,0x79,0xb4,0x39,0x99,0x35,0x5b,0x74, 0x49,0x95,0xfa,0xae,0x8f,0x1a,0xa1,0xb0,0xed,0x72,0xb9,0xba,0x17,0xd6,0x41,0x00, 0x24,0x00,0x00,0x3b }; /* created by reswrap from file quit_gif.gif */ extern const unsigned char quit_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x04,0x02,0x04,0x2c,0x2e,0x2c,0x74,0x72,0x74,0x74,0x76,0x74,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x39,0x08,0xba,0xdc,0xae,0x21,0xbc,0x17,0xe7,0x92,0xa0,0xe6,0x27,0xaa,0x0f,0x42, 0x33,0x68,0x64,0x30,0x30,0xdd,0x99,0x61,0x63,0x78,0x61,0xeb,0xcb,0x68,0x31,0x04, 0x03,0xa9,0xad,0xb4,0x0c,0x41,0xbf,0x84,0x46,0xc7,0xb4,0x8b,0xb8,0x84,0x91,0x24, 0xc8,0x42,0x18,0x0a,0x54,0x96,0xa8,0xb4,0x91,0x00,0x00,0x3b }; /* created by reswrap from file redo_gif.gif */ extern const unsigned char redo_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xff,0xff,0xff,0x5d,0x60,0x69,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x3b,0x84,0x8f,0xa9,0xc1,0x6c,0x8e,0x98,0x98,0x53,0x86,0x71, 0x02,0xdd,0xf4,0xe6,0xda,0x6c,0x1e,0xa0,0x09,0xd7,0x30,0x94,0x15,0x46,0xae,0xad, 0xc8,0x96,0x5e,0x43,0xc7,0x2e,0x80,0xa6,0xf9,0x73,0xf3,0x41,0x22,0xa3,0xf5,0x5e, 0x1c,0x13,0x0a,0xa8,0x5a,0xb1,0x16,0xb5,0xa5,0x02,0x97,0x73,0x3e,0xa7,0x86,0x02, 0x00,0x3b }; /* created by reswrap from file reload_gif.gif */ extern const unsigned char reload_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xff,0xfb,0xff,0xff,0xff,0xff,0x31,0x9a,0x00,0x00,0x65,0x63,0x00, 0x9a,0x63,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x4a,0x08,0x10,0xdc,0xad,0x50,0x05,0x41,0xab,0x60,0x51,0xd6,0xc1,0xef,0x08,0xd9, 0x24,0x70,0x04,0x17,0x98,0xd1,0xd4,0x11,0xa5,0x03,0x4a,0x24,0xcb,0x72,0x28,0x5c, 0x18,0xc2,0x3c,0xd6,0xcb,0x50,0x90,0x34,0xda,0xab,0xf7,0xeb,0xf8,0x84,0x90,0x13, 0xad,0x74,0xe4,0x29,0x07,0x33,0x43,0xf1,0x93,0x8c,0xc9,0x82,0xc3,0xe7,0x2c,0x48, 0x85,0x2d,0x69,0xbb,0xac,0x6b,0x3c,0xcc,0x98,0x21,0x09,0x00,0x3b }; /* created by reswrap from file saveall_gif.gif */ extern const unsigned char saveall_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x77,0x80,0xd7,0x94,0x96,0x94,0xe7,0xeb,0xe7,0xce,0xcf,0xce,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x43,0x08,0xba,0xdc,0x1e,0x30,0xca,0x27,0x06,0xb9,0x64,0x94,0xc0,0xa4,0x8f,0x5d, 0x85,0x65,0x44,0x20,0x70,0xc0,0xf7,0x9d,0x8a,0x69,0x61,0x96,0x29,0xb7,0x22,0x3c, 0xc8,0x6c,0x5a,0x5f,0xc3,0xe9,0xa3,0xa6,0xca,0x60,0x28,0xf8,0xe5,0x82,0xc5,0xe4, 0x0f,0x42,0x3b,0x49,0x7e,0xa1,0xd3,0x4b,0xc6,0x5c,0x04,0x03,0xd3,0x5c,0x43,0x55, 0x75,0x78,0x1d,0x09,0x00,0x3b }; /* created by reswrap from file saveas_gif.gif */ extern const unsigned char saveas_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x77,0x80,0xd7,0x94,0x96,0x94,0xe7,0xeb,0xe7,0xce,0xcf,0xce,0xff, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x4d,0x08,0xba,0xdc,0x1a,0x30,0x4a,0xf9,0xc4,0x20,0x38,0xe3,0x51,0x42,0xbd,0x84, 0x21,0x1a,0xdb,0xe0,0x01,0x81,0x15,0x92,0x2b,0x31,0x08,0x67,0x7a,0x89,0x18,0xfd, 0xc6,0x6a,0x46,0xbb,0xf0,0xa7,0xb3,0x3c,0x9c,0x65,0x30,0x10,0x11,0x5f,0x3d,0x94, 0x60,0xc9,0x6c,0x2e,0x85,0x11,0x91,0x24,0x99,0x82,0x11,0xa5,0x98,0x14,0xf4,0x68, 0xca,0x52,0x9f,0xdc,0x80,0xf7,0x84,0x9a,0x98,0xc9,0x8e,0x34,0x20,0x01,0x00,0x3b }; /* created by reswrap from file save_gif.gif */ extern const unsigned char save_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x77,0x80,0xd7,0x94,0x96,0x94,0xe7,0xeb,0xe7,0xce,0xcf,0xce,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x42,0x08,0xba,0xdc,0x1a,0x30,0x4a,0xf9,0xc4,0x20,0x38,0xe3,0x51,0x42,0xbd,0x5a, 0x36,0x0c,0x1e,0x10,0x58,0xa1,0x28,0x94,0x27,0x98,0x0e,0xeb,0x97,0x6e,0xb1,0x89, 0xce,0x30,0x2b,0x58,0x63,0x3f,0xee,0xba,0x9d,0x70,0x08,0xac,0xac,0x26,0x91,0xda, 0x69,0xe5,0x0b,0x60,0x4e,0xc1,0x40,0xf3,0xa9,0x04,0x4e,0x09,0xd0,0x05,0x72,0xeb, 0xe8,0x32,0x12,0x00,0x3b }; /* created by reswrap from file search_gif.gif */ extern const unsigned char search_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xea,0xe6,0xdd,0xd5,0xcc,0xbb,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x32,0x84,0x8f,0xa9,0xcb,0xad,0x01,0x0f,0x0c,0x2b,0x08,0x6a, 0x2c,0x4e,0x53,0x46,0x3e,0x51,0xe1,0x96,0x5d,0x91,0xf6,0x65,0xe3,0x8a,0x41,0x66, 0x30,0xb8,0x23,0x20,0x43,0x31,0xda,0xd5,0xe1,0x7b,0xae,0xb4,0x8f,0xe3,0xbc,0x68, 0x43,0x44,0x70,0x66,0x0c,0x01,0x0a,0x00,0x3b }; /* created by reswrap from file searchnext_gif.gif */ extern const unsigned char searchnext_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0xa2,0x8d,0x68,0x00,0x00,0x80,0x00,0x00,0x00,0xea,0xe6,0xdd,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x3b,0x08,0xba,0xdc,0x1e,0x22,0x0a,0xc7,0xe0,0xb2,0x60,0x36,0xcd,0xa4,0xe3,0x8b, 0xd7,0x60,0x8a,0x04,0x5e,0x27,0x35,0x0c,0xcb,0x4a,0x29,0x2e,0xcc,0xaa,0x6b,0x00, 0x04,0xeb,0xcc,0x0c,0x44,0xbe,0xf6,0xb1,0x16,0x70,0x80,0x1b,0x36,0x7c,0xc8,0x20, 0x0c,0x28,0x54,0x02,0x78,0x41,0xa8,0x4e,0x16,0xcd,0x31,0x12,0x00,0x3b }; /* created by reswrap from file searchprev_gif.gif */ extern const unsigned char searchprev_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x80,0xa2,0x8d,0x68,0x00,0x00,0x00,0xea,0xe6,0xdd,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x38,0x08,0xba,0xdc,0x1e,0x30,0x08,0x07,0x82,0x92,0x0b,0xb7,0xf8,0x1e,0xec,0x1b, 0x97,0x4d,0xd4,0x46,0x96,0xc0,0x30,0x2c,0x2a,0xda,0x2a,0xaf,0xa3,0x0e,0x93,0x30, 0xcb,0xc4,0xac,0xe6,0x31,0xcc,0xd3,0x83,0x5f,0x43,0x47,0xec,0xa5,0x78,0x2c,0x24, 0x23,0x18,0x63,0xae,0x96,0x37,0x58,0x34,0x01,0x00,0x3b }; /* created by reswrap from file shiftleft_gif.gif */ extern const unsigned char shiftleft_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x23,0x84,0x6f,0x81,0xcb,0x8d,0x01,0x55,0x9c,0xca,0x59,0xb1, 0x68,0x04,0x02,0xdb,0xd3,0x85,0x9e,0x06,0x7a,0x1f,0x98,0x51,0xe7,0x37,0x01,0x1a, 0xb4,0x36,0x2d,0x1c,0xd7,0x89,0xed,0x14,0x00,0x3b }; /* created by reswrap from file shiftright_gif.gif */ extern const unsigned char shiftright_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x24,0x84,0x6f,0x81,0xcb,0x8d,0x01,0x55,0x9c,0xca,0x59,0x20, 0x1e,0x85,0x47,0xe4,0xeb,0x85,0xdf,0xb6,0x78,0x17,0xf2,0x25,0xd4,0x79,0x4d,0xc0, 0xc6,0xb1,0x8c,0x1b,0xcb,0xf6,0x7b,0x3b,0x05,0x00,0x3b }; /* created by reswrap from file small_gif.gif */ extern const unsigned char small_gif[]={ 0x47,0x49,0x46,0x38,0x39,0x61,0x10,0x00,0x10,0x00,0xf7,0x2d,0x00,0xd8,0xc4,0x9b, 0xdd,0xcc,0xa5,0xdf,0xce,0xaa,0xd9,0xc6,0x9d,0xce,0xb6,0x88,0xc0,0xa2,0x75,0xb8, 0x99,0x70,0xb1,0x92,0x6b,0xb1,0x93,0x6b,0xb5,0x91,0x65,0x8e,0x61,0x3f,0xa0,0x74, 0x4d,0x71,0x46,0x2d,0x62,0x39,0x24,0x94,0x68,0x44,0x64,0x3e,0x27,0xdd,0xcb,0xa5, 0xdd,0xcc,0xa6,0x90,0x79,0x60,0x62,0x40,0x2c,0x67,0x40,0x29,0x66,0x3f,0x28,0x61, 0x3b,0x26,0x36,0x18,0x11,0x42,0x25,0x1c,0xa2,0x7f,0x58,0xb1,0x8a,0x5f,0x85,0x57, 0x38,0x5e,0x35,0x22,0x4e,0x2b,0x1c,0x43,0x25,0x18,0xe5,0xd6,0xb7,0xe7,0xda,0xbd, 0x93,0x85,0x7a,0x1f,0x0a,0x09,0x54,0x31,0x20,0x51,0x2e,0x1e,0x6d,0x44,0x2c,0x6c, 0x44,0x2c,0x45,0x24,0x18,0x5b,0x39,0x26,0x6c,0x4a,0x33,0xc4,0xb5,0xa4,0xaf,0x8a, 0x66,0x90,0x63,0x41,0x61,0x3a,0x25,0x42,0x24,0x17,0xea,0xdd,0xc4,0xf1,0xea,0xd9, 0x3d,0x2a,0x25,0x20,0x0b,0x09,0x42,0x23,0x17,0x4e,0x2d,0x1d,0x47,0x26,0x19,0x67, 0x3f,0x29,0x5f,0x3a,0x26,0x65,0x3e,0x28,0xa0,0x78,0x51,0x46,0x2b,0x22,0xc4,0xaf, 0x93,0xcd,0xb4,0x92,0x84,0x59,0x3b,0x5e,0x36,0x22,0xe9,0xdd,0xc3,0xed,0xe5,0xd2, 0x43,0x2e,0x27,0x28,0x11,0x0c,0x49,0x27,0x1a,0x36,0x19,0x11,0x2e,0x14,0x0e,0x45, 0x25,0x18,0x6f,0x48,0x30,0x9d,0x74,0x4e,0x70,0x49,0x30,0x37,0x1b,0x12,0x7f,0x5f, 0x43,0xb6,0x91,0x65,0x8c,0x5f,0x3e,0x65,0x3c,0x25,0xe6,0xda,0xbd,0x94,0x80,0x70, 0x3b,0x1e,0x14,0x57,0x34,0x22,0x64,0x40,0x2a,0x8c,0x6d,0x4f,0x9b,0x7a,0x58,0x90, 0x6e,0x4e,0x9c,0x7b,0x58,0xbd,0x9f,0x76,0xc5,0xa9,0x7f,0x6a,0x49,0x32,0x3b,0x20, 0x18,0xbb,0x98,0x6b,0x8f,0x63,0x42,0x54,0x30,0x1e,0xd9,0xc6,0x9e,0x4f,0x32,0x24, 0x2c,0x14,0x0e,0x89,0x67,0x48,0xb5,0x97,0x71,0xe2,0xd3,0xb3,0xe9,0xdc,0xc2,0xe4, 0xd5,0xb7,0xe6,0xd9,0xbe,0xe0,0xcf,0xad,0xd2,0xbb,0x91,0xb4,0x9a,0x74,0x27,0x0c, 0x0b,0x7e,0x5b,0x40,0x65,0x3d,0x27,0x41,0x24,0x16,0xc3,0xa6,0x78,0x28,0x0f,0x0c, 0x1c,0x08,0x07,0xb3,0x99,0x75,0xdb,0xc9,0xa3,0xe3,0xd3,0xb5,0xe7,0xda,0xbf,0xf0, 0xe6,0xd3,0xea,0xde,0xc6,0xce,0xb7,0x8f,0xce,0xba,0x99,0xde,0xcd,0xac,0x2c,0x12, 0x0e,0x31,0x14,0x0f,0x4a,0x29,0x1a,0x40,0x23,0x16,0xb8,0x97,0x6a,0x27,0x0f,0x0c, 0x1b,0x08,0x07,0xcf,0xbd,0xa1,0xea,0xde,0xc5,0xdd,0xce,0xb6,0xb7,0xa3,0x8c,0xef, 0xe5,0xd1,0xee,0xe4,0xcf,0xa2,0x8d,0x75,0xbf,0xae,0x97,0xf2,0xeb,0xda,0x3a,0x21, 0x1b,0x25,0x0b,0x0a,0x4f,0x2c,0x1c,0x8e,0x63,0x42,0x5d,0x3e,0x2c,0x30,0x19,0x13, 0xac,0x94,0x7c,0xf6,0xf0,0xe3,0xec,0xe2,0xd1,0xc1,0xb2,0xa1,0xf6,0xf1,0xe5,0xf4, 0xec,0xde,0xf8,0xf3,0xe9,0xf4,0xed,0xde,0x3d,0x23,0x1d,0x23,0x0b,0x0a,0x50,0x2c, 0x1c,0x58,0x31,0x1f,0x6f,0x44,0x2b,0x53,0x33,0x24,0x9c,0x80,0x60,0x91,0x6f,0x50, 0xf1,0xe9,0xd7,0xf9,0xf6,0xec,0xf8,0xf4,0xea,0xf2,0xea,0xd9,0xe8,0xdc,0xc6,0xe3, 0xd4,0xb8,0xe7,0xd9,0xbd,0x37,0x1f,0x19,0x3c,0x1d,0x14,0x47,0x27,0x19,0x3d,0x21, 0x15,0xe5,0xdb,0xcd,0xdf,0xd6,0xc7,0x5d,0x46,0x37,0x61,0x44,0x30,0xbc,0xab,0x95, 0xf4,0xec,0xdd,0xec,0xe1,0xcc,0xdd,0xcf,0xbb,0xe0,0xd1,0xb9,0xba,0xa4,0x87,0xe5, 0xd7,0xbe,0xe5,0xd6,0xb8,0xe3,0xd6,0xc1,0xa6,0x93,0x85,0x40,0x25,0x19,0x2f,0x16, 0x0f,0xf7,0xf2,0xe6,0xfa,0xf9,0xf2,0xd7,0xc8,0xb0,0x61,0x43,0x31,0xba,0xa5,0x8d, 0xee,0xe3,0xcf,0xea,0xde,0xc7,0xe5,0xd9,0xc4,0xe4,0xd6,0xbd,0xe8,0xda,0xc0,0xd8, 0xca,0xb1,0xd7,0xc6,0xaa,0xfa,0xfa,0xf4,0xe5,0xe2,0xdc,0xc4,0xba,0xaf,0xf1,0xe9, 0xd8,0xd4,0xc0,0xa1,0xe1,0xd3,0xba,0xf7,0xf3,0xe8,0xe0,0xd1,0xb8,0xe2,0xd4,0xb9, 0x9d,0x88,0x70,0xdf,0xce,0xab,0xf7,0xf3,0xe9,0xfb,0xfc,0xf8,0xfa,0xfb,0xf7,0xfa, 0xfa,0xf5,0xdf,0xce,0xae,0xf5,0xef,0xe2,0xe3,0xd5,0xba,0xe9,0xdc,0xc4,0xfb,0xfa, 0xf3,0xf2,0xee,0xe5,0xdf,0xd1,0xb8,0xd2,0xbd,0x99,0xc1,0xaf,0x98,0xf1,0xec,0xe1, 0xf7,0xf5,0xeb,0xf8,0xf6,0xee,0xf9,0xf8,0xf1,0xec,0xe1,0xca,0xe2,0xd2,0xb8,0xe2, 0xd2,0xb6,0xf6,0xf2,0xe6,0xf1,0xeb,0xdb,0xf6,0xf2,0xe8,0xfb,0xfb,0xf7,0xeb,0xe1, 0xce,0xf5,0xf1,0xe5,0xef,0xe7,0xd6,0xff,0x18,0x00,0xbf,0x08,0x00,0xcc,0x18,0xdc, 0xf2,0x61,0xf1,0xff,0x18,0xff,0xbf,0x08,0xbf,0x93,0xe8,0xdc,0x92,0x06,0xd9,0x0a, 0x25,0x07,0x08,0x40,0x08,0x08,0x2c,0x18,0xf2,0x00,0x61,0xff,0x00,0x18,0xbf,0x00, 0x08,0x00,0x00,0x4d,0x01,0x00,0x08,0x00,0x00,0x80,0x00,0x00,0x06,0x2c,0x00,0x00, 0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x08,0xff,0x00,0x01,0x04,0x10,0x30,0x80,0x40, 0x01,0x03,0x07,0x10,0x24,0x50,0xb0,0x80,0x41,0x03,0x07,0x0f,0x20,0x44,0x88,0x20, 0x61,0x02,0x85,0x0a,0x16,0x2e,0x60,0xc8,0xa0,0x61,0x03,0x87,0x0e,0x1e,0x3e,0x80, 0x08,0x21,0x62,0x04,0x89,0x12,0x26,0x4e,0xa0,0x48,0xa1,0x62,0x05,0x8b,0x16,0x2e, 0x5e,0xc0,0x88,0x21,0x63,0x06,0x8d,0x1a,0x36,0x6e,0xe0,0xc8,0xa1,0x63,0x07,0x8f, 0x1e,0x3e,0x7e,0x00,0x09,0x22,0x64,0x08,0x91,0x22,0x46,0x8e,0x20,0x49,0xa2,0x64, 0x09,0x93,0x26,0x4e,0x9e,0x40,0x89,0x22,0x65,0x0a,0x95,0x2a,0x56,0xae,0x60,0xc9, 0xa2,0x65,0x0b,0x97,0x2e,0x5e,0xbe,0x80,0x09,0x23,0x66,0x0c,0x99,0x32,0x66,0xce, 0xa0,0x49,0xa3,0x66,0x0d,0x9b,0x36,0x6e,0xde,0xc0,0x89,0x23,0x67,0x0e,0x9d,0x3a, 0x76,0xee,0xe0,0xc9,0xa3,0x67,0x0f,0x9f,0x3e,0x7e,0xfe,0x00,0x0a,0x24,0x68,0x10, 0xa1,0x42,0x86,0x0e,0x21,0x4a,0xa4,0x68,0x11,0xa3,0x0e,0x8d,0x1c,0x3d,0x82,0x14, 0x49,0xd2,0x24,0x4a,0x95,0x2c,0x19,0xba,0x84,0x29,0x93,0xa6,0x4d,0x9c,0x3a,0x79, 0xfa,0x04,0x2a,0x94,0xa8,0x51,0xa4,0x4a,0x99,0x22,0x75,0x0a,0x55,0x2a,0x55,0xab, 0x58,0xb5,0x72,0xf5,0x0a,0x56,0x2c,0x59,0xb3,0x68,0xd5,0xb2,0x75,0x0b,0x57,0x2e, 0x5d,0xbb,0x78,0xf5,0xf2,0xf5,0x0b,0x58,0x30,0x61,0xc3,0x88,0x15,0x33,0x76,0xec, 0x0e,0xb2,0x64,0xca,0x2a,0x2d,0xe3,0xc5,0xac,0x99,0xb3,0x67,0x86,0x42,0x41,0x8b, 0x26,0x6d,0x1a,0xb5,0x6a,0xd6,0x44,0x5d,0x25,0xc3,0x96,0x4d,0xdb,0x36,0x6e,0xdd, 0xbc,0x7d,0x03,0x57,0xc9,0x5a,0x38,0x71,0xe3,0xc8,0x85,0x22,0x55,0xce,0xdc,0xb9, 0x5e,0xc8,0xd0,0xa5,0x53,0xa7,0x6e,0x9d,0x30,0x80,0xec,0xda,0x05,0x04,0x00,0x3b }; /* created by reswrap from file styles_gif.gif */ extern const unsigned char styles_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x18,0x00,0x18,0x00,0xe3,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x13,0xb7,0xc2,0xff,0xb4,0x09,0x59, 0x60,0x6e,0x69,0x99,0x79,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x04,0x76,0x10,0xc8,0x49,0xab,0xad,0x21,0x03, 0xc1,0xf9,0x18,0x12,0x21,0x12,0xdf,0x37,0x65,0xc1,0xd6,0x09,0x26,0x30,0x92,0xe5, 0x25,0xcf,0x27,0x0a,0x14,0x78,0x61,0x18,0x47,0xdf,0xef,0x06,0x8c,0x2d,0x57,0xf8, 0xf8,0x7a,0x31,0x9a,0xf2,0x82,0xd2,0x34,0x53,0xc7,0x23,0xe5,0x09,0xa0,0x46,0x7d, 0xcb,0xec,0x04,0xc1,0xed,0x96,0x06,0x89,0xb0,0x38,0xb9,0xed,0x72,0xbf,0xe2,0x71, 0x4b,0x9b,0xbd,0xf6,0xaa,0xcf,0xd4,0xc5,0x7d,0x80,0x53,0xd9,0xf8,0x78,0x66,0x10, 0x1d,0xdc,0x25,0x7a,0x01,0x7c,0x47,0x7e,0x4d,0x78,0x4b,0x4d,0x03,0x66,0x5e,0x63, 0x86,0x80,0x28,0x8a,0x8b,0x08,0x60,0x61,0x85,0x1a,0x87,0x98,0x99,0x98,0x11,0x00, 0x3b }; /* created by reswrap from file syntax_gif.gif */ extern const unsigned char syntax_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x18,0x00,0x18,0x00,0xa1,0x00,0x00,0xb2,0xc0,0xdc, 0x99,0x0b,0x06,0x00,0x00,0xff,0x12,0xae,0x00,0x2c,0x00,0x00,0x00,0x00,0x18,0x00, 0x18,0x00,0x00,0x02,0x4e,0x84,0x8f,0xa9,0xcb,0xed,0xff,0x02,0x13,0xd0,0x48,0x45, 0x2b,0xb8,0x29,0xc7,0x70,0x81,0x86,0xe7,0x84,0x9b,0x35,0x42,0xa6,0x09,0x78,0xc3, 0x60,0xbc,0x08,0x18,0x72,0x6d,0x0c,0x03,0xb2,0xc6,0xf7,0xfe,0x43,0x4a,0xd8,0x50, 0x18,0xc6,0xf0,0x54,0x5c,0xd8,0x24,0xc7,0x14,0x87,0x29,0x3a,0xd4,0x0e,0x19,0xe6, 0x69,0x75,0xa5,0xa5,0x50,0x2c,0xab,0x95,0x3a,0x43,0x62,0x6b,0xcd,0x9f,0xf9,0x8c, 0x7e,0x14,0x00,0x00,0x3b }; /* created by reswrap from file undo_gif.gif */ extern const unsigned char undo_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xff,0xff,0xff,0x5d,0x60,0x69,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x3b,0x84,0x8f,0x69,0x11,0xcb,0xac,0x40,0x10,0x4c,0x58,0x0b, 0xd1,0xbc,0x1c,0x6b,0xfe,0x6c,0xc1,0x70,0x6c,0xd8,0x80,0x8a,0x65,0xd7,0x48,0xa7, 0x13,0x8e,0x2e,0x45,0x1a,0xc3,0x88,0xa2,0xb3,0xbc,0x50,0x89,0x58,0xdb,0x85,0x4e, 0xc1,0x59,0x87,0xa6,0x30,0x61,0x70,0x91,0x58,0x2e,0x62,0xcb,0x15,0xa1,0xd4,0x02, 0x00,0x3b }; fox1.6-1.6.57/adie/icons.h000066400000000000000000000067001326741342000150260ustar00rootroot00000000000000/* Generated by reswrap version 4.0.0 */ /* created by reswrap from file adie_gif.gif */ extern const unsigned char adie_gif[]; /* created by reswrap from file big_gif.gif */ extern const unsigned char big_gif[]; /* created by reswrap from file bookdel_gif.gif */ extern const unsigned char bookdel_gif[]; /* created by reswrap from file booknext_gif.gif */ extern const unsigned char booknext_gif[]; /* created by reswrap from file bookprev_gif.gif */ extern const unsigned char bookprev_gif[]; /* created by reswrap from file bookset_gif.gif */ extern const unsigned char bookset_gif[]; /* created by reswrap from file close_gif.gif */ extern const unsigned char close_gif[]; /* created by reswrap from file colors_gif.gif */ extern const unsigned char colors_gif[]; /* created by reswrap from file copy_gif.gif */ extern const unsigned char copy_gif[]; /* created by reswrap from file cut_gif.gif */ extern const unsigned char cut_gif[]; /* created by reswrap from file delete_gif.gif */ extern const unsigned char delete_gif[]; /* created by reswrap from file delimit_gif.gif */ extern const unsigned char delimit_gif[]; /* created by reswrap from file fonts_gif.gif */ extern const unsigned char fonts_gif[]; /* created by reswrap from file help_gif.gif */ extern const unsigned char help_gif[]; /* created by reswrap from file indent_gif.gif */ extern const unsigned char indent_gif[]; /* created by reswrap from file info_gif.gif */ extern const unsigned char info_gif[]; /* created by reswrap from file lang_gif.gif */ extern const unsigned char lang_gif[]; /* created by reswrap from file new_gif.gif */ extern const unsigned char new_gif[]; /* created by reswrap from file open_gif.gif */ extern const unsigned char open_gif[]; /* created by reswrap from file palette_gif.gif */ extern const unsigned char palette_gif[]; /* created by reswrap from file pattern_gif.gif */ extern const unsigned char pattern_gif[]; /* created by reswrap from file paste_gif.gif */ extern const unsigned char paste_gif[]; /* created by reswrap from file print_gif.gif */ extern const unsigned char print_gif[]; /* created by reswrap from file quit_gif.gif */ extern const unsigned char quit_gif[]; /* created by reswrap from file redo_gif.gif */ extern const unsigned char redo_gif[]; /* created by reswrap from file reload_gif.gif */ extern const unsigned char reload_gif[]; /* created by reswrap from file saveall_gif.gif */ extern const unsigned char saveall_gif[]; /* created by reswrap from file saveas_gif.gif */ extern const unsigned char saveas_gif[]; /* created by reswrap from file save_gif.gif */ extern const unsigned char save_gif[]; /* created by reswrap from file search_gif.gif */ extern const unsigned char search_gif[]; /* created by reswrap from file searchnext_gif.gif */ extern const unsigned char searchnext_gif[]; /* created by reswrap from file searchprev_gif.gif */ extern const unsigned char searchprev_gif[]; /* created by reswrap from file shiftleft_gif.gif */ extern const unsigned char shiftleft_gif[]; /* created by reswrap from file shiftright_gif.gif */ extern const unsigned char shiftright_gif[]; /* created by reswrap from file small_gif.gif */ extern const unsigned char small_gif[]; /* created by reswrap from file styles_gif.gif */ extern const unsigned char styles_gif[]; /* created by reswrap from file syntax_gif.gif */ extern const unsigned char syntax_gif[]; /* created by reswrap from file undo_gif.gif */ extern const unsigned char undo_gif[]; fox1.6-1.6.57/adie/indent_gif.gif000066400000000000000000000001771326741342000163410ustar00rootroot00000000000000GIF87a²ŔÜox‰Y`n,07˙…Ą,LşÜŢAČIk]čÍ{`¸DVI5™§rbۦi8Ĺş ´űĆXŰźF0Ô HGKţ€ˇaŃřP.%*°3¨R}׋pëůšĎčE;fox1.6-1.6.57/adie/info_gif.gif000066400000000000000000000005511326741342000160070ustar00rootroot00000000000000GIF87aĄ˛ŔÜ>l:dBl Bl$^|,n”$jŚV„ Ft .L$bŚ<~¤üţüJdR| Bt*LFlDŽ´L’´$RlbŚ N|6dD†¬TšĽTšÄt6\TžÄ,VtZ„Ft2\*T^”Jt.TV„4z¤$Nd,b„^Ś$f”<‚¬üúü>d&L N„2T&D:l,Ž@€pH,‚Ŕ `Ă‘PŚ„Ńh8¤(aL(ÝŠĺ‚Q‹ŚfCát<—Č- X&!] "#$%&C'i…( )C *+g],-.(%C/ 0]#*) C&(/1‚2«3E 456 F¸7 &ÁMB )&&6ËŇÓÔA;fox1.6-1.6.57/adie/lang_gif.gif000066400000000000000000000011041326741342000157700ustar00rootroot00000000000000GIF87aĄ˛ŔÜŰŰŞ’IUm$’’UŰŰ˙’mU’$¶mŰm¶¶ŞmmUmIU˙’UŰ’ŞŰ’’IŰ¶Ş’’Ş˙mU¶’UŰ˙˙¶¶˙ŰI¶ŰŞ’¶U˙˙˙ŰmU˙ŰŞmI¶II˙˙ŞŰ’U˙¶U˙’$$I$’˙Ű˙IIUmmŞŰ¶UI$U˙¶ŞII¶’޶mU’¶Ş$$UImU$¶¶U$IU,ţ@€pH,‚ˇ`l D"qP8ť †ÁĐp< ‘+€)\H …á1I ČĹ‚‚@©,h‹Â˛ľ 0F   pr  !""#$%&Br– '!'"!" (% Ş–—ś±´ )$d—Î!ś* ˛Ç  pľ' ®'´"SS+pBżśĺ!çęC®ś,ÔĆ  HhaOH‰,DPŁu-.h3‚ żŐ6Đ“  B€-ŠĽpÁAC,cS.<ě„(P`qi\S ôňČ j‰Lňu+Ŕ"@.¨âĐógČŻb© đN_\zăĂ@Ś:0P4Ä  îđěöQ†B0Ä1@Ĺ đôęV( »†Ě@A‚Ć–"ěNÔ0`ă„‘$RŔm"ńŽ9bĆ ;fox1.6-1.6.57/adie/main.cpp000066400000000000000000000127061326741342000151750ustar00rootroot00000000000000/******************************************************************************** * * * T h e A d i e T e x t E d i t o r * * * ********************************************************************************* * Copyright (C) 1998,2005 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: main.cpp,v 1.19 2005/11/23 07:07:06 fox Exp $ * ********************************************************************************/ #include "fx.h" #include #include #include #include #ifndef WIN32 #include #endif #include #include "FXRex.h" #include "FXArray.h" #include "Hilite.h" #include "TextWindow.h" #include "Adie.h" #include "icons.h" /* Note: */ /*******************************************************************************/ // Print command line help void printusage(){ fprintf(stderr,"Usage: adie [options] files...\n"); fprintf(stderr," options:\n"); fprintf(stderr," -h, --help Print help.\n"); fprintf(stderr," -V, --version Print version number.\n"); fprintf(stderr," -v, --view View, don't edit file.\n"); fprintf(stderr," -e, --edit Edit file.\n"); fprintf(stderr," -g GEOMETRY, --geometry GEOMETRY Specify window size.\n"); fprintf(stderr," -l NUM, --line NUM Jump to line number.\n"); fprintf(stderr," -m LANGUAGE, --mode LANGUAGE Force language mode.\n"); fprintf(stderr," -t TAGS, --tags TAGS Load tags file.\n"); } // Start the whole thing int main(int argc,char *argv[]){ TextWindow *window=NULL; FXchar *language=NULL; FXchar *tags=NULL; FXbool edit=TRUE; FXint line=0; FXString file; FXint arg; FXint x,y,w,h,g; // Make application Adie application("Adie"); // Open display application.init(argc,argv); // Make a tool tip new FXToolTip(&application,0); // Create it application.create(); // Loop over args for(arg=1; arg=argc){ fprintf(stderr,"Adie: missing line number argument.\n"); exit(1); } sscanf(argv[arg],"%d",&line); } else if(compare(argv[arg],"-t")==0 || compare(argv[arg],"--tags")==0){ if(++arg>=argc){ fprintf(stderr,"Adie: missing tags file argument.\n"); exit(1); } tags=argv[arg]; } else if(compare(argv[arg],"-m")==0 || compare(argv[arg],"--mode")==0){ if(++arg>=argc){ fprintf(stderr,"Adie: missing language mode argument.\n"); exit(1); } language=argv[arg]; } else if(compare(argv[arg],"-g")==0 || compare(argv[arg],"--geometry")==0){ if(++arg>=argc){ fprintf(stderr,"Adie: missing geometry argument.\n"); exit(1); } g=fxparsegeometry(argv[arg],x,y,w,h); } else if(compare(argv[arg],"-V")==0 || compare(argv[arg],"--version")==0){ fprintf(stdout,"Adie - ADvanced Interactive Editor %d.%d.%d.\nCopyright (C) 1998,2003 Jeroen van der Zijp.\n\n",VERSION_MAJOR,VERSION_MINOR,VERSION_PATCH); exit(0); } // Load the file else{ file=FXPath::absolute(argv[arg]); window=new TextWindow(&application,"untitled"); window->create(); window->loadFile(file); window->readBookmarks(file); window->readView(file); window->setEditable(edit); if(language) window->forceSyntax(language); if(line) window->visitLine(line); } } // Make window, if none opened yet if(!window){ window=new TextWindow(&application,"untitled"); window->create(); if(language) window->forceSyntax(language); } // Run return application.run(); } fox1.6-1.6.57/adie/new_gif.gif000066400000000000000000000001721326741342000156440ustar00rootroot00000000000000GIF87aÂ˙˙˛ŔÜ„‚„˙˙˙,G˘ŕâ8$Ş–ČźQŘ,JŽQ+4ű 4żJŽXś;fox1.6-1.6.57/adie/open_gif.gif000066400000000000000000000002001326741342000160040ustar00rootroot00000000000000GIF89aň˛ŔÜ˙˙˙€€€˙˙˙!ů,Eşţ,® D‘Ö‹•¶y•%>1<ĄsŞđÚ®^úܸŁĹĐ˙>źĂu˘˛wIň–Ĺ&!iT6©P¦çYýqr`N;fox1.6-1.6.57/adie/palette_gif.gif000066400000000000000000000014111326741342000165060ustar00rootroot00000000000000GIF87aƲŔÜmmUIIUImUmIU$$’’U¶’Ş$$U۶ŞŰŰŞ¶¶Ş’¶ŞII’¶U$mU$m¶’UI’UI¶U$I’$¶$U’m¶Şm¶U¶˙Ş’ŰŞm’ŞŰŰ˙ŰmUŰ$UŰ$’ŰU$’UI’ŞmU’’ŞŰ’Ş˙mU˙’ŞŰm޶¶Ű˙¶ŰŞm’U’ŞI¶Ş˙¶Ş¶$¶˙˙’Ű˙$’ŞŰIU˙ŰŞ$¶Ş˙Ű˙˙˙˙Ű˙˙˙˙ŞmŞIŞ$IU¶¶˙$’˙IUm¶˙I$mŰ˙mmŞŰ˙ŞŰ¶˙,ţ€‚„…†‡„ڇ•‘   – ‘ ˘¦¬ ™‡¬¬¬¬©„¦  –›‚ Ó!" #$$ %‚ &'()*+,- ./$JÔ*ˇ-^(b(05A‚ dĚ á €*€áˇF lh\pcĹ‹ °»…$H mtp©`Ä ” ¤(#¦´:d.jJ ś;[šZTpÇĚ™ Jđ ŃĂGĘť= $ GČ ~Đ„GVx] `OSo“:°!C 9} ÉJ`Đ€Zið‚‹*KTÜËíĽ1bŚEŕh H‰ŠSJk» q(±#ǵA«‚2@¨H#9Ľö-Ä ¶‚ƉŽ(č ĽŻ A°•“óç†;fox1.6-1.6.57/adie/parsesyntax.cpp000066400000000000000000000204671326741342000166350ustar00rootroot00000000000000/******************************************************************************** * * * P a r s e S y n t a x F i l e * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: parsesyntax.cpp,v 1.14 2006/01/22 18:01:12 fox Exp $ * ********************************************************************************/ #include "fx.h" #include #include #include #include "FXRex.h" #include "FXArray.h" #include "Hilite.h" #include "Commands.h" #include "TextWindow.h" #include "Adie.h" /* Notes: - Parses Adie syntax and style file. */ #define MAXLINE 2048 /*******************************************************************************/ // Used while parsing class Parser { private: FXString file; FXchar *line; FXchar *tok; FILE *fp; FXint number; FXchar buffer[MAXLINE]; private: FXchar* getline(); const FXchar* token(); const FXchar* word(); const FXchar* string(); public: Parser(const FXString& fn):file(fn),line(NULL),tok(NULL),fp(NULL),number(0){} FXbool parse(FXSyntaxList& syntaxes); FXbool parserules(FXSyntax *syntax,FXint parent); ~Parser(){ if(fp) fclose(fp); } }; // Get next non-empty line FXchar* Parser::getline(){ register FXchar *ptr; while((ptr=fgets(buffer,sizeof(buffer),fp))!=NULL){ number++; while(*ptr && isspace((FXuchar)*ptr)) ptr++; if(*ptr!='\0' && *ptr!='\n' && *ptr!='\r' && *ptr!='#') break; } return ptr; } // Get next token from file const FXchar* Parser::token(){ line=tok=getline(); if(!line) return NULL; while(*line && isalpha((FXuchar)*line)) line++; *line++='\0'; return tok; } // Parse word from line const FXchar* Parser::word(){ register FXchar *value; while(*line && isspace((FXuchar)*line)) line++; value=line; while(*line && !isspace((FXuchar)*line)) line++; *line++='\0'; return value; } // Parse escaped string from line const FXchar* Parser::string(){ register FXchar *value,*ptr; while(*line && *line!='"') line++; if(*line=='"'){ line++; value=ptr=line; while(*line && *line!='\n' && *line!='\r' && *line!='"'){ if(*line=='\\' && *(line+1)=='"') line++; *ptr++=*line++; } *ptr='\0'; return value; } return ""; } // Parse rules and sub rules FXbool Parser::parserules(FXSyntax *syntax,FXint parent){ FXString name,brex,erex,srex; FXRex expression; FXRexError error; FXint index; FXTRACE((1,"parserules begin parent = %d\n",parent)); // Parse the rules while(strcmp(tok,"rule")==0){ // Parse name name=string(); // Clear to empty brex=FXString::null; erex=FXString::null; srex=FXString::null; // Parse rule info while(token()){ if(strcmp(tok,"pattern")==0){ // Simple pattern brex=string(); if((error=expression.parse(brex,REX_SYNTAX))!=REGERR_OK){ fxwarning("%s:%d: error: %s.\n",file.text(),number,FXRex::getError(error)); return FALSE; } continue; } if(strcmp(tok,"openpattern")==0){ // Open pattern brex=string(); if((error=expression.parse(brex,REX_SYNTAX))!=REGERR_OK){ fxwarning("%s:%d: error: %s.\n",file.text(),number,FXRex::getError(error)); return FALSE; } continue; } if(strcmp(tok,"closepattern")==0){ // Close pattern erex=string(); if((error=expression.parse(erex,REX_SYNTAX))!=REGERR_OK){ fxwarning("%s:%d: error: %s.\n",file.text(),number,FXRex::getError(error)); return FALSE; } continue; } if(strcmp(tok,"stoppattern")==0){ // Stop pattern srex=string(); if((error=expression.parse(srex,REX_SYNTAX))!=REGERR_OK){ fxwarning("%s:%d: error: %s.\n",file.text(),number,FXRex::getError(error)); return FALSE; } continue; } break; } // Premature end if(!tok){ fxwarning("%s:%d: error: unexpected end of file.\n",file.text(),number); return FALSE; } FXTRACE((1,"brex = %s\n",brex.text())); FXTRACE((1,"erex = %s\n",erex.text())); FXTRACE((1,"srex = %s\n",srex.text())); // Validation if(brex.empty()) return FALSE; // Create rule if(erex.empty() && srex.empty()){ index=syntax->append(name,brex,parent); } else if(srex.empty()){ index=syntax->append(name,brex,erex,parent); } else{ index=syntax->append(name,brex,erex,srex,parent); } // Parse subrules, if any if(!parserules(syntax,index)) return FALSE; // Check end if(strcmp(tok,"end")!=0){ fxwarning("%s:%d: error: expected 'end'.\n",file.text(),number); return FALSE; } // Next token token(); if(!tok) return FALSE; } FXTRACE((1,"parserules end parent = %d\n",parent)); return TRUE; } // Parse file FXbool Parser::parse(FXSyntaxList& syntaxes){ FXSyntax *syntax; FXString name; FXTRACE((1,"Parser::parse: file = %s\n",file.text())); // Open file fp=fopen(file.text(),"r"); if(!fp){ fxwarning("error: unable to open file: %s.\n",file.text()); return FALSE; } // Parse the languages while(token()){ // Parse next language if(strcmp(tok,"language")!=0){ fxwarning("%s:%d: error: expected 'language'.\n",file.text(),number); return FALSE; } // Parse language name name=string(); // Make new language node syntax=new FXSyntax(name); // Add to list syntaxes.append(syntax); // Parse language info while(token()){ if(strcmp(tok,"filesmatch")==0){ // File extensions syntax->setExtensions(string()); continue; } if(strcmp(tok,"contentsmatch")==0){ // File contents syntax->setContents(string()); continue; } if(strcmp(tok,"delimiters")==0){ // Word delimiters syntax->setDelimiters(string()); continue; } if(strcmp(tok,"contextlines")==0){ // Context lines syntax->setContextLines(FXIntVal(word())); continue; } if(strcmp(tok,"contextchars")==0){ // Context chars syntax->setContextChars(FXIntVal(word())); continue; } break; } // Premature end if(!tok){ fxwarning("%s:%d: error: unexpected end of file.\n",file.text(),number); return FALSE; } // Parse rules if(!parserules(syntax,0)) return FALSE; // Check end if(strcmp(tok,"end")!=0){ fxwarning("%s:%d: error: expected 'end'.\n",file.text(),number); return FALSE; } } FXTRACE((1,"Parser::parse: OK\n")); return TRUE; } // Parse syntax file FXbool Adie::loadSyntaxFile(const FXString& file){ Parser parser(file); return parser.parse(syntaxes); } fox1.6-1.6.57/adie/paste_gif.gif000066400000000000000000000002061326741342000161650ustar00rootroot00000000000000GIF89aň˛ŔÜ˙˙żżż˙˙˙!ů,KşÜ08ˇUŇAFŔ_ĐšHh*z™AIŤ\M—ö`ěĽQŇĂa8ܵjBâAh¬FÂČ’Č%•Ĺ''šY:+WlłŃ+Ź'“;fox1.6-1.6.57/adie/pattern_gif.gif000066400000000000000000000003371326741342000165330ustar00rootroot00000000000000GIF87aă˛ŔÜŞ¨ŔŁĄ§ś˛•`nx†07®´ÎŤHRśx‰l{{ ‘T`‚$)¦ś˛,”ČI«˝8ë­Ú QšQĺ™®Ô!€‰ŁäI*+"aŘž —"…‚!Ą Ŕ(cQŘF’Ftě°8ĆŃF]X슸-”+gzZ’]$T$g  \I n8”–Š $; j  &0“•ޤ®±˛ł´µ¶·®;fox1.6-1.6.57/adie/print_gif.gif000066400000000000000000000002041326741342000162030ustar00rootroot00000000000000GIF89aň˛ŔÜ˙˙˙ŔŔŔ€€€€€!ů,I Ń˝A_”bę»fu“ C„U]Ž@of)A‘ŞőI;|%’p0$5 ȤRy´9™5[tI•ú®Źˇ°írąşÖA$;fox1.6-1.6.57/adie/quit_gif.gif000066400000000000000000000001541326741342000160350ustar00rootroot00000000000000GIF87a²ŔÜ,.,trttvt,9şÜ®!Ľç’ ć'ŞB3hd00Ý™acxaëËh1©­´ Aż„FÇ´‹¸„‘$ČB T–¨´‘;fox1.6-1.6.57/adie/redo_gif.gif000066400000000000000000000001421326741342000160010ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙˙]`i,;„Ź©ÁlŽS†qÝôćÚl  ×0”F®­Č–^CÇ.€¦ůsóA"Łő^ ¨Z±µĄ—s>§†;fox1.6-1.6.57/adie/reload_gif.gif000066400000000000000000000001751326741342000163240ustar00rootroot00000000000000GIF87a²ŔÜ˙ű˙˙˙˙1šecšc,JÜ­PA«`QÖÁďŮ$pŃÔĄJ$Ër(\Â<ÖËP4Ú«÷ëř„­tä)3Cń“ŚÉ‚Ăç,H…-i»¬k<Ě! ;fox1.6-1.6.57/adie/save_gif.gif000066400000000000000000000001651326741342000160130ustar00rootroot00000000000000GIF87a²ŔÜw€×”–”çëçÎĎÎ,BşÜ0JůÄ 8ăQB˝Z6 Xˇ(”'ë—n±‰Î0+Xc?îşťp¬¬&‘Úiĺ `NÁ@ó©N Đrëč2;fox1.6-1.6.57/adie/saveall_gif.gif000066400000000000000000000001661326741342000165050ustar00rootroot00000000000000GIF87a²ŔÜw€×”–”çëçÎĎÎ,CşÜ0Ę'ąd”Ŕ¤Ź]…eD pŔ÷ťŠia–)·"<ČlZ_Ă飦Ę`(řĺ‚ĹäB;I~ˇÓKĆ\Ó\CUux ;fox1.6-1.6.57/adie/saveas_gif.gif000066400000000000000000000002001326741342000163250ustar00rootroot00000000000000GIF87a²ŔÜw€×”–”çëçÎĎÎ˙,MşÜ0JůÄ 8ăQB˝„!Űŕ’+1gz‰ýĆjF»đ§ł<śe0_=”`Él.…‘$™‚ĄôhĘRźÜ€÷„šÉŽ4 ;fox1.6-1.6.57/adie/search_gif.gif000066400000000000000000000001311326741342000163130ustar00rootroot00000000000000GIF87aˇ˛ŔÜęćÝŐĚ»,2„Ź©Ë­ +j,NSF>Qá–]‘öeăŠAf0¸# C1ÚŐá{®´ŹăĽhCDpf  ;fox1.6-1.6.57/adie/searchnext_gif.gif000066400000000000000000000001561326741342000172210ustar00rootroot00000000000000GIF87a²ŔܢŤh€ęćÝ,;şÜ" Çŕ˛`6ͤă‹×`Š^'5 ËJ).ĚŞkëĚ Dľö±p€6|Č (TxA¨NÍ1;fox1.6-1.6.57/adie/searchprev_gif.gif000066400000000000000000000001531326741342000172140ustar00rootroot00000000000000GIF87a²ŔÜ€˘ŤhęćÝ,8şÜ0‚’ ·řě—MÔF–Ŕ0,*Ú*ŻŁ“0ËĬć1ĚÓ_CGěĄx,$#c®–7X4;fox1.6-1.6.57/adie/shiftleft_gif.gif000066400000000000000000000001121326741342000170350ustar00rootroot00000000000000GIF87aˇ˛ŔÜ„,#„oËŤUśĘY±hŰÓ…žzQç7´6-׉í;fox1.6-1.6.57/adie/shiftright_gif.gif000066400000000000000000000001131326741342000172210ustar00rootroot00000000000000GIF87aˇ˛ŔÜ„,$„oËŤUśĘY …Gäë…ß¶xň%ÔyMŔƱŚËö{;;fox1.6-1.6.57/adie/small_gif.gif000066400000000000000000000021001326741342000161540ustar00rootroot00000000000000GIF89a÷-ŘÄ›ÝĚĄßÎŞŮƝζŔ˘u¸™p±’k±“kµ‘eŽa? tMqF-b9$”hDd>'ÝËĄÝ̦y`b@,g@)f?(a;&6B%˘X±Š_…W8^5"N+C%ĺÖ·çÚ˝“…z T1 Q.mD,lD,E$[9&lJ3ĵ¤ŻŠfcAa:%B$ęÝÄńęŮ=*% B#N-G&g?)_:&e>( xQF+"ÄŻ“Í´’„Y;^6"éÝĂíĺŇC.'( I'6.E%oH0ťtNpI07_C¶‘eŚ_>e<%ćÚ˝”€p;W4"d@*ŚmO›zXnNś{X˝źvĹ©jI2; »kŹcBT0ŮĆžO2$,‰gHµ—qâÓłéÜÂäŐ·ćŮľŕĎ­Ň»‘´št' ~[@e='A$æx( ł™uŰÉŁăÓµçÚżđćÓęŢĆηŹÎş™Ţͬ,1J)@#¸—j' Ď˝ˇęŢĹÝζ·ŁŚďĺŃîäϢŤuż®—ňëÚ:!% O,ŽcB]>,0¬”|öđăěâŃÁ˛ˇöńĺôěŢřóéôíŢ=## P,X1oD+S3$ś€`‘oPńé×ůöěřôęňęŮčÜĆăÔ¸çŮ˝7<G'=!ĺŰÍßÖÇ]F7aD0Ľ«•ôěÝěáĚÝĎ»ŕŃąş¤‡ĺ׾ĺÖ¸ăÖÁ¦“…@%/÷ňćúůň×ȰaC1şĄŤîăĎęŢÇĺŮÄäÖ˝čÚŔŘʱ×ĆŞúúôĺâÜÄşŻńéŘÔŔˇáÓş÷óčŕѸâÔąťpßΫ÷óéűüřúű÷úúőßήőďâăŐşéÜÄűúóňîĺßѸҽ™ÁŻńěá÷őëřöîůřńěáĘâҸâҶöňćńëŰöňčűű÷ëáÎőńĺďçÖ˙żĚÜňań˙˙żż“čÜ’Ů %@,ňa˙żM€,˙0€@$P°€A D a… .`Č a‡>€!b‰&N Hˇb‹.^Ŕ!cŤ6nŕȡcŹ>~ "d‘"FŽ I˘d “&Nž@‰"e •*V®`ɢe —.^ľ€ #f ™2fΠIŁf ›6nŢŔ‰#gť:vîŕÉŁgź>~ţ $hˇB†!J¤hŁŤ=‚IŇ$J•,ş„)“¦Mś:yú*”¨Q¤J™"u U*U«Xµrő V,YłhŐ˛u W.]»xőňő X0aĂ3vě˛dĘ*-ăŬ™łg†BA‹&mµjÖD]%Ă–MŰ6nÝĽ}WÉZ8qăČ…"UÎÜą^ČĐĄS§nť0€ěÚ;fox1.6-1.6.57/adie/styles_gif.gif000066400000000000000000000003011326741342000163700ustar00rootroot00000000000000GIF87aă˛ŔÜ˙˙·Â˙´ Y`ni™y˙˙˙˙,vČI«­!Áů!ß7eÁÖ &0’ĺ%Ď' xaGßďŚ-Wřřz1šň‚Ň4SÇ#ĺ  F}ËěÁí–‰°8ąírżâqK›˝öŞĎÔĹ}€SŮřxfÜ%z|G~MxKMf^c†€(Š‹`a…‡™;fox1.6-1.6.57/adie/syntax_gif.gif000066400000000000000000000001651326741342000164030ustar00rootroot00000000000000GIF87aˇ˛ŔÜ™ ˙®,N„Ź©Ëí˙ĐHE+¸)Çp†ç„›5B¦ xĂ`Ľrm ˛Ć÷ţCJŘPĆđT\Ř$LJ):ÔćiuĄĄP,«•:CbkÍźůŚ~;fox1.6-1.6.57/adie/undo_gif.gif000066400000000000000000000001421326741342000160150ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙˙]`i,;„Źiˬ@LX ŃĽkţlÁplŘ€Še×H§Ž.E⳼P‰XŰ…NÁY‡¦0ap‘X.bˡÔ;fox1.6-1.6.57/calculator/000077500000000000000000000000001326741342000147665ustar00rootroot00000000000000fox1.6-1.6.57/calculator/Calculator.cpp000066400000000000000000001670211326741342000175720ustar00rootroot00000000000000/******************************************************************************** * * * F O X D e s k t o p C a l c u l a t o r * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Calculator.cpp,v 1.58 2006/01/22 18:01:12 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "fxkeys.h" #include #include #include #include #ifndef WIN32 #include #endif #include #include "icons.h" #include "Calculator.h" #include "Preferences.h" #include "HelpWindow.h" #define BINARY_LIMIT 32 // 32 bits #define OCTAL_LIMIT 11 // 11 digits #define DECIMAL_LIMIT 16 // +1.234567890123456E-308 #define HEXADECIMAL_LIMIT 8 // 8 hexadecimal digits #define GOLDEN 1.6180339887498948482045868343 // Golden ratio #define INVGOLDEN (1.0/GOLDEN) // Inverse golden ratio #define DEG2RAD(x) (((2.0*PI)/360.0)*(x)) // Degrees to radians #define GRA2RAD(x) ((PI/200.0)*(x)) // Grad to radians #define RAD2DEG(x) ((360.0/(2.0*PI))*(x)) // Radians to degrees #define RAD2GRA(x) ((200.0/PI)*(x)) // Radians to grad /* Notes: - On window enter, direct keyboard focus to numeric input buttons - When clicking on the display focus should stay on buttons - On resize I'd like x-y aspect to remain the same - Would be nice if font size more or less follows window size - History option in display to retrieve back earlier results (stored when pressing '=') - Add button to return largest prime smaller than x. - Add buttons for lcm/gcd. */ /*******************************************************************************/ // Map FXDEFMAP(Calculator) CalculatorMap[]={ FXMAPFUNCS(SEL_COMMAND,Calculator::ID_MODE,Calculator::ID_GRA,Calculator::onCmdAngle), FXMAPFUNCS(SEL_UPDATE,Calculator::ID_MODE,Calculator::ID_GRA,Calculator::onUpdAngle), FXMAPFUNCS(SEL_COMMAND,Calculator::ID_BASE,Calculator::ID_HEX,Calculator::onCmdBase), FXMAPFUNCS(SEL_UPDATE,Calculator::ID_BASE,Calculator::ID_HEX,Calculator::onUpdBase), FXMAPFUNCS(SEL_UPDATE,Calculator::ID_0,Calculator::ID_F,Calculator::onUpdDigit), FXMAPFUNCS(SEL_COMMAND,Calculator::ID_0,Calculator::ID_F,Calculator::onCmdDigit), FXMAPFUNCS(SEL_COMMAND,Calculator::ID_COLOR_DISPLAY,Calculator::ID_COLOR_CLEAR,Calculator::onCmdColor), FXMAPFUNCS(SEL_CHANGED,Calculator::ID_COLOR_DISPLAY,Calculator::ID_COLOR_CLEAR,Calculator::onCmdColor), FXMAPFUNCS(SEL_UPDATE,Calculator::ID_COLOR_DISPLAY,Calculator::ID_COLOR_CLEAR,Calculator::onUpdColor), FXMAPFUNC(SEL_COMMAND,Calculator::ID_EXPONENT_ALWAYS,Calculator::onCmdExponent), FXMAPFUNC(SEL_COMMAND,Calculator::ID_EXPONENT_NEVER,Calculator::onCmdExponent), FXMAPFUNC(SEL_UPDATE,Calculator::ID_EXPONENT_ALWAYS,Calculator::onUpdExponent), FXMAPFUNC(SEL_UPDATE,Calculator::ID_EXPONENT_NEVER,Calculator::onUpdExponent), FXMAPFUNC(SEL_COMMAND,Calculator::ID_PRECISION,Calculator::onCmdPrecision), FXMAPFUNC(SEL_UPDATE,Calculator::ID_PRECISION,Calculator::onUpdPrecision), FXMAPFUNC(SEL_COMMAND,Calculator::ID_QUESTION,Calculator::onCmdQuestion), FXMAPFUNC(SEL_COMMAND,Calculator::ID_BEEP,Calculator::onCmdBeep), FXMAPFUNC(SEL_UPDATE,Calculator::ID_BEEP,Calculator::onUpdBeep), FXMAPFUNC(SEL_COMMAND,Calculator::ID_FONT,Calculator::onCmdFont), FXMAPFUNC(SEL_COMMAND,Calculator::ID_PREFERENCES,Calculator::onCmdPreferences), FXMAPFUNC(SEL_COMMAND,Calculator::ID_CLEAR,Calculator::onCmdClear), FXMAPFUNC(SEL_COMMAND,Calculator::ID_CLEARALL,Calculator::onCmdClearAll), FXMAPFUNC(SEL_COMMAND,Calculator::ID_INV,Calculator::onCmdInverse), FXMAPFUNC(SEL_COMMAND,Calculator::ID_HYP,Calculator::onCmdHyper), FXMAPFUNC(SEL_COMMAND,Calculator::ID_MEM_REC,Calculator::onCmdMemRec), FXMAPFUNC(SEL_COMMAND,Calculator::ID_MEM_ADD,Calculator::onCmdMemAdd), FXMAPFUNC(SEL_COMMAND,Calculator::ID_MEM_SUB,Calculator::onCmdMemSub), FXMAPFUNC(SEL_COMMAND,Calculator::ID_MEM_CLR,Calculator::onCmdMemClr), FXMAPFUNC(SEL_COMMAND,Calculator::ID_PNT,Calculator::onCmdPoint), FXMAPFUNC(SEL_UPDATE,Calculator::ID_PNT,Calculator::onUpdPoint), FXMAPFUNC(SEL_COMMAND,Calculator::ID_EXP,Calculator::onCmdExp), FXMAPFUNC(SEL_UPDATE,Calculator::ID_EXP,Calculator::onUpdExp), FXMAPFUNC(SEL_COMMAND,Calculator::ID_DELETE,Calculator::onCmdDelete), FXMAPFUNC(SEL_COMMAND,Calculator::ID_SIN,Calculator::onCmdSin), FXMAPFUNC(SEL_UPDATE,Calculator::ID_SIN,Calculator::onUpdSin), FXMAPFUNC(SEL_COMMAND,Calculator::ID_COS,Calculator::onCmdCos), FXMAPFUNC(SEL_UPDATE,Calculator::ID_COS,Calculator::onUpdCos), FXMAPFUNC(SEL_COMMAND,Calculator::ID_TAN,Calculator::onCmdTan), FXMAPFUNC(SEL_UPDATE,Calculator::ID_TAN,Calculator::onUpdTan), FXMAPFUNC(SEL_COMMAND,Calculator::ID_LOG,Calculator::onCmdLog), FXMAPFUNC(SEL_UPDATE,Calculator::ID_LOG,Calculator::onUpdLog), FXMAPFUNC(SEL_COMMAND,Calculator::ID_LN,Calculator::onCmdLn), FXMAPFUNC(SEL_UPDATE,Calculator::ID_LN,Calculator::onUpdLn), FXMAPFUNC(SEL_COMMAND,Calculator::ID_PI,Calculator::onCmdPi), FXMAPFUNC(SEL_UPDATE,Calculator::ID_PI,Calculator::onUpdPi), FXMAPFUNC(SEL_COMMAND,Calculator::ID_FAC,Calculator::onCmdFac), FXMAPFUNC(SEL_UPDATE,Calculator::ID_FAC,Calculator::onUpdFac), FXMAPFUNC(SEL_COMMAND,Calculator::ID_PER,Calculator::onCmdPer), FXMAPFUNC(SEL_UPDATE,Calculator::ID_PER,Calculator::onUpdPer), FXMAPFUNC(SEL_COMMAND,Calculator::ID_COM,Calculator::onCmdCom), FXMAPFUNC(SEL_UPDATE,Calculator::ID_COM,Calculator::onUpdCom), FXMAPFUNC(SEL_COMMAND,Calculator::ID_RECIP,Calculator::onCmdRecip), FXMAPFUNC(SEL_UPDATE,Calculator::ID_RECIP,Calculator::onUpdRecip), FXMAPFUNC(SEL_COMMAND,Calculator::ID_PLUSMIN,Calculator::onCmdPlusMin), FXMAPFUNC(SEL_COMMAND,Calculator::ID_XTOY,Calculator::onCmdXToY), FXMAPFUNC(SEL_UPDATE,Calculator::ID_XTOY,Calculator::onUpdXToY), FXMAPFUNC(SEL_COMMAND,Calculator::ID_SQRT,Calculator::onCmdSqrt), FXMAPFUNC(SEL_UPDATE,Calculator::ID_SQRT,Calculator::onUpdSqrt), FXMAPFUNC(SEL_COMMAND,Calculator::ID_SHL,Calculator::onCmdShl), FXMAPFUNC(SEL_UPDATE,Calculator::ID_SHL,Calculator::onUpdShl), FXMAPFUNC(SEL_COMMAND,Calculator::ID_SHR,Calculator::onCmdShr), FXMAPFUNC(SEL_UPDATE,Calculator::ID_SHR,Calculator::onUpdShr), FXMAPFUNC(SEL_COMMAND,Calculator::ID_2LOG,Calculator::onCmd2Log), FXMAPFUNC(SEL_UPDATE,Calculator::ID_2LOG,Calculator::onUpd2Log), FXMAPFUNC(SEL_COMMAND,Calculator::ID_LPAR,Calculator::onCmdLPar), FXMAPFUNC(SEL_COMMAND,Calculator::ID_RPAR,Calculator::onCmdRPar), FXMAPFUNC(SEL_COMMAND,Calculator::ID_AND,Calculator::onCmdAnd), FXMAPFUNC(SEL_COMMAND,Calculator::ID_OR,Calculator::onCmdOr), FXMAPFUNC(SEL_COMMAND,Calculator::ID_XOR,Calculator::onCmdXor), FXMAPFUNC(SEL_COMMAND,Calculator::ID_NOT,Calculator::onCmdNot), FXMAPFUNC(SEL_COMMAND,Calculator::ID_MUL,Calculator::onCmdMul), FXMAPFUNC(SEL_COMMAND,Calculator::ID_DIV,Calculator::onCmdDiv), FXMAPFUNC(SEL_COMMAND,Calculator::ID_MOD,Calculator::onCmdMod), FXMAPFUNC(SEL_UPDATE,Calculator::ID_MOD,Calculator::onUpdMod), FXMAPFUNC(SEL_COMMAND,Calculator::ID_ADD,Calculator::onCmdAdd), FXMAPFUNC(SEL_COMMAND,Calculator::ID_SUB,Calculator::onCmdSub), FXMAPFUNC(SEL_COMMAND,Calculator::ID_ENTER,Calculator::onCmdEnter), }; // Implementation FXIMPLEMENT(Calculator,FXMainWindow,CalculatorMap,ARRAYNUMBER(CalculatorMap)) // Use a trick to get a nan #if FOX_BIGENDIAN static const FXuint nanny[2]={0x7fffffff,0xffffffff}; #else static const FXuint nanny[2]={0xffffffff,0x7fffffff}; #endif // Double precision nan static const FXdouble& dblnan=*((FXdouble*)nanny); // Operator priorities static const FXuchar priority[]={ 1, // DY_OR 1, // DY_XOR 1, // DY_AND 2, // DY_SUB 2, // DY_ADD 3, // DY_MOD 3, // DY_IDIV 3, // DY_DIV 3, // DY_MUL 4, // DY_XTOY 4, // DY_XTOINVY 5, // DY_PER 5, // DY_COM 8, // DY_LPAR 8, // DY_RPAR }; /*******************************************************************************/ // Construct calculator dialog Calculator::Calculator(FXApp* a):FXMainWindow(a,"FOX Calculator",NULL,NULL,DECOR_ALL, 0,0,0,0, 0,0){ // Default font used by default, duh! font=NULL; // Make some icons bigicon=new FXGIFIcon(getApp(),bigcalc); smallicon=new FXGIFIcon(getApp(),tinycalc); cmem=new FXBMPIcon(getApp(),constmem); quest=new FXGIFIcon(getApp(),question); // Application icons setIcon(bigicon); setMiniIcon(smallicon); // Interior FXVerticalFrame *vert=new FXVerticalFrame(this,LAYOUT_FILL_X,0,0,0,0, 8,8,8,4, 1,1); FXHorizontalFrame *displayframe=new FXHorizontalFrame(vert,LAYOUT_FILL_X,0,0,0,0, 0,0,0,0); new FXButton(displayframe,"FOX Calculator",bigicon,this,ID_PREFERENCES,ICON_BEFORE_TEXT|JUSTIFY_LEFT|LAYOUT_FILL_Y,0,0,0,0, 4,4,2,2); new FXButton(displayframe,FXString::null,quest,this,ID_QUESTION,ICON_BEFORE_TEXT|JUSTIFY_LEFT|LAYOUT_FILL_Y,0,0,0,0, 4,4,2,2); display=new FXTextField(displayframe,16,this,ID_TEXT,TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK|JUSTIFY_RIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 4,4,1,1); new FXLabel(vert,FXString::null,cmem,LAYOUT_RIGHT,0,0,0,0, 0,0,0,0); FXHorizontalFrame *modeframe=new FXHorizontalFrame(this,LAYOUT_FILL_X,0,0,0,0, 8,8,0,4, 8,8); FXHorizontalFrame *baseframe=new FXHorizontalFrame(modeframe,FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH, 0,0,0,0, 0,0,0,0 ,0,0); numbase[0]=new FXButton(baseframe,"&Hex",NULL,this,ID_HEX,FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y); numbase[1]=new FXButton(baseframe,"D&ec",NULL,this,ID_DEC,FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y); numbase[2]=new FXButton(baseframe,"&Oct",NULL,this,ID_OCT,FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y); numbase[3]=new FXButton(baseframe,"&Bin",NULL,this,ID_BIN,FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y); FXHorizontalFrame *degframe=new FXHorizontalFrame(modeframe,FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH, 0,0,0,0, 0,0,0,0 ,0,0); angmode[0]=new FXButton(degframe,"&Deg",NULL,this,ID_DEG,FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 2,2,2,2); angmode[1]=new FXButton(degframe,"&Rad",NULL,this,ID_RAD,FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 2,2,2,2); angmode[2]=new FXButton(degframe,"&Gra",NULL,this,ID_GRA,FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 2,2,2,2); // Frame for button blocks FXHorizontalFrame *buttonframe=new FXHorizontalFrame(this,LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH, 0,0,0,0, 4,4,4,4, 0,0); // Functions block FXMatrix *funcblock=new FXMatrix(buttonframe,6,MATRIX_BY_ROWS|LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT); inverse=new FXButton(funcblock,"inv",NULL,this,ID_INV,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[0]=new FXButton(funcblock,"+/-",NULL,this,ID_PLUSMIN,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[1]=new FXButton(funcblock,"1/x",NULL,this,ID_RECIP,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[2]=new FXButton(funcblock,"x^y",NULL,this,ID_XTOY,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[3]=new FXButton(funcblock,"sqrt",NULL,this,ID_SQRT,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[4]=new FXButton(funcblock,"2log",NULL,this,ID_2LOG,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[5]=new FXButton(funcblock,"pi",NULL,this,ID_PI,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[6]=new FXButton(funcblock,"SHL",NULL,this,ID_SHL,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[7]=new FXButton(funcblock,"SHR",NULL,this,ID_SHR,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[8]=new FXButton(funcblock,"x!",NULL,this,ID_FAC,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[9]=new FXButton(funcblock,"nPr",NULL,this,ID_PER,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[10]=new FXButton(funcblock,"nCr",NULL,this,ID_COM,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); hyper2=new FXButton(funcblock,"hyp",NULL,this,ID_HYP,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[11]=new FXButton(funcblock,"sin",NULL,this,ID_SIN,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[12]=new FXButton(funcblock,"cos",NULL,this,ID_COS,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[13]=new FXButton(funcblock,"tan",NULL,this,ID_TAN,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[14]=new FXButton(funcblock,"log",NULL,this,ID_LOG,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); functions[15]=new FXButton(funcblock,"ln",NULL,this,ID_LN,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); digit[10]=new FXButton(funcblock,"A",NULL,this,ID_A,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); digit[11]=new FXButton(funcblock,"B",NULL,this,ID_B,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); digit[12]=new FXButton(funcblock,"C",NULL,this,ID_C,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); digit[13]=new FXButton(funcblock,"D",NULL,this,ID_D,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); digit[14]=new FXButton(funcblock,"E",NULL,this,ID_E,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); digit[15]=new FXButton(funcblock,"F",NULL,this,ID_F,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 8,8,1,1); // Main block FXMatrix *mainblock=new FXMatrix(buttonframe,5,MATRIX_BY_ROWS|LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT); memory[0]=new FXButton(mainblock,"MR",NULL,this,ID_MEM_REC,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); digit[7]=new FXButton(mainblock,"7",NULL,this,ID_7,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); digit[4]=new FXButton(mainblock,"4",NULL,this,ID_4,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); digit[1]=new FXButton(mainblock,"1",NULL,this,ID_1,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); digit[0]=new FXButton(mainblock,"0",NULL,this,ID_0,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); memory[1]=new FXButton(mainblock,"M+",NULL,this,ID_MEM_ADD,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); digit[8]=new FXButton(mainblock,"8",NULL,this,ID_8,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); digit[5]=new FXButton(mainblock,"5",NULL,this,ID_5,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); digit[2]=new FXButton(mainblock,"2",NULL,this,ID_2,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[0]=new FXButton(mainblock,".",NULL,this,ID_PNT,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); memory[2]=new FXButton(mainblock,"M-",NULL,this,ID_MEM_SUB,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); digit[9]=new FXButton(mainblock,"9",NULL,this,ID_9,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); digit[6]=new FXButton(mainblock,"6",NULL,this,ID_6,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); digit[3]=new FXButton(mainblock,"3",NULL,this,ID_3,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[1]=new FXButton(mainblock,"EXP",NULL,this,ID_EXP,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); memory[3]=new FXButton(mainblock,"MC",NULL,this,ID_MEM_CLR,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[2]=new FXButton(mainblock,"(",NULL,this,ID_LPAR,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[3]=new FXButton(mainblock,"*",NULL,this,ID_MUL,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[4]=new FXButton(mainblock,"+",NULL,this,ID_ADD,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[5]=new FXButton(mainblock,"=",NULL,this,ID_ENTER,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); clearbtn=new FXButton(mainblock,"C",NULL,this,ID_CLEAR,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[6]=new FXButton(mainblock,")",NULL,this,ID_RPAR,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[7]=new FXButton(mainblock,"/",NULL,this,ID_DIV,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[8]=new FXButton(mainblock,"-",NULL,this,ID_SUB,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[9]=new FXButton(mainblock,"mod",NULL,this,ID_MOD,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); clearallbtn=new FXButton(mainblock,"AC",NULL,this,ID_CLEARALL,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[10]=new FXButton(mainblock,"AND",NULL,this,ID_AND,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[11]=new FXButton(mainblock,"OR",NULL,this,ID_OR,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[12]=new FXButton(mainblock,"XOR",NULL,this,ID_XOR,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); operators[13]=new FXButton(mainblock,"NOT",NULL,this,ID_NOT,BUTTON_NORMAL|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 1,1,2,2); // Hot keys for digits digit[0]->addHotKey(MKUINT(KEY_0,0)); digit[0]->addHotKey(MKUINT(KEY_KP_0,0)); digit[1]->addHotKey(MKUINT(KEY_1,0)); digit[1]->addHotKey(MKUINT(KEY_KP_1,0)); digit[2]->addHotKey(MKUINT(KEY_2,0)); digit[2]->addHotKey(MKUINT(KEY_KP_2,0)); digit[3]->addHotKey(MKUINT(KEY_3,0)); digit[3]->addHotKey(MKUINT(KEY_KP_3,0)); digit[4]->addHotKey(MKUINT(KEY_4,0)); digit[4]->addHotKey(MKUINT(KEY_KP_4,0)); digit[5]->addHotKey(MKUINT(KEY_5,0)); digit[5]->addHotKey(MKUINT(KEY_KP_5,0)); digit[6]->addHotKey(MKUINT(KEY_6,0)); digit[6]->addHotKey(MKUINT(KEY_KP_6,0)); digit[7]->addHotKey(MKUINT(KEY_7,0)); digit[7]->addHotKey(MKUINT(KEY_KP_7,0)); digit[8]->addHotKey(MKUINT(KEY_8,0)); digit[8]->addHotKey(MKUINT(KEY_KP_8,0)); digit[9]->addHotKey(MKUINT(KEY_9,0)); digit[9]->addHotKey(MKUINT(KEY_KP_9,0)); // Hot keys for hex digit[10]->addHotKey(MKUINT(KEY_a,0)); digit[11]->addHotKey(MKUINT(KEY_b,0)); digit[12]->addHotKey(MKUINT(KEY_c,0)); digit[13]->addHotKey(MKUINT(KEY_d,0)); digit[14]->addHotKey(MKUINT(KEY_e,0)); digit[15]->addHotKey(MKUINT(KEY_f,0)); // Hot keys for operators operators[0]->addHotKey(MKUINT(KEY_period,0)); operators[0]->addHotKey(MKUINT(KEY_KP_Decimal,0)); operators[1]->addHotKey(MKUINT(KEY_E,SHIFTMASK)); operators[2]->addHotKey(MKUINT(KEY_parenleft,SHIFTMASK)); operators[3]->addHotKey(MKUINT(KEY_asterisk,SHIFTMASK)); operators[3]->addHotKey(MKUINT(KEY_KP_Multiply,0)); operators[4]->addHotKey(MKUINT(KEY_plus,SHIFTMASK)); operators[4]->addHotKey(MKUINT(KEY_KP_Add,0)); operators[5]->addHotKey(MKUINT(KEY_equal,0)); operators[6]->addHotKey(MKUINT(KEY_parenright,SHIFTMASK)); operators[7]->addHotKey(MKUINT(KEY_slash,0)); operators[7]->addHotKey(MKUINT(KEY_KP_Divide,0)); operators[8]->addHotKey(MKUINT(KEY_minus,0)); operators[8]->addHotKey(MKUINT(KEY_KP_Subtract,0)); operators[9]->addHotKey(MKUINT(KEY_percent,SHIFTMASK)); operators[10]->addHotKey(MKUINT(KEY_ampersand,SHIFTMASK)); operators[11]->addHotKey(MKUINT(KEY_bar,SHIFTMASK)); operators[12]->addHotKey(MKUINT(KEY_asciicircum,SHIFTMASK)); operators[13]->addHotKey(MKUINT(KEY_asciitilde,SHIFTMASK)); // Shifting functions[6]->addHotKey(MKUINT(KEY_less,SHIFTMASK)); functions[7]->addHotKey(MKUINT(KEY_greater,SHIFTMASK)); functions[8]->addHotKey(MKUINT(KEY_exclam,SHIFTMASK)); inverse->addHotKey(MKUINT(KEY_i,0)); hyper2->addHotKey(MKUINT(KEY_h,0)); // Add accelerators getAccelTable()->addAccel(MKUINT(KEY_Q,0),this,FXSEL(SEL_COMMAND,ID_CLOSE)); getAccelTable()->addAccel(MKUINT(KEY_q,0),this,FXSEL(SEL_COMMAND,ID_CLOSE)); getAccelTable()->addAccel(MKUINT(KEY_q,CONTROLMASK),this,FXSEL(SEL_COMMAND,ID_CLOSE)); getAccelTable()->addAccel(MKUINT(KEY_Escape,0),this,FXSEL(SEL_COMMAND,ID_CLEAR)); getAccelTable()->addAccel(MKUINT(KEY_BackSpace,0),this,FXSEL(SEL_COMMAND,ID_DELETE)); getAccelTable()->addAccel(MKUINT(KEY_Delete,0),this,FXSEL(SEL_COMMAND,ID_DELETE)); getAccelTable()->addAccel(MKUINT(KEY_KP_Delete,0),this,FXSEL(SEL_COMMAND,ID_DELETE)); getAccelTable()->addAccel(MKUINT(KEY_Return,0),this,FXSEL(SEL_COMMAND,ID_ENTER)); getAccelTable()->addAccel(MKUINT(KEY_KP_Enter,0),this,FXSEL(SEL_COMMAND,ID_ENTER)); // Initialize stuff display->setText("0"); recall=0.0; numstack[0]=0.0; numsp=0; opsp=-1; limit=DECIMAL_LIMIT; digits=1; base=NUM_DEC; angles=ANG_RAD; precision=16; exponent=MAYBE; beep=TRUE; parens=0; modifiers=0; } // Create and show window void Calculator::create(){ readRegistry(); FXMainWindow::create(); show(); } // Destroy calculator dialog Calculator::~Calculator(){ delete font; delete bigicon; delete smallicon; delete cmem; delete quest; } /*******************************************************************************/ // Set digit color void Calculator::setDigitColor(FXColor clr){ FXColor hilite=makeHiliteColor(clr); FXColor shadow=makeShadowColor(clr); for(FXuint i=0; i<10; i++){ digit[i]->setBackColor(clr); digit[i]->setHiliteColor(hilite); digit[i]->setShadowColor(shadow); } } // Get digit color FXColor Calculator::getDigitColor() const { return digit[0]->getBackColor(); } // Set digit color void Calculator::setHexDigitColor(FXColor clr){ FXColor hilite=makeHiliteColor(clr); FXColor shadow=makeShadowColor(clr); for(FXuint i=10; i<16; i++){ digit[i]->setBackColor(clr); digit[i]->setHiliteColor(hilite); digit[i]->setShadowColor(shadow); } } // Get digit color FXColor Calculator::getHexDigitColor() const { return digit[10]->getBackColor(); } // Set operator color void Calculator::setOperatorColor(FXColor clr){ FXColor hilite=makeHiliteColor(clr); FXColor shadow=makeShadowColor(clr); for(FXuint i=0; i<14; i++){ operators[i]->setBackColor(clr); operators[i]->setHiliteColor(hilite); operators[i]->setShadowColor(shadow); } } // Get operator color FXColor Calculator::getOperatorColor() const { return operators[0]->getBackColor(); } // Set function color void Calculator::setFunctionColor(FXColor clr){ FXColor hilite=makeHiliteColor(clr); FXColor shadow=makeShadowColor(clr); for(FXuint i=0; i<16; i++){ functions[i]->setBackColor(clr); functions[i]->setHiliteColor(hilite); functions[i]->setShadowColor(shadow); } } // Get function color FXColor Calculator::getFunctionColor() const { return functions[0]->getBackColor(); } // Set memory color void Calculator::setMemoryColor(FXColor clr){ FXColor hilite=makeHiliteColor(clr); FXColor shadow=makeShadowColor(clr); for(FXuint i=0; i<4; i++){ memory[i]->setBackColor(clr); memory[i]->setHiliteColor(hilite); memory[i]->setShadowColor(shadow); } } // Get memory color FXColor Calculator::getMemoryColor() const { return memory[0]->getBackColor(); } // Set inverse color void Calculator::setInverseColor(FXColor clr){ inverse->setBackColor(clr); inverse->setHiliteColor(makeHiliteColor(clr)); inverse->setShadowColor(makeShadowColor(clr)); } // Get inverse color FXColor Calculator::getInverseColor() const { return inverse->getBackColor(); } // Set hyp color void Calculator::setHyperColor(FXColor clr){ hyper2->setBackColor(clr); hyper2->setHiliteColor(makeHiliteColor(clr)); hyper2->setShadowColor(makeShadowColor(clr)); } // Get hyp color FXColor Calculator::getHyperColor() const { return hyper2->getBackColor(); } // Set clear color void Calculator::setClearColor(FXColor clr){ clearbtn->setBackColor(clr); clearbtn->setHiliteColor(makeHiliteColor(clr)); clearbtn->setShadowColor(makeShadowColor(clr)); } // Get clear color FXColor Calculator::getClearColor() const { return clearbtn->getBackColor(); } // Set clear all color void Calculator::setClearAllColor(FXColor clr){ clearallbtn->setBackColor(clr); clearallbtn->setHiliteColor(makeHiliteColor(clr)); clearallbtn->setShadowColor(makeShadowColor(clr)); } // Get clear all color FXColor Calculator::getClearAllColor() const { return clearallbtn->getBackColor(); } // Set display color void Calculator::setDisplayColor(FXColor clr){ display->setBackColor(clr); display->setSelTextColor(clr); display->setHiliteColor(makeHiliteColor(clr)); display->setShadowColor(makeShadowColor(clr)); } // Get display color FXColor Calculator::getDisplayColor() const { return display->getBackColor(); } // Set display color void Calculator::setDisplayNumberColor(FXColor clr){ display->setTextColor(clr); display->setSelBackColor(clr); } // Get display color FXColor Calculator::getDisplayNumberColor() const { return display->getTextColor(); } // Set numeric base color void Calculator::setBaseColor(FXColor clr){ FXColor hilite=FXRGB(FXREDVAL(clr)+((255-FXREDVAL(clr))*3)/8, FXGREENVAL(clr)+((255-FXGREENVAL(clr))*3)/8, FXBLUEVAL(clr)+((255-FXBLUEVAL(clr))*3)/8); FXColor shadow=makeShadowColor(clr); for(FXuint i=0; i<4; i++){ numbase[i]->setBackColor(clr); numbase[i]->setHiliteColor(hilite); numbase[i]->setShadowColor(shadow); } } // Get numeric base color FXColor Calculator::getBaseColor() const { return numbase[0]->getBackColor(); } // Set angle mode color void Calculator::setAngleColor(FXColor clr){ FXColor hilite=FXRGB(FXREDVAL(clr)+((255-FXREDVAL(clr))*3)/8, FXGREENVAL(clr)+((255-FXGREENVAL(clr))*3)/8, FXBLUEVAL(clr)+((255-FXBLUEVAL(clr))*3)/8); FXColor shadow=makeShadowColor(clr); for(FXuint i=0; i<3; i++){ angmode[i]->setBackColor(clr); angmode[i]->setHiliteColor(hilite); angmode[i]->setShadowColor(shadow); } } // Get angle mode color FXColor Calculator::getAngleColor() const { return angmode[0]->getBackColor(); } // Set display font void Calculator::setDisplayFont(FXFont* font){ display->setFont(font); } // Return display font FXFont* Calculator::getDisplayFont() const { return display->getFont(); } // Read registry void Calculator::readRegistry(){ FXString fontspec; // Position FXint xx=getApp()->reg().readIntEntry("SETTINGS","x",50); FXint yy=getApp()->reg().readIntEntry("SETTINGS","y",50); FXint ww=getApp()->reg().readIntEntry("SETTINGS","w",0); FXint hh=getApp()->reg().readIntEntry("SETTINGS","h",0); // Read colors FXColor digitclr=getApp()->reg().readColorEntry("SETTINGS","digitcolor",FXRGB(94,209,204)); FXColor hexdigitclr=getApp()->reg().readColorEntry("SETTINGS","hexdigitcolor",FXRGB(151,189,206)); FXColor operatorclr=getApp()->reg().readColorEntry("SETTINGS","operatorcolor",FXRGB(255,222,163)); FXColor functionclr=getApp()->reg().readColorEntry("SETTINGS","functioncolor",FXRGB(158,213,188)); FXColor memoryclr=getApp()->reg().readColorEntry("SETTINGS","memorycolor",FXRGB(181,207,227)); FXColor inverseclr=getApp()->reg().readColorEntry("SETTINGS","inversecolor",FXRGB(224,222,69)); FXColor hyperclr=getApp()->reg().readColorEntry("SETTINGS","hypercolor",FXRGB(224,222,69)); FXColor clearclr=getApp()->reg().readColorEntry("SETTINGS","clearcolor",FXRGB(238,148,0)); FXColor clearallclr=getApp()->reg().readColorEntry("SETTINGS","clearallcolor",FXRGB(238,118,0)); FXColor displayclr=getApp()->reg().readColorEntry("SETTINGS","displaycolor",FXRGB(255,255,255)); FXColor numberclr=getApp()->reg().readColorEntry("SETTINGS","displaynumbercolor",FXRGB(0,0,0)); FXColor numbaseclr=getApp()->reg().readColorEntry("SETTINGS","numbasecolor",FXRGB(203,203,203)); FXColor angmodeclr=getApp()->reg().readColorEntry("SETTINGS","anglemodecolor",FXRGB(203,203,203)); // Number base FXint numbase=getApp()->reg().readIntEntry("SETTINGS","base",NUM_DEC); // Angle type FXint angmode=getApp()->reg().readIntEntry("SETTINGS","angles",ANG_RAD); // Exponent mode FXbool expmode=(FXExponent)getApp()->reg().readIntEntry("SETTINGS","exponent",MAYBE); // Precision FXint prec=getApp()->reg().readIntEntry("SETTINGS","precision",10); // Beep FXbool noise=getApp()->reg().readIntEntry("SETTINGS","beep",TRUE); // Memory cell recall=getApp()->reg().readRealEntry("SETTINGS","memory",0.0); // Font fontspec=getApp()->reg().readStringEntry("SETTINGS","displayfont",""); if(!fontspec.empty()){ font=new FXFont(getApp(),fontspec); setDisplayFont(font); } setDigitColor(digitclr); setHexDigitColor(hexdigitclr); setOperatorColor(operatorclr); setFunctionColor(functionclr); setMemoryColor(memoryclr); setInverseColor(inverseclr); setHyperColor(hyperclr); setClearColor(clearclr); setClearAllColor(clearallclr); setDisplayColor(displayclr); setDisplayNumberColor(numberclr); setBaseColor(numbaseclr); setAngleColor(angmodeclr); // Number base setBase(numbase); setAngles(angmode); setPrecision(prec); setExponentMode(expmode); setBeep(noise); setX(xx); setY(yy); setWidth(ww); setHeight(hh); } // Write registry void Calculator::writeRegistry(){ FXString fontspec; // Position getApp()->reg().writeIntEntry("SETTINGS","x",getX()); getApp()->reg().writeIntEntry("SETTINGS","y",getY()); getApp()->reg().writeIntEntry("SETTINGS","w",getWidth()); getApp()->reg().writeIntEntry("SETTINGS","h",getHeight()); // Write colors getApp()->reg().writeColorEntry("SETTINGS","digitcolor",getDigitColor()); getApp()->reg().writeColorEntry("SETTINGS","hexdigitcolor",getHexDigitColor()); getApp()->reg().writeColorEntry("SETTINGS","operatorcolor",getOperatorColor()); getApp()->reg().writeColorEntry("SETTINGS","functioncolor",getFunctionColor()); getApp()->reg().writeColorEntry("SETTINGS","memorycolor",getMemoryColor()); getApp()->reg().writeColorEntry("SETTINGS","inversecolor",getInverseColor()); getApp()->reg().writeColorEntry("SETTINGS","hypercolor",getHyperColor()); getApp()->reg().writeColorEntry("SETTINGS","clearcolor",getClearColor()); getApp()->reg().writeColorEntry("SETTINGS","clearallcolor",getClearAllColor()); getApp()->reg().writeColorEntry("SETTINGS","displaycolor",getDisplayColor()); getApp()->reg().writeColorEntry("SETTINGS","displaynumbercolor",getDisplayNumberColor()); getApp()->reg().writeColorEntry("SETTINGS","numbasecolor",getBaseColor()); getApp()->reg().writeColorEntry("SETTINGS","anglemodecolor",getAngleColor()); // Number base getApp()->reg().writeIntEntry("SETTINGS","base",getBase()); // Angle type getApp()->reg().writeIntEntry("SETTINGS","angles",getAngles()); // Exponent mode getApp()->reg().writeIntEntry("SETTINGS","exponent",getExponentMode()); // Precision getApp()->reg().writeIntEntry("SETTINGS","precision",getPrecision()); // Beep getApp()->reg().writeIntEntry("SETTINGS","beep",getBeep()); // Memory contents getApp()->reg().writeRealEntry("SETTINGS","memory",recall); // Font fontspec=getDisplayFont()->getFont(); getApp()->reg().writeStringEntry("SETTINGS","displayfont",fontspec.text()); } /*******************************************************************************/ // Get display text FXString Calculator::getDisplayText() const { return display->getText(); } // Display text void Calculator::setDisplayText(const FXString& txt){ display->setText(txt); } // Get displayed value FXdouble Calculator::getDisplayValue() const { FXdouble val; if(base==10) val=FXDoubleVal(getDisplayText()); else val=(FXdouble)FXUIntVal(getDisplayText(),base); return val; } // Redisplay new value void Calculator::setDisplayValue(FXdouble val){ FXint fp=fxieeedoubleclass(val); if(fp==-2 || fp==+2){ setDisplayText("ERROR"); if(beep) getApp()->beep(); } else if(fp==-1){ setDisplayText("-INF"); if(beep) getApp()->beep(); } else if(fp==+1){ setDisplayText("+INF"); if(beep) getApp()->beep(); } else if(base==10){ if(val==0.0) val=0.0; // Don't ever print out -0 instead of 0 setDisplayText(FXStringVal(val,precision,exponent)); } else{ setDisplayText(FXStringVal((FXuint)floor(val),base)); } } /*******************************************************************************/ // Push to number stack FXdouble Calculator::pushnum(FXdouble num){ FXASSERT(numsp0.0){ if(fxieeedoubleclass(result)>0) break; result=result*num; num=num-1.0; } return result; } return dblnan; } // Permutations // // n! // result = ------ // (n-r)! // static FXdouble permutations(FXdouble n,FXdouble r){ FXdouble num=floor(n); FXdouble den=floor(r); FXdouble result=1.0; if(0.0<=num && 0.0<=den && den<=num && num==n && den==r){ while(den>0.0){ if(fxieeedoubleclass(result)>0) break; result=result*num; num=num-1.0; den=den-1.0; } return result; } return dblnan; } // Combinations // // n! // result = ---------- // r! (n-r)! // static FXdouble combinations(FXdouble n,FXdouble r){ FXdouble num=floor(n); FXdouble den=floor(r); FXdouble res1=1.0; FXdouble res2=1.0; if(0.0<=num && 0.0<=den && den<=num && num==n && den==r){ while(den>0.0){ if(fxieeedoubleclass(res1)>0) break; res1=res1*num; res2=res2*den; num=num-1.0; den=den-1.0; } return res1/res2; } return dblnan; } // Reset calculator void Calculator::clearAll(){ setDisplayValue(0.0); numstack[0]=0.0; numsp=0; opsp=-1; parens=0; modifiers=0; } // Clear calculator void Calculator::clear(){ setDisplayValue(0.0); setnum(0.0); modifiers=0; } // Perform unary operator void Calculator::unary(FXuchar op){ FXdouble acc,val; FXASSERT(0<=numsp); val=getnum(); acc=0.0; switch(op){ case UN_NOT: acc=(FXdouble) (~((FXuint)floor(val))); break; case UN_NEG: acc=-val; break; case UN_SHL: acc=(FXdouble) (((FXuint)floor(val))<<1); break; case UN_SHR: acc=(FXdouble) (((FXuint)floor(val))>>1); break; case UN_SAR: acc=(FXdouble) ((((FXuint)floor(val))>>1) | (((FXuint)floor(val))&0x80000000)); break; case UN_RECIP: acc=1.0/val; break; case UN_FAC: acc=factorial(val); break; case UN_SQRT: acc=sqrt(val); break; case UN_QUAD: acc=val*val; break; case UN_2LOG: acc=log(val)/log(2.0); break; case UN_2TOX: acc=pow(2.0,val); break; case UN_LOG: acc=log10(val); break; case UN_10TOX: acc=pow(10.0,val); break; case UN_LN: acc=log(val); break; case UN_EXP: acc=exp(val); break; case UN_SIN: acc=sin(trigarg(val)); break; case UN_COS: acc=cos(trigarg(val)); break; case UN_TAN: acc=tan(trigarg(val)); break; case UN_ASIN: acc=trigres(asin(val)); break; case UN_ACOS: acc=trigres(acos(val)); break; case UN_ATAN: acc=trigres(atan(val)); break; case UN_SINH: acc=sinh(val); break; case UN_COSH: acc=cosh(val); break; case UN_TANH: acc=tanh(val); break; case UN_ASINH: acc=log(val+sqrt(val*val+1.0)); // Tired of #ifdef's:- just expand definitions (Abramowitz & Stegun, pp. 87) break; case UN_ACOSH: acc=log(val+sqrt(val*val-1.0)); // Same here break; case UN_ATANH: acc=0.5*log((1.0+val)/(1.0-val)); // And here default: break; } setnum(acc); setDisplayValue(acc); modifiers=0; } // Perform operator void Calculator::dyop(FXuchar op){ FXdouble acc,val; FXASSERT(0<=numsp); val=popnum(); FXASSERT(0<=numsp); acc=getnum(); switch(op){ case DY_OR: acc=(FXdouble) (((FXuint)floor(acc)) | ((FXuint)floor(val))); break; case DY_XOR: acc=(FXdouble) (((FXuint)floor(acc)) ^ ((FXuint)floor(val))); break; case DY_AND: acc=(FXdouble) (((FXuint)floor(acc)) & ((FXuint)floor(val))); break; case DY_SUB: acc=acc-val; break; case DY_ADD: acc=acc+val; break; case DY_MOD: // Theo Veenker suggested this new definition of "mod": val=fabs(val); // x = a div |b| ; with a round toward 0 acc=fmod(acc,val); // y = a mod |b| break; // a = x * |b| + y case DY_IDIV: modf(acc/val,&acc); break; case DY_DIV: acc=acc/val; break; case DY_MUL: acc=acc*val; break; case DY_XTOY: acc=pow(acc,val); break; case DY_XTOINVY: acc=pow(acc,1.0/val); break; case DY_PER: acc=permutations(acc,val); break; case DY_COM: acc=combinations(acc,val); default: break; } setnum(acc); setDisplayValue(acc); modifiers=0; } // Enter operator void Calculator::dyadic(FXuchar op){ if(opsp<0 || opstack[opsp]==DY_LPAR || priority[op]>priority[opstack[opsp]]){ pushnum(getnum()); opstack[++opsp]=op; } else{ dyop(opstack[opsp]); pushnum(getnum()); opstack[opsp]=op; } modifiers=0; } // Enter evaluate void Calculator::evaluate(){ register FXuchar op; while(0<=opsp){ op=opstack[opsp--]; if(op!=DY_LPAR) dyop(op); else parens--; } setDisplayValue(getnum()); modifiers=0; } // Left parentheses void Calculator::lparen(){ opstack[++opsp]=DY_LPAR; setnum(0.0); setDisplayValue(0.0); parens++; modifiers=0; } // Right parentheses void Calculator::rparen(){ register FXuchar op; while(0<=opsp){ op=opstack[opsp--]; if(op==DY_LPAR){ parens--; break; } dyop(op); } setDisplayValue(getnum()); modifiers=0; } /*******************************************************************************/ // Close the window and save registry FXbool Calculator::close(FXbool notify){ writeRegistry(); return FXMainWindow::close(notify); } // Change preferences long Calculator::onCmdPreferences(FXObject*,FXSelector,void*){ Preferences preferences(this); preferences.setX(getX()+80); preferences.setY(getY()+80); preferences.execute(PLACEMENT_DEFAULT); return 1; } // Change colors long Calculator::onCmdColor(FXObject*,FXSelector sel,void* ptr){ FXColor clr=(FXColor)(FXuval)ptr; switch(FXSELID(sel)){ case ID_COLOR_DISPLAY: setDisplayColor(clr); break; case ID_COLOR_DISPLAYNUMBER: setDisplayNumberColor(clr); break; case ID_COLOR_DIGITS: setDigitColor(clr); break; case ID_COLOR_HEXDIGITS: setHexDigitColor(clr); break; case ID_COLOR_OPERATORS: setOperatorColor(clr); break; case ID_COLOR_FUNCTIONS: setFunctionColor(clr); break; case ID_COLOR_MEMORY: setMemoryColor(clr); break; case ID_COLOR_BASE: setBaseColor(clr); break; case ID_COLOR_ANGLES: setAngleColor(clr); break; case ID_COLOR_INVERT: setInverseColor(clr); break; case ID_COLOR_HYPER: setHyperColor(clr); break; case ID_COLOR_CLEARALL: setClearAllColor(clr); break; case ID_COLOR_CLEAR: setClearColor(clr); break; } return 1; } // Update colors long Calculator::onUpdColor(FXObject* sender,FXSelector sel,void*){ FXColor clr; switch(FXSELID(sel)){ case ID_COLOR_DISPLAY: clr=getDisplayColor(); break; case ID_COLOR_DISPLAYNUMBER: clr=getDisplayNumberColor(); break; case ID_COLOR_DIGITS: clr=getDigitColor(); break; case ID_COLOR_HEXDIGITS: clr=getHexDigitColor(); break; case ID_COLOR_OPERATORS: clr=getOperatorColor(); break; case ID_COLOR_FUNCTIONS: clr=getFunctionColor(); break; case ID_COLOR_MEMORY: clr=getMemoryColor(); break; case ID_COLOR_BASE: clr=getBaseColor(); break; case ID_COLOR_ANGLES: clr=getAngleColor(); break; case ID_COLOR_INVERT: clr=getInverseColor(); break; case ID_COLOR_HYPER: clr=getHyperColor(); break; case ID_COLOR_CLEARALL: clr=getClearAllColor(); break; case ID_COLOR_CLEAR: clr=getClearColor(); break; } sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&clr); return 1; } // Change font long Calculator::onCmdFont(FXObject*,FXSelector,void*){ FXFontDialog fontdlg(this,"Change Display Font",DECOR_BORDER|DECOR_TITLE); FXFontDesc fontdesc; getDisplayFont()->getFontDesc(fontdesc); fontdlg.setFontSelection(fontdesc); if(fontdlg.execute()){ FXFont *oldfont=font; fontdlg.getFontSelection(fontdesc); font=new FXFont(getApp(),fontdesc); font->create(); setDisplayFont(font); delete oldfont; } return 1; } // Change exponential notation long Calculator::onCmdExponent(FXObject*,FXSelector sel,void* ptr){ if(FXSELID(sel)==ID_EXPONENT_ALWAYS && ptr) setExponentMode(TRUE); else if(FXSELID(sel)==ID_EXPONENT_NEVER && ptr) setExponentMode(FALSE); else setExponentMode(MAYBE); return 1; } // Update exponential notation long Calculator::onUpdExponent(FXObject* sender,FXSelector sel,void*){ if(FXSELID(sel)==ID_EXPONENT_ALWAYS && exponent==TRUE) sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); else if(FXSELID(sel)==ID_EXPONENT_NEVER && exponent==FALSE) sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Change precision long Calculator::onCmdPrecision(FXObject* sender,FXSelector,void*){ FXint prec=16; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&prec); setPrecision(prec); return 1; } // Update precision long Calculator::onUpdPrecision(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&precision); return 1; } // Change beep mode long Calculator::onCmdBeep(FXObject*,FXSelector,void*){ beep=!beep; return 1; } // Update beep mode long Calculator::onUpdBeep(FXObject* sender,FXSelector,void*){ sender->handle(this,beep ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK), NULL); return 1; } // Popup help long Calculator::onCmdQuestion(FXObject*,FXSelector,void*){ HelpWindow helpwindow(this,"Calculator Help"); helpwindow.setHelp(help); helpwindow.setX(getX()+80); helpwindow.setY(getY()+80); helpwindow.execute(PLACEMENT_DEFAULT); return 1; } // Change angle mode long Calculator::onCmdAngle(FXObject*,FXSelector sel,void*){ angles=(FXSELID(sel)-ID_MODE); return 1; } // Update radio button for angle mode long Calculator::onUpdAngle(FXObject* sender,FXSelector sel,void*){ sender->handle(this,angles==(FXSELID(sel)-ID_MODE) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK), NULL); return 1; } // Change angle mode long Calculator::onCmdBase(FXObject*,FXSelector sel,void*){ setBase(FXSELID(sel)-ID_BASE); return 1; } // Update radio button for angle mode long Calculator::onUpdBase(FXObject* sender,FXSelector sel,void*){ sender->handle(this,base==(FXSELID(sel)-ID_BASE) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK), NULL); return 1; } // Update digits based on base long Calculator::onUpdDigit(FXObject* sender,FXSelector sel,void*){ sender->handle(this,(FXSELID(sel)-ID_0)=0){ pos++; // Skip 'E' if(text[pos]=='-' || text[pos]=='+') pos++; // Skip sign if(text[pos]=='0' || (text[pos] && text[pos+1] && text[pos+2])){ while(text[pos+1]){ text[pos]=text[pos+1]; pos++; } text[pos]=FXString::HEX[FXSELID(sel)-ID_0]; } else{ text.append(FXString::HEX[FXSELID(sel)-ID_0]); } } else if(digitshandle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Exponent long Calculator::onCmdExp(FXObject*,FXSelector,void*){ FXString text=getDisplayText(); if(!(modifiers&MOD_ENT)){ text="0"; digits=1; } if(base==10 && text.find('E')<0) text+="E+0"; setDisplayText(text); setnum(getDisplayValue()); modifiers|=MOD_ENT; return 1; } // Update exponent long Calculator::onUpdExp(FXObject* sender,FXSelector,void*){ sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Plus minus +/- long Calculator::onCmdPlusMin(FXObject*,FXSelector,void*){ FXString text=getDisplayText(); FXint pos; if(modifiers&MOD_ENT){ if((base==10) && (pos=text.find('E'))>=0){ if(text[pos+1]=='+') text[pos+1]='-'; else if(text[pos+1]=='-') text[pos+1]='+'; else text.insert(pos+1,'-'); } else{ if(text[0]=='-') text.erase(0); else if(text[0]=='+') text[0]='-'; else if(text!="0") text.prepend('-'); } setDisplayText(text); setnum(getDisplayValue()); } else{ unary(UN_NEG); } return 1; } // Delete last character long Calculator::onCmdDelete(FXObject*,FXSelector,void*){ FXString text=getDisplayText(); FXint len; if(modifiers&MOD_ENT){ len=text.length(); if(0=0){ len--; if(0handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Cosine button long Calculator::onCmdCos(FXObject*,FXSelector,void*){ unary(UN_COS+(modifiers&(MOD_INV|MOD_HYP))); return 1; } // Update cosine button long Calculator::onUpdCos(FXObject* sender,FXSelector,void*){ FXString label="cos"; if(modifiers&MOD_INV) label.prepend('a'); if(modifiers&MOD_HYP) label.append('h'); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Tangent button long Calculator::onCmdTan(FXObject*,FXSelector,void*){ unary(UN_TAN+(modifiers&(MOD_INV|MOD_HYP))); return 1; } // Update tangent button long Calculator::onUpdTan(FXObject* sender,FXSelector,void*){ FXString label="tan"; if(modifiers&MOD_INV) label.prepend('a'); if(modifiers&MOD_HYP) label.append('h'); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Log button long Calculator::onCmdLog(FXObject*,FXSelector,void*){ unary(UN_LOG+(modifiers&MOD_INV)); return 1; } // Update Log button long Calculator::onUpdLog(FXObject* sender,FXSelector,void*){ FXString label=(modifiers&MOD_INV)?"10^x":"log"; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Ln button long Calculator::onCmdLn(FXObject*,FXSelector,void*){ unary(UN_LN+(modifiers&MOD_INV)); return 1; } // Update Ln button long Calculator::onUpdLn(FXObject* sender,FXSelector,void*){ FXString label=(modifiers&MOD_INV)?"e^x":"ln"; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Update PI button long Calculator::onCmdPi(FXObject*,FXSelector,void*){ setnum((modifiers&MOD_HYP)?((modifiers&MOD_INV)?INVGOLDEN:GOLDEN):((modifiers&MOD_INV)?EULER:PI)); setDisplayValue(getnum()); modifiers=0; return 1; } // Update PI button long Calculator::onUpdPi(FXObject* sender,FXSelector,void*){ FXString label=(modifiers&MOD_HYP) ? (modifiers&MOD_INV) ? "1/phi" : "phi" : (modifiers&MOD_INV) ? "e" : "pi"; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Factorial long Calculator::onCmdFac(FXObject*,FXSelector,void*){ unary(UN_FAC); return 1; } // Update factorial long Calculator::onUpdFac(FXObject* sender,FXSelector,void*){ sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Permutations long Calculator::onCmdPer(FXObject*,FXSelector,void*){ dyadic(DY_PER); return 1; } // Update permutations long Calculator::onUpdPer(FXObject* sender,FXSelector,void*){ sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Combinations long Calculator::onCmdCom(FXObject*,FXSelector,void*){ dyadic(DY_COM); return 1; } // Update combinations long Calculator::onUpdCom(FXObject* sender,FXSelector,void*){ sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Reciprocal long Calculator::onCmdRecip(FXObject*,FXSelector,void*){ unary(UN_RECIP); return 1; } // Update reciprocal long Calculator::onUpdRecip(FXObject* sender,FXSelector,void*){ sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // X ^ Y long Calculator::onCmdXToY(FXObject*,FXSelector,void*){ dyadic(DY_XTOY+(modifiers&MOD_INV)); return 1; } // Update X ^ Y long Calculator::onUpdXToY(FXObject* sender,FXSelector,void*){ FXString label=(modifiers&MOD_INV)?"x^1/y":"x^y"; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Sqrt long Calculator::onCmdSqrt(FXObject*,FXSelector,void*){ unary(UN_SQRT+(modifiers&MOD_INV)); return 1; } // Update Sqrt long Calculator::onUpdSqrt(FXObject* sender,FXSelector,void*){ FXString label=(modifiers&MOD_INV)?"x^2":"sqrt"; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Shift left long Calculator::onCmdShl(FXObject*,FXSelector,void*){ unary(UN_SHL); return 1; } // Update Shift left long Calculator::onUpdShl(FXObject* sender,FXSelector,void*){ FXString label="SHL"; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); return 1; } // Shift right long Calculator::onCmdShr(FXObject*,FXSelector,void*){ unary(UN_SHR+(modifiers&MOD_INV)); return 1; } // Update Shift right long Calculator::onUpdShr(FXObject* sender,FXSelector,void*){ FXString label=(modifiers&MOD_INV)?"SAR":"SHR"; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); return 1; } // Base 2 log long Calculator::onCmd2Log(FXObject*,FXSelector,void*){ unary(UN_2LOG+(modifiers&MOD_INV)); return 1; } // Update Base 2 log long Calculator::onUpd2Log(FXObject* sender,FXSelector,void*){ FXString label=(modifiers&MOD_INV)?"2^x":"2log"; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Left parenth long Calculator::onCmdLPar(FXObject*,FXSelector,void*){ lparen(); return 1; } // Right parenth long Calculator::onCmdRPar(FXObject*,FXSelector,void*){ rparen(); return 1; } // Bitwise AND long Calculator::onCmdAnd(FXObject*,FXSelector,void*){ dyadic(DY_AND); return 1; } // Bitwise OR long Calculator::onCmdOr(FXObject*,FXSelector,void*){ dyadic(DY_OR); return 1; } // Bitwise XOR long Calculator::onCmdXor(FXObject*,FXSelector,void*){ dyadic(DY_XOR); return 1; } // Bitwise NOT long Calculator::onCmdNot(FXObject*,FXSelector,void*){ unary(UN_NOT); return 1; } // Multiply long Calculator::onCmdMul(FXObject*,FXSelector,void*){ dyadic(DY_MUL); return 1; } // Divide long Calculator::onCmdDiv(FXObject*,FXSelector,void*){ dyadic(DY_DIV); return 1; } // Modulo long Calculator::onCmdMod(FXObject*,FXSelector,void*){ dyadic(DY_MOD+(modifiers&MOD_INV)); return 1; } // Update mod long Calculator::onUpdMod(FXObject* sender,FXSelector,void*){ FXString label=(modifiers&MOD_INV)?"div":"mod"; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&label); sender->handle(this,(base==10) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Add long Calculator::onCmdAdd(FXObject*,FXSelector,void*){ dyadic(DY_ADD); return 1; } // Sub long Calculator::onCmdSub(FXObject*,FXSelector,void*){ dyadic(DY_SUB); return 1; } // Enter long Calculator::onCmdEnter(FXObject*,FXSelector,void*){ evaluate(); return 1; } // Recall from memory long Calculator::onCmdMemRec(FXObject*,FXSelector,void*){ setnum(recall); setDisplayValue(recall); modifiers=0; return 1; } // Add to memory long Calculator::onCmdMemAdd(FXObject*,FXSelector,void*){ recall+=getnum(); modifiers=0; return 1; } // Substract from memory long Calculator::onCmdMemSub(FXObject*,FXSelector,void*){ recall-=getnum(); modifiers=0; return 1; } // Clear memory long Calculator::onCmdMemClr(FXObject*,FXSelector,void*){ recall=0.0; modifiers=0; return 1; } fox1.6-1.6.57/calculator/Calculator.h000066400000000000000000000301701326741342000172310ustar00rootroot00000000000000/******************************************************************************** * * * F O X D e s k t o p C a l c u l a t o r * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Calculator.h,v 1.27 2006/01/22 18:01:12 fox Exp $ * ********************************************************************************/ #ifndef CALCULATOR_H #define CALCULATOR_H /*******************************************************************************/ // Mini application object class Calculator : public FXMainWindow { FXDECLARE(Calculator) protected: enum{STACKLEN=32}; protected: FXTextField *display; // Number display FXFont *font; // Display font FXButton *digit[16]; // Digit buttons FXButton *memory[4]; // Memory buttons FXButton *clearbtn; // Clear entry button FXButton *clearallbtn; // Clear all button FXButton *inverse; // Inverse function FXButton *hyper2; // Hyper (for trig) button FXButton *functions[16]; // Function buttons FXButton *operators[14]; // Operator buttons FXButton *numbase[4]; // Numeric base FXButton *angmode[3]; // Angle mode (deg, rad, grad) FXIcon *bigicon; // Big application icon FXIcon *smallicon; // Small application icon FXIcon *cmem; // Label FXIcon *quest; // Question mark FXdouble numstack[STACKLEN]; // Evaluation stack FXint numsp; // Evaluation stack pointer FXuchar opstack[STACKLEN]; // Operator stack FXint opsp; // Operator stack pointer FXdouble recall; // Memory cell FXint limit; // Maximum displayed digits FXint digits; // Number of digits entered FXint base; // Number base FXint angles; // Angle mode FXint precision; // How many digits to show FXbool exponent; // Exponential notation mode FXbool beep; // Beep on error FXint parens; // Count of ( and ) FXuchar modifiers; // Invert, hyperbolic, entry modifiers static const char help[]; protected: Calculator(){} private: Calculator(const Calculator&); Calculator &operator=(const Calculator&); void setDisplayText(const FXString& txt); FXString getDisplayText() const; void setDisplayValue(FXdouble val); FXdouble getDisplayValue() const; FXdouble trigarg(FXdouble ang) const; FXdouble trigres(FXdouble res) const; FXdouble pushnum(FXdouble num); FXdouble setnum(FXdouble num); FXdouble popnum(); FXdouble getnum(); void dyop(FXuchar op); void clear(); void unary(FXuchar op); void dyadic(FXuchar op); void evaluate(); void lparen(); void rparen(); public: long onCmdAngle(FXObject*,FXSelector,void*); long onUpdAngle(FXObject*,FXSelector,void*); long onCmdBase(FXObject*,FXSelector,void*); long onUpdBase(FXObject*,FXSelector,void*); long onUpdDigit(FXObject*,FXSelector,void*); long onCmdDigit(FXObject*,FXSelector,void*); long onCmdPoint(FXObject*,FXSelector,void*); long onUpdPoint(FXObject*,FXSelector,void*); long onCmdExp(FXObject*,FXSelector,void*); long onUpdExp(FXObject*,FXSelector,void*); long onCmdDelete(FXObject*,FXSelector,void*); long onCmdClear(FXObject*,FXSelector,void*); long onCmdClearAll(FXObject*,FXSelector,void*); long onCmdInverse(FXObject*,FXSelector,void*); long onCmdHyper(FXObject*,FXSelector,void*); long onCmdMemRec(FXObject*,FXSelector,void*); long onCmdMemAdd(FXObject*,FXSelector,void*); long onCmdMemSub(FXObject*,FXSelector,void*); long onCmdMemClr(FXObject*,FXSelector,void*); long onCmdSin(FXObject*,FXSelector,void*); long onUpdSin(FXObject*,FXSelector,void*); long onCmdCos(FXObject*,FXSelector,void*); long onUpdCos(FXObject*,FXSelector,void*); long onCmdTan(FXObject*,FXSelector,void*); long onUpdTan(FXObject*,FXSelector,void*); long onCmdLog(FXObject*,FXSelector,void*); long onUpdLog(FXObject*,FXSelector,void*); long onCmdLn(FXObject*,FXSelector,void*); long onUpdLn(FXObject*,FXSelector,void*); long onCmdPi(FXObject*,FXSelector,void*); long onUpdPi(FXObject*,FXSelector,void*); long onCmdFac(FXObject*,FXSelector,void*); long onUpdFac(FXObject*,FXSelector,void*); long onCmdPer(FXObject*,FXSelector,void*); long onUpdPer(FXObject*,FXSelector,void*); long onCmdCom(FXObject*,FXSelector,void*); long onUpdCom(FXObject*,FXSelector,void*); long onCmdRecip(FXObject*,FXSelector,void*); long onUpdRecip(FXObject*,FXSelector,void*); long onCmdPlusMin(FXObject*,FXSelector,void*); long onCmdXToY(FXObject*,FXSelector,void*); long onUpdXToY(FXObject*,FXSelector,void*); long onCmdSqrt(FXObject*,FXSelector,void*); long onUpdSqrt(FXObject*,FXSelector,void*); long onCmdShl(FXObject*,FXSelector,void*); long onUpdShl(FXObject*,FXSelector,void*); long onCmdShr(FXObject*,FXSelector,void*); long onUpdShr(FXObject*,FXSelector,void*); long onCmd2Log(FXObject*,FXSelector,void*); long onUpd2Log(FXObject*,FXSelector,void*); long onCmdLPar(FXObject*,FXSelector,void*); long onCmdRPar(FXObject*,FXSelector,void*); long onCmdAnd(FXObject*,FXSelector,void*); long onCmdOr(FXObject*,FXSelector,void*); long onCmdXor(FXObject*,FXSelector,void*); long onCmdNot(FXObject*,FXSelector,void*); long onCmdMul(FXObject*,FXSelector,void*); long onCmdDiv(FXObject*,FXSelector,void*); long onCmdMod(FXObject*,FXSelector,void*); long onUpdMod(FXObject*,FXSelector,void*); long onCmdAdd(FXObject*,FXSelector,void*); long onCmdSub(FXObject*,FXSelector,void*); long onCmdEnter(FXObject*,FXSelector,void*); long onCmdPreferences(FXObject*,FXSelector,void*); long onUpdColor(FXObject*,FXSelector,void*); long onCmdColor(FXObject*,FXSelector,void*); long onCmdFont(FXObject*,FXSelector,void*); long onCmdExponent(FXObject*,FXSelector,void*); long onUpdExponent(FXObject*,FXSelector,void*); long onCmdPrecision(FXObject*,FXSelector,void*); long onUpdPrecision(FXObject*,FXSelector,void*); long onCmdBeep(FXObject*,FXSelector,void*); long onUpdBeep(FXObject*,FXSelector,void*); long onCmdQuestion(FXObject*,FXSelector,void*); public: enum { MOD_INV=1, // Modes MOD_HYP=2, MOD_ENT=4 }; enum { ANG_DEG, // Angle modes ANG_RAD, ANG_GRA }; enum { NUM_BIN=2, // Number bases NUM_OCT=8, NUM_DEC=10, NUM_HEX=16 }; enum { DY_OR, // Dyadics DY_XOR, DY_AND, DY_SUB, DY_ADD, DY_MOD, DY_IDIV, DY_DIV, DY_MUL, DY_XTOY, DY_XTOINVY, DY_PER, DY_COM, DY_LPAR, DY_RPAR }; enum { UN_NOT, // Unaries UN_NEG, UN_SHL, UN_SHR, UN_SAR, UN_RECIP, UN_FAC, UN_SQRT, UN_QUAD, UN_2LOG, UN_2TOX, UN_LOG, UN_10TOX, UN_LN, UN_EXP, UN_SIN, UN_ASIN, UN_SINH, UN_ASINH, UN_COS, UN_ACOS, UN_COSH, UN_ACOSH, UN_TAN, UN_ATAN, UN_TANH, UN_ATANH }; public: enum { ID_TEXT=FXMainWindow::ID_LAST, ID_PREFERENCES, ID_COLOR_DISPLAY, ID_COLOR_DISPLAYNUMBER, ID_COLOR_DIGITS, ID_COLOR_HEXDIGITS, ID_COLOR_OPERATORS, ID_COLOR_FUNCTIONS, ID_COLOR_MEMORY, ID_COLOR_BASE, ID_COLOR_ANGLES, ID_COLOR_INVERT, ID_COLOR_HYPER, ID_COLOR_CLEARALL, ID_COLOR_CLEAR, ID_EXPONENT_ALWAYS, ID_EXPONENT_NEVER, ID_PRECISION, ID_QUESTION, ID_BEEP, ID_FONT, ID_BASE, ID_BIN=ID_BASE+NUM_BIN, ID_OCT=ID_BASE+NUM_OCT, ID_DEC=ID_BASE+NUM_DEC, ID_HEX=ID_BASE+NUM_HEX, ID_MODE, ID_DEG=ID_MODE+ANG_DEG, ID_RAD=ID_MODE+ANG_RAD, ID_GRA=ID_MODE+ANG_GRA, ID_MEM_REC, ID_MEM_ADD, ID_MEM_SUB, ID_MEM_CLR, ID_PLUSMIN, ID_ENTER, ID_CLEAR, ID_CLEARALL, ID_DELETE, ID_INV, ID_HYP, ID_EXP, ID_PNT, ID_PI, ID_0, ID_1, ID_2, ID_3, ID_4, ID_5, ID_6, ID_7, ID_8, ID_9, ID_A, ID_B, ID_C, ID_D, ID_E, ID_F, ID_OR, ID_XOR, ID_AND, ID_SUB, ID_ADD, ID_MOD, ID_DIV, ID_MUL, ID_XTOY, ID_PER, ID_COM, ID_LPAR, ID_RPAR, ID_NOT, ID_SHL, ID_SHR, ID_RECIP, ID_FAC, ID_SQRT, ID_2LOG, ID_LOG, ID_LN, ID_SIN, ID_COS, ID_TAN, ID_LAST }; public: /// Construct calculator dialog Calculator(FXApp* a); // Close the window and save registry virtual FXbool close(FXbool notify=FALSE); /// Create virtual void create(); /// Set digit color void setDigitColor(FXColor clr); FXColor getDigitColor() const; /// Set digit color void setHexDigitColor(FXColor clr); FXColor getHexDigitColor() const; /// Set operator color void setOperatorColor(FXColor clr); FXColor getOperatorColor() const; /// Set function color void setFunctionColor(FXColor clr); FXColor getFunctionColor() const; /// Set memory color void setMemoryColor(FXColor clr); FXColor getMemoryColor() const; /// Set inverse color void setInverseColor(FXColor clr); FXColor getInverseColor() const; /// Set hyp color void setHyperColor(FXColor clr); FXColor getHyperColor() const; /// Set clear color void setClearColor(FXColor clr); FXColor getClearColor() const; /// Set clear all color void setClearAllColor(FXColor clr); FXColor getClearAllColor() const; /// Set display color void setDisplayColor(FXColor clr); FXColor getDisplayColor() const; /// Set display number color void setDisplayNumberColor(FXColor clr); FXColor getDisplayNumberColor() const; /// Set numeric base color void setBaseColor(FXColor clr); FXColor getBaseColor() const; /// Set numeric base color void setAngleColor(FXColor clr); FXColor getAngleColor() const; /// Set number base void setBase(FXint base); FXint getBase() const { return base; } /// Set angle mode void setAngles(FXint ang){ angles=ang; } FXint getAngles() const { return angles; } /// Set exponent mode void setExponentMode(FXbool expmode); FXbool getExponentMode() const { return exponent; } /// Set precision void setPrecision(FXint prec); FXint getPrecision() const { return precision; } /// Beep on error void setBeep(FXbool on){ beep=on; } FXbool getBeep() const { return beep; } /// Set display font void setDisplayFont(FXFont* font); FXFont* getDisplayFont() const; /// Clear the calculator void clearAll(); /// Read/write registry void readRegistry(); void writeRegistry(); /// Destroy calculator virtual ~Calculator(); }; #endif fox1.6-1.6.57/calculator/HelpWindow.cpp000066400000000000000000000061341326741342000175560ustar00rootroot00000000000000/******************************************************************************** * * * H e l p W i n d o w * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: HelpWindow.cpp,v 1.10 2006/01/22 18:01:13 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "HelpWindow.h" /*******************************************************************************/ FXIMPLEMENT(HelpWindow,FXDialogBox,NULL,0) // Construct help dialog box HelpWindow::HelpWindow(FXWindow *owner,const FXString& title): FXDialogBox(owner,title,DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE|DECOR_CLOSE,0,0,0,0, 6,6,6,6, 4,4){ // Bottom part FXHorizontalFrame *closebox=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH); FXButton *button=new FXButton(closebox,tr("&Close"),NULL,this,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 20,20,5,5); // Text part FXHorizontalFrame *editbox=new FXHorizontalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, 0,0,0,0); helptext=new FXText(editbox,NULL,0,TEXT_READONLY|TEXT_WORDWRAP|LAYOUT_FILL_X|LAYOUT_FILL_Y); helptext->setVisibleRows(50); helptext->setVisibleColumns(90); button->setFocus(); } // Set help text void HelpWindow::setHelp(const FXString& help){ helptext->setText(help); } // Obtain help text FXString HelpWindow::getHelp() const { return helptext->getText(); } // Clean up HelpWindow::~HelpWindow(){ helptext=(FXText*)-1; } fox1.6-1.6.57/calculator/HelpWindow.h000066400000000000000000000044161326741342000172240ustar00rootroot00000000000000/******************************************************************************** * * * H e l p W i n d o w * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: HelpWindow.h,v 1.6 2006/01/22 18:01:13 fox Exp $ * ********************************************************************************/ #ifndef HELPWINDOW_H #define HELPWINDOW_H //class FXText; /// Online help dialog box class HelpWindow : public FXDialogBox { FXDECLARE(HelpWindow) protected: FXText *helptext; // Help display private: HelpWindow(){} HelpWindow(const HelpWindow&); public: HelpWindow(FXWindow *owner,const FXString& title); void setHelp(const FXString& help); FXString getHelp() const; virtual ~HelpWindow(); }; #endif fox1.6-1.6.57/calculator/LICENSE000066400000000000000000000431241326741342000157770ustar00rootroot00000000000000 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. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. fox1.6-1.6.57/calculator/Makefile.am000066400000000000000000000015611326741342000170250ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp LDADD = $(top_builddir)/src/libFOX-1.6.la -lm bin_PROGRAMS = calculator man_MANS = calculator.1 ICONS = \ colors.gif \ information.gif \ bigcalc.gif \ constmem.bmp \ question.gif \ tinycalc.gif calculator_SOURCES = \ icons.h \ icons.cpp \ Calculator.h \ Calculator.cpp \ HelpWindow.h \ HelpWindow.cpp \ Preferences.h \ Preferences.cpp \ help.cpp \ main.cpp \ LICENSE \ $(ICONS) Calculator.cpp: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $^ icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $^ CLEANFILES = icons.h icons.cpp EXTRA_DIST = $(man_MANS) \ Makefile.bc \ Makefile.wc \ Makefile.dmc fox1.6-1.6.57/calculator/Makefile.bc000066400000000000000000000055031326741342000170140ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Copyright (C) 1997,2005 by Jeroen van der Zijp. All Rights Reserved. # ############################################################################## # $Id: Makefile.bc,v 1.11 2005/09/22 11:14:47 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # For use with Borland C++ Builder 3 or later CXX = bcc32 CXXFLAGS = -5 -O2 -w-par -w-csu -w-aus RM = del TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = bcc32 LDFLAGS = -laa GLLIBS = opengl32.lib glu32.lib INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = calculator.exe OBJECTS = \ Calculator.obj \ main.obj \ icons.obj \ HelpWindow.obj \ Preferences.obj \ help.obj ICONS = \ bigcalc.gif \ colors.gif \ constmem.bmp \ information.gif \ question.gif \ tinycalc.gif .cpp.obj: $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) Calculator.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) Calculator.obj: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $** icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $** clean: $(RM) *.obj $(RM) *.exe $(RM) *.tds $(RM) icons.cpp $(RM) icons.h fox1.6-1.6.57/calculator/Makefile.dmc000066400000000000000000000053741326741342000172010ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Contributed by: Andre Fornacon # ############################################################################## # $Id: Makefile.dmc,v 1.12.2.1 2006/08/08 23:17:35 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # Digital Mars C++ Compiler 8.x or later CXX = dmc CXXFLAGS = -mn -5 -a8 RM = del TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = link LDFLAGS = LIBS = advapi32.lib+shell32.lib+gdi32.lib+wsock32.lib GLLIBS = opengl32.lib glu32.lib INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = calculator.exe OBJECTS = Calculator.obj main.obj icons.obj HelpWindow.obj Preferences.obj help.obj ICONS = colors.gif information.gif bigcalc.gif constmem.bmp question.gif tinycalc.gif .cpp.obj: $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) calculator.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) $(LIBS) calculator.obj: icons.cpp icons.h: $(ICONS) $(RM) $@ $(RESWRAP) -i -oa $@ $(ICONS) icons.cpp: $(ICONS) $(RM) $@ echo ^#include "icons.h" > $@ $(RESWRAP) -oa $@ $(ICONS) clean: $(RM) *.obj *.exe *.tds *.map icons.cpp fox1.6-1.6.57/calculator/Makefile.in000066400000000000000000000602051326741342000170360ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = calculator$(EXEEXT) subdir = calculator ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am__objects_1 = am_calculator_OBJECTS = icons.$(OBJEXT) Calculator.$(OBJEXT) \ HelpWindow.$(OBJEXT) Preferences.$(OBJEXT) help.$(OBJEXT) \ main.$(OBJEXT) $(am__objects_1) calculator_OBJECTS = $(am_calculator_OBJECTS) calculator_LDADD = $(LDADD) calculator_DEPENDENCIES = $(top_builddir)/src/libFOX-1.6.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(calculator_SOURCES) DIST_SOURCES = $(calculator_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp LDADD = $(top_builddir)/src/libFOX-1.6.la -lm man_MANS = calculator.1 ICONS = \ colors.gif \ information.gif \ bigcalc.gif \ constmem.bmp \ question.gif \ tinycalc.gif calculator_SOURCES = \ icons.h \ icons.cpp \ Calculator.h \ Calculator.cpp \ HelpWindow.h \ HelpWindow.cpp \ Preferences.h \ Preferences.cpp \ help.cpp \ main.cpp \ LICENSE \ $(ICONS) CLEANFILES = icons.h icons.cpp EXTRA_DIST = $(man_MANS) \ Makefile.bc \ Makefile.wc \ Makefile.dmc all: all-am .SUFFIXES: .SUFFIXES: .gif .bmp .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign calculator/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign calculator/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list calculator$(EXEEXT): $(calculator_OBJECTS) $(calculator_DEPENDENCIES) $(EXTRA_calculator_DEPENDENCIES) @rm -f calculator$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(calculator_OBJECTS) $(calculator_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Calculator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HelpWindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Preferences.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/help.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icons.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 .PRECIOUS: Makefile Calculator.cpp: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $^ icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $^ # 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: fox1.6-1.6.57/calculator/Makefile.wc000066400000000000000000000056661326741342000170530ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Copyright (C) 1997,2005 by Jeroen van der Zijp. All Rights Reserved. # ############################################################################## # $Id: Makefile.wc,v 1.9 2005/09/22 11:14:47 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # For use with OpenWatcom C++ v1.0 or later CXX = wpp386 CXXFLAGS = /w3 /e1 /zq /5r /ei /xs /xr /fp5 /otexan /zp=4 RM = del TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = wcl386 LDFLAGS = -l=nt_win GLLIBS = opengl32.lib glu32.lib INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib $(%WATCOM)\lib386\nt\comctl32.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = calculator.exe OBJECTS = OBJECTS += Calculator.obj OBJECTS += main.obj OBJECTS += icons.obj OBJECTS += HelpWindow.obj OBJECTS += Preferences.obj OBJECTS += help.obj ICONS = ICONS += bigcalc.gif ICONS += colors.gif ICONS += constmem.bmp ICONS += information.gif ICONS += question.gif ICONS += tinycalc.gif .cpp.obj: .AUTODEPEND $(CXX) $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) Calculator.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) Calculator.obj: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $(ICONS) icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $(ICONS) clean: .SYMBOLIC $(RM) *.obj $(RM) *.exe $(RM) *.err $(RM) icons.cpp $(RM) icons.h fox1.6-1.6.57/calculator/Preferences.cpp000066400000000000000000000256231326741342000177430ustar00rootroot00000000000000/******************************************************************************** * * * P r e f e r e n c e s D i a l o g * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Preferences.cpp,v 1.17 2006/01/22 18:01:13 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "icons.h" #include "Preferences.h" #include "Calculator.h" /*******************************************************************************/ FXIMPLEMENT(Preferences,FXDialogBox,NULL,0) // Construct Preferences::Preferences(Calculator *owner): FXDialogBox(owner,"Calculator Preferences",DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,0,0,0,0, 10,10,10,10, 4,4){ setTitle(tr("Calculator Preferences")); // Icons palette=new FXGIFIcon(getApp(),colors); calculator=new FXGIFIcon(getApp(),bigcalc); info=new FXGIFIcon(getApp(),information,0,IMAGE_ALPHAGUESS); // Bottom part FXHorizontalFrame *closebox=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH); FXButton* close=new FXButton(closebox,tr("&Close"),NULL,this,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 20,20); new FXHorizontalSeparator(this,LAYOUT_SIDE_BOTTOM|SEPARATOR_RIDGE|LAYOUT_FILL_X); FXHorizontalFrame *horizontal=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); FXVerticalFrame *buttons=new FXVerticalFrame(horizontal,LAYOUT_LEFT|LAYOUT_FILL_Y|FRAME_SUNKEN|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT,0,0,0,0, 0,0,0,0, 0,0); FXSwitcher *switcher=new FXSwitcher(horizontal,LAYOUT_FILL_X|LAYOUT_FILL_Y); // Pane 2 FXVerticalFrame* pane2=new FXVerticalFrame(switcher,LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXLabel(pane2,tr("Calculator settings"),NULL,LAYOUT_LEFT); new FXHorizontalSeparator(pane2,SEPARATOR_LINE|LAYOUT_FILL_X); FXMatrix *matrix2=new FXMatrix(pane2,5,MATRIX_BY_ROWS|PACK_UNIFORM_HEIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXLabel(matrix2,tr("Display Font:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Always show exponent:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Never show exponent:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Precision:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXLabel(matrix2,tr("Beep on error:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXButton(matrix2,tr("Set..."),NULL,owner,Calculator::ID_FONT,FRAME_RAISED|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); new FXCheckButton(matrix2,FXString::null,owner,Calculator::ID_EXPONENT_ALWAYS,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); new FXCheckButton(matrix2,FXString::null,owner,Calculator::ID_EXPONENT_NEVER,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); FXSpinner* spinner=new FXSpinner(matrix2,2,owner,Calculator::ID_PRECISION,JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_LEFT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); spinner->setRange(1,30); new FXCheckButton(matrix2,FXString::null,owner,Calculator::ID_BEEP,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); // Button 2 new FXButton(buttons,tr("Calculator\tCalculator settings\tChange calculator settings."),calculator,switcher,FXSwitcher::ID_OPEN_FIRST,FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y); // Pane 1 FXVerticalFrame* pane1=new FXVerticalFrame(switcher,LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXLabel(pane1,tr("Color settings"),NULL,LAYOUT_LEFT); new FXHorizontalSeparator(pane1,SEPARATOR_LINE|LAYOUT_FILL_X); FXMatrix *matrix1=new FXMatrix(pane1,6,MATRIX_BY_COLUMNS|PACK_UNIFORM_HEIGHT|PACK_UNIFORM_WIDTH|LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXLabel(matrix1,tr("Display:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_DISPLAY,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Display Number:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_DISPLAYNUMBER,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Digits:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_DIGITS,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Hex Digits:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_HEXDIGITS,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Operators:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_OPERATORS,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Functions:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_FUNCTIONS,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Memory:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_MEMORY,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Number Base:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_BASE,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Angle Mode:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_ANGLES,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Invert:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_INVERT,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Hyper:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_HYPER,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Clear All:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_CLEARALL,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); new FXLabel(matrix1,tr("Clear:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW); new FXColorWell(matrix1,FXRGB(0,0,0),owner,Calculator::ID_COLOR_CLEAR,COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,24); // Button 1 new FXButton(buttons,tr("Colors\tChange Colors\tChange text colors."),palette,switcher,FXSwitcher::ID_OPEN_SECOND,FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y); // Pane 3 FXVerticalFrame* pane3=new FXVerticalFrame(switcher,LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXLabel(pane3,tr("About FOX Calculator"),NULL,LAYOUT_LEFT); new FXHorizontalSeparator(pane3,SEPARATOR_LINE|LAYOUT_FILL_X); FXHorizontalFrame *sub3=new FXHorizontalFrame(pane3,LAYOUT_FILL_Y|LAYOUT_FILL_X); new FXLabel(sub3,FXString::null,calculator,LAYOUT_CENTER_Y,0,0,0,0,20,20,20,20); new FXLabel(sub3,FXStringFormat(tr("The FOX Calculator\n\nA Programmer's Desktop Calculator version 2.1.0.\nFOX library version %d.%d.%d.\nHome Page: http://www.fox-toolkit.org\nFTP Site: ftp://ftp.fox-toolkit.org\n\nCopyright (C) 2001,2005 Jeroen van der Zijp."),FOX_MAJOR,FOX_MINOR,FOX_LEVEL),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y); // Button 3 new FXButton(buttons,tr("About\tAbout FOX Calculator\tAbout the FOX Calculator."),info,switcher,FXSwitcher::ID_OPEN_THIRD,FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y); // Focus on close button close->setFocus(); } // Clean up Preferences::~Preferences(){ delete palette; delete calculator; palette=(FXIcon*)-1; calculator=(FXIcon*)-1; } fox1.6-1.6.57/calculator/Preferences.h000066400000000000000000000042631326741342000174050ustar00rootroot00000000000000/******************************************************************************** * * * P r e f e r e n c e s D i a l o g * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Preferences.h,v 1.6 2006/01/22 18:01:13 fox Exp $ * ********************************************************************************/ #ifndef PREFERENCES_H #define PREFERENCES_H class Calculator; class Preferences : public FXDialogBox { FXDECLARE(Preferences) protected: FXIcon *palette; FXIcon *calculator; FXIcon *info; private: Preferences(){} Preferences(const Preferences&); public: Preferences(Calculator *owner); virtual ~Preferences(); }; #endif fox1.6-1.6.57/calculator/bigcalc.gif000066400000000000000000000003631326741342000170430ustar00rootroot00000000000000GIF87aă°ŔŘŚřüřřüŕ(ŕ´0ŔŔŔĐüČř,¨„I«˝8H1¸ďŕ'† Qˇ®láľp¬š  8^¨Ĺá˙@ŕě”2€;CÁl:›‡aŤ'SŻ?i‘ĹízW4›Q°ÓŤËäł!‘HŇŠÇňAN7Î×wCş{)]}€~zD_‡{jfŚiŤn†vuq’•”…Sš~ś€[˘`'bŹ‹Ž9f 7w”Ż®A™ť‚¶0ZŁ»RżŔÁÂĂÄ1ČÉĘ/;fox1.6-1.6.57/calculator/calculator.1000066400000000000000000000125331326741342000172050ustar00rootroot00000000000000.TH CALCULATOR 1 "30 January 2002" .SH NAME calculator \- simple desktop calculator .SH SYNOPSIS \fBcalculator\fP .SH DESCRIPTION .LP The FOX Calculator is a simple desktop calculator geared toward the programmer. It supports not only a full complement scientific functions, but also common operations that programmers need, such as bitwise operations, bitwise shifting, and base-2 logarithm and exponents, and numeric conversion between hexadecimal, octal, binary, and decimal. The FOX Calculator implements correct operator precedences, so expressions like 2+3*5 yield the correct result, which is 17, and not 25. Also featured is a constant memory, which permanently stores its value even if you exit the calculator and restart it later. .SH CONFIGURATION Pressing on the calculator icon brings up the Calculator Preferences dialog. The Calculator Preferences dialog comprises three settings: - Settings for the calculator itself; .br - Color settings of the button groups; .br - Information about the calculator. In the Calculator settings panel, you can change font used for the display, by pressing the "Set..." button to bring up the standard Font Selection Dialog. You can change the way numbers are printed as well. Checking "Always show exponent" will cause the calculator display always to display the number in exponential notation. Checking "Never show exponent" will cause the calculator to render the number in simple dot notation. The precision can be set by means of the spin button; the default precision is set to 16. Finally, the calculator can be set to beep when errors occur. In the Color settings panel, you can change the colors of the various button groups. The buttons are grouped by function; the numbers are in one group, and the operators are in another, and so on. In the About panel, some information is presented about the calculator, like version number and author's contact. .SH ENTERING NUMBERS You can enter a number by clicking on the digit buttons, or simply hit the right digit on the keyboard. Numbers in exponential notation are entered by entering the mantissa first, then hitting the "EXP" button, and then entering the exponent. Up to 3 digits may be entered for the exponent; entering more than 3 will cause the digits to shift, i.e. the first digit entered will be dropped and replaced by the second, the second digit will be replaced by the third, and the third will be replaced by the new input. Changing the sign of the exponent is accomplished by hittin the \"+/-\" button. At any time, you can hit the Backspace key to delete the last digit entered. Two numbers, pi and e (euler's number) may be entered with a single button: .TP pi - Enters the number 3.1415926535897932384626433833 .TP e - Enters the number 2.7182818284590452353602874713 (hit the "inv" button first) .SH OPERATORS The operators in the FOX Calculator are the usual suspects: .TP .I + Addition .TP .I \- Substraction .TP .I * Multiplication .TP .I / Floating point division .P In addition, FOX Calculator also includes bitwise operators, such as: .TP .I AND Bit-wise logical and .TP .I OR Bit-wise logical or .TP .I XOR Bit-wise logical exclusive or .TP .I NOT Bit-wise logical not .TP .I SHL Bit-wise shift left .TP .I SHR Bit-wise shift right .TP .I SAR Bit-wise signed shift right (hit the "inv" button first) .P Also nice for programmers is the inclusion of integer operations: .TP .I mod Integer modulo .TP .I div Integer division (hit the \"inv\" button first) .P All the operators have certain precedence relations with each other, so that an expression is evaluated correctly. .SH TRIGONOMETRIC FUNCTIONS The Calculator incorporates the usual trigonometric functions: .TP .I sin Sine .TP .I cos Cosine .TP .I tan Tangent .TP .I asin Inverse sine or arc sine (hit the "inv" button first) .TP .I acos Inverse cosine .TP .I atan Inverse tangent .TP .I sinh Hyperbolic sine (hit the "hyp" button first) .TP .I cosh Hyperbolic cosine .TP .I tanh Hyperbolic tangent .TP .I asinh Inverse hyperbolic sine (hit the "hyp" and "inv"buttons first) .TP .I acosh Inverse hyperbolic cosine .TP .I atanh Inverse hyperbolic tangent .P For the first 6 functions, the angle mode determines whether the argument is specified in terms of degrees, radians, or grad. Note that the angle mode is preserved across invocations of the Calculator. .SH OTHER FUNCTIONS Other functions supported by the calculator are the following: .TP .I log Base 10 logarithm .TP .I ln Natural logarithm .TP .I 2log Base 2 logarithm .TP .I x! Factorial .TP .I nPr Permutations .TP .I nCr Combinations .TP .I sqrt Square root .TP .I x^y X raised to the power y .TP .I 1/x Reciprocal .TP .I 10^x Base 10 exponentiation (hit the "inv" button first) .TP .I e^x Exponentiation .TP .I 2^x Base 2 exponentiation .TP .I x^1/y X raised to the power 1/y .TP .I x^2 X squared .SH LIMITS The calculator works in IEEE 746 double precision mode; for bit-wise operations, it uses 32 bit integers. Thus, the numeric limits are as follows: .P Smallest real number: 2.2250738585072010e-308 .br Largest real number: 1.7976931348623158e+308 .br Smallest integer number: 0 .br Largest integer number: 4294967295 .SH AUTHOR This manpage was originally written by Bastian Kleineidam for the Debian distribution of the FOX Toolkit. The main author of FOX is Jeroen van der Zijp . For a list of contributors see /usr/share/doc/libfox0.99/AUTHORS. fox1.6-1.6.57/calculator/colors.gif000066400000000000000000000027071326741342000167640ustar00rootroot00000000000000GIF87a ÷˛ŔÜx°¨ČĽČÄ ĐÄ ČŔ ¸´ŚpĐȨ¸¬¨ś€¸° d0 \0D Śx°¬pČĽ ĐĨ(x8P´X@H0x@H °¤”x¨x¨„x°¨¸°Ř̰pŔpH°XP°XŔĽ xČŔ¨Đ̰ ¨(p €Ŕ¸ (@hŔh¨Ü¨¨Ü  €Řа (Č0ŕHHp ¸ěČ(x@|xlpTPHHpŘÔ¸ŘиĐ8ř\`řřDHČ (Ŕ´ ŕđč˙˙˙pÄp0H””lhHHŕÔŔřŚř¸¸ř¤¨ŕ?>¤§¤áĺáSTS~€~ŽŽřüř„†„prpŇÖŇźˇź^`^­°­®°®_a_×Ú×ŽŽ¶¸¶řüř¨«¨`b`ĂĆĂřüř?@?––ňöňřüřçëç……hihęîężÂżĹČĹĺéĺ”—”232ÂĹÂěđěSTStvt›ť›ĺéĺÄÇÄpqpřüřáĺágigřüřäčä?@?©¬©řüř©¬©mom\^\°ł°řüřľÁľ¸»¸řüřřüřřüřÁÄÁßăßřüřřüřřüřřüřöúö*+*ÖŮÖřüřřüřËÎˤ§¤;<;ÇĘÇőůő=?=§Ş§ďóď&'&ęíęó÷ó()(»ľ»ĐÔĐ©«©ěđěßăß|~|ŠŤŠ¶ą¶TUTĄ¨ĄŰßŰ`b`efeĹČĹ­Ż­Z\Zřüř·ş·OQOŔĂŔřüř'('ŐŮŐŔĂŔřüřřüřŮÜŮřüř||232ňöňëďëó÷󨪨FGFřüřäčä°ł°íńí&'&ëďëřüř232ßăßňöň"#"ĹČĹÜŕÜ ! âĺâđôđ+,+ľÁľĚĐĚ676öúöřüřřüřÁÄÁ787••÷ű÷řüřřüřřüřżĂżACAřüřřüřřüřřüřďóď999°ł°řüř¦©¦9:9řüřNON˘¤˘řüř`b`—š—řüřôřôbdb:;:ó÷óĘÎĘLMLřüřŹ’ŹYZYřüřšťšňöňäčäéíéđôđęîęřüřuwuˇŁˇřüřřüřřüřőůőopořüřMNM›ž›‹Ť‹řüř676ÁÄÁľÁľŤŹŤťźťëďëřüřIJI§Ş§řüřdfdnonřüřoqoˇŁˇřüřËÎËřüřŚŽŚTUTřüřÓ×ÓřüřřüřÁÄÁMOM­°­ĆÉĆřüřřüřřüř·ş·8:8řüřřüřřüřřüřřüřŹ’ŹY[YřüřćęćřüřŤŹŤ<=<ŕăŕ·ş·PQPřüř|}|KLKěđěřüřó÷ó---îňîčěč232ĹÉĹňöň&&&ÁÄÁřüř232€‚€öúö]^]Ş­Şřüř´·´acařüřřüřřüřřüřmnmôřô#$#×Ú׳¶łŔĂŔuwu‹Ž‹ńőń+++Ô×ÔľÁľ222éěéŠ?@?âĺ⣦ŁÄÇÄ®±®Y[YřüřtwttvtřüřËĎË-.-řüřTVT}}řüřřüř¨«¨uwuřüřVWVöúöřüřřüřďóď ŕăŕřüřřüřřüřřüřó÷ó_a_tut{}{efeďóďprp)*)¤§¤‰Ś‰%&%řüř¤¦¤jljded†ĐÓĐ---„†„ĽżĽâćâefe‚„‚=>=––ĘÍĘ:;:npn›ž›NPN‚řüř§©§$%$’•’ßâßřüřřüřź˘źÁÄÁřüřöúö…‡…­Ż­TUTřüřĐÓĐQSQŠ*+*ÖÚÖmom...˘Ą˘‡‰‡&'&‹Ž‹{|{./.řüřęíęUVU|~|prp{}{đôđcecABA^`^rtrbebřüřACAĚĎĚřüřřüřřüřopo‰‹‰řüřřüřřüřĚĎĚîňîřüřçëçĺčĺřüřöúöăç㸻¸řüřëďëëîëřüřřüřëďëăçăőůőđóđ„†„z|zěďěřüřřüřĺčĺăçăöúöîňî×Ú×ËĎËřüřäčäňöňřüřéěé676ČËČóöóřüřřüřÍŃÍQRQGHGřüřřüřęîęnpnřüřřüřöúöăçăęîęőůőăç㸻¸řüřëďëëďëřüřĺéĺëďëřüřřüřřüřĺéĺçëçřüřôřô×Ű×ËÎËîňîíđíîňîňöňřüřéěéňöňřüřřüřřüřňöňacamomĹČĹÂĹÂBBBĹÉĹřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřőůőÁÄÁřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřáĺáŐŘŐřüřřüřřüř×Ű×€‚€řüřřüřřüř¤¦¤ ¤¦¤ďňďřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüř÷ű÷Üŕܱ´±±´±ŃŐŃőůőřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřĂĆñ´±ÖÚÖřüřřüřřüř÷ű÷ĽżĽÄÇÄöúöřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřřüřfox1.6-1.6.57/calculator/help.cpp000066400000000000000000000171141326741342000164260ustar00rootroot00000000000000/******************************************************************************** * * * O n - L i n e H e l p T e x t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: help.cpp,v 1.6 2006/01/22 18:01:13 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "Calculator.h" // Help text const char Calculator::help[]= "\n\n" " The FOX Calculator\n" "\n\n" "Introduction.\n" "\n" "The FOX Calculator is a simple desktop calculator geared toward the programmer. " "It supports not only a full complement scientific functions, but also common " "operations that programmers need, such as bitwise operations, bitwise shifting, " "and base-2 logarithm and exponents, and numeric conversion between hexadecimal, " "octal, binary, and decimal.\n" "The FOX Calculator implements correct operator precedences, so expressions like " "2+3*5 yield the correct result, which is 17, and not 25.\n" "Also featured is a constant memory, which permanently stores its value even if " "you exit the calculator and restart it later.\n" "\n\n" "Configuration.\n" "\n" "Pressing on the calculator icon brings up the Calculator Preferences dialog. " "The Calculator Preferences dialog comprises three settings:\n\n" "\t\t- Settings for the calculator itself;\n" "\t\t- Color settings of the button groups;\n" "\t\t- Information about the calculator.\n" "\n" "In the Calculator settings panel, you can change font used for the " "display, by pressing the \"Set...\" button to bring up the standard Font Selection " "Dialog.\n" "You can change the way numbers are printed as well. Checking \"Always show exponent\" " "will cause the calculator display always to display the number in exponential notation. " "Checking \"Never show exponent\" will cause the calculator to render the number in simple " "dot notation.\n" "The precision can be set by means of the spin button; the default precision is set to 16.\n" "Finally, the calculator can be set to beep when errors occur.\n" "\n" "In the Color settings panel, you can change the colors of the various button groups.\n" "The buttons are grouped by function; the numbers are in one group, and the operators are " "in another, and so on.\n" "\n" "In the About panel, some information is presented about the calculator, like version " "number and author's contact.\n" "\n\n" "Entering Numbers.\n" "\n" "You can enter a number by clicking on the digit buttons, or simply hit the right " "digit on the keyboard. Numbers in exponential notation are entered by entering the " "mantissa first, then hitting the \"EXP\" button, and then entering the exponent. " "Up to 3 digits may be entered for the exponent; entering more than 3 will cause the " "digits to shift, i.e. the first digit entered will be dropped and replaced by the " "second, the second digit will be replaced by the third, and the third will be replaced " "by the new input.\n" "Changing the sign of the exponent is accomplished by hittin the \"+/-\" button.\n" "At any time, you can hit the Backspace key to delete the last digit entered.\n" "Two numbers, pi and e (euler's number) may be entered with a single button:\n" "\n" "\tpi\tEnters the number 3.1415926535897932384626433833\n" "\te\tEnters the number 2.7182818284590452353602874713 (hit the \"inv\" button first)\n" "\tphi\tEnters the golden ratio number 1.6180339887498948482045868343 (hit the \"hyp\" button first)\n" "\t1/phi\tEnters the inverse golden ratio number (hit the \"hyp\" and \"inv\" buttons)\n" "\n\n" "Operators.\n" "\n" "The operators in the FOX Calculator are the usual suspects:\n" "\n" "\t+\tAddition\n" "\t-\tSubstraction\n" "\t*\tMultiplication\n" "\t/\tFloating point division\n" "\n" "In addition, FOX Calculator also includes bitwise operators, such as:\n" "\n" "\tAND\tBit-wise logical and\n" "\tOR\tBit-wise logical or\n" "\tXOR\tBit-wise logical exclusive or\n" "\tNOT\tBit-wise logical not\n" "\tSHL\tBit-wise shift left\n" "\tSHR\tBit-wise shift right\n" "\tSAR\tBit-wise signed shift right (hit the \"inv\" button first)\n" "\n" "Also nice for programmers is the inclusion of integer operations:\n" "\n" "\tmod\tInteger modulo\n" "\tdiv\tInteger division (hit the \"inv\" button first)\n" "\n" "All the operators have certain precedence relations with each other, so that " "an expression is evaluated correctly.\n" "\n\n" "Trigonometric Functions.\n" "\n" "The Calculator incorporates the usual trigonometric functions:\n" "\n" "\tsin \tSine\n" "\tcos \tCosine\n" "\ttan \tTangent\n" "\tasin \tInverse sine or arc sine (hit the \"inv\" button first)\n" "\tacos \tInverse cosine\n" "\tatan \tInverse tangent\n" "\tsinh \tHyperbolic sine (hit the \"hyp\" button first)\n" "\tcosh \tHyperbolic cosine\n" "\ttanh \tHyperbolic tangent\n" "\tasinh \tInverse hyperbolic sine (hit the \"hyp\" and \"inv\"buttons first)\n" "\tacosh \tInverse hyperbolic cosine\n" "\tatanh \tInverse hyperbolic tangent\n" "\n" "For the first 6 functions, the angle mode determines whether the argument is " "specified in terms of degrees, radians, or grad. " "Note that the angle mode is preserved across invocations of the Calculator.\n" "\n\n" "Other Functions.\n" "\n" "Other functions supported by the calculator are the following:\n" "\n" "\tlog \tBase 10 logarithm\n" "\tln \tNatural logarithm\n" "\t2log \tBase 2 logarithm\n" "\tx! \tFactorial\n" "\tnPr \tPermutations\n" "\tnCr \tCombinations\n" "\tsqrt \tSquare root\n" "\tx^y \tX raised to the power y\n" "\t1/x \tReciprocal\n" "\t10^x \tBase 10 exponentiation (hit the \"inv\" button first)\n" "\te^x \tExponentiation\n" "\t2^x \tBase 2 exponentiation\n" "\tx^1/y \tX raised to the power 1/y\n" "\tx^2 \tX squared\n" "\n\n" "Limits.\n" "\n" "The calculator works in IEEE 746 double precision mode; for bit-wise operations, " "it uses 32 bit integers. Thus, the numeric limits are as follows: \n" "\n" "Smallest real number:\t2.2250738585072010e-308\n" "Largest real number: \t1.7976931348623158e+308\n" "Smallest integer number:\t0\n" "Largest integer number:\t4294967295\n" ; fox1.6-1.6.57/calculator/icons.cpp000066400000000000000000000755541326741342000166250ustar00rootroot00000000000000/* Generated by reswrap version 4.0.0 */ /* created by reswrap from file colors.gif */ extern const unsigned char colors[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x20,0x00,0x20,0x00,0xf7,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x98,0x90,0x78,0xb0,0xa8,0x88,0xc8,0xbc,0x98,0xc8,0xc4,0xa0,0xd0, 0xc4,0xa0,0xc8,0xc0,0xa0,0xb8,0xb4,0x90,0x90,0x8c,0x70,0xd0,0xc8,0xa8,0xb8,0xac, 0x90,0xa8,0x9c,0x80,0xb8,0xb0,0x90,0x20,0x64,0x30,0x20,0x5c,0x30,0x18,0x44,0x20, 0x98,0x8c,0x78,0xb0,0xac,0x88,0x90,0x90,0x70,0xc8,0xbc,0xa0,0xd0,0xc4,0xa8,0x28, 0x78,0x38,0x50,0xb4,0x58,0x40,0x98,0x48,0x30,0x78,0x40,0x18,0x48,0x20,0xb0,0xa4, 0x88,0x98,0x94,0x78,0xa8,0x88,0x78,0xa8,0x84,0x78,0xb0,0xa8,0x90,0xb8,0xb0,0x98, 0xd8,0xcc,0xb0,0x70,0xc0,0x70,0x48,0xb0,0x58,0x50,0xb0,0x58,0xc0,0xbc,0x98,0xa0, 0x98,0x78,0xc8,0xc0,0xa8,0xd0,0xcc,0xb0,0x88,0x10,0x20,0xa8,0x14,0x28,0x70,0x0c, 0x20,0x98,0x98,0x80,0xc0,0xb8,0xa0,0x28,0x90,0x40,0x68,0xc0,0x68,0xa8,0xdc,0xa8, 0xa8,0xdc,0xa0,0xa0,0x98,0x80,0xd8,0xd0,0xb0,0xa0,0x14,0x28,0xc8,0x18,0x30,0xe0, 0x48,0x48,0x70,0x0c,0x18,0xb8,0xec,0xc8,0x28,0x78,0x40,0x18,0x7c,0x78,0x18,0x6c, 0x70,0x08,0x54,0x50,0x08,0x48,0x48,0x90,0x88,0x70,0xd8,0xd4,0xb8,0xd8,0xd0,0xb8, 0xd0,0x1c,0x38,0xf8,0x5c,0x60,0xf8,0x88,0x88,0xf8,0x44,0x48,0xc8,0x20,0x28,0xc0, 0xb4,0xa0,0xe0,0xf0,0xe8,0xff,0xff,0xff,0x70,0xc4,0x70,0x30,0x90,0x48,0x18,0x94, 0x98,0x18,0x90,0x90,0x18,0x94,0x90,0x10,0x6c,0x68,0x10,0x48,0x48,0xe0,0xd4,0xc0, 0xf8,0x8c,0x90,0xf8,0xb8,0xb8,0xf8,0xa4,0xa8,0xe0,0x3c,0x48,0xb0,0xe0,0xb0,0x28, 0x8c,0x40,0x80,0xc4,0x78,0x40,0xa8,0x50,0x90,0xb4,0x88,0x20,0xac,0xa8,0x78,0xd0, 0xc8,0x58,0xc8,0xc0,0xc0,0xb4,0x90,0xe0,0xd8,0xc0,0xc0,0x6c,0x68,0xf8,0xd4,0xd0, 0xf8,0xc4,0xc0,0xf0,0x74,0x78,0xc8,0xc4,0xb0,0x38,0x94,0x50,0x98,0xb4,0x88,0x98, 0xdc,0xd8,0xb8,0xe4,0xe0,0xb8,0xe4,0xe8,0xd0,0xc8,0xb0,0xd8,0xd8,0xc0,0xe0,0xb4, 0xa8,0xf8,0x9c,0xa0,0xf8,0x9c,0x98,0xf8,0x80,0x80,0xf8,0x5c,0x58,0xe0,0xd4,0xb8, 0x30,0xb4,0xb8,0xe0,0xf0,0xf0,0xa0,0xe0,0xd8,0x58,0xcc,0xc0,0x10,0x90,0x90,0xc0, 0xb8,0x98,0xe0,0xd8,0xc8,0xe0,0xdc,0xc8,0xe8,0xdc,0xc8,0xe8,0xb4,0xa8,0xd8,0xd4, 0xc0,0x28,0xb0,0xb0,0x80,0xd8,0xd0,0x40,0xc4,0xc8,0xe8,0xe0,0xc8,0xe8,0xe0,0xd0, 0xe0,0xe0,0xc8,0x28,0xac,0xb0,0xc8,0xc0,0x98,0xa0,0x9c,0x80,0xe8,0xe4,0xd0,0xf0, 0xe8,0xd8,0xe8,0xe4,0xd8,0xc8,0xc4,0xa8,0xb0,0xac,0x90,0xf0,0xec,0xe8,0x08,0x04, 0x08,0x00,0x04,0x00,0x08,0x08,0x08,0xf0,0xf0,0xe8,0xe0,0xe0,0xd0,0x00,0x50,0x80, 0x00,0x50,0x78,0x00,0x44,0x68,0x00,0x40,0x60,0x88,0x80,0x68,0x10,0x0c,0x10,0x00, 0x54,0x80,0x00,0x68,0x98,0x10,0x7c,0xb8,0xe8,0xe8,0xd8,0x30,0xa0,0xd8,0x48,0xb4, 0xe0,0x28,0xa0,0xd8,0x30,0x98,0xd0,0x00,0x64,0x98,0x10,0x7c,0xb0,0x78,0xcc,0xf0, 0x98,0xdc,0xf0,0x68,0xc4,0xe8,0x58,0xb4,0xe0,0x10,0x80,0xb8,0xc0,0xb0,0x98,0xe8, 0xec,0xe0,0xf0,0xec,0xe0,0x20,0x20,0x20,0xa8,0xe0,0xf0,0xe0,0xf0,0xf8,0xa0,0xe0, 0xf0,0x38,0xac,0xd8,0x08,0x7c,0xb8,0xf0,0xe4,0xd8,0x10,0x10,0x10,0x60,0xb8,0xd8, 0xa8,0xe8,0xf8,0x78,0xd0,0xf8,0x10,0x84,0xc0,0x20,0x1c,0x20,0x10,0x78,0xb0,0xd0, 0xcc,0xa8,0xf8,0xf4,0xf0,0xf0,0xe8,0xe0,0xf8,0xf0,0xe8,0xc0,0xb4,0x98,0x30,0x30, 0x30,0xd8,0xcc,0xa8,0x28,0x28,0x28,0xf8,0xf4,0xe8,0x50,0x54,0x50,0xf0,0xf4,0xe8, 0x18,0x18,0x18,0x50,0x4c,0x50,0x38,0x38,0x38,0x10,0x14,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x08,0xfe,0x00,0x01,0x08,0x1c,0x48,0xb0,0xa0, 0xc1,0x83,0x08,0x13,0x2a,0x5c,0x98,0x30,0x80,0xc3,0x87,0x10,0x19,0x22,0x74,0x28, 0x60,0x00,0x81,0x02,0x06,0x0a,0x1c,0x40,0x30,0x20,0x81,0x43,0x89,0x03,0x1d,0x0e, 0x30,0x70,0xc0,0x80,0x01,0x05,0x24,0x17,0xa8,0x3c,0x70,0x80,0xc1,0x47,0x86,0x01, 0x1a,0x9c,0x9c,0xa9,0x40,0xa3,0x83,0x07,0x10,0x22,0x48,0x60,0x69,0x60,0x42,0x80, 0x85,0x01,0x28,0x28,0x50,0x50,0x81,0xe8,0xd0,0x0a,0x16,0x2e,0x60,0xc8,0xa0,0x61, 0xc3,0x01,0x94,0x14,0x38,0xfc,0x9c,0xf8,0xb4,0x42,0x07,0x0f,0x1f,0x40,0x1c,0x08, 0x61,0x41,0xc4,0x08,0x12,0x18,0x9a,0x1e,0xd0,0x58,0x82,0x82,0x89,0xa9,0x05,0x03, 0x9c,0x50,0x80,0x22,0x85,0x8a,0x14,0x2b,0x58,0xb4,0x50,0xe0,0xe2,0x05,0x8c,0x18, 0x17,0x1c,0x34,0x60,0xd9,0x80,0x81,0x5f,0x19,0x68,0x43,0xa2,0x98,0x41,0xa3,0x86, 0x8d,0x1a,0x34,0x6e,0x80,0x40,0x81,0x21,0x06,0x8e,0x18,0x2f,0x72,0xec,0xd5,0xb1, 0x83,0x47,0x0f,0x1f,0x0d,0x02,0x03,0x08,0xa0,0xe0,0x07,0x90,0x20,0x42,0x86,0x10, 0x29,0x92,0xc2,0x08,0x0a,0x17,0x47,0x90,0xc4,0x48,0xa2,0xa4,0x82,0x8e,0x25,0x4c, 0x9a,0x38,0x79,0xb2,0xc0,0x25,0xc1,0x00,0x3f,0x7e,0x40,0xb1,0x11,0x45,0xca,0x14, 0x2a,0x34,0x5a,0x00,0xa9,0x62,0xe5,0x0a,0x16,0x25,0x59,0x14,0x34,0xd1,0xb2,0x85, 0x4b,0x13,0x1e,0x0b,0xba,0xa0,0x55,0xfb,0xc3,0x8b,0x97,0x2f,0x52,0xc0,0x84,0x11, 0xa3,0x62,0x0c,0x10,0x2f,0x59,0xc8,0xfe,0x28,0x29,0x13,0x62,0x06,0x13,0x33,0x67, 0xd0,0x68,0xd9,0x21,0xd3,0xf6,0xe6,0x34,0x5e,0xd4,0x78,0x59,0xc3,0xa6,0x8d,0x9b, 0x37,0x35,0xbe,0x5b,0xff,0x01,0x07,0x08,0x90,0x19,0x71,0x98,0x21,0xc7,0x1c,0x74, 0xd4,0x41,0x41,0x01,0x76,0x4c,0x15,0xc0,0x1d,0x5e,0xe0,0x81,0x47,0x1e,0x7a,0x7c, 0x61,0x43,0x10,0x77,0x38,0x98,0x87,0x75,0x7b,0x78,0x91,0x1b,0x13,0x7c,0xf4,0xe1, 0x07,0x13,0x25,0xa1,0xf4,0x53,0x00,0xd6,0x39,0xf8,0x07,0x1e,0x80,0x04,0x92,0x22, 0x20,0x78,0x9c,0x88,0xc7,0x7e,0x50,0xf8,0x57,0x47,0x1c,0x82,0x1c,0x30,0xc8,0x58, 0x06,0x10,0xe2,0x90,0x17,0x79,0xa0,0x08,0x48,0x21,0x85,0x18,0x52,0xc8,0x21,0x3f, 0x02,0xc2,0xe2,0x85,0x78,0xec,0x01,0x85,0x67,0x88,0xb4,0x90,0x48,0x22,0x03,0x94, 0x94,0x60,0x00,0x0e,0xa6,0x58,0x88,0x22,0x8b,0x30,0xd2,0x88,0x23,0x44,0x16,0xf2, 0x08,0x8b,0x2f,0x6a,0xf8,0x83,0x02,0x90,0x44,0x22,0xc9,0x24,0x94,0xec,0x34,0xa5, 0x8f,0x87,0x18,0xd0,0xc8,0x40,0x95,0x38,0x22,0x24,0x91,0x47,0x5a,0x07,0x84,0x25, 0x97,0x60,0x72,0x89,0x25,0x93,0x44,0xa9,0x80,0x43,0x56,0x16,0xa2,0x59,0x23,0x99, 0x08,0xe9,0x25,0x98,0x5e,0x5c,0xa2,0xc9,0x26,0x9c,0x74,0xe2,0x09,0x24,0x3b,0x15, 0x00,0xe8,0x21,0x41,0x6a,0xc6,0x88,0x22,0x85,0x0a,0xca,0x88,0x21,0x0e,0x7e,0x02, 0x4a,0x28,0xa2,0x8c,0x42,0xca,0x25,0xa5,0xb0,0xe4,0x10,0x91,0x99,0x64,0x62,0xa9, 0x29,0xa7,0xa8,0x2a,0x10,0x2a,0xae,0x87,0x78,0xf1,0x49,0x2a,0xaa,0xac,0xc2,0x8a, 0x27,0xad,0x94,0x60,0xc0,0x4f,0x8b,0x38,0xe2,0x4a,0x26,0xa7,0x04,0x16,0x80,0x01, 0x8e,0x04,0x4b,0xd0,0x2b,0x2f,0xc2,0x12,0x8b,0x2c,0xb3,0x90,0x52,0xd4,0xae,0x02, 0xd1,0x52,0x48,0xaa,0xc2,0x16,0x6b,0xec,0x40,0xaf,0xc4,0xfa,0xc3,0x27,0xb5,0xa4, 0xa1,0x80,0x2d,0x26,0x4d,0x55,0xc9,0x2d,0x99,0xe0,0x02,0xed,0x66,0xb7,0x38,0x92, 0x8b,0x66,0x00,0xa0,0xb2,0x1f,0x1c,0x21,0x84,0x30,0x94,0x2e,0x68,0xed,0x82,0x4b, 0xaa,0xbb,0x0e,0xab,0x2e,0xbb,0x00,0x30,0x52,0x08,0x7f,0x33,0xcc,0x60,0x0b,0x2f, 0xe7,0x0a,0xd4,0xcb,0x2d,0xa7,0x9c,0xe2,0x88,0x23,0xbe,0x38,0x92,0x2e,0xbf,0x00, 0xbc,0x02,0x48,0x6e,0xf1,0x2a,0x90,0x60,0x41,0xbf,0x00,0x73,0x8a,0x29,0xc5,0x16, 0x0b,0xb1,0x40,0xc1,0x00,0x12,0xf0,0x9f,0xfc,0x0a,0x93,0xee,0x29,0x8a,0x24,0xfc, 0xb1,0x40,0x11,0x25,0x84,0xca,0x30,0x08,0x5f,0x0b,0x12,0x43,0xbd,0x10,0xb3,0xf2, 0xcc,0x38,0x4b,0x14,0x10,0x00,0x3b }; /* created by reswrap from file information.gif */ extern const unsigned char information[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x20,0x00,0x20,0x00,0xa5,0x00,0x00,0xf8,0x00,0x00, 0xc8,0xc8,0xc8,0xc0,0xc0,0xc0,0xa8,0xc0,0xc8,0xc0,0xb8,0xa8,0xa8,0xa4,0x98,0x90, 0x94,0x90,0x38,0x50,0x60,0xf8,0xf8,0xf8,0xf0,0xf0,0xe8,0xe0,0xe0,0xe0,0xd8,0xd8, 0xd8,0x88,0x8c,0x88,0x50,0x50,0x48,0x78,0x74,0x68,0x38,0x38,0x38,0x08,0x38,0x60, 0x00,0x40,0x68,0x10,0x40,0x58,0xe0,0xe8,0xe8,0xc8,0xd4,0xd8,0x98,0xb8,0xc8,0x80, 0xa0,0xb0,0xb8,0xcc,0xd8,0x60,0x90,0xa8,0x48,0x84,0xa0,0x28,0x74,0x98,0x08,0x1c, 0x30,0x10,0x68,0x98,0x08,0x64,0x90,0x10,0x5c,0x88,0x00,0x38,0x68,0xd8,0xd8,0xc8, 0x08,0x58,0x90,0x08,0x58,0x88,0x10,0x58,0x88,0x18,0x48,0x70,0xd0,0xc8,0xb8,0xb8, 0xb0,0x98,0x08,0x50,0x80,0xb8,0xb0,0xa8,0x08,0x48,0x70,0xe8,0xe8,0xe0,0xe0,0xd8, 0xc8,0xa0,0xa0,0x90,0xe8,0xe0,0xd0,0x18,0x50,0x78,0xb8,0xa8,0x88,0x00,0x30,0x58, 0x00,0x00,0x08,0x00,0x2c,0x50,0xe0,0xd4,0xc0,0xa0,0x98,0x90,0xe8,0xd8,0xc0,0xe8, 0xe0,0xc8,0x00,0x24,0x40,0xe0,0xd0,0xb0,0xe8,0xd8,0xb8,0xe0,0xcc,0xa8,0xb8,0xa0, 0x78,0xe8,0xd0,0xb8,0x30,0x30,0x30,0xe0,0xc8,0xa0,0xd8,0xd0,0xc0,0x2c,0x00,0x00, 0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x06,0xfe,0x40,0x80,0x70,0x48,0x2c,0x1a,0x8f, 0x48,0x63,0x40,0x10,0x58,0x3a,0x03,0x03,0x42,0xc1,0x70,0x48,0x26,0x03,0x88,0xac, 0x56,0x9b,0x50,0x2c,0x0e,0x0c,0xeb,0x11,0xbb,0x2d,0x77,0x1b,0x82,0xb0,0x98,0x28, 0x28,0xbb,0x13,0x0d,0x44,0xc0,0xb1,0x7e,0x40,0x22,0x12,0x7c,0x64,0xe2,0xce,0xc6, 0x11,0x69,0x56,0x12,0x10,0x03,0x01,0x14,0x14,0x15,0x16,0x10,0x12,0x09,0x6e,0x0e, 0x0b,0x59,0x01,0x6a,0x45,0x07,0x11,0x02,0x0b,0x87,0x17,0x17,0x03,0x89,0x18,0x7b, 0x65,0x0e,0x02,0x0a,0x59,0x81,0x45,0x12,0x14,0x13,0x14,0x9c,0x16,0x19,0x19,0x1a, 0xad,0x1a,0x12,0x0a,0x8d,0x59,0x0e,0x0d,0xb7,0x07,0x0f,0x0f,0x1b,0x44,0x12,0x04, 0x13,0x9b,0xac,0x59,0x1c,0x1d,0x1c,0x1c,0x1a,0x1e,0x1f,0xb3,0x5a,0x20,0x14,0x52, 0x0e,0xb6,0x43,0x11,0x16,0x14,0x17,0x16,0x18,0x1a,0x5b,0x21,0x21,0x22,0x1e,0x23, 0x24,0x11,0xcb,0x59,0x0a,0x20,0x25,0x26,0x05,0x74,0x00,0x0f,0x12,0x15,0x17,0x15, 0xd8,0x1a,0x1c,0x59,0xdb,0x22,0x22,0xdb,0x27,0x24,0x03,0xa3,0x59,0x5d,0x0b,0x25, 0x28,0xe9,0x20,0x60,0x08,0xa6,0x41,0x43,0x87,0x83,0xf4,0xb6,0x8d,0x08,0x91,0x22, 0x05,0x89,0x00,0x13,0x1a,0x25,0x50,0xb1,0x82,0x42,0x09,0x16,0x42,0x3e,0x58,0x18, 0x70,0x2d,0xde,0x41,0x0f,0xf4,0x16,0xde,0x8b,0x00,0x81,0xc0,0x82,0x04,0x13,0x55, 0xb4,0x58,0x01,0x02,0x23,0x00,0x08,0x16,0xde,0x65,0x20,0x56,0x06,0x64,0x08,0x90, 0x2e,0x3e,0x40,0x28,0x20,0x0a,0xa5,0xfe,0xca,0x16,0x20,0x5e,0x08,0x11,0xf8,0xce, 0x63,0x07,0x0f,0x5a,0x3c,0xd8,0x14,0x91,0x02,0x02,0x8c,0x02,0x04,0x56,0xa8,0xf8, 0x09,0xb4,0x40,0x46,0x0c,0xac,0x0c,0x6e,0x0b,0xa1,0xc5,0xde,0x4d,0xa6,0x30,0x9e, 0xa2,0x00,0x31,0xb5,0xc5,0xca,0xa0,0x42,0x62,0x68,0x60,0x05,0xd2,0x1e,0xd2,0x2c, 0x0b,0xed,0x9d,0x88,0x00,0x43,0x46,0x01,0x14,0x14,0xa8,0xae,0x98,0x21,0x14,0x40, 0x0c,0x12,0x18,0x32,0xb4,0xad,0xa7,0xe5,0x84,0x61,0x17,0x4d,0x65,0x48,0xa0,0x81, 0xd7,0xac,0xd9,0x1a,0x35,0xfa,0x3e,0x88,0x71,0x00,0x59,0xbd,0x13,0x6f,0x11,0x9c, 0x48,0x81,0x38,0x82,0x8c,0x0d,0x34,0x68,0x98,0xa0,0x60,0xd6,0x86,0x8d,0x1a,0x7c, 0x87,0xc4,0x80,0xe0,0xa2,0x75,0x8a,0x3e,0x24,0x24,0xc0,0xb8,0x71,0xc0,0x00,0x0b, 0x02,0x33,0x5a,0x98,0x86,0x8c,0xa3,0xaf,0xba,0x18,0x30,0x1a,0x92,0x68,0x4d,0x9c, 0x84,0xf1,0x1b,0x1b,0x62,0x18,0xa0,0x51,0xa0,0xc4,0x8a,0xdd,0x35,0x72,0xe8,0xd8, 0x41,0x64,0xb2,0x8c,0x3b,0x1f,0x3e,0x48,0x18,0x54,0xf7,0xb3,0x72,0x1a,0x2c,0x50, 0x38,0x3f,0x1d,0x9d,0xc7,0xf4,0x22,0x3d,0x62,0xdc,0x90,0x11,0x56,0x86,0x7b,0xe4, 0xc9,0x69,0xd8,0x36,0x51,0x62,0x06,0xe4,0xe8,0x38,0x70,0x9c,0x37,0x12,0xa3,0xff, 0x8d,0xff,0xc9,0xf5,0xc7,0xc0,0x7c,0xf5,0xad,0x10,0x5d,0x0e,0xe6,0xe9,0xb0,0x9f, 0x11,0x01,0xf6,0xa7,0x9e,0x01,0x0c,0x80,0x47,0xdf,0x0c,0xa7,0xe5,0x90,0x43,0x7e, 0x3a,0xe0,0xe0,0x03,0x75,0x56,0x4e,0x30,0x50,0x40,0x68,0xe0,0xdd,0x55,0x1f,0x64, 0x16,0xf2,0xa0,0x9f,0x0e,0x3e,0x6c,0x28,0x86,0x01,0x28,0xa0,0x50,0x80,0x09,0x28, 0x10,0x50,0xc2,0x7d,0x08,0x9e,0xa8,0x61,0x8a,0x1c,0x26,0x41,0x40,0x33,0x3f,0x50, 0x30,0x03,0x08,0x34,0x5e,0xa8,0x5f,0x8a,0x44,0xa6,0xa3,0x23,0x01,0x48,0x9a,0xa0, 0xa4,0x92,0x2f,0xbc,0xb0,0x83,0x93,0x3b,0x44,0xb9,0x03,0x34,0x46,0xae,0x61,0xe5, 0x95,0x58,0x22,0x11,0x04,0x00,0x3b }; /* created by reswrap from file bigcalc.gif */ extern const unsigned char bigcalc[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x1f,0x00,0x15,0x00,0xe3,0x00,0x00,0xb0,0xc0,0xd8, 0x98,0x8c,0x88,0xf8,0xfc,0xf8,0xf8,0xfc,0x00,0xe0,0x88,0x28,0x00,0x00,0x00,0xe0, 0xb4,0x30,0xc0,0xc0,0xc0,0xd0,0xfc,0xc8,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x1f,0x00,0x15,0x00,0x00,0x04,0xa8,0x10,0x84,0x49,0xab,0xbd,0x38,0x48, 0x31,0xb8,0xef,0xe0,0x27,0x86,0x20,0x51,0x04,0x83,0xa1,0xae,0x6c,0xe1,0xbe,0x70, 0xac,0x9a,0x81,0xa0,0x0a,0x38,0x5e,0xa8,0xc5,0xe1,0xff,0x40,0xe0,0xec,0x94,0x32, 0x08,0x80,0x3b,0x43,0x01,0xc1,0x6c,0x3a,0x9b,0x87,0x61,0x8d,0x27,0x53,0x06,0xaf, 0x3f,0x69,0x91,0xc5,0xed,0x7a,0x57,0x34,0x9b,0x51,0xb0,0xd3,0x8d,0xcb,0xe4,0xb3, 0x21,0x91,0x48,0xd2,0x8a,0xc7,0xf2,0x41,0x4e,0x37,0xce,0xd7,0x77,0x43,0x98,0xba, 0x7b,0x29,0x5d,0x7f,0x7d,0x80,0x7e,0x7a,0x44,0x5f,0x87,0x88,0x7b,0x6a,0x66,0x8c, 0x69,0x8d,0x6e,0x86,0x76,0x75,0x71,0x92,0x95,0x94,0x85,0x53,0x81,0x9a,0x7e,0x9c, 0x83,0x80,0x98,0x5b,0x88,0xa2,0x60,0x27,0x62,0x8f,0x8b,0x8e,0x39,0x66,0xa0,0x37, 0x77,0x94,0xaf,0xae,0x41,0x90,0x99,0x9d,0x82,0xb6,0x81,0x30,0x5a,0xa3,0xbb,0x52, 0x01,0x04,0xbf,0xc0,0xc1,0xc2,0xc3,0xc4,0x05,0x00,0x31,0xc8,0xc9,0xca,0x2f,0x00, 0x11,0x00,0x3b }; /* created by reswrap from file constmem.bmp */ extern const unsigned char constmem[]={ 0x42,0x4d,0x36,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x55,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00, 0x00,0x00,0x00,0x0c,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf6,0xfa,0xf6, 0xb8,0xbb,0xb8,0xf3,0xf7,0xf3,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0x00,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xd2,0xd6,0xd2, 0x41,0x43,0x41,0x8d,0x90,0x8d,0xf3,0xf7,0xf3,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0x00,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xc1,0xc4,0xc1,0x8d,0x8f,0x8d,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0x00,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xdc,0xdf,0xdc,0x65, 0x67,0x65,0x7e,0x80,0x7e,0x6d,0x6e,0x6d,0x4a,0x4b,0x4a,0xe7,0xea,0xe7,0xb8,0xbc, 0xb8,0x6b,0x6d,0x6b,0x5e,0x60,0x5e,0xa1,0xa3,0xa1,0xf8,0xfc,0xf8,0xd7,0xdb,0xd7, 0x6c,0x6d,0x6c,0xf8,0xfc,0xf8,0xe9,0xed,0xe9,0x3e,0x3f,0x3e,0xa4,0xa7,0xa4,0xe1, 0xe5,0xe1,0x53,0x54,0x53,0x7e,0x80,0x7e,0x8e,0x90,0x8e,0xf8,0xfc,0xf8,0x84,0x86, 0x84,0x70,0x72,0x70,0xd2,0xd6,0xd2,0x9f,0xa1,0x9f,0x5e,0x60,0x5e,0xad,0xb0,0xad, 0xae,0xb0,0xae,0x5f,0x61,0x5f,0xd7,0xda,0xd7,0x8e,0x90,0x8e,0xb6,0xb8,0xb6,0xf8, 0xfc,0xf8,0xa8,0xab,0xa8,0x60,0x62,0x60,0xc3,0xc6,0xc3,0xf8,0xfc,0xf8,0x3f,0x40, 0x3f,0x96,0x98,0x96,0xf2,0xf6,0xf2,0xf8,0xfc,0xf8,0xe7,0xeb,0xe7,0x85,0x88,0x85, 0x68,0x69,0x68,0xea,0xee,0xea,0xbf,0xc2,0xbf,0xc5,0xc8,0xc5,0xe5,0xe9,0xe5,0x94, 0x97,0x94,0x32,0x33,0x32,0xc2,0xc5,0xc2,0xec,0xf0,0xec,0x53,0x54,0x53,0x74,0x76, 0x74,0x9b,0x9d,0x9b,0xe5,0xe9,0xe5,0xc4,0xc7,0xc4,0x70,0x71,0x70,0xf8,0xfc,0xf8, 0xe1,0xe5,0xe1,0x67,0x69,0x67,0xf8,0xfc,0xf8,0xe4,0xe8,0xe4,0x3f,0x40,0x3f,0xa9, 0xac,0xa9,0xf8,0xfc,0xf8,0xa9,0xac,0xa9,0x6d,0x6f,0x6d,0x5c,0x5e,0x5c,0xb0,0xb3, 0xb0,0xf8,0xfc,0xf8,0xbe,0xc1,0xbe,0xb8,0xbb,0xb8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xc1,0xc4,0xc1,0x0e,0x0e,0x0e,0xdf,0xe3,0xdf,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0x00,0xf8,0xfc,0xf8,0xf6,0xfa,0xf6,0x2a,0x2b,0x2a,0xd6, 0xd9,0xd6,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xcb,0xce,0xcb,0xa4,0xa7,0xa4,0x3b,0x3c, 0x3b,0xc7,0xca,0xc7,0xf5,0xf9,0xf5,0x3d,0x3f,0x3d,0xa7,0xaa,0xa7,0xef,0xf3,0xef, 0x26,0x27,0x26,0xea,0xed,0xea,0xf3,0xf7,0xf3,0x28,0x29,0x28,0xbb,0xbe,0xbb,0xd0, 0xd4,0xd0,0xa9,0xab,0xa9,0xec,0xf0,0xec,0x18,0x19,0x18,0xdf,0xe3,0xdf,0x7c,0x7e, 0x7c,0x8a,0x8d,0x8a,0xb6,0xb9,0xb6,0x54,0x55,0x54,0xa5,0xa8,0xa5,0xdb,0xdf,0xdb, 0x60,0x62,0x60,0x65,0x66,0x65,0xc5,0xc8,0xc5,0xad,0xaf,0xad,0x5a,0x5c,0x5a,0xf8, 0xfc,0xf8,0xb7,0xba,0xb7,0x4f,0x51,0x4f,0xc0,0xc3,0xc0,0xf8,0xfc,0xf8,0x27,0x28, 0x27,0xd5,0xd9,0xd5,0xc0,0xc3,0xc0,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xd9,0xdc,0xd9, 0x81,0x83,0x81,0xf8,0xfc,0xf8,0x7c,0x7f,0x7c,0x32,0x33,0x32,0xf2,0xf6,0xf2,0xeb, 0xef,0xeb,0x12,0x12,0x12,0xf3,0xf7,0xf3,0xa8,0xaa,0xa8,0x46,0x47,0x46,0xf8,0xfc, 0xf8,0xe4,0xe8,0xe4,0xb0,0xb3,0xb0,0xed,0xf1,0xed,0x26,0x27,0x26,0xeb,0xef,0xeb, 0xf8,0xfc,0xf8,0x32,0x33,0x32,0xdf,0xe3,0xdf,0xf2,0xf6,0xf2,0x22,0x23,0x22,0xc5, 0xc8,0xc5,0xdc,0xe0,0xdc,0x20,0x21,0x20,0xe2,0xe5,0xe2,0xf0,0xf4,0xf0,0x2b,0x2c, 0x2b,0xbe,0xc1,0xbe,0xcc,0xd0,0xcc,0x36,0x37,0x36,0xf6,0xfa,0xf6,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xc1,0xc4,0xc1,0x37,0x38,0x37,0x95,0x98,0x95,0xf7,0xfb,0xf7,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0x00,0xf8,0xfc,0xf8,0xbf,0xc3,0xbf,0x41,0x43,0x41,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xef,0xf3,0xef,0x39,0x39, 0x39,0xb0,0xb3,0xb0,0xf8,0xfc,0xf8,0xa6,0xa9,0xa6,0x39,0x3a,0x39,0xf8,0xfc,0xf8, 0x4e,0x4f,0x4e,0xa2,0xa4,0xa2,0xf8,0xfc,0xf8,0x60,0x62,0x60,0x97,0x9a,0x97,0xf8, 0xfc,0xf8,0xf4,0xf8,0xf4,0x62,0x64,0x62,0x3a,0x3b,0x3a,0xf3,0xf7,0xf3,0xca,0xce, 0xca,0x4c,0x4d,0x4c,0xf8,0xfc,0xf8,0x8f,0x92,0x8f,0x59,0x5a,0x59,0xf8,0xfc,0xf8, 0x9a,0x9d,0x9a,0x1d,0x1d,0x1d,0xf2,0xf6,0xf2,0xe4,0xe8,0xe4,0x1a,0x1b,0x1a,0xe9, 0xed,0xe9,0xf0,0xf4,0xf0,0x15,0x16,0x15,0xea,0xee,0xea,0xf8,0xfc,0xf8,0x75,0x77, 0x75,0xa1,0xa3,0xa1,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf5,0xf9,0xf5, 0x6f,0x70,0x6f,0xf8,0xfc,0xf8,0x4d,0x4e,0x4d,0x9b,0x9e,0x9b,0x8b,0x8d,0x8b,0xf8, 0xfc,0xf8,0x36,0x37,0x36,0xc1,0xc4,0xc1,0xbe,0xc1,0xbe,0x12,0x12,0x12,0x8d,0x8f, 0x8d,0x9d,0x9f,0x9d,0xeb,0xef,0xeb,0xf8,0xfc,0xf8,0x49,0x4a,0x49,0xa7,0xaa,0xa7, 0xf8,0xfc,0xf8,0x64,0x66,0x64,0x6e,0x6f,0x6e,0xf8,0xfc,0xf8,0x6f,0x71,0x6f,0xa1, 0xa3,0xa1,0xf8,0xfc,0xf8,0x1e,0x1e,0x1e,0xcb,0xce,0xcb,0xf8,0xfc,0xf8,0x8c,0x8e, 0x8c,0x54,0x55,0x54,0xf8,0xfc,0xf8,0x15,0x15,0x15,0xd3,0xd7,0xd3,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xc1,0xc4,0xc1,0x4d,0x4f,0x4d,0xad,0xb0,0xad,0xc6,0xc9,0xc6,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0x00,0xf8,0xfc,0xf8,0xb7,0xba,0xb7,0x38,0x3a,0x38,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0x8f,0x92, 0x8f,0x59,0x5b,0x59,0xf8,0xfc,0xf8,0xe6,0xea,0xe6,0x12,0x13,0x12,0xf8,0xfc,0xf8, 0x8d,0x8f,0x8d,0x3c,0x3d,0x3c,0xe0,0xe3,0xe0,0xb7,0xba,0xb7,0x50,0x51,0x50,0xf8, 0xfc,0xf8,0x7c,0x7d,0x7c,0x4b,0x4c,0x4b,0xec,0xf0,0xec,0xf8,0xfc,0xf8,0xf3,0xf7, 0xf3,0x2d,0x2d,0x2d,0xee,0xf2,0xee,0xe8,0xec,0xe8,0x32,0x33,0x32,0xc5,0xc9,0xc5, 0xf2,0xf6,0xf2,0x26,0x26,0x26,0xc1,0xc4,0xc1,0xf8,0xfc,0xf8,0x32,0x33,0x32,0x80, 0x82,0x80,0xf6,0xfa,0xf6,0x5d,0x5e,0x5d,0xaa,0xad,0xaa,0xf8,0xfc,0xf8,0xb4,0xb7, 0xb4,0x61,0x63,0x61,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0x6d,0x6e,0x6d,0xf4,0xf8,0xf4,0x23,0x24,0x23,0xd7,0xda,0xd7,0xb3,0xb6,0xb3,0xc0, 0xc3,0xc0,0x75,0x77,0x75,0x8b,0x8e,0x8b,0xf1,0xf5,0xf1,0x2b,0x2b,0x2b,0xd4,0xd7, 0xd4,0xbe,0xc1,0xbe,0x32,0x32,0x32,0xe9,0xec,0xe9,0x88,0x8a,0x88,0x3f,0x40,0x3f, 0xe2,0xe5,0xe2,0xa3,0xa6,0xa3,0x1a,0x1b,0x1a,0xc4,0xc7,0xc4,0xae,0xb1,0xae,0x59, 0x5b,0x59,0xf8,0xfc,0xf8,0x74,0x77,0x74,0x74,0x76,0x74,0xf8,0xfc,0xf8,0xcb,0xcf, 0xcb,0x2d,0x2e,0x2d,0xf8,0xfc,0xf8,0x54,0x56,0x54,0x7d,0x7f,0x7d,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xa8,0xab,0xa8,0x75,0x77,0x75,0xf8,0xfc,0xf8,0x56,0x57,0x56,0xf6, 0xfa,0xf6,0xf8,0xfc,0xf8,0x00,0xf8,0xfc,0xf8,0xef,0xf3,0xef,0x0b,0x0c,0x0b,0xe0, 0xe3,0xe0,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf3,0xf7, 0xf3,0x5f,0x61,0x5f,0x74,0x75,0x74,0x7b,0x7d,0x7b,0x65,0x66,0x65,0xef,0xf3,0xef, 0x70,0x72,0x70,0x29,0x2a,0x29,0xa4,0xa7,0xa4,0x89,0x8c,0x89,0x25,0x26,0x25,0xf8, 0xfc,0xf8,0xa4,0xa6,0xa4,0x6a,0x6c,0x6a,0x64,0x65,0x64,0x83,0x86,0x83,0xd0,0xd3, 0xd0,0x2d,0x2d,0x2d,0x84,0x86,0x84,0xbc,0xbf,0xbc,0xe2,0xe6,0xe2,0x65,0x66,0x65, 0x82,0x84,0x82,0x3d,0x3e,0x3d,0x96,0x98,0x96,0xca,0xcd,0xca,0x3a,0x3b,0x3a,0x6e, 0x70,0x6e,0x9b,0x9e,0x9b,0x4e,0x50,0x4e,0x7f,0x82,0x7f,0xf8,0xfc,0xf8,0xa7,0xa9, 0xa7,0x24,0x25,0x24,0x92,0x95,0x92,0xdf,0xe2,0xdf,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0x9f,0xa2,0x9f,0xc1,0xc4,0xc1,0x13,0x13,0x13,0xf8,0xfc,0xf8,0xf6,0xfa,0xf6,0x85, 0x87,0x85,0xad,0xaf,0xad,0x54,0x55,0x54,0xf8,0xfc,0xf8,0xd0,0xd3,0xd0,0x51,0x53, 0x51,0x88,0x8a,0x88,0x2a,0x2b,0x2a,0xd6,0xda,0xd6,0x6d,0x6f,0x6d,0x2e,0x2e,0x2e, 0xa2,0xa5,0xa2,0x87,0x89,0x87,0x26,0x27,0x26,0x8b,0x8e,0x8b,0x7b,0x7c,0x7b,0x2e, 0x2f,0x2e,0xf8,0xfc,0xf8,0xea,0xed,0xea,0x55,0x56,0x55,0x7c,0x7e,0x7c,0x70,0x72, 0x70,0x7b,0x7d,0x7b,0xf0,0xf4,0xf0,0x63,0x65,0x63,0x41,0x42,0x41,0x5e,0x60,0x5e, 0x72,0x74,0x72,0x62,0x65,0x62,0x7f,0x81,0x7f,0xf8,0xfc,0xf8,0x41,0x43,0x41,0xcc, 0xcf,0xcc,0xf8,0xfc,0xf8,0x00,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0x6f,0x70,0x6f,0x89, 0x8b,0x89,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xcc,0xcf,0xcc,0xee,0xf2, 0xee,0xf8,0xfc,0xf8,0xe7,0xeb,0xe7,0xe5,0xe8,0xe5,0xf8,0xfc,0xf8,0xf6,0xfa,0xf6, 0xe3,0xe7,0xe3,0xb8,0xbb,0xb8,0xf8,0xfc,0xf8,0xeb,0xef,0xeb,0xeb,0xee,0xeb,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xeb,0xef,0xeb,0xe3,0xe7,0xe3,0xf5,0xf9,0xf5,0xf0,0xf3, 0xf0,0x84,0x86,0x84,0x7a,0x7c,0x7a,0xec,0xef,0xec,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xe5,0xe8,0xe5,0xe3,0xe7,0xe3,0xf6,0xfa,0xf6,0xee,0xf2,0xee,0xd7,0xda,0xd7,0xcb, 0xcf,0xcb,0xf8,0xfc,0xf8,0xe4,0xe8,0xe4,0xf2,0xf6,0xf2,0xf8,0xfc,0xf8,0xe9,0xec, 0xe9,0x36,0x37,0x36,0xc8,0xcb,0xc8,0xf3,0xf6,0xf3,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xcd,0xd1,0xcd,0x51,0x52,0x51,0x47,0x48,0x47,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xea, 0xee,0xea,0x6e,0x70,0x6e,0x15,0x15,0x15,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf6,0xfa, 0xf6,0xe3,0xe7,0xe3,0xea,0xee,0xea,0xf5,0xf9,0xf5,0xe3,0xe7,0xe3,0xb8,0xbb,0xb8, 0xf8,0xfc,0xf8,0xeb,0xef,0xeb,0xeb,0xef,0xeb,0xf8,0xfc,0xf8,0xe5,0xe9,0xe5,0xeb, 0xef,0xeb,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xe5,0xe9,0xe5,0xe7,0xeb, 0xe7,0xf8,0xfc,0xf8,0xf4,0xf8,0xf4,0xd7,0xdb,0xd7,0xcb,0xce,0xcb,0xee,0xf2,0xee, 0xed,0xf0,0xed,0xee,0xf2,0xee,0xf2,0xf6,0xf2,0xf8,0xfc,0xf8,0xe9,0xec,0xe9,0xf2, 0xf6,0xf2,0xf8,0xfc,0xf8,0x00,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf2,0xf6,0xf2,0x61, 0x63,0x61,0x6d,0x6f,0x6d,0xc5,0xc8,0xc5,0xc2,0xc5,0xc2,0x42,0x42,0x42,0xc5,0xc9, 0xc5,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf5,0xf9,0xf5,0xc1,0xc4,0xc1,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xe1,0xe5,0xe1,0xd5,0xd8,0xd5,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xd7,0xdb,0xd7,0x03,0x03,0x03,0x80,0x82,0x80,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xa4,0xa6,0xa4,0x0c,0x0c,0x0c,0xa4,0xa6,0xa4,0xef,0xf2,0xef,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0x00,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf7, 0xfb,0xf7,0xdc,0xe0,0xdc,0xb1,0xb4,0xb1,0xb1,0xb4,0xb1,0xd1,0xd5,0xd1,0xf5,0xf9, 0xf5,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xc3,0xc6,0xc3,0xb1,0xb4,0xb1,0xd6,0xda,0xd6,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf7,0xfb,0xf7,0xbc,0xbf,0xbc,0xc4,0xc7,0xc4,0xf6,0xfa,0xf6,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0x00,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc, 0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8, 0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8,0xfc,0xf8,0xf8, 0xfc,0xf8,0xf8,0xfc,0xf8,0x00 }; /* created by reswrap from file question.gif */ extern const unsigned char question[]={ 0x47,0x49,0x46,0x38,0x39,0x61,0x10,0x00,0x10,0x00,0xf4,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xa6,0xbf,0xa2,0xf0,0xf4,0xef,0xeb,0xf1,0xea,0xe1,0xe9,0xe0,0xcb, 0xda,0xc9,0xf3,0xf6,0xf3,0xd2,0xdf,0xd0,0xc3,0xd4,0xc1,0xac,0xc3,0xa8,0xbc,0xcf, 0xb8,0x2b,0x2b,0x2b,0xe6,0xed,0xe4,0x21,0x2e,0x1f,0x65,0x8b,0x5e,0x8c,0xad,0x86, 0x96,0xb4,0x91,0xb8,0xcc,0xb5,0x8d,0xad,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0xf9,0x04, 0x01,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x05, 0x46,0x20,0x20,0x8a,0x41,0x59,0x8e,0xe8,0x18,0x08,0x03,0x51,0x18,0x41,0xaa,0x1a, 0xc7,0x50,0xdc,0x48,0x9c,0x06,0xc9,0xa0,0x98,0x8b,0x82,0x82,0x21,0x0b,0x34,0x1c, 0xaa,0x9b,0x6e,0x87,0x0a,0x08,0x97,0x32,0xd2,0xed,0x01,0x2d,0xde,0x20,0xd5,0xdd, 0x35,0xdb,0x8c,0x14,0xb0,0xd1,0x66,0x21,0xc2,0xdd,0x99,0xc2,0x66,0xb4,0x58,0x52, 0x6e,0x4a,0x26,0xed,0x66,0x39,0x04,0x00,0x3b }; /* created by reswrap from file tinycalc.gif */ extern const unsigned char tinycalc[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0x00,0x80,0x80, 0xf8,0xfc,0xf8,0xf8,0xfc,0x00,0xe0,0xb4,0x30,0x00,0x00,0x00,0xe0,0x88,0x28,0xd0, 0xfc,0xc8,0xc0,0xc0,0xc0,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x42,0x08,0xba,0xdc,0xfe,0x30,0xb2,0x20,0xa8,0xad,0x38,0x2c,0x31,0x3a,0xf9,0xe0, 0x37,0x14,0x04,0x10,0x74,0x03,0x61,0xac,0xec,0x31,0x96,0x9c,0x77,0xcc,0xb4,0x4b, 0x9a,0x68,0xae,0xdf,0x1c,0x11,0xf8,0xc0,0xdf,0xef,0x76,0xd2,0x19,0x79,0x29,0x61, 0x30,0x70,0x20,0x10,0x8d,0xc7,0x12,0xa0,0x40,0xad,0x5a,0xab,0xa5,0x90,0x56,0x2b, 0xe9,0x7a,0x13,0x00,0x3b }; fox1.6-1.6.57/calculator/icons.h000066400000000000000000000010721326741342000162520ustar00rootroot00000000000000/* Generated by reswrap version 4.0.0 */ /* created by reswrap from file colors.gif */ extern const unsigned char colors[]; /* created by reswrap from file information.gif */ extern const unsigned char information[]; /* created by reswrap from file bigcalc.gif */ extern const unsigned char bigcalc[]; /* created by reswrap from file constmem.bmp */ extern const unsigned char constmem[]; /* created by reswrap from file question.gif */ extern const unsigned char question[]; /* created by reswrap from file tinycalc.gif */ extern const unsigned char tinycalc[]; fox1.6-1.6.57/calculator/information.gif000066400000000000000000000014471326741342000200100ustar00rootroot00000000000000GIF87a ĄřČČČŔŔŔ¨ŔČŔ¸¨¨¤”8P`řřřđđčŕŕŕŘŘŘŚPPHxth8888`@h@XŕččČÔظȀ °¸ĚŘ`¨H„ (t0hd\8hŘŘČXXXHpĐȸ¸°P€¸°¨HpččŕŕŘČ  čŕĐPx¸¨0X,PŕÔŔ čŘŔčŕČ$@ŕаčظŕ̨¸ xčи000ŕČ ŘĐŔ, ţ@€pH,ŹHc@X:BÁpH&¬V›P, ë»-w‚°((» DŔ±~@"|dâÎĆiV n YjE ‡‰{e YEś­ ŤY ·D›¬YłZ R¶C[!!"#$ËY %&tŘYŰ""Ű'$ŁY] %(é `¦AC‡ô¶Ť‘"‰%P±‚B B>Xp-ŢAôŢ‹Ŕ‚U´X#Ţe Vd.>@( ĄţĘ ^řÎcZ<Ř‘ŚV¨ř ´@F ¬ n ˇĹŢM¦0ž˘1µĹĘ Bbh`ŇŇ, íťCF¨®!@ 2´­§ĺ„aMeH ×¬Ů5ú>qY˝ośH8‚Ś 4h `Ö†Ť|‡Ä€ŕ˘uŠ>$$Ŕ¸qŔ 3Z†ŚŁŻş0’hMś„ńb Q ÄŠÝ5rčŘAd˛Ś;>HT÷łr,P8?ťÇô"=bÜV†{äÉiŘ6Qbäč8pś7Ł˙Ť˙ÉőÇŔ|ő­]ćé°źö§ž €Gß §ĺC~:ŕŕuVN0P@hŕÝUdň ź>l(†( P€ (PÂ}ž¨aŠ&A@3?P04^¨_ŠD¦Ł#Hš ¤’/Ľ°“;Dą4F®aĺ•X";fox1.6-1.6.57/calculator/main.cpp000066400000000000000000000047511326741342000164250ustar00rootroot00000000000000/******************************************************************************** * * * F O X D e s k t o p C a l c u l a t o r * * * ********************************************************************************* * Copyright (C) 2001,2005 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: main.cpp,v 1.8 2005/01/16 16:06:06 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "fxkeys.h" #include #include #include #include #ifndef WIN32 #include #endif #include #include "Calculator.h" // Start the whole thing int main(int argc,char *argv[]){ // Make application FXApp application("Calculator",FXString::null); // Open display application.init(argc,argv); // Main window Calculator* calculator=new Calculator(&application); // Handle interrupt to save stuff nicely application.addSignal(SIGINT,calculator,Calculator::ID_CLOSE); // Create app application.create(); // Run return application.run(); } fox1.6-1.6.57/calculator/question.gif000066400000000000000000000003111326741342000173170ustar00rootroot00000000000000GIF89aô˛Ŕܦż˘đôďëńęáéŕËÚÉóöóŇßĐĂÔÁ¬Ă¨ĽĎ¸+++ćíä!.e‹^Ś­†–´‘¸ĚµŤ­!ů,F ŠAYŽčQAŞÇPÜHśÉ ‹‚‚! 4Ş›n‡ —2Ňí-Ţ ŐÝ5ŰŚ°Ńf!ÂÝ™Âf´XRnJ&íf9;fox1.6-1.6.57/calculator/tinycalc.gif000066400000000000000000000001651326741342000172650ustar00rootroot00000000000000GIF87a€€řüřřüŕ´0ŕ(ĐüČŔŔŔ,BşÜţ0˛ ¨­8,1:ůŕ7ta¬ě1–śwĚ´Kšh®ßřŔßďvŇy)a0p ŤÇ @­Z«ĄV+éz;fox1.6-1.6.57/chart/000077500000000000000000000000001326741342000137365ustar00rootroot00000000000000fox1.6-1.6.57/chart/FXChart.cpp000066400000000000000000000304461326741342000157500ustar00rootroot00000000000000/******************************************************************************** * * * C h a r t B a s e W i d g e t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXChart.cpp,v 1.19 2006/01/22 18:01:13 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "FXPNGImage.h" #include "FXJPGImage.h" #include "FXTIFImage.h" #include "FXChart.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXChart) FXChartMap[]={ FXMAPFUNC(SEL_PAINT,0,FXChart::onPaint), FXMAPFUNC(SEL_CLIPBOARD_LOST,0,FXChart::onClipboardLost), FXMAPFUNC(SEL_CLIPBOARD_REQUEST,0,FXChart::onClipboardRequest), FXMAPFUNC(SEL_QUERY_TIP,0,FXChart::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXChart::onQueryHelp), }; // Object implementation FXIMPLEMENT(FXChart,FXComposite,FXChartMap,ARRAYNUMBER(FXChartMap)) /*******************************************************************************/ // Drag types FXDragType FXChart::bmpType=0; FXDragType FXChart::gifType=0; FXDragType FXChart::jpgType=0; FXDragType FXChart::pngType=0; FXDragType FXChart::csvType=0; FXDragType FXChart::tifType=0; /*******************************************************************************/ // Init FXChart::FXChart(){ flags|=FLAG_SHOWN|FLAG_ENABLED|FLAG_DROPTARGET; } // Make a chart FXChart::FXChart(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXComposite(p,opts,x,y,w,h){ chart=new FXImage(getApp(),NULL,IMAGE_DITHER|IMAGE_SHMI|IMAGE_SHMP,w,h); flags|=FLAG_SHOWN|FLAG_ENABLED|FLAG_DROPTARGET; target=tgt; message=sel; fill.style=FILLSTYLE_SOLID; fill.hatch=STIPPLE_NONE; fill.image=NULL; fill.color=FXRGB(103,103,255); fill.backcolor=0; fill.lower=FXRGB(255,255,255); fill.upper=FXRGB(0,0,255); } // Create window; register drag types void FXChart::create(){ FXComposite::create(); chart->create(); if(fill.image) fill.image->create(); if(!colorType) colorType=getApp()->registerDragType(colorTypeName); if(!textType) textType=getApp()->registerDragType(textTypeName); if(!bmpType) bmpType=getApp()->registerDragType(FXBMPImage::mimeType); if(!gifType) gifType=getApp()->registerDragType(FXGIFImage::mimeType); if(!jpgType) jpgType=getApp()->registerDragType(FXJPGImage::mimeType); if(!pngType) pngType=getApp()->registerDragType(FXPNGImage::mimeType); if(!tifType) tifType=getApp()->registerDragType(FXTIFImage::mimeType); if(!csvType) csvType=getApp()->registerDragType("Csv"); } // Detach window; zero out drag types void FXChart::detach(){ FXComposite::detach(); chart->detach(); textType=0; colorType=0; bmpType=0; gifType=0; jpgType=0; pngType=0; csvType=0; tifType=0; } // Marker size is in pixels; x,y are canvas coordinates of the center void FXChart::drawMarker(FXDC& dc,FXint x,FXint y,const Marker& m) const { register FXint s=m.size; register FXint h=s>>1; FXPoint p[5]; dc.setForeground(m.color); switch(m.style){ case MARKER_SQUARE: dc.drawRectangle(x-h,y-h,s,s); break; case MARKER_SQUARE|MARKER_SOLID: dc.fillRectangle(x-h,y-h,s,s); break; case MARKER_CIRCLE: dc.drawArc(x-h,y-h,s,s,0,23040); break; case MARKER_CIRCLE|MARKER_SOLID: dc.fillArc(x-h,y-h,s,s,0,23040); break; case MARKER_DIAMOND: p[0].x=p[2].x=p[4].x=x; p[1].x=x-h; p[3].x=p[1].x+s; p[0].y=p[4].y=y-h; p[1].y=p[3].y=y; p[2].y=p[0].y+s; dc.drawLines(p,5); break; case MARKER_DIAMOND|MARKER_SOLID: p[0].x=p[2].x=x; p[1].x=x-h; p[3].x=p[1].x+s; p[0].y=y-h; p[1].y=p[3].y=y; p[2].y=p[0].y+s; dc.fillPolygon(p,4); break; case MARKER_TRIANGLE_UP: p[0].x=p[3].x=x; p[1].x=x-h; p[2].x=x+h; p[0].y=p[3].y=y-h; p[1].y=p[2].y=y+h; dc.drawLines(p,4); break; case MARKER_TRIANGLE_UP|MARKER_SOLID: p[0].x=x; p[1].x=x-h; p[2].x=x+h; p[0].y=y-h; p[1].y=p[2].y=y+h; dc.fillPolygon(p,3); break; case MARKER_TRIANGLE_DN: p[0].x=p[3].x=x-h; p[1].x=x; p[2].x=x+h; p[0].y=p[2].y=p[3].y=y-h; p[1].y=y+h; dc.drawLines(p,4); break; case MARKER_TRIANGLE_DN|MARKER_SOLID: p[0].x=x-h; p[1].x=x; p[2].x=x+h; p[0].y=p[2].y=y-h; p[1].y=y+h; dc.fillPolygon(p,3); break; case MARKER_TRIANGLE_LT: p[0].x=p[3].x=x-h; p[1].x=p[2].x=x+h; p[0].y=p[3].y=y; p[1].y=y+h; p[2].y=y-h; dc.drawLines(p,4); break; case MARKER_TRIANGLE_LT|MARKER_SOLID: p[0].x=x-h; p[1].x=p[2].x=x+h; p[0].y=y; p[1].y=y+h; p[2].y=y-h; dc.fillPolygon(p,3); break; case MARKER_TRIANGLE_RT: p[0].x=p[3].x=x+h; p[1].x=p[2].x=x-h; p[0].y=p[3].y=y; p[1].y=y-h; p[2].y=y+h; dc.drawLines(p,4); break; case MARKER_TRIANGLE_RT|MARKER_SOLID: p[0].x=x+h; p[1].x=p[2].x=x-h; p[0].y=y; p[1].y=y-h; p[2].y=y+h; dc.fillPolygon(p,3); break; } } #define MAXSTEPS 128 // Resize the dial void FXChart::layout(){ register FXint rr,gg,bb,dr,dg,db,r1,g1,b1,r2,g2,b2,xl,xr,n,t,xx,dx; // Do regular layout of child widgets FXComposite::layout(); // Resize off-screen buffer if needed if(chart->getWidth()!=width || chart->getHeight()!=height){ chart->resize(width,height); FXTRACE((1,"new size = %d x %d\n",width,height)); } // FIXME regenerate plot FXDCWindow dc(chart); switch(fill.style){ case FILLSTYLE_SOLID: dc.setStipple(STIPPLE_NONE); dc.setFillStyle(FILL_SOLID); dc.setForeground(fill.color); dc.fillRectangle(0,0,width,height); break; case FILLSTYLE_HATCH: if(fill.backcolor){ dc.setFillStyle(FILL_OPAQUESTIPPLED); dc.setBackground(fill.backcolor); } else{ dc.setFillStyle(FILL_STIPPLED); } dc.setStipple((FXStipplePattern)fill.hatch); dc.setForeground(fill.color); dc.fillRectangle(0,0,width,height); break; case FILLSTYLE_TEXTURE: dc.setStipple(STIPPLE_NONE); dc.setFillStyle(FILL_TILED); dc.setTile(fill.image); dc.fillRectangle(0,0,width,height); break; case FILLSTYLE_IMAGE: dc.setStipple(STIPPLE_NONE); dc.setFillStyle(FILL_TILED); dc.setTile(fill.image); dc.fillRectangle(0,0,width,height); break; case FILLSTYLE_HORIZONTAL: dc.setStipple(STIPPLE_NONE); dc.setFillStyle(FILL_SOLID); dc.setForeground(FXRGB(255,0,255)); dc.fillRectangle(0,0,width,height); r1=FXREDVAL(fill.lower); r2=FXREDVAL(fill.upper); dr=r2-r1; g1=FXGREENVAL(fill.lower); g2=FXGREENVAL(fill.upper); dg=g2-g1; b1=FXBLUEVAL(fill.lower); b2=FXBLUEVAL(fill.upper); db=b2-b1; n=FXABS(dr); if((t=FXABS(dg))>n) n=t; if((t=FXABS(db))>n) n=t; FXTRACE((1,"max(|dr|,|dg|,|db|)=%d \n",n)); n++; if(n>width) n=width; if(n>MAXSTEPS) n=MAXSTEPS; FXTRACE((1,"n=%d \n",n)); rr=(r1<<16)+32767; gg=(g1<<16)+32767; bb=(b1<<16)+32767; xx=32767; dr=(dr<<16)/n; dg=(dg<<16)/n; db=(db<<16)/n; dx=(width<<16)/n; do{ xl=xx>>16; xx+=dx; xr=xx>>16; dc.setForeground(FXRGB(rr>>16,gg>>16,bb>>16)); dc.fillRectangle(xl,0,xr-xl,height); FXTRACE((1,"fillRectangle(%d,%d,%d,%d) width=%d n=%d\n",xl,0,xr-xl,height,width,n)); rr+=dr; gg+=dg; bb+=db; } while(xrhandle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXChart::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Lost clipboard, so destroy data long FXChart::onClipboardLost(FXObject*,FXSelector,void*){ return 1; } // Request for clipboard data long FXChart::onClipboardRequest(FXObject *sender,FXSelector sel,void *ptr){ FXEvent *event=(FXEvent*)ptr; FXuval size; FXuchar *data; // Try handling it in base class first if(FXComposite::onClipboardRequest(sender,sel,ptr)) return 1; // One of the supported image types? if(event->target==bmpType || event->target==gifType || event->target==jpgType || event->target==pngType){ FXMemoryStream ms; // Read back pixels chart->restore(); // Open memory stream ms.open(FXStreamSave,NULL); // Render image to memory stream if(event->target==bmpType) fxsaveBMP(ms,chart->getData(),chart->getWidth(),chart->getHeight()); else if(event->target==gifType) fxsaveGIF(ms,chart->getData(),chart->getWidth(),chart->getHeight()); else if(event->target==jpgType) fxsaveJPG(ms,chart->getData(),chart->getWidth(),chart->getHeight(),75); else if(event->target==pngType) fxsavePNG(ms,chart->getData(),chart->getWidth(),chart->getHeight()); else if(event->target==tifType) fxsaveTIF(ms,chart->getData(),chart->getWidth(),chart->getHeight(),0); #ifdef WIN32 // else if(event->target==imageType) // fxsaveBMP(ms,chart->getData(),chart->getWidth(),chart->getHeight()); #endif // Grab buffered image ms.takeBuffer(data,size); // Close memory stream ms.close(); // Release pixels chart->release(); // Set DND data setDNDData(FROM_CLIPBOARD,event->target,data,size); return 1; } return 0; } // Handle repaint long FXChart::onPaint(FXObject*,FXSelector,void* ptr){ FXDCWindow dc(this,(FXEvent*)ptr); dc.drawImage(chart,0,0); return 1; } // Set fill style void FXChart::setFillStyle(const FillStyle& fs){ fill=fs; recalc(); } // Change help text void FXChart::setHelpText(const FXString& text){ help=text; } // Change tip text void FXChart::setTipText(const FXString& text){ tip=text; } // Save data void FXChart::save(FXStream& store) const { FXComposite::save(store); store << chart; store << tip; store << help; } // Load data void FXChart::load(FXStream& store){ FXComposite::load(store); store >> chart; store >> tip; store >> help; } // Destroy FXChart::~FXChart(){ delete chart; chart=(FXImage*)-1L; } } fox1.6-1.6.57/chart/FXChart.h000066400000000000000000000234531326741342000154150ustar00rootroot00000000000000/******************************************************************************** * * * C h a r t B a s e W i d g e t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXChart.h,v 1.17 2006/01/22 18:01:13 fox Exp $ * ********************************************************************************/ #ifndef FXCHART_H #define FXCHART_H ////////////////////////////// UNDER DEVELOPMENT ////////////////////////////// // Define FXCHARTAPI for DLL builds #ifdef FOXDLL #ifdef CHARTDLL_EXPORTS #define FXCHARTAPI FXEXPORT #else #define FXCHARTAPI FXIMPORT #endif #else #define FXCHARTAPI #endif namespace FX { /// Tickmark placement styles enum { TICKS_OFF = 0, /// No tickmarks TICKS_MAJOR = 0x01, /// Display major ticks TICKS_MINOR = 0x02, /// Display minor ticks TICKS_INSIDE = 0x04, /// Tickmarks inside box TICKS_OUTSIDE = 0x08, /// Tickmarks outside box TICKS_CROSS = (TICKS_INSIDE|TICKS_OUTSIDE) /// Tickmarks inside and outside box }; /// Tickmark definition struct Ticks { FXuchar style; /// Style flags FXuchar majorlength; /// Major tick length FXuchar minorlength; /// Minor tick length FXuchar majorweight; /// Major tick line weight FXuchar minorweight; /// Minor tick line weight FXdouble majorspace; /// Major tick spacing FXdouble minorspace; /// Minor tick spacing FXColor majorcolor; /// Major tick color FXColor minorcolor; /// Minor tick color }; /// Line styles enum { LINESTYLE_NONE, /// No line LINESTYLE_SOLID, /// Solid line LINESTYLE_DOTTED, /// Dotted line LINESTYLE_SHORTDASHED, /// Short dashed line LINESTYLE_LONGDASHED, /// Long dashed line LINESTYLE_DOTDASHED /// Dot-dashed line }; /// Line style definition struct LineStyle { FXuchar style; /// Line style flags FXuchar width; /// Line width FXuchar cap; /// End cap style FXuchar join; /// Join style FXColor color; /// Line color FXColor backcolor; /// Back color when stippling (may be clear) }; /// Fill styles enum { FILLSTYLE_OFF, /// Not filled FILLSTYLE_SOLID, /// Solid color FILLSTYLE_HATCH, /// Hatch pattern FILLSTYLE_TEXTURE, /// Repeating texture FILLSTYLE_IMAGE, /// Fill with an image FILLSTYLE_HORIZONTAL, /// Horizontal gradient FILLSTYLE_VERTICAL, /// Vertical gradient FILLSTYLE_DIAGONAL, /// Diagonal gradient FILLSTYLE_RDIAGONAL /// Reverse diagonal gradient }; /// Fill style definition struct FillStyle { FXuchar style; /// Fill style FXuchar hatch; /// Hatch pattern if hatch style FXImage *image; /// Image used for texture or image fill FXColor color; /// Fill color FXColor backcolor; /// Back color when hatching (may be clear) FXColor lower; /// Lower gradient color FXColor upper; /// Upper gradient color }; /// Text definition struct TextStyle { FXFont *font; /// Text font FXColor color; /// Text color FXColor shadowcolor; /// Text shadow color (may be clear) FXshort shadowx; /// X shadow offset FXshort shadowy; /// Y shadow offset }; /// Tick number definition struct Numbers { FXuchar style; /// Number format style // ... How to format ... // TextStyle textstyle; /// Text display style }; /// Marker styles enum { MARKER_NONE = 0, /// Draw nothing MARKER_SQUARE = 1, /// Draw (solid) square MARKER_CIRCLE = 2, /// Draw (solid) circle MARKER_DIAMOND = 3, /// Draw (solid) diamond MARKER_TRIANGLE_UP = 4, /// Draw (solid) upward triangle MARKER_TRIANGLE_DN = 5, /// Draw (solid) downward triangle MARKER_TRIANGLE_LT = 6, /// Draw (solid) leftward triangle MARKER_TRIANGLE_RT = 7, /// Draw (solid) rightward triangle MARKER_SOLID = 8 /// Fill shape }; /// Marker definition struct Marker { FXuchar style; /// Marker style FXColor color; /// Color of markers FXint size; /// How big to draw markers }; /// Caption definition struct Caption { FXString caption; /// Text string TextStyle textstyle; /// Text display style }; /// Grid styles enum { GRID_OFF = 0, /// No grid displayed GRID_MAJOR = 1, /// Draw grid lines at major ticks GRID_MINOR = 2 /// Draw grid lines at minor ticks }; /// Grid defintion struct Grid { FXuchar style; /// Grid draw style LineStyle major; /// Major grid line styles LineStyle minor; /// Minor grid line styles }; /// Axis styles enum { AXIS_OFF = 0, /// Nothing drawn on axis AXIS_CAPTION = 0x0001, /// Axis label drawn AXIS_NUMBERS = 0x0002, /// Draw numbers on major ticks AXIS_UNITS = 0x0004, /// Units display (. . . N/m^2) AXIS_GRID = 0x0008, /// Grid lines drawn on major ticks AXIS_TICKS = 0x0010, /// Grid lines drawn on major ticks AXIS_EXPONENT = 0x0020, /// Exponent near end of axis ( . . . x 10^5 N/m^2) AXIS_REVERSED = 0x0040, /// Numbers increase to left AXIS_ROUND = 0x0080, /// Round range to nearest nice number AXIS_LOG = 0x0100, /// Logarithmic scale AXIS_GRIDFRONT = 0x0200 /// Grid in front of data }; /// Axis definition struct Axis { FXuint style; /// Axis style flags Ticks ticks; /// Tick drawing style Grid grid; /// Grid settings Caption label; /// Axis caption Caption units; /// Axis units Numbers numbers; /// Number drawing info FXColor linecolor; /// Line color of axis line FXuchar lineweight; /// Line weight of axis line FXdouble minimum; /// Maximum data value FXdouble maximum; /// Minimum data value }; class FXImage; // Base class for the various chart widgets class FXCHARTAPI FXChart : public FXComposite { FXDECLARE(FXChart) protected: FXImage *chart; // Chart image FXString tip; // Tooltip value FXString help; // Help value FillStyle fill; // Fill style protected: FXChart(); void drawMarker(FXDC& dc,FXint x,FXint y,const Marker& m) const; private: FXChart(const FXChart&); FXChart &operator=(const FXChart&); public: long onPaint(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onClipboardLost(FXObject*,FXSelector,void*); long onClipboardRequest(FXObject*,FXSelector,void*); public: static FXDragType bmpType; static FXDragType gifType; static FXDragType jpgType; static FXDragType pngType; static FXDragType tifType; static FXDragType csvType; public: /// Construct color well with initial color clr FXChart(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Set fill style void setFillStyle(const FillStyle& fs); /// Get fill style FillStyle getFillStyle() const { return fill; } /// Set status line help text for this chart void setHelpText(const FXString& text); /// Get status line help text for this chart FXString getHelpText() const { return help; } /// Set tool tip message for this chart void setTipText(const FXString& text); /// Get tool tip message for this chart FXString getTipText() const { return tip; } /// Save chart to a stream virtual void save(FXStream& store) const; /// Load chart from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXChart(); }; } #endif fox1.6-1.6.57/chart/Makefile.am000066400000000000000000000016741326741342000160020ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp LDADD = libCHART-1.6.la $(top_builddir)/src/libFOX-1.6.la -lm lib_LTLIBRARIES = libCHART-1.6.la libCHART_1_6_la_LIBADD = $(X_LIBS) $(X_BASE_LIBS) $(X_EXTRA_LIBS) $(top_builddir)/src/libFOX-1.6.la libCHART_1_6_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ -export-dynamic \ -no-undefined chartincludedir=$(includedir)/fox-1.6/chart chartinclude_HEADERS = \ FXChart.h libCHART_1_6_la_SOURCES = \ FXChart.cpp noinst_PROGRAMS = chart ICONS = marble.bmp chart_SOURCES = chart.cpp icons.h icons.cpp $(ICONS) chart.cpp: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $^ icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $^ CLEANFILES = icons.h icons.cpp EXTRA_DIST = Makefile.bc fox1.6-1.6.57/chart/Makefile.bc000066400000000000000000000055701326741342000157700ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Copyright (C) 2004 by Jeroen van der Zijp. All Rights Reserved. # ############################################################################## # $Id: Makefile.bc,v 1.5 2005/09/22 11:14:47 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # For use with Borland C++ Builder 3 or later CXX = bcc32 CXXFLAGS = -5 -O2 -w-par -w-csu -w-aus RM = del LIB = tlib TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = bcc32 LDFLAGS = -laa GLLIBS = opengl32.lib glu32.lib INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib CHARTLIB = $(TOPDIR)\src\CHART-1.6.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe .SUFFIXES: .cpp .c PROGRAMS = chart.exe SOURCES = \ chart.cpp \ FXChart.cpp \ icons.cpp OBJECTS = $(SOURCES:.cpp=.obj) ICONS = \ marble.bmp .cpp.obj: $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(CHARTLIB) $(PROGRAMS) chart.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) chart.obj: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $** icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $** clean: $(RM) $(CHARTLIB) $(RM) *.obj $(RM) *.exe $(RM) *.tds $(RM) icons.cpp $(RM) icons.h # Make the library $(CHARTLIB): $(OBJECTS) Makefile.bc.resp touch $(CHARTLIB) del $(CHARTLIB) $(LIB) "$(CHARTLIB)" /P256 @Makefile.bc.resp fox1.6-1.6.57/chart/Makefile.in000066400000000000000000000572121326741342000160120ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = chart$(EXEEXT) subdir = chart ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(chartinclude_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(chartincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libCHART_1_6_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/src/libFOX-1.6.la am_libCHART_1_6_la_OBJECTS = FXChart.lo libCHART_1_6_la_OBJECTS = $(am_libCHART_1_6_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libCHART_1_6_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(libCHART_1_6_la_LDFLAGS) \ $(LDFLAGS) -o $@ PROGRAMS = $(noinst_PROGRAMS) am__objects_1 = am_chart_OBJECTS = chart.$(OBJEXT) icons.$(OBJEXT) $(am__objects_1) chart_OBJECTS = $(am_chart_OBJECTS) chart_LDADD = $(LDADD) chart_DEPENDENCIES = libCHART-1.6.la $(top_builddir)/src/libFOX-1.6.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libCHART_1_6_la_SOURCES) $(chart_SOURCES) DIST_SOURCES = $(libCHART_1_6_la_SOURCES) $(chart_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(chartinclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp LDADD = libCHART-1.6.la $(top_builddir)/src/libFOX-1.6.la -lm lib_LTLIBRARIES = libCHART-1.6.la libCHART_1_6_la_LIBADD = $(X_LIBS) $(X_BASE_LIBS) $(X_EXTRA_LIBS) $(top_builddir)/src/libFOX-1.6.la libCHART_1_6_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ -export-dynamic \ -no-undefined chartincludedir = $(includedir)/fox-1.6/chart chartinclude_HEADERS = \ FXChart.h libCHART_1_6_la_SOURCES = \ FXChart.cpp ICONS = marble.bmp chart_SOURCES = chart.cpp icons.h icons.cpp $(ICONS) CLEANFILES = icons.h icons.cpp EXTRA_DIST = Makefile.bc all: all-am .SUFFIXES: .SUFFIXES: .gif .bmp .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign chart/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign chart/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libCHART-1.6.la: $(libCHART_1_6_la_OBJECTS) $(libCHART_1_6_la_DEPENDENCIES) $(EXTRA_libCHART_1_6_la_DEPENDENCIES) $(AM_V_CXXLD)$(libCHART_1_6_la_LINK) -rpath $(libdir) $(libCHART_1_6_la_OBJECTS) $(libCHART_1_6_la_LIBADD) $(LIBS) clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list chart$(EXEEXT): $(chart_OBJECTS) $(chart_DEPENDENCIES) $(EXTRA_chart_DEPENDENCIES) @rm -f chart$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(chart_OBJECTS) $(chart_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXChart.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icons.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-chartincludeHEADERS: $(chartinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(chartinclude_HEADERS)'; test -n "$(chartincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(chartincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(chartincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(chartincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(chartincludedir)" || exit $$?; \ done uninstall-chartincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(chartinclude_HEADERS)'; test -n "$(chartincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(chartincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(chartincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-chartincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-chartincludeHEADERS uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-chartincludeHEADERS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am \ uninstall-chartincludeHEADERS uninstall-libLTLIBRARIES .PRECIOUS: Makefile chart.cpp: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $^ icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $^ # 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: fox1.6-1.6.57/chart/chart.cpp000066400000000000000000000071611326741342000155500ustar00rootroot00000000000000/******************************************************************************** * * * Chart Test * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * $Id: chart.cpp,v 1.7 2006/01/22 18:01:13 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "FXChart.h" #include "icons.h" /* Notes: */ /*******************************************************************************/ // Mini application object class ChartWindow : public FXMainWindow { FXDECLARE(ChartWindow) protected: FXChart *chart; FXMenuBar *menubar; FXStatusBar *statusbar; FXMenuPane *filemenu; FXBMPImage *image; protected: ChartWindow(){} private: ChartWindow(const ChartWindow&); ChartWindow &operator=(const ChartWindow&); public: long onCmdChart(FXObject*,FXSelector,void*); public: enum { ID_CHART=FXMainWindow::ID_LAST }; public: ChartWindow(FXApp *a); virtual void create(); virtual ~ChartWindow(); }; /*******************************************************************************/ // Map FXDEFMAP(ChartWindow) ChartWindowMap[]={ FXMAPFUNC(SEL_COMMAND, ChartWindow::ID_CHART, ChartWindow::onCmdChart), }; // Object implementation FXIMPLEMENT(ChartWindow,FXMainWindow,ChartWindowMap,ARRAYNUMBER(ChartWindowMap)) // Make some windows ChartWindow::ChartWindow(FXApp* a):FXMainWindow(a,"Chart Test",NULL,NULL,DECOR_ALL,20,20,700,460){ // Menubar menubar=new FXMenuBar(this,FRAME_RAISED|LAYOUT_SIDE_TOP|LAYOUT_FILL_X); statusbar=new FXStatusBar(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|FRAME_RAISED|STATUSBAR_WITH_DRAGCORNER); // File menu filemenu=new FXMenuPane(this); new FXMenuCommand(filemenu,"&Quit\tCtl-Q",NULL,getApp(),FXApp::ID_QUIT); new FXMenuTitle(menubar,"&File",NULL,filemenu); // Container FXHorizontalFrame *container=new FXHorizontalFrame(this,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED); // Well for chart FXHorizontalFrame *chartwell=new FXHorizontalFrame(container,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, 0,0,0,0, 0,0); // Chart chart=new FXChart(chartwell,this,ID_CHART,LAYOUT_FILL_X|LAYOUT_FILL_Y); // Pattern image=new FXBMPImage(getApp(),marble); FillStyle fs; fs.style=FILLSTYLE_HORIZONTAL; fs.hatch=STIPPLE_NONE; fs.image=image; fs.color=FXRGB(128,255,255); fs.backcolor=FXRGB(128,128,255); fs.lower=FXRGB(255,255,255); fs.upper=FXRGB(0,0,255); chart->setFillStyle(fs); } // Create image void ChartWindow::create(){ FXMainWindow::create(); image->create(); } // Command from chart long ChartWindow::onCmdChart(FXObject*,FXSelector,void*){ return 1; } // Clean up ChartWindow::~ChartWindow(){ delete filemenu; delete image; } /*******************************************************************************/ // Start the whole thing int main(int argc,char *argv[]){ // Make application FXApp application("ChartWindow","FoxTest"); // Open display application.init(argc,argv); // Main window ChartWindow* window=new ChartWindow(&application); // Create app application.create(); // Show it window->show(PLACEMENT_SCREEN); // Run return application.run(); } fox1.6-1.6.57/chart/icons.cpp000066400000000000000000001752351326741342000155720ustar00rootroot00000000000000/* Generated by reswrap version 4.0.0 */ /* created by reswrap from file marble.bmp */ extern const unsigned char marble[]={ 0x42,0x4d,0x36,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0xc0,0xd0,0xb0,0xc0,0xd0,0xb0,0xc0,0xcd,0xb0, 0xc0,0xcd,0xb1,0xc0,0xd0,0xb0,0xbf,0xcf,0xaf,0xbd,0xcf,0xad,0xbb,0xcd,0xab,0xb9, 0xcb,0xa9,0xb7,0xca,0xa9,0xb7,0xce,0xab,0xb9,0xd0,0xac,0xba,0xd1,0xac,0xba,0xd1, 0xab,0xb9,0xd0,0xab,0xb9,0xd0,0xab,0xb9,0xd0,0xac,0xba,0xd1,0xab,0xb9,0xcf,0xab, 0xb9,0xcf,0xaa,0xb8,0xcf,0xaa,0xb8,0xcf,0xa9,0xb6,0xd0,0xa7,0xb4,0xce,0xa6,0xb2, 0xce,0xa5,0xb1,0xcd,0xa0,0xaf,0xd0,0x9f,0xae,0xcf,0x9e,0xad,0xcd,0x9c,0xab,0xcb, 0x99,0xa8,0xc9,0x94,0xa1,0xc7,0x8e,0x9a,0xc4,0x89,0x94,0xc0,0x7d,0x8d,0xbb,0x82, 0x92,0xc0,0x86,0x93,0xc1,0x89,0x96,0xc4,0x86,0x95,0xc3,0x77,0x87,0xb5,0x6a,0x7e, 0xad,0x6e,0x86,0xb4,0x89,0x98,0xbf,0x94,0xa4,0xc9,0x9f,0xad,0xd1,0xa0,0xaf,0xd0, 0xa0,0xb0,0xcd,0xa4,0xb3,0xcd,0xa5,0xb5,0xcc,0xa4,0xb4,0xcb,0xa4,0xb4,0xcb,0xa4, 0xb3,0xcd,0xa1,0xb2,0xcd,0xa0,0xb0,0xcd,0x9b,0xad,0xcc,0x97,0xaa,0xcb,0x95,0xa8, 0xcb,0x94,0xa7,0xca,0x88,0x9c,0xc5,0x87,0x9b,0xc4,0x86,0x99,0xc4,0x85,0x98,0xc3, 0x86,0x99,0xc6,0x88,0x9b,0xc8,0xaf,0xbf,0xd0,0xaf,0xbf,0xcf,0xaf,0xbe,0xce,0xb0, 0xbf,0xcf,0xb0,0xbf,0xcf,0xaf,0xbd,0xcf,0xae,0xbc,0xce,0xac,0xba,0xcd,0xaa,0xb8, 0xcb,0xa9,0xb7,0xca,0xa9,0xb7,0xce,0xab,0xb9,0xd0,0xac,0xba,0xd1,0xac,0xba,0xd1, 0xab,0xb9,0xd0,0xab,0xb9,0xd0,0xab,0xb9,0xd0,0xac,0xba,0xd1,0xac,0xba,0xd0,0xac, 0xba,0xd0,0xac,0xba,0xd1,0xac,0xba,0xd1,0xab,0xb8,0xd2,0xa9,0xb6,0xd0,0xa8,0xb4, 0xd0,0xa7,0xb3,0xcf,0xa2,0xb1,0xd2,0xa1,0xb0,0xd0,0xa0,0xaf,0xcf,0x9e,0xad,0xcd, 0x9b,0xaa,0xcb,0x96,0xa4,0xc8,0x91,0x9d,0xc5,0x8c,0x97,0xc3,0x7a,0x8c,0xbb,0x7a, 0x8c,0xbb,0x80,0x90,0xbf,0x87,0x96,0xc7,0x81,0x91,0xc0,0x6a,0x7c,0xab,0x68,0x7c, 0xab,0x7e,0x95,0xc3,0x93,0xa3,0xc8,0x98,0xa8,0xcc,0x9f,0xae,0xcf,0xa1,0xb0,0xd0, 0xa2,0xb2,0xcf,0xa7,0xb6,0xd0,0xa7,0xb7,0xce,0xa6,0xb6,0xcd,0xa7,0xb7,0xce,0xa4, 0xb5,0xcf,0xa4,0xb5,0xcf,0xa2,0xb3,0xce,0x9f,0xb1,0xce,0x9d,0xaf,0xce,0x9b,0xac, 0xcd,0x98,0xab,0xcc,0x93,0xa6,0xcb,0x92,0xa5,0xca,0x91,0xa4,0xc9,0x8f,0xa2,0xc8, 0x8e,0xa1,0xc7,0x8e,0xa0,0xc9,0xae,0xbe,0xcf,0xae,0xbe,0xcf,0xaf,0xbe,0xce,0xb0, 0xbf,0xcf,0xb0,0xbe,0xd0,0xaf,0xbd,0xcf,0xae,0xbc,0xce,0xac,0xba,0xcd,0xaa,0xb8, 0xcb,0xa8,0xb6,0xc9,0xa9,0xb7,0xce,0xaa,0xb8,0xcf,0xac,0xba,0xd1,0xac,0xba,0xd1, 0xab,0xb9,0xd0,0xab,0xb9,0xd0,0xab,0xb9,0xd0,0xac,0xba,0xd1,0xac,0xba,0xd0,0xac, 0xba,0xd0,0xac,0xba,0xd1,0xac,0xba,0xd1,0xab,0xb8,0xd2,0xaa,0xb7,0xd1,0xa9,0xb5, 0xd1,0xa9,0xb5,0xd1,0xa6,0xb3,0xd3,0xa5,0xb3,0xd0,0xa3,0xb1,0xce,0xa1,0xaf,0xcc, 0x9f,0xac,0xcc,0x9b,0xa7,0xc9,0x95,0xa0,0xc6,0x91,0x9a,0xc5,0x79,0x8d,0xbd,0x79, 0x8a,0xbb,0x79,0x8a,0xbd,0x7d,0x8e,0xc1,0x79,0x8a,0xbd,0x6a,0x7e,0xae,0x74,0x88, 0xb7,0x91,0xa6,0xd3,0x9b,0xab,0xcf,0x9c,0xad,0xce,0xa0,0xaf,0xd0,0xa1,0xb0,0xd0, 0xa4,0xb5,0xd0,0xa9,0xb8,0xd2,0xa9,0xb8,0xd2,0xa8,0xb8,0xcf,0xa6,0xb8,0xcf,0xa6, 0xb8,0xcf,0xa5,0xb6,0xd0,0xa4,0xb5,0xcf,0xa3,0xb4,0xcf,0xa1,0xb1,0xce,0xa0,0xb0, 0xcd,0x9f,0xaf,0xcc,0x9a,0xae,0xcd,0x9a,0xae,0xcd,0x9a,0xad,0xce,0x99,0xac,0xcd, 0x98,0xab,0xcc,0x98,0xab,0xce,0xae,0xbe,0xcf,0xae,0xbe,0xcf,0xaf,0xbd,0xcf,0xaf, 0xbd,0xcf,0xb0,0xbe,0xd0,0xaf,0xbd,0xd0,0xae,0xbc,0xcf,0xac,0xba,0xcd,0xaa,0xb7, 0xcd,0xa8,0xb5,0xcb,0xa8,0xb6,0xcd,0xaa,0xb8,0xcf,0xab,0xb9,0xd0,0xab,0xb9,0xd0, 0xaa,0xb8,0xcf,0xaa,0xb8,0xcf,0xaa,0xb8,0xcf,0xab,0xb9,0xd0,0xaa,0xb8,0xce,0xab, 0xb9,0xcf,0xab,0xb9,0xd0,0xab,0xb9,0xd0,0xab,0xb8,0xd2,0xaa,0xb7,0xd1,0xa9,0xb5, 0xd1,0xa9,0xb5,0xd1,0xa6,0xb4,0xd1,0xa5,0xb3,0xcf,0xa3,0xb1,0xcd,0xa1,0xaf,0xcb, 0x9f,0xad,0xca,0x9b,0xa7,0xc9,0x97,0xa3,0xc7,0x93,0x9d,0xc5,0x7f,0x91,0xc0,0x7e, 0x8f,0xc0,0x75,0x86,0xb9,0x6f,0x80,0xb3,0x73,0x84,0xb7,0x78,0x8a,0xb9,0x87,0x98, 0xc3,0x9b,0xad,0xd6,0xa0,0xb1,0xd2,0x9e,0xb0,0xcf,0x9f,0xae,0xce,0xa2,0xb2,0xcf, 0xa5,0xb6,0xd1,0xa8,0xb7,0xd1,0xa9,0xb8,0xd2,0xa9,0xb9,0xd0,0xa6,0xb8,0xcf,0xa6, 0xb8,0xcf,0xa6,0xb8,0xcf,0xa5,0xb6,0xd0,0xa6,0xb5,0xcf,0xa5,0xb4,0xce,0xa4,0xb3, 0xcd,0xa3,0xb1,0xcd,0x9d,0xb2,0xcd,0x9e,0xb3,0xce,0x9f,0xb4,0xd0,0x9e,0xb3,0xcf, 0x9c,0xb0,0xcf,0x9c,0xb0,0xcf,0xae,0xbd,0xd0,0xae,0xbd,0xd0,0xae,0xbc,0xce,0xae, 0xbc,0xce,0xae,0xbc,0xce,0xae,0xbc,0xcf,0xac,0xba,0xcd,0xaa,0xb7,0xcd,0xa8,0xb5, 0xcb,0xa7,0xb4,0xca,0xa7,0xb5,0xcc,0xa8,0xb6,0xcd,0xaa,0xb8,0xcf,0xaa,0xb8,0xcf, 0xa9,0xb7,0xce,0xa9,0xb7,0xce,0xa9,0xb7,0xce,0xaa,0xb8,0xcf,0xa8,0xb6,0xcc,0xa9, 0xb7,0xcd,0xa9,0xb7,0xce,0xaa,0xb8,0xcf,0xa9,0xb6,0xd0,0xa9,0xb6,0xd0,0xa8,0xb4, 0xd0,0xa8,0xb4,0xd0,0xa7,0xb3,0xcf,0xa6,0xb3,0xcd,0xa4,0xb1,0xcb,0xa2,0xaf,0xc9, 0xa0,0xac,0xc8,0x9d,0xa8,0xc8,0x99,0xa2,0xc7,0x95,0x9e,0xc4,0x86,0x96,0xc1,0x84, 0x94,0xc3,0x72,0x83,0xb4,0x67,0x78,0xab,0x73,0x84,0xb5,0x86,0x96,0xc4,0x93,0xa2, 0xc9,0x9c,0xaa,0xce,0xa1,0xb3,0xd0,0x9e,0xb0,0xcd,0xa0,0xb0,0xcd,0xa3,0xb4,0xcf, 0xa5,0xb6,0xd1,0xa7,0xb6,0xd0,0xa8,0xb7,0xd1,0xab,0xba,0xd4,0xa6,0xb8,0xcf,0xa6, 0xb8,0xcf,0xa6,0xb8,0xcf,0xa8,0xb8,0xcf,0xa8,0xb8,0xcf,0xa9,0xb7,0xce,0xa8,0xb6, 0xcd,0xa8,0xb6,0xcd,0xa1,0xb5,0xce,0xa3,0xb7,0xd0,0xa4,0xb7,0xd2,0xa3,0xb6,0xd1, 0xa0,0xb2,0xcf,0x9e,0xb0,0xcd,0xac,0xbb,0xce,0xac,0xbb,0xce,0xac,0xba,0xcc,0xac, 0xba,0xcd,0xac,0xba,0xcd,0xac,0xba,0xcd,0xaa,0xb7,0xcd,0xa8,0xb5,0xcb,0xa6,0xb2, 0xca,0xa5,0xb1,0xc9,0xa5,0xb3,0xca,0xa7,0xb5,0xcc,0xa9,0xb7,0xce,0xa9,0xb7,0xce, 0xa8,0xb6,0xcd,0xa7,0xb5,0xcc,0xa8,0xb6,0xcd,0xa9,0xb7,0xce,0xa7,0xb5,0xcb,0xa8, 0xb6,0xcc,0xa8,0xb6,0xcd,0xa9,0xb7,0xce,0xa9,0xb6,0xd0,0xa9,0xb6,0xd0,0xa8,0xb4, 0xd0,0xa8,0xb4,0xd0,0xa5,0xb2,0xcc,0xa4,0xb1,0xcb,0xa1,0xaf,0xc6,0xa0,0xae,0xc5, 0x9e,0xab,0xc5,0x9b,0xa6,0xc4,0x97,0xa1,0xc3,0x95,0x9e,0xc3,0x88,0x96,0xc0,0x83, 0x93,0xbe,0x73,0x83,0xb2,0x6f,0x7e,0xaf,0x81,0x91,0xc0,0x95,0xa3,0xcd,0x9d,0xa9, 0xcd,0xa0,0xab,0xc9,0xa1,0xb4,0xcf,0x9f,0xb2,0xcd,0xa1,0xb2,0xcd,0xa5,0xb6,0xd1, 0xa5,0xb6,0xd1,0xa6,0xb5,0xcf,0xa8,0xb7,0xd1,0xad,0xbc,0xd6,0xa7,0xb9,0xd0,0xa7, 0xb9,0xd0,0xa7,0xba,0xcf,0xaa,0xbb,0xd0,0xac,0xba,0xd0,0xab,0xb9,0xcf,0xab,0xb8, 0xce,0xab,0xb8,0xce,0xa4,0xb5,0xcf,0xa7,0xb8,0xd2,0xa9,0xba,0xd5,0xa8,0xb9,0xd4, 0xa4,0xb5,0xd0,0xa3,0xb3,0xd0,0xab,0xba,0xcd,0xab,0xba,0xcd,0xaa,0xb8,0xcb,0xaa, 0xb8,0xcb,0xaa,0xb8,0xcb,0xaa,0xb8,0xcb,0xa9,0xb6,0xcc,0xa7,0xb4,0xca,0xa4,0xb0, 0xc8,0xa3,0xaf,0xc7,0xa5,0xb3,0xca,0xa6,0xb4,0xcb,0xa8,0xb6,0xcd,0xa8,0xb6,0xcd, 0xa7,0xb5,0xcc,0xa6,0xb4,0xcb,0xa7,0xb5,0xcc,0xa8,0xb6,0xcd,0xa7,0xb5,0xcb,0xa7, 0xb5,0xcb,0xa8,0xb6,0xcd,0xa9,0xb7,0xce,0xa9,0xb6,0xd0,0xa9,0xb6,0xd0,0xa8,0xb4, 0xd0,0xa8,0xb4,0xd0,0xa4,0xb1,0xcb,0xa2,0xb0,0xc7,0xa0,0xae,0xc5,0x9e,0xac,0xc3, 0x9d,0xaa,0xc4,0x9a,0xa5,0xc3,0x97,0xa2,0xc2,0x94,0x9d,0xc2,0x88,0x94,0xbc,0x81, 0x8f,0xb9,0x75,0x83,0xb3,0x79,0x88,0xb9,0x90,0x9f,0xcd,0xa0,0xac,0xd4,0xa3,0xae, 0xce,0xa7,0xb0,0xcb,0xa1,0xb4,0xcf,0x9f,0xb2,0xcd,0xa2,0xb3,0xce,0xa6,0xb7,0xd2, 0xa6,0xb7,0xd1,0xa6,0xb5,0xcf,0xa9,0xb8,0xd2,0xaf,0xbe,0xd8,0xa7,0xb9,0xd0,0xa8, 0xbb,0xd0,0xa8,0xbb,0xd0,0xab,0xbc,0xd1,0xad,0xbb,0xd1,0xae,0xbc,0xcf,0xad,0xbb, 0xce,0xad,0xbb,0xce,0xa5,0xb6,0xd0,0xa8,0xb9,0xd3,0xab,0xbc,0xd7,0xab,0xbc,0xd7, 0xa8,0xb8,0xd5,0xa7,0xb7,0xd4,0xa6,0xba,0xcc,0xa3,0xb7,0xc9,0xa8,0xb9,0xce,0xa6, 0xb7,0xcc,0xa4,0xb5,0xca,0xa3,0xb3,0xca,0xa3,0xb3,0xca,0xa2,0xb1,0xcb,0xa1,0xb0, 0xca,0xa0,0xaf,0xc9,0xa1,0xb3,0xca,0xa0,0xb2,0xc9,0xa2,0xb2,0xc9,0xa2,0xb2,0xc9, 0xa5,0xb3,0xca,0xa6,0xb4,0xcb,0xa6,0xb4,0xcb,0xa6,0xb2,0xca,0xa6,0xb4,0xcb,0xa6, 0xb4,0xcb,0xa6,0xb4,0xcb,0xa7,0xb5,0xcc,0xa8,0xb6,0xcd,0xa7,0xb5,0xcc,0xa5,0xb3, 0xca,0xa3,0xb1,0xc8,0x9d,0xb3,0xcc,0x9c,0xad,0xc7,0x9f,0xac,0xc6,0xa4,0xad,0xc8, 0x9f,0xa8,0xc3,0x92,0x9d,0xb9,0x8d,0x9b,0xb8,0x90,0x9f,0xbf,0x83,0x8d,0xbc,0x80, 0x8c,0xb6,0x84,0x8f,0xb5,0x90,0x9d,0xbd,0xa1,0xad,0xc9,0xaa,0xb8,0xcf,0xa7,0xb5, 0xcc,0xa1,0xaf,0xc6,0xa9,0xb8,0xcb,0xa9,0xb8,0xcb,0xa9,0xb7,0xcd,0xa9,0xb7,0xcd, 0xaa,0xb8,0xcf,0xaa,0xb8,0xcf,0xab,0xb9,0xd0,0xab,0xb8,0xd2,0xa8,0xb9,0xd3,0xa6, 0xb7,0xd1,0xa6,0xb7,0xd1,0xa7,0xb8,0xd2,0xa9,0xba,0xd4,0xa9,0xba,0xd4,0xa7,0xb8, 0xd2,0xa5,0xb6,0xd0,0xac,0xb7,0xd2,0xa8,0xb5,0xcf,0xa7,0xb4,0xce,0xab,0xb7,0xd3, 0xaa,0xb8,0xd4,0xa8,0xb6,0xd2,0xa4,0xb8,0xca,0xa1,0xb5,0xc7,0xa6,0xb7,0xcc,0xa4, 0xb5,0xca,0xa2,0xb2,0xc9,0xa2,0xb2,0xc9,0xa2,0xb2,0xc9,0xa2,0xb1,0xcb,0xa0,0xaf, 0xc9,0x9f,0xae,0xc8,0x9e,0xb0,0xc7,0x9e,0xb0,0xc7,0xa0,0xb0,0xc7,0xa0,0xb0,0xc7, 0xa2,0xb0,0xc7,0xa3,0xb1,0xc8,0xa3,0xb1,0xc8,0xa2,0xb0,0xc7,0xa4,0xb2,0xc9,0xa4, 0xb2,0xc9,0xa4,0xb2,0xc9,0xa5,0xb3,0xca,0xa6,0xb4,0xcb,0xa6,0xb4,0xcb,0xa4,0xb2, 0xc9,0xa2,0xb0,0xc7,0x9d,0xae,0xc8,0x9f,0xae,0xc8,0x9f,0xac,0xc6,0x9e,0xa9,0xc5, 0x9d,0xa7,0xc5,0x9a,0xa5,0xc5,0x90,0x9e,0xc2,0x88,0x98,0xbc,0x7e,0x89,0xb5,0x82, 0x8e,0xb8,0x8c,0x98,0xbc,0x97,0xa5,0xc2,0xa2,0xaf,0xc9,0xa7,0xb5,0xcc,0xa6,0xb4, 0xcb,0xa6,0xb2,0xca,0xa9,0xb8,0xcb,0xa9,0xb8,0xcb,0xa9,0xb7,0xcd,0xa9,0xb7,0xcd, 0xaa,0xb8,0xcf,0xaa,0xb8,0xcf,0xab,0xb9,0xd0,0xab,0xb9,0xd0,0xa9,0xba,0xd4,0xa8, 0xb9,0xd3,0xa7,0xb8,0xd2,0xa7,0xb8,0xd2,0xa9,0xba,0xd4,0xa9,0xba,0xd4,0xa7,0xb8, 0xd2,0xa5,0xb6,0xd0,0xab,0xb8,0xd2,0xa8,0xb5,0xcf,0xa7,0xb4,0xce,0xaa,0xb7,0xd1, 0xa8,0xb7,0xd1,0xa5,0xb3,0xcf,0xa1,0xb4,0xc9,0x9e,0xb1,0xc6,0xa3,0xb4,0xc9,0xa1, 0xb1,0xc8,0xa0,0xb0,0xc7,0xa0,0xb0,0xc7,0xa1,0xb0,0xca,0xa0,0xaf,0xc9,0x9f,0xad, 0xc9,0x9e,0xac,0xc8,0x9d,0xae,0xc8,0x9d,0xae,0xc8,0x9d,0xae,0xc8,0x9f,0xae,0xc8, 0x9e,0xad,0xc7,0xa0,0xad,0xc7,0xa0,0xad,0xc7,0xa0,0xad,0xc7,0xa1,0xae,0xc8,0xa0, 0xad,0xc7,0xa1,0xae,0xc8,0xa3,0xb0,0xca,0xa4,0xb1,0xcb,0xa5,0xb2,0xcc,0xa3,0xb0, 0xca,0xa1,0xae,0xc8,0x9d,0xab,0xc2,0xa1,0xae,0xc8,0xa0,0xab,0xc7,0x9a,0xa3,0xc4, 0x9b,0xa4,0xc9,0x99,0xa5,0xcd,0x8e,0x9c,0xc6,0x7c,0x8c,0xb6,0x7d,0x86,0xb1,0x88, 0x93,0xb9,0x96,0xa2,0xc4,0xa1,0xad,0xc9,0xa3,0xb1,0xc8,0xa4,0xb1,0xc7,0xa7,0xb4, 0xca,0xaa,0xb7,0xcd,0xaa,0xb9,0xcc,0xaa,0xb9,0xcc,0xaa,0xb9,0xcc,0xaa,0xb8,0xce, 0xaa,0xb8,0xce,0xaa,0xb8,0xcf,0xab,0xb9,0xd0,0xab,0xb9,0xd0,0xa9,0xba,0xd4,0xa8, 0xb9,0xd3,0xa8,0xb9,0xd3,0xa8,0xb9,0xd3,0xa9,0xba,0xd4,0xa9,0xba,0xd4,0xa7,0xb8, 0xd2,0xa6,0xb7,0xd1,0xab,0xb9,0xcf,0xa9,0xb7,0xce,0xa8,0xb6,0xcd,0xa7,0xb6,0xd0, 0xa6,0xb5,0xcf,0xa1,0xb2,0xcd,0x9f,0xb2,0xc7,0x9c,0xaf,0xc4,0xa0,0xb0,0xc7,0x9f, 0xaf,0xc6,0x9f,0xaf,0xc6,0x9f,0xae,0xc8,0xa0,0xaf,0xc9,0xa0,0xae,0xca,0x9e,0xac, 0xc8,0x9d,0xab,0xc7,0x9b,0xae,0xc9,0x9b,0xae,0xc9,0x9d,0xae,0xc9,0x9d,0xae,0xc9, 0x9d,0xab,0xc7,0x9c,0xaa,0xc6,0x9e,0xaa,0xc6,0x9f,0xab,0xc7,0x9e,0xab,0xc5,0x9e, 0xab,0xc5,0x9f,0xac,0xc6,0xa1,0xae,0xc8,0xa3,0xb0,0xca,0xa3,0xb0,0xca,0xa2,0xaf, 0xc9,0xa0,0xad,0xc7,0xa0,0xaa,0xc2,0xa0,0xab,0xc6,0x9e,0xa7,0xc8,0x98,0xa1,0xc7, 0x91,0x9d,0xc7,0x8d,0x9a,0xc8,0x80,0x90,0xbe,0x75,0x85,0xb4,0x83,0x8e,0xb4,0x8f, 0x9b,0xbd,0x9f,0xaa,0xc8,0xa5,0xb2,0xcc,0xa3,0xb1,0xc7,0xa3,0xb1,0xc4,0xa7,0xb5, 0xc8,0xac,0xb9,0xcf,0xaa,0xba,0xcb,0xaa,0xba,0xcb,0xaa,0xb9,0xcc,0xab,0xba,0xcd, 0xab,0xb9,0xcf,0xab,0xb9,0xcf,0xaa,0xb8,0xcf,0xaa,0xb8,0xcf,0xa8,0xb9,0xd3,0xa8, 0xb9,0xd3,0xa8,0xb9,0xd3,0xa9,0xba,0xd4,0xa9,0xba,0xd4,0xa9,0xba,0xd4,0xa8,0xb9, 0xd3,0xa8,0xb9,0xd3,0xab,0xb9,0xcf,0xaa,0xb8,0xce,0xa7,0xb7,0xce,0xa7,0xb7,0xce, 0xa3,0xb4,0xce,0xa1,0xb2,0xcd,0x9f,0xb1,0xc8,0x9c,0xae,0xc5,0x9d,0xaf,0xc6,0x9d, 0xaf,0xc6,0x9c,0xad,0xc7,0x9d,0xae,0xc8,0x9e,0xaf,0xca,0x9d,0xae,0xc9,0x9b,0xab, 0xc8,0x9a,0xaa,0xc7,0x99,0xac,0xc7,0x9a,0xad,0xc8,0x9a,0xad,0xc8,0x9b,0xac,0xc7, 0x98,0xa9,0xc4,0x98,0xa6,0xc2,0x99,0xa7,0xc3,0x9a,0xa8,0xc4,0x9b,0xa7,0xc3,0x9b, 0xa7,0xc3,0x9c,0xa8,0xc4,0x9e,0xaa,0xc6,0xa1,0xad,0xc9,0xa1,0xad,0xc9,0xa0,0xac, 0xc8,0x9f,0xab,0xc7,0xa1,0xab,0xc3,0x9c,0xa7,0xc3,0x99,0xa3,0xc5,0x93,0x9f,0xc7, 0x87,0x94,0xc2,0x78,0x86,0xb6,0x73,0x83,0xb2,0x76,0x86,0xb5,0x90,0x9a,0xbc,0x98, 0xa3,0xc1,0xa0,0xad,0xc7,0xa5,0xb2,0xc8,0xa5,0xb3,0xc6,0xa5,0xb3,0xc5,0xaa,0xb5, 0xc9,0xae,0xb9,0xcd,0xaa,0xba,0xcb,0xaa,0xba,0xcb,0xab,0xbb,0xcc,0xac,0xbb,0xce, 0xab,0xba,0xcd,0xab,0xb9,0xcf,0xaa,0xb8,0xce,0xaa,0xb8,0xce,0xa5,0xb6,0xd0,0xa6, 0xb7,0xd1,0xa7,0xb8,0xd2,0xa8,0xb9,0xd3,0xa9,0xba,0xd4,0xa9,0xba,0xd4,0xa9,0xba, 0xd4,0xaa,0xbb,0xd5,0xa7,0xb8,0xcd,0xa8,0xb9,0xce,0xa8,0xb8,0xcf,0xa5,0xb6,0xd0, 0xa3,0xb4,0xcf,0x9f,0xb1,0xce,0xa0,0xb1,0xcb,0x9f,0xb0,0xca,0x9e,0xaf,0xc9,0x9d, 0xae,0xc8,0x9d,0xae,0xc8,0x9e,0xaf,0xca,0x9e,0xaf,0xca,0x9d,0xad,0xca,0x9b,0xab, 0xc8,0x99,0xa9,0xc6,0x93,0xa8,0xc4,0x97,0xa9,0xc6,0x97,0xa9,0xc6,0x95,0xa7,0xc4, 0x93,0xa3,0xc0,0x91,0xa1,0xbe,0x94,0xa2,0xbf,0x95,0xa3,0xc0,0x99,0xa5,0xc1,0x99, 0xa5,0xc1,0x9a,0xa6,0xc2,0x9c,0xa8,0xc4,0x9e,0xaa,0xc6,0x9e,0xaa,0xc6,0x9d,0xa9, 0xc5,0x9c,0xa8,0xc4,0x9d,0xa9,0xc1,0x97,0xa2,0xc0,0x90,0x9e,0xc2,0x8a,0x97,0xc3, 0x7a,0x89,0xb7,0x6d,0x7c,0xaa,0x72,0x82,0xad,0x82,0x8f,0xbb,0x99,0xa5,0xc1,0x9c, 0xa9,0xc3,0xa0,0xae,0xc4,0xa3,0xb1,0xc3,0xa5,0xb4,0xc4,0xaa,0xb7,0xc7,0xac,0xb8, 0xca,0xae,0xba,0xcc,0xaa,0xba,0xca,0xab,0xbb,0xcc,0xac,0xbc,0xcd,0xac,0xbc,0xcd, 0xac,0xbb,0xce,0xab,0xba,0xcd,0xaa,0xb8,0xce,0xa9,0xb7,0xcd,0xa4,0xb5,0xcf,0xa5, 0xb6,0xd0,0xa7,0xb8,0xd2,0xa8,0xb9,0xd3,0xa8,0xb9,0xd3,0xa8,0xb9,0xd3,0xa8,0xb9, 0xd3,0xa9,0xba,0xd4,0xa4,0xb4,0xcb,0xa7,0xb6,0xd0,0xa6,0xb7,0xd2,0xa3,0xb3,0xd0, 0x9f,0xb1,0xd0,0x9d,0xad,0xd1,0xa2,0xb3,0xcd,0xa2,0xb3,0xcd,0x9e,0xb2,0xcb,0x9d, 0xb1,0xca,0x9d,0xb0,0xcb,0x9d,0xb0,0xcb,0x9d,0xaf,0xcc,0x9c,0xae,0xcb,0x99,0xab, 0xc8,0x97,0xa9,0xc6,0x92,0xa6,0xc5,0x94,0xa8,0xc7,0x97,0xa9,0xc8,0x94,0xa6,0xc5, 0x8f,0xa1,0xc0,0x8f,0x9e,0xbe,0x8f,0x9e,0xbe,0x91,0xa0,0xc0,0x96,0xa2,0xbe,0x96, 0xa2,0xbe,0x96,0xa2,0xbe,0x98,0xa4,0xc0,0x9a,0xa6,0xc2,0x9a,0xa6,0xc2,0x99,0xa5, 0xc1,0x97,0xa3,0xbf,0x93,0xa2,0xbc,0x90,0x9f,0xbf,0x8a,0x9a,0xbf,0x7c,0x8d,0xb8, 0x71,0x81,0xaf,0x71,0x81,0xac,0x82,0x8e,0xb6,0x93,0x9f,0xc3,0x9b,0xa8,0xc2,0x9e, 0xaa,0xc2,0xa1,0xaf,0xc2,0xa4,0xb3,0xc3,0xa9,0xb6,0xc6,0xac,0xb9,0xc9,0xb0,0xba, 0xcb,0xb1,0xbb,0xcd,0xaa,0xba,0xca,0xab,0xbb,0xcb,0xac,0xbc,0xcd,0xad,0xbd,0xce, 0xad,0xbd,0xce,0xab,0xba,0xcd,0xaa,0xb9,0xcc,0xa9,0xb8,0xcb,0xa5,0xb6,0xd0,0xa6, 0xb7,0xd1,0xa8,0xb9,0xd3,0xa8,0xb9,0xd3,0xa6,0xb7,0xd1,0xa5,0xb6,0xd0,0xa6,0xb7, 0xd1,0xa7,0xb8,0xd2,0x9f,0xb0,0xca,0xa3,0xb4,0xcf,0xa4,0xb4,0xd1,0x9e,0xaf,0xd0, 0x9a,0xaa,0xce,0x99,0xa8,0xcf,0xa4,0xb5,0xcf,0xa5,0xb6,0xd1,0x9f,0xb3,0xcc,0x9e, 0xb2,0xcb,0x9e,0xb1,0xcc,0x9e,0xb1,0xcc,0x9e,0xb0,0xcd,0x9c,0xae,0xcb,0x99,0xab, 0xc8,0x97,0xa9,0xc8,0x93,0xa7,0xc6,0x95,0xa9,0xc8,0x96,0xaa,0xc9,0x95,0xa7,0xc6, 0x90,0xa2,0xc1,0x8f,0x9e,0xbe,0x90,0x9f,0xbf,0x92,0xa1,0xc1,0x94,0xa0,0xbc,0x94, 0xa0,0xbc,0x94,0xa0,0xbc,0x96,0xa2,0xbe,0x97,0xa3,0xbf,0x98,0xa4,0xc0,0x96,0xa2, 0xbe,0x94,0xa0,0xbc,0x8b,0x9c,0xb7,0x8e,0xa0,0xbf,0x85,0x97,0xbc,0x73,0x84,0xaf, 0x6c,0x7c,0xaa,0x7b,0x89,0xb3,0x91,0x9d,0xc1,0x9e,0xa9,0xc9,0x9a,0xa6,0xbe,0x9d, 0xaa,0xc0,0xa2,0xb0,0xc2,0xa5,0xb4,0xc4,0xaa,0xb7,0xc5,0xad,0xba,0xc8,0xb1,0xbb, 0xcc,0xb3,0xbd,0xcf,0xaa,0xba,0xca,0xab,0xbb,0xcb,0xac,0xbc,0xcc,0xad,0xbd,0xce, 0xad,0xbd,0xce,0xab,0xba,0xcd,0xaa,0xb9,0xcc,0xa8,0xb7,0xca,0xa6,0xb7,0xd1,0xa8, 0xb9,0xd3,0xa9,0xba,0xd4,0xa8,0xb9,0xd3,0xa5,0xb6,0xd0,0xa3,0xb4,0xce,0xa3,0xb4, 0xce,0xa4,0xb5,0xcf,0x9e,0xaf,0xca,0xa1,0xb1,0xce,0xa2,0xb1,0xd1,0x9a,0xaa,0xce, 0x96,0xa5,0xcc,0x92,0xa2,0xcc,0xa9,0xb9,0xd0,0xa9,0xb9,0xd0,0xa5,0xb9,0xd2,0xa2, 0xb6,0xcf,0xa0,0xb3,0xce,0x9f,0xb2,0xcd,0x9f,0xb1,0xce,0x9e,0xb0,0xcf,0x9b,0xac, 0xcd,0x99,0xaa,0xcb,0x91,0xa2,0xc9,0x92,0xa3,0xca,0x93,0xa5,0xca,0x93,0xa3,0xc8, 0x90,0xa0,0xc4,0x8d,0x9e,0xbf,0x8e,0x9d,0xbe,0x8e,0x9d,0xbd,0x8e,0x9c,0xc0,0x8f, 0x9d,0xc1,0x91,0xa0,0xc1,0x93,0xa2,0xc3,0x94,0xa3,0xc4,0x93,0xa2,0xc3,0x8f,0x9e, 0xbe,0x8c,0x9b,0xbb,0x8b,0x99,0xbd,0x85,0x95,0xba,0x80,0x90,0xba,0x78,0x88,0xb2, 0x74,0x85,0xac,0x86,0x94,0xb8,0x97,0xa5,0xc2,0x99,0xa6,0xc0,0xa0,0xab,0xbf,0xa2, 0xad,0xc1,0xa4,0xaf,0xc3,0xa5,0xb0,0xc4,0xa7,0xb2,0xc6,0xa9,0xb4,0xc8,0xac,0xb7, 0xcb,0xae,0xb9,0xcd,0xab,0xb9,0xcc,0xad,0xbb,0xce,0xac,0xbb,0xce,0xaa,0xb8,0xce, 0xa8,0xb6,0xcc,0xa5,0xb6,0xcb,0xa6,0xb7,0xcc,0xa8,0xb9,0xce,0xaa,0xbb,0xd0,0xaa, 0xbb,0xd0,0xa9,0xb9,0xd0,0xa8,0xb8,0xcf,0xaa,0xb8,0xcf,0xa9,0xb7,0xce,0xa7,0xb5, 0xcc,0xa5,0xb3,0xca,0x9a,0xad,0xd3,0x9c,0xad,0xd4,0x9a,0xab,0xd2,0x93,0xa4,0xcb, 0x8d,0x9c,0xc3,0x8c,0x9c,0xc1,0xaa,0xba,0xd1,0xaa,0xba,0xd1,0xa6,0xbb,0xd1,0xa4, 0xb8,0xd1,0xa2,0xb6,0xcf,0xa1,0xb4,0xcf,0xa1,0xb3,0xd0,0xa0,0xb2,0xd1,0x9d,0xae, 0xcf,0x9b,0xac,0xcd,0x94,0xa5,0xcc,0x95,0xa7,0xcc,0x95,0xa7,0xcc,0x95,0xa5,0xc9, 0x92,0xa2,0xc6,0x8e,0x9f,0xc0,0x8e,0x9d,0xbe,0x8e,0x9d,0xbd,0x90,0x9f,0xc0,0x8f, 0x9e,0xbf,0x8f,0x9e,0xbf,0x90,0x9f,0xc0,0x91,0xa0,0xc1,0x91,0xa0,0xc1,0x8f,0x9e, 0xbf,0x8d,0x9c,0xbd,0x88,0x96,0xba,0x85,0x95,0xba,0x81,0x91,0xbb,0x78,0x88,0xb3, 0x70,0x80,0xaa,0x81,0x8f,0xb3,0x94,0xa2,0xbf,0x99,0xa6,0xc0,0xa0,0xab,0xbf,0xa2, 0xad,0xc1,0xa4,0xaf,0xc3,0xa6,0xb1,0xc5,0xa7,0xb2,0xc6,0xa9,0xb4,0xc8,0xac,0xb7, 0xcb,0xaf,0xba,0xce,0xac,0xba,0xcd,0xad,0xbb,0xce,0xad,0xbc,0xcf,0xac,0xbb,0xce, 0xaa,0xb9,0xcc,0xa7,0xb8,0xcd,0xa9,0xba,0xcf,0xaa,0xbb,0xd0,0xad,0xbb,0xd1,0xac, 0xba,0xd0,0xaa,0xb8,0xcf,0xa7,0xb6,0xd0,0xa6,0xb4,0xd0,0xa4,0xb2,0xcf,0xa3,0xb0, 0xd0,0xa1,0xae,0xce,0x90,0xa1,0xc8,0x90,0xa1,0xc8,0x91,0xa2,0xc9,0x93,0xa3,0xc8, 0x95,0xa5,0xca,0x99,0xa7,0xcb,0xac,0xbc,0xd3,0xac,0xbc,0xd3,0xaa,0xbd,0xd2,0xa8, 0xba,0xd1,0xa6,0xb8,0xcf,0xa5,0xb6,0xd0,0xa5,0xb6,0xd1,0xa4,0xb4,0xd1,0xa2,0xb1, 0xd1,0xa0,0xaf,0xcf,0x98,0xaa,0xcf,0x99,0xab,0xd0,0x99,0xac,0xcf,0x98,0xa8,0xcc, 0x94,0xa5,0xc6,0x90,0xa1,0xc2,0x8f,0x9e,0xbf,0x8e,0x9d,0xbe,0x91,0xa0,0xc1,0x8f, 0x9e,0xbf,0x8e,0x9d,0xbe,0x8d,0x9c,0xbd,0x8e,0x9d,0xbe,0x8e,0x9d,0xbe,0x8e,0x9d, 0xbe,0x8d,0x9c,0xbd,0x84,0x92,0xb6,0x83,0x93,0xb8,0x82,0x92,0xbc,0x76,0x86,0xb1, 0x6b,0x7b,0xa5,0x7b,0x89,0xad,0x91,0x9f,0xbc,0x98,0xa5,0xbf,0xa1,0xac,0xc0,0xa3, 0xae,0xc2,0xa5,0xb0,0xc4,0xa7,0xb2,0xc6,0xa8,0xb3,0xc7,0xaa,0xb5,0xc9,0xad,0xb8, 0xcc,0xaf,0xba,0xce,0xad,0xbc,0xcc,0xae,0xbc,0xce,0xad,0xbd,0xce,0xac,0xbb,0xce, 0xaa,0xb9,0xcc,0xa8,0xb9,0xce,0xa8,0xb9,0xce,0xa9,0xba,0xcf,0xaa,0xb8,0xcb,0xaa, 0xb7,0xcd,0xa9,0xb6,0xd0,0xa6,0xb4,0xd0,0xa3,0xaf,0xd1,0x9e,0xab,0xd1,0x98,0xa7, 0xce,0x96,0xa4,0xce,0x8a,0x9a,0xc4,0x8c,0x9b,0xc2,0x8f,0x9f,0xc4,0x96,0xa6,0xca, 0xa1,0xb0,0xd1,0xa6,0xb5,0xd5,0xad,0xbe,0xd3,0xad,0xbe,0xd3,0xaa,0xbd,0xd2,0xa9, 0xbc,0xd1,0xa8,0xba,0xd1,0xa7,0xb9,0xd0,0xa6,0xb7,0xd1,0xa5,0xb6,0xd1,0xa4,0xb4, 0xd1,0xa3,0xb3,0xd0,0x9d,0xb0,0xd3,0x9d,0xb0,0xd3,0x9c,0xaf,0xd0,0x9b,0xac,0xcd, 0x96,0xa7,0xc8,0x91,0xa2,0xc3,0x90,0x9f,0xc0,0x8f,0x9e,0xbf,0x8f,0x9e,0xbe,0x8e, 0x9d,0xbd,0x8d,0x9c,0xbd,0x8c,0x9b,0xbc,0x8d,0x9c,0xbd,0x8d,0x9c,0xbd,0x8c,0x9a, 0xbe,0x8a,0x98,0xbc,0x83,0x91,0xb5,0x81,0x90,0xb7,0x7e,0x8e,0xb9,0x73,0x83,0xae, 0x69,0x79,0xa3,0x7a,0x87,0xad,0x90,0x9d,0xbd,0x98,0xa4,0xc0,0xa1,0xac,0xc0,0xa3, 0xae,0xc2,0xa6,0xb1,0xc5,0xa8,0xb3,0xc7,0xa9,0xb4,0xc8,0xab,0xb6,0xca,0xad,0xb8, 0xcc,0xaf,0xba,0xce,0xae,0xbd,0xcd,0xae,0xbd,0xcd,0xac,0xbc,0xcd,0xab,0xbb,0xcc, 0xa9,0xb8,0xcb,0xa5,0xb6,0xcb,0xa4,0xb4,0xcb,0xa3,0xb3,0xca,0xa5,0xb2,0xc8,0xa6, 0xb2,0xca,0xa5,0xb1,0xcd,0xa2,0xaf,0xcf,0x9c,0xa9,0xcf,0x95,0xa3,0xcd,0x90,0x9f, 0xcd,0x8e,0x9c,0xcc,0x93,0xa2,0xc9,0x95,0xa1,0xc9,0x98,0xa6,0xca,0xa0,0xaf,0xd0, 0xab,0xb9,0xd6,0xae,0xbd,0xd7,0xae,0xbf,0xd4,0xae,0xbf,0xd4,0xab,0xbc,0xcf,0xab, 0xbc,0xcf,0xaa,0xbb,0xd0,0xa9,0xb9,0xd0,0xa8,0xb7,0xd1,0xa7,0xb6,0xd0,0xa7,0xb5, 0xd1,0xa7,0xb5,0xd1,0x9f,0xb3,0xd2,0x9f,0xb3,0xd2,0x9e,0xb1,0xd2,0x9d,0xae,0xcf, 0x97,0xa8,0xc9,0x92,0xa3,0xc4,0x91,0xa0,0xc1,0x90,0x9f,0xc0,0x8e,0x9e,0xbb,0x8d, 0x9c,0xbc,0x8d,0x9c,0xbc,0x8d,0x9c,0xbd,0x8d,0x9c,0xbd,0x8c,0x9a,0xbe,0x89,0x97, 0xbb,0x87,0x94,0xba,0x81,0x8e,0xb4,0x7d,0x8c,0xb3,0x79,0x89,0xb4,0x6f,0x7e,0xac, 0x69,0x79,0xa4,0x7c,0x89,0xaf,0x92,0x9f,0xbf,0x98,0xa4,0xc0,0x9f,0xaa,0xbe,0xa2, 0xad,0xc1,0xa5,0xb0,0xc4,0xa7,0xb2,0xc6,0xa9,0xb4,0xc8,0xaa,0xb5,0xc9,0xac,0xb7, 0xcb,0xad,0xb8,0xcc,0xab,0xba,0xca,0xab,0xba,0xca,0xa9,0xb9,0xca,0xa9,0xb8,0xcb, 0xa8,0xb6,0xcc,0xa4,0xb4,0xcb,0xa2,0xb1,0xcb,0xa1,0xaf,0xcb,0xa3,0xaf,0xcb,0xa1, 0xac,0xca,0x9b,0xa8,0xc8,0x94,0xa2,0xc6,0x90,0x9c,0xc4,0x8e,0x9b,0xc7,0x8f,0x9e, 0xcc,0x92,0xa0,0xd0,0x9e,0xac,0xd0,0x9f,0xad,0xd1,0xa5,0xb2,0xd2,0xa8,0xb6,0xd3, 0xad,0xba,0xd4,0xae,0xbc,0xd2,0xae,0xbf,0xd2,0xae,0xbf,0xd2,0xaa,0xbc,0xcd,0xab, 0xbd,0xce,0xab,0xbc,0xcf,0xaa,0xbb,0xd0,0xa8,0xb8,0xcf,0xa7,0xb6,0xd0,0xa8,0xb7, 0xd1,0xa8,0xb6,0xd2,0x9e,0xb3,0xcf,0x9f,0xb4,0xd0,0x9e,0xb2,0xd1,0x9d,0xaf,0xce, 0x98,0xa9,0xca,0x94,0xa5,0xc6,0x93,0xa2,0xc3,0x92,0xa1,0xc2,0x8d,0x9d,0xba,0x8d, 0x9d,0xba,0x8d,0x9c,0xbc,0x8d,0x9c,0xbd,0x8d,0x9c,0xbd,0x8b,0x99,0xbd,0x88,0x95, 0xbb,0x85,0x92,0xb8,0x80,0x8d,0xb3,0x7a,0x88,0xb2,0x75,0x84,0xb2,0x6c,0x7b,0xa9, 0x66,0x76,0xa1,0x7b,0x87,0xaf,0x91,0x9d,0xbf,0x98,0xa3,0xc1,0x9d,0xa8,0xbc,0xa0, 0xab,0xbf,0xa4,0xaf,0xc3,0xa6,0xb1,0xc5,0xa7,0xb2,0xc6,0xa9,0xb4,0xc8,0xaa,0xb5, 0xc9,0xab,0xb6,0xca,0xa7,0xb5,0xc7,0xa7,0xb5,0xc8,0xa6,0xb4,0xca,0xa6,0xb4,0xcb, 0xa7,0xb4,0xce,0xa4,0xb2,0xcf,0xa1,0xae,0xce,0x9f,0xac,0xcc,0x9a,0xaa,0xcf,0x97, 0xa7,0xcc,0x90,0xa0,0xc5,0x8c,0x99,0xbf,0x8a,0x96,0xbe,0x8f,0x9b,0xc3,0x99,0xa5, 0xcd,0xa1,0xad,0xd7,0xa4,0xb2,0xcf,0xa7,0xb5,0xd2,0xab,0xb7,0xd3,0xac,0xb9,0xd3, 0xad,0xba,0xd0,0xad,0xbb,0xce,0xae,0xbf,0xd2,0xae,0xbf,0xd2,0xaa,0xbd,0xcc,0xab, 0xbe,0xcd,0xac,0xbe,0xcf,0xab,0xbc,0xcf,0xa9,0xba,0xcf,0xa8,0xb8,0xcf,0xa9,0xb9, 0xd0,0xaa,0xb9,0xd3,0x9c,0xb1,0xcc,0x9d,0xb2,0xce,0x9d,0xb2,0xce,0x9c,0xae,0xcd, 0x98,0xaa,0xc9,0x94,0xa5,0xc6,0x94,0xa3,0xc4,0x93,0xa1,0xc5,0x90,0xa1,0xbc,0x8e, 0x9e,0xbb,0x8c,0x9c,0xb9,0x8b,0x9a,0xba,0x8b,0x99,0xbd,0x8a,0x97,0xbd,0x88,0x95, 0xbb,0x86,0x92,0xba,0x7c,0x88,0xb0,0x79,0x87,0xb1,0x75,0x84,0xb2,0x6a,0x78,0xa8, 0x62,0x71,0x9f,0x75,0x81,0xa9,0x8e,0x9a,0xbc,0x98,0xa3,0xc1,0x9b,0xa6,0xba,0x9e, 0xa9,0xbd,0xa2,0xad,0xc1,0xa5,0xb0,0xc4,0xa6,0xb1,0xc5,0xa7,0xb2,0xc6,0xa8,0xb3, 0xc7,0xa9,0xb4,0xc8,0xa5,0xb3,0xc6,0xa4,0xb1,0xc7,0xa2,0xb0,0xc7,0xa2,0xae,0xca, 0xa1,0xac,0xca,0x9d,0xa9,0xcb,0x99,0xa5,0xc9,0x96,0xa2,0xc6,0x89,0x99,0xc7,0x8b, 0x9b,0xc9,0x8e,0x9e,0xc9,0x90,0x9f,0xc6,0x93,0xa0,0xc6,0x9a,0xa6,0xc8,0xa2,0xaf, 0xcf,0xaa,0xb5,0xd5,0xa9,0xb7,0xce,0xab,0xb9,0xd0,0xad,0xbb,0xd1,0xaf,0xbc,0xd2, 0xae,0xbc,0xcf,0xb0,0xbb,0xcf,0xae,0xbf,0xd2,0xad,0xbe,0xd1,0xab,0xbe,0xcd,0xac, 0xbf,0xce,0xad,0xbf,0xd0,0xac,0xbd,0xd0,0xaa,0xbb,0xd0,0xa9,0xba,0xcf,0xaa,0xba, 0xd1,0xac,0xbc,0xd3,0x9b,0xb0,0xcb,0x9c,0xb1,0xcc,0x9c,0xb1,0xcd,0x9c,0xae,0xcb, 0x98,0xaa,0xc9,0x95,0xa6,0xc7,0x95,0xa4,0xc5,0x94,0xa2,0xc6,0x92,0xa3,0xbe,0x8f, 0xa0,0xbb,0x8b,0x9b,0xb8,0x89,0x98,0xb8,0x89,0x97,0xbb,0x89,0x96,0xbc,0x89,0x95, 0xbd,0x88,0x94,0xbc,0x79,0x85,0xad,0x79,0x87,0xb1,0x77,0x86,0xb4,0x6a,0x78,0xa8, 0x5e,0x6d,0x9b,0x6f,0x7b,0xa3,0x8b,0x97,0xb9,0x97,0xa2,0xc0,0x99,0xa4,0xb8,0x9c, 0xa7,0xbb,0xa1,0xac,0xc0,0xa3,0xae,0xc2,0xa5,0xb0,0xc4,0xa6,0xb1,0xc5,0xa7,0xb2, 0xc6,0xa8,0xb3,0xc7,0xa5,0xb2,0xc8,0xa3,0xaf,0xc7,0x9f,0xac,0xc6,0x9d,0xa8,0xc6, 0x9b,0xa5,0xc7,0x95,0xa1,0xc5,0x8f,0x9a,0xc0,0x8b,0x95,0xbd,0x75,0x88,0xbb,0x7f, 0x93,0xc3,0x91,0xa1,0xcf,0x9b,0xab,0xd5,0xa3,0xb1,0xd5,0xa5,0xb3,0xd0,0xa9,0xb4, 0xcf,0xa9,0xb5,0xcd,0xae,0xbd,0xd0,0xae,0xbd,0xd0,0xb0,0xbe,0xd1,0xb0,0xbe,0xd1, 0xb3,0xbe,0xd2,0xb3,0xbe,0xd2,0xac,0xc0,0xd2,0xac,0xc0,0xd2,0xad,0xbf,0xd0,0xac, 0xbe,0xcf,0xac,0xbd,0xd0,0xab,0xbc,0xcf,0xab,0xbc,0xcf,0xaa,0xbb,0xd0,0xa9,0xba, 0xcf,0xa9,0xba,0xcf,0xa4,0xb5,0xd0,0xa3,0xb4,0xcf,0xa1,0xb1,0xce,0x9f,0xaf,0xcc, 0x9e,0xae,0xcb,0x9c,0xab,0xcb,0x99,0xa8,0xc8,0x97,0xa6,0xc6,0x93,0xa3,0xc0,0x94, 0xa3,0xc3,0x94,0xa3,0xc3,0x90,0x9f,0xc0,0x8b,0x99,0xbd,0x88,0x95,0xbb,0x89,0x95, 0xbd,0x8c,0x98,0xc0,0x72,0x85,0xb0,0x79,0x89,0xb7,0x76,0x86,0xb5,0x65,0x74,0xa5, 0x55,0x63,0x94,0x5a,0x68,0x98,0x76,0x83,0xb1,0x90,0x9d,0xc9,0x98,0xa2,0xc0,0x98, 0xa1,0xbc,0x9e,0xa7,0xbb,0xa6,0xaf,0xbd,0xa6,0xaf,0xbd,0xa1,0xaa,0xbe,0xa1,0xaa, 0xc5,0xa5,0xaf,0xcd,0xa4,0xae,0xbf,0x9f,0xac,0xc2,0x98,0xa5,0xc5,0x8e,0x9e,0xc8, 0x87,0x97,0xc6,0x84,0x94,0xc3,0x83,0x92,0xc0,0x84,0x91,0xbd,0x96,0x9f,0xc4,0x99, 0xa2,0xc7,0x9f,0xa8,0xca,0xa3,0xac,0xcd,0xa6,0xb1,0xcd,0xaa,0xb3,0xce,0xad,0xb7, 0xcf,0xaf,0xb9,0xd1,0xb2,0xc0,0xd2,0xb1,0xbf,0xd1,0xb1,0xbf,0xd1,0xb1,0xbf,0xd1, 0xb1,0xbf,0xd1,0xb1,0xbf,0xd1,0xad,0xc1,0xd3,0xad,0xc1,0xd3,0xad,0xbf,0xd0,0xad, 0xbf,0xd0,0xac,0xbd,0xd0,0xac,0xbd,0xd0,0xab,0xbc,0xcf,0xaa,0xbb,0xd0,0xa9,0xba, 0xcf,0xa9,0xba,0xcf,0xa4,0xb5,0xd0,0xa2,0xb3,0xce,0xa0,0xb1,0xcc,0x9f,0xaf,0xcc, 0x9f,0xaf,0xcc,0x9d,0xac,0xcc,0x9b,0xaa,0xca,0x99,0xa8,0xc8,0x93,0xa3,0xc0,0x94, 0xa3,0xc3,0x94,0xa3,0xc3,0x91,0xa0,0xc1,0x8d,0x9b,0xbf,0x88,0x95,0xbb,0x86,0x92, 0xba,0x85,0x91,0xb9,0x7c,0x8d,0xb8,0x76,0x86,0xb4,0x6e,0x7e,0xad,0x63,0x72,0xa3, 0x54,0x62,0x93,0x4f,0x5d,0x8d,0x66,0x73,0xa1,0x80,0x8d,0xb9,0x98,0xa2,0xc0,0x97, 0xa2,0xbd,0x9d,0xa6,0xba,0xa3,0xab,0xbc,0xa5,0xad,0xbe,0xa2,0xab,0xbf,0x9e,0xa9, 0xc4,0xa0,0xaa,0xc8,0xa4,0xb1,0xc7,0x9a,0xa6,0xc2,0x8b,0x9a,0xbb,0x81,0x91,0xbb, 0x83,0x93,0xbe,0x8a,0x9a,0xc5,0x96,0xa2,0xca,0x9c,0xa7,0xcd,0x9c,0xa6,0xc8,0x9f, 0xaa,0xca,0xa4,0xae,0xcc,0xa7,0xb2,0xce,0xa9,0xb4,0xcf,0xad,0xb7,0xcf,0xb0,0xbb, 0xd1,0xb2,0xbd,0xd3,0xb0,0xbe,0xd0,0xaf,0xbd,0xcf,0xaf,0xbd,0xcf,0xb0,0xbe,0xd0, 0xb0,0xbe,0xd0,0xb0,0xbe,0xd0,0xae,0xc2,0xd4,0xae,0xc2,0xd4,0xaf,0xc1,0xd2,0xae, 0xc0,0xd1,0xad,0xbe,0xd1,0xac,0xbd,0xd0,0xab,0xbc,0xcf,0xaa,0xbb,0xd0,0xa9,0xba, 0xcf,0xa8,0xb9,0xce,0xa3,0xb4,0xce,0xa1,0xb2,0xcd,0xa0,0xb1,0xcc,0x9f,0xb0,0xcb, 0x9f,0xaf,0xcc,0x9f,0xaf,0xcc,0x9d,0xac,0xcc,0x9c,0xab,0xcb,0x99,0xa9,0xc6,0x99, 0xa8,0xc8,0x98,0xa7,0xc7,0x97,0xa6,0xc7,0x94,0xa2,0xc6,0x8f,0x9c,0xc2,0x88,0x94, 0xbc,0x83,0x8f,0xb7,0x83,0x95,0xbe,0x76,0x87,0xb2,0x6f,0x7f,0xae,0x6e,0x7c,0xac, 0x63,0x71,0xa1,0x57,0x63,0x93,0x5e,0x6b,0x97,0x72,0x80,0xaa,0x8f,0x9a,0xb8,0x92, 0x9f,0xb9,0x98,0xa3,0xb9,0x9c,0xa5,0xb9,0x9f,0xa8,0xbc,0xa0,0xab,0xc1,0x9c,0xa9, 0xc3,0x99,0xa4,0xc2,0x91,0xa0,0xc0,0x8d,0x9c,0xbd,0x89,0x99,0xbe,0x8c,0x9a,0xc4, 0x94,0xa3,0xca,0x9c,0xaa,0xce,0xa1,0xac,0xcc,0xa1,0xac,0xc8,0xa1,0xad,0xc9,0xa4, 0xb0,0xcc,0xa8,0xb3,0xce,0xaa,0xb6,0xce,0xab,0xb8,0xce,0xaf,0xba,0xce,0xb1,0xbc, 0xd0,0xb3,0xbf,0xd1,0xad,0xbb,0xcd,0xad,0xbb,0xcd,0xae,0xbc,0xce,0xae,0xbc,0xce, 0xaf,0xbd,0xcf,0xb0,0xbe,0xd0,0xaf,0xc3,0xd5,0xb0,0xc4,0xd6,0xb0,0xc2,0xd3,0xaf, 0xc1,0xd2,0xae,0xbf,0xd2,0xad,0xbe,0xd1,0xab,0xbc,0xcf,0xaa,0xbb,0xd0,0xa9,0xba, 0xcf,0xa8,0xb9,0xce,0xa2,0xb3,0xcd,0xa1,0xb2,0xcc,0x9f,0xb0,0xcb,0x9f,0xb0,0xcb, 0xa0,0xb1,0xcc,0xa0,0xb0,0xcd,0x9f,0xaf,0xcc,0x9e,0xae,0xcb,0x9e,0xae,0xcb,0x9c, 0xab,0xcb,0x9a,0xa9,0xc9,0x99,0xa8,0xc9,0x99,0xa7,0xcb,0x95,0xa2,0xc8,0x8d,0x99, 0xc1,0x87,0x93,0xbb,0x81,0x93,0xbc,0x79,0x8a,0xb5,0x77,0x86,0xb4,0x7a,0x88,0xb8, 0x78,0x84,0xb4,0x6c,0x79,0xa7,0x69,0x74,0xa0,0x6e,0x7a,0xa4,0x7a,0x89,0xa9,0x86, 0x94,0xb1,0x90,0x9d,0xb7,0x94,0xa0,0xb8,0x96,0xa2,0xba,0x99,0xa6,0xc0,0x97,0xa5, 0xc2,0x91,0xa0,0xc0,0x82,0x93,0xba,0x87,0x98,0xbf,0x91,0xa0,0xc7,0x9d,0xa9,0xd1, 0xa5,0xb1,0xd5,0xa7,0xb2,0xd0,0xa4,0xae,0xc6,0x9f,0xaa,0xbe,0xa3,0xb1,0xc8,0xa5, 0xb3,0xc9,0xa8,0xb5,0xcb,0xaa,0xb8,0xcb,0xaa,0xb8,0xcb,0xad,0xb9,0xcb,0xaf,0xbb, 0xcd,0xb1,0xbe,0xce,0xac,0xba,0xcc,0xac,0xba,0xcc,0xad,0xbb,0xcd,0xae,0xbc,0xce, 0xaf,0xbd,0xcf,0xb0,0xbe,0xd0,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xb0,0xc2,0xd3,0xb0, 0xc2,0xd3,0xaf,0xc0,0xd3,0xad,0xbe,0xd1,0xac,0xbd,0xd0,0xaa,0xbb,0xd0,0xa9,0xba, 0xcf,0xa9,0xba,0xcf,0xa3,0xb4,0xce,0xa1,0xb2,0xcc,0x9f,0xb0,0xca,0x9f,0xb0,0xcb, 0x9f,0xb0,0xcb,0xa0,0xb1,0xcc,0x9f,0xaf,0xcc,0x9f,0xaf,0xcc,0x9e,0xae,0xcb,0x99, 0xa8,0xc8,0x95,0xa4,0xc4,0x95,0xa4,0xc5,0x96,0xa4,0xc8,0x95,0xa2,0xc8,0x90,0x9c, 0xc4,0x8b,0x97,0xbf,0x80,0x90,0xba,0x7e,0x8e,0xb8,0x7b,0x8a,0xb8,0x7a,0x87,0xb5, 0x7b,0x88,0xb6,0x7d,0x87,0xb6,0x76,0x82,0xac,0x6e,0x7a,0xa4,0x6b,0x7b,0x9f,0x7a, 0x89,0xaa,0x88,0x94,0xb6,0x8e,0x99,0xb9,0x8e,0x99,0xb9,0x8d,0x99,0xbb,0x8c,0x9b, 0xbc,0x8a,0x9a,0xbe,0x8a,0x9c,0xc5,0x8f,0x9f,0xc9,0x96,0xa5,0xcc,0x9d,0xa9,0xcd, 0xa1,0xac,0xcc,0xa5,0xae,0xc9,0xa8,0xb3,0xc7,0xad,0xb7,0xc8,0xa4,0xb3,0xc6,0xa6, 0xb5,0xc8,0xa8,0xb6,0xc9,0xa9,0xb7,0xc9,0xa9,0xb7,0xc9,0xab,0xb7,0xc9,0xad,0xba, 0xca,0xaf,0xbc,0xcc,0xab,0xb9,0xcb,0xac,0xba,0xcc,0xae,0xbc,0xce,0xaf,0xbd,0xcf, 0xb0,0xbe,0xd0,0xb0,0xbe,0xd0,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xb0,0xc2,0xd3,0xb0, 0xc2,0xd3,0xaf,0xc0,0xd3,0xae,0xbf,0xd2,0xac,0xbd,0xd0,0xab,0xbc,0xd1,0xaa,0xbb, 0xd0,0xaa,0xbb,0xd0,0xa4,0xb6,0xcd,0xa2,0xb4,0xcb,0x9f,0xb0,0xca,0x9e,0xaf,0xc9, 0x9e,0xaf,0xca,0x9e,0xaf,0xca,0x9e,0xaf,0xca,0x9d,0xad,0xca,0x9c,0xac,0xc9,0x98, 0xa7,0xc7,0x94,0xa3,0xc3,0x93,0xa2,0xc3,0x95,0xa3,0xc7,0x96,0xa3,0xc9,0x94,0xa0, 0xc8,0x91,0x9d,0xc5,0x87,0x98,0xbf,0x86,0x96,0xc0,0x7f,0x8c,0xb8,0x76,0x83,0xb1, 0x7a,0x84,0xb3,0x81,0x8c,0xb8,0x7e,0x8a,0xb4,0x76,0x80,0xa8,0x64,0x76,0x9f,0x6c, 0x7c,0xa6,0x7b,0x87,0xaf,0x83,0x8f,0xb7,0x83,0x8f,0xb7,0x81,0x8d,0xb5,0x80,0x90, 0xba,0x85,0x97,0xc0,0x8d,0xa0,0xc6,0x93,0xa5,0xca,0x9c,0xaa,0xce,0xa1,0xac,0xcc, 0xa3,0xab,0xc8,0xa5,0xaf,0xc7,0xaa,0xb5,0xc9,0xaf,0xbb,0xcd,0xa6,0xb6,0xc7,0xa7, 0xb7,0xc8,0xa9,0xb7,0xc9,0xa9,0xb7,0xc9,0xa8,0xb6,0xc8,0xab,0xb7,0xc9,0xad,0xb9, 0xcb,0xaf,0xbb,0xcd,0xab,0xb9,0xcb,0xac,0xba,0xcc,0xae,0xbc,0xce,0xaf,0xbd,0xcf, 0xb0,0xbe,0xd0,0xb0,0xbe,0xd0,0xb0,0xc4,0xd6,0xaf,0xc3,0xd5,0xb0,0xc2,0xd3,0xaf, 0xc1,0xd2,0xaf,0xc0,0xd3,0xae,0xbf,0xd2,0xad,0xbe,0xd1,0xac,0xbd,0xd2,0xab,0xbc, 0xd1,0xab,0xbc,0xd1,0xa6,0xb8,0xcf,0xa3,0xb5,0xcc,0x9f,0xb1,0xc8,0x9d,0xae,0xc8, 0x9d,0xae,0xc8,0x9d,0xae,0xc9,0x9c,0xad,0xc8,0x9b,0xac,0xc7,0x98,0xa8,0xc5,0x95, 0xa4,0xc4,0x93,0xa2,0xc2,0x93,0xa2,0xc3,0x94,0xa2,0xc6,0x95,0xa2,0xc8,0x94,0xa0, 0xc8,0x93,0x9f,0xc7,0x8e,0x9d,0xc4,0x89,0x97,0xc1,0x80,0x8d,0xb9,0x7b,0x85,0xb4, 0x7b,0x85,0xb4,0x7d,0x88,0xb4,0x7d,0x86,0xb1,0x78,0x82,0xaa,0x62,0x75,0xa2,0x60, 0x70,0x9f,0x68,0x74,0xa4,0x76,0x82,0xb2,0x7d,0x89,0xb9,0x7c,0x88,0xb8,0x7f,0x8f, 0xbe,0x88,0x9b,0xc8,0x8e,0xa1,0xc2,0x98,0xa7,0xc8,0xa3,0xae,0xcc,0xaa,0xb2,0xcf, 0xaa,0xb3,0xce,0xa9,0xb2,0xcd,0xa6,0xb2,0xca,0xa6,0xb4,0xcb,0xa5,0xb5,0xc6,0xa6, 0xb6,0xc7,0xa7,0xb5,0xc7,0xa7,0xb5,0xc7,0xa7,0xb5,0xc8,0xaa,0xb5,0xc9,0xac,0xb7, 0xcb,0xae,0xb9,0xcd,0xaa,0xb8,0xca,0xab,0xb9,0xcb,0xad,0xbb,0xcd,0xae,0xbc,0xce, 0xaf,0xbd,0xcf,0xae,0xbc,0xce,0xaf,0xc3,0xd5,0xaf,0xc3,0xd5,0xaf,0xc1,0xd2,0xaf, 0xc1,0xd2,0xaf,0xc0,0xd3,0xae,0xbf,0xd2,0xad,0xbe,0xd1,0xad,0xbe,0xd3,0xac,0xbd, 0xd2,0xac,0xbd,0xd2,0xa7,0xb9,0xd0,0xa4,0xb6,0xcd,0xa0,0xb2,0xc9,0x9d,0xae,0xc8, 0x9c,0xad,0xc7,0x9b,0xac,0xc6,0x9a,0xab,0xc6,0x99,0xaa,0xc5,0x91,0xa1,0xbe,0x90, 0x9f,0xbf,0x8f,0x9e,0xbe,0x8f,0x9e,0xbf,0x8f,0x9d,0xc1,0x90,0x9d,0xc3,0x8f,0x9b, 0xc3,0x8e,0x9a,0xc2,0x89,0x98,0xbf,0x81,0x90,0xb7,0x7c,0x89,0xb5,0x81,0x8b,0xba, 0x7f,0x89,0xb8,0x79,0x82,0xae,0x73,0x7d,0xa5,0x73,0x7d,0xa5,0x62,0x73,0xa4,0x57, 0x66,0x97,0x59,0x66,0x9a,0x6e,0x78,0xae,0x7b,0x85,0xbb,0x7c,0x89,0xbd,0x83,0x92, 0xc3,0x8f,0xa0,0xd1,0x9a,0xac,0xc9,0x9e,0xac,0xc9,0xa2,0xad,0xc9,0xa5,0xae,0xc9, 0xa9,0xb0,0xcb,0xa9,0xb2,0xcd,0xa6,0xb2,0xce,0xa4,0xb2,0xce,0xa3,0xb3,0xc4,0xa4, 0xb4,0xc5,0xa5,0xb3,0xc6,0xa5,0xb3,0xc6,0xa5,0xb3,0xc6,0xa8,0xb3,0xc7,0xaa,0xb5, 0xcb,0xac,0xb7,0xcd,0xaa,0xb8,0xca,0xab,0xb9,0xcb,0xac,0xba,0xcc,0xad,0xbb,0xcd, 0xae,0xbc,0xce,0xad,0xbb,0xcd,0xb3,0xc4,0xd7,0xb3,0xc4,0xd7,0xaf,0xc2,0xd1,0xae, 0xc1,0xd0,0xad,0xbf,0xd0,0xad,0xbf,0xd0,0xad,0xbe,0xd1,0xac,0xbd,0xd0,0xaa,0xbb, 0xce,0xa9,0xba,0xcf,0xaa,0xbc,0xd3,0xa4,0xb6,0xcd,0x9f,0xb0,0xca,0x9d,0xae,0xc9, 0x9b,0xab,0xc8,0x98,0xa8,0xc5,0x96,0xa5,0xc5,0x95,0xa4,0xc5,0x8e,0x9f,0xc6,0x8b, 0x9d,0xc2,0x8e,0xa0,0xc5,0x92,0xa4,0xc9,0x8e,0xa1,0xc4,0x83,0x96,0xb9,0x80,0x93, 0xb6,0x85,0x98,0xbb,0x81,0x91,0xbf,0x7e,0x8e,0xbc,0x7a,0x8a,0xb9,0x74,0x82,0xb3, 0x6f,0x7d,0xae,0x6d,0x78,0xac,0x6b,0x75,0xab,0x6b,0x75,0xab,0x58,0x69,0x9a,0x50, 0x5e,0x98,0x51,0x5b,0x9b,0x71,0x7c,0xb8,0x86,0x95,0xc6,0x85,0x95,0xbf,0x8f,0x9f, 0xc9,0x95,0xa4,0xd2,0x95,0xa6,0xc7,0x97,0xa9,0xc8,0x9a,0xac,0xcb,0x9f,0xb0,0xcb, 0xa2,0xb3,0xcd,0xa4,0xb4,0xcb,0xa4,0xb5,0xca,0xa3,0xb4,0xc9,0x9e,0xaf,0xc4,0x9f, 0xb0,0xc5,0xa3,0xb1,0xc7,0xa4,0xb3,0xc6,0xa4,0xb3,0xc6,0xa5,0xb3,0xc5,0xa7,0xb5, 0xc7,0xa8,0xb6,0xc8,0xab,0xb8,0xc8,0xab,0xb8,0xc8,0xab,0xb8,0xc8,0xab,0xb8,0xc8, 0xab,0xb8,0xc8,0xaa,0xb7,0xc7,0xb3,0xc4,0xd7,0xb3,0xc4,0xd7,0xb3,0xc6,0xd5,0xb1, 0xc3,0xd4,0xb0,0xc2,0xd3,0xb0,0xc2,0xd3,0xb0,0xc1,0xd4,0xae,0xbf,0xd2,0xac,0xbd, 0xd2,0xaa,0xbb,0xd0,0xa4,0xb7,0xcc,0xa1,0xb3,0xca,0x9e,0xb0,0xc7,0x9d,0xae,0xc8, 0x9c,0xad,0xc8,0x9a,0xaa,0xc7,0x98,0xa7,0xc7,0x97,0xa6,0xc6,0x94,0xa5,0xcc,0x86, 0x97,0xbe,0x7e,0x8f,0xb6,0x82,0x93,0xba,0x86,0x97,0xbe,0x84,0x95,0xbc,0x84,0x94, 0xbe,0x86,0x96,0xc0,0x79,0x89,0xb8,0x73,0x83,0xb2,0x6b,0x7b,0xaa,0x66,0x74,0xa5, 0x64,0x72,0xa3,0x65,0x70,0xa2,0x64,0x6f,0xa3,0x63,0x6e,0xa2,0x60,0x71,0xa2,0x59, 0x67,0xa1,0x56,0x61,0x9f,0x71,0x7d,0xb7,0x85,0x94,0xc5,0x87,0x97,0xc1,0x91,0xa1, 0xcb,0x93,0xa2,0xd0,0x94,0xa4,0xc8,0x97,0xa7,0xcb,0x9b,0xac,0xcd,0xa0,0xaf,0xcf, 0xa2,0xb2,0xcf,0xa2,0xb3,0xcd,0xa3,0xb2,0xcc,0xa2,0xb2,0xc9,0x9f,0xaf,0xc6,0xa0, 0xb1,0xc6,0xa2,0xb3,0xc8,0xa4,0xb2,0xc8,0xa3,0xb2,0xc5,0xa5,0xb3,0xc6,0xa6,0xb4, 0xc6,0xa8,0xb6,0xc8,0xaa,0xb6,0xc8,0xaa,0xb6,0xc8,0xa9,0xb5,0xc7,0xa8,0xb4,0xc6, 0xa8,0xb4,0xc6,0xa9,0xb5,0xc7,0xb2,0xc3,0xd6,0xb2,0xc3,0xd6,0xb4,0xc6,0xd7,0xb3, 0xc5,0xd6,0xb1,0xc2,0xd5,0xb1,0xc2,0xd5,0xb0,0xc1,0xd6,0xaf,0xc0,0xd5,0xac,0xbd, 0xd2,0xaa,0xba,0xd1,0xa4,0xb9,0xce,0xa2,0xb7,0xcd,0xa0,0xb5,0xcb,0x9d,0xb1,0xca, 0x99,0xac,0xc7,0x96,0xa8,0xc5,0x92,0xa4,0xc3,0x90,0xa2,0xc1,0x87,0x99,0xc2,0x7f, 0x91,0xba,0x7c,0x8e,0xb7,0x80,0x91,0xbc,0x81,0x91,0xbf,0x7c,0x8c,0xbb,0x77,0x86, 0xb7,0x77,0x86,0xb7,0x6e,0x7d,0xae,0x67,0x76,0xa7,0x61,0x70,0xa1,0x61,0x6f,0xa0, 0x65,0x73,0xa3,0x6c,0x78,0xa8,0x6d,0x79,0xa9,0x6d,0x7a,0xa8,0x6a,0x7b,0xac,0x63, 0x72,0xaa,0x5c,0x67,0xa5,0x6f,0x7b,0xb5,0x82,0x92,0xc1,0x88,0x98,0xc2,0x92,0xa2, 0xcc,0x8f,0x9e,0xcc,0x92,0xa4,0xc9,0x94,0xa6,0xcb,0x9a,0xaa,0xce,0x9e,0xaf,0xd0, 0xa1,0xb0,0xd1,0xa1,0xb0,0xd0,0xa0,0xb0,0xcd,0xa1,0xaf,0xcc,0x9d,0xaf,0xc6,0xa0, 0xb0,0xc7,0xa1,0xb1,0xc8,0xa1,0xb2,0xc7,0xa2,0xb0,0xc6,0xa2,0xb1,0xc4,0xa4,0xb2, 0xc5,0xa6,0xb4,0xc7,0xa6,0xb4,0xc7,0xa5,0xb3,0xc6,0xa4,0xb2,0xc5,0xa3,0xb1,0xc4, 0xa3,0xb1,0xc4,0xa4,0xb2,0xc5,0xb2,0xc3,0xd8,0xb2,0xc3,0xd8,0xb1,0xc2,0xd5,0xb0, 0xc1,0xd4,0xaf,0xc0,0xd5,0xaf,0xc0,0xd5,0xaf,0xbf,0xd6,0xae,0xbe,0xd5,0xac,0xbc, 0xd3,0xaa,0xba,0xd1,0xa3,0xb8,0xce,0xa4,0xb9,0xcf,0xa2,0xb6,0xcf,0x9d,0xb0,0xcb, 0x9a,0xac,0xc9,0x96,0xa8,0xc5,0x91,0xa3,0xc2,0x8d,0x9f,0xbe,0x76,0x8a,0xb3,0x7a, 0x8e,0xb7,0x80,0x93,0xbe,0x7e,0x90,0xbf,0x73,0x84,0xb5,0x66,0x77,0xaa,0x64,0x74, 0xa9,0x68,0x77,0xaf,0x6b,0x79,0xad,0x69,0x77,0xab,0x69,0x78,0xa9,0x6c,0x7a,0xaa, 0x71,0x7f,0xaf,0x77,0x84,0xb2,0x78,0x85,0xb1,0x78,0x85,0xb1,0x70,0x82,0xb1,0x6a, 0x79,0xb1,0x60,0x6b,0xa9,0x6f,0x7b,0xb5,0x80,0x90,0xbf,0x89,0x9a,0xc1,0x93,0xa4, 0xcb,0x8c,0x9c,0xc7,0x93,0xa4,0xcb,0x94,0xa5,0xcc,0x96,0xa7,0xce,0x9a,0xaa,0xcf, 0x9c,0xac,0xd0,0x9e,0xac,0xd0,0x9e,0xad,0xce,0x9e,0xad,0xce,0x9c,0xad,0xc7,0x9d, 0xae,0xc8,0xa0,0xaf,0xc9,0xa0,0xb0,0xc7,0x9e,0xae,0xc5,0xa0,0xae,0xc4,0xa1,0xaf, 0xc5,0xa2,0xb0,0xc6,0xa0,0xae,0xc4,0xa0,0xae,0xc4,0xa0,0xae,0xc4,0xa1,0xaf,0xc5, 0xa1,0xaf,0xc5,0xa1,0xaf,0xc5,0xb1,0xc2,0xd7,0xb1,0xc2,0xd7,0xad,0xc0,0xd5,0xac, 0xbf,0xd4,0xac,0xbe,0xd5,0xac,0xbe,0xd5,0xac,0xbe,0xd5,0xac,0xbd,0xd7,0xaa,0xbb, 0xd5,0xa8,0xb9,0xd3,0x9f,0xb3,0xcc,0xa0,0xb4,0xcd,0x9e,0xb1,0xcc,0x9a,0xac,0xc9, 0x99,0xab,0xca,0x98,0xa9,0xca,0x92,0xa2,0xc6,0x8b,0x9b,0xbf,0x74,0x86,0xaf,0x76, 0x88,0xb1,0x76,0x87,0xb2,0x71,0x81,0xb0,0x66,0x75,0xa6,0x60,0x6e,0xa2,0x64,0x72, 0xa7,0x6c,0x79,0xb1,0x70,0x7e,0xb2,0x74,0x83,0xb4,0x7a,0x89,0xba,0x7c,0x8a,0xba, 0x7a,0x89,0xb7,0x78,0x85,0xb1,0x75,0x82,0xae,0x74,0x82,0xac,0x74,0x86,0xb5,0x6f, 0x7f,0xb4,0x66,0x71,0xad,0x75,0x82,0xba,0x85,0x95,0xc3,0x8d,0x9e,0xc5,0x96,0xa7, 0xce,0x8f,0x9f,0xca,0x95,0xa7,0xd0,0x95,0xa8,0xce,0x95,0xa6,0xcd,0x95,0xa6,0xcd, 0x98,0xa7,0xce,0x99,0xa9,0xce,0x9c,0xa9,0xcf,0x9d,0xaa,0xd0,0x9b,0xac,0xc7,0x9c, 0xad,0xc8,0x9c,0xad,0xc8,0x9e,0xad,0xc7,0x9c,0xab,0xc5,0x9b,0xab,0xc2,0x9e,0xac, 0xc3,0x9f,0xad,0xc4,0x99,0xa9,0xc0,0x9b,0xab,0xc2,0x9d,0xad,0xc4,0x9e,0xae,0xc5, 0x9e,0xae,0xc5,0x9d,0xad,0xc4,0xb1,0xc1,0xd8,0xb1,0xc1,0xd8,0xae,0xc0,0xd7,0xad, 0xbf,0xd6,0xac,0xbe,0xd5,0xac,0xbd,0xd7,0xac,0xbd,0xd7,0xac,0xbd,0xd8,0xaa,0xbb, 0xd6,0xa8,0xb9,0xd4,0xa0,0xb5,0xd1,0x9f,0xb3,0xd2,0x98,0xac,0xcb,0x91,0xa4,0xc5, 0x90,0xa3,0xc6,0x8f,0xa1,0xc6,0x86,0x97,0xbe,0x7a,0x8b,0xb2,0x6d,0x7d,0xa7,0x6c, 0x7c,0xa6,0x6c,0x7c,0xa6,0x71,0x81,0xac,0x75,0x84,0xb2,0x75,0x83,0xb3,0x71,0x7f, 0xb0,0x6c,0x7a,0xab,0x73,0x83,0xb2,0x7b,0x8b,0xba,0x84,0x94,0xc3,0x87,0x96,0xc4, 0x82,0x91,0xbf,0x7e,0x8b,0xb9,0x7a,0x87,0xb3,0x79,0x86,0xb2,0x77,0x8a,0xb7,0x73, 0x83,0xb8,0x6e,0x79,0xb5,0x80,0x8d,0xc5,0x8f,0x9f,0xcd,0x91,0xa3,0xc8,0x99,0xab, 0xd0,0x96,0xa6,0xd0,0x98,0xab,0xd1,0x97,0xaa,0xd0,0x96,0xa9,0xcf,0x95,0xa6,0xcd, 0x95,0xa6,0xcd,0x98,0xa7,0xce,0x99,0xa8,0xcf,0x9a,0xa9,0xd0,0x97,0xa9,0xc6,0x98, 0xaa,0xc7,0x9b,0xab,0xc8,0x9b,0xac,0xc7,0x9b,0xa9,0xc5,0x9b,0xaa,0xc4,0x9c,0xab, 0xc5,0x9f,0xac,0xc6,0x96,0xa7,0xc2,0x97,0xa8,0xc3,0x99,0xaa,0xc5,0x9a,0xab,0xc6, 0x9a,0xab,0xc6,0x98,0xa9,0xc4,0xb0,0xc0,0xd7,0xb0,0xc0,0xd7,0xac,0xc0,0xd9,0xab, 0xbf,0xd8,0xa9,0xbd,0xd6,0xa8,0xbb,0xd6,0xa8,0xbb,0xd6,0xa6,0xb8,0xd5,0xa4,0xb6, 0xd3,0xa1,0xb3,0xd0,0x9e,0xb1,0xd4,0x9a,0xad,0xd0,0x90,0xa2,0xc7,0x87,0x99,0xbe, 0x87,0x98,0xbf,0x88,0x98,0xc2,0x7c,0x8c,0xb7,0x6c,0x7c,0xa7,0x70,0x7c,0xa4,0x74, 0x80,0xa8,0x7c,0x88,0xb0,0x87,0x93,0xbb,0x90,0x9c,0xc4,0x8f,0x9b,0xc3,0x85,0x91, 0xbb,0x7a,0x86,0xb0,0x7c,0x8d,0xb8,0x81,0x92,0xbd,0x86,0x97,0xc2,0x8a,0x99,0xc7, 0x88,0x97,0xc5,0x86,0x93,0xc1,0x84,0x90,0xc0,0x84,0x90,0xc0,0x78,0x8b,0xb8,0x74, 0x84,0xb9,0x74,0x80,0xba,0x8c,0x9a,0xcf,0x98,0xa9,0xd4,0x92,0xa4,0xc9,0x98,0xaa, 0xcf,0x9a,0xaa,0xd4,0x9a,0xad,0xd2,0x9a,0xad,0xd2,0x9a,0xad,0xd2,0x99,0xac,0xd1, 0x99,0xab,0xd0,0x97,0xa9,0xce,0x98,0xa7,0xce,0x97,0xa6,0xcd,0x97,0xa9,0xc8,0x98, 0xaa,0xc9,0x99,0xab,0xc8,0x9b,0xab,0xc8,0x9a,0xab,0xc6,0x9c,0xaa,0xc6,0x9d,0xab, 0xc7,0x9e,0xad,0xc7,0x99,0xa9,0xc6,0x98,0xa8,0xc5,0x98,0xa8,0xc5,0x97,0xa7,0xc4, 0x96,0xa6,0xc3,0x95,0xa5,0xc2,0xb0,0xc0,0xd7,0xb0,0xc0,0xd7,0xab,0xbf,0xd8,0xaa, 0xbe,0xd7,0xa7,0xbb,0xd4,0xa6,0xb9,0xd4,0xa4,0xb7,0xd2,0xa2,0xb4,0xd1,0x9f,0xb1, 0xce,0x9c,0xae,0xcb,0x91,0xa3,0xc8,0x8c,0x9e,0xc3,0x83,0x94,0xbb,0x7e,0x8e,0xb8, 0x83,0x93,0xbe,0x88,0x97,0xc5,0x7e,0x8d,0xbb,0x6e,0x7c,0xac,0x82,0x8c,0xb4,0x89, 0x94,0xba,0x90,0x9b,0xc1,0x94,0x9f,0xc5,0x95,0xa1,0xc5,0x95,0xa1,0xc5,0x95,0xa1, 0xc5,0x94,0xa0,0xc4,0x89,0x9c,0xc2,0x88,0x9a,0xc3,0x87,0x99,0xc2,0x88,0x98,0xc3, 0x87,0x96,0xc4,0x87,0x93,0xc3,0x85,0x91,0xc1,0x83,0x8e,0xc0,0x76,0x89,0xb6,0x72, 0x83,0xb6,0x75,0x81,0xbb,0x91,0x9f,0xd4,0x9b,0xac,0xd7,0x90,0xa2,0xc7,0x95,0xa7, 0xcc,0x9a,0xaa,0xd4,0x99,0xaf,0xd2,0x9c,0xb0,0xd3,0x9d,0xb1,0xd4,0x9d,0xb0,0xd5, 0x9d,0xaf,0xd4,0x99,0xab,0xd0,0x97,0xa7,0xcc,0x95,0xa5,0xca,0x98,0xaa,0xc9,0x99, 0xab,0xca,0x9a,0xac,0xcb,0x9c,0xac,0xc9,0x9b,0xab,0xc8,0x9b,0xac,0xc7,0x9e,0xac, 0xc8,0x9f,0xad,0xc9,0x99,0xab,0xc8,0x97,0xa9,0xc6,0x94,0xa6,0xc3,0x92,0xa4,0xc1, 0x91,0xa3,0xc0,0x91,0xa3,0xc0,0xad,0xbe,0xd9,0xae,0xbf,0xda,0xac,0xc3,0xd9,0xa8, 0xbf,0xd5,0xa3,0xb9,0xd2,0x9e,0xb3,0xcf,0x9a,0xae,0xcd,0x95,0xa8,0xc9,0x8e,0xa1, 0xc4,0x89,0x9b,0xc0,0x89,0x9c,0xc1,0x89,0x9c,0xc2,0x83,0x94,0xbf,0x85,0x95,0xc3, 0x8e,0x9e,0xcd,0x8b,0x9b,0xc9,0x7f,0x90,0xbb,0x7b,0x8c,0xb7,0x8d,0x9f,0xbe,0x8e, 0xa0,0xbf,0x8f,0xa1,0xc0,0x95,0xa4,0xc4,0x98,0xa7,0xc7,0x9a,0xa7,0xc7,0x97,0xa4, 0xc4,0x94,0xa1,0xc1,0x99,0xa5,0xc9,0x95,0xa1,0xc3,0x8f,0x9e,0xbf,0x8c,0x9a,0xbe, 0x8a,0x9a,0xbf,0x89,0x97,0xc1,0x84,0x93,0xc1,0x82,0x90,0xc1,0x75,0x80,0xbc,0x73, 0x80,0xb8,0x81,0x8f,0xc3,0x92,0xa2,0xd0,0x93,0xa4,0xcb,0x93,0xa5,0xca,0x9b,0xab, 0xd0,0x9d,0xad,0xd2,0xa3,0xb4,0xd5,0xa1,0xb2,0xd3,0x9f,0xaf,0xd3,0x9d,0xad,0xd1, 0x9d,0xad,0xd2,0x9d,0xad,0xd2,0x9e,0xae,0xd3,0x9f,0xaf,0xd4,0x99,0xa5,0xcd,0x9c, 0xa8,0xd0,0xa2,0xad,0xd3,0xa3,0xaf,0xd1,0xa4,0xaf,0xcf,0xa1,0xac,0xca,0x9f,0xab, 0xc7,0x9f,0xaa,0xc5,0x97,0xaa,0xbf,0x95,0xa7,0xbe,0x90,0xa3,0xbe,0x8d,0xa1,0xc0, 0x8d,0x9f,0xc4,0x8d,0x9f,0xc8,0xaa,0xba,0xd7,0xa9,0xb9,0xd6,0x9d,0xb2,0xcd,0x9a, 0xaf,0xca,0x96,0xab,0xc7,0x93,0xa8,0xc4,0x93,0xa7,0xc6,0x95,0xa8,0xc9,0x96,0xa9, 0xcc,0x97,0xaa,0xcd,0x91,0xa5,0xc8,0x90,0xa3,0xc8,0x88,0x9a,0xc3,0x88,0x99,0xc4, 0x90,0xa0,0xce,0x8d,0x9e,0xc9,0x84,0x96,0xbf,0x81,0x93,0xbc,0x90,0xa2,0xc1,0x91, 0xa3,0xc2,0x93,0xa5,0xc4,0x98,0xa7,0xc7,0x9b,0xaa,0xca,0x9c,0xab,0xcb,0x9c,0xa9, 0xc9,0x99,0xa6,0xc6,0x9a,0xa6,0xc8,0x97,0xa3,0xc5,0x92,0xa1,0xc2,0x90,0x9f,0xc0, 0x8d,0x9d,0xc2,0x8b,0x99,0xc3,0x84,0x93,0xc1,0x81,0x8f,0xc0,0x75,0x83,0xbe,0x78, 0x85,0xbd,0x85,0x94,0xc5,0x91,0xa1,0xcf,0x91,0xa2,0xc9,0x94,0xa6,0xcb,0x9d,0xad, 0xd2,0x9e,0xae,0xd3,0x9b,0xac,0xcd,0x9c,0xad,0xce,0x9e,0xaf,0xd0,0x9f,0xaf,0xd3, 0xa0,0xb0,0xd4,0xa0,0xb0,0xd5,0x9f,0xaf,0xd4,0x9e,0xae,0xd3,0x9d,0xae,0xcf,0x9c, 0xad,0xce,0x9c,0xab,0xcb,0x9a,0xaa,0xc7,0x9c,0xaa,0xc7,0x9c,0xaa,0xc6,0x9c,0xab, 0xc5,0x9e,0xab,0xc5,0x8f,0x9f,0xbc,0x90,0xa2,0xbf,0x94,0xa5,0xc6,0x93,0xa6,0xc9, 0x8e,0x9f,0xc6,0x84,0x96,0xbf,0xa3,0xb2,0xd2,0xa0,0xaf,0xcf,0x99,0xac,0xcd,0x99, 0xac,0xcd,0x98,0xab,0xcc,0x96,0xa9,0xca,0x96,0xa9,0xca,0x98,0xab,0xcc,0x9c,0xaf, 0xd0,0x9f,0xb2,0xd3,0x98,0xad,0xcd,0x97,0xab,0xce,0x8d,0xa0,0xc5,0x8a,0x9c,0xc5, 0x91,0xa3,0xcc,0x8f,0xa1,0xca,0x88,0x9b,0xc1,0x88,0x9b,0xc0,0x92,0xa6,0xc5,0x92, 0xa6,0xc5,0x96,0xa8,0xc7,0x99,0xab,0xca,0x9e,0xad,0xcd,0x9e,0xad,0xcd,0x9d,0xac, 0xcc,0x9d,0xaa,0xca,0x9c,0xa8,0xca,0x9a,0xa6,0xc8,0x97,0xa6,0xc7,0x96,0xa5,0xc6, 0x92,0xa2,0xc6,0x8d,0x9b,0xc5,0x84,0x93,0xc1,0x7f,0x8d,0xbd,0x73,0x81,0xbb,0x7b, 0x8a,0xc2,0x8a,0x9b,0xcc,0x94,0xa5,0xd0,0x91,0xa3,0xcc,0x96,0xa7,0xce,0x9c,0xad, 0xd4,0x99,0xaa,0xd1,0x9d,0xaf,0xce,0x9e,0xb0,0xcf,0x9f,0xb0,0xd1,0xa0,0xb1,0xd2, 0x9f,0xaf,0xd3,0x9d,0xad,0xd1,0x9c,0xac,0xd0,0x9a,0xaa,0xce,0x9c,0xb1,0xcd,0x99, 0xae,0xca,0x96,0xab,0xc7,0x97,0xa9,0xc6,0x99,0xab,0xc8,0x9c,0xac,0xc9,0x9b,0xac, 0xc7,0x9a,0xab,0xc6,0x8b,0x9a,0xc1,0x8c,0x9b,0xc2,0x8c,0x9b,0xc2,0x86,0x96,0xc0, 0x80,0x90,0xba,0x7b,0x8c,0xb7,0x9d,0xac,0xcc,0x99,0xa8,0xc8,0x9a,0xaa,0xce,0x9d, 0xad,0xd1,0xa1,0xb1,0xd5,0xa2,0xb3,0xd4,0xa0,0xb1,0xd2,0x9f,0xb0,0xd1,0x9f,0xb1, 0xd0,0xa0,0xb2,0xd1,0x99,0xaf,0xcb,0x99,0xae,0xcd,0x90,0xa4,0xc7,0x8d,0xa0,0xc5, 0x92,0xa5,0xcb,0x90,0xa3,0xc8,0x8b,0x9f,0xc2,0x8c,0xa0,0xc3,0x94,0xa7,0xc8,0x95, 0xa8,0xc9,0x96,0xa9,0xca,0x9a,0xab,0xcc,0x9b,0xac,0xcd,0x9d,0xac,0xcd,0x9d,0xac, 0xcd,0x9c,0xab,0xcc,0x9e,0xaa,0xcc,0x9e,0xab,0xcb,0x9b,0xaa,0xca,0x9a,0xa9,0xca, 0x96,0xa6,0xca,0x90,0x9f,0xc6,0x85,0x95,0xc0,0x7e,0x8c,0xbc,0x6d,0x7b,0xb5,0x7b, 0x8b,0xc0,0x8f,0xa0,0xd1,0x97,0xa8,0xd3,0x93,0xa5,0xce,0x98,0xab,0xd1,0x9b,0xac, 0xd3,0x93,0xa4,0xcb,0x9f,0xb3,0xd2,0x9e,0xb2,0xd1,0x9c,0xaf,0xd0,0x9b,0xae,0xcf, 0x9a,0xad,0xd0,0x9a,0xad,0xd0,0x9a,0xad,0xd0,0x9a,0xac,0xd1,0x98,0xaf,0xcf,0x97, 0xac,0xcc,0x95,0xa9,0xcc,0x95,0xa9,0xcc,0x98,0xab,0xce,0x95,0xa7,0xcc,0x91,0xa1, 0xc6,0x8b,0x9b,0xc0,0x80,0x8e,0xbe,0x81,0x8f,0xbf,0x80,0x8f,0xbd,0x7e,0x8d,0xbb, 0x7e,0x8e,0xb9,0x83,0x93,0xbe,0xa0,0xb0,0xcd,0x9c,0xac,0xc9,0x95,0xa5,0xc9,0x99, 0xa9,0xcd,0x9e,0xaf,0xd0,0xa0,0xb1,0xd2,0x9e,0xaf,0xd0,0x9d,0xaf,0xce,0x9d,0xaf, 0xce,0x9e,0xb0,0xcf,0x97,0xad,0xc9,0x99,0xae,0xcd,0x93,0xa8,0xc8,0x8f,0xa2,0xc7, 0x94,0xa7,0xcc,0x92,0xa5,0xca,0x8d,0xa1,0xc4,0x90,0xa5,0xc5,0x95,0xaa,0xca,0x96, 0xab,0xcb,0x98,0xab,0xcc,0x98,0xab,0xcc,0x9a,0xab,0xcc,0x9a,0xab,0xcc,0x9c,0xab, 0xcc,0x9d,0xac,0xcd,0xa0,0xad,0xcd,0x9f,0xac,0xcc,0x9d,0xac,0xcc,0x9d,0xac,0xcc, 0x99,0xa9,0xcd,0x92,0xa1,0xc8,0x87,0x97,0xc2,0x80,0x8f,0xbd,0x6c,0x7d,0xb5,0x78, 0x8b,0xbe,0x8c,0x9e,0xcd,0x91,0xa4,0xcf,0x8e,0xa2,0xcb,0x96,0xa8,0xd1,0x9a,0xac, 0xd5,0x91,0xa3,0xcc,0x97,0xaa,0xcb,0x98,0xab,0xcc,0x9a,0xad,0xd0,0x9b,0xae,0xd1, 0x9c,0xaf,0xd2,0x9b,0xad,0xd2,0x9a,0xac,0xd1,0x99,0xab,0xd0,0x91,0xa4,0xcf,0x8d, 0xa0,0xcb,0x8a,0x9d,0xca,0x8b,0x9b,0xc9,0x8a,0x9a,0xc8,0x88,0x96,0xc6,0x81,0x8f, 0xbf,0x7b,0x89,0xb9,0x76,0x84,0xb5,0x7e,0x8c,0xbd,0x88,0x96,0xc6,0x8f,0x9e,0xcc, 0x93,0xa3,0xcd,0x97,0xa8,0xcf,0xa7,0xb8,0xd3,0xa6,0xb7,0xd2,0xa2,0xb4,0xd1,0xa1, 0xb3,0xd0,0x9f,0xb1,0xce,0x9c,0xae,0xcb,0x99,0xab,0xc8,0x99,0xab,0xca,0x99,0xab, 0xca,0x9b,0xad,0xcc,0x97,0xad,0xc9,0x9a,0xaf,0xce,0x94,0xa8,0xcb,0x90,0xa3,0xc8, 0x94,0xa7,0xcd,0x92,0xa5,0xca,0x8f,0xa3,0xc6,0x93,0xa7,0xca,0x96,0xaa,0xcd,0x97, 0xab,0xce,0x97,0xab,0xce,0x98,0xab,0xce,0x97,0xaa,0xcd,0x99,0xa9,0xcd,0x9b,0xab, 0xcf,0x9c,0xac,0xd0,0xa1,0xae,0xce,0x9f,0xad,0xca,0x9d,0xad,0xca,0x9c,0xab,0xcb, 0x99,0xaa,0xcb,0x93,0xa3,0xc8,0x89,0x99,0xc4,0x83,0x92,0xc0,0x75,0x87,0xbc,0x79, 0x8c,0xbf,0x83,0x97,0xc6,0x8a,0x9d,0xc8,0x88,0x9c,0xc5,0x91,0xa3,0xcc,0x98,0xaa, 0xd3,0x94,0xa5,0xd0,0x93,0xa6,0xcb,0x96,0xa9,0xce,0x9a,0xad,0xd2,0x9b,0xae,0xd4, 0x99,0xac,0xd2,0x94,0xa6,0xcf,0x8d,0x9f,0xc8,0x88,0x9a,0xc3,0x7f,0x90,0xc1,0x7c, 0x8d,0xbe,0x7b,0x8a,0xbb,0x7b,0x8a,0xbb,0x80,0x8e,0xbf,0x84,0x92,0xc3,0x86,0x94, 0xc5,0x88,0x93,0xc5,0x84,0x94,0xc2,0x8a,0x9b,0xc6,0x94,0xa5,0xd0,0x9b,0xac,0xd3, 0x9e,0xb0,0xd5,0xa1,0xb1,0xd5,0xac,0xbe,0xd5,0xad,0xbf,0xd6,0xb0,0xc2,0xd9,0xad, 0xbf,0xd6,0xa9,0xba,0xd4,0xa5,0xb6,0xd0,0xa2,0xb3,0xce,0xa0,0xb0,0xcd,0x9e,0xad, 0xcd,0x9c,0xab,0xcb,0x98,0xad,0xcc,0x9a,0xaf,0xcf,0x93,0xa6,0xcb,0x8d,0xa0,0xc6, 0x8f,0xa1,0xca,0x8d,0xa0,0xc6,0x8c,0x9f,0xc4,0x93,0xa6,0xcb,0x92,0xa6,0xc9,0x93, 0xa7,0xca,0x94,0xa8,0xcb,0x94,0xa8,0xcb,0x94,0xa7,0xca,0x95,0xa8,0xcb,0x9a,0xaa, 0xce,0x9d,0xad,0xd1,0xa0,0xae,0xcb,0x9f,0xad,0xca,0x9b,0xab,0xc8,0x9a,0xaa,0xc7, 0x97,0xa8,0xc9,0x94,0xa4,0xc9,0x8c,0x9c,0xc6,0x87,0x96,0xc4,0x79,0x8e,0xc1,0x76, 0x8c,0xbc,0x80,0x94,0xc3,0x89,0x9f,0xc9,0x8a,0x9e,0xc7,0x8c,0xa0,0xc9,0x90,0xa3, 0xce,0x8f,0xa0,0xcb,0x91,0xa3,0xcc,0x92,0xa4,0xcd,0x93,0xa5,0xce,0x93,0xa4,0xcf, 0x8f,0xa0,0xcb,0x89,0x99,0xc7,0x83,0x93,0xc1,0x7f,0x8f,0xbd,0x7c,0x8b,0xbc,0x7c, 0x8c,0xbb,0x7e,0x8c,0xbc,0x82,0x91,0xbf,0x89,0x96,0xc2,0x91,0x9f,0xc9,0x97,0xa5, 0xcf,0x9d,0xa9,0xd1,0x97,0xad,0xd1,0x98,0xab,0xd0,0x98,0xac,0xcf,0x99,0xac,0xcd, 0x9b,0xae,0xcf,0xa0,0xb2,0xd1,0xad,0xc0,0xd5,0xae,0xc1,0xd6,0xab,0xbf,0xd0,0xab, 0xbf,0xd1,0xab,0xbe,0xd3,0xad,0xbf,0xd6,0xae,0xbf,0xda,0xac,0xbc,0xd9,0xa7,0xb6, 0xd6,0xa2,0xb1,0xd1,0x98,0xad,0xcd,0x99,0xad,0xd0,0x90,0xa3,0xc8,0x87,0x99,0xc2, 0x88,0x9a,0xc3,0x87,0x99,0xc2,0x88,0x9b,0xc1,0x91,0xa4,0xc9,0x8a,0xa0,0xc3,0x8e, 0xa2,0xc5,0x8f,0xa3,0xc6,0x90,0xa4,0xc7,0x91,0xa4,0xc7,0x93,0xa6,0xc9,0x99,0xa9, 0xcd,0x9c,0xac,0xd0,0xa0,0xae,0xcb,0x9e,0xac,0xc9,0x99,0xa9,0xc6,0x98,0xa8,0xc5, 0x96,0xa7,0xc8,0x94,0xa4,0xc9,0x8d,0x9d,0xc7,0x89,0x99,0xc4,0x79,0x8e,0xc1,0x74, 0x8a,0xba,0x81,0x96,0xc3,0x90,0xa6,0xd0,0x92,0xa6,0xcf,0x8c,0xa0,0xc9,0x89,0x9c, 0xc7,0x85,0x98,0xc5,0x89,0x9a,0xc5,0x88,0x99,0xc4,0x86,0x97,0xc2,0x84,0x94,0xc2, 0x84,0x94,0xc2,0x86,0x96,0xc5,0x88,0x98,0xc7,0x8a,0x9a,0xc9,0x8c,0x9c,0xc7,0x8f, 0x9f,0xca,0x93,0xa3,0xcd,0x98,0xa8,0xcd,0x9a,0xaa,0xce,0x9d,0xac,0xcd,0x9f,0xae, 0xce,0xa1,0xb1,0xce,0x97,0xae,0xce,0x96,0xae,0xcc,0x98,0xad,0xcc,0x9b,0xb0,0xcc, 0x9e,0xb3,0xcf,0xa3,0xb6,0xd1,0xb1,0xc2,0xd7,0xb2,0xc3,0xd8,0xad,0xc1,0xd3,0xad, 0xc1,0xd3,0xad,0xc1,0xd3,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xbf,0xd6,0xac,0xbe, 0xd5,0xab,0xbd,0xd4,0xa6,0xb8,0xd7,0xa1,0xb3,0xd2,0x9c,0xad,0xce,0x99,0xac,0xcd, 0x99,0xac,0xcf,0x94,0xa8,0xcb,0x8d,0xa1,0xc4,0x87,0x9a,0xbf,0x8e,0xa4,0xc7,0x90, 0xa6,0xca,0x8f,0xa2,0xc8,0x88,0x9a,0xc3,0x87,0x99,0xc2,0x8f,0xa0,0xc7,0x97,0xa9, 0xce,0x9a,0xad,0xd0,0x9d,0xaf,0xcc,0x9a,0xac,0xcb,0x98,0xaa,0xc9,0x98,0xa9,0xca, 0x99,0xa9,0xcd,0x96,0xa6,0xca,0x90,0xa0,0xc5,0x8b,0x9b,0xc0,0x79,0x8a,0xbb,0x7f, 0x90,0xc1,0x87,0x99,0xc8,0x8b,0x9d,0xcc,0x88,0x9a,0xc9,0x7e,0x91,0xbe,0x72,0x85, 0xb2,0x6a,0x7d,0xaa,0x77,0x84,0xb2,0x7d,0x8a,0xb6,0x87,0x94,0xc0,0x91,0x9f,0xc9, 0x98,0xa7,0xce,0x9b,0xaa,0xd1,0x9b,0xab,0xd0,0x9a,0xaa,0xcf,0x98,0xab,0xcc,0x98, 0xab,0xcc,0x99,0xac,0xcd,0x99,0xac,0xcd,0x9a,0xad,0xce,0x9c,0xb0,0xcf,0x9d,0xb1, 0xd0,0x9e,0xb2,0xd1,0x9f,0xb4,0xd0,0xa0,0xb5,0xd1,0xa3,0xb5,0xd2,0xa4,0xb7,0xd2, 0xa5,0xb8,0xd3,0xa8,0xb9,0xd3,0xb1,0xc2,0xd7,0xb2,0xc3,0xd8,0xae,0xc2,0xd4,0xae, 0xc2,0xd4,0xae,0xc2,0xd4,0xae,0xc1,0xd6,0xae,0xc1,0xd6,0xad,0xbf,0xd6,0xad,0xbf, 0xd6,0xac,0xbe,0xd5,0xa8,0xba,0xd7,0xa4,0xb6,0xd3,0xa0,0xb2,0xd1,0x9d,0xb1,0xd0, 0x9e,0xb1,0xd2,0x9b,0xb0,0xd0,0x95,0xaa,0xca,0x8f,0xa3,0xc6,0x8d,0xa3,0xc6,0x8f, 0xa5,0xc9,0x8f,0xa1,0xca,0x89,0x9b,0xc4,0x87,0x99,0xc2,0x8d,0x9d,0xc7,0x93,0xa5, 0xca,0x96,0xa9,0xcc,0x9f,0xb1,0xd0,0x9e,0xb0,0xcf,0x9e,0xaf,0xd0,0x9e,0xaf,0xd0, 0x9d,0xad,0xd1,0x96,0xa6,0xcb,0x8c,0x9c,0xc1,0x85,0x95,0xba,0x73,0x83,0xb1,0x79, 0x89,0xb7,0x83,0x93,0xc1,0x8d,0x9e,0xc9,0x92,0xa3,0xce,0x92,0xa4,0xcd,0x8f,0xa1, 0xca,0x8c,0x9e,0xc7,0x95,0xa3,0xcd,0x97,0xa5,0xcf,0x9b,0xaa,0xd1,0x9e,0xad,0xd4, 0xa0,0xb0,0xd5,0x9f,0xaf,0xd3,0x9e,0xae,0xd2,0x9c,0xac,0xd0,0x9a,0xad,0xce,0x9a, 0xad,0xce,0x9a,0xad,0xce,0x9b,0xae,0xcf,0x9b,0xaf,0xce,0x9d,0xb1,0xd0,0x9e,0xb2, 0xd1,0x9e,0xb2,0xd1,0xa0,0xb5,0xd1,0xa0,0xb5,0xd1,0xa1,0xb6,0xd2,0xa5,0xb8,0xd3, 0xa6,0xb9,0xd4,0xa9,0xba,0xd4,0xb2,0xc3,0xd8,0xb3,0xc4,0xd9,0xaf,0xc3,0xd5,0xaf, 0xc3,0xd5,0xb0,0xc4,0xd6,0xb0,0xc3,0xd8,0xb0,0xc3,0xd8,0xaf,0xc1,0xd8,0xae,0xc0, 0xd7,0xae,0xc0,0xd7,0xa9,0xbc,0xd7,0xa6,0xb9,0xd4,0xa3,0xb6,0xd1,0xa2,0xb7,0xd3, 0xa4,0xb9,0xd5,0xa2,0xb7,0xd6,0x9d,0xb2,0xd1,0x98,0xad,0xcc,0x86,0x9c,0xc0,0x88, 0x9d,0xc3,0x8a,0x9c,0xc5,0x87,0x98,0xc3,0x87,0x98,0xc3,0x8e,0x9e,0xc8,0x94,0xa5, 0xcc,0x98,0xaa,0xcf,0x9b,0xac,0xcd,0x9a,0xab,0xcc,0x99,0xa9,0xcd,0x99,0xa9,0xcd, 0x97,0xa7,0xcb,0x91,0xa1,0xc6,0x89,0x99,0xbe,0x83,0x93,0xb8,0x84,0x93,0xba,0x88, 0x97,0xbe,0x8f,0x9e,0xc5,0x96,0xa6,0xcb,0x9c,0xac,0xd1,0x9f,0xaf,0xd3,0xa1,0xb1, 0xd5,0xa2,0xb2,0xd6,0xa2,0xb2,0xd6,0xa2,0xb2,0xd6,0xa2,0xb2,0xd6,0xa3,0xb4,0xd5, 0xa3,0xb4,0xd5,0xa4,0xb6,0xd5,0xa4,0xb6,0xd5,0xa4,0xb6,0xd5,0x9e,0xb2,0xd1,0x9d, 0xb1,0xd0,0x9d,0xb1,0xd0,0x9d,0xb1,0xd0,0x9d,0xb1,0xd0,0x9e,0xb2,0xd1,0x9e,0xb2, 0xd1,0x9f,0xb3,0xd2,0xa0,0xb6,0xd2,0xa1,0xb6,0xd2,0xa2,0xb7,0xd3,0xa4,0xb9,0xd4, 0xa7,0xba,0xd5,0xa8,0xbc,0xd5,0xb3,0xc4,0xd9,0xb4,0xc5,0xda,0xb1,0xc5,0xd7,0xb1, 0xc5,0xd7,0xb1,0xc5,0xd7,0xb1,0xc4,0xd9,0xb1,0xc4,0xd9,0xb0,0xc2,0xd9,0xb0,0xc2, 0xd9,0xaf,0xc1,0xd8,0xa9,0xbe,0xd4,0xa6,0xba,0xd3,0xa5,0xb9,0xd2,0xa3,0xb9,0xd2, 0xa5,0xba,0xd5,0xa3,0xba,0xd4,0x9f,0xb5,0xd1,0x9c,0xb2,0xce,0x89,0x9f,0xc3,0x8a, 0x9f,0xc5,0x8a,0x9c,0xc5,0x87,0x98,0xc3,0x85,0x96,0xc1,0x89,0x99,0xc3,0x90,0xa1, 0xc8,0x94,0xa6,0xcb,0x96,0xa6,0xca,0x94,0xa4,0xc8,0x91,0xa1,0xc5,0x91,0xa1,0xc5, 0x92,0xa2,0xc6,0x93,0xa3,0xc7,0x92,0xa2,0xc7,0x91,0xa1,0xc6,0x9e,0xad,0xce,0x9f, 0xae,0xcf,0xa0,0xaf,0xd0,0xa1,0xb0,0xd0,0xa2,0xb1,0xd1,0xa3,0xb3,0xd0,0xa3,0xb3, 0xd0,0xa3,0xb3,0xd0,0xa0,0xb2,0xcf,0xa0,0xb2,0xcf,0xa1,0xb3,0xd0,0xa2,0xb4,0xd1, 0xa4,0xb6,0xd3,0xa5,0xb7,0xd4,0xa6,0xb9,0xd4,0xa7,0xba,0xd5,0xa1,0xb6,0xd2,0xa0, 0xb5,0xd1,0xa0,0xb5,0xd1,0x9f,0xb3,0xd2,0x9f,0xb3,0xd2,0x9f,0xb3,0xd2,0x9f,0xb3, 0xd2,0x9f,0xb2,0xd3,0xa0,0xb6,0xd2,0xa1,0xb7,0xd3,0xa3,0xb8,0xd4,0xa4,0xb9,0xd4, 0xa6,0xbb,0xd6,0xaa,0xbe,0xd7,0xb5,0xc6,0xdb,0xb6,0xc7,0xdc,0xb2,0xc6,0xd8,0xb2, 0xc6,0xd8,0xb2,0xc6,0xd8,0xb2,0xc5,0xda,0xb2,0xc5,0xda,0xb2,0xc4,0xdb,0xb1,0xc3, 0xda,0xb0,0xc2,0xd9,0xaa,0xbf,0xd5,0xa8,0xbd,0xd3,0xa7,0xbc,0xd2,0xa5,0xbb,0xd4, 0xa5,0xbb,0xd4,0xa3,0xba,0xd4,0xa0,0xb7,0xd1,0x9c,0xb3,0xcd,0x9a,0xb0,0xd3,0x96, 0xac,0xd0,0x92,0xa5,0xcb,0x8a,0x9c,0xc5,0x83,0x95,0xbe,0x81,0x92,0xb9,0x85,0x97, 0xbc,0x89,0x9c,0xbf,0x96,0xa6,0xca,0x95,0xa5,0xc9,0x95,0xa6,0xc7,0x97,0xa8,0xc9, 0x9b,0xac,0xcd,0x9f,0xb0,0xd1,0xa2,0xb3,0xd4,0xa3,0xb4,0xd5,0xa5,0xb5,0xd2,0xa6, 0xb6,0xd3,0xa7,0xb8,0xd3,0xa7,0xb8,0xd3,0xa8,0xb9,0xd3,0xa7,0xb8,0xd2,0xa7,0xb8, 0xd2,0xa7,0xb9,0xd0,0xa5,0xb9,0xd2,0xa6,0xba,0xd3,0xa7,0xbb,0xd4,0xa8,0xbc,0xd5, 0xa7,0xbb,0xd4,0xa6,0xb9,0xd4,0xa5,0xb8,0xd3,0xa4,0xb7,0xd2,0xa3,0xb8,0xd3,0xa3, 0xb8,0xd3,0xa2,0xb7,0xd2,0xa1,0xb6,0xd2,0xa0,0xb4,0xd3,0xa0,0xb4,0xd3,0xa0,0xb3, 0xd4,0xa0,0xb3,0xd4,0xa1,0xb7,0xd3,0xa1,0xb7,0xd3,0xa2,0xb8,0xd4,0xa5,0xba,0xd5, 0xa7,0xbc,0xd7,0xa8,0xbe,0xd7,0xb6,0xc7,0xdc,0xb7,0xc8,0xdd,0xb2,0xc6,0xd8,0xb2, 0xc6,0xd8,0xb3,0xc7,0xd9,0xb3,0xc6,0xdb,0xb3,0xc6,0xdb,0xb2,0xc4,0xdb,0xb1,0xc3, 0xda,0xb1,0xc3,0xda,0xac,0xc1,0xd7,0xab,0xc0,0xd6,0xa9,0xbd,0xd6,0xa7,0xbd,0xd6, 0xa6,0xbb,0xd6,0xa3,0xba,0xd4,0xa0,0xb7,0xd1,0x9d,0xb3,0xcf,0x9e,0xb6,0xd4,0x99, 0xb0,0xd0,0x96,0xaa,0xcd,0x90,0xa3,0xc8,0x89,0x9c,0xc1,0x86,0x99,0xbc,0x88,0x9b, 0xbc,0x8d,0xa1,0xc0,0x97,0xa8,0xc9,0x9a,0xac,0xcb,0x9e,0xb0,0xcf,0xa3,0xb5,0xd4, 0xa7,0xb9,0xd6,0xa8,0xba,0xd7,0xa7,0xb9,0xd6,0xa7,0xba,0xd5,0xa6,0xb7,0xd1,0xa7, 0xb8,0xd2,0xa9,0xba,0xd4,0xaa,0xbc,0xd3,0xab,0xbd,0xd4,0xab,0xbd,0xd4,0xab,0xbe, 0xd3,0xaa,0xbd,0xd2,0xa6,0xbb,0xd1,0xa7,0xbc,0xd2,0xa9,0xbe,0xd4,0xab,0xbf,0xd8, 0xab,0xbf,0xd8,0xaa,0xbe,0xd7,0xa8,0xbb,0xd6,0xa6,0xb9,0xd4,0xa4,0xba,0xd3,0xa4, 0xba,0xd3,0xa3,0xb8,0xd3,0xa2,0xb7,0xd2,0xa1,0xb6,0xd2,0xa1,0xb5,0xd4,0xa1,0xb4, 0xd5,0xa1,0xb4,0xd5,0x9e,0xb6,0xd2,0x9f,0xb7,0xd3,0xa2,0xb8,0xd4,0xa4,0xbb,0xd5, 0xa7,0xbc,0xd7,0xa9,0xbf,0xd8,0xb7,0xc8,0xdd,0xb8,0xc9,0xde,0xb2,0xc6,0xd8,0xb3, 0xc7,0xd9,0xb3,0xc7,0xd9,0xb3,0xc6,0xdb,0xb3,0xc6,0xdb,0xb2,0xc4,0xdb,0xb1,0xc3, 0xda,0xb1,0xc3,0xda,0xab,0xbf,0xd8,0xaa,0xbe,0xd7,0xa9,0xbc,0xd7,0xa6,0xbb,0xd6, 0xa5,0xba,0xd6,0xa2,0xb8,0xd4,0x9f,0xb5,0xd1,0x9c,0xb1,0xd0,0x97,0xb0,0xca,0x95, 0xad,0xc9,0x97,0xac,0xcb,0x97,0xac,0xcc,0x94,0xa9,0xc9,0x92,0xa6,0xc5,0x95,0xaa, 0xc6,0x9b,0xb0,0xcb,0x9b,0xad,0xca,0x9f,0xb1,0xce,0xa4,0xb6,0xd3,0xa7,0xba,0xd5, 0xa9,0xbd,0xd6,0xa9,0xbd,0xd6,0xa7,0xbc,0xd2,0xa6,0xbb,0xd1,0xa8,0xbc,0xd5,0xa9, 0xbd,0xd6,0xa9,0xbe,0xd4,0xaa,0xbf,0xd5,0xaa,0xbf,0xd4,0xaa,0xbf,0xd4,0xaa,0xbf, 0xd4,0xa9,0xbe,0xd3,0xa4,0xb9,0xce,0xa5,0xba,0xd0,0xa8,0xbd,0xd3,0xaa,0xbe,0xd7, 0xab,0xbf,0xd8,0xac,0xbf,0xda,0xab,0xbe,0xd9,0xaa,0xbc,0xd9,0xa5,0xbc,0xd2,0xa4, 0xbb,0xd1,0xa3,0xb9,0xd2,0xa2,0xb7,0xd2,0xa2,0xb7,0xd3,0xa2,0xb6,0xd5,0xa2,0xb5, 0xd6,0xa2,0xb5,0xd6,0x9e,0xb6,0xd2,0x9e,0xb6,0xd2,0xa0,0xb8,0xd4,0xa4,0xbb,0xd5, 0xa6,0xbd,0xd7,0xa8,0xbe,0xd7,0xb8,0xc9,0xde,0xb9,0xca,0xdf,0xb2,0xc6,0xd8,0xb3, 0xc7,0xd9,0xb3,0xc7,0xd9,0xb3,0xc6,0xdb,0xb3,0xc6,0xdb,0xb2,0xc4,0xdb,0xb1,0xc3, 0xda,0xb1,0xc3,0xda,0xa8,0xbb,0xd6,0xa8,0xbb,0xd6,0xa7,0xba,0xd5,0xa4,0xb9,0xd5, 0xa3,0xb8,0xd4,0xa0,0xb5,0xd4,0x9d,0xb2,0xd1,0x9b,0xb0,0xcf,0x96,0xb0,0xc8,0x96, 0xaf,0xc9,0x9b,0xb1,0xcd,0x9f,0xb4,0xd3,0x9d,0xb2,0xd1,0x99,0xae,0xca,0x9a,0xaf, 0xca,0x9f,0xb5,0xce,0xa3,0xb6,0xd1,0xa4,0xb7,0xd2,0xa6,0xba,0xd3,0xa7,0xbb,0xd4, 0xa7,0xbc,0xd2,0xa8,0xbd,0xd2,0xaa,0xbf,0xd4,0xab,0xc1,0xd3,0xa9,0xbd,0xd6,0xa9, 0xbd,0xd6,0xaa,0xbf,0xd5,0xaa,0xbf,0xd5,0xab,0xc0,0xd5,0xac,0xc1,0xd6,0xac,0xc1, 0xd6,0xad,0xc3,0xd5,0xab,0xc0,0xd5,0xab,0xc0,0xd6,0xab,0xc0,0xd6,0xab,0xbf,0xd8, 0xab,0xbe,0xd9,0xaa,0xbd,0xd8,0xaa,0xbc,0xd9,0xa9,0xbb,0xd8,0xa4,0xbc,0xd0,0xa4, 0xbb,0xd1,0xa3,0xb9,0xd2,0xa2,0xb7,0xd2,0xa2,0xb7,0xd3,0xa2,0xb6,0xd5,0xa2,0xb5, 0xd6,0xa3,0xb6,0xd7,0x9d,0xb5,0xd1,0x9e,0xb6,0xd2,0x9f,0xb7,0xd3,0xa3,0xba,0xd4, 0xa5,0xbc,0xd6,0xa7,0xbf,0xd7,0xb4,0xc5,0xda,0xb4,0xc5,0xda,0xb2,0xc5,0xda,0xb2, 0xc5,0xda,0xb3,0xc6,0xdb,0xb3,0xc6,0xdb,0xb2,0xc5,0xda,0xb1,0xc4,0xd9,0xaf,0xc2, 0xd7,0xae,0xc1,0xd6,0xa7,0xbc,0xd2,0xa6,0xbb,0xd1,0xa5,0xba,0xd0,0xa4,0xb9,0xcf, 0xa3,0xb8,0xce,0xa3,0xb8,0xce,0xa3,0xb8,0xce,0xa3,0xb8,0xce,0xa4,0xb9,0xcf,0xa5, 0xba,0xd0,0xa6,0xbb,0xd1,0xa6,0xbb,0xd1,0xa6,0xbb,0xd1,0xa5,0xba,0xd0,0xa4,0xb9, 0xcf,0xa3,0xb8,0xce,0xa0,0xb2,0xd1,0xa4,0xb6,0xd3,0xa7,0xb9,0xd6,0xa8,0xbb,0xd6, 0xa8,0xbc,0xd5,0xa7,0xbb,0xd4,0xa9,0xbe,0xd4,0xab,0xc0,0xd6,0xad,0xc0,0xd5,0xad, 0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xac,0xbf,0xd4,0xac,0xbf, 0xd4,0xac,0xbf,0xd4,0xad,0xbf,0xd6,0xad,0xbf,0xd6,0xad,0xbf,0xd6,0xad,0xbf,0xd6, 0xad,0xbf,0xd6,0xad,0xbf,0xd6,0xad,0xbf,0xd6,0xad,0xbf,0xd6,0xab,0xc0,0xd6,0xa9, 0xbe,0xd4,0xa7,0xbb,0xd4,0xa6,0xb9,0xd4,0xa5,0xb7,0xd4,0xa5,0xb7,0xd6,0xa4,0xb5, 0xd6,0xa2,0xb3,0xd4,0x9e,0xb3,0xd2,0xa0,0xb5,0xd4,0xa2,0xb8,0xd4,0xa6,0xbb,0xd6, 0xa8,0xbd,0xd8,0xac,0xc0,0xd9,0xb5,0xc6,0xdb,0xb5,0xc6,0xdb,0xb4,0xc7,0xdc,0xb3, 0xc6,0xdb,0xb3,0xc6,0xdb,0xb2,0xc5,0xda,0xb1,0xc4,0xd9,0xaf,0xc2,0xd7,0xae,0xc1, 0xd6,0xad,0xc0,0xd5,0xa9,0xbe,0xd4,0xa9,0xbe,0xd4,0xa8,0xbd,0xd3,0xa8,0xbd,0xd3, 0xa8,0xbd,0xd3,0xa8,0xbd,0xd3,0xa8,0xbd,0xd3,0xa9,0xbe,0xd4,0xa7,0xbc,0xd2,0xa7, 0xbc,0xd2,0xa8,0xbd,0xd3,0xa8,0xbd,0xd3,0xa8,0xbd,0xd3,0xa7,0xbc,0xd2,0xa6,0xbb, 0xd1,0xa5,0xba,0xd0,0xa2,0xb4,0xd1,0xa4,0xb6,0xd3,0xa7,0xba,0xd5,0xa8,0xbb,0xd6, 0xa8,0xbc,0xd5,0xa8,0xbc,0xd5,0xa9,0xbe,0xd4,0xaa,0xbf,0xd5,0xad,0xc0,0xd5,0xad, 0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0, 0xd5,0xad,0xc0,0xd5,0xad,0xbf,0xd6,0xad,0xbf,0xd6,0xad,0xbf,0xd6,0xad,0xbf,0xd6, 0xad,0xbf,0xd6,0xad,0xbf,0xd6,0xad,0xbf,0xd6,0xad,0xbf,0xd6,0xab,0xc0,0xd6,0xaa, 0xbf,0xd5,0xa8,0xbc,0xd5,0xa7,0xba,0xd5,0xa6,0xb8,0xd5,0xa6,0xb8,0xd7,0xa4,0xb6, 0xd5,0xa3,0xb4,0xd5,0x9f,0xb4,0xd3,0xa0,0xb5,0xd4,0xa2,0xb8,0xd4,0xa6,0xbb,0xd6, 0xa9,0xbe,0xd9,0xac,0xc0,0xd9,0xb6,0xc7,0xdc,0xb6,0xc7,0xdc,0xb5,0xc8,0xdd,0xb4, 0xc7,0xdc,0xb3,0xc6,0xdb,0xb1,0xc4,0xd9,0xaf,0xc2,0xd7,0xae,0xc1,0xd6,0xae,0xc1, 0xd6,0xad,0xc0,0xd5,0xac,0xc1,0xd7,0xac,0xc1,0xd7,0xab,0xc0,0xd6,0xab,0xc0,0xd6, 0xac,0xc1,0xd7,0xac,0xc1,0xd7,0xad,0xc2,0xd8,0xad,0xc2,0xd8,0xa9,0xbe,0xd4,0xaa, 0xbf,0xd5,0xaa,0xbf,0xd5,0xaa,0xbf,0xd5,0xaa,0xbf,0xd5,0xa9,0xbe,0xd4,0xa8,0xbd, 0xd3,0xa8,0xbd,0xd3,0xa5,0xb8,0xd3,0xa5,0xb8,0xd3,0xa6,0xb9,0xd4,0xa7,0xbb,0xd4, 0xa9,0xbd,0xd6,0xaa,0xbe,0xd7,0xa9,0xbe,0xd4,0xa8,0xbd,0xd3,0xad,0xc0,0xd5,0xad, 0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0, 0xd5,0xad,0xc0,0xd5,0xae,0xc0,0xd7,0xae,0xc0,0xd7,0xae,0xc0,0xd7,0xae,0xc0,0xd7, 0xae,0xc0,0xd7,0xae,0xc0,0xd7,0xae,0xc0,0xd7,0xae,0xc0,0xd7,0xac,0xc1,0xd7,0xab, 0xc0,0xd6,0xa9,0xbd,0xd6,0xa8,0xbc,0xd5,0xa8,0xbb,0xd6,0xa7,0xb9,0xd6,0xa5,0xb7, 0xd6,0xa3,0xb5,0xd4,0x9f,0xb4,0xd3,0xa1,0xb6,0xd5,0xa3,0xb9,0xd5,0xa7,0xbc,0xd7, 0xa9,0xbe,0xd9,0xad,0xc1,0xda,0xb5,0xc6,0xdb,0xb6,0xc7,0xdc,0xb5,0xc8,0xdd,0xb3, 0xc6,0xdb,0xb2,0xc5,0xda,0xb0,0xc3,0xd8,0xaf,0xc2,0xd7,0xaf,0xc2,0xd7,0xaf,0xc2, 0xd7,0xaf,0xc2,0xd7,0xad,0xc2,0xd7,0xad,0xc2,0xd7,0xad,0xc2,0xd7,0xac,0xc1,0xd6, 0xac,0xc1,0xd6,0xad,0xc2,0xd7,0xad,0xc2,0xd7,0xae,0xc3,0xd8,0xab,0xc0,0xd5,0xab, 0xc0,0xd5,0xab,0xc0,0xd5,0xab,0xc0,0xd5,0xab,0xc0,0xd5,0xab,0xc0,0xd5,0xaa,0xbf, 0xd4,0xaa,0xbf,0xd4,0xa8,0xbc,0xd5,0xa6,0xba,0xd3,0xa5,0xb9,0xd2,0xa7,0xbb,0xd4, 0xaa,0xbe,0xd7,0xab,0xbf,0xd8,0xa9,0xbe,0xd4,0xa7,0xbc,0xd2,0xad,0xc0,0xd5,0xad, 0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xae,0xc1, 0xd6,0xae,0xc1,0xd6,0xaf,0xc2,0xd7,0xaf,0xc2,0xd7,0xaf,0xc2,0xd7,0xaf,0xc2,0xd7, 0xaf,0xc2,0xd7,0xaf,0xc2,0xd7,0xaf,0xc2,0xd7,0xaf,0xc2,0xd7,0xad,0xc2,0xd7,0xab, 0xc0,0xd5,0xaa,0xbf,0xd5,0xa9,0xbd,0xd6,0xa9,0xbc,0xd7,0xa8,0xba,0xd7,0xa6,0xb8, 0xd7,0xa4,0xb6,0xd5,0xa0,0xb5,0xd4,0xa1,0xb6,0xd5,0xa4,0xba,0xd6,0xa7,0xbc,0xd7, 0xaa,0xbf,0xda,0xae,0xc2,0xdb,0xb4,0xc5,0xda,0xb5,0xc6,0xdb,0xb3,0xc6,0xdb,0xb2, 0xc5,0xda,0xb1,0xc4,0xd9,0xb0,0xc3,0xd8,0xb0,0xc3,0xd8,0xb1,0xc4,0xd9,0xb2,0xc5, 0xda,0xb2,0xc5,0xda,0xb0,0xc5,0xda,0xb0,0xc5,0xda,0xaf,0xc4,0xd9,0xae,0xc3,0xd8, 0xad,0xc2,0xd7,0xad,0xc2,0xd7,0xad,0xc2,0xd7,0xad,0xc2,0xd7,0xad,0xc2,0xd7,0xac, 0xc1,0xd6,0xac,0xc1,0xd6,0xac,0xc1,0xd6,0xab,0xc0,0xd5,0xab,0xc0,0xd5,0xab,0xc0, 0xd5,0xab,0xc0,0xd5,0xaa,0xbf,0xd5,0xa8,0xbd,0xd3,0xa6,0xbb,0xd1,0xa7,0xbc,0xd2, 0xa9,0xbe,0xd4,0xab,0xc0,0xd6,0xa9,0xbd,0xd6,0xa7,0xbb,0xd4,0xad,0xc0,0xd5,0xad, 0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xae,0xc1,0xd6,0xae,0xc1,0xd6,0xae,0xc1, 0xd6,0xae,0xc1,0xd6,0xb0,0xc3,0xd8,0xb0,0xc3,0xd8,0xb0,0xc3,0xd8,0xb0,0xc3,0xd8, 0xb0,0xc3,0xd8,0xb0,0xc3,0xd8,0xb0,0xc3,0xd8,0xb0,0xc3,0xd8,0xad,0xc2,0xd7,0xac, 0xc1,0xd6,0xab,0xc0,0xd6,0xaa,0xbe,0xd7,0xaa,0xbe,0xd7,0xa9,0xbc,0xd7,0xa6,0xb8, 0xd5,0xa4,0xb6,0xd3,0xa0,0xb5,0xd4,0xa1,0xb6,0xd5,0xa4,0xba,0xd6,0xa7,0xbc,0xd7, 0xaa,0xbf,0xda,0xae,0xc2,0xdb,0xb4,0xc5,0xda,0xb4,0xc5,0xda,0xb2,0xc5,0xda,0xb1, 0xc4,0xd9,0xb1,0xc4,0xd9,0xb1,0xc4,0xd9,0xb2,0xc5,0xda,0xb3,0xc6,0xdb,0xb3,0xc6, 0xdb,0xb4,0xc7,0xdc,0xb3,0xc9,0xdb,0xb3,0xc9,0xdb,0xb1,0xc7,0xd9,0xb0,0xc6,0xd8, 0xaf,0xc5,0xd7,0xaf,0xc5,0xd7,0xaf,0xc5,0xd7,0xaf,0xc5,0xd7,0xae,0xc4,0xd6,0xad, 0xc3,0xd5,0xac,0xc2,0xd4,0xac,0xc2,0xd4,0xac,0xc2,0xd4,0xac,0xc2,0xd4,0xac,0xc2, 0xd4,0xac,0xc2,0xd4,0xab,0xc0,0xd5,0xaa,0xbf,0xd4,0xa8,0xbd,0xd2,0xa8,0xbd,0xd3, 0xa9,0xbe,0xd4,0xa9,0xbe,0xd4,0xa9,0xbd,0xd6,0xa8,0xbc,0xd5,0xac,0xbf,0xd4,0xad, 0xc0,0xd5,0xad,0xc0,0xd5,0xad,0xc0,0xd5,0xae,0xc1,0xd6,0xae,0xc1,0xd6,0xaf,0xc2, 0xd7,0xaf,0xc2,0xd7,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6, 0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xac,0xc2,0xd4,0xac, 0xc1,0xd6,0xab,0xc0,0xd5,0xab,0xc0,0xd6,0xab,0xbf,0xd8,0xa9,0xbc,0xd7,0xa6,0xb8, 0xd5,0xa4,0xb6,0xd3,0x9f,0xb4,0xd3,0xa1,0xb6,0xd5,0xa3,0xb9,0xd5,0xa7,0xbc,0xd7, 0xa9,0xbe,0xd9,0xad,0xc1,0xda,0xb5,0xc6,0xdb,0xb5,0xc6,0xdb,0xb2,0xc5,0xda,0xb3, 0xc6,0xdb,0xb3,0xc6,0xdb,0xb4,0xc7,0xdc,0xb4,0xc7,0xdc,0xb4,0xc7,0xdc,0xb3,0xc6, 0xdb,0xb3,0xc6,0xdb,0xb3,0xc9,0xdb,0xb3,0xc9,0xdb,0xb2,0xc8,0xda,0xb1,0xc7,0xd9, 0xb1,0xc7,0xd9,0xb1,0xc7,0xd9,0xb1,0xc7,0xd9,0xb1,0xc7,0xd9,0xaf,0xc5,0xd7,0xaf, 0xc5,0xd7,0xae,0xc4,0xd6,0xad,0xc3,0xd5,0xac,0xc2,0xd4,0xad,0xc3,0xd5,0xad,0xc3, 0xd5,0xae,0xc4,0xd6,0xab,0xc1,0xd3,0xab,0xc1,0xd3,0xab,0xc0,0xd5,0xa9,0xbe,0xd3, 0xa8,0xbd,0xd3,0xa7,0xbc,0xd2,0xa8,0xbc,0xd5,0xa9,0xbd,0xd6,0xac,0xbf,0xd4,0xad, 0xc0,0xd5,0xad,0xc0,0xd5,0xae,0xc1,0xd6,0xae,0xc1,0xd6,0xaf,0xc2,0xd7,0xaf,0xc2, 0xd7,0xaf,0xc2,0xd7,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6, 0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xac,0xc2,0xd4,0xab, 0xc1,0xd3,0xab,0xc0,0xd5,0xab,0xc0,0xd6,0xab,0xbf,0xd8,0xa9,0xbc,0xd7,0xa6,0xb9, 0xd4,0xa3,0xb5,0xd2,0x9f,0xb4,0xd3,0xa0,0xb5,0xd4,0xa2,0xb8,0xd4,0xa6,0xbb,0xd6, 0xa9,0xbe,0xd9,0xac,0xc0,0xd9,0xb6,0xc7,0xdc,0xb6,0xc7,0xdc,0xb3,0xc6,0xdb,0xb4, 0xc7,0xdc,0xb5,0xc8,0xdd,0xb5,0xc8,0xdd,0xb5,0xc8,0xdd,0xb4,0xc7,0xdc,0xb3,0xc6, 0xdb,0xb2,0xc5,0xda,0xb1,0xc7,0xd9,0xb0,0xc6,0xd8,0xb0,0xc6,0xd8,0xb0,0xc6,0xd8, 0xb0,0xc6,0xd8,0xb1,0xc7,0xd9,0xb1,0xc7,0xd9,0xb2,0xc8,0xda,0xb0,0xc6,0xd8,0xb0, 0xc6,0xd8,0xaf,0xc5,0xd7,0xae,0xc4,0xd6,0xad,0xc3,0xd5,0xae,0xc4,0xd6,0xae,0xc4, 0xd6,0xaf,0xc5,0xd7,0xab,0xc2,0xd2,0xac,0xc2,0xd4,0xac,0xc2,0xd4,0xaa,0xbf,0xd4, 0xa7,0xbc,0xd2,0xa6,0xbb,0xd1,0xa8,0xbc,0xd5,0xaa,0xbe,0xd7,0xac,0xbf,0xd4,0xad, 0xc0,0xd5,0xad,0xc0,0xd5,0xae,0xc1,0xd6,0xae,0xc1,0xd6,0xaf,0xc2,0xd7,0xaf,0xc2, 0xd7,0xb0,0xc3,0xd8,0xaf,0xc3,0xd5,0xaf,0xc3,0xd5,0xaf,0xc3,0xd5,0xaf,0xc3,0xd5, 0xaf,0xc3,0xd5,0xaf,0xc3,0xd5,0xaf,0xc3,0xd5,0xaf,0xc3,0xd5,0xab,0xc1,0xd3,0xab, 0xc1,0xd3,0xaa,0xbf,0xd4,0xab,0xc0,0xd6,0xab,0xbf,0xd8,0xa9,0xbd,0xd6,0xa5,0xb8, 0xd3,0xa3,0xb6,0xd1,0x9e,0xb3,0xd2,0xa0,0xb5,0xd4,0xa2,0xb8,0xd4,0xa6,0xbb,0xd6, 0xa8,0xbd,0xd8,0xac,0xc0,0xd9,0xb4,0xc7,0xdc,0xb3,0xc6,0xdb,0xb6,0xca,0xdc,0xb6, 0xca,0xdc,0xb6,0xca,0xdc,0xb6,0xca,0xdc,0xb6,0xca,0xdc,0xb6,0xca,0xdc,0xb6,0xca, 0xdc,0xb6,0xca,0xdc,0xb2,0xc8,0xda,0xb3,0xc9,0xdb,0xb3,0xc9,0xdb,0xb3,0xc9,0xdb, 0xb1,0xc7,0xd9,0xb1,0xc7,0xd9,0xb1,0xc7,0xd9,0xb2,0xc8,0xda,0xb4,0xc8,0xd9,0xb5, 0xc9,0xda,0xb6,0xca,0xdb,0xb6,0xca,0xdb,0xb4,0xc8,0xd9,0xb2,0xc6,0xd7,0xb2,0xc6, 0xd7,0xb3,0xc7,0xd8,0xb2,0xc6,0xd8,0xb1,0xc5,0xd7,0xb0,0xc4,0xd6,0xaf,0xc3,0xd5, 0xaf,0xc3,0xd5,0xae,0xc2,0xd4,0xae,0xc2,0xd4,0xae,0xc2,0xd4,0xb0,0xc4,0xd6,0xb0, 0xc4,0xd6,0xb0,0xc4,0xd6,0xb0,0xc4,0xd6,0xb1,0xc5,0xd7,0xb1,0xc5,0xd7,0xb1,0xc5, 0xd7,0xb1,0xc5,0xd7,0xb1,0xc5,0xd7,0xb1,0xc5,0xd7,0xb1,0xc5,0xd7,0xb1,0xc5,0xd7, 0xb1,0xc5,0xd7,0xb1,0xc5,0xd7,0xb1,0xc5,0xd7,0xb1,0xc5,0xd7,0xaf,0xc3,0xd4,0xb0, 0xc4,0xd5,0xad,0xc3,0xd5,0xa9,0xbe,0xd3,0xa8,0xbd,0xd3,0xa7,0xbd,0xd6,0xa7,0xbd, 0xd6,0xa4,0xb9,0xd4,0xa2,0xb3,0xce,0xa3,0xb6,0xd1,0xa8,0xba,0xd7,0xa9,0xbe,0xda, 0xa6,0xbc,0xd8,0xa5,0xbb,0xd7 }; fox1.6-1.6.57/chart/icons.h000066400000000000000000000001761326741342000152260ustar00rootroot00000000000000/* Generated by reswrap version 4.0.0 */ /* created by reswrap from file marble.bmp */ extern const unsigned char marble[]; fox1.6-1.6.57/chart/marble.bmp000066400000000000000000000300661326741342000157050ustar00rootroot00000000000000BM606(@@0m m °ŔаŔаŔͰŔͱŔаżĎŻ˝Ď­»Í«ąË©·Ę©·Î«ąĐ¬şŃ¬şŃ«ąĐ«ąĐ«ąĐ¬şŃ«ąĎ«ąĎŞ¸ĎŞ¸Ď©¶Đ§´Î¦˛ÎĄ±Í ŻĐź®Ďž­Íś«Ë™¨É”ˇÇŽšÄ‰”Ŕ}Ť»‚’Ŕ†“Á‰–Ć•Ăw‡µj~­n†´‰ż”¤Éź­Ń ŻĐ °Í¤łÍĄµĚ¤´Ë¤´Ë¤łÍˇ˛Í °Í›­Ě—ŞË•¨Ë”§ĘśĹ‡›Ä†™Ä…Æ™Ć›ČŻżĐŻżĎŻľÎ°żĎ°żĎŻ˝Ď®ĽÎ¬şÍ޸˩·Ę©·Î«ąĐ¬şŃ¬şŃ«ąĐ«ąĐ«ąĐ¬şŃ¬şĐ¬şĐ¬şŃ¬şŃ«¸Ň©¶Đ¨´Đ§łĎ˘±Ňˇ°Đ ŻĎž­Í›ŞË–¤Č‘ťĹŚ—ĂzŚ»zŚ»€ż‡–Ç‘Ŕj|«h|«~•Ă“ŁČ¨Ěź®Ďˇ°Đ˘˛Ď§¶Đ§·Î¦¶Í§·Î¤µĎ¤µĎ˘łÎź±ÎťŻÎ›¬Í«Ě“¦Ë’ĄĘ‘¤ÉŹ˘ČŽˇÇŽ É®ľĎ®ľĎŻľÎ°żĎ°ľĐŻ˝Ď®ĽÎ¬şÍ޸˨¶É©·ÎŞ¸Ď¬şŃ¬şŃ«ąĐ«ąĐ«ąĐ¬şŃ¬şĐ¬şĐ¬şŃ¬şŃ«¸ŇŞ·Ń©µŃ©µŃ¦łÓĄłĐŁ±ÎˇŻĚź¬Ě›§É• Ć‘šĹyŤ˝yŠ»yŠ˝}ŽÁyŠ˝j~®t·‘¦Ó›«Ďś­Î ŻĐˇ°Đ¤µĐ©¸Ň©¸Ň¨¸Ď¦¸Ď¦¸ĎĄ¶Đ¤µĎŁ´Ďˇ±Î °ÍźŻĚš®Íš®Íš­Î™¬Í«Ě«Î®ľĎ®ľĎŻ˝ĎŻ˝Ď°ľĐŻ˝Đ®ĽĎ¬şÍ޷ͨµË¨¶ÍŞ¸Ď«ąĐ«ąĐŞ¸ĎŞ¸ĎŞ¸Ď«ąĐ޸ΫąĎ«ąĐ«ąĐ«¸ŇŞ·Ń©µŃ©µŃ¦´ŃĄłĎŁ±ÍˇŻËź­Ę›§É—ŁÇ“ťĹ‘Ŕ~ŹŔu†ąo€łs„·xŠą‡Ă›­Ö ±Ňž°Ďź®Î˘˛ĎĄ¶Ń¨·Ń©¸Ň©ąĐ¦¸Ď¦¸Ď¦¸ĎĄ¶Đ¦µĎĄ´Î¤łÍŁ±Íť˛ÍžłÎź´ĐžłĎś°Ďś°Ď®˝Đ®˝Đ®ĽÎ®ĽÎ®ĽÎ®ĽĎ¬şÍ޷ͨµË§´Ę§µĚ¨¶ÍŞ¸ĎŞ¸Ď©·Î©·Î©·ÎŞ¸Ď¨¶Ě©·Í©·ÎŞ¸Ď©¶Đ©¶Đ¨´Đ¨´Đ§łĎ¦łÍ¤±Ë˘ŻÉ ¬Čť¨Č™˘Ç•žÄ†–Á„”Ăr´gx«s„µ†–Ä“˘ÉśŞÎˇłĐž°Í °ÍŁ´ĎĄ¶Ń§¶Đ¨·Ń«şÔ¦¸Ď¦¸Ď¦¸Ď¨¸Ď¨¸Ď©·Î¨¶Í¨¶ÍˇµÎŁ·Đ¤·ŇٶѠ˛Ďž°Í¬»Î¬»Î¬şĚ¬şÍ¬şÍ¬şÍ޷ͨµË¦˛ĘĄ±ÉĄłĘ§µĚ©·Î©·Î¨¶Í§µĚ¨¶Í©·Î§µË¨¶Ě¨¶Í©·Î©¶Đ©¶Đ¨´Đ¨´ĐĄ˛Ě¤±ËˇŻĆ ®Ĺž«Ĺ›¦Ä—ˇĂ•žĂ–Ŕ“ľs˛o~Ż‘Ŕ•ŁÍť©Í «Éˇ´Ďź˛Íˇ˛ÍĄ¶ŃĄ¶Ń¦µĎ¨·Ń­ĽÖ§ąĐ§ąĐ§şĎŞ»Đ¬şĐ«ąĎ«¸Î«¸Î¤µĎ§¸Ň©şŐ¨ąÔ¤µĐŁłĐ«şÍ«şÍŞ¸ËŞ¸ËŞ¸ËŞ¸Ë©¶Ě§´Ę¤°ČŁŻÇĄłĘ¦´Ë¨¶Í¨¶Í§µĚ¦´Ë§µĚ¨¶Í§µË§µË¨¶Í©·Î©¶Đ©¶Đ¨´Đ¨´Đ¤±Ë˘°Ç ®Ĺž¬ĂťŞÄšĄĂ—˘Â”ťÂ”ĽŹąułyąźÍ ¬ÔŁ®Î§°Ëˇ´Ďź˛Í˘łÎ¦·Ň¦·Ń¦µĎ©¸ŇŻľŘ§ąĐ¨»Đ¨»Đ«ĽŃ­»Ń®ĽĎ­»Î­»ÎĄ¶Đ¨ąÓ«Ľ×«Ľ×¨¸Ő§·Ô¦şĚٷɍąÎ¦·Ě¤µĘŁłĘŁłĘ˘±Ëˇ°Ę ŻÉˇłĘ ˛É˘˛É˘˛ÉĄłĘ¦´Ë¦´Ë¦˛Ę¦´Ë¦´Ë¦´Ë§µĚ¨¶Í§µĚĄłĘŁ±ČťłĚś­Çź¬Ć¤­Čź¨Ă’ťąŤ›¸źżŤĽ€Ś¶„ʵť˝ˇ­ÉŞ¸Ď§µĚˇŻĆ©¸Ë©¸Ë©·Í©·ÍŞ¸ĎŞ¸Ď«ąĐ«¸Ň¨ąÓ¦·Ń¦·Ń§¸Ň©şÔ©şÔ§¸ŇĄ¶Đ¬·Ň¨µĎ§´Î«·Ó޸Ԩ¶Ň¤¸ĘˇµÇ¦·Ě¤µĘ˘˛É˘˛É˘˛É˘±Ë ŻÉź®Čž°Çž°Ç °Ç °Ç˘°ÇŁ±ČŁ±Č˘°Ç¤˛É¤˛É¤˛ÉĄłĘ¦´Ë¦´Ë¤˛É˘°Çť®Čź®Čź¬Ćž©Ĺť§ĹšĄĹžÂĽ~‰µ‚Ž¸ŚĽ—ĄÂ˘ŻÉ§µĚ¦´Ë¦˛Ę©¸Ë©¸Ë©·Í©·ÍŞ¸ĎŞ¸Ď«ąĐ«ąĐ©şÔ¨ąÓ§¸Ň§¸Ň©şÔ©şÔ§¸ŇĄ¶Đ«¸Ň¨µĎ§´ÎŞ·Ń¨·ŃĄłĎˇ´Éž±ĆٴɎ±Č °Ç °Çˇ°Ę ŻÉź­Éž¬Čť®Čť®Čť®Čź®Čž­Ç ­Ç ­Ç ­Çˇ®Č ­Çˇ®ČٰƤ±ËĄ˛ĚٰƎ®Čť«Âˇ®Č «ÇšŁÄ›¤É™ĄÍŽśĆ|ڶ}†±“ą–˘Äˇ­ÉٱȤ±Ç§´ĘŞ·ÍŞąĚŞąĚŞąĚŞ¸ÎŞ¸ÎŞ¸Ď«ąĐ«ąĐ©şÔ¨ąÓ¨ąÓ¨ąÓ©şÔ©şÔ§¸Ň¦·Ń«ąĎ©·Î¨¶Í§¶Đ¦µĎˇ˛Íź˛ÇśŻÄ °ÇźŻĆźŻĆź®Č ŻÉ ®Ęž¬Čť«Ç›®É›®Éť®Éť®Éť«ÇśŞĆžŞĆź«Çž«Ĺž«Ĺź¬Ćˇ®ČŁ°ĘŁ°Ę˘ŻÉ ­Ç ŞÂ «Ćž§ČˇÇ‘ťÇŤšČ€ľu…´Ž´Ź›˝źŞČĄ˛ĚŁ±ÇŁ±Ä§µČ¬ąĎŞşËŞşËŞąĚ«şÍ«ąĎ«ąĎŞ¸ĎŞ¸Ď¨ąÓ¨ąÓ¨ąÓ©şÔ©şÔ©şÔ¨ąÓ¨ąÓ«ąĎ޸Χ·Î§·ÎŁ´Îˇ˛Íź±Čś®ĹťŻĆťŻĆś­Çť®ČžŻĘť®É›«ČšŞÇ™¬Çš­Čš­Č›¬Ç©Ä¦Â™§Ăš¨Ä›§Ă›§Ăś¨ÄžŞĆˇ­Éˇ­É ¬Čź«Çˇ«Ăś§Ă™ŁĹ“źÇ‡”Âx†¶s˛v†µšĽŁÁ ­ÇĄ˛ČĄłĆĄłĹ޵ɮąÍŞşËŞşË«»Ě¬»Î«şÍ«ąĎŞ¸ÎŞ¸ÎĄ¶Đ¦·Ń§¸Ň¨ąÓ©şÔ©şÔ©şÔŞ»Ő§¸Í¨ąÎ¨¸ĎĄ¶ĐŁ´Ďź±Î ±Ëź°ĘžŻÉť®Čť®ČžŻĘžŻĘť­Ę›«Č™©Ć“¨Ä—©Ć—©Ć•§Ä“ŁŔ‘ˇľ”˘ż•ŁŔ™ĄÁ™ĄÁš¦Âś¨ÄžŞĆžŞĆť©Ĺś¨Äť©Á—˘ŔžÂŠ—Ăz‰·m|Şr‚­‚Ź»™ĄÁś©Ă ®ÄŁ±ĂĄ´Ä޷Ǭ¸Ę®şĚŞşĘ«»Ě¬ĽÍ¬ĽÍ¬»Î«şÍ޸Ω·Í¤µĎĄ¶Đ§¸Ň¨ąÓ¨ąÓ¨ąÓ¨ąÓ©şÔ¤´Ë§¶Đ¦·ŇŁłĐź±Đť­Ń˘łÍ˘łÍž˛Ëť±Ęť°Ëť°ËťŻĚś®Ë™«Č—©Ć’¦Ĺ”¨Ç—©Č”¦ĹʎŔŹžľŹžľ‘ Ŕ–˘ľ–˘ľ–˘ľ¤Ŕš¦Âš¦Â™ĄÁ—Łż“˘ĽźżŠšż|Ť¸qŻq¬‚޶“źĂ›¨ÂžŞÂˇŻÂ¤łĂ©¶Ć¬ąÉ°şË±»ÍŞşĘ«»Ë¬ĽÍ­˝Î­˝Î«şÍŞąĚ©¸ËĄ¶Đ¦·Ń¨ąÓ¨ąÓ¦·ŃĄ¶Đ¦·Ń§¸Ňź°ĘŁ´Ď¤´ŃžŻĐšŞÎ™¨Ď¤µĎĄ¶ŃźłĚž˛Ëž±Ěž±Ěž°Íś®Ë™«Č—©Č“§Ć•©Č–ŞÉ•§Ć˘ÁŹžľźż’ˇÁ” Ľ” Ľ” Ľ–˘ľ—Łż¤Ŕ–˘ľ” Ľ‹ś·Ž ż…—Ľs„Żl|Ş{‰ł‘ťÁž©Éš¦ľťŞŔ˘°ÂĄ´ÄŞ·Ĺ­şČ±»Ěł˝ĎŞşĘ«»Ë¬ĽĚ­˝Î­˝Î«şÍŞąĚ¨·Ę¦·Ń¨ąÓ©şÔ¨ąÓĄ¶ĐŁ´ÎŁ´Î¤µĎžŻĘˇ±Î˘±ŃšŞÎ–ĄĚ’˘Ě©ąĐ©ąĐĄąŇ˘¶Ď łÎź˛Íź±Îž°Ď›¬Í™ŞË‘˘É’ŁĘ“ĄĘ“ŁČ ÄŤžżŽťľŽť˝ŽśŔŹťÁ‘ Á“˘Ă”ŁÄ“˘ĂŹžľŚ›»‹™˝…•ş€şx˛t…¬†”¸—ĄÂ™¦Ŕ «ż˘­Á¤ŻĂĄ°Ä§˛Ć©´Č¬·Ë®ąÍ«ąĚ­»Î¬»Î޸Ψ¶ĚĄ¶Ë¦·Ě¨ąÎŞ»ĐŞ»Đ©ąĐ¨¸ĎŞ¸Ď©·Î§µĚĄłĘš­Óś­Ôš«Ň“¤ËŤśĂŚśÁŞşŃŞşŃ¦»Ń¤¸Ń˘¶Ďˇ´ĎˇłĐ ˛Ńť®Ď›¬Í”ĄĚ•§Ě•§Ě•ĄÉ’˘ĆŽźŔŽťľŽť˝źŔŹžżŹžżźŔ‘ Á‘ ÁŹžżŤś˝–ş…•ş‘»xłp€ŞŹł”˘ż™¦Ŕ «ż˘­Á¤ŻĂ¦±Ĺ§˛Ć©´Č¬·ËŻşÎ¬şÍ­»Î­ĽĎ¬»ÎŞąĚ§¸Í©şĎŞ»Đ­»Ń¬şĐŞ¸Ď§¶Đ¦´Đ¤˛ĎŁ°Đˇ®ÎˇČˇČ‘˘É“ŁČ•ĄĘ™§Ë¬ĽÓ¬ĽÓŞ˝Ň¨şŃ¦¸ĎĄ¶ĐĄ¶Ń¤´Ń˘±Ń ŻĎŞĎ™«Đ™¬Ď¨Ě”ĄĆˇÂŹžżŽťľ‘ ÁŹžżŽťľŤś˝ŽťľŽťľŽťľŤś˝„’¶“¸‚’Ľv†±k{Ą{‰­‘źĽĄżˇ¬ŔŁ®ÂĄ°Ä§˛Ć¨łÇ޵ɭ¸ĚŻşÎ­ĽĚ®ĽÎ­˝Î¬»ÎŞąĚ¨ąÎ¨ąÎ©şĎŞ¸ËŞ·Í©¶Đ¦´ĐŁŻŃž«Ń§Î–¤ÎŠšÄŚ›ÂŹźÄ–¦Ęˇ°Ń¦µŐ­ľÓ­ľÓŞ˝Ň©ĽŃ¨şŃ§ąĐ¦·ŃĄ¶Ń¤´ŃŁłĐť°Óť°ÓśŻĐ›¬Í–§Č‘˘ĂźŔŹžżŹžľŽť˝Ťś˝Ś›ĽŤś˝Ťś˝ŚšľŠĽ‘µ·~Žąs®iyŁz‡­ť˝¤Ŕˇ¬ŔŁ®Â¦±Ĺ¨łÇ©´Č«¶Ę­¸ĚŻşÎ®˝Í®˝Í¬ĽÍ«»Ě©¸ËĄ¶Ë¤´ËŁłĘĄ˛Č¦˛ĘĄ±Í˘ŻĎś©Ď•ŁÍźÍŽśĚ“˘É•ˇÉ¦Ę ŻĐ«ąÖ®˝×®żÔ®żÔ«ĽĎ«ĽĎŞ»Đ©ąĐ¨·Ń§¶Đ§µŃ§µŃźłŇźłŇž±Ňť®Ď—¨É’ŁÄ‘ ÁźŔŽž»ŤśĽŤśĽŤś˝Ťś˝Śšľ‰—»‡”şŽ´}Śły‰´o~¬iy¤|‰Ż’źż¤ŔźŞľ˘­ÁĄ°Ä§˛Ć©´Č޵ɬ·Ë­¸Ě«şĘ«şĘ©ąĘ©¸Ë¨¶Ě¤´Ë˘±ËˇŻËŁŻËˇ¬Ę›¨Č”˘ĆśÄŽ›ÇŹžĚ’ Đž¬Đź­ŃĄ˛Ň¨¶Ó­şÔ®ĽŇ®żŇ®żŇŞĽÍ«˝Î«ĽĎŞ»Đ¨¸Ď§¶Đ¨·Ń¨¶ŇžłĎź´Đž˛ŃťŻÎ©Ę”ĄĆ“˘Ă’ˇÂŤťşŤťşŤśĽŤś˝Ťś˝‹™˝•»…’¸€Ťłz˛u„˛l{©fvˇ{‡Ż‘ťżŁÁť¨Ľ «ż¤ŻĂ¦±Ĺ§˛Ć©´Č޵ɫ¶Ę§µÇ§µČ¦´Ę¦´Ë§´Î¤˛Ďˇ®Îź¬ĚšŞĎ—§Ě ĹŚ™żŠ–ľŹ›Ă™ĄÍˇ­×¤˛Ď§µŇ«·Ó¬ąÓ­şĐ­»Î®żŇ®żŇŞ˝Ě«ľÍ¬ľĎ«ĽĎ©şĎ¨¸Ď©ąĐŞąÓś±Ěť˛Îť˛Îś®ÍŞÉ”ĄĆ”ŁÄ“ˇĹˇĽŽž»Śśą‹šş‹™˝Š—˝•»†’ş|°y‡±u„˛jx¨bqźu©ŽšĽŁÁ›¦şž©˝˘­ÁĄ°Ä¦±Ĺ§˛Ć¨łÇ©´ČĄłĆ¤±Ç˘°Ç˘®Ęˇ¬Ęť©Ë™ĄÉ–˘Ć‰™Ç‹›ÉŽžÉźĆ“ Ćš¦Č˘ŻĎŞµŐ©·Î«ąĐ­»ŃŻĽŇ®ĽĎ°»Ď®żŇ­ľŃ«ľÍ¬żÎ­żĐ¬˝ĐŞ»Đ©şĎŞşŃ¬ĽÓ›°Ëś±Ěś±Íś®ËŞÉ•¦Ç•¤Ĺ”˘Ć’ŁľŹ »‹›¸‰¸‰—»‰–Ľ‰•˝”Ľy…­y‡±w†´jx¨^m›o{Ł‹—ą—˘Ŕ™¤¸ś§»ˇ¬ŔŁ®ÂĄ°Ä¦±Ĺ§˛Ć¨łÇĄ˛ČŁŻÇź¬Ćť¨Ć›ĄÇ•ˇĹŹšŔ‹•˝u»“Ă‘ˇĎ›«ŐŁ±ŐĄłĐ©´Ď©µÍ®˝Đ®˝Đ°ľŃ°ľŃłľŇłľŇ¬ŔҬŔŇ­żĐ¬ľĎ¬˝Đ«ĽĎ«ĽĎŞ»Đ©şĎ©şĎ¤µĐŁ´Ďˇ±ÎźŻĚž®Ëś«Ë™¨Č—¦Ć“ŁŔ”ŁĂ”ŁĂźŔ‹™˝•»‰•˝ŚŔr…°y‰·v†µetĄUc”Zhv±ťÉ˘ŔˇĽž§»¦Ż˝¦Ż˝ˇŞľˇŞĹĄŻÍ¤®żź¬ÂĄĹŽžČ‡—Ć„”Ă’Ŕ„‘˝–źÄ™˘Çź¨ĘŁ¬Í¦±ÍŞłÎ­·ĎŻąŃ˛ŔұżŃ±żŃ±żŃ±żŃ±żŃ­ÁÓ­ÁÓ­żĐ­żĐ¬˝Đ¬˝Đ«ĽĎŞ»Đ©şĎ©şĎ¤µĐ˘łÎ ±ĚźŻĚźŻĚť¬Ě›ŞĘ™¨Č“ŁŔ”ŁĂ”ŁĂ‘ ÁŤ›ż•»†’ş…‘ą|Ť¸v†´n~­crŁTb“O]Ťfsˇ€Ťą˘Ŕ—˘˝ť¦şŁ«ĽĄ­ľ˘«żž©Ä ŞČ¤±Çš¦Â‹š»‘»“ľŠšĹ–˘Ęś§Íś¦ČźŞĘ¤®Ě§˛Î©´Ď­·Ď°»Ń˛˝Ó°ľĐŻ˝ĎŻ˝Ď°ľĐ°ľĐ°ľĐ®ÂÔ®ÂÔŻÁŇ®ŔŃ­ľŃ¬˝Đ«ĽĎŞ»Đ©şĎ¨ąÎŁ´Îˇ˛Í ±Ěź°ËźŻĚźŻĚť¬Ěś«Ë™©Ć™¨Č§Ç—¦Ç”˘ĆŹśÂ”ĽŹ·•ľv‡˛o®n|¬cqˇWc“^k—r€ŞŹš¸’źąŁąśĄąź¨Ľ «Áś©Ă™¤Â‘ ŔŤś˝‰™ľŚšÄ”ŁĘśŞÎˇ¬Ěˇ¬Čˇ­É¤°Ě¨łÎ޶Ϋ¸ÎŻşÎ±ĽĐłżŃ­»Í­»Í®ĽÎ®ĽÎŻ˝Ď°ľĐŻĂŐ°ÄÖ°ÂÓŻÁŇ®żŇ­ľŃ«ĽĎŞ»Đ©şĎ¨ąÎ˘łÍˇ˛Ěź°Ëź°Ë ±Ě °ÍźŻĚž®Ëž®Ëś«Ëš©É™¨É™§Ë•˘ČŤ™Á‡“»“Ľyеw†´z¸x„´ly§it nz¤z‰©†”±ť·” ¸–˘ş™¦Ŕ—ĄÂ‘ Ŕ‚“ş‡ż‘ Çť©ŃĄ±Ő§˛Đ¤®ĆźŞľŁ±ČĄłÉ¨µËŞ¸ËŞ¸Ë­ąËŻ»Í±ľÎ¬şĚ¬şĚ­»Í®ĽÎŻ˝Ď°ľĐ°ÄÖ°ÄÖ°ÂÓ°ÂÓŻŔÓ­ľŃ¬˝ĐŞ»Đ©şĎ©şĎŁ´Îˇ˛Ěź°Ęź°Ëź°Ë ±ĚźŻĚźŻĚž®Ë™¨Č•¤Ä•¤Ĺ–¤Č•˘ČśÄ‹—ż€ş~ޏ{Џz‡µ{¶}‡¶v‚¬nz¤k{źz‰Ş”¶Ž™ąŽ™ąŤ™»Ś›ĽŠšľŠśĹŹźÉ–ĄĚť©Íˇ¬ĚĄ®É¨łÇ­·Č¤łĆ¦µČ¨¶É©·É©·É«·É­şĘŻĽĚ«ąË¬şĚ®ĽÎŻ˝Ď°ľĐ°ľĐ°ÄÖ°ÄÖ°ÂÓ°ÂÓŻŔÓ®żŇ¬˝Đ«ĽŃŞ»ĐŞ»Đ¤¶Í˘´Ëź°ĘžŻÉžŻĘžŻĘžŻĘť­Ęś¬É§Ç”ŁĂ“˘Ă•ŁÇ–ŁÉ” Č‘ťĹ‡ż†–Ŕڏv±z„łŚ¸~Š´v€¨dvźl|¦{‡ŻŹ·Ź·Ťµ€ş…—ŔŤ Ć“ĄĘśŞÎˇ¬ĚŁ«ČĄŻÇŞµÉŻ»Í¦¶Ç§·Č©·É©·É¨¶Č«·É­ąËŻ»Í«ąË¬şĚ®ĽÎŻ˝Ď°ľĐ°ľĐ°ÄÖŻĂŐ°ÂÓŻÁŇŻŔÓ®żŇ­ľŃ¬˝Ň«ĽŃ«ĽŃ¦¸ĎŁµĚź±Čť®Čť®Čť®Éś­Č›¬Ç¨Ĺ•¤Ä“˘Â“˘Ă”˘Ć•˘Č” Č“źÇŽťÄ‰—Á€Ťą{…´{…´}´}†±x‚Şbu˘`pźht¤v‚˛}‰ą|¸Źľ›ČŽˇÂ§ČŁ®ĚŞ˛ĎŞłÎ©˛Í¦˛Ę¦´ËĄµĆ¦¶Ç§µÇ§µÇ§µČ޵ɬ·Ë®ąÍŞ¸Ę«ąË­»Í®ĽÎŻ˝Ď®ĽÎŻĂŐŻĂŐŻÁŇŻÁŇŻŔÓ®żŇ­ľŃ­ľÓ¬˝Ň¬˝Ň§ąĐ¤¶Í ˛Éť®Čś­Ç›¬Ćš«Ć™ŞĹ‘ˇľźżŹžľŹžżŹťÁťĂŹ›ĂŽšÂ‰ż·|‰µ‹ş‰¸y‚®s}Ąs}Ąbs¤Wf—Yfšnx®{…»|‰˝’ĂŹ Ńš¬Éž¬É˘­ÉĄ®É©°Ë©˛Í¦˛Î¤˛ÎŁłÄ¤´ĹĄłĆĄłĆĄłĆ¨łÇ޵ˬ·ÍŞ¸Ę«ąË¬şĚ­»Í®ĽÎ­»ÍłÄ׳ÄׯÂŃ®ÁĐ­żĐ­żĐ­ľŃ¬˝Đ޻ΩşĎŞĽÓ¤¶Íź°Ęť®É›«Č¨Ĺ–ĄĹ•¤ĹŽźĆ‹ťÂŽ Ĺ’¤ÉŽˇÄ–ą€“¶…»‘ż~ŽĽzŠąt‚ło}®mx¬ku«ku«XišP^Q[›q|¸†•Ć…•żŹźÉ•¤Ň•¦Ç—©Čš¬Ëź°Ë˘łÍ¤´Ë¤µĘŁ´ÉžŻÄź°ĹŁ±Ç¤łĆ¤łĆĄłĹ§µÇ¨¶Č«¸Č«¸Č«¸Č«¸Č«¸ČŞ·ÇłÄ׳Ä׳ĆŐ±ĂÔ°ÂÓ°ÂÓ°ÁÔ®żŇ¬˝ŇŞ»Đ¤·ĚˇłĘž°Çť®Čś­ČšŞÇ§Ç—¦Ć”ĄĚ†—ľ~ʶ‚“ş†—ľ„•Ľ„”ľ†–Ŕy‰¸s˛k{ŞftĄdrŁep˘doŁcn˘`q˘YgˇVaźq}·…”Ň—Á‘ˇË“˘Đ”¤Č—§Ë›¬Í ŻĎ˘˛Ď˘łÍŁ˛Ě˘˛ÉźŻĆ ±Ć˘łČ¤˛ČŁ˛ĹĄłĆ¦´Ć¨¶ČŞ¶ČŞ¶Č©µÇ¨´Ć¨´Ć©µÇ˛ĂÖ˛ĂÖ´Ć׳ĹÖ±ÂŐ±ÂŐ°ÁÖŻŔŐ¬˝ŇŞşŃ¤ąÎ˘·Í µËť±Ę™¬Ç–¨Ĺ’¤Ă˘Á‡™Â‘ş|Ž·€‘Ľ‘ż|Ś»w†·w†·n}®gv§apˇao esŁlx¨my©mz¨j{¬crŞ\gĄo{µ‚’ÁÂ’˘ĚŹžĚ’¤É”¦ËšŞÎžŻĐˇ°Ńˇ°Đ °ÍˇŻĚťŻĆ °Çˇ±Čˇ˛Ç˘°Ć˘±Ä¤˛Ĺ¦´Ç¦´ÇĄłĆ¤˛ĹŁ±ÄŁ±Ä¤˛Ĺ˛ĂزĂرÂŐ°ÁÔŻŔŐŻŔŐŻżÖ®ľŐ¬ĽÓŞşŃŁ¸Î¤ąĎ˘¶Ďť°Ëš¬É–¨Ĺ‘ŁÂŤźľvŠłzŽ·€“ľ~żs„µfwŞdt©hwŻky­iw«ix©lzŞqŻw„˛x…±x…±p‚±jy±`k©o{µ€ż‰šÁ“¤ËŚśÇ“¤Ë”ĄĚ–§ÎšŞĎś¬Đž¬Đž­Îž­Îś­Çť®Č ŻÉ °Çž®Ĺ ®ÄˇŻĹ˘°Ć ®Ä ®Ä ®ÄˇŻĹˇŻĹˇŻĹ±Â×±Â×­ŔŐ¬żÔ¬ľŐ¬ľŐ¬ľŐ¬˝×Ş»Ő¨ąÓźłĚ ´Íž±Ěš¬É™«Ę©Ę’˘Ć‹›żt†Żv±v‡˛q°fu¦`n˘dr§ly±p~˛t´z‰ş|Šşz‰·x…±u‚®t‚¬t†µo´fq­u‚ş…•ĂŤžĹ–§ÎŹźĘ•§Đ•¨Î•¦Í•¦Í§Î™©Îś©ĎťŞĐ›¬Çś­Čś­Čž­Çś«Ĺ›«Âž¬Ăź­Ä™©Ŕ›«Âť­Äž®Ĺž®Ĺť­Ä±ÁرÁŘ®Ŕ×­żÖ¬ľŐ¬˝×¬˝×¬˝Ř޻֨ąÔ µŃźłŇ¬Ë‘¤ĹŁĆʎÆ—ľz‹˛m}§l|¦l|¦q¬u„˛ułq°lz«s˛{‹ş„”Ç–Ä‚‘ż~‹ąz‡ły†˛wŠ·s¸nyµ€ŤĹŹźÍ‘ŁČ™«Đ–¦Đ«Ń—ŞĐ–©Ď•¦Í•¦Í§Î™¨Ďš©Đ—©ĆŞÇ›«Č›¬Ç›©Ĺ›ŞÄś«Ĺź¬Ć–§Â—¨Ă™ŞĹš«Ćš«Ć©Ä°Ŕ×°Ŕ׬ŔŮ«żŘ©˝Ö¨»Ö¨»Ö¦¸Ő¤¶ÓˇłĐž±Ôš­Đ˘Ç‡™ľ‡żÂ|Ś·l|§p|¤t€¨|°‡“»śÄŹ›Ă…‘»z†°|Ť¸’˝†—Š™Ç—ņ“Á„Ŕ„Ŕx‹¸t„ąt€şŚšĎ©Ô’¤ÉŞĎšŞÔš­Ňš­Ňš­Ň™¬Ń™«Đ—©Î§Î—¦Í—©ČŞÉ™«Č›«Čš«ĆśŞĆť«Çž­Ç™©Ć¨Ĺ¨Ĺ—§Ä–¦Ă•ĄÂ°Ŕ×°Ŕ׫żŘŞľ×§»Ô¦ąÔ¤·Ň˘´Ńź±Îś®Ë‘ŁČŚžĂ”»~ޏ“ľ—Ĺ~Ť»n|¬‚Ś´‰”ş›Á”źĹ•ˇĹ•ˇĹ•ˇĹ” Ä‰śÂšĂ‡™ÂÇ–ć“Ă…‘ÁŽŔv‰¶r¶u»‘źÔ›¬×˘Ç•§ĚšŞÔ™ŻŇś°Óť±Ôť°ŐťŻÔ™«Đ—§Ě•ĄĘŞÉ™«Ęš¬Ëś¬É›«Č›¬Çž¬Čź­É™«Č—©Ć”¦Ă’¤Á‘ŁŔ‘ŁŔ­ľŮ®żÚ¬Ă٨żŐŁąŇžłĎš®Í•¨Éގĉ›Ŕ‰śÁ‰śÂ”ż…•ĂŽžÍ‹›É»{Ś·ŤźľŽ żŹˇŔ•¤Ä§Çš§Ç—¤Ä”ˇÁ™ĄÉ•ˇĂŹžżŚšľŠšż‰—Á„“Á‚Áu€Ľs€¸ŹĂ’˘Đ“¤Ë“ĄĘ›«Đť­ŇŁ´Őˇ˛ÓźŻÓť­Ńť­Ňť­Ňž®ÓźŻÔ™ĄÍś¨Đ˘­ÓŁŻŃ¤ŻĎˇ¬Ęź«ÇźŞĹ—Şż•§ľŁľŤˇŔŤźÄŤźČŞş×©ąÖť˛ÍšŻĘ–«Ç“¨Ä“§Ć•¨É–©Ě—ŞÍ‘ĄČŁČšĂ™Ä ÎŤžÉ„–ż“Ľ˘Á‘ŁÂ“ĄÄ§Ç›ŞĘś«Ëś©É™¦Ćš¦Č—ŁĹ’ˇÂźŔŤťÂ‹™Ă„“ÁŹŔuľx…˝…”Ĺ‘ˇĎ‘˘É”¦Ëť­Ňž®Ó›¬Íś­ÎžŻĐźŻÓ °Ô °ŐźŻÔž®Óť®Ďś­Îś«ËšŞÇśŞÇśŞĆś«Ĺž«ĹŹźĽ˘ż”ĄĆ“¦ÉŽźĆ„–żŁ˛Ň ŻĎ™¬Í™¬Í«Ě–©Ę–©Ę«ĚśŻĐź˛Ó­Í—«ÎŤ ĹŠśĹ‘ŁĚʎƛÁ›Ŕ’¦Ĺ’¦Ĺ–¨Ç™«Ęž­Íž­Íť¬ĚťŞĘś¨Ęš¦Č—¦Ç–ĄĆ’˘ĆŤ›Ĺ„“ÁŤ˝s»{ŠÂŠ›Ě”ĄĐ‘ŁĚ–§Îś­Ô™ŞŃťŻÎž°Ďź°Ń ±ŇźŻÓť­Ńś¬ĐšŞÎś±Í™®Ę–«Ç—©Ć™«Čś¬É›¬Çš«Ć‹šÁŚ›ÂŚ›Â†–Ŕ€ş{Ś·ť¬Ě™¨ČšŞÎť­Ńˇ±Ő˘łÔ ±Ňź°Ńź±Đ ˛Ń™ŻË™®Í¤ÇŤ Ĺ’ĄËŁČ‹źÂŚ Ă”§Č•¨É–©Ęš«Ě›¬Íť¬Íť¬Íś«ĚžŞĚž«Ë›ŞĘš©Ę–¦ĘźĆ…•Ŕ~ŚĽm{µ{‹ŔŹ Ń—¨Ó“ĄÎ«Ń›¬Ó“¤ËźłŇž˛ŃśŻĐ›®Ďš­Đš­Đš­Đš¬ŃŻĎ—¬Ě•©Ě•©Ě«Î•§Ě‘ˇĆ‹›Ŕ€ŽľŹż€Ź˝~Ť»~Žą“ľ °Íś¬É•ĄÉ™©ÍžŻĐ ±ŇžŻĐťŻÎťŻÎž°Ď—­É™®Í“¨ČŹ˘Ç”§Ě’ĄĘŤˇÄĄĹ•ŞĘ–«Ë«Ě«Ěš«Ěš«Ěś«Ěť¬Í ­Íź¬Ěť¬Ěť¬Ě™©Í’ˇČ‡—Â€Ź˝l}µx‹ľŚžÍ‘¤ĎŽ˘Ë–¨Ńš¬Ő‘ŁĚ—ŞË«Ěš­Đ›®ŃśŻŇ›­Ňš¬Ń™«Đ‘¤ĎŤ ËŠťĘ‹›ÉŠšČ–ĆŹż{‰ąv„µ~Ś˝–ĆŹžĚ“ŁÍ—¨Ď§¸Ó¦·Ň˘´ŃˇłĐź±Îś®Ë™«Č™«Ę™«Ę›­Ě—­ÉšŻÎ”¨ËŁČ”§Í’ĄĘŹŁĆ“§Ę–ŞÍ—«Î—«Î«Î—ŞÍ™©Í›«Ďś¬Đˇ®Îź­Ęť­Ęś«Ë™ŞË“ŁČ‰™Ä’Ŕu‡ĽyŚż—ĆŠťČśĹ‘ŁĚŞÓ”ĄĐ“¦Ë–©Îš­Ň›®Ô™¬Ň”¦ĎŤźČšĂÁ|Ťľ{Š»{Š»€Žż„’Æ”œń”ЛÔĄĐ›¬Óž°Őˇ±Ő¬ľŐ­żÖ°ÂŮ­żÖ©şÔĄ¶Đ˘łÎ °Íž­Íś«Ë­ĚšŻĎ“¦ËŤ ĆŹˇĘŤ ĆŚźÄ“¦Ë’¦É“§Ę”¨Ë”¨Ë”§Ę•¨ËšŞÎť­Ń ®Ëź­Ę›«ČšŞÇ—¨É”¤ÉŚśĆ‡–ÄyŽÁvŚĽ€”ɟɊžÇŚ ÉŁÎŹ Ë‘ŁĚ’¤Í“ĄÎ“¤ĎŹ Ë‰™Ç“ÁŹ˝|‹Ľ|Ś»~ŚĽ‚‘ż‰–‘źÉ—ĄĎť©Ń—­Ń«Đ¬Ď™¬Í›®Ď ˛Ń­ŔŐ®ÁÖ«żĐ«żŃ«ľÓ­żÖ®żÚ¬ĽŮ§¶Ö˘±Ń­Í™­ĐŁČ‡™ÂšĂ‡™Â›Á‘¤ÉŠ ĂŽ˘ĹŹŁĆ¤Ç‘¤Ç“¦É™©Íś¬Đ ®Ëž¬É™©Ć¨Ĺ–§Č”¤ÉŤťÇ‰™ÄyŽÁtŠş–æВ¦ĎڠɉśÇ…ʼnšĹ™Ä†—„”„”†–ĹÇŠšÉŚśÇŹźĘ“ŁÍ¨ÍšŞÎť¬Íź®Îˇ±Î—®Î–®Ě­Ě›°ĚžłĎٶѱÂײĂŘ­ÁÓ­ÁÓ­ÁÓ­ŔŐ­ŔŐ­żÖ¬ľŐ«˝Ô¦¸×ˇłŇś­Î™¬Í™¬Ď”¨ËŤˇÄ‡šżŽ¤Ç¦ĘŹ˘ČšĂ‡™ÂŹ Ç—©Îš­ĐťŻĚš¬ËŞÉ©Ę™©Í–¦Ę Ĺ‹›ŔyŠ»Á‡™Č‹ťĚšÉ~‘ľr…˛j}Şw„˛}懔Ŕ‘źÉ§Î›ŞŃ›«ĐšŞĎ«Ě«Ě™¬Í™¬Íš­Îś°Ďť±Đž˛Ńź´Đ µŃŁµŇ¤·ŇĄ¸Ó¨ąÓ±ÂײĂŘ®ÂÔ®ÂÔ®ÂÔ®ÁÖ®ÁÖ­żÖ­żÖ¬ľŐ¨ş×¤¶Ó ˛Ńť±Đž±Ň›°Đ•ŞĘŹŁĆŤŁĆŹĄÉŹˇĘ‰›Ä‡™ÂŤťÇ“ĄĘ–©Ěź±Đž°ĎžŻĐžŻĐť­Ń–¦ËŚśÁ…•şs±y‰·“ÁŤžÉ’ŁÎ’¤ÍŹˇĘŚžÇ•ŁÍ—ĄĎ›ŞŃž­Ô °ŐźŻÓž®Ňś¬Đš­Îš­Îš­Î›®Ď›ŻÎť±Đž˛Ńž˛Ń µŃ µŃˇ¶ŇĄ¸Ó¦ąÔ©şÔ˛ĂŘłÄŮŻĂŐŻĂŐ°ÄÖ°ĂذĂŘŻÁŘ®Ŕ×®ŔשĽ×¦ąÔŁ¶Ń˘·Ó¤ąŐ˘·Öť˛Ń­Ě†śŔťĂŠśĹ‡Ă‡ĂŽžČ”ĄĚŞĎ›¬Íš«Ě™©Í™©Í—§Ë‘ˇĆ‰™ľ“¸„“ş—ľŹžĹ–¦Ëś¬ŃźŻÓˇ±Ő˘˛Ö˘˛Ö˘˛Ö˘˛ÖŁ´ŐŁ´Ő¤¶Ő¤¶Ő¤¶Őž˛Ńť±Đť±Đť±Đť±Đž˛Ńž˛ŃźłŇ ¶Ňˇ¶Ň˘·Ó¤ąÔ§şŐ¨ĽŐłÄŮ´ĹÚ±Ĺ×±Ĺ×±Ĺ×±ÄٱÄٰÂٰÂŮŻÁŘ©ľÔ¦şÓĄąŇŁąŇĄşŐŁşÔźµŃś˛Î‰źĂŠźĹŠśĹ‡Ă…–Á‰™ĂˇČ”¦Ë–¦Ę”¤Č‘ˇĹ‘ˇĹ’˘Ć“ŁÇ’˘Ç‘ˇĆž­Îź®Ď ŻĐˇ°Đ˘±ŃŁłĐŁłĐŁłĐ ˛Ď ˛ĎˇłĐ˘´Ń¤¶ÓĄ·Ô¦ąÔ§şŐˇ¶Ň µŃ µŃźłŇźłŇźłŇźłŇź˛Ó ¶Ňˇ·ÓŁ¸Ô¤ąÔ¦»ÖŞľ×µĆ۶ÇܲĆزĆزĆزĹÚ˛ĹÚ˛Ä۱ĂÚ°ÂŮŞżŐ¨˝Ó§ĽŇĄ»ÔĄ»ÔŁşÔ ·ŃśłÍš°Ó–¬Đ’ĄËŠśĹ•ľ’ą…—Ľ‰śż–¦Ę•ĄÉ•¦Ç—¨É›¬Íź°Ń˘łÔŁ´ŐĄµŇ¦¶Ó§¸Ó§¸Ó¨ąÓ§¸Ň§¸Ň§ąĐĄąŇ¦şÓ§»Ô¨ĽŐ§»Ô¦ąÔĄ¸Ó¤·ŇŁ¸ÓŁ¸Ó˘·Ňˇ¶Ň ´Ó ´Ó łÔ łÔˇ·Óˇ·Ó˘¸ÔĄşŐ§Ľ×¨ľ×¶ÇÜ·ČݲĆزĆŘłÇŮłĆŰłĆ۲Ä۱ĂÚ±ĂÚ¬Á׫ŔÖ©˝Ö§˝Ö¦»ÖŁşÔ ·ŃťłĎž¶Ô™°Đ–ŞÍŁČ‰śÁ†™Ľ›ĽŤˇŔ—¨Éš¬Ëž°ĎŁµÔ§ąÖ¨ş×§ąÖ§şŐ¦·Ń§¸Ň©şÔŞĽÓ«˝Ô«˝Ô«ľÓŞ˝Ň¦»Ń§ĽŇ©ľÔ«żŘ«żŘŞľ×¨»Ö¦ąÔ¤şÓ¤şÓŁ¸Ó˘·Ňˇ¶ŇˇµÔˇ´Őˇ´Őž¶Ňź·Ó˘¸Ô¤»Ő§Ľ×©żŘ·ČݸÉ޲ĆŘłÇŮłÇŮłĆŰłĆ۲Ä۱ĂÚ±ĂÚ«żŘŞľ×©Ľ×¦»ÖĄşÖ˘¸ÔźµŃś±Đ—°Ę•­É—¬Ë—¬Ě”©É’¦Ĺ•ŞĆ›°Ë›­Ęź±Î¤¶Ó§şŐ©˝Ö©˝Ö§ĽŇ¦»Ń¨ĽŐ©˝Ö©ľÔŞżŐŞżÔŞżÔŞżÔ©ľÓ¤ąÎĄşĐ¨˝ÓŞľ×«żŘ¬żÚ«ľŮŞĽŮĄĽŇ¤»ŃŁąŇ˘·Ň˘·Ó˘¶Ő˘µÖ˘µÖž¶Ňž¶Ň ¸Ô¤»Ő¦˝×¨ľ×¸ÉŢąĘ߲ĆŘłÇŮłÇŮłĆŰłĆ۲Ä۱ĂÚ±ĂÚ¨»Ö¨»Ö§şŐ¤ąŐŁ¸Ô µÔť˛Ń›°Ď–°Č–ŻÉ›±Íź´Óť˛Ń™®ĘšŻĘźµÎٶѤ·Ň¦şÓ§»Ô§ĽŇ¨˝ŇŞżÔ«ÁÓ©˝Ö©˝ÖŞżŐŞżŐ«ŔŐ¬ÁÖ¬ÁÖ­ĂŐ«ŔŐ«ŔÖ«ŔÖ«żŘ«ľŮŞ˝ŘŞĽŮ©»Ř¤ĽĐ¤»ŃŁąŇ˘·Ň˘·Ó˘¶Ő˘µÖŁ¶×ťµŃž¶Ňź·ÓŁşÔĄĽÖ§ż×´ĹÚ´ĹÚ˛ĹÚ˛ĹÚłĆŰłĆ۲ĹÚ±ÄŮŻÂ×®ÁÖ§ĽŇ¦»ŃĄşĐ¤ąĎŁ¸ÎŁ¸ÎŁ¸ÎŁ¸Î¤ąĎĄşĐ¦»Ń¦»Ń¦»ŃĄşĐ¤ąĎŁ¸Î ˛Ń¤¶Ó§ąÖ¨»Ö¨ĽŐ§»Ô©ľÔ«ŔÖ­ŔŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ¬żÔ¬żÔ¬żÔ­żÖ­żÖ­żÖ­żÖ­żÖ­żÖ­żÖ­żÖ«ŔÖ©ľÔ§»Ô¦ąÔĄ·ÔĄ·Ö¤µÖ˘łÔžłŇ µÔ˘¸Ô¦»Ö¨˝Ř¬ŔٵĆ۵ĆŰ´ÇÜłĆŰłĆ۲ĹÚ±ÄŮŻÂ×®ÁÖ­ŔŐ©ľÔ©ľÔ¨˝Ó¨˝Ó¨˝Ó¨˝Ó¨˝Ó©ľÔ§ĽŇ§ĽŇ¨˝Ó¨˝Ó¨˝Ó§ĽŇ¦»ŃĄşĐ˘´Ń¤¶Ó§şŐ¨»Ö¨ĽŐ¨ĽŐ©ľÔŞżŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ­żÖ­żÖ­żÖ­żÖ­żÖ­żÖ­żÖ­żÖ«ŔÖŞżŐ¨ĽŐ§şŐ¦¸Ő¦¸×¤¶ŐŁ´Őź´Ó µÔ˘¸Ô¦»Ö©ľŮ¬ŔٶÇܶÇܵČÝ´ÇÜłĆ۱ÄŮŻÂ×®ÁÖ®ÁÖ­ŔŐ¬Á׬Á׫ŔÖ«ŔÖ¬Á׬Á×­ÂŘ­ÂŘ©ľÔŞżŐŞżŐŞżŐŞżŐ©ľÔ¨˝Ó¨˝ÓĄ¸ÓĄ¸Ó¦ąÔ§»Ô©˝ÖŞľ×©ľÔ¨˝Ó­ŔŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ®Ŕ×®Ŕ×®Ŕ×®Ŕ×®Ŕ×®Ŕ×®Ŕ×®Ŕ׬Á׫ŔÖ©˝Ö¨ĽŐ¨»Ö§ąÖĄ·ÖŁµÔź´Óˇ¶ŐŁąŐ§Ľ×©ľŮ­ÁÚµĆ۶ÇܵČÝłĆ۲ĹÚ°ĂŘŻÂׯÂׯÂׯÂ×­Â×­Â×­Â׬ÁÖ¬ÁÖ­Â×­Â×®ĂŘ«ŔŐ«ŔŐ«ŔŐ«ŔŐ«ŔŐ«ŔŐŞżÔŞżÔ¨ĽŐ¦şÓĄąŇ§»ÔŞľ×«żŘ©ľÔ§ĽŇ­ŔŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ­ŔŐ®ÁÖ®ÁÖŻÂׯÂׯÂׯÂׯÂׯÂׯÂׯÂ×­Â׫ŔŐŞżŐ©˝Ö©Ľ×¨ş×¦¸×¤¶Ő µÔˇ¶Ő¤şÖ§Ľ×ŞżÚ®ÂŰ´ĹÚµĆŰłĆ۲ĹÚ±ÄٰĂذĂرÄٲĹÚ˛ĹÚ°ĹÚ°ĹÚŻÄŮ®ĂŘ­Â×­Â×­Â×­Â×­Â׬ÁÖ¬ÁÖ¬ÁÖ«ŔŐ«ŔŐ«ŔŐ«ŔŐŞżŐ¨˝Ó¦»Ń§ĽŇ©ľÔ«ŔÖ©˝Ö§»Ô­ŔŐ­ŔŐ­ŔŐ­ŔŐ®ÁÖ®ÁÖ®ÁÖ®ÁÖ°ĂذĂذĂذĂذĂذĂذĂذĂŘ­Â׬ÁÖ«ŔÖŞľ×Şľ×©Ľ×¦¸Ő¤¶Ó µÔˇ¶Ő¤şÖ§Ľ×ŞżÚ®ÂŰ´ĹÚ´ĹÚ˛ĹÚ±ÄٱÄٱÄٲĹÚłĆŰłĆŰ´ÇÜłÉŰłÉ۱ÇٰĆŘŻĹׯĹׯĹׯĹ×®ÄÖ­ĂŐ¬ÂÔ¬ÂÔ¬ÂÔ¬ÂÔ¬ÂÔ¬ÂÔ«ŔŐŞżÔ¨˝Ň¨˝Ó©ľÔ©ľÔ©˝Ö¨ĽŐ¬żÔ­ŔŐ­ŔŐ­ŔŐ®ÁÖ®ÁÖŻÂׯÂ×°ÄÖ°ÄÖ°ÄÖ°ÄÖ°ÄÖ°ÄÖ°ÄÖ°ÄÖ¬ÂÔ¬ÁÖ«ŔŐ«ŔÖ«żŘ©Ľ×¦¸Ő¤¶Óź´Óˇ¶ŐŁąŐ§Ľ×©ľŮ­ÁÚµĆ۵Ć۲ĹÚłĆŰłĆŰ´ÇÜ´ÇÜ´ÇÜłĆŰłĆŰłÉŰłÉ۲ČÚ±ÇٱÇٱÇٱÇٱÇŮŻĹׯĹ×®ÄÖ­ĂŐ¬ÂÔ­ĂŐ­ĂŐ®ÄÖ«ÁÓ«ÁÓ«ŔŐ©ľÓ¨˝Ó§ĽŇ¨ĽŐ©˝Ö¬żÔ­ŔŐ­ŔŐ®ÁÖ®ÁÖŻÂׯÂׯÂ×°ÄÖ°ÄÖ°ÄÖ°ÄÖ°ÄÖ°ÄÖ°ÄÖ°ÄÖ¬ÂÔ«ÁÓ«ŔŐ«ŔÖ«żŘ©Ľ×¦ąÔŁµŇź´Ó µÔ˘¸Ô¦»Ö©ľŮ¬ŔٶÇܶÇÜłĆŰ´ÇܵČݵČݵČÝ´ÇÜłĆ۲ĹÚ±ÇٰĆذĆذĆذĆرÇٱÇٲČÚ°ĆذĆŘŻĹ×®ÄÖ­ĂŐ®ÄÖ®ÄÖŻĹ׫ÂҬÂÔ¬ÂÔŞżÔ§ĽŇ¦»Ń¨ĽŐŞľ×¬żÔ­ŔŐ­ŔŐ®ÁÖ®ÁÖŻÂׯÂ×°ĂŘŻĂŐŻĂŐŻĂŐŻĂŐŻĂŐŻĂŐŻĂŐŻĂŐ«ÁÓ«ÁÓŞżÔ«ŔÖ«żŘ©˝ÖĄ¸ÓŁ¶ŃžłŇ µÔ˘¸Ô¦»Ö¨˝Ř¬ŔŮ´ÇÜłĆ۶ĘܶĘܶĘܶĘܶĘܶĘܶĘܶĘܲČÚłÉŰłÉŰłÉ۱ÇٱÇٱÇٲČÚ´ČٵÉÚ¶Ę۶ĘŰ´ČٲĆײĆ׳ÇزĆرĹ×°ÄÖŻĂŐŻĂŐ®ÂÔ®ÂÔ®ÂÔ°ÄÖ°ÄÖ°ÄÖ°ÄÖ±Ĺ×±Ĺ×±Ĺ×±Ĺ×±Ĺ×±Ĺ×±Ĺ×±Ĺ×±Ĺ×±Ĺ×±Ĺ×±ĹׯĂÔ°ÄŐ­ĂŐ©ľÓ¨˝Ó§˝Ö§˝Ö¤ąÔ˘łÎٶэş×©ľÚ¦ĽŘĄ»×fox1.6-1.6.57/compile000077500000000000000000000163261326741342000142230ustar00rootroot00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2016-01-11.22; # UTC # Copyright (C) 1999-2017 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fox1.6-1.6.57/config.guess000077500000000000000000001264621326741342000151700ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2017 Free Software Foundation, Inc. timestamp='2017-08-08' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || \ echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case "${UNAME_MACHINE_ARCH}" in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "${UNAME_MACHINE_ARCH}" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; *:Sortix:*:*) echo ${UNAME_MACHINE}-unknown-sortix exit ;; *:Redox:*:*) echo ${UNAME_MACHINE}-unknown-redox exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = hppa2.0w ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; e2k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; k1om:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; mips64el:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac cat >&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fox1.6-1.6.57/config.sub000077500000000000000000001072571326741342000146340ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2017 Free Software Foundation, Inc. timestamp='2017-04-02' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | wasm32 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` os=$os"spe" ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; nsx-tandem) basic_machine=nsx-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; wasm32) basic_machine=wasm32-unknown ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -ios) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; pru-*) os=-elf ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fox1.6-1.6.57/configure000077500000000000000000024221101326741342000145460ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for fox 1.6.57. # # Report bugs to . # # # 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 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || 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 and $0: jeroen@fox-toolkit.com about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: 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'" SHELL=${CONFIG_SHELL-/bin/sh} 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='fox' PACKAGE_TARNAME='fox' PACKAGE_VERSION='1.6.57' PACKAGE_STRING='fox 1.6.57' PACKAGE_BUGREPORT='jeroen@fox-toolkit.com' PACKAGE_URL='' ac_unique_file="include/fx.h" # 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_header_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS GL_LIBS X_BASE_LIBS FOX_BYTEORDER X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF CXXCPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP NM ac_ct_DUMPBIN DUMPBIN LD FGREP SED host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL LN_S am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC LT_AGE LT_REVISION LT_CURRENT LT_RELEASE FOX_PATCH_LEVEL FOX_MINOR_VERSION FOX_MAJOR_VERSION AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_aix_soname with_gnu_ld with_sysroot enable_libtool_lock with_x enable_debug enable_release with_profiling enable_jpeg enable_png enable_tiff enable_zlib enable_bz2lib with_xft with_xshm with_shape with_xcursor with_xrender with_xrandr with_xfixes with_xinput with_xim with_opengl ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC LT_SYS_LIBRARY_PATH CXXCPP 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 fox 1.6.57 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/fox] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of fox 1.6.57:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-debug compile for debugging --enable-release compile for release --disable-jpeg compile without JPEG image support --disable-png compile without PNG image support --disable-tiff compile without TIFF image support --disable-zlib compile without zlib support --disable-bz2lib compile without bz2lib support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-x use the X Window System --with-profiling choices are yes, no, or gprof --with-xft enable Xft support --with-xshm compile with XShm support --with-shape enable XShape support --with-xcursor compile with Xcursor support --with-xrender compile with XRender support --with-xrandr compile with XRandR support --with-xfixes compile with XFixes support --with-xinput compile with XInput support --with-xim compile with XIM support --with-opengl choices are yes, no 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 CXX C++ compiler command CXXFLAGS C++ compiler flags LT_SYS_LIBRARY_PATH User-defined run-time library search path. CXXCPP 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 . _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 fox configure 1.6.57 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_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;} ( $as_echo "## ------------------------------------- ## ## Report this to jeroen@fox-toolkit.com ## ## ------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_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_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_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_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_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_cxx_preproc_warn_flag$ac_cxx_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_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_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_cxx_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_cxx_try_link # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_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_cxx_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_cxx_check_func # ac_fn_cxx_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_cxx_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_cxx_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_cxx_check_header_compile # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_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_cxx_try_run # ac_fn_cxx_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_cxx_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_cxx_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_cxx_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_cxx_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;} ( $as_echo "## ------------------------------------- ## ## Report this to jeroen@fox-toolkit.com ## ## ------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&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_cxx_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 fox $as_me 1.6.57, 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 as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_header_list " sys/param.h" # 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 am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$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. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='fox' VERSION='1.6.57' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Set version FOX_MAJOR_VERSION=1 FOX_MINOR_VERSION=6 FOX_PATCH_LEVEL=57 # Binaries compiled with this patchlevel of FOX will need at least # version MAJOR.MINOR.INTERFACE_VERSION to run. The assertion # FOX_INTERFACE_VERSION >= FOX_BINARY_VERSION must hold. # # Increment this when an API is added FOX_INTERFACE_VERSION=0 # Binaries compiled with at least MAJOR.MINOR.BINARY_VERSION are # compatible with this release of FOX. # # Set this to FOX_INTERFACE_VERSION's value if API changed or removed FOX_BINARY_VERSION=0 # Report what was found { $as_echo "$as_me:${as_lineno-$LINENO}: checking major version" >&5 $as_echo_n "checking major version... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FOX_MAJOR_VERSION" >&5 $as_echo "$FOX_MAJOR_VERSION" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking minor version" >&5 $as_echo_n "checking minor version... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FOX_MINOR_VERSION" >&5 $as_echo "$FOX_MINOR_VERSION" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking patch level" >&5 $as_echo_n "checking patch level... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FOX_PATCH_LEVEL" >&5 $as_echo "$FOX_PATCH_LEVEL" >&6; } # Substitute variables in output files # CURRENT: Most recent interface library implements # REVISION: The implementation number of the CURRENT interface # AGE: The difference between the newest and oldest interfaces that this # library implements. The library implements all the interface numbers # in the range from number CURRENT - AGE to CURRENT. LT_RELEASE=$FOX_MAJOR_VERSION.$FOX_MINOR_VERSION LT_CURRENT=$FOX_INTERFACE_VERSION LT_REVISION=`expr $FOX_PATCH_LEVEL - $FOX_INTERFACE_VERSION` LT_AGE=`expr $FOX_INTERFACE_VERSION - $FOX_BINARY_VERSION` # Substitute variables in output files # Prevents setting flags. CXXFLAGS="" # More secret source DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $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 ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h # Check using C++ 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 # Checks for programs. 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=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 depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu 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=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 ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=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 depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi { $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 case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.6' macro_revision='2.4.6' ltmain=$ac_aux_dir/ltmain.sh # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_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 do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_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 '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "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_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_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_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_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 fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_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 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "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_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_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_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" 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_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # 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_DUMPBIN="$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 DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" 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_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # 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_DUMPBIN="$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_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" 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 DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; 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_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # 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_OBJDUMP="${ac_tool_prefix}objdump" $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 OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; 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_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # 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_OBJDUMP="objdump" $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_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" 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 OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; 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_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # 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_DLLTOOL="${ac_tool_prefix}dlltool" $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 DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; 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_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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_DLLTOOL="dlltool" $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_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" 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 DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar 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_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$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 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 test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar 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_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="$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_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 test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" 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 fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: 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 test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 $as_echo "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 $as_echo_n "checking for a working dd... " >&6; } if ${ac_cv_path_lt_DD+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_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 do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in dd; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 $as_echo "$ac_cv_path_lt_DD" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 $as_echo_n "checking how to truncate binary pipes... " >&6; } if ${lt_cv_truncate_bin+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 $as_echo "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext 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 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; 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_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # 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_MANIFEST_TOOL="${ac_tool_prefix}mt" $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 MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; 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_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # 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_MANIFEST_TOOL="mt" $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_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" 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 MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; 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_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # 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_DSYMUTIL="${ac_tool_prefix}dsymutil" $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 DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; 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_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # 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_DSYMUTIL="dsymutil" $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_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" 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 DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; 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_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # 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_NMEDIT="${ac_tool_prefix}nmedit" $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 NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; 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_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # 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_NMEDIT="nmedit" $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_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" 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 NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; 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_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # 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_LIPO="${ac_tool_prefix}lipo" $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 LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; 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_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # 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_LIPO="lipo" $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_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" 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 LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; 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_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # 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_OTOOL="${ac_tool_prefix}otool" $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 OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; 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_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # 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_OTOOL="otool" $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_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" 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 OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; 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_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # 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_OTOOL64="${ac_tool_prefix}otool64" $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 OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; 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_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # 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_OTOOL64="otool64" $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_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" 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 OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; esac } # func_stripname_cnf # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else pic_mode=default fi # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 $as_echo_n "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test "${with_aix_soname+set}" = set; then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else if ${lt_cv_with_aix_soname+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 $as_echo "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC 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 # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=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_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen=shl_load else { $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 : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen=dlopen else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=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_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=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_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} 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 dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=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_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi fi fi fi fi fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $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 ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report what library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi 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 CC=$lt_save_CC if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then 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 { $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; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_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_cxx_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_cxx_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_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_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_cxx_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_cxx_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 \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi 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 else _lt_caught_CXX_error=yes fi 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 archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC func_cc_basename $compiler cc_basename=$func_cc_basename_result if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec_CXX='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. no_undefined_flag_CXX='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' $wl-bernotok' allow_undefined_flag_CXX=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='$wl--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" if test yes != "$lt_cv_apple_cc_single_mod"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi else ld_shlibs_CXX=no fi ;; os2*) hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_minus_L_CXX=yes allow_undefined_flag_CXX=unsupported shrext_cmds=.dll archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_CXX=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='$wl-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='$wl-E' whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then no_undefined_flag_CXX=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='$wl-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='$wl-z,text' allow_undefined_flag_CXX='$wl-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no GCC_CXX=$GXX LD_CXX=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX=$prev$p else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX=$prev$p else postdeps_CXX="${postdeps_CXX} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$predep_objects_CXX"; then predep_objects_CXX=$p else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX=$p else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi lt_prog_compiler_pic_CXX='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_CXX='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec_CXX='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test yes = "$hardcode_automatic_CXX"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_CXX" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && test no != "$hardcode_minus_L_CXX"; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test relink = "$hardcode_action_CXX" || test yes = "$inherit_rpath_CXX"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" 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 ac_config_commands="$ac_config_commands libtool" # Only expand once: X_BASE_LIBS="-lX11 -lXext" LIBGLU="-lGLU" LIBGL="-lGL" # Checks for header files. { $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_cxx_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_cxx_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 if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_cxx_werror_flag=$ac_xsave_cxx_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" 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 XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $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 dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_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_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $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 dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_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_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_cxx_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $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_cxx_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 : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $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_cxx_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_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_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_cxx_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=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_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_cxx_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $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 remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=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_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_cxx_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $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 shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=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_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=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_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_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 for ac_func in getpagesize do : ac_fn_cxx_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if ${ac_cv_func_mmap_fixed_mapped+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; const char *cdata2; int i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); if (munmap (data2, pagesize)) return 8; /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=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: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt if test "$no_x" = yes; then X_BASE_LIBS="-lcomctl32 -lwsock32 -lwinspool -lmpr -lgdi32 -limm32" LIBGLU="-lglu32" LIBGL="-lopengl32" fi # Byte order { $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_cxx_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_cxx_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_cxx_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_cxx_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_cxx_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_cxx_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_cxx_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) FOX_BYTEORDER=1;; #( no) FOX_BYTEORDER=0 ;; #( 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 # Threads { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 $as_echo_n "checking for clock_gettime in -lrt... " >&6; } if ${ac_cv_lib_rt_clock_gettime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $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 clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_rt_clock_gettime=yes else ac_cv_lib_rt_clock_gettime=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_rt_clock_gettime" >&5 $as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRT 1 _ACEOF LIBS="-lrt $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_exit in -lpthread" >&5 $as_echo_n "checking for pthread_exit in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_exit+:} 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_exit (); int main () { return pthread_exit (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_exit=yes else ac_cv_lib_pthread_pthread_exit=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_exit" >&5 $as_echo "$ac_cv_lib_pthread_pthread_exit" >&6; } if test "x$ac_cv_lib_pthread_pthread_exit" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" fi # Check for dynamic loader { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=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_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" 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_cxx_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 : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDLD 1 _ACEOF LIBS="-ldld $LIBS" fi # Check vsscanf for ac_func in vsscanf vsnprintf strtoll strtoull do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_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 # Add copious amounts of debugging with gcc if test "${GXX}" = "yes" ; then CXXFLAGS="${CXXFLAGS} -Wall -Wformat -Woverloaded-virtual -Wshadow -DUNICODE" #LDFLAGS="-rdynamic ${LDFLAGS}" LDFLAGS="-no-undefined ${LDFLAGS}" fi # Debugging turned on { $as_echo "$as_me:${as_lineno-$LINENO}: checking for debugging" >&5 $as_echo_n "checking for debugging... " >&6; } # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_debug" >&5 $as_echo "$enable_debug" >&6; } if test "x$enable_debug" = "xyes" ; then CXXFLAGS="${CXXFLAGS} -g -DDEBUG" fi # Building for release { $as_echo "$as_me:${as_lineno-$LINENO}: checking for release build" >&5 $as_echo_n "checking for release build... " >&6; } # Check whether --enable-release was given. if test "${enable_release+set}" = set; then : enableval=$enable_release; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_release" >&5 $as_echo "$enable_release" >&6; } if test "x$enable_release" = "xyes" ; then CXXFLAGS="${CXXFLAGS} -O2 -DNDEBUG" if test "${GXX}" = "yes" ; then CXXFLAGS="${CXXFLAGS} -Wuninitialized -ffast-math -fstrict-aliasing -finline-functions -fomit-frame-pointer -fexpensive-optimizations" LDFLAGS="-s ${LDFLAGS}" fi fi # Enable profiling { $as_echo "$as_me:${as_lineno-$LINENO}: checking for profiling" >&5 $as_echo_n "checking for profiling... " >&6; } # Check whether --with-profiling was given. if test "${with_profiling+set}" = set; then : withval=$with_profiling; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_profiling" >&5 $as_echo "$with_profiling" >&6; } if test "x$with_profiling" = "xyes" ; then CXXFLAGS="${CXXFLAGS} -p" elif test "x$with_profiling" = "xgprof" ; then CXXFLAGS="${CXXFLAGS} -pg" fi # Check for JPEG Image support # Check whether --enable-jpeg was given. if test "${enable_jpeg+set}" = set; then : enableval=$enable_jpeg; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_jpeg" >&5 $as_echo "$enable_jpeg" >&6; } if test "x$enable_jpeg" != "xno"; then ac_fn_cxx_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" if test "x$ac_cv_header_jpeglib_h" = xyes; then : CXXFLAGS="${CXXFLAGS} -DHAVE_JPEG_H=1"; LIBS="${LIBS} ${LIBJPEG:=-ljpeg}" fi fi # Check for PNG Image support; note zlib is needed for PNG # Check whether --enable-png was given. if test "${enable_png+set}" = set; then : enableval=$enable_png; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_png" >&5 $as_echo "$enable_png" >&6; } if test "x$enable_png" != "xno"; then for ac_header in png.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" if test "x$ac_cv_header_png_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PNG_H 1 _ACEOF CXXFLAGS="${CXXFLAGS} -DHAVE_PNG_H=1"; LIBS="${LIBS} ${LIBPNG:=-lpng}" fi done fi # Check for TIFF Image support; note zlib is needed for TIFF # Check whether --enable-tiff was given. if test "${enable_tiff+set}" = set; then : enableval=$enable_tiff; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_tiff" >&5 $as_echo "$enable_tiff" >&6; } if test "x$enable_tiff" != "xno"; then for ac_header in tiff.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "tiff.h" "ac_cv_header_tiff_h" "$ac_includes_default" if test "x$ac_cv_header_tiff_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TIFF_H 1 _ACEOF CXXFLAGS="${CXXFLAGS} -DHAVE_TIFF_H=1"; LIBS="${LIBS} ${LIBTIFF:=-ltiff}" fi done fi # Check for libz compression library # Check whether --enable-zlib was given. if test "${enable_zlib+set}" = set; then : enableval=$enable_zlib; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_zlib" >&5 $as_echo "$enable_zlib" >&6; } if test "x$enable_zlib" != "xno"; then for ac_header in zlib.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ZLIB_H 1 _ACEOF CXXFLAGS="${CXXFLAGS} -DHAVE_ZLIB_H=1"; LIBS="${LIBS} ${LIBZ:=-lz}" fi done fi # Check for bzip2 compression library # Check whether --enable-bz2lib was given. if test "${enable_bz2lib+set}" = set; then : enableval=$enable_bz2lib; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_bz2lib" >&5 $as_echo "$enable_bz2lib" >&6; } if test "x$enable_bz2lib" != "xno"; then for ac_header in bzlib.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default" if test "x$ac_cv_header_bzlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BZLIB_H 1 _ACEOF CXXFLAGS="${CXXFLAGS} -DHAVE_BZ2LIB_H=1"; LIBS="${LIBS} ${LIBBZ2:=-lbz2}" fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Xft support" >&5 $as_echo_n "checking for Xft support... " >&6; } # Check whether --with-xft was given. if test "${with_xft+set}" = set; then : withval=$with_xft; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_xft" >&5 $as_echo "$with_xft" >&6; } if test "x$with_xft" != "xno"; then XFTCFLAGS="-I/usr/include/freetype2" XFTLIBS="-lfreetype -lfontconfig -lXft" saved_cppflags="${CXXFLAGS}" CXXFLAGS="${CXXFLAGS} -DHAVE_XFT_H=1 $XFTCFLAGS" X_BASE_LIBS="${X_BASE_LIBS} $XFTLIBS" fi # Check whether --with-xshm was given. if test "${with_xshm+set}" = set; then : withval=$with_xshm; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_xshm" >&5 $as_echo "$with_xshm" >&6; } if test "x$with_xshm" != "xno"; then for ac_header in X11/extensions/XShm.h do : ac_fn_cxx_check_header_compile "$LINENO" "X11/extensions/XShm.h" "ac_cv_header_X11_extensions_XShm_h" "#include " if test "x$ac_cv_header_X11_extensions_XShm_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_EXTENSIONS_XSHM_H 1 _ACEOF CXXFLAGS="${CXXFLAGS} -DHAVE_XSHM_H=1" fi done fi # Check whether --with-shape was given. if test "${with_shape+set}" = set; then : withval=$with_shape; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_shape" >&5 $as_echo "$with_shape" >&6; } if test "x$with_shape" != "xno"; then for ac_header in X11/extensions/shape.h do : ac_fn_cxx_check_header_compile "$LINENO" "X11/extensions/shape.h" "ac_cv_header_X11_extensions_shape_h" "#include " if test "x$ac_cv_header_X11_extensions_shape_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_EXTENSIONS_SHAPE_H 1 _ACEOF CXXFLAGS="${CXXFLAGS} -DHAVE_XSHAPE_H=1" fi done fi # Check for Xcursor support # Check whether --with-xcursor was given. if test "${with_xcursor+set}" = set; then : withval=$with_xcursor; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_xcursor" >&5 $as_echo "$with_xcursor" >&6; } if test "x$with_xcursor" != "xno"; then for ac_header in X11/Xcursor/Xcursor.h do : ac_fn_cxx_check_header_compile "$LINENO" "X11/Xcursor/Xcursor.h" "ac_cv_header_X11_Xcursor_Xcursor_h" "#include " if test "x$ac_cv_header_X11_Xcursor_Xcursor_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_XCURSOR_XCURSOR_H 1 _ACEOF CXXFLAGS="${CXXFLAGS} -DHAVE_XCURSOR_H=1"; X_BASE_LIBS="${X_BASE_LIBS} -lXcursor" fi done fi # Check for XRender support # Check whether --with-xrender was given. if test "${with_xrender+set}" = set; then : withval=$with_xrender; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_xrender" >&5 $as_echo "$with_xrender" >&6; } if test "x$with_xrender" != "xno"; then for ac_header in X11/extensions/Xrender.h do : ac_fn_cxx_check_header_compile "$LINENO" "X11/extensions/Xrender.h" "ac_cv_header_X11_extensions_Xrender_h" "#include " if test "x$ac_cv_header_X11_extensions_Xrender_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_EXTENSIONS_XRENDER_H 1 _ACEOF CXXFLAGS="${CXXFLAGS} -DHAVE_XRENDER_H=1"; X_BASE_LIBS="${X_BASE_LIBS} -lXrender" fi done fi # Check for XRandR support # Check whether --with-xrandr was given. if test "${with_xrandr+set}" = set; then : withval=$with_xrandr; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_xrandr" >&5 $as_echo "$with_xrandr" >&6; } if test "x$with_xrandr" != "xno"; then for ac_header in X11/extensions/Xrandr.h do : ac_fn_cxx_check_header_compile "$LINENO" "X11/extensions/Xrandr.h" "ac_cv_header_X11_extensions_Xrandr_h" "#include " if test "x$ac_cv_header_X11_extensions_Xrandr_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_EXTENSIONS_XRANDR_H 1 _ACEOF CXXFLAGS="${CXXFLAGS} -DHAVE_XRANDR_H=1"; X_BASE_LIBS="${X_BASE_LIBS} -lXrandr" fi done fi # Check for XFixes support # Check whether --with-xfixes was given. if test "${with_xfixes+set}" = set; then : withval=$with_xfixes; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_xfixes" >&5 $as_echo "$with_xfixes" >&6; } if test "x$with_xfixes" != "xno"; then for ac_header in X11/extensions/Xfixes.h do : ac_fn_cxx_check_header_compile "$LINENO" "X11/extensions/Xfixes.h" "ac_cv_header_X11_extensions_Xfixes_h" "#include " if test "x$ac_cv_header_X11_extensions_Xfixes_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_EXTENSIONS_XFIXES_H 1 _ACEOF CXXFLAGS="${CXXFLAGS} -DHAVE_XFIXES_H=1"; X_BASE_LIBS="${X_BASE_LIBS} -lXfixes" fi done fi # Check for XInput support # Check whether --with-xinput was given. if test "${with_xinput+set}" = set; then : withval=$with_xinput; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_xinput" >&5 $as_echo "$with_xinput" >&6; } if test "x$with_xinput" != "xno"; then for ac_header in X11/extensions/XInput.h do : ac_fn_cxx_check_header_compile "$LINENO" "X11/extensions/XInput.h" "ac_cv_header_X11_extensions_XInput_h" "#include " if test "x$ac_cv_header_X11_extensions_XInput_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_EXTENSIONS_XINPUT_H 1 _ACEOF CXXFLAGS="${CXXFLAGS} -DHAVE_XINPUT_H=1"; X_BASE_LIBS="${X_BASE_LIBS} -lXi" fi done fi # Check for Input Method support # Check whether --with-xim was given. if test "${with_xim+set}" = set; then : withval=$with_xim; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_xim" >&5 $as_echo "$with_xim" >&6; } ##if test "x$with_xim" = "xno"; then if test "x$with_xim" != "xyes"; then CXXFLAGS="${CXXFLAGS} -DNO_XIM" fi # Substitute variables in output files # Compile with 3D support { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenGL support" >&5 $as_echo_n "checking for OpenGL support... " >&6; } # Check whether --with-opengl was given. if test "${with_opengl+set}" = set; then : withval=$with_opengl; fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_opengl" >&5 $as_echo "$with_opengl" >&6; } if test "x$with_opengl" != "xno" ; then ac_fn_cxx_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default" if test "x$ac_cv_header_GL_glu_h" = xyes; then : CXXFLAGS="${CXXFLAGS} -DHAVE_GLU_H=1"; LIBS="${LIBS} ${LIBGLU}" fi ac_fn_cxx_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" if test "x$ac_cv_header_GL_gl_h" = xyes; then : CXXFLAGS="${CXXFLAGS} -DHAVE_GL_H=1"; LIBS="${LIBS} ${LIBGL}" fi GL_LIBS="${LIBGL} ${LIBGLU}" fi # Substitute variables in output files # Done. ac_config_files="$ac_config_files Makefile utils/Makefile include/Makefile include/fxver.h src/Makefile src/version.rc chart/Makefile doc/Makefile doc/art/Makefile doc/screenshots/Makefile tests/Makefile adie/Makefile shutterbug/Makefile pathfinder/Makefile calculator/Makefile windows/Makefile fox.spec fox-config fox.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${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 fox $as_me 1.6.57, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ fox config.status 1.6.57 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "include/fxver.h") CONFIG_FILES="$CONFIG_FILES include/fxver.h" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/version.rc") CONFIG_FILES="$CONFIG_FILES src/version.rc" ;; "chart/Makefile") CONFIG_FILES="$CONFIG_FILES chart/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/art/Makefile") CONFIG_FILES="$CONFIG_FILES doc/art/Makefile" ;; "doc/screenshots/Makefile") CONFIG_FILES="$CONFIG_FILES doc/screenshots/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "adie/Makefile") CONFIG_FILES="$CONFIG_FILES adie/Makefile" ;; "shutterbug/Makefile") CONFIG_FILES="$CONFIG_FILES shutterbug/Makefile" ;; "pathfinder/Makefile") CONFIG_FILES="$CONFIG_FILES pathfinder/Makefile" ;; "calculator/Makefile") CONFIG_FILES="$CONFIG_FILES calculator/Makefile" ;; "windows/Makefile") CONFIG_FILES="$CONFIG_FILES windows/Makefile" ;; "fox.spec") CONFIG_FILES="$CONFIG_FILES fox.spec" ;; "fox-config") CONFIG_FILES="$CONFIG_FILES fox-config" ;; "fox.pc") CONFIG_FILES="$CONFIG_FILES fox.pc" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # The names of the tagged configurations supported by this script. available_tags='CXX ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; 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 fox1.6-1.6.57/configure.ac000066400000000000000000000216361326741342000151330ustar00rootroot00000000000000# Version of the code m4_define([fox_major], [1]) m4_define([fox_minor], [6]) m4_define([fox_level], [57]) m4_define([fox_version],[fox_major.fox_minor.fox_level]) # Init AC_INIT(fox,[fox_version],jeroen@fox-toolkit.com) AC_CONFIG_SRCDIR([include/fx.h]) AM_INIT_AUTOMAKE([foreign]) # Set version FOX_MAJOR_VERSION=fox_major FOX_MINOR_VERSION=fox_minor FOX_PATCH_LEVEL=fox_level # Binaries compiled with this patchlevel of FOX will need at least # version MAJOR.MINOR.INTERFACE_VERSION to run. The assertion # FOX_INTERFACE_VERSION >= FOX_BINARY_VERSION must hold. # # Increment this when an API is added FOX_INTERFACE_VERSION=0 # Binaries compiled with at least MAJOR.MINOR.BINARY_VERSION are # compatible with this release of FOX. # # Set this to FOX_INTERFACE_VERSION's value if API changed or removed FOX_BINARY_VERSION=0 # Report what was found AC_MSG_CHECKING(major version) AC_MSG_RESULT($FOX_MAJOR_VERSION) AC_MSG_CHECKING(minor version) AC_MSG_RESULT($FOX_MINOR_VERSION) AC_MSG_CHECKING(patch level) AC_MSG_RESULT($FOX_PATCH_LEVEL) # Substitute variables in output files AC_SUBST(FOX_MAJOR_VERSION) AC_SUBST(FOX_MINOR_VERSION) AC_SUBST(FOX_PATCH_LEVEL) # CURRENT: Most recent interface library implements # REVISION: The implementation number of the CURRENT interface # AGE: The difference between the newest and oldest interfaces that this # library implements. The library implements all the interface numbers # in the range from number CURRENT - AGE to CURRENT. LT_RELEASE=$FOX_MAJOR_VERSION.$FOX_MINOR_VERSION LT_CURRENT=$FOX_INTERFACE_VERSION LT_REVISION=`expr $FOX_PATCH_LEVEL - $FOX_INTERFACE_VERSION` LT_AGE=`expr $FOX_INTERFACE_VERSION - $FOX_BINARY_VERSION` # Substitute variables in output files AC_SUBST(LT_RELEASE) AC_SUBST(LT_CURRENT) AC_SUBST(LT_REVISION) AC_SUBST(LT_AGE) # Prevents setting flags. CXXFLAGS="" # More secret source AC_GNU_SOURCE # Check using C++ AC_LANG(C++) # Checks for programs. AC_PROG_CXX AC_PROG_CC AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_LIBTOOL X_BASE_LIBS="-lX11 -lXext" LIBGLU="-lGLU" LIBGL="-lGL" # Checks for header files. AC_PATH_X AC_PATH_XTRA AC_HEADER_TIME AC_HEADER_SYS_WAIT AC_HEADER_DIRENT AC_FUNC_MMAP if test "$no_x" = yes; then X_BASE_LIBS="-lcomctl32 -lwsock32 -lwinspool -lmpr -lgdi32 -limm32" LIBGLU="-lglu32" LIBGL="-lopengl32" fi # Byte order AC_C_BIGENDIAN([FOX_BYTEORDER=1], [FOX_BYTEORDER=0]) AC_SUBST(FOX_BYTEORDER) # Threads AC_CHECK_LIB(rt,clock_gettime) AC_CHECK_LIB(pthread, pthread_exit) # Check for dynamic loader AC_CHECK_LIB(dl, dlopen) AC_CHECK_LIB(dld, shl_load) # Check vsscanf AC_CHECK_FUNCS(vsscanf vsnprintf strtoll strtoull) # Add copious amounts of debugging with gcc if test "${GXX}" = "yes" ; then CXXFLAGS="${CXXFLAGS} -Wall -Wformat -Woverloaded-virtual -Wshadow -DUNICODE" #LDFLAGS="-rdynamic ${LDFLAGS}" LDFLAGS="-no-undefined ${LDFLAGS}" fi # Debugging turned on AC_MSG_CHECKING(for debugging) AC_ARG_ENABLE(debug,[ --enable-debug compile for debugging]) AC_MSG_RESULT([$enable_debug]) if test "x$enable_debug" = "xyes" ; then CXXFLAGS="${CXXFLAGS} -g -DDEBUG" fi # Building for release AC_MSG_CHECKING(for release build) AC_ARG_ENABLE(release,[ --enable-release compile for release]) AC_MSG_RESULT([$enable_release]) if test "x$enable_release" = "xyes" ; then CXXFLAGS="${CXXFLAGS} -O2 -DNDEBUG" if test "${GXX}" = "yes" ; then CXXFLAGS="${CXXFLAGS} -Wuninitialized -ffast-math -fstrict-aliasing -finline-functions -fomit-frame-pointer -fexpensive-optimizations" LDFLAGS="-s ${LDFLAGS}" fi fi # Enable profiling AC_MSG_CHECKING(for profiling) AC_ARG_WITH(profiling,[ --with-profiling choices are yes, no, or gprof]) AC_MSG_RESULT([$with_profiling]) if test "x$with_profiling" = "xyes" ; then CXXFLAGS="${CXXFLAGS} -p" elif test "x$with_profiling" = "xgprof" ; then CXXFLAGS="${CXXFLAGS} -pg" fi # Check for JPEG Image support AC_ARG_ENABLE(jpeg,[ --disable-jpeg compile without JPEG image support]) AC_MSG_RESULT([$enable_jpeg]) if test "x$enable_jpeg" != "xno"; then AC_CHECK_HEADER(jpeglib.h,CXXFLAGS="${CXXFLAGS} -DHAVE_JPEG_H=1"; LIBS="${LIBS} ${LIBJPEG:=-ljpeg}") fi # Check for PNG Image support; note zlib is needed for PNG AC_ARG_ENABLE(png,[ --disable-png compile without PNG image support]) AC_MSG_RESULT([$enable_png]) if test "x$enable_png" != "xno"; then AC_CHECK_HEADERS(png.h,CXXFLAGS="${CXXFLAGS} -DHAVE_PNG_H=1"; LIBS="${LIBS} ${LIBPNG:=-lpng}") fi # Check for TIFF Image support; note zlib is needed for TIFF AC_ARG_ENABLE(tiff,[ --disable-tiff compile without TIFF image support]) AC_MSG_RESULT([$enable_tiff]) if test "x$enable_tiff" != "xno"; then AC_CHECK_HEADERS(tiff.h,CXXFLAGS="${CXXFLAGS} -DHAVE_TIFF_H=1"; LIBS="${LIBS} ${LIBTIFF:=-ltiff}") fi # Check for libz compression library AC_ARG_ENABLE(zlib,[ --disable-zlib compile without zlib support]) AC_MSG_RESULT([$enable_zlib]) if test "x$enable_zlib" != "xno"; then AC_CHECK_HEADERS(zlib.h,CXXFLAGS="${CXXFLAGS} -DHAVE_ZLIB_H=1"; LIBS="${LIBS} ${LIBZ:=-lz}") fi # Check for bzip2 compression library AC_ARG_ENABLE(bz2lib,[ --disable-bz2lib compile without bz2lib support]) AC_MSG_RESULT([$enable_bz2lib]) if test "x$enable_bz2lib" != "xno"; then AC_CHECK_HEADERS(bzlib.h,CXXFLAGS="${CXXFLAGS} -DHAVE_BZ2LIB_H=1"; LIBS="${LIBS} ${LIBBZ2:=-lbz2}") fi dnl Check for Xft2 support AC_MSG_CHECKING(for Xft support) AC_ARG_WITH(xft,[ --with-xft enable Xft support]) AC_MSG_RESULT([$with_xft]) if test "x$with_xft" != "xno"; then XFTCFLAGS="-I/usr/include/freetype2" XFTLIBS="-lfreetype -lfontconfig -lXft" saved_cppflags="${CXXFLAGS}" CXXFLAGS="${CXXFLAGS} -DHAVE_XFT_H=1 $XFTCFLAGS" X_BASE_LIBS="${X_BASE_LIBS} $XFTLIBS" fi dnl Check for XShm support AC_ARG_WITH(xshm,[ --with-xshm compile with XShm support]) AC_MSG_RESULT([$with_xshm]) if test "x$with_xshm" != "xno"; then AC_CHECK_HEADERS(X11/extensions/XShm.h,CXXFLAGS="${CXXFLAGS} -DHAVE_XSHM_H=1",, [#include ]) fi dnl Check for XShape support AC_ARG_WITH(shape,[ --with-shape enable XShape support]) AC_MSG_RESULT([$with_shape]) if test "x$with_shape" != "xno"; then AC_CHECK_HEADERS(X11/extensions/shape.h,CXXFLAGS="${CXXFLAGS} -DHAVE_XSHAPE_H=1",, [#include ]) fi # Check for Xcursor support AC_ARG_WITH(xcursor,[ --with-xcursor compile with Xcursor support]) AC_MSG_RESULT([$with_xcursor]) if test "x$with_xcursor" != "xno"; then AC_CHECK_HEADERS(X11/Xcursor/Xcursor.h,CXXFLAGS="${CXXFLAGS} -DHAVE_XCURSOR_H=1"; X_BASE_LIBS="${X_BASE_LIBS} -lXcursor",, [#include ]) fi # Check for XRender support AC_ARG_WITH(xrender,[ --with-xrender compile with XRender support]) AC_MSG_RESULT([$with_xrender]) if test "x$with_xrender" != "xno"; then AC_CHECK_HEADERS(X11/extensions/Xrender.h,CXXFLAGS="${CXXFLAGS} -DHAVE_XRENDER_H=1"; X_BASE_LIBS="${X_BASE_LIBS} -lXrender",, [#include ]) fi # Check for XRandR support AC_ARG_WITH(xrandr,[ --with-xrandr compile with XRandR support]) AC_MSG_RESULT([$with_xrandr]) if test "x$with_xrandr" != "xno"; then AC_CHECK_HEADERS(X11/extensions/Xrandr.h,CXXFLAGS="${CXXFLAGS} -DHAVE_XRANDR_H=1"; X_BASE_LIBS="${X_BASE_LIBS} -lXrandr",, [#include ]) fi # Check for XFixes support AC_ARG_WITH(xfixes,[ --with-xfixes compile with XFixes support]) AC_MSG_RESULT([$with_xfixes]) if test "x$with_xfixes" != "xno"; then AC_CHECK_HEADERS(X11/extensions/Xfixes.h,CXXFLAGS="${CXXFLAGS} -DHAVE_XFIXES_H=1"; X_BASE_LIBS="${X_BASE_LIBS} -lXfixes",, [#include ]) fi # Check for XInput support AC_ARG_WITH(xinput,[ --with-xinput compile with XInput support]) AC_MSG_RESULT([$with_xinput]) if test "x$with_xinput" != "xno"; then AC_CHECK_HEADERS(X11/extensions/XInput.h,CXXFLAGS="${CXXFLAGS} -DHAVE_XINPUT_H=1"; X_BASE_LIBS="${X_BASE_LIBS} -lXi",, [#include ]) fi # Check for Input Method support AC_ARG_WITH(xim,[ --with-xim compile with XIM support]) AC_MSG_RESULT([$with_xim]) ##if test "x$with_xim" = "xno"; then if test "x$with_xim" != "xyes"; then CXXFLAGS="${CXXFLAGS} -DNO_XIM" fi # Substitute variables in output files AC_SUBST(X_LIBS) AC_SUBST(X_BASE_LIBS) AC_SUBST(X_EXTRA_LIBS) AC_SUBST(X_PRE_LIBS) # Compile with 3D support AC_MSG_CHECKING(for OpenGL support) AC_ARG_WITH(opengl,[ --with-opengl choices are yes, no]) AC_MSG_RESULT([$with_opengl]) if test "x$with_opengl" != "xno" ; then AC_CHECK_HEADER(GL/glu.h,CXXFLAGS="${CXXFLAGS} -DHAVE_GLU_H=1"; LIBS="${LIBS} ${LIBGLU}") AC_CHECK_HEADER(GL/gl.h,CXXFLAGS="${CXXFLAGS} -DHAVE_GL_H=1"; LIBS="${LIBS} ${LIBGL}") GL_LIBS="${LIBGL} ${LIBGLU}" fi # Substitute variables in output files AC_SUBST(GL_LIBS) # Done. AC_OUTPUT(Makefile utils/Makefile include/Makefile include/fxver.h src/Makefile src/version.rc chart/Makefile doc/Makefile doc/art/Makefile doc/screenshots/Makefile tests/Makefile adie/Makefile shutterbug/Makefile pathfinder/Makefile calculator/Makefile windows/Makefile fox.spec fox-config fox.pc) fox1.6-1.6.57/depcomp000077500000000000000000000560171326741342000142230ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2016-01-11.22; # UTC # Copyright (C) 1999-2017 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fox1.6-1.6.57/doc/000077500000000000000000000000001326741342000134025ustar00rootroot00000000000000fox1.6-1.6.57/doc/Makefile.am000066400000000000000000000020201326741342000154300ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in htmldir = $(datadir)/doc/@PACKAGE@-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@/html SUBDIRS = art screenshots # Human-written HTML files HTML_FILES = \ adie.html \ app.html \ calc.html \ consulting.html \ clipboard.html \ datatarget.html \ doc.html \ download.html \ doxygen.cfg \ draganddrop.html \ faq.html \ filefuncs.html \ filter.pl \ focus.html \ fonts.html \ footer.html \ foreword.html \ fox.html \ goals.html \ gpgkey.html \ guiupdate.html \ header.html \ home.html \ icons.html \ install.html \ introduction.html \ layout.html \ license.html \ menu.css \ menu.html \ messages.html \ news.html \ news1.html \ news2.html \ news3.html \ page.css \ pathfinder.html \ projects.html \ references.html \ registry.html \ rex.html \ screenshots.html \ serialization.html \ styles.css \ timers.html \ top.html \ widgets.html \ win32.html \ window.html \ xml.html docs: doxygen doxygen.cfg # Complete documentation package html_DATA = $(HTML_FILES) EXTRA_DIST = $(html_DATA) fox1.6-1.6.57/doc/Makefile.in000066400000000000000000000523231326741342000154540ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(htmldir)" DATA = $(html_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = $(datadir)/doc/@PACKAGE@-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@/html includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = art screenshots # Human-written HTML files HTML_FILES = \ adie.html \ app.html \ calc.html \ consulting.html \ clipboard.html \ datatarget.html \ doc.html \ download.html \ doxygen.cfg \ draganddrop.html \ faq.html \ filefuncs.html \ filter.pl \ focus.html \ fonts.html \ footer.html \ foreword.html \ fox.html \ goals.html \ gpgkey.html \ guiupdate.html \ header.html \ home.html \ icons.html \ install.html \ introduction.html \ layout.html \ license.html \ menu.css \ menu.html \ messages.html \ news.html \ news1.html \ news2.html \ news3.html \ page.css \ pathfinder.html \ projects.html \ references.html \ registry.html \ rex.html \ screenshots.html \ serialization.html \ styles.css \ timers.html \ top.html \ widgets.html \ win32.html \ window.html \ xml.html # Complete documentation package html_DATA = $(HTML_FILES) EXTRA_DIST = $(html_DATA) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-htmlDATA: $(html_DATA) @$(NORMAL_INSTALL) @list='$(html_DATA)'; test -n "$(htmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ done uninstall-htmlDATA: @$(NORMAL_UNINSTALL) @list='$(html_DATA)'; test -n "$(htmldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(htmldir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(htmldir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-htmlDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-htmlDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-htmlDATA install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-htmlDATA .PRECIOUS: Makefile docs: doxygen doxygen.cfg # 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: fox1.6-1.6.57/doc/adie.html000066400000000000000000001175731326741342000152100ustar00rootroot00000000000000 Adie
Adie [Remove Frame]

Screenshots

    mainwindow

Where to get it?

    Adie can be downloaded from the download page either as a Linux or as Win32 Binary (both statically linked with FOX). The source code for Adie can be found in the FOX distribution. Adie is GPL Licensed.

Introduction

    Adie is an extremely fast and convenient programming text editor written using the FOX Toolkit.
    Besides being a nice text editor, Adie is also an extremely convenient file viewer, supporting a plethora of methods to move from one file to the next.
    For each visited file, Adie remembers where in that file you were last looking, and which special places in that file have been bookmarked, so you can quickly return to frequently visited places.
    Project browsing is made easy by optionally displaying a File/Directory browser side by side with the text so files may be visited by means of a single click. Files may also be opened simply by highlighting a file name, compiler warning message, or #include directive and hitting a single button; Adie will search for the file in the same directory as an already loaded file, or in a number of predefined directories (like for example include directories).

General Features

  • Preferences are configurable with convenient dialogs.
  • Text size only limited by available memory.
  • Persistent bookmarks may be set for each file.
  • Persistent scroll position is remembered for each visited file.
  • Wheel mouse scroll support.
  • Online help built in.
  • Now supports multiple toplevel edit windows.

File Access Features

  • File Dialog supporting bookmarked directories.
  • Dropping a file into Adie opens the file.
  • Single-click access to file using File/Directory browser.
  • Visit recently edited files.
  • Jump to file and line number of highlighted compiler warnings or errors.
  • Customizable list of file patterns; show only source files, for example.
  • Open a file by highlighting a #include directive.
  • Customizable list of directories to search for header files.
  • Detect if file changed outside of editor to prevent accidental overwriting.

Editing Features

  • Unlimited undo/redo capability.
  • Cut and paste to clipboard support.
  • X11 primary selection support using middle-mouse paste.
  • Drag-and-drop support for text move or copy.
  • Brace matching, statement block, and expression block selection.
  • Up to 10 persistent bookmarks may be set in each file.
  • Search and replace history is stored persistently.
  • Auto-indent feature.
  • Strip trailing spaces, strip carriage-returns for DOS files.
  • Automatically add newline after last line.
  • Indent or unindent selected text; clean indentation.
  • Search for highlighted text.
  • Goto line number, goto highlighted line number, goto matching brace, goto begin/end of block.
  • Fixed word wrap column, or continuous word wrap mode.
  • Mouse wheel or right-mouse scroll support.
  • Customizable word-delimiters to select words by double-clicks.
  • Insert files or extract highlighted text to file.

Syntax Coloring Features.

  • Syntax coloring is programmable, using PERL-like regular expressions.
  • Patterns now read in from external file; standard set of patterns is provided for common programming languages.
  • Automatically determine syntax based on either file extensions or file contents.
  • Text styles including foreground, background, selection colors, as well as underlining and strike-throughs.
  • Text styles can be interactively modified from preferences dialog.
  • Color fallback mechanism to minimize style setup hassles.

Starting a New Document.

    To start a new document, invoke the New menu, or press on the New button on the toolbar. If the current document has not yet been saved, you will be prompted to either save or abandon the current text.

Opening and Saving Files the Old Fashioned Way.

    To open a file, you can invoke the Open menu, or press on the Open button on the toolbar. This will bring up the standard File Dialog, which allows you to select a file. To save a file, you can either invoke the Save or the Save As menu option. The former saves the file back to the same filename, while the latter prompts for an alternative filename.

    You can quickly navigate to the desired file by typing the first few letters of the filename and then pressing Enter (Return); use Backspace to move up one directory level. Control-H moves to your home directory, Control-W moves back to the current working directory.

    A nice convenience of the File Dialog is the ability to set bookmarks, so once bookmarked, you can quickly move back to a previously visited directory.

Opening Files Using the File/Directory Browser.

    An alternative method to open files is the File/Directory Browser. You can display the File/Directory Browser by invoking the File Browser option under the View menu. To open a file using the File/Directory Browser, simply click on the file. If there are many files, you may want to limit the number of files displayed by specifying a file pattern in the Filter typein field. The pattern is can be any regular file wildcard expression such as "*.cpp". By default, the File/Directory Browser shows all files, i.e. the pattern is "*". You can switch patterns by means of the combo box under file File Browser; additional patterns for the combo box (and File Dialog) can be specified in the Preferences Dialog.

Opening Recently Visited Files.

    The recent file menu shows files which have been recently visited. You can quickly get back to a file you've been editing simply by selecting one of these recent files.

Opening Files by Drag and Drop.

    Using a file browser such as PathFinder or other Konqueror or other XDND compatible file browsers, you can simply drop a file into the text pane and have Adie read this file. Of course, the File/Directory browser supports drag and drop also, so you can also drag a file from the File/Directory browser into the Text Window.

Opening a Selected Filename.

    Selecting any filename, possibly in another application, and invoking the "Open Selected" option causes Adie to open the selected file. When the selected filename is of the form:

    #include "filname.h"

    or:

    #include

    then Adie will search for this file in a sequence of include directories, otherwise it will search in the same directory as the currently loaded file. You can specify the list of include directories to search with the "Include Path" option. When the selected filename is of the form:

    filename.cpp:177

    then Adie will not only load the filename, but also jump to the given line number. If this file has already been loaded, Adie will simply jump to the given line number in the current file. This option is very useful when fixing compiler errors.

Mouse Selection.

    You can move the cursor by simply clicking on the desired location with the left mouse button. To highlight some text, press the mouse and drag the mouse while holding the left button. To select text a word at a time, you can double-click and drag; to select text a line at a time, you can triple-click and drag. Performing a shift-click extends the selection from the last cursor location to the current one. When selecting words, words are considered to extend from the clicked position up to a blank or word-delimiting character. The latter may depend on the programming language, and so Adie offers a way to change the set of delimiter characters.

Scrolling Text.

    Using the right mouse button, you can grab the text and scroll it. a right mouse drag is a very convenient way to scroll the text buffer by small amount as the scrolling is exactly proportional to the mouse movement. You can of course also use the scroll bars. Because scrolling becomes awkward when dealing with large amounts of text, you can do a fine scroll or vernier-scroll by holding the shift or control keys while moving the scroll bars.

    Adie can also take advantage of a wheel mouse; simply point the mouse inside the text area and use the wheel to scroll it up and down. Holding the Control-key while operating the wheel makes the scrolling go faster, by smoothly scrolling one page at a time. To scroll horizontally, simply point the mouse at the horizontal scroll bar. In fact, any scrollable control (including the File/Directory Browser), can be scrolled by simply pointing the cursor over it and using the mouse wheel. You can adjust the number of lines scrolled for each wheel notch by means of the Preferences dialog.

The Clipboard.

    After selecting some text, you can cut or copy this text to the clipboard. A subsequent paste operation will then insert the contents of the clipboard at the current cursor location. If some text has been selected in another application, then you can paste this text by placing the cursor at the right spot in your text and invoking the paste command.

The Primary Selection

    When text is selected anywhere (possibly in another application), Adie can paste this text into the current text buffer by means of the middle mouse button or by pressing the wheel-button if you have a wheel mouse. Note that while holding the button, the insertion point can be moved by moving the mouse:- Adie will only insert the text when you release the button.

Text Drag and Drop.

    After selecting some text, you can drag this text to another location by pressing the middle mouse button; because Adie is fully drag and drop enabled, you can not only drag a selection from one place to another inside the text buffer, but also between different Adie applications, or even from Adie to another drag and drop enabled application or vice-versa. Within the same text window, the drag defaults to a text-movement. You can change this to a text copy by holding down the Control key while you're dragging. Between one text window and another, the drag defaults to a copy operation you can change this to a text movement by holding down the Shift key while dragging.

Undo and Redo.

    Adie support unlimited (well, the limit is large...) undo and redo capability. Each time you insert, remove, or replace some text, Adie remembers what you did. If you make a mistake, you can undo the last command, and the one before that, and so on. Having invoked undo many times, it is sometimes desirable to invoke the redo command, i.e. to perform the original editing operation again. Thus, you can move backward or forward in time. However if, after undoing several commands, you decide edit the buffer in a different way, then you will no longer be able to redo the undone commands:- you have now taken a different path. When you first load a file, or just after you save it, Adie remembers that this version of the text was special; while subsequent editing commands can be undone individually, you can always quickly return to this special version of the text by means of the revert command.

Search and Replace.

    Adie uses the standard Search Dialog for searching strings. The search dialog offersforward and backward searches (relative to the current cursor location), and three search modes:
    • Exact.
      In the Exact mode, a search looks for a verbatim occurrence of the search string in the text.

    • Ignore Case.
      In the Ignore Case mode, a search looks for a verbatim occurrence also, but while disregarding the uppercase/lowercase distinctions.

    • Expression.
      In the Expression mode, the the search performs a full regular expression match. The regular expression syntax being used is very similar to PERL and is as follows:

        ^ Match begin of line
        $ Match end of line
        . Match any character
        | Alternation
        ( ... ) Grouping sub pattern
        (?i ... ) Match sub pattern case insensitive
        (?I ... ) Match sub pattern case sensitive
        (?n ... ) Match sub pattern with newlines
        (?N ... ) Match sub pattern with no newlines
        (?: ... ) Non-capturing parentheses
        (?= ... ) Zero width positive lookahead
        (?! ... ) Zero width negative lookahead
        [] Character class


        * Match 0 or more [greedy]
        + Match 1 or more [greedy]
        ? Match 0 or 1 [greedy]
        {} Match 0 or more [greedy]
        {n} Match n times [greedy]
        {,m} Match no more than m times [greedy]
        {n,} Match n or more [greedy]
        {n,m} Match at least n but no more than m times [greedy]


        *? Match 0 or more [lazy]
        +? Match 1 or more [lazy]
        ?? Match 0 or 1 [lazy]
        {}? Match 0 or more times [lazy]
        {n}? Match n times [lazy]
        {,m}? Match no more than m times [lazy]
        {n,}? Match n or more [lazy]
        {n,m}? Match at least n but no more than m times [lazy]


        \a Alarm, bell
        \e Escape character
        \t Tab
        \f Form feed
        \n Newline
        \r Return
        \v Vertical tab
        \cx Control character
        \033 Octal
        \x1b Hex
        \w Word character [a-zA-Z_0-9]
        \W Non-word character
        \l Letter [a-zA-Z]
        \L Non-letter
        \s Space
        \S Non-space
        \d Digit [0-9]
        \D Non-digit
        \h Hex digit [0-9a-fA-F]
        \H Non-hex digit
        \b Word boundary
        \B Word interior
        \u Single uppercase character
        \U Single lowercase character
        \p Punctuation (not including '_')
        \P Non punctuation
        \< Begin of word
        \> End of word
        \A Match only beginning of string
        \Z Match only and end of string
        \1...\9 Back reference

Keyboard Bindings.

    The following table lists the keyboard bindings:

    KeyAction
    Up Move cursor up.
    Shift+Up Move cursor up and extend selection.
    Down Move cursor down.
    Shift+Down Move cursor down and extend selection.
    Left Move cursor left.
    Shift+Left Move cursor left and extend selection.
    Right Move cursor right.
    Shift+Right Move cursor right and extend selection.
    Home Move cursor to begin of line.
    Shift+Home Move cursor to begin of line and extend selection.
    Ctl+Home Move cursor to top of text.
    End Move cursor to end of line.
    Ctl+End Move cursor to bottom of text.
    Shift+End Move cursor to end of line and extend selection.
    Page Up Move cursor up one page.
    Shift+Page Up Move cursor up one page and extend selection.
    Page Down Move cursor down one page.
    Shift+Page Down Move cursor down one page and extend selection.
    Insert Toggle between insert mode and overstrike mode.
    Delete Delete character after cursor, or text selection.
    Back Space Delete character before cursor, or text selection.
    Ctl+A Select all text.
    Ctl+X Cut selected text to clipboard.
    Ctl+C Copy selected text to clipboard.
    Ctl+V Paste text from clipboard.

Changing Font.

    fonts


    You can change font by invoking the Font Selection Dialog from the Font menu. The Font Dialog displays four list boxes showing the font Family, Weight, Style, and Size of each font. You can narrow down the number of fonts displayed by selecting a specific character set, setwidth, pitch, and whether or not scalable fonts are to be listed only. The All Fonts checkbutton causes all fonts to be listed. Use this feature if you need to select old-style X11 bitmap fonts. The Preview window shows a sample of text in the selected font.

Changing Preferences.

    Since there is no accounting for tastes, Adie can be extensively configured by means of the Preferences dialog. The Preferences dialog is comprised of a number of subpanes which allow you to change colors, editor modes, file patterns, and word delimiters.

Changing Colors.

    colors


    The colors subpane allows you to change the colors used in the File/Directory browser, and the Text Window. You can simply drag colors from one color well to another, or you can double-click on a color well and bring up the Color Dialog. The Color Dialog offers a number of ways to create a new color, either by selecting one of the pre-defined color wells, by mixing a custom color in RGB, HSV, or CMYK color space, or by selecting a named color from a list.
    The active text line, i.e. the line containing the cursor, can be drawn using a special style when the Active background button is checked.
    If Line Numbers are displayed, the line numbers and line numbers background can also be modified.

Changing Editor Settings.

    edit


    The editor subpane is used to change various modes of the editor:

    ModesExplanation
    Word Wrapping.This enables word wrapping mode for the Text Window; when word wrapping is turned on, text flowed to stay within the wrap margins.
    Auto Indent.This causes spaces or tabs to be inserted to match the previous line; this option is meant for programmers.
    Fixed Wrap Margin.When this feature is enabled, the text is flowed to stay within a fixed wrap column; when disabled, the Text Window is in continuous wrapping mode, and the text is flowed to fit the size of the Text Window. This option has no effect if the Word Wrapping option is off.
    Strip Carriage Returns.When this option is selected, MS-Windows/MS-DOS text files with lines ending in CRLF are transformed into LF only files upon read; this is mostly of interest when loading DOS files on a UNIX system; when Adie runs under MS-Windows, files are normally automatically translated back and forth.
    Strip Trailing Spaces. When selected, Adie will remove all white-space after the last printable character when reading a file.
    Append newline at end of file.If there is no newline at the end of the last line, automatically add it when writing the file; some compilers like this.
    Insert Tab Characters. When this option is selected, hard tab characters are inserted when entering the tab key. If the option is not selected then entering the tab key will insert the corresponding number of spaces into the text buffer.
    Warn if changed externally.If the file is changed by another program, pop a dialog to reload the file.
    Word delimiters.Change the set of characters which determine word boundaries for double-click and word-selections.
    Wrap Margin.This specifies the column at which paragraphs are to be wrapped; the wrap margin only has effect if the fixed wrap margin option is selected.
    Tab Columns.This specifies the tab spacing, in terms of spaces.
    Brace Match Time.When entering a brace, parenthesis, or bracket, the cursor temporarily jumps to the matching brace and pauses there for a bit before hopping back to the insert position. If the brace match time is set to 0, then this feature is disabled.
    Mouse Wheel Lines. This is the number of lines scrolled when the mouse wheel is rotated by one notch. When holding the control key while using the wheel, the text scrolls by one page at a time; when holding the alt key, it scrolls one pixel at a time.
    Line number columns. This is the number of columns shown for line numbers; if set to zero, no line numbers are displayed. .
    Save View of File.When this option is selected, the current view or scroll position is saved so that a subsequent visit to this file can immediately jump back to the same view. Disabling this option will cause all remembered views to be forgotten.
    Save Bookmarks. When selected, all currently set bookmarks will be saved for this file; a subsequent visit to this file will restore the bookmarks. Disabling this option will cause all remembered bookmarks to be forgotten.

Changing File Patterns.

    This subpane allows you to enter a list of file patterns, one pattern on each line. These patterns are used in the File/Directory browser and the File Dialog. They are especially useful in the File/Directory browser as it allows you to cause the File/Directory browser to only show those file types you want to see (e.g. only source files). Each line of a pattern has the format:

    patternname (patternlist)

    Where patternname is the name of the pattern (e.g. "C Source") and the patternlist is a comma separated list of patterns (for example "*.h,*.c"). The patternname is optional. Some examples from my own setup of Adie (you can paste these from this help window if you want) are shown below:

      All Files (*)
      All Source (*.cpp,*.cxx,*.cc,*.C,*.c,*.hpp,*.hxx,*.hh,*.H,*.h,*.y,*.l)
      C++ Source Files (*.cpp,*.cxx,*.cc,*.c,*.C)
      C++ Header Files (*.h,*.hpp,*.hxx,*.hh,*.H)
      C Source Files (*.c)
      C Header Files (*.h)
      Python Files (*.py)
      Perl Files (*.pl)
      Ruby Files (*.rb)
      Lex (*.l)
      Yacc (*.y)
      Object (*.o)
      X Pixmap (*.xpm)
      X Bitmap (*.xbm)
      

    Some details on the allowable wild-card patterns:

    PatternExplanation
    ? Matches single character.
    * Matches zero or more characters.
    [abc] Matches a single character, which must be a, b, or c.
    [^abc] Matches a single character, which must be anything other than a, b, or c.
    [!abc] Ditto.
    [a-zA-Z] Matches single character, which must be one of a-z or A-Z.
    [^a-zA-Z] Matches single character, which must be anything other than a-z or A-Z.
    [!a-zA-Z] Ditto.
    pat1|pat2 Matches either pat1 or pat2.
    pat1,pat2 Ditto.
    (pat1|pat2) Matches either pat1 or pat2; patterns may be nested.
    (pat1,pat2) Ditto.

Building The Syntax File.

    The syntax file is a file which contains the regular expressions used for coloring the contents of the text buffer during editing. When Adie is installed, the syntax file must be installed in some directory in the $PATH environment variable; usually, that is the same directory where the executable is installed, e.g. /usr/local/bin.

    The syntax file contains a number of Language-blocks; each language block contains a number of syntax rules. Each rule may also contain a subrule. The order of the rules inside a Language-block is important; during matching, the first rule is tried first, then the second, and so on. With subrules, its the same way.

    The formal syntax for the syntax file (sic!) is as follows:

    SYNTAXFILE      :       { LANGUAGEBLOCK }
                    ;
    
    LANGUAGEBLOCK   :       language STRING
                                    { DECLARATION }
                                    { RULE }
                            end
                    ;
    
    
    DECLARATION     :       filesmatch STRING
                    |       contentsmatch STRING
                    |       delimiters STRING
                    |       contextlines NUMBER
                    |       contextchars NUMBER
                    ;
    
    
    RULE            :       rule STRING
                                    { PATTERN }
                                    { RULE }
                            end
                    ;
    
    
    PATTERN         :       pattern STRING
                    |       openpattern  STRING
                    |       closepattern  STRING
                    |       stoppattern  STRING
                    ;
    
    
    STRING          :       "text"
                    ;
    
    NUMBER          :       digits
                    ;
    

    In a string, a quote (") can be embedded by prefixing with an backslash (\). Each statement must be on a single line. A hash (#) sign is used to introduce a comment, which extends to the end of the line.

    To determine which language block to use for coloring, Adie first examines the wildcards in the filesmatch string. If the filename loaded into the editor matches the list of wildcards, the language block will be used for syntax coloring.
    Some files don't have any file extensions. In that case, you can instead determine which language block to use by matching the first fragment of the file (typically 512 characters) to the contentsmatch regular expression.

    Note that the order of the language blocks is important; earlier language blocks will be tried first.

    The delimiters expression holds the list of characters used as delimiters when editing files of this syntax.

    When the editor matches patterns for syntax incremental syntax coloring, it needs a certain amount of context around the change being made to the text. Typically, the contextchars should be set to the length of the largest pattern to be matched. The contextlines should be set to the number of lines of context. If these statements are omitted, Adie assumes the context to be one line of text. This is good in most cases.

    Syntax rules are named patterns. The name of the rule is used to look up the corresponding colors in the FOX registry (so make sure the names are legal registry key names!). Thus, the colors can be easily configurable.

    Rules may be either simple rules or complex rules. Simple rules match a single regular expression pattern and have no subrules. Complex rules have a openpattern and a closepattern, and possibly a stoppattern. Complex rules may have any number of subrules.
    The matching process is recursive, depth-first. That means, when matching complex rules, first the open pattern is matched, then all of the subrules, followed by the close pattern and stop pattern [if specified]. This allows for easy to create subpatterns e.g. backslash-escape codes [see example].

    The patterns are specified using the perl-like regular expressions also used for search and replace, see above.

    As an example, here is a somewhat simplified version of the C++ language patterns:

    language "C++"
    
      # File patterns for this language mode
      filesmatch "*.C,*.cpp,*.cc,*.cxx,*.c++,*.H,*.hpp,*.hh,*.h++,*.h"
    
      # Word delimiters
      delimiters "~.,/\`'!@#$%^&*()-=+{}|[]\":;<>?"
    
      # C++ style comment
      rule "CPPComment"
        openpattern   "//"          # Start of C++ comment
        closepattern  "$"           # Goes to end of line
      end
    
      # C style comment
      rule "CComment"
        openpattern   "/\*"         # Note the '\' does not have to be escaped unless followed by "
        closepattern  "\*/"         # CComment pattern is potentially expensive as it can go till end of buffer!
      end
    
      # String
      rule "String"
        openpattern   "\""          # Opening quotes
        closepattern  "\""          # Closing quotes
        stoppattern   "$"           # Don't scan past end of line!
    
        rule "OctalEscape"          # Octal character can have more than 1 character;
          pattern     "\\d+"        # that's why this rule MUST come before "ControlEscape"!
        end
    
        rule "ControlEscape"        # Allow an escape; subrules are matched first
          pattern     "\\."         # so a escaped closing quote is not seen by the "String" rule
        end
      end
    
    
      # Char constant
      rule "Char"
        openpattern  "'"
        closepattern "'"
        rule "OctalEscape"
          pattern "\\d+"
        end
        rule "ControlEscape"
          pattern "\\."
        end
      end
    
      # Preprocessor
      rule "Preprocessor"
        openpattern  "^\s*#"
        closepattern "$"
        rule "PreprocessorContinuation"
          pattern "\\n"
        end
      end
    
      rule "Keyword"
        pattern     "\<(friend|typename|explicit|typeid|for|while|if|and_so_on)\>"
      end
    
      rule "Number"
        pattern     "\<((0[xX][0-9a-fA-F]+)|((\d+\.?\d*)|(\.\d+))([eE](\+|-)?\d+)?)\>"
      end
    
      rule "Type"
        pattern     "\<(unsigned|signed|int|char|short|long|float|double)\>"
      end
    
      rule "Operator"
        pattern     "(\+\+|\+=|\+|--|-=|->\*|->|-|==|=|&&)"
      end
    
    end
    

Other Configuration Issues.

    Because Adie is an editor written to use the FOX Toolkit, there are various other items, common to all FOX Toolkit programs, which may be configured either by hand or using some other control panel. A few items of particular interest are list below:

      [SETTINGS]
      typingspeed=800
      clickspeed=400
      scrollspeed=80
      scrolldelay=600
      blinkspeed=500
      animspeed=10
      menupause=400
      tippause=800
      tiptime=3000
      dragdelta=6
      wheellines=1
      bordercolor=black
      basecolor=AntiqueWhite3
      hilitecolor=AntiqueWhite
      shadowcolor=AntiqueWhite4
      backcolor=AntiqueWhite1
      forecolor=black
      selforecolor=AntiqueWhite
      selbackcolor=#aea395
      tipforecolor=yellow
      tipbackcolor=black
      normalfont="[lucidatypewriter] 90 700 1 1 0 1"
      iconpath = /usr/share/icons:/home/jeroen/icons
      

    These settings can be either placed in $HOME/.foxrc (and thus affect all FOX programs), or in $HOME/.foxrc/FoxTest/Adie (only applying to Adie). File types may be bound to a command, mime-type, and icons using statements like the one below:

      [FILETYPES]
      cpp = "/usr/local/bin/textedit %s &;C++ Source File;c_src.xpm;mini/c_src.xpm"
      /home/jeroen = ";Home Directory;home.xpm;mini/home.xpm;application/x-folder"
      defaultfilebinding = "/usr/local/bin/textedit %s &;Document;document.xpm;mini/document.xpm"
      defaultexecbinding = ";Application;exec.xpm;mini/exec.xpm;application/x-executable-file"
      defaultdirbinding = ";Folder;folder.xpm;mini/folder.xpm;application/x-folder"
      
    This example shows how the extension ".cpp" is bound to the program "textedit" and is associated with two icons, a big icon "c_src.xpm" and a small icon "mini/c_src.xpm", which are to be found in the directories determined by 'iconpath", in this case, "/usr/share/icons" or "/home/jeroen/icons". It also binds two icons "home.xpm" and "mini/home.xpm" to the home directory "/home/jeroen". Finally, it assigns icons, commands, and mime-types to unbound documents, executables, and directories, overriding the built-in icons of the FOX Toolkit.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/app.html000066400000000000000000000621111326741342000150510ustar00rootroot00000000000000 Documentation: The Application Class
Documentation: The Application Class [Remove Frame]

The FXApp Class

    The application object manages the message queue, timers, chores, signal handling, GUI updating, and other system facilities. Each FOX application will have exactly one application instance. Every FOX application will start by constructing one FXApp object prior to building the GUI.  Usually, the FXApp object is the last object to be deleted as well.

    Using the code below, the application object will be constructed on the stack and hence is automatically destroyed when the program terminates.  Also, when the application object is destroyed, all the windows and other resources it knows about are destroyed as well.

    int main(int argc,char *argv[]){

    // Make application
    FXApp application("ApplicationName","VendorName");


    // Open display
    application.init(argc,argv);


    // Make window
    MainWindow* mainwindow=new MainWindow(&application);


    // Create it
    application.create();


    // Show Window
    mainwindow->show();


    // Run
    return application.run();
    }

    In the first line of code above, an application object is constructed.  The constructor has two parameters, the application name, and the vendor name.  The application name and vendor name are used to determine the application's registry settings.

    The next line of code initializes the application object, passing in the command line arguments of the process.  The application object parses its own arguments and removes them, but leaves the remaining arguments alone, to be interpreted by your own code.

    The next line creates a toplevel window, passing in a pointer to the application object.

    The call to the application object's create() function realizes the entire widget tree, i.e. creates the necessary resources in the system (X Server or Windows GDI), to turn what was up till that point a collection of C++ data structures into a real-life application which is able to receive events and draw on the screen.

    The final call to run() starts the toplevel event loop. A typical application will not return from this loop until the user closes the application.

Event Loops

    Most GUI applications have something called an event loop or message loop.  Unlike batch-oriented programs which read a datafile, perform some processing, and then produce an output file, a GUI driven application spends almost all its time in an event loop, waiting for user input, determining where that input came from, and then dispatching it to the proper function to perform some processing. Unlike batch oriented programs, these functions are typically very short, and mostly take only very little time to execute, and so the user is in complete control of the application most of the time. The events a GUI program processes can be of different types:

    • Keyboard input;
    • Mouse movements;
    • Mouse buttons;
    • Inputs from other sources (e.g. network sockets, timers, signals, and so on);
    • Changes in selection and clipboard ownership;
    • Drag and drop events;
    • Window repaint events;
    • And other things which can happen to a window.

    The application object is solely responsible for coordinating all these events and dispatching them to the proper destination where they are handled.

    FXApp performs delayed repaints on windows; it delays issuing the repainting of windows until all other events have been performed.  The theory behind this is that most events are not as time-consuming as redrawing, and also that many events cause more things to be redrawn so if we were to draw as soon as possible it might be invain.  Also FXApp combines repaint rectangles so as to minimize the video card hardware setup and tear down time relative to the number of pixels drawn.

Event Queues

    Certain devices, such as a moving mouse, can generate events faster than some programs can process them.  To prevent losing events, events are commonly queued up, so programs can catch up as fast as they can. Likewise, the drawing commands a GUI program generates as its trying to draw buttons and other controls on the screen are also queued up, so that the X server (or GDI on Windows) can take its time to catch up.

    Finally, the X Server has its own event queue and drawing queue, making for a total of four queues.  All these queues allow for much faster performance of applications, as bigger chunks of data can be transmitted between the application and the X server, and fewer context switches of video card and cpu hardware are needed.

    From the point of programming in FOX, the existence of these queues is for the most part hidden, but in a few cases some special functions are available that you may need to call:

      FXApp::flush(sync)

      This function flushes the output queue, i.e. the commands which have been already performed are pushed to the X Server, where they are executed. If we want to make sure that the display shows the correct picture, however, just pushing the commands to the X Server is not enough! Sometimes we need to make sure that these commands have been executed before we continue!
      Thus, when passing TRUE to flush(), the X Server is forced to execute the commands queued up in the drawing queue prior to returning control to the caller.

    Sometimes, we want to check if there are any events, but continue to do some processing if no events are available.  Under normal circumstances, returning to the event loop will cause our process to block until there are events; but if there is stuff we may want to do, this is of course not desirable.  We have just the right solution for this problem:

      FXApp::peekEvent()

      This function will return TRUE if there are any events ready to process, and FALSE if there are none.  The peekEvent() function can be used when we are doing a long calculation and we want to check if the user has hit the STOP button.

Types of Event Loops

    There are several types of event loops supported, each of them is appropriate for certain situations.  Most commonly, application developers will however only call:

      FXApp::run()

      This is the top level event loop, and it will only terminate when the application is ready to call it quits. When run() finally returns, its return value is the exit value passed to stop() earlier.

      FXApp::stop(code)

      This function terminates the top level event loop, but also terminates all nested event loops which have been directly or indirectly invoked from this top level loop.  Each nested loop is terminated with a code of zero (0), but the top level event loop is terminated with the given code.

      FXApp::runOneEvent()

      As the name implies, this function reads and then processes one single event, and then returns.  It is primarily interesting to use in combination with peekEvent(), as peekEvent() returns TRUE if there is at least one event ready to be processed.
      If there is no event ready, runOneEvent() will block until there is at least one event.

      FXApp::runWhileEvents()

      This function processes events while events are available.  This function is useful if you are running a long calculation, and want to temporarily dip into the event stream to process some event, for example to redraw damaged windows and so on.

      FXApp::runUntil(condition)

      This function processes events until the variable condition, which is passed as a reference, becomes non-zero.


    Modal dialogs are dialog panels which block interaction with the rest of the application until they are completed.  For example, while trying to open a file, the application is unable to interact in other way with the user until some file is selected and loaded in. In FOX, the only difference between normal dialogs and modal dialogs is how they are run:- modal dialogs are run by calling:

      FXApp::runModalFor(window)

      This function runs a nested or recursive invocation of the event loop, i.e. it re-enters an event loop and processes events for a while, and returns only when stopModal() or stop() is called. As long as runModalFor() is running, user-input events to all other windows, except for given window and the windows owned by it, are being blocked. No user-interaction with other windows is possible until runModalFor() returns, but other windows are allowed to process other events like redrawing and resizing.
      When it returns, it returns the value passed to the stopModal() function, or 0 if stop() is called to terminate the application.

      However, it is quite possible, and in fact common, that one modal dialog invokes another.  In that case, only the most recently invoked dialog can be interacted with.

      FXApp::runModalWhileShown(window)

      The function runModalWhileShown() runs until either stopModal() or stop() is called or the specified window becomes hidden. This is of interest when running popup menus or other temporary windows. If the window parameter is NULL, all input is blocked; otherwise the input to all windows except the given window (and all windows owned by the window) are blocked.

      FXApp::stopModal(window,code)

      Calling stopModal() causes the modal event loop with the matching window to terminate with code.  However, stopModal() also causes all modal event loops which are nested more deeply to terminate with code zero (0).

      FXApp::stopModal(code)

      Calling stopModal() causes the innermost modal event loop with the matching window to terminate with code.  This is the most common method to terminate model loops.

      FXApp::isModal(window)

      This function returns TRUE if a modal loop is in effect for the given window.

    Modal dialogs are always run with runModalFor(). Because it is so common to construct a dialog on the stack, run it modally, and then process the inputs thus obtained, there is a convenience member function FXDialogBox::execute() which calls create(), show(), and then runModalFor() in turn. The FXDialogBox also understands several messages, for example ID_ACCEPT, ID_CANCEL, and SEL_CLOSE which call stopModal() returning a code 1, 0, and 0 respectively.
    The return code of zero from FXDialogBox::execute() indicates that the dialog window was closed or cancelled.  An application should typically not perform any action when a dialog is closed.

Global Application Mutex

When programming with multiple threads of control, one single thread (the Main Thread) is responsible for the User Interface, while other threads are Worker Threads churning in the background.  Occasionally, the Worker Threads need to interact with the Main Thread.
This is accomplished by means of the global application mutex.

When the display is opened, the Main Thread acquires the global application Mutex. It continues to hold this Mutex while it is processing events, until the Main Thread is about to enter a blocking state. 

Just before entering the blocking state, the Main Thread releases the global application Mutex.  Worker Threads are then free to acquire the
global Mutex and then play around with data structures safely.  As soon as an event comes in, the Main Thread wakes up and immediately reacquires the global application Mutex.
Thus, basically every message or callback in the system is performed while the global Mutex is held by the Main Thread.  This ensures that no Worker Thread is simultaneously modifying some data structure when the Main Thread is also.

The Main Thread continues to hold the global Mutex until display is closed.

The global Mutex may be obtained by reference with the function:
    FXApp::mutex()

    This function returns a reference to the global Mutex.

Having the Mutex returned as a reference allows it to be passed directly into the FXMutexLock convenience class, which performs Mutex locking and unlocking by means of constructor and destructor.


GUI Updating

    The event loop ordinarily enters a blocking system call when no events are available.  However, if any windows have been marked as damaged, the system will peform repaint events that have been queued up to this point.
    When no more events call for attention, and all windows have been redrawn properly, there is still just a bit more to do before entering the blocking state, and that is the GUI-Update.

    The GUI-Update phase is entered just prior to blocking the user-interface.  Since there is nothing else the application would be doing (after all, it is about to block for new events!), FOX takes advantage of this quiet time to iterate through all widgets in the widget tree and issue a SEL_UPDATE message to that widget's target.
    The receiver of the SEL_UPDATE message typically inspects the state of the application, and decides whether the sending widget should be update to properly reflect that state.

    For example, a Save Button may be grayed out when the user has not yet made any modification to a document. You can also change the values of certain controls such as Sliders, Text Fields, Check Buttons, Color Wells, and so on.
    The result of this procedure is that a short time after processing a burst of events, the User Interface of your application automatically updates to reflect the state of the application.

    The application determines whether a GUI-Update pass is warranted based on the return value of messages it sends.  If messages are sent but aren't handled by a widget or by your application code, it doesn't need to perform an update pass.  On the other hand, if there is reason to believe a message has been handled, the application automatically calls refresh() to schedule a future GUI-Update pass.

    The GUI-Update pass is performed in a cyclical fashion, that is to say, each widget gets updated roughly equally often.

    In a few cases, it is nice to be able to forcibly schedule a GUI-Update pass; for example, just before entering a modal dialog; because the callback handler invoking the dialog does not return until the dialog is done, an explict call to refresh() may be needed to ensure that the controls in the dialog are properly updated when the dialog is displayed. In this case you can call refresh() explicitly from the application code.

      FXApp::refresh()

      This function reschedules another GUI update to be performed in the future.

    At other times, it may be necessary to ensure that the GUI-Update pass is performed immediately; this ensures that all the controls in the application have been updated to their current state.  Since this involves having a SEL_UPDATE sent from each widget, it is of course rather expensive.  Fortunately, it is not often necessary to do this:

      FXApp::forceRefresh()

      Calling this function will cause an immediate GUI update pass to be performed.  Unlike the normal GUI update, which takes place unobstrusively one and a time, prior to blocking, forceRefresh() will not return until all windows have been refreshed. It is therefore quite expensive, and should be used only when strictly necessary.

    The GUI update has no impact on the perceived speed of an application because between each pair of GUI updates performed, a check for events is performed.

Visuals

    An FXVisual is a description of the pixel organization on the display. For example, some high-quality graphics cards can do 24 bits per pixel; other graphics cards may be limited to 16, 15 bits per pixel, or even just 8 bits/pixel.  FOX programs can even work on 4 bit/pixel (VGA mode) and 1 bit/pixel (monochrome), although it wouldn't be as much fun!

    Besides depth (number of bits/pixel), there are also other characteristics which come into play describing the pixel organization, such as colormaps, and wether or not a colormap can be written or not, and the byte and bit organization.

    Colormaps are commonly used on 8-bit/pixel systems.  Most hardware only supports one hardware colormap, and this must be shared among all programs on the display.  Because legacy toolkits such as Motif do not deal with full colormaps very gracefully, FOX applications deliberately do not try to grab all 256 colors from the colormap, but only 125 colors.  Images and Icons are dithered to get the best possible rendering given the number of colors available.

    You can improve the look of your program quite easily, however, as the maximum number of colors which the default visual tries to allocate can be easily changed using a command line argyment; for example,  "myapp  -maxcolors 256" will start myapp in such a way as to attempt to acquire all 256 colors from the colormap.

    Because other programs may already be running, the desired gamut of colors may not be available.  If the exact color can not be obtained, FOX will try to find the closest color available and use that.

    Normally, the FXVisual a window uses is copied from its parent.  You can change this visual for each window, or you can call:

      FXApp::setDefaultVisual(visual)

      This function will change the default visual to be used for all toplevel windows; the child-windows will simply inherit the visual from their parent.

    Alternatively, the maximum number of colors can also be set via the registry, using the maxcolors key under [SETTINGS] any number less than or equal to 256 colors may be specified, FXVisual will determine the best gamut to pick from the allowable number of colors.

Wait Cursors

    Sometimes, an application needs to undertake a long task, such as e.g. loading a big file.  In such cases, it is good form to present the user with some feedback to indicate that the application may be temporarily unresponsive.  Common ways to do this are progress bars and changing the cursor shape to a stopwatch, or hourglass, or something like that.FXApp supports this by means of the following functions:

      FXApp::beginWaitCursor()

      This will change the cursor shape for all windows to the stopwatch cursor, or the cursor designated by setWaitCursor().  Calls to beginWaitCursor() and endWaitCursor() can be nested in a stack-like fashion, with only the first call to beginWaitCursor() and last call to endWaitCursor() actually changing the cursor shape.

      FXApp::endWaitCursor()

      A matching call to endWaitCursor() will restore the original cursor for each window.

      FXApp::setWaitCursor(cursor)

      This will change the cursor shape used in during a beginWaitCursor() endWaitCursor() pair.

      FXApp::getWaitCursor()

      This returns the current FXCursor being used as hourglass or stopwatch cursor.

    The beginWaitCursor() and endWaitCursor() calls can be nested pairwise, so that a functions which bracket a long calculation by means of a beginWaitCursor/endWaitCursor pair can call upon each other.

Drag Types

    Exchanging data via the Primary Selection, the Clipboard, or by means of Drag and Drop requires that all applications agree with the type of data being exchanged.
    This is done by registering a Drag Type. In most cases, the name being registered should be a mime-type, such as "text/plain" or "image/gif".

    Manipulating drag types is done with the following API's:

      FXApp::registerDragType(name)

      This will register a new drag type based on the mime type name.

      FXApp::getDragTypeName(dragtype)

      Obtain the name of a previously registered drag type.

The drag types must be mime types as defined in the XDND standard.



Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/art/000077500000000000000000000000001326741342000141705ustar00rootroot00000000000000fox1.6-1.6.57/doc/art/Makefile.am000066400000000000000000000014131326741342000162230ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in artdir = $(datadir)/doc/@PACKAGE@-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@/html/art ART_FILES = \ bigpenguin.png \ fifthplanet.jpg \ fox.gif \ foxlogo.png \ foxlogo.jpg \ foxlogo_small.jpg \ foxstart.png \ freespeach.gif \ ill.gif \ ilr.gif \ innernerd.gif \ iul.gif \ iur.gif \ layout.gif \ line.gif \ mouse.gif \ nerd_inside.gif \ oll.gif \ olr.gif \ opengl_logo.png \ oul.gif \ oul_grey.gif \ our.gif \ progress.png \ scribble.png \ sgitextedit.png \ slingerzbutton1.gif \ widget.jpg \ win32-libraries.png \ win32-linkoutput.png \ win32-postbuild.png \ win32-preprocessor.png \ win32-project.png \ win32-tooloptions.png \ wintextedit.png art_DATA = $(ART_FILES) EXTRA_DIST = $(art_DATA) fox1.6-1.6.57/doc/art/Makefile.in000066400000000000000000000353261326741342000162460ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/art ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(artdir)" DATA = $(art_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ artdir = $(datadir)/doc/@PACKAGE@-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@/html/art ART_FILES = \ bigpenguin.png \ fifthplanet.jpg \ fox.gif \ foxlogo.png \ foxlogo.jpg \ foxlogo_small.jpg \ foxstart.png \ freespeach.gif \ ill.gif \ ilr.gif \ innernerd.gif \ iul.gif \ iur.gif \ layout.gif \ line.gif \ mouse.gif \ nerd_inside.gif \ oll.gif \ olr.gif \ opengl_logo.png \ oul.gif \ oul_grey.gif \ our.gif \ progress.png \ scribble.png \ sgitextedit.png \ slingerzbutton1.gif \ widget.jpg \ win32-libraries.png \ win32-linkoutput.png \ win32-postbuild.png \ win32-preprocessor.png \ win32-project.png \ win32-tooloptions.png \ wintextedit.png art_DATA = $(ART_FILES) EXTRA_DIST = $(art_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/art/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/art/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-artDATA: $(art_DATA) @$(NORMAL_INSTALL) @list='$(art_DATA)'; test -n "$(artdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(artdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(artdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(artdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(artdir)" || exit $$?; \ done uninstall-artDATA: @$(NORMAL_UNINSTALL) @list='$(art_DATA)'; test -n "$(artdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(artdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(artdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-artDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-artDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-artDATA install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-artDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fox1.6-1.6.57/doc/art/bigpenguin.png000066400000000000000000000013471326741342000170320ustar00rootroot00000000000000‰PNG  IHDR09‚#µ|0PLTE˛ŔÜZRA G;&qng·µ°ÔŇÎů÷÷™ŤwŁwîşľ˘‹^ł‹'îÇҶř;&tEXtSoftwaregif2png 2.0.1=^ľhPIDATxśu”?hQÇŻw¤Kĺ2“Éďbqph.ţYëŕ …F+ą“5öŢV‚HˇĹR(8ś¦D:Hó«ąĚ‚›.))q¤¨“očÖ”ň|ďĺÝĺr—>î˝ď'żżďwQ”pMĚ(cÓÇ“Mč—łz.,r:śâ ŕěi R‡D.i˛ p[‡«E+ ŚRĘ+ `ÄAľpł•1Ŕś…'đ8 Ěąw»_Ś1ćşçűTH”®×đ'Aú­Ădő=ĎoŇC#Ń,ýÍńçú±–U31`=¬ÓźĹXń´Ŕ^uż—‰2a8óóEBćâ÷®N®“JĽńp‡8L'K0Z‰D®Ř éٰ葼R)sŐ±íW#ĂĄÁEÍ®+:*\“žś§#ˇĂ †ŃĽ ŚM)>ÓC°f°ç†ŕE$ş: !šF·€Ś‚`ę ^BX»F @˘ĎŁ ?Ţ•ÚÎEŔ"Ó%ÂíaşËżY`ëRžýc®Ţ ý EÜĽ‚O—}ˇoő}ü&<Ů0a™ľNű¸ ŇÄ™¤n»ŹU€/S¶Ë™jQŠ˝EYóŮł4ř"wˇ(đ7űÂî(üĺˇ÷V^ÓMqd&ô? } .đözŔv ,črsĦBĄicĆ.˝fsĐżkUJľŽäßO—»j˛:V·¨`GúěłdOÄř¤îşî=©™P` Îłý·`¬îµÝÚ×+Ă ×­UĂIĽŐéäĺ6Ýéú?ŃS\jÁ‰ťIEND®B`‚fox1.6-1.6.57/doc/art/fifthplanet.jpg000066400000000000000000000045301326741342000172000ustar00rootroot00000000000000˙Ř˙ŕJFIF˙ŰC    $.' ",#(7),01444'9=82<.342˙ŰC  2!!22222222222222222222222222222222222222222222222222˙Ŕ„X"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ôĹ“q# ö©Vnśň e‰łČ8ˇîUćn}¨k튜J׊G­s“^ Ů_ş;Ô_k|dgÓ A¦›áÚąĄ»bp[𞓱éÉ  äĽ|őŔ­kŇ x®j)Žâ´-óžI ˇ\éKş¨Á0ňÂçĄzĐťÔTŤçăx5^FëÁ5<`‘‘Ҥ(¤ŕ‘šÎÜÁô©#śă$źLU‡hOĄ3í.¬ N”ő´P9Ęăą4ió~" .\eÉĄ2ó»đ  ‰8RôÇz–9ťÉǩŠ“ÇÜŐ´‹%‹zâ€5ěY˛ą9Ĺhů€ŠÉµ#p ´wg8—ř˘«;äEqŕ2őíÚ‚Ř~rMEÁËsޤ/é×=hžY$…LóÔô§lŘĘ`:ÓX0c‡ă=)7ě ĎĐę!ˇ˙T‘0~ăZ¦złu=©­"Füd“Ú€6>bÍ <Ő„x”|ż1÷¬$y×čkFÖaóŠŮµĂż>•x€WĄgŰ“ŕ6Oz”ÎAĆAő  L8Í]g^~j(€Gî*uđ`Ý]L· ‘ĘQ äíMÜŇI}sR”’!Ü Q×>”Ń Ů çÓ4ÓnXzV%¤÷“«|á¶Ś€ Ť"ę:ŚZI»’ďy. Śp7`Đú[s’Hü*&<Ż'Żzç.µé¤’ł3Ƒڳ€éż#žj¬:ľ «1Žŕ΂ܹv‡o–ŢžôÜĆŚô«Ń˛Żëű@Á¤ý¦CĘĹĽýq\ý·u/ě«˙6t7h‚XX(áOjô1Ă7ž+†Oj-Ľná'X䍣– ˙Zf•©jwŤýJ`ΙÁµAÇ­w‚qŹJ+ŤŇn5)5…şÔ<Řŕ“fß( Üzö˘€9e×í›÷ŚŹ˝QËâ;Ä»ă#žŐçŇuiţş>iŁOą“ź0Żű«ŹÖ€=1Ľk§Fź|žÜU_řLôć€ÚĹŇ…`ŘQČç?…qVžšyI'űÄâ»]3Ă n‹%ăŤy Ś~”ŁŞúšKsýź0CŹ;‡#ŻO®˙kÁ-±´ť|…tç8ČúăbĚ 2UBFj/µḏłµťŘ|·#ŚzŇ!1=ÔŇDŔ Śücň§Kio#‘,YM„!ĆGĺ\ÄÖZ†žŰ¬ç‘"=‰Üź…DuÍ^Ü~öäŢă@t¶ńÉv. âMžYĂuÇĄ6Ý%µ)¶âVDč…řţUÉŹČ?ÖZ7ü©ńxą IćC \ü#¦?Ć€;n<‰f!Ý+n<÷˘ąŹřJ¬Él™0 “ĆzQ@­<7»’­Ź_»[h–vŕ0Hěţt“jD{ű ¬nsČÂĐöąŽ¶Ö% ęy4Ĺqs&ůäÝíŽEŢȢ´˘tEĆ?Jąn67…ęk?Q´1’@Í_´šÔĚżiŚsó85’ˇ'€čČSíŢ€5¦Đ…ÇÍĂ>zůZ˛.´_%ĘK‘°ęÎ?L‹TšĂó[VÚ˙™Ćĺ]Eq?:ĺäŇ$¤ŞO٦ŠëŮ4ËÁ†Âިr?#Ef®“zŁ”źv©ăÓ/şůđq^Ň4ŕF?P(ţČ…łşŇ"ÝäQé÷Éöi?jCÚ䵼ŁţkŐ×Cµŕý•Tű rčđţ­€ &/p‹Â˛źö”â1Ú70Ďq^·&‘ &ß,céTeđŤŔîŚgýÚňɤ #>•ť0 ěW©\xÂPv†CíX·ż“çŘóI˘R{}ES*ń±"»[ďj°!€¬‡đΤ˝b_¦á@‘_şh«·ÔW‘lOŃţ´P"řĂăţóŰżűŃŠ˝ÇDG™ei'üÁ ¦ôárş?*ôČ>>ëiŹ;AÇű,EiAűAŕ˙¤řrQţäźă^F.÷ś'_î öČ?h đ'ŇoâőŔ«ÇN@’[¨߇˙Ż_?‰ăţçëFřOT ¦-~(x&ó„Ö R{H ˙JׇÄŢ»ĘŐě›ŰÎňiŽŮşĆüS ˝©ű©·éĹ}‚’XNwEsýף—I´™pcB1_"Ć#Ż.b˙rCZ–úîąkmâ;ä#ł1"€>–—Âö¤“Ďć(Żźmţ"xÖÓ5´śŇĄÉ[ĐSĽÓÇŠ(ë#c§vžźŤhŞĎ’p30dÔ¬l‘ZęѰ‘¤Ţh¤íž·d+Ó0Üţ¤ŘŘ„»RnůT†q7o‡ôńď¬Yë{­uKZbC!źŃsÎ"ýţDÖ›¶éćFÜé—<Şwź^fň2€čwxéńč׸ąA 2)s{ř§ťĺ6wd©C¸ă,4Ě7?©6‰Ă5ĎŔ&í|Ń^ďĘz¤Ć]Î.»fz‹”›”Şí&cůµfŰ©Űů‰ÍőŢ’f;ŹÁâçLéÍŃäËČÍ `éńŔ± sú€˙Ä)342!@"1P#$˙Úáî«=Őg¸ąś3gW^f& 3Ý_!‚ÍŹ)aÇLüéź„–„`Us"iXĺ9%1FÄă+µ\ ’k5ń4Łú‘9”8`l 韝3ó¦~Oë7°#&gEábŐŽ™ ´ŮÖ:!MmF‹Wméڮö•‡ŐDWNÇČ­r+Ş˝¸°v-ĹrłvŞ ˛ÍáI/eĚ­W®#śĄAQEłü×¶62őxQk{ű>÷ ~˘Xä$*ŞŐ™°ZĎ­˙2vcÍL÷U;!‰°ß}߬Ţ ˙’݉¶«ł.vµÁS6ȵ…Í‘Ô'ň9­ŻÎscäf·żłďb…N~©Ę%ꪏ“Ů$b‹ĐŰĂΦ·żłďp§á×®(Í”ł†łëĚĘ~}˙]˝…¸ďŠ­N+Ę?őĐžtók9«ŹřŮLŹÉNşÇ Ź‘šŢţĎ˝Šţuyzg(ʦŞN>Sd<ŃŠ[o—*šŢţϽŸ†űó1 UČd Yőżće? ľ˙®ŢĹ_/†ÂĽµumÍyťšbl´úé„"힡Ôę@WjĘ»ë:ťŹ‘šŢţĎ˝”,ÄEŠBâ^·‘Z°(PĚŚ©ˇi'­žuŞ |˝bZŢýš‘`ľ22ŐX¬4ü2űФ¶çĎ­˙3)ře÷ýrŹP…¬řşŠ[?ÓYHĂ`˝Xú«±Şşů±ň0k“3dđ O\ŰźÜŕ”ŚĹëڞćđç©~u/Ăk÷đ›/ś±pDFYpŹř»#ý˙Ä%!12@ "ABCQ˙Ú?÷ÁµŤQę1Okfą•Ź#| L×ň®‘ťş5ŰŘ×ňŁÔ‘7ááěCď2‘ŕűf#''çÓ{1˙ŘeŕŹÄiz¬’´TÖÄ!F™.ݲPwhJdaNÇvŤ/U“Ť‰mááě^O˙Ä#!12@"AQ B˙Ú?ýĎyb-řZ†¨(ýKq^Î8-ĆKqRÔ8ĄĂęnbÚ@zž‰ŢމźÉ IkĂęnŔťJU*žŁ’Z Ş#xĆJâ„]Ăęnä˙˙Ä5r!123AQaq"’@BR‘±đCP‚ˇ #˛á˙Ú?»{gë{gë‚Ń čÂďö:Żyľ_îTŽ—olýBď3Ş÷jO++v5‹–U,هA7/é›—ôʵ›Ô]UCI»úCu©›ż©•d4şĄ»O:•î/ŞŮ±Ŕ””PIé*lśÓČ…» FRYąLÜż¦n_Ó(ĘAëěöąí.ł6WŐ,Ý€ <ĺFŰlĂO1âLŰSŇ}ÖڧştZĐîöˇn,tŹąf„é¬*Š Ŕ ^SB4ĎĹG0(ÄŇ–‰AĚLK·Ŕó”•;^ńžK:Žł nSěůež[ě˙8ÂŞ*K§kŢ2v?ąkň‡°›¦ŠôĄah…éMĎk‘ľŃ«E<'ęzöLZ9‰‡áQńm7Yż=—áhWŢáŐÎxíün\·>Yg–äËX[ťĂˇ¤ĂÉ«üFĺnF?M1ňË<·ŮţqŚuą:âŻé›­~PöYţqŤÜűE®FűDJÓ¤ß7Ň3-Q ćłé˘ë%îcžm űÇBÂ~łÁoărĺąňË<·&JJr¸u5…ą±[á7*ó2Ó¬|˛Ď-öś`{*tőťŁ ¶±-~PöYţqŤÜűE®FűK,ׇ]ĄšŞ‡„ĐŽO]şÝ˘§-fTlŤ !ń—×)Äj071rÜůež[Ľ'9f58ZVŃĹ9,»Z€€ńźôłČâťf2q7Úxi˛şăĺŠŘđĐr›ăéŠqâ©ĺ,˙8Ćîg„ÚŽ©ă.±®Züˇě.łüăąö‚§QĆ*ŽżáZa<ÄÓjÓČż8PÖ‡” FŃĚÜ1×G# ZyąnŞ6*ě[˝ôő›`v¤ÔÝU$´>bQźGKŞŚTÍóMóAŤËSś ¶„~őˇŔĺk13TÜmöeËűŹ˙Ä)!1AQaˇ±đ‘Áń@q PŃá˙Ú?!›âZ­TđĎ™áź0!3!O=cí ÂĎĐîCMUĚTZ ˛ŽĂ|đ§K]eţť]“¤÷f—‚ěźbźbśó˛‡ łnp%Á·čb0"hđ8¤Đ^ĐA©·ś"1ˇq¶Ëř‡oÉ)DR`Śĺ…Ç«–XxŐ9W!SěSěSěSYĺBżÁn‡ ˝đaßjó.˛­§89|×e-"żb(1)ĆÖbqXo˛‡ő{ĹÁuM‰Ş^/vtžě¶Ťv”}!H˙xĄŢômH;Yiµf >{˘Í©u*qBâ Hć‚—đĆËnş¸ó…ódÁcO‰ł<ždęřôŻtŔë(Á˙–Ü‚:Ďź[U7ąÔ4˛úLČ"˛‚źÇđ[¦mŇŮËöŁŮ· ć8hľ?0[şx¦%^źqÜű č _8Ţö˛Üp0~'»ĂÉćNˇß€*iÖĆ- ÝĽţ·źykLĺ-—‚— ÂłĘôžO2uüzWşj‰<…ĺ/dfV®Ü:ĎźtŻtđŰţG‚Ý-”1úzX‘Mć=«â Ťŕ|đ÷~Ąz>ÄA<÷ô‹5*Vçţ8tžď'™:‡~ ©¨č¨´f*¸;Ýo‡ÄEŚö¨¤s}x)yĐ äó'PďÇĄ{¦ůcŮ+c{ *©©ťgĎŤşWşxm˙#Ánţ ŢiąŽ©ląËnÓ ŠóLOů.Ű«nöÄ °ý±5Ńo´ÁO!Ůť'»ĂÉćNˇß†â{ELöeBĂs‡‹ô€W wÎ4l­‰ěą¦/‘sŇ ĄĄ­Ůäó"±Z5\ó?ě<aůť+Ý<6ó»6`ć‡ëĽë>|mŇ˝ÓĂoů™ý3×eßř+ąsÁ¸f‰µ')ŐbĆt6¨|EYŠpIdh7¸Y:Ow‚$!JA Ž+CMŤÁŞWrfĽ(őj0Jş [äÁ˛ Ry¤óIB;hx&j­®0Q±¤€"æ“XV˛ô˛íá–‡‚j«k‹ý/Iî˙c˙Ú S„S…%ű-1‹Č˝ŇŔ·¦AAARO" ­Ňrpý•¨üAAASĎAđőÔ•U4ëđAAAsĎ<óĎ÷ß|÷ß}÷ß}ôAAA˙Ä!!1@ APaqđ˙Ú?řŘ'|É0ÝBd0ϸJ=UËR‡’{§=Şu…Śä//Ľ8ÜŚźB& ůŁůúĽ_›ÇíWÉ‹ľe»é˘šhë2¨Ô+b¦/˙Ä1!@A ˙Ú?ýC>—`Ą],xµ:,…¸( ënlaäÚMͧÍÍ“ ӂް/9Úx÷‚V\ą}ŚŔ@A¨Ĺ§PŇAé‘+bµ|{ú˙Ä)!1AQaq𑡱Á @ŃńPá˙Ú?«BPŞŘëzóBXY;=2„—cP^;Tł·Ô Ŕ«„ Jä UlT¨(@Xş'˘320Cjt„`č©é­°#'ŇNkÍ>«Í>©Z át¬[Q–Ś"Nś0#č+IˇGŽŽÚ Z&Poú(ŇŃ,bRN‡¤´ÁK®*Ć1=q^Č ¬…8% B&#A’î1=Š#€ć(6\n.a1† oz‡óOŞóOŞóOޱ»¨Ö‘Qú°˘´>bqí_ăż”$äŕ˘ŢŚ%2BHâĚâ@ߊšȡ:ą´ŔÜw¨Jń>ßúŃú¨”źÄqŠ7[š#IÔţUÔnóĚŕć čŘpŔ6ô˘;•1é­ě řj`©($†\”Ë2P Α¦KâĚäĐ ‚+g.ˇďÚ”  l­"_pOŠS°©ĐqźVµ"ĄĽĘ×˝×ât~`ÍĽŚŤĆśŇů#‰ÉR¸!ŢĽv•đűő;ćµô?^µü=[)K˝ŘÜoݦXŮ(+GňžFÖ9˘ŻˇOޞ4XmAšT7´»Í Ű=É`|ÔKą‡šÔ'×'ď]~÷_‰ŃŇ) ʵńő\ĺŁEž“ľčďNR‚vJďNŕÍl….pG=Ó>´¸©ătăŰFžÓ¶ÂŇAźj@1A âqw«'P¶É;W˝ÖŚČޤa_â*Ň&F ™—Aľk]NÜŇźGżĎ5 bÂg“łăŠńÚWĂďÔgš×Đýix€F'…Łżá<~ ›ą75L$´;Ü´ÄIŢŻÖ¤™ÄâŹó‰$ă¤Z áÉŚh" †3ŽşíK”ĘHĹ÷ _vHXx:Ŕő˝!ds!ů¬xĺzÁf‹ů‚űE%“âq}( ·,S)#Ü+ý_âżŐţ(¤YČŁ  UËUĄPĄÍYh‘"0Ť*…HOJ˛x&17i"°(ć 0硒„Ź«¦«J¨Łš˛ô?ďë?W˙Ůfox1.6-1.6.57/doc/art/foxlogo.png000066400000000000000000000254131326741342000163600ustar00rootroot00000000000000‰PNG  IHDRô2%rľŔgAMA±Ź üa8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2)Ý.I IDATxśí}{tĺy÷ďygfWK€‘ÖŽ/P;`liřF‚í‚eHh‚i$;iÚ$±{b÷k“´}ĐÓÚÓ¦ň9ŕP ß×[Ę…pň…¤mđš‹Mbă`IŰ`+`ve'– ŇîÎĽĎ÷Ç;3;;7­d]l˛żłÇ^ÍÎĽ·™ů˝ĎűÜ^zţůçqᙉ¨’3‰™˝_‚?ťcŤ&%‡Ä´<ýě0Ő  !*/6‚! @ $ŔĚ`Ši ¸ô‡Ýx µ`AĚl_;ʶŻŞüîŚ/Ľ74äćRŮT·/ľ}FtYŽą÷ZgôügŞ™@DÜ’řŢŤ©ďU\XSUń¨ŢöɱňŇJoQ Ěŕ‘bc~ŠyçĎ2Pˇ—ąB/ń/?_ –,ŔA ÔH <^mŽožŞÝű©đ ácŰs)Ę…Ű$_AAaĢbŨz‰Ç­#U|ŕˇOtJâPçg‚ďFŚ„[ůKO¦ŢĆ Z˘QŇĘfĂeg‡Ę=ś#m•„b¦Ŕů`f $ JôV' &Iś#Ä‚A‚% ÁBBĚ,IžőŰ®RKb&é‡\«ŘśŘrŹKşDi!*k I›ęĽ°ERIj‹=i@ě.TíŽ<.áą_ÁgŚXĘĐ6»ë¶ŔđFÜ—řŢUeö?”‘»â¬q6á𲫠QC©Ş–ç$0$ś»ÎéĺúbÉ "˛ů™ ¬±0I2A )ÁĹ%×_¶ÜZNť9sĽď·,I’$$C„ĄT@çÄR0–€$XjR!Č+çΞ~饥Á!íŔÁC M’` ’$¸śîă!Ŕ¤şÉLöb€$ÉB M•v.=±k©±ÉB+= ’ $$t†đÝÔPŐ–k\ 0ز{§Nc€…HaHîÍ`ŤMBy˝,H"&C‚$A0Tó‚ŹÖx!L2$´ *żŠqAąßwß}ă^A:ťnkkSßăőÝęK.—Ëd2ÝÝÝ™L&ôL©TŞąąąµµµµµ5XcPę~ßşuk6›ŤjęćÍ›Ł~őŠü]]]ÝÝÝQgŢ˙Ŕ?°ĚmXőÇ+Ň$–ˇü~.`KÔ<óÂŢ7Ž÷ÉpÉĚN—%KVZSçüĺ—$–´,ś7gćâć9Ţ÷’<¬rjožxűŕˇ×_ę>\¤Z“ Ť!zôżŁ×Ĺ,yóKÓ×,nąúŹćĚš^²üç‘ŔžßľŮ÷ÎCŻž2‘%$9Ö†řZX&xčŻ>÷çI9D( @é„IÉg^Řűzß)Ŕ`"­-ÁÓsÁ܆[V-×d‘`şÇ%ô‚¨ý?Oü €Z&€ ®0ě#Äš,̨×ÖŢţ1Á¦€´ŕL`,D’űzŽ8ôŞâwI0ŘĽę ˝$™µD5ßůŢň¨‚46׬ZvőÜť ľŃµ›nĚŞýöŽź¨Jîç5t”‹ÉQ‡Kîń ‚žžžÎÎN_B/ÉfłŮlVťŮŢŢŢŢŢî%eďâĂGô­­­7nŚj@*•Ú´iSL UQą\®ŁŁ#j•łyóf»jȆKj–-śžŔ8K8 `&pđ•š7Ę4ďd&ŔLÁĹĎť±fĺ ‹›ěĆhęgçMwŢzfÖˇ±iÖҦYŮ~óÎŹíÜ˝ďôŔIĆŘd^WČ˝Ľ>ąfĺM‹ÓóRuĐÝDôî†ćŮËšgßńńeG~[xň§Ďí;)‘´HŚ(* H ĹĄ ëjP§Ł¤ÂWcőëCµGNH‹śęXiN°ĽĽľféÂËTGÜQ4<đ](¦ÖĘ/<Ş$ÖdˇáăożÔ®„Ę[kű{OżňĘ+ ¤§z 0aŕ?ajÄ’IŔš?wƲE—%ĆÖ˝‘@ŔpŘŠłŠó :Âă«™Qđé»}ŐutttvvގX5¬[·î3źůŚ·.ß…t:ÝÚÚ5‡uvvúć 8 ď©vşZ{ďÉ©TŞ­­Í$[N,5‡L'–ÍžžeŠd"ňʆI~ím«×¬X  ç_ŔĂŻTú_8zbřÄŤó–ĄçevüĹî—ň˘0”¸N•ilł'd~yËÝy[kCťÍé"Vz$ŔpĐ4;±ŕK·í|ń7Ďě~%77I(ÍCÄ• –IN-QcU¦=HY wVŞ~I{’T҆űÚ¬q!ÉgżúĄŤ3ę —7UQfn?|ú’u)”^ާ^—Üťö€ÜSe'ꏧNŐ(řÜő[UL,ěç*Ę­bĹěą\níÚµŠ1Ő91%„Ďfł˙ţď˙~˙ý÷ŹŘfţ›żů›Ü Ć;=xëUË‹¨Ë·lŮâůKşD6¦O‰§˘>" @ą(`%d~Ć%‰Ż˙Ă—>¶bAHs¨Č\¦Ĺmé@Q‡?˙Äő_XGRśóo”B9)‡î]ÇÚZgÔ!č#6ž@řŘŤ ż˛±-U—Đ9/`ťj|vw¬”ażÂ^DVÁQU€D¸JPA€5 şwý§gx1ä ‹dń­‡;O äYK(’Ż^€ýőşz?Ąq:÷§+ţÁ«âü‡}›&Çż*XK&“ٸqc.—sO÷u‰)<“Éüő_˙µ[Tbt/ťťť===pÖ.Á—sëÖ­QsL{{{sssĺ .;3DŽľ—(ě.§K‚±ÎĹŹ¦ŻüÚŰfzdĂ’ÄĘţËÝs™H(5Ŕ–75|uĂúőšĆ&CÄöL€ …Ë댯nX˙ѦélÍC-ř‡Ôi„â‘đˇiřÚ†öŇótλţEĚě%ŠäśŔüWľÜ™0Hv-Ąv… +aťýÂú;–5Í,ÉěN-ŕä ܶ=;X0ÉP¦l–¶‹”k$(Í•xô†A(†”(]óŚUqÁa˛ç`ďkśËĺîż˙ţl6e˙-ş»»+‘ßŰŰŰÓétÔŻ[·nu[â{O”Ą7ôĺIĄRíííŢĆK a9*Ô¨OÔ뤎‡^b:_$Ŕpl†N«Ř…†:ăž¶›fÔĂ*¸ Lv9ϧHň›}żëŔ5s.ş{Ýç5AĄ±•o0“rčžĎŢqÍś‹l“§“Şk&ĂtôÔnÔ€x›«DEť‘ŞÇÝm«Rőş†˘ žŚĺćXŔĺS˛cű!– křŢĎ}zYSĘox Ŕ»řć¶íŮAłr_”ŕű"I0‘¬ŕÁSŻĐö0âCkŤzPŞL6ą»Ďz.— µm_ŃV1ŚěÂËď1Jžá˝»»[ ď>‘ËűA|ůË_ö*ë%3CXÂ0bôÇtͤĂăŢ“MĎUęO‹ .95.|¨^˙ęĆu®’ÝW2E  {{űŮ{zoďéßô y×mĆľ ¶^°`ÎE÷¬ż3)‡\W &Ŕ)•—Žb1ťó_\˙ÉEłkJüD%~·y‡÷ ďëí˙ĺáţ˝˝YŐ€b€ßŐĺP ü݆Ď5Ö'56 ¬ÜQ*đz <äLďčí§xĺÉłĽĺĂ7,JľźÉžäÝţ˙r¦…‡Ů‰I Bç$&(ďŘbŘ“ă=bŮ5 ň 62prčs+IŚ:vąŠÉEEALA…CĺHĄRˇÇ;::âU(ííí­­­Áz{zz:::BůW!“Éd2™ÖÖÖ ;Ľ«iinnnooŹŇžoÝşőˇ‡ň]ŐŮŮ™ÍfCÍétzÍš5đĚLB :rüäwľżGȢ€Łőř­…€ipţóënę1Čě~ůŤ9IÉĐk™Č"ýČ['ĄsI€LSGqím·¦ę`”3¤wÂČěé}ąűőc'ޱ`8Ž“¦kţśÝń§k®šS§ie$,kš~(}ő/»ßbáwžQ#ŁÁŇą¸<}őҦ™‰°©E5ŕ艳ĎîyéĄC‡%i:«%[Óë/^˝jyëŠzŔ\©ń3ępçź®yě{O©Ö‚qľHë±PŢ÷:ňË[>|wŰMzyżÔ€G»^xíDż)j,ŇHzŽL< e‰`h™ç÷vż’ÔPTĎŚPF]ŘĎŹ` ćůsgÜş˛%¸:`ŕ;ť˙eRÂ÷Ľyż›˘ęä~ ’Ü˝,–N§WŻ^=޵îÜą3ÔeEUšN§·lŮ’JĄBc…š››~řá]»vuttD9­wtt¤Óé Óş—ëŰŰŰ3™Lh Jx÷Î+ą\Îë$ňń)·Łę<Ňű ŮCG=w4j¬÷ׯókN éëß×óV5JĘt˘.]K1 ˇ34%_“´ K[®^Ňl«Çl %„ ĽÖ÷ţă;žĘ ‚iš$áś“ÔŔ‡;đÚ·»–¦Żľë75Ö»Ó=ď ÜyŰMośč:9h č’˝bˇ±™Ş×ďĽm•`v,ŕťA<őô ű»_-€fś*"yň,u>˝ç{^ţ«őw,š]ă[y(~żaQáôU/ö—d(•‚ĎŃđü€«ßť ËÓľ§mUĐ/ÖňŔă]Ďíë>fQŤ$aG"{ç­ĘÖĚ,‰@úëÇłGÉŠ˛+¤Ć&‹D«·1Ž;¬ěí>–§‹ă*Y”¨†ąžçTËř‚3qÚđ xĄß`ćÖÖÖ‡z¨±±1>~uőęŐ۶m Ť9R:ź+żüĺ/{ŻňţęŐÝ»b{h{bBźEJ(Y šĐʉ¤)ŚP,Ň‹¨)–_RµEQ[ š%‹”´Hs\î ±40ôi›XĄ·S aű{OţŰĂß=yĆ,RmjŠ”´H—°`X0 H”ĚÓĹ{»Ź=¸í?ß„Y>) 1ę±zĺ2ŻaÓ… XkV,MŐ٤\r:L ;€{ř‰_őĆEEQ[¤dQč )t‹Ś"%‹H´‹Nżµí»ű{OĘuV̬Dźľífť Łä"Ľ‰Srł…€Ą“™ŞÓďm[•(–Ď:ćń®çö:b"i‘Ć~ÓzdÍʨ’B/F?uEŞ- Q$˝ÜEI:Đ0y­SB˛ęyţc:÷1/}Ż\(](™}ÄÚU ۶m‹:łłł3TíămĚš5k\ńÜ×»l6űýď_}Ź™*Ľń·ńmJŢ D.w;Ęm'm±­Ť…t(¬[W.sUxK+Ż÷ >şý'ĂbšĄ7“`G·‘`%! IeŮ+–˛ 8epëŤóSu SőQض9& őµ®O=ěő ŕȧßŘöDvĐ4‘9KF&•(@őB’” F˘€šG¶˙ôŐľaźABéŻęŃşęťóX…°I…Çô!•ľ€Ą!ßXŻeĂç’1YµSEŕ‡˙ýňľCG TËž[‰=éwĆ ˙ô6 V:…Tqˇ îvŽ—ä{d»şş˘Îô1ű^4ŤŤŤ›7oŽ*ÍedŻ Ĺ×x Şü;v¨/QUlÚ´i"¤Ĺ`‰®?L”‹ YĽyĹż±Î±Ź=ö˝'óT[$Ă+s‡E‚L5ąÂŹľß'Ľ«¶é@몥Ëk˛&–ĚŐ+—űü@lőG˙őkĹěÎjCx]0˝_$4‹EŞ}|ÇSfɵĂĎVŻlŃą@ăâ·>.([ĺ°ť &U§˙݆ő3ęËdv)™}o˙?÷RA$M Ď`z}Ű' ˘ă÷vWqŢb2ćj_+¶űŻĐčĐ okk ő˘!˘L&ăĆ‘FŐŘŘŘŢŢŽ°‰D ď===Q­ĘÎ<ÁĚÂp,d§`sdYĺňˇC‚ ćü+g]^î!ó‹ŹfM4±xܧUľ0Ĺą’ aüb÷×úŢ·`—¨z*Xś^¨±dHKˇŽK]ć—´Ěó=R’!ţA<óÂ~I.ĹmJ{şbřHMJEz˙Ŕűj‚ń ®h†ůsgxŞO©¦Ŕu<C€ÁE‡ľ˛aýĚ:żž]Éěűzł˙±ý©‚vCŹwëJ†Ľ;>ť)ěçÁúŻŠ* bęęęC6ŕ`čSL!•DźĆ ťN‡ć öôŮ©Ľ?mŢĽ9¦y>Ł–7Ŕő|x' ĽäÚ&WHtm Ę_ţč[}jóć …8\É$ –¤c'Ţ^Ň« 6I(E< Ȩ\ľż˛Č hr´ĆÄBűýŔ Ę˘SnsKŤ-“ÄD&¸­j=±¬ĺężh˙¸ć™gÔ\+ß ·>ôűßÓ-Ş­|{©*Ş*’tĆlJő=»Q˘ń9ęd+řďÜąÓw$Ş;QŽ7^´´´´µµ…ľ“Sř˘äµ-Í®ÚĹ:tđpż5•ău^Ę,űć[}gsáę¸ţÚ4X †Ććâ–ć˛ţ;¶] |ĄgěűŰ1I7űÎČ’ę_va×§›5–ζŃ!>!ďâ¤LËŻ¬ţjݧŚň¬>d'aĆeőĆe—Ö»G|WĚ4ĺ+Ź*>H·‡)”Ú\Oĉ¶7V"JÇ{ÝŢŐP¨"‚M¦Ň¬Ş2}Űß˝d!Učč¨Jó”đ»A„ĺOą^ö,ٶć!€!*vÔ 3 ś9ú“P“Ńů˘©9yŇŔç?ű™†ú!ónVúřDzŠ*ĆŚq#÷^BLP F1oH%/ŹÚŞ)ę×ĆĆĆxEÓľźZp{$;ňGsŻÇŤ¸,*’´í–ç{za“€ş„ˤÔQĘs?N­n˝´„ {ęB%mSJ›Ć:ÜłîŽ$ilN™ś•G(Ś—d2ýI˘ô®X5Ǩă1!Krą\ĚfS )CxAíČŕf;‰ ÓŤŤVęŹjŕ¨ę-¦ü¦»ęBŞWĎ©Y{[«&‡}»JUŁŠŞ_L,ąOÉ+ú’¨ŐΚ î‘÷úIŚ3µir0äčţQŁ%Wîňż˝*ţp}„ qJcëK@?Pň»?ÄÔ‘Ă}ÍRzů[W\µěÚ«|Éצ|~Şâ† Ěç^ąwă{ăť;ÜŐC¨f\éęęŠ"nŻZéţűď÷f{?Oşi.©ź¦¤U±?‰Źef¨ vSÓĄT!÷¸´ľ.?hI„đÜX#!|çU ,±ÚůµpT±cýgđüžÝwܶRóŘWÉŮŰúî¶›Ţ<~âÝ3¦šj„j‰Íçî{“[[[C•QQ •#čă­î[`—îOť:ĺé»°§§§««+;…žm ńëC‡—6͢ŔF4§F”g'Á$Q)GML±€·4;ÜZ–i’Żô˛&AúÁWzř3 BŔĽ+çd»Ź NČŃÇ21X¦›f W§oʱ`ŕׇz\k-Ńd„¨ öm@$[ÝÜľńČö3żĽč’Ć[V,0Ęď‹$ŻlüÜ˙ţçG$t1fW˘*ŞĆxćsŹQwŚ1 ďŞmýýýń§EYtÝ®Ýwß}ńUx˙ Í',ÄTŠé>¶fÇ·î’úźĄn:wĆôK.ÝĺÍ$iD ˛Hµ —Ő_¬Ť-o-±Ćrz}ťa­•¤[dÓćyˇł&*ďâÁmOdĚaqѶëőľ÷­ň¶` Óp÷gďJđ ę¦¤UŚ?Ć3źű'Ä8˘ŚYxWóGÔĺŢc< ŐÎוWšÍf;::â3ůMB·˙dСzü B¤ůůWÎ!°ÇĽ¤Â ×—Ć-¶” ŚAóćÎŇAeĄKŕ`ďi şĹÄĚjëνo[&`ţ•sĘT ĺA?˙ĘY¶ÇĽíchď)ÁçčA?&H˙ř wT•6&7€·už<+M2,Jäé˘Çvü$¶ó‰|dŃôŹŻX,,[ů>†•MUDaBňąÇxe·TŤJ(6*D]ŢŇŇß$ő§—©˝˝N§ÓQą*3™LŚ.h’!IX0NúŹ;éyŻŃŘôćó u­qes{5¶tX×6Ďr´9e¶Óc'~k‘ÎäŽ8ýű÷ňą–,ĽÜE1ú$0jëŃĹé…eqü¬öÄ‘ăNÎu|Š™QeňůÖ¶ď䆋””Đ$ČÔ’ąÂ“?{¶62I`í'–,›2P°DU9SĹřa)+GŚHŢ•Ş:“ÉŚ¸qRbv˙hjjň•,pëÖ­ą\.”ý·lŮ“8*đ¸ÂµH~ťŻ˝á˝I‰ÝÇ,Řňˇ’ӕ侤iÖôK."®ăť;’BRͨ]ŤKMVŻ\^¶K5ŮÚŽŰ‚˝5±`ĐÁCżqő ®áZ ŕ–UËĨ3H óňiÉĄ‹ŕ5(=ÖwŇkĹ­\ń®~Ľk§ ˛!ö·3Än-\§S 8}ć}Fi·<–°`üŞűč˙Ľx¬Ţ Đ{×Ý>ŁN°Ju9my”<É6)Đ—Đu^ ěÍ:˘rŻĂłqRđ§řÂŁöŔKĄRÍÍÍ~ߏň?{zz˘.W›‡¸»yKČfł“Âď#C’°Čřu÷«€-_»»^¨ÉˇuĹň„ ŮőÔ;>šÓX&hxÍĘ­±]šššš››vµuëÖ(ö?7#Ł!Lîqb%^yý@ÓUËšgÚŞjŹť@3ëđO_[źŮÓűr÷ëÇNĽ#IWJe)¸¸řÚE­7.űđÜ:µů…—8 °€<đäĎźë?“g‘,Ű"ÎąŤéąAóÉź˝đĄ¶UÁąAj m7˝ńŃĹĎ˝¸˙Ąžß¬14‚-!ĺü9şľĺš[V,Ô €Ű {÷ďë~õ˘$¶«U%{˛µxFÉî^÷ńżŚ—µP[YŻÜ÷h^Ô2v‹ @ Ë›ë˙‘™-Ňóâ˘onëü§żowÓ82‡Đ€™uřÂú?۶ýż,Ö•>Ç©¬TŻđý]ą}_”§ uč*.8Lą±yóćžžž·łłSů±¤ÓiĹÔńç»P3GčOńvT…-[¶D%*ŘĽyóĆŤ}ÇŐ™»víĘd2«WŻž˛ Ě’ĐL2~řtfîëgÔÁkŠTŠaŰW›ZW4YŔ›}ĂgθbnĂô:č€oŁ »p@E`ďéý‡^7EmTÜ„V„Ř×ýúŇô‚eM)ĹŃî‚IÉďpÍuW]Ńúh=}oťč0˝ľîĘŮIĂI­En§Ü„-*řóÉźî,R-C YŔ­:úq·· ^[h(ÉČ«+†™”Č äď|öŢö›UZ‚’I 0€ĄMłn]µäżw4‘iÁ§ŃÝ‹˝wŠ«^ňU”aĘfďĆĆƇ~X)˛ă ±»»[ Ú1Y˝Üď«WŻöJС/üÖ­[ŁŠjnnnnnŽ˘‰ćććöööP—y%Ľź:u*¦#cű“Ŕ”9@x´®Â–̤Hž´ÜÖ™€ÉA•műj¨Í©ąˇ©á†¦†Yu¨‰`v”=űčö§ňt1HR°Ž$(A&%Ůţ“_îW "ß@)€Ôš†Ź.jř袆…ł“µ€QböŇę_89·mĎ Ľ±Kţq<Ň#Čץ«BŢo”ťUĆ^č”ďŹę#ßXí¶™děí>ş·÷4Ăż”P“Đ]żîš9—i(’pŤŇa%FŰĘ“€şťąąŠSż'mç‚©Ľy.żŹÁ%ŔÇęKkkë<zšű%ƱŔćÍ›ăëmooŹ vÍfł;vě­}l>áWŤdłEJfŠn{Bév˝)l˛ÓI6$śďˇšËaöǶ?UIS#†ű3ôĽ¨}ě{OíďÍPyďŠđŞsX¤§(X@Čŕ›Ű¶gM“rŇwLŤżédŢdŞýÎ÷žĚŔ (×Őě{÷şO5Ö'˝{6••^oĄňhŢ*&#»Wtš(~Ă~ÓÁ§łµµ5FëížoG1łq0¦É źŰ»ĎĹ~´P^DTIśˇĎŁŮ"ýÝAţ×owž„F6ěůD=űŢŢÓŹěř‰’ŮCŐ%IéIÚ.A ˝HÉG¶˙ä—‡OĘ'ň>–»ëŘpwpµÝęßÄż~»37`ZPSË8řr„ő=Ü˙D݆ҟĚĺ)ŇüW•eŽôŢç»1‰Śol{bŘő|wŻ4 ˇwÝľ:)‡Č‰N`.©ÉC’Y©Ő—ěužňO(ďKdżŞ¸°0ąsěîEă‚ĆĆĆýčG1Ś9"R©Ô–-[bĽYÜď]]]˝˝˝QĺDE˘úŕ‹iňaÄí>Ę!Bń—ďc…Ş+Z,Kh&%˛Ĺ-˙ňČ˙ěy-śbG$tĹé&PŢŔc]Ď=¶ýÉŐ©LfŹź±„E‰Ľ¨}lű“Ź×»q đ{FyţgĎk˙ř/ŹdŠ&%G’Ů#Ç3ř)E˙AaB„Ţ I˘0E‚‰¬°«¤­÷Ş`AĚd‰DvĐ|´ë…BXŤ®kJÝqűźhlo”H$,hVX_$ŔĐ”Áą2fQů8ŐŮ K©â|F‰>Böúh=*qîącÓ¦Mííí®µB(—Ç s‹nż\ÇöĐ^¸~ń®ő/¦§íííQ+€l6ŰŐŐőÉu÷¸µÇ”#!,yŽá^zĄ¤ň$q\­%•~kÄw™%(1ŃůóźŮspőĘĺknśg8ÚĄ?Čö‘@v™==;_Řk‘n‰Ú ž=ţI`H&Ö Tűâˇű^y´uŐ˛Ö×5ÔŮ đ«­ť&ąĚ^vľxtçîý§†¤6M˛&Ań,ŤLÔxVޞ˛H›m ×bÉB3)©bM}Š˙`Á6żKŔŃŃł:ˇtş$““űşŹ\×ŇĽxŃeA…|ă•oôýţŔˇWH3…]Ż.ˇ Lđ.°ĘŞ®Ęz1©s” óÁ¤ä°V÷ýźîŞ„Ü˝§­sGYů%†’ŇÖč’@˙bűĘ"ÉÝ.f'Éű)’¤ED’K‚Đ| %ěŔ¤JÉ}4UĂŚĐ#… ˘c„2G¸ŞrÄ•?Z”«K%3)ămŐmţÂĆ(‚&Ó}*J7RáA/Ć×á§ÂAŰXM­‡”Ď$I–sPBE_ŽŃď+'ćĚ2!ß8 `á<„AŮ3äȸŤREVŇ š ăhwÍú1gDr.Łu]p·b$±ÔŁ®ńDéŕ‹ß)śÓ22áÂţt§źqś´ú´ČpŰ«›ÂCŇPśząŃěŽ6p_M,˝tG=Uđ,üy¨˙m…=¦‰$!aŹ’h˙Ç‚˝8ĘJčcdéDť%_¶đpÍ'$˙Ä&56734˙ÚݵYeWäuŠę ž­˙ľäť2˝.IţĘ\¶/Ş„+%,«2 –ž]ž-^ĎÖËWWB„)ŇŕČŚĆś«Îb].0BCieRć « †4Đč„\ä`wH°*Ą´ţR«ÜJ¬Tۉ¬ĐçĚú˝řvňbÂÓf¦»®ć3Ż ÄŽÝĂÖŕGëŐ€ÖF đVUŕë8L}Qbňtď­cŻŤÄ.I;! X›Ľ{ hȲl–výŚ,Ýńśů‹Ş5Őn{„÷*|ëźaĽ$ŃŢA—Ďjü(áëŚŢ ?ôŰŠ˛€©\"!‘&m°ëo5g3a •zÝRń_'NúÖÜąÂLŘĐíU5* śîo:łtsSŐ`ĹGCÍ7ráľŰO5ˇĆc¦kă {.ą’´ÄV!ĆO¨Éy—Ďjü(áë»…k'Žęl8ţUX]Nîů-Ń;›u«>ĺ›öoËşwü°ŃÜ»ŚNdXĆäďŹg3DÇ›×<Ĺł í™rĽŐöž Z­‚ňźn8”ëMŚ~>Ď·úßiµIâEśÍ/öK Lřµ1Űť†sn\YěřÇ$ŢH¤/˙Ä1!"1A23QSq‘ #CaˇÁ˙Ú?ýGĚśUéÁśÔčř3adpFTć˛)]AVűń*śÜJoHßžn*ĽQŮČlQTE1şö^Ľ,hô‰ľîű-ĎŚó.ş*lµ“#‘%Đ訝ű˙´Ą¸TŬćŇ?‚˝Ą ÎŽ Í…°ż•:Ţ÷üńbJ«E„ČĆ‘_ĂE˝Śśë|oÓn+E™:šKĄŽbţ`,·ÎH)¦ž[ůŐ8VGŔfU•¶çěM2Ö,¦b8§&ĺزżýZĄ5*{¬63Ţe¬=Ý‹cş˘¨]Vé}ţ|{M†0kpCT„ ¤€’¬‰;¨‚ ÝĂöDý‰Ő8›^§ĎĄ· ćŠÍo€/—ú©ĹF»bĆ}ŤxÓ!’“gdśŰ’j1Yä’™TW$»¦­` "^n®ŞŞ’-ľŢ–ńKFZhËwĂWo‚Úkýykcn×ův¶Ü=WŽ3—OqČş1Ć: 2Ę…—ÖOńřăĆă;*›.Y8óuofAµĂdÖ[cëéõ ÍN#óq'Ş‚¶ ¤y •ż›ĘVéµ¶ő›]§Ë p ĽâóNŻ .Z}ľ.׿^=ĄÔX©×b>ŔDl9ŃnŹ>˝”¶ćNü˙Ä4!12"#Aa3QRSđ $Cqr±ń˙Ú?őž&¸ôÇ"ĽVĺTá»UÚíR©á†'-ÔJśµ8–⥠6rŠZ•@Iş´ňŔţaU§śŠón!×´‡H4*Ř÷î3íš2îđ·pnýW5.;][©Ç”ţ°ňäłóŇÝ/5(·v˘ůB•8ĄÍŤ0t·É-Ú˘ęű"˝ŁÍđŚśëHđŽéµP˘§ąĂi5ćŘ{©3–ŕ–Ű—¨ĹmĹݬíUiŘ×ÓéŹ@¤ŞVS-ŐT~i@Ą*€2ÇŠ‰ wcŚ=(j×XÜxđę®#fy$Lv¤€4Č…–艺âŮ]ŢÓâ ­JĂÁW UŞy4Č”ôQCůj•¨Ł ő_=Ř_8ݦß4oŢźOŞ·F˘Aśa!bŇă6†Óč-0+ âKdú<0ă°jp¦4ŇŮ×bŢHmĄ¶«8m6¨ §ŹH›K«QjSZ&Q¸b7‰Ä7@]¸ýe°*Ż %{1µM¤RĚ7Y·\cą÷^}˝1Ű_›ÁT‘oĂ…Ýc,Ô`A RŰv=2_.ň`b´{w·Y/k÷áęTę8e˛hBbGu[l™ů¸’*[ۆŞYĐéÔŐyz#QiĚlęKŁFó¬óöć <=xz^K“Lśëă?ť L­}˘q¨ŕQśTĺ¨lľ®x‹—gÓ!ÂWNko¨Sˇď2q"I‘§KŚÚúزűpý.<(2Zl$qęt!sĺXiŐľ†­ÍĎŐ†ZU5ךiU Eş!š Óä˝x¦,Hń¦tî—­$S`&ť…ŠŁmžýőú°uěÔÜJ0(o7şdáfÝMÔuŻľ†–ÓŹŹ˛Uă$vŁE‚ 9ŇťN'ś]p»ľ‘N^8®E¬M¤RV›7ŁEŢfŤĺ6†ř‘锉©Sh/§‡_qóś/7Úý;˘Ń:·6ŻŇvô[w«ĎµĂžV\¨S*O¸BŽ”PĄ±fÓŔő#Χh*ž8ňBâĄ'ąhĐ}-0a.źŐ°YkĄ9ôÉ_íĘ̢lË)ňÜj˙…`"6^*‰%߯č‘€A¦b´Ą9éE/j•Ő}eŚ»YŠÜÇ#pÓä˛L8VćVwO°12 LÁ¦ 1:’ŽßişÂ7.ëËJŹşr\R(• úiÝ)Á NҧIúľćO"wvüxa#˛" ´Î€K ……ŮŢĚT}öW폗ŢKŕ0Ű%ŮvSM—°ĚERâ‡LŽ»qO}TŞ?jfY'r ÇlQĄF2BŁ:«ÚÜm|D€‰=xÉ.8ŞęĽ®];~nG$ł«Ç®©ýÜ3 L¶#Bcl>n§u:áŰŇ[Šf˛$j ÄÖ$vHZ†ü¦Ô“Ôëon!í"&đĚxíé»@’fľÝD«ůń/úź˝î?íĘ­U[VčŰäĂo¨Ś~‘!Č»o:¤ĽTI„Ňśµ«„Ź÷Ŕű\[ş IDłŰţ“ĽzżD¸|ěWýÎížĹ[ň„ωw ű¸ÓŃ>:6<ŽPrżÁÁĂ~Ďýá™4ć•ůÔw\Ś]Çâş’AˇNÓ©¶Ń"wčTN6Ă3 SYť¤cq–7‚J4šm­·¬‰© -~üC~47ˇÓ6‚î§Üâ»ÎoÜzSÇÁl–î\GÉ”˛#›9ZŽĎF/‘„–ü#®YU=Důř]†¦µZuź«í’ŻTČIbܶŇś9ŤĎ»n’yĘtiáÉUÁ«čž§mÓ»}•űcĆe÷’ř ŠŘÄ!_*/×nA”Ë(›Ť:«ň2Taô¨˛d@v^IëÄz¦av鮌¤i§÷I÷]më-(-GEK•Öý[[żĘŤ=wâĐ]hAG”‘"– ľ†˘ž EďÄĂ–¦EuíiEĂж*D‚¤»2A\TQ+~kq‘™s4¨ŚXî 6î°aM.<ëşQŐß·ăĂę#ti×j›(ĽŃŁÍm¤_Ą¶Z®ŞA—Je‡@–ô°víGeĄş3Ó´Ú÷â—.ˇ&šűr*,2) Ů&bHBw$~#}['r®(ŃšxŰbAMqćĹl. "ńÓĽĺżrőPŃjÔö„Qăí–”!…=śťŹÓYrŢ›śś1ł6 ’šţM÷*űP§ńÇŢôßđe¬Âť5ć ‘v–)OcWămĎMXO8ĘjnžI §:‰ěBťz8AaĐľ—YŤ¸7EŇa:éŐUOĎŹżżň*źî8’ó2WPŁÇPu˝!×P[.%y(Đ’{ÚokéÜž¶äźV7b¤8Î[Nă 9“ŇŞŠŁ©ąČşn‰ő`ß ‹î"#Ź#•tĐx ‰Pą"zđ¦ă4÷ –äfܲ"U檫7Šă˘#‘Ň/ómU ŽÖż¸ôý=ľ<ąńĂĐd1oQ2Űââmş•9$ť¦Ó»–?˙Ä#!1AQaq đ±áń˙Ú?!Ь†©h¬%b°/éę0Á´—č±Y1éIółn€?lŐ@¦Ú%ë"@FVËr­m`$…É$ý¸D/Qr#ČZÎíČâ¨20ľÖ'ŕ E^°T8ŕ«ëµ9ń92)Ó¬{S„aÁÖ6ÎQz"f(^eŽ$±"k/Á €c¬ňmĆpgË ”6ę/˘ŚPZ­7†ˇĚP»‰ny¬0@V$|ń#äŘ19!Y¸S·#¬w$aDÖ›ú´±µŽ˝oMLBQa/ż>Üg‘6ŠĎ!€Ţ!ýCţ+6Śĺřâ„x(XQ!†ťë4¦×ZoB9!N…'U‘҆IĆçn«Üoé÷2w¤2$ŠŘ9Ţ\‘ěČdéPEu‡• ľ“\TĆŻěĽ2»Qµ˙,ơĽ÷捚Ë"-˛ź{C"2ü!AŢŞöY—Š~Ů|1#“Ź‚Éą?.!BŘŔÄæĽ­ů’ĹUB"il (1“ĹKĆT6´DfońťÔů ¨˙¶4ÉŘŇXĚĂ ľçeˇôZď¸Ëé’UŤśÜż*ŁßČé ÂIĽO{ąacž őŃ/Şţ«ű/ Ź&ÔĐ1/×4ô$=R 7¶‡„2‰ş=ä†OuŚC<&Đ2Ô„tŚ•ü :žŁš@Í–ŕęđŁáŮq|1^Jý®N®-çpaś}Ťxk b”k@ąŚ˛DHF2©›ü€UµLİ-˛,0›¬uĹ•2˙m$´±ŞĹVÁM_nbz`äH˛‹jł@Ěb†©?XŁ+®ŐW0m4ÔúśfŁR0ç$ťĘJ´6#N{ŮCĎËA÷2ňťŢôW,ń¸řĨ-¨ %¤Äźu!žÔA4&9ŹzĚjY9Uó•Ä"3‹ýŁ8ě$ת˳Ů˙Ú €)t? AžCÉH—ő¬ő4ď˙Ä!1A± a˙Ú?üč_)÷Đž˝*ś˝jYCűŃNHö`jB»â꼗1Ń’<ÉĄL„ŃŐeäŧ|ęŇ $Źç!ećŔb´ťV@µˇ:zĚ+"¦ 'đ CÍ ©Q€v?AÂ(Ř+Sú8ď‚}ň,łí FČ4žÎľ ÄŇxŠ*ă _ŚŞ„˛$ŢJĄŞQč ť§‰Z6 Áľń>]nńěóćŠŔn7JR»BÄI€lÉ\`ň3&đT'Ź*x Đ6aŁ’/˙Ä!1AQa ‘ˇ˙Ú?ůţGʧ H {ߣ”é˛Lˇ‚ĂÔb!ţĐŰN 5îŚĐ,|©Ă˙łľŤ“ˇĺśEHâFoPtÄlwÁ¤t,ɨ&i ô)(Ř<đ¶¤,ɇ‚§á úx߆úFBó˛$Ř–ň+LŹÔmC÷čôÄĐsx°á $@4f’íĽ/Ů^—ßŘúÓÖĂťŕ ”ZL‚Ť8BÖÜši7fö슸Ň©äe÷Ă]J*íw$›ë˙Ä!!1A Qa‘q±˙Ú?~źSŢoË5b4j'ěMóá\•ÔŕFq3>*äĐ xFńâ]©L±qGŘĺ-?A[›§´Q*@ÄKtâ­YCÚ ęRă.šnBL´#ßÔSͲź_®®ßýD]Éř|Ł Mf9„™ÓĄ"a `ŻÔČ“­‚¤ś ßm€,D®Ef:A”$bgřĚZ·AUʸBD=h0şµ¬ ʵW• ‹ŠôVPr›śÝ*5˝~©ŮF-4Ęf…«xk&ߤ‘ĆS.Fŕo¤BÄ{/ŘĚm©ŕqi‰|aH‡,g`›Â Î"I~ĆźŘóž'©•Ś©Ŕś µB2ý×j§“8Ä<]^ÔÖ"mˇĆ'e.ĆĄŮŤi&ŔžŮy$wŘ !<ůß9<Ś •|júâ·Dťč!7hŠŽťpÔĐř•’ič śĐ«Ź­ď“űđ—ő01A¦ 3˙‚—íż%~TU nĽ\,ٵEB¨X˙•¶n—’luÔ?ăÎ4Ź Đ$ŹÁ nzI¸ #•ŰCć¶ŔµŢú7ĚZ6ps­żš~-;‹f•D ©P}_l±)wČ’Ě·®/»$䔂ܧ qzĄę¸C@µĹ†dđČť”ŁIíě{;Ä|;6Âö%o˛$ ˘ŘŽśP— Ňr@š$ ™™W…šMîKLî~Üů%dW0Ľ3 Â7lvc\gŃLବÖÜ!KĂŐ@vűyîkŮ•h¸ŹŹÖÜŮ ß ékf·{ÂŔߥ„şó,_ tÄđf3uÔŕ »ç;řG˘y4ŘOŰq*ţÚ1ÜŁXlŻôű2ń{ݦ!M6Q}HÍrwó˙ŽdJ¤ßký‹Ű»ňk+gkK~šaČŰBŠ?ŞŮ ţÄf~ÉűuĐćT…ßrFçĘH_CFÂĆlČ2_Gř˛ŔKOťÂ«2‹ě»äxűÚ‹hżĹšEú粪I¨& ˘š4jŇ ŞI¨& ˘š4“ą~nŃz9âł/¤Ů@ÚKO ¨gđ>.Ú÷v2ąޤšK.‡TSŐ”—Ę-MרMťb-ÎŐĚ f˛ ń"Ţ—5×ŔęÁÇöhÚäĆ·đ$1ťmfĚŚgárHięLhqľfi Hnř¨_cYřÇ`‡VÝ3ľťéëîËZśŻ™Aúý2,ÂWo÷6ĚŃĽ;ˇŁrËŔn]€ŻŢť  úţsŕůŕxaŞźý°Ńߍź=óGď ć =vkő?AŇŘĆôí °oců1}Ó®GŻíđ1źd5^¶R°đtś®%Sćňqłí4PsłŁtźöX>*ž§—ŇáJ‹WŽ×’FitĽlÔzµĽ[ëvmŚ}n%Ö •ÂŃ^<ća»1ů0z­ĺ%‚Ř™xľ5¬&{v ˇ4†ôŻ: ‚luٰRfZC–ŹęŇ f6XŚvËÝŻˇŰë—űe^ ;ÇŚ6Î@Ľwݬň‡52řaô ýY¦żAŤbm\ę™i°–py†}ŤOo¸–™ÂxÄ{ëĺŁNč˙ÖLb%–#jă.” ^«uť•6Ć'0‚oRvĆyŘMŇ. ôŠ-¤X‰ř 6ľE\¬=43öâd˛‚¦Ôóš)tŚz‚ĆóřQżçă”:ÂÄ'pâÖĘýx}…Drűzd'RŤ"}Xüprś"I®đ»YLś ÄL­BűychŤëKőěd2Ňbn{ś3ĐŐX>©ov ě,ĆynŤ¬ýŢ!¬ńZŐ$ hcXh!×ȧű’.ć°Ćďčţ)d!íÉôl­×·ŮA]«„á‹ń8xç=oáXÄż>ÉDźĚ“)•8 ÎßiHóÖmś»GeÚ1¦JýÁÚ*đ‡3ŚDGA’Eh'ó$ěp=ĚŁ)U2a‘9¶z@rűeŚ€Ü{,5Â)ôŔŔĚ>Ć7ťŞ§ˇúŚ„oŤ~‡±BĂäĽ_…“Śű°8iGŻ3Y83ČA Ňł­e;k<Y™{Uś‹Jh”ެš_%ýżÂ Ó#ó‰Ő,‰ö˛q#c-YKĽő-ü+ĺicáč”20*҇ý#ű€|˝Zł¬‡ł‚ qő:C? ąä˘AňźŕVË ą'ȉ#FňÍťTÁĚ#,Ăđhk?M.ÚĹv‘µ¶č¨Śicś—Ńţ"Gš®'“7É˝b i >ŮP]g»”/ĽÍď·ÁÉ˙Äa_7X&SżĚą­=ťŇďlřŻß-ůď#ŐbxţËV™¶…/—|¦žětAÖ§łě¦^®˙ßâOÎ/jśóNséW]Ő¤AT“QMD5iŐ¤AT“QMD5iŐ¤AT“QMD5iŐ¤AT“QMD5iŐ¤AT“QMD5iŐ¤AT“QMD5iŐ¤ATÓ÷ä3¶źx\ŻIEND®B`‚fox1.6-1.6.57/doc/art/freespeach.gif000066400000000000000000000034371326741342000167730ustar00rootroot00000000000000GIF89aX Ä˙H”˙˙˙ÔŐpŁÉ\†ˇ LZW›+(‹ÉŃă“‘Ľ»Éŕ6kˇćéó1/°­łŇ„ź}áŕěÚäďđôřxuŞÔŮé!˙ ADOBE:IR1.0Ţí!˙ NETSCAPE2.0!ů,X ˙ #Ťdi– ®lëľp,Ď‹Üx G‘ä9ÇlFx,T„# X<„ŐóÁrFUN(rz´)Ť¸ âC*P ”呂°vŰËőż×ťs]f a=f7Ji,LqG}r*nnpQ——*^9†c‰Ť.wQ•ś{T}w›*ZłXxŁ7` ¦©h¬şşQO±{ZKÎ*µĎkż B˘@Ä …b¨‰Ęşé+ésľ-ż+éW—Ô Ŕ@><ÄĆ©®śHĐE°úö(DěG*#F˘@á>bÄ( p˘Ł "$„IäG’%L˙†T9‚E‹ 8ÜHł¦Í›2€‰BM fE€ĂAr ‚ş’´LŁä$M°tč™n8Čşă Â}b9ĄIČ€Ďbă‘U•±¨7 Ś»Áăź[äŚ9t ¶ę§Ľ:ËĐk"B9ÔN8f ­Űł9/E8Áź–!:Áq€řzŐ¶ˇMĐ96#¦Ś#ł™Ĺ¤&P8@Ôő µ8ĚüüW4„Ĺ5 pőmŁYßą(mŤ ądž;*î3ˇ LČ0¬çTi‰˘ť Ű­şbvß ż´®C÷Ľ »~{ˇ``Š+46yK…'•Ç—Ä)Ň˙]f9‡ Tşi„Ön4T`¤đ”V! Zn„Ľçmf,¨Ür—U‡Cg9€&oÂX´P]†¨çar7lF â÷`·–g>€„úő”v8 ăr™Ň€„‡C—ŕR](–^Đ™^ŽvńÖj0ćg‘6“•8Ĺ)çś^$ #9HŮ\8t4’GžäJždR2˛é\LĂQ$ŃŁçHP‘E»IP FX!¤śĘ`)L ĘŐśćt*O;˛¸#É;HŔá ;˘L@éaÝÁ• ¤ÖHr„:ÚŇ‚čtˇę ¨ąOs}–bĚ(«tú‹3ŘĐ‘Ë:čĽ_4µąĎ)Ć}2é$qTBŔ® Ś.F ‰,sd€šâů—â ·rJ.ş.±MĽx\k ń^áĹV4…C ť®`Ĺ )1©6ˇ#S\hˇ%lÓđÇ1,!ů,X˙ Śd G‘”ĄĽp,Ďtm߸ČRÍá )+ŹH])qčĄ Â‘d¬ľJ ÂK1¨Ű. Hę*IçĎ ¬Ő@b±pHÂ^đX¬pĐég< jPmDpF_/.{y0\x1‚… M>lQ‹EdR|b0Ťx%`‚*(…‡mZˇ6 rt •T¶Š~z­ŻŻM…+m ·7Átv[ÇŤĽ wÖŔ% ĘŻ……´SŃ5%¶Ł¨ zďfáăĚ ÎmÁę˙GÎ0ČW­¦*¤‘¬€ŹBďž-ś8ăŇ2f‚˘P¨˘Š”#h:Ž™‹="˙ĚŁmŇ˝®6;8˘’'đ7$Î? şäú$‚vuj…Lé ‚‹ś0 ŮíHOş\ =ą`8в囎Z(ťqĺPV“ T‘,P©@P\Á˛°É"ÝĽ/પçËňqjqŻ\z2Ýę ç ]V…VVěĆ«;f»ĚTZo‚ŚiëOťYôţ1öâ¨6;Z¶^~IaśC‹ů éjd«ŕÜ>IH Yâë‹x+?ÂX@Dß ,nr.JBŠE$g@}„^ŽoOÔd”}{ßĺI8Yhj8±ň(F#čńť"aö˙¨č57íŔP#Ëů&śi”s\%ŘbŰ6©- JW ĽQ›OôčäŹ&L7X 8SA!iůG‚vĚĚB^ťÍ@ÁŚ“HpËI÷ÂKůBX!7PAáă7DŹžŚ Č_4\ćU)ApÍ\ËŮŐŤY=ůb!‘@…™SP8Ţ+Ń—Ć!J@S2P™M” d$ †‚R`”Ľ±K#”tNŻ<@‹=$¨‡WHUf‰ĆF‰’[MGj6Žę‚V˘ ⽂ŔA§3¤Ý~j ŞÄ…ě™/@d.ÁĐ’pH ü|gE!;fox1.6-1.6.57/doc/art/ill.gif000066400000000000000000000001501326741342000154330ustar00rootroot00000000000000GIF89aăŰäíţţţÍŮćúűý­ÁÖóöů~žľâéđýýţUŞŻĂ×ňőůiŽ´ĂŇáUŞUŞ,„Iu’’9H–(‹Č4K8% ŁƲ!;fox1.6-1.6.57/doc/art/ilr.gif000066400000000000000000000001511326741342000154420ustar00rootroot00000000000000GIF87aăŰäíţţţÍŮćúűý­ÁÖóöů~žľâéđýýţUŞŻĂ×ňőůiŽ´ĂŇá˙˙˙˙˙˙,0Č•CÜPČE‡q-J2!KĂCq(k„‘ÜI;fox1.6-1.6.57/doc/art/innernerd.gif000066400000000000000000000077641326741342000166610ustar00rootroot00000000000000GIF89a(÷˙˙˙ZZZcccsss{{{„„„ŚŚŚśśśĄĄĄ­­­µµµ˝˝˝ĆĆĆÎÎÎÖÖÖŢŢŢçççďďď÷÷÷ďďç÷÷ď˙˙÷çďçď÷ďÎÖÎÖŢֽƽ„Ś„s„{1B9!ÎŢÖ­˝µ„”Ścsk!1)Ţďç˝ÎĆś­ĄÎçŢ­Ć˝ŚĄś„ś”c{sBZR!91˝ÖÎsŚ„ZskRkcĄĆ˝„Ąśc„{BcZ!˝ŢÖś˝µRsk)JBśĆ˝„­ĄcŚ„Bkc1))!R„{B9„µ­Bsk1)s­Ącś”B{sB„{9{s1kc91B9BŚ„1„{)sk!kckcZRJBRJ!{skcskZRcZçďďď÷÷ĆÎÎÎÖÖÖŢŢŢççµ˝˝Ą­­­µµ˝ĆĆŚ”””śśśĄĄ„ŚŚs{{kss{„„ÎŢŢŢďďckkĆÖÖ­˝˝µĆĆ˝ÎÎRZZZccś­­ŚśśBJJ„””˝ÖÖ{ŚŚµÎÎs„„Ą˝˝­ĆĆk{{199cssśµµŚĄĄ„śśZkk­ÎÎRccś˝˝sŚŚ”µµŚ­­BRRc{{„ĄĄśĆĆs””ڵµRkk„­­c„„Jcc1BB{ĄĄŚ˝˝sśśBZZ„µµ)99RsscŚŚsĄĄ9RRJkkkśś!11c””BccR{{1JJZŚŚcśś)BBR„„BkkZ””1RRRŚŚ!99Bss)JJR””1ZZB{{!BBB„„1cc11!!BŚŚ9{{1kk!JJ1ss991{{))1„„BB!ZZ)ss!cc11JJ!kk!ss99!!BBkkJJ))RR11cckk99BBcc!!))1199BBJJRRZZcc,(˙É H° Á*\¨0€‡#BtĐ,Ü8†3jÜȱŁÇŹ CŠI˛¤É“(–’ ±%€ĂśKIł¦Í›8sęÜÉç–R+Jt(ÉŔÍěÉ´©Ó§PŁJ­‰äˇP—‘:Ń2µ«×Ż`ĂŠ©©ĺŐł ¤)˶­Ű·ps–µŠ€µ\ăęÝË·/ß-ŚF<;tµµ~+^̸ç#łtŠÁ۸˛ĺË5nˇT°çÝŔ]ĚLş´iĆŚ"w†Ŕ¶Ľ§cËž vË"ČťÇM»·ďß9mGľęŃŔ“+_rK"‰„!˘éf‘ąőëŘú1J|0€3ÝŞđ˙ÎNľĽď-ۡ«>c¤şů÷đCf8ź\ýűôóŰ׏ż˙ţň‡Âpęç^|©B'đ-¨ pW,ČKcŮüQqi´7‚mÇCćm1ÎC8ü¶.ÁŘrčY{xs ‡ŤÎ –§8Áń›8EG.„<$49ŐŔ|Á)ž?ÄKÉk㙡C {¬7q2Węb“- łç’DăňUŤÓ/Ş&Há|¤zŘ`óĚűŘ„#»zŤăÄ=ĐÂľóĐÜ` Ŕq´ímâÄC†ŔZ|H‚Pú9ÉmDE˘°Aܸ3"ńeÜ/±hrńp#Ű@P†´—)|8Ý Ľ1żŽ¨׸ ŢŔ6Ż(F8Ľ¶'ĄAŚÝř8|đÂŤ°P±§‡XÜL±‰F<$Uč7şŃŠ<č UHFD2p†I|Cö‹ĺfYˉD Ţ؆ÓŔ0ŽgąĂră!^Ř‘-PnxĂ G<'ĽŕɇÂÝĐĆ»"·˙Î<4ˇ.Đ—ŤÔS´˘–Nł@ä €¬‹ zŞĽA%<I€LaŠFpŕ!Ą§đŤoôá!“ č6č ®B~n5‘‘€!Ţ92ń'l×Eŕ€H@€ŔöŠgŔ.Đ$'ŔŽo|+˛Č×C¦D5…#90Ë7¸!€–\ VđF]^9ppC A†#rŠ=µâx%7>Y[J ÇBA6Žo¬SŕŔZAö €Ô˛°Â7¶1Ă:aťš+ź Žoü˛%f}Hľ1#|A©áŇ:1SÔĺŢĐáR›úTYmÔâ2…˙u§;2µý2¶d\ÂHäC(°€(c~6S’ËÜ徊ś¶Geéj‡B¨`Ř Śq@`vă!a(„&ň°6¨ âHO úĐ4ćR#PĂ#b‹ďŕâ AyĎ{Änbo ¸/2żAÎ^„mxHRűö} —lł¦Wyö®yÍ,€ř ÷ŔFR@XkWńć! lČ&4 áÝâ Ťăčë:ŽpU ÖŤÄŇ ‚%Ü5şÓ}q¸Î𽥶ĺëLdpLŹ„Í«8@ÝVC"‹“ŘĐ`’yĄÜě†./ń ¦v׬ ¸Żą1 <#˙Ux©Ť¸Ň ÉhÄ.´ˇŤU„4ŕF*†5·ůWČ«,H˝€ŮlB(˛E{|aMp9Ă tňłĄ ‡<áđ*.oúžÇ:‡¤'4˛Í ą….·Ń[„¨ž'B ¨/rŘoŇčÁ7†ń;¬™µŕ¬7Ř BsK…ŻżVŇ-ËŐÎb‰c˛«ąö©,) ËŞFÄ–PR›@NgcŽĂ3Ľń ß±M˘ŕB˘o¶¬ë}ç} Ś(Cµ1€‡T‚ű@ż˝ńož$KÜ`#D|ăĹ÷_äÇZ=%@P:Kc˙ŕ«_AmpäúÂí®°Ę‹ÜĂV¶’ń¦"(ý`„´úmö-8¶ĆZ4ˇxîęnxŔx{Ć”ŤĚ–e\qŰ‘Ŕ&ĽíÍ„ct¸şw˘#1ü"Ńl9l^űzj_Ŕ :ëŰ\ÝŤ]\ ›CľÉđ7sMY U0Hŕň= użűŔ ÜroěÂ*a€§ý¸±NÔeŕ!Ć«ţű6@`ĘsđÓBŘ9¨ť}‡GݧĎ.šďüŞÁb„ÜčŞ~ŤąQptr/؇ĺa_çú.x᎖­[¤đ{ďEëMţ[€ş—0@„şÝ’Ô.‡-ź}ň˙}ŰѡTv-ďPě0Ť\zŕ—eč=j“Ańo.áhúŐ_;Pá }µ đ„0lŁ ¨ ~`v~o0e_Đ 3Çrń2‡E Ů jl5‡Frµ )%ŕ Z şv?·/2ö4aĄ Ť=š`Áç1˘¦ w fTËŕ0ŃS[×H!Ô€p[ćpĎe_q~ŰŕŁQYÄ ¨ —˘F  Ü ^¸ Ű ˇĐĂđNS˛ Úp › lxßPŢpŰŔ ›P hH6bdh†h(#qđľŕ'‘Ó ŰpÉ ‡Ă˙Ŕ‡[đ^»° ŻŔ |Ƈ¸¶ Ś47H‹6…ă6–‰v¸‰-†ŞMw¸ ˇ@ |؉đtâđ…Üľ–‰V˛#Šx±ŔŤp×W‹ŠŠ¶U.0 µp lč›8Qŕ0.A ѧ>á |čâ"PĹ€vb9µ}!÷ şôGˇ1?•Ő VB2SrŽÝ #1öŽAŹŢ 2ňZć@ÎŢ ľöŽŹäxD·đhŻ„OÜŕ ěč}ĄKÝ`řJ/4%Ţ€(hŽ2!ŽňXŽFđ IQȱŽMf#űřGŠŠ’GuBćř đôd+rŕ°f»˙ämIŽŠĄKřO5)ľŤ.¨°#Ă LCe.á·‹Ü‚Ő!%XY•!'?Ł1V€•ŕPDřHXWV°I"ňZ`É•5ň•X)–.6'Ç÷¬°!^yka‰L skU ?gąwů’óZ3ˇ:4xŮ ]ň#)†©—Ł–eŮ•„™ŞĂ–ľv–°q•X)?~"V •ľ¦–T š›äŚâ‡Ht1eŽŽ¤”P3AH ŕłP~!"cxq)"1—ľ…ľf qéÓ›Y¦›'!ś!"ÎIĐ©ĚŮŔŕhŞ)đ 2QU kpÂٵŤѶĆ$%ńd,€Ă ’č9[ ö—HB1ł€#a#ŇvNÉŤ PS’“R ¦Ń ©é|÷éš á$`gh˛„°Áh "q•‹‰ˇ¦±˛ SC;‚™ˇß PnŃ&p”%ʡZť0 6˝ Ůٰ ‰á@ — Ń1ž É€ ~nHş\JŞ\Lš¤Mş¤NĄP:ĄOZĄRjĄTzĄZʸŔ4ôů@ îI8´ ŕAH€¤°‰ő1Łpú;fox1.6-1.6.57/doc/art/iul.gif000066400000000000000000000001521326741342000154460ustar00rootroot00000000000000GIF89aăUŞ~žľ­ÁÖÍŮćŰäíiŽ´ŻĂ×âéđóöůúűýţţţĂŇáňőůýýţUŞUŞ,HÄ ˛’ĹÂ4J L©©*ň–7s;fox1.6-1.6.57/doc/art/iur.gif000066400000000000000000000001511326741342000154530ustar00rootroot00000000000000GIF87aăŰäíţţţÍŮćúűý­ÁÖóöů~žľâéđýýţUŞŻĂ×ňőůiŽ´ĂŇá˙˙˙˙˙˙,b’Ma”Ł ˛4h. fČa¬`AŔ™@@;fox1.6-1.6.57/doc/art/layout.gif000066400000000000000000000347341326741342000162070ustar00rootroot00000000000000GIF87a,ç˙˙˙äćäÜÖŐÜÚÜÔÖÔÔÚÖäâäDFL464<644:<C¤Ą¤üţüěęě”””TRTěî쌍ŚTVTŚ64Ľ»ĽLJLlnlĚÉËü¦¤ś&$üžśŚ*,¤FDüÚÜüîěüęě<:;´şĽĚŢܬşĽÔúúĚúüĚööÄúüÄöôÔööÜňôĽţüÄţüÄŢÝĚţüüÖÔ„FDÜŇÔäµ´Ś"´><¤NLśRT”RSü®¬ěÎĎäÖÔś_^ŚşĽTrt,RT,JK4Y[dŠ‹´Ţß$NL$JL,FF,NRLnl„˛´ĽňôDntڞ´¤ÎΔąątŽŚ4FD4RS¬ŇÔĚňôdlŤŚl’”TR‰ÜâüTnlTjl|–ś„¤ ĽęěTvt\rt”˛°Ľć䔾Ľ\z|¤ÚÜ´ÚÜljlôŢÜ”JL„.,,,ţH° Á*\ȰˇĂ‡#JśH±˘Ĺ‹3jÜȱŁÇŹ CŠI˛¤É“(SŞ\ɲĄË—0cĘśIł¦Í›8sęÜÉł§Ďź@ J´g P©R¦N—6M*5*TŞWźNŐjukU¬^Żk5ëW®dÓ˘]{¶­Ů·aăvť«Ö­Üşpé˛Í‹÷î^żvőî+ď߀ůphŕ G†,ą2ĺË“3[ÖŚyłçΠ'SN@:rdˇ?s^­şuę׬a»ŽM{¶mٸkçľ­»7ďß»s^°á *-Đ iÓM (%ĐśŔóčÓ«_WžT»čÜ©ţ;˙Ž˝űřęH8P/@€ußĎ—oť|xďŕĄ›Żź?»üű˙éGßvâ7źňw`€ţ) B¸ź„ÚW Zˇ†ö×á‚^â†V ĐPTA@PPÁ‹8樣C,şhěH`pAě¨ä’J@ ĐâŽlŔA|p#“\vÔq>.4Ŕ“TVBT —l¶™‹ 4$e9j Â$¬éćž|ÂT@Š §"•%p–}&ިI$@ŔŠSR) ‡.jéĄý9¨@.Yžb*ę¨ő(g¤:Úi¨ž¤¶ę*§ţ›*4&”©¦`h¨¨ ë®+° Đ®*´l ŻŰ%‹ŹF‰jť“VJ /´ m°*Ŕ«´/@+­°ĆvŰ$ ?Ćšă§$ŕl čĘ0 4¬·đ*Ůh˛ ™Je#8;°č˘«·ďŔEih§JÚŞďŻ*ô[ *Üŕ® W<”˝ Í©¤ŕgA «B¶*ä2ŧ쓠’™đ­î†ě‚;đ`Đ»*笲§Ň‰#Çx˛*Ŕ ą€˛ÎH×dp¸K*l.± ŤśôÔ3Í ©Ď/ÚI©ąGÝ5Ő`Ż´4§´ÖétĚ eöÚ+a¬Ć÷}2CDłm÷H,çňţŽgßí÷M<+‹uQ{,ôßű .¬şpâłd5Cn˙|çÇ‘g.öâ˛"śjˇŹk.úH•#·Žf†@ÂŁ·NRŢbîŤă%ôŕĂ WV€’÷ Đ”úŕ×˙ýý†áŹţúúCĺ~¦śKČqĘ’8F8ŔA@Fš FľA #¨ŔÇ<ćĹ!I@" ÍÁ’đ„# đżŽ”î § ‹ŚĐ€#Řđ†8̡wČĂúđ‡ţ@ ˘}X#P†@B ‡ČÄ&:ń‰PŚâQ48ŚŔNV˛É“ %,ˇ‹_ô"Ç(Ć2†ńŚJ`B™đĹ%°1Ť_lBÍHF4ŇńŽvĚc÷Ç1.a N8‚č…7á b|ŁĆ9:ň‘ڤ$'IÉJZň’Ě$%娄@:ę#ż{÷<"Ą#( ¨LĄ*WÉĘV¦2 ¨„e,g Yşň–¸ĚĄ.w©Ę((A G  'Řň˝¬%/—ÉĚf:ó™ĐlĄ,—p„`b¤y´&GŽcJeÂň›Ţ '8ÇNZ’Sśč$§:ÓÉÎuş3ťßŚBś 0$ţ ¦ä©Ložóťm§@JĐ´ -g-•PÍ*^D{ yˇ ĐÍrĘň˘ćĚh?ůůĎŤôŁ ©99H“ S IŔ¨J=ÚQŹşŁ/Ő(Lg*ÓšĆô¦4Ĺ©MmÉĐQ^S›ŕë(zJdęT§F˝i?—šÔ¦ľň©´d*TĄšŃ)Đł¤%€>ůiŃdF5§`Ý©XŹV˛Žµ¬h­% Jź$† a‘)W*ŇŽŇ••4ÍkFőĘŇ˝úµŻQHB=ź’Ó_ťĺJAĘŘş6ö±ŽM(zJX+u łj7ÓjÖĹŞôťěDghíÚUp†¶–QXB= )­Jaź-5ţ­lĎJ[łÚ–ł¸­-Z{ĘZŤ„2!pýH)O©[±z°Š­éqűÚŐŰ&7°5éa9úÜä67·ÎÍ.v·[\ćR€•-Č㚀ÍBv´Ě]jLgË×ĺν8˝joµ¸U¨÷®‘=o~÷«ßŇN–­hB$Ę‘á^·»ěµn‚Ű»^äVWŻëD-IĂŰ‘“"–´ţŐ.‚7¬á5§ßő6"TĽŐ«Üeáűţ5Ĺ㔯IňůZę*4Áć0Śu\\÷ţóĹ Ü•żn0RU,ZC¸ÁőetKba®®ŘżHîo–·Üdä24®ČxIśĹŹp“¸0Í1ţĽć»v9¶]ިŚKBă}2YÁ9ÎóŽőLŰĺň¶­A~«[7b`s×Í Ĺ/žßkčűsÂŇ-fX1ĽçJóĎJNp;2âŚŮ#g^ôc5ěd<ß™Ńq^đś_·U8»T˰沬YlŃ/Ú"FČ5B€ňŐÔą}r©™üdŃÂ7ÂÇ”˛ÂLč鲸͗¶4¦wĽćMs¤Ó)±HB}ĺ`ŘĹĆî¶r7,ŰU˛ĆČ čłŁÍîi÷Ë?ľuEv-"WřČK.hgź:lTĂYŘ/–đ”IReSď{ÖŹőG3ŤJkoäÓŮ.3¨Oü`G+úÍŐm1”+ŽÜ×ŇÜŰn5Ăţˇíî’KűĐł´5 {Fp_›Ü%¶u®qçŽSŮĚ浳ÝńvźÜçďm8®l‹÷˛ őËEştĄ^üʧNő«çąÚ‹śÁ“Vx·ľn&÷Ôˇ¸ţ$ĺíۧ[Íü¦ęŠłŢôŚűł¦ňÎmr ×}ßKî'Ń3bô zźf߸Íßhpďţ9>Ż.ę…˙üîŹ×79˙ld°ÄŢĆ÷ş%;rűŇÝăÍÝř{áw‚O—íŢćşęĎ‹ř†ĚfF:2kâŠň|đyî]|űłUńô­qçQÝőČŰÝř]ĄüDĺ]o˛g¤×ć%ü»e~lQßßn)Î#ţŤŘę÷ůŕç1Ó‡^ÍśK¤ď•ýE¸˝yÇw^ôtGŻŹýăŞÓ™ńRĄ4ýµÎ.O}ÜŢôu $vŰcyϧy<çmŮÇ{Gr†÷lŰ'w’VsĄ~sĹ·T{÷S9§m€g{J6x¨'}—wÄ_öÇjčf},x.rßç_ĘÇôGh.÷€ś÷tÔgZů& Hz7×~í·zHhPR§d¸~˛G{Űx‹z#u3ÇGEHEuXĄ‚°Ősw‚8†·„łĄrFĆ|6č|BFqh„؆ůÇq‡§…LUzD8wqč{ř‚Çg\ăFZMhč'·MţR—SáÖ7ö~uxPŔgf"g‚đoI„5r3¸ąv5xĂŐo–}oX}:Řxy¦7`ȇŞč‡˛8×§ĺ^sO ćrl¶2LJ7…ç$‡v¨R“jŚg…µŘ{č‡YGZQ°VHlxĽxĹq˙—h¸—ŠrčN¬‡¸Śž—€ű—‰ýwލL(fO(qÁ~‡le‡XŹu/uŚńX‰@Řh—H†Xľ(€iČr¤ă†ÚpXč{źÄ3Ž"Q„öčŤŮŚ?ç€ŮÇŽ·(bO¨~!ŹřHsŠ‹ ؇©Žü¸MřpvţččXßř UMj(źhˇhŁ‹®V‹$¨{I}ë…‡9w§U”f¨‘µŐzo×W_f~Qł÷wZT^Ks¦xŹBŮvoxvąQ\“Vô’ľŚłČn¤VIĺz@6€jŘ“QhIŽ?HŹZČ€E©RH™Ź´Ž\wʆąv?F•Á"9§U(dĽčfŮ8‚ۨv»—…uX]xn_„5™k™ŹŽř‹eń—QŹ™}QI‡‹˝8šVŘb J9›)ůwůíHRŇ"éŽć%†řŚ•|9–tŐ’‡–ޏ’„É9‡TXk8ifÓţ\lřPřšËImi‹Ą¨Šµ)L·y™Â¨Źşéh5‰›)÷‘÷&śŹé„GŔ¶ĹžŻYžĚ ‡=čśQg6V…AŘ”ˇ ź¦ž¶¸ťŠšHpř”٨×BIŹ:xžÂĺl‡™^ú7ťţuĐV°ô›a•†Ą‹.Ä‹1*šjŮ–,X–V·‚ÇŮ‘aé”P‰ŹĘx‡Żg–&WÖŁŔML‘Ţ“lç™”™™ć¤ˇ¤tzżčˇ<ŞŁâů™ęWk)EJŚy0PT ;1)Prők*ˇ ›i¶ĄŤ¸ś—‚śůˇoş\ Şp ޤËřu¬ţCđ[¦“ Uj˘©’:©”*©jR'P`ľÖ—.Z’°˛9Şňô—č)iŇ z x Ó'nDil_fШşS©¶Z©…Z%ŕ°G9 ŕ?@'P¬Ćz¬Čš¬ĘJ?€Ŕ«G°•VĘ”’‰śr* ¸Wštő•ŁRç­íÉźi ă$ŤŔŠĂŞ¬ęŞ®$Đ(Ŕŕ  ŃżzXZ°[ŔúÚŻţúŻËŻýŞY€Wŕ‰hŽÖ)O ˰±ä°ńÔ°±Š%± n«°B¸lܧnÉś;±˛ëO$ OKž~JKÔTţŻ÷šŻ+°;łţzXĐ^ {Ťb€@D=C0´D[´F{´BKŔ(Đš¤i·°oćKJŔEIʰWeLŔS] [+a]”\ô…źµPť)š»­giŁ1ęźtEµs€vö°]Tްu·˛ĺKIŕNPµiec{µŮj­ÉWMV0ďşH;´A۸D«´`(9ű˝ö)đĄˇ%°¦c9ZJb0dPfpĄŠh`¶Jŕş^„iĐE˛ë—h@jd°lĐ]«NQŕeP»ŻŠh¦š) ĄUŠeŃhş¨«ş¬+OdÔţĹŐ›¤iÚKV¦VĽ«dĐ»o‹Zq k@l ;şˇşR_&™›¦Áą!š‹°ô©C€+áżĐ( x_ٱs ľă«tPv`»µËQJ°˝~KÁN°˝i4±K »t »<PűJQpxŕjđk¨…’ŔFŁRĚ;˘‹¦y@t ľj ěK5ŚfP05<J@tĐE ŚźĺĂ5ĽŔ¬!,Oq@ìaĐ™qĘq —.ňżřËZ= C݉kŘcßj°|ĐKŕ@oPµăŰ}©ÇN »~Çƨ»€ŕK‚0ţt@…`tŕCśfjŚőTź×DLKđ˝áťćtd0iĽđjŔj”t0zĘ]$Äj$ĢŚZ G‰ŕ·}üÇjŕńÄŠ ‹ĐŚŔtТŚŇ‡N¦IŤÂIa#SĚ*Đ+!5c‚zsJŕđű¤F „ŕEăk¶IŔ»~»ľw\»PűMLNеj$ jŕhćKi°‚€Č<O‰…_©e§­EL)5ŞFą`L0 jđS¤J@ ‘Ń(Ä<Ä.pĘC¬¤ĚTL Ä.¬F•@xĐËňd —€ jÄâk¶&9Ϣ…†Ë7¤ ,.ţ2Âb-P7¦ˇVşÂK d  ZŤI ÇŽ7|ÇdŔuL.ü°ăśFjĄ dĐuëK›N€ĐŻć¤±$X[†%‘ żZJKJŔ tĐ •¤}Čĺí€jŐ˛dUĽ»© j—ĬYŚł«ě˛ÎTPp±ÄFSáł0@#–0@óh˛Ę¶ĺŔB©®ş’K«eś«”b„n<”ÂŁÉ ęBĂPĂâá\Ŕ&mBóNŠ$ŞŇ1@ńĚ‹ FĄcB9ő‹QEéÚňŇ9°lS±Äč\îą–3̨»pČź`čţpŁ4 ;$ä,´2tÓ…\řóOĚ$L-G©|N:禂TËoD°(ĎĚń˝›ňěĚPŁ<Í!±>kA‡%ýNĘM±ł8ZŤŤjÔxTsU]ý•U[Á-8ÓoQVbS ŔS ˇć\Сł&Á[ŐŰ|űţEyŇ‘§á€őĺ×UnˇPxchťŐłB§ť®,Q•“ž´ßĄÇUłč“‰ľTąrĎ˝0Ý ‚Ŕ łŮ†¨Đě} é«ĺ–űŇ‘˙úĽłWĺž ôµ©łÓŚlěř\cÍZÜnIÖ›Q¬˝ně¬ZV`aˇŰóÄH«a…Bu°A&SýŮŕ•U‡µňą#ŹŐńÔýŽ•Í‹GUsĚh÷¨=¦–U¬ď~=ěĂ­Ögä!Ý7[€ľCłsŕf7ŕˇŢ{鎝hâa]ň}ĹĎşgÚ‹>ĐBߍ‚:;Ä×?xĺÉW”ţĄűVzŔÇÉŹÍĺÎLĐb*°‹DFg©Âßäţ$gĽŻmÍk{ă_Đľg©Ý~?y_ł–uÁŇđŽqĂŁń¸ÁăĺŤ{ÇsIóʦ!8éBJĄ˝¸ÍÎ{,žý–W·Ęý „^k˘ő…&cB<đz¸C&>ĐçžůD†9Ýýd4‹ńT*^°RĂ/čĆĄžîČnBCžă‚V?­ˇQ„ÉűžL*ÄźTĆ‚ő˛ )#?˝108LÓŢ(G@¶D…é "|î3.Č źtÂů)/[RěăCŘ@ńüđ_éÓ#žô”A=ţdqÁkâýČÉLňm„'ŁŇt2ç'ˇ Č6JuŤě‰q ÉéÖĎÂţ6:Ń•±ßH–ŘNŹĘşăîzWĘ:ĘŻu–CZ ąĚJB±›Q9$5ëč”'y2yÔźěĐĚ>˘ó|9ĽˇB|UÄ q”ż˘&˘P)ČW“ućÔ$ÁĚx-YV‘ŽMúe_9Č2ö““:Ś ;ďGA_Es}H€EŮ·AqŔÔZĺ%WO~ňË>\U8Ĺ ·IŢPˇ•ÄŰŃčÍ62Ńu× &Ń*ˇµi®¬c­ëuxŘ”m˘%Rk)ŮJWĂF•Ť®3ŞYQŃB‡M^]OűşT}zó´Ă”ę*K ×lt±ŚcLńj×¶–´Ă\ŁeËLĚVô™ýťA9řQ’ ԡ΍kd›;X7¦$µz\­ 'ÝüÝ5¨<ě.Rź«S!ę¶4Ggo79^öб¬]”q»3ĺŐhO¬1 {UňX<™"W)”ÇŽV •Xeđ~ˇZRâ˛r<çÝęö¨{هő·ÓE0]›PŇQ”îó©Oó±ţ /¶Bő®ÉPXHé(–·MU§ß›a3×·”meuc żÍR¨łŞý¬‘Ą;YËľŐśĎ5ďM Wa‡VĽN•ězŘŞ®Ó°Ďąí^qkRţÔš …,‡ńŞŢŮňoţqrüĆ)Sµ˝*-KŚsŁ~ JűVúć”ő¸ Îńdk`#1˝Ëóo`×kU)cůŔ••Ł^]LaŚ-‰3é ÷śÎĎŐ’ŕí±˙ňLĆAĘ5şăĹd‡Ń©N˛¦Đ”°׼]FŮd v´ru=eŞT:Â]Ţt<“ÜhkÚŘ„ĄözÓëĐţ8đČ™_Et5ů żšS˝Ţ4­iŮ…iőmŘŰ»µąŃĘ`žźńĆ+ą˝EÝôŠď ęë 7˛UN÷© z¤qwÉČóYr…Ŕ_§÷Ţ“.W(Ýű˘‡ß7ͧÓkëţXĽaµ6;Ĺçss˝ËŠ—sĘ%‹ôÇ[dŞ[}˙ętڧńĹ^6ÇŹŚňiűVň?ĺúsë¦úŻ™ś›IwĽŃűâyßÉ|Â…÷]Í5\úUóűb~‰ÝŮŽwjËüĹg<ŕy˝2鯆éőĺ}gđKMŔĆ[Ő+ţsŘŚşx€_ĆŤ˝5–5”‹8W;†c8ęĂť`ë řűŞ.ňŠ6ű)J˛=ÁżőY­ĆS¶ŽŰĽÚ3ż d?cšÂX»©y±Ýb7%ÚľáĂ)rS# ݤ’µ­Ó3üśąÓż©‚3f› Tľ<<§i˛fy2ô⣗şżIµ:Ë»kÉŔě{˝qAPËţµ“Ó;4!cŇ˝zrŔBÜٸ»Ú>—ó8+»:‹µY0ĘÁ9w;:[űŔâQŔı> Âľü,ę/U+39ţ‰ÂD¸8ňÁŞŰ»Ä:˛;ŘyżÝ;Áůs3C?WÓ$@;2*D­#ąäzCÓ2łVŁ3/ł<;;C_+ ߣĐűÂëCLôŔ ôşWSÄá*ÄÄŮ@ůęGSĽ+¤˝ök8ljHôÂÂk3=:üľ2l9tłE»ňÄÉ»ÁT:şŞ5h¬EÍsA»ĂÁ)Â:ÂĽ0ĄÓĆ ľ¤Ĺ‚a˝-[)„SGS<ÇG$8ç Ĺ»é¨{EˇHĆz3ďţľÜFră1˙;(2±Óó9”¸ŕ:ĹośšË{ŠiŤQ–z·•dj\ę”Ěľ‘ę@šę¨¦ę«¶ę¬>¶ŞŢj¬îj­ćę°öj±ëH"d४?alę§vk- ľ Ľuśką~Bşľk»& ¸2…±ŁŽ Ë1ˇ&ěťvĆŻD0Äţ®ÄfěĹvl…TlČÖĽłŢÖ7n:«ľ¶ćl§Ƥ$EţŞĚIMlBÎ퀋CŘBš6"–aÍúÇÍöěŮ~ë…+ĘDÔkĽĆm[ĚíŢćíßŔˇ^Xśiµ.6 FîÂ(ĆEÉnn…{î‹îN ;ęƦ®Yí˝BKŔ†–˝ĚëěÚ®íÔľíf$ľ“îDŚGÓFîۏnCKë ;nfďđÖBkŰ9݆îÝ~¸G@ đŘsďÉ>A`Ţ=ĄćąÂvp›cHX‚´ôî4Ů;mhĚo•|F4뾎ąř×{ŐěhÄoÚîl ¤‚*ň’©J±j;ąJYlB{«|Dp_ćî{‚@˛4ńďQä«ě.`úHań˙ţ)@+EôţC*cŸÚâ®°ďľŔ×r8DJ ‡‡ęĽń— \r©´îćK%5žVĚöY*ŹWóżď*ś3«ś¨ą$šę—<¦âK=NđöFEÁq|SeÖţťo §óH;7¬Î6Ş źü~”.'¬kpşĆ=öî™ďÝ_ľŕž˘1 Űň-'˝N—Ç?_n,«V Ä'˙Ĺ[üíšĘFęD'a©»®ó`ĎpLĂŞ±üň«|Ɣӻö“qf·s¶&F4óđŚÖqŢŞď9‡ôl×ô@ż=/ż9?y|uOsQ,íU'ńÇÓőŔĆWúń,Oîx?­ľţűěWďŔ!Ďşŕ F˘7†Ó9TÄQJ7çÇR?śeTDa×v3'łEÚŮ:ň·zČ:¬ÇnGíYäĆĄÄĐů^4G—m…yf«đ*Ťô˛c3ňuz7üA.?Ĺ%tňîp6ßó5<8źUDuy÷ů[—𺪠‡ ÷ř#oKŁÇ‘ýh‹Ţ€Ź•Ź˘ż<˙ń¸¶u˘í5×yˇ°ěD#ř~łš ů…źëٞ•“uđ:h…I8˘G4(‰Ř{Çdb^ ŐĽ4 ľ§A`8hŽÄ’včűQx„ąźAŮŞJňY wĂńQ×hŢBř%ű:Çü~Ú–ţŚHq"F‰7f䨱#ČŹ=^´8$I‰•8˘óJI”(LÁ#¤d 2N`FQâD @Śr:ůIfỈL”MBQ‰$:Ž$í©äj±XtţLÁţČńbĘ’b˝† Ö$Ú±i׆%‹ÖdĹJŽ €đ.^‚ęć8 ľ‚óXŘЬۯ"S..ë¸ńÉ’lQR†ë°g#2šŞĘ”™DŤš';‹Z”( 4:Ĺ&!“ĆIŐNjÁĽěP‰":tZ!J:ů1⓿? Yńp˛mˇĚE `0t ÷%Ŕ7:vÖ oëÝňŮđŕÇ‹'ľ¶2ň°Q’¨†-6 NÝ9UË/Şš‘ŃÚ—áçD3ŠDĹu[$âË!UąE^bŤ-§VzÝ9řVq*‡Qsve×W hHsb÷w&gŢqŔ©˘JĆExEáD†LŚô™nţ@‘ˇ<:QšNęDDµFăF¦Qgn4‘ńfŚ ¶ha…â5řÝwÉYYsÔ‰x×t‚)ôáŐV%„V˘ř把•çć„‘YÔSjhÂä7‘AGQJ$±ÄtIÔP«ÝąD{˙1!Ű3HMĹ˙Ý‘Lzůb›¦a›"Ič)rĚŃ…fš†*B…‰™*^…•%z Îy«­ŤşëH]Ć’K ˝]ÚWŽ‹e®¸*>Ý’…+*\SÂÎ t|2ÉʦFÚJ ‘Ć źű”†nęöšQ‡=;r.$ń 2H=ř¶+ÍKË­%şă~áᏇ«łßt(8A…Í[ü@˛ľLţ÷şH}tŔ8źK’˛óôßQĹ}LKm\ŁŁSŐ÷…ŻÄŰ›{łĚÂĄűéű˝wšÜ\€1x^g2_ ŻZŮ `Ň“đ`¦7ÝůJ%ęrŕ—Šä˘©n\šý(0úŮÉzĚ ‰ç·U ĆU˙KŃ6ĺ»Ĺ±0qň»ßŢŕw+°Pđ+;đrŘ= ć-8*„ß5Č;:ͬoĹ“—`ęuÂż­Ić1ŕô?Ć™h~śęݤ¨ÇæEď‰L»aîîD)Qn"ZĎJ¨ż%Ŕy'Ň`ččáíw"ç¸fŃ7]zŃ x%.OŚáşHţ‚v/ţáţE‰l$ÜăśčÂŢqŚtZáăřĂÝĹĐ’J‹ i4.e˛~9ăÎŽW±‘DĎŰ`5‰GXŚŹĘ$şě†»şIćf…$$sHrR…”‹»ö‡EÄŹLáĚh)K9ę1Rá%é8 Úň“]4¤Š„ąś]VqmAĺ˝Hض˛‰±<ä$ăYI@ę˛\Äü#.1ÉIzž÷̧ 󦫰ŃoH Ż)˝q›Ó|¨7Í©ĎcŢO%â) ĚnĆŃšáü¨–LużĄqťk\˘·Ů8jÎR‹ĺ %F÷iĹa~ňť0Ő&iFÎęÉ G8©ĐyG.‘ţp–ü&%噫NÔ‚˘Ě¦Ă L 2 Ŕ¬cű)FEd §bž*×ÉJ” đ•ż&DY SŇl…áE˝xU;FuĄ35fŇ@Š–)ü”™°jBFzBHN®jM+é9ĹXž ŞrĹ)ދѕúĐźsZjJšłĽť©D~š_čIĄ&užÓ¨L%ąK0šňŤs‹©d­·Q·nŐ7č„×Aé%Ř˙-t®­mé,%{KxFŽU­éüŔ‰ÜÚU§ŃčZ4 Öݶ ¨˙ ଋXŕÖ¶ż ¦k)\Ë:ś ď(˙É.č^VN ę2“HÝâ9O¶¬--i_KŐZQ”ţYEęwń9ŢRÚWµ7Äa$ó‡Ľ1…D›ežQSK[înWšäµgzéčŘřýw®q‹-@Uşá¦bđ˝;l3ç;²j§n«‡˝Ë@.ž—ąÝe®[ëéBĽşÖąŐCn «ÎĆ*ľŹTŔůYÍüâ÷¦áµ±z_ţňT¦Xoʵ›Ń÷ÉÄ‹k#U<¸˛‚ŻĚf>3šÓ¬ć5łąÍn~3śă,ç9ÓąÎvľs›+ĺŐ"<^%%Śu•Ů@,Á JÂhmč% Ú'nô˘!­hG3:Ń•¦´¤/iK?:цćô§˝iEO:ÔŁ®4©5ťęN‹šÔ Ć´©KýhUŹzÓ­ţ¦ő­;-kZ»zŐ±®u®-ëSłúÓ»žu¦ ş4@™ź%QO¨oA Ö®¶µł­íms»ŰŢţ6¸Ă-îq“[ÜŘ.w·ĎŤîm«űŰí^·»á-opż{Ţä>ŔśJ­˛Ď~ @.hđŤ|Łŕ?8Á~đ‚Ľá w8Ä9q‰/⿸ĂÎđ‹k<ă÷xÇ5nđŹWĽä 9Ć7nqŁ<ág9ČI.ň•·\ĺ5/ąËqns“ß<ćOyÎWNpäÂÎ6“…f SPcéN:ÔŁ.ő¨SăÖ‡đj4}ę^˙:ŘĂ.ö±“˝ěf?;ÚÓ®öµł]ěMoţú˙|v&4ˇ( z@‚<@u˙;ŕ/řÁ~Cą ó‚ ż! €áB„ řÉSľň–ż(8AX/űŮÓľöĆă·Xým{‚h # Aěw/üá˙ď(ŽWŇ…ŻŕřĹ>ôŁź*ą·ĘČŇ€R`Ř_żűŢ˙>uíäď~ůż÷;řÓŻţák~îś~ ÎżţůÓźőÇ ůmżü棿ţţ˙?ĺ5X‘‰źňůžó„ $ ® D¶€ć‚( V`tÜA8S÷E€ü„ Ľ@ ´Ŕş€ ţŔ€@@ Šŕ L ¶  MⵑőI_ďý^đ9` Ä€ĘŔ ¨ „ ä j ¨€.Ľ şŕá UţŐžŔëőß Ş€!  Vˇ~`v!¶_u=Űđŕ !ę` Ř€ Üľ€ÂŔ tÎaýaŕ@D[ô=áöI!ĽŔ& Ş@D > †&˘ú ŕÜéôeßö•!aş€ěŔ.ŕ ‚`ę*"(ÚžJGŇŢţ‘^!Bda@âC(Ć"ôQßAĐÝői÷!` Ü…jˇŞ˘,ăî-!Bŕá#2*DŢĹjˇţ)Ŕ@ ä‚0Ncía-ľńéa.âŕ]< ¶""5ŽcęŤ"ăóťb*Ş3nâ.Ŕ 09Îăé1bő}âîĹßŇ#?vź9j Ba2ö#AF-ţĚ ć!.JbA6¤(:âA cń=!˙9¤Eîž5ţ 6ź>2äE~¤é™ŁDfŁëť‚$Jbž=Ö"DNd  Ŕ>¦¤LZŢ?–˘ě=€H ô@ xäLţdŕäСíĺCčĂ>\€PP6%áŐd š"lř¤SfĺtĹ`a„€ ŔW€@XYšĺX–ĺY¦e[˛ĺZŞ%ZÂĺ\ĘĄ[Ć÷ĺ[ŞĄěĄ8€x_ňĺXÖe^&^&a"ć]&&c.¦cŇĺcÚ%dN¦dV¦a6&e^fdjff*fgb¦ezfh‚&gŽćfŠćYŇĄ0ŔF„L Ŕć Ä&mΦmÖ&nަnć&oî¦oö&pNÜmŇ@pço§q&'r.§r6's>§sF'tN§tV'u^§uƦnÎfŃ ĆŇqÝŰ1ťx†'yާy–'zž§z¦'{ž'z¶'|®§|Ć'}Χ}Ö'~ާ~ć'î§ö'€ţ§€(׍g×i%‚&¨‚.(6¨>(„F¨„N(…V¨…^(†fhS;fox1.6-1.6.57/doc/art/line.gif000077500000000000000000000014371326741342000156160ustar00rootroot00000000000000GIF89a÷BBB˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙,;fox1.6-1.6.57/doc/art/mouse.gif000066400000000000000000000010271326741342000160070ustar00rootroot00000000000000GIF89aXł333˙˙˙’’’ÉÉÉńńń………\\\AAA­­­iiiNNNäääÖÖÖ»»»   www!ů,X˙ČI«˝8ëÍ»˙`(†F!ś…1®¬¨ D Ďá(+-Oz@ő<ÝčŕčŃβ4›?KÁ R“Ň`ĆH‚ Á°<–Ž ±#‘1lk¸Ź0H‹Îěä͡@t2]rfQbN„†! 2~€Ofyy 2'*‹l–•§ue©oq|V® 1Ť-¸ ŚhF ^ŹÁąĹ2 ol ĽY2_Fe†@"E„»2Č52#`”‰#[›ŕ\ﱤËćč×-ëF4ßú”ŘËv莺ě$đc䩡<[nUw*ťE öÍř÷j–hĺÄRĆHÄÂ`ÝN8`+ŘoőFâ+h0D¦ Đ Á>‚…óh¬(hWƢA@ÄIŤJŐ ¤„0h .g:(sf‚]EóŇhM-$XË)FTЍHĘ[“Ś´|ŤÂPgŐ˝Cs™”ÄŽ5 ŇxĹöď߲Ś9„CřpB‚785ě¸ă¸.ŕIž;$ž± §ijΰDJçŔŻA`í71ľ#ë¦3–¬  É(-ŕöÔăČ“+_ÎüB;fox1.6-1.6.57/doc/art/nerd_inside.gif000066400000000000000000000064541326741342000171530ustar00rootroot00000000000000GIF89aPJ÷˙˙˙˝˝˝ĆĆĆÎÎÎÖÖÖŢŢŢçççďďď÷÷÷ďçç÷ďď˙÷÷ÎĆĆÖÎÎŢÖÖçŢŢçŢÖŢÖÎÎĆ˝˙÷ç÷ďŢďďç÷÷ď˙˙÷ÎÎĆÖÖÎŢŢÖççŢĆĆ˝÷÷çççÖďďŢÖÖĆď÷÷÷˙˙˝ĆĆŢçď˝ĆÎçď÷ď÷˙ÖŢçµ˝ĆŢç÷˝ĆÖçď˙ĆÎŢÖŢďÎÖ絽έµĆµĆďś­Ö”ĄÎŚśĆ˝ĆŢś­Ţ”ĄÖÖŢ÷ÎÖďĆÎçµ˝Ö­µÎĄ­Ć­˝ďĄµçŚśÎś­ç„”Ć”ĄŢ{ŚĆsŚŢk„Ö˝Ć眥ƥµďŚśÖ„”ΔĄç{ŚÎc{Îk„Ţc{ÖZsÎÎÖ÷ĆÎﵽޭµÖĄ­Î˝ĆΌśŢ„”Ö{ŚÖs„ÎZsÖRkÎRkÖJcÎĆÎ÷µ˝ç­µŢĄ­Ö”śĆŚśç„”Ţ{ŚŢs„Ök{Îs„ŢJcÖBZÎBZÖ9RÎ9RÖµ˝ď­µçĄ­ŢśĄÖ”śÎŚ”ĆśĄŢk{ÖcsÎk{ŢcsÖZkÎZkÖRcέµďĄ­ç”śÖŚ”ÎśĄç„ŚĆ{„ĆRcÖJZÎJZÖBRΔśŢڔքŚÎ”śçŚ”Ţ„ŚÖŚ”ç{„΄ŚŢs{Îççďďď÷÷÷˙ĆĆÎÎÎÖÖÖŢŢŢç˝˝Ćçç÷ďď˙ÎÎŢÖÖçŢŢďĆĆÖµµĆ˝˝Îçç˙ŢŢ÷ÖÖď˝˝ÖµµÎ­­ĆÖÖ÷ÎÎス޵µÖ­­ÎĄĄĆÎÎ÷ĆĆď,PJ˙H° Á*\ȰˇĂ‡#JśH±˘Ĺ‹3jÜȱŁÁKťVQ‘óc@(’CeJ§K7˛ čQ?‡Â răFE@ńDć(išČ™â)fDrŘâ94ŚŐ«XłZĄę& 4Mť*4%dOžZÓŞMË3‡X„XŘ„A»¶®]«nߤb„.ÖDoŢt˝ú§pa¬ß$Z;EŻ@*PünuóGO—!f’ř1jTŠťc¨‚e¦Ć.kú„ śµńŰŹ$óüłfPŠ4h(đ`ďß hpa 8ů(”zµDbŢbá3xk5YJŘpŔEŔ˙pA58xĐA'XCô„ˇ"V‹ß®ŤHi¨ža§=|śÁÂ6ěäF|,Jd€Á¬°S'iTGY#¨l`ÁCTÁBXpV<ˇ+0¸@L§x1XWNRÁŠm0â\st`FuWu•†kéŕÇ‹}¸2ăD$q Â#‰41ŢFTüŃUWKhB#’J"rH8Řbly!ËF;X9W¨lhŃ°č† ¨b†$Ş)¦OMdtĘWŞˇÉ© áAšÜ1——P\rËÉ÷ĆžhL9Q%.Î%ČépH{\"†Ą<ćÇVy„Ŕŕ >8˙ńŤ$˛–D–¨ń"e¸Ůe”(Ä\`¬â‚šsía€Łt±Z­"Ht#Ď…Aˇm`Q$nˇë´n°‘Đ ë´nŐgDŐJCX„|k"oµĹüŃ•h,t€ł(J"}‘@ť70d nŔ*x î]|Q‡“nŘ!€nĽłp`‰|Üz2<-"Žü`©@–äŃ•ŔČúľa-8°†^ @%;t°IüŃŁč†ŕíP±T4E ă‘áĆ]°„ýś(T Ŕz¸‘†üĐÁÔ@«|Ü˙|Đş‚a ÜxÎ\An’‰_Ŕ1‡ÚMp&L?r€s™ětʔЊ]€ĘN´’ű^F'š(Ś{a §n9ćH籕0@ RĎĄ{B‹ĂEŞłnŐVµ± V1¤X Q!`°đć6Ta}ŘIĐ&Ó`§’ ől ‘9UiS 6čó6aĚľăť qk <\W¸í$"¨©ď—c@u5zŔ€"*ł«őź“°ŕŞŔ`Č> ¨W.áýP‰—ŘÄ’†Oś9‹č"&6a $ ˝]Öxňí!rŕ‡sí±“mWĚ%DłW*1®ZJP ŘĄŔĂĹT!7ŕÉňś†8ąK!—˙K6*Fä†>mr1~XÄ•VýZU‰<Čć2tŔ[™1BR~ Tř bT+@ ő…AĚ…Ü’¨b솏xDI˘÷ âîńŔlŕaż‹D¨" D¸ąC^úś÷N$}+Ű—Ş^Ŕ  YŮ @(T5€hĺA:Dt…+ˇAí á"ÜŘŁI¸,“đÁŁs Čd ââ -đÜČ›·zĘ€ľ•(Ľ J»äx€XFär ÎVázŠTb(™xŽ;" ¤Q\tĄ?Đ!ôé7Đ ®ą´†ÔČ%Vq†ąÄ´6üEĚŞ˛Y‘¨ hĂ˙ˇ*Â,8‚<·Î@áĽĹ€]͇2Ř@)(ř ¦Ăö0żěD<Pq00łbIr×~ŔhĐ@ XX € g|p’e}°%Ná(Ôt} 'Ya =ÁT!ٲ'n ($€bń{ŔŁŔk€±{wˇh Ž. I€'«Ń.;Č/DQ0P  }ŽÁXÍRĘqk B‰‘…YhRŕI@ P@…ËÂ*Đű4 ¤1†€kđ†] …P° gĹČG†Ä*‘wĐë±py¨‡ń«Ňz­ç‰¨’8‰”X‰–x‰—;fox1.6-1.6.57/doc/art/oll.gif000066400000000000000000000001071326741342000154430ustar00rootroot00000000000000GIF87aÂUŞb‰°…ŁÂľÎß˙˙˙yšĽßçďUŞ,şĽâ©!)’ÇĆ‹ç ‚“;fox1.6-1.6.57/doc/art/olr.gif000066400000000000000000000001061326741342000154500ustar00rootroot00000000000000GIF87aÂUŞb‰°…ŁÂľÎß˙˙˙yšĽßçď˙˙˙,şÜŃJ@0`!ÎŕU4Â@ŚD;fox1.6-1.6.57/doc/art/opengl_logo.png000066400000000000000000000031711326741342000172040ustar00rootroot00000000000000‰PNG  IHDRD ëŻZPLTE˙˙˙˙˙÷˙÷÷÷˙˙÷÷˙÷÷÷÷÷ď÷ďďď÷÷ďďďďďçďçççď÷çďďççççŢŢŢçďŢŢŢŢÖÖÖÖŢÖÖÖÖÎÖÖÎÎÎŢçÎÎÎÎĆĆĆÖçĆĆĆĆ˝˝˝Öç˝ÖŢ˝ÎŢ˝ĆÖ˝˝˝˝µ˝˝µµµÎ޵µ˝µµµµ­­­ĆÖ­­­­Ą­Ą˝ÖĄ˝ÎĄĄĄĄśĄĄśśś˝Öś˝Îś­˝śśśś”śś”””µÎ””ś””””Ś””ŚŚŚµÎŚ­ĆŚĄµŚŚ”ŚŚŚŚ„ŚŚ„„„­Ć„„Ś„„„„{„„{{{ĄĆ{Ą˝{{„{{{{s{sĄ˝sś˝ss{ssskĄ˝kś˝kśµkŚśc”µcŚĄcksckkZ”µZ”­ZŚ­ZŚĄZckRŚ­RŚĄR„ĄRckJŚ­J„ĄJ„śJZcB„ĄB{śBZkBRZBJR9{ś9{”9s”1{ś1{”1s”1sŚ1kŚ1Jc1JZ1JR1BJ)s”)kŚ)k„)cŚ)c„)JZ)BR)9J)9B!kŚ!k„!c„!c{!Z{!Jc!JZ!9J!9Bc„Z{ZsBR1Bc„Z{ZsRk)1Z{ZsRsRkJc9R1B)1!1!)ZsRsRkJkJcBcBZBR9Z9R9J1J1B)B)9)1!1!)!![©FtEXtSoftwaregif2png 2.0.1=^ľh˙IDATxśĹUŹWG‘ĂęÉajŹjŁm°4Ą=PÚJ«Ą¤BŶPÓ6=»wmÍ®g)9mő¨rj ¶ÚBÂŃ żú'vH R}Ď÷úÝË›™Ýąo&3ł{› e úµz¨±TY€ ?€ÇRtřxňN•¦żÜ»8Š”˛ś·¤6Ž®k÷ÔĂkRUÂËÉ”v‡F/|dl¸Ő.Îe‚La¨-¸±„†óvż<ÇY’ÉrĹ {Őšf]KFŐ·!QwĽ> =yĽ]îŻÂŢžřY;YúÓJ8D^łdM0Ď]Ţ57ß]µc:ŰÁva’úMô{Ox}­iĺ•B‡a “¨ĚnY{ór 8”¬Q®Ź˝Oĺô™¶·Ŕ. nA˘¸ÚŁ™¬KšhĤňZ@ü@u¶§ęćA¨^ ,çH9"ŁoLîĎĐ~0p€›-Ú=7JFHBXUç:řçţĂ/Ő`,#„˘¸w[‡BŘHw·ř<žZ˙wF¤Ř#Ĺ©NWŢćľ,ś^ _ܲTÖKí@Îü6Jô— oňŘ—ęHNÎKD3ě§Üű‡vAč<” 1ú;u\ţ°Č1Ý ăě¨ď°§Ožđ|m_Ť7AśZŽ…ŕŃQĘ‚ŹŃuĄ]li‡•° vé9— ĆŠÔ«uŮRĂ—¸đD­«ô°Í »¦îëŮq01’ÎŰÁä`yŕčóÝKűM‘ĺůžVNý´Ä˝a2C—śEµc|@돭ú«1cÄW\]ŠRgăťżÓéĚívß˙;,[QzäÔ@X˘©#)r哞†Šç{}_(‚dŚ …Ošł¦93תŮő, ŻFhtkÉ…ľöF·ť+ŰťKŤĺťŢŕ_j¤ü?(®Đ(Ăě»ő•O˝YáçâĆĺqćŞ$ă¦O-ÝË$ĆŢxš›ĂOß×u: ‡•E{Áć9zB¦Ź­ú­[j/šç¶ĺM-7óLąav±%ă*ŘĄăS5}R\żé^Žű°ůÓÝřĽ­"ůđ.I3(ńđöÄŚaŠ i n–Vă"ÚëDŐµ ë$m_Ęâűµ•Hź_Đ›ĆEB+6( ç?˙x©čk5®ZWĆăËĐâi>qcTĎ‹i'ÇÎëŘgWFÓäău?Ú4}°?ôŢäff[@řł_nśnuífĚÎľ/Z},ęűŞĹĎyZXŕEš÷}Ř-ÖŮO:Á×ÔÜÔÔÔĽ5~AC’$!E Q˶P°˝©áźĆťZlˇDř=S0Áަ’p¨Á±1/Ą çI<éônß´B°NďČ‚™W ZL'Ě…‘ö űŮ6sq/ nŹÇë9Vĺäąťżä/˙—Q. žĐ-IEND®B`‚fox1.6-1.6.57/doc/art/oul.gif000066400000000000000000000001071326741342000154540ustar00rootroot00000000000000GIF87aÂ˙˙˙ľÎß…ŁÂb‰°UŞßçďyšĽUŞ, !CŞBayÎL§ÂG`â—;fox1.6-1.6.57/doc/art/oul_grey.gif000066400000000000000000000015001326741342000165000ustar00rootroot00000000000000GIF89a÷ÎÎÎÖÖÖŢŢŢççç÷÷÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙,% ,@@@ X(pŔÁ… @„XŕáD‰ȸĐâÄ€;fox1.6-1.6.57/doc/art/our.gif000066400000000000000000000015061326741342000154660ustar00rootroot00000000000000GIF89a÷ś1ĄBĄJĄJ!­R)­Z)­Z1µkJĆ„cĆŚkÖĄŚÖĄ”çƵ÷ďç˙÷÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙,+0 ŔÁH`đA„|p‡h@±˘‚Ž €p ;fox1.6-1.6.57/doc/art/progress.png000066400000000000000000000003771326741342000165510ustar00rootroot00000000000000‰PNG  IHDR«†Î˘$PLTEřhph¸Ľ¸řüřô÷ÁtEXtSoftwaregif2png 2.0.1=^ľh‰IDATxśí•Á Ŕ0E=tÁJévÁýgŞ&äţ -ôă1<~ ŇU‘FGE픟ͱŚE Ďýc°ĆĘ“ŠSaźT¬N,¦Ç ëwʶŞE±:±˘\ŰĎv,+b`˝­¦cC„«M•ůŇç} ¶`•9ö\h§QAY߼żM‹F’đIEND®B`‚fox1.6-1.6.57/doc/art/scribble.png000066400000000000000000000024511326741342000164650ustar00rootroot00000000000000‰PNG  IHDRÔDözI!PLTE€PPP```hph€€€¸Ľ¸ŔŔŔŕŕŕřřüř0ô˛ńtEXtSoftwaregif2png 2.0.1=^ľhˇIDATxśíÝ˝ÎÓ<đłĐHl ,Ś\7Ŕ€ŘŃ»f@ž©€PWŔ-8z‘Ň«ÄÇ_µŰqŇ´ ˙Ô¤ib˙zü‘ÖO%輟řI[ ĽxEçÓn\“‹ýaľ~ĐńßíëűöCGbÇbô‰_˝%2;džřA9ٶPr»Çćr´Ł7ź;óéÇóĆÖh+?Eň_gbHF“ĆĽxúô‰‡‘ŐŇ‘â÷MúąŚćx˛GäF&OÓ»*‹Ë0Äďí‚1ťĆ6SŁrĎç2GVFş-ÔQwD‹‹ŁŞy>]aTáĚwukřß–FŞjr)0îé4zbTÚłý.éäU­:5?†˘50|eĂ}f„Q/ŃI÷%‡ń›é6™Ń®áő…÷şSě3d†ÉéŤ&… G“Ű­Ćȶ¦Ť¦¨Ď”‚ćÎ,YLnžą'ĆTťź?ó̶ÎśJÚňJŞ1/u$vvřâËë]„ÁĽ]3Ţwݢë~Ě»nĹxčşEĺ 0Ŕ 0ŹC”Ľ‚2Ç“{2uíaş<¦=ř×{%MQŚADĚuy _!ß)ńnK}\“O$˙%ób¸ â ti…"ŠvČÓŁv5PĄŮ<ĄdţFµ5ĄŠ(g¦sç«]u ©wÓUbHSĆ$<]ÄT39 q>mŽ˝WfeĆ%7UÄt3qAş,Ţš’Ú—łeDĹŃD!&]Ňtźiůxv{ k,FŚ0ś¸Â¤ł:FŢ~¬ÁV붢îŚ\ëÄťC¨]g¸fÜU×/Ćß$~?QÄ4ćbÓqsw*0ꦲ®`Čü©#o‘B#1n& ęŐ)W`f5›z˙Ťß‡äDčÝÁ˘Y±ŚQ‹3‡ůóŕľ 1—©_=™ó3ž™ ňşh&1Ë2dÉÔ&ζ[[ĚpAÖaLź‰4ł0^‚RË„SĆč ©ß<]ŃL^Š„Ă g÷ĹĄ“Źe_âxěłm0§¨Ăä—‹–ŁćÓş‹Y;3~Í˝v ˙›ÄÝ1>*ľUn…lSíăv€ŃĄf[ĚÜP·^,AnĚí‹Ę`ć0Ŕ 0Ŕ 0Ŕ 0Ŕ 0Ŕ 0Ŕ 0Ŕ 0Ŕ 0Ŕ 0 1k0Ŕ 030×ßüčşE—YĚÖ˙‰‰ŤŮM“‹ťa~mÝq/ńęˇ L];IEND®B`‚fox1.6-1.6.57/doc/art/sgitextedit.png000066400000000000000000002703451326741342000172460ustar00rootroot00000000000000‰PNG  IHDRýţGNšPLTE# Q¦¤„2¬AED’‚tôŇ|D"gôŞ FX‰eiI0j„‚„¤¦¤ŻcÄŚÂÄ×ĹŘčěf5r¬†„ZDv†d–Ş„µÔĹŔdbd¤2#VaCŚä†„„DžÄ¬Ś“sšK0´“ą\*i˛K´Ĺ¤Č†TštD’f3–K;v+bFŤăÔ­ŐÖÓpSŽ´…ĽŠS˛žc¦h;—W3n¬t´:$iĹ˛Šźtź5gxD«¦”‰I'‹±tĆĺÎ’„uk´¶´Čł¸ą”ËäňôĽuΧ®ĚŁtąÜÄËěӽ侔tFX,<‚Ç´§F(oďăÇ©„Ǹ„ĘíŐ’–T·8•U›t6”śe»J0{”d·T(”ďäׄ†äN´Z;“uKŻ|ĂÖĂ®u=W2€”“”…E˛x[0$€|dvˇ|¦Ô´·»śÍ¸ŚÉllY1•´ť‚íÔ­4R¶ŁŤi;iŹlť_źÍ»§T*ui4ĄW=xÜŢÜ«ˇLNLŞ‹¶Ć›¤ßÍĂ–\¸])™ŠXZ‰e‰ţü|‚„ţüz<¤¦L˛´üţŔÔěܲtĉÔzś†ĽÄ¤§ôöô›…¤4L79‚y2i¬lÁTnlǬĆöëÇrCtĚÎă‹}…Ä´Ô¶”ˇ¶¦ťćÍ®‘QL`LŠŃĽŚîîénklTźl%Ş‘{—µ›ą,c{KŞíÜČŰĚ®śžŚÖ˝Á®‹›ln„LR|w3®”lŚĽ«Ă|T“ü幼lÎÔ®ĽdEx”^„…liL †\źm¦¬›ŹĽľĽôÜ–]źT^šś‹v=©j;¬}ŻD zäâä<$Y<$€a%§DW„|V||Jt>ĽĚÎĚ´ŚşŚ[˛;+h‹}qĚĽ¶ľ|ŃŁ|¸«ŚÉ: lą‡M±îÚ±Ľ«ŚŚk‡ÄťÎ*Qš|‚Ŭ§üţüµť–Ľ¬ˇ”cť9WZĎtEXtSoftwaregif2png 2.0.1=^ľh IDATxśě} tUŐ™żëţYÓp řH˛âŚ„Vy„ HŚ‚ÄhBfĘ•T”p’UŔu0ůGPGČäâ°Čr-fJťv:`*ˇŘńU,™ť^ą\…vZ×±9Á–‚áĐŠ ţ÷{{ź}î ”{nsöŮgűîsöďüľďŰŹK΄LČ„L¸Ă%é.@&dB&dBZBý2!2áâ ôË„LČ„‹3dĐ/2!.ÎAżLŔÁĘ„LŔ!Ý7˘Ż!~™€ĺ$ ü„‡3á«ň“\Č@ý2áâ ýŢ/ŇhĎĽľ/?Ć\¬č—ˇÖu°ęQÓđův˘Ł™đU ůů¶“đřĹŐ<%úŐ;Cüx§°z‡ÔŐ_©«›dÁJŘ*bů ŰL&|eB~§XţEËý†řCľSX˝ő¶“ŇW~ŠówňSW7É‚…ŻM~ćőżűCׇ݀ŔßĹŠ~ţ<ÝSY˝‰Iýź_tl3I­€ÔŐM˛`9ćá~yĹg^_­—AĂ'wb/÷KqÓć <…Ő»=µ¶©d6“ uu“,XőűĹ|łţfB ôńwѢi1öću“Qü€y»Oď@,ŐÜ/?U=ß )şşI¬!v Žn~_ú]dBmŽf¦ŹôŁźź~Q…űĹ$‰¶ąeĹŤŰZ"ct<µÜŻ~qN¦"PÜ#đšJ©«›dßüĆvŔÉtxůJ˝č~Ňălň˘[üŰ{„űĹÓÎý,ë‘ô G=Ű4x‹\‹{`9â‹)ĄÖčúĹňť…§ .ě.XŘ˝¶{aAww÷ڂh'§}ˇÝě´…tç|cmN÷Úś‚”¤»…îîÓ .D§.\Ť> ;ž>]pútÇé|S3ŰI­€gRW7É5|ä{Y» 3ˇźo˝—ő_y;íÜaß#iB?V-q†x ۰ú‹Łč/Ť•Űhź &"*3ÍľČUI=÷[XP°đtG‚(„9Y ,W٧O#ĽĘF ”óŤ…ÝÝ١µÝˇµ9(¬][<2mŻ ­EďĐéÓ—ttt\ŇŤ˛čč8˝pÚî¸äôé|ÉýúaĽJ‰€ÔŐM˛@úűĺǨő§ďŤ&úgđ9 ‹ŞĹsľ|ţřKß-H±/]čL/.úŽŕ-đ ¶­Ą‰Ügžj»_<ß)XŘqš*DµN[WˇmSݡ‚P‚ĄîlB9ˇPNhí70­];˛řň––ßě»˙7űŠsr¬…ŁFu,ěF§a^‡¸Ů%čMąß˘ů.D|-ERW7ɶűqî§?¶âĽŃbd/Fxq¸«ň8ŕ™eFŁ}8/ó݇or˝ôřökÄO RGô´| )Ŕiőů2ěSĐ/Ő6@ťűAŁ^DP=đÁźX@€;¨GN ŔŹ|ö¤śű ZU@8Ůé‚îÓ§»16-Ě.ČFČ”‰ŘX(§xQqKNÎorZrZŠ×ý©µuŇ Ď>»gĎžőë×˙2”ťť4ŇÓÝ ł±bş°QµK,ŔýR) uu“,»ź‘űĹđ_WŤžfŹ„‡<ń;,.Lys?r}I]ÇŮ×|ţî4r?,S`@żÔŰîÇîďŚXän¤Odzoâ_Čě"ü"ś?(¤Ócô… 0IqőRłÜÚÓD)Ĺč´¶2ł‚ěžEµµ9órrZfç´´\Ţň›'‡m]˙ě®]Si‡ŃWz-ę^¸°ˇÓ(ŚPĄ.9Ý1ęJÍśT H]Ý$ äćŹ1»_öÜŹŢř›\hééýx$R2ó>#ó}®ßŤä´¸ýĹhźUD÷$'Aµ#¬?=>_Śqűúá¸T— źÍďu^'âKťňćäüŇ7á„1đopäĎž÷÷Ë·‹‰VŠuSDŇbŚ … rrÖfç”ď3ç®+VV<;5lGQ;ZďÔ×;·8vô–[n ŹŢą3Ż+َµśN/ěFjG)VTGj¶Ô!vżś…TŔ . ív?ěóuű«Ř8_Hâ­@ĽC @Í·ś(żâ»yŘAvOČă3á<im ą_<Ŕř ˝¤„űĺóÇźß÷ńs<ňŽ~}D?VAZ…śőEŘM‘čçHSŕó>qç6oA"RßßĎÉîŐ˝6»SNIOÇéWN/*é)É)ľ|Ýş?m™ZĽĄŢŽ>÷Üöúúúçn©ŻGôńčŃŁ \Ú9:Ľsçŕâî…Łş»±ObaIÇ%— lZUÔ|ҕбăT@6đJAč‚ H/÷ł©âcË›X-ň‘Př0|€ŹE,#€ĄF+Iű1»iä#HK5ޤŁÚý€…H@â~%%V@ęę&Y ŠO ß}şpmŇ4Âoö‹GÝfwŽ%Ő‚€ö ” =qV1‰1…Ť Íl÷u›š*Đő˘ÔŽ^Ŕ@¦[°yâĆŚÚĄíżÝĎ„}Ź=ŘOôŁ•Hlu®Î’şău—zNDUŤÉAQŃ&µ…kM©ç~=%ݡ’µ »0•”„zJzzjkŻĽ+ţĹ®`uý-v4®Ź®F„€)D¨´óŚJÓʧMűâ‹w焲łKş»K––,\]2jTwv÷+ ˇÝŻgŰŤ2/)ÁđwÁ¤ý$÷Ó.źą_Ź“Örác˛‹”Śe8:„ŔG®ă"íéqß? ™í>oă@\ĘűhísöÇí~ˇŹ±[iá~Fô“|0őeŃě~1­™ M>ń€HQ’3‘#đçëëîÔŰýjs:h*@ČTŰ]R[Üre|Ŕę®ĎG߀ÔĎ<ô>ŠhŘŃŹ"_đáŤéčďg?—ű#…ÁŕómŕUEßÔ轊÷„ţéOÄ ·ěÁ©vŚ:|…ý!•Ő;„ ßľÚZ„MĄűKK”XT[Ňsů1OpäČ€w~!Ă6„HńIń®ö×^{-˙wż˙á·~řłĆüë–śâý%Ů%ĄHµöţl¤ç†–î‡ČĺľÚś»CD@ÉP¨¶§› 0eŔŕÁç/ 횯C:9†€Ą‡ç¬Ą‰&Ĺ­ ąqบ$ĆN2Ŕ”Ö•#łťt[‚Ýôťű fîżÝĎ}iD?Ö ¤ĹäŹř…T@@yT‰fpJ}ľÔ,7˘.ęíÝ?Ł ý„ĘjŤčBPt‘ż)ś& Ň>eŐ”ß˙ˇŇ·$Ń7ţ ż~gNN¨8;»$»±»ŇŇ…ĄŁ˝RĘĚr´CáEXŔe‹J°€Ú۱L.‰€GV9wi÷ůŘŰČ­żŔb ˇ€/XZ{ŮWŽ Šř hyZ—<ŻAŞĘ27Kř$á>K3Ű ·wĂqŮ’ć1ÖwČv?Çzx`źĎŕ§ŰýÔęućEž†Ýˇµ’ÄVzäŤěĂXŹá9Ą‹jďŢ?ŁKYm¨p|×ę.‚Mś&Mšň-Cř!űýlÚŕśËC9ˇŇŇěŇQ3JKgd—Ś*=]ŠŘä~ĂCw/Ztw)Đ‹”ŐG`×źŻ€Wú÷‹ąfydWTö“Ú¨z‹PĘĎŘ8›(Áaby2áŤ1a.QłŐ Ël'Ú¦ő•ĎZ3·Nń­uśűqU´űů9żźřĄýX}pÁ6MłŤ(ż°ź’, G‰Xúűí ő”e—ě/Ýß[t`ŞyŚ™ń'¶^?xdń7˛C36aoâeŮ%ĄŻ„Jĺ/X@Nɢ’’ý˝űÄš±€#ź!˙ŕŻIds©«›dú|egÖl0÷‹Ŕ‡ ±äĆZáNŕFFvĹŁşq„ ó¬h@f‰(4J“sf›Ö ć6ΗĄ펵>ß7UYĽżźŹc=,ęG|¤6(č—ßH&ľŢȦżŢŤňd?B&Ŧ)đšŠŰČcĐ9ë@ÝăŰä;µÜ/NĽˇP¨6T¶ż$´Słf ~Ž<1…ÓcŢŕ4mđoŠsJK˛K÷—öp* ˝RÚ‹H$ˇf»©a ( ĺ”…ö—,Ú* q„\v%A?ŁŐĄý€ű9Ňî ÄUľŕ~ °=ÉăÂ,ÂT`‡1€™cň$¦PÇ1óʏŮĎm4ć!ýDľŠŰ´Š%şÉ=>Î7¦ą^§f?Tö05Ű·/4ŞhoiY]ďŚPoďÝč}IoiÎď7/„Ü 8p ¤ŚčÂšďą 8€ÜÝ;Ş·4ý=^ę•9^ š‹7ňµ±0jˇXŠ%Djć`-‹řĄY°i9˘Ä_ÜAÖ\LőMEŔ“…÷÷kPŽĆŘXŹ€†bśoZě~ćnľăúQ—ěřŇwC…eeµEˇÚ˛ÂPóBÍpÂÔěn9űÝď~‡ÁéŞÁcć5—!Ô«+šŃűJB'ĘzËBŚűarĆ×b…şlQYíţÚV­çSî7ĺ°ˇ˝oĘ^.zńS”}QiŃÝ\@ęę&YŕFoŰČĆŕ8_yČŐŹ›…c†X¸Ń8F U1WЇnĐk©/Ęí+Z—Żů|eZ|łŞW¦ŹűĄüúťÝÜǰ=yÜv-f;{ˇjîçĽ?ďA'Śwb»Q}:}rU׆Ő:.ýŽFÍ>ącĚĄÍűGěźQ4!Ó2„MóĐVŮ"čó}^ Ęş (CĚŢ@ S¦ÜűöU@/°¨—púÝo]X©-—lŻC˙šŘmclŹZ„|ŹŮ…c0Ű‹™ĺ7Ć÷xľëxî,˝fV¬Ć뤕9ĎżX·K;ů¬#6yĺŞÄ6Úâ¬H‰ë0ßů0K~€Xú}îď×ďĐŻŻŕ'ŔM8(şŁRíóµG4hnžWV´¨ě@YŮěÂÂ+'apÂ.Ů{Żďj8 ‰Ă’PO5Ű·oYŃuű‹ĘzëĘęŔ!%u^ÍńBűűaÍčHŮZ,`<đÁ×ű®oč˘îN, ą¨lŃţP@şGşňÉÍ`ĆÚÝš ×˝–6ç.u[|×éiÄAެ‹a/›r&ŕ¤FxŠëĄ§¸Ż-Ůńw¬‡Ő/ŔOá~¶C^b•1˘Žü¦ŃdU<ň‹ß2ÚçĂ|~IÜJôŁ>ßáś:€ć@oasaٕ͜¨áď“ë5»ű÷ż˙ýď~˙;Ĺ!A©Ůŕ+ŻtÚŁz1+›w ¨¬tFoŮţ^Ćý[ĺ»D@ďޢ޲f„®\Ŕ Ż]”\&đĐ~M@YoÚí~¤dÖó˝xăôévëoč·y3D2ŽeŽÍżť(@7ž‚'v$\Ę(KśRôŁfąć˛ć—Ë^:´»Ć»fŠÓŐ™~÷-s@Šéíß_W6cFmYQ٢ŢŇŢĄ3 Ü_†ąßR:Î×FŠ0ó«Ĺ ďnFVÓ>/÷]?Ă+‚>OoăUĂëz [ŔoôK+ř)čWŻ"–D.'HŹ:€ěab¨ŕśĂ9źűťZîGBt¬ąąˇ_oYáĽÂ…Íql÷ű Ł'c ~Š)źüőđ+‡×-š‡r(Eܬ)Ą‹ö÷.Z4ú|›ŃŃf˘˛be…ł'uŃ>/DŔęÄÄęćÎ^Ô‹0Ź 8°hQqÚą_ý<ż_~ßÍ#ť1Ú™rÜĚúXŃÉJζÓĐĎżőĚMÜObĆ9ňˇoŰ–»6ݲَÍčˇ$†*ň±´©ĺ~Ä,×\X×\‡ß˘—‘nYHÁ‰¨ľĽÁ©˛˛’rż1óęę­CZó+E›őľ‚ß3JšůÜÎýĘšB¨‡Ô(,›ŤÉĺjl÷ŰđIt"ózqÖĄű~Îxĺ€ĐćvFč‡- đkď(Ź8‡}$`žÄ÷ÁQÇŁË€™EšÉŲ-j]Ö'˛žőʵĺý:ÉlťňéńůŔĎ?ěÓě~QQ'ţlI ˛ĂAQqAeŹÓC˛d ×H±ÝŹpż˘ćEeEE3ęš‹¸kľ°×wĘ$„~]:«$FLůäŽ9e·77w?Ŕ˛E˝Łp‡—˛ý#Ę Ď·ąě!!ŕîÂ2"`ub—XŔęÄ®şcxÝí5ß^„,ŢŹŻ h.K;÷Łc=ú 4˙B>Ż…ÍÁi&LpŞŁF*ÔŰôbŘöŞF8çŞć'ôKÇ8_úů‰}*÷µÎ˙Łżt#čĐs8÷“čÓ( ĹGŃFmÉŞN)úQĹôCÄűęî.Báĺ"Äý8Q·˘f«»@W<K4lýdđś}5oDsď•eu‹G”őľňJŮĽćýu#Ýow>íPř!vŐE/s«©Mµ6¸c P‚ŚXŚŚ*kF/J;÷Ł‹Úä €đx;ú]áxqiĹŽÍźŠ<98¬ď¨'‹¦„íÝuTäzql«Ô"ţâ‰GÁ*Ő®‹VíÚu%ÜĎ˙qľ®>/ޤhľáH ~ yüšŕ=ě˛Ů=dw«@B‡7™¬j^Ď#łä­ëĎwqY]sá KEuE……euý¬fÔě±oUt\˘ŕ´mçđńăëš›ËFÔ=´¸®lƲşş˘ŰG”Ő!jçÜoqa]aጢº˘şu…ue…ńI ^»¨€ÇľuwĄ řHx‘K  ¨··Ž H?÷Łkşî›lk˘Ar\”Oµ¨v”´ ‰*{Žz˛hę*űwžŠZŞ˙ŐŰ0ZÔ)Ă?5J\3^uđ"‰kŕ`R˘$*–±VZ±ĎÍýř3Ĺę° Î±j‡¶(’r”ÁO$ŻĐ|łŤH-÷ŁfąÂşf¤–Ö!â‡Č"‚Ű0ú]†ĐoŔő˘qś) j¶÷żšzÁ]ÝCă*:P‡ťe#&6‹ţ~ü!č`!€e•–}.t­HŔŔOďxč!!  A¨ćqľ¶Ęý¤Ź‹#ť¶)Č)ÜŤWZíhtɱ9ĚÝŮ9ŕ&^7ŮŢ˙Wnż)Ž: RxMČ`Ő+5 Ż­žć`ôłŽßýý,7ö­š˛jŠ?EŔAőzČűC†?[ޱÜ zç€ó‚đž¶„Y#ł˛ZúńKőĂç[W·¸®îeDÉę0¸4×5łvK¬ţdF?ÚůnH?$ŻG=D¨ŮÎáŻ?ÔŚÎYĽ¸ąyqóű('ô;~|3čďçÔ~ŘüňËbz) p»źĐ°™€CŹ2˙{Śë€:$  X<;íÜ+> ÷.|zÝŘ…M ˝Ł4NołŽ˛Tů"E”·k‡Üg˛Ó(ŹäćüŠŇTö‚ŇÖÂ~éÍ* ôçmł†óňÂĺNŰ ĘŮf‚ťËNvéF”jj¬É¶„H›îgéŘ7e íţB×|ąw‚®4Ěńđ-J)ĺ ˘ë!Iżń˝‚6$ů‹Ú-nę‡Ňůŕó­+|żůâ—‘NIľę&­¦č7`ő˝ý”pčQ8÷ _9±®ůˇć‡&.~1ĄćĹł7OśŘÜ ×ő¨kżř!Dü¤€®Őţ°W—€ćşĹDŔűăÄB©«›dÝüLóUÚ“%Uö`t‡>a‹Swh×`Âsč-dSŽ5ĘĂ“ŢaŽĚ.H´””hŃ!QĘáĄ<˙mzëŁLE+řóó<ďmńĹ Ŕ!‡0őůb«1¬‚IťŰÔE[3ě«Áě~~ű|-ť÷ÉŕţiÜŹ×7{@S|Ł7<űŘůâËŘ˝YyѲÓ#/g$č!ăĎ÷Ęá‹› ë^Ćě¬q´şşˇ«WSŻ@?Âü#”O„#Űvľ} "b·Ýąřý8-ŢŃĽcńމď/~_rżuF«»PV“Ě)łüůŁ”ňIŐ řhńń·M|ť 8Ő|J H]Ý$ l=_ŐîÇń‰Ú:xŁâ L­r´ńJî'›&yPr{ 9ĚŔŹÚţh"fXL†—p·ńvë°ň€;O˘ŔůnS ¨|Aňü3¶UH8§_(ĺ°8•>J$÷ŁÁá6{vĘžĚí•ôSx ţÂÍýXmĐ[Ŕ!”ŽÜ í‚ě†% z…H¬ÎťÖs–Í;~eeń‘bôŁ>ß·F 6ŐüáCuÍŻľŚľ›ßF„©Ů‘. NŹadzˇÇĄ~K GCŕ”;îš?ľőýSË&~x'âd;tęÔť‹ÇÁő|‰€ĹLR|ë~ÂPô#*ďŁ?˙ůŁďţÜKŔ˛eŻźú X¤®n’Ŕý‚Jű˘´ŢfžąĂ(‚QĄ€]z»H^zG‰›‚ŞŽ ϧ‘;‹ `šŐ8h ˛F˸źháQ^@ôŐa1°FźY6–99E,+ŕ¶ŐA3u¨vŹRwP+ůt¸Ňű˛Íß|Üßr„t¤¨r‡@Pĺ˘ZxÚtp?ËĹű¦Đ/Š€Dż¨¸ń™ĄGÜŚÄÔGoG¦˙ŮýĎ›­c[třs˛čO ź¸F>ř|•šTËĹ…ł›ëę®ü°îCěŽXŤÉă~Źľ+řŘ)4áĐ0ř†m“¶…sÇí¸őÔoťx뇧ţřú­Żż~çëw.;őúD8·ó©áďO,ä&Ö=ô!Ď XŤí~ď>ú®§€ŃXŔwîĽőN.`"ţu=0úIČ÷@Űč@*żć lÚŽ†€Fz­qv:›â›T*x†@±šµŘ±Ůă–1Cdžľś‚–Éa¸Śáʦ‘¶ÓÁĘäŕż`Ń/›ţŤ[ ,a€Lż˘ěß!Šb“‚úą|ŰQĘg‹żÎËč†FüDŤs‹řóô’A>źŻĄđľ)~ó>4Í—Ők‡°}°ç$éôĚďQnřaĽ°QEnrćËŻőzĐc>ř|Żl>űĂÂŮłÇ#­ôďĘţîďţnĘO08M"Š©@Ĺ^Ľaôŕ_Ľ/ľmô–9·žZöî<őţ˛ďĽţÇ[o]6nÜ)ôŮ×őŢe::»Ő)ą¤5@δ,%Ś/¨Dµt¶´ă‚< đŹ?,Y˝âqÂ7–Žú|}\ÓŤOéŚwVĄA祎őž¶¨4•’ž/¶đű”ßÄż)¤Ť^ڬ(ĎŤą=ČA|ľŹ[Ľăýg/ţđĂĹ…Íóţëoľ†Ń ŹÄÝ ˘ž%öâŕľ}Ă _üüŐ~qß´đÉżşîÔÉ÷ŢůńÄ;?üΩq<9kÜGËľţŃ88Öcâl/^¸ x ¨ş XöÇ;˙ xň#$`ć˛qýb~?n÷ JÝ]ÎÎčł_e†ZĚŰŐas[iUQ@Ďf¬“Ť–0E¬Nž–”ŹkĽ´%2tí°×âfGŃ·@b3łk±{Ţ„ő6ÓXnqõÍa•*đśf9Ő¨#Ę"“G)lt0&%NU:ř /*Ěî<Ň8 îÚÜ ŕI¶]ěLĄâŰŞ™V(ą´ôôh¸ź•fއä~AŢ[cś(čŮŔçÁÝaŽ f´Rő IDAT}üá.'µűáíh–¤~ř|wĚŢ1ńΉ§î,lţđˇćžPIIńżbrFŔé3…š5Ľ8áŇ §^˛dÉ«÷Ćď›ö`řékŢ›µěšeł&N7kŮG§0řŤ«Ş™ ç÷CčÇÔ5÷ô””¶X¤š€nâPŔ̉UăfŤ[vjÖGÍdŇ=Ç Y ŚyţŃz u°Ů#ß Ü¬FéP5"9ÜŁ@BéĐÇůG=%.â¶n†Z *i 7ř‰ś„Čů™¨]šś ˝uĚČĺD9óac\%ŚĹ·ř(ńBˇ˘ÚěŕčŻ Ç"N TŹO_Ň0OiO˘Ě< ÔR8‚Ňňę %ÇÔ<¬´ÎĽ¶“»ź•nއÚŰ™=Fȓ٢OpËĎuö@äÖ`B đŃFTqŃFŠË–5R>Ž|đůžj95qÇ©ď†ćŐîď]Xş('ôS°z™ă™âbdßţźŃ7 .ß„iŇ˝ńĎ·Ý{ďUÓv˝ý“kľţÖÄ;O}´lٲq§NUÍšu˛ęé“U“!÷7O (-!ţ~ ¶ý čÚ°•q?&`0đÉ˝÷~2íčG?ąćÇăţj"đ0sÖĚŞ§ź®Şęvżç~¶hőQGâŐw[ –%žTąMJ"L1Ć5(…B ÍvDĆ6}¤ňcT Ń´ vđ'©>ÄÜ& ,ű%8\'Ζ>aRęÓ24ľ$Ř•eI¸Ëž§Ľ`Ą—Š\}IŹĆL9ć©V@7R „tж‹«µ^0|©˘@UCż{Úýĺ~§ź÷á ů|ĄEAFÄőP-¬ÜäʸđŞáłłDâ¬,™­>ßqß=5oÇřáµµ%=%=Ůk/íÉůŹ#źar†Ůٶë‘&úíÁŁńÉ’ůó'Ľ:)ż÷ómW]ŐU“®ľíŻţëÖ÷f}yç¬?Nś9󣓳–ÍZöôĚŞqUs—Áu=nŹŚ'Ö–„˛/Ĺřú†żIBŔN„¬Ű–|öÁ„%÷RW§–ÝůÇ™ł–ťśu+pJH]Ý$ ŔîÇ›Oa‰ hE-Jj˘1K»O˘Ü÷*gŕ7JF”ëş„ËQw«ĄX¸€Ű“ÁwĽ9¬–Ă=Ü.m3'˛Ă Ť6T`rh -Š«ÝĄúě†ń'| žSÎĺÜô$ĺO%ÉV!„;şTf ĄÖţ|ŕŞ˙3űůh÷#!˝ĽWŹoFdO(ŹŤ{ŞşĂ/·2ŇÍ/î‡}ľăNŤ>cS(*é© …Šçĺ|ăď ÷۰şëz¤^‹Ď˙lÂVwum¸÷ľMW!čŰöů¤ŹŢ˙î˝5óÎS·Ť›‰ić¸YU3gž¬šurîÜŞšă ÷Æ µˇâb*ŕłŐpźÍGş€mXŔ¦{ăă°€kď|ëÖqË0°r3€ÔŐM˛|ľ˘)QfěFĚ’Äýý‚gqţÇ]d6hŇ[‚w]ć>ˇPp cm¬­žV#ä]GˇH”Š ÎČ  Q<‹ŃQÁ-”ZÜÓcĹäJ#ű×ü9 ř“‹Ö©ž GôIěsGÁ0 Ś´u™(ů!ÍŤĘ-ÖÁŇfîö wVZŇE™î—~އiŽb!Ţ;q[đşbIDí3Ą\‘ µ÷ń čŁ>ß['Λ8»ůőż+««+Y«O†jsŠż6 kí“·ú‰ ŢčZŤ‘)~ď}ź|ňI|R×˙űŹ˙ří_MXrOgpŘ fťśŚÔQ¤™Î:yrzŐńăUUsŹĂ9^€ďBˇžPmčŇ7qŻ—IDŔDŔę LŔ}źS?şŽ¸q¬Ş*.e-ôîÇYÂń6ŹE8JĺíaŰň2ă<ńs”~šÁ‘€ć+†Ś‹/‚,Äý.)™üD9’°•Úp‚üŢVÁE-Ťl¶Ż’bß'Âś ,‚'K#Žr cŁdDRx2ý˙ZhĽî:ükiś…ŘoźoZú6»®ů*— ܫڛU|Đ× čpäă™ZZĺ]ěĎ÷;§vŚ›=ݰ¶.4˛¶'ÔÝťS’“ÝrŰ›HóEŕôÄď`Ę7iäűî»ď^<;Ë‘ż˙‹K˙ć·ż]}¦ł3úńčp^^ă–ŞYłŞN~t˛Şęřôą›Ş¦WAîwë[DŔĽ˛P1PŇ]+¬Ţ@ hÝ0i’"ŕůßţöł/€Cą'OŞjúÝű|72Żł1EůeĺÎÜŮ7Č#E‹d~^…dÇ4v›đ,0/sÝPőŘŚ/|Wj śů(…W†ŤMR %÷¸PÎŇŘdJAîí ÔSŢţb ®ZĆžŤ)$ôÓ(€%:Gj °’EQ+¶‚”ě#kÇ’‘¶č?ž>ű|Űűöyq?đô—őđăëŇ /¤Ăą77J¨ŕé‡Ď÷ësöţçťe-e%…µ==µ-ł˙ľłłíď˙bĘ„z]]ńű>ůbŇ˝q‚KŽüíO÷Ý˙ÓŻýč‰Ď˙şsÁčč輼Cá`xýÜąŞćć˘×Éă“«fέBÔ,ÎÇů~ý?Ç!łCj ±€ś–f)`° @60—ţÍOţđŮ/wŽţřc„­yHŔ$ŕäńŞąÓŹŁŤąÇ'Ď<^•ţţ~6ä~ňŠŃëzšö á R?Ŕ˙x’$/Ü—*ň`şD)ĺÁj«ŮÔSń„A*\rFžpʶ3xÜ‘Ö8âµÄPńě5ĚWpZăX  ‰´^i¬Éôn˘¨P iˇ((OŢAţO尦ʽěŕ4ß}ľ÷ě3ŮýóV@‹G«WÔňBTľ äŕFšŽ>ßqwěh^_űq;NýřÔđ}…_N¬}µş~äĺ==µ99ˇ‚ž‚‚âµĹ(Ôćôôdß˙“'îÝT]ŤXYőTŚKyÓľ8zôŽÎŃáđ gv«Ă{ţ­±żąÇ'WŻŞĘ=úűŮsÇí‡Ô"­X@ĐÓđ ř€¶×Ţ˙“Ď&ťéD˘\Ŕ4$`'Úúö™ŁŐA! Š °űËÜÎĺĺ{”Ýgô­żäzHdN"5W^F˘,†ł\çyĺäŽŇň*7Ó»Ľ¦ÜŔ č ¶š†ěžăĎ÷ŘGCÇ]yęÔ·çě»üPtJKÎČ‘9=‘ N‡Š»‘†Z[üŻ«ď=í\°kĽá(RyĽcjx۶ŁáĽ`8>ó ¨gO?9kÖĐăsss›r•±5DŔŽTŔÖ–śźŤěÎAЇൠ»x-p°kĽB@ ¸ă`0ďĆ«ą€*,`ěôÉýĂîXwvŕŔííŰâĐN_í8˘ťî’Ăü¸íÚ&;qŕÖö­íúQíTő"ÍpĽťťŮŢ ›ó5Č1]ŹkçopJhHî)Ě(öĚO/TźşR±ý­üŠş* ”a•ďv?úúٶ¤öŠĆ €ť†w ę€)OĄG}đůŢĽ÷­‰Ă÷í˝ďíáËíč“ßËY;˛§§'„P©'§''§ř7^ť†X†ľđT;Šđ¨ú˙vVŹßńĹ´Ľ0"yGw…Ő;×Ďš{ÝÜąÓÇÖ ö÷Ł ˝÷ÔÄáWľŐrĺŰĎ_Ťţí÷rZ€µ=Ůk‘€ÚžµµĹ—_6é 0uj” ‡GÝ6íŽ °ë¨pĽfîô&¤§ťű±5ÝäE”†2őúĘë­~©=EeT~Ô[žŻÝKj"Ç֤ûR˝K]÷ťŻ–XÍË •z5(BŤâS¶úÇtľR(µę¶~˛Ł&WrŃę VŮĽčí~±4Î'7ŔµUoW—ÉB¤…/|ľ3‡olٱwÜ5íÝ·Ľ:úäś‘/˙ĎÚ‘k‘~Z›“Ýň“ŁŐQ„L ˘~EŁŐťaôB›ŐáęĽ/¦mËC?H;ýń‚ťŻÎŻ8Ń:˝˘©ulSîaČýN"ÇŤŰńŚ>ą1gä÷®ÄB9?[”TęŁŐŐ@@ @qáĽňiý1˝`ÁčWçĂŹ{‚ H]Ý$ |=_ő˛ą‘j®/ĺâÓXMg€Žčş+áŇ}ë9Ň|oM]ŰP˛UňĐbµ?˘ś ŕA;(¬‘ŽÍiâ_+ůhRôşQ[‰#M€† ŕO€b8&Án1¦ń znš¸ßS”üˇ|–®ú|Őçšúř°ÁíI¶„ ŚU˘ëĺŔh”ă|Ż{ jŮGśîšüÖáúř÷Ö˝¶±ed =ˇâĐ7ţ„€î>Ć„ ăzuRhBżýî+Ź Ľŕó›Zç›?6w쉦ÜVŃß‘ËÉ˱€˝;Ţ~úÔá["ë6ľt×H" $[@$ Ł)öuvNEđúExb €ç›Näžř`ţŘÖÜĂMܰşşI÷S.xŇ)l\VŘ® żjF¶+kC‹ued(‘mŚ·źŠŤĘíč‚r«”>ę•(WîfŃN•ňĐ ü±•ŕȤz»“;°FaA‘”“Tě˙…4q?Š~O‰=ŇŰŮQ+Ü0ňAˇŢ5A^ ř¸Ă|Aťű0ÎwĺÉ™?ž5kňĚ“Çn}#ÝţËuë6nÜř›u99órzŠ/ü?Ć„ŚbFľ Ů@펏"ęě\ĐŮöüÁ}űřňxîó›ŽçŽ=Î]˛dM7*ŕä䙳j°€ú­ß[·qĐR‹|{WĚű"ĽC Ű9řA¤Z‡ťďl;HĚ;˙xÓń±Ó?č>_Éýţ©Ď]Óň„aOâĂý/|ĺ l ¨©)Vľv`:u>QŔŤ3=>ß§čç;őč·Ýř¤¦?Q@8‚>™đqFĎˢđŁtŽ{>H҇qľ7·žüú¬šÉł¦ĎśđĆž©ĎEoąĄ>Ý2¦ĺ?GÖţ¬çňĺ†GŰťľ¸k»=ë$0oŃy/ĂŘ÷öüÖÜÖ¦ÜÜăsź@ô®é†ĚśN<{Gý-Qô¶[‘€–źőŚ© ŽĆřş ‡§Nť\€|ž ČĹ>{˘µźpżŔ:„~Î?ýcĂtIËŰ· úVúbÄÚŽcŤzšŠĺYržĚŚFlmŻ,cb̢X<%ʰ,ŰYšćÄ3ĽŘĘ^˘¨°ĽLČZŮľrTć$µ‹Ňn•ů©ŐĂŠF|ę©ĚY!+Bţ5µđžCGŚĄśűůďó}J`ZüšÝOľŮč@›™ŘĘ(ᢢ©#;lŮdíU:Ă®M0Źá!&ĽŁ•>ßŠš•“Ź-;Ö4ąqţmż}‡ú荳ďBúď®]ňÉá(§§ÝőŢępѲNŚ}»žÝŐą`ô=Ľtß5oÍť?,·5wRL[[›"ű\óĐ2făl"ŕ*EĘ_°ŕz  µuɰ±HŻ>ÜTѸ™ăsż|¬OáűCÜQ,k)á·ú“ĹżÜ/– &ĎqYZVú‡ź—ĄĹ*ąëé•üµ‚ĘÓ˛Ŕy RýCZ±]˙B•ˇoÁ,\ŇRÁż¨WOăŕ.›ç€~—RîçŕémÓ†~épţš×tëHX Ŕ=˂䏞Ç("ŇxG˝·%+KÚ|}đůţş±iĺżťřúÜążžűřÓcç^÷ô„ů»ęoů·1[^¸köČÂü3gvtş~ÚŤyŐa;L‘)üß˙ŤˇéA¤‘^şoÎŢN4¶VT\Ť`iúá¦Ü¦±bŽ—pś ¸něŘë®{g~^” 9űgw}qćh4L„Ă \ "7Pű„€ő­M(÷V$`X˙ŕ~¸K#â~Ź}żŁjmG$ăçŔI.Äy]XŠ®ĺ~Љµ0‡ Ţs>™{—oĺÜĎĎqľ4`Ä»D±üůôő|’‰)ĹE$‚BéĹ“9bL|-ĹĘge9sf4ôÁçűëcÇŽU¬¬şąćرČü®ýň¶¶7~±9úB^8ď^óäĽâűЩ:|Á6ü!lÚőß÷t.řö‚Îç+›3üš¦ăó+†ĺÎĎ[Ń„¨YkEÓÜôůţúŘÜcŹ?Í|y-°˝ţY"ŕ®»rŠ?ů>ÉŃłŃç~ľĺŻ?żkLÎýńmSŁvôĚ´3_śypW¸sęŐgvuv.č<±ořśĺÇ[sŻ^¸u"}cs5«;÷D\×ăćM\ŔŐcWR»€_ýő/žS|˙¤/¦VG«‘€mgp'穛ʻŕ*lOś3çŠůR@ÍńĂc±€éŤéç~6÷ůţÓď=Ńϲävâ~ă~l^íç™ dČă6LˇŰ­ć› NVĘ#Je8f«mxĆ… ^ąőA ›yÁŁř8 ŠBO#ĘýY‘Đ3sň:…L*›ź/A?ú…B‡Ż˛qĐf9#¬~r9#1ą?ü _ź‹;Ťń„ÎQĽ´`T.h™ňţ~Řç{ěDͱÉs'ß|âXMÍĘšŠ•ÇjŢŰ4uűćÎ˙ůUős÷übčśK[6lC鍟1mŰŃđ´őgv"hÚůŻúö}wřŢŽ·ž?a~îáa‡‡}Ú„ßÜécŹOÇŃâśű;1 K4Ő4!ĽvÓ!" ü+$`ř>, hďŠ#»ň¦mz–ŔĐ·ď§D@ĐŠ ĂNÔ?q"íÜŻ^ú|˝¸ß%Öf€~HóEtO;â›ąŻ‹˘”™cPž±T$î{pědůf ý8÷/༤$0*?ĺŘî—Fî—Îŕ¶ű‘@–é—“Ą:čDäA0E¶6›Ż’'f®)ž9YYbĽ/>ßš¦é'櫹yrMͱ•+ŻžżdŘ=ÓÂŃÎ_-ŘĽyę’ćĚ»Ry8X}ăH/ݵ AÓčOž?8bßOç\ó‡°#¶˝r‡5 «6 ©ľŤMĂ™bJL>ÖTC přžiSë©€WŻŘ6ůS‰€műλwŻ"eŹ^Ť‡‘B.—>“şşI¬!NŚ*÷^čgY‡ÎţśŁß%ýŢ9rV,†n|>e׋wÇ'~IÔt’Ľűô‚óC)ä€ÇÁ~ôJXÂň­ÄîçŘ[E}É ÉÄ„‡AüÁ¶ ÜžÓ`÷K7ř©ëů‚ůql¶ś ›ç–Ń>ľv …5ˇ wĐOŮŻ´ŠłDuă™íÖ5ĐźďĘŞŠ•ŤM+O4Ö4ľĐôéئMţ°¤m×´úíő۟ۼýž·ßţâű' GŐvu5beáË4ÜűöŰ Eś¬őpë’Ă­‡‡U´6ť¨ěill\ßŘí~+ŹźXYˇ Řô pöą{ŢľkIG«m, MěŰ‹,ź@ĽšŰz XßXqőúHcÚą_"»ß%„÷:{č¬ĹH E˝A[Ť0Í &ĆŃm˘±#Žs‹·Ki_ĘGUŢv“ÁźíIy§-]+ »ń;2%»_ń}‘ĆŔË;[ě‚·±7Xř•/>!ڬ-gO»ä~1?ą_ZĽĽjPúűIŹފ•źřň~”ßQ3\ ‹’>˛˛5Í"‹ÝHű9|ţ?|ľs×;Vq¬ćÓcM+›*V^ÝxíK~ţů¦ÎúÍ›ë«;·,3±żĽCŃpçčŃŁďŔ}ďö ~Í]o#čËÍý ÷đüă™ĺ6 kú´˘©éńŠŠÇ›>e.Y:żßJ$ Fxś hcÂá%HbyAÜ™ Ŕ:őÁďî˝ 8‘›{ś Ë4V<^A¤ý¨Ď— ßiŤômĆĽżň,¶/4_i÷ĂW»|ëR°@‚Š|ŶR –zHlň/¸ÁNů&äx©‹S~iŇÜ_b˝H^*˝ ގ¨žG=Ď0‰†Ö˰Ĺâpn)Ľ˘(÷Łv?1‘—ŕ€đŃDÍ—pż´Ěń’Öŕšĺ€áUcŮň­¶#–rµĺ’©°SŚ\J{—˛˘ żĹAŰ—qľ77›<ąâا>>·©ćńŢ»ć˝ĂÎśŮő\}gç¦W—?ąwÎoî˙lj炏wţcߥ·˙ař–?đŔ|¶`Ą4wXkŰ&¤ň>ŢÔČä~Ç€&"  ř-°iPÝyF0ëľ·†Źyă7&,A–ąĂN„Z6öîgÖÜšď%Ö»gm>´™ÂźE÷1úť&Üoj;ŇÄ$ą¸ü"ž!‹ÖěFKHU”ó”·ľď¨ŮhŕótĎ*Ób¤ÎęúG ŽzžÁ˙ś–FüWwuČ\$ĘÁqิűŃ/Ö…d}D|JűRŇŔ/öůýD5ńş劭|±VN÷¸  ˇňŠÍ˛8K6|ľÇ›Ö7®˙őÍÇ~}ě曏Ý<ůë׾wŰ×tđŤ«î¸çžM›Ö/Y~Ĺsö¶_6zÚ«ŢŽxßÁ9W :čźĺűtţüŠ_|i=ŚH&Čwśă去ú׿®AŽ×bOlBÚ€?I\±€_ť˙ĆĐ_ćkśżdŘá«‘€F·€X~:í~rŽý,{ěe‘}ëű€űaÍ—OG8śOźnŁă-žĽN%X.Ď+×s-÷š€ĎăKy'9ě*gQ“dđĎi*Wć@tË€sö™$ˇŻöËEog¦ Ć-ÖCyĐţ~îg ÍZř(ŃĂŘeV=e5VŚ|Q[íďóř˛e,‰ćk‹m?ĆůÎmjZYs …É“knž|sÍÓ·Ýöĺ„ëN¸ˇß’'ŢXţŔ]ËÇĚ).^Nˇiř5O>đŇG±Ú;żfBîókćĐôic#z?‹yŮúĆ=Ťë»ßÜ$ ćf,ŕzaďMxçŕ„™€ĺw]!Śx ¸â”ý”˙ń±UPŔ§{ń[żž H]Ý$ pś/@żK4đă đű¬·3őzl(&Ä[şy«×,~$ŽŻö`V=qŹKĄçő5đ™Ű]“ŠŰ]BĹ,†ůacIŰá©¦Ł‰ÎP˙\{»,‡6×-MmČ'N‡ee xŰýlp?Á-Ů"ćly'A±×7nlj_ÔÜŇ}‰„YCúĄ†˝¨ĆÔîGbéH7şçĎweEEÓôF¤łV45kzáŻüťď|óŕÁMžřÓC' túÓň?Ě)ľôůűćě]ľü+–W}0ˇęä„ ós‡ž?ÉáȰ_<ŢTÓÔô)˘ečÓô8Łf¬żßJ5S6Dި€§|Ű7żó#*`ÂĐ7Ţ .-~ţŇŰ^ĽQőAUŐL$`ě°V"ŕđ/*V"ŤŹ7^­H]Ý$ FîgYg=ÁOŚőČZ“ ý)PÍw+íďÖmŽ˙h IDATaާ.‚ýI»ź˙c=Ň”ţ~ŽmKřvąa+đ-/˘žĹ‚7`Žb¤Éýđů"ĘÖÔtěéą7O~zeÍÜŠŠŠ ďýčG?ýŃo2ô‰ C—/˙ÉňĺW<°üÉ9s.ťspε×~ůΗďĚź?ô‰ˇó?kÍÝҊ°Šg‡5VD®ľzýžĆĆȰa'”9^źEŠń±™ű=˝r:ĐT…üčG?AŢy ¸éľW űćĚsí—×"żś˙ÄĐ'€%­ąK°€ŠĆ«‡E*>˝z=˘}@ŔŇÔŐM˛Ŕ×ő°Ýď’wŤŕG_l÷#šďRŮđÚ”f¸I|o:×ܦnm2e݇M eŇC K´©O©Î;˙F[˘}ʆ˲Áýć”4ą¶';(úű]Üv?>Ç‹0űuü“öY›«˛68 PmĽ ¦¸˝ RíóEÜď…ŠĆ^ŔÜq´Š¦«PĺNž;ąęäĐŢ9ůÎ;ď<=áÚwŢůňÚY_޵÷®+®ş|hëPÜď—[Z·lŮňËżÝŇzâĉéÓ§źŕaúżýۉH+śăĺ…&,`ĺúĆ$`ĺŐŹS'¨úR ¸öÚYWě˝kďg™€ůIň_J]Ý$ d]Íç+™öůZ*řaî¤č×Fdo™mr—·Ó6 %$rýj[“čmČC‰UÎߤ¤ôÎĎKBßĘqßć|ő˙0ďc—‘qľĐîÔŹ´ÖÓ|5pŮßďâžŰYń{qăN"Iđůă $&Â>UAŇ/3Š^ŽčQbź/ˇfů) Ŕî—*iÖ|IżŤPópg!čPř}©ůb«‘'+isGť_č[ Rąő±P ě}Ďö»L÷ůňöĘ©r«}{ŹËŰÓ7Î7ÝAóz¸M}ŕÍW •ł:;@˙…„PqčŮ‚{)ç~C0AŁ’‡~ł2Éţ®B‹WČŕśŢÂQbM7 ´FMŠxFÂuϡ1(ëtű|µ9^8ŕYRé•ŕ'çxYĂ(ť˘˝©Mą-ńgřg·©yş‚6A›´ŹáP’b)˙`“!ĺ&ďsµżă‘’gĽ H”M° Ö¬9ÝeKŁűA»źC‡äźĆĂ0 ž¶DK暯ť±ű±F«zɡm>Ml@žU¤td&ŚJ8Mąć›Âż›xR( Ýýý´±–?ĹúÇĐŹŰý˛@c\cąghŻřxC›úmŞűmÚ6řxňâZmÚ†Lç¶nňŘNÚÜĺěÓIĘŮć4—Ń/íÚ W¨EúăZhźd¬GĐÉp?†oBď…$OU~Ő!RYĐ'|M‚.¦šűŮý"›Ý/u!ý>_mśŻĄ:;ČkŞçr?,­ˇ*MŁśµ­AŤÔ•‹±Ü“őY÷uCô&-7uRŠŞDÉBiďľ!ť9­"ŞM+—;Ýj÷Łă|EK rřÓµ;Ü(Ń ŻÇEm÷ŰĽąa {ą7ŕKůjč2%•?®ÂęÝ®ŇÖń÷´Í±ßÝřMľ.lH§Ď—ö÷Űí@î÷sřIĹ—÷vŢş´P[pę#őkJÁ‡SJK‰6ŕ@ĽŃádž\đb8cÜx™,x•ó\N÷>tY–śă…ŰĄ8ű#ţ,[ŞxöpŹÍŚÝďüćjÜ|SŇŰń{;ýM-÷Ó,xl:4i…T¬ĐŘ·Ďí…ß<—â+§¸2ô÷kłŚŤÓ€Ž(˘»D}Tłaç P…m˝Ź¨á­(šś®Yš¸/* JźđíÁ-˝‹í®3»by–—Áąťá¸Ž¨En3:ŠAţě4Îń’ö ®ëˇ IÖěŔř§Xűlý|ľĹm)ç›,ÄĎ_3Ą>߆ôű|Őţ~–[ńÓ›ŞýýHăłŘeoQa"2U–é˝bźgż2ž€¨8.ň]ł†§ŁůSC– ĚxaP•x@ ‡ĚYś’‡ ©µsĽĘ¤Ërç#·ˇŁ öep~?€ĚŞEĽŔçáŕqľé™ăĄłĎ—ű44ţ˘ú15Ü ĆŃř 4 ¦Ľ·łâđ7®Ćź»ź’©¶yîóŇo÷ÓĆzX:řÁ©ťĄÝOˇvm „µ”ZĂŮ;yś ;Âă×p”l“űZ,5Ţ­I·A4P˘ücĐă/@ż"ů!qô‹|@ (úî׎ěÄ,)„ Q ş€ ”jž[,í^Ď÷çü¨ÎKj÷ÜŹáÚ¨kVńů®/ý…>ß¶5nź/K*â%pg0?ݲ ^đM …tTQQHŤ4†¤ĚtšKóÝ´ĆXµ¬ ŁÓsж”Ť60ʤŤÍńÂą—ĘČźĹĺáÜŹ­çĽčąTl‰_=<˘Ěd ŕΤS¸´0 ˝·….čKOI=úé„,‰B_ŁO„|w–˛#Ń âhLíńSD„’y@ °OŚop•XÍ"vô3ú|-fď[őš†}nî§ů_5UMr@ …-[±âS-‡<Ď­š‚ąęŔÄÁĘ­ŤzîéX ·@6ç<ŰW›éŰHĹëí~‚ö9´» Qęń€ă˛XoçĚ/6_Š ‹ć ϡsŘ ŕłP}­Ó”ôI\¤K™“ůýüá~ő6”3ďQć†Đ†Ńł7Kŕ!E’ €Ć(6EđĚö¶J.6 îç3„A\·ćĐǶű÷č—g1{źÎűôţ~˛}¶pOmµ– n\ńô§MGX•1µi¤f§IĂM »ĽuQ‹”R]¤łÍ##ĺ,Pp‘`“‰b ¬$¤Űę/`‘Ěh:řÚ<śřq»źÝoĆů>â§0•űń>ŕ[žś,@4ڍśŃáoËććÔ¨Ĺ'¸çřeŔ‡ĐĹÔŰýbţĹ:1#[qöK´Sˢ qŹH~Şôť„˘s;G§mčüy ”ň,Şú˛¸„D–IÜěwÜďűŔŢ÷ä÷őŔ¸ßÖ,3 ( łŕ€\†! ¤Yü\3/Óňt#‘ 3\ěIEPŠ ˙¤ ĎM»ĐUOgÜç¨˙ÍđŤéńBí~PÁUÖ3˘†Ął›ű‹Ý/mčg;BŮeťČ]ż—ĆD):ü‹vŘŇ—b~g'˝č9s ^ÝMŞĘľŚőPś Zś÷1ÓމCŇŔ‰ň˝ă<ÇzPż7ř5PÔ‹•¨^L#č'"ÁUww?ă~ß÷ä}šÝĎÝŰŚĐĆř›»ŮŻýݸDĎŕ#;Ěčŕ>˘Çš/Ę&Ođö8żÍ,ÝŔWÍ™čQ:~»×ݶM~ń Wé&Ô_á»tŘĽKbEË,Şůú?Öă‘>nĄ,(ÜŹŻäÜ9Ú,–ëÂxU#m3ćG«×n÷Dł˛ÍöĂëşp|±Ř«0´`©đ!˝_€yPučRdóű‘#\ć~ ”yÄŽúcŞ5ç“J„ĚEýĂć˙k*ž&6N‹ąť·’ć,»ĽĐنĄWÓ°H}ľvZĆz<âŢH#÷“KßQżŁulzDŽ‚ ëđâ˝|Ö0şîoĐq‚|`!\ŐČńivS[szÄ8x1ĄW§@„;:âŔ,vż5'…űŃn„Ă"ŔĆ‚„'% ŐšhÇż´ŰýÖ©ýý^{Í‹÷1»ź|ľ:ˇ3¶Q ŤPkî.ČHĚţ’S8Ż‘śşËoú ©˙É»(¨©íą˙ž< v?NF‚‚űńQůpí`˛˘%ĺ~ľŹőxÄîT÷šnŚú!f'ŘŁ~ĚŚ~đ*ľQľ 9±™ZܖʇSgÉŐݲ¤˙$µšŻăęLÇĐPu@4`%”Cź%ŹĹ„ÝOŕTP ÷‹ĐÂ, nĚí1ŁŃ˝J6<ŻôŻçĐ×óőĆ>Ýç«âY›¶c7?tĄ3‚„ P’’{›o8M“nz¬‹ ‡FëXéÂxwrąéý„ˇÁşčćt„N€d¬Gşě~ě\čç ÔűűŃÚâë“S!{¬+3ç~éµü‰JekŮýFÚţř|m>Ň­ÁŐa%qL ĽS´ë`@PÚߏĚíएźa(FżăŠ\!”ů7b<–ůTb4†ĄOűXÝĎ;P»ßuvS@0î& imę—o\(‘4NצÎ(ŻŠ…gŔombĽ‰„‚l”ÇAŇň'Y·É”e¬GP:aÖ— úRÍ—Űý|÷ů>ÂAN˙őÇűáňůR‚Gúřqź† 8`‡Íú˙„Äë™ă¨:gśń÷vëšűÚßOŕ]„˙ÄŠ ŹŮěbŠËUö]nP{ůI‚Fćx‰Ôŕh„é± ›ŁF@lî뽲—¦ýĂ|·ŇŰ99úáŐĚłÖ\vq„ĎŇ–˙gç"]łűI¦Çu3ą0ííĽu)nşľr?ŕÚ`p'~tLiи­ŠuQ<<Ăů˛đŹÍ{ąD7ÄHuäŕAf`µłŃ&+Z:¶ýý†xN.EG­ń‘+ALeń%5h8ÖCŇE-«@ JDI4N»Ýźčď—E^ôk)ݢź>„,ž8«O§S éYĽ KÝűKA™`qş(˝~‚ü_ ?%Ëś8éP„‰%jŇő7łäQ™E–ąlĐîÇ;ć:śś©qĐ?:Ç‹ĎÜx9Ś8gŽ˝ŕÁŁżźxVđAżřĄ{ü™BŹh}ŠÄ”:ňpFQÜŰŮîGÇůŠd‘HÁ p6Đ EŽűeZŞç«‚G<ť4ňăF8EGA­Ç ô/÷‡ţ~ç›”űaćp„µ"tŤëń®žĽŁňM•¨ Ř¦·WTĽ‚Q‘žĄý€/"Ń62ťF:$R†zí—¦vX‘ë•C¬wč!GŽ8,?fĎÇÄ«9¨Áá˙&ĺ©·ą(&ŁŢ}¦ü;őü˙Őó"ŠLđ"˛|śŻ´đIň~‚ÂîGŚY¶Żc= üÉ›ĐÂË?íŰĹýŘ:DôQaGĺđ6¦Ń˛-\Í•‚„ńI^¸Ů5Őł›Ňup?óZA»óűĽţĐRpŠ!ŢÇvłŘÝ0ýî|‰z0FdÇłwK GŇ=Ç ëŃę‡ÂŃ©©^pŠ(yŰŕîń6Rď‡zăEŐcr›/˘l“4\śĚť•ŁžťU/N­]~ëmGIK§”…Ą¨'/’TdĘĄđNţęá—ĆM• Ęei`ąčzí߆•ô–ťÄ˘EAč7‡vôČ>âĹßŰiôR' óűiđg)ŕ‡?~ŽóŤŠÎA¶ÔÁŕ+uĘ!đÉ®Í6»Em™GJŃ/Î?PîGűű écŕ×›‡¨xH2u l;r_ ::l> ©AM#Ę>,gžżĂ3–Ö¤AdŐS;ün=×p§ü™×‹áżD)mˇµ8Đ`żÔě«ŇZäÜ/î÷3ui!Ŕ÷eý%ŮřK +üŔ?÷“üMÜŻë 㨻6ě@i>“Y]ýë‘ çŔXŹľ4 űŕ#Ü7ŹvKČ]GMÎWč#`ZďUŔ› Ĺš_Qx"Lxâ¨B'•©gČŇFů“xĆČ„%,„ű4S  T± Ę“H€d›˛ůăG^_ąźÁˇT^ }”˙ĄĽ(š×ż‚‚˙ń=ö`á(ý"Ęť¦N´%HňŰ<~ý4Čůý‚}ĺ3˛ˇÉą}Ŕn 0Î^CDuÝqżöë°Ľĺ[żĹůśQ6Ä9RTdy¨H¦—6ęĘRüE›źrvd=đ”QíŁ –+‚6Át…,P‚(ŘPęK­cůWüx¨^=5Źv?͡kÎGŘž€>˛ĺ+úmHź3Aů€Ŕ1Ľ‚y ‹;[—• o;Ăýúo >ßuůĽىßüÁÇžl¶rß0Żż€~oČG¤1e ]ě@ä ę9)ł p86Â;YÉDnŘňÎUAęi;¶Čť(Mn¨‡wťŠ|ş,^CŠ4G´$ĺáŢŕY"óéŘ+j;búvqžźv?ĐÍ…ł=ÎţTLuA ÝŻaKň{ ۡż]ü[d ™P9°…˝Ŕ± úőË űű%ľröG"˙đ÷vľÄ!±G9M=×ĺ•tEî)ߣËTÎQNŰŁĺ'7ŔÉŕÄňrłPŻ}–Tń|Ź]÷ˇ=Jf.¨`yˇŕSţßµ}öů2đ6> }2.őŞ/Ô|qŘÎľo˘»7ąĽéŰq’íäu”©·›|đ<2~ý4ŕ›źLahŰĎxĘĘŰą3‘npŹ"w ¶·Kď˘|“9p LĎłżŔ7 N‡9¶K!Š'sŕ@y>(Ź(©Rŕö­0y»,ŞLţůl…žSXęvî[m¨ %hÇĄ –ýYy&¬ľˇÔm»¬™\ýS˘’iŘ:&ÝĘ^ Â·’÷fa÷‹ůŘ<-ë›?ř¦P{\eI8Lui´™íą6+ÔZ±Ç‘ę…#˘l‘ŘSt:ŁůöŰ@ąöů:Ď ąÉŁ—sO»kŕ÷"ęc)TźŁqÔľ™cŔ°•`0pkš‚†Ń%r¸…6Ú"Ë}¦·ečŠk ‰k‡ňŻd5ę´:ÎçjYą˙*Üuý1ěÍNÖtł~đMňŠ.†ĽU«V8LąęëšĺŔVLż€MÁÖÉÓ4ĎŇOýúi>_Äýn˘ZUľžˇËTáˇ2á+,ÇčŔ`żűűqđCđ'•_Dü,` ú‡~g7kÖQŤ¶©±|ËV#ŔÓvqLýúiă|úą[Íż<ó˝˘ĺíý*ŐŤJőË•J •îÍJ÷±DQžůąKĺqš’»–ĐýG’Ë­4ŞÔăŐRiŘN §RŰLV -KËŮ®Ľ§p?ß×tłľ áĎřĎ˙Lý˝ÖˇúżÜO`š yĐsë(.^qđ‹pqżŚćŰŹ˝ůÉ/ĎÜô¨»éýË3lÄNůŔ,Ҥ*u´pµH¨ŇôöĚFć¤E)MŠ#ĺ®R±ăĺ†S”ŤrĄć ßĺjĆm=Mĺt•@űn9®ŠČ °D–swZĆČ'Ö@ĆÜ/î—Ď÷afőÓ”_ükýł…Ađyü|ä~˛żźĘy\Pá~b<;ĆűÁđŽpś/€Ä úőÓć÷Üϲřć~äď¨hľ Ő9„ó9çÜ31$8źsÎ5¸˛¨ôÜ;7iž©=XőNĂ» $K`úěóE7\ĐĘŻüľý(ôˇ—Ďv?0!dtjŻgĐ (Ç|—˙Ě#Ýš˛xżĘ ÷뿌óŤçî7da•ű,‹r Äýć;Đd÷s«bçŇŚ]$ĚĹt GűŁAA4 ®ôŘö<×ăź&xTz$ňŞł„5Zéń•ÝČĹě˝öî»/ wŚ źďă|yŘŠ­%ŕO::ü1čłůi÷ă]öńtL1RúW’©üŕh® Ĺ’nřWNm€çxáđ—Aż~@?Ćý(öU2ţGí~6YĆHUîLŤŮĄzhŞőÓ@*]©Lůą d*I€óŔ¨ĘAîµmuÓłn´3 č5ŕ©ŕČ“Ŕ!vż—^bđ‡í~6E?ňřó‘ű C0GĽĽÂâ‡t_şçóX®ÄZ–ŐaŮ đŻ#ČW4ť[Š),Dß—,Ńs†ĚíĚFĂeĐŻź0·łÔ|÷Ă­FÚýTÍi,^ŔTşľ7Zů‚MżDV&<Á‘@ecЬCźŢ’OTΖ,‹D÷ńŚľ€`˘€4_Š~ĎPôŁ>_¬íŮÄôá#÷“ŚďE ‰ćK÷|µű ď:˛j ]Ń’:zůÂľŽ¶P^Ďć;âUŤŘn”¬fN“dĐŻż9żĺ~•tÍ÷1jĽ ýý„®‰aď‚—CčąS6©HVɠԨ޵Gë7Đ<,©îiMĹĄ"e;dÁ,hŃş®‡4ö÷ÓgQHa±S\™_áŕöů­±śö|©¤ÜżÝŹ·/t—žĹ÷+Âý8řX,W°ŕOĄŇ|ŤÍš†D ŻiDĘEJH ąRä⩢“s &6“xŤL¬’*čäĹ5=˙hĄ8,˙c©¤R=Tó%Đ÷ŚD?ŰI‡Ý÷oĆę­%áŹvy‘PâB¨ÜŹó7Â÷˘xµň(^Ó—xAâKÖ6çĽĎá”OXűÄ7â~b•®ů:&źŻ$se]€/ňľ żŮyoG¶ß ¦¸2żÂÁÝ߯’xJ9‚ îÇĆů2ćg x9¤(—ńXZë#¨ů©o wĘÂÜę´§*Jźgq`ÜŹfféYéx¤+ÝJB7Îą L¤HŚÚŕT%‹rWLr0ťbČCôx)gc=b t`ß}ľAv+hĎ>ŃűOşBüëÁú+đsAý :äcˇ/erYĂB lú«,›΢¬ÁĚý‚›·űnÚśâĘü vóîg‰€÷ź/`W^÷ÍMP<‚ˇ„R§0íBö-Kîň8Ź6_i„>Y~‡ÎŞĐĚXěď1zj⨆‚$c+]ßĺîJÉ 0\®¦L¬“>ĆŹ IDAT¨ó-­8€ľ2Ż /pÍ7]>_b4fÜ˙Š!n~x|µ9^¤Ç—˛6ćěµë™ÉĎŠâÉďäaľl=_q(+«š‚©ÉîgoF”̧°=~žMnIŃŹŤóĄŘG™â~ô “YxSđ"p; a»řďL]ÉS¸ZlĄŠ.ŤŃbWň>ÍîG)‡>ŽČ8”ŐW5Î(ĘÎ\éżť§ţĄ±®á®´ÓʉÝLĎcÜ/褭żźEÝ€÷YÔ ˛*ő…đXÓŤ93đ]˘ž®ÓęŘR;¶ĹŔ6[śV?č%Ó°·‰ű]XłÉ;~ç÷sxżA„Żńvcç[©ŚěTBĄ’ţljE”aŃ‹†) ĺ4E9T…żJ]3T6¶¸ˇ™'ŕđ[nńéĐe€(“zë>ČZ_¬ynAđß”ë˘\®§WžGć(÷#G_ Đî—–±ĽÇźěüLpĘŞU«¦¤şýŘzľ|)AiŢ“¦>ŃÓOĺ~A‡[y˘ ç62ËĂE Üo»[öynŮtSDĂO–A?ď@úű­K<żąŚĺEogÜÝE"śű•Ę3ůfxJ˘ˇt,ůŤA„‰Ľˇ’tĂÜO¤,X »Ô^OĺŰx OJş[Sˇ,Ńąâô„‚Uřô –ä’9 19ĹUŚ ßötŮýÜ/ÎűXHq!\óűaFäŠ,¶ŹwZQű6«ëm‘é+s0r?]ç‡}6'{çłyßČ źw€ýý†ŘZ“DűűąFşyq?Eó$( Ő49čIV8Hjź• }1hĂć# D’ďr…űĺi.™J ą”zzŠôR|5$,7Ψ ł´f:(rMě®âňJ±F­—^zé5ő•Ž9^đgąÁŹuwö ű´±đ$“SáĎ u‚' › =7ĘŢbĄRoîgCČ:·-Eßµ!>*02~Ţö÷»iČżüKűżŕ@żÉŕ~˘ů)Ę%ô”S(kĐŔîW.čW%Ă Ř­ŮÔöMT)‘ˇMfY¸Jzy§F. ŁLD+‘îíčfRCáHărc ™x\iNs´ęÉlöŰɇz¬ëáăX|Ď)¶ż<ÖÝe•oاŹó6<˝ź¶µ‚u˛ż‹:ę—můQî§ěúşĄť+h`yÓY*ô+”ţ~ęZnůôÇÝ߯ č@ĚMkc—“>ŇŐ™ü*ˇ×C|TX[•: ą‰—,4ką+.—AĽcŽ,Ôh/őŰ+}⨤:łHä]"×fÂLq­lW ŇçëëXz×QŘăc=ň(öMń űô9^°˛˛ä~˘g3đöĄ5ĐÖą`Pb˘\™î%°űťk°]{BŐUŽÉí ÷óp]ŹÇ˛ËĘb_|˝€ÝŹŽ|×NíLŽőŕýZxG“A€+öxq){}UÂCąĆz4łÂIڤ¤Sďń˘Ę‡žX OŤµ/tĚ•VS×ő3•Čr®ŇĂ’šÁž*ó [V˝ýĎ×öwM·‡^EVp“c=üĺ}8¸ĆůJ8SąE ďFľbWś¦BMäóí«©OC9;¨Aáç żŔÁ úyŕóu†¸†É€G¶űń6džݵoş`Ăí´ÔÚč îîUŐ44D2 ž4Ă•«xŕmî».¸«df;ţë:ćQJ ¨<x×3ŕ\BN´ś<ąźoëzŕ0…“<ŢŮŮěSí~]Ř´…9„¶4t±môÝŐĂţ?đţŢBżÄ‡§1q?ŕšŐ`ͰĄ83 YĎÍýřŽMQ0~ŢÎńBúű!¨"WĚ‚áŕaߌűÁţ~ygĺ]k$I˛éCĺU6+ Jş•NĂŽľŘ@7Q¸>ĺ¬[E¬'*ϸź$$´÷jH‘*°Ľ\©g5:÷{áÝ4Ťő ÔoĹ? đľ'ý+ÂýxŔCÇP¸‰nłÍíâĹchxŇv5JčÔ>p? •-ôősÓ!•ű˙ÇĎá1„~»źg >_Ćý¤Źź2A‡"ă~ÁH7KŔË› ©ąÚꩉCEÔ#ť[ź¬Ô,‚ ÔX#ë — d5ѡ×ň*ľ+/] ­Ôţ˘ Ô '«'y•F'ÎĽÖpogz7’·ä~iđů>LđďĄ)«^Âřç?ďĂA›ă…i8lJ*ˇţ*/ˇ9ŠnŰJ#b¬Á1Îr@ĐĎ•,¸ýľ€zt{ˇxá~ŢÚýb±ÝĎ#¸źµ2ާZç ťĽđŔ»i'EˇrŻÂąŮ¨’_"*·*]đ¤!h"Ps—UźĐŢéY095M‰JĐďFű¤ÝĎ˙u=h`WčMţöWşi†+µ‹ řŃ!PŤŞ’t& ÍÜvOIäăgč"ă=íÄ úy|óÇřXc #vś/D?Ô¸¦Ó ä}fÂâEW ¨“Jťd“WŃ‹|­‚…K¤ą#őâ{&N„T Ţkxá ˙usáJnjÖzuÂ˙θźn÷ ú>Ö‡U ř-Ű8Î×ýµ –˛sŚ-+‰Ľ}ľ}éć˘ ÚYa+» {ŔŘôK÷cc= ĚńÂFş±fř¦¤V‰ŕÁÔJűHnÜéAËÖóPŮ(śŽ;zy ŁĆ Epď{Q­rXŔ„˙TWo Üő(Ů -2Ňóň°űĄ‹űá6ě3Śó…(P-ŔMđA!e*É!#´Žő8Ĺľ+Ś´+d‚°ăFÄŚÝĎ;(ă|u7'6żžĺĚíĽjŐ“†FY™¤´ôîźľ1#%—JCśR8Óyf©TńČ]ÄA*há ça1ŕŤ^Đ„DWląq0‰핳–ŔÚ®¨˝éµűń°ęµ´`źk~?ÔŃ/Gë̬j»Ž’Š€ ZJ¨żB¨¨@,ÓŢtÂů˘8j…†š+hr”(ĂýÎ1°›?Ů8_G±űy6ECŃ:‘KÓhMŞaĄnxS05N9 ~ڧ»@HŰML7 ŮőgĘőžÜÓH™Ťp[é>G5# îwôÝ)6¤m¬Gúkngeˇ"řð+ł:ôôăgd9QŽ ą·Ý/*pŠm­XąÝ üDGöŘ.Â=y0JwE$`‡”F9WĚ źw Üo7éćžóĎńB®7_ÓÍDsŔ\tzË7µ_cH¬~VšvŶ'kô”šhTń ăt qá©á$wżŔDĹ2TŻR­nU=)pň_o»ź÷¬Gşb÷Gzë;6äs‚*s (®‰ťY"'ɸźJŐÖQ »t/¨¤µ+`†űő1Ŕ± ýäô¦źŰŮŃ4ßA˛ăIbř‘‹´ił+đÍ«p ©©Ĺq# ›ĐÖ»” Ę㉆Vý ďĘŢ.ľ ¸ß f÷ëx ó‘óĘNžŮqľyyM7‡NpĘÖo“±A:é=\ö<ĐPš Í·/óűŮŠ…ÎrŢ öµBţWhWpµw…{ęnĆîçÄ8_Ěý‚¸­”/n÷ăsĽ>OÔŠ˘íŐ=#a2âE‚ěőiŮ&]@DÁEĺד'ę2úVPL˝VĽ¸ŇP 5‚qż`Ź·ü 9Ö ź¤&z‚ 9ź’g>Ąćńçu~?idn{›®ÝkK sč|ĎAŃÓ€ ¦$ŰÎH˛9~Ëî/Fîgč˘ÇµY~AĆű8®XÁ˝ýl‰Ť†Ě®:îç ÜO &»źą1x“ökÂÖŞ˝W톿ĺnőÓĐIN…"b•‘p‚.]0ęĄ+ĚWM ˇäU&(§! ŇŰř|Ź‚ţ~Á čó} |'KeŚ7 ßS/\иÓpˇő2Ä1dž{ńC‘,öfIŚä1ŞPż(÷›ąuĐr#ť´®p0 9äwÇ7‡s=±G)ß ęő`Ž›ĺC†űy2Č=&çvvkľű©ŕfYęúE^ŃňxŚĺ Óęł+«ů¸ŔŮ5ç® Ýĺ7×äHM®•ŮîwA×őč÷ÔS”âa>×ă¨nü5@÷’ˇý đ\IĹu(’*•łjíeµ˝wŘŻÝř+Î~˘€ĎkóuYůć ‚˝Ď“é{ýŢ÷ő¸úäę Ő+ý›AëĘ^–ŕ—â‚č§Pđ犷«Q†Şá2oé‘oŤ€ŮŕŤĚđ†€/7Âľnˇ×'»…•íŰýt#]ĆŻÍ=ş˙š[#öq·oq‘ÚţĽ6Dâ ýę‚s=ž,ôůŽy?ß\±Ľ i5®Ů‹5eăAÄ^[xÉĐÓ€9ě—¨Ý7hqc[¸–&˛1vm¦Şzî%ŽâĎ)V8ó&ĽUŢ}ŕ~f¸ó{ç~Đ?q• Üě _±Oŕ2„.ť®ľżľ5ŢO­kzCČw±Śön7Ńżq·ůúÍL˙2őĂ®‘n‰ ţękĽ0lÝt ¶m9=\ndĺ„¶ĆË!˘ćz¸ŁťqĽźlŐń6ďšűiąRK¦,9Uł†&1 ůÇť;<á›â~ľ4Pz?÷3“~a…ľQ¸źŔa9°ů[îş}oŘOCżşĚ÷ń6rżń>_®‘ `bLJ[9yy{Ť‚›śęZVV˙ŞY#™ š‡Đň§ÂqĘŇ?ě™Ô*¶b·őt™ß2iĎ7|ë¸ď]6ĸÄŐ…č`ÝC'Ý÷›†ń=íëˇćq_GĄĎĂ1|38z1ľgęW¬p5Ń€ó2 7cšů1Ť‰îÍ\/·Fäc.ŁžçżĚ+ËwZć~ždŇ÷­‚·1 ó3+»Ŕbi¤Km­—†~u™ąßÚÓ-´űYfű|É}ÜŹ:(ŐĽlqnĽ}Ó|`3v®‚Ho‹T k†Čý·ňczŔĂ X9[žCĐ 9ÄŻŻV¶ qaű“Í‘űŦż÷‹Łť§Őíűh÷Să]ňÉŻěö ŽwAąĽ*ŔíXčG›ąŤĽZ‹jÓĂE«Ň¸ľ›Čîx9™ű1>â!€ŹĄ‚ojÜ/U jŁťôk‘Î dÝYŢ$Ë·µűUEíé¦G;Çz#Üďżźˇi–ŘUÜÓÍ©ŚCq «§g!»(c°nçáËČKżtötCż|ľq·6ďí…^ţË=IřhĎbë«džŢŽ"ë"^üSŤ CLk;_ăŇÎ׉űuxŤ—÷Vď[Ô\°LŘą7ŕečKŰóŽyźA˝LGéöŹŹb§‰?Ó ×xů¶chŕ2âYĐ›Ĺgł|—$Ť÷ s=¦Jźoęąźx®G&g_’é«ëc •÷lKŽ™-¦ďMľD›]®igÉ!í4őG“ő) fÓ׺ahNÜO(]źb }%´ŻŰ–‚·o8×łŠ˛pĎ—×ďG—s,ú‰Џö˘Ä>[|ÚÜZsŘX!î‡+\ŤiġZß/q˝÷ď{Ó盍U: Mz¸Lß4ÂeYú^¶Á„‰na¶Ç˙•'{0v.ÍóeÚç ˙KđhŘž4ýÔcÜĐŻ.qĽp?[sp7sU›„ű)Ö5„5^ű‘‰kl^ĆŔ‘; ôĚňXSśč'{dzXç~Ó—ŁŰQë@Úh~ŃMę`‚Öúc‡†~u‘yľSěő°ô!Ťx™2ú č źjî—%ť%~G"\ëĆšőŔČ7lÖĘ˙÷{‹îD;d(ŞĽ˛‹×Âý~«GĽHäň›ů$n9,ZÇí×ů„2&ú%Ť7Śß%7slýňĚ‘ľrŚn†!öę‚•Ę~ľăä~Xl݇°8F:‚>ZÉ€NˇŁŰĹţĄ(˘ßĎŇžnÜň‡gy˛î}·‡7éżśĐëÂcł|—„Ö÷›âhç˙yľž˙‡ďG•Kq?pÎu-łŞHťČ(š.ĂFÂđ×FN2Ţô.‰áŐ‡±d×p?¤¸füL”ŹNŞmh_vŃá6 f"iÁö9Ä,\í•ńsٱ3»/Ž*ŰŮv5úűőçó˙ʞĆËIöő8©Ř^[ÔúW,ćÇĽ7+GOąóDö÷Č€ŮÓm”őH—Äń‘ś`Ŕ_ć‚ŮĄˇ_]÷űë_˙zţ‡ĺ/iOËÍ›GXť"Ŕ|ą_Uy$¬áĘ č—câ3`föŃg°Ź;¨v çav?J"n˝‚02pĹeÇě‡'2ŃőËG~š@[ ­ŮnŐ?H0źn*jÜď„űzśPě\‚-»‚3ŰÄu°ŕó$Ł]hŞ›^żË¬Ńă~ă·ż}űí·_ňç·ßĆŻô_˙”Wc#K±ĚÎ_3¶>ߪć˙6µű=úKţŕß_ű˝©·űó:ő¬ ˘6żD±"c›MË a’2N‘¨†Hߪ>_ˇW‘§=A[[e‚knŞŁ—^'…ŮŽąłë“5ßŮŐŘú„;ßŮI~Íí~źú…vż÷8×ă$~ç˙y>ˆżüőźçünä~^~§#Žčüü‹ß$úu?l6›ćOţË_|XűsČťX~čşĆýŞ2|Áűz$y˙źŚ"éM–÷tËu*•o‡oĄÝo#]CFąl7JU¨•Ź/ Ŕ ˛áű8zéámĄî5n@ďďđ[á~(śýŻĹß$뼲OŘÖkČiµýЦ=‡…™Ă ö&¸ßçĆ’Q—7yWŁëż+ô#îwűsżw•ďň÷oč\ËăxRZľÝůѤŹ]şżˇ>ßĚ럌˙%Űç{ÍŁť?jî—ú|ń5żü®ŕIBRsźtSšü^Źý |ďOúUÖxáű‰ĂśÓx?Z§.ĎóŤÜoµPć[m—(xZikŐş/­q˝˛®0¬<Ď7÷ůÚ váŔšT×ÝŁĆLČŔž sąľčGJGă§ccWăQí~×?–Üďcn÷Ík1ŤĎ`(´ÓŰQtcťń~M†đ/ăÄŤ}ŹŇ7eî§ú|‡!ć€ę­Ś±ľ¨µ Ö\fčč­v0Ďś«IYwÔjc= YÓúeS9ŽţÓHo{wKK·lć=śMňęRcš  ÷»ní~YŇ;ŻC=Óç‹P#˘'‰8ÓĐď ďç;ŤŹţęËí~Ô´!Ćš–P÷j-Pr\p«rČÓ1Ř©Ws(Jöç8Dĺ—’‰fŠ»Ńo”6)5v)©®7ëÍć»’ aIG Şş–rtL3ݲDö÷O­Ď—¸ź†/°„ &hY’@šýƤŹűú=P‘=ÝžüĺŻ˙áČoţ::í~bžšŠXÂYE ŹŽßŤ=ň Ď¦J-|łrn\®®¦@V˝˝ă5'µ`†.4Ń)›WUDvôYÂdůţ¨Úý&i÷Ű}\ŐŰýn&djĐôăp?ăÓ``XŮ^„‡Ĺ8í~M†ä>ßďç{ôčŻ˙QÖÖ'żaîG{şĄz÷ôb¸¸¸řŰE¤%1P¶46D»WůYTîéĹĹӋҧ˘¦kH4t”cĽąrxnž ‚¬‡$÷ú’ÎÓ®\Ç+Âdůâžľ0ŢャńňKŰî×ůKpvSrżqReŇ[tHăýx}ż¸Ú -ťĐĐďĘ0÷›ţâ˘ßÍýrŤš±ĺ"üP!˘ĺs=NąŢŹĹKgăYĎe­lE×⬑» ‡ÚĂ=Ź^{ÇUX55ôáZŽć˙á;lóűĽµű% ŁťÁ^ +[ÝLiCß\q±SÜÇ|śdbŻ™á¸[ÂŹhŁÖî÷peřŽÇűEî'+«¤_ŕ~ĎT-ű[‚¬e˝=^âIJÜţŐzc–öäĚü˝`> Ž5¨‹ěŻHQ+ŔxC áô\oRŞ&î!QžýŽĐׇ/®Ůň˝nó|éćů&¬K[—‹U›·6ljo´e}ópC_ ŘĐďJä~ąĎ7ŁÍoŤż‰űÝ`źŻe‡đ ëĄ÷.–sXk¬l1ÝšE\Şšw>ćť07•0 1†ë¶ VŘe•đş˛ďőůrËß5ŹxůČąßH6Ą…ýÂVlĐĆeN;Ú¶ý%4K˝$Śë[Ĺé)ič÷@…ÇűM‰űQuŁÚ4švżE¬(ÍY—Ńőµk^, gŰ ˝>­«c»c÷±COe‹“őÔśŘ+Řă»Äm˙ĹbcokĽ XôË&jÚ¨÷ŻÇĽ›[8ă^Ž„€ÔT-†SZݨ_ă~\pĽźµ|Wëhů¦»(}ľ`ě)c‰¦Ţę$čŐBĐ!pd qśjPTĹ5ěFűLG•–:SćĘňˣ漗sqY&‡Ęľ‘ű}ĚkĽäőýR÷D¸ĽoQÚÁă§´ÁyŢňhäu\¤)WĽĹ•ýÂ×#î=n}ľVň€ć~ÉâíŮň±ÝݶgNÍ@­Ký˘MrTť‚Q‹Űđ@»ë:ůüЍ­Mˇ˝ÉB9÷Lc˝~q((wεfW¸zFfîwmçů6î's=¦„{IŇŇöů7íl4\—¸ä/s*G©×cĘ˝qKŹÖçűE¸_@żŇ|{ň·Ď·Rą=sSM„3µľL×r¸Ü;îę’áeąHçŢ.J–"ÖĘěíÔ­1ŘEż˛[Ň:6ĚýŇŢ´ľ_l÷»ýxąßë0ŢŹůBďîL÷f¦w9˙Ť7Á%‚ߍâ~€‚b ó8—ä1ľÄ ú=PIűůş}ľ±ęŚOŠń~\łÔŇ+nťÝě©Ęî|Ź…řřĘ2TG˝.ŚË âxßG° ´-TtřćAúč (8Ľf;‘ëvżëĆý’„/Ô‡;ţ”·ŻŚ¶ďd sűß ±DŐ˙Ćđüű(ŁcÚĎ—F 6ô{ űůţĹł|5÷Ă 5„ĹMó,/$6ĚśL­_´ &Wóĺ‰f~}R+ RGŁzě˘[É0{OËELţ[ľӆގXśUţś¨U4čšW¸rŰýNĐç;śL»źiö‹DoL}ŔˇzB¦lÉŞ–>\čyęM´ţŁGŮRľi–ď•´źŻ´űYQí~\ :Ţ˝ Ű…ß P?vcë§FEsPśp DÍ+LéO+ü…5^l"›"5TŞčęđěŐe“ÍćŢyT"[4ŚëLWiMË>sżlôs=ŽÍý†rżďW›™]ÂĽÔßqC;–OĂO™ Ň$`!zhg28sżŘ8e#¸őz<`ávż'‘űődńŇúq´s¸Ź8Ţ/¬ďąŐŰ»Oť5íd=–˝–ťŮŁcÁH´U›ŰűKŹĂ¬UX„áÓ;Gą"­…K˝9v|íçŹ iűľ×\¤/ÓŞbŽk™é†ÜośNĐç;ß™îÁ ßÝkŢÎ-7ű qÔ33ľ},c›ţč<ĐŹöŤÝôčyúoCż‡*ižoŕ~ôůF„ŃÎÔî'–eZBjţÔVU¨Q TK<$°UŮń¸A2.˝ÚÍđÝ- IDATő. ¸üh KŻŢŃbĐKMf6ÍľF(˝¬(Ŕ)I,*]ŹđŔľ±›ţr(n÷cúwţ'čóŇ}95üs=xěrDľĽQšőv3ń".÷Sćo阮;Óđ—†~Tě\;Ď7·ű…µťyÄKż†]Ó–wóa÷ľ˛ĺYiäR„őeS]’ޞ×0Xľ­Â!ÇŚwhoˡ„+/çűč]ôŞŮÎE99!Šĺ’á~×'éóMĽo6|ďúŃ„5éşĺ†Ľ1 }ÎÇ,Q·úÉÎn#EÖ¸ßC•r®Ç&®/ }ľéĆWvţr(ŔĚ—r©Qq„ B&Ë…SŃvúb(YvCKpô·ŕ.7%b‹1~Æsk1ő-ěşČ#ǰJˇnźę¨G'Ł™ÓęéÓbňs=®ăl_îő8Zźoć}©ÁäéŐĹp?ˇ~ť¬ř¤ŽűvyĚź2€'jß‹“<ÂŃMXFČ4ô{ "í~‘űé*Ô ÷Ăń~ľÔ†ŰjŘ[—ÁbUtTu;µŮÓŇÎŔ±zˇ®Ý ™í6é‚ĺ~ŚŤąd ‡ř"ď`i8é2y;čµpPŕĘž$…-_ĘCŘĎwč†ÔVüöÔ-f?_¦~Äëpcr^Ľ9ăCŁĄ„7šő÷{¨b×xÉő‡«Đ“'Mw\ÍóݰéűĄ»§˙¬óŘAÜĄ­OADô†8Ŕ0z1PLöżĎěNjŞÎ§=Gd»Íś%?čÔ×:%ô“vm#sżG˝6éµv€qé§ _KśXě«!rżkŘÎ÷ř}ľńľđ9mŻo9Ó­ŁÝÉ;šşQPĽ‘/(⧡Zô€úRú=TŃí~ă“'ó_:î÷ q1¶­™ŤzŢő‡¶"’ťs3Vld‡Č´1¤lÄ-Ž92 ŔQd_ ‚Ę\é{Íý™e"ŢŹ2ýf7AmHóµJGgq ą˝hëΰܱ@žé „×Ř˙ě­#¸RIźŃďÇ<Óí4ó|™÷yěď¸đ ű|™ÔńJ}„}¦Ł—˝ńYé…{Ž!LŰ×ăË0Ť2Ď÷7żyň›ř~~euS5ŢŹąß§ŞgŇL¶^[|YÓ~ćLóňnć›ěˇ_g#´ç¨2N&gÓř–C %ńmŃ*í]>Ä]Š" p9m2>µĚY‹©n“5PfÍ*zUâŇ»É!±8űßI»ß5Mö=ú<ßAźjůfُűđ°ŕxż˙­öţţOý˙ôý±'ńLľţ“Żič÷ EÍó­ěé–Çű=Ă*Ü/HžB±ˇ±ŇŚh€®f}ćq‚!küMćpFĽA05á…tFfŁ\ďęÖë”ř—éŮŕÍ$p@‚)`FÉM”CúÉ „á0ę)̦0A|.4ĺĘŽ^ÓŢB‡ş aU4img@Ŕëă÷ů†_ţb/đŰcÂpżów–˙Ü牢~RÂĂżKÜoA¦hů"!î÷[c\®…'‘e› ¨\DŽČşx۸umŁąźB- ¤ÍŢ5Y‚‘ů}›Úý&€óŰTFp?đžŔäHÝ00“ő’¨Ů~_§Ě8R˛¸Ţ  ů˛Äa­F*µl×÷;fźoŮň7(qú› ß±ähYkňÂí~ Č7é^ŹTÍßš>ß5Z~ND©j`edki. ż›Ě±2_Ě6*Ă«@¦FÓçKęqŠĚLAµśĚŔŕ6`,”‘^;$Ńëw‚&np ŘĺÎřÓRrAďg»Áké‹r¦ŰŃçů:-ĂP1†?¨|˛ßK“Ź@hĽwćűÓzF˝Łĺ:@Kî¬*aŃ%Ŕ'ť›™SüżŁrTŮičѧ\, /€źîóĄ‹buÇ˙ Fť°´Ń9`J(ˇŔkŁWŻ×ÖŞđ6#.”©¬±«» )_1v6˙Ćą?ţťV:8Í<ߢĺ/Ľ˘Ä>Ţ č†~M‚äý|ĎôŞ=ęo’>_’<ś8p?µSj-ëé F é‡Áf`\p3łĐZXŽ,aEâ$<Íý0’’„Ut8@rĐK362tGéµńô˛+Mőĺ±r,ÚőlŁfµ)°\»#Xăxżkšç;}žŻ†żÔާńî(z4ôk$ÎóÝĹń~8›°0Ímä>ßTŻRŻ*Ź÷SRYĘvp M\¶V÷xL.٨¤­á{GÜOŁŠhRµ.í$ŢnÄęt‰ š\Ő¬TżńŻ"E›`yÉa8(ÚýbŻÇ±çů*3wčîŚ)ŘßQ௡_“ ©Ý/öůŞM2d)˙¦^Ş|ĂŔS«şEµgЍŞqQŰëŐZńh@ˇÉ008Łsąäç/YHŮĺţ8«sH%›Ĺ~N¬UŠ­ÄG%ĄiI«Js ůŤÜOíěq~ î×ďK\ďí)Ř_Cż&AxžoĹňť¨ăFĽ¬ł±Gđ˘@­·©ş ‘W˝—ÖrŽĂiŘ’†’ufE˘rÍČ7CĺJŹÉ÷ŽÇť\@CŇËÚ¸uLGśŇ)Ę´™ÔĄŚe˘¸ßç'™çű›ľ<Ű÷ŹĂPŔßTič×$ôů¶'y•¬Čb.ëµá3}éŞpÇ  –zI¨Ťu垲wÔ6&ҵB—Uâ0`Nů8$¤jS›s…~ת×ăëű ŔűřÍRŔß&Á5ôkDĆűiäć—GĽ¨ą›őĹÓáéĹĹĹßjőÍZ`Ö_żüAĎ{Vµ~ĺfÝ.žŔ:]ůňň±ĺ|€ŰëŤ*1š±Ń.×…µ|§4Ë—'ú^źf?ßáŘ^D?ţ>´6 ýš‘v?ŐÖÇË•1ţđW¸şČ7‹ŞuŞvző߲­˝őżF­Šo´ş­r>ńôŇ«(§Éii~ZĚ)h]żčł”s;6ěß"ťků.§ř¨­ńr쵝a|ßŔĎżľLCż&AŇ<ßďĎ4ëŁî_ěő€>ß1–÷ş3ϲ(óÜ7Łr˙3`źE‡Ňôö8š‹)ŢâKXnÓtĎ<ĺĚháŰ)2 ÎóýĽëqÄý|™ů1ö•đ׸_“ăîóuó €1˝•JgL0vQ~Ô.bőޱIĹ[1žäpxdĎ pčř(Ż/0YľUţ6Ž|E§`ŃÍMŮSčw÷ů˛„}=ŽŢîÖř6?†?3¦ˇ_“cH|řoă<ßÇľĽÉ+\=Ö;uĚ;Çjnëö"HUM9‹oŹ%ą3´hQ«*’/`ŇBtQęHWK^Ĺŕ…rŢ„´¸źď5·űĄąÇÜĎw N…~3ţ©ˇ0 ýšCh®Ç qo^»ň,Yĉűm*«ĄqqćféłÚNýÂĹŢ;AléëĺP]ó0n ŐĘkeŞ˝öĽLÜĚkät¶’3ÚůDűůy”ź?‚żl7ôkr ‘ąăó×ß˝ţ.ü‘Äó7Ď’ lV¶ÇĘćrş­W> LÔęţ‚řrxłcŐđ]¤R˝úr‚ÔiĄóš0ôŮ}‘čS a€şľ ¦ ô ëűMGďóMđgŃ/ŹĐ<Ňr ýš>ßÇŻż›ŇŽ~YÂáLůó»™~Čk;{µÜVÚşQ|™rv tC!†`ÂS˛_»CŻť¨ >VSÚ·j†÷ŃIÉ‚âp-‚tŃ3žú|iČËç§ă~ťîďeě{;ŕP¬ECż&AâĂź¸ßŚ~ĹŞ~as^ßOÍóŤG˛É^T,1¤w/-"D-Ľ+¬śžĄ•룖žgŃŁ“&~ăřqč^ŐÖu€¬w.•%VĽ ‚ĺ+»úB»ß1ű|ípâ}8é­őů69Š(î7s!l` S=6Ďźń®†qżÜAöőP?8•˘jöÍĂߍÇ|z×Đ+ë{Xrżś WÄĺ#¦Ôliä Ţôaa-ďđJ‚k•ĺý±ôv¦őůž`Ľ_gáo°“ÝZźo“#‰ěçąßŔ/íŕ•µťťÚćWsĎ6ŰŹ˝Ďűµu§¸cҧĽźŻ±Š×}Ż\â Ülá––oó} ĂQ0˝Ć`í}IuÖŐć8ˇßµ˘ç˙x쵝ăóvÇ&î ĽO/{ŐÚýšG`?ßĚý¦€ń/|~x<[ľˇ póüÔÎá.r«»OďpN˙rÇC ,ěôo˝{Ńo#+}{÷)¬ ăĄ^¶VŚT_!=WŘ·°«‹Qís,ě´ĚŘÍ ;â\ŹĄ×ăăý’ĹŕĎá}­ÝŻÉŃ$öů¦5^÷Łő›żă ç´/źZŮžÖ÷€~_!?Ć<ôŘŹ`‡]ŠŔ‰^Śú•ęžß •ÉŹC‹Yđ@‘SŇjÎE Y±Ť‰u äYăeÔÖĹELĐŠżŻÇx쵝żJÜďm~9˝uy_ëómr,‘=Ýr»_0†fţ7 t™d…+ˇ`†aPôĆăX]; ä[$x‚wLřă~s±2 Ëá’u™b=EEĘzĺäÇZÁÓMéTxŻ’SG”囸_šĺvýă)Űý¤‹CŤń;ć"W ýšˇ>ß)÷ů墦ye{^ă%Ň+Ţ9Łn\j±4Ě÷ž×‡/pQďâĤj:ď9˘- a_=íM¨b©=ä<íPśÖŘ‹ř{Ó˙ě”Â/šëqŤść{}˘yľwéĹ”¸žĂ˙ŇšÜX‹†~M‚Pźo—Űý.ǵ¶il÷K{şÁhçرŔ‹Ç„˙É6÷Pë1L„ŐÜ ň¦TŤĹWÔ˙5EËî‹Í9T—Z­s»ľÄLźł:ZCŚ%Xe´‡Ź:I2äą,Q+ĺŻńršv?ŕ~ďkÜŻÉ‘„ÇűM™űEŁ7ţÄe^6ŹiĽ_ŢŐ(rÓHŻöAŤ‡öAąb7~Źş†.ÖÔ– p¶Ű,Qa i°ůĚlŰäë‹ÓŇ7úYŘľŇÚĐĄ˙Ř”ľˇÝŹú|O4Ď÷Ó;Úěńľ‹cě~ŰĐŻIXăEĆűÖ×%üËí~cśëP“ÚÖxÓHqçťŰ҆g´ŰcZn™vlëóľh…_@Ä!nA[Ŕ­yđž·››Ra¦/ĐĘĽ=/+D{ÉQń<›Î´×Üľ¤ëÝ,SR2–đ¦yÝk­wcúöű]—ÜďTăýJŘËĽ/-ĚřÁµhč×$ČüđďV«—™űM7±§7Śő. ô¦śë‘ą0)ٵ7cítŰ㼴KoÚ7^č× 1”BÜĂ\mŻh`Ţ˝ćú/°“ů·e»_ą%0o$°áÚřÁٍyiłł6®˝öż.öÁü"#¶.é­¤ű|?ÇőýŽ?Ď×ýö]<}ţˇµhč×$ěë1˝™Ńoڰáď&v@źď#¬S‘ű}©¸_¬d©6ąűBmzťx\öG»ěćÎă íÉ»ďćÝÄ×Ę%µă•lŞęŢVë¤Đ&˙SS`PąÖĽ×ů&篍$8l éé×Îr¨µćĆeç‚q^ł%˛Đ<ĎW<_ź†ű}U¶ô)Ţ÷ôÔŻˇ_“(4×c⹉ý…ĎÚý&šđ‹ŐK·űőTÝň"ZF8‚˝ôł}É×âˇ_ëß`#o;×R]HPí~Ň- ŕ¸_Ëĺ™ ň~l k„âŽLÂ~Źu)l\eĹ®×f~°íÓĐÉŐš/a„!“rgĽß©ú|e-ż’÷űú5I’˝#÷{Öx p[üÂśŹ=ŢjZoű1Ŕô‚˝â~ńw`Ë­€Ś‡łDĄ (B! ·Ľpč…űá4ĽM7Ĺ$…ěU™;ĆHzĄx/ĘîJC/$bµć<×uÉóž ţŽ#*Ni÷űśŃď4ÜFř §ŕ}Aú5 "{ş…^ŹnFżź†  ĚőHí~Tąm»_®fšá% éŁÍ7ă•+Ě÷zbTFîAkÁA˘už ÷ÂÄÜŻÇ(}7âQ!xŻÓL=¬qÎamëőŢťČŐÜÓɡÂ*Řě]Ą6µ>ߣĎó ¦ďŚuyŞŰ)x_†~M‚pźoď7ŃâV‘đÍg?„5^l»ß:Îóőú|©o#s+ä~|eC}¬ůűŐś/ÄرɿÔl[ăĂ<_Óî×C¤˘őtlT‡$Ť˙ę¨čȨ™Ŕ C[е/ĽeWÝňn턺LŠń~§™ëń<ď·w_ťŠ÷ýĎ#©đUCż&IŇžn°ľ_ěáÍ;uŃŕa7sŞTy8±Ś÷c~eF±ˇ)ă["ŁJmryd ů‹1 Ĺi†ťHZ] k|ż¦Ř_:}ľkúĎiN‚u¦‘ŮEұ±2thm â…­y%ż+`m]7^=)ŰűŠVH{­h÷;Ń~ľ_}ĹD/-iztޤˇ_“ Üç;…>ß6łü?›xFăýt»_žçąßư“ 5…Aż'Z{¦Ćzćë&TńŐYŃ˙§ÎB$ŰÉŔIXeŔ=Ǣąn­ßAyo‹+kO™^ѽȊVl÷Ë}ľźźn®GBżx‡ŽÚŢGŇĐŻI4Ţ/sż´‰Űs˝§ŰłIsżušč–Wy©N§¨Őŕ%Ľ@6_68Ą% Ý)<€x‡ÁyŻ:aoá”­áŤńYŤO-ŕr€H žuUůéM ú<´ÝŃrżë“őů& x÷4­äwtޤˇ_“ ™ű˝ í~Ďfyô äQü䵝c»o¸ěT2ZĘĄÇ/ż5ŚOˇz÷öZ®µĂ0ťi —˘¦GpľŁ^ĘÄAç5[ĽěŤř2iG_¤”†za&¶Řëđ‡HaMK„ä“Ú W'čóÍ’Mß!ż#'ýUCż&I`mç4±—ú=RßGÜۨŕ~ öT”ëŚx :şU•~‡ľ ŞDjďĄq zí©*–r( Xľ×ű9ö5ôk’„ą¬éG{öMfO7śşXé óĎVŕ%čŃ8©cŮ>«*·7¸Ë'őiókÍÍâ´¸=®k™_%űšů©(M˙‘Ťjńrýٞ|iĽßqű|‚4ôk$>a®Çź˙üç˙ ůCňç‹?=Ý.^JHÚg ÖĽş&s%2Ç2•ČIą±6&*ĐS,=ŕ˘î¦P˘’Źj:ÖÝËęĆ9ňÓ2ŃčȆ –xůütăý†4ôkÚýţkzâÉ_nh?ߊfáÁ3*ŤAfë<ť{v›x(şÔůĄ.?>/su  ë‰Y¤®ý\Ş[ÁU‡.((ëű1ń»¶í~Çčó˝üĐ Ľ‹4ôkÚýţüäOŽüů/±'dâý|5Ë**ŢAXQ­˛V¸?%?:Ť©uż&Ŕ2ŤU”tÉ«›¦]°ÄŕtQ-S_Ĺ:Gc?Ň“Żí|u§˙űCk‘Ąˇ_“ Čýžüéňo˙őéő¨Ős]˙´á…ŔÖď ëĚ'˝Š˘rŐuÁKK‰5ĂT‚ş ľ+sr[ý” ;^]«Oů 0Ѩ!ŚÔëqýą ß1ű|ż}ý|ič×$Hć~Ż÷sĐ/pż.-ň\ÖJ–k­w¨BŘOÍt5µ~qKą.Ór­}y`z&Ú˝ĚŐ÷ç–¸Ăţ6ćě”ăý.Ż®®h»Ś˙Wá,ś^ĄźpťÂ÷erş¤KBú5 RrżáČwDż´ÜďçW_C‚jÓ–ڏ<–ž^TśÔY°+ś l: Ű쬢‘ł˘ž˝zîĽXâI@?î÷}żÇ›ç/Ł_üĎŘ'?ôO‡—Ůד†~M‚ _`»ź‹~ĽÜÚŤ0=băÔOŻ"–dƲ¬jť¶ĆjźŇ]–ač‹Ii A 7Üö¸~Ť8Ą3ŕl8T3ˇqkáňzťnzR-kĚÜ“Řî÷ă)¸ßUţÂß|¬.©+Řnč×$Čđd¤µť…ű}żh÷›ôľî®>kíÜQNŔµ…–zEwŞî7ޏľß0čý<ś^Śö­@ţ­ŤłSÁJúhH+üĄý|]|D«V±ŃłŤótŞ-â»ŔÖ{ŢDVĘÂź"]q^Űy¶yiČó‘ĆűĄ‘.{ĐŹOôú5ůđ’ţďuź/żÔë1Ĺvż>Żďrww7Ř–őýÖył#A6…{fjż>kMĆ冸s¬ `q˘µŽK…´_?†bOŁ%Їď ČJ˝ĽBn$N”˛ĘÁ‘Çűq?GčÍýJŁźîě¸Ňľ?¤4ôk$>ü;čó†Oř/÷ůvjO7ÁŢ*őj ÂôGµj¸÷x•ŤjĂKŻŢŃm©Ř$ăm–F$şsyýÄJpŞ»7ëehż6Eŕ„ Këű}Ř>ß««+µÂđMí}ň#‡Lť( ýšI}ľŔý>Dúý;őz<~DuŃ/šŔ‰"Lx«ľ•¸ĽnÖĘímë™'g©¦óž#ň`@Ă PéIx/ÍŮ%ý˝„«ňsčďR$›Ôçű9ýwĽ_MŽ5¶ą”†~M‚ Łá~Žĺ[ěç›ŕoČ(x7 şÂ RŮÝ&¬ # t¸oĺ_'F*Ëîst ¶tiďcö‚6őtAĐÉ»|o*Ţ|*)YŔÁŕŔůJ\fQăýN1Ď·”Ó_Cż&Q¤ĎWŹ÷Sí~v¦Ű°ŹáďŽÇż¤Ĺ’mŐ“+QřÎZ2|STüDNa«ő%Ă㡌«Ćőęşş>tdHÓ6ěfA‰2ĺ-_3Ď÷ÇÓsż†~MN,Üî7鹀~±Ë7Ť÷Łş•»}˙(đGôʶl‹ÇkŮŰ2oŤÖ籂zç·`ʡţ¤‚W0“”x«·Ű$g­ mŇÁűĎĺ=č”Rf9BxM¸~WPCq¬ăýˇt×)Ł}ˇS»ß5ýýýtűů>ič×$Ëý†’űÁú~=‘ż?ţńŹD˙¨…MmÎË»÷ĆÝĚq‹ß îä óF¤/lŮV€@*Šűq|ëÔdyO_Ú\]mă‹9ŠÇ® ű\Ö˶DKúÖ:@-fě,ÇŘĹyËÎ﮵é{˛ý|‚4ôkÄťëń  ßżÇőý&śëÉUż?<ř9^HśŹ0Cífľ&r5ČďQ^‚ž«uťh™+‰űý–¸Űë‚€ËkŇ‚ Ý!QÁ Ŕ2ĄŠÓŇE¶íI˝ĄŃăűTâŻďŃŻqż&©Đ\Źi¬Źv©×ą SżŘ»š-ßh\ĆšiŇ&˘_š>vň&wĎ%\Ěţs6Í{~Ą¶WúŠĚďŰb:žb˘Ě˙ÄÄE3…Ł–Č”Ł0şÇ/äW »/tőňę _aűŘkď˝:Łń~2č%¶űM'ěó=ˇ4ôk¸_uÄKŢĎWŻrŘź´úQŻŻ˛ ýŘĽ%ŰČW6;«â3%#B»‚b1+¶•Ĺ6żÔ’ąŔ±Şč¦Ú2ÉąŻ®îüîR 1:Eá^Ăý¦ËilÜŻÉÇ)±Ýďö,÷züŰżýŰ˙gţyÄËj÷ëłyx'ŘÇ8#}=­1k„Q ¶ŢZśÉçîŇyv„±~ĐçË>”Ţbýé*ę‰_Oçˇ ¬•:Ř~Ý*ÂiîÖç°= ©!…˝ÍľHĆM-Ýkůţxţ­Ď·ÉÇ-Đçű_Oţüď.…Ö÷{óZĐ"ôń?°1ÂĽ4Nń&Źáź:‘0®§…)g€Ă©đfٶhřÚ>_±|{dy¬ę $/ŤĚQí”2âĹ…eŁ_Ń/™óĚ× :˛Łí7)c­EČ?3÷»ćIny¦[k÷kňq ÷ůNăź˙âK—gşˇĺ{7 €}0ˇ¶şÝ÷PÝšqˇeßo=4\ţ•çů&cëśMŞ·gvQxęťÖI9™p(k™ ĺâéĺÓÄ}ć1cšApžďµXľ7­Ď·ÉÇ+ĂwŃđů^v/×ŇĹíĚ;@żhŢÝÉ4·¸łůb˝ŚAL¶0ąČ©Ţ “]ţ6ó?i ‹Ů] Ą;¸ŇRUÎÍ×bŰ®qoť9ěKgĂKx]ďómăýš|ĽBó|§±†µűÁ®Fy” aß…Wńc«”Řlb„ö<48Ç,Z\ÂIQÓŁ~oyĽËŇzó5“S …í>ŮĂÎśËDZP>,Q[0ŞdúÚ®FÓëůµ6Ś±éŁˇ_“ŹO Ýorđ/şÍuDYľ›ő߆‹´vFyľŹ?lĺůăçoňžn˙ý )Ć z üJŚY¬Ëµ/mżą–/¤Ţ+Jg˝nÖOł=îâđž•IEĂÂcăKűŰI«D^ß!ÇĐף-cŞgáý|iÔß±Öv~ŇĐŻIŕ~Ź_»ň,q@5×cŕ/˘˙}1V IDATź©lnmu§zŐjý>/Kl‘Tű[¤¤C_nĚű'cŘŢqŰx1€Ĺ,M}U)nĄŚU’Đ Äv?čőčZ»_“ŹWű˝~ý]ůyó,5üÉx?ˇÂűzeÜyPă„°j°‰Źa*JQ°Ďóeâ)É1ý”.ę¸!®2řd:)/&ľ¬ťĺúFőůţ(í~c°|[źo“ŹTňÚÎ/gz÷řőwaő7nž?Ë»=6»™;uuo+VŤÁXç io%ŚŮx5ż:ȧ« ¸h6űł¤Î!+ąĂĄţ ĺTl%=Î{şüSîőhs=š|¬2<á>ßýŇ”^ţK”oLí~ožÁś*Mőń{ŞŽVqhŮŠ,ÍĂ=ĽĚGE×`®xµ>=Í{}UíňQ6$‡.űÜ řF}˙ÜUßöů^ç^Ź17}4ôkňń Ěóť-ß Á/~fî—`PÖ÷qĐPq·J uęşe>‹¤Bęhđ0¨©“©›ľ©§yÜmŠD<”_LO»ziiŔ,J§L”Ž6•ňËí~a3ßk´|»ÜôŃĐŻÉÇ'°§[ŕ~ö·<Ä9Rľ.Ť÷‹ëű•Öŕ>Y´pŐŃF»[˘„•zޤPoĎjśĘMřŕd¬5ZÇv]ë˛,ޱ·ą)OŠőý"úu±ÝŻőů6ů8%?ü©×ă»)‘ĐÔM´¤sžëń\÷ůnĘJW5ɸĆ/Ą>żqÄÂJ_ ŠN)S˘ţZë|ű´ŘUîX¬f…xź"­keŔC\LY—íő\ŹĎy´sć~­ÝŻÉÇ(ůáĎÜ/áŢ'@ĺ­ÜBŻ­ďW1kËşç0)§Ú–ąřé™°ű˘^ľÜ;­tľBóÜ­{Ë4e“6µŞł”†™u˛)ÄR–<3Űi÷ËĂťŻˇĎ÷ÔÜďč‰7ôk$=ü»<â%¶‚O‰rWojĚ}ľEc©4_ŔT첒"šĆµ"Xٸe¬fßşőŻx)¨G}i˝…‚ň•tXř58Ú»ĺ§ăĐéEô»ţŃŽ÷Ŕ\ŹařݱSoč×$Hxřw‘űM™ű%Ôň,·`ůâľş¦-¶6ą§·äB–zß󑽼 šJYɦ¦HŤ"Úkř ¸„3{ÉТýöH ¸‘ĺ+­©Ýďäs=†ˇű]79ů†~M‚dî÷*[ľˇ6DŘ&ZŇů‘Ýףbů‚óR/¦SÇ+˘Ó)€KÓ=ăv‡ÍŐ}oď޵]«h­ýŘĄ\KľŞ”·ĘÁxúvż™÷˝ýÝ0üKCż&'<ŘőlŠÜ/¶řŤą×¶óČožIVQĺĘŠ·DŠ ~÷RË+tRUhë®' [„é _•-‰ŞŔöŇ5Oéúú uŢZ4uxŚ˙ÎÄšŤ›žßç›ÚýĆSÍőĽďí €˙rlÓ·ˇ_“ Üîçů&Łw–ů+Op ÜĎîëŃŻ]řéŐE¬‡™j Ô&{Ąp®úW¸¦AÎCďRÉľz­·@Ł!Š C:ŰĽőŢ%µęŤ§oʧJÓŮňý1vxÄe^®q®Ç©¸ńľü÷kr ‘>ß)ŤxIëYŚôďć~ŹźUÍÄŞevIY:(^e+˛ÇŤŠëŘ]8ąÇ@jĽ´×§Ň׾Z6ĄX©R*=ňĹę«fŹ ‰"fËW ôůž¤ÝOxßż4î×ä4ÂăýR»_ěëćz8Z·!+xz wE`ĽĎő8áľČű÷kr"‘ý|S»_jďËS>Rs_Zô4÷z(Ö”DݰäUFľ Ëzőú—ř–źŽjP,âó˘(‰Ő"—ĂT*ĚEÇ…ŘhíőźUĹ~Ć⦲¨¬í<ždŤÍű÷kr"ÉkĽP»_žß 0µüŮń~ní+ŕă`6cłx ŚqXN—XPÄ2i…ö+ꢞB¨ Č.r|ú\sĎŇ€Ľ§˘ßw'YăĄŕ}Că~MN"q_ŹŰ3™é–†ű‘Lč—Çű9ě®zV2U»ËpŽ-XAQ§Ě.Â>­ň©zÄľůş´=ąÂ.whö/ ô˘vF/. Đç~'ëayß;·ń~MN!ŞĎ÷»)í^™8ň˘¦4Ó푪aUăUcĹÎ4JÔöý>|Ačµ…ŁŇ t®:á‘OVŚS7h‘ÄÂĆž(ËŁ‡zř߸>LH_“,©Ý/őöţýs»źďńÖx)xß×Cü=RúIú5 bćz÷KÔ/md™VúËk;<еđÖ˙„]#’ ŕŐŚQx¶Ô?Tjrđ^zY‚¸Ř Ml’ »?é%˝\oĹ,fgO·kÚÓí¸}ľˇ3 xßĹ×_ÄʤÂW ýš$Qűz|÷Ăf3˙Í˙ôŮlŢ<â/e][mů*Ŕáš[%ruŁÔâHš€ZÖ« VŐ r±ćÁ‘]˦Xµ÷ŞPb×vţ÷t;b»ßlć"ď›?ß †GR˘ˇ_“(±Ń{—ą_ÜĂ-~=üśŽăÚÎ7q®‡ Gs,;®Ăq±"TqU›É\Ă-ó: ˝öŔUÉ)«fłńÚťq2K»xúę`)úˇ÷ŘÔ&©Űý~„ŐMĺ;ŢłÝo¸÷%îw'€x-ú5 ‚ÜďY’GĎDÂńĚüşi˛{ş©Şş°¸˝śÚ–Ľúlŕ%˛ă$â¦Vŕîä¦P[_.üđă˛UmJoJg UaÂpąđˇÜ|â©ÝéďéöäkĽ÷ľ&đ›ąß }9Š" ýšI†ĎË3ZĚ>ővđNćiUű w3§jĺ—YľĄĘRz ´_»=Ło —pSY/ZyÚťujéĺ̨Q,Îç¬ňRnqĽz ,ýŽ'ižďʶÝďčs=ű1óűąß±Fţ5ôk$=üˇĎwʇŔGŘŃŽ–~]î×Rçüšiĺ5yi‚™sɤięľUŻâÓÓ˛QŐŇ®XÖ  Z0KůĄt3á©\έ©ĎőČs}÷Ź>Ďw÷;ÎČż†~M‚đ<߉ ŹpO¸`â~z}?©q‹Vä!SŐĺ ÷r—qTq/aŔME;ťŹŠ \=©óEĄšÇvk„·x“”hZşMöčUź/­nÚ¸_“Ź[dĽŔrżpĆľlž×W9pk1ÚAŔ\Ż-u\«˝ţZCuߦ2,ůßkV–WdŚN÷§ęáÝľEŹ) ˇ*™Ťč÷ąí<ž`ŤËýľiÜŻÉÉ$ěç»KÜoó˘~ˇ‹Č_ć~ož™*fëŻ[q=©¨%*T&Ýż‰ÂąČĂzĄkťŘewt!$*táż%"ĺëÄ(~y¦§ąă‘çůÜ/Ś˙kÜŻÉIdř‚÷óUĆ/šÁiĘŰóg.¶xpÓ§…©WĐş˛ÎW Đš KK–Ä’Ň -U=(KtăµlűÚaŞ/,‰o%}ëĚÇjO·‡Ăý†áíи_“ ­íś¦xt`úŢŔľć˛ŻG­FŰÚşÄÂö‰K±d öřuPśŐ=‚HU­ŤRqĎ=śp f÷îŚç} Űý>§±Î˘ĎwîćOă~MN$±Ýďel÷KËšv-j?‘á›öóőÇűQ sĆşÔ«¶YjŻéfŘĐfm§—đ{vs~*Y02ÇžďÚ›…ŐŇŢ‹Ĺ~ŢĽ0…[ŕ~×Gdî7†e.NŔýfŢw÷¶qż&§á~î&^ßEwp»źeN‚µĄE Ńń,L§Ú*ZU«ĺ±IXNZŘ·“JďxG˛÷ŢÎSŃť7NQŚ·eż1éI îó˝Ë—ÚýNÂýfŢ7_ă~MN(2×#÷ńvy—‘) qżgűë>V˝ZťŻ„+IUĹ_Ż˝—m)ŤJ„‡hŞSQ|Őĺť~pÉ@Ô@·_:Uí~× Ýďmż·aŐĆýšśFňGąÝŹÖw™r×öů: ÔąěĘ«´Kł/¬ă»0-AAÜ ÍFł(=۲Żűđ#(Á°†yŽim ˇ§q:(—°vŤáTîꦧl÷Ëđ7lÜŻÉI„öő 6?îýPÜŹ÷óÝx5kY űŽO6E}-ˇec*xY˙kiŞpÚ„,Y¦MNö-jµ—Żş9:XĽ|{%ĺ›ćh:gîřO§ĺ~Éđťáo˙G^幡_“ ˛ŻGXÝůńó7ô??óćń˙›§{čń~€iv†VŹçĺ¬U&śéë˘qŁRЉbě6ÔÚČ&S.´şŕ¨ĎôÂ7."©¨Ť)×ĺ,_ĺŊϡ=|Lí~vž/·űíŽßçKđ¸ßŰ´ŕiřnč×äh"űzLqg+ϨóÚýŢĹ őý{¦ťë>;őĐ4 úy`ŚÖůjŻ<©_bşeâî ĹŤYˇËŇÝ(ŚdYßďóż_˙řÚýľřcţ׸_“ŁJë÷őÜďµjó›?Ďź1÷“ń~¦rY\Y5CÓüšlŞłcřöĆ+0*ë\ÁÔ2őĘŘ{J/SĘ%ćW/GĎöµîşTKŁĺëďévŇń~™˙5î×䨂}ľÓó×<Ě%<FG?<×ăýĽÚ_âÖB5.Č٦7uľ¶ŔäŞäҲM‰->łn¤®†°ý y`–Ľů“ńĎz´sř=ý/iĽźđżˇőů69ŞHźďŚxo^«nŢůďů?Đ©´ű™ZÖ;n>â,4ją!č¦\Ů#Cc(şś—Zú}jK—zÎt9Ö^5–˝VY.I?ý°×—çzڧ›ç ^îţ¸Zźo“Ł ®ď¸ß»~ó€żÇyWŹĽŻGÁ\lí­WB>vm´jňX%p6Ţ_ő4ŔĹĽEVĄ0©đéđý[)v&ęÁŮĄ•N˛ň#ăý®óä~cwBî÷Í a®GâŤű59¶Ŕú~cj÷ëxeĐňŚF˝Đú~¦ÖUŤ] oUăm)—ŘŚsÝWČâlo.z†®Íîą±ŤKŚîťŻŇĂ‚čQ9kźŽ.µűťb_Ź!.ngúiřKă~MŽ-ÔçÁîÍëQuß<o&ď·X˝ĘÚŻËĆ)1Ĺ[Ô@Ŕĺ[6Ýú(ë"^źQą’ŞšUŕŻËÁ¤xA3±™ćů^úîÚýnOĆýbOGë×ziÜŻÉqexÂ{şEî×MjĄżŮňÍ+=Çv?Ś}1 Łŕž9» ËÚ]¶ÖíEe‹Óa{Öcá‘ÚÍźK}“·<˝Ž Ç#3+Yq>Ň{»źďçÂýşĐîw˘>ßo"üÝń~ľm®G“#‹éóť¦gH´|óň?ý|ý) •Ú^^, @߯ FZˇ§i”÷‚ˇ‹»ë›źć":zi˘Ôv—»‡ě ĺ­ď7ťp?ß!ßüądš[ă~MŽ)<×#˝73x6„io?~3 ł-ül2í~űÖş[—ŕ´68S‚Xuá?UsĎrÁĘR§%8/رfĹŢl~ě|-q:TłBhËh{ď’ŃTąQÂÇ8Ď÷šű|»©;ÝÚÎ~‚ż†~MŽ&ĚýĘYî7ÍÜŻĂyľUŁ=¸óś€„‰f¦űqeÁßł ®bĘŐµ`‹FKŔŕwM¦fX«„ˇh "öf@˘Ő·Ę<Łkâ~ź'łWćzLS^âěTÜ/îß‹ŘĐŻÉŃ$rż[h÷›ąßăÇŹźĎ˙Áňťą_ŢßČĚó͢ÇÚQŁTyę©5hđŘ^Y´wńËĚÍE?Z°hUň}Ő_Őü5ě1­ ŮëąĐĎ*™Űý®µĺ›÷ő8E»_jőKŘż÷krl‘ń~i¦ŰĚýh?ËŔýž?K«ý™ÝĚ—+¦ćG%Ćř ˇÜKht¨Ny¸HÇŢU ±t “s—MŘź&ä”Ѳ“ăÇ‹?¬íśű=`žďíi¸_†˝‹o6î×䨢öóMÜ-ßČý"ů‹í~†=ĺÓú6ĽËŇ;Xa›Ř:Wtđ%űSł/gąľĽ`ăX;µ$™;Ăxtž ś/űâŕÖjWşňú~f¸ó‰çůä}sńÍ,ń$`Cż&GYßoą0ŢďŮ›`ő>~üćń›!ĚóĄŤŽöŽ÷ë x(ŤPź –°¶^>–×Ç+RpmÖ 2*8´!š:_ôą®QWG‡<.yŢ#žOĺ¶qú|˙)XľăxŞv?â}ß<ýć›·ß$#8›Á\ú5 ’ćůľ<‹÷üő4>{L;™?¦v?µŻGiřVÁ˝—Óń0s}”ôś\LuoŃ ÝßeR¸@ÓŁ[Ŕ´ Ë&KĺŮËo_–lř.ćzäőýNĂý„÷]$î'đwič×$¬ď—W¸zöśv4z í~Ĺx?]ů4ZůUŐ“ĄD­ł±ş‹Đ®5i1‚µCKí7¶2ź‡ŕ´ľ¤ČŁáˇ~#c©&Ń˝›¨čv?îóÍkĽěŽĘýČĚEđ;&ö5ôk’$Îővżq|öćY–Ěý2Ü<~V®oÔSĐh*ţZጮ¶{čZŠí° lZm‰‡X5Š»ŃלĺýTűmcČK/„’2Č(N‘ű…m|?Ws=ŽŢçÚöä0€ß˙âfżăICż&AŇĂźú|»ŘçűĽËűşq»_ílű|űµ[?‰ŠŘjëWü ‰ëÍá!U¦á@AĹ;úę5’ôöző Ŕišň Čľ#kŞí *^Íő¸6ó|ŹÚîgžľ€GÇľ†~M’Ăg·Jăý¦ÇŻ»éŃ›°ÄAű,ăý"ú=*«Řru-ŕŔ%i•jěŘr¸‰™SgXł§-÷ÄCźgą¸˘ő-9«#Ő«˝Ń¶ň*A őâ˛J”~j{ş…ąăíą_ńűúÝK†&MţĎźJ§S×®#JCż{ČđÝ“úç7«ł…«ß=чÚ!}ľ8Áßt¸|1Ý„ż/n¦›iţűâ‹ń‹|ţĹőgľ<Ĺků˙‹›ŕÉRcŠśN§ä4GÂI„ Á)F1Ĺ9ť1}‘ô‹a˛v7I]ô9IŞ{đ™|ÍQ“ć’(NgÓMNzV&CĽŇL>ą„$ţJů$­çrąŽ)\Ś`ĚŃ„XłÚ71ç_paJ,cÎ| ž.ęôćü|±:S÷r´w÷těďŇĐď2<ůçÝ´ ˙ăüýŽćďd>®ĆĘçźÍń?ŻÄoڵňĂ}¦ř?ÁŻűŮâőQď ™ŻŽĆŤŇöŻz1Xϗ΋Ż×R8­a-t-uż,k!–?~–îרBYýĂŮY@?íşĹŘ~nËß%ĺ﯊ăűĆ|uĹWď'҆~÷86Jd·Ň'gqŢIJ+B›ł ·đ»Űňi]¶Ńďö HżPx:Čç˝Ä‰ůţ‰yĺJČÔb‡eů 5—źÎźÝňwĹ_ůű«âř°8¬[pĽ¤|ď©' ýî!ĂOžľÝŮč^Mňŕŕ ĺ6üݦŚÄźóů`»3őęĎoW ČNľÁĽ;‘ŘCńV˙ąq•Žu}mhşXęZ¦y(B°ť“üvó- u/ÍŇí¶<˛E@zČÓ ŠÝ¦ŰĽúů˝ľ‘®ĹőÝâ0rI® ™{¨§Ąˇß=d&Âęěölw¶Šźü—.úęm>şeż·ů\ÇpĚĎ.hór>z•˙éřlő=¸śéß[Ôö•9Źn9ź/Wň˙Š}˝Jg·©$^r‰HÚŻT|ݍô’; ĹßRÂ)ć/ŽëVů}_ÝćPt´Ž;Ńă6űĄ”ň/ç KâóhJ?ý?ů?ĺ›îĹŮŽó&šašR&t´»x{Fą n\Bę>ćă÷°ÂźAż««Kq˝—Ëč+űĽRH}do-ţÚăűICż{H^#=ŽřvŮmuvëükÔ~1üq?R nľ·Ő“ŻżD»PĄRuýž}˝*|axÁˇČĎKđ—çřťë&Öň>D Q~Q—Ý+Ô„µxĹ0”R.c5écYeĐůžž ŃĂCĚt%ä«VŢ ę\ľ’4ł_‡Í·Äb´ ;ö>FüEzFV*S´+ţąüJňę Ż`%·»ú™Ö´+ ýî!4'˛I“˙$Y4ď ýżâ´ [3Ş)–«Ä>ř5ô»Ź Ó“8'ň‰-÷@S'ŁůLpÄžyë´©p$ĺňfF&'ěĂ䀂L*ďx`rD•«ăd‚Ť“I’‡R†Ş,'Ú€3IP̆ÖŐĂôXÔ^%…QI:’]N6ç¨ANGŚýš"¶.JS‰”r?ďggŹ+D»««„Tuô»OŹ~Ś”čççICż{͉śěü=îڀÖ†bśöóî4$gvŔGm¸Śv÷ĘÁěbÇ"üa]üá(KCJj÷l¬ÄV;ŇĎÍ!C†ęy¨ąŽ….óăéçĺýěěq ĹšłWüâ˙'äÝĆP?'šź) ýî!Ă©…¤2tŕěŔ/‰|ŕ*M\9kOgeDÂŮű™éKýń›Ü +×´˘PĂ ^đz|߯~÷‘áIj÷‹XłuËC¸–Ľ_ľč‘•-GAşZB[úC—}ă˝Č=Ů?[8>,×j€üĽ‹jeQ‰ř·;s^Á1Ä.Ť÷Ó-~áÂŮűYĺ%áÓ'|¬{6°Aś>q _Ý Ě_á˙“÷dř6ô»Ź¤-€^îgëĂm\&Ę<ćů çůwvŠĎń0lwÉ1]Ď‚ćÄ8Ň1î˙T„ţ•4ŕ,ktž2Iőu—˙őŕĽX"*´ is†Ďq•˝ÍCă ÷J)řĎŕBB©ĽÂP59âAä¬ô.ţmw&F‹ ňę–ĆżÝf­(ržN·+PĆćIŹžÜĘ`ĎüÜś—‰ßJbĺMŰ®8;x=g3őrśLę± ŇÓ9ßá<»Ă6<µď«ÝOľ3NeÄÁ- Ż4ĄŢŕ˘Ëă úťP¨Ď7š ń©:ç9ľ]Gy3ÔŃÁĎvŰôľMß«»’žđeB#q¦˙{J ĘqíŹ9ć4Ţ’[1ś;ŐľťvÉŮ9_-0ĹOĄ|ľÎţĎť«‡čí;ťCěä„űÁmŠ3‘ÂS;ÜňômĽÝ»łĐç{Ä}‚4ô»‡Đ[2¬†kjÁüź¸â6q«*[Fśm™sşŃlă÷ěČr!ťláň»§ )Žóá9ümłž;ĄLJ3ą c苤¬˝˘ÜŽ}-áĘ É’Űą¨šKŠ´ŽZmÝ(uĘ=Á‰§‘Ov ”V-Ű•ňH“kô1q^hb$€Ü8Rś;T$?ťéĘ(ž†łďß÷űEICż{őŽUÚ÷Î2'¤'5c×6AŽđ­řĘM5 ăŕ0ă™äĆ`Űř“=ct.iC˘Ça†ÇÁéI e•H˛x«TÂs6 ŮŹÔ{W0x/‚2lńŃZÓ0K ·ĚUĘčľłQ?ŻëL@¸ĹćČj©8Äô†čľ'îwnĽîb«ôv»ů~ďŇË|üůí~÷”4ěĹĚďpÜŢŻ4ô»‡PďŘ”Ű{¤:|źŮ^µŚz»„v»|>ŠĆ5>LŐ.śĐ[ĎÚze,›ŠľÁŁtË4âZąĽj§k­P «yô¬RjĎâË&2“t{ŐŘUZźË9Ä€6h&t›}Ś<·Q™Ć€ü|p[`˘©5<.őĎl‹TP[&x¬ŤízŁŻ€űQžÂý~_í~ż(ičwáń~Łí<‹čs6MÔ-G„Ť)=l;b~[iLÚĘů6’F‰aßÔˇ™Śč˘~l9˝čűśâP(¨š#Ëš &pYÉdŞÇ A‘UKĄß.7çI­?·AUú»R§­É¶N ”7`[,Ý·úx«VçŮÉ5 ’ ŽŃËV$ŮŻw[]ů—. X¬ű|wÔ¸n9y‹}ľó$a¸Ýl÷űEICż{íŢ•bj&¤ă·+õîQ[›P?~"ąË·]±1›ZF6ĂöVŚZéwÇDÍćÄ3TnUPĹ 31Üć/-w7&Ç-Ň)Á<ŞÜP5›QŤş­Žˇ-‡S‹ˇQ›ý'v¶ĺׇŕki¦ž«Č·+َX€ [ĄÎnUřAߎîřZA Á;µn±ŘXőťţ–|I¶É©(Rá~ůÝC«vż€¸_˛hN]»Ž( ýî!±…äUŕ~ačŔ-?š»řśíT»ßŽQ,[ĄŘ쇦´Ů ŚS6‚xF¶30ĆInŐ±‡uš rp ~”% {++PAU;™Şč»_;‰UpÓşĺzŽAá4ś Ź®s …Â[Š{ v˘íÖm¤b[6•!˛‹·r¨ŠýĽ(%µ®—•¸žŻ öyQ©^—-şpóKÜ2 ě!¶JĎ…Î.őĘ˝§ń~ż(ičw>ßÂňň'¦B˝ť˘bůqgR—ř[€#âçP°âpAhď“ÚłcűLŐ;&Šx°%Ó(x»(e*ĹŰVŔ®›Z|.Άf~Ů@ŢWv.[ ¶2_Ü:¨ť­Ú:HéV®K/{ŰÚ‹«ŇTß2ÜîxŚ˘)®|ŹuףńľAW4±=™#ŤÜ/?Ľh5÷“×jęó˝mÜŻÉžH»_|ş.Ő¸ůłi‚Á Ś%[éQPÍk+nĎSf­i&ÄđĐRG'[ňS•ÄĹŞ54& rő*,HU …ď ,ÍPž=I×LäVh•® Ąa†eˇŚ=ć‡ç+fá KIÂ*m|%C¦<¸[11„đĘBőę–c3zě¶ÖQĽ%˝ŐAřňVŮţ ä¶9Ji NŃ2ŮJłË*?§íó=Ť4ô»‡Đ[rtŮÉŮ÷>ĂŇŠ¶ĘÍzlŞŠ–÷ IDATao—/Ö,÷y$`R xŁDhęĹJ‡ŇČĂÝJ<‘*–(Šd0š@Îs«ŐV!ÝJŐąSN–ą`;#»ě<\Ů*Y!1S˘1”m^č•Ř&bu®‘nË´Ů´6Ző‰O¦p¬ˇ?(Ą¤ÂpŠ:OWŮŞ<«\‘îŘßk2şÚ˝z2Y÷x—ŇÓąŁńž1ű±ąćŚZłO]»Ž( ýî!j®Gz_ßň3ąĂť´˝çÄxvĐ%čń.•ĆÝŇ”®Ëë§ŁŮÉ˙vE3Đ PŽĄ!nkÎmď&ćp«ÜMDc žÔ_‡ă­hŕs„MMHűR3RQq¨€DŘLüPPŽr:)Đî|ĄĘ‰Žä~KJÎD `Ě\ĄĄţÎÎ&¤ @ó\`¨éí۸_“$®ń˛“5^t›;ĎóĄg}—IP~«Ă| u…&'HĹŘa]ÇŽŔťBˇŰ˘B ëVń sHQx6-“;Ó%–¦äiWj“"Č5ZR†ÍŰRI©×b”[!Z[*ë‚~ŠčĂRUAEß&‡ ®ńB'Svz ©‡€ş1mg/GNçńĎĢç|Ç—…Ědٲű¶hČKó]S/+g§¨…޵EUD"4[­(sj“Ň9;·°Ź mµĎťą h¶Ĺ€tpYŮmE'hUD.˶üS+¬LLsĂÜŇđ÷s@ižż"ĄPŠaÖŢ|c¤çyľĄ_Ză…_)ŰÜbŇú|›$Řç»Ićl|»2eRĎ:<†Ö ¬×*Š}Ĺ)hî–§U°±ĺŲĐ?HcçĘtm/&Ŕ`19–ęˇ şóĎBŮ$äÇ+ń"¤)řŠ^#Ŕ›53Ý•Î-Đ?—Í _ń–†˘§’ÓzIGçg*eúĆ-MĘ9 mźö­Ą›äćűčA9żŐqÎľ¶”˛ŢIřĺĘn6É[FrnőNĂŻVJçät%ZO!vZŰ3ŢM÷S“2…[NŇ]ä´ĄôD ňM:ĽTˇ`ĺŰR]˙˛ż0>uäFˇ˘ľg“**Çů3bąËơaWëóm˛W†ů! oÉů…©äűü»‹ß/Ăů÷á—.=c//éŕ{†ÇEśĹŮ÷g‡ŽĹFöŽ% 턱Zä\¨o­DMc›Î÷Ž''9Hă ¸ą\]϶ԕźďťăď}_’>}YřôÎľwóXhě¸8eň˛e¢č©•ŘžĹďŔýÎÚxż&{dOK9É­I“_°L0ú5Y”aśe~…vc)č·€}OŇQŚúX’›Ěo飌® â:¸QřńškKžŠ«]vYtPĚń˛äbé.LęŘő9ć´SútĄ†“ńŘUőźF)…Ú­SĄ´PtéŰ9†ý|߆~Me~N˘‘€ő«ó ¤ +\Í&9™ĐCÂŹeźOĎ—_—ëč†IO!ß÷z5Ć÷ć(;-]ÄK:żEŃcľär>iŹ{ĺ]^ť“M·˘“ąÚ=ěë1KCż&‹’{ÇÎÔÔńŁ5©'wâĘăÖř˝ÔŁF<µŹ— ç€<Ţ_@#­Ü»Dú~Hőr,~ŃŐ }Řh&uŁë·<…ł¸f¦]íbh Ť¦äĐú|›"ydÔY‡n_u4OňB±?Tîőătőă݉Ý^Őrĺşń®Ý 7>ÝşI•2ŮTac7n­ř´?{µĘB(.öYĎ:ü)ř>k~5č·R5DŞn˙#µ'Űu\4A“îS›çŰäľx2ż%_žég_ĘűĺfJ˙ĺŮÍ$O.żíé±˝™čy—ôťŞĆ•ĺ j—"o¤ţ§äLŽ(z é—CMňé0 . NŐÍ—‰r8†ËSÂČś¸R‰Uč¤O1Ž rŞŠŠň’ľ ]·ěˇÄÔýIJ3ąĚÚv“ŠXůfµ§‘}w*Ěĺ4 śۛܨm2¬dWĹ㉠Zë޸_“C$´`»źáň°F vc>ő¨G“°Č™ů‰đsĽSŃP<“AĹImÚ1˝•8ßPÉüÉÉÖŁĚč3_ľˇz‰™ŔâĐÎŃa˛%¦SÍ—bř"eY'ŚFex!$XsĚG‚Đśďc.;R@e¨ă¨8B"°ň PŃĘ·gůK鏩(?őĆ %`şW;Ýp:Đ&5#m›ëŃäáv? Łyź:M‰ÔÓ.U2=‘7ü 뇞QŕtĐĘÔ1caXŐšIĘť)ŕ•2Ä:1RŁ['šMą~aE¶1‰“Ń †Đ¤’R’ R&’:GlbĂđĺĹ4‡M”Xşěáw ¬I‚JÖ,Î+6H^ň¦Xś…m ĄfAŐřâ—hbÎrż™?Łf:~ *JŤ­ÝŻÉA’ZH÷‹Ďč—wľĆËÁ}ŽçŻ4¤*ş ĂŽŇٰ6%§8öŠ_ţ™úŤ‚ ň¬SŐĆ'*19q›(.·˛÷“*’Bs#c‡±%˛ë–Pą<¨*@ĺ„”t¤±Ţd’ľ†â(AĄ[G*˛zPűEY€ Î+$Ł_XôÚĘDąCżZ×tSáĺ!eA9€ĆŃOö”\§óŹäM”ňÍźĎů°8>ÄGn÷ Źů±ŇŞHCż{q?~t‡!97S|¦đyÖ6ń”árd¨ă‡?ĂDʍĽű'Hh0/!ĂÖÔ1‘0µF®•Pu’tbu’’\Ǧ‘uŚ3ŚÝč„ńn‚ę˘Âž ĆKDíśšD+Ô NŠeąËútŠ˘ŕ4š†6ť ĵn’«X¬mN‡ S.š—âŤň7ŇŹOŐMzŔ’{xČ$Éř•ű Ăó·]wblčw‰kĽĽ «äfąĚś-Â` ‚Łz@¦‡öýŤ+ ·Ëu,rÂËđ7Ąë‰$&đ¦ Ńâ>WÇĐĐ᫝` O€hęÄ3TíĚf„˛HmŚLa7‘•jČ‚‹Ŕ׍\sfŚĚ N'¬±LkĆ®!Żă¨‰˘¨7©ęŚÉąí[ Š0eěčđX/Îđ)EG8Ąß‰šKńÚ()k謖"HJĺw§(`„ňBeĺ&Ů4…î©÷Ő$vĹe|÷ć÷ô3z*Žą¶3_řśţúÝCŇÚλ3Ş ósôS|šn¶–Äqn÷ WR»ßŤő4M‰DRLÓ !`DU1mS•5»€Âz¦*Jf?#1ú$= N€şěůPǰCäC1ÁÂ~ GI—Áł@Ę#˙Ę(o%#˝GĆIü"tr^° 9„Q˘‘€ţ¦đ¬u; Ü+*(Ťß uţ©MÇÄď!!¤ţŔOŕ$OęM|°RjG\Űyx+ŕwqBö×Đď˘Úý ď”*ínyŁpjě"ŢŤdz䟨yą™g¸™}#LbňKŞŰŇÜÇ ŕ/Ő´7Ů×c‡WLSv3Pမ„aHUĚ鎬0ŵ^‘4î8ć_x! 炞q.Ä+IN 4ą…>g)ć~ žťEamČę=Ať>dŚžů°ˇr˘:ľĄ@~wČS›™ůÁ&¶R8GGl÷ž#üťŽý5ô»‡¤·dŕ~éÉÉDÓ⸮€S›ÔëqæíÄýĂů!MOq|=g¶ŻF1Yš7âČ1˝DÝ$OŻZ{RŚ.AéŔť¤{—+šÔhE%řÚ”±#1-ÝS¬Ů¦âDL[DA„rŽśÂ€C!‚ s™ ¨"最¶şÎ3vcys ¶|”n¨Ç$ ů~r6ĄDĺ>ŃÍI®Đ¦!·¸›„FËť…ů嫤“ĐňÎ$¶X–8p=şá÷F?ZP0ésÔyľĂEnű÷ű…IŢůôLúüR®G %>®Ěň쀍Ş.đ™*Ľ°;Â;LÇôůĘ#­9á8Ş„•tËdU¦źşźpŽIysň'ŽGŁ =QŃh řÎîŠ *fĆľ5˘ÜaáŽĚî8Ł…í8tgهW•‘‚*c9CI!Řr«P@Đ>˝W5YU÷™•—{É–¸ĺĎq×xIťßţ-€_Cż_’¤·dZŰ™źţ g&ngĘ. ›G“ĐmʵF=ˇú©‡ęžźq +•|äaă8aż¬&aŚŞµu'XOj:ůG "ÜH9’SPŕB ˘Â' ŘA$çP"†N2ÂŤJˇ¸´XR›`şŔX‹Ú*pQE!LSSŃQE5a!wČ`éd>€ëꙀQA”JI¶e<ÂhŞ”žňÚÎGŰĎwxËěﮍxů%‰ěëAµŹ_|ËB(ú•7xV;ż)żÓGˇ—~emőĽ+Ö”€:oFS ĎZCt((›F P‡hS>Ĺu±p X7‹~LŚ`m¸p=*˛nB†,>S!ÓűG2'śˇGň$u|ĂřoÍŔŐQĂźâ~X‚ĄęĂ\\•/–›†[Ďź,>yI„ G^ßo†ßřîŢŢťĘömčwᵝż(ä‡ćhş…¦–ĽŞéÍÍĎ8…Á8ôs]Śě_WÜ…`AµŕJ,éŽPYÁÂ:))¤‹đMŽ@x”;s 8–üt˘cŽž4ë‚@Â>;š‰,7F0|Ôa’©Ż0“‘’"Ě4ę Ş`ˇO¬±y9vĺ`GŽŢšę&«_¸##¸ä;p×iëŽĘťŁ8ţÚÎaηüîNdü6ô»‡ĐÚÎĚđqË/jŞIb"šHýÁ'_˝ĚGĹ`ĆQW…0dPaÍQuFŽŃEŠO,Ęt@9UEeźEl™ęÇ ‚ŕpl˛­§ÍitXT€EZŹů@ä%ڤ¬Ńn–fg”(2ĚĚÍÓˇş‹)-ŤD€köNvPŽăن[Ö®*ńŽĘr¤R„×+)WTápoʵà TĄ~݉Öynčwá5^VŰůs»ÝŃ×ĘügÇ]ţ›oc_ł—ů(¬˘ŹUşš˝ÝŇaň“ăŇĂ•_ë  H8ŽşŃĄUŠl·ĄtÔ÷üužż‚>té×9ö]Žm%ˇsbż¶Š™ÂČ?»m‘5L>ÇNéôkĘ#ýír.¶*’Őř×W.ëtÎŃ*Ý* [ŽE!ăuń•ĘdgÜ8Űě)—.:rÚé?źňĘ“ůٰxË8Éé*Đ–U w~ö:[ľOÂ(Ö#ŁĐ ĂŰSµü5ô»‡Đxżńî—%ŻO­@“&ŻůëîDűůĆů'§‚ż†~÷ěóUö‰/“s˝ęůCĘŢDĹ„=ČűĎSŔŤţgĄů~>(–wLŠűf>Ü}żwĚđ4{ş…ţNŇńŃĐď’ú|wgôôL‚ćąšěŃd}¸ŕ-]‡nÜ2¨T‘‹–=í• 8*‹_ś¶ŻłŁŐŢMSźOňçÄ­˛«ŐPęďI¬¸ ţ­¸~Ć˝ĐrSF­[Ů›¤ˇž¶ WŃëâ( -ľ|î7CßÓů?t|5Ý$ ýî!ˇ…$öů.=ŘďBm-Ż=ŃŽźŚT%íǢŕ>u+µ˝âßŃŮŤ_Cş˝>Y *¨‚+Ł/MŔâÔ„ó2ŕß!7w5śv´Şçµ&Syâ§gŮS<śź’űťţúÝChmçC°O“±p:jŐËÝÁ>Żvb dLúŐxquŠŮ cś8¬Ö¬›T‚~NŔs©'_QŮ€ö×ÓÝĹŹiÔ—'•\é04ęčrď˝"ä&N Wüá#S”•ăCn%B¶-3ĺ‰3ÔůWŽş§›ÔĄlřž¤ĺݎß=ötS–Šyv šPuPuMmĐŹłşŐ‰ÇgŚ´ŞuXy&.ˇj¤­g6BLŽ€@űĚ”*hózě›(MÖń˘g|ŕxś‘żM1Ů\[='6S „…dE?)śőbP‚Ě ŮÇIyEpꔣ ¶~$PÁňĘi¸ß OiŘË‘Snčw/IëűÁ~ľę!žđ±Â·´'^ËŤ­E é*/ţžk>–q”e € ŇŃëwăÝř§?ÍŕD®“–#ÔN¬úéd¸»»K›yŽW˘pŠJ9±ŹP[üÍ%ŘM—ă0ňfúŤ 0&ÜŃěß1í5@70«\bÎ8ŃžÁĽ$ö÷©ďdî-•T}ő|‡')Tť;ýµ7Ř1]óŻĂĆ"Ť”ťźęŰ#¶ű=˙ď‹çO/ÂoĂWţúýdx’ű|áÍ9J5ťŹ^Ź/Ć×Poĺ!VŹ{Q§3×™Ĺßô…§QOµG–NˇwűďçĎĚÉ?V. ™“â§ă‹»"üÍź‘™+$É—;ÇŤĂ]ř\"ᚊµ˝ĽŠ0G.d÷'X Łšˇš .€÷ e„W9Ó„74Óuęi}ń"ěid’=Rî'Ů)C âżčŹ{ŹĽÄpU.:ÁJÄe €ü, Ľ1çS+Ę}‘%É?ú”ŇÝUiŔâWažďŰýž_üwšâ{’~߆~÷µĆ‹˛AčŤ:˝xń"̤¤Z€ď÷QXˇ<Ż„V±¦Eć÷»´ŐŞze 2`)ýßgĚń¨¨qEbXdĽ›áď=Ě˙‘űŤČÄĚz!ś©;&îŤ_ÜőŇÓWTż©sô7#oćĎ‹»Żď^¤ŮĘS¸b,k;Ž*q‰20żHÚg™_I4<¤Ł–6†‡ppk ĽN)¸ů˛—Ŕü†ńłiţ·t¨¸á*?§˛]eŁwXýa‰´ŤT–”®-{CJ'ńNǤ@ÇçËĚ-‘űɇż¶ČŁ 9˘ŽK˝xŁrÉ…H@Ěo‰.=k{Ä>_Fľ§iŁąŻŇrĂó„GP!JCż{HÚýęű3`ř8†Çx†ľéînu7ČËąŕ@ü’3G ćŘm°Çó„‹ŕ‹ĽŁ—řNÁw€ż›‰ĺ(U€+7ׯ_˙ţ뻄~ăÝô'F»i¤Jü +}ćPiŞü@ě)0Řq&ăZ˘e„sŽ 8ßS%śµIÜďłôŤÜĎ#DL¤fî·˛¬¶đ/.Z^îYî)iaďµĘ\úJ™ŲT·J!Ü%"ńA›°âµŽ.`RlŇĄÇ)1¶âkWaóąźđľ!OubďÇÓ‹řűüX°ˇß=$÷ŽťůR&F‚•U¤T«»×^9X(’±ŽÂĆpĂęEřDđ{A}±fč79n®!7—3řm÷›nĄ0÷@MĂ˙׿˙ýďżžQúë€~wšúAŤ¬ňş îVĂj&€3_ťd·]…€–ü•µR`äf ¬ŞtË–¸_żĎźG.+Ř´„6ÂËů«?lăgć~J' RÂ(S^GşŁÖ’tĹ\tĽ°ő( yÇÜém}ůFkNÇëOSZŞö'ÉżĽ  ‹é]vÄąbô&ňGŤOgě» řÁĄˇß=„ŰýÔ\±şŰwű…;‹»FčgA%Úa/n~¨U°8Şë·ă*ÂŔ0Ýfă7E/,QIú ď"üÝ}=ł§)v óSĽTꏀxwů+â~żľĺ*R á&2ă·ń>F!łJtBßóqż!~†Ż…—›6RcŘí~«?|–dpĽŢČoŁ\¶ńL< v 3ă‚€»§tćIĎ„zŽ˘;«Ĺ8†2ŕĐę#…YĄ}­ä IDAT‰— O?u®ÇS?ů|Çţ aüßĹQÔhčw s=vg·g¦âŰ]Ţ«ă´z‘ěÉҶŔýřŹáQvń÷BGDţ üđ »Pďü\ĆÁ/|_ňN…űeBË,żHđ÷űĎf¤}ƦCPĘɲË4h N~Ă,1‹‹iŽäd`Pź€ÔČ;`śh3bę9Üo f{ěü ŔbŘ cMş)rżŐgń}öh…茟/B9âÁf~14†AG)/äš ”Â,±|s•‚Ż Š˛C7ä~ů):ň\Ź`÷łwĐ÷4“ż‹8ć«ăŘľ ýî!Ľ¶sQWRÍśĄŚ~­€ÓpĘOsËě8ĽX ~Éö u‚ĘĂh6Y†éĹ8¦ů37u´›ś€¬Â>Ý%řűýg±íoŔĘŁX‚ŕ!×úË›:Sžj;B‡ćT€ţ–ÍżÁxýl´;»)´Ŕ4ć˙Ë{ź%čŹÜŹ)%ÄŤ]3÷Kčw÷Ůdó¬ŕźŢ\P7#Q2Ă´vî&bŇz zhHËiÚW†ĆWěÎŹ4‚”Y—-0Ćq’‘Ç(µfu_Ź‹ |ÉNN™őţúÝCd_ý¬ĄÇ;ÂŮŠ—ĎťąUĄDČÄĺZ–+Ć`ÁϡNůiCq~n»ŐřB>ŔzřÍO¶ @T8}‘á/˘ßk8×IM6lŠvއ_)‘ţiô’G¨–šKYJ§źE¸ř¬ł°'´j„]T˛ÄýF‡űQv…ędü!îZ.ńŰ… Ą­¨łpő| ‘ň­AIAa_§Nbŕwá¦ě'÷şŁmATFFV(…šŐµYŔŁ )ţŮq¸pp‚yľĂOlöΰ÷4: ý¶÷Sµ j{‡Ü›}đ˝-©Ä  _&E Ψή[?FE…¬9 $a|Í€Ü/Q4fušm «šŃořU‚Ŕ!Ź…aCČ#G]_ĹeŚĚOF2"\âŰc4L‚ÜoŇÚćĽŢ„ŻŔýn3÷ ôOĘGżĚrx.ĂěGÎGŻ ŘĺH™ÍN‚>2ĹNŇß|;Ąąřr)PP­?+˘s$ M8 é4kĽPËÉÓ4Ż!ő†~÷ď§jKz/ßî·b&`¨ Ďąĺ~†:)ĚäŞ8ă\őüRçös0i]sĄý:5ýOÉňu /®ńĚnĂ—ËýÔaôŚÜ.\ţ,“Ďŕ2âŔ))Lăŕč;ôL–Đkˇ~”pżH˙FÖ‘É& …"ŃŇ–*„ _fŁń®nśBŐQg÷ťĆ2é‘y _ˇ'CîŽÜ6‚7ŽYPŽ/Ę«lJOŃ)Ö÷#É˝Ŕéřů‘mčwÁ}=ĚÓšk~đôu_&=ĚT ÁŻ N:° ÂśZjóî'L yŕşÎßavo®Y„űłJc‰É¨;=†K1§‘i”ÔD`ľ† y Ŕ÷™†ś%ŁaFĐ0ööĆ6C:|Ä=Ş,ÜoYgćŁÂ‘¸Igí„w]Qm­ĄşÉ#G5 łÝܤ¸BJ:H|Ňá…Ô©ń^JîŇ;á4ëű‰dř‹4đ8ř×ĐďBí~PăyVnóZ 0äén<îOí´ÚIeÇź ĂWÓ˝ŃyŚ#jr‹_řŽÄ/?Ąë|š–7ŕťé†I’äę4Đ3żŰřůőݶżşPS]÷3VËJ7r%ą26˛LX‡‘#ĐLlűł‚·ęWč“ŻŽź±Ú‰¸EúŁî7&î çpç#çYMšyÁݧ‘ŔŐצîó KKę§5ČĆ”Úě@iB8É1v‘¨Łőe:ť´ţp! ;ů˙Ůűr\ÉumËç=GFzç–w}MŕĎáűBşgĺ(7gŐŽqś4o ŻŚaäÂć0Qbł[RM4ŠP흊˘¤ŕŇâŢäVËU'ĺui&5ćX) ±_vr=Ž_ˇ˛3ÁJ’Ô§]ób,Nź+ö wdÔ#EżIýÁ©sňÔijw|/â\áńČ6úŚĂ5rç»ű]ü„OŞEPaÚŹ0ТëP n˛˙»cµ ˙ů!ÎfRoGbN^SëywhÎÍë»–RE:˘řÔó#d tĚ”'ÔÓoY´µ$ďtČäO„ćşËŽ1qTž¨,¸;‚ĘÎ^á07 ť—ťSó5ΆM8Ů‚4c7&xŇnŇóŘůϧO-§=Of|ČŁěxG?%Ůć"‰äLÄŇŤMäYÜ€' Rî†xŤX“ň•/§ćźîó}<Śý®‹ń˘4Ů÷č;řčĽʆ Č;?ŢšĂV]—«Ů‘iBŞűÓ:wkš†×ŘŚkOŔ°—c f&9U]I=Y€P¸t qĘ.ŇEȆHb‡Ĺ%bĐ7úŔICŞjéFĄ¨ł$&NŹäGşl¬ĄqĽ4NŤ1[Ú/^VöçT)^Î=Âî÷ďŹů$˙^o÷%Śý®ĹxÁg<Őîp‰Ó·;µ•31±fLëc˛X ‡­ŁpL^†ĹÝŃ1Ą ŰJ†Żsß6Q 5ͰxPQ|TËĎ»‰j-jŔH·‘wó#.RšAŔ…Tą źŁ­ł&’ČźXÖř•É»ĂîŇ nHS˘Č„˘Ł˘”ß)„čCéĚ^rIźéȆ[Řdئ9Gµxh’ht‡3Éq ]°®Ĺ_éŕRé[8Őůx鑨éVĺP3ő1âCĹ(Ĺ,é6Í[iŠŘŤ_sĹpŔÄl;ö§pl˙¨ůć•WĽň«kżÔfě·yđţ~üöi+t:éŽAfE6KÚ˘“}—ŮoÜ>É­>njb̤ Ľé©‰ĚkAŘmdŠ@áÓ<čIx:x—;˘|đˇ çҨ)ˇ‡Ň6%‡čłu§ôůĹ)GPP&śa“řsî g ´››łDcXó YÉ8©›c¸±ŐçŰL"ľ|F:Żl·H(xÁ<©b0ő!µ°Ą)˙ HpĚ"D“¸©K¬Q˘NÜeZ˘<¦‰'´_üs°ž řÉ0ÉBÇ"­ÖZÁÇ–č95Š]PBXűóRŤM»M¬w™‹Yüa’7‘ç< ”ĺMFçí!J=á ëĘV!5äă–i79Çű+s Á«‹śŐxÚňÁ‡‚çÖ{,żwühRBą‚–S…đóĘ™ęśŘܡĆ">dŤ)â0[Řž1$®qr˙žuéc©PŇż‰/q+Ťóýřw`´ŹČjńkü7.˙ńżÓÜ˙s9Išéř‚»ÂŘď Ä»äĎߏnÄ.i§ÜĚÍeę#Ă:Őg¨ĘI“%BĘMČÜíŮSť”/ĽŻ‡ß÷&¶yOM’MéçÜ $ŰM™őţäVęď ®Ź„[¶ŰŢąyĹęťĎ +r6˙ą¤ťŽů ŢQsBÖÖôB.ę>Đô*Ôs` ›„eCŇ0™ăŔ~ż˛Žä“Av%ur‚®ÝÂ.—˘”T^)ßđü‹{—bt?dbĐiiçÔv­w˛ĚŽvOwW¶)ÉTsĹČ[Śĺ#)vˇŹ×n%ě´Č|áOű%QÇČŤÔ&i¶dlÁ]aěw Ć o 9 ŹT˝˛±Ä ´=Ů +@f’cö•Ä6Řn஻ŐU˛…Ż&˦ {hCR­Í÷~:±_r±€ĂŮGŰW6ŤýéHľń®pÉuŠąsÚ1«U^ÖDV'YUOŇś‚7GVqˇ¤˘l8¦2`źBŕ)¬őŔSGl‚Q}ŁMŕŕ@ÁqI«ZE€âšxʎ§†ou›I1ąŇw”Ŕ}ňśä†/«ÔD6ńš´üń`Um•˘Ľ0uĹŤę3ă©[;«´”´ě[ŢDß)ćXr0Ţ<řŮ—‹´ĆXŹű _cż—B÷ý[˛űÉÚ2|˙I^®C2Dš•řýÜSď‘ J¨ćĘvÄ*čE¤Đµ/x7Nˇ×/TKlX˛?: ¨ś,·Ęö:©a V@« «-"mm§Łg#B`+ÍvDT bbÔ,¨@pč-¨($ŁěßvÉř—·a׫y›Żd!xśÝZĽ7±&­¬Üë()­Tź.0ťM/ YęzŻYź¤2/,ťn!GŮ «…;=“7Ą{ó řďŻýţýŹJă÷Ľá ­Ú’« î cż+Ŕźé\“ţSn˙ăěŻĘ„żť;Ş‚­ń_ž9‰€ň6BŐńbPŽ8”dßťšj™cK@äĂ(4Ő"(_ęÉKJ……phEÎÄ0tŠJ&¶ô’€$ě ¬=¤.3ˇÝŰ3Ń獕¤·đ——•3?J=Ao¸ )˙ŘťţÄ„™Ě%‹zşľŽďŠeO?0)NT:4^’Ët)W b»_…ɸűâߪ› ˙Ş/¸3Śý®ëář˙ř+ú7“Ł0G®“Ľ…Y@ťtů)‘쿏·m Ú WH/¬ę:¦Ią8`Z öŔëQ(ŞFÇ^vű`ŐŇŃ$´ť"–W‹ý׸‰ OĄsčęL}ü|h˙ă)ćOY!áĹE6dDęŘx¦IlŇÍ N4ÝÄ`ÝččMĆ‹pq[ľ Mq-Ř_‡cwń< –ďöčTŽPřśo˝ţřŢÎîâĚ`ěwřs=¤"`T„ßôGĹö[VoR+ęăěĆnÖPŹŐ ŞŠç%ĐR‚ §Ρ-Ë’|­*-ç¬ŕQű±üńGT@ŘĘË͉„éPýńcö,­<ąě¨°â‹ę器©®PxňZ1¶â⏠\fFV°Ľvw˘S…´Ëď°ţÁŽ|%Ű©GUHÚSĹ*„˙Ýbă‚ÎťźŰůyägěw ˛öűd$ǰŕ($ž©7âEÜžŐ"^ťą˘©Ú“•“1ß3ë¬ţ)kçś×Úö•Úc6Žm.KÔ!¤ľđ#)ɉChůU©íĹýď3đĹH„ŽůŹřŤK8ÁWlvc4Íä_+ŹŚď‘ąc§*_ą|}SßGÇKĘ•\./H>J®óÚ|©–^ĎŠńbě÷Z qľü΋•ĎSĄ¤;0ŐW~Ë97vöWf7x¦ňTĺbŔ:)*$gš\Ů9qŔîcýăŃĺXń…E,9EŽ„ŕŐ [ 7bt`E6Ś×‘娸ŔgáF§Q*ż’×05§]ĘI0)#jqŻDš ᨋ3«µ\DFLětĐJ­‰÷ Q&*4žť|•=5Wă[lgĂ0»ź¨9’ĄTŁ$ÝzżĐ˙›¸„-„:ÄŻ‰ÂţúHr<*UK±-«;Č'D pĽP¬˛16ěC˛CRmĂ(©Şý<Ęś,L<ÄË™ÓâŢ$©B8‚™(Fń.K¬ěÓą’Oś,ną8¸WřPĎ>–/fO§Ăń§˙F:rv&±LŽţXô·ŕşVĽrżłĹ÷3LCÄ÷w^R&hܡ@+™đÁüÍꊼŤ{ňżR}ô-Ë3EN‘ÚŹÓŽ¬E*߬Ó8sI…±ě}K^J˘!ČSruäđ±=9^FĚ‹č4Š†Č˘T‘qšöŹ%Ł]A6)CĄ}Ä©áý*ůůĂYyN©#gÚ€ź,¦÷?ÁČM›wĚŞČOýWŘÝ)_!ƆJʞ †T·ŘŢ´źa ˛w bĽ m@ÍL˙,Qˇ4»°$˘ţËőXŤHśAőÇĺŢŃźîä˙ś˙ĺĺJd]ŕ2Ú$[˘ř±Ánś8 Ož14ź˘ ÇŔÎfÖEŢ3‰ĘŤË/ÇD3íŚxč –!•8]ČŹs=Áâątt°ě®‚çöűdY¶éR{//ť:yă©Ď۲ó-$"ťŰâdxçŮ")ţś{šÝď‰0ö»ŕómÎÍ9 Żs 2?|ţnç4ϦĎ!ýž"Éé׫÷)mź7=ĹĎrűÉËsŠ!AčüĚ÷Ç>§ĽqüÁ}ÂnÓě‰íK_㱝ó!Ҷr/8ĂĘ §(­ĹçŰÁ|ŔIç ŠË¦˙N%†%ü\âOěěBé±X”ţ”źţ†sK—ŤźŻ|ÝXÉÓ5Pçś (Ndůw#Ňăů/.Xs¦CŚ…;¨˙H#7cK‹w*®+Żi?ĂŔXŹSg0|ô¦ý K>ߦë ÷ÇŻg`pťëóżÚŘĎ0 čďgěgxY8>ÓDö3ígG¸KžÝo‚ýşNO°ąř›raW$NoLŚiX>,ąN#–ä-:‘öĎŐ_bżb;oĆ~WúűťĆYc„üz´˛ôđé‰Ę:•śŘŹ>bKťZ¦ˇő墉| »€ĂhÎťÚďlÚĎ0‡vżqöËßśvĘoLĚä_}b2g).e2žŘ°?¸žşWú¨ýśů| ó×~cä'ąµ>ő÷XâIöÓi&ŮŹ$¨µ|w‰ÜňŤ­Ű&i?łűfµßĎ í7J~uѵ€ýęKĘÄ2źíWnkŘ BđczÄźwM×ökÄvŢ8Śý®Ŕ¬ö[Ŕ~śž&ě~*±\Ň•©Kí§rĺ¦Ć*‹öž…˙ ţ¦ý c=FHcśü$5I×lWóůŞÄrIŻ“Ţ rú˛$Kl-ß˝Âő->â|ľf÷3ĚĆůNř|Ż€qáđ}pxSĚgěď÷ŚŘÎϱßÓ~×ÁŘĎđ@¤§˙ĺgëďgX<Î÷·±źáeá{GrĚçkXŠđL·ćílă| Ż‹ĐßCrÁXóůćî’§é±Ű…IĚGb»gŰÇ€hĂĎÁĆůâvż%G·»rŹú»ČůŞ|){Ös§Řăâ\:îŤ^śÉč°•j—Čú^GŕĽ8¦ćă׋}m–ţ: óů–aÁ8ß>1Ý]ć(Hv`ą|ŹĽ»ßh‘®đńîn3Z¨ęĽě«x9űUŽt"“Jq\CK+ť(GŠGl¸UúóˇíŰ»_ů7k?{®‡ałc= VÍçűŢA•ľzŹdżJWëů}Vtăl|ďEN j”Ę ®«jőÚa\V€ÇĂ©—i?ĂĚiżŽú-Ź6ßŘ4Ą!ˇ%Ş‘Ul‹E8Ý}šŘL¨Ę˝ś'ĘS=xE g٤ű űő:Ͱöł8 b]±ß±ËÄ}ű‰…^’źŮý Ë0ă…†\ÔZI¦F;b‹®Řśr`«Ô÷¬‹!ŘO—Cçîhţ(FŘOŕčŽf0ĘxŐܰ_˙ő´Qźi?ĂBä»äöË’a’ýF}W˛ßřć5ö#:Î~ăVŹ='ž9ŠĹěwťjeżţ˛–ď’ŁXÄ~[ŮýŚý®Śő8/Ó~=#•¦*˘˘Ě‡VŐTĄâŘi¶)÷Ő P’öRö«ÎőěÇYűŚł_ݧg“]Ę~ĽĚ[%?/ŐźŤó5,Cë±@űa /ýąS”B[ń%uűŮűuőÍKN`Ká[çE2ĺmƱĘQ‚{aű1B–W§v˘lď2çňD=NYţňżÚŘĎ0‰ą/Ş~Őjů$űÁVr‰Ě°§Ś5ő±¶v±yťđCä_ĂxéçůÎUÂË*éc«ôĽö»¨<ă‰K­~e†ă"őéđćó5ö»s>ß—ĆöŞ©a xŮô5ígX† ÍŘĎđÂp˛ékńý ‹Đůoç¦ů|Í/C€gĘ/ű|]s6ígÁKŰý †©üĽő÷3,Â=bĽ O…çĘĎě~†Ąëa0lRůŮXŹťa÷xvĄ4<ž+?ëń# áúĎ·˙|‹_•Wó˙ľŃúďđž~}—_l»Ľő’L®éňĘWxçźúćĺ;ľ|„ó/ćmf˝±ß^ •ź7źo÷Í5˙Ý„/˙}Rź Šß®*9˝Â<¤ SßŇŇĽ ¤ő léđUćáĘýÎ|&·Ă˝@y˙›•0ĎĺŹ.ÍËo:ţ×|˝ö›Zoě·đÎÎf÷ M˙€SĂ`ę-ž…SąhdÍň”cëçŇÍeZßţ4şţTN_T„ ˘z i­iżÝŔ)ÇÇîÇz¤ŕ%c8˝jś¬ţg|PÔ†%\JdŻNxonzµ±ßN`±ť+ÚĎÇŽlńuĘßr>üžq:ĽÎyÝ çĎlëłHĎ·ăŻSÜîÄr:ĺ}ź0'HIKĎb;ůâ%=±ýŇŘkS™˘ůł:R,ÝĎÇgóRź±ó_δߎ •źő÷ŔuM•r$yiš‘¨çd§LKđ­·/·­S§Üb,5Qdyśz©Ś’ ůŇÚţÎ/ôi𬗟ł‹ŹôzvĄ4<ő/{~¦[ńšţ†"‡w{v­4<Ňăkýý`C;?čľťXĺh~HsÎĺô_Ef|Ó{u,­ă®âô°Ť«ä^­8 (hNĄ¦Mő.‹ăfG÷/~t…ňˇŔµvĄ4<ćó­Úý>›0Ţąěśâ±‹ŻvúpĹś+Ö:–OçŠ9J_î§ľ÷ňU–ĆU·wM˝4ežĎë˝ĆĎÉđ—ßłkĄáAp*Đů|ż»¤ýVw=6†·pË3í·pę3íĐ}k˘íÇEú;¤zq É),H2ÓćDYŇÜ9N‰™´ś8±B®‰sĄvynčýb8Źś«7ĐýĎ®•†Á+őgvżţĎIűB/·CŞŢĂd0‹'8cĹ?+†d‡ô–’ý<Ě…M‡ß”ę Ű ŇŔů6/ĘŰ!NeoäĽč”ëńąy‡Mě;esN ĎąÚÇ…‡+Cą©dé•ĎEŁŠĚř pu®NÍç›Ůýö…zl#DŹô IDATç]ŹóÍôďůŹÄ}‡ák^aĹ4Ă×,ÎŔK„÷śA± ~Ţăç$ÖśŘ7â ×/B™ý©HđŽÉ÷o˙“ ÎOŐ›ů|w§ÔźŤó vż·ű!%ť™¨Ţżçúó.RĆoF[ď‰h’3Ë»}GöK’2ŕŔ Ňđ%Q‡ťhRćŠ?§bź°Kł1źw–É»ČIXÁ‹€J*NW\üfÚogP®ĚîGÚĎS%Z.ńM µáÓĹĐëP°u]$¤8ß±t@ťá+n–ľÇ­ay—ÖĹĺóŚÂÝ;Ěe¶âäUcÚ÷k\ÍϵTâĘ-ĆŽěoyÎ|ľ»‚SęĎ|ľĐßOpA$¨pW"°CţĹM“ŰĽ§ě×ĺOČSAŐĚŹü ó‡lóc\4Mg•z«Ń$:čMÄÜA&{™ŔhŔ,n0?łöű4öŰ ĽT¦ý°żźs¬Şçv/*´¬÷2ŮE _ď1ĹŇď~5-â¶ŰAýĂ<'Vs‹Ć,á]˛—R“Ůa|ŕŰ(ujrź$őńf#O&ŕć?ĹÁŔL4w8łűíN©?óů2í}¤hÇĆ_ph$$Őś•Sv™cş­bÄwŔ†®Ô…’PxE%O/Os ŁŞE¤µ“Ę ×é–5éI±ć$2„ěŔĹŃ0~~ăÓ©üČŢŢR7'łűí6η¦ýNäóÉ—¤ç)féŁ/óŽÔŇťE+x Eľň„şX<%Bş)AdÄ*u9Ai•łótČ߀w\˙.28©ýćµŇsĘ  ţ†/Ĺ–ÎGaÚooÝť-Ć Äx‰ÚÍeYeB;pâ:píw&eŘÄÎŽ~Yű–táA4ŹëÔ…Ő5+ĽSú=ÉuÉ쓜¸rËŰUQsgĽ7|)»˛ŃXl¶µ_9 6ć0oĐçk1^v/¨Ď|ľßĆzdŤŤÔ&űq•/ăśXí„&ŔáűĚ×W]JRkZ˛'ĺy8UI‘ü™LŇhśĺâŰ SC ß;ŰB ALxsś27ő›éî˝QçS%qhÚooĎó5źďđűIźoî—rDÖ%Ĺ–‡tpłß{6ăZź6=§Wşa%e’Ć“°şK ć]Đć5ľxç;.‰r5; ™®Ňv<ĺ|2ĄĐ{ĘŤxXay•}§…¬ÎkŞk2+ţ D$łŐŚ~2KĆ,… LN7šˇ6_5H ýžŻQ´űĄk˙ěJix d?çcĽ8´ű••}UbŕěĂĺ“SčŚPąËÜPF=1'Ř83Ü3[ó`ŕvçFŇôIĚéF˙ó;Ť”Ő ŁÁśNXŘóÓćń ŕ¬żłćpqq-ĆËŢŕúÂç»óqľ™ţłÝŞ;×^Č,ďT­˛N:•¤)ćaű“lǦ*y˘•ĺ–rZi9Ýň´GLۤ§ŘţĚŹˇü)JeŁŇBYBÎ˙÷Lůňó%9đŁ t~¤LžVčU]z´oČĎčďëĂsĺg>ßŃëá5HWpĎ)ĎÓĺz]»fV{5_¦šÎ‰gä+‹+éGJíY2 Ěĺő^oWßÝXôîWžŻ”¶ŘľÓTpů 0í·¨ĐöćóÍ1^ŢÚń:<‹ËĹřÖ—U1s-ŮŤŕ9Î{ľ–D.L–Ę1±Ńى˛{ťŇ«ťŃNĽ:ˇkĎS‰ Ć«k¸(ćóÝ|/Ű›öűŃąĐô'í7ˇňt:.J•ąo¬¶B­ç‹ĚyFX!ät-ĹëŐCF˛dYO!áCŠ|:מ—E›?Ę\řpíÍç»#Hĺgv?čď÷ëĂ$ÎŃ•ćč!|śŐß“R‚e™r€x|Ęgśep˙°;`s`Éy5%ÉaŽžý\Ŕ±čŻe»ÓZ˝]y>íń¤K—)ýđŁĚ›’ö3»ß :;Ű8ß<Ö#jż\±ňT`ń“+Śoł°ŕ5lX|D=BT“·‰sőäY§%$ő 5ěŽ3&Ăr+dLΊá)a®÷ˇěHUGŘ/÷ŃA®lăř}»E‰”_$°#4ś×›çg®ˇřq!¨SŘ”ĆzůíN9>lśoŠńµ_Hů«ő©}ő&®ö¸zÜÂ5€ŘőŠĐI-çą6iˇňňŽE–¨-=±oNĎ2a•wěI5)M‰Ć=TVśJ‰Ý=ĺ*ŇĘO8W ŐÖ›O{„ă§3“›Ćâ°đĐŇ"¸ő›ĎcˇMÍîcĽ·Ď7aýáâhPNQ>;rňC”x’5 ˇ*Bâq¦GÚĺđ Ó ˝ĘŮ-k÷ˇ u,˙\$âľ\bä%M[lcŹ©g$‘ÖČŹXž(ë+dř»ÎsGEŔcN…gĺ”śŽ—nýĎ®•†A*?o>ßî{¤˙ßH3ئĄ ž›ŽŽ×F‡k$ń„ů_ősß…T#×%t;ôç0,őĐśă+L¤ŮCČ~,ĎPai~Ĺu¤Ť¨áW•m-‘6˛ŻH7­ őś; .ľI\L|ży©Tĺ±ŕÝ„ ‡w—TNÇŹČ|ľűBý™n»Ö~Ńç;h?˘°,° ^auCt!ę5%{WĂ!v¬îůfđß]ŹóÍ>_iĆshÂr`1Ć9QÓZ2ĹE÷hb#ŻßgĆTzĺ)0U[W!I.öPŤů‹´#:hŔ7ú䙕zÖ~-Kľ1 Ü‹§4ŽqŚ#ł¦¸CdňbçŮrézE¬ĽÇM’ęB§2«ź8: î–ű| »€SLűĺţ~LL¤Ž¬ňyQ©JBE#i”ębŹr‹Ţ­§V*5×@Ű$]xŞÖĂ$çő$vCK›Hi ~±…H|ŔÚ–ů0 ¶v%˝dĹKg‚XŻ˘ÝRÚ|ľ#|ézäĂü|—Žmś@ĹĐŠ§Ć3ęĂ|˛’Ď÷§±ßN źéfv?x¦ŚőµŁë>şŕ1č:¤9Đa".Ć–]ŞbĽŻŽ*Úě‹|{ČěÇ[–ąNźĂţܨö š±Đ’YO¦ýÁ®Y­?uX×–/{­‰i†šŠÄqŔ6R?r…‰Š7Ë`Ćé´{$^VzsëáL#u­:¸7ˇö#fníZĘ •ÓĎwgPˇíÍç›č˙çÓ+łşë— A}t@4-Ő5Ď{áĹ–čÇżúáŐ!ąĽąŽc/ç!ُn¤ĺĄ]Öwýőcő$´Š‡‚ %;ĐwZÇT*25QIÔí!§ÓSc—É*ô1†qrěGô°ámX.÷FÖŁNtĘsTÚĎŃ!2Í‹<Ť‡“µź=ÓmO±ťMűAlçÓhą(îü1(ĽČ%ĂŰ1č˘űp>Ć…sQşĂşa« pN¬\ý1+ż@JIŮe¦bµ˝;şĚbˇGöűëŻt©ŕ7kż_±l ‹±ęÉ0sDJŤ_iq:I'Ţ|npŚüśCˇÜŃŞ—ă ‰ZqÜ8µ±v1*Í‘őşŕKÉ„`ćďšöă R*Ó~;SęĎě~h÷Ăš´_€QEE2Ě’đ]âGhŢćÉTبë˙EŻ_ÜÎÔňMɺĵaéˇ *(ú|‚‹ŻŕWjża=¨Î°ô„˝hţRZ3¤ŤUÉ8ĘŽ'&IR•b4WË; 2ţăęís˛MRN®wl56ĂůaPáŃeõÓtŔšm¸ögÓ~» peă|Qű±ú“…^`´ZÁi6V˝îOhűc^ť'˘î9¦ Ăuö/fŻG¬„µ)‡<]hŃçë˛öK˘~{^쇍ʙţ~Đ„Dćclˇ[·Jűá ®Ŕ´öCzJvEß‚Ý/ë@LŔ›Üś·8W×CžLćo”w|­SeÄÉiµ|4źďÎŕ”úłqľ<ĆKŞZŃćÚĽAďA#öM¤˙Âj©0°`ćÎáű—OÚ/H·DAűČî×űˇ)ëüiŞż‰ĹFí~îŻdřóĐöŤyúaţŻÜ&‡řąŚ‘ Ę=śc¬ŕ€…8HéÇeXÎČx§ŇÎFb1eWYĎŘ•±:ć™M{XŤÄíTv’»¸Wëď·/x©ţĚîĎó}Kő$|sSÖ'Ó_žwÇŹlGëş6.O«c-ę:j˝AË7’Đ_`ŁSÜţWlěŻcÔ}Ă÷Gb±vÂçë°Ĺ̨Śi?ŞŇ`ĂsÉLí”Ć´ĚMŕA&8x\8’sY‚1Y¦ÄĘLq0f„ŻG:ĺć>ÜŁĐŚÜ:č#Wĺ"ăČ6÷÷ű4í·8ĄţĚçé˙ó ŤWÖ|ňbzKÚ.;A2ëů®c«}›LÔC&´R#íu`ůë2SeŻÇŻx~ 3YOž˘„Žv ᢺăŇ/^5tS(h[¶[ĘŐě~;ěîl>_n÷#ˇ#Â{Zr„µŞ’říĹŔ~Ǥý ń›ě~RűąÄkQˇťÉîWx=<óz@‚÷#”+ŰĂ’ŞÝ/S¶$„Ě5ÄšľšŤĽ4rwi?$.$X’zŞodK[J? *ŚYHę’5ȡ4ŔĺJVR-RŢq;Ó~ű‚Ôgă|…Ď×Q ?nmĺ„‹sěăŘ4gAü ^î_ĽË z!2áůuą"6Óă|˝#âÁ÷{BíGE…zßtŚßĐÚOľ”aŚË¸ÄÇ­ôSYbŔ¶[S3Ó“ÚTl*vĄĹR¦Ł˝T+×~Ęńy§ Ů3»źĹxŮäó|-Ć‹Ň~Äś˙8ÂďŃA)¶{=—%Á'úűE»ß™|ľtr Źvż©±ż€bAcŹ>Źc=˘ök»4Î#iż`EDó~bG6€¶ Ş–q“xl—ČrśĺCtĘÉ…®Öv¸«L“JřI¶­çd`ÄäĚ'ĺ­ŁCzŇĆzě ŞákvżÂçËę«úR!3b}CÝ瓾KÍPĐ~žŮý’öó‰÷PűŤŚőčsiŠ=ŚçČÚϳ…´IkfMš-€HńPdf_¬5Pw[Ş.(űtX7Żň¸[BJOýýR——đîŚă2˛Ď·:Ö#Űýre߯KŢÔ~]wü@źď{'4—q4EB) YŢ2f&AÖjĦ' 0ޮ̴$nG-ďpWňćB»f7).! /v‘$c7X%¨•‹Ć¤ýĚî·'Čţ~ćó%źŻCí'›|RěľÔÇ´Mëjc/ZĎí~ŐţóůVĆzxăŇR‘â,ďďçŮsßÂjŇ~ž8ŹN¨"b;:ň–ô Ť…";*˝¤Ţšć'ŃĹ7´ÂŮ$í^ŞL%.‰ŮÎZĄ°Ď`Ăw&ícź´ź·ţ~;‚“M_łűußżĄqľ¤ý8÷i݄ңeĎŰ˘Ć ˙,ę×R?Ç”d˘¤ÓDoçl÷CŠmqź¨ý  ő\›×ˇRJ[2VŕŞH 2܉ÁFtxfDKÝ#;<e'®ńÇßGĚĺRWKαśčqŞőtޱ`- cĎőŘT€+çžëí~<Ş o2ť&ĚN$ŹDýŃ~!Ů!Űý ^ň<ףvÍ”öc%ÉńS?¨őČ4AO’Ş#3;:Ů`gňŹ,h. Ejxg)‹,I§IäG¤…óśôp!–އ.¨á–…ĺĎΛgŤbÚ;čT_;Ěxő`Ď`ö‰Ź´LOµ´Çše¨Đö6Î7Ó˙›Ł Ť%ÔzH|n’aŐtý!?•mřĉá=ě$ŮýÂş¸ţp:4˙Ő¤ŮSz¦[Çô1j˛űĺ”áo1ďSxg=ö˙6|ĄĚqť(Ć`!Ň€ŁŔ†1ýđe j0ť1’ÄŽ}$˙hKÖŕbĐăŚpDłĆ:%% MšZs"Ý0ďTP*U>PЦ¨ýţŕcřŠńýĚç ýýŇ3ÝpT™Ĺx§¬^253¦·úŁŮ`@Hˇ˛7#W-¶Ň®Č“(I24ő‘ăV?Ů<ő‚µ”p#MěĹ)`&7¤3¦#Yh‡ęDĄŇpÚř@÷/‡ŔµŽĄi©Á›Çó%XŇ´Ě>Č~ ˙X# „T~ćóEź/J¬b¬ĹHb‡/0k”#¤R8c´Te«đ<ťÖ~Bţ”›¶őČbđüź;v”(¶¨ \˛ âqńö¤6,[¤L˘9~L°–K+“Ĺ4GĚďÇ“ć`°W˘k~ěÄś‰ ąx‡ř~ŚýňčĂW„|¤‘ů|é™n$"‰ÁZŤi É Ş^X­=ŘĘ:Äz‰©I8‘ q’äp9©‡7ň×mlŤŕŞ–b°éÇ‹çxż=^@"?NžŠH‘îZ±s^ŚĽ+ľ1ďé!žL"tŢ<ω`Ĺ3ÄĎA>¸Śi?ĂW…T~ćóńýZ÷Αdń©-LBĎS›ŠŮ­ŽD™ŚÖHˇ€˘¬¸UJ*ˇß4ÝćÚŰzҸMMvśŮҸ8ÓŇŠî I ćp ž¦yłZKK1EDËĘ«Ą+v¦08*Ý(ąZl=–]śÁ}lHNöůľk»źqŕW…çĘĎĆůţ€ţ~y¬‡ ¬&Lů`[Ťd Ůbńٰor' CUŤHÍ}R’qYĹÚy?\YRC5oŁÔž“3$ź »‹¦łX`<#WqúfL–sÇ#`Ş®…}‘ćËIYp|Od»Á“ 6—*“ ŚöM nGĄŽ‹ÁĺÇ„ź5|ż2Th{Ó~Ý÷8Öó3UP0ôKĆ%¨b^v ÔmĽÄqśŃŠ řđF#6Čř›šz$ix —śÉč‚ÚŐŔ߬ýŢč!E|"ĆŠ9"Lˇô!Ý!¨Ć3{ňš˘0Q?!]jb˘zK˘‰“µ(µg‡µ@ćBŽ™ßPůŽ"Š?Ü—fRňh mĹA1ć$ů‡˝‰ŘýO$§Rl˛\Śy•Đc fČ«őbĽ±ł±{ęělÚŹű|ŠxĄ–ś Ŕ†´$eIµźPU¤ IÝp6Ó>‹Q¤ŕ$qx™XŁŘázAN”•dR+^řtńş¬kŃĐ ¦§FAł%˘AߊˇÚH¶Ĺaď@ĆÜtPŇđçsĆDuĘŐbĽě N9>ĚîÇâűšżO0?0ů·Xńw«A“'†qČ)†Ż÷8ĘcŚ=”÷)/|ŹkĂ¸Ś€¸ ŚčHă@ţ‹v›¶ÁAMÎ1,ń`Ůä ó[ס8HŘë!evĘ[ś©ŘxXqI8W9_újŕŕĎ<÷żĹ,ř,“¦<ňäAwG.ÔP€ň8ŘN)óĚĂ’shńO¸ö‡ßĆ~; mjă|óXŹĎčóő§±A†Ż†,Ö´ßŢ •ź·qľ¤ýĆb+?żîłÁĹŮ|a4r]ĺéÍî·3Ř3Ýƞ둞®ÎŃH…y2…g—°Őr %‰Ęřé1Ö´ßÎ =ľ6Η´źsIű5î_ĂkCµ8ˇq‡ÍÔŘ­–‹ł__\͂Ѵ߾`>ß1źođöKä÷/·9%źdŘŽ^Ůjąű;źZçPűYżÁ©@ćóÍýýŔî'ŹUŚX…(RW©R«X¦ďÂK¬697Xőn…-W?-ďA'Ž]Iß©={Ó~;„|¦›ŤóMc=N1ľźwçČ~˙ňř˘Ę Ś—§?ľqÂĽ¶!ö)Wż!ösšýâ Ěî·7¨Đö¦ýx|ż¤ýüżĽ°bt¬ú<'HăÄ•‡xyü›pâ+Ö.Wއ»»÷ľgJF“^ž®á_ß§‘n©»×#Jcx>dlgłűń±Ůî×ůýk”ýú·{GX&Ń‹ŕäĘ'wq+’>ş\_Ő~™’ÓłR »×CŠcx>śRćóÍ>_—}ľIűĺĎ8ű=ś˙ĆX†ŠS-%Ńj 4U®’…qí0b÷öKă|Ďf÷ŰT€+Ó~ßo™öë»řÎËÚňőbNR^‡MÜÚ46ÓQŢ“ý&Ę%ŠGŠyě‡ă|íyľűSęĎě~,¶ó™Ůý|ŐîG¬ţaµ8áŤUkqŠé{–}ią`·Onů’öóăeođRýŮ8_6ÖŁu¨ýĽÖ~ÜŕłfżŤĄěk]e «“>Ş\ĽwÝ÷LÉhRkż?ŘßĎě~{‚SęĎĆů’Ý/±_“C˛Ä_ެ» Ě>ßîGś"š™j ­Pv«–‹‰Nlßsß3%ŁIĹ~}—˙Ç;Ó~;‚Ťó‹ńvż^ĆyöC¨á´WlŤĂ-×ÓĎ]ĄĺK Ŕçkc=öŮÝŮ|ľÂî·ĺz C4]ľý:„T-×­{ăhXV]–Řßďhvż}Á ę3í'źç{ţĘőŕˇJv ˛yęfQl¬Ç® źçk>ßÝ÷oÂîgŘ •ŤőŘTĂ×ĆůŇó|‡¦/‹ď·±/V®Ë0U.—Gş ş˙§ÝóvŃđ5íGă|Ăs=2űÁąňŰŞÎV®Ë0U.¦ýĚî·Čţ~f÷+ÇzLGĹ|&¬\—a&ş©·/»ëÍç+ćô8ßé¨Ď„•ë2L•˴ߡ\™öٱĄöŁ^˛=ëÉŃ«)ǵkˇV.Y’®ľ¸†;–t¤\ýhÇ—çŽóŤ źŻő÷ŰTh{łűqíwľšýŠő+ŔŘď2ĚĹv6í·7Čř~6Ηě~Ż#ŔB”PŚ>GC»Vk˙ŐËĄKQýîuń¨< ŽN»SąpśťévĎ}_X.}gýýv ©ülś/Ó~­¶ű íě'čDŘŇűc,VńMŃM) Ďlťr­°ď‹Ë•we±ť÷ůH#łűĺ±?çí~¨czd”~ ěÇÝ]ąxeŠúbíťĘU˛0ßç=ö}mąR”ëď·3Hĺg>_öL·Âç«Zr=5űuŠ[Ö Ž0Ż®gĄ¨Lsžć†ú»±_GŹÄó3ŘŻß´źŮývĎ•źiżń™nË|ľÂ´§««\şk¬Z‹SL÷OĐ~°âľĚ{mą¬żß.ˇBŰ›ĎwąĎWTұ¶Ýý+1b‘}­«Lűé¤â8V´ű)ßĆ=÷}yą¸öűpiçwjŘ0|/ŰŰ8_6ÖcÚç ě׋v/›˘úĽ’ü›öůňf¦šNĺQĹcI >żWąŘ©é !~ß}_X.ŘqíěŰŁiżťA*?oÚŹĹ÷+ŮŻ ÷LÜ^®qvaŤĐ‹1ßqQ©î~Ď:_ýĽő÷ŰTggłűŐ|ľQ1ź‰ŰĘ5Ý"ż‰’=J IDATýĘr]Ôü_Ťý&Ł›¶ľuŕň»óŽ […SŽóůfź/Ťóí8ž}˝n,×äV·0P­\—q-ö›:_ˇ§?hżĎ-]dĂŠˇMMűEźoŚíě[Đ~†Żě~ľsöL·]A*?łű‰ţ~Ůçű‚Ń:ꉭ–k 0ŇÍě~{Bý™n6ηęóuŰŞÎV®K ž5§ŠQ,ĆË® =ľ6ÎwĘçë7­ÓʵŤăĐ ě~6Öco0źďěó|_2Zç3±Ír5î/Í~ĆůZż=A7µqľ“±ťoŤnzg.°ř~—Ř/ŤĎnÔő‹v?‹ń˛3Čgş™öŁçů’Ďע›^†­˛ź0ű©ëăűp˝ŁĎ×bĽě*´˝ů|™ÝŻç{[tS6ÜëX3şé:ĺÂqvb¤Ű=÷=Q*'ćýRABŹłűí 2¶łŤóťç{[tÓîľC÷׌núr­°ď‰RŐŮ/_#—´źŮýö§Ôźiżďߌóöŕ´–řpŽýîWÁW‹nş űUîěôÝkߥŃ~© ¦ýöŕĘě~ÓĎt»-şézěwßč¦÷cżËŁ›®Ç~^Ě)öĂŘÎÖßoOpJý™Ď—ŮýîÝôaÚo¶ĺ+“–,‡őË+žÜň%í>_Ó~»—ęĎ´_ňů~6 |ľ˘FʵíFćî5Ł›®Z.^Ž;ď{˘T3ÚĎě~;„SęĎě~‰ţűZl碛®Ę~wŹnşNąŘ©é !~ß}O”jBű źŻő÷Ű lśď¨Ďw×ŃMoÁ­ŃM×ć« ÚĎúűí ˛»ł·qľl¬°EĹt[Ş·•k˝ffĄ\«¶i—ˇSk˝ĹvŢ!Ľ >óůŇXňůNTš§âĆr­v4µrměÔĎő°gşí ňyľćóŤÚď|ľt±z°0źŻ=Óm7P _Ó~µţ~ŤÖąŐrmSçË|ľ»„hřšĎ—Ćzö;H݇ßÍlł\ÓQDꉩóec=öŮßĎĆů‚ö«ÇvŢR´Î­–« ]…đ˝%5uľĆx±gşí®/|ľ;×~éą^AűiöŰé~›ĺšŽ"úLLť/®ýě™n{ pevżÜßodśďmŃMÇŇ^‰ëűŐ­I–Ő(˘ĺ~źŔ×##đ"˘ösĐÝëáE3<*´˝ů|ďŰąX_Yy+¶Ę~㽊ź+Q§Ř/?Ńrűgłűí2ľźů|ąÝo:ĆKß"¨ ÎńmŐµ{ŽçZÝĆ–|ď±˙‘RŐF”ŃH7^}ćtIď]2štňŠô,Ć‹iżA*?óů˛/í¤ööŁęZVe5˛·ëî:ĐwQ4ÚÜŞfÂńĘšýŃÉÉ•ş•WĎW.‰ů|÷ůH#ç[ëqĎč¦ëł_É+ŐźŐ0KĄV’âޱ;Oť/çk>ßA*?çűŁűî żßtŚ—«˘›®Ä~EŃNJŔ®äśµ0GŻxŠý&|E·—Ś&‹óeÚoŹđ\ů™Ďw@÷-?Ď×·“‘í‹vĄŕą´ Łý¦ćž©ýzÉě\•yŤ’ŃdEűKG|¦Ű§iżÝ@…¶7źo÷=ŰýĘţ~wnŠ“w¸tŰý˝ĂîÇJ5m÷SěÓbâ ěç{˝¦ýöĎ•źiżńţżäąWE7ĄZ~;.÷ů®L/©T5í'tp—Ŕ™a˛ŹJşFÉh˛xJřŻů|w©ül¬ÇŹěö™éď·Ě–kM’Ĺhѧ”†cę|A?Ó~{‚ęělă|kýý(Zç¶Řo®\Oá›NKň|ö›8_±żźłgşí N9>LűýýjŃ:·€Ůrm¨´[8uSç+ôörŰygˇMÍîGĎt#ígřúăśĚî·;HĺçÍçËúűYlç«°ĹŘ~SĺbÚďôÓ®úNP¦Ű®µß·Űžç»Őhť[-×VŁ®ňř~eą\f?‹ń˛+HŹŻŮý¨żźOĎómÇvjĆV˵ը«ś•Ërˇö;›Ýo?¨ű|w=Î×ĺçůfNŮj´Î­–k«QW§ËE>_Ó~;‚njă|öűŹí'ŘODëÜ@GŽŃ(˘˘7ó3J7ŢŻNŤú{0fâű™ĎwwĎt3»_éó­Fë|n5ŽŤ"* ´Yö{¦c;gíg1^öÚŢ|ľ:¶óř¸UŮŁX۲•«úLQ1ĽŤµ[ă#đhč]QÄ^.Aq] Rľką°@\űŮs=öŰŮ´žŻsçqö›g*Ćô݆QDË©Gł_}±ź_ňůNÚýx•U-ßľ[źü–ř|{hYjµµ.&}ľa:/€‚1QÇŁ›R )`ďY.ĽhÉî÷á]4űܰĂ ÁĆůŽű|«ă|ÖŚőyćšr=MűݶsÝ ľSŃMŁö‹Ďtk~šöŰ dwgóůvżj´ÎY¬Ď3—–ëv?Š"Ş5Öu¸ű•ĺBD»ß†y޶Ă«Ŕ ęłqľÜç›ě~×á1ÓÍâűí ˘ák>ßrśď Dë´r-Ŕt4XŇ~gÓ~»ěďg>_ňůBlçÖiĺZ€&<¸ßZßYż]ÂőćósĚîçĎ’ý^(Zç3±ÍrMG5»ßˇ\Ů8_ăeôićrÖ“0ŢŻŽĘôŚŇm3şéT”Záóý4í·¨Đö¦ýşďßÄXŹé¨Űdż‘™a›ŃM§ŁÔšöŰ#d|?óů‚ö>_:]**&jqe˝ś•ßq¸Ăô˛©č¦k•hAąäŕ@9D°!•źů|“Ýďü›=Ďw**¦®ĽŚUóřNCőfŁ–S+—haąŠ‚•'/čž–…é(µ)ơ3í·'ČG™Ď7÷÷´_Ĺç;­S|zAŰďXˇg"IŤĚš%ZR®1Úsrłű”j2bđů¶G‹ď·3Hĺg>ßy¨_Ô~‡‰–ďűQ€Î˛_µ\… |<űÝ!şéĘÚŹ±ź7»ßÎŕąňłqľ?Ď×·Ó^Ź:ű=k&ËU›Ú„öë+VČzů®ýĚî·7¨Đö6ηç;k÷ăĆ{¶¨şäévż5K´ \Šý`ZL¤ŇÜ™gµß ţLűí ľíÍîÇí~%ű•>ߊG0ŐçRŢł>_ÜsYÎuJ´¤\ýĺŃMďSŞ í|ľÁΛÇxűíRůyóů¦¦˙Ďéţ~ł(+­nŐÝŽËË%w~˙%Ü=şé]0 Ö‡‘n¦ývŐŮŮ´Źí ěGQ1·Ĺ~•«lE®Ć~eąîn[ĽÓŃ`í™n»„SŽóůbŚ—6ŹóťŠŠ9†G°ß…ĺ*R­Ĺ~µrݱ » ě™n{„ mjă|Áîǵźáë#ú|}ç’ŮçŮĄ1<RůYżâ™nŰŤÖąŐrmSçËç–Żiż=Ážé6ţ\Ź2ľß¶hf›ĺšŽ"úLLE]Ť>_oýývéńµqľYű}ÖĆůú-EëÜjąDZ%&™ŠşęstSoĎóÝĚç{Al獙î·Y®é(˘ĎÄÔůĘv?Ó~ű‚njv?ßĎ·Ĺ8_‹n:‹jŃY<˘śSq}Žpevż=A>ÓÍĆůrźŻE7˝Ő(˘łx6űˇöóď¦ýöÚŢĆůňçzśćGşĄAm0®¬WŁČrâuęö­ŃM×Au<-•‹Ťż+"ËRß˝d4©®cß™ĎwʱťÍîÇ|ľËŁô˛6çľzóřÖč¦ë`<†2Ä´Şť¨Ńh\÷,M×Ńő­·çůîN©?óů˘Ď·xžďőŃMČ~LăŤ1ĘSŘéWł_ĺgq:uľ|ďa¬‡ů|wŕĘ´ß”Ď÷úč¦kłßĺŃM×cżÉ8zşŚ#ě·Jń¦ÎŤó5í·#8ĄţĚç;ţ<ß룛>^űŐ¦6 ýúeě÷íg>ßýÁKőgă|ŮXŹűF7˝?nŤnşĆ´ź yH‹žk÷#íg>ßýÁ)őgÚŻçËÎgj¤©–o_‹nzÜÝtĚř|{UIyXâ•ŮOµ|Íç»OŘ8߉ř~ăĎt›ĹzěB¸5şé:Ť"Zßů#Š%ŁÉâ|™Ďw—ÝťÍç+ě~EtS·)ö»¨\«6wĹ~*QDÇwţHö›8_ćóÝ#Ľ >Ó~y¬Ç'Źńrźč¦÷Ç­ŃM‰Ńť?°LSçË|ľ»„|žŻŮý~tßŘý˛Ď×đőqwźďď4OÁKŻjřÚ8ßÝ7°űm+>Óë`‹±ý¦ĘE>ßJlgpÖĐ÷,:ŃjŕےϧH~*9W4íýŐ>ĎpěžŮƸ˘ákă|ö“ĎóÝj´Î­–k:Šč31U.îóý¬˛_•µj Ů„š—]ŞŽe8ł'I° ¶żV«ŤłÎľ÷©ţ~f÷ŘĎÉŘÎM0‡ă{;jp«ĺšŽ"úLL• }ľ5»ß8kUň ®‡řćHVsgżé‚Ýťý&˛xAö“AĚç;°ßśđůn5ZçV˵ը«Óĺb>ßáÖ/;' eŐń`L váď«DP&¦"mĆrmŮ‚.ÇrVǧ÷PćĚ6W§Ąl­÷˘ČŔąă”ży¨W¦ýĎ׹3c?­łvŰ{đUŤ"Ęţ˛Ň<Ş€/Ô?w+źçŰń^ŘXÓ"Řőr®d=nŠăĽ(ň[S6ň?U±čiŠĂE,gö3’3[Ą$x,Cܬ< mo>_=ÖŁ­sě7ß«xT/¬[2š|ö“>ߎCé—NÔŘŹvY°źNXSy‚ŘJaVťV;*w*s–»ç¨Đ{…Ăëüţńýlśo9Öc<^ţ7˛ó-ß;ýG[ ŁňB=čŹ99Źť)¶ĎX—·dëo:±SŃMĺs=jě§}¬˛_Ąĺ«Ş]Č Jí§sf¤›ŕ9ßČ~í÷Rô'•źiżb¬Çű©¶Q/ţ,ęź¶ ¦ŁöěŻůdmLE_@»“:U˛¨¬´Ődw,WΖů|Ď·kż’ &©±źÜX­—‡]ć\M(÷r!űŚ]ůfű«PţÖ!idv?ăĺ<ˇý¦Ůoý?ÁL˝NMöĎf?^¨’芪ęŇ=NětŚîóŐwŤI»¦Q‹zVTI2¸\_ɢ<^ÁH_®ýÜTË÷éě7].(Rţ•˙ď•KF“•¨«‹ŘO×î{ł_Q.ĺóíÄ©“ě×krô(X˘Â~ŚľŘUˇ­ĺ» `Nc9wĹćĺ’JΝΑŃۦ Z.·ß:ß%v?laŠ™'j?)\G?ä/:uU2ôŚÝŹ/YÉî‡ÚďY±ť/c?Ă=á{ŘŢĆůŠçůž'´źW¬Z =¸"Şĺ"ľăĹ+7ë–Ś&+QWeŰOQž:âŚňd÷*î$ôwpndśďş Ć¨áŃĘĎŰ8ßîű·©qľ›ůźnµ\Ëž˛>łt,ŮM41Ő1h?gĎőŘTggłű1źo˛űu Ďľb€­–KDU-Ě É~eą¨ýâXŹv2‚-]Â)LJů|‹ŘΆËP#ĺQ~~ űMÝ, íw#]›ým2´©iżŇîgŘ\öz`Ś—{łźŃß!•ź7źŻîď÷šŃ:ꉭ–k Lűť~®ÂSĆ~ŰCý™n;çšţ?+Ďt{ˇhťĎĹŃŰRą¦ŁÁ˘öËĎtă}‚yw¦^ş¬;•¦G÷?L׺Ż|¤†Ĺ_ëď7°=×C±ß Eë|&•·T®Ćqh‹nÔ~ţ#]{jů"•QwqÖGtu—Cw‘ ÖŰ–‡jß0źď¸ÝŻĐ~űăZą.Át4ŘăŵĚç+ŘŹÍŽL4ŐoÓ~„njă|ĺXŹłdżJ\86űđőxż:VŃX©UŔmĆ÷›ŽRµß±đůÖŘ/űŚŻf?Ăf źéfÚ/Űý>îő`§ë5ŘŻ2YĚ­‡­˛ßTďđ1źoGVľ^ŢMŮŠ4߆MA…¶7»Śőp®Ővż"*fţd-5A×¶¤»e¤–Ƣ(˘ĽP$ ×*Ňňr±}óR”#ďŐ|ž‰3|'»óů*Ę’vżJĺÖ«ÍeV›2ě2¶łŤóMĎt±űU˘b Ă7§CŢޡ%]wG®™Ś&Ŕh%ź¬V¤Ůru%óND9čeÁo+ŐdŚnă%h?ě- ,ä Ň~y®KďI5lN©?ç‹v??Ýňťd?mí)WÜŽÉruj’Оf‘fËUśŁęHażµú|iďsňX©Ä©Dóé Ź„ pev?çëŰŠö«DëÜű•ĺ‚"‚ˇ˘<’ýîÝô>ě7«'¶{ëďÇö~ö3lN©?óůFú˙|}í׳j[ďxöíWěwKÚ/Žő8‹/˛ [Guŕ°áŕĄú3íGýý|;Ĺ~Ě„ź*‘©4đn÷ë9ĘR®V¤ůréÖů¤Ýďžä<Ąý˛ÝŹű| {€SęĎ|ľĚîWô÷+ž„Čj4-ňSĘ›ű`ηĘöJ­łu‹4_®‹#ŠJ%®źż;”jŢçkńývç;ţ<߉ţ~µ6ď†˵F‘"Önz;¦ŁÁ2í÷9ă…ntOY ě,}Ab¶ăÚîĘŰ»éÝy_3›/M}oL왝şëâ·ěîl1^xlgHěGQ1ݦŘď¶r­Ç~eąĆŰŻ«2ť‚\ËúűÍĹ÷«hŘ©˝.Y4˛¦$5¶WŽ˛ß űĹü™XVŚe«tšEąđEţö‚úĚç›í~źÍŰPułĎw˘Ň,ĆTscąVcżZąF‹ř<Á Çů.łűqkÇ8«Sâ‹FÖT©[‘ýĆŹewůĹ|űQ ŮE“Ďó5ź/Ĺ÷CźŻáëCŰý:¬WcĽŤµ©“ˇĺŞĘÖ$¨ćł9ć3bwäŮĂş÷ľ(µ=c?HSÉ*GÖ(Ĺ őŞ^®‘;-r.nłöŁ4ŞákÚŻf÷Űh´Î­–k«:_Ăżő®ăĄ.-8“°–źj[Ťkżb«šŁŠĎ¸Hd3Ť;ď‹ĺŁDo©¬:îѢLGÎŹ\§VŤ—›(Ż8@}\Ő *ľćó>_‹nz¦Ł>SçËç–o-ĆK\űŤML°_MŠ”Ś4¶ÉtŃÖÚ—¤¸úŽřD×é%|Bě¶Bjz§µ®§)iyä¸d?ç+úűYtÓ+Đřŕ=…÷–lSç‹´_%ĆKőаy-űIµŐWߏýeěG§eŚýú‰âPQĹ[éR—{ź<.JáúÂçkă|Áç«úűŤU„'a›ĺšŽ"úLLť/¦ýÎ…Ď·zvď˘ýdqÖŐ~·ďkąöĂé‘Ó‚úhĘSWç;97ˇ+ÇE \™ÝďGîó5Ý߯vIÎ@ŰŚn:ETă‘'mę:˛qľ?ëvżş9˝«Ůý@ßđEzCąEťWhš2<ˇK4BJwŰ—8ŔrG⋨ŻŘ±˘8^8ŐzUIžĽ`ꦎK^YÚŢ|ľßďuŮŻ2YĚ­…jŃ­˛-®ţ„/§7ćĺm´‰A‡Ă¤ L ‘*z§+cŐ§‰{Ď´TěŚ%ׇ|ď}é«Ú\í N‚hĘÖsĆ ˇŐ¬v*Ż…Üoq“’ÇĄŇňÄ2ľźů|'źëqCtÓ5pctÓ•0M€ýŹ{vő9[©d4){aß#1^ż·]Śí—p{ĘĎ|ľ?rśŹh÷»_tÓ5pctÓ•0Â~• ěDA×*T* MŠó~ źŻaŹ4˛qľŮî÷{$ľßu®Ę~ŚWřd˙0ö‰ĄRžÍ…k“Î8űe»ß±săeWĘĎĆůŠqľS1^6Ĺ~G7}¸ö#}vµpý†ŰD¬>Î÷lÚo/đ\ů™Ď÷Řýř|·Ä~G7}žöëőYRĘt=Ějż)»źá+B…¶7źoľ˙ϱs-¤J¤š›"Ľ7nŚnş¦µß”Ýo­aYh˛f÷Ëă|Of÷Ű |/Ű›öcă|ç}ľü—9{ůY«^ßÝt%Li?Řs'ŠŮ eşć|ľŢ´ßŢ •źŮýxżqźď&°ÍrMG}&ćúűEíw6źď~ :;Ű8_|¦Ó~­sC,łŐru Ď.aę|±ť {€SŽ盚ţżĂý3¸ ¶X™7[®­bę|Ůs=öÚÔě~¤ýZď,şén@vż“Ůýö©üĽů|)ľź±ß~`Úoʍ?ÓmçÚOů| _ö<ß]Bz|mśŻďgő`/(žéfŘę>ßťŹóŤ1^hśŻáëźéćÍç»#ŕ¦Öß/ô÷sÉî‡ă| _f÷Ű#ä3ÝĚî7°ß·ô<ßAúą¦sžżÔ쫼şřř{ń—ľ°úą†=@…¶7ź/{¦[`?~®šÎŹťĆ-#›»őíČOžˇŘňm?Ľ;Ř8ßý@Ćv6í§}ľ!Ţ5Ľśś}•Wč·łşŮŢG^Řäő0í·+ĐżÁâűE€Ý/ř|©V9ű*Ŷ—|ąÚ…5»ßľŕŮ?ÂŰ8ß|śŻs§ůh¨ˇ!|~Mö;wý”Öö>ńŞ:Ľ°ţh1^öÇţáeă|ăý˙ó-Ô {]¨'ľA2|řPě§+­í˝\dżLé:·ŰygđRý™ÝO=ÓÍ%Mđ'x{łö{¶ďB«_쵸Ąµ©OüłÇëęá¶Ţ|ľ»Cţ'ŕżÂ|ľÂçë/0Ä áµ_ŚTótĄµ±—OÚĎç ›D˝om¬ÇÎŔo†Î|ľ?¤ÝďýŔB% "Ş}=í}ľĎW[[úd tůşşö0\Řp˛:g1^vläoóůŇ8ßŕőř¤ëŽ ľ˘öó™ĂWVSŻôŠ$č’ÝďďòŘŰ9Ú|ŤývŹ˙‡Ü°qľ‰ţßR­Á§Qîvżöu>.kżç+®­|đ{¸´á$%űnkýýö- LűˇĎ×3CźŇ w€9ş§sÚEüg>_ţĘ$čúdôî,łűí Şákv?ëíA.±źÁ,°E™ůeŰż.ú|źŻ¸¶ňa/—Phżłiżý€Q_ü6źŻíěšssźS3|:n·°ŕp _i&MĹd[›OEďTµßń IĐŃUmŢ“Ć÷­iż}Aö÷3źŻčď7°ß×€¨ř{ţ Ş3ä‚oßě~{ż)ĆĹîí~ř<ßhň«{eWÇ8„űĂă·ŕ<ő÷;™öŰ dÍčlśŻ|¦Űł/Źáa€gş5?Műí"~ݡłqľÂîÇ•vĆůüŢ8Ľ“ŵ·Ç“˘avż}Á÷đwđ©Ó§Ůýâý?Ťóőµ*břš°ţ~»ÓaÎĚçËžéćśÓXę˝§«Ťch>ß˝Á—ěgÚĎĺgşÉZ’¦ÄÄö߬ŽŰ›ż Y>_ëď·¸žŐ“sgc=ęv?`6Á fłŕuüŮ|ł­7śş†ăewHÚ/Ý =jżťŹóŤ>ߤýDÓČń I1[}±â8ŕ䤫śŻµŮýö…¬ýâ?Ŕ´_ŚóÍ ßÖĂ Dńb»é”oŰ$ýŕWëśÇť[Ößo_Ú/]}o>ß6Î7śVcZ Ŕ8ďŮ5yâ•/,–ß^ůEg$ŮűŇT|¦›ő÷Ű\źęu”4ćóýÁĆz„ ˇ+ đ_ËčeQ…KCOđłţëÜüťG#7‡3N˝ö'śđ_wřÓ˙^ýŻ<9 …·÷ÁîçĚî·#ř°.Ýćóeă|©yë˛m¨MňĹ_ţró&vzĘřŢŻ…h˘ľOxYňu 8}dígvżťÁĹŢÎmú/śĚîÇűűqńLčc¨+b@f;šřŽF ·ÁÝ‹ýĽšlş|m¬Ç΀>ßđŤv?çŰ€Ýĺ5#çQĺ%?Ć‹Ć~·#9čîđ`RäéžvŽ÷Ęúűí ńą n˘Ď×Ů8ßŰ9Ń–¶ű9$Âô +ß!ĺ1ú;XŤş÷Ň~žýútÓ‡YÓ~űú|}k>ßn÷ˬ×u]ř¸î#&‡Ő]ţB Ś'ŇSš#xILűÝ.ĆŐÎ˙×[#ţ#÷ _gĽ‚f÷ŰbK":}s0źŻëm|.<÷đf»î;6uŰü ËôDXŢŁD ڏčl5ęV¤ő/ĽŁxwÍ']f“pˇ«CrW˙gŞá1đ`GiťŤóŤŔqľąí:BÄęŃuÇÄvÝÇ1ÖĄa¶óqY†C‚cЇĂtܤűtů<%¨ýşz˝Y\Y]ź RU’K*Ű‹E ’`˘eeąHűqŰ?|×ŐdZu|{üč¸á– ‡ÎçN_¦ýöěď(°1»ź|žo®éiľCőęBă7Ë˝(]—IńÚĹ]’‰C’”ę>±ZÝŹý–]Ö:‡Ý“ý.)Í}ŕłÝŰ®‘ĘÚÜ=Ü€€Đč—:iĆËČ ·ÄQűĹ5ńÚż›öŰ @űEśłÝďĽ{í÷ŮĽ±ęjV˘>iy ą¨9"ú´*ŞÁŔ‡±6R g›$Sq ˇs˛¶“k;Ň|]±qm‹”N¤ĚŮ‹Ĺ*ÍÄ–j+ąëJyWˇE¦ýĐĺžú …L¸eÍ-µÝGŕNGx IDATŮćÚ.ň(Úłř#JĚvż¬Žpë_ˇô† ě~žŤőŘyż<ÖěwÇDp‘Ô|ęx› Oą!ś*PžKS‘qý@Ľ!~:$’ęÚ^,ďUŞ®d‘Vĺ·pńLµ›ľďŐŢaí˝‘í~ĚçÁĽńxŢŹé:óÍŞí˘=nZÜ@‹ăvŔîç,ĆËÎŔĆůÚXŹđůbI,—”^$Ŕ#Ü/’Đű€&o »¬˙şÔ"4šýrKx„ŐĎűi–ç1ؑ̊°rzjKµ+Ř¨× îĐ~dĐv­»Îpއ˙'_0ꮋ‹DňÎł®KŮŐtp•¬żßľ@>_ç››ţoŽşě×Ăý‰ ěĂt›lâř“őˇ6˛CźŻh„IČfťý˛ĘÓ©ęöšęhGHiTXŮuő$˝\ô4ö»_˘?Ň~qôMě“”n@Y ş,É;Đ…5í•㡰iż}}ľąŰ§iżÜôKÜçr›×·Ůś›ľ™c]ćoěçţPŞA¦zŐhöc D©«úŠĘBšŃ©ęě×ijËĎ8¸ďô–yˇZôlíÇy {ľróG¸4ńćăŽÁÚG­bźÍµ" |’oß|ľ;ClI¸\Ó-ľßŹ`÷ q>~ĂH7ŚćĄŕ1[Ę)$.K˝›YG?H‚#ÝX““4<+˘OŮýĘźů5•ĹĘX¨Í'áGP+ďÚvżl«a=,łm˘ű“n@ů>ÔÁOwLěwěś/0ŤtCźďÁ´ß^ŕcě Cř`ă|öű†Ú/őĘ­Ş./ŔŢÎ0˘—ŹśĘ_G Atäó%jMUČ7ĺŚUâ­ś+·ěWY,´`§Őć9EÓ(†­đě˝ÁĆz@ő_’u‰é„x4ĘF-N–[ÖćĹ)a÷‹fźJoŘ : {žď ýX?1vÇđ¶ĐŐţK“ÔŐ%§™ç[Ą‹ĺ ·Ö^Ňî'×Đő8RWTäŃřęňpŹÚ1OůÔß/uk7»ß®ŕĂ-5ľÚŢýňýÜÎí~.ŹóeŁwŹ(ë°ˇöcm\$G$IÜhFOűÍě~šÁ<ú7˛7*_1ôëBçtpcµĺcXxfg°Ůýv ? AÓ~l¬1QpđłiŕvÁj“Şç»č6L~Ń~ţ—㪏őÜĂ.ĐéćCB<ů@‚'˝–Ĺ–ŻźďÁžë±ö‹/gc=ř8_¬'\. :ŢʢÇ~°e°ÂbĽÜěďÇ®Ů3Ĺty¸×8qţ]ľ’ě:Ń],,9wč<1í·/ňó ývîó•ÚOKż44”5n=T2źIe öx1Ü´ű‰h:`ś@y—ηô¸ç†Ôy#}ľf÷Ű ×+k?ŞF©Î°‘yŽúÄ řŔ:Ć„`Ś!gŻ›^Iű…. ô¨Łđá”—žňşżóoN•°Ç$ť`†őv6í·+8Ąţ‚Ńßc=bż¤ýZĎđŔ6/Ó~¸Ź=ří~Đ*ŢÎĎľÎ_Î9ß­¸©»×OcżťŔKőgÚ/÷÷ËÚĎçPpĐĽÂľĎ`äcd÷Ů>snBÔŘkÉK8ˇ&°(‘Ř,¶\~Ď®•†Á)őgv?Öߏ,FĚÂÄś!úoŽ7€±Ţ˘}Ęp3°k‘wâIJ“‹>ŕ”˛ĹkWOŐqx· ^6»ß~ŕ…Ë´ß®Çzäţ~ž|¬cE ťśew >ź·SZĐp3˛DOĎ.Bö:9vU€ëČD« Ó]Îě~{WęĎúűÉŘέ¨HŐŞĂŰÄH~ĐF>VÔ‰ár¤Óťé‚Іßmh^°tÓ&Zç·MřÖ|ľű‚—^Ěî—úűý c= ˙Š“¬× é×’/&ăŕßćaÁ±WEđ=†ÁÔöľę]·álöýŻ»W‚<ř6ÎwgpJýY|?®ý"{ńVôç“yl%{ z€â/ĺrXĹWą/Tźçëů”YEZO)đ¸E*čŤ| lk×j'ŕ#=ĚîĐ˝äř~.=+6„ >ş+ T<ë-.OOËT—Łťµ_éf5ęV8ţ4ó#ą°ŢHâE$©ÄëÄ—´ÉoŢ>ߌýv/Ôźů|D‚ ĎtsFl¤ ř(óx:ÄźÎócdsHő°2>M'=\‚¬€ÉîgŐę`Ś 8nî8AˇsKDK <]Ę ÎRy§NĚĺ'0ŰeÚ Ľlřšö =^Ŕç›+>ÍÜÓ“r\xdG ™~LËÓ磓ççzt[Nşu$ŮGŃMEŻó¨˝ŹáÁpĂácp\ŠÜÜ™}ůÓÁÓĚŹŃç;Ŕ.Ň^Ŕm~Ţě~Ňç›eE¤­D}>>»·KÂ".WŹď…‡ĺ¸ÂĐŔ:ä§=űrż0”öŁţ”`|ČżĂTyşeĂě1ý¸ô°_dLôăÇgşĄ†˛ů|÷Ůđµqľiśoňůâhxx^"<4,µ„áy„đx‰#>˙Ť TůyľVŻ®ĹvĆ–ÔĆő‘ĺ\¶Mř.ߪđɖǸ,¸ťĎ—Č5đĐeóůî Üćvż}kżx˙˙|qˇŃç­A]`¸ô ě\Y¨Eěłçăč#+ó č h^ŹŰĎő_:kŮ&a—šŔY¤'ëë1ŮmáŢĺČOÝ”dlçłiżÝŔ‹®Îf÷Sc=śÇV•ď†óŕúŤftzzvPľMdŘƉ¤ťŤő¸đ™n¬‡%5Ă9Ď-_´Î‚/.ű =sĆ7¸ői¤[kÚo(b;›Ď—Źóm“v8‚Ć;Ćę•j]ęä‚#¨Ź´2>YŃwřXgc=î€ÂîG㇉¤ĎÉň ,ľëřî%k?źµ_cĎtŰ ěąĎtË]#Žl`ŤŠu'ÚšI<čD–¤:­żßFşý˘łËbN´ÇĚ{ÉúęY[7‘`”íbPvř;tą“¦ĹvŢd+‹í,ÇůRýr`fÇz‡A’ó;Č8Ołč•´u3’ÝŻgÝýZOÝ÷ú˘ťđò¤×S·MéôŤWłM-ß…ů|w…ęó|w?ηůlŢ㼣O®1Śö$Ä `cż›áeź/ďĐěĹ5Š˝0AßĺYqbž’lL#ÝŘ8ßłiżý@*?ëďWÄvvĐ–e5#Řó¨Í|$V9ŃßĎp ’Ýď—gâ/EPw’ѕݯä]é3\űůđ´QXbÚo_¨kż˝ŰýÎqśo®' X¨f0aíň< QŁiż;"G¸B™ç_ŃßĎ%+ź ÂŁ‹´Đí™H2ľŇšv^·#ŽěČ“™Őđ΂*śŰ_)|3:ŮX·”ÍŢ´ßî`1^&Ćů:Ç Ť»aŔ›KGfíĂ&(’÷Š6\ň&ů<ČĂSÄ–pşł€ă¶Wv­č UG1˘BĽăó|_7íë–ür8ĄţĚç«ĆzxˇýHk˘I…bŹ*6Đo,ű*Ż|Bů@kęáÁ$HµśŢhš[qUŁ×cZű%bŔOTbvßB!ŕ‹ÁÝÁ˘ÉRŤäTË\lU¦ˇăűü¨ÇxŮů8_čď'čŠx®Ą‡F8âądís¬FÂV¦ýn‡§~|$Â]¶F€ÝŽq!ĎAÝ/EŻtÖMďcs>ß®ëŤpVLôc ¦ «l Örž˘ĹZŢs…gĸ ô/ ŻÔźi?ŰYö_‘Ł8dçćřjˇF‚ł­íąG.u…¶Ď… :N^ŘęŐÔ&Ż݉”A–C‚?ަâű)ö“Ë'La”ýpW,Ĺ%9O˛ßDŽ»a?{¦Ű„Ď—hÍ‘8‘W0^ÍR•¤ ‡ŞÚ_öąü·8›ňôÂyĄ»·üáőI‰â .JmUlgÖ@ě°˝«ÔWWČ'JŰSŃ\Ž™ŕ‚zŁVp]±Kž¬ĚąçQÉ{Ľđ´čËłŁ>çvżđgřĚţ|ĐOeѲű\ř‰?lŃýđywh÷C‰$Ô^§Úž5¶Đl%6ĎY¨ćg©ĎşNÉ/Z$Ěu|‘ĚYµ(ňxá{™ďWFý™n;×~áţďÂ]ýŃgĉď.ĽÓV„©ďiťJŕhŽ~\ú|9Úô˘éa*OÄ÷÷tŞď‰ďt©“ö+-c\_ijŇ,Ti:–Ľ‰Ć,ź/¦+­RµwÎÚ±0<‡…×3_N©?łűEúwŤ‡×Á§ą[6ĽÜ!~§ął\7˙r6˝x:ťáËÎď%/ąŻpëç<–Ł*Ő vYŔ~9Wd«Ú®—˛쥞÷há{E‚_^Ş?ç›Ćůrśš0đćÂ÷9ÍśŮ4ţ–3ł‹ #<_a%]™űć8Ésř®á/‘;údÚŻÂZSŇ«5SěGËÇŮŹ3éböëĹj™/)|m_N©?çűříśľX=<7ooNp٬žç†6Ég–—LR&¶i5-ĎÝYľNMŽÔňž78Ą…‘ÝÎyâż„•MŚßă\\z’ײev?˛ˇu`´›1ťU8Šg6F§ŐÖîTâí×÷ĽČ•Ľ' żöó˛ákvżÝ·0ŇŁů9Üţo“~óüů-őLSçđ×ÂzáügţĐśM/źźźđ©śăß }ÂëçpťâµŠżůÚ„µ'Ę'îcřŹ˙Ć-~Ćőń“óe-Fjö˛‰Tu:ŇX<µT}bUĎéE44ĎTTY™%â­m‘µŮuŢS…ç ůĹůOą=ĚçŰů·„ßůóFóĂűÓ{üMKĂŠ··˙ ß|Ü4O}ÂĚ'KfÓĺ´<÷ěTłÓŻ’Ô6Đ‹ýŽäź<ů=ŞüóxŁlÉ^łý. űűyÓ~?tĂţđěZyneż=Á)ő·{źŻa:—şEž^˘–ýŘŕWšüú´đüA¨÷÷Űó8_Ă"ŔŁď,žáu!şYŚĂBtŢ˝ö3*¨÷÷ŰłÝϰq#ÚŻléYëĎ0 ŢđµŘΆĄ€áĐ Řo M¤©Ű|"݉Î`(PŹďgÚĎ0xôÝFŘŻş•±źaÜćgv?ĂR„»ä©ů·űç=e#dš‰Í§C·ÜŁ<ÉŢŔ˝\d0DÔăűíyśŻaş`Âî§gĄ™NŤŰ*‡†Mn>–Ą—äĘwc†@Cnó»źi?ĂŔî7¦ýŠq¨ú·[ĺ©6Á~3 Î^˘Á`Ďó5ö» đř“Q»5PŻażęć’ŇTrő-ŔĆ{†**Ďt3źŻasÚ/ˇlşö ŮŻŘĽŇÖ)Ťý Ážçkěwćúű)".Řě»Đ¦<ÎQĺćŕ%©$îÇŮĎě~† Hĺgă| Ë0«ý”ł¶ç„Ő16“i&7g“zâš>äŮ\_M _u»źŤó5Ě [H~nd¬Ç<Śű ¤ňłţ~†eXf÷36 óůű]…ŤŤó5®€/í~ćó5Ěâ‚qľĂ6aÚĎŘď*dí÷iěgx]ÝĎŘď,¶ű™·Á°UÔµźŤó5Ě [Hć[ľ˛ßDrăQĂťQéďgă| łXKűűëaěwâ]ňç”Ď—z !Ş*Ý•YďçJi¸ 74Ü 6Î×ŘďŔs=&˘ôD}zH[1T­ 6±•­kcÖ wĹv6ö» ÉB27ηŻ0×h@žPŚYËä”ÁpĽRćó5,A÷}ú™nöCŽ«Ćh‘ÚŻ+ Ń8ĎpgÔc;Ű8_Ă şoÓ>ß’ý8 VRK'‚_•Ë †{Ŕ)őgÚϰÉB2ů\Ź^’…¨š˘1KĆĆb‹Ť w€xšŻŮý K1?η:…!Ş&ą‹Ú»ĹS:ŘŞ»UĂžá”ú3źŻa ž8Î׸Ďpx©ţLű–aÎçk0lN©?łű–`Îçk0l^6|mśŻaşo3Ďt36ĺö°qľ†EHwÉź¦ý Ż ŮßĎ›Ýϰ ů.9Ńߏú6«>ά#óȆküÓ †N©?óů– [Hć{;÷˛×J?ŰáĹśş†Áúűű]…eĎóĺÓĆ~†­A t3źŻa!Ň]rÜîwűŐFşY<+Ăʨ÷÷łqľ†ĚÇxŃář”ÝŻHÎÓöbś‡Ńźađ†ŻĹx1,Ä÷»‹ö+<$j€Ű=˙đŔâűű]…ąçz\h÷+µßXJánŕ6?‹ílXŠąçzÜn÷«§4î†z|?Ó~†Ě=×ăźoov?ĂCŔm~f÷3,E÷ýŰBí'mz|bb»N< éľy!Ážçkěw:·đyľ×“ç*;0ęĎt3ígC¶ü^ťý †µ`Ďó5ö» s>ßaěgx¤ňłqľ†eźďŮhĘđިŰýLűf0˙\aëĘĎĆů–aľż_öěV{îYĂÖ°ÔµźŤó5Ě zÇ>/yžouíča}řŇîgÚĎ0‹Kúű- 7c?Ăăav?cż«ĐąĆť—Ĺ÷+ŕsy{XĄ»?[„+ĂP±ű™Ď×0‹ąçůŽE¸RO'Ńk#Ý ëĂ´ź±ßUvżß—Çxů.ŮO wGĄżźŮý ł¸ ĆËhČľ…ěg0¬úXçkÁ|lg>Ą›¸Ć~†-ŔĆůű]Ĺ>_â±ßE.dě7ŇX6»źa%Xlgcż«|ľ—ő÷ÎĎň żUßFé 6îŻÔźů| Kď’ź«Źt3î3¬‹ílěwlśŻáőá”ú3źŻa ć|ľĂć!žćkă| KaÚĎđúpJý™ö3,ÁÜXŹ:.2â­gń»Kš%››ŃrÓđRý™Ýϰ ů.9Ĺ~Ěí+Wą ă›ßę@Ü)WµZ7¨¦–¸LcL¸98ĄţĚçkX‚Ü+ţ÷DlgÎŐ.Í“KÄ„kăD2A1•­+}¬G™±ŞfĽßqů#ěK‹ř’ E•ÍŇ2.–ČSFV+s®Đ™j\wü±ÂE˘1jűą¦Ńox d?oă| ËĐ}›őůޱźŕ&gjłbŠ1ĘzS˛ŢűűŞÄŕâ;ŐGT ć_R®a3pJýŮ8_Ă,đůrN yÁ‚ŞěWĆ ě%Łhő§T|&EršŤÜVŮ٦ëh?cż-˘ŢßĎě~†dďŘÔH·Ů–Żć¸ µ_×qjIřŞŃbôš” íÍwß52ł–ď‹C t3źŻa!Śő‘l|¦&Őtâ öݧ—Ąá®Čp˛HÓËů,ß0M†-Ŕúűű]…ąř~ý8ű)JCYÇ—,a?žN[ĺD^”Dć,¤'¦fżłŐ}Jq¶Ţ𵱆ĄŐ~îŰšk¶#gÁjbŤcĘąSőj•$±1=&Jí_µ9O¬Éݤ¶’ôş2‘áɨÇ÷łqľ†D ÉÄó|ë¸.I|µT®—bÉVĆxŰ·ůYŚĂR@lg‹r`xYX|?cż«ĐąŘ3jýč¦Ăjŕ6?‹ílXŠÜ+Ţâű^ö<_cż«° ĆË+Á t»Dĺ™nf÷3Ěâ†ŘÎL3Ö‘O.ánÝĄ´5ťVőo©9Ą«Ĺ_Ĺ\Ç—žˇŮ Ć»;ŞdŐnĺefe·Gí.żł×wnóÂ5?»Őř%ĚŮžçkěw’…äŞŘΓµŁ«ţŰËú9ťĎČNǶ ¦K_”¸ě2(6Şô!„u¬_ŕ…¸űU¦/aż©S¶pżjÁ‚Ü*g{ ĎŹ]‚霥ňłqľ†e¸Áç;Í~Uµt'öŰ„é<ŃómUÔ/‘¦Tëłßuů\Ä~W‚‚L%®^îÉm.c?€ŮýŚý®Böů^Â~¬ ńX»ߢ™Â–đ– ×<çNćĚj±^ĄŞ„.€Ř‘&eUć‘#ľ „ĺVň$ŕVXĘ™’Ôô—Ót¬sś"Î+j-•:QTäŽ~•Yśłń2Ąŕ×vÁŐ íçµÝĎ|ľ†Y¤»äď ě~ňź/¦Â~*Ťć/ůOďh‹®×›ç(ľS™Š”•ş¦$jÜ%Ó\P²–ŞŠ,ŘIĐy•{—<,rGy-*«<™•“&h˛ĚeâZ™+§|âJŤçlÚĎŘď*\îóUćN60Ë·J3ő'ݍY]Š* ő®S[±˝«Ä×±ß%ś8QĽxŐ“ŔË\Ůűě )üص(Mś‘ŠĚKö›(ó(cO—|öŞ9űŇîg>_Ă,ňČK|ľÔâţŇă,ŃIşşśýę2‘¦Z»ËÄc•îněWa›ŮoމH)ĺNK†éŠ‹B•5óež8g“eŽ…;­§‘Suígă| 3¸öyľc7Ë~SŕJöcö¨‘42ź ·t“îŤ{±ßěI@†¬ď}DGMNŃ4ű±Iyh"™~˘Ě“ě7]ÖŇNX; 9U±ű™ö3ĚâňçůNPJĄ%…Ľl¬Ś•ęPţďĹ渆eČ'ęě'ŇT*`QJÎŁőmĽ„#[±tt¶ôIčjús‚ýj{®ľ4SVîęîPOo;Qć©s&Ntą‘ÖĆĹq•9›ÝĎŘď*,í\ţŻUË—ţ™•úĹţ´¬q%rfĄž¨śůÎiUµ>öąVN%V»e®ńÂV¶ęĹ/îBž:Šżä®đ¤RŽEaŐß«ŘOvěkĂ8ĄţĚçkX‚Ë}ľ]%¸“îF‹iş"҄ҫ˛ź1ˇa^Ş?çkX†l!ą0ľ_uT‡ęüOÔ§F.T¨R­+‡ pJý™ö3,AŇ~ź—ĹxáżÜtÇŮŻHٶµň©%F~†9xŮđ5»źa®ë!ÇYŢŔ~yóiö3fˇÜćó5,Âĺ1^łńÉ5´źÁ0ŮßĎ›ö3,Cę•öcŤ^i Ľ–ýj|hv?Ă<śRf÷3,Áýý”—§ňďÚOA˘Ťü 3¨÷÷łqľ†„ţ~ú| ă>Ăny¬‡i?Ă®đů ŰB˝żźŮý 3°/†—‡čĚçkXńběgxYx>Ót¦ý Ëp…Ď×`ŘBk×ĂűĐ™Ď×° ťżÂçkLiŘk@çkXŠńâó?ŞK˙(÷Şěwîž­LěłňÇĹ?g6÷yĐ~i¨‡i?Ăbtߢϗ´_”‚¤=Ťżn‚7í÷ő_ńNťţ©®=$]m~Ţ™ÝϰÜîţKş.Ś—<çŮ×{í÷|ubźU?.ü9»îOĽßeí-~Ži?çkA~®ÇĎ,öbŚ´_ő3\^ßv颷M§ď¦ý ‹ ě~x˙Ěv?›/ôö.wÖ1ő÷Ő_x·‹=^¤ýĂě~†En Şż_PáćŇß*šT^âť*V‘ ¨ű¬ńq}ľŐ%CŻwBúĄçůžMűf@ă|ۦ9B¨ ř3Ü=ĂäáÜü~†™óćżó§ŁjbŻŻřň}BYÁżµédß,ëďgX˛ű}ŠbźŻö^ę‚K÷ś3»źahśoę* †źßň7u®G áŐ‘â3mžKfëäő0źŻa8ηďű_OŠIe0ܦý KĐ}KĎő o­ĎąŁßOď{cďUßt™ŐDž6»źa şáO´źjč /Ś ýŢlśŻaÝ[@óÉŹß[ź~ż60|Y¨˙©ßÚ/ü­Ťý “ŁzOoźéď!>mo{oęÍţžĺDśŠ˙ęź]»cż+0´BŻřĐü=‹×AÍżÖ Á&F&ýÓYěĘ7(˝ń‰ ý†˙µ±źa8ÖŁ]­‘ň sŻÁŚ´˙ő-uvNv?óůćÇůľ5žßV_›;¨7śJÇb|"~÷™cňĺňXź ľç3˝4Çć@ĺ cŰşk‹żŽwxŽ>_çkö÷sPR„Üňűě1ĽËßPÍ˝c=am‚M„sµß’°aç‹ÇÚ´ł9_ž'fÉŻëç<PîýŚôh±ť Kúű ĘďłÁ›¨óxGĺ/ “Ťż©š»t0±ŽŘ‹¬áf_mÓ]ÖŐŘőń.tçE´őän®çú´“»Ş‹![=E;Wěń€/$N懜T) ˛g¤ß/)ť8Ŕ"{ąĐ_sŐ')Żşę‘ÖđšęĘťÉRsîġ­đ~“˝ÓB'é΋oU÷‹Čź^§Yüź/ŢnQźőЦJ:PßóqÖ4Yr%>G9ĹĚM<Ďg´łŔ  µ€íěŻvČL’.*ÍçßGE/‚©<¨E'¬WQ‹…šS“7۵÷Úµ[ÄrUżßTޤëTI^6oµźĚ–uŽI ‹úÍÁ˛UöËGv~‘g=ŕć˙Éý~z"$éËz÷^›,É Ćd łő›µëúą>c= ě0m-™*ŃD ń4Ďř»ă·ŇŘSÝ3˘ĺş`ý~Ńz7ŠnIŻÝş~ż›ˇĄăXúRŇÁŁ·¬ó“y{_‚4|‹ú™óKŁąĎ/}Ňď÷PŻůŃ5mňî‚\ěP˙§'„ÜűÂł}Fí˛łĽiVXMłM¦,ż:Žę˝ ›iŹÉʨ]ó}?óű\:ćJ+5wŃĄ;sbkúčDŞĘM)ů´ଖVşĆOć|Ľ¤»]2/óüR 7Í{çwŇVúýŕR-y‡ĂÖ CşI!ÝQ_؉©ČłäG#S™źţôr—ĎöÖz©p>H•Đą©v‰ß'бóUAÝ yä­jäNw^ĚĎ:¦2w»sŐ“n“6żăd“sĄ+źő//*eÔWâüâÄ5_¸ó~z.¸vSŘÉŤô".îfżI‚˘[č'ĆÖ®řš WďýT ĽZ4bľ*Ä_Ç*‚(6ĎdMĹRPŤÚIĄ]ZŃŽ‚ř¸RŐëł±nČÎ$9O?úôśxż©Şß\ÔŻ–ru~\ó…ű¨ĎůŞ«“şZZUˇ’ZRˇzâ{˘ľyÜ”ŻĘBëýB3GĎG§„ştŰB4ťB¨kxÖ8Ť-1»îl7ŠÁúý&©NšőŐR_ő{,ÖMévz¨[żĆű‰ŕ‹üťZÔ"~ęnťóË×|S‹őOiúýÔ.¸#U›Oµ‰tA@~fĽůusËŚrWď×\îtz˘@M¨ŞDtżçĚVcµž Žď΋ÁJĚňĺ2W÷BÜÓŃ«ß5%Âvńˇˇń~ÎŞ;k:ĚŹ%)w'ůňťXC?-ýčťĎůÂ}Řý~&~Úcă,Fq;_ź×$ůţńÚŞóж<ŹÝĺÎFąM LPT.ĚçËłp}ÖăŃ˙Y€€×üş6ëęĽ[Ľ×´›5ĽĘÇűŞTŻlěĺŤäY¸ą3*u¤@7ü±ďÝŐ8»řÉĚĎSiÉ?yäOM%Xřút݆ýY„sżܦ\ CtCŘžŹ1üž!<+oÚąk·âŘ®#¬Ů:]úxun3§¦NżÜb.Ę5F›ąÎÇŕ9ŮÚç=eµ—÷°?Ĺ>^šűßsĽ°¦ëěmˇ–ń¡[sŚ÷劉V=(ËŘ8†(A{›»8ŽgŻfôKĆuŹÍ—ŰžŁËG]ľÎk—ö…‹Ľ m¬‹ů˙ž8g{[C {-5‹y%b-˙ÄvżŘŰ—öŘíaytřI›x()·|yŹ›ÓÁŰMń~đ9sĆcú?ßqř{óť›’‡ýó/?ë´G7 gñ‰÷ăeZÂţ.Ă%ěoŤuůn·üĘÜş–&Ö…üKË÷yčľ -17ÍÔ_Y¶–|™Xě‡Ëűëž÷&?C$Ó{YSIŃMÝóKž|)Çzt–X®„%x?řś9Žăx úťF6ůuň~.ŤxhgŘË-}řšńvő˛ 2}myËŘ›q‰ËÂÁĄx>7żŰt.ełŘ´/‹ăňÝ„Ő ­euao´Ů=¸O™q8 ż›ĂbôpqŢ˝©Z‘nü¦ĺĄÓŃY§>Oé őOYuóŔŻŕ§Ď®oő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý OP?čÔúő€>Aý Oţo¨ńč †•ŰIEND®B`‚fox1.6-1.6.57/doc/art/slingerzbutton1.gif000066400000000000000000000043321326741342000200330ustar00rootroot00000000000000GIF89aX÷fdhfgehfjh ki mkmknlompnporqsqtrvtusvuwuxvwv xv#zx$zy'|{0€1‚‚1‚:‡†=‰>Љ@‹ŠAŚ‹CŤŚFŹŽI‘N”“M“’Q–•S––T—–V™U—Xš™Z››[ś›^žť^ťť`źž`žťb źcˇ g¤ŁgŁ˘f˘ˇi¤Łl¦Ąn§¦p©¨o¨§rŞŞr©¨t«ŞsŞ©u¬«w­¬x­¬y®­{Ż®z®­}±°|°Ż|Ż®´ł±°ł˛€˛±‚łł„µ´´´´ł‡··†¶µ‰¸·‹ą¸Š¸·Śą¸Ž»şŤşşŤşą‘˝Ľ’˝Ľ‘Ľ»»ş“ľ˝•ľľ—ŔŔ–żżśĂáĹŧĘʦÉÉĄČȨĘĘŞËËŻÎβĐĐ´ŃŃ»ÖÖşŐŐÁÚÚżŘŘľ××ĹÜÜÄŰŰĘßßÉŢŢČÝÝËŕŕÎááÍŕŕŃăăĐââÔĺĺŐććÖććÚééŮččŘççÜęęŕííßěěŢëëäďďăîîćđđéňňčńńęňňďööîőőíôôěóóóřřň÷÷ńööôřř÷úúöůůűýýůűűüýý(}{)~|-€~.25…6†„6…9‡…:†?ŚŠBŤ‹EŹŤFŹŤI‘ŹJ’L“‘M”’R—•V™—WšdˇźjĄŁk¦¤n§Ąp©§qި{°®„µłŽ»ą”ľ˝—Ŕż™ÁŔ›ĂšÂÁťÄĂźĹÄžÄĂŁČǡĆŤČÇŁÇƧĘɨĘÉ«ÍĚ­ÎÍ«ĚË®ÎÍ­Í̱ĐϰĎεÓҲĐĎ·ÔÓ¶ÓҵŇŃąŐÔ¸ÔÓ»ÖŐĽÖŐŔÚŮľŘ×˝×ÖÂŰÚŔŮŘÄÜŰĂÚŮČŢÝÇÝÜÍâáËŕßĚŕßŃäăĎâáÓĺäŇäăŐćĺŰęéŮčçŢěëÝëęâîíčňńďöőíôóňř÷˙˙˙ţţţ,X˙H° Á*\Čpˇ»‡#JśH±˘%CÚ˘˝‘Ł­ 4eË­°áPĹ“() LÉ2ĺ;v€ŢüŇEĚk͢©ů!•ˇ–@+® JÔÝĄCwćĐafW°4uŘČŮ€EbsŢ%:t+Ëwćp›Ó Üś2môř 4 €‘q×ĐPA#ÉkË®vOŞ–ć™´3ĂÔ´Áv ϲöä1§§™–[”ň˘Ä+Y˘#lĹ‚©1óĺŚ.3jň$„š6oxľACFĹĚĄĘ*Ŕžhéś¶3jâ°'7@N8ůŤ˛fiÔśńŇâÍl‰”g/"hkrôĘłÇ âć(˙ËR+Y&śaQôbôĘ—ýŃf X17o¸Ń)3A‡gĐ$#,Z<#ĆIŘbÄí=ôž;·°T„M"8Îô˘Ś3qĐM/™đŕ‡7¶„‚‹W8ÁKÖÜr‹ÁDŇŕ"\TŤµăG8áĽŃĆsčń†'1”ŁH 8€FąxáEwđŃĚ Đ1ŁláŘ’–îPr!~Ó‡!‡ěŠ …$’#AđFĎCF…"H¸Ű!Ź8(Ű#)p€i Âň‡;„Á¸#‚ŽVF#‰¨“G„śc*‚(B8‰ě‚ @!É <˙jăDS@Ŕ şs* Ä!¤  )řéNl±F¤’ÎĘK0U0‚;$M/VŠ@ ş`2Ŕ,2Ny‘Ь2@ ¶lrŞ3tF á (ÁlDČşĐK'âŽ@ŻlAl!ş ;°W謇ôÂD'¸ăÂĽL2ńCÍđE"ŽŇÇpČ8Ŕ°#C°Í ôAÉ"„ňŘAŃš<ÔG LŠ{,¸S .[‰0ĹÇupŔ¤˛B/Ń4űP6"âH!Ń0Â6ă Qo$Ź !ó8I#ŁX@I§ŞÔ´M3˙ Q'äˇ UűĐ!#ŕ‡×ŞŔž Xş“Çxíظ “N$ˇPĐF6â@Ä$“G ŇH$xb \CÓş“C Ľ·;w Đ)},›"SüáCĎ’*PIµrĐaë#ŘóGk‰ů }3nXsM°EP/đ0‡P±ŽÜŤŔ#(°čCŽ äˇ;D.(ŔbF+ŔbńŞŁ¶:€*†%D˝°ŘrQbH€wČĆ2ÎP†[`€Ŕ€ŕ"D  °!ú $îÁß5 |H˙E€Âp“@Gđ’އTk˘;ŽJPd(H  gA XPä †Ý\'áŕĆŕ0;\cg¸ÄČ‘«‡<'y„IÜq ,=(/•„ 4‘m,Ă ]0BŽ@ 48# ÎPC2|qŚhLĂÄ`C0Ś‘( ©@±„× wĽĂ äP5Ł =ČA¬4ě¦×P†1\(ă ĺČ 9| „ÁФl!€=Äa ąZ‚¬ŕ_pĆ1BBËC.˘@ŚR&ł=$¸€"üŕ†3pá/X)8A #đp1żFŕaĽřB]JůGŻ”m¸D!Şá‹*čŔĐ@'P°„6 € ±‡5übŹŤlń€¤u g LĐOÂW°!B@njŁć4Ül~P)şŁ×Č…XP b[ŔĂ %¬É9ŐieQ€%H$o‚+V`ŠŘŕ nÄ€pŞQ•Şd˛ J¤âŕEZ1Tˇ€8DÔ@­¤ŐO ¬`KX†;fox1.6-1.6.57/doc/art/widget.jpg000066400000000000000000000211451326741342000161600ustar00rootroot00000000000000˙Ř˙ŕJFIFHH˙ţCreated with The GIMP˙ŰC    $.' ",#(7),01444'9=82<.342˙ŰC  2!!22222222222222222222222222222222222222222222222222˙Ŕ,"˙Ä˙ÄN SU”Ń!146Vrt’±˛5Au‘•łÓQa"#2Rq“´$3BˇÁc7Cbs‚˘đ˙Ä˙Ä)2Q3!1ARqÁđ±á˙Ú ?ţ÷<)h#ÇČPaµ\÷˝nF˘qŞ©=¬żH)»Cw‹mĚjçb‹ĺR¤´´ –ę!ţĂĐź€óÚËô‚›´7xĎk/Ň nĐÝĺśš‚qMA¸€FĎk/Ň nĐÝă=¬żH)»Cw–rh}Ä4 >â=¬żH)»CwŚö˛ý ¦í ŢYÉ h!÷dĐ4űlö˛ý ¦í Ţ3ÚËô‚›´7yg& ‡ÜA“@ĐCî łÚËô‚›´7xĎk/Ň nĐÝçËkŕE!/NeňŽĘ`ÂT„Ć\ä|FµoÂjú•Kđ$ˇB—†Çµ±\Ö˘,G±·»ó[‘ĺýlśŃj"«űĄgµ—é7hnńžÖ_¤ݡ»Ë94 >â š‚q ŤžÖ_¤ݡ»Ć{Y~Sv†ď,äĐ4ű2h}Ä6{Y~Sv†ďíeúAMÚĽł“@ĐCî É h!÷ŮíeúAMÚĽgµ—é7hnňÎMA¸& ‡Ü@#gµ—é7hnńžÖ_¤ݡ»Ë94 >â š‚qŤžÖ_¤ݡ»Ć{Y~Sv†ď,äĐ4ű2h}Ä6{Y~Sv†ďíeúAMÚĽł“@ĐCî É h!÷ŮíeúAMÚĽgµ—é7hnňÎMA¸& ‡Ü@#gµ—é7hnńžÖ_¤ݡ»Ë94 >â š‚qŤžÖ_¤ݡ»Ć{Y~Sv†ď,äĐ4ű2h}Ä6{Y~Sv†ďíeúAMÚĽł“@ĐCî É h!÷ŮíeúAMÚĽgµ—é7hnňÎMA¸& ‡Ü@#gµ—é7hnńžÖ_¤ݡ»Ë94 >â š‚qŤžÖ_¤ݡ»Ć{Y~Sv†ď,äĐ4ű2h}Ä6{Y~Sv†ďíeúAMÚĽł“@ĐCî É h!÷ŮíeúAMÚĽgµ—é7hnňÎMA¸& ‡Ü@#gµ—é7hnńžÖ_¤ݡ»Ë94 >â š‚qŤžÖ_¤ݡ»Ć{Y~Sv†ď,äĐ4ű2h}Ä2[[.Ş–‚›´·yuQoE3ÖÖ^ lEmR 4T’‹rŁS÷T»-É`őŕkmĚjçb‹ĺRĚ·%ÔoŰsąŘ˘ůTł-É`őਠý±ô4Ý+óy[ʤíÄĎÔ)ń±3PqX0Q×_­^EN%SÖŘún•ůĚ<­ĺ.vµbgéôř8é¨Ř¬xHŰî×/ Ş')Ý/ZĽtţgôĚ´5Zu~‘/ŘČZ8słMZĽ6şWŤ÷ĂUŕN>şŚ+e!hč´ŚóĆ}çŹýoÝpS‹b;‹×}÷qĄß™ą’ˇŇiŃV,Ť.JV"ĄĘřěbÝüQ Uš\ěݵłpĺd˛¬˘&&4kxo[×đĽ“Éb—/;)M…ˇ?—Í6ü9śJBĂ˝USôS.K“ů`A¶ÜĆ®v(ľU,ËrX=Fř­·1«ťŠ/•K2Ü–QľF¶ÜĆ®v(ľU,ËrX=Fř­·1«ťŠ/•K2Ü–Qľz€ŽsXŐs•ŤUOÓ3ná2=ť‡+đ˘OJ1ěr^ŽjÇb*/ä‡)§‡ßA”ŔÓĂďˇÍ9¨i»37 Ńłš†›ł3qé—*šĘ8–ź)§‡ßA”ŔÓĂďˇÍ9¨i»37 Ńłš†›ł3pË“YGőµŃ#ĚČ@—‘–Y§e0bąYQ¨ČŤrß„äăDRô ČQ%áľ#™ îj*±Ďj«Wđ[•PÎfŤśÔ4Ý™›†hŮÍCMŮ™¸ćTŢéĎDÓŰŰű–ź)§‡ßA”ŔÓĂďˇÍ9¨i»37 Ńłš†›ł3qÜąCYGÓĺ04đűč2x}ô3Łg5 7ffáš6sPÓvfnrk(âZ|¦ž}SOľ†c4l桦ěĚÜ3FÎjnĚÍĂ.MeKO”ŔÓĂď Ę`iá÷ĐĚfŤśÔ4Ý™›†hŮÍCMŮ™¸eɬىiňx}ôL <>ú'Xk&ç+ťfi ޷ެ”>ö?3ÉtbʱCÜ2äÖQĵŮL <>ú ¦ž} ŽbŮ.ŚQö({†bŮ.ŚQö({†\šĘ8–»)§‡ßA”ŔÓĂĚ[%ŃŠ>ĹpĚ[%ŃŠ>ĹpË“YG×e04đűč2x}ô2l±RŃĚłt–ą8•˛pŃ|\Ńłš†›ł3pË“YGÓĺ04đűč2x}ô3Łg5 7ffáš6sPÓvfnrk(âZ|¦ž}SOľ†c4l桦ěĚÜ3FÎjnĚÍĂ.MeKO”ŔÓĂď Ę`iá÷ĐĚfŤśÔ4Ý™›†hŮÍCMŮ™¸eɬىiňx}ôL <>úŚŃłš†›ł3pÍ9¨i»37 ą5”q->SOľ)§‡ßC1š6sPÓvfnŁg5 7ffá—&˛Ž%§Ę`iá÷Đe04đűčf3FÎjnĚÍĂ4l桦ěĚÜ2äÖQÄ´ůL <>ú ¦ž} ĆhŮÍCMŮ™¸fŤśÔ4Ý™›†\šĘ8–ź)§‡ßA”ŔÓĂďˇÍ9¨i»37 Ńłš†›ł3pË“YGÔ6<'»‘XĺüȧˇšˇŇ©vŠÎF§ÓĄebşyĚsŕBk[Š·-Ţ®7„&-6Xé×ÓŠÄĐm·1«ťŠ/•K2Ü–QľkmĚjçb‹ĺRĚ·%Ôo€­·1«ťŠ/•K2Ü–QľkmĚjçb‹ĺRĚ·%Ôo€ rŰz_Ú2=†ŚÎ[oAËűFOç° -0Ŕ«śł^ŃwČŠk ťcÓ–kÚ.ůMaá^ć§mâ€AaŰsąŘ˘ůTł-É`őŕF¶ÜĆ®v(ľU,ËrX=FřŰsąŘ˘ůTł-É`őŕF¶ÜĆ®v(ľU,ËrX=Fřęg-· ĺýŁ'óŘhĚĺ¶ôż´dţ{*Ó ±éË5í|¦°ÉÖ=9f˝˘ď‘ÖîjvŢ(m·1«ťŠ/•K2Ü–QľkmĚjçb‹ĺRĚ·%Ôo€­·1«ťŠ/•K2Ü–QľkmĚjçb‹ĺS‰k[G‡<śĚä)h˛ŞŘnHŻFá*±®˝8x¸nţG&b=Ň¦ŠŞŰhA:čŢOú¨3®­ä˙Şr–WSí•9m˝/í?žĂęÎş·“ţŞűIh©őiU’’ŚŘërB#˘1Č­\)†ĄÜżŃ˙tˇÉéWi›4Ŕ۱éË5í|¦°ČWŞöv#¸›>ç/ň—Š}ňVŇ9%gď)x8Ö#ńq"5ŰÓ‰Rţ2żRb*őköť:ŞčÄÓh:čŢOú¨3®­ä˙Ş„1G+9]O¶^6ŰŐÎĹĘĄ™nK¨ßkm=.zĎUé˛s0ć"ĦĚE„är5—/Მ)nI¨ßěŤTUNč˛5¶ć5s±Eň©Bź!-/ ѡBFÄÁ‰x𝂍żÜO¶ÜĆ®v(ľU,ËrX=Fřr&cŮ­Új„ŤĄe•g’§dŇmË•¶ pŐźęK—…×ëâŕ>(¶ű& Vg&¨Ź—¨R_ ł/ŚźůŽDjŁŃ.ąUx˝_™óVč˙}}«˛[ "cd#âž·GTÁUąx8o»ńD<­ť›‘łżfuÖĘşĄŽšŤ~C–OĘËâáă_ŽŚÖ`˛ű°–őŕKř/âĽ—Ö Qm=” صĘd9I…rAŽů¸i"˘Ü¸.ľĺąxăď•›–ž–dĚśÄ)öE‚ô{\ź’§‚ŇöykYggjKN•­ÓăN"ŕâaĚ5\«ř' ţH~şŐŮĆN¬“ëô¦Í6&)`,ä4z>ű°poľűř.ăĽĺÝĂ<+‚­Ą•cŐŹ´Ôfą«r˘ĎÂEEďˇE‡"Â{bC{QĚ{Vôr/˘úĐ911îčd­EĄP‰!%Y‘›†ŞŽ;\î;’ţ˝wq©i¨kYűť*ňKRľě—Üeüw]Ţ®1wpĎ  ůŇ~MŐH6nζ5Ňé1ËîÂVß}×đ^|Svž ć¶rąL–s•ČÔŤ7 ŠŞ×+]Ćľ§"˘ţ ŠËJ¨#Ą­łK*餴4•—kҢĺ°đꊨŐ\+ŻTE[ż%=!Új Y“Đët×ĘCz1ńŰ7 aµËÄŠëîE[ř…ÝĂ<*ĺś©HSš®ťť––j1ŃcĹk¨®á^$W5ő'â‡Ă-klÔäĚ9i[CIŹ#°Y ě79ëř"#ŻU-2°:ŕ5cÓ–kÚ.ůMa“¬zrÍ{Eß")¬<+ÜÔíĽP, ŰncW;_*–eą,Ł|ÖŰŐÎĹĘĄ™nK¨ß#[ncW;_*–eą,Ł|ÖŰŐÎĹĘĄ™nK¨ß=@ ĺ¶ôż´dţ{ ś¶Ţ—öŚźĎ`%@Za€?“Wd–~fɲüsęńćŘŚ^kĄ–a®ő/ůÎjúâő*jˇ›´ś|S%eᢥíá„čëů/ůěüxşŰ2ĆۧÚl©ßĄ"’ą.čáa_Śľţ<›uÜ^ľă˘Řř” '9F©5#LDöĚÄ—ÂF#®j&_‚ÄFń§qqłÚk‰Źď”¨đ9ö} ĐaşÉĆ\j*_jńU©†Ë;9héô†ä’sôůh±ˇŔLÁ|IŚCâ""\ŐV-ëußĺŞţfŽ5¬,…˛ö‚úL8›2´ü&Äk›‚źˇŚŕTj'­o^ČúĄldSjĐ+3‘*sUfbç&_ °ŐX‰sZƧQ·Ş§ ŞŢ-$WëëľZĽ{5DžŁŃ¦,ěu„‘Ąň927Ŕb#a¦3ý.ÂDüî_]äK31ZdíN­“”ť”űňrůçαŹDĘzŕ+x?Ź Ĺ–Y*üÄI)z­§lĺ:Jb Ä6äHŘń] ČćŁâa*q˘^¨—Żä~ÉYKGM¨LľJŐÂ…OŹ=qe]Lk•$E{™†ŻżÖ©}ßČz—¦Öżúű&ä$óň’Ü’ΦΪ¦-8W+ĂĹůŻĽ[řŹaŞ €ĺ…ŤHRęćp`2$FCrţW5ʿȯ›ŤŻÉŐ1·dň±ĺńx?µŚt'_}üb®şî/ˇşµ2ZµIš¦Î5]/3 ażnTEő˘ú•8Đ•Š˝be:ˇFĄÓ¨ŘůZTľ2™ŃdÚČhŠÇ5‹r5S‡ňüď2ď ÓSěU_ c%+ď ±úyF/ŽÂNđ¸o㻀ąN ÚHs’í©Ú„›—^PäŰ$Â]rc_zßů܉Żđ'Ą„¨äIAÎfÂ-Ů&Oúő…}řśm˙±ęľëîŕĽçÂQ1T ¨± Ű8ö­ěVE§ÉÓbM'á/#65÷~ííý˛ÄÜĽße–˘+ŕĂ{Ű÷ʱęÔUO×Ěq)¦mť€µjÄÜg¶,˝NR «ĺ°.Fµ‰†ţŇ%×\—]ëĽřiö=d~Ďf,ŁŞOŽčĐ&`¬ăá~•ńśőÂVß©‡řđÝęĽYŮ®&ß öú ¤áŮŦҥćŁýňĹlŞą°›qř×*'¸ř-şµ•—“­ŮůzT8ő™(.e±’+ŞŞÖ¶î5CSjh3•Ůz~ASm:jJq&ˇĆtşFKŃŹeŘ*äý˙ö>\Ú«ÎS ËÖ+đçbÁ¨KÎ2+$R Í„öżĽjŢ?UüJ&¦¨ŹúŹfăľj·G§T.‹9M§ĎČM#Ňü7C‹(ŤrßűĚŔ˙"ĺź’•mnÓ9˛ĐQĚ©łR~ŹřIeŕü8UOXv^uÓC™V¬Y•‰-Ŕç+¸ËďăÁ†ÖÝw©8x ܆v©1ŤĂËć›1vĐaÂ»Ź‡ü»ďŕă»ŐxrŞŁčűŔž`ŐŹNYŻh»äE5†N±éË5í|¦°đŻsS¶ń@ °mąŤ\ěQ|ŞY–ä°zŤđ#[ncW;_*–eą,Ł|ŤmąŤ\ěQ|ŞY–ä°zŤđ#[ncW;_*–eą,Ł|ő3Váíe ]\·'ŢRIüÖb!Ą2żhÝ•ö¬‡÷P€®-0Ŕ+Okk¶anWTś‰ů®OáMqŚŻóŠČűUßÚÇ6ez÷5{o/tmĚjçb‹ĺRĚ·%ÔoŰsąŘ˘ůTł-É`őŕkmĚjçb‹ĺRĚ·%ÔoŰsąŘ˘ůTł-É`őਕű@ć쯵d?ş„jŚŻÚ7e}«!ýÔ +€ L0~żÎ+#íWkŮĘ˙8¬Źµ]ý¬sfWŻsW¶ń@"÷A¶ÜĆ®v(ľU,ËrX=Fř­·1«ťŠ/•K2Ü–QľF¶ÜĆ®v(ľU,ËrX=Fř­·1«ťŠ/•K2Ü–Qľz€›u "Peš·Ü•)'p~S×ţ 1ś¶Ţ—öŚźĎ`¦r~Ęşű°*nwń˙ ?äŘ:ǧ,×´]ň"šÂ˝{š˝·Šş ¶ć5s±Eň©f[’Áę7ŔŤmąŤ\ěQ|ŞY–ä°zŤđ5¶ć5s±Eň©f[’Áę7ŔŤmąŤ\ěQ|ŞY–ä°zŤđÔÎ[oAËűFOç°Ń™Ëmč9hÉüöT¦5cÓ–kÚ.ůMa“¬zrÍ{Eß")¬<+ÜÔíĽP, ŰncW;_*–eą,Ł|ÖŰŐÎĹĘĄ™nK¨ß#[ncW;_*–eą,Ł|ÖŰŐÎĹĘĄ™nK¨ß=@ ĺ¶ôż´dţ{ ś¶Ţ—öŚźĎ`%@Za€#V=9f˝˘ď‘Ö:ǧ,×´]ň"šĂ½ÍNŰł ¶ć5s±Eň©f[’Áę7ŔŤmąŤ\ěQ|ŞY–ä°zŤđ5¶ć5s±Eň©f[’Áę7ŔŤmąŤ\ěQ|ŞY–ä°zŤđÔÎ[oAËűFOç°Ń™»n¨”( «r%BNő_ýöTAĆ6‘ľńŤ‡¤oĽłv&v1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćv1°ôŤ÷Śl=#}âćI¬zrÍ{Eß")¬25xŚuvÍ#^Ő_ĽŔ‹˙B)®<+ÜÔíĽP˝Đm·1«ťŠ/•K2Ü–QľkmĚjçb‹ĺRĚ·%Ôo€­·1«ťŠ/•K2Ü–QľkmĚjçb‹ĺRĚ·%Ôo€ ŚÔ¤´ô»ĄćĺáG‚ë°ˇĹb9«w p)쑚¶{QÓvVn«gµ7efâ¸FjŮíGMŮY¸f­žÔtÝ•›Šŕ U©ˇHÓä LSéthWÇ…í‹OkďĂ{[zpĄ×^Ze(iFŁRßNl›ŠżŠ' ŢóĘŘún•ůĚ=íEw6¬ÔŐ_&Ęr|Őaŕaa=­ăąný«ř˝Dct˝j¶U??§Y«gµ7efáš¶{QÓvVn"ö5iZ”ڵzĚE¦ÁťŽŮxQŰ8ČéŚwěµQ©ÁyâËi^››©2™d];-#7Qń›PcÎbđÜŐmüJ‹w'“Aš¶{QÓvVn«gµ7efăÖYhhrµYf9¦ŞŤUZ©ü•¤ŚŐłÚŽ›˛łpÍ[=¨é»+7Ŕ3VĎj:nĘÍĂ5lö٦ě¬ÜWHÍ[=¨é»+7 ŐłÚŽ›˛łq\#5lö٦ě¬Ü3VĎj:nĘÍĹpŚŐłÚŽ›˛łpÍ[=¨é»+7Ŕ3VĎj:nĘÍĂ5lö٦ě¬ÜWHÍ[=¨é»+7 ŐłÚŽ›˛łq\#5lö٦ě¬Ü3VĎj:nĘÍĹpŚŐłÚŽ›˛łpÍ[=¨é»+7Ŕ3VĎj:nĘÍĂ5lö٦ě¬ÜWHÍ[=¨é»+7 ŐłÚŽ›˛łq\#5lö٦ě¬Ü3VĎj:nĘÍĹpŚŐłÚŽ›˛łpÍ[=¨é»+7Ŕ3VĎj:nĘÍĂ5lö٦ě¬ÜWM–łôi)†LJŇd`Fgěć.Öąľ®D)mĚjçb‹ĺRĚ·%ÔoŰsąŘ˘ůTł-É`őŕkmĚjçb‹ĺRĚ·%ÔoŰsąŘ˘ůTł-É`őਠý±ô4Ý+óNűP˙ĂzŻýźśĂď¶okhđÎDUž•ă_úĚ4-TsQQoEN4#ĄíWŠźĚţ™i+#-R—ž›©Őęqeť‡µ Ľka»÷‘.Nůä)›=«i ŐíUf•őy«Ą¤˘=!˝Šë°•ĹEU[ÓŹ‰ţÚ TŰC/ Ő©°á±0ZĆÓ\Ôü1ĄńęwÚČyĄ×T˙‡;ꌊŇëŞĂťőK€8‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸‡‘Z]uOřsľ¨Č­.ş§ü9ßT¸ĚÔčUúµ.jź1[’H30ť ęĘzŁ®Tąnýg¤†Ě\&2űđZ‰yĐ˙Ůfox1.6-1.6.57/doc/art/win32-libraries.png000066400000000000000000000144411326741342000176160ustar00rootroot00000000000000‰PNG  IHDRAtÖuđPLTEŔŔŔ€€€€˙˙˙˙˙V$itEXtSoftwaregif2png 2.0.1=^ľh¨IDATxśíťkvŁ:ł†Ĺ^äëx÷Ę ’„ś{ţc9ÔEw ,qqxŰ;Řń¸THEIĂ­E ńgşµ ď™ĐŃ_Ňąő6úßÇ­´nB9Ý„\±óÍ‹›«/r>ó‚Ͱčź?Ö§?'ý›łý•őW÷ˇÁ„˙‘ŰçĎŻá„ú®ďĐ Jd ˇ~+!~aM?s­ú„sĄű€ „`Ű4˙ű™pűüËŃçĐVPąT-Łęfüţ›IŔx"?Äż@Úţâö4™-‡Ń eCšĐ„ČT¦ü•ń‹cĎ µlBŽ }BtáŇ„ČiBż –ńŐŢóC‘Z¦kžEčŐ2ďZŇmj­EźÓ‹Ь│‡yq÷Ë\ –yqĘé&”ÓŰ…Íč&”ÓM(§›PN7ˇśnB9Ý„r:ˇţč,Š zďţŃćÔ˘çôďęÝ(Bő X®F„ľb/LhÁŠż‡aĂ[ńSz$Źó–(]9ˇżmôĹ„˘ß8—1]Ľ…·„’ÇyžĐC´PÇ„– đÖĄO+ýV‚Pú(©íĺ„ŇŐ`Ô‰ť‡ą(ďű$DOß'#Ôs±$=ç ˇ^đ'­ćI/„~]™Đ—9CC¨ÇoÍRoaŕ7ťÖ“"ĺě«´jŹ>˝ŰÜ;Ž&ÄĹ’ćÓ†P‡»éűoíŇěA¨ó[Ź!ú-F¨Ç?í»đšő¤ÇŘe BNMÂĎQŔcţŹ›ĆŠ„<ą„ř;ŚĄ6„D×w˘ďű VĐ‘a[g˘3(9Łëšk{'ŕ§€Cű„ćM°UŐ(›}¸S8L-›w×)"†Đ|„÷7Łťwjú u!ř ř:řz5Pihď˘hČ !°m„f'B€Íß |-˝OKĂŹbB°;eDĆÁôÎčpDčí ‰€–O !*@‡GI)BBΕ Ţbť A1#~hŢ ŕ'Ç#›â„hËüwě†-H ˛EEhĐ„ţ2ˇ.Fý*@ź $ Zš7éÇ:BpńŚÂÂÂ7ŞÍ×±ˇa™P´–6ÄÇ16izS„DäZ¦j™ţ3—Đl>’=Đ„? A™B‚đŕ# dľsę:rT Bˇ2µLŕ/˙dmľR¨ž}ĎŽĐxjňZ.!ŔA64m%4„z´c‡äŐ2(3zj8'ÇSĂoÝkAm%ŕ>!ĺ©çťá/ÚS/ř!GÁĺđ1‘ŁfHrš¸ÚQP\ń†sź~Ë"śEú(¸Ó…k^ZĚáĂF§Mhn ‰ą-„í!ôÔh­§Ög¸…°zŻc©=”SľM˝Ż ĺŢ:!n`ß„*é‹hç!D~‹őg Ç˝Z}­¶!”ŕÖúwmËD„ZÜk‰nÝ÷ěÚP. ÜŕPD¨ ţgĺj‡ÎęĎ…Yß+ç{~¶˛›I×ţ&”{žÇE qŰO¶$Äe¸0!ůxż BßóĄë;ňVObÜJ|9BßtY˙ţďż˙Ţ}B@2r®ż‹ý˙…řÇçQźÄ/!TTŔ0’O„F$ôóëŮ„$pŠ%Ä€¦5Ž,!ŚâA(Ů—łô¶Lhüůřd?IJĐ8Rܬ!Ľˇ[F¨RžÉ{Bsőúžeى˛Žś®FHŔM‰2B•Úűę(•lhBŻăŹňÔOĆx/}EB`Câ¬Ö­žęµ,$äDâ+˛ÚďĎÂ˙Ł?„{UžmHlş˝š(uH¨÷ň4ę2Ç EÓ@qŰÔĎS(,µEhŘťťä`ßßIR©ŠµÔÇ9=BśŃ€÷ë Ą‚î)>ž3Ţ„vP$>Děěô…ÎÜ×’«Ź•#¤Ó@,óÍÚ#úˇäŰPg§/Ô"¤[!7 äL„ľX!ľÇ!$á.&4ÉÖ·ë­ÖiÔ†( „ď—Ú#>µ!“ŃŔŹNöýđ•Ç2=ś(!NYĺ©§ćńˇ {Ćś.í©UĘ ÚĐS„T/9Ahm-‹Ć‡*+bCŽzëgBĂ!ť’÷ÔKńˇĘŠŮŇ3ą•m+JiąMŤUVΆ1ˇŮSĎ€Ö›őˇ^$Őý2Ő·ŁÄž‡Ş6"—m( „ÚzüŞ6‰ašŮę$łl©×ŮJn=VEB±ř„ä) ´*…*§-6´UVçiB±řÔšÚbC[Ő ‚ćć ˇšŚVŮPĄĽu”ď’mq|kYuO˝Ę†j”wW˛]ŞÜv\eCGiM|h]–bVŮĐQ:4>tq:&>t>ť->t>ť->t>ť.>t:•ćXý0ŃEm(ŇÍéz¤.jC©řPBWµˇ0>„á!é1ľĺňy—ë˛6ć¸ăJQĐŠţčŞ6Ƈ4!A#˘k)uŻĂľ'Ó÷}0T’Ţö™¬(>dŮŹn­ŁÄý2ç&ş}BBV|¨U-‹ßs˝ˇ0°ä©ë5łS6¤î(BšŚŰ†BSHđčfşŻ/hđůľ„öËJÚPŻoIóČvĽťßŃđ3@ݧŘ•ŇůCI?v#zž€€i(!ŃŘ‚Î264¸„ş„ 5wFg‹ůµ¬ł ц8¶–˛s? yj¬e4•ŤI 9ČS+JÔśĆ.'Ş“Ć‡â„ nŇěŔŨ<>¤Óó§jÝű«öË’ń!©ë\%B—íۧâCŐ ]Ő†"ń!´“ź‰ąwĆyDÂDzrlTe}-˛ăC”=$°ßZ1 $bCŹíă˘ę«KĂřw\©g?RQBÚąUż¬ŻĽ M".6ˇ*ľ(fCĎﵞ2„ěřP„PŤZvY âC”ä)!öÔĎ— jCŇţmĂ)üÜż ·Ź±[sďŇ“”j†ŰŕKO'>ŮńˇfçQ’ö'tŢ›·‹lăÓBOzöÄ0ź ¤w(T|hĎśüŔ†ÔĽˇ±lŻFtcęOč ,JN[í ¸ Ť`óŰ]Ň‚TsşŞâŰîvJ!ýŤ’xŐ´µŢ»0ÂhˇSȨΠ~”!tL|čA#¸†ń ¨Š0ň¸Žp»˙a«ŽFw%ٵęnu%ÄăĎ/Ž'µ!!Ąnt‘ńk“Ä·íŞ b6˛I¶$˙]Ic ¤ä׆ĐTHčřĐĂĚ9;Şz!BŞčmWź÷7N;xwâq4ô}ŘBűLJĐIsZŞáĄNZŚŞ¸ŰŁyŇÚř»| ăkŮúZ}/>T]‰k4P${Xô˛…Ü+{jéo'OŮ'=o‹ěJ‰g¸•ާ^"ÄíˇĆ—m˝šfZ$Ű,ËmjčŔ0ľlˇl¦weBA|ó†&I)DŐĆ]¶_ɢe5ČjwîŻÚ·ŹÄ‡Ď‹Ţ^Ô#±ˇF3ĎnTy|H"$ŰÚPť×Ry|H5d]B׾×á䩼!ěUĘjžúŞ÷:‚řŻřÖ ş¨ )™řP3BµˇuqşÇ—‘Î:źÎzZćvr%ť->ôü éŰÉ•´">¤c~ŐÔ†„>ž¤…K©%ÎÔ“YŘ,šă¶&>TťP<Ö?©Ĺňo$Ô[şĺ݉íaC!ˇ•É‹»ňăC|‹ ‚”ͬD¨Č†¶‚ôY˝˘'-đŮ jĚžVÚ¸N'/ú “˝wĽÂř´’ꍟŠÚw^Aů3 ć!ł˘§Z_—4Ł ¨ wfŃOg1Á4ˇ >4ńýE¨eŚ18ŻLů3„Ôjڏ˘˛P„pÔŚđá¤B(‰ń-*cCµµ!ďĽ2ĺ/$„dlČĽ© őü„ÂřP›Z–˛!编Ë_J¨w©q"B%µlňăC|‹Şľ§ÎŮ©eÉň/˘Š„.™TMQňÎ+(şąM]c”ĂŮĆ—=}^Ě^şĂúÔLć› í  Á’ĐĎŞŻ;>”ÓĘéĺâCŐőrńˇę*ڵátQŠĆ‡řgĹČ(bCűŚů)ŐŠüˇ6„bąíGü”+56 9ń!I+PúP5B—ÍšÂřŐÁůŁ•ô2ůC”zL„(—ąZ .oC“‰iŞx]»Ş MS">T˝–]ۆÜř¤! Ěe®Ą«Ú4¦ŁâCW ¤4Š#âCW"´K .mCZí ׷ˇoüŮŽĐ«ŘP»@Ń«ŘP»@Ń‹Ř\ýU HÖ-Á‹Ř(Şüxu ¨6ˇW±!o YĹ0ZĆ®06ČW8Ьˇ UŰwĺmő÷ďĂLT=Uśâüâ÷: ¦™Ś5Ь&ˇ‹ŢëpáŔ¦í 4«ĄW±ˇń1ÚÍÚúˇó©Ŕ†x"‰z*ÎľQ/bCIkÂçel¨ˇ^Ć(pýŢ‚P,Ź1‘‚ć,½ë,Ě6„śŢZŠŘP*ŹÓ!´Ç"Z%64M?Óź÷„˘ą°qť”ćôŁgC‘5 %l¦ôPßL‹/ŕw\żcô¸|Ákw´ś ľÔ†¦Ţ&T©ŐőCťY8WV€…Ěây^tÖ’GRś~>>šŠŰ:aĚĆE_\B|.DG/pFÓE;Ęlč㓉D4ŃÖSÜ)BýÚĐ@o«Ź6^A¨Ô!ˇ0‘HŞůÖ6Z´!UË`śB˛– ×2 ±%ˇ ‰DŇ&B‰k LQžş';RžşSoó‹c=5sÂůPHôˇ˘6ő®—öJ[ŚŞ–y‰DĎŐ˛ żMífÚ]ëlČK$źôÔ×ď—)B >ušr{3ňUúößřÁ„^ņFJżŢHaI\†ţ˘„ö_FOŹ›P’—Á"tŘŽ¨Žźź:$ôŘ}đĆ‚ă:lBŤÇ—Ĺ5<Üj­śźşb¦ąRŚPíü’g´r~jY}đÔe Mńů‡nB‹óá˘8µ‡—]ťP0˙Pő/—%4&Ć—U^vYBńů‡” Ől ]śP0ľě®eîµĚ_†žşöđ˛Ë˘ö;ľL&öńś.JHiÖř2üu ]śĐş8ˇc˘7!G×îŰjx¸Ő:~ý˛ˇ ŤëâCdMUÝD„PÍÝ?ݵë—ÁËքΧňřĐMh1>$qq=XgŹ–Y•‹gţKąń!řŹ+tÉJ«n_™P4>$©o?U[ŰţĘ„˘ń!›P5otqBN|Č]:ö·×˛)6?5az™Ő_M(jŁ‹RrâCűR+˛ŕ„íJ˝ł˛‰Ą’Ď2„ěäÖ>±nG~açu¶č‡^.ŕ&´@ĆvŔ˛&˝ۢćűW+›ŕ ď0úĄĎΛßĐ1ńˇŢZJ٧±-ĺâ[+›(“ęşö€N AÖ˝0„hÍ#ôr7‡ňăC˛Á˝ˇ!!|B˝eC˝eCÖ‚@ű ăC㎄şA/h’$ÔwšüřĐŢ„ŘS÷˝Ű"Ü•YptŚ@‡ÎËHíM(şľ= NE͉-6¶©qi­&4b*‹Mj€ ?dKBąĹYú’–ę©$>¤µ×ŹZihí—Ĺ×·ßцN¦ÂřGč—G?¦ >$iQ{ă©+]Í®JčŽ9:[|hżQ-%:eţĐŽ[˛ĘŚ|ąłcîüˇ¬îüˇśN™?„%ęřđ˛ć»+µn|™l`Ne„ŞOi\¬âńeAôŁ–®JhĘƇj)EHÁ™(O ŐtYŹ/Sń!xŞŞRBGYŃŠńe“ęŇËŞ%H^Ëđ0Ěé„„Ćd|¨v7䪄Ňń!YąIBv5;/ˇH|h—Z†y\4ÖŹ^žĐS§âC»yęłčřőË.JHiGć®Dh]śĐ1ŃŹ Ť|9*č<šr+š:źÎRsś[ů j†Ć&f\1ľŚU±e#ä’čő–æö,ŽYŐ®˘«š˘ńˇ a>'ÍŰcV5fÁ„ÔđŢ©‹…„‚eËđ zůŐú ?„™f:ůĚ̸Ü ng@K6ä/[Vż‹·!&„™g>ˇn—ęˇH|HŔ°Dž}h/B ŹOhďkÚ˛ M:>UŤbŐ»ŠŐ˛îLµĚŹíXËŚ§¦áś<ő°G’y!/>4ńěCŕ©«EüÚÔ.…#ç9?[|HÉ0$ŚsR:&>t>ť->t>j¸ľ=—áş„ZŻo}B¤v˘ˇýs—třúö±8őîÉŠ Ęä1jLŰ­o!T÷ŰôĹ,O¨őúö§%DOߥ64¶[ßţ¬„ČŢJm¨ÝúöQBŇţLˇʰ7nc6… ߥ'Iť©ÉJ,'„jąľ}žÍÄF6#ŰÇřĆôźĐ“äáJV´âéÄôiAň žV án§1¦ŁżQâFśě&Ř­x8 ‹NĂBÝ ?Ôn}ű8!IGáéÄF>Ux˛ěČv˙ĂVŤîJ­x(oťĘ5ęĹ?Ôn}ű!1a´WO'6rĄr’§˘÷¶«ÉµĚF6 É–äż‹_ěŠ_»„`¬m± µ[ß>mCX×T˝!5˝·]}ŢßhM˝ĺĽ«2ëč?ú0‹P?WšU~¨Őúö ?$Íi©)ĹÔI µRˇ·=úáqd¦ŃwĄ *)׆ִ‡f[Żśś—!¤W DO ^±{eO-ýíä©#á¤çm‘]©#Q¶8âmO˝âZÖPŰÔç¸Îw®´ˇ†ëŰW#”u­‘®o_φŞę‹ĂCĹ6Ôl}űł×ŇÜőí-=g±€ßßTÇTÝOţÝ)Š[.Ý~ĂgôŢ’ţ{ĺ7mš•ń!gĺms¨i2yBŞa­Ž¦ý‰:¸śě§)˛Íiáb§vgšyR˝§ö˛2>d­o!·żYФ MIBkŻez}űH"ŃSË&G Q´FP·ŇďŤę7jFŐý¤Ť´mÄ^©1ŮĘH˝`(¸KgÜ–Ř'±ë܆k™YßŢOqŞiZŤTŤfŐv–n“úÎşë »źşřµÎŃDŦŽ)ĂN¸Ä®żÄN­T5y=!}űH"‘†T‘Ф q-ł»¨’â/v÷Ó#$UńBskš»lC÷‚ź"Äś°ď˘lČK$Ú…\IČěB˛:f6ˇ1nCĹí!EtT- ú›v-§ŮF5Ô'ä\Ë!áZßR6$=ąŔý‚§VGńú›ˇ2ż˘M9žzśxŠ$îŮ;µ 4ł ŚPŇĺ§–L_mCqÉi›ŐoSĹ(ďŽ9źüŇ*$„§q~Bˇ!Ż©»,WÚ×Ę•ĺ-Ń9ÄÓőË mH%Ĺ|DUĄ$*ŕl„ mhBÜAě]BşS×hýT’©os…6¤ ÚĐzzdĹü­G(şű1ýÖ˛ űöظzĽ7%őÔ' DO™ľ˝N˛+Űç„$Ů!Ź­"I3łHn$Ťx7űśŘΙ°ÁĂ]l=q?•ţN-C»ćVq¦×ai+mȶś}™5Ř4UCZRëXߍĄ¶˛äľjF«4uSĄľďł"Tť#4ąăËö&4šŢ–ęđMXĽµ>j<ôZN¦ë3qó›îÖb‹ź‰uËÔd ąó—źĎY?3–Źé~«F:?!!Őń㻋ÔSN]BŞ6‘5iZĺ ©´!Ehţ˙AŹŠ„pŕŻßsĹŞĹ5{a\ËTwKÝpfn“©–¦–iBäÖÖղŻŇP˝ěńe3!Ô‡zŔëjµ &ë˘ŕWÉSĂů«ľ©2+î€bLĺmHţöß\CÇV{ęĄĚţˇ¶„úLżlĹy%µz™ěţˇŮ-˙|*ö ż5˝–ŮŞŃ\żŹL†•?ľĚ"O˝+ˇcTÖšÔÝ’ÝŰÔÇ«0N=RfŢM(IH©!ˇóƇVj¨łĆ‡îu4?ŇŮ-Üë8ŞH†ĐŮç°:NŠĐQßQ\g$t>Ý„rş ĺdzk:¨6ŁąoGłË"Tküě6}ü´ ˇ[IÝ„rş ĺtĘé&”ÓM(§›PN7ˇś^”P_Ňţäú÷ăđş„rçN„r»±zݦţkůý·›ĐM(Ł›PN7ˇś\B8µ¬3/±OHÍÇĎRý5„`˛twÎ]Ź7˙ü/%ä  î~!·Eő4?>nBq™řůAúU„˛µlvçÄF_J(ă©m=Ý/őC‹W{¸–uÎôkQ{Č6˘H{jŮ/őÔˇî6őM(§›PN7ˇśúďL6ĹM¨,N]•ň» }ęE UÔM(§›PN7ˇśnB9Í„ÍňĽ€˛Ľ[˙řS*Ľ”xŻ÷IEND®B`‚fox1.6-1.6.57/doc/art/win32-linkoutput.png000066400000000000000000000144221326741342000200570ustar00rootroot00000000000000‰PNG  IHDRAtÖuđPLTE˙˙ŔŔŔ€€€€˙˙˙˙˙56 ŁtEXtSoftwaregif2png 2.0.1=^ľh–IDATxśíťŃ–*Ż€9îĺ#ü÷.{ć~ÖĚętîÝípnţ÷…#I@PŃ Ř1ÓN[ۢ~ B˘˝dV„ř—ĚČ«'tôŹT¶ÜzB˙ű¸$,ˇ\„\!ăÓ O.B®<Ńř|OP ?đók}úGšWÎöw–§şşűMH¸·źß?ĂGjަB=(%ňW Ń“üíkŐŹú×Wş‡Ş`ŠÚ&űż_ ŰűGźC^Q•K×2¬n‚żž„ú§ĐŃK·żą>ő`zÍABřDëĐĂ’UE>ŕ%"Ł'ÇžAn± 9:ôá…ËB;d=ţ@-Ł«ýČ=<µĚÔ<‹ĐŞeŁk™âa[jB=5¶`ý Kmj™Ý2Ń7W G¸MmdÁŹ|sęĺő ň9<ąúe®’áÉE(&ˇÜ./lD.B1ąĹä"“‹PL.B1ąŤBÍŃ0+DčбűĎ<§ć=§Żäb4!ţ\.™=}OLhF‹_m»â-˙)}÷s ÝrBßyäI„Ľż8cřđfŢ  îg;ˇO‘C*"4w·*|Zá·„Â{ m_N(\ V>±rˇ‰ý~í„đáUˇ†«ĆGőéP#č“Vó¤€&@H(, 9ŠPżÉÜŇ©‹§‡¬úEŤú::ÔÎňÖ˛‰Ń~ť´Ý4!áą–éZfľćęŐ§& $áb%!uLBńŔmBhřÍĹ„PUˇˇ šÚˇˇ– xńOT‡ÔOŞŞgÓ!,5Z-—Â:$×j'„´"4ŞeęÁR«sr,µzUµľöŞ­|LH[ęľ0xa,őŚrdr9ü”h¨ ščÎŕ„üâo87á·,B“łď ťą–ÁĄeŘý´ŃięC˘o A{,µ”j©Í®!DČŢëkĹ$ަŢW‡bo•GŘ!&y’­Bh‡č°ţˇčˇö8BÝČĆ/É:2rđµ)„Ň}ŕ‹ ĺkńî.íwvu(ćPÎp H(ţ­âĘ㇎ĘljYż+Ĺ{ţäŇię@s YžĎ“˘¶_J'™É Őź÷‹P ôę/]wčČ[=‰nŤ+ńí˝đ˛ţúď˙{ëâÓŞłÂű«ońţ3ćÁOHů/!´č«ˇý_˙ĽW!¨e\Ń]­|@2ĹÁ%^Ľ#ÍDQąUíˇî÷ńCvR'Őˇ(ˇłęĐÔ?î!ˇÂc„ě˙±™¦ÓęĐÄ?DWŤ©íŃYuhę2„ÎćßxŮÔZy‡ńŁŇx˘HĆĺTŢ­®,ňY:Dł[yÄ;^6™:Z­$ä‡âl¨üqd‘(W-óŽąžĐ4~ś°h©ůšŮ2CWđ fFc,JěźDH}Ż!n¨„äjú·šú …ŇÖDBűĹíÂďkĎ»ŻAIľR5­žÁ/(Ď–Ą ź-çĐřˇ aF!Mź’µq‘PYL*ť¶R‰´,„v€Ş0wDk~yRž&É Ů„LIÄŁb!tTüĐdŕJ®e† q©Ŕ‰ö„v¨H0´ÔŢŞ–Z`j ťO†l2DŔ–Vë,µ–÷ńˇ6ą2~–ŇüCˇ t1%A„Ö¨ĐPжG–ű‡LxľdëŢźµ_ôŐ¦Î1:mß>äb'tVňř‡`Ň‚J~&úŢĹ1¸‰N«CS˙F č·2†śU‡<ţ!ę¸bĎľĂ8"BÚ8żN Ĺ˝p•´Ě?„\lB,¶ČŁCŰçŮé\;\%-óyqÔ2Źmď>5!¦’ů‡0ČłÖ„ČRo>Żm.tBŞJŰ?”-âü¤:¤eđ퓟&BVi5%ŢÓJ*Í?”I‡j°›”Ŷ^ŘuŠ:Ć?”ŤÉóʬC˘†:UCž_‡¤ŰěÔĄg.>B)1Ő˛Ä?$aČ@t-—ČҡjŕPáC‘„˙ÔŔ7*¬C-,ÚĐŁBĹü چ$ź¸iuˇ‰HŇš€šPNcoż`ÂKŰZËC6ŤYY˛ihaMKÎ#4'÷¸I˝X«C‰ŹW‡îŘŁ†‰ŠŘl!ťÖR­tč8Ű‘ř%BČńĺ©e˘$í•^€–&ŞhBŤÖˇŞ­ň_Ó‚„Ćţ!´Ô5żĄöéđ1„LúÓ!ĂgcÍő8PÔ?Ä&!Rí!śĐš˘j™¶Ô`€pĆFu!-ÇĚ/»ĎńŢ!´„íP!tŚč"äČÉuč˙ĐŮíď:!×?”‡ÓIuČë˘˙ĚqĂ'Ő!Ż(ˇłęrüCNZ b#tv˛ýCzV6pÉYuČď"BB0 éÓ|éŰ·˙qK/`ÉÁ?dtsý˛`ßžĄŰţ%_öËWčsAY`‡\˙{- 须›§ű¶$i÷¸€Ĺţ! Ĺ Dűčаґrt5î2UÖ÷×íű†÷ŰWjĐUąţ!wĄ#ň(®"tűxÝäŢ_z˝´­„´čŞś•ŽšfĄéV„ž·×óŽ÷W-ŰQćěBbV ZĂgGBůÜ s:d­t´Ökooą ˝2šÓ!c©áĺ*KÝ·‡žß_†Đ“ËRO$źŁ(w›ZĘöC¶ýđÄ;łĄ–Z‡ň9ŠőËšµ-lµĘËŞ/Y¨C¶Ł™ŇIűe6ř78Џ§•ź´o?ËQÄMč]th4ŃŚŃŤС۶ }QßTĚ}!Ä4™hĆF( C7†Ś/[‹ůX¨C ßßźC˘jÉâ<¨C›öđ4„Ş l!!ŐĎ·&šq éĐyˇ’˘M4ă’wѡ'ší`‡ÎCu¨Łiśüň.:”aá2’7Ń!ĺIŰrÄł'ó:”QŢD‡Đq}ßrĐá“yN·-’·Ń!)ĺÇ}ËQOćmtč×dCa˝¨˝•É7±†ÉĽŹý>Y˝‘=~Đ$ł­m0˝ŹéZ6 $˘•ćé tH ičĐ$Č@Zy2~ÚpfíﱩDRF 4 $ÚF( C« 3˘ m+&ŤŞeŁ@˘mµěMĆ:lu-őůÇ:4!%Mč47Äí˝ŤÁ§szęp|d%…9ˇiNJhŹůeřđy Â9+ˇ=ć—áŘ„¶ H3ËńóË<„2îm…Ěz}ŹňeČTí!Tž,Ď?TłOž:-!éĎ?tyňÁ˘8ÜÓËÎNh’}âËi …ć—±O/;-!ţ!­Cś ¤“šĚ/»j™{-sç—Ąćž^vZBŘrç—eŠŽˇcj†„yf®beżpßĘ, ç—EČ‘*ř"§CÇ0®eÉRUđEN)ÍűAgŹ3\Őbí*cĄ2ƉVŔFQA˘FaŢúc„ľU>Fȧ¦&b‚8c† ac Äô[Çz?äîţˇ»ďjô ×Ö$ޤäyDHĺjÔoe<ľ"ýCKŻ!k] S<ł^ŃRň)©5·ě„p§©eĄ ů‡tdB0Ă•,µ!/¨–5ć­ý ÉP~ęý"AB˙,'k%w5ĎÚöo@Čő©;¬ĐU3­ş}fB^˙PŤ}{ɶ¶ý™ yýC6!6ktrBŽ¨ŁŞĆ·¶ý© ůňS#&X,gmű3ňů‡ňČI iŮ#˙ČB SĂgRÄ$–RŔě©BéłÉ·—rŞčĺ1ÖĎ9BUř˝‘\„ä:ˇüCŐtlc ˇŻţććłű‡ę cCBÎą­ tW7GŁxMýCÝŢ„<«&­!ôÝŢF•–‰ű‡Ž!$Đ}†K+­#ôĽÝo·Ű—Jě‰Yâ¸y×·ÇÉ ťŕLl¬e°ä”YMi-ˇű××ýöúzAbĎ~B¶Hę .tcR˘YB°Î6B˝Ü^ňöRI[FBžőíqQ{sc[y;D¨Áł­„nwÄĂLČ»ľýľ:ÄE處Đx}{ű–Ű©›ŔqgşîŻ»Ú#!HěÉj©'ţˇµ,5ÓŐ,ҦŢÚbüP·ţĺ{ň:Ü?Ô¨Î5!o;±'!-…ů‡ ě—í ''T÷cń©µs„ŇJ9ˇ„©á3„K9•č)×?TЬ÷ýqB üCťŚú‡ţ<ˇH=ä&´|ČoI÷qőÇf±–żY„Âţ!în‡Py’äâ6D''äńíPËĘ“˙Đ–ş<)Í?Tž”ć*OJó•'Ąy?Ę“‹PLJó•'Ąů‡ĺpĆ9hË~3[]I_FÂą®4MČ%Ń-{MźČb˙UíŘť•ôú‡v$$(v‡p2'©ő&LË+ĐdŮ2xP˝|¶ľGŔ Q Ťžî Ó7+=cşB“eËř»ř~"B*˛ˇ‚yć‡ňř‡„š–Hهö"¤ńŚ í}M›×!iüCŞŞélÔ;ňŐ˛Ş¤Z6öíXËK ł¦U @# ›C)–zä’”}HYj¶ůŇ3męc2éř¤T˙ĐŔD•EHËĺBąüC1Y@(ăúöt ç%”{}űóBÉç(ň:hü9 ϡÜëŰ{}.ž‰şTQBé;ßúöBĽ{X':Î/N(÷úöŇ×Rʸľ}©„ô,…:”o}{/!§&«ę6í N·wľw3EáCŤť)ő}ýáĺ„@r®o'„™X¦žMĎöÎż1üMÖ†ęd:ˇÜëŰ/Ń!şM}ż“í]hcč+š… ®!’s}{/!\ъ҉™ÓRÁ'pP%„»çvăŤ5l„d7“˘pĹĂNX„:˝~¶"T%ء|ëŰű aFuťN¬ŁĐ’e{¶Ź?lŐQoQzĹĂZóî´ő„‘b‡ň­oď#$$x{M:±Žâ(µ©¨)ýh»N®5l$ŞI“ĆďÂˇŠ˘ç.ˇľą¸\‡ň­oÖ!Y›tb¸óNE?Ú®??ŢhĄŢrŢŐ‘uxfjúJ“d‡r­o°CőpZ:Ą>iˇW*m÷~¸ë©÷]3i—RŰ;:”Ňʸľ}ŕZ¦W K­¬,`AóJ–şoGKí٨Nşßć)Jď ŁĹ•#Ţ¶Ô ×˛ŚÂئŽÇ4Ű™¨C×·g#5ąˇd\ßžO‡XĺIîˇĹ:”m}űR uiţ!w}{K¶Ź,. 4éo:=éy14ŘŕĚuŤ÷Ń1‰ţ!gĺíaĎa2qBµië˝Í2ăźÖ[ĐËŔďíşZż"„KýCÖúöG÷7Ó ICH.%”z-3ëŰ{‰6-›ě%„ŢÝĘIo´ÓýM<„·uĐ D¨ÂnŻ:R—¤Ř®ˇ2sů[q-Ö·‡8lZz;Ôb¤ŐĎ©íěôFU‹QĎÂŃ;†ăŃ I#„|&cDČ[|~k^öíˇ­őyĎJČk© „‘ľ˝ ˛+ŰĎ„jt˛+'<´ŠjĚĚRS#©ŃXč‚BłGBű‡:şĐz˘n+~O/C›2Téu€[Ú ˛5gBĂ@ ڰvzx¨ĆƲŤĹ¦s-­ńSłU÷Zk3î“઎’îü˛˝ uCçK÷h†Ö;źCźŤJj~ăhmG]:ZMńĺG ąů‡—ßź^~{,ů«^±Rťź)!ÝńŁŃEě)u.!Ý)ĂaÄÚčP’AZHH‡ iBýý7FBŤšć;îąBŐ˘š!¤]ËtďK879Tˡ–BhÖŇjŮě¨ôx~YOäˇoę9[-ëUhęýPv-µ„ Ýa®M˙,5ÔFˇ}ѵŠ–€RA1ŘýO¶Ôs‘ ăüCy 5‘~GŔ@r‘čqţˇŢ,˙>†*öŁ^e˝–ŮÂŃL/#a5ž_6BK˝+ˇcdY{Č žěަ>^ú©őü˛‹PĚ?”‘Pąţˇ$BĄT˙ĐĚXÇW{”Fhf¬ă¨CôdJč8Ń„ŽúŤüR"ˇňä"“‹PL,B ËÁňËgŇR{ŠE(Ű„ÚErôţĂ2ş$(ˇ\„brŠÉE(&ˇ\„brŠÉ›j–´ăKšuíűŠť;Šcő:ŢMš™Ĺđ”Ü.Bˇ\„brЉKRË:y‰Ç„t>~ýŃ?CH%KwsňĎ˙QB•˝eJ¨uż€ň§ąŐČC2ńĂ­˘í!óqü0™Âiűź"­e˝9G6BüQBKÝí©ţ¨š˝Ú«kYĺÜPţ !lŮJäia-űŁ–z*W›ú"“‹PL.B1i^‘hŠ‹Đ2?ő‚¨”żMhѧޔŁ\„brŠÉE(&ˇô„Ťňň苳·đŚ^–~™zS9Ô0ˇĄFüŇ,<ő-­r}ÉRŔG}4BŁďď°!!ú÷ý`„ZΖ¦˙<j•Űkxc«ÔpYB_Ă „ZüÖQÚ–óĹ„†Ś5đŽÉ»ź:­ţ@3„8[zH5ř9mđiţ±îA¨qź8d‚˛uęwiĽÝý¬‡» \ÜVi!ˇC‚†SÓđŘ)řµÔ ęą<(!Ő´Ťj۶ăVtHk&„·BBô9 ›äÖ* ¤´-lđ‚Rël.¦qb»ABΆÚq)Łě6@§Qôf:źĐÁŕ B˘â„zŹÂoÂjg)Ŕ‚–„lR˙»Ž\<ă„Ú…„đ-pš _dřÜÇ„Ü Ţ´€ˇÖú\Ë\);ôĄ, dÍGł2ř€„”ş’änz-Ăo»R3„ZG¨ť)eDh(ejA)s„>#~^lč§>4SB€lČ\Kč­)đÔ-},ů!:ݱ§¶™bOÍgĘďyjôŻ ůÔá@-ɸ§v~čkZĘMŞUo†5CŇĆp±##Bxi>gZąő Ůʲu!¬ˇ§@k=uÂŹFh®>”RşNý6ätĺ}YNB\Á®„„ôĹ´G#ÄŮú{¶#ÔŤ"hâ‰g^Nč}eŠÉ·µ¬$?HhC©€˛ř9°Pú7+$”'ťÔkA„Ľď•ű{žrŮ šŞ­„ćÄžç­PB\÷Ó9 q &¤ß>Ë"$ÝĐy‰Đ·Ýĺoä˝;‰îšPâ= I^jš9BßtY˙ţýű÷ç؆ŽśëĂË[S!DßťRyBm‘„:$ô?»mMH…ˇčNC Ȭ p\Ö+ĆëŠ%ÔťŹ'öC!ł€şŽâf2zĄQźĐ…R/ZŐ /Ź éŕ"ÜűM\éuö?OČŻo+φ†(kGÁi!˝ÂMbšo˙Ĺó"­ĐBCVµŃr„<˘ uy=u>Bť8!°!qVŻ©GĽ”E Ĺ[HĄSű/42`ĚľmÚ)! ć&¶Ö\Â$ á_§Ŕá®ÎSŁ ©«šW—šm!=4śŽí±n3Ä„úĆľşt„8Ěuj1QĹm(ŢB ­ŞŞá6NÖt˝ Íé.÷e¬h|HX×ŰЦ„.Ň„U¨ ]Š KކD›Ĺ^Ü’ĆŚŻŤőŐi9RQRŢ€Újšů°«Fą\ďż~Ńh˝ĂĎ:L=eam|(ˇ¨ ůŁÉ›ńÖ”P¬I˙˘ţţýńÁńĂÚOoBŢ7ðVć0<¤ …Wű /ź÷rEm(3ˇ—Ź˙Ő?ůńçOČ9¶âWjŞôGł6 e8745âÓ CŐđđrbŽ˝8ę—›cęŻ÷żűrůó‡gBĄMăC=!E#˘Ą4ç‡\»ŞkhĹšýČ[ü: xoWŮPóË{öcđBj0˘6d(>äŮŹn•ŃŚ őŁÉ›ĐÁ'¤\Çoî†e‚ËĺÔ†Ľ9O¬ý‡r•˛?äF“ŹmČ'Ôăi˝ńŕ‹äďký3"ďZć ÜšţC„%O-WÍľ`CC)kŁĄĚ#´®”1|üé_ËZĎQ«%őˇ{ôšł!ňÔ<ťEzę ”]ă©˝]±>4%ä.üĐH˘N˝ş>4Ľ‹ü´+f^E5á©ď(‘ű˛µuę…›h?lD~•š‰?@ôŁđ{űŞńˇ”j|(Ąµńˇľ{ľ»˝ŹŘĚe´>>¤ű2'D¨Đ¶Žůř8ˇ I2ĽQóc#ń!´“źő%”D(bCo˙yýwM|z©a „L7 ý3˙ . őŹ5ń!ľq:ąwđüfĹlhk.Ůářqń ‰ř˘Rm(Š’(es6‹¤Á¬·OŹ´`*®Ňgđ9댿´Ëů|ölŇéÄ»â+ö‘Äű'uÁ†&ń!ęäŮ%aO};ˇ9‚ó=!€â-Ţôń6¦źgÝqn°!¨ ?>”­Çů¬ …„ÎxňĂ™ÝFŤě&rꔋÝłO~̆F„ŕ® jŔ"ŕźÝŮ&žŤź`ĚéDeŇ ˇÓq DKéőő6tG]öCgöC'<;ň '6ťó ˇĐKg&ä'śŔ†Nl[#Bđšű˝Ĺ†¶‰Ťlčč ŘÉĄ±őśŕä‘Pź0!töYűZ@(iCŰćF~.?fBH\KßnCŰć"6t&/;\ËŽTŚÎ䧨”?aLČ]ÉüŹąŃ†¶‰ 6Ä–Ć|öëCřŚÜ0ţcBĆO`O}bOíŞBř`hŐă„§NŮ\ôGń!qm_§ľĘ†¸>´Ńř˛»Ţ—ťśłŤ*U§Ţh|Yi÷e|oĎý†Ś¦.Dbăvâ;2ęŐ ĹZîc6$sd ­™ű áÔ10›†ˇ ÉYBkćâ~Cťë óě6ë?dh2-K¨Xšörý†4–21O=gCÍŔŹkĄŔ # <Ô¶OĐ´+ËŹz˘÷„—; †ş™@íďÔÓ÷iŢÝ%Ü0˙P<ő ÍŮëżž¶‹łNó°QBÇ'ŘźiźŻĆx(J7ŃN@H»Óęřc4çnq|h¬xęš·!<˝!WĘŤKp›Ł3ť2LH3ěčéűVş6ÔŤőóÔő„üőŠ`™…•6{µŐ´H†ę¸` …ođŢ@˝„ŮE§ŤâCD=M@śGGk¦wŇŢeÍĎ1ś®©06ÄS2’…ĐúPÁű†ą)á%lOalC^B¸^ť#4{Î2Ć#dřÂc†÷žĐÉ%<čüCˇ.â‡BCKŐ„: BÜŰĎš^ËÂőŠôl)ëF„Ř ©”őďŁé&‡„T)›Ć‡‚Ę‚R6Dő!öCC}hpLÁzEZ‡žZł§vő!Gť;[z7~ň®źZś`ťZ0WNWĚ?t7Z-ń™@+槆™N±ëW?IJSě}Y$>äwj?Uę˝ý$>d¨˛ŢĘc:´€VćčÚâŮ”Jµ!‰ĺ)ełőˇĺĘI>$¦BmčŽ*܆6Śéĺ‡X±ëZ=ˇÂmhĂřĐŠĎ\±ëZ=r|č1´b~j“ë«*Ô†˘ń!~®ÂjCŃř? *Ő†č/Śi +ę>$‡’ďËÂřŐ by(őŢ>bB°$`ĘöCa|¨·!Á˘_Ş 3/eeŰP‚ćNMŤQŐ†j|őČńˇÇPŤĄ´śPľ0Hů6ôŤŹůíņňŠöbCůE;±!?P¤eó°ňEŇwŇ{±ˇ!P$Mh/64h&FŰŤ Ťš‰ĺa6„úřx&Ş6‚SśďƆ,o ™$ˇŘ=`o\ ™\öaCÝ[ç4«~ČŮ‘“#ű°ˇLÝ•Ínl"iŮň° ʨťŘ®?óäa6„ś^räa76dĚŮĽ~fÉĂnlčÜφ˘%ó°+2-%iz”©5îdž`b¬„vdCÇšt$˘Ů®­0ídž\)›v$â>!Wş§Ř- mhŇ‘H;HWća/6F$4éH¤o"Tľ ‘šv$ş­”íІF‰ş=őţl(*}}5r76„;ć ´ęhŹ y8ÚB Ýc|ý{«„ćôJ6T*ˇ{Ś/+źPćńeešĚ?$ŘÓÜ©PBsóińÁSĹ2ńů‡*ˇ‹óá˘8ŇĂËJ'4™H|ŕK±„ćĆ—‰/+–P|ţ!gC’¤Â MĆ—ŐR^ËÂńe詥‡—K(6ľLĎĺ6JČ)_¦'ď—Pá„î Â ŐčG%”PŤĄTăC)­Ž‘5‰ŢŢJh~~jج„.ÍO ›•ĐL|î84.cŃi™µíA… ăCđ‡ěkˇU·AĄŠĆ‡4Ý۱µíAĄŠĆ‡|BbިpBA|¨_DFlm{P±„bóS&^ĆHŞŃŁTB÷›¨PBN÷¨lBwPá„jôŁJ¨Ć‡RŞńˇ”ÖƇt†¶ˇB MăCXŢt%4Ş„­oO:%9±Eá„üřq\řWËäˇTB‘őíiQűţWŞZ©„&ńˇ~TYµˇůřĐĐłűˇI|HÓ˘ö§şš•J¨Ć‡H5>”RŤĄTŁ)UB)ŐřPJ5>”Ň-ń!)JhA|HJĄ2Éř”Š%4‚˘*śP$>$u?ćT*ˇůřômH©„ćăCZ8…ŠÄ‡j)Kćާ®ńˇ@5>”RŤĄTŁ)UB)ŐřPJ5>”Ňúńe,Ášuˇ„fâC^±ÓRy(•‰Ć‡*ˇ ˇÉ˛eřîňĹî= '4Y¶LţżTB‘ř‚a‰<űP%4]ß§ęÜěC•Pt}űZĘ’ń!Ăł§ę_U.ˇ"ŐřPJ5>”ŇC¬o_<ˇÜëŰ—O”/PT>ˇÜëŰ—O•s}űâ ĺ^ßľ|B¨śëŰO(÷úöĺBĺ\ßľxBą×·/ź*çúöĹĘ˝ľ}ů„P9×·/žPîőíË'„Ęąľ}ń„rŻo_>ˇÜ*źPîőíË'Dʸľ}ń„rŻo_>!R°ľ˝§Ű[Ë'4^ß^ş›Lů„HĂúö•Ь ńúö‘ŽD7-›\>!R°ľý¸‹C?[Ę5y(źĐx}űHG"í ]“‡ň ‘†µÉ#‰t%dŞĄ,¶§·ľý¸#ŃŤ Üď‡hvőöĆ™ď†îX ]čŮm}ű—T©„\§cT"yP¬JhNTČmˇ„ÜÝWFBŻôŻÔRćş ĺ$T´§î» ů…íT ™éř2ßr*ˇŘř˛J(5˙p9ź¬ÎËŃśá™!{©oŠ%äş 9BöďHż‚„ZĄ ´ˇŃř2Kutż°-Vʬ •Gh4˙P^Bmá~ş Y·|>EěĎžÝS‡ăËBä©+ˇńř˛Z§NŤ/«„RńˇŚ„"ńˇ÷ĂăčúEâC÷ÍŔeĹmô z„O!ˇ­ľ­rmšŹJ(•ŹJ(•ŹJ(•ŹÇ'ĵ“mô¶ńçĎË#¤6ŐÖź?ŻPŐ¬*ˇ”*ˇ”*ˇ”*ˇ”*ˇ”*ˇ”*ˇ”vJ¨]R<Ľ¦"3Ýaż„RçN„R‡ńî:ö¦öëňë/•P%”P%”R%”RH¨UÍ~Ť ѵ­—Űői5‡öĐ´~ĘP{ř=)ˇÁ”Đ!|é©…Ĺ(B¨U‡FÁ#lpz%ÔďN»)°4ú%=ˇd)łîśŘ(ő¤„žúĐ[Oó¤~čâŐ®eMđKzBTňŤ(R˘Rö¤žzŞZ§®„RŞ„RŞ„Rjż}*ˇeqę}?ö¦e„íµSB‚Ş„RŞ„RŞ„RŞ„R˛„´—ĺĂ(yÁ«ú?&=Úâa±urIEND®B`‚fox1.6-1.6.57/doc/art/win32-preprocessor.png000066400000000000000000000144411326741342000203700ustar00rootroot00000000000000‰PNG  IHDRAtÖuđPLTE˙˙ŔŔŔ€€€€˙˙˙˙˙56 ŁtEXtSoftwaregif2png 2.0.1=^ľhĄIDATxśíťÉnä8@ 5ôŐwAžş]đ ľ¶yźK˙˙/Ś ‰)%©Ĺf”+ĄRËË` EĹŘdU„ř­š¬ČçDčěéÚň2úĎŁI\ˇ”4Bľń‘öE#äËźWű M°p…÷/gíweŢyËżł|č«{Đ‚˙ŔíýëÇđŃ„†nč€ĐJ$ üTBôÂR_S«z×SŁ{č¦ éejú÷Ą`ůôćěs¨+şqq+Ăćfíü›Hčý„vŢj€¸ü›ëÓfŇ$„/X‡†¨*ęo˝8÷ j‹KČÓˇ‡%„.Cí!ôř­Ś®ö3;ô´2ÓňB?¨•Í®eš‡k©5ýŇŘ"€ő#,µienČHBCľą=â}j#«ŢŐ7W I>˙€ĽÚm\ć‹ ±/ˇ”4B)yi^Ř„4B)i„RŇĄ¤JI#”’F(%W 4ś}«B„N˝w˙úĚ Ä7űOYBe¶¶Ož!´rŕߍЊĆ5ĺăcełMţßĎKd3ů„ţÔ‘"´rŞ/+‡·F(đŮ?ń//Fh ĂęńYo­étO!Ěë„>ěÉ[BüjŽ f%óˇß{ÂÍčĂFç`-ˇţĆÎ#$ćű1„č°z» K¨­ Łű]÷hŽ ÔÍ{Ź!| 4Ŕ7‡Ń;vKČyzŤěg$;” 4&ęőúQ ý7ý‡E˛ ˇ™ř„č7 'U‰nčÄ0 ťÖX»ÖË:‡>L ú Ť,OhjíťĐŹBďzNhZ¤—š&e áşťĹl[Ů´=üÔ%4ía€íMl§Ť:„ţBÝ‚ţ†ţ!:ý|5âŃĐĆÓč`űM6N,i<Đô›čźe‚َż|Bz{ťKHŰ!˝ł1ÜzyBbAŽO!<€v˝ Ô÷Â#$ú©±é„ئCú0vhZ¬!éG}83BzQ.ľf¬°ŁCŇ\‡ę" ˇ?D¨ ;Ä0D Ť4Gš™żm„ôĹ3@V˙˘F}=W EZŮ\‡h?V'B/LH®eÜĘĚ×|B“úôd<!!vŇÇ´ $ü-Ůß\Ě uÚ©(ˇ…˛­LŔ›ż’:¤RÝ<‡ ˇµÔhµ|BęÚKh ô‡Ŕ‚vdf­L3Xj}N®ĄÖoş1ÜŇ͉ϱĄž6oŚĄ^±Cž,.‡Ż 5AB- Q‚PXÂ}jG‡Â˛g\¶v-K‹Ýý˛Óéš:Cbę A,µ´ŐR›“ßC°ô¨c­?”’tźúXBą!ę`7B…äh×!„vë/ŠĎ#$g´˝˛‘PRfľq ˇBŽńą ˇÝ÷ZÖ=˙;ú:”r(?żż° ˇ:řźźP?tR~ßó»RĽç{-˝Őˇĺy˝)!ęűméŕl&DÇpcBýë[#4F}N—®7ČkZ’śÓŤˇ™.ëź˙ţűďëč“Úçký†„đ˙çÔăý‹ŔT$¤ý§Ę:Ŕ.BHˇ˙MŻ'Ň`„rjorúWšxńÎ ´Ň7ňŇŤk„ä×ăíöŽiď}/‹ëĐžŕ,B…âLŢ šš×ç$V‡Đ6b!ˇďJä*Ôßç˝Ň!Ą”CÓE áąçzn_´•ˇ !­CBűYk¶˛%ˇ™+ľ!§˙ţŮ"Ô÷Aĺ6Bř•§ťS]Ç'$¸CXŔ,Rď!´CËůöř]ĄČ^Á;řJ"”˙„¨_ď’¬&fł%]ę-·+3!‰W\iŠú:ĹXÉđŔ–äóv7ZOV AJ7Ź!%b„´Ö ™ŻÄ%Đńő‡^Qoř¤9t{q-ăśŢĘŠĘeóLQ†U%ôL+Ó}S¨RřÇ:!čaŠťŰÂ˙Ü °+ .ÚźŢM‚Ul mĚŇVBÔňę™EácĐ\"g<”çµ˝OíŐ:•ű„ľ-·ő×6®®%c\ćÖ‚Ě…˛ń ™„N“ڱ˝WH/ŤrWB‘úCÔý*)B•*Ďî”|˙ęŰÝŻE¨čöź–|˙Đq­ěz’[HˇĄ.ŰĹľ+ˇ€¨N‡ń®„X¬h[őűźCčą9!ö~ü7,%Ľ"߄ЯGPţn„ŘaTÄłVŤ–xKŻ!i˙Đučn*—Ů`Ú?„C˙ď˘C=oŢ”ÉëĆŃ/żDł™x…Ž’„ćţˇ_ŹťŠ:dbň˙,2OgťPç®ó!ĺű‡aB•tČ#äňµůţˇI‡”zLęëýńO_‡čP!Bťps `Ü 0]Ő ť3r†ň’Ňţ!­@ďďü"O5ugJŐő<; žN8ˇ!á„ew<űbs b¤6—íB[Lű‡~=Ě„FëŇ;ĐÂ?T¸A’Đ2ŮĹBč‹«Hľč BÔÔ]› ű‡Ž#ô]'tř<¦;éV†YBť °×‘ĹĎ C™DC…é_ňýCŇ”ř«Ih°yź“wŕ\9¸ÔIcěŚ6ǡôůţ!)K×É"  CcRˇdQ.H‡ÓĂT'ńDH9!Ěň uÓ_,!˝¸«O(ć:„!DH/˝L+[ř‡#D–zKí¶2H€ę‰Á,)^ď5W¶ů‡ KH‡î@HĹýC…%˘CPlz¤P2 űŕęÓ]…˛¦;-ëS i§/+H(b‡:¬‰K%s§rpW*°¬!Ď?ÔŰĘ …uA˝Ü9ˇReĎ ů‡tQ QĽtKرŤaBG_Ó2ýC}•Ň-«:le5 Pď&äů‡,ˇ’Śb:d-µVńÁ#ZjXvľĄ^ř‡¨•·Ô+}jźÂi—úq«¨pßqe\f™č¸“k24ţˇâif7— 7Ű7˙JóĄäjţˇšő¸·Ëéő©C1ůGUçΑő ŢźlŮ!$VŢMСKÔ°â4Ű!Ť&ä2Ýér¤B:TlăOČ>}Ć©°¨ˇËę*ŃK”ĐÂ?î!!ˇü,X%¬Cˇ+б w/p čÂJ'o^SĽ¶$†]]řźu완Ľ˛C64¦/9óvP‡â„zÎH"B¨ÖRZM‡×D¨gŰŮ÷fU†P >5ßđ4{$ů:4i±ňδçşcîOććŕjPu-ýCŽ©˘µc‚:ÔS˛¨ë÷í !iĘü0!8 °Ě2E‚ţ÷2 uyvHp١:­,¬C} d7rKcBLEóě%żF’< Áě{y„t¶cśĐ2~ś°h©Ëuł:$ťx7&ÄÁ]|¦=ľ·ŠB„(—jGJvá8ßË%¤ł®Ł„°?tRüP”@Č#$ Ý„†©őD ±ś?ôŠFcF¨gBÔ¸ź7}&‰ľîFjÄ„dćož°ÔJP‡zNu,5µÝď‘¢Ϧ'CHżfBŘ’ôQśĐ9ţˇůoT-f`M®C(9.«U^,y\Y„Îń]c\Fîˇóç/»ęŘ^îó9ťRÖ!|-“f=í«Wö­í×KişŰŠ&fč9ň> šI8ŠU0d˝é`»ŰÉn˙Í/D(|-[RBÔÝfBpÖŘC0c7Ĺő7č wޤ·ŤůqáÓv˙PqBą:%„ŁSI=Jî#ZBŇ’>!sBŰýC ş}?uNp&(ďź&´b‡8z! Ţj®IŢ ^šŐ$Ť{î#*Ž™Í-ůŰŘCČőá#`ÜZ0 dĺZćB:˝_‰%HHE_B±ZRŢD(4\qdOS@ ´˘C^3C.ڇC\&JŻđ0mÉ–~U‡XĎžŐ!Eţ!6˝Ł@uuh…±… BŇupÔ'´żĚ'T˘•­ő‡ÜfĆh´-4­¬·ęb†ô˝=.éŤä×2ˇfŰŘDháÂ!dĎ„ČR?O(˘CîÄSřL´ľZ9–ş·c&ý! $”Ę-Śäô‡đżśoc ˇ…¨ÚčńŞ}ęÜQ‡ńU#t̸LnösĺŤ:ŽËꑳ˝WŰó%fV:€ ‡ĺ¨ĂŚ‚-Ĺ;© ď%řăŇŢ\¶¸§]C7÷\děčCĐhW çb©ĚŢP2uč˙>-çQ4„°› h‘â‘;ŹKBĆlöôü>9ůé[°±F­ŹíYđýĆ rŁ|´Č9WiIóa ‚÷BřŰ“üCǢł4C­!ZűĹ«„¤!dľĄ$•ÚĆÎSO<÷‚ť×:"żl!rZBlź(ÂřxŠ•ď-!\™1:wś¶RÇĺ—E 9QÓ]öćáë=‚AEďë›)~Ëßr a ąçąÝ?DqCs ź)sş ¤»e«„d!}… ’k„ěsˇĹ´e¨őĘJBNó ňŁh5ř¦«ąëšŐź˙ˇ„:oŃ‚Đě v­Ch6ü’U⇿ÎY«Ň‚:•řéĎ®őc%[ŮdΑŤ?”PÂRŹF{şj‡VŻöúZÖyv­AűCž-űCŘĘ~¨ĄHëS§Vh„R+4B©ˇÔ ŤPFĽIćZß”ĐŐ‘·Ö7%TPˇ”4B)i„RŇĄd"tj”ç äůhČo/˙¬·µ(ęľIEND®B`‚fox1.6-1.6.57/doc/art/win32-project.png000066400000000000000000000143151326741342000173100ustar00rootroot00000000000000‰PNG  IHDR1­é,-PLTE€˙˙˙ŔŔŔ€€˙˙˙€€€€˙˙˙˙˙€€€˙‡;RtEXtSoftwaregif2png 2.0.1=^ľh9IDATxśíť;ŻäČuÇKă‚|U,6Ţh°™öS0`Đş~d›(ó7XGN´ ˇ‡łX ÍÝ`Q;=µ‚1Y8°¬‹…ER2­µčĎ`Ö9§|·I»»ţ·§›M˛IÖoŞ«Nť*˛<©UŚÝޤJ2±˙sÖ©MIćg÷IM%2!%2(2.Ň-$2¨=—­[@2ęţË7±Ż-®öú.ÝFćM"“ńŚ™Kd¬<2´@dTIF©űňCĹľĆ8Ň…Č”&,VŽŚţ»j2eNA2¸@dľ,Ë“Roôý*ö5Ć‘O¦’gČŇ\5s×®Ú ±Ż1ŽĽíĄ¬HÚ¦™/°vwţ|#Ć»wĎD[ŹĚü˙ç¤D&¤D&¤D&¤D&¤D&¤D&¤D&¤:™Ýyhż<™-;=¦v2™Ř•ňA˘Ř•|ňDĆČÔzň¦ÔFF )b§˝[ŃČ”Šťön92xŐ3Űë‰ ÔÝ9=&™ţPŠ1Ś$ĺ˛^#q79Ëátvűhl? Ł®ם7)%Ę?L¨Ŕä Zɸë]ś 7Ý~¦ËÓôŽbwçädŕ¬%!<2 Č”9Gá…«‘at2‹í×Ëý EÉ”E«|Yµ˛ôÁŠxd\Ż'źŻ4 0ŞdŔ4ë BăH6 !#ĺg3ż4Ía÷7Űdŕ;ü±(dŚNC0”Ś{}¦‰.52h„±92uVA&;Ůîv‘‘óŚ@ [˝7ٲCEÉl‰Kf5É08«#ŁłNĄ>Ł7 &2ÚŁUľh2Jt3_t_šPŞgŹY‰ŚÔíüžt‹5ŮĚęţ9ç¶öfV÷ĎY“sţbÉtmtř˛?Ů ž_QČŔÔYľÜř12dLăß4㼮ţxŕáŰɰë&ŹQť ֳļdčV)ú_đş—Kźă"î,K˙Ň4^¤;sűĄŽ8|Ě-nĚĚ˙‚r‰ˇdĘúňÜî¬ !MÝ\@[ĹÔÉO<|'?ŠĚ"î,KF7iŃCD—nŤGô¤çđ­d[CFźH˙iĎśş\Ň˙Qpz˝ÚxŚáň”.nK¸łęd\ž™›Lć‘Ń'†“‚ťˇř˘k!2°Ň™×ťĺ,°đČč“16™ĂAIź ťO`žÁ3[2h•-h—/ŕÎŞ‘ÂÝ›ŕüł‘ŮäeKŰ‘˙jCÂ’ÉŻfµźg”%3«;«r×ĆsŕťČĚf…>Ý›JăJ“ 7'B`•Ň$…)MK¸ł*uŕú¬é´Ă·Ů¦nŐg4ťkÉ3Ć—`đ‹­O Ľ„;Ë'Ó(73’ąW©±í¦%}ť‘ÚÚeý÷§˙ňŮnd›[ë:ł( ™˛ÉôÓ}ví¦|.µ’‰ťčAB2·ó˙ĚÉĚ«sö\-LćŚ÷î?‘ŚçźŞ@¨uşU¶-¤ziZ„̋߾ű•˘ŢXˇÖM†Ů)0µń…Ů3łů,đçďtŽyEdů­ëę‡6Ą`mŚ:a”:đ‹ßj2_š<#m …‡ĐPeÝĆ6N¬¸d¦íŐIćs¸eß<ĂĐ9Ą3ö6`3›X&+.™ąÔ’g &Éç"Ľh<ăßôČhíË8ýMO …ľEy–ڶڭ¨4-FFegp„ Ć]1XX ڱWd—öç92SŹü*ěó‚x+U¨aEdČ>3iž‘_·f’ŇM€ŚŢiHއě3“批ę%sJdBŠDć‹ăqâSN.)Ma¶$i«ŚalTĚi/™âő |ŕÝr1änDŤňÉEýa×K¦R×ÔMŚś6â}D…«Ź +ɬĽë BŰrúOs`çŹŐs aă7zŐGFč<#•ﹲK&ĚJ÷‚ŘńÍî>–«ćča·ˇ ĐŃ đRU˘zŹÚK†±šíÂăJ(CĆ~őĎÜ'ŞJĆ&@«É›g¦$Ł~!«Łś•#Ż˘‚Î7týq˘d¤%/a팋ßč=j™ň–ý öďÇ÷Ös…“P˛$xi°ç_ÇbŃ˙Ś^ž®ţ‹8QŐ{4{É;®#3˛FâH1QžQâLJBy^ A‹v@ Ȩ,cäµÍgŢŞőČ»LQkWPŮ;iČŚ°ŔđĄ`»éÇo…!Łł˘ \ÚBF ăîC˙ äŞÉ6×׋aĽ'Ďěvâë§7»-ĺŐFĆătŽP!ěHňčdŮC 'žÓ`»ékčć˙ h˘óĚ0NCĆ,®ĚcŐkgÇ?™Ď”cxgÖcÉ6Ř‘UR-h§=j?uçQΧŐm~ ď^L”N¤šiäWn§s Ůí¦>ĺÔŠ47Ú(™âÓO‹ŘIďQ$2?˙ááAÄN{·"‘ůĺĂĂĂËŘiďV2·%‡{;ńťŠBćN}w<ţđš¶Ş“Y©Čăä™_–`~řÍKň˘JçjnO·¬­ľ\2?Weaúâř’üxPűď"cý—OćÓ?=<|÷Ýź·md[ˇšéŻĆŐ¸ěŔÁhdŽÚ˘ťAOžqÓX'#ŕž‘Î +ÔrCť˘ůâř÷˙[¨ý–2 fĘ3SpŽ+tH,?p0 ™ĎŹÇ˙ľË Adpú(ŹŚ°ĺ§J;˝.™ĚáxüöŰě˝0ťäÓ3v†üđTš¨[ańqfh˙âřp˙·7TźńČ02+Y`ŹĚ˘ăÔg~˘Ł^ôŃ |´â‘%š÷_;ńťŠ6wýO™äąCćŚF.Lć´nMĚŇ´HµäŃJdBŠKĆx~_Ő#‘ه&±Ş\… ąˇ¤˘óKoŘDçWŃ>))Őü=ůC‡Śřrł+I#Éż —ź€'¨Xd(îCâSôh2ë©ţE#CA‰Â}×ĚjrLD2ŞBF¦Ňß™&Ă`ĄrănÁťwĺŘ •\µâŐEÜ„÷*šçj=Ĺ& äą )V»I¨żZyhQ2±KdZÉ”lŠD¦­ŹRÔní68 ™âpż=J™úęČ_üÔk)ü«Ĺgâ·®˛u&2»ÝrdvĎď_m-a<3‚xd¬ËFúdÜĺ/@¦ĚÜłˇiŮ>żż/¶˙ř!úg„aR :•1DfÁ1DfŁýz12mŃ€]:ÉŻîź·“Ń#©%M6‚¸+)`ŕ‚c A‹Ü͉N˙Édîw”gtëÚ<ÇÔ™!‰É`ÜŤ [pĚ ‘jém5Ń3’yţŞ$ŁŰÚŇ{FśáäKF2 Žl!“qšż†µqXćä&Ęq=§×ĺÎľF’ąyőRĘŚđ%2f·6ę*Df‰1mdr3§.YŚf$20Ďž^sš”°Ać†íÔgo| ĺ soŞ’YnĚ`+w°¤ÁLÍX~Ő*dH‚éť2Ř1ÉćF’‘ŰĂaűäSaďÚnä/ŮÉ\}㮄YXjĚ`ÓCžÁů;óÜNçY!k2Ę0ýÓX6[77;ˇÉ¬Y†L®TŽd˛ĚLá Ĺ—±ÄpâÁmąz\iRrÇԙɼ >“ĺ4'Zŕ ˛!SzęuhŮŁ,0Ś´=›v“R}…˘¦áž^Śçjŕäť§aą±“ŢŁ8ţ™BźąśôĹ"łąÝb§˝[‘Čě‹íś¤Hdr˙ű˝ťýˇ6g|VÝS‚ćą|2űâďţ‹»:°çą˛dÜ5ŇVÝűĚ’>˝ŇÎÜüńéďE›çJ™ąWÖBfQźž*îď1ĎÔČHšđ±îžÂ°€(d¬O|/CC#*4-dľúDţNŰ™6ĎU‹{Š‚l˘fŃ‘ám©ôVžBć˙žeČU#ÓtOE$łŐ[_6<ĺ`~2—IŢűţĺĎlŐpOE%SćiCF·YN>=íĐË9G׎>liĂ#{x{Ú§ř 'óěţY•Lef«†{j dŚŁ!Ësß lf<3ö!#öů=´0” űW¦öî®mű±ăWŁÁ(M9ÂsĹ0ű°U©g‰éČ|ü‰dúß(ĎĚ€ŃÎTČdĆ1ĹMăČƦĺč»zmőż‘ž«Ő”&׼欶`ă,08{ÍܵČ?ŽĚ9¨NŢ˝:pkľnu9dnq-ş°x€LÖŠëÂÉ̢Df0™ĂÍ®P;íÝŠ“göy¦´±—&š ®ĹL±˛ŽI3"ĺ™ÍŤŘ $#•Y!«ő¸Č€âĚ‚Ë2)¶*‘i±Ŕ™R–ŚnY3ňÇŕ@…#TÄšČLýpöÝľ•Ě›góäK3q˛™Jz]yfꇳó™÷J˝ 2JĆ‚-¨hdř¤ĺ(ď ód:Ú–gOŹ~L†F®¸4MEfO‡ë&CŹÄ,C}NÖ/.ł62NŢ·UÖô˘‘ńť5ë%3Ĺ3Ç’Yźf#ŁkFA2ç &™Í]ů·Ëw›Ýćî2ůnWě{ČŚ:b|2w›M~—ßÝ•ď'dž}YťVˇžŻ†ĚíäÇyĂ Ďŕ@!„B–Ć–¦‘™E-d¤ömúd ěóNĹk00íZČ€í&ŢgpdčƵmßť_1Óç2ę(WAĆś|ÔQ®ŠĚŞ… ­Ďb'ľSQČĎUěÄw*™ô¤ÎĎ•7.PÂSŃęQÂÔó$ĚWŰ%ÔěŠZÓóĆš9^[‹Dőë2]uqÉřăEmX C ëD®†ŚĐωsdô° ±ďßFhٱîtńdôH7fcf¬€ŃLřt47ŚPšaPwş\24úM`†–ڰ2 ‡š_](I–ŚŤľň†R4–Ľ2f\ ľ”˙Í–&7ŚĐEc]ýpWmmÔkô kÝ0B˛Ŕ`…şl2C! 1Şçjře^ ăąZ8­ă”ü3!Ĺ«˘ĎĽŽ8Űâ‘i™hpUŠGfĚ­)†"’Yy¦‰E¦2B_‚ďąjLh_éž-i…¨ísQd¶[áČŕy®Ú łô>„ůĹÜŠD†IśSşĹsŐ’ěk"SČ[aÉT=WW膔vÁHrÜčÇčŃ$>0˙ 9°.ŽŚ|±ý#Sń\ Zˇ}2^ iž©G s|BÚĄ‘QOŮŰ˝hő\ IŤoCF1ă‡>p`] ™o~÷ë:şýé\44ČÝńóŚĽÔĄgµ°ŞĄ ^ŃSf´ŔeząG߬çJ¨ŠG&2™YŐRšdÉ!o÷\­‹L66ÔýD2jS˛±dj1WĚFUŮÎ~hV-8k˛#3ŻZȰ 繢ig(Ä5˛ÉŹudÔßýAß›ęž+v†˘ŞścFQËűČĽ}Ű CśzV%#bĺ™É'‹ë™5Né,˘É´y®,Q%3˘>!™‰'‹ë›5j-26ćJă0QU貂(=6wđYĚ\'Ý÷Ą±űź&C˛~1Ďá'j7-dČúK!ô{Ą¶>ĹáCž«Ó?§|2‚ČŕŰ$»+Ϭ\)ŠFm}’Ăź9~[4jë“ţĚɰҬÍÚú‡?w2ĺť´h©­Opř3'ŁďDEKm}‚Ăź9 ŁhÔÖ'9üą“Q2¦¶>ĹáĎ›L„:đʧÝtJdBJdBJdBJdBJdBJdBJdBJdBJdBJdBJdBJdBJdB"2ů\:w2·ó˙ĚÉĚ«D&‘Id™D¦M‰LH‰LH‰LH‰LH‰LH1ČÜÍĘ)´ź˙u2±sĂ@E “d”Č„”Č„”Č„”Č„”Č„”Č„”Ȅ䑙ođÝYĘ#3×Ř»s•#“ÔP"R"R"R"R"R"R"Ň…‘ɆÔáúod~ydúŇŚdúăµ.EŮľ{ű&‘ (‘ )‘ )‘ˇoŚ×欬“©M=gv˝x2<ŻĎsZ#“ĺŐą>Í—ë Ăý5M2yő¨« S-.-d2–ëY—áĹi}"y†ĂĽ¨řB]™ŢŇTšidÂŘ•‘é±ŔąÍ-üĘěLç][ß›xĺ…şx2Xźń3MK}KÓ•Yŕ¦R8¤D&¤D&¤+&sčéËż^2ĂüŔ#b!.EĂČ ÚëÂČL¨D&¤D&¤D&¤D&¤’Ěf’ żËSď ěző˙rö^|Tn¶IEND®B`‚fox1.6-1.6.57/doc/art/win32-tooloptions.png000066400000000000000000000057011326741342000202320ustar00rootroot00000000000000‰PNG  IHDRˇ?ęaÂPLTE€˙˙ŔŔŔ€€€€˙˙˙˙˙CłŽtEXtSoftwaregif2png 2.0.1=^ľh BIDATxśíťKoëşlj˛ĺ>›ó9Č˝g Á˝űÉZ@b­ ´@ż~9Фž´¬ÇĐćß>˛¬Éźf8>QőI©?ڇҏ%:ű˘n«‹%úçç#©IWžĆŻäNôM•çÍŻŃWŰňíÜéő Ńz„¨ýüşÂţÜx€¨Ň•F" ¦‹W<x^{µ˙ŕ}µ«g6IŕlÎëČý"ű˛0řqma=Yk"˘•q˘Ď6 ‰ćlÔU,ń ˘÷°EDz]ë *ŕ?Ž đĘĆFť×…÷#P&nÖÓÔ3(O˘źÔ›_ÉýąN±üJîDC=&Ń!ŤĺĂTä«ÉW!’ŻB´»RzáßçGôťpLŃřµů©ë6/ěJ9.éňľAa/KDă×ćRŹf1±yaWĘqiDßŔDÂL4‘ŇEŹ’Nl^Ř•r\&0•p¶DT›T$]gOTqĄ4ô ;b"¤¬ŞAľt…ŐµlĆ-Áńľ¤tF H¶ňiÇIhÍ©˙Ńť¬ăł'(ł‹ń;b". ?Ý•Żň»ĂâĐö1˘Ş_$Ť‡ů´ă$ęH'G©DXʶ'ÂMD±n$ňçßO¤TUéJŐŞG›vŽĹDʬˇ`JĹ»đ MgŮe‡Yi]ő¬E´f÷óDp&¦Ž…©đË8Ń;éQ"Čť]Łg÷l¤ak\śXşwŹ×čBv S†´Łă”&"Ý·‘î’Öîlç$Hôî."‘š˛Ń$‘Í[si""kÓE"8w‚ČŮhŚ’®‘˝ÚÎëc˘&Ň·işÚ}Ż«č”y"=mŁ9"ş’ÎFľJEDG¤Ö ŠăpÔ€HOőŞ" ‰ô˘×uőhÖFp?SCeńşAd€T02`ŐŤb Ĺ Â5 ¸č;®=˘Č€÷#M‘ 3fëŃ@7=3Tă»ôŘa=×-Ćşn ⋼HDVŢę)hé~4řçşB$™ęŤ}üťGŹjyý 7Ř·Ź Ţ1‘śyIDS'6e§ő*DňUä«ÉW!’ŻB$_O@¤wŚôcn¤Jő×ýŰý¶|’DşćN¤UÉ%©ëňóXńću×ô˘ľŤÜĘ~DĐÓ¬h©Őćl@Taw6u^*=ŢżíľÝIDőúÔhąą± ąîDîÖíiôť ·hÄF8İ'‘ďűÇŃ1–öooHTíkŁQ˘‘ţí|´#˘AĽŽşś‰hk$ĽaőG" ŁýŰ÷šßI”˝úD• po­ťłx|ĺŻÇ'ş|ě¤?»,wÎb@¤v’÷€ťł™}zĺ«€hß,v'⏷‰â,ö'âúş'Q”Ĺ35pPKeŕ˝evLĉ6á’˛Ľ?‹)"ZŘ\Vç3šÝ4‘YźÓ˘×ŃËev?‘‚Y,ű…YLY'0átФ® ş€RčÚĘ~/ż;‹i"ë~eî&˘ůG="¤iȯѵ [‘_śĹQÓtŮÜ_Ť »jXŹ0‡ÓX3!‘ý\ÔËb‰hMýěF"CLÇ vk®ŕňýÜ.Ěl/"`PŰx]"Ô]µ¦Ş&AęÄ‘ÁÜ–6•€g†]ł{"nßíIg±;ŃH‹oß,DőN ö͢O´ß”4źńľY<~_Pţ*DňőřD»ux ‰>Ő“®ě:ř{€ ‘|ĺBô~ůţ‹W_ŕgŻżř[8䌿š"Â_lʼnî7E(A—Ë˙Í?s~¤÷ëĺ‹UáŔî$QČs* é÷_?ďT×—_‰‚ńéđ×rcD‡˘Ź÷˙uëŻ/ßúQÝú"ýb´ Ş4ÍM:† Żß—ßďÝĄ}y L䍔Bä(ZUÁOFOĐŰĺ?ţË«ŻE*0R‘Rřż Q7Őó ařŘ( nŃFµ'ŇőyU*Ľ”ÖDť‘<‘sŔąX'ÉëHTú0ÖŃ›ýoö~„Ó¦pŽMŕ:12Ůb-!â@žË3‰ďG–č•Ý® ¦KÍG†0*JPĹS%AżşEôČŔvĚËF)*Dňő,Dr~¸ĽBŁDŘ´×ä·tĐřŃ*Dňő\D8‹ˇO3<Ńn4´ąÁiC¦7ŤĂĐ ©&ÜĐĄĂKp>‹ÍĄÁ·ÁÉ-v+Lq éö„ćÖąsD†‹5:EĚ´nţĹ»©pá‰XXŠ#‚ł ż-ťčÖLIš'j‰Nđęůz]j1NĂŤ1QŰ L?‘áŮ4=Ă(śSĂóÓ n„ýđbx ¬).°ÂĹDŠ&Óá\ˇ ÍîD°T óˇëó°rµ·Đ.cÜ%żF3ôđŞĹ‡żsQ3D b˛Z|Ť»|¨ŮĹFǶřb˘fs"Ăą×âs±Žm6Žu'´řŘ#ĄN•ďP[ÜŹ†J¸D§«´řä«ÉW!’Żç":ĽĹÇ™˝Ţ·7řdµřşçڰytăC¬_WúčĆUY->ODm‹]Č—ÍQc|Í"Ô’Ťp‰(Ŕ†`­ÝDçËšIŽm„ńačL€ľ–cú˘Đx_çn–Oš×-ÝŹđ&ÔBP€[Ó•"áz+.2<Ů3C–z"ťÝĘYݧiĂšłËµ^…HľRĆřx0Żéz M°§´1>ü @¶™5H„#FńXž]Ă1`jDö§ŚńcyDcL7B"OI#b†F›`Ţ)cÇ+™|0"2g|RIc|~,ŹQܨť9±äSJăăČŔî§`ŞAž‘!O"ů*DňUäëąZ|†fÁ\čYÝŮ⣙J-¶řÜì ÝŮâkň#Zhńá¬ÓĚĽnˇĹgň«G -ľÜčc®Ĺ׸٤bto‹ŞŃ9mC=×3Cž*DňUäkö~´^2‰î¸ožyË}*Ż+6˘b#ů*6’Żb#ůz.=Üs]¦*DňUä«ÉW!’ŻB$_…Hľ ‘|"ůz˘:_Ť=Ţ_Ě_…Hľ ‘|"ů*DňUä«ÉW!’Ż€(ç?'( :óĎÁo)Oô@*DňUä«ÉW!ÚIUĘ˝sąÓ·©ĺ-••–’ ž‚ÎVő=ż˙RNW!šX˘Jé^^}"Š}ťÜˇb‰t]Őş ·ôŞ:âÍ„(*ň¨ŽO ‰&ŠÝj„¨RµV°„Ţž7Q @Ö’ô&‰&Zô:>E©L"CÝYGgRŹfŁ7Ä:˝Ib‰č~iä~D^—Id*÷g†ˇ Ńůz@˘ź…>úüŇún›8[iDIG !ÚP…Hľ ‘|Y˘Uî´óÓ˙sõDÔ^©ŚIEND®B`‚fox1.6-1.6.57/doc/art/wintextedit.png000066400000000000000000000443301326741342000172520ustar00rootroot00000000000000‰PNG  IHDR‰Mq~PLTE9­­­ĄĄĄ„çĄ{{{kkkccc˙˙˙Δ”{9999111ŢŢŢ9{!!!ÎÎÎ9ĆĆĆ99˙˙˙„„”””„„„„˝ZZZRRR„„µĆŢ˙˙˙˙˙BBB{„„„˝˝˝˙švXVtEXtSoftwaregif2png 2.0.1=^ľh IDATxśíÝ â:š iÍ4•ۑӳ;µíŞ =]+şÓ»ü˙?¸–dY’ořňzź<' 0`7ĺ NŐ@ˇÔ»ĽËÖ#ŰďBŹě{¨ k9€u5 ëÍCF­Őp ‹=«Gc·zsŰţ +Ş 8ĄžŐz®jG‡ă?Ą*F‚ÎŕAÓőzOÇTUŰ?Šx§LFn»8^ Ř/@oő(€ďw°íß-b–|YpřĺbŐ}ż'€éřďj7´KŔlđfŹh7 `2lŘ5‘ţxŻÇ‹ŔµľÜ[ę@ŻžęŘN¨bŕÍÖĐŹ÷°ßţËŔy< Ůú{8€7SĽvŘŹí:ŔŽ[łX"€Ý@F€ÎcMývŕÝ Ű€Yŕ<žţI¶8«|Ml+0ëĽßö!l=$ [śÔb'´ý«¶ '·łŔű-Ĺl| +eú·q)­ŔNj>fSăżÚôo{[ů,0€SŤŮřhĐţĐŰ88 Gp mé6l `´ú°«Dp«-o`8t8"4Dp‹üý»+UřçŐpřJ…Óu{ĂďÇ×(,€ëwöŰT®á'‚“›Ë7ĐđT6€ľ†ţ¬=uď ˙Ľ»pň-”^ÁśY¸öĂ7¤NOÇ?äLPypŞNł6gëěß >~IÓsé[g:Uó{üfŚnJń ëhÎ»Ż…°é…Ý‘ŞúłŃGâ´ŽŻ´â^ôŕD'SĺXFًǗ Ä› `÷M<4íł,6€ýGŘü˙áĂ»á$ľŇ#ĂźęÁdDůĆ/ölÍ—¸6ˇK:ęcżÔ›¤˛żŠ?ŻÇóSÓáĘýM“ĄňřîA+Xą!Ś?<>®A|ÉcýęE;nŚnűŇĆY‹ÖüĹď‘´ŤľŹIŁę¸lńĄă7_ŕexłÁÍç&˛6€ÝR0\ vËŔ먓ďN2|ŔK˛±dn5â¨`áZńŘńŃ˙“ ĺ€F€S&6‚¬68ÜňqŽN/'Ű‹/űNxů˙t©[îm8¬ś2±ĚTăˇßĆE`=şâyÖÎl‰C÷Ş' ČŇ•ßě»Ŕr·÷vĂި^ýŹBŁĂš.ę®vłN·) {ŔQ¬?YZ_qnŕä›OŹŻÎ:@ĽŇTŮpÝÓ“¨=ÍŠ^Âî%ýI(ťžŞÚp_ęô*Ń4Ç‹®ž,{k¶ă5ř$Č”O  JĽű˝Ľ]ĽklK ż_zů@B=0ľĚ¤Ŕě@@ ̇ÄäŔĚ@@Ě äŔĚ@@Ě äŔĚ@@Ě äŔĚ@@ĚL@¬ Žü3ÖĂ}7}Őđăů QÉÉŕlŹf& ŕň‹;ő5}m582GŤŹ{zO ŕěĺ@ž ńqOo2€Ýrm´¤;q%űswŐ‰ëő RUřČLŔîcę˝O33±ĐwKE/űÄ•ş·ÂÜjŔ(wÝ„ 2Ží1üżżˇ `fF€sLÎl m [E§0ľń `Ć–¨&—WЧ.šDľ˘& J0kŹF€ło„-Ś.!€ČÓ`XŔŹppx~ŕ`;k‘·éE`ÖfnÇVŕ°$ě3==ô_ý„ ˛ĹV`ăăž…výuN3PÍlöH_rÁkąP“oi;F€Ŕn0wC3C90v·¶ÝÁ˛MÓZr`еo[Őm‰Ş7=Ú ‡v˘ˇß¦Ş[mŮhŢť­«öO­[85Ř-÷¶.ý%[îŕÖ篱´ő««6uMS+=€÷ŘĄKŕÖ^‚0ú3_ pjeđ>ä¸3€Ť¶ňůÓŐłř ŔQĹđbŁw»& lv,ŰĹßĆţ©í\5ůkź@ ŕ¨Ňhűw˝ ;×6uÁ‹Ť“[¨YN®ŕ^Ú^«a˙ÚnÜ ¦Ű ěňWůíćo6‚çVnm˙n¶ĄÔĺŇpc•ŰňĺĎi#HS+:€W}ëw ĽĚŢdňnµ+`eóWőŁ?Ó+6€í«˙u×ôÜŔʰŠö~é@ŕÔ `<ţłWÝ@S@3/u2ú#€Ŕé•Ŕ~ü7ŕ¶¶Ôí\śĘßóö ˘Ř^oşîö}îí  Ň¶€aÓ‡§Ţ±řvěý°ç¸Đű#ý˙ô6ß”ăWCB©ĽŢ®Őčs űXGLňW˝cx0€mY~˙ŢőµçßNŇ7Ý>•4łX®€{žÂˇD€~źC±í˝;€UťŽűü˝a`»Ô}pąíß¶ŞŻŻ/Umţmľµ3§u €öĎćŰÍM®Ú@˝3Â6ś·Ř(4€×ŞşÚ]ţ$8. Ëß;ÖŢnvÇěÝďŰż­#Ŕ¶€_;F€í ÜŮ? ČţnʰşÖWŐćŻ}w\k ř^ŰďßÁĂ8«›Ť_\Ŕ.Ż`ÖżVÝżśjÇ[×~ŮAŕ67}×·n6U;G€•ÜżZ¬v bۇĐţçVoş]í_ź¶€đ˝Ę ŕµ ŕeó^/ă;č6‚ô ů{ÇF¶~f_ěŤĂłDV›E27ţ۶ÜÚ@}˙şënFéjßĐĚíÍ7ś›Ţö–ş‡p±_¶°úżjkF€oVhC˙˘*ż5xÓÜ~âĆů{ĂF]ŰQU˝± mŞÍۿۖ[ÚrşŕĆĹŃ{{›{űXďöŘ[nŮÝŻ®UmĆ`BŮ1!{ďĘPo( Yňí˙Ŕ÷*4€×.€ńpßGAęžŇvŹč·n©jłqU×sd*[Ăşże˝©śfŘPßÍ·ÇG5~ŘH®Üx‹nŘĆxÓR°˛ĺëţ˛%€ďUhͰßóĎoß~ĐM´ß‹Ö:] ř†Ť mÝjµJmŘbęe¶Jt6po9Í:@SŔŻ‹˙m]ë¸óN\Ô¦őxöQ„  áúŰٱź»Ý¶µ‡WhŻÝĐn;HĽôžšßó5ÝüÎvŹb-ӱп CąÝĺ4[Mm·®Ę3껉ţđRmÜ”ŹÍëży¨7/;C^ąĽ¨PŔÝ;Át#@ŔZĄů{ÇFtGěµÔÎţí/§ŮĐpWÓY"@ż‹©ŕ¦‡ˇŽŤŐÖegČ+8€Íd·nŽF€fKHśżk>Ü;ŽŰ]NSŹý#@óşşWÖěłt<€¶}›ŘÝöĐpS9!ŻŘšĐ©Q·m6j7ţ3Ś6‚Řüý\ł ŕţŕÎr¶şOaźax,€F€ŰĘ ye°ąú->—}ůëč7‚DŁżëON#ŔÝ㸽ĺ4ëҵ#€›n<ŵoßÂh(Ťő7Iť ŕ[Ŕ~çżűÖý˙ĽÚmţŐa#H[…źű—üϲ°)€;Çq»ËŮ}¸Żő†›š»męđGbČVÄ]v”⊠`WŔđQ¸ťwPk_@·Älú^4°_â¦îPíľaŔť¸dß›ý| `Óďô|đ“pń~€Ę~ 4ĹQ+5€főßqßp2.vumż$ßÁä”ŔL@@ĚĚ\Ur˛ŢŢ­¨żŚŤ÷óđŽV<’d•ˇĚ§ŕ6>“]·0„6YCĚĚlÝoÖćŁ ěąQë—Ý€»ľëÝšN_ń@WěSů}»őkÍÍšřF03ó#Ŕ=-Ű;n¬~éđuý=¸ź5Çä›yÄű#ňËÍŃľgŹźÓđkÍÍlřF03+č´üAŢ˝Âď¤ňĄęÓ!ąË„ö‹®żf—Ă´ÂŁs÷-ú.-(ŞpUĺ÷®Łů žIe‡tżŞ ·ý-ü“ínŐĎG˝ŇŞě,ż ĚĚÂ:@Nş–l `zë*TjšE·8čG„łK‡*^FďK— [Őŕ˙…G ?Yz–‹úź9Óţ˙ëááYĂ-ş'űËśůőpTztŞ’Kđj03KAÔŕ×K=\¨ŚG€ăÓĹ۶żň6tvk®ÜHHŰ_˙™„ć¨ÖńSxlŐQGŐßeŔM·č›ćÁÇĎj4đJĹP ß~tVŘâV`ĺ—ŻÔţ¦ZdG?v¤ű|t=ś˝»áč'l ź Y±|˛†Ó…›'˝ O4ť x©‚¸©µ ;aűKvŹ«‡ě–Ă/żYVŮÁý<ôôĹc5Ľ‹hůá"p%Ŕ_›řkŔn¬zč鬧}ďBg¬Lžžŕ›ÖÜ­Zś¬â+–IĐŻď żüşM¬\ `˛8 ăÔ„Âł;@÷hÝŇűŻUŚoŃ {«x¬zčécgř]J `-óµű˘—1w©żČ]ţ ąľnâ ĆS´bGč~MSµâ—*\y¸xůĆnGhż8¬ýňOÝO~zXOdÇ"đˇöϤĆm¸Ĺ/7ěőOzi=D? Ĺđ›@ÝuĐĹË_2¸hŐäuü˙`‚ńÔä<ëŁp›ýúE]{jÎéţrهötá™DĎcĺ-şíÝ÷ëwŚÄ9ŔfŔ&ľtgG·~eű#2lzőŁ[m»áŻÎ¦E÷¸ůvŰźk´ďóÖ‚Í  îx›pitŃC:ąöÔ©–^>ÉĐě9&3~«ýËOá &#ŔfmăIΞŠâwě„üGCxm˛C,‡Xćż(QÁô‹¨MrIżÝvE¶˘ŃâŰ·Ř®¸ćŽr`f ‡f†r`f ‡fĆ ŔA0?6€ ŔQĺŤőô'3¶ě¨23‰ąIŠď í¨d~— ŕô•6pŰŐ pRpůâ#×íĆÂ{A7Rn»ŹzřĎk¤áHĎ% Wôë/ŠŘ]$2  Ő„Á„łMÓ_”| wČObxĹŃáCN»‹d@@F çüČoć°łÇCH‘Ć̱²»– Č €ÝeĂZ+8u0™p[=´ Č €ÝeS#ŔfgĂŹ pfp~`“žYŔé‹d@@Ft·ÎŤÖö«űFÓI.JĆ@@Fy–˝dŔW= AA_ő(@@FńĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@Ěd”Ŕ:±˙ÜvČ(:€u;0şÖőOýsm˙˙yn ŁäÖÉś¨ŹĚU«úúcţÜZ•=wÝ?ą Łě†Ĺ_]  )`ßżľ€Ď@@FáTťËŃÖ]m˙ľŰsż˙ľ\Lqd”Ŕ»s4€íňo_Ŕď›ëßź?Ď* dŔ/‰šőĘ/_»ţ]ţ\ž´2 Hmőâ¶ő»^ďOÚBĹPdXŮęEcŔ¶~?___÷ NŚŠ¬Tj44ýűÇs H…đâé ±Ű“ă1 é_;Ľ@ŕĽĘ` ńˇ:Ţż.—űĺ×ëf.dŔ¨xÉLŮş4lŠ×†Ű‚ÝšÁăO`2Š ęűPH_»?f Ř­Ľ~˙ýŰěMÓ*8€ÉJżđˇtőłkÍPW?×ëőď˙ţÇ÷?'Vn“Ą^ŔţňÍěö‚iof X›ţ|ŰţµY<řč'@@FÉ kí°ůň—o VćěO(`[ż3 <řč'@@FŃüýŰĐ®<Ŕ®€Ť_¨*Őo !€ŔyŔ?ÂVŕ#‹Ŕľ€ćO;OMő”úîÖ zčÓ Łŕ7‚řËw}(D™Ĺ]×żŞ˛Ľ}»-#Gů Č(7€ŤRR»ÁŘ©]íOŰUŠ?·vhŽŠőśYKШ+÷Ăd“đć†x*űőçúíŽ ¨ž2$€€Řť¦ź„Űöiŕϰ.đf—=îYAÝ©JÔţňuLÍÍÚŻµ/`ý´ü@@ ´'CŰ扺F·šńŘcźDĺ°nłwm™ŐvŁŮ˛m-`4\sχ@@Fą¬šŞşęŰU™˝ă…ŘŕÖšüMŤ Ŕ™•@ŐćÉĐ˙ |(ÄŘ@;;Ç·b8ŻrhâVŇ% é‚[čfçxçUv;Łm w´ëíěŢŚE`ŕĚ ˝ĆȦ;öÜű7!€€ (q;ĂądŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@FÔÉÉ’…«¸ą÷ŕş+îbČ(1€®KQťćBµŔů+č‰s˛ ŁÄş0IđÁ¸ŹçVvÍđ_›î˙ţ;í/™n­›njÝ—î‚x’Z¤‰QdűÖő߆ö—ép• :žTwn˘ÇÓčľ@@F™lô(^~Č]ćs8ĹÍ˝ţÜ «Ńň`’8‘BŘĹÎZŕü«NÎ Ř/@ŕĚĘ`¸dfřxűČtÇÓ €Ŕů”@ż~.UŘč1¸lÂru3@ÖçRlý’ę0xmÂsĹ —ÚëëA3Óiô“ÔlΤŔľŤHü Č €ŻC“!€ŻC“!€"€€ !Č €"€€Ś‚¨““éłGVÓąz`«@@FIěö€žĽŽDOa-Č()€+vl>ŔW2Ę  yćál÷YŕäĂý5Ö÷¬` ą§"€€Ś˘8qt×ŔţŁÁzxŤ ëăŹ?d”Ŕ¨zăłSnŮ’07CĂ@ŕě `3>`#Ŕř 2Pf›ţ¬´Ź¨Ł‹¦Ön¸䦸ÎnnüĆŕt+p˛˛pQ@¶((€ó^±ó˛$Č € JU|ÍLxŐ‘BĹ0GA3D0CA3D0CA3D0CA3D0CA3D0CA3D0CA3D0CA3D0CA3D0CA3D0CA3D0CA3D0CAÍęŁ÷°čŕÄÇ ş|J R÷ň$€€ h€úXŐ?–x'€ŔIŔvüfćÑƼD pn°¶%°ŕĺ2Xýg#H“*>€ueçávÖĎ''UzŰţÝĚ|¸UµŢť@ŔÉüŮ@ठ`]™üŮÚîK  ŕL˙tý„ý` Łě¶ý qÜ“Ŕ6€3ý«íä>ţČ(=€Zw!QU哲ąYębhn[›I¶°'µŞ'Vtí°éŢ­íźÔçH@;Úk“WŰí)•Şk;úÓú!€€ŚÂhfAm2ŐÖŞ2Ůň6ÍŔväç¶)WÝ”kś44Ł·[ŔŞňłek/Ę-îÚ ]ô5ç*»8M“*<€7» ¸ÍV›ż>€ßÍ÷ćŢMÝf“O›ÖŞ[H“*<€Ý\¸ŮŕíHgw$€Ŕi@U‡ůŕ€»'>Gł+9€µňűAWf ř¦.őĺR].zWçČá°€Ó*9€JUueÚgWޢŕľN ăçUpͶZS@§íßĹŤílŮŔţ€Xˇ8­‚čŹčňgOÂlŮŔńˇűü@༊ Ůmą˛{ęĄůŰŔË —>ć¬Ä“@@FÁljźŔ° ÜŰ4K˘ôŃ»D-x Č(9€}őÁ]WÂŢ4Ę/_î8˝˛ŹýĐoÇQM•=Śęšma?@ŕ´J`vócϡíСŚŔ4»jŤ hô Ü5lÜQŻ42Cť.űbehgçKúG!Đł Ü÷ĎbÖáŔú{nľdŔ`÷?ßa×ÚŮIśŔäš»€ń~€»nżd@‰;xâúľ)A3D0CA3D0CA3D0CA3DĄP‡S=uÝ‘‰ką97sĺţ‡ë&ż dŔU¦B©g§ Ł@ŕôŠ  ŽO›ŕäŘ0ú!NŻŕÚĺTíÎiÖž6á'Ú_O#śčäÚŁúÉwWďŻu0ŽQ\›>A>MşĎˇż(ýva8ľQrítňŃ=»|BA›‰–= ]«é.n 2y d”Ŕ¸~ěŹăÚM]{bT_űČ €Í €Í°]KŚ/™`?îLnżdŔh‰4ZI·yŕhˇv]çQvăÍ´îl“nNFnń4şS_[č/ö—FÓ<„2J ŕ›n^‚2ŕ+ČöŹBŕóŢďo2`† f2`† ŁĚšg>¸d|ł=kîú Źî@dŔřSÝY™F{>‹oúŤ@@F‰ÔÉI#Ŕô#"8»˛Ř}LMÇGď[üČ2˝đť$Č €é‘| x™žýFdŔ…nmXňYâřČ €óÜĽ!7ZąřĚţ@@”_–8âŐ"Č(1€ÉŢ*z)€» (rĐçEQdăý•ă–ęŃVŕÍÔş˙'ćŘ ś]™ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@Fń¬;ďŁjgŁŔdVŢD”Ŕ¶X•M—nÓu$_UŐÍĎ—2  «ź¶µóÁÝw•ľ]ş?Ż( d”@_żÚ·ş›»úU]"uěĐăžż?(8€ćŮ·O޵ύ˙ěHpűT3ÖĄő9s–2 `eWÜUîDŰş/›Xë[=ýçú”YKe°o`›˝Ę í%Řvs¦€8łâŘ7°[č.Ř6Gy"€É8ĐĐ · #6°r›/öŤ#Őý^ůóâł—2Ę ŕ¨€ÝpGłú`ŘćŢňß@ऊŕźVHáľ1[?Ľh?!ŔJ+ó‡gUx˙h×@ýG  ö4‹Ŕ•˛ pVeФŻ  ĆéĎ@ऊŕź?ˇ€B#Ŕ 8«˘čÇ~ýpçfŰh u÷ěw8«‚č–»‘ßÁĆ#Ŕo}˙vîú·&€ŔyŔx?‰ŕ÷ÍĐśiřç7ΫđÖBŚF€??QÍR0ÎŞđvűÁtgö~rc´đŰĐĐ €ŔY•@ľăL·@ %ĐĐ|äϡö\• čö…‰xŻ^2 IDAT¸}nÔýěl«ôűNLŔa˙vĐ|čÍđOŔż˙ťçUvĂPďßÜŤ} ̄ý.8Ż˘ب.őńö#@Í'A€\”ŔFu ¬Ă^€;fFíĆ}S8«Âx8€vv@ 'Ĺ0şţí  ›ťę2'EźŔ˝ůëÖÚŮ©&í™ćČ €î*jţ’ý÷M`#Č €ţJFjOěM"€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č(/€îy?ĽŃăk¬ż–4Č(0€Ń×ř|Ąđaş đůŠ ™Ť?íG†îŇřçó˘kµS°7nšdÂ+'´ d”@íĎię/×ý‰Wź]ËçO§Öë&´ d@§°obřnc“'ŕďQdŔţÄÍ…v?_0ŔxÂŚÓ*:€é%Ýâďřç F€ ήř&§Ń‚±Ô"0ëó*6€a{otÚ„ďvlŽţ×[ĺ Hĺpä®*Ďś(dŔŕ)ý#€Ŕy@OtWĺ~šĎ*„Ŕ @@ĚdŔ @@FńtłˇŮł±˘ź‰ăź,|'€2`ôu‡éęÇW9‚2`ôudŚúŻîłp[kĺ?X§“Ď”tźţđ?Ú8͇ ZMÓŇoŰ´Łdú!`Ý]Î"€€ čż&ŃZm1€ńU$@@ô_…} pVĐ•`úCQAý×',@ŕÜ Ő ŕŇVŕD±@@FńĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@ĚdŔ @@FŮT-‘{/BEPŐżk‘<©[˙gń2!QrU@©z}íÚsĎ@@HÉt”[ţn©ßnrí©ýöý#€€‚¨L¶~›ö‘:0fë hÇ€í×çőŹBJ Q›šĺŕ¶TĘöĐqĎ˝DcŔ§Ž˙ ĄäÖv#HÓÔµoŕď߼=wüG)%ĐdŻ®ŐĄé–…ĂcŔ§öŹBJ`mF}&Í×WsQ‡ŹźŮ?)9€»'Ě×—_˙Wď`<|b˙ ¤ŕvźQnwh7ě’¸;^Ńđyý#€€’čě úw`ô¦†ű>dŔ¦ßýĺ·Oßîv‹ľaŔç €€ Ř„*Ý•oďFżńăÉc@Č €ö]ë#ł"Úýĺąc@Č €î*Śv~ň2 »ĘńFăżgŹ ŁÜÖ=ŐPí `4©°ĺ‰c@Č(8€ý<č¸wčhRa+ĘÇ€QvM§l}˙Ô{MĘßú©c@Č(;€zŔßöěMŞżmżGőĆ€QvŁ +`˝kčtRţ^Ź~Şdd@Ó,_-s`˝ąLęé ŁđÚyĐý+ű‡kĂI=d”@7˘ővűî`bROEEP Ű'µ d”@G$€B“Z…2Ę  ŕVÚ'nđťDĺ0cA3D0CA3D0CA3D0CQxÝLH.±˙­ĄÇ˝ęú©>BĄ0úÚ_˛%€Oąę#AŁ“î, Aý‰™ÍŢę;‰O p>°;Ńátó:Ŕô–:žVşnEá:A»“ť çt2ąQçC»7;„触I"€ÝI´6Of8<%€ŔéŔîëÁE`Ö*=€V¶Ů»#4[Ŕ<@@ĚdŔ @@ĚdŔ @@Ěd@űś§Ż%¸›Ęł@@FYţ/KA3D%ĐžÓÝç>üç@’cjÉ®É#€€Ś˛h?“fO»/ýGÔôÄGyO‹2 `¶Ĺ¦ ?;8śßi@@Fyýo"€ÝO‹2Ę `żü;8R_z3·Ď"€€Ś’¨'Č:@ e0ěÝť¦›DĆ[7!ő% ٰ~Č €"€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č €"€€ (ánţÜn·owîroâ?µôÝ@@Đ·®M`ŰŔ{•P~ö@@”jg†•V—göŹB qíěĽxĽwąµł´|ĆĚ%€€ Řş¶3Á:^ŔËĹĚŃv–~_žÖ?!€¶ĘŞŞ}s"Vf¦Öu­n—gőŹB`@?ÔÎFýSęR×·‹Ééí»ą>gÎ@@FŮtkţęJą3ʟٸ6°-ß·a—•ľ}ßľżŐ÷íöý¤KEĐ­ű«Űą ě*@ŐťV[—…ŰţµŐk5w@S@u7Ľ~đS Łävă?­LŻĘŚý°Ú´đz7ůsűęvŮ·ţ®ďöäY$€€Ś‚x­ĚłŻµ+`»¬+˙G]7Íß?»ĚEëËíÚ.ý*sůS HĺĐôďjű§Űşĺŕk÷G«M#Ŕ6s·n+ČE©KU׳¤yV ŁäöýÓîk(ŕuëP7ýVŕş6ëuQŤ+ ČsH@@FÁÔţŬ·ŤőM÷{ÂÔ•ÝđŇýčű $€€Ś‚Ř>ńë”zĎđÖď X›Ąéşąřź@ŕ´  ľ^«)×Í#@łő·™>eH°ę·yŚţlŢŻípfřŚ! d@=ŰżÍ#@s0T==$€Ŕy@ą ŮÚđÂČFÁFĽ0˛Qp%G€ˇ€~řĚý` ŁŕĘŤëžęG€*đř3 €€Ś‚(7¬űŮ©n7?t`GhŕÄ  ŕ°ť‘ć¨íWs\„o;´ź„{J˙ ¤ŕ Ź]o¶€1™ç €€Ś‚řśŕ€Ě3 €€Ś‚¸8Ü4Kj7ţ3ĽÔŐsăg@@FÁ\˛mŽŘÚŮ©ěF`»đ‰s•2Ę `Łl»@7;Ő˝®Şn+°94 qü @@FÁ”ă*mŘ`ŐŤŐ“úG!P@´ Ö®ęIý#€€(q)Ó?wú¤ű#€€ !Č €"€€ !Č €"€€ !Č €"€€ !Č €zpş’Ţu+A÷Poőş@@ô%Ű<Ôî$şäU †ŽĆt‹7 4óŃ~íľřKú“ÁŇ@@t%ÓÍćv·ëC8ş¤˙ÁŕŠ‡@@ ôýZ%DmŔhv'W €Ŕ™@ę·5€Ý ­~i¸I;°»âaAŁö‹Á+DŚ/ ‡#@ Auň˙¶6%\ÖY!€q7ä)ĺ™ůŘť×ă­Ŕš­ŔŔYŔÄSöĺź(dŔŘsöe&€ŔIŔ@fůtbşŇ$€€ !Č €"€€ !Č(,€îIűo˘ël]OMfőM6^d”ŔčklWĚ^wü«Č €3—,ôŕŐl+‡@ř+ó—@8–_ňąŽ…Oo„KüŤÜ‡âFgý}m9ĚÂcćE«Ţó&đaĘ  ŐôâĘJÇ—Ě~W'gşŢůIędęéw2l()€ţë ońA]\"GtIŤŘ$“LĎĆ÷%‚rJ`Čݰxş_ /@ŕc”ŔpůÄo¶ZýĎ »Ň¸}`r­Ĺęgđđ"źţnIě7‚ř˙ŁoĂBo·tÜ„K‡túăév˙Ô\”C™˛ ^ju7·µ~×Dcđ3@ĽÔúŞmęU<4Ńş˝ŕÁŔĚ@ĽÔ†nÜoÍ”M´¶I\ľ—Ę8€ĘüQËw@3CńR9đ˙UJŔĎŇĐ­ó}aĽîŔ:ľ(*9™ŕZµ>XQ«ďd%2Ńv:ůË_Ęú(Üg\~?@pžiU˛­Ré+‰‰V>€ó+Íu `fś}_@ŘŔ]µŃ;YphňąřĚ`f¦č— ˘S»xŐűX2Δ߲нÝü;ěh“)ž¨™Lm/šş_$™‰E`żź*TÉŰÍ;ŔäŤ|p˘&mî˘zş€ÝďĚĚ`#HŔŞ» áη=ŕLŤł ˛ßę™…`˙kD33±¬&ÂG!c>€ÝNŔŞ ŕxč~‹Ř śź©N˝Ü»”ţá ĺ`äřFŃŞŞꉽĹúţŔÜĚpĽBŔó'ßŔ‡'ú—…†ţŔÜ čFěY·ů·Ű \ŤßŁŔV}U˙öŞ’ť6ŘvcŘ üł ŚőĄţ2zJżŘ ś©M…Ł}8*ĎŹÂýĺ/ľ€îěŕýb+p®¶ţá°Ü¨†LúGsł>€ŹŽ¬g}Űeę…ţ±8? /µ>€Ć\Ż ŕ٫Ý1R—úGsCńR«Xo«™áÚë':ěĚͧ˙#58™Źzż úÇVŕüTÝîíŔKĽ»Y’Ćý#€ąů¬ż‘÷"€™!€€™Ş ćă ‘ú¸§·ńßI°čÝżŃĎőáOć@Ĺ"€Š5ŔháߟݷB ě0u˘Ý¨v>n8l6€ýđîś;t@˝9ůKxčŃŔ ¬âÚŻJmß/h2QŹ=|Řo)€¶uÝĺżŰŔq˙ú|ü°Ű|k7pójŔ¨ĂĄaŕ­XűEß.€ő®ť"űŕĹ Ź xčŃŔ 4˙ôJc˙ý•~#Čöm MŇż‰s?ě¶Ŕ.‚~˝ß®m MÔşdíź;s'€Ţf9€U@·ř»g+°OŢpűGwî耽–h·„(¶Úąx˘Ŕ<`p×2p:tgâí ‡źě´Ŕö« g÷1î_r(ńî’ŁOöšéYt4°áéFQ‡˙šđVsüîü¨űßÍź‹ş9[čĘ7ş@ďó €Łţ™nşŔq˙ŘŔ;=`׿{ÔżŤ$€Îj!€?-ő÷ű?”R˙Pvá·u˝Ý®ŔGX í_;4KŔęŇu˝î ŕt%žě±@3ŕ3k˙ěą6€˙¸˙Ý~&xĎ:Ŕů! Ŕs€]–Řžt#ŔvŕçF€űvąŽĐo&€ŢčA»`{îjG€űv™ü(śfGhď5ťłčß…w#@łč{é6o+`4©´€|Ŕ›Í°_E§ş`{M3Ľn.`4©©ţ@o3@ł Ä~u‹Ŕnh ¸9€Ý¤&ŽCĽĎ°  ů8Hc÷Ľ›îşIEŰ~C Ežěđphú§ş‘źÝf˙pŞŔŰĚĐ4ËĐŻüs¶íM*ţç@úÝEžě°@·ĺâŰě }W׾€? M*ŮĆď-ň,`‡ův›n»ăÁŹŔuýŰŔŃVŕčc!"ĎvXXčřŹ‹ůc člÜ0Lj"Ŕű<ÜP©KRŔ­ź™ŘPÇžě2ťłpD|Ő Ž‰żů=ĺđ3€ť6 >P, X@± €b@Ĺ"€Š5Ŕx/˝ţÜö=÷’ÉDEßnš™`řÚ‰.[KĎ%€ŢëAÓP  ŽrJĽßŽn2Ŕ†x·Ml¶v7¬ě—ˇ“Š|ŔŰl  9ٸ¤˙m÷hŘŕ6pď:ŔÁpŹu€ŢîeAćÎ@ďňŞÝ`ú…_ŕ,^µ#t ;B8 >  X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€Š5ŔÚ{ᣀš `­= ŕ3ͰַĘ˙ˇ€>ŇLăţQ@źi:€u•Şl8đf¨—\) €O0@·ěk‡~ęzŤ—‡ođćčÖýŐŐWőU+U'$€>ÂҰ®ô—ůS5i €Ź°0ěűg xeŕÓĚŹ«ş­ź¶ýűŞÔ• €O3?¬«ĐżŻv! €3?¬ÍňŻvýK— €Źđ`X1𱌿řXË#Ŕ/F€>×ŇVŕPŔ¤Ś|†Ąý›~üÇ~€>Đâ'Ašľ5ë|śĹĎ+÷SĄŞ:. đfŽýת+]Ő÷P@ŕ#<: ˛ÇC­ô×=řó4c?@»6đţř #@@׼K\@ŕ#¬¦$€>ÂlMţLŻ_@ř ÔÝrp§+ ńâÇO1Ŕn+p¸°+ŕ‹<ŰÂ:Ŕa] €Ońp?Ŕřâ¶€ŔÇîYX󧆗żâAŔ+4Ĺ"€ŠE‹(P, X@±˘ęä«NŻ7řň7Ŕŕă@ĹŠ×ęĆ/űęî?m»§uw©9ănŻ é"€|-Đw°?ý<:YJ¶ëQ›ľčÔý!~ňv$€,ČÚˇ6Śd,Ý:Úś0Z8ţ˛´"€­ŔQřX3>  X@± €b@Ĺ"€ŠEkřYŕơcż gŕ“$ś< éđˇŇ`żź3đůÖ°?ËĂ>Ă``řxo _ȨŔ'u~8´ŹřŁ­Ŕš(P¬ń~€z.€¬đY&w„Žľ ;B¶‡0 ň´ůŁp$Ŕ§ €ŠE‹ŁÁ(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠEk)€WÇž˙qÁđ1‚öGiŁ2Wůů¶~Ô…řó=űó[é›Ń°ë_Ŕ;đ)fsöç·ŕ­ňý3¤€>Ĺ\ÍÚţő#Ŕľ6€Ŕ‡‰™é_Ŕ¨f đ)¦[fű÷Ç0î_ŔĆřóüŁš«őŻi ř‡řł´•»Žű×ţřsě"7ŐżßŔG ŕd˙ě.Ń~pą›  űÄGÚż«Ů%ş[;ů›nŮĹîë2ěźůPČoŕS̰-ŕϰ.€ôŔgŽYÝSq˙lé€1@í©nűÇÍţřóT-Ŕ»K´ ýđ1F€>€?n—h‹˘řG€ŞkŢU©ţ<|‚Ůšü™ľřńŔË,Đmyń〗™ &€>ŰÂ:@ŕł=ÜđĹŹ^f:p*xń〗!pŠE‹(P, X@± €bĹÔáTO]wdݵŕśf¸ĘęPŔ%ÔńÉc@Öf¨í©;§ýY{Ú„źh1ä(]Öţ«Üé>‡ţ˘ô[ú _ŘGox˝ÁF¨~ě €Ź°-€Mř »án0a5ź_ذŔgš`ż¸?;Ř Ú9âŁpŠE‹(P, X@±ú†caÍîŮŇ_…c řś5ř(0ä-,ëčë´ä@î&ő |&dE" #ŃFá'á¦>űŰ@c>€M:$€>Íř€¨ăE`F€>ŇL›‡‹Ŕt@î’ˇÓí îżQŮ Ŕ‡`8đ_Ř ö…9$*€ŚńQ8Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(P, X@± €b@Ĺ"€ŠE‹(–Ş PJ@ˇ(P¬6€‡†Źµ~÷3=ąáµźIL˛¸I*Y9ţ–™_©úÜ´ ŕîgřˇ”ť°b’NR‰ţ˘ ?Â×°|÷X&@­Oţ‡T§žç˝őŕöÍ=ý“\|QÝĹ*˝öUĄ×^áç'~\;1#y.áy<é7ĚĽ‘ďŽ{Sź¤śWLň˙üg믓Ü˙^ť¤đˣ̨MňO~ŇŞ~kèîѢţ`Éß–čCśŕÄŁ5@÷62gÂUÍ8~¨}çŢÇý«\˙´VI˙Ú‹í•ýz˝­ßzsýŽxąüUvĆÇĎĺĽ'ŕäKul’Ö˙üż¬űOIî~/ĚORřĺiG€’őË>€×ZůóăÚő¦~íiDÝ®ţ’űwOđ!Ž8âÓĽto˘KŔzâŮ™żÇoQŁ‹›öé¶oH÷ŻjÚąaßí×öëĂ­×vgן\ŰŰŐńŐU;ôűj˙$|AýŘB»_1IŞżUrîŕ$g^ŞC“tţą»X"€ŰŢ «&)üň0L˙%Ą“żkÚ‘’‰ź­ŕŕ•T·[_Ŕ6|w{Cцş»iÓ÷­Ôﮀ[8Ŕ¶7_@µZ+óK5śVşŰ­-Ÿńźý=Ś?¨rżę«şµ—ŢŞç7_í$Í4L˙î÷řúŤ]AÝ|í `t«0§fŻ˙†uŻĽÖéoJ&«†?źd{Ç˙íżţĺ_ŰÓ˙ő_˙ĺĆżÁ’°ź¤}©Ňw˘šĽĹCsük´‰tă”Ăpü^P;bµáĺY˙HĂ0ˇ ^ofCŽů¦ž`]wCŔÁ˘G@›=;.ĆTömůmř»űUŞşŻăß'wÉT/—kۿ˥öłB©Űč˝Ó.ß´ş×â´ýk߀f¦|_’‹ŻşťíśščßexAcűWŮţµ%VńO”jóřŐ,đŹş^+łţpˇ&ĘýßťL ż´ţĚťŽŢŇ{ŘÎÖ˙ţ—U˙ëßż˙[÷zÍ>ŘÉG?š¤y©*őŚţÇ?Y˙ńSÓOy꾢u€Ł÷‚RĂ›­z´«_žhŞl4LĆ9¦da·N+÷“řçî»O^o®oîűQíčĎTp¸ÜPő4 …şš^Vá&ý(Ŕß]4Ľ¦/»« éźyNIŰP‡]úĺzłüR+5X‹ÝŤ˙†ËbćÚúzż©&¬0wز+ö*jąţąĺßvT°ýĆp1€~›ą_ý´#ďűâoŇ–ĆKYăŞřÄO{q’UWŔĐżăĽŮż‡ă—J(€˙G·đŻSÓÚŔ‰÷Bí#\|y˘©®  NW+V¶sŞÚs¦s]ë?ů ŕµíßÍĐý~Ťč–‡3V]}ČÚßÂĘĐäO %˘I¸ ąh.€ßÝ”ľÍ]Ƭüv‘>Ąaée"€ľiŰ+ÝÜťëxůĘ.ű¶Ë\*ÝŠ×\\ţLŁřص=·öoü¶hQ/źŔ4€Q˙Ú;—ŰIDAT+E“1GŔůj˙k‡äóüóŰđÖöďçâ ţ·łS ćčĘö Dw^ť¤|ýLŽď3]¨MŇb ř7ßżô…VaJŃjŤîtv8|©ÂóUU2™ĺ!çş`x¦ŞJ¦=5đŽG€Ă÷BŔh éÓžX9°úĺńłLőîgd5ńň¸`Ľ+ź ăĽtÜŹ“ë|ĆđÚ>úv¤úťĺĆě–Ýpż±¤ýĽţ\í¬ő4ý»Źľë'~_ŻŔöĎwş9:Göż—ý+nźá8€×[üÔÂĐ?­~úÇwď <Ş{Ó-Ű1ŕ%\Ü.D77;*IXůƬM˙ôŐőŻŠR×ÔmĎÚšG˝@łteú§şńcŔţ×˙Q˙ć~Ăô8€q_+˙Bú»MF«IZşĄŕţ»8)ţ¦ŃĂT§›:~©ÂóŤ&śÜÁň÷;Ŕüďd+° _UrńCťť—ă÷BWăą7 Ó“|řňÄQMÜe2I7Ś/NG€ń¸Ż=Źú>lx˝Uv¨ćč–»ęôë·Ě¤[ hčw™ ŕÔ˱:€nňíŻÎ˝]đŽ†”a,賢Ńá8€íË†Ď ÄMI'l¦ Ř^ÔŤőź?a=`mn}«őÍ~w»vwŚ…ýÜ7+şáf@3ýŻfĐżQÍĎ\˙şo*ŐýI˛”ÖijóĂÂoXúzEôĂířwv.€kG¦€~FGł|ü ‡§S“˝T“iI":ąŮ%ÚTó˙ýjýwWľz6€S÷13ôťx/¨dBižŁ·óđnxyâ©2=Ŕá¸-^Ç7^óŐîÓF€7;¬MݧZ&h—í|»Ĺô/X`5Ŕ*ĽbýËÜżvńoWčB•Ů^Ö<ş‹Â˙ŐăV÷Ë}jh»jE‹Ŕ~űo»x ˘í?ćÂË·-`Ŕ~5 Rv‘çÖţMˇ˘GxčçľrűúŤF€úŢ6ĐŚ—xiGݶíËaFŐbÇżýŃ„“ß0»)ö7L ˝¦7ÇÇüŰßľ˙]Eś `˙·×ĚÂkĽ`5x©pů‰Wę—yź˙ÓdĂŠŢĽýCś›äÄ{ˇŤ’)¨©ż&'ąâ剭NtóĐl‰Z÷a#@u­Í0,›97°ę–Í*g3ęó3óçmą÷ŰW.§ďŻl˙Ü“¦AVđÚ0Ů ŇŻýŻ´Ď_Ĺtű?wWţVŃĹf<\›ÍÉu€áK@űŽë&·®±ŹˇNű7ŕÝőŻťżp©ńoŘ˝˙¨_Ë®â×j"€Ó}Ťjĺúp&€ŐÄéB“—ę© (ÉÍNĽ˘¦SPé\ŕĂ—'`4‰á;`y8^hÎÇü° ýŰĘo6Ěß1v¸m7¸kW »Đ-ôúWË~cÁ*łäŰ«‡ ©čjôJ%‹Ŕć•·KŔţďÔ]ěö€iërOhÖćMŽÝŹă1 űü‡şët3°Ýç˙jńmĽĚe¸ŚYĆUý Őt?Ŕ*Ůí`şřŇđǬlÍŇqV°ßŃĚmeśü ›MÜ›á$«żý‹é_U…¦Żx”…ń„ç8|©˘2~|óĎ}}ŐÔ“] ŕÄ{ˇű:~tăą09ÉU/OŔ™wŔÖ _řˇ#Ŕ–݇­Ŕ~ű?öî×őzőtcÁ«vŃÓý ű 7‚Ät߆K&X©‹˙(HÔż*ţhx˙ úţ)łÄÚ°űü‡J7WvĎó~ż^“ý`¦Ů)÷ýKŹüßL­ °şŚ6ŽX…ë$“‹Ű|ÔŕŢďeŃýrDż“ŞJ¦Űúá'–˙5~­ţÖ?5ľé`ĂV˙ôÓęą`2™QP’&ĆëŤűĎ˙ýoŐ˙řuşLňԪ䡎§oľ˘÷}4…ôi‡ŮşýĺńłLőîgdU%]5 Ű~“µź8¬LÍBnżŕ}ŔöÇum–Ż.€Ę–P)żJĐĺď[Űţ= `ú×Vü“…Şđ{<ŞĂÜ3ś `{ën7čxP–ěâí§ö˙sě/îüw˛g¤ý̧şÚ˝°ů k"ďŐhWľz4PĘä‡MµÖîĺÉźŽ/_÷FXžä˙ü↓˙»6[˙*1Émď…U“\őň¬ş§U#Ŕn{Čpmŕ`éŘ˙ź{ÝŠŠţ“ ÷䏻B÷»®ÜŢľ¬&eÝ~06{÷ąţ…ż¨†[ŔÁ0fo+łţď>\iď§žŚ/«n”ćď°îk××T˛\ŰtË:öýţđ]ß4Í˝ŰËs!˝¶Ýáhq śěŽ3ůR™ä/űÝ?×˙ôĎă ;'ąí˝°j’«^ž-ôŤëMŤëÖ˙ÉOr0uí—đüF}ŹŘ+ˇ[§;Ś˝ć`ŰŚ¨«ÉmŔ3âkúÝ «ŮwŮ=zĎ?¦ÔŇ/ňř˘×0&0I9Ďśä_˙ÓůŹŁIŤF€›Ţ «&ůđĺYýŘ9Śłp8¬án0U Adie
FOX Calculator [Remove Frame]

Screenshots

    foxcalc

Where to get it?

    FOX Calculator can be downloaded from the download page either as a Linux or as Win32 Binary (both statically linked with FOX). The source code for FOX Calculator can be found in the FOX distribution. FOX Calculator is GPL Licensed.

Introduction

    FOX Calculator can be downloaded from the download page either as a Linux or as Win32 Binary (both statically linked with FOX). The source code for FOX Calculator can be found in the FOX distribution. FOX Calculator is GPL Licensed. The FOX Calculator is a simple desktop calculator geared toward the programmer. It supports not only a full complement scientific functions, but also common operations that programmers need, such as bitwise operations, bitwise shifting, and base-2 logarithm and exponents, and numeric conversion between hexadecimal, octal, binary, and decimal. The FOX Calculator implements correct operator precedences, so expressions like 2+3*5 yield the correct result, which is 17, and not 25. Also featured is a constant memory, which permanently stores its value even if you exit the calculator and restart it later.

Configuration

    Pressing on the calculator icon brings up the Calculator Preferences dialog. The Calculator Preferences dialog comprises three settings:

    • Settings for the calculator itself
    • Color settings of the button groups
    • Information about the calculator

    In the Calculator settings panel, you can change font used for the display, by pressing the "Set..." button to bring up the standard Font Selection Dialog. You can change the way numbers are printed as well. Checking "Always show exponent" will cause the calculator display always to display the number in exponential notation. Checking "Never show exponent" will cause the calculator to render the number in simple dot notation. The precision can be set by means of the spin button; the default precision is set to 16. Finally, the calculator can be set to beep when errors occur.

    In the Color settings panel, you can change the colors of the various button groups. The buttons are grouped by function; the numbers are in one group, and the operators are in another, and so on.

    In the About panel, some information is presented about the calculator, like version number and author's contact.

Entering Numbers

    You can enter a number by clicking on the digit buttons, or simply hit the right digit on the keyboard. Numbers in exponential notation are entered by entering the mantissa first, then hitting the "EXP" button, and then entering the exponent. Up to 3 digits may be entered for the exponent; entering more than 3 will cause the digits to shift, i.e. the first digit entered will be dropped and replaced by the second, the second digit will be replaced by the third, and the third will be replaced by the new input. Changing the sign of the exponent is accomplished by hittin the "+/-" button. At any time, you can hit the Backspace key to delete the last digit entered. Two numbers, pi and e (euler's number) may be entered with a single button:

    • pi Enters the number 3.1415926535897932384626433833
    • e Enters the number 2.7182818284590452353602874713 (hit the "inv" button first)

Operators

    The operators in the FOX Calculator are the usual suspects:

    • + Addition
    • - Substraction
    • * Multiplication
    • / Floating point division

    In addition, FOX Calculator also includes bitwise operators, such as:

    • AND Bit-wise logical and
    • OR Bit-wise logical or
    • XOR Bit-wise logical exclusive or
    • NOT Bit-wise logical not
    • SHL Bit-wise shift left
    • SHR Bit-wise shift right
    • SAR Bit-wise signed shift right (hit the "inv" button first)

    Also nice for programmers is the inclusion of integer operations:

    • mod Integer modulo
    • div Integer division (hit the "inv" button first)

    All the operators have certain precedence relations with each other, so that an expression is evaluated correctly.

Trigonometric Functions

    The Calculator incorporates the usual trigonometric functions:

    • sin Sine
    • cos Cosine
    • tan Tangent
    • asin Inverse sine or arc sine (hit the "inv" button first)
    • acos Inverse cosine
    • atan Inverse tangent
    • sinh Hyperbolic sine (hit the "hyp" button first)
    • cosh Hyperbolic cosine
    • tanh Hyperbolic tangent
    • asinh Inverse hyperbolic sine (hit the "hyp" and "inv"buttons first)
    • acosh Inverse hyperbolic cosine
    • atanh Inverse hyperbolic tangent
    For the first 6 functions, the angle mode determines whether the argument is specified in terms of degrees, radians, or grad. Note that the angle mode is preserved across invocations of the Calculator.

Other Functions

    Other functions supported by the calculator are the following:

    • log Base 10 logarithm
    • ln Natural logarithm
    • 2log Base 2 logarithm
    • x! Factorial
    • nPr Permutations
    • nCr Combinations
    • sqrt Square root
    • x^y X raised to the power y
    • 1/x Reciprocal
    • 10^x Base 10 exponentiation (hit the "inv" button first)
    • e^x Exponentiation
    • 2^x Base 2 exponentiation
    • x^1/y X raised to the power 1/y
    • x^2 X squared

Limits

    The calculator works in IEEE 746 double precision mode; for bit-wise operations, it uses 32 bit integers. Thus, the numeric limits are as follows:

    • Smallest real number: 2.2250738585072010e-308
    • Largest real number: 1.7976931348623158e+308
    • Smallest integer number: 0
    • Largest integer number: 4294967295

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/clipboard.html000066400000000000000000000347101326741342000162340ustar00rootroot00000000000000 Documentation: Clipboard and Primary Selection
Documentation: Clipboard and Primary Selection [Remove Frame]

    FOX supports three different ways of moving or copying data between applications:

    • Drag and drop. Drag and drop is used when you grab some object on the screen and drag it to another location, and then drop it there. It is the most visually intuitive way to move information from one place to another. The drag and drop mechanism is described in the section on drag and drop.
    • Clipboard. The clipboard is used by typically selecting some object or text and copying it to the clipboard using Ctrl-C, or cutting it to the clipboard using Ctrl-X. Next you can move to another application and pasted the object or text into it by using Ctrl-V.
      Conceptually, the clipboard is a memory region which holds on to a copy of the object or text that was copied or cut. This memory region will continue to exist until it is replaced by another clipboard copy or cut operation, either in the same application or in another application; there is conceptually only one single memory region serving all applications on the desktop.
    • Primary Selection. The primary selection is silently established by selecting some text in a text field. It can be pasted into another text field simply by using the middle mouse button. Unlike the clipboard, there is no memory region to remember the primary selection other than the selection on the screen itself. Thus, changing the selection immediately overwrites the old one.
      Analoguous to the clipboard, there is only one primary selection active among all applications on the desktop; selecting text in another application will deselect the text in the current one.

    All three methods can exchange essentially arbitrary amounts of data, or arbitrary types. Exchanges may take place between different controls in the same application, or different controls in different applications. Under X-Windows, the different applications may even be running on different machines of different types.

    Whether using the clipboard, drag and drop, or primary selection, applications must first agree on the types of data being exchanged. A single piece of data, for example, an image, may be exchanged using different representations. For an image, for instance, the transfer may take place as GIF or BMP formats.

    To increase the odds that both the originating application and the receiving one support the same data representations, the originating application can furnish its list of supported representations for the data. The receiving application, after inspecting this list, can then ask for the one format of the supplied list it also supports.

Registering Clipboard Types

    In order to communicate a particular data structure across applications, both partners need to first register a Drag Type. Registering a drag type yields a unique number which is guaranteed to be the same for all applications on the desktop.
    The Drag Type is created by calling the function:

    FXDragType FXApp::registerDragType(const FXString& name) const;
    

    The registerDragType() function registers a new Drag Type name on the application's desktop, and returns an abstract handle to the Drag Type. The returned handle is used in all subsequent clipboard, drag and drop, or primary selection operations to signify the data type being exchanged.

    Chosing one of the standard MIME types. for commonly available data streams will ensure that data can be exchanged between FOX programs and programs written using other toolkits.

    The function:

    FXString FXApp::getDragTypeName(FXDragType type) const;
    

    will return the Drag Type Name, given the Drag Type type. You may need to use this in case your application receives a drop of an unknown type, and you need to decide what to do with it.

Clipboard Exchange

    The clipboard is a single facility on the desktop which can be interrogated about the types of objects currently retained, and the contents of these objects.
    The clipboard is said to be owned by a window, meaning that whenever such a query must be asnwered, that particular window is the one which will be asked.
    The advantage of this model is that it permits an easy-going decentralized scheme where 3rd-party widgets can implement any number of clipboard data types without any need for central coordination.
    Moreover, the originator can furnish a large number of potential formats for the clipboard selection, yet will only be called upon to actually supply one of these formats during the transaction.

    Upon performing a Cut or Copy to clipboard operation, the originating widget will claim ownership of the clipboard by calling:

    FXbool FXWindow::acquireClipboard(const FXDragType *types,FXuint numtypes);
    

    where types is a list of Drag Types previously registered (see above), and numtypes is the number of such types.

    When one widget acquires the clipboard, the previous widget which owned the clipboard will receive a message of type SEL_CLIPBOARD_LOST, which should cause that widget to release all data previously retained regarding the clipboard operation.

    If the caller has successfully invoked acquireClipboard(), it can allocate storage to remember the clipboard selection in. As it may be requested to furnish the selection in any of the previously stated data types, it may have to remember multiple representations of the clipboard selection.

    The widget calling acquireClipboard() will receive a message of type SEL_CLIPBOARD_GAINED.

    To voluntarily release the clipboard, a widget may call:

    virtual void FXWindow::releaseClipboard();
    

    This will cause the calling widget to receive a message of type SEL_CLIPBOARD_LOST, just as if some other widget had called acquireClipboard().

    The proper response to receiving a SEL_CLIPBOARD_LOST message is to release the clipboard selection data:

    long MyWidget::onClipboardLost(FXObject* sender,FXSelector sel,void* ptr){
      BaseClassOfMyWidget::onClipboardLost(sender,sel,ptr);
      ...
      free the data
      ...
      return 1;
      }
    

    A widget which wants to obtain the clipboard selection can ask for the entire list of clipboard types by calling:

    FXbool inquireDNDTypes(FXDNDOrigin origin,FXDragType*& types,FXuint& numtypes) const;
    

    Where the parameter origin should be set to FROM_CLIPBOARD. The result will be placed in an array of Drag Types types of length numtypes.

    Often, the requesting widget can deal with only one single type of data; for such cases, its more convenient to be able to ask if one particular Drag Type is supported by the originator:

    FXbool offeredDNDType(FXDNDOrigin origin,FXDragType type) const;
    

    Where again, origin must be set to FROM_CLIPBOARD, and type is the type which we want to know about.

    In even simpler scenarios, the requesting widget may simply ask for the clipboard data of a certain datatype. This is appropriate if there is no special action needed in preparation to receiving the data.

    A widget can obtain the data using:

    FXbool getDNDData(FXDNDOrigin origin,FXDragType type,FXuchar*& data,FXuint& size) const;
    

    Once more, origin is set to FROM_CLIPBOARD. The requested type is given in type. Upon successful return, data will refer to a byte array containing the clipboard selection data, and size will contain the length of this data array. If the originating widget is unable to furnish the requested data type, getDNDData() returns FALSE and the data and size will be set to NULL and 0, respectively.

    The requesting widget is now resposible for deleting the memory, which must be done using FXFREE().

    When a widget requests data using getDNDData(), a message of type SEL_CLIPBOARD_REQUEST is issued to the widget owning the clipboard. The originating widget must call:

    FXbool setDNDData(FXDNDOrigin origin,FXDragType type,FXuchar* data,FXuint size) const;
    

    With origin set to FROM_CLIPBOARD, type to the requested data type. The originating widget must allocate (using FXMALLOC) and fill a data array with the clipboard selection and pass a reference to data, and the size of the array in size.

    After handing the array to setDNDData(), the originating widget no longer owns the data array and should make NO attempts to free it!

    To figure out which datatype was requested by the requesting widget, the originating widget can inspect the target member of the FXEvent structure passed in the SEL_CLIPBOARD_REQUEST message pointer.

    A typical widget implementation first lets its base class inspect the Drag Type, and if it was not handled yet, inspects it itself:

    long MyWidget::onClipboardRequest(FXObject* sender,FXSelector sel,void* ptr){
    
      // See if base class knows how to deal with the requested clipboard type
      if(BaseClassOfMyWidget::onClipboardRequest(sender,sel,ptr)) return 1;
    
      // See if we can deal with this type ourselves
      if(((FXEvent*)ptr)->target==mydataType){
        FXuchar *data;
        FXuint len;
        ...
        FXMALLOC(&data,FXuchar,len);
        ...
        fill data
        ...
    
        // Give the array to the system!
        setDNDData(FROM_CLIPBOARD,event->target,data,len);
    
        // Return 1 because it was handled here
        return 1;
        }
    
      // Return 0 to signify we haven't dealt with it yet; a derived
      // class from MyWidget may yet give it another try ...
      return 0;
      }
    

    Thus, MyWidget itself can also be subclassed so as to add even more data types!

Clipboard Originator

    The originator's responsibilities during a clipboard transaction are as follows:

  • Register the desired clipboard data types; in most widgets, this is done once only in the widget's create() routine. Usually, all widgets of the same type support the same set of clipboard types so it is appropriate to remember the clipboard type in a static member variable.
  • When performing a Cut or Copy to clipboard operation, call acquireClipboard(), and if successfully obtaining the clipboard, allocate the necessary memory for keeping a copy of the clipboard selection data.
  • Alternatively, allocate the memory and remember the clipboard selection when the SEL_CLIPBOARD_GAINED is received.
  • Sit there and wait for a SEL_CLIPBOARD_REQUEST message. If a request is received, try handle the request in the base class, and if still not handled, try handle it in the widget.
    Return 1 only if it was handled.
  • If a SEL_CLIPBOARD_LOST is received, release the memory used to keep the clipboard selection and forget anything has happened.
  • Typically, just in case the widget still owns the clipboard when it is destroyed, release the memory for the clipboard selection in the destructor also.

Clipboard Requestor

    The requestor's responsibilities in a clipboard transaction are as follows:

  • Upon performing a Paste command, determine the type of data using inquireDNDTypes() or offeredDNDType(). Then ask for the data using getDNDData(), passing in the requested data type, which is typically one of the data types furnished by the originator.
  • If getDNDData() returned successfully, insert the data into the widget, and release the data array obtained from getDNDData().

Primary Selection Exchange

    The primary selection data exchange mechanism is pretty much the same as that for the clipboard.
    The key difference is that typically, no copy is made of the selection. As soon as some text is selected, the originating window acquires the primary selection. If the selected text is changed, the widget typically releases and reacquires the primary selection.

    Also, upon receiving a SEL_SELECTION_LOST, typically all that happens is that the text is deselected, instead of deleted.

    When exchanging via primary selection, the origin parameter is normally set to FROM_SELECTION.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/consulting.html000066400000000000000000000124721326741342000164630ustar00rootroot00000000000000 Consulting
Consulting Services [Remove Frame]

    I now offer consulting services in various areas of technical computing, with an emphasis on user interfacing, computer graphics, data visualization, programming language parsing, and geometric and numerical algorithms development.

FOX User Interface Development

FOX is a multi-platform toolkit for graphical user interfaces to applications. By using FOX for the user interface of your application, your application can, in most cases, be ported across several platforms by a simple recompile.

Since FOX uses C++ for its implementation, it can be interfaced easily to existing libraries and applications written in C++, C, and FORTRAN as well as many other programming languages.

Therefore large, existing software packages may be given a modern user interface without performing a complete code rewrite. Moreover, through the FOX toolkit, such applications are then simultaneously available on Microsoft Windows as well as Linux and other UNIX systems, such as workstations from HP, SGI, SUN, or IBM.

The FOX toolkit library is freely available, without fees or royalties, subject to the Lesser GPL License. However, in the course of incorporating the library into your application, you may find that you need various additional capabilities unique to your particular application, such as:

  • Custom, one-of-a-kind widgets which set your FOX application apart.

  • Building specialized extensions to FOX toolkit or interfacing FOX toolkit with other software packages.

  • Adding new features to the FOX library itself.

  • Porting applications to new platforms.

  • Aiding in porting applications to the FOX Toolkit.

Technical and Engineering Software

Many Engineering Software companies have chosen to adopt FOX because it works on big 64-bit workstations. Software for these machines was historically developed using the Motif user interface. FOX has turned out to be a great replacement for Motif: while using many of the same concepts of layout managers, it is much more succinct and offers a larger, and more easily expandable, set of controls.

As a former Motif programmer myself, I estimate that it takes between one tenth to one twentieth the amount of code to construct user interfaces in FOX as compared to Motif.

Moreover, FOX offers finer control over layout placements and makes embedding icons in the user interface much simpler. Of course, it works on Windows, too...

A key feature in most Engineering Software is the ability to perform OpenGL drawing. FOX offers a number of easy to use Widgets for this, allowing designers to draw geometry on the screen without having to learn about OpenGL camera and lighting models.

As an example, look at the CFD (Computational Fluid Dynamics) and FEM (Finite Element Method) visualization and analysis code which was developed by CFD Research Corp. using the FOX Library. The image shows particle traces through a multi-zone, unstructured grid of an air flow problem around our favorite mascot.

I have been active in computer graphics and scientific data visualization software for many years, working on all aspects, ranging from writing special-purpose mini-programming languages to development of geometric and numerical algorithms.

Contact Information


Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/datatarget.html000066400000000000000000000245131326741342000164150ustar00rootroot00000000000000 Documentation: DataTargets
Documentation: DataTargets [Remove Frame]

    A common application of GUI development is the collection of inputs from the user in the form of booleans, numbers and strings of text.  This usually involves building a dialog panel with a collection of controls such as text fields, sliders, and other input controls.  The GUI developer then would write callback handler functions so as to be notified when any of these controls changes value.  Often, the developer is forced to fill up these controls to reflect the initial suggested values.

    This process is common enough that we have found that it makes sense to support it with a much more declarative programming style:-  instead of writing many callback routines, and routines to preset the GUI controls with their initial value, we have implemented a more easy to use method in the form of the FOX FXDataTarget class.

    The FXDataTarget acts as an intermediary between a program variable, such as an integer or string, and a FOX widget such as a FXTextField or FXSlider.   The FXDataTarget works by associating a variable in the application code with one or more control widgets in the GUI.  Several controls may be connected to the same data target, although each data target is associated with only one variable at a time.

    A FXDataTarget forms a bi-directional channel through which a GUI control can communicate with a variable in an application program.  Thus, once the GUI is created and connected via the FXDataTarget, the GUI controls will automatically display the current value of that variable, and when the user starts interacting with a control, the variable will be automatically changed.  Moreover, if several GUI controls are connected to one single FXDataTarget, each of these controls will automatically update when the variable has been changed.

Example Usage

    Suppose you are writing a program to enter personnel data by means of a dialog.  One or the first things you may want to do is to design a data structure which is to hold this information:

    // Employee record
    struct Employee {
      FXString name;
      FXint    number;
      FXdouble salary;
      FXString address;
      };
    

    Lets make a dialog box which obtains this information from the user, and of course we'll use the FXDataTargets to eliminate as much coding as possible; first comes the header file (we'll omit some details in the interest of brevity):

    /* EmployeeEntry.h */
    
    // Employee Information Entry Dialog
    class EmployeeEntry : public FXDialogBox {
      FXDECLARE(EmployeeEntry)
    public:
      Employee record;   // Record we'll be modifying
    private:
      FXDataTarget nameTarget;
      FXDataTarget numberTarget;
      FXDataTarget salaryTarget;
      FXDataTarget addressTarget;
    public:
      EmployeeEntry(FXWindow* owner);
      };
    
    

    Well, that's basically it.  Now for the implementation file:

    /* EmployeeEntry.cpp */
    #include "EmployeeEntry.h"
    
    FXIMPLEMENT(EmployeeEntry,FXDialogBox,NULL,0)
    
    EmployeeEntry::EmployeeEntry(FXWindow* owner):
      FXDialogBox(owner,"Enter Employee Information"),
      nameTarget(record.name),
      numberTarget(record.number),
      salaryTarget(record.salary),
      addressTarget(record.address){
    
      ...
      new FXTextField(frame,5,&nameTarget,FXDataTarget::ID_VALUE,...);
      new FXSpinner(frame,5,&numberTarget_target,FXDataTarget::ID_VALUE,...);
      new FXTextField(frame,5,&addressTarget,FXDataTarget::ID_VALUE,...);
      new FXSlider(frame,&salaryTarget,FXDataTarget::ID_VALUE,...);
      new FXTextField(frame,5,&salaryTarget,FXDataTarget::ID_VALUE,...);
      ...
      new FXButton(frame,"Cancal",NULL,this,FXDialogBox::ID_CANCEL,...);
      new FXButton(frame,"Accept",NULL,this,FXDialogBox::ID_ACCEPT,...);
      }
    
    

    We have of course omitted some details here regarding the layout and other  visual  paraphernalia.  Note that we have connected the data target controlling the salary member to both a text field as well as a slider, so we can set the salary either way.  So far, it sounds rediculously simple, doesn't it? The secret is, it really is! Next, we're getting ready to use this new panel.  Here's how we would do that.  Lets say we have selected the employee from a big array of employee records, and we enter the following callback handler to edit one of the entries in this array:

    /* EmployeeDatabase.cpp */
    #include "EmployeeEntry.h"
    
      ...
    
    Employee *employeedatabase;     // Database of records
    int       currentemployee;      // Current employee number we're going to edit
    int       numberofemployees;    // Total number
    
      ...
    
    long EmployeeDatabase::onCmdChangeInformation(FXObject*,FXSelector,void*){
      EmployeeEntry dialog(mainwindow);
      dialog.record=employeedatabase[currentemployee];    // We will work on the copy
      if(dialog.execute()){
        employeedatabase[currentemployee]=dialog.record;  // We accept the change
        }
      return 1;
      }
    

    In the above code, we copy the employee record from the database, and then pop up the EmployeeEntry dialog by calling its execute() member function. When this dialog shows up, it will initially display the old information from employeedatabase[currentemployee].  After editing it with the dialog, if the user hits the Accept button, execute() will return true and we copy the changed record back into the database; if the user hit the Cancel button, execute() we will simply do nothing and return from the callback. The EmployeeEntry dialog's destructors will automatically clean up the mess.

More Advanced Usage

    The above shows the most basic usage of FXDataTarget.  It uses the ID_VALUE message.  When a FXDataTarget receives this message, it will ask the sender of the message for the desired value, and then place that value into the connected program variable.
    However, the FXDataTarget also understands the ID_OPTION messages.  With these messages, the actual value is encoded in the message ID itself, by adding the value to the message ID.

    For example, to set a program variable to the value 10, we could send the FXDataTarget a message ID_OPTION+10.  With the ID_OPTION messages we can for example connect a FXDataTarget to a number of FXRadioButtons, and set a program variable by clicking on one of several radio buttons:

      enum Color {Red, Green, Blue};
    
      FXint color;
      FXDataTarget colorTarget(color);
      color=Red;
    
      new FXRadioButton(matrix,"Red",option_target,FXDataTarget::ID_OPTION+Red,...);
      new FXRadioButton(matrix,"Green",option_target,FXDataTarget::ID_OPTION+Green,...);
      new FXRadioButton(matrix,"Blue",option_target,FXDataTarget::ID_OPTION+Blue,...);
    

    Here we set the variable color to one of the three values {Red, Green, Blue} by directly connecting the FXDataTarget to three FXRadioButtons.
    When the FXDataTarget receives an ID_OPTION message, it changes the program variable to (message-ID_OPTION).  Using this method, its easy to input yes/no values, lists of choices, and so on, all without having to write explicit callback handlers.

How It Works

    The FXDataTarget idea works because of FOX's built-in GUI Update mechanism.  The GUI Update mechanism is responsible for refreshing the state of each widget in your program, based on the state of your application data structures.  Basically, each widget periodically inquires about its state by sending its target a SEL_UPDATE message.

    When an FXDataTarget receives a message of type SEL_UPDATE, it reads the value of its associated variable and updates the sender of the message by means of another message.  Note that the FXDataTarget does not need to know what type of Widget did the sending.

    There are two ways the FXDataTarget can receive updates: by an ID_VALUE message or an  ID_OPTION message.  The former type is usually generated by a valuator control, such as an FXSlider.  When a message from a valuator control is received, FXDataTarget responds by sending back an ID_SETINTVALUE, ID_SETREALVALUE, or ID_SETSTRINGVALUE message to the sender of the request.

    When a FXDataTarget receives a message of the form (ID_OPTION+i),  it resonds by sending back one of two messages: ID_CHECK or ID_UNCHECK, depending on whether the value of the associated variable is equal to i.

    In the example above, the "Red" radio button will receive an ID_CHECK message, because the initial value of the variable color is red.  The other radio buttons will receive the ID_UNCHECK message.

    All of these methods explained here are deployed in the datatarget example program.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/doc.html000066400000000000000000000166611326741342000150470ustar00rootroot00000000000000 Home
Documentation [Remove Frame]

Foreword What FOX is, why it was written, and what are its main features.
Introduction A quick introduction to programming with FOX, and an overview of the concepts used in FOX development.
Targets and Messages How FOX notifies applications about the users actions, mouse clicks and state changes through messages sent to a target.
Updating Control State FOX automatically updates the application's controls through the use of messages send during the GUI Update Phase. This section explains how to use this feature.
Timers, Chores, Signals, and Inputs Timer, Chore, and Signal messages allow FOX applications to react to other events which are not generated by the end user. Internet sockets, pipes, and other synchronization objects can be watched by means of the Input callback messages, and provide ways for FOX programs to receive inputs from a variety of sources.
The FXApp Class The application object is responsible for managing windows, events, and other common facilities.
The FXWindow Class The basic FXWindow class, which is the basis of all FOX controls is explained in more detail.
Layout Managers The FOX Layout Managers provide a convenient way of arranging your GUI Widgets without the need for explicit specification of coordinates and dimensions.
Keyboard Focus How the keyboard focus is moved around from one widget to another, and what is the effect of this.
Icons and Images Enrich your applications with icons. With FOX's built-in icon and image classes, this becomes very easy.
Fonts The Font object provides easy and platform-independent methods for speciying fonts.
Data Targets The FOX Data Targets allow you to directly connect variables in your application code to FOX GUI Controls. Using the declarative programming style made possible by the Data Targets, simple tasks such as entry and display of choices, numbers, and strings can be accomplished with a minimum amount of programming.
Help and Tool Tips Status line help and Tooltips are a nice way of allowing users to learn about a program without consulting oracles to devine the meaning of an icon-button.
The FOX Registry The FOX Registry database provides a facility to manage persistent settings for configuration information in your program.
File Manipulations The FXFile namespace comprises a collection of very useful file manipulation functions that are aware of platform specific issues.
Regular Expressions The FXRex class provides powerful regular expression matching functions.
Drag and Drop Drag and drop are part and parcel of any modern GUI driven application. FOX provides a number of convenient hooks to allow you to move data between different Widgets, and even between different applications running on different hosts.
Clipboard and Primary Selection The clipboard and the primary selection provide yet another way of moving data between applications.
Using the OpenGL Viewer FOX provides a convenient way to start with 3D OpenGL programming. The GLCanvas widget provides a basic 3D drawing surface. The GLViewer widget provides a complete camera model and interactive manipulation capability, including 3D picking, dragging, and Tooltips.
Serialization of Objects FOX provides serialization of both data and objects in a machine-independent, portable manner, by means of its built-in Stream classes.
Writing Your Own Widgets FOX is designed to make it easy to build new widgets. As FOX is completely implemented in C++, you can use common C++ derivation to create new Widgets from existing ones.
Class Index (FOX 1.0) Alphabetical list of classes in the FOX 1.0 STABLE version.
Class Index (FOX 1.3) Alphabetical list of classes in the FOX 1.3 version.
Windows Notes This section contains some notes for building FOX applications under Microsoft Windows.
FAQ Frequently Asked Questions List
References References to sources of various papers and articles relevant to FOX.
HTML/XML Resources HTML/XML resources for possible future widgets

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/download.html000066400000000000000000000132061326741342000161010ustar00rootroot00000000000000 Download
Download [Remove Frame]

Access to the FTP Directory

    Some people have problems getting to ftp.fox-toolkit.org via FTP. This is due to FTP's funny way of setting up TWO connections, one for data and one for commands. It is a problem because the data connection comes in at a random (high) port number, and may therefore be blocked by the firewall. You can try "passive" mode FTP (typically "ftp -p") but if that doesn't work your best bet is to just try to access the directory via HTTP.

    Via FTP:  ftp://ftp.fox-toolkit.org/pub.

    Via HTTP: http://www.fox-toolkit.org/ftp.

Downloads

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/doxygen.cfg000066400000000000000000001325171326741342000155510ustar00rootroot00000000000000# Doxyfile 1.3.7 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "FOX C++ GUI TOOLKIT Reference" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.5 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 2 levels of 10 sub-directories under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of source # files, where putting all generated files in the same directory would otherwise # cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, # Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en # (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, # Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = NO # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = YES # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 2 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = YES # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = NO #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../include # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = xincs.h \ fxkeys.h \ fx.h # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = ./filter.pl # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = FX #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = ./ref # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = header.html # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = page.css # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = YES # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 1 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = FXAPI= # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO fox1.6-1.6.57/doc/draganddrop.html000066400000000000000000000643521326741342000165670ustar00rootroot00000000000000 Documentation: FOX Drag and Drop Facilities
Documentation: FOX Drag and Drop Facilities [Remove Frame]

    Drag and Drop refers to the facility in FOX that allows entities to be dragged not just from within one part of an application to another, but also between applications.  The FOX Drag And Drop implementation is based on the  XDND Protocol  developed by John Lindal.
    FOX supports the latest version (XDND 5)  of this protocol.  On Windows, FOX uses a very similar protocol.
    As FOX provides fairly high-level API's to access these features, it is actually fairly easy to instrument your programs with a Drag & Drop facility.

    For better understanding of how this works, it is important to define some terminology first:

    • A Drag Source is a FOX Widget capable of sourcing one or more types of drag and drop data or Drag Types.
    • A Drop Target is a FOX Widget capable of accepting one or more types of Drag Types.
    • A Drag Type is an abstract handle to a type of drag and drop data.
    • A Drag Action determines what happens when a drop takes place; examples of drag actions are copy, move, and link.

    As mentioned before, the Drag Source and the Drop Target may or may not be in the same application.  In fact, their corresponding applications could even be running on different machines.  We assume, of course, that both drag source and drop target are shown on the same display.

Registering Drag Types

    In order to communicate a particular data structure across applications, both partners need to first register a Drag Type.  The Drag Type is created by calling the function:

    FXDragType FXApp::registerDragType(const FXString& name) const;

    The registerDragType() function registers a new Drag Type "name" with the application's display, and returns an abstract handle to the Drag Type.  The returned handle is used in all subsequent Drag and Drop operations.  The Drag Type handle is unique for the display, that is, each application subsequently registering the same drag type name will receive the same handle.  Obviously, the display must have been already opened before calling this function.

    It is strongly suggested that if your application intends to communicate with others, the Drag Type Names you use should be those of the corresponding MIME types.
    This guarantees everybody else's applications can make sense of drag data originating in your application [and vice versa].  Otherwise, Drag Type Names can be any ASCII string sequence.

    A corresponding function:

    FXString FXApp::getDragTypeName(FXDragType type) const;

    Will return the Drag Type Name, given the Drag Type.  You may need to use this in case your application receives a drop of an unknown type, and you need to decide what to do with it.

Becoming A Drop Target

    In order to be able to receive drops, a FOX Widget first needs to make itself a Drop Target.  It does this by calling:

    virtual void FXWindow::dropEnable();

    To cancel drop-ability, use a function:

    virtual void FXWindow::dropDisable();

    A Widget will not receive drag and drop messages unless it has been enabled as a drop target with dropEnable(). Note that the Widget may receive drag and drop messages with drop-data it does not understand, and thus it should only accept drops of the proper type.

Messages to the Drop Target

    FOX Widgets which have have been enabled for Drop Targets may receive a number of messages during a drag-and-drop operation.  To give a user feedback about what is going on, I suggest that the Widget somehow change its visual appearance based on receiving these messages.

    For example, a Folder Icon, normally shown in the closed state, may be changed to the opened state to indicate that a drop is pending and will be accepted if performed.  Another method [which is usually performed by the Drag Source Widget, see later], is to change the shape of the cursor to a STOP sign when the drop will NOT be accepted; one could also use a combination of the two methods.

    Drop Target Widgets may receive the following messages:

    • SEL_DND_ENTER.  This message is received when the cursor first enters the Widget.  At this point, the Widget may inspect the Drag Types available, and determine whether or not to accept a drop.  If necessary, the Widget could even tentatively request the Drop Data, and inspect the data itself.  It must be prepared to throw the data away again, however.
    • SEL_DND_LEAVE.  This message is received when the cursor leaves the Widget.  If the Widget did not receive a SEL_DND_DROP before this message, it must release the data, if it has requested it.
    • SEL_DND_DROP.  The Widget receives this message when an actual drop takes place.  Typically, the Widget requests the Drop Data at this point.
    • SEL_DND_MOTION.  This message indicates to the Widget the exact position of the cursor (and thus the Drop Point).  Simple Widgets may not care about this, but more complicated Widgets will probably use the position to determine the exact action to take.  For example, depending on position, the Widget may or may not accept certain Drop Types.

    At any point between receiving SEL_DND_ENTER and SEL_DND_LEAVE /SEL_DND_DROP, the Drop Target may call the following functions to inquire about the type of the data being dragged, the data itself,  and the drag-action being performed.  Based on this information, it can feed back information to the Drag Source to indicate whether or not it will accept the data:

    void FXWindow::acceptDrop(FXDragAction action=DRAG_ACCEPT);

    To accept or reject a drop, the Widget calls acceptDrop() with an argument specifying the Drag Action suggested by the Drop Target.  The Widget can call this any number of times; however, the last value will be the one reported to the Drag Source Widget.  For acceptDrop(), the following values are valid:

    • DRAG_REJECT. This indicates that the Drop Target will NOT accept any type of Drag Action.
    • DRAG_ACCEPT. The Drop Target chooses to accept the drop, no matter what the Drag Action is.  The suggested Drag Action is the same as the one supplied by the Drag Source.
    • DRAG_COPY. The Drop Target accepts the drop, but suggests that the Drag Action be a copy.
    • DRAG_MOVE. The Drop Target accepts the drop and suggests that the Drag Action be a move.
    • DRAG_LINK. The Drop Target accepts the drop and suggests that the Drag Action be a link.

    Other Drag Actions may be supported in the future.  The Drop Target can find out the Drag Action by calling the following function:

    FXDragAction FXWindow::inquireDNDAction() const;

    The Drag Source should change the cursor to reflect the Drag Action in effect; if necessary, the cursor should change to reflect the Drag Action suggested by the Drop Target.

    Normally, a Widget may get many, many SEL_DND_MOTION messages.  In order to cut down on the traffic, a Drop Target Widget may indicate a rectangle and whether or not it wants further updates while the cursor is inside this rectangle by calling:

    void FXWindow::setDragRectangle(FXint x,FXint y,FXint w,FXint h,FXbool wantupdates=TRUE);

    Widgets which do not care where the drop takes place may call setDragRectangle(0,0,width,height,FALSE), which will cause the Drag Source to send no further updates while the cursor is inside the Widget.

    void FXWindow::clearDragRectangle();

    Clearly, this is the opposite of setDragRectangle().  It is equivalent to setDragRectangle(0,0,0,0,TRUE);

    FXbool FXWindow::inquireDNDTypes(FXDNDOrigin origin,const FXDragType*& types,FXuint& numtypes);
    FXbool FXWindow::offeredDNDType(FXDNDOrigin origin,FXDragType type);

    The first call yields an array of Drag Types currently available from the Drag Source.  The list is read-only, and should NOT be freed.  The Widget should NOT keep pointers to this list, as the list ceases to exist after SEL_DND_LEAVE.  The second call tests to see if a certain Drag Type is being offered by the Drag Source.

    If the Drag Type information is not enough, the Drop Target may have to inquire the actual data from the Drag Source and inspect it.  It does this by calling:

    FXbool FXWindow::getDNDData(FXDNDOrigin origin,FXDragType type,FXuchar*& data,FXuint& size);

    This call acquires the Drag Type type from the Drag Source.  Upon return, data points to an array of bytes containing the Drop Data, and size is set to the number of bytes in the array.  The array is now owned by the Drop Target Widget, and should be freed with the FXFREE() macro.  The corresponding function in the Drag Source is describes elsewhere.  The parameter origin should be set to FROM_DRAGNDROP.

Becoming a Drag Source

    Making a Widget a Drag Source is comparatively easy.  The transaction begins when the mouse button goes down.  The Widget will need to call grab() to capture the mouse to the Widget, so that all future mouse events will be reported to the Widget, even if they occur outside of the Widget. Next, the Widget will call:

    FXbool FXWindow::beginDrag(const FXDragType *types,FXuint numtypes);

    to start a drag-operation.  The arguments to beginDrag() describe the list of types [which must have been registered previously] which are being offered.  The Drag Source must be willing to furnish each of these types when requested by the Drop Target.  The beginDrag() function returns FALSE if it failed to initiate a drag operation; the application should not proceed with dragging in this case.

    Upon each mouse movement, the Drag Source needs to indicate the new mouse position to the system; it also notifies the Drop Target of the new Drag Action.  It does this by calling the function:

    FXbool FXWindow::handleDrag(FXint x,FXint y,FXDragAction action=DRAG_COPY);

    The handleDrag() function determines the Widget under the cursor, and issues a SEL_DND_ENTER when it first enters a Widget, a SEL_DND_LEAVE when it leaves the Widget, and a SEL_DND_MOTION when the cursor simply has moved over the Widget [subject to the drag rectangle set by the Drop Target].  It will not send any messages if the widget under the cursor has not called dropEnable() first to enable drops on it.

    The handleDrag() function may return FALSE if it fails.  To find out if a Drag Source is in the middle of a drag operation, applications may call the following member function:

    FXbool FXWindow::isDragging() const;

    While the Drag Source is dragging, it may want to inquire whether the Drop Target's accepted or rejected a drop.  It does this by calling:

    FXDragAction FXWindow::didAccept() const;

    The function didAccept() simply returns DRAG_REJECT when the Drop Target would NOT accept the drop, and returns DRAG_COPY, DRAG_MOVE, DRAG_LINK if it did; the Drag Source should reflect the Drag Action returned by changing its cursor. For safety's sake, didAccept() will also returns DRAG_REJECT if the Drop Target has not called dropEnable(), or if the Drop Target fails to respond to any drag-and-drop messages.

    Applications may choose to change the cursor shape based on what didAccept() returned, as illustrated by the following code fragment:

    handleDrag(event->root_x,event->root_y);

    if(didAccept()!=DRAG_REJECT){
    setDragCursor(drop_ok_cursor);
    }
    else{
    setDragCursor(drop_not_ok_cursor);
    }

    The rationale is that even though Drop Targets may give a visual cue when a drop is OK, not all applications running on your system may be drag-and-drop aware;  changing the cursor also will give an additional clue.

    When the user releases the mouse button, the Widget needs to call ungrab() to release the mouse capture, and then calls:

      FXDragAction FXWindow::endDrag(FXbool drop=TRUE);

    This will cause a SEL_DND_DROP message to be sent to the Drop Target, if and only if:

    • The flag drop is TRUE.
    • The Drop Target has previously called acceptDrop().
    • The Drag Source has received status messages back from the Drop Target.

    Passing a flag drop allows the Drag Source to deny a drop even though the Drop Target may have accepted a drop.  The endDrag() function returns the action actually performed by the drop target.
    The XDND version 5 protocol returns the drag action performed by the target, since in processing the drop, the target may be unable to perform the requested action, perhaps due to some runtime error.  Returning the action actually performed allows the drag source to take the appropriate action.

Messages to the Drag Source

    During a drag operation, a drag source may receive one or more requests for the drag data. These requests take the form of a SEL_DND_REQUEST message sent to the owner of the drag data. When a drag source receives a request for its data, it should first inspect the requested drag type, which is found in the FXEvent's target member variable. If the drag source can supply its data in the requested drag type, it should then allocate an array (using the FXMALLOC macro) and stuff the data into it.

    The drag source then calls

      FXbool FXWindow::setDNDData(FXDNDOrigin origin,FXDragType type,FXuchar* data,FXuint size);

    To hand the array over to the system. At this point, ownership of the array passes to the system, and the drag source should not attempt to make any further references to this array. The origin parameter should be set to FROM_DRAGNDROP.

    The drop target may make a request for the drag data from the drag source by calling getDNDData(), described above.

Drag and Drop of FOX Objects

    The data exchange described above takes place using raw bytes.  In more realistic cases,  complicated data structures may have to be exchanges.  It is important to realize that:

    • The Drag Source and Drop Target may be different programs.  Thus, it is usually meaningless to exchange pointers to data structures.
    • The Drop Target and Drag Source may not only be different programs, but also may be programs running on different machines with different byte orders and different word lengths.

    FOX takes care of some of the latter troubles by furnishing special FOX primitive types, such as FXchar, FXshort, FXint and so on.  A FOX implementation will ALWAYS make sure these types have the same size, although byte order may still be reversed on some machines.

    More sophisticated data transfers can be accomplished using the FOX FXMemoryStream class.  The FXMemoryStream is a subclass of FXStream that serializes/deserializes data to/from a memory-buffer.  The FXStream classes also support byte swapping on the reader side, making it very convenient to exchange data between hererogeneous machines; moreover, the FOX Stream classes support serialization of FOX Objects.

    Thus, entire networks of objects may be serialized, transmitted to the drop site, and then deserialized.

    Example:

    Serialize into a buffer, then give the buffer to the DND system:
     

    FXMemoryStream str;
    FXuchar *buffer;
    FXuint size;
    FXObject *myobjectptr;        // Pointer to the FXObject-derived object we wish to transfer
    FXuchar endianness;

    endianness=FXStream::isLittleEndian();

    str.open(NULL,FXStreamSave);                                // The FXMemoryStream will create its own buffer
    str << endianness;
    str << myobjectptr;
    str.takeBuffer(buffer,size);                                // Take ownership of the buffer away from the FXMemoryStream
    str.close();
    setDNDData(dndtype,buffer,size);                            // Give the buffer to the DND system


    Take data from the DND system, then give the buffer to the Stream and deserialize from it:

    FXMemoryStream str;
    FXuchar *buffer;
    FXuint size;
    FXObject *myobjectptr;        // When done, this points to an FXObject-derived object
    FXuchar endianness;

    getDNDData(dndtype,buffer,size);                            // Take possesion of the buffer from the DND system

    str.open(buffer,size,FXStreamLoad);
    str >> endianness;
    str.swapBytes(endianness!=FXStream::isLittleEndian());      // Swap bytes in the receiver if necessary!!
    str >> myobjectptr;
    str.close();
    FXFREE(&buffer);
     

    As you see, this is a mighty fine way to transfer arbitrary objects between applications.  All you have to do is derive certain objects from the FXObject base class, then properly inplement the load() and save() member functions for that class, so that all object member data may be properly serialized or deserialized.  For more info, see the chapter on Serialization.

Tips and Hints: Moving Data Between Applications

    When data is being moved between applications, the Drop Target should perform the following sequence of operations:

    Acquire the dropped data, using getDNDData(), exactly the same as what it would do for a Copy Drag Action;

    Then do a getDNDData() with the Drag Type DELETE, which must have been previously registered with registerDragType("DELETE").

    The Drag Source will not supply any data when a request for the DELETE drag type is received; instead, knowing the data has been properly received by the Drop Target, it will delete the data instead.

    Thus, the getDNDData() call with Drag Type DELETE will yield a NULL data array pointer.

Tips and Hints: When to Copy and When to Move

    This is no hard and fast rule, but generally speaking when data are being dragged within the same window, the default Drag Action should default to DRAG_MOVE, whereas when dragging between windows, the Drag Action should default to DRAG_COPY.  These defaults can be overridden by holding down the Control-Key, which should force a DRAG_COPY, or the Shift-Key, which should force a DRAG_MOVE.  Holding down the Alt-Key should probably force a DRAG_LINK.

Tips and Hints: When to Auto-Scroll

    When dragging from within scrollable windows, no scrolling should take place while outside the window; instead, scrolling should happen only when the cursor is being moved very close to the window border.

Tips and Hints: Let Cursor Reflect the Action

    There are two major schools of thought; some people prefer to let animate or highlight the drop-site to indicate an impending accept or reject of a drop, whereas others change the cursor instead.  Apart from psychology, my take on this is do both:

    • Changing the cursor has the advantage that there is some feedback while moving over inert backgrounds.
    • Changing the drop site has the advantage that it is very clear where the dropped data will wind up, especially if drop sites may be very small on the screen.

    This reflects my view that in the software world, we can make our own rules;  we can diverge from the physical model of ``manipulating rigid objects'' if this is appropriate or gives the user a better handle on things.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/faq.html000066400000000000000000002746621326741342000150600ustar00rootroot00000000000000 Frequently Asked Questions
Frequently Answered Questions [Remove Frame]

Questions

Why does FOX look so much like Windows?

    FOX looks much like Windows in part because of historical reasons, and in part because it is intentional. Having FOX look similar to Windows means the users of a FOX application will be able to bring to bear their prior experience on Windows, and therefore they will be able to be productive much quicker.
    But let there be no mistake about it:- for software developers, FOX looks very differently internally.

Has FOX been ported to the Apple Macintosh?

    Please refer to The fifthplanet Macintosh Wiki. Basically, if you have installed XFree or Apple's own X Server, FOX can be compiled and run on OS-X. Only a few environment variables need to be modified (the usual bunch, see INSTALL for more detailed information).

    A native port running on top of OS-X w/o the need of an X Server is possible. However, the author currently does not own a Macintosh, nor has access too one. Therefore, unless some hardware is donated to the FOX Project for this purpose, chances are small that a software port will happen any time soon, esp. since Apple's own X-Server already solves the problem.

Which Systems are supported by FOX?

    There are two main ports of FOX:- UNIX/X11 and MS-Windows. Specifically, FOX is known to work on the following systems:

    These are the systems we know about. Since FOX uses GNU autoconfigure, chances are good that most UNIX/X11 combinations can be made to work. If you're running FOX under a system not mentioned above, please drop me a line so we can add it to the list.

Is FOX `64-bit clean'?

    With the arrival of 64-bit PC's, this is a pertinent question. The answer is yes. FOX is currently being compiled on several 64-bit architectures, such as HP/Compaq/DEC Alpha, HP-PA, SUN UltraSparc, and SGI MIPS R10000. More recently, porting to Intel Itanium and AMD Opteron has been performed. We have reports from people who have compiled on Windows-XP 64.

    While coding of FOX itself has been prepared for the coming 64-bit era, the same may not be true for your own application code. A few guidelines:

    • Most systems (except Microsoft) follow the ILP32 vs LP64 model, i.e. in 32-bit mode integers, longs, and pointers are 32-bits, and in 64-bit mode longs and pointers become 64-bits while integers stay 32-bit. Microsoft seems to continue with long equal to 32-bit even for 64-bit CPU's.

      If you use the FOX types like FXlong and FXint the sizes are going to be typedef-ed properly according to the LP64 model.

    • On some 64-bit compilers, a double-cast may be needed for casting pointers to an int via long. For this purpose, FOX defines a signed and unsigned integer type whose size is big enough to fit a pointer.

      These types are called FXival and FXuval. Note that FXival and FXuval are defined to be the size of a pointer, and so these are not fixed-size types to be used for streaming!

      For portable code you will need to cast void* to FXint by way of FXival or FXuval, as in:

      intval=(FXint)(FXival)ptr;
      
      Conversely, its a good idea to cast from FXint to void* by way of FXival or FXuval to get predictable zero-extended or sign-extended results:
      ptr=(void*)(FXuval)intval;
      

    • You should use the FXint, FXlong, etc. types when serializing data using FXStream. The types FXint, FXlong, etc. are defined to be a certain size and are the same on all architectures; otherwise binary data will not be compatible between platforms.

    Of course all the usual caveats apply, like using sizeof() instead of hard-coded assumptions about sizes; the best practice of developing portable code is to develop it on a number different platforms from the very beginning.

How do I write portable code?

    FOX is a platform-independent toolkit (currently, it supports many architectures and compilers), but a few caveats still apply if your own code is going to have to be ported.
    A few guidelines which I found useful in my own development practices can make the process very painless:

    • Don't include any platform-dependent libraries (e.g. no "Windows.h" or "X11.h". Just your regular stdio, stdlib and so on (those are C/C++-language standard libraries, and pretty much the same on most machines except for some minor nitty gritty stuff.
    • Of course, you will use FOX, and while your own code isn't platform dependent, FOX itself is. So you *will* have to link your application with various platform-dependent libraries that FOX itself uses.
    • You can safely assume sizes of FXchar, FXshort, FXint, FXlong, FXfloat and FXdouble to be the same on all platforms. However, int, long, etc. are NOT guaranteed to be a certain size. This is important when saving loading binary data files (e.g. using FOX's FXStream class). Also, there is byte-order. This is also platform-dependent. FXStream allows for byte swapping during I/O. The symbol FOX_BIGENDIAN is set 1 on big-endian machines (e.g. SGI, PPC) and 0 for little-endian machines (Intel, Alpha).
    • To be 64-bit future-proof, you *must* use double-cast to- and from pointers. see above. Just to be sure.
    • Try avoid very sophisticated C++ features (this means most of STL). Code that does a lot of STL doesn't port one iota's worth, at best it compiles with thousands of warnings [some people are going to flame me for this, but its true!].
    • Use FOX macros like FXMALLOC(), FXFREE() and so on. They are implemented to behave EXACTLY the same on all systems (even though underlying malloc() and realloc() library functions don't always treat the corner cases properly.
    • Use FXTRACE(()) for debugging; use FXASSERT for asserts. Use fxwarning fxerror() and fxmessage() for messages to the console (on Windows, you don't have a console, and printf() will crash!!). These functions "do the right thing" on the various platforms.
    • Don't try to do your own filename manipulation routines. Use the functions in the FXFile namespace. These functions properly handle drive letters, Windows Uniform Naming Convention, and so on. They also know about forward and backward slashes and such stuff. Use the PATHSEP, ISPATHSEP etc. macros to check for path separation characters.
    • Do not assume characters are signed or unsigned; FXuchar is always unsigned, however, FXchar may be either.
    • When opening a binary file, don't forget fopen("name","rb") instead of fopen("name","r"). On UNIX there is no difference, but on Windows, forgetting the "b" will cause "\r\n" to be translated to "\n", corrupting the data stream.

Why do I get an `illegal icon specified' message when I change some Widget's icon?

    Basically, an Icon [Widget, Image, Font, etc] comprises a part which lives in your program [the client-side], and a part which lives in the X-Server or GDI subsystem [the server-side].

    The C++ CTOR only builds the part in the client side. The server side part of the Icon [Widget, Image, etc] is realized when you call create() on it. For convenience, all reachable resources may be created with a single call to FXApp::create(). The call to FXApp::create() traverses the entire Widget tree and creates all Windows, Icons, and other resources that are needed to realize that Widget tree on the screen.

    The reasons for all this are:

    • Since all FOX classes may be subclassed, it cannot be assumed that after an object's ctor has run that the object has been fully constructed; after all, you may have subclassed it.

    • It will also be important later on when the GUI itself will be subject to serialization. As we can not serialize server-resident resources, we need a two-step process of construction [via deserialization] and creation [from a single call to FXApp::create()].

    Because of this, when you construct an FXIcon later on, then you need to call FXIcon::create() manually, as the icon was not a part of the Widget tree at the time the Widget tree was first realized.

Compiling FOX as a DLL under VC++ gives me a unresolved external symbol?

    If you build a project under VC++ to compile a FOX application, do not forget to specify -DFOXDLL on the compiler command line. Without it, you will get an error like: error LNK2001: unresolved external symbol "public: static struct FXMetaClass const FXApp::metaClass" (?metaClass@FXApp@@2UFXMetaClass@@B). Or words to that effect.

    Of course, you can also build FOX as a static library, in which case there is no problem.

When do I call flush(), forceRefresh(), refresh() and update() after a change?

    Under normal circumstances, the display on the screen is kept up-to-date automatically. However, FOX uses a lazy screen refreshing technique. The lazy technique allows your callback routine to make lots of changes in the GUI, then update the screen in one fell swoop. This obviates the need that some other toolkits have for freeze/thaw API's.

    There are several aspects to this: repainting the screen, i.e. processing expose or repaint events, performing layout computations, and performing GUI updating.

    • Repaint Events are piled up until there are no further events to be processed. In fact, repaint events are not simply saved but are conglomerated into larger and larger rectangles, so as to minimize the number of times that repainting is actually done (it actually also minimizes the area which is repainted).

    • Layout Reconciliation is also delayed. No layout is performed until returning to the event loop, in fact. Like repainting, layout is delayed until no more events are available.

    • GUI Updating is also delayed until there are no more events in the queue.

    The order in which these are performed are repaints, layout, and gui-updates. Contrary to intuition, delaying the expensive operations such as repainting instead of doing them right away is actually faster.

    Sometimes, you want to force the display to refresh without returning from a callback; this can be effected with the following routines:

    • FXApp::flush() will flush all drawing commands to the display. In other words, it will cause all drawing commands to be executed eventually. Note that flush() is moderately expensive as it causes synchronization between the display and the program.

    • FXApp::forceRefresh() will perform a layout reconciliation, followed by a GUI update. Since this may lead to more expose events, you typically follow a call to forceRefresh() with a call to flush(). Note that forceRefresh() is a very expensive operation.

    • FXApp::refresh() is similar to forceRefresh() in that it causes a layout and a GUI update to be performed. The difference is that refresh() will not actually perform the operation but simply cause the system to perform layout/gui-update later, after returning to the event loop. The call to refresh() is very cheap.

    • FXWindow::update() marks the window, or part of the window as dirty. This causes the window to receive an expose event at some point in the future. The rectangles marked with update() as dirty may be conglomerated into a few big rectangles. No repainting is actually performed until returning to the event loop or calling flush(). Since no drawing is performed, a call to update() is fairly cheap.

    • FXWindow::repaint() performs the opposite of update(). It paints the window, or part of the window by issuing SEL_PAINT messages if necessary. It works by first pulls all outstanding expose events from the X server, compositing the dirty rectangles. Then, it processes all dirty rectangles pertaining to the given window; if a rectangle is passed, it only processes the dirty rectangles overlapping with the given rectangle. Note that repaint() should NOT be called while performing a painting operation as it would lead to multiple locks of the device context FXDCWindow.

    • FXApp::repaint(), does the same as FXWindow::repaint(), except FXApp::repaint() causes ALL windows to process their backlogged SEL_PAINT messages.

    • FXWindow::recalc() marks the widget, and all of its parents, as dirty, i.e. in need of layout. Under normal circumstances, layout is only called when the size of a widget has changed; however, there are often other reasons why layout is needed. In such cases, calling recalc() will ultimately cause a layout to happen also. The entire chain from the widget to its top most parent must be marked this way, otherwise (as there may have been no size changes), the layout process will stop. A few widgets will overload recalc() to cause additional layout computations to happen (e.g. computing content size inside a scrolled view of a list).

How does layout work, exactly?

    Automatic layout is a very usuful feature in FOX. It allows automatic placement of widgets in the desired arrangement without explicitly placing each widget in terms of position and size. Thus, changes in widget's contents, font, and language binding can be accomodated with ease.

    But automatic placement takes a bit of getting used to, especially for Windows developers who are not accustomed to the concept (many UNIX GUI systems such as Xt and Motif have similar layout facilities so UNIX programmers tend to be more familiar with the idea).

    Composite widgets may contain one or more child widgets. These child widgets could be simple controls, like Buttons, but also other Composite widgets. Thus, layout is inherently a recursive process.
    Layout of a widget tree is determined by the following:

    • The arrangement pattern. For example, a Matrix layout manager arranges the children in rows and columns; a HorizontalFrame arranges its children side by side, and a Packer arranges them against the sides of the interior.
    • The packing flags. A layout manager has certain flags which apply to the layout of all of its children. For example the flag PACK_UNIFORM_WIDTH causes each child to be made the same width.
    • The layout hints. Each child has certain layout flags which affect the way the layout manager places that child; an example is the LAYOUT_FIX_WIDTH flag which tells the layout manager of that child that the child wants to keep its initially assigned width instead of its minimum (default) width.
      Not all layout hints are observed by the layout manager; certain arrangements interpret certain hints, and ignore others. For instance the Switcher layout manager places all children on top of each other, and makes them all the same size.
    • Other information, such as the interior padding between the edges of the layout manager and its children, spacing between children, and other information like the number of rows and columns in a Matrix layout manager, or which child is on top in a Switcher layout manager, and so on.
    Layout is a recursive process, proceeding from the top down. A layout recalculation is needed under the following circumstances:
    • The widget's size has changed in response to position() or resize().
    • The widget has been marked as dirty by means of recalc().
    • In a few cases, layout() is called directly.
    Because layout involves a lot of calculations, its quite expensive; we therefore try to perform it as infrequently as possible, and to stop the layout recursion as soon as we can. The former is implemented by performing the layout only when there's nothing better to do, during idle time when there are no events demanding our immediate attention. The latter is done by stopping the recursion when we hit a widget that already has the right size and is not marked as dirty.
    This makes layout pretty fast (close to real-time when interactively resizing windows).

    Only a handful of API's are responsible for the whole layout process:

    • getDefaultWidth() and getDefaultHeight(). These API's measure the minimum size of the widget. For simple controls such as Buttons the implementation consists of simply adding up the size of the icon, caption, and surrounding borders.
      For layout managers however, it is more complex:- the size of the layout manager depends on the arrangement, and the size of the children, and needs to take into account the packing flags and layout hints as well.
    • getWidthForHeight() and getHeightForWidth(). These measure the width of a widget in terms of its height, and the height of a widget given its width, respectively. In order for getWidthForHeight() to work, the height has to be known in advance.
      Because of these restrictions, these functions are basically only called from top level windows, as top level windows are given a size directly by the user and therefore the required information is known.
    • position(). This API physcally moves a child's to its new location, and if the child's size was changed or the child was marked as dirty, recursively invokes layout() on the child.
    • layout(). This is the workhorse of the layout system. The typical implementation in a layout manager loops over all the children, applying each child's layout hints and default size as computed by getDefaultWidth() and getDefaultHeight(), and then placing each child accordingly by calling position(). Note that by calling position(), the child's layout() may in turn be called!

When I construct a window at the beginning it works but when I construct it later it doesn't

    When you construct a window before calling FXApp::create(), the window will be created when all windows are created. If however you construct a window later on, then you need to call window->create() yourself.

    Please refer to the section about creating icons for a more detailed explanation.

About numbering Message ID's.

    When deriving classes from FOX Widgets such as FXDialogBox, make sure you're messages are numbered so as to not conflict with those of the base classes. The most simple way is to continue numbering from where the base class left of; I suggest the following C++ trick:
    class MyDialog : public FXDialogBox {
      ...
      enum{
        ID_CLICKED_YES=FXDialogBox::ID_LAST,
        ID_CLICKED_NO,
        ID_CLICKED_OK,
        ID_CLICKED_CANCEL,
        ID_CLICKED_QUIT,
        ID_CLICKED_SAVE,
        ID_LAST
        };
      ...
      };
    

    As you see, the implementor of the base class can insert additional message ID's but the numbering is automatically kept straight by the compiler. Also, if you're own class is being derived from then this derived class can start counting from MyDialog::ID_LAST and not worry about any messages being inserted into MyDialog.

Why Support GIF!

    The compression technique in GIF was patented by UNISYS. In 2003, this patent expires and using GIFs no longer presents a problem; until that time FOX does not support compressed output, only decompression.

    From what I've read, LZW decompression is not subject to the patent [hence ability gzip support for the old ``compressed'' files].

    I feel that there is therefore no need to remove the FOX support for GIF icons/images, and therefore any existing investment should you have in large icon collections would be protected.

    Should you still harbor any qualms about using GIF's in your project, you could of course always use BMP icons. However, GIF icons appear to be typically about half the size of BMP icons.

    Note that the LZW patent will expire soon, and so compressed GIF support will therefore be reinstated.

    Nevertheless, software patents are very bad for software developers, particularly since so many completely trivial ideas seem to slip through the patent system, see The Case Against Software Patents.

Failing to delete menu panes in owner's destructor.

    When you create a MenuPane, the pointer passed in to MenuPane is the owner of that MenuPane, which is typically a MainWindow or DialogBox. This causes the MenuPane to stay on top of the owner window.

    When adding a MenuCommand in a MenuPane, the MenuCommand will obtain the owner of the MenuPane and install its accelerator in the owner's accelerator table. This is necessary, as the accelerator is to be effective without the MenuPane being having been popped up.

    When the MenuCommand is destroyed, it tries to remove this accelerator again by obtaining the MenuPane's owner and removing the accelerator from the owner's accelerator table. Should it be the case that the owner of the MenuPane had already been deleted, an access to a non-existing memory location (segmentation fault) will likely occur.

    Thus, it is necessary for the owner of a MenuPane to be still in existence when the MenuPane itself is destroyed. So when the owner of a MenuPane is destroyed, it must make sure the MenuPane is destroyed before its destructor completes:- otherwise, the MenuPane would refer to a non-existent owner.

    As a general rule, shared resources such as Icons, Fonts, Cursors, Bitmaps, and also MenuPanes, must be explicitly deleted by the widgets that owns them.

How does FXStream serialize an FXObject?

    When you serialize a pointer to an object, like for example:
    
      // Declarations
      FXStream    stream;
      FXDocument *document;
    
      // Serialize
      stream.open(FXStreamSave);
      stream << document;
      stream.close();
    
      // Deserialize
      stream.open(FXStreamLoad);
      stream >> document;
      stream.close();
    
    
    What really happens when you serialize a pointer to an object is the following:

    • stream checks an internal hash table to see if document has been serialized before.
    • if it has been serialized before we just save a reference number into the stream, and we're done.
    • if document was not encountered before, stream saves the classname.
    • then, the document->save(stream) is called to save the object's contents [member data] into the stream.

    When you deserialize an object is:

    • stream loads an item from the stream.
    • if the item represents a reference number, then we must have loaded the document previously; using an internal lookup table, stream maps reference number to the memory address where document was loaded, and returns this address.
    • if the item is a classname, then stream calls FXMetaClass::getMetaClassFromName(classname) to obtain the metaclass, and calls metaclass->makeInstance() to properly manufacture an object.
    • then, stream calls document->load(stream) to pull in the object's contents.

    Sometimes, a special container object is referred by other objects, but should not itself be serialized. In this case, you may want to use the constructor:

      FXStream    stream(container);
    

    instead. This will add the pointer container to the internal table of stream, so that any subsequent encounter of the same pointer value will generate a reference number only.

Why did FOX choose the message-map based callback paradigm

Why does a AUTOGRAY disable, but not enable the Button?

    AUTOGRAY and AUTOHIDE are very useful features when messages are being delegated around, like for example in an Multiple Document Interface [MDI] application. In an MDI application, the target which actually ends up handling the message may be different from one moment to the next. When no target handles the message (e.g. when all FXMDIChild windows have been deleted), an FXButton which is set to BUTTON_AUTOGRAY will be disabled automatically. When there is a target, this target should enable or disable the button as appropriate. The FXButton does not automatically enable itself when there is a target that handles the message, as it is not necessarily the case that the button should be enabled when it does.

I get compiler errors in Visual C++ when inclusing FXArray or FXElement

    FOX uses the placement version of the C++ new operator. Declarations for this operator may be made available to your program by:
      #include < new >
    
    just before including FXArray and FXElement. FXArray and FXElement are not automatically included into fx.h because these files rely on a proper template implementation of your compiler; also, FOX widgets do not need these headers.

My Motif application complains with messages about failing to allocate colors

    This typically happens on PseudoColor systems, i.e. systems which use a colormap or color palette. Even many high end SGI systems run the Motif GUI in PseudoColor mode [these systems support multiple hardware colormaps]. FOX normally allocates about half of the available colormap [125 colors, to be exact]. Under normal circumstances, this leaves plenty of colors for other applications. However, sometimes of course it can happen that other X11 applications require more colors than are available. Fortunately, FOX can be told to use a different number of colors. There are several ways to do this:
    • The simplest way is to specify the maximum number of colors on the command line, with the parameter -maxcolors n. The number n should be between 2 and 256. Setting the parameter causes FOX to allocate no more than the indicated number of colors. FOX will attempt to allocate a block of colors such that nRed x nGreen x nBlue is not larged than n; it will favor slightly more resolution in the green and red than in blue, because the eye is more sensitive to these colors.

    • If you find yourself passing this parameter regularly, you may consider specifying the number of colors using the Registry mechanism instead; this way, FOX applications will automatically pick this up. The most easy way to do this is to load the file $HOME/.foxrc/Desktop into your editor, and adding the following to the [SETTINGS] group:
      [SETTINGS]
      maxcolors = 64
      
      Of course you may specify any number you like.

    • The last method is to specify the maximum number of colors programmatically. In case you're developing e.g. a data-entry application, you may not need many colors and you can simply set the value to a fairly low value, like 27:
      FXVisual *vis = application->getDefaultVisual();
      vis->setMaxColors(27);
      
      Of course you will need to do this prior to a call to application->create().
    On some machines, you may be able to switch the video hardware into a higher color resolution, and if this is possible, it may be by far the best solution.

File fxpngio.cpp does not compile on IRIX 6.5

    FOX uses GNU autoconfigure to determine the whereabouts of various files. It so happens that IRIX 6.5 ships with an older release of the PNG library. You can do two things:
    • Re-run configure as configure --disable-png to disable PNG image file support. FOX will be fully functional, except that PNG image file support is stubbed out.

    • Obtain the PNG library libpng version 1.05 or better, and install this on your machine.
      You can find PNG on: http://www.libpng.org/pub/png/.
    If you choose the latter, you will of course have to make sure the configure script is able to locate the new library; how this is done depends on where it is installed.

Developing FOX Applications under Windows.

    Developing FOX applications under Windows warrants a lot of extra information. You can find this here.

Why are there various flavors of running an event loop?

    FOX applications are event driven applications. All FOX applications therefore spend almost all their time in an event loop, waiting for events [such as keyboard and mouse events] from a user. Depending on the situation, there are several types of event loops possible:

    • FXApp::run(). This is the main event loop and it is entered when you start your program, and does not exit until you call FXApp::exit(), or the application object receives the ID_QUIT message. Typically, after returning from FXApp::run() your program will exit.

    • FXApp::runModalFor(window). You enter this event loop to run a modal dialog. A modal dialog is a dialog which will block any interaction with any other window of the program except for the indicated dialog window, until the modal event loop is exited.
      FXApp::runModalFor() is a recursive invocation of the event loop, and it will not return until FXApp::stopModal(window,code) is called. The return code is passed along and will be returned by FXApp::runModalFor().

    • FXApp::runModalWhileShown(window). This routine is a variant of FXApp::runModalFor() which returns as soon as the window is no longer visible, or until terminated by FXApp::stopModal().

    • FXApp::runUntil(condition). This routine enters a recursive event loop, passing all events normally. The event loop returns as soon as the variable condition is set no a non-zero value.

    • FXApp::runWhileEvents(). This routine enters a recursive event loop, but returns as soon as no current events are outstanding in the event queue. This can be used to catch up with the event stream during processing of some long computation, and then resume the computation as soon as all events have been processed.

    • FXApp::runOneEvent(). This function processes one single event and then returns.

    • FXApp::peekEvent(). This tests if any events are present on the event queue, and returns immediately with TRUE if there are, or FALSE otherwise.

    Recursive invocations of the event loop are very useful, because they allow you to temporarily resume processing of events without returning from your message handler.
    The runModalFor() is especially useful if your message handler needs to display a temporary dialog box, acquire some information from a user, and then continue processing the user input all without returning to the main event loop.

Why do I need to declare a default contructor in my classes?

    The FXObject-derived classes need to have the FXDECLARE() macro in the header (.h) file and the FXIMPLEMENT() macro in the implementation (.cpp) file. The FXDECLARE macro declares a static const member variable called metaClass, which is a table describing this class. It provides some form of runtime type information. It also declares a virtual function getMetaClass() which can be used to obtain a pointer to an objects metaclass variable; this way, one can interrogate the type of an object. In addition, it declares a static member function called manufacture() which will construct an object of this class using the default constructor. Finally, it declares two convenience functions for serialization of pointers to objects of this class.
    The FXIMPLEMENT macro is used to define and fill-in the table declared using FXDECLARE. It defines the static member function manufacture(), the virtual member function getMetaClass(), and fills in the static member variable metaClass. If the object handles messages, it also fills in a pointer to the message table.

    A default constructor needs to be defined in your class because the manufacture() function needs to use the default contructor to create a properly initialized object of this type. This is needed by the deserialization system so that it can allocate and initialize an object prior to loading values for the persistent member variables.

Which FOX objects do I need to delete to avoid memory leaks?

    Most FOX Widgets are automatically deleted by their parent Widget. However there are some resources which are sharable, and these resources must be deleted explicitly by the program in order to avoid memory leaks or other problems.

    Cursors, Fonts, Images, Icons, Bitmaps, and Visuals are sharable resources which must be cleaned up explicitly. Because several Widgets may refer to the same icon or font, these resources are not automatically deleted by the Widget as they may be used in another Widget. A number of resources, such as the default cursors, the default font, and the default visual, are automatically created by the Application object, and the Application object also assumes responsibility to destroy these when the Application object itself is being destroyed.

    Menu panes usually refer to the Widget that owns them, and because dangling references to a deleted owner object are not allowed, the owner Widget must make sure the Menu panes are deleted when the owner Widget itself is. Failing to do this will leave the Menu pane in existence while their owner is already deleted, and this will cause problems.

    Ordinary Widgets, like Buttons, Sliders, and so on, are automatically deleted by their parent Widget; therefore it is not necessary for your application to keep track of them explicitly

What's the difference between detach and delete?

    Many FOX objects, like widgets and icons and fonts and so on, have resources which are resident in the X-Server (or GDI in the case of Windows). The existence of these X-Server resident resources is manipulated through the member functions create() and destroy().
    When a program's GUI is realized, all the X-Server resident resources are automatically created by recursively working through the entire widget tree and calling create() for every reachable object.
    When a widget is deleted, the X-Server resident resources are released by recursing through the widget tree and calling destroy().
    However, destroy() is only called for those objects which not shared; shared resources like icons and fonts are not destroyed because they may still be referenced from other places.
    On UNIX systems, it is possible to fork() a process, which creates a child process which has initially all the same data as the parent. This includes the handles to the X-Server resident resources. Of course, these resources really belong to the parent process, and should not be references by the child process after the fork.
    To clean up, a child process forked off from a parent process needs to call detach(). The call to detach() will recursively work down the widget tree and detach all reachable objects (widgets as well as sharable resources like icons and fonts) from their X-Server resident representations. After having been detached, the objects can then be destroyed without generating a call to destroy() along the way, so the child will not accidentally release any resources which the parent process still needs.

Can I use multiple threads in my FOX application?

    FOX assumes one single thread to be responsible for the User Interface related tasks. This is because certain FOX resources are not thread-safe; also, because on MS-Windows message queues from a window are tied to the thread that created that window, it is very important for portability reasons that it is always the same thread performing the User Interface tasks.

    You can however use any number of threads in your application, as long as they are worker bees, i.e. they do not perform User Interface functions.

    Synchronization between the User Interface thread and the worker threads can be performed using a synchronization object, a pipe (UNIX/LINUX) or an event object (MS-Windows).

    The synchronization object is passed to FXApp::addInput() so that the User Interface thread is awakened when the worker thread turns the synchronization object into a signalled state.

Can I cross compile FOX on Linux for Windows?

    Yes. Markus Fleck writes:
      FROM: Markus Fleck
      DATE: 04/10/2001 09:42:55
      SUBJECT:  [Foxgui-users]Convenient cross-compiling for Win32 on Linux
    
    
    
      Hi!
    
      Below are some experiences that I thought I'd share; they're mostly of
      interest if you're a UNIX developer at heart and are forced to create Win32
      versions of your applications as well (using FOX for the GUI part, of
      course :-).
    
      I'm currently using FOX for cross-platform development (Linux and Win32),
      and have been using Cygwin under Windows for some time to create binaries
      for Win32. Unfortunately, Cygwin under Windows is quite slow, and tends to
      crash rather often (at least for me.)
    
      Recently, I came across a patched GCC cross-compiler for Win32:
    
        http://www.libsdl.org/Xmingw32/
    
      A Linux binary build of the cross-compiler can be downloaded from that site,
      or you can use the script at
    
        http://www.libsdl.org/extras/win32/cross/build-cross.sh
    
      to automatically download, configure and build the cross-compiler from
      sources for your platform.
    
      The cross-compiler works like a charm; I am now able to create Win32 .EXE
      binaries in a fraction of the time that Cygwin used to require running under
      native Windows.
    
      Using the cross-configure.sh/cross-make.sh scripts as a starting point, even
      "configure" and "make" can be run on Linux, even though you're generating
      target code for the Win32 platform.
    
      I have also started to make use of "Wine" (the Linux/FreeBSD-based execution
      environment for Win32 EXE/DLL code) instead of booting into Windows for the
      purpose of testing my application; I had to uncomment (or "#if 0") the call
      to "TrackMouseEvent" in FOX's src/FXApp.cpp, though, because apparently Wine
      doesn't implement that function and aborts when it encounters a call to it.
    
      I also had to disable (or actually, comment out using "dnl") the invocation
      of autoconf's "AC_C_BIGENDIAN" macro in configure.in (and invoke "autoconf"
      to rebuild the "configure" script); it appears that "AC_C_BIGENDIAN" doesn't
      (yet) accept a default endianness value to use when cross-compiling, so that
      effectively the "AC_C_BIGENDIAN" test cannot be used when cross-compiling
      (yet). So in order to better support cross-compiling, configure.in should
      probably test for "ac_cv_prog_cc_cross=yes" and/or shortcut the endianness
      test if Win32 is the target platform.
    
      In a nutshell, I can only recommend using the GCC cross-compiler to build
      Win32 executables; it's much faster than Cygwin and much more convenient if
      you prefer to do development on a UNIX-type system. If you're using Linux
      or FreeBSD, "Wine" can give you some additional convenience when it comes
      to testing you application.
    

    So cross compiling is not only possible, but it works very well and may be faster than working natively. One note on the AC_C_BIGENDIAN thing:- you can simply pass -DFOX_BIGENDIAN=0 on the compiler command line to override it.

Can I have other colors besides black and white for my cursor?

    As of FOX 1.1.45, yes! Under X11, you will need the Xcursor extension, which means you must have a recent X server such as XFree 4.3 or later. On Windows, it should be OK in all cases.

Why is the SEL_DELETED message sent before the actual deletion?

    SEL_DELETED is sent so as to afford the target of the message a chance to save the text that existed prior to the removal; this is useful for the purpose of maintaining undo list.
    Since the SEL_DELETED message contains the information about the to-be-deleted stuff, its a small matter to determine what the state of the widget will be after the deletion, should it be necessary.

How do I perform double buffered drawing?

    You can perform double buffered drawing by using an FXImage. First, create an off-screen FXImage, which will be the target of the drawing operations. Then, set the FXDCWindow to draw on the FXImage. Finally, whenever the widget needs to be repainted, BLIT the contents, or part of the contents of the FXImage to the Widget.
    In code:

      picture=new FXBMPImage(getApp(),NULL,IMAGE_SHMI|IMAGE_SHMP,500,500);
      ...
      picture->create();
      ...
      FXDCWindow dc(picture);
      dc.setBackground(FXRGB(255,255,255));
      dc.drawRectangle(0,0,500,500);        // Erase it!
      ...
      ... drawing commands ...
      ...
    
    And in onPaint:
    
      FXDCWindow dc(this,(FXEvent*)ptr);
      ...
      dc.drawImage(picture,0,0);
      ...
    
    
    Some details are omitted here; most likely, the drawing of the FXImage and the repainting are not both done in onPaint(); because the FXImage is off-screen, its not "clobbered" by other programs so there's no need to redraw it unless the widget changed size or if the content data was changed.

How do I make sure drawing is flicker-free?

    The following tricks have been proven to be very helpful in reducing visual flicker while redrawing widgets:

    • Limit drawing to the dirty area. Use FXDCWindow dc(this,event), because that will clip all drawing commands to the event's dirty rectangle. Drawing takes more time that almost anything else; so it is worth a lot of work to limit the amount of drawing. I refer to FXTable to give you an idea. Drawing the table seems simple enough, but initially it was very slow. I've since then expended a lot of code to determine which cells of the table were clobbered, and for each cell set clipping rectangles so as to not erase the grid lines. Now the table is virtually flicker free, and draws a whole lot faster.
    • Try to avoid erasing the background of the entire widget. Instead, paint background around the content area, then paint the content over. This is done in most FOX widgets, particularly FXTable.
    • If you have to erase the background, try and erase it little bits at a time. For example, in the FXList widget, instead of erasing the entire widget and then painting the icons over it, I erase and paint over each item individually. While is is actually a bit slower, it is visually much more acceptable because at no time is the entire widget completely erased.
    • Flush the command buffer prior to the erase, and after the last drawing command which paints over the erased background. Drawing commands are buffered, and the buffer is flushed when it is full. However, you don't want to have the situation where the last command sent is the erase, as in that case the window will stay white for the entire duration while the command buffer is filled up with commands to paint over the background. You want the erase command and the paint command to be in the same batch, if possible, so that they get executed by the X server right after each other.
    • Perform double-buffered drawing, using an FXImage as noted above.

Why does the border style not follow what I specify?

    Under Windows, you should essentially get what was specified. Some decorations under Windows are tied, for example it is not possible get DECOR_MINIMIZE and DECOR_MAXIMIZE without also getting the System Menu. Also, the Close button is tied to the Menu.

    Under X11, the decorations are mere Hints to the Window Manager. Different Window Managers may or may not observe the hints properly. As the Window Manager is a program written by other people, I have little influence over their correctness in observing the decoration hints.

    However, I have had fairly good luck with Motif, KDE 2.2, and other Window Managers like WindowMaker, Sawmill, BlackBox, and Enlightenment.

    The Free Desktop Project is trying to standardize various aspects of client and Window Manager interaction, and FOX will try to take advantage of this where it makes sense.

What's the deal with default buttons?

    Certain buttons in a dialog box may be designated as default buttons. If the focus moves onto a default button, a RETURN key will be dispatched to this button. The way to make a button be a default button is to pass BUTTON_DEFAULT.

    One single button in the dialog box may be designated as the initial default button. The initial default button is the one that will become the default button whenever the focus moves to a widget which can not itself be the default widget and which does not handle the RETURN key. Passing BUTTON_INITIAL will make it the initial default. BUTTON_DEFAULT means that if the focus lands on this button, it will become the one to respond to RETURN key.

    To programmatically set BUTTON_DEFAULT, use setButtonStyle(BUTTON_DEFAULT). Calling setDefault(TRUE) will MAKE the button the default; this is different from ALLOWING it to be the default, which is what BUTTON_DEFAULT does.

    Recommendations:

    • Only buttons normally terminating a dialog should have BUTTON_DEFAULT. For example, the "Accept" and "Cancel" buttons at the bottom of the dialog.
    • Only one single button should have BUTTON_INITIAL. This should correspond to the choice that would be the most often chosen one, e.g. "Accept". If the dialog does something dangerous, like "Erase All files" then make "Cancel" your default choice:- hitting RETURN is a reflex and in some cases its better for the easy path to lead to safety rather than to danger!
    • If you write custom widgets and your custom widget handles the RETURN key, your overload of setFocus() and killFocus() should call setDefault(TRUE) and setDefault(MAYBE), respectively.

      Calling setDefault(TRUE) means the current default button will no longer be default one because your widget now deals with the RETURN key. Calling setDefault(MAYBE) when your widget looses the focus means the default button will revert to the initial default button (unless of course the focus lands on another widget which can handle the RETURN key!).

Shouldn't fx.h include fxkeys.h?

    The header file fxkeys.h is rarely used, basically only by programs which catch keyboard messages directly. The vast number of programs will use the widgets and rely on the regular callbacks from these widgets.

    To make programs compile faster, the file fxkeys.h, which contains a very large number of definitions, is therefore not normally included.

I have this great idea, but you will need to rewrite all of the FOX library and applications.

    No!

How do I monitor activity on sockets?

    When you are running a GUI, you can monitor sockets in two ways:- first, you can of course dedicate a worker thread to the socket activity, and leave GUI work to the GUI thread.

    Another approach is to use the addInput() facility of FXApp. The addInput() call registers a callback message, and target object, to be invoked when the event on the file descriptor occurs. For example, adding:

    
            app->addInput(fd,INPUT_READ|INPUT_WRITE,myobject,MyClass::ID_FD);
    
    
    Will send a message ID_FD of type SEL_IO_READ when new data is available on fd to be read, and a message ID_FD of type SEL_IO_WRITE when the buffer is ready to accept more data to be written. In either case the void* ptr refers to the file descriptor fd, permitting you to use the same handler for multiple file descriptors.

    On MS-Windows, instead of a POSIX file descriptor, you must use a handle. Thus, under MS-Windows, the addInput() API can be used to wait on a great variety of kernel objects, ranging from event objects (which is what you need to use for sockets), to process and thread handles, and so on. Please consult the MSDN documentation on Winsock2 for details.

What do the different version numbers for FOX mean?

    Starting with the FOX 1.0.0 release, FOX library releases will have a version number of the form major.minor.patch. When the minor version number is odd, this indicates that it's a development version of FOX; when it's even, this indicates a stable release version.

    The intent is for even-numbered releases to keep the header files untouched, to guarantee DLL or shared library compatibility. If bugs are fixed, the patch number will be increased. Thus, applications should be able to link to shared library versions of FOX with confidence. For odd-numbered releases, everything may be changed from one patch level to the next, so one would have to recompile applications (that's the nature of it being a development version!).

Why didn't you fix the problem of the last pixel of a line not being drawn on MS-Windows?

    I have received many such suggestions. Here's why the suggestions received so far do not work:
    • You may draw thicker lines; adding a pixel with thin lines (1 pixel wide) is possible, but with thick lines it gets kind of complicated.
    • You may be drawing with stipple style. The stipple algorithm is closely tied to the DDA and to draw the end-point properly you must know the state of stippling algorithm in order to decide what color to give the final pixel.
    • Drawing with patterns and various BLIT modes. There are ways to draw with hatched brushes, and you can use many different BLIT modes to combine foreground, background, and hatch patterns with the background. So it gets even more complicated....
    • Even if you can solve the problem of doing all the above, there is one problem left which you CAN NOT SOLVE. You can not solve it because of the mathematics of rational numbers:
         Y
      
         5
         4            oo@
         3         ooo
         2      ooo
         1   ooo
         0ooo
          0123456789012345  X
      
      Suppose you draw the line above, but you want to include @. You'd think its a matter of specifying a slightly different end point P, such that @ is touched in the DDA algorithm.
      However, this is impossible, because the line shown has a slope of 3:1, and this hypothetical endpoint would be at at (15,4 1/3) and of course that's not an integer coordinate. The next best thing would be either (15,4) or (15,5), but that will give you a different slope line (and totally different pixelization) altogether. In effect, rather than having a tiny problem at the end of a line segment, you now have many problems along the entire line.

    The moral of the story is that we're basically better off NOT trying to fix this problem, but simply organize code so as to (a) minimize the reliance on line drawing, and use rectangle fills instead, and (b) whenever we do need to draw lines, try to make sure this effect is hidden, and finally (c) if all else fails, there is #ifdef style conditional compilation.

    As it happens, I have been able to make do with (a) and (b) in almost all cases, and had to resort to (c) only once or twice.

Why doesn't FOX use ASSERTs to check API arguments?

    The philosophy of error checking is like this:

    • As a library, FOX is installed and used by many programs, and so under normal circumstances it is compiled with optimization flags, and so assertions and such are normally removed.
    • Application developers may compile their own code with debugging enabled, but usually link against a pre-installed copy of the library.
    • Thus, errors in arguments and such need to be checked by means other than assertions.
    • If you're working on additional FOX widgets, or perhaps suspect a bug in the FOX library, then the library can be compiled for debug mode. In this case, we're interested to uncover bugs and inconsistencies in the library itself, so assertions and tracing and so on must be turned on.
    • The assertions in the library itself should however NEVER be triggered, even if the application program is ill-behaved or the library is used in the wrong way:- because the assertions are there to verify the correctness of the library itself, and the standpoint is that other checks should catch bad parameters to API's and other abuses.
    All this checking introduces some overhead, of course. But lets not forget that its a GUI library, and so the speed of many operations is not so critical, because 99% of the time the application is simply waiting for the user to do something; also, the dominant amount of CPU is actually spent on drawing, which is not slowed down at all. The payoff of all this checking is that various kinds of programming problems are (hopefully) discovered sooner.

Why can I not paste clipboard data out of a deleted window?

    Deferring the generation of the clipboard data until a request is received from another application has a number of advantages:

    • A cut or copy operation can be nearly instantaneous, even for very large data, as no actual data are being transferred.
    • It is more open-ended in terms of clipboard data types, since not all data formats need to be generated up front.
    • It allows for some optimizations; for example, if the requestor and the source are in fact the same application, no inter-process communication needs to be performed at all; data can be exchanged directly in memory.

    The alternative would be to generate all clipboard-types up front; imagine what this would mean if we had 10 image formats and you clipped an image to the clipboard:- you'd have to place the same image on the clipboard in all 10 image formats just on the off-chance that one of them may be requested!

    The source of the clipboard data is the widget from which the data was clipped to the clipboard; that widget is the one which owns the clipboard, and that widget is the one that will be asked to generate a specific representation of the data for a specific clipboard type when it is asked by another application. Only that particular widget has the methods and knowledge for generating the requested representation of the clipped data.

    While this allows for a lot of flexibility in the clipboard data types, it does have a downside:- when the owner of the clipboard is deleted, so does the clipped data.

What is valgrind?

    Valgrind is a tool for detecting various memory problems in your code, such as:

    • Use of uninitialised memory;
    • Reading/writing memory after it has been freed;
    • Reading/writing off the end of malloc'd blocks;
    • Reading/writing inappropriate areas on the stack;
    • Memory leaks -- where pointers to malloc'd blocks are lost forever;
    • Passing of uninitialised and/or unaddressible memory to system calls;
    • Mismatched use of malloc/new/new [] vs free/delete/delete [];
    • Some misuses of the POSIX pthreads API.

    Valgrind works on Linux/x86 only (on Windows, consider tools such as Purify or BoundsChecked; there may be other tools).

    Valgrind translates x86 instructions into instrumented code, basically inserting various checks on memory references. Because its still not completely aware of all sorts of x86 instruction set extensions like 3DNow and SSE, you should probably compile your code in "vanilla" pentium mode.

    If your code links against OpenGL libraries from NVidia then you can disable the OpenGL library's use of 3DNow and SSE by setting:

      export __GL_FORCE_GENERIC_CPU=1
    
    on recent releases of the OpenGL library.

    If you care about software quality, you owe it to yourself to try valgrind out as it can catch a great many bugs; some memory bugs are like "time-bombs" and may linger in the code for a long time; valgrind can ferret them out.

When is a member function virtual or not?

    There are often questions about why certain member functions of FOX classes are not virtual. The point below attempt to explain the reasoning behind the decisions.

    1. Functions which need to be virtual are. Examples of these are functions like getDefaultWidth() and layout().
    2. Certain functions which may be overloaded in derived classes are; for instance expandTree() is virtual because it allows a derived class to know when a subtree is unfolded.
    3. Message handlers are never virtual. You can just add the same message handler in the derived class's message map, which is faster anyway.
    4. Functions which should not be overloaded (e.g because it could break the abstraction, like for example getNext() and getPrev()), are never virtual either.
    5. Other than the above 4 rules, non-virtual may have been chosen without good reason. On such cases, I'm open to suggestions.

    Obviously the full scope of widget subclassing is not really known until people try; because of rule (4) chosing non-virtual is a better way to enforce the integrity of the abstraction.

Why does a toplevel window have different decorations than I specified?

    The toplevel windows (anything derived from FXTopWindow) can have various decoration hints, such as DECOR_TITLE, DECOR_BORDER, and so on. FXTopWindow passes these hints to the underlying system. On X11, a separate program called a Window Manager is responsible for interpreting these hints and applying the appropriate borders, title bar, close buttons, minimize and maximize buttons and so on. On Microsoft Windows, this is done by the GDI layer. Either way, the decorations specified from within the FOX program are just hints:- the interpretation of these hints depends on the underlying system, and is therefore out of our jurisdiction.

    There are many Window Managers under X11, such as KDE, WindowMaker, FVWM, Motif Window Manager (MWM), and so on. The ICCCM document details a few common conventions that Window Managers are supposed to adhere to; unfortunately, decoration styles are not part of this document. Because of its historic popularity, many Window Managers have opted to follow the Motif Window Manager hints.

    There is also some effort under way to define some more modern standards, the Free Desktop Organization. FOX adheres to many of the Free Desktop's standards, insofar as it does not conflict with Motif Window Manager standards (since FOX needs to work reliably under Motif for some time to come).

    Under MS-Windows, the part that is responsible for the title and border drawing is implemented in the Windows DLL's that FOX needs to link to. The non-client drawing is handled by these libraries, ensuring that FOX's toplevel windows look and behave according to the particular version of Windows your FOX program runs on.

    Since the behaviour of the decoration hints depends on the underlying system, FOX programmers must perform some testing under various systems to ensure that the particular combinations of hints they have chosen work as expected; the FOX library itself uses very conservative settings which are known to work properly on most Window Managers.

Why do none of the FXScrollArea derived widgets have a frame?

    The short answer is that FXScrollArea is derived from FXComposite, and FXComposite does not support a frame.

    The longer and more accurate answer is a bit more complicated. The FXScrollArea widget, and its derivatives, present a small view of a larger content. The content may be a drawing, but sometimes also other widgets are involved, for example in the case of FXIconList. It is necessary to clip all drawing to the visible viewport of the FXScrollArea. This is made possible by making sure the FXScrollArea's scroll bars and scroll corners are always the topmost three children, and positioned so as to leave a simple rectangular viewport area in which the content is shown.

    If FXScrollArea would draw borders or padding around itself, this would necessarily not be covered by the scroll bars and scroll corner; however that would present a problem as any content or sub-windows of the content would be drawn on top of the FXScrollArea's borders.

    Thus, FXScrollArea does not support borders. If you need a sunken border around a scrolling widget, simply create a FXVerticalFrame with no padding as the immediate parent.

What is the Legal Status of FOX since your departure from CFD Research?

CFD Research has been very nice to work out an arrangement for the legal status of FOX which is acceptable to all parties. The issues were the continued availability of the FOX Library to CFD Research, and the acknowledgement of copyrights to its author and contributors.

The arrangement is as follows:

  1. CFD Research disclaims all Copyright Interests to the FOX Library.
  2. CFD Research will continue to be able to use the FOX Library under the Lesser GPL license.

What is all this stuff with FXSelector and so on?

When a target receives a message from a widget, it may want to know several things:

  • From which widget did the target receive the message? This is determined by FXObject *sender argument of the message handler.
  • What happened? The answer to this question is in the type-part of the FXSelector sel argument of the message handler. You can obtain the message type by means of the macro: FXSELTYPE(sel).
  • The identity of the widget from which the message was received. This is answered by the id-part of the FXSelector sel argument of the message handler. You can obtain the message id by means of the macro: FXSELID(sel).
  • Any other pertinent data. This data depends on the type of widget, the message type which was received, and is found in the void* ptr argument of the message handler. You must typically cast this to the appropriate type.
Sometimes, a handler may have to send messages back to the sender, for example, in response to a SEL_COMMAND message a message handler may want to obtain the value of the sending widget by sending it a message of type SEL_COMMAND, and message id ID_GETINTVALUE. To build a message out of the type and id parts, you can use the macro: FXSEL(type,id).

For historical reasons, the data type used for the message-id, message-type, as well as the combined selector is FXSelector.

How do I add an icon for Windows Explorer?

You need to create a file, call it "myapp.rc", and then put into it:

  0 ICON DISCARDABLE "myapp16.ico"
  1 ICON DISCARDABLE "myapp32.ico"

Where, obviously, myapp16.ico and myapp32.ico are the icons you want to be associated with your application.

You will also need to convince your resource compiler to compile that, of course.

The TextField stops updating while the cursor is in it?

While a Control is being manipulated by the user, the GUI update (the process by which the widget updates itself from the application state) is turned off.
For most simple controls like Sliders this is done only during the time the mouse has grabbed the slider head.
However, for TextFields the updating is turned off while the TextField is being edited. There is no easy way to detect when the user is "done" with the TextField; but it is clear that the TextField can be updated again when:

  • You've moved the focus to another Control, or
  • You've hit RETURN in the Text Field to accept the typed input.

Building and using DLL's with FOX under Windows.

When you compile something, the header files can be parsed two ways on Windows. When compiling the FOX library itself as a DLL, the FXAPI macro should be set to FXEXPORT, which itself is set to __declspec(dllexport), (or possibly as something else depending on the compiler and linkage ideosyncracies). When you're compiling your own code which uses the FOX DLL, then FXAPI is defined as FXIMPORT which is then typically set to __declspec(dllimport).

There are two layers of macros so for your own DLL and EXE building you won't have to remember what to do for export or import, you can use the FXEXPORT and FXIMPORT macros. Now, you can NOT use FXAPI. When you build your own library, that library is a importer of the FOX API but an exporter of its own API!

For example, in FXChart new symbol FXCHARTAPI is defined so that when it is compiled it could be import symbols from FOX yet at the same time export its own symbols.

So in a nutshell:

  • Compile FOX with -DFOXDLL and -DFOXDLL_EXPORTS.
  • Compile programs which use FOX with -DFOXDLL and nothing else.
  • Compile your own DLL's which use FOX with -DFOXDLL and -DYOURDLL_EXPORTS [see FXChart for example]. Your own FOX-based DLL's export ONLY their own symbols but import the core library's symbols.

Creating an MDI application.

When you build an MDI application, messages should be routed via the FXMDIClient to an FXMDIChild, and from there, to either FXMDIChild's content window and the FXMDIChild's target. The FXMDIChild's target is typically a document object of some kind.

So, GUI controls basically have FXMDIClient as their target. The FXMDIClient is a kind of delegator, in the sense that when it does not understand a message, it forwards it to its currently active FXMDIChild; if there is no such child, then control is returned to the calling widget with the "unhandled" message return code.

The FXMDIChild similarly does a delegation. It tries the content window first, then its target "document" object.

Since we do not know which FXMDIChild is going to be active, it is important to ensure that all message ID's are unique if you have different types of FXMDIChild widgets.

For example, an application may have a 3D viewer in one FXMDIChild and a text view in another FXMDIChild. We don't want messages intended for a 3D viewer to be connected to a wrong handler when the text view FXMDIChild is active.

So, I recommend a common base class for your various FXMDIChild subclasses, and to define all message ID's in there. Then various subclasses of this base class map whatever ID's they need to specific handlers.

If you also have a Document class as target of the FXMDIChild windows, then number the messages the Document deals with starting from the ID_LAST of the FXMDIChild base class widget in your application. See below:

  // MDI Child base class
  class MyMDIChildBase : public FXMDIChild {
  ...
  enum {
    ID_FIRST=3000,      // High number away from any ID's defined in widgets
    ...
    messages defined for all subclasses of MyMDIChildBase
    ...
    ID_LAST
    };
  ...
  };


  // Custom document class
  class MyDocument : public FXObjecvt {
  ...
  enum {
    ID_FIRST=MyMDIChildBase::ID_LAST,
    ...
    ID_LAST
    };
  ...
  };

This is convenient. For example, a "Cut Selection" message could have radically different implementations in the various subclasses, yet be invoked from the same single menu.

When a particular FXMDIChild is active, some message ID's will be mapped to a handler, and some will not be.

FOX can take advantage of this fact by allowing you to specify the AUTOGRAY or AUTOHIDE flags on certain controls. For example, if you were to specify BUTTON_AUTOGRAY on a toolbar button, the button is automatically grayed out when no corresponding handler is found in the currently active FXMDIChild, or when there is no open document at all.

BUTTON_AUTOHIDE works similarly, except that in this case the button will be hidden instead of simply grayed out.

When you use BUTTON_AUTOGRAY, it is of course going to be necessary to implement the SEL_UPDATE handler as well as the usual SEL_COMMAND handler, so that you can enable the button. You can enable the button by means of a message, so that your handler won't have to know what kind of widget the sender was.

Example:

  // Undo last command
  long MyDocument::onCmdUndo(FXObject*,FXSelector,void*){
    /// perform the command for undo
    return 1;
    }


  // Sensitize undo widget; the ID_ENABLE message
  // enables the sender [presumably a widget of some sort]
  // We don't need to know what kind of widget the sender is,
  // so we can actually use this handler for sensitizing toolbar
  // buttons as well as the corresponding pulldown menu commands.
  long MyDocument::onUpdUndo(FXObject* sender,FXSelector,void*){
    sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL);
    return 1;
    }

  // Example: pulldown menu command
  new FXMenuCommand(editmenu,"&Undo",undoicon,clientarea,MyDocument::ID_UNDO,MENU_AUTOGRAY);

  // Example: toolbar command
  new FXButton(maintoolbar,"\tUndo",undoicon,clientarea,MyDocument::ID_UNDO,BUTTON_AUTOGRAY|BUTTON_TOOLBAR|FRAME_RAISED);

Of course there may be a few cases where you may need to perform a wholesale update of the user interface when the user switches FXMDIChild windows or documents. Some major widgets with lots of content should probably not be updated using the SEL_UPDATE mechanism.

There are two ways; first is the SEL_CHANGED from FXMDIClient; a better way, and the recommended one, is to catch the SEL_SELECTED and SEL_DESELECTED messages from FXMDIChild:

  // Switched to new active document
  long MyDocument::onChildActivate(FXObject*,FXSelector,void* ptr){
    if(!ptr || ((FXMDIChild*)ptr)->getTarget()!=this) activateDocument();
    return 1;
    }


  // Switched from old active documents
  long MyDocument::onChildDeactivate(FXObject*,FXSelector,void* ptr){
    if(!ptr || ((FXMDIChild*)ptr)->getTarget()!=this) deactivateDocument();
    return 1;
    }

The void* in these messages reflects the OLD FXMDIChild window that was active before the switch. The code above takes care of the case where there are multiple FXMDIChild windows which may have a common document, and we would of course only want to update the GUI controls when we switch documents, not when we switch between FXMDIChild windows of the same document.

The implementation of activateDocument() will be responsible for setting up the GUI controls with data pertaining to the document. Likewise, deactivateDocument() should tear down the user interface and leave widgets in their pristine state [as if there were no document].

MS-Windows GDI handle limits.

MS-Windows has finite limits on GDI handles; the maximum number of HWND handles in the entire system is determined by 16-bit handle values. There is also a maximum number of bitmap handles.

These limits manifest themselves when calls to create() are failing by throwing an exception.
Windows NT, 2K, and XP probably have higher limits than Windows 95, Windows 98, and Windows ME.

It is therefore important to make sure that resources are deleted as soon as they're no longer needed. Since its pretty fast to create resources, its best to delay creation of windows and icons until they're actually needed.

In particular, dialogs should "own" their icons, and delete them in the dialog's destructor. Try to construct dialogs only when they're actually brought on-screen, and try to delete them when the interaction with them is done.

Note that un-created() icons and images do not use any handles in the system, so refrain from calling create() on icons or images if all you want to do is load and manipulate the image's pixel data. You only need to call create() when images are to be drawn into or used as sources for drawing (like e.g. drawing onto widgets).

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/filefuncs.html000066400000000000000000000523201326741342000162500ustar00rootroot00000000000000 Documentation: File Manipulation
Documentation: File Manipulation [Remove Frame]

    Almost all applications will eventually be faced with the need to manipulate file, and directories, and access the underlying operating system's file system.  In FOX, a large collection of useful filename and directory name manipulation functions is provided with which you can perform these tasks easily.
    Moreover, the FOX file manipulations are aware of platform specific idiosyncracies, such as UNC under MS-Windows and escaping sequences under UNIX.

Finding Special Directories

    Certain directories in the file system are special, like the applications current working directory, the users home directory, and so on. FOX supplies the following functions for this purpose:


    FXString getEnvironment(const FXString& name)

    This function obtains the environment variable name from the environment. It returns the empty string if not found.


    FXString getHomeDirectory()

    Returns the current user's home directory.


    FXString getUserDirectory(const FXString& user)

    Returns the home directory of the named user, or the current user's home directory if the parameter user is empty.


    FXString setCurrentDirectory(const FXString& path)

    Change the application's current working directory to path


    FXString getCurrentDirectory()

    Returns the current working directory of the application.


    FXString setCurrentDrive(const FXString& prefix)

    Change the application's current drive letter to prefix, where prefix is the drive letter, like "a:", "b:", and so on. This function of course has no effect on UNIX systems.


    FXString getCurrentDrive()

    Returns the current drive letter of the application. This function of course has no effect on UNIX systems.


    FXString getExecPath()

    Returns the path along which the systems shell usually locates executable programs, or "$PATH". The returned path string is a sequence of directories separated by PATHLISTSEP.

Filename Manipulation

    Manipulating filenames is done with the following functions:


    FXString directory(const FXString& file)

    Return the directory part of file. Note that directory("/bla/bla/") yields "/bla/bla" and NOT "/bla". However, directory("/bla/bla") yields "/bla" as we expect!


    FXString name(const FXString& file)

    Return name and extension part of file. Note that name("/bla/bla/") yields "" and NOT "bla". However, name("/bla/bla") yields "bla" as we expect.


    FXString title(const FXString& file)

    Return title part of file. This is the name of the document with the directory part and the extension part removed.


    FXString extension(const FXString& file)

    Return extension part of file.


    FXString stripExtension(const FXString& file)

    Strip the extension part of file.


    FXString drive(const FXString& file)

    Return the drive letter part of file. Of course, on UNIX systems this will return the empty string.


    FXString expand(const FXString& file)

    Expand meta-characters in file. On UNIX systems, "~" is expanded into the current user's home directory, "~user" into the given user's home directory, via getUserDirectory(). Also, "$VARIABLE", "${VARIABLE}", or "$(VARIABLE)" will be expanded into the environment variable VARIABLE, via getEnvironment(). On MS-Windows, environment variables of the form "%VARIABLE%" are expanded similarly.


    FXString simplify(const FXString& file)

    Return the simplest pathname representation of file. The path will remain relative if it was relative, or absolute if it was absolute. Also, a trailing "/" will be preserved as this is important in other functions. For example, simplify("..//aaa/./bbb//../c/") yields "../aaa/c/".


    FXString absolute(const FXString& file)

    Return the absolute path to the file, given the current working directory and drive letter.


    FXString absolute(const FXString& base,const FXString& file)

    Build the absolute path to the file, from the given base directory and file.


    FXString relative(const FXString& file)

    Return the path to file, relative to the current working directory.


    FXString relative(const FXString& base,const FXString& file)

    Return the path to file, relative to the directory base.


    FXString enquote(const FXString& file,FXbool forcequotes=FALSE)

    Enquote file to make safe for shell. Normally, quotes are only generated when necessary, but if forcequotes is TRUE quotes are always generated regarless of necessity.
    Files with special characters need to be quoted before they may be passed to bash, ksh, csh (UNIX) or cmd (MS-Windows).


    FXString dequote(const FXString& file)

    Dequote file to yield the original again.


    FXString unique(const FXString& file)

    Generate unique filename of the form "pathnameXXX.ext", where pathname.ext is the original input file, and XXX is a number, possibly empty, that makes the file unique.


    FXString search(const FXString& pathlist,const FXString& file)

    Search pathlist for this file, return full path name for first occurrence. The pathlist is a PATHLISTSEP separated list of directories, such as returned by getExecPath.


    FXString upLevel(const FXString& file)

    Return path to directory above input directory file.

Obtaining information about files

    A number of functions are also available to obtain various kinds of information about files or directories:


    FXbool isAbsolute(const FXString& file)

    Return true if file is an absolute pathname.


    FXbool isTopDirectory(const FXString& file)

    Return true if input file is a top-level directory.


    FXbool isFile(const FXString& file)

    Return true if input file is a file name.


    FXbool isLink(const FXString& file)

    Return true if input file is a link.


    FXbool isDirectory(const FXString& file)

    Return true if input file is a directory.


    FXbool isReadable(const FXString& file)

    Return true if input file is readable.


    FXbool isWritable(const FXString& file)

    Return true if input file is writable.


    FXbool isExecutable(const FXString& file)

    Return true if input file is executable.


    FXbool isOwnerReadWriteExecute(const FXString& file)

    Return true if owner has read-write-execute permissions.


    FXbool isOwnerReadable(const FXString& file)

    Return true if owner has read permissions.


    FXbool isOwnerWritable(const FXString& file)

    Return true if owner has write permissions.


    FXbool isOwnerExecutable(const FXString& file)

    Return true if owner has execute permissions.


    FXbool isGroupReadWriteExecute(const FXString& file)

    Return true if group has read-write-execute permissions.


    FXbool isGroupReadable(const FXString& file)

    Return true if group has read permissions.


    FXbool isGroupWritable(const FXString& file)

    Return true if group has write permissions.


    FXbool isGroupExecutable(const FXString& file)

    Return true if group has execute permissions.


    FXbool isOtherReadWriteExecute(const FXString& file)

    Return true if others have read-write-execute permissions.


    FXbool isOtherReadable(const FXString& file)

    Return true if others have read permissions.


    FXbool isOtherWritable(const FXString& file)

    Return true if others have write permissions.


    FXbool isOtherExecutable(const FXString& file)

    Return true if others have execute permissions.


    FXbool isSetUid(const FXString& file)

    Return true if the file sets the user id on execution.


    FXbool isSetGid(const FXString& file)

    Return true if the file sets the group id on execution.


    FXbool isSetSticky(const FXString& file)

    Return true if the file has the sticky bit set.


    FXString owner(const FXString& file)

    Return owner name of file, if available; otherwise "user".


    FXString group(const FXString& file)

    Return group name of file, if available; otherwise "group".


    unsigned long size(const FXString& file)

    Return size of file in bytes


    FXTime modified(const FXString& file)

    Return last modified time of file.


    FXTime accessed(const FXString& file)

    Return last accessed time of file.


    FXTime created(const FXString& file)

    Return create-time of file.


    FXTime touched(const FXString& file)

    Return touched time of file.

Copying, Moving, Linking Files

    The following operations are available on files:


    FXbool createDirectory(const FXString& path,FXuint mode)

    Create new directory path, with permissions set to mode.


    FXbool createFile(const FXString& file,FXuint mode)

    Create new empty file, with permissions set to mode.


    FXbool concatenate(const FXString& srcfile1,const FXString& srcfile2,const FXString& dstfile,FXbool overwrite=FALSE)

    Concatenate srcfile1 and srcfile2 to a dstfile. If overwrite is true, then the operation fails if dstfile already exists. srcfile1 and srcfile2 should not be the same as dstfile.


    FXbool remove(const FXString& file)

    Remove file or directory, recursively.


    FXbool copy(const FXString& srcfile,const FXString& dstfile,FXbool overwrite=FALSE)

    Copy srcfile to a dstfile, recursively if srcfile is a directory. If overwrite is true, then the operation fails if dstfile or a file inside dstfile already exists.


    FXbool move(const FXString& srcfile,const FXString& dstfile,FXbool overwrite=FALSE)

    Move srcfile to a dstfile, recursively if srcfile is a directory. If overwrite is true, then the operation fails if dstfile or a file inside dstfile already exists. If srcfile and dstfile are on the same file system, the files are moved; if srcfile and dstfile are on different file systems, the files are copied and the original srcfile is removed only after all files have been copied successfully.


    FXbool link(const FXString& srcfile,const FXString& dstfile,FXbool overwrite=FALSE)

    Link dstfile to srcfile. If overwrite is true, then the operation fails if dstfilealready exists. If srcfile and dstfile are on different filesystems, the operation will fail.


    FXbool symlink(const FXString& srcfile,const FXString& dstfile,FXbool overwrite=FALSE)

    Make a symbolic link from dstfile to srcfile. If overwrite is true, then the operation fails if dstfilealready exists.


    FXString symlink(const FXString& file)

    Return the destination of the symlink file.

Other File Operations

    Finally, some operations which don't fit in any easy categories:


    FXbool match(const FXString& pattern,const FXString& file,FXuint flags=(FILEMATCH_NOESCAPE|FILEMATCH_FILE_NAME))

    Perform wildcard match of file against the pattern. The pattern may contain special wild-card characters:

    ?Matches single character.
    *Matches zero or more characters.
    [abc]Matches a single character, which must be a, b, or c.
    [^abc]Matches a single character, which must be anything other than a, b, or c.
    [!abc]Ditto.
    [a-zA-Z]Matches single character, which must be one of a-z or A-Z.
    [^a-zA-Z]Matches single character, which must be anything other than a-z or A-Z.
    [!a-zA-Z]Ditto.
    pat1|pat2Matches either pat1 or pat2.
    pat1,pat2Ditto.
    (pat1|pat2)Matches either pat1 or pat2; patterns may be nested.
    (pat1,pat2)Ditto.

    Matching can be influenced using the flags as follows:

    FILEMATCH_FILE_NAMENo wildcard can ever match "/" (or "\","/" under Windows).
    FILEMATCH_NOESCAPEBackslashes don't quote special chars ("\" is treated as "\").
    FILEMATCH_PERIODLeading "." is matched only explicitly (Useful to match hidden files on Unix).
    FILEMATCH_LEADING_DIRIgnore "/..." after a match.
    FILEMATCH_CASEFOLDCompare without regard to case.

    For example,

    *.cpp|*.cc|*.cxx|*.CMatches some common extensions for C++ source files.
    image.(bmp,gif,jpg)Matches a file called image given as either bmp, gif, or jpg.
    *.[^o]Matches any file except object files.


    FXint listFiles(FXString*& list,const FXString& path,const FXString& pattern="*",FXuint flags=LIST_MATCHING_FILES|LIST_MATCHING_DIRS)

    List files matching pattern in the directory given by path. Returns the number of files in the string-array list which matched the pattern or satisfied the flag conditions. The flags parameter can be a combination of the following:

    LIST_MATCHING_FILESMatch files (default).
    LIST_MATCHING_DIRSMatch directories (default).
    LIST_NO_FILESDo not match any files.
    LIST_NO_DIRSDo not match any directories.
    LIST_ALL_FILESMatch all files.
    LIST_ALL_DIRSMatch all directories.
    LIST_HIDDEN_FILESMatch hidden files also.
    LIST_HIDDEN_DIRSMatch hidden directories also.
    LIST_NO_PARENTDo not match "..".
    LIST_CASEFOLDPerform case insensitive matching.


    FXTime now()

    Return current time.


    FXString time(FXTime filetime)

    Convert filetime to date-string.


    FXString time(const FXchar *format,FXTime filetime)

    Convert file time to date-string as per strftime(3). Format characters supported by most systems are:

    %a %A %b %B %c %d %H %I %j %m %M %p %S %U %w %W %x %X %y %Y %Z %%

    Some systems support additional conversions.


    FXbool info(const FXString& file,struct stat& info)

    Return info of file as reported by system stat(2) function.


    FXbool exists(const FXString& file)

    Return true if file exists.


    FXbool identical(const FXString& file1,const FXString& file2)

    Return true if file1 and file2 are identical, i.e. refer to the same inode.


    FXuint mode(const FXString& file)

    Return the permissions of file.


    FXbool mode(const FXString& file,FXuint mode)

    Change the permission of file to mode.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/filter.pl000077500000000000000000000053121326741342000152300ustar00rootroot00000000000000#!/usr/bin/perl $file = $ARGV[0]; if ($file =~ /\.cpp/) { while (<>) { print $_; } } else { @lines = <>; chomp(@lines); $brace = 0; for ($i = 0; $i < scalar @lines; ++$i) { $_ = $lines[$i]; # adjust brace level $stm = $_; if ($$incmt) { if (m#^([^*]|\*+[^/*])*\*+/(.*)$#) { $stm = $1; $$incmt = 0; } else { $stm = ""; } } $stm =~ s#//.*##; $stm =~ s#/\*([^*]|\*+[^/*])*\*+/##g; if ($stm =~ m#^(([^/]|/[^*])*)/\*#) { $$incmt = 1; $stm = $1; } ++$brace if $stm =~ /\{/; --$brace, $enum = 0 if $stm =~ /}/; # skip message handlers if ($lines[$i] =~ /^\s*long\s+on\w+\(\s*FXObject\s*\*\s*\w*\s*,\s*FXSelector\s*\w*\s*,\s*void\s*\*\s*\w*\s*\);/) { #splice @lines, $i, 0, (" /** \@name Message Handlers */", " //\@{ "); #$j = $i+2; #while ($lines[$j] =~ /^\s*long\s+on\w+\(\s*FXObject\s*\*\s*\w*\s*,\s*FXSelector\s*\w*\s*,\s*void\s*\*\s*\w*\s*\);/) { # ++$j; #} #splice @lines, $j, 0, (" //\@} "); #$i = $j; $lines[$i]=""; } $skip = 0 if $brace <= 1; $skip = 1 if $stm =~ /^\s*public\s*:\s*$/; $skip = 2 if $stm =~ /^\s*protected\s*:\s*$/; $skip = 3 if $stm =~ /^\s*private\s*:\s*$/; $enum = 1 if $stm =~ /^\s*enum\s+\w*\s*\{[^}]*$/; if ($skip > 1) { splice @lines, $i, 1, (); --$i; next; } if (($lines[$i] =~ /^\*\// || @lines[$i] =~ m#///#)&& $lines[$i+1] =~ /^class/ && scalar @tags > 0 ) { if (@lines[$i] =~ m#///\s*(.*)$#) { @lines[$i] = "/** $1"; splice @lines, $i+1, 0, ("*/"); ++$i; } splice @lines, $i, 0, ("* ", "* See also: ", @tags); $i += scalar @tags + 2; } if ($enum == 1 && m#///?\s*.*$#) { $lines[$i] =~ s#///?#///<#; } if ($skip <= 1) { if ($brace == 1 && $lines[$i] =~ m|^\s*///?| && $lines[$i+1] =~ m|^\s*enum|) { $lines[$i] =~ m|^\s*///?\s*(.+)|; $cmt = $1; ($tag) = $file =~ /(\w+)\.\w+$/; $tag .= "_" . $group++; $tag =~ s#[ .:\\/]#_#g; push @tags, "* \\li \\ref $tag \"$cmt\"."; splice @lines, $i, 0, ("/** \\addtogroup $tag $cmt", " * \@{", " */"); $i += 3; $j = $i; while (!($lines[$j] =~ /\};/)) { ++$j; } splice @lines, $j+1, 0, ("/** @} */"); } if ($brace == 3 && $lines[$i] =~ m#^\s*enum\s+\{#) { $j = $i; $delete = 1; while (!($lines[$j] =~ m#\}\s*;#)) { $delete = 0 if $lines[$j] =~ m#///?#; ++$j; } if ($delete) { splice @lines, $i, $j-$i+1; $enum = 0; } } } } foreach (@lines) { print $_ . "\n"; } }fox1.6-1.6.57/doc/focus.html000066400000000000000000000264661326741342000154250ustar00rootroot00000000000000 Documentation: Keyboard Focus
Documentation: Keyboard Focus [Remove Frame]

    There are several ways we currently move the focus around:

    1. Move the focus to the widget you clicked on.
    2. Use Alt-L to move the focus to the control AFTER a label with name &Label.
    3. Using arrow keys. The arrow keys currently inspect the geometry of the GUI to determine the next control; I believe this works pretty well [each layout manager needs its own code for the arrow navigation as different layout managers obviously have different layout patterns].
    4. Using TAB or BACK TAB. Here we simply move to the next sibling, or if that sibling is a composite, to that composite's first child. At the toplevel widget we loop around so we visit all widgets eventually tabbing around.

    So how does it work?

      top
       |
       |
       v
      composite#1
       |       |
       |       v
    child#1   composite#2
               |       |
               |       |
           composite#3 |
                       v
                      child#2
      

    Each widget may have a focus child; keyboard events are delivered to the toplevel widget (top).

    The concept of "focus chain" is the delivery of keyboard events from the top down to a specific control [in the diagram above this could be:

    	top->composite#1->composite#2->child#2
    

    for example.

    setFocus() puts a widget into the focus chain. If the toplevel widget had the REAL focus from the window system [the window manager only assigns keyboard focus to a toplevel window], then setFocus() generates a SEL_FOCUSIN message; note that in the process of child->setFocus(), the whole chain is built up by upward recursion, and the child does not become switched into the focus chain until the parent is also.

    The recursion stops when we either reach the toplevel widget or we find a widget which was already in the focus chain. Of course widgets which leave the focus chain by means of killFocus(), which works very similarly.

    So if we had a focus chain:

    	top->composite#1->child#1
    

    and assign the focus to child#2, and if the toplevel widget had windowmanager's focus already, we will see events like:

    	child#1      SEL_FOCUSOUT
    	composite#2  SEL_FOCUSIN
    	child#2      SEL_FOCUSIN
    

    If we click on another toplevel window, we get:

    	child#2	     SEL_FOCUSOUT
    	composite#2  SEL_FOCUSOUT
    	composite#1  SEL_FOCUSOUT
    	top          SEL_FOCUSOUT
    

    These messages permit the application to provide visual cues as to where the focus is.

    If a widget has a focus child, then first an attempt is made to forward the keyboard event to that focus child. If the child handles the keyboard event then it returns 1 and we're done.

    If a child is itself a composite, it will in turn try its focus child.

    If the focus child of a composite did not handle the keyboard event then the composite will try to interpret the navigation keys (Tab/Backtab/Arrows). These are translated into SEL_FOCUS_NEXT, SEL_FOCUS_PREV, SEL_FOCUS_RIGHT, SEL_FOCUS_LEFT, SEL_FOCUS_DOWN, and SEL_FOCUS_UP messages, respectively.

    If a composite successfully interprets the navigation key, i.e. manages to find a successor widget to set the focus on, then it returns 1. Otherwise it returns 0 and the next composite higher up can have a shot at interpreting the navigation keys.

    I got the focus movement basically working (the mechanism); run groupbox and tab/backtab your way between all the buttons. Hitting space or return with focus on a button will now invoke it just as if you had used the mouse. Not all widgets properly cooperate with it yet. [Widgets which can accept the focus should return TRUE in their overload of canFocus() ].

    The dispatch of keyboard events is now implemented. Here's how it works:

    • Each widget has a focus, which indicates the current child that has the focus.
    • When a key is pressed/released, it first gets sent to the shell widget.
    • If the widget's focus variable has been set, it will first try to dispatch the event to the focused child.
    • If the focus widget is not set, or if the focus widget didn't handle the key event, this widget's accelerator table will be checked [accelerator tables have not yet been implemented, but essentially it's a hash table that maps a keycode + modifiers (ALT/SHIFT/CNTL) to a direct message to an object].
    • If the widget has an accelerator table, and the key/modifier combination is found, the key event will be dispatched to the object given in the table.
    • If the widget does not have an accelerator table, or if there's no matching accelerator, the widget will proceed with ``default keyboard processing.''
    • In default keyboard processing, the space and enter keys are reported to the focus widget as button activate messages; if there is no focus widget, or if the focus widget does not handle it, it returns FALSE.
    • Also in default keyboard processing, the tab, backtab, and arrow keys are translated into focus movement messages. and resent to the widget itself. By resending these to itself, different widgets can perform different things, based on these messages (e.g. non-composite widgets do not handle focus change messages).
    • When none of the above applies, the widgets keyboard message handler returns FALSE. At this point, its parent will have a crack at it.

    This mechanism looks very complicated, but it's needed:

    • A text widget inside some other widgets will certainly want to have a first crack at arrow keys, tabs, and its own accelerators.
    • A matrix layout widget will want to handle the arrow keys intelligently. A menubar widget will deal differently with arrow keys.
    • A shell widget, trying to move its focus forward, will cycle back to the first focusable child when it hits the end; repeated tabbing will get you back where you started.

    Functions setFocus() and killFocus() work properly now. There's a difference between a widget being in the focus chain (down from the shell) v.s. actually having the keyboard focus: when you move your cursor over a window (or click-to focus, depending on your window manager), all widgets in the chain are notified that they now have the REAL focus. Conversely, when you move your cursor out of a window, they are notified they no longer have the REAL focus.

    In a nutshell, when you add/remove items to/from List or TreeLists, when you add/remove children to/from Composites, flags will be set that indicate that a recalc() may be needed.

    When the idle processing starts, this will then happen. Thus, you can add 1000's of items w/o any noticable slowdown. (It seems to improve performance by 2-3 orders of magnitude; previously, adding elements caused a torrent of events.

    With the new system, recalc()'s are put off till the last minute. Unfortunately, this new mechanism can not stand alone. A similar mechanism is needed for repainting. In future, when you call update(), it will add a repaint rectangle or union the old repaint rectangle with the new one. Then it will repaint during idle processing. So it's a bit chaotic right now, but it should become VERY SPEEDY when it's all done.

    Also, I'm afraid the messagebox is broken right now. This is due to the class hierarchy changes, and the new layout of FXTopWindow. CWW had some nice suggestions for improvements, but those have not yet been implemented.

    layout() is now protected. recalc() will be also. I'm in the process of redesigning this mechanism.

    I got the focus movement basically working (the mechanism); run groupbox and tab/backtab your way between all the buttons.

    Hitting space or return with focus on a button will now invoke it just as if you had used the mouse.

    Not all widgets properly cooperate with it yes. [Widgets which can accept the focus should return TRUE in their overload of canFocus() ].

    The dispatch of keyboard events is now implemented. Here's how it works:

    • Each widget has a focus, which indicates the current child that has the focus.,/li.
    • When a key is pressed/released, it first gets sent to the shell widget.
    • Each widget looks if it's focus has been set; if so, it tried to dispatch the key event to the focus widget.
    • If the focus widget is not set, or if the focus widget didn't handle the key event, this widgets accelerator table will be checked [accelerator tables have not yet been implemented, but essentially it's a hash table that maps a keycode + modifiers (ALT/SHIFT/CTL...) to a direct message to an object].
    • If the widget has an accelerator table, and the key/modifier combination is found, the key event will be dispatched to the object given in the table.
    • If the widget does not have an accelerator table, or if there's no matching accelerator, the widget will proceed with ``default keyboard processing.''
    • In default keyboard processing, the space and enter keys are reported to the focus widget (if there is one), layout() is now protected. recalc() will be also. I'm in the process of redesigning this mechanism.

    In a nutshell, when you add/remove items to/from List or TreeLists, when you add/remove children to/from Composites, flags will be set that indicate that a recalc() may be needed.

    When the idle processing starts, this will then happen. Thus, you can add 1000's of items w/o any noticable slowdown. (It seems to improve performance by 2-3 orders of magnitude; previously, adding elements caused a torrent of events.

    With the new system, recalc()'s are put off till the last minute. Unfortunately, this new mechanism can not stand alone. A similar mechanism is needed for repainting. In future, when you call update(), it will add a repaint rectangle or union the old repaint rectangle with the new one. Then it will repaint during idle processing. So it's a bit chaotic right now, but it should become VERY SPEEDY when it's all done.

    Also, I'm afraid the messagebox is broken right now. This is due to the class hierarchy changes, and the new layout of FXTopWindow. CWW had some nice suggestions for improvements, but those have not yet been implemented.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/fonts.html000066400000000000000000000342461326741342000154320ustar00rootroot00000000000000 Documentation: Fonts
Documentation: Fonts [Remove Frame]

    Type faces in FOX are manipulated using FXFont objects.  To provide a consistent look and feel for all applications, most FOX widgets normally share one common font object, which is automatically adopted when the widget is constructed.  However, a widget's font is readily changed using the setFont() member function.  Changing fonts on widgets will automatically cause an adjustment in layout so that the new size of the widget is accomodated.

    As with most other resources such as FXIcon and FXCursor etc., building FXFont objects also takes two steps:- construction of the client-side part of the font object, followed by creation of the corresponding server-side part.   During construction, all necessary information is supplied to the FXFont object so that the desired font may be located and loaded into memory during the creation. In most cases, the font objects are automatically created when the widget that uses it is being created.  If you have constructed a new FXFont object later on, however, you may have to make a call to the font object's create() member function to make sure the font object is fully initialized. As different computer systems may have different fonts, it is possible that the specific font your application needs may not be available.  Since you probably still would like this application to run anyway, alternative fonts must be found.

    FOX supports mechanisms to localize fonts which are ``close'' [in some easthetic sense] to the desired font, so that applications will typically not fail simply because of missing fonts.  Keep in mind, however, that the information you supplied to the FXFont contructor may not accurately reflect the font that is actually being used in your application.

    Also note that information about a font will not be available until after the font has been created using create().

Using Font Objects

    Using fonts is really very easy.  For example, to build a Button Control with a different Font for the caption, you would use the following C++ code:

    FXButton *button = new FXButton(parent,"&Caption");
    FXFont* captionfont = new FXFont(app,"times",24);
    button->setFont(captionfont);
    

    This statements will create a Button with caption ``Caption'' and use a font of 24 points Times.  Note that in this case we assume that the captionfont will be created in the process of creating the Button; if you were to change fonts after the application has already started running, you would want to call captionfont->create() to make sure the font resources are created. Also note that font objects may be shared between several controls; thus, you don't have to create a different font object for each control [unless of course you want to use a different font!]. In the above example, we have taken default values for many parameters influencing the choice of font. The above call is actually equivalent to:

    FXFont* captionfont = new FXFont(app,
                                     "times",
                                     24,
                                     FONTWEIGHT_NORMAL,
                                     FONTSLANT_REGULAR,
                                     FONTENCODING_DEFAULT,
                                     0);
    

    That is to say, construct a font with face name ``times,'' 24 points, normal weight [not bold], no italics, and use whatever character encoding is available for this font; finally, the zero (0) indicates there are no hints.

    Besides the above platform-independent font constructor, FXFont also has an alternative constructor which is only applicable to the X11 Window System; this method bypasses the font matching algorithm. Assuming that our display was 75 dots per inch (dpi), the alternative method of contructing fonts using the X11 font string would have been:

    FXFont* captionfont = new FXFont(app,"-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1");
    

    Besides being harder to remember, this method would not port over very well to other systems, or systems where this particular font is not available.  However, there are a few reasons why sometimes you may need this method:

    1. You want to make sure you obtain a specific font, and do not want the matching algorithm to get in the way;
    2. You need to obtain certain raster-based system fonts, for example "9x15bold."

Font Matching and Substitution

    In order to be able to write applications which may be ported to a large variety of computer systems and software environments, it is necessary to make sure that the absence of certain fonts is handled gracefully.
    The FXFont implementation offers a number of benefits that allow you to get your application running under a wide variety of  environments, even on systems where very few fonts have been installed:

    1. Font Substitution.  Font substitution is used to map type face names which may be hard-coded in your application to another type face name, so an alternative font may be used without having to make changes to programs or recompiling them.  FOX uses the standard Registry mechanism to map one type face name to another.
    2. Font Matching.  Font matching algorithms are used to determine the closest available font to the desired font.  Different weighting factors are applied to different font attributes to get the best visual approximation.
    3. Font Match Hints.  Hints may be passed to the matching algorithms so you are able to emphasize certain types of font attributes more strongly than others.
    4. X11 Font String.  Platform-dependent fonts may be directly specified also.  This method is not recommended unless you need to select a specific font, and are not interested in portability.

    Before trying to acquire a list of available fonts for a certain type face, the FXFont implementation first tries a substitution for the type face name.  The standard FOX registry is used to make this association.  The substitute font is found in the section FONTSUBSTITUTIONS of the registry.
    For example, the following fragment decribes the registry settings which would replace ``swiss'' by ``helvetica'' and ``new century schoolbook'' by ``courier'':

    [FONTSUBSTITUTIONS]
    swiss = helvetica
    new century schoolbook =  courier
    

     Thus, you can easily give a FOX application another font even if you might not have the source code around!

    After having substituted the type face name, the FXFont implementation tries to find the font from the given type face  that best matches the parameters and hints.  Parameters or hints which are given a ``don't care'' value are considered matched.  For example, if you specify FONTWEIGHT_DONTCARE for the font weight, all font weights would match and the resulting font will be based on other parameters.

    Not all parameters have the same priority as far as matching goes; the importance of the parameters is as follows:


     
    1. Character Set Encoding.  If you needed East European character sets and you got Greek instead, even all other things being equal, you'd be disappointed.
    2. Fixed or Variable Pitch hints.  For programming editors, for example, fixed pitch fonts are a must so that indentation is properly maintained; therefore, font pitch is quite important for legibility purposes.
    3. Screen Resolution.  Bitmapped fonts are much more readable when the resolution matches that of your screen; so resolution is quite important.  The FXFont implementation tries to determine the screen's resolution (in terms of dots per inch) and then match fonts designed for this resolution.
    4. Scalable Font Hint.  Certain operations such as scaling and shearing [obliqueing] are only possible with scalable fonts; thus, if you have specified this hint, all other things being equal, you'd prefer scalable fonts over other ones.
    5. Polymorphic Font Hint. Polymorphic fonts allow continuous variations in various attributes of a font, such as set width, weight, slant, and others. If your application needs such fonts for certain effects, this much be made to match.
    6. Point Size. When all the above are satisfied, you certainly want the size of the font to be roughly equal to the one specified.  For scalable fonts, you can of course virtually always match the requested size exactly.  For non-scalable fonts, the FXFont implementation matches the largest font which is less than or equal to the desired size.  Even though a larger font may be closer, the larger one may be too large for proper layout on a finite screen; therefore, the implementation yields only smaller fonts.  As the resolution has influence over the observed point size, the implementation corrects for this [see ``Screen Resolution'' below].
    7. Weight.  The weight or ``boldness'' of the font.
    8. Slant. Oblique and italic may both be matched for a slanted font.
    9. Set Width. Wide or narrow (condensed) printing.

    After having tried all the members of the specified type face, if no match is found at all, the FXFont implementation tries a number of other common fonts, based on additional hints:

    • If no hints are given, or if the hint FONTHINT_SWISS is given, the face ``helvetica'' or its substitution will be tried;
    • Next, if no hint is given or if the hint given is FONTHINT_ROMAN, the face ``times'' or its substitution will be tried;
    • Next, if no hint given or if the given hint was equal to FONTHINT_MODERN, the face ``courier'' or its substitution will be tried;
    • After that, if no hint is given or if the hint was FONTHINT_DECORATIVE, the face ``gothic'' or its substitution will be tried;
    • Finally, if all else fails, the implementation will try a number of ``fallback fonts'' which have been determined to be commonly available.

    If all the above failed, yet there is at least one font on your system, then you should report this problem on the FOX mailing list...

Screen Resolution

    Since current-day analog monitors can stretch and shrink the visible field of the display, the actual resolution is typically not exactly 75dpi or 100dpi.  To get a font's point size as close to the desired pointsize as possible, FOX adjusts for the actual screen dpi relative to the font's dpi.For example, suppose we have a font such as:

    -adobe-helvetica-bold-r-normal--12-120-75-75-p-70-iso8859-1
    

    This font is a 12-point font designed for a 75 dpi device.  If your monitor however is set to display 90 dpi, the font would be too small.  The implementation can correct for this by multiplying the font's point size by (75/90) which means visually this font would actually be more like 10-points on your monitor.  Thus, to get a font designed for 100 dpi to display as 12 points on your monitor, we should search for a font which is slightly larger than 12-point; to be exact, we should be looking for a font (90/75)*12 = 14.4-point font.

    On many systems such as work stations, the machine is shipped with accurate information about the particular monitor supplied with the system;  on such systems, the font implementation of FOX will correctly determine the right resolution to use.  On PC's however, hardware is mixed and matched from different sources, and the reported screen sizes may be incorrect, causing fonts to bigger or smaller than requested.

    When the system reports the wrong resolution, you can easily correct that by setting the resolution yourself using the registry database. On my system, for example, the XFree86 X Server reports 75 dpi, while I really have 100dpi.  So I change my registry database as follows:

    [SETTINGS]
    screenxres = 100
    screenyres =  100
    

    These entries need to go into the ``Desktop'' file so that all FOX programs will be aware of this, regardless of vendor or application name.  For more about the registry, see the section on FXRegistry.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/footer.html000066400000000000000000000004661326741342000155740ustar00rootroot00000000000000
    There are several different mechanisms to connect Widgets, the sources of events, and their targets, or the application code that you write.
    I have evaluated several different callback mechanisms, each have their different strengths and weaknesses.
    • Function pointer [Motif, Xt].
      • Very dissatisfying for C++ programs, as it is not object-oriented.
      • Extra callback parameter [call_data] is not type safe.
      • This is mostly interesting for procedural programming styles, e.g. using C.
      • Hard to serialize (or save to file) the connectivity.

    • Message handling with fixed routing [Microsoft Foundation Classes, Borland C++ Builder].
      • Can bind source and target together at run time.
      • Need fixed message routing scheme, since there is no specific target.
      • Need to keep the messages globally unique (because of the fixed message routing scheme).
      • Message-delegation [forwarding of messages to another party] is easy.
      • GUI widgets can not receive messages, only sent them (because of a fixed message routine scheme).
      • May be not type-safe.
      • Easy to serialize the connectivity.

    • Signal/Slot [Qt (Preprocessor), C++ templates (Gtk--, I believe)].
      • A special preprocessor does not seem very elegant to me [Qt].
      • A template-based signal/slot system is elegant from a theoretical point of view.
      • Templates are instantiated at compile time. This means it's going to be difficult to hook up objects which are only known at run time [like e.g. loading a custom control from a DLL].
      • To connect a message source and a target, you actually construct a connector object that is parameterized by the target; you can not do this unless you know the type of the target [This is because pointer-to-member-of-class types can only be downcast!].
      • Hard to serialize, because a pointer-to-member-of-class contains a function-pointer when the member is not a virtual.

    • Message handling with specific target [FOX, NeXTSTEP (using Objective-C of course)].
      • You can connect at run-time, because connectivity does not involve compile-time code generation like with a signal-slot mechanism. Run-time connectivity is needed because you may load objects dynamically from a DLL, from deserialization, or you may want to write an GUI-Builder which interactively connects things up.
      • There is no need for a globally unique list of message ID's. The message is addressed to a specific target, and the same message-ID can be reused by another target for another purpose.
      • Widgets may receive messages as well as send them. This is very important for component-based programming paradigms. It is also important to note that this allows for ``glue-less'' programming; for example, a message ID_HIDE to any Control will hide the Control.
      • No special preprocessor is needed. The compiler automatically keeps the message-ID's straight [see above].
      • It is not type safe, in the sense that if you do need to interpret the void*, you would need to cast. Note however that in the vast majority of cases, the void* argument is not used; when it is used, the use is pretty consistent:- what do you think the void* refers to when the message-id is ID_SETINTVALUE?
      • In the case of NeXTSTEP, the argument signature was a part of the message, which means that for an object to implement the message, the signature had to match up; this was type-safe while at the same time very flexible.
        Alas, FOX was written in C++, not Objective-C.
      • You connect things simply by passing the target-pointer in the constructor when you create a widget.
      • FOX supports message delegation very easily.
      • You can actually turn FOX into a type of template-based signal/slot system of you make FXObject-derived connectors!
    As you see, FOX's message handling system may not be type safe, but it is very compact, allows for run-time connectivity, is
    serializable, and favors component-oriented development.
    Were FOX written in Objective-C, one could achieve the goal of type-safety as well; C++ clearly limits our choices.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/foreword.html000066400000000000000000000230101326741342000161130ustar00rootroot00000000000000 Home
Documentation: Foreword [Remove Frame]

    FOX stands for Free Objects for X. It is a C++ based class library for building Graphical User Interfaces. Initially, it was developed for LINUX, but the scope of this project has in the course of time become somewhat more ambitious. Current aims are to make FOX completely platform independent, and thus programs written against the FOX library will be only a compile away from running on a variety of platforms.

    The idea of designing and implementing something like FOX started in spring '97.  In the course of using several different systems, ranging from OSF Motif, NeXTstep,  MS Windows,  and Intergraph's System 5, the author has developed some conception of what the ideal GUI toolkit was supposed to look like.  After a couple of false starts, and some experimentation with various ideas under different platforms, FOX was born.

    Because it draws from so many sources, most experienced GUI programmers will probably recognize a few of the underlying concepts; but only FOX brings all these together in one integrated system.

    Some of the ideas and concepts underlying the FOX system are listed below:

    • Ease of Development.  Developing Graphical User Interfaces is a fairly complicated process. FOX reduces the burden on the developer significantly:

      • Orthogonality.  A few powerfull concepts that can be recombined in many intuitive ways is preferable to a hodge-podge of ad-hoc solutions. In a well designed orthogonal toolkit, the developer will be able to transfer knowledge gained from one scenario to another.

      • Consistency.  Consistent naming of member functions, consistent ordering of arguments and default parameters, as well as consistent behaviour of each Widget makes the system much more easy to learn.

      • ConcisenessEvery line of code not written is a correct one. So minimizing the number of lines of code to accomplish the job is a Good Thing. FOX helps with this by being able to create and initialize most Widgets with a single line of code. The C++ capability for default parameters to arguments is heavily used, and a lot of glue code to cement Widgets to each other is eliminated completely by the ability of FOX Widgets to send messages to each other.

    • C++ Based. Since FOX is completely written in C++ from the ground up, developers can easily augment the basic toolkit with their own Widgets. Since FOX is not a wrapper around some legacy toolkit, these third-party Widgets are full citizens in the FOX system. Many GUI toolkits have been written before the advent of C++. Some toolkits have subsequently been repackaged into C++ wrapper libraries, to give the C++ programmer the feel of working with a C++ based toolkit. However, this approach denies users some of the benefits of C++, such as derivation and overloading to induce new behaviour, as the basic functionality is not really implemented in C++.

    • Modern GUI Features.  FOX provides a rich set of Widgets, and moreover, this set is easily extensible by application programmers. In the core system, several basic facilities are supported which are part and parcel of current GUI development:

      • Icons and Images.  FOX provides easy to use facilities for creating icons and images.  Resources such as Icons and Images can be compiled into the application, and may be instantiated as needed. FOX supports both GIF and BMP image formats.

      • A Registry, or persistent settings database whereby applications  can save certain parameters such as recent file list, customizations, and so on.

      • Tool Tips.  Controls in FOX support Tool Tips or Balloon Help.  When the user hovers the cursor over a button or other control, a small yellow window appears near the cursor with further information detailing the button operation.

      • Status Line Help.  Besides Tool Tips, FOX also supports additional help on the status line for each Control.  The Status Line typically displays more extensive help information about the Control the cursor is over than a Tool Tip.

      • Floatable Tool Bars.  Toolbars can be interactively dragged and docked or undocked. Dock sites allow for parking of toolbars side-by-side.

      • Tab Books.  Ever more sophisticated applications need considerable more screen real-estate.  With Tab Books, several panels of GUI Widgets may be placed on top of each other and flipped over, similar to browsing through file folders.

      • Tree Lists.  Many applications need to present hierarchically organized information to a user.  The FOX Tree List provides a concise view of a hierarchy, allowing users to open and close sublists with the click of a mouse.

      • Multiple Document Interface (MDI) Widgets.  FOX supports both Single Document Interface applications as well as Multiple Document Interface applications, by providing convenient Widget sets for this purpose.

      • 3D OpenGL Widgets.  FOX supports simple, as well as advanced 3D Widgets which make it easy for developers to get started writing 3D enabled applications.

      • Drag and Drop.  FOX supports Drag and Drop using XDND. Using drag & drop, a user can move data objects from one Widget to another, even between applications running on different machines.

      • Selection.  FOX supports the transfer of data between Widgets (possibly in different applications) through the X Selection mechanism.

      • Clipboard Support. Ability to transfer arbitrary data structures between programs via cut & paste, even between programs running on different machines.

      • Timers, Idle Processing.  FOX supports both scheduled timers, i.e. pseudo-events that will cause some action to happen in the future, as well as Idle Processing, or background actions that execute while no activity is performed by the user.

      • WYSIWYG Rendering. FOX's device context classes provide abstract rendering facilities which allow a single rendering code to produce output to an [user extensible] variety of output devices.

      • Facilities to watch network sockets, pipes, and other i/o channels, as well as signals. Also supported are a thread class, semaphores, mutexes, conditions. The FOX library uses reentrant library functions when compiled normally.

      • C++ Exceptions are used in the library to signal errors during allocation of memory, windows, and other system resources, permitting application to handle low-resource conditions gracefully.

    • GUI Updating.  FOX makes it easy to keep the graphical user interface consistent with your application data structures using a unique facility called GUI Updating.  In essence, the FOX Controls such as Buttons, Sliders, and so on will continuously interrogate the application  and change their state; for example, from enabled to disabled, checked to unchecked, pressed or unpressed, etc.

    • Target/Message Based.  FOX is a target/message based system, in that all GUI events or actions are ultimately translated into messages sent between objects.  As FOX Widgets are also objects, glue-code which would normally have to be written by the developer can often be eliminated by simply making one FOX Widget directly the target of another.  In some cases, these messages may even be bi-directional.

    • Platform Independence.  Applications using FOX are not dependent directly on X-Windows.  As all platform-dependencies are completely hidden from view by the FOX System (applications don't even include X-Windows header files!!), such applications will be easily ported to other platforms, simply by recompiling.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/fox.html000066400000000000000000000015671326741342000150750ustar00rootroot00000000000000 fox-toolkit.org fox1.6-1.6.57/doc/goals.html000066400000000000000000000275611326741342000154100ustar00rootroot00000000000000 Goals and Approach
Goals and Approach [Remove Frame]

Goals

    Developing a single application for multiple platforms is a difficult task.  The most significant issue is the need for a clean solution for developing Graphical User Interfaces [GUI's].   FOX aims to address this by providing a single GUI library that can run on different computer hardware and operating system environments.  The benefits to application vendors and developers are clear:
     
    1. Development effort to support multiple environments is substantially reduced.  After development, your FOX based application is only a compile away from running on other operating systems.  When multiple hardware and software combinations are required by customers operating in a heterogeneous environment, using a single GUI system such as FOX is clearly the most cost-effective method to achieve the goal.

    2.  
    3. Availability of your software on other platforms will engender additional revenues.   Without the necessity of additional development  work, the cost of  which would have to be amortized over the number of sales, additional revenues can be engendered by having your software be available on multiple hardware and software environments.  Software development is a costly undertaking; because of this, software vendors typically limit the number of platforms to a small subset of the platforms being used by all customers, effectively leaving certain customers in the dark.  FOX allows applications to be developed on one platform, then simply recompile the application on a number of other hardware/software systems.  Because the cost of doing so is negligible, this approach will be able to generate positive cashflow even with low sales volumes.

    4.  
    5. Captive audience.  If the application you're developing is available on all platforms, you may be able to create a captive customer base on hardware/software systems where your competitor is absent; you may in fact even be able to charge premium prices.  Using the additional revenues derived from these customers, your product will be able to derive a steady addional revenue stream which will allow you to compete more aggressively against your single-platform competitor.

    6.  
    7. Higher Quality. For programmers, the benefits of multi-platform development v.s. single platform development are the additional confidence and code quality that compiling under different environments will give.  For example, I have compiled FOX on a number of different systems, and different compilers will discover different types of code bugs.  By compiling on all these different systems, FOX has gotten quite a bit better in the course of time.

    8. Control Your Destiny.  Programmers understand it as a matter of course that they need to continually work to track the changes in a system's API's.  But what if the system vendor is also your competitor?  In such a case, you will loose, sooner or later.  The FOX GUI Library provides a platform-independent escape hatch that relies only on core system facilities which can be expected to be present on any modern operating system.

Approach

    FOX attains the goal of platform independence by eliminating all  system dependencies from its public interfaces.  In fact, a typical FOX application may not even need to include any system-specific header files at all!  By not including e.g. X-Windows header files, applications can not even accidentally slip up and introduce platform dependencies. This strategy is also carried out inside FOX itself.  Thus, large parts of FOX are in fact defined entirely in FOX itself.  The only dependencies are concentrated in a few select base classes where this couldn't be avoided.

    The following salient points highlight some fundamental benefits of FOX vis-a-vis other purported platform independent toolkits:
     

    1. Eliminate all platform specific header files.  Applications should only include header files from FOX, and a few header files for such basic system services as opening files etc.

    2.  
    3. Internal Layering. FOX itself relies largely on FOX base classes, and therefore a large fraction of FOX itself is platform independent as well.

    4.  
    5. Rely only on low-level system facilities. FOX relies only on core system facilities, and does NOT wrap native GUI libraries or toolkits.  This has the following benefits:

    6.  
      • Identical behaviour. The behaviour will be close to identical on all systems, as the behaviour is completely controlled by the FOX implementation, rather than some underlying library.

      •  
      • Identical looks. FOX applications will look the same no matter what system you're running it on.

      •  
      • Ability to subclass.  Because FOX is written from the ground up in C++, and is NOT a C++ wrapper around some other legacy toolkit or library, FOX Controls may be subclassed and extended by application programmers.  Moreover, if these additions can be done by calling upon FOX built-in facilities, those additions will be platform independent also.

      •  
      • Higher Quality. It is a given in software development that those facilities which are most frequently used are the ones which are most stable.  Thus, by using core system facilities instead of higher-level transient API's, the impact of the underlying system's instability is minimized.  A chain is as strong as the weakest link, and while I can not control the quality of the links, I can minimize the number of them.

      •  
      • Higher Speed. Eliminating layers between FOX and the underlying system not only increases the application's quality, it will also make it faster, and reduce memory overhead.

      •  
      • Go to the Bedrock. FOX's core facilities needed from the target system are things like mouse/keyboard event handling, and basic graphics facilities such as drawing of lines and rectangles [and some other system facilities].  In most operating systems, these are fairly mature API's and not subject to much change.  If you want to build a big building, you need to go down to the solid bedrock.  This is what FOX does.

      •  
    7. FOX is extensible.  The FOX library is designed to be open-ended and extensible. What this means is that unlike other libraries which take the approach of wrapping legacy GUI toolkits, FOX may be extended with Custom Controls and Widgets which will set your application apart from the others.  Building Custom Controls is extremely easy in FOX, as it is essentially just a matter of C++ subclassing.

    8.  
    9. FOX is available under Library GNU Public License. Since FOX is distributed in source form under LGPL, you have the ability to make changes or extensions to FOX to suit your needs.  Having FOX inspected by 1000's of programmers all over the world will iron out any bugs it may have very quickly.  This process is already under way.

    I care a great deal about software quality; I imagine, so do you.  In the course of my programming life, I have ran into many situations where the bugs I needed to fix were not in my own code, but in someone else's, and of course I didn't have the source.  Thus, the quality of my own software was limited by the quality of someone else's.  Problem is, the developers of the libraries and software I depend on are frequently not motivated to make their software correct.

    This has made me a firm believer in the GPL or Open Source model of software development. FOX was started in part because I didn't want to explain to our customers that the reason X or Y didn't work was because of the broken software or libraries on their machine.  The only way one can create high-quality applications is to bring as much of the underlying system under one's control as possible.  Hence the Go to the Bedrock philosophy.

    FOX is not perfect.  But as the source code is available under LGPL,  it has the advantage that its imperfections can be addressed as soon as they are discovered.

Why Windows?

    Some people may argue that porting FOX to Windows ``helps'' Microsoft.  It doesn't.  Porting FOX to Windows does however help application vendors:- instead of subjugating to a proprietary lock-in GUI environment, they can now ship their application on a large variety of platforms, like LINUX, and this with little or no additional effort, and derive additional revenues.

    In addition, being distributed under LGPL, it lowers costs, and does not incur any license fees for distribution.   Being distributed under LGPL also has the concomittant benefit that a large number of people may inspect the source code, and spot its inevitable deficiencies; thus, more bugs are found and they are found more quickly.  Remember, the person which is the most motivated to fix a bug is the one bitten by it; under the Open Source development model, this person can actually localize, and possibly fix the bug himself, and contribute those changes to the library.

    Finally, I believe application developers will find the FOX library a more attractive alternative.  For a software developer, the FOX Library is far more easy to learn, and offers some unique benefits, such as tying Widgets [Controls] together with little effort, being able to subclass from existing Widgets to make custom ones, and last but not least the ability to modify FOX's source code itself if necessary.  FOX represents what I consider to be the ideal GUI Library; I wrote FOX to use it myself!

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/gpgkey.html000066400000000000000000000054541326741342000155660ustar00rootroot00000000000000 Documentation: Keyboard Focus
Documentation: Keyboard Focus [Remove Frame]

    In case you want to contact me PRIVATELY, here's my GPG Key:
    -----BEGIN PGP PUBLIC KEY BLOCK-----
    Version: GnuPG v1.2.3 (GNU/Linux)
    
    mQGiBD2vfJcRBACQsfpoxj7Gjh+I4oATmEJfBcLt8o6rzZl3MzPr2wwEL+afGmIc
    RAK9LNzQ+0LQIVI6UoiChxjuO6gu2KNg9cLRGiXDZaobzMAxsC75w38KQOL8sJvy
    QWITizSTs2NOtGvisrsKyQv5mXa1J061P1u14vtDoZnXPwj2+qVBtwSDdwCgmJJN
    b76241OTrkWxyTSUytIyf1ED/2fq9BLbe0XpD2txK/JpKtCRuyrpWRTIaoGYb9qg
    l82gn7Z7MD2KhQh5v88rl36nA1vV3IeYWXxOGxNwe0SErG+Lc9RXweuIruo1TKGA
    en0Zhs8GKn5eCVOoxCBP7EQ9Wpln7LqVCPhtanss/cb2nSVQhMOTAMJsuzbUfjKo
    IFFWA/9Y6E+bhf9so44lh6WM/oZKK501JsROoRxTUbP/7xMbk95lgk3DO4PbljYK
    TjLD3Iqmk6i6r27KGwOg/VYJ4lOc1XGaO/T8WtWqikFV1WyCpyCV16t4harBc84Y
    YDn/sXY15OQ/ndbxAtFzzyD3tfErjdmQJUoMSYjh9TUoZutqQrQ8SmVyb2VuIHZh
    biBkZXIgWmlqcCAoRk9YIERldmVsb3BlcikgPGplcm9lbkBmb3gtdG9vbGtpdC5v
    cmc+iFkEExECABkFAj2vfJcECwcDAgMVAgMDFgIBAh4BAheAAAoJEJHVfDiFkJAb
    /2kAmwc3F+EZN2TJYYQbRPSiVaZxMOwbAKCGmeBs4zlKNZVNGy2PbcxZCKhLnYhG
    BBARAgAGBQI9s5LjAAoJEA9XtVuul0L/bvcAnAmj0ApNLpyVkjF83Q/2IHhIQblY
    AJ4vBaxGjpyaHtDmJG8dmbvfe2mDo7kCDQQ9r3yfEAgAtVQlwNSWqkdRvsB9bhKa
    JI/NaOt6JW3zdlf/IXXpjUGBOwSQEow/e1yHcCn/cqTqO44csz4fXnl++sBCBUHl
    QB51f3YUYJuCmzHBqhDXXsSCRReRtXV7euDaFJghESAHapR99Wh2C1qFgB54gmod
    HcY2RVmotZwLgno+HIiz/ejYBz8NBPv2HXaw68kZh63HM5LaAO3liYIQmb8CT9Q9
    kLIuv4pzLHNRn1E++jJTv8+PHUjjmggWnvY7h4cA+2SFYA856XlGqyYPihp79J+0
    FtrKVLzxZ+1z53rF79AvQCZtXBnfWQYYB84W0Bno1GR24qayhMsCq44G8YUVDdgS
    WwADBQf+JXl8lKO1N+Mg898uV4dNAkfFA/V84dp+BtO8v7VMXD/7Vwxixlre118n
    I1x3NmWCnk5pg2D+XBrsKdL15njnyBwIJ0EQ3ZIAfnIGZNgI+4Pm/NKIq7ueGjL5
    aPJXL+bFNxTfuQvh+5dt7jP8nObpZ77it+pThTt3sxMea/N0Z/y6f4wc41wyyRyU
    56n30WwB0wBiWK2z67r3p0Bh61zHA04WNnvw1lvI02o0CvhTP9YuSAhncEFyMDs5
    2r5jXrGd5E4RuxTjzAbpaKWUhtgti2up11lc9hlthluYDSzQQr70ptOagv2u+5d8
    HJ98EDEXY5KIX/zLjVN1iE241JXDTYhGBBgRAgAGBQI9r3yfAAoJEJHVfDiFkJAb
    lTUAnRojkProhc424xEhIc55AdX9OSXHAJ9mlnDttPplbWC8E8Aga0p4g/4jyw==
    =8wYw
    -----END PGP PUBLIC KEY BLOCK-----
    

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/guiupdate.html000066400000000000000000000443421326741342000162660ustar00rootroot00000000000000 Documentation: Automatic GUI Updating
Documentation: Automatic GUI Updating [Remove Frame]

What is Automatic GUI Updating?

    Traditionally, Controls such as Buttons and Sliders have been used to provide notifications to the application code that a certain command is to be performed, or some value has changed.  For example, if one moves a Slider a little bit, a notification message informs the application that a new value is available; at the same time, the Slider's position will give a visual cue about the value being transmitted to the application code.

    But suppose one were to add a TextField to control the same variable.  If we type into the TextField, the new value will be transmitted to the application just fine, but since the slider was not moved, the visual position of the slider now no longer represents the value that the program is actually working with.

    Traditionally, GUI developers have solved this problem roughly like this:

    • When receiving a message from the Slider Control, the program accepts the new value, and then turns around and sets the new value in the TextField.

    • When receiving a message from the TextField, the program similarly accepts the new value from the TextField and now updates the Slider.

    The above pattern seems eminently reasonable.  Up till now, this was how it was done [although certain toolkits  didn't  make even this simple approach very easy!].

    However, now imagine a large program being implemented by several developers, and a graphical user interface that has hundreds, perhaps even thousands of Controls.   All these controls manipulate a bunch of data in the application program.
    We can see the problem with this approach: how is developer A supposed to know that the Dialog panel being designed by developer B is to reflect the new values for the variables being modified by developer A's code?  Clearly, this problem can grow  into a combinatorial nighmare.

    The GUI Updating facility implemented in FOX can largely eliminate this problem.  In a nutshell, the idea is that in FOX, the GUI Controls are bi-directional:

    • A Control can  notify  the application program to inform it that the Control has been given a new value by the user. One could call this a ``push.''

    • A Control can also interrogate the application about the current state of the application and its data structures, so that the Control may properly reflect this graphically.  This one could call a ``pull.''

    Why is this good?  Because it compartmentalizes large scale GUI design, and simplifies coding.   In the above example, developer B wouldn't even need to talk to developer A.  He would simply implement [for each Control in his Dialog panel]  not only the ``command'' messages which notify his routines about user inputs, but also the ``update'' messages by which the Controls ask for the values they should be displaying.

    Coding complexity is reduced because instead of N command messages each updating M Controls [for a total of N x M combinations], the developer would only have to implement N command messages and M update messages [just N + M combinations].  Complexity is also reduced because command handlers just perform their operation on the application data structures, and update handlers simply update the corresponding controls given the state in which they found these data structures.

    A common use of the GUI Updating mechanism is the disabling or ``graying-out'' of controls when they're not applicable under certain conditions.  For example, a Save File Button may be made unavailable when the application hasn't loaded a file yet.   Other common uses include hiding or showing of Controls in the GUI based on context or which ``mode'' an application is in.

GUI Updating Example

    An example of GUI Updating is given in the ScribbleApp program.  The ScribbleApp program allows lines to be drawn in some canvas.  To clear the canvas, the users invokes the Clear Button.  The Clear Button is to be available only when something has been scribbled; otherwise, it is to be grayed out or desensitized.  One can accomplish this in FOX as follows:

    // Construct the Clear Button
    
    new FXButton(buttonFrame,"&Clear",NULL,
                 app,ScribbleApp::ID_CLEAR,
                 FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,
                 0,0,0,0,10,10,5,5);
    

    This constructs a new Button object, which will send a message ID_CLEAR to the application object (app). In the application object, we catch two message types from the Clear button:

    // Message Map for the Scribble App class
    
    FXDEFMAP(ScribbleApp) ScribbleAppMap[]={
      FXMAPFUNC(SEL_LEFTBUTTONPRESS,   ScribbleApp::ID_MOUSE,  ScribbleApp::onMouseDown),
      FXMAPFUNC(SEL_LEFTBUTTONRELEASE, ScribbleApp::ID_MOUSE,  ScribbleApp::onMouseUp),
      FXMAPFUNC(SEL_MOTION,            ScribbleApp::ID_MOUSE,  ScribbleApp::onMouseMove),
      FXMAPFUNC(SEL_COMMAND,           ScribbleApp::ID_CLEAR,  ScribbleApp::onCmdClear),
      FXMAPFUNC(SEL_UPDATE,            ScribbleApp::ID_CLEAR,  ScribbleApp::onUpdClear),
    };
    
    

    The SEL_COMMAND message indicates that the Clear button has been pressed; its action will be to clear the drawing canvas:

    // Handle the clear message
    
    long ScribbleApp::onCmdClear(FXObject*,FXSelector,void*){
      FXDC *dc=canvas->DC();
    
      // Erase the canvas
      dc->begin(canvas);
      dc->setForeground(FXRGB(255,255,255));
      dc->fillRectangle(0,0,canvas->getWidth(),canvas->getHeight());
      dc->end();
    
      dirty=0;
      return 1;
      }
    

    The SEL_UPDATE message is sent when the Clear Button updates itself.  The GUI-Update handler determines whether the Clear Button should be sensitized or not depending on whether any drawing has taken place in the canvas; this is kept track of through a flag variable dirty:

    // Handle the GUI Update from the Clear button
    long ScribbleApp::onUpdClear(FXObject* sender,FXSelector,void*){
      FXButton* button=(FXButton*)sender;
    
      // Button is available when canvas is dirty only
      dirty ? button->enable() : button->disable();
      return 1;
      }
    
    

    Note that in this case we know the origin of the message (the sender) to be of the type FXButton, so we can simply cast the sender object down to the appropriate type. In general however, we may not always know [the only thing we know is that the sender is of type FXObject].  In that a case, the GUI Update handler should send a message back to the sender. We can safely do this since all FOX objects are derived from FXObject, and FXObject's can be sent messages.  This leads to the following code:

    // Update sender
    long ScribbleApp::onUpdClear(FXObject* sender,FXSelector,void*){
      sender->handle(this,dirty ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL);
      return 1;
      }
    

    Many FOX Widgets understand the ID_ENABLE, and ID_DISABLE messages;  if however, a message is sent to a sender that doesn't, nothing bad will happen as no message handler will be associated with the message.

When is GUI Updating Performed?

    There are two sides to this question:- under what conditions can a Control be updated, and when is the updating actually done. With regard to the first part, a Control can be updated whenever it is not currently being manipulated by the user.  In other words, a Control is normally in a ``pull'' mode, in that it tries to interrogate the application to determine the value it needs to display graphically.  As soon as the user starts to manipulate the Control, it switches to a ``push'' mode, in which the Control becomes an input of new values to the application.

    As far as the second part of the question goes, the FOX library performs the GUI Updates when there isn't much else to do, that is to say, the system is about to block and wait for events from the user.  Furthermore, the GUI Updates are only performed when previous events have been dispatched and handled. This is why it is important to return 1 or 0 in your message handlers.:

    • If you return 1, the message is considered handled, and a GUI Update pass will be performed by FOX.
    • If you return 0, the message is considered unhandled, and since unhandled messages should not have changed the application's state, no GUI Update is performed.

    For increased efficiency, the system checks for new events between each GUI Update message, to prevent ``event-deafness'' for extended periods of time.  Even so, it is important to restrict your GUI Update message handlers to small routines, and to not perform any major computations in GUI Update message handlers.

Automatic Gray Out or Hide

    FOX also has the option to automatically gray out or hide certain Widgets.  Both options work very similar, and differ only visually.  When automatic grayout is in effect, the Widget will be automatically grayed out (disabled, or desensitized to user inputs), when one of the following is true:

    1. The Widget's target is NULL.
    2. The Widget's target does not handle the Widget's SEL_UPDATE message.

    Why is this useful?  If a Widget's target is an object that performs some sort of message delegation (for example, FXMDIClient and FXMDIChild do this), then the ability to handle a certain SEL_UPDATE message may depend on the delegate object that is in effect at the time the update message is sent.   If the particular delegate in effect does not handle the update message, there is no handler to make a Widget assume the correct state.

    With automatic gray out, however, the absence of a handler for the SEL_UPDATE message can be turned into an action to gray out the Widget instead.  This will keep the GUI consistent even in the absence of update message handlers.

    The automatic gray out technique is of particular significance when using MDI (Multiple Document Interface) widgets as both FXMDIClient and FXMDIChild perform message delegation.  Messages from the pulldown menus are typically sent to the FXMDIClient, and then subsequently forwarded by the FXMDIClient to the active FXMDIChild (Sometimes, there are no FXMDIChild windows, and the message can not be forwarded and then the message handler returns 0).

    As automatic gray out of Widgets will cause a gray out if no handler for the SEL_UPDATE message is found, it is imperative that the SEL_UPDATE must always be handled when the Widget should be sensitive.  The update message handler does not necessarily have to do anything, it just needs to return 1.

    To handle this common situation, FXWindow defines just such a message handler for you:  FXWindow::onUpdYes() will do nothing but show and sensitize the Widget that is the sender of the message, and return a 1.  You can simply append this to your message map as in:

      FXMAPFUNC(SEL_UPDATE,ID_MYMENU,FXWindow::onUpdYes)
    

    That will take care of it.  Of course if the update message should do something, you should write your own handler and make it return 1.

Delayed Repaint/Layout

    Procrastination is Good Thing [even though my parents always told me otherwise :-)].  The motto is the fastest thing you can do is nothing at all. Indeed, my lowly Pentium Classic can do ``nothing ''as fast as the fastest supercomputer!

    All this seems pretty obvious, but what does it mean for GUI systems?  It means we should try to avoid doing the two most expensive things that GUI systems have to do:

    1. Drawing onto the screen.  Drawing generates X protocol,  and causes context switching between client and display server, and is therefore very expensive.

    2. Layout of widgets.  Layout involves recursing up and down the Widget Tree, and computing a bunch of stuff such as sizes of List contents, etc.  In addition, layout also causes lots of stuff to be redrawn!

    So it is clear that these two are to be avoided at all cost.  Here's how FOX does this:

    1. Expose or repaint events are stacked up until the system has processed all user input events.  Moreover, exposed regions are compounded so that in most cases only one repaint is necessary.

    2. Layout is performed during the GUI Update phase; in other words, layout is delayed similarly to repainting so that only a single big layout remains to be done at the end [I believe FOX is unique in this; having scrutinized many systems, I have not found any that incorporate this feature; I think it is therefore safe to say that I invented this...].

    3. Size-caching is performed by certain [complex] Widgets to avoid potentially expensive size computations; for example, resizing a ScrollWindow does not necessarily change the size of the content.

    So how well does this all work?  It Really Rocks!  The delayed painting is important, as it prevents stacking up huge piles of expose events when for example dragging [solid-, or opaque-dragging] windows over FOX applications.  By NOT doing the unnecessary work, the system actually catches up more quickly, and never falls behind more than one repaint.

    The delayed layout is responsible for the extremely fast startup times of FOX applications.  As hundreds of Widgets are being added during construction of an application's GUI, recalculating layout after each addition really kills startup performance.
    Delayed layout benefits performance each time many GUI Widgets are added or removed, or if layout hints are changed with widespread effects.  It also makes opaque resizing [supported by a few X Window Managers] quite fast.

    Several advanced GUI systems have added special freeze/thaw semantics to temporarily suspend layout calculations.  In FOX, this feature is automatic, and application-wide in effect.

    As the delayed layout is performed as part of the GUI Update process, GUI Update message handlers should avoid making changes to Controls that could cause layout computation, as these changes will not be handled till the next GUI Update cycle.

    One more speed-feature related to use of Brian Paul's excellent Mesa graphics library.  With Mesa, double buffering is implemented using a software backbuffer.  Thus, after having drawn this back buffer,  an expose event can repaint the dirty area simply by blitting back this back buffer, instead of re-rendering OpenGL commands [which can be very expensive indeed!].

    Hence, FOX distinguishes between ``synthetic'' repaint events and ``non-synthetic'' ones.  Synthetic expose events are those that originate from within the application.  When receiving a synthetic expose event, the OpenGL will have to be regenerated; for non-synthetic expose events, the back buffer can be blitted back.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/header.html000066400000000000000000000017551326741342000155300ustar00rootroot00000000000000 fox-toolkit.org - Documentation
Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members

fox1.6-1.6.57/doc/home.html000066400000000000000000000162201326741342000152210ustar00rootroot00000000000000 Home
Welcome to FOX

What is FOX?

    FOX is a C++ based Toolkit for developing Graphical User Interfaces easily and effectively. It offers a wide, and growing, collection of Controls, and provides state of the art facilities such as drag and drop, selection, as well as OpenGL widgets for 3D graphical manipulation. FOX also implements icons, images, and user-convenience features such as status line help, and tooltips. Tooltips may even be used for 3D objects!

    Considerable importance has been placed on making FOX one of the fastest toolkits around, and to minimize memory use:- FOX uses a number of techniques to speed up drawing and spatial layout of the GUI. Memory is conserved by allowing programmers to create and destroy GUI elements on the fly.

    Even though FOX offers a large collection of Controls already, FOX leverages C++ to allow programmers to easily build additional Controls and GUI elements, simply by taking existing controls, and creating a derived class which simply adds or redefines the desired behavior.

    One of the prime design goals of FOX is the ease of programming; thus, most controls can be created using a single line of C++ code; most parameters have sensible default values, so that they may be omitted, and layout managers ensure that designers of GUI's do not have to worry about precise alignments.

    Another nice feature of FOX which significantly reduces the number of lines of code which have to be written is FOX's ability to have widgets connect to each other, and passing certain commands between them; for example, a menu entry Hide Toolbar can be directly connected to the Toolbar, and cause it to hide.

    Finally, FOX makes it easy to maintain the state of the GUI in an application by having the GUI elements automatically updating themselves by interrogating the application's state. This feature eliminates the large amount of effort that may go into sensitizing, graying out, checking/unchecking etc. depending on the application state.

FOX is Platform Independence!

    The list of platforms is growing! Currently, we have FOX running on a large number of operating systems, ranging from Linux, FreeBSD, SGI IRIX, HP-UX, IBM AIX, SUN Solaris, DEC/Compaq Tru64 UNIX, to MS-Window operating systems like Windows 9x, Windows NT, Windows ME and Windows 2000. Since most of the FOX implementation is completely oblivious to the underlying platform (in many cases it is not even including header files), applications work virtually identically on all these platforms.

    For example, here is the FOX textedit sample application running under Windows NT.  And here is the same application running on a Silicon Graphics Octane system.

Support & Mailing Lists

    We now have two mailing lists:

    Announce List

      The announce list is a low-traffic list on which new releases of various software based on FOX will be announced, including new releases of the library itself. Discussions on various topics however should preferably take place in the users list, to prevent swamping people's mailboxes. To subscribe, send a mail to foxgui-announce-request@lists.sourceforge.net with the word subscribe in the message body, or fill out a web-based subscription form.

    Users List

      The users list is intended for discussion on various FOX topics between developers and/or users of the FOX library or applications based on it. If you have questions, feel free to post your questions here, as many people [including myself] are only too happy to answer them. To subscribe, send a mail to foxgui-users-request@lists.sourceforge.net with the word subscribe in the message body, or fill out a web-based subscription form.

    We recommend at least subscribing to the announce list to stay abreast of new releases of the library and applications.

    The announce list is being archived by GeoCrawler, and the discussion list is there also. This facility was provided automatically be switching over to Source Forge. The old FOX mailing list has been archived at: Yahoo and at eScribe. This has been set up by Thomas Jordan.
    FOX project pages are provided at the FOX Source Forge web site.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/icons.html000066400000000000000000000427021326741342000154100ustar00rootroot00000000000000 Documentation: Icons and Images
Documentation: Icons and Images [Remove Frame]

    Icons and Images are part an parcel of attractive, user-friendly Graphical User Interfaces these days.  Consequently, considerable effort has been expended in designing FOX to allow icon- and image-rich applications to be developed with the greatest ease.
    In FOX, Images and Icons are objects that represent picture data.  Images are simple pictures, whereas Icons are pictures with a shape mask that may be used to effectively mask out a certain area of the picture, and allow part the background to peek through as if the picture were transparent in some areas.
    Both Icons and Images may have Client side pixel data as well as an X Server side pixmap representation.  The typical application will construct the client-side pixel data by filling the Icon or Image with a picture, then create the server-side representation [after contact with the X Server has been established] by calling icon->create(), which creates an server side pixmap and uses a call to  icon->render() to fill the pixmap with the pixel data .

    Note that this is a two-step process which is very similar to that of constructing and creating regular FOX Widgets.  This is no accident.  The FOX philosophy is to construct [client-side] data structures such as Widgets and Icons and Images etc., then with all the information available, create their X Server side representation in one fell swoop by calling app->create().

    When you have given Buttons or Labels or other FOX Widgets icons, a call to that Widget's create() member function will also automatically call its icon create().  To allow icons to be shared by multiple Widgets, it is specifically allowed to call create() more than once on an icon or image.

    In many cases, after calling an icon's create() member function, there is no need to keep the client-side pixel data around; thus, FOX icons will in most cases release the memory taken up by the pixel data.  Should you want to repeatedly change the pixel data, however, FXIcon and FXImage have an option IMAGE_KEEP to allow you to hang on to the pixel data in the client.  After making changes to the pixel data, you can call icon->render() again to render it into the pixmap.

Image Formats Supported

    Currently, FOX supports CUR, BMP, GIF, ICO, IFF, JPEG, PCX, PNG, PPM, RAS, RGB, TGA, TIFF, XBM, and XPM based icons and images.  The most preferred format is GIF, as it is about 10 times more compact than XPM, and about 2 times more compact than BMP.  This is of some concern, as applications may have lots of icons [some analysis of our own applications revealed than one application's executable had about 1MB worth of XPM icons; with GIF, this would have been less than a 100kB].

Incorporating Icons and Images into an Application

    One crucial problem with icon-rich applications is where to keep all those icons; obviously, keeping icons in separate files allows end-users to substitute icons and perhaps change them with an Icon Editor program.  However, such a scenario also poses a maintainance problem:- software becomes extraordinarily dependent on specifics of a user installation, and end-users may actually break software by substituting corrupted icon files by accident, or perhaps other applications may overwrite them.  Another common problem is the need for end-users to set paths and environment variables.

    To eliminate these problems, the FOX approach is to embed all icons and images right into the application's executable.  This is done by simply by compiling the icons into the code in the form of C data statements, and then linking them in.

    XPM and XBM icons or images can be directly included into the source code, as these formats are basically just C++ data arrays already and there is consequently no reason to use reswrap. 
    XPM is particularly convenient as it allows you to build icons even without a graphical icon editor. Other image formats need to be transformed into a C++ data array with a small build-time utility called reswrap, which is provided in the FOX distribution.

    Reswrap allows you to generate the C/C++ data arrays automatically from the icons during the build process of your application; simply add a few rules into your Makefile, or, under VC++, use the reswrap program in a so-called Utility Project. For example, given as input a GIF file image such as below:


    Figure 1. Linux Penguin from file bigpenguin.gif.

     After processing this file, reswrap generates a C data statement such as:

    /* Generated by reswrap from file bigpenguin.gif */
    const unsigned char bigpenguin[]={
    0x47,0x49,0x46,0x38,0x37,0x61,0x30,0x00,0x39,0x00,0xf3,0x00,0x00,0xb2,0xc0,0xdc,
    ...............................................................................
    ...............................................................................
    0xf4,0xe0,0x63,0x90,0x7c,0x7d,0x40,0xc5,0x92,0x0c,0x34,0x39,0x41,0x04,0x00,0x3b
    };

    This can then be subsequently compiled into an object file, and linked in with the executable.  To make use of such an icon, FOX supports deserialization from a memory stream. The icon data above could be used as follows to create an Icon:

    FXIcon *tux_icon = new FXGIFIcon(application,bigpenguin);

    Wait! Is that all? Yes it is!  This one statement creates an icon object, then deserializes the icon data from the GIF stream to build the icon's internal pixel data.  A subsequent call:

    tux_icon->create();

    Will create an X pixmap, render the icon into it, and subsequently release the pixel data after it is no longer needed.  If you had created the icon with the IMAGE_KEEP option, the pixel data would have been kept around for subsequent manipulation by your application, and perhaps repeated rendering. To draw the icon in a window, simply:

    dc.drawIcon(tux_icon,x,y);

    will do the job.

Bitmaps

    Bitmaps (XBM images) in FOX behave very much like images.  Except, unlike Images which are always 24 bits, and in color, Bitmaps are only one bit, or blank and white.  Typical uses for Bitmaps are the creation of patterns and stipples, or shape masks against which other primitives are clipped.
    In terms of constructing and using Bitmaps in FOX, it is completely analoguous:

    // Bitmap Data, in XBM Format
    
    #define gray_width 32
    #define gray_height 2
    static unsigned char gray_bits[] = {0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa};
    
    // Construct a bitmap object
    FXBitmap *grayBitmap=new FXBitmap(application, gray_bits, 0, gray_width, gray_height);
      

    In terms of using Bitmaps for subsequent tiling and stippling operations, remember that MS-Windows has certain size limits such patterns;  X-Windows has no such limit, but presumably smaller patterns are more efficient.  It is probably a good idea to keep so widths such as 8,16, or 32.

Cursors

    Cursors can be constructed in FOX to change the shape of the mouse-cursor.  Constructing Cursors is very similar to constructing Bitmaps, except that Cursors comprise two bitmaps, a picture and a shape mask; also, Cursors have a so-called hot-spot, the point inside the cursor-glyph which is ``pointer to'' by the mouse.
    FOX currently also supports color cursors with an alpha component, i.e. partially transparent cursors.  This is limited to certain platforms; on platforms where color cursors are not supported, the color image is thresholded to a simple black/white image with the alpha channel mapping to fully transparent.  Designing your color cursors with contrasting colors ensures that they will look reasonable on such platforms.

    Besides defining your own ``custom'' cursors, FOX also allows you to simply create a ``stock'' cursor, i.e. a cursor whose shape has already been predefined by the system. To create a custom Cursor:

    // Picture bits, in XBM Format
    #define resize_width 32
    #define resize_height 32
    #define resize_x_hot 9
    #define resize_y_hot 9
    static unsigned char resize_bits[] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00,
    ....
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

    // Shape bits, in XBM Format
    #define resize_mask_width 32
    #define resize_mask_height 32
    #define resize_mask_x_hot 9
    #define resize_mask_y_hot 9
    static unsigned char resize_mask_bits[] = {
    0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00,
    ....
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};


    // Resize corner
    resizeCursor=new FXCursor(application,resize_bits,resize_mask_bits,resize_width,resize_height,resize_x_hot,resize_y_hot);

    To create a stock Cursor:

    // Text Cursor
    IBeamCursor=new FXCursor(application,CURSOR_IBEAM);

    If you define your own Custom Cursors, make sure the size is exactly 32x32. MS-Windows does not support any other sizes.  Also, the shape and the picture will have to be the same size.

If Icons Look Funny...

    Sometimes, your icons may look funny.  This is usually because FOX Icon routines determine the wrong value for the transparency color.  FOX can handle images with a true alpha-channel, or images with a special transparency color.  The latter is the more common approach, as many file formats do not support true alpha channels.
    Different image formats guess the transparency color in different ways. For GIF Images, FOX uses the following algorithm:

    • If a transparent color is found in the GIF file, that color is used.
    • If not, the background color is used.
    • If the option IMAGE_ALPHACOLOR is used when constructing the icon, the specified color is used.
    • Finally, if the option IMAGE_OPAQUE is used, the icon is forced to be non-transparent.


    For BMP images, there is no background or transparency color in the image file format; the algorithm is simpler:

    • The assumed transparency color is the same as the default GUI background color, which is FXRGB(192,192,192).
    • If the option IMAGE_ALPHACOLOR is used when constructing the icon, the specified color is used.
    • Finally, if the option IMAGE_OPAQUE is used, the icon is forced to be non-transparent.

    In most cases, you will create your icons simply as below:

    new FXGIFIcon(app,picture_data);

    In some cases, when you want to override the transparency color,construct your icons as:

    new FXGIFIcon(app,picture_data,FXRGB(192,192,192),IMAGE_ALPHACOLOR);

    To create an completely opaque icon:

    new FXGIFIcon(app,picture_data,0,IMAGE_OPQUE);

    For more information on graphics file formats and their idiosyncracies, see  the Graphics File Format Web Site.

More on Reswrap

    The reswrap tool has a number of options to make it convenient to build C source and header files automatically from image files as a part of your regular project build process.  Reswrap is normally invoked as follows:

    reswrap [options] [-o[a] outfile]  files....

    Invoking reswrap with -o outfile will make reswrap write its output on the file outfile.  With -oa outfile, reswrap will append additional data at the end of outfile.
    Any number of input files may be specified.  Reswrap typically produces one data statement for each of the input files specified on the command line.

    Reswrap understands a few additional options:

    -h

    Will print out a summary of the supported options.
    -v
    Will print out the version number.
    -d
    Reswrap normally generates its output as hexadecimal numbers; the -d option will make reswrap generate decimal numbers.
    -x
    Forces reswrap to generate hexadecimal numbers [the default].
    -e
    Places the storage modifier extern in front of the data array, ensuring that the data array can be linked with other compilation units.
    -i
    Instead of a data array statement, reswrap will generate a declaration only.  For example,
    reswrap -i bigpenguin.gif
    will produce the output:
    /* Generated by reswrap from file bigpenguin.gif
    */
    extern const unsigned char bigpenguin[];

    Which you could include as a header file into whichever source file needs access to the data.

    -s

    This option suppresses comments inserted by reswrap to indicate the original file name from which the data statement was generated.
    -n name
    Instead of taking the filename less the extension, reswrap substitutes name for the name of the resource.
    -c cols
    Uses cols columns instead of the default 16 columns in the data statements generated by reswrap.
    -ppm
    Assumes the source file is a Portable Pixmap (ppm) file.  Reswrap will output a simple rgb array.
    Example of using reswrap in your Application's Makefile:

    OBJECTS = icons.o myapp.o
    ICONS = bigpenguin.gif applogo.gif
    icons.h: $(ICONS)
    reswrap -e -o icons.h $(ICONS)

    icons.cc: $(ICONS)
    reswrap -o icons.cc $(ICONS)

    myapp: $(OBJECTS)
    gcc -o myapp $(OBJECTS) -lFOX -lm -lSM -lICE -lXext -lX11

    myapp.o: myapp.cc icons.h

    This will cause make to generate two files, icons.h and icons.cc which contain the declarations and definitions respectively for all the reswrapped icons listed in the ICONS variable.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/install.html000066400000000000000000000510721326741342000157430ustar00rootroot00000000000000 Download
Download [Remove Frame]

Installation instructions

                              The FOX GUI Library Installation
                              ================================



Systems Which are Supported or Known to work:
=============================================

  o Linux (gcc, INTEL C++), x86, IA64 (Itanium), x86-64 (Opteron).
  o Windows XP, 2K, NT, Windows 9x, (VC++, Cygwin, MinGW,
    Borland C++, Digital Mars C++, OpenWatcom C++, ... )
  o Digital Unix/COMPAQ Tru64  OSF1 3.2, 4.0x, 5.0x (gcc and DEC cxx).
  o SGI IRIX 5.3, 6.1, 6.2, 6.4, 6.5 (gcc and MIPS Pro C++)
  o SUN Solaris, SunOS (gcc, SUN WorkShop Compiler, SUN Forte C++)
  o HP-UX PA-RISC 9.x, 10.x and B.11.00, (gcc and aCC).
  o HP-UX B.11.22 Intel Itanium (IA64) using aCC.
  o AIX 4.2, 4.3
  o FreeBSD
  o Sequent DYNIX/ptx 4.4.7
  o IBM VisualAge C++ 3.5 (Windows)
  o Apple MAC OS-X.  You will need an X-Server, either Apple's or XFree.



For most UNIX systems.
======================

For most unix systems you can configure simply as:


        ./configure


You can disable OpenGL support by configuring as:


        ./configure --disable-opengl.


After configure runs its course, simply type ``make'' to build the library,
and ``make install'' to install it.

FOX should compile on most UNIX platforms; we have tested the following:
SGI, IBM, HP, SUN, DEC, LINUX, all with gcc; however, FOX uses a fairly
conservative subset of C++, and should be no problem to port to other, more
primitive, C++ compilers.

On some machines, the X11 header files are still K&R C, instead of ANSI-C.
You might try define add "-fpermissive" to the CXXFLAGS environment variable
prior to running configure (this is the flag for GCC; other compilers may
have similar option for old K&R C).

When programming against FOX, you should only have to include "fx.h", and
for 3D programs, "fx3d.h".  To use keyboard symbols, include "fxkeys.h" also.
Specifically, to remain portable application programs should NOT include any X
window header files.

You may of course need other system headers ("stdio.h", "gl.h", etc).


Building for Debug or Release.
==============================

Normal builds [w/o any special arguments to configure] will include assert and
trace statements into the library, but no debug symbols.  This mode compiles
the fastest and allows for tracing of the FOX library.  This mode is the
recommended way to develop FOX applications, as it allows for resource tracing
and internal consistency checks.

Building for debug will add debug symbols as needed by your debugger.  It also
includes assert and tracing into the library.  This setting is recommended if
you need to debug the FOX library itself.  Full debug executables are build by
configuring with:


        ./configure --enable-debug



Release builds strip all debug information, asserts, and tracing, and generates
optimized code.  The resulting library is the smallest/fastest, and this is the
recommended setting for production code.  To build for release, use:


        ./configure --enable-release




Building Shared or Non-Shared Libraries.
========================================

You can build FOX either as shared library, static library, or both.  The
default is both.  To build static library only [this may be necessary on
certain systems where shared library support is lacking]:

        ./configure --disable-shared

to build shared library only:

        ./configure  --disable-static



Image File Format Support.
==========================

FOX needs external libraries for JPEG, TIFF, and PNG image format. On
some systems, such as Linux, *BSD, these are likely already installed
on your system.  On Windows or older UNIX systems, they need to be
compiled and installed first.  See below on how to override default
locations on UNIX systems.

The JPEG support is provided by jpegsrc.v6b.tar.gz, the PNG support
by libpng-1.2.5.tar.gz (or a newer version).  The TIFF support is
in tiff-v3.5.7.tar.gz (or later).  All these files are available on
ftp.fox-toolkit.org.

After these libraries have been compiled and installed, compile FOX
with HAVE_TIFF_H=1, HAVE_PNG_H=1, HAVE_JPEG_H=1.

The TIFF library may also need the JPEG library (JPEG is one of the
tags supported in the TIFF format), so compile the JPEG library first.
TIFF also needs the GNU compression library zlib (available as
zlib-1.1.4.tar.gz (or later) on ftp.fox-toolkit.org).


Compression Library Support.
============================

Compressed FXStream support is enabled by installing zlib-1.1.4.tar.gz
and bzip2-1.0.2.tar.gz (or later), then compiling FOX with HAVE_ZLIB_H=1
and HAVE_BZ2LIB_H=1, respectively.  You do not need to install them on
Linux, *BSD, but you probably do on Windows and older UNIX systems.




Overriding Libraries.
=====================

The default libraries determined by configurations are not always the ones you
want to use; therefore, there is a mechanism to override the default choices
of the configuration system.

The override is done simply by setting environment variables prior to running
configure; make sure config.cache is removed if you've ran configure before.

Configure allows for the following overrides:


        Environment Variable    Default value if not set
        ====================    ========================

        LIBJPEG                 -ljpeg
        LIBPNG                  -lpng
        LIBTIFF                 -ltiff
        LIBZ                    -lz
        LIBBZ2                  -lbz2
        LIBGL                   -lopengl32      (win32)
        LIBGLU                  -lglu32         (win32)
        LIBGL                   -lGL            (unix)
        LIBGLU                  -lGLU           (unix)



On SGI IRIX 6.x
===============


On SGI Systems where MIPS Pro C++ compiler is used instead of GCC, you will
need to set the environment variable CXX to:

        CC -n32

and then run:

        ./configure --x-libraries=/usr/lib32


or, you can also build FOX for the 64 bit model, and set CXX to:


        CC -64


and run configure with:

        ./configure --x-libraries=/usr/lib64


The first argument is only needed if you also have MESA on your system.
FOX searches for the png library [for Portable Network Graphics, the successor
of GIF],  but the library it finds, even though it has the same name, is not
the right one.  You will need to disable this feature, or download the PNG
library from http://www.graphicswiz.com/png/ and compile it, and pass the
appropriate flags for your compiler to find the new version.
If compiling without PNG, pass the flag:  --disable-png; likewise, you
can disable JPEG with the flag: --disable-jpeg.


Using gcc 2.95.2 on IRIX 6.x (Thanks to Theo Venker)
====================================================

You won`t believe the solution: rename FXApp.cpp to FXApp.C and everything
is fine. The manual page of g++ says that it accepts C++ suffixes .C, .cc,
.cxx, .cpp, and .c++, and it does, but for .cpp and .c++ it compiles with
-D__LANGUAGE_C -D_LANGUAGE_C -DLANGUAGE_C whereas the others suffixes
use -D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS. This is clearly a
bug in g++. I decided to wait for the next g++ release, so I didn`t
report this to the g++ maintainers. May be you will.

The work-arround is:

        export CC="g++ -D__LANGUAGE_C_PLUS_PLUS -D_LANGUAGE_C_PLUS_PLUS"

and then run configure.




Building 64-bit code on Linux for x86-64 (AMD Opteron, Athlon64)
================================================================

Linux for AMD Opteron supports execution of both 32 and 64 bit code
on the same system; consequenly, two sets of libraries are installed.
To configure properly, you will need to let ld search the right set
of directories.  Here's how:


        export LDFLAGS="-L/usr/lib64 -L/usr/X11R6/lib64 -L/lib64"
        ./configure 


No other issues are known at this time.




On Alpha Processor based Workstations (COMPAQ/DEC OSF1)
=======================================================


If you use DEC's "cxx" instead of GNU gcc, you will need to make sure the
you add the flag option -D_XOPEN_SOURCE_EXTENDED to the compiler; this
will allow usage of a wider set of POSIX functions; GCC seems to have
this flag on by default, but the standard C++ compiler on OSF1 does not;
thanks to thomas.goessler@avl.com for pointing this out.

When compiling with gcc on Digital Unix, you may want to enable gradual
underflow support for IEEE754 conformant floating point operations:


        export CXX="gcc -mieee"
        ./configure ....


If this flag is NOT set, floating point operations which yield underflows
will cause a floating point exception (SIGFPE).

Many perfectly correct programs may generate underflows when working
with small numbers (~1e-38 single precision, ~1e-308 double precision);
working with these numbers may involve so-called denormalized floating
point numbers, i.e. numbers where the mantissa can no longer be shifted
to be within [0.5,1.0> range due to the exponent becoming 0.

The ALPHA CPU does not include hardware do manipulate these numbers and
will generate a trap when trying to manipulate these numbers; passing
the "-mieee" flag will incorporate a software handler to ensure IEEE754
conformant floating arithmetic.




Compiling FOX with the SUN WorkShop Compiler
============================================

To use the SUN compilers, simply configure FOX as follows:

  > cd fox
  > env CC=cc CXX=CC LD=CC ./configure


Explanation:

The SUN compilers require 'CC' to be used instead of 'ld' for creating the
shared object library. This is to ensure that template instances will be
included in the library. To build a static library 'CC -xar' should be
used instead of 'ar' but there is no simple way to do this, due to
limitations in 'libtool'.

To get around this problem, the configure script invokes 'CC' with the
argument '-instances=global', thus including template instances in the
object file instead of using a template repository. This works fine and
'ar' can be used to build a static object library.

Daniel Gehriger 



Compiling FOX using the HP/UX C++ Compiler
==========================================

You may want to use GNU make instead of HP's make (/usr/bin/make). The default
version of make doesn't seem to process the dependencies for PathFinder
correctly and thus doesn't generate the reswrapped icon header files. Since
PathFinder is built after the library and all the test programs, this isn't
a huge problem -- it just means that the build will stop at that point with
an error message.

Configure the build by typing:

    env CC="cc +DA2.0W" CXX="aCC +DA2.0W +W740,749,863" ./configure

The "+DA2.0W" flag tells it to compile as 64 bit. The "+W740,749,863" option
suppresses a few warning messages that we believe are safe to ignore ;)



Compiling FOX using the HP/UX Itanium^2 aCC C++ Compiler
========================================================

Assuming the aCC is installed in the recommended place:


    export CXX="aCC -fast -mt +DD64 -DHAVE_VSSCANF=1 -DHPOGL_SUPPRESS_FAST_API=1
                   -I/opt/aCC/include -I/opt/graphics/OpenGL/include -L/lib/hpux64
                   -L/usr/lib/hpux64 -L/opt/graphics/OpenGL/lib/hpux64"


You may want to build the image support libraries also if you need them.



Windows 95/98/ME/NT/XP Builds
=============================

We currently build FOX on a regular basis using Microsoft Visual C++ 6.0.
There is also support for Mingw32, the latest net release of Cygwin (v1.1)
and Borland C++. We have heard of mixed success with building under Symantec's
C++ 7.5 compiler.

A few things to keep in mind:

 1. If you want to include OpenGL support be sure to define the HAVE_OPENGL
    symbol on the compiler's command line, and to link your executables to
    the opengl32.lib and glu32.lib libraries.

 2. The native Windows version of FOX relies on an undocumented API called
    _TrackMouseEvent() which is found in comctl32.dll. You should be sure
    to link your FOX applications with the comctl32.lib import library.
    Note that for this function is only available for comctl32.dll
    versions 4.70 or later; the latest version of this DLL can be downloaded
    from Microsoft's web site:

	http://www.microsoft.com/msdownload/ieplatform/ie/comctrlx86.asp

    If you are running Windows 98, Windows NT 4.0 SP3, or have installed
    Internet Explorer 4.0 or later, you *probably* already have the latest
    version of this DLL already.

 3. The FOX registry mechanism uses the regular Windows registry under the
    hood; those functions are found in advapi32.lib which is not always a
    standard library. If you get some unresolved symbols at link time (esp.
    with names beginning with "Reg") try adding advapi32.lib to the list
    of libraries.

 4. To build or use FOX as a DLL, the symbol FOXDLL must be defined; for
    building the core FOX library, FOXDLL_EXPORTS must also be defined.
    If FOXDLL_EXPORTS must NOT be not defined when you are just using FOX
    as a DLL.

 5. It is recommended that extension DLL's are compiled with FOXDLL but
    that you define your own symbol to signify export; for example, the
    CHART library is build with CHARTDLL_EXPORTS; since the CHART library
    USES FOX, it must import the core FOX library, yet export its own
    functions.



Building with Microsoft Visual C++
==================================

We now have a project workspace and project files set up for Win32 builds
under Visual C++ 6.0. To use these, perform the following steps:

  1. Download the latest fox.tar.gz from the web site;

  2. Unzip & untar in your favorite place;

  3. Start Visual C++ and open the fox/windows/vcpp/win32.dsw workspace;

  4. Choose a project and build it. The project corresponding to the library
     itself is named "fox", and all of the other projects list it as a
     dependency. So if you choose, say, "glviewer" to build, it should first
     build the library and then build the glviewer test program.


Building with Borland C++ Compilers
===================================

The Borland makefiles are now tested semi-regularly against the free
command-line compiler tools (compiler version 5.5) distributed by
Borland/Inprise. We believe that they should also be usable for any recent
Borland C++ compilers (e.g. Borland C++ Builder 3 or later).

To build the FOX library, utility programs and example programs, change to the
fox-0.99.xxx\windows\borland subdirectory and type "make". It should compile
without a hitch, with the possible exception of building the OpenGL test
programs in the "tests" subdirectory:

 + If you're using the free command-line compiler tools, you want to be sure
   that the %BCCDIR%\Lib\PSDK directory appears in the linker configuration
   file (%BCCDIR%\Bin\ilink32.cfg). If it isn't there, the linker won't know
   where to find the opengl32.lib and glu32.lib import libraries.

 + If you're using an older Borland compiler, you similarly want to be sure
   to have the updated OpenGL SDK for Win32 (including the OpenGL 1.2 header
   files and import libraries).

If for some reason you don't have the correct header files and import libraries
for OpenGL, and if OpenGL support isn't important for your project anyways,
just modify the "Makefile.bc" in the fox-0.99.xxx\tests subdirectory so that
it doesn't try to build the "glviewer.exe" or "gltest.exe" examples.


Building FOX as a DLL
=====================

The FOX library can also be built as a DLL for Windows; this is done by
selecting the "foxdll" project and building it. Building this project
causes the import libraries and DLLs to be placed in fox/lib.
The filenames are foxdll.lib and foxdll.dll for the Release build, or
foxdlld.lib and foxdlld.dll for the Debug build.

To compile your own FOX applications so that they use the FOX DLL instead of
the static FOX library, be sure to define the FOXDLL symbol in your compiler
flags. Also note that the DLL must be in your search path for the program to
run!


Building FOX using OpenWatcom C++
=================================

The OpenWatcom C++ compiler can be downloaded free of charge from:


         http://www.openwatcom.org.


To use the OpenWatcom "patch" with a fresh copy of FOX vx.y.zz, please make
sure you've installed OpenWatcom C++ v1.0 and executed the SETVARS.BAT file
found in the OpenWatcom installation directory.
The Makefile.wc files rely on a Watcom environment variable, %WATCOM%, to
determine the location of the COMCTL32.LIB file.  Use the Makefile provided
in windows/watcom/Makefile.
Thanks to mikael@lyngvig.org for this port.



Building FOX using MinGW
========================

Please see the standard FOX documentation file, "Developing Win32 GUI
Applications Using FOX", available in this distribution as the file
"doc/win32.html".


Building FOX using Cygwin 1.1
=============================

FOX can also be built against the latest net release of Cygwin, available
for download from here:

	http://sourceware.cygnus.com/cygwin/mirrors

It absolutely will not compile with previous releases of Cygwin (i.e.
Cygwin B20.1 or earlier), at least not without a lot of headaches. The
win32api header files distributed with earlier versions of Cygwin were not
up-to-date enough for FOX.

It should compile out-of-the-box by typing:

	./configure --disable-shared
	make



Building FOX on QNX
===================


For those interested in using FOX with QNX, before running configure for
FOX on QNX it might be a good idea to run:

        automake --add-missing
        libtoolize -f

Doing so will ensure that the configuration files needed to detect QNX
are present.  

Also, for now it is probably best to disable shared libraries when
building FOX on QNX.  Programs linked with the FOX shared library will
not run, but instead will segfault.  I plan on looking into a fix for
this eventually.  

Dustin Graves 



Building on MAC OS-X
====================


When building on Mac OS-X, the following might help:


        CXX="c++ -I/sw/include -L/sw/lib
        ./configure 


This might help; no guarantees, I can not test this myself....



Image Formats in File Browser
=============================

By default, all available image formats are supported in the File and
Directory Browsers.  Some of these image formats require external
library support and consequently the size of your application executables
may be reduced by limiting the supported formats to those supported in
the core library; the image formats supported in the core library do
not require external libraries and therefore supporting them does not
incur any additional "code bloat".

To support only the core image formats, pass the compiler flag:


        -DCORE_IMAGE_FORMATS=1


This will enable all available image formats.  This will necessitate every FOX
application to link to the image libraries!!

Another flag is the default icon search path, i.e. where the file browser will
normally look to find and load icons bound to file extensions.
The path below will cause the system to look in three different directories:


    -DDEFAULICONPATH="~/.foxicons:/usr/local/share/icons:/usr/share/icons"


This would be a common setting for LINUX.  Note that this is only the default;
the actual search path can by set at any time by means of the FOX registry setting:


    [SETTINGS]
    iconpath="/home/extraicondir:/usr/share/icons"


Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/introduction.html000066400000000000000000000535041326741342000170200ustar00rootroot00000000000000 Home
Documentation: Introduction [Remove Frame]

    To illustrate the facility with which you can build a FOX application, we're going to build a few simple FOX applications.  The first application called Scribble.  A picture of the Scribble application is shown below:

Scribble


    Fig 1. The Scribble Application.

    Scribble demonstrates how to use the FOX Layout Managers, how to create Buttons, and how to handle messages.  Enough talk, lets start coding! The very first thing is to include the FOX header files. This is simple, as there is just one thing you need to include:

      #include "fx.h"
    
    Next, we need a top level Window object, this is a class derived from FXMainWindow. There is only one Main Window; if you need additional toplevel windows, you will probably derive those from FXDialogBox or FXTopWindow.

    In the case of Scribble, we make a class called ScribbleWindow:

      // Event Handler Object
      class ScribbleWindow : public FXMainWindow {
        // Macro for class hierarchy declarations
        FXDECLARE(ScribbleWindow)
    
    The first line says ScribbleWindow is derived from FXMainWindow; FXMainWindow, like most FOX classes, is derived from FXObject. Most classes you will write in the course of programming with FOX are either directly or indirectly derived from one single top level class called FXObject.

    The macro FXDECLARE(ScribbleWindow) declares a number of member functions which every object derived from FXObject should have; we've used a macro as it is always the same, and more convenient to program this way.

    Next, we add some member variables to keep track of the various Widgets, and the drawing color.  We also keep a flag to remember if the mouse was down, and a flag to remember if the canvas is dirty, i.e. has been scribbled on:

      private:
      FXHorizontalFrame *contents;     // Content frame
      FXVerticalFrame   *buttonFrame;  // Button frame
      FXCanvas          *canvas;       // Canvas to draw into
      int                mdflag;       // Mouse button down?
      int                dirty;        // Canvas has been painted?
      FXColor            drawColor;    // Color for the line
    


    To satisfy the serialization macro, we need to furnish a default contructor:
      protected:
        ScribbleWindow(){}
    

    FOX handles events from the user through a system of messages sent to a certain object.  In this case, the received of the messages is the ScribbleWindow class.  Thus, we need to add handler member functions to catch these messages and perform some action in response.  All message handler functions in FOX have the same argument signature:

      long onSomeCommand(FXObject* sender,FXSelector sel,void *ptr);
    
    Where:

      sender is the sender object that sent the message to us.
      sel is the selector, a combination of a message type and message id, which identifies the action being performed.
      ptr is a pointer to some event-related data; usually, this points to the FXEvent structure which contains the event that led to the message.
    For the Scribble application, we want  to handle mouse messages, as well as messages from the two buttons:

      public:
        long onPaint(FXObject*,FXSelector,void*);
        long onMouseDown(FXObject*,FXSelector,void*);
        long onMouseUp(FXObject*,FXSelector,void*);
        long onMouseMove(FXObject*,FXSelector,void*);
        long onCmdClear(FXObject*,FXSelector,void*);
        long onUpdClear(FXObject*,FXSelector,void*);
    

    ScribbleWindow also needs to define some new message ID's.  A message consists of a type and an id.  The type defines what has happened; the id identifies the source of the message.  Even though we know the object that sent us the message, in many cases, we can be sent the same message from different sources, and the id is much more convenient; so:

      public:
        enum{
          ID_CANVAS=FXMainWindow::ID_LAST,
          ID_CLEAR,
          ID_LAST
          };
    

    We typically define the list of messages some target understands as an enum type.  As the ScribbleWindow class is derived from FXMainWindow, it also understands all the messages already understood by the basic FXMainWindow.  Our new messages should have different numbers from those.  Rather than counting by hand, we let the compiler worry about this by simply defining one extra message id with the name ID_LAST, a subclass can simply use the ID_LAST of it's base class to start counting its message id's from; if ever any new message id's are added to the base class, our own messages are automatically renumbered by the compiler.

    We wrap up the remainder of the ScribbleApp class declaration by defining a constructor and one member function called create():

      public:
        ScribbleWindow(FXApp* a);
        virtual void create();
        };
    


    In our implementation, the constructor ScribbleWindow will actually build the GUI. The create() function is a virtual function that is called by the system. Most FOX Widgets have this create function. FOX Widgets have a two-stage creation process; first, the client side Widgets are constructed, using ordinary C++ constructors. Then, once the whole widget tree is complete, a single call to the application's create() function will create all the windows for those widgets. This two step process is needed as the second step may only be executed one the connecion to the display has been established.

    Now, we're ready to implement this new class; in most cases, the previous code would reside in a header file, while the implementation would be in a C++ source file, of course. In the case of ScribbleWindow, it is so simple that we placed everything into one file.

    The first thing to do is to define the message map. The message map is a simple table that associates a message type, and message id to a class's member function. Having a message map allows us to send any message to any [FXObject-derived] object.
    Thus:

      FXDEFMAP(ScribbleWindow) ScribbleWindowMap[]={
        //________Message_Type_____________________ID_______________Message_Handler_______
        FXMAPFUNC(SEL_PAINT,            ScribbleWindow::ID_CANVAS,ScribbleWindow::onPaint),
        FXMAPFUNC(SEL_LEFTBUTTONPRESS,  ScribbleWindow::ID_CANVAS,ScribbleWindow::onMouseDown),
        FXMAPFUNC(SEL_LEFTBUTTONRELEASE,ScribbleWindow::ID_CANVAS,ScribbleWindow::onMouseUp),
        FXMAPFUNC(SEL_MOTION,           ScribbleWindow::ID_CANVAS,ScribbleWindow::onMouseMove),
        FXMAPFUNC(SEL_COMMAND,          ScribbleWindow::ID_CLEAR, ScribbleWindow::onCmdClear),
        FXMAPFUNC(SEL_UPDATE,           ScribbleWindow::ID_CLEAR, ScribbleWindow::onUpdClear),
        };
    

    Note several things about this table; first, there are several messages with the same id, but a different type. Message types indicate what happened, for example, SEL_LEFTBUTTONPRESS means that the left mouse button was just pressed. The message id identifies the source. FOX defines a large collection of message types, each of them has a specific meaning.

    Next, we need to implement the ``boilerplate'' stuff that the previous FXDECLARE macro has declared:

      FXIMPLEMENT(ScribbleWindow,FXMainWindow,ScribbleWindowMap,ARRAYNUMBER(ScribbleWindowMap))
    

    This the first argument of the macro should have the name of the class, in this case ScribbleWindow; the second argument should be the name of the class from which the class has been derived; in this case, that's FXMainWindow. The last to arguments are a pointer to the message map, and the number of messages in that map. FOX has a convenience macro ARRAYNUMBER() that expands to the number of elements in a compile-time defined array; this makes it easier to add or remove messages.

    If the class you're defining implements no additional messages, the last two arguments of FXIMPLEMENT should be simply NULL and 0.

    The remainder of the ScribbleWindow's implementation is pretty much ordinary C++ code. The constructor follows below:

      // Construct a ScribbleWindow
      ScribbleWindow::ScribbleWindow(FXApp *a):FXMainWindow(a,"ScribbleApplication",NULL,NULL,DECOR_ALL,0,0,800,600){
    
      contents=new FXHorizontalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,0,0,0,0);
    
      // LEFT pane to contain the canvas
      canvasFrame=new FXVerticalFrame(contents,
                                      FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,0,0,0,0,10,10,10,10);
    
      // Label above the canvas
      new FXLabel(canvasFrame,"CanvasFrame",NULL,JUSTIFY_CENTER_X|LAYOUT_FILL_X);
    
      // Horizontal divider line
      new FXHorizontalSeparator(canvasFrame,SEPARATOR_GROOVE|LAYOUT_FILL_X);
    
      // Drawing canvas
      canvas=new FXCanvas(canvasFrame,this,ID_CANVAS,
                          FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT);
    
      // RIGHT pane for the buttons
      buttonFrame=new FXVerticalFrame(contents,
                                      FRAME_SUNKEN|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,0,0,0,0,10,10,10,10);
    
      // Label above the buttons
      new FXLabel(buttonFrame,"ButtonFrame",NULL,JUSTIFY_CENTER_X|LAYOUT_FILL_X);
    
      // Horizontal divider line
      new FXHorizontalSeparator(buttonFrame,SEPARATOR_RIDGE|LAYOUT_FILL_X);
    
      // Button to clear
      new FXButton(buttonFrame,"&Clear",NULL,this,ID_CLEAR,
                   FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,0,0,0,0,10,10,5,5);
    
      // Exit button
      new FXButton(buttonFrame,"&Exit",NULL,getApp(),FXApp::ID_QUIT,
                   FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,0,0,0,0,10,10,5,5);
    
      // Initialize private variables
      drawColor=FXRGB(255,0,0);
      mdflag=0;
      dirty=0;
      }
    

    In almost all cases, it takes just one line of C++ code to create a FOX Widget. Typically, that is a constructor invocation. As most FOX Widget supply convenient default parameters to the constructor, you may not have to specify most of them.

    The first line in the body of the constructor creates a top level window; toplevel windows in FOX have no parent, so pass in a pointer to the application object (this in this case). The remaining parameters are the window title, window decorations (such as resize handles, borders, etc.), as well as the initial size and position. The initial size and position may be ignored by your particular window manager, they are just hints.

    The next line creates a FXHorizontalFrame Widget. The FXHorizontalFrame Widget is a Layout Manager that places its children horizontally.

    The FXMainWindow Widget itself is also a Layout Manager, and the options passed to the FXHorizontalFrame widget's constructor determine how it is placed in the FXMainWindow.

    Next, two FXVerticalFrame widgets are created, one for the drawing Canvas and one for the buttons. In the canvasFrame, we then place a Label, a grooved Separator, and the Canvas for drawing into. The Canvas's target object is ScribbleWindow (i.e. this), and its message is set to ID_CANVAS. This causes Canvas to send all its messages to the ScribbleApp object, with the ID set to ID_CANVAS.

    Likewise, in the right buttonFrame we place a Label, a grooved Separator, and two Buttons. The clear button has a caption "&Clear". The & in front of a latter will cause the Button to install a hot-key Alt-C automatically. The caption is drawn with the C underlines, as in "Clear." The target of the clear Button is again the ScribbleApp object, and its message ID is ID_CLEAR. Likewise, the exit Button sends ID_QUIT.

    Note that we didn't have to define ID_QUIT, as this is a message every FXApp object already understands. Thus, we can simply hook up buttons to their targets.

    The remaining arguments to the Buttons determine its frame style (FRAME_THICK|FRAME_RAISED), and how it is placed inside the VerticalFrame Layout Manager (LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT) tells the Layout Manager to stretch the Buttons to fill the available room, making them nicely the same size.

    Finally, the ScribbleWindow's constructor initializes its member variables for the drawing color and the flags.

    Next, we implement the create() routine:

      // Create and initialize
      void ScribbleWindow::create(){
        // Create the windows
        FXMainWindow::create();
        // Make the main window appear
        show();
        }
    

    First, we call the base classes' create; then, the main window is shown on the screen by calling its show() member function.

    Now, we're ready to handle some messages:

       // Mouse button was pressed somewhere
       long ScribbleWindow::onMouseDown(FXObject*,FXSelector,void*){
    
         // While the mouse is down, we'll draw lines
         mdflag=1;
         return 1;
         }
    
       // The mouse has moved, draw a line
       long ScribbleWindow::onMouseMove(FXObject*, FXSelector,void* ptr){
         FXEvent *ev=(FXEvent*)ptr;
         if(mdflag){
    
           // Get DC for the canvas
           FXDCWindow dc(canvas);
    
           // Set foreground color
           dc.setForeground(drawColor);
    
           // Draw line
           dc.drawLine(ev->last_x, ev->last_y,ev->win_x, ev->win_y);
    
           // We have drawn something, sonow the canvas is dirty
           dirty=1;
           }
         return 1;
         }
    
       // The mouse button was released again
       long ScribbleWindow::onMouseUp(FXObject*,FXSelector,void*ptr){
         FXEvent *ev=(FXEvent*) ptr;
         if(mdflag){
           FXDCWindow dc(canvas);
           dc.setForeground(drawColor);
           dc.drawLine(ev->last_x, ev->last_y,ev->win_x, ev->win_y);
    
           // We have drawn something, sonow the canvas is dirty
           dirty=1;
    
           // Mouse no longer down
           mdflag=0;
           }
         return 1;
         }
    
       // Paint the canvas
       long ScribbleWindow::onPaint(FXObject*,FXSelector,void*ptr){
         FXEvent *ev=(FXEvent*)ptr;
         FXDCWindow dc(canvas,ev);
         dc.setForeground(canvas->getBackColor());
         dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h);
         return 1;
         }
    

    The onMouseDown message handler simply sets a flag to remember than the mouse is now down; the onMouseMove handler draws a line from the last to the current mouse positions; it then sets a dirty flag to 1 to remember that the Canvas has been drawn onto. The onMouseUp handler finishes the line, and resets the mouse down flag. Finally, the onPaint handler repaints the canvas to the background color.
    Nothing remarkable here at all.

    The next few message handlers are more interesting:

      // Handle the clear message
      long ScribbleWindow::onCmdClear(FXObject*,FXSelector,void*){
        FXDCWindow dc(canvas);
        dc.setForeground(canvas->getBackColor());
        dc.fillRectangle(0,0,canvas->getWidth(),canvas->getHeight());
        dirty=0;
        return 1;
        }
    
    
      // Update the clear button
      long ScribbleWindow::onUpdClear(FXObject* sender,FXSelector,void*){
        if(dirty)
          sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL);
        else
          sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL);
        return 1;
        }
    

    The onCmdClear message handler clears the canvas, then resets the dirty flag.  The onUpdClear message handler updates the clear Button.

    Each Widget in FOX receives a message during idle processing asking it to be updated.  For example, Buttons can be sensitized or desensitized when the state of the application changes.  In this case, we desensitize the sender (the clear Button) when the Canvas has already been cleared, and sensitize it when it has been painted (as indicated by the dirty flag).

    This GUI Update process is extremely powerful:- if an application has N commands, and M Widgets to update for each command, one might have to write NxM update routines; with the GUI Update process, one needs to write only N+M routines.  Moreover, if the application data change by some other means (e.g. timers, external data inputs, mulitple computing threads, etc), the GUI will automatically keep itself up to date without any additional coding.

    To complete the Scribble Application, only one thing remains:- to kick it all off from the main() routine:

      // Here we begin
      int main(int argc,char *argv[]){
    
        // Make application
        FXApp* application=new FXApp("Scribble","Test");
    
        // Start app
        application->init(argc,argv);
        // Scribble window
        new ScribbleWindow(application);
    
        // Create the application's windows
        application->create();
    
        // Run the application
        application->run();
    
        return 0;
        }
    

    First, we construct a FXApp object by calling new FXApp("Scribble","Test"). The first string is the name of the application `Scribble' is often referred to as the Application Key, while the second string`Test' is called the Vendor Key. Together, these two strings are used to determine the application's registry- or preference-settings.

    The call to application->init(argc,argv) initializes the application; argc and argv of the command line are passed in so that the FOX system can filter out some FOX-specific command line arguments, such as for example the -display parameter.

    The call new ScribbleWindow(application) builds the entire GUI for our application; the GUI consists essentially of two parts:- the client-side resources, which live in our own process, and the server-side resources which live in the X server (X11) or GDI (Windows).
    When we construct a FOX widget, only the client-side resources are determined. A subsequent call to application->create() recursively creates all server-side resources for each widget that has been previously constructed.

    Finally, application->run() member function is called to run the application. This function never returns.

Recap

    In the previous example, several FOX features have been discussed:

    • Building applications using FOX means building more C++ classes; these new classes should always be derived from FXObject, either directly or indirectly. The sophisticated developer will try and make these new classes general, so that he/she may use these again in some other project. Thus, the development effort may be leveraged many times over.


    • FOX uses a target/message system; Each message handler has three arguments:- the sender of the message, which is always an object derived from FXObject, the message selector, which is a combination of the message type and message id, and a void pointer which may provide additional information about the message. The message type identifies the type of action that occurred, whereas the message id identifies the source of the message; it makes the message unique.


    • When defining new messages, use enums. The first new message for a derived class should be equal to the base classes ID_LAST. This way, the compiler takes care of unique message numbering. Note that messages should be unique with respect to a specific target only:- unrelated targets do not have to be unique. If the class you're writing may be subclassed later, define a message ID_LAST, so that the subclass may define additional message id's starting from that point.


    • Major FOX building blocks already understand a bunch of messages; for example, FXApp understands the message ID_QUIT. This means that in many cases, simple glue-code may be avoided.


    • During idle processing, FOX automatically updates eachWidget, by asking the Widget's target what its state should be; the message being sent to the target object is of type SEL_UPDATE. The GUI Update process is an important tool to use for large-scale applications, where multiple developers may not even be aware of which widgets may need updating when some data structure changes. With GUI Updating, it is easy to keep it consistent.


    • Hot Keys may be set on Button captions simply by prefixing the hotkey latter with an &. The indicated letter will be automatically underlined.


    • FOX uses a two-step process to build its Widgets; in the construction phase, C++ data structures are built, and member data are filled in; in the second phase, the connection to the display is established, and actual windows are created for each Widget.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/layout.html000066400000000000000000000726241326741342000156200ustar00rootroot00000000000000 Documentation: Layout Managers
Documentation: Layout Managers [Remove Frame]

Placing Widgets Automatically

    Making an attractive layout for a Dialog or Window  is an important consideration in design of a user interface.  Setting windows at specific x,y coordinates, and specifying explicit dimensions allow the GUI designer full control over  the placement of each Control.  However, this is very tedious and time-consuming.  Also, what if the labels on buttons change, or if the user wants to use a bigger font?

    For these reasons, the preferred method for placing GUI Controls on windows in FOX is through the use of so-called Layout Managers.  A Layout manager is a widget whose primary purpose is to arrange GUI Controls contained inside of it in a certain way. This even includes other Layout Managers! In fact, Layout Managers may be nested arbitrarily!

    Different layout managers arrange their children in different arrangements, for example, from left-to-right, top-to-bottom, in a grid, or even all on top of one another. Most layout managers also allow for explicit placement of their children, using hard-coded coordinates.

    The benefits of this approach vis-a-vis a precise and explicit placement is that:

    1. It takes the tedium out of placing GUI Controls; the application programmer does not concern him or herself with specific coordinates.
    2. GUI Controls are automatically arranged correctly, even if button labels are changed, or users choose bigger fonts.
    3. Layouts may be recalculated intelligently when a user resizes the window.
    4. It makes it easy to accomodate and place Controls which are created automatically under program control, for example in GUI's created from database tables.

    In FOX, you determine the arrangement of a GUI Control by selecting the appropriate Layout Managers, and a combination of Packing Styles passed to the Layout Manager, as well as a combination of Layout Hints passed to the GUI Control being arranged. Thus, virtually every conceivable arrangement can be achieved simply by nesting the appropriate layout managers in a certain way.

Basic Layout Patterns

    FOX supports a number of general-purpose layout managers. The desired arrangement of GUI controls determines which layout manager is the most appropriate for the job; the following table lists the most commonly used layout managers and their layout arrangement:

    FXPacker The Packer layout widget places its GUI elements in its interior rectangle, placing each child against one of the four sides. As each child is placed, the size of the rectangle is reduced by the space taken up by the child.
    If a child is placed against the left or right, the interior rectangle's width is reduced; if the child is placed against the top or bottom, the height is reduced.
    Children may be of any type, including other layout managers.
    FXTopWindow The TopWindow operates like an FXPacker window. For simple dialogs and toplevel windows, no additional layout managers may be needed in many cases, as the TopWindow's layout characteristics may be sufficient.
    FXHorizontalFrame The HorizontalFrame layout manager packs its children horizontally from left to right (or right to left). 
    FXVerticalFrame The VerticalFrame layout manager packs its children vertically, from top to bottom or vice versa.  It behaves similar to the HorizontalFrame layout manager.
    FXMatrix The Matrix layout manager arranges its children in rows and columns. An FXMatrix widget can operate in both column-oriented as well as row-oriented mode.  Normally, the Matrix layout manager operates row-wise.  Based on the number of rows, the Matrix layout determines the width of each column and the height of each row, then arranges the children in the space allotted, observing the child's layout hints as much as possible. 
    FXSwitcher The Switcher layout manager places its children exactly on top of each other; it ignores most of the layout hints provided by each child.  You typically use a layout manager like the switcher to save screen real-estate, by placing for example several control panels on top of each other, and bringing the right one on top depending on the context.
    FXGroupBox The GroupBox is a layout manager that provides identical layout facilities as the Packer.  In addition, the GroupBox draws an attractive border around its contents, and provides an optional caption.
    FXSplitter The Splitter layout manager divides some area of the screen horizontally or vertically.  The divider bars can be repositioned by the user, so that depending on what the user is doing, he or she may give one or the other partition more screen space.
    FX4Splitter The Four-way splitter divides its contents into four subframes, like a four-paned window. The user can interactively adjust the dividers to change the division. Unlike the simple splitter, the subdivision of the four-way splitter is fractional, i.e. the subframes are resized proportionally if the entire four-way splitter is resized.
    FXSpring The spring is typically used inside a FXHorizontalFrame or FXVerticalFrame. As its name implies, it stretches and compresses like a spring of a certain length. Different springs of different lengths are typically placed side-by-side in a FXHorizontalFrame, allowing for a fixed-proportion arrangement, e.g. a 60:40 split.

Layout Padding

    Apart from a certain arrangement of their children, Layout Managers also provide an amount of interior padding between the children, and between the children and the borders. The amount of padding may be zero, but it is typical to accept the default value, which is a few pixels; this usually looks better.

    The padding parameters are defined as below:

    Note that for most Layout Managers, the padding options are passed as the last 6 parameters of the constructor. Since default-values are given, there is often no need to supply explicit values for them.

How Layout Works

    All widgets in FOX are organized into a widget hierarchy or widget-tree. Widgets are roughly classified as Composite widgets, and Simple widgets.  Composite widgets can have child widgets, whereas Simple widgets are the most basic type of widget.

    One widget is at the top of the widget hierarchy: the RootWindow widget.  This special widget represents the background screen on your display. Widgets below the RootWindow widgets are called Shell widgets.  Shell widgets are positioned and resized directly by the end-user, typically through resize handles and title-bars provided by a Window Manager.

    As a user resizes a Shell widget, layout needs to be performed to reposition each widget in that Shell so as to maintain the proper arrangement. Hence, we refer to the layout process as going top-down, i.e. proceeding from widgets higher up in the widget tree downward toward the leaves of the tree.

    Sometimes, however, widgets may want to change size of their own accord.  For example, an application changes the text on a Label widget, making it larger. Changing a widget's size demands that its immediate parent be notified, as widgets are arranged by their parents. Depending on the arrangement, the widget's parent may decide that it, too, may need to change size, and in its turn notify its parent. Thus process goes on all the way till some widget is encountered whose size is not affected by the change.  Thus, we refer to the recalculation process as going bottom-up.

    In the course of recursing upwards, all widgets are marked for later layout.  The upward traversal will typically be stopped because of one of the following reasons:

    1. The widget is a Shell widget.  Shell widgets are resized by the user only, so the size will not change, and layout will have to be performed as well as possible given the size of the Shell widget.
    2. The widget is a ScrollWindow widget.  A ScrollWindow does not have to grow or shrink when its child does:- it just adjusts the scrollbars to reflect the new child size, and layout the child properly.
    3. The widget is able to accomodate the child's new size.  For example, it may be that the child that changed was not the determining factor that caused the parent's size; in such a case, no further marking needs to take place.

    During idle processing,  all marked widgets will be laid out by the system, and their mark-flags will be reset.  Thus, during processing of a user-event, any number of things may be changed in the User Interface; still, only one pass will be performed to rearrange all widgets again.  This is one of the reasons for FOX's fast performance for large-scale graphical user interfaces.

About Default Sizes

    All widgets may be requested to compute theirdefault size. Layout widgets will use this information to determine their own default size.  Mostly, layout managers will try and ensure that a child-widget will not be made smaller than its reported default size.  Note that the default size is normally the minimum size that is sensible for a widget, but that a widget may potentially become smaller than its default size!
    For most types of Controls, the default size is computed based on the content, such as a text label and icon, plus borders and perhaps some interior padding; most Controls have a border, which may be 0, 1, or 2 pixels wide, and an interior padding around the top, bottom, left, and right side.  The interior padding provides some spacing around the content for visual aesthetics.  For Layout Managers, the default size is computed based on the arrangement of the children, their default sizes, its own border, interior padding, and inter-child spacing.

Layout Hints

    With layout hints, widgets can inform their parent layout manager of certain desired positioning and sizing requirements. Since they are just hints, these may not always be observed.  Generally, however, the layout widgets will try and do their best to observe the hints insofar as feasible.

    The absence of a specific hint usually indicates that a default value is to be chosen.  So in many cases, you do not need to fully specify any hints at all!  In complicated situations, however, you may have to specify many of these hints.  The  FOX toolkit has defined the hints in such a way that the most common situations require the fewest hint-flags; for example, normally, Layout Managers are filled from top to bottom, and left to right.  Thus, you wouldn't have to specify these hints if this is the case!

    We will subsequently describe the layout hints and their effect on the typical layout process; we have indicated the default option between parentheses; it is usually the case that the default options do not have to be specified explicitly.

    Layout Hint: Where: Effect:
    LAYOUT_SIDE_TOP  (default)
    LAYOUT_SIDE_BOTTOM
    LAYOUT_SIDE_LEFT
    LAYOUT_SIDE_RIGHT
    FXPacker, 
    FXGroupBox, 
    FXTopWindow, 
    only
    If you specify one of these four options, the child widget will be stuck to the top, bottom, left, or right, respectively in the layout manager cavity.  The cavity's size will be reduced by the amount lopped off by the packed widget.  LAYOUT_SIDE_TOP/LAYOUT_SIDE_BOTTOM will reduce the height of the cavity, and LAYOUT_SIDE_LEFT/LAYOUT_SIDE_RIGHT will reduce the width.
    For other composite widgets, these options may not have any effect
    LAYOUT_FILL_ROW
    LAYOUT_FILL_COLUMN
    FXMatrix
    only
    If LAYOUT_FILL_COLUMN is specified for all child widgets in a certain column in of a Matrix layout manager, the whole column can stretch if the Matrix itself is stretched horizontally.  Analoguously, if LAYOUT_FILL_ROW is specified for all child widgets in a certain row, the whole row is stretched if the Matrix layout manager is stretched vertically.
    LAYOUT_LEFT (default)
    LAYOUT_RIGHT
    all The widget will be placed on the left-side, or right side of the space remaining in the container.  When used for a child of FXPacker FXGroupBox, or FXTopWindow, the hint will be ignored unless either LAYOUT_SIDE_TOP or LAYOUT_SIDE_BOTTOM is specified.
    LAYOUT_TOP (default)
    LAYOUT_BOTTOM
    all The widget will be placed on the top-side or bottom-side of the space remaining in the container.  For a child of FXPacker etc., these options will only have effect if either LAYOUT_SIDE_RIGHT or LAYOUT_SIDE_LEFT is specified.
    LAYOUT_FIX_X
    LAYOUT_FIX_Y
    all Either none, one, or both of these hints may be specified.  The LAYOUT_FIX_X hint will cause the parent layout  manager to place this widget at the indicated X position, as passed on the optional arguments in the widgets constructor argument list. Likewise, a LAYOUT_FIX_Y hint will cause placement at the indicated Y position.  Note that the X and Y position is specified in the parent's coordinate system.
    LAYOUT_FIX_WIDTH
    LAYOUT_FIX_HEIGHT
    all These options will fix the widgets width (resp. height) to the value specified on the constructor.  You can change the widget's size using setWidth() and setHeight(), under program control; however, the layout manager will generally observe the specified dimensions of the widget without trying to modify it (unless other options override).
    LAYOUT_MIN_WIDTH (default)
    LAYOUT_MIN_HEIGHT (default)
    all Either none, one, or both of these hints may be specified. You will almost never specify these options, except perhaps for code legibility.  If LAYOUT_FIX_WIDTH or LAYOUT_FIX_HEIGHT are not specified, these options will cause the parent layout widget to use the default (or minimum) width and height, respectively.
    LAYOUT_CENTER_X
    LAYOUT_CENTER_Y
    all The widget will be centered in the x-direction (y-direction) in the parent.  Extra spacing will be added around the widget to place it at the center of the space available to it.  The widget's size will be its default size unless LAYOUT_FIX_WIDTH or LAYOUT_FIX_HEIGHT have been specified.
    LAYOUT_FILL_X
    LAYOUT_FILL_Y
    all Either none, one, or both of these hints may be specified.  LAYOUT_FILL_X will cause the parent layout manager to stretch or shrink the widget to accomodate the available space.  If more than one child with this option is placed side by side, the available space will be subdivided proportionally to their default size.
    LAYOUT_FILL_Y has the identical effect on the vertical direction.

General Purpose Layout Managers

    All general-purpose layout widgets have interior padding, to offset their child-widgets by some amount from the left, right, top, and bottom edge of the layout manager's interior edges, as well as horizontal and vertical spacing, which is extra space placed between child-widgets to prevent them from being stuck too close together.
    As usual, sensible default values are automatically supplied in the optional arguments on the constructor argument list so that in many cases, you will not need to specify specific values yourself.< All layout managers support the so-called packing styles:

Packing Styles

    The Layout managers support a number of packing styles which can influence the way their children are arranged.  These packing style flags override hints that child widgets may supply.  The following packing styles are available:

    Packing Style: Effect:
    PACK_UNIFORM_HEIGHT The PACK_UNIFORM_HEIGHT packing style causes the Layout Manager to compute the height of the tallest of its children, and then subsequently use this as the height for the remaining layout computations.  You can use this option to easily force different widgets to be the same height.
    PACK_UNIFORM_WIDTH Like PACK_UNIFORM_HEIGHT, PACK_UNIFORM_WIDTH forces each widget to be the same width.  The widget's own preferences such as LAYOUT_FIX_WIDTH are overridden.

Matrix Layout Widget

    The Matrix layout widget positions its children in nice rows and columns.  Besides the common General Purpose Layout options, Matrix also supports the following layout styles:

    Matrix Style: Effect:
    MATRIX_BY_ROWS (default) The MATRIX_BY_ROWS is the default, and usually does not need to be specified. 
    MATRIX_BY_COLUMNS When MATRIX_BY_COLUMNS is specified, the number of columns of the matrix is fixed, and equal to the number specified on the constructor argument list;  the number of rows is determined by the total number of children. 
    Conversely, if MATRIX_BY_COLUMNS is not specified, the number of rows is fixed and the number of columns is determined by the number of children. 

    In either case, Matrix places children top to bottom, left to right (left to right, top to bottom for MATRIX_BY_COLUMNS),  and determines the height of each row and width of each column as follows:

    1. If a column contains children which all have set the property LAYOUT_FILL_COLUMN, the whole column will be considered stretchable.  The amount of stretch is proportionally disbursed between all stretchable columns.
    2. If a row contains children which all have set the property LAYOUT_FILL_ROW, the whole row is stretchable.
    3. If a column is not stretchable, the column's width will be determined by the widest child in the column (or the widest child of all of them if the Matrix has PACK_UNIFORM_WIDTH has been specified).
    4. If a row is not stretchable, the row's height is determined by its tallest child in the row (or tallest child of all children if PACK_UNIFORM_HEIGHT).

    The Matrix widget then arranges each child in its appropriate row/column.  Within the column, a child that is not stretched may be centered in the column, or placed against the left or right edge of the column; likewise, within the row, a child that is not stretched may be centered in the row, or placed against the top or bottom.  Between each pair of columns, the Matrix layout manager adds a small amount of horizontal spacing.  Between each pair of rows, it applies some vertical spacing.
    Around the top, bottom, left, and right, the Matrix provides the usual interior padding for visual aesthetics.

    The Matrix layout manager ignores hints for a specific X or Y position of each child.

Packer Layout Widget

    The Packer layout widget places its children inside a cavity, packing them against one of the four sides, until the entire space is filled up.  Which side of the Packer a child is placed against is determined specifying one of the side hints:

    • LAYOUT_SIDE_TOP.  Forces placement of the child against the top side of the Packer.  This is the default, and may not have to be specified explicitly.
    • LAYOUT_SIDE_BOTTOM. Forces placement of the child against the bottom.
    • LAYOUT_SIDE_LEFT. Places the child against the left side of the Packer.
    • LAYOUT_SIDE_RIGHT. Places the child against the right side of the Packer.

    Each time a child is placed against one of the four sides on the inside of the packer, it  decreases the packer's interior by some amount.  If  the child is placed at the top or bottom, the height is decreased by the child's height; if placed against the left or right side, the width is reduced by the child's width.

    Even so, the Packer tries to observe as many layout hints as feasible.  Thus, for a child being packed on the left or right,  the hints LAYOUT_TOP and LAYOUT_BOTTOM are still observed and cause the widget to be placed against the top or bottom of the packer.  Likewise, the LAYOUT_FILL_Y and LAYOUT_CENTER_Y are also observed, and cause the child to stretch or center in the packer's cavity.

    Analaguous to the above, when a child is packed against the top or bottom, the Packer properly observes the LAYOUT_LEFT, LAYOUT_RIGHT, LAYOUT_FILL_X, and LAYOUT_CENTER_X hints.

    There is one special case:  When packing the last child, the Packer observes both LAYOUT_CENTER_X, LAYOUT_CENTER_Y, LAYOUT_FILL_X,  and LAYOUT_FILL_Y.  This will cause the Packer to completely fill the remaining space of the cavity with the last child widget.

    You can make use of this feature in a typical application by defining your Main Viewing area as the last widget to be placed.

Layout Suggestions

    FOX allows you either perform automatic layout or explicitly control over widget placement by specifying positions and sizes. The automatic layout has the advantage of accomodating changes of fonts, or changes in text labels or icons without any effort. This is especially interesting because it makes it quite easy to build GUI's under program control (e.g. by reading a configuration file or database schema).

    However, it takes a bit more forethought to figure out how various widget- layouts are structured, i.e. how various layout managers and controls are to be arranged to achieve the desired effect. Some hints:

    1. Work areas like multi-line text or OpenGL windows should be flexible both horizontally and vertically. This allows the user to grow the work area if desired.
    2. Simple text fields, sliders, dials, and so on should be stretchable horizontally if possible:- sliders and dials are more accurate if bigger, and you can see more of the text. Of course for vertical sliders and dials, you would want to allow vertical stretching.
    3. Buttons need not be stretchable, there is no point. However, it is pleasing to keep proper proportions in the dialog. This means keeping certain buttons the same size using PACK_UNIFORM_WIDTH, and centering them under the dialog with LAYOUT_CENTER_X under the content, for example.
    4. Nice tabular layouts can be achieved quickly using the Matrix layout manager. Selected rows and columns may be allowed to stretch vertically and horizontally.
    5. Because sizes are figured from the inside-out, it is better to force a few selected widgets like scroll areas to be a certain size and let the system figure the size of the dialog, rather than try and set the size of the dialog and hope that the scroll areas wind up big enough.
    6. You can use a borderless Frame widget as a "spacer" if some extra space is needed.

    Try to design dialogs to be resizable, because it is almost always the case that text fields, sliders, and list widgets would be able to take advantage of a larger screen area.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/license.html000066400000000000000000000756041326741342000157260ustar00rootroot00000000000000 Download
FOX Library License [Remove Frame]

    FOX basically follows the standard GNU Lesser General Public License (LGPL). Because of repeated questions on this topic, it has become apparent that many people still had a number of uncertainties about licensing issues.

    Also, a number of stipulations in the GNU Lesser Public License statement have evidently been an impediment to truely wide-spread adoption of the FOX Library.

    Thus, the intent of the License Addendum has been to provide clarification of a number of obscure issues in the GNU Lesser General Public License, and to relax a few of its stipulations with an eye to solving a couple of practical issues.

    Below follows the GNU Lesser Public License, followed by the FOX Library License addendum.

    Finally, detailed rationale behind the License Addendum is presented.

    		  GNU LESSER GENERAL PUBLIC LICENSE
    		       Version 2.1, February 1999
    
     Copyright (C) 1991, 1999 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.
    
    [This is the first released version of the Lesser GPL.  It also counts
     as the successor of the GNU Library Public License, version 2, hence
     the version number 2.1.]
    
    			    Preamble
    
      The licenses for most software are designed to take away your
    freedom to share and change it.  By contrast, the GNU General Public
    Licenses are intended to guarantee your freedom to share and change
    free software--to make sure the software is free for all its users.
    
      This license, the Lesser General Public License, applies to some
    specially designated software packages--typically libraries--of the
    Free Software Foundation and other authors who decide to use it.  You
    can use it too, but we suggest you first think carefully about whether
    this license or the ordinary General Public License is the better
    strategy to use in any particular case, based on the explanations below.
    
      When we speak of free software, we are referring to freedom of use,
    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 and use pieces of
    it in new free programs; and that you are informed that you can do
    these things.
    
      To protect your rights, we need to make restrictions that forbid
    distributors to deny you these rights or to ask you to surrender these
    rights.  These restrictions translate to certain responsibilities for
    you if you distribute copies of the library or if you modify it.
    
      For example, if you distribute copies of the library, whether gratis
    or for a fee, you must give the recipients all the rights that we gave
    you.  You must make sure that they, too, receive or can get the source
    code.  If you link other code with the library, you must provide
    complete object files to the recipients, so that they can relink them
    with the library after making changes to the library and recompiling
    it.  And you must show them these terms so they know their rights.
    
      We protect your rights with a two-step method: (1) we copyright the
    library, and (2) we offer you this license, which gives you legal
    permission to copy, distribute and/or modify the library.
    
      To protect each distributor, we want to make it very clear that
    there is no warranty for the free library.  Also, if the library is
    modified by someone else and passed on, the recipients should know
    that what they have is not the original version, so that the original
    author's reputation will not be affected by problems that might be
    introduced by others.
    
      Finally, software patents pose a constant threat to the existence of
    any free program.  We wish to make sure that a company cannot
    effectively restrict the users of a free program by obtaining a
    restrictive license from a patent holder.  Therefore, we insist that
    any patent license obtained for a version of the library must be
    consistent with the full freedom of use specified in this license.
    
      Most GNU software, including some libraries, is covered by the
    ordinary GNU General Public License.  This license, the GNU Lesser
    General Public License, applies to certain designated libraries, and
    is quite different from the ordinary General Public License.  We use
    this license for certain libraries in order to permit linking those
    libraries into non-free programs.
    
      When a program is linked with a library, whether statically or using
    a shared library, the combination of the two is legally speaking a
    combined work, a derivative of the original library.  The ordinary
    General Public License therefore permits such linking only if the
    entire combination fits its criteria of freedom.  The Lesser General
    Public License permits more lax criteria for linking other code with
    the library.
    
      We call this license the "Lesser" General Public License because it
    does Less to protect the user's freedom than the ordinary General
    Public License.  It also provides other free software developers Less
    of an advantage over competing non-free programs.  These disadvantages
    are the reason we use the ordinary General Public License for many
    libraries.  However, the Lesser license provides advantages in certain
    special circumstances.
    
      For example, on rare occasions, there may be a special need to
    encourage the widest possible use of a certain library, so that it becomes
    a de-facto standard.  To achieve this, non-free programs must be
    allowed to use the library.  A more frequent case is that a free
    library does the same job as widely used non-free libraries.  In this
    case, there is little to gain by limiting the free library to free
    software only, so we use the Lesser General Public License.
    
      In other cases, permission to use a particular library in non-free
    programs enables a greater number of people to use a large body of
    free software.  For example, permission to use the GNU C Library in
    non-free programs enables many more people to use the whole GNU
    operating system, as well as its variant, the GNU/Linux operating
    system.
    
      Although the Lesser General Public License is Less protective of the
    users' freedom, it does ensure that the user of a program that is
    linked with the Library has the freedom and the wherewithal to run
    that program using a modified version of the Library.
    
      The precise terms and conditions for copying, distribution and
    modification follow.  Pay close attention to the difference between a
    "work based on the library" and a "work that uses the library".  The
    former contains code derived from the library, whereas the latter must
    be combined with the library in order to run.
    
    		  GNU LESSER GENERAL PUBLIC LICENSE
       TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
    
      0. This License Agreement applies to any software library or other
    program which contains a notice placed by the copyright holder or
    other authorized party saying it may be distributed under the terms of
    this Lesser General Public License (also called "this License").
    Each licensee is addressed as "you".
    
      A "library" means a collection of software functions and/or data
    prepared so as to be conveniently linked with application programs
    (which use some of those functions and data) to form executables.
    
      The "Library", below, refers to any such software library or work
    which has been distributed under these terms.  A "work based on the
    Library" means either the Library or any derivative work under
    copyright law: that is to say, a work containing the Library or a
    portion of it, either verbatim or with modifications and/or translated
    straightforwardly into another language.  (Hereinafter, translation is
    included without limitation in the term "modification".)
    
      "Source code" for a work means the preferred form of the work for
    making modifications to it.  For a library, 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 library.
    
      Activities other than copying, distribution and modification are not
    covered by this License; they are outside its scope.  The act of
    running a program using the Library is not restricted, and output from
    such a program is covered only if its contents constitute a work based
    on the Library (independent of the use of the Library in a tool for
    writing it).  Whether that is true depends on what the Library does
    and what the program that uses the Library does.
    
      1. You may copy and distribute verbatim copies of the Library's
    complete 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 distribute a copy of this License along with the
    Library.
    
      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 Library or any portion
    of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
    
        b) You must cause the files modified to carry prominent notices
        stating that you changed the files and the date of any change.
    
        c) You must cause the whole of the work to be licensed at no
        charge to all third parties under the terms of this License.
    
        d) If a facility in the modified Library refers to a function or a
        table of data to be supplied by an application program that uses
        the facility, other than as an argument passed when the facility
        is invoked, then you must make a good faith effort to ensure that,
        in the event an application does not supply such function or
        table, the facility still operates, and performs whatever part of
        its purpose remains meaningful.
    
        (For example, a function in a library to compute square roots has
        a purpose that is entirely well-defined independent of the
        application.  Therefore, Subsection 2d requires that any
        application-supplied function or table used by this function must
        be optional: if the application does not supply it, the square
        root function must still compute square roots.)
    
    These requirements apply to the modified work as a whole.  If
    identifiable sections of that work are not derived from the Library,
    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 Library, 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 Library.
    
    In addition, mere aggregation of another work not based on the Library
    with the Library (or with a work based on the Library) on a volume of
    a storage or distribution medium does not bring the other work under
    the scope of this License.
    
      3. You may opt to apply the terms of the ordinary GNU General Public
    License instead of this License to a given copy of the Library.  To do
    this, you must alter all the notices that refer to this License, so
    that they refer to the ordinary GNU General Public License, version 2,
    instead of to this License.  (If a newer version than version 2 of the
    ordinary GNU General Public License has appeared, then you can specify
    that version instead if you wish.)  Do not make any other change in
    these notices.
    
      Once this change is made in a given copy, it is irreversible for
    that copy, so the ordinary GNU General Public License applies to all
    subsequent copies and derivative works made from that copy.
    
      This option is useful when you wish to copy part of the code of
    the Library into a program that is not a library.
    
      4. You may copy and distribute the Library (or a portion or
    derivative of it, under Section 2) in object code or executable form
    under the terms of Sections 1 and 2 above provided that you 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.
    
      If distribution of 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 satisfies the requirement to
    distribute the source code, even though third parties are not
    compelled to copy the source along with the object code.
    
      5. A program that contains no derivative of any portion of the
    Library, but is designed to work with the Library by being compiled or
    linked with it, is called a "work that uses the Library".  Such a
    work, in isolation, is not a derivative work of the Library, and
    therefore falls outside the scope of this License.
    
      However, linking a "work that uses the Library" with the Library
    creates an executable that is a derivative of the Library (because it
    contains portions of the Library), rather than a "work that uses the
    library".  The executable is therefore covered by this License.
    Section 6 states terms for distribution of such executables.
    
      When a "work that uses the Library" uses material from a header file
    that is part of the Library, the object code for the work may be a
    derivative work of the Library even though the source code is not.
    Whether this is true is especially significant if the work can be
    linked without the Library, or if the work is itself a library.  The
    threshold for this to be true is not precisely defined by law.
    
      If such an object file uses only numerical parameters, data
    structure layouts and accessors, and small macros and small inline
    functions (ten lines or less in length), then the use of the object
    file is unrestricted, regardless of whether it is legally a derivative
    work.  (Executables containing this object code plus portions of the
    Library will still fall under Section 6.)
    
      Otherwise, if the work is a derivative of the Library, you may
    distribute the object code for the work under the terms of Section 6.
    Any executables containing that work also fall under Section 6,
    whether or not they are linked directly with the Library itself.
    
      6. As an exception to the Sections above, you may also combine or
    link a "work that uses the Library" with the Library to produce a
    work containing portions of the Library, and distribute that work
    under terms of your choice, provided that the terms permit
    modification of the work for the customer's own use and reverse
    engineering for debugging such modifications.
    
      You must give prominent notice with each copy of the work that the
    Library is used in it and that the Library and its use are covered by
    this License.  You must supply a copy of this License.  If the work
    during execution displays copyright notices, you must include the
    copyright notice for the Library among them, as well as a reference
    directing the user to the copy of this License.  Also, you must do one
    of these things:
    
        a) Accompany the work with the complete corresponding
        machine-readable source code for the Library including whatever
        changes were used in the work (which must be distributed under
        Sections 1 and 2 above); and, if the work is an executable linked
        with the Library, with the complete machine-readable "work that
        uses the Library", as object code and/or source code, so that the
        user can modify the Library and then relink to produce a modified
        executable containing the modified Library.  (It is understood
        that the user who changes the contents of definitions files in the
        Library will not necessarily be able to recompile the application
        to use the modified definitions.)
    
        b) Use a suitable shared library mechanism for linking with the
        Library.  A suitable mechanism is one that (1) uses at run time a
        copy of the library already present on the user's computer system,
        rather than copying library functions into the executable, and (2)
        will operate properly with a modified version of the library, if
        the user installs one, as long as the modified version is
        interface-compatible with the version that the work was made with.
    
        c) Accompany the work with a written offer, valid for at
        least three years, to give the same user the materials
        specified in Subsection 6a, above, for a charge no more
        than the cost of performing this distribution.
    
        d) If distribution of the work is made by offering access to copy
        from a designated place, offer equivalent access to copy the above
        specified materials from the same place.
    
        e) Verify that the user has already received a copy of these
        materials or that you have already sent this user a copy.
    
      For an executable, the required form of the "work that uses the
    Library" must include any data and utility programs needed for
    reproducing the executable from it.  However, as a special exception,
    the materials to be 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.
    
      It may happen that this requirement contradicts the license
    restrictions of other proprietary libraries that do not normally
    accompany the operating system.  Such a contradiction means you cannot
    use both them and the Library together in an executable that you
    distribute.
    
      7. You may place library facilities that are a work based on the
    Library side-by-side in a single library together with other library
    facilities not covered by this License, and distribute such a combined
    library, provided that the separate distribution of the work based on
    the Library and of the other library facilities is otherwise
    permitted, and provided that you do these two things:
    
        a) Accompany the combined library with a copy of the same work
        based on the Library, uncombined with any other library
        facilities.  This must be distributed under the terms of the
        Sections above.
    
        b) Give prominent notice with the combined library of the fact
        that part of it is a work based on the Library, and explaining
        where to find the accompanying uncombined form of the same work.
    
      8. You may not copy, modify, sublicense, link with, or distribute
    the Library except as expressly provided under this License.  Any
    attempt otherwise to copy, modify, sublicense, link with, or
    distribute the Library 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.
    
      9. 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 Library or its derivative works.  These actions are
    prohibited by law if you do not accept this License.  Therefore, by
    modifying or distributing the Library (or any work based on the
    Library), you indicate your acceptance of this License to do so, and
    all its terms and conditions for copying, distributing or modifying
    the Library or works based on it.
    
      10. Each time you redistribute the Library (or any work based on the
    Library), the recipient automatically receives a license from the
    original licensor to copy, distribute, link with or modify the Library
    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 with
    this License.
    
      11. 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 Library at all.  For example, if a patent
    license would not permit royalty-free redistribution of the Library 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 Library.
    
    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.
    
      12. If the distribution and/or use of the Library is restricted in
    certain countries either by patents or by copyrighted interfaces, the
    original copyright holder who places the Library 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.
    
      13. The Free Software Foundation may publish revised and/or new
    versions of the Lesser 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 Library
    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 Library does not specify a
    license version number, you may choose any version ever published by
    the Free Software Foundation.
    
      14. If you wish to incorporate parts of the Library into other free
    programs whose distribution conditions are incompatible with these,
    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
    
      15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
    WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
    EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
    OTHER PARTIES PROVIDE THE LIBRARY "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
    LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
    THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
    
      16. 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 LIBRARY 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
    LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
    SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
    DAMAGES.
    
    		     END OF TERMS AND CONDITIONS
    
    

    
    
                               ADDENDUM TO LICENSE
                                   March 2003
    
                    Copyright (C) 2002,2005 Jeroen van der Zijp.
    
            Everyone is permitted to copy and distribute verbatim copies
         of this license addendum document, but changing it is not allowed.
    
    
    FOX Toolkit Library License Addendum.
    
    
    1. License.  The FOX Toolkit Library ("The Library") is licensed under GNU
    Lesser General Public License as published by the Free Software Foundation,
    version 2.1 of the License, or (at your option) any later version.
    
    2. Relinking Exemption.  You may distribute a combined work using a
    statically linked, unmodified copy of the FOX Library under terms of your
    choice, without the relinking requirement stipulated under the GNU Lesser
    Public License, subject to the following conditions:
    
      a. This static relinking exemption covers only the FOX Toolkit Library.
      Other libraries which the FOX Library may need are covered by their own
      respective licenses.
    
      b. Modification of the configure scripts, makefiles, or installation
      tools of the FOX Library to support a specific platform does not
      constitute creating a modified copy based on the FOX Library.
    
      c. Programs or binaries statically linked with the FOX Library must be
      identified as such by including, in the Documentation or by other means
      (for example in the About Box or Online Help), the following statement:
    
      "This software uses the FOX Toolkit Library (http://www.fox-toolkit.org)."
    
      d. Subclassing from Objects or Widgets supplied by the Library involves
      no modifications to the source code of the Library itself, and does not
      constitute creating a modified copy based on the Library.
    
    3. If you do not accept or are unable to meet the conditions under (2), you
    may continue to distribute the combined work under the original GNU Lesser
    General Public License.
    
    
                                 END OF ADDENDUM
    
    

Rationale

    We now launch into a point by point discussion of the License Addendum:

    • Point 1. says that basically, FOX follows the GNU Lesser General Public License.
    • Point 2. addresses the practical problem of static linking FOX into an application program or combined work. The GNU Lesser General Public License insists that the recipient of a distribution of a combined work i.e. a program linked with the Library, be allowed to relink.

      Linking a program dynamically is usually the easiest way to comply with this stipulation. However, there are sometimes practical or logistical problems which make it difficult to comply with this requirement.

      We have taken the position that static linking is functionally equivalent to dynamic linking, and we're not really denying the recipient of a statically linked program any source code he or she wouldn't be able to obtain otherwise, as long as the program is linked with an unmodified copy of the Library.

      Static linking with a modified copy of the Library, however, would deny the community the benefit of these modifications, as these modifications would now be locked up inside a closed binary executable, so therefore we must insist on the original GNU Lesser General Public License when the Library has been modified.

      • Item a. says we can not make any statements about anyone else's code; if your application must use other libraries (jpeg, png, tiff, glibc, and so on), then you must observe the licenses of these other libraries.
      • Item b. clarifies that when we're talking about derived works, we're not talking about making some minor changes to Makefiles or configuration scripts which are often needed to make the code compile on a particular platform or compiler.
      • Item c. requires you to identify your program as using the FOX library. With static linking, there would be no way for a normal user to tell otherwise. We request that you include the given statement, and preferably a version number also. The motivation is two-fold:

        • A certain amount of publicity for the FOX Library :-).
        • Some way for recipients of your program to verify that the distribution was made according to the FOX License. This might appease some license-vigilantes.

      • Item d. aims to differentiate between the C++ programmer's interpretation of deriving (or subclassing), and the legal concept of making a derived work. When you're subclassing your own class from an existing FOX widget or other object, you're not making any changes to the source text of the FOX Library itself, and hence this cannot be interpreted as a derivate work in the legal sense.

    • Point 3. says that if you are unwilling or unable to meet these demands, then you can always distribute your program under the original GNU Lesser General Public License.

    This concludes our remarks on the License revision; please feel free to contact me if you have additional questions. The rationale section will likely be expanded when there are still questions left unanswered.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/menu.css000066400000000000000000000037151326741342000150660ustar00rootroot00000000000000BODY { font-size:10pt; } A { color:#404040; font-size:10pt; font-family:verdana,sans-serif; text-decoration:none; } A:hover { color:#993300; font-size:10pt; font-family:verdana,sans-serif; text-decoration:none; } .DECORTHING { color:silver; background-color:gray; width:20px; height:100% } .SEPHOR { color:silver; background-color:#000000; height:1px; width:100%; }                .SEPVER { color:silver; background-color:#000000; width:1px; height:100% }                UL { list-style-type:square; } LI { white-space:pre; } #TOPTITLE { color: silver; background-color:black; font-family:verdana,sans-serif; font-size:10pt; font-variant:small-caps; font-weight:bolder; letter-spacing:4pt; text-align:center; }        #LOGO { color: silver; background-color: silver; font-family:verdana,sans-serif; font-size:10pt; font-variant:small-caps; font-weight:bolder; letter-spacing:4pt; text-align:right; } #MENU { color:black; background-color:#6495ED; font-family:verdana,sans-serif; font-size:10pt; font-weight:bolder; vertical-align:text-top; padding-left:5px; padding-top:20px; margin-top:0px; width:130px; height:100%; } .PAGEMENULINK { color:#993300; text-decoration:none; background-color:white; } .PAGEMENULINK:hover { color:#040404; text-decoration:underline; background-color:white; } #submenuitem { color:black; background-color:#B0C4DE; font-family:verdana,sans-serif; font-size:10pt; font-weight:normal; text-align:left; vertical-align:top; padding-left:2px; padding-top:2px; width:200px; }                #PAGETITLE { color:black; background-color:gray; font-family:verdana,sans-serif; font-size:10pt; font-variant:small-caps; font-weight:bolder; letter-spacing:4pt; text-align:left; padding-left:3pt; } .PAGE { color:black; background-color:white; font-family:times,serif; font-size:11pt; font-weight:normal; text-align:left; vertical-align:top; padding-left:10px; padding-top:10px; padding-right:10px; }        .NEWSSECTION { padding-left:30px; }        fox1.6-1.6.57/doc/menu.html000066400000000000000000000067241326741342000152450ustar00rootroot00000000000000 fox-toolkit.org - menu page
 

Home
News
Download
Installation
Documentation
Mailing Lists
FAQ
License
Goals & Approach
FXRex
Screenshots


Adie
PathFinder
FOX Calculator


Projects


Mailing List
List Archive
Another Archive
FOX Community
Japanese Docs


FXPy
FXRuby
EiffelFox


Class Reference 1.2
Class Reference 1.4
Class Reference 1.6
Class Reference DEV
Transition 1.0->1.2


GPG Key
Consulting


Copyright © 1997-2005
Jeroen van der Zijp

fox1.6-1.6.57/doc/messages.html000066400000000000000000000433311326741342000161030ustar00rootroot00000000000000 Documentation: Messages
Documentation: Messages [Remove Frame]

Why a Target/Message System

    There are many methods to connect Graphical User Interface elements to an application code; the most common methods being used today are callback functions.  However, in C++, callback functions are not an obvious choice, as the technique does not easily allow a certain object to be specified.

    Another method being used in C++ is the signal-slot technique. In its typical implementation, connector objects are created that connect a signal to a slot. However, in order to provide the necessary isolation between caller and callee, template instantiations are involved; this limits its use to compile-time connectivity.

    The approach taken by FOX is a Target/Message System. Each Widget sends its message to a certain object called the target. As there may be multiple Widgets sending messages to one specific target, a message id is used to tell them apart.

    Moreover, a single Widget may be able to send several kinds of messages; this problem is solved by typing the messages by a message type. Using the message type and message id, the source and type of a GUI event or action can be uniquely identified.
    Messages can be sent to any object that is derived (directly or indirectly) from FXObject. Of course, all FOX Widgets are derived from FXObject, and so is the FXApp application object. Thus pretty much every object in FOX is able to receive messages.

    An advantage of the fact that an explicit object is the target of a message (as opposed to lets say an implicit message routing scheme), is the fact that message id's don't have to be globally unique within an application; all that is required is that it is unique for a certain class and its base classes.

    This is a particularly important consideration when one considers making component oriented software, where components are perhaps written by different people, or even different organizations.
    With FOX, they do not have to coordinate message id's with each other in order for components to interact properly.
    Another important benefit of the target/message system is the fact that the message a Widget sends, and the target to whom it sends it, may be changed at run time.

    This is an significant benefit for building programs such as GUI Builders and other component oriented software. Finally, since all FOX Widgets derive from FXObject, they are capable of receiving messages, as well as sending them.
    This allows FOX Widgets to implement a number of typical commands that are common in GUI systems; for example, consider the following code ragment:

    new FXHorizontalFrame(main,LAYOUT_SIDE_TOP|LAYOUT_FILL_X);
    ....
    ....
    ....
    new FXMenuCommand(windowmenu,"&Toolbar",NULL,toolbar,FXWindow::ID_TOGGLESHOWN);
    

    In the above example, the toolbar Widget is a direct target of the MenuCommand Widget.  Each time the Toolbar command is invoked, it will toggle the toolbar Widget on or off.  Moreover, when the GUI Update process takes place during idle time, the MenuCommand will also send an update message to the toolbar Widget; in response to this update, the toolbar examines its current state, and either checks or unchecks the MenuCommand by sending it back a ID_CHECK or ID_UNCHECK message.

    Note that the toolbar can not assume that the sender of the update message is a MenuCommand; but it does know its an FXObject!  So it needs to send a ID_CHECK (ID_UNCHECK) message to this object instead of trying to call the check() or uncheck() member function of MenuCommand directly.
    The above code fragment shows the flexibility of the target/message system, especially when combined with the GUI Update idle processing capability.  The mechanism is used extensively inside FOX itself as well.

Message Maps

    The messages an object receives are mapped to a specific member function of the object by means of a message map.  A message map is nothing but a static, compile-time defined table which associates one or more messages with a certain member function.  Complicated Widgets may have several dozen messages that are being mapped this way.  Message maps are un unfortunate necessity in C++ as the exact binding of a message to a member function is performed at run time; C++ does not natively support such dynamic binding very well.Fortunately, FOX makes it fairly easy to define those message maps by providing a number of macros to set them up.  The following code fragment illustrates the process:

    FXDEFMAP(FXGLViewer) FXGLViewerMap[]={
      FXMAPFUNC(SEL_PAINT,0,FXGLViewer::onPaint),
      ....
      FXMAPFUNCS(SEL_UPDATE,MINKEY,MAXKEY,FXGLViewer::onUpdAll),
      };
    
    FXIMPLEMENT(FXGLViewer,FXGLCanvas,FXGLViewerMap,ARRAYNUMBER(FXGLViewerMap))
    

    The FXDEFMAP macro takes as the argument the name of the class.  It is used to define the entries into the message map table.  The FXMAPFUNC macro takes three arguments:- first, the type of the message, second, the id of the message, and last the member function to which this message is being mapped.  A similar macro called FXMAPFUNCS is used to define a range of message id's instead of just one.  You can use this macro to map a many messages to one and the same member function.

    For example, in a calculator program you may have one button for '0', '1', and so on till '9'.  Instead of defining ten very similar member functions, you can define just one of them.  The member function can use the macro FXSELID(sel) to acquire the id of the message that called it, and FXSELTYPE(sel) to find the messsage type of the message.

    The last macro FXIMPLEMENT has four arguments: the name of the class, the name of the immediate base class, a pointer to the message map, and the number of entries in the message map.  If an object does not implement any message handlers, you may pass NULL and 0 for these last two arguments instead.  The corresponding macro in the header file is called FXDECLARE.

    Every FOX object should always use FXDECLARE in its header file or class declaration, and FXIMPLEMENT in its implementation file!

    Besides FXMAPFUNC and FXMAPFUNCS, there are two (rarely used) macros that key on the message type only; FXMAPTYPE takes just two arguments, the message type and the member function, and FXMAPTYPES takes three, the first and last message id, and the member function.  FXMAPTYPE and FXMAPTYPES will completely disregard the message id, and map any message of the appropriate type to the indicated member function.

    All message id's should be in the range MINKEY to MAXKEY, and all message types in the range MINTYPE to MAXTYPE.  In addition, the special message id of zero (0) is reserved for system-originated messages.

    Messages are resolved to the message handler functions from the derived class upward to the base class.  This allows developers to catch messages in their derived class, before it gets handled in the base class.  Thus, you can easily redefine behavior of FOX built-in Widgets.

    As the message association is performed at run time, it is common practice to place the most-often occurring messages first in the map; this way, the least amount of searching takes place to find them; thus, the SEL_PAINT message is often placed first.

Keeping Track of Message Numbering

    FOX does not require that all message id's be globally unique.  However, it does require that they are unique for a specific target.  The messages understood by a target are the union of the messages understood by the target's class, and all of its base classes.
    An easy way to keep the numbering straight is to use enums.  FOX itself uses the technique illustrated below:

    class FXWindow : public FXDrawable {
      ...
    public:
      enum {
        ID_SHOW=1,
        ID_HIDE,
        ...
    
        ID_LAST
    
      };
    public:
    ...
    };
    
    class MyWindow : public FXWindow {
    ...
    public:
      enum {
        ID_MYMESSAGE=FXWindow::ID_LAST,
        ID_MYOTHERMESSAGE,
        ...
        ID_LAST
        };
    public:
    ...
    };
    

    This way, the compiler will automatically arrange to make sure the numbering is correct.  It is also easy to add more messages in before ID_LAST,  a recompile will adjust the message id's automatically.  Of course, you're welcome to use any other scheme if so desired; just make sure your messages do not clash with those of the base-classes of your object.

Message Targets should Outlive Message Sources

    It is obvious that when a Widget sends a message to some object, the receiving object should of course still exist.  A potential pitfall would rear its ugly head if this were not true.  Fortunately, in most cases, Control widgets will send messages to their containing Dialog Box, or the Application Object, or other long-lived objects.  In rare cases, you may want to make sure that as a Widget or Object is deleted, all references to it are cleaned up as well.FOX provides two member functions:

      FXWindow::setTarget(FXObject* tgt)
    

    and

      FXWindow::setSelector(FXSelector sel)
    

    that allow you to change the target, as well as the message that a Widget will send.  Setting the target of a Widget to NULL will stop it from sending any future messages to anybody.

    In order to catch the possibility that messages would be sent to an object that has been destructed, FOX will utterly thrash each object in the destructor.  Thus, if such a bug exists in an application, it is likely to surface quickly, leading to more reliable programs.

Sending Your Own Messages

    In many cases, you will want to send messages to Widgets yourself.  For example, in an GUI update handler you may want to send a message to the sender of the update message:

    ....
    FXMAPFUNC(SEL_COMMAND,FXWindow::ID_TOGGLESHOWN,FXWindow::onCmdToggleShown),
    // Command
    FXMAPFUNC(SEL_UPDATE,FXWindow::ID_TOGGLESHOWN,FXWindow::onUpdToggleShown),
    // Update
    ....
    // Hide or show window<
    long FXWindow::onCmdToggleShown(FXObject*,FXSelector,void*){
      ....
      return 1;
      }
    
    // Update hide or show window
    long FXWindow::onUpdToggleShown(FXObject* sender,FXSelector,void*){
    
      sender->handle(this,shown()?FXSEL(SEL_COMMAND,ID_CHECK)
                                  :FXSEL(SEL_COMMAND,ID_UNCHECK),NULL);
      return 1;
      }
    

    What happens here? During GUI Updating, the Menu Command connected to the Toolbar sends a SEL_UPDATE message [instead of the SEL_COMMAND it sends when the command is invoked by the user].
    The onUpdToggleShown function above determines whether the Toolbar is currently shown, then sends a ID_CHECK or ID_UNCHECK back to the sender.
    Upon getting the ID_CHECK or ID_UNCHECK, a Menu Command object will subsequently place or remove a little check mark in front of its label.
    If the sender of the SEL_UPDATE message were some other Widget, e.g. a Check Button, it would still work properly, although the Check Button's implementation of the ID_CHECK and ID_UNCHECK handlers is of course completely different.
    If the sender of the SEL_UPDATE message were some completely different Widget, it would simply ignore the return message.

    By sending messages instead of calling a member function directly, the function above does not need to know what type of Widget sent the SEL_UPDATE message; it just sends a message back; if the sender of the message does not understand the message, nothing happens.  Note that it is guaranteed that the sender of a message is always an object derived from FXObject.

    The FXSEL macro composes to 16 bit unsigned short numbers into one 32 bit unsigned int.  Composing the message types and message id's this way allows for more efficient matching of messages.

Message Handler Return Values

    You may have noticed that some message handlers return 1, and some return 0. The general convention is, that if the message can be considered handled, i.e. it is normally processed, the handler should return 1Otherwise, it should return 0.
    Properly returning the correct return value will allow for intelligent message routing through your application. For messages directly resulting from a user-input event, such as button presses etc., FOX will use the return value of the message handler to determine if the GUI needs to be refreshed.

    For example, if the system sent a SEL_LEFTBUTTONPRESS to your Widget, and your Widget's handler returned 1, it is considered handled; next time the system goes into idle processing, all the GUI Widgets in the application will be updated again as it is assumed that by handling the button message, something may have changed.  If your  handler had returned 0, the message would have been considered unhandled, and nothing further would happen.

Message Routing and Delegation

    Messages may be forwarded from one object to another.  For example, upon receipt of a message, a target may first try to handle the message itself; then, if no match is found, it may try its luck by forwarding the message to some other object.  Here's how you would code this up:

    // Delegate message
    long MyWidget::onDefault(FXObject* sender,FXSelector key,void* data){
      return delegateObject && delegateObject->handle(sender,sel,data);
      }
    

    We use here the fact that we can overload the so-called default message handler, onDefault(). The default message handler is called when no message binding has been found for a message.

    In the above code fragment, delegateObject is assumed to be some type of object derived from FXObject.   You can use these delegation techniques very creatively.

    Note that you probably want to start the message id's of the delegateObject from where the delegator MyWidget left off, i.e. make sure there is no overlap unless its intended.

    In a few cases, some message which would be handled by MyWidget's base class needs to be forwarded to the delegateObject. You can easily do this by simply mapping that message to onDefault() in MyWidget's message map:

      FXMAPFUNC(SEL_COMMAND,BaseWidget::ID_DOSOMETHING,MyWidget::onDefault),
    

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/news.html000066400000000000000000000235651326741342000152570ustar00rootroot00000000000000 News
News [Remove Frame]

March 21 - FOX STABLE 1.6.0

  • New FXExpression class to evaluate numerical expressions. Its fast as it compiles to easy to interpret byte-code. It also allows expressions with variable arguments, which can be named arbitrarily.
  • Fixed but in fxtoDos and fxfromDOS; the end-of-string is no longer accounted for in the length [but it is still added, for convenience].
  • Changed sleep() API of FXThread; it now has a single argument, the number of nanoseconds to sleep.
  • Added wakeat() API to FXThread. The wakeat() API sleeps till the given absolute time is reached. The time is expressed as a 64-bit long counting nanoseconds since Jan. 1, 1970.
  • Added time() API to FXThread. It returns nanoseconds since Jan. 1, 1970.
  • Internal timer calculations in FXApp now use FXThread::time() and so on.
  • FXCondition's wait() API now also waits a number of nanoseconds.
  • Fixed tooltip on FX7Segment widget.
  • Fixed document-comment in FXString.
  • Added update handlers for FXTable row/column selection.
  • Bug in fxrgbio fixed.
  • Warning in FXWindow fixed.
  • Added sample program for expression class.
  • fxsleep() is now deprecated. Please stop using it!

March 21 - FOX STABLE 1.4.32

  • Back-ported fixes for GCC 4.1 C++ Language Changes [Friend Injection].

February 10 - FOX STABLE 1.6.0 (Release Candidate 4)

  • Updated FXRealSpinner. New API setGranularity() allows the values to stay at "nice round numbers".
  • Logarithmic mode of FXRealSpinner also updated.
  • Updated FX4Splitter. In case only one panel is collapsed, panel besides it will stretch to fit.
  • Also fixed layout issue with FX4Splitter which inadvertently placed barsize worth of pixels on the side even if all but one panel was collapsed.
  • Update FX4Spliiter's default size computation based on which panels are collapsed; this has gotten a bit complex now.

February 6 - FOX STABLE 1.6.0 (Release Candidate 3)

  • Reconciled API inconsistencies between FXObjectList and FXArray.
  • Added mimeType constant to FX***Image and FX***Icon classes for drag and drop and clipboard support.
  • Added auto-repeat snapshot capability to shutterbug.
  • Added auto-renumbering option for row and column headers in FXTable.
  • Implemented no-navigation mode in FXFileDialog.
  • Extra option for compression quality added to FXJPGImage and FXJPGIcon.
  • Added missing FXAPI to codec declarations.
  • Block generation of some callback messages if message is 0.
  • Improved fxbmpio implementation by directly using FXStream's primitive types.
  • Fixed issue with FXStat::touched().
  • Added bunch of missing API's to FXTable to control row and column header appearance.
  • Added ComboBox table item to enter a choice among a number of strings.
  • Added FXExpression which contains a function to evaluate expression.
  • Added Control-click mode to FXSpinner and FXRealSpinner.
  • Adie shows number of rows in status bar instead of byte count.
  • Wheel support in FXOptionMenu.
  • The setValue() API in FXRuler now has value relative to document position.
  • The setArrowPosY() and setArrowPosY() APIs in FXRulerView also relative to document position.

December 19 - FOX STABLE 1.6.0 (Release Candidate 2)

  • Added FXRulerView widget. The ruler view coordinates the scroll bars and rulers to automatically adjust to the stated document dimensions and margin settings for a document- oriented workview. It is intended as a base class for an applications document drawing framework.
  • Added FILELIST_NO_PARENT option to FXFileList to suppress '.' and '..' display in directory lists.
  • Added extra field in FILETYPES binding for "change directory" and "run in terminal" flags.
  • Optimized FXText continuous wrap mode layout update when using fixed-pitch fonts; this frequent scenario is quite a bit faster now; also greatly simplified layout handling in FXText.
  • Fixed layout issues with LAYOUT_FIX_X and LAYOUT_FIX_Y in FXPacker, FXTopWindow, FXGroupBox, FXHorizontalFrame, and FXVerticalFrame widgets.
  • Updated FXArray implementation; many API's added, a few dropped to so as to require no insert- or extract operators, or equality operators, on the contained items.
  • Updated FXVec{2,3,4}{d,f} classes; changed many friend functions to members, added explicit declarations for remaining friend functions in preparation for GCC 4.1 C++-language-change.
  • Small changes to FXQuat{d,f}. Some friend functions have become member functions.
  • Updated xinc.h to accomodate broken prototypes on older unix machines with respect to input method support.
  • Also simplified FXText layout logic.
  • Fixed tons of warnings on SGI, HPUX, Solaris, OSF1, and Windows builds.
  • Split FXComposeContext creation from construction. This is necessary as input method editor server may come and go.
  • Updated FXHash class with a few additional API's to make it easier to look over all contents in the table.
  • Added clearElms() API to FXElement.h.
  • Fixed FXVisual getNumGreen() and getNumBlue() access functions.
  • Expunged a number of FXbool in favor of bool.
  • Speeded up fxloadBMP(), fxsaveBMP(), fxloadICO() and fxsaveICO() functions through use of byte-swapping capability of FXStream.
  • Fixed typo in FXDebugTarget.
  • Fixed problem in FXFile::removeFiles().
  • Removed tons of warnings on Solaris builds.
  • Turned off XIM by default until it works across the board.

November 29 - FOX STABLE 1.4.26

  • Fixed SUN Solaris compile issue with threads.
  • Missing fxcheckTIF(), fxcheckPNG(), fxcheckJPG() declarations if TIF, PNG, and JPEG support is stubbed out.

November 14 - FOX STABLE 1.4.24

  • Fixed small issue in FXVec4{d,f} distance() routine.

November 9 - FOX STABLE 1.4.23

  • Fixed compile issue with new GetOwnModuleHandle() function.
  • Delete thread local storage key upon global destructor in FXThread.

Older News

Older news...

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/news1.html000066400000000000000000003655751326741342000153520ustar00rootroot00000000000000 News
News [Remove Frame]

January 20, 2004 - New drop: DEVELOPMENT FOX 1.1.45

Nice Anti-aliased fonts are here!

  • Rolled in Ivan Markov's Xft2 patch (Thanks Ivan!). Had to change stuff around a bit; if I broke it, don't blame Ivan please!).
    Xft2 requires freetype2 as well as fontconfig and Xft2 to be installed; it needs to be specifically enabled at this time by passing the option --with-xft=yes to configure. Saying yes means Xft2 will be enabled if the header files are present. If Xft2 is not in your version of XFree, then we can't turn it on!
    The initialization of the Xft2 library is at this time extraordinarily slow; (but as best as I can tell, its not my fault!). Still, this is something that needs tracking down some time.
  • Updated VC++, Borland C++ files based on feedbacks from the mailing list.
  • Fixed a few build issues, some important warnings (possible hazards on other systems) fixed.
  • Added alternative modal error, warning, question, and information dialog box routines; these will come in handy if there's no owner window.
  • Also added PLACEMENT_OWNER flag to the error (etc!) dialog box routines so it comes up centered on the owner window.

January 18, 2004 - New drop: DEVELOPMENT FOX 1.1.44

A number of small updated and gotcha's:

  • Added VC++ subproject for wizard demo program.
  • Fixed VC++ subprojects shutterbug and pathfinder were not building.
  • FXSplitter now enforces minimum size on children during layout. Previously it was only enforcing this during interactive partition resizing.
  • Changed the way cursor is erased in FXText and FXTextField. On laptops running Windows XP with ClearType enabled, the text was not looking good. Thanks to Bill Baxter for suggestions on how to fix this.
  • Fixed out-of memory write problem in FXObjectList.
  • Fixed some obscure semantics in FXString self assignment.
  • Fixed similar self-assignment issue in FXObjectList.
  • Rolled some old code into FXDCPrint.
  • Updated Borland C++ makefiles; added Borland C++ makefiles for shutterbug.
  • Added UNIX man-page for shutterbug.

January 14, 2004 - New drop: DEVELOPMENT FOX 1.1.43

Its been a while, but here it is:

  • Added alpha blended cursors on Windows and on X11 (XFree >= 4.3 is needed). On older UNIX systems, we now threshold the color cursors down to black and white. The internal, application-visible representation is RGBA, just like all the other images; you can easily create a cursor out of a small image in any file format. Thanks for Niall Douglas for some of the code.
  • FXCURCursor can now build cursor from any depth reswrapped ICO or CUR file; this is very handy because you can design your cursors using VC++ and they will still work even on X11.
  • Added line-weight and color options to ShutterBug. Added override redirect flag so it stays on current desktop under Linux. Also added ability to hide ShutterBug while taking a snapshot (thus, the entire screen is uncluttered even by ShutterBug itself), and added special full-screen size mode.
  • Possible race in runWhileEvents(), runModalWhileEvents() fixed.
  • FXObjectList NULL's out grown array. This is needed to prevent problems when deleting partially filled lists of objects.
  • Newly reimplemented XPM file reader can now handle up to 8 characters/pixel.
  • Tabbing into FXSpinner, FXRealSpinner makes focus land on text field only.
  • Added message ID's for getting/setting tool tip and help strings on some controls via messages. These can be used in GUI-Updates so that the tooltip, for example, may be changed as a result of updating the widget. Updating via messages is handy as we then don't need to know the type of widget being updated.
  • Added support in FXFont for additional encodings (X11). Now russion "microsoft-cp1251" is supported.
  • Added new parser in FXFont to parse human-readable string for font description; this new one should now be used for registry font settings. The old fxparsefontdesc() and fxunparsefontdesc() should be considered deprecated. Another benefit of the new method is that there is syntax to read the font-foundry; we can now tell adobe-courier and bitstream-courier apart, for example.
  • FXFontSelector panel has added support for additional encodings.
  • Changed API of fxsaveICO and FXloadICO slightly so they can be used for .CUR files also.
  • Patch from Brian Hook which adjusts FXPopup menus to stay on the currently active screen (if there are more than 1).
  • Fixed issue with window-stacking under Windows.
  • Fixed small booboo in FXScrollPane.

January 13, 2004 - New drop: STABLE FOX 1.0.49

New in this release:

  • Fixed issue with window-stacking under Windows.

November 20, 2003 - New drop: DEVELOPMENT FOX 1.1.42

New in this release:

  • Added new widget, FXScrollPane, which can be used for large scrolling popup menus.
  • Added new ARROW_AUTO capability to FXArrowButton; this is in support for the use of FXArrowButton inside FXScrollPane.
  • Added new widget, FXSpring, which can be used for fixed-proportion layout when used inside FXHorizontalFrame or FXVerticalFrame. FXSpring widgets can be given different lengths, and when piled side by side inside FXHorizontalFrame the different springs stretch or shrink proportional to their given lengths. Thus, you can subdivide areas into 60:40 splits for example. Thanks to Amanda Ross for this wonderful suggestion.
  • Added new example program ratio to show off the use of FXSpring for fixed-proportion layouts.
  • Greatly improved FXHeader control which now allows unlimited number of header items. Various justify options are now available for the text and icon in each item. The header items also support multi-line text. Prior to this release, header controls were scrolled as a whole; now, the items themselves are moved. This permits very wide (greater than 32,000 pixels) contents without necessitating the FXHeader control itself to be this wide (which is problematic because of the underlying window coordinate system limitations). This move has been made in anticipation of using the FXHeader control in FXTable.
  • Updated FXIconList and FXFoldingList for new header control functionality.
  • Added hand (DEF_HAND_CURSOR) cursor to FXApp.
  • Fixed subtle layout bug in FXPopup with uniform packing option.
  • Fixed potential buffer overrun bug in FXFileDict. Depending on your compiler's stack frame layout, it may also have prevented some icon bindings from showing up. The bug fix was also back-ported to the STABLE version FOX 1.0.48.
  • FXStatusLine now only shows help from controls in the parent window or sub- dialogs of the parent window containing the status line.
  • Fixed some minor bugs in FXRealSpinner.

October 30, 2003 - New drop: DEVELOPMENT FOX 1.1.41

New in this release:

  • Fixed clipboard and primary selection issues for FOX receiving clipboard data or primary selection data from GNOME applications; [clipboard and primary selection from KDE applications worked fine].
  • Fixed some compiler warnings for 64-bit Linux on AMD64.
  • Fixed FXASSERT in FXHash table; also, fixed bookkeeping issue in FXHash which caused table growing/shrinking to happen at the wrong times.

October 23, 2003 - New drop: DEVELOPMENT FOX 1.1.40

New in this release:

  • Added attach() API to FXWindow; this allows a foreign window to be swallowed into the FOX widget tree.
  • A new FLAG_OWNED is added to FXWindow to determine if the window handle is owned by FXWindow or whether it belongs to a foreign window; various API's have been fixed accordingly.
  • Added new class, FXHash, which maps pointers to pointers; its primary purpose is to map window handles to FOX widgets; on X11, we used XFindContext() for this in the past, and we used GetWindowLong() on Windows. Due to the introduction of attach() we can no longer use GetWindowLong() on Windows and since FXHash is much faster than XFindContext() we now use FXHash on both platforms.
  • Fixed bug in FXObjectList reported by Dimitris.

October 20, 2003 - New drop: DEVELOPMENT FOX 1.1.39

New in this release:

  • FXHeader has been vastly updated; each header item now supports customizable layout of icon and label: relative placement of icon and label, as well as justification inside the cell. Also, labels inside FXHeaderItem may now be multi-line.
  • Corrected some little bugs with FXTable; in the near future, FXTable will be overhauled, and will use the updated header control.
  • Fixed some minor warnings for AMD Athlon-64 compile of FOX.
  • Fixed some template instantiation issues in FXElement.h
  • FXScrollWindow now observes more layout options for its content window; first, LAYOUT_FIX_WIDTH and LAYOUT_FIX_HEIGHT are now observed at all times; the options LAYOUT_LEFT, LAYOUT_RIGHT, LAYOUT_CENTER_X, LAYOUT_TOP, LAYOUT_BOTTOM, LAYOUT_CENTER_Y, LAYOUT_FILL_X and LAYOUT_FILL_Y are observed if the content window is smaller than the visible viewport of the FXScrollWindow.
  • The member data content_w, content_h have been removed from FXScrollArea; these turned out to be unnecessary in all cases, since the information contained in them wasn't very useful.
  • Fixed some minor issues with sorting in FXFoldingList; added sortItems() API which sorts ALL items, not just items at root level.
  • Fixed small problem in FXFile owner() [UNIX only]. When compiled with --enable-threadsafe, it was returning a bogus value.
  • Fixed some minor issues in FXUndoList; first, killed some complaints reported by Borland C++; also, some minor problems accessing the redoName.
  • Did some minor speedup tricks, also killing some pointer underflow messages reporting by some debuggers (this was not a bug, as no data was referenced; however some debuggers flagged this).
  • Fixed issue with FXStream buffer pointers; some debuggers were flagging pointer overflow when FXMemoryStream called FXStream::open() with "unlimited" buffer [we use unlimited buffer for example in reswrapped icon reading where we know the reader to stop at the end of the icon data]. When the buffer size is set to ULONG_MAX, the end-pointer in FXStream is now set to the largest representable pointer value; note that this value will be compared but never referenced when used in FXMemoryStream.
  • FXMDIChild sets target and selector to NULL just after SEL_CLOSE was issued from the close() API to prevent any further events:- its target may have been deleted in the SEL_CLOSE callback. Similar logic applies to FXTopWindow's close() logic.
  • Fixed one memory buglet in glviewer test program.
  • Fixed small problem in FXApp peekEvent(); it now returns TRUE whenever getNextEvent can be called productively. Previously, peekEvent() returned FALSE even though timers were overdue or chores had been set.
  • Renamed FXApp API runWhileEvents() to runModalWhileEvents; added non-modal version runWhileEvents().
  • Added checking for maximum points in FXDCWindow polygon drawing functions under Windows.
  • Fixed bug in FXObjectList, forgot to multiply by sizeof(FXObject*).
  • Removed unused declaration from FXText.

October 8, 2003 - New drop: DEVELOPMENT FOX 1.1.38

New in this release:

  • Harmonized parameter-order of FXMEMDUP() with FXMALLOC() and co.
  • Added undo-grouping facility to FXUndoList. In a nutshell, you can often break down undo/redo capability into lots of little undo/redo activities, which must be performed as a unit. The new undo extension now allows for this using a FXCommandGroup. FXCommandGroup may be subclassed, although you typically only overload undoName() and redoName(). FXUndoList sports new API's begin() and end() to bracket a set of undo-commands which need to be executed in unison. These can be arbitrarily nested.
    Also new in the undo-system is that FXCommand now derives from FXObject, meaning that it can both send and receive messages. This is cool because it allows FXCommand subclasses to be directly interfaced to other objects, (including widgets!) via the normal message system. The undo merge got dropped because I'm not sure the mechanism implemented earlier is satisfactory at this point.
  • Added Shift-Delete binding for cut-to-clipboard in FXText and FXTextField.
  • Fixed memory leaks (mostly icons) in most sample programs.
  • Changed internal timer implementation on Windows to allow for programs running longer than 24.85 days; the old implemtation worked with 32 integers and counting in milliseconds caused a wrap-around in 24.85 days, causing possible problems in FOX long-running programs.
  • Blocked assignment and copy constructor in FXVisual.
  • Changed some more functions for basic types in FXElement.h
  • Fixed bug in FXObjectList and removed superfluous buffer clearing (it gets overwritten immediately).
  • Fixed minor bug in FXString.

September 24, 2003 - New drop: DEVELOPMENT FOX 1.1.37

New in this release:

  • A new subdirectory started for plotting and charting widgets (libCHART).
  • Fixed serious bug in FXTreeList, FXFolding list when deleting items; first, references were made to deleted items. Second, while in the callback the item was in an inconsistent state.
  • Text now has focus when A.d.i.e. starts up.
  • FXObjectList API's added:- can append, insert, remove multiple items now. Also has new, more efficient implementation.
  • FXDLL now uses LoadLibraryEx(dllname,NULL,LOAD_WITH_ALTERED_SEARCH_PATH) under WIN32; this finds sub-DLL's in the same path as the master DLL when loading DLL's which themselves load DLL's.
  • New API dupElms() added in FXElement.
  • Added texture drawing test mode in dctest sample application.
  • Updated VC++ for libCHART; DLL building still gives trouble, however...

September 17, 2003 - New drop: DEVELOPMENT FOX 1.1.36

In this release:

  • FXTreeList, FXFoldingList API's clearItems(), removeItem() and removeItems() now generate no spurious callbacks:- previously, multiple SEL_CHANGED callbacks were issued while deleting multiple items; now, only a single SEL_CHANGED callback will be generated, at the end of the removal. Also, when deleting items, no reference is being made anymore to deleted item's icons. This caused problems in some cases where FXTreeList's destructor was being called AFTER the icons of the items were already deleted.
  • FXTreeItem, FXFoldingItem had added API's, isParentOf() and isChildOf() to test parent/child relationship between items.
  • FXUndoList's FXCommand has new added API, merge(), which allows undo-record merging. Undo records may be merged if (a) merging is allowed, (b) the merge would not span the marked point of the undo-list, and (c) when the merge() function of FXCommand returns TRUE; otherwise, a separate undo record will be added. Also, FXUndoList maintains a flag which indicates whether a command is being executed. This may be examined during the execution of an FXCommand to determine if it is a user-initiated or undo-initiated action. Only in user-initiated actions do new undo records need to be added.
  • FXSpinner, FXRealSpinned have added get/set methods to specify the number of columns in the text field.
  • FXMDIChild's close window logic has been finalized; call FXMDIChild's close() member function to close the MDI child window. This will generate one final callback of type SEL_CLOSE to FXMDIChild's target, after which the FXMDIChild will self-destruct.
  • FXMDIClient's closeDocument() and closeAllDocuments() API's have been removed; instead, we now have more general API's forallWindows(), forallDocuments(), and forallDocWindows(). The API forallWindows() sends a message to all MDI child windows; forallDocuments() sends one message one window of a group of windows sharing the same document. Finally, forallDocWindows() sends a message to all windows of the given document. All these API's stop routing messages at the first unhandled message.
  • FXMDIChild now forwards messages first to its contentWindow(), then to its target (typically, the "document" in a multiple document interface).
  • Fixed FXICOIcon and FXICOImage to handle off-spec icons; according to the official documents, ".ico" icons should be 16x16, 24x24, 32x32, 48x48 or 64x64 pixels. FOX now handles arbitrary sizes.
  • Fixed bug in FXFileStream's position() API:- the file position was not being corrected for the bytes already buffered, causing file-position and stream position to get out of sync.
  • FXPopup can now take taskbar into account under MS-Windows when popping up.
  • FXProgressDialog forces repaint when label is being updated; frequently, not only the bar but also the label are being changed while operation is in progress. Updating the label previously required some explicit calls to repaint() and flush().
  • Buffer overrun testing added to FXXPMIcon/FXXPMImage input routines.
  • New function, fxsavePS(), added to allow saving of image data to postscript image file. Both color and grayscale images are supported, as are some paper placement options.
  • New syntax-coloring engine is being implemented in A.d.i.e. Editor; this work is still in progress, the patterns are currently hardwired for testing purposes, until a new GUI is in place. It is recommended people continue to use the stable version of A.d.i.e. in the FOX 1.0 release for editing tasks.

August 25, 2003 - New drop: DEVELOPMENT FOX 1.1.35

New in this release:

  • Added FXPPMImage and FXPPMIcon for Portable Pixmap format support.
  • FXColorWheel now supports mouse wheel for hue control.
  • Fixed bug in FXSeparator drawing when non-zero padding was passed.
  • Fixed introduced bug in FXGIFCursor.
  • Added SCROLLBAR_WHEELJUMP option to FXScrollBar; when SCROLLBAR_WHEELJUMP option is passed, moving the mouse wheel inside the FXScrollBar will jump scroll instead of performing smooth scrolling. The jump-scrolling mode is usefull when scrolling complicated contents which are difficult to redraw quickly.
  • When passing the option SCROLLERS_DONT_TRACK to FXScrollArea, the FXScrollArea will automatically enable the SCROLLBAR_WHEELJUMP option for the scroll bars.
  • When installing FOX 1.x.y, it will now install the header files into a directory <prefix>/include/fox-1.x, and install the library into <prefix>/lib/libFOX-1.x.a; this will make it easy for the new version and the old version of FOX to coexist on one system.
  • Updated Borland C++ and Digital Mars C++ Makefiles.

August 19, 2003 - New drop: DEVELOPMENT FOX 1.1.34

Improvements:

  • Fixed various list widgets so changing icons in items does not incur recalc() when icon stays the same.
  • Added Bill Baxter's FXRealSpinner class; replaced dial with up/down buttons (couldn't make this work nicely). Changed internal logic so as to work in a more user friendly way (keeps nice numbers, rolling mouse up and down returns to same value, and so on).
  • Now all "artwork" exists outside of the source code; however a pre-reswrapped icons.h and icons.cpp is distributed.
  • FXSpinner increments/decrements using mouse wheel.
  • FXUndoList maintains counter of number of undo/redo records; you can connect text fields to these counters for display in the GUI.
  • Moved fxmalloc() and co into FXObject.cpp from fxutils.cpp; dynamic loading of FOX into FXRuby on Mac OS-X needs this.
  • Added list of standard sizes to Shutterbug; makes it much easier to snapshot standard icon sizes directly from the screen.

August 1, 2003 - New drop: DEVELOPMENT FOX 1.1.33

More great improvements:

  • Added new image type support, XBM (X Bitmap). X bitmaps are often used for black and white icons or cursors, and these new image classes allow for convenient manipulation of these images.
  • Fixed bug in FXString and FXSettings; actually, there were two bugs: first, when strings contained quoted characters it was reading a bit past the last character. Next, the conversion of hex to a value was wrong due to a precedence problem.
  • Added extra parameter to FXImage::scale(). This is the quality of the rescaling. Current values may be 1 for the old algorithm and 0 for the new, very fast dumb-sampling algorithm. The sampling is ugly, but it sure is fast. We sure intend to have additional scaling algorithms.
  • FXText now follows similar GUI update blocking as FXTextField: when the focus is on it, it does not update.
  • Some additional icons has been made available as GIF files. They are now reswrapped in the process of building the library instead of being pasted in the source code; this makes it easier to replace icons work with other ones.

July 22, 2003 - New drop: DEVELOPMENT FOX 1.1.32

More great improvements:

  • New sample application, ShutterBug which is a simple screen snapshot utility; ShutterBug can lasso any arbitrary area on the screen and dump the image to any of the supported file formats.
  • FXImage no longer creates its own pixel array in restore(), unless there was no a-priori pixel array; in other words, it can read back pixels from the server-side representation straight into the pixel buffer passed on the constructor.
  • FXDirBox now uses FXFileDict, enabling it to display custom icons.
  • Updated FXDirSelector; now that FXDirList shows drive names properly under windows, the FXDriveBox is no longer needed. Also, FXDirList and FXDirBox share the FXFileDict in FXDirSelector.
  • The radio-behavior has been dropped from FXGroupBox; it is no longer desired, for several reasons: first, we have a much better mechanism to keep FXRadioButtons in sync using the GUI update mechanism or with FXDataTargets; second, physical layout has nothing to do with logical behavior, and FXGroupBox is now a purely decorative layout manager, and third, the radio-behaviour in FXGroupBox was causing problems when interfacing FXRadioButtons with other code due to the spurious extra messages due to the radio-behaviour enforcement.
  • Removed SEL_UNCHECK_OTHER and SEL_UNCHECK_RADIO message types; this is due to the removal of the old FXGroupBox behaviour.
  • FXTextField now understands control-arrow cursor movement; control-arrow moves the cursor by one whole word. To make this more useful, FXTextField also has new setDelimiters() and getDelimiters() API's with which the user can indicate the set of characters which are interpreted as word delimiters.
  • FXText's setDelimiters() and getDelimiters() API's have been changed to match those of FXTextField. This makes the class FXCharset obsolete.
  • Fixed problem in FXSlider; FXSlider was not drawing correctly when padding was non-zero; also, the slider had is now drawn in the GUI base color rather than back color; this allows the user to set the back color to a different value from base color.
  • Fixed FXTreeList's dotted line drawing under Windows: FILL_STIPPLED style does not work, but FILL_OPAQUESTIPPLED fortunately does.
  • New features added to reswrap:
    • Reswrap now understands a new option, -n namespace which causes it to generate a C++ namespace scope around the icon-definitions.
    • Another new option, -p prefix will place the string prefix in front of every symbol generated from the icon filename.
    • To force an alternate resource name, you can now use -r resourcename. If this option is not passed, the resource name is generated from the file name by dropping the extension and replacing the period (".") by an underscore.
  • FXImageView now offers options to control the placement of the image when the viewport is larger than the image; you can align it in various ways using options IMAGEVIEW_LEFT, IMAGEVIEW_RIGHT, and so on. The default alignment is now centered in X and Y, so you may have to force IMAGEVIEW_LEFT|IMAGEVIEW_TOP options to keep the current image placement.
  • FXGLVisual has gained an API, supported() for checking for OpenGL support. It is primarily useful for UNIX/X11 remote displays. The new API returns the lesser of the library's OpenGL version and the remote server's version. Programs should try to limit OpenGL calls to those not exceeding this support level.
  • Most icons are now generated by reswrap. Also, many icons have been updated to more modern-looking icons.
  • Fixed bug in FXGZStream; forgot to flush buffer at the end.
  • Fixed a number of bugs in FXBZStream; BZ2_bzRead() returned BZ_STREAM_END and not BZ_OK when at end of stream, causing tail end of file to be left unread.
  • In FXTopWindow, absence of DECOR_SHRINKABLE or DECOR_STRETCHABLE should now work under Windows. If a window has DECOR_STRETCHABLE but not DECOR_SHRINKABLE, then it can not be resized below its default size; likewise, if it has DECOR_SHRINKABLE but no DECOR_STRETCHABLE, it can not be resized larger than the default size.
  • The undocumented x86-only API fxgetticks() now calls the function QueryPerformanceCounter() under Windows; presumably, this is implemented in terms of the RDTSC instruction. The API fxgetticks(), if it exists, allows you to read back the CPU's time-stamp counter register, which increments every clock tick. It enables very fine-tuned time measurements.

July 8, 2003 - New drop: DEVELOPMENT FOX 1.1.31

Great improvements in this release:

  • The new FXStream class is finally here! This represents another one of the major milestones toward FOX 1.2!
    • Much faster than the old FXStream, especially on small items, where the difference is quite dramatic.
    • Now provides byte-swapping capability during writing as well as reading.
    • Provides buffered operation, permitting more easy subclassing.
    • User-specifyable buffer size allows more tuning of buffering to datasets of interest to user.
    • Now able to position pointer in stream from current- or end-position as well as start-position.
  • Updated FXFileStream. FXFileStream no longer works over buffered I/O but direct system calls (as FXStream already provides its own buffering!).
  • Updated FXGZStream which provides file I/O using GNU ZIP style compression.
  • Updated FXBZStream; this one uses BZIP2 style compression.
  • Fixed bug in vsscanf() for integer overflow handling (only affects systems which don't provide their own vsscanf()) [Thank you SGI MIPS Pro C++].
  • Fixed FXMDIXXXButton to properly observe frame style while being pressed.
  • Regressed FXRootWindow size determination to old method.
  • Fixed drawing of accelerator and underscore in FXMenuCommand, FXMenuCheck, and FXMenuRadio when drawn grayed out.
  • Increased buffer size for fxmessage(), fxerror(), fxwarning(), fxtrace(), and fxassert() because it was too small for some people. The new size is compile-time configurable, preprocessor constant MAXMESSAGESIZE, which defaults to 1024 if not passed explicitly.
  • Updated FXXXXIcon and FXXXXImage classes for changed argument order in new FXMemoryStream class.
  • Some minor tweaks in new fxsaveGIF() function.

June 27, 2003 - New drop: DEVELOPMENT FOX 1.1.30

New stuff for this release:

  • New widget, FXFoldingList has been added. FXFoldingList is a tree list with captions; each item may have a number of substrings (as FXIconList, separated by tabs). A header control determines the sizes of each column.
  • Fixed buglet on 64-bit machines:- FXID should be 64-bit on 64-bit machines.
  • Made moveContents() a protected API. There has been some confusion in the past with programs invoking moveContents() instead of setPosition(). The correct way is to call setPosition() to scroll. This will verify the input, then in its turn invoke moveContents() to adjust the insides of a FXScrollArea.
  • Changed FXColorWell's drop behavior. Previously, dragging a color over a FXColorWell caused the FXColorWell to emit SEL_CHANGED messages; if this leads to a drop, no subsequent SEL_COMMAND followed, causing programs which only trapped SEL_COMMAND to behave oddly; now the FXColorWell emits a SEL_COMMAND when the color is dropped, and the color does not change while dragging over it.
  • Fixed some minor issues in FXIconList. Icon didn't properly disappear when 2nd column was made very small.
  • Fixed minor type in FXMat3d.
  • Changed shape of arrow and reverse arrow cursor slightly under X11.
  • FXPopup, FXTopWindow, FXToolTip position-adjustment code now no longer assumes root window starts at 0,0. This means root window may now extend in all directions. This is in support of multi-head configurations.

June 23, 2003 - New drop: DEVELOPMENT FOX 1.1.29

Truely massive numbers of changes this time! Some long-standing wishes have finally been implemented:

  • New API's to FXImage: xshear() and yshear() perform a shear operation on the image (turning it into a parallelogram). The area outside the image is filled with an optional background color (the default being transparent).
  • FXImage now always has an alpha channel; this means its now much more convenient to use, as FXImage can now be treated as a rectangular array of FXColor. Treating each pixel as a single 32bit word is much faster; also, no runtime test is needed to test for alpha channel presence.
  • The image input and output routines have been upgraded to support alpha channel also:
    • BMP loader now supports 1,4,8,16,24, and 32bpp with alpha channel.
    • BMP writer saves to 24 or 32 bit depending on image opacity:- it saves as 24bpp whenever image is fully opaque.
    • BMP loader was incorrectly yielding darker colors when loading 16bpp BMP files; this has now been corrected.
    • ICO loader now supports WindowsXP-style 32bpp icons, which support an alpha channel.
    • ICO writer now saves 24bpp with one bit alpha, or 32bpp with true alpha channel.
    • PCX loader totally revamped; now supports 1, 4, 8, and 24bpp; it does not support 4 planes of 1bit due to lack of documentation on what this means.
    • TARGA image loader now supports 32, 24, 16, and 8bpp, as well as grey scale images.
    • TARGA loader was incorrectly loading darker colors in 16bpp mode; this was due to lack of rounding. This problem has now been corrected.
    • fxezquantize() bugs have been fixed, and has been speeded up.
    • GIF loader now returns proper alpha channel for alpha-color in the GIF.
    • GIF writer may now uses Lempel-Ziv Welch compression in the USA. However, since FOX is also used internationally, by default the compression is still disabled. If you compile FOX inside the USA, you may pass the -DUSA flag to enable GIF compression.
    • GIF writer now writes graphic control block when the image has transparent areas.
    • XPM loader now translates "None" color into proper alpha channel.
    • XPM writer now translates transparent pixel to "None" when saving to xpm file.
  • FXGLViewer's readPixels() API now yields rectangular array of FXColors; also, this array is right-side up in the sense that it may be directly passed to the image output routines.
  • Fixed a few remaining 64bit issues for RedHat/Itanium port of FOX.

June 23, 2003 - New drop: STABLE FOX 1.0.42

Fixes for 64-bit compiles:

  • Added FXival and FXuval definitions from the DEVELOPMENT version; these integer types are integers big enough to hold a pointer. When casting from int to void* or vice-versa, do so via FXival or FXuval to ensure numbers are properly sign-extended (or zero-extended) on 64-bit machines.

June 6, 2003 - New drop: STABLE FOX 1.0.41

New stuff in the stable release.

  • FXFileDict now has TIFF support when compiler flag ALL_IMAGE_FORMATS is passed.
  • Registry write problem fixed:- deleted registry keys were not being removed from MS-Windows Registry Database in some cases.
  • Fixed problem in FXSlider: onLeftButtonRelease handler was sending SEL_LEFTBUTTONPRESS message instead of SEL_LEFTBUTTONRELEASE.
  • Fixed small problem in FXWindow::create(). Was not passing in the right WS_CLIPSIBLINGS|WS_CLIPCHILDREN flags (but there were no consequences of this problem as flags we're being set back on in FXDCWindow).
  • Fixed bug in FXGLShape: material[1] was not set properly.
  • Fixed problem in FXSplitter: onLeftButtonRelease handler was sending SEL_LEFTBUTTONPRESS message instead of SEL_LEFTBUTTONRELEASE.
  • Fixed problem in FXTable: updateRange issued wrong error message.

June 5, 2003 - New drop: DEVELOPMENT FOX 1.1.28

New stuff in the development release.

  • Updated reswrap. The old, unused PPM mode has been dropped. New features have been added: it is now possible to reswrap text, for example to embed long text into the executable; reswrap automatically escapes control characters. You can use the ASCII mode for text; it is also possible to reswrap all input to the form "\xff" which is more appropriate for binary data; this mode yields slightly more compact text representation of the image than the normal hexadecimal mode. A new option can cause reswrap to keep the file extension in the symbol; this way it is instantly clear whether an image is a GIF or BMP, for example. The manual page of reswrap has been updated also.
  • Fixed little buglet which caused the GUI update to skip one widget in its cycle.
  • Split off common block of code in FXMetaClass into separate function to eliminate redundancy.
  • Fixed MDI child drag-rectangle painting problem; occasionally the drag-rectangle got clobbered and this caused fragments of the drag-rectangle to be left behind.
  • Fixed focus problem with MDI child. In case the content window of an MDI child was not focusable, the MDI child window didn't become active.
  • Also, somewhat related, the MDI child was only activated when it received a SEL_FOCUSIN message. This prevented the MDI child from becoming active when the window containing it didn't have the real keyboard focus from the window manager.
  • The FXMDIWindowButton now takes a pointer to the window menu (usually FXMDIMenu); previously, FXMDIChild forced its window menu to the FXMDIWindowButton in the menubar; this was an unnecessary complication as we can simply share the window menu between all instances of FXMDIWindowButton's. Note that the application is responsible for properly disposing of the window menu when it is destroyed.
  • Added setSplit() and getSpit() API's to FXSplitter; previously the sizes of the subpanels were set by directly changing the child window's size; this was kind of hard to explain.
  • Added ID_SETICONVALUE and ID_GETICONVALUE messages. Using these messages, callback functions can change or obtain the icon from the sending widget without having to know the type of widget which invoked the callback; thus, it works basically like ID_SETINTVALUE and ID_GETINTVALUE.
  • Replaced old vector classes with new ones. Besides now being able to access components by x, y, z instead of only indexing, they also sport a number of additional useful API's.
  • Added a 3x3 matrix class, which can be used for 3x3 homogeneous transformations or regular 3x3 matrix work.
  • Added a 2-vector class analoguous to the 3-vector and 4-vector classes; both single and double-precision versions are supplied.
  • Updated quaternion classes, also follows new nomenclature.
  • Fixed some minor bug in quaternion class member function.
  • Changed various math functions inside FOX to be able to take advantage of single precision transcendental functions which are now part of the C99 standard math library; added macros for when no C99 standard functions are available. The single precision functions are usually faster, possibly substantially faster for some architectures.
  • Fixed trouble with FXAccelTable; releasing, then adding back entries resulted in badly filled hash table. The new implementation will be less sensitive to this: first, it resizes sooner, i.e. the allowable load factor has been reduced; second, as entries are removed the table will now shrink, and in the process the previously occupied slots will now be marked as unused. Finally, as an entry is removed an attempt is made to determine if its the last element on a collision chain, and if so it will be flagged as an unused slot instead of a previously occupied slot.
  • Fixed problem under WIN32 with FXVisual returning wrong depth of the display; also, was confusing depth (significant bits/pixel) and packing (padding bytes which may be in the display buffer to have a nice power of two bytes/pixel).

May 12, 2003 - New drop: DEVELOPMENT FOX 1.1.27

New stuff in the development release.

  • Added support for opaque dragging and resizing of FXMDIChild windows; pass MDI_TRACKING flag if desired.
  • Fixed WIN32 registry write-back problem in FXRegistry: deleted sections were not being deleted from native WIN32 registry.
  • Fixed problem with fxloadGIF(): when loading back an image previously written by fxsaveGIF(), the number of bytes read in was one byte short. This causes FXStream to get out of sync when the image is followed by other data.
  • Fixed problem with fxsaveGIF() and fxsaveXPM(). Adjusted XPM input/output so that when loading from FXStream, as many bytes are being loaded as were saved (provided fxsaveXPM() is used to do the saving!).
  • Fixed FXShutter to tolerate a zero-value for animspeed; this will effectively disable animation of FXShutter closing and opening.
  • Fixed FXMDIChild to make animation proceed smoother; thanks to Thomas Friedrichsmeier for this patch.
  • Fixed problem with closing windows: SEL_CLOSE is now blocked when closing a window on the bottom of a modal window stack. Basically, close button now behaves similar to buttons inside the owner window: it beeps and nothing happens.

May 2, 2003 - New drop: STABLE FOX 1.0.40

Bugs fixed in the stable release.

  • Added support for thread-safe build (using POSIX thread-safe functions like readdir_r(), getpwuid_r(), and so on). Enabled by passing -DFOX_THREAD_SAFE=1 on the command line. Using the thread-safe library calls ensures that the GUI thread never interferes with the worker threads if the worker threads are making certain kinds of library calls (of course, you might want to ensure the worker threads also call the thread-safe API's so that they won't interfere with each other!).
  • Thread-safe library call support has gone through a few iterations, and at this time has been checked on IRIX, SUN, HP/UX (PA-RISC, IPF), DEC, and of course Linux. Do not use this feature in any previous version than 1.0.40!
  • Fixed problem with multple screens in FXVisual class.
  • Added select all (Ctrl-A) and delete file (DEL) accelerators to file selector.
  • Fixed a few minor issues w.r.t. checking for files, device special files, and directories; you can now pick device special files in the file selector.
  • Fixed minor issue in FXTreeList drawing boxes.
  • Could not search for filenames with spaces in FXTreeList.
  • Fixed issue with GLVisual and 32-bit hardware accelerated visuals.
  • Fixed problem in FXTextField when there is an obscene amount of text inside single line text field.

April 29, 2003 - New drop: DEVELOPMENT FOX 1.1.26

Stuff in this development snapshot.

  • Changed addTimeout() to replace the old timer, if it exists, with the new timeout value. This simplifies code as you can simply set the timer and if it was set already it now gets reset to the new interval.
  • Changed addChore() of course to do the same; it re-appends the chore at the end of the list, basically postponing it until after the outstanding chores have been performed.
  • Fixed forgotten header file include in FXApp for WIN32 build.
  • Replaced hard-coded "0" with DefaultScreen(display) in FXVisual; this caused problems on X11-based systems having more than 1 screens.
  • Removed private GetDC() and ReleaseDC() API's (WIN32 only).
  • Fixed FXDCWindow problems:- surface->id() shoule now be treated correctly everywhere based on type of surface.
  • Added support for thread-safe build (using POSIX thread-safe functions like readdir_r()). Enabled by passing -DFOX_THREAD_SAFE=1 on the command line. Using the thread-safe library calls ensures that the GUI thread never interferes with the worker threads if the worker threads are making certain kinds of library calls (of course, you might want to ensure the worker threads also call the thread-safe API's so that they won't interfere with each other!).
  • Replaced virtual getText() functions in FXListItem (and other list widgets) by non-virtuals which yield const FXString&, this eliminates a lot of string copying. Returning const FXString& is safe as FXListItem's API's are chiefly for FXList and its subclasses to use and not usually directly used by application programs.
  • Expunged deprecated fxgetusername(), fxgetgroupname(), and fxgetpermissions() API's from fxdefs.h. Use the safer equivalent functions from FXFile instead.
  • Removed deprecated setPatternList(const FXchar **ptrns) from FXFileDialog and FXFileSelector. The new function is easier to use and harder to abuse.
  • Fixed FXText widget:- get selection from clipboard returns value of len larger than actual text length; now we're just scanning till the end of string to determine the real length.

April 10, 2003 - New drop: DEVELOPMENT FOX 1.1.25

New in this release.

  • Changed the way timers are set or removed. The method addTimeout() is basically the same as before, except has a small change in argument-order (permitting default parameters more easily). An overloaded removeTimeout() removes timers by means of the same target and message combination as the corresponding addTimeout(). This new method is very convenient as it eliminates to a large degree the bookkeeping necessary to hang on to the FXTimer pointer.
  • Also, addTimeout() now has an optional pointer argument, which is passed back as the void* pointer in the callback. This way, information may be passed from the place where the timer is set to the place where the timer callback is called. Note that the pointer in the timer callback handler no longer refers to an FXEvent!
  • Similarly, changed the way chores are handled; the new overloaded removeChore() removes a chores by means of the same target and message as the matching addChore() was invoked with. Again, this simplifies coding in many cases.
  • Like the timers, addChore() also adds an optional pointer argument, which is passed to the chore callback handler when the chore is fired. Note that the pointer in the chore callback handler no longer refers to an FXEvent!
  • Updated all widgets which have timers and chores to use the new timer system; all such widgets are now simpler in implementation and actually take a bit less memory as well.
  • Implemented delayed layout update using chores. Previously, a change in layout was reconciled using a GUI-Update pass. The new system replaces this by a simple chore being set, and thus a layout change no longer incurs an iteration over the entire widget tree. This means layout changes are now substantially less CPU intensive (and faster too!).
  • Made layout() a public member function. I had to do this, because the new method to force an immediate layout is no longer performed via forceRefresh().
    If you need immediate layout, then you must now just call layout() directly! The member function forceRefresh() now only performs a GUI-Update pass on the subtree of the widget on which it is called!
  • The message handler onUpdate() no longer invokes layout(). This actually will speed the GUI-update pass up a little bit, as the new GUI-Update implementation will not call layout() anymore.
    If, as a result of a GUI-update, widgets change size (for example caption on a label is changed), then there will be no need for an additional GUI-update pass for the layout. The result again is substantially less CPU time wasted during idle processing, and a more responsive application.
  • Implemented delayed layout during window-resizing. When resizing dialogs, the system previously rearranged the widgets in the dialog immediately. As a result of this, an interactive (opaque) resize of a complex widget tree could start to fall behind the mouse movement.
    With the new system, it is no longer possible to fall behind, because now it delays arrangement of the widgets until it has caught up with the event-stream. This makes opaque resizing complex GUI's on slow machines much faster.
    Note that this delayed layout is implemented on X11 only; under WIN32, the new delayed layout method appears currently impossible).
  • Added some missing API's to FXWString.
  • Fixed a buglet in FXString::substitute(). The last occurence of a substring ending the string was not being substituted.
  • Fixed a few other bugs that had been reported.

March 13, 2003 - New drop: DEVELOPMENT FOX 1.1.24

Stuff in this development snapshot.

  • FXFileList now supports case insensitive as well as case sensitive sorting when sorting by names. It supports two new sort functions for this.
  • FXFileList also directly accepts a new message ID_SORT_CASE to toggle case-sensitive sorting. The default is now to sort case-insensitively.
  • The sort functions have been renamed with more human-readable names.
  • FXText and FXTextField now support a new ID_DELETE_ALL message. As the name indicates, it deletes all the text in the widget.
  • Some initial support for OpenWatcom C++ has been added. more to come in the future.
  • FXRuler is progressing. You can get an idea what it will look like now.
  • FXGLVisual now thinks a visual with RGBA is OK even if you asked for RGB. Some high-end video cards (ATI) support RGBA and no RGB. For those that do, RGB is preferred over RGBA if you asked for RGB.
  • FXFileDialog's right-mouse menu offers case-ignore as an option; so does PathFinder.

February 25, 2003 - New drop: DEVELOPMENT FOX 1.1.23

Of course, all bugs from the STABLE release are now also fixed in the DEVELOPMENT release. Other news:

  • FXDLL should now compile properly.
  • FXSettings keys and section names are now no longer allowed to be NULL or empty.
  • FXCheckButton gained a new option, CHECKBUTTON_PLUS, with which you can change the appearance from a check to a plus or minus box similar to FXTreeItem; the intended use of this feature is to connect FXCheckButton to a layout manager, whereby the layout manager can be collapsed or expanded via the ID_TOGGLE_SHOWN method; for this reason the plus-sign is shown when the state is FALSE, i.e. when the associated layout manager is collapsed.
  • FXTable has two new API's, getMinRowHeight() and getMinColumnwidth() which compute the minimum height or width of a row or column in the table based on the contents of the items; this substantially simplifies setting up a sensible initial table display.
  • FXTableItem's getHeight() and getWidth() now yield sensible values; your subclass of FXTableItem should overload them if the size computation needs to be different.
There have been a few changes to the FXGLViewer:
  • Dropped the SURFACEPROJECTION and SURFACEPROJECTION display lists; the reasons were two-fold: first, display lists may be shared between FXGLViewers and it was never clear whose projection matrices were in the display lists; second, there is a better way to obtain the desired effect in the form of the OpenGL 1.1 Polygon Offset extension; since OpenGL 1.0 is ancient history now, the time seemed ripe to ditch the old method.
  • FXGLViewer now supports a gradient background; this is simply enabled by setting the top and bottom background color to different values; setting them to the same values will revert to the uniform background mode. You can connect an FXColorWell to the upper and lower gradient color and control the gradient easily from your GUI. The default gradient background is a blue-sky; most people would like this I hope.
  • The VIEWER_LOCKED feature has been removed; we found no one was ever using it and it was not so useful anyway.
  • We now try a little bit harder getting the OpenGL context into a known state before calling scene->draw(). This is partly because we need it for the gradient background drawing.
  • Support for shift-click and control-click selection, as well as shift-lasso and control-lasso is now being improved; the FXGLViewer can distinguish between them based on mouse movement: if the mouse moves, its a lasso otherwise its a click. While not entirely finished yet, the basic idea is to give FXGLViewer similar callbacks as the list widgets, and give the application more control over the interpretation of the mouse events.
Other issues:
  • Slight problem in FXLabel and a few similar widgets fixed: FXString now remembers its length, and this should be used to find the end of the string.
  • Fixed almost all compiler warnings (Linux, GCC 3.2). ANY warnings still left in the code are intentional! Don't complain about them, they will be fixed when the time comes!!
  • Adie is still broken, sorry! Use the version in the STABLE RELEASE! It is still under development, but I'm kind of busy right now so its taking more time than I would have liked.
  • PathFinder gained some nice Preferences Panel; more is coming. The current version of PathFinder is not finished, but the functionality that's there is stable and solid.
  • The initial precision in the FOX calculator has been dropped to 15 digits; some people complained about roundoff errors (of course, double precision is only accurate down to about 16 digits so roundoff errors in the 16th digit are to be expected). I dropped the precision down to 15 because I don't like to explain this repeatedly!

February 25, 2003 - New drop: STABLE FOX 1.0.34

Over the course of the last week, a number of minor issues have surfaced which are now fixed.

  • FXFileDialog now sets both anchor and current file to the same when you suggest an initial filename when opening a file. Thus, a sunsequent shift-click in multiple select mode now indeed highlights all files between the suggested selection and the one you click on; a minor thing but an annoyance to some.
  • FXTextField could not easily tolerate contents exceeding a few thousand characters; this was the result of both X11 and WIN32 internally working within a 16-bit coordinate system; this caused trouble drawing and highlighting the text inside FXTextField. The fix to figure out which characters of the string have a remote possibility of falling inside the visible area, and then only drawing those. As a side-effect, the amount of data in the drawing protocol is now also substantially less in such cases resulting in faster drawing.
  • An accelerator Ctl-A has been added to FXFileDialog to select all files. Many people will find this convenient. Also, you can select all files from the righ-mouse popup menu.
  • The test in FXText in API extractStyle() and extractText() was a bit too strict; it is not necessary for the return buffer to be non-NULL if the amount of text to be extracted is zero-length.
  • A small typo has crept in FXRex in the match() API; a forward case-insensitive match would sometimes not work correctly.

February 22, 2003 - New drop: STABLE FOX 1.0.33

  • Minor bug in FXFileDialog: when in multiple file selection mode, FXFileDialog::getFilename() was not returning a sensible value. This caused various kinds of mayhem in different places. The new implementation returns FXString::null when no files were selected, or returns the first selected file in multiple selection mode, or the value in the text box when in single selection mode.

February 19, 2003 - New drop: STABLE FOX 1.0.32

  • Updated FXFileList; when no extension is bound, the file extension string becomes the extension of the file name. This permits sorting by extension even for files with no association.
  • Fixed bug in FXText; space-terminated last line could not be clicked by mouse.
  • Bug in FXRex fixed; incorrect behavior in forward match case-insensitive literal string.
  • Wrong callback message type in FX4Splitter.

January 15, 2003 - New drop: DEVELOPMENT FOX 1.1.22

  • Updated FXDirList for unlimited path lengths. We found MAXPATHLEN to be exceeded in some case, just like FXFileList. Also, FXDirList now properly lists drives under Windows. Periodic scanning now happens non-recursively.
  • Renamed FXTreeList::sortItems() to FXTreeList::sortRootItems().
  • Added API's to move items around in FXTreeList.
  • Added API's to move items around in FXList and FXIconList.
  • Added API's to FXSpinner to set arrow colors.
  • Added new API's for loading DLL's or dynamic libraries:
    • fxdllOpen(). Opens a DLL with given name, returning a handle.
    • fxdllClose(). Closes DLL with the given handle.
    • fxdllSymbol(). Returns symbol in the DLL with the given handle.
  • This has only been coded for Linux and Windows. Other platforms will still need some work. Note that fxdllOpen() may be called multiple times on the same library name. We're counting on the underlying O.S. to reference count (Linux and Windows both do!).
  • Added API to FXApp to return drag window. This may be useful to determine which window is currently a drag source. Also added API to FXApp to see if FXApp was already initialized.
  • Added API to FXFile to return root of a path. On UNIX, this is only "/" but on Windows this may be something like "c:" or "\\".
  • Fixed FXString::vformat().
  • In a few days, fox-toolkit.org may go down for an unspecified amount of time as my DSL provider has gone under. Grab it while you can. Otherwise, visit the mirror site:
    • FTP: ftp://ftp.fox-toolkit.net/pub
    • HTTP: http://www.fox-toolkit.net/fox/fox.html

January 9, 2003 - New drop: STABLE FOX 1.0.30

  • Minor bug fix:- fixed FXString::vformat(); vformat() uses vsnprintf() if available, vsprintf() otherwise. The former is buffer-overrun safe. Some systems have different symantics for vsnprintf(), and FOX now compensates for this.

December 29, 2002 - ANNOUNCEMENT

    Due to my ISP (directvdsl) going belly-up, the FOX web-site may be temporarily unavailable sometimes. If this happens, point your browser to the mirror site:

    FTP: ftp://ftp.fox-toolkit.net/pub
    HTTP: http://www.fox-toolkit.net/fox/fox.html

December 23, 2002 - New drop: STABLE FOX 1.0.29

  • Fixed drawing bug in FXTreeList. Drawing with TREELIST_SHOWS_BOXES but no
  • TREELIST_SHOWS_LINES was all messed up.

December 5, 2002 - New drop: DEVELOPMENT FOX 1.1.21

  • Added new API's to FXString:
    • substitute() substitute one substring by another.
    • contains() count possibly overlapping occurences of a substring in the string.
    There are several overloads for these functions.
  • Clarified some documentation in FXApp, FXWindow.
  • Updated FXFileList to allow it to work with arbitrarily long file names, user names, group names, and directory names. Some people had paths longer than MAXPATHLEN and this caused problems.
  • Moved JUSTIFY_XXX options from FXLabel to FXFrame; various subclasses of FXFrame use these flags (but FXFrame itself does not, as it has no contents!).
  • Added support for JUSTIFY_XXX in FXImageFrame.
  • Added API FXFile::linkinfo(), which stats the link and not the file the link refers to.
  • Added flags TEXTFIELD_AUTOGRAY and TEXTFIELD_AUTOHIDE to FXTextField, enabling it to automatically gray (or hide) when its target does not respond to SEL_UPDATE messages. This is very useful when messages are routed around, e.g. via MDI widgets.
  • Added new widget, FXTriStateButton, which can assume three states (false, true, and maybe), where the maybe state is usually only reached programmatically or by means of SEL_UPDATE handlers. You can use this widget whenever your application calls for a toggle type button which may have indeterminate state.
  • Fixed small buglet in FXTextField; in rare cases, cursor position was outside of text.
  • Fixed bug in fxcpuid() implementation:- according to SYSV x86 ABI, EBX is used when compiling PIC for shared libraries; the initial implementation of fxcpuid() was usurping EBX for other uses. The x86/Linux-only API fxcpuid() returns some flags which detect various interesting features of your x86 CPU, such as SSE, SSE2, MMX, MMXEX, 3DNOW, 3DNOWEXT, and TSC presence.

November 20, 2002 - New drop: STABLE FOX 1.0.28

  • A minor bug has been discovered in the BMP reader; sanity checking code erroneously rejected 4 bit/pixel RLE compressed bitmaps; apparently, these are pretty rare :-).
  • Fixed small buglet in FXOptionMenu:- GUI Update becomes disabled after manipulation of the option menu in some scenarios.
  • FXSettings had spelling error in warning message.
  • Small bug in FXFile::simplify(); simplify("c:\..\") became "c\" instead of "c:\".

November 13, 2002 - New drop: DEVELOPMENT FOX 1.1.20

  • Added nifty API's to FXImage:
    • fill() fill image with a constant color.
    • hgradient() fill image with a horizontal gradient using two colors.
    • vgradient() fill image with a vertical gradient using two colors.
    • gradient() fill image with a bi-linear gradient using four different colors.
    • fade() fade an image to a given color by a certain factor.
    • blend() blend (transparent) image over a given color.
    Stay tuned for more image manipulation API's!
  • Added performance (LINUX/GCC/GAS/x86 only) API's:
    • FXlong fxgetticks() reads Pentium/Athlon time stamp counter register. This register increments one unit each single clock (for example on my Athlon 1600+ this means 1,400,000,000 ticks/second!). Very useful to settle heated arguments about whose code is faster :-)
    • FXuint fxcpuid() determines presence of "interesting" CPU features such as MMX, MMXEX, 3DNOW, 3DNOWEXT, SSE, SSE2, and presence of Time Stamp Counter register. You can use this function if:
      • You're using GCC/GAS/x86.
      • You want to whip up some cool inline MMX, 3DNOW, or SSE(2) code.
      If you're not using GCC and GAS, you'll have to do without!
  • Fixed small introduced bug in FXTextField:- when replacing selection, old cursor position was sometimes out of range.
  • Fixed small problem in FXFile. FXFile::absolute("c:\..\") was yielding "c\" instead of "c:\".
  • Added feature to FXHeader:- when clicking on split between captions, a SEL_CLICKED message is sent to the target.
  • Added feature to FXIconList. When receiving a SEL_CLICKED message from FXHeader, FXIconList recomputes the minimal required space for the caption, given the current list of items in it.
  • Made slight change to behaviour of FXTextField. When replacing selection by another string, only a single callback message now results.
  • Added getNumOptions() API to FXOptionMenu. FXOptionMenu also sends a SEL_COMMAND message now after completion of the interaction. Also fixed GUI updating of FXOptionMenu.

October 30, 2002 - New drop: DEVELOPMENT FOX 1.1.19

  • Changed workings of FXMALLOC() and co. again; the initial theory, I have to admit, was flawed and impractical; the new workings however are far more practical:
    • FXMALLOC(ptr,type,no)
      Allocate no elements of type to the specified pointer. Return FALSE if size!=0 and allocation fails, TRUE otherwise. An allocation of a zero size block returns a NULL pointer.

    • FXCALLOC(ptr,type,no)
      Allocate no elements of type to the specified pointer, and clear this memory to zero. Return FALSE if size!=0 and allocation fails, TRUE otherwise. An allocation of a zero size block returns a NULL pointer.

    • FXRESIZE(ptr,type,no)
      Resize a previously allocated block of memory. Returns FALSE if size!=0 and reallocation fails, TRUE otherwise. If reallocation fails, pointer is left to point to old block; a reallocation to a zero size block has the effect of freeing it.

    • FXMEMDUP(ptr,type,src,no)
      Allocate and initialize memory from another block. Return FALSE if size!=0 and source!=NULL and allocation fails, TRUE otherwise. An allocation of a zero size block returns a NULL pointer.

    • FXFREE(ptr)
      Free a block of memory allocated with either FXMALLOC, FXCALLOC, FXRESIZE, or FXMEMDUP. It is OK to call free a NULL pointer.

  • Fixed harmless bug in FXTable.
  • Removed radio and check behavior from FXMenuCommand; this functionality is now assumed by FXMenuRadio and FXMenuCheck.

October 26, 2002 - New drop: DEVELOPMENT FOX 1.1.18

  • Fixed argument test in FXText:- NULL text argument is allowed if size is zero.
  • Fixed drawing bug on MS-Windows in FXMenuRadio.
  • Fixed potential buffer overrun in FXFont.

October 25, 2002 - New drop: DEVELOPMENT FOX 1.1.17

  • Changed FXMALLOC(), FXRESIZE(), FXCALLOC() macros very slightly; FXCALLOC() and FXMALLOC() new always return a NULL pointer and a FALSE return value when a zero size is passed; previously, this depended on the underlying malloc() implementation of the operating system, and operating systems varied in this behaviour. Also, FXRESIZE() returns a NULL pointer and FALSE return value when resizing to zero size; again, operating systems varied in this behaviour. With these changes, it works the same on all operating systems.
  • FXIconList, FXList, FXTreeList was trapping KEY_Delete; this prevented a KEY_Delete from being used as an accelerator.
  • FXTable was not compiling with Borland C++ builder. Fixed.
  • FXMetaClass destructor was not releasing hash table properly; moreover, was causing divide by zero in a few cases. The new implementation releases all memory and can't possibly divide by zero, because the modulo operator has been replaced by bit-wise and; this is possible because the hash table is always a power of two.
  • FXFile Dialog has accelerator for delete file.
  • All messages should now use the new FXSEL, FXSELTYPE, and FXSELID macros. Note FXSEL has the arguments reversed, and the argument order is now the same as the one used in FXMAPFUNC and FXMAPFUNCS; hopefully, this is easy to remember.

October 8, 2002 - New drop: DEVELOPMENT FOX 1.1.16

  • Regressed API's to return FXString rather than const FXString&, for the following reasons:
    • Not consistent. Some API's *compute* their returned FXStrings, so you're always going to have some API's which can never return const FXString& anyway; but conversely ALL API's can return FXString no matter what, so if its consistency we want then the old way is the only way!
    • I don't want to encourage people hanging on to pointers into the private member data of classes; see previous mail on this topic; this reduces my ability to change internal representations of widgets.
    • Its not as painful (in terms of run time) as it looks:- many access functions are inlines, and the compiler can decide to eliminate a few copy constructors (if not automatically, then at least with some encouragement like the option "-felide-constructors" for GCC ).
    • Once all widgets store FXWString internally, you will really thank me for this:- because if we do it the old way, your software can remain unmodified (thanks to conversion operators between FXString and FXWString), but if we go the via the "const FXString& " route then all the software which tries to take advantage of your trick would have to be rewritten!
  • Added API's to FXTable to control item appearance:
    • setItemJustify() changes justification
    • setItemIconPosition() changes icon position relative to the text
    • setItemBorders() changes item's border style
    • setItemStipple() changes item's stippling
  • Added patch from Petri Hodju for FXToggleButton's TOGGLEBUTTON_KEEPSTATE implementation. When this flag is passed to FXToggleButton, the button stays pressed if the state is TRUE.
  • Removed __FXMETACLASSINITIALIZER__ from FXObject.h. FXMetaClass is now made into a proper class instead of a struct. At startup time, the FXMetaClass's constructor adds the class to the hash table of meta classes, and at termination time the FXMetaClass's destructor takes the class back out.
    This means if you build DLL's with FOX classes in them loading and unloading the DLL will properly add or remove the class names from the hash table.
    This will allow objects to be serialized/deserialized even if they're in a DLL! The only thing left to do is to use the escape code in FXStream to actually load the DLL and we have a proper Plug-In architecture.
  • Fixed fxmalloc(), fxcalloc(), and fxresize() so that they return NULL when the desired size is zero; straight malloc() will not do that on all systems.

October 3, 2002 - New drop: STABLE FOX 1.0.26

  • Janusz Ganczarski found a very minor bug in the PCX loader code; some PCS images failed to load because of this.
  • Fixed bug in FXFile (MS-Windows) in recursive copy routine (see previous announcement).
  • Bug in FXToolbar getDockingSide().
  • Fixed some stuff in FXTable w.r.t. spanning cells.
  • Fixed some stuff related to file time in FXDirList; also, handle was not being closed at the right time, preventing timely directory refreshing; finally fixed sporadic crash.
  • Window coordinates and size not updated at the right time (MS-Windows) relative to the SEL_CONFIGURE message being issued.

October 2, 2002 - New drop: DEVELOPMENT FOX 1.1.15

  • Changed internal representation of FXString; the end-of-string character ('\0') is no longer special and all possible bytes are now allowed.
  • Added new API's to FXString:
    • length(int) changes the length of the string buffer to the given size.
    • section() extracts num segments starting from start from a string delimited by delim.
    • simplify() simplifies white-space in string.
    • before() returns characters before n-th occurrence of ch, starting from begin.
    • rbefore() returns characters before n-th occurrence of ch, starting from end.
    • after() returns characters after n-th occurrence of ch, starting from begin.
    • rafter() returns characters after n-th occurrence of ch, starting from end.
    • find() searches for character, starting from begin.
    • rfind() searches for character, starting from end.
    • find() searches for n-th occurrence of character, starting from begin.
    • rfind() searches for n-th occurrence of character, starting from end.
    • find_first_of() searches for first character in a set, starting from begin.
    • find_last_of() searches for first character in a set, starting from end.
    • find_first_not_of() searches for first character NOT in a set, starting from begin.
    • find_last_not_of() searches for first character NOT in a set, starting from end.
    • escape() returns a string where all special characters are escaped.
    • unescape() returns a string where all escaped characters are turned back into special characters.
  • Some API's of FXString are now removed:
    • extract() is replaced by the much more flexible section().
    • findf() is replaced by find().
    • findb() is replaced by rfind().
    • size() no longer exists.
    • size(int) no longer exists.
    Note that these changes give FXString an API more consistent with the standard std::string class.
  • New API's to replace some old ones:
    • fxparseAccel() replaces the old fxparseaccel(). The new flavor takes an FXString parameter.
    • fxparseHotKey() replaces the old fxparsehotkey(). The new flavor takes an FXString parameter.
    • fxfindHotKey() replaces the old fxfindhotkeyoffset(). The new flavor takes an FXString parameter. Also, the new version correctly counts when && occurs in the string.
    • fxstripHotKey() replaces the old FXString::extract().
  • Added a new type FXwchar. This is a wide character for UNICODE.
  • Added a new class FXWString. This is currently under development, and should NOT be used at this time.
  • Added a new class FXTextCodec. FXTextCodec's subclasses will provide (state-less) conversions between UNICODE and other character sets.
  • Made further improvements to FXTable widget.
  • Changed many API's in FOX to return const FXString& instead of FXString. This will eliminate a copy constructor in many cases, and thus speed things up a lot.
  • Added option MBOX_SKIP_SKIPALL_CANCEL to FXMessageBox. Handy if the same dialog can appear for multiple errors.
  • Fixed core dump bug in PathFinder. Destructor was deleting uninitialized data.
  • Added help-tag to FXWindow. Each widget may now have a help tag, which is intended to be a URL for context-sensitive help for widgets and controls. Utilization of this info is currently up to the programmer.
  • Reformatted some web pages for Mozilla.
  • Updated some API's to FXArray and FXObjectList.
  • Added more error checking into PNG and JPEG loader; a bad image file should not cause an application error anymore, but a simple error code will be returned. Also, the FXImage will be set to empty when a bad file format did not read.
  • Fixed bug in FXFile (MS-Windows) in recursive copy routine.
  • FXImage, FXIcon, FXBitmap have been made a bit more forgiving when size is 0x0; it no longer terminates the application but creates a 1x1 image instead.
  • Changed API's loadPixels() and savePixels() of the various FXImage-derived types to return a boolean which indicates success or failure.
  • FXMenuCheck widget added which will draw a check box beside the caption.
  • FXWindow::destroy() and FXWindow::detach() will reset FXApp::focusWindow and FXApp::cursorWindow.
  • FXDirList bug fixes:- currentitem and anchoritem were left pointing to deleted items in some cases. Also, directory scanner caused some problems in some cases due to CreateFile() holding handle while FindFirstFile() was trying to open directory for scanning.
  • Sublte bug with SEL_CONFIGURE fixed:- on Windows v.s. Unix, the width and height of the widget were different while in the callback.
  • Added to FAQ.

August 29, 2002 - New drop: DEVELOPMENT FOX 1.1.14

    Of course, all bugs found so far in the stable releases have been fixed in the development release.
  • Some API's renamed in FXList, FXIconList, FXHeader, FXComboBox and FXListBox:- retrieveItem() has been renamed to getItem(), and replaceItem() has been renamed to setItem(). Its much easier to remember this way.
  • FXTable button mode cells now get pressed (thanks to Alastair Growcott for the patch).
  • Added assign() API's to FXString. Makes it easier to fill FXString with some text.
  • Added FXMenuCheck, FXMenuRadio classes. These will subsume the FXMenuCommand for checked menus and radio menus; FXMenuCommand will just be a command.
  • FXMDIClient no longer derived from FXScrollWindow. This will entail fewer problems.
  • FXSeparator class added. It automatically flips based on width:height ratio.
  • Added tag string to FXWindow for on-line help tagging of widgets; help systems may use this to provide context sensitive help for controls or dialogs.

August 29, 2002 - New drop: STABLE FOX 1.0.22

  • A slight tweak has been implemented in FXFileList's collating functions:- instead of just sorting based on type, size, etc. it now also sorts on the name if the type, size, etc. are the same. So if you sort based on e.g. file type, then within each file type, the list is now lexicographically sorted.
  • Minor bug with FXShutter widget fixed. This one shouldn't really have affected anyone.

August 22, 2002 - New drop: STABLE FOX 1.0.21

  • Finally, hardware problems over here at fox-toolkit.org seem to have been resolved! Funny thing is, we're not even overclocking! But nevertheless an Athlon in Alabama in summer on a sunward-facing room has appeared to be a real challenge!
  • As of this week, there has been an addendum to the Lesser General Public Licensegoverning the distribution of FOX. The intent of the change is to make it more practical for applications to link statically against FOX; please refer to the license statement for the details.
  • Minor bug in FXGLViewer fixed related to image printing.
  • Minor buglet in FXTopWindow::setDecorations() fixed.
  • FXDriveBox, FXDirBox suffered from uninitialized memory reads:- thanks to valgrind, we found out about this and fixed it.
  • Fixed a few bugs in removeRows() and removeColumns() were inconsistent and did not properly deal with with spanning cells. Also setTableSize was fixed and now initializes cells to be empty, i.e. NULL.
  • FXList, FXIconList delete items in reversed order, i.e. starting with the last item. This makes maintaining your own parallel list much easier.
  • Fixed problem in FXSpinner.
  • Esoteric FXFileList bug fixed (Windows) certain programs (e.g. older version of ws_ftp) set bogus file time on files, this caused FOX to crash.

July 25, 2002 - New drop: FOX 1.0.17

  • Fixed FXList, FXIconList, FXTable callback. When current item or current row/column is removed, SEL_CHANGED callback is generated.
  • Fixed FXPopup menu behavior under Windows.
  • Added preliminary support for Digital Mars C++ compiler.
  • FXFileList sort by modification date bug was fixed.

July 16, 2002 - New drop: FOX 1.0.15

  • Some patches for Digital Mars C++.
  • Only update widgets of new color setting is different from old.
  • FXTabItem was using the wrong code to draw itself.
  • File time problem retro-ported from development version.

July 1, 2002 - New drop: FOX 1.1.13

  • Patch from Janusz Ganczarski to add support for 16bpp BMP format files.
  • Another patch from Janusz to add support for 32 bit BMP format, as well as some bug fixes to the TARGA image format support.
  • Made FXMDIChild draw nicer, by adding interior sunken border.
  • Added API's to FXMDIClient for various window placement manipulations.
  • Fixed FXMDIClient no loner derives from FXScrollArea. This allows opaque dragging of FXMDIChild windows.
  • Adding a FXRuler widget. Ruler widget may be used to place tickmarks and numbers around another widget, for example drawing document; this one will still need lots of work.

July 1, 2002 - New drop: FOX 1.0.14

  • BMP i/o support for 16, and 32 bit, in addition to already implemented 1, 4, 8, and 24 bit BMP images was added.
  • Potential infinite loop in FXImage::restore() was fixed.
  • In FXMatrix, getNumRows() and getNumColumns() should not depend on child's visibility.
  • FXTable: colors should default to normal back color.

June 19, 2002 - New drop: FOX 1.1.12

  • Added FXWizard class, and new wizard demo application.
  • Added fxparsegeometry() function to parse string of the form: "[=][{xX}][{+-}{+-}]" Into a width, height, x, and y value.
  • Fixed FXProgressBar to be flicker-free when setProgress() is called repeatedly; this is done by directly drawing it in the setProgress() call.
  • Added a new widget, FXImageFrame, which may be used for simple rendering of images.
  • Split the Adie text editor into multiple top-level windows. This allows a single editor to open any number of documents at the same time. Adie is UNDER CONSTRUCTION right now and NOT FULLY FUNCTIONAL!!
  • Added setCancelled() API to FXProgressDialog.
  • Added maximize(), minimize(), restore() API's to FXTopWindow. Also added isMaximized(), and isMinimized() API's. The old iconify() and deiconify() has been superceeded by these new API's. The new API's are implemented in terms of the new Extended Window Manager Hints standard.
  • New API close() added to FXTopWindow added to close a top level window. The close() API will only close the window after consulting the FXTopWindow's target, if any, whether it is OK to do so. When there is no objection, the FXTopWindow will be deleted. When the last FXMainWindow is closed, the application will receive an ID_QUIT message.
  • Polarity of SEL_CLOSED message return value has changed; returning 0 means "no objection" i.e. proceed with the closing. Rationale:- when there is no target, or when the widget's target does not respond, closing the window should proceeed.
  • Added drawing a chord arc fill drawing method to FXDCWindow. This augments the pie sector method already present.
  • Added polygon region constructor to FXRegion.
  • Fixed some idiosyncracies in FXText. When typing to replace a selection with new text, two callbacks, instead of one, were being generated. This implied that a single action needed two undo's to undo it.
  • Also fixed was a little quirk that happened when a paste was being performed inside an existing selection. This is now blocked.
  • FXTopWindow's now appear where they're supposed to, at least on ICCCM compliant Window Managers; borders are discounted as far as placement of window is concerned.
  • A new API isOwnerOf() added to FXWindow which is used inside FXApp to determine whether events are passed to a window or not. The upshot is that modal dialogs can now create non-modal subwindows, and thus events are passed to all windows owned (and ownership is transitive!!) by the modal window, and blocked elsewhere.
  • Fixed various focus sublteties, and simplified focus assignment code. The subtleties are for example the assignment of the focus to a child window of a composite, when the focus were to move to the composite. This is useful for mega widgets which need to force the focus on a specific child window when they get the focus.
  • Added golden ratio constant in FOX Calculator.

May 12, 2002 - New drop: FOX 1.1.9

  • New FXGradientBar widget is now ready for business! Allows for drag and drop of colors, various color blending features ranging from linear to quadratic, and furthermore horizonal or vertical orientation.
  • FXDict, FXMetaClass now deploy a faster, in-lined hashing function. This should translate into slightly faster application startup times.
  • Various API's to FXWindow turned into "const" members.
  • New API getTempDirectory() added to FXFile.
  • FXFileList worked oddly if weird file mod time was found.
  • Memory leaks fixed, thanks to valgrind.
  • Tentatively added FXGzStream and FXBzStream classes for gzip and bzip2 compressed I/O streaming support.
  • FXApp now remembers original display variable passed in. This can be used for later opening of display.

April 5, 2002 - New drop: FOX 1.1.8

  • New widget, FXGradientBar, which is used to build color gradient ramps (e.g. for OpenGL texturing...).
  • Removed limitation of single FXMainWindow; this means the API FXApp::getMainWindow() has now disappeared. When the last FXMainWindow is closed, the application ID_QUIT is invoked, terminatin the application.
  • Behaviour of middle mouse paste in FXText was simplified; this makes a paste of a selection work properly, even if the paste occurs in or near the current selection!
  • Introduced name spaces. All FOX API's are now in the namespace "FX", thus the vast number of possible identifier clashes are now avoided; note that a great number of #define's have now been replaced by enum's.
  • Renamed FXApp::getRoot() to FXApp::getRootWindow() for consistency.
  • Renamed a number of widgets. Various widgets have over the course of time gotten names which did not adhered to the current nomenclature; this made them more difficult to memorize. These widgets have now been renamed for greater consistency:
    • FXTooltip becomes FXToolTip
    • FXToolbar becomes FXToolBar
    • FXScrollbar becomes FXScrollBar
    • FXMenubar becomes FXMenuBar
    • FXStatusbar becomes FXStatusBar
    • FXStatusline becomes FXStatusLine
    • FXToolbarShell becomes FXToolBarShell
    • FXToolbarGrip becomes FXToolBarGrip
    • FXProgressBar becomes FXProgressBar

February 26, 2002 - New drop: FOX 1.0.0

  • Yes, I went to 1.0!!! Why not? The code has been *very* stable for a while, and its time we called it what it is:- the 1.0 release!
  • New API's to FXString. FXString::vscan() and FXString::scan() are API's to parse a string via sscanf-style format conventions. This is very useful in many cases, and obviates the need for some complex coding in the past.
  • New API's to FXRegistry (actually, FXSettings). FXSettings::readFormatEntry() and FXSettings::writeFormatEntry() perform sscanf- and sprintf-style access to registry database strings. As with FXString, this obviates the need for complex coding and is very compact and convenient.
  • Removed deprecated functions from fxdefs.h. The following functions have been removed: fxprefix(), fxsuffix(), fxexpand(), fxpathname(), fxdirpart(), fxfiletitle(), fxfilepart(), fxfileext(), fxexists(), fxisdir(), fxisfile(), fxbakname(), fxidentical(), fxsplit(), fxshortestpath(), fxupdir(), fxabspath(), fxistopdir(), fxgetcurrentdir(), fxmkdir(), fxgethomedir(), fxsearchpath(). These functions have been moved to the file: fxdeprecated.h and fxdeprecated.cpp. Should your application need them, simply include these two files into your project. Note, the functions above have better maintained, and easier-to-use equivalents in the FXFile namespace.
  • A new file, vsscanf.cpp, was added for those systems where vsscanf() and its ilk are not available. Under Linux, and other C99 standard compliant C Libraries, this file is not used.
  • Added some missing API's to FXListBox, FXComboBox, and FXTreeListBox; simplified internals of these widgets a bit.
  • Fixed some FXDirBox problems; removed reliance on deprecated API's.
  • Added a SELECTFILE_MULTIPLE_ALL to FXFileSelector (and FXFileDialog). This mode allows selection of a mix of files and directories. The mode SELECTFILE_MULTIPLE works as before, and selects only multiple, existing filename names (and no directories).
  • Fixed FXPopup focus navigation:- hidden menu items should not be focused upon.
  • Fixed little biddy problem in FXText and style settings.
  • Fixed text in FXReplaceDialog and FXSearchDialog; was not proper.
  • Fixed little problem in FXRex::substitute().
  • Fixed some minor configure issues. You can pass overrides for JPEGLIB, PNGLIB, TIFFLIB, ZLIB, and MATHLIB. This is useful if you want to force a different library than the one found in the usual places (for example if you loaded a newer version than your system came with, or want to force static linking, etc.). Also added a test to search for vsscanf() function in your C library.
  • Added quick-and-dirty, ad-hoc, "hack" to Adie for syntax coloring. It still piggy-backs on the timer. However, the dialogs to set up highlight styles, language recognition, and syntax patterns is essentially complete. You can now add and remove, and edit syntax patterns fairly reliably. I added a sample C++ and C syntax file you can drop into your .foxrc/Adie registry (or in any of the usual global registry places /usr/lib/foxrc/Adie, /usr/local/lib/foxrc/Adie, etc.) to kick-start some patterns to get you started. The stylizer can now also use patterns with back-references, or capturing parentheses; I will still figure some way to color captured parentheses some day as well.
  • WANTED: syntax patterns for various languages: PERL, RUBY, PYTHON, HTML, XML, Pascal, Eiffel, and whatever else you can think of. I will collect these patterns and distribute them in future versions of Adie.

February 5, 2002 - New drop: FOX 0.99.193

  • Added new mode SWITCHER_HCOLLAPSE and SWITCHER_VCOLLAPSE to FXSwitcher; these will cause the FXSwitcher to collapse its default height or width to the currently active child's height or width, respectively.
  • Fixed bug in FXDriveBox. The option to report errors went away as FXDriveBox does not set the current drive anymore:- it just sends a message.
  • Fixed declaration in FXStringDict API: API's yield const strings.
  • Added support for SGI IRIS RGB Image input and output, as well as corresponding image and icon classes.
  • Completed editing of style-entries in Adie (language mode and pattern panels not complete yet). Minor style-coloring engine improvements.
  • Incorporated documentation man-page for Adie, PathFinder, and Calculator.
  • Fixed bug in FXText::changeStyle.
  • Added missing API's to FXListBox, FXTreeListBox, FXComboBox.
  • Fixed grooved border drawing.
  • Relaxed syntax of section and group name in FXSettings database [was too strict earlier for no good reason].
  • FXWindow issues SEL_MOTION events.
  • FXRex properly observes REX_NEWLINE for \D, \s, \W, and so on.

January 8, 2002 - New drop: FOX 0.99.189

  • Optional style buffer was added. FXText takes roughly same amount of memory/text, unless style buffer is turned on in which case memory usage doubles to store the style information.
  • Style table support was added. You can specify up to 127 different styles, where a style is a combination of fg/bg colors for normal, selected, or highlighted display, i.e. 6 different colors.
  • New API's added to manipulate contents of the style buffer. First, normal API's like appendText() and so on now have an equivalent appendStyledText(). The style is a single value 0-127 indexing into style table, to which 128 may be added to achieve underlining. This makes it very easy to add colorful text....
  • Its still possible I will add flags to the style table for underlining instead of use a bit in the style buffer; I don't know yet...
  • changeStyle() changes the style w/o affecting the text.
  • Despite the style additions, drawing has actually been speeded up quite a bit, as some old crap has been removed:
    • drawing is split into painting the background and painting the text over it. This may alleviate some problems on SGI with XDrawImageString.
    • drawing no longer loops over virtual characters, it just rect-fills the tail-end of a line; this is of course much faster.
    • even better, drawing also accumulates runs of spaces and tabs into a single rect-fill; needless to say that is also much faster.
  • FXText now maintains a c&ursor column in terms of the indent offset from the row start, rather than byte offset. This means that while moving up/down in the buffer the preferred column is much better observed when tabs are around (it can't be perfect as we can not move the cursor in the middle of a tab!).
  • incremental movement of the selection/highlight is now much better optimized:- special cases for when the highlight overlaps (e.g. extended by being dragged), v.s. disjunctis now taken care off.
  • also minor buglet caused tail-end of line to be exposed when the last character was highlighted, this was fixed also.
  • FXText no longer sends SEL_REPLACED. instead, it sends SEL_DELETED followed by SEL_INSERTED. Obviously, this is better as it allows for inspection of the new buffer contents in SEL_INSERTED. [You need to be able to inspect the buffer after a change so you can update the style info......].

December 31, 2001 - New drop: FOX 0.99.188

  • Made some minor API changes to FXRex::match. It can now scan not ony forward and backward in a smaller subrange of the entire string; it can also perform just a single match attempt when the subrange is empty. Scanning a subrange of the string is useful, as its not the same as just passing in a smaller string!
  • A new flag REX_VERBATIM was added to FXRex. This compiles a pattern with no interpretation of magic characters or escape codes. Useful to apply the FXRex machinery to literal strings. Note that case-insensitive flag may still be used!
  • Added REX_SYNTAX mode to FXRex also. This causes FXRex to perform only a syntax check; compiling the pattern takes roughly twice the time as just syntax checking it.
  • Added REX_NOT_EMPTY. This causes match to fail when matching empty string. Changed MATCH_FORWARD to REX_FORWARD for consistency. Added more documentation for FXRex as well.
  • Added regular expression search and replace capability to FXText; FXText::findText() API may still need some minor revision, however!
  • Found & fixed nasty little bug in FXFileDict. Was never noticed on UNIX systems by pure chance.
  • Dropped fxregex.h. It is obsoleted by FXRex. FXRex is a more powerful matcher, and is easier to use to as well. If you still need the old files, they're available as fxregex.h and fxregex.cpp should you need them; I recommend however to switch to FXRex so as to be able take advantage of PERL-compatible syntax.
  • FXList now allows arbitrary icon sizes to be mixed. This also means when using subclasses items, they don't have to be all the same size!
  • Added facility in FXScrollArea for subclasses to easily map the mouse wheel to horizontal scrolling instead of the default vertical scrolling (when wheeling inside the widget).
  • Fixed drawIconShaded for WIN32; the pattern offset must be adjusted when scrolling.
  • Added API drawFocusRectangle to FXDC. This is now used everywhere to draw a dotted
  • rectangle. Hopefully this fixes bad-looking focus rectangle under Windows. The drawFocusRectangle() API was removed from FXFrame as it is now part of FXDC.
  • Fixed a few warnings, and one uninitialized memory read in FXTable.
  • Completed FXSlider tickmark drawing. If tickmark delta set to 0 (zero), the ticks will be placed at each position in the logical range; otherwise, they're placed every delta units in the logical range.
  • Fixed FXFile::isExecutable() API (and similar ones like isOwnerExecutable()).
  • The POSIX function access() was not working as advertised under Windows.
  • FXMessageBox buttons rearranged in the order according to FOX style guidelines.
  • FXLabel::onHotKeyPress() was not moving the focus to the following widget if the widget was a composite, only if the sibling was a simple control. This caused label-mnemonics not to move the focus correctly when the next focusable control was in a composite.
  • FXReplaceDialog. Small accelerator conflict fixed.
  • Warnings in fxpcxio.cpp fixed.

December 19, 2001 - New drop: FOX 0.99.187

  • The new class FXRex for regular expressions is now finished.
    FXRex is a more modern matching engine, adding back-references, lazy or greedy matches, counted repeats, PERL-compatible character classes, escape codes for control-codes, hexadecimal or octal character entry, zero-width assertions, positive or negative look ahead, non-capturing and capturing parentheses, "cloistered" modes, and more.
    FXRex is also thread-safe: not only are no global variables used, but also can one FXRex-variable be used by multiple threads.
    FXRex allows unlimited pattern sizes, can search forward and backward through a subject string, returns proper syntax error codes, allows for multi-line and case-insensitive matching.
    FXRex is 8-bit safe (including end-of-strinf character), so you can use it on binary data.
    You can enter control-characters, octal or hexadecimal characters in the pattern.
  • Added documentation to FXRex class.
  • More small additions to FXFileDialog.
  • FXText much improved brace matching technique. Also added highlight capability, i.e. a new text style. This also has its own colors. It is currently used for the new brace matching method.
  • Added support in Adie for the above. Note brace match time must now be set in milliseconds, not microseconds.
  • Added method to FXInputDialog to set text field width.
  • Bullet-proofed FXString::left(), FXString::right(), FXString::mid(), and FXString::trunc() against bad arguments.
  • Fixed bug in FXTable drawing loops; references were made outside the cell array.
  • Fixed potential bug in ICO loader.
  • Added argument to FXApp::init() to suppress opening display. You can open display later using FXApp::openDisplay(). This allows FOX GUI's to start in non-GUI mode.

December 10, 2001 - New drop: FOX 0.99.182

  • FXFileDialog supports context popup menu, adds copy, move, delete capability.
  • FXFile::concatenate bug fixed.
  • FXImage::getChannels() API added.
  • FXImage::setPixel(), FXImage::getPixel() API's added.
  • Small fixes to FXTGAImage, etc.
  • FXFileDict.  Compile-time option to enable all available image formats; see INSTALL file.
  • FXGLCanvas swapbuffers bug fix for Windows 2000/NT (in) compatibility.
  • Other stuff that has been reported in the past couple of weeks.

November 27, 2001 - New drop: FOX 0.99.181

  • Widgets like FXText, FXTextField, and so on which absorb the Return key now make the default button loose the fat border.
  • The Return key is now reported to the default widget as ordinary SEL_KEYPRESS or SEL_KEYRELEASE messages.
  • The ID_INSERT_CHAR message in FXText and FXTextField has been deleted; a new message ID_OVERST_STRING has been added to implement overstrike mode capability.
  • The overstrike mode in FXText is now more sophisticated about spaces and tabs.
  • Added API's to FXImage: setPixel() and getPixel() to access image buffer on pixel by pixel basis.
  • Corrected API's to FXGLSphere.
  • Made ctx member of FXGLCanvas and FXGLContext protected.
  • Added some screen shots.
  • Made data() public in FXSettings; this is needed to write iterations over all sections.

November 22, 2001 - New drop: FOX 0.99.180

  • Janusz Ganczarski has donated support for the TARGA image file format; this brings FOX's image support up to the following list: BMP, GIF, XPM, PCX, JPG, PNG, ICO, TIFF, and TARGA.
  • Note to MS-Windows users: FOX supports not only BMP images and icons, but also ICO format. This means you can design icons directly with VC++ built-in icon editor.
  • FXJPEGImage, FXJPEGIcon renamed to FXJPGImage, FXJPGIcon [but a typedef should keep your app compiling].
  • FOX now properly handles default buttons. The default button is the one responding to the Return key in a dialog. You can designate any number of buttons to become the default button when the focus moves into it. One special button is called the initial default button; the initial default button is the button that will initially be the default button. It is also the button to which the default returns when the keyboard focus moves to another control.
    For this purpose, the meaning of the old BUTTON_DEFAULT flag has been changed to mean that the button MAY become the default button. A new flag BUTTON_INITIAL means the button is the INITIAL default button.
  • New API's are available to set initial default widgets:
    setInitial(enable)
    This makes the window the initial default window, i.e. the target for the Return key.
    isInitial()
    This determines if the widget is the initial default window.
    setDefault(enable)
    This sets the widget to the default widget if enable is TRUE; if enable is FALSE, it makes the widget normal again; if enable is MAYBE, the default returns to the initial default window.
    isDefault()
    This returns true if the window is the default, i.e. the window which will get the Return key even if the focus is on another control. Of course it will not get the Return key if the other control handles the Return key.
  • Only one window can be the initial default, and only one window can be the default.
  • FXGLObject now starts counting at message ID=10000, this means you can make your FXGLViewer subclass start counting from FXGLViewer::ID_LAST, just as you would with any other subclassed widget.
  • FXStatusline and FXProgressBar now automatically call repaint() and flush() so you won't have to. This is useful to update these widgets while performing a long callback routine [e.g. reading a file].
  • FXSectionDict has disappeared. Basically, its only use was in FXSettings; what has happened is that FXSettings now derives from FXDict directly, and takes over all of FXSectionDict's functionality.
  • Fixed focus navigation in FXTopWindow.
  • Focus navigation in FXMatrix was moving to incorrect widget.
  • FXText could read out-of-bounds when searching.
  • Note, I did not implement Daniel Gehriger's menu patch yet; still looking at that issue some more.

November 13, 2001 - New drop: FOX 0.99.179

  • Integrated Daniel Gehriger's keyboard patches. The fxkeyval API has now been removed:- instead, a new member "text" was added to FXEvent which contains the translated keyboard symbol(s).
  • The header file organization has been changed to allow programs to include only those widgets which are needed.
  • A resource leak in OpenGL context has been removed (under Windows).
  • The style BUTTON_DEFAULT causes a button to have the focus first time around; buttons which have the focus are drawn with a FAT border and respond to the Enter key.
  • The flag MENU_DEFAULT, and the setDefault() and setOther() API's have been removed.
  • The new API FXWindow::isDefault() returns TRUE if the widget is in the focus chain.
  • Updated project files for VC++.
  • Added stub-icon/images to be shown when JPEG, PNG, or TIFF libraries are not available; the stub images allow programs which use FXJPEGImage, FXPNGImage, and FXTIFImage to work with reduced functionality when the necessary libraries are not available.

October 19, 2001 - New drop: FOX 0.99.177

  • Some minor bugfixes. Visual Studio Project files were broken and now fixed.

October 16, 2001 - New drop: FOX 0.99.176

  • Due to the amount of time elapsed since last drop, there have been a lot of new things; for starters, we have some new widgets:
    • FXColorBar. This widget controls the brightness of a certain color in the hue, saturation, value system of color specification.
    • FXColorWheel. This widget controls the hue and saturation of a color in the hue, saturation, value system of color specification.
    • FXPicker. FXPicker is used to select stuff anywhere on the screen. Basically, you click once to activate it, and move to a location you want to identify, then click again. FXPicker reports the identified location using SEL_COMMAND, and updates while moving with SEL_CHANGED.
  • Janusz Ganczarski donated support for Windows ICO format support; we have both an FXICOIcon and FXICOImage classes. This is an important contribution because now you can create your icons simply from within VC++ or so without any other conversion step (other than the usual reswrap).
  • A huge amount of improvement to FXTable has been performed; we have more to do, but here's what's been done that you can now start to play with:
    • Table items support multiple-line text.
    • Items can contain icons.
    • Items can have all the usual internal layout, i.e. left,right,top,bottom, icon and text relative to each other BEFORE, AFTER, ABOVE, BELOW.
    • Items can have button appearance.
    • Items can have borders (each side is individually selectable).
    • Icons may be owned by the item or shared.
    • Items may have many different hatch-pattern backgrounds.
  • For the table itself:
    • Rows and columns may be resized interactively.
    • Even/odd cells background coloring.
    • Leading/trailing fixed rows and/or columns.
    • Empty (NULL) cells are now possible; a new item will be automatically created when you fill it with text/icon.
    • Budding support for so-called spanning cells; that is to say, a single item may span multiple rows and/or columns.
  • Popup menus improved under Windows, thanks to Daniel Gehriger.
  • FXFile::listFiles now has many matching modes.
  • FXFile::simplify() was much improved now; it was not entirely working correctly in all cases.
  • FXColorSelector has been augmented with a hue/saturation dial, a value bar, and a color picker.
  • Off-by-one error fixed in FXDCWindow::drawArc under MS-Windows.
  • FXDCWindow::drawIcon() FXDCWindow::drawIconShader(), FXDCWindow::drawIconSunken() have been fixed to take into account the clipping rectangle of the FXDCWindow. This may in some cases result in slightly faster/more flicker-free drawing, and of course it now clips correctly!!
  • Added another ctor to FXMessageBox in case there's no owner widget.
  • FXWindow::hide did not ungrab under Windows.
  • Fixed compile bug for Borland C++.
  • Fixed GUI updating problem in FXListBox, FXComboBox, FXTreeListBox.
  • Fixed problems which occurred when FXIcon, FXImage, FXFont, FXCursor resources were being deleted AFTER closing the display; now the destroy() function for all resources becomes a NO-OP after the display is closed; everything is assumed to be already gone!
  • FXDCPrint::drawImage now implemented for PostScript.
  • Sublt layout bug fixed in FXTabBook:- calculated size was a bit too wide given the content size.
  • FXSpinner was sending wrong parameter in message.
  • Extremely subtle buglet in FXSlider fixed.
  • API added to FXGLCanvas to return GL context.
  • FXPacker focus movement had potential infinite loop in it due to typo.
  • FXProgressBar dial mode drawing improved.
  • Drag and drop enabling was in wrong place.
  • Keyboard handling slightly changed; FXComposite now dispatches to accel table first before trying focus child.
  • Calculator does keypad now...
  • Adie updates.

August 30, 2001 - New drop: FOX 0.99.175

  • Many new features were added.
  • FXSearchDialog and FXReplaceDialog now maintain a history of previous searches.
  • TextEdit has been renamed to Adie (Advanced Interactive Editor). FXText serialization was added.
  • Additions were made to the XWindow API to grab the keyboard to a window.
  • A new repaint function was added, which forces painting of part of a window before returning.
  • FXFile and FXURL were turned into name spaces.
  • Popups were improved.
  • FXCalculator now has its own Web page.
  • Lots of bugfixes were made in FXArrowButton,FXScrollbar,FXMDIChild, FXTextField, FXStream, FXFrame, FXPacker, FXTopWindow/FXShell,and FXApp.

July 19, 2001 - New drop: FOX 0.99.174

  • FOX has a dedicated web site.
  • CUPS Printing support has been added.
  • PCX, TIFF, JPEG, XPM Image I/O support has been added.
  • FXProgressBar has a dial mode.
  • New Standard dialogs:
    • FXProgressDialog.
    • Search and Replace dialogs.
    • Input dialog.
    • Directory Selection Dialog
  • Dockable toolbar support has been added.
  • Socket and signal callback message support have been added.
  • Listing files, drive letters, and network neighborhood (Windows) have been added, and there have been many bug fixes.

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/news2.html000066400000000000000000001234071326741342000153350ustar00rootroot00000000000000 News
News [Remove Frame]

October 18, 2004 - FOX DEVELOPMENT 1.3.16

  • FXToolBarGrip and FXToolBarTab now support tooltips.
  • Fix FXBitmap::crop() to match FXImage::crop().
  • Pass margins in FXText's constructor.
  • Changed type of FXSELID and FXSELTYPE back to unsigned short.
  • Fixed overstrike bug in FXTextField.
  • FXTabBar and FXTabBook now properly observe LAYOUT_FIX_WIDTH and LAYOUT_FIX_HEIGHT in the FXTabItems.
  • Fixed bug in Adie preferences panel style editing; thanks to Sander for discovering this.
  • Made some enum's public in various list items; some options were inaccessible to user programs.

October 9, 2004 - FOX DEVELOPMENT 1.3.15

  • The raise() API does not make a window the foreground window anymore except if the window is derived from FXTopWindow; this only pertains to WIN32.
  • Adie highlighting pattern for PHP added.
  • Added some tests in FXString to check for NULL arguments passed to assign and other API's.
  • Fixed some problems in FXWString.
  • Fixed fox-config --cflags output: now inludes full header path.

October 9, 2004 - FOX DEVELOPMENT 1.3.14

  • Fixed introduced problem in FXDirBox.

October 7, 2004 - FOX DEVELOPMENT 1.3.13

  • Creation scarce resources such as images, icons, fonts, cursors, and windows now may generate exceptions instead of simply failing. There are new exception types for these resources: FXWindowException, FXImageException, FXFontException. Note that exceptions are only thrown in case of errors due to limitations at run time; programming errors are still handled via fxerror().
  • Added new API, tryHandle() to FXObject, which performs an exception-safe message call through handle(). This is now used by most widgets to push messages to their targets.
  • Spruced up TARGA reader with alpha channel support in colormaps.
  • Simplified internals on some widgets, in particular, eliminated some useless self-messages.
  • Expanded documentation on some widgets.
  • Added friend functions to FXVec4d and FXVec4f to construct plane equations from points, point and vector, or point and distance.
  • Added API to FXVec4 for intersection test with line segment.
  • Added API to FXVec4 for signed distance to point (if FXVec4 contains a normalized plane equation.
  • Added API to FXVec3 to get normal to 3 points, or (approximate) normal to 4 points.
  • Changed defintion of FXSphere intersect with plane to mean normalized plane equation. This is much faster as it eliminates bunch of multiplies and square root.
  • Fixed the above function to return more sensible values.
  • Calling setCurrentItem() on the FXListBox and FXComboBox now scrolls the current item into view inside the associated popup list.

September 22, 2004 - FOX DEVELOPMENT 1.3.12

  • Implemented new widget, FX7Segment, which draws LCD-style text. This will look nice for clocks and timers. Of course FX7Segment can be hooked up to a FXDataTarget.
  • After creating a new directory in FXFileSelector, the panel immediately switches to that directory.
  • Fixed bug in FXMenuButton which caused its FXPopup menu to be improperly resized first time around.
  • Changed looks of FXDirSelector and added some much needed functionality to it; its fully on a par now with FXFileSelector. This includes setting bookmarks and so on.
  • Removed API to FXApp: awaken(); it will be split off into its own special class.
  • Eliminated getClassNameLength() API which appears to be only used once in the entire library. Also eliminated corresponding member variable and adjusted FXIMPLEMENT and FXIMPLEMENT_ABSTRACT macros.
  • Added parameter to FXMutex, for creation of recursive mutexes.
  • Added API addObject() to FXStream which allows additional objects to be entered into its hash table.
  • FXStream now uses FXHash internally, eliminating some duplicate code.
  • Added more extensive documentation in FXMDIChild and FXMDIClient.
  • Added some API's to FXHash for use in other applications.
  • Fixed some border cases in FXHash (when only 2 items in table).
  • Extended capability of crop(). It can now accept arguments larger than the original image. It has an extra argument which determines the color with which new pixels will be filled. For example, given an original image of size wxh, a call to crop:
         image->crop(-1,-1,w+2,h+2,FXRGB(255,0,0));
      
    will resize the image and give it a red border all around.
  • Added function getWMBorders() to FXTopWindow to obtain window-manager provided borders. This allows you to determine the position of the window as the user sees it. Note that if you have an unusual window manager, this may not work properly.

September 8, 2004 - FOX DEVELOPMENT 1.3.11

  • Added new standard dialog, FXChoiceBox. It allows picking an item from a list.
  • Added new API to FXApp: awaken(). This can be called by other threads to wake up the main user interface thread; it also causes a GUI update cycle, so you can call this in case a thread has changed something that needs to be reflected in the user interface.
  • Added a new layout manager, FXDockSite. Do not rely on this yet, it is still under development. The purpose is ultimately to enable side-by-side docking toolbars.
  • The API's findItem() and findItemByData() in FXTreeList, FXFoldingList, etc. have been updated; they now search the entire tree instead of just looking at a given level.
  • Made slight optimization to FXFileDict; no longer creates icon only to discover that an icon-file does not exist.
  • Border cases in FXFile::simplify() and FXFile::expand() now handled better.
  • Added missing flavors for FXInputDialog; just as FXMessageBox, you now have stand-alone versions of these [as opposed to having to have an owner].
  • Added API fxdllError() to FXDLL which can be used to obtain the error message.
  • Fixed some tooltip trouble in FXPicker.
  • FXRegion::bounds() now returns bounding rectangle as return value instead of as a parameter; this is more succint in usage.
  • Adie now understands SUN CC compiler error syntax when hitting ^E to open a highlighted error message.
  • Fixed some Adie syntax patterns.

August 22, 2004 - FOX DEVELOPMENT 1.3.10

  • Finished implementation of FXRuler widget. FXRuler widget can be used to provide a scale above (or besides) a document. It provides document margin control, tick marks, and optional indentation settings. The entire ruler scale can be scrolled in case the document is larger than the visible area allows for.
  • Updated fox.spec for package building; changed fox.spec.in so version numbers are automatically embedded into fox.spec.
  • Fixed some inconsistent names in FXThread; hopefully, this will be the last API change for 1.4.
  • Added feature to allow filter entry in the Filter combo box of the file dialog; this feature can be enabled with the allowPatternEntry() API's.
  • Changed some enum-names in FXMemMap due to conflicting names on SGI machines.
  • Removed expensive update handler for FXText and FXTextField: the method is not scalable to large numbers of widgets, or large numbers of FOX applications running on a desktop. The method may be reinstated if a better idea arises.

August 15, 2004 - FOX DEVELOPMENT 1.3.9

  • Added classes FXSemaphore, FXCondition; tweaked API's of FXMutex, FXMutexLock just a bit. Note that the underlying implementation of the synchronization primitives is concealed from the application code; however, this does entail some guesswork about the probable sizes of these data structures. There are asserts in the code to verify the assumptions; however, until you know that these assumtions are correct, I recommend compiling with debug mode the first time you're porting to a new platform.
  • Having SEL_PASTE_SEL in FXText and FXTextField check for clipboard data was, in hindsight, probably not a good idea due to possibility of extraordinary amounts of network traffic in large applications. The idea might come back at some later date when we have a better, more scalable, implementation concept.

August 13, 2004 - FOX DEVELOPMENT 1.3.8

  • Added class FXSplashWindow which puts the new shaped window feature to good use.
  • Fixed bug inquireDNDTypes().
  • Added FXMemMap class for memory mapped files.
  • Implemented FXTopWindow placement patch.
  • Update handler for SEL_PASTE_SEL in FXText and FXTextField now checks for clipboard data.
  • Added some missing API's to FXFileSelector and FXFileDialog.
  • FXFileDialog now remembers its size, file display mode, in the registry.

August 13, 2004 - FOX STABLE 1.2.9

  • Fixed bug inquireDNDTypes().
  • Back-ported FXTopWindow placement patch.

August 13, 2004 - OLD FOX STABLE 1.0.53

  • Fixed bug inquireDNDTypes().

August 2, 2004 - FOX STABLE 1.2.8

  • Fixed bug in TARGA input routine fxloadTGA().
  • Added support for 15bpp TARGA format.
  • Updated config script for cygwin thread.
  • Fixed configure issue with fox-config installation.
  • Added FX_NO_GLOBAL_NAMESPACE to fxkeys.h.
  • Fixed fxloadICO(), which was not accepting icons with 4 colors.

July 31, 2004 - FOX DEVELOPMENT 1.3.7

  • Added support for SUN Raster Image Format; thus, we have new classes FXRASImage and FXRASIcon, as well as fxsaveRAS() and fxloadRAS().
  • Added RAS support to ShutterBug also.
  • Fixed configure test for XShape support.
  • Fixed configure issue with fox-config installation.
  • Added preliminary support for XRandR (I can't test it on my video card as the NVidia driver does not seem to support it; so its as yet untested).
  • Added getCurrentUserName() API to FXFile; it returns the current user name.
  • Added:
            #ifndef FX_NO_GLOBAL_NAMESPACE
            using namespace FX;
            #endif
      
    to fxkeys.h.

July 28, 2004 - FOX DEVELOPMENT 1.3.6

  • Added new API's to FXWindow for non-rectangular widgets. The new API's are:
    • setShape()
    • clearShape()
    The setShape() API has several overloads; you can set the shape based on an FXRegion, a bitmap, or based on the shape mask of an icon.
  • Updated the Shutterbug application to draw a shaped window, just the single icon:- its a window with legs ;-).
  • Added a setRootWindow() API to FXApp which allows setting a custom root window. Changing the Root Window absolutely must be done prior to constructing any other widgets.
  • Adie now only pops up the "File Changed Externally" dialog when the focus moves into the window.
  • Added setData() API to FXImage. This allows you to set the image buffer of the FXImage after construction.
  • Relaxed check in fxloadICO(). It was not accepting icons with 4 colors.
  • Implemented Lothar's patch to tooltip placement into FXToolTip; prior to the patch, a possibility existed for the tooltips to appear too close to the taskbar on Windows.

July 18, 2004 - FOX DEVELOPMENT 1.3.5

  • Added drawRoundedRectangle(), fillRoundedRectangle() and drawEllipse() and fillEllipse() API's to device context functions.
  • Updated Windows VC++ project files for FXIFFImage.cpp, FXIFFIcon.cpp and fxiffio.cpp files.
  • Added test for XShape extension to configure.in.
  • PathFinder now can show IFF files if double-clicked.
  • Updated dctest with some drawings for new drawEllipse() and drawRoundedRectangle() API's.

July 17, 2004 - FOX DEVELOPMENT 1.3.4

Finally, most of my coursework is now behind me (I've been teaching a Computer Science class this summer!), and today was the first day I could pick up normal FOX development again. I still have a few more lectures and finals to prepare, but I thought it'd be nice to make a release of the latest additions.

  • Added for Amiga IFF files; this includes new classes FXIFFImage and FXIFFIcon. Currently, it supports loading only, and files of type normal, HALFBRIGHT, HAM, HAM8, and 24-bit support. I am interested to add Maya IFF support also, but I have insufficient information and I have no sample files of this format.
  • An application-side FXMutex is now available. You can assume that each callback message handler runs protected under this lock, and the lock is released when blocking for events (thus, 99% of the time, the mutex is not held by the GUI thread).
  • Fixed issue with our own vsscanf() implementation which is used if no native version of this function is available.
  • FXListBox, FXTreeListBox and FXComboBox should not react to arrows when disabled.
  • Removed ID_QUERY_TIP, ID_QUERY_HELP in favor of new message types SEL_QUERY_TIP, SEL_QUERY_HELP. The advantage is that we can (and do!) now bounce the ToolTip and Status help messages to the target object first; this allows your program to override the tooltip and status line help messages based on the widget from which the messages originate.
  • Added findItemByData() to various list widgets so one can determine the item from the void* ptr passed during creation. This is handy when the list widgets are filled with pointers to data in the application program and one has to resolve these pointers back to items. Contributed by Mal Goris.
  • The function fxloadPPM() returned FALSE, even if successful. It should return TRUE if successful.

June 18, 2004 - FOX DEVELOPMENT 1.3.3

  • FXTreeList, FXList, FXIconList, FXFoldingList now invoke layout() inside makeItemVisible(), if necessary; this removes some problems with scrolling item into view just after the list was populated.
  • Removed a great number of compiler warnings again.
  • Made getItemAt() and makeItemVisible() virtual again.
  • Fixed small bug in FXSpring widget.
  • Adie now recognizes filename(linenumber) : error message when you invoke "Goto Selected". It will load the file and jump to the line number.
  • Also, another update has been made to the syntax pattern file; please send your submissions for syntax patterns for other programming languages!

June 11, 2004 - FOX STABLE 1.2.4

Minor bug fix in FXObjectList which manifests itself on 64 bit machines; updating should not be necessary for 32 bit users.

June 9, 2004 - Web Page Updated

Updated FOX Projects web page with new entry, XTC [X-Windows Test Control] application which was developed by Daniel K. Osawa for Intel Corporation's Enterprise Products Group.

June 3, 2004 - FOX STABLE 1.2.3, STABLE 1.0.52

I discovered a small bug and retroactively fixed the FOX 1.2 as well as the FOX 1.0 releases. The particular bug was in the vector classes return value of the operator!(), which should have been int. This has now been fixed.

May 18, 2004 - FOX STABLE 1.2.1

As happens with a major release, some little tidbits were overlooked; so here goes a small update with a couple of small fixes.

  • Fixed some small bugs in Adie C++ patterns.
  • The Library should now be called libFOX-1.2 of course!
  • Forgot one file for the Borland C++ Makefile.bc in Adie.
  • getCurrentContext() API needed to be stubbed out when building with NO OpenGL.

May 16, 2004 - FOX STABLE 1.2.0

Here it is: the stable 1.2 release! I'm going to be extremely busy in the next few months, so I figured its good to get it out now!

  • The A.d.i.e. Editor has a new syntax coloring engine! Since the new engine incrementally colorizes the text buffer, working with the editor on large text files no longer feels sluggish, but very responsive now. The old registry-based patterns setup is also gone, in its place we now have a syntax file. Windows users will enjoy this as this means you can just drop the provided Adie.stx file in your $PATH and then you're ready to go!
    The syntax file does not specify colors, but only symbolic style values; the colors are still specified using the registry. Since the initial color settings are rather boring, you will have to change the colors using the Preferences Dialogs. This needs to be done only once, the colors will be saved to the registry after that. Future versions will probably provide some default color setup.
  • The current style file contains some preliminary patterns for C++, Python, and Ruby, as well as a few other languages. I expect to provide additional patterns, and I welcome contributions in this area.
  • The new A.d.i.e. can handle multiple top level windows.
  • A reminder:- the A.d.i.e. Editor is licensed under GNU General Public License, and not Lesser GPL like the FOX Library itself. There has been some confusion about this in the past.
  • Also, fixed small problem with FXGLVisual::isBufferSwapCopy().
  • Simplified blinking cursor code in FXText; also fixed some unpainted pixels during blink near margins.
  • Fixed a few other minor things, as usual.

May 13, 2004 - News

What's going on:

  • My DSL provider changed IP numbers on me; I had hoped to change my domain registrar at the same time, so as to have minimal disruption. Alas, it didn't work out that way; as of now, the registrar has been changed and is set up, but the old registrar still maps fox-toolkit.org to their parking site. The good news is, I have also registered fox-toolkit.com and this should now be fully operational.
  • Meanwhile, Sander has registered fox-toolkit.net and this site now holds the FOX community web pages.
  • On the FOX development front, I have been working on the Adie editor. I started uprooting the way style and syntax information is read in, because for people running on Windows its pretty hard to make use of the standard style and syntax files. With the new system, the style and syntax descriptions will just be read from an ordinary file which you can download and place on a specific location for Adie to find.
    While working on this, I decided to make a small side-step and implement the incremental style recoloring I had been planning to do. This small side-step turned out to be a little more involved than originally planned.
    The good news is, I just completed some of the code restructuring and it appears that it works! This means I've now come back to the issue of the style and syntax file reader; hopefully I will have something for y'all in the next couple of days.
  • There have been a few minor bug fixes in FOX, and these will go out at the same time.
  • Totally unrelated to FOX, I have recently bought a NVidia CineFX based video card and have been playing with that. I have managed to do some cube- and sphere-environment mapping, and even played around with some OpenGL vertex-programs. My next project is to see how I can do environment mapped bump mapping, and write some fragment-programs as well. Of course, all this is done using the FOX FXGLViewer!
    The new programmable GPU's are certainly very exciting, and I'm hoping to be able to get more into it. Perhaps a few new FOX 3D capabilities will result from it one of these days.
  • Finally, it appears that due to changing circumstances, my spare time will be extremely over-committed until the end of July:- I will be teaching some undergraduate computer science classes and this will absorb most of my spare time in the coming months. I hope to be able to whip out this upcoming release before I'm really getting bogged down in it.

April 24, 2004 - New drop: DEVELOPMENT FOX 1.1.53

Collection of bug fixes today:

  • New function fxwuquantize() added for quantizing colors using Wu's method. This algorithm may be used instead of the Floyd-Steinberg fxfsquantize() which is fast but does not give very nice-looking results.
    Pass FALSE for the "fast" parameter in fxsaveGIF() to use this algorithm.
  • Shutterbug now saves using the new Wu quantization algorithm when saving GIF or XPM.
  • Some more tweaks added to FXPopup::popup() having the menu positioned right when using multiple monitors; in particular, the code now detects when running on W2K and above.
  • FXLabel now responds to ID_SETVALUE, which sets the string.
  • VISUAL_SWAP_COPY mode added for FXGLVisual mode; this currently works on Windows only. When passed, the PIXELFORMAT matcher will favor a BLIT instead of SWAP for double buffer mode.
  • Added tweak in FXCursor to suppress color cursors on Windows versions below Windows 2K; it will perform a thresholding operation if you use a color cursor on Windows NT, 9x.
  • FXFoldingList ID_QUERY_TIP now shows a tip comprising the first text field only, instead of the entire item string.
  • FXDCWindow's setClipRegion() was leaking a region under Windows.

April 16, 2004 - New drop: DEVELOPMENT FOX 1.1.52

Collection of bug fixes today:

  • FXFile::absolute() now returns no trailing "/" when passed an empty filename argument.
  • FXScrollArea now keeps viewport at least 50% filled with data; as size decreases below the point where scrollbars would take up most of the space, the scrollbars will be hidden. Note that you can still scroll using right-mouse dragging or using the mouse wheel.
  • Fixed some minor 64-bit porting issues reported due to Itanium port.
  • Small problem was discovered in cursor blinking inside FXText widget; the clip rectangle used to redraw characters was slightly too large. This primarily affected the Windows port, especially when ClearType was enabled.
  • Addressed the missing FXAPI declarations in the image loader routines; during compilation for DLL build, incorrect external linkage is generated unless the proper declaration has been seen by the compiler.
  • Focus navigation in FXSplitter and FX4Splitter did not take into account the need to skip hidden widgets; this caused focus to land on invisible widgets.
  • Character type functions should be called with argument from 0 to 255; there were a few places in FXText, FXRex, and elsewhere where this was not guaranteed. This issue chiefly affects non ASCII character sets.
  • Added Dmitris' patch to FXPopup to affect placement of popups on multi-head machines under Windows.
  • Hopefully fixed the (hard to reproduce) infinite loop in FXRegistry write-back on Windows.

March 29, 2004 - New drop: DEVELOPMENT FOX 1.1.51

New for this release:

  • Added basic clipboard support to FXTable.
  • Added layout modes for header controls in FXTable; column (row) headers can now be fixed height (width) or have a height (width) which is computed from the contents; the rest of the table will adjust automatically.
  • Added API's to change height (width) of column (row) header controls in FXTable.
  • Implemented selectRow() and selectColumn() API's in FXTable.
  • Fixed problem in FXTable's killSelection() API.
  • FXTable now can understand ID_CUT_SEL, ID_COPY_SEL, ID_PASTE_SEL, and ID_DELETE_SEL messages directly.
  • Fixed getDefaultWidth() and getDefaultHeight() in FXTable when visible rows and columns are set: now properly accounts for the scrollbars and header control layout modes.
  • Added extractText() and overlayText() API's to FXTable to obtain delimiter- separated text block from the table, and to populate the table from a text block, respectively.
  • When cell is changed to NULL we now issue SEL_REPLACED callback message instead of SEL_DELETED. SEL_DELETED should probably be reserved for when rows and or columns disappear from the table.
  • Added global functions fxtoDOS() and fxfromDOS() to convert back and forth to DOS and UNIX string formats.
  • Fixed layout.dsp project for VC++.

March 25, 2004 - New drop: DEVELOPMENT FOX 1.1.50

I'm pretty busy with my software, so some of the additions to FOX are being driven by this work and by bug reports from the mailing list. I hope, however, to devote a block of time to pure FOX work in the weeks to come.
Anyway, here's what is new for today:

  • Added FXRealSlider widget; this was from an implementation initially posted by Kevin Fitch on the mailing list; unfortunately, the original implementation had some serious issues with rounding. Hopefully, I have resolved most of these with this version; the only remaining issue is that we still want some minor tweak to keep the reported values on "nice numbers". Currently, nice numbers can however be achieved when using discrete hops, for example when auto-incrementing, auto-decrementing, or using the mouse wheel.
  • Added fillElms() API to FXElement.h.
  • Added setHasItems() and hasItems() API's to FXTreeItem and FXFoldingItem. These API's can be used to cause placememt of the "+ box" in front of the tree item even though the item may not have children yet. It is used in FXDirList to allow deferring the scan of subdirectories until the item is really opened.
  • Added wheel support to FXSlider and FXRealSlider.
  • Made subclassing FXFileSelector a bit easier.
  • Killed warning printouts in TIFF I/O.
  • Fixed subtle bugs in FXSlider; vertical slider with 0 range was showing head on top instead of on the bottom.
  • Fixed FXDial onMouseWheel: it should always return 1.
  • Changed definiton of "empty range" in FXRangef and FXRanged. Range is empty when negative bounding box, not when negative or zero. This allows range boxes around single points.
    A similar fix was added to FXSpheref and FXSphered bounding spheres.
  • Put back FXSelType for message type declaration in fxdefs.h.

March 10, 2004 - New drop: DEVELOPMENT FOX 1.1.49

New stuff in this release

  • Added API's to FXFont to obtain actual matched font information; this does not work yet for Xft fonts, as there doesn't seem to be a way to determine what font was matched for Xft [If someone knows the scoop please let me know]. Also, there are some questions about retrieving the actual font info under Windows; caveat emptor.
  • Updated the Watcom C++ makefiles.
  • Fixed bug in FOX-supplied vsscanf(). Note that some systems like Linux do not use the FOX-supplied function, but use the system-supplied one, which works correctly.

March 6, 2004 - New drop: DEVELOPMENT FOX 1.1.48

New stuff in this release

  • Added new API's to FXBitmap: crop(), rotate(), mirror(), fill(), and scale(). Thanks to Marc Cartright for initial versions of these routines.
  • Added FXBitmapView, FXBitmapFrame classes for black/white bitmap display; these work exactly the same as the corresponding FXImage classes only they display a 1-bit/pixel FXBitmap.
  • When reswrapping text, the output array is now declared as char instead of unsigned char. You can override this with the new option -u which forces unsigned char mode.
  • Added bitmapviewer demo program.
  • You can now set display foreground color in Calculator.
  • Updated TIFF i/o routines for libtiff version 3.6.1.
  • Fixed FXThread internals for SUN and SGI builds; dropped min stack size test as the symbol is not available on all platforms.
  • Fixed "lost line" from FXDCWindow (presumably, keyboard incident).
  • Fixed various minor bugs in FXBitmap; updated Marc's routines to work for bitmaps with widths which are not multiples of 8.
  • Slight speedup in FXStream block mode save/load by taking byteswap test out of the loop.

February 24, 2004 - New drop: DEVELOPMENT FOX 1.1.47

New stuff in this release

  • Added FXSpheref and FXSphered spherical bounds classes.
  • Broken up FXRange into new FXRangef and FXRanged classes; new and more usable interior representation, plus a number of new API's. Be aware that old code using FXRange needs to be updated; in particular, indexing is now reversed!
  • Moved patternFromText() and extensionFromPattern() to public API in FXFileSelector.
  • Added setMatchMode() and getMatchMode API's to FXFileSelector and FXFileDialog. You can use these to change the wildcard matching options in the FXFileDialog (like e.g. FILEMATCH_CASEFOLD option!).
  • Updated FXGLVisual internals; now searches for 24bit Z-Buffer by default. Since some cards support only 24bit Z-buffer when stencil buffer is also enabled, decreased matching weight of stencil buffer a little bit to weigh Z depth higher.
  • Added API setDiskColor() and getDiskColor() to FXRadioButton so you can change both the ball as well as the disk color of the radio button.
  • Added setBoxColor() and getBoxColor() API's to FXCheckButton so you can change both the checkmark color as well as the background color of the check box.
  • Updated FXGLViewer, FXGLObjects to use new FXRangef classes.
  • Removed FXThread::yield(). Apparently, this functionality is not always available in POSIX.
  • Added FXRegion::reset() to clear region back to empty.
  • Fixed some typo bugs in FXQuatf and FXQuatd.
  • Cleaned up some functions from FXImage's public interface.
  • Fixed bug in FXDCWindow Xft2 font handling.
  • When FXSpinner or FXRealSpinner are set to be non-editable, the value can no longer be changed in any way by the user but only programmatically.
  • Fixed bug in FXImage mirror() implementation; mirror() was not working when mirroring both vertically and horizontally.
  • Added safety check for potential divide by zero in FXMatrix.
  • FXEvent type member was not always set in SEL_MOTION message under WIN32.
  • Added new test program layout originally constributed by Bill Baxter.
  • New code in FXImage render() should leave some memory checkers less confused.
  • Added EOLSTRING macro, which is set to "\n" on UNIX and "\r\n" on Windows; this works similarly to PATHSEPSTRING and PATHLISTSEPSTRING.

February 8, 2004 - New drop: DEVELOPMENT FOX 1.1.46

New stuff in this release

  • Added FXThread and FXMutex classes for threading support.
  • Updated pthread library detection.
  • Updated Xft2 detection when compiling with --with-xft=yes.
  • Removed nr,nc parameters to FXTable; it was found to be confusing. You can use table->setVisibleRows() and table->setVisibleColumns() to force a particular layout size of the table.
  • Fixed FXTable default size computation. It didn't properly account for the headers.
  • Removed confusing "nvis" parameter to FXList, FXTreeList, and other list widgets. Use list->setNumVisible() to set the number of visible items if a non-zero value is desired.
  • Fixed some issues in FXFont and FXDCWindow as suggested by Ivan Markov.
  • Added documentation in the standard tarball delivery.
  • If you have cool applications based on FOX, commercial or otherwise, please consider submitting a small abstract and screenshot for the FOX projects page!.

January 26, 2004 - A New Beginning!

I'm no longer at CFD Research Corp!

What happened?

What is the status of FOX?
  • CFD Research has officially disclaimed all copyright interests in FOX; in practical terms, that means I get to keep full rights and title to FOX.
  • CFD Research will continue to be able to use FOX under the current license.
What will happen to FOX in the future?
  • In the immediate future, I will have a lot more time to concentrate on FOX ;-)
  • FOX will continue to be available under its current license, if I can help it.
  • I am now offering consulting services.
  • I hope to be able to not only work on, but continue to use FOX myself in the future.

Older News

Older news...

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/news3.html000066400000000000000000001762201326741342000153370ustar00rootroot00000000000000 News
News [Remove Frame]

November 7 - FOX STABLE 1.4.22

  • Fixed bug in fxloadGIF [and thus also in FXGIFIcon and FXGIFImage; some subltety with the LZW implementation was wrong. It is very rare as we've lived with this flaw for a long time before discovering it. The symptom is that the decoder complains that the image is truncated [it isn't!].
  • Bug in FXSettings causes trouble when writing large integer numbers back to the registry file.

November 2 - FOX STABLE 1.6.0 (Release Candidate 1)

This is the first release candidate for FOX 1.6. The input methods for X11 now work. The next one will implement input methods on Windows. The API's are now pretty much frozen except insofar as changes are needed for input method support. Please note, we're doing the "root" method only. On the spot and over the spot methods will be done later.

  • A new class FXComposeContext manages the input context in text entry widgets.
  • Small tweak to movement algorithm of docked bars:- don't add a new galley when the dock bar is about to be undocked from the dock site. However, you can still create a new galley by first undocking, and then redocking the dock bar.
  • Added restore() API to FXBitmap like FXImage has.
  • New API dropFinished() issues message to DND source that target has successfully acquired drop data and can proceed. This is normally done automatically when the SEL_DND_DROP message returns, but in a few cases one may want to release the DND source prior to returning from the handler, for example when the SEL_DND_DROP message handler takes a long time to process the DND data.
  • Changed the way limits are handled in FXInputDialog.
  • Changed some internals of FXFileList and FXDirList.
  • FXTreeList, FXDirList makeItemVisible() tweaked to scroll the expand-box into view.
  • Fixed some small drawing and layout issues in FXGroupBox.
  • FXTopWindow HICON is deleted if FXTopWindow is.
  • Obtain proper HINSTANCE on Windows; don't use GetModuleHandle(NULL) anymore; see October 29.
  • Fixed FXGroupBox caption display issues. Now looks better at default size.
  • Implemented extremely dumb and slow StretchBlt on X11.
  • Added tooltip capability to pulldown menu items.
  • New API in FXApp, getActiveWindow() returns active toplevel window; previously, this API was called getFocusWindow(). The new implementation of getFocusWindow() returns the child widget of the active window that has the focus.

October 29 - FOX STABLE 1.4.21

  • The getDisplay() API now returns the proper HINSTANCE on Windows; thanks to Henrik and Claus Wann Jensen feedback on this problem. The solution fixes some instability problems in .DLL use of FOX on Windows.

October 25 - FOX STABLE 1.4.20

  • Set active window to owner when dialog closes on Windows.
  • Fixed Thread Local Storage handle leak on Windows.
  • Fixed GDI HICON handle leak for FXTopLevel's big/small icons on Windows.

October 19

I have written a few words here about the Unicode table compression method used in the FOX Unicode implementation. The method achieves very nice compaction of the Unicode Character Properties tables by recursive partial overlapping identical property data and indirection blocks.

September 23 - FOX UNSTABLE 1.5.13

  • Fixed bug in FXText for search selected option.
  • Fixed X11 keysym determination code; was not observing shift state.
  • Added registry setting for scrollbar width.
  • Fixed some problem with FXRex encoding of characters in compiled regular expressions.
  • Updated Windows keyboard handling for UTF-8.

September 15 - FOX UNSTABLE 1.5.12

  • Implemented keyboard translation for X11 to unicode; the Windows keyboard translation will come in the next version, so stay tuned!.
  • Moved fxparseAccel(), fxunparseAccel(), fxparseHotKey(), fxfindHotKey(), and fxstripHotKey() to FXAccelTable, and dropped the "fx" prefix. FXAccelTable is a more logical home for these functions.
  • Added SEL_DOCKED and SEL_FLOATED messages to signify docking events; these are generated by FXDockBar as it is being docked or undocked.
  • Updated Windows studio project files.
  • Updated some documentation items in various widgets.
  • Updated Watcom C++ makefiles.

September 13 - FOX UNSTABLE 1.5.11

This is the FOX 1.6 pre-release; please test! The next one [barring bugs!] is going to be FOX 1.6.0!!

  • Added unicode clipboard support to FXTable.
  • FXTable overlayText() and countText() can now have sets of column and row separators.
  • FXTable extractText() can have separator of multiple characters.
  • Updated comparecase in FXString for utf-8 awareness.
  • Updated list widgets for utf-8 aware item comparison.
  • Fixed FXTable overlayText(). Also fixed paste selection in FXTable.
  • Fixed FXTable countText() and made it public.
  • Corrected FXBZFileStream and FXGZFileStream filenames.
  • Added missing getNumPatterns() API to FXFileDialog.
  • Changed FXDataTarget constructors so as to avoid accidents.
  • Fixed FXText upper/lower case conversion for utf-8.
  • Fixed overly enthusiastic argument checking in FXText.
  • Added checks against editing non-editable FXText widget.
  • Fixed FXTextField against editing when non-editable.
  • Fixed some minor issues with FXFont and FXApp for Windows.
  • Fixed Windows VC++ studio projects for -DUNICODE.

September 7 - FOX UNSTABLE 1.5.10

  • Added unicode clipboard and primary selection support to FXText.
  • Added unixToDos and dosToUnix API's to FXString.
  • Expunged some FXbool's in favor of bool. This is OK where serialization is not required.
  • New API's to FXMatXX classes.
  • New API's to FXVecXX classes.
  • Fixed minor internal issues in FXText.
  • Updates FXRangeXX and FXSphereXX classes.
  • Added API's to FXText taking FXString.
  • Switched argument order in FXText's changeStyle(); it was inconsistent.
  • Safe-guarded FXOptionMenu for children it its FXMenuPane not being FXOption's.

September 3 - FOX UNSTABLE 1.5.9

  • Updated FXBZFileStream to subclass from FXFileStream.
  • Ditto updated FXGZFileStream as well.
  • Updated makefiles for Watcom C++.
  • FXMemMap now supports utf8 filenames on Windows as well.
  • Fixed some typos in FXExtentd.
  • Fixed missing operator << and >> in FXHiliteStyle for Watcom C++.

September 2 - FOX UNSTABLE 1.5.8

  • Modifier keys now stick around when a normal key is pressed; thus both press and release of normal key now have same modifier set applied.
  • Fixed strtoll where it is used.
  • Fixed compile with Xft for Fedora Core 4; FC4 apparently ships with old version of fontconfig.
  • Fixed build issues with multi-monitor stuff on MS-Windows.
  • Added FXExtentf and FXExtentd classes for 2D ranges.
  • Added dllName() API to FXSystem.
  • Added API's to FXString: compareversion().
  • Fixed Windows compile issues with Visual Studio 7.
  • FXToolBarGrip no longer gets focus.
  • Added some API's to FXRectangle FXSize, FXPoint, FXVec3f (etc.).

August 19 - FOX UNSTABLE 1.5.7

  • Added NET_WM_PING message support for Extended Window Manager hints.
  • New FXSystem namespace added to be a collection of system-interrogation functions.
  • New FXIO class added which is the base class for FXFile, FXSocket, FXPipe. So far, FXFile is the most advanced in implementation; but FXPipe and FXSocket will follow...
  • Added extractItem() API to the list widgets; it allows you to remove an item but not destroy it. The removed item can then be re-added to another list widget.
  • Added private copy constructor and assignment operator to list items in order to prevent accidental copying.
  • Added FXPath::convert() API. It will convert a path to local path separator convention.
  • Added FXPath::contract() API, which will to the opposite of FXPath::expand().
  • Added includeInRadius() API's to FXSphere. These include the new point or sphere without moving the center of the original FXSphere. This is often convenient when maintaining nested bounding spheres.
  • Added DOCKSITE_NO_WRAP mode to FXDockSite. Passing the DOCKSITE_NO_WRAP will cause FXDockSite NOT to wrap toolbars to another galley should the amount of space be insufficient.
  • Added new FXFile class which encapsulates low-level file manipulation on the system.
  • Added -z option to reswrap. This new option causes reswrap to compute the size of the resource, and incorporate this into the declaration.
  • FXSlider, FXRealSlider, FXDial, and FXKnob now respond to keyboard arrows as well as + and - key bindings.
  • Updated FXTopWindow to allow setting unicode title string in Extended Window Manager Hints-enabled window managers.
  • Split off many functions from FXFile into new namespace FXPath; FXPath is a collection of functions manipulating pathnames in a resonably system-independent way. FXPath knows about local name conventions, forward and backward slashes, and so on. FXPath knows about unicode filenames.
  • Some other functions from FXFile have been split off into a new class FXStat. FXStat is a collection of file-metadata such as access time, size, and so on. It replaces the unix stat() function. FXStat also knows about unicode filenames.
  • FXDir has acquired a few additional functions which were moved out of FXFile; the new static member function listFiles() now is implemented in terms of FXDir's basic capabilities. FXDir also knows about unicode filenames.
  • Fixed makeItemVisible() in FXList, FXIconList, FXTreeList, and FXFoldingList when widgets aren't realized yet. We now to delayed makeItemVisible() in such cases, causing a scroll when layout() is finally done.
  • More features added to FXKnob; now can operate in speedometer mode.

August 1 - FOX STABLE 1.4.17

  • Fixed problem in FXMessageBox. When running MBOX_SAVE_CANCEL_DONTSAVE, a click on Save should return MBOX_CLICKED_SAVE and not MBOX_CLICKED_YES.
  • Fixed problem on multi-head Windows machines in FXPopup and FXTopWindow.
  • Fixed problem in FXQuatf and FXQuatd.

July 21 - FOX UNSTABLE 1.5.6

Well, after weeks of pounding the keyboard, here's a massive number of new features; first, we've got a nice set of new widgets:- the FXKnob control contributed by Leandro Nini which can be a drop-in for FXSlider or FXDial with different looks.
Next, there's FXColorList which is a flavor of FXList which can be used to select from a set of named colors. To wrap up the color selection methods, we now also have a new widget called FXColorRing, which is a hue/saturation/value control which manipulates a colors hue by means of a ring, and saturation and value by a rotating triangle centered in the hue ring. The tip of the triangle rotates to follow the hue selected in the outer ring. Its a quite intuitive way to control colors.
Then, we have a UTF-8 enabled FXTextField and FXText widget. FXTextField supports UTF-8 and UTF-16 clipboard support for interaction with other applications.
Finally, I have now embarked on the implementation of possessive match support for FXRex. The possessive match is a fairly recent addition in the world of regular expressions; what it does is to eliminate back tracking in greedy closures. For example, the pattern "a*b" is not ever going to match "aaaaaaac", so instead of performing massive numbers of vain backtracking attempts, we can now write a pattern "a*+b", which will simply give up as soon as we fail to match the "b" against the "c".
It is interesting for our purposes as it may substantially speed up the syntax coloring engine or other sophisticated pattern matching using FXRex.

A detailed list of features follows:

  • Unicode support added to FXText; over the next few days, FXText will go through overhaul of the internals, plus we're adding clipboard and selection support similar to what FXTextField already has.
  • Unicode support added to FXTextField. FXTextField is at this point pretty complete. Note that due to multi-byte representation of unicode in UTF8, the cursor in FXTextField is constrained to character-starts, i.e. positions passed into FXTextField will be adjusted if necessary.
  • Added possessive match mode in FXRex. Current implementation is still limited to possessive match of simple patterns [this will change in subsequent releases]. The syntax is similar to that of the lazy match, except a + instead of a ? is used. The possessive match is a greedy match that does not backtrack; therefore, using possessive match for syntax coloring can yield some dramatic speedups in the editor.
  • Also added some [as yet internal] documentation on future syntax FXRex will support for unicode regular expressions. We stick to the standards whenever possible.
  • Added FXColorRing class to edit color based on hue-ring and saturation/value triangle. This is now used in FXColorDialog in favor of FXColorWheel. The FXColorRing provides a single control that can select hue, saturation, and value using more a intuitive interface than sliders.
  • Added Leandro Nini's FXKnob widget. It is a rotational valuator which can replace dial or slider if different looks are required.
  • Split fxchar.h into fxascii.h and fxunicode.h.
  • Added new FXColorList widget to pick from named colors; you can load your own colors in such a list.
  • Added notify flag to FXTextField, FXSlider, FXRealSlider, FXDial, FXSpinner, FXRealSpinner, FXCheckButton, FXToggleButton, FXRadioButton.
  • Added API to FXFileDict to change settings database being used.
  • Fixed jumping mouse wheel bug in FXScrollBar.
  • Fixed some subtleties in FXText w.r.t. makePositionVisible().
  • Re-added getWindowCount(), to FXApp. The new implementation is more elegant in that it eliminates global variables.
  • The fxgetticks() is now implemented for x86-64, IA64, PPC, HP-PA, and SPARC-V9, in addition to x86, when using GCC compiler. Please test!
  • Added SSE3, HT detect to fxcpuid() [x86 only!].
  • Replaced all old "ctype.h" functions with functions from fxascii.h; these don't interpret the upper 128 codes and thus are safe to call on UTF-8 encoded unicode.
  • Few bug fixes in FXString as well as additonal API's.

June 29 - FOX UNSTABLE 1.5.5

  • Added FXDir class for directory scanning; it scans one file at a time.
  • Implemented text at an angle drawing routines.
  • Added API's to FXScrollPane to get/set number of visible items.
  • Fixed windows-related flaw by not disabling arrows in FXScrollPane.
  • FXDragCorner now uses Extended Window Manager Hints if available.
  • Implemented drawing at angles on Windows also.

June 11 - FOX STABLE 1.4.16

  • Fixed bug in FXList and FXIconList: select lone item with arrow keys didn't work.
  • Fixed sign error in quaternion classes in setAxes(). This only happens in one of the exceptional cases.
  • Issue in FXMemoryStream fixed.

June 4 - FOX STABLE 1.4.15

  • Fixed x86-64 bug with FXString::vformat().

April 14 - FOX DEVELOPMENT 1.5.4

  • Added access function wc() to FXString for reading wide character at byte offset.
  • Added setData() API's to FXBitmap, analoguous to FXImage.
  • The setCurrentItem() function in FXComboBox now has notify parameter; it generates SEL_COMMAND when current item is programmatically changed; note that the argument passed to the SEL_COMMAND is the new text in the box.
  • Added compose API to FXString.
  • Added charCompose() API to FXchar to compose unicode character with diacritic marks.
  • Added Hangul composition/decomposition functions.
  • Added API's wide to utf and vice versa API's to fxdefs.h. A whole slew of new functions. Used internally by FXString but useful elsewhere also.
  • The setCurrentItem() function in FXListBox now has notify parameter; it generates SEL_COMMAND when current item is programmatically changed. The argument passed to the SEL_COMMAND is the index of the new current item.
  • FXTreeListBox was erroneously sending a SEL_CHANGED when calling setCurrentItem() with notify=TRUE; it should have sent SEL_COMMAND as it sends SEL_COMMAND whenever the current item changes by other means. It still sends SEL_CHANGED when mouse is hovering over the list when its popped up.
  • FXMDIChild forwards all unhandled messages, but does not forward unhandled messages with ID's which belong to the FXMDIChild itself.
  • Added some checks in FXQuat{f,d}::arc(). Floating point rounding errors could in rare cases cause trouble.
  • Added Euler angles to quaternion and back API's. There are now 6 of them, one for each sequence of roll/pitch/yaw.

April 9 - FOX DEVELOPMENT 1.5.3

  • Fixed loadImage() API in FXIconSource. It was returning FXIcon* instead of FXImage*.
  • Added decompose API's to FXString; this returns the decomposition of a string in terms of its diacritic marks.
  • Added decompose tables to fxchar.cpp.
  • Added decomposeType(), charNumDecompose(), and charDecompose() API's to fxchar.h.
  • Added count() API to FXString; counts number of utf8 characters.
  • Added API index() to FXString, which gives utf8 character index of utf8 character at given byte offset in FXString.
  • Added API offset() to FXString, which gives byte offset of utf8 character with given index.
  • Added inc() and dec() API's to FXString to advance byte offset to next/previous utf8 character.
  • Added Ascii-only character type functions to fxchar.h. These work when searching ascii codes in utf8. Using the ctype.h for this purpose would trigger spurious hits depending on locale settings. So use the fxchar.h versions if possible!
  • Dropped fill() API's from FXString:- duplicates functionality of assign().
  • Dropped count() API from FXString:- dupplicates contains() API.
  • Added many API's to FXString which take wide and narrow characters; in particular, constructors, assign(), append(), prepend(), insert(), replace(), and assignment operators.
  • FXwchar is now typedef-ed to wchar_t when wchar_t is 32-bits. On machines where wchar_t is 16-bits, FXnchar is typedef-ed as wchar_t. Thus, we can now populate FXString directly with wide character string constants; on Windows machines this translates to a call via the FXnchar API, while on UNIX machines this becomes a call via the FXwchar API.
    This may often be more convenient than embedding utf8 string constants into your code; however, since a translation is involved embedding utf8 character string constants is probably faster, so use this whenever possible.

April 9 - FOX STABLE 1.4.12

  • Fixed documentation bugs.
  • Fixed loadImage() API in FXIconSource. It was returning FXIcon* instead of FXImage*.

March 30 - FOX DEVELOPMENT 1.5.2

  • Added many text codecs; all character sets from FXFont, as well as utf8, utf16, utf16be, utf16le, utf32, utf32be, and utf32le have been implemented.
  • Overhauled and fixed number of bugs with the unicode character classes; renamed some of the API's and added a few more API's to fxchar.h.
  • Added narrow character (FXnchar) type to fxdefs.h. This is used to represent 16-bit unicode.
  • FXTextCodec now mostly complete. Added lots of API's for moving between various unicode transformation formats, and added convenience API's for encoding and decoding multi-byte characters. Also implemented lots of error checking.
  • Added some API's to FXString for utf-8 support, these API's will be used for adding many utf-8 and wide character convenience functions later.
  • Fixed FXTable selection rectangle issue; selection rectangle now set before callbacks are invoked.
  • Added compile #define symbol FLOAT_MATH_FUNCTIONS which can indicate that single-precision math functions are available; if not set, FOX will use the symbol __USE_ISOC99 or turn on the single-precision convenience macros.
  • Fixed layout in FXListBox. Size of FXListBox should be based on width of ALL strings currently added, similar to static FXComboBox.

March 20 - FOX DEVELOPMENT 1.5.1

  • Added scroll capability to FXTabBar and FXTabBook.
  • Renamed remove API's in various containet classes to erase which more closely resembles STL container classes' nomenclature.

March 20 - FOX STABLE 1.4.10

  • Fixed compile problem on Windows.

March 17 - FOX STABLE 1.4.9

  • Added fixes to LaTeX syntax coloring (thanks to: Mikkel Kamstrup Erlandsen).
  • Fixed typo in FXApp; handleTimout(), should have been handleTimeout().
  • Changed some bugs in FXGZStream, FXBZStream, and FXFileStream; in some cases, the FXStreamEnd flag was set prematurely.
  • More work on unicode done.

March 16 - FOX STABLE 1.4.8

  • FXUndoList should account for FXCommandGroup when FXUndoList::end() is called, and not at the beginning when FXCommandGroup is still empty.
    This is useful if you subclass FXCommandGroup and add extra space when a complex undo command is completed. As an example, suppose you're disconnecting nodes from a graph. Then it is not known whether a collection of nodes becomes completely detached from the graph until the last node is cut loose.
    To properly account for space when nodes become completely detached from the graph, you can then add the extra space to the subclassed FXCommandGroup just prior to the call to FXUndoList::end(). If you merely remove some connections but the nodes are still connected by other edges then the space is not added since the data structures are not completely owned by the undo system yet.
  • Also, incorrectly accounted for size changes when merging undo records.
  • Adding an undo command should only change the size when its committed, i.e. either an add() of a simple command at the toplevel, or an end() of a compound command at the toplevel.

March 8 - FOX DEVELOPMENT 1.5.0

This is a development preview; it is not recommended for any development work at this time; in particular, no effort has been made to make it compile on all platforms. Some of the highlights of this release are below.

  • Added fxchar.h and fxchar.cpp unicode tables. The fxchar.h header file provides functions operating on 32-bit wide unicode characters. They support the full range U+000000 to U+10FFFF. FOX will support wide characters but most functions are going to be working on UTF-8, which is a more compact and manageable representation of unicode characters.
    Some FXString API's have been added already for UTF-8. Many more will follow. FXString has API's taking strings (sequences of bytes), as well as API's taking single character parameters. The former will serve us well for UTF-8, but for the latter, equivalent API's will be added which take wide characters, allowing one to e.g. insert wide characters without explicitly converting to UTF-8.
  • Added new class, FXTranslator. FXTranslator, once it is fleshed out, will be responsible for translating messages into local languages.
  • Added new API, tr(), to FXWindow. This gets passed the message text and optional translation hint. It adds the name of the widget as the context and then passes these parameters to FXTranslator. Thus, three things are available to translate a message. Actually, there may be a forth (fifth) thing as well, and that is the application and vendor keys, which FXTranslator could get at if needed. Some of the mechanisms have yet to be worked out, at this time.
  • Went through the entire FOX library and added a call to tr() for each and every message. Once FXTranslator is implemented, this will then instantly enable localization of FOX.
  • Added mouse wheel support for FXComboBox, FXListBox, FXTreeListBox; I can't believe I didn't add this long ago; its really very convenient!
  • Added utf.cpp source file containing some utf helper functions; this is an internal file.
  • If you ever listen to music at your PC you've got to get the [FOX-based!] Goggles Media Manager. What I like about it is that you don't have to create play-lists like XMMS; it keeps its info in a database and can do a number of useful queries. Yet another nice program from Sander.

March 8 - FOX STABLE 1.4.7

  • Removed check for used thread-id; this allows restart of a thread.

February 22 - FOX STABLE 1.4.6

  • Added missing FXAPI in FXGUISignal.
  • Removed friend FXEmbeddedWindow from FXApp.
  • Flags TABLE_COL_SIZABLE and TABLE_ROW_SIZABLE now cause corresponding row and column header controls to allow resizing or not.
  • Flags TABLE_NO_COLSELECT and TABLE_NO_ROWSELECT disable column and row select mode for corresponding table headers.
  • Fixed bug in FXHeader which caused HEADER_BUTTON to be ignored (button was always enabled).
  • Added flag HEADER_RESIZE to FXHeader which enables interactive header section resizing by the user; this is now used by the FXTable as well.
  • Fixed problem in FXToolBar dealing with special children FXSeparator and FXToolBarGrip which have special layout from the normal children.
  • Removed #error from ControlPanel application.

February 15 - FOX STABLE 1.4.5

  • Core dump with hitting select all in empty table FXTable fixed.
  • Core dump with non-ascii characters in FXSettings fixed.
  • Added missing FXRex.h in fx.h.

February 13 - FOX STABLE 1.4.4

  • Problem in fxtargaio fixed.
  • Rewrote important part of fxpcxio routine; all test images of depth 1, 4, 8, and 24 bits per pixel now pass the test.

February 12 - FOX STABLE 1.4.3

Well, here's a few other minor updates. Nothing very serious this time. Now that the worst errors have been taken care of, I'm going to hold off these rapid releases until there is something serious or after I've been able to collect a bunch of them.

  • Fixed warnings and error that came up on SGI build.
  • Fixed TABLE_NO_ROWSELECT and TABLE_NO_ROWSELECT not working right in FXTable.
  • Suppress warning on VC++ for DLL binding templates.

February 10 - FOX STABLE 1.4.2

  • Fixed FXFileSelector popup menu:- was unable to delete directory due to introduced problem.
  • Updated Digital Mars C++ compiler makefiles.
  • Updated Watcom C++ compiler makefiles.
  • Fixed some FXCursor for Digital Mars C++.
  • Added FXAPI declaration to FXObjectListOf.
  • Fixed type on FXSplashWindow comment.
  • Removed default parameter from non-floating bar constructors in FXMenuBar, FXToolBar, and FXDockBar. One must always pass a 2nd parameter as the two constructors can otherwise not be distinguished [GCC people: can't this be detected during compilation?].
  • Fixed FXMutex reserved memory amount for HP-UX support.
  • Fixed FXMemMap for Digital Mars C++ compile issue.
  • Removed ControlPanel from Windows Builds; you can remove the warning message and compile it, but it wont quite work since ControlPanel doesn't change the Windows Registry but only the file-based registry [Maybe that will change in future versions; however, the FOX control panel isn't as important on Windows since FOX follows many of the standard Windows Control Panel settings].

February 8 - FOX STABLE 1.4.1

  • Fixed bug in fxsaveJPG() routine; saving JPEG images didn't work properly.
  • Fixed problem with ControlPanel crash. ControlPanel would crash when registry was empty.

February 7 - FOX STABLE 1.4.0

Well, after another last-minute feature got snuck in over the weekend, I'm pleased to present the new major stable release, the FOX Toolkit version 1.4!
This release is going to make a lot of people happy, since we've accomplished quite a bit of work since the 1.2 release!

  • Smooth dragging and side-by-side docking of toolbars and dockable panels has been implemented.
  • A new class FXIconSource facilitates loading and scaling of images or icons, from a large variety of image formats.
  • The file selection widget now support thumbnail previewing mode. If a filename is recognized as an image, and the thumbnail mode is in effect, the image is loaded and scaled down to serve as the thumbnail.
  • Support was added for shaped windows, allowing you to make non-rectangular windows.
  • Thread support was augmented with synchronization primitives and a global application mutex was added to deconflict worker threads and GUI thread.
    Also, a new class FXGUISignal serves to wake the GUI thread from a worker thread.
  • Editable cell support were added for the Table widgets.
  • SUN Raster image and Amiga IFF image file formats have been added.
  • Upgraded to XDND release 5, the latest specification of the XDND standard; interoperability with OpenOffice has been accomplished.
  • Exception handling for common resource errors was introduced, allowing FOX programs to gracefully handle various runtime errors like running out of window handles and bitmaps and so on.
  • Added alpha channel support for TGA format.
  • New 7 Segment Display widget was added. It is arbitrarily scalable.
  • Ruler widget was completed. This is a document ruler widget a-la MS-Word.
  • New class added for support of Memory Mapped Files. This sure helps with manipulating large blocks of data in a platform-independent way.
  • New class FXSplashWindow has been added. It uses the new shaped window facility to present an attractive, arbitrarily shaped introduction window for your application.

February 7 - FOX DEVELOPMENT 1.4.0

  • Added thumbnail icon previewing mode to FXFileList, when set in big icon mode. This feature uses the new FXIconSource for the loading and scaling.
    It is quite fast for loading icons, but a bit tardy for directories with large collections of photographs.
  • Changed setIcon API's in the various list widgets. An optional owned flag is now passed. If the old icon was owned by the list item, it is deleted, and replaced by the new icon. If the new icon is set to be owned, it will be deleted when the list item is deleted, or when it in its turn is replaced when a new icon is set. As a special case, resetting the same icon does not delete the icon but just changes the owned flag; this allows the application to "reposses" or "disown" the icon.
  • Also added a new class, FXIconSource, which embodies the knowledge of various image file formats. It has three main API's: loading an icon from a file, loading an icon from a reswrapped stream, or loading an icon from an already opened FXStream.
    These API's are in turn invoked by three other API's, which can load and scale an icon down to a certain size, using either the fast image rescaler or the slower high-quality scaler.
    These six API's are duplicated for loading images instead of icons.
    Finally, the core loading API's are virtual so that the FXIconSource may be subclassed to provide additional image format support.
  • Split off FXIconDict into its own class, and reorganized it to use the new FXIconSource class. Consequently a set of API's has been added to FXIconDict to set/get the FXIconSource.
    FXIconDict manages the lifetime of the FXIconSource object it uses; initially, it creates its own icon source.
  • Every time I explain the new toolbar system to someone, I say "dock site" when I meant FXToolBarDock. Obviously, the latter is the wrong name. As of today, there is another reason why this name is not ideal and that is that I have added another class, FXDockBar, which is basically a general- purpose FXPacker with docking capabilities.
    FXToolBar now derives from that, adding just the reorientation capabilities to the FXDockBar's capabilities.
    So now we have a general purpose packer that can be floated, we need a different- looking handle to move it around, and indeed, that is another class now which is another flavor of FXToolBarGrip called FXDockTitle. This serves as both decorative title as well as a grip for moving the bar.
    We reserve the toolbar grip for small handle-bars inside FXToolBars.
  • FXMenuTitle now pops its FXMenuPane to the side depending on where the FXMenuBar containing the FXMenuTitle is docked. The idea is to prevent obscuring the other FXMenuTitles and to try and make sure the mouse is not over the menu pane when first popped up; the latter is potentially dangerous since the risk exists of accidentally invoking a menu option by releasing, without movement, the mouse button [under normal circumstances pressing and releasing the mouse lets the panel stay up; but if the panel appears right under the cursor, a menu option may be invoked instead].
  • A few more toolbar docking issues; first, toolbars which are stretched should undock only when their default size sticks out, or oscillation will result. Next, new API's have been added to FXToolBarDock which adjust the layout options of the remaining items in the dock when toolbars are undocked or docked.
    Finally, when releasing the mouse in the toolbar grip, the toolbar was not docking at the same place as it was when the timer expired. This has now been fixed.
  • Refactored the code a bit between FXToolBar and FXDockSite. Its FXDockSite's responsibility to know about the interpretation of the layout issues of the toolbar inside of itself; this means FXDockSite needs to be informed when toolbars dock and undock, or are moved around. It falls upon FXToolBar to find which dock should be attempted, and to determine based on heuristic fudge constants when something docks or undocks. We now have a single internal function which decides dock/no dock. While not perfect, it can be counted upon to give the same answer solely based on the relative relationships of toolbar and dock, regardless of whether we're docking or undocking. It is hoped that this prevents oscillation as much as possible.
  • Finally, we have a new option in the right-mouse popup menu over FXToolBarGrip which gives the user the ability to flip the orientation of the toolbar without having to dock it.
  • Fixed bug to allow dragging even when no alternate parent has been specified; you should be able to reorganize the layout inside a dock site even if floating is not an option.
  • Hold Control key while dragging toolbars to prevent docking; this allows parking toolbars near edges of the main window where they would otherwise have docked.
  • Drag and drop between FOX and OpenOffice works too!
    OpenOffice appears to be using XDND 5. also. I've managed to drag both text from Adie as well as JPEG image files via PathFinder into OpenOffice; I think I may get used to this!.
  • Fixed bug in drawEllipse() on Windows; thanks to Mauro Zecchini for discovering this problem.
  • FXFile::search() now expands environment variables (e.g. $HOME) and user names (e.g. ~user) in directories from the search path.

January 31 - FOX DEVELOPMENT 1.3.26

  • Upgraded to XDND version 5 standard. Verified interoperation between KDE and FOX, as well as GTK and FOX. using application/x-color drag. Unfortunately, GTK does not accept color drags from FOX, but FOX does accept color drags from GTK. The problem is GTK, since it doesn't accept color drags from KDE either.
    XDND version 5 brings a final confirmation in response to endDrag(). It is possible that the drop target, in processing the drop, encounters some sort of error. The XDND 5 implementation in FOX allows the drop target to call acceptDrop(), indication which action the target DID manage to perform.
    For example, when attempting to move a file from one place to another, the drop target may accept a drop but be unable to perform it [e.g. running out of disk space]. Returning DRAG_REJECT will allow the drop target to tell the drag source it was unsuccessful, and that it should remove the original file
    Note that we used to perform such a thing by trying to obtain TWO DND data's from the source, the real data and NULL data using the "DELETE" atom.
  • FXSettings, doesn't quote values unless leading and trailing spaces or special characters in it.
  • Updated Control Panel with capability to set file bindings; thanks to Sander for this!
  • Minor tweaks to toolbar dragging.

January 30 - FOX DEVELOPMENT 1.3.25

  • Changed algorithm that determines when a toolbar docks. For a horizontal dock site, the new algorithm docks the toolbar when the upper or lower edge of the bar falls inside the dock (with a slight amount of fudge since dock sites may be collapsed to 0 pixels when there's no bar inside), and when the bar doesn't stick out too much (mostly overlaps with the dock horizontally).
  • Also added some small icons to the toolbar grip docking menu.
  • Implemented workaround for grab-lost problems which happen under X11 when a window which is grabbed is docked or undocked. The workaround appear to really kill the issue dead and the opaque-dragging toolbars work just super now.
  • LAYOUT_DOCK_NEXT and LAYOUT_DOCK_SAME options conflicted with other layout options. One of the two reserved flag bits has now been used.
  • Removed the undock timer. Undocking now happens immediately, but docking is still done with a timer since we shouldn't dock just casually dragging a toolbar across a dock site by accident.
  • Docking back now happens not only when hovering near a dock area, but also when you release the toolbar grip near a dock area.
  • FXMenuTitle now pops its FXMenuPane besides itself instead of below, if the menubar is oriented vertically.
  • Fixed SUN Solaris build issue with FXGUISignal class.

January 28 - FOX DEVELOPMENT 1.3.24

  • Reintroduced FXTextCodec's. These were not be part of official 1.4 API, but apparently were being used by the FOX based SWT Widget Set for the Eclipse Project. Note that FXWString really is permanently gone:- FOX 1.5 will take a different approach to unicode support.
  • Fixed Borland C++ build issues and some Borland C++ specific compiler warnings.
  • Fixed Visual C++ build issues.

January 27 - FOX DEVELOPMENT 1.3.23

  • Added new class, FXGUISignal, which allows an FXThread to awaken the FOX GUI and cause it to run some callback message handler. Any number of FXGUISignals may be installed.
  • Changed FXToolBar class for docking/floating behaviour against FXToolBarDock.
  • Added new class called FXToolBarDock. FXToolBarDock implements rearranging of FXToolBars inside of it. FXToolBarDock is meant to be placed against the sides of an FXTopWindow where docking of toolbars and menubars is to be allowed. FXToolBarDock arranges FXToolBar in multiple galleys or rows. Each galley can have one or more FXToolBar widgets parked side-by-side.
    When space runs out, FXToolBarDock adjusts the number of toolbars on each galley by placing the last bar on the galley onto the next galley down until each galley fits.
  • Added new API's to FXUndoList and FXCommand to allow merging of undo records. The undo records can be made mergeable by implementing canMerge() and mergeWith() API's in your subclass of FXCommand. FXUndoList uses these to merge two records when adding a new FXCommand to the undo list.
  • Added before() and after() API's to FXWindow to allow testing of order of sinbling windows.
  • Changed reparent() function to have extra argument. The new reparent() API makes it possible to insert a widget at any location in the widget tree with a single call. If the widget keeps the same parent, all that happens is a layout recalculation; otherwise, the widget is reparented using a call to the native window interface. The old linkBefore() and linkAfter() API's are now obsolete.
  • Added option MBOX_SAVE_CANCEL_DONTSAVE; patch contributed by Sander.
  • Augmented FXStream for long file support.
  • Added own replacement strtoll() and strtoull() functions in case not available in local C-library.
  • 64-bit FXlong and FXulong datatypes are now ALWAYS available.
  • Updated FXFile, FXFileList, FXDirList for long file support.
  • Added FXLongVal, FXULongVal and signed and unsigned long FXStringVal API's for FXString.
  • Dropped FXWString and old text codecs; these are obsolete now.
  • Fixed bug in Windows event processing of WM_MOUSEMOVE. When mouse was grabbed, coordinates were wrong when cursor moves outside of grabbed window.
  • Fixed bug in getAppName() and getVendorName() in FXApp and similar problems in FXRegistry.
  • Upgraded internals of FXIconList, FXList, and FXHeader widgets to use FXObjectListOf template class instead of maintaining own array; this saves some code.
  • Changed many access function to return const FXString& instead of FXString. This eliminates generating a string copy.
  • Fixed FXMutex reserved memory size to be sufficient for IBM PowerPC/AIX.

X-Mas Release - FOX DEVELOPMENT 1.3.22

  • Completed layout computation for FXDockSite widget.
  • Fixed highlighting in FXToolBarGrip widget.
  • Added API's to FXStream: setBigEndian() and isBigEndian(). These force the FXStream into a particular byte order. Byte swapping will be enabled or disabled depending on the endianness of the platform. The old API isLittleEndian() is removed: to determine byte order, just use FOX_BIGENDIAN macro directly.
  • Simplify code for FXHorizontalFrame and FXVerticalFrame a little bit.

December 21 - FOX STABLE 1.2.13

  • Backported fixes to 1.2 branch.

December 14 - FOX DEVELOPMENT 1.3.21

  • In the FX***Image classes, loadPixels() now can be called even after the image has been created already. It'll resize the server-side pixel storage but not yet call render(), since further manipulations may be desired prior to render().
  • Added new colors to FXApp for selected menu foreground and background.
  • Fixed some long-standing issues with FXPopup menu handling code. It works better now...
  • Added API's like fxcheckTIF(), fxcheckJPG(), etc. These API's read a portion of the image file from the stream, determine if the image format is recognized, and then rewind the stream back to the same point. Thus, you can successively try each image type, create the right FXXXXImage class, and call loadPixels().
    A few of these fxcheckXYZ() API's need some further testing [mostly, due to poorly designed image formats where it is hard to determine the correct type easily].
  • Fixed issues with reswrap: first, when passing a prefix for the resource name, the resource name can start with a digit since the prefix is in front of it. Second, the prefix is now also used when using the -r altname option. Finally, filenames on windows can have mixed \ and / path separators. When turning filenames into legal identifiers, we now allow ":" in the name since one could use scope-resolution operator in icon name.
  • FXFile::absolute() no longerdoes tilde or environment expansion; there were cases where this was inappropriate and unexpected. You can call FXFile::expand() explicitly where desired.
  • FXFileList now shows "." instead of ".." when displaying root of a file system.
  • FXFile::simplify didn't handle cases like "/." to "/", causing trouble with the change made to FXFileList; we all knew we had to do slashdot right ;-).
  • FXFileDialog could not select "/" when in Directory selection mode. Adding "." in the top directory and simplifying "/." to "/" fixed this problem.
  • Changed handling of default color settings; system settings now applied only to settings NOT superceded from FOX Registry. Also, added support to read a few of the most important color settings from X Defaults database, which means FOX displays in colors as set up by your local window manager.
  • Updated HTML Syntax patterns from Andy Preston.
  • Updated Makefile Syntax patterns.
  • Fixed focus navigation code eating key/modifier combinations other than the ones its supposed to; thanks to chafar@alcances.net for pointing this out.
  • Hmmm, the FLTK people seem to like my timer-handling code too ;-)

November 29 - FOX DEVELOPMENT 1.3.20

  • Fixed problems with FXFileSelector/FXFileDialog; right-mouse popup menu functions Move/Copy/Link/Delete were not quite working right when multiple files were selected.
  • Added overloaded setData() to FXImage which changes shape as well as contents of client-side pixel buffer from given pixel array.
  • Updated FXDockSite.
  • FXFile::getUserDirectory() now uses %USERPROFILE%.
  • Added Python and Makefile patterns to Adie.stx syntax coloring file.

November 24 - FOX DEVELOPMENT 1.3.19

  • New program, fxdesktop control panel, allows you to set FOX colors and other settings interactively.
  • The quaternion function arc() now returns the quaternion representing the rotation of the two vectors, instead of double the angle of rotation about the same axis.
  • More new functions for manipulation of quaternions.
  • Ascii mode FXRegistry now uses %USERPROFILE% as default location for registry subdirectory. This affects few FOX programs since on Windows, the normal Windows Registry is used by default.
  • Added support for Xft in glUseFXFont(). It now properly generates OpenGL display list bitmaps for FreeType fonts.
  • Further work in FXFont support for Xft:- now properly fill in properties of the font that matched the desired font.
  • Made some API's in FXGLViewer virtual upon request from ESI-Group.
  • Fixed some HTML highlight pattern for Adie.
  • Read/write ascii based registry from %USERPROFILE%/foxrc on Windows; this is a more logical choice on Windows that %HOME%/.foxrc, which was the old choice. Note, this only affects programs which use the ascii-based registry on Windows. Most FOX programs use the Windows Registry and are thus not affected by this change.
  • Fixed problem with FXMessageBox ID_CLICKED_SKIP and ID_CLICKED_SKIPALL.
  • Fixed bug in FXStream usage of FXHash.

Halloween Release - FOX DEVELOPMENT 1.3.18

  • Important change: consolidated reparentItem(), moveItemBefore(), and moveItemAfter() in FXFoldingList and FXTreeList into a single new API called moveItem(). This is much easier to remember and also allows one to move an item into the right place in the tree in a single call.
  • Another important change: harmonized and simplified item addition API's in FXTreeList, FXFoldingList, and FXTreeListBox. The new API's are simpler to use, and easier to remember due to more similar naming to similar API's in the other list widgets.
  • Added setHeaders() API's to FXIconList and FXFoldingList. setHeaders() allows you to populate the entire header control of the list widget with a single call.
  • Fixed slight offset in editable cell text v.s. non-edited cell in FXTable.
  • Added new API's to list widgets. The new API's fillItems() can be used to populate a list widget with a number of items in one fell swoop. The new items are appended to the already existing ones.
  • Updated FXSpheref and FXSphered. including one point at a time now produces smaller bounding spheres. Also, empty sphere cases are now handled properly.
  • Fixed FXTreeListBox. When adding or removing items, the field was not updated properly.

October 28, 2004 - FOX DEVELOPMENT 1.3.17

  • Added editability to FXTable. You can edit cells in the table. From a user's perspective, editing a cell in FXTable is initiated in a number of different ways:

    • Double-click. This will create an input control in the cell and allow you to type.
    • Hit F2 function key, or RETURN key.
    • Start typing any printable character. This works if the input control is a text field; other input controls may drop the input.
    • Send an ID_START_INPUT message to the table.

    The editing ends in one of two ways. If the input is to be discarded, you can hit the ESC key. If the input is to be accepted, you can hit RETURN or nativage to the next cell using arrows or TAB keys.
  • Added API's startInput(), cancelInput(), acceptInput() to FXTable. These API's introduce sub-classable input editing for table items to the FXTable class.
  • Added setEditable() and isEditable() API's to FXTable.
  • getColumnX() and getRowY() in FXTable now return proper scrolled x and y positions of the start of a column (row).
  • Removed setColumnX() and setRowY() API's. Functionality of these API's is more intelligibly supported by calling setColumnWidth() and setColumnHeight().
  • Added new API's to FXTableItem. The getControlFor() creates and populates a editor control to be used to edit the item. It is used by FXTable to determine what type of control to use to edit a cell. By making this virtual, you can make custom FXTableItems which are edited by a control of your choice.
    The FXTableItem setFromControl() API is used to populate the item from the control. Its function is to read the control and extract the data into the item. In typical usage, it is envisioned that getControlFor() and setFromControl() are both reimplemented for subclassed FXTableItems.
  • Added more extensive documentation for FXRegistry.
  • Added center-justification mode to FXTextField. In addition to right- and left-justified text in the text field, you can now also have centered text. Centered text larger than the text field can scroll both ways. For backward compatibility reasons, the centered mode is only enabled when explicitly passing JUSTIFY_CENTER_X in the setJustify() API [otherwise, all text fields would end up being centered!].
  • Added API changeFocus() to FXWindow; it lets a parent widget know when the focus child is changed.
  • Added new API changeFocus() to FXWindow. It can be used by a composite widget to know when the focus changes to another child.
  • Added _POSIX_PTHREAD_SEMANTICS for older SUN Solaris thread support.
  • Added some API's in FXXYZStream classes.
  • Defaulted the normal FOX font to "helvetica,90" normally and "Sans,90" when XFT is enabled.
  • Removed deprecated timer and chore API's from FXApp.

Older News

Older news...

Copyright © 1997-2005 Jeroen van der Zijp

fox1.6-1.6.57/doc/page.css000066400000000000000000000021001326741342000150210ustar00rootroot00000000000000BODY { font-size:10pt; font-family:arial,verdana,sans-serif; } th { font-size:10pt; font-family:arial,verdana,sans-serif; } td { font-size:10pt; font-family:arial,verdana,sans-serif; } p { margin-top:1em; margin-bottom:1em; padding:0px; } pre { border-right: #646464 1px solid; padding-right: 0.5em; border-top: #646464 1px solid; padding-top: 0.5em; border-left: #646464 1px solid; padding-left: 0.5em; border-bottom: #646464 1px solid; padding-bottom: 0.5em; margin-left: 1em; margin-right: 2em; white-space: pre; background-color: #e6e6e6; color: black; wrap:yes; } #HEADLINE { font-size:10pt; font-family:arial,verdana,sans-serif; } A { color:#993300; font-size:10pt; font-family:arial,verdana,sans-serif; text-decoration:none; } A:hover { color:#404040; font-size:10pt; font-family:arial,verdana,sans-serif; text-decoration:none; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } span.comment { color:green; } span.keyword { color:red; } span.keywordtype { color:red; } span.preprocessor { color:blue; } fox1.6-1.6.57/doc/pathfinder.html000066400000000000000000000100311326741342000164070ustar00rootroot00000000000000 FOX-Toolkit
FOX Toolkit
 
PathFinder
 
     
  Home
News
Download
License
Goals & Approach
Documentation
FAQ
FXRex
Screenshots

Adie
PathFinder
FOX Calculator

Projects

FXPy
FXRuby
EiffelFox
Japanese Docs

 

Under Construction...
   
     
 
Copyright 1997-2005 Jeroen van der Zijp
fox1.6-1.6.57/doc/projects.html000066400000000000000000000516511326741342000161310ustar00rootroot00000000000000 Projects
Applications and Projects Using FOX [Remove Frame]

    Below follows a list of commercial applications and projects using the FOX toolkit, with links to the companies or organizations.

Commercial Applications using FOX

  • XTC is short for X-Windows Test Control and is the graphical user interface for the Intel(r) Modular Test Architecture for Linux(tm). XTC was designed for Intel board/system manufacturing and validation.

    XTC was developed by Daniel K. Osawa for Intel Corporation's Enterprise Products Group.

  • LinkCAD is a commercial format-conversion application for various CAD formats, written using FOX.
  • Royal Boskalis Westminster nv is an international service company active in the area of maritime infrastructure. Its core activities include the construction and maintenance of harbors and waterways, the creation of land in water, coastal defenses and  offshore services. Boskalis has operations in over 50 countries in five continents. The company has a large and varied fleet of some 300 vessels. Boskalis has a turnover of over one billion euro and employs over 3000 people.

    The fleet automation within Boskalis has been implemented on networked workstations running Linux/X11. All User interfaces (operator consoles, navigation displays, real-time data monitors, data processing and visualization) are FOX-based.

  • TMP Vision® and SLIM were designed to meet the demanding needs of engineers analyzing complex FEA models.
    For over 16 years, these tools and their predecessors have played an increasingly important role in the visualization, interpretation and documentation of finite element models.
    Today TMP Vision® and SLIM are a key part of the Lockheed Martin Aeronautics FEA analysis process and have been used in the support of many aircraft programs including the F-16, F-22, C-5 and Joint Strike Fighter. BAE Systems and Northrop Grumman are also using these tools as a part of the JSF program.
  • BRASMAP Sistemas has created software for Data Acquisition System for Power Generation called AQX.
    The application of the AQX - Data Acquisition System seeks to meet the needs of the Control Engineer in performing its duties, in field or laboratory. It is turned mainly to the application in the area of power generation control, offering a series of facilities for monitoring, recording and analyses of magnitudes associated to the equipment and control system.

    It allows to establish an efficient work cycle to perform tests and studies.

  • Lennox Antoine has written a Scene Graph Navigator. It features:

    • Supports over 20+ raster and vector formats.
    • Supports near infinite size rasters/heightmaps.
    • Spherical/Ortho/Perspective(first person) rendering styles built in.
    • Accuracy. Every thing is accurate. Approaching from outer space down to meter/feet range goes unnoticeable and seamlessly. Rasters are also draped onto terrain accurately (not stretched) no matter what size the terrain is.
    • Completely cross platform. From the GUI (thanks to FOX) to the scenegraph workings, it should work on any platform out there.
    • Advanced Raster Support. Rasters can be drawn on in realtime or re-used for other things.
    • Powerful WYSIWYG editing approach. Almost everything is editable in a nice user friendly way.
    • Procedural full detail buildings. No longer just a wall with a texture on it. Balconies, extremeties, windows, etc... are all rendered as well.

  • Arachno Ruby/Python/PHP IDE This is a complete IDE for the three languages, that is has special features for developing web based applications like automatic setup of an isolated webserver,application server environment. It has more then 100 dialog windows (most of them for editing HTML targets) and uses FOX via an Eiffel wrapper.
  • VORHour is a timecard/hour registration program developed and used by VORtech. It is written using FOX and is connected via ODBC to a local MySQL Database.
  • While at CFD Research Corp., the author worked on CFD-VIEW, a visualization and postprocessing package for Computational Fluid Dynamics results. The picture shows a streamline rake over a multi-zone, tetrahedral unstructured mesh of our favorite mascot, Tux.

    CFD Research Corp. offers a number of software packages for Computational Fluid Dynamics, Micro-Electro-Mechanical Systems [MEMS], Semi Conductor Processing, Bio-Medical applications, and other engineering applications.

  • The Side-by-Side Viewer is a tool developed by AcuSoft to allow easy exploration and examination of SEDRIS transmittals, as well as other formats, such as:

    • OpenFlight (FLT)
    • Performer Binary (PFB)
    • Compact Terrain Database (CTDB)
    • Digital Terrain Elevation Data (DTED)

    Side-by-Side also has the capability of displaying multiple databases simultaneously, simplifying the process of finding discrepancies amongst different formats of the same database.

    For more screenshots see: http://www.acusoft.com/products/sbs/gallery.html

  • CIMPLEST CAPE Workbench is a commercial application developed by Cimplest Inc. to support Computer Aided Production Engineering (CAPE).
    This application provides an easy to use graphical environment within which a production engineer can rapidly develop models of manufacturing systems. The following design and analysis activities are supported: materials requirements analysis, work load analysis, optimal resource capacity allocation, dynamic lead time analysis, production/part cost analysis, production scheduling, standard work design, facilities layout design, process similarity analysis (group technology). Add-on modules provide additional capabilities: the Performance Explorer module adds Design of Experiments (DOE) capabilities for parameter sensitivity analysis; the Performance Optimizer module adds Simulated Annealing (SA) based lead time and production cost optimization capabilities; the ODBC Data Access module provides the capability to create user defined scripts for accessing enterprise data sources; and the WebDAV module provides the capability to publish and share Cimplest models in a secure and distributed fashion.
    The upcoming Apache web server module mod_cimplest will enable Cimplest models developed within the workbench application to be updated with data feeds from shop floor monitoring systems and will target real time scheduling and supply chain integration efforts.


Other Projects using FOX

  • Open Space Openspace is powerful, flexible, and utterly configurable file manager. Some of the main features of Openspace are: support for two panel view and single panel view, graphically configurable,powerful file recognition system allows you to configure how files of different types are shown (with colors and icons), and what happens when you doubleclick them, option for automatic configutation after first run, extensibility, two types of plugins, Drag and Drop support compatible with KDE and GNOME applications, fast, thumbnails support, very fast and comfortable moving through directories, three icon-display modes: big icons, small icons and details.
    • Perpetual Diary This program is, as its name suggests, a diary that will be usable for years to come. It displays one month at a time and includes the day name as well as the date. You can add as many entries as you want to each day and you can select the colour of the text and background for each entry. A diary entry can be marked as an annual event, that is an event that occurs on the same date each year, so that you need only enter such things as birthdays or anniversaries once. You can print one month or a range of months.
    • The Image Debugger is a programmer's utility to make debugging of Win32 applications that use images and grid data easier. Examples of such applications include 3D games and visualization applications, as well as grid-based numerical PDE simulation codes. The Image Debugger could even conceivably be used to debug dense matrices.
    • FRED is an experimental event display based on the HepRep protocol and mainly inspired by WIRED; it is programmed in the Ruby language ad it uses a Ruby port of the fantastic FOX Toolkit library for GUI.
      FRED and CMT are being developed by Riccardo Giannitrapani and Marco Frailis at the Udine Department of Physics as a part of the NASA GLAST (Gamma Ray Large Area Space Telescope) experiment.
    • CLView an assembly file viewer.
      This is a graphical, interactive tool for inspecting the ACE format assembly files generated by CAP3 or phrap. Beasides the ACE files, the program also supports a custom cluster layout format for the overview of a possible multiple alignments generated just from pairwise alignments, where no detailed nucleotide level alignment is needed and provided. The "containment clustering" program (nrcl) mentioned in the TGI Clustering tools (TGICL) above can generate such a "cluster layout" file (*.lyt). Here is a precompiled linux version with the required dynamic FOX library included: clview_linux_i386.tar.gz The program was built using the FOX toolkit by Jeroen van der Zijp, a portable and feature-rich C++ framework for developing graphical user interfaces under Unix and Windows. In order to compile the source code of this viewer, you need to download the FOX library and the TGI C++ class library aims to be a stable, open source, and graphical audio file editor primarily for but not limited to the Linux operating system.
    • Computer Simulations in Physics comprises a number of physics simulation programs written by Maciej Matyka using the FOX Library for the user interface:

    • The Adie Text Editor is a nice little program for editing and viewing files; it comes standard with the FOX distribution.
    • The FOX Calculator is a fully desktop calculator and also a good example of FOX programming in general. The FOX Calculator is a scientific calculator with many handy features added for programmers.
    • Goggles is a GUI-frontend for the Ogle DVD player developed by Sander Jansen.
    • ReZound aims to be a stable, open source, and graphical audio file editor primarily for but not limited to the Linux operating system.
    • Octex, a 3D Paint Program by Thrown Clear Productions.
    • PSReg (Parallel Simultaneous Registration). Very interesting.
    • CASP is a tool to image analysis in comet assay. CASP has been developed to work with either color, or gray-scale images of fluorescence-stained comets saved in TIF format.

    • Martin Welch is working on a very nice Dialog Editor for FOX. Here is a screen shot of his GUI builder running under Windows 2000; and another screenshot of the program running under Linux.
    • This picture shows FOX being used in a PC board design application. It highlights the use of the FXTreeList widget (on the left), the FXShutter widget (on the right) and the OpenGL FXGLViewer widgets, as well as the Multiple Document Interface Widgets (center).
    • Another FOX application being developed by Davin S. Hills is a RedHat Package (RPM) viewer and manipulation program; download it from his site.
      Check out the May 2000 issue of Linux Journal sporting an article Cooking with Linux: Rapid Program-Delivery Morsels, RPM by Marcel Gagne which features his FOX-based RPM package builder!
    • Another ongoing project is FOX Pilot. FOX Pilot is a FOX-based Interactive GUI Builder and its being developed by celer@scrypt.net.
    • PathFinder is my own attempt at making a File Manager. It features file mime-type bindings, customizable file- and directory icons, directory bookmarking, drag and drop (compatible with KDE and GNOME), and wildcard matching to reduce the number of visible files. It is probably the fastest file manager you've ever seen.
    • Dustin Graves is developing a number of very nice FOX projects, among which another FOX-based calculator; you can find them on his web page.
    • A suite of FOX Desktop applets is being developed by Josua Groeger. The first applets being undertaken are Control Panels to set various desktop-wide resources for FOX-based applications.

    • EMSO a Computer Aided Process Engineering (CAPE) tool for dynamic and steady-state modeling, simulation and optimization of general processes. EMSO is a graphical environment where the user can model complex dynamic or steady-state processes by simply selecting and connecting model blocks.
      In addition, the user can develop new models using the EMSO modeling language or use those already made from the EMSO Model Library - EML.
      EML is an open source library of models written in the EMSO modeling language. The EMSO modeling language is an object-oriented language for modeling general dynamic or steady-state processes.

    FOX Language Bindings

    • FXPy is the Python language binding to FOX. It is being developed by Lyle Johnson, who is also responsible to a large degree for the Windows 95/98/NT port of FOX. FXPy is being regularly updated to incorporate the latest features in the FOX toolkit.

    • FXRuby is the Ruby language binding to FOX. This is also being developed by Lyle Johnson.

    • EiffelFox is an Eiffel Language binding for the FOX Library has been developed by Darren Hiebert, who is also responsible for the Exuberant CTags package.

    FOX Extensions

    • FXScintilla is a FOX implementation of the Scintilla source code editing component.
    • FXEX is an extension library for the FOX toolkit.
    • FXvt is a virtual terminal FOX widget derivated from the well known.
    • FXBasketListBox is an extended FXListBox that allows you to select several items from the ListBox.
    If you want your FOX based application to be featured here, or need to update the above information, please mail me and I'll update this page!

    Copyright © 1997-2005 Jeroen van der Zijp

    fox1.6-1.6.57/doc/references.html000066400000000000000000000251701326741342000164160ustar00rootroot00000000000000 References
    References [Remove Frame]

    References

    Copyright © 1997-2005 Jeroen van der Zijp

    fox1.6-1.6.57/doc/registry.html000066400000000000000000000374441326741342000161540ustar00rootroot00000000000000 Documentation: The FOX Registry
    Documentation: The FOX Registry [Remove Frame]

      Many applications have a need to read settings and configuration parameters from configuration files.  For example, it is common for applications to remember which documents have been used recently with an application, or what color a user has changed his/her window background to.

      Historically, each application has implemented its configuration files in its own way, resulting in a plethora of file formats, each with their own syntax and semantics.  Moreover, many applications can only read, and not write these configuration files; they rely on the user to fire up an editor and edit them by hand.

      The FOX Registry class provides a simple method to keep track of configuration parameters for FOX-based applications.  Entries can be both read as well as written, and settings will persist across invocations because the system will write changed settings back to disk.

      Because the format is the same for all FOX applications, users will have to learn only one [very simple] syntax in case they want to edit these files by hand (although in most cases, registry files will probably be manipulated by FOX programs only).

    Design Features of the FOX Registry

      A registry mechanism should allow applications from many vendors or organizations to coexist peacefully.  Also, certain settings or configuration parameters should be applied system wide, others  ``suite-wide'' i.e. for all applications produced by some organization.  Yet other settings apply only to one application. Tallying it all up, I've come up with the following list of requirements for a registry system:

      • System-wide Desktop settings.  Configuration parameters which apply to all users on a certain system, and apply to all applications.  For example, parameters specific to a certain FOX installation, such as the location of icon files, images, and other such parameters.
      • System-wide Vendor settings.  These settings are determined during installation of some vendor's application suite.  They apply to all applications which belong to the suite, and to all users on the system.
      • System-wide Application settings.  These parameters apply to a specific application, and to all users on the system.
      • Per-user Desktop settings.  Personal preferences that a specific user has changed from the system-wide settings, and which apply to all applications run by this user.
      • Per-user Vendor settings. Similarly, a user of some application-suite from a certain vendor may have changed a few things to suit his/her personal preferences.
      • Per-user Application settings.  These are specific configurations that a user may have changed while running an application.

      All settings can be ``shadowed'' or overridden.  The general rule is that more specific settings override more general ones.  FOX implements this by first loading system-wide settings, then per-user settings; within each category, Desktop settings are shadowed by Vendor settings, and those are overruled by Application settings.

      Registry settings are not shadowed when they've been changed, i.e. a setting which was changed by an application is not replaced by a settings entry loaded later.

      Finally, when settings are being written back to disk, they will automatically become per-application, per-user settings.  For instance, suppose the default system-wide background color is ``gray.''  If the user changes this, it will become a per-user default background color.  In other words, the system-wide settings are never written, except perhaps when the application is being installed.

      The FOX settings database is comprised tyically of a number of files which are placed in a certain directory structure.  The organization is as follows:

      <DIR>/Desktop The settings database for all FOX applications.  This contains things such as double-click speed, default application fonts, and so on.
      <DIR>/<VENDOR>/<VENDOR> This contains all settings for all applications produced by organization <VENDOR>. 
      <DIR>/<VENDOR>/<APP> This contains all settings for application <APP> produced by organization <VENDOR>.

      The same directory structure applies for both system-wide settings and per-user settings.  The system-wide settings are found in directories:

      /etc/foxrc
      /usr/lib/FOX/foxrc
      /usr/local/lib/FOX/foxrc
      
      Per-user settings are found in:
      $HOME/.foxrc
      

      Which is a hidden directory directly under the users regular HOME directory.

    Format of a Registry File

      The format for a FOX registry file is very similar to that of the SAMBA configuration files.  It consists of a number of sections, and each section contains a number of registry entries.  Each entry is a key/value pair, where the key is the name of the particular entry, and the value is a human-readable string representing the value of that key. For example:

      # A section
      [SETTINGS]
      
      # An entry
      clickspeed = 400
      scrollspeed = 400
      
      # Strings may have to be quoted if they contain special characters
      tiger = "Tyger tyger burning bright\nIn the forest of the night"
      
      ! Comment may also start with a bang
      tippause = 500
      tiptime = 300
      

      The section names should consist of alphanumeric characters [A-Z,a-z,0-9], and may contain underscores ``_'' also.  Key names should consist of alphanumeric characters [A-Z,a-z,0-9], underscores, dash ``-'' or periods ``.''.  Value strings may consist of any non-blank character, except ``#'' or ``!'' which are used for comments.  To incorporate these and other non-printable characters, you may quote the string as shown above.  Special characters can be embedded into a quotable string using the regular C-style backslash mechanism, i.e. ``\n'' is replaced by a newline; control characters can be embedded using hex-notation: for instance, ``\FF'' represents the byte 0xff.

      Under the MS-Windows Implementation of FOX, you can use either the ASCII, human-readable implementation, or the binary version which uses the built-in System Registry.

    Using the Registry

      The FOX FXApp object contains an embedded FXRegistry object, which is automatically read in when you start up using FXApp::init().  Likewise, this registry is also automatically written back out when you terminate the application using FXApp::exit().

      The application name and vendor name parameters passed in when you construct the FXApp object are directly used as the application name and vendor name for the registry system.

      To make use of the registry in your application's code, you can obtain a reference to the embedded registry object using FXApp::reg().  FXRegistry provides the following API:

        FXbool read()
         

        This function causes the system-wide registry database to be read first, followed by the per-user database.  In each category, it reads the Desktop, Vendor, and Application settings in order, overwriting unmodified settings as it goes.
        Note that upon startup, a FOX application automatically calls the registry's read() function already.  You will usually not call this function, unless perhaps to re-read the registry.


        FXbool write()

        If any settings have been changed, this will write out the changed values into the per-user, per-application files of the registry database.
        Note that a FOX application automatically calls the registry's write() function when the application terminates normally (i.e. by calling FXApp::exit()).  You will not call this function under normal conditions, except perhaps to force changed registry entries to disk, e.g. so that other instances of the same application will encounter the changed entries, even before the current one quits.


        const FXchar *readStringEntry(const FXchar *section,const FXchar *key,const FXchar *def)

        This function attempts to localize the entry key in the section of the registry database, and returns the value of this key if it is found; otherwise, it returns the specified def value.


        FXint readIntEntry(const FXchar *section,const FXchar *key,FXint def)

        Similar to the function above, only it assumes the entry's value is an integer number.


        FXint readUnsignedEntry(const FXchar *section,const FXchar *key,FXint def)

        Similar to the function above, only it assumes the entry's value is an unsigned integer number.


        FXdouble readRealEntry(const FXchar *section,const FXchar *key,FXdouble def)

        Assumes that the entry's value is a real number.


        FXColor readColorEntry(const FXchar *section,const FXchar *key,FXColor def)

        Assumes that the entry's value is a color, which may be specified by a color name, like "red", or in hex notation, as in "#ff0000".


        FXbool writeStringEntry(const FXchar *section,const FXchar *key,const FXchar *val)

        Sets or changes the value of key in the given section to the value val. If this key or section does not yet exist, it is created.


        FXbool writeIntEntry(const FXchar *section,const FXchar *key,FXint val)

        Similar, but assumes the key's value is an integer number.


        FXbool writeUnsignedEntry(const FXchar *section,const FXchar *key,FXint val)

        Similar, but assumes the key's value is an unsigned integer number.


        FXbool writeRealEntry(const FXchar *section,const FXchar *key,FXdouble val)

        Assumes the entry's value is a real number.


        FXbool writeColorEntry(const FXchar *section,const FXchar *key,FXColor val)

        Assumes the entry's value is a color; it is translated into a colorname, or as in hex notation if no name is found for the color.


        FXbool deleteEntry(const FXchar *section,const FXchar *key)

        Removes the entry from the database.  It will be removed from the per-user, per-application file, but not from the system-wide or per-user Desktop or Vendor files.


        FXbool existingEntry(const FXchar *section,const FXchar *key)

        Returns true if the given section and key exists.


        FXbool deleteSection(const FXchar *section)

        Removes the named section from the database. The section will be removed only from the per-user, per-application file.


        FXbool existingSection(const FXchar *section)

        Returns true if the given section exists.


        FXbool clear()

        Clears the entire database.


        void setModified(FXbool mdfy=TRUE)

        Mark the registry as having been modified or non-modified.  One would typically call this to prevent modified entries from being written.


        FXbool isModified()

        Returns TRUE if the database has been modified.


        void setAsciiMode(FXbool asciiMode)

        On MS-Windows, this switches the registry to ASCII based, human-readable format or, if asciiMode is FALSE, to the binary system.
         

    The Standard Registry in FOX Application Object

      Note that the FOX FXApp object provides a registry already.  The standard application registry is defined in terms of the application name and vendor name that were passed into the FXApp's constructor.
      When an application is started, the standard registry is automatically loaded when FXApp::init() is called.  Likewise, modified registry settings are automatically written when FXApp::exit() is called.  You should take care that these functions are called when writing your own programs so that settings needed in your program are available when you expect them, and are properly written back to disk after the application exits
      Only changed settings are written back; if no changes have been made to any settings while running the application, no writing would take place at all.

      You can access the built-in registry object by the FXApp::reg() member function.  For example:

      FXColor canvasbackground = myapp->reg().readColorEntry("SETTINGS","background",FXRGB(255,255,255));
      

      To read a background color from the settings database, and default to white if no entry exists.

      When writing the registry, FOX first writes to a temp file, then renames the temp file to the regular registry file.  Since rename() is an atomic system call, either it works and the new registry is in place, or it doesn't and the old registry is still in place; at no time would a partially complete registry file be left behind; therefore, the registry mechanism should be quite safe even in the presence of multiple applications simultaneously trying to access the same registry.

    Copyright © 1997-2005 Jeroen van der Zijp

    fox1.6-1.6.57/doc/rex.html000066400000000000000000000752321326741342000150770ustar00rootroot00000000000000 fox-toolkit.org - Documentation: Regular Expressions
    Documentation: Regular Expressions [Remove Frame]

    What are Regular Expressions?

      Regular Expressions are used to search strings for certain patterns. For example, in a text editor you might want to search for the pattern "widgets?". This pattern will match occurrances of the word "widget" or "widgets" in the text.
      Thus, a regular expression matching facility is a necessity for writing programs which perform text searches, syntax coloring, and so on.

    Anatomy of Regular Expressions

      A regular expression is comprised of one or more branches separated by a "|". Each branch is made up of a sequence of pieces, and each piece is an atom optionally followed by a repetition.

      Atoms are the simplest element in a regular expression. The simplest atoms are individual letters. For example, the letter "a" is an atom, and it matches a letter "a" in the subject string.
      Another kind of atom is the character class, which is simply a set of characters; for example, the atom "[abcdefg]" matches one of {a,b,c,d,e,f,g} in the subject string. Thus, "[abcdefg]" matches "a" or "g" but not "q".
      As a shorthand, you can identify a bunch of characters by a character range, as in "[a-z]" which is automatically translated into "[abcdefghijklmnopqrstuvwxyz]". You can see this is a lot shorter.

      You can also simply negate the set using "^"; thus "[^a]" matches any character, EXCEPT the "a". To include the "]" character itself it must be used as the first character after the "[". To include the "-" itself it must be the first character after the "[", the second character of the range, or the character just before the "]".

      You can embed control characters by the usual C conventions: \t for TAB, \n for NEWLINE, and so on. Or you can use the control-character notation, like \cH for ^H or BACKSPACE.
      Other characters may be entered by octal or hexadecimal notation: \0 for octal 0, and \xff for 0xff or decimal 255 (all 256 possible characters are legal in the subject string, FXRex does not treat any character specially, not even the end-of-string character).

      Repetitions may optionally follow an atom, making a piece. For example, "a*" matches "", "a", "aa", and so on. The "*" operator matches zero or more occurrences. There are also several other repetition operators. The "+" operator matches one or more occurrences, and the "?" matches zero or one occurrence.

      Finally, there is also a way to match a bounded number of occurrences. For example, "a{3}" matches "aaa", while "a{0,3}" matches "", "a", "aa", and "aaa", but not "aaaa".
      The general form of the bounded repetition is "a{n,m}" and this matches at least n but no more than m occurrences of the preceding atom. For convenience, we allow omission of the n or the m; thus, "a{,m}" becomes equivalent to "a{0,m}", and "a{n,}" becomes equivalent to "a{n,infinite}". The special form "a{n}" is equivalent to "a{n,n}".

      Repetitions may be greedy or lazy. Greedy repetitions are the default; greedy repetitions will try to match as many characters as possible, whereas lazy repetitions will try to match as few as possible. You can indicate a lazy repetition by appending a "?". So "a*?" is the lazy equivalent of "a*", "a??" the lazy equivalent of "a?", and "a{2,5}?" that of "a{2,5}".

      A sequence of pieces makes up one branch. Several branches may be separated by a "|", and these become alternatives. For example, the pattern "ac|dc" matches "ac", or "dc".

      Precedence rules are such that repetitions bind more strongly than sequencing, so that "ab*" matches a single "a" followed by zero or more "b"'s. Conversely, the "|" operator is the weakest, making the pattern "a|b*" match either a single "a", or a sequence of zero or more "b"'s. Explicit use of parentheses allows other precedences: "(a|b)*" is a sequence of zero or more characters, each either "a" or "b", i.e. the same as "[ab]*".

      FXRex, like PERL, offers a more convenient way to specify certain frequent character classes; they are also faster to use when matching. For example, "\s" matches any whitespace, "\S" matches anything other than whitespace. The "\d" matches any digit, and is equivalent to "[0-9]".
      Of course, "\D" is equivalent to "[^0-9]". The "\l" matches any letter like "[a-zA-Z]", and "\L" any non-letter. "\w" matches any word character and is equivalent to "[a-zA-Z_0-9]". See the table below for a full list.
      You can use these character set shortcuts inside a character class; for example, "[\dA-Fa-f]" is equivalent to "[0-9A-Fa-f]", which could actually also be done more compactly by "\h" (hexdigits).

      Assertions provide a way to match without consuming any characters. You are probably familiar with "^", which matches the begin of the line, and "$", which matches the end of the line. FXRex also provides a few additional assertions: "\<" matches word begin, i.e. a character position such that the previous character matches \W and the following character matches with \w. Likewise "\>" matches a word end. The "\b" and "\B" match word boundary and word interior, respectively. Note that the backspace character may be entered as \cH or \x8.

      The ultimate in assertions is the so-called positive or negative look-ahead. Lookahead effectively provides for arbitrarily complex positive or negative assertions. Unless you're familiar with PERL, you may not have seen certain features before. First, FXRex supports additional zero-width assertions [Zero width assertions are points in the recognition phase of a pattern where a match can pass or fail without consuming characters from the subject string].

      The "(?= ... )" and "(?! ... )" syntax is used for positive and negative look ahead, respectively. For example "fred(?!erick)" will match "fred" and "freddy", but not "frederick".

      Jeffrey Friedl wrote what is now the standard work on regular expressions, see Mastering Regular Expressions. This book is recommended for further background on Regular Expressions.

    Regular Expression Grammar

      FXRex accepts patterns with the following grammar:
       
      expression::=branch { "|" branch }*
      branch::={ piece }*
      piece::=atom [ rep ]
      rep::=( "*" | "+" | "?" | counts ) [ "?" ]
      counts::="{" digits ["," [ digits] ] "}"
      atom::="(" expression ")" | "[" [^] range "]" | characters
      range::=character | character "-" character
      characters::={ character }*
      digits::={ digit }*

      When parsing a pattern FXRex first performs a grammar check, and measures the resulting regex code. Subsequently it generates the pattern code. FXRex returns immediately when the syntax is found to be incorrect, and returns an appropriate error code.

    Matching Operators

      FXRex supports the following matching operators:
       

      Basics
      |Alternation.
      ( ... )Grouping sub pattern.
      (?i ... )Match sub pattern case insensitive.
      (?I ... )Match sub pattern case sensitive.
      (?n ... )Match sub pattern with newlines.
      (?N ... )Match sub pattern with no newlines.
      (?: ... )Non-capturing parentheses.
      [ ... ]Character class.
      [^ ... ]Negated character class.

      Greedy Repetitions
      *Match 0 or more.
      +Match 1 or more.
      ?Match 0 or 1.
      {}Match 0 or more.
      {n}Match n times.
      {,m}Match no more than m times.
      {n,}Match n or more.
      {n,m}Match at least n but no more than m times.

      Lazy Repetitions
      *?Match 0 or more.
      +?Match 1 or more.
      ??Match 0 or 1.
      {}?Match 0 or more times.
      {n}?Match n times.
      {,m}?Match no more than m times.
      {n,}?Match n or more.
      {n,m}?Match at least n but no more than m times.

      Special Characters
      \aAlarm, bell.
      \eEscape character.
      \tTab.
      \fForm feed.
      \nNewline.
      \rReturn.
      \vVertical tab.
      \cxControl character.
      \033Octal.
      \x1bHex.

      Character Types
      .Match any character.
      \wWord character [a-zA-Z_0-9].
      \WNon-word character.
      \lLetter [a-zA-Z].
      \LNon-letter.
      \sSpace.
      \SNon-space.
      \dDigit [0-9].
      \DNon-digit.
      \hHex digit [0-9a-fA-F].
      \HNon-hex digit.
      \uSingle uppercase character.
      \USingle lowercase character.
      \pPunctuation (not including '_').
      \PNon punctuation.

      Zero Width Assertions
      ^Match begin of line [if at begin of pattern].
      $Match end of line [if at end of pattern].
      \<Begin of word.
      \>End of word.
      \bWord boundary.
      \BWord interior.
      \AMatch only beginning of string.
      \ZMatch only and end of string.
      (?= ... )Positive lookahead.
      (?! ... )Negative lookahead.

      Other
      \1 ... \9Back reference.

    The FXRex Class

      The FXRex class is geared toward ultimate convenience:- simple things should be simple. When you're interested in syntax errors, you can obtain the error code returned by the parser. Otherwise, the compiled pattern will simply be set to the empty (fallback) pattern. The fallback pattern will always fail to match.

      FXRex contains the following member functions:


      FXRex()

      The default constructor initializes FXRex to the fallback or empty pattern.


      FXRex(const FXRex& orig)

      The copy constructor initializes FXRex to the a copy of the original pattern.


      FXRex(const FXchar* pattern,FXint mode=REX_NORMAL,FXRexError* error=NULL)

      Parse the given pattern by calling parse. If the parameter error is not NULL, the return code of the parse will be assigned to its contents; this code will be set to REGERR_OK if the parse succeeded, or some error code if it failed.


      FXRex(const FXString& pattern,FXint mode=REX_NORMAL,FXRexError* error=NULL)

      Same as above, only taking an FXString as argument.


      FXRex& operator=(const FXRex& orig)

      Assigns the compiled pattern of orig into this FXRex.


      FXbool empty()

      Returns TRUE if the pattern is empty, i.e. equal to the fallback pattern which matches nothing.


      FXRexError parse(const FXchar* pattern,FXint mode=REX_NORMAL)

      Parse the given pattern, returning REGERR_OK if successful, and an error code if a syntax error has been detected. The mode parameter is the bitwise OR of some flags which control various aspects of the regular expression code being generated:
      • REX_NORMAL. This is the default; the normal mode does not generate capturing parentheses; this corresponds to the most common use of regular expression matching.

      • REX_CAPTURE. This flag enables the use of capturing parentheses, and back-references.

      • REX_ICASE. Case insensitive matching is enabled. When backreferences are also enabled, through the REX_CAPTURE flag, they become insensitive to case as well, so that a pattern "(aa)bb\1" will match "aabbAA".
        The REX_ICASE mode can be changed using cloistered mode expressions of the form "(?i ... )", which enables case-insensitive mode only for the given subexpression, and "(?I ... )", which enables case-sensitive mode for the subexpression.

      • REX_NEWLINE. This will cause the any character type operations to also match newlines.
        The expressions "(?n ... )" and (?N ... )" can be used to change the REX_NEWLINE mode for a subexpression.

      • REX_VERBATIM. This flag turns off all the magic characters (including backslash escape sequences). The corresponding regular expression program therefore degenerates into a simple literal match. If REX_ICASE has also been passed, a literal case-insensitive match results.
        The REX_VERBATIM flag is useful to allow building regular expression programs even when no special matching is required.

      • REX_SYNTAX. When this flag is passed, the pattern is parsed normally, but no code is generated. This option is useful to test the regular expression pattern for syntactical correctness only.
      When parsing fails, or when REX_SYNTAX is passed, the regular expression object will be initialized to the fallback program; in other words, the regular expression will be empty. All matches attempted with the empty pattern will fail.


      FXRexError parse(const FXString& pattern,FXint mode=REX_NORMAL)

      Same as above, only taking an FXString as argument.


      FXbool match(const FXchar* string,FXint len,FXint* beg=NULL,FXint* end=NULL,FXint mode=REX_FORWARD,FXint npar=1,FXint fm=0,FXint to=2147483647)

      Match the given subject string of length len, and returns TRUE if the pattern matches. if beg and end are not NULL, (beg[0],end[0]) will contain the offsets relative to the begin of string where the match started/ended, and (beg[i],end[i]) will contain the offsets where sub-expression i started/ended, or (-1,-1) if the corresponding subexpression was not matched. The search is performed in the range [fm,to].

      The mode parameter is a bitwise OR of some flags which control how the string is to be matched by the pattern:

      • REX_FORWARD. This is the default. REX_FORWARD causes the matcher to scan the subject string starting from offset fm up to and including offset to.

      • REX_BACKWARD. Scan the subject string, moving backwards starting from to down to offset fm. An important special case is when fm and to are the same; in this case, only a single attempt is made at the indicated offset. Observe also that while the scan is performed between fm and to, the actual subject string matched may extend past this range!

      • REX_NOT_BOL. Normally, it is assumed that the start of the subject string is also the start of a line; however passing the flag REX_NOT_BOL suppresses this behavior. When passed, only positions immediately following a newline will match the "^" assertion.

      • REX_NOT_EOL. This suppresses the interpretation of the end of the subject string as the end of a line; when passed, only positions preceding a newline will match the "$" assertion.
        The flags REX_NOT_BOL and REX_NOT_EOL are useful when you need to match against a random chunk of text.

      • REX_NOT_EMPTY. Disallow empty strings from matching. When passed, an empty string is NOT considered a match; for example, if the pattern:

        a?b?

        is applied to a string not beginning with "a" or "b", it matches the empty string at the start of the subject. With the REX_NOT_EMPTY flag, this match is not valid, so FXRex searches further into the string for occurrences of "a" or "b". For example, when searching for pattern "a*" in "bbba", normally "" would be matched, as zero repetitions of "a" is normally possible. With REX_NOT_EMPTY, the single "a" will be matched instead.
        This is usually what people expect to happen.

      The parameter npar controls the length of the beg/end arrays. It should be set to at least 1. If the pattern has been compiled with REX_CAPTURE, any capturing sub-expressions at a level greater than npar will operate as if they were non-capturing subexpressions. Thus, backreferences greater than npar will fail.
      Hence it is important to pass a value for npar which is at least as large as the expected number of capturing subexpressions.

      The parameters fm and to furnish the matcher with the range of the text to be searched. Making fm and to equal will force the matcher to perform a single matching attemt at the given offset.


      FXbool match(const FXString& string,FXint* beg=NULL,FXint* end=NULL,FXint mode=REX_FORWARD,FXint npar=1,FXint fm=0,FXint to=2147483647)

      Same as above, only taking an FXString parameter.


      static const FXchar* getError(FXRexError error)

      Returns a pointer to a string containing a human-readable error message for the given error code.


      FXbool operator==(const FXRex& r1,const FXRex& r2)

      FXbool operator!=(const FXRex& r1,const FXRex& r2)

      Compares regular expression r1 and r2. error code.


      FXStream& operator<<(FXStream& store,const FXRex& s)

      FXStream& operator>>(FXStream& store,FXRex& s)

      Serialize and deserialize regular expression s to/from stream store.

    Using the FXRex class

      FXRex is most easy to use. The simplest usage is something like:


      // A letter or underscore followed by a letters, digits, or underscores
      FXRex identifier("[a-zA-Z_][a-zA-Z0-9_]*");
      FXString string;
        ...
      if(identifier.match(string)){ /* found it ... */ }

      The usage above is the simplest possible:- we just want to know if the pattern is contained in the string. If we need to execute a pattern only once, more crufty C++ implementor would probably write:


      if(FXRex("[a-zA-Z_][a-zA-Z0-9_]*").match(string)){ /* found it ... */ }

      Its so nice to be able to do that in 1 line of code, isn't it?
      Most of the time, we want to know more; not only whether there was a match or not, but also where in the string the pattern was found:


      // A letter or underscore followed by a letters, digits, or underscores
      FXRex identifier("[a-zA-Z_][a-zA-Z0-9_]*");
      FXString string;
      FXint beg,end;
        ...
      if(identifier.match(string,&beg,&end)){
        // Return the matching part
        return string.mid(beg,end-beg);
        }

      If we have enabled capturing parentheses, we can extract even more information; not only where the whole pattern matched, but also where each subpattern was found. The following code fragment which breaks up a floating point number into a sign,mantissa, and exponent using the pattern "(-|\+|)(\d*\.\d*)(E(-|\+|)\d+)?" illustrates the technique:


      // Pick apart a floating point number
      // Note that backslashes must be escaped in C++!
      FXRex number("(-|\\+|)(\\d*\\.\\d*)(E(-|\\+|)\\d+)?",REX_CAPTURE);
      FXString string,sign,mantissa,exponent;
      FXint beg[5],end[5];
        ...
      if(number.match(string,beg,end,REX_FORWARD,5)){
        // Get the sign
        sign=string.mid(beg[1],end[1]-beg[1]);
        // Get the mantissa
        mantissa=string.mid(beg[2],end[2]-beg[2]);
        // Get the exponent
        exponent=string.mid(beg[3],end[3]-beg[3]);
        }

      Note that we're passing npar=5 as the last argument because there are 5 pairs of values returned in the beg[] and end[] arrays: (beg[0],end[0]) contains the entire pattern, (beg[1],end[1]) the sign, (beg[2],end[2]) the mantissa, (beg[3],end[3]) the exponent, and (beg[4],end[4]) the sign of the exponent.
      If a particular sub-expression is not matched (for example, if there is no exponent), then the corresponding entry will contain (-1,-1).
      Because it needs to record where a sub-expression matches, its quite expensive to use capturing parentheses when we don't need to. Fortunately, there's a solution for this:


      // Pick apart a floating point number
      FXRex number("(-|\\+|)(\\d*\\.\\d*)(E(?:-|\\+|)\\d+)?",REX_CAPTURE);
      FXString string,sign,mantissa,exponent;
      FXint beg[4],end[4];
        ...
      if(number.match(string,beg,end,REX_FORWARD,4)){
        // Get the sign
        sign=string.mid(beg[1],end[1]-beg[1]);
        // Get the mantissa
        mantissa=string.mid(beg[2],end[2]-beg[2]);
        // Get the exponent
        exponent=string.mid(beg[3],end[3]-beg[3]);
        }

      The syntax "(?: ... )" makes the enclosed expression a non-capturing one. Note that this also means we can make do with one less entry in the beg and end arrays, as we're getting one fewer return value.

      If the npar parameter is too small, then any capturing parentheses level greater than npar will behave as a non-capturing parenthesis (however, if back references are also used, a back reference to a capturing parenthesis greater than npar will cause the match to fail!).

      The example below determines if there is a floating point number at offset pos in the string:


      // Does string starting at pos match a floating point number?
      FXRex number("(-|\\+|)(\\d*\\.\\d*)(E(-|\\+|)\\d+)?",REX_NORMAL);
      FXString string;
      FXint pos;
        ...
      if(number.match(string,NULL,NULL,REX_FORWARD,1,pos,pos)){
        ...
        // YES
        ...
        }

      Since both starting and ending offsets are the same, the matcher makes only a single attempt at matching the pattern at the offset pos; it does not scan the whole subject string.

    Copyright © 1997-2005 Jeroen van der Zijp

    fox1.6-1.6.57/doc/screenshots.html000066400000000000000000000150041326741342000166300ustar00rootroot00000000000000 Screenshots Hall of Fame
    Screenshots Hall of Fame [Remove Frame]

    I.T. Infrastructure Management System

      I.T. Infrastructure Management System written by Jamey Cribbs using FOX and the FXRuby Ruby language bindings.

    CFD-VIEW

      CFD-VIEW is an interactive graphics program for post-processing numerical results from CFD and other analysis software. It provides an easy-to-use and interactive environment, with many graphics tools to visualize the flow physics, as well as the ability to extract data relevant to engineering design.

      It has been developed by CFD Research Corporation. CFDRC software has been used for design and analysis of a wide variety of industrial applications involving fluid flow, heat transfer, combustion, fluid-structure interaction and other associated physical phenomena.

    Side-by-Side Viewer

      The Side-by-Side Viewer is a tool developed by AcuSoft to allow easy exploration and examination of SEDRIS transmittals, as well as other formats, such as:

      • OpenFlight (FLT)
      • Performer Binary (PFB)
      • Compact Terrain Database (CTDB)
      • Digital Terrain Elevation Data (DTED)

      Side-by-Side also has the capability of displaying multiple databases simultaneously, simplifying the process of finding discrepancies amongst different formats of the same database.

      For more screenshots see: http://www.acusoft.com/products/sbs/gallery.html

    Arithmedrill

      Arithmedrill, written by Daniel P. Zepeda,is an attempt to make drilling basic math into an 8-year-old's head a bit more captivating, and therefore more effective. It is basically a game where the child must correctly answer an equation like '3+4' or '3x4' in a given amount of time to 'save' a planet, or other appropriately sized PNG graphic, from being devoured by the sun. Written in Ruby, FOX+FXRuby, this is a free, open source, cross-platform program that runs on Windows or Linux/Unix.

      The equations presented are the subset necessary for Japanese Arithmetic on a soroban. That is, nothing over 10 for addition and subtraction, and nothing over single digits for multiplication.

    X File Explorer

      X File Explorer (Xfe) is a filemanager for X. It is based on the popular, but discontinued, X Win Commander. Xfe is desktop independent and is written with the C++ Fox Toolkit. It looks similar to Windows Commander or MS-Explorer, and is very fast and simple. It features file associations, the ability to mount/umount devices, a directory tree for quickly changing directories, the ability to change file attributes, automatic registry saving, the ability to view/create/extract compressed archives, and much more.

    Goggles

    VORHour

      A timecard/hour registration program developed and used by VORtech. It is written using FOX and is connected via ODBC to a local MySQL Database

    Copyright © 1997-2005 Jeroen van der Zijp

    fox1.6-1.6.57/doc/screenshots/000077500000000000000000000000001326741342000157425ustar00rootroot00000000000000fox1.6-1.6.57/doc/screenshots/Makefile.am000066400000000000000000000024661326741342000200060ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in screenshotsdir = $(datadir)/doc/@PACKAGE@-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@/html/screenshots # Icons SCREENSHOTS_FILES = \ adie_colors.gif \ adie_edit.gif \ adie_font.gif \ adie.gif \ adie_sty.gif \ analysisview.png \ aqx_linux_visualizacao_peq.jpg \ arithmedrill-screenshot.png \ arithmedrill-screenshot_small.png \ boskalisday.gif \ boskalisnite.gif \ clview_icon.gif \ colordialog.png \ cometassay.jpg \ contact.gif \ dlgedit1.png \ dlgedit2.png \ dirdialog.png \ emso_screen.png \ emso_screen_small.jpg \ filedialog.png \ fontdialog.png \ foxcalc.jpg \ foxcalc_prefdialog_01_small.jpg \ foxcalc_prefdialog_02_small.jpg \ foxcalc_prefdialog_03_small.jpg \ glview.png \ goggles.png \ imagedebugger.gif \ pathfinder.png \ pdiary.jpg \ printdialog.png \ replacedialog.png \ SbSScreen1.jpg \ SbSScreen1_small.jpg \ scenegraphnavigator.gif \ scriptolutions.gif \ searchdialog.png \ iims1.png \ iims1_small.png \ iims2.png \ iims2_small.png \ iims3.png \ iims3_small.png \ rezound_thumb.gif \ table.png \ tmp_vision_snap.jpg \ tux_small.jpg \ udine_physics.jpg \ vorhour1.jpg \ vorhour1_small.jpg \ vorhour2.jpg \ vorhour2_small.jpg \ xfe.png \ xfe_small.png \ xtc.gif screenshots_DATA = $(SCREENSHOTS_FILES) EXTRA_DIST = $(screenshots_DATA) fox1.6-1.6.57/doc/screenshots/Makefile.in000066400000000000000000000366631326741342000200250ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/screenshots ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(screenshotsdir)" DATA = $(screenshots_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ screenshotsdir = $(datadir)/doc/@PACKAGE@-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@/html/screenshots # Icons SCREENSHOTS_FILES = \ adie_colors.gif \ adie_edit.gif \ adie_font.gif \ adie.gif \ adie_sty.gif \ analysisview.png \ aqx_linux_visualizacao_peq.jpg \ arithmedrill-screenshot.png \ arithmedrill-screenshot_small.png \ boskalisday.gif \ boskalisnite.gif \ clview_icon.gif \ colordialog.png \ cometassay.jpg \ contact.gif \ dlgedit1.png \ dlgedit2.png \ dirdialog.png \ emso_screen.png \ emso_screen_small.jpg \ filedialog.png \ fontdialog.png \ foxcalc.jpg \ foxcalc_prefdialog_01_small.jpg \ foxcalc_prefdialog_02_small.jpg \ foxcalc_prefdialog_03_small.jpg \ glview.png \ goggles.png \ imagedebugger.gif \ pathfinder.png \ pdiary.jpg \ printdialog.png \ replacedialog.png \ SbSScreen1.jpg \ SbSScreen1_small.jpg \ scenegraphnavigator.gif \ scriptolutions.gif \ searchdialog.png \ iims1.png \ iims1_small.png \ iims2.png \ iims2_small.png \ iims3.png \ iims3_small.png \ rezound_thumb.gif \ table.png \ tmp_vision_snap.jpg \ tux_small.jpg \ udine_physics.jpg \ vorhour1.jpg \ vorhour1_small.jpg \ vorhour2.jpg \ vorhour2_small.jpg \ xfe.png \ xfe_small.png \ xtc.gif screenshots_DATA = $(SCREENSHOTS_FILES) EXTRA_DIST = $(screenshots_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/screenshots/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/screenshots/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-screenshotsDATA: $(screenshots_DATA) @$(NORMAL_INSTALL) @list='$(screenshots_DATA)'; test -n "$(screenshotsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(screenshotsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(screenshotsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(screenshotsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(screenshotsdir)" || exit $$?; \ done uninstall-screenshotsDATA: @$(NORMAL_UNINSTALL) @list='$(screenshots_DATA)'; test -n "$(screenshotsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(screenshotsdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(screenshotsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-screenshotsDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-screenshotsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-screenshotsDATA install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-screenshotsDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fox1.6-1.6.57/doc/screenshots/SbSScreen1.jpg000066400000000000000000002502751326741342000203670ustar00rootroot00000000000000˙Ř˙ŕJFIFdd˙ěDucky˙îAdobedŔ˙Ű„   #%'%#//33//@@@@@@@@@@@@@@@&&0##0+.'''.+550055@@?@@@@@@@@@@@@˙Ŕ"˙ÄĽ !1AQq"’SÓa‘ˇ2RŇ#3s“łđ±áBbr˘˛ÂÁŃCŁ4T5e$”ÔU‚cDăt´ńd%6F!1QAaq‘ˇŃ"2Rrđ±ÁB3áb‚#ń’Ââ˙Ú ?ęííĽv1€úđď”Lź1Ő®eχó…ÔńľH¶nvǦ’ “Ľß%‰¦>ŕ§óq^lł0:ż0-/®a”i'pw…6óŰAmPÄÖ5Śps \ćĺ¦S¸Řšďâ˝Ó¬Ň>ÜĚďśąZó;ZĂóá"˘ÄS҉OůŮţDzÁŃ.gćHě„úËc«2¸P>gf ®%őÓŽĐÚö ¦ÍÚE“쉡m”sYÇ=ˇ´ŤłBŮ^ČüüŚy‘ن5¨8Ô‘§sM8Í~rE­=¬_çgůëD§üč˙"=`č–ŢÉŮV{?oYOY$šęâý‘Yq¶ßrsۋЕĺG,x‰ţT•±â/>Ą::|>rsۋДźĺG,x‰ţR•ˇâ.'GO‡ÎN{qw˙ĘňŁ”3žÜ]Żňü¸ĺ?ČOňă”yĘ"~>yĘ"ä"t©ĂćsŰ‹±řůć(x‰řńćlx‹‰Ň§™Ďn.żăDZâ)ütó¶g=¸şźŤždvÇŠ§ńłĚŽŘńW)Jt©ĂćsŰ‹©řŃćGlx©řŃćGlx«‰Ň§™Ďn.§ă'™±â§ă'™±â®b”éS‡Ěç·KńĚŽŘńTţ0y‘Ű*ć)N•8|Î{qtż<ĐíŹ?<ĐíŹs‘N•8|Î{qtż<ĐíŹ?<ĐíŹs”§Jś>g=¸ş‹hvÇŠ§ńSÍŘńW9Jt©ĂćsŰ‹ˇř©ć‡lx©řˇć‡lx«AĄN3žÜ]Ĺ4;ž*~(yˇÜńV‚”éS‡Ěę[‹{ń3͎犧ń3͎犴§Jś>gRÜ[߉lwî~Ą¬Ą:Tŕu-űÖĎ‚;ź©O[>î~Ą¬Ą:tŕu-ű֏‚;ź©:ŃđGső,ť:p:–âŘë'Áˇú“¬źv‡ęX§NśĄ¸łu“ŕŽĐýJzÁđGh~ĄJtéŔę[‹7X>íÔšóŕŽĐýK'NśĄ¸¶k/‚ŢŰU&źQć—+cŚ9ÜS@8;ËŰ;G˙Ş¸Š ääÖ˝¬ÍM4ĚEiU©µ'†ăc\MŤ–'0呎iˇˇˇnWź1úÇÍŰĆ~N•eđ[Űj¤Óę"|Ňĺlq‚ç;Šhä_ě}›µ6ĺÇ_‡]©·WĆ{išKśÝă›ŕ…§.ͲٍڰYGމֶď-Ěçq‹îZĽ“ Ě~±ó1W9Ů\úĆ× %XŐ´V+ÄX™Î׆wĺťľ÷9ď·.{ÉsÜdޤťÓÇ[2ěĎÎd×:y5nGžä;+ŰŢąµ“7×­B>Ę Ă˛3©ÓǬq’L—ąží.u$Äťő Ů_šă·ęĚ×6Ü‚Ó ghŽŽ®a”ILkŠőŇŢ[C®Ö?/VO6ĺŚçٰů·hYXđńQP-ăÓV’Ӏà î‘‚uíúÓČéÇxOń­·ü·ď#ńÔ˙ŤmżĺżyŽ˝â+îo§N;Ţükm-űČüu?ă{kůoŻŽ˝Ú'¸ż ť8ďxOń˝µü·×ŹÇSţ7¶ż–úńřëÝ,—^Fe€¸±®sv>3™†Ž‘­88pOq~:qŢńźă›kůoŻާüsl˙/őăń׹D÷áS§ď ţ9¶—úńřęÇ6Ďň˙^?{C4m™ĺdkžÖĐâֵƺ0/ "{‹đ©ÓŽ÷‡˙Ű?Ëýxüu?ă»cůŻŚ˝ş'¸ż ť8ďxŹńݱüż×ŹĆSţ=¶?—úńřËŮO4vđÉ<Ç,Q5Ď‘Ô&ŤhĚM:-®âąÍ«l­ÉJëb’;ÚÖ6ş7÷áS§ď!ţ=¶?—úěń”˙ŹmŹĺţ»»»Ńć~łf'ŚüšsE´ś˙#;"Ś 5¦,çgǨÚ˙ÍłÔŽ‘tY¶vňÇÍ9{çää]Úş×aÜÂçg!Żqpk™ĺú*wŃlíŻéW?@˘śŰsŽďđ¸ŮŹ‹}Ú}áđ.fŮl©:ćQ ¸.’C7W jfhŁĂŘęć#{•]7¶CŢ“A\ÎĘ4pŚëÁŞt a®ý5çć˛}äĆM“0–&°Fˡ>´˛A óq“;ßVşáťĽ4-ý‹bëMqË oËHĺęíă76gěÚ#¨ăW1Ą Ez>_z>[ş4ňűŃňÝŃ şĐŰ2E™ň2)"{$€ČöÇšHÎ}S^ňLŤa;Äé sËďGËwFž_z>[ş4pěţ˛ÁŐ%¶±˛Ţ;‰ t/7GÖLµlĹń—ĚÉź„Ëb=ŤwF1˛:>!W?$މÖňK-łHfFŕ鲴enŻ'®]ż/˝-Ýy}čůnčĐ`Ů°É ŁDĂ$˛:I¤Ž ätďtĹ•Ąůk»Ąm*y}čůnčÓËďGËwF“¶]h۸·PۉeÔrHĆŔŮA{^ćçiŐş:ěvĺAŇ~Ęą¸vşŹ’9 ®µ|·"3%Äó6mdÍ{ÉC˘«°ÄT5z?/˝-Ýy}čůnčĐq.6EëŮrĆ?ŠçM bŤĆ×:Ißß|—HÜ4ťVΰÜěkÇľőÍdݏ•·T—4 ŽFJŮ YňëÝ—3FWŃJF¶ľ€™†‘$ýÚNöjů™Jµ„¸Đ縓JčlGy6ăf–ßZşÚßXȲq§É c9’I\ýsgvśâˇĆ™Ľ&őÖlÜßrn…5łs}Éş—–Š/Äá‘Öěd“@Í či,2:9îflÖĎk˘‘ů¦Ž¨ˇ°OŁÖÍÍ÷&čS[5H „‚@”ŠC… kâÚ­†Mž.­ipë[f¶Ć3-.k%{ѬĎŮ©&Őe‡fޱń ă×^5ÖÎG3]«Ž&Â'Ź;Č—ŽY&´9ńŇęv5łs}ÉşÖÍÍ÷&čPrlö@¶fĘt–‚W[Ă’fśŹ|sżQĺłHí ŐV’@ h¦ŤX6%ŰbČöM­&s!|1‰śÉá’IXëpŮ^@c|Ž®q§ 2ĚK© KRhNSŽ„ÖÍÍ÷&čPsŮ`čö»f†ÜXÖĘČŤŤŹ#Yhć;XÁ^ů®n^řŠ|®˛Ă­››îMЦ¶noą7B×a“dޱ´Öň´ŃRÇ \â’ą¶×6·ĐşŇĂ0ąk„‘K-Ěw/„Ó)e¸ťônŚş›)âąÄvν¦„F1§~í$Ó›O/˝-Ý=5‘–ęx#°Ą×T‰°Íš7őiť%×–Ö˝ÂL]ÇĚĐ^t‘›{Í—w,w,ŠŰýSúŃ}ÝX5ńLÉ› łk\ńŕđ2ŕpm{Ţ_z>[ş4ňűŃňÝŃ äÜě’Ůć6°€ůmL·U­ĺ÷:G=ÇYW™Gą‰5.ěëŰlWg„%e®Ľ>Xe6ěl7 .ŐY†˛Ž/k]‰.8e÷Ľľô|·tiĺ÷Łĺ»ŁAα´–-§q9†‘ż=n&lfw9Ď­ŽHśI^‡HÁ˝EO/˝-Ýy}čůnčĐjmrŃf÷5ŚdöĎ{Ţ污¬ž'¸—< .(‚ÄÜÚÁł®`ą!Ő-d¬.ĘË‹7±ˇąÉ9-íéQ§-N%z_/˝-Ýy}čůnčĐpaŮ— ŹŹg¬¶l¬t°ĘŘ:ŐĐ •§^ć?S-ö¸p$ŐÔ.żás;i2ŕC,m…Đd6íeĽ,daĐąŮ_+qk¸±ś†´¨Ěâ»~_z>[ş4ňűŃňÝŃ óě›ÖزŢćŘľ*ÄçÇ·’LńÚŰÂëY˘Ę dĺh§«5žÉşdâxGâZë7u‚ZéµlŽŐ—V¤Ó‹ "¸ă¦¸÷|ľô|·tiĺ÷Łĺ»ŁAç­¶5äQ<9’ş\±‹¬î¬ş-’7Ë—TĐé3µŹťŔń¨{çłokukr/"łp·ň¬ŠĘ3_ eß'XŘ€/…î9]ňŇ]NÇ—ŢŹ–îŤ<ľô|·th8›/fÝ[ÜYşK~4PDÉĄśDý^Hy-dcĚŤăwÁĂ)ăGĘď*y}čůnčÓËďGËwF[k°É˛oXÚëyZ h©c†.qÉ\[¨¬nnYĚ˝ąđ˝Źg[8kmĺtleÄ’ ľ8Ţ1OËÁz?/˝-Ýy}čůnčĐy›ť›,Dç[˝öŮĂMĽ† ůK›G«„2‡ęÝ€ĂuÄ»{.ÝđG7‘ęĐÉ.x-¸ľI™Ňܱ—0Uís¸§vşj¶üľô|·tiĺ÷Łĺ»ŁAtTňűŃňÝѧ—ŢŹ–îŤŃSËďGËwFž_z>[ş4EO/˝-Ýy}čůnčĐ]<ľô|·tiĺ÷Łĺ»ŁAtTňűŃňÝѧ—ŢŹ–îŤŃSËďGËwFž_z>[ş4EO/˝-Ýy}čůnčĐ]<ľô|·tj€@Ś‚*wh?ý4SËďGËwFž_z>[ş4EO/˝-Ýy}čůnčĐ]<ľô|·tiĺ÷Łĺ»ŁAtTňűŃňÝѧ—ŢŹ–îŤŃSËďGËwFž_z>[ş4EO/˝-Ý€f # ŠťÚ˙MDTňűŃňÝѧ—ŢŹ–îŤŃSËďGËwFž_z>[ş4EŚČ" çv˙ÓSĺ÷Łĺ»ŁAtTňűŃňÝѧ—ŢŹ–îŤŃSËďGËwF Č" çv˙ÓA‘<ľô|·tiĺ÷Łĺ»ŁAtTňűŃňÝѧ—ŢŹ–îŤŃSËďGËwFž_z>[ş4EO/˝-Ýy}čůnčĐ]<ľô|·tiĺ÷Łĺ»ŁAtTňűŃňÝѧ—ŢŹ–îŤŃSËďGËwFž_z>[ş4EO/˝-Ýy}čůnčĐ]<ľô|·tiĺ÷Łĺ»ŁAtTňűŃňÝѧ—ŢŹ–îŤŃSËďGËwFž_z>[ş4EO/˝-Ýy}čůnčĐ]<ľô|·tiĺ÷Łĺ»ŁAtTňűŃňÝѧ—ŢŹ–îŤŃSËďGËwFž_z>[ş4EO/˝-Ýy}čůnčĐ]<ľô|·tiĺ÷Łĺ»ŁAtTňűŃňÝѧ—ŢŹ–îŤŃSËďGËwFž_z>[ş4EO/˝-Ýy}čůnčĐ]<ľô|·tiĺ÷Łĺ»ŁAtTňűŃňÝѧ—ŢŹ–Úţ•sô (Űż ąÍJä5ˇ$iß " ˸ć–ÚHŕŰĘŕÜ“5­yi¦+ÁoţŤ+VĆ;ČŁ·eôÂâčFýl­hh$ą†€04cĄoľąJÖ‚”Ą{ÓŁ6 \źőCč»vĽßk{+^ÖD#}K ĺ-%Ł˝qłLĂĄ›RŐĚkťť® Ý\†‡zą®Ę†Ţ[s$ń˛SÄk Ú[0mFýVĚX4!ż©|éő·¬ĚN'ŕôtb[Oí.’Ęj Mh‡ľ±Ü^6 ŕ€Ćůqź)fZ ‚§6g5kYťzăĆE”ÔČE4¦űúžĎ˙ë}˝ş7ťM:Ţcq˝ym1ż wHIrËX$19™źrXčß#C@kY“ĘPąÎiˇ şÚňŰÖăâep…ě®r3+†`ŚvĐ·iŢ\5ĚlŽ~W·ĺş®ŚŽÖU–ycć…Ď#C˛‚;i5ĽĚĚ[“˛˝±Ź&6f3Ĺٶ›¬[E=2ëX×ĺ­iR«W[vâůY#XÖ˝ěČńĹŁInßYlÚ ŁgŮ Rćц卍™őŤ‘ďk¤{\ĚÇ‹›Â*j×RŃ;rNw”šÄýі嬦kvHęěŐ-®S•ÎmExUˇ;Ż"†8Ů®0ŕŇa{ŢđŔXÆ=ŤŐ{gĚůČÓBf%ÄŚ´«Ză€5WźŤ9‹LăňÇÚrě›f<;[2čg¤ŹíµOíŕúgŮ˝Dşé#űmSűx>™öo]`ąuűä{!ą|-iď›nĐ\iÇě8 $vk€7j’oĺ}k†ŞŁ Ö­·ş’Č(kč¤ÖbÁúpůAqŇ×ŐťKÖŐ¬VżŚňořËWÓ§,LLćwýĘ[·h2V뮟+IµŃĆťöP¬Ż3 S©yc̲€ZOŇßáÇŢYßGô­ioS M%whőŢm3·gÂ"Ç˙-'łj—uů#&ŚC•µÇ(¨qò‘łk8oeˇÄy(1î-ą^–¦Ž­h@Đ{ ńy¦}đ+Ď?ö˙ő–;üĺXڤ[ë^dx”ŚĹˇ§߸ÜŹÄ$‘̆áń4;ľlq»Aq§°ŕ4|‘Ů®Ă{ř˝;˝›Ôk×˝¦µĚw řÎg~Ď#yT ˇ+Ž8j 0?%l[ćĘÝmŰĺi ş8Ú;lˇR<ćősśpŇŕ˛7ÎGô‚ójzÍH׍Ť>YšĆyc;]kŁY¤ß6Ěg·bÓ÷ĂŇÇí¬«?|=,~ŃŞËŇć‚h Ţ\۩ݴ.#”;V𠉫h8¦qbęűb;ŔédmĹ©đxŽiß#A $ľ×Hµa‡(Ą}E 8Ęf]"µÄíŽÇy;f7jŇ·ŮÂ8¬i.pá+˘«ă–9¦ŽĚ’5˝ľą°í]sžŢöR|ś{Íýťő]ŁóhÝA4퍑–BÖ¸ňᡠi¦ęčAŞG\Ůw踛Q•ą˝9ď'Ěď9 áăá-Nb±·iŁZÚóĚÖäÚ—Ńëx°;TĐă•Î9Ë«„~)ŠÜ˛»–y%†Qxxś\Ăź6Šďe\[˙ŠňVřFŃ䎊ćÂ.ź t¶PËwt2ÄŢ,\X<ßí;Ü•™Ëz”¬iĚÄDN#ü}]›+('Y&rňů"GŤsF pĎřm¦óýlž:äí ;Kť“në#™Ě˝…¬21Ż-l—±˛@3@ćŕwÔI{}ŮPIµ´2C ˝‘pkĄ·,Ź;ŮnŰwČŕÜĎÍ‘¬n^0Ł]^Ź+Żřm¦óýlž:~iĽ˙['ޏ——SÝZ=Ź»"(¤¶|µŤišŢ;%ög´°€Ć'íÉ$aąź¶L9íÍë4—vL˛/1k'µ›Ş6IÖ†‡µĹŇqš)¦”¦Őü6Óyţ¶OUö6´:Bć4–´M žC1~’â\'í-®Ý™˛ć–ö8şěb{ą]Łüęákä‚á•psśFZ’ ikFD»ľžs w÷bŢä]lí]CcmĂ\űY_(eĂ:ĹŽxŔŠdˇAßü6Óyţ¶O? ´Ţ­“Ç[hSđŰMçúŮ„nÉ'ްębŢw¬“Ç[bs€˝ń´ŤdN1ČÓ\ \ÝßqÁymŤ°vĚňM´¶Śó[Âďôń‰¤¤Űˇň Řŕîź›ß_dO%Ĺ%”ŐĆIŰ_šÉĺcF;Í-¨|Ä>Ťźd--ý.?Ks˙ěĚ·aóú6}‚—7vöŚ\;#\rBěhOÉyjl‹ëËĆ˝÷1ŰF:2ćf­iśšîhQ·÷ÚĆX:ÁĹćśWqĽ“š{ Ź%ͬ˘ Ö¸E%›-Ú-źAź+˙fâ÷:˛Ţk}ű"3ŤŮăäá©©5Ô߲±śnĎ.çjÓjő›é¬őaşśü|Ő®GwąE+UĐ^aßOu´¦/‘Ć76G¶2ňđß(ÚP0z˝+sW9ÎŮoFüôćÎ~éěĂÓGfYNV6›„’I  ’I4bNyË­ą´ăÚĹ ѱ̎6 ŻĘ\ĆČ5‡)ăôŔ–׾퍝¶˘ĽÚoë‘C#˛ĚŕZ×9­€ÔŹ)_)ٵ2~+´ĆfşXŰ–™łf‚††ăRkJn¬j_f+çzş™ŚWÎŹgM$öqË)Ě÷f© FâŕíË›č6‹šÉddRPĆ÷ZáŠîl›y­¶|0ΑˇÄ´»9hs‹šŇᤀhtđť'ŤµˇuţŃ’Ż·!ÝéwĆ]V‚{ Ţ&tâ6ó—^ź>ź,ďĺßśmrŮwµ Źú™®#÷řVfOµoőĐ ă#ű+łÚ%-p JkZî…¶ýVgP÷yÝ•×ŇzJëSžú–űfk4‰ÇäkjëRóIćĚOŐëŐ!óú6}®©‡Ńłě„}Ą‰tIŕ•Ä“óU‹dŚ0—0qqF\­ [?:çáÎ6§ÉĐő€;đÚaO›ľĽ^Ďą c€¶śyym0ި]ôôâc3·=á««13öňăm§9ď{űŘ/íúÍą%™‹1bÚođ­…ç-Í{˛ Y~Ü;E~N_ťî+Ń.z´ä¶"rÖŽŻRśŘĺţ»‡ĚCčŮöBŃşŰ0[ÝAłČƵҲĚŐ vg´Lth˘Ţ‡ĚCčŮöBózŢňËhťˇ.ŠbV´ŃŽkc‹+Ý f Ëď…‡WBMż8{µVeŃ@]%Hµkđ1;ë{fí(v„%ě%eĐ“RÂ~ťĂ»ĂP<ÜvíÚ%ŇÁ&¦CçZĽ| jb’M—u•Ěë0×#«F\FîůŽ,ĐwxhqAě•!óú6}®©‡Ńłě„—2H.ś×KŰG9ä†ú—âÁcdŰ8ÜÜÚÉs=ôĄwÝŔp¬W‘ČíŁbö´–3[ťŔVŠTî-Ěłs­őg¤Lłs­őg¤]b"""6D13ť®k¶Vi¦™Ž{L®$ŚÔN\«ŮŽt­Ž]fG\ '{}u˛Íη՞‘2Íη՞‘PŤ‚8Ůq ˘şh9™>ľ9bk]•Żiqo|Xj(×x+&YąÖúłŇ&YąÖúłŇ Ôşmě¬c M,Î ŤcófhÖ+CĄM¬R¶ŕ»Vř`k Cüő$ŠQˇî(Őµ–nuľ¬ô‰–nuľ¬ô‹§xľmŚc;<šćž^]„şé#űmSűx>™öoQ–nuľ¬ô0!ÚĆTh:ŞÓsś[d-[!{F|Ç1Tµ˛WCxôŔřB‹.{žyľ«˙¸™îyćúŻţâ Î×=¸śĂpŞ<jAé*4ţŃęŮîyćúŻţâ\4PJŔ*NnśOíµsYŚă1…‰ÄĵčŔ[SÁL(Vx¤`Ť€šŃ\ňś÷<ó}W˙q3ÜóÍő_ýĹŤ->ťyy¦Űs›-­Í9Ć<ş¸fu=[ŐK`ÖČ^Ńź1ÄŚU‹® ĘÂA¨ňZŽq3ÜóÍő_ýĹŃ–@úĐĺăÓľ(®Â ±Ň˝đÜ+&{žyľ«˙¸™îyćúŻţâóŰÓVÚ±«39‰‰ÇfÇHÔŻ.?|=,~ŃŞĘ…łS+jőž‘2Íη՞‘zÖ"˘›ëźe`bľ¸ž@ia'¤ĺŢĹoe›ťo«="e›ťo«=".gWT’<ůxĹąMpLłs­őg¤Lłs­őg¤DkŢlčnÎgU®ÝpÝTm§T°Ű76cĺéߪŰË7:ßVzDË7:ßVzE1 ĆĄ±3ŽÉK@k@€ s/ödóÍ3ălN±­.öe¨âÇi®+Ą–nuľ¬ô‰–nuľ¬ô‰1”ĄćłqäŮoÖůVkZ2— Xó~O ×»łěć·–i%dQ‰c†ąFLŐŔµľŰË7:ßVzDË7:ßVzDŠÄmjÚ¶´rÎ1ý}¶22+`ÉěĎ4ě9îpî±Ö đÂĺe›ťo«="e›ťo«="®nŻXĂ Ö đÂĺe›ťo«="e›ťo«="ŻXĂ Ö đÂĺe›ťo«="e›ťo«="ŻXĂ Ö đÂĺe›ťo«="F\CĂ%ŻËP2á•®ŃWxH:˝b 'XĂ ‘ąń±ćF‚öµÔŐ“LÂĽâ¶YąÖúłŇ ęő<0ťb .VYąÖúłŇ&YąÖúłŇ ęő<0ťb .VYąÖúłŇ&YąÖúłŇ Ó}ţŇ/qnĘ´“JÍl =r׹vÓ˝u´ggÉ YsŻ‘ŇŔŕ­{°l¤ču2Íη՞‘2Íη՞‘BŇX㵆7¸˛65Ăx†€TÜ;›ym§!đĚÇG#jEXń•¢‡A\ěłs­őg¤Lłs­őg¤AŐëxa:Ä\¬łs­őg¤Lłs­őg¤AŐëxa:Ä\¬łs­őg¤Lłs­őg¤A;ZöᲱ¶¶o»nZąě’&4÷ľVFšűËGŻmOú©}u·L·rÍη՞‘2Íη՞‘®Č‚{}ťW ŐËžg–׉&’FÔ°ą˝ë†ęÚ‡ĚCčŮöBe›ťo«="e›ťo«=" m§×ő ęÖç©“ĽŁąĚ4Ńyé6>ׇ:Ü4Ń äÔ0`kˇ„ę˛Íη՞‘2Íη՞‘sľ”^vÍĽ;u4+©?u­á±ÄŘ{6úŇíŇ\FXĂÚ s.{]ň Ţ]ĺLłs­őg¤Lłs­őg¤ZĄ"•ĺŤÍééĆťyk»ż˝ĺăŘ{G5ƲY+ęssuliĂ6ř+§±ö;íŢëëç:[É-kČ~¤6 3ůůBěwŞxÎwW,Üë}Yé,Üë}Y鮝k9ŚüRšU¬ć3>+Ż9vý§e¶ç˝ł‚Y+”7+\XF¬4ÖW Ë7:ßVzDË7:ßVzE«F{p뇖ąŮ—’0Ý,ÓĘsş3šááT‘¦şXu[OůiŤE Ő:żőůfç[ęĎH™fç[ęĎHĄkjZm§{Rg/o‹Ď­é´őgšŃ‹qŽŐŐ!óú6}™fç[ęĎH™fç[ęĎH´îł†f–čoEćŮůBXĆÚí #€’f˙ăM+Ńe›ťo«="e›ťo«="Őm5Ü–¬Nöźfë+QnéźpCśíd”ŻaŔ¶U2Íη՞‘2Íη՞‘fg;T‡ĚCčŮöBM 3Ćbž6Ë©™ŹÍ45˛™fç[ęĎH™fç[ęĎHÎË—Đ=ě´1> 5ošG¶C€®}\T覆ˇü·h oşy¸|nÎ[@ŘÜErÔqťA˝› W,Üë}Yé,Üë}Yéęů}>ČLłs­őg¤Lłs­őg¤A©sfé.ť1¶‚宍ŚăBÂÇHM<”šsŽŇ,n#·†3u$f8ŘÂŘÄe•kCM3Ä]ąş¶˛Íη՞‘2Íη՞‘f+i´o¶3đ\ěÇ;đé3o›¬kşÍ|®]vş”ŐiËĹď—QS,Üë}Yé,Üë}Y鵊çí<Óă$ÎWELłs­őg¤Lłs­őg¤ZEŃS,Üë}Yé,Üë}Yé]2Íη՞‘2Íη՞‘ŃS,Üë}Yé,Üë}Yé]2Íη՞‘2Íη՞‘ŃS,Üë}Yé,Üë}Yé]2Íη՞‘2Íη՞‘ŃS,Üë}Yé,Üë}Yé]2Íη՞‘2Íη՞‘ŃS,Üë}Yé,Üë}Yé]2Íη՞‘2Íη՞‘ŃS,Üë}Yé,Üë}Yé]2Íη՞‘2Íη՞‘ŃS,Üë}Yé,Üë}Yé]2Íη՞‘2Íη՞‘ŃS,Üë}Yé,Üë}Yé]2Íη՞‘2Íη՞‘ŃS,Üë}Yé,Üë}Yé]2Íη՞‘2Íη՞‘ŃS,Üë}Yé,Üë}YéjmŻéW?@˘®Ő%Űäş„ĺx$ +ËtTď" é|ô<'Ů=S#_3óf!­esš1/ŻzFňĽľz잡ľz_ŁĂ"¦-çzÉň ĘÉęçĄú1ü2 ČÝŕý!sd˝»Ť÷““µ˛uGkÁ&qgË^>.4ĄEj:MĐîŇ“¶s4Żt˛§p|ÖüM[Čkcljž”`¨ÍC»!uŃšDŰźĺíŚöĆqߌ¤°_mmťqiÖb‰ďŚ9Ěps™š…Ś~°`7Zg\—[Z8â’î7B%ÍV˝ń00Š’5Ľm5Ł3ĹpI6LşŹ’CošGőj´Gšf˝’ÁşĚuŽ=öęO˛ÄńąŹą:XĚ3Č5YĄŽ®Ł]䲊gwzf«¬{o˛'˙9Ű™úqíŰÜ›v˘ĘýďvŞáŹóĎS™«’L¬®ÍşŃŁNý#ŰÖR0–és˛6Ä×ÄâçI°˛C9p8v[\ź„Ŕěí–I%Εâ†5ÓçÎAcZý8bă§Ě.Ö—ÝĚ÷LÖÇ#śŘMcf~&]NZa® 3é¦mI2śěu(eu)CŽ5Ył-¤C&gF$–RÚÓ1śJŇE0ň¦”ě-^}4ÄĚDÄÚÖÝť‘Ůłĺżrmb‡mÚÎŇ!k¤›0kac˘{ś\áG˛GF0ŤÇ ‘ZIů‚Ć ÝptNăk÷F×F÷ÄIN?ŽÂ<DZ­ĺŮ’qçdňMyÄŐI#ŁŹ&McpÉ›ŢĘý,>ö”¶ŮNŽ1žâFĚüÝaŃ–Ť`|Ź›)v@FS#†fd;¸aMcŇţ]™ŤśÓťßwgăĂfţăîlŰ]˛ëY‘Źkb{Ł.x sç1ŮqǽӣúĎłź« ­6\Ůo4V€V(™îÇ+[Z¸î •Ó‚@ÂĆA{ä5ß•î‘Ý×.~ΗíQ šÉ:áĘç´˝ŁÉAZ´9ź óO'Sd}śÝĽ±m—Ć!.ę€N$s%7T„‹A&§ó…7oÄnéÝ, m˝ˇâFČ\ćů6Jç5†6ćksďÖ\ ťvËwÄbáŮőĄŃ8Ćs[Ĺh”ĐB4¸î©ü:áÎÇ[Ýn#le®w“dNk^dvV»&őhp5Ĺz'ÚěüĎçśóvăą>äĂ´%|­BÖC,ŇŰÄöĽąĺđ™1s "#ˇÇqb;^VÂ×Ë0ąŇKi',‡Č»VA”Ĺß9ŐĘܸ€MwX6\Vňő˛¶äÉ#¤”0VHćČčߎ4†¸Sz­(-6„ę㸄¸É$Žs qUĆJ'ă»˝ďĚúlÎ"¸Ěl·WĎ«Ö ;Î5 KMtŕiMÚž—8­ď1Űß·fîÄű¸2õlfÉ«{©%2G#Ţ^Ń@ý 'ľ8 •®Ýą˘|š§;# cdsŮÄ'3]«#]iÓ@ŞĽ{'$qÇ­®®;Hë—OSË^űĺÖťŽĘ¬;!đŰővĚ ) ęYŽşÜDÖ;żď¤Uştń–˘=$Lí´Ç5qśîŮ™Ůîm›ČřŘěí2†–ąŃ˝­ă`Đç–ĺk‰Ă+5Áj?jľ-źctń}Řfc$š_Ą'1küźdľ{†Nů"sĂâ‘Ďt9¤i±Ĺ°ĽÉäŘěş1ŇěqY?•–¶PĂ3[%Ž\Ż{ šě±:V‡¶•Í]*DzhŠćÜÓ?”Nc'¶#Ž «Aµmd 8G)a‘Í5-‚ń­ łăL2čĚHďídsXć˝îČÖ=ŹŤőĘçŽ,Ťiˇ v:0#JÁÉ`eË$¸]Äc—(ËB÷Í#ÜÚć¦3ZSIQ.ĘuÎwÝĘ×ĘüŤ%Ś,f­šĆąąLŽ5{&{k›t*šúi›bÖ˙^ÝýŘÝ ÷3ţ%g‘Ż.dr1­cÜç6\Ĺ™XÖ—†8Đ €*Tőű]ccĚŕçeıá­/µŹqnV8Ôq\AÄaZňě–ťqŚÇšYÚdcź«gń2Ȭ‘îŁ57*Ý‹.[6fHAŤÎ–h›%ÁtMkYť˘ąxµ­H"˘Ž_K·ďĽlŮăł~ĎîbŰV÷—of·~˛# ¨ú oĐďŤ ®Âăíh:·ĺ‹‹lŮő6şĽÔĄr46´Çyv ňó[“<ąűsż ""Č""" "" ~Üz7ý¨Ň=2úOą~Üz7ý¨Ň=2úOą>bFϲä1Ń„5ůNRáSB@"˝µH|Ä>Ťźd+稥2;'őúČ9FĆôN۸â‚7‰DŽ·lŽ¸ä™ŹĽEß»Z+Äů:w·­`|ZŮ$#[pýd˝ëNVĆÚâhÖ wN4Â.·Öµă9v~±ş!Ç; ćĚZ‰FwćqăR>®ű8vL…ÝšÓqOá3=Ąäę'ĚŔŮĺ™Á€IζaPC&v@¨I:]ýŢ·ë~;ÎXr$ŘĎĚ_««‘¦őŹ‹É5˛ŃšČ†fetî¦\2†·|¬ö;ŞÎéÜÖčšÁB繤É4Ň ňUƦAŤq"´ĐE›zť[Vk3˛qđ1k˙˙a˙Ă›ÚÂşK­b}Čş%Í™¬15Í#8‡8QŔŚKGk…dŐžvO©Ń®*ş*jĎ;'ÔčÓVyŮ>§F‚č©«<ěźSŁMYçdúť ˘¦¬ó˛}NŤ5gť“ęth.ŠšłÎÉő:4ŐžvO©Ń ş*jĎ;'ÔčÓVyŮ>§F‚č©«<ěźSŁMYçdúť ˘¦¬ó˛}NŤ5gť“ęth.ŠšłÎÉő:4ŐžvO©Ń ş*jĎ;'ÔčÓVyŮ>§F‚č©«<ěźSŁMYçdúť ˘¦¬ó˛}NŤ5gť“ęth.ŠšłÎÉő:4ŐžvO©Ń ş*jĎ;'ÔčÓVyŮ>§F‚č©«<ěźSŁMYçdúť ˘¦¬ó˛}NŤ5gť“ęth.ŠšłÎÉő:4ŐžvO©Ń ş*jĎ;'ÔčÓVyŮ>§F‚č©«<ěźSŁMYçdúť ˘¦¬ó˛}NŤ5gť“ęth.ŠšłÎÉő:4ŐžvO©Ń ş*jĎ;'ÔčÓVyŮ>§F‚č©«<ěźSŁMYçdúť ˘¦¬ó˛}NŤ5gť“ęth.ŠšłÎÉő:4ŐžvO©Ń ş*jĎ;'ÔčÓVyŮ>§F‚č©«<ěźSŁMYçdúť ˘¦¬ó˛}NŤ5gť“ęth.ŠšłÎÉő:4ŐžvO©Ń ş*jĎ;'ÔčÓVyŮ>§F‚č©«<ěźSŁMYçdúť ˘¦¬ó˛}NŤ5gť“ęth.ŠšłÎÉő:4ŐžvO©Ń ş*jĎ;'ÔčÓVyŮ>§F‚č©«<ěźSŁMYçdúť ˘¦¬ó˛}NŤ5gť“ęth.ŠšłÎÉő:4ŐžvO©Ń ş,35Ě…ďl˛fkIÉJôw 8 ›µ?Ł\đI퉵?Ł\đIí7ĺóĐđźdő óŇýţËçˇá>ÉęçĄú1ü2 ˝NÂ|m<‘Ť=Âş=RßŔîźÖ໬ô‘{V. =RßŔîźÖ¨űXCŁŁM ¸Ô'FWiŔîđpAWĹ…hňtVśW|ÓNçá őKşZÖqłĚ! y-d¤qs4І:ĽmăďîőÉtr’ŕ.îí(ůk01ě5‘îÍ%´§w nĹ ¤ĚFŇZIći«NRuµ6źm-» µ36g†9Ő4;¦Ľ\*jx7VÝ«Äv®’@XĐů^si‘î®R+ˇqdľµÖĆn_¶âAˇŃfŐÉ•Ťqńf讞MóË·ŘŤřŤç,ŰdgáÜîőKşZuKşZÓŘ×Ń\Ç$ż?VČÖ».Rč‹xŹŇîřµÝťđv˝zĹľż¬u ’ëz¦»Yݬzšő?+—.łćďă•jbbf&10‘11ś·$‚Î(Ý,´dlĎ{śZÖµ˘¤’N*±–jőncőĚÖE•őĎËÇm-ă Fř^W˙ň[+˙‘|ůög˙ŮŚD]eę.ť$Žúm'ĺÄÜş·ż¶ÚÖŢ)ş­Ľ2:9˘k¨Ű[‹›GKĘQědr†6>0fLĽe躥żÝ?­`‚ ¨"ą·Ěa™‚HÜ×És^3‡e«t×t.@×gţ˝ř6yu:×Y®K}^}_ú¬ąőýţ72-]—×ŤÖ –Iŕ1ÇfŘ Îćę[ :ŕ÷‰™lÓ›X±†AňqČz^ˇo˙łÖÉă§P·˙ŮëdńÖĘ Öę˙ű=lž:u ýž¶Ol˘ nˇo˙łÖÉă§P·˙ŮëdńÖĘ Öę˙ű=lž:u ýž¶Ol˘ nˇo˙łÖÉă§P·˙ŮëdńÖĘ Öę˙ű=lž:u ýž¶Ol˘ nˇo˙łÖÉă§P·˙ŮëdńÖĘ Öę˙ű=lž:u ýž¶Ol˘ nˇo˙łÖÉă§P·˙ŮëdńÖĘ Öę˙ű=lž:u ýž¶Ol˘ nˇo˙łÖÉă§P·˙ŮëdńÖĘ Öę˙ű=lž:Őą¶Š7ń]( dÝ®űŽňé®vÔ{XéD.{h×աþă78#ČAŞŃ‹šŮ$qaĘđ&q-4ˇÇB ŇŘ÷ÜŔe™ĹĎ&FÔăĹeĹĂ1ŢhjlÍ‹łö]Űî ż™ďšşćË,nl¤ÔŐü@IÖµŻl¬űřOü¦˙ö®Ptżn=ţÔi™}'ÜŤ?n=ţÔi™}'ÜŤ1ŁgŮ ™}'ÜŤ!óú6}‘é—Ň}ČĐkË}´Yµ›h- ¬Ţî¸ŮpfQŢş<şsP tc¸iž]nq%ĹŤ$śI$+Čę=ŔSHßqĹÔĐ4-î§µ˛†H }Çf ĄFp©3É ›Fó©Ű:qN- ¨$R¸č˘ŮcÚÜC…A\™¶”Z‰Ą:¶9®4Ô;&[†8Ł6´P2Ţ&±Î|ŚBĆ—9‚fŢ÷×*ëfÓ¶&b#dçâé4Ůíívľ`x ÔoÔoẲFâö5äćĘt…ĎŮ÷7r>Qr’ 8Í#ľ%ÎŁ†:—Ý‚çęŻzEf“ŤůŹ,.•bsŰ7˘ŠwH:j¬ŮI~W =é —cµ¤žú[I!,`®W0Ç\Kxd‚ýŚuKxŮNřˇWŇÖú¶Ľ[W’tëĎťĽńgkź¬ĽúyŇŽ—4jÚ)6‰ü9·eŐPH§4•+™´¦2DřÚüŤ‡çtÂôLÄoZRלUť›B)ŹaŚ9AÝqßylĆňřÚň)V‹Ĺ¶ęę;Ö[™ő Ś ‚ňöVÁí‚1& ‡es¬ju-3njLf˝ËnX¬F1xśY•­.phŇp ;írŽůbŤŮ^ Ë=ĂrŇĽc .>ŻÔN”lß1łż¸ĄrÁٶÖĎ„ľHçÉW9 žýŰĄI55Z—nq°Šś˘âáŃ<Ť9 äs‡ľEč›ňéóÚ1ŠóL3™Äq$»±ÍKk!p+”=¬hkŽó0«˝ŕŻosłĺ‘±MjŘ$y!ěnW¸7{f9đM­ăÎńXŮ ¤f"ż'˝Ň±Ë»Ža3hé\ěíŃ•íâaJč˧ß_>=uâ‘«;¦üłN]ţ\]ú1™ŻÎsţφ™äÖTŠĺV•ŢZóË©·–jfŐF÷ĺ­+‘ĄÔ®;ĘÖł>}ź˛yÇ4g;î±O-©ŽH¦{rą®lŚÍ‰ip¦ť éDÄÄLvĆaçÝ8`·˝ş”E#íK!›%ÓMeM4î­ĺ˘Ö›X-Ű+śŘŁsŚą™šŘČ-Ç/@ÍNÍ+»¸Ç˛A™Ž*ÓQ_ycO©‰ęrç;9x5n_őI! ¸ŕ’±ëŞÇ:&:RĚh¦;Üj «‡RxĂŤG;±Pá+ť-íÄ\MnˇÎďťšŽ{”ŤMi­ąk‹ZDĆeŃ©lAňŃ„6ŻÔ7*˘'™#-,ÍM+÷Ć+“q¶ŕšŘĆöąŽ‘şŇńÝ[ű6WKc ŢâçeĄ]§ŠrŠö”ĐľĄ¦yţńXĂÎÚ/şl‚V€öË+P2FňŔMIĹo5Ů—cź-(˙ŰqíśşĆâ(ť•…ŠëŰÜ[NÓJÂÍ"4âݲŘV·µžâ-h•ŚĎĄ…Ýë‹tçËV+ˇ,®ŤŁšWŢŞµÉşfĚ‚[k©-ťÖ™„m‰ÁÍží°şşčäĹ­qĄ=úŻMo[g–sË<łâç5šă1ŚĆ~ ßĂ®9özłŇ'á×ű=Yé6íIb7±><ĚŮůbë2Ľq3˘†HÚ dćq’‡+tĺČ×FáµŰ׎öö€_&˛9ź$1†Ä!q!Ň[ëjEĂ(~V4»HÚü:ăźg«="~qĎłŐž‘rNÓ»}”ń@K§‚ü5Ď’GFN}§ŞŽ!Ĺsµe€´ş™Gz3QÁ»ÓmÉâŤěęěuô3jĄ·kć”PFÉ‹ă0[I#š¬Ú4®ŚÁ±řuÇ>ĎVzDü:ăźg«="ć읥%öÚ2˛I:¬ńË,PĽš5®eČʶĄ Ťk»g}z$˙Ă®9özłŇ'á×ű=YéAsd±¸c őě4ÜŐž‘k囝o«="ęÜy‡đ/¶v§ć‹ říím ą‚ĺŮmžú×NI<­č¦;ŕh\ą»A–NŁóŔůóĺ¦GĆŔ;çVąÖŇĺ[‹‘¶múŮc®:ŚÚĂ-Žşč0nbMw±ˇuP+źáĺúřg÷îá+ Ďđňý| 3ű÷p”Ý©ýç‚OhäM©ýç‚OhäAż/ž‡„ű'¨ož—čÇđȦ_= öOPß=/ŃŹá‘·Yé"ö¬]…ÇÝg¤‹Ú±v9_ŁÉŃZq]óM;ś;‡"Ç «â´y:+N+ľi§s‡p†EŽAWĹ…hňtVśW|ÓNçáȱČ*ř°­NŠÓŠďšiÜáÜ!‘hşM•ŠŐŘ"yČŢ(Ő:Ž$´Ĺ5ŕý yp.¤ľ×Ű KŰ{xăąśÎÉEH¬ ĎĄÄY›W6Ť¦š:´AÚ¶ÁĄöÁ’¸˝ÎŽ”{Ď|â[¤á‰Z;bkmíŻlĹë&1ě4?˝«ZŕF` ;UmY=ťYŇf5“;5p¦±ćµ\ÇݶI#|ĎkLďŚ3HÍSĂ[Äp 5;»ü oŮ·ŔÄÎçq–ĚĽmÄNŹXŮ$·-cÜ 9ř çăŤhtÂV Żv`¸·Š[ĎĂ­$d®}ß’o•aŚG{†˝śfąîĄ*rá€+S‰ŚOxę"ńwVňëeJË›ťk§ŮŽĂnav\ÖZ×Éyf¶<ĎwĚv^ôß•±<ňěíˇĎŤÚłco#c–€ęě'ą˛ceÇ3Fˇí«ëćóż őбɱ¶XśŔsŇ×5 ‚4‚ĽčÚ’ĄÚzťš(‹ky®,e»Ícă0şYG ů?šęéě}Ł´€Ů¶íž˘d6QĹj÷ŇIá|0şI[·|ʎsŔ{dkF^0Ł]PőÎ’69Ť{]!Ë$çPľŤß9ZOĽ¬ąíămçëghΫ\+¬‘ýg/…ŢC_ ±ćłgÉs¶ŻćŽčŻ qż$ő–68-dtLhŹ˝{jÓĺvAD«$‘ĹĄ•Á‘°=î!­kZ*I'@ ÇÜm[«Énn@‚CÓš$ŠK‹ÁyjN¶6ŔÁ ŤŹqxÉL¸ž)͵µ/D¶[R6Źyi(´·¬#®BmťcĽÎę˝ĎĆ2ĹŃAęrc—jAwqe ĹűŁŽ îžŘÎťŽ­ŕ- j[A“tń´Çžâě;hęÝűRa} #‰ŽöŃ0LëgćlŽpŚęăĘĆ‚çµŐ.5pzä\=ť>Ë·Ľş“gşěÇ2Ň6P jYf‰ŔjxąÎh·i–¸QjŮ˙cŁ7FęäO@¬ ň>ćZć|ŚŐ´± V.1Ę3¦UŽH卲ÄŕřŢöćą®¤Ëüł-´›1ÂÖQ4qÝ]´ÔĆFĐdkYZĆ5­ą¸k@këĹe˙Ů^ ßîn:_wĂšŢŇ 7u{v–ÄÖsžjů%{Žg’MIßA—öăŃżíF‘é—Ň}ČÓöăŃżíF‘é—Ň}ČĐ!óú6}‘é—Ň}ČŇ1ŁgŮ ™}'ÜŤĄ¨{«P*)R;ţĆ%c¶ţ/ ßK›1{ž×0f>&•Ŕśo©Ťš¸ŘĘ×+CkŔ(Sj"¶t†çĐÜ­&•[đch$ľ@sÝß”€tâĄf+i·ěł9ŽĺŰŘĂi4Ž -d®š—6ŢUt®˘Ś­Ą((±­§kâ"qrŐ-ľňľ2 0`Ggu^'˛RŇŕ5Ť˙ř$vÄQ QŤĂFNF ŃQŁ …=$ÖŐžoĆŮúů·mX´LcI­âęé§Ť]ĺĎÚ2Iś_¦l\Ňw{ ¦‹×1˝ŠjZ“šą6ÖQěřÄ’ ×4ϧ(> ę4QŁpŇt© "ŞR# ksmťý˛Św4®$“ŢÉ´ŮnŽÎúVµÓŠî(RÔ­±ÍnYĚgŠDĚnJÂűgÜXR: Ł•ňBNŚí‘ř 2´O3 Š“‰Ýq.;ť•mXµfłşc‘8ś´`ż`š7‘–h\u°<†=µk›ň´Š•GÜşS$6Ŕ>ćWĽ†´ć‡¸śĎpŔ čJ-禺KMŔwÂŁtP·$Q66ř-Ł´ńG ŚE&ůÓ­ůůq·>.ÝmąÇÝ1Ś‚ŰÚĹ;ŘŔh;ôŞóW6R‹ë‡I Ü×»3ĆąŔôô˛KśR”ĆŞ‹Ů5Ścvł·.<–Ň> řÜč˘y¶ŽĚÖ†ń{íĺ»o źý4nc ˛­{A Ś˝ř•¶‹3ĄJęfßlc‹ÍöÍqX®€6ŇTT4Sčšź-iŮě,.•¶öR–$q=Á¤I®ŽĹVŃ‚¨8TjŘXcĘ2;ľm0]DeÖ]žčŢŘŮk%ą®i=h ë{ŁŤĹçě]­´…­„0Űco•´˛;VĐ]40;6±ó±Í#\(ŃłRŐw=3ŕ‰ňÇ;›ĺaÍ«x$(ćšiiŔĐáPEĎóűqĚ“Ů[Ç$-ÜÖ\ľhÜňĘkaŁHĐńşąá·łm›ÍCn3Cw[9›ý,pm¤š#—9®}¨ńś F—şŰ[J|‘Ĺ䡻|lűĽ™‹­ÚÇĆk.^÷µěśW0ŚÓ cĹŘÚłßĎł6Ěn’ ťĽĐNŃłË!´lĹěv¶‘¶˛”‡hď±Ŕ=.[/ö„ZO_š&C(uŁ[c3hYs=8¦9ńÍŢáUËąÚ—đ[ßm W?Ż[XČÉśŕÇZ ÜĚÖ®`ŚanIysťSLhĐô“Aů5­Ě#x‘­$Ó;{ŇFC®C¤˛.]ˇe–Ńş´3?«6YŻ•ň‘,ňO“ąÎăd` ­+ TšóŰ=ĂnĹÔ·/‚Ţ{‹»ste&‚ÜńM´ ŰÄŘő5 —e›Ç}Ň,pA´M†ĺckARI$ćsśçTąÎ&¤śIÄâ´öTG­›k.^Ż Ăä–QLŮĄs§sžÜőŚž(4sśĐŮ>LŢŮ·ĚŮÜŕ rEČfđk Ą­CCFâ‚" """ """ -Kż8>Źé>ďv;kRďÎŁúO»Ý`÷{˝ß˙ďFϵ"Ďî÷{ľ<ţ%ŢŤźjDűqčßöŁHôËé>äiűqčßöŁHôËé>ähů}>ČHôËé>äi‡Ńłě„ŹLľ“îF‚“\Z[EŻĽźT×Ë#äťŃ6ˇîŁE\€Ą’C)ňNsX×µâiZGhÁEŵ˝Ő“íîŮ ‘ňµěvYM=úč¦*¬ÔŔ÷†1DŔZÖ°Ľ`0Ŕ6FŤ×úŮwÉlȲjśćIśJĆ–ĺ-5ŞČÝ÷úÉŮΆG—ڎŐŔJö7*–™ťąĚĎlłŚF+ Řv>Ëąb´„Vlç=đµ­`Ťďu\ćĺhbłIgi,Ž–X#|ŹŚŔ÷ąŤsťŤLd‘‹Nö…ł™âp-‘´°‚ÜŻĘG…bĽĽ¸ŠâKHY5ÄĚ’P%ĹŽ#]ĆlrśŐ•´wńß*ÎŮ{1öĚł}śµŚćŽ mv8µ”ĘöŐ›łě,S¶ÚÍnÁÚ`ÇR­m Ŕ.Çć[‰6|˛Ă-ë\ÂéžDŽŰu‘ŐčrNÖTÂŐ´¦lźŚÝŰO´ç[V†ľš(IqĚC°#ŚHéC@‘Ŕ5Ď ĚZŇKA;Ă1§ XŰghË—Ţ2Űu Ë$áŤ9¸`çÓ1QÚ\™˙0>(úÜÖďŠÖ+‹IcŘçJ-#»sÝ”·˝:N3Noš8ö‡hÝA´î˙ڱ˘ ]\6şëĆ‚÷ÝUůY\ŇrPńw(7†É°dL‚Yofeá­ŤŹ’2ÂŕÖî9­vď@8TŽŮö–YÝm ¦¸aŽy m/’2,{©W6€`Wm»uw׏d‘˛1w“"u´’Ú ]‰cŚůގç­§ľŁťŇ±}ÄW÷63Nű¦Ĺ ˛YC•™Ó±Íň,ŤąF¨Ĺ®' ‹Mźaeź©[Cm¬¦}LmŹ6ZÓ6@+J«ZZÇi†2\*çąî¦gľG$y ®s‰ŔĽ\xݶ”—Ŕ6RŘçžâÚ7=‘şŇ°‰˛šĚ·ƸůČaŁňśX·¶Sî­yť÷Vg/V¸”1˛HxŮÜÝK#i‹˝ČrÔńŽ-,(:´v\’RęŇG ”ćČâKśÇ2;Á&¤–6PĘ’K˛ć8•Ľ€€€µ.üŕú?¤ű˝Ří­Kż8>Źé>ďv!Ýî÷|xüK˝>Ô‹?»Ýîřđ?ř—z6}©GíÇŁÚŤ#Ó/¤ű‘§íÇŁÚŤ#Ó/¤ű‘ Cć!ôlű!#Ó/¤ű‘¤>bFϲ=2úOą ępŻś—E9ÓľµĄŚÍÖ˘i’"ŔkT™F•˛a¦vS®‰IXŰ^±%MxŚ?YűÉ;vtń›«HfkČ+nNVĽ¶Ě~ńm®<›jŮŃ M´6áł@Z(Ç4ż)c›ĹŁłîo-©l¤t°<Ă#űúć?é0ŕ¨,ŕ[<ŮŁ:cŤ‚ ď¤A$öׂşôĄôkµ/‹Lămű;]¦ô™‹Îsž XńőÓÄšBc>X3{ä†k{—_‹ĆÂÓ©s"cM+$o¦yłWweŃś~Ó‹ĐkZÖ†´µ˘€ p)^Í-8ÓĄiër´óLĎ:Xőv±7U©®ĐŮ3g®kć;=~}sSr´] »K»ëć4Ĺ5¨ŹXÇݲfĚOŽXŘëvć%“ÖFśú°EÜĺ˝ö+«qs«;˘!ńČŮ—3_Ű+Î×7ľhŇu{KţÖç‘k˙m?ş€Čk=ÍĽWŚš8˘|Vňş&ŮőPbużW !ΡÍY†ž6ÁnŐŐEiug=Őť÷¶9!sŢ×HýUĽîšf#‹.zkĹąłĆŻiÚÜň-ă&ŻiÚÜň-ă Ű|Wsí[yM»âĎy|ΑŻńJÖjŁÍVËW¶®Ő´Ó3s–÷ÜżĚP]Ëaw{qi0Ölę[ĚÖuyZŮź ¸-’-sq”qĆŁFn6ÎŻiÚÜň-ă,ww·6ňŰO´î_ Ětr7-°«2¸T[  ¬¶yö¬Y*ĆDüﮉrĂ…| ĄíăňU%ŹWkuZší“6zćľcł×ç×57+EŃXn­ĹĚ:¬î‡Ç#df\Í|Ol¬#;\ŢůŁHA/ŮW–{PíWÍt57’čZ4¦Gs~Wd $śˇŤ Ŕšý¨ËwÉŤÇ]ťěmÍĂŤ®łWGšŔΰöł˝k\ě3g:Ăź55{KţÖç‘k˙5{KţÖç‘k˙.,.ťÜVÖ2FÍŁf,Ú׾"č$ąÍ-õ®ĚŻ.a{Ź‘›Nk Ű[ţ#&cMĹĚ×:löŇĂ;Ą•‘Ĺ ‘Ů^öTęŰŢ»ŚkƦŻiÚÜň-ă&ŻiÚÜň-ă ŹĚr]Ͱg×ŮL3Z>Wę'hÔK«~vMI"ÎĆ×äçĆ­ŔW]ćéŰM®’ŇWÁ čŚu7<Ď•Ż«qhŁjm9¨2ÜYŢÜŰËm>Óą|31ŃČܶ¬xĘáQn‚·sĄŹWkuZší“6zćľcł×ç×57+EÔu«îvĄüw6Ď67V‘[™K&S9‘Ł$šÁQ=+A ö+­un.aŐgtD>9#2ćkâ{eaÚć÷ÍB®ŻiÚÜň-ă ÄvVŃ{Íüýb|ω®·{ŕŽđE .2KlaŤŽ2O^+ë¸ć1ˇŮw±B ´Ěľ‘Ź÷\e“,ŇÁ×#Öµ˛ęő ąÔ”¸ç®m/Ë«Ú_ö·<‹_řÉ«Ú_ö·<‹_řČ7vŚ2]0ëlä•¶Ó‡A¨¸0Ě沙cs_tŽakž0©Çuď™sĺM Ű˘u‚Öč´=ŮŢŘËd11î©ĚćÇ•®55 ńť¤âŐí/ű[žEŻüeŽâÎöćŢ[iöťËᙎŽFĺ¶cĆW ‹pt»"K¶ł©.şă7Vk'|lúxănf6FłżiaÂϴăɲöõZ˝dR»>lÚßôínz|ž÷-;Ý]EŠęÝ—VÓZČHděto-ŇÁiĄkŽ(7&eÁŰ–’¶şÝ–óÇ$ŕł#_+á{AixěN†îŽÍ9ű"ĎilŰvÇ;ŞÚäŠ[ŚńÝ\Ć"6ůä“TÎ+Ć!ťóx¸qgW´żínyżń“W´żínyżńtĺ‚Yö”2HÚ[Z0ɨăÜIš*áŐÇQŽÖoµn.ŻiÚÜň-ă&ŻiÚÜň-ă ďŻ-ł®a´üżgs9-Š+X\÷5®y#jr°Aş¶µ{KţÖç‘k˙^ÖÝ–¶ĐÚĆId ll.ŇCh­)Ž5vvŰŮ›QďeڦcyŐČĐĐpsÚNň^YÜO´-ĺŠW۲8gkĺŹVM^č [IXüBpšVĹĄ•Ą”f+H› nsžZÁA™Ć¤ű´  : [kXí¦,†\L‚Ł—9vfĆd¤yI'ťÜÝ…6,¸vĚü´č`|Ě…É3ÚXl6Ź‚§;ÚN2ĹwhĘÓ·ł˝¶·ŠÚ §rČaccŤąmŤÁ•˘¦Üť^(%~Ňšîvĺl,Z V?,łI‡†ŕÖŃÚ2Tw˱ÝŢőϢ.-ÍŰ35ůe‹#â‚­ˇ4çĚÜ8”89hjö—ý­Ď"×ţ2jö—ý­Ď"×ţ2ú.ŻiÚÜň-ă&ŻiÚÜň-ă Çdń˝ËÝRuzâ ŤĚÇ´O`,6?vFŃś[YNf”‚ě˘9i%Î`p­Ë[qm«;Ą%ňHé—3ź+Ý+ÉČÖ·ľqĐAeim$ŇÁc’ĺŮćsE ÝJTű´Ôé% Łk=Ëěő/tZ©Ëß+2fcu32 H×Rŕ4*–Ö˛E´Rì’ Ţ÷Î.{%s®kňÝ!ź$¸ÓŠĐOE`±ëf®Ű,.vĆ1ü_'žŢŐ†Z?jÁĎ—ĺR›«zęŇVŘ;eŘBĆÂm%†$!ńĆöµ±ĂŘđňöMk^÷Ős…ĄÄsM-µôöÂáâI#c`ss†2*Ťl/wzÁş­«Ú_ö·<‹_řČ6öE¬±\\LašŢË©Dóça˝ĆMlç%Ü­ĎĚrŠŐÝEŔŐí/ű[žEŻüdŐí/ű[žEŻüdőĂąţ˝s˙âZűKµM^Ň˙µąäZ˙ĆHmdŽâK™®eąšV22éDbŚŚ˝ÍCcL…śß™64fĘYśŰ¦¸3U©”¸¸č‘šÖ¸SNâę,˛´}Üw݉¦ę&–G)fµÚG»|iłř9˝}‹ëű÷p•¤Ďŕćômö,[ŻďÝÂPsv§ôkž =Ł‘6§ôkž =Ł‘üľz잡ľz_ŁĂ"™|ô<'Ů=C|ôżF?†DÝg¤‹Ú±vuž’/jĹŘ@Xä|XVŹ'EiĹwÍ4îpî‹‚Ż‹ Ńäč­8®ů¦ťÎÂ9_ŁÉŃZq]óM;ś;‡"Ç «â´y:+N+ľi§s‡p†EŽAWĹ…hňtVśW|ÓNçáȱČ*ř°­NŠÓŠďšiÜáÜ!‘kő(*H271.!˛ČŃWÇĽ %l" MŚ„Ăssq‰p.$“™Ő5©\ł°ß[l×’ĆB#fVhV »V8¸ăŤ]á.ĘäËxĆ?ËËuś>BÁ«§cC^ř…Ľ”4őí¦6óvâcá+1ąźfěÓ`g&wM®pwR”ůG}çĺ;w mk!vȚəmpDr¸ĘZE]MĽöďĆ€‘šhŔłhçş(â÷5ň71 $1îh®P€ą{@Úß\Fâće·{H&l‚V€Ů)@ÓPMÝ!-6™Ěí™âÎ1ŻÍłŔŮ­·m´Ť’xٶ –YÜ‚=A-f`Ć8˛ ąŤľViöNĎąşuäŃf¸t"ÜÉ™ŔĂő­Ë•Ă+šń8qĐVkk†\ÂŮXF fh5ĘâĘ{"«Ýđ¶’8Y —7‡=°Ĺ;$eˇď¬ĎŤ´íkŽŤ4+ŘÖ6°6Fऻ\٦lî.;4íJŕC[wÉo‚(‹běŘ]Ž"ÖŔÖF$“Vu 67><Ů憶Žp.Á¸ŕŚż™Ł–ĆćăgÂů]oiÖžçęĂ!/€ÜÄÉ™­q…;ŔFćl ,Ý»$o‚;¦ n®f\Ç9şÜRŰ[±‘‡»ĘéęĚôâą®$  é>Ň·±ŢFüŽkÍĄD±ž3kB8ĚwzMhńN5F;í“c^˛×śě1É«–Hu‘šń$Ô˝™ŰĆ4­*wĘÂ6ÓíLvłľô ,ƨHŔÁśç9Ň©IŁŹé>ďv!Ýî÷|xüK˝>Ô‹?»Ýîřđ?ř—z6}©GíÇŁÚŤ#Ó/¤ű‘§íÇŁÚŤ#Ó/¤ű‘ Cć!ôlű!#Ó/¤ű‘¤>bFϲ=2úOą 9Ą°sÜË—čäÇ «Ü~N .ËŽąć×NS řŤçńsúGý˘°ŻŁ§č´­JÚfůµbwÇoÁä·¨ĽZb"»&aÖë;?ť*Të;?ť*UÉEŻcĄű_Î>Śű›đ«­Öv:ţT©Öv:ţT«’‰ětżkůÇĐ÷7áW[¬ěţuü©S¬ěţuü©W%Řé~×óʎîo®·YŮüëůR§YŮüëůR®J'±ŇýŻçCÜß…]nłłů×ňĄNłłů×ňĄ\”OcĄű_Î>‡ąż şÝggóŻĺJťggóŻĺJą(žÇKöżś}s~uşÎĎç_Ę•:ÎĎç_Ę•rQ=Ž—í8úćü*ëuťźÎż•*uťźÎż•*ä˘{/Úţqô=ÍřUÖë;?ť*Të;?ť*UÉDö:_µüăč{›đ«­Öv:ţT©Öv:ţT«’‰ětżkůÇĐ÷7áW[¬ěţuü©S¬ěţuü©W%Řé~×óʎîo®·YŮüëůR§YŮüëůR®J'±ŇýŻçCÜß…]nłłů×ňĄNłłů×ňĄ\”OcĄű_Î>‡ąż şÝggóŻĺJťggóŻĺJą(žÇKöżś}s~uşÎĎç_Ę•:ÎĎç_Ę•rQ=Ž—í8úćü*ëuťźÎż•*uťźÎż•*ä˘{/Úţqô=ÍřUÖë;?ť*Të;?ť*UÉDö:_µüăč{›đ«­Öv:ţT©Öv:ţT«’‰ětżkůÇĐ÷7áW[¬ěţuü©S¬ěţuü©W%Řé~×óʎîo®·YŮüëůR§YŮüëůR®J'±ŇýŻçCÜß…]nłłů×ňĄNłłů×ňĄ\”OcĄű_Î>‡ąż şÝggóŻĺJťggóŻĺJą(žÇKöżś}s~uşÎĎç_Ę•:ÎĎç_Ę•rQ=Ž—í8úćü*ëuťźÎż•*uťźÎż•*ä˘{/Úţqô=ÍřUÖë;?ť*Të;?ť*UÉDö:_µüăč{›đ«­Öv:ţT©Öv:ţT«’‰ětżkůÇĐ÷7áW[¬ěţuü©S¬ěţuü©W%Řé~×óʎîo®·YŮüëůR§YŮüëůR®J'±ŇýŻçCÜß…]nłłů×ňĄNłłů×ňĄ\”OcĄű_Î>‡ąż şÝggóŻĺJťggóŻĺJą(žÇKöżś}s~uşÎĎç_Ę•:ÎĎç_Ę•rQ=Ž—í8úćü*ëuťźÎż•*uťźÎż•*ä˘{/Úţqô=ÍřUÖë;?ť*Të;?ť*UÉDö:_µüăč{›đ«­Öv:ţT©Öv:ţT«’‰ětżkůÇĐ÷7áW[¬ěţuü©S¬ěţuü©W%Řé~×óʎîo®·YŮüëůR§YŮüëůR®J«ŢŘÚ^ó@=ý8ŇJ{ .:žqô_s~v:ÎĎç_Ę•:ÎĎç_Ę•p­îDőaŤŕ¸ş†ˇŽ,$†ť;ݢs«?˙?N'7óʎîu8UÖë;?ť*Të;?ť*UÉE=Ž—í8ú'ąż şÝggóŻĺJťggóŻĺJą(žÇKöżś}s~vť“«ÜjűĚ/Ą”Ҷßß»„­&7Ło±bÝ~îľmŁá8{"s.nÔţŤsÁ'´r&ÔţŤsÁ'´r(­ů|ô<'Ů=C|ôżF?†E2ůčxO˛z†ůé~Ś -şĎIµbě.>ë=$^Ő‹°€±Č*ř°­NŠÓŠďšiÜáÜ99_ŁÉŃZq]óM;ś;„2,r ľ,+G“˘´â»ćšw8wEŽAWĹ…hňtVśW|ÓNçá ‹‚Ż‹ Ńäč­8®ů¦ťÎĂ‘cUńaZ<ť§ß4ӹøC"" -ahöćŐÜHĆąÎvP# ’ăLŃ“¤­”A… 1Fóç"GNg’ęĐ4•Ë7lĄËtČ„2fsg䊍âz€{á…~h]ĄÉźiŰĹ [BŇŃí{ĚqM”<µ®|!ÜyZqˇÄŰÍۉŹ>ĺ‰gŮ–—ÖθuÜâmkĂ™Jî šč͇`Ú`ŁjŮÝÍŞžÁڻȳ0I¬l~JL®{xö÷-5sň+‡|1jÖGÉi(^öĐ@9ćV„ťĺÎÚQľęć-S¦hµ‘şÝ^@ ąŔÇzˇ-i™Îůź;ŁfߊňÍĽ–°[]ÜI;míM¬4ll燫I$d0Ľ6¸9îocÓbçaZ\ß:ůĎ‘’ş0ŔÖ†5í’9›8ii¬ĐłPC@ €·á•łDÉY\Żhp®šUŠîúŢÓ ĽşJäŽ(ß4„6™ť’˝ŮEEM(*7Â+TlV5Účî§eé.2^ Q‘áâ6ą®k˘1RĆ8¬ďeŐZlHlÄL·¸ťF"„9ˇ˛ş2&=î Ď\±¶ˇ® 4Ÿşµ¸üÁbË9n­óÜä·uÓC#“V@‹¬5Ż—VYśĘ;F…ŽĚŰ» VŰńîs¶ďŹü,¬lŢO˝ň•}´­«pâ×AÂ.\ß,ă0edÎÖÍŞ‘†›3ŠYZń‹Xć“mCi§)VnZÉĎ•˛Fčg’ß ŠW™’F5Ycň„¶2â\¸×B’-8v¶Ďžá–ŃKšy¬ev`Ę˝¤Ľńrş75Ů©•Ôiˇ ÄD@DDD@DDD@DD©wçŃý'ÝîÇmj]ůÁôI÷{± ďw»ăŔ˙â]čŮö¤YýŢďwÇ˙ĻѳíH‚?n=ţÔi™}'ÜŤ?n=ţÔi™}'ÜŤ1ŁgŮ ™}'ÜŤ!óú6}‘é—Ň}ČĐq/?‹źŇ?í‰f»ţ.H˙´Vö´âÓţţĎť©ůŰůH‹Ł" „R!˘E(‚J „R!˘E(‚J (R!J"R‚J (R‚˘ ""…(€‚˘ ""E(‚J „R!˘E(‚J „R!˘E(€ˇJ …(!J"Ćb¬ÚdžŠ1ľ ±Ěî ;ůY"p­[x›$‚%µĂKN±ř…˛ĐěŁ1ÔÄA^ VL#|ÉdĚ7ł¸ČߪŕVu«ĎÝ>3$ď)E”B)Dv7Ło±bÝ~î´›üŢŤľĹ‹uýű¸Jřwü­üĄôëřÇ›µ?Ł\đI퉵?Ł\đIí‹*ß—ĎCÂ}“Ô7ĎKôcřdS/ž‡„ű'¨ož—čÇđȂ۬ô‘{V.ÂăîłŇEíX» ‚Ż‹ Ńäč­8®ů¦ťÎĂ‘cUńaZ<ť§ß4ӹøC"Ç «â´y:+N+ľi§s‡päXä|XVŹ'EiĹwÍ4îpîȱČ*ř°­NŠÓŠďšiÜáÜ99_ŁÉŃZq]óM;ś;„2""" -VAufÇ,a…ďxŤÄŚî/ĄD}m" E,09Í|¤˝ŔZÜĎsź˘¤ŇĄq…–Ő˙I’ÖÖHCÄ™ Ä4h¬ąj{ęeůµůKĐ-A%ĚÄ=‘G–9]!ä.‹šu=âťąîÇfŐ‰ÇfX6D;B#r/ČÚéŁ ¦šeqn_‘€Ë^6śÉµ˘Ľl^Ř0Éu|922Fęć,{Él“Űcš&Đçßâť#i·/6ΛWW´ą¦6ę–<°ĐĐWFňóűKó(‘±Ma­lvňvKiAQV÷ŘńCŽďf‹[mm‘¶gucü3˛#lîâÍĺyŤ“mäž8ÔŬ†Ţ75Ň?«őjÎý`lÍmK PŚkŇ˝Řń\¸:9lçLůĺ’2D…ď¶}–f8ž#š×'F5[v×]AÄ'4R´9†”Ŕ𨺼´łŚKyW¶6—M*ň1Áe\{Ër[Në¨dµ‚á¦'BŰ{S Ѷâ2dNKË›pt9ş§BÍq°5ń$2BˇÝŰG<Ö &2™DÍÖ4HÚĚě”Ë— ć¦;“mŤ—sKw¬&ĺ­{ák\ó#ÚąÍĘŇxˇa“mĹl#vŃ‚Mꞙ-Ëŕ ĚY$¸ş9źAäéŽéđ[fě–ěů#\Ę>âŐÇaŤ¦9'”–5“=Ó†.q$®‚ÓşÚÖÍşÍ35ś.¸žŮŽiFĆç'Wiß ĂjlÂŘ/ -ş%¶ÄJĘJŕrÉęçĄú1ü2 ¶ë=$^Ő‹°¸ű¬ô‘{V.ÂÇ «â´y:+N+ľi§s‡päXä|XVŹ'EiĹwÍ4îpîȱČ*ř°­NŠÓŠďšiÜáÜ99_ŁÉŃZq]óM;ś;„2,r ľ,+G“˘´â»ćšw8wEŽAWĹ…hňtVśW|ÓNçá €€ąSl«yź[­źivňç†K0Îŕ×=ň†šÂü f;´Ż ę¬r ľ,+G“˘´â»ćšw8wVÖ7ÇY(^÷ŇHŢçҤ őä˙3ţ]şšůłŘąŮnŢ0leů Ł\ňZ7ŽďgW˛Typtt­ ¸ÔŢĘí,Ć€9ŃŹËŤh q¦Ś0ˇ9]F۸¬Č:ÉŁ’Vś2ĺ‰Ń±ŐÇO•÷ĐfDDZó^Ĺ ÄÎkËî‘„4ä˛Yqq Ń ´TŚ*(VÂÔ»óčţ“î÷c–{¨ŕ–Ţ'‚]u!Š2)@á“q±Ń–2±]ůÁôI÷{± ďw»ăŔ˙â]čŮö¤YýŢďwÇ˙ĻѳíH‚?n=ţÔi™}'ÜŤ?n=ţÔi™}'ÜŤ1ŁgŮ ™}'ÜŤ!óú6}‘é—Ň}ČĐqźŇ?í‰eşţ*oH˙´V5ö4żă§đŻö|ýOÎßĘPŠQm”"•€€€€€ŠPB" "")DĄ")AĄB)DŠQ")AĄB" """ """ """ """ """ """ Â!{_#ŁxÇ89ĄŘ†µQÍÜjś—˛6›¤0×Ţ«ŠĘĄp˝5¦ů¬óVq˝í ňîůŻWV1Ť)ŹűéYź>VSůçö™â&ˇ§ľsÜwNbŢăH *.‘§űľ˙ĚyLËqŻ«¦)Q;ËĹţeŮě˝vĐłi–ÚbL‘š¸˛G»±‰ť‡i{eÂľü͵ŰcŤ˘XâŮś;âAĘí_Ń:wô ő×Bu"ßúă31ąßÓNŻ<Ć”M­1;#ĚüŁł.önË{o0šćS9aĹĚc»ŤdqG›.LůsŰ}. ·{Ť®…űĽŘç«Ó3e\2ŢĹłŢČzÄrJŔű÷ą–„DĺÁŤóMqcŢŕŹfÍi(ž;ÓA}5ܲEŞk]Ă\ç´—D.u™wrćÂľH~uŰXf¸čÍAŻyZ§;ÎíŹć±üĺ·c-lłJÓF¸‚ŘK\ęŠŰčpĚG tÓŤ}ľ§w™Ô«ŇÚě[é:üďÚÝOͲ{ä†Y®/ä:—<5“łŚ*EHiď–÷ĺýśë°DS[Ĺ&L±MŐ™ĆnlĎlV,lbˇŔf$¸Ň„Ń_?:í¬3\Htf €WĽ­?ÓťçvÇ‚sç]µ†k‰ŚÔ ÷•§úsĽîŘđNg·Ôîó:•{}śÇËâ²6âŇe(…Á“ !fŻ4Eäe.Áń—S×aUÍvČşu-¤°cm5ĎAoą¨k“2rű\ÇŹťĚÇĽ hĚŃçźůżoĂ«×M /kd§úpK]—j n`EwÓﱏλk ר ď+OôçyݱŕśĎo~ď3©W§±Ř·Ś·Wŕím}‹şË‹>®8ěăąňŐ.§Pá^6:sc„lŁ ×6ÝEÖ–2őÍ©Hź­ş‰öó˛ć‘<Ë- ¤ňŤč#žťvÖ®$:3P@+ŢVźéÎó»cÁ9ó®ÚĂ5ćFj{ĘÓý9Ţwlx'3ŰęwyťJ˝Ý•ŤÖ­—3M%µĚň›¸cŐ9®sCays„q±±ćanjfŇW&ßd\˛>=†¶Őł1óA3múĺŕĚ×u—2MDŮd‘ŹiyiÁÄŐŔyČ˙9m×ÖÍ+ČśŘ+•®yţĐQŻ=Ś<šŁó®ÚĂ5ćFj{ĘÓý9Ţwlx'3ŰęwyťJ˝M–ÉÚm+[‡Ĺ–Ţ×ćo‘‹˙ňy" wěŰq(ÚňjVÄŰ:öö[«ÇEŐo&ŮŃElă%DN9čcůQë@ÎZ—I ČEůËm˝ěʬ>®-mI·cjrĆ|hď±:*+ŢśÝ˙Ę»gk_íÁ#Čdr‡G#ŇŮb04÷°ÇCW» Ć›ŁuٶŤ«ś,^'s^{+űăqłöC%ŮŃ>ÜÍmTtr9±ßµÇ‰1…Îi–:‚ěĂM »io-˝¬qJ܆˛9‘TTO–GĹ­ňlsYFÔ PaJőÖĄßśGôźw»m0{˝ŢďŹ˙‰wŁgÚ‘g÷{˝ß˙ďFϵ"ý¸ôoűQ¤zeôźr4ý¸ôoűQ¤zeôźr4|Ä>Ťźd$zeôźr4‡ĚCčŮöBG¦_I÷#AČşţ&oH˙´V%–çř™˝#ţŃX××Ň˙ŽźÂżŮŕżçoĺ(E(¶ÂJ „R!˘E(‚J „R!˘E(‚J „R!˘E(‚J „R!˘E(‚J „R!˘E(‚J „R!˘E(‚J „R!˘E(‚J „R!˘E(‚J „R!˘E(‚J „R:CřI˝}‹ëű÷p•¤?„›Ń·Ř±nżżw _˙•Ľeôkş<Ý©ýç‚OhäM©ýç‚OhäYVüľz잡ľz_ŁĂ"™|ô<'Ů=C|ôżF?†DÝg¤‹Ú±vuž’/jĹŘ@Xä|XVŹ'EiĹwÍ4îpî‹‚Ż‹ Ńäč­8®ů¦ťÎÂ9_ŁÉŃZq]óM;ś;‡"Ç «â´y:+N+ľi§s‡p†EŽAWĹ…hňtVśW|ÓNçáȱČ*ř°­NŠÓŠďšiÜáÜ!‘9_ŁÉŃZq]óM;ś;‡"Ç «â´y:+N+ľi§s‡p†EŠf—Ŕ¨9Ť%ĽG еĂŕý*Ç «â´y:+N+ľi§s‡p…Ú$»jiştaM Â~a°źcI=Ńk)Ü鎒<Ö„îi÷Â÷‹‘´¶ÖΆvŮܰM u'qÍa"­ 桡;Ü8.ş˝möG4ă±ßÓßR·˙ŐkLNČßă oÉv×°l—ľđşâgMvVćFŃĹů5-&‹‡ůÄďÝ®™˘şäCÂ-ăÖ€n#®bĎ”]Ľ3{¶ą®hsHs\*ÄW*ËđË´%Ú1Ý\[\M@ó Ť¸4G…]ťO$Ü ¦ťňĄo÷ͧ|ć~.“7™™ßiĚü^#l2Ň8ŻŁŤ°Ű\LÖ1˘ _1¸ňÖáŚEŔnĆÇ ¶.ÚN|‚9ś,­›nřšÍsb·kÁ|í’ ZĐţüiŔq¨˝hüŤ˛›JK7”«mÎŚšk=ŕîřN¨~FŮMĄ%›‹JU¶çFM5đw|'W¬j×sä—q˛tó˛Ö3uF—6F‹ŚŚÖkÖ1†:ďŤ^zeňZĹißă2f·"K(b´sŚ1ĽMU ě®i7†™¨Á¸}hüŤ˛›JK7”«mÎŚšk=ŕîřN¨~FŮMĄ%›‹JU¶çFM5đw|'UÖŻ‘É/-rí•R‚FŰş7Mo¤Ź+Ü"dzĐ 8çă7ćˇĹŐÓŰo·vŁ$QE0ĎźU,Őś\•ęqEÇ6ű·đĘ˝¨üŤ˛›JK7”«mÎŚšk=ŕîřN¨~FŮMĄ%›‹JU¶çFM5đw|'UŐŚwIx«Î¬0—]ůŘýÚu7–ľ<ˇĽ`5$P @ÂoĽ¶ –ë›Č¬źuIÄ6ŰąĄÍ’Ç/đÜW9ˇĎ4;•¨-$/QţłHŤ®žw€la´ş‚°h«jwęď Ő›żĘ»>AÖoŻn$ł® ĘČň»Śé!I,zŘ‹C[;@kžÜĎym`)–—oSëRf}»IŽ2ůňY9¶˘˛9ŃäîM2ń㣻«¤?’¶4NŤ®žFąä60áoW9ˇŻ Í劧˙*éul?#l¦Ň’ÍĹĄ*ŰsŁ&šÁŹx;ľŞę×iË/ ł"ke!ú©[=ťÓËHkĚe‘L[\ĂđčĂ…1Ą7×Zů–‘ßÜÇtŰF9—·g˛1kZ8`C€]Ožě× ëŇłňVÍŚ˛yŔp p¤sZcpňaXšqěďšŘ~M°lÂŕ\ÜkÚá ”ę ó‚Çf.0Tš°đřNŞu«3žâ)/ ¶ćőHŘ[4–ĺŇ›qŤÎ×ÎĐÓů2r€0^«ňŔ§ć ł*ŰwGpębn#m›gĚüśc­ÍSťŐ8áZ»¤(Yşá·O»ą}ËK\&vĄŇfŹ&CťĐ“Q«owÂuv6Oĺ«“pn-ß#žc1Qâ02śśÜl$ů1¤ďť$•›jÄ×ÓóX¬ÄşëRďÎŁúO»ÝŽÚÔ»óčţ“î÷cÁ¶w»Ýńŕń.ôlűR,ţďw»ăŔ˙â]čŮö¤A·Ť˙j4ŹLľ“îFź·Ť˙j4ŹLľ“îF‡Ńłě„ŹLľ“îFů}>ČHôËé>äh97?ÄÍéöŠĆ˛Ü7¤Ú+úÚ_ńÓřWű<üíüĄĄŮB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQD ?Ło±bÜ~î´ÇđłýěX·ß»„Ż‘oĘŢ2úÝnÔţŤsÁ'´r&ÔţŤsÁ'´r,«~_= öOPß=/ŃŹá‘Lľz잡ľz_ŁĂ" nłŇEíX» ŹşĎIµbě ,r ľ,+G“˘´â»ćšw8wEŽAWĹ…hňtVśW|ÓNçá ‹‚Ż‹ Ńäč­8®ů¦ťÎĂ‘cUńaZ<ť§ß4ӹøC"Ç «â´y:+N+ľi§s‡päXä|XVŹ'EiĹwÍ4îpîČ€ ‚Ż‹ Ńäč­8®ů¦ťÎĂ‘cUńaZ<ť§ß4ӹøC"Ĺ0qtYiPúÔŚÔ]]Ě0ݨý*Ç «â´y:+N+ľi§s‡p…‡1h-ÜŇNęđ;nÚ}•s1»íĺ|’Á+G†âěŁßv#ß_@\˝­q±ĺ-Ů»I˘Xć-Ě×w¬:YśÔRż˙8.Ú–Ó¶kśv;úm[éŢf‘™ěßâŇü’űą6;ßsPÇNăl{ŞĘÎóćçĚ·v˝Ů‚âŢ)o?´‘’ą÷~IľU†1Yîöqšçş”©Ë†®“ZÖ45 5­kF¸;«X®ŁĘéĐs˛BęĐŽú±ÔÇEW+O5¦ÓŰ9r˝¦Ö›OűLĎ›Ď콣q5śÓ‹–ÝZÄd¶„ŔöŇKa$Žľ…ŃëçqKSV‚xŘŘĚŮEű5Yďşâ@ŘâŽk­^i]­h­cs0ŚrŠőÇQ¶(škĐÖµ˘€4¬Ł/>ÍĄz-ŕ2]°™zÔŃłXČ {c»1Ć8ŕeĚćd>u­Ő±áŘí.ÍĽĄćH†ŃąëĐËŞk-ˇ•×’BçˇělŻŐ¸»2ŕh}" ó6»Wj]uű‹iĹÄv°M5¬,ŤŻĽ\_Ĺf%ąaf ĹÔw}›Fćĺ÷qŰ6ţöĆâŃ·lĄÄÎeÝ»\mîó2W2+8ކĺo| ©4- Ú"2ű§AÔ›.î6Úlë]E›!“KščËQ–GąĐІĽŽ5ĹjííŻp]}lŮ™©š¸g$Ś×Ć"¶ťúŃakÚ׺*µÎ•ŔµŔĺ†_`<ťćѸÖÄë źĹ›l÷Km=&{g´3A[VĆ×S#P3q´âŐÔüżwwsÖ×PŢDĚšąa‘łŃÎÍťŽ–+{xđ§(µqŁš»€€µ.üŕú?¤ű˝Ří­Kż8>Źé>ďv!Ýî÷|xüK˝>Ô‹?»Ýîřđ?ř—z6}©GíÇŁÚŤ#Ó/¤ű‘§íÇŁÚŤ#Ó/¤ű‘ Cć!ôlű!#Ó/¤ű‘¤>bFϲ=2úOąUÇńzGý˘±¬·ÄMéöŠĆľ®—ütţţĎ ˙;)B)E¶PŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĐÂĎô±bÜ~î´˙řłýěX·ß»„Ż“oĘ|eď®čđsv§ôkž =Ł‘6§ôkž =Ł‘e[ňůčxO˛z†ůé~Ś ŠeóĐđźdő óŇýţ[už’/jĹŘ\}ÖzH˝«acUńaZ<ť§ß4ӹør,r ľ,+G“˘´â»ćšw8wdXä|XVŹ'EiĹwÍ4îpî‹‚Ż‹ Ńäč­8®ů¦ťÎÂ9_ŁÉŃZq]óM;ś;‡"Ç «â´y:+N+ľi§s‡p†DD@DDD@Xä|XVŹ'EiĹwÍ4îpî‹‚Ż‹ Ńäč­8®ů¦ťÎÂ)«hpq Čí'+©Ă‡č9V9_ŁÉŃZq]óM;ś;„.ÜÔă N\+†ŕÜ_>ÚÍšŇňć=ˇV‡>Ib”ÔµĚ{‰ł¸;Đ—/mZlť˘ČövĐvWĚkS•ŕ¸ęfŃŽžŰCVtíÍťŽţ›^to6ĚăÉ©ů2úę÷eHëŠŇÝ5ÄęÚĆ3nŃÎ#ą¸ş7·}n 7G“G,ĆYXéZ ˘fLŚ’,]®­saMáµoo ´,··`ŽŔkŃ@ZűOfA´íŰo9ĘÖĽ<\2âo{s­ů[Őě®VśÚgvg.W·5­mÜÓ3ććŘíKëî¦ŰÖ‹k}ˇ5y!3ľK}|š©â›Čc@öÔĺ«\~N'ş±±ił]]Ýß\Úł]+î22 .‹r˛âxŰ"Ëß·|ć"‡µkł6u›šű[h⑱¶(hÖŘÖ±Ň3€ NâÉ%ť¤°:ÚX#}»Ésásć9Îv°’Ň(Iw‡rŰµŻµVÂVÁ÷eđ窖)’A’4µŘ ől…±—ů›]źy~ÇB%•“Cu´níŘ ]¬Ž8ťxúg2ěbhoQ¸cĄu…ť ŤŃ#ş1™‘ąLM62)ŢŚĆF%VMźa6»[m ťg/XÍ]­Ő÷šĘŽ6]ĘčAÇnŢż®Đ”Ç ·ŮĐĎ;ŔĚ$~ŞkČÁ¤ Âݤ»s)ÍĹ׹şŰWR[Y\Ĺ«Ü0ĺlĆČÉ »vWőIîŢÖ‡EPkĆ8SŠJôVöv–­Ëkp6´‰Ť`Ę ž 3=Çß;ëŕű#«ő^ŁoŐóë5:–jő”Ëź&Zf¦AÍžóhlöÜ2fٲňhĄ2ÜÉ#žnřŰs$­pFŤstč‹rűą/ş‹ŁH¤•×ĘěťZ•€°×ľvvŚE d´ďBÚŹgŘE ŠÚá{5oŤ±µ¬tuqČZ j÷aŮ;ë0Ž1#Ą G×>1kI-ď Ćś%‘j]ůÁôI÷{±ŰZ—~p}Ň}ŢěC»Ýîřđ?ř—z6}©w»Ýńŕń.ôlűR ŹŰŹF˙µG¦_I÷#OŰŹF˙µG¦_I÷#@‡ĚCčŮöBG¦_I÷#H|Ä>Ťźd$zeôźr4ą˙›Ň?íE’â&ôŹűEQ}M?řéücű<7üíüĄĄŮB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ÷˙ =‹ăű÷p•§˙ĹźčbŸţýÜ%|›~Să/}wG›µ?Ł\đI퉵?Ł\đIíŠ+~_= öOPß=/ŃŹá‘Lľz잡ľz_ŁĂ" nłŇEíX» ŹşĎIµbě ,r ľ,+G“˘´â»ćšw8wEŽAWĹ…hňtVśW|ÓNçá ‹‚Ż‹ Ńäč­8®ů¦ťÎĂ‘cUńaZ<ť§ß4ӹøC"Ç «â´y:+N+ľi§s‡päXä|XVŹ'EiĹwÍ4îpîČ€ ‚Ż‹ Ńäč­8®ů¦ťÎĂ‘cUńaZ<ť§ß4ӹøC"Ĺ5sDCK¨ýŔ0«\+;űăô«‚Ż‹ Ńäč­8®ů¦ťÎÂc‹…K 4`ęoňIŕ^iÍ9˝ąŽôćlŹsKđ`'&=†Ó->ôČŰűËlBŰi¤\»e/ Îhi#6­+¶†¬iß›Řôzm~Ťů±ť›˙*mYö¦Î’Ię]Ćóß=ˇŚxs»bFϲ=2úOąCć!ôlű!#Ó/¤ű‘ ćĎçćôŹűEQ^o?7¤Ú*‹éé˙ÇOăŮâżĺoĺ""-˛""" """ """ """ """ """ """ """ """ """ """ """ """ """ ""E(‚J „R!˘E(‚J „R!˘E(w˙Ť?ĐĹ‹qýű¸JÓ˙ăOô±bÜ~îľUż)ń—ş7G›µ?Ł\đI퉵?Ł\đIíŠ+~_= öOPß=/ŃŹá‘Lľz잡ľz_ŁĂ" nłŇEíX» ŹşĎIµbě ,r ľ,+G“˘´â»ćšw8wEŽAWĹ…hňtVśW|ÓNçá ‹‚Ż‹ Ńäč­8®ů¦ťÎĂ‘cUńaZ<ť§ß4ӹøC"Ç «â´y:+N+ľi§s‡päXä|XVŹ'EiĹwÍ4îpîČ€ ‚Ż‹ Ńäč­8®ů¦ťÎĂ‘cUńaZ<ť§ß4ӹøC"Ĺ1Ćâ q&€¸÷ŽŃF¸ü ĺXä|XVŹ'EiĹwÍ4îpî»\*+¤ŚA 7WÚ÷W7Ó—˝ŃÜ[ĘđÁ‹Hdn9 7¨{:W˝\?Ě—µá/·s`˝Á˘C\®mt;.8 ĄŰÓęWNüÖŚěz=.µtŻÍjŶlÎßë,ß—6ÁۙÏ †Ľ`ZÖ?8•[—wÂÚHád2\ÜJöĂ@ě‘–‡ľł>6Đ´i®:4ÓČŮVŰ&Ͷ–ő8ç’GwŇ<€ Źk´«µlîćŐO`í]äY$Ö6?%&W=Ľ{{–šąŚůĂľĘÓiŚDÎČqĽÄÚÓ™śGs]Ꙭĺ‚KašXmíŰurćę…Ż‡¬±ŹcĄĚćR™AmpÍ©°gż´ăhI ˇ‘ńDŘ ‰ŮŮ$ň˛&VWËGµĄřśŤ®šőa¶ü˝o-w!Ľm”c‘‘Űä…Ľ„Ěô{kVąîn:0m3’\ÇE-íİńLQĽÄuOŤí’'µú¬îsÁMcť_•™FZ;KlÎÍĄ­«ĚmŽFĹp ZCśéöozMM5WNnćžŔ)˛6ŐŐͧ]Ľx,ę˝eѶŇkV´ĺkČ7Rę\wĹ{ęаß˶ćn±5ÄóÎdşGÁsšëWŠâciţ‘żďm ™n6l;49ú«vDȤ¨Ö4ŰĺtOŃ”ą®`8ŠoŠ`Vßó­Üm6PÉu;‹Á·‰ĐąÍËݬ×jHÖwŻ=÷aÔ´¶tűHěŘÝĺłľ&śŃśŇE›XÝ[d2¶™‹†ÔÍ„÷NËŰx÷ąî»¤:ÂČŁs2ęuyHź"¸iÄ­6k`¸2Ç<Úśď•¶µh‰˛J\éĹh{Şç¸ŃÎ-©Ŕ`Úâ" """ ""Ô»óčţ“î÷c¶µ.üŕú?¤ű˝Ř†w»Ýńŕń.ôlűR,ţďw»ăŔ˙â]čŮö¤A·Ť˙j4ŹLľ“îFź·Ť˙j4ŹLľ“îF‡Ńłě„ŹLľ“îFů}>ČHôËé>äh9Óyů}#ţŃTW—ĎËéöŠŞúZ…Ś€ö,[ŹďÝÂWË·ĺ>2öĆčđsv§ôkž =Ł‘6§ôkž =Ł‘EoËçˇá>ÉęçĄú1ü2)—ĎCÂ}“Ô7ĎKôcřdAmÖzH˝«aq÷Yé"ö¬]„ŽAWĹ…hňtVśW|ÓNçáȱČ*ř°­NŠÓŠďšiÜáÜ!‘cUńaZ<ť§ß4ӹør,r ľ,+G“˘´â»ćšw8wdXä|XVŹ'EiĹwÍ4îpî‹‚Ż‹ Ńäč­8®ů¦ťÎÂcUńaZ<ť§ß4ӹør,r ľ,+G“˘´â»ćšw8wdX¦-ş€é;ĺ®hů'I4ÜáÜ9V9_ŁÉŃZq]óM;ś;„,É «0Ť 8h쯶nîo_4OŐľÎW¶6ŹâĘşN7kBöëÍ~eü·-ă]w˛Ŕeë°{*Đş»†šwřWoOzVůĽsF;w=—SN—ćÔ¬Z18‰Ýáńu6&׏kŮ™Ř2ľ'¦ëă”îŠ8-›»ë{L‚bňé+’8Ł|ŇÚfvHZ÷e4 ¨ß S`lflkj×ë${µł?CKËZŢ(Ü4;Z+ĆÉí —QĂ“#$n®bÇĽ–É=¶9˘m}ţ)Ň9[Ó˲3łÁĆřć·,bąśx-řÝ‹ăÖ[‰®«˝­‚Pc×5™˛äkÜĘ×qáiŹĚRÚg ymĺ¸ęď}ڞ_ś!šb2Ĺ p,nă°'F”ŮűęĐ[9D Aó86vFćfć#Ś2ÔaŻ}ů[­C,Zč]®ëÜ[ëő=bYgĎoĺY«xÖŃÎÇ6Vŕ(˛^ţ^¸şŤö˘íŚł/ş•Ť0—J$ĽŽv>˛kCKZë‡2 (+şy›kfşG°Ęc™é%ŽH˘Íp”6iŘÜ[‘ŐŁ´t˛Zm+[É$Š`’ ×=’Ă, ¸4Ňf2 ä:7–ťĆŔŽćѶrĚuzűąžZĐ[xŰ– “BŢł§1M‘ÔuÝŐîŃ`ŤŇÇ 1ł#cu!tĎ$µ“ܶžWźŠ4ë""" """ -Kż8>Źé>ďv;kRďÎŁúO»Ý`÷{˝ß˙ďFϵ"Ďî÷{ľ<ţ%ŢŤźjDűqčßöŁHôËé>äiűqčßöŁHôËé>ähů}>ČHôËé>äi‡Ńłě„ŹLľ“îFź/ž—Ň?íUy|ôľ‘˙hŞŻŁ§řWřĂÇĘŢ2„R‹lˇ˘DR‚J„Rˇ˘DR‚J „Rˇ˘E(‚J „R!˘E(‚J „R!˘E(‚J „R!˘E(‚J „E(!¨@E*mźá®>€ö,[oďÝÂVˇţăčbŶţýÜ%|Ë~SâöĆčđsv§ôkž =Ł‘6§ôkž =Ł‘EoËçˇá>ÉęçĄú1ü2)—ĎCÂ}“Ô7ĎKôcřdAmÖzH˝«aq÷Yé"ö¬]„ŽAWĹ…hňtVśW|ÓNçáȱČ*ř°­NŠÓŠďšiÜáÜ!‘cUńaZ<ť§ß4ӹør,r ľ,+G“˘´â»ćšw8wdXä|XVŹ'EiĹwÍ4îpî‹‚Ż‹ Ńäč­8®ů¦ťÎÂcUńaZ<ť§ß4ӹør,r ľ,+G“˘´â»ćšw8wdXä|XVŹ'EiĹwÍ4îpŤ’ =ˇĂŇ NžÁ˘ /#´?1]şđÉjrÇk+Ł1׊r’ìNja˝Â˝kZÖŠ4*M“R{kÉ~eüżq“hl†I%D¶ě%Ď8ą­ě×í+·§ť8ľu#1Ž×ŁŇŰJ·Î¬sF'dîz-™´­öť¶ľ ]’V,KOĽBÍuyig–ňxíă'(|Żlm. šUäc‚ćţXŘŇl}š`™ÁÓM!šP1 sšÖevšwÖM®éín-ö”ëÝ%·0ĺÔNc“=mˇ¸pË©§yLtŤ•±Í<»łłÁĆüĽÖĺüs8đěfşŰ[2ÖJűŢᮣ…Źa’X×Iš&ćkM…Ž=»i$ö6íd†KđâäĆ˝ĺ—n#Ľ›ŰLxÍpů%raŘSđΩKMu†é¦c(šn¨Űf‡Ćc-‹#€ăĆó7j2ô®ö#ŚÂ{ ĽîťóşRĐíYu´đ7VĘP,şĚ®8ąĎ?)FYĄŰŰ"8áź­Âűy¦6ýa’0ÄÉnšŹ~j Ű!l;hX6Y`uĚ-šÝ†Iă24>8Ŕ˝í­ZÚ‰\X6.ŇŠđ߆F$Âč ’î{ňĆ]DüÓĎs.jk´nVŞ·?–îemÜMČD˝rH&}ĹÁ˶Ěęľj<şâ3ŚŐńjî(vť´¬c2™'Ž8  2Lé# isßSĆ«H|e¸Ž¤_Çqw%ĽT|l‚†L×5íťÓ4R›žJµ®5Z7{&čÜI%‘dpmˇĚ‘öŮ™¸ňzŘ]FµŽ4ĺĘh l-“ułäšK‚Ď*Ŕ[#ć-=bîă%k\î,íŽ$Ö¨;€€ RďÎŁúO»ÝŽÚÔ»óčţ“î÷b=ŢďwÇ˙ĻѳíHłű˝ŢďŹ˙‰wŁgÚ‘~Üz7ý¨Ň=2úOą~Üz7ý¨Ň=2úOą>bFϲ=2úOąCć!ôlű!#Ó/¤ű‘ Đ“ĎKéöŠŞĽžv_H˙´UWĐÓü+üaäżĺoB)E¦PŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”AĄB)DŠQ"”A˛‡¸úرmżżw ZŽţăčbŶţýÜ%|ë~SâöFčđsv§ôkž =Ł‘6§ôkž =Ł‘EoËçˇá>ÉęçĄú1ü2)—ĎCÂ}“Ô7ĎKôcřdAmÖzH˝«aq÷Yé"ö¬]„ŽAWĹ…hňtVśW|ÓNçáȱČ*ř°­NŠÓŠďšiÜáÜ!‘cUńaZ<ť§ß4ӹør,r ľ,+G“˘´â»ćšw8wdXä|XVŹ'EiĹwÍ4îpî‹‚Ż‹ Ńäč­8®ů¦ťÎÂcUńaZ<ť§ß4ӹør*˝Ť~\ÂąHsN‚ŕA+ĘíoÍ›F “ϱsŕf–V?Ž~hi+Ô5Ť!µ?IĹÚ>Q;ˆëĆ×É;ŢÇŕZ¬Dďn•‰Îg ~ZŰ×;`OÖ!dF”ČN9łiŻî®/ĺ­Ź&̵{ç?ę.HtŤđ­ĂŽ)ů€ÚĂ%µÖŃŠ;›‰#uĽ®…­3HctRRíńĆKZÇŤ9¸Ř ,ł;ö;IQşY\sŢâÖµ˘¤’t°Ú_CwźTŮ›’•×A,kŢëŘĚÚ7ťŮ{.፳–[;[g.Üp9Ŕ6ÔG¨´.{dasŤÉFSĆ5oĘŘu…ä€ZO&Îd‘şM›u3.%†NÇšË<¬-Ěřśé f#µ×b뮲ĘýkYËIe%×e©mić]ßPh©˘¬»FÚ¦†RZmăŠWş•Né#Ť¬ «śâčé” j©+Îżaí‡>°7PK ~pŢ®ͨ!g’ÝHą‰ĽJňjŘ·Ůr3h:ţĎfu­őeŻŚÎö6ň)rę${˛\3R¤e$0ő­ÔWQ™"lŤh9H–)!uh{3ęc¦‹2ň·7kßşţ;©í˘’Q=óö[ä{Řđm¨×6Q^üf…Ëa›*ń“Ć$€Ët$µ|[IŇ2GC -€O ™Ů&¬šą;Öev|i™ÔD‹ËŘě‹Xmuv¬Šh!ŮĽfdilÍ”ţ ŕZ{çÄyřĂŤˇz„D@DDD@DD©wçŃý'ÝîÇmj]ůÁôI÷{± ďw»ăŔ˙â]čŮö¤YýŢďwÇ˙ĻѳíH‚?n=ţÔi™}'ÜŤ?n=ţÔi™}'ÜŤ1ŁgŮ ™}'ÜŤ!óú6}‘é—Ň}ČĐhÉçeôŹűEBłüěľ’O¶T/}? ˙y-ůOڎ˘Ň!˘E(‚J „R!˘E(‚J „R!˘E(‚J „R!˘E(‚J „R!Än;”áR";Ąbu´ă}Łáµ¨Ą§±Ť]PßĹF«˛łî4żo”ŻNÜŃdŐvSUŮOqĄű|Ą:vŕĆ‹.¨n’š¦ď•=Îźň^•‘d1o\ŽŢ[®¶śĆbŃńŘ“KGb¨¤´Ť!âŃ;bsŕĚĆ7ˇ˘E(‚J „R!˘E(‚J „R!˘E(‚J „R!˘E(‚J „R3»ř{Ź =‹Űű÷p•¨ďáî>ö,[oďÝÂW϶ůńzăt9»Sú5ĎžŃČ›Sú5ĎžŃȢ·ĺóĐđźdő óŇýţËçˇá>ÉęçĄú1ü2 ¶ë=$^Ő‹°¸ű¬ô‘{V.ÂÇ «â´y:+N+ľi§s‡päXä|XVŹ'EiĹwÍ4îpîȱČ*ř°­NŠÓŠďšiÜáÜ99_ŁÉŃZq]óM;ś;„2-WÝBç¶îսىîĚ4"7nďøv—%ŃĘK€»»´Łĺ¬pŔǰÖG¸;4–ŇśAÜ4AÓŠVLÁ$d–’F ´Ő§):‡HZ›BňîÚ[vAnflĎ s·Néů8TÔđn¬¶ŻÚşIcCĺyĚ!¦GşąH®…Ĺ’ú×[ą|Zۉr‡E›W&V4ÇÄq›˘şxi7Ď,NÜsb7â7śłm‘ź‡sѢćěkč®c’ßź«dk]—)tEĽGéw|ZîÎř »^˝bß_Ö:†Iu˝S]¬×Ö=Mzź•Ë—Yówńʵ113HĚN])$Ž(Ý,® Ť€ąďq kZŃRI:UeĹĽš˝\¬~ąšČ˛¸ńŚĽvÓKxĂľŹ˙ü…ÖĘ˙ä_>}™˙öcYz‹§I#ľ›Iů@q7.­ďí¶€µ·Šn«o ŽŽhšę6ÖâćŃŇŔDz”{ˇŤŹŚ“/Ez…ŽŢx®mâąŮᙍ’7Pбă3M ‚Ľř×gţ˝ř6yu:×Y®K}^}_ú¬ąőýţ72-]—×ŤÖ –Iŕ1ÇfŘ Îćę[ :ŕ÷‰™lÓ›X±†AňqČz§Ď%Ž;ĘÍ›VŔ $0UÎ4ĐŃ€©Â¤ $,XuľŁÖaëźËk­ďsůşćďqѡk·‹·ź­ýĄŁ:­q¦®Gőśľ |,4ĺĂU›>îâţüHń‰Ľ‚põ’:m^×2RüąsĆâ@v$q´:G4–´gĆŚwKVâx­­ĺąťŮ!…Ž’GPš13ŤN€Ľś¬Úw3HÉq©—%Ĺĺ¸eŘÔ>«iK"žY׹¬ÖeęůsR­‹M­ˇĄµÚ1Ţ>GÚČÝĘ]9Ž…Ö€(ď †Lţ{ĘVź5¦XúĹżXęşÖuŚšÍNa¬Ő×.|šr× ®lvŰB »‹kŚvâ8$cîÄ·m/s§l­kß3]Z6<3ĐoqŞąsŰmGC´lˇ×Íqxo„ĐÉ[ŽFĚ-źÉŤ™ťćYC+˛´‘”e⇤µĽ´ĽŚËgÔ#öăŃżíF‘é—Ň}ČÓöăŃżíF‘é—Ň}ČĐ!óú6}‘é—Ň}ČŇ1ŁgŮ ™}'ÜŤ›üěľ’O¶ĺ ]ç%ô’}·(^ę~ţ0ňŰňźk("%ćŻ1<ĄM‹3«§í ÉnPŻ•2…‰ő:|f~ Ó˛Şč(R=NźýĐ˝+w*ŠůZ¦yIőTě‹IŇž0Ħ‡yeł>Ż…|ĺz\eŹ#·“#·–DY÷WáVşUďcČíäČíĺ’©U=ŐřTéW˝ŚµĂqBËTŔ­GŞźöŻ’N”vK,™[Ľ…sŇ=U8Zé[ą‰J’(ˇw‰‰ŚĂHi:F´ÖąjkVťóÁŞŇgşň;y2;yeEĂÝ_…]:Uďa˘,¤ĄFV…Ň=Uq¶&%‰ŇžÉcR⮕‹z©˙XÇ‹QĄ˛†° t•uĽöµ­9´ĺŇ"#p•P¨DD@DD˘"˘eJ&EuaTĆwD]+­zÎËL÷NŘIĄg±‡)ŢJ¤,´ •uŹU=µ†:QĹŠ…2ťĺ–J“ę­Ů:QĆXhˇf RÍĺŇž¦ł˛ŃËý™ť)ŤŰXŃd ß4SŞě®ť}?Űĺ)Ó·$YµMě¨Ő éÁgÜińź#§f$YÄm•%­:BĚúŞçdNéOşš,™Ľ¬ >Ş˝•™ńŘF”öËcŽâj߼ł& źşż µŇŻbŐ»W)ŢY艪ݱňIŇŽÉk˘ÎXÓ¸¨c;‹µ}E'ŰâÄéÚ;ŘŃX‚4… ´LNŘśł„"”DB)DŠQ"”A™ßĂÜ}ěX¶ßß»„­Gy‹ź˘=‹Űű÷p•ŕ¶ůńzăt9»Sú5ĎžŃČ›Sú5ĎžŃȢ·ĺóĐđźdő óŇýţËçˇá>ÉęçĄú1ü2 ¶ë=$^Ő‹°¸ű¬ô‘{V.ÂÇ «â´y:+N+ľi§s‡päXä|XVŹ'EiĹwÍ4îpîȱČ*ř°­NŠÓŠďšiÜáÜ99_ŁÉŃZq]óM;ś;„2,r ľ,+G“˘´â»ćšw8wEŽAWĹ…hňtVśW|ÓNçá ‹EŇl¨ PŽ®ÁÎFńF©Ôq% )Żč[Ëgąismď­-€’\ŃĎ‘ůµŻ5«n" Ą0§ľĄmKí%q{ť(÷žůÄ·IĂ´vÄÖ ŰŰ^Ů‹ÖM cŘ$h{VµŔŚŔw0ŞÚ˛{:ł¤Ě2k&vjáMcÍjąŹ»l’FůžÖ™Ţf‘𧆷ŕ(jwwř߲'n˙‰ťÎâ--™xŰť±˛InZǸsńAĎĆĐč;„¬^ěÁqo·ź‡ZHÉ\űż$ß*ĂŽ,÷ {8ÍsÝJTĺĂV¦&'žńÔEâî6­ĺÖĘ•—7:×Oł!†ÜÂ칬µŻ’ň"Ílyžî#ě˝č!ż+byĺŮŰB-źµfĆŢFÇ-ŐŘOsdĆËŽfŤCŰW×Íç~Aęťosö‡:3š2@%®ˇe[Ľr¸Ź}#’9cl±8>7€ć=¤9®k…Aiyѵ$/K´ő;4>QÖň\XËw1šÇĆ`5t˛Ž+Aň5ŐÓŘűGiłmŰ<1DČlŁŠŐ邏Âřat’¶nůBç€öČÖŚĽaFşˇëť$ls÷şC–0HΡ}ľr´źyYsŰĆŰĎÖţÎŃťV¸WY#úÎ_ Ľ†ľ3cŻsłěů’ÎwŰBéťoq!ĆŇó$RZߊć`&A¨e‘í,’G?+¸®ré«čÔ|—/’+G˛Ú,l-2ClçO,š˛ĐÖ:BňrQŁ1-pĘÖ‡iŃĆ÷1ĎhsŁ9Ł$ZęU»Ç+÷Ő—ŤŹkßĎ+#mÔo{$6ÍĽ€ĂpâÉ'ŮaŲęÂipćá ‚[™w¬î6–ş{Q’é–·.&~Ş][˘‚|Ůa‡#Ü5®#7jPucŽ8ŁlQ426Ö1 5­kEhxűk‰e–wAq5Ŕ¶›kË %‡%Äxo‰’L5rH(ěŤkXń—. ílyě˘tńŰąŤ˛¸»Őěá¬Ú9^!ÉÄ ÎÉ ¦ł|¤…Y$Ž(Ý,® Ť€ąďq kZŃRI:^Oe Aątn…ö¤íÄ _óÁÄÚŽav˛L]™Ď ćnW;/cňčŚ[Ü6Fűq9ÔÉn-\Ý\D›vđÖć¨pw9®4ÖEĎŘXlČÚß3ĺŽŰ{«G+ŮnZ~SuA´wĘÔÖ« €€ RďÎŁúO»ÝŽÚÔ»óčţ“î÷b=ŢďwÇ˙ĻѳíHłű˝ŢďŹ˙‰wŁgÚ‘~Üz7ý¨Ň=2úOą~Üz7ý¨Ň=2úOą>bFϲ=2úOąCć!ôlű!#Ó/¤ű‘ Ôwś—ŇIöÜŞĄŢr_I'Űr,M§;ĺśGU*‰E2&©UZ&R‚Ů”ćXčS*•XęS2+%RŞ™“2 •JŞUMQŞTŞŐ*P[QTŞQJ ­JT«(A-*ʉZp ±P˘Ô^Ń3)1¶`R śIß+*ş‚h©Z©ÁÔ”˘„Ş "®d%ŞŠ•)ď ˝Rމ‚ Ô(ŞĄSJ*ů“2Ą…ó&eU/™MV:”Ş •JŞ""őP«TĚŠµR˝•Z”Ża|T¦¨,Š*@HDA!Ý… ŞĄQV®ň(ŞT ”QR„ ”QU(‚" "„Ş U,&e5Z­í_ĆpLDď„3…5Cp©@µşź´§-x(cr‚Ň4…Ň·_Sxß,Îśvl`E‘ŃîŽŇ˘őSR·ŚÇ“”ÖczJ©sFęłhŤł8"&w3?Ě\ýěX¶ßß»„­GqôG±bŰ~îĽSľ^ÝnÔţŤsÁ'´r&ÔţŤsÁ'´r(­ů|ô<'Ů=C|ôżF?†E2ůčxO˛z†ůé~Ś -şĎIµbě.>ë=$^Ő‹°€±Č*ř°­NŠÓŠďšiÜáÜ99_ŁÉŃZq]óM;ś;„2,r ľ,+G“˘´â»ćšw8wEŽAWĹ…hňtVśW|ÓNçá ‹‚Ż‹ Ńäč­8®ů¦ťÎĂ‘cUńaZ<ť§ß4ӹøC"" ‡5®ik€-"„Ah;dlĐ`YŻ1Č^×8ąÎĄs9Ç6nôwÇ{xĐ\ ¨ďµöĆŇĘŢâ9.gľSB@ë+éo.VŐ­Ł«¦ŤĄ S·=»ŚËŻkcigśŰD#2šľ•÷€®†ŤŔ0‹[jÜX7Soy$±ë2d’Vą] Řâ*íďÓ ­‹µ°´µ˛LŻŔ.|“© •ÁŮ^üötÔTĚqy'7|“™íÚŮŠěř:ńÇQ¶(škĐÖµ˘€4¬µ¬n ńóYa:©¨ZF°5ĄÝá#ub˝¸»ëpXŮş8¤š9f2ĘÇJĐŘ]2dd‘bíuk› hÇ·‘y[­ą´äŮ.žjY¶ćÁŇ[˝‘˝ĆiMŁ®\b™’ůÇVŤ{jrŐ®?'$ł_XÝŮI}<ڞŮňKnçćőŰmqq®~Ô¶6EsY‡zŃ>ź,sąľVÚ·‚AâŽi¦–ś éd^dí·5íµŚ Z]6v<=ńŚŹŽ[{Ţ+á†î\Ŕ: ůŃŤ8Ľ^6Fm ­©1u%ŐýŐ˝«rf|MŽ[§śÚËŰ Ë33(đ©B‰fm-Ąyy¨š8bd0µ÷9äÖn`Ę5o{]Hqť“q‰ĚŢÂ" ,o‚)%Žg·3áÍ«$š4¸e. ŃšWH5Č ˛1˛FčÜHkÁi-qc¨E0sp=U‘cŽ8ŁlQ426Ö1 5­kEhYĄßśGôźw»µ©wçŃý'ÝîÄ0{˝ŢďŹ˙‰wŁgÚ‘g÷{˝ß˙ďFϵ"ý¸ôoűQ¤zeôźr4ý¸ôoűQ¤zeôźr4|Ä>Ťźd$zeôźr4‡ĚCčŮöBG¦_I÷#AŁ!:Ů}#ţŃQR˘W4ľ‘˙h¨Ě9Ţ‹b¬<Ę*wŃ‘aĚíô«ŽéPfEN6úq·ĐZ(*ĺ5waĺ@Đ•u78î‚‚r…LÁMBÇ}*ĺ8)A•!Űę(”A`AĐT¬X‚¬żŰT]f U˘Š©@iˇˇ÷•Ş•ŤĆ¦‰MüU\ p¨!Al˘Š¨QNĘš˘Ę”JĄU žňbT„”ď¦PĄ ˇ(J(Ş®mäPŁ(DJ ")TEŃ@J˘ &#˛T©D˘e9”(.F'°‚ŐR±<ś0QWo”LN“TˇA™*Ľ%^! %V:ťĺ`P\¨UĚŁ9ŢA|Á*Ş7E;PMJŁ0LÍßAj©XĚŤµěÎwmD$ I§ ĹW'´«@1•vĽ¬O»C}ň‘i‰Ěl'nőc¤űĘCBT Ő&Ó;ćgÄÇgů‹ź˘=‹Űű÷p•¨˙1sôG±bŰ~îş4ćíOč×<{G"mOč×<{G" ů|ô<'Ů=C|ôżF?†E2ůčxO˛z†ůé~Ś -şĎIµbě.>ë=$^Ő‹°€±Č*ř°­NŠÓŠďšiÜáÜ99_ŁÉŃZq]óM;ś;„2,r ľ,+G“˘´â»ćšw8wEŽAWĹ…hňtVśW|ÓNçá ‹‚Ż‹ Ńäč­8®ů¦ťÎĂ‘p/.¦ŠâŃ­´¸ş×ÜĚÂöJVÜČĂî#Ęŕ#™rÔV¸ ď¬3]Ű[ąŤš@Ă!ŁkŮ4ŢÇ Ul«¨ ’ě˛JĐ\KŤ#Ú1uN€ą×F;Ůâ‘ń‚ŘžlçC#ËĆPęŕ@Ą{•IĎbN{•ÖVnqs ŤÎq©%Ť$“şpKYĚń8ČÚ XAnWĺ#ŤÂ±^^\Eq Ą¤,šâfI(ČbŚGŤ®ă69NjĘÚ »ř©Dakb ´±Ł(Ł´÷«ž/ظÄé+ßšç8ľ†Gqiś4A‘şŃĂ^}Çć[‰6|˛Ă-ë\ÂéžDŽŰu‘ŐčrNÖTÂŐ´¦lźŚÝŰO´ç[§5Ż{€2ŚCE hbşLŘű"8¤‚;vC6]tm…’d5nv†ĐĐčŞÉ&ϰ›]­¶†Nł—¬fŤ®ÖęűÍeG.ĺt.-×ć;‡9ĐZÄŽ’ZMĺ5SÄn ő’[v¶ŹlÂŽŹX(IŻ{›6ÔÚ7îŮűPE"ęvň¶y›3„‘ĎŐ„ăRC3F±Ľbćť<\1ÄVöđÓS#ŁČĐÚGr3’ÜĆqd\ÖígĂ$°_Ŕcž!éj%ĽidĆ@ĂäákÁ¬.Żš1Ć‹ź6ÝşŠ;ëDzHŮ»ŠÉŽ:ÚIm®Ä±Ć|ÇPóŽVÓ‹ßQÎD‹źbűŻîlfť÷MŠ'd˛† +3§c›äYrŤP#‹\N:)ĎVú+ł;őÓ[™®b±‘ş)»f";f´ Ť‘ÇYÄ'>S‹z\ť…´®/ť~.j í n¦HZĆ>ž5ĚcśC‹ŞHŕě­kšĆË’J]ZHă!˛śÂŮIsćGq$Ô’ĆĘRIv\ÇyĄßśGôźw»µ©uçďnvO»Ý`÷{˝ß˙ďFϵ"ĎŽńíw»·©Ä72şXť™C3 ÷ŃÉ+§yÍ(/űqčßöŁHôËé>äiűqčßöŁHôËé>ähů}>ČHôËé>äi‡Ńłě„ŹLľ“îF›9ňňúGý˘¨K‡s7¤Ú*™Ö'{,• UQCˇJ‚j¤BŞ‘Ş •SUJĄTJ*íĺ5r *ąťŘQWvd¨LÁcĹ*‚䂢§}T)AlĹN~ÂĄ…óo(h*iĽP1R Š˘ éÁQr”;ĄT§0˘ `ĄS2śĘ PpLÁ ®QUR(1LT˘ â«")P@LB R˘µD ¨.;Š ®„„éSJ) *ĄBŚB "U´ŕD@ŞUTŐ˘„A(˘Ş ¨‚ŔˇpU ‰Đ=ô}P.'yHDPJ(DŠ """ )QŠŠnâ‚ÇB($ ŐG8Ę ľm=…SŹëU›‰ď ¸ĐĄS9ťŐÇvdPM4¬yžF•Z¤ ÉRí‡}SŤľTdA“é4LĚżĄcĘS)A¸ěmîĚĹ‹mýű¸JÓ?Ă\}ěX·ß»„®­9»Sú5ĎžŃČ›Sú5ĎžŃČ~_= öOPß=/ŃŹá‘Lľz잡ľz_ŁĂ" nłŇEíX» Śç€ăˇŻźzF.Ź[ŹxöŰă ŘXä|XVŹ'EiĹwÍ4îpîY¶µ´3ŰŔćĽÉtóyr‘V±Ňî6Š5d}Ěntd7ĽuMK|7 ;ýŹĐCicUńaZ<ť§ß4ӹøqőČ÷Źmľ2«îcsŁ!˝ăŞj[๸ißě~‚KUöq´´ČĐ÷¸Ľ6YŢ0sŽ 4nĐm×#Ţ=¶řËQĎ™ĎkŚ®óŽ&†!«g)fhÜK©@qN;„7› †2ć4ćăŕ\I'3ŞkRąNؤ:ÔI|ć>9ڬŤv‰I%7Z» řnKcË+‹Ţ ¸Ü\[ĺ­(+–‹KhÂË١yŚ ĂĽî\ŕě®hiů@*cÍńŹ„ď3hü[;7f›93şms¸Â”§Ę;ď?)۸`§jlçßG¦Ań“IĽ¨vG3­ç·} 'ŤL)™·Ś ĚÚ;tŇ+ĂPťr=ăŰoڵ33339™HÄ5cŘ5¶í¶‘˛O Á˛Ë#›G¨%¬ĚÇT1 âwĘÍ>ÉŮ÷7NĽš,ׄ[™38~µąr¸es^30: \^?«ËŐCzĆGju„jő”âgĘę定,pŢ]˙§ë/2zÖ¬ţßÉÓU™Ýç§÷˛˘¬v5Ť¬ ‘®i.×6i›;‹€Í;d¸Öŕ]ň[ŕŠ"Ř»6Dcµ°5‘‰$ŐťH ŤĎŹ6Gąˇ­Łś °n8›®GĽ{mń–;™Yi/¬şllČÜą] hÎáŢŕ]Ř3>Ň·±ŢFüŽkÍĄD±ž3kB8ĚwzMhńN5FH Š'Í$mĘ뇉%5'3ĂqŃĹ`-Y.euĚ%ŽËlĐó0âç{ř˘6ă^..'A¨nć`p›­ĄÖÜđč {C!-p”ĆZÜî2ër‡f d5 ŠÔA°¶c\\#xccL˛–DÂć>°ż,Ttm-ČZ ´˘´›ÂPŕöČ[$f[®6V–jI•˘J=Ů0Î껎Z{Çä\7>vWXE5y۬¦WwŮ+—łJŕ«ys+í'e›µwNŤâ —+d-9{ě»Ó`‰·ą ¤Ň1‘˝Ő8˛2÷0SFG-s˛vy•ňş,úĚů˘{śřk "G68Ć×<9ŮmM]^ř×'\ŹxöŰă-w^]ëesDF°"&Ź|”9ňć!Ť­[@ÇxUů(ŘÖůnxhe•ň=óĘńnýtlL÷84<LE3PěË36mśw&é¬"JąáĄď1µď®g˛"í[\ęšą­ŐŘńŤpÚ]]·;o]ş $…ş­5«]ĺ—Fţlk R§ ·{[4®„ŰńOŽęžůCřŕ¸ Í m*hă—Ś( Š'Í$mĘ뇉%5'3ĂqŃĹ`,vVťV'5ĎÖÍ+Ý,ňŇ™äy©Ý'+EĐIŁC[SEŻiqvĚývX¦­2jbÔÓMsg¸–˝ĹkK™YeÓµ’´¸k—ŚŔă«s©”f,¦j3V ŢEŻ×#Ţ=¶řÉ×#Ţ=¶řČ6kőČ÷Źmľ2uČ÷Źmľ2 „Zýr=ăŰoŚťr=ăŰoŚaż\ŹxöŰă'\ŹxöŰă ŘEĄiµmŻ ×“<Ś€±=Ń“§E[‚ÍÖăŢwsô”Ö†Ń9„d5ĺŁ#ś3xÔ% ¶Łß ?\ŹxöŰă.-ćŇľ»ą•›2]ł„3:âG0™DśAĹŁĆ5ÓąşCGe\~ešňfm8mŕ¶€–獯¬Ć•2d<\kR;­räŘÂĺ7˙µrŻźó1gëĄčUöM¬Ö'Ë­Łžě„ąŁY<ň šŇhĽsöăŃżíF‘é—Ň}ČÓöăŃżíF‘é—Ň}ČĐ!óú6}‘é—Ň}ČŇ1ŁgŮ ™}'ÜŤ&ä©˙ěÚ+Íq^ł5í§éŚ éřXťčŠ«ťÜTű揍ڎŔ©Ě*•9eŚB°~úÄ×q—}ADXëMpAĐ ”D@˘Š)QT %Şj‚1J•)P‚µßLU"'•ß *•T+Ľ¦ŞµJ ˝RŞ•STŞUV¨‚ů”‡,jj%RŞÁN` ˛(ĚfAdU©J”Đ”'IP PM" """ Ž ŐvB E“0Ae 3&dT. µDjt`ď˘U°ER€€ "ŠŤüTgv§°‚ŢňVšhĆ^ăŁę­EwĘ †A¸*¨\ă¤űÁGö€)D;čpU/е%‹”U!´R€0DE¨”Q™Ł ŽÚ QUíß Ąŕč*Ťăü5ÇĐĹ‹mýű¸JÓ˙âĎô±bÜ~îşĂNnÔţŤsÁ'´r&ÔţŤsÁ'´r ß—ĎCÂ}“Ô7ĎKôcřdS/ž‡„ű'¨ož—čÇđČ7š?J?hĹÉüÝsµm¶l˛lÖîž±+IÖEë>|ť=–ő.Ý ›ś4Ęhi´˝•xKžbۤÔŢ6§˙ęłţZ ·ßŐvG§—ŘJş Ť%ŽŘ’x'}ÓL–Îsâ˙LÚUĚtfżę÷ś˛jvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh:¨ąZť»üŰÚłţZjvďóm˙jĎůh3ţ]ţ”ßMs˙ěKî÷aŇvÁúBĐŮ‘>ÂͶÎkĺptŹsĂXŔL˛:\­u)›}MëŻĺ n6ô®rř™.m§—es¶ ÎŐšëh˛éą¬cą™¶ł<ść’84|¦7s@ŻÉŮŮ>i˙ů‡Ř©©ŰżÍ·ý«?ĺ¬Ű:ÚkFÎg/ž[‰LÎsXČŔ%ŚŽ™uĎđ7ĐoŞ~Üú6}©Xy©>§HˇĄÎ•Ď,s‘­©RAy=ëťá źŰŹF˙µG¦_I÷#OŰŹF˙µG¦_I÷#@‡ĚCčŮöBG¦_I÷#H|Ä>Ťźd$zeôźr4»‚ޱ0®:Çý˘±SŢXŻ^ćŢÜPá¬vůXŰ1pě®sľYlâ‡cl™±ĹvČś>ßQŠČETŃ\ŠVŠs)ĘŁ*Jň BŠ) AMľ;JD­ßXč¨2g ťcDĚŁ1UJ ľb•TŞfč-TŞ®aľ0ßT^©ULĂ}3ŞUcÎ8A’©UŹ8Sś ˝RŞ™ÂŚč2Ő*±gě&±ZĄV,éś ËṮg) Í™3,9Žúgvú`fĚ™ÖîßLîßL úÄÖv îßLç}03ë k Áśď©ÎS6rŁ1XÜUŞ‚ůŠf*µJ µIEJĄP^©UJ©Ş W˛•*µ)R‚Ő)R«¦b‚ůŠUŰę•)R‚ő;éR©Žęp ľeč©U2g* ÉT@©=•`Ň4”«‚™B”@ j((Ę*Tf,śÇ™Ü 0®ůAČŃ»ÚQ¬ĹR§p*“ľPd37xŞşWť•AS +ď ©$šé(ÝWĄ©‘S(RĄA˝˙ĹźčbŸţýÜ%i˙ńgúرn?żw ]ˇ§7jFąŕ“Ú9jFąŕ“Ú9oËçˇá>Éę•-•äµä9¬ˇká}{ĐwŐĺóĐđźdőRé ÜĆ5¤44’çßo5Ţ ÖŹOV˙5ŁŔ“ŐżĹO/˝-Ýy}čůnčĐ5ŁŔ“ŐżĹMhđ$őońSËďGËwFž_z>[ş4 hđ$őońSZ< =[üTňűŃňÝѧ—ŢŹ–îŤZ< =[üTÖŹOV˙<ľô|·tiĺ÷Łĺ»Ł@ÖŹOV˙5ŁŔ“ŐżĹO/˝-Ýy}čůnčĐ5ŁŔ“ŐżĹMhđ$őońSËďGËwFž_z>[ş4 hđ$őońSZ< =[üTňűŃňÝѧ—ŢŹ–îŤZ< =[üTÖŹOV˙<ľô|·tiĺ÷Łĺ»Ł@ÖŹOV˙5ŁŔ“ŐżĹO/˝-Ýy}čůnčĐ5ŁŔ“ŐżĹMhđ$őońSËďGËwFž_z>[ş4 hđ$őońSZ< =[üTňűŃňÝѧ—ŢŹ–îŤZ< =[üTÖŹOV˙<ľô|·tiĺ÷Łĺ»Ł@ÖŹOV˙5ŁŔ“ŐżĹO/˝-Ýy}čůnčĐ5ŁŔ“ŐżĹMhđ$őońSËďGËwFž_z>[ş4 hđ$őońSZ< =[üTňűŃňÝѧ—ŢŹ–îŤZ< =[üTÖŹOV˙<ľô|·tiĺ÷Łĺ»Ł@ÖŹOV˙5ŁŔ“ŐżĹO/˝-Ýy}čůnčĐ5ŁŔ“ŐżĹMhđ$őońSËďGËwFž_z>[ş4 hđ$őońSZ< =[üTňűŃňÝѧ—ŢŹ–îŤZ< =[üTÖŹOV˙<ľô|·tiĺ÷Łĺ»ŁA %Óf xhŤŔ—5Í.e;ŕ7”Ǧ_I÷#FşMfG†Š´¸¸ťŁu­đ’=2úOą>bFϲ=2úOąCć!ôlű!#Ó/¤ű‘ ŕß?¤ÂV˝Ĺń˙[?¤ÂVW9ß, `j ;*âWîĐđüJŞ((3g§Í®ťĐ˛¶bwťđö–™iPPtÚ¤BŃHšđâ¬&aď™ÂB`mĐ(8,aáÝäžńĂáLň V„n”VJĄUCë¤SMAС…ŞŠŞ*˝R޵J ˛©nňU*‚©UcBŞ[Ľ¨U*ŁAjĄUj¦¨&©UJ µR޵J š©Ş­QŞ•UDŞUV¨‚ŐJŞ©ˇ(&©T ßV T⬉‘Zĺ4*Q2$`¦Ş©Š U*«U(&¨ˇB‚ŐˇY(Şžú "ŞU‘EQčQTDR”%X­Q¸‚\¤%T‚Č©ťA Č‹°ď(.qÝL ŽxtďB÷ŔTĹŞ f%8ÇFŠqÜ@ĘwqRh‡u($î!ŁNďeZEŃPż˛‚ىV}bÎwf%Qš´Đ‹%\(7˙řłýěX·ß»„­?ţ,˙@{-Ç÷îá+´niÍڟѮx$öŽDڟѮx$öŽDňůčxO˛z†ůé~Ś ŠeóĐđźdő óŇýţ\ ŕĺ=ŽŘFčwé Y×¶Ě›Pçő '+‹çw­t€dkŤE5Äo…b¶·ă8۰lĺ=ŽŘL§±Ű VÖţÖîš—;ŚÜěÎÇÇťq™¬ks F#|o«şęÝąęújäd/Ŕá$™27FΝâyf¶‹Gf6™gĘ{°™Oc¶ŕö5â 8iÇ}®ˇú˛Čś§±Ű Ż-Ťą¤sZÚ†‚\.!­t’h®oć/čwŢ…ß’,Sß[Űeë7 =rëZi¦b4UWńK!#˘7‘k›;5­ĚÜ€—TW ´Ĺj4ď1­¦8Äp2΋ vŤŁˇuĂnŁ00ĺ|˘F–4áuh4„vŃ´l-¸uÔbś¬”ČĐÇp­‚ť;ţ¶ßË»·–dXşőżXę˝aťc™Î5š3w•®ŚSŻ[őŽ«ÖÖ9śăYŁ7yZčĹ9-úŰńćÝţĽ|TGÍ«cž÷ĺcAsśă@Ä’JśďđŹmdB*Owłî'l,'(tŹ ÓJ¸Ťä†î)Ĺ`ť˛Šf«%µâťö‘ďymŽlO/lEQp ®„<ëÖ˝ÍÇĽ¸4×˙‘\ š_Ëšćă1ĹŽď9Ą11ľ'łç¸Y]rĆgĎ(n­ąä«©•ńťĽ8§ÂłfÎ*Çć–’ qiĘáďDÄďŔ"śďđŹm3żÂ=µ"ŃÚóÍvŻŤîkşÔ 48ČńÁ Z㧇H ySöăŃżíF‘é—Ň}ČÓöăŃżíF‘é—Ň}ČĐ!óú6}‘é—Ň}ČŇ1ŁgŮ ™}'ÜŤźż?ën=#ľ€{đ íǤwÂV «śď–dŞUNU!Š ×ŞśŠC ¨˘ľ@™"ŠCś48…9e*äH{«ß$“RqQB”)ŤĆY;ŔÄTv–A;Nś˝ P Ú°îŹ…Z«LÔ)cË]†î•Ý{ UKľ;JDŁ…JĄU3J¦Ą“Z”©ŢA9BŚŞj+”¨WL{ äQJ±…ňdB)˘Š …8¦T ˘©V ßJĄJ P%UjRĄAj©UĹ1AdUĹ1AdŞ®)R‚ŐJ•Z”Ş T©ÁV©Š Q(Ş SR‚R޵)‚ U*«@žú U*«ď˘ ŞUF jT©LS •8¨ĹF(-ĆQŽú®cľ•qAl7TUˇ W´&E*NU`ÂtšvµZŃŽc7 ®(.Ńą^eÎÚTŢ 5Çp Ě˘ ,&Wn*—WI%03:FŽĎ©—x,uL\Číú*™ľˇ0T ‰ÝŞŠöŞP@'yXWx¨©V °*ÁRµě ď¨:_üYţ€ö,[ŹďÝÂVź˙ =‹ăű÷p•Ú74ćíOč×<{G"mOč×<{G" ů|ô<'Ů=C|ôżF?†E2ůčxO˛z†ůé~Ś 27C¸?H\ůMÄ—ˇ’ŰHűhÜÝSšcŐ—`u˛H×q†ĺÜ͉˗{8i :_P=ŕ_đ5JŐ/Ë38‰ĚcnvwĆ. §Caкߨ5ĄĺĺŽÎń Ł5ovbjią®e˛‘űE’ţťŮd•¸e2DÖUµÄ»;Mi†­˝Šo˘é:ö›M±ZóVkÝ÷N{{ӦʺŽKgLÉ5‘¶ß+ÚaÉcŽ6É{šé…\×qYĹ5Ň*â˛Á˛îŘŘçqZč˘xŁpŠŃÍ|/Óňť°Ň5×"í"Ý˝f¬íĹ#wg ÉË=Çąä{eÖ¸y|LąłD÷ČÓlŽ ktŽĂomö2=zĆ45ŤÍkZ(€MkßZ2öŇ[I k&nG–éˇÓJî¬kkßWňÄm™ĹwfřXŚ5¶tr™-ŚÂőрƲ"řĄ-.12WÜÖŚÎ5ă7‰ŃM"${BŢ·.–Qx#·0;UÇ|Żil‚,s s§vňÍη՞‘2Íη՞‘jž˘+XŽ\âbŮŮś×wfďë&«á5ăŮ=ŁŔĂé"{s;¬C# ŤŮćĆâNŤď¨śM ‰Ř÷Ü>î d0Ä÷1Íc⣜ŠGPîÁmząfç[ęĎH™fç[ęĎH‘ę1Ż/ŰKf?nÉÄŰŕaŁ tw˘+S1É!ž)"-‰ŮŢçÇ#ăiq2Óĺ»h)Ł áď;Jѱɯąwęß«S [&·.A‘í®šá†4 ©–nuľ¬ô‰–nuľ¬ôŠFľ-ÍË·–#~ů‰ćĚěÚaĂżmüóĎB@éŰ<.,Ć<š™nÖ˝ú™Á‡ŠĐEhO}[mÎ-ÚlşĂqąöîs.Ą’Ijî#Ű™¤P´SZ p˝¬łs­őg¤Lłs­őg¤[ŹUř}›4ű3˙N6ö'.öŤĺ˝ěłŰ5. řcŁâf¦qÇ2ZkP+”wVµô{A˛Ů4΀6lĹ®qĄnK¨Ű]S«›VJS6]|łs­őg¤Lłs­őg¤XݍÇŰYĺ®?Îüć6.FGv٦3ľČ›<Śdڑч]–çËtuÇ=;˙”–¬ťŹ· lďŚË!dĺk®%vąň÷®âPä—¸jhîŢYąÖúłŇ&YąÖúłŇ-Ď«™Îkż§˛&7|{;6'+GhÚË,ě'tŃou¤Ö6»Y‰§jő­¨ůNoŃ™»MŇÉ4`:^ŻHĺ—ëć§y$l&Ż.·‰NĆeÜË7:ßVzDË7:ßVzEšz›V±^ZĎ/lďůçłg‚Ě9ǵrÎŘÜě, 5}OZsžÉMČłD+ň@“N íÚy®ÜŮ&×eąË#–™2ɨË!“U^ňš¶ç®ź”Ws,Üë}Yé,Üë}Y鯪˙JyqŢś®nÖŹUihĚÎy–µ{Í\âfi$ţˇ€Đ ޵n¬ŤÓ#d“#–9›–?•ŰZČp¨YňÍη՞‘y¦s9žÖ—ELłs­őg¤Lłs­őg¤AtTË7:ßVzDË7:ßVzDELłs­őg¤Lłs­őg¤AtTË7:ßVzDË7:ßVzDELłs­őg¤Lłs­őg¤AtTË7:ßVzDË7:ßVzDELłs­őg¤HËxqµůj\2µÚ*ď öăŃżíF‘é—Ň}ČÓöăŃżíF‘é—Ň}ČĐ!óú6}‘é—Ň}ČŇ1ŁgŮ ™}'ÜŤźżţ6ăŇ;áX+&Ńu/î=#ľ*ąÎůe9аrĄJUA|Ęj±ŕ¬8TT̤2»Ş ŃŹa2šŞa\p*iĽUJĄňśČ-E ˇC\­Vť=µeLˇ^FS‚ĄŞ(UřpL©‘J&R4+QX{ ‘Lď Â@tŕ­“˛Şčű ‘lęśwę±d;‰WF_y*<ăvˇ[·DEZÓuNťÔ•Q†úTo šĄJaľ•*TUEB bŠ*•A8ĄJŚÝ…5&¨˘ˇG cľ ď(Ĺ ®´TŞŠ©Á¨Š&)Š JöTĄPMBUT•ŔAzĄV=hP%÷b*,ZÓĽ…Î;´ě˙ü ĘH“EÁ¸kŔ± řň “.𪮴ř=ÔĘ”ě k©ň{ŞEĹ>GwâUʱ ĎÖŹÝř”—SCżZ¬g9Ď5qŞ*j¬Ý*Ś™TŃRĄ1P_Š•hTĹ(P[0Q™UMBT(˘°jŞ°ÍĽ¤¤Číĺ*Ŕ˘ ˘¶BţFßbŸţýÜ%iá&ômö,[ŻďÝÂWhÜÓ›µ?Ł\đI퉵?Ł\đIí7ĺóĐđźdő óŇýţËçˇá>ÉęçĄú1ü2 ?ÎĂôťěޱmöěŰ']ş'Ž2L‚&µÎkiß÷7»NY_çaúNöoYx Çs˙ ¸tôykŁkâŽAÚö—ć$ęň۶ĽbŐ´E©<ŐťÓ˘¤zeôźr5uHôËé>äj©űqčßöŁHôËé>äiűqčßöŁHôËé>ähů}>ČHôËé>äi‡Ńłě„ŹLľ“îFÍív…Ŕ˙Řď…bYv€˙ü…É˙Řď…`Şç;ŮX)TĄTÁM7ŠĄT °$+g+!* Ę2ąT¶š;J ©ĚPH$&…Şş1 j ±ŹaQpú+µýĄŠ‚ AśĐ  uUI 0*jŠ …%T Ь‚ÚđŞÔW Ş eľi@4цřW,ŢU-včUVkÚpv^`!3Ľh=µFbŐXµŇ 8v0FÜ6´x-î«Ë=›|D@řÝŢ‘Źg4ě¨#ŞP…-TU¨ßDEZ”©AdŞ®dŞ U+ľŞ•AzĄUj,•UŞUŞ™ŔŇVç® ”Ě7ˇ‘ĹUHŞqÝ÷•qă)hTŇşT@÷’€p)ČhŕM ĐźˇHyáě(ŇN;¨25Ú eX»!GqĆŠ`dsp;Ë ¦áŻe 'ęö‡qUp)ʬP®ŃE*h"*•R”PET+QMVŠŔ˘ś§y҉•TŐ@R‰Ů‚p˘ ”DAŇÂĎôěX·ß»„­1ü$ţŤľĹ‹qýű¸Jď›sv§ôkž =Ł‘6§ôkž =Ł‘üľz잡ľz_ŁĂ"™|ô<'Ů=C|ôżF?†DůŘ~“˝›ŐßMX­;íĐNëw•çaúNöoWy¤csŤż—uľę ÄĘő‰+ZĺnšßIĽłä{6ŇćÇ(t„C[Ő.Wo ÎßX#§X’”¦Vč|©7×FÚâ(m˘‰Ć®ŤŤi aVŠ`ĎÝ3mçÚd×c%ćXc†zjňKŐrJfęůĽŮ¦k+ýˇ]Ao{ýÄ‘şâé¶Ö‘ľŢÉ–;‹—:čż3¨›(8­«xĽVečuČ7Ďi:äç´ÉĘvÓa¸ŠŇKąckčŢ!Ľ…ÚÇZß‚[’YO±RŽË›-vźIc–·÷6ě3:ĚC‘™ź$ŢUÎť˛†É3žîőŚâÖM1Çc®Aľ{I× ß=¤Ůc»c¶˘lŤt›JÍÍ-ŃRĹ’‘M-Ę×n`kşą{. ݬ,“ŔcŽÍ±@!ťÍÔ¶uÁď2٧6°c äă/M× ß=¤ëožŇ~×sˇ¸tÖN¸nŇt!±˛8]$–bšCŘĆçsŞCŘhę“ ŽMü^Q´Úé'|ŹŽő¦Ů°Îć:2VŰ#¦ęä‘«óQë+żhW¦ëožŇuČ7Ďiźs6÷[Ľ|M×?ŐjˇÔÉŞÉ–^©ĺf›ŞsgĚőÁß´+aZşţĆć&ßhőŃćŢëň:Ůч‰|¦¨Ý\ŢOŘëožŇuČ7Ďiź°üSWiÖ:ßâ?čµYµÚ®Ż«·ëZďŘç®»ÎqëJ|…ą± Ľ·ü;XnX±2_u‡Ë-.[Őň®sµnăÉĹ®÷§\|ö“®Aľ{H9»{gZm8ßivĚѸÁĚpĐöÂ>#‚óŰň¤+‹‰ś..ËdlrR‚8č@ĘĘpŇ}áşOwhMµdşs¬ă¶0PşidkÎŐ¬…ŔcŮ+Qăo˝ŽaŠĘŽM6îË ĹůzÎâ÷bşfdCYjfl‘™c–1akXŢÖÉĘM ăcL¦­$$6×ŃlwŰO ޏ˝ŘööváÉA3[p5rÓ>¬·\Ŕ]!h8ś(@Íł-6®Ě·ŰÜŰŃ͇XäŁă‚wepž./’Żz·:ÎŢţfÓý¬źňĐwpúÎŢţfÓý¬źňÓ¬íďćm?ÚÉ˙-m»çv_˙–ď˙Vĺr.¶]ă®…Ě%Í©.·—ď[’łiÝMlűË´†PČ |nsŚrCß>y0ň•ж‘bf'18p^ŮĹóxőEĎ mxň:‡pж¶uŽŃŠMmĚŕ0’E»ąâł2Ŕ7işđ—W•»ŕÖ§Ľ¤CVĽÎČť† »ss ‰˛ľt=„W{urúŤí­±‰óG4™Ľ›Ţ Kđ=ţ‘‚é_Ă4ĐŔdl‘HÉh:ąň*·ň¬ĐÜ]ŮË ědR8ĚŻ/0%ŮNŇL´ÄĆÜF\¸-6…ĹĽ"ŢxÚXçk.[SCSäŘ0­7×nI-d’^2{Kc¸µ·† XŁxŤˇ®ĆŃHßZ«ŘĂ%˝ś0ÉMdl vSQQĽH á-iťňµËÜČ^ćim+LHǸĽćŇ–9†P(Fş˝3cc^çĆv’µÎĚł2‰K8ŔÖ›•ŕY™uŇÔĄkjÚ3ÍýaČŘ;*[yurí[ź]\^d®ŽŰČ,ł˝ŽxcÚę7pŤťÁU´Čć{1‘ĹßW•‚Fd" éˇ˘—ü-8Ďto—?öŤ®;¶|W0B÷ 6đ’"“Ă â7J¦Ęٱ:y‹5° íozň— öŐuµR5ŽŽ™ÚúÔÔcľ±Ak$1GmĘŘ€k*AŔ/ WZ'5‹WšÎ6řů˝S«[hÎť­űf˝“^Ře±…đFö?Ă$ń@¶U^[Ç\=đ{*ëčEďx‹ęF/oËĹঝtëtük˛3ŔTŹLľ“îF®©™}'ÜŤVŹŰŹF˙µG¦_I÷#OŰŹF˙µG¦_I÷#@‡ĚCčŮöBG¦_I÷#H|Ä>Ťźd$zeôźr4whő×‘ß Ö!mߏőłúG|+^‹”ďźTEj(!AŠŘZ)ĚFśB Ge*+Š6‡B©ŇPZqA¸*ElŘ ­™k¸T‘Ů,2ąWźŇ o…lŐŔŞ, t©XĆ Ŕ¨'¸¬;ĹF(­ •!\ŕ±U"ˇâÓľÁ¨TްPHLPU "j•P!ÍŐBҲ «+Ŕ¨"P«â‚ŇFöČĆbiŃ‚¦i#4©§qfÇuAŕV˘ó۶ ,ÉXöĐ0Äď«]4Ţí-G4±Ř Âł6f`jwô%«Ű\ĚIą1ܢš‚0Đ« ¬‰®ú•JöMBW°ŁÁ×°• ŕŠ*•A5SU Táş«EzŞ‘C‚B‘ľŁ˛§˛š©®î…^Ęť'˛ťŁGéQúPNíSy=ÁF„˝ÝOŇŁU. b‚Îu;*ĽăÚÖ—hĐłµŁłş›…[ Ů(¬•śŠĺ ”)ĹFPŁ*¶„AQEdAަ¨€•@ Ą°ĄB š˘&”ЉT1ü$ţŤľĹ‹qýű¸JÓÂMčŰěX·ß»„®ńą·7jFąŕ“Ú9jFąŕ“Ú9oËçˇá>ÉęçĄú1ü2)—ĎCÂ}“Ô7ĎKôcřd@ť‡é;Ů˝KÝ h´;\Ä·{yĄCüě?IŢÍëvŐŚtdą šîŽŔB¶McžđŃVµ 4—wĄÇt ő•lO“@ÇZdŤÎ-udŚ×.’ \E~OśÍĂq´v=¬§[3‡ć¶˛eČN–ł0iă{ţňN+™îú“Ű3eT[6ww°6âÜ5Ěv*Óş× őźU€ŢĐR&'l,Fc19‰sŃt5Qř íŐGŕ7´ÉĘç˘Ď´a­…Ć©ŻÜ[© ”+•„µô.ŃZW{Ć|÷öLµ·†k'“\4®•Ó9ÔĚŕŔÝkó»Í娠;í ë§Ł:‘šĚDçžäťŽ’.†Ş?˝ š¨üö‚ĺ•ĺsŃt5Qř íŐGŕ7´'+ž‹x6ňĚ‚ N\(kˇÔˇŃî¨VŐGŕ7´Ăž‹ˇŞŹŔoh&Ş?˝ ™9\ô[rIeÄr>&=Ĺ­k\Z /¨`řYM7č˛ęŁđÚ ¶7Ćóz.†Ş?˝ š¨üö‚dĺsŃlÝDZ,-ŤĂXĚąłFMĹ b7p ŇŻě箥ŃË–™˛ş•ŃZ)ť¸k§<ĽŃ¶;{ĽZhş¨üö‚jŁđÚ ĺžW=CU€ŢĐMT~{A2rąčş¨üö‚jŁđÚ “•ĎEĐŐGŕ7´U€ŢĐLś®z.†Ş?˝ š¨üö‚dĺsŃt5Qř íŐGŕ7´'+ž‹ˇŞŹŔoh&Ş?˝ ™9\őHôËé>äk~áŚ8†€pÄĘĐŹLľ“îF„ÁűqčßöŁHôËé>äiűqčßöŁHôËé>äh„>bFϲ=2úOąCć!ôlű!#Ó/¤ű‘ ŕŢ‘×gśwÂVeżţ6ăŇ;á+ \tĆŰçĹ™ (ŞFúČJŚ  Ş 7–LˇT„ČÇ”Ť *˛ŞĐ*ĺUŔ¨8ií©ĘFŽŇiŔ  ‚˛‚1X†n+Ń4…R(¦¤iB€ (ŕR¨U«UM Tšý¨ÓP…A•ÍŠ: ¦*sÓŰApęiĐ­o¬ Ő ăhă8Tn|IŚŚáĂ} Ö×CŁ7żŠ‡\Eô˝ďÖŻ%¸J6‰n颩 vxŁ®áF4ŽÍR“%˱Ą=ŕ4+ÓžŮńVÉ'p*cşV,ĂH. ýaÔ¦¨áŹoŢW’{§âe–…(ŕ°¤ů,§lţ¤¬îŔ»(÷o'$öĚ@´ĎnZnV†˝˝é…@š¸öVLÉ3ź%fš44 é­PšŠ«TŞČ°&ź©*Şâ”TŞŠ" ŞUB •8ŞĄP[•U©J”¨EZĄPYj™[Bźusď ¶„Ń‚ŚS]¢©ŽňPď""ż–ł6ť CĽ­Š*ŕ€S™c©RJ‚äŐ* 7}Z€(Ä MP `•@ J¨5A8 (˘$ E š"iP‚S ©@DQT•P•AÔÂMčŰěX·_ß»„­&˙ 7Ło±bÝ~î»ĆćÜÝ©ýç‚OhäM©ýç‚OhäAż/ž‡„ű'¨ož—čÇđȦ_= öOPß=/ŃŹá‘ţv¤ďfőiö•ľÎµÖÍ$l«°lŽ-.”1Źs©Q *żÎĂôťěŢ·mŘÉ |r4=Ź%®k…AP‚ ±ËćĚ×·–q?ĺkż˛|X›´cÖ€÷Řă« uušěúĽ­,ĚÇŚxŮOśm<_#¶íYg´ć†6DhřĹmŁiL¨Ţ]ˇł-6<—$ąĐÝćľGfpž=dú˛÷9µkĂhĐćľ®ˇp4ŮvžË’é­c&ÖÍ^öĚA{\Ö86hxşÉjÇbÎűInśUő>ž&´š[š·üm1Ë·§ÚĆľ”jéĎ,bôűąsľ;q?áĚŘ›QŰ:ëŤNŻ1kf®ŕŠTńkďŻp¸[;ňÄVŇÇqq)–HË^Ö4e`xÇĄÔ:4.ęóčÖŐ®-đ†}5/JL_áD]]Ú{VmUŚŚkős\RŢÝŐĘuły6tŕNcLh \ý‰f`ż™Ž/s¬í­í\çćg Ë#b‘ÍĎ”fiĄwtP6ť™ŁÖÂřł:=cKs°ĺ{s fiÜ#qiɲ-Ý PµÎ ‚á—Qg%ĺŻkóżs;5]ß‹¸ď§©XÓ¶śĎ/<íśg†Öf6ç}„D@E† »{‰&Žçu»˛J@9Cé\ą©”‘şĂufVbbq1ŹŽ h-c‚8ɨcph?5şďn㤕2Í-ĺisX ăHŕĆŚ7Üŕ®°Ďioq$2LĚî·vx'(})›-r’7 n+lŢgż¶OťŢ͇hÍoq5ľ­ń8gslşĽšŔřśH-—.5CCĆÜ‚9™-ävfI tB¤ĺ`Ž6eÇG®8o¬Č¬ęZb+;˘1Ănv&DXQc–Ţ ©­`qmr8Ž3kş×iiě…‘bf'18žĺ!¶&¶b s‡Ę§Ę¦®šn+˘!3™Č‚" """ """ Ĺsć]ď|+ź™}'ÜŤt.|Ë˝ď…săÓ/¤ű‘ŞĚź·Ť˙j4ŹLľ“îFź·Ť˙j4ŹLľ“îFCć!ôlű!#Ó/¤ű‘¤>bFϲ=2úOą˙ń“úGü%k­›Ň:ěăwX˙„¬9W ß>,Îô¸›ŞÚ váD]A*F…W7t(%Qͦ#Fň°%FjiÁQV»pŁ…xPŤĐ˘ŞŞ¸î«†hTSt °váRFňÇZ« Ő5¨J‚˘ť´ˇ'aQ`wB¶`™Ç(íś4ŕEjEGÂŽ!ŘP¦c;ZŠĚ¬ŞkĂŮSĂŠĆĆe$·wqZĄYÇgÍ”7Ĺ›Ą^¨‘3îŤíŇ0ßT[eQĚiŇ=őÖ5xÇ’`ńNôďťŐťiş"1n#şĄ“><#x©jE¶ÖFŃ• ŤťŽÝĘ{*ëśÄĆřT)B˘ˇA5EěĄPMTU*ŞHE©Ĺ*‰D T⢨‚jRŞ*Ő" E‚QB ”P&ĄMJŞ ľnÂśácSUó…!ácŞT ÍV© R©ś•9– Ĺ3”ŔĎ‚š¬CĽ¤=L Ą5‰ťđSUŹ0Lŕ"/TŇ«ś(΂邮`TŐŐ*˘ˇ*H)URR¨.ŁJ®eAj﨨U¨JŞ®Ă›Ń·Ř±nżżw ZLţoFßbĹşţýÜ%vŤÍ9»Sú5ĎžŃČ›Sú5ĎžŃČ~_= öOPß=/ŃŹá‘Lľz잡ľz_ŁĂ"üě?IŢÍę·ŰOđŰ#2şwż,Mv#p¸‘PhvŠĎó°ý'{7¬Wf>ţŔ[šâÖ1ZT;(sq v}ĺťLňĎ.öoÍÉnOËxv첶km©K‹k‘•ĹÍĚ"4 ~FŃ@Hn;­ÇL۲ň3yŐĺëvÓ ĄĘN¤ R –8‹Zr·Ő™FŤČÝ;˝‹µíbu̶çQÍ&W1Îh*Ťq¨ßŢŇ˝»b˛»Ž;†±Żd”ťŽĄ3gŹW™Ă Ö7SŚ»z{ęičbńÍ[Ú-·ňŤĽłňË–o˙ł;8ďĹ·ďj]íílĺšV§k䊞Çs x¨mXEHĂV«ËM¶¶¬ôĎtń–´ČDzwőyjşŇ[Z[m ö}Űf6— 1ŕ™#Ś´»Ë<»3˘Čܱ˘Ť‚ăí-›>ÎźU/ŽĆ)F‡Ź×ľ—ŐVŃ1jç§hŮŽÉí‰đ–=djÖŰç“»żtĎ‹Ö~]ţŤo˙ź´ré/7ůWiΔŽ(/@ݫۧ5úô‹ZsJă˛1äíˇh¶•qŮ_Ś Ą€Ľ?€@4ˇ¦–č:=Ő*ȶę"" ·°Y@f’ c3>G»˝cşâ¸»OŻJČÝum ד9Łgě×;Y X]3ćĚčÚó–ŁE…4’»ÓC ń§ceŤÔĚÇ€ćšІ•«víź Ç[šŹĽ·˘¬™\rů8‹©™îâJžö«ľ…ⳬÚűýcł3ůw3hďf˛¶6°‰e$6(ÄQ´Ć0S|ÔśIฺ‚Ů­tďµî kŤiďďh\ąż2@Ç…µË$1çĚřluÖëáGaCJîTŮA´gšÖęńŃ\DćşPK@12ą­`ěe'ú§Bĺ«Í<Řç¶ÜxÎýŽúzYŽ{ýşqť»ł1ÄeĐëĐn 7ؤsOd9¬ ŽČN»ďY1;Ú™§ŚŃŁ˙âĄl"ĆŢ1äÎiúŰ˙·ý#ľł‘¬s'ډ Ć“‡‡â0YŐ]nÍ™ ç_Pfăß•ŠÉÎu¬y‰qh-ÎqÎKDźů›ßM»¤¬ÄÚąŚN6íŢΊ°""" """ """ """ Ĺsć]ď|+ź™}'ÜŤt.|Ë˝ď…săÓ/¤ű‘ŞĚź·Ť˙j4ŹLľ“îFź·Ť˙j4ŹLľ“îFCć!ôlű!#Ó/¤ű‘¤>bFϲ=2úOą=´?ŽźŇ;áTkŞŻ´úëŹHď…an•ĆŰçĹ™d4:U˘ă˝5ěQ&ă‚Č+Lw”5í¦•%Ŕ ŠŁNęŚFŚB©Ň®¨áLQDě  ©˘˘§| 4R „R¨ 8T; ¨M4čPâs⣦:ŰY F&§t­XĆg€·(ő"+ʉ™”ŮJ¦UpĘ‚@$Rw†…ĚQ(­n`¦ŤJdP)ˇŢS™ˇAxÜS0Ľ¶ŕ„sZí"ޤ¸é4ŕĂőŞäŻĘq÷Ö˘cŠňĚoCŁâSuş;!Q’˝¸ FňË“‡¶UĐDzˇŔÔ8i…n·Ů1m©llÂÍ}Z ;ĘI žúś8˘Š¦e˘Š¦ť=¤Ą¦BЦ¨%+ŘQR ś\R…‘WĹŃW}J(•D ©Ş„A5J¨DTŞ„A5J¨J šĄB„A(ˇŠA8¦(ßSU‚jB •5UJ µTćUŞUł&eTA|ĺFeZ˘ fQR˘¨‚j•P”AŰgđRú6ű-ç÷îá+F?ŕĄômö [ĎďÝÂWhiÍڟѮx$öŽDڟѮx$öŽDňůčxO˛z†ůé~Ś ŠeóĐđźdő óŇýţçaúNöo[Öžlý/Đ‹üě?IŢÍëzÓÍźĄú,og\M‡w Ülg˝®šŐůa{@ň±5­ p tŚh v›´+/ćKÇ[lç1€ć¸:¬ÔŔ4Ž64#‡th^.)ŇÂXö8A5‚ćúŵů+zĹy˘ys<'.ŢŁ’ŃĆ˙‹ßmNµXÖ5ďĂ;Zřčl˛µÚXâŃŁĐî,QŔÝŁdűKö¸˝§f]h;Źâ1ŤÓPŇŃBX6ÜmóE˝Á »hŕş;;ăß‹_Eumw-ě&yѶ8¨ęI{šÚ885®Ń\ŽÄéh­mm®ÉŽYěž?áęÓµ5´ń˛v}Ľ{ë.t_–.bÚltreµŤÂFÍxĘj”ü®Í)»Ř^ťqˇÚÖNŚm2 ¬Î'ËŚiG´w„7‹ŤI4ur´Çćx[>ËmĂ2¸DćĽ?I,ŠFů ¬ňĆťm5ŚöąŰGŰÖÖ¬sFý“łggÁ·q·6]»s:Რkb:ÂiąĹ¨ý&çów|Ű[}쏔öęĆřËÍ«Á·¶Z_#ÍĐĽóŻyŮ<z­[lŻŰá˝ę6wć~µJ74g0Íşr(Ý'I˘ď.6Ĺ؇Čng{dź)kZŃĹeN$9ŘÖś«xO=̤[˛Ů˘†ă—¸óT4âďšă…0+˝&Ń_ż|˝Ţžş¶¤Î¤Äc¶{#ŕÚsšĆ—8†µ˘®qŔ7JÔ–Ynă|vĚ:˝â÷C\‰ÍkÉť!emśÁďij)/!ÚjĐě˙ :ŢŮîv‰­g1÷O~Čů4ě¬ '™ Ý»Î9Ż‘í­i×\¸W‡qFÔ}óc`˛lO‘ÄÉdtn{Ňö1™;ě[R €¨’f·’IXé'‹7—ŤŔ—6 8:4f i´i¦pŕű¶vuˇĽm‘˛fuıą•cŰäŰťµĚsdsk¸[N´Ż$ÄÄE˘#;vGÇs7˝Ż36™Ďřá VSÄŘ€’Úgµ˛qé ŹÍ¬•Ć>$mŔBâk–ą—Asď"ľ„‰,šfĚŽŚĘěٜÄŽĘöěŮ30Ü8o1áěkĹ@pÓCľ×PŹ}56Ĺm˛s˛f7üaYkŰů9f¶ů,Ęřš467Šeĺ1Řn SxfaycL€5ä ÍiĚÝÚö–«ŤÇ_”BÖĂg<‘—Ť5hn ŽĘvLxşR3Źűs·ĆµúĽçw 'Hkc ÷Łq§ *–·SşAmweĆW?;@Ő9­v^!ĚNčŇ™ă:{&kjŰâ7üŰh«" """ """ """ Ĺsć]ď|+ź™}'ÜŤt.|Ë˝ď…săÓ/¤ű‘ŞĚź·Ť˙j4ŹLľ“îFź·Ť˙j4ŹLľ“îFCć!ôlű!#Ó/¤ű‘¤>bFϲ=2úOą9´pż¸§8ď…ac±ĹeÚDŤˇq˝¬w°0ÔĐi\mľY–jŞ–‡ií¨ă ďŠ(Š8&b4…rT`PB…e(%HiPkşŠˇ5 ÍupÝQŔ ŤĺEŤ„7 "•áR;*;)Z㸂ěŁ3˝ŕµŢňóSŁp$ŹÎě4  j ôRŚö¤ËbËNgnŤ«1–6é v7V–wś3Ú…'O3›O‘–Ó®YňA=ĹŹ¬ÉQ  Ú,(¬i×–ĺwÍQ`důE kMÁg NśhWžÚs]î˝Hě‚…(Tâw=ő…1 Í­=©¦ţ( b ‚«+UEJT©ŢAj¨Á‚{č' UE=ĺSŠP4'ľ™» P‚QV©TĹ*UASTR•QTŞ ŞT(Ş ¶ 0P%)@J¨Ş”Ş…(ˇJ•U(%" ÷ŃF(‚jŠ1LPMJb˘©Š ©LTU*‚RĄER¨%MUj•AdUJ ˛*Ő*‚ŐJŞŐ*‚Č«TŞ "®aşTkâüÁKč›ě·źß»„­±±˙ęo°bŢ~î»CNnÔţŤsÁ'´r&ÔţŤsÁ'´r ß—ĎCÂ}“Ô7ĎKôcřdS/ž‡„ű'¨ož—čÇđČ€˙;ŇwłzŢ´ógé~€´_çaúNöo[Öžlý/Đcy{jËËImꀑ´xŚZěĐq_?ąłžĘíńLŇ 'iĘrćm@«]M+čëĹ­˝ÔF+Ű,g®ˇŃQĽ{!bŐÎîŻ,řoŹ)ŚąëhƦ؜N0ůă\ć8=„µÍ µŔĐ‚4WŃ#3ëŮ(X,pnQRçá߸ŕÜ»vŤÔ‡aě\\Ëf’E8ővž\#jţf•˛ľŢĂ(kM:Ç›Gz¦šŤÚî.T˙Ó[sLO67w9i×ŰÖgR,b+Üíí+i.m! \Çĺ-ÜZ+{Ó•ü^ŢŤ+ZŃö÷QIF¶ÚqVޱÔ0 Íc¸ŁŽĂ”qq§°vö»-•뼶Ą?/ć»çoŢ;v¶±2ęöÎcY$›ŻBî( 85ˇĚq«ĘŠb7×jÚ·¬ăĆ#ż¶<żłŰŁ«MM)íŻo‰úO÷—Ú›.}ź;Úć8Ű—y)t‚ r‚ęšú¨Ř{%»>Ü>FŽ· ň®­rŠŕŔ~ĎĽ·ˇ~ş<ł4b JÚU˘Fĺx-­pĐáúÔ^Ë$V˛:*™H Š”óŹ!Śď°ď\ë§ZĚŰç /IŐŮľgÎčĎz’ł®ç„¸¶Ý§#ËM ¤S3sx?$ÓÔaLvZÖ±ˇ­­hŁZ0 Ŕ« 1Aa…ˇ‘°Q­ ë¤Gok˝­ź¶?Ýć{ĹWĽ0TÔ‚@Ŕ¸ĺ6»ţö’¬Š˛ÂćH×>RçJÖńâ…´kł––×3Zŕw´kŁ-Ý /‘’˝Ťt‘WVňs3 ;)Ň*4ˇ:ĆČĆąĚpâç„ĚÜí-4ŻdW ő,ihˇqy©54­ ¨P4hřVł>»†Á©ř6ĚÖ>]@&R]3Iqd„ąĎ¬‘“‘ôsŤ3MÍm±ŚŤŤŽ6†1€5­h ` Ŕxf5 hiAM.Đ4ű¨U’×˝±Ík[†g& Z±ČÇ_ËCPčÚÖťÂbső”?7Xßp©%÷O-i-µis\渵ď{NZ ¸†]ĐIšŘĂ+ˇhdM"€Ń–*ÔăŤuŽx;ýÓĎ9uŠĹk|ďĆďŹ=͵Ż}{gÜŇGĺ# «šöâŃşá¸7th+a¦3s­ąmŽÉČ‚" """ """ """ Ĺsć]ď|+ź™}'ÜŤt.|Ë˝ď…săÓ/¤ű‘ŞĚź·Ť˙j4ŹLľ“îFź·Ť˙j4ŹLľ“îFCć!ôlű!#Ó/¤ű‘¤>bFϲ=2úOą;´Eo®+ŁXď…ią¤c¸¶¶é´.AѬw±UqťóâĘ#`×öÖlł{‚ĺ-ÁŘ…1Áh=‚±ŕVJµĂP†‡N…:”̥ͦŤ ĄQ`j¤¬js¸hĹlµĐŞö86»ĘDűá\JÎÚ0vF•pj>/hŇĘWtJťÍÝŐDҵŢXeS+q®’«4®q,čX—jiî™ňI”˘„]Q(]±9Ýľł6޸Qdd/vĺeddMk5 %JŵS ˛Üw{8«ń†ň€JT®S3;Ő`ăş•TŞ•ŐMU(§TŞŠ€í a@ҦqAk‚P ś¨˘ŚP[ÁF*1AjÁBb‚h%RĄ•D &)U(!JŚQJbˇ*‚S˘UŐ*ˇMBRŞ‘U[U˘ ş*" Đ(¨UŕJ ¶ P«ŠUŞˇQ*‚ř"ĄR¨.ˇR©UEđJ…J•(/PŁ6đP;*Ő Çu( š…Ŕ śˇAs[Ů*ĄÎ=…Jo ô°šŘHő3ŘF·ßß»„­§żŃ3ŘF·ßß»„®ĐÓ›µ?Ł\đI퉵?Ł\đIí7ĺóĐđźdő óŇýţËçˇá>ÉęçĄú1ü2 ?ÎĂôťěŢ·­<Ůú_ -ůŘ~“˝›Öő§›?KôXŢΊ4äţd¸şg;PĐY!ŐĚüIk)˘”ÇE^1}!ÍkÚXđ×Ň*:A Î;ň{K‰eŮ ©Ę u nTçí.Úv´ÄĆŢç“ÔčŢö‹WîŮŚpyĄí…´—›6Ęf»ýd,Žh¤y8ż «^áĆĘý§wBŐoĺ+Đ,ĹÔ-ťÚ ¦ťµŮŠ8ímŮjEs8Žő‚•qŔh čŇÔ™™ţíz]-M+LÎ6ÇŹÉη˝™ňĽÜ1±ÝŰ˝LĆ[$rĽ1’âo8´á_9mşF<ő·šZ۵Ďk´ć4ˇSˇµ­w‰ĺIţŻh1íşÝ€vQ™Žu»‹ łesmdĄF+«µ;öuË Ň:7Ň ¨#Śn5¦ŽĘëi‰űŁőÎ;˙ë˝ďŐ˙×]ßv-ŽÜWĽó+´ż0ŢÝĘEĽŽ··ÖŻ4®.sqÇz´řV‡3aÚÖĎp$dĂ~@X;®\úŠÓwNŚ;kŃ~XŮBG~!;Ac 5Ŕ÷âžS{ łŔĽ•çµă9Ďĺ·ăiΦ¦­g9śóměz…@ŮÎy}c-hltWěÎͤćaŘě©{ĂçšĐI Ćy­©>ňÄgyDä•“0Ë^.c›”¸5Ř÷˛PđĐé^č‰Ćqłvqž÷ÓgEĎŮŢA$ńĘ-óąń:iŤĂÜ ˛´hXĐÖV‡7}ßTĐKÖ+lDĹ»ŕCłś SŠ  '˛hT­;÷N˙ôĐF%cť3K˛Í€ĺu ńÓĽxF&q RĽÖŮńÜÉłŰ,mÄ}ć­¤`ZŠÔ\N’«®ŢńŃ 4]VV dhkdŢŇ2žQ+ wÓ7,&`v dRHčńŃ••‡+©ój¬řîűYîžćH„`¶6ëčĆ’â^ŕ+ܬć1ěvš[šüű:śŘŚćm;ăw{yŢqC- ŇE…*;"µ QI$Ľć{KŁs´f1¸Ć]AŁ6ZŃfPÖµ˘Ť “A†$Ôź|©Hܶ›LÄb&w""" """ "" W>eŢ÷Âąńé—Ň}Č×BçĚ»ŢřW>=2úOą¬ÉűqčßöŁHôËé>äiűqčßöŁHôËé>äh„>bFϲ=2úOąCć!ôlű!#Ó/¤ű‘ ó;Kú…Í9Çaď­jŃmíĐą;ň;áZĹrťňĚŁ7eIÇN‘ş«E;ŠKj ĚÉZěX*§dŞ–…ŤŻu4×…[?aL!ERÚhViÝĹ*b*UȰU!UA4MĚ;©¤×{B‡˝¬mNťÁľ¬Fg`ŐE4.Đ;JDo:č^™´FůLLö/ŕj1ŞÉŞŹ{şUacÁ5вŃyď6ćśZqÝ-ÄÖ+ş2¨Ť€Ô VG?3‹&¸h*€R‹9ÎůË+k*$ѢŤpV´µ5 ”)DĚć ”)B‚Ąފ(ŕ>ú EŽčĂş”)ĹA9†âgL­Lˇçě(.Lˇ(*Ą§ Š©Q‚ )P T%P¨ŞU¨JĄPJŠ (‚T%J "b&¨ˇMPB” ¦)@E 4 µQWĹŐqLPZ©P«TŞ U*«R˘»č.˘ˇV©UDĄUkU5hŇB ŞŠťŔ§Yj ĚÍŔTČP•!ĄTĎĽÚpŞ™d'yLŞIX‹śtš¨Ş ąš;*¦C¸R'3ŽęЍƔAę ţś˙BĎač?żw \ř?§?ĐłŘFşďÝÂWhiÍڟѮx$öŽDڟѮx$öŽDňůčxO˛z†ůé~Ś ŠeóĐđźdő óŇýţçaúNöo[Öžlý/Đ‹üě?IŢÍëvŐá¬ÖŻy€‘\ą±#FŤŢXŢŘDEp˙1m‰ěLpZą­–F—=ŵ-r׋Ť âĂůŹkDŕL˘VÔ’Ç´sTévî÷OĚě‘»UÎ{ł5ěcŁ'+i–čăW!xő/nyÄĚb_7[WS«lZŐÄâ"%ô;9ť=¤ĽéccÜŠą š.VÓd×m’äO$V–SłYŁŠ"×\;0-qËŤ | JéD:–Î`—ŤŐˇňă][qËZo.&Çž]Ą`ű›Á+m"‘ÎdC+EŃ~láô¦p^ęňI~4ú5źů-řérÍĽgtcÍő)¦ĎÎř¤ů‡Z+K{Y­­`fH$”b\âćBڹĒ_Ox ‹y`¶‰ŔşâPDó†—¶µ V7aSŽé©ě,ëžffmi™›Nvď/Ť•ŹőŚ–™Ů;5ÓľáÖět˛wĺĂ0$îĺLڦ­Őş­ů ĘßZ×mlďŠŃŔHu’,´Óßqo˝T´F +Z-g–'šcş6ÎĆ[xäŠG#őŻ` 2PŚÔÝ5.Ç‘i‰śĚĚöíDDD@DDD@DDD@DD®|Ë˝ď…săÓ/¤ű‘®…Ď™w˝đ®|zeôźr5Y“öăŃżíF‘é—Ň}ČÓöăŃżíF‘é—Ň}ČŃ|Ä>Ťźd$zeôźr4‡ĚCčŮöBG¦_I÷#AćöŹń÷‘ß Ö[;DݏÇöŽřVµß>,ʢ8¨5!`.Ň¦Ş€Ń^¨ˇ¦ ­1BIâ×J“Ű;ʦŚÎ {´*xŤµ÷€Z®sžjt©’B÷Wsp*/E)Ëw¤¬ŃS¤ľpV2=Ľ\ŐŕÇş±©ZšÄÎÝż'±žÝçĽäkˇsć]ď|+ź™}'ÜŤVdý¸ôoűQ¤zeôźr4ý¸ôoűQ¤zeôźr4B1ŁgŮ ™}'ÜŤ!óú6}‘é—Ň}ČĐyÍŁü}Ǥwµ޶vŹń×‘ß Ö˘ă;çĹ™¨ ş ‚ĐŁ)VŞ ˇiRĐ®pШENßA:×IŔGČČń8şo•­$®ăŁp-×NmÝ –gÜńcí¬sśjăRŞ‹ŃZEw"QB*%)&±Ąî-Ć€Ö€4‚8…*Iď`˛†˙epÔ¶g;–SU\wp@+ÁÝ\Ő9©Ů@Eqín)ĂyAŞ*QJ "ĄBš śŞ*•%*˘©TPTU*‚QFe9‚Q*T ”QT©A)Š„A**•P•A5J¨QTŞfUÁZ©™V©TŞTŞŐ3 š˘©!EPY*«UP[2ŚÇqUS"¸î©[*µLŠ€¦ŠpPdhщP •CŠ‚ęéP\¨š€Ł2­QŞŁ2„@Ş(˘ ”ĹETŐ%Q*ىРbĄQŞ·ţśďBĎač?żw \űéĎô,ö®ű÷p•Úsv§ôkž =Ł‘6§ôkž =Ł‘üľz잡ľz_ŁĂ"™|ô<'Ů=C|ôżF?†DůŘ~“˝›Öő§›?Kô˘˙;ŇwłzŢ´ógé~€‹Ů^ĆHÇG#CŘđZć¸Tp ‚°ľęŢ)ťq’wqŚL«Ü0hÄh`Ѧw}ZîGÇ Xhç>6fŢÖ=¬$WtfÁsŻďał´¸†&ş[ a,Ž]•ÄëKHÎc:N5ßұkb<6˝:=IŤ“niĺŚyîÚÍw.¶‘N#„8U¬’Bd8󑞤aG÷pXµSÎćE›2ŘŤ°ÎÜ´ycÜçż! ҧuŰ‹5”7Q[±°28"ČŢ+ŘDŽu2şG†:Ť: 1'A#sjŢŮgw},§4˛.;ŘÖŤÜYŠćs1¶wĎkSŇÓµ­ZÓźw4DLĎĆvÇšm­˘¶‹Wt—9Î5sÜtąÇt••26í)$†K˘Ë9ŞXć26lŽĚćŔŃť­q8ř]©LÄíŠĹ­Ď=­39śĚ˦Şö2F:9Ç‚×5 c‹…KK HˇĄh â“§O¬łşE$†rëXŮ5nf`•íĐć×AëVM•`dD±ˇíqŤţZ<‚­tMŽ\Íc\Çń)ÚÁn˘Őojî™đěň1lí¦Df‡VÇÉŢK"É•şěÝö|Ĺď&˝…–ĂeAb÷ˬ–ćáă)žáúÉ9ę 6¸ű‚ÝE©ŐĽÄĆĘĹż.XĆ|SŔo` $´jŚď{†A)¬ÍBĘăJŹ’íĺ’ˇž1,l±şą^ÂÓCCB0ҵ®"żmĂg¶ÔĘÜAŽ`XöµĂŚ#™ÔÍiˇaáĐ6ËkŢA}=†Đ¶k2eI[aŻĚů¦~˛_7›ĺü€qĘ·<ô™¦&kÓŰqŰł»aśN×y Kˇt×ČĆ‘ [©Ô XřŮ x缳®3‰Ů*"" –v’ĽľH#{Η9Ť$Ó $,QIwtO·’P׌shëVWXöş `k˝Z­´S67“ŚOßśŮŮŕŐ’âőŚ2u`ć K%eË»ĹÉ”¸ ĚÜ[ŻÚŽýĆ!áJÇÄŢ Ň5˘˝…°‰‰ăćsRwÓĆqýň¬rG+ăp{‡4‚ 0Ň‘b{„D@DDD@DDD@DD®|Ë˝ď…săÓ/¤ű‘®…Ď™w˝đ®|zeôźr5Y“öăŃżíF‘é—Ň}ČÓöăŃżíF‘é—Ň}ČŃ|Ä>Ťźd$zeôźr4‡ĚCčŮöBG¦_I÷#Aç6Źń÷‘ß Ö5 gh˙qéđ­m ŚďźdCĄHˇáUuěďn¨&Šą´Ó(9«§Uҵś].$+3˛6‹ťqýK—'C9KŹ‘çS)]饍¶ŰÜ“&'‰•Ęr»yuD"ś…]°9§ľ¤ĚDfF5fÄ÷cJ ňł5ŤfŽůVĹr¶Żó\(Ř;ă^âČQÖ‹”Úg|¨7Tŕ4cľ«RtথA4¸”Qď¨AdÁEJ„ÁJ¦ PI˘(QTPĄB ER‚*ĄET‚€ˇJŠ •©Ş‚‚QB śQBU¨ŞUEB E T ˘ŠĄPJЦ)B€J)MQJµŠ€‚(¦‰P§0Aj¦€%w”U5TĚŃş™Â‚őP\•Bţ¡$¦śúöЍ˘…DéÝE*q@QŠšĄPŞ&ŞEPJ&*PF(ĄBQ D¨J Q¨Ő[˙Nwˇg°Ťtß»„®}żôçz{×Aýű¸Jí 9»Sú5ĎžŃČ›Sú5ĎžŃČ~_= öOPß=/ŃŹá‘Lľz잡ľz_ŁĂ"üě?IŢÍëzÓÍźĄúŃť‡é;Ů˝l6î XZéÝ•˛I«Ü¶Ł6đÁIśCT¬ÚŘĚđ†[ŮcŽÚms+J¸5Ż/«2f­[Ů'^ç®ÝÎľ1®’L‘—2ež=\o”°Ľ1ě~PW] ¨a3h66Ţ0Ç”=ÁěŐ»9•ŹŽ¸;c‰\č-Żěß$-alŽc&l&ŽÖIŘěˇÔ°«¨ĂŘ­W IĚă?¬>§¤ÓĺÓ›EąmmÜÓŤ›9ăöv·ß¶6›`ë=Y¬…‘5Ň9őŁź!ŁLdF ‘ąŞč~)fÖ3ť-/Ë3•0Ł®†ŐE›[4,•˛¬žw·!âĽĘÚ;}ĽjđŃgšÖ Č30<†˝€šŕŮNşD[1lć;^]Khͦ¶Óä䵣:s·Ę{Ř`ÚP\]uhjâ#ÖŽ)ą´áî-µ«-»ăť—ĚfőŃÓ)~ł).iŃš¬tď…ŽM§‘ć7E¨pÝą{bcľšdĚx=ősŹÉ‰Ó‹ăĄë¶&Ńś·‘iŘĘe’âC$rf-!±Je rŇ”hn žĎĽ¶¤‘‘°˝ćŤţśi'p+Ëť©5·/nĎ9YdDD‚îŃ—l`/|O‰âHĄŚŃÍp¨Ý‚ABł˘±3Ů091I·!uĹ®Au#Lfą‹bڵńśÄ¶&|™Ţéă iŠ^퇷f]ĎnÂ.í[ţŇ6—1«Hóg6j9ť—ŹY`¸łŠâ¤ąń˝Á­t‘=Ѹµ®ĘKHަřÔĄJí]]9´Môë˛k3Ëł8ßďîLN6K+ĆĽT@p-4;íu÷Ő—*KÍ• ˘KŰ9*e‰ďiš9iS+#š{擤Ôn…šŰj:^,Ö—=Ť&ZĆ\ĆĽf«ćTż E(€łm)Ű4˝~ď3Çc}®ĎÚ_Á‘‘ťńG3Ř`Á&aLÔˇŁáď,—rM»ÝsĚhŘ·;Čc\ü¸ĺŐÝŠ¬M-äĺ¶qµsł,Ę4ĺşśPM=“BŞÉŁ‘Ň1†®…Ů$88µŻ§%Á]fbcx¬b@Ŕ$ps÷KAhíď…Y bąó.÷ľĎŹLľ“îFş>eŢ÷Âąńé—Ň}ČŐfOŰŹF˙µG¦_I÷#OŰŹF˙µG¦_I÷#D!óú6}‘é—Ň}ČŇ1ŁgŮ ™}'ÜŤ›Ú?ÇÜzG|+Xšb¶v‰˙_p7uŽřJÖ¦ë´÷ă;çĹ•$/ .ocFNÜĽnű±‰=••ĹąH%h-iÓ›=ËĆ0Ěű‡»Gv4öÖ*Ą\pŻoăCQ¤hŢ]âb»1g—;cjŐRŽ Sî+jĄÝaí¨˝g¶k1ľŠý^oşú´€ń±ŚRu)í …cŹ6.Áż ŘĂB®`™Ćŕ^kŢm9ňj!hE’jB­ ÓÚÜYR›ŘvTĺĄP)˘„ĹĐ( R”R ®¦0TT+` €€Š …*˘ŞT‚TĄQbj¨Şš(!0@Ş(Dˇ*•A)‚„˘ UES)Lˇ©R¤*µ*ĹT” ”Ş‚Š*‚Tb€•D@RŁ@DŞUŠ*¨A5E Š Á*˘‰TRŁŞ U*”J š¨ŞQB DRAQŠ˝ ő6˙ÓťčYě#]÷îá+źoý9ţ…žÂ5Đ~î»FćśÝ©ýç‚OhäM©ýç‚OhäAż/ž‡„ű'¨ož—čÇđȦ_= öOPß=/ŃŹá‘ţv¤ďfő»lÖľ5Ŕ9®$9§A´źçaúNöo[Öžlý/ĐV»ÜÉ łF[lłVhă`lM#+\\×;0Ţ.é”â€ÜŹŘI i~ŞWÔČ葏5% ±î†ŤŕáđS5٧¸ż’y`Ôj#âZç9ĎË#†fť Ânđąs.`|#exKO|ßü†űÔ8¬VµśÄÄbg~6áëÔ×Ԭזö‰­kś[1źí.Wĺ÷ľ=e¬Ž$Ůţ+[Ť!ŰŚ 4phÂÓmísÝo˛ uôí¨sÇ;ľyĄ{޸奶6{d’íÎĚÖ¶ĺ‘f%ŽŽ®Ö`iB×—;NîlCµ­!ŘÓ‹rŰym#sXÖ[ńXö ç‘ßĺľ±[cíťË¶ľ—?ţúÇ??.cw,Ěośqţě{ jm 'l{BA,WaýN`Đă !ôkZ×b1ăSGezČvĘxŘp[BÝ]ÝłY4BˇŮnÇ:]—1Ă·c´˘»´†ŕŃ®śŘš\óÄgä´ńIŤ(7éŠéXťŰŢMLLóV1ĆĎ—›_h[ĆÓÜ-1‘!dĄ­wíBüŤ,~bđÜZjG„ĹĄ¬/‰ŹI#šňńŻ/¨sKš#ŽQŽş+ŠÉu‹íŁ=ëć†ţF>Výf¶ŠĆf[¶­úT¬ĚçnŘźőiŔDDD@DDDAĚşü˝˛Żnäąş¶{Ăk&˛@I- Z@{´čşâű`]ämÖŇŮ÷K&'[,2w…ź;3‹iRŢĹMWˇXÝo‹ÜAĚđZ_™ÁÍ  ujĘĺí1ÇJďOQ8ĺŐΦź//%¦gÝËúł5퍒ó–ű~Ö×aIq míîptp±š¶Ęç9°çckŞÂŕOzOÍ]ŤŤµ?±z—AW9ą\j_”ÇPT{Új_ĂlÍŰîßO•ĹŻ9ҰeĚęÓ¶€M;«ť7ĺDć{©¬‹čDz22¶"ícă‹AŽŻÇM8PŃuµý6¤Z>í;Íąůí÷x×g÷ţÉ‹Gs± ŃĎ 'ćŽV‡±Ô"­p¨48čWZ»6ŔlűVŰ _(hh«É ±¬9‰ĘÓ–ąk…p[KËx¬ZbłšçdĎăĽDEDDD@DDD@DD®|Ë˝ď…săÓ/¤ű‘®…Ď™w˝đ®|zeôźr5Y“öăŃżíF‘é—Ň}ČÓöăŃżíF‘é—Ň}ČŃ|Ä>Ťźd$zeôźr4‡ĚCčŮöBG¦_I÷#Aćö~ăŇ:˝µˇ%ÄM8qϵ}´ç©rÚŕ$4 Q±8éÁNťcm§c˝.–IĐ’0 u.ě+¶6·‰ß*Ř©:ŮM‘ŕ±۵ŚB7]‚¶Z VŞŮIV,ZÖ¶ůËQhŤĐ´ĆGw›‡{…l+TµĄed´wmc_–vĆÎć`ĄUĄ§AޱFć´éXŚuu{$ʻަgcŽ”-ËĹQU/ÜUŞŞUJŠ©Tb¦Ş*‚Q*•A«UVŞjŠŠ•g× 8V‡˛+BŞ‚j•*ŃßEDŁJ •SU(A5QRĄBJ&(‚…JR¨!1S@)S‘Y§j)‘@Ő9h® ąŁ‚"(ˇÔnžŇ‡MŕŠvJĹZ˘¬\O`(ŞQU«(@DŞUE©TŞT"RŞ( š¨QRĄQTŞ*Q(TŞQ‰TA4 ‚ŚSĄV…EZˇEjˇJš…S” U*™TĺPz›éĎô,ö®ű÷p•Ď·ţś˙BĎač?żw ]ăsNnÔţŤsÁ'´r&ÔţŤsÁ'´r ß—ĎCÂ}“Ô7ĎKôcřdS/ž‡„ű'¬fXăšMcÚʶ:f V†MôxvhÜÖ—eq$ˇc›ňßR%ť˘ŤŤŕvH©ÖmůÖr‚u›~uś &ľçŔ“–Α5÷>ś¶t‹Y·çYĘ ÖmůÖr‚ šűźN[:EI]$Ě1Í ¤ŤÝóčÜÓC\AzŽłoÎł”¬Űó¬ĺ2ÉŻąđ$峤M}Ď'-ť"ÇÖmůÖr‚u›~uś &ľçŔ“–Α5÷>ś¶t‹Y·çYĘ ÖmůÖr‚ šűźN[:D×ÜřrŮŇ,}fßťg('Y·çYĘ2kî| 9lé_sŕIËgH±ő›~uś ťfßťg( ÉŻąđ$峤M}Ď'-ť"ÇÖmůÖr‚u›~uś &ľçŔ“–Α5÷>ś¶t‹Y·çYĘ ÖmůÖr‚ šűźN[:D×ÜřrŮŇ,}fßťg('Y·çYĘ2kî| 9lé_sŕIËgH±ő›~uś ťfßťg( ÉŻąđ$峤M}Ď'-ť"ÇÖmůÖr‚u›~uś &ľçŔ“–Α5÷>ś¶t‹Y·çYĘ ÖmůÖr‚ šűźN[:D×ÜřrŮŇ,}fßťg('Y·çYĘ2kî| 9lé_sŕIËgH±ő›~uś ťfßťg( ÉŻąđ$峤M}Ď'-ť"ÇÖmůÖr‚u›~uś &ľçŔ“–Α5÷>ś¶t‹Y·çYĘ ÖmůÖr‚ šűźN[:D×ÜřrŮŇ,}fßťg('Y·çYĘ2kî| 9lé_sŕIËgH±ő›~uś ťfßťg( ąšŕŠŢFń{:E‡ňćĺ.y  ¦V7䓼«ÖmůÖr‚u›~uś ‚ß·Ť˙j4ŹLľ“îF¨É#’q‘íu#}r~T{Ęńé—Ň}ČĐ!óú6}‘é—Ň}ČŇ1ŁgŮ 5oŲěÔ,.ĆŤnśíđPq/vL·sNÇ´6W— ˛ZĐďŇ%đ;Žqś‰ş%čňÍη՞‘2Íη՞‘g–;řÇ8ŢDÝźÁ'çČ›˘^‡,Üë}Yé,Üë}Yé’ <÷ŕ·ăytIř-Ç8ŢDÝô9fç[ęĎH™fç[ęĎHśa翸çČ›˘Pv-ĆäŚäMŃ/E–nuľ¬ô‰–nuľ¬ô‰ÉtlKޱµÜ9&Ă÷K'áWt¦µĽ‰ş%ŢË7:ßVzDË7:ßVzDä=ř5Ćě­?řÍŃ)üçťo&n‰z łs­őg¤Lłs­őg¤NH0ó˙\nČŢLÝŹÁgçČ›˘^‡,Üë}Yé,Üë}Yé’ <÷ŕłóŤäMŃ'ŕ·ăytKĐ囝o«="e›ťo«="rA‡žü~qĽ‰ş$ü~qĽ‰ş%črÍη՞‘2Íη՞‘9 ĂĎ~ qÎ3‘7Dź‚ÜsŤäMŃ/C–nuľ¬ô‰–nuľ¬ô‰É{đ[Žqś‰ş$üăśg"n‰złs­őg¤Lłs­őg¤NH0ó˙\sŤäMŃ'ŕ×ă9tKĐe›ťo«="e›ťo«="rA‡źüăśo"n‰?¸çČ›˘^,Üë}Yé,Üë}Yé’ <˙ŕ×ăytJ?¸çČ›˘^‡,Üë}Yé,Üë}Yé’ <ńŘłźÚ7‘7Dź‚ÜsŤäMŃ/C–nuľ¬ô‰–nuľ¬ô‰Éwđ[Žqś‰ş%?‚ÜsŚäMŃ/C–nuľ¬ô‰–nuľ¬ô‰É{đ[Žqś‰ş$üăśo"n‰złs­őg¤Lłs­őg¤NH0óß‚ÜsŚäMŃ'ŕ·ă9tKĐ囝o«="e›ťo«="rA‡ťüăśg"n‰?¸çČ›˘^‹,Üë}Yé,Üë}Yé– <÷ŕ·ăytIř-Ç8ŢDÝô9fç[ęĎH™fç[ęĎHśa翸çČ›˘OÁgçČ›˘^‡,Üë}Yé,Üë}Yé’ <˙ŕ×ăytJĂdĎ»#ytK˝–nuľ¬ô‰–nuľ¬ô‰É}Ű"čŕŮŃšľÉPě;“űVrfč—ŁË7:ßVzDË7:ßVzDäóźÜsŚäÍŃ'ŕw<ă9tKŃ囝o«="e›ťo«="rÁ‡śüçśg&n‰?ąçČ›˘^Ź,Üë}Yé,Üë}Yé’ <çŕw<ă9tJ?ąçÉ›˘^“,Üë}Yé,Üë}Yé– <ßŕW<ă93tIřĎ8ÎLÝô™fç[ęĎH™fç[ęĎHśać˙ąçÉ›˘Qř Ď8ÎDÝôąfç[ęĎH™fç[ęĎHś°ać˙ąçÉ›˘OŔ®yĆrfč—¤Ë7:ßVzDË7:ßVzDĺ7řĎ8ÎLÝŹŔ®yĆrfč—ĄË7:ßVzDË7:ßVzDä5řĎ8ÎLÝ~sÎ3“7D˝.YąÖúłŇ&YąÖúłŇ'$yŻŔnyĆrfč“đžqś™ş%érÍη՞‘2Íη՞‘9`ĂÍţsÎ3“7Dź\óŚäÍŃ/I–nuľ¬ô‰–nuľ¬ô‰Éođ+žqś‰ş$ü ăśg"n‰zLłs­őg¤Lłs­őg¤NH0óOÎ3‘7D§đ+Žqś‰ş%čňÍη՞‘2Íη՞‘9 Ä<çŕwă9tIřÇ8ÎLÝôyfç[ęĎH™fç[ęĎHśaç?¸çČ›˘OŔî9Ćr&č—ŁË7:ßVzDË7:ßVzDä9řÇ8ÎDÝ~qÎ3‘7D˝YąÖúłŇ&YąÖúłŇ'$‡ťü~qĽ‰ş%?‚OÎ3‘7D˝YąÖúłŇ&YąÖúłŇ'$yďÁgçČ›˘OÁ'çČ›˘^‡,Üë}Yé,Üë}Yé’ 5caeڬ?&0ÚЊ剌$fé yýű¸JÂřĄ{Ă+hŕA¤gwqeq«‰ß+JçmOč×<{G"mOč×<{G" ůłĆć´»)©€hcs~Qę“ <ĺޞ;OĽ>łąíl/-płA˙ÍMlüŰůqô‰­ź›.>‘SZţeý¶xé­2ţŰ‘SZţeý¶xé­2ţŰ‘SZţeý¶xé­2ţŰ‘SZţeý¶xé­2ţŰ‘SZţeý¶xé­2ţŰ‘SZţeý¶xé­2ţŰ‘SZţeý¶xé­2ţŰ‘SZţeý¶xé­2ţŰ‘SZţeý¶xé­2ţŰ‘SZţeý¶xé­2ţŰđř<ßvÚŔËyn%–"đصbŤŹV×e’1¦@şÓďr¦Ů¦ôÚČé#¶’<đČř¤—RZŕYJŕpŃA¶6…‰e»Ěěh»ÖÁî 2PŚ­} }[ĚÔ’Ú•ĘiUĽµŰýrÓ˙Ǹö–¨'mJąúmJąúo»OĽ>V661¬Ń R70Ţ\gőŚćż‰WvšŠ{ÔŠ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘĺYĽ{U›Ç·ń.—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń%YĽ{áůîąO/ýĎ÷(;•fńíüIVoßĸ~_űźîSË˙sýĘŕ-;?®Vç5¨ iˇŢě./—ţçű”ň˙Ü˙rąVoßÄ•fńíüK‡ĺ˙ąţĺ<ż÷?Ü îU›Ç·ń-G읏#Ý$–=ď%Ď{ŁŚ—‰$–i\ď/ýĎ÷)ĺ˙ąţĺ˙ŕ»ţľßŐGâ'ŕ»ţľßŐGâ-/ýĎ÷)ĺ˙ąţĺ˙ŕ»ţľßŐGâ'ŕ»ţľßŐGâ-/ýĎ÷)ĺ˙ąţĺ˙ŕ»ţľßŐGâ'ŕ»ţľßŐGâ-/ýĎ÷)ĺ˙ąţĺ˙ŕ»ţľßŐGâ'ŕ»ţľßŐGâ-/ýĎ÷)ĺ˙ąţĺ˙ŕ»ţľßŐGâ'ŕ»ţľßŐGâ-/ýĎ÷)ĺ˙ąţĺ˙ŕ»ţľßŐGâ,¶Ö6ŇMm­¤PIJFĆ0‘ZŇ­hĂËň˙Ü˙rž_űźîPníŻéW?@˘ĺ_ëş”ŐëôĘk®Ôę˙ň¦(˙Ůfox1.6-1.6.57/doc/screenshots/SbSScreen1_small.jpg000066400000000000000000000445301326741342000215520ustar00rootroot00000000000000˙Ř˙ŕJFIFHH˙ţCreated with The GIMP˙ŰC    $.' ",#(7),01444'9=82<.342˙ŰC  2!!22222222222222222222222222222222222222222222222222˙Ŕ4"˙Ä˙ÄP !1AQSa‘’Ń"2q±45DRTrs“ˇ˛Áá#BCUtŇ$3b‚%c”˘đEd&ńÂ˙Ä˙Ä1!1QRAˇ"2aq#B±ÁŃáđń˙Ú ?lg„3CŤcĐÉÂ:ĘGA!ÄÂܬ¬®ąÓˇeQp†¶˘–)§á¬đ»+ âs›ś“|ÖŇÂÚo&ŰŻ`ľťŤEOIĹ$˛I-žeŤ¤‘•ÇNRl­s ĄĄ¬¤ă*0X)Ą-,|-פi±u,đŞÓţڏnůź/Ź„™¨«…ü6íĹJĆ‹?BN›ď 7×PSp‡tő°TpÍáĐ<5’f?REŰs°mŁSm‹čRIuł@ĚŰ‹K˘Ť‡§ŐĄ¶ŰPz/©O‡ŃMd“ §…ć÷c˘i#_Bź1ßő˙DpĺÔů63ÂLZ‚6>‡…ŇÖ_+\Ćĺ¸9Aqô_gµdŽp›ůĹOXî_X‚˘)o˙ă‘HŃ{ľ&0Ť7]UšADěŽ^˛“bçĆÓ—o čjŃń8ŇŢëţxĄÔů xoÂ_ç=cą0ᯠ?śTuŽĺöN*JŔbÂé¦t’dâÄBäXť ş1;_Ś\i}ěŚ{Űn]ßµőµĽÖ>ÁÁ—S壆ś$ţoQÖ;“ŽđŚ˙ňőcą}^łdwÚƉDyĚBÄkĺ'fźxRâqQŃ6ťÍ˘Ą´“Ü]6¸r€=j<Ö>ÁÁ—SäÆ\"ţmQÖ;“đ†ß ÔuŽĺôćM’ŰÁábüĄĆ }>NÚi¦6ËÁÖÇrÖąĆ1a{\ů»ĎWSÍcěu>f8aÂćµa;x_Ź˙5¨ë ęX¤TôTÍ’>ŤÎ.ĘxƵŤ{ۡPmcťB%o”´ŃÔ‘{ěŘ=?ťžk`ŕË©óöđ·ţi?XL8YŹ3ź¬/ ˛©ÜY.ŕŮ%Ą­6 ’.HŘ,~ďTđKÓC°wç:!f4$Ű~ŁŐčQć±ö şź:+Ç™ĎÖŽc§˙“ź¬/Łbľ‡@ÉcĂéĺ.qnRßÝ'Kí:ZÝ)0ŮYS4S`ͧk-s˘ĺŰg)=[y¬}.§ĎÇ qË|%?XN8QŤ˙2›¬/¨x 'Í`ű0»ŕ4ź5‡ěÂy¬}….ăć„Ř×óşÂqÂ\gůŚÝa}3Ŕ©>kŮ„x/͡ű0žg`áK¸ů°á&3üÂn´ă„XÁ˙›­}Ŕé~mمߦůĽ=€žga)u>v8E‹źŹÍÖśp?—­}Ŕéľo`#Á)ľo`'™ÇÚ8RęxŹâ¶÷ô˝iĆ=Š|ú^µď<›ćńv<źćńvyś}Ł….§†n;ŠŽËÖścźĎeë^ßÁiů» 1`(ó0ě)u&.iťŽ&.mťžbŁ…>ăĎŚF°üaýiĆ!VŽţµ»ĹGÍł˛ĹGÍ·©<Ä;G }Ć ®ŞçßÖśVÔóĎë[T!˝KĽ[>Cz”qáÚ8Sî2EeM˙ÎwZqWQλ­ińlů ęGϒޤăĂ´p§Üg ©ů×u§3s®ëW˛7䎥ܭů#©8đí)÷ĹD§řŽëQĎŤRŇI<óÚią6mľQŘ={V†Vü‘ÔŚ­äJ“Ë*J‹C“¶ěó0p‚ŞJęĘg1îkLm‰Áíňš.^\Zn 6[Ô»UŤÍRĘĘpb#Xčĺ23#Íě ¶ˇľÝö—+yR©‰´ &˛Ŕ˙ÂVZŤ(ĺtňRÍ,ŹĘčCAc\{€nomă`QÇZă3"ž’h\ă`LŤpż©×ű”ŐŚmDÎd˘ŃŤ’ Nţ ŽŽš:¦THů|ĄňŶ]räYř‹CZ}ÍŁŁKŐ̡QŽ=•F©Ď“ąĎy±łË-}Äĺ'~íŞě•Ďm%5CcŇQr3’/¸_ŻSČ —˘ś˝Ď|™Ü]ĺ нεŻĘ⯵ÇPĆ]b°fW4ŰKoż*ŐĹżz(źča<2^&RâĆ“ˇ==z‚–©˛6ć€sĺąÄÜĺQÁ pqäJ÷®Ng7C®şz~ĺeĎ…ŕćÚI#aµŔéčQ÷¸ôdý·ú#Šř«Ěöť[‘ĎaŰryÁ YžŇÉc\˛çń+hťBăk[÷yĺéK ‘E y"ŕěo÷+ęwTV•s+OS LRG”€rň~çf6ś‘f$¸´—YĆ×˝·”®08{[ túI„¬,o”©iż*ÎňqkűkäµGOěĚź˘†±‘š†š^Ů‹śŕZám˙v…Ł4đĂHj śY—0łŽľ…Ś‚Z¨Ş|ŃaśXßyŐ5K)ŞátSł3,Fp?5¦ä§WČËĂ1čńL6˛˛(Ţ<:í$Ť@&×ęIAÂVbŇşť­s›O{X_bŃŠ––9)#nXŇ̡ÍXďU©pz*J¶T˛I\ö8¸9–ąÜd«sXË;[űPřźÄÍZč§»Ósp5;î-ʸ$Â8¸žqLśk3°=Ž×¶Ë骔b4ĺ­˘¦y Ë™íi'@9zண‘†Ńms‘šŰbĐç,ŃaWҶ˘ —Üç4Â/•ŧByB±âó—uőV dAŠž–ăiѱ€ąä”©F;;š)ĹżţꀗÄç.ę=ë–—š–:‰ĺ˙ńy ‘÷yŘ<›ŰÖµüy?ÍÇ_ęł1)Şq › šX[—,ma]ľUĐčjčeĂé§­«4ŇÍ“)i Ü\ĺÖćÜľ­ŞĚµ,1Ę÷âŔ6&‡?Év€ěßżżĄĄŽ–ź Š…ř|S˛8„Eň±ĄÎhÔú.¬řE5ńE%ťbGÝmł«r˝sč)0şŚAµ®’g–Í–'’Â6ŚŁ[Ťú*8uk1>XËřˇ $9…Í1µŕíGś´jçtôžOŁůÉŚ6ä7˙:ZgS™ |ŇľI8Ç9ůFąCmĄ·4 3křA mLŚĺ‚,ŮŚ¤]öĚ—°¶ó˝i>¦ŕîuź=„lă5{˝‡ßÔ˛q~ Óc5†¦˘j¶Ë`UŐĽK‡ĄĄ‚WTF)śÇFćp-ů¬ŁÄ·ŕÂ/-ĘÖŢĆu?U]…buăž”Ćçqi66ąÓ“ˇbaś0Ć«jâdQ¶7Jë6@ásô¶Ż\pzvŕ’áp˛H˘‘…Ą÷Äť®&ú•’ŢĆÚřë<.~4/$‚Lň6;4Ť.m~µfç•;8&đ9‘#dqśÄwž’Żř–^yť•śŞţŇLŰžT\ň­/ËĎ3˛°±Şč0I] ň°Ěc|‘Ǩ2enb:A,žy˙oµ,ł:źtĚŹŚ{#3ĺiłaFlŔ;”4ýéŘâŔp⯔o +f áŚTř'8tĄÎ6,`ąĽ‘éßuÇc˛µ­>*®$ nš_•\unJTľ±Ífc Ľ“ˇ"ţ‚TĆvxÜĂ-·›+ĽŘ•·_˛T[+ŇË$•µ­y6k™•ż&í â¤'ł€ć–I+Mťk›tz—1 úL2-TĹŤ. qXC,gqä§§ÜĽ…+[XŘťu¤Ľ¦–ˇŽ—(ąĚňâ@NŢ„âFŇľ{Šc!UŠVI+_4m{˛˛G°ĺqäó®6Ť mELí§ž8¸ąž_ÝŻĐFŰžťťDsBQŐ±.-:h´…™#isśëő ő1ÁÜěĺ͉ŇĺkaëRňEKK{˘Ú˛Úzic©…˛°Ľ5Ŕ\UşjŐćÍsl\Î=Ů›}—i{)ŚŁ5Ş/`ÓNSŚ.gJbS™îŢ=×µ÷¨u…Řp©ę#ă!šžF\·3gqÄlÜA ÄЬÉŐEžăš.lîĺ•TTc‘˛Ç>ńĘ\ö‚âńc•ݢŽ,r»´P „ĽXĺwhŁ‹®í!/9]Ú(âÇ+»EČKĹŽWvŠ8±ĘîŃ@2ńc•ݢŽ,r»´P „ĽXĺwhŁ‹®í!/9]Ú(âÇ+»EĘ–-đ]OŐIř­ńc•ݢ¨â_Tí˙.]§ý.@\ţ;˝.ü—©ˇř>›ę›ě ËŢ—~KÔĐüMőMöĆľ’@໎ÝŕÝec‘QDĘa5,’‡Ŕ#•íµČą9O޵ţ+'ű˝ĄWÄe©ŚCŕěkŻ{ć˘Űü˝!™YâąqŞjJ¨áxŽ2Ƈ¸ß1µ…Żĺhw·¤ŞµŐ\٬’ŤŘS_+$cžÖDŰyD]Ű}}6ŢŻMPÖđ†6šiK<ŇáNKKŽ_+5´¶o/"ާŻ‹¨‚‹ă ]i®FqżpµĆÓkŤ6˘ä…Řh°ĹědŤ ŁÉŘŰÓęµ¶Ş®ĂD×É=<ÜLaĺň1ą˛†Ľłď-űÇM«GŤăn’ś?-ń‡Cp94¶˝öąSOb´Ě–Z|9łĆĚäĆ۵Ď9Č:îěÖ臄ÔňĘÖšj€ 3Z칲ŇNĎbŚp˛•ÔŐ_űËqwfäô'‡Ć#C°–ůžXĺĺľ„‹Z÷y#Ć SĽá­đ†5śHČë:öĎ­î7[gNÄ­6$Ę©cc@x”p|džťť%^Y”U53Í šÜ̸ńNamśAľË‚z´ZhB^…42VUÖ˛:*©]$yáXY%¶óCĆśş/p±k˝ú˙W±ß1żEžŐ#4ýVď@Q·ĚoŃgµ;ucýě u8c+ yt@TYíŽB-ąčÖÉťÁâéhăih–ĹÎÚIÓ_ąCSPú&Č×˝Żp.wčŚ۝ĂnĐ>ôR×µŃÔš×3ć-hÉq\ę-ĘąĄ“ČńľocD¤Łd°aچwH)âŢ$yÝĎ˝éPâřxĆAQ#Ěm>T`Xh_jěu˛Ňšę&s Čđf7ŘşöÚ/Ęä˝ń`Ž8éŹ ňÉË_ąf(_OHȡËc2˛ĂF馜‰)éf}pÖËťîk›,Ťóšá§ZŻ=\TX¬ôrLŘĂ‘°ŘçX›Ś­ż¨ô&†Xĺ25Ó9˛1Ćíl 73ŔŐÎŃ—'uý6»Çő5ż"–ɢ˘™Ő 3şśFçł6gŘ‚4·G.źz©S…ŐĎ_<µÂËŹ“˛ö低˝*Í1§©©âŞHĺ-/´”ÍhÚEŻšŔÝ®˙IÝeN44ç‘ç ‘c~]=JLRaÍ«{±¸ęc{óY҂؉&ŕ]ÄęNóu¶ÉŁ—Ě{]Ąô7@b2›ÍVé*#-p”ŔÖ?VßĚÉ9oú¨@BĹŻ÷ëý^Ĺ´±k˝ú˙W±ß1żEžŐŇńî6k`$źP\oߢĎjŽŻŕŮż¤á b­¤Ct¬Ł&!GQ›ŤžI¸-”Üm˙OJí=vL×Ď ‹Ľç:Cs˙ŹIë^FȲ÷˝Ăę×n˙ÁĺúŽZŞ=‡Śé[/ dpşŔyŻm­?)Ýh8ś$ć8‹ ĺ%żŮĐ:—ʞ,Żčř»źÁ_PÉŃÁ¸Ť™óIU˛=ˇĄĎ~á{lhĺ+‡¦ËW°G™Î .i’IµŘw“ÖĽ…‘dô|]Ďŕz†Nö-Ĺbe˛âMm¶X´[gú:PQ6« d‰˛SŚáŮžgŢúĺé+ÉŮOGĹÜţ¨dčŹcăh­o¶Ü—oOú:OZăń8$acńć9ą\Üŕ]Ľš3bńöE“Ńńw?ę:#ŘIŃ?!mD1ą†ŕµýom¶ť¸Ča»q\¦÷Ńíö:Jń–E“Ńńw?ę:#ŮK‹AS”Ub ¨cI!’H-r;ČOZŽ’· ˇ¤Ž–™ÔŃÁr±çAÔĽŤ‘dô|]Ďŕz†Nö Ĺ ‹0‡lmq&Áŕí$ť¬ľ×µ(Ç\†0á葿ؼU‘dô|]Ďŕz†NőfŁ }L52ľžZKÜÉ^ň\ ÍÜvoşš\JŠVŰ a¸ps_¨ ßäň…㬋'ŁâîÔ2tGłĐq!ö¶lí˝»“dí źăX‘Ň  ĆĆň…ă,‹'ŁâîÔ2tG®¤¬Âč#|t¦š&=î‘ÁŻ:¸›“±XńÍ'?l÷/dY=sřˇ“˘=·Ži9ř;gą9¤çŕížĺâl‹'ŁâîÔ2tG¶ńÍ'?l÷#Ç4śüłÜĽM‘dô|]Ďŕz†NöŢ9¤çŕížäx擟¶{—‰˛,žŹ‹ąüę:#Űx擟¶{‘ăšN~Ůî^HŢkD„ ® nÚÝŁ~őfÉčř»źÁ/ÇϢ=śĄ4ě16x3:ŔYçąI‰|Sőrţ/H?ĆAőŤöŻe‰|Sőrţ/3ÇřHři%vuř\ňĚ›k‘sřîô»ň^¦‡ŕúoŞo°/-üwz]ů/SCđ}7Ő7ŘÔwⲻÚSɲ?¤|ZMż˝í)äŘÍľp@H’X›4OŤâíp±ô'BĂé!ى€ÍbAfĂ—mąŮ`±qЬUŕŘ. úÇY±˝ä ŕ‹‹›k«[˛Ö6Ý·×TĆÉ#솄_z­Y‡ŃTÍLj(⟊'‹ĚŔr\XÚý U{†a×aś§¨Š9áqš6ŮŚnr\@˝´Úíyo¨ľäŘuwđ©== –¨ňZI9K®IŇŕę6éĐ«AřgjđĘě¤6bťŃćłÚIŇÎż§K+'ĂĄžxé°N5Ôď1HLMŮpk›ë°Úúň)”\]2ó¦zxäl±¶Fć84Ťŕ¦X-á$LË«#Ć]|ŤłlCc{Ř[~Šj|tU5…´UPŢ@Â' ió ÷Émm·‘Tˇ°…çŹ !&ĚĂqäćĚbhhĐNm6íŮĄöX™ÇăĐĘúŔd%†Ěmšá|××@"ű4ä@m,Z˙~żŐěUß¶C… ٰú¶$!…Ąą\CC®F®ŇæŰmsÂĽ86¤Fřó€rżhÝąß1żEžŐWÁŇ˙J˙ÂŤóôYíIUđ|żŇżđ…h~H‰rg‡ĘŚŞK"Ëěµ;DyQ•IdY5 #ĘŚŞK"ɨQTeRYMBňŁ*’ȲjG•T–E“P˘<¨Ę¤˛,š…ĺFU%‘dÔ(Ź*2©,‹&ˇDyQ•IdY5 #ĘŚŞK"ɨQTeRYMBňŁ*’ȲjG•T–E“P˘¬˘ÓÁé>ÄK(e\ĚÜ„«%ÂÎŽ”,Đä ’”ŰĄË©¤%ÓjĹ –9j˘Čđë=··Ą{,Kŕšź«—Řĺĺ)›ţ*¦ßjőxŹÁ?W/árń>«zŁoŘôĽš–•K˙‚çńÝéwä˝MÁôßTß`^[řîô»ň^¦‡ŕúoŞo°/$í;ńY?Ýż¤§“dH$ř¬›?{ÚSI˛?¤ˇ@G7>ö®I~6;}kłyéjä ™#ł­©@yş'pŤś6«ŠĄŤ~ř‹Ů%Ĺ™ňZÜŰo»@WĆ'“„PHŰb¸ă„Ć>CĹŢö;5;4'ôű†ŐCĂúú¸ńxĺĄtW–”şň4°4kc·[+⇞ZŽ:˝‘Ć%ÍNşÄZů@¸Űä’ouŇňh{+Ůx©5OŮrUě|'Ťá!ÇĹÜÜ®wŁnop¦Öäô$ž~µÎř®= Ëp^^,ěŕlßä’mŃę_|đtßă8śöĆć––€ŇH:7[NëěŃB0¬{Źk¤Ć‹[•®7äÜ–ełŽŽě˝úůźŇ9¸_łâ2{ŁŤďaÇqëµ—LŽÚÜ\Fľ”‘{§{d.Ćq¶Ž42?ÚH nş‘nQ·uď­¬~Üü+„Źťň byaÍ—j-ktôîŢ.}-‡"Ź2úěů?ü*v2ěsf+S];„fĄîsH\/ĄČżWJ÷őŢý«Ř¶¬-wż_ęö,g-NÍ"©Qß1żEžÔ•?Éý+˙Nß1żEžÔ•>đ“úWţ˘?’äxü«ąSŮ_[gBeFTöE’Ĺ •SŮK&TeOdY,P™Q•=‘d±BeFTöE’Ĺ •SŮK&TeOdY,P™Q•=‘d±BeFTöE’Ĺ •SŮK&TeOdY,P™Q•=‘d±BeFTöE’Ĺ •SŮKvťżâbúcÚ˝6%đMOŐËř\ĽäüDH{WŁÄľ ©úą —‹őG÷Çř=/ř˛çńÝéwä˝MÁôßTß`^[řîô»ň^¦‡ŕúoŞo°/(î;ńY6ţ÷´§“÷6ůÁ'Ĺd˙w´§“dH $B€Žo0}!íK.^6<ĆÚňŮ4Ţ`úCÚą)Xî/ŞÇa´¸˙•µ4µÓ ÖĆŕúcŁâ|·´‘a¦íJ¶ü3 ăę]SŠÉ3¤źFµŔń.Ě-˛ĺ¤ŢÓn»•JÜ_ř•Y‹]*Ř [9ż–ŃlÇ.Á&ÎŢ4V™'ŰWUc’yĺ‘ÂV¸r3XXXlčĺZć»WŃř‹Ô®ů.Á Ă0Á$-f50Bńđ†“’Ŕ8‹ßKXýę±Â°&UFăŤN÷ôq¨Î|Ťsl6‹ÝF1> qŐTţ 8‚’;É;CËw“m îm—f¶ZX}ëj%e%9ÎĆ´ľÍ‘­ ŘŤş€ýűÖFÎPSdŠwLÜ×Îçć:ęý·E•Ą=44‘qPFŘŮ»+Fňn~ňĄ@ »ßŻő{ŇĹŻ÷ëý^Ä#|Ćý{RTkC'ôŻü!;|Ćý{RÔ{Ĺ˙Ó;đ…hţH‡ČňůQ•>Te_Qg‡BeFTůQ•,P™Q•>TeK&TeO•RĹ •SĺFT±BeFTůQ•,P™Q•>TeK&TeO•RĹ •SĺFT±BeFTůQ•,P™Q•>TeK&TeO•RĹŮReFT±DvE”™Q•,Q‘e&TeKŹŰÇô‡µoâ_Tý\ż…Ë&ţŮźH-ĚK੼«—đąx˙R|OCÁŞ‹.Ţ—~KÔĐüMőMö忎ďKż%ęh~¦ú¦űóNÓż“gď{Jy6Gô‚O‹I·÷˝Ą<›#úA"„syéjYIGasŞiĽÁô‡µ,®k^ÂdkuŘăµć(ńIÜ=«˘©Âš â/[cŘŔtűîIňwWdĹdi­mw6bá"W_nŤÔŢ×$ő§ŁĄá<6Ş’i™. ,YšKĽÓ%ˇ»ÖçaŢžwđž˘IŮNÚjV2GHć‚^ܤ çy˝ě6 ¸Zd«UŃr6ÍVŞą.BTc5PĘiâŕôÎů^Dd±Ŕ_Í!şę6ťĆűM–®\+%¨aŁ4ĎŠÁ૤ߠz} !R†NşfńP¶7LshNHôŢV§Î=\¶ps‹ąÓ;Žě#lFŕíąöul 3QBXµŢý«Ř¶–-ż_ęö 1ć7čłÚ–}hźý3żLß1żEžÔł{ÍßÓ;đ…1ć|Ź?•T™Q•}ŁÇ˘;"ÉňŁ*k"„˛,ź*2¦±BeE”™W2¦±BeFU&TeMbňŁ*“*2¦±DyQ•I•s*k&TeO•w*jG•T™Q•5 #Ę‹)2®eMB„˛,ź*2¦±BX"Á>TeMb„°E‚|¨ĘšĹ `‹ůQ•5ŠÁ ňŁ*kr 8Ö} ¶1/‚j~®_Âĺ•hϤ®%đEOŐËř\Ľż¨;”N˙ ř˛çńÝéwä˝MÁôßTß`^[řîô»ň^¦‡ŕúoŞo°/<ë;ńY?Ýż¤˘ycGĆ=­ÖţS­±“gď{Jж’*ˇ<Óa 6˝ąF…7„Ä*›LIă\Âđ,v×fđťň20 Ü äŰRlZĹžš7đŽđůŰ-î"– mc­­}G*ŞÜűjéĺ’bŕöÖ¸r€s5:ßnË =źŤksŹ,fmŽĐ7Źąyś#Äid¨ŞŹŤ€´°XŚŻ»˛ëĄíc˘¬Ú Ĺ$¸“Ég[%Ć…ş›·ë·uĹŞ–đ~¸OK&!y oĺł39ä¶ŰH»…í˛ă•JtJmr/WPWW×^ TCLčŻĹ¶äşún#M÷Ű~‹,ç`ő2fđźČhŚ>ĚŔŤsi~®­äđ.ŇUf©t DÖČî(›°y-p6…·±;”b—·’b­-ťŚ/gÝC@-;,¶íE”X§Â«ËgÜö<ݬdcÉëcšü˘äťĽ [zŽ©é#Š˘ ÔJŰŢRÜąµÓOBǤ¬Áá”ËiC˛8†’2—ŚÎ¸:´lôë{­*|Vލ·‰”¸9ů,#ĘËžÚŹ“Ż"ꄱkýú˙W±m,Z˙~żŐě@b7ĚoŃgµroy»úg~şß1żEžŐÉ˝ćďéťřB”éůŮQ•9\¸ßué?ŕŕH["Ú§blěä ’úŚ$Ë/.¤VF^…0sypńeGőí|»ęWâÝňOR8·|“Ô¬ćFg*zŚ»KyuÔ«•Vó€\14ť ‚ŰÔ ˙%Frđíre|¤ěAaE•¦ĺ`¶ÄĄşŐÔ~íŁ±eáöćU '`ş‘´Î"䀦µ`Ydú„ß਴|ݲĽćµŰ@QNŽŃmŹÇă—ĺ±Gáäąl‹+>OšŕTnŚ´Ř…Ó řç´Yś±Ę<Ń–ßHZ8—Á?W/ár˘”=*ö%đMOŐËř\¸Ľką#§ĂreĎă»ŇďÉzšéľ©ľŔĽ·ńÝéwä˝MÁôßTß`\GQß‹I·÷˝Ą<›#úA'Ĺd˙w´Ş¤µ‘6ŤŻ»ĽĽ×Óg =:ié@^t8Ě?.ý–ö, =Ô4ÓÖÔ6žHL#)sĺs Ř ¶ŕ= «Râ3Gޞ!I†ÜY´.,$ŰĘÍm×¶Ţ^E^»ÄMlÔ”ŘGČÜĎÚ<ś®‚mpËě&ÄŤ6§íµ x 8>ę·ŃSHČĹĄ ö%Ů­w—uő6Ü f5°I#py#§p0™›‹ ,5ŘO߼©âÄ1Wq0»ŚlR&n}/ Ů—wŻv¶«µř´ ’XpöÎČóţĚ]®q-h]Ŕ›ĐQc8f%YI°ůETŤgĆ»-·—uňő…°Ě'Ža3( l€‡ € XÔłaÄq‡JŔü)¶ ł­-ĽĽ·Đ‘k^ă©D1llÁQ|=Ľx 0ŚŽĘ˙—}z¶]č SáüfqGu$6×qč×ŮȤŹĄ…Í1@Čň»;CE€6Ë{z4PQUWË$M«§lEÂRđ۸6Ďšď»I>­ËE!@ żßŻő{ŇňŘţ1G†V=µ+Łt‘ÇűŇ6î·©Mľc~‹=©gŇŤßÓ;đ„ÍóôYíIQĄ‡˙Ş˙Âśp?Ľ›ŹoÉ+9łkc˘”:ű 碅ěŕ‹ĺ+€´ţé Ľ‘`SÝÖŘH2Ű}Ó îr3ĆĹĚÎ;TÎg}©Ű(;íéUýäŮÁ×ÚĄÖ`P$µŔU„aŘśKФroµ˝Eśˇ˛č±nˇ´Ęč×~‰,Ô^Ý!,aľçÖş\5Q—\y(oÚ ‘Ż}ČKrn 5—R_[®ćK qµ6b7¨ šŘ  ÝŢqő)°Jfq>€Ž?ýEuۨ˛I ßé)ÄşjT. $˛ řŔwýČkv¸*¦`G“©KƤu”°]㚀”Źśą¶°ťUN=Ç@ô¤.yÚGRťMnašČ.âMÖ†#đEOŐËř\˛csřÖyBن–ZŘ—Á5?W/árÖrݲŃIr.Ţ—~I&á5U#ऎ Ź$eň¤k m¶ŕë÷ën¸–Îâő:z9U]‡Q=ĹÎĂa.&äŤĎţ*卯»!gŤď¨Ţ’lXĚ;[—fWŮcx˛‡ůdbµ,ˇţYŘźí@lNőm©ăYť¬,0µ‰g©<ËŢĐěeś ÚEô7¶»ŽĎZÄńeňČ>Ä˙jHK" Ę nö“¨Şyiať­lÔm‘­óCŘâ˘íML†1TÜ[Ƶ®z¬€qć7čłÚŁ©° ’úá AôrŰ(ÄoéCYđdßŇ?đ„“»MěCşn‹ěşČkśĂv:ĘĚxă9· śˇ ÉËt"ęhę†ÇeE•Đ>ŔčztR‰[qcoHF âv´ő.qŕlŐTÎŽ0*‚ç9ń‚ú *…×Řë(ĚŹIVDËúPŇł¸ŇNŐŢ4üŻ˝H4xŔKmáf*8ÄŻ„iąxĺY\bîrw( k †ď]đ†t¬ zyR4řöî ś ˛ ×„ůî”oŹ=2ßhTĂ“fô¨Ř„şěMÇO˝SĚ™6ł;Bá©m´UlçÁ8 nŇ l ¸Ů4ňW$ůEFecx$}H7UśĽ Bá-Ţ «çs¶čşA¶›Păo/RŚÔ’|ýeG•­rN9·µôč@ZŠGşxî†ĎJŢÄľ ©úą —ž§ptŃŰĺjô8—Á5?W/ár×&^%ĎŚ;ŇďÉC&! Uľ ć;6žUĽťH[ň=joŚ;ŇďÉAz? atQŠ©ĆqzŘi|Öőm[ÇMýÄłĂ^ě¦v4ŢÖuÂăńši ă(¤dÄKˇ°7˝Z1Ń’Idť¤ŞI`¤’2Ŕc`/l„°€Ik‡Ţź¶LŤČ|}†YçŽ}Łóü‡y:_]ŤĆ( lŽ 4şů° ĆÚk˘_õ»!ÔÜů,ŰÔŇP—8ž.îľm­ĹŽîM›ĂěÜ1‡9®¨k\Öćxq¶Q{k¦šňĄ“Âă.Ş`-$ZűH°Ó_R†¸¸–BsvłP=JGŇŃÎáź$„^× ;vîŢźŃýŤĹĆ`tÜwěÚâŇuĐë¦ÎŤ9tĺ8ÖśÖĂ–öż6§fIĆDÖµÖ»CccqűĽ¤ő®x˛’ßäł“ĚgöĄâýü Ƨ¬eLň˛;ŘÖ9ŻůîVUhi"†Wľ7Ľ´–Ŕ7`ÚmSe˙Ş˙ü{–$Ž„ą;'ţ=Ë™ęż˙äˇ&[˙˙ř÷ °€i'ţ=ʰ+üóţßjŻ[đ\˙Ň?đ…97×”7Ú«×i…Núr~ ůČĺü[´ň‚®%˘űJpă}żzĺfcşB݇¨®‚Â5$ËŰ“”j–k¦c®ŇA=*fŐNŇ348(›%Žş…3^Çi{m‚aTÝ÷ „ívđŁ1Ý Ť®ŃĂU ł4íp°…ŤĚľW%ÎAłŽśˇJ`—-·®ž…ŃrŰ‚ ®^ŰB›´·Tůş,ˇĎmÖ]ÍčKÁÇŁ­Ďţ•~„géP ł®ń€( ą‚lăp]ÎyUgLĆ \= ?Ě|–źZćsĘŚÝ*ź%ö5w;Î×7Ů—3[Ţą™ÎŘ>őW#_°ß ¨&`aČ 'ecsI#Z:6Ş­kŹI /[骙„µ»l§ŘÍQ>k=eDéŢvşĘąqůE cť˝W`Hd'k‰]h×zăaĺS4-aÔ– é_ţ&!ţˇí^›ř&§ęĺü.^fś ‹OßŐé±/‚j~®_Âĺ¶.L´KźwĄß’Šma„§˙ňĺ/Ćéw䦊‰ŇŇĹQśŮF€=ÜúyVĄ‹ÎńüuŠI !îă&p9ť”Y¤i—'Y\§v?,µB˘Xb$¶»‡’ë;RF„7B5˝ôبáŇŃbĆQEC;˘ HskűGJżâ·ó­ęPš|‚ÝZ"…Ľ o…Ç1‹‹Ëű Xd˝ŔÔ°ëő%ŠNŠe¦ˇâK@pk®A7#Q{‹rlŘŐV•ΩĹj(28:L€‚Űn¸˝Á:ŰMËGĹrs­ęVją“LZp„:ŐĹFZ?Íp'P4ł´ŇçÔ6ÜŰĆăµN›™ŹĹ(fˇ50ĺĄhÚDŁ9qÍ«@ś·Ř˝ź‹sűQ§()]BÔÇĹć/ľ–Ű{ň(Ěě*L4K7ŚĺŔKnrqNŠÖľ–ßłmú:RâƆJ¨|E&'Ę ˘ sG•łe>•Ą j!d°ÔG$oÍsuBä´&7;Ŕa˝ßméFJ‹<ÎÚńYR\"l{łß1sťaćô*s¶aVÓ˘t|lŢQk[§•ĆjnoůZŰ˝°ÂÜŕ faxW|Rţq˝J [»ŁĎK,‘`Ě4q—»‰`ě°ŮÍd`ŃbôŘ=kędUź*(Čąhڵ۪÷)8ޤxĄüăz•'5ą1“J¨ńt‘W»‘ŇV4EĆ1ĚŚF2é >‹ß§‘z3ćźBĐńKąĆő$źt0>C !Łe•<>tÝ˙•ń'®«—Á™¸zíPW áSŽZGţ>áčoµCYđdßŇ?đ…ą‘óÂ=ĆĹ[ŽâĹ/ ΄.=FvE '©t¦SuÇFZ46č)-#KŮÁ6ŘSµŔčt!G|Ŕ\zÂQ}ŠAqŹ Ř•8}Ŕ;÷‚¨5űŐN$°±Іp®1ŰB­áv¸[}ĘS‰@Żo©J‹|ńęŇ}FĘ<ҰŮ/ĐátÜÂâ-Ëd†ˇż&Gµ])K@–9ądFäĺÄMŔĘđ\Ě­ÖTŮô‘%@›7Ą”YýĚUA6r‡]͵ÔAÖÚťˇĽŞf4˛Ź8]Îą™&nDâ„P9ŮŽVŚÄ©[MqwGfhÖęvžU8."çE ‚1F»Ĺô§őŢë·éסVŔ‚0ąßd\]Đl™%úodôçüL_MľŐéń/‚j~®_c—•¦wř¨~›}«Őb_Tý\ż…ËŁ&^%ĎŚ;ŇďÉgâŐĐĐRŃĘÜMÔő`6źKLĐ(°7Ů®»7­Ś;ŇďÉTÄx1‡b” Äęf|±]’ć/”3 j.µRqiŻž‚Ni\9™\§Á°)j8A6*YÜXÚpÝZ¨IŘl˝ýtť U”Äeap±"öŘĽumÂ|6 F'1´’3$Ůl8‡îwAŘňŹQWř4fŕç揫¦4tŇÁPÇć‡ŃŇmË÷,iBjűJĂúrűWŘ÷żŮ·I†˛“¨©ŤîĽ÷2¦÷ôy]®k“ÔEK –g†0o<»€ĺ= ĘřŤ‚şľ:ZvUTZt÷/MQ$Ěxl’7ĘkĚŕym»Ňݱ›»ł\y!’ô;ˇ(1WÓşv±ŃÄZŇűyVÚtÓmÇ©3ßŇFŃRióńĺtëPŐČljätŔŕŘh!ĘĐ,Ahu´µ­ˇľť:­šgGWNsĹ‹Hs]măˇi-ťÇ‘µ%Í–#Ž8›–65­äh·BuRžX©Úř¤‘ŚÉ!ks8 ßĘz ÚĄŐkZƆ´ŔP„ „ ZżŢ2ú•ZżŢ2ú Ď;¸zíPÖ|7ôŹü!M¸zíPVü?ôŹü*Y‘óÖ´9ąšuä]i»MôPDđA‘č+ą¤g#‡Ţ¸L‡&í±±P¸Ź4ęśżKŮG&â6©DŁ™‹lB{ćÔhR4ő®6ŕô)—e&Ă•3dă2ąŽ!ľŐF˘|ÄÄŰ\í$ěS šx˘ksf n nŞŃ6Z.ľ‡U”ńżP2ž„ŃT˛fćlv¶š”ĆG,ÖzĄHť;X¬–x…žŤĺT±ÍÂě:ŤÜŠ˘ţQ7ô¦hY˘ŰŐś“öÜŠK‘6n…˨óĹ;Ő$~őn”^ü˝i`’čĚŁżI]Ímé`|Ë·QÝ’Á%ČŢ›9ĺűÔ—n€śLń°¦đ—…^čşŘŞĺ Ľ'ˇSÍĐ‹¨ \đw&´…G2în”ˇEŢ9»ŠáśYSĚŚÉB‹ô’޶â7Ú˝ž%đMOŐËř\Ľ-˝u?Ö·Ú˝Ö%đEOŐËř\·ĹÉ—‰săô»ňW†+ÁÉhf$2f’6ŽCÖ¨üaŢ—~Kk ř>5ŁV¨˛IěĎ€đsŕŤ]DřŤ];0‘lî.ĚŮď'mÖ©nŽRHĚ=ßňęŘË%kt1ČËrźŢ¶˝!§j»Ăś:—Âb†Ł†…â@čĚŇecÎđFý ËÁx5°ú™ę«ĹSjÚÁ§iąxąnB Éą\ńRSáĄöżů9đĆXňp"®žýK|ŕ”Xo#ŁźťÎË;EÄqŤíľýť|zŘ Ž˛D4ÚNňw“ŇĽWé±É¸%L(Y3ę$xlâ83]·^×¶î…§Á 2ŁŕĂa®t’Čdtm1‡XXú-sëSŤ(χ±¬Ĺ>#˛÷7NÉfÍ ÍĺˇóH Žô°SÓŃE+óż;Üë]ł`ť—bzIĄ‘ó2C pČXuµ†Ń¸Ţę:÷Ę_PÂ% ‰3ZŔ>˙a]“JŽ«aHĆÎę·Éo&RcpŠłOŚ  rEN‚§5\Ń˝Ľ[ޢ;7 tu­EČ´­:$Š>*0ĚÄ{_’ű©(B­_ď} Ę­_ď} PgťÜ= ö¨+´Â§żĚäü*}ĂĐßj‚żŕšŹčäü*Y‘óL~Slöť­Všc–;°ŰňT¶ÂPZű‚Aĺ ŽŚËn.nŐÂć8 ĆË‚|íň€HňÂ7Ž›(=™|¶<8o˛«STŘ´nŻ;ą:Ăx°ÚVt®lÓ¸µŔňŤ–ř`›ąrôs5λԑĂ$„er«PFÓI :m˛žî–˛Ö^!Ý$F”$4ěćĚKľĺc8¶ŔŁÎí·ĚyA\Ň““¶Hů®6"çnRÜßÎ#Ô»r?}T {jA]¸ŮbtąÝtů=+—éKtfPëBLÁµ@=ůQ›Ą%Ń ¨şčrŹ8ĺ˛ Ćç $Ě9s7‘Cź¤%În¤ćÎ9>őd¦a°€±ť«†@«q˘űmę\3FN™ĘĎs`»ďpTĚß&>˛Čň>JNŠQă*P.o36ť6…ôlKŕšź«—đą|· ĚqZ;›ţÝź/©b_Tý\ľÇ-±reâ\řĂ˝.ü–®;"¤ŹpMŇVWĆéwä´!§‚§kj.ŇÓg4Ť„UŞŻrńć`đű†:)Ş(Kd05ŔŔ]boĽnľŠĹ$2ř‹†váÔq‰Ŕ9Éî%íż3w-7âŐČb¤Ś ŕ×Cµ X7j Á*Í,tŘYË4­5UNÎ÷eŐäoÓpĺYăŚTÜŇÝ“S–G͗㍱DČ› h°AQ[1L÷]˘7—8iÚçΠµ4‘Őe/$e7o.Ł˙wÝW’›%ÍŽŞ×j$W,;±ű–±KÝ–e\ żÇxľrÄČÇl»K-łp»]÷«ň™ ŻlÄ·ßsl§[Y6ęT)źAW: &xžĄÍj‰…Ţll5¶›l޶|‰ŁkŘá~PBśŞÝ˙.ą•â{_-Ü Ă”űşë×ě ŇĄ. ł©Ŕ‚A¨1€=*A%cmšž27ä–çďdY¤ůP•„ą ––“¸í ”•!VŻ÷Śľ…eVŻ÷Śľ…(3Îî†űTßOýź…O¸zíPW|?ôoü(ů.·JG0ŢăU.ô…Ŕiż‘q™ŠŇ[ˇk˛JČŮw›V¦ą±ů-łťÉ¸,é%|®Ě÷WF?)îöD6Y¨ŞăFF\7}÷ŞáÇQsc´!‘>O5ľł±YŽŚm{ŻĐS”1*#vXĂŢî%×óoä«EŔô(Ö±¶oÜś:Ű áśµI˛Čq¨ó‚í´ÚŁĚ FmvŞMŰQkďQć7Ú‹”šŰj.Łą Ťö $]̢̂ä™Â3… r\Ý( óŤĹ‡*Żť‹ľZBí—˝.Ru%t1 ëŞĎs )\wŮF0_E ęnŔK°;¬ŰúŇgjڏ»z[ŰjN3] †Ę2Bč˝ ĆÂňR Ě1ÇĆÔ^ĎÄŐ±/‚j~®_ÂĺňŚ,ͨľ˝ź/«â_Tý\ż…Ë|\™x—>0ďKż$ŐX‡ŕ#Ěćů!ÂŔúÂFŰ_Ą(÷Ă˝.ü”ĚšŇŇE$Ť Ž@÷‹mc¦›zAÜŻ%kc\.*iË‘›ÁFŐI‚–±Ś1¸şH\ÖąĄîí®í·Ý±zÖTSĹ!«ŚÔ˙%ÔńݢĂfÓkíXŚM—µY`—+j!křĽíÓ3EůŢŤ…K‚q8L"&:&Ă+3ËO™)>V^‹zşU#¶:óĺ„Ţ˝·ö˙Éč)«`Şk8ąç9ąkŻmťęĘÉŁ­ˇĄŤíľG<Ř驺±ăj>u]YÍ'رUK d†vĆwh;ŠÎ}&%FŘE%G„G1KfąÍڎŔt®ń¶ĹYńµ:ŹQóŞęMlVĐŹĆ©)Ă<0ľ<–‡T7#n7fŮ®íwnç. 7Ëc}Ä„OýäUŽ+Dí˛é^yř.Ů´•ŐT˛1âXňIvµââůN–±µ¶YZ+ąíňCgŻhĘĐ '¤®¬ŞLBžž’(¦¬tň1 :W Ź)˛źĆÔ|ę͢m¨řÚŹťGŤ¨ůԋʵĽeô(ĽmGΨjń*Yidc$»ŃhČÜ= ö¨+ľ ¨ţŽO¬,:íUëĂŽP yŁxhÎ]ł3ĺr:ĚqĎ—MĽ‹%őrĚ ·(Őó„b’»4ôµN¶á­ěS &¸xÎ=žĺŚtăýł5ż36*yä`scqzł ×F·}µZŃW@M¨Ş‹NŃĹ;ą[ŐqwUWäâ]ܬüVJŞ"QW±ě™CCvt%_P®ÉE\ńď‹ýK»”C®żĽŞ~ÉÝË ß2JâÜ‹¶ܧń}uýăQöNîAĂëľcSöNîJ`€´_rЇV‘ď*›ýS»—]ó:ʞwrSP‹‚ţ.ŻůťOŮ;ąsĹőß2©ű'w%0A{„ş«>.ŻÝESöNî\8mwĚŞ~ÉÝÉL‰7Ú–ţµkŵÇâU?dîäx˛»ćU?dîä¦ ·]ľ_Ź «¶´SőNî\uhŃ}IéâťobŤÁKĘM’=ÚyĘ˰ěEćűw%8eĚj~ĹÝĘi‚®cĘ”şüŞß‹qU}‹»’řł?ü}WŘ»ą)‚®¨ż*´pĽCć5_bîäľ,Ä~aUö.îJ`Żqʸ V|Wť´_bîĺßb1Şűw%0Uż*.N­Ś+ů…OŮ;ąwĹXŹĚŞ~ĹÝÉLüĄÁr®+ů•OŮ;ąta‰ř•H˙ő;ą)cm‹Q˙ź/¬b_Tý\ż…Ëćxv]%J÷ŇÔ¶fLd.Ó1/‚j~®_c–Řą2ń-Ľ”ä°:7Ý­áÖüÓqsLě„qsLě„,9ą{Ş-˙N_´ýWxą¦vB8ą¦vB–Ü˝żŐÜ˝żŐw‹šgd#‹šgd 9aÍËŰýQaÍËŰýWxą¦vB8ą¦vB–Ü˝żŐÜ˝żŐw‹šgd#‹šgd 9aÍËŰýQoúrý§ę»ÄEÍ3˛ÄEÍ3˛°ćĺíţ¨°ćĺíţ«ĽD\Ó;!D\Ó;!Ën^ßę‹n^ßę»ÄEÍ3˛ÄEÍ3˛°ćĺíţ¨°ćĺűOŐw‹šgd#‹šgd 9aÍËŰýQaÍÉŰýWxą¦vB8ą¦vB–Ü˝żŐÜ˝żŐw‹šgd#‹šgd 9aÍËŰýQaÍËŰýWxą¦vB8ą¦vB–Ü˝żŐÜťżŐw‹šgd#‹šgd 9aÍÉŰýQaÍËŰýSb¸ý“;!dbµ5tˇĆŽ…µOp~ÖbµČőé÷€€Ő°ćĺíţ¨°ćĺíţ«¦VÍMFúEžw5Ě/Člëj-Č ç†üä˙Ý»ű6Ü˝żŐÜ˝żŐcqXoÎOýŰżąVó“˙vďî@lŘsrö˙UWňŞ ć ‡SÝ==*‡†üä˙Ý»ű—(ńfA&v PĚ/±"KęIä ·pżuˇĄŰo1Ýëžě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝ě1j—°{Đ„îĂć©{˝…ř€Ů (˙aďBw «Ü,č)9 z_uU5˘ű#Ţ„ uU5˘ű#ŢŹuU5˘ű#Ţ„ uU5˘ű#ޢŞáMkčj"â)Z×Ć本#qéB˙Ůfox1.6-1.6.57/doc/screenshots/adie.gif000066400000000000000000001714461326741342000173500ustar00rootroot00000000000000GIF89a÷UŞ˙$$U$Ş$˙IIUIŞI˙mmUmŞm˙’’U’Ş’˙¶¶U¶Ş¶˙ŰŰUŰŞŰ˙˙˙U˙Ş˙˙$$U$Ş$˙$$$$U$$Ş$$˙$I$IU$IŞ$I˙$m$mU$mŞ$m˙$’$’U$’Ş$’˙$¶$¶U$¶Ş$¶˙$Ű$ŰU$ŰŞ$Ű˙$˙$˙U$˙Ş$˙˙IIUIŞI˙I$I$UI$ŞI$˙IIIIUIIŞII˙ImImUImŞIm˙I’I’UI’ŞI’˙I¶I¶UI¶ŞI¶˙IŰIŰUIŰŞIŰ˙I˙I˙UI˙ŞI˙˙mmUmŞm˙m$m$Um$Şm$˙mImIUmIŞmI˙mmmmUmmŞmm˙m’m’Um’Şm’˙m¶m¶Um¶Şm¶˙mŰmŰUmŰŞmŰ˙m˙m˙Um˙Şm˙˙’’U’Ş’˙’$’$U’$Ş’$˙’I’IU’IŞ’I˙’m’mU’mŞ’m˙’’’’U’’Ş’’˙’¶’¶U’¶Ş’¶˙’Ű’ŰU’ŰŞ’Ű˙’˙’˙U’˙Ş’˙˙¶¶U¶Ş¶˙¶$¶$U¶$޶$˙¶I¶IU¶I޶I˙¶m¶mU¶m޶m˙¶’¶’U¶’޶’˙¶¶¶¶U¶¶Ş¶¶˙¶Ű¶ŰU¶Ű޶Ű˙¶˙¶˙U¶˙޶˙˙ŰŰUŰŞŰ˙Ű$Ű$UŰ$ŞŰ$˙ŰIŰIUŰIŞŰI˙ŰmŰmUŰmŞŰm˙Ű’Ű’UŰ’ŞŰ’˙۶۶U۶ŞŰ¶˙ŰŰŰŰUŰŰŞŰŰ˙Ű˙Ű˙UŰ˙ŞŰ˙˙˙˙U˙Ş˙˙˙$˙$U˙$Ş˙$˙˙I˙IU˙IŞ˙I˙˙m˙mU˙mŞ˙m˙˙’˙’U˙’Ş˙’˙˙¶˙¶U˙¶Ş˙¶˙˙Ű˙ŰU˙ŰŞ˙Ű˙˙˙˙˙U˙˙Ş˙˙˙,˙÷iۦíÚŔ‚·ŮZȰˇĂ‡#JśH±˘Ĺ‹3jÜȱŁÇŹ CŠŮ0!B‚ ¦4ąÍJ—ÔfMM]¶HŘÉł§Ďź@ J´¨ŃŁHIHŠäiPI>“čÚęQ7‘śhÓĆŤTnÚHm IIHČţ´ĘłŤR­păĘťKč›4-Ů:Xó¦5IÖřjÓxˇ,—ú´IJµĄ-kSëJžLY.۲dÍrÝĘ83Y±dÁÚ)ÉήYŁ’¸esŮÎŻ‘”@ŇTěÖÚ¦“ĐĚY­ť’ŔnNbKjí­»uo˝EâłéĘĐŁK˙ůŘšśF€m]K‰D‰$uÉ˙"8P¶ËÇ2Éë´†žůô÷đ%ŹŢÉqđ[b™Kú}¶ŞŇŐä$‰ZbyŔn:ý6š6`ŃI ŵaKUm@HÂB«5§~n—k‹xšT·ČĆ€†ĄŮ€%]# ‘pK´xI˙…řEj”M‚C0* )°fFL’µä“µa:˙ç@ĹM@ÝčL9»ZОdő¤`*?×ĂNţS‡5ś!Jq¨Ň–¦ôĄ,…éJ©: ^ŇjŚ’YІH“\ %YiTźh˘ÇŤşŕ©$ŠĐ„$€ŔEŔžÉj‚Ç4¤ ŞŠ*,‰Ó4vĆšŞ˘[r’2Ýq ŤŤ-Ŕ¶ršč4%ăFCMĆśŹ§9rś×ęâěF,»‘D#¬ť›N5r49lIcËkČ.wŚŰkÉöř2Â,˛ dŹ0{YĐE–‚ śŞ.$[VaNf¶LíVWËXÖN¶µ°}­lU[Ú˙ÎÖµ¶Í-nWKa˛ěe%`Áđ%Ŕ0îz“JÜâtľ úĹ e±8É1DĄĽ kÚOÚ2|ě c"YSkH–‚ěXޤąŮîe`“{*E—LZÔvéśn łëŢŹ>îuÄoFÂPJňđt˝cýÜĂ“ň·Át0'ľSŘ˝Îp„7üÉĹ’ĐŔŔk÷’ňţ%‰óء—Aš˘ {ťŐ ąŇEMÓ«(đV8×(žT„uŮGIÉş–aXŔŮóí,;Ë:–ŮŇł¤$'GIŰâ“0ľţ[ÄZVy„R6ťk,É=®Rxc>3™ŃlfN®ů˙ÍjŽł›EȲ” ř& îäÉT‹‰#†H -h@“$"„ösˇ’čCłk"Ťv4˘!˝h‡4úŇ•n¦ťi†lÚŇ!‰ô łŁŔ]­†h3˛©Qxj:đu°žh¬[­ęŽÖşÖŁuŕň|j\OôÔŕÚEäÓ˙‹xÂI.Ý?<݇ÜhŁLą7‚KQ.‘TâŇ÷©šDR}Yb,ýň»gŐ=4˝Ž 3vYëĺ ~´žřŽzúš§ŕ˝Č•«$˙$ş© Z%ŹÖĹÚÁyYí8Żě[˝I$?¶Ywۢ‹őËc,AÓđÝbç>´ĄŐTYó:ĎÎţ4;M€k ú]ťŐyŮgu†Ă_¶đŐ |g oř˛ŰYń‚?{_Ŕźýďgď‹7hů%¶QKTTrłW‹jĽ7;{d ( \·{njD#䀄±gO–ŕŠĎ üĂPÖűľEj–&+Ł6®1‚3»ÁŞgĘc?ä–:ôąć ¨C€9Ů˙Ń #Ý˝`Üqގ5bŃDÄ‚ŔFĚ>…ȤkôT^ěj‰5HŃ `4# ´c>ö_Ç'<ź”I4u2tv{äWr)W:¨_Ş#r.×€ĆeŔŁX^ě# QXż”D"čAŠ1 ÔlĐ0€ä„:éWx$ĂÖé ŕq2éÓ)Ű !ó–dŰTalvBńOďII„Dn=äi@ćoŮcg‚FU:nŹq@ć !ô4r “$]ńS;XF„ őAáÖO=ő=¶ îÓŘłsÖ `ŕjĐ!N7J&ôa B 4]+Äu}µ_ä‡ő”B†˙h_0DKđÖ?‡JţC.‚:@µ ± čń-:HDŹáÄQŔ˝ÔP"•&“ ş µĂ0>dňCý•EĎłMŹ lP^ˇ…@çoűć8Ćeµuf˛ ŘFD˘_ÄM-–J‰ XXD‹˛Iső|'$ ‰ €˝# ĺJŕ)]dgđR%‚O&3a ` lH; sz–€÷xK*Wr,€x€¤TS珷6{…hOJź —T©Dq°q .çp ţŕýP ˇ4R¨”N…`éŁ\M R ,™#٨pçf:ŁvnČ-’˙  d1 Q´SBí“;[W«BĘ÷H$ČqŤ4 d @Đc÷gďGt–$žŇa€@wł3ů´Ě´oyÄ=Ič± ˛ Dw`HĄy0hYťÇw¸ăP‰G8$Ăbś§NvŮ[ż}tI—§—„Á—NV—Ďł—ĄSz)dôUVîł#D.«×88DDUlŕ‘ŮŮŁ_…ˇS”–{µŽU°™)đC\%‰–J”„lŔ‡ť˛;,“včöxďň‚%—’:S! ĐDPčD@ÉéwOe‘$ßłuĐ5!A ág‰+Ăe8A±€wI˙äS$¤–Î#XĄÖxéĺ)¶HvŃŕ ­ >$oőr‰eAoĺo¸€xźřŘź©$·„‹łóu÷†×Zĺ<ž")×L Ić]Łł‘°ˇ‘qyB2Łuô2R‘)€)€ŮZfs;‘7)q9WnŕŰÇv äeE"wЇBŘăF9ĘĄhˇšőçöל5‘H° (pě)…! ±0Ś)ŁĽă‚–;Će ͆`Łů-Ń8ĐCNްQzw4Öp™ĺ¦ôőe‰¦,úAo v&uJw–úYa©SRšA&Ř:@%Â(3tšk˛Ło\˙÷5{ĄQ&d5–řŤçź$ę77UĽŁŘ8¶ ű :Ŕst݆^0¦gZ^ ©_—”~V;hg3ýćp™ulö&Čź.Jd (’>6€¸G qšô§ż rřµŞŚ—q—jÔgÂXh›¶gŹăož62ÖúgÄX­ŐZtŹ&­ÖŠ­Ń­Ţ:9‹¦­ŹFhčJŚĺ*9Ý®îę®đ*®šs­×*Żě:®éŠ­íĘŻŮjŻďşŻăJ­űJ­čJ®ďş®;­K1 I€ĽÔ‰TTĽ4±+±fˇH]ÔT]Ô±«±뱆dE›«GұMeE!›±+K±rd˛ŰR¸˛H˙€±˱:˲/kM`)1+%+˛ĽTT/«F‰Ä±&˲9…±J[ń”±7;±˲K«3ëł*kµOű˛Vt˛ZËł_›ł- ¶Në˛>;¶*‹µi{µ=+G«± ‹´P‹łjä´˛c+·g[´jt·\«µz‹µK·Ů’O˙°ţ°ú ¸“¸˙ ˙°¸”«¸‘{ą’۸‹›ą“«¸–«ąžKą—ëą˙0)Á8mĐI ‘“2‰áşäˇ ˇ[»•+ą‹»˘Ëą Ë»—»ą‰ë»¶ş‘ëąľ+ąŔ{Ľ[Ľ·‹ąµk»ĚkĽË›ąŇ{ĽµËąÉŰąĽ[˝ŃK˝Í şß˙{˝Ńľä+ľŕ›»Ăë˝Ő›ľÝű»č›˝˝;˝ă+§« ŃÔ)mĐąÚĐą‘Đ׳Ľ•;şţྫྷ»űĐąĽĽś¸‹‹5čń>ÚĄËş¬+¬;¬¤;üąť+ż¤»¸“+żČ{Ŕ•+ş| ĚŔ,ą—+ŔĂűÂ.<ĂŚŔ,śŔ» Ŕ+ Ă#lą\ÂěĂA<Ä;LĂ2üGÂ&lÂEĚÂ,ÂDĚĂPĚÄ–+ĹKÜĂlĹOÜÂHěÂS\ĂŚĹ śJDr.‰ :˙@Ž‘P Szą˛ŕn`úĐ!J0Ł]ŚÄ\» <Ľ śç´i şlÁ°K»ÚpÁS`ś˙KŰpÁĄ» Ľż®[şű+’<) ÉÉĽż|”츌ţ»”LÉž|ÉžL§<ɇü “ěČ ŚÉ®ÜČ­Ěʦü¸ĄśĘŽ«ĘŹ,ąźĚśěĘ´»Ë‘ĚÇśĘŢ`ÉÉlɢĚÉŻĘ»lÉĂĚ˝¬¸¸|Č­lÍĆÍşLËÜĚˬÍ<Ě,ĚşÁЏţŔű  űĐžčŚŔŔ& ¸Ž` ÷, jĎ}ĽÂ@ĽÄ*Đţ€#at@M–ÜČ…LČ·`ž› –ŕş4°uuŕ 0ş  PúŃ•ŔŃ0  š"] ŰĐŃ(­ŇúŔŇ6˙ŃŃŰ 2MÓÚ0pÓ˝T Óš Ń3-Ô}Ń• ŃţťÔ­Ń˙ĐŃC}Ń$­ 4đÔ0P# •  T ŇT°tĐŇ`}Ň)˝Ň-ýŇh­Ň@ špÖ1­Ö6ÁÓ(mÔ4]Ń=ť ?ÔU˝K]S­ŐVýÓYý×$˝ ‡]Ń\ťŃ–`ŇŇ]] /MÚ` 0ÖA×D-Ů,íŇť]G=Ô{Ý×HmÓ|]ű°ŘŐ‚ Ŕa)Ĺц”¸ô˙ ! 0–«¬’Dü Ă8ĚĹ(<Ä\ěĂúCÁÎ|Č ýÜű  wиÚPÁ[‚­ t° ˙mĄ[•đşPű«Ýá=Ţĺ}Ţ‚­ âMŢćýčíŢăť uŔŢáť ˙P ÷-ßí]š°ßý=ßUĎö-ąnŕŞí ľßŠü ď˝Ţňm‹‹Ţ>ß>ŕ˙­Ţ"íßám Žßî­ ű`ß"^ŕÉu@á×­ŕŠ»âĄŚâÚýâŰ]ş ŕűŕ ßÎá"^ ~á˙ âµP*ţßÎß?žäFÎŕí]¶âN^şĐĄ‹3Ö ¤‚5ąţVʲőěąŰ˘’°ű ¸}¤˹||ĹşűĹ1ł4‘ |ÁlȆl w°ż™PĚHĽŔŚÇ"ěÂ|ǤűÂN˙lĉëÄŁ»čw|Ă…Ž»Iüčo~ĹË+Đ‹Nč6ěÄ‘ţçaŚčźÎÄ„žĹĆ}ŔBĚĹŹ^č>čŢčź.ézŚčBĽĂ¬é ,ë śÄ"üÂĄŽÄ»NĂŔŢEi!×°ˇů«Çž[D # Ĺ[üě%lĂ)LĽŰkČ–śĺÝÖŽç M»~ܡ‹˝Ć-Ľţě—ŢÇ9 ÄjŽÜMŔ4<í üĂ‚ďßNí$ŚŔ|<č+ ąµţÁî÷®˙,îlď ě»ýĆV®ďĐßÁÇMÜGlŔ ˇďżú›Ç‰+Éç®Äë.Đ\lŔínÝŻ4 Ý(źŤĚĐ—` önîŃţćl˙NÄć>ĹńŽÜĂěď<ĎđřŢď_,đyĽîŻďG¬ď˙ň#,îH_ęA,í·®Ça ô!źóVŽđňí,őw Ä{Lô"Żó‰±ceĽĺÇkě¸-ó9?ëĐëőJü‘śí¦+Á°Űşaɬ« ·  ŐÝĘ öś+żéŢőŻô4¬ďżóW˙őkîľ<ó˙đ\ďó?ĂoŻćG µnó˙ďř.řÉ ő‘Żđ2|óšŻóz ö´ŚďĎ%¤;ľö' Ő°]ݏjđüNĽCęĎđ–<)Ë-Č MÁ†Lüa·PĘP•ÜîJďř€ô OóŠÇDßë‡?ý9ßńM˙˙ůjďőźůŻőÉ]ÜĎôű~óö>ëăĎóYoĂ3ďÁżöÔ/ň§ŽóŠ؆ąŘµ=ŮRۡ}ţö5±¦-a#[úöąQ"I‰ 5•ô÷OŕĆ˙ôXPäÇ}$3nܦힶm ­5ŃGĄľm1kÎÔv§aÇJv žě(hÁB‹ţ R GBKţ ’©I§$5f4ĘQkÇ­K9Nő¨4iUP§–%ëqŞS¤^©†%:˛ëT±b›ŮV-ÚµzŮž…K7j\¬HÔVGWÖÖl%L˘M’¤F\÷i#IRBYMJęS˘Ä ÄŃEÜŚ$ʱnjŞf ĆÄśł˙µ$ejŁiÓ¦®;–v-% Ö-kŐź[3Î+תkăRď–<üÔ8GÂÓąÂĘWŻ_ G…› 5űXđnŃâmnť1uńGĄŹgmüßâ…­›ťŰţúó '±&’HÚlŔ$$I‚@ÜĹ‘Ń$‘EŽÓĆ O˝äޢ‰ —ZJ"7™jşé2÷™‹­ő®l>űÄ{Ďş­ä;ŻŻď°k±=ĺŰ+$áÄJŹÇŐ’rŹ9üĽS¤ŕ¶˘qEÖ”»+H÷ú2®şW3l<ŃÓć1]h“L5ŠK#IT­ŁŚ‚*ě»"ßň$Ěp“íĄË.»-Ă µąÄm’ĚńĽ%}d’ĽäĚŞ˙_ĽL,t,r9ň-ńlańź\ll(+÷ÉEĎ«ü3ŇçĐkk±ńš ČQ uEU uŇO±ľ{Ž<öJRČš[´PłĘ¨ɯćb/VIoÔË!–¬I‰YÚüÁLDíLiKî0H‚Žó±(>‹›ŇEZăk¸Śt©cLŇvOŽt©Ą ď˛LJ]} Š{áŇF^¦8݆;Źj©ăźJL˛÷9ĚLŐčÍ=EŇFŰr‰vb]¨p/‰Q­Ň;a=δş4‡-ď8…ü“Č7ŹShK.%Đ2» ňľPG6ą˝ZaÍ%ĎrKéN 1ÓI#`ĐĄ©ĺnNŃ­V‰S1UĂ˙ř,Čš‚× †~Ý5X“J – m0I—\˘ŕ: ]*ŃE­± CŠ'‡ŐÄÔĎöˇa*„‚ˇŠ:2)éź:üĆx©J´Y×#ôŢÓ L,±$]ÄŞĐć`•Ôů:ƢS2çŞ6ĎÜ\Ŕ* ŕęŇ2 ["ń2©6t¦,˝Ś2$ÁČ>¬!ÉH"\Qd178"4ч ¸ŐŁěˇĹ&oňŮśp#“ /O$«Ů«°'źW‰ěIĚQQČ€Rąop¤¶1ŇĄđu®÷ťD¶ŘŁöĹ‘JÎm”bQ:Ő8\UbjăĆrݤqEµĐ„Zrń‰…m ŰG%4‘BÝÁjUC’çZt¬Ž)íc)S‘ ’Ąk@&@1AŘP‹Hdd3!Ť KㆀýŁ KRˇĚĂ•mŘc&Îęś>4Ä㥤fšÂ`ZŔµJ)…ÎI,ÖH$%č-ŤPfzR”şłEç#`iŤšřś@I˙Ms»ÎŹÜň* Š GFaĚUľ2Y9© -Ů’-"!‘Č#˛l0ĺ7Hb4Jp„=OŁ„ˇ;ĺB}ú›„ĚĆ38‘‰gb­šô©d•ŠçČMU:Ô‚ęÖE±IĄMŻ0Šć­PŇ’QsiŃKöRşËĄÁjéq(p ÚLűPô5¨ł¤ŻnąŹHÔ‚^e Ë3Á“¬[~ŞŁA[‡ü1­›$N–©îĚš‚jśNšJM ÓCN´>6×KGş•\nęC:ŃDY˛[Ą{ĽüŃÓ8j¨V‘3¤  ˙#™!†(‰”ţ…ˇŢ‘ŐHłR–6®1D…Ä’Z˙všÉµě`‰@iÚ©±DN@Ő•ĄŹ$UGQŃM}GH4T/w÷UFvBŤŹ2a:Ónrôr˝X8«Kk’î~űi‰- Ö¤) U5‹Y¶˘P–Î:hń ŃÜł†¶FEä58ÂÍŤm˛Z’!—$AZ˛ĚĐenB(V,ő%rł‰šó.ĹŤ-IµĂ*‰Ş÷‰‚sŹÄĺKoFM«ą5#ů[¬;«ĄŽTk/óĆv©ťo"Ń“?R )ďĂ1-Ô HâË“ů‡la‚$l㔣 ëtX‚},ö%>sL.‘§6Š~úŕQ`Ţ«_¨Iw6i¸ä3d7ݏś~Ţ.Ô´Y˛Ăú«ˇŐÔ0Í"ŁkSřÚ3r4laě`9ćşHC€N¸‘§´A„˙ÄcÂĎ$áž]¶D>+Âĺ:H{!Śť˙›áä:h šě%öôŹZ$Í^Šmń/ţ#«ĹŻřĹ=5ś&c8Ƶ1Eqܶд¦zŻŽç‘ä'O§(Kň;¤S*—xŇNž‰9Dc6ÇÔĹ;ž4o€ŃRÚâÔb"¶qŠqŠR$·—ČcrŻ}°\ć*§”Ő;5Ť%ÝćŚĘ’˘<.ó·ćNďą×íuEmř´ć۸”?X^s’'}čSż˘ĆZž¨Ĺčťá#ßWĂ[ÎőľëÜ€‹8b[fŤ—Ĺ LR‰E ŃPdvä™gB¦Ş˙Ńę"“ך°‘Ť­›5Oy_ĽCLŞA u€€©ŔúŇa°?\´v˙Ŕ:čöÚ:ÜKç{h Př†..:qP؆ň ç?bËßÇěµĺz}ř6űĹWůH—.퇿ű±÷FhĎ}ÜëmqµßG ­ě~řżG\ޤ/¸ů#Ž Ńżżęű?éۇć3>±Ů?őŰľüŃ„Řű‡Ő»—ľŃ‡L=˝Yż×«ŔŮ@ ¤Ők˝t=źŞ÷ @ăӿ҉żęo>Ŕżľąľtń@őľ\Xľ€đÁL¸ÁáČáę•Ö™ ŹŃŠůr-űÚ)ĄP3W"¨čâ°5[3[¸M¸„Śh¸*Ň…™¤0şqą-´„¶ńB>˘.LąčĂŽű˙M»}QCMĽ¶yĂ™sC‰9Ľ¨.¬#ŻÁĂ= C°„=ú˘¶ąB{á9mC˘C92l›\Đ„}(:9ô”›:H1?ŚCK1»ěšş¶#LĽŚA’;[đ†Ş;mC1K8ÄTĽ—€ąCTôCEüÂ=aŤĐA´„RĽą1TĂ?|ą9śŁĹPCAĆQÜ]8ĂL Ş[1ÜÂ"D'Ç0°ĘІ2˙Z+¦ąłĽŠ }(ł “.Ů(˝]®Ŕ‰”04ABô  yÇD ¶2‘¨©ëń ‚´{ü ľ82"/$*ř@ TZŠ|4™ćP ©©ŞŠx|¦HĘm4˙C–Ŕ)^ą$2!Y؉źp„sňH÷PŔ˛nÜWŠ3"ę‘hé5(úňŞ’j2 ‹÷˘Ş´r©&`ËÉbęÇŁÉ?ó‡+q6öşałÉ@sÇŤH$4˘B–Ů’'ň/nKBńŹ—iťÇ“ŽHđ†m˛˘Č'S 505L‘7 óBŻ˘P8i =ăAł”°;ɨ瑱ďÚ‚A É!‘‡A tهÇI—\ ĚĎĐŤđźË¨)ٶ)‹Ä8Ĺ˝1÷‰ĚŤpŁ"É2*"[ŰJ:ĚŚ¨đQ͢đ˝ĺŘł!©Ŕń‡(@ŚÇÔ*(ŁË°ś˙Ď›`)] ŔÔJě¶©zK¬McŽBuűŰ }Ŕ”M“2090‚Pµđ·1H[)ŢÉ ąŤgqޱťĐ…†bް…‚!Aę>–K¶©…Lt™@¶Aš+Ş‚˙ą›č(ŕ>R ŕ#źżAÎL©LňˇAňoĐ=« [°L†ăšŚ€ľ®\ĎǶц› ĘĘ}đšµ1ą@UÔç ˇÄđLřËźc®Z¤żÄÁŹĐ›ÝěÓ–S¬Mőa9 ĎżdŁżô†…ŃJ€”Ç™@ŤĹ ¤űůš.‚6äÄŞ¶0ŚH ˙ş[Hľú‡ ŠFx·X§m 7 #Y°'IP‚Ót•¸ ¨ą¤ I"’‰;°<<еé´ńŔÁżů¤!ź=Q 6¬ä$tÉ‘uŃÚMŔĂš:ĐčóźJhÝô)˝šŐ=[@ ’htůĚô±MXKÝš2 V(5źÄŤÁQźĐ;Ř#(Łm€*°*hŐoŕ`#ÍLµŚŁ‰?»1Ş“¨LMŔ$5š©€€Ëę—ěۆöIŇ˙#MŢ$á(ĐX…ŐµiŐĄOаŢĐmxś¨ś)[‰KK(ťX ®śB˙č1HhJ¸ĎÁ ň6gj+}H˛–…°K‹‰ŇÓ†]hTĘ‚9´Řšż‰őŮ´AÂDśŞ‚«áÂŞL] ±‘śu*ÄŃoŇ{Q ĘŮTű©±ôź÷¤óů¬ůĘdĘŃŹČK´¬9ZĘqž<Ú˘8 xQŚkŮ牉´eEá˘púš!JRhÁAů !T¶Ś8ČÔd„‚÷X´ŃąyUuśÄŃĘů-AęAŁÜ+XTĽ9>˘=ĹŮĘŚżÓZ%y\­ÄĚĹS§Ş # ąôĽ»€‘¸ôĄöH [{ťĆÎ⡔Ť‡H¤XĚČT˙ą—M•KmA— }¨"ŢĄŘ÷‘O“žł ŤŘSŃRUN6â®QłˇŁ’, ‰iśç­:m¨"ÚŽĐ[Š ·±Ą}AĚÔ¸nmĄ…n!oR ŚX=‰8ŚDĐSŚJČ€ ŞŁ‰}!I˝—Ąň^1`Ą“sßŘÔIib“mbŘËpŚśb˛†’É 3¦Ü1ÎęĺaӔ藄É'<ŮnIj›Ś¨M "‰Ç)E)”ż"Ó…T đâÝŔa´˘Â eÄŢ3ŮÇÓ­yÇni’'é<ęR©¸a’ ÓB%<´X{¦cS6ű ¨#ô±o3‘2˝Š–P2K#‰˙‘)óŠÓ[Ń,¤řb­Zs[p7ő §˘“]€lů®Ő Ą9/c’6Ű(†ü”Ś)I©É˘úXđr'†ĄŕJ±+XëŘBŢę!ⱸ3%Öą(Đ1˛ZÉśeNŤÔ©@6 YČIŘ{âS.G°ť‡p„ł1{ôŮ.6Ĺ 3[áŰp*š°„*üRŤáʱEÄKص±E&M9.íĚ%DfśćĘÁ}fj¶3*#n~śm®ś¶)#jEĽ[Śá ;tŁŐ.gžUíú"]ŁYeҤçdf›“óć{îfqŢçZ¨„RÔgrśî;gr Ú¤ćŬńŃ˙}ć‚$ąóff¦¬Zđ”oç6„f8kćč[ÜO€V”Ă3éY çĽr _†™K‹…oŘ´ë´·‰509P #8b“4®ýPˇtzą“Úf5ł‡ĐP¤á˝ĘÉ@űAĐ*LAŕŰjŢ#>ă« kġŢűí3ëüő‹Ô„ĺóÔîŁŔ‡ž˝·~ĐŘË>¤©ë«ÖÝk=:HÁ´ę®Ö†úăęD@Tkä˝} kČ.ÁµnŔŢŁkĐWßÂA©–ŔöŁ©FAжjâŁÁŽěüęʆ±ëÉ>kÇ®ľŘ–Açă>‡ý-¦ČČ˙ $:s„lř['m 7°'V»[Ś:¬Ô˘«EZŞ\ů˘6ĺ•‚ĂK!‘K°˛1•q^gŚśăŁ:JŕýĄş¨ă#Ţ­8Ľj—ń¦bd ÷Ć«•ˇ:Ľ:GąC‰9_ü†ď¦:ođnóVş×o©’CőĆL7Dđ÷¦Nůöďgo–Ŕď×ă%đdl›ŞËo /,ođÎď7ęşÇpč=pźoőĆ”Łúöî¦Eç …HžŃťŚŇ#Z ”»Çܨe5óÉÎ++p¬cءŤ'”Ą–ĽŇ ™Ç#[6›‚ä|ł ę\Ë# :Ý(ĄaX 2 ń¶˙OÖńÚ6z¬±˛:]#-oóťi&-_N„Śëp„ň/JMű&¤ĺ[%K˙įń ?‚13|ó`KŤ• L´ůO›5[Ö´%±IV›–Úöé‹$I›­m‘´T"É InLp¤ćź-«ŰŚŚu3Óćľצ]+sßPˇ¶Úm˘O›6}Űîî]šw›®;vl˙±Ä›S›Ç( ëh€·’.* Bp¸Rź¦JŚk$ô7đ‡uŞŔ¸x†%} =fĚřy ?m 3K¤šVW%Mur×ŃgG—A*–r•†a)ˇă:,ÖŮ÷Ť5ËujÁl)Óń:*3ĘĆ]Et”ŹT3¦4řňn†P,!Ôĺ±J%[%ýé‚!›#nKTtew¨KWk˙ÔGUhą¤uWÄUˇŹhőEFP.is‘KűPaG!1¶ V˛n?Qa 0ů”QAh±µ"ZjmcX€LmcŤ.A%ˇŤ$’4Â’>űxSPlŘâŹ?’¤Ť˙$!€$j(QÂ5–Čb‹,"hc•_ŃÔâ˙Š8µ¶TqĄ1c?é—^x™ć^0ĄÓKQµMMúřŁĎ‚'~ŁŹbPlŁŃO“™ŘÚ7}Sťqę5ÓˇDä’^jĄu KmŃé¦?—z&SŹ™lSEZT˝uÖ]ý¨‘[2Őč¤?äę›u^ (Š©Úv“>{¨A”NjŰ›9ČÖ®Łľ¨”.™˝…jŠ1žŐ,Ź2ŃĘk[Í%QFE’wi ‘’ řŹ5äľ8ă6¶€ąŹ-T Ĺ®¤Ě>{‹?Ĺ]DĄyćš}őűĂB[kN“é’ś  FŹŠ)ĄÂĆKĄ¤¶dq€JĘU5ŦKÇÇ+q­o,/˙łňĆ*qN,jüňĆQl1śÇÜĄZ€î“‹.&;+-Á»šÄب2A¦t„?NôŢ ŚŞDí‡Ő‚öpMq÷÷dÄ&Zr—8O u´‡YcQ9î8ě¸+—ś˛Ş··hłłëúut™xíű|_–\bËq„Ş€ĘĺRYł˙á©]ţŘR ŰHH9çÜÁ  µ(WI˙ná;¶O&9”›fŚU­l&źń`ä!€dTŁ—Ô˘'Q@ÍC¤ – ¤ ¸AcŽřc7aĚ›đS¶ťš¨E÷ÔÂ9ú-ps”Mssźűü‡~5T[č€Ęč­Ó âţŚTá'¬ćč':hâ3=‚vx¦še=Îb)‹ŽTĺ4JĂ·¶ĹŁ˝ĽĄ˛¦rJÍ왢ąâ83Âmě.xYĘP¬‘„˛ŮŃyełÄ.¤Ŕşę(Tvs ý˛ ‡Đ€"u`bB¬‹ D3&ôČ›˘ŤKj#<úx_ĺ”Ő’T˘ yz‰d,JÍeÄ!#˙ůÎűj B±DvŁHÍd‚B ! pRTż•P®±Ś…^TDhĺF#ŔÄHer ?‡X˘>š ÂRb˘ qä|oˇ`"Č‘‰Ó š ‰{„řM@!!#‘“dÚŮ3Ř *ZEă[´č¸“ćĐ+T4˛†­! ¦ŮĚgĚŽ r YÔ*T"Lk¨4P”  ¶pÄUŽ—Ş€íĺE@™QŔÔ—3­QMŰĽa~BFaÚ4źk ,¤›”ا ¶Č|˘eúˇŻ{"X;esśçP0—şI§NJ)Ä…IĘ Ń\úĐů¨*ôŇ#ă,%NtAňQî:ˇ¦.ňV[¤Ź ÍŃÉ˙ĺÇă4çpwÁDčpTi¦Űř^ŕsAć|µyŕ©nµ›^†Dnđńź%h0šŚDŽéj"ŽčfŁ ë`Ů& aM^™gU]‹F7rĘŽ ˛F}H"鲅¸0â%¸a+np’ʵ7HÂJІ Ô’5dEńRÔÎdŤ3eŹń‹HźÇ/ÓM¦Rýݸrć:–E'-‚zVtÎ(źŔ vó®Éb"¨ńŠÎ»ŇšK”—Ď~ŽĚ»ę-ŻĆâTďşd2Çs/×kş‹Tę»[YФ»·4¤<äÍťč¦e;ü (5 hk“â-Ś0µđXü˙B[5ŘÖ b‰‰z›[%čc%…Jp G¬w öč5ĆfŤŽ­Źh’.ŚäőłŇŮZwâ›jŐŇšë˛f«§F›5“ëŞm-pś™Šp‡3ćµĚq‘ŮĂŇVEHQmŽu˛2ËĆSµ$ęłł—Ž ˛ÎŐłja—í˘&'€ď[L3÷.}¤FRBą…-„˛ YČBN˛0ş3%­ČbF7»ł¤đbŹ˝ä1 oěh^zĽ €éV`Ę|!D ăI Š• ขֽJd‚RYĐDL±ÜŤ“©C‘;×b9~vw){ťůV}–6»ŽËpĚ†Ű ÇÍĐ!Âú€‚Üô1‘˙O¦:Eíű¨Ą"6vy^bžÔŻŹ‹‘mtÂ)«lqŤvOGoˇŽĐH0 “+G˛čÉţíĆ׳Nc»ŁŽťË—…|ľą….©Ŕ!F9fí vZčŹ(Tó[m+cî>›âe{2ÜäD«ÉŽ$ŁŃĎ[8&PšaŐŽ@hBmDY™,)F™»™Ä Wň´ hś·Es Ó„¦„Q4šÍ4ŕÁÍÍř ÍĚÄ™\_4őšh €ĚHmŔĘL8ĐqHëŠTA‰ sÔÁ7HŇöŤFuč˙]MY„h„;ĹöěF „ÜwŚF)Ő‡tTĎ…$6YFh 5FĎÔ¨DD”ó•LcĐIHÄ m;!„źř a’AŚF-ŘFŃQ…d@ËnX!dŘTÔIÇnřú”\Bśˇ˛TÇöĄDslҲ°Đ!ńť=QWîPQśŐ …`iéÂiŮ›já„,ÄÁ‹p ąP”6Č‚8BşÔĘĽ‘‹5 žşXCŽTH[ŃÜŃ‹äŹ1\GÝEŹäś[xcłXMD‡ńJw%JĽ¸WäÁ–mIyŃ×{{)cćLĐ–TW]ŁuŰqŐ3Ö×îxc2*ŠO`ŁŢÜ—2Ş×}Ý˙DwĺLLČÎČśŁ¬YŘFQ^ą‰ …TđŃ‘D%¸V˘íF¬XVlEĚ‚Y0EVŔmő–,¸AÔ–dŤýLĆp‘I¦pžŘđ‹š<™ÇHĎŁPŢ4VŮg…ɬ7Î‹É LM˘™™™ČâË%JYÁíh ŢÉtŕ’ńŁŠ¤Íŕ5ąĺí°šSš[KZ"?ĆY­›Őč…E…ź%…j‘ DB,€P,dX€VA äˇe…<š6—V<É$@”Ť˝Ä z ţË‹đ‹%8ś6śŤGŞÍg¬…6¨ł]˘ňädCZ´©Ěgčš3ÚŚ.ÁČä#ďŘ M˙—Iąeâ`˘Ś‘I¦gy™ĂđNŤ %¶„]bóL&Ń$fŐ JÔÄ[Ô[Bąą€ T¨™qÉ‚%$š$Ü‚$k‰$Ř‚l+Ú‚ TÚ”8‚±! FHO”óôőš6\‚čÇ·uĐÂŕGÎeSAD}đTH ĺ¬Ií1ĆěÄu€HÜ­G­‰g€ĐĎa1†GĽF( Ë©GiCÜeH­0ndƆԕfŚŤěŕÔa&«%% emV¦5 šMŠć„-ŰĹĚÉř̆Oŕ©…-Đžg…„W®KMŘB$´K‚íWíDŽĚBÎpŹA¸AŹvÖ xKŽi˙§Ĺšlž>ć.ŘAŹ8UKvO˙L=ŐRXQ.Uź$ÝD3Á€dĺB5)Ç?DČJGUńDHĽ€ĆRU ;ń‡Çu”ÄKL8Uc0ź€\GŮŃ©@ §e$ćŢ`‰:Ů{Ń×–©ďŚ[j˘Ű›Q™dR*ŠâÓfŢ §6O&ĽßͶĎf‘°´S.ăk6K=Ą—™”6äůQ_®ŕčÂ6ČÁôĚäYČ>äÁqTÂ7ÄAoČI.©§Çé Ą{făôĆh0„(‡G<ť©O% ®2‡M5Ěřŕ .ýG¨sdŞTaÄÜŮ‚€›|‚˙Č«ÁíÎh>‚a &>ŞĆŔä egąf^–ý$jţÝ=µ×2ŢN@ނҠ–¤dŚ?a@Kĺ]éŕëé|$^ěb]Ťvö 0öŹņ2şŕDČź¬——éLô)cuą—Áu2.GdK1Ž—;*|Ů6ZŤNíĘ`>*嵦µéĚuÁä–bZ;njƆŮ>NË?ŇKfĆKieK†ÉÄJ‘‹×XĂđl‹YĂ-„MÓ¤˘5(‚‰# ÉR¨ŰĄ±Şš Ĺ.FçůŃ.°‰y¦ŤĚŕbRć䊬HkĚLO΋łÁNŹ ĹÓ¶™Ŕh¦Î: ĹZ¬…†hĺ M¤Zlĺ%*‘U˙%Tz¨ă4ęhlĺV^żţÜËiýŞŮÉ\lő)¤5”‰ąě—>„… đ– d„ČV„>ˇ¤—čĄ>Ģ•$¬î8ś.̨„gŠWg†.u©#l %.^j?b‘‰2Ű»mďĘfhśąŮŞ-ÁyV÷Vmij(uń­^Ą&Š`ř˛&ąĄďăZž\`­˝µFʱA-D‚ZÜ‚5dŠČ‰ŃVŁý$8Âí:çOä– ”Ŕ6¨îDµhĂ=\ÇY’r§>|ë(Ćď6*Ë/ô†(Ň:ĘbŢ%…Nę˘MĄš¨Ţ¬äšŮĺ,ů¦ŁJe ^űÜŰŔĚů.ĺż~˙ćYÔjäbe Ś6ÍŚňf»¨ oITŠ©Ť$”@qš…TVŕç6nKčĺGéŃO$iI-©^XLµTKĘ—ß>Żë¸÷ĘŔšoŠÎë®Ń1yŐXýŠ.Łě÷Ţ“ßA¤ŢääYlşĄ/ÔÖŻ «…%€j—\K¬"Á5…)ćm,HB¦zDm TŽÔVś$°q‘Űŕ˘^\0\těćI—&ÜŞ.L&¤-OżÂf˛żÚ±jReözč"‡ŕćž™çŇoŐž¦Č|` ˙c‰Ň䣲ZjV*KBęä¦Wç.ŕĐXWł‰Şiá˝UYđ"nLä¬)ë»/Ĺś ./¨™˙äR”Ôš(Y‘ˇł Żjżb貼ćäMęݬ3Ö«ť!ňT>Řűş/Ůë=ńňĄ‚®‰NsRtÔfÓŤţţS@-ž) FŚ%ìäč4™ŤQ4‡šTŽŐIýâóÜmCŚíQŢČhCĚfh—›MsÇŔBM·`, đJLČl˘?[٬4mlŽ(ŕňνăt>ÎxäEu2‹L# { Řı%÷>޸t±Ůr”Ů ŢČ@%8„5x ŤŞMLLAdqu~S(AŔP ö?xŃ[V˘ĺ Ĺ]/řŃń&Ż> š%ÜÁ¤‡eÍŠĺ%Ŕ®§. jD D˛˙ĎĽ“Í@GÉŘcí0 ŃÚM–‡sŮśzÝZŘÂÖŐʇbÚíZO¶@ ëd/ݶa„Vµ/”őę/3´ űđ©ö¦P…Ăî4xMŤ*$pˇ­A“¸ĄĚÖl%o%‰AA–(UË“¤0î™  ^ěXżYŹČ@š\A6ឦüđ­äôĺ66ČĘá&}j}¤Ä}”¶A‹}L+(GĽ\%íFfŘÇŃ=!9ńüˇ:Éç÷ôôŐB.­¶třI&hß -!yäR.Č6±Ő„[µN†€ĚhDFđNKŤăŘGB@"f¸ óí—Íćlś´Ć˙§+xďýC ţxMG­řú¶4Ëš>|Şĺ  @Ţg-F,˙úŻůTmi¤XÂíBI €­YJ‚hDC’X¤™Ř[×>–T^tÚH¦ŕ™Ü_IJyd›•Vü´ŤnlĚ@€Ók°ß\}Faaž¸Ä éNT÷ivLDx´ě—bźËŽź¦k€ D}ÂA„öŁĂÇpLĆçŔ@‰d)h\Ő[XFB|RH„F} 8ůCęTHi¸“Ď  ď9„źŠJ29–ŇqěôéóĹA^=ěHőFnC{1Á•&<VÖH¶Xr‹ś‘7dCş¨Í*ZĂt_Ăt_±#8‚8‚(˙'Ź8‚đ–$\Ă@mErŢőíâą4­JöŘÂ.X‚Â|ö#j‚{¸¸˛„ }mí1ü“K„#¶‚ë˙ȉ„ŘÂ~,čůö†M . ‘ţhNŘÂ2iSđ ah ë-ˇAd¶fqÄ'Ľt(KMĐĐÁhv¸8™ |Ýąę‡6°“LŰ|X‰DMH"n,ĐL _ŐA.ŘDZĀzĂâŹ'Ůt´÷6 /­¬…ă°”–-ő7 ŞHB,ÔŹĆWÎtc'ëĂżi…” ×ÝÖ¦3¬ňbȆš_l^<·ăĎ~Łd¦|‚É„MµNśŔ˝ÍRn˘—76ŁŃ"˙c‚AŁżF^‹ÜĄ6{LŹN>ŃŽŽĂT×zírtT3 ÝacŠ„Ččh®Ňň¦YD·Déb»q‹Q·ĐJądŞ/ĎŻ‚ĹHÜß2s-W©ů €lląüÚ­ SĐK^x^Äôh¬®BuC”x ÝElŚd¨)ĹšĐGl”8}¸]TçLëB.†yö$TY©Đ4L^‡’0Tk/@dŰ÷oź?ęÓ…PŰ?}ýéű—ÍáA‡/JÔ‘ăC‚-nÔ§P[AŽý}ühĺE”/]B4)ňÄŽ*%:ÜfÍš-kI´I’ŐćźĂ—mI´I“éM™K/†¬™p˙ź¶mú¶ił¦5 V}Ú°‚µŞĎÎŚŞ·dlŇزRĄ†ý骣rڶęěp0W}v5Őˇ˘ŤJM÷QŃ•óa•*Ú Ô©Tç1•„˙ěV \ÇR]ş˘ŔŘ繎ä:0ľY†‘µňMŤs-”«OSĄ¦úöŃŃ…q-Ä×ßf´«­ŠÄ}#;Î}xÜ7ćšź7"„@°¦Čŕoým{Šp¶ëŠ˙˙G mL0A%ÜËP«ťvęĘŢxŻ˛ĹŽ[Ŕşd7ă.”L;ÎĘ1§Oc“«l9óú˙,Kv›l ·2ŇĄˇkŮ-ŻŚćĘÄMnÖ¤¤<ćZ>xﵑł*i1U‚ôéł’o$ű·’ĎŔMN]&ű&ÓèÓEű®d?üýă}™Lů8šL,Ä"xŇ…-´W‰É /ÁËK¦Ţ·5100™’‹6$vł·ć|Úŕ^Ž*a‹őíÍ3’®`x™Yp2ĽI‚p5+›Ěç%Zń‰-€"‰ýL…w˛€ĂWě“mŮ j`˘ܰ 5¨@Pt-” &ʢ&×pB ÜpŤ$üòpNG ™Ś%+[±F‡Ŕ’•Ş\Ĺ*őňPIôVho4ś•J¤’‹ô±(‰ŠK˙ö¸‹ÔJWzôăT2ĹÇ?b#Ť4¤"gČ7=^&o€¤Ë sR”.ͧ&zł K\"8J‘H†XhźL€0ŇĆ:ňVĺqź©…÷ţ‘‹ŞdÂť÷Ś Bř©Ť\ÜSMűČ!őć[,O!nygőʦ¦ůŃFźďDp2Q=SeHµ(Iyâ’·…JěµŘţÔDĐvÔ„ ˇ'ŹÓęÉ)'ĺ«Ĺ7’ˇůé´>úđh>ëc˙*[XÍV)ßî BĂ˝T—9Śa6?¦‡néáŰzvy—`EX? ĘáÇ’]´©SőNY7™AÎŃ*[á Ľ@4–˛…ś- k:4J9oęĚhşĄÉdęYi8łŔąxf]’HCâ$,HŚÎú´AHql˛Kb˛â'n„F)&ă„Lf.ˇÂ6raÉlŚl± ^čd—S•Şfnâ D<ÓŞĚ, 3‘u qRë@]“nÎYL†\YN.YŤUo ÎIć&+ćV'ÁĄ cXžG-˛<ö1oá†xXČ©ÚŐ!'‡éť@ޱ$ÖŘIľňˇ¬˙|Ą*SĐĆ-ĆůŞ­č"r©¦ĄBU"Jë #¤Şé鋪«ţ‡†pĚ sńÇc2ťŤÔˇS+űźRĹ"Ž ¬¸nZ u!°"éŃJDŞCdHj[đ<® P¨Í.Äł¨ś-D7É̡śc Ł9„±*RҬJĂĽĚÜxOĄYŕ‘5S$BE•‘i i§!iäE\ Śń Ő¦§¨Y d|ś:·ŹôJLkäÉ5†U,˘$:Úh„- 7GĽË!˛@ZTŐ}ŘbŽ Ą}eÁEŤdeC®űÉŽ®BG¸ćK»ĐĹ"<‚ü»ÚjHcĐ*Äĺ4–Y`Şö´7˙Č AZJä2 +íššőm‚Öw5SˇjŤúlC$[ŰÇČNěE˙˘ L’·úř™’jsĐ"I$3™`a—|&ŚUxÄ»áŇÔđW1ËxF;«YîG¸0ů±UPp‹#B͇YEht¶KKBcőWSq`’ťčů9BĆ« G“×ăqPźuşY[¤GŔWŃO"?ŐÇ74N"HěhÚťř—r‚děŻę(÷ÚR#/1ONjÂ÷ŘüćďŢĽ´‚ęç ®7Ó҇= âç•6,N"‘¸ä$GąvąAţPťB°Źx«Z\tZ¤E dÁ –\LNLB¶ˇDrT®š˙ĘEJgҜϾޞî^´A-lÎ_pQܢŞBL*)˘B`2/#j¨"lĂ%˛ak""Ä!¤6ŢË" «ďâë6Ţ"ĘGŕrĺ ˝‹‘šĐ».¤ ¦ĽŁ#Â+©Ţ.`•>o µJ•Ě˙É ĎĂ )AŽ —0X|"Ŕę82B˛A$Müś©’ÜĹŞšÉ¬á¬Á丨ôAtF8ě+ůćEÓšo,aôaśtáR" €T„8Ŕm7BÍuXH"pw ËuNę_X$Ô¬fÚb0`ٵ ‡$°‡¨čěh1ľ‚¨>ă ă]P#/r‰ K Wńq2dw˙†1$@¨BJOŽÉ¬†N"¶PşĐúşK*`ĹŞŘĐ)´k>ŢŚ» nBčć."#ěS"$ĺ(CÚ( ˛ă^”Ďď@lÎĐ/Ǥ¶Az'&"g!ĽM{üÁÎi~˙,Á$ĺ"˛Đ3đç+·&·&ź,Aź^F`*tĆÂn´'íܢ6˛"đŇCNvd~şî2>”y6ó.kXb”fŽJ4á3ZęÜÂŇçKÄňŞĽQÍK‰,Ë/. нޒó°4VŘ&x¨{Âô…?ŚB&Ú`mA&đ@ÜŔ¬áN•Ŕ8‡O'ÎP„BĽĺ\,$ďÔjOHc* ÝHv ˛@cNžĐr»ŕLŕśéüžĘýé¬0âK“é’íóň(•L ŕ( Tgü¨jý0u<â‹ţ°Oü±ű<"ôÜP.Ç,“ęWŔ±ßâ ˙@OÎh•Đp)‡˛É=đB®bő˙‚*b\šHöĘEQ ®ˇôŹ U $A$‚[ @ P‡X RC8„žŹů´Á_Äé^e˙ °V2.ń¦M•,µôLŮ“*ĐÜ=ѱA•vbMńđXĽ˘&0CĽAҶZ$!ĺ®Eś(‹&'‹®Á\€C ’ŔřţÁ\Ü ”ŕdç7 Ôľ‚›2-hAäůKî6Ŕ˘^7¶˝žJ©¶Ë'Ö_ŰK;v»ţqRϲ@<µguµ<Ăë†ÜńLĎpÍbb ™+MÁ6—Ňcg5XéÉe¬Ł˙Ń‹?hbśŐč4'ŞOŤ‚}v'DçőjdÝ7˘P'âC~^莒žüË!˘°łXÁ4ţfđoĹsKéĐĺŐ߸SL±–ŰvKg( ŃL–sőV5úÔ0u›–,uXőő˙h—€|e=ŞÂ.óL/A&d!ŇS<˝¶$€gÂuä…+ôíH,Bäieé»ÂQ†»Ö ×w‚{0nöó”ř©ÜX…×kMtŤ0 .$~pŹ/V|nŃW˙Ż_ׯo6%¶˘>~"?„‰˘ö±o˙Á[Ě(š‚Â(Ä“›÷Z&ˇŠ"tŞÉ6Ż#˛âę!Ů(!¶8mζ ˘¦–YN ÉČĂG˝ěßz׏˘—˙Ďł—É“ŻtVQj©î}“ěHznĆ%.ĎVÁ8Ş.Ôr!}¦"jGb)aĄęrAşŘÖŕ2Övăul§¶-™PXđ«ölQ÷!Ô*bˇ^”`RV®Eĺ” ”tT‡AôÁDgřđřKç6xĎ•1µ÷*ŚvnG—»–ôˇ0Ľ-6\jiCTz˘`ť´¤vdĂvîłÎn' ĘuČ.!ě)ĄŞ  '’Ŕ‚©ľR \š"ΠŇM\‡‚„1*7­8”„©Ź#÷ J§4ĆJRä#cGJj7ŞG,ĽM˘tšE4ËkŔcťTmˇx €h 9K‰ĂnńIż"¤˙Ónˇž‹ÁŻ )–€ůŕŇ.«ěĂcď‘? b.‚Ř`1ĽN/tÎ[LĐä<9‹:fý°\(Ç>Ńs)˛CôŚ3M,®µa ě zScE,XOŽdk4k0.b0¤ĚĚŠ¤ şOśË$'`ŇܤHŕD´Đ§H6eÁňi7ˇ€Ą+!Ć tÁąFÄĆflÂ.,LO˘Ŕt>Â*ĂŚ2if Ő2ˇÔ`@j` b€Ýş$pňÂ4&c5č@˘@P–ćă/:•P†j.† g\ËşwÇ!\şÉ 4„˛%%ăµć§'áŕak8;ŮowçŁW"6¤’ŰŔ˙—’% BhhB۰í r>jda\2­*„ČŃrÎmçł^®˘QËŐC4Í,QwäŔ!ďB¶Ä3ĆÎ/Zň#†j2¶lôÄ3ěUJ*O>«f¸$±l&2¶Öf*ô1´ŇŰžŰIK⳦ibĚN¬MAVSĐÇA§RTĂ3Rë±ň$e¶ŠK`Ë.rÁ’[LĂ„(2𮵲C<öÍI§ěµjŰŔµa7uĹ\É2N&|-ăě&¸Í9b~z[żµÁ,C.T˛ŇÄĎ8˘mlă2yŹ .KĎ«8“±Őň=\®A¨·(<Ü™ŕđ€=»­˛÷^"7uÇ>˙d‘ ‚EbĂ!Čg*Ľyjžtá  ŞÔň˘€Ľn7†Ń„x¬&˛Xđ ľÁT^eyí-ř餆Q=×Iň ŠěT˛6¸g3_ĹDiFŐjCé đ^qÔÎÄۨŔ;Q%Ůš…0íťäîśČĄfĺLJgşÝĂ®¤ř§´6ö!Ú˝]%#ĘĘá+‚U×LńjďćIđCř#pŚŽwIŹ”IŮT x!uGĘ•myĹ7VŹ;“Ć/iö:oů–´P‡xHn˝±yń94c†kE•’Ćo˙^‚wm‚Ľ@µS™‚›Ié 9KKi­şVąôq—W'–˙×Ö3™Ď\˘Ž78ifh-¦©PËéőţó‚Ăâ'>d{o+쀜Ůún1y]ă ľRžPjeŞív]‹á÷ŽoŐ·‡Á|yąÚLµŞÂmĎ΀w$;hŇî»>SNĄ^×wě°îC×IRéř,űO…‹říYj?—Ťˇ˘=0„ŃřĺM#„Č>HÜ!fq„˛[ܢß÷öˇ'̨] â4e݀ˀX+čI1áĺçőáňv>-%ŞÇŹÂyzŽŰ4ďÎ)鼮iÜéÖ‚ ŠC2B“ľuÖŇTëß?ştéÓUI׾\–üi‹¨+Wĵ*ikP_¦} ˙KÖŮ篎®Š$ő!Ôö˘?]tůCIň¦?[uLhËf.0/ÂÄIł¨G…‰j«Ri Eť˙ž’Ôf+“¶}-V*ąFŐ}2÷ÁŘ—É ml˙}­ôbĚJ(˙Ő8°$^˝vý•Ľ vŻNŔy×ĹégÉ›Uumő‹wVk¶¬%Ń&IR#˝Űôí‹ ë¶H(·%ą&ÉŤ7jT»1!I‰¤şJd™0ˇMÉ?"$©Ym«oKľú´mc{|›e‹úŽďl\ߌâw,YŮ§Ż Q°*ĹVHe_•:u¶Q‰ňomßJu4‰Uů/W·vžîVhëk{űTŽW‘;?0lÓÝ6˙i˘KbťĂ7¶h“‰&UŔPĹOVUăń%™ś´ŕpĄ§ {’EIbé.+îfVUPü3c^űĐPŐ‚–@5JÚ´řXş@ˇ ‘-ľX•-ThŢZ5iS•¬UbćE&číŘ`‰AĆcŽÉT_|ý5˘abşÁ|ÝĄś6Öč’†5 µÁvßčĂFµřŁŹ%ŘmŁ„-˛¸ćknH˘ŤmxŐ¦B ۨˇŹ-&$Ş„#˛ŔćB’iÓś5rj“„dĐIÖÜs2gÉ-v(Qa şHPBQx“ĺW0§‰b•ÔĹ{Í źXŘŧ’J,ţ…CĹXzÚ˙ÔńŁB%•&éíV‡%•L8žD_¨"I*& A;Ú·LKŐE4XŇź_şTˇâG˙ŤŰ×Z÷Z5•óImE %¨U˙P±’.QL[¦~–P[ŶĹí C »&HL˙~Ĺb9 G.qe’‰fĘjv©Ř`ÚhňbĹQfŤeÉ‚ç@0˝‰E–fÍ-˙TvÜ-¶H¶Ź-Á‘¤´Ö•tfnXsś™äúµĐq˘ęsŤśIřsjtŃér‹DdďuňĐ=Ô«?UMěWŚv.K;Ö¨0ĆäŘ6U}” ß1 wI ŃřŻDvĺrÜGm© ŕUí5DÚôTZ.(u ¦>ß˙lµ3GŽ5&YCĂ‘îŤCś6V\L’ ôWč—“T‹.Ť…^\C=Ůe{¶®6r79ŘŢ-Ł‹®pTˇ˝ň—Čďý¦—‹ĆŮśs&a§fy’‹iĹGO=IÖd&‹$×€ůOů#Ł_Nl}Ę–e¨:wŇ ľßĺeF‹ˇbÁľ˛űäezgBŰé“ NŤŚwŢ"`´p’@Ĺäx_RČú„Á5•¬X»b삦Ó}P0&ĂĐšHň—éJdčŰc¤×<á¬Îk ‘׹2ć†^’Sel&‰H䬀 á÷ …¸°.«Ůb<ĹăPMNMh¨ÂVśKÜA۰Äôg8˙)©NzĽH™ô†–Á±y[-¨2oe˘8yŮ@˛A›ćdT™N˘P‹:ěä+‡Q^K2­ďPÎMˇ“Ţ´ ňA^,îŁŐú˘7ť4…áˇV‚Ö8Ľđ¤ä$ŮŮM~¸ĄFЏĄŮ)N&ŘăÇĄ$’ÍĄ ŤĂ JTÂ^$pĆ”m¤É3^ę É´—­řń†zŮĘÖDe™±\qšŇĆ,a‰]Ř$±*I [˘ČŻŘ"eaµľóŁů¤D)€c‰í5Ść“ÎJ˙ÄK–Iv´ń0|ą1'OąĐDç™ óŕËßáŠ.‚óFŔ`^ÔęcKú´DćÂ(lG.ň¸ń?PřĆŚČ2ޤůdKDąG#ęě]Ë›Le.“™ÍD†*Ů“Eb$á©ÉbăłF×naŤMЬÁq”,ڙ֤Q­f†´˘qîj™âXqŻĐą-¶hŤ+čĂQŘNĺţóŃŐ`aäŮ…^öK@ˇ¤vQV>©Đ­§¬I';K2Q1˝]M8lIĐ#z“‡ÂŔ=ߢ…r’ É=ejQQđ!;Ô!<‰A&b`˛‰ÜK,ňŮÖ?Ş0Őţ”/íŃĐ˝ŇóĆ!%#˙VĘŹKő [±Pá1ÓÁĬD“.ą%bض,"Re•¨"ö‘ŚJđU/$íĺ\ůäŘŚ5˘Fo!šhôě2Ş9ŐéNy ]-üfIřĄ 1-śI@ –JŤoś „Ő8˘a•DUŚ`‹Ř(ˇ5&“űśŕ&*U kŽ,qś)ŘÁ )ĚCݢ •L6R"Q ëo H%_ˇBpBZ,ŃýĄRMrË·Ěč“Ĺ'/Bg”yą¨¤ŁuW·""d¶\™_Ë:ŘŚţCž+#čśńńgädö,)HGMg/źHitxdp ¦“§Ü+AőČJ4Q¸ĐVY'y˙á{„Š_OUöĘC‚ÎY8‚\TaĘÄK˝AänE)m7‘D´BĹGqú˝d鸛LĘ\ŔÄËcdqąŞD˘/¶…lá#dćRÖpđoZŁ(G5&¨”¶!âD•€€Ĺéš•ó5čđ•-ełEăp÷É ň(«JL¶á  “,Vęďt“Łúe&E17ń˛‚’‰)0Ł{ˇ1:˙ŚÎ8î† "é˛<&ák“‘G¶|#á! ž[2ş‡řÍÜĹď>~Tó`E©wsŇă ˙ýÍG)ÔBŠŇmLür éŚîÓ·ťl|vůŕa>ňŹ‘…,d~§Ę˙ţ Eëé—Ú^Ilцjhc׌ů‡$p=KPMŢ~+eBL™mČâg’kůlAa°ŢBđÓš×ć7MĎ/UfB űĚ4o’]rŢDÔËFSČ< VPujáhm„µ,ëŻęt!µď.nÖçT1‹čÄü Đč•g˘aţ޶úă…(|“ÍBŃŰđżĽ4½‹N4˘…ł_[ěZĽ§K"ÖPx–I!”ÚҨ2<ÉXă9Ö¨"ýŠ3?/ Ę—ŕR«Éeú’uęXÇLJö«żĆsp}2S!őLĘ‚‘K3TĺĎźúŘď·ü푏žË ¦?‡°Ź˙;őţ˙<ËÓDwW<{äDŃ3*˝d'ŔtŤ۰ ×hS”]“8DzC Rä5=pvµ úpÚ`—°3Ż´ŢĐO^á._q#3XQ ZÁ#qòp‘¶ł[!„?Č–p9ý4„8¦ ĺ]ŃQŘŃRHx„U¸Š4^’„± •`ÁRě+7čdC8O8ř;Á`Č…¶†ťV8.Lh…#ÁRQhŢrß1„=Őf8ČPš0A虡†:„4¨Jx†?8ŹŘ„psHOÓcU@¤=8±Iţp »` »0Чhж€˙Š«hЦx Űp ¨¸nxböEŘwĎÁbs ŘÔß¶Ő&ÓJ8!Ń&A1€ŚQ5ˇ ÍřŚ!ŤóŚĘčÔHˇŽŰŐŤÚř#jÖ&ű@5á"ŰŐ_t‘ŽA!ĘčŽ-ŇŤÄX ćá/ÉŤ0sŚÝhŤŽˇ1ŐŤŕXĎŽ×Hiú(Ť4rŽéč™pŽŇŹE‘óx‘ť• iô¨†–Ź'1Ú,ŮX’9Ž%ůXăřŤĺř H…Ž”&“Ů!Ť€\íČzq"`vr{N·Ů3eŰŕv ’`4“` ·p ­" ĐĆ”I ˙m&”·  —PFÓ{Vc*ŃMÎwE,ÖVĐ*Yi;ă{r8Äg@ç–Şs8xĂ73,ma:Ąqó;@G—mé—xŮ—¶“p3ń;Ł“sm‰—‹y‡ Aq0fÓ’ů”É—źrg9É—·q~¶“ t“—ŽiŻ64@Ő™é žY—zI—–9—‚©™“™˛i|s›ŽQ9–“pďäC5UŔô}Š1'»‘V˙° &° ŰPoa‰b˛!‰˘–an®‹! “ LG÷r ‚ËŃĐpǤhL”TuýGî'CB›%CN4"‡xĺW˙HţÉ?J4-w€†·yŹÇx¬·y,y {ÁĹô{¤÷DáSu!łLwĄ'|$ÄC:ÄĂ÷ ĚŁ|şp=Ůł X?µ`pS—5˛q ` Jp)Żž%0 J öJđVůI©‹˛ ňEMĄr?éy?ö3?Ë#€ŕ7€Lć—CŘr࣠FĘ Ö‡R@iâ<Ăw.Ą©7=Öçzî×)VşFGUúi¤—_RúFÖWź«~—txĘńCXu{ä8“ ţ@~q ·(’đŔv “°(Šz ’đ©1 r ¨n ¨L ©“P}ńrRÚĐ5ÍgEs×˙WvŔ‚w`Ö`<_bZÚ@'±ÔrHpá&–çĄ`‘"°1kju 9`b’L±]zaIłGá†nĂ8?Ą p3 a ŕ,KakĺŐO}473Â÷ř%Rňą `u@ŞAO±{==–˛'‡t¦üą˙?óY~¤—CGgźý™_ęÇzŮ“ĐD'@‰'ž˛<(~č#€•Gˇů:Ám‡¦Z?c™žRM¶0/`°F]F#óQ¶ŕ/=‚5)ü^ßaµ·Ë#.\Uâ"ˇ ťÔľ4âpú°ŚŕCA˝.bpfżób2$” Şo4ë#¶•-ˇ Ű0Ř%N‘-˙@!¬ó“D:[yôČ…I¶e™7L® r¬oÚj\Ç]ůFŠAžŤ»x¤·sS?ö:ś´6D1“0ŤŔ(8a ¬‘*Hăž±3ť!núĐlHwěšľť!*÷0*Jj? ‚Ťȧ—e ń˙ 8á †·đ–57Ać–yv‘rÖâ7É${Wë6­­ł2UËzp†Ëb’ż'x/řAĄéĘ)·u[Ëę>ÁeĘŃóIľúĚÜ•{*¸łÇ~,Ż|şD~K~áLĘ»d˘K‡˘y2”á¶ţ`»Şˇrp)ćŽp”Ş‘)n±ˇ`ŰPnSÇÓLHŠm̱ÁEO:ź„«} Dmv JyaÁČ<Ż,łŻ)SWşŠ¦#âüFű9y#˝@›E&źR<ýwŃőš§GTO64¸óWŔmŻő$zw1Č€:Dť« ±›A§AÉÖ )puÄć`üś(­!aŰ ˙’±›R  hžQÔ|+6– s—`őŐTŐÜ|Ňrzzě^zŃ˙5y Ę·üú~ýGÓqͦtśeVłŃŇ?×5’QŞI wřsWÖäbk§O‚tQ_aZŁô‚=f ¶Ú¶‰% "TĽ-0ńŰ=ĆÂ=µ#ł%|ĆÎRA_ĚÍM4ř»[«´M-,Őh=VŰĂýÁ=K·ýÝş=µâDŢg<ĹíĹS+âżMÁ‘ÜĂ ‡1KËÝ7Á˙ÝŮÍŘŃcÁíÜújă-ÜtÁŰdÜgśłç=-šăޱŤßó=µ<Ńß÷}Qŕ¦3‰{ H0Ś;9ö×|ÔAJ|J-(ţ®Đ3ŞQ?*6M{ERpW®˛é"ČŤ÷čZđ¨ăi’0° 9®Ś–ŕ 'IÍ R»ů’00Yyů# )ĺÇĄŽµËţ‘.Rň¨4@ŹńŤT;ć?ÎăţB!úTŚL…:ÉćJäÉřä#‰ĺŕř0ý•"]ŽÚ` mBXYŢ•@çcĘ(HÁr‘hľ bľčňŹCľćѨ„3ĺä×8YÝ(ţ22yŕH.čßč˙"î_PĺĐŇ@Ç*r˛ŔAôŘ-# l}á§A·>źë—žO3WŞý|a#—  `3ÂąśĘtŁŇ27UcEsÎ~Ѣë–7Í6ä&rĘ”?ŚU“nEa푼íÇľÉ>îČn*YSrńKîĐžË/ç7lˇ3µŚ?'×íâżµśnĆľě»ŮË.nŇ.î)·›žSđ*mEŮľďĂSrő^žń®ďń>Şą¬3u›7ů‹ •63ó§SWkÜ•˘LúĄ®§wmm@ťÓÚX]E-ĆÚNę±5ôxž÷DȇBuńBęx`!€x·Ň şyýwźý[âŞç@O„x"˙ź@——x+ŤŘiőjŃ'ÁâU¦8OŻő%ł:®öxMźâMőŢ `J‡=Y#u‹‹Ś»Áës ‰âA˛ ScŞŘč˘ňrb*I:9̤şř>‡]Ň­ň´č%‡çŃizLw1<4ÓhŞĄ÷·Í%ô׋÷&Ú¬ F4ŤŠu˝}%¸g’~HdúË”C_ŔhrÓ>4k—A`ĄŻÖĐDékž˝ťiđűh'*ş1ů\°Ďű0Đ=ęđ*Ą*–swE¬ cÖÔ6v y%k vpΓ–QvĐ+0b–ÜţÚ ş ŕo 2đRP2 ‚v€˙˙ş šP%Áýű6ţéřoź? $¸ŕA&dH±á?ű Nt¸Q!ĹCB´RbF”/z$™eÁ‚’$ř2˘ĘŠ1ižÔřň"G“='¶Äů0ĄÎŹF’ÔfM›-mI¬I’Őă>mY÷±© ˇ-kţ¶%ůgËŤ7’LčS˘d›’ŤI¶™0˘M B¶ś(qdëęŃšX·é»–µi¬ú´a]¬m[ÖmR´Ý±âwźşöYÉhG—6;–ěř»¤Ih;ÚţɨhI“AÖ¶¬H‘aĹŽ+2ŞěÓdGĆmĎűl„Ö„ÓNh+DŹşśů¨R™6}"˝ů·ůu˙ĺ8].Mú©ÁŠ_­(SßIĐu¦Ď9^3ibϢš3tĽíšjJ—4¦ŠÄŞŚÎÓhźHlŃĹŔĂČY‚« ©$qĂ˙70RuAżČŰŽˇÇî1ě0µIQ1¬f°Ä’}ôąŁUKtŮF—ĚţIí)ĽŮ%4Klئ2Ą O#+D‹ŇŠg‘3+Ęş-Ç;ŽÓeW0 .ąŹ+‰Í7ÓM4;ôî ĎóĚ“:‰MT¦›ě…_ś ťî_@CÄNÝ‹ä Ďş÷îKآ¦Ŕ˛ĆżHŞJh0Uň«!”ňˇő< ôN4“2l°OĽµ1–{,«ű”©<1ŰüNä‰Ř«YU%ŇÄ–×&R¨ĺ´K´Ě‚v¸^˘ý\ďĎ…ëSJQúj–YÎ~mľš§96zá ´˝•[w¦¦v±F©$ đއő±†Q˙•č<¨&¤kvú˝Ś“ű±Ăh¬•eČÓŠë˝ ĺî&Kî×q} ŠśßWí´™ÍŞ§Ţnްe ńîŘ; ?«µn_՛벻Î:éWżsšsúć¬N:%¦xREűnc3_x#[ôék&Y QMĹJĚ*eÄ´˛őe¬î€ŃŽ_·éŚW„Ę5ȶâF#[&mŽÖ6_ cc˘‚bO¬z“d#3ďhżÉ@ ®k[˝š|kÇ4ÚŤiżř¤š?RÄź¸îÎ* é§34„”ój•/cţůĽ$Ľ’¤¸*Śl=żÜ‹Â~„ĺDGŐ˘ľ™—>űř:¶Çµý§óv»~8Ćf•cwăôct:Íż8ţ±n»[á:*młA“ŇkTěĽĆăP¨EˇJ2äÚ`ĄŽ97Xš¨±’%˘`¬˙`˝K,†łí¤“ť¶Ľ®uőťZ «ĺĚ{¨Đµś5~#’/Hß˙ţQ¶Ţ¤'†/ jĆťkŁ;ĄHąşM@YLßFh Io ¬(•SD¨Zˇ`ý± T)Bú|OŻ ÷ĂŔ˝LEŤŃÇ.ä°;\Bwp#…KŰŃŢš÷ÍüŰ3ęćc(áŃűíZ ¦çÝ6­Ć~­×^Ëh¬ÝÖv_-2G»@GÄQk‹T$ŮŰÁ±PM–µ!Xł¸ĄűP‚Cęb„Ľ¤j%„&4ť^[ŘQ…ÉđŠúXYb2vŕŹŮ °ÍÖ¶'Ć­•VČE«3Řfu+[ î˙ͦup$´mĺĺ9g;ȲŁ/ŽŃ'8cGiXáĎ5"M×ZN$lІ7ôѤČmR u!eZ‚%”ŕ…S1BÎ"JŞ…—şN‘ĺajÉá—ůŤÖcł±Oëńa«łĺörSN¶őŔ|kßÔ±tăĹO€c±Gń>»~H›őëq·l}Í䓸˛–üyŠT$ Jm$Y‘Et2ćřÁOĹp‰đ>Lb8뉠…#kË}fšr¦Ŕ.§_uq{ě*ß ˇć<Ő#»Ń«ű¶»člí)c6Üo˙6!h÷ xć‡Ä Á\ś_{Mż›GpT´!P«dm¶ŘCB’}l˙ŮDúÔĆ5đŚgŽhýź'ŞŐ†źu lŮâŇ‚/Ô`oc NüĐQ/ąľ8>@Đ}˝´óÄŞÝ,çr“ó/t:›uz±=â6˝ă3Ů;ą—s­ëĐ»p”ţ˛r,źČ›D $Ó˛łdŚ‘›Xă0ÂŮ]Ÿ5Sه=ŞÂ¬€“`/i›§Ą8“Ž">ű°8 { j»áa©ężú˝ü86ü>ăC1|;‹˝µ9‘RuÂ[Čp •ćYh8żúGxŁůr™„2ś‰ůĽZ!A9pŚ(!˛DÓń»0¬±ą;1Ř)>C[Á;Š'ň¤×C/ĚÁÜ:˝ŕÂö3-˙„#D3ľ9b¶Ĺé8GŠ+ţH˙ŕťÄk8 >[hĽ}ŘT™ G¸…€©8µ0(·y »3Ĺ‚Ą¦@‘[˘+°„KČ>KŹČŁŘc˝;lťsr40¬,Í .©6ńÂś®cą^D/űrż÷ «# ¶?óDZŔř32‹»±ÁÓ‚ó č ­hęs IP Oň‡Q+ĄSB5ĄR¬[P¬:ë®YEZjŚÁY™Y f‹=ăż:śFŰ2lă=SśňǡBŰ ;EHŰB Eüš,ĆĚú-ŔŁĂ’ČĂűÁľA0[ ·©”‰€žÓs¬#„YHşm˙(‚kČS)#؆ྨIŕ+e˧ľ1‘¬"ějŚÇŘ2(q¦"dmłČÍ"H‰«”‹-dd­źĽŹ2›h1ţň1«<@]¬˝6L }*»Ź«śe+ľ1¬¤ąMé čK‹Ř†Fđ9Ix ǔƅ[0J<Ĺh5ۉ“Źj É0żQ{))°5YĆK˝Żł8Ȥ­ÔH7\š ¬8˛j@;<ń*@”C=×K¨Y1d´<4ĚŞł›ŹI‰¦@0Š©Ŕ©)ˇŐ ŹmŢT І[Xg;›†Đ.çiĹÇҰÇ[¸m¸‚ĘČE˙ŁAřű3 ˘ł•˙‹Ę\Ëţ? ś0¦ń¸ 9:YËŻ99 Dř˛¶îRŔčę8±['Z˛( ˇ/›Ę÷„±aLm°~Ô05´_±…ČĎÔC§DŔ’3ÂFÔĚ;DŠ‹­űcĆłĚNúb+ í3:aD®şŻ»;Mó\ĐQBŰ›Ž¦°9[Dsł '“śŠ©¤ŹĄÄ…“ډżš¸}B J2lEć\¬“Z¸‚b+ę¬LÉäŔ¶tH¶»P±BQDż íCŐ¬C ;đ$\LĎÁÄ6B"@ µŞŐCyK&[0'3(ęÓ ˇÉr›˝µmĹ˝ş†Q˙R ™…Ś˘IŔR ľBEN˛ ł–Á},©óϦ”?c ň4=>Ö*ÎźôJÜ$ŐŁ=6q;> ´„ÓŻ!Í Ź€Ś# ܶŻJé«‘d$9.­0·MrDˇ2łP‚N2I€I5¨´}»…$Gľz7iÖěŚĆĄ‚cN–y5¬E†P ĹŔË1ž±Ň¬%ŃŹLŘRCĽđĐ…\PőÜŁ¦ŚČ%1b3ÎôR»Ú›AýěČÝ{OŇÉŞ ’Ę@Ü˝ć.¸äť1i6°źł˛}(J‹ˇ@SÇ‚hIy4‹©h‹)Ą; 18Ĺŕ°ú˙I¸eQ‰*×ř آ:đqĹŠ›µ†)q$q%GÁˇ*¨W¬0°Ç¨:hWo¬Ąđ†§•“m MĐ…–­%•,W•Ôž¬¨%źű*Ŕ}Í1wU;-•Ň?zŔ6ť-„= $ËŻ äEŚ-dŻĽă§Ú\¤Š‘Q\©ŻXÉžXŞ{žĐžÂ0‘[@‰LsĹx®ç‹9«¬«ş|ÄşZąϰ^ú‡\x }¨o *–ň¶÷˛×ź|ArJ[ý¤=Ú¶fl´ăc‰ú„ËFĘ LńÉB![Ôk ‰ż*ˤ°0§pŚšµ˘ŚŮ§°µZŞ‚Ś°]ťČmČ…đý‡:@ß *ŘŘĄ›Ý¬ĺÝŁýŢL¸Úć­ĄŁŤa‰čŮ* [ĺͰ]m¨:ĐM؆îőKČqU®އ›ý‡J€Ţ<Ţ<čÝ*¨Fâ›ÍYŮUŤ,1SťLűë0-Ŕ8Ę*"›ł=ô­_<ÍQŤČĆÚŚÄI\ëPRe`@˘Îp•5Ć˙ZŇ!ʵ“Ú•Ář ڍ„Ť(vîÍęŁ>#ÍŔ´I苦•oĆĐ Ć2C"ĘŠ)ص]íb‹éَ0ż·ąYóĚňĽŘqĎł&ř$ęLr©©çC‚ ‚o öGI¸F"Đqł–śJkpX‚L“(ŐörzĂ—Dńś[b÷‡ďńŹI  ö4h%ßń&'‹eŹ}@ď™Qď•k[=zÍA¤“ó;9Ôě€ě¸+u«fŚŻŔn<ŽK“Ľ ŕIěśń¦÷‡¦ Ih\¬'˙Oý@AĚ­ă0“r&[X&Rńk[ $[Pńž˝Iű‡NĎłç}0ŇHp„ç#zY˛Â6čô*$ÔLt›LÄ´ §Żj;,§łPqJş…žW?sś„Xr¬čI†g8zß¶Âŕ›,ŞB›¦B)ĽîęŰA2ÖÁĘě6jF×ETQú“hÄ"ŘĚü=>¶ Á¦Ŕn4›Îěµńš=˙:ĂÄ`ĺülŁdRÉúŹÉ™—@X°ý—}‘ýÔ_ŻÇK菸†&qĽĺx}çhÓĂ2“ŇĎýĚzŰ„dUřÝďţ˘P5Dżßł˝ŘäTFßR›ŃU˙i*çŠ˙Ág[dUŽś69ÍJ)L N‚ë*ł¬E­ÝM;¨®N÷íŞö‹¨NžĄ×”Ö¦öîIࢇvÓ‡¨ž®Ź€h$É–ŔX˙¬Ůú§ŻQ¤m‘*LłPR$„ű*6j”pź?…˙ö)ä¨M B M˘ä¨ŇŁľŹ±´ÉФ’#ËŽ-QzL™ňΖ*{ţcůŃßM-}=ĘÓčRť4‘®,ştjKˇP›2EšóçPˇ+wVUĘU©P…ڬ麦-‰µH‘Ú Ý§4–¤mÚŕ¶´¦Ć–­knÜHş&묤[ž^ł5ĐDB}ÝČ2ˇT¬ImvŻ9>›Dźe}Űš\’Ą(É’D#<Ą! u˙¤ˇ ˇźůV[$´±ŽÔ˙ úDrç[ŤÇf|T×Ć`%€×’lúČć’XóOmj$‹€;×U°ťeź5Urnĺ––„©Í%–őA•ţm)A”zIÍn-|˙Ä´ş%µ%{Íůö™‘ř7Ř>}^Ľw’¸”?mÖĚYB2ÝyCÓÔPĽ‘Ľ'_”˘-‘Ř"¶äÇČ=ł@éĵ±Ä1KlRu8•ÖâČgCe­Őň›Ť,·*›T¬ąHńa‹ěđb©źlË?ÄB˙Mš˛ GČ <ńČşn! í KÚP‹e¤Ă™+}ć`ˇŃ†gŕµAą8OX>Ů Ţ> ­á0(S‰aPľŇ•i˝PDg–€|řµčl7Đą’ 5lCRPł@¨•ú‹*ŐzÖ¨…ż±A(m\©Pج·5Śóăɉú#Ż3ĺ­‚h,"i˘7]yM~RâŚŔ>'Ѭ`¦ł„.¶a KHĐZG K˘’%ŞEM(a%ý•š¬5‹}_ ‹µžtÉfÝD*Uˇ4E¶ŤŚ‹ě"qb5ú…Ť2š;ŰŰwI¦(r–°”P,í' ł(P[nq ł¬‹š‰Čjpëß˙ˇ…KŃX#…Ń4a”¶š)Ia¶Ř…Ţ“ Ý"!Ö„?na‚k¤.©‹-Lđ™ÉqÄ·PÂA™EWV+nµě•3ó‰E´a’2¨lź±^9D*^‘l_ű`ńYJe 0™Y+h>?൫d)`ġ@­¸ş97*Âh´f‹8Ř.A—>0s°$p*9‹#¬ń.…H^JŘ%ý&Âł4a…€”–.Á°mXá3Nç$šÎ7hĂI*0‰ ®‘Ż7”ó*P ¶ˇ‚[¸Á«ţŔŮĹöľ=“ˇd;ŁŰŕćŃő©2Z÷lDĄ5F‡‹™ÇŇßŰV?ń­c›†¤˙ĘSć•*ŮÂąĹ,‚Ž )Á‘ţb„|)I ŽXŠ$aĆĐ3InPÔP3ef……j±Źf,ŐÂ=ZFĄ™mKš3 I@ő auÂ?”`"'Řb¶pRů”0Â|Ć Ú g|‹+MW5ĺ,­]‰*”€<č3kiV”Ż€ŕZ]MúuźBě¨^ŃŠ]&+»»Běö­iIh¨D,ĽńžJíbšýK˝Ţą›A_&ŕ—h”tŁćP75-ˇZ>÷Ú^é¨Ó预pZ @ŰP“gÔt¸[dţ±Ć%bkě‚qi§+ÉJ\9…–đťč,Íˬ~˙j”Ľ •V®şÖż·úrŤâíĄuŮ«K®ůomÇ2hüŇ»LŽsmY‘XŢÓßç¸Đ“b&g ‚IJPA]ł®ż ť©“Y>CBÍü‘…Ő,•´ôžńNeŻ]äުl¶/Ć­˘Y3`Zo™52Úu°Žö$ŽPHŢúŘëC˝Čdł•“¨”tawh‹Ć÷BĐ„ŹąU™›ŕ}v|!ťgŤ j°*˙p#üĂVWúä§öˇŇ Łt0ËXÂÚĽę`é¦Ĺ˘öńMdFł@Ń,‘6 gŞé_)EşŕI&Â]‡LŚľţˇ1Gdk“\Č(ÚŘ"§+ĐJm˙ÇiLo¦'ÍĘ0ľ‡ą´kď=gî–µf̲0ď+a­1†?AJ—křI~şUž©–<§­¨¦䯊G[ ˇ OLö óĄAj¸:¦>’°™ăÍHޱâŮHęoWTđŹ6Ş -Md‚#™Ŕ’.üˇ ]P@?ÁŇ?’Žnąh˘ ÚČÄŇ˙Q‰qÓAë.ë­xąčîćĆ =ëByuPŹKŃ 2)§Ěh|‘Č÷ăŚ5˘‘˛h˛@Č*äA÷™ŘFÚZ¶Ś÷ă©ěĄŤÁKď¸[ČřĆčţ~üo+໕”ëá˛ŐŘ3q@3­ÓQ”Ŕ•©He6Q‰Ęä?P%Îo¨ÓŘ–R¨çl]Á6Ů‚—tÍĂř@ĐĚšJ#¬…DXG-¬Ä?ĐĹß(Jr´…t¤:Ç6śIÁĹťĄť>d‚&čJ.ŕîi‚6ÔAäÂ>Đ€>¤Ű?Ü^ ĐŔ>$ß?PÁ6Řä>ä!ÉHť”…ÝÉR\yˇÝ]©Q˝9ÓŘť—`É’üřXá!ŮŤ5Z·Đ—u¤Č}qŰ€ÄHKđE˙%Á$$Ť¨ ×>t–$`€xĐţř›U`I”LčX“5m.”Ž-l|©€U Ő%ÄA NBâĎůJ-á(bń4€Wta… Ť[±ŘEGä‚.xŚ›¸ąŃÉ`ĘüĽĺÂîŐ€ ćBP<aˇ‘wáQAQÚÁµ^C•öŤye[őuŔUQBAŞ ce …–5ĐPŚô8O$´Är ‰čşÔ’0†( 25áyi ŮetÜfđ™ÁčŮ5…Ćw -Â×U¨ÚVć_© =‘ű”…ÄĐÎŰľAWD=aŽ!–ŁyŃőÁŇ’Ő/˝y±[ÚńÓ˙)É"CćK«‰”«I\qôÍŇ —Š<Ř?4Á,8B;Ť¤ 8BĽ1!,~ÔöčhI~Ů…\¶čĂ ˇWX‡o´cpĎGÔ‚6R—S°AŘl ˝Ć©ÁÝíC6h‚BtťJś›.ĐAIčŮd" mBäÁ“TB°PTÂ?.á١ͩä ¤öŃÝą×&Y_ZJ_FůS¤ńĂ1Ăq‡´AVżäDPxĚÇDÚqÔG¬5´ a‰•`]čÂÔ¤̡¦I`žđF•ôÎxHŰBERÔITÄíśÉ¬ÜÍlĎED›BŘĘFµDúCѱ„WZJ˙ÔŤ› vb.T‚6xC%$]. ÔIť7 ›6čf\ŘžlÍ[XÖŕÓĺlé‚ŐMg?’ZPÁM_Đžv™W[™Za\J6ˇř•ĺÜůÝŔ‡H­He$‘DM=ňţ}ç.^KćŮKb‰g  %\X´HBŘBG #ĚAlĚ> €5ČÁ^˛Eůx„5AuȆŇČÉČX†p¤ČžGžXFĎé˘?Ôěmʼn~DđŃ Bmj&hÖĄÔžBĐ€&ŕěCÓ©ńĺASÚ^ÔýCä`.Ô€îéBlČ$řťça&ÔŻ äń"˝Y)Ş%ˇľŐ˘Ýu|Ü˙3bË-“c).F) )‹Â9lbÉ=°¤t é§!éÂpĆlÄÚÄkěl[P„šĽ «x¨H ¶€ŔZ|^l¬ÉeDÜšolP«e·lĄ^%Oč‚WfB ćÁ Ţž6dHĐ@ŃiBlť Л֕[đŤÝ’ŢŢŤÂŕVŞŕÖ!ť·9Ë\^Ú_1d_ńŹő©M[–Ąxöâ*ŮÖxšęßŐM’T*mĎ"9 ™ěéź”@T#‰4áČŤŁ6‘ŁaáTGTJ·Á€Ô¶ŘGëÄYÄ“‰DHřB”TKA}(kP‰ŤR†¸‰†ŤĘVŕŔ‹Óť.|˙Bd˘lěTPÝlRÝ#LGŰ7t›†ÔORŞ×FQ©z­ĺŤy&YnßČ‚›pë‚Řĺ–9 ĹE%´Ä@(D\Ną¨Ár„I:É:fĄ n8Ƈ]XX96ć~˘ŐÁUwŇ+},-µOYh#^•ç“l×U kž°hgUĐę“:¦%]鲦NTZŢ «¤ĺŃ/šm]µť‚L$BT$©ĚŃö O8ăAtiM#„˝ =A_őIH±±Đ4MÇ–(. É$éČäżk4Pí̆]DÇ.­tUéݵííC×ĹąY‚Ńýjł ! 9Ű‘®Ň>%jßZE¤Ç¤Ű9™˙=ž¬°®ťŢaWZriGÉĄQ´ě0ýŠFtDCÄ6†$ü…ňÚH€©ň"!Ć m8¶c^“¸ÝAă&ҸF!vžĄM[4Âá°‡©AEŹwH]4‚Ęě$7F˙TA»Ő¨€ĐÁ.XŠíµ˘pj‚pöćÖYÝ˙§Ąg&|]SÔA'z]ąMg×MĄ6Đ@€„Şžâ×=°uŁRÚőŃĄ/ Ł…šI!’Éc\&k„¨çß­H±Q°WčÍéĹÝ·1«˙Đ©Ŕ¨EĚć ޸]XÔxXŕŤlD‚@Ęš ŮQh{@h ¤‰ĘéCžŚgbq…˙Šę…ŞvD j]čč6qŚęh¨Úh úTîź ą f‚¸ WBŕß>X°‰b‰Ńń %xVŘÔaÖ!”^¦íXzT“MrÉfa.uůh™žßÜD` 9Ĺ a)Ů9ßsAÉ·z\žR ]‚.PfăĆWkúl¸…=Ŕ¤®  ”r\r0 E°JB´É˙¬×ŮŠF¦FgäBtÎń?„jtĘ*×ެşę>PÁÓť¨&řCđi…¬j]ä‚<×é iXRASfł¨Ţq]m,\ ëüú,?ő“wĺ.Ź ăÚpŢťl1ň ÝÔ—´jÍdÝE‘-˙Zň\ÎÇݡ…Uöb ăÄ+©„LI8fI^|„VetŠÖ¤«‰d+&?ÉżÚ±ŢLěÜ ů¦HlOřZK?… 2’e…eXŠN‹ÁPÝ>ŚČŘhĆł=Ę®›WŮ~´1k×ôŰ1çîěŠMyc01—‘RĽ@`Hl–JÜŽCňŘ·ine<´Ŕ# í†mÉWD”Üt2w#ćPKDŹY6˛ćÎs᩹Ér*-9Ťmí1'ňt«Źl$ßđ guÝ[ô9ß.ęÎm«Ů-Júó`L!–Ŕ^ Ëh•VmĺŻÖ]/Úś mâ^/çl0Űkń˙óq„, $Ç6T¦ J0v:›Ö ˛XĂp›2ťp*D8© VsWŤ6 rµ´â%iĂVŽě%Ë’)F±_?éuÂs/ôŘnđuQáv¦ 3c—Α–šĹ1615& 4ăŠŮČŤä÷_$DlÇDň•u'5¦Ç]X±…†.Ŕ¶%ŚËŹĹB(˘Í)ÄtÔ‚#ěä†(Z…úf¨@ŔźÂ‘mĎk>¶xéCýĘ O |to]XúĂ*ú`%č©VŻ`ŤŢD% ]p]Ź"° ţ8XŠ[O0Gś›s{e¶ :ůˇ)k]ݢŹ_öÍ.çR©\Fź)ם˙B}°ç´Ňď#iČ ş(ďgoCŽF˘—FQČÁÄG ögÜ‚0äeŤk¨Ěl źćŁFŻhx  Ďr€$ A†F ߀ßBźÄ‰Ĺt#ą'VAŽîž>_ŽëmęÂ:Ó“.éRtŞ\Ô€¸%_×ńt"źĎ´Řqşî‰Ě’˘ÁŮă[W Jw§‘]­×*ň•cł*áďj¬c٦i2cmËk’…,°ń4Qˇů… sc)ý“)^}śăI‰ `¶.ąZ¤¦›ŕ˛mě 4QČr( ÄĄŘ¢ÚÇtD‘?÷(vg }Dňť¨gâ^˙§>]Ń- vj&č¸Běžî9]ě xC ţĂîEs§Š`&Ěž>RHL§.ÄžwBĐĘMU|éśÝĘ®ʵz36—“le÷Ý$†}‘T"=ÔQsC*őÁ-’CWXP›PiôkZÝÄ;I˛@.ÜČNĹ«LĄNŁ$t€gJĚôą>l·)ÄÂ2{ĹBÚJ őŮD=˝yřń|˝!á2űú¬Úâ˘a—>Ţý>áłînăw4aµË6ROx´{ăŮ>u±-IÇýßkĺą]čQšy·­vv¸4zzT€CŮűI©˛ćŹ[2v…ÜPb ú»aĘ|Rű"˙í¦¬xIő[â5e˙úáQ\vÝB\JčŚOcLK$Ć°Ö ě¨DÍELŽf®ămo+“Ž?,GĆŔ\ wj¨O±J«Di…éR ÄĎý‰÷ #ăJ.đĽG´čµDđŃţ®. ď.|VĺĚ75îÄż}ţ¸ďź?„ú.lhPáC„ ):dx CŠţÓ8cĹŚ9z,yŃź6kş¬iKb-R¤6&?jkdË–,Yµ™pdÍMPˇŞq#ËÄ@G’$)qŁd$C“&7ęۦ +ÖmÖšěÓ¶ÍŞ>m^Ă^˛ăŐέ‘c%±%I›}ú’ü‹Ő¦Ť˙5[¬Mern’˙dEÚ—&RŁ}mdÚť ňŻ_“˙i«Â0—¦š2íŁ˘©’·:šňě«SĎiËuRć©ó/3]µťÖEĂR¦urUҤt}y2iĘEAŰżLĹkgňť©NrĘ‘Ą~éP$M‰#'ŹśŢŁöÉÚ#G¬.ůzwôn‰‘rv«ÖôZK˘M’¬™˝ŽŤSË–ä$é˧Ü0Â)ŁÔčË7l1A‰ž*á%J°Ĺ‘öŔ»N¬měńP%—ÂŇĆ*ŻK›)ľ˛BźďöŃď $öáźH$ů‡Éű‡ŞĘŠř' }lICG™ÚÄ0mdi/6¬ĂŻŞ˙ŘHˇĚţˇa·ß2Ń…Š<*qMş®SNťyĂ’ä#ÉŇGÁ«y_ę$Ĺćě(ŤY;EŐě\±čÓ+ üó°HH”„ 2Mč7<şFÉ[L¸Úźü´–ůÓHťmIŮ&ś%ŃD±Čk¬}AčjŤčľ8Ňś+%č¤#Ď:ĘŽćŃ ‹éV°Ž:ęNŞĂ;m!„ę>7¤˝+Źč:$ Rěŕ+"ËĎ«T˘‡śěí¨â\fŔOşZ%]¸.UżÂiĂ|“ÓĆ®­ů\µŠzoŻZ2^Ą á~¶ĂćżËöb‘ţ+ďęCşü=l‹eďҟɣ(ÔŞBóá'}ńńň˙5]_ĐŐ+ľőŔ wR~˛C/42Pcö%â Zqą`ü$b<[čĺ>L9•BRő8Ď…n<ĺ+ÔçľŔ]ĺ+*銉8ř,;eV¸Ă[64 bůă oŃÇ(Áë!*g—{ÝţŢ—ąő­sIš{ĚfłőaÎ: {ĐjČźmj|çúź_řłř Ť~ěÓNů¦/cA0|;ŇHKd4f{‘‰L" {iÄŚ‘Ć6Ćč\%dI‘š ĹŇĽe)ŻmcaŰ>ě`‡mČa„ š„ÖśđIČÁ r¸FŘnѢB®C˙@Ś›>ŃMýsŇß8ç)ńIfh»b ;Y˝˙íé,‹–šŠţ޸ą«=1f.‚Yw†4SŇpfť˘Üô^©˝¸?µKßGjÁ;I\$ ű š"‰Ą¸Á°…âm8BÖp„,Ü +YôCÜ”E»‘Ż«´d+[ŮŕŰ:•)X»8‹®ň”¸á 7RÁ?ˇ–|-\„łĆ—x?Ň5j“§Ôĺ,kŮşLJ&zöóˇőÎÓIJ1±…?ł$BS7Ç0ę•?+č%3×Ńőńˇą¤Č6FĺES‘Ĺ7x „@&pJ`”śjC  °©Óm”`WJřš>pŐ[(Ő™ q^Vě“’]5ZÖŇĹä° <˙aWŰÄ$ś€OIĚBNxCđT`‹}0s˙@ĂŤ4YąŢLˇŚ¨·ĂSş˛QU” Ţ>BěľżčĐgŹeâ>b5ĎĆ÷{Cĺ·˝ٰˇKtńŤQě¨!ňr.7ćßű—ť€Ľa±ę¬3ÝľRgÄ8”ęNFL“*·¨ĹąŁá>jѕ؂ĄM°†ĄJ6‘ UÝCËëáťů/ÚŕZ·RnXZwĐĹěđ–ĚŃK÷s#$€aRż7rIíę«]Źäh^Ö %d‡!á[‘‹Ěô1“"îTá!ć]‹4äd&hřYuRȢ’h>rÔ±´§¨ŁNŽ<"i[D‘`Ö¬µ#—› iI˙—vT­ż‰!ďŇ˙‡$1·)GńvHi$Év j‰yE] “w9$Ž|ą%ĄŁ?6ť-ö’|ź2TŹóvŐ%«nkŰáą )ŔWIhń>âÂŁl§ˇ ¶¸ÉMŇ€ĽĘmhZ’€·AŹÄEIAGÚ ÁS ŤĄ ŤDa†eîľÔ‚äi °˛q[€Ŕ­‘EŐp}”Ŕ.I¸É^ú’X@Ü!µ˙Ń—[\$o„¤=-¬‹‹á'GŐÔ҆şpË>„¶"ńkĐĘn1Cr$éüü-‰ÉËŢńţfe}&’Suşz„í2_˙öAŻČÚ+·†ĆóR»6L= 9bŠß®/…ś› 1oš~6 "ůŤÖK†¤‹ü€¶Ç[¬öď~§Úďăwn•E®n§Ń­q$ ”óX0,pćťč*WĐĆ-lq…ü$t݆Śč^#…ץŰwź ’*“Ł»d^F_y$dT—¸¸•\~wy§ëĺŹűHZDJ ‚ôŞgUu±˛m…ÔÂÓčB.t$úţF˛Í$lÄ3ePÎ#ĚćŔL]ŢÜL‚YÎočŻ×ęB!Ě.ÚXęôt¤S2®H$a|PNú‚Ö<ôŔŔá¬-ÝNÍáf‚â&"Â%€äHü!ő˙ć‚/dŤű´Ďđ jMÎm˙ĺ(âÔ¶ jMÖ c]öˇńĽî€’&ÖŤ!ŞMdA~í ®¶Áž*?lÁA„EtÂ* MPz'µdrF +Päśě¬?6Śŕ´áě U¦Č ýˇi$îPn1Ä%Đn‚áä dmňš& ÂŻ  /fâ%Ł.€M<-ÜJ]šFŮôă× #/"_"Ń6ÎbnI&Ń •Ťwňbĺ¬ĺ$/eÄüÁęÖE đ¨Ż.Ň@dbĽb&Ř… N’Ú`cćBNJŔÖfĺˇ Nż¸ń0Ř #îîO’f˙N\"nďä* %©/îâ Ăݢęeę d!€$!~M ĂF¨l]`â€Ü/Iľ®ń¶áăŘ/FQÔĹÔ…/R˘>t!ž¦E¨–ËďjGnK§Ü@śŔ(L@Ü@§Ô€%U‹¶®ˇdE ”€!”ŕA ëY”%Dđąňťç•x)MGC Çą’Ňj)ç)Ól•¦‚$4Äąžo Ňp˘’í"¸RsžK´˛Ě^öC*žňp’2uB í)Ąbn¶R.źëjTĐďšr+ńćjîn/ďĆA‚ą2­rßňRrú˛p " F‘A˘’o˙, Ť‡%\ŠŃ´Cj˘*ˇ ŚŕŠ€™ˇ¬`24ݶ‚Â)ÁÚpúA ř)Bľ†fHŚD¸¦Děăm6¬D2(n|O#B,}Zh!"Ćć"DHěě?‚9źď;hâÄÜ«íô‚l.‚zśÍ†É“<łZÍ 3*#¦Rh¬°Ć±đ‡#@ę#4Ą=)‰ŠÂS˘˛3¤‹<Ľ‹&¶â€tÁłÖ YÂ&*AŔňr‘nA%–‚Ŕüî*®Âxěe ®á*üŽř´ě'±b ¸bD ĺή@¶ÁTÄuĹ'CxďX„¤¤'dMŇŤ"ş +©ęTT$hP¤ Íě˙« vOp‚HĽđÍ˝¤¨°É<}´ĽRŚŁčSoľË‰ĐȨH€ęs¤´“b‡żľ¨ëúÇďŕ,uä¬DIs *ßPDć,yRBĂôČ*>ČF(E:Ç&abó·ÔĘ ´A ć@śŔ^ÎJu´†@§Äńb!®ˇÖ N6r!ôĐ|Ë*Rň´áGÂÝ"BćŔŤiWIž@©¬<âľ3Ś8Š8ŻHźĎFcfŽëÇÖ ˛Ľ“VűŠ»z¨Ć8ÉŻ–TĆPâË–ď]f-‡‡tÎ'ŠtmGp ¸:l¸vůľâd@«¨erB äŕ-$A-č‰ Üŕţ˙!6má Ŕu äĚ BÇ;í>4o\” ýt¤=ş°íîŁ2’‘12¤^ÄČ0bźÜLźŢŕ+éşIüÉ*Zm—Ó–řs ­‡ :ż‹=Ą†ěG+}Ď” ĘVß3dĎÓ;oő/XŠ>\bĚĽđĂEő¨b‘,Â(ÂnŹ*GJÇNLC’C=tmP„Z̢IžŔ‘´¦›<ââPÇĘ .Á đă h="Đ^+äćĹŕעŽH4®0ŘŇHbÁ­j$0Â#\čÉ &!\¶bÎ*D­A!lQbóŻŠĽĽ‡—t–€¤Ěu¨ÔućëÉú2żH‰ŽĹş0˙Ą{ŕ‡V‚it!&ĐR“pB ÂôÁ¦ 5eá€âAdˇO÷Bw@ÜŞwâ†ÚN*S8¬Cţ®mŚ+Â:čzDr¸c,?©uĐc*ŁŇLíŠ-ĺr~ň’Ś`*5‡J8‚YlčbĄLÇ=7c±‡=ŃK†ôí<W Ô`WŚ&őÁnÁ@`Ó‹šL @ěIfłüM+~¶y Ô®@ ôa,áÖJé p%&/}† ­ *®"Ą°]„™#˘Ď2î+Gq)‚Y^Â#îclÄŔá…ÓAĘ!Rx89”ɡ“o̵čmą/}žÍr„°“2îSĐŃjlpÄ·f>§•<¶>‡ć>i¨“Ř-Ł7RŕŤe? UB⊩í¤â-Ü*E1Dε{‡‹ěEš“c÷¸Y¬YŇ)“§2Ś˙KଠůôAž´Ň^ôv Pč-śB‘ľ]íe†iłlŇoG’­îdD?Ú‚+Ň`1HČÓŔÔH@F@ňÜeçdÂ>ČŹ.LÂÝŘĺŔABČáĐÁěa“ÓˇFYR8â÷<í–‹ČĎî,. –DŇŔ"ćtńRuÄřŹ Ň/Ë&Z…tł·zą·WŮ3hř‹WWWt—Ęś¸¨ó¬vřĂI|X{-Úź Ëqš+řľšHý-ť84Ź‚Ń&yrn4,ZôaNŐÄ®®á‘ÜP'!Uš6Eĺ`éč)¬ţ,ę$éîZlÔŽÄŔ /ĂFF±Oa -ćdm0 :ć´&1*ÚÜ-BäáHú D»¤Sú¤ŰᤠŻ2Zš1f"Amô› 8°0ä˘ë"N!€NýM†ŚűşřqůJłĘ&»śZ–˙—dĘ©ĂËëöë>27Sn(Ĺx¬Än\sX‰±ŞăZ74ĂöčvëHĂ€8HŤt#šëľŚŇw#‡«ç’n&")ÁÜ«ŻŇąÔÄËg+ŻÜą ¨9çF*sŐqĘ3"Ř Á´Ag±TZ 7V—ˇŞËj¸|[)©''=€ő;‘™}3łŇĚFę1!P §HłV^¤Ź7Iłś9ř‚Dʧ¸´aÔ̬gň„ϕۮ4ťCÜ‹"DÉ»Ř8Ce:Q"„‡™s~™©EI{#÷•Ş×dŮ-ÇŮí¸ýś?ĂňӰǤČF%vár_jzía”¤ţčw§ć×Ţ0]Ź˘~•@@s=©<#N˙DCŐ‰ť¦*EúLZ.ázj´ŚŐŁÔ¤Bęo“آ®WĹFv±‚šş”¨łč˝đ‹€Ň×qo†Ż´Tş?MI'*uľ×WyőÇť[™ t,°¸2žąž“Ś‘JB€Ň®Évˇ¨Ô 'gěá‘ĺ€54 č-ʡ%-¬`.ŇBĆB“e„yHZű||‘¸…Vłü±üçcMVdë}߇lp|üŻd×ljłH'ŮGË4ŮŚgf\ÖťZŠů«[„I‡ŕ(°Â02bIÍnÁŚŞ9Ew/?! •`ś&Řo ÔžçŽrW¬µÁ,TDĎ ±Ľ`ąÂ‚Ý’Tş—ľ‡Ş\á—„yHĘF‡×˙Kc‹UŮ‘7—÷śráą}Ô°8Éňł©÷Ť=×gdŻŢ<ňąiC‡ÂQ—RrĽ<-y„t ‰÷„ţŠÚ°ÂwÔćÎč¸CPFZ„‹ě!" V_µĘťń1+éíýĎ }]uŮ—śá/˙čý¶{5ĆÁ÷˛2–ǧt˘r|©ˇU©ü2Ľ1†Ě'«Í­ŚJß•NęyŘôďNÍyÓ¤_ş`<‘¬×…¨K öůű§ďź@‚˙ü ܇PˇB„ \řpbBŠÄX°bC†yń˘Ć(ARŚHaG•(3®ôH“ă?—7_:Ě(s É6 BôYR¨Î!?˙ž\¨Íšµ]Ö’X“$«ŤL’HšĚš’¨Vś/µ‰Ő·ÍZŮ$dői#»v›¶}Ú¶éÚfÉ–6žG5ćÜ»±«Íˇ`÷¦ü¨´'^Â:yF<8‘hŇťy{őh´¨R‘€+[|ů2ŃĽ}[®‰s¦Ęˇˇ·n]şuĚ—†E7îYÖ–5mI´E’Ôčâ]’Öv[Ëhd_Y’ÔHr$ ®@Y޶qĆ ›$ěl݉k­ \¶ŕÝj›b婥K”6¬,ÚŁh×±.MĘľ4}q:lÉ˙˛}™8©÷“l– ¨ZuÓ`c§±Ç¤]Z‚žé‡Ůkćź@;™Öš>űD˛[$Ž qŤ˙V-d”6¶ dK,7!‰ n(ᆠŽÔ(‰˙Ȣ„ÎwZzľ©µŤ>fEĺŹ[i˝Ő–¶\A–·tŢLufˇ‚6X’_ť=Ó‚{ E Pfy!F,(ć`b®F]™&‘‰ˇ÷]Ée`+eXťe[¶Éć|~.h‹,˛X"‹-¶Pe•Bj˝eŤ-9E‚ßáƦ&H2٧ú,§„t ę%epĹuwh9 בâ]bÇbÝb‡ťkN6¤‡°eFgö—u†ń7™Gĺw'|ŽŮ”•j~6› p>K!±¦Gäź"Kga¦˝™ˇKâEoöI‰?ţÄq?Žřă)˘˙ÍyęČ5TÝ"IZE6R\F&é][kŤud\–ěb‰%GŞ«´VVQW…9nÄĎö'j˙M› LÖŢł‚‰ĄÄ».[ÓµŤ‹mťÂ Ö§ŢňůY±ľ‚ĺ¤[eI‰U5¬Q#ŹîcćM7í”PŇsf82aşu’M%±d[d}w°sk9ťç 8ç×Ç[YjkXhbn¨Ă!cé,ˇ©ˇ]gźŰúÇ Ú3óÝlÇłťq5§EŰŮĂ]$UAüĄK˝Ľ˛h}3(Ö«¬rÁş¬µ‹.s˛<6žáÎÝSß#ßLZśÄN~_jÉvć±…Đćęëëzú1_hŻě+Ř˙'+g…1Ë­kŮ d ć=ŁKázÎťzČSîSŞŞjŁťŐo>ž”—ČPe›÷i||cźě°»fł©zóîYÝc‡ŢďéŞÝ2ż7CĚďhşÄÚÖĄ“(‹zÚŰŢ„îĚ(BČ[°ă3%D űHľY”¦zËĘ™‘·ť¨ĽŞIZłB”lq(Áět/äVłŇä¬ÚY‰vd_áöř¨mÔÂ!ůr5˝ŻJ„çÎľv<üĹ&Zţňa¶öçć5ĹQ9Y ‹b‰Z0¤·(ÔŕŐ(G˙°ĆŹĚç5¸±`ÚéN“Ľw KLAQ˛Ä©@ć+ÍĐ)˙NÓÝĹĘŻK„)â+Tż@˘/M„Îüů¸íO잩ʶĴˇĚď1P¤¨¶˘« Ű Ą‰AftŚ>U/G(á7ţűÝt.·ŞŞi­{G‚‹µq ]Đ®uÖ«˙Ô5ŰĹd4ٱĚןřąŽ™ľC¦ËĽőQľvÇÜ‹îöČD/ő LąÄŐ?´ç¤+ţ,‹‰D,Řĺ.‡¸anđÔŽ¶áć Ç›"Ó%%Ă”U•Ą,MŹZ~©µ…j‹Ź $ýöD˛˙„R¦»h2gÉ’!Đl4`›@ĂIpz+’FôćËšMúŃŁ!%hô"—¦0Î*#˙1“6ÚĐ›ëS(Kcšň§ľЧjţpŔ$–Kčâ( Ť*d˘ÚřŻ&DKMč¢] ¶‘ ]äAu AŞP‡,Đ€ Úx0(° ,č˘ ű%›µr±˝őg˘ŕw+)]ł.’U¦ŘŽMűéug«(†Ň4»ę¤ę Si¤ľŞX¨Ä úpá¨r¨ŔMĄ”äŠ+Ň”šBvť’Ď-ěřÔ]Ř.U/U÷R cÚW´®B*a`*|Ł UŞIj°NMTÂU AňP‡±rMMx9¬aí`lÉĺC¨…q&RŮůMHĚ4ş©[ËT®ůÎÔ´Ąu˘î“ňbĚF(’NĎş4žaŤmv»7˛ŇIÄqĚżs˙6nęŤČĹ@"Ń%üC Ž-µ±)GčQ!—ŦÜŕ#€ţš94˛xC2î …5?..ˇŤ:jv!rPÓ|ć[ô&–o;B’ Z§ĹrHJŔťb„ŰB:yĂC$1n±(“ai<•i” 1-b$Đ&g úp(oÁ8Č€‡‚€– 0˛ eń˙¶đ¶0 ˇ/Á2Q @S iwA="¶Đ$° ±`0 ¶€$Śâ¶ń±ĐJ/"“â‚ę1$HÜô:uŐ?0|ťv@őQÉĄo]u_/to…Wܵ$-q~0ĹXţĐc‡Q> wl¸a[ Ő2PY-t-" ·@L˙ŕvú0Ö np ¶p N° Íń$@AŃ˙€’đ{Ť­”‘ťCű€Ť€y‘pHp $0)úPšˇ D *  o°#)·‡¶0 ţ`‡ű ˙ ‡,r˛€űňmĐ˙€„Öµ¸ H€¶ €»q˙i`y’@$M48ŤĐ”H’ĐÖŕ‚qvűV-łi!dIv…;—6xŘÔ7wő|‡Ĺ@2wEBf4S:Ő…;’GDQ3JĹ5í+*äTw°r¸­Č{¨|h “ ×đ‡Bń "‘e H`rL–‰¬g"µ°€ŔřEĐ(Qq’pŤH6Z›—ĺ·‡NđŠ{( ‘'‚á±(xăăŤó$Ňé‚ůy•(€3h UˇDcJI°ŚmĐi@I` IĐh‹m° .HtŘXVý#vC $VŕČ2ŠvQO}ş§CăŘR± ¦&5»ŃS "‚ç˙Wy˛(×'@ÉË# ¤g\BAXÓÇč)'ÔNs_řµéúR%|¨— Ąd U‚;”âEMq"RJ˙ŕEú Ú± ȡRqţ "¤IX­ôÖ€ˇ×0[|›·F—@)’0 o±Š;‘™Ł9š˛ŕ"’0‹™ –Fg“‚Ç(¶ÁśÚđ‘“ÂĄťř•ÇřR`8,–LpĹťŚ6ʧb,vC¨\>!âŃ3ď4(±/Ű QU+·wµćĚi “0FJŔzçžf5×g±NęeskzŢäżň-†TIQt‚AˇęŃHKŁ˙¬čÔ—SçoŽ„1ĄR'H™6˘kĄu†ô„ŕöĆsÝ8Ý™?1Sş„7˛á$dv8•žo1q Q °f3˛)j TŃq q ˙©q%@mp %€…Í5FŇ©ë+ÉĆl sz4źÇ8ŤŤČ8&Ç8úŔSÚŕ âŇ`Ť0§Úđzl獰Ž( ®Ç8±ŕø™±—FD3ŽHháT#iđyyÚL°6Ś|a >{e#ňBűfQZ©bdyˇŚV:{‚R¦S=Qç„-–b˘5UJž˘€Y“m  k÷7$÷ijr¬'Fŕ˙;’k’`#gHŇlql“*Ĺ&S`dˇ w6éqi •˙€Ú0•"YJŕšFMP.Čm0Ś‹X‰|·N˙ ¸ń$P±ĐS9SŮ®öŠMi)>CÉ"ú°(ŕA˙:)˝q.dŃ·A{ÖP x(€dé•N÷,”&ŞîHqĺQRzT8Toł,ćóPšs ·^ÇA›Ę@@*c8~I“łiÄ(AeX>+IČRSę‰TéµPN2¶0j1o:µ( Ń–â‚'—°áş4Ep…J%@VAŤ-r$04XŤ6™‰‰XЉą( ˙E™ˇŘH‰»¨—ë„„ŮjŻ˛Đ‰Ť°”˙Z˙ háµ´g c[ Ŕ™UéFh1ŰQ^|7VžX—2(N%ćWđcžyE8Ň“ŞâpXô4M[ó)3©&Ę2şÇbqŰTS0k8c’oH#ˇáT<áłn‚XˇB8[l˘,;tAw~?K;« 7÷]iĹąąóIăUY™K©3PŤ!˛ĆăÉ9Ăxś$7Ą&˛ŕ ĎůřYy9âw.çqúĐO¶ q~'id"B[®kÁŔd­ú`˙wPXa 3‰‡©W ňHű"™Ě,TĽ|ĐĺŽW?€ÍÔµR„?iĂbÜ,3U÷±Ůk>Ş4)Bű,o4ôj ꛯ9†ľ9ŃAßR18ë Űć@úžËŞĆčlS°ąńcÁď¶!QBÝô0:b­%Ř$426×`«-µ)ÝkM»Ő¦”Í6Ý®TďmęhĄË\óŞ˛,s˛’J6QűňK ·;pĽńöł¦‰ď~Ł.˝>Űî5(Ý´,Đ9µű¨Íî>t0Ú°„m5ěíŇPř®ˇrľ%”t»ÉRłi»ü&¤”NŮ$pË*Ź$QRNé,T;V µÍ4ż¬%¶NWĺŇJ/iő•;0ĺRKAÎ˙–H4şí4Ü\547E•37U˝˝;%úsĚďv±â[¶±äŽQ“M–[¸łĄR e™c5m®YüAÂ"¨Ě­‘ůLU+KA", Y´IcÂGUkD°Ă(ŐJ:ő˘-1 Q#­]AźŚ6YŢxc˝–P”ä8\#ŘgŁlîŞ&yD°•sQŘ*ť”TcÝĽŮÍťm´J8'Ľs<}l‘„¸»’p?6SöZiíą+›M Ž:<ő4Żk¬Ą°dK,ąĹY»¦27Čš/éľśxĂźIôIéą·Y{5"ô'‰$¶A‚˛Ż8z(śÚ-[˘˛FŹÚE’6RH˙ˇ®a[’°¦‘Ç„z¨ ˘ ˛¬a7­‘d‘Ä%˛&‘ääŕ(/aźD›Yć˛FÁÖ¶ćI™+iA·ąĆš7nŮg‰7v˙g–INĐç‘G˛Ľ&îIfyDźI`öţ‘kf 9ű#jLţš‰%'µ’@P×G=U8Ęł‡55ŘkŃí¸+kz«Žp"!™Ë¬F9=ąŚ$lá}¬Î% ÄÉŃ1«žAj7¬Éy‚“x <ÔéÓ.´1;p 6óŠ„G˝TđmÜ n@# [´ °Śz˝ł… öCĚ0uJřĆ>ä0 m8a4Žzø”p‚<â jřÇ q mŚ7$[-nń†5ŔnK„ ¶±†nc†µú‡,*ó¬Í,'JAŁ–® 65ť-ŠW[ÂآpyÁéŚI<¨cÖeBt4üt'Ú0‚ üa #HB IPÔ „ŔŤŔşźĐNU1ů2 &§§#‡riCWf°$aŻ8aúŕcSg‰Iŕe şPëś`K°řC#€S`KÎŇmLŃöHA$H§$´A7_±˙¸FDDI…" $asM!A ˘Ę !EáŘ#詍'¸d궍á]X—:ź`;IűVčÜI –8ĺ\ţ1ĂŞ&{“I0AÚLŕS7LS%h  ¨°#ÉXF2š/Ó„¬ gO§´°ɦFEÚŽtT5aÚĆB+łNI*ş9ZéCŻg"QVTE¦ŐćDů‡5Ô©}?¬ńkâz+mç\#Ńm>«˙˛ĎR¨;Ł…QU¨´ŹůH’mˇ¬D(YĂƂ뵨¶°I•wcĂ‚ĺĐ\5¦^§L9yQx"‹\´Ż‰Ű¨Śn±¦ş|'‚–:ĎH…1}§!Ą¬l·*ë5ŽI‹elR«.‹uÁí4…RĺĚ~¶VŇtÂą”ĐFKĆşÇÖp‡»ŁŢ[ĐÚěX¬d‰¨ő*·P;˙bąK[ęWݤ€Yiă˙OĘbŻ´ĘGŤ×QV›Ů-a)°óH¶!|˛ěv!…Kčbv¸„†+5žQ’ÂFş„W©D‚Ž4ě+h܉™L0ĘŹWqJͲJ–kĹHŢ*s’-˙µ¦RUWÄŽB¨™ÉBG{¬?ČÖ7XĎJŞaäĘ6”˛;łIP‚ه#úŤ(›RŻţhYĄhů¸É¦ŰK&Ą]'Ŕ®~°>rɱ+ŮOPě•C(Ű'šg\¶„>î`µ]k‹ť>ćŕ9\C ´sI&a‹zć6o˝%,TÓ†oî`M@Ě@ł„-+!!Ś>#ďÉ%Łm@H°ą¨´d€ŤŘ&wË §4üMš>$1kŕNÚđ˛†Ţ9š±đ&iŹĐ†,¶Ý»ß$iIťnVť78"ÍGUę,¨Wé_eO©“x>žóJŰ‚|“|Ă>4ž}TT˙–hŘ”†Bđć ĎŤm¶yĂ{“ŘĂ[Ę eTYDNÓŔť~Fbćä–~®ŽÓ –*˙Ć<şĐÇ Ž|[—W+T ó߼T“ęxâf$ ę¤ !HGdA} Ŕ2GtbĂZbĄŁ4ĹsŤ©˘DeńÄŽl± %ř˘č×Ď}Äb*]™á>čéĽôŤqŚáŻ'%čic’xÂ>öů3j|źţC»\0€l ű8,žŕHśŕ b2Yj’z|ĺ…l{ \BWďCĘ,-®M­T›Ň:c]Î’TőŰ% µYâgÍšLÁlű>,77PÉ”±‰x°ş™7G˙»‹,ěźŰ[,Đ JV“ńđŹňX°bÓ†;(§;‚ĺş™TR€y‚µq‚ťą7p'¸…|ÚŔĺ"ť p„Ăp„H€˘†hm˘Ü"‚8 "°%b%›‚4HˇHI@ 7#Žš‰|ů»ŠÖů4ĄĐ%⑼™ákŁ»ł…}’„»Ó”K59Ú‘¤ŮÂ7*Ż }ˇB{ŕ G˘*•»†'XžŐ°…ČńX‚G…%Ŕ*Ŕp9‚¨ĂćR?ÂŤĄŕ±îËź_Ů€©”B?¶rđĐ{¸“zQ®˝ŠüR–ŢRđ)#(,%P5p#˙8GQý3m(Cp„˙sśŔ’Ô¨Žđ Ŕ< 'bëŤýę›á5Ň*/ů‰-Çš « ˛’Ćá`­śŃ>łR‹DÁ bI€řáúY  ! ýÚźR‘VşÚđŻ€D‘“Ň8›#™Ó­W2´ŞšˇQÄí«– ‹``Cť¨+-Ě€[đ°Ź+kK‚7RźZ'TL%°(mPţ*‚|żóZ•ěŤ_â ČÂ2?1H#­;›yě´ˇ±Ć`\ś;ł…Ł‘˛Á¨ ^™Gk 0@Ó1CxÓ™ZrŹH˛ďÉRaµf¤ŠIÔp±Ťé>˘|+'űÉXJ˙D—dŽép:†X˛ŹÁ؆Hx±´PŤ[8ü˘$Yp´ŚKĄ&’…R´ ›H7°1é/Ášý‘<ąEc]ŕ2]°…e«Śnü¸ÓŤDÉTŇ!ljŤf:T0ĘNá!O+«ÜŠXK1ąš1;ÓI7i±ń ? j+4éÉ^\J ˘•Íúłc«¨94X{«u\ĘńRÍXŇ `#ʤů<}¨‚`D%ÔIť¸‹˛` F{#qÄ>aoÂ,d™¸Kʞq›ó‡µq—ŃŔGŔ§¸‰ąkhI黍Vř‡f؇Vhťh{ř‡h†D¨ <$(Á}€3Ω˘X˙G Ú>qÔľńĂ3¶âĎńúČxTGy I #?Ô$LĘ?XĂF´Ě CDkMň #Ó-ä ŁĘ3Ű•^«ZPŁĽŹz,Ŕaű C–ЇriÇÁPŘaˇčÔ>š!š *¤íhih…XBř‡VřźDř‡ThF› $z Ą†aŐ€"HĘ` ŃSĆŻŁS-ÍI%óĎÍ ?ţ$˛łŠĐ‹ţ ˛Ł¤ČH{Ç–t¬×Ŕ mť±úĹł†Č GB\•VÉ ™LÓďčŤnş2ެŹe ›jщ[0ŁBʶRŤYŕ©» ´t‚ĺ:(Bh˙ň„DT·XDŕŤh¨„9"$ŕ(ŤHŘ ¸č'´jś%ŕ”25 ŃĆ:/XŠÇmT5ˇ;«¤űş!ëUDÜOşśŮ°^#LŇ”GaúźńPâPŤM‰Ô2R¸ۇÜiäQ%Ĺę-kpk8Ĺ’˛!đř%Ę:NžsÄ߀×cEGą0Rs”ŹXĆ/X«‰‚mŽM„M”î¨ WA\UÄ«ű™bĹŇ3»É_‘Ě3}×6 i]Ęšt×ĹŇhý0ă>ę5EˇŔ¬Ź¸|ŻĐŇ ¶°Ä©Ř#0€áQvmĹÁ70€VT¦&†ĽÎkSX‰E,˙N‚ˇąÄš^ę%¶R«mÇŘÚ Ş]Óî09oĽŹĺµzµCl͉Äi=Ű,Ę -–)Ń´ÍÔĚ ÍźČtĘEµ’ĄŘżWĽGáŇń &Hű°óP‚p#%ІÁµž-µd§[ČS =şő4Á1Ů ‹E-›]°…K°— Ć^Ł #¤íŮě3 i¸Ž$P#Ů(+ëâ®őµ0…ĐTëŇ›ŚPbYʉMM^ŐŘ Ő¬ÄLŮ»U:Ě”P©ĹI1Ó1`…µ]Ń _’MX, áđ‡eÚ—82q{ *Y'Br„pÝ2G»—‘ÖďĘ­™Ëbű˙Ž)°„0Ó…;`˛#Ů!˝p7¨6'X›lCšÝÉ6mŘ;*ĎóŐ@…q†h`ĎŇP0ť‡pUŹb„©=[Ž˝É\aíźa¤I=D‰ť0˘sÓ,˝5DݵJŮÓŚÉŁŤG_ËF´má9­ŘË1 =‘ʏ֋ab$5} Xp#ÁŘEČäŽöú[˛KŹŽÔ†]Đ ]€)ČYµąQ˘!I¸ĆÝ…oŁŠýŃů@„"=Ň$mŤ†!pk¨”DŠ€ÂOýX5vś°˘“Đí«IWËŰţüRŹlŰ’DV$NLeáďKÖŁµáčáJa1ްö˙&<őF­M1%KX“MPćÍŤ1qş¸ä–ůŐ0 ;¸]±…%°®7’#ťŘÂÜ`dŁGčÔgŃPŐňĽmHśPOT%ßš`‰Ú¤Ď„ů ý¨#ř,1}=aţ©a¦A^ÖR3ÓTKŻçuµ‘TŁs,käţąXÓ$ç†L “W¬ąVÂ+–Śc2{ŤNŁĄM¦–NNŃNĎí“ć0VŇČIaiâ@ءô´‡Gy_ńŤĺCŹQ.Í5Ę4Y]ŁLőć€uMś4/žgĄDÓŚÖ TŢýŐ”fVĆŰÚTÚđxŻűřK€Ó†©Đ†‡¤-™Ł¬¸ś˝˙ …c¦€–Zł«+o"Mčń!ݎd¤đAES^“š#™ýç‘e鍅^éőĹśĄ¬ĄP’>Í“–gÎU‹miu^kâĹU¤dJĎ„ŘkáĚ$DËč‰m¨Y˙Q‚Ut„PGH\LA_7…d'}PÇVE6†k~…ZVfŃó j)°-Ţp™Cţ‡ŰÝXî“Ö7=53­Ąl:µÍkÖÝ•~µ·U^íęŮ/mçßvá¬ĺÉ«6ŢTŁÉĚt]GľGĚčě&đ`J…opbMńÄ7j&‚|ÉU‚k@‰Ćµ'P¬óEV±-#+hş¬˛ş_]ýĹ˙dŃĐf/mKE~EßşńŁŢr /Ź–VŠ L6=Ó[·Ö¤;Íf#PŽb<ëí±~đ[]pX›íË_âPV–ÚŹ ńB9xż[pěAťÁ҆4jEiZ×˝ÜU ±ČY´âąL0ZVNK¸;QÖ0)lQ5áĹdöU¶eYŕfäC[۶ط­ÚÚFî¶Őm %MüůLéeä(?gvž•SN^KöÓýĚúdřz Ë9\łJXŞx#¤ ąµ)Gx?FÉĄ‹5°˘ÁЦ­˛ń€ĺ¬°ZvÖů&ř Bîä~iŚXĘd±­ Hľj8ýć9Ź[ÍśňńKaVPcň˝˙PcpąÝrZŠmHć”D—ôń«żC2DÖ.Í.!Îđ¶DNxŲˇ“’ČÉ„–ž\Ä»†É^Lk“˝5DźňJ®aŰ5n^Y]ĺ[2-Í˙lŢłćôp.Ń^żďUĘ˙ŽFâĽG3i»Ë°>¤›L€Ć딎 nꥑ(»ÍböŘĽ¬.ďŰteŹ+ÖüÝ3áŽpQGĐ™NäÎç"gg]Vk_Öi)S/Đg­ĺâÂł“Űω!!Ź©”ş×°†8Ŕ/ŽZť@7xżf˛5°6}&GčY™Qką&T_*N˛ĹéĐ…)0cŹ‘î÷ŹtnĘ­ÎI­îSĚť˙áűua˝a¶}äFřŞőů5­çýř8•âĄgalŻđ1IćŢ`óŮLŤŽż†JčŇ0‚u-‰€Ü†l׼ÍŰ GŠń ;\,63;Č˝¬żza L¦ÖëĐ6îCîňÓtÇ1Ąt$éűĆŘŐ ÎŘţč•ôŇămÍm÷R/î±˝÷ć ŢpŐ Ŕ@«Źđ§A P,j׸†8š·÷©yźúYĘ–ýđ¦Ď §Ţ°„}Şž ýľöŚÎw |˝­[aď÷ÄżdZzk'dţ4ĐNkµÉrwé+u—Ł|‚ŢßUD őáóĐR ËaŻĘ€˙ ’·HZĹM•„ –#ůł!ů;kň⎖m×´Yk˛O›ľm nÓ¶ĎÎ%[ÚîŘqčoźż÷ýÓ×ńăGŚ/^ ™ŃăČŤ$UnüGRăKŹ"QŇtÉŃcĚŹqr\y2eÉ’3uţKi’¨É› we*Ó'R¦Q›.µů“eUźJyUy”+L‘^Ą>ťÚčP˛Y[zÔ¦­aCk‘$5 KSR-m¶:Š„é˛hIŁąŠ]iUéE·öÜşµ–$ˇľ·‘:dů`Ňś†ŐöÄšłfUŻ˘_bĺyŘjR´‡3¶ ŞVëϧC W­iÚ4Tµ¶‰ćM6âΫÓÚĚÜůěî’5•m˙MśsNľ#”©ŤMm#;îĄ9[vlߙòľş°á>kŰ NľlYŰ.KouÝŇwÖ0ćŘ?ďQ¶Ť.SĽeÉ%–čRci«ůĺÔ“äÝÇ–Qü5”_ĺ·e… xZtŕŃh R9â…9‚Č!~8JHĺn7 WÓ•c¶YZyäA¨B}ę% ]6Ń©Ź$˛dů”,Zn6\syî´\->6d{oAd‡)ĦQűi˙ŕUVby”ŇVŞRMv‰–‚¦2§_yűQ驚"z¨[DµJ­îZâX¬ęloˇä)•U±ž\×Á´éN–čóM$Ö©†’(!‹#ná¸)á†,J¨®ţĆ`ź”ÔÄB™6—č3’ÚHQ%±š™çP –UgŐ$XŽ8ŰŻ_.ęźžĹ(›°¸¦Ř ©§őŰ(‚©š*¬s)Bčj)ůé–-…bwuűčS `‘(´Í¸¶`‹#*”ŕĆ5%ücMş˛¸1®,>ëúݬoDĐzIéĄHę2‘%ŰĽş%Ż$ëXćpg]}e”¸ťé1˛üq q ç˙DcżŹ-ážĚ-Úa¬á=Ţn o\ë”uŻyµz YłŹ-sŐj#¶řăO$4)!‰5Fކ nhcDĘçj îą/š ËnÔA“.T)eó*tęĹrM¦ś[j(Ą¨c;J{ëźg­eČbÇš1T ‡Ř±Ýtę~»¬[Şkp„ĐÝąö¨Â u?Z‡_ŮŇHžö}Qß ýŹ#–”ąk~ë5ÖČzđJV˝—hr‹.Ięr“?ůR6šh“[p×2=(B*Y’ńX·';áĘK;^Ü&¦šŕ™Íxމ“ü†š`ly [śl%މoĹiŃč\„ť¶x8+ŹŚz˙’AÖyŞ1Ö°†-ÚPş§Qj>sÚAna…ŹTA;ú AH¨ ŤLhâ2A˘‚Kţ·ŹLÔA:@ `d:â #±!ůÓ‡70˘ *´í'Ť®4#«‚ÍčÁŮ čÎ'1jvóÝżH´7 ř†ĽűťÜćČş}ÄO± ę’˝ä+(gdäóŢhÇ ÖhCűčE©†ÜÁw@‘0˘‹ŃË=mD,d YH„=©ëÓ;í· [,4@’ĐÉŐ"âÄŮÓÍJTëbQϲÄÂZ]9ĐŐś78ÖHb#{ –\AbÁĹóŞň\|\2Xm$EŮHjÚ wío˙·Ź#(Z &lź2g8ńGµ ®2ë™ uĘĄĹ527ÔËZqxCŰ^¤#ťŁ4ŇYă|ÎáZ-Ü´ »Ů!ş°Â@<©‰;@yQ_ęC¸™ůh$DŘ.l‘„ô8­G±–ŹH ŕm¨±GrŘécşP¶ÖP¬E“¸lfN¸…ŹÓuI$&¸0‘…"#ŃW˙Eąa;;˘ŤF pipőϬŃN‚¤!é±Ez¬em´'Ívj ťD0žÓ™"'cë6~­ Uüü,Qí#DJ" ëAäüMť? Ď—H‰uCL"ÄGÝÖGp×sĹ´ąt:|˙‘ž­ˇđwµLtí˛Ă.j…9hG“°Ć-ü‘®HB*pĂ-lq %lŁČ!^4âlôŤDr¸ě}„úܱhCD­Źž·!–z-ÚđsżX>QÁ5ś` 7üCŽDˇţˇŚĐě˛DĚmR‹$D‚#R/J«­„4 Ú…[çâ’FH˘ ˛@B ’І44Ú KH ęʢŐyxí­ÔôŠEZóĂx ä9 x*L‚c°”sĂóčzA=u¸žČŘŁ!vĆ3źohčt2t4cŕâ–h# DX¸gß´ m —ĐĆňX®!bOŹ˙&uK”o¶p‚Ő8B4ÝiůÜ €a/–´F«ů®ę6;D°NĘŞĺ$X‡(Ö‰ ? ®›@1źĘńEşřź?lŠŮ­Ě‹´µ´š-%°`G@mĂŃýC,Ř]$¸ŕˇÁtĄAŕ] ŇßiĎ0Eą1ż0Šćĺ čŘȢPŐν‘»%ë„S‚ä^cJśőťGc@ŠŤmś-¬^„Ť1ś¸q›6´ž6ÜCĂ1Dź\Ě”ÚŘrś»¨BäKBYÂFś@ČÁ^ ť$ÔÜ$¬Ř$ä“K8ˇX BXŮ>D‚#Ţ?´ť\ÄߋɅ$řC#˙(Ř>đťËŠ?X®eúɆ Čś?ÄśőÝ‹]^ä°Ü$ŃĎY,D˘Ô…?śť-ČŢaŰYG'ľŘ\Č‚%ŘřŐ“™Ý6ŚźoÍ„%ÝMS}íÉ#őSMH :jˇ}YSňpS´YʬŘ\ tµ Ý;‰›»äĐt5Â3N6f㤠š[šî1ÍÝa㲵Á5(ź5M{ÜVvE˝ü…Ů”ČhíS_QF\Yq€Ä÷Ô#J<Đ•ý×Á#°¸ X ŐcKü…ČĆK $V€^—U.–Yč5h zŤJ•Ó0ÇÝ‹ íŹ ‰éŮĆ#8’ž˙ŮXĆá„-MšZĆEd DTí!ť†yśĄ\‚.$Ôń‘”ń]E˛U‹ĎŤˇ4‚>Š´u"6Ą˛©DS"DÓ ÎĎ!QĺĎäÓĎâWÖZoŃ͡5üaw܉GđÝmR:…¬ Á"µ›¬JŚ)UŢ„–=ítVRáŽhč”EnS0vD¨¬… xś2ˇMŞä iÜc2¦ÂáĆź!aˇ•XĆáŮM"fZMşŐ&U†.tR˝(É(ÇOÄ‚EľZ«Ůťă!Á[ÔB h‡c([ X 4†˛%ݨEŕ^ě´Ď?(^´Á6D˘8ßť[G°v˙ w,ˇVÝ‚źŹ¬ÚľXUę ´ťŮůäń‘Ĺřb}ş|YšôWşŮQ®Ő‡l$—´–OyGâQÁĺ Üe"śÂu¦…9fě ¨DĚ^–@9J>XĆŮŘ.¤ädúȨ˝ĎĽT†%„ŐLŮěĂŠ'ĽX«ĄAŐÉ‚5ÁF<Ʋ  ° $HŔ¦αßĎa‰j¬źŤĄ€ăeD«±ZQ€R’›FÄÓ?”\C6'F8ۇ͝Ó(™?AnßýH$Ę>ś 6mÖf­.Rů ™ÖkA™ŞÍ|!ŤSŃŠÖ¬QîY@Ťźeް˙ÝP„Ş$Âa‚ę…„E¦5&fú§ę6&{¸‡›%DE‰ORšoСK$`‚ß68¨ÇjÇuŘB%íÝŤs(Ţt9 ü$xţÝ9†6$§ß!Ác”e«âŞ9ž>$äĹ‚#çŮi#Ť’*¬ĆB ČÚsŞŞ–TđÝŞAŢ]š—š¶çÍJ@iÁ[x±li¤jőŠŘĐÔ jÄ!KBkâXRˇ4ęM¨dę™$D á%gr áµAÜ+Ň­ęŕ5ÁżökŔâ+ÁękżĆjéŚN\˝“>ÜBŐč…˝ś‘Ă}blO%ĆS˘Äá𝍙]VG<ĺVeâ\˙8Äš]Bě‰i‡,t§GXYFřŰ,ęĹfbGśě^ř–\Äb%ÚB,ŘÇjĂ]„Śžě>0A”莺ÄČ iQ}Ó–ˇYĹĽ—€đ˘:é“Yy̸šPś„^ î™ÔÍEáä™D=…OřÔŁŰĆ­ÜέŰę#‹h& a„ŠYĆĚŔ•¸ŇÉŰr„wyMá˘ëRyĹvĽF9mĂ0důE` .MH?†×ă&Ç—y- JŹ{Č{ć˘PÁŕ»ĺ—z‘™C6 ˝ BÝŐ“DL×-Řh#@@Eׇ]áůś5ÄBĐşLÓ)™¶Ĺaö–>ġčShĹÁÝŞÂUč†˙QŠ&d¨>l¸éz\„D`D˘#ÖTë~‘ iŕTmDš}Iŕĺžôb”Vć Sá"™XE&îa QY±‰€yNÇ€^¨¤¤¨ą^8ÎU©şA@$ť("R-\Ňżö!L×u(ŕtiÝŔđÉďĎ$ €Úť MX\|’%XDčd(ďę8Ä:Ú‡ Ë ‡Ž}\ +ďĽěđ÷šňľ° ĎKń1;1 çđę±·é° ˰ ǰËŘ0O± ż°_ń7q #Ä űđk17ń» d„Ž+q_q«qٱňęšËtDłĚ+/_Ä˙ç°ůö1ż•ç1O1»15 ěŕäŕ­@ 4­&AĐ* .¨Lâ%Ađ¬âÁŕ5p@ů–?č÷ěśH›5^ďéV(ďů›K\\č  Ír Ń˛áž-ăŠĚ˛7Úr.˲/ł0ă˛0×ň0ď2-űH á13/۲2;ó3+M4O3-oCq Áé`3wă/kł7ß0s76éc♞⟉˘ŤÁ®:ßĐřµš$Ŕ‡‰ÓAÄŕT®2ŰNi˛DĆ%„iCqZCÔ9iŹ<ćľE¦Ł>¨C§äCęž!(DK4DďiĆőéJ(EŰ„}´MZôE˙StFŰ$F‹ôIłdJO´K·4Ę•ôFż4°™´Gó©L÷©Ť™Îęą^ŕ4Äb<ˇdHśbÜVpąRJŕĽEPwŰ褣5`ś¬"dľ+2¦f*čź™>~şÂmF4LÔiý̡>F€>†-Đsď Ş9z&dâŮ\e"áŠů°Q¦ĆEÚŇŔ5\˙çˇę„Nh„ndNć!QµaŞfĆëa'Ú-Ču˘%dŢ5…UöU7ŞVSv]Cćc—#^Ă«züµ˘č†vg&Zj‹v€¶öM čcč`Ýr E3 Í63WłúÜ-ˇQ3cČ´\¬RtśM¨‚"’•mí[iÄ<˙%FëQ­50á«^pß9FŹ4¨Ł^fHCfMGfA_őZ4źAXjKtx‹txźôž"¨qçµDSőM4wÇ4KŢ´9ÂdZće›ă|Ď7ěöžÚw€Sőź xěí÷y3xJΞ;ř 5ACµĂőĽ8ÜPÇ$AQÜč±#QŁ7\ Q`¬ZAv’w\cu\ď2ŚÓ¶2+3ď-M,Ó¶7ÎŞ^T@ő¸Źą9‘ą‘9’ą:'9“'ů’79”Gą”O9•Wů‘ ”í­HŤă$Rłm/łŤdÁ‰9îŮY“đZ5í±¤q“4C?&zżą…ćw曣ô}˙S#­f#ź÷ąź˙y6î9 :ˇşˇűą ş˘z˘zŁ/:¤w ˘?úŁóą 7şúĚx¶Č¦3ÍľA §ď›ZŲ¨{ú¨·ČŠő9Ę öřŐ2ˇ}c83{łî!3c Ä7nł¬żĹMěŻ'ÄŻűú÷:!;{»±/»} {łűł{´;»˛ó1'ű´g{µ3{±Sűw»¶_„·;µ[{ą{°Ű±¶;_»¸Gű±‹ű·7»ŻŽ±›ű r›;·;;´'1´˙B¬ŁHŢ](Ę‚,Ô‰%<Â<Đ’X=ĽĂËBĐ2<Ň"ĐbüÂ+ĽÄ_ĽÇs|Äm,˙¬b-XBĐ­% ĽÂ[ÂĘŻ|(VB(¦Ľ,Ŕ|áěę)^¤L-°‰ÁĽ*Îď|Λ<‹˝<ĐT%XĘŹË«˘Đď<ŃËĽĎ7˝Ě§üČŁ<Ö_}ŇłĽÎ§ŚÍ{&Ř×őe"ś•?ö`›˝ĆYyŘŹ}eh•ă.$9ěů[«˝-!€¦¤ŘĂIŞ­k·xK6}?¶‹»x„ëýkcˇžÁŢŽ'ţž5ľV/>‹“7g"÷gR~ž_ľ˘ŢŮăKţćG> Bľč/ľçÓőK4€”/cf§tŮŁ~€§ľÁ9ëůíËYíův*ůá­~‘ď8Ĺ7Âѱ3J^«łâtv˙_’çďőا¶b÷}ĺ—6xc&€3>wOţˇ:>g&wőWżgžű}çłř[3ţó[ľäkľ÷“7UŹ˙ ­+uą6:ćťżyÔ©Lʉ6@ŘjÓh—5mm´YÓeM–5‡!Ft(°‘A…mYkÓĆVŁ„.´–Q˘CYmbIb#©Q‡‘d}ÔŘ‘ćFŚ76Š$PV¤m#FФ±˘µXm„¶iHQŕĐ„#‰)Ň(VEm¶®^µ&IRĚŚI$Ąi“¦‰¬$m$µ!‘D[’ŚGĘÔj .ČŚŰ2Úµvm!Č[µ^˝†‘îDm/’,7qÜĽZ±Úş–±Żc }µV®Ůńd˙Čź˙b5 tqăÍsVÍ7îHĽ†#?i3ÉYGm’Čj’—ňĹ…żË’E îź@¦éš“ŔIľ¶l—îűâF¶Ž”÷öHgm%Q(kúo–)¸ŮşQ I -YkŕűX´m‘ĐFB9‰Hmô.2ÜdAÂ’đŔ+ˇ’hd-I@Đ/m")"’ŁŮ 9¬¶Š·4pŹ"Ň,I‰Á.jÍ/‡: Ć%ű (ÔD¬7Ë ĂLˇÁ°b­°ÖţĘŞ5][赋$ I­–I´»ś„Íš[äRl4¸ž´ëŁź¨ĚȬH 3ݶ!YPÁ¦2‹ó2k˙,YŃ=$,ZčŻ$"ŮO–Hl˘Aĺ”ó 6Š­˛‘Hh„kN,$  Ĺčşú\­0­Ył6<Ű›Ňp Ź„D9ÍH$lÁ-č†ëHĽŤ$UË"[°fm†Űô˘‚xŤD¬bâ.ŤłĆâO-m–‰$çl’R۫Ќ썤̬Ľ‘1)gdR&őv/Q3w.)µtÝ9-ăŚÉpËtKrɕׯžŠQS$-7"I#˛ŢŚŚ±Ěł¶3N°¬¶K„dÓş ş„1 ‰0[Ě"A×#ŮtC­łŹ-5&łĄ$ŠŘ®ęO>[h@‹;Ý&Â5W”9ˇí˙l)‰ĎJ‚ŤÚp Ű(AB‡”ŇGmHDΠ$IIfÔ5¶(mQT…güě[s/ô¦AŮEwJ2ĂÖ,µ cëMGÇĚ6mNm/ňě1sëžsşłĺα1äRť ş°U۰\/lĂ/˙®Ôqo?“IŻië]Ľ^×.㍰Ti$ѱ3}q‘,Fm—Ç;ň[ö‘đĽy˝JXŢ4·/Řű=w®Í_TýÖŚ«ěë'%)’ÜĐSřŁq}ś^†' ąş8}—^ŮÚŐ«ĘěÝ•\ho¤®z#1\Â÷wŤ_×÷§¦y±§÷–Cřů—?ţ©Ż‘«,)p‰™Ţ˙v%Ŕ]˙Íoj?©_\ţGż§í/™ 1ř“*°] ô `ާŹÄo[Ů ýÇ?úP~őK UŘ?˛° ě` =ÁÂo~» `˙Ŕv†EtáeřÂ&1L! Ź(Ä˙/ryů>'«… ^Ú LD>W¦§<5ęłŇ˘.ע’8Ä3k|hJRĄjYÄŤt´šľć´5^Ä0V#tHˇ4‚%:q Y‰@F˘Ź}l„#ąČC22’”D$ ubÉ>*’%ŽLd#ÉHCZ2”“ ä'C)ÉT&r‘©$d iČWľR”‘dĄ#%9KV*r“Ş„ĺ ]É’BVŇ˙”śl„a +Čd‰éLB e“¨ŚC%qMf&s™Đe †Ler’šBůd"A0‚e-› \ć7™ Íd2R™ÜT&Z”‰Nz:ťČ„¦?)Î˙d“ť:i'=ʉ{ôšqH(6ëąĚ‚>Ó Uf»t±«[ŕe?ÜE?:ż]đŁŰx’6>zŤ”+¤Ű0i±4ˇ—N KDT„ž´+]ĽŹ/>Ě KZÓŹ˘´]%Í(JuuÔ]h”©ÚxŇJ1ş+ě P!? iAf:ŇĂHhŞŘŃ•IAJҨľ”¬GŞU—·+­>ͧ3eˇW¨Ó 5Ł;ýˇ'Ä—ŢKŞ:˙mkB>ęŐŚbe¨4ě WqšTŽuyÔëYhĽ’P¦śźAâŠAČF5HN}ßÇxJÄf”„N˝źL-!BʞαŕX-l1¬Z K¶¨Emˇ3,×Öv·µ°DmeŰŕŠc¶¨Dmo ×7¶Äým%Š;\Y—c˛°DrcńŰIb¶ÄÝmk«k[භߍrŃűÚâ&÷µ¸Ĺ-sß ^ő*—ľÚ‰{… Ţŕ¦7ąé]îr+ÜßúvżúĄ.l[{ ď·˝ąM0~Ł+^ćš÷µ´eđxń[[ę–VÉĹî ßëZ·¸˙ĺt\_ŕŽxÄÄĄîr#ě^Kô¶˝ż•ď †;\ač ř@‘;fox1.6-1.6.57/doc/screenshots/adie_colors.gif000066400000000000000000000533341326741342000207240ustar00rootroot00000000000000GIF89a,Č÷UŞ˙$$U$Ş$˙IIUIŞI˙mmUmŞm˙’’U’Ş’˙¶¶U¶Ş¶˙ŰŰUŰŞŰ˙˙˙U˙Ş˙˙$$U$Ş$˙$$$$U$$Ş$$˙$I$IU$IŞ$I˙$m$mU$mŞ$m˙$’$’U$’Ş$’˙$¶$¶U$¶Ş$¶˙$Ű$ŰU$ŰŞ$Ű˙$˙$˙U$˙Ş$˙˙IIUIŞI˙I$I$UI$ŞI$˙IIIIUIIŞII˙ImImUImŞIm˙I’I’UI’ŞI’˙I¶I¶UI¶ŞI¶˙IŰIŰUIŰŞIŰ˙I˙I˙UI˙ŞI˙˙mmUmŞm˙m$m$Um$Şm$˙mImIUmIŞmI˙mmmmUmmŞmm˙m’m’Um’Şm’˙m¶m¶Um¶Şm¶˙mŰmŰUmŰŞmŰ˙m˙m˙Um˙Şm˙˙’’U’Ş’˙’$’$U’$Ş’$˙’I’IU’IŞ’I˙’m’mU’mŞ’m˙’’’’U’’Ş’’˙’¶’¶U’¶Ş’¶˙’Ű’ŰU’ŰŞ’Ű˙’˙’˙U’˙Ş’˙˙¶¶U¶Ş¶˙¶$¶$U¶$޶$˙¶I¶IU¶I޶I˙¶m¶mU¶m޶m˙¶’¶’U¶’޶’˙¶¶¶¶U¶¶Ş¶¶˙¶Ű¶ŰU¶Ű޶Ű˙¶˙¶˙U¶˙޶˙˙ŰŰUŰŞŰ˙Ű$Ű$UŰ$ŞŰ$˙ŰIŰIUŰIŞŰI˙ŰmŰmUŰmŞŰm˙Ű’Ű’UŰ’ŞŰ’˙۶۶U۶ŞŰ¶˙ŰŰŰŰUŰŰŞŰŰ˙Ű˙Ű˙UŰ˙ŞŰ˙˙˙˙U˙Ş˙˙˙$˙$U˙$Ş˙$˙˙I˙IU˙IŞ˙I˙˙m˙mU˙mŞ˙m˙˙’˙’U˙’Ş˙’˙˙¶˙¶U˙¶Ş˙¶˙˙Ű˙ŰU˙ŰŞ˙Ű˙˙˙˙˙U˙˙Ş˙˙˙,,Č˙µm‹ÔHNŁ6‘Ü4ŠÓČM¤6&\ŘđaD„ :„h#ĹŤ'j´ŘQdEŽ3ž ©dÉ–$S~Śéq$Ęš+_ÎĽiŇĄL›,wŞ“čĎśG}âTÚ“fSž0yÚI›,XłjÝʵ«×Ż`ĂŠKök’8[K\•D˘k [‘$IۆmŮ»xóęÝË7ď6kUŻöL¸°^[×ÚfE˛ @Ĺ[“ŘÂş-É×m kŢĚą3VmÚ$i›ěą´é»%Ú pUň-kv‘x+7«d$lµ‘,)ď$I¶µˇÝ€-7ŹOns\›eŰlµUŽ{[íÓŘłwŐv­ę\íŕµŰ˙JSBî[Úč`-I]č¶…Kš,y¶-÷“1÷nĽ ţÎÝVŰ-˙· 1÷_x žšh‚5(ˇfеŃĆ-»™źlnčVVH g›¶H˛‚$8bIM÷śpŹŐ•Ţ\˙,¶ &q iöH5ˇYĺă|É8# vČ^ Ě9fŹŽ‘¦›“Ĺ! –Ý@y *)ă}–pŕc%ÔŞBĄjDjCą °ĆĘäQ°©NÄł·F[l¬ŇR;-¬ŘŇZm¶¸ZëíŻ‘ÄeËT×hŁ‹5Űhs hÖěÂťąčŞË®»ĺž›îşÚ´ű®˝ňćK/Ľ÷λoĽřę[/Á°ż/lpľęiMą@î$ÄVntěę2°@Sqç1şş\#ń_ŁkÍąSĚťÄ*§;Ő_îVďĚúÚ,ł@9kcńÎ4Cüóh<×ěóÍE ŤtĐ:ÍôŃ@÷lqľÖô&‹-Ö`˝rÖÖdť/ÖXŹÖ5Ö,k}®ÖSq6Ú[s˝5Ú_s-6×ew}öŘqŻ=vŰf»˙ť6ŮrŢ7Ö­vÜ^ł-vßo>ŕŤ-öÝz3.ąßsWn÷Ţă­¸á|{Ťůçn×Ýyâ{/ľ9ÝUs*x×D>÷ą‹ç[věkĎäĺ·wNtßµóŤűîşß{ÜÁ žyíŹ/ß9í}×˝őđŹo~ ô¨7<ﲳ®ű퍏ýÖŕß-ţî›—ß=ŕßăMw#’\˝ąóng3ăîkŤľÜ{·ť×ű [˙Xö?Ř)n€]ĺG5đą-q_»FÚR§żé±Mt[éög@ ÖsÔĄ‡¸ .$ˇGŘżRí„,T`wćS ´]m>W»š-da‰«ő°D@"˙…řĂ’Źuw;W§D$:pKŚâĂçľ%® ‚×K`Úľ6šč@ĐpÍ‹Üţ¦ć;ĤMŠdž%W=í}ńŤnŚăďŕ8G9¶±ŽxĘâ"?ÚµA•E\baµHRp‘!)‰EZ‚‘±°„>ţ‚5/Ză5Ł1Y%µ†IÄpÍ’ťÔ$ş8ą;Q‚˛”źÔZáÚŵלë5ű{MßVůş¶Á˛dbeăF9ĎIPuWôäĘ$µ,^ŇnşdŮ-“ٵerÍÎÄ4‘ůLeRSšÖf5›yÍ—­7ăâf$¶ńŹ}üĂ˙H':ŐiÎtžÓťě„§?Ě©ńUor\ńNx˙¶áůłŚČÓňü‡˝0ŞÎ‚ž›ßçćČşů…O č;#˙8ľŠîϢĹŰžB7ŠĐŽbTŁőŃŕ§C±Ĺaú§>PĘŇ•ŞT+Ť)L÷ńR—ŇtČű$ÁµąHěrpĂx €H€*„.aPµÁđröăŘÄě7Ľúý-‹f”1U7AËŮm" kÇJU°’Ő¬e]ˇĄ×5pö­Ű':őqNšţ®t­+:Í)×vöužżKC˛‹$ s‘pdQ ŃD˘$ R?Üj7IhB!7ä¦Ŕą#şĹčU1˘X„ŐvD®´ käčřňČËŃ˙šďŽĎł­ěŘX[4Ź·S\âďBcČÚÍÚ¸«rńşÜ»Ţô®}….JË)×fh4ţ9P#ŇSžô€<…Ťd‘‚4ĚĹ<˘)jP$°f7Ű-Aô&Ë|aňç"¦-,i˛ü’˛‹Ď”č÷»5Qvň/ díÜćvÉ\’Mż¬ÄZ''ć5X"&‚Č[ą¤Yá±QL%Óp.;\L SÄžŠ…?Ěb¶•Čum;)s㺏oĐ5ąú°ń?p¬cďĂ4Ąń?&xŘrů6Ĺ9˛w˙bŻâ4â1IHy"•G‘AhŮ#ť·d e@%¨đp[ÇŤrŻŞMtá™KĚFK2”˙vúdčůüĐç–ηµsmńĽ[ÖVt¶ŇşHʶqÎłąĚ}.sŤhĺ&N:O~ĚZŕL:n8Îa%„ÄĽÇ?IHŤ#Đq:±śŁZnőGŔ[µ¬ŞŢŰ/C·ZŃż ŐdŢĆj:5NÁ óu5÷Ó„µĹÎ^‚MÇÚÖŤ+m·hÄMü×›VűЉľv-ÔťşčF™Ohˇ®YlăîToŮ)á\Ĺ˝B¨hÓçDŃÔĎŁ“WĘŕăů®ŢŢ'űNko÷í™·íj Ů‡p|śáoÜç˛-±©đńrqІµ§˝ńŃ<ÇwŐqŽ9.6±!x‚ţ˙‚YÜŔü2­š°dş(µŇćE~ylüµĺ沺ÉLę1t-¬ž,¬b O|o)´0w4|7WNĚl˘Ü/Ű2(ÍĹýR°;ćÝVó/îø>f)%W_ tŕ¬ĹŢDÓÜäZ;]z…4~펧rĚŁc>!÷J†f>ÄgöŢQ&'[âmŁţb×ę âR´¦čÖś.\}ZôxÄ„­Â#Š17Oל/¶ćUMú-îRĹŕŽß¸ľ׺˵7 ±ExĘś·_;‹»AB”3+Xŕ`¶÷»×,‹4Ýű&_°LĐôî‡OüÝÇřľNńťďžĂRłŇľó× üę7?řŮ×´˙î{ŹýÝp?łáO~ď‡üßGýšÍ>ô›iŕĎ˙ů݇ľ¦ÍŻéű#A˙ř§|ü€Ĺ7}Ô§{ăć6n•8‘0]?ÖqŤÔ Ž` uPL5A]oçh¬FśŁw N!č7¬ăbx‚&č`ĂF$ŘKč‚'‚jŁ‚$H*F#(‚MŐl6ř4()=(ĐŁ ça'ĺz%Ň É@ ¶P şPrM0nʵqóT„żĹx§•fĄhM¤…ąCqŁ…^h\hw<[¸=i(Qi¸…űd†dx†E‡Z8\u¸‡zga8‡űÔ‡€‡!čVÔ GWA¶m  Ň˙ É` –`“¸ R7Öv˙Đ?T:ýó<ř‰Jʼn Ř‰$xІsPă U¤Š°‹ŻŘ‰4`>Bł(‹~C‹ą¨?¶ŠałKŽP\‰#'WÚŕţŕΠ ő¤ V v` M€…4¶ŚŹcxĂ…p±†€H4ë"Zt(Ű(Re>7=&gp8Yôx"3LiŽĺxDă¨=ć؆o1xŘZö‡©Źd†áČZâRh׸qă˛3ű.Ń!śŇچW8…‹Xg]ÜÄMX'M¤TLD.­’)vYE’şäKWLĆŠžäs*ů’%鋤6ćaÖ‘&˙`]sk·‚'©‘Zg’8iaýĂ“ZŁ_v“0éwĄe5«—5­GO!§;d„óˇ ţ.r  lpŤBFWůÄ…ůtŹŢh‡ců…ú‡lI–í¸‚7$Dµ z±0.˛P z(éŤőX„wHqřŘ–ţ†a”fiŹ89T ;d ‘t5u9uéF‡ł€ä"cŤ¶zŽđăd Ť  v°  RÉh|3.’?Ż6Tf‹ĽhsX3®ů‘±8‚'ĆZĐC\YÁ›XI°&řŠ´)“™5©i5€'“h^Ă D˝ťU# §H‚5É6 f}Ŕˇ{ŰąŢ;t„\˙SĘ•ArRT& ˙Đ»`â¶qSą‰7G)‘$°‡5Ć!‚üąş€ŐCéVŹyočP6I Ú ŕ Şőô—J´ŽR×EJ.¶ł]FŐ$­ů8«‡53·;‚3EĹźĎÖTdł‚ld ş‡Oh1~ŘZi` ňOî´WťG’Ú0ڶPC_\ÍuSˇ±˝± q° T) ±g ™hš”ón–0T˙aiU:lá'HPDmA&Q†Ë‘V#ž%k"ůt)v$Ů8n#Ł»CZ§sz§uŞ'GaYť2ąbÍćY! T*iW $IYUĘXŹ˙! PiĄ˛ ţAEPĄŽćQM˛ {Wön8ÉśjÚ`’1¤rĹh\T†că” 8]ڶc¶đ ű` öpNÖ óDm4ĺP†BK6.X1nC•( 2ŇE° €Ĺa ©ŃTńhČ…řŽcĄ vú­x:§Ůj ßŘ<Ű…#©Űĺ¨qpe%˛?Ţől@R& ń5Tş·$p ěj$Ŕś6X–äř74WĘuhŘvW{Ę[ą7'dĺé\ËŘH’dmÔŮhŠ•Ës^XJŰĹcăDp qei Y¦“Ń`—˙j Š ¨ł2ŮxÜšrr ®B+:ś´y´?řM˘ &ë]AťIĆJ†(‚jÖ Ż` ©1ÎŞ iĐš©ěA¨˛BčŠ T{{±t…m±; hHOy QYwW]ŐĆ«}Ą†;”öy%žeźţ‘XŮI •Ú0ŔÁ–Ń Ŕ˛X« Ťř8=k ·”9`H®Cű Á‰­GŹôřŹŁŽ‰{źZ+(ިţ\Sâ¸láşGö‰ĄlaźŤŰi‘@»–FŲ©QĄIpů˘Ťë$§·8 kWđٶA¶7ŁŰŁ0ö8UaŤăbSţ07Ĺ\n×WÔ†kŁ˙! <$ňc—XSľ†4s6d8:d ĺNÔi›A“|*aµŹ÷a&PúËżűŰżýë/4tQ÷‰Ćą‘H69”5ĺ[ľ_˘9d—V±ŞÂşŤiĎ& ˙96Ü4¸Žj‹Ré1E¤–ë‹VŁvZ#‹&«‘@mWhË%«ŐÖ\÷#p(xí1T< 5>­µ5ó…źç…Ôu¤$P%ÜÄÎuc(§Ů „É—5Q˘>lĺP—eĺUróBv®ŚwĽwÓ5é2IQOiś.ű€t»ł&˛‰>uKSW‘Nú0»W W–€*›9˛Y3>…Yl\˙´_T3auPg|¶ ‹Ŕöjhďř8gł˘;gŔiꊓ̑föSčř—Ş…8*“Ş’su'T=µyŠMʸ¨f»ć5Ną6ă˛Â Î… 8˛S°›EŔ´’‘«3¦j¬LŠuÓoč“VG„ňbąÚ:Äą“ËŐ= hR55¬T®Ů¬p,k˝&FĘkoÔ>´sE¸4‡˘TͱÍ—cxXS±Ö€»JS“qNćá‹©î•éTµŐF– qbĆ+w”¦”®”´b;©—Űě–Ű|ADy¶ÍF›DcLTgLü5>»$JŃN=v-y|˙{u ć§ŻčáG 6vľC=ÔC8ÔCŠ9[8Śwů6ŽŔ˝5Śâ•Ŕťm˝šIů’śŞŮâÖ2XĹI 7žŤ•ëU˘ęݶ¬č—|ĐÇťšŐpĄŞ [qEn;5ą81ś|Zń|ŢçgŁKąî=Ü:%Z᛿ٛ$Ç ¸€[sR_>‘¦Şh8­\Ýéńˇ*J¬˘1páÄŁäI í‘żho™׫h2ŚŁüO»v‘!„Ę~.ňe"“ÁS(j­†M|CI3Ţž×Ü}Ú’W…’ÖĐ ˇ?§ ýôł· @şýé®gŤ r©Ö5p5:% ¤ÖşéÔŢ˙“ąrÜU_‘^ Ď3ÚŤÖ@•6¨ňµ¨-ďS'<3>JŤŢ‚‰Ä?Öd“tĘąB+ß@ÉâTÇŻä¤ăžâl[î`.`ٱň™šhp%jAŻř ¨‰ăđ/ůĘEѨWgsľ;%ŕóýncź­E˘-ŐI‰ęú»CqP(°śr=Zön?ó<żŃ‰ąH.˘ťËąo®ş é@…1 ˙đˇ?úĄëO\3THFR$°(ű™Š)Rj9ŽűDu¨Cďžřś&~ĎďIŐFÜŤÓłăždĄV.MˡrńěúîĚ-y¶źŇDFĂ.Ź÷E¦ż Xźův8˙ő‹â˘v•Ś[¬|GőEvř©uܱňşŔ».*÷ůb›µ„®6†=fü[]]‡¶P»ĎďˇÍš-k Ľe°`B‚ 겑ŕÁŽ,Ń€$mHH"‘ćc$Ú^3YP×5‚+!J<¸Í–Ŕ† kŢxÍšŔ])Îdi°MDŤEjÔ€ľ–(g>•I–­™«ÚÚfФN*cj5(ÓëÓť§ĽŮPmهe äÉ–mU&ۦԊł¦[„?&ůXđŕÁű´e}Q®ÉşUńNTśx­IŞV'Ú’%PÖÎ[)S^}K°íĺ¸wźţ h]k,ď¶)aÂD˙ěٲk×V˘/µA”‘$UMÖóD]AÇ«-3X¸Škví*PqN‡×$˝ÔçÄ„yi.îĚW[x»X#ďÔ–^ýzö†}Zë^S{e»ÖzB=˝kó±)uA6ąó ˘‹ŔíüRH®Ë4Ž˘môŃçź'ôgź +ÔmÔś‹ę,Ą›.!Ľö°Ą·>#(+bM´÷ÂŞ@°Xk¬Ľúj´I¬“„»°µ·t*H§m<ň)Ćű©-ďąćVL¬«žlRl+âv:˘žL’).Ҳ¬Ę«ÄT3PŻúję"ߨ"‹ űĐ$K±„ä*Ŕť2[±'¦´F¬ČŚd‘Ż4˙ßâŤ7)WrQ§ÖĚr.$łŻKK„/´*0»¶ŕ“Ž<üjÓ'č»,Ľ T4Áí4(>&y<I$5Ó­‚:¬Ą?@“#Čş·®+®H‡ôśŃHG·ÔsIZť…¶Ŕ*uuAţ Ä2SÝ«Ľ0•\ŤKĽzČ©ĽĐÔę–®Â[÷ÓmërZÂärÚWi¬U®<ÔTR[7*8[«L˘e˲EI,ńma…‹dşčâSşŕ¦7R_"ňßěv|Ż&0óùΎdw±##m,[~×úvÖݞx´a76UXHMÜ/Č·můgŚg†+emŇéFŠ´qDŞËÔŘ˙( Áj¬“‹Đ)…Ą‹Č?Ëäô»<§­ďčÄhR§BăSn,·ĺn铝,‹Ţ– ­ďŐ:Ižńćݸs×LK×V˛ă@ĺ"‘LݰŤĎµJSŰ2%·äTµńnřaĎńú2΂<Ë©ÚÂ] ÍfüćÖÔG?­KçcYł5Ih…ű»M>čѡ5÷énm«u‘˘’ ď»{_}˘¶)/ýÉ·D¬Ü_‹gv¶w“|›ę˛«˛"·Ť$’@‚|óËołí(]L÷?˝ÂŰ4oKđLśd>ôGˇ’žäU/q] ~áŮ˝ňŐ”îdkRµšsĽ´ťgL5Ú’dÔ׿˙ R«lZXŻDH d mhR¸Â6HÂRšTt*ąňŹ[ é]˘n˘:2e/ZqÁŕ]Tf‚za™Ć4§˛I©2‹™´ĽV¸lŐ­/ĘÎčřoťç1Ţ!KŰŇ!Ě î;ş0 Ő¨Ć4¸0Ä›Î}VĄ ÖŞó:ś¤ ©+fn[ýbŐ¶X5AąĽÎ~ó1ÜűřE.Fé;ŘjChżJavľ+ÖÎ-Č%y\ŠÜ\÷¦'V&f šČ ĆW‚$! ¬lŇúB•M’ 4šŰKŹčÖ/Ö9n+1Ť˛U;h)F|MHŇĐ„$03 ă{f!(Ţ˙EnŽĂÔĽšB´:î ~b'O$ş&j óŁDâĐĚ$(s|h_3ŃŔĚX’†8×ŕŢÓƧ[¸á‘hDT|“Oľ™Î@ĚLB$g €ď)$(•Ť’1¤@h+‹$ŕzÇśT!|ŇÄ[” 1 bpŇ& ô¤+Ťôa)Ja q8ě˘DĚçÂşČk5Ś'H‚Ążť´ˇ ” . G˝‰wRKßnZÂIH˘Ş–°*VVU…ícLŠH@źř'Ž©ä€HP‚µ¶5ZĽSMµ! X®ÚźoęzG  ¶HB–ľ$Č$ "Á5Ŕ¦*˙•D# Ť$Ř" -Äl$–)5YH˘ ľiÂE[ËJâhźBT»ZÖ¶Ö×ó‹% D/ˇ…ŰhDIžYÄŠ˛Šmae±ÎFŘ5ˇ[ńH@Ą&MÜ&ô‰„#k ̲žµFh'š>ĎŽ°?L‚$¶±Ť[lă» ďxË‹ŢÎřG‹»’J-ĽŰčČâ KđśÂ:űDĄÁd7 ®Gl€ÜrqŔ˛(IA‹XQp<ŰĐW nAB K’Ü€)ß=’„ŽřÁ¤MCü˛ĄXˇ .†ń‹e¬Ú*ŘaAtK|襝Ĥ5¬É‰mTËž…ĺK0ĺę%ď2HXí‹[KcŐÚa¦'yUß°ç?ž İăó˛‰YdXm ·ą%qTJ€„‰x„ŐĎ\´@>ťľŚ€$ (¸Fů ël*—š$˛_#™9w%=ióąíc ‘Đ@uŽgŤěWťĹŞođö%Ţ|‡®v5ń6˙ÚX×ŕ¦D±^¦.H°ěŕÄĚM Z AĐ„"P×# ! ]s; Ë &ÂřbáW"Č´ĘícyŠPÇŘĺ.¶5Úf‰KRňu!˛Gž)574´˛»Ş+Ȭ‘mXHĂ“?Bem€Ě ßČG¬hńQ¶˛~-‡K‚Q#<}Š\łśĹ~^˛Ë»1—SSń"c$\-H(ÜÇ×*ʼn&âC‚#tAľŕ6TČ*icÉ×´¤CÔD eÖ+{řĽ˘ÜÖhDB=Ňs‚ŹkuDPh‹"PĚÇ›¦HkZ·\Ö6Ţâi‚·$—i’3ĺ˛-ЧQ·D~jʇ˙WďîÄ i@av'šĐą#a*BÖ2 T87ĽR߆ĚFÜ^EÎjazm‘n˛ë˘ĽŰgĘJGĐĎđXPůÉŠŁXŻ6¶,Ç`Ł#’ُT 9«&"Zś¸Ţ’ţ¤yE&%R+ zśô Ę([°[ĐÔ…l@Kx@[Đ…ú»ěą› \3Ě.Iżů!@”ŽÔĚB¬%ńťť¨żĹ©Ŕs!ßP ÄŔ§Č đ«¶!ź:c› Ü‹*‚Ś•·=Ă!y?Ş%” 9¸09˛xźŁˇŃĂČÂĂЇmŘÂáÂďčŽOb â¶Č@'J ˙ä@˘ÁŃ“(Ę ™,$"'3b”HŹńÂ-ěBÝCmĐ'$Ž€:‹1ą“hŃ„„ˇŠłĐ¦}‹«B©“Y%‘D:ű›ÝH메ґŽ3ٵ±y$p2ž;‚$,ęˇ[ŞUě›9ů¤¦I,‹<›Odś‚•ßy™*zś˝ą3Mśł4Îk‚F˝ÎŁĂĐh”ß?BÚŠ{™76ä"°ů˘‰¨†hµÁŽţ!ŰAEřáEÖ(ťcy)á`ŰŽóÓ•›jBńŽŠđŞŇ…;ÓLýKdEŢŃőSd ÉáżbŇAíŔ»Ľ ae‰›­ĘĹ´%婳ŔŠŠR&ĺ{KńŚÇK [€Q?däč€?0@5•ǨŠĎ©Ę'Čfş<xôYř)ÇčŞúÁ^q˘ČW5ʨ5OăDµ6@«m4ŰG˝X@‰Ś“±˛Ôb2ÎŢĄ‹u Uy¨SyĹźą‚ŁiőĂ«|Ëŕ8oʡŐýšd+šŁrÍôÔô='*ľ7‡ťŘŞ^%Ôࣥ)Ö*€„łJ¶db­>.WaăW(î’eZ9‚tQÖ÷}‹WůĆešd»Ç*Łř\㑉÷üë÷–Y¶Ü­WÍ7ĆB=WVÓ•źÜ:ŞSŮú5đ9oĚÝöý!Žzxß5ŞyMaGw–˙­¦o*>V‰ćoůÍV‹%8ěęö;Ę@§»ÚýÎr¶Ć°I}‰WOŞv ŻŤĺ9ÚăZź ă“ülOlxűM„‡¸€mŞ{WŮńđ†"ÓYp‚ š\çG’ňpDäBQĄGźúÝÇ;ÓŮŐ2ČÖ‰%l{šÄ‡˘ýLî,đ+ůęÇ84ir˘;Üo’ωKzBÄÚNU¶Vĺ^byšűnb+jqCą—P\¨Ŕ ľńyCÜÓt2>śńK&őSá§ě·ż±µNQ黋ěřáME€źšŠ”’І›Ů‚$ą’öî%˝I-_8ˇŁË4g8 jnTŹ y§±D*B˙I×˙¦'3O†Ź“Ť3ŢňH¨;@-°+=4™ź:6DŔmđ—2”'źřE’€G?zü^}W‹2„$oj4k4! Ż*Ž\a kÄA4Ŕ˛Ů/1Č©O{‰3‘ «Hjqw‰[áďň˛§!˘ ™ş%ż eź>˛™XŮ@ MĐxů“ź š÷ĎýwzÔŐzľôk$ÚŚO#”˘eG’$H 2¸IF†[`˙üÓű€lŚlc‡ĂńLŹwÜS…~ňJa~ę|€Ú×C·;Ó†† «şcWčCîUő/…Ý[­â‚0D±PjlŃăhC¤ ÉG¸ÝŐ4‰…EÜfxźą%ô”śbłrAV¨YÖ"–-,A,©Č˘%”e*®2Í͡§c]Ů 90°ęG] S…y<>ůo2äݵČ۵RF«h2 gI˘´' ’h7!,‹Šx¦ Ö€p%máůx¬_ىxg˙…­pĺDW… Px‹ły^-M6i/T‹§¦ôŮ" 8J†q<§·!në%ÜS™yŞašDž2‹O4‡Ş^2ŐŤú+bl´IČö‡i÷ˇ "Ą,§ (貔°ťýąSÓäI2›iĐúb^¦ Ŕ˙H¤E‰CĐ©Ď|(n q\XlŚH ¶%ô%%ť(ÓˇZŤ˙x4¤#iáîĚąéD ›Ó)0›č `!_Uu±S°–+‰­Uôˇ ¨ţâô,gz٢GzHP:čĹŚiŞńvΓžX2KXť5iF©n†{ś4řń‰‰fި©Öp€ ňěI¨Ä¬_q·SĽhh)“#ěPĎđĹ&ă ĹüYg!á4˘™q"Aš9ĺéęż™ j=Ý›&1¦AEňóŃËT[śűŃ=üăă0íî}>{dâí>ą$Hi©5Ě$ĚÉk$Z%ř@ÇŇt’›™]1u jqé©Q@śĹŃŰéZĹĐ!ŘÝ”Ž€ä]ú$¨5‘OŮ‚öUËÄHET X$ĚŤ¨…D®DbËBŘťt5i¸Ń»Á×# ŹäYCŔŤC¤˙ ‰ŇUܱM ý±’ŠD®ŚD_بU!§X!´$’î•Z OŃBSuÁZ­e`đůBńů‚.ŚYÖpJ_ Y UątÝR )WćéůÔL ™!ę4•xTČ­XŞĄYxDTÚ ÜüÜâă«ÔB>˘ ,ĐcHDÖxČŘRAĎÍü¨dĎÇŤJBÖ_~ĎSĄR"}‡•ŕ¬Ń:ÍRa<‰ŇaŮVěŃIv#ů Ń-ę’’ÝáŮаő\ĎÍ+Í+ć¤MîdĎđĚŃěLÜ`ů ţôQÚËóDŃ_ÜbLˇß)zÖ0šEK&٢!šL±OEyŰĺmýM«ÖĂ€˘ ťâk‘Z!MצuâkI^DŠÚPđĹÝ”} ąđ^•=ڰÍOČU幸š^xPř "Ă™ŹUB•eY€ ýŕŕ ŹşđD7˘_©˝W?Q%Íř‰†˙˝éŇŞŤĹÜ}•ÂM…ÁŚü|ŃUě-2Đ~üRDŮßúA`ăĆ`©—=ńT2&”•éĆüĺ×UeČĽbúů¦ó!Nx%‘ŤÇ ŠŘ`ZŁ "€Ő¦ťŤ -_JÍšŁ’!ÔÓ€GIH&QŇͱ–kfUÜb#u}d ý%Lů“nŠüxŃ|BőŤJ¶ĺPęÝ_¬ŇMĽćv‘ĄřśRóěPýÔę&ď] Ů—KâŇpfĄ ZüŃLQpv#dƦhyµ‘˘ýćwÔi¬’í|x(zĄW` p–p.ŇmŠWÍĎ)Ňólh5Zeŕ€Ś}(ddQŢZę˙¨ ‰cĂ•Ąń€śOaŢ}¦ţ”UÇő‰T:#X- NśfaÉ‘&ňÜ•Ąrę%m˘ ĘucţLŽ.ćN¨Řž“égß|Ň™:\gęT€:Đ× bŦ’vc"¦çŘNuŢţŞHHĚÝôIhŠJ“%žľ•©‹é%śqV:±OFő‰č„Öh‚$z ĺvő*!ýˇdÉŔPęž°čň°ŠÁ‘Uz"”é…Őč”e夊8~ČieNKyÖŮLÂBHC4¤5X‚˛–çĺDź-¦"‰ťŚâĚYLµW–ßc­e›Ia^Ą¸†«¸şGŤKmUĎ5ÔJžUĽ&úń˙6î’ŁîÔgâigÁN~<¸ji˘DĆˬP©c•«-,Á´8€(€6ŘŔ$€€X´äME ô‹,ŔäěE ó•P `¸ČÓ‰"ÁBŚWŁp. uAÔP”@ĬČ,ÍŇě¦ĺzÖˇ˝9%€Š  "g^8X›=ÓłťZĂĺ/&qšŽi…F@¤-č‹:Źf łN–™h#ĽÁ$TC5T‹%řcQ¶YT؇e¤†6 ”«Ĺ( S\Ř«4‚hXd†˛ě‚iÄ5ČBjčBp5B^®,0ČSF^Ńm®I¤Ć•`ÓkY €ĺ^.ćf˙®8Ś •ÍLĚš%R´Űö_áZX^iÁ”Ä›Dj$FjĂbÓÁ„FČE¬Eü¶$‡BÁ„ą„T#¨tťf¤Ŕ lĂţ>Ä‘€¬%±ĐTAć&0ć*NgÝ'miĽ„GÇ€F¸ž@ČD0®$…ĆQŔ„!ÄĘi„@°FJ€#Tj´µĄ‡úFDjč× ‰Dăţ>@âŃ|ŠÁŃę/É%•’˙YN8Â,$ńŘB%ÜcłpĚ~IŞD¬›@ôUQ€ŠrÄnlť|ŕoü/Ä‚P±BE|ˇ7iÜEükü†@ÔJý›ŹŃi“V®ĺ@ďńĚZîć’Žg‘¤C®k¸Éç±tP×ËĹGDÔÇť A h†Ëi@Ľ^ĄGŹ)Dp¸A$Iß Á5Ü«^CÄÂŁí0Đŕ͵×W¬ćWô™Vľ,,±„W›×§2*IÔoŐ˝U[¸Ż%@Et8Ĺ[ŽEú6FfdpëED® FI’fřl]íŻDč4Až<Ýę§€+p0p0)ćČD˙UƬäM”±›Ľá*sb¤ë„äţFhĽČEdój D(KÄüFCÄBp„‘HDm ÄÁěWS'6íCňęĂЦ7ÚÂ×8Ň"Č2śĂ9ĂŘŔüŔT„E¶śĹ6ÁB¨oXRŤÉĹťTKż†%‘đZ´c8 a‘¤@ %9XŤŐkHÎĺ™|H8ŘBhHBe˘i ćę1kµü±Đ™LwĚO~ËKj OđĘ]¬5A4_Ř ćYTEH„_#tY ë*Ĺú’đ^[Ňü"¤±5¤@mHµ…yëľč‚7Yô§ ![hßpÜÄ,äÁI˙3¸3¤†%ěčA†Łü ¶OCĹmÚŠľś¶U°vi¶v)6€˛D„JźÂ6Ä€fş˛P0…ü6pwpKB+’?9—)ŚNv›íÜU´W)ÝöǸŚČŔj¨Ů›I·Z-AÍ_ŕäδňęHšGsäŔJBHAČÁ$ |Ź@ĹŕSĹ,VţähÓá·kqĎ( éş ˇ_6RQ6ZĂ>č‚ř;¶‚[tŻ…ŚN–tÚéČ)’F± ŢEĄ·n”E4ć~? ‰ńYçĚsm‘š„˘R ’˘X®äJ@ćĘĚ!#mxŔŔXDVëČž];c8µú™fŁü¨˙ɢůş„NÜÇ‘Ćn/ľW(RëĺK mNü\Îdj"}ŞD­ÎůmfS·çŹ#µÓ9ćÄ Ŕ7|€ÄA|O‚Ů•Îő\§`"g*‘¶+¨~Ń×Ô±ˇ] j@íf‹şR=°Z‚ ¨Ś#š4'›‚yvG z|^ĹŞ¶hęD$±ęěôĐ$€řĎ}Ä+Ż˝”"j¦•ÔE˛Î‚ŤÎYB$Ĺ’`;ď0[p·X´AÄ€0U$ž-LEÇf"ÁŤĂŘ+ÂÝ2D AÓl™c­yŘ0u€mĽĚ®¤šôMëmť `Ę©žrč"’ÔbhިL® 8HĄÖ$PěTd)‘„¶3đYn©›´1O¶«ď3„/3{&kű”¸áÇ!žBˇÂÍhGGÍ*W+ć*ňy«-5ćjŁ”ś@ÍĹ$M•j+á0¸f$u’Ih"Š8Ś]ąőmă°Älť@‰őASőÍ˙ąÄvÜo˘‚˛Ő¶ënźz)óP7ŞŢß°ťÚŔÓXěŽK°4t)^_Ăł%DŹö Żě—ôtÉJ«¶Ka@#fŘq‡U›P ©/ ąĐő`Ł™G­Ä"É ýÜ6»`%ˇů˛Ć¦vő§q ĚBŕĆ ÓŔ%Eë˛I‰"ŁŻŔě¤D›ŠN ^IÇ Q#J ¸Ç, ÉÚÖ¸%%*iN—IŹVX˘ľDb:Ďa™H‰"`JEp‹ ăâéÔíA$jĂ–ş#–‹ć/2±ťÄóŔ¤4.bý{XĄŹ0^ćr˙! é×Ăć€í!H)_7Š(¤)‚|QL˙f‚H™R&[!dg˘kÄ­D´†h´Ń™DF‘c AáG¸A”¤e)K) 9ľ¤BŐZ‰ž2 îg »dri˝HîŇ+«X]60ňl/&bSNDBd eZâËtć259Ň]¬+•Iśv¬ň“´’‡uJMذGÄlž'–{¬Vć2¦ é áEŔD8«¤Š\ĂĂه?¶ˇ}|CĂń‡>´ˇŹm\†;3 [ŮĐrÉ$ţ«9=ô×T>łtbSQYą'§+ý«*Ú°§G'7ś|ŽT TŠ,ůŁ„‰M%ź)fyČ ±S$ ŃJDAbĄ8Ś e)ŮŞ×˙Kś2PٱLU’—zĺš-ÎQ¦śpj–ĹĚM¸łZ~G‘%§é÷«fĄś¤IçXÂF@ĎdÎ,˘ńjÚxxSËd“ˇÜK- ŇJŇ´+Ä:™ÂpÖ†<źüJťřĽ–6TKJ!\–HsśÔ`Ď,-J¨ě·Ónre¬J]ĘťśçKÇfĎ/¤ć–´Ě9V%Ń ,bůP°‚E‰† \śxRبqYÁç¬ÉŇ„^Ä;”ťźĆKWXbĎ–YÂßM?Q‚„ ~¤ÝíXád›ŤŢď§ľ´(ÚÔsíΔµäśnüłŇâJ°\b‰Sş[xb–´fEÉL¶'®Ł˙†ç -eŠaÇŇ[â–®VS¬+çéYËŘ‚Nźtžŕ†"8ĽňQ)RE«~·¤ŃÉ„taeĘ/‘ÓH$’ Ľ6Y^ŞIÔB–EŠňă ĺhĆyÉQ,r$™_Ĺ/Ç$H–ŕŰKĆ>ľ] zŽą`A.xp¶™,D˙)$*ĺÔđSK{°Ty¸µ)âşkŕŰÚI)Ě™S )l’ÇrˇŠsó~ü8ü©•"hHA Đ€îYĎ{Ćs@í<ą ůŐ§čńĄkÄC:#'Ť{ňŻ~Rť›Žćj”žę‡;QčÖ Ts­žL_Ů’–Ë•bÜ´/˶Z^(~ –S’»)XüŞÚ˙Şí‹/\š™Ö´Ú„îe˝$X«#U6'qÉjĐp~†Ë®J_ěýŐŔTőn#!km”5:e§­hČv™ă”u\^®Bâ<¸ě˝ôˇěhdÝ»¨ţѢ,ŤňbżóKîÉvÄíó—Ľp’16Řk'yăŤf»Ŕ„ľŐ¶7•Ü2&ÇN&1Ę™ŹhDd«±_+8S{l^SÇÚ †÷Âc­9D§Ĺ3u4ůTˇmmußű€V ŹądŇĘçv»·%ˇŞ„ßiśH2XsęĂz®Ĺ>OČ%GNÎĐĆFŞ{ ÜľÍéÖçn¶öW5űVŁxëjs/´íB@*S†˙˙&J¶:˝ZŹ´ŔĆ–yk÷ć¸RĺSŤ%Śňtľ°Ç eÁënĘîµNt×ř¬‹nę˛ÇĂŮĎŔĆnÓËĘfŽI¶v_Ék[ 2“{čéKgÔŻľô‚vý@]/RA«ľő­?=íY?Ň×Óţő­—=ëe/űŢß>÷™Äýť[Ź|˛ Ä/˝óú{×?řÔ‡=ô­Ź{Ű—^úŐżľé'çýĺ§Ţů©·=ň9Â(ŚYC˛xńŤ%c÷ĂDZ°ŽYlŹĚţy©űÝĎĹâŻýĄQęoddĹćŻď/çÇúc˙p¬ÇâoóďţVl őŻýŢď˙C°P(pţň˘Qr¤âŻßĎQĐý 0óOŰ/°?p ăepĹÜ/˙O/^ě˙ě/[°ýřŻ—pGđĺ/÷ŻQ(Đ!FŻ;zJ=¬$§ Ěȶí)°Ť<Â#Ľ0ÚśM 駦ÂPŮ>Ă ­«\ŤR®ËI=ě0Óđ+(´ŁąKضmâÉ ÷Ú´CŁrŠÚÍ Ń†NŁ@@(BHţě´«šňŞŹŽ(ŰƉĚ(MΊb°BbÖ`Ł bIÜ`jË4‚–ś¬Ú &ě«ńÚí)ÄËß4iŚ®É:ě먇䰉 Îëb1›ň ćZâĐ©l˙&Lńd‹Ą âr¬NŮKŚň„–,¬†kËĽ‚şĽ *ú%Öúâ“R#®¬éŹ,©ç@ÇŞü0± ‰ K\Qćq´J«ňâ:R͡X1Ë4Ë·¬ĺN†ÍjĐćťdjžÎpÓĐmëDŃ:š¶.ôş ®úđ$B«4‘ÔDÎéK%Ň1+ś‚âď´1$nM˝KŤČŚ\ KËÖŞÓÔî0Ťý…ŁNâÔČ«˛ ˛"tn!+´ľěśÜk)eµD,ŚrsŤN*í×Čĺ˝P«,RsÉşh‰(Ć Ăk&ăęËß-ĹeI,Ě~¤Ň:gúPĎúܲřŕrű¨Ż/ĘD'ěň.˙ń2/őR/e!l¨©kŃrĘÂâěÜŕ.=¦ÍĽD®"I1ËC—Bń ”Ę\Sşž Ń/"f±Ţ&!O‘čxi&I4Ió‘B“r24Ó`2Ä$–n.ŔŽ«ěJŤěLRD´ÂĺŔm&έc¦hň‚j§&Â1ŻŠŹQႱEÓë-*Łę)˛*ÁέǀÖ8­Ň†H€´g)鍌h#MRmŽ~­ŘÄň+{Š"lÂ$ÔŞ3żŠ˛”Í·˛dŚDqĂd2¬.Lşî+Ŕ„Ş—:LÎ2ć“֢ú3ăŞ2ż ­ÓtÉę×z !eäf*ń<"2j„ÜŔóĺ˛M~HĂ(˙Bc(¨± Ô҉جSŰzJŇtˇľÖ´iÝčíÇFM%µ0jŇ`‚$4†Ź–ËÚÂ…ł‘ĄR"°Ćâ:ÂcVŁÚŔ­`Q„5@Ç@}ĺČ3ĂŽLE#ĺŔ0{Văoi!Š'!ĐËßšCľJ‚@ŹŞlŔĘÉÚ¬Ź*›> ôDňZl±(ů·ěNÉÄqĚ.ŞĐ˛íň qlI*Đ#CöÂw*ÉWĂZĄQ}…T2*Ů DÁ$˝N0áŕ¸ô‹&ĹNAŇŔK6q)Ü€_Bbô’Ňâ¤ó©âđęTŤíř´Ź>ĺ3žrńľ·L ďnłnŕÂĺH;ä˙´Â6+ŕfmŃJ{c&ŁS@Ŕ|ş X 7Qă2ŇTYłÝ•4ĎĘ2@•C]"ˇÚóĺ?jׄ®­r9íB‰ś-T@w6Łö´§%Ôu}ó»Ô FŮÓb™nŇB;‘1FĄćcFĆŽď8Źń¸Ž÷xŹxDúXŹŮŽé8 YŹŰ“ S¤€Ś-ěüjP§k…cÔ˛ţŮn˛+Őlˇç:złÂpK~É#1“ üČŻŘ?+I»‚Ý6j°,‡Š–Q€`9o –m––‹`–i¦–‰ tbŮUb9–uY–k9W˙¤¨–]…–oů—i9~™@šeš}™šą–‡—©ą–\Gżs:ë{9ŻďJâ;–ąŔXJń”,Ř‹číŽb±¬QÔ̦!´ŮR#<.“''&"4Źb"Ź2é’ - I`ÂŻ3`OˇNˇ :ˇŻ"`/&ú #t 8Úő ‚ :˘ĹFýţM3…b?~#»Žł@Ö`"oµŘtÉpŚi8WĂ*AÁăÉfB„Ďř*} ľşSâvRśĆć9uľĐ”2isńČŞ-ëď& 9míÝđŠ(ýq§2® a+ˇX ăňË•ż·:ÇaťkŰ4 yä^xáČÖ˘€Éś˙-˘1˙ĘŻäŽu>×8äVÂ%ŃŁ+_‹©–“Çř%01·¸z{ź-aŰěšľ®ŕî—¬¦SXMÎۨ3Řv(˙ąÔ 16wŽz‘h@ëÔČŤ®ě+¶† `ÂUŮćÇagtOF8O=ó•¸ărR¤őb·ń¸íĹc,a/|›¸{d,· 9Źóud€›·‹»Žu۹鸹Ąc¬[ą±›¸źŰş{űŽŁŰ¸‹» ż[»9ĽŮąńŘ»Ĺ;˝öŘ·Ă;Ľ“ű¸[»ő"Dd-$ÍrE }´BŞlŚĆČ\Ұv)Îlâná‹ÇF$˘˘Ęôűuqxí ¨”#ÂŚlÇ)˙”¨! |âD)BÜÂ3Ľ®_T4ŞăN¦ľÂ_+#Ŕă×€ĘFq*C9´ÔÔ˘2|!R˘ĘÔuŹúĆăDŇnˇ <üEbź«,HÂW8ŐéŽŰ¸#avřŽUjĘő"_‹{ËŤ;Źío/Â|ËÉÜ?”;ĚÁü˵ܽPĘó¸ĚŐűËłcĆ|»żĽÎܸ§ś»őxĎőX ż<Ďí|Đűü·÷˘ąť˝›[ĄÚÜÍ =˝x[Ń™[Ă<Ě)ýŃÝG"Úś·íÓ|/ćíÍĹĐëÎťÔI=ŐąşSĎÍĽŇY}Öc]Ě=Ő•»Ě']ŐµĽŃý<ÔÓśŽOťŹ×śÔ÷<ŐÁ‹ťÖÉ[˝…˝ÔĽŮ\Îß<ŮUť·«Đń¸ЇGxD¶ýg!ŠGÜÉ=Ü!|çg|gÝ#AÝĂýÝŃťGĘ}ŢŮ˝ Äý'¸˝ Î=Ü×ÝŰăEěýÝŐťÜםŕĺýÜADßą]Ýžŕ‰„ß‹'áŰ ;fox1.6-1.6.57/doc/screenshots/adie_edit.gif000066400000000000000000000545071326741342000203530ustar00rootroot00000000000000GIF89a,Č÷UŞ˙$$U$Ş$˙IIUIŞI˙mmUmŞm˙’’U’Ş’˙¶¶U¶Ş¶˙ŰŰUŰŞŰ˙˙˙U˙Ş˙˙$$U$Ş$˙$$$$U$$Ş$$˙$I$IU$IŞ$I˙$m$mU$mŞ$m˙$’$’U$’Ş$’˙$¶$¶U$¶Ş$¶˙$Ű$ŰU$ŰŞ$Ű˙$˙$˙U$˙Ş$˙˙IIUIŞI˙I$I$UI$ŞI$˙IIIIUIIŞII˙ImImUImŞIm˙I’I’UI’ŞI’˙I¶I¶UI¶ŞI¶˙IŰIŰUIŰŞIŰ˙I˙I˙UI˙ŞI˙˙mmUmŞm˙m$m$Um$Şm$˙mImIUmIŞmI˙mmmmUmmŞmm˙m’m’Um’Şm’˙m¶m¶Um¶Şm¶˙mŰmŰUmŰŞmŰ˙m˙m˙Um˙Şm˙˙’’U’Ş’˙’$’$U’$Ş’$˙’I’IU’IŞ’I˙’m’mU’mŞ’m˙’’’’U’’Ş’’˙’¶’¶U’¶Ş’¶˙’Ű’ŰU’ŰŞ’Ű˙’˙’˙U’˙Ş’˙˙¶¶U¶Ş¶˙¶$¶$U¶$޶$˙¶I¶IU¶I޶I˙¶m¶mU¶m޶m˙¶’¶’U¶’޶’˙¶¶¶¶U¶¶Ş¶¶˙¶Ű¶ŰU¶Ű޶Ű˙¶˙¶˙U¶˙޶˙˙ŰŰUŰŞŰ˙Ű$Ű$UŰ$ŞŰ$˙ŰIŰIUŰIŞŰI˙ŰmŰmUŰmŞŰm˙Ű’Ű’UŰ’ŞŰ’˙۶۶U۶ŞŰ¶˙ŰŰŰŰUŰŰŞŰŰ˙Ű˙Ű˙UŰ˙ŞŰ˙˙˙˙U˙Ş˙˙˙$˙$U˙$Ş˙$˙˙I˙IU˙IŞ˙I˙˙m˙mU˙mŞ˙m˙˙’˙’U˙’Ş˙’˙˙¶˙¶U˙¶Ş˙¶˙˙Ű˙ŰU˙ŰŞ˙Ű˙˙˙˙˙U˙˙Ş˙˙˙,,Č˙µYkÉMŁ8ŤÜDjÓHN#‚*dčâÁ„ >,xq˘F‹3Vä’âĆM‚Lů‘$Ë‘(=Âě(ň$M•.eÚ,Ů2fÍ•:ţĚ9Ô'NŁ=o&ĺ9“éΗOÝhÓ¶m XłjÝʵ«×Ż`ĂŠKök›6[“DpËk[n$I›DŇŐ˛xóęÝË·oŢ6µÝőK¸°a˝·lĄUśd°Ö·HhKňŐęáË3kN»ŤŞăÍ CŹM҆4Ö·Ű[%q+’٬Ů&y+©´-Ił·µ)qű5\«–1¶Őfe¶‚ŔUĚú¶čçĐÝţ˝zh[ł‡hŁš„¤H%ľÁ˙Ö}D[$xźíţ=Ĺ6ĺmHyo«Iš¶ÜL&á†ýě$gÝ€ %1Ő6 ¨`fIčÖĆ-Ů™Un—lŠaŐmł`•$˛śĄe$|sV€ÚY@ ^őV† ĆXťQ'ăŤe„U$v)& {s Űi—ž‡$´a‰„#F†` (J¨v¤ů—ž‹Vâ¨e^ZŁâ–`†uË]ţIŮĆ\čůWls±yÚ6¸é·˘6kĆ ŔŹ–€Ä’umhŮŹv±&W„ŇEUr…&Şč˘ŚîŐeBm8rC“>t–Ą”^Z馚všé§†Ę)¨ŁŠę©©¤žÚ)Şą‘ę«–Z˙*iަĆz–A“Κ)«ĄöŞęݰú,°ĽËi#€ćĺ˛Ű0ëlłĐ>+m´ÔNkmµŘ^«m¶ÜÚÂí˛]ŁŤ¸äŽknąâޢě·ß†»î¶đ˛ďĽňÖKݵÚŘ"K$ÖŘŇŻ5şüëoŔţ,0ŔüŻÂŚ°Ă ?ĽpÂC\ńÄgüoľýr\°Ç;l Č#‹,PĂK¬đĘł¬1Ę0KsÄ4_<łÍ2ç\óËË"‰5ůž tÉ!{ôÇD—ltŇGŤôŇP?-µÓT+=µŐÖ Ü±ĘCgpŔ[+ôĆţ"ĽtČh3­6Úf¬µŇdsÜvŘYĂíoÓsŹüöŘw˙ť·@`Ű=´Üý¶-µđëvŮz˙ŰuÝ9.÷Ö’—MyŮ“7Žąĺšgťyä›g}ąçśNş×uŁžşÜ;®đÖ}Żúăr9äŚw]vŕ°ă.»ë©ëÍ8ëş«ľ¸ďd/°ĐlÇľ{Ý>}Kż¶č[˝,–T›őŮ˲}ő?zßý÷S˙˝·đ?oxŕ|§Źúú¸ Mřă_[3ýŘďcľ·ý'Źľá¶WÉ®q>ŇÉŹ~@»Řúw7‚p˘k_`Ô§ŔţĎ4ŕĆh K(N ’J`”%ÂŽh"Dá ©":ż9Ďx˝k^ńŢCÎwčŰYżÄĺ8oě,Xj˙ŇÖŻfůkŢúŤ<]pd@Ěšşü5˝‘Mo‡‹˘ĹE1€]ŘŻĆ-bq‡^ä"ŨƦńŚnd#ŔĽ÷3ŽIBŽ‹ čö@>ňtz›µQEsQ1hO$$ÇYHÚ‘›˘5Ů1GNq\‘ôAşőM~š{ î —¶úílŚŰććÇʸą˛ěŰß §> ~ň• ŚĄ.E·@})hwĽ¤$…ɱélCfŔŚi Yś,_‘IB#ňźłČB?Č{ˇÖćbŤąLĆ{Ä ŃÇ6âńnśĚ#çÚ6xąůÉ€}<^ďb—Ľ”ŐPh­{đ˙ÎÜ˝Nťř¤ˇ@Y¦ đőĚtDĽÚÁ4gúK\p¨$°›łPćLZČl7$ܢ DH-°Ę4B-I*‚-"Aš·0žě¤Ú„FËIÖŹnžŚgjÂĚRęSpKśŘ.s*ÁSĘ2~Ľt Ű@ÉTý nů‹jă¶/ÔÝ‘–Ďě_ĺ&8ÁÓĄR1H¨  $\S0’ ”ş ×ÔbDfŐĎYđšŇ4¦ E l‘q2/–Ăkˇ5ią€}‰\&:źD0_‰ťäńŕYţŃscĚb&IEM–m™<Łe ů/u­‘´śĺźŮY+ÖŤŚRÄźA9‰}˙ě`yKÝňČćĚ(jăNý"ABH†$ĽőIjD fş41GšÜäf’"V8"$¸ĆZ’®8šŃ‰•›0QGĐŰŐnb¦4*e‹DQ”Ľć}Ú(Ű®¦rkµó[Mµ*¸úŽrůu§« ~ŮQcó­_4Ó:±ňsf×ÚZ˝$Ąg6×\Ë‰Š :\s.!ĘO$Ö2φ˘P˛”~䫵öpr-Îg))ćŐł=®ś?ő* ý6O‰ő ‡ ś6ű9ĽŇőČşň YÉąŰl-„±ĺqÓ8·ŰQżihC~–âđČ<˛Pk>ŘM†ĐIË lÄ6ŐYś'˙Ě'ÚF–eqc[€Ťeđ3ŕî`Őý1‘°˝]ďđĎc˘·lČ”[jžÚÉżÍT•U“é”ńVS¬őwmRóĺĂ řş)dRg’´ú$ 6Ej­Y-nOA©`Ř)+‚I(.w›FiŐMlźd‹âĂZ Ű‚ýď§C ôg!ü1]·ř~·-¬eöEŇ*1wÁ~äż[¶ĆJuÜš®ť}DÝFŰ´}ÜNŻ]7'w쎰<ťâ =±T˝ął„Љk‚Ll· ĺň’öeĆÜşvâ}H‰ŐZhÁŞ ořž.ž4žÝ†ďČÁv~W0üî&I¬!LĽ“Ρô"mđ*ía#˙Ţ&‚o›ý«0 qZ7Hęe-5hh¤˛|žó|ç“"Ť–‡®eť˝çG˙9Đ—ę,gYçNúĎŁŽtˇęĄa:ĎíŁő«Ý>F§úЧžô˛§!ě\G:Ů׾ó´sťíj»ŮŰ÷±ź%í;÷^ąÍŤĚH şp–]i+H‘[Ôaq°D$Ńeac źŢóžő"˝ÉWŢzÚ“<ĺ-_yÍs~ó”—<çGżyŇc^ôźďüĺKzŐ»Ţô˘g=ćaźůŮË>ö¶Ď=îw_{Ţ»ľô|«ęÝ®šşúµÁÎh)vQ‰:XBRhÁ—çfsxZí™ ĺë˛ę˛“3´j?t˙¤gşĘ&ŐŢăú™ÜÇSżŇîŻß-ű,˙đK<©L*.ŰwÓű~•ú6äk?C0Eśeň S!ov° vP R!;F9w–@TÖNúÄ;Űw;ą`/–GťÓO-„P~U0Żł?ąscř}!ŘăbEö;XĘFT6C.¦<¸xů˘isG„Aşđ#,Dťˇ v`ŐöGcĽUúµGçTěCq]C2’ö„ićCJO2coTĂ5TS]E}˘FSG•SđwTéćI 6‡tX‡tn ĺd`c xô‚ţŇCó ţ  ű/.pÇ7_ÔĂSuĂD)˙qŕ×b±ÔC#[04xďd2,‰iř<ôÄ6ł¤[“ł3ľerH©;H–oŔ„¨0Ěr)` {•ećŠţÔŠĂ€–4¶Ö@5xk şU=DđúŔ–űŕoąm©q9—iP\úpRD —ťŃ6?řAú2z3n·ˇ€ň‡Ú` ýÇ#8g'âHp|u!’H@@µa oAgR™ťYß)Üa™M€,+uŁé~y~D%rčăfů…č>@ď! d)qP\Ť€µ4mV™Ç‡ň™,"ÁĽé/o@»‡ďgp~I‘Ů–¶ —Ůi‘oi›Ö˙˙ŕúqvląpĺ=ç†Gö“;+ŐŢ2Mŕ#µ€_a#aĆ™vha đLŇ` +µWmUńaUv'Đۡh1ČŇx÷‚'xNé4?Ó€# iŔ–$9h3= hńRá‰Ú@„™×äź’9RŤ $PVéŃV҉«č:]™”îI=k9—$ —Ů–HĘ–¶` ö±Ś"éuŚ`#„ąÔ?Šů ňI=ëQ<·µ<‰ Š$h ×QĚĺ%9ˇB“,•ĹuM<ú[há’Q¦‚Î6. ”p˝ IÁ–ŤĚö/ëD±ĐG˙Z¦VA¦ę@‘&ĺ!)¦üqR˛§Ę5ÂŐY*=W?Ěl;@S¨É„ŤŘI˘m—Üi¤x$žä9#JŁž‡#™5’Ŕ‹¶ć§[“h6·_ż% ‚•ŻáLmŞýRQI@V‰§Ť±nQiŠtş™¨Ä6c)P?ř8ôtSáG'#z¤›ôbgŐ©ţv:­™Š\hA%Ö…•mŞáŃɉ<3悸5R$Ú¨KŞťmžă9ŁQ:1V=ü˛‡S~őSkéG‰ö¦`@DÄv%ţj›„­jˇź©eš ˙‘$ÜQ¸Á˛'˘ú“§4…ŁXh*óú@—tI „ĆÁ#ÜĹ™jQwµş`M’aV‘P,Ąp‚<ú6‹X •µ6ť ”Ą€'k٨ą$—o YöΚi×3?F±ŕÄJfőY{Őc÷8¦}PÔI‘łSä‘CB 4r »Ië" %\S1]SHŰCI–i˛ ÔIHâÔ8‘{ŞÚ0ŁBĂC Ů~ţ˛e»ˇj Ä´Öf9 +9’”X=‰«ŰYĽFj›Ý‰‘o’ę´R]C|€Ó#µ :׬t+o±eZůI…[.ł}Ç˙Ł0…$0®‘f932Ž€ŚY;ĂT_Ső`ϦI –|ş·Ć´é†2ă1]"r±o±†’ł»Tę/ĺYKD4ů9‘‡{2m[«Hj«ßů–FĘťÜÉBÜëdzsGô(®Ż« 0˙*\XŰq‹T=´…ŁuA"WTłË7’–U—Ugź¤ěę‰ç3ndXŇfŔ˘cZ‹TSŠűp[t@GŁHůto^Y|¬Ľ‚%0¶€`SAĹ!‰Bú .Ú ·Sa‹`@3Ąˇk &Ś,T8ńŃ/Ţ4]Š rˇk 7GNËv…¦óż•ä‡'óDf‰@űfAM•¬HEşVřÄx…®Öků˙g1ÉĂgčç;«;‚J)‰żĆ~×Y?RČBÜb.+t„ކ»654ŃsĄ"™:=˘ą€\uő¤ÓĺLm6 #o÷ĹgW䡨7kËš^´”m˙Ôˇ×ć7»«5W´Ç˝ě—~łŽd€{P‡ş_> ©Iő®ŘIż¬n.<ŽCŤŞĺ°é*h(CÎ4†Ý ŚVčA%ܵWÄq­ţÇŠé—;̤#I|ś2ĺ¸PMs¸U3n$ÇL`3•ÓpźD4őGĐGě0H”6|¦kJ¨ÜŘŹŇ‘®eEľŘ?!«=ÝŃýŃŤ}? u4=•`[ľ‹»á’»I4Ť…_Ł›>Ěł€˙w}ĂDđŐŽŁ8Ô6‚FÖcQ›=…0ýľĹgfĂFYĄ¸ůç4ä»çd~úĂOT6¬­¨ą$@$@VYÝŐY]ZťW`-9šWDPjVgÎ;|xÔË(ÉLz|5ť…Ž9Săc®ŁE>ć…€g>ÇPşĚqF»l‹ôžNýÓSgÉOÁ»®šŠNýC×w#{ĐÄÉŠąŮśÝŮžýŮĚ›>$ůĽ‘SËŤ^4´@÷ÓN-Dj˝¦wéDşóI;ÔCgç¨ZÂCŤ€=ɦ%műV“ÝČižř1v™ĆPsµ  ă?„ťÄ;čĽâ˙ÂŇ’[8tTD`f[ćü€wë_Ą,c =]=éѬęü¤š¤šVsşpk!°śîc#Ů®)‚IäŹFĚIěx'.µ!ˇ$·˙EKy 2÷¨\ńŃPßěĽ Ş=;™ 4Ii|Ś öŇ,7WTnEŢĹ;Á{óÖ…˛0$DFŁ=|ÝÄ#ßánű"śďů ?ú>3bßeč×±täĽÚŐ/‘`Ű2ţ#ů#hĘ#ŢSű~=âĚŠŁŘţă9Ď5a¨JAŘ"4B\6˛ âňú·yBóet ×C'ŰCgŠă3ŐďŐ˙^íłsS˝ó~xrý×Ýß.Á·Úť[=¶‰Ţ"cĄ2ţK"#ŔRś‡ęöĺy´řˇÔ8‰Ä´aM›5‚ş ´5Đ Am¶:4čĐš®kÖ:LĐbC‹;vtxÍ GŚ jۦ/ĺ5}Az\Ř‘ˇCŽ Żq<řń`Ć.kĘłäÄ *HçK˘¶Šüű§/ęTűŞúűgŐjÖŞSĄjÓ—q¤-Y’€J˛UŞZ¶˙°nÝş¶kW·űţ!Ąs,Î’3ej”¨ŕ¦L­Ý"şk'ŃÂ|5}¨M$ÂmGŢę9ńfIŚgrĽ&‘qGś#MŐK:pi’.;nvĚt(˙â’ +µÚb}űôőî[řďáŔëł¶ícDK‘HŁ•]ëUß^§jŤµŞôŔ9iJĽmM±Iż3Îx‘hxĹcWl:đ»üÍą7Íş»j܇&K5ĺëě%űVăďŻűČđ#m0[ϨÉ>1‘˛emPÚpĂm:üCGQCŔ´‘Ĺł´&–´˛ŃşcśÎŞô«2¦bŞČˇđn‘ÂÜ2ľýc-"˙äł&4ŽÜ¶Â”DŞ'üŚJ¶îŇë‘5ÉĽ)'1ŇM2ĆR̦ů83đŁ+ĂLJÉř’:ŠN;ëÄS)ÁBł%ç.JqFďTĐč˙ÂrS5Čž,(=“0TŠ$,3óë»G5ă 3ËL:óBŇ, ¬Ě„„4‰3+ĺ'ÄFzŤS*3ňl#ůËÖOŤó1¦Ú;©M6mSÁ™Ęb -Żľ‘j›Ş˝nŮŻ˘bVh“Ĺ )Ú<]*Lőhr“Éذ]UĽRŠlÓ'qU“>†4erI[ÂËL§, śďŻÔ¨|­3ŃĚ­0zÔÉ"݆†’X|[ëdh˘6Ü0ş;IÚHśE@©řŁ€hH-üŃ$ȱHB#üa $¤ˇ*`q”.R„–˙&éÂE›Ž,’°;Ž0 ihB`§oXeT.áÝ@Ú`8kÄ!EUۆáÚ@PµÁ łE#ÖöPB4‹C6Ă6ĺf ˇ°HŽ} ń!i4=<GâŘĚb8¨`ĺ.ˇ ¸!ŠE¬LŐ"Ç‹(ډ˛¨a­A‚ü°}ÚŔ˙b !’0śáś¸?“HÚHâšI=˛» bzžŇ,»čŁ,€” ţHüŽÔFÚp—ÔŤ†,Î Ű‹¸RŁ"VÍŤW“uti#w%¶ d` 8˛)HCK@‚ U#AŔÇ˙ hÄ0B7¤˛@$´G€H`šŘa¨_Îň×µ¶Hʉć3ú’EşŇ› uę]T“ Ę ś’;¬Ú‹pMĺX#ś%HB9%ApÚ˘Hp¤,PŕH$ˇ !&4yWNY3śT» ҰÇ6¤A{á|h$®QNmś$TT"ĘQ–Ó”ŕ´F ˙aŤ®Ýf!Š$jQŁBëbŽH#U… ŞlQŮ–6Ô9Ăa:ňŁěŚ& äĐ: ę̦-Ô)Ţał lŐČş Č"Ňt:é*Bu敯fzŰiî ˝ .6?K$Tx•ˇş„"˙.™šG_Ú†ŞłŻ’AB4PşžśÚŘ]g“đŮŠö$ÜlÄEGűHäŐ˛ëÝ0×@¶á™qdC{"B¶ĚĹ*§ü‡8GéHS:ŇŞdegzd×bÉR* TAR ]ę^Ô ű”Ń€\C‡ŠSťŕä^(ˇNĺč Ń¦ZÉ—„˘sE“¸ąC‡ “Ąuí®J×i‰łŃyţÜ\ŕÜ4ˇ3áDlĄ?†Ç8njr¨+!§N7tŹwAI]/ŚNf’wöŐ‡“`ŞYÖwŹ\'"›÷®gÂo< 'T± ÉÍj #¶Ŕéç¨\OЦ?}ä‡ZTô © ‘˙ĹRwŮ®,!˛€ň“Éâé(«“QlěHŔO±H(AK°Cź€ŔŞqTą^f°yq o¬9ĚCZ‚’–ěĂU”ąSB˙n;ŐÍNŻREĆť+šŕĎ'nąn:ŃM¶•iŽ©ş2rÜsź QOLb‰Kc ¬J—°`¶ŐyVŚîéÓź˙ĄÉµr×3Í$5Ůş„ ^ÝJŚ÷¦÷ŁôE)#Ĺ&l«yaČäł•u«6Ć»ÖČ-˛¸ŞůŠ#’1Ű6ůÜ]2VW‰c5ÔJnóOy]vʶ‹ÔŰË\f]<#}ČI=z: mýŘxS¨Ü€7ş‘ż—xÓ¤ž'âTŰŞ4{›Kꂞ^Ş22Áů¬ZźŇ—ă [˝+WFsML@‹ íŰő˛Ç‡b–µ„%ŮwRVµ˙AŤ Z»Ë]NrK N—ŰŠvéŮ©Ť^3ÖsĎ‚¨ůI†U)ô,!MR„·Ň¸ť30:do±ś>ĺ3'1N`‘·M Ó~üt©ęśú†¶1{§¤ö˙‹äŘ7ý돱đŹĐ±‘ #8«Ţa/ޱ†ŰńŠľł:¸Áő)4‘A$!•zˇşęQ=„çcs,.T=*T+#Ę˘Ě ÉżHŕ ¤9ŞçP˛+Ó©J‹Ôąɰd%Z±šÝĐC"*™Ŕ±<Ĺ R šą)˝5‹—1ŹéÂĆ 44\’’j©ú(řŔ7¨…ĐHt =¬”±‚€‘„5¦ş¤’aĘáŹÉ ĂăÁ1ݍä…¨…F°«@”Ú 7@Ž,‘ćŠh‹9B˛!Y-0‘´Č+#繆H›š6Đ3’ł!´8BHJ‹@‹˙)K˛ ÁZhąîi”`$Π2łY':ĆÄâ Ţü9Ô°?2Qş± ŁŹK´&™P3[ ߉KpąćQŞ–«˘Ś0OA ëÍßäMö!›p¤ "9‡đEŚŕ –´tTŹęéµ ˇ‚ú‡€˘+Ô‘ˇejžF84Şł…J@*×yĘ« ¤ş ý;ۡ€*Í‚ť® Ż* aŠ‚2'aĘ,GđÍu*©F p"sšQlRŁŤ&čťł"GšŃ ž÷’…ł*(ĺ˛r)6rŠ˝@<ĘaĹňµ Š4™Qa'ŢOĎ $µŃŢä RŁBµŽB˛j˙p„w˛†rJ'p©P&9(úÚ< ¦‰Ěě ·ŕ©H(QŠŔ÷D‹î©šVZIѬß{.‡:!Ól‚âž@ő´Ý‰¦Ai¨|K iŞ"{«gŇ0á Lf‚»lʦ$pT‡*‹l"©QµĘč´F°l¦ó˘+°S§>B-n˘šlĽÁ/äĂ͡Ąd qľ‘((7C+9P©$č´H(‚ŃŞRÚ5‡pŻÚ+Wµ¬1æúü!Ű0Űr¤»˛©öÓą \°ŔĐŤ«ŠXTáŃłJ&ŢE‰ŚŇĄ ĹŠM‹ÓPڇ͊Tí);ĺHÝŁ#&ţQÓp‚ŔŐ´’"˙=SUKzŻĽš0•*L‰ĂŇŕ¤/ř5Gp°8°ÓÝăÔKą•› Y° »ŔŠë)°H§ÚUŢ1.ţŚ­"…@§gęŁ@"Ň4XłRĘójpJ-öRÚ5"µ9đyzĚŤ#;»®€Ôُ;4$¶g›2ęhˇúZ© ˘š`˝[+ੱX°†đ<Ą©I5ş†1U§$Hí)±mž@r¨PˇhłÂEÁ4.»Őž‚¨°˘,5m('Ħń8™žSž”íŃUÚŽ»ŕŔ‰\ľÚˇ1#ÜşŇ/ĆM"k -Ő¤łÉ=¨ą=ŇúÔ7mÖŠ˘Ű€r)Ă!˙+ĽŰřF‹;vUDQb)Öô‰Ó¦C >©…$­†D´}h*»8›+{.1 x#É9!¤ŢÔ<‹´”'!˘z.\™ńí—ˇHźM1YdTŢźč§(ĽEĆ@•źł9‚Ś]়C_iľˇŕ_Ž!üĽɸAŮ8ÓŃŠňňĘ â ĽyĄČPŞł!P]‚‡|–*Ł`:‘¬Ś‘«r ÂÉ\%Ń‹-4wlśë;şÓŔŐ<üáž'ŁÓ‘î?n\3öôR>áß5 ăř›ŹE± 4lăËšů»˙¤ ´Đäi|[íŐä? 4š:LŹ™üa{Ë ÍrŽ'ýľĘ!Ëxţ1lÂ[’®Śůű ¨˛čEÚöEDşíÚV1˙»R±ÂüZy)9$ăb&J´![Mö ¨sś^iE6Q É9wÜQ®écĆz¶8@BÉ€î<üˇ|@.‘EËx#ć&ńÇ€™ťËŔĂÚa¦ń@¤Ů6˝łoĆÂď®ßC­`bť¦đž*AžĚřH˙ť„fľ%‹w¢őò88%$pŁĚÓľ”Îź‘ĐăÇřÉqC"i“ué °; ')7¤Y(‹@Őül×vn2pAC‚aéd¦>R\൸ZëOňiÍi‚4Ţ0Ţ—XŔgx”Ť$ŹŐL”z@lj˘‘Š(TU˘iú«!µ"«)j"C˛†žÉŔŐT;˙‡ŔYk8Ň]h ‚$T+Z1ĺY–o ü˙Q‹6„űŚRĹŞĐ2ß9j扄4ŘŚ žý1¤ń1‹#U+ĹJÚ kćAóÚ‚$u ą™%ÉuŤ‹>Efr ¬ňmH›âsM‚°äęÉĐ™ďű!Š$h-,ÍŰB˘ŐŢ9Šůš¦ş÷:ŻQăUöJÍštrЂڡŮň*f:S «lŞ"UA6?xâl×B4߬îlŞůÖôrŻmh14?%«/iHvâ0ş¦gÚ¦ÚťbŞ­vGóŚş0ˇydŔČ1ŽÁе836`Í}Řťńáť˙Äő·čţ †¬»1 =4AMĄ Ő<’‹A'Tj1n2-‡ eŤł˘U˛ Ůt"Ú>ű!"3];Ż=B‚nMŽ˘Ü‰ ł f[,Šóđ9hłTM=Ááón vĄ\wÖťí°l˛5ŞYĄ«´ŕ)ľę4 ’&a:Ši"w8>©á5»YR‰­µŁzP7Yťgű!}¨lz–E5,`Ň.Mqň¦7¦=:Uń‘Â+¨Ő¤wtş(—j:ˇpGó©ÉUďZ-¤E‚ĽştĹĘß±őMeÍż7Ă’ŇúĽ nôËŰzv‹­|¶Z­˘v›­Ç-'¤Ąź>“!Ť +Żš3¨o˘˙aš"µr ŚGčŔČ±Šž xÔJ4hž?bÉ”Dr†–Ť/ßĎoźIŠ}ž~ĹŞöÂU?w„&( 4ĐŚÚ¬„/T-1Őˇöů0Đbóô·eÓe˘ľŕ­gď„yć–0Gń4I’ I")Ť¶¶Ú IcM—µ6mlŮf‰¤"Ú’ČŠ”¦Q›4’6&id‹Ä5k¶´É*hk`šH× l3P[#‚×Nn{hMŰĎ•>!ZŰéÓ–­"˙ţůŰÇtźżP˙éű2ŇS[ÖH$±±Í>­Z!"ŤäuĄ$}×ZŰ&Ô-Pqúś«¨PźwŻá-ŞM+]˛ţ˙ö[7%ĐÄAµ]»  §­žI8ęű“oQŻnéÎ] X¬W]צüĽXčÚŃt·iۧMß6}*gëMŚX+Pľ€ĺr6´§h t˝vfě• dşĽŰÖž úůéĐ*‘P­^uęő¨K«âE޵Ťµ—UÚ’%éaĘHaĎ҆>ű–söÖv±,öď]Ü÷ď'ĚžělzFDÉ"Ô}nÄ‚Z~G__ĽáçŐP‹ŃV`Ąť…až%¶›sřáGÖ„ÖŔ·źz ( ]:bt#†›…IfKi"ĄTSM=ĺcvP9…D(D H6Ů]ä™ĺSZ…ť\.v‹ŚYb—˙Ž"‡Łr6)˘•lˇçŕ„@ť¦~Ňźp ŃÇ"hlŮ)¦•ěťřWJlŤĹžpÚ`É`ŞČˇj‚XD;ő§;™ćá—ŹľĆš5ú$¦©6ÚŘÓ©§Šaę+ÉRËyDm©’Q ©”H#F‘WČy:W{Ş&RşĹg˘ŠMެtz=ˇÁőf]ű1öŮ\…ů7í…D1ČQ:§“îý٤_ Î&+^·É¦µ.™PŚRřśjÚ$×)_Ś%_|őÄÚ˝—-K^G¦[a‚jUH"!Ąj%ĄŻ~ WךÂa91ŠöĄ_źĂy¶k€g9,˙±+©&[ťÍwn«ęş˘OôEë}…NŃśG'”Í‹â|éşw'“ÚĘGŰÎńyhyçá—–iłĹBF"e’ł4‚5 Ť l!‚Z‘«Qłi‹ă€ĂňÉâ\˙†ňŁź%˛ÁÉWĄ]U;gTÓ<‡ŮŢÜ€m|!tô 8č—˛Bkk®˙A(.ĄRţnž|3¬ešwˇJ’ŔTZ-ŹÜ €€AĆÖ$쉴έ°ÎX!Á- źÚ4¦KaŁşTŤ#€~nhşĆkµćťłI¸­‚ƲµîŃqĐlU˘ Aj% €D¸lŰC¬!P%IŔć?b‘śĽ8«.ţ|¤Â†KčccJ;Š-čg— ‹^äÚ€6|s˘H ľÉ¸!M¦J„oR”61H2‰ůQ‰¦“tičPŹ– .E$6ÚI ď|‰,%‘b>Äť%hW’@Ń´Ał$Ś$Đ`‹XŁ—7TI|) $i´©˝L’`ĽBŃĆĚQ©$`ę˙@éT“XĂťI@Qă"KK|Ô"u©N\b˛Y!‚5¨B„0ILĺ\ßÇ𨶴ĚČeDiť¸ŘR4kŕJFDň¨#PU‰ÚÍČHÓ@Ń$Ä—˘™eAKQ»z4 €#Y€ŞşA0hd"Űm VZ™%Aë®”61xIjńŔ ĂI[ÚVÚH‚˘‘A\َo•‡Eđb,RŹćôł$BVŃ–Ś4$.í%1I°±ŘU˝ťÍXUşZÁxç†AŁ ¸&56ˇ®±ť+t'hˇć@f™Z§FŘD7}©ĆŇ…˙śCŕ¬N•hB˙!Ň6Č‚ŁŤ(AZqůÁ@W©•Y) ¶cK´ Ž(Ą.:Ô­4ő'#.qG“ĘLV ¦ C& Ü ă–*Uj ¶1JĹ|L"±+R)š†“0µŞIÔÓaäre§›ŔpńB!sô^ý0l':‘w--Ć3ť-PUhŞÚ%ĆĽ]ťĎ<´SĹ+Ž,?!V•Ů“ˇN§hiN)šéHô–+Éü-{2 $¬őfUŻ›Ó'µá¨Ĺ€UbRĘ©ŢDÂrµáŮŁşs6Ľ•ŠEŤţzElřV â+•… HÍtKŬ“ˇ©b™Ą5„}“˙ü(­¦č6<‹źVź9§Ţ|Iz›Ő!Z¦=÷ŚŚ4&·\«Z—é-`ôÁHË\5 ĐmČTF\í)ßű^myŽkC;LŰ(d­¸Á¶.č/)d[ó].ZĂ‘°c Ůş(ş…”ßxk…Ńý%ŠZů˘-jˇ•ŹĎÜCŠM„ecŔŁ´ŃŠźdIPD@±dć˝ř°$± ŽĆâ/ĄĆ« š5a˛CJĎWYťÓ0mÔ*Y=ŵQÍD?Ł„›ÎDňŘÎ+€#·5<Ú´¦UF…°—vŢK¸94ňçĹĘ·ŔJ1gCôjŤĽĆ´¨1ɬéµüsbłçD-˙şw7“ŘđŘ-/ŘČ Růé# Ei=±Ź®­°‰D#â`Älµ‘‹±č™ń?9i­OVéęŇźv~Gł‡č4-ĚËčyĹąç¬;A™”±čL#ÓŢä[ ű¶źL–vë¦âaA_oÓő]öękW{4„C(#-ńDĽŢ<e ‘ÚůM§ć¨ÄXŃ^_€xÉîÍT†ß$ÚBß26âKŕÓO”á:ţJjÜĚŘ™]$ `ůx#Żř›•ÔM^T Ą\ťDµŮB°ŮELmÄDĺTlŠý’XĄ€K V |\™y“¶ˇŰwC(PT«aDU}‹+Y^ž!TĄÁvP¦l»$ÄD”D´ćKŕÖ7 D¶gőÇ@ Á-¨Bô˙–MH„R%ÁwݨKĄEÉY”YBDBnSýĘZ˛lCS°Av-ˇÉźřĽźm¶Ő>0‹‚Q8"ČÝôŢĐ´Žą4ńŮG}Ó¨˝\2™Äh;†`W<)}TI…JáÄBĐ){É’0¨-,Éś)Ë˝‰í@DK~†,[UP…䵇ŹâVŤšU‰1S0šH\ÔGégAW /Ş•IýtĹYkfŰ ¶Á5|Ür‚`© rů.EÚYJ˘âřŐ D0TúGÚK&ŤĎpt9ÂXy”R‰T/NZşq.-URŮŐlXŐV¸A«ĹÔ ¸ÉŃPIzp˙ENŤ§6ÔÖ/YĆĆ@Gw2g´Ä‹ú™"Ş;1Dkö:U z[©‰Ř5¬WCśJ.QĆ[aeŘ×Y•HźKćĺ~NK0.e6Ö4–K8‘ébAŠ»˙AgOęfĂÚX¬~–Kńi°¦ADŐá,MÔ‰!g”S RĄµ¬«r3qźrÚg‰Ö}•ÄHÉw)“{ÚŽiĘBôTěS{0ŐIÄ–PéYWUUWŹŐy׆őRµQFI(—Ś‘týIőÖµf[#ě [Ŕ‰Ź=ýIH…°ňm´ĘÍdÝQ]ÚQLPśĚň…Éź1N®J‚*E˙Ây€Ç`´ÓBÜĹ–Ý‹ćF„$4‚Ô]C,HÄ6LD*iCh®Ť HiЦ<čůîŢ.„5˝ÜOčnźt9ůRečnëjµvB4ÂĚ«>é霥_š yŹ\$Ę’€ŠlÜr"ň-Ť“ÔbŃ9ŚwÔÂ4\Ě•‡wŕďţbP$$ŤRn 1в•gČÓ~‹ _:ŁčŕÔç´¤e$qÓ ^ltđ.p_ ‡íČ ÚĺĚÝ5cĄ8žŔ5+Ô°iBńu0çąF›@Ď\’&éQ[ůC˝ô†d$†˝ô•E˙Řáš8®éĚ2NŕňNvÚʰÜë{ůŤ&&¦FĄ"fńđ5Mî ĄXȨo˛áß°äŐpĹ0ŁÓđçůśŁ”ť ΠńŁ~0ÉHBŤŔÁô“Ç<Ňg‚§IĘL y"łöj6îj&®©K PĐBFaôÜ ßÝ4&?ŇűŤŐ©›OtĺčöxX° ·H—QoˇÉJźđ˘Ýg,&퀦ĄN°$§LbQˇľd{^Hô芡clF•ř'Ţ\ȵ¬ńj{Žrxc]ŽF,XíbHÂĽ98|“%Ü€ €8™Ó aŔŞD¸ÔÇéBĘu‘ľ=Ş‚:)Ů•ĐyŃyHiÄYŞ|ŃVuĹľŃÜHtQ´ hg\ĎŇh!AëT-6ÓđëR ˙QiJË{ ¸ˇ`!ČŘŰ|^!7ŽéäČw»x`čëŕ9’0c¶đÔ&Ů­3;Ç#H‚444xŻ.X‚%(ŮÂ@¶Ů´J¸­Oą3É’LŐ_hÚDý„;5«Íy#„ź_šFů”qÚ>Îé€@ŔŹ%ÁEy­ÉyRe­Őm¸Uřúxvy4A,ü3©‡ ‹ŰÎéĘv2d˙«(Ź#Ú +&ô•ĘS'Ëw§ .c© ŤőÉ#{Ô7ť]j\FËť¨„ĽÁţŞ’őÜ5~FŐ(p3a0cPTŮz]‘Ǧ€Ó’Vžżgý˘$ ÂV—-0Y˘bYőÖŻ!•@H‡nś§Ĺ%$™ř–Máj,É0Í8¦zťôŐ"[L› 6ĺJ‡“9ŤČĐg<ÝČ »ťgŚ] CkĂ$čú ,®»A´}ČÁĹT‘ˬÄN>puE˘Ę´ËZŚxAdY«ş{gŃěůĄVW°ÄFői’~¤N™Ô¸žŘ>v˙Šm)ś“šľ+ź5QUuH^ŕ”Ęl·ńl$ŕÄජięµ&—ěđŔŻé(M~GND·‡ÁyĆ`Lß6;Ă38C+ěÔhÂЧtV˛$ŘÖ5kÔ\BĘ1*ÝŤn'Š„X•iLĄ€[žťÚ•rHĎ';‚éĐćVĆ8=wíhmdžKEÚőśđ4Fˇž_‚ĽĘđoÄźsîŐm "ŘČl‡Ă¦jkéGç#±öţMwx٦[2>Yˇ,IH­IšXYr[’*I˛dKÉ’GľűĚŢr'ÔŰR‡ÓÖëŃú~č(Oš),Ćţ ¬§š˘Í–Ü‚¬¤ż®ňč6’~C‹#Ţ"ü-&ťLzJ3·Ěęh)Mď«…0Ë(ĂáD‰˛ů:K˙ń੏;Q!Kň©ŻĄ‚ŰL–€<ˇ9*©$‰–X˘E’‚é·ŘFâŃ5ęxÓ°(ýü›n#äB+I¤ńP‹ +ˇ 2([Ş„ń@»l,)m\l8MŚ+9?jęş)WlŚÉÝZÓ­ĂÍřT+˛ě˘Ús¦XâsH–'CSč 7&uC=IÚ0ěŤĹ.ăČ’‰Č¤îŔC›´Ş.± ŠPĹ­$1Q‰„z͹ܶMU& ŤÎ%·¬CnĽ¨¬,Ç8E‹ĂئňĘN­ľIąAq›ŞĂß@ÔZT‘=/đúŇÉ5Y qČ'‚ŕ7DéQCťťMˇâňółB§.|S*ĺć˛˙®>ţK°%cťJşbÍOüĘ{’Eťś1:Ř(¬’´ţv«Í$&÷Ľh˛2WĽ·WŐĂĐ&YÎ;©Ż=)şE’I™Fi¦‰dK$y$3µy7¨?Cc0ÍŹ›Ť;şF řŕD‰C¡†­î3ü$<´*Ţ’Ęř_ç€..®ťúů®é¶šŐP›m–k]™TĆąN‚H+».Š%/O‹JkŘÔšŞĹŃ"úXĎ2îMŘŸ4;Ű).͢+ť pł‹ü*Ô‘ˇBs´H©>IĎNwr°6„ĺüŕ/ůÄPޢż¶z¤‚#ÄHŃBUµ,ÂŰ#ŠĎ¦Hô™SÁ<7Ś|¦†ßĄÚv®őë˙3-ů–Žट‹Hú驯Ţúë±Ď^űíąďŢűďÁźűm‘%Ż™dÜ!IH˘ŤkÚhŁ*‹$IÂtź(Tđó(={v$ŃOĹ4‹ Irfă”EdAˇD AAN0‚¤ -¸Ŕ6Pt A ˘ ‚d ?hÂz°DB Yč@Şô S Á^°‚0Ô!řĂ>° űČPwľÓ‘•íŹ@$HP[ĽoŠŤ üÚ8´AżłxŞ•oéďT *]‰„v;Q±S˙păáG9ΑŽu´ăńG=}ôŁő&Í٢9 I·˙*Ó¸!¶(d[4qAPŕH’č NĆťY <Ďqc¦Ő‘Ëý…t I$ŇđŹ@î#ţ؇?ô!K}äŇ/ÚŔĺ?lé—\úCŔ ¤_dů{$ÓĚtć.‹ÉK`2SšŇ´‡D’Ů;kđŇ3˙đH3ő±ŹZ$!—Ű ¤6ôaË_V3›íl¦:‡ůNjsšěT'=ÓyË[ňRťű¬'0÷ˇŤ}ŔeßáH_˛—°!+ŃF^č6” *‘d`P·M*śëÍX¸q_Íĺ?tšťő–}¨7kˇTm¤a$ U#Q”ő˙ât‘(5@  •ąIőď?śúŢ»ÚÓĽJ媬ĎfŢ2ÂU-¬„-La źwŻĘ,JłR6“śü$ (X OÄ“ç6‚%*ÉbN|&ÓYÄľhg(ÚĘ  °ź5âp]7ń´CVd$ý«Č6¤ˇ'›Ľ. *ëă6|T’ ±Să—M÷=ŞH0jc‰»Źmî#ŠŤD1É,‰ę:uá$.\őiŽvµ…?l‘Ó‡¦ ¶ĐÇ#)ÜÖé¦VM°†Q3 ˱ndńv“*I}! fÝŞ^!¬aĂşS°~­0`9 áňö°č|ÝTěÖ:Dúä(˛FOF3ÄN ˙Î[‰;ÖÎ&÷˘µ†i‹JÉ&€’Ŷ¬d+*ŃcW”Ů۰âG#C‘6RwŽp±[·‘S`ľ–HXrŁHaŚ7— n¦n;™L3_cÂLÝđ?Q‰Äď}¦.Ľ‹)Ňď e‡ö¦$Babăjjĺ. Ĺ Áñb‡""¤FHIŤ˘†@Jăp€ÇpĆh ™g'ŚĹ”Ć µpFZ±@~’&ń%(•’(g…)—ň)‰’1,)¶ĺ%Ä#*ç)Źrlň§$$ mŇiĽĹO(ÂkF_N'xŇ1+ĄO¤‚3`¤'‘%iî%m>Q"˙wB$đ±1(ă1ň/ %k.03ij"B¤ä%®†6 Ę@ä&{PF|Š•ŘĆ_†ŤEO|Ĺ5„NTc”4p4ŢŃ9g'.c¦ŕŃNJi+Ş8L`Psyćc*GFä?ör¦@…,Qäęq( hY>4ĺ"DJ-R#™Ó“‡tDE/w2RBĹFú52!lÓwj“n§Ő6F#n#dR)č…;°#Úz…?G8ÚÓyX…1NsO¶¤-ľ$MD1d Fjf'bŠsD˘ăLÓ4Är5qĹ'ĄEŚŠ.‹Ů󴆕8ĄGZŁE\…LH†jÔhňN„ «p(Ç;˙'GTň$?ĂÄxfd(„UlyHTYâDňâ+Ď#čň?¤RiŚăab¤v*Łe˘ĹEÇ„8©ć!˙v^Er&=ijv€†<˘ĄGd˘%:Ě,ŽDQ+ČBD”ő7†%1ĆDł5[ˇÂyč/eöń")Ňýń(˘%Ł­8’+â8Ü12¬U™"Nî$Džä&I < …7xCCÄYçg/2 §`Żä]±ä ÖKî¤Ygc"°f<ňF1)Ź#«"o’6F4AĹőM ¶$^˘&˘U!’ó"¸'2ĄGeĹ'eµ‡e[öz`6fi¶fm–n6guÖ{îâKé@&hGS6†ndŁńdăw¶h—–h7§iˇ6jĄ–,§¶j“ÖjˇV*ŞVk±¶k˝ökѧ‘ŔTÉŚüĹ.©)SŤZµdŃ6.äm›…0i§n˙ĺnń6mę–nĎ6oĄ†o÷6pwp9'e¨s ôDɇkT —R˙B4 ˇhŇ)-·rˇ2s1őrťŁ:%÷R57t9Wtź2 ďćo•őbŞ çŁY]—W÷r %: F9^×LNr·XxR””v7xa÷N¬ô\‰—,ޤA•x×2^É´J(Ł—”¸;„Ww˝”y™W}ęďDđ±3esYö’E…SZŢBňîA‹DS´SÍ·GććWÓ×{OmMöCVŻeyŢńp÷ZPĹ1rqë Ńp€Ę€*¸·8ýđˇôB%:/ł Ę‚sŞ‚5x%2«}:X˝˙6„9¸‚áę2jôP4m6^ęRM¶Bx ËTMÜvĄ·x!”…uxLü2pű“?yT-ňĆQVE•EV1‚}Š˘š±`q›XŰLwŹĄŁx÷J +ÜtKEEU~ň[Ôr 2E ‡}Íx,9—qŐXkŰŤGEĺŘMĚhFë†KÇDkxv{WŔ#~LŚ_t‘r_í(z†ét¸GmÔ<đsl$¬÷Yős*żł-˘ăcĐłZýu&Ďô…_ř‡[>mřqŽ—‡‰# áć<$AĚř@…ëÇ"äç“9ĺM{׆ĄÇ“E®Pö#WYr~•|9ÄFĆ!G~˙Ůó+ ŐýÄ}_“rţÇ‹O-~K3TšŮSő7}TŹcNIj<©ŕx†A7é”ÔÂŹmâÇŠxŠ µ6×[Úgs)b‹aB …Y÷s”™x‡Źs”Jő¶oĂŮźÝÖ(ôSťŐY3貓!Z”P·,’9<±Y Ë©¦ě’@ ˘H¤›č)CëG!tĘ%ĎčőęË :iŁą(ž‘Ŕ x Ş!\Ça®čW|ö~˙ă+WlܸqőCY”öS·UŮ™#÷Gt—tY'#fŤ GÂłţS(8rzĽŁ‰¦ ˛€Řă`"š€ţÔ7’¨ł¤'č"˘}˙Ś ¶t.ćÖ±š}ŮQîaŕ %9ËÔWT§O+ÓnU{]i>YřK’WswłuŹYDŹ+;iřq‰ó*2˘ HĺÍľvŠÇܶ/SkĘ×~ĚIuËŰŇ \Φj"*Ę âg‹7©žg'Bţ«+>’@§đ|ź#›guI~[gn$Dă¸Nߢ$Ąůąë7#˘Ů?J“ƨ«›A-ugMU)Š:k%6 ,ÁÉÜ “HŔŠDK’$ü"F®GŔr‘z¦˛©~ ŞŇ8:čx !Łu*,‹?NpJv“wŰXŤ—Oő%n“#9´5ŹMŮ #:† đ±ŐyLp˛˙-› 9ŻW·*Ľ‹¬ˇ‘Ľ#!"ᥦşčÄ?őQł}B" šuq ‹¶Â#G>’/baŠ`í>üőşÄpőBCô·™‡Ö±rIeŔYç¨ YŞ™Üer+wŞ«‘Pu5|3µĆ][sW°;Üxq8—I9^Ł“phŠäđŇCۦ#b!ćÜ5CĹ(^ä›±’ĆZ­|â#ŹšU¨Ůž7Őy.şW»»~Q4ĘłűW…ű›‘»×­ĺ}Ż›) U.6Őş˙…[¨w µ"µAĚŠ¶"A¤Ýšý¶$!¬ť‘ś}ÚÍ*˛}Ű#AܡmĄžÝ¬ž="ÁĚ =Î]¤¬ÚőŤ‹ŔÝĚÉ´]ŰÇ}ßÍŠç (cőyFÇÖ_nĽd&»LÎşOźÄWhuÓ&XĎtÁ‹W”á–]}ĂŃTN(uN(0~ëăż ąB~ÉšäAŢăż­äQŢä§Ěă_\ä‘Ë}RćżMća^忍ŢDľć[Ţ}h^aXťN‘Gɱ\r¸™Ö­{ŚY…¸ç84ńC©Ý„Hů7íą©+wâżôs0K¸ľ ·ŢŃ ňSŮ 3˛l»NŚĄ*ay­&M´WÂ˙]ý'TM+ŮO9…; Óq†·LA“ç نçÂ'ý±‘x€„˛>F–Cýc'‰X-UĂ7¶|W t'ěńt‚QđrޙĀÎć1”e3'›a=Ş›[×5,Č7ő•9É«ůmb?TŽqăDpúŐW&i &NBĺwă%l´SMx†syyV˘Ą<%rWł”©‚áéSŃ©CťK4‡Ĺq¨µdCYˇWâľ±é3đ'ZŇ9eeňýD†í(dî››¨‡˝/űĄNdD5ľŇB´Ö:l ŕ"’$IŤ$ ,xĐ A‘ \0RCRth#ĹŚ;DXqbD’˙4šTŘČcHŚ$OŽDHf#9U:B‰s¤Ă!-úTů3(ĐŤD…Ň,zQˇRH9 jPNNI˛öi۶íjV¬’ţmĹŞě×°ZÉbýŠÖ¬Ř±gĂ®=›¶í۵eéĘ­‹÷m]¶[÷ńÝş7®^¸W–;8±[µ|ő!V›W0_Ćacau×–­Z¶dqÖ\K’5Đš7›.ý™ógŇ©5Ç:˝úłgҰkÇ6ÝšöíÜĽQ—>M[wíáą}ßĆ-Ľ÷jŰ®››~˝YVtÎłm˝V®»:tŢŇUÓ†Ľ5wÓłˇż¶4:şpéŇ;»Ź´íµtůî=łŻßąÖýýšůł§ŽźřŃçź~, €Z—`Ţ·ŕ"!~żÝç^†íµ7!ö‡ŕ„†Ča‰ ~¸_@;fox1.6-1.6.57/doc/screenshots/adie_font.gif000066400000000000000000000503431326741342000203660ustar00rootroot00000000000000GIF89a,Č÷UŞ˙$$U$Ş$˙IIUIŞI˙mmUmŞm˙’’U’Ş’˙¶¶U¶Ş¶˙ŰŰUŰŞŰ˙˙˙U˙Ş˙˙$$U$Ş$˙$$$$U$$Ş$$˙$I$IU$IŞ$I˙$m$mU$mŞ$m˙$’$’U$’Ş$’˙$¶$¶U$¶Ş$¶˙$Ű$ŰU$ŰŞ$Ű˙$˙$˙U$˙Ş$˙˙IIUIŞI˙I$I$UI$ŞI$˙IIIIUIIŞII˙ImImUImŞIm˙I’I’UI’ŞI’˙I¶I¶UI¶ŞI¶˙IŰIŰUIŰŞIŰ˙I˙I˙UI˙ŞI˙˙mmUmŞm˙m$m$Um$Şm$˙mImIUmIŞmI˙mmmmUmmŞmm˙m’m’Um’Şm’˙m¶m¶Um¶Şm¶˙mŰmŰUmŰŞmŰ˙m˙m˙Um˙Şm˙˙’’U’Ş’˙’$’$U’$Ş’$˙’I’IU’IŞ’I˙’m’mU’mŞ’m˙’’’’U’’Ş’’˙’¶’¶U’¶Ş’¶˙’Ű’ŰU’ŰŞ’Ű˙’˙’˙U’˙Ş’˙˙¶¶U¶Ş¶˙¶$¶$U¶$޶$˙¶I¶IU¶I޶I˙¶m¶mU¶m޶m˙¶’¶’U¶’޶’˙¶¶¶¶U¶¶Ş¶¶˙¶Ű¶ŰU¶Ű޶Ű˙¶˙¶˙U¶˙޶˙˙ŰŰUŰŞŰ˙Ű$Ű$UŰ$ŞŰ$˙ŰIŰIUŰIŞŰI˙ŰmŰmUŰmŞŰm˙Ű’Ű’UŰ’ŞŰ’˙۶۶U۶ŞŰ¶˙ŰŰŰŰUŰŰŞŰŰ˙Ű˙Ű˙UŰ˙ŞŰ˙˙˙˙U˙Ş˙˙˙$˙$U˙$Ş˙$˙˙I˙IU˙IŞ˙I˙˙m˙mU˙mŞ˙m˙˙’˙’U˙’Ş˙’˙˙¶˙¶U˙¶Ş˙¶˙˙Ű˙ŰU˙ŰŞ˙Ű˙˙˙˙˙U˙˙Ş˙˙˙,,Č˙˙íű6° Á"\¨°!Ç#Bś(±"Ĺ‹3bܨ±#ÇŹC‚„řo›¶HRŞ\ɲĄË—0cĘśIł¦M—HÚ€äfKmÚôôI´¨ŃŁH‹’ĐĆ4MҧPŁJ`Ë [¶! :SëÔŻ`ĂľÔfm[±hÓFM"iĄ­6Ű”$ I[’°^•¤ďNnΦdŰ–.^$qŐ*^LT›I§Ś#Kv™ĄJ­l´‘ř¬V­mçĽYgVÍ•“Ppk˛ë׬1 »vZm”­ą Ű ˇh; ś6`ÚZ%%q“„„Öá¶ŁŁuĽ ˛ôëR“lË @¶$nE˙â{¶5nł%¶˙ő­ňęŮHޱ*ÇN*YmŞëë—Lb÷ţ˙ŚÉ&K-˛X"K,ĘR‰,ĆRŕ .Řŕ2(ˇ%Xˇ‚ bHa„fˇ…!~Hℂ⮸á…"VhK,y1h ‡7â%‹-‘ä8ŕ7ÖčcŤBţW,:Ö"ÉŽ‘ě( ’K*ɤ“P¸$ŹT&ye“Gj9e—Qn™e_>é%–`ZYf•R˘ić’tIbŤ.ÖĚY'ťvć‰çžwö©§ź|ţ)h „jč ‡Šč˘¶Ő¨-Ö@©6’餒VŠé¤†BJ'Ą˛U*j¨¤‚jꨧ–ŠęŞŞ¶šę«¬Â˙ęj¬´†z’$ŽćĘiŁ»ęĘ믾Űë°Ŕ+l±Č«¬±Ě˘šç¨źbęhžv>J*©Ł>{-žŮr»mťÝ‚űíĄ j[®·çŠ›.ą’˘Ű®şď˛ë§5fN{é˝™Š‹Żľůîëożó+đżLđÁ§Z­ťézZç¦ Űű«lăN\®Ĺ™N{±ĆË»ëµ˱ȇüńĆ%ŹŚ©,¸Vz Yş\C©6×|úňś27Złl7Ç<óÎÚôś3Í6Ă<4ĐB˙\4ÎJóltÓA?­óŇ>OÍóť×X‹íµW?zÍ·:±-YSşł57“ý3Ż·„şÍ¤Y;éŰnöŁGłí6Ü.;˙JwYwGš7YmSJ7Í}Ď}©Ý„ă=ó¤Kú éäűRžŻĺâb~©ć_ľyćźNąč•‡Ţ9čŁ;,)¨1ój7Îş¬ţ1ťšRniŁ=?,ąŘ˝Zž«ď›NţűćĂ |ďÄ,đÖß<ň“ÓͲŘÚř¶Ů}Ź’‡$iĚĚk´t~Ę«÷0Sľ­¶~o>Ăăgϰťâc˙8řěËW¶¤ńč[ŽĘŇť|ˇŘčäµ<¬Á o´Ó×ůf=kŕos¤ž¨nw* NPdÜÔă4Č+z%! ’h„ęŘeAôq°„äU$"q5k$ˇ ”JÂýŇжˇhĂŽî’Đ•N`’úˇ˙=ćq>$,p”úŹ/4Š,$hę|ÁűÝ׼Ąµó]ěYK´F Ń›é„{w ľĘµĆ fĚŤ4bůĂFX(ĘI‚˙ŇصQŽ~|#ädÁ§&A‡đqŠ5VóBH(i°F$€†4Ł…Ż’¸kZĚ.9ł—ev ŚZ&­¶I¦Ť2j T ŃI€Ŕ¸ŃL |ă$hŁžĽ·hv©ŻĄk—AŚŰ%±F©GÂp.ľA‚#€˛JĐ ~_;eÚg ơ­“k3ÜŁçIT>Ş D¨‹$jNDâ*“Ä5ą‰ÍąmłX‘b§\؆kř(T!Ŕ"_(˙ś\ĹžÓÜ˝¦;8L_dBďd 8ËNsd‘Ă$°R(·čŘ. =k%p^Úüâó7śGöEhhf™— Rk [ŁBcÚ1„ţJ‡:)|$ ¸ˇ—ÂL%F2›"nfKú]P´Q—6Á™áŠSoYm,‘|č#_GË7żúą/~đK_W»żŻ˘‹.” öšj& đ±…NݞăÉ f’Úhę7ÁGň.¬t -‹P‹ÂÇ{aEě˝UVj«±ucĺ _(En [ k»Ôôů‹§ĎŞáfĘB–·Ý'TٵÁhP"¦nµ>|­é~HD:˙‡†ĽúÚf®BłÓÚ ‹í#jÝŚ‡ÖŹeŞM-Ýô§Ţ&ĎsŐĄ¶úŞŔézöS9Ł! )Ć;95¬źĂ*qĄ8KM smăQPVÍďÉĚNő5QI§řşŽaÝ´ĆFĹgZS.¬Ö$šŰÔWMNM‹vŤéę+ÝĎ% ž.=_Űčô6ě–E€’LUŘâ&JÂ=ěż´ËlŐfÍÖaM|ÖđeMßvMă…m¦ÜÎ(ěR˛ÍÉFˇŠ„t‰Í4b{ŤC$‰88"GŢq#‚Ld"ďŘq`ňŤĚc'ąÇ!”•wÜ$GËR†ň‘»¬ä(ó%„T†˛•»ĚdľxY˙o[ˇ}Ść#óÇgNđŹ“ŚçÍ ŮÇföńfŚĽ=ky…?53Y$ĺ(ďÇINp—#č!»Ë‚ö2‘}¬ć3łąĚ’a›ă)‰ąÇXŽr¨Kę2YÍ‘8ô¤ĄĽc9,l<ĺ*ÁŤ„—m(Axá5–” q2ČI:ВͲ5[Ů:Zö„jÄ%iG4˘’´ŁíˇQ,4»~„z˘ŃčFVň’žť ) ÝbR°ť#Ŕ5;z6ŽŚĄ|·ŰÚ>ęѲɍ!Íŕ6Ę‹ŚĚ´Ü]_‰eN wľŽn»Fj“,"Ń_]ČVHř‡@ţáŹ}řCä$˙Oů?ô!r“Ż\ĺ,?ąČOÎr•‹<ć3'ů>r.s—Ëüä;?ąĚ_ţsťóĽĺBĎyĐSł>č)/yϡžô›«ÜçDwąŐľó¨w}ĺLq -¶žňĄ/}ę)ÇąŃg®u©#˝ěiWzÜÁ©$ŘçBďzÉ˝žw˛}äI×ĺčb6[Ř]{—şMľŹ»Ľćú`ĽÎK®Ź.żĽ{hĐFĐĎř“ŁA;wĽÔCtĘżüĺ‘ĎzÉ;ŹzŇ „ňű ţ^úÉď±<ęWţxÖłü÷VwüË;/yÄWř{Ľ@DoňîŐŢôW˝Ë%?zšÓ>ńÄß;Ëc)4ü†˛8ą˙˙ÚĐxŰ[?ű§Ź|é{żň ˆ.}"Â?î h# •ˇ=ýÓ kĐĐ"”?äwrDđ}¤Dđ$7d ŤđhP}$ Ţ7z×W{Ń·{ҧ{Ô7}n÷–ŇGÖcúđ˛ŔJú G‘`CÖ çuŔ·}Ő·{{Çxú { ŘÚP: }¤I•Ń€¸{18|/„čvż·\Ú@˙` &W€H{ćg…Ń·~ÖGt‚. ˛'v7I@rpĹ47ű@ihEH` eEU¸W±q%@۰/„+J„K$ L•[ÇF|„~ľ764řă$p «˙”đq ͱ “BlŔ=ׇ„›…Ę·}4hr&a n` D‰JDHn`EI k<Ő¶¤|(Ż·{Ę—‹}ţŕ(¶Ť~˙Rwa}¶xŔÇzŮw| Zx… €˙ŕât+§†ÂA<ÔŤ¨Ť†g řHŽ OX'mq{W±*% LŔ‰G~đ(z·¨ŚŘ§{,w}TÖ°ĄDaDŽKŚ›Wm`t¶|LX„ĘÇ‹+§˛?w±Ź’RĹT¤V¬ä}Ěç iŹ9|ŽŇ=Ý8Ťp8v‚HŹXë×…’Ts#ŔaŠřS˛˙ŕE‚űĐC/DRúCCˇ§k]ćLU©Îqřى¸hŚ„8ĹŠ ™Ś4{oa MpŰ`K?B•ácl!BMŇ€ ySé‰9rŽ!v}´ÉĄ nhAÉE  ńX‹óHG¸ŚXrľx{Łu?XŐwn§‹.w5C#bw(7t‘ůuU‡r–évU8rz÷r!t™¬¤zîuI¸¶çu2{rgs–yul§}{ą„†y–Y‘Ő3v6ŚKŃš0guhWČ’Ŕ'š¤É}†wt€‡Ś„Ź|é‚ęx)„w)!÷{Č‹i)uĆ7z‘Â…Ľ§sÖ€ťŃ(#˙I|yš} •°)Ť§-¨~&—žkąĹśĹYŹY8ŠÉGť%×(~y„ I‹˙™„!iŁç(ާžz‹Ăyž›×ś7ŘŚHB8±° 7XˇÚ zˇЎ{šˇšˇ7čˇ{ގyş öP˘,:˘-Š˘zˇ"*Ł:ŁŞˇ¦ĺ‡-jŁ ŁLqŁ@š˘5Ł.Z¤)ş˘"AŠ˘$jˇAzŁ!:¤>Ú¤"ZĄRZ¤ÂC˘MęŁ@:ŁTJ¤Bš)ÓS)=Ö?u¦÷f¦júS7ԎЦi §Aqooš¦h*§tÚ¦:§uę¦xę§v§Ę¦jzCwš§*T¨‚Ц‡˙ę§}ú¨†Ę§pJ¨“¨€Š?oc Š}š§uJ¨Ťş¨‚z©›j©Ą)|‘§žÚ¦ť Ş’jŞŽÚ¦îÇTýg'Č„jd¦«?¶g„ĆdZ¬mĆj;Će–e˝*¬Ąáf¬¶¬Íęiă›ĘĂ\Í­|#\łÉvşp—¶âŚhÇÂPÁK)µü\ÔO©+?Ä“5±p·”"…Tśąo,˛-łO»¸ő¸bOö[ĎcU¦â‡ý±PbnÜ ş%T\j9Bdok[,ö8׹oK¸TĽ±:¬˝"<´;ÂÇ\˙üÂ×P »Ç‚{Ĺ1Ëľ =˛4mŽäŐ(ş†m§nŇżĽÄ+'ŰpĹ5űÂ.˝'$Şl˝ÍĆľŔŚÁsű°ďćŐ…eřLJ˛··ŰÔćVÍ,p¬pűÇÝk4Ňř‡t=‘ÚđS>’oĄµĐ<쿝ͽֲľý»Î3ŇMđA“Ő=1äk{í#U-nňŐlĽ¬dŚíń,ÂdaE2˘Ęí$űoµ ˝o PX­qŞť";ŇŇ»Ô kĽ}Ô›#Ť˘`ě@â‹ 4rČ|›ľ KĚhŰW˘pŘĚÍĽµÚÜ9ë@ř¶ ď¦Ú\mlŇťą+ ˛„K´ł Ä×˙ )Qę]HĎ(rą}Ű>¬%•Ű2ÔôB±·€űĐxßyÔi|ęű@ˇ&§y°·ްߑ§yěmrÚ‹Ť§őÍxLŠ—0ş ±7ßxɡ8ŕëŮßΡĂ s=b·},Çßő áú@ťLZâ ÚxÍŤŕ˘hßümá‘çÜLa3~a{Ë{nß nßóy9züMŕNˇ ä.â:â:ŕ'*Ţmyśî߮ߚ—ă9îÜŰ`zR®´ŹS»H ¤’s—x·řwÖwI—ć]g‹ YvU§ćsuVwz•IsĄ6´Gčy÷ŕĎ}›‚˙Řçpn}EGć5÷ćZ÷ź€7Jău7w8‡u—ćĚi,6)đ,)„W)ň§‹O¸q–~} 5á.äBĽ7,·ŹxŮ ĺ}śç Ý©~Fh±Ţ•ip×ř§Á-(}°ąz¸ëĺçxĚľ|Ęžě:ă(L1nP Ş ˇGžę‰ ÄâJ¸‹Ĺw|M~ˇf Ţ 2ô{TÚ>|ÜŹî .^Ţ(đ‡3(€’=”:DH°Ź ĆCpEr9ě@řBQ ipovYŽ đšÂÉv `{ţˇú5{Gx.HśS ’ľ©č® +Jă2ŁCćgš{Wž Ęč ˙zí?ŕ#JZ]hw7”-ŘPűht,)›ľ÷7tbK6ćlÜbwLNcHˇ†üWYHĐT-ĽÎqNľ!F{ +¨Źľ‘{ííněłŮś ™uL1î,ćtŃ·„SI› o•đŘî˛áä+ŠJH•Ižóyćt/|MXZ9»\ßWţ°Źwřz‚Š.9ЦĎź"Ď{<ľAF˙0ˇTńJ˛PڍGo…‰_|X‘ Źą‹˙ ŤQ(  j¸ ť¸÷Rą…Ůź2Î}zżô–đ9š#ßź.íď•|2Ż…Ďüđy©L˘Óî(!gE)u#ÎT#)źAOsR˙K9µ ť~87Px{ť`˝Ë?Aa•—÷vő‹SőWOKµ>ů›ńc -yćsš°ů‰ˇMŕ5ű´YÓÖĆÚ>űţéű×Đß?† )J´X±áĂ!bě(‘#G‰­mÓgMßÁmmlŤ„ČńŁF‡ cB„X‘$͉8eÂ|hPĘmmYKňĎZ›F˙isŁ0äĹ‹«öśşˇ­I겦K–$k\‘Žü±cZ‡h'¦ĺhŤ€EŠjÓęۆ¤mDm2Š´8ăF"s®i'Jműj»¶ôĺΉ©¶,&ĺÄ?u.X´čA—jM’¤GQ¤Ö§ÓßÇ›ľ˘äŚŃgÎĆ€Wľ*ý4l¬>ĎZP -©>}‹ÇŞüźß×6TżRAÉä-ŹGm#Ô~Â̵ěü[)=†ł Ăđľ÷\ÓJ["Cb›­´‘$łlIĘĽń2»ę2čJ±‹?Ş‹]› µžQ_tăPÜ…: (Ší“›$ÚĐ™m…€Ń”hđB&YȢ9tłKZxCI¶%&¸[ËÄŕBIRň’1Vp` îëZaB2µnËPf4dFZx"í4ćY ęŹ(‹6®&É—â2ÚCB<­+>jÎ>(ˇđ)=lăÜŞ§— `˙„…DWpfÂA<­Đ•¤LމŔ©¶˘”uą, ŃÎH©XáÎ>ˇÝ-%łKqfGŽj'ě0CĚ]cSÖ°ˇ¨xw6Q!Ɩ۰JŠCśĺ4G…h$—•Éšrđ4ü§ zW'š$(=ÔĹźzWQ|˛n<Ů,C´á.+)Ž5)­SĘnzj8UŇ–´$ŁS31\†T% n%DČ*ä§FZ˘ąčuš 4´żhČ {|ŰK—*Ę”ZJJä2‚fĂź'2ɤ=#îjşÁC6Ó_}ěÔj˛µÔ3žĆ–8=CVśxÉ„{ľĂ“#’bY&·zÓLŚd!˙*˘šŐ˘(Eću‰‰¦\Ů©Ů$5I+ąGz*4-µph–"(DźŠ‘»Ú˛9ŠEńôˇ+b9%bJ5ToĐ3Ľ@łCs{U,ŠĐµĂˇbE †K„íe/ ±H dA¦€pţKB#îĄ2$@lWiúÜNß#ŃRMt˘e‰IŕQş:Őj˝|'of-"ÍłfR]µĆŁZ ó1=^n{Ť±•MD đKfj-Ö¶kOĹ9JC/¤ŤÄµˇŤČŰ?Úp9äĺŮśÄBŘÄa÷˛ŮČ69I‚ą˙ 6Ô Ő5j‹§G ĘJR:‚°çghUW~óů ňę„OĺÄ˙%ayÇąw–ü]Ńl®ŠK?úăkÇ+ŚIöł: &;ăŰÄB¶˝ĘcLáŢáąáîÍkĂ$“XCŕě#EČź#P,oŽWâ€6@°ŤÍjqÁ‚ZQŐµ'–¸äľxä* ßíč1¨¬E“íHQߵɞ…VŕAá•–®ŽlvţÚ×Ú›Lí0f4üa(ő ÜW…ÄAúhB¤čĂö9ÂÎŽtseц˘ŚĄL “„ťí\&m<ń#r[˝ş8m¤\29(KĄŐJ®Ň45]U­ ˇóŃÓ¤4¤“¨jˇ´©d ?ć<Č?C$XI<…Cúh% 94( $´ŔsÜW˙d!Íâµ.”t ]HBŘNFr’›dQ_Ę;s%«Yń‘¨[3u ö(XtÉŚ¨§ěD˘S2„ Ě«łÁůŁ{ލu[l‘böD”+Á….5ůöĘ ¸"oQą8DmŽ6J`'Čj>ĚÔf5Űą‘mú\ťí&ĄeŇ.WoŰ©×Ţť„L _«ŔSŹŚ‹čö.u‚'Ő’Pö­˛8Hĺá˘=ĄD>áÔF\™ˇYâő^°vqÉ4n,É1ŽYÔć×Đ ˛´z_ŇÍĹ=mLVăgÂh ZăHš–|˝uĆCU&Ьş»ú(´™"¦[PhĄ×в\ă9ˇ]g]ÍČ*=ľŃú9G"Žç€?Ĺ´B˙ł’,Ŕňť‰ dÁFsyDMyŁV„¬č¶»˝Dű ÔAĂ’¤1ý‹ąQ:-Čd7ÓI”˝ (P >’ Łş»Ľ#¸k°!ÍŽň?ÚůĘąň»Ď: u¤ĎąS ůIłh!Ëązň»«›K¸Ť»ÓM9€®Ň©Ďl“t%‹¸‘ą¸ŠOĄé‰ö¬±¬ł EFŔM şˇóĆž&hčh •qUŔČŽÁ‘)ťŇ&0ú,ě0>xŠ}‹,TI Ę–0ępInŰą´rEŔĽ6Î *{čëdĽ4ş} ”¬#·D y“—Ő?l†Ř•±±–ܦ˙ŇŻłFžDś;Ü©,|.ęŇAtžŚq$p^ÉžFذéŠĆ Ćü1™éJI@ Ë•)˘; ’…Z`)˛NöZĚ2ŇNŘů 9FŞ[p"j6N$ŇešL'@ÚŠ‹´Č µčš´Ŕ—U$.ËĎ-B ФȫłĹ¤ŔĹF$5C3^±C:Ü‘ÖđC‰ů‰‰śÉI‹â©C™Ŕ43$„4k7¶4KG[ !($ő=Éd*‘ÓĄµťşbWh@NEÇť+Ę Ďí,#{Hb-‹öCE6hź†@k@(\*˙IÁ6Y(Ř$(ˇBßZ›WI™Fő 9Ś“";„ABQ°9ł®‡®ŚÖŘÚúQ"řđQ±H°Ř8hĽńŃŐ?)ĽÜ8 x]Ż ý4XĘĽ8±ÔĽ’fcűBËą„2Ф–é±$°‰¸˛±I‰Í‘…h ëşÁ+!k8±12Ö3ˇ0Ą˘‘VI@DĄÚ·˛Ç°Ů”Ź(°±DZ AHľý‡±8\h芅ö9Ľ "cQ¦´%ÚŁF#Ô¬¦“M›ś´é8MđÓXk¸…HŃ~ť6”»!Í8$Ô ¶y -ČĆčź ›H0ÉçÔ%č™˙ ᔯŘX2s»¸¤·°‹˝`:ă͉4hЇłJ®{‹Î°W÷™ŻZ+Ý[ ‹ÔŢ6…¦!Ă®ŞÔ5ąë3ڵ±ČĄZĺŘ­2´ÖŤÎ™˛0ů'"ކłÄĚ[â0[UJYk»Ë1#0šŽ}ŐĐ(+ŕÉš,¤ż·‹Műś,Ůŕ‰ö\ŕĚVOç‰ŃÍ?©ŕđŰŕ†0`%đk'Îŕ Î öŕ©u„ ę¨ ¶˝ Vá¦ŕÎaÖPĆŠŽ{¤îŁ1ánáâĂaípź!ŽKC‚ŁNFŁâä *Fë™+ÖâLˇbŃPxňGÄĂbÄăb1&˙˘š; 2ă6 .VÓ6Öb6¸:“#›ă2ŽăćeVćffćgNfh‚&h¦fg¶ćj6 U!ŕ‹]ło‹pçqçr&çsÖ…kç0™›kvg®¸kž›Y˝©UeĂgßm˝T&]Q®eQľ&Ž€ćç‚hćg‚>čV¦e|–„^h˙–č~6Žĺ{ć_PÎçh…ÖçŁđhŽ6h‡6•Gúh‘¦h”e` u¶GďłhUÉćŰĐ暦é›.oŢťnižÖii¶éťviŕŐXźľinžfvV•xîi >j ćŹt&j¨ći›–é¤>ć¦V•ˇ¦j§®ę·©é¨k¤ľj0ajvFkł°»;Ď¶Ţ )éŠŢć \›€~č»h’¶h"ÜhéQč»ĺ”¶hÁ¦ĺČhhŔ¶†Á¶ë~Ţçâé‡Vl‹ě‹îk»ÄNl01ěÄvhÄě˶lĽľěĂľĘ6m0AĐlą&íĚöëľFć{$5d››îćo—–i˙ŕ}S¤Vę¤Ćí™Ţíŕömá~ëu6nmţm˛&îćFîâ†n¶ńćU¦!aŢíavn¶=nŕ~îěîufj}6祎îî6o—ÜŤÎf3‰kĽ^(fhQ6ié±čËhő~ďQľoĺúÎo~ĆďÖŽdßo7đúÖhvfeČ&iŃvđŇ> Çl‡ďęfäř¶o×oŻžá^=€$#zČoÖiă¶g¬>˘™¶„ŕÖŘ/oî†ńážî·6Ě{¶YÓ^‹Ľł†ĺ\ł(ń€ĂęťĆî’ Ü%‹—!afkěŽć(ćłÎ굆ra†°â&rň抡ňťŽç™^›&f˙˘bʲ(ź"řQסĆEH2¶qŐq"3Âr#Ň!VpĽVčČěżîóŐľk˙›üi$ńٰ˛0™FܵX‹W‡,ŞÖ;íBí|ŢBDĄ.‹96±QCÜ}mĘöď ÇçĐ.ő'ďëLżtUßč˝óÚf¤_ĆŤ6ŕ¸ĂÁ űŮÂ)źlT0Ä1T€ą3)ňÓ‡Y†,jěľn#_k¬nv §v‹L‚4püiQč±9C1"(ź Y €6h@ë’jăţm°Řrŕ~¤€:)rWIK¸ś ł:„v1“mďŢîď†ń÷&ć~'jµv÷/ëÉN÷ÇŐM0!¬˙cńÖź˝ËQĐ{·X—A7X(KËI‚Żybme÷FůŔnđüě•7‹Óuç™®Ľ wËq™âiŔÍů“éű6ô… iqć ?쟇1ú Ä’™ď€Ńč“ďó¦_p•ě0±ěÍNh•鶞野&ŘEsűŃĂ‘ĘýŮčTB-™ Ű«Ž'Áh˝—¨đ—rÖmt¦{ą7çgŽ#wY@GHűéţQAKź57řQ›ífçźžń}_j|.ˇ=$w±Ů°¨(™‡é®áľć€[fĎ·ć07ygßn"rŤ5}!źg 'ć˛0Ň-V%çĺŔół |˙8'˘˘Z›#bôZŕ8‹Ś…ţlÉ&Žâgđ@wyă—f<˙IÜíOËńŁpSá·V9LLďkĘ^izNçó-ů8ţE!K‡oV&ôĺ7ΆuţŤöüÖţűmÄm–ČęVfj˘zS¶5ţ4‹Vkmił¦Ť Bş ´ÖĐĂ‚ ”ŃE‚×(޲XăĹŚB„x¤C‹WB¤čpÂŹ'‚¤iÓĚŹS^ŰŮ’ˇŔ‚%/Î4±áÂś5A-JS¦Ă”1§6mXudAťQ·ö<ł¤¶H’N:´eö¬YYgŐ˘mËÖÖŰ´mÝŇEnݵyĺú(qîÜ»€m˙ŐÂkwŻa˝‡+ţě81_Ĺf·îŚÚs ć­”y.¤|mŕçÍQom ń2X¤‡ú(+Đ$iŇ$AÓFöí6it7Ů=[wšŢŔu˙müxqăŔ}//ŽĆ7›Ů̥禽[v¤mKw6’íyđëÉi˙>]9uóÄ‘G˘}ëAöÍÉźŻ®Ü;ďŮIôÍÜČ”Şj7]öźE7hÔS…dk>e•S’ŚŐ˙Xxá?ţX¨a†rŘá†!b"~x˘‡)Žá‡)ň§MV’4"”5×HtM¶¨"‹<ö¸"‰(¦ŚÚ\ăŢvÖ$Ác‹B–aVŰÔÄ{}a¶ieiK˙h\f4Đa,‰iÍ–š•Ů HÚ-4—_XZ#–BבˇAűřc'žwţŁŹžúěů§ź~ćÉç>€ţ‰§ˇ&ş(ˇw:j'ˇ{ľg”$mhwX9ŢiK }î鏠Ź:Şč Ź2ş¨¶ě·“ŞŇ©Íˇ¦*:ë?xVfűP%K’,UQL«‹,µDE“$D0§ÔD6JR$‘ ­´EŮ2Ö•Ń—Fv+}ĄŤ$˛tćę>$$áŹ,YYóŹ,ž’ęh­¦Ć›gˇ´z꩝±Ćš/˘óún$nI#ÚĹ´RŽű°QYúčXMˇôj(­őž*Ŷ .’k2´¤5$¤ˇ+Äś:,k˙†ëŁkŻŤD"ËŞ YC€,H´!K¸;b ÖČh j%qł´× $–‡4n%‰ą˛P‚,‘ŕ†ZŤHríŐmpmŃQ+‰!$ą SsşÜ†$0íHŽsÂ›Żźî¦ jĘs˙‰˛žđb¬·…´6Z«>i€Ő‘BŰ䨤-Hˇu˛Ú°MÜüň­÷ÄV^÷Űš+9řÖI>®5ćD$D‚BŽD’FßuW®áAD ž„Şű•б$QéĐjçF8»© ‚5(l$I,)ë‘HHb3 D\r‘” m€›őß»ŢĆBűJąI‡+Ô5(ü34mčŔ˙?ćęꟆ˘|·ĺůű˝oćX¨Ľ OB!#´Ń7x„LÉQ˛nC‚öYŁ C“ťˇŕ»xůŹsýÔ”Hŕ\=D(IŘn“„É‘ \˘Ó źř·'‡,>ş‚ĎŐľíÔ˘Ý ~¸ ô·9Ü›$(QFd)Xa bÚ‚NKC "Q-ę˘$ŔFNř(ĄůEB)QŇ>č7?úŃŻŕźÜô'±9vĐSÔ%vG;Ué ŃŞŇRѸ[üĂv¶(AzćŻâ‘b(Łă»tE#UŃS˘#Á?´€ bRk±áĽĆDU9Ě"UěŽHĐ8‚uE˙PÝă^©µÝ  U„I´ćĄ®Š0m±@ ¤'µ±<®m°ŢÖş—„ˇ5˘ źqĎÄ`„“ÄAD,4r¬t«u٢±›ťĘ6±Oâqs1ÜĘf·/šňMmh§BrDąLnă_űŘÇ’µGľĺÉPä ź˘r’$\ŠKť6 e ;Á gř Îh–nE=ËAÔ˘ ¶‹Ł€±FÔNÂţÜMz) L㞼ĺ(úF¸Äâ!ůÄ >Ú@±<âńźŕĚ\á8G<>’¨ôrČ[¬6:íÄ ¶(gĽČ6·~⏪ߴŰOóäQ[á†d!×ŰţaŤ6Ȩ);˙aj¶š î$By«BPr¸źt¦ ýLΔnM“DbgV2:™DB±QV¦Ř•%”¤úXě>ŮČBV±“•ěc+kYĚRö˛žĹěf=« ö4=ËLW_*"­ËRýěe+[؆ֲEÂ2UŘ}ř$mŔ,ĺ´![Đv6ˇ*¬Mš0Ł6Í®A H~’-•‚ (bă+PŢZB‘d’@ W\µ!%Ť—ĽEoy‹$^ő˛w˝ëEo{Ó›Ţřš·˝EŇ~JŢ˙Deľîő/{á`űřĽŤŐďK˝ű’öjSľő-Żk_š_5±„,kúĚs!Ô™…ěAż˛JúÂ˙{Ź=wKÚeJŇWIòF4+ÉŚ•b¬%ÓX42Ś=#•ěÖآšy1·R&×xȧ©Ěj€âa—¤KDv±Šź{,ktXÉ—‘»˙&K»Ś_QĂTné®›QІÇ|m&dc ś—r“Źt¸(ĚZPSĐŚgŐ\…ĘI¦Fň‘¤#b3Väç>×9@đىÇj4ĺ§8ú* ShĚć“(\泣)LuýÄ­– ˘3Ó×č2Dâzń­j\ăÓzÖE†1†3cd$J×'­* â‚më'yŘtť2H®śba#ŮČ™J_D2i>—Ä 6šţ3Ę˙Ż*ů`MÍWą˝b_úFÍŞ¤n9ł[Ýén7ĽorěĄT9ÓŇ–‰-( gCW„߇ţ·‘*ŁĺYéŢŞQ¶Z…š$q3‘~®JĽÂ»ŞĆ4:Ń „*ęĄ1ćϬ^łÇÔ—\çšŕcZ©ĚP®ňXgF3·r2f•*s)®*­yJžm—źśĺ\Q i{l˛lIĚ<źqĚů+Đtc8Ő&ńóK‚Ím+™śĎÂnş‚ň=•l}‰LDgźDdA6BĂÔd'żő\vK3FßţN5Ůąô‘ÖxĚ%vŹÚ˝˝š,ďťßi˘ćµY=÷SeďđĆ8µe× Ë É’´d™Rű˙ůἮQQ@3xÇŰPN‘srž[ÉËŮŽőŤĂ-¶oOľĺŘf‰Îźl3ž,Jě…ť­3şçš6ĺ{WŇ=YÚnhŠ­UQ?[Ľ1żĘ™A:R©6XbâLéÉ;­ď%ł»@ďľű~oŃşŹ:»HaęÚAÜď}?ýęÇ}jPM]D:ÎçŽÉ€HĂÖÔ–˙Č€ĹČ€$›Jé”ÚÁL«µUMäÚHđX¬±Ř@ Ť,‘„´AŚU]`8UŽ8B7ŮÂÎĽW|Ő‰`ł1[h@[‘F†ĹhP×Ń…ś“íÜ‘Í}†Ä ťDśÉJtĹÖ HtÔi–˙”}Ţň5Ť}Iľ-ŕŹ9a›äÂó\DP2AÎŔĐŘĚö|îŹQ|Ë»µ_ĄM.šá±U¤m\I _ýi_ŰĄýžţâäĄÖˇýʂЄ•tśe"R›¸éĄmF~ A޵ţ%ˇĚŘB,LHJ MOěPAČB”î€Ŕ2ĄWŤ˘0퍵°!Y_´ímX·%™Č˝ JIę]I챆Îm\–,˘V¬‰ ňI!»% !2`=ĚĹšńM—J4˘Ô5„Ë][ šJ ŤC€6ÜTźM# A \ˉP/mźS¤ˇŁĺ!Ľé˙Z’íDúĺ ¬aťí™ą}µˇZi`Ĺű5Ó©TżĄ\¤±žPa°U!‡Y_2™\wńďc˝š×I”Ě(Pdťěą ŐůŕŃíM0ˇŠŰč™Ô©”łUFĐ™_…•.˛ĘÚ$+J›—y¤…ˇ‘( Ź©¤öyLKŠZ :˙ĄŘ€ "0’E´$ź"˛š$z ŤH[Ł}ˇř˛}łČáIáU¦Éҡ])G$ˇQâjčľŮßŢ)äĂ !AFצ!ŰÁ,&jzćqBćqÖ”c^‹r'uF¸¸¦«Ő‚v¶&\T¦k6çs>&ybçwž'q6'cŽ&y^ \°&jž§ZtŤ-TßŇ[|X`4‚~ň§~îçöçú'(€ h€ú§*(‚.¨ňç9č2č„>¨„^¨„2h(‡v¨†b(„&hbh†¨Z(‚R(…Vh‡–č…®(‡n¨‰Îh‹¶źçqI…‰Žî(Źö(¬ 7i#\ŽŚ˙ŠŐ…D……\ ’)“^H~鎏N)•V©•^)–f©–n©–:LT0ŹM±K …h# ±Á´DMŔl@,¬©*Í©5ÂnAšB(ŮL,\ pŐ!iŤ…LČÎ~˘¶śĆA˘ń§Í MŇFmhTČ˙d* ŚĘ§@J§ŇM§ U¨‚*§6J¦ŠĘ¨¦*Ł”*«zjŁ¸ę§ŞŞ©~ę Äę¦şŞ¨xꍄ…&jĂśäF$ iö¸Á? Ť7ÝFŕ(î¤ á¸ľN´¤%q „žăY Î Á¶¶’·˛’éë?ë¸Ö ţÁ4‚,P˛MĄ<˙ŤşĆkŔxÓĹÔëNÝ«Ü •ĹŕëľĘM$=Tż†S$­Ó8íM8ń+Á.Ŕî‘őÉ !•×X”űđ'ۨ#@h±"Ű|#’Ŕ8kD( %P7Ť•-´ÚMŁ&„®ë~ş¬Ś ,™:¨˘«NÍë~Ć»f€®P̲kČvĐžSěQ]NPŮ‘:--VyTÁ‘Pőţ0-DQíA­˘đ Ń"m1­ýK„hâ×€[r»ś„î¨Ĺ-hŚ®”„ QÎnşjşNBčC$¬-Z•EIôm  .Düßî&Î,ćŐ$T$ěĂâ6®85-Ô~m˙đ+DŃ‹].×ň˙”ĺŽSéŃZ˘ĐT‰nU=Ô"M•ľ|®Ńîkç˝D¸ĹDŚéĆPŐzHˇdČĘÜQţhnßp“®dŽřC‘î?Ôá:J»iN9DńîňÚ‰ŽDŻÂn®˝ę‰Y-Ö. $Íˢ-@ÉPĺĘŤŇŽnŔÖ?™J:Ť.OEFiä.̉ńčC Ş©ŇšZ &íFষ ץ’G¤F„âNNuŢĘŹ*ť,€ňçăh+Đ(j# j#¤€,”ău8M#”€µAÄ]¨ďÓ˝j/¨rŻÁF­Ĺś őľđúš“ľXUÖZĚůćŞÓ ě ă #moí XQCě˙¸vÓ>X $č“Őł’•Ďľ,*fĎö"D´NŔŘ ·ěç Ąă“¤ć·Fj딫75ăŽë6ĚëlČkë„č~Ć«ňb®ämҢow­doözď×p÷ö“ ďÔ äţĎ KmÓZŽĘČAD Śëňg40»ÁÍôlwÓ~VĘąĘƱ.΂vđď Ť~N â¸ŚłňěĹęě(˙–Ś(NŲk¸¬;‚Ψ-\­č"mÓvN8E­ ?®Ó>i.T•î ďÔĐć°?í435—.#Nú]tĺĘŃü$0î5D’J‚?ŕ„5|CÔEA°˙ [üCMÝOşč“.nJŕŚÍŠŐőřßPĆ’x“‘39;é9„#tQYCŚóF5tľĄ ooĹđđú2(i* 2 óÔ1Źo®>3Çp5ňG—•ĹŚ›PlĂś\HÜXesÝt‡ÄPL;ňGßîʨďí†Č‡Š?ÝîÄ`HżtHľ/I5TY´QeŻ® 7ŇęF®żĘĐÖî±"Omę^UYůËôB•Ţ$ôÄMýOSěMë® eG3EpN©iăM[ß ©üÍK;Ę“o]wĐŐ2¬÷–®PaPXýk2WsUł/ÓÖpIk´ę˛0Pq­Mł#KĘLá Yäčb«˙“äô“ͤ î0Íŕ"A±(zSřž.1ßtcguVO´^wNÂÚôK*3GóęŢőőr/éľvő0T21Ç6lO®Ö1l–űĽKÂ*ňNɰ© qé€ŕ(ž,„«pG#µn÷«I×ëŢ 6č޵Iź/NaPsow×rud¬ 7ó÷ę±NKu6g•jĂ $÷j\V‡o˝­zP&Ѕޤ=çş U×6 _Ud§/Smn›5aë7`‡®#v!'¸NCřĺşöfďö†?vVmőQďÉ6ű H$7;8që°ĺ‹KĂ8ţPo—4†7íw;wPݸç’Ó{Źď5S˙řO 6†´ok7fCuÂ’·Ť7w«.(@…KgÜ‚eKłl‡¸|;ěo3¬kk´‘7ňYłw†÷xf×řEgµőş7“Ó|s´ “76GuT˰Žwyť˙ř÷nĘIůâ0ĆűýÎ{=ÉKĽłűŚëZC ś9V#Ľé3ňH/5V,Úźľů>~¤=é[ĽlŁůżyĐ—~ę;ümç1ßÜĽ°>‰·ľú޻ϼÚFĚÉo?pďńď[s±9»ë9čŠÍ{6‡÷zăńĆ»9ßÇ>ĺ69}§;¶suŽs>@ěűçoÁ ţ¨ďC‡ úHPź>[Ö¬é’%Éš-mÖ’„XˇÁ‡ !B,‰0˘@“˙F”¸RćB‘4YľdP§B5[äÉSeJ”îśÓ¦LźE‰â¬é4˙jDźIb])ň'Ë“1‹NlęŇkKłSźnĹ™ňŁ.Ś’d}Ľâ*SłľĚ[U*X­Y‹:í{ôjWŞh»tŻá˘_·®Ę´+e°„ËBí8ńRÂJ^LV,еR÷]ô()RĆŽ!i–&=µ¬ŢŞX-Ý»,fĆX‹} ó´ÝŕŔm^ě8rčś™ ‡ŤýŐpoŁVk“µ-»ăçĺn”«ŤńîÚýţ®ö¦pÄęŁăí¬}´]¤‚‡6OÝştŮ”mR*ż˙ű‹żăLKkżóđ“l;úĐ"×ŕşH›[¨ë>ëţj˝őÓí:ÚDK>ŰôĐ·ÍóE˛˙ڰT¬§ÁR|IEýŤD›pc/8 ’ëm"‘D›‹@şK¶ßzŞîIÍŇc«Îě»îJĎJSđş'ucńŔäNDŻ*ëÂĎżůÚsK í09;,1Ě6ɲ(ĽX¬YŇĚ\ Ëç˛â2FŻ+“Ç÷ ňCMdp¶ç$âkMC• “ËžD¤tľH=DSľölĚRĘćđ#jśňí©+#ň/0Aµ“âbi~‘â#Ň3aŽ<˛…çS}ţŃbşÍýŞJ—ßT×č ýž5Čßµ{TŢ57âß+Ë@íěśß»\×ÉÔY’«ĎV}‰Ń“¶ťđI_·˙Ńzˇn|ôyťdν:•cŹo1FnnÁ¶»d OÄ=f˘źw¨rVcń¨aúśýňzăyeżůŰ G¶{‚üpd¸›~ŞdTűŻÝĐiwx*őúf˝ęoAÁ5¶a‹X¸ęHE¸Xë˘U4c±HsĂŰZ°@č5Q«_”˛šĹ®÷/1O?´šLř„ô©Q {ľZVŘpt’óYBÝú y„26Nméŕ°RuĘ^RŤ°Ç!bîn3“a‚Ę%żýJ`4Ô´Öb?…řn[®Âl¦WµĘäE±«ÚŤĆĹ­Ëyá ]Ý2¶·™0;9šÔôŠćDBEJhx|Ž˙ţמD©Ď˛hŤź<˘měC’´ä$+YÉm\’’’ě$&ő±IMzr”ĄĽd(9™ITfň“¤t%+M©JQ~˛“ł4Ą(_ąĘ\â”±¬ĺ.OyËWŇŇ—Ąüe/ŹŮJdÂ2•Ŕd¦0A‰KiZ’—Áś¤ÚXµ0Bđ}şF7˝ůŔ#“śůHźşyNtbä›Úh'FĘ&NuľÓô\g=Őů@w®óśęĚg>ËąÎx†Óśßç=ÍYĎ{ćÓ č§>!Ń„>p M§EŞĐrVtźÝgAjP’łźŐ§A Z6H–›çs‹¶ÎW9HşĆ-5Ą©Ú`ŠSś®4§6˝O—Ä˙SťĘÔĄf{©ź^ęšźŢÔ¦I=ęRťzS˘U©AťjQ— ŐťćT«DjT›ĘTŁŽőŞVŞP˝ÚÓ±‚Őlb\Śä'l&5¦[5Ű-Ú:VĽľ4‚jĂ+WgUŐ(ő¬ť)`mqŤó핬yýkGnÖÖĂv°I˝O‘šW®V•±Ş‰lbcjÖ¬JÖłOŐ¬c +Xk\v°ˇĺj_[{!łí§ŠĄ¬Tű´šÖ$Ő5fsMŮÔ'Wl5·*MlnŃ©ľá2I®ÄŦk|‡Üܶ“ąÁ=no…˰ŚTăěn[’‹Níş…ŚĐőms™ôÜËćöśÖĹgzÝ\sV÷î=’Gľ‰_ô˙z×»Ţﵫ\÷J˝óýH_Ů‹ĺţ7şJÍŻxtú[&-˛f]­‚}ëÖ–*X®f$‡™Ä°ĄúiIŠ%ŁgÍfVŮŞ8ÄĆđ„}§á±şĽďj;ŚÖÖÓĂұŤ# ŮG¸Ç9ž°5Y†‰xĂ+Mń`źě[&/™ÇĐe.tŃf!ÚÖ§ö+x­zâ'ʇ‘÷ĹńvýŞ`ůâµÄNv+qa|dťĘզĵé\m{!#‘w˝ í›Q,b;řÄ$ţ°†KÜb' úĂ®ń  ‹ŕź~łĆgN¬źú|_8łWŃÚÚ0 m«ń\dÇF§;§úbßžuş“Vł§Ikŕ“µ˙˝31‚Ĺš_kĐ6˝­p¨ĂKἒ—ÖČ=ß‹…»Řů^ŘYOl‘ͤmhcÚÓ¦dµ©ŤIl[;ŰÚđö&§ýmj‡Riđö¸Ĺîkg›ŰŰÖ6»1Ůmm´˝’ŕSďlXß”¸Ľ†ŕ‘+MX:÷öĐ>αŔmQ6ŢŞoáśöá’"řÚ.šĐcň±™ÄŘą˘™áf‹řX;\bKצ&~.†É™ŢnŞŔĺś0ŢÉňUŻÜĺ5˙gDvŕ2¦pÇ߼ÓŢľT×®ˇ­oiß8ŁĘ=渗=Íh0]ÇŻçÂcĽeźWúU'řĹVµ‹U«a˙µEśVđ®ťî¸ői°É­ŞZąĺőMđÖşo1‡—¸”îş7ÍÎÎ÷W¸|÷»sýlß÷á:nËCńŠćĂkYÂę řŤ»tš_řŮ Ţ&ç{ÝVY ”[ueAŇŰ®Ú-x×îi;‚6Ě÷f#Ŕ•c‹sµÁ…af6ěgĂ|äÇşö°+Ő·1 Óä‹VłÔOk¬—?líĂŢ×]^ű`—ßüŘzV5}ý~c™źđȉ ’ ´!ţđ— Ň„$´aëÄ;µ­¬ôš@€÷Źţâ öŹÚ d!‚:nź`NÁiçšÍĹ2/ĚĚëâŽĂňkň­×˙˘KÎk˝.é\ Î ďň‚*Ď>ě7.ÇJĂ"Oô˝@Żî¸FPńÖÉ;˘ýV«   ÚŇ€Ţlaţ”˙îŞĺđÎŘŞ,á¬Ň€Ú –„dÁţ’Ŕ   SŹŮ¬!  ®ĚĽ- GżLgB+Ă -ëŚěVż2.¨2măpďâÂÎ-f/é´Š]Śë Ô ŚÉ^®Ś˙ڏ&ęvÍ5H U š @`˙XŁýčo÷M& ;BHŔŔlˇ čo%l$Á«RŚ’Š[Ś IŤĂřM}2OĘH˙ńĂL®u %˛ž±ľ@Ż«‘áB°·đç$qóúĎ%qÓ(±ÓŞě·ěëÔ čŇ+‚8$$! Ň$´a˙¬Á Ú€58"ݬę˙\ şd˙$ÓŔ$a Ëí }‘ !Ů‚'ť&Îëü.±Ö®±Ť'Më:®Ë€Í !ńŃń¶Ş/ÖZ¬ęDkîz+ű2Ď-xmQ¶fë¦ÖJŐę,¸\ŇŞ"a Ó ŔňŞă¬ŃrnđÚę#ĐĽN­ —ÍéćŞĆĂŢFpIެí$lôn*ČÎÎřlÝQĽL©®ô."˛Ü‰ĎÎIă‚+&űkß2K/Ĺ”NË˙jŚşÎń¶+ŕ\LľÎrśPÍąĺČn ăéŇ|îśŔN#ĎęČf* &LçBîʞĘ8°»$Ȣ*Ôj-µ8mÝŃąZĚCŤňŃąDĚIJҿ^í_/Ú|'ŔŚd°lmĐlÓ#–±ě¦OP˙€S˙đ738Ťó8Ťó7I ‚3 Šó8źÓ9Ą93:_‘Ľŕb›ć0Îz˛5q+ĸËŘlÍÔ„ ú¶ëĆôÍOxOÇŽ,cm⪠Ľ`/6ÓÎĚ1§Pťm˛:P׺ĚltÍ×ô´´@ÎG’@Ű*A Ô×€‡ÔĆCɶ ĘxÎ »é‘Ě.‡+&/‘ŘHS'ž˙Î.“ D?3Ę ěĆđŘoĚŽO.łBÓ â|LBŰ‹,9púä®=u´GSí ×nĐęĚB×Ď#á‘rĂZP¬2Ś5™ŚÂ2đI÷’%ŰłBů3ßL7/OÁ‚l´Î1čĆ’˝ňěm«Ę«á*0AÎ×P ĺVm7UŤ>ĺĨÎM«ÎN4 ŹŚřOéžôç¬ěăúeôuđ¦,‘>» żt¬üŤ÷Z,ŞúŞYS®.>Ô.Ar. n'±ń;'1űKęşs-O-$ó0P‰F”HQCÁ,?ő,#dAmÁl!WRWyµW}őWő€uX‰UW…µX‘5Y•uYČ™µYťőYťWˇZʵYˇZyuIľ°‘tu[żp[ő[ą\sŐ[\Íu\ŐU\õ\yU\É•[ĺµ]ĺ5]ăµ^Ý^‹Ő^Ý•^»U]ß`˙U_ v] ¶`ö`óUa¶aVak]Ďu\#¶‘¤5Wk!WÓç[3Ö[+Vbçő^u5cŐucmˇbűŐWŮő ;V‚J6e]6dą5}ä•dOvd9V_e_uöaVeçXIÖfmÖW‹Z[vd•őh•W‡–W;fox1.6-1.6.57/doc/screenshots/adie_sty.gif000066400000000000000000000557641326741342000202530ustar00rootroot00000000000000GIF89a,Č÷UŞ˙$$U$Ş$˙IIUIŞI˙mmUmŞm˙’’U’Ş’˙¶¶U¶Ş¶˙ŰŰUŰŞŰ˙˙˙U˙Ş˙˙$$U$Ş$˙$$$$U$$Ş$$˙$I$IU$IŞ$I˙$m$mU$mŞ$m˙$’$’U$’Ş$’˙$¶$¶U$¶Ş$¶˙$Ű$ŰU$ŰŞ$Ű˙$˙$˙U$˙Ş$˙˙IIUIŞI˙I$I$UI$ŞI$˙IIIIUIIŞII˙ImImUImŞIm˙I’I’UI’ŞI’˙I¶I¶UI¶ŞI¶˙IŰIŰUIŰŞIŰ˙I˙I˙UI˙ŞI˙˙mmUmŞm˙m$m$Um$Şm$˙mImIUmIŞmI˙mmmmUmmŞmm˙m’m’Um’Şm’˙m¶m¶Um¶Şm¶˙mŰmŰUmŰŞmŰ˙m˙m˙Um˙Şm˙˙’’U’Ş’˙’$’$U’$Ş’$˙’I’IU’IŞ’I˙’m’mU’mŞ’m˙’’’’U’’Ş’’˙’¶’¶U’¶Ş’¶˙’Ű’ŰU’ŰŞ’Ű˙’˙’˙U’˙Ş’˙˙¶¶U¶Ş¶˙¶$¶$U¶$޶$˙¶I¶IU¶I޶I˙¶m¶mU¶m޶m˙¶’¶’U¶’޶’˙¶¶¶¶U¶¶Ş¶¶˙¶Ű¶ŰU¶Ű޶Ű˙¶˙¶˙U¶˙޶˙˙ŰŰUŰŞŰ˙Ű$Ű$UŰ$ŞŰ$˙ŰIŰIUŰIŞŰI˙ŰmŰmUŰmŞŰm˙Ű’Ű’UŰ’ŞŰ’˙۶۶U۶ŞŰ¶˙ŰŰŰŰUŰŰŞŰŰ˙Ű˙Ű˙UŰ˙ŞŰ˙˙˙˙U˙Ş˙˙˙$˙$U˙$Ş˙$˙˙I˙IU˙IŞ˙I˙˙m˙mU˙mŞ˙m˙˙’˙’U˙’Ş˙’˙˙¶˙¶U˙¶Ş˙¶˙˙Ű˙ŰU˙ŰŞ˙Ű˙˙˙˙˙U˙˙Ş˙˙˙,,Č˙˙i“  Á*\ȰˇĂ‡#2$‘$aĹ$$&ŮX±!F‰ CŠI˛¤Č6ŰţYëh˛ĄË—'o!$ń€$–iRÜÖ†ˇ¤6a J´¨AÚâ4Ę´iD[mXş‘´ ŔÇ6n­   ÁH%zb%AbA¬“ KĐ& 7AŐ$ńł ÚžNóęUXvź¶Ą{7ËŐIÚŘÚh Ŕ¶ %¶!q#9r$¬‘h*fě®-IeéÝ–$RŐ$ź >ţYVm Á°›–U 8¶í–ˇI,. €÷b”mnÍýš·ÍĎŤ'áië-^łP#÷®ş¸·cIPmJj{»»ËŮ˝‹˙/YëgŢľ9çä:—«WĘŚÔöqűé›­vÎY}ĽHůUŰ&TWAŹ%±u1gt[ŮĹA‹!áŕ¶|Ö ~$ܢMOޤvAh"_)­tâŠ3ĺTVZ‘ŐŰGiuKH”‘Ś$čŘŰkvĹe×\@Z5Ť,&9[$MôH–ŽNF ĺ”OV)Ą•T^©e–\béĺ–_vye)‘ dšY„Žd–PDŹ%Q o˛I§“qžą¦Ž%ˇŁť%äHDŹ9öhćˇĆÉg˘`6*ćŁaFꨤNześIČňO$×XcŤ6×hó©5ŰŚZި ˘Ş©¬Şęj«¤Ž˙šę§«Šzj¬ŻÎj+¬şÖŠëŻşÚbŤ°Ăk‹¨Äę2Ş˛Ă–Ş¬°Ę"ëi´Ă^#,ŞÄ »‹§ÉkÍłĄ Kl®żŢÚ+ŞĺĘZ«Ż·š».şíŞKnĽą˛Ëë§ÚňO#Ďz+®ż˙+pŔlpÁ¬0ÂŃűí¨3űŻ.ťf+j±ĘJ<,¶Ĺjă0´řN ±§ă[ňÂ('¬rĘ,Żěň¢nj­¨ {ló±8߬sÎ<ďěsĎ@˙,tĐD­3·ÖX‹tż=wšńĂ—ětČâŇlěĹ»±5Ű‚ěé6E‡m´ŘdŹmvŮeoĽŻ´Z«őŰnÇí)ÜsËŤôÝtămwŢ|ď˙í÷ƶ€mµ6·\xµŢ"í±Ň˙{j¶žn ¸ÔŃŢ-·%÷]÷ćzs®yç .úߡ [1¨úĆ13Úgűěá·ˇâě,©9_SąÍ\ă+8ě6ż®¬ŕGíá±¶ëîđ¶˘2Ţ6ŐGu·ĚRűŻÍĹC}xć×â,2Ĺ {Ľ;ňÇú»÷ęíÇOóřľÓN>ú竟{ďëß<»ůĹßÜńÚĆĘ’ˇ˙¶ ˙GŔp€”ä —¸Ţí_Ëc ÁĄ™Śg€[^ 77¨i«qw‹ľ˛Ç¶u¬ś Ň$²đ…ta aXÁ¶qlS…óĂŕ%+Zˇ‹\<Ä–˙V3"šĚ¸{Zźgµ"*ŃyOCˇ ‡čDkäP{ĂËc—ÁkU dýRVעFFź]wfLcĎθĂ5ŞńhoĚ…¨˝ŞYcm 欸ÇĂ},iÖ˝bŤ4ÜD`¨–!É-Ô+ ´Vî&‰4ś¬łŕѸ·8q1î_9ô–ł‡IŽ yZ{ť-:µbYNŠ*„Ą kHÁZ®p†¸¤ĺ-­ŞĂéBf8sXÇţ;SZĹôž°H€4˘ źˇOc"ám0ł©‰Ä4Ý I›xŻq ‘nP \Ł Đ´†Ľ"*đ펏só%Éäh?ZŤ„Sfć*˙B0î±_›Ô]ůd'<ę5ě{&_=W;řÍ/pcźŐ€7;ÂT~’«±ţŃćŽil ¤H‘u:‹Yi°â€F´´+V!PÜđR—ö$ 2u„b<€ĆEČ”b"G0“rđ©OuC#>Mcrł›ĆFöEQůŃ„WěˇŰ¦ÚŻ/6Ő–˛¤!XcIÖYŽu– ›gR8•Ď*«}ţÜŘđ&9f G.:íÉc\*‹ŤŔ¦ťéI_“P l¬ŻtY ţ’ŁgR„"ŠABb«Řš…m{ĹÚµ¶–Vý ĚyÝ^­ś÷Ć2’öÔZ"euZŐ˘–µ{íj96L­˙ń‚—\ˇUçĆ˝=Â3·ŃJůŇĆčÔ0~ęÉq‹YˇfhXu‘2ŐňP5ĐŚ.ŔŞx1Óq‹•€ś§ÖzkÁ•ěŠŘŇcîÖv˘ŠJ.ů/U_Ť¬'›äŔ&ńŽG|âQńxČ™rŚcÜă˙ąĆCnrŹ»Ľĺ0ąË9Nń‘w\ć17ůĹqÎóß<ç?OCĎ>ô čG/yÇ%~ŕWî‹Y[3Ř@$ŤdB–ĐEä´Á%“ň·ěřCTŮꇟĘ6ÉĚžö˛f{©Ü.+´Ű=íqoűŰëN2˝ŹŞÎoż{é.xÂľđ?ĽâĎx;wďŽ˙N`ţT)ImHĂÉVla‡MHˇÜ,ď0•&ő>OĚ_¬ÎZĘh­=Öw„áfŮ%A 2…ýŐ¸Ż#Mżű.ö^÷Ľľď…üáżř§ç󰬬 Ytwʶ>J% mřEvĐ‚%NĚ[ĆVz#+&˙»耓VÎ{µŔżOč+›‰µ}^§x9c’˛•PĎ?o÷ő‘…»˙—5¨zöTm°ç~fĺ7n¬d3—65š–~Ç" Î×|¤’mŰ  r˛Ŕ%s{$A•6Rt=ÇäJËł:óP&X-vE9ěERž¤bĢJ\Ä8ŕł‚`u“Ç-z´ąsc4F@Qz$9ëµ^ÁóA‘37FYN…Í…MX…K„HQS^ŮBm¨–-‘  r@I± ! 0†`·J'-ĹĂP÷´i°ł1o¨4QĆ8í3Qů$L©tQ·'^¸~Ż€xDb6w'HL݆—Bí˙×U hB3‰Ź(`ńW‰Ř~—(2Ű"3Ťł>„<ˇ ¦qś· 2` éD‰‘d^ŰC!…YdR%c¨§|˙whąçQţÄ{ĆjČŇ{ţ·‰řŽŚĘ÷{X‰ľ·bF`ĐH5$űĂ/ܲUs6 · Řäź!IŰ`Ű—NµG;yhˇu1:ćOîĄc‚lPޢĄDF´5“ÓJ^Ä,żÇk˘4.}†&2é~ş–ݵ XŨŹü€ş6ŹLĂ(OٶŕţM†×hCC eC TBý‚5ČYÓ2>đE~Żó-ľ„‡ß…‚s˙>ńô’vő]Si×,ł¤“”¸b§#OWTií•4Ł‚8Ł‚O•TIeĘ•ťd•€”•«•Ųu^śĹQҲ}Ň-óĎ]^ć|S=ÇTG;‹z*”›Zzj ;AĎG€ü*zL0Ě«¤ź ~´Żťô\.ꤨă6´“-˝_X­ŚhA€Ó)…g\›“>¤Q¨9=o3^ —+¤GŚSD9(WWK‡R“dlH“$%¶ŐB=çő˛1ŘdMĚbž2y0řc«?P‹ĹÉÄ[x$*s#cť(|Ęb ě1Oc9hYř…‰çÁôJż¨€«W©‰Oř4c”UPwZĎ‹4đ%~ÁxÁ˙äQź;°ňŘASu™8ś+ą›«Âţ*,x¶ŐHk°CÂň7Č$¨Ă˘j1]‘ĘŞśĘ¨ĽĘ¬ěĘl«ĘÓŐĘ­|ĘAĘ ¨ŕĆ^ŁąąTŐĹü[ÇǡĄc˙ä’á–VPäV®8Çę8DĐű—ö$GE„OôĂo•«é’’ăŹ"2öZ2ş-™bgt§·ćü+=¤.„GĂ÷r µŕ?ň@Hp…Ă2Ľ·×~Ő,ÍĎ?R¶Ď¤÷j*iD Ä~&‹,u1äÉßĚŹÓřh =CČâš›‰~|Kyč]üۢłjűđ˙đŃűŕ" ŇŇţŇ˙@Ň$mŇ*ÝŇ#­Ň(=Ó'˙­.ÓÚ`†Ů†HĐ«6ĂĂÉż}(ÔˇĄ~†ěFMµWi¸b4P+ H°źâúpÖ§vŮ6Ň_˙3¦ább‹Ń«ĺŮƢ쉇CF#­ĄśzÄ6–PyOPÔ[©CdÁoŸŮÉ–•ß €€Žŕ~ŕ NvOD° ĂS*fh;Ą˛-–` v‹.Uc;VĆŃÉRQĆ92vzo˝Ö— ýÇâM˘)ᙊfÉLíŮ+năÝ)Ó§ŢéHđuĚtŻZL%Ů˙R±s»iŰĄ±Ł&]ššNÄéi$`;ě©ĂÉ´Hp ^QŤ€,Qńşm€µˇqp˛ ˛j¶ S–”)ôś6Q´ "±‰$fŠ“ĐąŘ,mđç€č‚îŮmł+~č˙žaŽ‚´ÉŻť/óLn˛ĎëéÎ,{,Á Âýh€RMđdN5qG@T˘ž°Ţ ťţ­מ Q‘ę ›:ĄM1]#Öľ>ý)¦‘1#* S2rRÄúD$T’ęL6Ţ2,˙ôéÝÇ×ďŕľ{őŢk¸ďßĹ„˙ă+8ńŕX’"Y¶ě(‰,Ż3%éÚSâhžLGŹľÉ”'Î×x®ž »ć˙k[®|Ť;¤k‡’Ľ¶m-I¤6%FφkmÜm:›ó\>7.AY•4eşžűöë™´ dz3ş¤ćŤ0GrtY’ů˶T“•~ó_ˇ8oÎĽ T:Ü«áµÉ©ĎlÂk0ÁL±Čű+˛Äö1PAĂţb B Ófm¶Ń‡Ămpϧ–ęĐ©ťLäĘ>kš;.¨¤{Ń´fŇo¦árŤÍäÂ1‰4tę-§ĘZmČĐî»E(őÉP›™ÔđIŰ+(&ĄÄ˛É(ńsŞ-›Ŕ>±lt±Ho¬’H[8+h8bY$Yl“Î8팳–9AZł–<çÜS?ăśSO>˙­ĄĹ6댠ϨT±Ä˙ŕZ®?ąlÄ´JŻ”3KMÖf¬)´đĚÂ/·›jăŹ,Iď».´ŇD1VĽoÖ˛NĹQDNOśéźF,ełĆNoEí8m\ŰI-š€üląádAT8ŤvMAĄZCŻí“[m˝ÍVOCW$ő.ř~âŚŐcÝJÎ'/Ç:öHÝÚ§ĺĹőą9Í×ŰŠ®X® Ý´¦akĄµŘúN®Jé ŢtÓrË)'žŔBË&ÎÚŇoLNoň-¶PÄqµĎvJ˘‘>ËOł=ńZKdćV’igÖł@-©s睇ý 6mjŔ*Yý‰9^ŃL:$P/Ť4.‰˙Nş]^ibj6ű»`łš#E§Łě‡É’8IcUÄO"µýÉW.ńCš &|ĽűnŚîN#ţv‘Má"™Ó´ ű»Ćšö Ű»Ţ%ŹÜOÎö©Eq5çŚDk®aôRIľK•µ±„”şŐ›ž¶ô_‹oLÍLݰ ŚU µEŠ ¶8j+˝@KC«Rmý\ĚőEm^•k_0ᲤS Gs$Ž6iÇ"iÄŤ6F·ÓĎnntmd™™§Î™˙8Á߆t'W¬eŇěÚŠń¬aÜIB­‰i¤˘¬™LĚ{›t*5)Ń 9±ÂŕVd°9ĐK’šÔń:%2˙·ĺm “AŢ5°š@ŠyËŹk"›Ř¦6ĘăŹŕ–3źą% b)(B J$ˇ:D‚$L·ćŃD¦yý¤Ĺˇ ĹBCęóÇšśXřmC`Ů_7d Ć1Nqţ0Ú>tf Âe.$íŇEče—úČR>!’Úbí)DKť±„Ą$×Ő1D™óÓVâסUr±LŃâ@Ǥć`–ŚË™ $¶×iCh‘2ÉČ÷¸®Vő •7›ŚŃFW«â ëă0Â+›čDۉžĂŔa9Śk#Ůmx'Âe™LÄĽ”ęd±[H©˛pęFą˛)]Hg|±Lśb±ł­n ޶Đú¦u-ŤBë[ZĄÎŔµQh­°Mđ)ÚuŁŻD~ j·)ŰĂJçşŰ<Ť ÔUÍÄŔVęXLŁ`Yn ФÁG˙¬Ţ’Đ„4°eÖ°„c);YÎ:6˛iťľ\§ ąéäŚÄłŃ$ô‰O”€$ßČ’‡®×¤¬[MÝÖĚxVhí¶Zl«ťÄÚÔ˙ˇO¬jŐ“ÂP6´ \$i@BEŢe ©Ťr@Âx% $&"Î9 uņ+®}äleÁřv" {–Đ`Ę SX×ű´Á ŮĹNbǢ[Tő3"Ő L6¦ŘˇP,–pśÖü™—8p yÖĆް5<5ŞňN6¸9môfpšVS‡űË™á–fĺśťZ §H×ĹR •’€Ô5ĺĆ7çűMze‘ăá\$ ô!Čč#+ľDcř˙#š`‘7‚±řA0â77üXФt7Ó‰¸!+XM6¸{LEô™± Çv;˘WQsśá܆4Ŕ45ťŠśő,•6@yTń5Ki O‹˝Ę '8Á‘‚čá!µJěBŦĚA ˛ĐĄô AFÓő‚.ä 'R ؆oŇ|ŹŐÖČJVHk/›™Ő×8It[}OÜ(dÇiD«KІ‡äÖ(đ ukkŔ$ČîMrMxÄËIĐ5««;›.¬'%Ë.Ěłç¨4ő*ß©ŕX’@î4'ČUiýbČ“Myˇé§$”ŕ=íą!Ţ»Ż®˙îmŤ“iŁ@şt„.MjN1 ő§i±ŹE,±ßXl,›*‘€Çň×°úĘD(A:laŰ ĘFa.ćßČČä™ü úÜçm€ !Ç–)R‹ß0DčIč8«M3ž)śN˙Ţž1‚;÷ÎFPŃł,@u­Fyi„~Ϋ¤ÍbŘi ,ťŐ>/«ĺdhşČőbŤHřEô±;MŇm4¦áWa „đ­&Ň3öJHT}ă+={˛ŢF@~„”`ŮddoR0ë‰řč7ć!Ňmv)W· “' \펟¤>XŽnťą kŚ ˝H·F &˙ýţăÜQht“ĽD$8ÂŕHřřż4¸†»Á‹© Ü“„”)3š˘Úó†°ŕ lK Ś@Ϣ.§Đó"Ő[Ŕt$ ¸—‰JJź`3gâ‘6°„v{9⻊÷hä› ´Šx#@Ł!śžgz‹Ă˘‰óؤË0ŹÎxť˛ű18k#€Ś—‹{ş"€B“°(Ô‡«Ŕ@Ś„ű 0Lż‚ Ä‘#Ň+9–˙ܰ  Č ‰° Ť8´ Ă™#Ő8´‰ÜP&±čžX¨6*‚ É»5$ü=ă1 db 1sô0ÂőpDóp˛"A– Łň8ŹôĐDGĚ)KBŇŠ>$„¦Z1›µąµ°*ŻČ.°Č `Č "đ öÂ2ßpŇşÁ[8Ă€żĆ &™ž4š™aä2ů:é™-çP‘”š‰ń"’¤*››ŞŔÍŔuKłsA §Ł)Ô%ń&ÇţI&Šq$G)ˇ©M´Š!ޡ•J\ĆV™4ĐŽ ‰„ XÓ‡Ź`Ż2Ř‚­đ‹ ‡Ű4Rű ů;O[Ă!1ĂI[şQ˙@+$ˇ’ťËŞ‘Ü)ťZQz´®6ŞHҸ,K1ÉpS±9•ŘŘ—•,YAšx 7Ś1–«=‘ ""ź¨é)¦ť(PÔBX Č€­j[7€*ťK‚-ôÂ]¬ÂăĹMŰ ă$Ŕ8š«ă!žŢqoę’"ˇ·¸Ť’aŻ› ÔéD„Ćdd3XÁ‰ą”‘żY Ýč”RQARńËąÉX‰w|eůť´•9 b¶Č3ʆ@–”Č6É‹”ł0싨ČĚĚ|¸Ć¸Ę‡›Ę/Ś dĚ&5j.»h!@™tk#uBžŢÓ.±aŤKy¦ťňHM™MÄqšLˇŻż4µ˙Hâf”ťŘ NM97L&6é•PJ§H‚ZÔ$Řąj#€ľYJ#ĽLş3%ápBľ ÉĘ IČN ĂQë4óôÂôlC~‰HŻčʱť›Â«Ŕ„ŁJ¶ěŕ°ĎŁńKQęĆk¬Ď©ËM)rb¤=jˇ9$¤™Íf,ŞĆéAA iµě©®ŐS?9h„¸˛>đމm(ŹJśÁË4„Lůë …ěÂôŚ8†Űb1ÍőbśŽę—ŽĘť™B# ‘©¤Š ~úśé‘Żžh#:â=Ú`R‰MgŠ´´ §Ó)Pđ/¬QšŃ:Şź ¦`µĆ€kh5Ü/ŁO˙ CÍ“żMëĹǨJ‡ű;F1´"ő(ëśsÉó ±9!ś›±`‘a< ť‚# JR„¤ţś":Đ41ey$Ăë©éđŹŚ¦›Í9’› `®ţxNl»"¸1ö’EŰ1‘aü> CőĽLsÓ8•UôŚźťˇQ<Ôü¶¦ÉR:VEĘ©fş¦‰I$ÁŢKš#©Äż$'IŮ=Ŕaš„‘”ob›ËZą‘‹‰„ŰÉ©»äC:$ŤŇ¨?ř€ĺ,&ů1}@‹€SÁó„h„Đ”[]Ńóô‹4@ rÉŹűSS2)g Ë,V§cKţČg ŠŰq ‘|—˙ D§ $Ą‰7ĘCUłN-§˛•ş˛ČŞiÎóB](-yěŮš>…­OˇÜ°é@ 3 ŮŞżX˘'܋ґš…ý±Ś‹…Ľ(Z[pźóaĹĽŘ a”¤-Ň[!ŻĄV„!P·Š¦‚¤šRÉgĄHšVż\Ň@ę9x¬ÉB;ÍB»Š¨‰•ÇÂŚh[ĘÚ¬&p€Ôaů‡óAžŞšj dŞšşŤ%$}äǨř±@;$pá¨EYtJ˝h„TŘsdkÎ}9ęÚ1ls@Ě˝p!CR#ϸŃ5@Y€-ú°ĆâRŘ 3e ÁĎq˙« ‡Ź$˘nu””IŻ€‰<‘„ŘŹ8Ŕ§¬)P8šŞ˙x#‡č/š¸Čމ˙ę=[ ‚ü˛…í%_íĺoűVĄŤ2őńBKR(ĺ‘-Ę) 4hČ-M"ď3¨»žMm8 (üŤ—° ~ąŐkU´5ÄQ.‘Z›Ŕ¸ţđ ‚2&ł4pŽ#ś —`µôxąŹ¸=ú8łŽX+Ô:Ű(Ľ ¶ ’Џ;á˝`‡[HK°á9>łČ#‚Ĺ3Ék±2ăšBĺ#R!6v39¨3šŽusb>ół‘j§čÓş©‚ŻÖx°Şr›‡*ąĄ˙öŽxC6ŘbŻw˝˘Çő‹(`ô1§ H,€ţ©6:»˛-ĚJŞ’Š#šĎ¨‚đ â5ČZ=۹쌮E>ş_k˝F Äl5G8?,śÝY»‹Í@L~9“`µP(ł ޵Y; Y3 Ź/·X)<ę’¨#7s+ľLĄ *Ţ3wËA©)Y&­°“¦eŻiNÝ`ÉÝ)¸q(âČÎüŤ…ĐăŚhö‹Đ‘h–Y̱ôŠ…"H[е}čć}@7C’ĚXzU ^ĚDNƉXëPŠxąâ¸2îJ˘ű8!ë‰9č3ŞXaúP:‰Ŕ6Ţç>Ăd\ë3´ą±˙€îĐŚhŐgťDféíD›hb=›:¬¸3˘ ¬“łÄ ľăбSÚP¬§AĐ—äťÖ ËĺĽC=»i_ôE=ăLŃĚźŽł ęČчAµśĆŕz–ÜSe“č`lëł`Ă5—đ™wCähŤŻ[Äq»54z-üü… \eĄtŞV łWtJ۵¦2`§]ĘfČ-˛!5ŠB&ŇŇŇŽJ 475ír0eT&d‚$św•ť”OńŹ˙ħťb±™ň’Ź‘Ĺî}A]šÄ"ĚŇ/ů-ůôF¸Ř0$Čň•°ź&0`SJM:»+Łüµ¶† &ÎäĹq©2$cç(%اKe´¬‘JšňrŘ7‹w,9"Q?§ŕś‰†%{âmִٲV° 5] DĐšA ·1$(°"C[!>Ô¨1áżH·zdŘP`A·,flpˇB“Ú$éSÄÚż±H$‘őŻ פI˘ Ŕ?$˛l!qÓfR"¶Ú$!±M©$$?Óčű·Ďßż®_÷ýóGV¬ľ‹ öD‰R–Z’Ű>îzůqă˵7~śŘ˘Ă—G˙î=—#Çk&_Ž$¨8ĺÇ‘zł|¸°D—?Bάđൂź9Zí’ĄB]pMţkÄać(kĽ6Űŕcź7Ň,x3lβd'>Ü,ŘâŇ ¶+táţ¶ÍN™„sDš1M#F¸ÝÚÜî].ď1EĽ]*Ö[:öěʤ§¶6r}]÷% †>9żĄwŕ˝´ŢwäiĆźasRhn™Gš5’8RšAŤŔe E“]Ł‹w˛PgMş…ÜWÍ5‰`Ť•"Ša!çŐs0š–6éačŰjE¨ŹiŤí5ŕJ˛őeM] „š éb›aâFˇa-ŮUÝa>Ţ6¤I É4P˙VTQ•F^‚ŮĆŕ•—d‘¶48Đ}KÖŃC?Q© GáÔ x)F#ý5Iź5‘ěŁŃMfg"‰ÂghtŃŤ\‰+žuht˙ŘŁAH`§‘víYCÂRÝY…„$!¦Am¨ CýU$ tf„’ŞLRÉ’6+Ád Ş’XĄ™]ÖÔ*ßKůíĘWŞnزě-Ě.kKłË–ş…GšX°-«H‘4¸ěEafK"’$B†,‰Řb®-€8‰şÖÚ…Đ5‚„Ä51V]Š0–Ř•ˇ/vé‹+ú+Ý>ÚÄ6PO€ńĆ#CI4AÄ6‘Ôš‘8ËuÚ\'I%‘D#’´!K˙lµq,ČŇF„Ş”ÄĘ#Ű’†6mĽłÎiŔÜ„-ŤČq2ĐSIom4a϶ŘÜô»nH’FG-¤ŕÉĘ)g2ÔEÉ×†š˝—’`…‹“kş…X"„€H„Č" !eĽMF"łr»—v j)Ł” đŁ˙‹°Ŕ>ęOŤ{]Bpy´6$8€$ID ¶ŕ ŤX’qç °ętUŤU©úëŃmXŽ‚$D4ABŤE ‘€ŢŞ“@Bç–»Üúđ˛·AĆşeśĆď˛łŽ»ôôN‚iúĺ&¬$Zç´.ń Ííh1iK˛)iN"5ůŹş$˙…k ô·b+nę´š6Š ŤČ‚(TC‚°Â3Ł|% 1ŕ g"çîpüÚÇ>ô1 %iC)(‰‰$őżŐx«9Ú§Úྤˇes„MŞâ—ŤŚ% B  ¤á.+%¨Ę„<€Ë*%tYË´‚8`. i°\~x¤Äe " ŠR‚F€. PGP…¤6XBkT»fŞ5m; şD†’°Ń§5x!Űw B·D4 ®¸“»ć·-Ó K!˝QűHko $`d#ţÁHID˘Ái”˘0©¸LĘ(-€ALÇf%¨µO-Ë%[f‹Ś} i”˙kBj¨ş1h9šŻ.GËĎ˝ld˛“bçJ|j†‘ŕÉçÁBŕAä(”\ˇ y’:éÝd*Ů V“˛śuĄ±›çÓ:’†Ô…#…ÁI<ĺ‘oéŤP×5Ţi‹t5 ‰Ĺ€´›ľ]'$!P#%iCśXoŔ‹…Ż "ÁŔLR&ܡbˇŞ‰ŞŞśQI,f“IX᫊o¨2!“1Íf ńŮF±§*XA‘ĹG§’G Á( ‚ÉHÎ5‚¨» ™TĄą¬|J™áˇĘ#ł’‚—éld9ö˛äźÜBg˙ N7łÚ5Älgśc3É›ęóąć ‚˙f˛D.DHĆjA§!ĺ±öłŠ˙P˘Uţ±şH’h™,•¨….îp‡KŃ>"!‰’-–’‘ŔЬBxذW°ąË€Žä’ôD•ÝgBŇÎ †ZŤ™2Ä-Ď^Dł­…P_4žµÜś/0¦9Sú¨Ąű˛¤ $§l"Ből ›pEë•N6†°÷oŢÇ6öń K8aźŚËŐł$r6ä1ňÁKkF˙s_M·$Á]m€Ź[±}( “EĘň)§ĺD)V‰äu`J¦>ôĽęőWCőU#…ic˝žŚěocň˙tFWćă äÄZ¶%ź6'yČhŕt¶'í獶ӕĄ4ţ–¤|YaŚZBţÉT_K®·ŢçŮ i6ĺÔKnşşŢ̵,‡ĘIĄV –ˇ#ܡ…ă`÷ „łśą·îٶVŤ§.öőěwćś%TA–ޱqŐC,˝€XqŐdíădéj#·Ég¦c‹¤µŚçJ¨´ABl5†8™Ó 91…\CBě7.Xżâ¨94qËž żŞŹk¤%-(I Mrˇ˙Ôȶ6őMf¶<ZCą¸JSs”G&‡YĂ\=ĐšňÇd2ôµď»Ë—­űx{ Ę%H€m=l%©ÚŰé@ŤâĂ%n°“'UŘd?GaVuŘW’i«Iâ©ď¬öcđH•¸1‰;Ă«Ą ¶ĆVŮŔš¤1HO•žę•µÍe´î*59Ęu#ĚWŕ7ůĎ1 ;łv¤‘"č˘Ç /ł[^Ä9=Č^9’‘­qäAěšňŞĎ‡'ë*‹ä9ç×’ů8“®ĺý2ŮËlBó@d«­˙%%şşßÚ´-Ď=#Ű#dűľµŕ‘[QV±5OŐC3ÉŐÍ{hô˙úáű*oÔ'Ą÷~:Žć ‹5ă§—ŚžŔ+7ąŞK+ĄT›‰î×TµBĆ~#Ăv¶'ř’Ć*r]v#k˛¬EtU{Ĺ|SvL \Üi卬•ľÂ\#R )š•€ľZ Hơ—ŚňşúH~C„~%°źTŹĎŻ˘ŔŽŮwM‹=líO&¤ş&1Vě‰,üwÇIפSAÜj! ĎŃZń­Yi JWťîÍ–ÉǤ•,†źP”U ŔAD‘üC:1„%đ´AĐŚ5€#ČÎ6 UĹ‘ 2ÁIÔË> a×?řĘ*ťL-Ś-°J|Ě´ÁŚ,›Už ]˙çaÜ{ŐĉéFAVŐŘ[3™rmńá—đ\ťťXŘěFŐ°ЎVBÜž},ĚÜĆ’Ë—.„± b_|DŃł´NĆ€NÎ<’őĐ îlî€N<Ěđ J0Đ?<‘Fě1a ď¤AőůJP!Ĺ&!âCQGZĚ`µQvh›Ý’ ‰ůřH©áJp‰šŢĐżůßŮH®MšT ‘đZ»ËjS• DËśTŤšTY™ľ-HśěÜŇvĺN2•€ ĺÎ}Ę ’@¨J×?áDW0Rč•6Ĺ?řa`ÁŽ!ĹŔPĐ9F\ć­¤¤…m(!uŔ˙—‡„‹PxŽjqÄFŤ‡odŵ€ ©śCdÎ5 ŮÔĆ^ČÖ¸P żůGęŃh8WťÄ-ĹRś ŘĆÝ#؉śšĄ„®\\I D$ôDlĂÉäŚ,H4J–ŠÎÔ‚XC¤G‘ M@Äo“ Źú ¨H˘ć ĺ5\˘µ&Ň‘iCüi|Ů H" çĽ %Ő‹$NEäĚTŃĽĚLřL-VÂę‹ÎÜLÎd…Ë DîJÁOĚ1ű\ ˙•–apŰý1Ě5Ç=â[ľ…Üš dÜŐ„r Ä…TÇgÍŞPFĘ §(ŚÓüŤ>ĐĚNŞP$• ŐÜĚ?ŕ˙”9FÜLaáĹDZĺČL“0qđđćdń”0QOI…A€€Î`OđĽćÔ`OI2׬Ľ)R†‰é]6fKŘ[[µáMDJ‘’“µŰi™Ź±Xš9éŁ@ȉ† ¦e„˝†|á±­Äo Zp$‡z†GQ"ˇ]"Őˇ#Ä™E‘Ő§Ĺăfp‰FČ0)Ó5ôć6€€U…Qđ"ánVŽS7e% 2YÄ"Ű1§DČ‘Öb!-Ä€9WßéÂo@•śšŘfYg ˝ýČFfIfxJBDN2…6šE:áŔ4ŤĂ5”âb)›md˙śčÁ‰ËČŽ‘,€ęô`.ĄPoJŁËTÂM^ĂG‘€Jľŕ/y垆Z‹g%ŽÇ_Y[&';ťÉu!{‰ĆÂ(ĆŢFęc~‚XYmF\Äš@T(ť©ÓÎ)Ä2 N¨źć=;ľgűŚÔ tÖgÂ(ڵÉD©Ě†ěX_p‚ ÍÔ”>’ć …ŻřĘ6Ĺ€TCŕŕÚ¤Uŕ4Bpî‡(¶D[ˇÜdÁą˝ˇŠ˘áGŘÇHf5ŽĐ‘áaDI>)¦{¬ĆK„Äi]ČbâÁцF’’ůĆßčK|™ŚH^ŕ©gúĂ˝×z (µ°Oš6Ú@|ç©áE‘x˙˘kQKg©‰z<™pH®ę•\¦=ŕ‰EI”Ť,Ä‚N¤`aâYÔHµ1Ąç‰Rč©Ú|Ѹ­Ś¦…’Ţ­ža•ˇ–Că·Ńl;9ÎFŠËÚđťa( ĹáĘ…Űt‚a3ý۲Ö»äV$”LÉ(–ř†ď3‘Ż”ŻhŚĆ< ˇ$RNX1EÂR ĹĘH"Î@,Ŕ*“Ké «`Nçđ?€ '‘Ą){uÖ˙”+ôâśuFkĽĺĆ»ä™ůťŽĚ*Ę•Ű_ç|AÎČ˝[q%®ö^oqňÇń’ž".d„†eD$xžiY<–¦ Ű®ĹI’Ă*ĆN*Ň>€ Ň,˙RXîEçxD AwŹYŕ!O’NUČÂŹŽÖŐ§inËLě§zśI…¦Ő5u!ABńQ‰\ĆÝ~ÍšźŘŠđÁ,ŚşílN'rn(şjĐŃÚ0ëűĐDsś…äA‡ ‡…äąHAô ȧ@—ŞfFSZâNţć„AUŽěŕSIÂŚË łJĺNÂ\EÜ08…Đ*®včc ÝZ¦ÝÓ)˝¬ţ­›î— `ä0†ÜóÝ’Qh“m¶ĆÝG¸.&!b5łäEŽDĐ"ŤĚ6PmŚŮG‘ U”J„ź5ŔXŚ5Ĺ1•@`%–Ď€fŔĐH‘Q˙[‘•2XU×™‚FŠ—|X   đ6sHÉîJ?ňŹÇ…'CâĘďĺ˙üĄáę3‚Aě­üöÂGEp :…ĐĆ.ł:rëŠ$r±iăč–Č|Gr¤çGűsĐx ‡&5Jz”¦Sžr×ůâ±,—ăÄŰx|ˇ*Ú«ÚĐ‘‡Ř[NZËVĆË-ç3×îqŰĂş!ŕYĆ™ě×!ó˛D´-ó7tʎ7ŚEVC3Eü†łe4Ł(›ŁžrlŁT7ę±ańRŽ+~îÓ~Ú—ĐŞÄŁÜW9N°¸‡W¸5I¬eiĺŃö+vΚ07&‚čÝĽ!ć·ič^߆D$­ @Ű6EVOuU‡˙Ĺe˙GkD ţěV"´©óÁ`Râ°sĆu˘Ă$ň NDqľ˘KĚl‚ťÓ:ĺ“«a’̲Î^|¨ËH‚®C'„ŞřĚDÔńîj-.B,¤_fĐ™“ŻH5c4uOuXč§o@ŢÄ%Zâ–y η:oĂĄĚ‘EÖŮPÉxŚ·ŇDU}ČQhüĘIqT˝Ő˘.dŽpB,6 ·!ťČm—áFlä’1÷L­ËRŘ‚qa\öĎTÍ)^¬Ým§·pFě:s3O7fcŹqtĺ¦ő%RžŕX÷ÔůbÁŁ;˛dH§¨f''D™L#ŘĚʨJ©Đ¸°ŤĹ°Ň<á˙¸YžL_ÍSôô°ľS´Ěá+éťĎ]Ú”…źYaÜžĘÁď®^”0lutOWL¶tO L9ś9\Ř€ ŹGëĂeC‡ÉIgÇBëřz)QČGo} řٞȒČ&jťgY۵Ů(ÄĚ ”ŚçX#ńđDP”ŚG©óŃ@î¬Đ*Í’őµô nęłBT°ńmp”%†”a¤ęáŰÚ–Ť1.Yňâ5–P´Gô äeµ?ä6Ä<Č hĂ&ä7 ďŻLë$NÔB PByî? f¦ţ.ŕ XRâëvă7&AęEA´BůÇDH›˙w{y"ˇ®6IXŹąA”®Ćäá&cÎťB`ľGhY×B7`G†i’¸qŇ– h$/¦u¶ŽŞ±ČtĘš„¤<ÄľđAHµFO @>Đ=”@ÄA¤;\ęţɆ8OjW·LPE;é1QĹQ(#)ÖNpÔÉTçLRôN´5ŮjÖCÄ0G Đ*)hU $ ůŇňˇm–€R,1x,QÔź 2M…őÉB49µ®w9N÷e€99đa|KxőWÄ©Ś20ćěą:…—i·řČ<5JśKŇ$L‚uIÂ6čŔU÷„ýé‚4WŇu=ĺ8‘ÍNK˙ţDt5 mŻiۦϚ6k¶.Z“¤#F‹Űl}¬h+˘5kşLj+i±bKm!/ľ¬XrŰH–5-z„©ŁI”fÄ’¨Đ–?oąě9Ô&L”ŤĆ”řP˙˘>Ž.őh“kV GOĆkđZH[¶$%\¨ďŰmţîÍ“7/–$Kźv}’éźZoj*¬¸±bk˙&IŁ-Rš6˙’h“Ë ¤F¶§Ů·W[4†m%yÜy1äF’ŘkĐ1bµú¶i»×jěŚ/eŮ–ąThΰa;7 “wđž(;Ö4î*ď˘Ö’š 뛤N¬'Ż™ě©=¦Ů—_ˇJďNťënîÁŤFŻ®˝§Ěm¨óe«ďŰü¶óÎĺ/B ĹŹ?PáźŔÔj«/0’„'$c ± |pˇĐ5ýéë@Ä*ڤ„ 94Đź‰Šm•,ÚŤ±}:J‘9äF˙‹ąń"Âč–Żľ›®şŻcé8•ł&;Ż0* » z);[‘;“’*’Čď–Jq¸‘@Â1,”˛śî7ł„Ô…,â"YË@ű´±DKlŮçŤ7yĂL¶Űç/%ÓĄČłĎĎŔüÁ]ÔP‡`«Č!˝+“ŐóŢŞÖV«řJ0“ .Ę}Ďł¦Ëâş•ĄSůŤŞŁ)cä´ĹO«6µkô«•aäĆĆŚŘĄ$úĚ[ÜäM7t±E7™c–š‰NPOk 3Úľ˘ÍÜYrž»ý–rË'o 'ŘTZş9Y´á«/s J»™ę2G™*şńÇ{łcŹ-ŇVm\çé$'a,J×Psí7+VWNôŽ9n˙¸öP>,Ž!/*“rű$á€@Îça,ř!¨­d; ô¸Ĺ Ú(mčĚ糦 {Žüňr;Äص’)Â`µ$™°ÎH§zNw„TîÇc§ĂZ×P·ŔžîWOąHÔĄšĽęmT*ŕČlQ“¨\đWWęŘŞs7`ń…P(ŰĆ-fa‹yŘc÷ĐĹ/lq‹ÜŤ-×RF¸ĺ!ÄX ‹iDc’` 4Č mŘG,óP¦~ć2Úý®Ř§ŘŘĂDSńŤůl37„y$w«ÂČěĽÖŁÂ„*šQ{ĘsŞćíŠV*Ňż &ę¨tҡŘç5«>â®x>ęšM˙Ć”“ŤX«hďS#ËE'ÜHŠO‘A$lAYH‚m@:)żh҉EH%¨T†K] ů¤âµˇ¤Lśâ#¦bgA¦LŤxčaŮfOEWŕ©đ`¤žĘnK ä”Qĺ¶Z˝íWMĘIHÔ3¬W•Loҡö¨kťéféĚa"A‚‰¨ĆCmHÂ?ŇĐ„SަIĺü9+jzm9‘CNd˘–\*±aNp˛C%˙á‘x哎ʲĽŠ)tŚ_áŕtś´F\mĄ(¨+ Q´¤%mÄ68řťÜ5E˘ó*U‘(¨‹$ň"i!š;“řĚŘ'ySĘr˙'iä*AüĐ(÷B„Ö8F”š@gÚ ?[¨‹\F'ş6Ä.mŘ*ąČO6Ň[! IPY¨ť$Č‚(Ĺ4#yĂŔ$mG™¦sN»Ł’Í(ÝÉŐVÓČ"˛ NNxŐ5\n'—ztΰâĂH[D~ňcPŢĐ’$l#đÖA„f‘ŤĽ„OÖh„?łŤMúc“ÚHð0Ňk´auÉç㨚ۢťI:±‰,š‘Ń&č©™m&€m´a˛„•„ŚhŃ4*)Gm|+E-” ‘`´Ž_«ű´\©q7‘yBöu<ěX‰H_“`N`÷Źç™Ĺe:“>Ú€I˙L•nČ$~›ŃÔł % řÉ"É Őş"b2”! MXC®â…7¤[Ví°hC’¨)[€®%‘…'9) DŤčä@Ú_=f'SU‚Ű_÷¨°§’7m„Š.#Ć»f2Ěl· ·ć3‘ž”*b śfÂś Ą—@V(Ć:׉@¤"×h(íY""y|ű¸‰CspŮ/ś†:ĺň§ŰcíV·ŹúîZ©“§ˇ¨¤$pń6ŕI7¨hÎ3őČ:"ŤW¬ăčuq¬ť šdv E¬Ľ¤ĐŹ’˝¤#Ż'ťLé‚ÄOŮHJÖ§ÉţŁ©Ď•_üáŐlŁ˙$ńd#Q˛‘=5¨›! ”Ţč¬Ę9kxQŞ%éin`цŠ-?Oş =ŤDDQ(·9ZĘ؉[w‚tL˝®m˘Ćá•ňĂä+Ay[‡á™9X¤=*ó6wŚfL ‹7Č1 |a˘DpÚ6\ E ’pZű9O…q÷ˇ6\żBŤ‹‡·5Ьj´‘+ľF5«<IhâXË* XŁŤ €-j+ Ôč+F–ĆLJBy`$ “_·ťc%ćVń€"qt'*ÁD˝FšžfxÔFĄ@…ć(ĎbŠ®)ëi–ě(üŽů(¨ŹĆcçl óJčEĽâ &¨¬#äŁ×˙FŻfΤ@čC-Ę ĐéCĚ 2É2¶!ž8n‘$âşĺsă2l@˘G kż „~ Ír®E°d&ô…;˛bŇ (¤ôŞŹ–b fşÎ˘¸ Ó,-‚l0G»ĐŤ<šGˇ@':Ä$@hÄN&¨°ŽÉ'0€ŠüFLRdkĂ,˘ëŇŔ° áËĂ©­"śľéqŃ÷ˇ Č*‘ ŕtď)tM:‚©ůîHc,H·K;x…IľÍŢZřĘDhjúHa+—Jâ),ĐS PHÂ#š~‚Ć:bQ(ß´c˝©›’e>†Q•VĐkâD”ńźÚE˙ŰE« O«bCˇ16¦qż‰!”ń-H¤7´EŽÉ: y\űÚc ?Đń†ŹđŔ˘7`'|*|ĽŘ®Ę1Gf»p‚´ëŻ2†ÄBćy€Ăľ‚‘{ČÍ Ň@0˘Ld8d‚WÇ%$ŇJ(r"%R" Ć …%$˘Ŕâ^‚Ăvމ_ĆlReąb±fŽ7ŕqň`g9X*źD iN8é Ż¦Č /‚®¦,jĹĎÂĘFÄ@ęüô¦Zü‚áľńG€ďŰxé)srm@ę°:°E2*q®řŇm*-đ8j2™¤«±Ěđ°í^~Ą€¸DŤÖí$ąŃĚŇc$ Äť""şŹ×˙‚qśÄ‰‘Ŕ)AĐb“dÁ$a“ę"07é/-°sżs1ó0'Ă1“°ł°0-s“&Cs0#A9 Ë2ë -HÓ.—ĆĂŢó!č“6ś‘>ĺiú“6ÎÓ?íÓ>ď?™i>ŚDöS?›1>áó>?Ě˙é?ó“sŃŰĹĂ(BÔ@3´Aô>˙=ô@94BtDtB“&+hŠú\t„ÄăŇ\ô™’_n´Fu”nvé!ÇCç NbĚmiEńŚŻG7ć"śOÇÔk^Ô(ăMH÷q8Ęň÷q ŤÔF5%·ÔIcR ĄËŻ6Pw¦ŹˇËđÂÂćÔP‚ĘĆ:ŻÉŢ+`ꨢč*`gÜ‚ëŰľ¨Q"±¤ćIPÇ|˘&_rńîô—P¨ůĘWn'ű€'MwCľ&yIK™xĹ˝NHŃŕ4Ł ËŃ|Ł$WTˇŽ˘.% +ČÓľ˘Ňl,%#IUUş@ŐL‘ş °šÉu€çŤlőEşŃî*U…¨lčI$˙ĽBy”GȦä.Í"|µ™°ĆD ľlî°Đ’§év4J+ńĄ¦Ô)e„öęWżh=.#zît|U'¶$­†lś´F âĄ¬Tů5ńdTUřĹWN ĺł* ĎB“Ń]ř§‹JC¶?»HA«b5t*6b9ça3cST" D'¶A”a'öa;Vc#vd5vdĎóťE%¶`)bif#ĺeMC/eQöDy¶‹GLT¨°–5'#9Słh‹v6÷Âąns3‹¶ Öh‰–:ëBiť¶i{ęjł¶ji“k‹5Ă8 łi™¶0-ÓkŤSkŃ“"ł.ś“:ťmgsm˙{8§S¤łjçvmѶ5ąv/Đâo•¶6{Şľ´“3çÖl-ł.Ö–h×vmť“lĄö8 ëní6kws7mËÖ°L‚¦´„ŮKé#˙ĘîJwu?Ň"+ňu]w XBĆZ·c"ŇJDjŰĘFuˇĚ,eWHJw"·ÂˇX"cÄât%jŰj×EDvć&v7%–·![âwY%6ŻČ8E™zě„BPUdň*ŹOCâR×a4,0S`äĄŕË:ř”źŇTuµlz'ŻČFâ·đ®Ő€˙Nń[Ń×IĆ ĺXIâ)PÂWó%JŤ ¨¦÷n¦Äh\Ż˝Ü˛ůîŐ]ĹuU˙h.jƔܮ•Ó˘‚n6ć+Á"şä­/okę-ó~F‚„‹ÉčđŞGÖëNç—şüńtđŐ&eÓöčćVĹ‚ĚÔCpR 5•úH؉G„…„Ä"n UOĎQ ™é„Ă‘; µOÁ„b†ů )}ÔÂxŤ¶Gí(‚}î ťěPďŇ čřď‚Ĺ´Łtn‹‰đڰ‡ 3ŘpXĂ´řHUw‰¤[ÁLU-_oL<>1c>­P…ă]I8~Č7ř8u¦ĎŤđ®e?Ö9Ç‹Ĺ[v=?v•ˇńąt!–_—Y–SöcK¤•#=A˘j€R'mé[©©é˙îd˘ě Ą’„°I'ńŞÔFŻÄWb'9ęŤ'XVQ™FŚ+†·m¤w]w%Z÷µ¤"Ç b®—±¨xńvl‹‹×›Ż×"ćF,ŐKfçwx¬Ęč^xEČÍŚş2„Yçźżx^$8|?°NźűtçUČŁw%¨€JŇ˝"m]Eę|S…Tˇň[A˛‹^b¨ţ¸ń€”mú÷Sâ­Ľ€ (|ń»—Nému=bĺ7ŠđşYZ[•š˙Zqn)őjXč¨0|ŰŠI¦łY-«¤žýµńČkŚ § uÄŠ Eő¨źĎ ÷Şçdě)ś¤ßX‡,‚oĄÁŘŻ&m'¸…oX˙…•ÝŘtÜ*oMŻÚvĎWÍwŇ‚¤lFuĆĆG:őé‚„Ł}¤¬H Ż_ÇWă¦äQ;P ;ôQLI¦“ôńŽ€®Fˇ˛M€bb­bǬúâ!ü÷¦ř:dµw«ČVÇ{·dëc±(áĐżľÔ?H€PŕýџܟţSCý‘ ě?ţíýű?˙Im¶Ú(B‚H "$,DС„2D„"v,‘#B[Ö˙tYłö/Ň5[ÚJ^3©íÁ–0mmcim&É['MútYódĎk- ž$ ł¤RžHsâ¬iÔÉ“<Ą Uj¨SťEY˛Ľ6´iVž5·YĺitĺŃžJ§ÚZÉUmV¨^•µ™3§6mf÷ć$J´/QkŰZÖF±aĹ„›},U1ß˝Źž\¸ńdʼn/óŐL8oć©2˙5jIŇmÖÔVUK5k’őj«:Ő¦ÖąvęËĽoIź=9S+ÝČu[Ż»Sh]śMqݦy4xP«°ť*ŹlWµÜ»Ö×25ŽŐ-ęÜĆY75wĽyđ·UËf›xůÖFJM‰Ö+t2·*Ő…[ĐÝT”qŇ˙­•SĆ×Üţą6•oQ‡t\=]†ÖŘćÝ­¶›‡$q…`S :5•Y#ęgÝŘ™D†baTmůg—6BŐˇrăegaV'í¦Ťi6 iMUď 5Ýzô}ĺZP˛ 8_‰:¨ŁZÁąWĺ“ňŮĢ{Đ­xĄjAŠ©ź\f¶Ĺ]nęmăT?-षaź|H’Iç\x†W˘»÷O¶jɡZ‹˘Ž"*‹-‘>J©¤–6ęh¤“>š¨¦•Rę©,µ„*©%ŤzúiŞ–ş©¨¨>ú*©˘fj馴zŠ)¬–Lj+¬”ĆâkŻŞÖz+«ľrŞč«©˘Ş,¨µćzč?7˙Y3č[&ݢ’-ńí˛“N±]ëR,ÉdË ·|K­W»™XIŐR+& şŕK^H.˝â&ią+];ąřzűoÁş€Aߢ߹%‘ĹÔŔ`®«ÂęzE–˝IŐ›.'W®T»A¬pj7Í{qÉR}Gî‰L‘µ±Çű4ňĘR ‡Ä‘ݲ ¦“ŽzhßŘú3ŻÉÚrŞĎ’* ôĄ«¶jěˇŔJ­(°‘žĘč¦SO:uÔM;}µŃ¶t őŇ«Ž}4ÖHŻş5«’­č×băz¶«Ś«6ÚŽN tŇfS řÚWÇ7×w ž,Ö@Ó˝·-’h#¶Ą7 nk#=?űôŃQźŤůćĽŮ*]·ćśk-zŘGG>kčY۶ޗÝşŐžŻzŇeNkŕ›.·ÜłĎntđ™˙Ţ*趂޵-‘ô,vŁ‘4G#nDŇőĐ·! ôÚˡ}ôŃWßF÷m8GřŕG2ýřŢ7r~Ü·á=řÚĂýüöË~úěS/IűÔ˙O?ř9‚~ߣ^řđG˝8O~ , öÂ=Ňý`÷ŔôĄď}ţ«^ú (ż÷9Pz$źô¬Wľ –°|ÖaýÖ·>2}Ýcź8ľöÝ}, ţÜđŔ^o€;fox1.6-1.6.57/doc/screenshots/analysisview.png000066400000000000000000001216111326741342000211700ustar00rootroot00000000000000‰PNG  IHDR;I#ˇś IDATxśěťw|Teö˙ß÷ÎLfŇ{!¤P’:$ˇ÷ލ€(6°!(~]ż®»ë¶ŻëĎŻë¶Żë*‹Ĺş(˘ (˘Ň{‘J€T’Fę¤Mźąż?fć΄T"‚â|^bćŢűśsĎÓÎ=ĎóśógY‰®| ‚ý9ÎňÂ^FŕĆß^ö-ĘÇ!Ź‹NpČ-! "6śĺéŞ3×µŕŕoĎż H‚ž–ôÎ:“ÜčťrŘélޱËkCDěe# Řk_śYĹőĂ­Ľä÷ŮK¸Ň Ů\éť]í ąĽEg":dwĐ;ÚÎrräÇ&ŘóŁ@Ŕ&‚łĽD$y“ËŰMvő(:ű“ ד„č–WŃUŹö·»úšłŻ8ň+9ŰĽłŹą:šŁţś…"Éua/Qp>v‹rÓsk‹r!^ŢWś]@ŔNhŹ rűE'˝—,[›$·>Ůös9żí˛¦É°+;'¬u);„¤\ĆÍ%‹ŰOŔ®Ľ@’ě…do.öJ@ť}Č^°v€ÜZ˘«]mÄYŔ ů]’ IŔćz,Óş ďv-! ěťÔ!© şĄZń“Ďěô"-éť2:•śý©›Bv°S\^´nťR@MˇEö./{Y!µ(wEgoÁ®Ć"·đVśěu&Čr9ş`sČ«pÜ“ěJÚAŻó#:ę^r«·śV’M˛™%;c;˝ŕ|XV«äP6ɢ‹^’ĺäkA6?‘ßďüPŮŠĆţۡf厅ëĂăMŘůŘ$§Ĺ!Ú--\J\rXg˛rśĄ!`“ĺł[WH6$D ÇËD7á¤rü’ËGŤ‹HrŰ’eŚCőąě<W q©tg ŮźŠîµí9ëVţëäéTËÎvęüüŘyÚ«ŃńQrÖ­#/˛ľsü–ŰĽłŻČŇŘËg]:%żü{âh‹’do+®ľâ˛ŤŤŐ—h EŠ0ôĽóÖţö·¶x¶wďVŠ/6 zuU—X˝ú=x`1*•’·Ţz—ĄK¤¸¨87şË”ÝP$i,6k&*E=)ý8‘ĺRxľŢ^Ľóňüéo ö#2ĚQ5iý“{˘jtř°c_&ł¦Â`0“ˇš™“qčháaţ¤ Žă«íx3~TMÍý˝ąá( ‹j8ˇš'—N#,ĚŹ×!¶g(1Ń <ýř |Ľ˝8žQÄ-3‡°aó –-‹żż†‘Ăăąď—€I˝#X|űHL+O.ť‚ ,Z0‚‚‹ŐÜ>»'ç/TSp±†Ů““É-ĽÄís†Q^ÝHŻč`  ·Ý4Řč ť¸€^gbÖÄţä\âRucÓzˇR¤ź)E­Q0()šýGĎs÷­ĂŃx«hj2đĺŽsX,‹ć§đŮ·LžýďY|ł3“Fť‘°_B4©™=1™3ye,š›FC“}‡ ňóf`b› «MÁ ÄĚ&¶žkŮ".ű0·ű·Ý ÁiŐş YZňsłťVŰĺ E7KĂÉס(d:ܬWÇhm?ĘRµ„ä¦čZÜo+omAjńKpS–ÓÍ‘ —.8Ąq }ĺĽN]kď䢛vĺ*ĘoÜlwQpŮŔvulWPN ß=ĎNĄj·§]ĎśV~[tîÖČ™lˇŔZ–„+Oň…€Ë˘\‰$ç3ąť8™]n5şjÔ9u€ŕ  ®‘Žŕ)´4Ö:ÄÎť_ŔÚµź´™fÄT{ěżQ(<ôĐ}(—ŹźÚ°†% ^Ű0€S9Y>żÁAŢ®Ä ľŢ|µă,k>ýŽÜ‚ţëˇÉL—LxúEÓ§W8úG3cĘ ş{%—´<óÔ-ÄDńÚ_ďaŇč$^űŰ˝Ü9/Ť™“ú1e\"™ç˨©k&·°čÄ7[ĎrôTź}’á㨨¬'7ż’ˇÉ1ŔüYCđŃxˇ­×Ó#"ÇŤ':"ÜÂK—Ör÷Ľ”UÔs÷Ü4Î^âá»Fc2ůĹă™1!‘qi}8râĎ?5›Č0?´M:ôF ^*‘E·¦đ—§ofLj˙ď©ŮL݇ŃĂzáĺ%2wĆ@~˝t2 MÍ„…řPTZÍwŚŔßGŤ ‹ ›Ł™E…úłýŕyvČăTfűO\`|Zo K«™Ö›Ż÷dâď§":ҟ϶ś!$؇ňĘf6|{š°`*ŞíŤI¶ęŔn Hň@Ůiu´P<ŽO® 9żČ6@’lrĺ N‹ çđÜ&w+’ŕv-9żä6×_I˛Ű/‚ä˛j%ÉN'H.z‡%á4ĘśöŽ=˝cT %dďSňRžętňÁeq8­CÇPRrëL‚$ IÎa™Ó>sĺĂÝ w•€ I’Üň&as–·dOd“é9ś9‘pý˛Ét®;Žbt+i›\ ®t _;-täwŰďşlOű˘Ły8í>ű ť­Äćl ö’rĐIňµŕříŮ8ëČ&ÓŮłějö±ó’ói’sl'ŮZüuŢżš2djµ“ÉDZZJ›idËN@" ň‰%:\CtD?ů[0…¸«T…ÍfŁ©YĎmł‡âOAQµťV€Ľü*Ô*yů•řŞU(E…(âëă…Ĺf• ¨Ig`őÚ}úŃܬÇÇŰ‹Ä^$öŽ” ›M˘Ľ˛Ž[gˇˇŮH|LŁS{sáb-˝bÂ4&Xóů1ËgäxĘ+ëykíA¬VĹ5 JŽćĹU;řĂă39|<ź„Ţ‘(J$GÝjëőčôVŽž*˘oďpr/ÔŕĺĄ@­RauČ˝uo6^*&‹…ęšfŠJ‰ B’$TJ%˘ÂŢ22/ałą&ţ•J»­ —j5!˝ÁĚĄ=÷ÎÂ[ëłď»»g,_ďÎFŻ·’24†q#zsľ¨–ŘČ@ĎF^a-Ń-kvKCÇ3g×ńM‡ý&xćěZÔů5žłsâ?˙ůĆFűĽŰ,ÂĎĎŻ…”V«‹ĹŢOm¶¶[Ę“O>͢EwáëëËý×/Yµęß­Ň´PvóX@Ą6€±3c(=7­:Ło÷eđýĂhÖąű±ŐLź0˝ÉLáĹ*VĽµÜ‚ ޵:.–USSŰDŮ%-JŃnFúx«yîĹ/Q«•”–ÖsäT!©ăůzW&˘`ĄGdÇO±űP Ť:fLęĎ·»ĎńŻ7w1w憌áü…K;UČÎ9„‡ú‘2(łM˘čb’+ę8x,ź‡ďÇćmg(«Ô˛fĂ Š*9t,źWŢŢÍ®y˘ŔśixĺťÝ•ÖR\V‡|ĽéçrĘHĂĹŇ:¶ďÍB|»ç˝•éű‘WPIem3•ŐM”UÖÓجcËŢsôëEéĄ:>ü"ť&˝‘5ŹÓ¤7`˛Xě<óĎmŚŹżż7'ł+8žQJTX SĆ%ńá¦tľŢ™MAI- Ą’«ŐĘŢ#ů HÂh¶±ďhľŁ=zćěw|“Eg^ś÷ů‡p™Ű‚üÁE…َѝ˺sfAvĂq”… _Knĺ!:«»{‡űT°7`Ńiuö-ĘeěüňŠŽ˙\ü™źSÉ9äל“S~ąÂěC§;Sgů ň˙ÜÜ]śe'ą»;ŘĺhíFrąŰ‰<^u(-˝ŕTćN÷gĹ:ËñĽ/"ĐÂÂÍ=ĂY^NĄë,g»v_ˇwźł“]Rä6ďâ/ ´(?Ah=gçĚ—ÓŠqĚ˝‰.×ÁU(«SDt“Í©,îm]îWrĹ!—žč˘rŠ+ Š‚[ŰZ”±“źÓĺÇŮF[ôgŰu¶IŃ˝|ťmĐ•Ć9gçlËvwĄ×wî4mˇ©±‘¤~I”••·ůĽˇˇŮO¬ ěŔű\ČĎo3M}}=·ţć-†{ç±bĹ*—˛›x÷¤hO¶I`EAFđPZúŮ9 .ź:G÷mág'W8¸:±«¸ĺ Ý˝ŘܦŤq«`÷Jp=kŮať….ówv"ůÚ.+?9ąŃȌǶ[glŃŃäŚ8čémnü»ęgçň}.ółsňuϧŘBa´Ľ–ů·ł=:G-{ŔirÎŹŤÝúA]ײu(ČňŰ;“«śťŃAďôµ˛çÓ­Ľd…ç®\Úđłsvoą_]?;G‹ů#ęhi¨E99ŇŘ}#]~v-l27Eă>ť ótëO˘ŕ r«;×o€–עăžË`\őĺÔPŽßδ.9×GĎţHt6aW•Ĺw§s>ďšźťűřąË~vWCŐ9¬X±Ę>ŚEź>ŕĉSX­VŚF’$É~?—˙íź|ňżřĹŻHO?Ů‚—űďŐ«ßkqÝĚf3o˝ő.éé'ĺrw*U‹Ĺ‚ÉdB«Ő˛~ýçX­Vů}ÎgMMÍäćž—Ż;ĂŰożŹŐjcëÖí¬_˙96›Ťüă%.\(nUöş9Ö˘Úúç^_a÷î}ś?o_ył—“­EąY,VL&s—ĘÍźnşi>ăÇOcüřiĽôRk˙ąµk?塇Á`0päČ1ĆŤ›†Ĺˇ(ÝѦya0ŔĘ•đË_‰đ‹_Ŕ˙ý˝}aĚf3ŁGŹ`˙ţCěÚµ—ÜÜ<Ľ˝5<řŕ}fD’$Ěf3‹™­[wPZZFAÁjkk)**ćâĹâăă:äqúô¶oßIŹ=:t'NśDˇP0tč`Ž?@dd$™™YÍ’’ú2tčŕy&$ôáüů|ÎźĎgćĚilٲťěěšššéŰ·…L0–}űrĎ=wňé§źńČ#K:äyß}÷ĐÜŲ̈Q#xűí÷E¤¤D˛˛rP(D’“űv…"ÇeÄÔyšL& gÎś#99‰ßýîO 6„Apňäi$IbŔ€dęę´lذ‘É“'˛}űN›P($&&PRRĘž=űP(Lš4~ýŰ}ß´i“ٱcĹĹ%deĺÂÖ­Ű)--'>>–Á’‘q–ŠŠ Ŕ{ď­qÔA‘‘”—_Bě×55µ\ĽX‚Bˇ`îÜ›‰ŠŠě0żë×Nhh(µµu¬[÷) ŤôîÝ €ßýîčß?™řřXfĚÖ!~üČČ8ËîÝűŤŤařđˇ<ňČC|đÁG­ŇÝwß=ś¬S~Ó§Oe×®˝\ĽXJŻ^ńś>}µZŤR©$&¦'űöDˇPđńÇź2oŢ-]’Ó ‹ĹÂ’%pöl&V«•%K #ă,€î2lŘyH’Ä{ď­ÁfłqěX:‹•QŁŇ¸ë®Ű9w. A°X,deĺL}}7nbѢ»8°?>>>$%%ŕççK˙ţýđóó#!ˇO‡ď‚‚B˝yřáČĎ/씏×ö‘‹QţמUź““‹B!2qâ8 yóÍw0›[[lwÝu99y$''µŰoÚTv“&JeĘĂí î>O˘P(P(Ś•†ÉdBtß«466˛jŐŰ|ňÉűňÖ[ďR^^Bˇ@«ŐRXXÔ!˝ ( Ů«ŞŞšŇŇ2ĘË+đöÖ†ŐjE©´§E‘':ĐŢnčÓ§3gN“ó6rdŠĂ’ąĺ–›P*•<ňČ”J%‘‘]âé,/ŤFÍŞUo“š: µÚ‹U«Ţ&--…BÁ©S§±Ůlť·M&,_ľ”_ü ź|˛AćŻT*EQ.…BäöŰç‚^Ż';;—¦¦& 1 äćž§ˇˇÂ ľłoß>(•J¦NťDRRJĄ’I“& P¸ŢףGçÎe˛eË6zöŚ&#ă,ÇŽĄCZZ ©©ĂIIĆ©”—WPVVNYY9ŐŐ5ľŰÉßYŽ#F¤ĘőˇP(¸pˇ7ß|‡ţýűu©.<¸>ضm'Î˙]ľ«‰;,Ë˝÷ŢEZZ >¸'žXŢ*MzúIţűżÍŠ/ĘŇĄŹ·9…&\,-”jŞ\۬¬zë ţú÷Z$jn†—_z‚ű/jĹ`˙ţCś;— Ŕ„ ă8°—3 °}ű.ňó »eĐ·oÇ–Ĺĺ(/ŻŕČ‘cĚźëŃu†O>Ů@]ťkÇ—»ď^HPP`ťăÝw˙#Ď‹-Yr?^^ť[ľÁb±đöŰďË×*•Ї~ Ýôű÷$<"?żçž…h49]ph8µŐ•ś>}A/Oů|đÁG,^|ůůčßß>%óĘ+«Z+»ô'É8s¶• #ŇR4pŕŐĚ»xđ3‚——šóů…ô†6źúŽ—ZCnNžc¶5‚‚‰E­ń&ó\v» ˇ!!A„…Ů·†jSŮyŕÜhxĺ•U®ŐŘęęZjj´Ą÷Ŕ<řI!)©·<Ď++»Ř¸’ľÇ\ŽxŕÁŹ µŐUňoYŮéu:ô:Ý1r:ovtÂĎIßŘlR—V‰Ű§·}Żý÷ŁoÍďűŐg+~’Ű)lßW»}_Źţr#á{µ:“ÉLcsç^÷íˇ©I‡Ń|m˝Ý++«Q¨4ݦ/))ÇŰ7 ŰôŇv›>7ŻĐ𮹹´…ü‚b‚ľÇű‹ŠĘđčţŞtIi%>ľ~ť'ě"Ę/Őŕ奾jüŞŞ®jx[]˝ţŞđĐë č žQş‹¶4Ż#l6úvVkDQÄŰ»µ˘***ÁhlÂjUŤźźo·Ţm±Xř䓏©««ăŽ;î$**Ş[|ľĚfłĽ ĄR©0›|}tŐÔ& #V›ŤZÝ­8U{Čť$ű~_8C†®?gx űvvΰ= Í¸âîđrň±‡şbE=°ŁÍ^$IşCZ__źn˝Ŕé—5nÜúőKěÔ·,?ż€^Xθń÷ěćCU\TLMuýës­‰„Rć.¨äo/śgăVÝ{ŃŃ=Ĺ+kä«W˙ť.ÁČ»ďžŕŃG_"4´ëVŮl–ťk»“ÉĚ{ďľ‹·Z‚€ÉlăŐ×Â8uŞc6łŮĚ믿…(*3f$ii)Žř]K›a3íA_UÍ™őkŮ?¦GOfhHÇTÉ«Ź,ÇTZFňÝw±ä7Ou™Öfłq1§ßu¨*˝ČŤÍ&ěŽ`z%ĆvKˇŘl6.śË!hÍZŤMd%M§çüAÄôŠë¶‚*«®ĺ[“•ă°–„3|xĽ¬P:ÂŘ±ŁşÄËl2s!ý˙Y‹9cn%qf?ÂŁ"®—$ITžČŔööű”Ý4“¤iyŁy5Úâz~Ý÷ BCş•ßm*;łŮĚź_x‘ÉS'c2š8tđwÜ>·ÝS{Üa·ĚôxyyˇR©¸x±”ĺË—˛sçnŢzë]V®|©Sýúůr×=wďÓرő36őY»4Ůą L™ĺKź>Ő‡F˘7ÚČÎĘb@˙Düüş¦¨cb† RĄ`2YŘąóyę뺬ěĚf3ż{öĎ<ą|)aa.źN;Řo¬¶ďÚ!J YčÓ'™qcÓ0›-ĽúÚNßm±X()© --ŤÓ§38~üFŁ‘˘˘bţőŻtI~Cu5§žý3sĆRfÍŕWG˙ŔżFüťˇˇÇ;ˇŐjń«¸D™ťÝ%'Ę÷W“úÎHT1 ‡Đďp?>ÚöĆż™IÓ÷Šx”mŢĘŘ/ľD€˙áĂô>|Źľ ÇúĘ?é5đĘ᪪jxŞW_&řj8‰m´Ŕá[ayú}4”ÇŹđî»˙!-mx§s«ŐJőęś“Ť˛±ďłç8ĽŹŤß$3îß˙D©Vńî»ŕăăÝi¸ @słŽ°—Wvö,GňňH©bí#ë`=ô<ÍăS—]q~oT´;>7~ż|ę—477sřĐaÖ~ĽˇKĘnďŢ-,‡¨©6ĐÔhß^ĺĉS$%%0uę¤ď!j3P×ć“ââ8žĽtfořŁá0ľţix©¬ÄĹëĐĚHR3ţţm- őő5ś>˝•ňň2šÚ>dĽMÍf~˙ő6výńŹěúîä:b3b÷“Ë î>,<’¦Ć:Ľ˝˝©Ż«ćĚŮlNž:‡ŹŻ?ľľ]›ź+--Áb13jT wß}'FŁ‘‚‚ ]ÎCćëoĐ˙ŽąiÉĚQŰdřţ°ő÷lš±ľKôÉý’`ĚhĘdŇCíGq\ŽĆĆ&ÂľŚ@Hµřž=66 iqúÍSô‰ŹŹ7FŁÉq8‹Ť¦ý9׺şzbżř ëĐÁ96 úUU‘˙Ö;DüíŃhÔčőűép*%juÇs~[ŤFúhř ,›óĂő ¬?ťyóv‘q–ÔÔádgç0dHLJޒr’víĆś: ˙}öY/ Gv6ąë6pÎGĂС»lzyyQ>2Ťąąh†fxôb7ÇŇś×ĚDO€;:ť ňőőe㦍<˙Üó]bź_Ŕ?_e?v±Ń>÷ô׿gčPűPĚl6wahŐH^î.U¸BÇ´uGŰMWĚňĆlţgh2=5V±,öŁÇôŕőWß`ţü9ť~%wîÜEnîk HH˝Ěć®-ľ\¸PĚÉ~ý`ř0ŕÚN¶§j‘‡^ <úŘŁś-"C0yęd¬V+U—J;•ůС˙ ­·O öe7mZĂÓOżĐ)mbb_ŢĚËç‘…wqW|,ľľ.+ŇŰŰ»J9xŕ ű÷íżâŐbI’Ř»w?©©)‚ŔęŐďQQQEii)~řv—xDDڎN{ŇüăÄzDzeí&Ś»"9îú×ě3š±Ł»6ßŕççËž!»ąůâ-„Š„D%•d“Ťß0_,{ĺ-·ÜDIIi‡Š ((€ŻűOĺ¶Cź€ýđś NKŨ˛7ů… o٦¦¦SE0ęh۬ŘnU€¨ţ }zJnnäĂ×±dÉýËף'âGr[ŃaÔŘ•\6P©R“:ś3gÎŃż2GŽgذˇťĘf4yMŮ0˙WŚ\’ÉS÷fqÓó·°Wż—ÓÂ9†ĎîÚ4ÄĎW]ŮŮlëÖnâř‘LĆŚ±ß“$((eůň®(:;´Ú&O~ŚňňrFŚÁž=kijhűXµüó&^ţW‡+Î"ääăUˇCHľ2ą V „Da4ęQA(•]w±HLěË[KîŁgĎžřřtMÁ]-X­Vľřâ+JJJQ©T( †ŢĄÍ8ť‰™H|˛v«VÁĽy·đôÓ]_dŘ˝i3ź®gŘđˇôíݵzöńń&x^ď‡äĘţX$ ybBÁ·ô§´ľ„Ťż$<üaĽĽ:_lń÷÷Ăçö4ŢČÜĆ`­–Fŕ‚("ÄÇ“pÓ ´¬Yó1Ë—wŤŔäÉľ|ńËóś[ŃË(%¬µĘŔÝżÎ%44??_rrryýőťň ‹ áüŁř÷«'n4R T*•¨†#qÂĽĽTĽ˙ţ~ůË'ş$›Ůl!ß×6Cqq(µ…ZĐBĄT‰TäqSqG»Ęn˙ľ}-VdO¤§sçs;e¨ŐZxĺ_EDFúqţĽýžJĺÇĂżÜ%E†Í6ŠŠJ<@ss3•U—())'(°m%2sćdfÎśĚöŇ Šać˘1FŁŐjięâäŰ>ĎúőOR]]†·w>>±,YňH—hťHLLčËG_e (&€¤ą}‰ŽŽ¤qňnÉ’®Í™6‘Ŕ„>dĽsS3ˇ‰}éwÓ ""ÂčŮ۵?bWůňĘ+ěŮSHzş7ĚűďŻ#11A2d0Ë—wm!@ˇ}ďBňSS8µöSzŽJ#iâXíţ›Ë—/#)©kmÉĎĎ—ßçT±ćŔ^füÁHÚčÁ¬·~‚©ŢĚEoüúsĂ÷ÚŔh4a4KřuĎ©ł±±•ÚŤ×Őó¨ĎĘĘiµ_Ý̙ӷO~WTTŃ36«ąµ/_qńEöď?ŔÍ7ßÔć–NĹĹĄôëß}sC·ä;ţ©#R©Żëxď¶öť“ϸńc¨©Şě}Ţů Ś‘ж›ď/,,aČĐ46Ôw‹ľřbÉÉ čšŻ`¨”–WÓ;ľ'¦v¶ şR\ŞŞ§Gdp§ÇtV«•úF#!AÝsŰş:ťIPáëýÓđ»ü1á{ďzbłŮđ Łąˇ¶[ôV«ŤŔpšę»×ńşłŮJXDD·•ŤŃd!2ŞÚڪηŃBŹčÔŐ|ú(ęjŞ»Eo¶BhH0 őmŻlw ü}ij잲j4j%z]s牻ĄÚÁfîňbRgĐřbÔ5\•s,$IÂ/ ”ćĆîőŹËaµŮ Ł©ţęđű9AVvŐ•ínwěxđS…R©D…–[<˝ňĘ”••]Oą~–P(‚}ß•¶<đŔ®A©TňâK˙ÉŢŻdeWVVFtt4µµť›Č:ťŁŃŹŹO§™?w8Ďem &“‘żýýď¨U’$ńňËopéR-şZ0+ wň¤÷¤ďvz‰vŰá5—ĄíôöľŐvrŁŃČ‹˙ü;ááˇTWV—­ĆVTTđͶo°Ym”••ŰŇ1U§ÓńŘäÉ4dd;k˙ţň‹® ü3D]MU›gXüţ·$0ĐÎ>Y_VVĆgź˝ÔnČ‘ˇÁ€& ë>xžô×/˝$IŤ]NołÚ0ëͨ»¸ŘgµX±­xůví‹É‚d•PywÍÝĆl0#Ju×CĚz3‚B@éŐµô¦f µE7+06Qy«®ĹĚÚZV)çÚîřŐ/CPpËĆV’Ůl6öîŢ+G9KŻŢ˝ě™2›iĘÍe$pňlëł*ś°Z­lß¶ťÉS&·ŢSy©’’’RR[‡ˇ]޸„V«Ąß ˛ˇh[‹@µµžťˇ=đŕűAjłoŐŐµöhĄě$IBŁŃ0fśÝ#Řd2q2ý¤¬ěéżt)úW_eňŻÝ®ĺĺĺ;zŚŠŠ ćÎťËË/˝LXDËYĆW›ľ˘ňR%“§Lćŕ‚@TŹ(ĘJËČÉÎA[Żĺ¦›nB§Óńá>¤©ą‰%/ůާq]oŤFöď?Č´iS<0zŕÁU„Á`ŕŔCö­6mN‹Ĺ ĎŰä&Lś€FÝŇ2Óx{Ó d:x´iś>ušĆĆF’ú%1~ÂxŢyű´uZjkkŃjµDDDpđŔABBCHLLäbÉER†§púôijkj©ŞŞ"%5…˛Ň2Yáţa0yňÉßpäČ1ž{î®řPm<đ m ü)ŇÓOň—ż<Çś9łÚLצ˛S*•<óě3€Ë˛sÇŻ˙řG^ dÉ’%m2ŐjµäźĎ'((ŽqťýŘPß@l\,ˇˇˇÔÔÔŚŹŻĺeĺÄ÷Šgň”ÉśĎ=ŹĘK…Ĺjaęô©defµŘîé§ââb¦L™Č”)1 íÎăyŕW† Š1c*3fLĄ±±±ÝÁ6•]iI)ŰĎX­VüüZnŁýő_přĎfßČ‘Lś8±˝J©bŢmó0`ŤŤŤdge@hh(wÜy%K°‡ĆˇkÖałŮŕ䉓¨ĽTLť6•ƆF˛łłńńń!)©íM~*HJJ$))ńz‹á7’“űuéŕ÷VĘNˇPpÇ]wtH""˘Ý}Ú|ý|ŕŘęČßßź#]1šôë×R°ăÇŽ3wž=îvÖl— Fď.nđc…Á``ßŢ4·Ł«×_˝ó <đŕçÁŔľý'Đ5·ŽĆ1[‡v+Čnň´iLÎË»˘]5:BÚ´«ÂçÇŞę:JJ.¶ůlĆĚ©xyya¸˛CÝ<đŔ ˛˛†ŇŇ’6źÍľiF«ăľWD±sžÍö‘Ř—Q÷µűüjÄ`zŕÁĎIýé; ó„\őí¬V0™Ŕ}Ďʦ&đ»z§çÝĐ04°yµ=Áj1Z04´}ňš'ýŹ+˝$IXMÖ®§·IX-V$[×>~6› É"ałvmw›Őf‡ąk{ÜY-V,Ć®-¤YÍVQŔbčbz“‹ŮŇĺĂ©,& 6‹ ÁíŚ`‹Ő čúRÝRvŮYŮTWUS^VÎĹâ‹H’Ä„I°ZáË/!.’“í O݇˝{!8Ćşí4m±XX˙ézŞ««yhÉClúbuuu<Ľěa Ű·mgę´©( >^ű1şf‹ď_Ěgë?Ăh4ňŔCܡjšŤ'‚âHčW#‚¦1^ÁP·”]uU5ă'Ž—Żť+·[·Bh(|ű­ýź0ÄqÄúOÖ3bäÂÂÂČÎÎfÔQ ľůúI?žŽĹbaĚŘ1Ś;–‹/˛yÓfĆOOaA!‡fň”ÉÝß<ř˘Ű»fnݲ•ž—ţé:qňdČĚ„)S`Îxę)űßA ¶ÖĄčňóóIHL (8´´4âăă9“q†aÇqüřqRRSČ?źOxx8AdśÎ`ĐŕAřűűsöĚY""şvę–üaµZYż~ ţÇ«čt®ˇp]ŽŻŹćy¶dëş=g7kö,ŮMÄiŮůřŔý÷Cq1ôďoO—š ééđĐC-éGŤĹý Ăh2ňݡď9y˝`Đë0č۶µ÷ěŮÇ”©S®±Dü°qăvÎ +ăËAŰÉx&‹?=ü4ĹM&Şt&ţ6žOŇPi˛1.9ščč°ë-îuC{Äzť_ż–ǧvKŮ ˘ +8€ęj×®ąľľ.EçDj[áĎ9];wqć̦Ďα#ÇČ<—‰Z­ćŽ…wĐ»OoŞ««ijj"7'ťÎ>g·ĺŰ-ŤFćÍź×ŃŻ ‚BĐ·± ůçźmbâ¤ÖNŮxPTTNńÜbršr*Íä5šX6l}.\@çăÍŻĂúPĘ–ę\´ÚôúŽB¬f+’UB©Q˘R© ëř,ăź z EP› ĎüĎ˙ăĹ—ţŢâŘÖn)»qăŻě˝ö0uÚTů÷ŇG–¶zFXX˝ző’ďÍľiöUy÷µ„Éhčö™ü<1ţTV<|(ŕî´tz_("+ €×_ăěŁË™·ĺçŢXµ†AGv™÷Ń#xëÍç~8áŻ!$©í]O´Ú.ězâ\_Ô×7˛ö›ťLýx*ëÖńż÷ŻĹďŃߡ×hzĺ_¬ť0€IŻmaëGs8ŮPÍč1ú6Ť…öPQ^ôJ˙ăĹŞěŚ#uÚ:˘˘˘Z=ÓëőX,v?÷CĄ=đŕZˇYgŔËOŤ(ţ¸¶ŰŇë 4Ú ¬c \gâc{řMh_ÎÝú_Lúč[X's†ěć÷ż—řüsűöh]…ÁĐuß ×ܲłŮld8„ţíwPeçP2śÇç0nöĚăk<ř!`2Y0MÔÖ6˛´VÁ_ęJ†R©@Łůqě—ŕG”Z ű€ź0 TťŠ`Ö§§Ů·ď¦LŮϱc (ůLš”Ę·›?ě§Ó©XˇR0rÄŤ±!î•âš+»Ě=űţíď ;Nś ™¬Ű˙! /<Ďܧž”Ó]޸Ä믽ŽĹbaĘÔ)ěŮ˝ŤFĂś[ć’’Bff&&ىaDZů«ÍÜr«}¸Í_m¦čBuuuôęÝ‹   ůŮŠ—WĐŘŘHBbĺĺĺ475Ë=÷Ţ#;ňęőzŢYýAÁAÜu÷]|!3óO™ý™S^ĚńY7łmË×üŢäËŻęJ¸eňÎ\řřxłč¶yĽúô@ ăfĄ2¦W[ÂΑ©6’™©ĺŮ?±š3‰ŽŽfŕŔ^L™2şCžWęT|#âš*;]łă»ď2i¬X €H3Ůľb%ĺwÝIŹčDFErŰí·q±ř"!!!$%%1uúT>Zó)))|ľás† †^Ż';+Qinj¦˘˘‚G{ŤZĂŞ7VÉĘ®ŞŞŠĺ˙µŤFĂË/˝ĚcŹ?ĆýČËËcŕŔ€ýŽ·/`玝]("!±k'ł{đÓ@p°?’Η?-XeĺĽ0˝Š/­jB’¤»Ünß~€Ď÷m‘Ďť±š¬(Ľř+ü P´âÝŘŘÄ?ţńôU‘322Ś‚˙ěmużo_3äŃ/©÷EPxp ”ťŃ`¤čBŤĆŢ•™ëÖµHÓ}K–zm˝¬ě.ÇÉ“'Ůşe+Ďýů9 đ÷÷ÇËË‹¬sYL8Żľü A¸ů֛ٷoŰ·noĹ«şŞší[·CuU5Ż­|ŤŘ¸XYŃôîÝ›ÂÂB.]şt]ć=±±?\ú˛Š–ëÔ”FÂŢ˝üďˇ]ü_ź45Năń7yĺĄ"†rÍ/źJ?Ç{S6€OK>żŤů-Ďôzľ˙žA~˙Ű'&c“ńgk6XŻ bôWvjŤZ^ 0ŤäM˝ťŔŚcÄcߨNľ©)Dőh˝áÄôÓ‰‰‰!+3‹ęęjí_Öýű÷óČňG ÂjłŇŁG‚™1sjŤšűPr±µFMXX3fÎ@ŁŃpä»#<óě3üăo˙Ŕd2ÉĂجĚ,, ‘4·±OÖ Olě—>ĐěOru őő.FDrFgŔz<żo›čźRKX¤ z•ćʇ|NzOllǸ±±:‹ëltM‡±jµšá÷Mă‹mč‘—‡ŹŮLŽ("FE1ö‘ĄµHKHp>ľ>„‡‡‹$IÄĹĹ1lř0Nť<Ŕ„IäŻâ¸ńăر}=˘{0vÜXvlßAtĎhĆŚĂŽí;čŰSÚŢsď=TVVĘŽ‰ááŘw€¸¸8ĎöChhż‰Ń3Oç‡˙ǡ|véoř}ŐL3{LIßľ-#üü|‰Ů%÷É&!g|Oń‚ßs­řź>}XüĂgÄnáš/Pô:ﯾ໏×Q–“KDp0ă–-Ą_˙Ö+Dˇˇˇ„††¶¸çTr—_»»·Ü4ç¦.ËGQQ»wí >>žů ćw™ŢźőŚ>Ǥ¤Ă<ľb.ýű×ddDŃÔÔ:¤oéŇ»XĘ]ňő•Zš]A}}#~~ľ456cl6᧦ľľ‘Ŕ@ůąŻŻ«ŐJ` ?55ZTJĄššš:t:=ţ¨TJ||Ľ[Đ{ŕÂuq*Ž‹Ź#î÷ż˝Żnńńń<řĐ×[ ®ěš¦&’{ď9ÂäÉ}Y¶,üşÉłrĺ,^<źŻ6í¤˛¬šß=ó>ř47®’źß~űM:t‚   JâĚ™l.^,çĹżÎćŕ±t>ůäŇ҆`6›ąőÖilß~€qăRńńńîüW~ř…<ăççCję ¬V+U|ö™kż´sçňčׯgĎć1mĘ8 ‘úúFNć>''§€¬¬ó×Dîźş˝ĹSwaµZ9»{/™Ë–S4m;<ÍîŤ_b6™Żµ(ü pţ|۶íçÔ©LŽ=Ť^oŕر .^¬ ľľ‘#GNsß}·1cĆ8öď?FQQ)‡Ą_ł-”¦LŻŻ7S¦Ś&(4«ŐŠVŰ@MM‡ť`ܸ4‚‚;6… Ö®ÝDPP =zF°{˙nżý&RR±{÷a,Ĺ3Ďü‚ţý=sÍmáš[vY»÷ŃóŹ˙CđčQpęIśbݡŹiřßç÷›§ät›ľÜÄÜysÉÎʦˇ±‘#G˛éËMĚš=‹­[¶2cć AŕĂ5RQ^Á-·ŢBqq±L#*DůřE˝^ĎʋE÷-ş!w8ö mřúú••G` ?őőŤ<ÎÁéřúúđŐ7;Y°`{÷ÁŰ[Cii{÷áüůk;š–6@zĹ÷$( “ÉĚ!Éhµ ,\8‡ćf11QôčA\\Oš›u Ú­¶üś"öî=B@€K—ŢEm­=řýÖ[§]3ůJ¸NĹď7Ůź&~đ9;µFM|Żx"Ł"ńńńáüôŰÉL€(ÇáTś–Ö"â!&6†şş:¦NťĘ¸ ă(-)ĹßߣŃHCC^^^lův ~>~,\¸ŰvÉ}ÜÇŚ™3ZČźźOYi=Ł{ŇŘĐřCgąš›hnÖµúç9FŃ®®é0ÖKíEę}ÓŘ´}0‘ŮŮx›Íä‰"bĎžŚtArÚćÍźGl\,óćĎ#şg4˝űô¦gLOŞ*«0[ĚdžËäŔţ,ľ1U•öŐ«äädŚF#………řúú’—›Ghhč5ž=›É«˙~­ÍíŁëęjŻŮpÉ~î¸ć ‰qç—źsä“őTććĚ؇"©_R«´C†ió7Ř#˘ŁŁĺ{=zŘ-èQT”W°cÇůţőÚá8mDŻľľ˘Ýç’$ˇovY›žŘŘ#˝çÜŘNŇß±±m!6.–اőľ#ŞG‹ďűé…îxbcoŚôžŘŘŽqĂÇĆşŁąą“É„BTČAýxŕ?®ą˛łZ­dîÚůť÷đĘÍĺ|đ0ü—ĎfÂĽ[Úµh<đŕ§I’¨©®'ëëH@Đ€ţ$îůŁŮůç†kżSń®=Ä>ó,AŁF† $’Áşď>á›g˙Äüßý¦eÚĚL>ßđ9ÓgL'22’Őo®ĆÇׇYłgQZZĘüŰ\ű§NžÂfł‘’šÂ‰ô|óő7DFF2nü8>\ó!˘(˛üż–Ë.)ÍÍÍĽ˙Ţűřxűpďâ{=ŽĆ\UH’Dޡ ŻĽĂřÓXµő|5“wŚâΞđ(Ľë€kŞěš››1żűAŁGÂko ĆîTĽĺŤU”-ľ—čžö‡â˘bŽ=Ć3Ď>ö­Ű¸Px„„&N™Č»«ßĹÇ×§…˛ŰüŐfRRSصs=ü QBˇ`ĘÔ)řűű·đ˝ÓÖi™;w.űöí#??ź~ün{đÓNgŔú÷×2}*TUˇĐj™]‘ÁkŻźĺHr/&-˝˝EúŹ>ţ’íg Pµś°W…·ą+˛Ĺl⏿]ţćáFĂ5w*¶ć\„őZ¤©LF# ő ˛˛ÓjµS^^Îţ˝űéŐ»yąyxűxŁ­×âăëÚ>67'___DQ$+3‹ű͛7cłÚX|Ű‹=czRRRBuUµçt3®:NÍaü±cĐŘ™Y¨€~6é[µRvéçĎňém_·âózÂë,‰ZŇęţóĎţé‘űFĆ5Ý©Řd4Q0óvü3ŽĐŰńň ŕ4ŕ7r„=öŰôôtšššH€=&md%%%ÔkëÉËËĂ[ăÍŢ={ĺ]Ž÷íŰG||<'M$ăTYކv9rssŃÖi ».;{pcB’$MME3^ qk @äY»¸öNĹ‹§łiÇ0Â33ŃLä‹"bl,–?B` Ë©888ů·Ígë·[™·}'ÖwßCť›Çů ax?:“‰ ćy|ÝđÄĆ^«ô ĆF,f ‘š-J‹˝;$ôB!ş…1™Á`6´Ë˙ô‰,$I¤7‘“SQgdâč‘lŢĽ“ŇŠJnť5•đđV­^KźXššuśËČe쨻ÉRä2wÚt łJřjË-ěÚaOžŘŘź@lěąť»‰{îy‚FŽ€Ď7Ň—ł|rôSľ=Ń[e IDATąPČmřťś.¦G0ŹŢ7’r-űżËC©ÉČ*@ŁV2sŇvěĎĆf“¸gţ"Âüٶ7“¤>‘lÚv€[gáÓM餉Ăd˛r&»´…,#‡÷bĘŘ~lÚzš¬ó×®:€'6öę§7YMčV[qC)VÉŠżĘ‹ĹJ¨}Ľ{}/ţJµ’ ró/Â;ďŻgüřTľű⛾z›Ď?ßÂ7;ö (Er Ńé ¨4*‚ý™í=Á‡ÂCe4ů6R-ÔăßůčÂű#ŹŤmnjĆňÎ{ŤH…×ÝśŠM&ľ]őĄ÷-¦gLO‚Ľů.˝‹eµĚť5”“g‹ee7(ą'’˘il6RS×D]˝Žu_#>&”s†SSׄB!r۬a|ş)ťéě;·^®ě |üĹ1nť1äGŁě<řţh05a“l4™š¨Öע•ř(í‡çôMD)Ú›˝ˇÁ€ĆűűŤĚcŹ-âŤ7>bٲ»P*,[v7+^|—}űŽ›[HTT8fł…;9ĆĆfľřbÁš ¶lŮGéĹ n›7 µÂ‹‹ ĄDř†ŁVx˘,®&®ąS±%Ż>ű¬EšŔd2µÚXsÁśáśÉ*ĺäŮ‹-î§ Ť'+Żś!ý{˛âí]řjXzďx=ω˙ĎŢ{ǵyžű˙oM„„@€ŘŚm†÷Â{Ĺ;ŽÇŽ'']IwÓś~OĎéř5ÇmOsÜÖ§iÓ¦Mâx&qĽâÇ{ŕ‰'{ď˝HhKüţPŚCŰ ő~˝xéAşźűą.Ýăs]WZ)F;ŇWßĚ,'~x-:#n1Ńáj KëŰűÉÎŻfîô´č }só.úłÍ‚ޢGgŃSÝ\Ř(ĆC˘@$â!U0Ö?±Ďmxíµµżýí5´µµńę«k‘yĘ7oZ‡öJĄ‚§ź^Ęúő`Ѣ™üÇĽćČz"wŁ^ß@qs)‘^á.‡×‹ôݍŘl¦hńSx¤^"áČT| đ2ą=zâ6{ßŕЉ4Ćć2at8ĂŁJEŘím…´:# gÇÓŞ7ńĹéLÍqčĺr ޱŰŰ‹ bÚÄhŞk…Hf%Ĺvpv‹fÇSTÖ@|l .Zł›ÝF…® ‹ÝŠX(F!‘ŁČIôŮëE¬ű ™Ě­Cmׯ®˝©ĺľ¨d^ä4 ró$DÔU.î“ţKĄL|á1öźŹOzî&…"˘đpf˝öť©žJ+iĐ8"ŠËW“0<¬üjöąIm˝•‘HČđč†ńŃľÔ> ękk#·°€ě|ÇăČa„‡řŕ.s¬[dÔ0>1Śm»Żôçźá‘Łąą‹ĹŠÝdëÖiÍ:ÜŲö)&€ĹfÁh4ˇ·¨58ľ¤<$ DB±ŢŃHż6ęąźÍ gG,“ A­ľŢ5­í%ú}"&>Žg÷ěâĘî=ÔĺĺŞR1íĄuD‹îĐ®Ek¤Eëxó6·Ř{äf§ľ›ôÔ5čÚź«oĽs|ŰYŢ&;ż†ŮI±x«±°§.ätŮŻ‹ŢÁb±’vč˘>AZ^ENĐd<ż‘ÄŚÇg ýr!Űb·R­«!ąâ2“Ćă+ó¦RWŤŮns^B/äb÷~™Ž:#ţrµkZŰK Î.8$•?ü~·Ż»IĹŚÖ7SËšz-5ő޵Á /‚üąĹ˝KúŢÓ ˙×ÇxÄDĂŃ„gf˛ăâN,ż˙9‹ľó4ZłŽ5i6—`Ô›8\|’U$A¸‰Ü0éĚ6k×ÚŁ¦¦fĽ}ĽűŮšţˇˇˇéć]xÄÇĂ»˙@LĐë9÷ŹmŚ_µ«»‘pĎĽe^ě9t„ß§üľŚ¸z3âMbÜc€®§¦—/]ćĺu ‰Źďf8‘ÓÚšÖ:ĘZ*Q»y#˘g˛ ú_Tlµ‘qä(öM›ĺĺ“§ôŰ łú)܆෴ѠG"•vY]ě÷żűo®˙˙úݦţŔh4c/n€˙ěđ|`00L„ű´?_ҶB‚ă÷ycć1Q9±-(ü¨Ó7PŇRN{0R\ÓÚžŇ˙˘âă'‰řÝďđš8>ŰO™|ru7‡Š‹Yő‹˙ěĐ655•ýűö3g«Yýôjňóňąyă&WS®âˇôŕůµĎŁŃhřüđç,\´ŇŇRV?˝š+—ŻHxx8Z­–-nA*•ň‹/ŕ.wď·{¶Űí4ÔŐtzľĄE×EëˇŹŹ’3sâVF$ J€l@=k*juiŽ*/˙-…’BÜÝ˙ŹĘĘĘîŐíëC?ą/ž˛kóńĂ—`×´¶' €¨řĽĆŤí *žl6sř_ďSńŇK„„9DĹ%Ĺ%ÜĽq“_üędefńůáĎ7’Ś´ rss‰Í´éÓĐh4¶·ËÎĘćÔÉS4išŢ(…㉍Öé6»S˙÷ Wúj?}ż_ĄżęĆŞ¤Jęô ä·* ęÖáąbc@T\˛dŠÔ‹ űňâ|)*NJjŕúő뤥ĄQR\‚··7O®z’”+)ůüÁÁÁ ‹†§Ň“3§Ď––FYi‘üâWżŕOţÄĚY3ŰS®äPQQĘK…ÉhęëŰî’üŕ5–-[LttT·m[llŤ¦‹ĹBHH ůů%DF† ‰°Ůl(•GŞ­žCtt8 UŤúÝ-*ëëhmŐăá!'*ʱ+ˇŐ¶R\\NLL8rą»SŢŻ3ÖŤ ó Álł§)Ä[˘"Ř# S{Wl,ôĚ­öQńBŽMšÄÇ2»€ŹD" Æ1廯¶§^đRy±ňÉ•ä0aâV?˝€a1¬~f5ţţäŕîîβǗQ_Ŕ¤É“ÚŰ˝¸îEęëęIKM#-5 ˇHH[[Ń1Ńý>…ý*wstŤôŚ\ÎśąLJJ*ź}vśť;±yó22rąpá:çĎ_ĺ?˙s:]+ď>DŰ0-)űr©¨¨ćř••wÖ2őz%l۶o niĐ"IHPŹ@€rm%f›y Mr:ú}":nĎíŢIĘŢϨËĎ'\Ąbę‹k‰ę ¨TŞö b·ł űřřŕăăC\\\‡¶·Űůůů9ýý¨­­ĺĆŤřűű3{NÇiRĐÔÔÄÁ‡1čő]ľ69râ,ßü泼ýöf""B))©@Łi&..€ÖVś`ٲą8p‚ČĐ`n¤gˇ.‰ćŮ×'qćĚe¦OżłÜ FŁiF©t@zP=ü©Ó7PÜ\F¤Wkď+tpv«ź^E}mďf˙ éÔ§D,`Ú×ňvőöuÁ1lť1=©OŻq/ęęęËeťä^xń9är9FýŕÜ•Mš8–[·˛3&žśś¦LKhh ii9ČdnÔŐ5âçç§§'O^ŕŐo¬%,:„Ź˙r”şŚÎEŽ´Z&ŚâÔ©‹p7C?ą/^nJň4…řČĽ ębZű(Ňîě ÎÇhpeéM‚‚ę>Űd4ŇÖv NÄŚiIÍÎĆh4ńôÓKÉÉ)DĄň⥗&sö¬#ŢřŐW×âďďËŃT—×ŃÜŞĺŐ7žĄôT«W/ ?ż˝Ţ€^o ¦¦žuëV äm ¤") ę‘Téj(×Vâ#öF2p1NA‡»×i›Ę”ɓǶŹÓ~ĽbĹ‚íFŽŚ!28¤}Áľ5Ł_»c·˝şş–ĆĆfüü|;ťçâáň N_O©¶śpŹ$ôlb(ŇîěÚÚÚ8~ü :ť«†j˛`á|ňˇ9r/Ľ"d4—đ‹W0cƤ6gHă'Wă!R[_H€ÝŹ@˙6i@č0˛;xđsžĺĺ2Ą{ŚZACsÝ!$4„fMĂ ťĘ>(Á=ąüçRÂgZ‘z<ÚÓ«ţ@"ď3śz[#ĺÚ*üĺj¤˘Gk”×á]& Y¸tń@ŮŇ-ş Ăb†Žd㫠Ħ‰ł0VIÍ-aÓU÷ně˘W¸=­-i)#Â3ô‘Ú­íň+µ¶¦˙€žŹ¤jkjđöńAŰŇ‚ŹŻoŻ÷uZ[[ÉÍÍ%&&‘PDnžăŘÓÓťNG[[JĄ­VK~~>±±±Řív ;…‡KŇŕLřŹRői­ËŮő3~r5žROr5…řąű śÓÚ††F:„ŃĐ9JĄąąóţC—ÎnÇć­üřgoewfz:ÁAxűř•žA`p0*oŮ™řđomŕµý€ĆĆF Ú-1ĂbČÉĘF"•0âkš¸AߪgĎî=x{{S_€D,A$q!ůßűÁ÷Řşy+mmm|÷űßĺŘŃcHĄR.]Ľ„żż?nnn\ľt™W_{őˇípŃ{ČŐRä~RęłZQÇąľú7±”DőH*uŐ”k+ń—ű şimşvÔŻ}÷ŰDŁ3îąX˛o÷<=•ś:~‚Đ<˝ĽČLĎŔ?Ŕź×®ÓŘĐ€N§Ąľ®Ž ç’ŠD„„†pëĆ 2ŇŇ™0i"uµuĚ=ëˇn,++ µŻš%Ë–´?§Óéř×»˙B§Óa4hµZV=µŠÍnFéˇä©ŐOńá˘T*ďŇ»ó0”bc{Ň>`ĽŚĽőx„t öwGĹĆ>lÝXTÔęë)h-"Ä-¨Ýá †ŘŘ@u Föč|čł+-.ćÇ?{ôÔ4JKJůńĎŢ ¦şšs§ĎźŔG[·1vüxBĂĂ1›Íř0yjmŮF|b§LćÂŮäÔrąśÖVÇNqUeJO%{wďĺ…u/|6™’’gNźa„ ĽôňK¬s=U•UĽüĘˬsýCŰĐ ¶Ř؇m/ó”˝ ˇP‚ÔCtĎö}mOoµďĎŘŘžp·ŘŘpĎPLVyš"ü¤ľ(üEl¬Ý ÄÔ90©[ş´ĚWíËĆ·6 ‹Y˛üq6ľµĐ°PFŹfă[‹'>1_#>1ĄRIfz:QŃŃ477łëŁO·đ1ޫޑH$˝’Ť7.>ŽššÖżąž 'PXXHnN.6» «ŐĘĆżlŕ˝˝GZZďż÷>S§M%őV*ďż÷>Ó¦O»Ç\ ˇÓ˝(;ßD̢ľ[ďuqwÜÄn$úŤ¤B[E…¶ oˇRńĐÚĽčŇŮ˝řĘżuř}DÜČö㸄řöăřÄ»A3ÎńřŘâEj_ć̝ÜąsîÚć›ßú& -lnŃ’Ţąľ3RRRÁ‡[ŕéÁk/ľ8¦8G2ĘqłÚ™?.r` ě!“˝H^_ěrvN@2Z}=ĄÚ "ĽÂˇ¨‹wŇÖÖ†Iď|ábłťvpĆŹŢ ‰ôá„M&3[v~Áµ_grâďÇńŰĄ¦I@x 7°*4´bL+ĄąFĂóŹŤé%«űßáîÔg·˘éÚ¨hüĺj¸“ŰX@—?ţ ż6©Wčä¶m¶ž%÷ëOÚěv,Ë@›Ńë|uýáAhkkĂĺ(Bą˝ŢŔ‰pÎ…ŹŔ*ShµpV$bŤöO[¬Üş•u×ţĚ­&¤Š;kFQQařúöŹ,$b®7Y»j]ÎÎI Ą$řŽ Ú\GĹ—"dÉ Ű­ý:śť@ @®ô([şĹn¶ Ů*\z]Ëź+•J°éuĽ@óŮ&ÜßAX}=ő“§¶}+&Ą'úËđ:ÖÄÁšVÖ|ü4|™ćµŕ×Xč˝đk=ŠáËĽ¦U•UäĺłfÍň¶ď~űIq÷•PźŁG=BŢ/×tqoBżśÖ·”é6¨^·r»ÝN]m_ ÓŞ®ŞBí燦±?‡ĆĹb±ĐPWŹX"Aí§îC[[[ÉĚČDᡠ<<›Í†—ם‚+„„82gggŁmŃ22n$---íĎßnÓÔÔ„D"iĎbٶpLmo^»Nue˙°ŞĘJJŠŠ©«­Ĺb±PUQɉŁÇřđ_ďQ]YĐţŘ[dgeóĹç_r%…­›·růŇĺö×232ůŕ˝H˝•JZjç“ĎÓĐĐŔÉă'ůŃ÷DVfׯ]ç?ţÝQ‹vˇ[ضe[ŻÚ7”Rć^F‘˝*á[Ćľźr4JŢZĂî‚o!ýŁ…_ýę"żüĄTYŽźâŤ\Iéö'55µßď'$É‹ş fťó-Ą<ęČÄn$úĹa¶™©ĐVa±9–•rę%čÍ‚{śítéěěv;eĄĄ¨ýÔÔT×°÷ÓÝh4N?Áh ą©™ ç’ůl÷^ ó 8}â$W.^Âh0pěČŞ*+ŮőÉÎ^7Vé©D!W`¶tL9]R\BpHpűŁV«E 0ď±y„†…rúÔiÎ'ź' 0€¦¦&­­­íş˝ÁĘsĎ=Žń˝°‚Ű'n¬[·’s(YöÇkŚxKĤ| Ó¦ĺsá‚;ááě{îźě rüL·ĹŇP›Őá§şřVű±\ŞcöěÉ÷6˘—QÇ+¨ĎÜ˙—ˇL¨2‰PBIK9ł%<µ#‚ĆÁ1µír[^VFIQ1V«•=źěÄd2±úąg¨Ş¬¤¦şš°đ0”žJ$)GΚu/ŇP_Źźż?Kžxś-ď}@Âč»ËRťVGhX(aa479bß´Z-ÇŹÇŰÇ›ô´tĆOĎ+ßx…ě¬l¶nŢŠZ­Ćh2"ŠP©T?vśŇŇRL&—/^fŢcózÝÎţbřđ(fŞ'SöŰ*Ü•2bc#řُĺD?ެ%ŔĎĚ/~ĺ‹Nç››”Ĺ‹ďĹrż"Űľ hĽ’¬ÝuOꢮ¬ §Ŕ_ˇ¦AďÍÖ[Řěöf)řyR+uuM´ @&sĂÇÇů"–ştvÎ&ó§wŢŕă­Ű?i"ßÚ@xDŢ>>¤ŢĽ…źżłćÎĺÜéłĹb‚ČÉĘÂ××בőxI÷ëA‚Bˇ`îüą$MM"==ťŹ¶Ä•ËW5jkÖ®a⤉ܸ~ěělŇÓŇŃjµLź1ťâ˘bËĺ¤\IAۢĺ˙řżlzSŻÚ8ĽöíµĽĆÚößcb‚xűm6µÚ µzđ“–űI‘y‹iČmEŘ3u˝‹ţ'ÎOÄ'Ďj8YXŤÉ¤ăÚödĽ6ďÄMÓĚĄx˝4YOÎE"qťž ¬˘¨­ľ¶šźüäç…B>Řąăˇ:Ôétś:vśĺO®Ľwăžö9ÄS<5ÔŐĐÖÖĆż˙ű/Ůľé·Ý†‹ő¤ŽęPhŻŻ3“wPCÂóľNaĎ´żŰăö_ĆĆö4Üęvl¬HÚł/„۱±"IĎÚߎŤŠď-Ź:÷îVfťOÇÍS ;wŃ lQ(ţÖ/™ţtÇ”qőő J°Űq®Á˝×űĆŹO@Đ&@$uŤ5ۤěîw=W P_[ÍĆŤ˙č,*6>¤¨X,±`Ѣ‡îç«XĚf´-Ú{7dtĺÔµŘŘ®¸/k·€Ěoŕíyö)6¶+zYOôžă¸Ť ›6 Ć¶¶’ňáN&®^€—×ŐĂąCW1Y•÷ȎÇ7&/ąGďÇƶ9ٍ¸­Í)Ĺ΋ÝŢłŚŹ"!I^T¦hń\á|şOwĐëMŘ«ŤíŽî6•€ľŐĹŇ9 ĘŚ™36lXŹú/**ę 3.DĹîN(*¶™-¨Ľ‡f‚ÇVÝÝ‹•—;$l6;|ť®•'ÎłiÓ§ÔÔÔłoßQ>üp7‹•wßýO?=ŚFÓĚŢ˝_ Óµb6[(**g÷î#]~ű:ĘP1Ťą÷1OqŃďČĺ2ĆľşŁůX"á#ŕswwDÓ¦0ýĹÇ‘~-ţ{Îś)¨”F45Ů47ć˘kÎżëĎcóńňęťťÝ.'ä;·Ôž©ŘfłqăÚ5BðŰ퇄PYQ@7Ż_'<"˘Cűľ˘˛˛’´´4LF&“‰‰“zÇ۶lŮ Ŕ¬Y“ąz5ŤŇŇ Ěf UUuúqĺJ**•'WݦâéyçÍ‘‘‘‹Ýn#==­V‡R©ŕúő FŤÉĚ™“0M„„8g1ŁŕIžk!pĽóÉ\ÜatR"^źüŤ”˝Ç1´čÄ„e3 čâäOP˙ýçłłÚÎ{nýěúč*+*¨Ż«'aT"łçĎcĎ';ńU«©©®FŁŃŕăăóІ܋ŕŕ`¦OźÎűď˝OŇÔ¤>żž3±ví ¶o˙Ś5Ď-§¬¬Š˛˛*ĚfG–WµÚwww¬Vb± frćĚ%¬V+—®ÜdÇÎý<óĚ2ššZřěłăL0 ­VÇ•+·7.a oí®Čý¤¸y‰hĚ×ă3ĚBÖźdfćѢmĹG­˘­ÍNKK+‰‰Ăńôô --‡ČČP¬V+‰6‹‰¨™Ł1Y,řúŞ0›šoŢĚDŻ7˘V{ÓÚŞÇ`01n\<˘/'•µµ äç—0aB"nn}›?ďžűĘĺeeLś2™qÇłrő*vnßATL4ĺĺLś2™±ăÇő©·Ńiu¸»»łxÉb úĺšÎŔóĎ?Att8k×® **ڶ¶6V­Z̰aDG‡óâ‹Ob0xöŮe<˙ü k×®üňŘČ /¬ä±Ç¦óÄóY¶l.ąÜťĺËçŁV{łpá̾Żâ.Łą¤ç©Ó]ô&ł™÷Ţű“ÉĚ|ŠÁ``ëÖ˝h4Íüď˙ţ“‹ŻqéŇ rr ŘĽy7›69Ú™Lf6ov,ŁĽ˙ţN fłąýřö2 8fŽ_®ŻčŇٰń­ üőOYąú)®]IA$!W( ĺń•+XńÔ“\»’‚X,!řË@űľÄŢfgűöíśO>ĎĉŹÎ6::ĽĂcLLóćMm]$1ţtćĚI"66’ůó§ĚđáQĚťťÄ¬YŽ/©TJtt8óçOgćLGQj™ĚÍi§°· ›®˘6U‡YçśëŠC•qcŠ eüřš›µěÜyQŁF°gĎfΜĮ]G‹Ć•+·¸té“§ŚĄ±±™‹op'Q@C†‹očO}˝†ť;uQů“™™Źź_ßĎ»śĆ®Y÷b‡ßżş÷ĚÚ5 9’á#GŇ_xzzňý|żß®çÂyžěIĺ•"çőýÂEg˘˘Â:ub±ôô<–/źGccőőŤx{{±mŰ>ŢüŐŹůâčćÎťŠFÓL}˝†óçŻááˇ`îÜ©44hHLÎčŃ#‹ď¸ťÚÚzĆŹO$##·Ď¨¸Őůvż,f3-Íž÷ÍY‘öńĹP!lşŠäőĹ.g×Ϭ]»˘ý1**Ś˘˘2~řĂ—Š cĚ8$1‘‘ˇÄÇǢTz°fÍr &3‹•çź_ŽNgŕąç–c2™±Z­úą~#łÍ °Zm¬[·ŞĎď§ł¨¸­gĄÜú“¶¶6§´ëaŠ÷ÔW¨˘dh xGß=<ČEďÖĺ#€ŻďťťVµÚ‹Á¤IczîFyqf›…ââz&0~X:‹Š=ś/ˇĄÍdĆK5x‚Ůď‡VmGQńŁV7¶§í“ää¨eĚżużĆčLö–ş±ÝŃ×ucÇŹJ@   {ô7ęŞn¬Ő&zž^Ş[7\VRBuU5“’¦txľĽ¬ŚĐ°°nÎę;´Z-ł_ZZZ°Z­]J^šššP©Th4„Ba‡ŚĆÎŽ+6¶ëö2OŘšŠ$H]kłśÉţG%6¶˝ý ¨ŰĺnlIQ1—/^Âd2ńŮ®=Řl6._¸HyißÚ@UeĹ…E\»’Ňó+=$ą9ą|˙»Ž Š˙úůq5ĺ*iiiÜşy €ÔÔTRoĄrëć-Ξ9Kjj*Ť†’âÎť=GzZ:7nÜ ==˝ßěvŃ{}ąQáÂĹĐĄŢűé.~üł7(-.ˇ¶¦†ógĎqíJ Ő•U´µµˇÓjyďď˙@íçG}]‹–-ícýüٲy 2™Śňňr._şLKK ·nÝÂn·ăííMsS3©©©466ŇÜÜLKs ľľľČd2®_żNzZ:‹…A^őţ IDATWżű*#FŚč»]Ü›&Ł€}™Ľ<Ţ‘Ýć\±Śś*wÇ›9ś+gb‰ń3T\ţS)Á“=»ÝąpŃ]Žě‚CB¨(/ÇfłqĺÂ%Ş**™”4…ĘĘJÂÂĂńđÇMćFŇ´©ö›±”—á(¤‚P(lnöśŮx©ĽxbĹŽ6_îŕŽ?ŽĐ°PJŠKìYłPz¸BśŠ6eÍwľ{ŻUş$3ňiş’iá&Î;6&TŃî49_mcÎO—Înőšg9ć,ű÷ěĺ‡oĽÎ¤¤)\OąĘä¤)řůű“›ťC\B7oÜ$0(¨_ őPz0mÚ4"##™÷ŘwŢÜNçŚë"”múŚé}dˇ‹‡ˇ¤IDył*­Ëe2&›Č©’±:QËçąrfE:Fsr?)R…¦"Ş(— ĹEĎé$*6蜯˛“Ůdn/°3”psëŮÎŰŁ@„ĘƆ% ¬NtĽ'ů8v?ż=©c–jŻGĽ¬ËŮą¸:Ťěz’ľżŕśvąÂg96*‚&ą6*\ôśN˘b™ÂůRéXŤ&<˝†fi=ÝĐ+­Ń/MTR•ŇBÄśÎ9Ó\¸čŠnuvçĎžŁĽ¬ŚŇ’’ţ¶©[ZZZhhpLunÝĽĹők×Ř"Eř,o×F…‹ű˘Kg·ű“ťH$vĽ“ОrlVçĎžŁ˘Ľ«ŐĘůłç¨¬¨Ŕb±pţě9Ş*+1›Íś?{ŽęĘŞ>1´ĄĄ…?üţ¤\IˇĽĽś’ⲳłą–r­O®çÂůń wŁ©Ä%CqŃ3şŤí°Í půÂE ó ¨­©áŔŢ}Ś7ŽŘa¤\ĽLss ő Ţ€y ť‘IC}=O¬z˛× Ěž3»ÝNhh(ˇˇˇ:x¨C¬ÜPŔŰóöޱ>-‡ I$ý4tŔíů*®ŘŘ{´7۰Zٶ{BźĆĆJÝÜxćůçřdŰŞ«Ş5wĺĺ±fÝ ”—đÉöĚ™?ŹĘŠJ"Ł˘Édh5=ľřý T*ńńńˇľŢQ•čÜŮs( ĆOß'×(\±±=kýÝ n}XEÍ r_)2O™SŮ˝;Nɤ¤)ÎSĎ>Ăůłç‰D<±ęI6ľµ´[·XőĚjÎź=‡D"Án·“ré2â˙ (=•řúúR^^ζ-ŰH>—LaAaź]Ď…ó2ţ;!Lü~(yĎF.\t醟zö™NÇ_ÍVÜ“ăľŕ«±¬ďľ÷nź^Ë…ó3jm  óÓZĚ­CŻş‹ŢeŠM4išÚŚ^ÇMć?,‰kQÇ+qThvᢇ¨X @$zâQgü[FÇ))/ŻŁµŮ€Źż'~~Ş6É…2hDĹJϡ¸ŻsĄg{(t:i˙ÜMŕ¶Ý(´:’#gâţâćŻY„DŇłĹrŹÝľl6•ĺ„E8JřY­VŞ+« ď˙,Ĺ·ąqýf‹™)Sú7 ç%ý/;ž‡dÄŘ»ź˛|pmîŘ™˝ny‡¶ĺĺŐdeĺ·˙nÖ›‘Ęďľ›9wnR‡jX./Ýëě,~¶źEK—PYQÁŘńă8¸ď3FŤĂôY3ÉĎÍŁ¶¦†i3gô‹ˇ•••T”W`0hkk#))©_®ëÂy).®&äă}H&N€ Ćëő¤|đ)ăźśŹRyg¦rôč9ľŰřK¸K„ŮSę§řAđřäăO:u.g7¸ëľ˝ÉhäđţEb>Ű˝—Ë."ŘőŃ'Ř»ŹęŞ*n^żŃ/†3~Âx˛łłQűŞď}‚‹!ŹÁ`ĆŘH»Ł»M`0°u%¸$t˙4.¤©I$MM"""˘ooŔEżŇĄłűxëvŔ±;+‘H5v µ55„„…’8z őLť1ÚŔĎĎŻ_ mnnF"‘°xÉb úĺš.ś“–3MM&$§gL!0ZŕP DŻ^ЇG) n—»˙)9[ÂŃ/Žrô‹ŁäääôĎ ąčşźĎ=‹wßţĎ˝¸–ógĎńţ»ď˛ę™§9rč›ßű€ŐkžĺÜéłÔVW÷[ˇg‘HÄî]»1›Í¬{y]ż\Ó…s`6ŰĐë­X,vL&D"QQ>~şŠ#e\NuÔiR*!r,I+v¸?ţř<ŠbďôŰíšťC–˙ňşE¸»÷<ÂÂ…s#(«(j«Ż­ć'?ů9Bˇvîh›:ˇkĐ0,&j Íčęk«i¨«ˇ­­Ť˙÷_˛}Óo» łš¬=ßěíµZ3&ł $„´!´! qwď|~MŤ†K‡“±›Śř…âe‹ĆŰ×Điw/ˇŮ—öߎŤíqű/cc{nu;6V$í™$ëvl¬HŇłö·cc…âžE¨ÜŽŤýj8×]Ű›míuc{‚ŐlE$uŤ5ۤěwOŕ*¨Ż­făĆt뵺]Ľ?1M}s;ČdťG Źjl¬VkĆjmĂ`°`·‡‡”¦(ČńĆßßFH‘{2Ď6Ş«…TW‹;ÖLU•¬oÔ‰ţ`•4ŁŤ¦&!W¶k«Íäµú3y˛÷Ż|&Nť’áďo#&L늍톡ŰÉ2gď „B$’žg7,ôô[m(b±ŘĐé¬_qnb$!žžrD_ľˇO ·©¬rň¤Ś… Śmá‹/ÜąySJLŚ…íŰŚÓBPýČŹ_ş7‘“#áV©ŠÓąlľáDbgÚ4sűµ˝˝m;ćŽj…ގ™ÖEt»Éť/ŻżĹ`ÄCé1Đfô ÚGDTl±ŘiŃZĐ™Ű0mD”JIçÖÍÍBD˘6nKÝŞ«Ž/<ÜĆ©S2ĆŚ±pü¸‚•+-Ěžm$%EŠJe'0ĐFrK qîUĽűn ăĆ5´ŹîěvĐj¸J€ÍŇŠ6|}í3ńńäň6‚mä盉ŤucěŘVŞË¬DĆ:úĺÇÚsp°_i%ÝHO÷Ŕ××ĆÓO·âíÝłD™.†]ľóć<6Ź]}ÂqcIš>ťźżţ!ˇ!  WČůl÷^~üł7řl÷^ z=cĆŹŁ ż€ř„r˛˛0Ś˝îěôz=ţţţ¨ýÔ466öjß. ĺjGę®s¤ńĎ}Ă3KžŔh4s­®•ßű„˛-§ ‘HH` O»~ÍjµŁŃ±ŮSÓŻ;·‡EĄjC¦p8$oo;'š;ĽlĂn7ęµXąý–ľ“%iť7ţŁżÇ=‘¸ 5ĘŚT ĆGd Á….ß‘&ىüô'xxzňéGŁR©·h§L& 0p¤m/+)E$3zěXlV+aáLJš‚ŐÚłÔĚ.ś‡/ľ8OÉ“ĺ\[uŤżŮƱ¬ –‹Ůه’€@ŢŞ1óŚÝ‡ěěJ ”—ëhl6#‘ËĹ„†zŕí-ĂĂCŇ+Ž®'45ńôěŮnäü7ü‘ĺ•2&Á@7›Ý.†8]ŽěÜd2ţ˛áO…Bž}áyÎź9Çů3çX±zgOťćĄoľÂ»}‡„Q‰466rńüyF%"‹9ö‰cF÷şˇ#ăFrőęUňóó]˘â>`é’™<ţŰo^LZET„Íje×äÉpőŰçÍçń“g°JŰřż˙{©›;v[BŃ˝ÓTô-üö·?éu›Íf;žž=ŰĄ—«Ąx†şQ}SGhŇÝőw.†&]:»ĐY‡W=űtűńŻÖż Ŕ÷_˙1źíŢĂŠ§VµżŢWŮŠ ßyő;}Ň÷ŁŽ^oäRjkŻáoÚżńţ‡çůçÚź QyöŻňV”Š5{Ě$ožDiY-ŁÇ4ňަzÜ˙úßü˛×m6›m´µLÖs©Tô_ňŐSu˝… ń.ÍÉŁFgQqËýUm^°`Á}źsżŚ&4 COTě,™Šëëi›řŰ„żôőĺü4ý:›"GP6woîů.<ÁTi:+żg"/ßg MF«µ TŢ˙|tŘ25˙·żxEXĺ™é,*vBń®H$ě·Üţ¤§ęńľĆÝÝŤ˘ôL(®Â$Y,1J7j üú ‘‚‚Ů\Eľ$śYł*Đj˝X˙›˙Äf±#’Ü{}N,ęý]OŁŃŠ·÷}YŚů· ŇwÔ0ěq¸xŹ ťEĹNřlŃPx Ío⯏‰˘n¬ŇMÁĽđ-vüq/O>¶µŐÂ˙h/Ó:YÇÎ*ůă;×(«”ŃfQńÍuO·÷ßÓp"c‹±×ě×¶Zq¶aÖ™zÔţëĄŕî+¤úf ˇI=ßLqŐŤ˝KűÁZ7Öfłqâč1DB!ó-lŢb±PY^ADTd·ŤFękë Ł /źŘa=6ć^\ľ|łÉĚĚY3hllä|ňy’¦&! ąpţS§ME­Ľůî*66rx(gV~„›‡ááÁřř¨”•5ăé}“ů ‘É:Ú5P±´-F=ž^RÜľćhď§˙+9˙‡B&úâîÓłŚ+6ö.íAll—nőŁ-[ Á/Ŕź«—Ż“•͉ŁÇČHMăÝ·˙FAž#µuA^>yůdedPVR @sSgOźŕŔŢ}ím z=Gˇ˛˘˘çÖ}…ĚŚLrłs©ŻŻoŹ˘ŘňáÂÂÂضe%,,Ś­›·>P˙Ź:R©”1Łă;6ź;kÂÂĽxéĄNŽn 1›íťÝ÷´9{ë°šz6:r1¸éŇŮÍ_´ăGŽR[]KÂčQĽóázĘUŽqĄ§'öîÎlçö”ło×îöóO|q”Ťom =5Ťí›·PVRĘŮSg(,( őĆ­2Ô`0 V« E«uLţt:cÇŤĄµµµĂ±‹ˇKS“©Çr“{!WKľBÍ­*{Ą?ÎM—ήU×Ę~úÔţj>Ýń1jµšEK—0qĘdüü0›Í”#‹‰OLÄf»ł0ŃB~üł7H= OOOć<6ŹđČp&Nž„Ĺčâ!hmµŕáŃ{ŁLąZŠgŚę}«(p1đtéěüeĂź8{ň4K_FâŃś9yŠa±±TUVńÔsĎđĎżýť±ăÇ# Iątą]HěććFhŁYLě°ö5;‰DJň™łxy= 3.>ޞň2._şĚÔiS9{ć,‹—,fý›ëylÁc,ZĽőo®gÁÂÔż çÇl¶!  {·ŢněăjJĎ5alv}e:Sń˝űXţäĘ>2ĎÁŁ”©x÷î?öú…FÓĚńăÉh4-¬ZµC‡NQVVELLkÖ,§ŞŞ–_˙z#ˇÁĚ[0ŤĆĆf–-›KIIŻżľžÝ»˙NrňUNźľ„źź……Ą,Z4 µ§7řó»lßľ‘×__ĎĘ• ™5kň=íą_űoS[«ÇÓSŠLÖőzÝĂôŻŻ7“łŻžŃëI»Ţ!tmPÜĄýlPč BZőwżź»f*nmľżáüĽyóďűśűĹd4ŇX?ô‚˙eý$ó±Ůläĺ•`łŮř䓸ąIůéOżÉßţćṞ̌X¬Lź>‘)ăFóégźí¨Ľ˙qľóťçů⋳TTÔ8‚I“Fó÷żoăÚµt$b1!!de0vl}"˙ýßoŁÓµňŁýuuŤ(•Lť0–fŽ;ö“ť]Ŕ믙3'±k×a>Eff>3fL¤ľľ‘ FÁąË)¬^˝”‚‚šűh”o2Ůzśáäaľ\Íĺ?—âăŽTé*Ž=”čňż™“•Ma~>ĂăF3¬wDÁúV=šĆFBÂBÉËÉ%vÄđűîCÓ¨Ád6ČůäóX­VfĎ™Mňąděv;łfĎ ®¶ŽäädfΚ‰ÝfçüůóĚš= __ß^ą—ÁČęŐK;<ţéOżhÍĎχąs“0¶ PłaĂvyîŞUžFŕĄl &¦oŠJß úďç3ęĹ@2>®aôËA= ‡s18čň?yčłýDĹÄppďgäĺä’—“‹Őbáđţb1›9Ľ˙ ĹEEL&ď?HIQ1FŁ‘ĂűRZR‚Á`ŕđţ”•:ÄĆ őő\úR |čłýíýę´Zď?HUĹݵNŤ†ß˙î÷ÜĽq“ňňrŚF#ŤŤŤ|şóS, uuu¤\qŚ2¶nŮJěđX¶nŢÚ~Ľeó–Ţü»ąčGt: ý·Ľ"WKń¤7ßséď†]U¶µQźŹ@ `߮݌;– çΑ4}:öîĂÓË‹©3¦“•žÉŃCźÓÚÚĘ©cÇXüřă”! ‰ł)-.F$îXđţâđ甕–’•‘‰¦QĂÂĄ‹ÉËɡ˘Ľ±DLPHp·†Ęd2–,]‚Éd"44Ú`Ó›XűÂZÄ1É›’?a<ŕČjśČľ=ńóWŹťťŤuööÚ7Ś-wŹëěM{ńł"JÎŐ0ĆăľűwĹĆŢŁ˝łÄĆ"KŇôily‹–-aă[7’ϤIŁaDÜH„Bii,r%E‡ăçďG~^#ăăń÷÷oŻS°héžzî6ľµ€éłf’žšF@` ŐUUw5ÔÝÝĄR‰Éd˘ˇˇ±DĚc #ĺJ sçÍe”—5¸%*ŹjÝŘîÚ›Úx«Ý‘{Ţ{Ş·í‰&K,!x‚7ąČ%=ą[űÁ;"n$#âFâăëŰľ¶öěÚ5l|k ŁFńôóϱń­ ”—ňě ĎóůHÝÜP(<8yě8>ľľČrN?Ď—ëdîrwBÂ[ú±#†·÷ëć&ĺÜé3řřŢ;Gš··7¸»»ł˙łýܸ~ąóç˛wĎ^ŇRÓ4ygĎśm/Yş„ °ţÍő,{|YĎ˙*.śłŮ†´‡Uďű‚Ń/‘¶­»ŐUśg°óТâţŔ%*vŕŚ#Żľn_ßb%4´g5űĘ}˝™¬OkIX«R#»cÇ.přĚG…óŤgź µŐČßŇ«ę!aę°@§Ůő‚¨ŘůJ.™ FęÚŚ^§żDĹ•ćfĘűp^}…\-EěF}¦žĐ¤·§7HKËć’!ŹĂ˙}ŚWď>5)rFIě|;†ĆÔ›$kŚ łčyznď×”ş;źx×b0á®ph3z±XŚá>Ö5,ń{€Ôë}Áđ~śýMÁ“Ľ{TdČŮqw—Ńhh ÄR‚ŹI…··’뼎^îÎ&• hăĎą7©©©çÜą”»ög5[í#µ fŕĺĺ\Âě.DĹÎçěĚ1rą| ÍpŃŹÍ6„z=č˙aH\çĎÍU2ö[ÁŢáůř¨¤Ů Č@YâÎI› q‹–f‹™Y˙÷W˛âFCdçß·PzŽßXÎÔ Sy'öť{ö}âŘ ĘĘŞśŰŮÝ&+#“üÜ\D"KźX~ĎNLFU••DFG‘“• @xdĄĹ%¸»»ůđbÓĆĆFN?ŔŚ™3 şç9$$$P]]MC}ATWWđĐ6ąč;Z[-tŹßç6Š ó˛"ůr9épŽś…±z*S.±’®#`Śs}ď—Í[Đđ -:5˙SĂÇĄu珂ú¦ËÔ^+¦ôďó¸TĘřńWa2(˘ÄĹĹݳś~¸ű§KgwäŔA–ŻzłŮĚ'۶“8f %ĹĹ,]ţ8é©i”•–˛ä+»›Z­–s§ĎĹŢOwQRTĚ÷_˙eĺ4i4˝âěŠ ‹hŇ41söL¶oÝÎËŻĽĚÉ'™={6B‘S'O1gÎśö|{{wď%!!´Ô4Ţď}.ZHLL çΞs9;'GŻ·â­p­ßźńćOKë‘ÚŘ™¦ !Ŕ̶›hôÄń>Ää@@Ŕčžmś8#ĄĄdj3i¶B!ü*HĎÉŞrŠL3ř˝ń8¬ĆŻ´•ßü˝ ‰$„­{ˇşµšť;ďŮ÷Ő+WýX?ÜĹýŃĺ»Én·óŮî=”óó_˙’ßţú7DDE˘ih ¶¦–áq#¸qíă&LčܡXŚźżb±Ś´tBBCzÍŘäsÉśušgž}†O?ů”E‹!‰ůâÔ,Yş„ââbŚhĎdŔ˘Ĺ‹HOOoźľććć˘ôP’——G@@*•Šśśśöd.łŮ†ÝކL&Ć8@Îîµ)Í(Ýě óµâ)łS˘ámĄĆŰŚ›R†Xb_ AnÔ¦·Úéěż˙Ű~÷őuŃÝ´©±Ŕ©TŇcťÝ`Ŕ%*`ľ.*Ţľé·ÝŠŠď§Në`mߢł  P¸‹ťÂž{µ/8¬A&ÁTG‡w;6¶§ýߎŤíéČčvl¬¨‡Ń%·ccE’žµż+÷l—čvlěWEżwmo¶! î+6V$uE›mRLö»KŇî**ÖÝe*8P ękëÚŚ^Ç]Ţůő¨ÇĆ6h­¨ý…§°ç^íž "y}1áÓ;.‘ †Š»1cc;Yććî|â]›ÉŚB9ô’wşDĹé«‚:}Í„×B¸úN9żë|‹ň.îĐIT,qsĹúW‰Ĺ¸;ˇvŃ»47›ű%qoăŢľ~§Ă/^AÖ§µÄ=ăďűŤ¦™ÖV=őµŤřcņLć†Éd&88€úúF,+őőŐŘlv23ó…@ 'żyó¦rüx2cĆÄcµZÉÉ)dÎś¤ľµű¦Ë1§Ífc˙ž}DBžXődŰÔ- Ś&‚żĚ{WWWÇńŁÇ™;.BˇÇN0ď±y °Ą.“ɆźßŕüR±RMňúbRŢ.'c{ŤÓ8»˛˛*nÜČ ¸¨śŃŁăşIČÉ) >>–ŕŕňóK(,,Ł  „řřa–ާ§SŤŘ‘QüőŻ[fË–=ŘívÂĂIMÍbôč{ Śť‰.ťÝć÷>`ނǰڬ\˝|7™ŚâÂB/[J~^R©”ĐđpĘËĘжh©,/gŢ‚ sw§©QCMu5‹{)µRCCżűíďX°`A»łŰňáV<ą‚m[¶!Xńä ¶nŢĘ?{ŁW®é˘˙hi1ők6âŢ&cG ×Ţ©Ŕ¨±";×4Ľ´´ˇHHzFăÇ'2kÖdęë5ś>} Ť¦™‚‚23ó8|ř4»ŁŃ„ŹŹ™™yŚź@jŞ#:JĄňÄd2Řý<(]n…<ńÔ“ě۵›ŚÔtFŤâ˙÷6Ů™l~~ű?xűřpü‹Ł¤ÝĽEfZď˙ă]RoÜbë¦yűŹ‘Édś>q’¶¶62RÓzĹP…BÁO<Ńá9ÁŔ°aĂ0ŤŽ] >´ZË śÂŢ&xŠ'ы±żą­Ź{őŰĎc5Y™3g I&n( IDATii9¤Ąĺ0bD4łgOŕ{ß{€ĺËç3vl±r/»ÝNffúÍ{°#@?u– ÇĎŻ÷#‹î…ŹŹVłoǵżî¨||Ľ:<´KO”*Ç`%$äÎ:¸Ľ ÉÔ` ËwŻZÍŹż˛îőřĘ;ÓG˙@ÇM+ fÎť ŔЧîÔŘ» »ňé§zÝŘčč;!+·#FŹą“XpĚŘ1˝~M}Ok«…  ˇ#-˛Ű۸ţŢ>†í=ŠŞ¶–¶ŚL®|€Ź?Ĺs[ţw@ž şkśPT¬7PWS7Đfô:]‰Š5ZZL(’A=…ý:µŐŤx˝»Őňeđ÷wc ®ź:ËĄw¶±ü×ßëĐţ­·ţ…É"†6ôŕĎPZZÄß˙öëľ1~ÓYTě„mf3J'KŘD"ŚÝ@›1 Íö˙ż˝ó‹ňJö=Ť)ô˘©"JSlÁŠŘ5jŤ˝DcĘn61›d››ýÜ–%»żMâŞYKŠKŤ%ĹU•(*RD±!H/‚Ôaöý1‚šĚ Ĺ÷ľ./ßňĽgž—ňpÎy¶¶ť× k‰ô+9ŚĽprsˇÂ4yŽŔŐófňőőZţü·7­?捿µŽ˘ćAĹM¤*µ'©…˘kÔţ˙9¦ľ±őőz4µzělDÔiÍ“ţ;şţMáääŔwÝáŃâŰĄĚ €kb1=‚ĚĆĐŐ[×˵ŁÁ¦Z#ôŤmŤľ±z˝žŻv~‰D"aĆśYVöS.žO%´o85Ő5defbkgKmu ˇ}Ă›5Vii)ß}ócÇŹĺňĹËhuZ&?z»~]ĘŮ"úGpđŔAŠŠŠđđô ,<Ś‹.2~ÂřĆű™‡)7VSˇÁŢI†˘‰“Ž®S„FřszVď­?Ă HD>> _ü„ŮÁˇüăŻË1č V劊Đ#·“ ą±-ÍŤŘňÁF&N}˝NOÂéxd66\KĎ`ÚŹ‘v% 0űúű‘“}ťĘĘ ňrr?y×Ň3P*•ôěČÁďÚ7śň˛2Vżő6>~~L<‰Óq'›měěí퉊Žbí»k ¤üf9*ĄŠ?ž`DÔöďŰĎŢ={ٸy#ýú÷ăčG©ŻŻç“íźĐłgOŢ]ý.ýúwŤ.I]…ęę®ĺh@,3˙/q0´7ßl4Uň>A §˘uŞ1“ź7oÚ}hŤÝŚ9łŮ¶i3ľ~~<úŘ4~óŇ2z˛ĺĂbNťă_«Ţ᫝_2đ‘ÁqŕëočáăMA^>g“’yëÝUfczűřŕăăĂ鸓÷Ą¨\.§˛˘’¨QQ¸»»:ž˛eDG›<ÂQŁ˘H9›€‡‡999ĽüĘËxyy‘””DEEĺeĺ”””Đ­[·űŇA őč ±u÷B©R0iöĆĚ€B!C.·A­­ăbé<í×ŢŻŐĄ1›Ů)m;ޡA«ĂŃąëmć> AĹ55jŇÓóQ(ä,‘»ódRQRuu*˝Ú[˝1mÚX¦M Ş…Üů˙㏏GSĄA,1}úD¦ßZüL€=11k8q$Ďż<Řş9űĂ,¨XjÓń–‰ąÜ:—Ľ@ǢĽĽšgmŤňjµšĽś\zőjrĚ–PRRB]]>>>ĽeýiZŹ‚‚2ăFÚ¨†µ9il:}Šs.+Xú×ń¬XĎ+Żôj”×hęÉSć[ě:”!ŕË/ľD×…‚kMN ˛*®ST[B—^?˙€ŐXNÓéXýÖ;hµZ¤R)+˙ő¬Zż–-n"Ľ__’‰űń8W.]"Ľ_?˛23Éą~D¦Ü˝wW®Â?ŔÔëőż+WáÚÍŤ=_îbćÜ9÷Ą¨Ł3gͤşş­VËţ}ű  &zt4‡`ŃâE÷5vG˘+ĺĆ:(äü#?Ź˝±×Ř8vIN˘şpž; yý˙â3Ňçî\ŮÚć—úÖTkÇhď÷˝“†ľ±VËßęk4ń»SkPs!ď2öţĺúĆ ą±-ĚŤ•HĄĽú‡ßˇV«yďݵ 9;;;FFŹâFi)R©™Ť ˙€’yń•—ůú«˝äääP[Sçs1őÉ ‰ŤÇIg(/+G©ş?¤ŤŤ …‚ęjÓ†ţü…ó±··çĐÁCŚ9˛ł˛ čÜÍ´»Znl§Ż×;ôR…'ŕ'+˘ä†UUŽôěsw&K@/Ď|<˛Lçşz=Ňź4VÄH—¦˛ü#†.jÔˇ#Ľo-í«@\+çzU˝]Íä…ľ±­”ŢĎ´·&‘HŹč‡ÜFŽD*Ą´¤„ké I˙é?h )IÉDŹË…óçńďٓ϶ĚĂY°ä)>Űţ ĂFޤ˙Ŕ„„…r)ő!áaÖkxnÝÜP(ôîÝ›O¶‚V«ĺŐ×^eçÎťô?˝řľĆh;”J^ŻşŚçbĎ“2ëÉ FŚČAĄ2ź‘„…±ţ_˙h÷ßHŘßßżńxéłKŹź}îŮűS mqv¶gćÄľčőzÖ¬şJH;>>ťŻYK{a+SámçIZY†Ĺž€ő—•·—.MRWSKQAQ{«ŃętĄ âĺË˙Ť˝˝-AAţóꫦ —§žú żřĹ<‚‚H8sř#˝zů±wďavěXìY/±|ů/©­UłiÓN¶m[ŮÎoŇń°µQŃC0x-Ć<¨ŘľăU6ęô8»:··­ŽX,FSg^ň§3booËŠËeĎ3sćdââ’đôěŽT"!´_oěíméŐË—U«6Ü­VË©SÉĚ1‘¤¤Tl^ů݇Áŕµó bYÇëň$–HšÜ´čł–©SÇđÍ7Gضm7öääPXXÂS g”z‘“'“5j§N%3rä`~üń —/gP]]ËŃŁ§c×¶6*Ľě'rčz˙¤ÚHkRR\Â7űżáń'çÜąsŘŘذwď^¦L™‚D*a˙ľý 47ßx“uď­#áL‰Dč#ű€h0tĎ??ď®{~ú5d°yIňŕ@‚o/ËîGŔ2v6¶„»…p­4 ‰\‚ŁÜˇ˝UęXŚč‹ýáŁÇŹĹÓË‹ĐđpÎś<ĹĐĂŮüţüxä®n®TUUŘ;¸ăǩެ$//ŻM˝~ý:¸{¸3aâ¶nŮĘÓźŕ“Ź?áűĂß#‰(.*¦OpŞ«ŞI9›‚H$"çzN›ę% ĐE"ü콹ˇ.§RSŐŢęt ,»°ľá¤ž;ŹN§ăÂůóĹb\Ý\©S×5:ťN‡««+¶¶¶¸¸¸0mĆtrŰبtëÖŤâbSŢ`BBőőő¸»»ŁŐj $22’ÚÚZěěě°µłe欙””” “uĽÂ­X$ĆßчRu‚ÁűY,»ń“'Q—dž5˙%¬o8~=زq3O?˙,Ą%Ą¤_M§wH0ĺeĺxűú˛ëłĎ-&˙·&ľ~ľ 1ś7bÉdĚž3›7bxbú89;±ß~BBBpssٶ¦–¸qčőz\\]=KFząąąÄ‹mS=$ Láý ˘śĽLciq!Ż˝ö:b±Í;?moťĚ¨ľQNŻŔÎťÖĄĹ…Ü()Âh4ňűß˙™O>złIĎłNŁł:}Go_ů†ÜX«ĺoĺĆZ›nŐ+ą•Ng0Č­+ŔIě€Ü<|¬!7V"ł.=«!7V,µ.wµ!7öÎt®{Ę×ëIEÍĘŤ•H%wĺĆÖëmĐî]Ú_$QZ\ČęŐď™WŢčxAĹššZ ó Ű[ŤVçÎ~ tµÜ؇UľĄą±?‡ĄÜŘ^dUä +Ě žkÁkëŘń‚ŠŃpíćúórťŚ®T,Đţ4,ił*®SŞ.٧“uş:´JŢăĚ‚Š%ŇŽT, V`2xľTŐW“Zr™ěĘ»…ĐCáŃŢŞµ;ĚIgΰuă&Χś»ëz}}=ϧŢuílRg“’ÚNĂ[łaÝv}±ËěŢ™ř3wťçććr&ţ ům®—€@GC,#—ČɨȢD}Ô’Kí­R‡Ŕ˘±;öĂQ{rE…¤¦śăĚéx>ٲŤÓq'ŮđîZ4 [>ÜÄĄ Pת9zřÔµj¶|¸‰+—.·‰˘9×spqq!$4„źî ° ők×OĚ1äćä˛wĎ^ö~µ­VË… ¸ví»wíf˙ľým˘“€@G%żş§[ÁĆ5ÚZŞę»vc'k°¸f‰D¸¸¸0":Š÷Ţ]Ë…sçéLQa!}B‚9yüĺee¬yű?ŤébqÇŹSW§¦0ż€>m”Iáŕŕ@hX(»wí&ţt<...lú`aáah4ÎĄś#//Ź‹/˘ÓéJ¤dff2ř‘ÁäćäâÝ‚ňRť‰žNţř;ú2Äs™×Ńt šš:.]ş@PŽŽví¬éăž~ßó)çď×—ľýxúůgřČ`”J%—R/0ń"Ôju٬łł3ŹĎAvVV›*\TXDw÷î8:8ňⲙ3w*•Š’’?2îÝ»ŁÓ™JCKeRćĚťCQaҸ) Đ–EbR9!®A8+śH;‘•ٯ6a.ľžă‹™'öVóaŃôŤčÇę·ŢaPä#Śź< ±óÓĎxjé’Yú‹çřtëv,^ÔŘâĐ/ €í›?j,ćŮÚtëŢŤ}{ö‘““ĂÓĎu99ů|őŐAfÍz//÷ö|ÍcfŇĄR)˝ž”äł <ÚÚZNť0ĹâTVV˛úí•$%$ÖŻ/Ţľ>ś<~˝ÁŔđ¨(Ö­Zõô 2®¦“śŘŞŠęőzär9JĄ˛1ŽN§Óáčä^ŻGŻ×ßó¸á®†——;FŁ‘;öńŃG_PXXĘÎťßPSSË’%3‘H¤tďćJ/6oމ——ű­ëeÉ’™¤§g3qbĹĹ7<ůvÔ‚§gw–,™ÉÖ­»Űń [‹ ć~ús:î$ŃăĆŠT*ĺ|Ę9?»”zŤ‘H„\.o\n) lí쨯ŻG"‘^FB!Gˇăćć„ #ٲĺKz÷@Ż×łnÝ6®_ĎăČŃSśŠOĆŰŰ“ýűżg×®äçŃŁ‡;ŽŽöŚ;[[ …Ű;úKĄRöě9ŹOÇŰŞSךö.ŤFłYń7ł ŽĹö¨1Ł…ŁFGٞUŃŹm7łřąg°‘ɨ««ăŇ…‹ |d0*[[”J%#GGs٤˝Ţ‚+»…ôĐźźî 77—ĄĎ.%öX,óĚ#ćŤfÍž…D"!ćŤfĎť Fy#†ąóç˘Óęy#†ů ć·şNS§’9{ö"..Nx{{2ţă$$śG­V#“ɨ«Ó0fô0¦LŽ&#ű:'N$RUUŤ››3ééY¬Yó®®N,Z4Ălěë×óąył'§ŽŮÔG,‘P^Zlv='ÇĽ'N«V*®©®áĂőP©T,ýĺó­V–éaŞTĽk×JÁAŃä¤B­®CŻ7 “I‘ËmĐë čt:4šz$1 …­F‹D$Al#¦¦Ć”ć©R)‰DÔÔ¨Q©HĄR4šzär>˙ěkňr ńöődňähT*%Ň{8ÚĂAQVV‡ŢčHěŃŁ$&&7^_¸p.Ë—˙•7m@&“5]©¸˘ô†UŢKźY @mEe‹ĆąMŤšüÜüVŻŁ`g˙đ$a ´JĺÝU"#‘Ř —ßţŁi”1ęŤH$îţą»óĽá™ÉŁ1 ČU6¨T÷.}ŢŢôîÝ‹5kÖźŔ[o˝Ůd8‹™¶wvnsĺš‹ŘîžťŰd ‘HD™T,Điő5§GG{!“ÉX·nqq§5j"‘ȢśYP±µA„‘XÜ!ť:2™Śčč{!±h¶ăOž$91™!ÆŇĐŔ+’†Á‘Ź´xśŻv…Z­fÁÂěţr7ŮŮŮxőđbÄČ|ńůĚš= _NĆťdŘđa|¶ă3 ň đó÷ăÉ™O¶XŽCęů‹TW™o™Ťć™(ŤÝ‰ŘăürŮ‹|°n:˝É}ŰŻ>úŕC†ŤAź`¶lÜĨ(‚ضy3#ŁŁńďŔÇm!jĚh|ýüřdËV˘ÇŽA[_Ď‘Ăß“vů2cĆŹÇÝĂťďöCŻ>A ŽŚ´ęĄ’“’‘%řúúrřĐaĆOĎ”iS8qüZ­–m[¶ńĘkݰfŐ8ňÆ ĆÓźŕđˇĂ8:vŔś_ ”•iÉĚS€ŚF#—.\ePäł{ęZËM{t5ÚćĄCuEů””s f^˝C§·Á ¶~ĹĐlyVËŤb zzkĺ b : :+ĺ zŚh±R^ Bl°nĄgĐzb˝•­u6#ŇZ^r6 ©Sc0L­ë w-Qß{o–»!úůő0[ÎZ4v˝ží›· ‘H8rč{˘FGóÁÚő<óÂ/ř`ízbŹĺ™~ARüÖ®ZŤT*eÍŰď0wáB@DYé ňrr‹Ä”–”’p:ÁŔ ż^Ƈë6 ‹™5.˙Óź­6v™L†\.§¦ĆôË­P(8}ę4Ë__NQaďoxźěěl~÷‡ß‘‘a*cŁT*9î<Ë__nŐç´7zŁĚ˝±IIÉüřă)‚Ăďž!ŤFD"ˆ\,ë2'»®üŐ´ ö썥oD”…'¤ÍJ7j{y47ö˝ąňZko™†úfĘ[ŤÔ*Ý R© ±Ť#Đ0_»z‰üü2^~ů…&źýéÖ—E Ĺ ‹ź]ŠT&cÝŞ5 1śS'âP©LÁ†:ť•J…B©D*•ňÂË/‘x&ą\ÎĚąłŮ˙Ő^Âűőeúě™|{«˙X,FĄR™¤őz”Je‹÷áNź:ÍŕÁ‘H$ö döśŮĽýÖŰw…nůţŁ˘Guš=?‘HÄŤ’˘ĆółgSčß?‚šę{÷¸óŰTUŢĽý"Đé‰D”•–ššJ@€? …ÉóliéúsXśs‰RĄB&“1čÖ^Űó/ýŠŐo˝Ăđ¨‘<÷«_˛ú­w0ĎľđKŢ_»ĄRIPp>ţh+Đ«wźlŮFÄŔ Š|¤qśA‘ʰđé%ěŢů%=­VtŔŔ”•—‘r6…ńĆ{,zö4ŤáééÉVţ‡‹LűyÆ›–->>>řřř4ű ÓX¶ě7ś<ßŢj´;))çyéĄ×Đh4÷=†Ĺ™]Ôčhłc[[Ű»*7÷řÎń|ý •Lž6ĹjEĹb1 -l<˙iIőŔ^Ť•‹ĆŤ7%2÷ęÝËęĎčH$&&süxaa­WLA@ 3Óđ;1nÜűzŢ<¨¸¤eAĹÖ0lČP†  `ŐçijŐäĺš§tvěěš*4hëÖ­âÜąÔ&e&Ţ|óoŚ;úľź7›ŮuŃ´¬ŽJY©ştĄq“IDATÉ{#F cČ–‡ětvfĎ~±XÜdŔ°5[Y9T mřÓWPVvÓěşÁ §˙€łëz˝ž×—Ż ¬Ě˛ ţaÇh4âéĺŃŢjÜ'˙Śů7×®e™]7ŤÍ®ŻwW!€·WţĎ.–Ő‘Q(Uä]Ď4%ŽkŤ¸ş6ť®'•J-z•[˛iű0 ‘Hš˛ţ]Ťúúz‹Â`úľŢ+ĘBekGťşÖĽ€`čÚ‡:u-ή¦fB"‘辦é îx®FC©ąűˇN]‹ByGm>0ý’ŮH…X-®KăĚÎh4réŇŐm t†ŹFYéíŹfŠŕŕΗ& p'"ŃÝÎVÁő* Đĺpqën¶-gŃEµ~ýĹbŚF#Ç%"˘o“–——sčĐĚ™3łuµ¸\Üşs5- ^O·n®Ť×-;ŁŃTľŮh4˘Ńhx˙ýM "#“Á`$2r0gÎ$RW§A.·á‹/v3fL4ÇŽýČĚ™ÓŘ‹ 4ŕâÖťô´+čuzüüýî*fq+‹YĽŘ”Pß·oÉÉ)D"ôz‘úúzâăpttŕ©§ćáěěÄŤeěÚµ‡30o% p&C—†N§'84ԬΣEc×Đ6<<” .Ń÷V X¸ąÜ†›7+Řľ}"‘™3źŔŮŮ ±X|W§¶ć¶ˇÓĘŐ+W(ůIŢ˝('/Óذ‘wůr:ÁÁ˝0 Ť{v ŃË K[ÁTQ$5މD?‡łł3ááˇŤĎ ´5.nÝHO»ŠV«#$,”ô´+č~˛Ś5kĄŘ@ˇ˛Ń§»óŢČ‘ĂĎC' đ pqm0tZB¸zkż.84”˛ź4ĎľËŘůřúŕÚMHč\˝r嶡»r˝ŢdčŇ®\Áh04퍵UÉ…”1Nłł©˙JYi1..NŤÇ®·ŽďD(! Điąs+­©ă¤«˙ó.7nµĐş.7oŢä˙š˝˛”F2jIEND®B`‚fox1.6-1.6.57/doc/screenshots/aqx_linux_visualizacao_peq.jpg000066400000000000000000000517221326741342000241020ustar00rootroot00000000000000˙Ř˙ŕJFIFdd˙ěDuckyF˙îAdobedŔ˙Ű„    ˙ŔŃ,˙ÄĘ  !1A"QŃ2’ŇTBR#3S“ÓU6aq‘ˇ±r˛4t„”´ÄÔ•Gbâsł5uVvđ‚C$%Á˘c…!1AaQq‘"ˇ±Á2RŇđŃB“ábr˘˛#‚Â3CńSĂ$˙Ú ?߸ď‹x…ł1¤Äup»Ť&.mkanvK˛d%¸ÓÖ¦ö­­ŞCŤzĺÂuV)łŽ*â˙HŚśřŘ^‘‘ÄÇBS"„-÷u¦ëŞÜˇÔĄeԲޝ=$­W XZ¤Zý zPŽŰďżÁoą¦#ŻDŚĂRTăňóIm`¨5©*u:V›űňú\JB‚Łž‘˝ ˝9’}ĎŚŰŹĄ§¤™ [M´Ąˇ%ŕC;RťKQNĹY;ŃJ ŠĺřĎŇ^'?*¬¶‡Óâ-Ô­ŕ^l¶â|4Ř0ęB°Ţ!Î ¨*EËôťé;{ ¸žŽ2-´ëÉL×\.»»dBP”yŇvňrt“J Źé7Ś™śÄ ś."ełxł ß[nK,„d#r\Ůę‚SŃP*ä4 ©;č˙Šx»Y×päś Ť˛‡Ę’™.¨­."Ý4… )[/¶”.—W®WŚ{ô ¨]^ą^1ďŇ‚ˇuzĺxÇżJ …Őë•ăý(*W®WŚ{ô ¨]^ą^1ďŇ‚ˇuzĺxÇżJ …Őë•ăý(*W®WŚ{ô ¨]^ą^1ďŇ‚ˇuzĺxÇżJ …Őë•ăý(*W®WŚ{ô ¨]^ą^1ďŇ‚ˇuzĺxÇżJ …Őë•ăý(*W®WŚ{ô ¨]^ą^1ďŇ‚ˇuzĺxÇżJ …Őë•ăý(*W®WŚ{ô ¨]^ą^1ďŇ‚ˇuzĺxÇżJ …Őë•ăý(*W®WŚ{ô ¨]^ą^1ďŇ‚ˇuzĺxÇżJ ‘ +ú˘9 €ô‘ťÍ?—°Ó˘˘x+D­ŠŽŰii.jqe µîR›^˙Bô®[‹łxĚŚx­E‘2+Ś-ç`,-+ HÓ¦ö:ŤĎ%ׇ8ë=śX•ŠťŚ dş§ä§KZ…RRJ˛­m”9/H3ńů‡ńL´öAl6Ű‹j%Ő!%ĐMԝҍÁçîě `řż-™SáčSqˇ  ))ŔIą{w GKôź1čďá˛/0ŐÓÖc#z•)*]ČEÓ¤ ‚9ŐnjbߥLÖ‰żĂŮfŰaDiÝű!liv( NĹr WÇŚĚÇâ˝ \VŃ©Ć%­0ă=‚•( Z‚ąv}.zś—çńŮw1čĹÍ›( L¨©*Ö­W@ÍHI$šţ/Šň™ 'l>Ĩ+łĘęO ďŔiJJn”¤›Ş×Ř.Ęç7K!C†ňáíe˘’„č BB”omZz]¦äßfĘÁ„⬎fć¸ÄĚpB´–e %Ҳ@ßÂÓôĹWOĄ řß4xw,%4´§vZ: U¤ßPB¶éX;.ÎcB–ŘÜ„ř1¦’üc!´şcľ]l¨\ˇc™CĐŽŇźç úÝęí)ţpŻ­Ţ Ňźç úÝęí)ţpŻ­Ţ Ňźç úÝęí)ţpŻ­Ţ Ňźç úÝęí)ţpŻ­Ţ Ňźç úÝęí)ţpŻ­Ţ Ňźç úÝęí)ţpŻ­Ţ Ňźç úÝęí)ţpŻ­Ţ Ňźç úÝęí)ţpŻ­Ţ Ňźç úÝęí)ţpŻ­Ţ Ňźç úÝęí)ü˝a_[˝@sĹY‰ć{ájS-“pă€%¶ĐTt (&ö'š¬‹L´ˇéçD“Ž‘–帉zŇäĄÔ-·…§a Ň«¤‹(A“|EŽw,pÉnG[K&Cš÷­îŇ6Z¤­7˘tŘÖ«­ŢĆÜ”—"´Ögx¬±Ë4܆ ĽÔ'P•&CŹ]7ZÂBl— 'ÂäŘ4íć§ů[i_ąb5\´Ú”tÍ{®’jM$čč»K¦TM¬ŚńS§§%rzôŚk±ŇűćK+‹mN:Ń@ mZ‘Ą{Ë+PÓ}µ¶§kŘŢV|úo¦ĽÚ§ń`đÎäJGĘ5*[‘#°µ–^r;ĘߡL„©DŁ{ŞÖRHŮ·PŻ:_PłŢK~6ҧu5Ůŕ–9*:ĐóŁŞX¨áŽ8p9“‹&Ć!Čň:]Ő +)u¦ôďś ŢY)gRwš¬v¦ŔęMö˝ĺĄwÉodž:«Fąxe^Š3şYJ۸šŇłäř.ąpýŚÎq´Iś[±zCí%ÔĽâGIűаÚÉĺ<ĂmvTŰ·Ř]żnw#JC:Ľr® «¦‹™-73ĄĄ¶Ą(4—íľ)%+%"É.j6#¤@°¸ąŻ3}őĽĘřťqÇî1ł´S‚”¦˘›k'•+’}'® Ćđë1äeŇó,IZXmM—^=eÂŰ-©J+ZŽ”éIMůH¸ľÍŢúŢÚ1”ÓńtuU·V’IbĚ,íezN0iÓłžĄ›ä7ĚńT,Řjtw’óÍ!íŮx$§Zô’]±RO…¤ť•ëBÖ¨)pm®|Zθsč9%k1V¸›Ľ#ąéĆ`4µˇD¸Oµ©IQÔ§R€:$ܬ}]•ĹľşöŞ-§-T¦\UqĎŃS;VÝŮiŽc×ňĆ#H•ľß·[·“ҵ,w”›ôÔź±Zw;ĄbÚ›U­=&ÇbqiI5\«ÉÓÖšě ń\qÍÄÎd±Ť9#…”¨]i/‚™+h´—Őś6BTáNĄxZIMʼnô6±WÜRtÔ«ŹUxĺjqIŃř˛çŤ0íŔ‰ÄŘilN’‡–`%O8JÜ%QŔ%.¤žŠ¬l •Ýą-_ŤĚľÜĎK}ô»Ű5q{މq‹ć¸Ó†y‰â\^_+$Đq¦ak2C‹ZŠRޢH(ZđÉÜ®ŠUđů¨yťňXCŤ¸Ć‚´-Ĺ‹·Ňn‡6éUĹî-J„ńł‚ÜerjÜ”ŢQX·ÔAń'â8g13%©’QŽ »’ť·\Ť ‡ÝS-;!AËĄ+Rze)IR¬‘zň·?RŰmď[łvj3ĽéĽäţÝ;žUhGpřîyTˇĂăąĺP„wŽç•@Ü>;žUhGpřîyTˇĂăąĺP„wŽç•@Ü>;žU^ăn>áŘŮé¸Yi’ľŞU^é‚ T¦ŔRR­CňŃ‹ô•Ăr •=ü´ĺ*0‚ –ŃŽť]î÷~¸íĺˇ\.kŃŽKó±Đ2zBÓ’ä%Ů/č_„Ź:ĄŻTAąç®]ľŇ͉9ŰŠ‹fNMćIc8ă± ‚ĆE¶´¶‚‚ÚÜZZ–ź Ĺmşż-¬ ¬–ÚŇ˝;ę)\¸Ű”–›zť{{¸`5:S€“gÁQćą=ˇ“:¦Ôđęí°ÂÝq¤©@”ˇO,¤÷¸Ý^l´h«ÓZÓ…rŻXę?¤ ‹)ů‘Řž‰F™ ܨ…€âťpŤŠZ­Ü˝ą+źük^j»ĄkŠiKŠRĹ®Ó\|*‹'‰ĂĽwŔďĘëÎĆž©m8‡÷* AbúBs˘ž’µ%;sŞ÷­ŽÔÔÚń,ăO˛:#¸ścˇ?G_OOłĎz:ÎOg%=ś˘¤°„¶Ö–€@Đť!Z «eÁ<‡h±Ű[ kuvÔ\a',éÄ}3Ťx|†ĄČŹ‘ë Ą(BĐÚÓŃI¸CšNÝĽ—®-ÖĆĆę:nÇRë~Ćş{x«óQQOŰďĄ}Hë+Ćü śÝ ¤\„„2T¦Ń»qÔ±¤¨„:M‰žK›rÖËű[7˘Łr*Idµ¸ąjş*%/Śř&lŇźj{ŹDorÁz*$X­ WłÝJC‹B•ę’˘ÂoéÚľˇ *JµÇWB\č4KÄętxË€Ć+2 ©pXz{°‚‚Ö”ˇ! ”l•ŞýĹzUqTI$¸*eťD[ŽL‡~oŁ)+‚Ýc,p Ľ‡ßi(Ňě­ *Rt+Z’ĺěî’’¤ôobAĐ⚣U;7{Ë»«že×YQ.ŚľÝ®Żű Ä~ޏ‡˙v±Q˛,c@PYË©iX:őm)Đ”§ů  ßfăµ58ćşI»ÝÝÝIJë«IGŁŐŢú[mć=Ç\!rT…e^DÂĄČeö¶Ô㇤» ;T6ksU•ȵEÇřSÇ˝łMËÓąMrrŇ”Ux%’ĹĽŠČČÉcÉF2ŮKâ%˘¨®”*čqM­jÄ‚Q¨Zé67˛mަşťDăÇĺŐ™€ÖN4‡Xę˛YCj1ŢBU©µ-µ-C[wPB“k%Dm˛¤cŚđ6,¸¸Q&ˇ÷€HTr·ś R”·˛Ą•«MÎĘÉ\ź—z›ŚkDÝi\űÍ÷ďĘőÇ9R®™$˛TX,"úCŕŘjul±?xó‹yn-‚âő:n Ą’ÜHŘ+Ő*&éZć[×ĺu§*xbŁ‚K–Yľył–8ű˘Ď•“Ź [y ˇ •!1@[żç]`­ĹIÉ,^gmB2rIVYłŃé‚S)éČ‹53d#vô¦¤X m]ą…U©j¦%Vŕ¤ä–/ţw¤ŢÉKv\Ƹ„—±h®3R\j(e ˇ Rődž+u‰ů7UÄ”šá%Ş=93Ł_EuŻâʔ՞ž4ʸüAĹţޏ“.îc!$_{B_i!ä4űLş^ią(C©Cémd©!Ô¨\žé®+Ű[7®FäáNŰn-ĄX×==*M*!Źć}ńlŘy#ÄKČM€- ĺ¶ň WZ\č†Ţ@ľ¤ĄW#”ĺt4ť*˛0qNŤ¬˛=â|ע®3\Wx§ +&ä âb©Ö\F€ńIp{ȸQBn~J’Śeš­‹[‹¶«˘N:•U]™®G|CÄ>Ž8©Řďfâdž\T-¦Kiv=ő·‰;§RHV‘pvl®}ĆŇŐúy‘R¦Uééë:¶źQżµMY–Š´ŰYşd«đńqÉń©1ŇO AÄ&ź¸ŚÚh*8$!´„¤¨r])QPâ»s\ܨ•]h•bŕą |éđżąÎü›úuMaó§Âţç;ňoéĐÎź űśďÉż§@:|/îsż&ţť|éđżąÎü›útó§Âţç;ňoéĐÎź űśďÉż§@:|/îsż&ţť|éđżąÎü›útó§Âţç;ňoéĐ_ľţĆýŕę3ű^ď­nmZ´[NóW…ł’€¬ńŻ-ĹŮééĚă"'8:Ľ©·“Ą)$„^×B­b3‰ł„2H<„)ű˙úh@ůĄÎ“nż˙l˙ŔĐÍ6să;9zOü |ÓgG,ř>3˙@4ŮŢNжŕh>ió@ńźřů§ÍüaĆŕhćź7ń„˙ š|ßĆió@ńźř±č‹T5&d2“ČGX#űßš"(Ţ p÷|ş˙îtŰéî(P˝ÍBÝ{5=¶±í4§¸‰qN]6·¶¶„Ű–űhđ83˛M´üL¦MQźxĹnB˘4_J7…˛Ą$ “}µťČ;zu*kZŁ^+Ąr$Ú„ôIŇ]p#Ńż ;Lo:úâôőbß-Ľ m˲°(«ž‹¸q¤]ËËCc•e,[iěšÇ=đÓ(q×s2›mTęÔ#„ R˘NÁ¶€í>а HZr“•R † íßšŚĆs}íšů¨Á|g7ŢŮ šŚĆs}íšů¨Á|g7ŢŮ šŚĆs}íšů¨Á|g7ŢŮ šŚĆs}íšů¨Á|g7ŢŮ šŚĆs}íšů¨Á|g7ŢŮ šŚĆs}íšů¨Á|g7ŢŮ šŚĆs}íšTz!­!c)-)Q!:„tŢÜ»  Kô{ÁX÷b±âqDáxLÉ~.>5hö4-aKş¶ "€UßF|&Ă—ř…mH!˛#­Č‰xďŇĄ¶7eZ®´ˇE"ŰBOpĐžA„DĘäńí)¨3Ú×mjK ) U¶\Űš„ĐýÖKć«}ÖěÝöž­¸s~·Ë˝ßhđą·<śô)%ťá<ĚŽ'âܶ*lřł'dŠŞ*"ŕ¨7ľKô•‡ Đ“łb’Ť'˘Ł[­Í8JŐÖݧâÓ&ć––zx5ŃV/%qF2Ć1®¬ßJj«—­`?—Áł¦=żíw˘Ý-®ÓOîŔm´ŁIł‰öéĹą-Z@˛řFKڶĘóTÚú”‚ÓĄ6|ŃéjľÍş”ˇ´Ř&€x˙:äč’ÚÉĚm¨«mA’—¤´•¤ Ť#‘`\¤ŢŰnvĐ Áó‘čČÎËenĄ¤ďŮmࡹt»Čµ¬XßIµ¶P '…Ą˘ ĆUő©””)Ĺ· ęJźC×Č,ˇ§JUÍzŇ\“Ą{ż&€óxťś·7°Ň«ôm}–ľËŠÖ=jüE÷¨Xő«ńŢ  c¸ż}ę?*Ľűň˘§ű-bĐÉncGyo:Ł«ÚÜJŇĺçmt6W‡ćĎâVóm(o«% SÓR´´ĂĄ¶IÜ­GUԛР1€Ě+ŤsśLţQă„›JĂ(Č,ÇSaô/Fő[ł¬iÓkh Vµ.\7 ŮĐeă˛ń,2–YŇńaĹĄRK‰PS«LZ§şvEŤ“Δ‘śd•˝-U×ŢxĘź ®Q䌛m·ńgÇŇń˘ŕ˛Čô™ε‰áy!-S[ ZPn.Rŕä°Ú6Ř};ŕbuó!áŰř.'JÔ&5rż&»äüXqŢ„ŢĹ´â!ăe6ăĚug^ZĄ$‚d’ęv} í ,Ťpg°Ól7Ť!¶’–Đ7±Ĺ’`6,A@wűŁÄ˙~cá(÷G‰ţ.>üÇÂPîŹü\}ůŹ„ Ý'ř¸űó @ş€?txźâăďĚ|%~čń?ĹÇßřJýŃ⋏ż1đ”űŁÄ˙~cá(÷G‰ţ.>üÇÂPîŹü\}ůŹ„ Ý'ř¸űó @ş€a–ôĹ™A ( &Ë€C–Ó;Ң—tş5'g@0Ěú2ĎÎJ$ĘK‘cĹŠ†Đb-*j3Ş ÔV±Ň'Úěm˛ +y.áüÇž*w"{w‡PŚQK,Łq©lŘŁJ·‰y+R¶ŘéŇSeCšůIÄâłµ4:Ňż?Ś~›B–ž$Ĺĺ˛IJĹ啊SŠp¤ˇZŇ·|8{$€T“j"±F;‰!d×+'ź ‰ˇ†ČY7Psí˙Ť‚-ú{Łßňč~žč÷ĆĽşß§ş=ńŻ.€7éîŹ|kË  ú{Łßňčłš‘"ÓGU’˘TËáHPJ’ăjCX $‚ť\”MîăS©Fâő6€„ş¶ŮSÚ@ Ú°č$‘rO-ůę·0|díŘ{Ňě'Ű(}żcB«’…겅‘mCO-Éĺs3ŹKŁ1—íR¤ 4˘ěi)RĘŤ°6‚‘nm5/żOt{ă^]oÓÝř×—@(‡BŮ–‘ćîz´+ąĚ•@l‘d5 ×M‘şe?Ę >ÍRŇc>ľ¬ęp°±$éŘAä7± ©ä%jE”T”…”“°›OĄ@{˝¶•r‘ŕžazÍčŮŃVÝ>¤úŻřŰ@äÚúWČO€®cnĺîđ^ÚUĘG‚m°^€đ: ş*ۧԟU˙hľ‘·JůůŁŕ˙'Ô =Ţ ŰJąmŕ›r^€ó|›_JůđO9·r€ É:WłW"I𓟛»@{˝¶•rŕžqzÍňm}+äż‚o´Űą@{˝µ\ăÁ>§ţ6P’mŃ^Ý<©#ÂţO«@äÚúWÉßa·r€÷z/m*ĺ#Á<Âô¨PZuGĐP ýC@3Ě˙tOü߸4(¨±V­âŮmK'QQH$“¶÷µB>ć~Qńř¬ßíMŇ„4ŻŕĎă¦Đ¦‡áYyĚźMĹâq3ç5Ä[[™xĚ>ŮPŽS)Y[Jt  íkM– NËŃ2YĹ D—đ[2RÓ,ą¤c†ŐĽq*N»]zCz€6đ…R<Á¦÷ü-‡iŔ´ę¶Ű]ľKĐţŕp'ů_ůo Ü˙+â? ŤđtűŔźĺ|G侀?p8üŻü‚7ÁĐ÷pĆ)Ţ7ĹŕńŘ=Y2Ä€cGęÉwţÜ•%µ¶¦‚Č*ŇĄ ŤGnËĐľŹř”6ĘáŽ%·P\pŔcxăXP݄뽭§JOóEÔîâF[‘ř?„Ő% »M7 —Ňč«x‘őäO%ÔÜ1ŔQ‰’8ł…8q6 Ĺ0 °n •p­Mó'Oňß—–€°ţŕp'ů_ůo Ü˙+â? Ťđt7p· a°r¦ađ°1ňĘKfDH¬°ć…r§SiĆܔǷţâßÜ ΄^úEÇ!·ňĐ $Jb ™6RĂqŁGKĎ8yŰ{Ĺ(ź¤I4•Y˛Őą\š„U\šK­•~ă™ŮińŕçđŞÁ+,Âćđńqŕń•»„n_JT‡ &çI;z*·ťĂ“JQÓ«ó^ÇČú¨ýÝ‹rť‹ľw–ÔnŇ4Ó'•1zˇT㯠WďF·Jí>hMVß7É{*×˝ůą9¨(€MŰ]»ŰĂ˝ůly-@)@oŰr»ÚÖŰŞŕ-¶Đ PP ±mĂvµ´‹iąś×Ű@)@lۧkxj˝Żőď@5Ě˙tOü߸45P‡Îůź”|Aţ+7űS@4ˇ +ř3řÇé´)«đŻ #‰äńq3ßÇąŠd¸Ű±¬%xřžO×ÄÚÇh#&Yšôbó.©ÖřŻ4›ťa ’ Ťá$©e$TIŰz¤‘čĺé‡n#Čł&,DÁ\Ö—˘SČ 'SŽu(lŇy¶ť·ŘCŃ›ÉČIžž+Í$Hw|#¦RHP)Ů}¤$urĐę  2âśiźÇ‘Tú·8îˇ2<‰d%HBÝęęm*JĽ ­)<é¸<´Nđf-m2Čă<‚Žęa°ńĐ‚Ú B¬«jSnâH :›Â±¤Ç[MńĆA/•ď}ÇTâ›_KjlSo »Î«ZéҨÜ;Śb+ßâ©›rK‰CÄnS…(;4j*¶¤Ů@´ť´×·°ţxßŐ ŢĂůăV€‚âüŚ,† DXOˇé ¶–Ňvť‡»jĚ|Ú‚ĂBK(u JE”Ki7¶ŰŢ€QĽęUd»5”—RJJoq{^íÄÓYÉD8Öĺ!ČůbÇăI#DPâ–ńW˛bŁg®­˘ĺ=/ŁÓúmŘŮşî¶“„dă^2Ą#ÜÝ{…1Üe}ĘWŠďz€7_r•â»Ţ  ĆWÜĄx®÷¨q•÷)^+˝ęÜe}ĘWŠďz€7_r•â»Ţ  ĆWÜĄx®÷¨q•÷)^+˝ęÜe}ĘWŠďz€7_r•â»Ţ  ĆWÜĄx®÷¨q•÷)^+˝ęÜe}ĘWŠďz€7_r•â»Ţ  ĆWÜĄx®÷¨q•÷)^+˝ęÜe}ĘWŠďz€7_r•â»Ţ =˛ç‘™gé!ŢőĐ…›"â4Â;»·»Ő*XŘ™Dda®Ti}U2SúšyIÝ…‚«‹m˝éTRřîr,Ü(wPŁOBĐól8îţ*RíÔâVĘôW/ĐĄP!1R¦!ŔćI3dčŠňµ¦bŁ8›6#ĆKe;ÂŤŢů*±ÚvR¨3¤qŽxť Śş†\(ÝR|mŢí%¶Őŕ«]έV芠„ˇ +ř3řÇé´)Ľú+űëŽ˙ÔĎţa ÉšRPPCĎ´ŰÜYŽeä%Ć—%°¶Ö’ˇ»;; [» ńt_yoɡHÜŢ9¸·ř|IŇÂÂLe4Ú JîA ĄE*WóA¶ŰP Âb4§^>)]†˘l óÚŕĐv&âčľňß“@‰†řş/Ľ·äĐbaľ.‹ď-ů4Řo‹˘űË~Mv&âčľňß“@‰†řş/Ľ·äĐbaľ.‹ď-ů4Řo‹˘űË~Mv&âčľňß“@‰†řş/Ľ·äĐbaľ.‹ď-ů4Řo‹˘űË~Mv&âčľňß“@‰†řş/Ľ·äĐbaľ.‹ď-ů4Řo‹˘űË~Mv&âčľňß“@‰†řş/Ľ·äĐbaľ.‹ď-ů4eé„G•¸!üvě˛ę€C)zČtÜ Iş P$ Űm|#éý"Ëăn-L‹Ąß†ćŰ–íąůR¤°đ­8§OząˇF=zL1âőÎ ăÁ-,č–#ő€Ůp´RVťo(ę éDý/_~÷[ZşNÍ;>ăŕ´Ë†CŃĄF‘Ů\!éą©ÝőA(-ĆUgŻyˇhU´j°M¶Űh¬Ł»ÚUj•šr Ó.cĎšOH}u§Á~:ˇYT†šß%|¸TIQ:u/`Ó}ş«_ů[Z{ÖkŮ÷ /™˘đď gx[Ńfz>oźÄŞFo¸ČâeHuy T×óA6?É_!őë–ç8hpx:čČč¶šXŤ+捆•üücôÚŢ}ýőÇęg˙0…DdÍ©€(€(€ŁfţXb˙ oű#Bga8ÚD™ k6ÚTőČ–Ágw QĐŇYZt/Z’°§Ô'mÇF…9‰‚ăväJrNy.0ăQŰtRŚ˘ ŰçKo"Ă™}Ý  yOÎ{‘ŚfRŁEV=çm ©[ââJî´«Ŕ9;· $I[ŔľľńHq -čfĹ)F’‹îďe™Ű{ň6P wa© ¬6”o4GąRW¨®Ű«]C E­n@ÚÓžlB†Ë*4ü”µ´—že—RË yd#@Ô[Ke-ÜřJéęä­7e,slô¶6­79ÝMĆ­m¨ĹW†.Ż’<áňŮl Ů,‹Ç$ť d[ęíÇOYTĚ„†ÖŢ´ĄĹ¤«nŰ[IÖVĺŞ5yűM;Ë*Ő××Nq®zd«ÓŤ<É)m;Ҧf^fĐuĆ•4űq)ŘÚ”:]Ő •®ÝŘܡg¬ëŢl/mZóĽŞšjQ}4”[‹§\8Ź$GČ2ě$§%!I[̡ŰGeŔ¤´ÚÔ˝E(°éRůĽé˝m8Ě…˛‘“|(ˇÄčŹpĄŻRWíVş@lµąA;h:¬ťá_^wFńKÝéfÚJ4„_w{Ó÷ż=¶P¦°”‘}D% TPĹÉlÝdŮľWĹw=Nš¬hŮś…ääéC®6É1ŮoB]mĄ¤ĄE˛Ý’­*äÚR ˘›Đ:¬ťćľĽîŤâW»ŇÍ´„i(ľîö'§{ŢüöŮ@p Ě 97Ę‚A^÷*Bő)~Ők¬tNË[¶€o’c Ě)OGÉHK©D…7»ŽÔ…$ş=ŹKaŻuęú^«U–997ćä“"d´łcHŽŽĂHq”DeJ ¨µ­EKč¨,¦Á;@wÔ'nôv¬Ť{°Ťćî=őę×mŐ®GBÖµąŻ¶€ěĂ–TT2/Tę‚B°&ÉNÖďfĎI<çŐ\PÇDÖr…§f="2Ł †Üa l8ĄK!)é/” ý1a˛€“ 39ţ˙?Ô·öUBn_ý˛H^8WŇŘâaŹ“Śtâz–˙yŮ2w¶ßoŃmzmígOŃŻłúo˙©ąłúeí‚·FöŞÉ·UŞ)eN4N”ԫ‘®ĺ=ż)2—‹â\Ž)ůKx¨E^ĺ$>]R÷mjy!D%ŐÜ&÷Çă‚wÂ.`˛Ň˛)Íä&Ĺ‚”c¦<^a˘tt‘«Ą~‡9őF€łPűšů!đČżž1B4Ô!Ąý6…7źE}qßú™˙Ě!Q3CŞ@     (Ůż–żÂ›ţČĐ…ć… ©”ŁĹÍö9ŠŘňľűgŢ·¸ö˛:ŻĽçµ´Đ`qWXNĄcúŻXg]’ţóŞî=šŰmĽßxÚ9vĐ Ŕ㎮ťKÄőľ®Ö˘'wÖ·ţËn•÷{źź_.Ę:B8Ąţ%h'ł”ä8ŮR’ýÜ•!0Żexd´˝ńäÓŕÖ§G5ÉńrŽÚ]’ţTţdG𢸊4§`2ĽVćI’Qer^ iĆË·JpęQ˛•6Ąs/Ą¶‘˘“]żnâŢRťMĺûĿ«á9ĎFălÔĚnnbŽí“”Č·ş’¨î=HŰY*¸mWK–đŠ›>¦°¸µÉG†oŮéő)˝˝«—׼˙·\S—˝%Ő Çýi‹q$n1ĆÎ[Śb—a­ö%ĂŽ—‹ňq - :¬·sS¶©Ô„X®—V—­*µź5ű3_´»«Ń{[’QŚťc)eÓĄ?v\2“÷HiĽwĘś<^“…Îf¦˝«Ą—%%‡r÷^zPJ®›Ë.Yj7jMÓÜ)*[ń7čćú=gD~ŤrÄś·‰Ů·ëďO÷mđ“1KÄŢIľGzHeµĎgŠx‰m:Ą:đuÜi¤WJRÁhz×Č»rŐbKnľŽďłća/ŞZ’ĐööüľŞź'ćfßZÓű˘‰â/JńärřJ4‡şĂ2aKA„¨ˇ€Qqő´ęľÚˇ¸W±ň]U<Ű‹ y5ON>'°ŮKÇ ĘŚ:% ůťTŠ”_^´ş…QÓT´˛űą.Ŭ&9vPćĎʇXĺHŹp÷vlm嬩uăT»+éŞ4y›V:.\ËĹ­C®‘Ó>T¬ĐMôÁ Ě‚ ăxs.ţńäĽëS¦ÄÓ(˛ÉŽ\eÖžHE·C¦÷rš®WW.Ú{¬ĆÝ­•ĘÖäíçDে TŁŹO…"D;é†SŻ”ĆáĚd}HŽÍžćťŘÖVÉđď¦ÇÁĺŰJÝ|ďqtl Őerć8Ň1‡†ś*çŤi”Óu·˛’¶(Ëj‰Ýy¤»_o9ŰŘFşgrXJźŰŚqü?öKý^:ý'Ł+›8ö8]ďü‹=¬îM‡KÝJ0UĘÚq%{˝Ö’§Méj5[»Đ˝?qŚc±yĘâĹ~Ľ)âüKYrĎÜĚÇĄ¬TTKÉÁáÁ;¦ĺHbTŐî”ăÁ*{BŘEŰJÔëŐ~•ČčÔ•ÉÇ•:˙a˛ÖÓm{Ănsץ´ś—᪛ÍdéďaĚ´,q†ń{µcw;É[˝IVëv:Ąě«j öîm>ÚčLcľŃ_vŞť   0˙÷5ňB'á‘i¨CJţ ţ1úm o>Šţúăżő3˙B˘2f‡T@@@Qł,1…7ý‘ˇy />ü.ÜxnÎ++ZĚMÁl˛•„¤µu»§U­°í4)+„řőĄ‘‡â•6’”¤®`Tź%*˛l6»§QVŻc7 ÷ $[ĆĎoŚlćfSÚńO%mÄO 'C ÚžQŞă»zČ"Iő÷ŠBвޖt”ˇJ=®öQéť·ż!e06Ú’JiFóDmEI^˘żi¶ĄŮkrvĐP˘É{s.'#$ĐËŚ$­.8”¤nϵoB’NÓ~–ˇZŁďľĂĐĽ©·¶ş\ß©´Ś—%ŤoÄŞ‘:I…hů6÷¤L0ť8Bc4u{*qŔŘ'N­ä¬.řZť2Ď©›¶)^„ě9iŐIF­(ëŤpmŕ«$›§‹N4álvRr'qÉł#HËéLFŢe†ä5 •{q g˘âRĘ:ěS¬K5u›ü^®i—ÔśmčŰĹ©+KÄÓŞsxĘŤf–OŽšÖ”,¦˘˛ˇ|$­Ĺ±`•§JSíW˛I;o‘˛ş`ć5řŻDęňää–•#th (mÂâť»@éđôôµX§H˝D’3”ĺ*U·Aé, Ł´ä-z#Ü)kÔ•űM®ĐNË[”¶©€§U‘Ľ+ëĎiŢ){˝,éŇQ¤#Úď¤Ű{ň›l 8L)A)"úK@¨¦=ÉlÝDŮ®W9Üő:h±aÎSą¬Ś° ®%Ą,D h¤¶ŐŔlÜ$9´›ęÔ4Đz¬Ťŕ_^{Nđ/wĄť:B4”{]ô“Ó;o~{l e„śś‚ „ ŻD{•!z”żiµÖ:*ŮkrvĐ ˛‘'”ÎB^óD‚„°"ĄŔ]‚ëZnרŐËęőP pěL^C7®|ť äYŇ…żJJ>¤Ą oSZ•©Mž–«­6JŔ Éá%dq31«Éľˇ*+‘TĄ˘>Ňá7Y.AĐy­Í«ma8ę‹]&ý˝×jěfż Oą‰ŕL¬ž‘9Đ©,o–Ţ–ˇO6‹îÔ}‰W¶Ňoá –ĺŞ)ň6ďlů7ç†MvWÜv%ł–;ŮRd0b ąŐĂ!Ä*ĹVm sZůO¨î[2N€Ěxçűü˙RßŮU\x3äĆ;í÷jˇIÚ  ˙s_$"~óĆ(Cćš„4ŻŕĎă¦Đ¦óčŻď®;˙S?ů„*#&huH@@7ňĂřSټС@A«ĺ“áŽ~pŠr€(Ś˝ËÉR‚şÄ÷ HHOE–Űb×¶-ť¦µ[âůţĂĐŢ5Kqř`˝.R˙pă”§(JRŤ‰m•FHÚy^Ôý#[O<@‚R_Ć•%$‰WIS*t¸t]*Oµ›zµl·G•B€}@@2‚$äŠRL”•´¦‰=]‘u(ěpŰŐ§e¬žTšíP 3IJ±3´ĄH-+R\eRPEąÚFՏ抮 FC¤)y©%QPˇÔ˘‹ĄŔîËoŹ!żútÍĂŞ=ś¦MőG“)p!ąť„ň¦ĆµZ÷{_¬ô7ëűµřŁßíŇŽŰ Ňť}TŤ[•k¶ó“}ŕŰůśĽő´óÉ 1ăźďóýKeT!qŕĎ“ď´WÝŞ…'h€( ?ýÍ|‰řd_ϡšjŇż?Ś~›B›Ď˘żľ¸ďýL˙樌™ˇŐ PPPlßË _áM˙dhAĚě'ČrB˘eŰŠĘňHgSŽ Ă!e ˛T˘JuFÁËqH¨ü!é o d¸¬»ô\ÂŘq(ݲ›$Ź AHZő“´ň¦ĘP %ŰĆÍoŚlĽÄ·µâžJJŃh*}):#§jyF«Žč4Dן) BôicIJQ¤ŁÚŻĄG¦vŢü„ ”b­ŘGjI*J7šcj*JőűMµ(tÍ6ä[h΋-ěoY3¤4dČśřFÝÉye±íJö±bťżo«’µZĆ5ëőťűĺ¦îš×JŠîŠÂD|ăb,džqm[fRT);ŇČ*Ş<·đtŤ•´ŕu {˝©'V‚ŤćÚµę×íÔC“Mąµm 0ä• ŕ¸ €–,ÓĄ)ö«Ů¤ť·ż„T6P &ĉÍY7ţůhYN0νÓëRϲoyVŤ–đ‘§MôÁ”PSÚRBŠ€˝1µ-z‚ý¦×@č§e­Ę Ű@wŐ_ŢkëĎéÖĄîôł§IFŹjľzcn«ňť;(D)! Ś…E1îKfę&ĚňąČżţşhPâHSů4§$ţ­úÓt¸ĂĄ%ÖRIJ™łe±ŕ#ŽšµPú«űÍ}yý:Â÷zYÓ¤#IGµ_I=3·Uůôě 8eö”’ „ ¬¦6˘¤/Q_´Úëlµą;h9¸’*rŽMöÓşuŚ”‡GGŮ$Łuęăj ŕ"žŐâ55‘Ô¤ĺYSí˛°ęµ#<—µ,¬Ą“m:T*P &:„˝ŢŽÔ“«@FóLmZ‚őkö‹j#ˇÉ¦Üڶи’:ćiˇ5ćŠ'ş˝(Č)‘•#fč‘ žŤö“ájŞËŻŘŽýŇđZu­aꔕqŮqśáL\‚¨h·]lč]ŠĂ ¶Ó;T˛yv$[NZ€Ěxçűü˙RßŮU\x3äĆ;í÷jˇIÚ  ˙s_$"~óĆ(Cćš„4ŻŕĎă¦Đ¦óčŻď®;˙S?ů„*#&huH@@7ňĂřSټС@A«ĺ“áŽ~pŠr€¦ÉáÜ~c'ťČd¦ĺd!´7+„ĘD8îŹ!¤ ŞQ&ÜűkÚ˙:{{6Ôc bŰŐnÜźż.2‹| co\©Ť[§® ŃöĚ&9×%ćĐ㱚qÄ'=–-h VÄKÓĘ}NĘŃgę·•¸­6˛_ôÚů˝ôů1~ô¸ľ‘LWŁĽ8ÇÇÍâćž9”mËÜřIj^~Ö·~Ż{áµů6ľC‹Ë\űŘóćóçŮĎŰůŹÖéú˝ď†×äÚů–ą÷°ůĽÁůösöţcőş~Ż{áµů6ľAĺ®}ěi7ŃŢ˝DŢ )ű&ď9”P Ý9á•ËşS{mGJö„Óő{ß ŻÉµň-sďcÓčű@Iť›˛y?óŮpvý·¶§ę׾_“käZçŢÎčç´”®np¤ňŽßĚ~·U}bňü6ż&×Č<µĎ˝žüŢ`üű9ű1úÝ?W˝đÚü›_ ň×>ö3Ťčç §gĄŮĽA»/§Fó;•JJw-xî¤ŢűW·UÇ‚Ö//Ăkňm|Ë\űŘóćóçŮĎŰůŹÖéú˝ď†×äÚů–ą÷°ůĽÁůösöţcőş~Ż{áµů6ľAĺ®}ěi•ôw‡8éA©Ľ@]Ý«@c9”qŰŰÔĄŮz ú ŮOŐď|6ż&×Č<µĎ˝Ťń|‹\ĚĘ_ťÄ[¶ć%÷ĽEZ7}U…{fPRQ¨«˘÷OVŁŕV+ę×—á·ů6ľAĺ®}쑇€ŤĂÜEŹ&d]n[2’űS˛Sg¶w{µ$„JyԤ꒬înĄ¸±-q‚ŇăM6áÇŚb‚Ť3 Ą9üŁAw*b#Ęl‘pT^Eű¶!ż­^}÷Ůí=;µ{{nśfżĄűG6sµAł›ž®včou«_Żđő[›Á·Ń­§ň€Ěxçűü˙RßŮU\x3äĆ;í÷jˇIÚ  ˙s_$"~óĆ(Cćš„4ŻŕĎă¦Đ¦óčŻď®;˙S?ů„*#&huH@@7ňĂřSŮłdăĺťt/řCVCKcPl™)­Óe·- %Ď«Čy…)ékv¶ĎGŢěSOŤ6JJ‘ŐĹĹÁUÁľËs’@šk–o‹ô»™uâĽSÁLGN…)䡥úNŰ”Eš 3–PBĘ7mء(Ҥ_MěĄtďĘ9ĘŁ6<Řřž1[ŮeŁMЧÔÓ•آ×P:-k} ÖýëĄţąťźN–ć *˝qö¤cć6€ŰYˇ´ďCi 5ŃJŇcÁ˙§mťŢ{×:T9e'&Űâ1ÁC”1‘ sĆän”Ět´ŃK`…Ą)q:Ň=#}ŁšÂ©÷¨äwz;QÍ{˛Ťćé›ë+Ő®Ú-pž…ą9ůh IĹeC °’·»jÁ+F”&úod<§źe:±#]Čk)”Îťät¬•4ĂŰÍ ˛čĺR¶$\&ÄŠń…-”Ś“e /tÍÂÖ˝I]´ÚčODCĘvĐ ł7…}yz7Š^ďvÝ´iľ›Ř+§~^nJ„Ăžr.(„˛ ·mm-›¬ř?őĂÜćµĆ9fFT7ҵHp)M°”«[Ś0[RĘÓe©´Ů §˘S`«¨GŞĚŢőĺčŢ%{˝ŰvФ˘úob®ťůyą(Ä,€l$äś+m%{¦nV…ęRí¦×Zz$rQ¶€cť‡-X‰űĚ…š-I¸z:^lG±ęB©A®`6«žôXrK:¦äî˙ňL­í˝˘d«[ެěöd[HHh{Y ź #۸dŁ›ÎŻ-ÍÓ7ÖÚŠí¦×)č[“ź–»­Ás®>Óš\,“|TNEĐ̸Oôwl'ręCcju]ňAçőUćŮÖ˝_ů=*§´ç˙T{żî4wYĎ?%20”ęgC©Đ°w:Vv”ť ňl­§žLĐŹ˙źę[ű*ˇ Ź|Ç}˘ľíT);@@a˙îkä„OĂ"ţxĹ|ÓP†•üücôÚ˝Eô±Ă^Źó|OŠóťvV]é’’¨ŇťJV¦Yi!*i•&ÚIđŽŰý*"±˙ţÉpżş«ň)ßT˙˛\/îŞüŠwŔPţÉpżş«ň)ß@ű%ÂţęŻČ§|ě— űŞż"ťđ˙˛\/îŞüŠwŔP\=ĆŘŢ;Ëă˛ŘĹ!©éaŰ´ó6XkVŔňNĂÍP R…Ż–M˙†9ůÂ( ʡ u9«p6™Y¨ “¨¤”©¨%InR­Űßř­.˙ňHô>šÚ»)%]1›ţGOIo­'ž1Ă(«EEDŁj”đ”NÓ˙TlWÓ PĘzŐ&Ä7—MŠO¶}§üަ€{@@2„˘ddAQ:d$^ŘuvM‚GµňßGüŢŞ€{@ĘŠ1SRCJ!IxF#g3§b>Űš€e‚[jČńBŰR‘‘B\ Ę\Ą%]F)˛ŰX´uXşGD¤‡9\4Y”Xoęć}ËuÝkţ ťqöĽŃÖAŔĆwáPOXˇĄ$ŰR–Ř~Ŕ[nĆ yrtś{W·ŘzV#«ou|:eéÓţáÎŁŰ!Ťş©:7Â×ŢrîyçţJÜyăę1ăźďóýKeT!qŕĎ“ď´WÝŞ…'h€( ?ýÍ|‰řd_ϡšjŇż?Ś~›B•żHż/8ŹđŐ}Â*ćVj…PP¶z ö¶?Ćů°ˇM—'…ăąLĎfa1–üĹ;B™ŠB†Ť*ްz$$ ¶P×s{U)Žô¦Qs>Ćďt¤ĄY°xR»Ş9$ŃľÝ*ŰÓء‹2ąžpďqO%Ą:ÜVô¨Ľ€›6›”ňŘÜwk8ÂRÉTŤĄ™>h8sI(!e»Ç±BQĄHľ›ŮJé“Ë~M›+/&çÂűŚuǤ©ĹjLÎ&wÎYÇ‹rŚ×B#©?öđŁ4l‹jQ{HM­Ń$XŠËvšňbóŇßóĎď=-˛¦ŢíΗvżôGľeÍPć’˘2.€KÄ Ű;˘Čý>T÷}UëAŔ2ĂBžś|Mä÷ÁNč©·#GŽ˘-%´"ÉŢ‘·'©µď¨d7z;Qí{˛Ťćé‹ë+ծۻ\'ˇnKmµöĐ“ ʆAĐ’·»fÁ+F”¦ú/dç<÷9pç±÷śű HgQŘpÓ.o Ž ;ČĄ'häMŻ@:0§–ĘFM⇻báK^¤®Ú-t€„rÜí ę˛÷…}yÍĹ/wˇ«h(Ň}°WNü·ç¶Ę„Ăšr.¨„˛ ‹lí-›¬ěGýA±]ĎSjśHS÷Ů!ÚŁSÎ(ÇŽŘöFYФŹd ؤ)\»Ro¤Pú¬˝ćľĽćŤâW»ĐŐ´i(ľ‹Ř«§~[ě˝¶P Sa'&éXCh+ݱr¤/R—mşÇDŽ@9,vĐ 2đçtÍźQ-ČŇÚ#±!^Ę=ŚÔ‹/węAđ˝Uč±Q˛F~X»2ZZDöKAö˘%·D6Ă%¤ę-­d•,°° ›#MÇ*ĚŮĽ/YĚ©«Ç–ŘyÄGG˛]µkÚ€.SĐ·%¶Úűkб JĹĘ&ńŹ´ÁćŹ3łaxů}şŤŰyĽb™TfĹě66§mýUë‚훑Łqy®ŽÓŇŮÇ^¸¬Ü%ü´źŞ$ś\Ě­ÄO3š‚CLĐ´ŞĘ;ÖŔVĄřZGśVR„Łď&Ž “u€39ţ˙?Ô·öUB ů1ŽűE}Ú¨Rv€(€Ă˙Ü×Éź†EüńŠů¦ˇ +ř3řÇé´)[ô‹ňó˙ WÜ"ˇ^ef©PPPg Ďkcüa?› új©B€Ď8×ŃßzBâĽ|n3Ă3f=çaĄň±»[ʶF…' úUśnN>äĄá”ŁßĄŞťűMőí«nÝŤŻĎjB€(€aŹÝő¬¦ŤŢ®´ťć‚˛­]YŹVÍV·łMąď@?  ?;»ěyŰÝŢër˝{â°Ý­ę‹};}®Úž,§#Ä…¤˛•«$‚ńf;¬-KęÝ[ť—¤$očéŇŹ  ĺp\ăHc7Ž‹’aĄkm©Ś7! ]­¨  Ź-tXÜݰëjr kÔGó+CŔ\ :T^Ä™šT†Ň‚”YöM"ÍßM­mµ·qőMä ëvă¦>üłX®=+»éĐŹůY)=-ň—…ú÷ ŤáLO9‡qřü{ďăŰ’ň °#şă+uAµ+v”¶¤Ü*×éĄZŻo.îó')Ó-Rn•ë9ť‰[UĄZíYúËMsšĚÇŽżĎő-ý•P…Ç>LcľŃ_vŞť   0˙÷5ňB'á‘i¨CJţ ţ1úm Vý"üĽâ?ĂU÷¨W™YŞb@@Ůč6ű¦m°öÂlyvőaB›Ü¤W’âcgXlŞ[ŹkHö6¤Ą Níz$tu+hŐ¨“T§+ŔzC1Yg·\”´Bĺ%{«ĽPĘGCp R•ˇkĺÔo§`&€yŘł\âR´ńcĆcPŠ 5ľ–Üt(.ŰŹâÜ”Żcf?Ěs=âęôŘŮŹóĎx…ú˝ˬŁ-­×x–[m6 –µ3)JR.I&=€€iÁgĆĹCśW.Z÷`ő”µ Ip+hP%…=Úďcf?Ěs=âęôŘŮŹóĎx…ú˝?”ë¸Ř˙˝ňcľ§”莦áľ„2âT”¤0/b ®~JC±łć9žń őzělÇůŽgĽBý^€;1ţc™ďżW #ń¸Ě›Ň2jk‹äKH•¤¶Űp–X(e¤)Ą Á±Ô’«lđ»´‡cf?Ěs=âęôŘŮŹóĎx…ú˝Ă5‡ËŚL»ńtl¤Lu¸Mˇ˛­E[„ŰiîĐ Ć᬴WĄĽž(É8f<ZL7Ů 6Ö–’cŮłaZFÍEJĺQ v6cüÇ3Ţ!~Ż@xpąrrxk׹őňčç'†˝{źQż.€g Ť¸?ěÇă©ýôçşÄ•­IYRô„ jpؤóç'†˝{źQż.€>rxk׹őňčü×đ7ăťÄć\)ĆIJ.¦Ô’ I(,h śžőî}FüşůÉáŻ^çÔoË śžőî}Füş‹ň€oף{˘=ńŻ.€Íb#ĺ¦ ńň®ăfĘŠëIU”˘ ˘w‚úI¸e”,+‘Ő)RřŠ\á&1Šyć·m©IJK©Nôôö·“nĺćN*4Ü;xUeŢŠ”#G^aĆşÁ¶›xN(t´ôű·<”s8Z^K’ťČ8ěg\qn˛†ˇ©ŔĐRR°ůŇ,ß%¶j倲{őnx‰řJ—¤ęuĺ!7¶Ą$\ý7(žČB(iy+Đu´źßÝ ťJĐGp¸×—@T¦:gÄÓ!Ć@y;†ťkGłmIHŢôKgjmĎËzjqäĎ•9ŘÍä—JËępęÝ.z‹‚‘}”’á„ĺW)ŐÎv!”Âă´ŘQ [©t(ňnAFÁnsËz^Źă˛ÂŚ´‡$ ¦Ň^a.8P¨…úIR””©Jż.­Y <ŹŹ čďeßB_őj@Bw„ “c&çjŐ¤ €Z÷ŢĚĚ{E«ĚŐ»Ósě@ť6î8ŰPŞ|e-J&Ä“íŤsź· "óQĚ3¤d\€¨ď¦@z3Í%ĹiBѢáŔ@:öĐx®ČE‘×SÄ™hT¦äş‚¶ô8Z)µYŇ4Żf±ő,6:ýĚ–ĘÓŮů©đcď_uQ™S{˛$ 7€ jMąÎŰ‹‚ľ; &4cžź.[·Y J߸^«‹­@,ł›mčŃŔ‘úłÝËJ‘¤ÜSí!Ç\»Ź«^řXŮŹFĹFü˘€ł—ŕ2wFFď@ : k·ä <ëx˙;Uż… =^B XSh|-JZUµM$ˇî‡»@!ףzôűă^]ż˛^ŰĄ_’×EďăP ¸ĎöO*ľ«—8§ÝŻxҬĄ­ :”ĄBĘ Zе$ňÚŐ“+Żax™Ĺ©Hă’č[-†‚F„“±E-Ü“q~j¤ˇe†CQYjdö’„%.ĽťI P*¶ť—  ¶ň/ť3ă+É  o"ůÓ>2Ľš ň/ť3ă+É  o"ůÓ>2Ľš ň/ť3ă+É  o"ůÓ>2Ľš ň/ť3ă+É  o"ůÓ>2Ľš ň/ť3ă+É  o"ůÓ>2Ľš ň/ť3ă+É  o"ůÓ>2Ľš ň/ť3ă+É ˇźmS±ń˘ăňi‹!ąĺşŮwŔŃ¦Ý 7!D,$ôN›+e*(Wńľ"‹1/d¸¤ÎŚĺÄĆw[­i-­ǤŮIUÓëiQBsÚ™Ź‰y.CkŢ?)ۧQ(P$ X GbG  ˇ)Ľ‹çLřĘňh(ČľtĎŚŻ&‚Ľ‹çLřĘňh(zä¸a ‰Z‚ÖŁŁQ°! s} ą¶ŢČłĽvK¨şÓ»Ĺ:7žíi@V•)+ŇľŠ­cAB#‹âHŹ©ÉÜP'4ën%ö–Ń@+[e(R4ŁJ¬®…ŻJЏä)–!±.zdż«})ÍI+ş uA±$ň ›e =ä_:gĆW“A@ŢEó¦|ey4 ä_:gĆW“AC×eÄK-6BÔ’˛t\«Mąľ…LëRr1’Ţ+,q’F _J J†Î‰°¸PMŹrăž‚%ă˛NDĆ!Yĺ'!nŞL´!.ÜŮMř/atě ¨(%Ť…ÄĚHŚîS‰Ń-†ˇ!†ă! ňě •h%6şnÜú4eq“2+[ŘüŇ1×QłeNOFË!Ú-üĽ‡e°é¸ŐČ^S<Ôô<†C,]Í,)˛ć˝ ]Ô ­Iđş[,I ˇ5Ľ‹çLřĘňh(t•Ç I2Z° ň«ÉĄE×\‡×5ďżęo/ĄZtkż…n[mµ*(Ď‘ö×~Ýtk#š                                 Ę(R–yOÓ?fş–G‰sŢaTÖ˙Ůfox1.6-1.6.57/doc/screenshots/arithmedrill-screenshot.png000066400000000000000000001732531326741342000233160ustar00rootroot00000000000000‰PNG  IHDR X'gAMA±Ź üabKGD˙˙˙ ˝§“ pHYs ‹ÎŁzŠtIMEÓ +/Ý·/ IDATxśěÝA$Y~çů_ Vđ` ĎŔ Ü! "  *‹t5l׬`2¦ZssjXX†ŃaF0+]¶˛Z¨+ű¤ŢĂZ ő^Í–Q¤n´uĐNÖ@• Ýt6¨ *Á *Ŕ”ĂűCä,ÂÓĂÝĂ3"Ó"Ü=ňű!I,ĚÍž™GäŹ˙ű۳מ>}úéçzôDxy?řßżU|úą~řه뾀›ăźP»čW±î7]+É˝í¶ół='RëÝN—ëěNo%ĺ“=o÷«ďu,pĺF{ďv‡ŹV;ďtŰăŁOgʱM’”Žëk˝ą+đOć~ŢK˙üţi÷gĹi«?x•ͬĂřŢt{”–žóçđO˙ô{z…7°Í–Lţ»˙řßşŐ‡üáG˘qÜźýôĎ˙ŕź~ô'–ď-ž¸…ľţfüô0Ýü‹°µĆ‡Źü´ŹŞyňË®kîOÉv^…˙ĹÎíůćďżßK,ďÁúčO>úđŹ?”ôářďţ㳀ŐŻąČ5§;ćßýÇ˙6·snϬ?ü—ďî˝$~žż˙ŁG+˙Áż? vßţł‡’Ţ˙­˝÷ľ:ŞnéÓ?{¸ô€«Đ×E§guňŻuř¤ůëOĆăăssŰÜ…V˙Ŕ)Ě IňINőQ·ĎĂŃWľŢmŹućŻ˝Żť„ŤÇ˙ý'×pw?ůOôţż]>;ץ±Ů¶¸gŃüag÷?ú“Źşíi»U7c¸"'M=}út¶IkuĂV­KW’öŢ ŐIŰ…|óŁęÖĹďÇ]4Ľ®wöŞ˙í_ż3\â7^Ŕk3VŮ©iŃ«Űxíµ×~ňźţhĹYç>E8Žű҇ÝöŢ䡷ţáx‘tŐyúôéôŽg·}ăöHҸÉV„ę–ľq{ô“O»Ź¦%™‡Ź›ŰC»÷ź)nÍV€~đďß›+ŰĽw{ôţo«*Ś›üW˙ďáá8Ížň_˙áđý˙iO­ţó˙w8ڶ˙ŐQ‘ř÷‡]éë·Gďm8z#t÷vđłúáĎÇĎ˝čôŇű_ŽbĐë7ůá/ęGăż«o˙ŮĂĘě_ýöŢ×oWáu˝˙[{?ü»ÇĎýúĎuŢWxů‘ŘRÓśôôéÓnă"“ßüýď˙ř/ţpzn—jΫxuV-Ó0mĆ:,ß;oŽonžKŇź˙~üw?ţć?˙ćßţäożůĎżůăżűńę›~ď푤O•‚ĄýwGď˝ý,`=;ćvőé?6«Ç™ó­ßŮë6FUřÖ?Ű»˙_Îdßűí=Iz]˙ćô0IŁ7Âżůť˝ű˙ĺŃ{ż1úÖť™ýUřÖť=“~ľ*'ťÜęÂąż÷Ű{jźsnăţן~ýv%éöN5?ćĺżţżÂ Ś Ŕ‹h}Ú‡»Óu°Ćź}Ú}:wřáĎw.ő’ U?ůO¤…uKKWşČ:XÓµÔsóÓjďěĹnşí“[aű[zçÍřËĎĎô!ýđďÎç€o˙ŮĂ]G?ü›_6®?ü×ďHęŞ8łľ˙Ł_ţáż}:-e­6[úşH€[°şuşXĂŇ"Öďľ˙»Ëďăď~ü»ď˙îßţäo»żĎ»Ä7Ţ>ů•Ý˙_ľţlçWGsëńçMľXŚťZýßáĚřż\8˛şµq¤ŞZ˛sÉa§ç>zÜäÖ«qç v’ĂňŻç?zŻÁŻđ#°Qľůűß_ݵh6~=·K3}W’ž>}úăżřĂçf¬sV—®N[«0iá]„gĄ4îń]„śśšVȦ9lqϢ%Ë4ěMja±«éŞ ÝúXĎ5[Ů:ďŮĂ÷Ţ>éŞÇ'żÍÇź7s­ö×˙ý0gIjj3/ăáĎÇőńaÓśŚ9nň_ýýáĂÇă‹\ôŕŃřŻ>>‘őkIjšü_˙áđŕ§Ďź(ĚYź6÷˙ź_®X«ŻŻŔu+¬súăI´íěŤvöF»·»ťV&)†q¸‡»’¬fÁěB˝:«}ó÷ż˙ÚY9ëýű§sYjqĎś×ţňáÓOú¬ ł—ţŃ˙ŃŇH4JÓtuńőŔ«®}6gć“gť0Ţúhx2Ű3>zÖKăîqpZ…yrdÓs˝ĎzĘUŘýę{’>ůŃć+XçĄ+ť­iuU.,šŻ`ô¬[őŞëŁjół=' =X3;˝•”{ěÁşRçV°đ’ž=EX­ZGŕZ&É IŰ÷–Ţ3Ë4|ű_ěťwVřÁß<[4€)B€ž°zFŔč  g,€ž-ŮóRw÷ď.Ý˙ŕŕA÷ŃýÜÔ˛kÍ >˝âěĄ{ż €p‰€ŐąÎřr‘k§Ŕ¦ątŔšµ´b4[|ę=ý,^q®”Őí!u€5ęąkwfçěz|é°ÓPEşëué Ö4Ü\CŽ9Żv^ĆŘWŇŐWúˇ¶ŃKő`ť‡`^eW¸ÖÝý»W4‘÷Üa™@kÔsŔšö¶÷˛$U7ÎÜh+|î×ൿ|řôÓź>”T=ţöżŘ[÷ýlĄüÍáp÷¶¤O~ô‹ö`­^ˇ_+–ŚżŠËôë˘kÓpŘXĽě g,€ž°zFŔč  g,€ž°zFŔčŮ™…F>>X×}pÜ˙îýŮLů‡őŐq˙»÷đ7?śţ8ż’űţťýë˝n2ţa}51EĐ3@ĎX=#`ôŚ€Đ3@ĎX=#`ôŚ€Đłů•ÜW»Ër´€WŰľß~ĂRď[á˛o=ş\Ŕýş÷ť{ëľ<ßes0 €u˘‚u#ŃĐ3@ĎX=#`ôŚ€Đ3@ĎX=#`ôŚ€Đ3@ĎX=#`ôŚ€ĐłbÝ7–ŰżłßăhÜŚÁ· €ÍŐW¶8řř`1ôlďŕ›Ź)B€ž°zFŔč  g,€ž°zFŔčë`°­îîß•ôŕŕÁŤÜé}ü+|CPÁ`űÜÝż;Sz\Ň]úé÷BW:řć ‚ŔöąŇtrĄUĄ›Z˛šCŔË]ĂäMÍ[L€%®.]é"$`€yWš®^,péęĺ°ŔőąŇç7Mî`‰+Z­ęÁÁŮŚuSëd,¶ŐŐu _Ű×6ţ& `°}–βő\¶wđÍAŔ`űlďZ 7/K-E“;@ĎX=#`ôŚ€Đ3@ĎX=c™6×ÁÇ ľŤXl¨Źöďě3ř6bŠ g,€ž°zFŔčMîl¨~űÄçëŰŢÁ· €ÍŐW¶XúXßöľů"č  g,€ž°zFŔč  g,€ž±Űíîţ]Iô>ćÔŐ ŢďČ›€Ŕ›KBýşŠô3ďîß˝»÷Ff,¦ŘVW”N®˘$¶Ô72]‰ XjZ»©čJ°ŘJW7ą6;ěÍâÝřôĆ!ŰgŰ[—¦“WÚC¶FT°ŘJsѤÇČum=X7 €í37‹'ňІaŠś1»†‚úŽnW:řć ‚Ŕv»ŠŚrĄąç¦†ŞY,¶ĎŇŢđ~{°¶qđÍAŔ`űlo…éće©ĄčÁč  g,€ž°zFŔč  g,ÓŔć:řř€Á· € uđńÁţť}ßFLôŚ€Đ3@ĎX=ŁÉ€ ŐoźřÜc}Ű;řV `°ąúĘKëŰŢÁ7S„=#`ôŚ€Đ3@ĎX=#`ôŚ€Đ3ÖÁ`űÜÝż;·çÁÁ+żß‘Żzđ A €íóŕŕÁôOďwh:řbŰŘÁ7 €-6Í+ëľśAŔgLkK¤·FŔ`[]QşŇYĽąôvSŃä®Ő4ŢŕŚE  g,¶Ň–6HÝřÉÁ śqĄMîŻH==XlĄ+Ť&Ű;ř† `kőÚkKv>}zí÷q[t«Ŕ+`é,[_Áe{ß,`M–ć•ŮŹ6'»lŃ­ŻŚí­0ÝĽ,µ ¸v+ňĘâaëÍ.[t«°Ihr®×#Ë ߣ-şUŘ0,`ămQp٢[€«DŔ®ŃĺŹ-şUŘ<,`<}zňç<›w¶čV`}hr®ËyÉc6¬<}ÚO@YäRč×y«p°€µZĚ=\¶čVäŕăßF,ŕşLĘ懒-şUŕF;řř`˙Î>o#pí¶h˝¨-şUŘ$4ąôŚ€l-zĺßÝ*\/°I¶(˛lŃ­ŔµŁ Ř [ÔNľE· lą~űÄ_ńÇú® ŘYwjClŃ­7B_©Çú® ŘTĎŤ,—Ş$­8řĺłé Î"`›j‰6?ľlŃ­Ŕµ ÉŘx[Ôó´E· W‰ °ć ?‹1ĺµ×6Ą8´E· ëC Ř}ţěŰŠ™¸ĹsŻnÚî"· Ż[ćîţ]IĚíéĚîÇş0EŔÖ¸»w6KMwJzpđ ‹V‹ŕúQÁ®ŃÜTÚ&O˘mŃ­Ż"Ô¶ `×b‹¬Ű˘[€MĹ!°>+˘Ě¦Ąś-şUŘ,ŕZô2Ĺv=ót[t«°©"ÖŞ+˙ĚĆ‘Ť-mŃ­Ŕş°€ p‘¤˛!5ˇ-şUXp]–.Čyu×zÉÓ©NŰăÁÁŮĺXk°€kôÂÁĺúkB[t«Ŕ«g1BŞ6  ¸^/\ÖY¶čVWŰŇe±\ëEŔ®]—B¶˘™i‹nx…‘Ą6 X“ŐŮeŁňĘÝ*l°V[”N¶čV`ÝXh g,€ž°zFŔčMîl®ŹÖ} x,6ÔÁÇűwö×}xLôŚ€Đ3@ĎX=#`ôŚ€Đ3@ĎX=#`ôŚ€Đ3@ĎX=#`ô¬X÷ đJŰżłżî[Ŕó||p©ă X¬Ó˝ďÜ[÷-ŕů.› X¬¬‰,€ž°zFŔč  g,€ž°zFŔčë`°6A¬×^{íÁÁéŹ{Ăs÷ą,6ĹeßÇrť–ŢŰŢđ†ÜS„=#`ôŚ€Đ3@ĎX=#`ôŚ€Đ3ÖÁ`ËĚ-ő4]đłŰ©ő?_ŕ”pw˙îěŹÓU@»ýk_ô*PÁ`›t‘čţwďwt~Ţş¸+ XÓŐýŃBŢş‘¨`°•fsŐţťý{ßą×mßűν.0Í ™zŐ\&›žrť¦1ëîţÝĹŕ5»çÁÁ­«uQÁ`›tIčŢwîMÓRWÇš&¤űß˝?ŤPK«\ÓíîŁé)WtĂÓ¨4[ĘŇLZšËR‹akiŰpT°Ř2űwö»’ŐyďÝ;řř ;F3qj¶p5ŤVł§\Ůý.ÉX/púvˇ‚Ŕöé"Ôt{é1÷ľsoi›Ö´®ů˝Čs˝í7 €m2ڦkq‚onŠpé§×cZ¸ŇvÖ˘^  €íłşejiÇŐj×\Íšłş¦µŤ/Űd¶É}Z¦šűhÚůŢ6Ýżb´iĎVďf°ćz°¦Íö¶/öimăS„4ą°eĂĐě¤á´·}î°óňÓb;|ďVŁą ő#l&[cšĂĐŇž÷ Î^]´Z1»·u™éRXlŤŐyëíŁZęf§¨Xl“ LQWg{óMî=#`ôŚ€Đ3@Ďhr`Sl]űÖÝđµ!`°^{íµußÂĺlÝ _'aë–$ŘşľNô`ôŚ€Đ3@ĎX=#`ôŚ€Đ3@ĎX €uÚżłżî[Ŕó]vÍzëtď;÷Ö} xľËć`ëDëF˘  g,€ž°zFŔč  g,€ž°zĆ:Xl»űwg|pđ`ő‘+¸ěYs—~Áź{Ż繡őrź/†€Ŕ¦›Ëw÷ďŢÝż{ÍéáJ/÷’Ďţf^~´^°ŘbłĹ›Ĺ`±ôÓĹťÓ=—ĘmÓł<čN<Ż(őÜ+^äŕąĂ.~‡‹ńëĽW˙2/…,6Ý4gLÁ\ňXŚ&ç}zŢłşó"ŃŠ#/rĹßhţV_îâć\ýËĽ,*XlĹŚŐ×t^ugZęĺ*ýŽÓÝŰb‘¬ß[Š€ŔÖ…ŮąĽ‹ząô źŰ×=\ľn•€Ŕ¦›­ľ,VŚVGźµw|_|2ń*L‹XşŘŻ˘Ż_=XÜÓqńOĎŰyŮë^pçĄF¸—ýu]  €M7Ű€5WÍŇůŤYK?=ď”éţóJ8Ó«ĎU¤»šÎŰ9×Tţܿы9oąĆ¬~/ýÚ_>|úéOJŞŹß.÷ďěŻ8úîĘO¸ń||°âÓý;ű3||°úÖ›asVź:Ď\Ś»ŠŢżł˙{˙á‡ĂÝŰ’>ůѨ`€›l-S,pc­«şĆS„ŕĄlňäŕŇ{»†¦‚Đ3*Xl„ŮîřWˇ5ţf#`°f]´úŢGß›ŰOĚÚ^,Öéŕă.Z-®#p˙»÷Î_âę*^ÝČ×ď®óZ׉,ÖoqŤĐŐŤŘ].ą˙Ýű÷ż{_gĂV_®3ôÜĽ€E €µéĘWçe©nťŇĹđ4MWÓcş€rď;÷¦Çt{ćFŰÖLéĽJŇbťěącžwÖâ…¦‡Ýűνą=Kof‹PÁ`[MăČÁÇ]şZ¬iuyh6Ť-˝¦+ÎĎ…ąóęd«Ç\Q]›»Đ4BÝ˙îýiöşŇ˛Üµ!`pŁ,Ö“ž[pęňÍÜΗséY+.4[Íš†¶í-b1EV•‹fg/V\¨›ëěÖ \qٰX›®B3÷*âŮO7!jtv×sÖl×Vż*›€Ŕ–é"ČŇĆđ3ę<ĽŔz —:kv>q¶~"ć   €uÚżł˙ôéÓą22Î;K3 fÚ>ť_»TişŕÖÜYÓ‡§ź^$*]ę¬éÁłťň/đ6 ,Öl±Ěs‘˛Ítu†é)«÷ś·=·gĹYóâg­¸ô›‰€ŔFx0qŢYçí9oű*ŽĽřYĎ=q1EĐ3*Xl„µ,bŢW›<ć°Xł.ßtŻ|žµ˝‹€€Ŕ:uŻ#ÔŮ÷=ßÝż«™‡űÎ;Q+^_şTúŇ·.}} ^ €ő›[hôĽ×?OÍ˝pé1Kzčž›쎜}šďŇ_g°X›®|5ŤSs5¤ŮeÍMľš]ú\ç®f÷ĚŤ<dé[źçę[ş.‚§ŘłE©KŮ˝őoş8çâ’K§gWśš{óÜâĄsRĺş[onÝÎŐ,µ40ÍÎ!vsQěnőAŔ`#\6¸LßEsͨ]]=X¬M—ĄîîßíÚ°__sŢzčłďé»÷ť{Ý,!6 €­t^%iődßeGĂ‹aŠ€uÚżł˙ôéÓĄŻ^ľTč™}¨pvśĹťsZqÖbµ D €5[ş’ÂyĎ>ý7·göŁŮŤąťs#<÷,ť>qö]:Ż2*X¬MWľ:/Ku‹#¬Osm[Ýzîç“KM:]kúŃÜĆt䥗[:ÎŇ·AĎÝŇ«P袂Ŕ–™[´«Í}:·=]Jt.ÜĚśćk+Ź-ÝyŢK —<|1Ý<—«`=¸Ńż ¶E·ÔçĹß÷<—ŠÎ[ŃjnŃöéGł§Ě.:úÜ•±GXq'7 S„lĄŮ ÄiYhőń«X¬W˝ĚhWtî¶`Š€µŮżł˙Á‡tĎ .ýôĽ˛Đlehnăe,ť Ä `°•ž»4ì®˙ý‚?÷ŁŮ„w‘q^A—›"Ď"fm/ëÔ˝ŽPg»»ş¦çűß˝żbyôóšÜĎ»ŠÎ>śxŢ+ —žőboĽř…nz°XżąŢůž»ÄҰ˛:Á,>Ř-ńÜł.rŘꋾĚŰ kÓ•ŻÎËRł/ĂY4}ł–˝đĽşŃôČéĘUłW9ŻX5=LçôŠ­XÄkîB+~áR٢‚Ŕ¶ZD–®b5»=[OšÍI+Ö8ť}aóâ‹ çvžwˇĄ_äęŰ…€Ŕ¶ę–Já8˛xâŇÔuŢąÓYżĹĹč—ö‡ťwőŐ™oK°ŘJÓ×ă¨×wŃ\*®M_Jxď;÷î}çŢËWžn@íŞCkÓĹŁ»űw—¶a­hŔšZńçk3ťőÓfÜĎ& ‚Ŕ¶Z]ľzn8[<ŕRńhZľzîoL]ęâX¬Óţťý§Oź.}×ňĹsÉâsyłĎ.^ńĽ¦+oťÚ¦çN›ľ¶ąŰ9Ý>ďB‹#\đ;n¦Xł‹),5Í4łgÍíś;`vĎy#Ě}ÔĄĄĹÓ熚ŢübŠšáĽ[]zضw¸Kzí/>ýô§%ŐGŹo—‡«żR·°,ݬŐëΕť¦ťÍ7­'˝‚Óy˝Řżł˙{˙á‡ĂÝŰ’>ůŃ"čS„`~ůuĽ$*X=#`ôŚ€Đ3z°X§myĚđwŮî4ëÄ»e¶Âes0 €u˘‚u#ŃĐ3@ĎX=#`ôŚ€Đ3@ĎX=#`ôŚ…FŘ>w÷ďJzpđ`ĂÇ|±{ęýf®í;RÁaš~ş?ZČ[[„ 7Äl™ (Ó‚Í쏋o¬ém/ý:ť‹ěĽÎŻI €›`¶üŁçŐ~.uđµ™ŢĚÜíuîîßť˝ŰĄ_aőÎëüš,n¬Ą9cÍ÷´Ňl6ę˝ë:ż;S„Ü—*ŇlHájŃ´Ú4­ZťgéWŘ„ďEŔŕćXŚ#]XYZľÚ´jÖěM^pFoéWŘ„ďĹ!7ÍâüZ_ŻŃŠ›\úw^çפ‚Ŕ¶š{bn6RĚVqşŹ÷,=xŤćîJËľ…Ζ¸ćľÂęť×ŮçNŔ`ű\vjléÔáĹOż6«ďá"Sś«w^ŰwdŠ g,€ž1E6Ú&Ě]^,€ž°zFŔč  g,€ž°zĆ2 ¬ÍÁÇëľ…ŢÜ˙îýŮŻs“ľšľÝs°X§ď}ô˝ußB–.Uu3ľš^h!.`C}PH­¬0o]3ŰVČ[YÍŚj IDAT!µŇÉöě~óÖăɧ¦Ós»ítvĚďµëţ’’6x!Íý;ű9ěµ×^;ýjWŤ€XŹt’x¦©¨KBłiI­ÂÉţůżOŇłíÓĽőüíPX>ÝţÓÓý©•öaëëţĹlśç΋ݰ©ŔľĐäXĄ[˙PJ'U(wÉO·ít;·žĄ|R…rI§™ĚM˛“J•Guu)©uÓIeK3ăL·«Bj=HˇU(¤Ö«™s?’>XëŻeó§. ` >Đ´RuR…Rë]m©ű»:SťZ˛=·'žĚ ž©u™ÜufŰä>sŚĎś«Óż?:ÝîĆż!mDĎsw˙®ž7Ł×Ą«Ź.8uřÜKt{:‹—žýtöóÎşČW¸6,Ŕ|ORë=ëťr;IWĘĎ’–¦źĆÓcşŢ)“[iĎŞYf’ÇR’«° —É Wk.—Ô%6—ç‰L'ăK’» sźŢĽőŞP~vWú ŐÍÎX‹9f©ą'/•±–^b6ÝÝż{w˙î\6ZĹ–žuÁŻpťX€+ô‘4×#5ŰuşÚŇiJ µ(›­Efr•&y03If’K&—ş=Ą$7™JfŮÝ[©Ő0šÜ˝U,e…©pąą\­©đĘě—żp™ą?«~ĄÖ­°qëVŘG­¸ć_äZ, -őbU«K]â<Ď-M]düĄuŻ‹ďĽ,ŕ y!o] ˝Pńt˙lOU—ìۖÇB*\…Tx0U]]J˛ŇĽđް,Żrw™ňDˇ EłTxlÍ Ź­Ą‰›ĚÍciéôŠjŐW…˛yUÉJąĽu÷®~&ą›”üdż¤?ŐÉ‹Żš›Ńtµ˘îu‘ť/pEŕ Ůł'Ď<fş¬4SÇňÖ˝0+<–&ye¦ÂŐšĹӹгő¨|¦żę¤·étťŞ“c줿ĘĚUČĚU*”>2óÂG•ĺ/]·L­ë ąąZY”v†j]o\ŐÄrëÁ”K ňÜÍč™W;ßČ^‡'‡yâÁ-ë¤f¦$+=XĚEŞÜrëjc.R°(%ąšÖ«‰e÷äŠ_şż.3EŮ[6šřáçžÖý^—ą ő2=ď«ÍuA©Ź 4çĽG—^če®NŔô㣳]V]Ő*Ď×®ĚNWUĄYé’Yé•Y.Ľ*Mo¸™™Ľ2Ë­ë ĄIŢŢ“¤ă±$M\­ÔŞ’ĺÂCa*ZË­E®b¨ăĂP•Öu¬‡8”{peOˇ5M’dM·FĂqňlî©zÓwł.±™O<Ľn22oĚŐęö›öÉzËëłgš±zIW]֙Ɲ ćĎşřÎ@ŔĽ¸™őBĺgf]§kYťťt+-›™ Źfxe’ZXW=ž]Ť] k\™ĽŠfĄ›™•J“y¬ĚĚY–‡Ö$ËqŢz'”C5µ‚ÂëăĐJE”®E• WˇŕQ'ozVe¦R9)ËĂŔÂđd±ř 5JU2¦ánIÇ>®ÝĚš‰[aő®/+™LÁM¦čag$oŞVů8…ť8~’ş§Crµ,®ű?ŔµÚüő6 p!ťľpvýŞîď|ňö›é;’珩˘yé±4™[u˛żK9*†C‹{ŞFY És™‚7>I*¤•Ü'©ÚćT‡#k’[! ÝoŇiOŐ@Ábžx¤\(ȲÜ4l&ÉZ©Uh=wő¶/ÝÝd.Ić*Ě»ůÁŇ˝Uó‹GÖJĄI–ŹŇh8Ě©îFÓDőý÷`mČˉ—zÉ{ŰäŻvŐX€ç›v\ůłwJ­ćz­ŇÂ;»7ýES50•>¬ş·FµIEW1ş­7o‹ą©$óĐJ…Şr¨®;ްPF•|¨6UŃş74ëŘCiŠ^É$i")jR{maWÁ˘äÁ˘”˛ŽŹ”¬*=wo€~ýäFo]ż6{Ý­íşÁ†yR§Zţ…Ç[ćOęŞëŮjm\¸Ţčąëţwď÷;ŕć¸Á_í"X€U>4Ókźm+Ę­={ź`<Ý–NžŃ ÍĺŐPńÍÓ·,KąMÁLćařn¶Qh=qčǵÚĘĐLĆr™’&ňăîMŞ\Ů,ČsŚÁ•Ű“5H•$ó0°”Ü“YY‡2š’łKÇ)y•–]ÁĄÂ5J)rą}ˇÔş˝.»ĺî˛ÂŐęđ¨¶/ećń Së!ĆÔ˝kď´×Ę[ťT­¤Üj¦×ęd·–™¦Ď ĘLćUT.Ľ*Ôő¶g÷¦>ÚŤą´š<´`¦cU­«4)ä˙ńI ŐÖ*Ô¨ĘU›I­2ćV::JÇí(·)´˛˛[GTą*$łć‰Ű“şţBv+ĹÁéMJąU˛'ý,)ÖŁ‰Ćµ›jŰŤ~äVÖi"ýĽ¶ ™˘I…‡VMínňä!yÓÖŐÎmµŤRʦPĘÜĺJŹ]§Şm`ˇ8i$˝=T©ŕ’×:VVJf6©«Ż I……Ö÷Ţ´&y°Ú$3µ¦VrÉM»¦¤8IiâŐÎ(Č5ˇNšHr1OR0Sá•LĄ)ŽŁ~eňq(-ę Ń”|´#µ.ďż 7 ^9,[ă*ź®q5ŰĄ™Ţ,¦îÍÍr©{Ołl¤jgŰZÝ e*1· ­rY…ăf\x,Ł&9LĚĺ2łÚC<˝bárkŽ“E“EA;·ĂÄóä±OĚ'.W4—›^ wóŕťęřa“R–ĄäĘĘžÜMÝ ® sw{⹍áŘ5Ś#OůŹ}b:ŞŐ->Úš{Ş,fóĐZv÷c—ĄJ·˝őĂĎÝni4°¬$·ÜšŽĄŇYöž+XŻřrç[äţwď_ę? ^!śÖ®fVŐ\˝ĘgŞVÓí®ËJ…U§]íUixµ;ÔĐÂ$6­[I垊±Ü%…"ę-łGŹ™bĄtč‡6¶ß8­oE rŐÉł)şV§qm·,™Źv‡á«#ŐăńĎęMJu8ň|śŞÂdb×I­ůÄU¨*¤Â˛{M“ŮŘÓh’TČÍĽÔ¨Śă䣩Ś!©9:ňd^xUšËÓföxTF˝ŐýóčˇUž¸ZĄcŹÝzZE˙,šÜo¤˛î\‡Šůľ+éŮWŇLíęô3ë]ÉŐŞKW.7S6·Jy`ŠU.­ÄT¸vľžßđ܆䵣ܦü…Ü\oŢÎOóqľĺŁ˝(ůřóԸ˽IRiń-«âP­F{1e×jÚZî2íÄćŘe–Ł7îă_Ő))ËU(G˝=TTȢ­™xj”'®#ĎGµ&j’«4ÄQ´<Ł·÷š”T×Ů“·:}®PUŚĂ7·ćŘ«n®ĐŐxRaăLÝJ¤ń‰©Ë\è‰ŤMŁÁ»Ň8ĄÚĚ“[ Ë“:”&)”&w‹V <'ÓŰ1J˙˝®b<ůľÇ)»ľvŰĂf’ÔjôŐ(YsTWĂŘLĽÚ‰a’4´ć‰››JŻĚTČ'JĂa>®ëcz°p!T°ŕUŃͦÖOúĄÎôWÍţ}˛?ů´ďJęŢÇWz5™Ç‘|ŕ łĆˇőü†FoíĺÂ5ńśjĄĂzĂÔšRr÷ŃÎPňŞ0• ©Ţ{{WÇîĄW»·UJ˛ńŻĹšź=¶®âUD™ĹPÖ˛*×Ő 6G)' wGĄŹëzT›ŁÚ ;Rő$c,\ ^ 3ë]UĎŢ!xvŤ«Ĺľ+S÷Ě E·BY>Ş”Ł‡î-R¶dMÓTîŮ›’äAĘ…łÜz(GąmÔĘý¤Ó+ bŽRódZ)Z{ŮŽště)=R«Ż˙vĄP*×)H‡c ß”wďTŞ KŤ[PÝř°¨U+{†Ăśęt,‹ňÉ‘EĄ±¬‡ŇĆ©63/b5T®ëĆĺ_z¬’ňVÖ>6ł\§J×îőŃđ7ßýĆ{ůóĂĘS#nąMˇš¤5ţ7ÄaŠ^ Ö*f'u,YavŇŹu˛}˛ßĚ ĹnE+ł`RyňĚ`(U ¬23ĹÝPTÍÄÂw4şm)©~Žë»ü¤RŐš —ĚĚ%“ą• Q±2ÝúRÝ ă8TďJ)´ŤRŞ,6“T#•ҤΓ†{˛&'î­iRł]“KGžÝLćŁÝ¨Ârť|âᤥެ𰻛?;JOšFďĽ=ÔnęÜ´G*MŻűŢ0fKa0T›”ęfâ2ËîVšËý‰Ş7Ąµó/ją‡·LÉĂΰyRW;Qî*¤2wMRÄ0ĺ˙q'É “{UµăˇNÄw†’¤şVŚŐ. Â!ĽfŢ3řěýj݋ӿ ’ŠÓ5±Ě¬t2;yW`•Í-›KăƬŃ07Źôůăń$Uo˝ź-JAq(Y~ňXuť'IÝŇfY.·¦vyry6J¦|r„«TsTçÚë±»+×Ijľđw~+fóüäp|tT -ţ¶Ťv,G-iâ*Ľ*dîA’k"+]eĚm’»—˘ĺä.eŻ«ËË­ŹkפnRj\ą•Ząąg™ĽŠ–Í+ó\¸ŽS“j••–ź¤\Ó… ˇ‚7ŮGgß68}Ϡͬ}eÝűřJ“y,Ě»ÚUwLáŁhö†‡hŮb”§PîŤß¸3ÚŮSšO‡öpd>ţůOF;{ŠRÓ”V™éł:›ţç&Ҥ–Y3TUX®]_ŢU“TEÓ±+ĄęŘš/ä­Ćî;ădiěŁ=ÓqňGVý†«0{HRá!™RRmY ŃôĎnűg‡!©iU˝uäÍ$UŃô¤¶dąpąUĄË­I^M\Ç’,oŰŃăPš’«~ěcÓ^Ũ¤0IŤL.u+×׏«8T‘´Ă2 ¸ÜdÝ<`j=ęŢĺě'+5¸źĚĘ[ŻJ“Ü yá&syĄÂ­0{ĂĂ@ąôPX.ŠŘ”ĂŃŰűyp;Lj/÷䞋ÑUŮ›P{c^ bV%•ŽRŽ Ą©őŞć'É'˛=©›«PÓŞë‹ňVúRU©\Ȣe%ŤdĄÔšý†g7®Á0×u(¬™x5ÉRXŢ’®Âm'ŞPS'‹– …á0×VČv%·\XµkÍD*ŁíŢoŽr”R“룠ˇ˝QWsëˇUޱŠĘîa˘Ć=”Ă|\łńS„¸ÜdÓµŻB+ťv˛Oű±şuDÍ̤îmUi*˝Ňé{ťoą†¦áí`.ĺP„¦Ú«vľˇ8 ąŹŞ‘&µWT¨5NGq0”ŞŕÍŘ=šĺc…5¦Ş¤ŕ:üµöLj}Ł˘UJMňjCtIăG ©Ôř‰lhá+{ŞÇÁŐ,Ůř¨Vcá·¬ľr{t”šö°Ú‰úěq¨ĄBaâůWÉMoy5Ş´8°Pšvö4iÂDú쨲(“nUú|&®Ł:ԦߴŞę8ĄĎUO|ŻMri" Ľ2kŽëĘ4®Ý®ŕ]„¸‘Xp“M׾ ĎÖ¸’ ŮÉ;ő\¦`Ý3˛RY>2é–[kŠîŃ|`a8ĘŻ+äܤdńv.÷‚[®†É8{ʡ$ŤsGI…ËÇăImĄ©TxbÍÄ%K#)—í™G…VąMá35’–Ł…coZŤ,'—š/őÎŽňńŘë$S5ŞMés5­Ź’Ť=Ťě0Gł‰Ćżz4:ňl®aLîŁ"ú ą”ĺáŘUFEËOĂÄźÔCY°”eJ’ęÚ÷JĺB!Vy22µIRvIî _fwKžcµÎ»qA,¸Él¦ë´šuR»˛ÂUXčzŚN˙®Ě,( ,·ÝłuR9Ň- ĹPE2) ß•™Ň'ˇČj‡/ó— o˝§Ç?ŃÄB!’§QŚ*\…4”›’›™Ę˝ F.µuhm<ńXX0ÓqjŽ˝J I’W·Lî~$™*łü¤ĺPŞ÷F&)ÖÔ©úʻک‚KíX*üËoëčP?˙IőŐ‘R#©©k+¬9ň4¶Xřđ–Ą]ůÄtěU50Ą¤)˙ę‘OLňXYúŇÝÍĺVXS§®–w’ŐÖÚä~w˙îěŹ\Ń%¶käÍÄS„pc}PČOź\ňw«`.©i=Ęş§ÝÜKĺ6ąY.%5ĹPŠąH2Ó­Jq”ÍŐZžŻ’\YžçWpľěÁąŕfđĎ@rˇ„ Q#Ńł(%˝Éeö®{7ł¬íěšYŐôź0ËîYMmŠÎĄ6M+wRC Š ą@ţ@Ě î…gpľŕ4 ó%)•ĘęĚV(äĂÝžůď÷,ľ~î÷|O'sş p%e2ŞP­ňŠ Á¸}źíăt¬ëhňŇ1XPęś;‚Ěť÷ť€-†7{^“[N‡ÇJ 7»H°D:ěf‡·}‰^ىkćNt‹0×sýŹÁs˛ţĂ·ôÖ…—ŠKëÂ… ^]Úó Đ€gň÷yWN®:†”‘d¤m‰nÇl@«V'Ů•np¤Ź- e™s˙މ€?6ě‘hKÝr.łrGĚuť1‹t7ף†-ĐßXŐÔÍž­Ű",G`+čd] •eĺäv$)jŠ™ő^şÝ÷Łáć&ţź˙˶Ł="Ę€ľdő¨ł eQIůŤî&kDŞ2„ž¸;čć2š ,ÎÜi5®Y"T <×Ř^>^TZĎKDßŢů\˘}ăÂ7nřâÍżçŢţ¤‡řů®žs©`]¸pá«ËZ©zđ]=ź9‡Y„HĎ×Mč Ę ŕÉĂúH  š)Č"FUđÝđ÷ąýuřcĽ±ăÍcËý×ß)ÝĎÁ8ÄőnM+ĹÍ}‹†Ń۱8üf‡Ţá9ČHśŽsqăxóq±ťň5±…:UĽ1Ƶçk„+߯€NúŠÓÝm˝˝Ť»ŹË§Oçhó4#’ň–č1ü/7Ń‹â8O p-ĽąĂu?ÝVn"$¨–5ëŤú>šĐK…#¤Ü1–­‚ő\ÁĽXĘÂ?Żl=żúť;Wž_ţţcţč˝ýIń3,¶]*X.\¸đĘÂŇŰ_tbq­`It ňD@™ô+™.s€°«1NŮşEyxŚäÖe@¶Đ >ű$–ů;1Ë(€¶8Ŕ‡H;Ó Śí`‹€ÉTŃ ¤y… IDATh‰Ó¬Áó>§ŚyźíŤ„¤Ż×eć5”ŁâĆ­Ł=˝…;03fX%({Ł·ĄârP˝ĂđŻ—Ű=gY"4Ănh×c‘gÚ´ŐpöŮmTĆÓ˝˝ńضł­ň Ń`KÁv3ţŰŢ® RIÖÉÚŹYÁú¶ĆúÎ~řý|˙?äN~ŕCü 5ÖE`]¸páÂ+ËšŇÎsÔäß•}µŞ+ś“®d ·”#ÁşDËÉm;F'#Ł…5Dgֽ۲÷¶Ý•Ż>Ę8>¶¦¨´Gc¤b6”ĺ—GYCśçtĐPŘvĄ¨# #9 dĚł5•')î*:ŮšŃÇÚĆâŮçv˝CőcÔ°ĄÄţŔ”Ł[&p0‘&[z8č xÁR×ůµŤŃ’´–ŃU$N‹†­G­j´F˘ĘI@¶ŞŔÖC´Eµ©Á[_E"QöHP˝ÍQź 1Úle_ŽűüĆßAł-‡˛t¶˝% !”áĘîH0aŞ•©Z› 9’ĚdŢ:šđă5ľXµú3„ţĹbčĹçós«Ný.ëÂ… ^MôĽRÄŮçľć`ťWF"Ą)w$ŁÝ®†č˛Z×G˘ů>Z^“=z+NŮ6Śu( y7ĆíĎŃŃŇPćOň–±}Ëz$‹Y5lëq¬&ÄRu't}N†uŽ$‚˛ëÜݢó¨2[ŞŔ2ă5@GÜŚĐj$8'°«Ú1“ĚGĆ?}ŚEku«Üę]Ĺ?ţą˘– ńu`A´jIĐ\śěhd4 Écަyżf°ZÇ V—ýŹýÁ~˙bGů·-íŢ*ÔĎP]Lî.\¸đjÂÄs!_¸ě$Ś$ÁD$X":A)›ŤŔjEKÍH€¶!’}ťĄXľ:X#RźŻÇŘľktc±n„&p߲ĀŃ3ňMľ~ŻżcťĐ‘<{Ć2Ů,ĚÂQh°ëZ!PÖ>ľµ.µfÍ {ľî­s\ hĄöĆŤ˝ŃŻÝ…q7Ů<ŻIˇvóŘŢŘŮ›Źó߼?ţëß°9ľŘ۱B˛mŹe6€őĚťUXfŰp’ë~ šÁ8x˙#}ž˙Ě€őŤjľeĚúŁn­ď?ćÝô!ţPëůţźá˘áĄ‚uáÂ… Ż ˙ÂĚAĽp™‰jĘŽHňuĆłI⺆H0Ž‘`>F#8€´näöhP{Ťť€.ců<{Ž&kŚ˘đlÄ|0·@â$ iŠÔ5eă%Žyx+NĹŞJ­X@Â:U¨ Ęt8€sĄ-’PG^3ß™c>Ř3Cb;´ĎRÜVT”‡Ž?Ű‘[ŽęÖťâČs†gKN`ŹqgĹ"…ąE+h5–®ÇhEËGi!Ô ÷?$SľG?ý‹÷|ăGô!ţčsűąi¬‹ŔşpáÂ…W˝ŕľúĆüA&d¨ěĺqµşŻ`É#Ń8jĘÝct´6bĘ8!o€ ˇÍÖŤˇj>" ËXđAn3Ň»Ö4}ůŃđîßáé´¬,P"Żß3ş+‘ĐXć 2żIcŹ&óÁ: @¶ČzaőÂk†ŞŘÓ}§*ĚU-rś«JËH q÷QĐ8–jMHÂöod4¬SŁqDýcÂZž*Ľ3ű]öż…ŰŢTË,sÇ _ČţőŻíÓŹ¦Ď桫vMŘ"ŽŔgZG\gřPţűž ţú1ŕŃ`ő î*Ň!:·6ăşÇÓą‡ô%‹¤t©`]řA\Ö… .Ľjčą×*ýľ—ĐĎS)`Mr˛B= hýß q/Ű"’,•ŃƸ‡ŃÁbăT°É,y÷ć ó#šGs»F,,u &ëúH°…1U\öŮËŢ#U«*ŞH#Ň!wČšT±c™íć&ŽsĆ^ćŠS™Z Ű>wµ|ń;˛gŶ·Áůô:‡H:–EŚŽvM´ qWM5¶ĚoŢ„„§už]YBt°>GĘ–€e¶#ë˝ôŁš°.üt¸¬ .\xŐx†üâüÁD@Ŕš/J$9řе'Đ­#® "Á¶ě 8Á0 Uk=lçîBĎ>Ćś+D˘ués©·ÎĚGhVý, l9D­–ó›ż)ťç‰X&[€¦Ś,·§ECÇr{›»Ç˝‰hUť `W€Áږ0\?FGĚ<ç4MOgëűĺűŘ”éÓ˝÷ŢđÜPŽ5o‰»j$:G®K3;°LtC~ËňîF‹«0=É pC6ŮÖ_꜆ / Ö… .Ľj¨I€ÖôößĎ„ĐëüÁ&JXšFl e™ Ĺ"°Ź“°1˝f8–ňô´{šČ˘ ¨)6x­ÉĚduo1e°ŹđwŐď¬÷Ő I"Ă‘ű·"Xš!Őč.QĹ»ó|ŔŘŤhĚĂŔ.Ł*îöĺ8ÎĂSĹÝ›\°Lq3řŰ» ńĹ'ńĺ ¨{H@#úŘöe;ÔíÝ»ńhÄö&úÇ€  §îěQ»±v[¦Źq,±¬ ¬22tń`]řA\*Xţś˝ľţęr–ąpáe…ߨZ˝čÁ‚Đ(‰Ťr['=‰–2HKZÉͰ®Ź4Ř&ă¶ŻänŚd– sD˘Ů€¸!NŔ†8›ŻáŁu=0[›°=`ÇóŢZ¨MhďbŮ›*c©"‰ vă­S…ŢQ+¶n‰čČ4€´–'–h7Z'I["˘ Y©·śkť5t^jÍ˝Ű ±MÖh˝G^ˬ8VLSäQŮŰ;KroÜŐT€™HźX%¸e,2^ĎőÜŰ<Ĺrk7ÎG#RŽn˛n‡mXť×g~áÂĺ"°~¸÷h`GÁ<, čÂaH`˘Ŕł5ë0/`ëXS©€%`Mkű´AL®ß_EHhkź°H)´ě Mh¬Şę˛*°s% ŕE„]¸đç…˙<űę۬óüAŠW °dh°N`oÝăłż*ÂaÉp‚m$ëG€k}Ë®€ íëçŐ,»BěČÖ9–š·@«H€ŠÉ#‘‰±Űxř`iÄń`ɧŹSť‡Ý»X`ÝKXŔĽ€Rît5jKBh22f`[ŕăßY:b‘-ŔR-u?,Ŕ\áÂvgDą­9OźXŢý ÓĘ HŮngTYž>ÉN¬ őÉěxř±?Ţ ? .ë•ĺ\ŁJđ”‘"ű@4vÎ$h=Ś!Sd »N0䄲a>Ť@¦Mɧ\¬äS&Z€I¸AA–{śŞm<îe˘Á¶Ś&´M5U,1h,Ë„¦Ş Pďz50ˇ.ĄuáÂź­U–†ü Öş}Ü—qNà Ȁ’”˘Ńb)ęŔ3”Sd“šY™=móPß:ÉŐ^ăĺÜŘkí5ëFH–QÍܢw-d“ůŰťir“‚°×ߍv U8†Ápő1ĎĆľK~ăť©N^'l`EŞł˝ń8 v¶ČŁ©Ě`'»A‘pŽ5ß0–ŞF-˘Ŕ-4‹o»u#:Ś»CnŚmĆq=úˇŽł®{ľ>ŘĐÇě®Ćńă Ć]­G0ÍŮşT°.ü .ëUĂ»ž‰$ŕ9ÓÝ$­ĆhIńĽ™hۀɝV—’Ť™˛PÖ#†Îеđ4 aHůáňş?{^ż(C ě2ŘĐŕ‰jë¤/°1ĂKN675'/Ël­/Ş€ęRĽŽj“Î\<^.ü ůŔżÇ9˝ó!É}ť„C>ôZ÷°•¬s4fŞF ÁhÖ„+ádyÜOĽŃeŰ`BbéßÉ*@ćçšÖéyλťýX_Ă|Ś x.­ä4bKă€D3Äg{[ŃhŰÇ'V˘t#—CQÎ]:Ó>‹x*p´/‹íă2»˝Ýě ĺyĆv¤ąpÓ—§3ťÖ9¶yb?4áö ´ÖŰoďěőË_îQgË‚LA°&xÍ×}ńťmßĹÝŰŽŔÁ„"®…ľÇíl—$÷ ?Ś‹Ŕzpö H˛ËĂv$a<Żč! ŕÚŞ čěź‚ ł¤Dď6€ęĐŤˇŠÁsBiRFăěÁ’Ą/Çů˛ÖµĹ@5°U‚‚Ż[o3Ň€V±µş`¸Ú šÔ8p” Ó®4Ú©NuB˛2“¦ăT른uáÂźŔ«ń/ĘଫÎ?íV“ĺ꯲H°ä«×* Ś˘TĂPľÚهĎ&{ôV`Ę­Čluw=ř®¨¦Ż7|íaË őš™dć;‘xľ ĘÁtă޶»H´ÔÇĐçţťŔ>wŹŁÁĽFq÷Ä|đ-ń)ănoČ‘d3ËÝ“Lʸ‹›Ŕ"H\ÜĄ8L±ěo~­RrŢE›-ńO˙`d=Şé®|ł‹6Ő#pŻá5ĽeŇW=Ý»¨ŞüKŹcEcÔŞÄĄ‚uáqX?mHĎĂÖ úv@k«®B Ú¦”AlD8X˝ąLŤ$Ő໣‰’ŔMąëŃdÁ’[–JN `„Đ©‰6=X7ÁΧl`m&K çý44=Z=k/ «$љՊ3×9ôáĘă~ćő€Ą¬±Z/5­ ~(/&ą˙ŢŐ3ž™ŤÖŢ=C„]e$Y#ZX×ĂǵCв#ąC›ŕ†Ř€ ĎWÜ|ŤÓš†uî%|č(ŚHŮşśÂ69" 6ɉ¬JNR#P,!®ß7(<ěŃ[ÉĘrČÜÁ“ÂŕŃ”Őăš6îĐFsâđ$ęd‰ a©X€V­1őůżF’}!ÜMVhXM ë+]¨ěXŽBSÁ“ÜŞn÷.Bkr),’5T€íǬ`ýęý_˝xő/1>y}źÄ`ć˙Á§ú—~ĄőSĹ˝9x¦űŕĂę07”¤|E40­3T!Č9 i@Z Üč (‰Čj‘˛P™«ŕĐ(ŠýšťŁ¦HĚm5 0ZE"#q¶` ôóąg3±HȲŁĐ Đâ\“#ˇY]˘oŘO{UIK‘t©]]¸đ/¤ ¬5Éýaˇ@*Éč`D8­#ÉT´4F’uăCEę5#&őZ¦§‚M^kW8MhKµlŐ¬‡-ľV3[ëdÖg§b@´n†¸=¦Ś¬ţV~óß&kB:X÷¸ś"Ű0Ą8„dĂăŘRÇ[}úÁP×°á­ ¬"–Ů5*Ŕ‰4ƶ·vw·&$X{(±'QŽ˘n%ä„陆G Ę´zł<–Y :GĹ"$ óÂňŁU°ľ!~őţŻ~őţŻ~JčçÉE`ýô`×÷×ĆíÎ:0±& ­CÇ`€ŢYmáɔЧ¬OŽdÖ H‹4Oµ B)OĐ\¨lT ©€`3$ŠňćkĹ«ą ä´C 8ĐP𞆂b˘„HMz@ëP,BGA•ÄDŇí $Ľj-*őđt?Ői>^Ő… ľ™…ßç`AçÖásšfÖőĄ"'˘Ě{ty­HņauB·;|Ťs2ÖąR5`S°¦aiÂj< s“ŁCE7ÚĆ~ß]¸62Â˙wK#n?´EXn‡ţ´-5n?Ě®KîßlŘPĆ1´”Ť3Rm¶»őC\?.Ë!@!–„ÎŤyęŢňŚŻ&;î§§z†¤JŰĘÜApQ­Ň3rs7%Ş-ŚĄę „‰ °u´O_FÖ‹•­Ur}[Ť}ăG/üíăş|Ď«{qçó=9‘zX?1č˝wCîÝ™ (T# Ŕ0°­ąVđ”•äidŇ@ŠF°,R ¨Ö2•*$ŞUP$"ű±@™éĚČČČ ź§Ź±~6ËK€łS­bBQU-@‚PJQ gŠhŞšë {µ)j™ďnÔw÷Â…W‡‡t†ofb<÷®3őš@a] h5Ro×}´Ń6X+X¸KŠe˛¦čhݨöß?8نvš°âv2LÁŃ‘& Xö–Ç+[儼Éj˛ ˘…-%t«S°ŁucÔ˝-űHŔň^h˛«}ozwt9Ž“MS!ó›}|1ŰÂpäÄP±”ŃŞŮ,eČ‡ŞµUCŹXd©GšKť–€^C‡‚ČGQŞ2UX¨&f"4Ý ą÷XdbŕGó*ü×˙ëZµZ/˙!ńôýŠá;~ľóK?9ľ˙Ő˝¸óű˙\ÖO÷Ţ·‘ýÍsÄ čy' Ö€PdĄBÓšhĹÁHćZË^PTi™ÔČ–Ń pŇsźiôÎÇë)€m° H‰jňîÁƱYó«€Ós“Ď™˘k§R‚6§ťš8« ®2b6(Y2L_“ă¶qś  &µ‚ăl×€FK@-Ŕýtś¸V°ňF8ŮYimß ż5Ç– ‰¸űĐž>9Ű:Źt#|4{ 7f>˘=Ágű˛Č,Öł4ća@…=HK;Đ„«Ťń_~gěŃęü%¸AĄY÷t“5QĂÖŃ!CÓľ˘ŔţWçR‘ŇšÔ‘ťHÎEž ÂjŤ*čǬ`˝¨ž_ýN‰đ\ŤýIJâĐXçşęÚ#^ÖOzďdŢŽăÍ&ś÷Ő®Ča«ţ ’1€§ y›×ŚÁéîóąu.ZÓC únč|Ľrçdf´ówÜő†H«‹«W««ž‰Ř'b$ ŕ©f&`ĂŐ#O¸PyęĎşŞÉŻXďÁŽhđśu?é©öO?Ř˙Ó“éxXePßőÎÉňgÇĽfĘ[€tC t†s‚üą)'C ŔĘR˛ŹĄ–që ×cHhŞT°]’ĺ/ü\ř÷ť˙XÎ,Ą5˝5i yC4X[s°<,Y$7řÚ!÷°T ¨3ęóh5ž}WIvvbAM4˛UkSa"Ń|NVŘö°üPDzőřĽa,ź‹€Ó8Ä""Č ŤFYSöŹ”ůĂĽ&δ®Ě!&Xö >XŽ,K}<Ű[Ä´ÔáH`.}Â\P ëĐ˙ë§Ş§Ę‘ŮŽDz? ťç~d$1`#„EZ3 µÔŐ´q®Eť “„Ť‚а&8Čfž(ĚëńhÔ˝ĐX±÷Ô뇧·ţîŐ(ÇĂÚžÓw}m¦‡®Ć|žŚ¶Îüę@ŢŤ”*Ö˙9çĚůd@äŐ§ßQ@†iŤýj:†¨EjÁ&¤^—8Ó Ż:ßžB¸n%B"YÖćâ5¶EŐ´ŮŽsY”ŻwH3żp˘]NcŢŤÖ&´‚-ăźţoëztŁů<ď"$PŔ!0Ůńp»ËńÁhauĆ>ž×±¸ůĎ>˛EöË˙ qÜ«>1şmGĽůkÔ©4ä×wvN_ĐíiĚ×#0ŘĆ jĆăéŮÇđUş÷˛ôÄęŔďjy¦ş¸%«đŚÜH{ ĐP BůoŤ U$âîěÄá‡}ePżtë'–ícýFŐęEţ€żę©ŠWŔkő§ňmUú—ć"°^jŘőîy|c—ĎÍyDŻM°uŐ,kŤ $Gd:ŃTę4O‡i®Užţíßüzxc­WŮÚÍwOÖ(Ôä`m`wXFČőő^L^[u°žŹ)LV[†$6VĘ„Âű\Q\1‘çç&¶q˙Ů'ĺ8üń'«´RÚŞ®ŕ„`7Đ‘Ó<őç!bW ('¬îű5ҰůĘă$ň•—{9¦ ¬k…¤!AKä.c»Vą&kjf+U¸(­ Ż*Ď}W¬óöyÚCHžŞ9˘Mv?†9éŃ&Ó¶G÷XŻ˝Ć Ë)˛ŤÖÇ@tŁmǬ…^{Ť›gŞ0hD©%·Ź‚C~ă×!ŘíŠvcť˘Čň97+žP©† D’é ×9ޞĄ™ą:˝ ×^c"űwl|Rć]NmÎĎ>‰†ˇÖ8 złäˇjK‰&“°W*poěb>ŘSQi ü:`ëj¬ľ(ÖÜŠÄ ú‘€ ĆíÁ¤h˛Šx…r°ľ­˝^ÉĘÖ‹®µď|!ÉuX//î˝wyx{ĚW!4ev^¬(ž2ś=“˛g,1ÝMűŻj= ą»_Ľ·{{GwŁ=÷Q˝¸ťŇaŔČÍuŞľ9+9µˇ¦‘ër`bM€PS ˇ"(„ŞBR)Đ 4ÔTŘPŰ:s0´ě?˙ěđäÉľçX˘žM¤ŔŢsî\ÉĽs:…9_ÝÄIŘ0NeµpP\¨Ŕ8)?"Ś„­ šŕq6î'a㺯̮ű šÄZĺrŁ[©ěU ¬Ý¨*hçÖ…W„gâAiˇä:0tí%¬Mc#¬šl±Žş]Խ݌8‘ TKŠFk°›wŃŤhËPyO¤j>ÄÓ°Dt9oUŽűüĹGqíöúK±ĆhfýÚ{bkyo­Ćq¶TЧ<Ă*1Ä Ř0N@đË—żřĎqW-ÍHŔv˲EĆt[PꌅuO”dk•NÄ2®23ß}Źz;Wę·5_ ÉëqCAą'Öü-Ëą˛5f™?šëĹŠÔó=řVĄęEźűzőEőđŤ;ůĆ=ü=X¨h‡ďzđ‚ üĆ{őgç"°^RČŢ»lî™}„¬!ÜX?4y2Ţ9 Ě¬%Bu~6ˇV!ČÁ݇GăřĆn¸™Ŕ+Ô{¬ő*$Â@#î1¤Q ž“ę´®Ö•Ő´ÁF¤‚F% Z¦V"=´®żD‚VßÄv^ITźŽ¸Ý×zśCŞ)oĆŚ™Ôš5ź@NTśkT¤ b‚Ö˙HÖÁjŰ0Nçmľňó–€XUśąB=YQňő€%„!€Ü‰ĽÔęk°Äŧuá'ÎCöŐj©üXĎç)YC,4GD1˱K5|ŇQ¨´Gx­›b.·±Ě¶ű7j₸{bn@čsĂ4'EDÖ.ŐÚo˙Öú÷"…ŕHnÄW,Ç˝ęD‡5LË< LMś÷$ cÔbi§Ťě…T-Ët¬@‘”_˙5˛p_Łű(kTXBѬ”¬‹$D Ô9WNŇŕŕ5@’%wVu–m­ÇR™ĐeîDűĆR!Č[F÷ă›Üż˙] üC¦řď—ď!tç÷ě˙łpX/)N˝çíMhÉłńÁ˛ ’h »%#­Ôrűĺam¬€wy÷WŹßyó=:ÝY[Eb˝Ť ‘«WŔzÂ]g!ÎyëbXפő5żŞMH,Ël` <Ú @ÂęŻ?Ď—Ą‰É :î¦Ă—‡Ăí~m\ŞíÜHgîÜ»aŤ&%Lť„sü§Ś~^µT’ăa‹¶5¬ÔÎ۸?×Ŕ°ˇ4ŕ´F٬3‚ hk¸…@[ÄmŢmQ¨śŽ-S­—y~Ş|Ű}…J×(‰[ çI…kóť Đd]„53V´_ÍěFč`÷·H0'N šĄ˘†|3˘ ٦‘"Çá< IDATIv=˘™§‚µp0íĘ L–*Úľ,%O Ťč;C‡,u¶Ô‡dŰmţşF$+*Ů: ׏q÷ÁÁę„VĚGaÚĚ…Z˙äďˇJĺ'’Đ‚é$4NM$r/T@Ę|č¬\óë‰:ŃÉČş(/Í–ĄB¬U8­‰©.ü .ëĄ]Ď„|=×#H¸ęťY-Öś"sEEą;ě÷s­…ÉĐ ŹwăŘďvoŚHDR]]V«*˘qÖI5(Z ÉÔ¦ő4†ŞĘu„ €VqÎvGiç‘jSÔ6ˇĺŐc.č"@$‚&­3ŃV ‚XkZë:ŕĎ+[DC8 –űzîBÉÔDˇ ąGCxŹ;¨5Čţ˛txá'ÄĂlŘ ~¬s5k-ýľŚe‰hČJ̡UKRSĆ„„ÜÍž”Ď>Ě© ™ˇ@nŻ{ŕ=›?B?ÚQĐl©7¶»čz‹ăçÖ €2*čhdĐg*N´.đeµŻTTJżµ®˘a|V€ś§}Y P±3kㇶË!śF 9¶`¤±#H4Ö6{Oµ–©{#:˛!Z5:¶Đ ě«Çé™h4‚˛4 Mçl°ÄŇäŹ&Ł#=´^¸đǸ¬—ďűa;ćGŽĐ ¬Ć´®¤ůZő9Ü–ůË'eý:Ő »×w»őxŘf5é-đGTźF4°ťO©Z?´xđZAcE…­B(KÖ^őKçď=[¤;'ŢĐĐăľ@MUp`zV‡GõîuZĆé8—ń~Ô–k3Çya;ý°jk?,!$#Ł’¦ăä@â~Ž/«mËlŰžůĆŽ…h˘w|v°Î*KĆض}/–Pý­Ţ–§g!î–=Ę­YA»ÉĺXp÷!6Őn?ŠĄ®SźsBü—ß=z7"–Č>Ä]w‘*–ФşŔonđú;2|¤˘Üeäa?—ą“Ž‰:K"UŐ÷šűÇőł'čÁë=ćZ Ę‚:–dQ­µ‚ ľ(o‰„é*5Źţă~¦~B\ÖK‡űĐ÷™§up)±!µJH6EłÜ8ÍźĚ_Öi™„n|˙Ýßř5r—ňÖÁŚ9ľyn#ŞhQ[°ť3˘Ş "¨g€RE‹5ů}5{UUˇĂ\j9VKA5”*áUu5ŇžĎÚ€XbU2eťHńz§$>r2€o3WÁ€TS&c}Ő«e$‰MRqľ['r De)Đŕiť6˝fžőŮ:ĐZ/zíW˙VŁ’ ¨ÁI%)!îeW H€§5hšžM–Ánpf9vC®Ď¦ľŤőn*]®KHşÔ´.Ľ´üŕďÓC7\Ö•ÁDB‘čŔXäÁXgđŐŠF`¶Gî p0U*‹ňń€ë÷őŮ´żţ;›÷vř =¶_ţşÜíqśŚ&KďĹÝçyú-–jě§6úëď´űr‘Zµň9|Ŕ,tDʏ•m T»Şl÷>:Nźćµ¤ ĘćŠíd9G?zÝó «ŚVٸ0OŔVš —=vÔŞ ±#Úwb–9á°-G×\‰äCϨłUŮÖőL Y#Ţv,Đi\ߥ ţ8őráŢ›»ĺť*ą!‘Â4`’ŕąT´ @%L¸Ł_3{F+8Á7ŁŰx. AhT ¤¬TĐ΋jbHçőÁł´2 ĐŞH‡g5 R *&’PW‡űÚ`•Vç_(ëÚ" ‰Ůt8ÁNh†$Ň)žűr¤µh€D\€sTűÉÖá?kŇ»ŇÚĆX,1ŚëaŤ·A7ĹçĄ\ۤuÎôŞ嫪»"ŘŃš<ůÔd†r/4…ÜÓÚ»,đG#U `gy)‡»‰©żxł.Ľ´<÷`1ŃÖeú&$R×Ĺńµčű|ZŹ%WQŞ5„Ş%éřÄË݇ą?P™]6°j*·2Q‚îaţ«p÷¤h‚ďP?2ŐR•Ĺhr-Đ"jQťą(±Č¶×Äťp§ŮéM™ťĚsśĆ»űô㬡@ągTه©«Ăî]ôĚ7O¦ĎÄe˘nJ@ÜVsú€zšŕ¤r°Ž(MŮÉ­Ę<Ł÷ü‹÷ăɇÖ+©!(;ÎÓ4DââÁşđø¬— ˛}‡„¸§­«y©P ď2ىÍw‡é«YKQűĽ{ű˝ˇ^»’c<ß[OÔ"0Đ xč”ˬ…jÓŞ·„Šäl¦nż,h*ËTU±žPHHE…Ěh%ĺ.—ZđŕyZkHu Dnđ.cËě{oŹĐ;`Çs}w®Ző„ ) nŕbcű˙Ů{źK˛,Ďď[Ů÷ßS2÷Ž^3đ@n)ňUĐ‘L2‘`*kĄ„Ѣ´«^ÎRóh#z§ţf@=ËZć,†É´¨č&} ’z`áČ âŃ÷ŽÜčóUůťh-®yd¶4šŠbŞ*#»ßwńxáîď§Ű;vÎ÷|ľßŔí©hdy2Fu±¬ł¨Ž­ŇÚL'^sꀊČH¨™Ě›ežZŐG–Ş()ň!3˛ÔFŐ"Ŕ9ç:0F ŠŁşŇ?ĘĄ^ŤOÓó)k(§\ĘÍďţÍrÖY˙q˝Ţ"´VW˝ľl[„¤Ş ‡.—Úe±"ß[ Ŕ٤;AłaŔiJ•¨3” {ÚéçŢ]ż˙Źć_ü$­˙ÝŹR÷ˇËU¦Ôe»zŠŰ)ż¸±G}ş±ĘÂčÁm˝hÍY‰ ëŚO-DÔŁőeŚ#]˛:·Ó|{ĆŹÚ2çU©'$¬„ Kńľ7®žrąÖ*ë¨;ůş9Ü‘¤Ežô *óiă¬Z Cé2âÉa0â‹c#Ľ«@{ ßës)& hč F€8ÝX8w°Îz#ť ¬·K‘–6Ą˘EC …†n€Ęň˘´]ąá*]>zz8¨n\«-űąZď[Ľ ±m Š!ˇfÔâ+%hÍ ˇe:-×ó„ÂąĚPŮ9ňµąěi€×F´âĽćŘFm»XÖ›ľë¨Îlß÷— éŮ‚PcŔüšjÍlËĆďKNŞł3U@b4`óăRͫ޼ię9H’îjumĆ^CuŇBŐ¬:H˙˛żETŚd®bQkÄK-Ŕ€0“;”:Ĺ•Ŕaě­Ô Ň×ÔW¨Óáb@EÉÓ|3ćŞršQuN<<ë-Ńk†;€껀ĆVˇCC… Vx•9´UÜlµw]>ĺíŃ*\nĘdÝ(^a]€ÉNćüÓt•ý˛żĽ1šs¶ĺX®˙…׌ý+dx:ŘăŃ•m~†yBH®b]ôu12) nˇP0ß<Ă H=PŔ"_>±Žóizú÷G›3–íÜîĎńň$Đë+tÚ*Čq4Ăëbů¤á¨ČíܱÂNeľ=ěÂĎ>›Oúîeďď¦ô…ňmA{“× Ösë¬7ŇąŔzËÔj ŃD°H$ CT;äĺł,IN€ébË^6{±îČ RE¸ˇˇńB!¨ů¨TT]«Ç|rU –vPn’¬-W‡ňÍĂÔŁŠÄÖ Ľ)7TˇÎČ˝Ń.Z–s ‘U \JmáÎaë«=”tŽ`ŤČĄöµ`Buň50b›i2–2#«+€pĐP˝@ŻP˛!!0?d >L3±ń,Â1”uŽ„jr9ľ–"cH °^3Y rWŔZ,Ëô»xźśuÖ菀Rńşő7ČX« T'€pa%öJ-ŕ3$_a–ŔÁ⌠c‚&ă.ĽüëµÝ÷Ŕ»źât4&Ż-%źŹxńŮĽ.CÍ(ś„5ĺňSě>˛ý`]Ä‹?ŲK[Çł}Ź8 LóźýdčG<ýĐ®>ňg˙tč™ë5śhUp:°rţ…bČmĐO0ŔVú Ă5*¦Fö ZÁtlŔUŮJÄćX—)bk´ËVy9ęH<•]Žó_\Ź‘(˛ ů¶`az"ě¬<˙â|útÖé\`˝]Jq@0řl VjŽ""(ŇPąĚ&eThŹń÷‡1¶~Ő#ęNĽ€îˇFŕ,pÂĚ:¨N¬đµH’ÚĐĐ,ꦛyňć˛* rqëlóT¤I¨4šC[nWŰ1$JE XĆdd"cęS|Ô÷ h6(˛VCudCBpVS«m<ꑆ ‹ć›Ť¬kµ‘Ľ˘qI B ‘WĄŘ~t¨D˛ńN[˝šäüĘeËöÖÓbň5'ҵˇ®cY-‚`ÍËi.%Ł˘ż­ł!Zg…čŐĆ˝Ç5H{ĎW‡˛NóíPĘĚŠrneťőőjó]á«,Iě€6Ö—€;Ů>f•ÔŃ Ôâ÷fĹ}.¨b‚0§›<=c…ťŽó…YŐôů'ăZś°çGg‰+=ŔVřrc!zđÔ Ů34ůÉm…@°Hż˘,Ў¤Óâ§É@ď`‰ľCŞśoJ)Ňhŕl?rť´B*&d)uô ±°`Eé`{đB¶ďq·Ě7 0$€ŠŹŕ„:[0Fi|ŃÔŃ#>Ž7óĎ»I‚ő@€ź¦Ôzć+]Ž$$âëKĘ9ë¦sőv‰5oM—…L°ŔbCÚTQ’V׺€±Ź‡C U±‹E3CBóm|ŃĚ U#[ŹŠ®›˛Rň¶x'_§›/Ę\2°…ç’ŃĄ¬Ś¶Í'¶Ą?mőTQN_©´Ć|K§dĎÔ§űĆť@2uüŇHXŁĆłJB"ró×G–‹§Î\Ž`Űbc Á o­8Ş›ĄľU™)1ngq)ó6s¤m}»ęh®/ľöo©-iIŻs¬Cc[¸Ö!RóË,”ůĎnŇeĎ Ž—##b`)Hűäu‰’‡G‡a_ćŰׂS#Dđ<4<ëëŃűĘţF«}ŹzXĽMtműqVą}2h˛šAXq|fU¸;ÚÝb!ż÷Á°e÷ţlRw0Ű_ůrchtxćR„w?HwÂi6/Ůşq°ď'Í·3űh—°“đüSťŽ†ÉŘŁĺáţCi`~~¤8\Eô??Rô˝hW†áN6\ĺř§ Ů PŰüŹÓK5ÔKŇ–l ŇÂëČ*°ŢXńý2îĆ˙+PU±Ę$|˙`/g¬Ĺúţk{5ĎúF靯űśő7Ő\V­m‹h!µ=ťĽ.dĎ@{D^îYV ;ÄĐ·GŞIBđ‡™™ˇ…=K˛f¬KKôŐS—Ts;$m6Ř/CÍSę˙·V`€¨´"{Ű1îSěS»őĽĘşd$j đŔ/ LA¬CŰ:L  ŃP &aۆ#Ť X Ľ*v& ‘h­ ăĂ&cőöł F¤Y°ö,l0F ˝í32 Y;0 1s)yÖt3IRUÜGtJ1!ÄŤ´âĐŹăĺ÷zwgťő»—ő«d·yţŮ4đ AÖ%übÎ'5xJbb˘P{ôÄI®…+˝ë˘Tˇ—(˙ęš[?Xľ(4ŚŹ{_—aĎ%«‡G (ŰGPɬˇ[„ q»¤.ÎSÁJuÇ~.ËŔĎ>`Y*ë×vÂôĂŹ~řúú7(’ů-ÔWźIüÖžĚsőv‰j 6â1X©$ÚQ€ `mÜ´¬™]şa›…u”g†¦xAÔ‚š„y[µ«Ťw%µÎżś¤yš§ů´q­(ŘC§'©Î P@K-|Sp9Ó°ŹÜłĺĆ}ÚŞ«}zŔq9W˛#6¦·[ &Č@oŽöŠaP•Bi?Ř@Y[ĽŹš—_ܧ¶vŽU­Si=L_é·CBd(šJ˝Ý€ Ń0BPŤ1 j‘D d’\|mĂDB§ŻâţýÍ·Ót{ś^Ě󋟤®ßeÜżŻ čČSJŹ0\Îóí¤Uói:ŕĎúÝéµďŞĘ8XŞŠ„A\™W {‚BGݰUŽ2­sęźją–†GKBô «đuŃNɤy9ýÁËŃ}O/Ŕ»›;S+ą§­š‹"Á.YÍY3¤ź]ł‹ţxľßű‹7 –‚ÔÂé!‚¬2ן¨d;\¬˛Ę|'^ ¸pÇů‹2<Ž2!ŔŁ Řâ+»\Â"tH„?LHA¤KĺîËđ^a˘c‰•ľÝB-_Ďa« Z)đĂŹ~řĂŹ~x®±ţőŰ~Ď#·KmIÚ[ŚŁ(Uhm[{™€Ş«Űú:ŞŠ!q×6Ŕ=2ŠIjT!UJËŤÎ $¨ny„T3Tg6zEŃ›VW-Łš{ĆGżWÜ'=ěîĺSFs> *„Ú3•I±Ýş×lX[ęb!ĺ•. ş.@nÄöס YĄzšËJëv‹ («oÄů­N@#ŰĄ­Ş{ ą·-É$Ký9XZčE‚Q´ČĂĺ0>9ŚŹTN§ĺř…ćŰĘěĚFDÄiýűăČîěá8ëw¤?zđ`}5‹¬phA"-öh]2"íH)íÇ„Śj°Á¬KC[v,GŰž‰¶żÂ6g„9Rß+WŃö\Üłh˛ĺSLר±t4Ž"ˇą<fE¨°@5\0í1 L{¤Č$@+”©;é%ó¬ĺ§YZY2â§jž 2•UąĹ˝·` ŕ“°ĘăF˙˝Jb.B ¸ÁöŚô*˝$$˝¤!2vžśÓrľŮúj©ú[Őąő–©O›·Ş9bT!ÄČůEa°Yyڇřh/*˛AşjRÍ„µ¬\ Á˘Ľ˝ŕUói–&ňšĐŘîŕƵb©›íýM»Ä‡GŇEBEě©:k1­Ž(_aÄ4Ű"+Ř j=§ˇCA;ÓmS<´~»‡aǸo'冀ȤUí÷6÷Đ®GrŠĽŃçŰ 1äÚŃ˝M(ÎíŮqĐvŘŐćŐb©•ăíÍÓ÷žŤăŐ8/ăR4ýâçÇë ťĆLJˇâľęáUD:ă4ś†yťËí$ť‰YgýÖŐ€vް€\•U)€’:@€:Ů~pČ‚9` &ĺŠ$ą˛Ĺ_ěöz®e`źź_'Č™Č*~D-`.%îŁW©“†~đ:›Ôęö«‘R˙Ôל=Š˘Ď?5Ř|šă ?ÉH§ đé©Ňp+¨íĘĐ—ya…ŞĆó,&‚ˇ`1z‡rŁ;@RzŻ÷UyŃÖ«˛0x]*(E —z‡˝\Â]"L `/¬đUÖóLr˙ۡ×SÂß^Ąu.°Ţ.ĺu>đJ`ăUĆ„Â@­ J ¦0.uBý¸GqE‹Ü:FDëEU(d„1×`TŰ9^ĚšĘËĄy•ĄĚÚÂvË“‘~ťę*öÜ3í“ßËvD$;–U±cÚÁP˝ `×ČéśU"é€m–ü,4jĂFU%Ú<”‚“j3“ ¤Z Řm–G‹€äPmĎĎÓ,PĘŤÔP`\3裬-…ÚH°ş…„5łĹđ€ŰĎ6@—»¬*bĐÂqÉČUůäÇĺxxLŐacĺˇ˙`şy–O~ýłëňbÂÇ'cÜ#ÖBEڞśó~śoŻËšĘrüŤż‘Î:ëµ^»Żüoî¶M:Fâ˘ůÇi(ŮÚ1d7ŕĺ„D…żřĚ}ŚŠáöv  Ż‚XNmÎČ!0ŻJXo†ŽXŽVUiU(ÄZ,şFöŃşä]#Čçŕq $őBžuZ3ÖÉHĹv(xÉéNyr)kÁ"‘Ź÷v)ç‚÷˙űř€bĎ Ťí·Eë6sÔÂ@ Xĺ Ĺ=í*â$tB弔íÔń¬o¬ľZQýV‡­çëí’V©rP.¤TťHŘ M5 JĄ62'aĐ]a vÄ˝E¦R$›˝€A AŽ`K.Pdóęmp˛¶™ClIeXßč>ǮǖDÍt‘Ůöűb[ƆŠ>R)*-7§9jA BjŐÍćkţô 0ôÚ‰µ= BGUĹ]Ô}«„A\€•đRiĐ=Q….a‚±˘uąÔ°Á¶1ëĆ,őČ$xd*r×`̉TE^3"X„,!ą€Ëş¤Őć—ŞA|„‘OcÉŞ:~qdo'v€ˇKSÍ€.QŔŁ Ś©`R>»˛Îúíéµ+ř—4,xUlá脚)aăČ‹v0 NjąF‚u‡këö3 ŮVz)CG' ô=ąĐOł]öľ,Vá+Ú!Čü˛·U~Zl ¨Ě]aö´_Š*ŮË€ÖÁĘm?z­Fg±GżüĚn—¬'ɢß.8ʤ•z)&0Č"ý*OľJź_Ołľ;NÂŐŕš­BÖő^e’ŻĹ€ą%Jô#:ří#´ďµ. ŤÚP†=<ž ¬łŢHçëíRYs~‰ô(CDB ĘŇ*č‡ÉŇ 1Bă¶»ćÎ&€R3;´iśÂ˘ É˝*Uh-ł˛$ҤL¦\sâ´ę ŔrzÓŹ|ý~Ŕžé˘ĽQ¸¦= ˘zTzŤŰ‰Qˇ6Ş 1°°“*#{éH& -‘·eé;( xŹŇÂÔĽ@`ä-»Ń"!ąhä. B˘\ń"/¨PőŇzZÍ>_·1k٨ń 8{M^0„Bä˘ ÎŔ"Y‡Ľ*†~ľť|ŤúRË&ââĹ0ě‡Ă÷Ćé¶Ü|ńÓO_Ţ0ÄĂxűAťDËkFd_i|č9ÝLą¨¬ůÍ»†gťő†zí»j¬×»„ Ä ZöěĚ`Ŕ ĐŤq°/>A™íţĐŽöŚ˘5ßŐŐ’-GĆä’q@Ż|;ŰÓՄέűŃÖ‚íÝůt´_üĄX ú8@.™ [Hh=Â:dÄ´ńř©íßÇ:Ůţ€ŰÉąű µ -D `)¶@ A˘±ÚO8ZĄ:YŔĽjčcVÉ R˘Ĺ/ű[ŚDáCţ´ >őE%(2µÇÝWˇ˘ä*¬`ÄŤ˙˝ IDAT0µ^—ŘD™+›/z˝Ě˘/ë’K!Á´S Q^xÁ‡ńRĺ˝ţřů4Íĺx=-{ŤCŚ—CŚŤ[W‘¨!łT–rĽůŚĺ\fťő›ÓWł[ć ŞZă›-ů4ŔÜďÍ‹]Ŕ+,®ŮP|˙Tř® í É—göŢU¶1=ĘŽhZľ­TéŹGs÷hŽÇ˝=yßźüˇÂ'8}jˇx^‹d!E ? ·“«Xĺe90ó*eŘä<&Ŕ™m8xĄŐEş6Â׍őĄ"¤=f`ÉqLdىľg q:–´Â[^a .b)A˘"Osyľô=ěŃÁl- ˛}ďQÚŇYgýJť ¬·Ną”ůĄRbą+q3{ hčÍ…qšçŞQjě(l®Km](kůzÚÔO’A!s›"7ţŔšŠ|cŠüZ &˛ß0†÷˛ ˘Ű@ *Z:;JłĘ@6ࡵ›ViŐB\©Š7mčÉű‡ÄC(‚şîÁÖĄkQ/má»(/…(Ťw‡«hűJ Ô ÉP*y­FRj{ ‰j„w‡ÔZn¬Ru†6U4K`ĆĚÚMcxŞÝ‘>.Ä ÄGc˙d9Ö¬2…Á˝ĹĄ1żÂ‚J]0í(ˇŹcYçúóĐđ¬ß”^w°ěˇw!qOIV‰= Ŕ±Îžú÷~¬›?EĆŹńňhţÇ˙Ů?MŹ.a€=ůËu:-ŘÓĆC~QŇ>âb€;ĄÇ\ťR~ö/ŇžNˇ~Ńn~ ĐŢý‘'+G O-OŘ‹ëŚ@ëő·÷§[÷~.Szň#_emů//öDťËĘşäĎ®ő‚ÓŞqh}8ęąŇJ—†žŢŹV™Ë1öLA~SrŐ8—ŃŞĐb括#Ö%’ą* ]Ś—´qŔz­é¨‰ÄíŇö ­?|-Żăżţô_7ĂĐë~-wăo~gĎäąŔzëTNs‰Ăřx,ą(€(¨Š]Ź †běMĎ‘„ů‹yůsÜŤ¸ą€ Č­Ü DŰľza˛`Yhé1äWBĘ›: "{DűŘ2±±EQ‰DđŘ%ŐF„o†Óm-ĽŮWăED•¤1Š­ËhÜ;é4l].‹ň‚®q U ÍfÖRz2ŞĚ †ŕm±]¨˘()/śşe#Y©šyź¶nbšËă“Ăôůőtš?»~6 1Ćá»Wă ŤZ=v,,cŔĐŤ¨‡ăókĺĽcxÖoB˙/ÖçyŐŘŃ![áČş#¬Ę1ˇ÷ŃÖěXř:›’íŢÔŕ&«Č©ÂďÄŽ~‘Ś˝ż¸¶Nč~˙ÇĄ—ňĺ'ÖĹ|aŔ$Ă1ďÇtyđĄ·ţ#żýÄ^N膼L,NBOűâčăž|„ý`Ăŕ>Š/Jt‡ÉžňľŘ‹cľąÖm!€ľ§Uz‘éU¶üÜXQĘfÜÄJŹ¶Ę [Ű6˘\°@Q,ôEĺěśŕ„…Č»„Kx1z˙µy°ÎEŐoJż›gň\`˝u*§eÂgĂăž»Řţ¬YQÖ"‚APĎř´%’•i™ÇîíĐŇŔ 6;‘dÉ‘S§ÓĚ`”+( |m!ólu^§âĽˇqĎ–9;S`¬7<4»ŤAeĹ„FLE"!îXî hhrö)‰ˇˇ żŮc«±€­ÎÁčÉöo˛J^Đ*LGi•厼v P€j§Vi±M-â~›H*D˘‘UęŇCsP‰×Ě #UÍ‚‰(u*'ÓúŮĐ€C,šY)µ#wřôż}:śžÎż>=ţ”óq9Mă{vűTna!S©yäÓ¸Ę:M7żĆ.çYgýőä`µ-B{Ôb•ö0ů˛ /GP˛eG-í$#ˇÇÓřˇçRSşÁ.F ôy˝A'´T«›g|Öő{ß–±Ć‹îCÄ Đ 2¤qNT®1‰RË)cË%d©Ć5żyU|ă7EěŇćXBËlüôĆS!Ź-_™ ]dŤĺqU°­R#"FŐÂÖÇjŹzË@Ü"q¶ţWŘŞĄľ6nŮĹ^|Ă-&Üo¬¬R_‡»BĽ‡Đ6 ±CÜ˝6˙!˛}]2ÂËÖd°˛:9 ‚L€T‘‚Qc^=Á˛–ˇ…ĚPPűö¬Ć{j‡xAAý>ň{OźĘ—<Í/rö @Ü'¬đµ— ń°Ŕ…rή¬łţôš…l×śŠľ.±9˘ňd՜Ŗ93'šĂ,Đ;Ł[2ô޶FĎ7é*; eäĚ4%ĹŢ»h^ł–,Źŕ=¬űȻѺŃuTW"%I‹Şn îĘĂ%ŇăQÍÖk/Ĺâö¸Hú–ţ:ŚvĎg/łYÄ>Ú~qĘťQB SĆC¬3NĹע|$”čZxyŐP豉Ŕ˛Š'ŮžY,3ŃňÓ“ŢQ@˘ŹvůcŐOR<0íľ?ŕóóßăYżZçë-Őô|JCĎŔ˘×S¶WK¤ôŹx9Ď·Çyš§>ößé,ká#¶“в ™Le•U@pAdâ“Ö‰Áľä‘†F¨Ú’sŢDâ>ĆĆ%ŹdŤ¨”š‘ ’ŞmWŃ2P Bw[ť„Í«^X#‚ ¨}ťŤGUµ1¸ýŢíÖŃ~HĄ!·ľjc Aí K—vŕýëAIiČ1ĄŠíYŞ@-bÄ:¶Á°”ICőŘYăŕ·>«š(•’×Č’ćúYâ€PŕJpÔÔŘZŘ©ĚĂűŞýôß|˛Ľ-ŇâV±PÝF|ŕŽ- -&çâÁYO˘q€ kśwq@•Ő%BĄf"9 ±… ˛ ,ÄČ"^EBFMŘŢGńUńŃ?řhşËiţěx]扏xxňaěYŞr%˘‘…é&Î!eV”ł1ë¬_G_ĺ`á!‹p;KÖ™kI5z…!y…—!X-žĄ rH «XP)2Č[}FYŮ^łŐĹ»Ţř]ż<źú:Ăď=íLĺ]ďëd0®ĺš,Ŕĺ6ňíĎ i.Ëđłźx{%Ŕç„ĐvçźŰí§ó|äů耋âëŃVf´Ş±G˙~^>Ă󣀡‹¨ŰeÚ¶‡tŽbŠ®bŚÜctŔĽl/•c’“ĹŃŃ›ä]´TíŻwĐ˝Ý/éYß ťłß^ͧě y«r ű!u™´z~±,łaG^`KÔNÄŤŤ^ŤÔZrł:ôŁ@“2Y]Ő7ő`ĹŘ;đ@Š‚ŘAÖÉkAXŰ–źŁZ ŕ•BaĂ@WúJ+RŤ‰KQË–cř0ěŕC' Űŕߊ·í뀒Úu<ÔŽť-Â" Ř5Ďűöń ŃáIx Cô<ě?: <†AȨ 55¤TĘ:IłŻeVË5tT”0(»jëWq¸űË÷‡aĚ«ôRÓí ŐÉ@0"€6đC?°#»¤Ż)hö¬o®^{°¶?Š­Ţ‚ZähÚ˘ ZŤB-z(ŰzD™Ě” FˇŃGĄˇ «*Ë‚*Lä uŁwWĆ6F÷¬„÷ű–ĹŞP>3‰űŢşčÓŃV!xęż‹>ďýŔKQ)V+Ňí§öoźáů'¸ýÄ˙üOl9"LĂPRź¬3„Á\"}ď©]}lď~„LJ´4DâÉÁöŢ‹ĂUź.c?P.T2¨ §Ĺ6Z3 Éž ĺô˝§Y“  ×ÉÜÍ ´{pg_ëëyÖ7FçÖŰ«ů”3¦źt'©Xĺ57¶Âp9®Çç×ĺ”úo?ůř?ŠdK›QE źĆF(¨ŽŔ!Fś$8+ą‚b7x-‰ĂĽęK–b|#L@â:ĂâvŠL‹F@ R‘ZŚ+Ô-’ +˛ !"TÄÖ˛BĐ·ÎŁŐŤ*Ę@„¶ŮB~Ŕ@kS€ŤęĐî[G—$0<`Ôm~(µëͧOT ˘€4ŵçÁ{ ’€>„¶5 *) #NާůzyŚßϱ~ÝśW%ôŮQđ­§hI/ŔĘžúŹŽ1çiţ⨗ąSę#B3ŐS5#ŚÓű|šĄé&.e:ł˛Îzsi‚cŰ"ÄÉ]jéĄ[H<ŕ*Ćw4ȬĚó4łL|ݤé'órp5źÄ'=Ç đµXąÎëĂ•żűˇ±ä:đÔó‚ż–˘hŕ%- ź”.#Pň Yĺü|Ţ;řzȧđĎfüÁŹ ßÍe¦ŕ댓fł/ţuż¤g}3t.°Ţ^-Ë –›´O‡ńJ*Ř–ęJ[uA7 ăÓă2ĹŐŻŻ?.ű§‡U{´±Wă§oÝv’ŐĚnL}Ö:e n‡ÝmpP´ŤŰ~ĄDŹL@¬TŚ$HV & łÉÍÁJŚ8 L¸/Ą2nD¬°ů˘¸ĹśIµlľőĐf…›K× ´Z|ŁŞR*mEńá˙Ů5»ý!¬ő®Z WQî l›K"Şŕ(µđu-U˝e®)*Ž-‚ •-‘šdY•BĘÍâôâUsI‡w‘ö¶ĺ…d[OÎ’î·{ҰŁńés×ĂńóáxüůńŮő0^Ťßű.öĆŕuA7€y¨v‹|šcíϳ³~Ąţç‡Vloé@˝ľŢÎp^QdXHíöS\~Ä‹‰xjőÚĂvw 8âQl-jëb^•ş&V ¬3öřď‘NG°z¬GcÄóO-°¬J•v:‚3Ö#0#Ŕć#ľ÷ˇő?öĎźŮ÷>ŔżúǬ Ý•ÍG”9Eáî:):SÁôS2ĺe*Q˰2ź`Ď˙",Fڦ§çź}Â/~‚ĂÇLOóÝÄe˛ xG¸”/b%J±}ŹÓ‚páć:CLáţÉ܆š°ţś/ŹöűŁKxţ n\ŽŔ×ĂÁ:ë§óđ­×)·ĺjUoí«ôE%FŚŹG„DY^5g°ď#vĐ˝1µÎ Ń2"Ő# R\Píóžo6%djmu``Č đ@l¤Ěp@h]0Zţ´fVG`[——ÍąN¨z(hH2d‹ÄAŕhˇÝŞbŃPúĂpŔv«e»¦@0đaލxŮía«G j‡ŻN *ČZŔh öЕJÍb C”BőéĹÍt›UĹšPá«¶é^UceĹű(ď)/#WW}L)ćąĚ·sľÍŚÉ‚Y×#€€L2văĐdd˙xťő·[ ż *˙J!˛Şm‡řĹáŃ«cGŻka(vAż^3ŕđüĹ”_\‘Lýč^fuÄZć0z7ú‹c*Sľ}–˙ÍźĚ˙Ç!ô^ŽXá+ŘŃOźˇFďźřĎŽČ‹?Š(žź_ă‹?ńůÇh4ľ—7ů4ĹëąD™śŹ?ÂpH1ş„žŢ3]ľ?K¨ňÓ’Ż?ő/žĄvŠř2CK@¬$Ĺ´÷z]ÉűŢcÂžÚ ‹ŇţCţŕc\~ŕ§e¨Ĺ׌ůĺYţ—˙Ř˙÷˙aôî)ÔKůë|AĎúćčÜÁzŰuýůł¸gz98ݧg×ĺt˙á˙¤Ý‚{6VB;°"Ý ‰čŤ­¸wqÜÓR@IbHRŽŻ™XopßÄöűd!Ą™9HCpÔBĆvH"KݸV u٦“Z·üśÍŃ´YzŘd©B ‡-2ÍČ×T3đn­/äŞěTe cëYhn*~éŮÚVĚżFÝ ;É"\ °+şŁYľ •EŰŢ%§,W Ý °ä•PˇT–Yyôwsâťĺ˛ 0u˝ŞŁ˘t3CÚ>üاŹţáÇóíôěÚŹ×Sb´Şˇ¤ý0źf2©`ÜA÷"q|ţYßőožyÖßAýQĹ?ů +˝Ţ"|ý^©Uä%A…ä÷ÍS•ŤÄéĆ."B˛Ă§¬`É_ş‰č*¬ÂŻĆ"h¸: <˙ ű1u˝ ‰>OóP‹§Á. §‚Pl% 0ŃjĚ·Çä VA×ŘGK#|Nű§Ĺ*f-C™ŰٚǧV'Ä„SŠ]ň# ˙ €ÉLl¨†_\[VyŤAŘ!% ŻHÁ=FŞ %/”ŮŢýČ]¸4[0h±[HGhO~”"pú5â.Îú;«ßűţŃ˙2˙ź/¬ĺôčŰe˙cµţżýóßŐ;ëK•UXëĹhřwŞßŞáŰ Đîë/Ë˙ëˇOË\Ęşţeýíđ_˝«ż®@­5w!UÔđNЫܫXíťPQůŽôËj¸` Ćnľ=…wvŞ™ßćúKńÔoCëúżW}˙řń9ňŃđÎv@řv@`üŽ †kT@°âťu‡ ~«ÖZ_U˘Ň:ýâ}]Ż ß®x'Ż^ ŻŞ}ţËđmÂî•ŘĹ;U{h8…Š;§¦6;|ĹđŽřťX«ľőw!쀻€ŞP_ Ż`d­ˇľRŰ&Ľřw¨őę+ Ż*ľ€*°«` u ±ţu%^…‚^i÷ńŞ’]ý«řmű÷Żľ…_BŻjX˙˛~k]ŠţJÝúŐő/żµţŐ)ýg‚ŐW/ë/˙o jx碆»đη°«DWQů…đčńŁîď řwµľú÷Óí4¦8ŕ?‡1Ř; Żj}§»ł‹8ü˝ďUőUWëŻx˝Îú;«_ŐÔWŞő[@}U€Zń„ďÔ”PżS-gŘ}ÇüťG¶«ţŞî^UYvő…×®ţRőâÝÝ˙ĂŢűüH–e÷}ß*ިţžćËŃ˝t¤üž™%eX]BGsF,ĚކlxÚ€µ¦vZІ7\^y¤5óg;i!Áă…& JŐĆč+«W‡yNÁë'šŕŔĽšćúűĺ蓹v´“­ßY­ĘˇţÓ4öpů‹b/P•Ľ~2}2ű ®ŇQ?<˛RO/_Üý wřfłŮ_ě_~»żŘ˙ä?¬?ő€ýѧŮç˙ô9ďâ1€ËGß»~TÓXFdŔ$ˇů±ŞK@žG†ďn¨äńÉX$€L«"ˇu§3‘ĺĽcLĂĐĹćúń]ÂÚř©uąVQN„ü2P.y€…/šŔ,ěˇyÉá•^tŞÔ‚ç(+0¨ýnr ť«Ë``˝6fY‹^ ËuáexíBso‰Š@mäuoʉ€ę0ÂČÚúXm8˛đQ‹čGž-ޱF źCUp•k€s!B‹3¬‚€%L"rce©ŔK™÷ăaÜFůO5Cß’ŃjČvŘ×qokâ°”őĽć™63ccëľ^ů€HtŇĆŽë;y›_µáÍô·ţŢđµ_Ăđ¦1P:E ĐŁ;M›_C—‡Úże÷ţ;t[gvoË~[;YŚp §[śśc"ĚY[jÖŢR„z>fśÁ©$Őôő·qşŐĽËe§(¦‚ľO÷ŢĚŞn6yoô™t3"ü|hşĽř ŘýxM+€ŞŚsŮľ¶ÁU)%ďvď±ÇćµálsVrćó„ŔH j ş•.ˇĎšĘś0Ź)Ćáő­!Ď…!Éó2)ăOűŁí×ÔO|hśLrĐRŻdc‚Wt5T^ˇsă¬WQ(mnѲź{ Đk™€‚ŚqI!$’3X 8šńĽ$0 ŽD vL‰1C†¸Ě]XŻ˙Ŕ´ ŔöňÂĐE Q(Ńb©mČJóxaAzŹ  ¦.ĺcč'ě=§¤%mzŹť4ôkĄČ6(±$.ŕ[:Ôfž&Ea:{};śDë6»ó‡űi_|ÜśľIb‡R ĐçRÚâýöuěžDÓtńgńÜ»Ńç]/9Xíc‰˝ l¸^mAEmćNÉ:´%’ ¨Vöɰ©.’•J!Ö`ć¨ÓÎÎŢG¦ÚĂĽÔCµÁjG8«ÓÖ.ŢC—jۇ]@¬—čă=;¦0Ô•RŮgíÓÉ[•o©ěT„n‹q5Žéía}V]Öăű˙8*ˇě䬂:ěŮ'hŔĽÇ˝·k MUv U‡ÝŰTn1p4íëz°RZć`FI]¬ˇŘłz%VĐć’#ťéHUd˘Ő ‹ĂčxżĆÁdőéžžë0ŕć#ÍŤ>n ¬ĎŤ..vFö§C:îé+•rŘŰĚȸýĘŮtĆ÷§ÝwîwŰÍi±ą¶‹ă:†, 9r(>Zč vÍÓ°ŮlĆRŮţâ#†T *łúőOô÷pÇ(0đĆ€Á( ‘Ő« ÔĆ@oË}şÎl–¨@L"ËźŹ•şlA’*Z T€- RT´ţ–0K ĄDfŔ©ăŇá‚ŘzcЬ뚕„«B­7ÁˇĐĽY Q(\=€<‹ĹNPEg+t`gů 832©j°2IůiŮlNůe@Ăx€uˇ’Un `CŘ3$­»töŐ»Ëݸß+żw: ĂIĎĐKBÂÄ@q{öfΉÁ¦’o˛ oô)ńz°UWźĘ%„Sɱ4ŰI€!Âh]„˛‰EJ.ĚÓ>%Ć<îQdĚ“˝¶ÁÉ‹[\ľĂţďÚú~ľřNşřo2ŔtfA8L·"ĘdÎÓé[őÉC ˛/ż žţ¦ń>€ak·±¸A(Üľ Đ37éî}|ü‘ůů{éŢ›č]ĽgEi.ăÇ™>Ů×ÝÂ8ž˙Ö \ť&ä2’¬RŠ=Śy”Ăâ`RľŘkjMsÚ‰đŐ-@L;˛ť& Űý6Ăf¨S¶ËĘSŹżöçü Ţčó ›áçIuÎĺ2/Z'¦-Á1őë~č7Ę´,yj•\bרT MJ±K `gpmŽ7$ÉA^‰*¤Řń§÷Á… Ń @ęŘýĐQޤlą–VXµˇ-9†íŤ^R[~vÖëF6‚(Y -T­öٶö Hˇä@ÇĄ¶s°.ć»ć5ÔĆ2č¨mX ĂR)¦®‘®(a ö¤·[¬–-]ž˙č¶ÉĐÇtŔVÔ\ĺ~n‹–ąőgIyĘS9 hD`•„ázşšX 0¬Čç“GúţÁkČXĄé0–ą)®7 bŃ!vŔóśB´ŘßĚ oô'őŁń}@˝Â-CvA®,UWuÔPਞá±â]ŞnoÔhYµ€9§ľŻ1ńřŚŻmj51ćY`ge UeW}źĆ}}ú^ZoÁ-B¬OGÇ: O÷5Ä߬AS}:ŐGďWM¸÷ö8śačk7X·‘,¦×·v2Č,Ý˝/—ŃjżĹjS?ŢcÚ!źăü;u÷pđ ÷őrÇ’ë<ŮŐ 8 ŔNb=Ýy$' IDAT€Č\NĽp9Ö‹Â(v@śôyµÉǰy€ŽăaDţ ŽĂWî×0¨C˝×#˛ŢääÜčłé¦őyŇĹĺĹĹĺ‰ałŐ<Ćs ˇŃ§M‚|ýÁ»ß­ŐË;żýđí˙Z›ő)SŇ(ŅЦr„™`5ƱŰH§FP™…âzٰűw”]oŔu«"0Ď2¶ôŔ„€ «^SČrC =“¶d?łB&T`® ^ Řéů5kEąąŻ\ćĘŇ[[Öa††€ËîähĚ­Üj,/ÖrˇCl×'¨.‹Š¨ĽöZ-ľ®Ö3ŁP ČÁ['mÉ–®+´ëĺę;Ż×ŕ[«>W‡qÚ3 ¨µ „ŔěĹĹŚ;W<î‰Č.aѵş¨@WÔŠŃ$gŚ)®ů6Ţ~÷{ßÉʍÚ|%˛K)¦|Ř D°xT‹qËÍ 7SŮßô±nôR߀e—đzÍö:Ú‚łMʱąŮîŢaěˇ Śa±Ç˝·őá;6Ŕöď`ó¦ÍŢ˙­ę´N(BGvćż9l˙®ŢE|ď7M×›ęÉŻÚa‡ËwŤe˛iTËÂIÎŹÎíő·ôő3iBŹżýÍh<‡­**ţUlţ8ĎAUpc«ŚŻý*.ö“v˝=íÓ(żi][î1Ľe»wlA'€yVZGÜ{Kűťm¶Vsąśi}ÄiÂÝłôńľ®Ç˝űńŞ"…˙ó7M˛5q!śŇĘĎřsĚ·~ă[?ŰŢč/n ¬ĎźŢ˙Ý÷¤8(3”bťćsvCäöÁŮ[űýůţ0>üí÷¶›ńÍoĽ‡(—®ÄصxWČsäß'ô{g‚Ŕ´Ý(eÎu™ŕKÖň§oć©b0$išÁNK+T!˛Ŕ®Ú vI‚ˇÝÚi…*úŃôĹë2”f5üBO5‡¤…±Î†Č×®.ŞMˇÔľs´¦:Zsn Ě™}ɇNl9Ľh–Ĺ7ÖPŤĆRDŠPąJłĆw†Y¶bnýEe†AM0Beó\áÜĽ¦6÷LNĆu”#„‘«ˇŐm<žcxmó üęîbżßď´;ď‡8śĽ1ÄmńŚP2ťňqóÚýˇŚx‚ɡ éŤ~L?öaŕerNŁ3€ę¬ę„Љőj4WĹ©9ęĺhq¨‡bA<p5Ö.á*CٵđuĆŞbčŠÂ@ †ˇ:lŢUź†{żÚ÷ż]?Ţ›ŹyFrTm˝­÷ÎěĐRzvCzý~UµĐëy5WťeÚUő檡˘u˘ĚřĽÖËwlÚWep/öôiÁřM" ‘uM{˙;•Ńşˇ–ŃşŚ˛ÓŞĂŽÉÍ}_?c€:áPňaâTÁbŽŞÉj•;Lµěŕd3–půglrřîĂźí oôD7ÖçRăTŹúE kJ±JP×Ű ·ÓwóXö»ÇeóúŔÍye`ą®ŠóFÜ/|`ębŠ=u.@E Ü$ Źýô©đś™Őe”ÁAŢ\ä#jBnŰ‹@›GP±Ł\tŻpc¨h1|I’‰]*/mąŢ›YŰţ #qéc˝D&20Ď%BĄĹ«!PŤzÚĎáxŐ­ň¸·pT_‰öĄMť~Ŕ—°zú‡ĺčKwë_}cőäĂú0}éíI‡ôÚÝzËđoÎýŮŃę÷wő™Żîx}59=©ëjúë«őWň'€V‡rxüOĂjđr‘|ŞeöR\OŤˇľ(ĐČ;ÇúýďYżĆGďúăť!çĂ94űĹĹ꨷}ő+gő—ŽWpQźiŐiśňŃ_Űę—Ďěk˙eŤG«i_—«Wc~ĽNřW—«Ë˘?tv(ôŁ“ ;âmú«ôOŕťVÝ0žâPüř—Ž//.‡żńźÔŮVőĚe{éoü„»úß—uŁ/Ś>ĹÁş)°>Żšç˘Yóíŕţoí•.p5;ř?|qkĆ!~éîpśřJ(íźěĘ3l6ÇüH„»ßqľrä~…¦Űµ ´.¬nwĺ“n§pçVüĹ}rřŁŰđg Üź­ÂČgŢ ţ áUčşpËÖÇř…° sčwauÇÚüí–żŔŃťč·ç‚{čVa†ÂŃ ĽĐ+ %­–î¬BnŻ‚W†•Ľ†Ű«ůYĎnÍĎ®ü¶Íżw7xőŕ/`wŰzć·^@đp;Ě®#t^xçŽa–óô ę…b€$Ţéü¶Ż€ ¤;Ľ‚ đŰ˝ŔqćgŽň‰ŕ…GRĎ$o%˝(kBçč/4űhë™—dü@—‡ýüi~6»ćYł4#0ÜqáŔo­Üó3÷Ăž†?ÖŤáĹ_Á‹Ł[Hxńáo¸Âey†€ä+ $ÉCG1ufn˙ő4WČKúĄ»vÇWXů ř‹™·‰[~|ü×Ăť€g^ćĂźó3őFaôÖ „ŔđÂ-0¸30¸‡;üŁ ‚·‚˙%"`Ű«•ŻÜZun˙·Vż|*»Í•­óży×GńîęŢŰő_«Ő­/0?_áôWŹË˙ŽĂŁď­ž?^Ą{őÚ‹€ŕ«_şWéoÚ_»ŹW¸râŐ`ĄXŕŞKĐŁŁbuç–˝ˇWÂśźřÉŕ«yÖżŮýň=»ü.ž]ăŞ<Ĺ‹bi˙ĎďiB(¬^Ěţ‡ĺň÷çăîżň_ĄM­?<úÖyiżűpü?ŢçďÓ‹=Öiő3žÉś«ÎŹ^%"íU¬Ö›U<šź•Ł®“=Ăę…V/ÂŞ (˛nĺřřŕs*¶Oó'ÜĎ7ÖĎ­>U`ÝŚ?Ç*eĂ T* šW¸9Ć ËÇĘÓ~ż;ßťÚöî)Ž’®ťZH ™0ˇŇ)Š‘:¤uy¸{†§»Icö ‘QÉۤŻĘ•HbŢ#n@0ĽFś¶<"\ "Ax! e_ÔŞe*·áEĆ‚Ó4 ¶<Á°+Ôŧuç|M[0‡šk* ľś0Šq™âz8‚ë”›…ř s´}L[¤6˛ĐĆ‘Ŕ€2/,Óň| 1¨,pr-óA7Ě€ /DÂ˙{Ő€„H¶+h{†eV§< Żmä#|/Ŕ¨¤}l޵¨źŰ^uł5GíJ:>Íů…5F:ętnă{őů¨"xM1Ő«1ő¬ŹŠµ]ăC)Ž>˛ňÂ>|'K©ęĺvŔx9ѵ,°–bëk4őăďLĚ@P+i§¬GLęłÓ¨2%Ĺ*Ů,ÎĘż·gPŚyĽř6żţ3|\ŢúĆ[?ĂłÝčĎN·nÝú˙Ĺg?ţ¦Ŕú|k÷äOŔąl¶gé9C&er‰íöÁ9*„wţŮ;úĆ7†“íéݡĚ ‚ŕ Č-ű/’đXדćő݇űZ "H™H…Ť€$Żůc’LRÇâ•Ĺ1J!j:Âc\MBĎĆ—j«LŚH ⊨"­-Ó!7ˇFTşÉ3a‹çiµ„šˇjV ­j)mCRiURYLľ`† Ě*/Ó «ËÔŇ |{q´4\-×µ¬»gďł·z.C–=¬WPţ„Kc*SżîŻk»ÜümpI@|‡“á a#ÂŽáM… $\µßşŕ9±šŘqs2śťťíÎ߯ŁÎďá߲ٗué:G˛¶šlűĺMýÝ=±ťĘî˙§gäŤţ"ëÚwer—0°HITQŠd”˝XJđX[gL‚çCbĹŐήöŔŢ"Q”şÓ;v÷Wh1"Ś%y}–`Y#Ž ‹VöH§¨]K‘dWĹ$”Ńgp° 3eßĄî š0N}‡Ž‰Âˇ”bŕ Ô 'ęĚŞ)©Çë*ă,’šEYů¶ů„żɮؚP¶°Üň4Š‘¸ślMëT/ Gü©ćÝřÜ˙âë˙ĂctS`}´żlÖCN©*OP©±P=Xľńŕ­R°;řđwÎ7wKýŰ6wâŞŃGEĽF)Ä,őëAŽí×}É“Ęa$€¸8ŻÉFŔ‚ şÔj”0TÉĺbČÖÁjáÓýRcčh.ë" U`+`ęsJ9˛ńĐ Ş…)6żą‹ÖHë-9‡HŤžŕ ) Ađ%EgńŚp2oѶ¬ľ4Ă X\óZşSňĺ ”Äç«"g –& ˝¸3ŕ˛#jb ˙TŽ;?–Č ľĽ\ű§{Umżň&˘q+ÉdŔŠł?˘(:aäŢüÚ›:h˙t—÷ÚwűÍé€Ć¬wÄ€eWtĆý/ż5–ťő7}¬-` vĺŠíĄT©DŽH:%*ÉKŽD×3ČşTĂÖ}wçÉ÷ăAĂ몙žJ¶î«Wt=>~Ď‚ęŐ^ŁÎ~}8ÝHH'÷ëúAjGs«żóގÔ#łńaí`GzĚe§Ëý0©”X”Nâ0Öą(BŚH`Ą°ŽUEJŻť{;{»~|“ô|ŁĎ¤ĐčAĄLů0î§Qµ­»A µ`: ëďníĆóÝŁ÷Ë•@'ĄŐ@„T(c'9śo6wc ±µuäŔB1ĽJĘWÂ<–ą UI0yQQ°$÷ +â9—3@P€˝R´śÁ#aćş­Ž\ … &* 2¨Eϡ«"@WŤŃUpĺV( 5·T=ki€µÝŇV…p5Ł$⺨r­>Tđň‚ç¶iu[uŚáĽćąĹř°^©x.× ¶O=L-i@ËŇ©Ző7Íe<|k‰ËČT]p”\ "dŔ ŔÇ…wď»– ‹10¬‡·1¤\J3×§n°ĄGČ–kܬ7CÜýĎäivŁĎŻľ ČĄ€ěŞ@u•€â’Ł8Şg•ĆŹUgÔ2ˇŚuަ ÁK˝ş7ĐZoŞ2:2 BuR-SťQKDC*űZ>„y˛ňQő ŢW ů(Zźš±  şĆ•Ŕ¬:ďÇÇď×9¨—;ĚE¸ÜŐY¬Ŕˇv†.ĺ¨<«žF5¨ö}E©%¦ÓmŤDő¨–ç ”±ć=ŽÉN‰ŕsńŞŞsÉĄ”+D—q ¸<Çw˙I~ôîÝőÉE}˛Żóx3pżŃgÔMőÔ4MďţŻďěż·ßí>Đ<¶ť¸qŢ—y,‡=śťťť˝…9žw÷ťö›»wíŤ Rb%‰Í"b™c§íWúłł77'g©‹ň A­bľÄr(:ä\&Íur l9˛p)HŤpVa!9`‹˙‰[Đ—@¶(EpŃ‘ëƨšÁڶ‚ÓČë…˛ž—É Ł(ăJRÖ•ŠKĎQ®ŠžŁ@zŐ‚@Ő‚ç(µđ9Š‹Ö8ňZî‡,§ć(ł*2>€« T$”Ă®Ąmö§=@‡ -rq†U¸ĚQfŤ‡q÷ô\‚|„ŁşÁˇyGBĄ.JÍ×.±ÖĘb/žn¬Umű‹óČ@řŔ iĘ%ő±?ÝÄřgýě»Ńç@ßnOˇkVučúë2CN9L”`"&Ř,x6#.3:ŘÉYJ[ĂPI‹Í”I@Ćh!.aę J±"”ŃćąÎmfZż©&f Ă×Îěě-DXŐžN8Ś6ˇ gę˘&aš Ěeo†Mę7)Ň‚!D‹}[¶“^;ĂĽłĂMöś÷‰Ë˘Ë=ď5B™©Ş!ŃBL§§H`ODYÓIoł0•!Ôát<’©ĹŘßčF?]7Ď”/¬Îż˙~ߟ±ŮlÁyĄ:ěú¸ŤßřĆŰ»‹óňńřđwއÍćdłÝl¨RČVŔ–Cb¬č‹đ$mN6ăasńtWgYč‰ÚÁâ…E0A,ŚĂ˛çB%­´JH€,¤ě5mĹ©‹Ą%F+ł#Đ bG8©RZg+"–ą´“śf`;çŠęó—‹č™LtÁ ¨r[ĽíŤhŕ@€$Ľt\…ĺ§đZP×L×ä†Ć’0 ’4˘‹U…eÎpŐ˘ź˛gTSżî—I+dnÄ‚ŚśKŮÄŤZ|;+~ÝN ÓË!)đÍżývâţ˝ówƧ‚ď7_ݨKć9—¶·¨>Ĺ"lŚĄßjĆŤëFßţ‹+ÔkjCŻSBŞŇ1j‘1Öá„Ěc=dÓ”ç1ͥűk׬’9k‘ť R&TM6łĆѮޯ»AŢZÍ©ÎęÇ;‹c>`ÄaÔ4&–*%˘N樬˝Đ˝°Cq9ˇgvbü€ĂÖăďî†>Ö4¤‹)ŮşŻŹÎmf•RÇzŘ[)\RŰ‘ťűřń„G&ĹxB|u‹ŁMţîwŇşgĹÓÓdW¨łâąl.őfDxŁĎ¦›달iş€€a˝‰Ç¤‹q*{2ĹČádKF=>ß}ďĽLŮOďmá¤j±q¤ś ™EHë8NĄ5›R—”6:’®rŇőR‘¤±”,‚a3ĚŁÂ`a¬¤iŤłPXA„š#JëWąbŰlWÓÎŮ06¤JiĹ"5/U×â7ołE(Í­…Ů*5Ďą ÄZ¬xŤÁĘňŁĘ`@E0µcWe°˘ n®vÁčya’ơ–¬1#Ł ń™Ţĺ U$+޵™ŕşˇ%PÂH„lˇ/ęűxˇp ‡Ľiů=rÉá$âĂy3¦Y±FJ‹Żđ\co¸D 7Ô†áŰ\˙(đżwýŁçcą,ř_€\É@p˛u\đŔq€©p ÄZ)p,śZ0(yEěFyJé´ĆŤ…‚.ŮŐK Ä)±˝?ľ˙`k4B„Ľ¤Ě˛9ŽĐĐVe­#<ďż?müí‡Űiż=Iq8SmB‡z*hĚu8Ůj«(M›Ó­4iŽTÁ !3¤â9vš+0–ÎŕÁĆD`BíµR$ĺĄmZŞŹ†$GŠfŐuĹéú–\ʏ$±‹  ˘¸îĄ[¤˛â˛•čBp1EI/ŮZh2WĎW\âo—ę hüú%ő™Iˇ¦PÉA+XŚsľ6 Wú–ô§©ń¸´%Bz&;N‡1Ĺ7…1†ˇjJ]_ü”JXČű™ž@§°ŹG9űÓíf}ľ»((ĘÓ>žnbÇ:_›â˝6Ë×NKźÇ›=ó]ëř5X€·­‰P‘ů ‚ J3j(V‡©ÔÇ{Ű µ=B BG@CÇ*ˇ°<„ĺĺ…Â\”č¦!¦š/ڍŚĄv2ˇF™TĎ߀Ú@%é'f%Ueű2ëŚÁ5>ŃQ;Ů„űMŚőíŃX\‘¨‡l§ŰńűďĆ‹©DF'(cÔˇ0 ®Ł•‚ÁY]ˇ’Q]CXlfţçď˘g}íĚúM=|dP.…—D×ČQ Č—?§¬V!}ë7ľŐľýć?üćĂwţxÁôÖ7Ţú©4ÎĎrĚF7ÖĎ…¦izOď ‡MŚÜŢŰ–ą‚ >ńÄ}Ś›_[‡|ţřáůű»sâě+Ü~ą§% B–Y"Ę„ÜHťČIí IDATîÖőµ€q‹aśK‘$Ä: ŽńI˘ŚT)±Ź4ë Ž< 0¨b°"%¨¸a ď ÂKĎ;őrVÇ}ëW]3˘Úń¤CDËŔąćyĆ%‡gń… G.4ŽĂQ4•ş˘ÔşSč-€¶uÎ2•ćé—L-Ç+bBÉr™(–‚2íĄ\ô™šC-÷FKęNN!UXuAŕUFrh.·Ś)…ĚpS¨€˘ł óşËf»Ý=Ůa®űýn8Ťč+Z+1ä"2 Ć €épńgöt»ŃçOËĐ9®H‰d•bá^śpĄ“a’hßýŽ…Ňv‹ŻJOvIYgX‰HBjŻÄXQR‹u>šŁŽŐŽý…ÝM¸ű÷ Ą>ŢŮ˝ ö{űţ_ë!łŘg<)ć‚hNtq“ě„JýŚ v< „RđčýˇëŮecÎR`–pYě´·đ5č˛ę;Z×@ČÂS" ~Ž/oí ¨$˙٦^ěáHý‡ý͢ȏWHo}ă­oţĂo¶ŻżůżŮę­Ođă—ü„cľxş1ą˙Ľ¨”)öĺP¦ńbqI;3öR)óěąNŰ{÷ÉŠç>Ü_L%ŹÖ"!Ś­—"®­ëSděD"EÄn;Šâ‘qÍÔFA3Š—ć‚k#€pXŻťă ZçěGgH`G„…‡~M„j‹„”·I_ó›·ŽŮĹ…bÚa©±şHڍĐőj ,2«e316\P—Čćű@Ëb0JtĂ’·†śçň“÷\Ëm^öYŰ–Ł/żusŹ˝Ü”Č„ 7xŲ}™ [j,0uðîfj.t!…$ 4î¨+­»oţJÜčÇô®=Xµ!Q–ŚBŚEyćx©ýČÝY©őéeˇ|9É+j̇i,e˙T¸T ‚”ˇě¬Eë´Ď‡RtĚÓ„˘öů¤– ® U0ĺ˘qß,”ÂAůŃÝ€ uV ”/X krt/*‡qÚ# u¨eD úźÓ×N+ZăŞ}ŰşY/ËŁoýĆ·^6¨ľőßj?ýÔdđ'óĹÓMëçHÓ4© ňćőšâŹ#a HóXLľţ`*e˙x÷Îď|'uýŮŮöěě>#c“Rľv&12Ţ×R˘GB%¤R.űkŁCóČŔ|Ř%ߌłgë¤ç˘Q$Şł…Ű0¤âŕś¶Ř"꤅«ŽL\WTh™ÍhŃ’ÓĽ\ hű†KŻhH¶Ęlš‹‘ €ˇ¶óXőrŁđÚW~ť*MjT`#8ĺq„ĎÎČyÉ‹_R`đŠÎh®YcâFž’”S4!H"µ{ Ydj|PSRçq›UěF?/zÉÇÂu\zß:@ł2hÚĎ,ë;*‰F/C : ĐN;‰(ËG§DV3kó•C&Öć‚gcŹăÍ0– (*ľÖ€`đ’Ö=¤}-ă¬Á EÖ ‹=Ö ‡Q™ĽÖ“Ş×®/€%¨fĄŽŔšu–ĹČÄ €Äľ–É@š8=-±ŁťĐ ŞÂ59ô‡2=WbOăK¶ůĎí1ús×[ßx«µ¬ţ´’¨ ?ŐŁúÔXđSݬ?yüF7ÖĎ—Š&Ó˙vŃ÷ýćt;l‡!+7_¶¤őë>Ćłţ˛źĆéüýóÝ“ýöµ7¶g§±µ@ŽąP3IÓ\b0FŔ‡¬qJžµ‰ĆĂ$Żą”6+ ČeźZ6mT"ăń1J° ÜČR!EĎš »F~J×35Ĺ0ČE,ŕÍĹęń˛§ŐvI8(ČĹŘŽáËý;Ć(5(Ç@B´CKE$´LńŔ(´$Ą´@žbs˝K)ĄĚůşZúéj;Ś‹GŞQÁ‚U'xaRŤ1I9vN F>ORŚu^:€°Â˙Ă޵H’eךźŕ$¬–px‚dA8” Łą‚[â F3úó{šzjú§ĚÓpőŘ/â¶.¨.¨Q Ô(*đ€0r8Ňŕ,ó0Ç"»ÔŇíN]µT]Uľę!+sŹŹp÷m{Żý­ór~W‹\×˦pž')¨ě‰ĺ”T·2lËËŰ?®űßř㦙7}4ö G^a†ŇÇź·S@»jWŰ´ÉË«c ·=n1ą%âŰą]sűćDÜE 6/xNŰoÎ}k˝RO[śÔpś`s<ĄöÉ=ĺˇmkÜhď–ůN±n-(µ}sÇ×-CyŞtĘŐy˛q>Ą&r`µ“pwN´î8f—R»Ö¸×AuoR«5šQF“ ă|Ú$BlˇĆSš§«ÚI¶×Ô~ŰŽđw[Ł„ĹĐŻy°>čĂĐđ¦ßZ¨}7t~OµmŰĺńÁ—Zë ŕFWqµŰć‹‚–·Ëůţ%˙˛ľűëź^ţî±öMĺŻ2=ÚM!® Pó'µ^%IKNé…Duç°”žK‡Ţl»»u×Rkc«UÝĄĂ`‚vj¦ä—tgüůA…ůký­Ł'ôOnk|ĎÇíŁ§5Ţ쥵ی4FŐR (¨ôăî5Čĺŕú&/*®Őu„¸RéăkŃŕóQ=¶z" ťcJřˇ±8îLuĐM_]€R=Eö!ˇ$)Ö˝Đĺ^Ž+†—gŔ–T1a$ŕÖ›nú |Ţ!¨pd:hë¸ËŐT±ă]µ@“P¬”§-n¦«č‘€’”÷jV”4AR}¦ľ—ů”čÄť¸9^EµIĽťcJl5ţÝWżŚĆÝžb¤4¶›ă”ňśňŰ‘“ňśň$®Î#9'éb E)§´^qY„"8•+q§|ąĹkeŻXk73z«ř_î )J".ŰĹWł×¨Ä‰­bé{»EřłżüŮ×›Rżvăë§ńµńßox´_[BüîéV`}µmŰO˙żźţÍőđđP»Ý‹ ěłŐ ťtŇ˙ő'vwźćü§_üĹ_ýô˙ýŻů?óű˘‰4ˇ×)éLzť­‹¦†Ş¦łÂ9§YR JS^NKžRV‰®Öť ‹Ýu[[-e[˝®Źk­ĄŽÜhúJwµ=šnŢWz{I-,„·c ÄD†xô±ĐŕĽwj‡ž‡ P’!ŁR.aäó§€00čŇ‘(ä÷• ąÓö˘zmŮŐײnkë¸ó‘wĄůpëčdeBCńĹać— rdTWÝD„çăű N/|ş—”Ň›9)ŰĹ_÷Łw( ľ zĆřĂďčwô×tÓwGźwµ» Ú{ĐÖ]aŰ]6ÖG_ţ–őŃőÂZ¬®˛×¶Ő1+oőˇŚŢNíöW´1ŽźÓ|Ůšh2ȢW·÷.Ţ*¦MĐŐž6zm{ŤM»^Ř+¶»u8©éC@»›]®u­fĘśĎóIĆXm«)‰ÉHÍo>H-85dyy›x{ÎoS ŕz¤ĺIŕvŐú×hTSB¬ű÷şő1,†~ű×ÎůP«ý†Bí; Űđű®Ç§ÇǧÇuŰrJ÷xŻIe/"·ťXQĘç·ćîĺ­Ţ=\Ö‡wď>ű“Ď–Ór÷É™`ˇJIŻĺľąK”ÝcN¸;µÝšÎö¦˝‹Š«p ±…F/h)×5+V+ĄŇv¸)óš ¸ˇ)žÄićúČ®x—Ŕě°×¶y,ĂÄ· R–‹[^»âÔqǸmíj[Ö$Ű9¨TłG@‘ÄľFZ٬®†ŁE@–w§¨µłśf‚yŞČKJßĎ´ç1üúřďCŹęĂ˙ú0ű§ýÚń_;çCö›{]ß^Ý ¬›Ľ—ŐEŇňÉ’¦dŠ&ZOr©¤¤Ór¦ěuűĺĺáď.e©î–3B{6yiŁJ¦)Ű-‘í¦)ąWş‹˘Ý¬Ô<®wP¤Ho€w "h±#Nú Ťb*P»“ŇXNüŐč¬7ÓRČîe$ô "—»Ź~"D…6ć•ŐG×'OŮ´aěՔƇGłs tü]äŮŃ0–®\χTÁ<Ś˝)(˘$«±XŽŤ =GÓĚ}:2 Í뼊ťŇ˛>mI٬qěZNÔęć6+Ml‹(ÍšŕfĂşé®Ď» Ą;Ü=mW§@ÝmP¶&ĘV1JÄ0jZŔPßű,µëe· —ľÍQ ÇVŐPłżR™śm·kURÍö%ĽP» N)RŰnúđiĺ–ďŢ•ź?fÔ°;~ëĺq+Őy‚Y1¤¶o ´4ç«/żÜ¤ŕxu»>x«’ó<·}‹ť–ű€!‹I˧P Híúýí`}0¤Đׇ†ĽężvÚ??ţĎĎůNN oÖMđ’Ž·mŰÝvĄű?ú,…B/«łĄ®qŇőűźÍ ?f†řťŃ­Ŕşéźčńń(u=ßÝç”çׂ ć*PLa^ţË}óýe»l—‡Ç‡Ë»tůěŹ>;ż]Ň'Đ“đ{)HÄÚ›B&µîĽ›=źf÷ ®µ”˝ş’¶jĐ ´Ń[­;EŮVDą’ĄmŞŐW$©ĺ—Dť‘xłîkËřYFnO¤Đ˝(äę6ĽV(ÚĐÝPÄĹŽĘÍR‡°ş'ŰbÄdăľÁąô‹ěŇQőĘŕčÔu]·ę:ż5p¨š$*$%÷±î„[o9-tňĽäS¦GSSHM!+¤˘i ™0śX ,d–J^.+hŔĽ[Ęt@ V8Ş«1I¬Ż<‹UŇ”F2ÉM7ýylúŃÁZĐf§}tžÔĆý—5Ł6%wł«ŐŤ÷”7ć ÁĘ”Ý9¨ç7jÝ jč µ©uÇ* r5 »Ďâ«\/µ„ŃIJMkś˛>=Çki6;őѵ+Í5 ŹWn2FÓŃ–Ž“Zp”šÄ|n_ľ[N©aFí(5;VŠ«Ż4÷Zž*–‚ăĘe{Ôřę¦Ý'˙Tżˇ­ő=×­Ŕşé_жm€§…n}’ä$ątGłőK"Χ3ťZëş^ţˇ]¶řÇýOç7’¨ŠŚ^ľ)ę6Ň SŔhŐ’ŃaµE«»é•n הڴ[“Š=üłŁ§%Ľ%©QŁT:1¨ô5żLÁÜD÷FŹĆ­Óp ˛ÄÖ—ÜzőČ„f© TˇJŐłÜmhý’;kGD×B í`Öëć˝ŮëGŇ4ÍcqTW3"dz‹Ęîžç„Ćî䪞LUX ¤Ęُ&"Ż@C«ŘLąş¤°¸W]îĺ`˝B ŹgŢŽC9öďď°ă¦Ź×OŕÇc»đk}¬˛Ű¨ěÎ’w§¤Ň­4"á…ČSj˝ÚrwÚu)^Ţ(OnĂáUޙħsüě‡\.l:± ‹«›śOq­¤Ľüáźµżřs[N[ÖL/ŃZź¶%Ń·˝)žśçDr«ŠÝśvě˘;v!˘Äv©Oň\ó$ Ún¬uŻ ą;Z ś^p j?ç]JŽULÄůüM˙B~ďt«¨ţEÝ ¬›ţem۶±•˝Äm™OŮKJSsĎyŇZ/9`Ý˙đÓsë>ߝ׼Ô_úżţňĎĎçĺ|:źpŻ×JČvŇâ`uÜH“í–N™Ţ¤Ĺ$»Ëz>×ýâP›AĂ“d»5ĄÜ«Á{9˛•.Ź—”• ö`µżBRíuI©xLÄJDŤQ %öLpä0Ň6Ľ4‚dl*«ž«_%šrŻ&ŤÜŇ­Ž{34Cđĺ«KÝ.mozá üf)ÍI#á'Á p1úLqĘtRJË'÷Ë)ÓŁFŹ…í˘ß.âĚ« Üë¨&ÇÄó˘°d=lN€BDÎSFc6*ş@/ŮŽÍXa‰Ti†ď§a÷¦ť>‡u'­Pş3ŚŤ޵Ł' ějDLÄ“¸š×l_yy¸YČ®lf\ťź›·jOj“˘+‰hŰk+Ýů¤úhuZ NKëe ”îŚ\-ˇ· ąŐʱ˝ˇ¶U:î¨sY˝ĽAi±_YiĚ=›kÝ^şÚÄh®±&BÍA¨g)Řl¨>đGßÜoâ¦oŹnÖMżIŹŰ#Űăšćôe^îćĺ´¸§4ĹŐMąťéŃq.®ŐWó΋L­TĘ—ďęWJ™<©\kžÇe mŰbHÍÔÎĆrw>‰I?”‘FRjüO÷¸Ä ®›wĄÉ1«ŁŐě*ˇćS:ŁiĽÉ(źh[­ë÷ÚuÓÇëV`ÝôŰUëVë%׺Ľ=+ĚRô^â”í6€ç)Ąs8Gĺr˝\Öőááa}SŁĎgŽśĺś^đ:ÓŠz„&Ĺcß’5]f{›•+1»9ąu—ÝËT˝#2*„WińľjZÜMq{Gśsë¦g﫲ÔKZN.ĂŐ^»ő! ńŘJ¬GŢN8ž·ÎJ˛7÷4Đ;ő}ńţXĽ ŹŢ•4§ńX˘~Í?nHÂÔ9zWXalYFŇ"iN ܆U,§¤`)Ů÷ ccŕěAx5b°ŹäÇgčŢľZ"´¬ďţqŔÝ‚ÖYe7Ź™šX'lţ÷ŮÍΗŐ)Ŕäń‚) n® “#łÓVŞ1P Ox"‹†#”ÝyJ-@ő¶:)Ű_±îţ!noSśhÝNb˛aŽVúLz›âŰäx>LsŰă—ČoiÁą§ÖÉUĺ—Őűhr»Ôń27ťŹŹĂúxÝLâßIÝ ¬›ţµ==@«»Űîó'wŐ3]ÓĚľ&ť NšIvŠl«Ż~XlÚîś–ôćčô)°ˇř"úC®‹˘!őŮ&ł;2—°)ŕe?Ű5+W:e/ ‘]Hvgë¨oÄľšL_ĄčŢÜQČXŐÉl„äşÍ1NŤN1`‚Ľ›ľŘ…®bŘ©^Źřq¬ §yřUżjTŽGIŐěÓ&E NIbIg˝Éy®ę’¦hÖ<-†Ě<ă)úz¶?¤÷Ő1ŕěâ™řęÝúôŔ袩čt/™Ž]Tjč,~…ž©˝áć˝Üňžoú·ČťÄËva —./+ˤż˙ÂËIqńůśš«»HÎ3±CźÎń±®W§ ţłô¤8C§U« 3Ŕżš(Ú^±rJ<âźH_ştëŃ$GŹ©yrŞůmâmŠŻŢELŻů©UcÓă)±Ő,µÍ1¨ě5Ď©ą){™®tĹ4>0Mř'xţÁüÁďöoú=Ń­Ŕşé]ŰÓăöôXNóe[—IËŰszë"é‚3Ó–¤ćóćµ{őşţŹ z·śÎé-K:§7Őž“äŕ#¸ć9BK!šB6íĚ]­ÎA%ÔέWőěn‘ŽCÓĄ_Q(Şçá%ŹdBk=«cŚŠ{QĎĹ—Ôz$¨\zt6ęŕFČĽż¸R÷‚Mh ŃÝšäîôŇŻr»NS¶‹”ÝQŔČĘRZć…ךOg…š¬4Ľ)DDće \<ľŻ8Ľü šëË×rUH~®—Ëüxů›ń89ť—SŇt¶+]Í›‚˘zq‡g¤Óý›řŁąé;¦2Ö¸´{yÚťĚ/IëĂĺÉçG-?¨ůśűáÖňľŤucA­Ž_>ÖŽ»$âŰÔjeWćĎţ,˙ÝO›kÝpńüw#­ď­/íŔ"µ`HĹK®yJĄVí†ÇzE"OjrD­×¨Ô\ËăAŠo(59µ^ă$NŽĐzŤ#Ýxw<.W~—úo?űożŰĽé÷D·ë¦«¶ëĆu{„y[ó”Ó)ĺy™»+¦MЇO )ťĂ™™ęZ®ëúsżă’RZ>Ťçé.ĺ<ę•‘x¬ĹěfzăĹż•N2,$wÔg÷JO­_<ę–z-{Tp˝6ujţnŇä2Ěčݱ/%¬ô\@}°ÝŁ{SŔ{ąvÔ†ăUµ>¨S:îQ´Ł#˛{á fÓǧ#eČ!%‘O ŻÓ|ZÄť’»€¤Lž¤A:–"›b6%…ŁV€SS­^Ď9ň—_üĽ˝{¸”şi"j™Ď‹´¸^l5×(­Ő˘lÓ«^Ďő«Çµ>Ü„7ýő“Î'Öhܶ_ą˛Dý°¸§ŻŇë-&ňIĄłüŕłň·ďňŰ™ęu5h p2ĂőpÄŻOŰÂźÓ5¶­ăîUeIsšŇä“Ęć´>Ԕŧ)‚ٲÄD<%ľ¬Ô5×}Ë­:žS™<±sě0îŽÝ1Ą˛UŇH0Ľé¦ß®[uÓďLŰöČÉe_u“&čąŘ9Ř!ŞBĘ)ɤ K-ig[«Ě:=üń§÷ó'YcĂNł{=XçQF´Nfhidę R”Áb¶qłŽ®ŇDÝă"Ř[ n{…fujo„‚Ѥڋ¤‘˛<Š » ź»Ź´ąŘŃ®ű *}M{xă5<^!{dQ÷A7%Oąubš$ĺeIš–<’péÄ4.ýă$It4řXÄ:ę*¬ç<8ôL/&+¤Ú«ž#Ż´ľ˙¬Ô?gŻvÉZ–ůŢ0¸bšŤ~¶B"ĐşĽ˙şÄM7}Ś>ďdžŕŹ^üXşYv+đ!:˝\!ř|Ź>MY´í"(Ű–Ň=m«L‡I1*qޤ@y´w§ DzCžSë^vJđý9WnÔIDATe%í›GDé3)C aĂĂ/˝°ńŚ^©MÄęR­.ďŽ;mŞ/ź.ă»uÇ®băb"=şŻ4 xf­Ź®k˝%=ßôď¦AĚ~ÔíV–ݶĺŕT7k#OŰůłÔ\#j [şîp= Ž Çi,ŢŞˇ<Ń®&¨í¶ĺŻ|ţC5•ZŻ ĆŁ1âŰí\$ďöŢ©©z3¤7Ž?¸k%Ô&Ŕëµ.)5­Vk}ĎȇnOŽAk±Ý–o›7}¤n)7ý;ŞÖ­ÂśćËăçsą–|Zx3 Š·¬łŤ¦PN)ŃaZĘVčľ<^”¸lëąž—·Kz-şĹŕHŮ IŢ«¤ĂţŚ ľlÚiÂöÁc ;q‚®h•rFŚĆpŽŹ­ĆIŐe9e;’đ~Ôv0tuëÎá~ÔR$Âh9ęX§B¦huv')@Q§4PXHkš€Đč@;ňăřVĆ2Ł‹˝¸gŤÍÄζýŐ»ü‚«č-O©…Ş7 ‘˝hŢč¸GBhxß”gżw­ĺćľşé?F?^|ZŞ»S“AŢ\&µ˙^ó[‘MW>™«š‰'Ĺt$L·Şö4¸VkŠ-‡ŞIůD±HĂ}ĺŘĹKÖˇ¤Z˝$µ0–yÍłôÚyd?źŐ®•ŕ(Ĺ”Řj|I†FG+˘őj#aI1Ť¶ÖM7ývÝ ¬›ţݵ՗ąáiľ<]Îói™—ZפEűś“j7ÁfÍiR:-böţxŮšżxxřŰMätžgĺé>˝‘4Ćf©`…äplđéu: ¶îü˛Ť¦¨Ţ‹ĺoG4î•p¶W‘Ćŕ3ąyôşĆ´Îę2>‡čN<ŞĂ ?ę‚(â·6RŁĂ¬NÖě—‚Fąć~lŇ#4B„–^gw§8ňsäŃ™{…žUۢ×ăŇYŹżĽ¬OőÝ_˙e©@ÉÓ’Îé~ţ,ĄHouo ď6Xůř}µ­iŻ_>\®ĄŢâqnúÔçÝ?fô±¨ÝŞÔÝç$ŰŢ©Ő鎼8Îw­o11Üe'v‡äŘivě8°Ěs;-LI×wT·î(Z Î3O›+¶S»]ŕµó§łN[ě©]jÝ©­Ň1ś˙ŹÔ\m)9–©hź¦h—ÇęŽ&/?¸k®uóú•8oşé#t+°núŹÓ‡NsšĎ‹.:ĺĺÍ]š2AqĘ›·´'CM‰ĺţ˘Šů\«M-×uý[»˝ST:-9‘ŇÝ2gb‹ÔG·éh¤×‹mĹ “¸D¬m¸Ú‚ŢŇ´–&©[c?qÂvîdäîdUŮu¸©BÎŞfĺŃ-S¶W„$"¬ŇŘv^±ńľ<¦ýŞĐô:3v É6ĎM·_µá OŻqˇî<üâ§ďÖkÓ„RŚÜßßç4ź Ôk!T  WYwB®Ĺས|gęĺ/—m˝UW7ýÇësřqĐ:¶ _:C)8žTż4Wy}'q˘í>&wH8žÔěR뎻ÚnvŽ!µÉšđnwÜ˝üos«•Îáß ĐSę•]-8&µ ŘiµĆ.ä¶ŹŕŃZ73LĐşy™)ű0' *ň­uÓGéV`ÝôÍhtłëő˘)]~sš5ĹóŢiĘ’0„ĽőM!ŐţQ¤ó§wě5ţŕľÔG;•ýR¶ő╿Ö¤EIYJóy9‰SNŕerŮ Ęxd-ŹĚ™…n÷融Eö«2hňé•ýüه&äPŽ4č)ą7B¦‰dś˛kcÎŃĎQČŻJz éč˘e|âúąńޱg?Żzy@'Ĺrď˝n—u˝®ďŢ=”§ËhËĄSŽş»;źĎóbjÝ/xk¨^¨măć1Á4¬żĽ¬O×ŰgĂMߤ7kDWŐÄ,+uŠť' Ę•Ëc]NŞoś’Žh¸ÎK5;#”Ó˛¤xĂ^cŁĹd¦ÄŐŽţ–?đEç˛mJj¦É PŞzőňi"xа@L,wŕ”'ç°ŚŢtÓoÓ­Ŕşé›W­•ZGćůîňĺßäÓ9MĘóy~ă<áĐÔŁÝ,tµd׊’?ś?kť({µ×RĚĺZyú٤ĽĚIŠ9ĄtB1PHtÇ@3 ¤•ŚŐ3„Ć6â‘*ŘM‡Wű™óAçę™×+^ŇE…îá5îű SĨŢč2Ö3¦čUNqě’4Ü÷*ÝRŮľ˘<=ÖÚ.ďĽQ\ˇiĘQžßÜĺ»&aTmď…ŕ¶ĂČaî®N}o Á)ËĹëăĺňxąő®nú}Đ׹Yt ÔíL­ľ+_Ť¸TëŠOžÚD ©ąŽĆŻtŰAUL4]čö~䄜š]Mm›^áÝĽWMbkÜD ”ÍŮ#WIŠ˘Çí¶!rÓÇéV`ÝôűĄm{L§y}z(SŞ{mµn“ćO¤pŽ“p±˛+d;^G4XžRŢ&U3•âä˝Ö÷v/őÁz%kťO)‹4ĺ|šĄě×P”xŘ%ű}Ł®ň?ÝRăü0<ň’Š;ěuëXGVXŔŽŽ—Zp É89¬„łÇ^dĎ5ż«ďímľ<˝»üňÁ»ËUŁ’•Ó›$-yVŇU¸ÔUÎ>:mÇďŮBŻäRË•őéV]Ýô{§ܬ±cř›uy2AÂq’wűŞőÉç·• żň’D»Ă•0|TÇIëflv qR´Ű8Ţ%¬×"8N F°Ź‘ňHkGmßbR–q´t瓢ˇĽř›nú­şX7ýŢ©^7€ZŮýđ‹wó|Çß’Órô´r•„"`E»çIň´śűQ-Ő˝bŠKÝëvąlŃ !ÍŠŇó¤y^ĘJzŁ_QÔÔŹ7čdLŠ{V2 P€Ô^ZY9¤¬Ž¤BĆ^B˘żl:oĺâNąnµ¶u»¸UocGÉ [ËiN)+;Ďź%T{]÷5ăÖ­.wxo XvŔď+A Y×íňĺß×Ý·„›~źőy÷ŹĂ˙_’ S«u’úám_ʬeŃśşáHډ6)ZmŻĚ1ËŁáŽÄ›"Ź€ĎAĚŠ¤á˛jvěn0x(qL;gÔ‚ó¤ÖűÜ®Űvnţďoö »éۡ[uÓďŻ^řŹ@­N“ţáAŇ1ď›r>%˝N 8ÄôŇ%şŔ?;’j™Č).DőĎ6őy«µőbW葉mŰŰßô‡ř!äµ[SRž]„Ő=Óýr©ŽAÍ€«Ű±ĽÔ©@Ŕnîv«î ¬×Ş®÷EŰ]oĄŐMßrý~Ă;_ZŐ®›Ö«ď˙‹ňd•ëŘő]%/“Ęf‚V Z-A‰Úqׇ0«ĺ$^ˇĽ·w/«Jjł«r,ŕ&iÝÍ®j7T°­üM??7}+t+°núÖkx¶66 Ą9Iî(Ŭ¤@žł”x%)W_Fl`„šúÖşbPí IQ˘—#¨mbŠ ,’PĄŽM˝†ŃCµű¨~Ú4Töy ©č–P š¨u¤| XFł{ń56 ŞŢ+Á¸ˇč˝buS·˘ö*ä÷/?ů뤆k˝<­Ëm xÓwH#ÍđGü ;ŹÍAäë0)ÚW­ŐˬäPäa…ڍaWUŰAŔ(:Z\şóaĚčmăťe’Ż(ËĽÔUˇ[xtÔnQ97}śnÖMß)ŤôC€+žď¬µćIšᲜ^ QĂč5íÍd Ë.{“˛±ŽKgcĘÁth Xt‡Ŕf4ąşĄˇéHΉ6LŰńĆpĂNµ·Kwśr«ĄŮUť&aW¶„ĽŰ˝12|öFŔ^©bA-ŞW¶`­t.Ok»–Ú}ŰĽé»§±iřă™Đj÷z=G,ÖÍLr0’1ăe‚Ší.pćżĘI˛-«ěV’1–w ]®.űË™¶ű±Ő¨ŕĘÁî˝´oúYąéۡ[uÓwVĂî(ŕŠ6yż@FfŽ÷E)ş›.wšŤB¬űŞ Úk"ŐPS”»őŢëue÷e» Ăű­®şé;//äwĂzőR™ĂŃUr¶IŕŘ@áëIĂĂČĄÇů§ç(gŇ1G¶4ü“ŰG‹ş›ë@é>cĎÄMß&Ý ¬›ľúőŮŮÓńď]şspVn@ OJ§dň2 XŻPĐFM!ŐŽÄZŰ ŞSÉzŮă«˝Śa"”ÚŁhŐ‡kJP9j,AíŤnó |-~†Wé`4ôÂ3µlt|ńŐe/†ş[áźý87ÝôťÖOĆ?ýWG~Ü©› ŇĹÁúĐgŮ…Ľl#ÖŻőź>/=*~ýľţ—ëĂń×rë`ÝôqşX7}ŻőX'p€®RŤ¶zU BH9ŇĆŁ”č’˛‡ë< PÜ_Ćâ˙oďŽuŰ6ÂŽ,8H€čŕ±kŁö#ôM t*˛É#těSt–ň8Í& tw8‘˘íX‘„/!*ţ~!4pF€čďăéXşMß[uŞaéŻi÷;­G‹XîR¶‹v»mÄmé¶ŃĆfűą”]݇úßÇeł},CTYďë7 ëűŮݡş¬ÁâT BŰW§noîý3sęÄ‹6–±Üµ±Ľą­řÖ}ł˘+qł®Ż¨ö]©sZű˙š7őťwíró¸‰vQ·Q÷ íbSoL”MÝ‹!"˘sďŽůýśVńGĂěTéĘÇ~ĺÖv4kU»j¨¨e,}{-uřŮ2šÓú˝+±šđ×ć˙C`Á1—UÎÝŹwőiÖŔ÷QżuĂ1âý‹wÎ8Ʊłpš¦\!u0s ™ŔH&°’ ,€d ™ŔH&°’ ,€d ™ŔH&°’yŘ3Lćţ—ű©‡ŔIš¦Y­W§_/°`JëO멇ŔW\đoä!@2L`$XÉ@2L`$łpž‡ű‡U g˝˛žżľz ¸Ä)©4“śzÍ-B ÁĂýĂ0ł5ĽżNM5ÂďI`ßÜ0•5“9-·€KŚç˘VëŐj˝ObÍ$¤Ţ"°€KĽN¨ÚX_<57n9ć¶Đę$ć®Ć›2ąňşąE\âŬŻ^?,Қà Dśç‹…4~ó­ď Î!­*śá­|ó‰§S,ŕ Bęą$XÉ@2L`$ó-BŇúÓzę!O`Ŕdš¦™z|ç–­/ ‘Öke @2L`$XÉ@2L`$XÉ@˛g;ąřóĂTă€ëău¶žÖŻżý=Ő8ŕúüőŹÖ™:ÖÝO?O8€«a @˛ćééię1\ʦiţvŠlQân„˘IEND®B`‚fox1.6-1.6.57/doc/screenshots/arithmedrill-screenshot_small.png000066400000000000000000000654561326741342000245130ustar00rootroot00000000000000‰PNG  IHDR,bŐr•bKGD˙˙˙ ˝§“ pHYs ‡ Š&îůtIMEÓ0šwß IDATxśěÝ{Ç}'řoeeeWWż{Ţ 1 ˘şA=(Ó˛‚ňR'[~^xď|^´mť}qwŢőčţpÜĹ.©Ř¸‹]oxN» _lěťĂjěťăvĎŻµlŮ´D”,Ézq¦IQ„Ç 0fóčžžîęꬬ_Ý4‡g€ÁŁů ԏ꬚‘đUfv毌W߬ő­4MÓîmo}ű+ü«o5ć/ĚÝí+Ń4­w„ RD (TD)"˘@…p‡Ďi'ŇÍF_~˘Öľöĺ?=řÄžwʏxzjăSMÓ41:ţxmyÎĄÖëóîň<”g'łŇu˝f])ĄT´ĂçĚŽ`ŃŹg.śžŞ~ń÷„ŞEŻTżř{ű űoý4É8żÉOHÚ7űYMÓn§µŐĎm¶×–”·˝"=W)ą­F?4öËźzę—?őÔă‡Ć¶řóč/ývs˝ŕýř±“ßţë×_űćĂO~˛úĹßxähĽĽ{ÜwţúŢY{čŃ‹§§~ř­/Ť|"zťsöŻăÉç>¸÷Dő"Ń;˝Ŕß˙­§ôĄă˙ä˙›ďĚ}ňɱú‹ďűŇ·¶1öüç˙č–eśşĐš:uámż˙[OýÔ“c˙ŇÇƇӯź] ®\@÷tŃgîÍl÷욦]W_yĘo_šy])9zč#Ző%ř…ŇÇ)„»¶¸•!áÇźzßé׾Ľ:Ö’ËÖE÷őů™¸¸ÚęĎ”ź{č/˙ökńT€ťČČvóť.Śäąâ§>óçź˙šoţůŔ#GŁÁŕÁŃĚÁ˝iő72˙ö_ý/ź}áłżräéuęťS– ÔšÎÍŇďž\üýßzjÍUůősŃ»˙č'řä“—ăóţŻ‹ąřżűâěIýÔ“c‹5Og‡˙ńĂŃÁÄĎ~d ţęďç„ņrâ§žë¦ĚŃĂŁźúđLüő·ćţö{şđWßš{kfíúŻŢ÷ᇆŇIţSOŽť[h}˙ÜęŐżťtBüăź~dßPbn©őďţâ­§Ţ7ü»˙©ş•˙Ž4Më˘@‘ťČ‚łőŐyé®EŻ×ćĎxë+›ţĺO==řŁ/~că‹˙ͧžÂ§žúüż˙«óg7˙;ż÷˙ĺgţáĘü™_üĺ˙ö#?ýŹ7ľĹ65ý+żń™ă˙ţ_wźľńíŻüŃççŹ>˙;o|ű+§NťzüýŹŻ®ľ+ žz´ßSĘőü§íżü‘łµż˙áRôřŻľ5 :˙ç—N ÎěIEOßő‘Ë9őWúD?űÔŘwOŻüo˙Ďëç.ą›®ůÜr@2ÁŻśĺ®ĺ#Ź ěJH|řá¬iÚ $úĆ„“yäĂźěß{¨yiFş Î9gĽ>Ć[_ÍćGl'Ő=xuţĚé׾|úµ/źúŢ—76Ň·çÁ‡>đÜ㍽ňĘ+_üĐŘĘüżń™˙uÓyßéa]<=•ôfŇďű…=ž¨~ń÷Ć˙ÇĎKžłG?dŹ~€˝ňżů›żiďůĐ…ÓSŁWfâűŇöˇ±Ě‰éyÎŘÇŢ?Ô—¶¬µ< /O¸ŔĂ{sŃÓĄ5oăąŰ`ĺĘ‹‹ő¶ëŃŇš×X—ŃgŢ›í†ÝR]Ř“úŮsââä\­ŰČC{ÓĂy!Nž_{d_@­é}W˙Š/Ő<ŕ•×燲ögk‡ę»r°¦iŰÓiŐ•ôj—ćĽf Śżó-!Ŕk7•ßéü7ß]~ŕ'76ň ĎçGĽúę—ť?µńőŃ”ŚúVźřŕĐ«ógň#şo]žĂ˛ŐÚéoýŮýuĽ{2«{śaůń>üä'~ň“†a¤ň#3v˝%˙ň›s?8_Ăp­)ë-yęíĆęzŔ©·?ś«·;Áb­Uoú+ëťhęÔŰŤŐFge˝sęíĆĆ_žžŹqÖôüoĽąŘńĹš×lË3óëŃ»'¦/R6ÚňKß>ďÉ {a+ŤNŁĺ˙çoÎÍ.4ăJĆŐ§űÚ «®3ßś©ź™×1š¦mC0T¤:nsUúŢĐžżÓĂ0Ý7L!HşŃꆴńĆŹćţú‹ţę+Żľqr®oĎŤoťľŘÚűĐŁŃ®Ěa˙âŹĎĎ_Ű´‚áâé© §^ű‰đ_zffçZMÓzBĄüůR‘´ăié6<·©%„íµ]ŐiRÜ8°¶+;8Ö\Yŕ¤ç¦ű÷6ëKÝ÷Ňý{Óý{—×%°tý4M»/˝łp”(T^Ëí =·ID`ś|óů­a&G4‡%˝Vů'RďuĽ¦iÚ]SůÚ:®ţ–PÓ4힥KÓ´žqí˝/Ď}öXůŘĆWĘĺň{¶ŐýTtpĄRé~öŮŁĎľtâĄ[˝XMÓîo×ݬ…N7&&&ŠĹbµZťśśĽAsѧŞÓŐĘń €b±xĽrĽT,E/KĹť˝zMÓî+× ¬JĄM¤:]-‹Őé÷ŘĹŇíU‹ďdS”S:­4M»EďŃĂşń+×űT[Őjuclé–¦i·Č<úKż˝ş4_ÚŰôF©tą{U*–†‡‡ź{îą_|1z|ćŞŐjµZ-—ËŐjőĎ}bxxxhx¨T*EťµVÓ4ízŞçĄ×¬_هŤű˘^ŇĆ^ŐŤűGG‹Őéj÷z<¨iÚNąF`Kśȗ›ű”¦iÚÖéuXš¦ő Xš¦ő Xš¦őŚËsXSSSŮ\öî^Цi7pôČљٙ™Ů™»}!wÁĄ'€ut+›ËĆ wő’4MŰ’űđźj6›ÎC 5Më!:°4Më:°4Më×ŢKXÍ榳z^Óî¦ňÖć×sŮ\v×ýk˝Ţw ׬élöxáľ›ŘÓ´{ĘëěěŮz˝~»/ć»Ţ ×­Ö iZOČesąlîn_Ţç°4Më:°4Më:°4Më:°4Më:°4Mëú[BMŰU¶¸Ó0Zč´Ĺ5\őz˝VŻm·ńŰA–¦í6ď™3ł3QôdłŮ­„K÷řm5~;č!ˇ¦i=C–¦i=C–¦i=CĎaiÚ®Uť®VŽWŠĹâVî‚ `bb˘X,V«ŐÉÉÉ-6 |¬|ÇîĄ{Xš¶kKĹŤw_O“““Ń=Ź·ŘxůŘ–rpéŔŇ4í˛¨Ó´•îU$ Äéęôm˝ŞŤôPÓ´Ë&&&^:ńŇŢxł÷;F–¦íf[â8V>V©TleΫX*ný໢‡„š¶kU§«ÓŐééęt”,ŰúŕÖŹŮnă·B÷°4m×*–ŠŰúţn[}Ąí6ľ#tKÓ´žˇKÓ´žˇ‡„š¶«lëvöőz}+w+:l«ńŰA–¦í6[/–P«×¶[YáöUbŘ =$Ô4­gč–¦í*‡®×Ţă6…7]o[Ťß:°4mW©×Ţ{Zj[ů6żÝĆwśjšÖ3t`išÖ3ôPÓvąhÍVVĄG[y°ĺ%ďz/ˇ¦i;)ŞłĹ 0•ă•R±´­´*Kw˛l,MŰͦ«Ó[Żá·šŘâńŐjuş:}'węŔŇ´]+ęU«Őju«ť rąĽőS…şZ¦i; Üm=PŞŐjĄRŮbŹ©T,ukşßôn—îaiÚ®Uť®n«űőŠĹâ;YŢ.‘¬iÚŃő°4MÓîXš¦ő =$Ô´]e+%®ęµ:Ć/?ŢV}«í6ľăt`iÚ®˛ĄWă—˙s»•·Őří ‡„š¦ő ÝĂŇ´]e[%®rŮ\·üń Ütý¬§KÓv›­—¬ĘfłŰއµ­Ćo=$Ô4­gčŔŇ4­gčŔŇ4­gč9,M۵˘‚|ŐjµX,neŰÍÄÄD±X¬V«“““[iĽ»ůůŽíŃŃĄi»V´ÝďŮŁĎn%€¶«[iëN–ÄŇCBMŰÍ*•ʱň±-\ť®n˝VÔeŰzĄ­ˇKÓvłjµZ*–nKËÓŐR±´őr¦;B–¦ífĹâ6ŠŔLNNV*•-Ž‹Ąâ¶îX±#t`ő˛W^Á3ĎŔ0.˙ůěgw¦ŮĎ~öť6źyŻĽ˛3Íjw\4¸«T*[,ăP4SżĹơK$k[ru”Ľđ^x/żŚ#Gn˛Í(7˝ňĘ+8r/ż|“mjwŹ.ŕ§Ý˘ą¦M‰ł-×룽ňĘŽuß4íčŔęMăăĺ—†ďęU]/\>űŮË®ic9‚0|WŻę…nţj5m‡č!aoŠâé•Wđ —żü2 ă=>Ő ťçźżîŃ1QT9ňÎ+ZŹ™ťŮz±„­äĐ­č°­ĆoX˝éůçŻ:7íČ9˛óÍjwÜÖ‹%l© ßÍ6~;č!ánŃťşÚÁЉzp=é®Ýt«÷müjoÓjă·Ý§vĎ;|řp˝Vżń1Ý‚|=GVď{őŐwoŠ•Ď~öÚ3Pg»^xáÚ·q^ëőÚ{OKÝÖ{·•¬Ţ÷ôÓ—Siă”ů­§LÔTôŐaôGŹ µ»MVď‹&Ë#QĘ<ó ÂđV›Ťş]Ď?ą;-ĹŇSňÚ]Ą'Ýw‘Ťi-¶zţy„á;ş6ľřžÔTęő ˝¦»ifë»sîq:°zSÔßŮńŐçQ›zóŕ®P©TŽWŽăݱuWŻhč!aÚ8•ţôÓďŚo1hş3ńǷެv—”Ëĺ(°vÝĂęA›†~Q lÚîw“MÝÜŘÔĆ—jw›îaő¦#GŢÉ©«{@×K–'ÎÓOżëČ«Ö3T,u‹ŻßíkąU:°zÓË/_·RŐ ÖŽŢ8q˘2×+ö ×4ô —NĽ=¸óĹ×o=$ěY/żĽy˝U”8·’,Q‘†M}«^Ř\ Bë)ĹR±|ĹÝľ–[Ą{X˝lÓěřNą;«5m'č–¦i=C÷°4mWŮJ‰«z­Žń;r5;M–¦í*[*q5~'®ävĐCBMÓz†,MÓz†,MÓz†,MÓz†,MÓz†,MÓz†,MÓz†,MÓz†,MÓz†,MÓz†,MÓz†ŢK¨i»ÁVnřĽuőzýs˙ćsĺryď·ÚmóVŃĄi»ÁVnřĽu›Ú©fw¤=$Ô4­gčŔŇ4­gč!ˇ¦íZŃ(,›Í油™Ů™kNHŐę5ąlnëÍV§«ÓŐiĺrą:]pÇîmˇ{Xš¶;E uôČŃ©©)333jőÚĚěL­^‹ţĚĚÎĚÎĚÖëŰ›­źćÎ+•Jĺx%ş‡XĄR‰î,]©TŞÓŐ(Čvś,MŰť ă…Z˝ö§ö§Gź9u > ŕ~ţ˘›šš*Ś>\/l«‡599911 \.‹Ĺb±E€JĄÝn::`ÇéŔŇ´Ý)ëŤĆOĽ|"zĄ^«ĎÎĚFi•Ëć˘ ‹†ŤŃÁ[4]ťžśś¬V«ÝśÚäöŤu`iÚ®UŻ×ëőzˇP¦±^›~-›ËÖ굍9•Íf·»ŕ UĄb©T,U«ŐčĹjµZ*–T*•Ű”YzŇ]Óv§z˝ĺ€×¦_‹†~ŃÄÖţńýŮlŔĚěL.›Ű?ľ[îdU§«Ń}¤‹Ĺâtuş\.O–&7sűîŘŞKÓv§'JOD© €ÂĚěLÔ“şz ¸­ń`±TĽqďéXůŘÍ\îÖčŔŇ´Ý)úđÎź÷öuŻ ç°4Më!ş‡Ąi»Á ź}avfv/ŚxĺŐWľđ‡_ŘŮ6o…,MŰ nÓ@lßľ}Ďżđüíhůćč!ˇ¦i=C–¦i=C–¦i=C–¦i=C–¦i=C–¦i=C–¦i=C–¦i=C–¦í6ŐéęÄÄDĄRŮTEďŮŁĎ^ď#ߊ>}ĎsEĽ^a¬îőT*•gŹ>»Ĺ6o@Żt×´Ý)*MUť®F%ŚËÇĘ›žVŽWŠĹbµZíľŐ-ĂP,ŁĄóÝČ‹JĘDŞŐꦯ/KÝ–'&&Ž•ŹU«ŐÉÉI\)đpĽrĽ\.W*•¨(ÍłGźŤŽŮt1ŃG®G–¦í6ĹRq˛4ą©{Ý6"ú;zPť~W:l,•č+KŐéęK'^zöčł«|¬}Ľ8Yě~pş:Ó˝?Ĺ5;tÝף*4ÝŹDe¶Ţł˙Ą‡„š¶ŰD÷śśĽ|K›b±|¬u¸®~ÚÍm ‹¨‡%ŃĆףQ÷&Wp+Ž•ŹE˝­n‘rąüžµ´ĚŁżôŰ«Kóű2îĆ*ôŐl®šŰFQzMÓv\ůÝ•‹sŮ\Tňř=oQ*•˘‚ĹĺrůąO1<<üÜsĎ˝řâ‹ĺryqa1:`hx(jW¶a—JĄîß/¬{yĎ=÷\µZŤÎX.—7^ĚŐ?Q.›{ĺőEŻY7ţĹź?őćk[ŢxϲĘxáxá·0Ó4íŽyéĘÍ#"QăëÝ^đ¶zöčł/ťxi§Z›(+K—ﵳ•:…ń ˙áőúü¬žĂŇ4í=ě`ZčNśÝDIXšÖóffgŽá8€cżzěÎ÷żî$=é®i˝mfvćó˙öóĎżđüó/<˙ŐWżş1°˘{;G·zŢJS'^>±­;ŞŢʧnŽîaiZo;ţ…ă×dMMM}fâ3SSSŃM dłŮŮ™ŮńÂx÷ďl.[ŻŐ±ˇ~qt[ť«Ź/ŚG7µĎfłSSS…Bˇ^«w?555uřđáčďŰ÷Ăę–¦ífQ˝6ýZÔóĘesµzí‰ŇÝżŁ»ŐŹĆŁ^RÔ«×ęW˝ŕ~ţ˘·dłŮńÂx”V·µ·ĄKÓz۱_=v˝ť1ŃžkőZ[×33;uť"…ńBtű«ŹÜřÖĆ6Łőă…ńďţfsÇé!ˇ¦ő¶Âxá董ݧď;řđá¨gtô׏žxůDÔ™ŠúPŃŔ-ú»0^¨ŐkŃ[…ńB4x<|řđĆc˘G_ď­¨źţµOoĚľ§×aiÚ=ęάú+ »¶KŻĂŇ´ÝăV–5Üűiµ‘žĂŇ´Ţvăe '^>Ń]Ó°q}C4ŮÔťäęΩßătKÓz[´¬ajj W-kť™ýĚÄgţôĎţŃĽx­^/LMMu×"śť=ÍťgłŮłłgggfŁĄ ×:ÜSA¦{Xš¶kE=¬™™™\6W/dsŮčĹh-€\6—Íe ă…hOu4é~őZ‡{‡,MëmѲ†î7w]3ł3Gź9úDé‰Ă‡GŔîB„«żČ»ćş‡Űú}ßÍŃCBMëm×[ÖÍfŁ/|ú×>ýÚôkŃŇ„îZ„\6—Í^îsußš™ťůôŻ}:úę0ęjÍĽ»ĘÍÝĄKÓzŢ53%šPď>wŃhŠ=škŹčľŐm-zzOĄt`iÚ. «5hšÖn°¬!úępSµ†ŤO·RČážZ÷ {XšÖŰnP­@­^ËfłO”žř?ü_üů_ü“?ű“Ç×ëőËծ̵ĎÎĚF‘-kŘXážZ÷píŔ*ĎΔﱱ«¦iŰÍŻw7$GSěąl.—ÍŐ˛µ\6WĎŐŁiől.űëżţëł3łggĎÖęµĂŮËE˘Ń1…ńÂT}Ş0^8ńň‰Ă‡cwľŰĄ‡„šÖŰnP­!*­W(.×W¸˛LaSy†î‚Ň?ůł?9úĚ;_8Öęµh·3î™u×îaU*•ă•ăwřR4MŰh‹•ÔßłZæ" ąl®p¤­rŔ†5 3ł3Ńp/* svölw„xď¬{ĐsXšÖó®ÝńZTttăj†\6MÉo\ĘĐ=ľ;ÖŰtĚ]_÷ KÓzž^Ö iZo¸Á˛†îí!®ą˛ášëŢsCÔćÝZĺ KÓzŰŤ—5śť= Ú˙e͉—OdłŮ\6WŻŐŁYółłgOĽ|bfv¦;Ść­şw܉^Ź^ŚšÝtŔĆŹßV:°4m7«×ëµz­pĄ€pwe€Ťupĺ¦;h…ńBaĽmźŽş]Ý[Ntč¶vőÇoXšÖŰn°¬ŔĄ'˘…TŃÓÔi¸f˙(ZŮpâĺ—;\s5ĂŤďs±Sô¤»¦ő¶/k–ąźť=u”pť: rŮ\w˝B÷–ŃĘŃr‡z˝ľéžWßŘâ¶ŇĄi=ďË6l¸^ťŮlvÓz…îʆMˢż7pgV9č!ˇ¦i8úĚŃ{­’Ě5éŔŇ4­gčŔŇ4­gčŔŇ4­gčŔŇ4­gčŔŇ4­gčŔŇ4­gčuXš¶kU§«ŠĄây¦«Ó¸Ö~Ć<Ł,M۵˘‰B!ÚľS.—+•Ją\Žň":¦T,m<ňćLLLĽtâĄJĄť¨T,E vĎ%Z©XęľxgÔCBMŰýşQ©TŞŐjuşZ9^011Q.—'&&ný“““Q;ĺr9ŞW<11±ńĽÝsE/V«Ő›8‹,M»/DQ*–ĘÇĘQZu{^ÇĘÇn˝ýéęôäädµZŤň¨ŰuęžwÓąŠĹ›éÍéŔҴݬ› ¸’Q””Ź•»Źo®łs˝uł©X*FŹ7ž·Z­–ŠĄjµzs'ŐsXš¶k]oţ»[đŻűŕÖmjŞ{ęÉŇ䦛o‹îaiš¶ĂvdŚyM:°4MŰa[\Ůpt`išÖ3t`išÖ3ô¤»¦ő¶?üžź=[OQ,űźţvtŹśčwćtWżĄKÓnŢQ1ŔŔzĆ`˘·.c6@WŻf€ŮŘ+!]ď,7v~öüó/<ż? pĺF8ŐëőĎý›ĎuźŽĆoßŐ{ŇĄi7Ź€˝`‡ đÁ Y @H¶„Ä đ0ŔBŔ˘żŻČP„!s |ěofB:wÇhżNô8ęÚLMMŤĆŻW¦˝»pă†lŘQ­Ŕęľuë{#:°4m{>n0€Řĺ~Ţg0$ Ć@d0â„f2fQ2Ć Š…ÜŽ“eÁN‘RP:.,ĆÚ’Ś--“GřŔÖ öÝÉúę•JĺxĺřĆ~S­^Ëć˛Ý[níě)‹ĹR1ÚBřěŃg_:ń€béň‹Ąb©űÖääd÷řn ›önÚlx˝KŐĄiŰóŘ•ţT€É1 B‚!(·H›Čő1ŰP–â $XŢfŇc$Čv )IЎSß„$¸u´ŰX­ăźĚ5ŢűJvJw÷€W^}ĺ ř…MŚĆ7>-–ŠĹęu3ĺęÎÔŐÇOLLLNNNW§Łî®„f´}Z–¦í€#{ćJ*p° –´(™` A"ÍRýp˛HšŽT|SO1Ř©vŰIv”ĺ0H„ä×™ )žŹV,Î “:«TźÇąĚŻŢä”Ö­ţŚO9ňô‘ŤŻlšĂzOÓŐé÷Ü'ř҉—˘ťŇĹb±Z­‹ĹR±tÇń^k¸t`iÚ{+ěiŕŕ•žT,„c Řś$e2°S”E> ‹ 5’†ty–c˝ş 1@!îÄ8€‹§Đ‚VÁc ëh­’0×–vŚ‘OůQd‡ĹAOľq—~ؙٙZ˝ÝmđđáĂ7ľýW4¦‹úDŃŔ0ę(mzk“‰‰‰(Şşű »ĂĂjµz C:°4íş ű ŕ€ÁH€qi0$ –ä4gé<2Č÷‘3íŰ«rń,§şgí g¸i›YąŚ)ĺó9dŇĚőĚU!3‰ŔÉk@‚ě kÄbLšÄ %2wô'Ť"¦+ŠŞkN`EŢŮ*¸!\˘FşMm|kSżiă[×Ülx=:°4íÚţc!®ôŞâ!ŮDHI¤T?FÇ);‚t?(ά}čömÁXĚżŽš‹ľ|,ďtÚŇXA`#"Î,ĺúÉ$řĚ“”OÍ&KÇÉmr騽ÚltLłłďĘO˝•9¬»H–¦mV0Ř1!úľ°\ů6Đć44Ęƨ˙Ƹ˘LŇzěť2/ť1[KZ•V&IsˡŻbÄČ`,Î̸ ¦ .Đ‘ Î}""·Éd@MÎä6Ű!©úÂňŐbËŰâŐ~îsźËfł;öłŹ6Íamz÷董;u®› KÓŢqe qeUĚő­ś’)ęe#ű•ťcÜ&6Ľ×Üó(˘ Ż&©.¸rUePmŔÎÚíŽd-2áw¤•NŁ­ÔÂ2ą\!Äx:ËEMWÜâÍš‚Źt‚IŹćý?ů‘-^s­^«Ők·őײŃÝ˝Ł˝,M®DŐAŕ€e0űJKŚ›”L°ľ~ Ť!;F,kłĽµw´ÎŁÝdľËcž˛’`Ü$¸ˇĚˇ$[kÄŇv€É©â&CH°9äŐĄňČéIXInXh,¨ˇ=lýükżŰż”{Ź,MCÁ`żb€‡ŕ€¸Ü«"Ç!LA™<|€RYä‡ÁÇč ëëó;ŇZ_‚¬ű.łFúŰu—-ą,ÁŮă5Éćvpj•;hÇ™Ş7SIŢjzÂćŔAJyKÄă<“˛×Ąë8 ä“GP.ë4XJmuHx_ŃĄÝ× Űę–µ& ĄK?],í>uÄ`Ďďž±â f$,–ĘŔN!˙úÉv¤ŘYžf0ś¶l f»Üőâ}ÜLS»AŠkÇť6ăJ6m,¤™Ń ›K©Ľ˛K!ci‡ &|ĎS yĆxRÖ\a(oľ™4°ľ&S9ĺŻsŮF"µŐÖÔÔT6·cßŢ#Ž9ŞËËhÚe3đ4`ńŘđť Ă@DI‚S:ÍsC*y0ŚěSn-–Jujó¦Ń„ë™™´ă(’¨]đś„Íä:ĽĄUć¨'Űy‡{ĺÜZŞoXđĐ&ף)—â>šu™Ůź¶ĺgŇjąŽéĽő¦u Dżh5Ő–l.{uMÝJ–v?‹úSüň+p€ ĆA\°xŠŇY62JɇylŔA2• î$wëŚsNĽ}îí¸c“_wrIÖ‘Ę&ÇNś×/É•.çö "¦b ’éöŦx0éĄf ˇ­l–#?‘VőU¶âĆ H'}W!Öä°MĆ[ëRŘ”čOŢí_Ň˝H–v?:`€‡_YcĹB€l V‚Ňy–éŁě° ű‰Q†5 í†i‰vŘžýčBkˇiŹ9Xă°ĎçÝ3««u7?`#ŕKŻ-Ř} u0ÉČ ďt“{ÔvKHąîqŰVÖ*K$Ů\c­é:I·á#;$,5ÎŠŹµľóĆ.ąxňn˙šî=:°´űÄĺc ›3.słI¤Đ·‡˛ĂĚ| ‰ˇ÷[É~j]đ-›YvHĆ,Ńľx2ÎAˇe{o7řŁK«Ĺž˝LÄś<ë,§ö÷ŻM­J¦řO;Ţ9—sEia»Jr&ć]eK2(7$(%úBŮqV=g\­ź¬28lŔ6B÷n˙’îE:°´űKÁ`…ŕś8HP&prâĚNQ˙^aÎrĽÝ×ÖĄ7)ľĎâ˘Sżd.ąń!;ł¸śo&E€ˇP«»˛Áś<ę ýCvűŇĄĚ>Ž€ĂbC ¦Í/0úÍpK"ă´.ą,!ϨCJ„h’Ň J˝ëôW§Úýeđ´`l€LČ8<™ĹŔ롡,~¨ßÉw†?/ý÷,˙„‘ŤQٵ˛ënů–%ĹË;žÁ(I†ß'»"ÉŔ)˝?i9ĹÖWAڇvżÚű€•l€ä8 Ăi+×oŕď;{ř1 ,–˛ą-ÚóJÄ«AłŃÔyu-:°´ű !€ŕ”HC¤•ťĆžq6xŰĹ,ţź}„?ôsX:«˙ý‡‚Kóvč)÷˘ŘĂIÁ[„p IÎTű’äq›§2Ѭ‘đd«!ă–í.J_"t VTűŃŁń|¶€RŢŠZ˙Qł}QRu¦öµ*\Ď·AľrW=ůvłc9‘̉[ů«ÓŐJĄUޢŰwđŇCBíţň"02¶ g©±4a,k ľ¦`™sř Ţţ;ßXP±ÇDŇ1%“ô[ˬ_8®ô3›YÄ&#ŘNpúE«Áx›u|™ŔFśÔ™O:Îް‡CÖâ<[ňĐ$•·cÉÖWíüL6ć6p¨źŐVc!`z¨Q§-oĺÇŚę©G™U*–®. ˝ *RUIŽ^ąfťő¨ŮîăM5ŕďXÚý…•cż•k»zH¨ÝG c7ŔŰ`6G,ƸE}},‘eČf‘˛R¶•+ đc±ěËzŕBľ8<ž4łc±˝hôPĐrIş<äL(S¤¤lňCÓĹ²Â_ŻÇB޵Ćúĺ÷e39˛ó”I§Y~@îĚy ďŤ`ßÇbżřĎĄ•7[ ö`ż•u¬¤hŐ]317óv˝Ą›ÓŐéÉÉÉjµÚM˘«;D“““Qťb\ą+×ŐĺŚ7¶p¬|,jäÖďÖuÓt`i÷‘}b!Ŕ@ĚŹăŕq†- łÎňô—(Ö‡ÁřŮÇ̡}|˙ŹÁ$Ń÷Azŕ±ç#lhuĽVKBµ¶ËR|$¤K0ËGkI®żµj÷e©oČO8vJtÖ±… vő-€+ďŰ˙ţę…\ĘĂş´Ö.#Žźpq»}öMJ;l`0켕ź´4Ý‘`të­nőč°čA”Y˘ěWV,»ÇtŚw…j÷‘§ f˘ď…¸Ă’dňÄR„„$QňAJîŤĺ÷!‘E’ß°|7`}č{\]řf,ĎZA2aÖ0ü¸ď‰ü}ďKţ )ÎůYą4™ü¦Í`Ą¸ŻČš;·žJ;;_ö/\bÄŚÜ“éó†D>m®7üÂŹ[^1»Í±BŐÖüĄKXV(ÝüOz͢éwď±é•M‡]]g=jůnÝüY–vż(Ś…Í^1‚cĂNR2‹Ä03FČ|č`ÇČÁ“±¬1ăĚěGfT:˘˝HŽ­%ł˙ rúcc¬Ó穯 !™§ä˛B+›&kÔR.É8 —.9#¨łŇQ*6ślDZÖ9uFA©CŮX†f¦‚ţ~DM… tVWÝ%×öôčçt`i÷‹}7`0Ŕ⌬s2`Űw fܶĽ%đ”™L#D 8|ßL@d‚ľGć?ÝZJdF©ţ­×bĂ‚eőµűIĐIjs~ľ)K°Ó–Ď}»ă™HĹ2ŕMŮ8'bIĂt:‰¤@Ľ­:±¤„HäU0{úcĂűüK5kLqŽÁkŮ«R ]ëtŠ_›ŕçÎÝľ m‡© —{X­q7IqP,m橹„"°ó`şx>LE3ĚŮ÷pbôăČ ýŚ•î dĂcŚĄó‰‡>„Xö xŚć%° )RĂŁ87çŻÖă+®JöůqĐš˘ ó\^b)NL`ä1y¨řHgäV27=Ł81I<ˇś[Z†µkÝŹ=,;–d––pRC¶Ĺ„HÂ`,ŹsÁL"Hf€ ÁHQ¬űm3 ¶§Č—ng]v:Rv”ďQ ‰@¤niÉŚvÇp PdŰ`"N<Ćâ9 žKa˙Gag :¬ÁŠ 3“0âHf[s?`‹gY{"›čw:žÇĄ@ß°µ¶ÜI§ŮÁ}±Ü(¤2%aý´źaHg;äĹľ˙F@ŚĹąUKq¸ž™p‚•sńˇľöëoĹyŇďßg-˝…‹s±~á›d=ü j wű·u/ş_‹›Â‰9ÉÜp:Ó—rl.2‰„`B0Ι Ćbśq‚‘bˇĂRčp0|Rc€ôë ŽGĺ­·<é6”ŰňšhűÍzí‚×iJ©7¬Ţ»fB’`j·ŕ&1;F03"řëľ™62ÓC¬?€¤ÔX,‘CHŁŕ±Ä@ÉWnŔöPlÄĚďăł!ĚŃRŰšáĂ#´Ň!O¶±ßţ†__µ¨Ń±MźA™’]8‡Áµą‹Ś Źđ$ÇŇ"ż|Ńl,·ß÷±ř^ŕÍďdíp5îë!á5ěňŔbŚŰv~ppphĎţ\*ésÄb‚cśś§f[InxŕN*Ž0ä&lbfLÁČČŔ0&±ĐR!ÖHyž„ň[FTDµÖrsqeîěÉŐýŹ÷śs3XRă&Ą’,.0 „ ,cńHQ‹á2žµěŔaB ™bCŹš‰4Śdŕ5ĽsŻŮ™Ž9(ŢaĹjo µh.Ď™†ňßśłF˛(ü8’§„Ah7M·ÉŽţŞe Ľů˙Şĺf§¦bcõ%ö@´ÖÖ~ô_¤Ä~–\oÜR`E+Ô±ťŻó*•ĘŽ÷Wť®â†ë¶¶{Ň]XĚůÁá±=úú†„Ĺ9r”-ln‚łD2–q‹ˇŁÔş×ixíPzë ®K$I¦XhqËŕ1‘Á ЇŚ,€)Á„°ÁâB;L'ęó3Ţž›9ŞŮrÝVC)=BĽW…dŕ! .,Ćm†lą!ß÷¬ÔŇßäĚjZ,Ś…ĘW“™LµËP»e&÷‚Y ŽiÁ>ôqóÂ×ĂDÎÜ˙sÁň)cĎĘÁ©˙?)Ď˝*ć›~n*€©ŕ»¦ătúŢ»ô˝öĹy¶ęĆ*4ŮĘÔE›X‚g¦ě‹Ô\c‰† Ňv¦ąó[s˘·˘…TŃî\ŮŰłŰ& Í(°®ąÝ'Ú´ő•¨»3°’©üŕŢŁ…±”‘„€0mn a™Ěv'c“ßt› çkîZŁ%·DB8ýC#ýű„“ŕB¤ÓŽ`ÜIEg‚ŁŢşďRGĘ@6›í¶×X­/ľńÝďuZµŐµĺŐŐeÂJ2SŘ–ÍL€›DÄD)ßŐYvwEkÜa0„Dc °m$‡ÉexŕÇa1řfó\๦ó!D!,Î:+slőfî€ß\‰=đ`‘Á5@Ćąď„©$jsćě_¤ř#źŔú“Á—áůfż vÓŠV¦p+7ÂWN·/,PÝ#_@ ‹ś!×gÉ7[“j"Ž•KŞ/ĺtní*·ćDńôěŃg'''+Ç+e”7®_ʶéÜîÝ6Wźnş:}ëćw[`1Sô=đđ#O8IDŚ [dŰIeĚoťüÁwk«M‚Ý÷ŘűŹÜ“Ng( ‰nJĆ1“s %cś†Lž IžĂŤ7«Ż˝ńŤ7ÎśzCś ‘L ŰqÇNô%¶ťŽ;ń´bRu<„@)‰T`ífCzŇm®{í¦×^˝Űż­űË!@H2„'‰Ŕgh{‹ ÁéCŔ tĐľ„Ú"„ŤÄ>$`F o†`ś°REţqĆ3YŢ˙±źŁÚ9¬˝ţĄĂ öÄW7ÎsţĐ1©L‡;C1oĄ˝´¨ľ~ž­®#™!»-E^…ąŠś&7XYľrIö(ŻLÉr;°5gbb˘R©tă©X*â8*Ç+ĺcĺéętµZ-‹Ąbé8ŽßÉÝ6/ťxibbâć>»«‹s±gߡ‡yś3Ć…ÍM!â)›Ű‰ĚÚúúÉéż_YnŽíÝ˙äGŹ<ôиă$Ŕ =„$ŔHÄM2FA›|’P `ÄČ Ł``&k,Ď~éĄW^űŢw]·‘iŰé©ln(egŇ6O&â‚ EJ¶:®™u…Ě—ŠHÉ@Ą3nÓĽöz«î6+ŇóX¨˝ŔÇlĺKŠóţá-J’,ÖÇň¶`¦0Ť ¸µ9¬ [s˘]5ĹR±:]-+WŽW˘xęîżą­»mşW]FůX9ęúuŻj[ÓX»*°ö Žď/b¤l;-,Á­T2™OÚćüąó3gO‹xňcOýôÁÇ%ÓB@Čx ¬# ňá{MP“ RH€)ĺ2Ă–ĘĄ XŻ×ľţŐŻť>9íJĹbNşthx,ž´íLR8L'†$٦ĎydžAČu â۲‰¤í8NÖËąyéI€…JÖ—ëőÚśçéďo§Ë+° xäű Z„ć˘s¨5řľ5ô0Vgá-#ďógż!‚jüŚxĚEűě_ŠÇ)=h¶ć:?8Áć˙N=ř3¦Iíő3ܦÉëLAY>óâű~ě›ü‡oůsžŰXáĚ$jÉÚD ,Ĺc>uÖĄ•Őmfy­¶´ó—–k«*=zK ±®·5§űt㦜čÁíŘmsÍ6ßµUh›CŃÝX¶“ß˙hɶ…“Nŕ"žÍfăaüäkż´°z xřČŹÂNszâŚIĺů˛C<ô(`^»AŞăµ[R)ĄB‰Ŕ T‡(”đY«]˙Ú«ßX_ťo(•>Í:¶#b1·EŚ‘ďöY‚ R¶X[ˇ°Čç Ň'"…¶źRŞ­—- | Ý4Sn{î[Â’˘ąú^lč\ü®ŹLěKÄbť¶‡‘\đ˙–ťüеxŞ“µÁŕ0Ţúł`eľ'‚jµ•¶–¨˙ŃŘĹ7;‰l÷»ÎŹ@~˙{«Óuc‚C’Ž“&E–' ć“úČŰ`##v0Gk$; gš‚ĆÝţmÝ‹vK`ŮvޱUGňXŠÇd:Ö'ö˝S§ciçé#ź°ś)nó>&•T-’ŚyťFmµáąmRjmőâOž©-Í+éJ‚OڍÍBH_5$q”Ęó˝t~lěŃCŁ{“ą¸ĂŰćĚBBp 7™#ŔXL±Ž}[)CňP´Üó<%ĄôŰśŔŹ‹$ŠbĽŁŮŽ ‰|"fqŰ&n°Őúâţ=çú3íľÜđ‡Ż7OÍľunćGŤµKJ5ďöoş·Í„QHd@)Z÷XÎ'j_2 ÍÂaś\A{‰ň?k¶Ď(WÄČ‹-|ÓOî‘_˙]»vVX©Nf(ţˇ_ŽMýˇßjĆ»ă¤ÁÇŘŹćçľŮ<ůFF0ůÝ…vž#ť6Ąoץ÷5‘ĘB žíCłîĄö€ů¬C¤B¦f—3CŮ•“3}ű[îB±L_gn«w~ľŻě’Ŕrâ ŚÔKäDś­śo5Ö—>đÔÇ„ Ů‘ĽĂĄ$IĄd«±Rk(Ů–^ó­·ŢZ\XnÖϵ@ śI)UH˛#)ŃđA*™Ď Ź8Îĺ’ŽÍ Š[Âá–0})'ź[–ť“+´1f Ű28Ođ¶ďŞŞăIżŁ ŔLF!ĹÁ}CŞ€s0ĉSŞIíŮ™Óä«á±ŃˇÁ$凲}ůÂţÎĎśţŃňňyĄôîĹ›tDkÖC°€ŕ3r©Óáq.ę`uÍý–q!î.űkç±˙'äÜ׌‹'­ć 4¤Iäs'Ocy†:ž ”Vh&N~ÉßűáX*ÎćĎ)'ŰäQ§ćÂ50¬â9çQ«ęÜwÜô0ă)ú IĆK0ßCgeŐ•?·_'–~fo¬ÜÍßÔ˝j—,Î@ 6797YÜHĎ.źeLŚí/ `J1a‚1xmE¤€Ö܆”ë03sňÂą“-·Ą(đ ‰)’pÝ&…đ:ďtg’éÁˇńÂĐŢ˝ý#¶±Ü†`Śqa ĄŠ1Á8WLrprF ¤-8ă&3mP1ŃęHĺ{JA>…©¶°Q*„1+ .‰/×—W.-^Ř3"’¬ż/3ĐżçÜěÉ s3őµKzßâÍ‘ˇŚË•7„cšť`}ĆJ s’ľ˙ÇÖŢĂ­Öbâü7VÍŻKô§Ű3őxÎS‹g‚äŐwČ_~Ëzßűíxľsöďb«ŻućĄ:§Ňă&çq&ßnđ87’lĺT=ąO:–ă©e‘ ÁMa&Xł•ˇ¨#Éób9X¦X9'ˇX2G–Akçßľ•;?w—•ďŘ/î6ŘXu‹Ů-Eľ‚° ÁŚŠ qžËfÁŔ¤ävR…MEm „×^ö”˘óĎť<ő–ô=W…d@)EŤŐMK˘)ú÷ŚőďÝ—ČK$’ n3ŽĂX´[†˛LJÄr»LpÄH )Éą@X”´ŇďČ8cmĄLŔČs‰›s˲}<†?úäw«ßúĆ×ţö‘Çé)žî:pčđą3?|IëuÓ&şxÎĚ ™‹+đ=öýżm/]ŠćMÎ;É,L·Íłp]H—#‘ň.ĚđD;Ţ7ŕźżK$ŇśŮJ*Ů<+ąÇTÔy"4ËMf3žD<Ő†T€¤K,fuščŘh¬zC˘SWtÉkżüM–Ľůźqă˛ň{6łŞÓŐjµzź.kíP%M$#EĚâ‚1pÓ!Z{EëH¦ÚmĄšoĎťîHŐ”-î’B˝ąJW-ŕĚć‡öR™ĽmŰ\pn3[0"“ źĹ9ó8wŔ)Âc``ŕn1ś1Ą ‰ŮńtH*đą!WY ľ"˘T#Ą2˛Đl®Í7/ýÉŹ6ꇿ?uęäëg‡‡2ŁŁéőwŇŢ3wqćÜ™·5[Űp>Ä@°C"†ŁF÷™IN¶ă7›áʇŤ• >'´ Ú|Ő :ŇŠ§®çżţKÚÁž=ń$ókgÔ‚B]q‡QBY{˛1ć‹«¦çµ¤ă]tyŔ8”ÜëHŮdÁâµ%•±(!cl;ťn`™d{ OÉ]ňOóFŠĹâÄÄDůXůľëa5›k ’)0«ŤPŔN2Ăç Ď#ś € ©|—B¬5›ëk-×[猻ä‘Édŕ]ťVB$ÓC#ą|ŢÉÇť„Źó´•T†äÉâ‚sE`6g)0Á,â©@‚2Čć&ŕ+pÎŔHJ&é–ëű’03ą X"f·ÉSF'“J1`nţ\:-F†ö}ôé‘ĹůĄďM}kyý­ţÁŃţÁ>Áíl~hdpäÔľ3ż¸čµëwĺ7ß“ 2@’I&śľ Scń‘x\Á`ľ„Ő_଍xδ–¬¤¤ÚŠďëGŁ+o=¸/¸¸hžťU1É—Y‡=J âŃOÂNš+?lżńU{pŘŢ[Ç…ş»;!¬4†>ôčü÷~ Z’KX1ęH/Öźí¬4ŃňŘřĸýpJ-ť˘P k—üŰĽîŤď»ŔňÚőĄ‹—††öPŔ””*đŇů´Âz»YŮ} AŚsĆ…oŇ"…ś[P®ďągÜ qFJ5ÖŻ±ąOÄłŁc¸Íma3R<“‚ă8cĚ10ŽA Ă&Iapa‡BŇö•)źŔy´®† ˇ”âÉ“RJ˛C,TŽ#dH\šg¶J(OĹ-®TňÜÜÜ@.)ŚÜččŔČČO_šźűĆ׿GtöĐáGĄJĄ–ďďźżpéŤęß7ęoëý=[rĄ˛»° Ĺň87™Ó<@í5ËwI®uLóŃ;ŘßiÇxĘF®Żc§ŮŮ7(ďÄ>úß©3oš'˙ÉđŇĽ9žOÔ/ü8‰=ÁĐňíżçĂ?oµ1Rl}ýEÖ^µ3 Ź–Ŕ÷NŽ3±đ%S P#f3ňÜu&ěţ¶´ŇIżsó GKĹRĺx@ůŘ=:ŚÜÄEî’Ŕpňäë#Ă{]Ąś &;KŁCC,§ÎžÚ;ŹeČo3WŇ˙ßŢýĹŘuÜw‚˙ÖďüNť:çžűŻ˙˛Ůl6˙˘(Š")9v˘qÇĘ$ޱĚÎţÁîC’A6 0Ŕî<ÍĂ3ا}ńx°/ lĚČf gĆđ±ěŘN$[–Č–LQŐěn6ÉţďíűçÜsęÔůŐ>Đqd‹¶µ^KÔźűyh\ž tWŐi~»ŞnUM-âu¸Č˛f›+Q/xĐŻ‡Ó™…Ůz»eLĚQÂ&&V9Ł ұf’ Ą5:#DTY@ “č„˝8'"Ί0Ha (Ň räPB„IIč$‰*¬7 IDAT´•LgjFô‡›wöfťV†ŁÚ±Ĺĺ˙ěw–7Vo^ąňÍÖT<˝´¤ëÓEóíĆÍ›7V7nô{“âĎŔ °"çĐ(\™wĂĘRk)náp=¤É|rëz¤ĎđěIksmŽ>WÜ˝¶NVÁ|x:ĹŮ_«†Z®Ľű’ëY-3ńŻüłŞ¶Ďś…Űg㕯âÎ*ťla,r8DEÁŢ!ev4•¶Č˛pZűM—îëćT8ş^_,z‡tâěĎ]Á·n»yßúů ůá ¬ýíۇ‡ŰÓ­cRaPR#Ő‹s§7nn>󌓊t‹ŕPk:lő‡wIT‘!*Ąb@@Xö‘1Ťi™D'X2^ qÖˇ&1DG‰SÂbç5ß?»Ä¦gĽs˘ČZ!€ĽOV¬f EŽ(€äV3IĹoŞľqo‹5fSC€ JŁ›gĎźťžn}÷ęK«×__~ôäü‘©.ë3¦Öš]}ă•íť[“®ÖOówg6čÖÚŞ p¸‰qď $‹hŻt‚Ú1í†ó3#1SşŮÜxăŰňKťţíŇŞn1ű1^űKÔD™¸Aem^nŹą8úËäÇş?Äök5»Z9’¦K¦“ >‰ë×č@F$ŮbŹ˘ů¤żÓO絜2zOô±V•„ňé…‚ö㸺ú°[ę}çCőŠ7^˝b]ßą\Š<·îňÓźîďönĽ¶ŠPgY—BÇŞO¤Ł0!ŠjµéŁÓłP%đŽÔš"M“ą©–‰ą$ łĹXö‚ФV"µ!Pk‘ŔLf&ďîG›6ƤQO’tČ&ć„™!iHF!ŐŚ‰LҬ§Đr‹T˛ływk{»×˝cK›W{PýąĹćgółO?ń›×^Ľ¶sďŢâňÂÔ±ÖňŮ3Ď|âÓçN"­}Ď›˙CAP„¶ —[Ř%B±?‡Ć©â‡Űču\–Ţh§űm}öż(ëSâlwăÝ—e°FŮA8µäjËrőŁŢµüî·ă˝oĐÖ5żý·˛xłK ŽjçÔÜ'woŕŃvÁ %R”­†¶ÝŇ!§QŁ-ÎY•ÉÜy,<‰ăż\4–v3˝}xzX¶övnÜşyţ1¶ˇ>(v¦Ož>zţ…oëüăg’hÖy2ńśícRm¬×G—NŢŮ˝é˛#¶…3&ÍóYJn’¶6Ä̵:ÉťXç4*¦PŚ'”V3+€śf–R‰xŃ̡w…˘Q!pŘ:!/˘@žÁ@%iöČ=%Ţ‘“Ä!Řz{GS¬ •şúÚ‹I`/íÓ9ąűbp÷z|ĺËnî2jä»·Ýťď©ĘcGă”$uzöxyěѤŰŻ_×uĆŘ 7޵uđ99Š#Ź˘v”ě^u÷&·'őŞ–µůĆŤkÎŮl<–2ď ¶Ď>~ŢŘäŰ/ţ dKbŚHł=……#­¸Ö ‚VĉŰw4”hv¬a—$5R±®¬äą”Ö!Cĺŕ2‚spBŚP3k° u€µŽ bBfŞE¬¦tČĤŕ,„h„,$!3´08S#Ž•ŢXżű·ĎgóÎÚÁţ~oĐqyéF±Ňh§źţ•Oś=qéćĘƨc§§ŰI{a~iîŇůĎĚÍźĐádíŹR %%@ Ö!;„s Sĺ˝8ȢPK%Ö––SjĎ…ÁĽ¤ ×l`4ęKĄ¦f§”m4j­xîůďýĺĚbŁŮhš¤\%ŠC]VĄQlz˝žń@U•üý®…ĺÓ­öLłŢL"ć(®‡6Ň”@E¤¬P  ś’Č{CPQe˝QĘ{Ż5y *ňBH%Dđ˘´R*Ž™Ľ"® ś˘ŔŠtP• ¨Ŕ)ŇUŕËĘIĹPŇ îÝ]e]çŠîAw4ÎęufRă@Ň2G†§[SG—yíű×w{w—ć§“8Ş|ÜnĚ„¦Ńëí–eţoĘűÇ ĄN*RđˇB¤5ZXÔş­05Źd¦HZˇnZ{O׎T7˙Ö'u=ÚEŮĂňŻúŃnĐZ.;߯˛=*Gb3m”’Hé¶«MéţM×x\]ř'Eë<Ďý9ň„P黯áŘł”˝‘÷Ö’Ç~ŁĘ,™QĄ*/ehByt!]Ü\ Šx^ÓÜ"‹W‹O”SG¨ÔĆó·ç>űÖ’O+ö>TsX?´±v#‰ôŮ'.ę ěÍĺSgö;Ďýĺů˙úń9yb Ŕµf˝ĺ*wâřňhŘż±ú}ˇk-Ęłű3Y耀YĽ°"Rd‚Hkز0ŠÄÎT„Y©–&d0;"í˝BM^\¨˝ĄČ{qÄ$ΕS@ÄÄ ›2nŔ T@śśÔUDLđĆyäĄu~°ńĆ*+ś9Ksj Ť" ڵÍÓ3sÓżńé˙üŻľő囯ż|ö§ÓĆáIĚŮ‹7n^˲É15Xó˛śQ (¸±ěnŮă']P‰MuŁG·‚ÝëÁĚ"şť ¸ˇĽřîµ`¸*»küřď·ţ< Ţa9ĎTZ)~í_EQó—kG—ťš&0ÚKăőo†·żBŰwă‚`äÍ•ŕŘ’=Z:YěߥN…šä×{Éă-őřą*WQ4:ŕxľěß ‡ďô#§.=ŐjµŢŐF{˙řpV^äWV^ÔĆś>ő ř]}pńŇ'®­Ľô§˙ţßýîďţ÷6b¬r •r@ÎŃS—jąÍ6ďÝÇ$ÎZgĄ˛pHY‘ÇqCPJI”Rŕt¤ąr"Ž-ĺyÁZ†9s¨­8Ł, Ć•‹4y'ŇśH^D¨đ`0S^Â$śYGTĚJl%’ꍰə•É «Iŕ,ÔÍ7V»ýü™_¸ÜU&QGÄ žšŹ?÷™˙ňąŻ=wĺĺç.^üdÄ á3ç.&QűĄ«•ŰŹú5Ŕ-ü`wŽÄńá®s=ÝťŞľ,v+[az 7ʨŤÁJ“CŤŠˇ„;«Ľp1xń•ę ¬g˙« ž¦Hśž/mŢůj mG'>ĺ·ż§ /”Ăk4¤ęĆ>¶\î„ OŕŢw]FöÔYRŰâŤWŁ`X»Ś{×*uyVÔď°FÝ^·Űëľ«Ťöţń!ţĐŢŢ®2Ş^×NŹťëv:ŻÝxůř™s "]AiQPGfŹŮ¬ŽGľâÉč4Ňćôtc6©·ćă@Í:ä=‚06ëČD™ 8$o]VUŕ}ĺ,W•'€ĽG)ňJQž•"BÄzRP tVʉ€”„Ľ¬Â€śk”VĆ㲪ĘŇŁa±˝öćţ*<ŕ/*pŮ(˲v»©ˇŚČ—ÎGA3ŤÇł‹g7Wwşíůé h[µÝ¬5’p~oĂUĺĂľ3Ů:üŻ)Ĺ‘{©Ő¨Ý–¨ĺIsĐl”ÎąJ– Oµ«®žť—qĎ/~6lĎřý5ëĄ ‰ŐÜSakAć?îÂk­n…;ϏžëÝŕŢ«Áú Ř{Ĺí¬s‘«GO”ťnpô ŽžÇÂ/W_ µr „Ç™âfI–ŁH¶ö2UÓSGĺÄÓw⏿µŘ?iHřQđ!Ţgm~ă•—śÍ/ś»ÜW;’ËOüĘĘË/}őËţ›żő›­tV$¦pś¤©0 äÉ'/GAzuý%ă¬cF–ĉ+3IŚÔ*vŢ0H µĘ™JKëÂj˛r•u9'şb CM ŘpĆh©¬TäBŢŮ €„$âЎś«4S^Jî:\MZýjč2ĺŢV./‡(!ÎęPĂŹYäîúFÚLΆČ'0’„ƉE6šô™_˙Ť/˙ĹźŢ]Ű:ýč#ÖÍçr¸xr¦7ĽpóÍW­ű¨Mă§`ĚŃ`€í7HOőŁxĚ?͵™*ŰŤş7)] Ś–í;ˇi…G7 5srâtN©>űŹTµEß©¤Á[ßAď.–t•”»ąÎ÷ŞWŻŹ=jµf”mÜ~“µř+Ô4Ă7ľL…Ť§ąš9›±řţnÔ <˛ †f|ç^­âzż_t:®źü§ď¤.—/_îu?T;I{˝ŢţÍxÎć9°dăáőWŻŔÚ Oţ’d$ÓúÂÓ:÷†˙ţßýůďüă´tlŃ–±˘Ô0M‰ŃśÖçM‹ľż˛â‚ĂL,yô†Ť)”bY… (#žECĄiRÔ\‘ŮN*ÖfNňŇQ Dk•0šó±Ł€ivB '#VÖA‘! /ťłˇU–«>—4vc@¤řÁ'}ÖŮÜf‰B^"P´zs51-s¦9ě9jtŕŰŽchn>ýµO~î+˙ĎhÔkÓ3Ó{Â@pî‰Ëąţú‹÷ľńÉO&&Éíö(23Hś~2zÍěěm‘+t§ÓcŠ9DŰĚĐN„5”@\@ i˘ eoY3Dtáś“˛t"Î [›[OD/BE,€r¶räĹú\ś¶nčJí*[¸ÜÚB*?´ůĐý裹ęÄho­‹†‡ĂŐ[7/\âŃP3rÎ&ÚĚŠ’ÓŹťťţîŃŐŐç.=%A‚ĐşÄ]<˙Ěwľ÷—?¶¬˙ŁćŹĹý‘űÁůîäDo µ8Ś6żζ«1~őż“W<×Çz.ą­ré0\ýK4Ú\×µE;w:îÝ®şÎ…R]ŠößőZi«ëĐ §µ4šAË”e7vv<ÎY’ÚqŚk-Śi˙®a"*‹•Ä •;kňÜŞśľP}ç ť|§“î)ćI÷3 oŻŻ…aPoĚg Ç'–ĎtúßýÎ7­ta~Q0$´ TŻs¤éčÂńFcŢ[hŠ| ĺtA#fçÄ…ÔP¨Ž\  8´öĂA ÂMHµ5S¨€˝ŘŇVÎ•ą­ŞŞ,K_”Ąuĺ¸Ěl¦ĘŞ,«Ş*+((_’/˛ęÖ·o_+]ńĂęTRÁ{š@ <ٲ•¦‰•1Ť3ËC×/]㤦­Ýŕ8ËX …Ľ­j Ď$Őť~”ŇČR<»C'h$E7‡‡S ˝JâsÇ‘Űbk;2šÇůŕ §źĐĚĆ=Ô˝ź˝nŻŰęxęŇS/_}ym}퇻îżľ˙u}m˝Ýj?ué©÷l]ĹG:°äE~ăőW·¶6Ď?ńÔÉSŹä¶źÖçĎ<öřAçđą˙ří3çNť9sćČô™¬„VGIę[ôĂĂĚŤĆůj 2ä¶Ü;ěqŻ6LR3Őh5j\K%Ä (ÔđŽ©)ľ'Ă* ¸|lÀᅉłŇ˘„…vN\ÁąÓn”YëŮÚěőű;ůŰžůś$ @$>¬ÇÉT­…jLQ8Rp•!§HłŽRÓ<(ŢDŕTs&n4·{·JËżm$ň —ts=á(ĎMťj3$•¸”h;–á>Ňň˘ł™ĎĎHŠbW:çÂĐńtŠV^Ś­yb®Ü\c+ŁĚQ&qJX€ŔŇá ‹ďî#M7J›aš´ÔL• Ů=Ě'?_ľ|ů䉓O]zęţ ´Őjµ[íS'NµZ­·?ß~ĺÝöQ,¶´űű»ýŤŻŢ|ăŘĄÇźšZ>2/4ëóK K›w6ŻĽôźâ±ËżŘ€cGÜĐIÚąÁ¨e‹^§{8̬1 ű·µiď™nqÇ­vËÓ] ą˛8`ńˇH”‚Ť+ÂJF âf­ŰsÎşYńXl&ĂCt6·6n\ĎŠO+ 4kVÂ…F·g¦ëÍiˇ&dRĐa(D’{»,—"śh;†0i"[kÔF“żŻ}ÍËE¤€!ě:ő:Z@˝)RX—őÄ*¤5¸LN?z\ďwPĺÜC©€Ů™`áTµň‚PNÍŮ®{};Ůć,Č3+dăZR0·¦Äm Ą„iť8ŮɵłAÍ<Üvřa§é‡›«×Ö×Ţľiń=ŢĆ8 ¬żwďŢťÎţţÜÂň™łg–9ĚÂćĚňÓsďîő˙ěK˙×ÂÔěąÇ/ÎťçČäă\‡•®±i˝9UčővŞĂlÜŽŁ,čRîÖ“š‰"“6ĆčČ@MŠs›#·Bąµpĺ†+!ąËsˇĽČ‡ýâ°3ĽţÚĘđpëÇNł2&ŐqCŇpXסžš™şpásĬŰő9rŽBÍ”Y+âóÁžł…Ijše8&‚"€j‘Ö¶“Ó˛ŢbřßEţPŃHaIoŚb@ňŇmÇ1Ő穿%IPäĽpŚz ´d!ŁĘ†vĺµ°žřÜ 6‡zÁsڄϵäH0†b]XÔ†¦ävěj•®ś•ˇÖ1ő÷‡q¬»~ýa·€÷ŮćęI`ýÜć·7něďŢ]_¸yţ‰‹SÓŁ´6›LÍžť˝tĐ9řĆ7ľµ|riůô‰™ąYlž# Y*ĹGÓqnóˇg6‹ ŁŞ<š¨ĆšşbkÖQČ!iăDHrÎ9Ér•ÍĆůÁA?ëV«ßůđ`+I’)xA@®”& hOh<léě#çt”pŔőz’Dšć°)@îť„cĘjw·v:»ÓG¦ ,ęĐyqĄg8xGJ“ŔúŔ˙ěďOiń%2‘[K*YNÜš×vdQÁ¤-&ۢč4dFĚ2pön‡—`Đ.§]ŕęžÇýŚC Ś–ĚęT;ąö2 …¨Í¦ăžu%ĺ{Vóçô`ĂQ49*ö&őŮx¸zëĆę­GŹťzâ±'Ź;nâZ˝6ł0{.+đ˝®|éŇĹ#ÇfŤ!gťs#«D±-qůp•ąÍ­ÝëmJĄ}GaĹ!†Č°óĐ\ b#•Ή«Af]i‡C—bgóÎÝŤmQ ‰R ‚ˇ‰A*âP×bsň‘3'OźNŘčg§çŘ0“&ŽX1»Jś«§°++Ď»Ş{ěÄYç­+EJ˛UAÂťţťúţlxü‘w˙ QáCd#™oóMŘĺ“§TB¨†˛˛(ÄV·]5–j2Ź´člÓi *B‰T¦4>´zy*e&¦p6A?Źc–ýˇn€ă„śµ™Ąăjá;-çżüW˙r}mý]l‡áÄÉĽ> ¬źćŢť[ű;wZ­™łgÎĎY›9Ł“xůč˛ó¸µ¶ţÚŤ7j©9vňČâôĽ©ł©ś­ll˘TÄŮLfgŽä6Ăáxčňń łäâH*bč Bpz‹‰órě|[ÂîÝîíߍI“ń,‰"曀ÚÓł‹‹§ółÓ†Ů¤i7 ±Ń†CÄĄŢ®Ľ˛±µuwvaav~aŘóJô% —IDATe»Ň˛CżŰ•I`ýT73 [µ’†{n.ăÍU÷Ř#tâW´Jěšmîµr3+Ş‚™ąxÔŰy­źh2ŇEËn`á Ł|ĐËꋺ*ł8ŃŁ­ÜD:\PeáŐDčAa‹ŕťNş?đT«I`ý ¶´»{÷z˝ýFłućäÝĹĹů^k.mĎL7ŽÎŽÝŤ•µ›ćîŇüôě‘ůV;ŐI%y™ëy5NKc]2ífśu6—<·E‘ŤĆÝ<·y9—X±ÎBÔŔćâŕ†yî¶×?¨”©*!€QX‹uš¦íĆÔÔT«ŮśÖ‘F(ŤČÔL­ŃśÓ!3% ĎlDŞÜz– 룟˙f¬éôc熶,\ßÚŇVfĂýţGzĄű;ń'">ĄŔ^ž%Ú¸†‚ÜĂ]ş §‡m.č˛kĂy®őřĐşîhÇVÎŽąµůČ2ËÖúćKŻ>?yRá˙O˙öďć¶uxj€ýľI)\ĎÓYĚ.ÓĚ ×áśŔ–2Ţ"‹ Gą‰Čöśn!â`—}©€QHH”"|ČëFß§&ő‹amľ}ďvgwűÚ+/¦Í™…ůĹą™ů陹©™YŇF«¨Ć457ż¸°(•õëk×_ş‘ą.ŁŁ$1ő–1&5IÜL¬‰µ!rš Y WMAamf3çyžĺYÖďtö;ű’›Fł–¦‹'>ńX”¦Ąä{ťM›Źs[e®°¨l>Îż˙ÚËťýIZý˘|Óă›?PtVQo$ŤMö1wÍYJ†VĽÄQHa?vlA©€ŇĂU%S5°HlP‘qTşŃ]ľýšĹgv>j&ő‹dťĐŮ»ÓŮ»s“µ1iÚlÎĎ™ťžO[ŤV2§ĹABTKÚőĆ”dŮy7¶Ć8¸7¶ůľ ·2‚hA0‘HŤX Il>„gWY­ h¨©‘¦łŹśZ S eGEŮëŢ©l>ʬ#"—őű;{;kë7z‡“Gţâý± ËŔ˙ Ť ±×ĹB>€Sč¸ŃDC¤) 0śłÜBŃh׉P[;â2!Ťé{][ čaWëýhXďë¬vúĂν»kҤAĚGćŽÎÎδŰsŤF#5‰#ŃTg†Ň©N‚4ş–jAâ”3“â^C CÉ+kA•Xb˱Ű×wÎ;gť\iEH`łŢú­7×wÖť›ôŞŢ]Ŕżđň)ŕ*jćŕ7qú(Ý˝Ňh6`#ŕö!¬E!‘zSŠ ů¸1ŹrŘ1l…ÍJňYzŘ5zšÖ{dőôűť7ŢD§Ě”č$®ŐgÚ3I­Î‰n¶¦´f¦„™zŠ)âB‹w¤´P_Á€x’*ŕĽh‚udyĎĺöpxŘfÝîŢţţvžŰÉđ˝ôMx!éÉ;¤†G:)°‡fä˘R`€H`•§ ˘ŕ0&511ń1 ¬‰‰‰ŚÉ§„lďĺ—ß3_úŇ—.^şřöë“ŔšřŔ{Ď řŢX[_»şrő5NLL|`LkbbâcX“9¬‰‰‰ű⿸˛˛rńâĹK/ýpFiĺę €«+Wń0Ř3 ¬‰‰‰źčâĹ‹÷SéŮĎ<űµçľöěgžý˝ß˙=+++Ą<“!áÄÄÄO´˛˛ňĹ/~qĺęĘç?˙ůg?óěç?˙ůű×/^Ľxńâ>Ĺ{·Mkbbâ'şßĂşxéâ˙䋿÷űż÷Ĺ?ůâ[ß˝?<|/MkbbâÁ.]Ľ„ű3YWW~\/^şxéŇĹK÷lj\*ő®šĚaMLL<Řý™őű/î'Ô[gŮßűwLkbbâ'y(‘ôÓM†„“ÖÄÄ[Ż×űí%ěu{?é­ÖĄ‹—đľë NLL<ŔţÍv~ńîĎ÷żÝë⥋ďýü˙ÄÄÄĎá}8Óôî™ĚaMLL|`LkbbâcX?ĂzęŇS­Vëáebbâg:yâä‡ňLäź®ŐţA:1mj_ř‹ŰŔí‡Z¤‰‰‰wć[Ż<ě<ÚÔđ§Î5ÇÎ>ěÂLLLLü _Ţ{é˙VĹ~âŃŚÇvIEND®B`‚fox1.6-1.6.57/doc/screenshots/boskalisday.gif000066400000000000000000000636241326741342000207510ustar00rootroot00000000000000GIF89a,á÷UŞ˙$$U$Ş$˙IIUIŞI˙mmUmŞm˙’’U’Ş’˙¶¶U¶Ş¶˙ŰŰUŰŞŰ˙˙˙U˙Ş˙˙$$U$Ş$˙$$$$U$$Ş$$˙$I$IU$IŞ$I˙$m$mU$mŞ$m˙$’$’U$’Ş$’˙$¶$¶U$¶Ş$¶˙$Ű$ŰU$ŰŞ$Ű˙$˙$˙U$˙Ş$˙˙IIUIŞI˙I$I$UI$ŞI$˙IIIIUIIŞII˙ImImUImŞIm˙I’I’UI’ŞI’˙I¶I¶UI¶ŞI¶˙IŰIŰUIŰŞIŰ˙I˙I˙UI˙ŞI˙˙mmUmŞm˙m$m$Um$Şm$˙mImIUmIŞmI˙mmmmUmmŞmm˙m’m’Um’Şm’˙m¶m¶Um¶Şm¶˙mŰmŰUmŰŞmŰ˙m˙m˙Um˙Şm˙˙’’U’Ş’˙’$’$U’$Ş’$˙’I’IU’IŞ’I˙’m’mU’mŞ’m˙’’’’U’’Ş’’˙’¶’¶U’¶Ş’¶˙’Ű’ŰU’ŰŞ’Ű˙’˙’˙U’˙Ş’˙˙¶¶U¶Ş¶˙¶$¶$U¶$޶$˙¶I¶IU¶I޶I˙¶m¶mU¶m޶m˙¶’¶’U¶’޶’˙¶¶¶¶U¶¶Ş¶¶˙¶Ű¶ŰU¶Ű޶Ű˙¶˙¶˙U¶˙޶˙˙ŰŰUŰŞŰ˙Ű$Ű$UŰ$ŞŰ$˙ŰIŰIUŰIŞŰI˙ŰmŰmUŰmŞŰm˙Ű’Ű’UŰ’ŞŰ’˙۶۶U۶ŞŰ¶˙ŰŰŰŰUŰŰŞŰŰ˙Ű˙Ű˙UŰ˙ŞŰ˙˙˙˙U˙Ş˙˙˙$˙$U˙$Ş˙$˙˙I˙IU˙IŞ˙I˙˙m˙mU˙mŞ˙m˙˙’˙’U˙’Ş˙’˙˙¶˙¶U˙¶Ş˙¶˙˙Ű˙ŰU˙ŰŞ˙Ű˙˙˙˙˙U˙˙Ş˙˙˙,,á˙%Ů(Ë’¬¶ $hˇB‡ .L‘âć!^¬Ń˘ĆŹCzٱ$Ç“S‚ÉҤJ’(Wş”ćË–5qJŇfË %[¶t :T(PŁDŹ]Ş´iҧHŁ2…:UŞS«TŻVÝŞµkÖŻXĂr;V¬WłdĎ–]ëT–®FIŘ$Z"‰¤6·ÚH˛kk×]7@oŮş5wp`m‚Żéşeí–®kŰRĚŘ1ä[’)7~9ńâÍ—3¶ÜyňhÎ=WÖ%+IĂ‚ Ć+;‰›ąmląiłÍV’Ľď o÷o#9{Ł˝:´jĐĄ5“NmşyôÓΫC§®x·đ[ŤdÇ˙¶}×VKmŇěšd[G@őúśFŇÝÔzď·8)?|…·I´‘DÚ¤g`Ä( z!¨Ö„iUÖ…LÍ… IDRB$$ěŐ ‘w`H´á]nÍ•FaM¤q[r¶x`QˇŽlY¸•5–¤AśÖ4!ÁŘF ľ%§]ęÖÄ^¸™(ß@‘( ±I2@üv›Ť ć%Ç‹޸ ]HČgÖ¬·Yc¶H§-s f§śŽŃą'ž}ę)ŘťyÖ9(źşřé™#qDČŕ^[¸›YŞXă^SúćŰ\¶ˇ‡˘@Ć ‰jMdYóY_§b–ꪻ´˙Ęc°Ęú*c¬˘J+®±ęŞ*Ż­Öč†%Ž ±‹ –Ç©–Ŕ“¦Ú‡#’0ĐmÉľń$É$ °›` őÓ-n!äqŰD‚Paë–”c!o_EŶR‚ Őo˝uď˝űĄŻaţ>UĐ-ÖŢR.B;I"Ř-ŰTŽ9ö$‹»Áu\ËPĺҰČř śďQ˙űŻr—ěrÁ0#,łr§ZÂ1{ü°$ş„ĚRuéî@$ç|K,Ůgqąi 2PÁé|±Ĺ •ńŐVg=őÖUsŤµ×Zw-ö×N[ÜPOĄMőOę"TvŮťÍőŘa“mwÝx­7Ý˙˙4Ô€ŶŰ›8ŐS Ô6Ú0ľ bŤGľŤ.ŚO~Ťä’ŰRą6Ź[N9ĺš>yoهNşč¨ź®şé¬—îzę­§ţXĺˇ_>ş5›3ŽY¬»ŘŽ9ă×8®Ťí”߸ěŠy®ücź'ĎüňÎGßüôĐS˙üőŇWŢ9äŁyňÇoľ˝đŰŕţîśCë6ťWRGîWôÓG÷Ç‘Iýő»˙üup_ö'?÷đ ¨Ŕ2°€ó;`%2Q‰ VĐ‚¤`/¨A z°Üŕm&‰8H"'L! ·uB98…rXˇ}L‰"…*̡ w¨Ăň0!Ýđ˙Ł î©Ęvš˘â–ČÄ&:ń‰P„b%°@,X±ŠXŔ©H*@‹VÔ˘·8Ć1â‹`ĽbѸF5Ž‘ŤoT#đ@JŕÁŽxĽŁóČÇ=ú1ŹtŔD ąÇ8ŕL¤"ÉČF:ň‘dä6ţAÉJZň’¤důx§Nrň“¦©sîÔ› fň”¨Lĺ6ę`E:PQ‹U¤,ŐXEWÖň•X°ĺsIÇ,Ęň—ZtĄ+µxĆbćŇ—Ć&0ŹŮJ=ÎюϤŁ3§ MjJt¤ őhČHzó›ŕ ç!µ‘ĘM’’’°Ä?ö‰Iö&ŠKä™Ĺ€¦¸TfR˙D#z˙Ďh2˙hW@+QĹ,X± ZĚł°KY.4—Eh¨`P,°Uä±WN”Ł­bjĹŹš4¤}(&ЇJÜ1v¬ aÚR:fbŽ.ĄDY‡—Ćt¦8})čS˘R˘›âLŞRĹyÎLnŁ=m dn‡§ţ'˝’SĽŢ™Ő_EBJOÇz¦44Őž˙đÍ?ľÁ„če’Ľ!ĹVąKWn±Š»Ä‚B)šW‡bQ—ÂÔc-őxĚ]ö–~…Ąbq‰Ĺ`^óެ&%"{MĘ>“˛}ě#R—ĘŮÎJ•@ůG¤ÚťDőť@ˇžsŞˇ Jńą‹^LdŤň˙D=h˝dT÷‡´ň…äŚ*qţÁ›ŤŽtĄg4©-}iEVŞô 6ĺir±@‰žŇÁĄ+]čtń \rÔŁ"Ő"+©°SťĆT¨5ŐiPépSLôT˝îť©±+Sö•¦tجg÷ŰYr˘BŁ­-4Ű€J(ţÚW‚ß5ĆÁ;%"UpÜĐIś­Qµđ?H€vąÇ>ůYĄCÝLčR”± µk$›MËjsŽxecŚŻXâ-Š‘Ťs$!3ëĚ÷xÇŹ…ć )Sýň÷ČLEĺ6&ŕŃnCMȧć\{*ȬWCySl&ăZĹ•+·–ś¤·Ť[\5­”´Ĺ@)„’·˙Ípń+?JĆ‘Jłë˝)ęëR™Úy¤µ(śópâB3”˘Č©B÷,Čö®xĎ-%ęu…Ş^óîY˝.ÍéNÓKShÉ Žä…uËž¸'Ş­9mťP†`z Ą7F9•‚§Čôj_`Î5&·gAŞŃu.^mÝ\nšĐôńŽmLĆYvĆwme. ImA&;š×ö#‡jíiľźµ¸é_]_˛”\^í•[Ëĺő`ŮĘé¦ňâÖşŹµ®óš¤ä7ę˝o|ďĂßßđG@ó-f<{—Đr#rq¬Ç^ż¦0­ŻŁµŮÓđĆ9Żţ.CĄÝf:FÜ˝BŤ/·%]S™öôá;˙¦iźÓëÓpŹűĺ‡Lbî~Gó%‘( LĽf˝Zˇě犙2‚ëmn]óÚ×Ě”hsŁÍRÚ7ÇÝŽfŽwüm:;Ô „v¶]«ČJ:y˛?ľéMűhŮź~ŰÄ.&\ŽHH¸ť H»"Ů@ ~`´€ąŢSĹwuÓ©Użň{bdÓ`ű8ßE§d´A7¤™íjŹ6điŚŇŤ eć`y*_•7\ľR7ěHŹ‰ĹŚĎ9–ľĚCtď|Çú¶Ňťö©3ˇ©ihnÚÓ‘ä‡îwĎ6’ ŘŕýîiÁč=Ô(# ˝DvŻ~é<)‰ĘUp ”xKâBR%®py=ä_áŻ}˙×çř^j;żŰÄ®Úí\hËç5»xőĄÓˇ^ßc_:›g§ăĘ:ČöFłţśÇv‡$|şG@€hwŘŕ{ÇçY}ge­őw¬}ęfe[ÖŤ° D—xąP;A\ÄĺxĹ%]ŐuF™'h ÇKŘĆhuäyĐä~„]ŇäQĚĄ‚˛ôQŁ7Lő…G;r18r,‡Y«×#ç$€ |´PwĽG H`|H ÁG€ č€Ój‹`.Ł"ójµ2·eŐGI˛)ďÔYÂ8”vv´EvU]*5v±g_‚Ô‚śg_awY[$lÜĺP¶dP˛4TzVG-{9e„§-V@˙inhHŔwwMČ`‰l0|NhwĹçHtW…ş Ć—HHp…ŢÔw†HxGa«…xehOĽĆ›6ze~†8Hůg‡t€r=ö^ő%]*xzjdPĹtv"wS„DęY.řc®wmHG†Š wvׄá„t·{ŘPЉ¦I31ň’ŽÉçńF8‹¨4yÝu¬g_ŘĄg>8_z€ůHGŮ–46z·ÔQdôJøM&M9US:¦gj÷L=őčeG†”€Ľ‡w´|y§TH‘ˇ|ĺIóDHx( O*ÉD»@y.]”€Źxřˇ—l(—gë˙e{vQZäuĹRĽ$qÝçh,fix¤ß6YކYq€‰€ŘŔ_–¨{â’ŚT;¨“<ˇăIŞ9ń<†bj†ŹhU‹Ż—m“…_t8HEE‡Hh|´mř~±LN×K,%u §‹őXŔvŰYǶiMů” HFşÇ€VąHQ”8®čDH–iĄfˇ‚Wĺp­WrňĹP'„,¦ŚŔ]E…~C%^Y4R…Ƃ҄rČö2_8Ő‚úh^z¨iłYH€wÚř”Łxd‹ŮW™ť4eŃrV‚“Q3íÂ4¶ĐN(¤9dY yUÄĺśm(uhąGmą^¸y”2˙Hp)”Ń–EĽ”Kg~ü÷bö€kiMDr/Žä”Ľ‡ |Ś)śäDB! ŰBŚ" ČŮ I“,Z‚Ź‹gpE\fY_h‚ŃH×6dÖŐh/ř‚úz$‡p;h]ű({A¸gFeTřW}ii÷H~µŮcź…™Č{U śü°‘ţůꮞ˝Á'@ rp(„śVV1[˛ŁVtÖÉ.Ůą˝vY4 Y¦ąiµç‚?ČS3yš–€Đc[úGVş‹Ú„–[Š ą‹?†Ď]F¦ŮČżéYu§Ł; Ăn§r/đ¶e%ůD”ŮiU9O6Pł „Ae”y˙čc×öbřčq\ę|$Ś!—c•g©Ú—*šô_BůĄťI„u¦ Ŕ,Ŕ ŔŞ­Š °*H€@žu€xşŁĄˇ`‡2rR0xâŁ,rb ˛H™4y݉]ˇIGŇu›Ńµ—w”I~Úöž& Ť¦ź ›Ůšm9ö¨Byiy€€芮纮ćÚ®éj®·Ş{yúźTĂnóte©U4{Z0>*96·d†°ŤóŻ[sšy‚˙Ç©P›Ý§c-Sş˘xTśÖťťęʞgrťą;–›/:quPmRWíJěz˛%k®ëúSŔ˛.۲0ű˛2;Op€ü˙ 1›ł3»ł:Űł<+ł}˛B{'A'ë‘(±´S/Ş˛Z†ZD3µż“;3·ť{¤ŚĽŚ­·±—Šş†8Yďɡöum…Hv/Ć‹Ęö×}‡¨”K˛çš˛s‹˛u‹O@łz›·|»·~›·/ŕqĐ·„ű·†[¸|«ĹP ŚŰ¸Şđ;¨eŻň"­51w˘Ž«ĺnřňŽČf•`‹• T/¶¦Úş‡"wl—ĺhŚV~‚©Ż÷˘*:®Źš°“†°‡vW«®îОt«˛0ű3¸4;ĽÁkĽ,›·ţáČ[ĽÄ+ĽĎŰĽĐĽnP 30Sp˝Ů«ä ˝ĂË«†˙ľÖ "– k@’ZżJĺR[@q¬ŠťY˘9S ŤÎ±z¨¶ö%v÷Ň(]kúbAĄ*›Žúş»Se[‡pŮb@HSŹ&·ż{·l®}{¸<ĽË[Á‘»Á‡[ 3 r€rŕ’0Š †‹eŞ…0·@Cj" z ńáY"m°-…¬Ú`Á5ňXyĚęŔdűµ.Ö}6ŮmbűL°ą¶zH­e»Ź@Ĺş•6¦Řd{üÇŚĚ8¦zi łĂ+`Ćb Ć6Ć={ĽŃK¸.ŔN€ĆŮ›ĆnśĽČű‰đrąwܲwl˝Î۲°F/„’ZSe &VCCŤ˙î1¨ĚŮNÄ5WˇËŔFLÉĚHş®Kˇ\ŠÉűcéY·7‘Tú™?­_ŠlgůG0¸S•`Ľ|kĽ0Ër¬ÁŘKËz«·/«üĐ·\¸˝\ËŔüË4«SÂÉÂs O Ó«·LKxűâłB?!n`BCa-¤=ăąłčakČ}@h]›V_X[TŐz‡î‰vŠG®©­ˇ\ż¸ąŚţ­lÚGóŚrîeYzd Ä›ĽÁë·~;Ë>{Ć|»Ć‘ŔłĂ»ĐĐËĐ=˝N vś·wLŃËěĘ ˝ýň+©X*©…*E늽ÁáľźKI?ě†wÄc<*]{’ÖŔ—ĺɢ˙‹.-źQ÷u«÷’*:Ó*MH‡G\ě·ÝĐÄűˬÁ®üŘąOMłOP SPÂO`Ő!ĽĐOP¬ĐĽ|üb[v´‹ÓeBáÍ'=ˇkËgö¬Î°{Ď«µÖÖ°k“´]¬k‡ăúi{ÓYú˘i{S­üĽÂ¬ÔFí˝püĘ4K đrÜÇýŘ]ÜĹ,;Ąđv,oÂy[ y«·Ć/·¶Š®ňnAѧ«oąbűfołŘTçĆ«ln˝ÄʦÄçsÎ%Îâ1`° 6`:Đç°7p3˙pď41ZxŻ€ÚZ°ĆŠm€z hťx;¬ar%Źă\r>użÎ¦¨ŚM<}lN±ęwµ-Úŕ¶ýµÓŕli‚AͶ ŮáLÔb.ć3Ű·°Ě·/ {mPĽÎ[â( â*Ţ-@âČŢnÍľ1@çHŔIŔI@írž1°í1 '§ý€Baełň,Í×Z‹D*˛-@žx§Ćd Â}Ż‹ÄÔdĘ÷Ý™ć<„Öćy;Ź +ź:FŰ^Z×üťë<{×ôß”áfîĽ-ÝßË×Ű·łüMý7°o7``~®čč5íŘ~í×^â×Nç+Žě'Ď’13÷˙˘|çéÉGą—‰¬‹Ó8ř¤Ö1˝ŰęÄ,÷ÓĚ™ájÓ l‹yĎëęk[”ŢƵ/šG®W ÓkË<ËĎŤŘޏ3°H°:íÓŢ,€íŘÎf?â)~í-ŻöĘ>çÖNítŽňjâ黊S†+Ě'>—eÉ/±qé:<ż• 4)ď·©äSĚżfôTn¦nűď_·ď^˛îőˇťćÓŹő¬ÉV ݉ ĚI-ěź˝3°…nç)ňfź-@÷vű-Pí&>ç+/÷+ű¶źű#®ąj’+9R[ü5篿㒠v™đˇzvŰp9Ŕď‹cw–ĺeÜX‹gĎ˙_±Úyôײ÷í5A™ŔÜĄć˝/ŰĚ®·€í±˙úÔNűwŢú'~űuoě±ßňsž˙¤ “$LZ<ŘÄÖ6[ÚnikřP"D ^ścEmŰ:~ôäH‘ŰJvôX‰:ąZľdą’¦™3ëÔĚCO%<”ęĐĚC)'M›,if˘C)M¦IiŐI©&Ô§Q§FíYł&Ňť=&íÉ2¬S°BŻşĚUgĘ“)/¦Ě`ëVuŮ޵›w.۵3nlhŇE $Ř„EAÂMf’b cÄMR4|°EăĆ‘!Ú} ôčѢIźFŤZô·­]ż†[v˙ěm•”*Ĺ„4ÓQ›·ˇ­Ů4kŘŻY1ŐšučWŕK‘ó¬łůmŢÇ)«Î©2»šĹ.t%Ď•2—f“©’[Ľ|ŰĂ}ű>űůńő¶ýËD1cÍŤ“°±Ë4K¬2ČZ¨ě1ĘCpŔ‚DŰĹ[tYČIÚ¤B["Ľ…BŃ´‘D‡@‹pC )´†µŮVŚ­Ť$´ůÇ–$dl#%«4É…+™şűŞ)¤|#/'ótâ‰é€*Ź;á¤zŞĽžd:®Ş&±*8+ťL’&'ŁĘé6›(É$KŘŞŹľĽÚ;“®»fxë­v°!ý »Ś1$ll0˙ćÜ@;)kˇ „Ô0Ć˙X`(4 Ild—60ŚäŃHŇh´GCŚCMŰŁ Y0܇EQ_kٵJ˙A˘ĆmÜPˇUWUPVśPÂ%š#Š\wŤ+#ĹŞ’I_µ Ľčđ`ŽH.uújŞ"ą*˛Č&‹E6;:‚ŞöY*ǂʎĽŇt ®2Űę+®)6xón ýţ[Đ ?ő$@ĚšH±ţ3T?~L˛ČBqm‘0ĂK-ĽPG@ QÓ%‰Ă‘Hn©Ř’mFU’Ť˙Ib›6nů§ĆJ0A“-ł+×&˘xůe'śpU‰d}µćY›p˘ )xŽÂ‰^o˘č›T^KlŹ…rŘŁ™“)ę±˙¦¤)H"­ĹÄúĚeďL6éjó±7ŘÝ&dp‚w»¬±Ĺ Ä—Î+“›îÉ´3ß$ćvŚ…kH[Ô`ÝŔĐ–G ·ĹĂĺE’H"vDK©CŽG-Ő#Iftq!Ű’ňZ¬‹Ĺv%•ń`Ş'”Mo*Ž:t­Š8rU‚V[i¦ąŐXqžµÖ$lmÂV]gŻcv×»Ăę+Ń©»Ö»¦§ĄŁrŃśÁݞ˙*űúteA $ âS Ë ŰLn:^“h0@?ĽÓĐýđڬOËć4Ř!]D[t4mql!š[śh€ ™ fšË56äŮŽ´¶=j%)&, wŞőĽ˙™uĽÎ1ş-)DŮĎŁÂV-ÁU.ĚŮî`%ł8Đ0 7± Ż E¨ˇ/SŔŢnŔ¦»{}ń‰đ.$ôż’fD#Â:t@kPhŚ#ÍĆBG9¶˙ćcŻůFmš×ĘE›;\$§)™şfHŘĆăL‚×dÎ6ĂąŞ;m˘2˘fBXÖh‰”_%RľáAÓ¦Oî eGzd "Ď $jç'ĎQŽOčvQ·÷‰¤8 Z4@÷ˇŚ1îŔţô6·Š]íŰźb/`nFOjŐĹK•éĚÁFs€2Ť$ç8Âí¸r UyCtˇĹNv’¨˙©Jp‡\`¸xňnpA'O(Ă.–ŚŤ:@ůĘ™°26xqLTâÉŘŔĂ•1‘e\ÔtŔ…Ż3en8ÎećE–ďĽf^´tČ36¤Lĺ'wYeO¦3śĺډ)‹y¸˛™µĽç*Żąö+«)Iü®ä6ĂkćZĹúqµą‡Yî‚âEńÝ 1żd®E™ 3’´$UŁ0+ ],v± I‚$¨)G[D"FHÎGlaM ˛„Ź`á¶ŠF±2łťő łŞÂßÜD,Ó9Ň´‹V•˘˛¤7ÜňMşĹy“¬’eż cI%*ÜVľ˝ĎnLL'±á7Ô}k˝×Ş˙ďgĘ| l@!•̦…\–4 1­‹ăE9Ó!ý; b\ŢQŐĆXM ~ •`M•&ćŠpČsµŐn©´Ó‚ŕSť5ŕ§H‹ŹüŽvţhxˇĎ–’‘ß ŁĹ{ˇ¬ýmż@ŞÎđ­n .nHĎş ĂĎCJÔh(DŇý9ł¦9¦EÔ¸°fްć?üń1ýcckOű?ľ1Í}Ě}îtěďS:Ë*a«H.ży¸O.Ő¦ iZž/U˙kŇŔů';ÇYŐŞ%Ä® 55©YébĚă —„8şoeĘŕćR‹î¸źî•A•ޡřÂî­)ŽR‡÷uŚşÎ.3W:˙lŽĎ¦6ň%íŢ{SZíČłIDťŞ=R_§ •‰”ŽwŐ`™,›ŘÎŞŐÂŁťHđ­mé*ŔŢ·®/_jA‡“€‚ômLX)VĄˇ  ŚýIŃá&é›!„‚b ů# RH©Ŕ޸ g Ű:c*¬Ţ m,SiŽP‰źş 瀪rS©`ŞHrľäˇ>`Á>Z<ĺŮ’˘p9ćišÔ* Ąň Ťň"¨[:„đ—Î1ĹŔÁÜbź4@„R((B@¨Ó¨)RĄ˛*¶ńĽĚč(|YB8ŔŠ˝śB)2J 2j#[…б_Ű8 ,q°°°š˙@R9’űŻdQ¤ojÁ%‘ÁŽ´HťŔ‚‘$I’„€* * ‚‘¤(HIPÉ”,I—Ä,hÉšÔI,Ř®bÚ•Z@SD¬1Ʋ…W”Ŕ´ł,CŠ"ąC‚ 6dĄş>©’ „¤Šf‰-¤Ş#䩎c9ŇrÁźÚľf\°"­ež5ś9:Čť¨śĚ–|ÉşLILÉşDÉ—ĽË˝„,¨‚›ŚK8LĘ#¤â°š ą-qľ8ś’ťP¤f<9űJ™ăĘěŹçA$ľŻâÉ,Î,ČË4Î}Éć´K™DÎĺÄ‚á,LŚÎĽ¤‚…°†mĐ…`Q…Q}2ňن}Ńk¸]°©Ěś ĽŁ —Đ…–€Pdé#Ф'7tČ©lš^tČË’Ă-Ů’ç`K„Á\`2Hn‘>#ިŽß,Ě‘¤˙—Ä‚ľ„‚ĺDI5NäôKÍÎčüP„Îă„Ď>mϡŤĚ4 ×X¶Ř·łŤ Ř ô`ĐtJP±Đ–śIőŻ­0’ĄÁ#3Ľ“Żä Ú©™°ŻÎdP4´Đl°ý‚§íÎ4Í,pKé|Î猀 ¨»ĽKčDQĺŚSĂäPľ´K )#‹¸cý›™GśVĚ Y&̬¦ ü‡‰”Jń8s “żÓTł@PIťCČă¦HmÍ,FęhUTš¤6ŞxÁ¨8 7®čL©1ŞŞŘTÂK7â¸Đ3ÝNćtN(€¨€€€`XľÜKä´K˙ÝĐZ•ÓşDNSĚ=–: ÄÂ8mpTl‚F¶ŁÜGÉSą…RˇEĺ6Ž,WďоŠ$żcąq˛O\źš -ŞĚB°@ĘŻ/yH›uHŃb Y•UWÍN¸ΖDL–,Řă”]Ť€8Ř ­ĹŐ ‰íŐă„‚ V:íаŤI¬K ˙!¦g Č\&‰(¶[7P,ĐŔ‹©¬’Y¶‰m*§ŮJ–ĐÔLI4üÍ}Ş6,Ȳ,­jSŐ/F˘"ʎňE†ÉŕdHď0Ć4Í‚ĄŤ6’Ô\,ŔĐ–´N‚Ą†mS…Ť¸Ú]X…MX¨xŘ9­¨]˛ýŐ˙äÜÝćÜKŇ¾±Ž^˙Ť±…FŤĚtśc«”•EÔŃĘW˘ňHŽ<ÍĺřHŮÚľ<Ľ ŞÁÔ j­ţ W!YŽ,Ůܧd‰)š‘ŚK,>ÂPŇĺŽĂĚN÷µ_ҵIéôU„•ČZ„Ť]®uÝ­UXXŘŻĄÓ•€«Ť€†•ŘÔu`ŻMΗ궜…ř%\0Ń;ÂÄP< âůµâX ÎŕTbě|b%fI,”ĽU/vS@`×eă7–ăµ€3ŽÝ8~Ý1.ă1c.fcgnĺQĹćmŃ…±íQ‡ČQ†gxěć“@g’PçtÖ)¨¸RVMaA·Ëę§Ň^°¸MŇLľšcJŁĂűŢúô‘¤XžP&ÝśŚ6']›Ôö,afA0µŠŞz'$‰W˙jÍKĆŻ™ j×z5·xKŹ´/{†Ă?_á e·TâhkÉ:(Ń÷ĹjVNÓ4ĄËuXëÜK8^XgŢÚ1vcŹž\­´ţh¶–¶†ë0>ŕ…ť]ąă.㫵„dŐąŤ8dŐ…ĆÉ lw Łc˝kť Ă)™Jąh‚4ŘGan}Ż7ÔŢHE¤Ŕ%%×čÉ…wŁH_± ĐĘM˝*RÝ)ç™Ă´\mh4}h‡Fč(N%Ě+®`˙‰mŕ8fŘhfăj®Ú·nëା’Fkâžç®/–î ~nXćÖĹŐŤţÉ:ŚË1ĂáBK€” Aś±„O±9J‚ÖpľíŰÖ¨Ŕ&H‘n%°rŤŻ:BŞ ÓFýÔËŢ,ţŠ-aeq’ôBwöę™íúź”JÖ”:Ŕ1â` 9 aÚ… I‘šv»×čÖ€N°•¨‚ŘjËÂUŹËša$ÍHtŞwř:Hšm\çs[0¤Ŕ‚ąě&5GQ˙uř\ÉłíŐ8Ff3ă2îč‘~n¶6ńäžö@7ńůmďxj·ö“÷řmÇsKŔ®’RŤ0‚—zy†Ŕ˝÷ŇŮ–M¦8Lµ¤«ČWs»ŇÝT­Oő¬dÔW™ŁšŕÄä U’Ú¦ßíôK–´ęę\S^­Őĺ,ăhžŕÖíčŹVXî!űŹ÷hA˙x‘—Aw‚kGůj'ń··vnô_¦±Bg- Á{ EŇ µ-Ě©šjŤą“»¨»¸3üĹŻ»Ć7;»Ó«Öܤ…ÚÁĽ‰Źś{ç.=ŇçxgťCjźŕ© ' Ń‘9dÁ‚Ĺ˝í<_ž¸_¬ÎmĽTÎĺäĐ9ÍÓ—|X˙łöb­őh®Ť´éŹ>îk/yOH‘ôČ$â'ţşGű=Ę3Ţę˙źÔB-LŔż‘Ŕ k;Ź(|DI«–j¬Wb6_Zyć oK×UuןSa ×[gĽ3ĺ+žjTÖ áTÚ›ĄKSL)¸‹5KÍĹT»4ŇDiYxaYMěÇS˙´‘„-ţłM%Ŕĺe›a˛őć×^~™ffpđĂ6ˇ˝Yb¨avZe=ұg“UvŚ™íxăkŚ–×_yé&muä†o¸Q‘GA˛ýe˙ 1ó©O~dCÎaDş&¦ʬ’łzŢA â«_áb!©ś•Ő°†Ľ&jxČŚile<M­y&4aĽ$&ĺ ¤9^BNşÔä˝(ޤŠóş¤âôĚ9)j=f Ő‡ľlnťčăµůÓžň´§B-'NoŞMö•'őäĆ>Ł*U}ŠňWUĹ-řbvÇŃ™ŢsDšşč%‘— ÉŞ˙ë0É5#^M[1űÖ^ţŇÖŠERÓ¸LÉ„°eëŇQšż˛ë:ÔCĘvÂ=•8 iů'ž¨/śEUßúĐyÔĄŢÔ§<Ý,Q;«ŮŃú”Ö'$€Z ő©lhíB§:ŐÔň °nű 6xÄ—0S»ü*]FáfŃű( QëËč!Q‰\ËŤgD]m‰j4ËVA†8.ýĄ©I'Ůťć°«V ˘ ÚT’Ł %(íą× ÖÓšşŕ<ä­gń{ÔŃrÖ§ -ŞRIŕĄęÍ©<Ă-nŮ€6@H@«‚!Á`$@‚fá &Ŕl¨Şl­˙Šá_ae?וŢL‘9SulP‡ĺ2Ź!>ćÔ`¬ ˇŐÚʵ‡‚KfĄcîX[6UGĽŽ2m0^ó"ö#G)Äj‚°”(`ť‚ĎĂ ZÎöWżöŻh÷űßφֿé3đŻpŰÂc­?0,a›ÎlŃ[b~ !Ď3˛s)üÚ~¶ÍŻbŘ r^6éL±TyćĄó·>v.IA}B!—Pz y"A¨łë‹R´Â´#§¸™ç;…ň×5–ľtž9żB-óŻ,`3÷:ÍlfŁ-P[Uי€F‡Kü` ˙™ÁÖ~í µ`˙ ţsžűÉ6’t‡«kşFŽůë|×!•才2WÝžţńń}Ä!Ë !µq¨wîrĎ«˝o)«á{žťÄĎN8­,x^N1‡6Řeöě~1něc[ÍmÖ¦ŞOpg»äö¬¶ Ą`l[±k“"Ú"­j(ZÄ"đbSli$¶Š@„LľŚÎ%›k¬‘PčÓăjŹ űÝ*no˝+!IKĺä°řěŻO=Ĺěw<ŕ5UŘĆoQ3ľńŹ XÉľgŽM®ö©2z;.őHuÔ¶¦›ŁI±ąÍJh^çxş»Dâ”ß©{ĎŹ÷ńşT¦÷j¦®ěđÔ˙ o@­ăhÉ©ő±{]ăľîü×·ŢY`k<µX;ę×® 9e^ߡ.]óŠtÄďčÝžŢ!¶„Mfšbô0 ^1kWËH˝é­ŢěX1N@IÔ "/?ąĎľíäşč۬ýĐőâ]÷<ŘŃ `šŚĚ*ćÇú/§ţóŻ?ýěżűăß~őoCł~úG8ó^oŠó"‰«ŘŚěőt„ ¶‹ąEO™°‹@ÇqYŹţUŃIĚL%JëÉ~ĚÉß´S9m^°…]Ç•ŕçqÝ’Öć…Ţ •Ů Č\hĂĄŘÂ\čBĄ@NÜ Ř ‚ě ć ‚xަEýÍ”É˙Ŕ<Äy—š Ó˝^ŃS`ŮKÂËÝEĎÉ€C¤ÔĄ˝Ü¸=źâ„Ä…X_eéeźřµá±eśr ćç •$XNĺˇî!Ć|ĂžŠˇĹę9ţµ»PW uÜ€«ąŔDĽąśGVŘ„Wu@Äwéß?áťó)–ÄÜ‹N´ŔŁČŔٍDžŔař­Ů‰žÇ©˘×­ €YÜ÷±˘fČ5|HXäĐ`W4BV0¨¸ ę‚#XJ1^Jĺ çüˇYE$”…6$$LPĽŠýĹ)^ŕ›´Ôş ÷4Ýą@Îa¸ ”ĄIF KÚpZ»üÝşu˙Ł«ÁIP°Ä}„b˘đ„;Ń"͢öÍ!š‰r_řőšŘ­™%lŠŞDB¸A\´D’@pL\ŁŞ @#X$DJÂC‚:#ŞČ„JĘhĂȡLA“ Ü€„ă˙…„Ľ¸K0˘L˝CÉ#Ü1â »M“b}â&\Kl#KŕŃNĐ„•Ŕ şˇ@®ˇ+jÜĹaźŽŢ÷uhiĹ.TděÜ‚[Ř‚[8EV4,4[€5ę"Y‚-€ĘdY…<Ł$ȰEý…˘_Ɖý\{…8f  脡˛Ř$5¦Ůü¤Ň-_ŰôrO¨MЉĚ˙‰M€ č [U®˘?öăçu_hÂ"±]%MBć„ SXdl¨ĘČeTä‡x¤č˘.¸…ŞŞ”ŠH˛E$…6 Ę«ŚE6ş€ôIźJHtŞ˝H7ö‡Q´ĎŔAQľÜ©ŰÚ Ú@aQT¦P…N8€Ţ‡8A 8AżN)A@Ňá?Şˇ?Şb ¤i˛ć@ŠŢSlĘV,ĹČhŤĚ˙TŁJ‚5$čSH‚.4ŁH¶§X´Á-\( şMHÖJlŁó…hşMś´=5Á‰Ł<"á'ş”ŕ@dČ(r@ÁĽg{¶'žě‹žÔDg©@±‘V‚žTâ˙',Ňb©fĹĺ§€ŤŚĆh…S °źúmĹ€`SdŚUĐeçĹ6¸AźŚľÍž&P´@P …=&J ?´ŔŰA!Ô˝Éëĺ@řŠş€@Gŕ@ä€ä T ŘÄzô(ÝČ‘ť÷ [Vd †¦}ňŁV’ݰi€4/¦ßU`JĄ0EV`Ě•R ÇŔ —vŽ64ÁĂ€ĨD|ÜhÄÄIžę©śčÄeĆDD"LÂäŮÔž›8GŘ@Č>ĘȲÎ{ľD4@@€sP@PŘ´@,ŠĄRĺ™ iR*ö )¸Ňˇ’Î!×U#§> fi•ZE/^ÎP˙ŚUh‚l jĐë5Ř«5૾Ň+fE ΠqčáÄWŕ¨ÚŐ©€ ”á¬Ý‡JJ™şÉZŠŇéHđęG¸A*8Á‹Î€Ř˛Š¬ ĚęPđ žđßܨł>k@ŔË6$ŠA©çÉb¶ň§¸âl‘R* jćPE¨Ş_ć\i ¶«¦jĹhŞđáâ!§n Áđ‘}9AM ÎŢt ˘Ô‡Lá‰ŐşŹ«ę%pOy¶Ť˝ČǦC3D‚Lě>JL ĐGxüŤĘęm ¸Y$@@+äČě4]ź¶®f+®ŕâ’ ~>nŁ:®OŤL‚,¦FĹÓ¦˙_/nŚĄhEçjjpîĆdEĄŚnČXJ»Č Î`WP….´ÁĂôÉÖJÁľŚť¨ÄŐ.Ě~ Ś|艫&€ŢĹA=JçŻČJČĘGP'އ Ĺ(¬ţŤˇĚß$Uf9ĄS–Qh“®Ě®řBŔß‚ är^¶äZ%ÎöŁÖ%é€*E€hŽ€“Ń; 4NEŔ@żó}•‘ůj˛:בSĆóͰRź('@C«(2j´A"ôű:îQIq,Ktä¸.VpŚD?Ĺ»vîü5N±€Z…0;Ĺ5Đg+âµO©,Ů—ŕ8ŚL‚@{–Q|śNZò8EĽ@Ý6ö«lO˙@ „“ łO(@„r÷&ͰSÇ0}‚ŕö @t2­vÉp„vSżbR5+ď?G€ůŽťÎr\nÖrLĄ€4/oE§5úąuÓ"#Čp4GLFgŽtsnĹĚďR´ÁH‡–úÜ‘ťXŻ:ĄŹ_O5AŚ4™Gđ˛)rL é8—,ÄX/ÁŘŹ:Çs'.Pkv= őő%6mr%Źvg­Ď;×ŃőµÓ=ë·R«ł~´"nöŃöAVjQqĄć0±ä€ ĆÜ2F[řĹwćNÎĆ8Ç °\?…^‹u›AśÄĄY7€IwYďş)8ö~ä) ź#[6ÁŃöĘ˙‘j u6áó<›Q7%Nťvl_r Őjyöƶ‚ĎwP7ykďc'“QH˛}:ęÖç™M•öâŇr*ć¶nćlńäd´/ÎŕÓ˛€X÷UŔ˛ëŇ9Tńbßv÷l±˝¤Ŕ‰ŞÄ82-Üx!Ł0ß:đ@ż¶xyRŐđ‚{¦hď7iWş¦#Ő‘?:ç3– ¸P_ňł6€%WőRuŐ˙°ą];ČT,Ĺ-÷R44ýjާĽő¦ô:/ ·q?…Ű"±»/o)űś¬±Ľ…sÉVŐ¬2#Ó¸őJµ<źŃf÷j›Ńn'•µË3¤oz6mŻh&“;‚/8Ss˙;©“QP€)Ç3hŞúĄď§oo0¦7D#÷“Ţ:Ąw€9ęŢzÁgLüz4ĺH·üꂞ§ąŁ/ĎJĽgE€KümĚ5HLĹbC¤„ĨÇ ¦űMeyş‹űSăT wŻůb“eůMĄv¸ĽRŰl¨ĂĄs{’“şµ›{tů%ʶ#griB%YÂ۵F;4t7F'H,—5żKí03WÔµşREŠwV×›ŕ×1®iR2+@Ĺň$(¶Ľ˝ÇŤ–¬fűjăüQY;ďöşźQĄT'y<ÓÚ<¸'~@f{ű>˘;Ń·“Íú=â×<¸ý¶ďľg?ş;U@ßşÓ;GĽŞ`g±yŻ3wt.‰üUT·®¸Ĺłć»sŚ5týR™űчyőXł@›&ÁˇęťŢÍH ü´Řš2ÝËý“Ă3@P"@ÁK P „€( bˇÂ6|h°˘AŠtQäAŤBb|hráG šč8"Ęš -Ö,hë–­m¶tµ5”'Ńž=˝ÔZOm=­ýiK˙ĐkA«ęZjkĐĄ·˛nő*4h×[i ćÄh3m[µ8uZT[B€$üřaK‘Â@ lxóR<[ $PaŘA„?"Tx0ĺC™R$xĐ Ç:(Ptɉ !ŹĽčY4ĂŃSha#K›p×ćľ˝V¬­k<ŁŢŠęshUß@‡7MŠ´§Ń˘CŹZ*ÝučÔWš]ş.'lŮľ˝|Űńk ŚŔ†pŠÄěůŃú;°á&'H±éɤů‹ ŁÖ"돤Š(B­?ŠbS-!ĚV)6ÔT˨•ř5›R%Ór’K·· p¨©–#Ę9® +*©«´Ł˙Ę©âx2.¨ŻX$N¨­´ŇjÇ ®AK7·ĚCŹ<CÔ© H苯&iˇĄÉ&!IŔĹCpĂ ěČ1!ěr˘‘jkH´ŐVŰȱ2Q; Í5Oc($…ŕ0‚6BSDňŚ Ŕ»şŽ«á®k:©n9[lÎ(ę mń8í„;´Ržt‘I‰ÎKŹĎOwëS¦,ŐT~ Q€Żđí4li&×úŁőŔĐ`đ Ť`ťiÎ0ǤěK\aÖ3/ęő 3pĎ>ËH˘`TŃQčz< [EµÓƬ Gm*ĐJ×P[Ú(2˘đ”„w·gݵ ‚»NͰ$đ˙ ÇôlA/TM˛ű+A¦JĐ€‹0,í`YŮ|ř`ß|Lŕ\đpÂ!Ĺ#ňĘkĂŐ%¸ä5™©ˇnKŇk/•®Ňž~»”;ŕKSó8…·x‹ô”Č‚‹«MA“Ó˙\ÓĄËĐ00iÜ””LR(2{Žs|ĨuŐě‰|óMY„r.á80Gt^óXÖ®!qęgFj[+†’0@!đA‚öÚČ&p¤“Ăč⤵‚ŕp~pň\ä´«Ď-‡ŚU2W7‘OŁŔ™ř-› ‰ °[ŕ>i¨H9oxFń‘¶µĽkqq‹Ó™â'ŹF¶ô¬zńzĄ+ĄG´˛A‚aą >äÔľ‚ 2¤ …µľ‡$Avy ÖRb1Ąą®AuŠ!Ŕ$+Ń\Ć}ńŘô’d‘+©Ŕ–’”9qÔĂýć)żËJpĆ‚.Ţ‘ĺ+ŮŢT” ¦ĺAŐíb˙É0ŕ_ŘD‚?ăă*’  “¸Č™lP¨Â± 9dC‡ą+€ŔKăÜü8ŞůŤc ©K=Łg:`9râ s¨°”ÓQu# ÓŮćĄsś[iiͬ˝z)dÚÚaG%Ě&đ!70“ „äé!ľ”H—¦ćĚ‘ o| k±v?]”¬ÂßÄ  řÔIŚ ÚzRne‰ÝÁ›q~bŰšBEâ’ŕi+ĽkĄk§ř´'$Ťč®¶Íf†Kj#>&Ń:!Ä «®ŇNsLĘŠbÍe!˝6! R,YA¤ŔK°¬ @Ť„5"N’¨HŔ*˛ŻŠdaßú˙ʢľ¶ÄPţ»ßýâw(ůµD~m`Áýµ/‚ĺ9—GFkOhTîy@›ŃLV0”{Ł5ł–©Ć$&$Đ×PŃHv2  ‹7G  “´$fč<”€0ku.yPYh%Ü ­ŰxŠ6~bd°$Y»h˛5Śěäm@ąÉHÖĆ5¬ldâđhPÜŠ—AŮŁě,Q+OQe˙čŮ©#B®ď…Hô—'n ş‘­•i•yČö˝! ٍšäç5Ť­t1棌1+żŹĚ’"!đcűřŃ|š#Ż•AlďK˙×fW Úp­ő<č©KŤjUźzŐ©nuŞ5aŤCÄ˙Ź,ăšYű¬µů @zKŻîˇfş~z(­4Lb+AÍČŐ^c˙łn ›üy¬hČk HŔHV«çx(–6&) +śŇ‘Ä»%цwË; mh,n yK" ÄÔµşŔśŕ ŔÁN |á/¸&lQÜy7T Ş8®ý7K@ÁT´Űhňüą®nčή+€ d!‰"N`ÇžŞ e hÍJlC‚îT€ş «!DÍç­Ó“ÄÍ@™ÖJ$â-o}óűÝnĘĽ%á¤@*)¶¸ĂN+Ľ× Ç€Ö±>p vH—ůYH) Ş »Y!˙o’ÇŐ—'Љ©6KI‚Ęç'‚ô9PĂ® úĐmĎd‘ÍvÍŞ1†€޶]htLńI;äO3@ŃwśŞ§żńž÷ľě_¤ó»'^O¸vkýĽ^;ŘUq‰KřÂB5nÚ‡Féŕ‚>.Se\Ő5®ąjšĆ®yÜ` ŇŤ•Đe 3Ëzh±6Hđ’9Hz'/ů8ŕŇE?iŠtä†˙Z'żŃEž(Ŕˇ\]ő­_˝Â®zC|Ö†M®Ëhnźęz!“+!„˘m-şD˛ ‚AľĐDÜĆ Ühvrh¬ČfúhhZĚtć'Ć(ÚËö.Ž-ţDb€e˙jaPÔo(Pä,ឣfrd[n!őäogâÎěYd˘mŘLÍ6¨^č%ţŹa2c…ŕäAj"ŕ%hI™Čçń>d7B F'6ҧů2Ć|Iú`C´fŚ—€ÇZI˘v{J±älă;fĚC™ ‹i~äD$^#ĽęČÚŠ/AR Ń.˙¤ a Ő‚¤#P(ĺ e w¤ m‹(Ř/ěîëöhpěÖĚ&r0÷ Ńz& ’±Rq…”…Ź”é¬T+«¶ä. ú’-MŕÝ¨ŻŁâî™-2>Â&ą„?v¬°ü‡-Čđ‡čH’E–˘;f`ě ;Ěowrä!Žő´îć8`á¨RţdŻ'-Žö’KűňOň mzčt(‚ż†" vRK€Žš 7đ LŔŢ1O˙¨‰N2*đNâBB±R€Ç6ŇÍü¤ť ¨@ ‰él!Ü ÁZ¬Af óü«zéÚŔZd"9ŕćŕďલ"mˇ;’ QÍp˙(­Í"ÜxŽk„IV ‘¨f©P¬ćδ`.%K€SähVBŚ5‚'W( "ĂöOíj"]€Ň*! Ăţ+ßÓ*’âä ż¬“1mAŘE¦Âęäďëzíý¬’"±ÎµR›zđ#AĘď/ĂtĚŽ b$ĎĆ6Ä$|¶d$ÎłdG/ŐÇ-kŮd"p/#ËřĽQ»±Ňçě4RvśŔd b (ň`(˙+2łÓ˙ü‹ZĽ#!ó‹żAę‹Ó6Ó!iđEĂŽţ0ÎÍĂÖ|íř‡#łQÇv,|Ť HK@«ĘR@îLcNB#~Ł0fůL1YhňI÷3šíJ@Ă+z\ C[ l † °Ŕ˛¨(ˇ+ŞĄ-ÁQ,!lD ĺ4!ó@2AčÔNńtNő4OďÔO÷4ŞcĹHL€.÷tp>mďžTqÎ×z- !ń TGŞp ‚ÓŘ d@˵zhşoAĹmůxhĆÂŹ~Ś^BZ1Cc €‚ ° G®Ĺ ?©%ˇe¬Á®VD,A~5XuX…µX‰őXU+Č÷˙40K,“™ósŁ‚ŕ _"ň4'í‚b:b8m¨™6‡Żˇü®S·Ä,âT!FCj´'Bľ04j`CmALOn¦Ł‚†BMőFE~âČT*aFłČvđY3U%ŤT5^g„f) á¬Ř0A´Š5J¬.B@tT©T%FkH݉Bł±•TE^5f5_© )ú‹żTo¶AM—HEţ‹ÓĹ`®×Ŕnán3Ś.˛=Ň+á3 J˙Ęm°VÓ ¬•’*༼mĆčAě±`QĽĐk˙Ś$˙[ÓçLŐ- ÝŔdŔföôµ'˙áż6SürUEVôěR’Źé –1ŕë4Ůł=ŮE^Á##o±U Ýkzú§#±µW t¬~[•pH d8Q§dĺůJ÷Úh‡Ă‘&>˙¶f S:ëK3ĺŔä  úM”cWĺ@RnDG”ßÄD]t!„öྎ4ëŹö¨nmrë©+—vz óöŕ"ÍřDv 1Î ukťĆYh6Éö~$fN¬U±†~¬ĘâΛҍčf  ó®N¬Eź#‰ÄŔüëÝŽ1o¤3Ďó3łîE–ÂŃPk±Ž„>ťV¨l”˙´/ŚŔ˝¸r5˙f#k“P »1%ť´5T§´€}ȧXÓr“Hş‡‚Îđśöć72Ď*¬$Wťâ(5iRň pŔ‘ř•8‰™x‰ťŘq(–•µŔWV[łr%>ź–â\s°‹ĺO:ĆG-ç&őŘHn2J c°uŘŇběŽ>É#ľ€čd€ h`(¨ :ó椞#1Ćď’¶3oĘĘ9‘ŻA‘±ě‘Ż,’y EâV±uqGK{a'xÂĐ.b s9Ă8{ǸńŞ'ž»{"ě^ ŁÓĽşÉOzxaśŔ4÷ÂÍÉp†•‹áćlHCČ ‡ 3sÄĘYCia&‚°eNu[ B–—É)/t\CŢ4¶ ë K„âťR˘˙Ţe‹tŰbÇŘ,’:Ďéâ‹Đ¸ś˝”¨XĹ©˘‰—3"gnyŚbű¸Ć+RQ-E ăů¨¬‡éŇé8ŇŁĂ‚ Ąˇ3šE•ä| A°Lč)–CęsâtĚ„‘ÓE>ĺÓ[†Zˇ¶h¨AĺC2¤¬ţT–[í“WŁĘŐŻnŐ•1H8_Y´$L0®Ä“8§˛öp›VőéR–»Ćő…Ö\&^‘#Ĺ"â…E šKM=4Ř`f/~¤Ó§SFâJ‹+E\NJXŔ 6§A¬b%RÍzV."=,_Ű–É^v/ú\ĺ` JŹ.V9)ÝŁAĺÂĎéđsˇˇĽ$r<ąFŮÚɡß)ËwB»ÎTń`?\®sźë¸ćâş˙ÔUju&ÝĆQÜE ˝«Áóµ Ľz#ď8ĂλÝáÄŢőşo(´› Ź×ÄëĄĐnŃń`yçű_˙ę׾Î/ űy`îĺwÁf°ůŰOň-˝Ö8°…Śá _ çmŻwó›Nä‘ĐxÂCŢđD,<ááŃx&–Ţ6\Śâ§Ź2®ńŚoc šÄ;ޱđHh0éŮ„0f1Źů©âYÉ>&Ń“Śc—ĺČ5áöh0§ĹďËň"hâí‘0„^&ł“ďż1«ązí#ńó` ľ/C™vÄî㤸9·#BY ás=×s‘ŕsĽ‡mfDiR "UćÖ˙o”G’˛Hësn Vx–0Ł{»n°ŚšŘLG<$”g I° *zľ§‹0ŁŠFy%RF˛„P«&oěôa~™×s»L'ŠčşH‡GŘ–@yz&Ex MŔ‹>׹>w d¨g”G‰ 3ň“–·# u;\‡0Ůâ§w(ĺ‡+Ë×€i•’@™bçj޶VŐx+í¦š c Z;¬“‰›„yßW‹µ©777DŞC† Sśą;šv0łeV0kZ„N¬ą;¤sa07· 7' ‹ŮsŰ` ŠX§>‡miäŤđ©;ĽSJv!˙ úÖ!ZmL%GŘ'—XH‘’ 'ońzĂ„iP„KI’w\—G˘Uĺ)0'„ɡ!zvyn°‰ä…Ĺ·i‘‡żĆ'â¶Ĺ…J?‘Áҍȧ‘Ç0.JÄ$j¶•D"E™§”¶ 㶤ŤČ Řµ °6ká~Ç(€Q{)j|Żu qp Ľ×˛pssh˝éA‡”Yzuˇ<ÉÄ~K,ÍÁSJ{r(U4o·pz‚´w¶ŕ‘0Hą ŤPQo¤VŽEx.rm…ĆWbT ©Nn•W|TRf”ep1'B'ŕ‘¤aą mpŠz‡”HŮŰ ”ÉEÜg,÷V žS˙gŶćąÖ¨R[Ĺ7dW…ĺHĄFmH$mó¶Y(ęUa—EŐ÷W¶´Ł­gËÁH gőzË×WŇŢŘpW,˝RqwB†(‚pŤçCgáv˘€Í¦+č×l$Eş"PPiĆ 0Ň(D4{ći¬˛ő§wR/DLťyăxVbwgŞ:KőÔˇJSĄ×J{ąC‘7"¨I÷OЧ®,mÄŞŔš‚lâ—Ţ”EšČ&YCp-UM[řFË×"‡Ö_…i, ÷®ÉšXű'-™ZŁJ˛|"MŐ”éVX{bYĹQŞV´y7SpzxÉÄHë©RÄ+>ŰŞ_tFgv‚S˙” ۢ’şkN+KÝG}Ť‡\Öˇ~"UIŹ5r´ők´vMW q•诅‚hůk©Ą˘ńGŽéD;˛S;§Ăź®3¸su‹ă;Ľc ޵ăꧏľł8¬ ¸+¤eĘ:˛ó:€!®“cťłS;§§:†K:‰ű¸˛:mJ;¬są”ąßą‹‹·w‹·¤Sí*¤’ąŰąŞŹó9€ :¦«:Űđ:ĄĂş»ă:Ş3śŁ Ľłű¸»›Ó°¨v˘¶C&ĺMR—0q¬¤Ą¦}‘SwĹD{W¸t¨¦şTn®µ­äI0ęÇ\ŐZGŘ륹âr㻾ŇťKőlćÉkËë!âŘy”"Őú«s±ąžŰąWw:¬şV÷·lsŞ«ş |uÔéŔA—»ąŰ:ĚŔŚŔĽuĽŔ±»Üąś»#üÁśÁż“Â\Âeşą,¤śą¤cÁ%<Ă ĽŔŠkŔ6|Â’P (Ľ¸*¬ş9üÁ ”=ÜÂĚ©F;fox1.6-1.6.57/doc/screenshots/boskalisnite.gif000066400000000000000000000673111326741342000211300ustar00rootroot00000000000000GIF89a,á÷UŞ˙$$U$Ş$˙IIUIŞI˙mmUmŞm˙’’U’Ş’˙¶¶U¶Ş¶˙ŰŰUŰŞŰ˙˙˙U˙Ş˙˙$$U$Ş$˙$$$$U$$Ş$$˙$I$IU$IŞ$I˙$m$mU$mŞ$m˙$’$’U$’Ş$’˙$¶$¶U$¶Ş$¶˙$Ű$ŰU$ŰŞ$Ű˙$˙$˙U$˙Ş$˙˙IIUIŞI˙I$I$UI$ŞI$˙IIIIUIIŞII˙ImImUImŞIm˙I’I’UI’ŞI’˙I¶I¶UI¶ŞI¶˙IŰIŰUIŰŞIŰ˙I˙I˙UI˙ŞI˙˙mmUmŞm˙m$m$Um$Şm$˙mImIUmIŞmI˙mmmmUmmŞmm˙m’m’Um’Şm’˙m¶m¶Um¶Şm¶˙mŰmŰUmŰŞmŰ˙m˙m˙Um˙Şm˙˙’’U’Ş’˙’$’$U’$Ş’$˙’I’IU’IŞ’I˙’m’mU’mŞ’m˙’’’’U’’Ş’’˙’¶’¶U’¶Ş’¶˙’Ű’ŰU’ŰŞ’Ű˙’˙’˙U’˙Ş’˙˙¶¶U¶Ş¶˙¶$¶$U¶$޶$˙¶I¶IU¶I޶I˙¶m¶mU¶m޶m˙¶’¶’U¶’޶’˙¶¶¶¶U¶¶Ş¶¶˙¶Ű¶ŰU¶Ű޶Ű˙¶˙¶˙U¶˙޶˙˙ŰŰUŰŞŰ˙Ű$Ű$UŰ$ŞŰ$˙ŰIŰIUŰIŞŰI˙ŰmŰmUŰmŞŰm˙Ű’Ű’UŰ’ŞŰ’˙۶۶U۶ŞŰ¶˙ŰŰŰŰUŰŰŞŰŰ˙Ű˙Ű˙UŰ˙ŞŰ˙˙˙˙U˙Ş˙˙˙$˙$U˙$Ş˙$˙˙I˙IU˙IŞ˙I˙˙m˙mU˙mŞ˙m˙˙’˙’U˙’Ş˙’˙˙¶˙¶U˙¶Ş˙¶˙˙Ű˙ŰU˙ŰŞ˙Ű˙˙˙˙˙U˙˙Ş˙˙˙,,á˙“ )$  ",xp Ă… FLŘ"ÄŠ%bśŃ˘Ć‹ ?ŠôH˛ŁIŽ(7Ş Y2%Ë“+GÂ|éRfÍ–1[&QX"I = Jt¨QˇH‹&=Ş´)Ó§KŁ:• uŞŐŞX©j˝ş5+ׯ^Ăv V*Ă6m¤IÁM#$ŚÚ0R‹ ,V±bC° )Š đ+ŘoĐź€IŚ˘đŕĉf|ř bĹŽWŽś™˛Ah%` ·ď@F¦SěĹË( 6‚[ż.Á†Qš¶IPŁ`…¦ ĂŤ§ ň±âľŚ /n9ňÉ%–_ü‡űîÓ^Đî«»Žüé™'ďÎiţyçĎW»ćşď¤9ńČS?zę®cĎşöÇű¤đAa+Tşĺ,›óNÂwĎycÍŻ_D‘‘Ő7Pc“˝_e A€â·˙]čq.Bŕ˙g¶˙‘`lj;ŕ@·1ĐEg`äҦą9PAúó_ë¦AĹčmôÝBT6ňŤ€DáŰVCµąĐ0ü‡öVCětĐleJÚ˙4Č7ÇA8H@H@€ý„ltó’Ůš…6D!MŔ˘˛9PńŠNCŞŘĹ(|Ń‹b4ٱ(‡+r‘ŚqŘb­8Ć6HÁŤ€÷ČÇ>úńŹtÂA°DB ʆ@ Ü€E'4á‘Mpd$)É&¸’“Śd4)ÉN6AńëÉÖž'ŇŤ¦cÁźęÖG=Ě-ä:‹ŮĆ\•&Tu+0; qÚ¶"«}Š8ÂCꋬĂŚ!€@”äd™ł°m-°#ť F3~± Ô´ć)ĆKn3ŚQpä6ż(Î-~ń‘ctŃ)‡<J|ç›°G"  $Q˙"č‘rŘä&•ĐÔ EčA JĐ‚>r M‚$šŕ¬ť5'3<#U䂙˦HłNp)Ď’’ÔŹł°|iËíh ÇLf›É4ŕ' ŠQ#­HE)đ´Žfôb©xM2Ő nÄ"?ÉĹźr‘šMȧýYRAţ3†ZEŞĘŐ`ň‘udC›°Öµ&A’oek&ă*‡6lki rđTR4á~ń+úb7űĐr0%E+® č…z!ÂŹŔŤ|‚窰¨aČĐSžđH¨.vÂéÎüŇ$ˇ‰KĐojs,č1‰D˝Ł·¨T¦˙šŃ§fĚ­m› ÇÝćŞq€Şnĺ(M2ZѤU} >±ęĎ«š”žzDH D4\5†˙T(A7éĐ…˘őˇ =hwZPFMUżD rBXM‹ŁĄLZ:dÁ””Žeôk]féQż@„APD(L–Ns›¶¨l=¨é–ŐFd¶5ŃEJUCB˘iÔ˙ô§Ćí­Rk[EÚît›%ÎâNďEá¶ł¤†”jeüNŻ`ş7ľq>e [‡Ş•“lh\żëăMÂ5’‘8U´ZČhOM|őÜ_z˘ůĺXKk Śá"`D‹µ§?ĄűĎ“ÇŔöň’sÔ„†ď$A˙e®‰sŞŠ¦6ŽşĆIŻL’đ[Ą†‘·+Vq8sëçB•·V¤&­ÓjBŇ'MA¤›€„hFZ ’ÎtíN‡Đ͵  µk¤3˝ą”.­ĺ.DÇ+Wń™ĽŚ”Lµl‰´SAFŁ?Y])“^‘Ä7ËÖ}YA`VŕFD ŕC ‹Ő “Ţ˝ń/m“űčP&ÄŤpmÓ#Qs»Îmâö§H%·…KâDĹ'VôÉ[ŁĘAn‚ô-7ěŰ ův‚ř- 9ü;ŕýŢ·żűýĐîv·“q%/Ş]íHîVĽ®Ł1Ťł ćä !†S_kNŇž&‰•Ŕ¤(˙/é CÔ-§\s—Ó€-HČÉ ‚<’ŠŹ#ŔŽ÷Îc1ŽTDŞms‹[ťĘ‘¸¦˘ąČŰuk±ŃęT÷O}JMu:˛ëŇěş%‹č-zÝŚH˝äw<ń·ŞúČgµB79Ń»v¬˘!Íë<ţµŻŤ˛Ę>^1Ł"%ĘŘť‡Ü#âű¸x=şń†ń(@dZ™¸< ŔĄŔ¸Ŕ.€řDňäA>—ŞŰF ÚŠN­­¸e/uáŞ{Ü'7ÓĂ-…8ŕŰě^ô)×·ößSÓß‘ .ńÍŢp‡«Z“ŕőq«· äWß;äíY^AµłR^hS¦âT˙Ćż†DX’ űüą€`6T«ĘEVőiŕ}Öp ,›<6?y P€ţGţÇ0 2)@H ° ¸rhfGVu±µn·ĹS¸•E˝ĄSlDTh´[B%u*&FrČ'p‘ÔuűfI*č{ŘÔu^äHůfIAĆIn÷cE^•Ir·IW>3ÄÄ1~%J;[§¤>;q„—CeĘ4˘u&€ä_¬Y‹ĹFT%YűEfţµUB„-°y”G†@yh(€Ŕyyä řŤ'O<ĄTĂeGG÷Iv‡żĄSB%\I×zçäF·e[n`pÁapá$M ˙—pÂwI˙F|áÔjÜIăUqD¶v WB&’ k[rĄ˛xeÁˇ UŠsĄĂ2$đ‚±|~€tU@Ŕ»čOú%műEř¤Od `úU3yú€h Pyk82ů‡ €îDH?·G$H8T!VnTôZ×z°gb~¸bčGřÖ_'|‘N'xoÇTďHiw‰Ż†P ĹŹâŐP%d›řv%čŠŔdjL–*ŰWP+ăJŹa3LŘ=§$x@Á¬K$Hą8WĹ,ňGHTµ_`f`ű•lUµD„(š·’šW€»€ Č€7†Ó5ÓĹUz˙„{{BU\‚VT€ŘtŮô“Q G‚]„o‘Äo‹¸”Č·ExIő¨o1hĄęÔŹf‰Íw‰˙¨ś RKÔ–1Ů'2Ç14F4Ĺń3߇1DÓ©ty—€¤\$ UŕORń´cůt“KôOf,Ŕ,pĄĹ‹ą,Đ(°HĐ€.°–ą§µ—y9šÉG¶•‡)u´Q—TM7‚±šîéć{d×uÁĄ•úĆ[Ţ„‚łipŽÄpŽTWI€ĄŹźÔiŐpţjţřvEV‚Ú˘4Ń+«<¦¤>j2Š~RQk—ă!W&&tr(7‡~ÄŤ|˙ÄA1@1詞é9sç - EGđöů{„Ub5]Fc"(GJ÷nâ8Tâ–T€Ř‡ş7Mn„Ž( ę”pN›^şé—›a|ŽÔuU^IpIÔ×pו" }9h ł@“KŐ¶„H4J(2FČ23Z>§# ˛`r+ŇKÁŘÇŁ«čٰÔ!ҡ*,€y,™y—Çy­CH pź8nN•b' XŠĄŞĄ:{LšŻ'®éE—4›´…‚+ˇd•^TŹgv>uI;Áj:WšXśkGdWW5ĄL۱}łÄ4ω*Ěńn©–/zwá)’˙`W©—Ş+4v—˙4`7c1†’ś‚ĐČ”‡g8€X€P–O0÷ ž€´[˝§_d‚ŤZ‚r u% X„‰…o6u…(FŇĘ|÷‚á´HĄ¦oš‚´Y‰1E—‰IP Ů b™cçjŘęPłÚ„§(„GŃŁ;ѡŁ>€ŐWŃą®ă¶ Gg)ş%)RR¬‹’lU¨yÄ& ¦fśş†g(°+€ŞRó ő‰Ş Ą{ą—ń¤OÜX{$vbEŘT[˛€Ł8:‚FÖŞAUbjIý§ź$-ˇ·±Ç[łmW}Q˙µşđjDf IС“´ŹMPwΤŠCÓ!QP1ÂXS–(đp ‹iXjkňr1˛d÷e`Ľ¨0˝¸_‹f?çD,“y”w° p[†+2H Ą*pS0Wp€šé\zt’DgŽčŠŔ*ŽpoXj¸XÚZ9Q‚‚gŞ[G7 Í*vhŞ˛”¸›Úu*«•Äi˘<ë‘ •BÖIž+§Řj«Żę…-éUQő<Ń<€§9FX;n%;€q0ń’0y÷ôJäCÖu`„ä‹1d`¶DcČ’+y†0Ŕ%^[ °+°îD“Ö5Ę˙EthToł•EŽ`ˇCŽ`‚Y$˛Ť+޵ŐFăĆFátońčo¬)v\—v‘”vşI|‘„MdŠMr5wśř]‘P %W©öł«ćrŕR ˛q·´^Y¦q~KoIxÓ1J’°Žú-E˘&qĂ›%•lfŚĆOä_,Ľr’Śy6śĂ,Đ,RkŞŮ›˝»c„„Ť}tNČ ş…{fÔ¨Ť* :)ąT§F7IS™›iˇ•h›NPĹĂ'łfw«Ď´šh‰NP µP —¤•QP s´ÇëĹ„é#LMřśc)µc©^r‰(m°ş¦LÁ2L†1č€d˙Ó1)Ž 癞Źs>L2v Ä Č-6šLLGuEŚtľuřg y|¬)nę¦\§&p*řIeЬ—$•reśu§c|ƱP ŚëđË]lÜ›ŚŰłśĂű)Ó>AĂÇŃů¨ôS6em mŕŽ0X‚W&@tKŁ)§ŞŠ·G)©—÷©Ň»y “™ŘÄ c€»—ŰzňfGV¤trUN‚uCK¦‘á\-kĐ2X‚úłfz|[™‰ÄÉ]mg hěĆ%PqŃ箕–¤¨5“-ëősB30n KHÔ›†Č‘wLkëá2˙˘*8iRÖµ‹űĹlHf‹ŐD©r¤ëڠІ—W€=q!śěÉ{D“ě§c {*ĹyčĄďFGJ\ctoŽMňżą9IúV¦‘$ *+•»‰•LŃ&*š(‰něP_ÍL>!—1ýĚ۱„¸ŰP¶2…9HH»˘¤’Ŕ„r9ĺJŠQÁÂd$˛)—lű4Vh`Ě»D«XBmy;yo»¤ęszKpÚK™ČËUtÓń6FH5b=[:Ůb»çhľ'‰,»|´‰ˇŚř۸I¦_L|^t*\9wp÷uoĄşq|QŁD?­«#}WÔ‚‚Jڱ’‹T˙U¦(JTFŽjI»Ł“úNаOîg’zmI6¦¨yjx†gxÔt›Gŕ/ţ±Íősů„]{häfb˛M ¸wŐ ę ˝‚iÍąŘÄŰęäŐłąoŘäodçÖ }#š­š5«×ÉLs\€±:Ó!1Xz\:Ąę»>,eŠ- îĘ2‘0Ţ~Ą® ']_“3)G`;BĐ``1śląČµŃŰΚdž Łßü= ÜFî†á(Đą%T\ ¦Ľż“4ůÖáKYĐĽĺ É·°I^Í×EćËŇ÷h·Ńµ¦-ˡ*Łâ)€‘3°äçłÄ1’ŕ§2ŰŚŠ˙;ÇxV1»¤f‰śrah¨ŹÉ0°Ă,7Ś1€ńą9„Q±$ž´Ýg ›T UjEmŞĹ´,á h\‡Đ]¦Ç ëX4ś^îëĐÇÜŢU‚Ě9kw-Ç> K›Ç×üQ#ŢLAŠÖrI?dR9 sjk%}!*Ů8tŕľâţs=‡cL¤zÝ„@ˇ@@ îľî…@ @€P DŔ%µßü˝GZ5±Ó`9yŐôFĄ}h‡VšźÄŕ^7Ëň¸ĹÁ%‰úfG.ˇŇäŘô||śd%Új] Řątâ}j›Ą´Ď‹Ëž>Îx=qťÜ˝Í™˙<Ž óSV%\¤‘ąKÚŃѱ!ĄBBoCTôBż7^Rŕ°ôLßôN€€ [¨ťÚ±˙ô˝[ŐłEGŞLTSwŕZd§·lG°.Ŕú†ć\‡öLU ßDövvĘ]ŚdW„j*Ů÷Ü~Ę4ŻÔLł+Î!ÄôÇÇ»áр&č/=•Ť“đă"K    šßů›ßůŕ@äO ¨/ůiĎń§—9IŽîvęă&\?UmjŔú¶żţu2«Ď2Čo|Ĺ”xäePoĆ\ůpŞ‹´â¬}Ç®W1>X¸»ěÁă»JíM „xŤ˙ý.ÍJKeI 0­5Óża<ß3é HĽGŚpUďŹO×áe°ô€ `đů€őPŹ‘„€ PáB†šDi"b”8M*ƉŇ&c7-JyČŃ#DIr"şi"ÇID–N¤´y鲉ˎN"É©™ŇI›•&ť$iŇčʡ3 54 Ń JŚ®t")‰HJ (‚˘ęŐ¬ER‚HŠ­_Sd-6IÖ$\I|v,\ŞZ‘Ő 6I®Xý^uC+Ř$šŘ-śDńŕ6$Ň0bèV®fßąZ˘áfhĐ D€QhDĐZ%8`«Aô:v˙lp„ş&xP@€Í˝-n„ůĐ D'>´|b9Qś¬”Ő§'qž?çXŞ7>UF¬Žň¨ÓźAËŹOÚÄ)ŇňHş™ÚÖ*V¸}íËĄí^műN+®’čo,šHËŞ$ěO–6âęO¬÷R ¬ţú¨$đŻ4R@‘FĐ`Ł2°Hđj¬±ꍡŃ@ŤŃ@‚*«Ä*wäqGÚ! $x+č …Č …@@‚…”î!Ť6ú(ą—›’ą”fę%îf ¤ž¶”.&ë r.8ˇb逸Ül*ÎöČKB“V¬ďŻÇ:m+úN”kĂR¸‹Ď˙˙R@A¬$Śë­˙sĬ°Ŕb4, ¤Ż&ŢJp+ÁęJ«±üł"Hč ś¤ĘĎ"Č „ 0Ȱ•Ö[m­µĚ8L‚‚N0Á„XD'JőI“*ڸߤ<#á ŠĂÎážű2:Žšp#L¨† ·Ť’Đ %ńú‰Íő䬳Ť Ü[(9Ă/Ô´.łlŇłÓŠŃ-!ˇ4¤P±˝äK^I&A’&äÝk«FF˘ ‚ ę-°šPqŔ·ĐZŃ- OÜ­SWfV®ĚM f˛Ú"Ëă¸(„Š5E'—…qY…B’¤‹®e©"Ł©Ťâ;'r %n˙ÁÝ)ş3ťűÎęç¶św(8Ű{S© îín)÷ś#’“ýCKĎĘV”ď>@ lÔ †+Jď ä…Ź7P8Ž%iăÁ  [¬¸Ü¸QÁ6UX@`·"ěDŻ*ÇodżútŰ*Ď«R1 Uu0Ď +yA   …`uu śź¬Č¤(¤]ŽJ*%‚‰'r2‰:ç¬ .:žÂűî;áQZÓlôćś·]ő&Ţ[©•ŕ KÖDőÝ3?Í9_¬Ş$1śîČÍWě® 9Lˇ GŢJA›Ż >ÎÓ ‹¬óŐmĘ6÷É03ł„¬.˛˛ŹUĘŇżě«>ŔVë – Í8É–í"˘‘˙áč®$Ń™‰Ndáq‹'â*I˝ő4ó ĹlőŠÓôŕ´¦®Ç –€čNôŻć-'ËS:9Y<Ś@ű"Ł,T!ş•@ŤxT˘âÂD¸l1Š€Ą­ôpTöCL_ş"–R•ę,ś˘fô#*˛Ŕm‡![bŔB„ä¦H ŃëX””l$JĂŁr U9ÄAjÖÉŐ‚óëĚ$;d Ő*"Ă•¸Çyîšžô4d‰ˇ1ŤK ‰đăĆFĺP+ÚĆ5HŔ—»°‘T$ 5·/Últf"†´â/ĎI€&+Âeě›ń«p|ŰW8×§_˛q‡âËănvs$$˙+!$@CůX­-çJ!éHF$!ě@‡'Î1'U;µ$:ÍyP{š•6ĄGlě ˇTřőL0¦`űńŐ˘B1H I¸†,*Ö!T/ ˛J$á Q*.w™"rŮ– Śn• C@€’ńd}jTćÚHF­üi™bÔ ZHF—\$V°‚¬,eőt!BsHí”C%h}[*áČKŚ—gťŕŮŇ˝žS®ęĐ0NďÚ$Ř®ĂőŽľťĘ/đŃĄýiC#Ü Q !ćKA5Oét#Ő]F–Ă·Üh¤ÚáL=ŮĂ.Z…Sě.{FĆâé˙_-lUŠ ¬DŔ˛VOYEŮíŃ!·+ršČBĘaś3L®‡ÎăĄI;Ú ÓL¬ăĽéŃ+Nč©­őÜcÚ~Ő€lK”XC&ľ[.±.IHáRú˝ţnąňKif7 ÝĺSłŘçŢÖËen”dcŠ”éż>W”Ƥ«bRŮH Úł:8ĄĐ‚6 kŞR[âŐ¦É[ÝqJîŐµ¤x-†é©—&gRČ‹Á͇ëiňT*A׊„â(ĄןAeBU삤—#fh•M45d±‘íł-(3,ŰfYŔA “®ŕ2OSgĆÍ*@€{-›Ů ŐJ˙dU©ł-č°°&ŰŇ xx’B´mđ)_«góŇc6±í¤“=sY|©đFč“kŁ \ZúC@íňa˛ę«}ü2©°ÜHS±Ď,őb!éîł»TÁłËţÇúŕé6bW2ŘËńĹ`Ż{3ë$kşŠ@Íî,2śŠśË9ßršsÔů41IUL-i¤›V’`ŰXÁ64‰ŤŔJ Ž4”ôÁĘ‚8¤EĹYQA‚.‡"D„&(tŘ"ÖK ‡bs(A|‰ú0Ę>˝tEgu`„yÜED·¸¸féQöE9ÂĹš(°BްSaýl!hęC:’ÝE$[桎 s"5G˛mÚJR˙śĂÚxztę2'Ű0gY­-hnåض–Ĺ.<´W“IQ‹â׊út—« H(–ËËWč7bóŁćśąĘ_ž™Fç1W#O˘C@!J"8ˤxOd8H–‚!3˛5Ć!E^†+ÜLäU5–ŕ¤ëńśĽtkđ{ÂĐ& 'Ő?»=Ö3ÚřRÜŁzŤ„†.±ŮbAPdˇb%qULÜß3ŠE3Wbjń´¤ ±{1Źçq­Ű•ČO[˛ ĹüF5:EP;@.:̲* r#¦…2P®.‡ĽŮ-^ŕOwJńlők¸}a&Ńs˙/¶yŹ`k¦8žv8ËůLtô«Ě.Q@!_AŤ0‹vyh?BaQ#PrH™âÇů/*L0Ź9LŞ3(JŚ[`^Ň>aƤ9žĺůőăg›ˇ  /:|·‰ä‘¤äśNnˇ »Jޤ”°Ž.ɲ˘@8豤.K‚ű:˘~Š‹dÚ.O1#üꊳ»Đ1Jř1—Đń'µ€Ńą®ąŘ‘^Âľ°‚‹‹aš;aŁGY”`"łZ‹,FH6@ČHŃł! Ęů8‹–ˇË?ýSŰ)-đh2ÖzŽăąt’XІ|¨r»§hŔ,[@ó*Fă!µ·8*ł‚˛®˙ě5٨=k"Ś’%čj6Ééń5üág Ľi‚¬"Ă: A6@V`„6`Ęi‹Q9Ħ’1¬Ć@Çh"0Ä©GĽśö+Ł&€`ŃcÂŃÂIX˛¨âđ°0‰ŕ‰&Đ…X¨…\¨=VS5ŻÁ¤VsŠBĘďÚ®Sjź1  Ë5<Ł«“łZš°ńi„Ě襶1Łgş–,9›“”±pÁd›Dx 4H‚JdF0‘ńz,”îJ?Ď B64@‚Á“8ňłłĹ›MňGHjY¤áŮš*[Şí@-ďŔ/Ö+Š”ž{2¸Üsʇ©˙ňBC3"6C4ĘŹ ©(…YĽ1ş¶_SŚÂQ6JáĹŁ˘ŹŠô1ź“Ű‘¤Áϡ>°@Ťéś”#p+)ł®ŕŔâ›)ÄA÷sÄ~ٸ ˛/¦tĘä°śŕ(CŞ)ˇ*Ł븯"‰8p“ĐUŰ2ÝcÚ˘!}˛"ôJG‰["ŤľNËŕżĘ r‹łń6ćk ~z‹»«ĚhŚĆ€ŞČ +>ąĘŚ0 e„©ló=DeRÇvÇÔž­@©¤7ĺŕĚăĐŁ‘YśJ1ń’ž€˛R뎦R ć!8˛S5‡< ŢrĆeú$ˇ8gŰśJ1É1Ś"ŕ˙ţ`ąS‹‡aź K3‹ĘŹŠ6ˇ …qĽPR‹9|, ˘Ä<Ę2â>őű“ę3$šą›+Ś™S i±Śčމŕž{±Bpž0‰Ą ˇt±“’“(8湤6‘Vc‰Ú#ŻÚäH#«đi"˙ń§q«µ‘„4Ř®úĐ0“ꥳ¨‹Ń”Č,>ťü‹]ÂËúˇ_%ď ·E›żčúľ ,ÂŢ଄`4 €Ď$űş¦9—F’‰pi )ى2-Čň8-";Kb .#Zó+čZK ŚłKY Ú$ł˛¨‘¸ń Ĺ16éÔ“ÄK´ ąśŮ!$h‚E1˙{ } L(Ĺ0—Óż…Ŕą¸ D F(D{T?Î@Ä„ĐSśź‰HĎ+‘/ˇ-2“ť '/ˇŽţŞ˛ű¬ŠŠŁpGx˛ÜŞňŕT ±ş!ľĆüś]Ł & ˘4Ő°ÄŮĽçś@÷±˘ÇëH…ůC˙е C‚ŔH"ŽÂU:›%Äh]ŤłˇA?ĎZ– ´·ř"` lrDQ=f!D€FDŃhéĚoŤsщř´"WÓL IŔOy!«˝Vۤ‚ă$Č!ľYűPÇ$7ň⢖ťş”Ał Ľ ÷ŮŇúµü襨RÍ©ud”Łüp˙"ÂKhc ý™IßôŚMˇŠžJ:lb BZšGĎ Çx,FČÍhřA@•ź$‰ŕ+É–šđ‰“`T.$'§‘YŕÂÚ"ŹVcMä2°‘ŽH(І#7•şLüp<`+AŽÂ¨̨ A®Ç˨ŹÔ<6]1ČÁ!¶ Dź--ŻI˝[łŹkßTŮB<ÇńôŚĎč "h’JŰ ĆěĄĆk !”)Đ&†h’ÍR’ne B˝ li¤«ÔŽ~‹‰¦Ş˛SW©úB @8 pţDR˘IxR~A4 ÔP·A3ˇč3XúŔ¶j›Iy si»ń6GILAÁ0d%4ĘŠÝP˙ŐŤŔp„FH7p„‰ŰŹ٬Âq9éŚz„7lj‘:Í ´ĐˇRĺ)ř˛‘ÔŁÉťî8­/™OR;!Gň01—XäO±|HKŠ’Č˝†DŹ1,]|˝ľ?ń-îB”T=‹>Ľ0@Î4š¦é#óm2®ëQ´ŮĂĎťčB÷°ß9Ź•Öł ËéId,©ąąü°ŹŻ‚CÄâ*RÉş2L`Pâ@ĺ›Í”ëŠĹh«)Ş ÔýPź$ň™(㵋¶X4 €ŕ¬˙Y®  dDűNűaâpëŕ 1šŞ:*‘ܨ٠s!.quM ©˘­NćśÚ¤w-8 >ąk»5*©!24ud6r¸\-ŕ|ýł:3¶8™&FÁÍ7EŻbX ˇRír ­ŔŚšë9ńÔ G%G&aÉ#]Î,—+O˘­{Y!rq‰&sŽEuUÍŰsŔ˝‘^‰L-¸¨@;OFł+­Í°häÓ€S+*<6<˝Î\Ą(ÎŐÖ5Žş–üL KÁy°­0—Ő µ Ě®X6ŕŐĽz,PvK7üPF"r4,z$Ç VąŢřÓ$a˙  ’(©Řń…řä 0¨\ÓŇ-‚C¸K¤Ř\ŠY“léží*L@I»1c `éKoěÄlľ ň@…MyĄ|=©«Ýß ßÚ!ąĘic˘µUA¤FŹRęěŕ—ć9gQ@{ąů@hVRc % (ŤAý´{ŰźŕcwÚ’îffyͤ{‚ž×Ô\Ö ńľ ˘€a´GŢöIç A`« ŕ™Ő& rN<6lI …Ů%b#(Á‹6´ŐÓ¨`G¸ YřĂI~LÁÇBĘ)ÓŔ)#ü`Ě B•ei˝©Ö„Ŕ[n ŃH ˙$° C‚Â';OzšGz'I°;©Ą•×K28ĺ6iŻŠüĆďúkĄ¤Źzn¶őšÎ‹¶H… (k{NÎň˝ ôąĆs"h)şźŠÂĄí‰©Â^‹Ë@Ś>Oá°‘+“5Ç$@„ríź# «čAbrË•jö~Ṳ́âʤj &KŞëů’Ś~ uUW~3°ŁřÂwŃ˝Ţ-|)jmŹ8)-CíąX~1 *Ăîő™Ů‹á‹¸ŹSłj4űŇ Ł.ąŠçŠáŤůÉÁ8 VÚUS—žôx¬iě69"YŞp#€r ě”wC©Îśńą‘-ŞC'đŕ•Ŕő­yć"KŰrćł)$j””Ý9˙*‹”l.ú¨ĂŽ‘O1CLŤ¶źŚ_˘;ä°ä=Ś‘$1ż.Ţâe%˙Ż×ˇÂÉýe÷íb áň97î3BĘ1vÚĽś+µµe=ŁR ¦ŇJF’Üá¨\Uś—‘v §‡M®’zp˛ú>YZyZ#·îYmű‹ešKE°ŻpÁbĘ´@—Ő‹!1`J"‘¨…sŠ(J !X"E’6%IA"‘E,čPâ@ŠI BL‚I‘$$JŚ$Q˛$I’'U2|ňeJ“1aŇ$ ‘D’$MÜDqâ„§Ď6N˘đś$gg“¤Nt&m˘$i’ĄN“>•*uj“¨Y•JĘšóa’‚(&nDâ1âC´ÇRdŃ`Ř;˘(Kwc’±HâÔ‹°‘°ë˙âÄ[w`^Źb Ż5ś&qßś( ¦€+)g’F”'$’$M“jÓVkPlĂ%ňlXňbI˛gÓ®M{$b˛Š=Ćĺmaâŕ{›%88jĎ&Rš8‰ăDJ9rdÉqÓ†ůÖ©Zu:Š•)wđÝĂˉc¶ŤNôŃsf˝žÄ‘˵®Eb4ȶ!ńŐcS ŢŹ¸ďDĄaÔ,Š„“@ô¦_Y͵qH(QW‚«ĺĹŮb$´á$č‘Wč]¤šEjŮgßDdqĆVl !RJ¶É(ăF$DiĽXR$±Ź$őXÂŹ#Ů#D)±ç„N´!…OĚÉ!‰O‘`U[IĄ˙TăŤÇÜvŘ•GźNyY—UëE§ž&¤áä¦|±Ćep‘‘E}ˇQn|E_g”˝YßhňÁYjrńÇQDl•ĄĐ~¶ń‘ő•(§KĄŰź’€F) ÓŚĄĘ6ŇŤ(D„†\ٞŃČ«oÉ*­oávZË őSŇIBĄs[m÷%JmőTV^f^]!X‘H’Ą–XAIÄaÉ› j˘Ła•ía!Q8ç¸ńő™,ivVb™»WouÉ­»ěˇÇŰ˝÷ÖĹ^c9ÉéAiĆÚ\{®6芛âäЦh°Q«&‘`Ş©0V[E Ń/˘a–g­mÖŃj‰ŰP˙Ź9ýDÔPnü*ťPÉz§%SÚ{SÝ!›«%Ml{щl,g™„)_–&¸V­qĆ×VEď'˘Kś šb[”z #ÉâuaCu]Ca7bq6ď~Ž„(µ}ôa¸§Ő%1Z :><IĎxë ľČĆiŢV¤y–8×r"ŃňPSv×ܲKéÜeT5ćĺâu0E‚6xH–ġ‰B¨ý'úźµíąó2hn˛4ˇb«ÁK‚Ďěşď¸Őî›PzÄ7ˇ^V(Ü»l6_Vń=”"ŇsŹtÔĹUKg-Ťä÷Ś5Ę7N˙‹C-ŐX™‰?Ş<”$łü*…˙sZ!;óý4»1Î;aú‡ „8;QFyʉC‚4Ő”é!BŁ•Ü2BJMF-r‚ŇH ÁýP6•yS€˛˝ŻTF^¨˘‚Ţbš6#+đ”ę8CźB)oúA!B ±Ä|µiI’öóٱt)ŇZ´ŕ¤˘Hâ(ÝńţřÇ”§ ë)I(wş•&tHŐk‹\N´7<ć"m¨C.¤ľe.řąĐdčUśhŤ/mĹ^智„DN„‰µĹśL0+aLÝ ŁĺÝ. ­pF+Ü ™lĄ`‰˘$eHDŤü¨ ÝăžĂGpMđ,W»ă68´€ ˙ŔÄZ €W`– IN^ć“`ÉlsSlJ/ąL.5q€yśai(´6¤‘©CęĐt¨ËKJg3 m°2‰V$!BŽ`S #…Ě©§©ĄHZŞTÝҲ.¶a’ă[ä¶")jźsáž Š(>\âň„c! HĐ"ł€Jhމ%#DH”h Đ0•I'űăÍţ‡Ą©ě,+—‘˛äŕ!dFn˙JťT¸IÖˇIŃPR"7XÄzš,ŕÎf˛¨]‚Á˛Ą‚]»é$Ň;5ˇ%h„+ě9=ˇE ™¤^ CÂ#OH59k˙LjÔ$‚ …CA¶Z©X€Ż”($ " <\RhL¤Ča¤[ńS.㤭L‰>`É”ZV0ô8‚`yH 9%&BôşěŕĄČŕPSDx2LCƵŮ=vŠ7rŽd<”L uU ˘™íy҆T´‚7M°H™Ę¤ÓĆHOS“Ěò˛(Š´ČÎnćĺ°ˇE®ĘáÜT„Z€DŤDAŔ ٰ‚¬@UT¦ďk‚•Ę,Ú`Ű)!r@Â8— ĆB‘¦–-ęm2MFMWžü}Ş[u™}®%¬ăŇD§Á–X…Y$Ô†Ě& Ť™6y \˙‘Tč„…5K™B„Ó84‰™›H†4$ äGE*ŚŤ´# ɬß"ŽÚŔPÂÝČ4˛#î óšd– €î®T¬`âŚX÷ë“|uŇ3”eř> Ä”uxjIZ Š2 ˇrRŢőłłżä-¬a @ćvÍĺť…É»ý±] 퇄ćX¤ĺD- $×&¤"ţuOń„µRj{uúŤž˘v´u2 s`jŤłÎ!ÄH% ”§|ËM–IY;űR•Ĺł9K@ęgnú— SŮ–ę×B¬c¤®×˝<§ Ăý‡-lQÜą™L¦ž6çA¦Wşŕí¶.}“Ď€ă¸˙Ő¸L[őĽŢ LckŹ›3Şi‹ąVă ¦ě„oÂ1ŞęĂšgĄď $HŕJ®#raľE*çŚKS±„ÚâŐKÍŤ-čyLňn˝6JÄÍĄ´[d($/@ňNůGn!ˇ€ŮšU›ď%ŐŚ[Rf R^vć÷ˇfB•ç]f÷ "4Âl˘|–fT¶,$,’ĹćjĆ‚Ăȧá A+0Â2ŽeŻÜ—^XŁ|_ÍŤ…|ÉVž ĄI(Ú!…ŔĺţŐ…ö䄾ř‹h]č·´(zŰ`Ć!ÝÉ—qSAr(¤”MÚ_}`Š#dXƧavË †ç ÍŤAĚCí“K”˙á ŽDv! ÷ŘÄHL—Ý,ÉÔM‰i| aR)‰™ŘMă…ÉžSĘ“RzŁLUÇUŤě ¦¨©Ň-ă´Ą–ÂdÜ\X2UbŃ{``•ŽYŃŐř]ż+éľů,ÁR¸’˘jľ* Gę¨ĐťZ.&IzYŔ…Gw¬G†áhÂě(%p†R¶DŹĎÜÎW ŞGgyËF„†GµEWb’¸¤€WčÉíźM=5\Ě‰Ž¶V Qţ¦Ł¤ ÓŔPÎA_ĂĚ2Bl |m€@µÎF¶ÂŇA© N»Ą„­LW‘VÍß]=U&óu•L9BhH˙™©Ł¶ŕ8ĘŠ/n“%V\•Ö<ŢĐHOH d©ÁĐäĎđ©‰gŞţë»ÚZő]öT*·0áéל€gŞÍ<04\ÔlĐŔĂw±+”ć-=雨š­ÄđpEN9¨%Ţ5Ďć!W)ťɉ 莆!DD„ÓpHDµŘŤîdž5iŕe…q¤A ŐidF¸NšŇX8í’‰rŢáäM2b—QŕbÔ ]Ő Ś@Ălä,ŤŰ®-,]M-ěŐÝÁŮŞ,\xrÇÎâd0áÂť!ÁŃÖĘľ ŤVˇ]ÔĄHĆM ѡBéęę ˙eüšÔS˘%CP‹řč¦ůWmőÝ{*vVËí(8ÎHÇŮl ÂÝ<¤-yůŰÁĚ^íđ•ŹĚŘ- §ř Ţzě©4#hÔ&©TÔ°…ŇťËEiö)\É)WąĆŚ„Ëě“®vV&\q™(ך]#:QŹ áztäČŐcÔ _„®ÍÄbo˙F2‘ČU"'•€ěz,<ÔîíBŰÖ ƆŢňŐwŮ-,uŚŹd ŻFÍN@™Ř©+¦ŢE"¸Í­Ť_´°™‰Z(o,n«îŽkńŃ˝|Ö´gî†îŘŠí/Íb¤˙HÝř‘őĺÍ˝ě…ö „ťőcţ:DŤ&.AݬŽh„]Ăç[ĚHÇ- "Ě,€,Đn÷ámđÂR{đsp¶F00ďlĚDCjĘŠR#Q&D÷µe^JšęćUĘ>qú„ű>ÖŹJĐ8‰Ĺą1M ¨đM f$ĹňĚÍĄśČËÂÖń4fÔá žFŢ8%§ŕx˛' DעÖA• 4EíŐ˝1pÇ3ôŐx=鏤Ŕ+©¬ßĽÄß_KÝq` @ŽŹ(2V§ź) ŠUîŴɥ™ry‹ěĚđ†fbUVFčADśłaHb9f‘BWč@V}ühŔÍĄüď%[˙±NeŠ?ÝS©,™Çę-,1ĚFôʆXŚ @Ç„@ËYĂXe)ÍÜÁEůŃzΡş˘ÓB˘eö¦RFóDžaÂ+ü©*ćŞňŚpWÝşŇlŕő,ŐRĄŕt2ĄŰµ?:&Z& G×l2%DýŰ4F®_Z2:ݡM:`.›˙ĹŻ6ŠŇ‚pud„ŐŢš-‚î?!ÍUš’•ę†ÁX˛ŞA)sˇ G´ŢVŁ$HŁĐmÁ Ľ´GlRÉÜĄőpĐ c-&ÓW=$y`ÚéńíP"Côn±č†cŤ·äNŠgbž×ä˘ŃqĆŻŰý<–0˝&Qźđ1n)Ů54C˛6{4čö^LgOěfřËiq›YaD =Ô:«+Đî»7v< 5Ä’„WěË~|Će¸3˝-ĆśđgUó¸śç…$ČBěhŻGěŞhÍ*p¬‹ąîüş·ď‘€K#ž2ˇŠr“Äĺ…+ qʼndFŐ {EZ$Śţ˙ âna*UŠ {iď˘ĆXKq’ě"ćÉUZ!Ä#¤  .E7ĄĐÇŹ_•ŁđľZŢŠô‚hoĂlŘĘŐ9b.“7Š3eç|0Dłś#ţ~/§ŚgVŹ™Tä\  ÷h$yWďz:+úާF°yąÍ?ë±YŞNő4ĎšE†ůlł ŚHäh˝°gdř4K )B¬qÝőşz8‡ …cVµ‚484D®KC+Ü839 +ž4"˛®N\u7`zLÉQô‰HHH[pź˘wm)ťWĄŔp†Źžĺ‰OŇLž†€XÔÎot'Ü(Ü„í&@&˙Vŕ•őŽŻ>«§ą–h›Š/5k¤+Řz3¸ ¤‰bô»44C+8Â1ý8BŠô„8W Ť%ÖR2PěÄ…¸ÄÄLLßč[˘âŰŁŢ”1Şˇ–ŚJڎĎď¤ zšśÜđ|+ÍăGĹá#ĎÂKCŽ">J|¶h8Lz¤o$´évyˬ§"†»®Ó$D#8C4„Č[ Ĺ¬LX]`U38ş¸U9ŠÔŚr+ĆŻNä˘E´AĎ0GtLÎQHAKQëŢŔËFĎ-ŠÔ\L›íey*p€6zđďž_Ź·ŕcĚf¨śś "ëI«˘ź•|†:ČÂL7Ţ­«UqĹ6ý˙ý'gFÁGńűˇ€ťY§N<Ňó¨W­ŕűŚnČŰ -ç^DXBWX”(Ç®Ś‡ąđŚ@+´2mllîÖ,@Cżau˙滳[{žm‘ť>†E†!Ů9·9Ď• Đ7Ňäb8™5xĎŰőpa#Ń ‘´ŘÍ Gę\ź k `~+ř}¦śtĄQő—7M#4+ŔŃ|ŕćťXS¨X\hD‡0Gr¸@8i"ÇI)m’ (‚˘ !>$Á X‰00´‡I”PH"‘EH¦LrĺI’&M–@R˘¤L‘EnŢLX¤‰šH-I.´9SaŠ$ “”8ŠÄh$Iź}Ş4˙‰QUŹ^µz´ŤIłb•‰•HŐ§Wż¦`ZéW¤D…ÂMq•nÉ62\é!É›y“´qÖjnKĽE¤Ú´{4I“© gF.ѦŃŕąvé&TLE7$ĂĽ\VNś&Ą8q#ĄIęÓqÚČ™‰9bD4hÂInŽX…¤«4d^ś’GÚ-ófJĚ-MfMŃ()ŕ—w!K-ڶzČË"˝§Ěn’óBÄ˛Ú eř5óuČ"•ćDˇśüŃíĎëţŲsá•;×Kc°&ę2ď=¦®úk¬&s /âRĺŞĘ)ě&ĺ"s$0%qđŔ‚$a Ó˘Pm &"q#'’‰j˙č¶ŹdÄ­ŁŚbż¤‰ą÷ňZn® 3kşż’HŁ:ĹDËŚ±´´Z !µx*ˬ*ĂÚ꿣¨űď+Ş˘t+A¤Ľ$“;¬î[?šÚ[“)›ÚäÁ ŹjĹ…‚ÎB1ź[ĄĆśËŤFÜЬŤVZůĎąúJh‘Ai#¨/R± %VlÍ UŚÄ‰OŁ€ ľ±ŁiôčÔfJ0ąIq*ŠQ¸ô®Ą<5 ’(çjB(†˘»@ř€ý®VĚNŠ3×»M!HňÔBöż†,lđ¬fëÓÂfÚÉ©íôlĹ•ě;6˝Ľ0”)»ę«Ë‘µÖsĄ•skrĄÎÜ ÚĆ$‰˙# 'V”bÓÔâpĂS'J\QO‡H˝‘D Â!h`7f@"ď^śÉ$ó&µéş"‡;öE㚍K±ŔDúĎŞ­®BJ©ŻB ­™ÁB˘«(Żę–˝ŞĘÚĘ.¶@ÓŠ)$šč«0ěTz˝@“ ŽXÄ\ĺ©™ ąUş&»ŻÝ»[şşHpăjźkH¶ô´17˘¸ 8aM ŐJB¨ŢČ⇠"âż+b‡XĄöW…Ş›´&ˇiňŘşő=»ÎRK)ÍţňËŁK@ěó“l>J’ĎlŢĘs—×›Á2%·Ż±ôÚPËň9‡«Á6ëLŇ5ŃmZ®Ź]Čň…P/˙’(gů+Ďë:ę+KcÍ „ç>Ř 'äx-_ĺî[ü9> >üŕkŰô^:m™ÝíäÚ$ę"ŻŘ•$!ÂOůŤ2ÉxÍYˇ›ĎRlâűĎqN›LÖFŔ44[|Ý´č42 ¸©*i8›€’q].:OS T0uO5q(ö"9$T źřP›ŐÄ8„Ü®ŞV¸ )e4“V\f&®™©v`I"U¦3 esfR`b’)6…ú [ô Z ZWńLÚŘó˛F¸â[]óaZ§A9ęI)č~Z".¸0Č8nIAż Ő„& ¬ )‰˙śp9Dˇ ŚlŃ\Ś7:ă©k'š«d UV$ăČçOA©šüN¶·—á >%;Cć÷­$Ńб@—çAŇO< TPě#šŮ%mwwÜ »ś JüÔNRqĆ›ÜGĽ°HŐ©WađG/Y „­p„Bา˙RX#şÇšpŞČ4ŚŚBj84¤!c+ ČD)ą÷H’C‚ ŹTö?v)Č<ŰÁIf҆ŻĚd‰bŠAŤÂE49)i…WĘ–´hĆWS\É jÄÔi…u˙šDĆ‘¬‰ÂŠ)ś$ ˇEm`DžĘu2" R-ĺUSB-Éy’?BQŮíBö+ŹRó)`Ü–ćvuĎ—Iě2OiŐb’/–2D%ÍŮ`]‹R4'Ň*„7cJÖ´™e.Lo¶“Ćď˛U®±ö>cÄ PÚ†ýq ’ýXZŕ†2 r„A®7ĆA猂ié/ÎQ RMÖ Ű "h8ÉZşŐ­čÜĎq#9’/Dą÷¨Ś[•ŰI·ôšŔ’`EŻT˛ Zâ’ά>{¤uÇ3˘@ĺe^â•_\zËăĺ•,ďw‹ŇŠD¤+kšb3™‰G’x0R‘k<Ř4˙°ˇe˙)MůŮ ˛ĆnDmB,ŃH„a+1ŘÂT4 Bh(Ńżdí0/1’|´+ös8’q\ĎZFĚB­śZ•”$ĽK]Z‰Ö$Sg]ĐP’%$čKs9ŕ-¨ź€ý* ÖJFµ— ŇĎ׌|™şČuŚłąĘ:éĆF°!0 >dŇ‘HŃ’{¦1jiÜH5;“M ˇ‰ČěBayÂąŁ ±ëGíśWQIȉł'«~םĘyšdˇ™1žŚMĹ«Pň‡ąŞ„ŚŽÚ˛´ńKKą ÇTl•iRÄOĂ×™ť1ďJŮÁI·,‘°E#ćŐ Ň˙nÝ+':Ń)KX✬1Í#ŰŁ¨ŞdŽ=ľÝüNěÎ<3îČŔ]ĚŇ\V–ꕉ‹MÚYš0ŇF0(JT™čS’‚ѬX4Z[*u>©v»Űuk¤%{&“íâŚ:Vi2şkĹęÚAą¶żł¬ZÄ94¦ °d‰ěfDÍşŽ„šM+ä"Ž&¶2Đ2O…. ŔBŇ@Ű&Îťö6¬ŢÓŰg˘XQ-±ĐeşJT‚°żr- byźâë2ĆópQŕ¬H}Ý4ą @ťG@›4˘ĆaoşSŔ5ɸ4ŇŠŐ‹•äĽÎŚ\zýĺIgý%Č·µf´ľµ9lÎŇ$ ž˙ý‰_€łUÄ6D"2ŃpÓ…‘’čWĂ&!„„H×3ß ®·&,k3ôŰ‹ýŠ#!nć.1‰ŕĆ[şĄĄÄĚŠšűá·Ź5DW ą>ÎXµźÖĆbňČŤ„Őúd 0˙Uęci $Ń(á4ŰÓ=ÁZ΄)řśĄI0i#‘ü¤dG7áŻIfň±`©~ČJŘňžÇ”xAf\“V^ąE‰Ů$Íeë'Šąá­‚E&0B˙ ­JÎŁÂožVŞXl˘]âbK¸C]xĚ’\%0íĄäĐ"ţ¨Ëv†BlćĄö$ÝäČ("¸śe–‡°ć%Äľ ®ŠŇpŚôud‚ËŔ …vş*÷.Ą÷éS †ÉÖN¤ ŐLA…MŮ„¤ŮXďc< (ţ„HHĚť„-™Ě „bÚdPĆ擤'¬Ă,6g*°spFˇ˘ëĆK“â¤bL ËB\Š·6M0P‰č0cФ0ĐŇ®`M&ĘŁL¬-ÜŔLEiÖPť¬śŠĘś„ďŔÜ.2p Ť<,«^D8jb«†„®†„ž> ml%«nŇ˙Ô§@` *čéb§Ň#™ /EéÄFc>‚ŢÚĄč8Çx–ćkvH4.šá‡MčÓ†ęJ­\’ ÷Ö š”˘ ¸¦ ô16B¤1xoĚF˜خ‘ŕ&ÍŠ ŐP3Đťä°9ÄŞUäE:f9DĆ"łJ8‚±!„%„ĂÍ>2$A˛c&ÚČhö1I$Ę,VŇvJڞčZd§vÍĘ í¬ş¦ h¬˝ $•<Ď(¤ŻČČ(RwŠ2—J˛üę(’&6䀧|Ş1F„ ↑V„ ĚĄ %a!w1xŃ7b#H g#B€@€H `-×’Ôň-Ů’,Ů’˙B -)n#Ř’#ٲÄŇ'0}‘-wä-Ę9MĘ B®I$ôĄŃDĄen†!D¦:BHOř-k@­(kMmjĚŤŠ  i« /śÉ›É í Łę*6bí_nÖBk†¬âĐiÁâ 4şRÁR‡3u1 n(9•s9™3"h†-Üńž¤PŽh%Ý‚’Ädc,ˇ\†*¨pfÎjVśpĆ4c‘.ĽčÍ.PŕNî¤ „kôlŽś0°¨Łî,!6é4zęzâ&ř¤ŔśJä¨ɨbC8“ŻŚA×,W˘9!4B#”hčÇ„B˘ MEÝđĘC˘=Ý‚Ţ˙î‹MÜQ¦*‘$HłOF­$:Íü8SáŤŘV sÚŕ)ě®’ ?E „{„ŞDIÍpř&P ,w‘n’Ď8‘SBťôIĹGh˘ú&cJĘ‚g`±´[¤,Ś&Ĺ´…€8IőTNçXô7ă@2Aň@\(i¦ŁŘçüv Yľć§P&؉j>Ł­şě_I]‘…B`°â íÜnA×°”8×0˘Ż6ÂJ1µaz#F‚ćÚdCŻ‘Y~F=OĎqTď'~ö٦ž0kXÍ32cáçŔ*Áę âŔ\¨ÜTę€ŰÍgÂńő*h(jô‡†A,aS˙zŠ÷Ž…Jä Ó,@…4Í*A‡“8±5ů`!b! AůH2µ\Ç•T8çA˘fŇŔ&dśî“Đ”<¤&Bó'ĎkšĘ¨K™)HŁÚôW—„Ř´ę*š!xőWŐĄ>&m$A’#EŇe"–Ö”J«"ˇ¸“AR€EŔ˘ Z€ŕ˘nd›’ Ú€ š śjeŮŕdůŃdůqäb„\͵f‚fk-–«)dA¶"*Ş‹(K5fľ:ł‰c€–ěy\ď=âŞyúHĽ®˘ 2!ě gĄ k˘qZŽ"(Ą Ú”ŹŁjLsśDł&…#±j9:b_"#‚®|„#˙ç‚Ń>˛a‹ŁaQ˘”ÎŐfkgťÓĘNQ}ňŞ€f˘Č†l>śĂ@L‚¨f%ąđ(»jŹ\†§ ę Ň$!ţ4&âs.4‘XÚ€Wă` š#tzĚŘ‚ŤŚČ·ćo,­bLŐ|¬clÉÁ’PyÔĹ犬t2îRop—TFPda‰±hżŁŚVˇŽó¶Xw–¨"˙Ä«+zdt·kMý-ä!´¶&e‚2č*xµö¤Ln“ăE€+”čGAň‡ËTżżŘ%Ú€ÂlËaĹ]ă©}#'$Ě`fm(Řř%8‚)‚!Đ50:(±ŐÎ˙€âi˘â:„b˛˘ĹW6í(´o( $ 2ˇ C!ĐCCłiŁ(v~ Ż :!0#$0Î!ĚÇýاcî5—#äRí6žjë^«ű·X˛ćzHŃ$¸f9`‹ą¸‹˝ř‹Á0TĘuFU°nFf^‡;škK|Ň^®ĂJęúb>‚¬xP 2>§+t2W@‘äípcb‰ŢÔť„‚8P˘«Â<¤9†fOKŕ©`‰Ů©,Śô 4Ś'9] $%‡8Ň ę2‹Í5ŚYą•·xŚcÄvîkMŤ«ĺs`'—ö„ŽÂ‹qcŘx<(>JŠUkW`x_×V2˙Ôí*Z>I,C‚ ÓŤÄő"0äGs|iČHâ@Fct5äK­c7Ö®4]jô©ř«ř‹ëD6%yr¨©răÚYť35$‚Ńť7–Ř Ă1ő’™“Č‘ăÔ@Ntµt?HÝjÖš®˛Ă@ŽŁFŐÂľ˘,nc©^ËClb›Ëąk`äĐ>b@€Ó›ś¸%Ç™“°7SoZâ#ÔJ˘$*Ž"hŻëě ]D÷¬®Cújy%jg˘ÍŃSä["™@1 ŽÉM†Śp“Q¸Ţ¬ßݬéĎ%p!”Ľş#âăHZâç#>±1}9q:–"Ts¤EćTŚZ˛đÁ”×m—­âÝ÷Ô}”lÉ\„yeĽ-HA˘ˇ^÷[&P/dUŁÉfĄ˙Ö/ qęR.ă’.ĎRÇFH /’ ~99ťáź´°Ŕđ•SÚŚ6h‚VQF±±X·KC e–mł#˘@á]ŽeOíâ°ň‰WšLK‰ŁÄóě‡.óò&ż9É2{Ž&p,âĂöű 1thn˛(,Bŕđ“~9łń›>„Č/4ĄŁŮ.K5…šŠâŠ`Ô&ş.ÚŕĹŹ'ßîo–(÷k‘řôÉ( ›DŚĐ• [vmF‡K$&Bô±C©¬0ňFyä%^ó¦šÄĹŘl’ÇfĨy 6hŘab®řńäË«%Ň·c8Ăţ ĚRsđˇć$KżđÇ.ók%aICeÖL6˙5’D^żÁGŮJ•ĐH+)Ôjކo±ą¦›lÍ%Äq=µáÓ|,• ‘R\ˇA@QŚ ŃFm1˘‘ŤÝĄŃ\Dt…DO=±‘Bh¤‘Ňbć-É$“uÓz¦-ČP‰ůQXIB¤@)bś@ž(Ń`‡ĺŃŢeĄŃŠ3Í8ÓŠ+mFăL#i(¦ž`Mh…‚3Q‚S0ĹŇF_=%ADn!™ťOPÖĆF#HHŠ˘e©4‘:möŤ á©§]ÇF–ť*˘Ë-ÔrAeĺ›oT‘0k­˛ŢJ+®¶ćĘ뮾ę lŻůĺ VX&ćŢY˘đ×Më%Ć'˙©8–fʵQ}%ŃH3­(ôCTÁŘJ+ŽFRG0őÇ-je‘ #‘ř4.QB!$ Dg±ÖkÖE*yŘA˙M䯸Ă%‘PëŐ`}÷Ţ—»g±bÂŽsěqČ SŐRcŞGŘɇµ¨Q‹f)±0K”Pe|]şg‚ 8AđĹGg뵑J"-vł±žÖŚŃ&GÔY ÚtĐM(4á$đŢçňwL…ŃŔÓ.ÖToc«ë۲ßmŶgőëXĘ–nőö•&ńĚßÝjšŐ Á ¬0¬ Dâ*óââ ošZŞ;±Fq§7Y i¸ń´f‚˙©xöÓZŇD‚iŢ”J+“•…ßJwmŐF3ű"EZNM4Q„M(%Á%Nű&pĄýú¬’Ë8ĄS_Ô`ĚóUŇÎŰ«qôY*ß›ŘP„[$ ál€TŚ@żŔ—–˝ë·Ď<:o”łĎ”™Řc1ˇď p‹ $ 0ŐIŇť¨•MC4‘ Mäá—uĐC%2ˇ‡L|Q&ě Šô·V !^< Ö…@˛3Ćń "jô©ő ŇŘ@IŚŕL†Ô’4G‚ä D5Ýežéą.eJ“;¦˛CřfIŇyJ¦F1ŕÄ3NÓC2ç6]F,bšŢUI˝˙$jéĄ0뀚LŐ*@k‚%2‘‰(`ôk±Dłr—YŤră¤jö(Jţk̡2ôÖ€čSç -kČĽ~!l)T1HP2Č}ń‡–$L›oZ©¬Nť=\ĚÍfŤÎ*•   ĚJ‚śµ©$™K+•PˇQĺ G‰ŇM¤ř5ąj$ VĂŰf.§.y1yĂ+qč?XÖÁ&Í€W2±Ř-OSZi‘’‡6TŁrHgo‡júˇ= Šć'ĂY-mő˘Ň|Ň#´ţh”´I˝Y×°Z¶Ąr8«ĚYŮŚ‡)‚í)ţńÚÝŞŠH/…©’7ů Ú@ŞĹ-¶˙ˇ“Ç´3JLĐD,ŃT—4dqľŃDZ±/´!•XôôúĐY"‘¨}oúE›¸!§©ń Oe™Éy°‚aĂÓ!“Ą)ŕ.W†7k§Q¬gHÖî–_ĽťđBßQŻ6!Ů(ahI É*pąDAJ‚śuOâdżńÜlyöb¤ĹA…r/- ŽdBFKY‚†ů¬gÍ-!Ě"$a‰/Ú˘µ°t©vCűČď.C[G<·|U{3Ënő“Ú•zňžóÉčÍâw˛iQ„r=c'suČÖÖpÍ[0Kŕľ;.4ŘŤ1ŽŠU?ă,ź &±pňĺ•@·@™p˙…inH–8äAP|JĐ”"‰0Ęaż’Čě]]·śŢ„¸łIjxŇ#KF¤«ÚIŹ•%7ŕŐ«“á*K¶=[¸(ŕkýĽŮ"Ř@ç˝’‰YY5=™˘\ŻçÄ”¨‰Ů્DßbM§ ť Í{˛Ýů& eVŻR…¦¸őV JA]°ß$¤aOĘžUktUZ9ń6!*T#!¤í´Â5×idÚ€4hH6Ĺ锌˛3˝YƵˇşý_;gŤ˝†˘ŮR÷lÉÍ*RHŔ!V*-šÂÍŚ†eÍokđâ­O—%mĄ‡nsÝ6cż$ÔˇŘmůĚÜTž…D@Ń˙§bôđ¤ĺ,Ąt ZÔtŁ/˛g‚.•ł¨E*DСQ$†ş;ÍľIHĺŚ3Ź=ÉCëśh‡h ó™­Łw‘ĎYĎŞ+XzĐÂ´Č Ś€CS˘Xá“ýĹÂaжŐř ÁŤ‰ ʧ É’‚ťË|˘i zÎB©˝”E/˘ŃÉ—(ĄŻĄ lABŃI4Śžĺ“zčÓ‚Łźĺ ˛‘Â_‘ن’RŐ!Č$©:ľiÄ#ąĂ_ęX[ýí`V®TĎů†ŤŹS¨ [ů šđĆîh±é$Ô´ÇŤŹ¶qřĘt1» ńËݸřřÎYŞ٢ö,ťŘ˙ p¤7u$@“(iń=DP>O§\á=F'{Ą„‰ň=8K‡8 "=K3WWőź’oCrxv qŔĹ 8“qŇ—s—GqĐC=&@}â&ۇ0łFhIU\öóPŃ"hm^“hŕ×f Ô}šÇ˛¤K¦ç=L÷y@\'ueeuSHlauşGtłGzRŻÍĂ0D@<“†kÓbî–Kj6Cöc„sőID1÷cemăv['Nw2Ŕulő´BPVĆó‚Đ–?Zâ,Î’I ‰•h‰'VM™‰ b‘¸‰‘hjmŕ;Ň$㑥ĘV˙< 5^±rxŞUoŁŠCŃT©E‹áŠF\^†"T10ł˛0ľČZşU‹âR)ľ0tŁPÔł} …gĄ<ĘS†S<˸Ś%†e*Ń $Á`ÄčjEWh¶>Hpg»Ç=[qy•cy™ŁŽ´+ŕH%ŠŁ8ĄőhϢ\H [ÔS¶Ô>ř,‘,›0ç:3&Ўţóe&P#Q Q3řa1Hł c&4¶:#+ÎŘZîXoů†˛ř/&©l I‹˛8Ĺ$9’1IŤ,9Ť1ů’Čř6iŚ*©“¸˛=“ĆČ+7I”: ”"Y”E‹Gi”IŮ“av0Q˙9ţ"QbřŘë5S%aaW911 ŇRI–PR–+‘X<•"QiW=•Xî9•w ˇuműčŹđâ—$….ôP{É•w)%Ř…bVłp™•F•=ĺ3Ž ™\9–QI™‹‰•ěq‹I‡ŃSť©—‘˙8™¦yWZy™űčD:‰eň—„d?vÁÂ5%ĺaEĆM¦Á@Uâ:ŹÉ3ń*˘–‰AmBhÔt0 ÚU1c ýĂ=űyBXd¶Á‘w0j9µ”Qj;ˇ%MśŃŁ‚Á **Á :Üř˘Źˇ>řÂDËwV7)˛wńcUÚ3ŚÓS‡tÆű”ž´µ6¸&WsX`ą‰wŢcXş>+ĘkʵCbbCŮE8¤kz¨śSśoę}Ň(›fú[žqB_cPµ~j VkŠ,ÖuXp_`r”¨°Z‡ŕg˛Ú2Y`ł Áa.µ¦ýб \jza,łF& ŽąIÇy/ă:‡0Ër1­w‡>vĄ­wu†[Ŕ9^VC٦HPm,:o6}“—‡şŔ­ K,”÷„v­Ř× ‰f<3kggw#ě˙®¸f f,”ÜZ¬:©HuƧ%‡/s°Ţ‡Ëx`T|7Çs3Â*®=µD0b#&‘!_‘ł-ÁčôG5"aTĹĂĂÔóĹ/(a°EŇĘ8¸Ř§ŰlĆ Ĺˇ*0zĹPz•Í´ş0żÖk»3¬ŞS¦y7CÉřVŘś3`ŰĆ$=áĚú2O=Ś]ƇĐ* w†¬×ĐÔD uľ1pµŃ ]EđЇ‘ňŰ«YÄš„%fys‘ŹWaŐg®b,ÂůĆĺ &×jĐ—čč[?ҬöĂ9㱌ĚjmCŘŃl°ĐЬĹQ¬±őŕ–Ű` Ű˙Ě3pm Ŭа’? )đBGU¬PŃl ĺ 0éd[ç*\TAÁV6˶övďˇk˝uUŇĚy¶LY–RΔZ«±IÉb¬‚Ú÷[Ó…\¸18“RÚ —č]ŘAŮ…ňа@ŮŘ‘°@÷—SÔ±qŰh áóĐCŮ´wŁJ ĘÄ9“r¤óluHĄŚąŞ± šUÖǦEHĹ 52Ů Çx/XŐÁ]Ńżť°" <0˛@’ĐŤPZŰëPĚŕ˙B) €tÔö" Ú° ˙€/Śů›;H’3tÖ@űł®zUMQÖőÍÚ”ťĐ WÔĚÇ6§ýG¸ťÜXͰĐ%Ŕ 0ŚötĆnĆ®y·Ĺ#l3;SJ:teµ7l,­”×­P=‘Ü)đáˇl&“-Ö-„>‘Ńî+Ť,Äčv¸XÖ°p|i ř(.ś-௴ŠaQ ňą˛Y«*Ą2O±qO‚ęăČŃĐő]Ô ÍDPÖ§]);Ž$2pÇÝ âîV؍ά(wĘ2QwZČVËJh%?ńęs°1˝ÇÄ EPŐm08w4ëqő}ŁTÔäŤĐŤ4?Ŕ) —˙ĐÝq|>>}]é =ęZ}Ú^"ű ŕţ˛â Ť@|wój"‘Ý rĐËöé/B"?vŰ`áČ8Bë‘ kÚ±*ő’,DśFĐÓ6ď ÝQVĆŢŰ”…ĹÍr3؇µ‡Ĺ~ěUCAĄa%Ń·4%ôŇĂ*Ä !Rź EŔ}Đ€3ŁŹŁ_9`ĺß` ßÚ Hżý tłţůć/’Eíłą…†![/7$ÓVÇĺ›â.§tŐÜ1źčiTňa˛ XüĆ„‘¶|ŚěXU‹0ܦsŐŇš©¶ ÜD$ónÔóé»Ă«ăÇ0‘` ° řb˙)7D"EP*0l":QőT®ż%ÓŁQÔýĄsH]lŞĄ*gÝ7‡¶Ů¦©űÉt3aŚqă~¨Řţť×Î3±„3ÍąeΓĺm %úŽëű\ę˝G#‹|řâ‹xr°ô˙ŕx ¶ŠW:a ‘ę¤>î%&îjkňţţţLPŃŐţ#ţĆ»ÇČúš.Š,~Dţ@‡pH,ŹČ¤rÉl:źFÚh:‚8#f…Pżŕ°x<µ2´Ś­ĂKn»żftvýÓîxFëŘGx‚„…wzZ{†ŚŤ‚{B €Ž–11X–ˇ…“[ ˘©y™™§ކk”±Şł§ź•ąˇśź˝ż#WsSľĹŤÇXWĘĚ͆ĎÇÓĹ#Ô±Ű_Ţß–áTăäwčéĺěî˘ëíń4>>ő–÷ůúŤüńH° Á*\ȰˇĂ‡Hśhb˘Ĺ‹3jÜȱŁÇŹ Cj4ab‡É*L–ܱ2%É•&SެHr&L”,kŞÜIrŔţËž?îÄ™3čKś5ʞŚYô$Q“M qÇT*zŔ­S­Ŕ 6€Ż$pKvk¶_·n8›sjÚ©Jľ5ˇ6Ŕ†¸SűţµkbĂX݆đĹ říŐ¬nńú  Łb*dÖ‘Ył;pV‹YłčĚ*tč0y9ôeÔ§Ig=:őęŞSľ=–wéÍ™wŰNéůÁ[ÔÂc'­™Á€Ż:Hmş÷ąt˝¬©łÖáUĹ^«ÚÁ˙ÜKkÖč*; ůrXđŕ§ž˙î~1é÷oĹ×Ü[’ŐŢńšz©P‘U¶Ć^hz‡™{Ä-H U28…Ă9 ţnŇ_¸qćK.čجU8áe$©ŕ < €/80cŤ (đ 9ŇhŁŽ8úŁŚ2™ăŽ6 d’8*@¤( ŕ¤“<ąă•G6ąă‘ LIăAnąd–Lţ¸%$ fZŔ¦VjÂů¦›sÖąćšr¶i§žzŢéç›q¶Ůç tú™'ś„ŇÉçˇ ĂŁF*餔VjéĄfŞé¦śvęé§ †*ި$x©! ęŞ«zર*무Ö*«Żz`k®±ÚÚ꫽Ί뫾k 'ś ‚+¬°ŔłĐ.Ŕ 7°ŕěłÍ^-¶+P{m¶Ű.®¸ÓŢ ¸ţÝfŰ­ ,°Ŕn¶7|»m»îŢ€nłĐš[­ ňB;n¸ Ř`Ă  7řPC7ńĂ0ËÜr îFü( ř 8ël˛Â%kü0Ä+Ľl ÝFp!,€-GŔÖZS}Ő`ă°€©íúĐ-b“ť5ŰUłĐś´!xĐ-íZ˝0Â><‹Ă eűĐ÷ ®® ÷!»^× 8áo·}őŰf“p¬ĆŰü1ÍË ‚ Ř0CÂÔ†ţ1ę-‡Ŕđ ˇ×lîţęŁţ±ŔĄĎPëÍć‚ä3Ç\3Ŕ{íµC Ăjű´ /P 0Ď}|ęŘn;ÍŞzp‚ >lµ4S-ş >^łâŚ_~ł’KoĽÜíß@ţúôŹőÇY3ŢżäĘCßÇÜŵ­hë»ÁĚdđ°gyî€ ů|Ŕ@řM‹jů»źůřĄŞd€Ű=@&2ŃAŕÎ>2ňá,d8«VÎú6Â’0Ô‹>Bö0„ '€N0«€†#ˇá‚¨<‘Á}>̡N€Dwٰ…Jü4Ç‚d)K]řjÖß…®x©Ë_ÜR—ÁŐ¬5°]kÖçţŽE-oÁËYbÔ^ńč®Ű©Źé:ŁşlP*TĄŞVĽ*–"9,Wí X‹L$­©«EŇjT̤&79©B˘ę‘® –%Gą*J‚V‘„ä$sEJY+YËÂW¸Ęe-É2\mŚWq)KĹQë\mT#»xGlÍ«]4»—¶ôĺ®~í`XÁF˛ťALb(ŰX5+¶2ŠĚbLŰ8–M•yěg/‹ŮĚd'7‘)Íi=Ë:—‡Í˘-iâܦÓV:đŐ`jU»śÖ¸VŻ•Íreł[ÚÖ†ĐĘĹmn,¨Ún·˝ő­f9Üä w¸Ä-®qŹ“[Ë6ęб ™ŰÄDţŕ9Ú™ktąCÝö@W­Ý˝.v-Ąéöpg:›öîw žÎj@<ăŤL¦ĘcŢ śÇčnzŐŁÚQ‘7;š®®{ß ńě÷ľóĄďt¬źáçŔůµĎ}ř«ÁÇżgťĘ  ŮĹ."Pl l ôĚA jĽ űĐşÁtđ!Äâ EpÂ^±†NôáČ xş°„7Ě! %ŰĂ2‘F¬kqÖE!Bń‰N”"EfEĚ*ł[´Aa F@ޱ–Á<Ł1•™[6RqĂdAW0GšŐńŹč:ÖęöH®9"··aĚ!MőIDŞ˛•¤4ĄuC™Jî®’XŘU'ÇKţŢňfĘ“§:Ą(ĂËHVn•Š”¤°ÜŢW*‹YÚŠ-µőŻmĺň[·´ĺ·ĘĚß® ™Ö ćnˇEŻdęvĚäׂďÍhĚ`€ĂĂ®9´ĄiXcóÇŮ4m2­śÝDgDŐYľ›ąÓšńś§Đ&fO¤˝ŘĂ%~Z?ĄĆŇ€–Ť -©Ű´¦Đ2ÔÇB–ÝJQ˝Ý€orèFµF9­NnÓŰGą‘Rů HÖZJeŔ9–VŐv0UUµg±ÖÝT_9•©ęxŞ;Ţ-¨B^ńÔ6Uj%µyżkjô zëőy¦Ű»VÁ'>®®Ď«ę +aÉ*?µŃoŇů[ë\ű÷VţéĹU‹¬«×ř=Pr~Ą `ď:XGö° $/KAƢP…®…¬dcHYËf1ł=ۡÂ6ćY!‚V`˘míMŮśVµUüőkçŰŮ~ŚÉĄ+n Ěß=Bn îp‹[Ç5¦+ŰËUfsýXĚo+sş†T/{G©]ZÉ×W÷fU˝±kŢ~ű»Ľ$€A Ţ[Ľ0·%NpüŕxÂiĹđĎŰ0€Ć `hmÜ)04˙űĚhŤ+/Łş0°qđ@ă.Gc´Z~u? ĺů„ű»-ý =Č0N‡•€@ĎÁp,ÎnŽXź&^ôţ¤Řeh€ĐA€ôđř4ş ¶ţŤžŹşĽöę:¶A 4î” Ě8ŕŔËp0›4ˇh3ňŐ¶Ş] 9w“+ĘňčťhËK@R­Ŕń<¸€G#Ŕ8¤ ň“Ż<ÜţŽąhîčTwA Îl1 °?€]ö\ęćxá”őŮĂŔáżÎŘŮy+ŕr ń¬Ýî×C„OüĄÚ©+ €ń÷C«ÎŞÜ#AęÎlu¬Yo{I»šŇR,¦ŐJŻó@őnýßşoákĽűwěú‚8Ż’3wő‡|úg~cő1†ES×â‡ţÓ† @uä÷X´C“5CíDkŢ?ĐuŞÇCÄć%Ŕ€= |$ŘD7Z"$Čö€Zt‚ĘćM>š“q0‡ŘÖ,/§qnض[µenBŘ,rĐôqLx/şô,r6‡sç„Gč[bpW+7q W,Wp\řp 7†W+a8o˙¶†l؆nČ)Ąâ]Ĺ’oĄD_üö†ă5ŠCL &.ÇT/6a4ÓL;×qŃbxČI08Ŕběvđ¤N2VOFcc9“OE·O“›Tő7ŃóeoseĹłyŚĂe"?ăwC†R¦Ç‰™TžË3TEĹgTődËhĎ3h9dh»x}‰F˛8‹źjÚfW‚Ą@ŁW§ATAŘjČAÇI@4CTDČm¤ĹD§ĺCĎ3SŽąv[”ŤŁň ®"ßcD„¤96€Şbđč"+řőDŕ0:ůxŹůŹiŹŞ;fox1.6-1.6.57/doc/screenshots/colordialog.png000066400000000000000000000301301326741342000207430ustar00rootroot00000000000000‰PNG  IHDRŘ ¸ŮˇDgAMA±Ź üa8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2)Ý.I IDATxśíť°ĺ}ŢźýqĄĹ&®R_ęë©f,5ą¨¨iäZŠR’[Í´”ŚíI2ShqZÉÍĄX™ P»A­L±Ç;¦6uD!Ů`|ÁÝIF2˘Fv„}©‘DzYĐŮÝţńîľűîűľ»gĎąçÜÝsďó™ťĂ{ö÷9ş<÷ąĎű}ßuţ`×Kw]űFBI’¤ľÝuç=»>ń_ŰéŽÝwä>®»ćęô„ë.»` g$„Ńç ë.»˛¨Ĺ\sżźťzöĚŹžůÉ‹ßţńŹüýž~ůäS§ľř˙}ďĐ‹Ďüáw˙ö…ăOžüż3ßv˙‰gţčľçŽ<öťo=úěS_?öÍGľ}đá#zúÉŻ<5łW=á "6ŘČeËuI"—:{VďSç*ęI*ÎŮ÷ĺZň…łŃž†‹G%Lś±úö­ż´ˇlĎ(*\î đ8±ÁFÖ°.×' €ŰçvÇp}ĄđĄ?«}-óBbÍ`/×’/śŤö4¬:ëvÝyĎ»ďţű<'q'qÇI"ţłüźüŠ8๣ßHâxĺšwŠ·G>§{ö˙Ě_ţo‘ß±î˛%×&D˛-IÜć8ćŰmJUŹş¦ëVíśŐŇő/§®‡kW$Dĺg€MŘ3bQ™Âúü3űŢzÁż0ąQîyäożE‘U 'ÚG" ůŁrk¦e7$‰|{C’lKą)ŞÜşMŮTq!íí¶Ţ/'WŠ5ćÉ éJŃÄwľ5­îö­'÷ÖŚ&Ţžý™Ć‘mZöÇF, ­Č•[Ĺú®'4Ď©U˙rbĺ+’őňm°±¨µ…¸•-5wÓö|x Ř`#kh‹©_ćú“Ŕ-ŠŘUl˝Ą^ÔkžóĆ$‘KýËi+Ő+¶ä gŁ= +ŚŚřűĎî7ن8‰'Ťrŕ'˝?Nbk4ńW|EfÄă%×&Dps’řH¦k7+9¬¶ň#ŽSgëGJ ë…¬ç¬są˛{čᓓŇ;—ŚřÂ_ţ5±őŕă&q|ńĆwřçď|÷ă_»Ź1âçdG’rśJŢŞ­ěşŐz~m«őśbkO—‹l''¤ K Q’ÇćňÍý_p`ßâíţŻ˙€}ÝgÝ9Šbő„—e¦±ÁFd[>”Éźł9NŮĘôG´ŰVë"‡XŹ’[?¤ČqĹĺ´•ÖK·ä gŁ= +–hâŮĂ_·FŮş$ÉÖűď}řQMĽ8¬ŔYcńgIŕ6G|˘_8-iĽŢMčBŚÁ!…8ŕI iž$ţłăhmBŞyC׌xPM¨üŁź‘płăxŃ&¤r!Ţuç=Ŕ qJŹórBČÂFf׾˙}˘QpÄż÷Űż5ßwD!‹’O}ţK˛m-Ą „2P !¤a(Ä„Ň0bBi 1!„4 …B†BL! C!&„†ˇBHĂP !¤a(Ä„Ň0–'t,6ÖL®júşóôŃg›ľBȰXěBĽfrŐHhÜşM[Nďiú.!CaQ ń¨¨0€Ű>zĐâ6űwőËä}ÎťQĽOŇ‹ZçČ[.Y}űä[籡?®şĺż9¤mç}„‘»OŇ7â~XuI§Óąő4fg±r'ĹĘ{/é,Çúë0őÖÇŽéşmţż™míGĎđ>ÂhÝ'µx.P{ć˘zßILËon=– ->ËObć\ńK®{űc+ŐCÖmÚŕŕôŮě-˝cÓ˛TĽ-k‹·—ź<řAŘ Ź-_Q±çs}}„ÉM[°Ú2{.ގ°Ěb°X ¬Í«őťŽaâŚ~˛ „bŰěÉMâSĽtüp÷ů¶wľűÇŃ«ÂBa!Nw¤oÓ•ťÂ۰(‡„ŮIÔÝövfĹí­Ĺ„XsđřŢ>żO…ŁÓ{Pô§ćĎ›şf]v85´qzâ6gU’%ç]0¤ź­‹Ţpf,»tyúŢ€ lĹľeHWŢ…=3—üÁ=¶L%$xŘr,Ň*ę)ߪ»Ĺvá­ěŢ˝{ď{·Wî9đŰVµŢřý¨ŞŻĺ÷#?Ĺ®ť7ôwW˙Ŕ[úăčUyą “×ŔO9 DYů(ÝMÜa'} ül·Ž~{xpZ®5®´źFŇ,ý8â–˙ˇôČ7f†tć‹Ţpf8÷ČV,›]6±8Ś&°a9ňŚřîúć%S˙ě±P®Q˙÷¶ęę–ŁIsám'ĚÖĄ˙YťÁĘqhy([˛«u,?­ę…»ęXĎÝ⛄"ŁbĄ°ĆBťĺECő’Ů!ąwVÖ sÓéž}q´Ű’ů“&× Ň ĐŃ {NŔÄĹęş Ľ¸¸Ŕr,_Žĺ–aů­C±ŹU„%mó­I~Ż~*kRăĚc oĹKË_Ę™CĄşĘcí÷#Lčś˙ ňßgŇęfW 2%MŻŃüâďĽě7GţÇD&»ęoŽ\Ž{gňÂ-ę"VŞWţ¦® ő­\ŁnRŹ%ÆB\—‹ľ{ĚLŕđ28łaâäĘeX`=–XŹ ˇČËqůI\ŕžKVVśpŕ¨Y ßZý6ײN¸÷Á˝!B)Ăţ}*ş¦Dę=@ŃwňcˇßaşóŢ÷ťąţĘP•7×\éÁU'+â í·‚âŐ•!°÷Á˝bu0÷nšb\SÇáj}kf\˙Td °ł®6ź=Ž YűŘZŮ^ŤeÇp:Ŕ…6G°üMG,Ö…Ç÷?Ě Çkąjř)đÓ9ź\˙S:ŔyŔyŔ/—'şç€eŔz`˝}§€Ňć2źé;pčŃű­ëÇ€1ŕçú>oĆK@z{}őŃIŽé!š(Ë"ş®'ó@»„xH˝Xsç˘óWŕĚqě[‰ ™ą9¶«Ź'Wž^¬N ŕ4NÇĹ+°ěŽźŔńU—\ńěcŠ#„ Q_u{ë.Ý"Ědŕŕ‚‡÷śüťpő5+m ‚|ů6 ?3Ąę[?˙ë:đÓ·ź<ÜĎÍżíťď~őŐ#ÂaN0D´‘żBÝ:űŢ-‚áÄÎŹĄű‡§ŃQOtNç§ÍW†G÷ŢŰď}ľŠč!fýŮôŽO•aA„i#< °ŁäÁj[ľí „C DĐAmzaşEľvCî^Cŕ“űX51Ş´(šX·iK’ ůÚL;ť6öŘ7'OáŘj˰ŔÚÓ˘˝<8łZě¸+gĎH ť«°Ö Z4!z˝vďŢ˝eËU@–WúJÖ™µ ýKĘ©B?ßM_9÷Űôđâ_Ö:Z‰G Ř˝{÷UW\ťb’¬†uĄ(ćśfwÄMd7Pü*PĚ(cIoF-«Č^µC掚0Uxۦ†oÉä©%™YeëŕÄÚNx1€ÎΉiś;Ť#GŇ]ŽĎ`ő X1 7BĐ eďĽ@†–J˝ZęÚD[®„Y”ÖŠő­48LëçR_śŢéŢ÷†rőŻy?űL2âŕ𳊷ąÓ”"‡Âi‹ŠČŚ%ÓÜÂß#~ń«SÔ|°u)Ő2ަĂňŻ´ů,r'VštÄâ§Á˘ÂÓ­üiß„SÓ°o&řfO®XËpř‚S0łăwKú÷ÎÁ‡í_—YŃ3ŕ pfNç”U#¤řŔą˘U NŹĄ%GsÝ1ď3˝Î^ »Ďsçënʸj%łf (ZBcB,ŚđNgDTŔŽ 18łV†ëÇŚĂ©Ő89q`Ú€sO`_V´öëqi˝Ä`»JÖmş €ěű ŇáA­ Ębçcł7ť0ôŐźV×Ëv–߉à [ż6=Ý×}n Ś+Xf¬ ˛}ę>ňíĺł'€ @83±:@hąől˙ţćÄxŰ;ß ŕŐčEJ}Zy sËŰ9-ŚůéSéżÂ˛ńí€pô§‘kKs\<ÜO?Ú-íµ˛îŞËĄ‚řł–h¬š‹&NďqlM°s$TX¤&pf­xĚśpŕ NČ÷91‹łX~ @ÁU…„z"#Ň +ńÇ|cdAěľëÓW]±E©2ůmqHäGs®fŢŚ5mĺmpďîÝ[®¸JÝK“xó¨ŢQM„ĆYe<’ŻŮ˝űÓ[®Ř’nň‘&YqźíěéĘŇ×9˘tZ˛jbiÖ'_üâ·&Wît´Z…O˝ËżHů[09… ÇśÚÁśĘţgŘ0‘ŰaőŹÄa Ľ°ÔŽĽËé†ěm {öłCd¦*o!ňĎaź¦ęoŠiľ¦J5×NUŚ…ě?Tďĺ´±RÝ_ €ÓY˝‡ü.LmraeĎĽ·V4a]ĂP˘U4ă… ?÷ÜsnľyűÖ¤ŤtVžúď§0ľröĸXÂŔq%E_Ź˙đkŤôŃ # J9‚”Šbí„ř»8ßf›rů–ou€#¶ßwQ=őž.mŤ DmŮŁžĎTaTÖĆeviý‰Ňm¨LɆŽpÄuŤšĽqÓĺoÜtůëłW±r€sMĽăŇöUô/PpÄR…:ôío{űöíżąi¦Ó`ë[UÍć6ýŇ~ę–™U_ľâô˝éŰ#~ŞÂű:đ»ŔŻţbS•ŇƆa2(šżěb€ÜA@IŹ”ď°(:Á@ËŘÔ[WĎ«… ĆšPÖQ„†‚ÔKý5±ůËB|źĹ˛ aŠ;aZf'µ»#–·"^ĹôÎ5ńxI'08ó-Ħ k­ožŢcjń#›¶´J‹źýŤńxăwŻŕb`ü\ř7ëńó˙° >8}o÷ť ^ę2!C8Hg `pżpĚR eJôSॹťżKuGÎ2ĺ@Vݱon—ŻÍKÝFs®‰Qa^…¸L…5FB‹Ľtţ?w>¬iúN!#Íü qMXµ´üń(k&W]ÍŐŕ}‘»O"čă Aó$Ä=©°@ú_*˛ ý‘$„ô÷„ ů¨ščC…‰ĆćŤë©Â„,T†.ÄTaB©f¸ŃÄ\TŘÚ_'mëµ#„ą0DG‹DĽbÇŐcŰŁËŰnşuP§âĎ!YH4öĚ:bEęď¶›nýrâuŕś…ÓóŮ©Ą81ŕÁ‰đ€ílIÄëSS·źEň’łHT]n"'/x ç9ô­ś†V@!nŞţ>žř¸_›ZzŽ ÇçŻČ^+Zś-‰xŤ¸HĽ¬±węöł_C‚ŰÄUTä(Nšş4!­…BÜ0B‚·Ýtë‘d¬çŔTĐĂ•\ÔbÝ»6Gě!rě寱‹ä S·ż†ä5ÄB‘‘c 1!&âfP-đóÉ’-SANWJp7NĄŽŘŐM±ĹKα‹äΩŰ_CŚ[Ĺ=̧"Ç…ťŢ„x„ ×ÚÜĄţČ7f¶Ýtëˉßűž© “ęŻë•,Ú]±5#6q,ĺŘMµ8vlęö׿Š;>8oZĹńü\˘gG<ŔŽďáŃÚ.uDü4Yrž›ëŻ+őW‘`M‹ˇřⲌ8‰˘#ŽĹ[!ľOŃb±‹č#S;…;ž9Žč 1č'šxţ™Ď ü>ËË/6}R‚“xɦ‚şD_¸Ş»žă%޵J5±+‹Ł‚ÍČíĂęĚtŘSúč\Ä>ܸ ÂŞ;7L}ĺÖj11!& J[b‡S>´T×ßB:á!v]OxaOM'şUqlsIJdBQał§.Ęúčś(ß‚+Z<=@-fĽKÉ‚â6ŞđţĄ=Ä~‰NŮu]×ń;ěe‰„¬&6ӉܛĂę¬cęśd‰DěÂő;ĹhŘ\pnÚ˙Ę©Á aŐ!& GŰ`‡S~t)b?Ó_żÄg…/ě°}pGY5qYF\ e]e—TúčbNE(‘©0Dăśńë_™üřܵuÄ„,!nśT…żş‘źKpäÁń-v8[ăÄ®ëĘÎ:)ÇŽ&ÇVGlfÄĹ€8Vç—Đúč<$Ne(!Ľ° kź3ľí•ÉŰć¨ĹQÄh‚ť"ÄŤŰáT…XŠH¬ŻH°o±ĂĘ×-ŚěĐwZ\•«}tJ횥jm¬[4ŚôB…pÎźzerÇ\´U„,!n–T…ď[‚Č[ %Tw\’;Žëy^ś ´«H'„grlĎŐÚaŰä"”đc]‚Ő6¤ 8IŢ@0~K8ů_úÖbF„,!nÜH>7–K­Jřz@aȱ뺞S1¸#ëě")ŽíqâĄZ¬ŽlÖ&—p]ÄŠ.Ť†Ą'J#Ißö;ë1YBÜ,Âo˝'Čĺ5•]çm{5›ëUîZ 7(ôŚŘSgV­E.â1 k4 @k$ąăuă·˙lň?őgŠc–Żb0ňBܬNC‰˙ą´¨ÂŞ—äĹF÷ťëcíEŽŐéáťŘ–›cę”nşH-Yë¦Âş#NŚ×sĆďxeňş>´xÍä¶ąíKλŕŕô»ć~BZÂČ q¤*|Ç’,‘(ްÚÜkٱĄšÍsőÁćXguş -#ÖJ&ÜB:löŃéZ F4aHpŢĆď 'ß߇ϱîb„žN@HMF[O‡“?+dľŞ çÎ×ĎK)Ę W”˛‰ Št2 [:ˇ;b·čŐ1u˛|XéŁóŞí°č¦S»ćlv8oô•”ŤŃâIŁá? ,ú«F)…P¨cíôÚ ×U*ŘTGlfÄŧrčłżű5˘ałk®(ľň­(>÷Ęä{zr¸Kλ`X˙$„Ś,#,ÄÍŰáŹ.A$=«gy5»ďÔ°ŘV>áDžçą Ľné„=#¶vÓyi(áG–z5آá.F8QžŇ+_ŕ˝ýW d0ÂBÜ ©ŢdŘŐí°=/®,.–ĺ®ç:úŕ­š8ËťlŇ5uLť– -vQ WvÍé ńk@ČńëĆ÷ülrK}SĚ:bBLFU´ĂiÝ KR NcklI*JŠ‹ßđň.n,ÜQ–{ů¬đZ:»üŞ’aÍ—e©»Ć“¤ńż'˙UM-f1!&Ł*ÄÍ’ü‘źŞp*ľ™›ÖŘžTĹĹ˙ÍqňI’x¸E›zBŃb(Żrb¨}tʤk‘U*\Ö5We„˝˘(ׇuĄڤ7ž#rS śzaŻřÖíbŠÍâbcĺéÔţş, FÉÔĂ®ŻçÂZ"äF¸T‚M#,ßöôÜC:bBLFR$M‡Ż 2ĺuóF¤XăTť«“ é-˙ Něk“)cťíŽ8+–HЎJB ÔĚ…Ĺ…ĄrŮMřĺÁČëĆ˙Ůä;ꤜô‡“ŃâĆípňűKĐQôWFš5ŽÜîťxr$´Iä{Ž;ęc;´jb{É„_Â+ŘáŞŮ$şa˝T®¤Šą.Ś&1=!nÔ_]´ĂNŃ 9®cŤU9>±=I«řÓŹÁ÷{ž§Í¤U°9Öiĺ’ŮáŇ’áŤpÁçśńĂŻL®íjŠMb2bBÜĽţwc]…u!Vާ•#ˇż÷'óá{đ=ř~6U±ç:ÚÔG¬–LČÉ%<$f€®c—5#ěÚ˛M…ťÚ¦Ń!&#&ÄÍ“«°“i®STdŻĽŻĆH輠ÍGäÂń<ßÜawÄÚä>ŕd7Ş%ĺc—aŰłfNŢpäš:đ)Î„Ś’·a˘µ­˙:€ŁŞ°á‹Ç,Ľ\ »$–É(śl2 c¬sÁ+ÓK;ě:p˘üYŐc— ţ0ł§Ä «›Îţ•ÉUŐéźâLÉ( qă$—űč8©Ôć^Óę‹«“ŠÝwĘčg1=¦:ő„é•ÇÓ©%kú8ć’®9ł®4‹PĽpÁ;őL13bBLFFO‡d3K8 –mG‘cÍËh"Żr+I*Ô‘Đ™;Žçzr ťZM¬:⼂ŘGbFĂY„f„ŐaMyUŮ•é°ň¶;âLÉČqł¤ąÄŻ.5ôWuÄŠ[" ­aµĆ~Ń«S{‰SÜ!q”>'I-–ĐT8Ä‘9wO#l“`é‚ ¦89¬L'č 1 !nNÖ{i.aŃ_U‚Ą)Vٱ%¦5v‹I…_|–RPdcť…™M< VŞ•¬i]sžÍklZŕ ÖąN:Á:bBLFC[Ad–ä:™ČĺX¬ŃbŠŇr7µčŘL*ňĽŘu=×ń”tBuÄůäČﶱ˵Śp7ÍM×8¶ĄË·HGLÁqě0€˘6´Ř*ÇNQŽŐŕXO*\[RˇÎ%ď!ň<ß+ö×9Ú8żŕ…-Úp8M‚kŘŢ.*Ü]™b0BÜ:˛ˇ\‹s/lȱ[”ăB%rYRˇĎśéÄ®ëĘÁNć/›ý˛$‘(Lĺ^ěsz•ŕjv€ę‡(±Ž“¶ qěpÚSwÁŇr!F‰Y.j´˝îM‹,ÔI5Í™3=ů¤ç˘#Níp”V.85˛BŮCýä!śW˛ă¨čŻc1!&mâ–ĽĹĂYĄSJ!QˇÂ®M‹«ę.ڤBŞp6ôÎq<Ďód:‘Ť©Ëűč <‹¨®y¨éyµüÁ¶őµ˛o’Ń!&­â6Řᔎ©7e¸¸ b粺 Í «ĂŁ}1ľĂsĽ,ťHbżHäóőôÔ˙–ýžI©Ö⚡°Ł BLZ-Ä-˘´§ÎjŐ#»XVwQ©y±ďz©a*<hąpµ×ńĽ ;if4AI{…¸EvŔŮ®{Řśe]íÖ˘ UŽUEÎLqäą˘š Ž‡D̲#‹¨´˝÷=` ¬AGLI{…¸]X˘‰ą/Za*¸Yh‘ŤÇ‹}Ďő¸b?Uá|ĐsµPUű€1!&-âvŮaÔqÄ Ž^gťxŽë»®ç!‘YDł [č ĤĄBÜ:+Äi'^·×ędŮő7f7ŽĹD°Čq;aFLI넸•vĄ*9—E÷ącHŠF8ö+úË"6pŁ‘8AG4ĘqśĎŻ–·«ýň|ÂŞ BLZ'ÄmĄkÚ -•Á‚XtEĄhŞ{™+Ďěp\Ŕ‹7Ž;D1" ăäÖX•ŕ29–tUęÁj7ë 1i—·ŐŁUM%î’ö–H°ÔßŘO…#ž­ě!qc±“:â8ÁYPdZ¬Ęq\"ÇĄfŮé.¸Ý•şüÇŠŽ“v q‹é,T tY‡[¬I°—§ĘŁ’ňŮŕ"qăÄѰpÄq‚8FąÇőä8¶%ËŞ÷oˬbŇ"!nŻ,™CwQÎD6.“`C‘ĄVU85Â.ŕ"ń’Ä‹bÄnÁÇ1:»…"ĘÔ¶TŽ{vŃ5\.|7ĹĺÉż»“«ĘľČ(b4AN‹„¸µl޸~çÍŘúŃż®˛˝ö"Ě 0¬IDAT ö śk®__·(ÁY.ś†‰˘ÂâD1Ĺ b'Sa!ÄŠ5ŽËqľ8ąňÖÍ.TjôšĘgÖńᡄ´E[m‡]r^ŐgF8VV ÁŐäXóż®j„=-Fâ&žÇÜ,—Ȣ‰((eËUXb'·Ćš'•…e}Ő~ąF„´BG@…‚ϵ¨°Ůá&%X«Bó ¬i±Ň)'í°xFsâ"ń˘‘‹ŘAěfp‚c% p‹B¬YăbRˇZăžä¸Ú/WŔ„´BGR.);Ë%ŘAŘł˘“¶'â)^ś8qŚŘMłŕ™#V„8R{íJ¬±ăČ”ă®={ŐZěÔbq&Ĥy! ; #š(«yHĎ›'†ţZłWšâ,N5Ý…(vąYF¬8â´š86LqQ‹Ĺ ŹŠ¤B¦ĆšW™ĺbÝĹ“gďJ{ę@GLŤć…x$ČúëVŐ<č%hÖî8żh„Ť,z.,–(q"WÉ%¤Ş 5LrS,zít-"'3Ë˝Xc«AÎŰŽľ©ş§ě¬#ÄFĂB<2vX`—`­ Ř:"#Ë\·ŞS.ť€¸ ‹’5a‡…#N{ę2G#/ścĄ”ÍÉä¶BµĆŠ_ŽŤ(Ů4ČV;,6u…Ž:â^¨¨B3«€­K™V±’ 硄—I°¬]Ëq„Ľp"•ăČbŠ;%y±”ă:ÖX—ăbň߼®K.q&ÄF“BúěšWť±7/Ős‰Ř}tU8Ô‘Ínöx¤L‹-±:7Ľ:ľN™w"6K٢ôYJZXüħď_3ą ° ŽtÄCD¨Řš®›řyµ^ ™ §i–OuŠĺkN1 @žNX2bŮS‡<”PkŠŁ¸XĐ)ZśŠý÷ŢKb2!¦VÉbЉ,”păÄ]sŇk8´‘Íj:¬:bKá„PZ\*^‘ă´×NÄ{†¨Â`Ő!6čç§Ź>»ćE›řx^\&Á5*UGl)ś(vŮ™cťK{íě˙ʰâÖb2x!¦¶’ĆłĽyµÄa‘`cds™#¶fÄęř:ËXgc’â8ÂŁ_ť ĐbBG<Żd©1˘7­.ŚŁ3r‰ŠÚµŞŚŘ(ś(T°Ů¦žřÚĂĂÍ"4b2`!¦®L*ĽřćŐ –q„k¨°L'*2b91±ŞĹÚ¬ â÷Ą.óc„%¬š Ąޏ¤ö­ů!đňż(Ýö­ĘKŢvY·›˛óî;–oü»Ş#·÷wAĽ|篗mzľňŔŰně÷Gî{ĺ?9ĎWţoőű˙˛ôŔĘ+ľöŁgĘ6՜Ý1!„4 …B†BL! C!&„†ˇBHĂP !¤a(Ä„Ň0bBiZ:NďéoÔFÍQ%ö+ö{`·QĺVŹÚ¨şbźVL¨:°˙Ď8ßöýďŘ÷—S=jŁâŔ~W¬µQuĹęQöĹÁé=]Fm áŠŐŁ6†qĹęQUö{ĹšŁ6*č.Ä×_su§ć<ň@X@’$Ďzxם÷üŢo˙Ö@NJ!¤šO}ţK׾˙}»îĽg×'>ĂŚB†BL! C!&„†ˇBHĂP !¤a(Ä„Ň0UuÄk&WÍŰ}BȦbÜG•|wé`!„ôÄćŤëË6U qĹa„B3bBi 1!„4 …B†BL! C!&„†ˇBHĂP !¤aj=*‰Ň+‹y`ę’ó.Pźu´nÓ–o¦qę<ö‰BLȰűŁĚF‘Gľ1c®|íGĎĚ˙ť´%ç]Pg7 1!d>X„ż–¬ż“¬0#&„†ˇBHĂP !¤a2¨…uzáűľÄN>(ćç&ç˙« #&¤íH]Ұh«Áä_xß1!­Fsg˛azdą§vŐMĎĹ毢úź®ć7¦ĘýĽ}3tÄ„ŚYʇXiÝs-¶v“˝~şúßů;o #&dô¨Đţ6-¬ź®ÎGnĂ×B!&d$™»Ť #¬1Ç{níG¦2zX3Í^i¬‰YưnÓ–>>xk?23bBZŤŮÔ·ňZŹťË [EýO§­¬řřóöÍP i;R‹Í'­Ł©Î±e+G‘úź®â#›u&rçyűfM2Š IIO[»Ň6*î¶~]OÝóümP i/Ő>wń°ŕż 1!íeÁÍYđß…˛HiŹľłłŽB†ŽaQ˙ ‹~P  5V¶Hŕ·Q …ˇĐžü±qřUt…1!„4 …B†BL! C!&„†ˇBHĂP !¤a(Ä„Ň0…:âO}ţKMÝ!„,ZR!ľŕm—ޱűŇ^ľîš«ďŘ}÷ o‰BF‰ą)á=BüŔ}źěű&ž9ôpßÇBČÂ`.*ĘŚB†BL! C!&„†q\ű‡żÓômBČ"e×'>™‡ďmú6!dńrpzĎ˙DSw»Ćî{tIMEŃ 8’šnIIEND®B`‚fox1.6-1.6.57/doc/screenshots/cometassay.jpg000066400000000000000000000210711326741342000206150ustar00rootroot00000000000000˙Ř˙ŕJFIFb`˙ţCreated with The GIMP˙ŰC    $.' ",#(7),01444'9=82<.342˙ŰC  2!!22222222222222222222222222222222222222222222222222˙Ŕ»ň"˙Ä˙ÄV  !1AŃ"QTq‘“Ň26SUau’˛#34RVbt”±ł$ˇÁBcrsáđE‚Â&5CDFd˘Ăń˙Ä˙Ä01!QAa"2qˇC‘ŃÁđRS˙Ú ?“;eËÎdłR–}ž©ÇdŮ)*—B\RŞ’UśĽŠóÄf[$§’Ą*bĘB…ę„&a§oaĎCꉜ”şŃcÉK¸¤‰D¶H'®L­Ó!ôşJ’›”JA4cúĹńÔJ_ä¦Xc:˛ öIMć.1e ĺ+TĂb”×KÇL5Ţu±O ·×7¶'oŮýŃ7žSĺ"ĺ˨QëÍüˇRŇUĺ¸qw†…¬?”Xµąc‡¤‡ąŢu±O ·×7¶ ç[…ľą˝±6›‘aS vfi-%dP GźŁE4Ü°Ä´ŞĄ\›BJ’@/9ÂƸę˙b'žÉŮĘCÜŚŽ¶9 }s{`lrúćöÄÍŠÜ™pݎ# ¦!켪$ĐŞ:˘“¤¸˛iüˇĎdě‡)rżŢu±_ ·×7¶ ç[ú }s{bj,d)×[ęk*ů5ééŤŇ¶cr‹B󪻀 p‘˘š){'d9L~ääu±_ ·×7¶‘ÖÇ!o®olY?w¤ě‚‡îôťç˛vC”‡ą[ď:Řä-őÍíyÖĹ>‚ß\Ţز(~ďIŮÝé;!Ďdě‡)ŹÜ­÷ťlSč-őÍíyÖĹ>‚ß\Ţز(~ďIŮÝé;!Ďdě‡)ŹÜ­ĆG[…ľą˝° ޶9 }s{bȡű˝'d?w¤ě‡=“˛¦?r·Ţu±Č[ë›Űó­Šýľą˝±dPýŢ“˛ »ŇvCžÉŮSą[ď:ŘŻĐ[ë›ŰČëc·×7¶,Š»ŇvAC÷zNČsŮ;!ĘC»+s‘ÖÇ!o®olζ)ôúćöĹ‘C÷zNČ(~ďIŮ{'d9L~ĺoĽëbźAo®olζ)ôúćöĹ‘C÷zNČ(~ďIŮ{'d9L~ĺn2:Řä-őÍí€du±Č[ë›ŰEÝé; ˇű˝'d9ěťĺ!îq,+&bJČ——}†ĐâV˛´đPT xAXSFµŐ jδĽ×o=ťýÖĎ‚©¦TÖ‡TwÔǧ2¦-…„’A§QU®8k+d"QöÝC**Y ×Ő«#$¤äŰ~¦®’!sę`Ú3$%4ÎŻű>s7›úc˙ć+ő‚ ’y1,ä섳imJ@BBŇB‚VśjšŚFť"eŮéłdó-˛´ŢZ–BPىú&§NÖUřţIJÍîŹNQ^-Ďa[!ť©$ôôşPŃ[J ĽIiF˘„SͧN¨ó&zs”«®˙X3Ó|Ą]wúĹ’đÜTó/÷îD2JRKŞ=A',e$Ů— uA¤›#G›PŤü/çVvG–3Ó|Ą]wúÁž›ĺ*ëżÖ%xvűËńýç&íŁÔü/çVvAÂńnugdyc=7ĘU׬éľR®»ýbăđ˙ěżŮO±ę~‹s«; áx·:ł˛<ĎaĎ KrNbĐqOI¶čS­—Ż'Xˇ417s+˛iéĽčłŰa ’–™hŠŐD‘x˘î4Śů´¸ńşSOé_Ů)·č\‚ÚjĄăR *Ś5ᢄ( úeAsN©&©+$Ż#B;ÄóAq7QU2–SŃí{Ë)TM·T4Ęy?G5ď. ŐŚÓ_4Eü( ŚÁvLbpń@SHXˇU "$0Fi A‚ ¤…]›ťĘ©YfL;ɰ”§ô×]Ž(®·UđžKŃ’ţé‹?s±L‚łÇţń?ľ"°ÝWÂy/FKű¦.ŽČ¦[h ‚: ‚‚  € ‚"ÉÜp‘lZÔeOVM5BA$üłf´“M4TVŃdî6 ­«TÉ2iá®ő>u¤t`Fť0×0úĺ Cí<q Ro(PPSJâyŁdş»¦].¸‹ŐާL!äş.&Re%´©ĂŠŽµjM@:ă\łv€Ń2ĘŰHĹ(M ÓBިşGxžh Gxžh ţęľIú9ŻyqJ ‰ÎębąQ'čć˝ĺÄRZ^ů2ĺ— fśq´hDąV¨Ú%IŐ K!n ‚a/K2٦u°F‘xFŞMŇ6-;JŮĂ2ç‹Ô¦iŞ:®f4użhF‡ĄbČäerĆŽqkÍ”ŠCĺŠF‡5ş2*”F„F)T!ňěY¶ÖPâäĐ´šŞuAâ"ô_N*˛·Ks™t>ń˛?žg·řgĆČţyžÜYËć˙ŁţĎ{Ś!IŔĂßć|lŹç™íĆą‰Ą[8©u$ŞďÉL¶á®:’˘uDKX«quô Kąvîxkvăűâ*ýŐ|'’ôdżşbÎÜä× l˙Ć'÷ÄV[Şr˘D Ił%˙CGĺErÝX#7Më´5â…f]ĽS›UEk„tr"^iĘV⩣D§8 ÇF …ć]©µTi Ӕ­ĹSFBó. pŽŚ ĚąR3j¨Ó„!y§)[ЦŤf\¨ŽŚ E‘¸í߆-kěÓÜiŞQ?:Śx « 8pŠë2ĺHÍ« 8E“¸ËO9nÚ¨ia§;Ś®´¦uÖ”8Ž(ŕµ[–Jš3ÖhOÉ·Ŕh|٢(4]XC‹>JZU¬ä»Jo:”•(“Ć4ź9„Í3h"aľä™ml! •jµ‰ÖEyáÔątË4_=p_@U1€*ôw‰ć‚w‰ć‚áî ?íLźŁÚ÷— >íô‚#˝ş‰¦TIú9Żyq•x%@Ö0jSvmÓş˘ă°eŮE‚ăí´•¸Q©#A¦‡LE-ě‰~EN<äôšŠ”n¶dĹRžBńźŇŮyHü“Wĺ.~ßrvĄĹ•zăÁĂV ŹËĄo«ÝľË©ęäXs|SwÓ˘8S >ŰŠRD$Ţ%2´5ÇE†ź÷Ť[9MpéŮ€ŁŚ3qŔcÖó2N¸Ě<‡ĘhsD7QÂ7-@Ö¬ăEHÔ¨°ç2.ÓµźzI™űxĚĄ.Ţ| ĽëśTÁ&+Ő4^¬LJ&Ţ–aÉ+βCˇÓZćÓJ'AÓž5áĎäµ.›Şľĺ‹•ý›™oL!kTţN‚´¨)aK ˘…Ňkv ů˙¦ÎWsn@)ôZRéͤ‡55®EkŃŚY˝×g)Ą,ĹP BZ Ą©Ž„ŇeĺĺŮAd)č„č 48ź6ś}që/Ε*ţ śŞ·Ťn©hqvŤŠB@j—ܩদíyĎ8ĐH1ܤČKK%,´MNĚJ:‡_Ki ©DuG¤qEاä‹k&E)ÖI¦$ŻGD÷cđZKń©÷f×ćž7TÎŁ¤‡{śxgţ5?ľ"˛ÝW §‘ôdżčbĚÜăŔ?ń©ýń¦ę`+*dMłe…x°1Ž;Kr SzµÇŽ6<µgÜářëóÂł ÝQϦ©:Ň+¦5˝óîţ±$ľŻ¬z`ľŻ¬zc IZ‚R Q4k1¶bUŮU%.¤  ‚>±kľŻ¬z`ľŻ¬za0@ ľŻ¬z`ľŻ¬za0@ ľŻ¬z`ľŻ¬za0@ ľŻ¬zbŃÜg8¬¬µ’ÚP·.⨜^@ÄĐáŹU‘hn>ë’ůKl­”)Ő‰^ő“‹¨®W]óMŮ“‰–\B‹-_MMt(LśűĄŔËwnR[ Ó]‘ŞyŮÖVŹ—”ae(+iőT‚kxTu 5Ť0«9٧ҷrYmš " šâ}PpŽń<Đ@Žń<Đ@ Ő<'“ôs^ňâŰ”12ÝWÂy?G5ď. ő¤fČ­łD!ú&×lŇĚÔűLĚĚ*]Ră©Eň„€I7učŃ`şC©5|˛żĘsÜTSĺ«-ăt“KúzYWȫ۩čcĐ)u”×Ű©’“ł^ťT´ół2 $ŃWs¤«Rn€Q)[–űĹ”$T9,Ł]$ÝŻOš15—Y6ę–í¶Ű7ŞŁ›sŢ<ůÂPu5_SΖ9GuGh»jć[*b\Ş„¬p#EuóáúF·O•”śÉÖ››T°KĘ[E-_ľŕie(Ó…xőFW–ah9JŕZ iÁwÍęóÖ89•-ąeIËŮłču7Ô”ĄB‰Í¬WĆDVÚŁ”ťť­Î<ł˙źßXî«á<—Ł%ýÓvçŮ˙ŤOď¬÷S eLP¨lµG&; nA5ÂŢů÷?ÄXRÜmE7[„×ĎŚ%ďźsüGő‰ sgü™~g[ &żX‘ë«ęŤé&rÂx(•;(čpőÁW˙kť1 |ťŚży®'Ü«-ô32¶Ý®eöÔÓ”ÔżQú˘bŮG¸Ćq3$ü©«7+@âqIő˙M0Ţ$¬ ‚‚ ,ýÇć+”–ÓÎ%hIRR]@Ĩ€ś¬"Ď܆eą\¤¶_q"âeEkJ•@©®xßś]üÚÍą„­-޵I 5¸ŰgĽĄ…ُ×,„Đ€¬*MkNŹç-WqĆÝźrj\¸„޵şk¨¤F#l„ 0ËŹ(8Š€µÔPăZqăWHďÍďÍÝWÂy?G5ď. ń8ÝWÂy?G5ď. ńž1|vu%óę˙)ĎqPÔd°ôÔúeĺŰ[Ż8…Ą  Ą@łť™h˛”%?:´…)ZŇ€=X“ç§{R#ݦ¨l‘ćÄ"ĺ¬ú.”ş¤Đꡥ"ÚɰĎÁM†’ŮUSz¦‡HóGŹâ:©áĄąčé0ĆQr—ˇ]9"äšÁBÁŔŚŽĽśÁbަq&Ч묮e„¸.…ť!&˘#vi9ç@ďnăĎ\?¬zߥ|K*ŐA-§ŃŻóöďŘż4<§q:PA~°]Šrá[¶C/°ÂmđIÔ›ü{c» ­K:`Ö”lăXÇ®ÁŹ6 G"µF©Â91µ$Wö€ţ>`xŻÖ5IâÓĚŻĐĆë@˙0ĽWë ˛¤&çf]\¬łŻ%†–ëĹ´ĐŞ•MĎš­Ď—{ç>Ů˙ŤO﬷TĺD¤Ů’řzŚY»śřgţ5?ľ"˛ÝQE9Q" hE›,GAŤ1ŘĎ-ČFmŔ Š ¤ly‡sî|š»ă«Ď î—hEúWMëŮe.M¸ăŁä]WçÄŃ>şUN¨’ľ†ÉÖV†e  ŐU b˘Uú=PĚ4°A Źľ6ŔűĘ}n¬ŐKQ&5Ä#©>˝­žó¬<®TĘŮtď…ńZ±×C ‹,.—”–N˛•…ŽŤ#¤Ćë#‚ë„˙m§O­ ôŇ#›»8’·Ä‡ ”PIR]iiJUZsńză^ez®eýa R ¤š~Iщ /Y#‚z=Vä[[‰Ě;O›QćŚ)§ß!CśFÚ›4Pč Ô\a+R R˘“ć4‰:»Ň¬YŰŹĚ\¤¶^H$‰j`iW+Áôbł:48±˙1‹Oqu¬ĺe°Ş’®ä:˙ĽLnO»:• ÜeN)´©m:Ş“Mf‡]ZˇÄ»éq!ĆËÉHÎ% é¤"fĎbqĐěİqŔ(V00™;1‰4Ń 5ŞĘÁ$Zi€+dw‰ć‚w‰ć‚Źî«á<źŁš÷—hśî«á<źŁš÷—hĎ?ľ;‡¶[îËO%ö[O6‡‡QJ’B #A†0ćKçŐţSžâŁ’Gč}SĽTč;\N^ŰççŽĚ…ĽüŞh‡T9ŚDÚuM¬) )PĐAĆ5<‹ŕ»,Ňńá I˘ňŚůtńËŇFŚYĄĐ‘LZ®Í*ŞQR‰éŽĽ„şĄĺÎpQĹš¨qqáŮÖĺ–ÂŹđ}ĚŻRżćq¨~ŢQŮë­ç (*j“Iŕ:–k>L±rô[WóGĄŤC'Ĺ9ŁŻ0fŘ‘]ĆßJ•JÓúÔőżg˛ Ε4š×Š>Áë´Ębo!¤Ö—šCH™+  •®iŻš%vĽ«Ň Şg¸AşŇB¦±  ˛pĆ*Ö4Ƹü¨Ë-Ůć]âe_ŮëKňęŮń2ŻěőĄůulŹT˘A”>ĂO7`¨Ue¤¨ŞčV8R\M=E™eM!Ą´Ýt­e (˝B:dE[«<“ĽL«ű=i~][ Ţ&Uýž´ż.­‘ë™»"ËĎ8†Ąä›JTxđşjĽ MEŇ#T••(˘ÔĄ–V]†ŰUiBF›ÔÓÇhž v<—ĽL«ű=i~][ Ţ&Uýž´ż.­‘ë•Xö[hCĚI%NµJ‚JRµ§ĂW%l‡qRíY±x ,RĽJ‹ş*ŁMF: „Ł^§”7‰•g­/Ë«dÄĘżłÖ—ĺŐ˛=b‹707-b&]+áćĐ«Ô=čÇ\lvĚłÚ ł›Yh*ę"´Ăýë6‘Ô1Ę{JŢ&Uýž´ż.­o*ţĎZ_—VČö4µ…d8ÂJ¬ůe, ,†č †šaÇw˝ců6[Ř' SŁĆ›ÄĘżłÖ—ĺŐ˛,=Ȳvٱ­ŰEëNËš”ir—·š)WŇh+ć=˝ëɲŢŔŽ}ŻeČHʇ%eedĐ© ˇ"8 ‚ŞŃŢ'šŢ'š=ş·…~ŽkŢ\AbçË •·gšž~yÖܢJĐPÁ+]TJ…Ą4H†ŠÜzËJßÍ >a=¸ŞQm–FI"Ł‚-ż‰ű/íú„öŕřź˛ţŃąÔ'·ŔθŃRÁ×Äý—öŤÎˇ=¸ĎÄý—öŤÎˇ=¸Ž8ŃRFÄ&¦-Š /íú„öáiÜ’ĚOţˇ_PžÜC„‰S‰Zʱ}@R$ XS —ĎTQÇH›Kngf˨‡TŞržÔJٲd“ÝÚ’Ąn§lyÚ¬Z®žToîŤÚ|şoÜ•}Š=ć3d‚1†ŞĂT\Mî_+l2f…ŞăaKZ@ ‚8*)®ź4$î-,ăo~\v˘čiň×ÄŠçźôe2¨Đ°"é;Ęźřăß—¨k=¸Ľśś›Ó*¶ć–TR™`J©¨p´ąašô)y`ÉäĘJ7ÂvAľK[–a; wÁďrç:¦ű0|÷.sŞołňZܰű Ůů-nX}„ě€&i—ťBBQjL%#@@ěg5=ĺiźe…ď’Öĺ‡ŘNČ7ÉkrĂě'd4ÍOyZgŮGf0ąyÇR»RaI:AB÷bľK[–a; ß%­Ë°ťÉ2ÓhMÔZo¤q ÓfVn]”4Ő©0„!! Ł@Ůâß%­Ë°ťo’Öĺ‡ŘNČk›´<Ż5죳nĐňĽ×˛ŽĚB·ÉkrĂě'd䵹aö˛šćí+Í{(ěÁ›´<Ż5죳­ňZܰű Ůů-nX}„ě€&ą»CĘó^Ę;0fí+Í{(ěÄ+|–·,>ÂvAľK[–a; ®nĐňĽ×˛ŽĚ»CĘó^Ę;1 ß%­Ë°ťo’Öĺ‡ŘNČk›´<Ż5죳nĐňĽ×˛ŽĚB·ÉkrĂě'd䵹aö˛šćí+Í{(ěĆĚňĹj̨q ˙Ó˝ňZܰű Ůů-nX}„ě€&=É5ĺ'ş¶ű1‘)3Z›Eúků6ű1 ß%­Ë°ť“”6Ş´Î+ŘNČŚËIbiÖPIKk)Ó@i1ziĺľâÔş©J$š 5‚˙Ůfox1.6-1.6.57/doc/screenshots/contact.gif000066400000000000000000000062051326741342000200670ustar00rootroot00000000000000GIF89a¶<÷ćććłłłßßßĐĐĐ222ĆĆĆVVVáááŔŔŔ»»»†††ĄĄĄvvvŕŕŕaaa QQQŰŰŰŁŁŁ***ÄÄÄÓÓÓJJJ ŚŚŚ!!!ľľľ>>>ÎÎÎCCC GGGEEE|||FFFăăălll^^^[[[...şşş˝˝˝333000¸¸¸±±±ÍÍÍ111żżż°°°mmmÚÚÚPPP666---wwwŐŐŐŻŻŻĂĂĂ“““ČČČÁÁÁ’’’ÖÖÖ'''sssŘŘŘ    ˇˇˇ©©©{{{ĺĺĺ«««‚‚‚ĎĎĎ···‡‡‡´´´ÝÝݢ˘˘ÉÉÉĹĹĹ@@@eee888DDD¨¨¨¤¤¤ŇŇŇxxx×××ÜÜÜgggŹŹŹźźź€€€+++ąąąÔÔÔŠŠŠŞŞŞWWW}}}¶¶¶XXX¬¬¬ĘĘĘ–––fffAAAiiijjj”””ËËË KKK444ppp•••999ddd&&&HHH]]]……… äääĚĚĚRRR„„„,,,tttŃŃŃ555µµµâââŢŢŢťťť(((===™™™­­­///ccc___)))???ŤŤŤÂÂÂŽŽŽŮŮŮ"""BBB›››IIIooo®®®śśśSSSrrrššš‘‘‘ÇÇÇ:::$$$‹‹‹TTT———%%%ĽĽĽNNNžžž<<U@´NŹA1]*ŔŔŔ„*5Ą‚ =Ę1éĹ`4pđ€k­!D0B…:-\p€!† :D¨Ş–­[:=|pÂ2 €$8”Řxpá„Lśř€b'€ľmß —®â…) ¨°`éO\ð‚…„UAžÝęâŚ2\ĚžA#A #nŕȡc‡ŔŢżŹŢŔ#A DČDŠ˙92"Äôęךř˘ĎĐ MܸŤ…I8śýš˙ě (±"í@Ţ äÄłA1QH!Đ ކ@R8@B(\ |HP Ó†thbA6 ;!ř† Žć`CWtŔ@A^ů7eˇEhmÁQ\ڦÁlWÔ…(ąd“:ń0y!Ŕ€`bL°—YnyN÷PĹNV2Ő¤Š<ŮĐ`$ťŻéÔ„@dŔ%He`Jn$•PJIe˘z2ĘgBś††k@žé$ÚžŁm5śhE*ÚBltĺ˘ýM˙:š§+FąO¶±¦¤á„nXč뢣z†Đp°„@q ‡@s„*)©ČE¦°QŁÇ"ËjĐńk¬^éT‡@(°ŕ‘w,€Ç 7 ”‡{đчł­ ŔĘŐ  ݛᆪ%{ë@6D±D Ü 2„b­ÂĄ`HMüŕ™Áúň›0CÖ` 9[źČĐx”Č '(˛ČAŔH#8ňHż™ jD2¨Î<ű<˛¬ů Ń tĆ“¨*$G ’čgH÷üóŇ -Ůfď±ňl“¸AI$ąq%wLuTb Đsç S\˙‚É @«÷ŕ*éäđűKřâŚ7îřăG~¶.e˘jlDĹ J”ż ţi›·DŐJ–<˘ %lr7śTB˘gDyCXúA§Ż-yDvtâÉ'^ř€‚@žJG·ç$řî¸+‹RlD˝Ú_Ł•V×]yí•ÖZˇŤ&a „"ĘňeđÚLe÷zI5ŔĂ1A ™müŢżŹWüxČî` ,°F6Ńfţ×?:i/A0 ŔéŤn ń‘}Šsśä,§9ĎńŤ|ÎcŚ‚ű6áľ y9Î@ 8PŠOâ qˇr`(‚lź@˙PŔŔő§y=ÜáéTźă@â Ř‚,+ŘHA9˘ÓŽŢ7,PČB7ĘťX$TpŕO2R!•AHB^¬@2ˇF¨‚sľă"żřĆ É‘N ŔVa@#R!}Śc„Jŕ“ â!ă´”9éÄNtzŐ”Şd6, @KtrąĽ&ś@e:Ń$°X Ă °\Ă!3é¨ ¤˛–@•P‘*ć!·Ŕ&ťÔ(”B’ľ”ŞŠąIe&n4¨Č–V3E RŞ Z!Wäŕa„ßµ$«8ßü8–čn8&Vă[“ < D'©Ă5÷ş QŔ@»ŕ ŻxÇK^đ"b¤ˇvQ^ĆqbH.á^ôâP:YŠűBU8@Zµ-l«ţţ7§xt@ ‚@@©ú•~’PBľ/}í+Î:Ü@”Ă+|Ë1™Ŕ/´` :y,1¬€‡2c @B‡×řĆĐA ľ€G° ~C„#őâÄX ©hĹ,ŔoĹ*f1®p‚<ÂĹ‹ 7ŚY „Ř$-¬€bô‚˙!k.’žl ě¤/€Â’}™3-¨WAĐ|…= ľř…X#'ÜČ ÇP(tÂE Ă ş‚€ˇ I`˘v,ŞB4ÍiO˙© ‚@BA  AÉ0<+}éĹŕiaĂ4 iP€ÂLřD”‰ßé$٦s0âő˙8Á"†gx˘´YäZ3b‚$ ‹SAęý ‹)„Ŕ\„ôüç‹¶Ä%¸€^ ¨„  AC ŕ|…8w.%ÜjÝÚ5nžs´†đ88.a‹ř„!¤ńÝ‚l‚*řÄ®X(˘čÓPĹBôÎwż] Ô0 őŘäŔŢ ą» Ŕş¸r§ű@މ8!č[Ä R $ä , 8Â$jkb€nĹ5â0 LäÔ`H dO{ۤŔ6P…‚¨Ű Şg˝ëaß-lˇ°réO–T@¬A– ßfŁ1ŰjĽ ' B ›(xě@‚ (ŁvApŔ“˛ţöż_ 8І>Đ˙¤ĺw~é×XŰ@ «Đ jµ$ń…>b%Đ&’“H 1#Đ^ŚÓ 9v ř ‚"8‚$X‚&x‚(88;fox1.6-1.6.57/doc/screenshots/dirdialog.png000066400000000000000000000215661326741342000204200ustar00rootroot00000000000000‰PNG  IHDRő?_;ZĂ IDATxśíÝoŚçaßńß~Q @Ň{cô_°•«°Äk› nDÎ%Ú­4łŔ)^ř…=„őBEmABHđ¨*€ŕş®čJ@ŤłHtŤëlٰeUÚméŘpHZ˛ÍH.™š ŘIE‹Ľ2oúânöćÎźgţěěěĚ÷,nvţ<óÜĄß>ó<óŚ#) ĂP`==ă}B—_}]VĽwóÍUÖTôsĹĺ×®4râW&_Y|‘xĺĚSŤś€u÷ĚŤoĄn{(ÔĄĂŔ]¦gĽOźëĚSúđRϬĆ3F·Ö+Žł˘šŘ‰ęŐÓ| ţĂ™§ôĎR‚ýŻĄôWůcýż˙őžţďź˙‘ţĎźýH÷˙ô‡úß÷ŢŐ_ţÉ;ú‹˙qSţ“úł˙ţ‡úźwľ§{˙í»ú“Gwßű¶~rëšţřG˙E·0׏ß}[ď˙-ýŃŤ7őŁëßŇż÷M˝űÝo™{ÜW醤oU–e–×e9íů˘ă,Ö}1ÖÚÍ:v•/ł~_tśżCSçmúŐ†K,ł\d9‹ŁŁŃďQ˙öĺ×®č•ÉWt˙O¨đ@áA¨„ˇÂ„:µůüń­˙Şđŕ@úąíĹş[7ľĄ0őř×˙ý\ô©żrć)ťÎ©$°.>wÔB˙W)—¬Ííń÷YÇ~θ”ß'©Ś¬:d•›V·ĽşfŐ/é\iÇ™Çfý>iżwŢľŔşű+éˇËď—_»˘ËŻľ^®Ąţ“÷®-ö{ä±_<č?úĂ7 ·ÔWő ťŻş_Űí‘Ď…ˇ^Ž]ü(^vśÄ}’ĘH*Ç|ĹËŤł©k|[^ýčáđ޶ÇĎźV?łĚ¤úu¶ý»đâµNŻ,Ą/żßţÁěˇc~đ˝o”şüţ ±Ę˛Ěňş,gýÇf»=ň[Gaö[Gö|Bh-#«ĎaÖ1Yç‰^6ő‹ź+zeíźUż¤Ď%^nŇ~fYć« ˙–XfąČr–ҡžŘâ¶8&鸹¤wŹ*Ë2Ë벜ôŠŘnOÚ?mźß Cý¦ŃJ¶-æžy妕Y¦~/ĆÖ¶ţEëcűY´áßË,YÎ’xK›$ýô§RűÄÂ=–poůăżđŹô˝ůďé <ČěS7=ôa˙Č2Ë벜¦čö¤ýÍusúmĘ(sŚM]Ąrő+Z›ú\t]:j©ŰÖ­ ˙–XfŮv9Kj¨?xęďďl±ßŤo]áÁ¶~ńK’ţÁö?Ń·˙óW ‡:ĐçG/…ˇ.…ˇÎAňŇQ+Ö\/• Ż2eÔqŢ´2‹śëĄ„ϧ®PŹ\2®]‘z‰=kŰ©Żďç?I’®_űýĹşďĽý»’¤kßújć±<Ü/ľ>ířoĽ9?qKŰßtWŇéŁJ±Ěňş,gůĽ1*űą„şąŹí~ń}˘myë˛ęřśăýÍž€5żŞţ™O=˝X~¨ĄţÉŃÇ›©¨äËţ×NĽĎÖˇ@GętDęŚr‘7Ţş–· X˛ç/=§›ó?ČÜ'7Ô%é…żPK…@q7fS«ý¬B]’Âű·­OţňżyUĎ˙óO[ď“Ç,ÓŮŘT†šĎçÚŢŢÖ|>—$M&ůCI[ĂĹľŁóSů˙ö_ZŐĹŮŘ,ôűçć»·Jwf0Ěßéu¨Q4ĐmŽK }3Đ%Éó<Ť&izüÍĆkgcSŇĂ_h˘őE·úí‰íŹÚ˙募/´˙RB˝LKÝdŔf G<Ď“$Ý˝{O§Oź’3( \ŤÎ]°j±ÇĎź¶\d’rűĹ«XĘč÷Ş^DR G˘@ż{÷^ármĂ8ľXĄĄ„şM˙xgcsq ;ľ\T•@Ż"ŞsŮzPVëZęáýŰ‹o|ąUzTgZí[EĂei]K˝¨Á` Ůl¶xßt Ó"TzÁŢŞŃďq6-Ýř5IÚŰŰÓ`0Xj ‡÷o§ŽpOÚĆ`9@3ČĎ †Ö÷¤'iŐč÷˛-|3Ü÷÷Ż–*Ç,Ďö}Ů}ý•Ö2Żě­i©›Ç”ůb`îA(°RUZäiZۧ^Ç`»ńxWăńnĺş°Z7ú=RÇx¸K’ă‹őtM'[ę¦řmf: «ZÓ§nŞcŞYÚ¤č\îEµjô{śíńÎƦ\×eđ Őęš`&ËZ÷©GîĄđNŔô¬€Öş1›* ˙˘ÔO[kß§îűľFÓĂ祇{"Ü™‡ĐOlT7çPę§­µn©G|ß?|†şî‹Wŕ ö¬}‹~Aŕ @:~äjŃźŽóAës´¦O=)ÄÍuieÎçsmoo/ŢŹ&ůšJ[Gý[CąnˇęP»"­n©řŔşVŤ~Ď:.­ĺzüąęžçi4™HÓă~¨Âó°G­ls¦ş¨óg|I˘ř2´¶OÝö˛µčĎóäyžvvÎĘó<9îáeřŃą ÖçŹîk7Ă=Úń`Ź/Đ´Öö©ŰJ ôH•ǰڶ¶Í§´°*­k©ÇG«WąŢôsŐXµVő©KŞĄoš@´Qog”ł5 ´··§Á` ‰@´SŻg”łiĄG٢PźÍfŤ:áE51Ł\«ZęeűâÍ[Îö÷Ż–*Ç,/é}•e@U™QÎö6¸Öô©›Ç”ůb`îAđđ@ă–čR GżG޶ ďßÖxĽ«ńx·r]¨Šąß+Ї»$9n°X@“h©×$ ÷č@Óh©Đ´Ô-8›ť»Ŕmf€VŁĄžĂŮŘ”ëşň‡Rx'¨4­,ËDKÝ‚ďűMĄŃů©ÂŔ=îń«DKÝ’ďű‡ĎP7Â}ń ÜBÁžµo|[Ů/ |É€ţi˘ĄŢšĺ’BÜ\—Vć|>×öööâýh2‘Ż©´u4ĎîÖP®[¨:ÔŞW3Ęĺ—ÖrŹ=ţ\uĎó4šL¤éń|ąţ°ř“ߢµ9SťŮZďß>ń3~LZY€~éuźşí%j3Đ#žçÉó<íěś•çyrÜĂËđŁs¬ĎÝ×nrü~÷xH'“µĐ˝îS·•č‘*Źa-Ó˘¶}˛ zŮRŹŹVŻ2rťçŞÚ¤‰–z«úÔĄ“ý×e[µ: mzŮR/j0h6›-ŢŻ2Đm®*ЧýÔË–z¤H˙t”{{{ KôřU„řrÚčws=ÁýÓ«űÔŁăĘ0Ă}˙j©rĚň’ާ-g­ł9Đm˝şOÝ<¦Ě›p‚@A¬€FőşO˝ę`»đţmŤÇ»Źw+×€Şz}źz_ âá.IŽ,Ö׍–? -őšDáź €&ŃR #h©[p665:wŰÄ­FK=‡ł±)×uĺĄđNPiZY–‰–şß÷5šJŁóS…{"Üă/V‰–ş%ß÷źˇn„ű⸅‚ť/€şőjFą¤7ץ•9źĎµ˝˝˝x?šLäk*m Wl ĺşöua„< n˝šQ.︴–{čńçŞ{ž§Ńd"M§‹uţĐţÉoć~ń–»y|Ú¶¨Ś¤ąŕăÇńúˇ×}ę¶—ŔÍ@Źxž'Ďó´łsVžçÉq/ĂŹÎ](\Źř=îńzem3·§ÇĄ~č‡^÷©ŰJ ôČ2ĂZ¤e]äIs€nëeK=>Z˝ĘČőU>W=OÔB§•ýŃËç©'=§Ľ¨6z¤Žß°>zŮR/j0h6›-Ţ/;Đëh]ÓB€ţéeK=R¤?: É˝˝= ÚűĐÓF¸gmł-“V:ôCŻîSŹŽ+Ă ÷ýý«ĄĘ1ËK{oł-Ż ÂúĄW÷©›Ç”ůb`îA(BШ^÷©WlŢż­ńxWăńnĺşPUŻďSŻă‹A<Ü%ÉqĹzšDK˝&ńYßtŔ*ĐR #h©Đ´ÔKb V@ŰĐR·ôd´´m¬ -ő‚śŤM…axâU&Řů2¨[Żf”K qs]V™Q ›Â0”ă8µ?2€"z5Ł\ŢqY-÷´@Ź vóÉiió»GűĹ÷Ďš ަś¤ăëŻ×}ęEdz|ꞗâă÷¸'őᛏQMÚ×¶ś¤m€ő×ë>uy-tSŮ`Ď,ł¦V5­sč¶^¶ÔŁŰŃ⯴ý$Éqű˛Źö-ěyuişŔúéĺóÔ‹<“\*ĐeZÄ´ĆUő˛Ą^•ă8‹×RĘŻ©•MkúĄ—-ő:Ô9ŘĚ,+«µťµo‘rÝÓ«űÔŁăÚ(-€“Öç…ľÍzş§W÷©›Ç”ýb@őşO}UnN<@z}źz‘/iăâëmÎč€e Ąn!>K[ôJ[O`V…–:AK˝ˇz8›ť»Ŕ˝ă€ĄˇĄŢ@=śŤMą®+(…w¦q,-ő†ęáűľFSit~Ş0pO„;óµęĐëĺę¸O˝Čńľďk>źk4™HÓĂp×Öđx‡ëÓŇ·»ĺg~aH{–{Ňv›2lĘIűŇ’v.›:¤}Ô»ĺâ–5#]Ząóů\ŰŰŰ‹÷ŁÉDľ¦ÇÁľ5”ë®Ň"ł‚0)€Í)fł¶Ű”aSŽMçý>6ő€>ęŐŚr¦˛_ ˛ŽI ý(Đçóůbťçy‹V{ÄÖR¶ÁX¶Ś6j[ę«FźzE¶ýŕf G<Ď“çyÚŮ9+Ďóä¸ÂŔŐčÜëóÇď›_÷~ů®ý>Đ$úÔš*6)Đ#wďŢÓéÓ§t÷î˝Fę’$ŻżĽ®rč€ĺˇO˝¤x8EËe©Ž@ŻŁ5k3 ­ŽrlűÔĹ5ѧŢÉűÔ“¦‹-Şj G—ŞÍWŐP¬ë˛wŃr–őű@_ЧŢÁ` Ůl¶xßÔ%÷´P,”Ye´áŇy[ę«FźzĹrlÂ$Ú' Ć˝˝= ĆúĐ“BąhÖQ†TOźz]ý˙Đ5ô©—ő‚ĺÔőüt);Ü P&Ŕ}ę+¬G4J|<ŢŐxĽ[ą.€~ă>őÔ#î’ä¸Áb=¶h©· îóTAK˝ő ´Ôއł±©Ńą ÜXZę ÔĂŮŘ”ëşň‡Rx'`ntŔRĐRo¨ľďk4•Fç§ ÷D¸ó@Q®Á l|ß×|>_yç1g­łÝ°ÇŚr%Î[¶Üů|®íííĹűŃd"_Óă`ßĘu Wi¨eľ$c®łŮ§Č9âďmΰÌr%ĘÉ:&-ôŁ@Ź?WÝóĽE«=â› ¶´óŘ„lŮ/fů€úЧ^‘m?¸čĎóäyžvvÎĘó<9n 0p5:wÁúüQH–}KS’Ć DuŽ^>”Çč÷†$z¤ Źa•t"\—Qv4©NĽüřú¶)€¶ŁĄ^R<üŞa^W/s&;Zŕ°|´ÔKŠ`Ů0¬čf+—Ö.ô-ő† ÍfłĹű6\rOúÖçm˘˙Ú‡űÔ+–clćóÓ÷öö4  ô¬{ĚÍĐN ń´u¶çI:GÖůĺpźzÉs—a†űţţŐRĺĺe­/ňĄ#ëĽrŞl'Č ܧ^°śşžź.e‡{ ‚€ŔXŁO}…ő¶ŤÇ»Źw+×ĐoŚ~oA=âá.IŽ,Ö`‹–z ę1oM Zę-¨u ĄŢP=śŤMŤÎ]`bŔŇĐRo ÎƦ\ו?”Â;ÁŇćWô-ő†ęáűľFSit~Ş0pO„ű2¤čf”kpß÷5źĎĎPWÚďp}ZzúŐ´ălĘ«2[\Úvsź¨Y_\˛žŃ_ź÷;™Űm~?čf”+q޲ĺÎçsmoo/ŢŹ&ůšűÖP®[¸J'łh`%“ŠyűHÉAźµO•ůăłÂ?o?ć­ĐUĚ(W˘ś¬cŇB? ôřsŐ=Ď[´Ú#ţ°ąĐI;ŹMđ–ýŃëXg°AźzE¶ýŕf G<Ď“çyÚŮ9+Ďóä¸ÂŔŐčÜëó§=8ĄËŇž0—te€ń ú‚>ő†î3O ôHĂ*ťü‚R¶_?®ĘĄő:™síÓRĐU´ÔKŠ·ţŞ´ëôşFĎWťÉ®®ŮđĚ™ő˛žF˙Ř<)®OW3ô÷©—›˛AV5ĐŁ 3_m­¶ÔŁ u€¦ĐRoČ`0Đl6[ĽoĂ%÷´~éĽ}˘ýÚp{ťě@ÝčSŻXŽM}ş{{{ ŤzV_·ÚI!ž¶n¬sÝ (îS/yî2ĚpßßżZŞłĽ¬őEľtdcÓ_]´EΓUVŃ÷ĐUܧ^°śşžź.e‡{ ‚€@XŁO}…ő¶ŤÇ»Źw+×ĐoŚ~oA=âá.IŽ,Ö`‹–z 걹7€4Ś~_Ń`»˛~÷ëo4z>¤ű§g?¶ę*Ŕ ´Ô®Głż]ůć-~¶ŕ'´M-uGR†ˇŢ»ů¦.żvEź}üÄoĽuM/Ľř…Ć/979÷{ÄŮŘT¸şôţŁÚŰŰ“T¬ďś–z{ĐRĐ67ß˝U©ĄžÔj˙˛˙5}ćSOëňkWtůŐ×i©'ą¸ű¨ÂŔŐŢŢމֻM ž–âjńůh+úԗܧžůäł­ˇ.nIwău×§ąÓž>ý«Ź=´îěÎ/ëëßxËz}´Íß·h™EÎí—T‡¤ş¤•źwĽÍ16牯Oúü  Q®Äy‹–M.óř/ýš\×=\y}zřskxňୡ {nő+߼u"X˘°É Ő4¶–'«YëlľDd•o{ĽM]ňÖEĚĎÚ‚ĺJ”“uLRčß˝{G§OHĎ>űYIŇĄ÷ďčâŁďnL ÷č˛|R°w!PĘ|q¨*-¨Óľ,¤íß…Ď@71ú˝˘Ľ>đđţmM§ÓëNźţ.˝˙¨.˝˙čńĘëÓă€ĎďÓŤODMË«C´®lÝÚđ;Ćѧ ­čSo`ôű;Sh­KŇéÓ§Ź]˝tÔ`¨ĺžˇÎ–˘M˙rĚ>ôU´Ô‹Jk­ÓRĐVô©—oˇGËYO{ü—~MĎ>űŮEGÁ~úô)IŇĄŮáľ‹pĎÔ§^V^¸¦ łY—U^ŃľűUµÎ“‚ť>umEźzÉrâOZłąĎü¸µ~ä’tęÔ)Ý»wO»»»şví»’ňC= ”2ŁĐëfS‡*őiĂďh"Đ´}ę ‰úÖgł™Nť:ő{÷îéÔ©Szä‘Gô‰'? ‘E·:}şĺ¤őÇç}A0ŹăóĐVô©W,§Člpßűwällj:ťęŮg?«'źüyIŇ#ŹÝ´0J»Ź;kż"ŰmĘ7×Űg™:Ô±®Č9éSĐVô©,§®KöIáľ˝˝-=ňëz4g°˛Z|ţÚŠ>ő×#Ľ[ßűw4 ôřăŹk>źëâĹ‹™ÇЧ»Z|ţÚŞ‰>őĄ„zą®zH‡»9aMÜÓżúŘĘ;Úçź´Ô´U-őĄµžKŢ”v\Ň…ř~eĎhf”+q޲ĺÎçóĂ fŽŚ&ůšűÖP®[¸J‹`N hsAÝÄŚr%ĘÉ:&-ôŁ@źĎç‹užç-ZíHčʡO˝"Ű~p3Đ#žçÉó<íěś•çyrÜ@aŕjtî‚őůŁ/QkĐOŚ~oHR GîŢ˝§Ó§OéîÝ{K9·9Ź«ĐM´ÔKŠŹVŻ2r˝Ž@Ď=Ţż}âč&Zę%ŲlXV ô¨Őmľ¸ýDK˝!Á@łŮlń~Ů—ÜýĂ}ę˱iˇÇźť.I{{{ ­ tłeĎ%zXOܧ^ňÜeáľżµT9fyYëóš€îŕ>ő‚ĺÔq^›p‚@Aşkô©Ż°ŃŔ¶ńxWăńnĺşúŤŃď-¨G<Ü%ÉqĹzlŃRoA="ÜO¨‚–z ę@h©7TgcSŁs°4´Ô¨‡ł±)×uĺĄđNPiZYŇĐRo¨ľďk4•Fç§ ÷D¸çÍÝ€ Zę ÖĂ÷ýĂg¨áľxné`Ď:.ë‹CÚq|Á€őĂŚr%Î[¶Üů|®íííĹűŃd"_Sikx¸bk(×-\ĄĹ]’«j»°ţQ®D9YǤ…~čńçŞ{ž§Ńd"M§‹uţpůˇK @7ѧ^‘íej3Đ#žçÉó<íěś•çyrÜĂËđŁs¬ĎlŇĂY诀ţşČĎ3ˇuůťk©—‘č‘e?†Őśk>ér< Š z“¤—/~ľĐţťęSŹÄ0-,mÔ趡÷Ľ'ąô°ľŠ\N/Ş“ŁßăSą–ťÖµj Gálľ’ľpP‡N÷©Ű šÍf‹÷ËľäŔ2tşOݦ…nöiďííi04čiçÝ—5îĆlšş-KçúÔË^%0Ă}˙j©rĚňňÖg…¸m€ősc6M ö˛.u¬Ą^×óÓĄěp‚@A®€JĚ`ŻčRÇűÔël7ďj<Ţ­\’DA^5ĐĄŽŽ~Żłńp—$Ç ë¨C.ŃR·fŢš@ŰĐR #h©ëpPÜčÜ&¬µNŤ~/SgcS®ëĘJţKAĄieČRt.÷˘:wźz™zřľŻŃh$M§ WÚ&¶Ú z@YEž¶V–U¨ßMuóÝ[Ö…~ě—ź,´˙˛ŘÔăĆlŞ›óßÓçő¤ľ›ťűgĂÚź!»Ś2«p66Ţż˝řŮ÷z$IŞSZ=łęďll>´.ľoŃ2‹ś+Ú/©IuI+?ďx›cęř,tOĺry!ަđí‹uřźx•/ ¶VĄYëlľDd•o{ĽM]ňÖč—Ú/żßMO´ŕ“–ÍuŃË”´­HćľiŰ«HűźkRk,Zon‹ŢÇ×9ެGRůEÎ[Ąţyu[g«řŇ>»čËBŢ:ýŇř-mń–ĽŮŞ·Ů}i°)#é˝M˝Ş0Ă5i9ë}ô?eł…—wĽM}ňŢ—Ý–·oVťVŐ]WóoQwů° Ť‡zŮŕ\öqeĘOúuŮ˙q§]ž-[Ź2ç­"ďtťlú—ë`^ůX‡Pć Đo+ź|¦ŽKŕeĎ»nýýeĂŞ®«óŇn•˛ň+mŔXŮ:Ř^([~Ýv żVęM«yé~Ý´µ5^DFiŰÔˇJ}Úđ;č§ÚĘU ͬVűŞZôiVý?čřŕ´U´mĘYőgÔißň>[ÍýËË‘1IDATTąĄn†m‘@7GĘ›·ÂĄm‹Î8g{ţ´Öú˛[đć˙dËÜĆUćř"Çeí[µţEĺő›/[ÚčňU([‚čGR†ˇŢ»ů¦.żvEź}|ŐuZş2ţĆ[×ô‹_X‹–'-dXo7ß˝Ą'¶?šűčŐ/ű_Óg>ő´.żvE—_}˝|KÝćrxű®×ąO€,ĄC}±N+ú«Wtéz Këq/5`9zętŮĘďS_'7fSÝ|÷ÖŞ«@"BÝŇó—ž[uČD¨[Ę»­€UŁO€Ž ÔčB€Ž ÔčB€Ž ÔčB€Ž ÔčB€Ž ÔčB€Ž`îw˝ňÄöGW]…ÎpśęĆlzbźo}’>ß<„:€ŢáMŐ˝ńÖµÔm|ľŐe}ľY¸ü@Gętˇ@Gętĺ fgĂ`®Ó™ÁpĄç_µĽżEŇçłÎźˇ5ęZH¬ł2‹u˙[ęP“´@H –¤mŃńŃvŰăň¶őQÖß"mŰşşD¨@ŁĚŕČzź¶\dětĺ3c 4(/8lĄ Ôfżű:ŁĄ [Ft)š–vĹcęĐ ¤KĺuX÷0j¬ţöuÁĺw¨I|[\Ó-sZíŮ‹¬ĐN;n]ĐR€%…BßŐ!ÔôŠă|pŐUč4>ßŐ"ÔôJźQ5ĎwµčS #u:‚P #u:‚P #u:‚P #şOýËţ×VQPŃ"Ô?üÄŻč•ÉŻT.đďzeň•ĘĺĐUőgĺI±P˙ýŻţ» —Ţ»ůf­ĺĐ5ug/}ętˇ@Gęt„#)ü̧cŐő\~őuýs÷ż°U±uIEND®B`‚fox1.6-1.6.57/doc/screenshots/dlgedit1.png000066400000000000000000000247711326741342000201600ustar00rootroot00000000000000‰PNG  IHDR -®8})ŹPLTEAĹ˙@@A……ĆĆĹ˙˙˙ j(j j s(j(s0s(s({0s0{8{ 0{ 8{ 8 @)@)@‹)H)H‹1H‹1H”1P‹1P”9P”9Pś9Y”9YśAAAA@A@AAYśAaśAa¤JaśJa¤Ji¤Ri¤Ri¬Rq¤Rq¬Zq¬Zq´Zy¬Zy´by´by˝b…´b…˝j…˝jŤ˝jŤĹsŤĹs•Ĺs•ÍsťÍ{•Í{ťÍ{ťŐ{ĄÍ@@A………˙ťŐĄÍĄŐ®Ő˙˙˙‹ĄŐ‹ĄŢ‹®Ő‹®Ţ‹¶Ţ”®Ţ”¶Ţ”¶ć”ľćś¶ćśľćśľîśĆî¤Ćî¤Ćö¤Îî¤Îö¬Îö´ĆŢĹĹĹĹ@ĹĆĹĆĹĹĆ˙Ĺ˙ĹĹ˙ÍÍťÍÎÍŐÖÍććć˙˙˙˙…˙…˙…˙˙Ć˙ĆĹ˙Ć˙˙ćĹ˙˙˙˙˙˙Ĺ˙˙˙H˙°ŞtEXtSoftwaregif2png 2.3.2¦Q‹ IDATxśíť‰Ł$Ĺ]ÇËçS٬K’%î’]@H‚AMBrlŔxd4ń$!HxŚşŰâí3ő‡ŰuuýŞşú®ę®ęţ~úuż™š™îž©ßg~U} «Uő4«8ŕ$TŘZG¶* Ń*\óÉzĽˇ†őđézĽQOnŢx¨o޸uăćC·ÔpSŽ7oÝ’cÍí[×ăí‡ĹpGŽwnËQŹÜ~äÎŁ·yäQwxô11ÖĂăzxâŃÇâ7źxś Ońsőż/¨áóO~^Śrř‚$_ÔĂSO>őĹgľ(ĆfxŞ%ż§É—ĺč _úĘ—ľňĺzhx¶ź«§ĎŮáŮçŐđüóđĽä9Şá«őřâó/ľP_ÓĂ‹b|‰ /×Ă+/ľüŇ+/˝ň2^}ůŐWäXŻ©ArWŽjřşîľţÚëwëáëőŘđ†ßxýzxS oľůGo¶ř‹zř®ľUß©ÇďÖS‡·ęám9ľý—őđ–ßzűm9j~¨†ďżó}1ľóC9ÚáťwřŁwŢUĂŹôđî{b$Ăűďţä˝÷ß}˙'dx_Ś?}_Ś?}˙zřđý~öˇ>řđYô¨đ©z¸A=pâ˙ĆŤĎH „ő`¸©|VZ m‰˙z¸sçöŁwj Ä ă˙±GĹčOűüsĎ‹ńą¶őđÂW•Ć]Äđ‡/˝ôâ+ž6ţµŻľöĘÝW_{őîkw]îĘń®ď€o€´ŕŤÚoÔSÂ7µÄ‚7ë€˙Öw=ţ¦ľWo[ŢŇ4ü „ďńű~üËŃ xOŚďşĂßľW[𞬍břPZP(ä_iĂŠ9Aáć2tć„'ĆĺeĢśđeťšĽ0.'ĽĘ ևݵŤčĚ Ż49áU›îÎÍ o„rÂ7Ýś †`NFôĺ„ĚÎ ďÍÉ Â‡ź>đúĂOű÷ŰĎpUpc#rÂoÔÓ[fhĹ 'Üĺ„;±sÂüśđ[&'ČĽ0”~?šĽ0:'Řčoĺ„rń`jNyÁÉ o„rÂuNřĆśđ?'|Źć1´ÚDĂ9áÇőäÇő x'BN°Ă‡"+pŻŕßo?ĂSáŇrf“ú ś÷ĺÎŃW@_aÍľB@fˇÂ§Tš¸~Cţ»ń`=~şkTÁgę˙¦ŻP{«Ż ź%óç·ë[ő}ôVé+ŚSAÜVÓ– '‹Ě µ×… uN¨CźóëQä1URľB}Ż•„Ş­Tߪsçč+ Ż°R_! ‚ľCł‚°@úĐRáLPYᆲŕAů2¨¬P÷¤ź‘…2+Ü”·n6É ľ!ű ňľđ@üżŁ¦őÝ;}ôVě+„T¨T–TA÷ŁŻ›¬đ Ě ˘Ż Tř´TA›ńĽ#Ť¨ďÔŁČ Ę ˇ…ü÷°č1<,ZIŇŚz‚ľú +öB*č6Ň„¬p]ZĐ4Šäý7użÁ: ňnÝú¬č!ĐľB­Äy}ôÖí+,Ě ´Żđ  zÓWP*hnŞ[5FŘľB“T_Aµ‘î„rú č+ŇWPÝ“Ô(z ·:łÂgĺTg…‡e&ج€ľú Éú f{Q· =[Yá“M—AoAR}nÚHę¶ÜŻ oÜzHŘľÂMÓexX<,{ bŠý č+¤í+ř*LÚŻŕg…ąÇ ©¬€cĐWȨŻŕ~ż Ěaî1H2 ŕ$ô6í+śžöď·ź1pd*ŽAB_ˇĚľÂÓ´ź1td*ÎW@_ˇČľÎW@_}…ĺç+pt ¨€* H ’X»€]ă© ŽXb]*09xŇű0™â«ŕý÷`ݵç1ýA¶#¨‚üâׇ¸:0çÁćŻý$ű úlńÚŔ\Č€ÎR8(ť*TÎóś)Ň™š3Ś Äî¬Ŕ¬/PäN· Á§“¬PőŞ`šFPBŻ ¸ĄaÝŮŞěC¬‚  ¦u›ÝŽp— ŞidźbžÍšK ‰÷6#îA)„¶ uÇďŔĂäIćöâ`p ¨€* H ¨€* H ¨€* H ˘Ăb•›ENzŮÄâ¨ËčźŮđEAU?Ĺ*7·‚ŹwĽljqÔeôÎlÄE @¨$ž Ő\}d15nKš_żµĺ¬ý|őÇnąY¤üUÝły™[Ú,ĹýńPFž}ˇźzˇgB—qłŚsĎ2śîX‡Pyâ*i¬Bů<ŕ¨Ŕ®±Ć‡F~ĹOüäĚÇ,rş ÝA=O…&p© vFfŃ=+ĚĽ—_Š˘ĄŻUŕ}*Ô&8*°k×j§Âż±Ö­‚ Ć ¦6R© ň™¦|ą ú® Ľ...ä˙ô·UŻ eÓÎ WWW¶qh Ľ¬P»p­ť®ľ}jÚIDÄq&˘ČQˇľg˛*0u_—ŹTˇ»Y%—zÁ=” Ę….Ôkö§Â•áÄ|ÔwĽ4á#ŻŻpM&/+\ň«“ÜÎ.\¨ ľ}Uô™—©P4Ô}]Ţ«§źő˙ţ6Ť«‚|÷˛B-‡»Tň†T8C…Ň f…sżśŃĐ®=¸:‰&ŹĚ Ž â·­żĽvɵ uź!QV0í’ 3w4ixYá|qöł‚ĚrĽ”lâ %Óî+ś„ "ŠUát%iÂóQYAfŤF…˺貞ɥśŐi‹ľ‚ nÓ”o« D´*\PB*\¬pá© UfA…rig…şm#˛‚Ú"ŕŰOÍ'ŞČ µ üňâ$g•j ’_ě,ŁÜ ˛‚jş™&ťŁ‚6C…˘ Ş s˘Y‰ž°Ř"˘Ż \¸V«Ŕ‡·M«pażýĎ^˛8“e»ËĐ›lp÷e…ÁľBgV@itŞ Ž+;9YÁšpņ[„ Rlzëí’ľ ˛ŔĆ•Ó)P˙Ľ.„éC´—!űL‚»7+,Ú‚DíM\e xHׄAEÄ~éB§ Ěvš=tÇ™öô¦"ýĎ۰d¶,˘—ŰaĤű:· acjńŚUÁýňTD4›úłł›R˝Ť©zs*n d…éűT_ˇ'+`Ű~YśŠśN§KÖQ˛Â¬ľ‚Űtiímöű mqÜwcvĂX\ű>ń &ö5Gé+t¨ĐŠuşŚl?wô樎*O\e l˝Rś/˙AEÔAŤUi¶ |‘w«0˛¸gf]/;C…b ™z˛|ŽşŹ˵ ťaÚ^Ą8ę2zgÖő2¨P*8u*É*śB°(ĹQ—Ń?ł®—A…Bˇ*L¬ńąâ÷4cusg¶fýh˘„" . €* H ¨€* H ’áßWŘm?0­Cf.zçďŕ1HqÚzŔd˛  ńś LV4¨b“UŤ§8‡»‚ 0U”UŤ§K…M?K…\3¨P¦Š B„Ď’öçOPˇ0L©8Új;ĐX†*´$… ĺP” í|@, BÄĎ*” TřYŞ5`PˇH BÄĎR.Zźţ JŁ0ěÉöąŞ`.0 ‚_"æWź¦Şć˛™ŞŕŻź_Cöą %§ý«ŕëÎSáţ,ƨ`c~H… ßp`2GPÁk‹ĎTaňç4ćEP!ˇ‚»…f® “ŻơBICó^ítŽ }*T¨6UÁą7F…ë Pa‚ çÉ*śyý˘W… 6WÁ z¨°GPÁYó HÎşB…­8€ ˇH^*´łÖtřÚ‘ł;˘¨P{PAĚţşU*,DGB…U¸îÄ?TXŠúřˇB™*Ô.óĂőćżÉ`*ę㇠%« ˙óć>TúřŞ01>ĆqN2Wµiu_*A…Ĺ@…âUŕבbJV_‡ Ń€ ĹŞŔÍĆTy ÝćĄd®‚z­@ś™‚˝¨ĐTC,zcdNÄJÄ ĺQ˙ů°™sŢ» IaŮ«@_ p R:⪠żŔ™Ža{Ű~ŻOŕÜ̉ÎYÍJLő­ÉóM©BëŤB…rž o:™łůâ'JŃůiů&Ď7ş ôýůŹC…ržŽŤh*pťW#˙ů–*xK^_Šh*¦QĽ˙퀍zÇúťC@‰­cŞM©Y2M‚á® T(‹(*¨¨ Ńtpeůäm¶ ŮŽ˛Űm榱™ ĚüłrB…˛‰˝‹mVhaö+ô˛Ť Ěé˛@…ýŻ Cłšł$őŽő;_–šÎĹ|.ľ^JVysoxł)YëĆ}ŁÂě>Dľ§îL ± &ädě235±,¦6Ş™žxĎbMYłô@Łľ3ࡂw˘B“ć‘ď©;XG¨vZŮ[^›(ô,ŇD:Ůo˛@#Ś4ËW‰Ü6öAmbdŽŇŽŇ ä1u‹ŮN@H…Š C´a­Ĺ6B…PiQ·™ܓѩ;ŘF*E3 ’*çYęŰÜ.˝ťÚ*4>ySÚÎ*‘|w± FŢÁUp{„ ¬ <‹Óv©ť’Ó˛ H3Z… *ÄÇ Ńâ.âânLm„˘*¸[«lAUY§¬ÂÖgăLB˝cýΡ‚»&…Ä™Mq +TP,]0zĎr˙lJ*TăT8OVáĚ땨BłŮ¨P!+Ąç2› € ŐhîO¤4}č™ĂěL…ç0dyęÎôĹ•ĄB’ąfĎ)® Ţ^er„ÄL˛Żť/Ş2;ug"śLű>Ë\U¸¬źŰ.j5f’ß1Hňĺ2´ąľíľ}†) ,*˘ [źŤ3 úŢ'Ş`C>âí2¨PȢ"Şp=Ѳ‚±ô˝ĎQ᤿öŐDĚľÉ6řMy{ůĎ*@…•T`„jq)ř‰» $-G0{@…ěu ČťE*8˙mčűŤ&î)QŞ ú[ŤU‚ äë<H‰Ęá¨@ţ«‚·č}üŘ«ŔG” «đsC>*řYŔi égě˘Ô¬ŃŽlqUa |RA…ćwaY`jöL3/…$Tv›O{ë67kôóý°Š ~¬óVřGSAßô§äŽă‰‘–ÖÖcETSq§‰~YĚ›˙٤h«ŔtčPŃRÁ¸°(+$*¬Çş $éZ†&pý@=—Y5';‡H˝*FT T¨>M +H“ÉSa” =*ĚÉ ¦ ¦ŞOă©@b˝'+ĚTA7q檠 ˘#Ó…@…ęs*$¬‚u!RVśł3¶ŰܰoÜ^ -Vě+¨¦•Äié6'R!őĆÔD@…őXC…řä··9ńT0żsŔśßE ż×řÚA Â@ő9’L…(¸qµôŻ~TćÇŃěýYi* TźS!y«ŕAßűţU¨*ó›śęć`äâdëřŤHr˘FFjč{ß— zzK…ćájŽ Pa úś ™qéí ď}g*¨IHV9“)@…ęs*¤ –śĹ–Ř*¸ÝćŠvgôšˇÂPő9rZ笋,:ˇ3ŘŰĽPˇ*L* Tź*,*¬Th€ “ Ő§ńTÝ{MZy=@…É@…ęÓ¸*ŚŻž(GÇĚ`© “·XŤřhˇÂz¬ĄÂ„Ú©>% fÖb`ąKUú;lP!+˛TaRUFK"UŰíˇBad©ÂÄęôôžĹRÁ0 Š*Ř-V>fěA B^@;Ł*0™>*< UčÉP!/6Sˇ;€ËUÁ´Ť¬ t$Č»%« 7YěL…ІD*0rČ=˝Đ ćrUřXÇůÇâŤ>@Řť ęšÓ{S!í•´*WżŚ,ś1˙‰m·® ‰ˇB=|lO4Ą*0ÓXy*äĹ*0}*asl°{đÉ=vľ î×"H.»b´Ż@˛CcTČ‹Ť˛ ž@Bc›[ßŘĂL‹Č“‘ —:Ü/… W´qÔh˛e]š86QMTh:V…Ęu…yeŮe…K1\v© G¨)«gÍôm…Tp­!÷łRá~-‚TA¬Ţ•żiW*` RlúHÎčÓěý¬Thv±ŮÝÍfż‚é6łűMߡdš5Ú:~#˛ę~=Wó•Κë,„»Í­’w+CŘ}f{›‹"׽ͤADşÍîF¨*·nó}+‚”*”D®*${zĎŚpöT TŞ0ő‚ Y쌪Ŕ&r*ŘáÜć©@…ęÓĚWaňYÂKQ1–čÜćéź ů,ˇÂjä¨Âj5Ů,1Ž ó{ÇÝź%TXŤ UX¨0¨0P}¨J*T T ;šˇB!@…*ľ t—3T(…uU8ç‡}»ń.ţrb$/@…B€ U|~ť1Jcm¦ď’MKîÝ»w*”Ćę*,‹¬ĄBxçŰđúA…ő€ U Ä/¬;*ĚÜĘ ÖŁ -›YóiĎ8 Lĺ¨P…¨őŔ:ă*¨54M$¨P›¨Đú‚*`|ŕţy ’¨ L¸/meaTČ’mTđżŕŮSDÁ˙RDč;k-TřgŠxÉżPDÁ?QDÁ˙PŞpęP©SüˇB–@…*® ˘§ ; Ę«‚ö*ä T¨âŞpŻS}iƨPˇŠŞÂ=±!Urʱ{*0d… ULîÝ3.¨›AH9Ş4*°n˛*T1U0.ÔýmB°ŰĽ›ľÂZ Z¨ąŰ|ďžÚq_™ŢZúĺÍ‚öEč-B…{›=vą·ą'vv¶(¨z ýÁ> B/P*ô©ĐQÎş , *ĚPÁ?B÷×ůTČ|Q82u† )€ [/ ç+@…^°i\ő™«ć,¶äŞÂqČ­”¨*€!R«đݤ˙A˙E˙GEMN˙I `P* T€ @ @¨$P* T€ @ć© wVĘcďÔU/šňÓŚ_8—ź%Tب0S…fĘťđ‡ Ĺ–¨ < Bpum¤S3ëE®*\(’/gűEA…% $­ űÍí|1ôY檂|§ëÄç¶‹‚ ‹˛B+ěˇB±‹‚ ‘H'¨Pč˘pdj¬n3T(|QąťŻŚ”*čnî)›‘ź BI‹‚ ŘĹÖ ¶ Ť«>ÍHŃÉUoŃű ř±ĄVÁůq¤SDÁżSDÁE<@×(˘ŕ’" ţŤ–Ó}•Ź lP*ŚWҨ> TXTX¨PA…Ů@…ęÓ@…ĺ@…ő€ T °á§8k´uüF*TGPAn!q :©‚Ţż3¶ŘŻĆ~–±T¨Ľ(gŢż|˝_vo*lp TűYĆUAe1Őą 1Â<Đ<©¨0®úś Kp—şT;5°đĂ.@…qŐçTTX‚żC´ZÔWбN‚=¤B«_ Âö*Ô‹¦Ă|HÄ 1˛Â Pa\ő9–ŔŰ.DP<}`J [ĆŕVŽL]BܬP‘n1łE´?=˛ŰÜDÇÖń‘Mö+äC<ÎłZżXY!PˇóŇ©0cé|đE±˛B" Â@őiŽŐ@:O?v˙<¬˛ÂzlŁ‚ó|¤G˙@˙HżJżFżHO‰ŻBë·Ű8› F¨€¬°PˇJ­-?Ű›'d…Ľ€ UTDçWŰcFVČ ¨PĹT!”–¨{VXkA«"Ş`˘^¦1Ń˙™)«Łßô™÷FôŽJ"ôˇÂ"T~P÷™˝WŹ"+(ĘÎ ¸T ÂYšPvVŔŐń B άřľT€ ý*h†T( T€ *č>˛šÜnó.¶ A¨0¤Â4ö‘JXTHĄÂNŽAÂ$¨Đ§ÂäC´ËÍ ÇG¦ÎPaDRčk/É5+śŻ0]…Y ­˛ÂÖ@…É*°^ęh°|hý¶ ¤é*\Ść„a¶&µ OSDţ1Eü)E|›" ~…" >Aa~pŠ‚?ˇ$PAl‰ăđ§eÎ Č Ůće~R»*ťlČ Ůć«ŔéDY0_d…­ ‹˛‚ąsßU!+TX¦×˝†.>LY!{ Ââ¬pŃŁ‚Ü€…¬PPa˛ ž =YAoĚEV(¨0KÝ[67š?ş [Ę*¤Űņ-HE¦«0ăŻňźig*„¤‡ ™¨=+„¦-*ď^ĄÔ€ S ńŢWđ\§úAäsÂŤ%¨0P}P!łBWn0uŞ@ć¦Z=ű•ű ÝÍ$óPo *@…aäědĽs}Ď‚÷äńźe‚¬P‘Ćé6W¶§Ü¨ŕt›ˇTVˇ™ňpŕŢíń.DĘ ©€ Ő§9 'NMŕâ»_LôŢ”©ĐŰ=äz ’YôZ Z¨©äD6'jp{OL!†DćYď‹Đ[„ 3˛ÂHČt¸©”kVŔu BŹ ´K…\ł®ŽşUpşÍ#Ul e› B$¶9µUBÓŕƦĐtĄý.tßg‰¬°oňá {›ŁFa^ –¬°ő˘Đ@ĘD…lł¶ ŤÁĽô0Ýć„䚎TČD…\łÂq€ ™¨€¬°5P!¶*d˘˛ÂÖ@…LT@Vب‰ Č [2QYak B&* +l TČDd…­ ™¨€¬°5P!¶*d˘˛ÂÖŕČÔÉ*śg1ôY"+l ÎW®ÂŚĄ;żQYak Â ŘTÎĂ* +l TŁÂĹ0´q4Fd…­ ©T°Ýö˛B $T!3âŞPGřŔ­ ¶ÇڬPéTČűvcd~RĎVYakR©)qUŕt˘,đT`ŁU@Vب°,+¨‘;÷­ ˘]†¬PPaˇ \÷B*¨>JҬ0ąÎ@'PaqV¸čPÁô×f…Í6Bě%‘T<›5Y·4ˇŰ Bi*:˛ r'@(̡‘0Ut`XgC…#aŞ*ÝĂfÂ*óOM*[ ö ThÂ]ß‘·ĚT—čǡž1UtdšĐ·˝†FRöŤ©"¨Đ„{×*ěSEPˇ‚ ÇĆTŃUhşÉns1§Ýć˝JĂTT T( SEŰÇÎ, …©˘ícgPÄÂTŃö±3‹N¶ţ\qšq*Ú™ ,äzµV䊩˘ňşÍĽO…\€ ĺ`އk.c Š©"¨¨P¦Š B B9*Ú™ [_Śă’`ĹáÖŽTŘfťŘZ¦ŠÔv@ďŔłöqhŁŽLk=©÷ULOşO°t€ *¦ŠHVŽĽ† Ť#Ź˙„ *¦ŠZ*ó{«ĘżËôůŤňćŠ5gţÚWšžÉYĂöU䉭ӊ+•‘čS; *¦Š|ĚÉíćXýöŮ,VŰΔ±fvNđ7Sۢí"ł°“e Š©˘@‰5żAÜ:ŃW‡ąŽWčĚŻŠĆ{ű)U@ó`˙©2k©Ŕ:nJĂTQXn3'hÓ¨Đz±Th|ďXT8¦Š:UpH䂤·ŕ~“Źk ±AVj …:T8¦Š‚*´»ÍM!AËŇ<ˇymÓ–by•űDň}›Ú˛JVh¦¬÷ş`On† ĄáÖś]l˘#.1H•Óâ ·ő’”T( '°¦Ş0í{22±HŤÍĆ»Ą‹1¨°{śŔ:ä-Č=wCTŘ5¦ŠŻHGÇ ¬cŞ@›?äâ٦“ŹnóApë*$*”†©"OF¦nY6@SEA\ Â Bi*˛*覲·GŚ ěđZ¨˘bŞČžşSY‚‡ ĺBż [®¸$Xq8ETĐSzN[I*,ĽšWäzůk˝u}NśŔ ¨ ‹ËS! B9*ÚY) B9*î6śIł:PDĹTQp[^±ď@TL…TČÚ\ ÄĹ ,xlL- SEP!2Pˇ4LA…Č@…Ň0U"JĂTT T( SEP!2Pˇ4LVs´-ÜšT( SEGUˇî‘ö¦@…Ň0UtPšË]ŘË€‘ ą0ب«”Q Bi8uXBG†®űŤÓüwŚXPÁ¨ ÓAŕ’`ă]€ ĄáT ×;b^žĐS4öŠXÇSˇăZxmśë~Ź*”†XTÁé+Wô˛`ÎEÁÍŁă[HPˇ4śŔ:˘ ©€ ĄaŞ*D*”†©"¨¨P¦Š Bd Bi*Ú› [®¸$Xq8•Ă)ÁăéSa­Ë~őĘÂUˇ8pĹ  SEYĐxŠSdOV4¨b“UŤ*€Řd°Ée¶^%‡íjĚdëÍ-łQ«OTŕČ@$P T@@$B…­·›Oł§5˙*JB!Wx˛IEND®B`‚fox1.6-1.6.57/doc/screenshots/dlgedit2.png000066400000000000000000002450161326741342000201560ustar00rootroot00000000000000‰PNG  IHDRŤdĺ?ńPLTE9{öA@A}{‘Â˙˙˙  $8D  $) D ])$ ),))i111419$9<99@19…9• 9Ą9ú1AA,ADAA… Ať AĄJ<)JLJJŤ)JŞ)RR0 RD1RURR‘1R¶)Z˝ZZ8 ZLJZYZZĘ1bĹb<b@ b]JbebbˇRj Íj,)jL9jPjPAjijjÖ9ss$s(s4)s@sLs]RseJsussÂJ{LA{YA{]){mZ{}{}{{{{Şb{ľR{ŇZ $î0DAP1Ye1eR}s…‹]Z‹mZ‹‰‹‹Ęb”])”e)”yj”•””Öjś4˙ś<ś‰Jś‰{ś™śśĆ‹¤ ¤4)¤H˙¤m1¤u9¤}R¤™”¤ˇ¤¬P¬}A¬…Z¬Ťj¬‘{¬Ş¬´´´U´q˙´uA´…J´Ťb´™{´¶´˝(˝4)˝]˝•j˝ˇA˝ˇ‹˝¶R˝¶‹˝ľ˝ĹĹ}9ĹŤ˙Ĺ•bĹťRĹť{ĹĄĹÂĹÂĹĹÂ˙ĹĆĹĹ˙˙Í<1Í@1ÍiÍ…AÍť˙͡s͡˙ÍŞsÍ®‹Í®”Ͷ¤Íľ´ÍĆ‹ÍÎÍÍâĹŐŐLAŐ]RŐ™RŐ®Ő˛‹Ő¶sŐľ¤ŐĆ˝ŐÖŐŢ]RŢiZŢĄZŢŞbŢνŢÚŢć}sćĄRć®Rćş‹ćĆćĘ”ćŇ”ćâććććîî…{î™Rîť”î¶bîľjîľîĆ‹îƤîΔîάîÖśîÖ˝îŢśîîîö89öLJöĄśöľjöĘ˝öŢÍöćŢööö˙˙˙$)˙˙ŞZ˙®Z˙¶b˙ÂĹ˙Ć{˙΋˙Öś˙ޤ˙ć¤˙ć˝˙î¤˙î˝˙îć˙öĹ˙öö˙ú˝˙˙˙˙Ţ˙˙˙͵ßtEXtSoftwaregif2png 2.3.2¦Q‹ IDATxśě˝]Ś$Éy –ÔîápÚ!gö´s\/–bmS^H#}ĽĂjj%Ńô˝ěÝĂ ^–ެ x]pSDĐ€r“®‚`·ť„~đK ˘­Ë©Űg‘ÄP/6·ť † ô bO°ĹYß­DŠ‚‚ç“3"ľ˙ĚŞĘ®ž®î­¨îü‰ź/ţľżř"2˘¨{´uWPÜö›nďöîň oQµîü|űtq~^}Üe4ÝŢíÝĺ; Т}|ÔŢÇŇuĐ®‰Ó˙ZU%`ݦۻ˝»|7„@[ ŕěřP¸Gđuśţ×Ö>µš_•[»éönď.ß !Т~tęÝřđ|yvöpQW§§‡ç§Ygâôż¶®ÍŕŞ%ôĺşő›nďöîňÝ-Z)vÚţƇËÉd:=v®<9l˝Ř5Ţ…č&Nßë#ôô°ľb–xÉnUÓíÝ «˝ř;ţgběÝZnQеěaنCd5öQ.Nöµ(„Ă›­¬jş˝[ĺ$áďŔ…Ý-ťśúßřđ,0W–óĂG “;ŔÄńĎ pđ:ťú—rî!´@Oo¶ °˘éönĄá/@Ô7cďÝ:n8> ¬˘ ,ĎOе€O1ŔóqÚW„Ż"´zzrx徭ôeşŞżéönĄ Ôîď'MŔ´Óć¤%ř`>¬!üŰ»n ¶ 8ę‹=fĂ_ěörbŕ?ĘĽrvę፞¨óMwr­·˙ë˙ Dîq+Đ:üť á3¸ęB^—żaĘ `qěq¸<9q\äŔ Ç â„×^k„ďţUKéKt‚ä›nďV: řž'{ `7„@‹Gs˙4oCCŇ“ůÉńᣂ˙kľÚë\Ći_ŽŔŞ}őŕáB=„sźx~Ł5€vk:ď3ß˙­ńŘE@ţ·>đďĘ‹zţhË‚k#{!ÖĆ=ő‘ĚŕÚ^h/"Î<Ć9ŹŻe)^!óđęÝMžhk–k:_ń“«Ć…kň‡Č…ńŹ~ŤŘ·çZŤ9Ś@™śzV[:w<9?äM#ă”>δŤ^Oćâµ}/%„›< ĐÖ,mş©nş˝[á"fIâtŁÄ˝˝[Ă !Đ–ĚbZv÷ÚĐ`– >Fh˙ĎKµ´ĐĽzřeygĽj“işĂGşÉö.çJj$ő$uě˝ëuŘBC´xÔjŻ­;?ôčŃůŁsďyżŕ[â­¤8m¬íŃFÄ\/6é¨5€f3żŽ ŕ†Î€^ )őPlďöîŇÜę ŕŢĄ1×2€k˝& ®Ś?ĽqűﯙÁŞj%'Âś¸˛Ű…2ďöŰË•ĺ+z™-Cwi ŔÝĐYPâ`áMYn¦qZ"óţĘW‰¬Gs~Ž˘^}Éwů ż`R ČŹáż0‹‘\ć eî¦j ÔŹÚv<Á!âk4f‡FŢ_ÍUblét»•tU _yÉwöZ–H⹦7‹±Á?ľµC€hôXĽ}°tĹň¦Î P?j[ódÁMíÄ ™đţĘW‰•?s8k˝wˇü»yÍą¤%3Q˘P]¦ ŕ†Î PyŢ FŔ8óQ6¦•Łoxňa"|mŢçͰ»’$1şbËbć )@]%Ó1šÎ ¤é¸w—ë˘Pk ~-|VtPu˙»‚3 ŕj¤ČY€—ťxwáÉ…W'c6Ó^›Ľż€Äil|Î=sm˛i“K ąŁĚŤ(OÓU~v Ô“v¨Âĺk±żJ'Îř;őčßhPJ n[`7P  ˘!€C‰ćĺ^㸷nĐTŇ^›奤ł?¦Ĺ8B$ş†® j:wć0qx‘ËK˘·‹×IrŁÇ(NEćU–?ŞCZ¬~¬ ŽShČ3Ö2Ň`čl'ŻĐ^ÔH˘ý”)•"q0ťeA(˛TAţ"äcťŔ ]Ŕ @Ô˘  !ŚĎ¨é Ń÷Lđ˘ýÓŃÓ„,A@ ^MćX(Fe0e‰ěHfš«e„#™—ktTäXŞxe ‡LŽX“żk¬u„±)SŘ;t˛Ą€8â f†Ĺ‰%ĚŘu0(:ĺ4*şŚçt¨.VĎ÷N:h˘ ţ‰‚ę ŮuŰs7s€Ręř9°oÍ&żćFÓĚ.“:Iß%ywć᲏kşÄź°ŁF´€ˇ~TĹnŐb A´Ľ'ţ>ÇlRv=3ňtôĎX’]°upĂ4ĄÄY€…S©ů¬Ëő„î5O§ ĄčvâŻÔWˇs—[E%-«( p3)oĘ"ÍÔĐb_¦vĘţo‹™Vö~ÍĚ”psYn ±€<˛ë¶ćnć:­„Ź` mĺĽú…=ż’bţmçć=A†`" M_ ¬ş1­+X‚ćő'=*0ë/°zĘfˇĐYĘąýU5gr8¶}óë¶çnä:­řĎŁ )P·ą$o!â˛ÝŁ%˝ě-—Äp™^׊şłI(‘ăÂČ": BĐą¬€Ě9)bW˝ ‹µIäŚSm·˙e°D6TâŐ÷rżĽ‘대+KŤůF¦ˇ)W˝9í‘R·ŽˇÉTćžäÚ™ré-fĺRëŇ™,“bąR7@ kďşśËu–hz—6}*0ě:—w‘ĺt;ÍD»ëŚmŁŃč`$ť~ë÷ív+­±;Nrpˇěčş^M9·M[fď:Ý&My 4€âÜŤ[`€°đ2Znďöîi8±ŕRÜM›° €8䣫aJĆŤ’‡˝»ŰĽ=w¬Fl Éýh`jÜ1ý¦Óľ­żűÂnÚ:€Dî6ş„±Ţćn„s»QśkďFwďć).ŐxÚź•zÁŃ3iÇÝzBÓc ,úÂnš(~!ĂMGNsZsAŤł] ă[^­_ŘĐĘčKQëâpîş 2“ Ç/KS ť^AmŤĂv>y©Ś„O÷ęF°á›­™Ę!).©lŮö“­Čţ#챬ăuÓ˘Sđő0×ĂnÜ:€TCż)°»-«EN÷_„íYů™g†±ś ˘Îťńô3ęŘą3Ař˘‡GmqB‘bq pV"±«Ěfä…ĺe>3ŁäIe”Ĺ@¸ -ĆŹwnŤR„8Ѣڥ3 |z×2Čs”ĽŃZe)Ú—öż]R™‘vEEÄăý€EČFWöÁu®Őä,xŞ\\€ܨY€TŰ‚×^FŚ@ăsÔĆN\„|(KÓęÍĄ~˛Ó1†ł 8łQH,±/>‘§Ä(G™érÉňçĚT‘"s1gŞNĹÔŐKˇČbx®ĽŠŤ]lOß˝ IWmĐS8ß!.©T©Ëv‰w˝¸VhIrčşŔ˛‡,oÚ:€ŚPG@dőŞĄÝk‡ź8˝üâťŰ·Š‚±Ć-ď]´Äj2nÝ[/ľđˇżń7>ôˇůďnÝ~ËpmĘťqúQ,sţLéC ,Qşçl>1řŢw'Ť*^жAşĘÖ\đ Ő×íL©`m{8ߣ5ĘńbŁ2ŻŐBÁ´“í#7ęíp«!uyÁp ŕF­Č(Q˙NłÚĂepg‹ÓÂŮŽb".U„˛|ńÍ7áx÷ żđłÁŤn›Ž»Ť–ÖÇ?”‰]4AĘšq/y—E…îvŔŻ:”éĺc[Xp-ĺ·Ô˙bKO/ßňO] ÚhË:4LůĹŠRĄnŘ{ˇ«ĎvćÂŔ+UŞ{“é4•yé{`ć:Säę¬ć«uń)m’Ő©ßk]šmYł0vÚĂŔŤZSję‡ţş»wÉáÝó;‹Č@F !{;• öĹ·Ţ“)Ź›ÇŁŃŁ%¶7šÉĂćáäń˛˘É3€:ö:™ 8•{éĄűß|÷›÷ˇKţŕJŇ©c^%°+ÜQ80€fq[§Ř˙ď˙ůżýOô;‡ÍY}üâ+_ůg_ů˘©6Ć{můF±,o-—ŻÝY¶/í›¶ň:ŞĂ‘¸ń0ÜWżL®Ä!ŐH0߇ĹűĘÉţŤ= „śË”9a:ŽLťéš^ ­?l4ł­ř9BądŔ˘X¸Ił9 ě Ľ-k„ÔZüKč°w_lşB“[Ŕ!âÂEÁ ŕ˝ř–ž]}\ŚnKŚhŁđĂĄĆŻ€F> !@ÄÂŰdńwn±EŻD«µ  ý˝äĂ^jľů…OęSź|őŐOé]f?!čÝ/}úŐOľú©O}ú ß|‚ ÎŤomĎk.žţ…i5€Ă{/ßa$ş)ţú«˙ÍůĆ'îŚ^~ůÎÇß~ű3)Đ˙r @dFŹ ‘®I«·Ď m|%ŕĹ9(UÄL3€÷źĽ˙,k>, Â!¨ŰÖ’áC€LjŃ^łŚ ZmÓ¦ Ń–;´D Ź®k 1€C–ňÖ˙1Ëţ§d€*® šÝAŃťcŹ˝ÖŇC”ńD îŁýřGˇ'fÔYh>w/ľ)‡í ŘD ¶<ţÁ;…ęĐvřqoDË+ř-‘?ţ§_ýůŘşźýŐ/Ý/8W÷Ňý/˝úz zőS_h9@yWéöPô™‹Ë!ĐżÔ2Ą7¶ă’Ĺü­Ű·ďÜľs§,© ža|˙wľú;żýO˙ĂW^yĺăýČ­ŰůĚ-έ´ČVđäí€$#ü+|!áj˙hŕ`SƦQ·2· ‘¤Źń( j5¤˘fđäÉ“ŔC¸‘ÓBVHĘśŃdč öŃmp«–#áÇ@m’4u 0`Ţ`@áäđ?ĽÝ¨uy ě°á ¬nîeŇšwžÔ!Ţ˝ň—ßűŢ_ľR*?çžügżő{żőź˙Ç˙€4©N–‰í‡oĚßŘW ,ĄÄj‰˙›/˝ô˙}ˇ%˙×=q}ěcŻżŞđčĄćŐ×?ö1ôzËZp÷]iXčÄV€ÓÚüLé‡?|·şU[cŕ¬,ţ꫿óŐßü/ţé+1ÚËÇ· N+\‹e0@ `)  —ŔQăŐü…®¨‘ Ĺ—f/ăô 7ă,pHEšŽg=ď?x6ţ˘ ű0¤jĐ ĚxI™-Pˇ:uŞŃ÷ŰlűŠ+Ĺ~QXŠD€bšÇgYpcfň -)!Ü‹¤4Íů;3ŐmŻüŻőýżú«ż|ĺ#­»ý‘;·cwpř‹oľ)Ä˙ăVÝÖ1±±ŕaAŃ_úć»÷żđÉ–üź÷qn}řc?ý«÷ďRčÝűżúÓű°I¸ç[đÉ/ÜôuZŢý 5€7&‹ÉkoÍŢúă; 0 ÖtëOó7ű«żůE`ÍĂ;9ÜôC€2 „ @ ,ĐŕDĘ|*8čh1§wÁ¦İwŞklJ%hľ±˘Bo%iË„‹ęS#…őo±KĘśŐTś÷Ř%=ăÖČN1 ćü$đ,AjEÂČ o ¸aë:€`ÔfwDĂHřářç§dřń—Wľ÷ýżúŢ_ţĹ_üĹűţ÷ţűŻhv/~îÍćg…{|0ş­QśíżzëęnŃŻvIq^züO>ďéËđá»?ŃÜĄÝm~âî‡KXˇç9Ŕç˙Éżo ďÂŕ`yx-0”¤´•ýÁw~đÇ·¦‹ćŢĂćXL^¸â˙ÍŻ|ĺ·żüö+d+ *B*Îp`x#7 Đęţ-’Ĺ«& ÁŰh/ő ÷ńÚ]]\qţ?ĽŚÉŰ“—» <÷€ď+UȢ“ ĂvúfÚ ô1€> S6n2ůp(VÖĆŘźc…ŃS¶€›´ CŔ…@U*żpNô˙üŕëjđĘ÷ţďďýÉňS޵ăáŹüŁĄA! źű˙Ç?|ě0ęâÄöÇ?řÎ;҆ËP¤ÄržĽúęëźvç_ző.Á»űęKĎ3÷)>ůú«Żţ»˘4‚3ůÇ™cůŻĂ[¦ôŤŁ×ľţżüËďÜi‘ćŢ˝—yŕĘ[˙ËWľňĹ/˙ú/pČÁ1Ë0 ŕE?h»ŃDú]Ĺ':§ŕŃĹ!@Ď2rtJŢÉŕÖú•‘ň™řE}NL§…Ľ˙¸¸ó…Î\Ź c*«HץP¨ŇśčY @Hů¬ ŔÄe…^đ_´äm Ą4Ý ŕ¬€˝-ě7f@—5€RšÝ±_n/™ţżóťoR’ľŇę˙_ůą–°ß}÷ŃrůpQW§''#J\ľđĆ•Oę9€w§Ł[˛ď\ńŮźl^«ŹŢÄöăź•č‡N¬(ýŕőW_˙‡4Áתăű®sđîßţ0,úkłżűîĎúőOÉ™·DČͨyb¤–)ý •˙ßůó?˙ÖíĂ` śÜâ§ř—_~űí·=đć‹E°ń)ŕ¸č1Âw˙‰˝­ţQ„˙Ç]ŔĎ Ś Ŕá’°ŕĄŮx)ÍŻě×C€¨1»‚ Xh;hˇ}  µŞ­Y ŔŮKSs•ŰjZĐĚb€źô×6X °Ž žęE˙ňŚŔŤ™čRâB ŇřäśŘ­s¦˙–"ÔÜď+ßűŢű?µxôčÜ˙ééI鎧oĽŔÔÖ2€7^‹îđđŢ˝OŚ@@}ńł˙éŹgiA˙äOţ8ŰěÝ?M`–óŇŻţÄßý™źţößşËĂÖ™+îŢ"đwýĚĎüÝźţ邢 #€˘¶l¸ÜnĆ­üëç~ă—ż~»µ'#@`:˙ňËżţö/}ńłŻůâ·K…–řˇ’úpŞ}űîżůCÁ\¤üÇ‘đZ$.¨c# < /ŠéQDDGk@Ë’ˇ–Č\ń×­c»^ąu =ŕ—)mÓ[®JŤíž”ĺ“pĄěfÖhŠ-SSkc“¶ L޸ Ú<±kŔ˘k|Řŕj"ŕ&­čTx EDhÜbÉň˙ĎżýuĂţâËŻ=>÷ň˙Ěs€yy<ć„+_xíµŔ=ýř‰ó[Lm· /¦îř€Oř@/´ČČßHTů’,ĎßeůßţÝĄ!@Żf-"° @j#ýů·żýµŰóÉ“ůdy‡%ą»ő?~ůí/~ń×˙ńÇŮVرfJőÝ?‹Oßý×řŹsu(úáć$Î# Ω#’!@Ů2ŐLFŃ(WöcűK —ň¤IĐx@ @Lä=qĄ§r9G ą×“˘ý9JYšÔąžÁÔ°ŘŹ<˝ë`‡>ZĂŔëŠt0=!čćhť @8L.g*Ž(Q ÷Ę˙ő'˙áŮňQ«ś=ô `vü¦Śđ‚—ý¸[ę~yôrën3ěÜ,ďRrX†âtÇkŰoůá»·DvmaPČŁ Πő€¸ PŢţă‡ďĽó­ŻýľöµŰ‹P¬Ą¤đ⏾üö—żüög? óťďüń%®8ďŕ÷Ý?{ďĂý_˙îŻý$”„ÄŞTÝB#,„Ľ›¨đ7 Ňż„QąXEE#^’y€ň| xű#E1yc1źL—·EĽđë_ţâ/~´y m…É,€x)ţŢýžç­ţ˙kzHT˙8!ńu.Â'‚¨˛9gČĐÉY€’×yaÔVđ˙‰—üíC´Ă‚:Zŕ Lć!I8xľ8.„a85žLíZę~(ÜéÔá‚A%äÚ €­%×ĐgŔŢ-ęüçŔ5H"ďg7b [€oXç&L,ÎĂ”—˙ßţöżú‚Č­˝Ľňţß?i5€eK˙§-poĽ p؇÷ďťß{íĐëeËÚ!o›u±x¸hSâŻ}>A}ÜŤâ§ ¨h<Ź>Ďß}ŢâŤ{ţßyľT‘Q\É©•€<ţl˙nÇOH[wN€o‘?úĘŰ­űÇ ŚŃŹľu[$NpůÇ<řł–ţ˙ŃßŃea˛¬Ŕ–ŇwĹb.ř©¦ĺ#˝´“ d÷†Îh<Ţ2€÷ż˙×ßGą/ĹbĐb I<“ąËjł`”mf€‚Ă[׎@Ps(Qn‘hÖ‰oúż1ëz€°Č+0÷.Ƣ­Vş–ţ˙Ő× "VżňĎ~îaý°Ąţ8Đ*#îźö^;ňtďsŻůpĎ^±•Îm’S˙'n´v_«¬V¬÷<­óeĚpł‚í©I> ý¬„řŕ×&ŕĂ*ĹŻ•˙oĚ'Ką~©eżŢ2€_şŐĽĺĺ˙áoü߸ízň+[đü›vü˙wt&Žlü¤äżç‚'çG1<+O%ÄĘ~n,Ďś‹«đ௿_p=ăB §dŻ™ş”$žh(0@PÁĆÄ˙Ţ{qČ/Ş-ÚÇϰ é4 7°ż›u¸)H] uŕľ@Źw;±@)Î ô˙§úű¬!¶˝ňĘOťśV^ڇ9€yé-RzpoyđZËŞÓň÷^d€uÇÇÓ°Y+ßƤ1¦ËP4~©I"Ĺ„AÝ;ţFÁqŚ8 @PÚ@ű—Ń—Š^`ş.ľň‹źůĚg?ó™˘AĆř55ĺné9ĘMÎBźJ’…FOĆ“ń8üűkxö·Éd}Ćń-<ĹXĆÉoÄJ°™ĐĆ XĘŻ¸„ş‘Ä÷‘úąź×lË„ç÷ÄźËB x|ŕĘü:Çéä:€« ŕ+4€Â~} @ĺżPŔ`w·•˙!ÉĎd'o.Ľä®Ľô>™ĎÜře­©ľ8:88X~âŢ˝–ţOËĎnq·ŁŃááË,^ľwřňˤO •U*ľô”ęÚŤzťÜşŔÁ«Äo4 ÝY’mB™ů‹° HqçěŹßůĆ·ľţő˙ůkż'ÉAhţ» ż÷kżVČ Ča&0Xq3 ¨Ńb  @| ʉ–v97‡ÜG| @MĘĺtĺ¤rŃd¤ •¶Ľ¬§đď©ÄčBpůçŰ˝#P(Mv?e¸ŕ¦ ×~ O¨ń[€d±xYśy›ř;ßúÖ×˙ŕ~˙÷˙;Ăč; IDATđµ]ý‚oúůĽlŞ­4?żq[uJ ńŃŇçâ Ś^F@čČ™+>÷ą7ů¦Ď˝ůą{,–yŠ˘ IV"#CRĺ‘ĹÍd„!uűÎťŰáwçÎmo(ç# ß Ţľ}ŰÎi»X?áńc?öc¬±š’Ĺ-ňĦ‡2*¶á·gŮąµVbŔű2VHqÄ~§ŢuŤ˙…†!-÷rűĎ2P÷{Ô*–Ăspt#YJfŁŘíb@‡`M@.ě&¬čUâJ@řô†Ť€®Ě-íbbą=zńet/¶î–^1Ö ·tę[o ËśEÄ8(‡$4éç át(ä aÄme•¤şj™}7⻣X@73]řő%I)‘=ý鬢IťnOŐ^·Ř;1¨¸(-śś˘w\MÓ}•´ě.iŘë‡üI1uIÚČ*ą+pĆđ×z€:ÉčË}‰#hF'A'ŮŽ3ď0FŃô?ĘîQʨŁ_ ¶dŮÍ%TĄ.ás¤Mo źb$ą¸ôU° YmNŰ”+j§MĚQ1Ą°ĺ–hEťéG pĄxO¦®V3Ű&Ű*v(V:;ËŤL«pÓŹz›UŻČZ‚Đy4hŃvÖô+q tdôí;Kú.H&‡%-¦š¸Đă5B󸔛‚&âĘfeńČiŘ\“Ď!Ëx•UmĄ˘tĘ(fŕ "eĺ§PX€ĐÜ!б™“+`®E2ŐÖo—ĎÎĚŞP$łĎžz“›‚:Ý I‰‘#p[Íl%RćgńŔ¨\†uçfDih@f})Ń˙аëż`…@ßTˇîNHIă@ʇ;»ČäęEî(Ň…+"Ô GRŞ x—ިlě®ňőI˛OÁ&A„âDňíş AËe=şlND/8 ŕFü‰ĄŽ[˛|ÎDŃőçŘż MŽpŔčv ůĎ Z0ôüżŢłŻý:€ @·Ă–ÖX‘{͆“(4âMĆęEoIAe Ĺ‘´*0Ť8•Ұ¨ ř\!ň"I˝Úá~Ů‘DH>fŁ–ĘeáťaŹ2nOČó™,Ĺ>éĎÉ‚Ůě¸Ăl…a+.Qgź¦ęE—¬H٬T@€p*BxŁuC }7zŔ*ö€Ž×Ý*‘Eă Ľ a~.;Đ"gVxKĎ~NI¬,†§Čb°SÓQR´$ˇKü%¬„Á¸Ľ·IŁđ»¶Ó2%™(+ŰĚ©h™ŚC ś5—‹Í|TĂ‹„YúMkîtĹ‘ď¤g†!d€Ó íA^p ŕÚϬRÂJŔîĄ$á/ńëw:Q}%€,Č »đŰŞëgs;­h—+r ňÔj`¤VchŔĐąţ&:ěP…nŔ:€• ś ćOëQ=U3)äÄ"Ë0Ĺş­qÂ5śF…‡±eбŔi üx«E4L˛ 2-ŕq!&yxÂÇŔÇůE@˘đ/y6൞X­ŕąN ŕpËUĐZ*ś×˝^:2+úrV¬Sč–ŇŠH(ŃBˇ€˘Z˙/Ź)˛ĺR~ŐzZ¬Sqż0ÉDÓ9,KIm"2TU–D-cúçzóľ?˛-CéŞKG^SeYŚLi¨Ě Z6…ÉX/MX©}VÜĚpŤ2 ,Ż@ 1*ŰýĂ ĂBȱß1Č˙;Lw˝×¬ˇTx:p‰ß‹şŇN?Üh·¦-đ ?(E)z P>ťeŚŐŃyu¨ĂĄ¦ĽUqzˇgCDHB YÉř$ˇ†˘¬żň’8µ˝€ľâ/µb’Y¦“0S'#Z+8„KkĄJëw˛‰ëHh‰żŐ´ 2Ď$"™KÄß°vp˝×¬ˇs­ˇ]ŹŚGdZYŽ­^ŇH6'e$Z`¨˛ć°‘L%÷Oţ[łŃ˘&«¦¬Ö‚SB>–6˙H€”Ĺ’‰ü˘¦T2‘R<ÉBV‹*HÓY7©A…Ů‘ľZYP›¶AĽůj9'šD–HráR‹°ŕVp—B.$;sµ•Ö`oEHMp;› "ĆĄÓ€ž´;lBhąÄ: ŕZŻXG¨ă~NlÁަő‡ĚĂ/˙ě/ňŽ,ýÂÄ…’ĚĂĆöŁúŹşžsńr2çT*{“˘˘R }2QxYA[H.ŐĂFG(O‚‘±ćŞ>ˇJT}2˘­Ńrt#ÉYS›zN‡@F *ęĎ ć ^dľ Ś·E°¦ëÓXTń2±P˙8@ lKݍ ľ×`á0"đʦ8f ŕ:ϬŁÄ]qËh۰#%kgćąTľ‰'ô‘äěĄ3_ś‘Ž—HŽđ4 ZŹó5uođýŐ'k)ç븭Î}{`˘ńĽĂť<7'ˇ•˛3QĘĄWx’ŰŁ ćĂşVä—rŔ‰ŞPęĚxŔ>d>/6C`„0  §[:vKÁhśOsü~° c[†DÇŔĄ»ÎëÖR`‹^UóŮÔÝNiz‚Ö%V9Ő‹ý@R¤Ϧă°VřźĆ °âx‰űaŃ^Y㉅€ęů(FűjMâ®Z@Ž  z%Ok"ŁOTj.ńŇO°Čc““l_w<ÎGིšivˇ›żTQŐ¨[¨:ˇę*ÜžTu^ˇ>Í’ kY>Ząa$„* ›,ÇH¤Ź®C+łě,@Ý­ 83g€ÔŠeB5×YXKЧCŰÂÉ”ŢůO˘Ju ·z<őŠ«]ţ%ŃńnO<ÝNÇMű?ť´‰\`:iixŽÚwOYž¨Űë¸Тt4m¦Ó&ĆoSúŘÓp›Â;Ýý-ĽM¦ôóŃáqŚ—fĘP§cS?Bzd›5koąč ´âE{ޤ¦÷(O uöŹ &ačç͉Ô(źb¤=9ĺ‚<Ť ×=l6ěG0©uĆ•L¤†aa@†08&ú/€Hp ŕX1€kş`= áëĎhV>•OĄĘRöĆ `]7&Íݓӌ[*jZÂiÚű4ŇmxđÔu4ő\az佳€‹ŔxŇŚ'!˝‡îţvßÄŹ|'ń=<űl¦/"&É1Ź|2ň<žĂf¦Ä®kŕÂV¦‚ŞŚDt$˝‰fťH¨S†Ë;ů “ę ‘¤T\şZ˛„„AÉ2Işf‰ď]:`ž ‘0·ČR Ŕsäâ`‡ ŔN3€cçÜŚuë)UŘgBăąTDŃA @] ‰\ˇĂiâŐń¨Ę&«ćg-‡‹'čÁţ„ě‘'ť‰§ű ű›q ZO^á: »ă¶ôäU˙láG…:hSŻA´šis4iŽZ8­ÇQ+Ż9 żIëč·•â‘NÇ>źŔëQř‹—e÷ŕ5 é§ôśé$¦ŤÂžąŢKśŕy Ü! â™ ć łĘń‘ŢR°˛˛^ŇĐ›C$ü€(›%!×"3CŔIyôźkšQüË<Ö0Ź o° ó1Đ1+üËÄčŹ:ké˙x‰ `É €Cp­×¬©Ŕ®Ŕz×Čx*Ehä&žEŹĄtţÖÄ[ Â3kчqĂéľJ†xr Xň¤Čźl-Iy˛ Bł™ů=ń7Đᣊ}xV=QřňŤŹ¦Ë8–ÜC;®:—8§ůF ˇLAš|4°ŔY\á¬2™ —ĄpŞÇm83ĹńşDF¶°ś ®ŞĄł,ö ˝ÚOÍřăŹÝ2ý0Î’pm׬©ŔéŔ.P?nçRĹΧvQî+ćP:8˛>O˙"őWÉÉR°ěéÖSvK¦A]nNôŹ” ˘x=ĽfŠ'˛a1ž*¨žeL@öéŃŔŇj¦ľ łö{Őö<HU{ú‚[1l2Óńee(tq?)Č]IpŰç.AXv&+‰˛ş~ ر!čj˝?0RĘ7wť×¬­# ozU: RžGýÁ ôćÁ!Nšnçâ[Ůďe6 d¤Ą >čť„!€˘›h†~p4€8ě÷×Ŕ ¦ÁĆ0%ŇžbŕG”óâ%ľ3%ý>ƨ”(iĎś §!Ľďäh˘¤b™[ASyĄ&߸•ž™Á§„´@.@ŤśTÇ…+Ě( ‡3˛6MŐVţŰÜ“3(Ô$"…™ůdľÔ:@˛ÜWh ŽÝuÖÖVę¸%8 ČŢ96tf~hJęÍź=q^Ŕ"b‡ěWzv'ěłËÓ÷A·nü JD‚<šj 'yE˘ cţIś Ä…Ó0 @""\â (ÉĄ¦0•ě<ęR;‹1Š c˘Ű-ic™‘łKéGÔ\ł™84Ó‘bQhĹďţî{ďýŰ[”¦Đ ČţkĘҰĚ"!rCĐf\#u“¤¸䱥{t€3&rů –é Ž ÜŮ5^°ľ AĂŮÔĂ®>'ÇŤN`ŚĚ˘«3« ‚ ¸Ńţ6 †ö ’Ó*ľVQŘš8ë|`N~r$Ŕ ŮN‰ŕ‘tY™z“˝/1 ,2ÝFsşáĂÚ;!Y5=ZpĽhLësÔŕüčźé–(ŔňśŢi BŚ„Řń”©!}?™ŘęÇkś'íH°Vľ»Rí4 Mń=#’KŐĄ§Ď>SşŹŔŔŔJÔ$óÍű±¸9ý@ű‹p©‚8ń$9G×J@ÍR°Eđôe*ʨ›%<Â*šë:ÍrhEö {I˙+żňĎ˙ů“'¤ 4fý\-RóyÇş°–‚…Z!3[@ÁŰ] ˇŇ,@`Î˙+űĎĽ–ë6QäŽ@t ăV§ż‹t»@nŞł‰ł«ý4…fE$jVO)mÉL`mť ŔjńŽäc•Š«d }…3ęJöŕQ«˘ŻŰ!@:ޏ¸»–ł›(v Ţ/Ł)7s[+ĹnTg×ů=žY%AŽF„`˘'ĎT #y• ’đ·Ý%VPF¤NçŇĽ$d‚¨l—u6ŕ5Ó6R`w©±°yÁg!yí˙%đ¨«í(Pá.Ç•řˇCŹ&-(©+_g|‰HÔ=„*L‰:)­”˘®hPĐ™)÷W8K[™$ÎÄV-©ZM'R;i°H}ŐŘDßMä|­rup;ú°÷d  ś x 5€Ťą# ćÄ0tĆ(L$ˇN¬WŻ’r%i™ČÜɸ=đĚ™”şăťŔ+‘ܲއ×É-yUÁ¸\:Ô ťşč Ď0AÓ Ş"¦0l–)±Ĺ|‘›.|R+›>ă’f!3QŮëř‘@|ťć-k¬ k ¬Uh'ăĘ&uü5 »¤łŻá:€Í±#\–t=Ľ„ˇß, kÄq^˝xőÁxĄŁěĂL‚‚pf9 z9G!ňydBI8…$_ JłŚ!Ł•S†¨”s˛4NćMĄźqŃelĹ*˛Çć:“ťl ËŤŽ›ńÎdéóPg.©ă€â®Ŕłlˇ—Ä6<·ĽjDSł¤ Ń†^Ś]¸vł›)x!褋Ąär_…8ĺ±¶Ŕ1Ă,¨té%a)+PÜ& ‘ĽĚť‡mh!W—R±tČ,S`I[]M#eS0—‰­‰8WF•é_+ŤŞdIžŕŃ÷5 ą5Îě »~ë6T"ŕY€]q„4šj¤Śčf¨e fÄ3¤ęŇ,eBSf[ =ä鉬B%Ó“aţTdç’»Š–a9öŮŽËT•,˙ÉVŃĺî2úLľ+ŤŔ)OŮ;Ůł7”ň7kŔ† @X ¸€oŇG]&Q¬+ŠB ş»\ä=`YZę 0› ÷hŠ™ĂÁ|Ü„*+ŁňµŘιĊ+éźĎCµźK'M•’y†HÝQSI×Üí‚ôluM:‹ŞŠ[%ěŁ4Eě`I©űkŔB˛&r?ÍŃËč#˘k·`SŔďäř\‡˝¤­NŞ \.ŠQž52IÉ•˘¤ Ď"˘A©™Ĺ@'; 'l–Áˇ—TG¸śĚ f†seFŢĄ #*Ę”8­ÖŠçĘŇÉ©Bâ.­”ôś,§6Säą‘L2ŘYĽPŘ1ëüPPxBä-Y7Í™Ý-HÓ?nríf6U`G 2îÔE˙’mŻ Ćk—¤ÉŘľ#Ďź$@´óonLépşMŚ8Ń`ĆtçËŚĘäç7(łygCDIw™ÚŚM4MöŠ)č´ľ'úÁ“Ę*%ű,aŠ„Nf+KdşÜ™T–0Č—CĺÚů5`űĄRľ•˙aw+8?0e~Żcw=5€Ťú†Ą=ô@\­ë;(gŤţËKĄ^*2p*Š+ ç×ÍŮĄŁyâĘű¨‘B†8„jŕ$îâzUKt¦,U)Í›ëlÎŤN"*u×ő¦=Čżöźťş~iĚ5ţČ×ŕH®8Ű>˘y-Źť_â\Ă"ý7MfC’˙¸—ŕ5[°ą€łNޭЧYâqśňXP>ÜSľĂéšx"fű—YŇšŮďŇöuÉăm”Řfq¸é¸<…‚erË # Iús^’5}ź/‹ć˛–;Jjüu<§4‹„1ŤÜČâ¬Q83´–Żâ Łň4Vlq˙ e]ă ¤|š+;<É”N+ĄóDźséä“:éNŤŁ2őwíá±(¸w3śţągKIvDůřŞŘ@·Ç3,EîBS¨ě¦ÎŮĄ°Î8“pDTśýn_€Nvľ˘tm‹ĎsG«žĚŐ¦Éń¬ň»¨ČĂJő9®âŘŇäUŃŰĘç©ŇŃ«!ińžß*VçHɇNŠiäGlft +ÔFôöü Ü w)ÄÎTMĂd őČ]Ó°eÄC‹3HŞl{'ĂU±â‘ĘňP'd ˘8±,V:Í š_mC\ÎŽjÉDs$íŻ¸ÜĎB·•M¤‘ćv26OÁî¸%ďcWäĽm÷Ą—˙Nźč˙g×nŔ Nvr°%XtÍŔť~‘P»Hł…DĹRa ä d—Äĺĺž]„?§?Q ݇”h’¤Prg8ŤÄ[wÓU…UBĄrS“«ľůň‰OM…š#Yî°wtBY¦•âăía$«¬MJčşBÝEQ5·ÉąT ¦ňčâ)w6`áü±_ÇţČďă”Č‹pÚůuţ \§Y€! €™Nś PDH»ąĄâü™ţŐÂŁT¸'ńé±Ę@ˇ#3ME ¬ȉIůBH}Gş‚>îČpÁÉM» Q6H *$źˇ|9ŕäiŚC÷V§ĂrŤ}ÚŇ1®scÔJŃéÔvŁ• ˙Ý8 ˙ŁčDZ<…Eďwű9KÂŚüżnë)0 ŕřs`gĎhd÷PO¨wÖ.ń.“gŇŁIM÷ÎFw@5Ž€Rejm#ŃH‘pô-nR ÷vP*{€âkşb’ˇcÉ0€öa®IŠkË—fďx#E„5xĽ{<Ü ĺ~~>Ô1×YOĆŰÜĹÍĄ‘r)YTÔČË˝ť¸rhölŔĺYç4 0ń%aÇÎ \O `€;E4Dt¬ńpPqÜv€ÓÝŔNíbЧÇ=ńůÜłĄău)UGĆüŹŚÉBB„đ‰ŘB%ą*ăꛋwĘz:Ç—€8ÄQZňł& ád»+Óă• #dzˇ:>Qőbčă\äág:ÍUśë˘čŮé?îiÝď–Ç)"ĄŚ5„$\dŃĽš“č,e/pÜŽŻőJ@&r#âUKč˙z­¦Ä=K5px:0žü“0™ÜßŃŽPŽÄˇ\ĄtvŔ’ĺłĎ™®fR(H\L×ćU‰•+ő9Ű´Ţ '|\! y #IĽ”aŔIS €Š7´9‘ť`†ę›žZÜGŁ P!<*â 'âб⧒sLÎG1SÍŚ— ^Ć\ýkÍd‘u‹+f,ą@¦Ëîł‹˘p)‘›!ľ «ŹmŘ5Z0L~,mŇBRô<™{ sšxRřVĄ‹T©1'Cn3¶óąB$Ĺ4c)Ś%K^$R\áĎĎ•dŞg4”X«.NuhČ‚śşlRp;1P¬ŤÉ‘ňĂUwÔâ<źXÂAoŁ-F IDATm“ř÷/QÇ"Ńďâ™O0ŕ䓦Ngś~JY¶mćŘL?'¦í­‚]÷| ¨Çň@ä‰üç°Bó »>ë*<pąÓáěż´'Ó.“‡\ş’§™Ňă,@vŰťĆßä˛? B ÝĐĽŔ9GF«‘†Y¦k„Ž©Y 2főa®Ş.Ľ–hδ¸´Ď%’ĎĽňA¨3YŢ“›$ŃjîTŽFĂWM"•i5\€Ł7°÷58 Y€h!@ŽYĎ=feĽ®·KcÚqz†î†RĚ0„T(ąA Ł(ËŐg®Cä«6˝łC>Ŕ•r!ę\şę±é55VLOą „^ řř-€EÝá ăĂŁDŠŚ3´˛`K.:,iý0TfćŘZ!ç.ĄŚÇÔéYľEÉë˙ĚjĆłwXIśxŃ-^†3Ős\Ó¦ËxdĆŮŽoJ˝“¤ě é hţŔŇ,‘ ´.±xz6ŕşa×eŔ` ..Kµ#źĘgxĽűJY)»Ĺ%}  f‘đäą:…Żam@‘ÚŚö"ĆB˘0*—6MHö$y›BPĹâč   ŔyŚŤ<ó‰«|¬Ş8UU–Š-»ĎpĹÓWéVîĎ1śçŠ·1ö¬<VBШ0™ >đă΄ELˇĂe3EÖ(ú3Q,űrúk@ŰşŰp×dŔp  âŕs`DÇmË©ř{ÚĄZ(HŮ’9Ą$bAQb*´p·ňi1úF™$ŕŐĂTT‰¶ęś$۲ä [jń-zz®ŤťÓNLď:ýZ>ĄłŻ@¤oć. ŔNˇ•€[až‰N™;â&Ăç ¦šk˛?¨F!ŢŘČuk´=`ďĄ6÷†Yup’,HÁf:ómµřu;µHşZ Ádĺ•]îkŔŚ~6ŕµXp@|LFŔ˛CR­đ˛:č&’L°aVŚëg'#˘gîśéś:"‡#ŚěâQ5_KS¸\ŞtĚĐŐ²3=‘é§L'u‡uÄZ™xÝźbH´T¦u3ýFë.Éx-Ö\D YßśČtw‰.?Ţ-‹â‘™hÉeF’+ŕ1U:,|m°ň4ş¦D)‘šbwł”.Qć7ĺ,9RlUµŹąnđ5R&JŃâ˛UĚúLw<1x`Ů­Ďą\rgěSŠ$EΰnńđÓ™<¸ĽĂAw~ŕ" î˙F˘ˇăqžö€‰ÁĚ(ş‚ľŢÝű:H4Ç>ë`.Ü˝’žśb#§Ż‰łĽĹ‚‘8&PKĺš“<ęɥɨđŠSe Çét˝KŃčp°*é-z¸ëdâW• t.ułć´řĚy9<8pč;d:–wČÓŘBSĐ•µ*gî¸p! ĚtÚhřĎîmö}>ĐI˛‘7q´ô…ÜAR nÎ¬Ł‰ÖL%Ú“K}`ă±÷ ŔÄi}»łŇD‹ tad2Ď4ÓŁŚÎHGďoŁ$4ő°g‚má¤\H»ĂÖŇb+jÜě;řŤĆ¸ßł ‰Hă·‡]źr»hŘÖă+żwŁć-¦ĹéÓ¸q5f$÷»®eľ"n ÂŇתí KD[Čt ‘NEFXŘh†/Squ˸Uë-¨!TÄ…lt˘=ÁşĹEŁčľŇ}&ÚLXÔąěőŁn?Ę3“iM1DFÂ;‘€PŹŰ†zUíLÎ;ˇGWšĄŔaC@WÄßvŔŽŻ¸PŁ  ý_„ ÁZţ…áÁhöšÎÎ0-z9řŢíÝ%;\@@\ŔłôέGäb· B+×b?€‹)aŕw‹+ăĆ`ţ‹‘ÚËŘo2i€Ŕ‡ż:řń€ŤGĂŘ’=s¬{÷Áu…Ďk M“ß&H{€g F@>ĐoęÝ:EËkÚüna…ß27¸ű\P¨ÂńŕĘ~%ě>±ˇ[pâ×mÖŇÄëBű×&0bzÔţzYěÝץÂeěk )c´QĐN ,h€ĐZú?Ž€çn} ŕŘyĆq|&NŢýuTpŕŐ˙pBHľ ’×–ř•ę-ŮŤ=˝`ű)Ţ]1ť^Oúż¦ZËő*6¤‘Në4bG=dŐŻ‚Â:'Ś€K@KüPŘóC†"Jb;żࢠ@”AŮ­_ý `ŔH~Gë˙}#öĎ+ŽŚ0x5ćÓë Ü©rš×kŐÖŔ !˙éµj™¬9 Ď‹dpć–Ń×x~źěÁ z7áťź¸¨PăŽ@¬×;Ń#á!hĺ„ÍÜFŔ©ĺç·…QvńÖ Ű3€Ë+P`” Căô«qig3€c`<Î×ëŤ ŕ,ś ~˝Î¸°ż´*ĽS 47-FNź¨F@ú4@`ěÄŠ&wÖłV0ťĂ rÚÖô„őĄë +úÓCŠţt—łŕ ăKT± ÇFŔd|á u˛@há®4?Âwţ̰xnXqý5€ +ő#Ç[µfÝÁČk.śŘĘşô6:~ö ›;*Ć^ôO!°%ąő†őd÷M§îĎŻĐéşGgM–xlž®'¬‹°wg~ÝéúňŰ<,üÁÝ1˘”qűĎ ÂÇA }FfY€™2(q@k¸Ŕs‚"ܡ¸Ä@m€†ěđ:€‹+•oş…lbŐĘ®Épë Ŕâ>™¤ŕ™˝’Ľ‡Č‡j} g­˘ďÍÄďŞC1ŮÖ“n¸0,]_9ű`vŐÁ0GŠ€+2BAGX©L¬”NŻ€ĺň,ęEj8va©Ă# pKĂvzŕâ €´X… ™€_פł‹‘Řť§DĘŹŕ†Şň=ĚÁŞëk§ëe8úV¬ť®ł,bĂCŻşŢ—®—á ¬_ß°"ţEôÂSž\ĽÄCšÂĚJŮ/ż&Ig€ýĆ3|ńě0—ŘśVv~ŔZ ¨‡ýę ¤ŞP Ŕ± @2ö^©Űwë#şˇŚă2Ŕpé#ňMĚ~Iţ”@GXÁIŁ(‡ýăîm¨BŞEz(€KTf%ěúPó:—2€ÄÜ<`ĎÜéu[P*úP™cůŮ @¬1Ú!Ŕbääť¶ô{%ůp#ŕŔ°ľ`ş9jx:čXż|T-„| +G Đ4 ÄGă0(Î]Í@ߪůĆŮŁĂuŘNŻ؆P©!’ĽĐfj«ľO­Ăę@î¦B ŮöÓ€O5ě:NňŃ®|sj)đ*W8ýÂ0?Śôýo}|G¸ăłŰPâ×€šµZ×ĐB …Ö Ń3„ýB §výŹ5âńB Ǩ%lRWëd)đź˙ł żł ö@†Áa»Ľ`+ @-ÖXË 6|«ĚYűą `Sµ#€éQ/b쪓5Ľę˛lŕ®W±ÓÝÔ™ľ›"Ąyiţ“ ńc ţ AÖ˙x©OŰm `+ @Ü4ݱž\= F@G+ †i¸uL1m5€ků1Ŕő˘$r׫ŘćÜ!A\˛řCĆ&ŔŔ% ëí¦;÷˙çřďţzŽĎń•Ď˝óWzŻGv."©|(śâ#pĘcź?’‰Ż‘Kkx-Üeű€Öęůű?ˇĹÔq<`á[€{µü`Ű fÎĎźžnżžł“JÜ+Z˙©±Ş8‚ď7jcpôlad¤<íÝĆîŃŁě&Cť‡H"E·X,Ňí `3Ĺ8j{(XĐĎ.ş' ŻKcéÎŻBéż:·ŁŁ ˝»€SřühĹk+źŇ?şËÄuÜLJÂ=şâŢ[ÓťŞ[w„‹ß»ëč>źŻxmÝá{OÇőŤRçäąŰ?0®xtęÝřđ|yvöpQW§§‡ç§×ÁUęÖaXSďÝ®ąĘăóňěáĂV»; ßóRnŮw˝ šb Ó}‡ç­¨ó ¶śL¦ÓcçĘ“¶…®ş˙€ü*|ôŚoń•Ă­gµĆ/Mú`A:~±á!ÜNézÚ(Ď ŕ¦@B›ăíü[/RKâ“q‹Ď-Bź>ZńęS쟨ߨçô$Hű–řpŮ~Ă\K­tÇňe=D§Ü»aÎ ´@ŕźłŻţ“ŮŇ3ďź če‹yř LĚüÔ´tşágzđčäÔ˙ƇgAţ·ąĎˇI®ÎůĹ;< şŇýä4ăNT„UżL$ééúEJ=aşošŕŇßöâß}?ź@hoý9 Pđ“€çęzś¬eUe6úmˇ0$Ű đź#ÁĎ[|öݍ÷«§˙˘ˇ>Á0˙YjKü07čĎżüuPý¶Ińß¶Hyx~rĄ.(Üá‡×@˙řJ3m;ÄNp;;Ř`% sÝa6]Ě}őçăĂ:Č˙“ůÉqh’ůüŠţNBüc¸ŃŚ0źă?Ľž`č ůĎOčv’űGřäd0dŁÍO2‰ćá$PčüD2řŮ @Ôź|VÎoă6—ŻĄG•cOíĂ0˙Yj €"č5đuŻŢřóŘéŤ?›Č¬“ ¸¶IĽüočôřđ|.Hę©˙Eg•mŁúALćä•sÝ!*ĘIâ“q-•Ň˙ăőDyňM>qâ“ů˝"áÇPżVy×rkGĽy¤É:‰ř‡×“ąxmßK‰í;ŔĽ€k€K‡@×Ç@qŁÇůKţ—řčI Ŕů]4ËĆŃ·÷ČĄŔ-'¸‚N+!ŰR<ă ›ĎÚëĚߥƟܑ×Le–)Ç ţńĺJÝé‘Éż´O¶Ë4vq•[+Z¦şC]/y¤ÉĘ\۬p-~>ßk˙•zíŻĹö6ŹrŔâč˙ úŚ€dÁ0€_űŰĄ¸ŚŕŤ€qÎáľ´Ťź\úŃŔSwˇŻá ţč9ÜfeŰł~Ż9yúĄž”_H0çÄóҝ٬$ŕŇÍ<™ě’r-©|Tç{&ú\>5MüĎ#fŢwťĎű#QčĽ'Ň&×ůŠŔ0/á·F3”ˇ%Îń ďđáö<˘6ˇ7~X Ż>Ű`­ŔźI# K5 ˙cĂüv ~Sđ„88č1iÇbPvşm ÉşW•é ţćúÂC¤ŔL|ĺ9Kf@ć3Ćű”˛0EÁD0 Ű?ÍćČ”Âű\ć< űJ›yďćënO¤ů,­ű…ű¬‡ ‡Á4ɰ˙eýÖF¦ Ü0? (v˘u™!€kâ°~i@Ó,ă1ŔVp9€+{€{ŠW  ě, Ěó*_™Án 3řW©f/GSÁĽkÖͨđ!uü‘Oŕ Žü1tć=ÇAćPŚ™ŚNtŘ-zť¶ĚD ©g1d†m}ń>[čú‚×H&pŚZ|Ť‚mćÜ0€°˘ç!@˘8öřUç´ôßÇKäÚ°´6€%2€:î—?¤Ľ˘Ť.*ŢÂŁ‚ý˝`“?ÂýŔ°ďäT@縙XÍűЦ#µí2H1s7°ÓŤGrE¨lĚŞ#˘Ú Ĺä'®UŐi]«a&^ŞoVˇ=$©Ű kŚ0én0Ô#“ĄŔ†űŘ®HöţŹôďŹ 4gvÚ` ľŁ®Żnw EÍHżDµ'jîŇZő®I•ÉnE@˘ŃuđJŔi¬Ţ ęÜkz]i-›\u7t„iË.ëФŇ1-ŘDą<˘Ěn N&ŢŤÇńŻSňżţ[č?ꎵ0hÇZŔ=ą˘ýqt‹îŰţJą_W¶Ő#lŞÁ扴®©Áj„‘ą‚'Ř×]%´Ą[pëóÄáP7‚$ÎÝM«şł–řŕvÔvC ü: Úá—NŽôďOw…e=łí #ˇż­é‰k_mˇ6HŘŠtˇŃĄ*€`ś Ňş@ѧ"(X—ˇN\E¬ÔĎŞ’:6U™rEoLĄ"ĘÇJľ&W†śŹ$ Ü cŁ«*|&p ̬—ŞC?lY‰Î˛‹í ŁěÄ Ů ÷P@¤˙t®że@˙άÖä4€ĄčöQMô´®Dĺ,€e?Ő5S4eUËÂrŹęWP*Ĺ´ŕÂ07ÁżěŘČb“`Vµ 0±‰ću1j1ăŐŃ€9äÖ U ô@Z»»úÂĚz©:ô©ďĆç5-í}'@ę2ëÂř˙8łÜ7p ˙c—ÓŽółNŘb¶í=üĺ]×Î&ęzQę|?Óź‰bi_Ň,±€:™Ľ! f5ůdiH»î(ż:X[ŹČä×™÷ĆÁ©ueŕ@= q%P1-€Ř݉`Glµu™uVţ#ŕ2Ś˙Űđ"Ü5 Ă–dD%YPěj°Ú­ÍT[Y+‡ĘočŔJHjĹěSË]Q‰Ô*hżîĆ0öí&Řn·vħ kKy,R'#Ü$}] $"u Ű°+6óQÓ÷ @Ë}ţ_˙űđ˘pkŘ`ĐQ[±mŞÂ˙µ¨(hŕČŁőR…H!zÔE.fEpB|ńć˙ăłî"îÂTw˛fn€žužXą8!J— Ć¨’Ô";Ž 2$™xo¨†ĺ’I–ÖˇČP @«ěÂŔ D{‚•n2Ngü -˙ő7˙…s1<^Ůŕ9@ň-@;Z8< €€–0ˇ\É» ¶Ű­ń)ĂÚRž‹ÔÉ7I_×ZÜ ź~Mď„ ]téëJŇj‰V őĹ“šU(ë=€Zu†‰¬;YőZ]+ ií5B¸4 €Đo‘î-ćŞ S,»g€…@Ok@^‹ZRÎé&Ż“«€C»ą “?łŽ@ĚB0„„WXdią*{ €ĽÖ+ÂĚz%xÔ}E¶Ď›ZvĹ0ç)€˛,źÖ:€Ň ${oČÓ­â!I™ůĄŁtY î%ńAÁ©ueŕ@Ş^`ĄcZ€’XvÄŔF@'–猀aݛȋĺ˛paš ŔÍÔŘ{ @µ›`»ÝÚź2¬-ĺ9°HťŚp“ôu­Ĺ úé×\ňť°ÔsŘŘ}>ó:{8hKáK{řÇ €ëö‚ÎĐö€äŞ s,;ephčxúGĎŚóý»|»Ą8¤˛ŽČÍ6šŚ‘ż4>RŮŢ€J…h Ű`I{ĽM®9äÎö™Íkčµ^8fÖ+ÁŁî+˛%xŢܰ+6iëέPx§}ň FKQ€ĄŔ˘±÷€< Ů*n’”™_:J—Ąŕ^Öç»P­$ü˝ 'YZ‡~ Ű°ě €ľôŰt®( ­Řqţ2ž ¤ĂpţOŰ–ţ9ěĐHîIŞY ëj寴1ăOŢqDÖHý űŰ&lłąC‚č]#ěĐ1íJŘ(ýH ° ‹2‚¸ăŐ•jYOި±R±™Oí-+’Ąuč‚l ž‡YvÄ»‡Ő–`Z(ĚŮ š´t]¤ö" RHăď 쿨jľšŮ#‘÷Hl=ňĎ‘ĹäŔq»˝Ts0ńŮ˝Qho-c‹ľĄRxÚ‹OŤDť¤hG-ł® n1![X'•!šČvłŢuGÄ÷’ř ŕÔş2p Ě UŻ °Ň1-€Ř[+,;bŔĄŔúkŔTPcč ôßÍtú0ŕóÓOüĄŠ?˘5ôx‰šüۨ‡büqpÚ;ćĎmĎĺČiŽŢóčJ¸‹ŘsŽvxFkéPfLs‘"Q&ŘͤërĘě¶ kKy,R'#Ü$}]K±7ąŔk7ť°,$č\ŕé_ńˇÎt…::Đt<¨örđÁý§OZ˘no÷Ü?}€ň±}ĎŞ*~ôG ”ÍŢłx®xpZmŘiţő¤yŇŚ›±Oü8CWşi¸ŰBűăÄy`Řm$°4†‚Ěk'ĆŹđĆtŽA“ZĐlQ ŞĹ‘A€Ý€›`íu®K0‡2żL'‡ß{ Ŕµ°ě  ć!€ë^Đs6`Ńhů/ÂÜqřé°3˛Ô0Ô}ĐÜrż9őÄúŕÁ}8ßđ ˛…÷?ôŁČZ˙ÖŁxîą–EGÁ8yŇ<ńüćÁiř=Ŕńy`4•'7ęžÎq|îťĺ ě+`Uôj#ŐŇhľŽ 2”Š„oÍĂö5ŽŔr0ŠE¶Ń¤ Ă#ĽqQ `1ą gťNŕÝćąT+MŘŕmrÍ!·©Z Ňúşzoŕ@YŻŤôä‡áy¨`GlµÜ¬{@çŮ€QÄwľ ?¦mu-Kť“-I9víďßćQ¢˙ Öö„@Ta€ _‘ľ'hv ÎH-g fü—ł`¬šŠ‰iŔąD٧ą• soX7YZ‡~ Űłě’ €­€f@O¡aéŕţé„ÇIú‰˘ö7ŚWŰŚźx&€+*5ŇąöÄ۲Ľ(•iiŹź¬c j¨€ăŤ¦ @dĎńeڇ›#ÍÖČUÉVťłulT>,0TH9"1KhŚ{DóčÝ©đŻĹ7‡ÜY˝Řć5ôZŻ3ëĄęĐŮ<_İs6ü » qĂĎŚ ŘřŕÁ1—gü€$˝ôěočĺ©X ńFÜ "ĎŃŁ2ŹV˘Ů06ÇÍđQŚÖN뉔 HEĐŰă’µ­‰X'$25#2ŽyU›tŚÉZYŹXA+"­ccj]8fC\ÉTL R˙Z€˛° P­pËË0.ťÓ€mëśŢW @Ětiš1ož}¦u?"4lk^1¶Pzűčep łĐ*šv‡Âqr ^ˇ–QWÉwür)}ő,@ŹüˇŽ 1€¨˙9ł;ÜmÖ–ňX¤NF¸Iúş®Y«'u`3 ŔŮVď°Elr!źŕňLXŇ+ú?íÔřďţćß,üA±f‰@­"ńF’łUŃŹÓ~b€tUËŘMXĺUZFUUű+ú§…Ca… ›P¨*1 Đmľfŕ’ٰT¬`ě”ř”–WxŻ9 ňŘS”µB!•*KťđZUń׸G4ŹŢť ŻńęP|sČ­A 006ŐŐ{ÂĚz©:ôA¶ĎłěŽ Ŕů ]˛ŔĄť F@ßJđq|Ęë]«Ô¨HwĘłÚżâĄĂţÇĽ$ůT7hÎČ÷+^ŰWcÇů0a·Ý *ˇä>¬(6I.&EéĚ(k)Q´Ę"1ńŤľGHYS:Ćd-€¬Gލב»˘čŢ/đĚ|($©óßĐ Ôý’÷ÇůĽlë†Tľ®ljbî ^±kěuäµÖ2şŞBěŔx#q×'ňă€M¬Oh4F˙4çl‹ tŰ„µĄ<©“n’ľ–ČDlxS Ŕ®ŘäŃ`r@ţxđh]ą {‚uîśgl¨h†ígđś\ę©CP˛"!PÇ9WlĹsݰşXW˛`@ÄÜ[ÖM–ÖˇČv-»b—Ň Řu.€ OęfO@çŽůÜPcpŤŮ€vö‚®ŐůOŕ­Ď˙ń+Đľ.aA9Ô2®Ä=˘yÄĹN…×xu(ľ9äÖ ›ęę˝af˝Tú [‚ç‹ZvÄ€C^ Řł ŕÚ±Őü–Áâŕŕł„ävŠ6€­M]trß›çęĚSĄäSśˇŕ^(xč–?Jµaö0Ä•@Ĺ´ó ÍWZęxjĺNŘę5ö°‡˙éqţ±ř™0·KiWŕü7ôWäR˙ÄP}‰8Q_3^ĐM·l‹ĺi ôôÝŠŢND±k;‹jő.Ůz×\Š ß86ęąÜ+°Đ€Ě`Şź¦«YtŠ;Fv|±śg’ĄµčĐĘíU>…‰k&Ç I˙.F“äâźqB-žşĐé7«€@ý˘H¨;>ś ec—‘5;dŕu™ý¶ď@X͵®ŔwZ›ŽĂ•€"±tšm]ŤlŮzŻKŰŮ€AÚ•Ś‚Ç»«âO3ĎÚdîęYë™â'‰¦"á4šdUćĂYŔŞ@~AÎCA®ń?Ňpd®đŐ:ĹĘRwŽ Ífě ć=^aôżK6€îu=' wŃÇ×âśžu\—,e§žk2€xŚp­×xüBBbm p2H&SO"ş6dĆ8¤m°_mŢG«…Ż.Ş|Ôeŕěůî Ĺ,}‘FŐîé,šůJ3Ż‹ŤiÚÉB0PrĚRi$ŐůĘ,Őü € ĽŔ+đ„˘FëŃ&í~+4€jGl× uâs`ßÚ€˘CK†KëSD®P„@ň$ź5\M6e Ŕx׍L»çĆĹx·Â1Mަ°Żř-@# üś^ŔZAj€G¸OfąEź«ěß!Ŕ°uŰc5¬XÇŕ›1t{TęHćđOíđŔÇŠaëYب,hŽšŐ$wiŃ~MňU T8*@J‚Íşy[‘¦.V©Ř¦A°Ń‡=8=.Ş€pöXl„kW¦č ŠUşbµ„nďuä¨(Ň×ů¤Ý¨GZÂPó€5€¨«DŮZę÷ đYĹgń_bˇ˝˘lÚA@çą—Ä–NÚŞ -ąë¬¨#ť{@´îů€'÷9ŮY €Ś /Ű´Čh˝€*hëËcčd5a 6€:žßJ€š(ĂX9XËŘHzW `c# ląťł¬y.@pĺĘI~Ţ ´Čsý1Đf6éQ_KPPđú €‡dcÂd *ÄşX©p­\˝‘±őwŠ12±¸ŚĽ›HKŕ: š 0 ĘH1ÜA@×:€ÜÉ@nýSç? αŘřÝh+őąB/á_Ĺ ôÚţ8đoh XÇ Öh™‡R(ĚVÖĎěÝZ.Ś¦Öž°´ŢĹŚ"ät=ľ¨„şµ{6€Ţujôýp|Íp2†i@4n`ë` ˙˘VłE˙Ż9 Pł †!_D·¨<óĚŹ„_ük/řö# |’0ń.C“ąŇO& ¦8ŕ‘- ¦ď “Ţiq3ő‰x`\sP/€č”7č@Š0čÁýťp$ČvҰĆ~Ă4€ăĚ0€w´@Đíşžk9o ‡Ô'ăPĚ P đGđíP>I"›É„@2†ô“ÉÂ)QyGfĆÇV€ĽÓâfę3/ĎĵĽÇżWň#Ŕ^ş€ŞÂ®Ů6Yđ˙ł÷őزŁČÖąî™Č[źŮΛŹ4ĂZíëšUVŤ—ugPV;m=ł{D˛ľÄ/eŠLnŐĺäÉÔBHÁfý q† łý)±9§Ą‚”üŕOč‚Kł\d%Ź$¸Ş‘ ~ÂE,  Ç?vó¤#§č€ç ĺÖ9LÄś±8©Rô/‘’€8­é_€ @D.Nś°Wň˙w°%4TAÜŠ?Ű–Áy–şő!Ň[ mĽľčÄö%‰ÂA¤JÇJ 1:ĺň–1ĚŚx’Ü/~pśÚ°NZgČ\€éâŮĽ5б.iľO"%˙¬ Ť˙QŞŻ{>i—sîC!?r×Ű9€„@|ŰâáýřCĘr—´·Ş1—|"ŕHś%Ă´Q'$)ň]Í M˙ĂĘL%|°ÔżťprNÇ˙ XĘ\€¨šĂŤQÔbz?ópÇë<ܸ_đĎË#L¤Áˇ PěoKm‹íLj=SżEyŹŚ ö>ľ%=BÁŰG P$€dąľŔv‚éI\@=6óTh?HÂDČI*x†¤Í2DŃÉű‡ŚQ~Řt8Î’ž™=uRŽŤŕr‘eC o×˙}Ś\śŤbP®űŮŕć˙Ί§I8*Üš@©-bŇČźoy+n~Ł˘˙­ňĆ›u^K‹]Dë'Ç•ÄنŽDQ¬wAR)r\” ęĚ$<Í;Ć(Éä´÷wuşŃ!ř\V‰ř`oî’żoŁ€ź„dP Ö\€ůh@8?ưQ€RŰaŔGFü |#[[‘g&€ 3¸†&”Čž§Be ď Čy‘ťŔMěCćÎę1`vÄŃ-Î4Ç˙I€2|şń§ !ř sĽőzž ÷ç‹ölOÁڞh(ÎôڤÂ5ĆĄ=ŘďC×đ?acLż÷É' Ó%eĐL3ęßľîKí~ČŁ©…„öQt-ż}_Ş Šř@Č ÇˇťĄi}ËÍ6Jną%mÝżĺX%oßľA*Ьđ{Łâř ń!×% $KpA>_ĺˇ!PĄŮwtżáł4wrň‘ Xů~6ÄçŘ›ÔT­ĹˇĽÉ·Čä yBéýĚĂ\k`ÜA*€ŻďśÁ“X’¸PŰBÔÚ\¤9'aű€ď­@gŐľBŰ’ˇq.±Éů.Xţ%Ç›®Hľu`ÂBŔu˙Çę¤T‚6—&Úě÷Ţ"ů˛Ů úÉźlŻ—z–pĂ•HŢ?ň20Đ ¦ţĎpňţɶ°Zě>@…KŻ $ž —ĆD áÍjâ˙ŕoikŔŁxâ¶Ř”n.Âo"mTô@9řŤ&ÁOĺL°ĚŞvU¨Ăr„`¤Ín¸ÍVß>ăĚ(Ä@B± ö{o0“l2ľĹýXi˙Ě'>GDEN6­n_ˇ}ŔOÂ\l Â—Be6 ďś 0ž >80K*+rµ|˝W~l¶± 'źoĺW69Ąů˙ z¦Ŕô˘4ľ•ű%•´•›áTzä @’ öUđňç·ża®é… ,ĘÁ¬ď ?˛¤–˝ÖI"ür p߀bJ ŠyafRO`ďŤ%%đŻŞ÷“ž…!€3ľB»Ŕ^á¦ŕ.¶PÁV|i°·3Ě!ި‹±JlDY8Ë9 G¤S \0 ŇB‡Ö›¤•tÍVZuV}Qâáލ蝲L´Sš«’yPr‡x<Ť“t!ł‘çG5=7Š%`@m2R.Răźs=@@…Č’’żŹ}…ţdŔ —(€˙űzÔ#иPÖ`>¸2X—Xą·"”D ¨Ô˘,ô_m˙)ÂG˛ «9ţQîB’úř@“&¦phÇIź 6É6•r©ITűOźżX¤!’o-#C¨ůIvĐ ,㼇 ´Ł6€Ďε˙ń·‚Ž}…ţdŔµv*|YŔ?„SĐ·†PÖ݇—Ěü\—µß“»F6‡óĺ+e«§Ő·»ůu(@9ăs2<łÎă ˘UŹ?YKÚ*€ŞŻĐꋏŘ@…Z  ÝÄç~úÍb¸ şK ĘP„ŔQ€„*ŰŐţő!äyIď·!ΆúX°G/żMůf'ť8Şˇ€·ŔŢřpë ´Ńč˙´}«ŚlTŢm_ˇ?p±€ ‡€os„Hň ť}˛2žąôU§€Â@rYł@­Ëox¶°Í™Ż”«Šđ“5Ëś~:î_lWG IDAT~NH†@{|Öé÷»‡˙ż(@Ŕ)_ˇ?P]`x¸‘ź„nőĺú—Ęë„…3‰Ü9ßgŻôÚŮś,dú´îP·÷śăŤ=ç ĘąbTr+Ĺ:ČAb6Ű˙rŃ`KŔy8€kíTP€°<ăŕ†ż7ćX/TöŽĄßgź€bqĐPÖřĺüthYRŮ–X6 c ®+â](@Ąů›hÓ»>0ęňw™ pÎŕßAßŕI;„QĚkc€ür<ËŔ ‡&ăNŘüÖľBôpśŔÚ/k~Ö1e<[śhśTĺÖź ®žł` ÷ľ Ý…˛THÇAń›ťy2Ч¸Žě´TęoSâ­V@ŐÓ=ËôGYP–ëxěso&Ŕ5{ťo$r;™.V¸)8€ü\Đč˛ Yđ@(ú|Ń€r@R @(‹2 s«ě\ipŻŹ¶H’Ąxćć”W.¬¸ôr`1ăĎšX\,pą€TĹCśKx2ŕ„@é` đ2€"Şq<Ô=ˇşĹű8ÜĄőüE&x˧ŢJú˘:o«ŁbmŹ˙ `Ş4đ"€8›d#fű7iŻ_fë9ëâRĹ A7ž*u tćeůą8€óëüó~Ý3 @qF™ż8€©Ă&­‚¸N$čqľă`1É«YLňÚód/€ ŕ¸čKQgÇlÝ€Ř^!ż·ĆO(łÉ49ý—Îę~Y“qU;€zŕ~Ý?S¦ŔŔęîŐ2iÄ|:Ő¸(x€W„dĚčßÎPXŃ;B¨Ą*pĆ%Đ5 @PŔ5 €Ě¤ B%wV@iMÂÔíŚaŔĆż]<Ý8µ.Ŕ ÂŢr xh“8Çu-¸*­úďę@Ż  Ězą5°Ac0… ?=Ď"€śú S.[păó`ĎöŔ;€˙»˙ĺůrÓ„b_*Ý‚{CpHrwóI¤đcŠ8|@Tl€ŢŠĘ %7•q*á¶`ő± ŁA ŇĺßžS€€Äç@.­i8€vQ‚ÓuWr=u^î]gĂ >0C XL9PňĚDýĆůpËnŤ€Hşăţďp>ÜňV~n"f—ďă(Pĺj˘_ë% )T%đ*k€R·Ó UE jĐ©ľľ·ţľÚtô•—{ÄM0ßĂź®dŮx*€Tťwź€±ŞŠ.@Ľ"{'Š3ó$…hOśŇďRśn ¤·,Ă>]oy{Z™ř423ú7sX&~rP°hNč…;Q$\^XůĚÜ_JŕĚCţjŕ´jÁrź‚řńăÇ˝n¦ď}íěÉ@Éřź :ř5« ŔěŚĆĘ|?N†ő¶Ţ~„xi=eîüĂa9>Ę%€ż µ|”Đc8“šë¦¸Q‡G·´[Ž1)Ůńmc2`€RRĐőyzT^o¬>čé×Đk]pö^“q’ďš ř•ăÇAŻ ŘVKV.ôkw»_/m)ú% ™ÔZâ@9OZ~¬čĹÔdk‡qÉuaR<·ěé0ĄUŕôç}*dHÇ’20ňV_öž¬.@Mşź‹„,6áů·Đk_xöfąÜgáÂďŘű˘v]ÓQ’h)€Ŕ]ţ{ŔF€T‹üAj˝¨äąńFů·ń'öޡce>ó…éPę@Dpa|:‘4DnPS ůüśdU˛šČm $yYťęĹešV2)çCr°_)m:¤b!€ ^‚ďNč$ą8đG2L4ŔZ~ŤPĘ€zßćĄď’XRŰF d/®TĄŘŻG OňڀڱéŔç â}Oź;öÂEAŮ UPďN€çS–V9–‚żő}Iň˛:ŐjŔ)/¨2h±}ÚěŔóáoâ0$lťönQ–ěţ“HŔŻJHęâ ěB,Źq,‡€4őÉ3Aw(Č4^€~{H˘X`{đřńžíP@Ń„giyr^‹hč“ eňęŔ†ź8Ň* Ć*Ž4ÁűĽ;ź”DI}ęf„ű™Č]€Šďt8ÁÄ~ü#Ŕ@ł~äňč „08€PňśE8wüC‘×Ř yq\zKÇ* ´˛¨g€pß"K— týߍhď‰q‰ĄR)¬fD¶9€źË!Hiqćăřd ; Ž =8 €€«¶4¬}€ňXX.NA‘€F˝T|bO@R Č$EĘ–'4‘vË ˘LBˇËNŔ.ÁŰęGPÔ?Q RНҏâކ<Ôße]€?ذ=› T<&_0…čŔ €¸čÄ(Ŕ=<ĂÔCär‡ť‚z”Ďś1G瀲]düŁFi *Ű'Rš8.äśÝWŞA–˝Ůü˙u€ź… ˘#ěľK)gÂ˙] ¸’÷ő?˙…ż˙ć´íj‹˛^č0ŕ9ůçŁf-Űëlî”.e|q°ÇE†°őضł˝@"l)Mä[kĂGř zrńvŔ€ĚX%jł°;Š„·3Đ%ŘXŹ@{ć§ŕ~Ŕ_ţ—Ę6Ü:gj€ď{j%|Ďü¤ú;€Ę(€l>ÎěÓ]QXż7”qŇČr,OqMB,d6ŕ7ĹAObú|˘­čUmńV ćtŕş(Ű| PK¶¶˛»rŔKŔ+ź}°G I9€Ňđ˙µZj‚6üßż˙á{îř  =ÍTĆaÜłÜŇl@čřd!ąsŁsQ%{7+Š#€h í‹rx;đy¦Â4Ţľ,o¤”mgJń•ÂßŰ%#˙ňˇ6śú© ŕKŔI9´đţżG |g ŕ+î{@dž@Ë@€6Xń›7˛I3ą…tp 9€Ç€÷s¬\ڱŃ/ď˛Hő  $N(JÁ@PŁsŁ]6ăÁ°Á`Ź@~ řÜ'˘?€{ŰňżĎ >R†„BŘŐÁ˝Ä25 ú†µQ20 ^“čAłZ 8Ç…ŁĎ2W6×··Ź &×ô\iřM@U 'GBţpž,Ţ}vÂ^ c=홟řťIívű‹ýßá{‰5@é$KŔÔŞźç\ÓŇ„/ˇ•cBXˇ¶±úŤ$ŕł ŔýŃ7ÔŮ—ôKű¨Hŕ;‹ý€r’˘}V_Ë<"'ă @ŕXłˇfóĎy0Ř#Đ,zŽÍué¤jöż˙ řÓőů_řÉŹ˙©®!€RŇWĚ0µ€ŕ>c—ź ?ŐL™ä.ŤFyŽĄO˙,°%x_@#Ó¬GŽVŚ”ěsF—F¬ÉPŁă×íĆŔ#üŕXŹ@ópż3Đ^HŔPę6øÁ÷~¤H”FqßŔqÔđś(Łlü™ż±żŹ"źů *lŕ*€‡gB&L‚TżÝ,äýą:pô¤ľĆDPŁ7ŃXź%éđˇp3y'’żťWX\Sp?~g´ý vž{Îć˝ÜG4@@Đś@¨ 6z~ Ú Ř„€ 3fŕ*ŕ­71Cx–3·ËŤu JaÄwk2ÔčÍV#Şţ‚@ř­ Ű-¤ ŕq’ Đ°«zđ3)rŰź•ĘP$ŕcŁ FI"€@|‚ľ‚ÚČë7€Ď3Řx’är¬đ°Ň˛ÇÔ8>¨®.…,©y"®ŽţDmŕQŹ@łpeŕ HŔl0´)čb Ü—ţq ÷Ňoţ 2 °[Ż‘ż=ł Ëë> ^ż7|śňjŢĚ„ €ńÚ´â¶XkÝ`WŁń{ĚCm˝’ý3Űüŕ±R?e.ŔŹ›;ń·öx@0 |­97` ®4Ýá)`Z@ŠłR®čŮ3`ĎBA~´?€ ‹k×ü-uŔ` č@ŮçÜö–˝őOż‰%`Ąę)M柬L+71¦śî îŮN—…Uä†Ôó.=¬+m6v>|6`ĎŰ<÷ĆÓűŮł=@Ľ#3SÇ˙K°"Ýö?ý–€ÇŁQ3©a@ĐÁ@S1"€^=UÁ’쯊:1QC€|`0rq…I8X0ŁWHŔ‘  K°x| sK{.€@{Ö’×LeAÂ60#ć=µa@é°ˇm$ Fp%$ŕ8pĘ`ŃíĽDúÖ +µOŽ„b ˘˝ÇŰ[2‹ŠH‰ĺ­KDĹtň JuŠţŔ`˙É1Ř#ź„ ËG@ÖŞş8°’ný§źOŇ_@p< ŕĚü© TüÝŕŢ«€[„ţL’kĺ^Q l.@H…ż75gg{ZŚő´g{ @;€ˇŕŘ 9PlÔ ŰjgÇłc ľň1—V"’»ÍÇL‹jĺWć8ÖÂŰ€.ɆG pĐóÄ$€ňP—îk=…I8€€vűś f Ěĺŕ€8î¶«—Úď> Ľ= Ř(€xÖ713")ÚťĄW+sa o=Ç=jŢŢU&AÂÎÜżçŕţ€ć˙‹Ů GłÝ’rw—Ó$­űÜĎ –lëţˇr]bT7> ó¶q΢ťŇX `2`f`Ů–fĐ.€Ä®÷ŤÄŔ¶Ç=×(€Áü$ŔN¦ĄÁ#řČ5r8ć¶ő↋"˝nJĽÓuű¤µ%ĹŔjVmv8äSm#Ł©Ă90=P^‚ÄNKżŢ íŕ’W0Ř#P„Č^p—`Łĺ đąK±[błź~Ů>]ęč;ůÜčoYAŔ©xv-‘Ň8‚śHjsśdŚ( ”]ĎúF`ZŔ zőßFÚÁđ’MpÍëh˙ž‚ŘřŤŻ 0 `)€ÔÖ§p˙ýÜÇú¬_aH0’»°ď#ń\9µĐ™$0c2 É˝”Ë@işĂE Ŕ¤Ŕm§ô€=Ě'¶i/ ^_ ĂD=Ô€Ĺ5@%;€q9ł ŕ–d6Reç3u V8±¦ žrq °‹E` @K@|Ôx• 6徨Ś÷2 ÜŘPő-ď Őp“ńňÁňÓ­J*s¨ +ơżčł4‚±.@®gA6;OčÝőĆěN7˝ź=ŰSpĚ%]l$ ËW|¦šŚ|>ËÁĎd%đé>“ĺ˙šÎ­éTŚůą–¸küŘ^-E>ä—đĐm™‹P€°- ĘľrÎő赕óOĄĽ&߆а‡ á}ýňá©Q€/đÂ\‚ŤČІË÷“ׇ˝&¬F=Ňď :^ăŠ0$?ÎěB]ćˇَ4:¤›ŔDű] €FĄ|7®°˝żŃY,8¶•¶®@ÇŁű\¨éŻaČNŔ»űi=íßspż—!€ßŇt`Xh  ÔWrĽÜéVoŢ’¨–˘Š › źŐŘTµQiěWŽň™S@Ö_(Ž_ßđ$ę7ůQCGĄ%GČ›:Úg‹k »_Ů#8|QQV‚ÁëΠUKÄ)30 I –‹$Cl6 ßh”'Â… @÷(@ÚĹş<ś¨…ŤĚŚľ›S›NpžĎ†úLĎmĘžżáÍ'"¬ÎDČ·{´Ď×DŔWţ#v#@Ŕ.@hy†:±â¦®Ľ8¬S9pĽŘˇI_`ł3ďTŢ î˝Ź¨"Őř“Q€mč(€hęť±U):sń`YŚđĐ#huËOEba«ţŚ(«‰‡@z?{’sq»! _`đ…Ś‚gÍţCíp¶Ŕ“cɀ݉úř„H‚śÜ FK@9s&bf¶´ĘQóüćyĹîâ x“Äéć“ ×dZ´ŞÖ¸„i8€BüĆ\‚Ť 6@ÝxghčĆລ»ť Iîp’Ŕ`40ĺ\«gju¶iôî7ŕuw×ó¸` \Ťöď‰8€/ a 80;= ŘŇ ®ţÓ”ü⼀$] µcKA¤ĺݤô?.efD•ŢÔ‡VŢÔ©;USóTŔQ őPČř„d×č/Á K0n0P;€ĂŐ-׎- °X€-ÔRŚČ‰śŘ5SA ©!!€ňnJ«ěńâ×3“"l=`耥‚huŔSđ&j´¨ŰGO!P2ąĂ}ŇűŮť‡@c`ô0ô#ľ<`‘ůOT|qş±´úŚHÄţ‚Ąí3 jśŹTYâ h6Hݰ'  cď ŻoD$+^}ÎqhTńW˛ř‚Aćl(`–€=«·č˘¸ô·e€(Ýí$qKŁâY'`fDš§m™ü¨Ł´P"Öfz¨˘BF—,®)8€ěč·Ě SĐ‘€Ř„pI,.ü¸‡~ě ď÷­¸›é˙Ď|$Äýđ8€š` €\Ú±\áĘlŔTŰćcćDBšQ€9Řľˇ' wŕ袇ÚďZS`,®Y8€ÂR;€ˇíÚ 6ă? ·#€2aă$`nş!n™ j‚ŁŇ*—×čká—…źŘ®?l^oáVV,:Żâ§ť ¸g{ Ś2;€ˇ€ŘTŔŔc ŔÝÚ}Ć$.‚ v(Ă© 001Đcůö Łq%7 ·‹6‹F„\\aŔH–€Ă@8š á °k€şü/śHöśđ–OŔŕ™Qľ#¶ój`F`3ůtŹ´ŇÜ"@© xß–G k¦zí-HqÍÂŕĘ€_” ăY €™x¬MC ĆđuŠ0§Ş·ÂlŔ|T¶vçĂĺ Ŕś 0yN6ë(ă50 7Ë.Žř±ţňMWXĄî˘€Ĺ5đ;8âvCő ŘäŔĆţ®@Ě0PA!€Ň”“•fa&D•wo!˙ET ˙Ĺܨt#9€Fíy<Ü›?đUX@±.Ŕ @ěZŕ9`GuŔ€ÔŽŕ(@†äPçČ(@H&cćD•¶Ü ą¬ă¶¨d TÍ Ŕňą\rq…Y8€ß‹đs;Z›ŻNŞ!ÁČ6˙"Ędź€Jś7G|q †˘ý~`BŔĆúěž?ëXă,©Ëk<Ečźî·^âÓ`qÍÁp·ŕ+[`8ô Ą˝‡'8€†` ]€3ÔDŇŔ…ç9€ Ŕ”@ŔyC!Hąg‡¤ß{äč‰ëĺ=Í…yť}>`qMÁâäK® 0 : ŘRËHŕé(@H^ @ln,‡ ĄU.Ż!Đ×Â˙. ?€—Wď…9ÖřS§atěOüş"EŽĹš\ľ®z¨»Ř˙^ńćÄOĹ·ŕŇ`$đí…AJˇÇQ€‡@˛PcŠ% e|Ü/úĚâ·ÍÇL„O@*ľ†©_ő1?G8€Ż2cćű<řB xKëN<ýĚçâ óp0Ŕü ˇp8ŕ‰O@ƤŚź€ů1™‹ŕ9€)€Łx_ŠĆÝ’x32"€\ű Ś59ᤝ˛őŘɰ\ćôŃP’Ŕâš‚řńÇr|]€qŔÓ…AĆĺQ€j` ® @„99ݡ[iŕBÎóa0!¨É€f%ÎŞCśË» #p€Íř}Xú·ČÜsq[V’©§Ú˛¦ÉLŔ¶ŔPČňŕC@]p ů&ä €ç(@Ŕ>0+ ÂË}ˇ(‡zyuiÇbMć˙dÖ˙3]€ŰB$řŠŕ¦ă~·í†äBěokgÇ Ćäu85S¬wO"p~`R '˙Ő:BBH$ć6€öŻs IDATJa Č_Eܸ˙ŽÓÁŻ Í|˛ýÇÎĹ&á~€C/@Đŕ]‚%y¶˙ů. Ôjc?_„ąźLE{`J Ąş*ďBKW¤(F|§±&ç/ďÜëĺjödç`qMÁŔ0 ¶UU˙#@2čăČş”H­x€|pđl­0`łŤî k~źPâ$#CA"€˛.@9öŕ ńë牅+9@7€>ĄŔ@Ŕ@Wŕ´81 Ć/Ö%đT…¶‘AJ«\^C Ż…˙]~F@‹@ł}Ë"µ€uu”ÂHßCŠÝű‚@Î{z?{¶§ŕBá´?€aŔ˙÷ @' ŘŹŇw´¨ënĆŕş„`kńŰ śź†P®ŹmJM`j©¸Ú€w:Đ€żh  |Ş\\a f0„˙tŘ8ÎŚ@t6`öâOű&ÜŽ ’ŁďefEśĂŁ›d&€¦Ť1@B Ć_xíCíš<Ńü‹ÇÂâš¨Ř ˇ €†X–ÇFĐĐŚČŁ(ĚIŹAŞ• Ă€€Qőą…ă¤PQČ•Ž y(Ďů‹voŠĹ5Pł Cß|Ô Ź3‰ŚôŚH†@±ČäĘ@ł13"l>›|űĄ±ěE‚`ŢĘ8Ź@Aľţ?,@‡q5;€ˇ9€}·GśA? ¨§Ľ0Fŕ=ŐŐď-LÇL‰ ±ŐťŰIX-‚qx#ý Iu:ź€Ä@řBČđ9PWD6ďđ %`X‚H€1AŠ ŢĚĚ”ŕ˛bĄGĄZ`ÔąVŠ$żÍŔ(§ X\sp5;€‘ŕ8?Ů4FHX˘´R«˛++=_ý±ÍíKÂt`ĺlębm}˛t,EńŹ@˝űI8€ŞŔH€ TŔŕQż•F9dDVpe©ĆąÖ‰•ćc¦E†Ľ×h5c1 y)ÔŠĺ%ţ.ëT솊B—)đľoí…A˛y–ôXÔ ftÝX500#0Äť@‚ ̶źĹ,–G \/ď=˙P›˝¸ß“!W…@;2 ŽGde?(č[čňQÖhĹň@0)˛Ŕý”°yň ĽgoĺM Ŕ¤ŔâüÔ!!čj䏊?öé ö@¸zú5ř­˛Ľď“‹k ć`$Đ2vŮ ŕ´OŔn;Ń~†R«ŕ! .[čA`(0!(â+óLFŔ‰(ŚÁRő”ęôŤLş§ ·ívbv4©WżO,®)8€Ş?€‘WÚ«KéŔąl‚Ď{<8 Őť…C@_C Ż…˙]~JŔúíŽçzŔ2 p2"C1Ź@°qc ~vÖď%Äcr—†\áü$@Ő`$@°_Pţĺ ;€ŞČüq–ôĚ0ś‚®’đÓ1s"KćeĎžâÇŔ€/Ú8~oM ÷űŠ%{YČĹfáŠŔoĚŔPе6 SFXĺ± ó@†ŻŔ{öVŢĆL‰PŽŐň`íŔ cŔ@€đ MĐŮŕ©^°¸ćŕ*vC@BľÇř);€†‚($`aÄÚ€ĺč#Ŕ``NP-Uű€ `©z‚Ť¶č“ëĐďlŔâš‚¨Ů ť‚†ÖĘ@cGĽ§í'!K5¦q žßčkôµđżËÂωślÁŮ/*SĹđ”2-“zŇ>ÁT·ź«†ă‡Ł äś@;€ďżuŻ đ,pĐxp }ÚP¶ŹŮˇ )9€é€i€±03ďŁ]eěSeË#ÚďŔ7ôŹ\ľÜĐ6PěľŔP mŔëç(;€h č‘P ‡m>ŕ'Bv9ÓHŠ5¤ N’Âđ?Ůd ,®98€Öx  rfÔŤ§}6Fdű™—G @ýdpžÎL‹|‹öżÁţ;â¨Ůţţ&sŔŕKÚŚ„¦Ŕłłëˇj Hž ęá < €©€i€ç§űHи˛Źŕhô2 _ÎO‹ölOÁ<°.Ŕó`ělŔT‰ Ö,Ű| ŔĽ@QLŇ ŚOΖÂři@…řŁX2CY(tů Ż™ ŕ)ŕksćcfD˘( !¶#XF:j)Ś\ŻcR ´¸ćŕ`yđ/á`$čY8¶6Ŕ´` ŔUkľ€¬\+ôŢbj}Ů_Đ#ź„8ż.€¬Ó€®ŐÝ2r.@šΩBópżO ´ N!€5€ńňż8Z@c6PsŔ'­ŐŤ¬ xZ*íía9RĹ×mA,%Xöä]GŔ1ź „ř¸ÝŠÄłą˙›P[§˙ŇŢĎţ=pn] čGtC> ?ŁŁqá‰OІ˝}}(ĎrYŤ:lŔĺž{ř­9±`çNxşÝ.QţDÜ3a2 üţŐż.€¬ŇŹ€ˇŁ)ô¬ @¬Hú{Ňéđ"Öü¬`ĽćTő¤ĐvAt`)Ôčí:pٰâŞŢĎDĚćvCCW/ ň Hŕ™0ĆÚ€óŞ€ŔU×űn_C6Ąç¤ ęŔÖ!inŚ´¸‚†ćáJŕűáş—ŠuŇ(@]4F|Öj%ců ˙ ŔSÝÇ‚|´ô¶ éP,oéŐQCMXvr@ €Höß®řës‰ě[@Öé‡@7X^…"éĎőîcŰyńzđ¦@[˙-ľ.WmţÍń«ăŻ—żÂ#P·@˙]ćüaű z@,đHÜů[Ď!€†™ĺµ×ĺăŰ·oŹ-ôúP›y9a»ż¬ŹŹý(%ô„‡˙6A`3˙t ęĽ?€nđ7ń@\‚1CŔ)j€G8Ę„PŔ.˙t^(XŢ`…Č^ćö±ż..µěWŤę;ÁyFň˙´` [*;€ˇŔź™ ¸c€őôßa@3ÝŔÇ#ŕ= Ŕű-łX›#ůĆÁJ4µş`üŐŔ€‡öw4Đż.€¬ÓO€.°äaŔ'B­Z-†%`‹|Ć=ŢîäăŰÇ®ŽžłţŘŻdŢl ¸wîoëceBKşóçGÎę1@~IŃ6 řúßUoÄAeF ç@ń (üŚ THŔ2 đX˛¨0 úŚíX~ĂPç¦ 7Čő{@`Łö(ľ!ăjf€0ř zš…€u¸W`Ă#Đ• w6ŕˇ%ü{°9€ü”YS§TÖh€Šn:6;•{x;H™!‡˙ř¨žUfÚ4ěç˙y=MĂÔü ˝ŁĎ†s|ń ŚŹqŐ ]RioŹ !Ů2&đ˛:Ő,ęÝ ~Źmč8Ćj2Ä8€źK¤÷łOÁŔşĘ`$č˛p€˝ďżńŔ–÷7‘7رEś¬i[,†˝Ć}.ëőTÉűvôÄZ[v]ńh( •Ń[€yü„N˘ëŃŇ%z@ ˝ŮúÓë ~ZŹ@{ć§ŕ:×Uú9@@\݇áł4oJ®7ňCʧŁë*ŃPĺ Żf~ň¸^óŘOýň[>âá@‰vxŹ…ôďF~’0ŕ—2÷!­;mţĄ ¤ĐĺHüőZ÷¶ś†¨Ř ]Ŕš„řÓ­ëşĺ˙ř˝¸őžs·oçźýx> ?÷»R¨v, ?enVŃ0ú-ˇCĐŤ"řÇňn+€¤;ŞF˙gA1¤•údßp}H ř|«Ź@ę`ßëh b0ôÚléçsÝá’[ăˇmW÷í-ýě168ZNĆŤjĐţÔÚ€Ĺ'ŕY€+€€nţ†:ˇŕ„|ě–ŽŃCĽäÔ‰IĎrYťę ŻŔ¬@Mµ¤;r‰ŕ…„đGĘ4ˇ8Č@ µ‡ÚFzň“p}ëřk@§ŔłuÁ.ÍźQ´wp°&QO?{HRżlřł‰µ)xPs‚ZĐCí ÄŔsI`ăëąĺy‹]üąKę.¬·<$%Ň)~`˙¤TZ/`đ^ @€éŔµ—ĎGő¸rĐ=Ëu8QŹG ňs;‹†yÚ3?~Ź˘¶®QŞ{]€«@pź ĘđŽbŮoQěY/Ě@Ô ¬ä'®†Žµ=Ô?欗H‰AăHÓO~nö1~¶—x7( "ÖĂס:ĐPąHr!őxzP ö4 ¤äł|[ëř‹@§Ŕ.Çiλ&Ř;ví4ň+üěq6…š@…  @^d9Ű °!ăřüęR›ŻEĂ ř„BKd{i@ÎTô`ż|.ôö¸ź±ý„G ?‰zš†ĐA{ştÚ¬ ÂąU‡­¨¶ň׬VŤÖ¦°9Âř˛8čăBÄ˙7ĐIś…(Ň Çđ@(;m-o çqNP(ĘŇ,\Zňk‰î("¨Ń[lç@?ap"ä ç'áŇÂ@_°<Đ—µ.€żPpHĆŽę8ŕî9ßÇ–Ô÷ß-?EgŘAű`ëÄtŕSr»Ľ†ČRn Ń ŘáVäŽyu B`¶.«SÝ!q9…ć(ç˙¬†^ŤZ]„´ ĄÔăčŕŻď0ŮýV\Żz]€ë@§G •ÖÖ˙ĚżĐyIäĹçÂ~Ö&б6 ÇaŔł«ßr7ĐŘ$ł€„ő=%ý3ţ'NqďF„kRY6ľaňŁ Ť|Î#4ăů»whďobđűo0@­ ŕ/ Ô=}:xřri `űϨ ˛b¸Ç͌ᇠă .©gm@‡qIh+€Ŕ$!ĐWŘÖŮ §Č…¤WżŮ< dŞŚ€”t¤ µD*E cĐCŤ “qÔ%`4Pë t ĺd‰Ňž«Đgššç>aˇâĘęK˘ *©B°8ÎXš UdőŤ\Šĺ ĐĄąČˇ>N*JĐYĘ`ßöË„G€P_z]QqŻš$ hß&5b‡ ź‹ Í±¤š% }J¸şý€:›ĎŚ=üć’"-­uޡď·\Cpxł V¦ @AĄá«Jń 5ŕäiĘĆQ€üzZ°g{ ŕw4Ś_j]€ ×pQ @sX}–źąÓŕVě( €ČoJ Ř€hć÷]áÍ@ôk`´>9d¬ŹŇ}÷Wđ4 f€ű×o»ëů˝@/%ăV~ Ô™5žŰO„’× ŕ@( ˙„1áý€hIXÔi¤ť'#Ń_ö –'<u‡1©’É›Óp_ŃPţú.=…Ŕ@‡ Gáhm@ Mx·˙-Ů=ř,—Ő©îpÄ PŰŞ÷Ůţ‚ü$@Zűr]?čč `µíŞżČ«U=´×LŹ é¤n?t:Gx/` @đ-Ź@ĺ¸ÝKspR^Áöˇbţâ <9 đL ëŚB/ jŤ 1|ýNškÂá¬[ČęŔó*€ @ /Ô”áĹÚç źŃdŔĎĄr…›… ÁPŹ@cEÇŁ‚BnW¨„VłFŃp°6`@Íć»Ë;»@~; ěÁᇲ:ĽLÍń>ͱQ€ź×#Đ4ŔďűgS ď|]€A !€.Ŕ^ÔO†–ĽÔGĘOĚÂç/ŕ0(Űî@„6ŐÇč’B2ŢIŹ@üLŻ-đßdmŔ?ľ3𝯠ŕÇ€„¡wňÝ>iô–Ľ4Öb®‘€Ŕ/`F’P xüQ?¨p=ĺŞ=@ĹěötŁG»^ŃXŹ@{¶§ŕ~/ŕ4@F¸8Ŕ‚?´•WÍ>mtkâáÜŤ ^Ż!#$$Î^¨éř¨µgůë"<ਜąe@pµ‚kú`°G Y8€ßŃ (ą˘ëڰˇµfÚ°se Îc¬†Ľ´ÖL\@É]÷â0B!+€wâ]i˙)6ź_m €ş=ń3¸scëÓ0Ö#Đ4€ś @= t § °8)ëësŤ˝!/6Ŕ,ÚŠŐÉ/ š€&ňŞńŘś uÓĺč­˝ˇę]‚Áü4@ćżSŕoC@×(@ěÜ?!üř±˙ßż÷Ťýk˙ů3ý„éȲ±oťäöl.ř”É‚âęö~VđnŔŽmä EóŃhNDŠŁąbv{Ş!€şŹő´g{ŕ I€ßĐ`(đą е:đʇBĆuyiŻ óľćj‡  ˇŻŢđY.«SÝ!ȵÓől@!çE9č!Ł!Á…q Fo¦G ó `°G y8€ďdŕ‹t¤ü^B&ć<ˇÂYŕqmŔĚxe~!;xj)%9€ Żż0v‹BfĚŇ+ˡŰ#ĐC€¦{YŽř"ĆŔd2ĐH@íę]€ĎÔxśđžx.sÚR.Äd j’ď ř,—Ő©î`rĚKJłY0ŇŘ«¬+ĆRَ×#˙‘÷#ţŔ6@” 7@q]?°Q€QŕÔ(Ŕž×Ĺ3ÖX!î/P ľĚ” ÖfÔOŐmřµ†PÖô ÔĘ_s <Ç|vŔ©Q€"Ô,ăbż‚ňbs,ďPýrý†Čs|–gŞŃcˇ6°6îŻ ĄŘŐ Ťó†@ĘüňáÉQ° v@ďl@ÖŕBľ­l_j€‡8€ôśŔ ¨űĽîĹ/P ŢD(âtäß u !ąŁąVţ´`ŕ÷˙ż$ş|.Hßxß@ž>; Š)0ĐýâBŐ€*F T{Ęl§ćţ ü, v#ő Ř‹”¸µŔYż9€&ŠĹíý/`0/-{,"ĐčúAŚä»>ŚIµxÚł=đťŰ ľs:p0  ŔŁ<ď!Ő·uáĂÜőěľ5ŕł\V§şCsu` zŰYw9° îř+xš‰@Kâ`$=Aܸ1  Ŕůąś@ŻŔŮéí/P X4użđ}gŕs¤?ń(ŔD@™ ÄíF€^ź€Í.ŔzŁ,€ŤňRá¨)@Şqë/ŕ(Ž8ÚŽ/‹úżŘ––ŇŕçRąÂůY8Ňú3;€‘ éŔÍŮ€Ď €“±L ź ô 4‚‰ęo߲2ř>Ó~ŹüĽöĚOÂ| ¬ 0ř˙~u"€†8BgG¨SФ ĘýBÁF®üńN<Ý\` »ćËv*˘snęÄÁCuDz ” 7 P†ŔPţÓád9¸ě™ź€ĺŃK‡s ż@+Řv*Đü&ÉŻ0żä źń´u*€±&âčt@n 8 „ü SŕMűŐ)#€sŁ đÉżě:C{]€Z1H»ż–+E€Âř^Ź@·r”Îh<Ô6Ä!H®p~ŕw:Ŕ트^p:đŃl@@ÚÖ·n·ŹP€. ň 4mP÷[´Q …ô—yĘGoŤ9@䡶! `2€ 2;€Ŕ—éŔÝŕ„Xo?ś €yĐ7Ń«â»>ËeuŞ;4,kăx‹Ś ě„áaŹ@ú§őP‘ąÂÍĂ™@Ě ëő ‡ ‡Î#w;ĎěśgB€z~!€vhʏŇt;¶Ď0=l•5Ŕ@SŻG ŔXŹ@3q¶ŔH@‚ @nxÄ#pŕ}ţBˇ‚Úq\{96ȇaŁp Fo lĺĐI0Ň#źŽ0üDq|X^Š|ô H˙‹č ć(@ýsTľ­ľ˝.'© ÔxÔΓ°˙ßÉ C{¶'â´ŔP€sF €5!€łsČĘ@IßÁ0ŕú „ŁŐc°‡ú5OČ•‚5”ŁáĐ#Pţ˘ŁLCÔ Żľ2ä 7  XţĽ5®Y>ËśóäS Đ熸ż8€Đŕś)ăőQ;vI¬fäđŔ\€Ţ÷ó7™ đGŰ` čZhą4䥅ňÔ¸ź”ĺoR!ç}m(ÇăĺđÓßý=BĽŔY>MšcBcdEsÖ#ĐVďoâŕŔ`  >Űŕđâ(c~f€xxC- Ęľrśë{6 îi0Ż7 §c0 «çYp‚Óű›řlŰ Ä¨Ů¤>ÖXee Ě„°ćZ÷"€RľWŘŢßndM,l𱣼mÝ  ŽśléůŹĹţ«¸ 9żš¸<üM|ţŢ´ppß­Wę×!€X*śŔu~b°Kdňśä§j¨ÁťsjZ Á‰uÎ#Đą¸˝1Ď…B:ÍĂÔíFćđrđĚ(aŇd }]€ź`Źź6ňiă‘Ř´ŔŘ]ÁD8¨†öMÎOň|üĆĽĆ#ĐĹ+Üd€µ.Ŕ €>}}.@Rţ/  ţţR^Ś„Ł.  8áĐ><î™’&l”ôHŹ@— ë2%`Ű ý†@÷zđ ¨"ÁéĽDž3ŕłlu€Q|ş °m ô†Ş% hßëB-„¤ZĐjâ5.*Ňű™‰¨Ú 3rť‚ćÎâ_0Ŕ 68€  ‰8Ú7ÉýŰ·Hť G†zZ/Q%ÎÇÔěĆÂL~‚xhu`ňq2PLáçEŞń'ŁŰÁ(Ŕ ;x ¬%gN‹˝á4˘.śřĄiřŚÓ„?R±ź¶áŹ}OfDAMÉču†‚ęőZ;ďó\˘ÂRĚźĽ8T,…mŹ* D Lšc6ŕ–÷žVźKěÉÜîż—|rާäĚuĆđ 's5»OŘ<6 € @î›ü”Ł/-K@5Â/đ=…8čg›a*„ŕvôňä‹Ř‹Ś•dü™d>W¸‰8€ŠŔ@>›ŁË“ŕäęŔ¸4XM–Jî8 őuĚ" "^?OOv{’Ł™O=Ôý^·{ ŃŠś %•ů8Ű`$ µ¨‡ÖĘ@ ů î/pŽ|ʦPŤí~cp1=ĺ ˝]§v `ÉVÍ´˙Ŕ(ůI9ą.Ŕ@ŕ{8€ôĘ^ćČÇąL…Ą2ű…CĹ' ©ú2 »pŃĎw<9Î@”“â¸9Ă3şŁĆ›“0Ö † gÂ/Đ:üđ~°ÎÜłŹ. Ź@Üśá™ŕ׬.i˙ńIr…›0톀îQ€×"ď)ëüB‡ˇÂ,ĐpóF~ˇ{Ćz@NÇur4Ťňt] ÜKţy€çč·ĚČvC8"źł¬«€úĘ@Eóy(ą\ýLE IDAT_ŕ `5¤vÉâÍt‚ŽS¶ÝbX ¤Č(@ŕ^qrĂ“/ěÖ劀O‘+śźŽŕvCCŐ.€{á(@,®Âj–€“†Ů€lőŔź€. 3bFŁ-Oyę~¨Č˙ <ŰČyź’0ýŚ'Ŕ«FBö Ś €란˛— ‚€ ŽţíŐ5pyđk Ąś N<üÄ€ô0°Ů€“ \¤č©Tr jnž·Ů€-=’ésü¨«Ĺ•GˇÎy:XexřĂšÁÜÉśŹ0üŚ ĺúG|&‘@v’s3a)~Ü'EëS ż(¸Ě"aŠťč€Ťô°ÖµPo I@ćÓű™‰°ýڎwqĐ×yK@děQ€)>»Vľĺ#ŢÓ5—ÓŢÁ’Üá-§CËbÔýŇŇ#ë—ý¸Ď=Đ#÷|¸ý‡GËfJ@Ű '8€l ¸·ëýŻLź¦+;ŐÚépŁEđŹĺÝVZsČ0#XŔóř396Ä»ŤÎ*ô`®}ôÜCí·LbŇőşT«˝2Ű)¤÷3`Ú lyđ.KŔ´ęwÇ_”˙‡ě|ź2ˇŔP–UÚqÔnRn~oĚă\ë[(8!řÇxĽđ@̇äË—„;!”Âü¬7žĄ(¤Âß©._üP LŠáá)ÔĘqßšŹ¨Ř çGz1@ŇçG"ÁŻG’ ŰŹVT»Ç+o·tâ®řw±ŢőBjđŁrŘ5ÂMű'ćéZ!=>ËeuŞ;t­Ěd‚;‚»Lzč1'8ďŮ:ľ0ŕi4Ĺź&ÜVľÔyü7jź›PëŚt+€Sáü\€Ŕ‚DVpáv)uBâRü$d4Ź?t'Čů˘qËů¶ě´'PăúĘ9g†Cra„Ŕ™ tĹd ÇďG›’°Ö8®uÖ¦O@Mp/íb x:<˛:0gL;€pŠH8Ź&ě/D Cy®hßmZ ;ô–`őP9oW ź‡bŃ€PŰÓ DKŔlŃD\śő"˘ľXČĹ5`ŰŚ—‡A ËI "ÎhŻŔ)l @€f?5ÝďsÉqÚütŤ:@ÁP67j«Łz…ĐđtąHÓóíeűv8 0`Ż p\í¬M»zŞhvPžĂ'ţ¶°W¦ €´e¶0QÔS:Đ~ß@˘6óŞ  Z ©_ËŔÖeuŞ;X€5‚TvĹ!ľa0„Ćhĺčz°.ŔeşHś"xw‡>×d€X`$@p ŕ§ţŔ'ůÖ©*ę)›–€DOEÁJ×€Đî„Üš_ěB¶(Íü.ţ‰÷Ň(źŰ!ŔÜŔ ÄXą˘/(B-KĄ0ŇX@ŞËđu p×˙+ ˙ł@Ă| Sr†ŔAx $ŕótîĆ{,’}Ş7P®iô%m@oŘ@ŁÓŽ™”gĂ´Ŕ„\¤j=€ü+˘9†‚@׍řőł<îŚ tÄŻ\\q¶ŔHÎ, †ŇOÚřOőŞâ Đ JŹ>•Fm §‚˛[năQŮdŽŕű- đS ¦d'ż¤nč÷tÁKő˛»@:ü1Ňď|€ipXí¬M»zŃ28Z@W‰Vő±®i)eÂÂ1 Ę,*­&@téO€Ž€}˘-Ř»ŕ‚Ş~-O€[—Ő©îPE5)§ĺČ·,q'Ąv@eÖü\ˇVrăVUj }&ć¸ŔPŕh…O‡ß:|:E7Cm.J,·Ŕ°uŢáµa6ŔËB÷úŐd?Ř7žmŢÍ8¬ô€ č'źt.€µ.@+< „#˛y˙M{y+§Ë϶čĐĐ–% g”@®Ýg¦%˝0ŕł\SˇÎ„š% h˙)řŻ“c×XńÜk<aËýlűĎRHďg&Ŕ´ (h¬ pkë¶±uMľĹ*Ů5nŻűĎĆ/<*´:(=zf0} ¨’Ô˘a`6…ýťşÚ)ÚCĹ#Đłó«cěíÂäg­í÷ĺŞ5PńЬlÖ¦])Íh˝^ďr˝®kŮŘv]°&Qßv°î ˙ÜUEüÚaÂ}sY›J@"ôĐa'v ĚŽ9ą·‡IŔŠliłH0”ĹBOBBŔ–Śô@µTŮęęĐç(‹ w ô~öďÉ8é Ů°÷éÚ¸#€ŻžąQ´ăŇ걕OĘ`Ůb›ż®řo1ʶq×÷Ă[Řł)@íúd,-$˙ʨĐ‚ô9€Ů™·¤7źX­<“*C/č.4ŰĎŹüŹ@§ú/aJŕśŔÓŔGőŞ/,ć2iĎ-ý,`MÂżly+ď¤OÜéG>ŽŚĆëÁä´­î nţA…Q,Üžž"8ś<Ľ%S“ KôňV‰+éŃŇôbŹ@=JţÖÓ”í\á&âNŰ< z×HBž‡cöFý3AĎ%Âýmoú—LlYY$°š¤ µ•č~*3‰.+˛KĂlŁ˘î-üÂĺˤ´eČP #jČ1ĄsŰŃ ”ŔŚsÎÚ<şHŔÔqÚ"řą¸Ř»Źkőě[źIňă鍴űkä ł8…|™\TĆĄ Ŕ/ŻŔ*Ř€Ťî[ żc˘ăÄ/˝hôpŰŘD€˛őđëđ–<ńźF0°żÄéýěß“qÝvĎź9€ć K„ß[ü^“toűÁuďݸżŃ.ŔĘşg8€ČE0€Řôą+0ťlîiÓ¨».GTGd)"Ú8Ödňźëös `×˙Ů 8ýÄ™·CţO°ęELÉś±¸řb Ü$׺ň.*‚„ëăˇÄřoŃ0 c4 ŕ$FÄЉK€­®îŢÇL‡¸8pQŕP™éI˝'8Ünq>ŔíńYĹ#ÓA<®3ž0˝ź™8€“vh[î}€üúŔÚ÷NŻQ?Ü1˙úIÍcěUŰË`Ď  Úś],sňl@˙7ő Ě„Â-˘QÔą“§ŚîAą0€Řŕßč„Ŕ‡ç& hÝgp5­϶€8ř¸óqç쮾s:0•÷OÖ<¸Ď(óźIî?SĆZ?ym±‚˝.€' Ř8DľäąntŁţ±ĽŰ @kfD«Ő˙gˇHŚV n1´»ÔgôDüÜňźÔŰ $_€ń~·Řűż €ŠvÇŇűŮż'ă:í®!N&Żr%SřĚ˙®¨„Ď5G;^Сb H°č[Ś2čĐďN@“' t"zM‡Nóýă±[ňöŻűýw‡ Äťpő–ik^eXşÉŽÉľlÚ50 Ć„V…Ř\­üŢäŕsÜÖĄcb°đ_(pOjNfäúí.ČěŽ^)´é‚f-|’üOłŰh{m@ŕztb·ł˘î<0}YŢ“XÇ˝?@čń+€ ę(¤ŕřfŞcÂL>ŇĆ*’Ýü“ô €Eý"°,t}¤Ş`űá8ep  –€@ކ†]UŠ…ËÔČQ™X–€Śviîá9ŕzŻŔ~AçE˛LE‹ÎĘÔ©‹ÚN›Ą0ŇX@ŞËS·§@"–,ůktv«Ö*ÓţĎéçŹ8cp đ=ÓůŰĐUű yz6`€±%f l?íXŠ8†ň@ľÂ·Ŕ¬ TÇ´ô"7ęýeć0^T÷„nÁnY <‡ö°F`YŠ@˝ý·«WX\“q]v×€PěšĂ€#9€2ÄFůP tůˇĹ§^ý±Ľ‡r `(ĘL*ÚŮA'c€"˘WóÂóP*ëGë…sĘ-P•MÉôÚ\|!÷ťĆ =ę<"É"4îaŻł)€@Żcrł|Đ^ýC^-ĎŔŚ膾AÓ46Ýý7Ö@-#őţżęźęą¸&âNŘ\Čş]ŢÔ§’”(řňëzŔ^€uŔ'Ô) ř«˝ÚL‰¬—Ď[D‰›%ŚfĺGőČţ Ź>„ăVDÔ;ŮŔo|ÄçôŰ\<]´«  ťFëęQicě ěŔüC&·‡ž»CŰ’÷Šđ3 €Ĺdüti‘ţ-wŸWz˘ţZJą7žqb Ăŕ*z†ĎąŻřŻ–•By:0µ qIĐ €3Y{„" !Đh°x¬ Đ}­F80#0Ė˵wZjěÂsEа0ZuńŃ`ęYU6An.¶’ 9<%ĐgpŔuĽď]ěPę)sqĐAÜ˘× +~mşëa& R]´sĽ¶Ł‚{ÎL‰I@.ç–ě“Ţb‡¸ oj¸G ž7ł˙ď¨*K„/t2óą¸&âşí.á?8¨m čYőGoפż,PMZ[Ţđŕ@!€z~ߦC1€…ȵĄ ř4`Ůń}Đ´Ł=9’Ź”Ď4żv> ×ŕ:¨WŕĂ•P¨?…XF`‹„-mPC¨îj*ŞńŐAÜ\»zö}&ŕł\V§şĂáęŔŞ•çęTşNd) ÷dĺĂjüé#ěßźŞíAő…n2ŕĐŕ:ŕűĽ“E~Ô:ˇ˛ůW€ĺČÓ)2¶.L&C’¨u虀› ‚_ťĺ žúEŚŚTžGeWt$&ť Đcp! @hvîáóÇŹâ˙ýűŮ űl§Ăpŕţ}ž‹ĚjÔĺKňD}MfAfűϧią’HŰńSx`÷ Üđ­łď%-ľ‚A`Ĺ#PĹ˝öLéýĚÄtÚ\Bq Úč¸Ěüx(ÜÎ!Ě8¸B9żÍ+đˇĘ‘ŁÉžńĹÁ7íL`ë–m}‰€ŮŹ@¶”?¨Bś °űZłŘŰ“Ś§X9aLČľ5Đgp% ^ýáâ Ź)w{€` €/naĂ»ĽÝó„ĎrYŤ:DQ‹É@ag”źVElř1'8…n·â(MHó‚Î:‚z NÜátŕO㦰ÂMĆŘ\ ¨WŕŁ.ŔŁ j€sŁś¨Í2Đć÷ ÷ćí`$ m˙HĂXéPy'Ü€b@Ź@E°™Ŕ7>-đ”DĄ;E©ż•EÂăřŔň~¦äŽí.ˇÇ0’€Ëă`=Ĺą2Đn”łÁ˝˙ "oEągB^ĹĺÔ!×ćłÎCy0ÄpŔ}÷KTĚVińwÉżŮ$€îßětz?3q]v—€ó]Éń§°Ĺ¶>~žDŮ@5Î ô!€)€.Ă nź_(%óęś%9j€x1€zŕ9őá2`űΊĺo~š¸;Đcp-   Ż ଡďŰ~:*©N#OírµŽWâ°)S0“„Š% PDƱŻT‚ŃZX`», u’nm‘łVĹÉô~öďÉ8€¦Ŕµ€vÚ‹‚X­â»+€ű×]ÜUA ëF@=¨Qjŕ“’¸s‡É¶21=^cRŠś8˘ŕÜ=58€íA€uÇ3·´&€ěhżô©ĄňÂQ€=ŰqGvß98ŽäĺÝČü®tçź"€ş 8XȧQq1µ`ľ•Ý–\şoa|ă, Ť*G$0FŠ.8%QK6Hż»‘Ü©ő*Uxaŕfä:ě.li°Úd G»UPS§Ú”ŕ0n‡üb$âađ…I·%I7 ĄHr8ś đ¸Y”_¬Ő%tťť‰ Xö÷0plp5H–€!!¸ŁŮ€Ź)€‡8Ćř˛4ő \“_ Ú÷÷%Ő/fţđÖ^‹;đćšţvCkŐj§˛Ě3Ëź›ÇKďg˙žŚhŘ\ ÂpmŔ¦O@B™ż;xĽ1LÇRŇ…xČFŢxGôGކ۷ŔiăBy„@i±Jí•ăSrm;€Ë@čYćő= jP¶<ř/Ŕ•·"Ö$˘Ë‘€0*O!v¤pyđ‚¸dřĄ˘Ó*g,0php9đ¸6`hw–!´ ŐăĘÁ/Ŕ@­0Ď+ěŻ(‚Ľoˇĺ¨~¦÷Ńä+·ÚµÜ˝#ç¸*uď_ÎÇŮ\Đ-xly ŕI ^«vX”Ö·CŻŔµĘň‹ŕ9aͧčP¤ěXTˇ’e›ü%Ľš$މ€=edžŮz1›%N‚ŇűŮż'ăŞv×€.KXµxÖŔű˘ŇIÜyĂ„ €XPôęMZŔŔš($űůöądě"~N—]™E ;ÉxUÍ-?ˇŔ@×ěł|Á(@Y¨€7(łü†g ŰŰóeÖ‡”«UóbVsi1l’´řBP5 pa¨wUęa5ťýÍĹŘ d6`˝řÜ+9°`Ęěc A{°ĺ|MƤl1P,ź:[ĄÚEc ÍkŃ6ńÝ­*Ü#}îëĹ?(ý'óeł¦™ŢOfś жŔ`481 ŕ“@@Ŕgź€ëňńíŰ·sQŕ$ďaÂö-ć«©(^ölí `iт›vA˘sç ˛©ÍĘ6 #UťwYôOgüđé‹Řݧ„O‹ž‘¨ŘŚÉ+°ď°<Źä˛€G °ËŮ·Ůíţň>vQĂçxu¨0Űýeí ňö™RhDbżLGd)Šś9€Ď…}0íχ>śÁsvžĚ–_`‹’¨Ű ˇ €†Ŕ’@xÉ(@K@2Ř“®ľ#€˝Foőlľ)ܱöŽŢť v`»bč\´ďe BfÝ劉„G _Ŕ'čČ ÝSzOšńj}2r)Źď»H¬0в|ź%ŕëçP 6,…Ě~rLyX5_1ŘcŮĐÁ-†`éć"ĘŢŤö›%z˛ý—=‘K+?"Ó–– ¬p“q¦Ŕ%`ŻC#óWr!›#ň0ŕ¬"6iľ`°l‡e§xRâä1~MÓ#ĚĄ\ş‰F¤j˘OŁ/Ę‹üN: f0t-şDđů˛Q€Ô ¦u‡uĺďzEËě-Ą‰ÜůMČU…E¦Űď˛qľýŻ<ˇ<}¤_T^hŘ ”h.Ž@ ú¶ŞŁŔ ěJĆÜş¸ ˙ň`ő»n_»óZśâC<.Rä© 8ĂRe i ˘iŤSÁŃ ąŇ ;ÁP[Žfܵ2?P·|ďňŕe6ŕ™WńĐ(@d @î\0–ü÷ ĽÎs] ›N«Ś@ţXŃ„Ę@ňŁ=€Ú•ě(ÇůV;źŹ[*Ül€a0 |črRÉ˝‰ B>r”HĂ€÷ć˙óńöddxĽ†_uół§” ’SĐL9Ĺ: ¨R( ~ł€ĽG;$Ź,ßg_‚‚Sr¶Ŕ0ŔŔ‘v÷fýĎn·Ľ±–č§ ÎŻ °s|r+ĐÉţ>Y…ő_ýÎ ľEwśe׸[¨x:Ys'[roEy H­ÁÎĐfóÝîť™9€ŞŔ0@@źŔ®ţ˝˙í#ÍikňË@đžs` &­S†7ćëřÖ(¬±×I8s—_Uv˛(B)EÉ›zĆŃ :›ú-ďÍsEnĹ"±ÇtäÜ|@Í`čźěí˙z PEČ4jice Ě€?€_ádŕÍ:ÖăťoúSiW‰j ŁąIt±HI<Ě6»…“Ů2“Ô˛23e3W8? ěĆtf*°›šH@Ź<Ęp řR’3*UŰ_{óĘťÍv*Wł-YcGAuK aÄIP}6 UMT—9I>Ëţ3%`Ů ‘.ŔŽű˙Ľýë_˙ú3őŠ@+Ô?7ÁÔD!€@Fŕ0«sý˝5cµ;Óú®EźĹŔ3 Ů/ćHÔ¸ JÚ0bďćLpVx[nk]ÇrÁwěaÜŚ@Ĺ` .ÁÎv’ ]b#ôçs€©®ţflţ—93&»Đ ŁU˛ĎŚ–+؇R*A^#2q&ëb‡˙Ú:@<­ÓŰb>Ŕ¶ Cń  qůű‚ěcľř檉]ŕ@ á›Ň^’Q’Ú×pšś $Ą’e …”¦p Éšő¤¸Íp„©ÍčfúťŹhŘ §ćřń#ńąźo"äę)/ß—µ ąĄwô´›}pZo_~s–ŮQ^ó‚7ă9ľĂToí­řPD‰ĐŇm=U n©B–Ř Až"䜌°ě€@é4†˙«[×2ý˙  –ł‰ĄÂ€IŔňľ@ĺľŘZę6Ó))pęB•ŚëG˙G IDATĽ™ăz˙ÍíO¬@°€ŐMőÜĘŰËhN<f†É7křeî„:áúlJ b0 ĐŐű,+ËPąĆ_×\€{ŰA˙<âăŐ w†7őÔ˝Ť|ŘŔ Ä–ÝŮ™÷ˇűŽ‘€§›8Ł ˙Ĺ••ëu ŐˇĺÝ~LÄÔíF\¸E§ĂŕňźF#8Éĺ™ţhDáűĄ7'ÁŹŇFÓB¦ K= „ČhJ1 ôşĹŻČł}7Ťß“6đ2ľăb%ERŘ˙çăŞvĂ@ZŘźŕN‡ŁQŤü€‰»o ˝Ł kd…Ě q4Žu#’@Ň P“čl@~‰ŃÍö_7ÖN\ÉSć`ç.e7ŕeJ@Ű tqĐć\€eě/– gĘ\€YÂAŐ{Éý%$m5‰ąČNlU u9 ”íĂN^H¶×TĄÔŰngĺHdĚ©ž’ł’Qńö0%`ÚŚŔt €ĺ)P΄vĆŢş€íŔ;WŹÖD_±€ý ßóç«ýf2‰ŔŘřvűo=y€¦žrÍ”Ť%âe0Pł%`]ÎÜS]€“ ŞeĆDł™ţřĽüćD>čŃrÎ’˛«$}ˇŇŁÓ‘íţB/îĐaŔŕY”¤ÁTĺöV‚Ć3cŠÎLo8ă\€ŠŔ@ŕ» ˛p·ô·Ţ܉ż{쓣~á Ŕ„`yřoŐíu°ŤBT&ô¤ż4@]ÚbőR )°aç„މhY˛ŤÂŻ ch Cň őAF~:@Ú č°=ÜîŠXЧ9hý‰C™Âűdß™rhoƖʉ•ůVK­P?ŐűFááŻÇţěÖ,Ý/DBµL¨RĺűĽŮv49SÉÄ_$3†T=€jŃóś¶z2göłč÷ĂS"o*~e0`ŰŚtqĐŁ.ŔÍ˙ ő”M€1úpőZ=úĆĺ×ÎZ „HÉJ4`´˙ 8ş2"h4˙†¶Rwâ/’SWkµ…×ó癏0í†äÚsn”{ŠŁžrĹ€2s[ľ8ŘÂâdĺ®ŕ˘ś¸ĐŮi©‘·†Ę”¦t-,}µĂ/Ĺĉčř]Ő­ëpĆR*26ÍLF~:€Ű "€c9ű<ŚaN+p !ÎĚĹ`#ř ń~#ZE†LÍŔZ˘ŁqśĎ]PÝ\TIŐzëé­1„§$ź)^5%Pő0řl x4ŕÉĐĆÄžd±°űĺŹ>Îëď,_j:߆ԡ2ž]ÄY«˝5 }úňĹ !€şú0‚nźŤĽ(;3W]Ş!#€‰8€–?€1 ü˝·HŔRVďżi6đ·lᣠ82 €ąŔűBC’K„ňCA1¤-¸Ő3ŕI¸ĹfuµĐNAMĄ$˛Ă´*É„FějrÍ<2ĺHwćăţ€ľĹAKUŘŕČ˙éČVN’ ľM€1S)BżôľKU0&@p@7LŠÚÄˇŽĽˇ#łciq3Úvúi<]=bÓľ ËśqšDÉŔOÇÔÖĐ)h8 ŰďE»®Űş®űoÜ˙[:ľÝżď±ĆŻü·źŮÚ¬…!€4čĂ€صśĺŹ Ŕkď Ĺ@7«Čś ÄA,*Q‡ÉĐ›8úô)@Ă‚–€,®Ś®“2N‹Kťľ‚Çvüepˇ/„SrŤuF€Đé8…»<ÇđąŢúm˙ÝŘOÜĄ˙ß–]Ä4Şc¶ä˙µ˙s!€E4ŞŻĽ-ţRŮ!k6ŹNH™}}°úŚüŢhŁÎŚnµ˙rĎTh:›L;Őź‚5=ŽďĆŔD@ÝŔ(ŕI c¸=ć4oFďOYěßë2żźŠ˙»N8„ĘÚ0,śČŕ]€*Ş­ĹÔŰNü‰tf”ŞĆ)ďZj H^SăpQ—şKµ×âŽŐ§ě*‚+ćăšë ľgqP(ŻĎ»tDoqűŽôÓÖ¶$íM<»ë ,ľZ¨Ř`"°Ľ^ňŮ=…<9&ť%ĎΦ”l;}úĂĹÔJÓăl@ĽC“70ÚŁ‹`Ŕ}Q(Ą ßMZź7#?`Ż 0„ÎĺÁă‹Ű»ýQDÁOBżonąé_ÓÖŢűOš!uz@ęř ‚řyfŇŞôÚű.LşKÍfbˇöĘĺcW”Ç‚ŁÓł 8|p  ×Đ|…oךAůŚN7Ż'IW5‹>%Đop č]8…]Ŕld%°wüăo×%÷ âů˛µo|®«LA‡Łąq\đ•x»‰ÄÉ;yÝ]˝­ůF9ž—‘ŽŐ•V*ęBŮnCń —q–’hč2&”\%9y\=IŃbËgé!ÜĎŔOÇtŮ\BçňŕąÂ§ą8#`—ţOŹDa˙L’˙y×űáô-Ë@ΤQÎĚö kŮ«î*żKl( {‹0UzúeÄ­) Ä@ąµTŽ$®’Ň·ŃyÄH\čuR:9gÝ{Ňą˝vş:p‡śEˇ. ő‰ßôóą,zy–Ŕ0 {–ă ŔDł_.řĺž&ć‡ěć–l9&CM`!’5Ú4:A!B5yKGŹ1ťUÁäŢD‘TŢ<ć×Đ‚Í3r'ě.tuŕ–śé×WźXk•P› € Ŕ,$ Ž+*WżX·Ŕ°k¶ď<™†pQŔ dʵ%ďf#ť1§Ł‚^s¸G€é’ý> ßŕ*ŕ;=á¦ÝÔEMJ`9‚Ěíą)űSĚd-Ń+oË_iĺ]ŞöŮ)–š#Ď‚e¸ÂR­7Ýß˙` r<ŹöŽ3âJ¤Âs$’ @Ř&Ń3đÓqvWę ŮĐ:őúŻ]ź2~o` @ Šm°ĽĽĺ/7•÷%âŞĘ&—|«5ŻH“uKS`|ŠRŔŐÓ‘RĎÚg¦‡TM g JXíŐś@źŔe ×#Đa0úýť1y…9öłĚ ÂňB=`6ÇdĎÉ='.Qí?H°Đ‹ÔňúĽ•»‚š“6ęOať€;ĐEdËéâçąĘa13趸 ŕ(€? ŻĎ±÷/Ô8 ë!@[Śą»CĆL2=Ć+oĘ޵ ôë5ĤR 9IKą`*RŮŕ1DĐ„ĐZ"zŃžĂ}ëL1žŰx”Ęż(¦:Đkpč˛4kŤDcĽ¸hí=hDŞ«`ˇć^p;)% ĽaT€[+ăöWµťvz%6ĺ‚węRq?©ŞŮĺyQŃČŤä«0r΢”łřé8€C;€ë@ “š^íúĂKĆ”řC É€< Ŕ€)ě^(őÍŰ[m}GÓ¨. ÍľH[ËŻcQ¸Š@ 4uąAĽŐ§·'µUÍůn« m˝ž’豸ĐéŔÍaŔ'CŁŘ€€0S(Öżî–NW~ŃřaDyZČx3ó¦b·[}şĹ8Ď×0ď"Ű}_…ڎý Őđ);rŠľ¦Ś&â:í.č¤arďŽŔ±~hT i (0Ăl@Q_wSŁ0»W,\­PŃŕ÷tę+5‚|6f­}3—ps­i”;š×FţÄE<:Sr}vWş0Č  …,ň@ţĆSđSzu`Äě7.Q đő•€ĄŁyŔ,qqúDŮ‘Ŕ‰_’xŁN1\ůE€7!Z°ě[ŻŃD!Ć™…<˘Č­V&*UÜĎŔOÇŘ\ pi°Ć0`D(×DŘ řd§F¨ÎlĐ(­M^*b1đv6ž•Ypµ OeÍѸZrä-HšTýč'/ –•™‘úë’JÍń›*ťĹŇs<¦ĄPśÚŔ$&ť plp) Ú¦ŔZć¦DW`!˙)R50ç0[ŔŇľ˝ëĎh'Çßň("É0µ8mŠ’«îŐÄŹ%ćäl@~'GĹ´€K€EDv®q2G&dpÉŚCFq]v—ęčpi°áGŘ?÷ŻěSŽţy÷GÚŰ?Ë9 ¶#śhE0ün˘m”›ä›ś>‘:˝Ú>íH!„űoA>őŐś‘“zę•óâЧŽ_C=•WŔň˙óq=v×2đÜ?? ·„ŞIËŐ}$Ů÷l@WÝyá}eÝv˛ÚÓ=G«;1uѡŞDŔq3c?#ęڤK[q®˛\;ɰ̟ů¤ň4 sßMĚ4í®} x(¸Ű!€}€Ä%-¨Ń‚oC“V_¤D“ĎÎzŔnöZÉ;+^­µ.ý!’жDÎ . š-żn´•rŽ €i9§’O»SrGvâ¨ip÷„¸­·¦` Aá7Ϥ•%ň÷”Uš·T4 ÎŠŔ KNhIĺ­µşĚvľÄfP)2—žu<R8nYDĘäť| ĚÂDÓůu9¦ŔĹ€Ěh#€ĺQ€X8 rE׸||µđe7Ą­?«Ę2c·łSf ż,<¶„Ů–"`Ş@´$ÖÚ€TŻpÍ€{˛yÖŮnC›šŠn_ď:đ?2Xŕj@ć4'!Ă1lćá @CrřęŔ©á Ŕ»»–p ľˇńQj´éâĽăđҲeM+é’·\LPrÍZÔ»4CIŻ+HCß’k¶r&#? \z ÷MËŕjú!$ »éđcł˙ŘzaŠ?ÂĽu6 ¬˘P—^qO^ťŰU" jĚ`%&’ŞĹ5rCÄsß—ôĺÇ2˘o¬„µ– +ł<®(Ą#•‡'ă~üţÇď÷Oüűăţ˙?†Ŕĺ w]‚n:ďQXG‘¨«ĆL7°•óˇ·µEH7˙JIŃ ÖĚ«4j dˇ7'ZÉ‘sĺ"ÂědŤ™pą–h%·,†¶ăqť8dľĚ’x¬r„¦DőGFłp?ţřţŰ÷ý“ěÖ˙1ě.}łA«­ŚĂý€¬¸˘›Ă€VĘÜJls1ůŕ:@É7f]ˇk+jç3¦XĐ’°µeB¶Şá»<®©ŁÄ# Gß)E~z2 üţz˙˙o·ţmp=đÄ-ř! ŞGÚ‘…3ďSVëó’{Ú ÝŐ ¨‰Ş Â_˘lŕě¸üčCnÉ*:Űpę[V»4LĐ­ç ÔŽă©đ4˛“€ź„ř ŕľŕv׀е0ČBşPí#ĘŻŔÜpt§ű¸3ޞň‚{Ö_— C­×&H± ˛­;lĹÓP€Ňň.=KÓ‚g«ÝUgŠIkE#CA¨äąîšŚ|˙*ň˙ŰעGßé”’€:ďÇ ˇ0Űl@ŐL˝ú¶®Ň2ZŕZ‰é"ł.[Sg&T¦ć(@"k¬|ŹĄťˇośľŚB“=Ś+_ő e0 pWľľ“.ŔP@gú„(P8TlíľÉČ«­ĂUŻ°ŞĄ·#Qm*"CÖĄČë׾nî{Đ’ŕşôĽÝ`sÁ?Đać‹—Ş¤Őţł»:ň?đc·†@TŚľsi°ĂQ€ç9° łĚ4ęв<™ćń=M ů© 3«ţ˛™7ËłÄ]*˘cbpv&mCő‹ÂâŚtčwĘË‘Ó:©ÚSaôJV®|Ü|Ŕn Ě€°(pŕđq°4gq ĺ3o#Eť´esäÍ+­(=ĎTA;{TÁŞrˇÍMÚ”VFÜ"^ŞSűć´u6€ŚBn ˛Ä.ˇi9ëÔl@ô ĺź°H;€!€® 8 ¸#ŘK…3ď› x,T×ßĐ1±#ő¶”ž'˘A˙m,N÷tŤ 6–p¤5>ž·˘8ąéŘýę92ôG0Zód0 »ß3řÂ.ŔP@ý49€'@CŽ8*¶¤j× ¤ZµĐůŔ›ó†yá·§ÍŞŠ;v;O~YJÁ7ŹYË X đ<›épáŘ{fůŞÜĐÜ—¸¤vyQÓÍŘGv Ď–vc€˙ďWç(€ű†Hű?Ďl@łö,O&z|SSpçL7Ň$żL&&źŞ}Î)ĚíJQĺŐe*ôąšwq46^+#9–’ČŤx94‰XNdŕ'áÂ|6°°Âpi°PEÚî‰Q€Ł€ g‘ú®qůŕĐ%niâßsépi"­źV4D…Sumĺ Ú¦Ä4ä\&ßtr1Ń -  ÖĚ‹?đăwâ äKŽ !"?ž¨×_Ćd É€7(.Dp^t×ÖyDz›L&fL€ĺ-ř†Ůtʋ̆»pžÔ Çňˇ´Ę"˘UkéůAgGuĆEŽ<U¨LÄPŹ@Â`@C †v ` @Ĺ:`yđG,nUşey"É®›âMXĄ5Ű3!ú´â+aU­;MÁ”xgĹdyKG )á>ŤTŮ3üJś€/_§`h-‘9óně¶xp:`Y—č dŤkí20 p0 ÜűŽł( Ŕ,ł­VÄ”«ďÉp:»!ĂďBxtŐ–G•ŇĺôĺŐ¶2ÁęWtaťH @jŻO«[qډǣ2mb [ÝńÇYćă”Cb0 Q€şśąĺ [VĄ‡3 ‰p}÷;€ÁâŢúłáDÍ·°v…ř“ć·ÖŚŁAs“ڶ›+G2+šňr¦Ş5„ZRb]¨QIŚ8 Ú ľźxxŕc6 ­C®Z㮿©FŮôÖNťqěśLM‚ˇUkoĄ$1„?//Ă #á7ęřŞ„*Čż·Öe9€ďăĂWóÜW^ŕ ~ľŁŔ0Čd ¦ś!°˙Ý€y´Ěh”5c¦ (ëë{ĽiUĚĎižŕś‚ęˢŇŐ÷bšÍ-"~K#_Ť ł\@Sé®ĂD˛Ą~SoD˝‰#–ęësäźs/PÍđőŰ×ţűźűçż˙˝˙$evă"€& H8żŘ‡ ¨kĆL5°Ö´ ˝ĄŇ5âέVÍq`˘Čµ‚2q-»E]=9ĚěÍş¨P“é:Ń`Č^‰ĽĘ-B‹HF.ĚŔGŕ/đĆąřýżҡ;` ^«vnyÂ-8XVš đćŮ€¤u’Őkś PH¶ĹĹ…ąXµu‹XKÍn1e+]ËĂľÍM4$ńźN`ЇŹ@˛ĺR1­dUľ\HŠs_ßG˙}ož»‡˙ţ7¶ţ;Hjá˙ëw0<ŕđ´Wŕ“sÂ{gŠšÄ«ŢĐ›R,+«#ąQz1ÄJ‚gl9ůCš’ÁÓČ—0Ü€Y.€B5KzůeňnĆŁWž‹d•ĽŞÂt$ľ–@ćîüűČ˙ęç"ŕ/áë{»Ŕ@€>ŰvŽ ˇíř`.cf h‚Ńq­?¤.ÚmĄ LédWŮq¬ÇaĆ”śuo}WŚR€WM™ŠĘŐVPp`ćĽFŕ‘÷Ő@‹ڧżî~˘:ŘE÷6ĐĄÁ|.Ź9=DŚg6 j2Ćjuwúí¬Ă­‹-] ®Ż6¶f+íXÚŞćQ±n ”ÜXŤ,rĄŻÖJ“ëÝţ“ ŞďE!9Tň•[Ä*Ř8í®ł5 ř'ŔÎzŻĹßÇ@čě,GđöŮ€ĽĺÂŁ” Ľ±“yaA¤Ńlµ8yŇh!ů¦“ńážĐ¤ŔşLѨűÔw+—10PÁtżuÝŘ˙9Č„'€Gź€âRü}ĐjhÉ\€ËGđĆŮ€Ľ5˛ęŕ{Ę}HWf ©Ł` )`mĄşłV ôb¦•Ś 6oŐ5Q+łÍ€-Amұ 1Rçó!31Q˙QŘĘoBű\€ž¦ü±ŕźÄ' ¸źÝ–€î`i°§F¦ (Ş=T}Ňn ą'kňt ¬„Ö‚á–’rÖĎÂÔFö Ŕlľ …ú„–‹Č\€ZI¤¤!&¨3Šd ů‡ÄiZąő¨!xš˝™ďCěľF"€đ @ź€âRü}P;€ľŐpÓÍŘćܒɢPy‰]»/¬1őŤ~ăćŽÄ-ůE€×;!µTâ˱¬  ä ^ľUnEoM•ÖţTĚâ0ŕŘQ˙@ź€âZü};€VŕP*ÎĽk6 S2dáčËďÉ҆[iÉ&H„ˇrÚ/RĚT‡Ł‘ůIă@í”U~ůHŇFŽ´űJä ‚Ă\~C`šÂly›ŮŔţ¤ąf†®ˇň°} ř—âďSíöťF]7 Ŕ€wÍÄęO8!9×ß“´˛V ®ĺqQ±ä!;’©¤˘ —U´‚S÷vt°Ů„ĚR•ŹŁl#Güs ÜčyĽ˙{_cÉqť×°'D „´€Ňxőf´@b>(âIŔ4 ؉ă…áŢŽ ﵆HŘH kƱt##–Ʊ¤¨%ÄĘ×?‚ fD äq"ŹIQšmѲ¬p€HňđAHî’«ÝÁöSş«ęśóťSŐ÷Ţ™{{v)łîĚíîú;§ŞÎůΩęîş+9K=0ťĘ»·÷mŔ>3¨5e@˛*Î Ď(ŐlĂ^Z]7uÍ1ó}i´RNŤS|ĐZš;x °á57ä]·šP,E帚PĂO-·'ŕ`ďÜî·Ť•~@Y[«}ىxjçh{żĂ`T8_<Ą NŇ5€ŃËh0zÝů€węW@ş”•ăj€)Ŕ<`ŐçzjîÂń6`ŢŮ%“ę!ÉćÔ[lŻhí¤Çh8±–möabuä nú-Ąâ \cŤÜą“§y™ć©”E@]Ôum«Xź°äŽ@«?ĐAĐAĺŐ<} ˘hű][€:ٕݖľ2¤”qó%;RP@DQu4¬~äü3ś/ŹŔš=€zČ»őŞ€+$]ĘĘqEź¸˝ďÜć·űćáiÎUxĄˇ=3”>7EADÖÁČs˛¤ÄĘiśx lEđŤJ»ä €źôh”>bô @Špfç+é"%Rět击 ŕVuębP †mÁŢĎdvţl˛»…żLޜؓI˘^Ŕ‚輚p.÷qä3™ŁOň ”–L’ÖŰş'7qdO@?V~ů¶ď°žp€ß~qů€Bę*d uá€ZĽőÇô†» PŻě„=MY9®ęĐs‹=€Ń ·_ć]€Űű6 RC=Ö—CL4ą¤Ű•2†t>5ő7…MíÚ±O›ź>ßd„»w7Ş ˛8ÜÍ€ IDAT˝ť ű“Î/pÝWŃyµÝ—×QWÔ’ąűň6ąU=îj)âwł;_ˇ«·QÇčđÝ*MW˝§U1Úš@wwÜĘěŔE帲€Ďô˙<8NŽż p§Ľ ŞE~fĽ.R†¦ýN˝ńÜéÄY'Ń…ă/ʲxźż®Ľ/ ęO¸ęZ (˙eÄ€ú4îÔ«;°—•ăĘ€[ć6ŕdXî]€Űű6`âźĆJ@Ζ§nMÓłuĐc­Ü)TX îs8&ę„‹šµ©Ť,I|°“.šz»¸ŕő8ş¤–Dx’]ô± ¨ rBG‰1–Użp0“6@w9Ô]·ş űpQ9®î,ż'ŕh5 ?ÜŢ·'ZĄŚÁfú/zžLěÄŰdŁ=÷ÄŐĎNüs®NÎĐ÷µ\“ 7<× v»#ĺęíÁ ¸5črc¬›fűm31‘@`€öÖ­E˛†ż PŻÁý¸¬Wwä]€9Ŕh@Ż"ÝŢ·3RÍ8¨Č0 0WiŠZyUHIjb3ë†Äz’"Ö9™¨s ËB7pBŽ]{‡W˘¤ŘS˘_G•eÝ/  *ŃĂ!bPbá Ľ€&ĐťĆ]·/jĚľ&€žk8‰ČČđó]€A<€Űű6ŕ›7ÉjŇz(¦W‹ťm»űßWdŮ&‰×3Ř^đFG<víkĽ‚Éyě˘HköÂÝľ‚ň…'eëě" ŻBŻśÂ]€zďŔeĺ¸pá`RśäÓý6čÜ5€Űř6`V»S>ŞOÚîâýzą‰Żh0ŔPwÜzí¬Ý¨á§Á\lź·”źţ ěŕđąŢÎp9@%ŁU^ŐTe{ŕ\öŚ-Çë2¤ýť›) ×c)÷ĐB®Ă†JÖŠdá*#ĘQŇó#đ |÷`ő’€ˇďÔkr´°vŔÉŻĎťś8,¶žÝ@ô YřąöÓzPÉyn` ÷ž‹żxíŚzŞ)!í¤ž…­ąź]íbÄšH«/Łđp~áďÔůÇńÚ…›}!–ďëů§őo× ŔĐwÜš ›r\“ o.ˇgqťnÔ„«éđ— |đ¤˝ţ;Ú¤ő4ŢĚ15gÍkÝÄ­"ö™`0|ˇë łN2•ä®’éý„}®Ą3’ś<Ú+Źű¸đXoźę§‡ű ¸?ŻĽ˙š¬ä€+ߨ×ĺ(`ý€Ľ XĎńĽ,ŚEŻřmoč[˘´eCřx7-â¨ÖĽ \YőP–NĎ Ö9Hú2dÜr,=Ď7QDržżÎ·$ĽqŻX4Bu #ľsüjž3OňËăúń®ďmYř.€[—€ŔŔ’»w=7ă.LFţ„ţ»fÜÄËî¬ mś÷ ÚëŃ!‹¶#´3xd§ń6`:Í­Čó7:ś!śIJŇSS>‘ĚŮ|•Ĺ źŞd˘KaŮŚŕÓâP™5§Ë'Őwě8€c#đ ô6X˝Ě Ŕ°węµ9č ŕ¸%oŽF—ĽażäĎ[­nĆţŘřNý›hű t'ţ¬IĺĆ„şą\äSzpŇ+ä Lě r4o2Đ_6Ł¸óťŤ 'Ňř<¤čňäıjĽ0Žś<~OÎľc@Ŕ‰=§/VútW†˝ ŕÖćFá,µ#Pę`ÜGťć tvŢ[ůNőĺo˘}Ę‚W6p¦dż hŐĄ'qŞbhŤÎĄ,ôýÔr[ĹÍÍ™ó§”S÷A;%ťŐÉŹ–÷ŕĹĽřŢ®^TŹţ{¸ +ި×ç€0„°ěŽ@ى÷ĽňűłöÜ#ŔćüŤů‹ë…ă¬1Âö"‰=˝°ţ·•*ŚŔ/F~Ieśfۉ^o•Z¦NÂD_š¬šnßP!űT¬;Š:…ű7l¤Á"‰ ŞŃčÂźţ Ŕ wÜúńqđ]€ą‹€~ęߪű¤űoŐşsóý1š~eűĂŚ`}—ŹBĹwDv‚c°î×Ä9‰CĐÎĚň)fjn +_AƋ׋“LĽ¦A“N*€NIç‡Ýů7‚, ´6X˝ě Ŕwę5:â âČ»ŢňÎÍ%: †Ô­xťoÄö Ś#,Ô&ýśoxHűnëždu&\#h“vľ`‘s’f“‹ R0ŇĹ˝4‡á©żí:ť¬Y|Pě°c;î”Ő#QW yú+CŢpkt1‡q–ݨ ă&ŠI§cďč{MŹ˙çď Ś|J—u‘:@­¬ům@«\ Đč`gĽ®YGŹ&)őí͆~·”Ę•Q á 98Ô §]ńuT+ře Qa‡'ŽEť¤1€ňţ9aŕ€ďÔëtŘĆŔśz/ď6…SzĐČsźÝ\^Ǥ‰ţ;;Ů»nŞ?gŃśelú\'GéăÓ’±SŕšFÉŻĐ \…Ţb‚XAŃ*‰%;Ő€ď¸u:ä äŔŽ@5ÍăFą{D$tÜe̶ŔĆíěmîiĽ ź5ŹPyÖ©÷‹™®÷šô¤ ŁµŢ“ä[%óůŽó[n»kšĚ+úŮFŕÔĆr鲹‡ş PŻŐ ` @ďŻĺ°ß”CbÄŕd„Ě qCĄ˝€lŽÇcř·SçŘś[_y­d{¦†Ľ:Ó ¦xęźë%ý‰‰ÍTa= ™p¤Î’Â)ŢĐ=ŽÚťľ0Ü]·V zC95> ßév0›Ňő+zHUĎ#hĚďW6Owř·s:C‚žŃúőN”VŔđE'J{'J%*ăôč´ą$ń=x— ľ°:ů˝lV» PŻ×ŔP€S/5s•ő4Âđo&ŞĐcڇ™djŰŢ7I\”‰Vî\3,’č\}ľPźXŐÇé‚ąĆ `üqĐ8n¬‡Ę«„¨Ű¸0Ř]·^ . űúőëŔN¶ć¸=+§ň6`ę/÷[ľP`’Ńą,'Ě›šë JL@Űmmiąt) S°o˛" d„ń7ťúŠ:f~Am,—®'÷0wę5;ÁĚŔýâÓ@ÔŐ¤ń óľ¨Nĺ˝]ęBTW5TÚ ČHý6`N-ĐŢ)­#I_aždX&&’ÄŞŮă)ôůąH *ńÖ‰ĎW6™t%$qC÷8jwţ ŔPwÜšŘAi Ţ/ůwhcGq§týD@^ňÂľ/tçç ĂcTěžß40Ńz`}‚5ÚŁ>YeV'!É–]RčwYT[&6¶—t’™C`¬N~ĚF˘ÂOśC`cxWş PŻŰđŔp€ŰĂßXj @žĺ Ž€üô+GÄ8ČżÍŇNémŔśŮě›~Ż™n:Sý›K|=[ĎVj+4ęź#Ĺ`źăźáHÖRżlVş ŕÖíÄť©ŘşŘÔŃ˝\°ö„B×E—Äą°Í‹‹űĽČK 5ÄQŽđĐ˝­ôm@´^é$W«ËR:pÂaúLµµülěç1„†5ZźcËC~ 7ůăw\xĄkŢŔŠf~AmArç¬ s ^»Đy:j0,€ß”Eâŕ’ÔňűKtp!•ăĽÖKj¨´Ť†iĐ·• ŹŇ(Q>PŤµNÔIذůć«{~‚`ç0}•ú«Ň™¸˙9?cOúă¨w]­Zä.@˝~ sˇ©Ž˝%ŘkŔŐüC°`÷ĺÇaéf\Ç\´ŔS˛aŢd-ÉJ»UŞąĐpÂ=W˝\Sl4w‚şoťţ^"ŕ:dśťÇg`©ŻýëŔŽF ±ň*!ę6Ż rŔ­ßż±‹­ß€ßpô.ŔÜ€ŔQśÓĂţo¸P#茋š;ěm@^‡ŤK Üz'޵° U{˘¸RěLFFc'ß"ěyX–&aSq2C`ŔËI˙Ŕ\!_ŚŔ/¨-HîÜ€!îÔ8ÝžjŽĘ­ßpř:°üDi|ŠÄmzk7üżă[mőV¨as¨+ü€·5-ö ąNM&Çk&ś«:q8!×)ťśZD(%Ýaz!Ó'ń‚Ć(>ô˛Yâ.€ŔŔýp`O@ßÍŮ"ŕĚ ÇěŔÜ ŔŔoö)SŢĺ]#PuÚÇ$j5Ç÷‡}˘Ż'şĽ¦h+íŻ[)ŇIŻhoŠ žxY¬ p ÂŔýpśúyđ…k =pbP×ٸEăUůŰ€ĆřM¬(‹ŻŽJ¶& ”fŢŔ $÷p’łČŠf‚(Ř®IOĽTČ’ë0ŘÜŃȡ!FmŨ۾0Ŕ]7„ű á„'Ľ °h@fç8 *‹u˘ĹÍęmŔQ^§Qµô[ĂŐ)‹µOőŞ6Ąˇ=V­Čç Ҥš›K˘ S©_¤ŕ„Ä`ţ~+j—řE¶Ä-±°ţ»ő ě0„ž¬Ă@ô.i|ŠÄä’|Ë5—qÇ>Ai/ ´“ŠOă·­u!_ł×ź!,GĄfˇ2.BotŻnOl''€‚Ó¤ôDĺɢ1Š9wgݬ˙.€Äýq`CwIđöôV†z0ŻUJä%‹v—×rV<Ă[Ć÷O#4~ˇwĘ›qgn˛ńsç>!6"Ô A’ßxy¬¬ý.@=Ś ű âÔz  gŕO1 ň6ŕD–µŁ_Ńy}`]]ওÁ`;ÇcN=-@#$ŘÉ…­«§ŹÔŤR¸…|»·”ĆF˛©R*+ÝcĹŔźÇ;Ů©Tl/¨dÚíş›k•Ů9ěPb«kţěα Kňşć¬~Ŕąľć‹D©®ç†BôĘÁ`ŐTˇ3LšŁxä8đ–Ń#}ÂĐÄ:®†˙U“©ô<'o®ąg—Tҝ͹iUc‡Ř†`ŁŚq©j@?Âe8Ôîµ­ŤÜA­ŔŹ’!ŕŇ8|$3ÎŤićLRîä°ž»uŻÁ ŃuNÔâ8@Ü`(@Ön÷@¨ŕŚ$®śąß9ÉbÜăµ é´&QBžě<$±€* mp”ű‘’DmO‘q5p,-şÝ‹Ç'ó+ßp˝ăVtä×”qx ` NN! 4RÄj¬(q6ŐC¶ľž`şę čé»Đ“áeÜęwęူŔ`ż p§ ˇ-8y`ťî • †V‡NůŠÁ(V$ÁÚŤ¦—9zŮ®Ľ|oתwśë+-uB€vŰČ `Q1Ay16GÇk6ŻęÄv •«…Dî_YHGhĺqKto:+‚č ‡Ą„l«3ę¤äÍŐ„Úh.{>¦ďVĽ P3é|Ę*€ß`8@<€ů)Ă 1 ¸¸ţTké«ÍůJÁ™+¸$‹qŹ×”|+M˘„<Ů—Ç @Ť.–H -DĹk9' ®±”ŐZ.´>)y¶©esęﲮxŔĄ=¦RtŹ9JYNĚ Ý ¬śLC†.ĚqUłěu@ĘîO’‰úĘ$-ţ੯$śŔqĺPš«2Ť-ádmtD¨•:G¦\?;%r[ÚĚĄ®¶Ôť‹ Uű1÷*knH î <”žĘôV©/ŚâkWCkefľ2•j°äG˙xźś‰AÉQŤMeo5Â}-–<Şłt«ÓB‰Ţ*ćń =ZšüąžÎÖ‹ůµvŁ´čĘJEŰ śa•Ĺlo$l* ˛ň€!”zFç‚„uç:qWŕˇ˙ Ŕ|=ĺ`ĺb%5̦‰ŔŚZÖÖ€Ŕ˛c”O·T$Zr)–•öeđ¬ÄRFŃ}F”T=Qfň›Şŕť3´ÂŢŢ^śݞŕuh/ݡ€đ(ĐÜ.´2ŰßÇ+‰ZŮg O\q¬W.KřŻňm\‘¤nŞ$ÚTQD*ڏ$ŞXŞžóÚ˘Ľ‰˛'_jŚ“‰uBŔiŔI‰@¸ľc€°+đp@ű}á=ß“¨ŞčąŐ%Pł.µŻ2|fhÝaŽĺQ×€WńLmZłł‡\ţĺ*ź§8´I˝ý=Đ@–áLOĚaĽł0]č M—íÂť{  Žoč´áÂ+á•đ÷:śÜţî„·‡tşď çŐG_Äo9 '}AăĚLņ ¤ÇËő¨ö<|§ąřlFÎĂWÂö"ł|޷׹ť—’ç!ëy© ­EEţt çM KŔc…HČBV—DôŚüXaLä ę—<;Ľ]ܲ¶¸Ç ëřç†ujűČ„yfĘI•'qHIă̶bCŇű^!@µj’\|6 #ľžôxI÷Şâö:× '%duRAZ‹*ŠüéśIa ¨mHŚ"! YE\Ń3ňc…1‘7`¨_ňěđĆJOúK×ëqüsĂ:ÎŕC`É "@dPŤH*Ę©Ě9U ‘Ě• 85q>¸Á@Q`IţdX±´K®Yeóŕ°3s GFđűLřQeQűťĐr'jĘŇĐŹęŕäp™G#oÇBcXă4Xĺ±)jNâÔĹi8@ "€XŤ§lí`0s?ŐXN!Ö*pś’`ČíŻ[(C‰µé¤Ŕ‚fDT J×É5›/ťŽťÉ¦ŹkU°†:€(,Ş N@Џ‘8b¤ˇV䤊کC-‡„KVvUÎČpĘ<$i¨ôĺ*#n•Ǧ¨a")ě/” …qŞ] “3Is¤128âXć2îÖČ %4Fą‰–Sµ §$rűëĘPb­Az)°$€Ý‚Ň.ąf{ âĄÓ±3µi†ś*č ` ‹jC-(EÜH1Ňŕ9©ÂŐęŕäpÉÚ®ĘyN™‡ä# •ľ\eÄ­ňŘ5L$…ý…rˇŔ§ĘŐ(Ő&iŽ3¦?FjÄ…ąŚ»N™‘„†3÷QŤĺb­Ç) †Üţş…2”XkA ,`FDµ tť\ł9PńŇéŘ™Ú4 Cµ*XCŔ@Ő' EÜH1ŇP+rREíÔˇ–CÂ%+»*gä 8e’Ź4Túr•·ĘcSÔ0‘öʆGśjWĂäLŇ)fL† Ž8…ąŚ»µ2C ŤfîG"‡ĺd­Ç) †Üţş…2”XkA , `FD· ´K®Ů¨xétěLm…!§ :¨¢ÚP J7GL€48ENŞpµ:89$\˛¶«rFŢ€Sć!ůHCĄ/Wq«<6E Iaˇl(`Ŕ©r5JµIš#ÄŚéŔŹ‘qEa.ă®@f$ˇ!ÂĚý@Tc9…X«ŔqJ‚!·żnˇ %Ö¤G Q-(]'×lTĽt:v¦6ŤÂP­ ÖP0…EµÁ H7GL€4ÔŠśTQ;u¨ĺpÉĘ®ĘyN™‡ä# •ľ\eÄ­ňŘ5L$…ý…ňˇ€§ÚŐ09“4GŠÓ!#Ea.ăn-€ĚPBc„™ű‘Ča9Y«ŔqJ‚!·żnˇ %Ö¤GKŃ-(í’k¶*^:;S›FaČ©‚ꢰ¨6Ô‚RÄŤÄ N‘“*\­N —¬íŞś‘7ŕ”yH>ŇPéËUFÜ*ŹMQĂDRŘ_( pŞ\ŤRm’ć1c:đc`¤F\Q˸ëIh0s?ŐXN!Ö*pś’`ČíŻ[(C‰µé¤Ŕ‚fDT J×É5›/ťŽť©MŁ0T«‚5Ô DaQmpRÄŤÄ µ"'UÔNj9$\˛˛«rFŢ€Sć!ůHCĄ/Wq«<6E IaˇžPČSíjśIš#ĹŚéŔÁ‡Ŕ˘0—q·@f(ˇ1ÂĚýHä°ś‚¬Uŕ8%ÁŰ_·P†k Ň#H%Ěč”vÉ5Ű/ťŽť©MŁ0äTAuQXTjA)âFâ §ČI®V'‡„KÖvUÎČpĘ<$i¨ôĺ*#n•Ǧ¨a")ě/Ô ˇš*ěă\ŹtĘUMbĺ €@„Â\Ć]'€ĚHBC„™ű¨Ćr ±Vă”CnÝBJ¬5HŹ 0#˘ZPşN®Ů¨xétěLm…ˇZ¬ˇ` ‹j"n$Ži¨9©˘vęPË!á’•]•3ňś2ÉG*}ąĘ[ĺ±)jH ű ő…B†ČQŤ}¬ëˇNŮr$‡PŢ D(ĚeÜ­JhŚ0s?9,§ k8NI0äö×-”ˇÄZôR`I3"şĄ]rÍö@ĹK§cgjÓ( 9UĐAŔ@Ő†ZPЏ‘8b¤Á)rR…«ŐÁÉ!á’µ]•3ňś2ÉG*}ąĘ[ĺ±)jH ű ő…‚G¨¦ ű8×#ťrU“By ˇ0—q× 3’Đać~ ޱśB¬Uŕ8%ÁŰ_·P†k Ň#H̨”®“k6*^:;S›Fa¨Vk¨¢Úउ#&@jENިť:ÔrH¸deW匼§ĚCň‘†J_®2âVylŠ&’ÂţB˝ˇŕ!rTcëz¨S¶É!”7 swkd†#ĚÜŹDË)ČZŽS ąýu e(±Ö =‚XŔŚnAi—\S§)fťt:v¦6ŤÂSÔ DaQm¨Ą‰#&@ś"'U¸Zś.YŰU9#oŔ)ó|¤ˇŇ—«Ś¸U›˘†‰¤°żPo(´\ęQŞMŇ!fL~ ŚÔ+ swť2# fî˘Ë)ÄZŽS ąýu e(±Ö =‚XŔŚjAé:ą¦NSĚÖŇéŘ™Ú4 Cµ*XCŔ@Ő' EÜH1ŇP+rREíÔˇ–CÂ%+»*gä 8e’Ź4Túr•·ĘcSÔ0‘öę…L=LÎ$Í‘bĆt`ČŕC`Q˸[ 3”Đać~$rXNAÖ*pś’`ČíŻ[(C‰µé¤Ŕ’fDt J»äš:M1ë¤Ó±3µi†ś*č ` ‹jC-(EÜH1Ňŕ9©ÂŐęŕäpÉÚ®ĘyN™‡ä# •ľ\eÄ­ňŘ5L$…ý…úCˇŠčQŞMŇ!fL~ ŚÔ+ swť2# fî˘Ë)ýěVĆ IDATÄZŽS ąýu e(±Ö =‚XŔŚjAé:ą¦NSĚÖŇéŘ™Ú4 Cµ*XCŔ@Ő' EÜH1ŇP+rREíÔˇ–CÂ%+»*gä 8e’Ź4Túr•·ĘcSÔ0‘öš UF“3Is¤128âXć2îÖČ %4Fą‰–Sµ §$rűëĘPb­Az)°$€Ý‚Ň.ą¦NSĚ:étěLm…!§ :¨¢ÚP J7GL€48ENŞpµ:89$\˛¶«rFŢ€Sć!ůHCĄ/Wq«<6E Iaˇ9ˇ(ŘÚš†Ďtk«;˙>Š“0e*éľČЇ ]\LcV>Ý 'M_ÂVĚţsAÁŚ[):Ńß–:וĺ)l­@-÷G¸‹uőeß~™-şĆń›N5čôn¶lĆP”Ť‡EřAĘR—°¸Eq‚ČgšůßB9 ©BY.ŤRµZި Đ”ôCÍćöY‰8f°Ę)B‡šşĹe–"ĐúÂŃf¦ĹtćÂÇÍÚŕ⿏šQ¦8I÷E)ş(¸p1+źÎ DÓ—°3‡˙\ĐE0ă 3EB'ú›©s]YžÂlją?"Ŕ]„¨“¨(ű ře¶čÇĎ9M:˝‡›™ÍŠň ń°?HYęgÄw ‰|\ć†r@R…˛(\ ¤jµĽQ )釚ÍíłqĚ`•S„5uĆe–” sĹŚµž ,¶fvăŰÖ±­¶ÝůzŘ=揿řč•đ#VÓ•rÉPn€Ö3ú±™bęŕ§"äw'2?IS©Śú‡rĚŹN¨ä9QxĹ‹Ęg3Gxăß•HŞYĺXC‘Rgąď«ltrűźř`hŔŔ:Umŕl&ć„­‡˛dÚ¬ˇˇă»rEĄ<€XS`kT<)b†8«‹Őb”n!anݎlCcgÔ“…ŃČŃPŹGăVťÇÇŐ˙™••ă üŇâ[VčĚĘÍ6nłĹ‚éĚŞd÷µ)ż•ŕă7KI€K"°‰Ę±©Őjš¤ąÓZƨ•"B¦/(›RDĹÂ*0+çTĚ<ŰföĐ •UŁŮń¸Čt’&^řý§;«Ó€‰t°’2­‘{tT”3[ĆŇ€T¨F ´¦¬WĂŞŠRŐdşˇ¬4=`Ű4Ö7$—u™0uU€€ęd¶|k1Ěbě&) Â’âÓ[€čŕŔ–“îŰě›]vÜ[‰lv‰áO"1Ű&FlćSçWiJw燒ŹeŽ Ěw‚żŞ<§5QÓ3Ô@řË Í¶˛ ,Ü˙Ç 2ž)éy…Ň–,;?׸¨&·‚uâzËLÜbr9—ĚÔ6$÷^…ĬU«>ŐF¨ct,Vc*IČßĐ—Zá˛R»©˙BÖ"†t•n=Ë@ŻlÍi]ąąl‰H2”—ˇh˛ÍÍyěaÁ˘ĺ2Ą—•ůŹ PáÄZőÇşBk8g oEŃäŰećT8\.@(ť@¦HlŔÔ‘:ŽN¬~˝Eç(ѱČm€ÖG  € dEq<©\B]Keę '%Ü0ő•E 0˛Ďc9NeĄ€®óŠ^'„7DH‹»Ąääęt=%&(Shě &tข˘mĐ4JEÜLĚ0‡Ť«ŞJłŠQš=Ŵ꫌áĆ !ÄÓfb–Ş\ED%¨O÷5—=yç}¶ú‚e¬?ČHO¦ľxěµ Đzś„i)Ö]”őî~ÄÄbg»WQ"Qž0Ď_˝š8†Fp«˘nzC˝J<“Á÷ ę=şµđ/”ÜH–k,FŠJÚĘÚYŔŘůł˘éŤřŻ×|*%P= ýŹňź*9vąe‘3z°ş(Í%"ń=V˙űîmFć*©@‚i,V_U•Ť53ŔŃ­\QUŞfě”X'Ńş!34ÖĹHrN(É‚—­—>S}'€~’~ĐE׍ŚŇ>O‚cô.@÷WřIHéuŤ¸'(ď’ÚÓŮYl–śĆYÜ ďŮŤw_”Đŕ9ŹnŃtaoo· ;;;WÚ0 O8],ćô_QČČ)±x¨_+ŠeFł/8™tˇ8Bß–:Eކ°âZŵߢ‹§ÓžűDB>¬—i7ŇËá¬Q=ß­ËÄâ› < ň¤™Mkµ„N¬ěE¬q32Ôyţ:¨˙}ťŘĎ>űlQNŰę=ɦ;MúĂçŘÄÎ*ÄËfĘĚ&h{<+mO—f’ ©q áää‹€­ÇI@;HXY¦¸CŹŞ˘Ą;eăżŰs?tŢl·_M0xMĆ`Žh P†»±Ű…¦ sů×wCüź@‰Z! ?Ý=†ť+˙%@·R—Y4‡?lőożC€ť+ŰXç˙bş3-JAtéĹŘ Žú÷ú±˙BmçH<ĺČ&%só7K[\u wŘF¸`7Z řl¸¨H#ŘQ(tdUˇXyTU%Sn┥ʇ2@$¦µţťÔ<űě=ŹÔtQ·(žĄ•…c\ě¬ţ´ç]ś÷Ă‚ą Ó˛&~HŤnď˛5P=3T+)ŢŠÍf‹WTĽś7}Ě´yŃiěô˙cűŘł¤ŢQ*Kâ¨óSĎ[— óy\"s‡d8@6Ęäe`hĘš4ŹUžIĺdÉźŠRĐ%44°ˇs›D˙»˙čú)@ć»Ý@°ÂU´µĚ3~,‹Ö;8 úߣŠÇlhgEqőÚŐtEˇ pW^s…»ďşűî×4=WZϡ C—]§Ô7Îľű{~"Ą>/PĂf‰=IM•±Ěý•u0Ŕ{z^Ëčé“Âű˙˛ P_Uŕęĺ<ľŞ/»ŕˇHCÂ.$'04×VŰ4ďtú˙†G:ű\“†™)•ďU6Óke«4Ť›×'•’ĆkÄóL˙· v-Ĺ@@ŻŔ­lt:DkÇ %Ýč/çSf±K«ÚäTő3B“¦^Ů(fÖh±ÁßťRě4ÍnQ\~˝€úţâVwrµ˙.3Í(ö›ć°UÂť˘řőşpMÖ) űMz ŠýýźŠrşł5ńgűű9\ęďŽÔŹ<1Ţčil_¬,„vJ1×*šä‹٦7d±Ig›28 2׏ĘWV¨âT¶„k*Î$‰y5Ő6±ŞL†~˛í˙~ö÷y) óU¤ČAc‘Eţ¦fűÔ.YŔýn‰źcą‰Xć5€F˝9]K)Łń6d zńýźj‰»žË ߥ씬÷ŃďGëĐSGĄ<zú'Ľ ;§µ Sŕb±íő˙őýU˛ŁabůĘŻ!¶J¸wĹ?ůńď=÷BŔ˝Lě`ď"yhűp·,f‡;·]±yxŘě“{/-ÔgŠúÂ.WMqę “Ó¦c(Ö…„±źŤe<€¨›ä¤7 úđ×ZŻJ´ě#y©ĺ xI0'çâŤRyQ@yş·ÄŰ€Ů˙ÝÝp'0N.JžXH \Fj› y°ÎćT†˛âőkžĘ kÉöaşŻh3> ŘŐ1*ťą€Źá M˝Ä0” TĄ­ć9€u›€fέĆ\n~8 pö˛ź¸3IďgzPť Pv6Ř+áŢî•âÝůo?÷üóF=ÝfĎ{ŤÁ€f:ÍÜ(.nlżéÂ/Ľăţóç·¦7÷/Ń3<—ýÔËĹŇ  ‘/@ŐĘÂ( †•µ‡ ß×—č9€ä.)Mř˘CĆ„GjD„Gr čШJ,îIn›q•¶Ę‚;I^lcĆaţżű~üÇýHoÁ>łŚ©ĄĐ(ů[őŞ4çÁ/Ů”Iô oć&‚ Zľ8Č“€í Ct~đS”ťPĹúCĺŕn–đMdž3&xb×br\ éĹŁ‡»çňpą”@A\ŕ č + đrłýěž=űńŹ˙ŕěƧüj€nA€LČ@wsáâô`ëM÷˝ Oűé_¸0;Ž‚°äóYęßß ę @Z¦ŐÔ_Ť6źďm•Ş2î©M°»«Ňă”Z_JăTf_Y~ xĆHŠ“×XŞCR©¦ŕźE·üż»űęŐ«^Ĺ® 2˘9*Ů[˛9‚ .˛ .݆<špp $u‡-z—.¬;Ä'ńEŤ”¤/h‰ĆÇ*L˛Tűá\? ŢPž ń°ßůĎ7ë3@J‘.mO븼ż×ŕĂî&˙^·÷ńŤŇC@ˇ›ŰŔ®€»IţéC˝‘ Óňâ |Óď=نŻűé§źűđ›vhVŚzę7Ű™ÂőłD}3y\:űô4µÇ,«Ęvł=cĽ–©i\đŽiŃ}x6ájŐ× DśG4ÚďV/’ČWi’Ă@ég?Ö=ĂŃĽúŐż˙ęWi$‹ Ż8Šnke;ÇPZ ŤsÎćî­nTŔpoNkeĹß!xűąŮińčҲ¸\Đ]­·Če÷çřT@‹š+ďAĽŤëÎü ś‡5N*+.Ţ×á^ő M†SźŠŔţţŢNŠŃ´,7~í{EĄú¸€‡ŮľîuwýÄ'żő·źţ7o|ë»Ţ•@Ç5»đáNý;ŕéo?÷{îË-Fę-ń@}BÔ— Ě↾TŤç¬Ë‚u·`ꀗGéIŔTxYŔ‡ÉR˘Ř*ËͲá r3CNź Ď–c?q €F­Jjíí¨ ¤QYE'řÜ'¬ů0b‹$őe,J¦ Ă´›ÝÓť'¸ nÎďĎ„`ą™HřL’$@7źZŤŮţáą=łó µĄ ‚ ŢsĎţľŔçĘWO·ĘŤď:gŃěîňŕ'>ńřŻ<ô­ŁŁży×;éżb ËňŔţčß?ůÄÝ௿ń|Ţ1Ý»·KŕÎViĎ»˙Ý#†z©/j’tZDßLă*é6U¦$Cşwř6ËéŤ ÁěCĺ¦ę” ¤¸_Ş~0,@i’ Ô„ü#ŃMüÉ«~¬Ą¦mBńcŃČ!’Ć…đ2ťj•ú۬$0I|Ât ex §Ą*«úîN’×í,~ާę$aŰ6Äé†VÚEŤ×™ l™»ÝICŹwˇ•Ŕs»źk`{ËŻźMÎEĹJYËáŽB·÷|çŻţůŢn÷|o·ýB˝µI*ČăˇŕťG×?űž«GGĎĽëł×ŽžzŹA b{çĘŢ´ąřä“_~âżýć7˙ö7^Ľvőů_n¶Z/ŰäÝmZ÷˙ {ŔŘSoá§žz`Éţé–xôM  ; ĎHä5.9›*ä¬<ícQšTĹđA>Ô„­Âj-ŢPń·¨ń@d3<äĺĹE´tłŇĺ ©‡JÓ0Vf˛+EÖ`‘Ń7¨kşg„•2—éŞi7ă]€cż Ő`Š’×Z8 7Y}×OĂjRUđüÄ+ŢěfdE\Ĺhç{MyřđGšćVX<łă`cú+‹LO¦#SIĨâ|qpĎwţßź?ňÚ]Ż˙łşUÁę,Ű`źiłµ»;î>űžŁë_ýе·ľőžoÝşöÎźú‰i7öŻÔűŹ>ůžxňéźzsńšO˝ř Wż8n¦ű‡‡»ň×=×@oěĐ»H˝/€zhqöY©.Uq‰A ÍŃŁY|˙gqK™q÷}©űűKü˛Đň„}Ĺ”q,bĆ”ˇ-ţF!ö’˙ŤąŞńHODFÄÄv¸ŹÇcbÁźŤ/E˘Eé"7“qLyî™qnŔš§Ř猥bƸŢĆcn/g±Fă1Ô8sC|[’} ĘśaďNŘ‚—ţ.@_™ŢЦ3U(ď˛;ć~Š¬ŕ Ľk UWÁđ€Ŕ/ÉÓ¸9M· UŢ;»Eđć3ţ6úN‹{…ö…ŞDŢĄgTžÖhí˙_üéţ‡7´îż{ĚŐŰŰ­ ~_űęoüÍw˝÷čÖ‹zü¨yć7_şuăKďúä'ţyÁµnVĹěćáî´yô O|ůɧßÜ6ĺ‹×_|ńę«fëfÓ= @zęóîDűßé·T ţ˝ů÷uźű/ž0ix“F«î/m]Ř?ĄŻlTü„ą/rżś‚Aë>}5âQú»exşóŘw@Ŕ4 ˇ ~ÜÁń|/Őż"äź oĄřJ®7@ë»Ű€áI°X†§ąmţč­Ł—üü;î 7Ď=ö'E¸ë…CkÚϵö˙/ţôŹţđwym«u«Ű[•_(!cŃě¸ë˝/|ó}_˝uý©Ýúę§ŻÝ:ú̧Źn<+e±qîáéĂűyâ‰'żţÜ ď(>ztăú‹×żRÜ;}řÜ9}7§€V˙÷vĽţ×ő©§>W˙±ďélCô•ü7T… ¨2zs,ńó§}ąPTTrRĽ§öţbó?ŇQs ©Zç7 ·‚ˇ?BP €í,…q}®Ş.ŤŞ„©Ó2$,ĚJxiżˇ;9tŃČ˝žR§ęšř.@z›ˇŘÜ;,>ú¶Ł—^đ0yč oôŹ^ξϯ.Lrö˙ţáýť÷?ň†Nű·§Ó­˛µÁĽ–鿊ćĘŻ˙ŇŃK_ůŕŃѵ÷ľtë[_Ľqë»xćÖŤ*řis]8°˙ĺ'ź|ú/^żqă¨E€kźŰß9{ˇĐ|¶ţÇ•°ţßę˙cu ď©÷‡.¸lËld2|śÇ÷=éĆěGŤ»LçOűré]2ő®ÖşxOíýĹć¸čŹŚ0SjĂ™¸q&´t|¦¦[ă?dC¤OÂüߌÓÉç/Ă…yŔ‚oĂYŕ»âtˇ¸ëîóÓý W_xÎż 0yđ‰˙Tře€dź'č”އ¤ ˙Ôę˙űß˙Čk;l€ËÉ:Ľxę,˙—nÝxük·ţďăGGO}äĆѵD_‹ł“Ý/ůé箾xăúŤŁWżtĐę9ćę3‹€L¦LËč :ťVÇ'Üđ íÔą8î.¸wd 5Lśk÷Ť_ä ŻűŰ€Çq>|ä€gE,Fm)P—J~f<(  źÄçŻč6`SęŠűţôó_ŔĎ|á ?!L2cńEú ŇďůÎź˙Çů‹żřö·żýú—Ţ˙Č?nŐkZ]ökT­0 đ+OÝzń+ş~ă©Ď5Ď<~ăÖ{ź9şńh‘¨Uńpuë»_ţúÓĎ_˝~˝µ˙źßoĆ—Ô:nČW¸+{~úďg˙ŢţőžPšŢKۨbJ›. Í+mönK°%]ßyiÇur—!tĽŞGE÷(CţË”#żÜgéŚ'˙0{[üd¬Ś™ń˛2RŇ“|•_¬Ž •Ţ4/v dňUĹŻuI ˝ÔĐֹƨ»öQŕ ·w˙“.?ř…/| đ÷o†ńü$Ł˘ Č{ľóż~éľ©ßÄ~6˝ŻE€×nM§U°ÁĄ%O|Ď{˙öčÚ'żzëĄĎÜúÚgŹ®ŕčĆ˙(¤_ă_1ŰąwÚě}çÉż~î…«/<˙âAsůâţ•˘âúb»‹jŰ]ŮąÖÂŻ(ęćŻ4  ö:ĐJ.!ÉŁôXŮí04¦ýYă˙&+{JĎUJďJ’^QE°Ł3TţaOŠäŢ*e·Žůň Žg_Ź(őmPźN@.o ĺĚĽ hń!žŃ{Ľü(ek¸;HEoTIĘŤ‚;ć·˝D‹űo^yŰgšý]wńÁ/|ęzÝ=Éł»:h-ś0[Ęe sĎ_ýď_úÉéŢÁţAű·żýÖΨ¶*¶Á¬%y˙â×˙Ŕő[ßüŔS÷ą_űâő/}öčŇ Đ>_¤¸˛żżwďxvpxxő…šĆ]|ôćf…âÁ7®¨¦ővśý·ˇÚÚ*/źí€dxälŁ´í‡^P2ˇ*Ěܨ6Guýü3ćĺ[ٞő@);«GđŃŰ$Xo®JŢn'áŇÔ΄äÍ$sV%Čt÷Ó´u•[uô5˛§ó?ĂŰâ±ý›Ęă Ůš9úŠ·Ďű.@¬r‹ÖÄ)!‹a#‰AnŐ˝@Ŕě®Ŕ]ŽnPrőĂÍîŁg|řWß»˛÷¶3­ú§[ęˇv”ę€yîůg_ąŮ=ŽßţíM^wĎ:\ćÖZ …łźşńw_ůĐ­ŹţĆç®í~ćč#_=úŔ˝É›šĹÎ~Îß7ÚîîSîm]|ÓĹæ{€XŰ”®(ŠÉt{»E€đĂĄL=‡ Łx¦^6ÚäOÔ Z\S©3Ĺ«¸ýĂžľŠ»¤‰ońĆĺÚŠF·d¸Vg¤´ Ç0PK„č\ň6Ô7dÔ]\uÇř3<—śOżDţĐ%´'Î˙…X@2žÂý· ŔvX„Ň|+‰§ň$ŕřdwȸ[+$—řÓ]1I‰V©Ć` ÔÍŮ(čWŚ”0ťIk‹ťC÷ŔáAyé7ű÷ľřÝÝ+ˇÍ-éŕ¶Tf Zqv´ÓţúŰö-7oî•g¶6[ Ľ|9®Ă‹G]4Î?ĄóŻßóĚŤżűĚgn\űÜK_űę·ľůĚă׿ôSň(0 KŃŞ˙öůâM6î˝páü˝gň\qaűŕp–¬x-TáWT+Ż˙—çܞÚ6ŇLe¶H&˘cź‘ d žXť3oÓ©ŘŞ˛%ú"›ţl+…2zAŤLÚOŃYŐÉčҬýůŻ ş/7ľ4éâ]űí|´ W>2ü‰T:`+háßÚbńCÁ‚űÝ:Ęăn 2Ëž€i"ŰĐ‘Ŕ GÇ»jÖLŔýÂóÄqG X¤ŘęťżPű÷vwęű·¶§ŰĺŮkIKtL„”ŤjďćŰß÷·_úwo9ÜŤ2ŢŞ`ś…K٢™Íţá?iíôCďşvëĆS|éĎžúÁ3ßţĎ_ŰĄômŔâ\Y^čžAŮŘ;<¸ąww/ęMĄŰČlí[;Ş:ýßl?‘z>$ČšsĆJĚ FSÎ EŽy#¨2 wŇôŠzifÇĘ,O‚ĆÉ`Yń+vâHX y©XŚRťö7!Űś°0 ŢEŔŰ˙6j4îą‘ Çpđ1r#»Si§.Ńă°ĘŠ…ŞôÄű$ľĎżźč[ńłźŠňNy^žďm°"śŔ™qú]Ş˘™á˛k1VŢđľőáÁö™3oÝş˛»seëŢןyôO¶?ş}fľ0CDi’ZěŘk~őoľđńßřŮfŻôŻ\–ť ţľ™T´@·řv=ť>ôÉ—n=óľŻ_űöµ«×ž{îĂ–Ó÷‹ű.„ÇÎků żP\8göud†|{ÇÁÔÍHő=ó(€µ •5őIe$LÝó#GszďČŁÖüŽ,*2lôB1ŔËýa›čP1ďË’5ÂŻiJ0^éÎÝy#Ź]PĐe§ÍťŤšN×ÝaÂé.&Ěn›ÝJŔT~âP#EDcʸŕ÷<.ř€kđýfUě…ICnĘLVŘł°Ĺ›µîŔîţöëËęě]—¸˙â]gŞęĚč±í3F픟óIhŕćżýÎÇ˙ř·~¶ó._îR˝ –g»E}1„ŃĹŃď{ćč+yőúŃ­ŁëĎż˝Ť“é×w÷->8h†]AĄ'6qVâ!ŕaCÝv´ /6<Ôć-gfDşď ˙Ë@˘|Eřy¨ąMCŰő :Ó@ňĽGĂ{oáôăqOŢŇ ÷»îXiłYzŽ1|`â'A˙}č¦×ł¨Ň€QŚv3Żň㙏ěľĂŔÄjç°a`´ĺ*;óh\|‚`ăx»ËL"{€étŘĐćßá›oŔÇ×0ILRň6 Ĺ–lKÚYŁ3Ýá®ýťŮwďîbΞy˝đ•»´CDH鎀ĎęŹëçš˝N Ç“Ëa^ĐOv] Ż{čs_áčVsëÖ‹źč®­Y•rEqppp7oůovł7蔣n+ÎŚ`){Ţ@Gd•]wÖK?"1“J Y ,q Ŕ@@čŠUZ¶ő‹3x |U…)Á ŕ;ĹÄĽ:Ő=QćÎUgx`•¨C€Qř9öĄŮ$Şű¬sfłYĐąŕtqí÷¸ťűדpěP#NţůdŔ€ŃhŤÇS§¦ššžU"ĺ­ú¸pvśß ±÷O˘ j˙ ÄĹ[ö4”´·J…íŻř¶aŐęUĎ8n3o‚űš?»ňؕ׏Y\óex3'ŐYÝŔO˙÷?î<€=/éŹ.\˛kÔŘ~Zî~ćżuŹřľôÂ/ŘŰ•ůn۱ýŃŮ?˛TSqŤ!ˇ.}“83Č׆íĹ8W®Ż ďaAg /%­ř@ĺEŁĎ\ňu *MÖ˝Dŕ§´>IDATÁ‚[‚Ňa=žđŻÔń:€äÔw‹nĚ×Ń·“Y@řĂ·#O1L:Ŕ  …vŰ•ČóëŔmĚřd[‚ĺîťa™­śŞ*Ú„’–|č‡ Ş&ů–¶/Ł5ä=†Š©şÍMëöcőö]Áę´¬ÍĚ›Đ.sçüôoüîďţF€¨„í,\nKw ™˘řä7Ż]űÖ{ő3€FS[˙Ö3Ż;sAŰdĂ€vÜőďuaZ«nFżyXčöy÷čR9D8¬ńK3—‚ťu ě @3ŠEEÖ í5‘KúaůË÷ŔśµĹ 6G-Ë2č§ę6}¤ž*Ć]~â0‹9-ݰĚÉ`áź›Q÷Çtöd«Üŕŕóˇ¸z nëWVń 1żä_Jľ†ŁřBP*ě¸öŚsÚWÜQŃŠ |€ŕLâßMşs×ů˙Ľ4ŕ`ýĎ Ŕ0ßD+> °ĺp,ą‰´zƤŻ`?;Íş4›łÜ `w–ż `ş»¤gxSŕÉ])»ĽÇď27ça ŕ k€Ą”u$?ü= §rtVćög)-z˙ś1cdFlJ BŁ? ŠsšVŐ˛ŞŇź+ç4ÄvÓ¸äQ€DCÂŇ ˛źók]fÚ¨zKk“J^’E%öű÷erUÚÓÔŮŐç <0ńú?Ó]vŃjĐě6ul'ůś ÷ͶßsŃy ˙ůîMQ čdtŕŞŇwĘĚYW?ÍiŃľ;‡OĚ‚ň,„ŠÍ" .'®ŢᵝSćb é«“×™Í8ůH+¬’±ĂŹ&eâJÄ jCĽ“Ž\¶Ţ”ökYĹ´üË@ŠŃRů)9mM.Ë$•ĹĂŔm'7łÄÓtíyŇ ťp‰•śö˛Á›Y­}—ŇL=ç…K@Ă{Ň?óD+š-ýĂ Ë5“ŘšĄi2Ŕţ$N2Ŕ(šđzÝ.’ß j6őrOş' t€ÉY%¶ ŃH r-ńP…řRH "č'ÝSâźę…wąFs †pŔHž>¨DHd9ć)9űK©É{8eÁÂćÔÎ{Ć9OÔS /ČÍő™b9a±}XÚv¨ęâŚ7ĽŽ’lş7÷Ĺîâfv1†^dĺMđĆ*†ňňţ}¸Ý ˝ăże#=Ţ3/žúRY[`:Ýšú-¦!lÁw8á¤ix${ş lé“őoyŽ…F{ˇß0•b ä•ŐcĽ $ä=D’ÔąxŘL¸čńŤ’j»KíP|!żLPUn+k Í…H›šÎ ŐѧčŞi=şL'Ir™Ěަ¦XÚ4Ů»Ý`›…‘źTŚ(źjlÁ5/›PĆÝşWÚŹăý‰bčvňuĽžu/gÓU6`Ůz€ďŽ!ÚG‰·6˛ aĘ:Čč•zP[ý ŻŇt÷×ĆŁ€+‹>S‚ €?É]€%)¦Ě” ¦V+'ÍJB\AX°Y˛­©nn™G?“Ő*ťŐŃÍä'ćĄň|„éwSÖŔĄîŁ˙ÖEÁ!LŞśO}C•†‚¶ă¨q…vĽĘPY9žŁ/«0•ź-Ęȧ‹ňÚRëýžG·E›Rřý,BN‡fřq=WV—–ÝOÍ—ť1KJ@âŕĎâ™”UşaMš?7wbábkÆspv.I]>śÓ•őDž‹dÎť”dţXë*mWoRó9É=7'í•đJ!+[:ę\^‘lA“ŚŔ+á•đJřűţ?ˇ«#‡yîIEND®B`‚fox1.6-1.6.57/doc/screenshots/emso_screen.png000066400000000000000000003004671326741342000207640ustar00rootroot00000000000000‰PNG  IHDRâČ#3g IDATxśě˝LWšďýeŢćęT„GU‘ł˘"犊śyÝíx”ĐŹ.íÉj ăčv¤€)ĆÉU ÉhńhLăh x޵!Ń;1Žnl&ą7Ë’”4 pĽ´W¦c]V’ú­1x%»­[/­‘BÎÄLşŤ÷1ąľZ iĆđżLFcjÂVĆMnéHM$ťôeĐáBÍNĹłYB1b1­ďrLźâóţÚ“N:餓N:餯”nżd.Ę•@ąl%ŤĆ~v Ç~ó˙({ĽF˙+źŽý_ÖŰ#×ŐŹ/EďÜář`ßiÂÖ4‰™t+ł÷˙ë«`äŞ:ü˙ÄnßŃ˙Oîă˙ÉmÝWjâbéŃ“T–®~ŇWµî2]á[“ę˙g>R*ɲ°Qdá›wĚ˙śçמtŇI'ťtŇI'}ôŮîŠůřň¶ţĺ˙űíc˙Uü@‘\˙eăh( ¸`ŻX›®ÄĆ®«†É3LŔRs»ĹŔJ©(X#‡đWZtBŤ~©Ű™S%©„5żě•6Cٱ±°ĘMdÚ’d|kŢrärŻ5މ}®őÔŠď9!YŕRYăó>iF®«—Łö÷ßůC I’$I’$I®[YżŰí}\\0Ld—á›ęŕ•1Ű‹¨yF™kń¶.¸ch}Ů/l_u_ř/aX1±«-"Q­çBŕ0÷m.u»%w™(•7¸÷כࡨ›t‰KĚŞß6yü†Ö9šĎĘĹb-¨ĐúKu( b±şIQ†´đ:—ZW6˛Ć>íF>Ť…Ż«™ň‹YË_ˉĐ2ŰYłÇ»­Ź…Ő,y*źqkş>z=ž§ćĹ»Y6 ĺDhŮě\ îŢ$6ěó Á!ŤsÖ7yöď‚tŇI'ťtŇI_ŹzđUŻ\"€ Ŕ¸ŕ¦0 á![ŚÁ;Ţ Lěz‚Ż–Ďµ864Ď˝u«¸Ľ‘ů \‰µžP‹PÖ<ëÂ}ß ©:źiŕŢ$Ö>ٰ&–‚Ć=pÓ°Úŕś&†ŻÄ˘·ugAKJ%¬ë°ß0ĐóáxlR‡˝ĺ:­rdČ*Ç\Şb˛R—lĄŚ™±đŃz˱óë+w)Iů•˛Ň–=p0Őz/„•MĄ-<ę·FÇ{cVNˇDěz͇b4˛‘Őîv+ĄЎ}k„nęĂWŁVNŹ»´ňiE) 6ˇ ŽĆÔ;<˙^Č"‚‡ü’RĹJD÷6oĺßUÚ÷Nęr©|Ĺ'=VU÷BsÚz¤4T{»~7f§Ô>ُ7‹˛$˘Úŕ•¦ëÎ'`܇®Ń }äjLăHcŰFÖřĽo×s-ňCJŮfwín·»L”JTx9j•’D±ő%÷Ţź÷—•)VŮÉ;±ß6d±¶eăó^ĎcŇČÚwiśąî$I’$I’$׳l~É+•0ć Ě:ÓŇ0:7,/\ăč9â.ÁéE4νř[·‹×W»ý^€RŃ31ˇ~ĎŠý˙JSďp{ôă‡ü¬ î÷!°ř[ÜäŚ1€Ë2K*hIŻ[ľ©Foëçăś§ŐsfȢŹAŔ&¸šH®†đµ75}YČŰjĄÇâ˙ízv˙Řč°5Ńt}ň«•ßű¤ę€ţ3Ý0Ńř‚oüfĚWŮ"o«ß˙óÎáŃáčÍqιϭ4ţwĎČŐ¨'Đčń7 ŹŽ4żŕ‹?óĽű.ÔT7¸·řąeˇ»VRŞv&oÇęź‘ő)ĂJ‡‰Lő0SJ…áËv:s±Ž“ýžŠĆ]϶p®Öí–9‡ł~ŹŻöŕĎ;ÁµÖ—˝‚ ©u¶+#Ѝ·Ő˛27Ŕ ďz*vŐ´p®ÖíQ¸®L˝ŁÇ&ą» ÜŚ—őnöÚÖÎűó]f}đJ €»LL ¬“żŘ$I’$I’$Éő)'器ipnö‘âĹ ¸Ŕ÷ż6yG×§80«†y_`ëvńáѸW|˝˘l“č˛^Xôa ‚˝š —J˛(0Ƹ Ń%Ä۸‰ 787ąT"ĘąTő(hU˘”2±I &tΙ śkĚ%¤Ő!{†Lzt¬?|Ľ±Xx§§ô­žŘ—Şv;Ě+*p´WCxD¶<ݤ˛Üd8G`ĎŃ%pÓ°ćz­ÇÔa¸¦:0x9ĆDŃ˙„wđR¸ń€€$2A@ËŃN©Ôx¦‚C¸­r&j~Z:đŹ‘–·:˝Ţri“;üÂ7#•ŰĹÓbĄĄ|ú˙–ŕ&8×dS¶>°@ő!‘ ˇĄÉ˘T·ÇíŢ"ÁÄŘ_ÔŢKQ4>ďF1F>Š%bďĹhô+ŢóQ8z=VúOŢX:|UďxÝ3vĄCy©ÁYż>et˙.ÜúŞP±ťťľ+gŮěÝ"őľ5(or[¶ő^ŕccQE °62¦yĆF‡˝•Ě%„żŇkž)o91ěvűtÎ%‘%¬ťĂgş˛:ç\Ó Y¸ €Ëŕü]N:餓N:éëS×tkZÜäŚÍřĆ–dt®1¸¦k:ç˘5%ź¨ÇYüÁ@:ľůć»ŮĹglH->==m·ţŕ÷ČR<6©j$ u?őŹť‹b:L8 @ @EĆÁ™É8 ‚q?ţs Oô@ÂűÇL%îÍ2î#úĄÎą—]Č'[i±XĹM6#Ň&··´RťźÜ$ëvú,]©ř,ţˇş’s}GĆ_«ë~8°ĄFdţçk ŢÖŤ{8uĽ1cęm]ç`˘(n”Ą&IBĎą~ełWŢä†K€i„żÄjß›GűĹňŠĽú‚¸Żśj!Lv*Ú·†®OrnC„Őnnňۢqmč\0đ8ů“Öy&Üő żď'Y‰Ŕ˝Í/or»˝ĺ–UĺŰ”Řךzg‚sÇŕcs!üĄq`źŻéHŻX^iŰf-3Ť\ )î€m­w{¦—ŕuËV…^SডŞFĺŹu2¦(nűyÎę×jęH”MRô+•1 €ówA:餓N:餯O=¦NúW´)]`Ś›†ŕ ‚ –ä0hSşT"ĆT&‡)°ëqOëý§+>cCjń˘˘˘é˙6 <đ@QÎâŃ Ő/ÉÂFb0©%웑J{řáôckś!–0¸ kŐY\*€čm ¦5<Č%sfH+MÔ|*ü@)‡!•ş'ÍÉôÉQµĚ=fržj€ÉÜúóůřč č˙ÇČđhĚZĐďčŃŻôňmr…Wü—x7ť-'C~/oŘă–e)Óz>ŠĆ&5Ć€Říâ®´ŰŇt.ЦÔ4­§“†ńü–…ˇł`’´Şj4˝uŽ11ń¤Ŕ\đ¸Ą@u‡Ć Ź·fpTkŘçîů]·XZ .毨‹Wßf”?!WýX®mîa%Ąö'Čą—Ăćbđ)Ýił JÖ3\,©/友U?V¬ ąiĐu]Ú čú¤łNV…śĽŁ{79¸—Ő $I’$I’$ąžĄ>nr€&DS0L»p† ‚ar€q“ëS†a‚Ů.. ú”aż{wš±řŔ‚s¨ş)ĹÓ´~÷îô(ú/E‰ đů­»YŠw˙nÜď­ŔMÄ}vibT]g.p“ßşu÷ŃGD ·nÝĺ&JĆu1ć,n­Gđ) ŻČŠ<ł%KĂ´f™gĄ.(1€)±SŽďóvä±Ęěz¶Éž Öt.oň––ú¬—ĂWŐ†*•MĄUzdYI|0|bR‹^ ľ=,ąŚ®c Ť/¸~9¬ŠYgö”3ŚűŕS:źŠ‡c[éCď×Zµu˝?>ú©j§Űsĺ|f?:v<Űbśs®sV”m™™{Ć„oŽy·×Ŕ„ŞëňCRěvĚ;»»ţЧ•Ćç}Ťo Ť\q{+íz8\ ›CŠÍÚ”@,a0™łÎЧĺĆç}Ťo $*Ś FÜâř§3ÓĘʇîä-Mŕ> ”0–î×A’$I’$I’\oRŐuÜä Ś›3 ł6“Cŕ¦aůߪë0;v58‹[î{*źEľqĎŇúwť~ŕű3•|óďßi:Oj=© qŇż6ç0“%çŕĚĹ đoţý»$űîŢý΋i:×ďpđäâ†.& ÎsČśŇIşî.58w:ó3;&ź1ÔLW›ÔE9 >倲­R”$¦áCźĆ”ŇŇđÍXô‹1Q,µ­˛`˘˘”‹J`řŞ®<"Ţ#±Űšö­QłÇĎďév+ţírřÓ\ĚŔ¬Ö/HJ•¤Tuţ¦Mý::csÂ#wZ¨ŢŃĺGŠ»Ň[^çŢ^Ăh[89©P6•Â%śK"Ó4#áy;ę1ap^ůßÜŤű|[űú/śS8WfŮV.‡ţ’lsl’”ÇdŤĎô®ňÇJ˘Â~eK€•VşĽ‘E'T¸•“›iZ)|i-¬E'&arëi$I’$I’$Éő&9Ź;Đg€í÷'$Î\,>őiBăÜYłxZď@Rńě­Ď*®ő$iÁM`ç–Łfëę>>ˇZk ÚżëÜýë47­ÝN<6©©“*7t«¸]Éä¤űp—I–ąŮeÎ ©r<ÜĐű{ÂOĂ};ÜňÓvÇ»Ěů@2ŐŔ$&Â%J%"\ ®cTý|¸ö•NĆJ™+ľMHĄú=nI”ŕ‚T"ŐěvÇľÖt}’OˇçŁhË«őňR€I%¬~ŹŰ»En9Ń'ŠĄ©íşËxwp—R’Bęca.ĚŘf§kSe r©hço¨v×íńě˙eďđĺA··’m(›y.ë>8ćŢ"wĽęw—I-Ç{SmßTO{ů=ÝJ©ß㮫öěýeďđĺAĺńJůˇ2;§×-Ť\Ť˛1{ż \ĘE““7ോÉů» ťtŇI'ťtŇ×§ßŔĹ8Äăă2žÎ™ Ş®óűł}lgńÔąuźßş›TÜiCRëIaÄţÍ©­§vs%¶íkńP8\ÖÁ‘ŕśĂd#ףţ- ŔaB7ąµßč»ď¦ąiŘľăH8ŞËĹ’ř‰“v%ˇ›1Eń”{ĺЧŞnp`Ĺ,­ {†T=ú†Ň~¦.p“wdUd&ây88¬%;=QÖš™Vo ŘOmdLm91±ô{ĹP¶T˛b?TŕSFi©pęWĺÖřc7ŐúC=`"€ÁŃhl2Ö¸Ď×ń Ĺ0ţBÝű?z˘7Ăňć7y>ýšiĹäÜ€=JÓďq&Ěä—7Τwľ;~čyů“ŢÂđżÄ‚ÇşEQŽ©zߥČgçŕÚŢ …>Uë«=N7ń„üuVýjt€a`rRůK¬éHOl"šjsďĄhđĄĘŢ Ý’ r ŐCÎ _ĐďqQ˝ŹËwłŮzćŇĆYĎsNźďJél+-PŚX,,–ČÜĹabÖď‚tŇI'ťtŇI_§:¸ ‰1ĂÄĂ“>DöÖ˙ľË“ýśsŘő€Ďp÷îwN'ţîÝďô)n…\ÚĹť®uÚÖďŢý.áÁďŘúčI­;‹łÄĆn˘hzz:ár¸LŔeß"Ýl¬óÖüŘmyĚĚĆ\`tÓ€ őŽľ˙­^CŐ%QaJť•x·Č=GýÚ·ŘőJ_âDĹĚą2¤Čş©Ţ¶Ń‘öcm/5”ţrXşÇśďŞ˛ÎżŤ°‡<˛*j“Q©ÔťTÁu}bŘů1±L*ő¦®5,?^çĚoLéúİĽĄÎç·Ç9ź´zĘX)+ő .–¨SŐ'Łŕ:\`¬”mô%bž=*}DččwôľKj˙•¨ma’%0á´pĆ€‰Š´ŃkĺŃ –– ˘¬ŢěOúvŠ›ë`:ž€‹ÁĹX‰ĚD·ŔXŞ…§Žř{?)Z)ę)n© đňű<řV§¸ąRk~Ĺ[ů´ÂőíMíEÁĘŐî–ľ+±Î}`2DG†”ß餓N:餓ľntÝŚýߍ0ŕŃ˙š&>Ŕ­oî2`×Ď{Ř=Ć$©GÇLń¸SťČ˙îŻÓÜ4¸imńwwŘÚúÝ»ßY'1—`Ĺ$·>» ˇŹëČŢĆřŔWÝ—¶ÜÔ™d4ěń×üŘËűŠÄçF˙?‡{/…ÔXŚADŮz×ÉŮ㕾ÍRׇă=…“ÂŇé93Ěč-_ vm®›ÜîUJß 3MLÍĂő(ż8×#Ą? ΩţŃąÉůí¸+Q¨¬¸=N]`ĚĐCÜTX‰”)Źü‹}†ÉŘĆDŘôť(źR.–UN_˛é.Ś÷7Hj_ŠŢł)ßj‚ ‚ Ö'š9ÝČ\ĚöŠăÓęÖŤż.pnp0ą˙•3V"NqăëHŰľg'ĄŢvµoüí`Ó;ýĂŁŃčÄ$L„żR˙yĽéťţŕŰ˝±pSdm»O*>x%Šb4îó)˛“°F-iô´‰™ő®Í50yé%.ľŘÉ4–6ÝbYĄ¸ą¦ô‰ŕ\ë_ť‰e•bi€‰J!ŘăÔŤ)拇CdČŁŞ|fčbŤnE·X7U®¸ýů~Ż^H%UÇŻŹÂ%ĹW®Ňý:H’$I’$I’ëMę<~B&0#ą Î 7ă+±Içú¬ŢnΧř[OíćbńewŻf€;%¬Ŕ“Ăä:ŹqÓ€ Ö}Rŕś™&ŔD±D—¶řÉĂţŞ %ňĄ¶˙ŤamJµ5ŕNť©‰ůčúÄ0wÄüÚ:×#â-ó«“ôő©7>_Ţň’ĹP*zÁU0I`Ě bHýu$I’$I’$×›ÔąĘMůŔŤR¦ Drz*ŹÍµř[OęB䲵ŘäŮÝg\p1§É9Ŕů” “sS‹űM. .kq Śe*.•gŹ|ۤŘ×FSűH$:[‘éI’\ t®¬ý©‚b^EĂ`˘Ŕ$őC I’$I’$I®c @›R15ÉąĘsé%“QR*•ČI^Ä\‹/°ő¤.Ä®4Ŕ Tô¦qŚô’ÇMřLĚ%,Ł_•(.?Äş~đ{eÜÇĐżÄ:ĎŚ«_Or ‚-8_’$ąLŇ%Ôîö¶ľä—DXŢôĆȬ]mi$I’$I’$Éő)€sn ~H`–ĚŚ1!ľ1eV s,ľŔÖg§[i[CbđLo^=źÓ<ýěĚÁCĺ ?ó ´oŤĐM&©ĹŁŞ§¬Mđ… JúZÖÝŠXşQKEw™$0t%Öt|OĹŕšíýĎőkO’$I’$I’$ąü2w%6šĽĐ“Ď&é9íÔOÉ ů!±ńyŻ÷qŮóXâ$™ű@qBIJářĘ \Žô_ŽŤŚ3&ÁĹKâ@<Ä~a*¤“N:餓N:éËŁČ™ÍĚÄ(˝Öą$ňË–9łÉH"óz†o‹u@)`°2%IréĄ~‡GokꤋE­as1k˝ űÚ“$I’$I’$I.żĚí®ÄFá\Ë;ânPb ‘IĎ™!źĚ/r¸uĺć“Nú2éöí€uä˙Âżö¤“N:餓N:éˬç“M bV ŔήĆ=3ĺ ‚ ‚ ‚X´*;»bW[HŰ­™Ďřm-‡+iAAA‹J׉$Ľ},±őĚemB$Z)ă‚ ‚ ‚X ËŢŤďY˙łÇAAA¬1śŢ~|ŕAA±–°˝}N+AA±ćqĆĐ AAA¬q(€ ‚ ‚ Ö@AAëyĆčş¶Ő·ŁęązëżŃ«!}JŰ˙J“őÖŽźěZă’Ziz#ůj]×vŞŘ­sÎ{ÎôÎŻąxC5őÎFó7u±z˝(ö,®IÝďővžě¶ôÁ‹Ă[};8ŹIvümUô«ýüó˛*Pµ(VĺnČŃý,í.ĹgGAQ°d» ;b ú¸Ď™rţýS‹n_j+˛IVëśý 6ľÜ0ʶ¬†t]«ŞŮźOŁKMáŘăÂ×ýn—ĄŹ]»w‡ĂăĺĺţÉŰ*çÜ˝YÁŇ|úAAĢłh1i§Qc·ŐýšŞž«ßűâÁŘDlŢV&ŤF«jj÷Öěý°?©őúMş®Ďu˛< śóýVŐÔW=Wż˙•¦ÉŰŞ•Ţs¦wWe­Ő5ýŽćĚßôz‹µ ‘)ωFc{ëę«jęľŇ¤ëZ–D›ZâőşŁ_MXłţ‘/ĆĽPú4 —?á…ăů[J÷;={ëęwUֆ݇ć%dimîż0ŘýN€±±ĐVߎÉ;€ýŻ4…ĂŃ9?¦ĚdúZZĆ·ý¦{Ń?2‚ ‚ ÂÁéíĎm@źâ¶“=Ôź~~şíH[ëŃV÷feôj¨óD÷ŮÓsž$v¶Řéo~­@Ë[-Ż5WTřSwűôť;µ¸óĺĚĹN˝}R%ŁWCÁÝgŰĹ9?}ćÜgü„1&ô) €®kMoĽYł§¦¦ş25ĎbŃňV°ĺŐF«űÝoźn?Öš)Ńbá–0ĆÜ[Üáđ¸˘(’(ű·{ű?ěľöm÷&eÖ§¸ďGŢć_4Ž^é~·çüg‘á#Kµą|»÷Í‹@cčOa÷ăîĐŘXÍîĘŘW1ď6÷<”óËăěuŇײëx»łHŕéňö_5÷śéíüí铎ÇHA±6pĆÄy®äÜśĂ9ߌ¶‰oÜće_j+śó‰‰‰Š ?€ĘÝ•ý ΫâĽq!ŤöĽwNăLčS:Ćw‹»éŤ˙örď>Ż× €›¨?pĐrs3ĺY8IÝ?x¨)S˘Í˘XRľÝú4¬ŢŃË·{EQҸÁ9}:^÷|MRNĆXĹN?·×;Ůťjžő‘ĄµY)SÔ;ş>ĹÇ®‡›_;0|yT.•Ý[”Äwsn8ż<ÖN*äüZşé1AA¬ ćĚ…BŘLż L45·ť˙ŕ¬{ł»­îń •|ţłŃh4|3Úý^ʞIn~ý\đ=îą:jy©yÚŹ®ŘtňÂ-ń˙ČŰóŢ9]Ó+wWđ=îľ2˘Oénwňp‚ąĘÜWü?ňŽ\a.”o÷wśě)•KýŰËç\KV’ľ–©;¦‚ ‚ Ö0ĚĹ ‚,ú=Öľ‘ÁKĂÖËčŤĹŮĆÍ+++˝0|y8ĺ]Á> fQŕ&ç&—7Š/$VLLNŞn·»n_MëkŤăźŽ`€µńćÍ#ť™ň,ś¤îűźđeJśa1,ńz}Ń/˘ˇOÇ­Ý8ĺŰ˝=gz­€ąÚśĄ#Ę·ű{Îôz·{á‚\*^.Ú—©ćyăki"ăc$‚ ‚Xp“ ‰ŰĹ_č:Ń<ÖŮűaçÜ÷¸űä¶ŽąÖŕÜĆ­lRN˝Ý ë×Á–Ö`Ď{=^o˛‹Ć«ü»Ŕ®gkËëř ś0Ćš_=TőÜ~yŁ\ľ3>Í9o9ܦq€ŕ‚żš9ź´ýhkçoşß<l=Úś)ĎéúuG[{°ëÝY”şN´gIĚimţ0Ć”Ín¸`řĽŢÉŰ“őű’÷˙d¶9ÍG–Öfą·­}Ň˙´ßŇĂ §.2,¤Żeëáfű-±„…ţ4ÖőnŹŔ„łoź\Üv ‚ ‚ ćb(MOOË;š«Ńr8 ‡VŘ:‚XFt]«zvďµ?~˛Ň†AA, ĂWFZĺňu,@ŢÖ8‡€­ľI)źŹ_[tS[Y˘†V¤ąśŽ=i-q˛‚O)™l.@S ‚ ‚ –ç=s8hyĽ¨eöŐ Í5,{ Ç’ü™‡Í˘(Ńô?AAk§·vŽ ‚ ‚ ‚XK8ďXäS€‚ ‚ ‚(4ś÷Đ AAA¬qśŢ>­AAÄÇéíĎ:¨ëÄśĎě'‚ ‚ ˘ŔqĆĚśÔrxŃn­"‚ ‚ ˘ppĆ̬Đ`AA±&ˇ‚ ‚ ‚XGĐ=AA±ŽH”i«oG¦ňźŹ_óxwDÂŮn]Ľ4b×<ÓŢl˝ł˝s5^7»ĚÄ&TĄL^i+V »űëü9AA,„ô1©ůŇzçďŽHŘ©§÷ŕŰŢj0==ťÉ‘«#ťíťs°:ÁÖ§v€™Ţ<›Ř„šg……ďV®yß7{=^˙ĐĹĄLöxý©BA1‹Č´`M˙oőíHu˛‹Š0=˝€Ç»Ł¨@š<ÚÝ<şřÇ 9MÚúÔŽĎ˙|-­‘NŞŞkÓ¦]¨Ş®ş8°*ÜĘyʞ„ň¬Ó®ÄžŚ_Hń´ďfé ÓűOꫵ» IDATÎÚAA,ÜäBÜńĎ`ąÔ©ŽµÇ»Ă9§?=ŤLSü3#Š˘"-ÔäنĹő?_ŰúÔŽ|˘†.8˙‹„C–Ç?tq ˙¦cŞýß\Í^HYg%ó.› Ź×żüůwšťš?ű»UŐµ± Ő¤Y#:KZE–âÉAA¬%‹ˇx¦S€¶^ÁŻŰ·&öńŰDÂלÎ|Q2męlď,˛\k”2üdWv+ź|j×Ö§v<ůTĆl[źÚÁŔ8rź_¤”ÉUŐµöyz˝¶[™ę¸çďĘg/›g%ö"Ćü<ÝLk ©d®uZů“F\sÚ¦•=ó\G2AAëŠ1[/Ť ±{g뱎Ď÷ś…§§ Ç€§§gâ’hmkíhďśY °Ć™C’xň©]ßü•3|ÇńŔĂßß÷ňM0WÜă˙üĎ×>˙óť»Gňß7bí>·t§Ëk%ćżw(µ¬˝ăe®V{<€Ý_ëă°vaĺ_661‡E‚ ‚ ÂÂéí§ŤHŻo˝4 0\l…kdÚ‹­—Fp±őóęômĚňţS)*ůŚłűqďźá»oţú€­[ňď?µé±ö‘[zž>w’÷o—˛&¤­˝éYŠŰ>njY,`ăĘjXĎ*iéĂéýgZR°{j)©’ ‚ ‚ȉÓŰO{ k=ě<ÖaéVŇ֋ç@‚8 [Ź?Ż®LmŁ@QŃtRÄ€sŔ•ZČaÓăO‘óĽµ`~ÁľIĽ…ĺÎćśżĎRv–ج˘1€ÝY{ţ>“÷źéIÚé‰Ĺ“ĄL¶ ?z› ‚ ˘Ču€ă´~Řé™bm3¤g;ČŚ&8q®p<đđ÷­ń€-ů“Oíâŕń€¬G‚Î)Ň7K óv¸“śÔĹŠX]‡Ąb=Ěü˝'ÖNÚ›ěÚV˸ ‚ b9Éu€‹ńż˙ó=­Ç:`r¸S&E¤¶1 ç"@Ţ+ź5·q0ŽYzç[9.7Î-C‹âp§V›?¶ßĽ(q˝+ĹüĽ‹´Ăą¤GşÇEAAKJîGŽ™tË×ĎyîľEg{gg{gš‹Ŕě3[q{ îý»µ.żK8ˇw·łĎÇ?ÉiĚĽY"WrŢ;‘śŢ˙jtsí)|ëĺ<:’i÷Ôj|AAËFîGŽY;|˛\–Dk[k‡#f y¬$ćţă~?7géÝíěł?ĎÇűO{$ĺ\ÉgľR&ç Ϋ*Ě×űO]vXřΨů1Wď?玩yîDA±ŢČ+ ýXGŰŃ fďäů||ÖÍ»YFąďçʵ`Ďýs3Ťś·÷o±Ŕ cËűĎgľ5c˝pß4íBybÇÎ.ІârĚ©#Ö҇-ťoŮ„ő’Ö‚ ‚ Ň’#ŕóęĘ­‡ábČpÂŹµ`ëiÇÜäE‰S€Ň*źü1›űßßߍ$îŕŽ{–pçO,G亀(0ÖąkëĽô7őQ¬ó‡CA‘ĚĹ ‚ßł’ŇßŰEAAÄꇛ\HśÂ?ł0|edĹ,"Đr8č\Ó _%AA §ĺpąB(RcZWĐ2‚XçtťHswý* ‚ ‚X–‘)€vTDá‘v`@A‘?ąď ˘0©|&°Ň&A¬¶úvśüűö•¶‚ –ŹL÷Đ€ VKq»AÄş‚VV‰uH^÷Q°ĐV=‚ ‚ ć„3 ~ (Ý@AAkŠXt]ŰřYŮć2ëeËkŤ^Ż»éŤ¶óďźŇu­ęŮ˝×ţřIţĹ•MĘ©·ó]Á̧~‚ ‚ b­B1+†X†>îs¦ś˙ÔBŠÄÖ§v00˙ůÚJŰEADA1…BÚ‰ůŘmµíh§6Ą L8y¬U)S˛Ôű*vđő–ţł˘(uţ¦Ś5ľTWőěŢŔîĘńđ¸Ŕ„łoź7JÎ"Ńh¬­=hpČĄ®í˘(éş¶ëŮ˝•»+Ł7˘^¨qoó: DŃůnĺîĘ%yÄ|a`Ć}Ă™" [źÚAc‚ –“ąžO`Ç2-A‚Xźd»€XRô)^ő\˝Ąő§źËo;ŇÖz´Ő˝Y˝ę<Ń}öô©´Ĺ;ýÍŻ5*›•Ć—ę[Ž´ŐTׄoD˙ÁY}JÓ§xŕéňö_5÷śéíüíé“ÇZťő·Ľlyµ±˘Âßs¦·űíÓíÇZđ)xÚŰţ«fű_<č4 ëx»ó]˘Đŕ)ż\>}ş¨¸ĆA,'ů{ŘĂWFś‡/A‚X‡P ŔŠ‘sç<|3Úr$~ů«Gńš}5#cˇ¶öΡţóńĎÓ…Š ?€ĘÝ•5%Ő?11‘ć]** HĽK é#ři @A„ Ĺ4Ě…9môç&ŹM¨Ś1UÓK7ÉókTd3Nd’ş®9ß% k ăX\,x$ľH(¬x€­ľźŹ§ô_äSĆ—ęçÓ"ç˝ö5ľÜĄ6]תjö_rf¨©®Ś˛›J„“G[•Íw¸użÓ32:–mĚś˝Ú±±P÷»=† >Ą»·xłÍŰm |Đ›łkKł#•WqňxÜÔŞçęő;şő3u§˙ŁÁľ pApˇńŐĆŠťţ¤Nőť;•˙ai [ŇîĎŰŞ™Ď€‰ŕ›Ťĺĺ~gžľ Ö[•Ď_mH_Q`lőíČôVÚ?eI“ň¤M$u Ĺ.Ś1÷÷ŕĄáš=•˘7˘îmîěE:Źwvú? ´´ăŰŠLŚ^ Uěô_ö?áKŞż¬¬,Ó»i )]ċ޵Đüćw‚_°ůîŻ3zQQQÚR#Ł#­‡çą§‹sŁ˙ŁA§—śł6;˝Š5xq¸íDw¦ x>Ĺű/~–Ë)ĚV­‰¦_¶ýţóJ™ áh4cwméş6×®- ÎŽDľŠń)ÎJXôFT*ô;:€LÝéż08<:2đA/+a““jĂ+Mb‰ŕőz“ŕśHkXA‘úą‡Ż‡íCú/ _8×ËJLô_\Is‰eÄ9ĺ‘e,AëŠ(hşN´Źuö~ŘÇ9÷=î>ąmfÚŇ`:::ý"öűÎÂ…úęš¶c­GšĹúÓX×»=Vprýżîhkv˝Ű#‹R׉4· 'P€˙üN¬ŰăOŇÓá\ťÔ”2Ĺš|­ŮW36Ö¦´®¶ŕČż„Ć®‡µ)­ë×AŻ×ĎP]3v=¤éĽë×Aďvoý&]×­ŻâĐÇ}vm˘ŃhKkP`Ryą7msv˘żÜŰs¦Çz÷ŕˇ&M7ŕ‚$J]G[K7ɵ/6đÄ·}ŕŢÔ ą«59ç\˛"ŕ]đ&Ň©Ađζ`"S×’˘ó%QĚţčôśéĽ8ĚJŽźÚzjGjwW^®ŰWÓq°¦ş¦űťlÝéý]ßŮÓ]¬„(-•_kěý°ď”×ëěTßű§ň9l ŐZg÷“Ţe%Bꇒç×)Ës˛ĘůąëS†>5óOó±Ŕ…ş}5ÎVrÚ™˙gG,i'ěszóźŹ_łňXc;?M˙„ s1Ă€ĺ#Đ Ŕň!ŠRŇżÁvŠó­ŇRŮřëĚśú‡¬˘"`ďη–é­[ßlN*k×ďv+żźśdXŞt@!c­t+â 5,˝ăčt¦"#WCţňřâŹ>Ĺ}Ox›_k9řó–SÝíÍżh użÓsţłń ?ň6˙˘qôĘH÷»=ç?8ŰwîTUÍ~{gŽł¶–·:Z^k¶BĚÓ6g3|eDŮěŔ\ěÔŰ'-wjôj(x˘űěo»f5a"5Cîj«ůYeUe•˙Çĺ;ř/5ŢŮ–µs)m×’˘ó»Ž·gtśóÓgÎ}öÇOµÎLßzjGjŞ+ľţfÍžĘńżDš˛i»Ă§¸®ëÎÂ|ŰÜVţ¤NĄ~’şsęí®TkmĂŇö%퇒Ď×)Ës˛ öś‰É;“•?ŤÄ©Ź%•Ĺúě‚Â9°SVÔ"‚(,¸É…¸ăO+±Ę±V‚w?Ůő·«©ŽçĘłvŤ»·yႵ‹Ú˝Í›T“3x˝±“ÝYjK 1ď˙h0µ9ËcÓuťOńˇŹĎ€ Ńh´ç˝s7`BźŇ“Č!Gµ@űŃÖuuc×C=ďő„oF[Ń1>×JźýŃ1ĆĽ[ÜMo´ř·—{źđy˝îL­;;@ĄŇŤb÷»=•ϡÓw'»ńYHíN޵NĂŇľ›öCÉůuĘ~DÁś¬ÂěszÎôvţ¦»5żĂĘëł# šű',0C1pŕ{V­¬R×µM¦S€˛0~sĽ|{|‹K¸Ě5Ä\ńYϤ vb¦Úr6gyl×ţi¨îůšžsçŔDSs[ëŃÖˇŹűNý¶+M2䨠lVꞯ?u˘käĘH¶'’‡ĺVpĽőßď?îCŹîüg›_kd%B÷{=mÇ:ói޶ş¦˙ŁÁÚ=Éwn$u‡•0Qc±™ŞnDÝ[˛Í|ۤv'ŐZ§aÉďfřPr>“ŵjÖCŰ]9rŐ~,ĚůXŇ6”ÝÎc׬ŕřx…72†Ď`brRu»ÝuűjZ_k˙tľ2býíD+ĄëD‡3›ÇëwćŮęŰaýŠÓRTT”ôŹ_UM˝uj䢝ł¶Ĺmn©«]ć&–­•y°†ÍăČ˙e°ŠX,’ţ4eÇy/ďś 1,wBŮŮ»Ú@ÚÖf ĺppe¬#u̲ýű748‡kć^Űâ6·ÔŐ.sËÖĘ<(LĂ Ó*bQđxýą31/¬Éýl÷Đ/ ‘üÝú­ľ'˙~žű 2ÝöEQ°ćYŕZ %eqbŠŠ‹wĘéű9Î$őF>jç&źąBŰ[ ‚("Ὣg®Ý‚ Rqzűóż€÷g… ĹBQqŤ" úçŤ "Ož|Ž6zÄ"Óţ˛ Ç _Č O0X+4 ĺâő ‚X¤.đ‰Ó©» X١1Ź ÖŮbň'ÓőC4 eăÍ_¶­´ A %uv—ź8Mc‚7ąc˛ěH¶Ď˛V:ŽÁĹěŁÇ…bÁ©Ą=šPUŐ‡~ŘmÝäbâäŰ'«vWŮďöśîéyŻÇz«f_MDZůoŚ&‚eqĎĄľuëÖbU•?Š˘Äb±<ĺň›GÄę"uźd–]4 ů‘W @ÚĂ@ťk ůÍď!~çčwťŃłK"ŠbäFŔČčHĂ+ U_Ć=§{. \űă5I’p=gzćŢ5‚(tÖĆÝ4äý±¤dße@c‚΀ďŵůĆŘ’žĆ”żŞĐń›ŽS§OI’Ĺh<ÔčĚ¬ŞŞ$I-‡[|^ź˘(#Ł#-‡[|Ű}Š˘„®Ćg:Žu(ŠâŮćńm÷©Ş `<<îóú~Ňߢ”Éł*üCđłáŕďO7xO?ŁńIKéF)m%ĺŰ•ł'ć˙bQqĆÄÎ]AybŤÎ;ŽŹul=gA]×=Ű<·g˙‹ű+÷Ä~Ć=CżŁ{Üžě+vVŚ‡Ç»Ţ¬Ş¨¨ż>~ę·§Z·X5´µ·Eţ5ąż>.o”ěqëŃÖH4¨457͵ʱ¤zü«w @+A,)ö.{ŹńwýθoLßźNŠ °Ń4ăÉg;ž¬ěč˝:u´>Gý%¬ů…™ŔsF=´Ęž=^?«Âg;ž¬ěčţplŕt×›ü7­˛Â»­NŢŃŇV2v=ć.“”MŇ|A,6ĚĹŚÄŻ'Ű @Ńl’޵FçÁŁÓG§G [ĎŮĽµ(Ťhš¦lR’fúłŮÍXŐž*ţ§ýpÁ đýČ›6ĺ?*ŻŞ©ę:Ń ˇĆ=#úE´¶ş@ýóőöBA¬źŹ_KýoĄŤBh,T_WďůˇçŃGu¦ÜhyŁĹóCŹĎçëz'yŤV‚XR˛Ë`ôjT)ť)î-˛5‘?ôA‹(J>ů QzH°&ř ŹF¬ścá\*¦Ö96 ľ3ÜúreRz]uy˙Ą°Ą§­dđĘx]uyž–Ä’ÂM.Ä÷ţg]žMŇ»™öç͉úę/ 6âF1ŤdÉĚK«ŰŁ—ĐX¨ëx—P"Ź^ˇE7‚Č ŰŔjöŐtu&»řťżéT'ŐĎţüŮĐđĐŕĹÁ Îwi€ %eŢ» Ôě.Ź~Ą:SÎżÝĐöî𓕡둮#5v˝ŘŁ}źŕwćl~)0|%ś¶Ú±ëQĎ9)1đ´;NžépVúK,PžmwA,ĚĹP ,Ę=ÁcEÖ¬Çq›ś9NʇáËĂî-nKľl:Ô4ô‡!a`çż8÷ˇNŞľí>ßv_ůöňÚşZaŕŢâş4Tµ§ŞďŁľ@Ĺ|n($µŤďqźďq_ä‹ä±÷ŕĹÁł˙ó¬ŔˇThx©ˇ˙BíľZű]: %ĹŢe`§sm1$áł?áÂä¤ÖttĐNg%‚§Lľ2 ˙Rxč\ĆŰŮ_x·É»ęň=„•Ś |j–Ű“TɤŞ+›Ň,)Äňł÷Ř{~ň÷ű­0Qş©´÷ý^+˝ńőFOúź´ŢŞ{ľ€¦iµ5µ#Łą/<2¸Qű\­>Ą[Ýé=Ý ŕüç8řć‘7K7–|<«‚ @˝­ň)îŢś{·y»ßévf ďź %e» ¬-űöKqăÜvŢ×UűěóďŞëć<˝?SľÝůBMűVţ•Ä ’űd˝ S‘|e9íýŤŻ7ZĂI’,ď_–eMÓěJě#}l]Ř „Ć’wůűĽľńđř<ě$Ĺ"çO©Ń¸@bń>cλ@+A,1‹˛Ë ^Ő”ůJ­¬đ ŹŽ×íö†>Ťŕśł’™<5{|ÍŻvŐőčS™ĽĄă•µ?ďMŞ™›+‰/¤­¤ô!1v[ź«Í±äľŔy @׉޴w‘“UzÎŹĺúk\“J$Ä˙Ąś5GŢ?AKĘĽw¤e˙áŢó'Ú߬śĽĂë_ďŔ§ŚţGţ©ĂŕüÉg;úŢnPUí“sŤ&u^őbě=E\M¨µ‡zĂ7“·ű‡ţó{•‘«i+ń=ˇŚŚe‹o$eĂy@î€,Ţ–Űľ‚˙9?5T7ɬ„Eżúäľ¶cu,h€ %e®» ô;ÚĂOµdJ‰~ˇ&űh:ŇgëÂcÉ1‡ú-51•sĆęv{­@Úüu»}űßčMM'ĺgn1™V˛ěä!ÂĆăÍpfł˛Ű„ Ó°ţ(¦@p jŞkzŢîńžóęşŢű»ŢćךťEČű'‚0<:Ţür tŁd]Dův%:ˇĹnÓ=¤DAW € í˙! ô[°Ő©Üşu @ëŻZŰŽ´=ůÔ“ĚĹę^¨sZ béY-» vŐeĽoxězlě:M˙…Bî'@kËăOB`B×Ű]]H˙y˙A,)lóˇ•6 Ö΀l7[ĚĂűĎľźˇ(sm… •‚n&‚ ŐĹâÄd!gţÔřçŔÖ)Ě€ Z b‰h9ů¶]‚ …%ŹČ2f°śű˘˘˘ěÎ=ąţQČP AKÇ›żl[ibMqňď۱ 1YňOOOçôţ ‚(pČű'bI!? ksţ˘ÝZuΊŽuŕ×íEÇ:¦ŹÎg‰@UUŹÇc_ śăžŃýnwđHFăóŻŠ $h€ ‚ VK6›s`Pt¬ ż?Ó`±–ô)˝űťl‚ ćM’OŢ?AA8ĚĹ ‚,Ń)@™áiő˘cAüş˝čh°čX‡­g©ĄńőFĎ6ŹżÜŻŞ*ăžáßé÷¸=žmž@EŔ:xdW`—®ëžmĎ6í[­öąZ+OŐî*GďZ|^ź˘(#Ł#‹×M‚X㤞ółÔ§Ť‡‘ý¨°x†ű‹Ő`–†Ć‹ŠŠĄˇE¬Š ‚ ˛ĂM.Ägţg\p‹zG)kťńěă- âhŽa­$ôLc]×ČŤHĺîĘ–_¶048‰F"7"Ío47jđÉČ'˘(FnD"7"jź«-˙Qą•ç|˙y»ŞŠťăáń®]´V@¬OBcˇúşzĎ=Ź>úh>éIsüŠ2ŚpÍ=î™âĆ=B‡~Q°łŤGUx‚ŹcWgň÷Đp’aę_„aäŐSAę_¨Ź~MT®*’$ ‚x& ~­Řáßaĺ¬=’÷<TEé!©ńőF»¶PSAđm÷Ů« oľńfWgW}]˝5Ĺâßéď}ż7ŃG­¶şVŘ H’ÔřzcŇ¶ź¤˝@ń— ĄçtŹô$?"‡®†.xÜA|Ţx»Vžľţ>ËN§=Aaăôö—;ŔŃöL‹ÓGÓÇ:đVŰô±KĎćý›ş4 ďŁ>˙N?0!—ĘzŢë±r‰%˘=6ĺO—wťĎeŇÉ?±@2Íń§Žě·^ŔŕE"Qhw¨)U[w˙·ţ cW|+ž^˙"$ wďâÚŃűáLţý Đ5|óżq÷¨*Z~™—͆aôţ®·ćg5vʩߞŇ4í›oľ\ÂÁC\ ]łr† á4 _2 ă›[ßÔď«·Ë^˙ó¸ńWĂýűŕ+¨Şý"ZS]“ÜpĽŹµîţűÝ[˙vkěęXđ­9ü]ŤMÄ´oµ†jëj/^ ]3ţjx˝^«]‹áźeAA8qzűËŕh;c‹ŮEqđŇ g›gđŇ`×ßw6­m­žz|^ź=©/lęöŐ)Ź)VđŔÇcccVđţ÷/Ľ'±žÉrÎOŇŔN—D*0xçΠaöô˙č?ŁëŇCh=÷őă靉ô#‰ü/ ëm l@đ0/ä°VxP6<đŔđĺáS§OY‰˛,[$Ij=Ň:ňż’ŹĐ4íÜďÎť=wÖăö6ÖŚE×ßwI’„b4ľÚ8ö§1š®ń™äŞľŐF˙y´ëD—µ’Đz´µ÷ĂŢF;hţE3€šęšÉŰ“§şOYí6ĽÜ`µ›É‚ ‚p˛$÷ ꎂə‹µë%Ö¤ IDATh;DÖ-7™N•e9íü}đHĐŽâí87Ł÷ÜĚ?±ŇCŇŔĹYŃxÎŞdYÖľĄe‚Č—,g}ZjĄ}·ńeŹ"ú"˙ u2žh)JY˘ćMśLźîĚďůˇŁI3‡µĆ]Ĺ0îMÍMő/ÖŹ\0pq űDwô‹¨ő׏O%˙ER'Uî-îÔ ČăŽ>+a–’(P免ś<°ŞRĘ”D_”ÉÉIäMĽ-HÍ„09;žjAA8Y’{ňÉ3mťíăb°öü¤ŕڦ ˘`™‡÷ đ bŕ˙dyf —@lĘc»ŤŇŇôéÎüßÜ‚ôĐÜl6 /5ě ě }«í}nďďű_űßkQŚĐŐĐŽźěŔěµPk.?öUĚZ(ȉ,Ëî-îÁ ÎPYUMĔDZ۱R«“ ¬ĄKmJłŽ(ĐďčsëAAäbÉc˛,Ř{ýÓżë&ďź –Ă4¬ż†i¦‘3vů§z˙©÷¨_cčň¬é!Tü-­0 hߢóęźO—~<‘_BÍ>45ĂZŔSU ]ĘŻ›†Ń÷aź˛YŔ9‡ I”P ők5:ŠĎâ­$éŔKöŘű2Ŕ¸gÄŹËĚÉ·O¶´¶ôő÷Yἡ«ˇ†WHI?­him1 CűVë<ÖY˙|˝ł głGE+„ÉiABA¬f¬Żń’Çä3d1΂Ľ‚X6¶ţ`ëŢg÷ZĘÖlÍ™Žtsüi˝˙ŕ>ü›ýÁŁĺĺĺÉç«ă|˙ůŢ3˝‚ ěŞÜŐđRC>ĎŤ ĺd:'ůäY) Ö¶‚5lzMŮf}‡—*Ŕ&ű®ˇirî ˘¸uë֜ґÉű·¤Ď‹Ô˝3QzÓ´"Ëą2ó˛ĺp\6 ç4zNg¬Đ‘čËô§ĺŤ––7Zě—öľťľ^~1:ŽwŘaEiëLz¨XaĐI¤†!%•­Ú]U›ą¤ÜZ:pfČÔnv{‚ â×.Ąů+ą˛¬a(lŰćËŢ`±¸»†‚(4Rçř3y˙+k'AÄÂ)ĘçŢrŰ_$Ąfľ_¶•ŚX`+yý ‚Xb’vůgňţSc‚ V´ŞF¬ śŢţ˘ťädw eňř‹RÎJM!b‰Čâń§®Đ¸ť ě|>~mĄM µĎ Ç,Ľ•´ľţôô4ŤbyČÓű·$ý* ‚ČN$śă­ŐD!ď/XŰ Ö°dsj«/ )ŠŮžV¤ůE‚Xfć´@±Ş!7cÝa}â–Űą†>}ćbFâLď•\Hrúť/3wެ)äÚś§ŞęĂ?ě~Ü &Nľ}˛jwU–üAädN++m,AÄ‚°ýŤ|˛˘¨¨°ćłm_¶ĐŮ‚5líÂM.Ä˙•ŽH›sŃOE1r#`dt¤á•†Ş/i@ ‚Ľ‚ UFN, Ö°$iibŽŤąŠ€Î)@yŽ­ťŮ¬˙s—Ć”Á§â=5îţť~ŹŰăŮć TěăJ:Žu(ŠâŮćńm÷©Ş öeĚżÓoĄD˘‘´yb•ů"ň裏zÔ>ż«ďBź˙'ţxbMíř§ăÎRůݬDź‚ VŽ5·o„X38c ĺ ě¤uńíť?9C u]÷lóŔ„:©Ö쫱& II†. 5jşŢ'őśź¤<‹r Pý ő—ŕ>ö>·÷ěűg#7"Câ<ţPBcˇ®ă]B‰<lxĄs±ČŤőßxxĆâÝ7¸Qű\­•ůŕ+{O÷řx ďŁ>Ď6ŹňŇýNwÚ<±J‘DÉłŮ@.•›Ń<üŹĂI„ˇáĺ†áKłŇi€ bS€đkkłMaâôöWř&ŕ…¬Řs˙ŮdYÎônđH0x$ngÇńÂ!4–|ˇüů=Unr!q«Ď ÄL'p&Úż®Uů3#u­±~ €Ĺ‡éb1—'É\ ĹŔń&ŕ,ă„L58Qö”öź™ŞŞ?ü°űq78ůöÉŞÝU™2÷Śîw»í»~ÓÖćńx4MK}«çtOĎ{=V+5űj:ŽĄď]–b łđ›€ÇĂx҇é˙€őÇh±X˘jőŹ?é{rú?¦±ţĄ¨sEXÄŽ¬™gB¬k á$P‚p°T1-‡©˙-ĐÖTDQŚÜDnDNť>ŐôzS–śú”ŢýN÷<šč9Ý3paŕÚŻEnD"˙‘K˙öŢ?¶‰+]ü~,i¦J®<®2^ŨTő´©SŞĆą Ć)Wo“mő’1đŞöŞ8ŰU‰ˇZâPmŞ%ŐĄ Őt N%h‚´mÜU)“jŮ&Ő¶uVekŁm…ŃÄD[ÄX%Ú˝DâýcśÉÄ?Ć?b'ăÉó ă3gÎyćŘ?ĎyÎóşPaDëDnDÖ®]ËĚж˝mÎéi°ý§míÚµIWĺĄý‡'Ŕ`’śýÇqE<<¶ĆD¦uŕ=V„6eb?eCQÚ‰Y6XŠĐP± O„ 9­Ń‰FTęĎ˙FŘQÖÖh#«H˛Š´Ö[‡. ͧ5Ń šÍµ_¦,îň$˝Sň}r$)XZ”ű aJ§b ëF+cfZĆÖh“V7Ůšâń8SË0µ đżđmŰۤ:Jżë ËRg1™Lěhb;$ď{ŢľS}E,ç>§Tž[ę,Ś™±5Úř_ćĚús—¨/ݤäBeű®.Ë‹Éd»66[a˛˛ŔDfş8G-óč§W¤1€%Í>—ż2ÂŻ ‰ôĽmjA€¦˙„ćWÍ]óşů¶©„ꂉďŠŇ?ńÝD* ÂŻ‚ ÷ďß7›Í[·oU©9Ďů|¤ĺŐÇëáľ <üÇýˇ+ˇ‚[CA  äű¨“š+˛®´KčôffçîťÍŻ4K…$AŽ ŹD˘‘ČőHçţÎŽ}p•˝*»  m{[ýsőRť äÖ76†'Âţă~i±đ@ß‹3f&µëť»wvîŠD#¶F[G§šóA)m˘ýţ–ć–ĆĆĆđ·áľ“}®®Ů Ťs@Ťű9şęÜß™ćÔLtŻ­Ń–é_îńż@Ű «€˘ŔůŔC€ˇK`©KTpĽ†e ĺ.śëFÝ‚ř=pľžXęc©¶mł }¦u@’`Ů‘h˘PxŽ=@Q@V}7șҖ7X á^H%p>@ݎÉ*ұÇ!I ÇŮmE‘$iŰlănsĐ`mi–ŕ!¸»M&I’ÔJĘů–S!óiť‰$IË‹úd<pآ€$Á¶¸Ű‰ňţS`2Iµodv’$í»ěŃŃŇÝČýü>ż˝Ý.˝_ÖŤÖŔé€tŠ˙…oŰŇFV‘E9ßrĘă)!y*äÂÄË™ţSýÔJŠ^CŹ]ş<Ä’$-u‰~Ą:ÁÁ $g.‹”Ž7Ň'Ť˘({»=iVNBűn;YER+)÷awÖňL”_tbŮ ¬}táš(á>™}ć…ú… ť>áyŢ´Ú”ž_cߍYë­L-sŕŕđßĂIW „ńoĆeµ[ž­'˘ĺ•°ţ‡5vK-c‰đ@޶miű»4…ź•Ůö_°BHžËsąŻÜ@ŇayŢb±X\ď¸Q ;öw¸Ź¸‰Ę4łr†źLn+©<Ç,@mí÷˙ 7˙ă×Ŕý.€íEřHń5쨩ńż„ľ„ćÍ`Şă Řş†.§YP4|ÂáW0Ż˝3zđNÄy¸űŕţ]ŕ8p˝ŁVţő$üiîîKöć?nŢ˝ywbbÂŐĺ’ËűNöń<÷î]˛‚Ü»o/|=ö5‚ 8ţËú44áîÍ»ömv…ĚĂῆ…_ó:óŢ7öf´ľ“Ŕóp÷.°ww:śA€»7ÁńZÖ6‚8hýMk‰n„ă¸čŤhë–Ö䎠­˝ î˙óţÍÜż6î~7Ź_śŘ­˙ ďŘĺhkoľ<üőŘ×ÂŻB]]ťrC …Ăy ,R.PFjdxD„›7oŠÓbňňEpuş¸ŰÜý»÷#áHđ|00P/ĎDą—©ŘHĹł:J¸ŔŁą¨×Q–ČľË>üé0ŔCŘş}ëŮÓg#×##ĹŚöL1{ăҸU¤q…1߉"ĺ*{W¶źÚW¦BY0čjúł/> ˙5<‰Ĺb݇şĄňŔ™€éq“mcú‰|e–ĎT@Öţ•«€Čĺ@VYmŰçTćŃ/Á<1oÝu稕`~ŘŻ€» â48_‡Đ©ńÄŇ˙đTŻ×~Xµ , r}¶M˙€˘–óM˙€çařřO$dp„áKjĺęxŹxĄ™ď®Ă]Áʉ‘¤iiµ!EQ]‡şŘŻ’‡…çůsgÎJF˛Š´n´*döSËŔů¦sü›quhZŠ‚®CŔ~ŤĎYÖúě7B.'É*ň±Ç }ę;ŐW˘áă<¤ ¦âáGżő÷Ëă8źESŇův'´niťĽ3Ů×Ű'őëxݡŔĽ)#üÇýňµóíÎŃżŚ¦Ö8?ŕ>ě&«Hz ízŰ8P/GíR sN+1©Y€Ňî  BčóůI3˘Ó‰DöcĄQÖĹÉ*˛ţ…z˙qżôR=oŹű€»c_‡đ@xý§úĄĚOšG>€ŕÇÁ¤”‘§ĹŘO1élî·€ ‹ e¤Ç «éη;C @ěN,p.ŕ9ěÉtUR¦Ą  Ôţ•á>@xCç4ĹMjfZ^ ““‰ăćÍŔ^а5‚m3°W rÄ)°ľ`ZÓ‹ÁÝ»`Z [ŰgۤW$J€éŮ^gŠ~K+ÄăjĺęjL3Ňš&gÄşşĐ}¸›©eŘQÖ˙˙śk–Aß÷YmVËKęď%‚”áńđä˝É&[“Ĺb‘bC-‹2j3u·/IďOŇţsŮ€®ÝšiůTW'Ž7Cč °_BóK`©ŘĽ¶“S|Ň4t„čŤě˝Ü˝™0B„‰µ=™Ę‰ŠĚmČ«őbwbŐ+Ş€˙…ßş}kçţNţźĽđ@¸ş*UP>ZĄŠŘĎó]éÇ˙[·Cç~ŕ˙ ¸ަmyŘ+ ü ­Ż${ZT «HÇkŽńżŚ—čFhš6?iľ4ść”Ô”r<ĺ·_ę— €źJ<„ă÷r°Ď%Ćȧ#˝=˝}'ű’Ę…)¨Ę˰’Çă*ĺIeIłvÁŐA™ĐőČ(cжĚĎTçţŐť4Mg:ë>ä–h˝Ç’(öQ+©ˇËs2śĐ4-»hšV†9ßr*ĂÚ$,u–đÄśče Ž=LJR€LíËÇ* ČÂŔÇyqJ¤WÓü=ľ÷ý^Ű‹6h~ĄY^Ôű)¶ó˙Ý91ŤňUi3~¦j˙ąŘÔJh| \]páAśßQ°ďHś˛ýÜş““ŕďMĽě}Ł÷ÉąĎý):2<ŹÇ­›¬în·ä¨ĎT®Bzµ$—]Ŕe§0Í –cż8hůvš­Ž˙¸×uĐM×{ąq7еÎŤČ”(µµŃ2¨ý#˛¸tü®#>o˛5ÉZKĺ‘ëůŘßë§izůŞĺŚ…±ď˛ËZ~¦ňLč0Y’”*A%zY\2M2µŚ0łI’ÁŹŇ¬OËT®ŇÚ(á>łđą†)ÔţArBă™@‘ĄQAČ»[jĹ Ň‹÷hÂ6§ĹYçĹÜcźÇ‡«†dÁH«ëŰmě(‹6‚ ’4„qZ$gÄ%ţ'*€ô6€7Pj™Tzé~·TŁŘk¬ĎăËtA˘SÜ,@‚ ČB“sîČ’tŤ,D!m¤#.îNŔ9öâ9âÁŮ}Ń™Vű¤µ AĘ @ôA™Ĺ¨'‚, č@d逳HÍFtä&RŰ_Ě€$Ą_ůRŮ©Ďă›ĎŽăV­Ze~Ú Ó@T>şŔ™ÂšĘáĐűAŻĽ?1‚h“ČŤČošC‰ç‚ůióĐš´…ň%ą{ łÂŕÚăßTŻÇkŕ>á XoB1YŃľ@ÎnP˘8[AuBA54¨ÓKU0Ą¶żČ1i[N2 Šć!°eëĹh4F®G p:бŻeół@âSńŢ÷Ń@ĘH$’c!”Ř ĐôźĐő{`żXá ý¬8ű+HK•ő%$ ő~A´Č˘¬¶/S+>AłoP‘Sî •€…Á¶Ůý9*<¬­Ś™aj[ŁMR\8ŽŁ(ĘąĎi©łôźęĎTÁuĐe©łL&v”utY6XL&ÓصÄÖ­±źbÖŤV¦–±l°D˘‘&[S<gj¦–I=«ě18ôőšL&é,Çq‹8J’•’ĆÄnAü8_O(ú–:hŰV\ńAň`ľ1Ü8Y’h1@€=ĘôŹýóŐ› ~4?i& rdx$ŤD®G:÷wvěëÎĆăqŰf[x"ě|Ý™©BăĆĆđDŘÂßŇÜŇŘŘţ6Üw˛ĎuĐ%U°ď¶ź=u6r=â9ęéx«ă*{Ur>Hţ‡¤łĘ[_iíötG~D®GÂ߆étqÇA˛byŢb±X\ď¸QP/„{L5`\[·ĂĐe@[AEc} •‰$Ă:őkć9âqV•a:KŇ4‡iŕ§x©Am[Ú@ĄBË+-`}Á Đňr XžłÄnĹ@x Ś7ľµ}k˘ň\›*íYąG˛Š¬®ľĄµĄysłuŁŐZoÍrKR<čjúł/>cg¸I®ă­ŽîCÝţţ´…ň%%Ť IŹ·\űáÖ-¨{. S;svůlMżśoÍóîAdI ˇČÁ°Îž¨"Ëy9 ÁCŘş}ë÷cß3µLě§Ĺj‘ŠĺxÇěćĎşT*eGI+yRĎ* ˙vÜ}ČmZg śdą+)”‘˘ŚĐŐtçŰť{{ý'üi ĺKJťČ´§8:öÁÖv\Ośî'Ç ‚,şYiÁ K†2‹đy|Y–ßeó$!L]M@˙‡ýTH YEÖ=[H(îáoĂĆJŁ(Š™ÎÎąř!p·9Ë‹sźÓÜż`aĘR ¶MCçAŢ(†Đ‚ ˇŰ}Pď/ÍfÍ2‹čęîĘâ%ČćH‚¬"»ş»gKťE9ź{…L ] ~djÓ:Sďű˝dŮľ­Ý´Î$'ťU^(BŰö6)\xď{§púY8ř8ĎÝဿÇ÷ľßk{Ń–©P¦¤€X ü'€» ŔóĐ˙!Ô?7ď›D)Ś@ô†br±.TŚ“Şš¦yžO*trËŮ9˝ÇĽ©ŐÔ+Đ4Í˙’îx Í^™3y/Oů§=+7HV‘căcYnAJ8%Ú÷Ř'ďLBŘţĂć9ćÉT(SŇc%Ś˝=ŹA€íEş8{–ü·ŮciAYęä;U+1ĘfUz§EÁ Ůßi®ćśATčŐ4űEňŞł´…2%őP+çhü2–ş,ţę¬Ar㊊2`ńłeíEwěÚ$$;Ę&•ä€ Č<)őNŔ‚ Č’FšĎFŠŠcTzé~·654Ůš ÉÖÔ°©!©d$DD¦ÔY€A´€a†b5Wśv¤ BŮÔG+Y€Tzy” $‚  –Ad)šŽZ hŘţѬ`ĹFśÉ™Ä9eŕ@Dk A)ÍÚBů V†fQAHé”G @&T↽Gć„8-ÎF<Ě=öy|č7@Â(u €ĺŹ ‚”RÇ É,X|B±{QĆ,ţNŔ÷˘R_ PQ Řk¬ĎăË«;AdJí@íAí ŰŤŔ˛ x?Ęő>e •UCž#T ¤t”:nѨQ ú@©í—q €ŠÍ0{‡’c A DnDÖ®]ËĚж˝M>ĹŽ˛-ݶ0Ď0Ě3Śë—ň*MyÂL!Łg IDATaÁ`Ů`I*)¬kuźŽNö“ÇĽÔqżýň/çS@A-ůçOą€>=>ŹĎ ŻiK·T˶I-s(ÇqÁń†C~I­¤ňAĘČ C‡¤v”őľçí9Ţů!ňýŘ÷í;Ú•ő5čÝŠ? Ö]îP9˛Ł]8äľů[§8 m—†KÝ#‚ ‚äD¶ął2Ű *6CWw×#P DţáD%ú4ű “"Kď{^o·—y’˛’´-#˘YŇLIH%\¤YÁ  ˙ŻÇ§öé7XöŞzăDŃy ÓŐ5gŮÇqE9Ţp0µŚµŢĘq\ž"#F± Ť„FA¸{ó®}›=őZ˛ŠLűO˝ÇĐĎŃúŐ´tĚÔ2Â\„ úciŘq!wńĐ €!UHrT@V\żuŤŤŹ…'ÂĘÂx<Ţürsäz¤ůĺć¤UŃRŽĐŐôg_|ţkx$4‹Ĺşu@<v”˝şúőźżćďńP^ĄAôťěëíéĺnĎZć<Ďś8;p–13@V‘ÖŤÖÔ …BÚ*}Ťüëë{ąą9Yş :‹,şŠPţ•QË$LçĐÁ2đűü®sµü hŰŇöö±kcůĘŚ Z2RĚă ĐŐtçŰťˇ?…€ pľé$+I˛’tľédżd•WiжF›í%›Ň2ç&90?i.LŚL E#[/?Ůf·Đtq[FD·hÖŤ€íK]Ĺ(˙ʤ·g$'€ôAĎÁöÝöÉÉIö ›˝*‚čz5MT*ž Ë’+hÓ}'ú/ ŽŹŹK/éjb?g±CČ ¤­ĽŮyyxd‡˝eîsŚ ‚” úŹHdJEÖ*rń@ϱ÷» ٦aäÓ~L»–AĘ >Îsw8ŕďń˝ď÷Ú^´IĺíŰÚűĎô ˘ L SŰK6ĺUÚô€iť©ó·ťňw–˘¨=ŻíŮąg§Đ/<Ň:î„ ¤Öě˙6ÜńéđŐ]Ű\Ű&‘xôaaR#˘ipg=SŘ›[žnýÇtuwe™AĚÍ-Ż´H“FŁ1t%ÄÔ2Ăźű˙ŕϵŃ*â”hßcg¦ÁÖ@Ż =Ç “Ť%)§MĘ)_&ĺzYâ#&“v”Ú~ *€ô6€Šž]D č%k €Ę‡€˝Ćú<ľĽşCD=‚h˛’~Ч( Ä)Ńh4Ş”'‘ôĘ×HŁúç@Ş^»¤l€ů šŇ X‚#6ç–3V•űč3ŔsÄłtŢ~™‘‘µk×23´mOä˛d¬}b-Ă0Ę«4 íÂkŮ`I*)¬kuŘXĚöQ:ć5ĚÍ’©AĹÂd2•„ĽĽgbbÂü´YĄ<¤ÇKf5C©–¬ŤČ.‘Ĺ-ó4ĺU :bxw’‡+sD‡ţcfíi7AT‰Ě0tq(©$‰Ô?WßşĄUY_€Ř­XđŁyíň› F‚pÔŐť}Ą5ÇrAJ‡ RRoA9˝ą‚=»ö¸Źş…w›óżďwĽćP//.óź\j6Ě{ĐtÄ{˘ą€%OJm_źźÇg7B›Y@¦Ä¶I- (ÇqÁń†C~I­¤ňAôw‡˙fĽ}G»˛PS ďŻëW’ ą§ôš¬"{đ°0‰XhÚ^ËV$?2•G®GČ*r^]"’Ç{lýóëĄÇ{L*Ś\ŹdâKçďőÓ4˝|ŐrĆÂŘwŮ{ęĺ™Čë‰T\Ő3?Ť6›kBłqů~!#V†ö1Sjűúôtuw=Ĺw ť  QI„> Ĺ~*P}AňÂňĽĹb±¸Ţq bň,Zđă ůi3óôś%@ô8_wR+(ß{ib{ŘŻŘ›˙¸y÷ć݉‰ W—+µYE¦ýWčsajáAš‰IAćOÚÔŢL-#O$ü((<ř_x9;JąJGČ–ď% Đ”6)zđnŢ~€ráôK˙s@˙1^ŹOíí4XöŞzăDŃy 3UWŕá۶·1f†©eZ^nÉG^Ń"t5ýŮź…˙ ŤÄb±îCÝI/ &M˙&=Đw˛Ż·§—»Í%•{ŹxI’¤VR]‡»‚§Y&$<Ňţ+DtA–0%MDSÚe-‹´@‰nj)¬ž*ŕc¦˙Cę[žä¨€¬¸~ë O„•…mŰŰęź«ŹD#‘ë‘ ňA4e¤Ç «éη;C )φ®„Ä)1)4é[ŁÍö’ÍőN˛ÝnŞIaZmšśś,L$AuJ§kęŐ PđLv.č~Đ @W1Ęż2jY€¤Ŕ€é:X~źßupV™ăߌË%R1Ń1ÁóÁÖ-­$‘ĽF›č;Ń7xip||\Y»•#v'V˝˘:ő*2…É€ ČR¦¤z§.çłőŞ©—”ÂMW1Ęż2éíÉ Y°ď¶ONN˛WŘ|eCrŹóÜř{|ďű˝¶mň)n’˙KrřŻ„6=`Zgęüm§űÝ9÷»nAř_xßQź}—=ő*!i»Îł”'’Î/ňAĹ%µ;?Ő<=~éjÉóX›”´E˘˙€D TäďO.č9Ö#+dY˙B˝˙¸_zÉó|®­ V§Dű;Ă0 ¶zí9ć‘O?šźL˙•ЬáC‡öľ±—13P¦Óȧ#ą6„ š„^Mł_¤÷qąŢvąŢN“34ć°ÔY”őÉ*’˙eŽqîŘĺČšć/Ů2<[Ň–‡®„şu«kA–2Ź=ŇŤöżŔ,©ífÖĽČË^f *Ai}kB.S@¦«TV4%PőĐ4­śÝ“Ź©•ÔĐĺˇÜ…D]’» 0@7ëţ“ý‹-‚ zŁüž‹g·čÉjšżĎDśÉ™đ˛ŹH‹8-Ęďwúś=‚¤˘)‚ HIÉŞA.Řj–ň~6*„×ÉúźEĘťZ0D!-Iőí»6&Ý;Ę&•ä€ H*ĺâHZ„ RśE.ˇ eÝHą#˝}ĺç6™KQ>úß űÝnhŘÔĐdk€&[S憤’ÂeE%zA…>ńÁ«yćůîëj€´<ĘŤů‰Ś K—RgBŃ(ŇD¬ţVł, ‹5bZsă¨1WÔbI®«}YxJí@Ńĺ¤8"é(Wól®Řóż ĺ>úŚs€ŠÓâěÝÎ=öy|ĺú@ŦÔ1‚ ÚAk1e˝¨]S#ąÔĐ˙>R €Ę˝Ćú<ľĽşC]ąůMóo"a›ź6]€đßÂľŁľčŤ(ÔżPď=ęĄWÓňUč@\˙S(…Śî˘“KKş­ôŕ9âÁo#‚äNdIűDaçîťÍ/7G~|ţžZIíÝ·WYcA ¤Dą#u<łľ´5ş"úLô0{‡’ő H>LNNŠS˘ă5TIí;Ú%W€ zA´ČŇÖ•Uć…ËwRQ浕1úôř<>ěřś s±m*~PžçmŤ6Ţc a5!H±°Č^aéjš©eňîAJ‰8%Ú÷؆i°5Đ+hĎ1y6p6ôyy†YoYĎÝćúNö)ŻB‚ K®Y_ ÝdZ˘(LD˘‚fÖˇës'`źÇ—~Ł_ą$«`F>iyĄ%řqĐşŃ ”‘§ĹŘO1Ó:Sđă ĘĄĆJŁŇB iÚZoµď¶ű{ýŮzE…†^Mł_°©ĺÖzëČG2]…;#‚ Gşm­tĎ|Ý;))pÄi‘ś™×çNŔ]Ý]ŢŁŞ.…lŁŃş:pčA 5hôýwźŐfĄ«éćÍÍ*×’Udű¶vÓ:I‘ëpĽć] Ů·ŮłôŠ eBY{"j‹úAĘ Á€Óę9ňčŃ#)ŻkŤXE%*X ęŐ ˛˘)AV@˙Éţ¤Ç‡cŹC:–2ýÓ4ÍóĽT˘< ”˛×XçëNiĐD”»€©ł.¶‚̢qł|v"vć@#«Y$uvqe@Ęe €>=â´(›wi®ţY- hqaj˘‚¸ŞšxAĘ‹˛öHh\á@D;$ëŮóß\hI.h LKĺü¸ž=c×ƤűbG٤u€r.ţH«€DO”ÚP^ţYA$#čŁĐ úß űÝnhŘÔĐdk€&[S憤’ÂeE%O©=¨ý#˘Y4˛ţ§ĽĐšP.K§Šű1Sî O~-¤¤čĚđÔó "Ęż?ţőëA¤0fŁZ[’rˇřĺł KWű ˛đčĚ@!<=|$˙%€xęů†…”AÍR.łĹĹd Ţň@˙1rPqZśőwĚ=NżQ‚,1"7"żiţŤĽźťůióĐĹ!ŕîp®C®‰ď&J±ËáüíśM¬µépíwőľß{•˝jk´ĺuˇ’AńŃĂG†eô ˛´’íĚ?Ä9cĂóSşĘg˘}ľ”ěæÔöő™HŠPů¨±×XźÇ—Ww˘c"‘äPuű»µŢ ˘°wßŢęËŐm[ÚäłZô<„Ŕą€ůisŕL _€€ô.P´I N "ĄĆP‚Ź™2 ±¨L=™NyŽxđˉ ĂÝáný|«óíN¨˛’tľéüxPY!w@a0ŮĽ„ 8{úěŕĄÁ|łxIďQ÷)’ËHĂ2ÄS–ôk/ ś Ćă|æŇ&:ĘĄfďűý-ݶµlĎuĎÁ$áĺ;zĘŇвÝŢŇjßş{oěçÄ›8>>¶µÝ޲ÝŢÔÜұ_í‰-‹!Šb˙™9›˘$w±Ý޲ݮŢZa(;:ph¶ý–íö[‹ú ~<ÜŇjoŮnßÚn˝–H›$óčµ±řżóŤHĆÜĹ›ďMŞ˘M©D ,!QşÓ™źTýÇĚÚ3’·AU,Ď[,‹ë— nILôFTůR€Ŕ™@űŽvk˝µ¦¦&p.¶YE’Udjąäč<đ/÷!A*ůׯ˙’ă2őČŽ˛ŤŤ ±ˇXމSâŕĺá‘?Ť\,P‡“;2V##ĂÁö-­ÝÇ{¦ˇăťîžcţ‘‹Á«qĽ–ŃĆPŠ!ŠÂŕÇĂj]\ Ž\ öť(ţŻŚ˛ŁČĎ1qJ€čő(U9óČpG—†CŁěĐG‘‹Áľ~OďÄÄ„tJ)săF«±’şpşožâi mJ• Aě»ídI­¤Ü‡Óë™ęär­ŤŻ˙YBę,2?ôŕóř|ß#P>sż6ŐyŽă†‘'9Žcžař_xžçŰZŰŘQ6_QDłĐŐôg_|Ć<Îp“\Ç[݇şý'ü¦Ő¦šššŢžŢ®î.Qű?č—ô'­ĹÄb±ŃŻFĄýąí;ěg\ű]©Ő„¤ŰL2xHR1ýO¦±ć\"ŠÜ$oŞ1Ĺă<ô~Đ?>>ĆÇE˙w݆:FcÝ· ˝‚ň÷ŤT<ηĽşµu[ëřř?Ĺű»Ýě_ĆĆżťŕ§x˙w]]Äîp݇}üOdĎŃ.SŤIŮQÓ«[›_nŽ^ʶni}âăTe¤ü‡»ŞWÓm»â”(M˙}Ř»Ż#©Bjű”ŃéŽ$¬őuýgú@śEQ¤VPPWk–*¤Ţ¦R †x<.Ź\ ¦íB&—ńé?ľ"* ’ Ďžč1® RH˝—¶—›‡?µokĽ<ÜşĄµ÷}µ; ś ž=ĺ'* ¨®¦ťżuÎűęę2 üőÜm%SßÁT™eńRď¨$S߸¬##U°˝ÜžË˝ĚGŞxśwëŤý  «éł'ý˘(¦LţLîŮŐÚürsÁďŁú×--®Nw›»÷~<·n˛šjLŽ=Žëär­íÇhß@+E 耮î®YíŠŃBQj˙ΠŚó8t5ÝůvgčO!©<0ÝŽ­~}[k[݆:ŁBSíyg555Öz+8v9˘7˘căylô+yĽG îŁďQR>Vą„˝6f­·HÇń)ŃňlÝ'A÷ŰÎŢúĄB×»nçëΑá`݆şŢ§ćÖ<ë~Űą÷w.ë Ňq§¤’@÷ˇî®Cť#Î×÷řŽ÷&u$N‰¶ę><ŰľĄµďDĎČppäbб«Ý}Ľ‚}FŁQšź&*Ô iŰO{G2ˇ+¬éq3Ńú›ć–文ܡ+łŹÁÔŰTЎě&«Hz ízŰ•Öď—©N.ת ]]Vł‚!Ú@˙űx=>µŻÁŔ˛W!˙˝Ŕ’<˘cL5¦ŕG‰•$sşgçĚ€jËđç“÷&©•łšDŕL@˛”Hóúߏ]M*—<îĂł=*ŹÓ2::Ţş%ˇńŃ¸Ń ćşşXO/˘xëÖ-i5EóËÍ{÷u$׬­ ¨Ż—ŽÍ±INşjâďQ×Ě‚u2Ą#¨€F)ľą˘Ńh˙‡Ľ(Ŕ4ħâÉňĄ«¶ý´w$işńx\śG.^ =‡»ö´·Ź;Ö˙a˙Äߣ]o;3Ýf.&-§IŞ >>AÔ=iîŘď˛n¨Ż{ÖRWgÎ$ŔśA0©ęĆŢú›7Űf~ôŇß‘şüieV’:©2+ĹK{6í;«>2Ňg#ý‘ŻT˘(F˙6!Żn2V&ś$é?rňgRA,Gb±8%ĘĎĄşş:÷»Éú@¦:ą\»,ťś6HA”ÂÎTĆč3 ’é›&—T¤»LA<gj™Ä‹ 3=˘ř8/N‰ôjšżÇ÷ľßk{1ń[.L "T%ţ.Ü˙a˙ŮSg•WiĘ0ôŮĐä˝ÉĂ?R3 †/»:]}˙Ý—´â_Ň/Ę”H…đßĂ=Çş—ĎŞ L @U&ľňD%Ź'›Á™ęär-h~Ý?2O•,Ű©–!*Ai‰kŮgRţ•QË$™ŮšFŁ1r="ý»Ę&Ď"n§Dű;Ă0 ¶zí9ć‘ĘăńxKs Ă0®.ďŻĺą9‹C4•hŕô@ű¶v¦–ˇgpľî4Ťçrl!áYóă=FşçfJbbbÂň´YĄA‚ jjj¤2ˇĎCÖg“—ÖdşĘü¤yřÓÄ*¬čőh¦ŽÄiQśéFľ4śc…ÔöłŢQç›Î±ď±[1QĺXŘčO1z•Ëm)Š˘zy0 ““śŮlnßÖÚő[gř»pZŇvÔ¸Ńúcřk)B"í€c—˝űXŻô29Éő~ĐďŘ•kVĄ4#ś"óńRÎf}gU'Ó‘ŻTAÔ=[7p>a0ħxČá#——¨©ďcľm•$đS Vś“–)ŞÔÉĺZx4—|%\ĐhÉRŚ•ćÇ_śÉűĽě=Ęż2éíĄ ›A–ôjšý"Md ˝šűsĆeôšňŚ|>’\´ 8ŽKW7=‰€™e?r. L°_ŤĄ.{HÂÄŰíqű?č§Ť”˙¸'GIüÇ=Ŕů (Š–§ÍŐ+é´Ńůćľ–í;étýĆúÜ+$µ/ĎĽfĽŁ pě˛÷žč÷÷öź p“AV’˛O@ý6 ‚hţżmMݶa«·*»Ë¦զ\‰˘č:ŘÍ‹¤ű÷î´äňîH¤˝Łö­BŰnTYî·;ëŇEg"i„=‡ÜI2+ĹK˝Ł¬ďl&Ś•ÄŘ7ăţúĄ°ÚůH5SżwčrT¦jşď¤?«`ń)ľcw.i‘ŇľŹůb2™J"ú÷¨uŁ&&&Ě)V_¦:ą\›ÁPv€–(ň {Ý”ˇXńÓeâO *X $ÖÉĐőŢÎ- 4Ů_,TlÉVŰl”m˛5eŞ) Ć ů™cꬩkN’]aĽÓÝóŹë [Y9t…ut+\Í›mrŇU7oŢ,‘đ*¤őŘmě(»;çHę›ň”ĄAĄ;ÁđcxÎ^`-­öˇŹR˘’˘§Žôt/óˇâĄÍG´čRĺKŇ“-ëŔąĎý):2<"eňqw»S3ůdޓ˵I$ô éE±žN’ĘX”Ö (îÖQE’mÖĐ`KmÄüđ¸şéz/7îşÖ©ß,@ꇙšň,<#ĂÁ…Q•ôÔ‘žîe>hS5ď‰ÁŔ˛Wł¶8đóP•Ôظ¦Ó“!Č|hßÖަ_aJś Ř^JdănÝŇÚ˘_n’ ś ´okW^ĄA€„ ÁóAÓăi a†ÂZÎ1%­BRz)¸ÔÉ qZ$Ůtę0¤*IN€ PgěÚUI1f¦}W;:ăţ˝Ű´ĆÔ`mXo]OV’=Çz¤ň®ßwŃŐôúç×·4·´niU¦MzČ#I’\ľ|y4ýäâ'…ő[DL«M555˝=˝‚(đqľ˙ţ¤8 ô HąPÂąaéYW”ög›‹>ź˝@ëĐěɢ‚\ýzPţ•QË$LgiŇňj‹ău‡p_ţăţĐ•Pa]/č@¤¤,ĘDgąĎ®ę{G0ýÇxŹ&Ě qZśőwĚ=öy|ĺţ1Eůă}Ďëíö2O2@V’–g©*-O[,O["7"iŻŇZ Ŕýü>ż˝=‘˝×şŃjÝh- ß…=‚čśŇ©ŃRľyw×ňdác¦•Ú~ *€ô6€Šž]D č%k €Ę˛×XźÇ—Ww˘?ř{ü­źoEoD]].qJ´ľhí9ÚCV’Y/Ô”€ă¸čŤhë–Ö¬5É*ľ˙óŐ¤*.ą{2 cxÖ[ŕŃ˙°¬‚•¨ŮĹ%r=˛ţůő‚€ ť‘B(ßůŕ VÓeËYG×úŹđńŕě>‚d%Ź;Ę^ ]ýúĎ_ó÷ř‡ärˇ¦bř8t5ťµ¦đ@(Ĺž™â%Qpíw1Ď0‹Ĺ˙~ňbŞĽ´˙đ @’ł˙О3axlŤ‰MëŔ{¬mĘÄ~ˆŚg‹łáÚď2 I;·¤…©ePűG 5Š%ĹĽVĺŇ˝()Ső0kĎH"AŇA8ßt’•$YI:ßt˛_fץ@cĘHwoŃöęÎ/á{ĎÇMrß˙őű‘ĐČđĺá$W6™˛ţ•~AHüŁłŰ;YhúOh~%ŃěĐE0Ż›o›Jř)ř.ý©yĹl<ś=ś ź6Îć/-‚č•XÔ^ľ’ĄQAČ3!úôř<>Ľ8,ÝĆl¶Mji@9Ž3 L-ĂÔ2Ś™ů|$_٤, WÓDĄÂřĎyɇ¦<4M›ź4_ÎZ“$I’ĚľŔ)_,O[Ú¶´Ő¬«I*ľ<ěü­“$HşšvĽćĽ4¨<+Ž­Ń–é_î2đż@Ű «€˘ŔůVBKş–şDÇ`XŇŁ?p¬!v â÷Ŕůzâ}·ÔA۶ه>Ó: I°l€H4Q(<Ç ( «Ŕľä’´ĺ VH¸’ŤŮX`Ýh śN(ńÇŮmE‘$iŰlănsž †Ŕ齆¦VQRÍॠTŔŮÓg/ ň<ź¸ü6GQÔĐĺ„­eŰlłď¶Ë-HĂŇŞßd2‘$I­¤o8rdAT@?IîdüŤ+±)%N‹äĚN¸úôtuw=Ųłü7g6Ť‘ë‘ČőHß©ľŽ·:ň• AĘ…ömíýgúQ¦„Ŕ©€íĄYĄS¤©aZ¦ç,źĐ”zNô¸ş\ÁÁ ¤áŤ]K«Ř ‚°`ë@¸;ś8%škÍŇ˺ں荨˛‚Ożô&ř&PĆ_ş’™RD!M»č6Ŕëń© źÁŔ˛ąF S‚8•qp¤Üq˙ŢmZcj°6¬·®'+Éžc=ň©§žxjë«[Ą§žxJy•¦<ĐňrËČGgär’¬";öw4on.¬ëbÁ‹<PDbşš ¤'‰rRmYűWQär «€¬‚¶ísűúFż˙q I VB×aś V‚ůi`żî6Óŕ|BW¤ĆK˙ĂcP˝\űaŐ*°l€ČőŮ6ýŠXÎ7aüž‡áKŕ?‘Á}†/©•gŐ š¦™Z(Šę:ÔĹ~5;2~ź_öáÄb±ŃŻFí;ě`ßa83 WkyĄĹńšŁé?›ş=Ýź\ü$ŮçSPŃh”çy)ü@MV€XâRâ˝Ŕ ź›ĎáÂEYË^Ö,âŠ)ýÇRÇ7É PęÄăqiýĎÎÝ;›_YdMAJHx}Ţp8ů!Ňw˛O™čć\”iͶF;ĘJaľáoĂmŰÚ ëşXHŞżd€(ŠsV[Í5–`®  Ôţ•F”p„ <€ˇ‹súâ&L53-݆ÉÉÄqóf`Ż@č ŘÁ¶Ř+ąâX_0­ŔiĹŕî]0­†­íłmŇ+D%Ŕôl/Ě3 EżĄâqµňŚ#Łł1tyČZoĄ(Ь"›š›”V“Ňfś ÔÔÔHę»c—#z#:6>&źuţÖ˝m~ąY˛%”Đ4ýŮ?ş<´jŐ*ËK.ĢíVßéíKGéFlQ>TJmżě=Ęż2jY€¤Ŕ€é,Ť'–E#<Ď›V›śűśůЇ :Fk "ĹWČË~&®Oź4++¤”¤Ś&i˙ąQt5@ěÖLËw ş:qܸBW€ýš_KÄîŔŕ%°˝ďAÓĐy˘7˛÷r÷fÂ$Ööd*'2Ěł¨Älđżđ[·oíÜßÉ˙“WC\µ!p.pëÎ-j%E­¤,V ̆?{»˝}G;{…eݤŃď[^naŻ°ÂŻBë+­mŰŮPDů’çÓ˛¸OW<«3!«‘Ą±Ĺ2)•Ú~Ů{”eŇŰ3’@ôl%ö]öáOłÇ"ČŇA€Ĺ%mĽDë–Öţý‚(p“\ŕ\ }[»ň’´ŞýçbDQ+ˇń%pu ˙ řŽ‚}Gâ”í?ŕÖ-ţl›/{߇ĆͱřOw€çˇ˙C¨Nµ Z·AGg"¨€ă`äSŐr#$ÚO"S̆(Š0 ”‘‚eŔÝć܇ÓO }64yoňÇđŹ‘"ŇżľţľÁŹĄŻîwݢ(˙7xöôٶö6nn|Çq#źŽ‚Ë€¨$T~ű¤śČá™Yô窬—Ý;GJ7b‹…ţ÷HdJE~/ły”„>%MÝ!Č=I¤Ť—čú}]MŻ~}KsKë–Ö¤UIĹ5˘†Âň‡µO@}=řgö9$« ţ90­N¤ µmq lŤĆJ˙,ĎIÂÚµ ¦¬,JĺBŚ•°ö I°Zaü[µrz ´ď‚µ UÉídŠŮ ×Đ=˝=mímŇúź¶-é§çN´okgjzçëNŁŃ8p~€˝Âö~Đ;tq–A۶¶Ö-­ňţĐ ¦ÁwĚ·üß—“$9x~08Ěex "m%AQ”ĘăBűn;YER+)Ą=™©<e÷DĘD)-šö_âŔ‰™Nň±l‚-˘˝¤ŚĐçNŔ]Ý]ŢŁŞ.…Üb¦ˇzuµś˘A@@ I1$AúOřýĽ?€DZ#*Ó_K]š >e!µ†.§—ml|öŘąśű—¤Óř“úRľ$« ˙ôźJąÓ ĺÁŹŇ‹3ÉOSË]ű]®ý®Yßr€ĄÎ˘üH¤IÍĽ ä™~ĺ^oňŁ[n^C+ŁňĹXitĽć Hbëö­™ę¸:]ÜmîţÝűńxÜşÉjŞ19ö8TĘ3!í§[ü{X<ćż7đR‹ýŐÇ)}ž E¸L=™®ĘîŐUőĐ4˝t>ÓRą{ ¶tO^;#’„eŲÁž«Ô8?0ňÇiĂi×Ű®Ŕą€¤čg*_ ČĆĚ|4Úň6‡ň^9bPŻťáŇU @ZÄiQîôůÄ ’D©=KÜ=‹-)‚”%±XLśëžMl†WWWý{TĄ|é  oÍJÚšIí”%ůŻĽÓ¤AP'©ć˘Ź2@Ď€±kcŇ}±ŁlRI^1‚$€ů))”TĺĚ^•D<W)ObˇgmĄ<%rŞ’’÷6ß`€E×eÔ¤@*Ł÷(Ą‚F†K˙űtżŰ ›šlMĐdkjŘÔTR¸¬˘/ŘQ¶ĺŐć†y†q˝“X~íîrŰl6†a,KÇţió&ôĚź´şľ­Ń†I 9C®ő+Iŕ§föâŤFŁJyŹć2ů5ČŁČTsq%_Dň˝}M —®öHK.źiíĽ˛°Ł¬÷=oĎńžČ‘ďÇľoß‘HUi4űN÷E"‘«ěUˇc_‡ňŞRgZ  … y!Ěc}“ÉDTňňž‰‰ óÓf•r$= ’l§ěČÝjZ\9“Đ ‚ 9â}Ďëíö2O2@V’–g-Rąë€‹yśĘHíycĎřwăĘ«Pyť?hD!Č<AZĐ›É0ŘłkŹű¨[x p·9˙ű~Çkőň,hL™C|Ń €śTśgďvî±ĎăÓše† Źżőó­čŤ¨«Ë%N‰Ö­=G{$˙¸v”­{şNY‚1óŤ(™'Ź=öň@úMŹ\ʬ~˝dř{ý{˙kďňUË ‚pľé”Sýd*Gâ°°ąŁ˙}¤ýž˝Ćú<ľLgd‰ …ľ±ŁěŐĐUŘ»oďCúNö)ë°ŁěŔ™ /( QyU26>Ö˙A˙Äß'Ä)Qą!@¦r 4˘dž¤ý•gjŮ@’dđŁ4{˝e*Ď„vŇ8"Č| *A)ŽFź1ž#śÝG¬Î7ťd%IV’Î7ťě—¬˛{…íř]G_źĺi‹˛—Ż(!ŞÖm­~_ň†_™Ę%ĐBr5ŠBX«Igń ŇŤ”ňĂ&N‹äL|}ĆĚÚ3’ AtĐ«i˘RńÝ_6çěĐ塎ΎłýgSwlEĺU‰ĺiKŰ–¶šu59–K … ţAŰIK„ôC/ęŐŕóř ňę+i%Ö\l›˛§í?ŐĎÔ2L-Ă÷a 8FôIű¶öţ3ý‚(SBŕTŔöRBלtżŰ}aŕ‚uŁ5ő*T^çQ‚¤g-‘’ˇ˙}şş»ÂîLg¨ÓŞčŇĐ×ţ:r=ů!BWÓůЇ eű÷nÓSµa˝u=YIöë‘Ę}ďúÄ)qçîťĚ Ę«Pyť?hD!Hą°@18YŽ”Ą¶ŻÓ,@źÚÉ``Ů« ş÷=ďŐ/®R° śűśůЇ ĺAx}^Ż/ŮO ZU‚¬óŤ()=z„qŔĐ˙>†T{=É P*„ř˝8cfÔ*!Č•×ůAd!QîPö1Ęż2jY€¤Ŕ€éB„DD•×$„iAzŠ Ó‚0-d-4˘)/Đ’šĚP¤«ĺ_™ôöŚäŢUYEW#ŃHľ"!Č•×$žzâ©­Żn•žz⩬ĺ€F‚”K}ýŹž‚JźjSË(µý˛÷¤%‘(ů-Ďćppwěëˇ˙Tľâ!Ž)µňZv?·7ç’µĐBňA»ű”ŰŁY\ôĐŐÝ•ĺëŞęç[ζ-më­ë™Z†y†áďńůЇ :¦ÔĘ«vn‹z)Kŕ‰]ŤEĹžIC €ó-gäz$r=‰FpQ‚€ůAâ°~2Š‚®bŇ"N‹˛‘ţ ›AĐ0Đ€ nY0Ť| üXýÇHw8vmŚe€eÇ®Ť)K0 ‚ȰŁlË«-Ě3 ó ăzÇ%/­›¬Ň`m­máďÂĘKĐ0Đ€ ĺÂÂ=‘4™:¦pP;×Jm?1NTém•ý¶ŠH˝¨Ôď~·65H/›föüJ-A%;Ęzßóöťěcžd„)!úsT*·ŐŰš77SF ¦ˇ˙L˙Ţ7ö†Ăł6zćOîFÚ˛¸ŕF`>Đ ŔŁÜźČ˘Ľďy˝Ý^ćIČJŇň¬E*§WÓ”‘JTšz5­ĽJS€đDŘ`0Nč54YE:ö8ŕáląt<űR3 A˛Ag®‰…DK¦˙ArżÇßúůVôFÔşÉj±X:öwSł›UE~Ž0Ď0kźX;tyčÂŔĺ…ô°_±7˙qóîÍ»®.Waý.$€ ˘g´7ŃLTÂĚŹĽ>=ŢŁ^éźű°;Ó±¦ćdQÇăŔޞWCWżţó×ü=ţŔˇňYćq&ňCäÇ~4Ő|=>ĺ…šňHxŹxI’¤VR]‡»‚ ë·0ĆĆÇěívćfíÚµĘrw—Űfł1 #W||N6á’Qá 0€$$¬‚–W@ůV¸öÁěhşúU@Vm3D˘ÉmfşŠ1Ď–€$^sd $Á±ć”(+dŞŻ.[xlŤ‰ú¦uŕ=VŔh!HF 3,¶ ŢYĘÄi‘śÉ‚Łç•IDöëóř2ťE%Aŕ|ÓIV’ŇÁ^Çޤ:d%éxݱױ×˙ż\¨A€©&Ń—iµirr˛°~ ¨"Z·µÚwŘ;~ס,7Ť}§űÇ>ÎwęîŘלµL @ř`đTž*Y1Q#Ũ‰Ę¤DµIŞĹÜT7fłRáIőŤ!‘Š“HÁI®ł]śT NŞ“ęhuSśHMLĄ¨´YĚŁMˇWÍŤ©ÚłşmÍŞéšj[ᨩÔD« ë‰ďÇ m°1äĽdˇ™3çÇÇc3>ç|~ˇţŹ8P‹ŕ°ęÚü­ż‚iô| Ă&Ś|ßçśQföź‚Ă(5Í9MZ_C6YFĹďŃô&üźy#ücŞ7‡ÁHĺYÄÖŚ5€.WG°kÖ ůíffâĎ`,˙4ŻËW™˙%›xĹ97 5á;±±Â?‡ ×bfy#MĆöÝ#÷#‹fALĎ™Ş÷VoÚĽ)®ÜyÂ)<#ŕô\ݱşˇŻ‡ćś)ŽCă0ü·Ři÷5 —?DĎ5HÉ2ÇQ 7§PŁUÝQx.ĹŽ=—Pwt‰ňj'[ř"÷á8űꚌ¨Ţ—ĆŃ cUłö}f×399Yĺ~Á`dµűj=—Xĺ)YžŠĹµń^őž~ëtWg—y§9±Ićóô~‚ńűř{ˇocŻz>†<_Ó´ĆçŃţţ#´ď˘˙Óĺ’T µlá0ÚŢx$)‰ëÁX1VŰc<ŤdÍŠhMů¨˙*hE˘ŽS t‰D¨ŔĐ—CŢ ŢG•ŤÁXŰd•Ŕd4MOOk…0J?[·l­yą†lݲ•¶ĽŐťŚ8t@AÝ$ó€ÎQ»B x>ör…^ŹÎ«I*76Ŕóä‰Gk•y2>®˙Ňë+˛éó1ôW^!(*Bt˝JI*ÁČY¶ RĎ0K˝Ú IDATöW}ő_…ä몠ĆBęđHň0ŹLÇččhŠ… iÍ`2&ůÝI˛Cź7<'®~ő^Tď}äVꡓʠ!ä|őËŮH›ń32Áš1Jd<ć¬}€X D”ź‘…4 C¬Ň¬RVŔ€Á`,ŠU·%Á`$eíű4ťnZŕß5e‘Ó,ťĚű0 ăqfMů$Ec=CSŔóĽ”4C&ÁŔ4ËÓ0 #“¬ý<Ń©¨2H~Ŕ4 Ć ţAŐËUÂ6AŘ&8ßpÎą6Ëď-EEEqM˛JćääJ©ÚSµ*vÍ™€ÁX-<[)‘µ)·˛V°,cíűĐwř2ŕôđú_Ô%Ě€Á řýîwÝ­çZC߆ľ |SűĘśDJmŰřuIB»gˇ@ţU–eyě§1=§ŻŢ_˝¸q3 Ó0«…ÇÁ(‘ń8°ö}Nżu@ů‹ĺ– –ŠňËăJ/+±†pżëvźv Ď H>1=?›­6ücx o ±ˇ1±UViÔp×ř‡Ćáż /®y&a‘¶źÍHş\ťKTłF5Ó©±4‘ŚUŹt_şóăť‘ďGĚ/šM&S}C˝<)+Wëę]o»tůIv˛P{G’ÔţA»ń9c\9) Ękq=/;i]DQł(<\nˇ—Lp99Pł˛y?\R˘çI') „<ňÇşĽ·ČńšŁí\ŰňôĹ`0ÖÚ?j™JQťŠ’řµ©`0©‰Dřý7nŢúâ–t_:qę˝ä˝ä5ÄĐíPűűíÂ6!hÜq\`2¦:}OŠ4) ťę›ŃëtvŁQg4Ö\ëQ—ó\˘(ZvY8Ž#„Xv[Ä»"L}b§*ĘÍĺęN´1ńĽ­D0¬‹źh¨Ü]ŮŰ×KŹC·CŮcl¶Váô\żŻ_–ĺŃŃŃčT4©ëżłŃ)ŢŚ=CÝW»˝ť^írcmłöó4żÝĚv÷ŚT¨ÝWëąä‘ٞ<){/x-żł¨ÜSyë‹[ýýýý—=—ôôďÚąKi•µ>ó!«XŢžµ ý¶ E[Šzűz»:ç&­” ă<$ cc ą8rÄ»¨wŔŰ YĆŘ(쇵šËđ\DŮöŮ’vD$Śý„cE8ßĐKAĹČýHńłĹcŐ®óßđĎŚr "EĆ~{0ö@EŻöVŕf>Ü™;$I#ąäČń#©Ü¸NÔî"Źä:R\R¬h„™Ą›¶smB‰ęú˙zăŕ&ÖéĽÚé:ă"„ßČ;_wz?ňj—3k›Ç"@ě('‡™Ł1¸Ţt6ĘÍĺĄćR’OZ϶ :ÂňôĄ_ŻŔňD7;Zu€•BxF}úű·7l2´´¶¨/­€ç!”ǡéüźr\ŚŚ@’@ `.KŢ–<R€'žÄŔ ôúb…’ß5´˝spť„ďšćX3H @RóYi×ńă÷ÇH’ä»ćk{ŻŤÎĹ]']ľkľ$őy^™6ťjňîOĺžÄˇvy$×}ľž:Ő02ĎŔ§eŰ㿸áp8:5> `4GľŃ(g¤ÄęŤP”)GŰlfíçhinɡS˙éiLO'~S-/j…µě˛t_éVNĺ ™QUBc w‹; †ľ uśď Îj„g…ŃŃѸ¬Ҍ¦ééé•rH’OěGí×Ô…+˘číą,f®SQ‰č$đ<>ů zű°aL;ŕO˛‘ ňČý¸|x/Ĺ Ĺq¶ĹUV(sŕ¤c)Pă¨čäĽ?=Äq±p]!flý…m]TY«’Nµ{űzÍefj&TQYˇÝů˛™ŚčőúLŽČ ô_ďoomď8ßWNcšqů1{-]ľŽ~mć+Ź#g.铟±<¬Ţ•IYű>M§›¦ˇZç%[h`?lW+}}ľ˛ß–ń|’tH Ćă Ó,†ą Č3Żîˇf? ýy7U둪—ŕżůWX÷ zżV'†Íčş‚–VHđ…06 ybć%/0…çyý:ýđwZŢ·=÷P-ľ06:6»%ź`Ę%Ý“jö×464JżHň„|sŕ&-§žîŇd, Pä~üT/îçŹĚÖMŚÜ1nŹŹ?ËXF’~˝}˝5µ5ţÓźC9Ńí 壏NFé mľň8XÜpĆÚcíű¸›[´´<99~˙MŤž­ű¬C_Q2ŢŹĽöĂöGŹÁXĂd• §dú•§dyJ€)t_í¦†.â¸Řţ~»uŹUÝ$ó€h§ň Ţ…ëL¬\Ѳ äA—]®f/€iŚĎŁý}ŕ8X÷ˇľ1¶ ]iŚĄĆşÇKÍž@h$DcĽ¸ßvŕ8ÎşĎZßX/IQűŻÇ‡¨ŠF٧çń®čš Ó)<#čőzĎE0§\ę"”ľ<J}ůáě¬J#0pc zOĚ5kó0¬j?‹î+Ýč÷őWí©J¬o0tů:ĹĽgxx¸řąbŤňldµ= YÎÚ÷ČIś@Ä)4á!µűj©@Ľ+˙mغתՀÁxĚ`€8¶nŮZór =Řşe+-řt üĹršŔh46˝Ý¤n’y ż­í¨®ŤŮäTďťą0…–łxę7 =WŃÝŁŐ Ą±ž O@—ú|m!0›1ô•ćX*pt_íV—'c·5űk8=ú6¤|…şĽ]ú|}Ń–"BŮlúj(áÝń­í­ŐµŐÔţ§zďLLKgĄň0 Ć2ô)ý<şW5kÄ@¦ÓM ě .¤`?lţŰp6š2+ÍjŃ„n‡˛Ö~oEň0 ĆRYđůü¨pW)k$€ë™)hřŤüôô´ëT&Ţ>±˛řýU/W Űa›@s¬†ľ 3TďŻV×Ď* @bÄ•XÉ\c€liŚŐBÖé$YN+ƢX#y4NE•×ä)hŚÇ˙ ßý®»ő\kčŰĐ7oj_©U.…fčýSŻşÉjŃd3LŔ`¬Vć‰Ä2[-ŽUwÇ2(°.W§ě‰­â(@ĐőLŕË}_ţA\I*ă1Áý®Ű}Ú-<+ ůÄô||>ťDVK ŕp°ÔT:ýżŮ'i c9Éš`;‹!#‹ĚčT”Ě쀯M Ŕé·N(±ś«°T”żXW˛ŚĂ1«éľtçÇ;#ߏ_4›L¦ú†zyrÖfĆô‚Éd29ßpĘŃ9†4L°tŇŞXu‰¨‚ĂČÉ"°íÍűˇWłĹ8O:IAJ|$Éô­sĽćh;×–ąń ĆăŠ.WG·ĂÖ¬Ŕtj,ă Ć*%‰đúoÜĽőĹ-éľtâÔ |!˙Égź˙'Ř?ЇOź:­n•U>ňT,‡) tÁź1C[­MŘ&%ą<Ëď-‰—2¦eŮvČF ·ž›7Aʢ łvB@ @ `ŮŤĐČ2tş | ŃúétśB Çq&ŁÉyŇ)Ý“´{îIí­í·ľ¸µđaÓŽ…µa8ląŇÍťuç$»ĂÜz.ŰŻ÷Î{ČY7w®ÍÖ×+ÍČćzÓŐŇÚ"Od©ł Yč°â0ó¤Ĺ±Ňwlíű0ŚŃétŻ:H>!ůÄńŞĂ˙_~śžžđ…|ăëŤ˙9 n•…ů,OÄ^·ľ¸µ¸q‡®@gÝgmkIľ‰Űv±Ť_Ç'–gĚŔŮčďŠĆ„‚ˇî«ÝŢÎ%í¬'"˙ y~Á€µ ×_öÚmms‡ĺ Y’¤®+]Ň}IŘ&hßq\`2¦:}OŠ4) =śbe˝Ng7/ďI’3Ţ?č7 5+é9SőŢęM›7%^ ˙čhlhLr)S€Î«ť®3.R@řŤĽóu§÷Ł$ Q„e8„Ŕ˛âÝXąç n=ěÇ´F!ŽŁţn¶Dž€˝RŰ!({ńóŤĄŕëóUî®L:ŠP"x;˝ćťf×[®™Qd{ťťă8R@l‡ltËżô…R„ÄL€DQ´ě˛pG±ě¶wE$ú(‘ŁĘÍĺęN´1ńĽ­D0¬ă/őöőZ÷Z´í¶ë9!Ťż5Ţ™ýď¨Ü]ŮŰółÝ)… ĆŁˇ˝TËÚ…\¦SĎöWA&`jĐŻ±ţöéoinI—d ĆZ§v_­ç’ǸĂ)x/x-żł"Rt2Ę?ÍK÷Ąö÷Ű-˙jQ7ÉB @vRßPďzŰ5g‰5Cş©)áp8:5>o¤§FŁQ™:ÇŃqB $ jqä8úŻCĽ‹znúaŮybÎä>yž‹(Ű>[rŔ<ÄŘOPe…ó xÎĎ;–‚(Š‘ű‘âg‹5ĆŞ;\w¤îČĚ(đc?Ť¨˛V9ßpzÎ{nn•šJŐö?ç;„A’¤µŽ?Ň˝_ëÍâ:™oRľ éŽďšď¦˙f\áŔŹ#eOĎę…ŠKŠ‡ßŠi„™1bPŻÖśśěťą2V«,@óŰÍkf6Ŕ`d!®7]†Ť†rsy©ą”ä“Öł­˘“Q[ťM„rK9żŽo>۬nÂ4©ŕ˝ä5y ¤O<‰čŤYµ@’ໆ¶÷bđ]Ók)"Q95ŢżŽż?@’$ß5_Ű{mÔ÷ĂuŇĺ›±«™űîxˇDŔq\Ó©&˙ç~ŤÎçC10‹{i· 8=' ęÂţÂíCŽ—fµú|}ŇĎ…Á`0–‘Uć0»8ˇë`±ĽäÂÝâˇoCç;H>Ŕ?Íű?ó‡BˇĐ·ˇŽ ś~ŽmCViLFÓôôś@ź±’d—2Fřç°÷#oó™ćů*dĆ€~šŇdĚk6:Őëő‰Őzű`.‹™ëTT": <ŹOţ‚Ţ>lŘÓř“!?€<рˇ÷R¬Pa[lPe…2żM:–ý¦E'çÝ“ Ž‹…ë 1cë/lč ĘZ•tÝŰ×k.3S3ˇŠĘ íΗ_źŹÚ˙Ě 3ŞąÖýç}6?«LF’~.Ś,amlI¤őťÉŞ»”…‚%zNg\°lńh;çV^‰§ -Í-9Š ,YWË‹Z1=-»,ÝWş•SyB&DEmŮ$I˛ěJľo@EŽ‹·őLZČ`¬I`A‚CÁńűă– “ÉTłż€Éd¸1ëKť €Á`ĐĺëFľ‹Eç.~.ŢşFş‡šýhl€ô ä ÜTů{W˝˙ ȿºŐű5ÚŚ®+hi…$_cŁ'f^ňcQxž×ŻÓ§ĺ}ŰóqŹe·_țݒOű#Ý“jö×464JżHň„|s fŤCÝß•ĄQä~üĘ!n_ŚĚÖMzŻőZ÷Í.şo‡ôůú_±Umžó±ŽÜ1n7jwĹXABć»'+~ݞV°ůČ `ęŮţ kś']‰Ż¸:M§›¦ˇşAŹčÁ~Ř®vzóőůĘ~[ĆóI‚r¨á8Î?¸51ń8U€l@ž’éUž’ĺ)@ĺžĘ[_Üęčďčżěą   ×Î]J“ŚEŞ;XçzÇ%OČâ]±íý6űa{\…h§ň Ţ…ëL¬\Ѳ äA—ÝB ÔM;`|íďÇÁşőŤ±őíJc,5Ö=Öůżˇ‘ýÝ?čwżíŔqśuźµľ±^’$˘(&÷GŁQLÓsČxWTˇ Ďz˝ŢsŃĚ)W şę1 @žĄľüpö€‡P#ň|¬żî»yĐnIřż¸1P˝§šŻş cµŤ>~îć­ĺQNŽ?ÁżJŤuźučë!ĺ!îýČk?l—'dóNłP,%‚e—…ţÄŇ-|Çq‡Éhj{ŻŤnç'­IqĽćJs™9Qźţ!lŢiJÓSh$ŔýŽŰ`0Đ’ő F–Ă4qlݲµćĺz°uËVDGřBžľôëőřBžčf7Ś3¨­˝Ťçů§6<%ŰA›˝.~ŔoDk;Şkc69Ő{g.Lˇĺ,žú AĎUt÷,ßĺÎË(®fWÓ‰&e™1pc éTSęă2ŇĘĘoFĚhµ=$WzÓVüTŁţ4WB0µ˝Olĺż‹$>ë›ßnž7{%˝‰ ŮęŘŰmu6×—÷#Żuź•Zmľ´ĽÓ™Ś`jÖ T§ÓÍîQň’×D.hMŰ+6Ëďçx ČňĐ×C5µ5±>su¤€”m/«˛VUî®4ď4›ËĚÚ3YNşCXćÄ­ů×"Ó¬FićťµPőď‚xÎ{4N+‹ň Zů•…m´§Bâô:kďXfË®<ôżKă÷>ůâD­XČ2ŐĽÓ 0đ^őĆ~W˘fÍ7o„!üCŘdŽŮhR·°9ĚSS]®.t{ÎŁ?0~újČuĘeŘlđ~¸ĚÉ8ŚLÂ4K'Ý‹(±ÖČ’E‚˛ź­ś2˛›lôĐ (ĺ«6µp'ööúăőč1‹ AťŔćcŢšS ŢfÝwÓ†) ĆçŤŢÎŘ?řU!ŢM;LŽă޶smĚ˝±Úa>K‡i Ć#ŔćŮŚ%“Ťy46üšN7-°¸€ý°}řoĂŠ›) M§›„m‚ÉhJ˛ëŻbľšz˝ŢwÝ'”ľëľ¶o‹kŐű§Ţ…Á°ŮĐţ~»•«÷W %‚P"9vÄ{m˙3˛˙ żęĺ*a› lśo8,G–iŞ^Ş˘ÖŰjřŤ|ś]x¶‘±(@ c‰dŃ–›ý?ŮóÁ)$fČ ş\ťşl…}RY]h,Nb¤ ŕ7ňqS ×)—ëT쭹ϺđuÇę:ĐńJPöţOű#÷#uë1tĆ`cµ0==ťk€lžýg›lj7€l“M!ă‚E§˘dfÓ|%}ÔÝjŚťŠ*ł¤7żĐ Ę`04pżëvźv Ď H>1=oŇ.§d• ú˙V×ç×÷|ÜŁ¸ěü°łö•ÚŁ7®Ě€Á`0™D—«Ł!†łČ@cŞ| ¦óţAŕË€ş$ ÁHDş/ÝůńÎČ÷#ćÍ&“©ľˇ^ž”5Ę˛Ë öĂvďĄeťtOň}ⳍ7 @cÉ/N¤e‡i•ŕ0rrfĂ(ŰŮ–MÁyŇI Îć›L’,ĘŐĺxÍŃv.Ţ •±¦ "Y»ŤÍX=dŁ€Ć(§ß:  üĹň K€ KEů‹ĺq%ÁX{D"ţA˙Í›·ľ¸%Ý—Nś:ˇQ®UöŁöˇżѨ‹Ţ«ŢâgŠ“Ű•'dyBN,_:ˇ€­Ö&lŠŠŠ”ÂĐ÷ˇ˘˘"a†ęýsB ?&>tÖNHH,»Y¸Ő‚„n‡_¨ďťŽBHá8Îd49O:Ą{ńVšqH÷¤öÖö[_ÜRgó}TÂ?„M;R Ŕ[®tsgÝ9ó¶ÖÄ~˝ßpŢCÎşąsm¶ľ^iFl×›®–Ö–4}±ŮBÖÎţŮâdUˇžíŻ Ŕtjd@HcŤAýÚŻ:H>!ůÄńŞĂ˙_~Ťr…ěŇa׿îęĽÔ  óRgÝŃL[˙ë tÖ}Ö¶–$±ˇz˙Ô«.¬4ňŻ'đŕ 8P» ¶Đn;h›;„,OČ’$u]é’îKÂ6Aűë'Ž‹LĆT§ďI‘&Ąá݇S¬¬×éěFăĺ=ÖĹŤĹéH˙+µň)×čŃ)T_óŃržçÍż5w^í\\·ŚTČ ĆŁ’µ‹“•L=Ű_‘&ř§y]ľę?or…lÓ°µ{Żz_F~Qâ}ĹAČbě=RÁôś©zoő¦Í›Ro’îE”¦`;d«ÝWËqńs,Š,ËK±÷X¦L&“Éů†SŽÎ:Ý‹¨ö)2öÓر˘(Î đúąôŁcŁcĂĂĂÎ&'ń®Xď¨÷vzeY›oŐq’„±1\9â]Ô;ŕí„,clöĂZ"Éđ\DŮvµHű Ć Špľˇ5–‚(Š‘ű‘âg‹5ĆŞ;\§„bKz+nnaîW˘ă|gń»´ IDAT‡$Iccc$—9~DëťĚ× u2I|iwrŕ˙őF˘Ń±×ťN¸Ä‰¨óżúwŕÇ‘˛§yĺ´¸¤XQD%3b0IYe>‰Đɵüakc)¸Ţt6ĘÍĺĄćR’OZ϶j—S˛P@]ďÜą“ÔýwEŕ ůO>ű$ř?Áţţp8|úÔiőŐ´.˘$Iň]óµ˝×F' ®“.ߌĹ÷ŰnşÓßt¦©űănČr122"I) I=(xB pšNÁ˙9T !I 0—%—‡<R€'žÄŔ ôÎ"Iđ]CŰ{1÷×Iř®iŽĄĽ»`Ž’*QÚuüřýńo…ęÝńB‰€ă¸¦SMţĎ“®‘:™$ľ4šH˛ěiűť…ääÁµÓě»˝€“D˙áöˇ@ÇKł }ľžúí0ŇJcŐ‘µźZĆŁßáUć A›ý3K$îw0 }ę8ßAňÉĺ˛R í˝¶ééiË.ËÂU3§ç„g|!ßřzăŔ¨Ż¦uE Ü…mťőVY«ÔDæXꆧ ăăăxž˙ä/źôöőnذÁ´Ă”4[yoĚe1sťŠJD'€çńÉ_Đۇ `Ú˙`ryä'0úpůđ^R„a[lPe…"cұ8= :9ďĎ˝…ë ĽŞw×k.3S3ˇŠĘ íΗq2Š©¨pŃCÎşÉYwŐÇÝ‘™źc2Ă9GB5׺˙ĽĎfâg5‘É^ŻĎŚŔŹ-q>‡IŹ5.-˘Zúzfrfsµ4őLżĆ«Ű gfűsßÁČ٨Xm¤uĹňĆFÇf÷ˇU¶OáóńđĎa:KPőR•˙†_ţU¶î±Ć, ÝCÍ~46@úňnŞÖ2U/ÁňݰîAő~Í·Ľ]WĐŇ š2‘/€±QČ3/y±bďŽçőëôĂßiyßö|ÜcŮmYđVĚĽ;©fMcCŁô‹$OČ7bąe¨7Ľ4 (ążrűé$ó !'źŻC®něőFů”KyŃKň Jĺîۡ}ľţWlU›çügŤÜ1n7jŚÂHq+őé|Ç=h4™Ż‡ô b+.@Š®¸=dL€lńh;çV^‰§Ë…(Š999B‰@_Ő{ăŘkYîzË%˲tOjy§…ĆҡdYFtůşÄ-ˇh§ň Ţ…ëL¬\Ѳ äA—].´1í€ńy´żO…„uęcëÚ•ĆXj¬{¬IŐB#!ű1»Đď~Ű˝ŕ­ywQLÓsČxWtÍ„éžôz˝ç˘S®@uÔcŞ){J}ĹÁW~;ć±×˙ç ë)NČý?$˙Żń|¬żî»yĐnIřJ ܨŢűiËŞ #«Č"çIWâkľĘj3&őń‚čőúĐí})ˇ–Bd2Ňţ~;=ć8nľß!c­Â4‰lݲµćĺz°uËVŃɨ­Î&BąĄś_Ç7źmV×O÷"ŞËŰĄĎ×m)"„Í桯†”K–ßYжm(ÚP\RÜüv3LˇĺlËSżyŠŇsµ§»§;®7~#ZŰQ]łÉ©Ţ;sa -gńÔo@z®˘»gaÁŕůňú|m!0›1ô•ćX*pt_ť#$y2ćq[łż†ÓsˇoCĘ×OăVĚĽ;ľµ˝µş¶šÚ˙Ěî填§Ë{ÉK©¨¬HôŤć7ňµk‹„˘ď<Ńě*˝čˇO4Ç~ěşţżj˝NWô‡śu›?ęú9ů'^Ý™BĹU/5"Ę&Ô=)đ×@ÝáXč[ńgѸÝą‹±Ś¬řŠ ŔXśęŮ~l»fĹ}rrr|3´‚Úh)ż 8t@—Ż«Ü]éąä‘îI˘( ‚ ě Űéž$OČ•‘űä˘p]ˇ·Ók0*,‘H„zŚÝüě¦Ň*8í‡íţAż‘Ľť^Ş.pżăö~ä%ůD§Óő˙ĄźWYs2ŮOę“×µĆ>FGGăJř§y˙góî¤{E ç‚ÇsÁ“xÉ~ĐnŻ›3—ĺ7ňˇ€v‡Î8fOŻŃ†ÄO§ç`2Ć ¬Ţ;;§'đ\€çBJc©»2Mćťfď‡^ű1»ÉhŇţEHz+âZ9śÎ†Ů@IŽ×ô ęĄŞŞp•RN¤ŞŰv_‰_,i0ýN’ 5’ĎKUž—Ş/-Ř€«ŮŐt˘IY Üh:Ő”şH ăń!}Rdqł:Y§/çÉŘ#ţ@ÝćłÍÁŻ‚ÔĘs>ŽôűúC#ˇĐíPcCcýńz7ý7­‚şňCšÎ4…FB–]–úĆzeô]»v‡mçÚ\§\ä ůtóéĐ·ˇĐíPđ« żŽÍţ«ŚÇ*‰UšH·`ÍÓ}Ą;iľ‚Ç ĎyŹň»FO—ĹŇ•‘VVéţ1`µ  öXy €ÚŞéą#t˛®.‘'ä‘ďGčSŇöŠ­ýöyç!đu ĺť–ČdSłŢ`‰Äőiů}ĚŢW§ÓUí©`ţsýkőH)Ű^Ve­ŞÜ]iŢiNqŹÁČf`é°EÁ`02Iůł‘|5¤Ď˛» ŞoB4:ł"zšý5—?Ľşę˙K˙lyęÝŞ4 Ę­ Úζ‘|â:ĺb›XŚU›Ľ.ťŃÄlW8Á`<~čruJT‚lɰ¦§§ă¤) ĹĎÓX±<8§ç˘SŃđauˇ•1 $GcAĐçëWq}j…zń®hÚarw´ťkc>ÄŚ•Ĺ?čŻząJŘ&Ű%_¬ ˘hK‘ ę&ĽúaŢ RŽCŐ„•‡‘“B@HŞö ž9% Du•Ä*+QhźY[D1 #“D§˘d&VŰĘk(©ěýÇŮQżáTŞ}ăȮήú†zÓSdr&´s:ţŁĂl1›v”,0¤€4ťn¶ &ŁIŮË'¤v_­ałú+t]é:}ć´P"řým˙Ţ6źő h> [-<8Obř;¸ŢB÷•9Ő8Ť@ijN4Jź!­üQ™i ‘IÔ>±€.W$_´ťs§i  îvľQâvýă¶˙Ő ăQ‘îKw~Ľ3ňýłÉťŚš˙ŐÜúN+ɟѼűăîâ犅çć(»Ň:yEŚ|Ű+s k_Á‘şů%´ăs‹ěseaŽÔ Áa”š0ýż [S¶C6ËżX–âĺ<éô\ô` ‰I’$Xj*ťţßôşI8^sž6¨C÷0 FPŰűd‹€Ć(ęđ˙ó±‡`ecžÁxÜD"üţ›7o}qKş/ť8u"®NϵĹ.H!­ć+Ň}ŕ çňë0~ö”<R€˘"Dîˇ+…äSIű\.C[­MŘ&Ĺ]Ję_AIë"ЦŠg—mň„LYĆŘ łÎ °ěFhdş Ýľ ĐŮ?}„R@8Ž3MΓÎ×Ň=©˝µýÖ·uöŻ&üCŘ´#^6ţpŘrĄ›;ëΙ›*X~[_/9ëćεąTľ^®7]-­-ňÄâĹc0ŚEŤyćEńôE˛í˙¤§ #E¨[‹ăUÉ'$ź8^uř˙kŽKúŔŤčd4ÎižĽrë@źS(ŢGáşŮSůä Hú?…PĽČ>— ]ÎşĎÚÖďö3ź%3>ÁŻbF‰=÷6-ż&Aţňüâ׉‹ˇývŰAŰÜ!dyB–$©ëJ—t_¶ Ú÷DŚ©Nß“"MJĂ_§j+¦×éěFăĺ=ń˙&Î˙ę'˘N¸BŻ:şoŹxg Dyž7˙ÖÜyµs)2˛ű1»ałÂqś­Ö¦^ŻöÚoÚa˘«Ů¸L|Y–m‡l¤€pë9×™Eî˝Î'Q‘“—“4wuZ ĚefşžŻz©*éqZ‡Ă–ÝR@xžWĚąÓ!€÷CŻałBąĚř2zçisó¬ @śłoÜ1›ý3‹š×ĺ«˙ fÝW»­{­D˙S‘ÖÉ+ĎŁřYt_›Sč»ËîEt¦ŐçrazÎT˝·zÓćMqĺÚţđ¨;Zçą‹]ćąä©;š`DEXvă@,»!ŢŤ•{.Ŕ`!ŕÖĂ~Lk Bŕ8ŠáďfKä ŘëŔq °šuČžo,_źŻrweŇQ„ÁŰé5ď4»ŢrÍŚ"ŰëěÇ‘b;dŁ[ţĄ/”bfş@EË. Çq„Ën‹xWÄŚnA ;UQn.Ww˘Ť‰çm%‚aWŢ9<ěÚi&yŕ ł¬Ě;<»˘¨Ü]ŮŰ×KŹC·CIgcŚŐ§çú}ý˛,ŹŽŽF§˘ŐűcqGú?í?Ńp˘«łKžÇ~sĽęHlëltŠwĹcBÁP÷Őnµ«áŇUěú—]‰zÝ´ OČżŻ°îµĘżĘĆň…Š`™@ŐËUĹ›‹ĺr(ňú“ćđ^,»-Á˙ ʲü«\৞ęĺŞÔ;O«Č¶<™…Á`ÄQ»ŻÖsÉ#GeyRö^đZ~7ľV‡ţ{(éďDş'Ż­ďáô[čîB–Ńvľ>¸ß^\g }fĹżÂü˘Ůd2Ő7ÔË“sL>2 °´űú|˛,‡FBŇ}I#6qÇyHĆĆ@rqä8wQ˛Ś±QŘk $OŔseŰgKŘ‘0öŚAá|Ck,Q#÷#ĹĎjétę×ůořgF9‘"c?Ť={ Š"5˛ş¸…™éÎĚ’$ŤŤŤ‘\räř­w2C\'¤€$}iô–¤h4j,Ś™ť ů‘qQąZ\R¬h„™­ÚεŃđ€Ç5ľŢ8řß´üDÉŽóô) I Ě:ŻvşÎ¸Há7ňÎםJx’e@!~>t’>Â?‡Ł“QçëNäÇ«Ž‘ď’ ¦Q€pxä»w‹yŕ8ÎuĘĄlŽ,»ăf·Ők*ť§U¬:€¤,:ÁPăzÓeŘh(7——šKI>i=ŰŞ\ęţ¸»řŮx÷_Jş'ŻU/ˇßĎ OaĂ ~‰[,ŃVé33,č_‘ §ç,»,ľkľÎKťöŁóúÔň<„ŕ84ť‚˙s@.‹‘HHĚeÉŰRgŚ'žÄŔ ôúb…’ß5´˝spť„oF÷’|¬¤`ŽV*QÚuüřýq’$ů®ůÚŢkŁsq×I—ďš/I}žWfM§šüź/&ďŠ_Oż!Ś5ĚŔ§eŰˢ8ňýHđvĐ`0pë9[­M ¨‡Ł“QăóFzj4“N‘'€ď%Żńyc˘Ť\ZŠăvcŰűmxyBö\ôÔŚßZJď ˙}Ş˙ÁÄΗQŞÖËů?9ŢŹĽ7?»™bçi€˛š|’˘¸P´ Ĺ`<äÂÝâˇoCç;Ô!€śŻ;űú“6ĘŔäŐ˛ˇC˙볆ţ&#¦§“X+ÍąŠä•iź™aA˙ŠĚř8Ž:<=Ţ«^űáy˝}0—ĹĚu**ťžÇ'Ao6l€iüńŰ1¨3Ćč?ŔĺĂ{)VH}-„m±@•Ę\7éX śž ¤aIŠ8.®+ÄŚ­ż°M  €*kUŇ)uo_ŻąĚLÍ„**+´;_Fh¶iF ť‚>wöjd2˘×ë3# cEčżŢßŢÚŢqľ€t_0p}  ŽţcTĽ'Ö;ęăęS !—۸Őĺë–¸DT 0ËCx?ň&ÝţO·˝ęm˙ =ç˙ä<ńäĂ·‡;Ú;âę§UĂfCńłĹ®·\˛,K’ä>ëNě| j˝ĎÄÂ?¤ŇyZőąş|4`łcE`I¬dA˙ŠĚä°ě¶„›·›yžOZAş‡šýhl€ô ä Ü˝Tőü7 ˙ ëTď×Ű]WĐŇ ş­IŁ-ŤŤBžyÉ ŚEáy^żN?üť–÷mĎÇ=–Ý – }ltlvK>!ěŹtOŞŮ_ÓŘĐ(ý"ÉňÍŘN]žI“±]ŘČýř_ٸM12Z÷„ăt:ÝČxĚń|x\,.śýFnŹ·5š3V5˝}˝5µ5ţÓź©©ÝXqťrqGíO|×ăµU´ŽňťŚNF—˛DŚ`¶ü“ŢČd$©agzx‹ĹâxŐńĎţóÁĹĹĹ5µ5č˙K˙Č#6l(7—›ËĚúuńť/Ż 6H'{®ő¤ŘyZőąŞ}Ô0±"°$VqČS2}°ĘS˛<›†jřW ‹(ń®Ř˙irM€h§ň Ţ…ëĚL+ý×!Ë@tůĐĺÎ×A ÓźGűűŔq°îC}cl=@»ŇKŤuŹŐ?ÜJ'4˛łűýî·Ý8ŽłîłÖ7ÖSk QűŻÇżÍh4Š)pzyďŠJT áAŻ×{.zčýIڶAuÔcs(Ő(ő凳ĘqťŃčú2 ?„8!· ŮŤł3ţŐ{bľ‰qÉŚŐN÷•î‡ôűú«öÄś/ z; 錋ÖQL>†‡‡‹źK!ŔYj(t~ŘYűJmR÷•´ ú1tçÎťĆ×ipžĆ?4ĆiDÓ-Ăf˙†_’¤ĐHHŻ×›źBrPC?îT:O«‰Ç+©h;çV^‰§Ë…(Šjg8$)ć'OČJX(Ąđ‘:ô\đ%‚P"Ĺ¢7Ĺú_?ŻŔ F6Ŕ4qlݲµćĺz°uËVZ¨á_¬YDńŃÚŽęÚMNőŢ™ Sh9‹§~BĐs5%çéĆx>€<]^čóQ´„ŔlĆĐWšc©püÁŃ}uNtňdĚă¶f §çB߆”{ŇĺíŇçë‹¶BĚfóĐWń^üFľµ˝µş¶šÚ˙Tďť <’‡®ž.ď%/!¤˘˛"Ń>ŠßČ׬-ŠRŚĎóDł«ô˘‡<Ń{ţ·ý®Š/Đ=Őę.zl%Ĺö«kéžřk îp,(“řłhÜnLkę1FĆđś÷Ô˙±ţćg7©žJÁqÔá>ç¦ŞŞ–ł-Ö„ ±ęÖąŢqɲxWl{żMĂloďŠ˙9ŕ8šÄţ'Ý6tů:ĎĹ ©ŻZďŤ& 0hy·ĄédSbŰeŕ!<<4ö(Ý\°îł¦ŢyZŔÜŮ~,‚ľag›cO4é\?}™€çëY;+°šT¶˙EQ!Ńá&IµmB*Á’včąŕé˝ÖŰëëĺ8áąäqź÷lą$ad?ˇá€`4‡†ÚŐnřOĽqşőß›ť']ęĘ7üΓ.ő’¸r·Eé¶M“đÚ$N^íuvo§7ű5ęeďaŇE”e—Ĺ?čl)”ĄgÎrâ2;^sXvYf'Ź%‰˙•«T˝ź““Ü9ű¬1MŃCŘvß5_t*jÝcíđtĐťÄĐíPé Ą´Ž,ËGţíŻĎ§ÓéŻ:Üď,f3t^××ŔőŕL> JĆđúť'ťt{»ě_Ę:ÎwĐL… [~o˙yĽđé¶smĘÜ2 đ–ß[†˙6ŤFőëô¶WlÍo7SsÁů:ĎŚtjmŘŮţŇ €+qÄÔş+îJ2/uJŕE<čÄÝ~ŘîôKÉŰéµě˛(łů KE$ˇÁ"n~v“ĘrEeEä~ą(\WH'7I;wżëľůŮÍf Ęě?8÷ZÂsŢŁqĘXŐĚűŕĘ÷CŻ÷Ăř¨ŽB‰ LĐ !K˙ňk<9Ýď¸'”Ŕ˛Ë˘ä%\ Cř‡$Jée ó1Î×yĆ@vú¤Č˘g˙”H$˛k×®ŕp°í\›ëÔś…ÍM˙M˝^ş Ý)…DGú}ýˇ‘Pčv¨±ˇ±ţxĽŰ>Ež#÷#t-ÇCšÎ4…FB–]–úĆz 1Ôh>ŰęóYhF¶“îÉëšźý™Q1 #łčruŠďŇĘGRÂůg ®żN§Ł!ć1‡ď¤đłš‡Ŕ×s™Y(Nś<ü.ÉâUyBů~„Ş™lŻŘ”l̉bÄŐ|´wĹ`dśtO^ý(ÝF ™[ł¦`0 F&‰NEÉLD‡•×(‘|5¤Ď"¦4ôEcÍ3ËCÔ쯹üáĺĐíP˙_úŁŃäMHŃŻÓ‡FBIŻ. F:ńú«^®¶ ¶ـÁÁż«­Ő‚ ‚`Żł‹?‹ę&YĄ˙ӎرP‚„PY Ó0 #“čru4Ţ@ĺX4 Řré ôůúÄů˝•1‹6MĆ͇넫ţx},1äCx.xRül1ŤL×ýq·Fdˇ¸šK}3 FĘřýîwÝ­çZC߆ľ |CăCËQůŔˇ•/U†ľ }ü†[Ď9~DÝ*«4Ň$†ż^Ü8+ Ó0 #“dŁ@*~qÔMpąl…I©ÝWkŘl ~ŔJaÓé&a›`2šÔŰö‰8^sTď­.5— %‚°M i˙t]é:}ć´P"řým˙ަŃCWgW}C˝ÉhRżiG#e0–÷»n÷i·đ¬€äÓó&ăăăŃɨý°ą :RűJíČ÷s’g• Ü „€‡‘“<Śx.€[~#_˘·Bq1 Á`02‰z¶żÂQ€2°şŕyž†ěTbÇ÷â ˝ťłîůJˇë”KńÓĄ‰ÔMÔ8^s8^‹ýi2šâBn%€i‡IńOo{Ż Çq®Ü ĆŇ‘îKw~Ľ3ňýłÉťŚš˙ŐÜúN+É'†M†âçŠ=—<ŽŁ9*÷|ÜcÝ;'juVEş@©)fůś›C6|Ň=¸Nˇş–]¸—ŹĐw‹hůIë"*8,5•N˙ďt–G—ŁÔ„é˙ŤeJ^zPçI§ç˘SŃ,Ăw,.(Á`dől?¶Đĺę€äk€ôĺHĄŰ¸]˙¸í<âDÁ`¨ˇę&˙ ˙ćŔMGŽ9qęDÇů—/\®Ţ_ÝŢÚ řąâ?˙éĎę†YĄĐ ńu°îEË»čhÇü)—D`(ŕůŔ3üÝpt2ŞN) łęÄčTT—« …f=…Ň˝JtÖ®ÓĹ~@Ę~‹Žó–ś°2t;ř2@CŕŃé¸N§ŁńĽ › –Ý–¦MÚIĄ{R{kű7ÁoL3)·Ař‡pumuŇx…‰řĂa÷—áźĂ‘ht:!Ŕ"·žëúěć˙íó) dc!¨łp˝é¶ ŽW)&c0ŚĄŁhV‡€:ü˙|¤;|±&ˇóÇ«’OH>qĽęĄgźBumµíŰß˙ń÷żű÷âgŠë_›7«|4ŕ×ÍSąőËŇet:ë>k[KĽŤ_HEŮö˛8-Ęj÷…<żŔ`ŔÚeč°ývŰÁ91Đä_ešĽłëJ—t_¶ Úß(q\°”Ů?iRţzxáz˝Ng7/'Ëęęôž6P2ů”‹ľčěĎóćßš;Żv.ETÁx$˛Ń`>O_$ŰţOzĘ`0R„š×ĺ«ţ÷gŚÂ?‡ÇŻ;ZGr É'µ‡j?T7Ě* €.wá:iĹôś©zoő¦Í›ć« ţ,ýu:X+dŔ ÷“^Ăf!Ä´Ă”4L™(² B`Ů ńn¬Üs·öcZCÇQ «¬Şä ŘëŔq °š Ę4ßX ľ>_ĺîʤŁ%‚·ÓkŢiv˝ĺšE¶×Ů9Ž#ÄvČF ~J_(@ˇy7EQ´ě˛pG±ě¶wEÁá`NNĆzŽťŞ(7—«;ŃĆÄó¶Á°.‰^˘·Ż7nÉGĺîĘŢľ^zşbŞ‘nÔłýŐˇsöŤ;fłcŃÔî«ő\ňČQYž”˝Ľ–ßYętşÎŹ:1ęPüě ʬŇpzI&”ŮC÷ÇÝĹĎ ĎÍÉ €ŻĎüź ü«\Ľąřȱ#Iëtś‡$al $GŽ€xőx;!Ë…ý°Öň<Q¶}¶ä€ c?áÁDÎ7´ĆRE1r?÷5‹Łîpť˙†f”)2öÓر˘(Ň𵷷Ȳ¬8tśď$illŚä’¸HVó× ) I_ öă»ćłî‹-ř÷Ú¸smöëýňĂŮ Ĺ%ĹŠŞA(bAä #m¨gűŮ®`0iĹő¦Ë°ŃPn./5—’|Ňz7ť“ IDAT¶Ń‘ËŢ˟ۄRS©xW¤Ž YĄŕ7˘ö Š‚ĹŤ–vz®őÄm˙##€¶oă8ypĽęúëPbž‡P‡¦SđČr12I)€ą,yçä)<ń$n ×+”$ř®ˇí=¸NÂwMs¬¤`Ž>*QÚuüřýq’$ů®ůÚŢkŁsq×I—ďš/I}ž§QÝ8Žk:Őä˙|11ä 9éK»U`(Ŕé9ˇX0čő˙CŁŘŕ ˝ęą7~ä“^ĄŽ>_ŻÄ|c0Ś  öX| śĽtQDŐ§˛ÍxcU‘ w‹ŰÝżÎ7—™ű˙Ň?_٬Š űĘě1mg2Bé@}śyn D'Ł‰Ö Đđëxz Ë×a*I…Ţ>´źĂČ÷N@txźüíďÁŮâçĐv–]IÚĘ€<„@ŐËđ^‚ë ă lSŐ›7éX śžťŚjŢăbáşBĚŘú ŰT•äď®·ý\űČ÷#ô.:™ą¬‹ľ>ýÄ9B8BđÄ˝ËRőq7öĆęD&#z˝>c"1ŹˇŰˇŇJ5ŘăŔňřč “ĘÓ§•ż:črň3.±öÉ* @–Ó}µŰş×JtńóÚĎ ÝCÍ~46@úňnĚ^Şz ţ…uŞ÷kubŘŚ®+hi nĚŔŘ(䉙—ĽŔXžçőëôĂßiyßö|ÜcŮmbÉÇFÇf·ä~éĄ{RÍţšĆ†FéIžiś+Ě8ľK“±řË‘űń{đqż†d´n Đ{­W±˙™Ź‘Ű#ĆíFí: CőżdNNŽr,”löź”ĺń&„ Ą¶`0Öp¬űPß[Đ®4ĆRcÝcť/óIh$d?f÷úÝo»pgÝg­o¬§9UDQ¤iÔçľ»(¦Ŕé9äAĽ+şÎÄ~Č„g˝^O3»«Ë¨.‚z cĆ ĄľbÖ/?ŚÓÜ/4‘$Ëa*ä„ěôWnžur¸1P˝§šÇą&3ŚTPţŐ®;lęŻÁňřčĽ [0k¦cë–­5/×Đ­[¶*ĺÝw?ďţKYq ż­í¨®)@E%ŞgLS0…–łxę7 =WŃÝłpWŤ đ|yşĽĐçŁh ŮŚˇŻ4ÇRářŁűj·ş„<ó¸­Ů_ĂéąĐ·!ĺŐĺíŇçë‹¶BĚfóĐWńüFľµ˝µş¶šŠĘŠę˝±©6ňĐŐÓĺ˝ä%„TTVŘÇ'ă7ňµk‹„˘Ăň<Ńě*˝čˇO4»ř®ůŞ÷ņ‹DŁU÷łî˘Úůýĺ˙ s$Ý“ Ô®Ł§âϢq»1Ëł¶1«eEM<<ÜzŽßČľ ôöő Ĺ!ÄdśŤŤ–4ŞŘšda€¸IżúTQP €űťäę\§b7‹äęŔBs2klóXqÔůżÔ8_w:_Oží5­‹(“Ѥľq§łâ5ŔŮ0{ęx řŤ$qVwďSQ˝wvNO ŕąĎ…”ĆšëŞa2ď4{?ôÚŹŮçXĎŹç‚g®`sZ9śÎ†Ů›ŻdjŻz©Ş*\Ą”ÓÄĂę¶4YŠ$ć˙ňőů.w^¦ÇŽ ŹĎŔŐěj:Ѥ¬1n 4ťjJ}P‘:á;aéžä:媮­¶ě˛Ü Üâň9űżŮŹ;ř2ŕ€ýbě§1UÖ*çNĎyĎB˝®JÔ>ófNjůŁ^ P @ă‰*Ö˙üuöxŐiđ Fę0 ŔŇI÷"j5ňH3ď¬%iĘ…8â¦ku¶Á`dŤŻ7°îµ¶ĽŰŇŃŢÁqűQ{ů‹ĺ‰*6::J䮓.Ű!ŰZý—ÔĺędtŞľ°Ŕ|P €Ú*•´)¤{RőţjˇXJ„Ş—ŞČ˛y§™–XvYčLBEŽăÇ&Ł©»'ö«@ ť'ť&ŁÉ`0řýΓNÓ“Á` Ë8îwÜA(L;L˘Ëüb2š„bÁň˙łw˙±M\ůŢřß–ić*ąň¬@ň¬ĘW¸*«z¶Aµ)+b–jă,W·ÉĺęiHŤ)ʎ_»­.1TKާ«B˛ŐҤŐmqZRŰ„Gm“ýęrqVĺÁ^-Ô^m¶vuYa´T™hAŚŐDťŃbÉß?Ćq&ţ™8?ĚçĄ(šŚĎĚśqŔ9g>ç|N˝]ş+-ôN !YhŔŇ­řBy¤óˇĄ—„O/ŰÇ0éÜh™¬bę€Ă¦ć¦ ÎĎ«$vfZWé9…¨ßIť÷¤Îw’Íl—<°eoKÝ3uŃX4:=á<–aG†GÔ=íGÚ݇ÝjÉD"aßiGÂŽÖŮőá‰DýŽúp$Ü󛞦Ʀúúúđőpß™>Ď1yJîěęŚţ9ʆ݇Őßúľýű:NtDcQ{˝ÝÝî^čťB˛¬Ş@t<:ϧ«ĘŠĎ „2ź¬bŃ3ę\#Ąx@7WÖ«jŔ{"ĺ;‘ňž3ŰĹŻ-Oɡ?„ÔĆ:5*omu6ˇV8zěhř/átEfvćV¦ö Ó´« €m› z¨1ë3Öří8¶†­{¦®©ą©çTO0Dä)9ömL=ŹăG&P@QĆM˙Ţ$l„Í‚ş˘*ń;ѱß!‚őgÖţwłˇ«*P2ă[üfÜşŐş¸š”E!dĹÍ'«XĹď:©ą˛^-”h1`÷ŢÝg?8ŹŽ|>˘(3őcň\B»S»ťą«`(ŘóV[ÍzŹ{ŐŮ]„Bc߯}§OťŽţ9úuđëLÂJG›Ăd2E˙˝¸Ľş4¤=jUEJ’¦ĄČŤb ćWE!d5(™U¬b,l€BŇ€™1?ľ·XďIťď­x¶†­ŰV×sŞGýQíoÉŠŚd: ٦g^ĽďÖ­V×aWĎ©žŔX€­aÍOšŐţÜŕĹA{˝}Iç'¤˛ř~íóuú„'l5k}Ú @üNĽý×Űí˙Ń=ŘjÖő˛ëÂĹ9É WU +ăŰŕ…A“ÉIJ¬uk:ËŰvŰvĚ,ł¸ú”E!äˇČź÷¬jvŁ`3YŤ»’,ËńxÜ—“Ú«b,l€BŇsfĆüxŹËľ©L>Đ"†> …Bę”ß}ű÷`kŘŽÎał`µXó>ő—$iž wY‘[ö¶µ‚P+|é ˙=?€óťď<Ń)Ô ±@ĎŰ=óżGB*›tOşý×۱oc¶gmV«Ő}Ä-OËČ·Ě_ěŰöÇŐý˙FĂá°ü˝lŢd>řŇAÚ5b}Ú‡Ž"óŽ@§Cf‘,Ç~‡˙˙RNč9ćakÓ¬Ôĺş\Żş2Oĺ!¬ô:(ĽţWĆ"‚*n=—5ś€÷¸×{<ťxÔ÷–Ďój|Çqę ‘Úť<ĎgRúd¶Ů6ĘĺoµXŐĄ !Zj®ŔXŕĘčÓc¦Ť7öžîíčěPĄ˙Ý~ezÎ˙÷ŐĽ@ĎŰ=ęä"×Ë®íöíYŻf>@˘`(Ř˙nä/eZŃ.ţS¸űd·ÚwŞŰVç;éăă3Ż–µżoim __±Ď˝p[¬`frM×mCßćR‡•ŹŻŐlˇáHx‹u Ă0ĐŃ3¦Ť&űN{ÇŃŽL–ŹĽ¤»RďéŢŻĂ_«+ő.΂Ţ^$컚ś–XŚ|ĎÎFŰ>«L ÷] Fľ‹'%ł°@X·Ľßźy(f1ňÁ6gˇÂZÂ{ý±I1ë%n=wţż®üŰĄáÜzĺ6 ®—]ó\űڞF•^ ď"„ Ł6\/»ŘjVÝ8č<¨ľäđ{Ox·ül‹qť±qWăФ3ľLu:Ë›–šńíábjć=ÍŽî×f“ŚÉŠĽo˙ľöWÚ‡>’“rçťů|vnYY;Q«dÚü=PY†ű5ěkExÉ5ę}·×ń˘C»Gţ^VăűŃńhď;˝Âf! yÇÔKiýcoŻ}Ł©ůI3Dz|WMĄcŮkĂĆi±0ËîOł^–Źg˙9.R€o,`¬6Ä0çßy`,`zĚ¤ŽłÍ=!Ďó¶m¶Ź\ůÖ,#„T íxź‚€ůxru˛Ęɉů¶hjÝţMřšvʎęő$łéëŕuŰh`Ξ™ŕ:ŕČşP4"f}ďűŤONąűË-ýyVJ*•ŠF‚‚ĹŤ­›zwÚýP~‚gëSVëSÖč·s–šśśT¦ç'ô`őlë ­»÷îÖ(k'*3í€,ˢ(:Z‘?EE©űyÝŕŔ żWź §ţ‘ ›ţ1§ë%Šp´"ň'( ę~ŽÁđ ˙=ôśĆä$j4?˙+òp–sł{ä)¸_Ăđ%(I4?Źł˙™^¦Đµ2†/ Ź çOĐ!Ô ţËŢď^5D OÉî×ÜĂ—†•¤Ňü|óŮ˙<˲얟mYú;“őö˙]¸™Ä0ň(¬ti¨ůůć"çlÜŮ8tiHíDÇŁ[l[ä©U4^ŽňPh[űW.éQXŞ“5A°ŘJ–É ę›OáµE˝µL»>ß—ˇV¦Ť&óSćţű]‡\˛"_¸x!«VÖŔµŕµ-Ö-Ú¶iß™>ˇV$i_뾇.(Ď]ßµ$ěkĹÁĂůâ¸]¸€˝ň")v¸<…ţ÷Q÷Ěěž}Nŕ&ţMÍđĽŽţ3Ż•!Šbâ^Âüd±DmÚ¶śąĘ><ŔÄß&457y^÷ôźé(ďLÖI ŤśÉ´ˇŁwĄ-ö+Il4pám%ĎŻĹ˙¦GI˘Ůlîű×&¶ŞDá}—†űžkdôŮű‡?ľ¸˘>ˇąÖy#Ój…oýľ¶<˙O y¤Ěk!d YĐËŠüËşŞZ˙ŞłďťmŮŰŇ{ş€ů)ógź|¦}u9łń<Ďó<Žă:Žw446,äXđ<p:ŽŁˇ ôĹ`y[]ţcŮ€2 ăc˙1˝S’0ü)nÝ[ŢcpěOwň_k†” Žě*RŰuüä˝I’$ :|ëÖ-µuî=ćuěwôźÉÎ2·”w&ŁdsYXĎÉÇ˝’,ď»4ěů}Ŕż«i>§5 ߼Ň.¬çÄ)ąĺÓ żĚYG«'4Ż74m2e‚ˇ gŕł ÉrˇŞ «gőS„LČC7z9€ůĚ „µeµEDKk‹ăGŰËmPĐy˘ÓýŞ[›ľ¦Ü©µ†. őžęŤ}S?ýł¦t—:˝§űJ”iŕy|ů9zO;ĚOˇçěőyŽ•ďUßDÓżĂ˙!Ľ'@śał¦ÜĚTŤĽ×Ęŕ śZů" |ÄIѸΙ±ţÂf!÷*sďnńďĚBq,Ű^gkş88ĎDzęĚľ†őŐŰ›.âů‚…ă’Ô F_Î3řҰ}*rÂÄtÂ`0,ř–ĘŁ"źP˛<śuŠ(žAHWŔC¬!ä§Öě8•muµţřwńÉď&۵±z–­f[÷·Žý~lNrF´źňŇ]i÷ŢÝíGÚĄżKň”¬f|ÂĚpi:ť)q/Ď`é.vďEűH‡<…+Łł/5=‡ŔeČߣyZö«Śi΄îÓP30ńF¸yjćK.q-Ďó†u†Č_ŠÍľ˝pń‚}§H/,3qkBž’Ó_9őýÎd%Îf Č[Ç·‚ćŰńÉiĺńwűąS= çü¸S=C±(€ˇO‡š÷› 6łUÓ®‚×ŇjŢŐ ä]&‹öľÓ AÇ5ďiv·»ű~ŰÇqś(ŠáᦹŹŢýÎhß^źüý ·>ećXVś’˝cćÚüílůÁś ¶ ’,'ĹÄqꍛĚE ·>em|"] vo˛áś?zČi¨ćÔŘjÖŁ"'˝<Ú˛+=(kô˛)™|ś˛DeźĐsĘW¨ 6îK&ů¦¦?!‹ö¶ţ±Ň€źţä§ÚŤ[·n± {Ö¶ű×Ýýďö°é·×ŰcrĚ®ŽýűĎíΗś+]‘µA0 gÎÚęŠĺţr˝ę2=fň̬NŕzŐeŻ··ťpLHY-č“<ëó\mé’\žc^ÓŽžčyX|­ëˇEŠď´ý ÝIŢěŇťôĄň…›1żA˙{ýýď÷@Í{š}ů–BĚKĽ#ţř˙ůqWw—7g%•$I-Í-ęŞĂ„¬Eß„Ż=šĎŇVŰ€’–3 P%Qsü“yŠĆ˘%Ëd%GĘÍ•DČrZu*’TŘ™›s@Ţ‚¶c ;éĂL»żP •J•lý}:tí«kÇáú?\ŔG•˙śżů5űĎů u8ŽŁÖ?YëÍ>Ŕšű›±śY€!d­XÄł2OŚžQG÷)eĘT’w[wŇ‹7»t'Ľş“ľĚvˇSř~íë{ŻŹS×V¬‚şrˇ<%ŰvŘł Ô öz»ú MEŽă\‡]V‹uđ ˙Çţ®·ş¸j. ŽGM&“tWŕ:ěňń¨‡¤/tŇg2™„ZÁşŐ*ÎoFBV‰¬kîŻE!$µţËg×`:Nx»Ó#vŇ3‘u'ĽČ7†Gw›ĘŮ/Oɉ{ Á,dígvdxDťű5ňĹű°{äw#‰„}§˝˙˝~Á«A®šĚBë‹­ţs~[ťM¨Ľżň¶´¶¸^r…®‡ÂÁ°xOĚ\¨ł«ó‡ű?¤—x|BÖ–G­°ćţfP€BrQ |´)Śr ¬tţŮ#y’Ęěµ3WÔH‹\h^UŢvźěNL'śÍßĚ0Lf&“˙śżőĹVÎťŹ˙äńľßö±,ë|É9ú»Ń}mű˘á¨6é[ĂÖ=S×ÔÜÔ¸łŃ¶ĂV|!dĹ­ąż „\Ôú/ź2®P"{ŹžQrÚý©^ÝI’ ôŚö{Ţl kXgƢŮA€Ř˝w÷×ÁŻ…Z!~3nµYŐÝęz.dYľđéĂď ˝ďôPeřҰŁŐ!ËrěŰˇÚ ŢM›ćüˇ †‚áëáĐő÷¸×´É¤]“UeAůł+5Ůöšű›ABÉE€ň)ű:…i"šţ†ÚÖźgöOďQŻű°{äó¶†U'»»dEF2˝ôc:AĐ\Ăź×m« \NOđút¨˙~G«Ăýš»qWcóóÍŽýŽhX“-áÄIŃşŐjÝj­ŰZ×ŇJ ŃČ*µ ůľ<9xÍýµ @F8‚-V¤ţ5 »ôDźžcžţ÷ű‘,şDWţš,ÇXYi7 !ZÔú/ź•ś éi,rAt׫.[l[ ‰ÖZ°5lGg‡°YŕŤ|ăsŤąGůĎů/:2?6ţ[ăľ¶}ýgú#‘H8Fśśűśűú~›^©GVä–˝-‰éFĎřߣÇ˙d5zÔúˇţ%Ď÷‡. öżŰůKD™V´K ߉žăžČŤSÍ8_tş^qiŹZëµŐÎĚü©Ű†ľ3ĚĄ+%: ^ Şą>Őć8Ă0ĐŃ3¦Ť&űN{ÇŃŽĚR_yIwĄŢÓ˝_‡żV—ż]śřÍxKkKřzx>…ń¸ďj0ň]<ˇ(Ú©kňürh8côŚk«Ő7ł€±÷W^ałŕzŮ•žcFŃ @ů”k@éˇI…Ń3]'}ť'Ľ(zĹâŃ׫.µ ĺ=îÍ$÷ô˝ĺŔóĽ$Ą'd%÷dYV]ľ1sžĚ±ę!l «f "dŐZž•ű*ĎC˙ÁÔ0Í{š/8ÜŻąµűm[ťmp`PVä‡/µ‹+UF@ţ¨‚,Ăýöµ"Yę {ßíŐ>¬ /«ĎăŁăŃŢwz…ÍB0,ň¶“"€Ą´ţHÓRäĆ|oĆŔ0N‹…±Xv:gIdĎŹSĘýŁŢ„"ŰÎ §Ĺ €çyŰ6ŰŔÇj;Bµţ˧,sćÓIťôéNxˇg/ĂćÎ!¦ő€ )Ž>űV ëSVëSÖč·sV\żo˙őöĐ'CĐ­f]/»zßéŐvĘút¨ű­îp$ Ŕů’sŕÜŔß˙Ŕ˛¬˙ż˙cđęś9˘G+"‚˘ îçżúßCĎiLN‚©FóóđPđr, ×!l97»Gž‚ű5 _‚’Dóó8űź`Ůb×Ęľ4<2<’÷*B­ŕđ·ěmńľáUCň”ě~Í=|iXI*ÍĎ7źýĎł,ËnůŮ,ËeYEG«#ň§˘(u?Żä7đYC}Ň?jţâl·mמ¤ř»mĺy+χs˛ED"#/8Ř*°U¬§®Î‰8gş%Ť;‡. ©€čxt‹m‹úLŠB€ňŃÎXću:éĂťy[˙R3Pr>1!„¬bJÎ#•Ř·1íŹeŤŘaŹü)˘Ć3—7n ý߀Ń˙mÜ™gdßH&&Ŕęqđ0wŕvÁ?YĆÄ-8»ś<…ţ÷Q÷Ěěž}N$$Lü ÷' ŠđĽ^ěZ˘(&î%ĚOHÔv -3›kźs_BJLümâţÄ}Q=Ż{\ ^ Ër¦áŢw¦O’¤‰‰ VĎ<|°ŘťĚČ: [Ăćý*r†¸$)Šb1Ő-F>69ŰC0ך3ˇV Ö?!Ôú/źś–•-4µţ )¤RÓř,›Ćťöe¸Šé1ÓĆŤ{O÷vtv(ŠŇ˙nż2=ç3¶¬n=g~Ęř}ŔöŚMI*í/·Ź^µď´ĆíŻ´gćyđ<p:ŽŁAí č=b1XžÇÁV—˙BěŹ@™†ń1„˙Ţ)Iţ·n­ď18öŁ˙LákͦşŘ 1~?yo€$IĂźßşuKm{Źyűýg˛“@đ<Ďó<Žă:Žw4469y!‹h ËIŕŘt'Ń#‘ś}ŐPmH$‹¨ !Ź"ĺSĆuć÷„,Z§ńY6ËÓŕđ{Ox·ül‹qť±qWărF4îl \$¤„˝Ţnßi?Řv0:U¦۶ěUM†.ˇ÷bßBI€2 <Ź/?Gďoŕi‡ů)ôś‚˝>ĎUäű@â7Ńôďđď '@ج)7ÓöÍ{­ ÎŔP¦–-řp]śŤëŚë/lÖ¤„Nć)?ti¨÷ToěŰúg.«V>¬$YVűJý쫉é„Á`Xžš˛¶Pëż|ʸŔ˘őśňŃŚFBJ:ýv×JWĚ—iŁIŞŔÎoyÚ2çŐ2gŞßYď~ŐťH$˙µŃj±Ćż‹_řô‚ýö¬—Ň]ěŢ‹Ď. ĺU^ĹögÓ/5=‡¦ç€đý-{!Ý-|§›pţ#l·Ăő 8Ľ&n[?ßk©xž7¬3Dţ±×ě¤]¸xÁľÓ¤ó>OÜš(’Hş+íŢ»űł źµüŻT!x5¸ýŮíY"Fš–8ޏ—ý0ž™»eˇI‘é&Žc&69i3™D&Eł‘ĎĽŹYž±:–GEĘg×(¨Hëß73a@Ń,$śµÝÝŐMBČJ‘“˛ú)*'e¬ž OË ®š ß÷żßö˝łÚCʰ˙Ü~űöíÉÉÉžŢőÇŢwz»ŢĚî@* gŞ ŢI? Š߀ý—`Y0Ő`ô(Îş–§Ńű|'ÁqhŢw;ú~ ŽKźŞiWÁki5ďjŚňv˘±hď;˝±@0Ŕq\óžfw»»ď·}lj˘ľnÚŐ4÷î$Á8TAĽ#zgÖ—ž C˙űýŢă^íţ 5!Ţů <ć1X~0g­€6‹Ĺ{58ň)ˇČ=ˇwÇě8ŞŃËŁ-»Ň3—gńBÖ jý—ĎĘĎČŕkç IDATU$ĐůF'Š \ twu—«f„RĘOňS톺@"‘himIÜKŤFß›>ë3sS–;ŔÖ°uĎÔ% uĽ}§}ř˙ ç6¬ů 8Ý‹–V( Lá:„±ß’č~ »[$ĚObđJj?‚mč8 ¶çýđĽŽÇeF#/˘iWáki¸^qµ4·ř4‰"ŘfŐżT¦Ť¦Ć磎fůź÷ź÷Ľîyü'Ź+ÓŠŃhtĽčČęđřÓ˝§[Z[E1m4ąąĆ~?U8áĽű°»»«Űô„©ý•öĐBY¶ľŘú¸đ8ć7ŕźşĽÚ 5ŃEĎ/›~9ôŁÓ>u€L é®üCđł ź©?Šß‰–g,Ôú'DE€ňaôŚ,§s˛ĄSmňuľöçWiZqßI_îă­ŔŐ@Ăł  «Đ\Ť;í™_ŠúÎkWďZNąm}g›Ó?ŕ_Cë”ĂŇW^ĺ˛Vv˝ę˛×۵)b y”-´őźőyNe ńóňu>ń+/ŞŔ׺Ö@`Ň'BČC·ÖW.źĚĉJ••Ş(7s!Ź2Š”ŁgÔ`ă ĎČz®©ýQŰčîę^ĘQü㛟2# ¦š9˙ŃyÁ,”>ěa§äŢw{3k BHFe¬L!µţËgÍČűÔ?«cnř^: dJ?ÁŹđŕwvĆ ¬ć"%¦˝ďP€’E!$EĘG›ßląW.¤äŇ`…}§=ö×<%ŰvŘł Ô öz»úÔMEŽă\‡]V‹µ˙˝ţB<ÇÝܶ÷WŢîÓÝóY\ŚGµţËGŰÚOw˛Ć«,ż"Cü;:;Jä-ČÂÖ°ťÂfÁj±jźÁĎż@!Cź ^jÓ&Sď;˝l Űş§Ő´É¤NÎzU{ ¬Č-{[ÔéÂ_:čŹ˙˛f †ľú˘Ńč•Ŕ(pv«ű»Ý-NŠ_˙ńë‘Ń‘áKĂCźiŹš`©ő{¨sŠäď!Oáţßa2a_ëC8aď»˝Žs/!ËS˛$Iç?:/Ý“„ÍBń7AśX-ómľç%MK‘‘yöü÷8ĄÜ?ꍾěŹů#áÜ2†qZ,gw5gíçy޶Í6đńŔRjKH[P`Ą+»Ćhç¬p ç”/÷+«LéÎIŃĎó’”ýÉ{Ü+Šb8ö˝ĺS/e+^€çůĚC©9ŰřŔĺ@t<żĽ0Ŕ?ŕŹßŚ«#˛^Őž­aˇ`t<ʆ#aűÎ’©M !«…ç¨GxBŔ¸¶—ÚB7BęţáKĂ®W\,ĂňFŢyŔyáÓ ÚŁĘPĄű?đóxîÇ\Ö«˘{=8, űNwŇűűßÉ–·Î—Šťźeá:„Č_f÷ČSp¶ăŔÖŔ±™gń…®•1|i¸qgcŢ«µ‚ŔoŰaóľáťąŠělsrÇÖ°Žýő‘˙–źmŔ˛,˲DQ´×Ű9ŽcYÖľÓ.Ţ3oH¦/”ţQc»m»ö$Ĺ D"Ţ6¶ | ë©«óGňô¬<ď¨Lë˛ß|Ť;‡.Ą{Ńńh:÷!EĘI;`%#žcŢĚWîŹJRÉš(ś˝±Ŕ!„”I`,`yĘ@üNT¦s­YÝo©µÄľť3bf"˙¸ő?·&ţ6‘űRßH&&Ŕęqđ0wŕvÁ?YĆÄ-8;ł<…ţ÷Q÷Ěěž}N$$Lü ÷' ŠđĽ^ěZ˘(&î%ĚOš‹\«í@[ŕr`ć*űRbâo÷'čyÝŕZđY–3C€úÎôI’411Áęه»“Y'akŘĽ_â’¤(ŠĹhT´ůŘäÂ7›kÍ™hP+Đp B´(P>ÚÖţĘgRĺ]LĄV7x5¨V20ČÚłĐ9„R±ŔŔ‡ç?9@R$“~Ě0Ś2=çcvćôt÷ä}žÍóŕyŕ8tGúü]č‹Áň48¶şüçdĘ4ŚŹ!üÇôNIÂđ§¸u l xŹÁ±ýg _k†:_‚©.öŠ_ÇOŢ› IŇđ§Ă·nÝRâŢc^Ç~G˙™ěiZ<Ďó<€ă¸Žă ŤóJťĄHŁ\N7óĆ2z$ř7ČPmH$‹¨!ŹŠ”Ďjś;ň'ŁóŤNŰźÝŢ`oĐ`oŘţěö¬=ËUMBÉ/p9ŕ~ÍÝ×ßg}ĘŠ™¦żÚ  (JV3w"j&\C—`«K×ih„2 <Ź/?ÇĐ%üřǰnE`,˙9ĺű§pëŔUĂ˙az§8 Âćôüŕ¦fdÚ·yŻ•Á8Y]Ł,â¤h\gÄĚXał >ŚojnĘŰŚş4d«ł©Ă„Šź|X=H3Ń% ãЉé„Á`x¸µ"¤bP |VŃ€Ś"€Ôü,gm !DkčŇ»Ý}¶˙¬˝>=‡ŚgŞ™Ě°źČx$k ËJe’îb÷^´ôwČS¸2:űRÓs\†ü=šwˇeo±“6áüGč> uo€‰[§fľä×Rń=•âĽ˙ĽçuĎă?y\™VŚFŁăE‡ş:»ćîřÓ˝§[Z[E1m4ąąĆ~?U8áĽű°»»«Űô„©ý•öĐBY¶ľŘú¸đ8ŠNPőü˛éŕ—C?:ícôŚk«Ő9“4zWÚňaż|<ýçěźşćl¤NúHwĄŕ‚ź]řL}IüN´JRagî¤×ß5íčqíRŠ´Â˭甯ĐŐŐ„?EÚ÷«†g¨@Vˇy~HŤ^}˝óôŰ]žc^máŃËĎ1/ĹǮƝöĚ/E}çoÝşµüŐȰ×ŰcU»X™,}%ŕ5$k%`׫.{˝˝ĺů–âGňHYP ëóüôŰ]+]ýUĘsĚkÚŃżęŔŐşÖ@ ëÍ®Üp-!„¬ikn%ŕňühpĄ«°|˛Ňĺf1"äG€ňYcsf;':ć.ÝB!kÔJÍ „ŐŚć”ĎjY «ŃŻýQčîęîîęNPůčt;ÚÇţl±4 öz»ó€Ó±?˝ÔĽ<%˙čÇ?şő?·ÔDŃ…H’ÔŇÜRhjš(Š‚ d-0św'!„äEBÉE€ňѶöÓFĎ+ĐČ;ň'«cĐŃŮáëęžmô§Rą}€"śśţsţL`řŇpݶşâ­ÇjýBČŇÍ?@}BČŁcŁ˙É<­ĆuŠÓúĎĄÓWŠŢĽ§9t#”Iîć?çwpĘS˛m‡M0 B­`Ż·«ŢDQä8ÎuŘeµX{~ÓĂq€Ľ%U®W]B­`«ł‰bö:đń›qŰ›P+X·Zٱ(ßIźÉdR÷ä–'„«q@ş™D@łÔ @FŃ|Ő,˶îiőźóď‘?Ešźofvdx$‹FÇŁíGÚ݇ÝjáD"aßiGÂŽŇb%ëíŃńhăsŤž×=Yuěwś}ďlt<Úu˛ËýŞ[ž’;»:ŁŽFÇŁáëa~ÝÂVŤ!„Tš@!ąh@ů¬–9ެĆ}n6ĎbY€Ô±@ĄĆę88mď Ż˙śżyOłşšcđF°űdwb:äěň Ăd§c«Ę_z¨%/8ě˙b×!OɡˇÝ­»ÓçÔ3l [÷L]SsSăÎFŰ›­ŽţÉň¨Ł!„ä˘@ů¬˘9(šŕ_•żs˘ť PjĹJuyÎ`(č˙ŘźÎ7÷»÷îţ:řµP+ÄoĆ­¶ô2.ęrńs(YŁg˘ăQíž`(ľ]yŹ{M›Lţüó9!dőóvxˇŕää$Ă0¶_ŘşNt©ËĘCÁţwű#‰(ÓJîR4€BrŃ€ňYcsş»şł‡©2=‡dé“8_tŞŁwÔ§ď˛"# ŢČP‡/¤`É$ÔUč/ŞŚ ¶†µÚÖľNm[óuľöç‹-Ç[E˙ŇÖÄwŇW|%ŕŔX ÁŢPr(!ËožO)2 {Žyµ…G/S°B!Kĺ9ćĺë|bČ €Żu­äm+żç”ŻP÷CI*:]şŁ’wăĘWĹŇ€˛v-sźśB!•J;`ĺł©Š4tÔęŻŐJĆY{ć3€µ8B!äˇĐÎXů,@Ş"€Î7:lv»úc˝AÝČÝC!„BÉĹčYËk"@ű !„BY %©°3‰sVK "‚ !„B!KÁčTke@!EF ůN¦»JR™ťń0w»»«›b d•«ŕ,@Ť;íĄ B!ä!Ycs )R^ť6P¤}¸čîę^ĐĺY™"~„BČ2ÓŽ÷©Ě@×›]Ĺ— „¬¬ nG Ų!k…¶µ_™€Ů;Ô逆ú˛Ę<˛Í&µçS·_I÷˛8ÔŹ%„¬!ÚuŇ“€×h ĐKÝ]Ý:ť:R)¤Rén€†ýŮ…eE‘㸅ÖB!„Ő@;` g*ŇgččěHAóŕ?_€µE·@+]_B!„¬"•?Ŕ×Ő]lŘŹN\AáĺâăѦo ˙1Ě­ç\‡],öm_hőyčćź·j u~jÝľ ň߄ݕ©&+˘’nż’î…B*ʶµ_™]n(+ GB­ŕý•·ĄµečÓˇĐőPĎŰ= ­!eR‘ĎţSó¶Ň5-‹JşýJşB©05@ű=ŁëÍ®‚`Ô‰É'wľä䪹}mű†. ©‹&˛J,şQŐ¦_0 B­`µXGľ)RRž’}o-¸Oľ¸ŁTٱ™żJşýJşB©$5@ű=#F ¨Ť¤˘˛,ÇľŤŞ â=qˇ#¤¬×®ęŻčŇĐ×ü::ů|Ä}ÄĽ,T81ťč}§wˇ[ÜQ©Ě×Ü>Ťú•—’TF/Bˇú‰Äćs!%©ŚŤÍą÷Ř_㱿ĆŐíÉIQ›ÚeějP™^Žç#áöÇc‰ÂUÍ˝ëeRüf”¨^ńŰńy^0ö×řX( Eć]EBy$h[űk>W: P®Ě#ŇR÷kîĆ]ŤCĂCŽýyJ^hÝ)źĹŤ¦đýÚ×÷^[Ăŕ7đľ7}˝żéĹÜ W˘(rë9 ö†D"!Ô B­ pľäj[ťMĹůµűšý›éĎĚü/.ŇłaőL]ťEý˛XĚ‹¸.~ť!q7ˇn‹wśKÜ“(Š‚$ęĺx>˛ôŰ7m0F"á"}€•ˇ›ą%ŚúQ Üľ3żg1ILŢëëluu–Ĺ_ŹB*QĺŻĐŃŮá;Y4¤P40ti(‰„aTÁyŔąĎąŻď·} Ş!ĺłň”ś¸—Ěłír[ťÍŰQđĐ•ŔałŹE1‘H4>×č˙Ŕď;éóĽîüh°äQ‹îÉčtŰV\čÝ*I%t5l4r‰„bÜ`Ľ}3®n›LFŁ‘Ď{ÁŔIÓéƉiÉl2‰‰„a—HHCşźşQ’2 ,f3Ă0y.´OÜM(IŮRkθl·o0pćM¦ř͸ÚR%2CR†žµÔšŐ˝X,žH$ ‡Ĺbaôé÷ŞľŢ–~ßBáú6‰i%2fŔÖ&EQÝą<ŇďęÜw2r=,+ŠúPż®Î’{k™_„4-Č”Ěý­@‘X,1-1`‹%÷íb&~;~űŽČčŮĚŰE!kšv@ef*=˘©h ĺů––ç[Ômďńô%$IZh )‡"ŹüË5şZő„ă‡ý_ʵęS¦ň jţĘI%3ŘðŢ`~¤îäÖÍfNI*±XLÝ.~ő©?SÍ2zÖ¸ŽŹß‰ď& ë j:‹EýĽLÜ“b±ÚjĚľÁ`~Â4yOŠÝĽ]·ua€ĹÝ~‹ÝL•‰ŚÇ,f3SÍ$îI‘XĚRk–“ ·Ţ`6›â·ă±XĚR[0`[6™ ë¸ůĽ™ŁĐ=¤röä#'•¬wҲŐ …3ő ÜZúˇ-™÷·Ź9cúögţdťłÎb‰ÝŚ?ĘkśB*Źv@eF”¤˘ÓéÔvRŢŤ+_]YZ} Y1‹hĺł5¬ať!‹f‚ÁPĐú´s{ËŠ2ßĹUśöřěN©T‘[VÇŔäî7®ăňnbŕ b"Á%#g€>Ý.L$$“ɤH$¤Xü6’2Eóaöäúô¶ÁŔ*Ę‚Ç .îö JBJH‘ńěIj y#űN¸ČŃŇ´b-ąěó Šż“Eo-KžßZŇ=©Î2óoF_đśś‹D"ÎŔ ŤçBČ*ÄčYË•^ Ş÷ dí)9€U++0ĎÖˇ÷¨×}Ř=ňů[ĂŠwDďŢÁAśS’JüfÜ´É4x1=¶ÇPmÓ¬Obä‹‘¦]Mm;ló=jt:]ćĆć _D‡GÓ?aç—á€7bńŰxŔđĽ€ÁŔLNŠr†™ Áń}«•©fE ]çą–4UŕˇÜ~"!Şg›ŞÚ®QŢyĚlűú!~*Şňüne>ďdÖ­ú-çý­Íçśę¶ZÓŠ”b7oŞ'ÍćEÎ0!„UBI*ěĚhĆ5ź(ŻÎ7:lv{˝@˝aűłŰłö,ľ®„¬¨ĹeTt˝ęjÜŐ¸ĺg[„Zˇéß›zNő¨MyTˇď·}6»ÍşŐšIwĂÖ°­{ZM›Lęt^Á0zyT¨†żN/‹1ŹŁj¶[33łY—űRŮÖqRBšĽ—ôĎq†ŘÍ8źyî›’ @ü»˛<_úí'RěfÜ´Ézpnr2]ŐÄtzăä= €8)¦i뙎89{_\53SrU }dôŚśéŔ¸µ<ňţÖôŕ \ü¶8[¦Ŕ9E1T3¦ÇxłŮ<™Xď!„,ŁgÔÔö;€V™!$—çÇsÄ“»ßŮćt¶9ŐíL"˙€_ÝPÓţôźé_ĐQ‹¦ĂśgŢşRÍ_í†aťWÍeŇ ś¬Ä6šŇ ‡y“) 2z63+ –tűŐŚĹbÍ„,,µćX,ŹÇ•$ Îl6±zFş;ży[ťŐŞłšMˇëá¬ű2×Z#ăářMÖ`XňÍfĹ5ËdäÇ®=[WgÉ˝µüÇř­ŐY,‘ńŘgŔfţÍdťÓbćŇs‚Á°ĐăBČÚWůs©TÜą]İFĎäNÓdôŚšÖ&k»$í†É>łiŁÉ´1ÝĐT§şŁg‘6çaÝţě« “iĺ«ňľF#źIޤŢC5S_g˙N4(Kţ>żvć ,ôNš5CpŠÜZÖ›źű[=r;Šąç¬ŰJ‰D !E;ާ2#™ JR™Íy4w»»«»‚ŰR¤"­ČŞ<Ď/C ¬Gü?㪻ý$B‘tÍ…UVÝ˝Bđ(¬ Î(ňw(p5ĐÝŐ˝ Ë˛˛*¸]µ"›Őc5Ţľ~‘ĎżWă˝Bđ(¬Đőf—÷ "d ř&|m™Ż¸ qAĺ¶ü·_>•t/„Ry´s*3 ĐlF§[DAB!„B*IĺĎčîęîîęV×Đťs‡OŘź]pPQA ő€ y(F/Vş +©’nż’îeńŰ'„¬žc^%9űyU™s::;|]ÝłŤţT*·@YA”Ĺ‹BYę@›Ęź0§őźK§ ® đZ`C—†Fľ IŇă?y|âÖÄB«G)„Z˙„BČRD#Áy–ü©uűé·»đ(¬ .¦3'kJV@źď°-˙Öâ~Ő-Ţů Ľ˙śżuO+[Ă&¦ Ş!„B!e"XJ'´ĐN˛ŐÎHO^Ł€¬ď]ovĚ™¨v’EO]×!W˙‡ýúßďw˝ěZhÝ!…˘ČqK[[ŠB!@4,ţĄ-¬míŻů,@Úďůű3Ú @Ńç!çŕÇËŢČ µÂBëF)dyV#„B–vŔšŹäŐÝŐť=šLX xŕyŢVgsěwĐăB!„˛ÖUţ:ť%–M-ŕ<ŕT’ŠcŹcˇ#„B!d™ýÔş˝Č«Śž‘ĺôveFJ÷gJE®\‡\¨J˙Hă!„BČꤶţ‹ô”¤ÂÎ<ŻĚ€’T2C€ňo”еÂčŁíGŰZ+BĘ'3}Vž’}o-řżL†öpI’ěőöEźŞéą&n=Ç­§I˝„BȊѶű ő=Ł>×®Ř9j&x5 Ś‚WÚ=%#Ńńh8¦\%duJL'zßé}(‡s—ţO±(íGÚŻ}umчB!d‰r[üyű•ż@çť¶?›ľů†™5żr÷˛5؉„šź*:ŤßŚ;Ú‰D‚aóťç ś ­/´†B!ç!çŕĹÁÄ˝ô0®3úü&“I{ř•˙ş"‚:Ľ- l;¨(ŠŃhúd[ω˘(‚ó€30’Ŕź.°ď´‹˘¸"o!„B|ž×“¸ŠZ ŻÔü,­Ę„¬++!:ŤŽG8ö;Îľw6:í:Ůĺ~Ő ‘HŘwÚĂ‘°ëkdx$‹FÇŁíGÚ݇ݹ‡gěŰżŻăDG4µ×ŰÝínug"‘¨ŻŻGÂ=§zĽÇi_B!dMҶö+3@ČŁCž’C7B»[w«?Şý{†aZžo€*o»Ov'¦HBš.8‘]ž’cßĆÔŁ/8ě˙’~ŇĎ0LÓ®&¶źŰÔŢ!„BÖí:éŔŤ:Ęw2P’ĘěÝÎÝîîę¦ © ŚžŃ>ËE‘afÂ|°{ďîBžz IDATŻ_ µBüfÜjł.řäĚlÄpĹ?(!„˛8ŹĘ€"íűŔŐ@wW÷‚.GČęa¨6(Jú?,[ĂZž¶řüÎ6'€đő0˙ź))+2’ŕŤ<€ţ÷űsĎ`kXó“ć‘/Fšv5 ^\Jj B!„”ŰBShjçTf ëÍ.ď  D*[öîi5m2± Ź}2ähsôľÓ++˛m«­§·G[˛ŁłCŘ,đFľńąĆÜĂŻüוLáóť?ŘvđčńŁĆuơO†ćSžç$î%Ô šL!„,âk~ĺUůsfďPÍýOC}HEĐ®FçđĎîßŔ.ĎIĺ©]´Î{Ü›™Ľ›I˙Ż=ů¬n[]îU2·¦}gfŹţŚa/GżTŻ®žáţýűőż˝JöďâP[ű´k÷Üżź©fŇUúŰ„ń1cú*zXž±ź4~ĺ°úÖĺ-™q%peăçs×Ú7§äţĽu&„˛&dÚ%ż«Í ă¶tŁÂřÔáŠ] X§ÓĄR)y7®|U, (!k:„Ă{Âë?çoŢÓ̲,€ŕŤ`÷ÉîÄtIHÓéĺ{óLdŻĘ_z¨%/8ě˙2g¶€<%‡n„v·îNźSϰ5lÝ3uMÍMŤ;m;l¶:[éJçś_ž’cßĆ2;{ßí-V˝Â•ŃľĘ0ŚúśŰös›űUwîU2·¦}gfŹÚfMĎ5°>cŤßŽŁčč©ţ3ý‘H$w°M.~â>·ž“eŮóşçŕ˙{°dra5¶Sä®Őx’PĂ#ęKŃńÁů×™BČŞ˛ÄuŇ€5: ĐQęŻŐű ڞö”ś@ČZaŰa ýűÓ‚`÷ŢÝ_żj…ř͸ŐfUKć™Č^ dqŚžÉjYCÁđőpčzČ{ÜkÚdňŕϔ̔Q”…ČĚŁzą•™}IsżĹ?â´% m?Ŕß˙a˙µŻ®©°ŚĚP+¶†'EÓc&¨‚:ŠeYĎxlĎÚ –Ȳ<|iřVôV‘»VEQŘ,”l÷Ż3!„ŐoAsF/đ(¬ĐůF'€íĎno°7h°7lv{ÖžĹוUĆů˘Ó}Ř @}ú.+2’ŕŤ<€ţ÷ű‹X°d#_ŚĽ8¨v02ŘÖň´Ĺ?n⇯‡ńâŃşŐę:ěę9ŐŁ}@Î8%©¨If/9?[Ăšź4gv©žˇÚéKä©LQYW)’ iA/ öžî˝¸–7KOă//\ĽŔ˙±żńąFx<9öăAëSÖ‚%Ăź×m«ă7đ™»XĐ]/˘Î„BVąG}€Ľć9vjiU&dµppFţÉ akŘŽÎał`µX‹§Ż-TŇ`0 1,Ô Ă_ « ái }24xqP¨L›L˝ďôʊܲ·Eť•{đĄţ÷fłˇ }żíłŮmÖ­VeZŃžôňhÖůĎśwq[-ÖD"Q¤zl Űş§Ő´É¤tÉŞLÉ÷ęüGç;Ot µB`,{k%ĺÍ şďĄíöíędĺ¬b}gúüçü‚YĽ3Ů~´€4-Ůžµ©óŚCˇĐŮÎ*©ŇŽ˙Q-č®yž·Z­‰{ žç3‡rëL!d Yâ:éań¦=®]Ę"ZáË"ć˛úeuľ ˝8úzçé·»<ÇĽÚÂŁ—•÷˙BEA$){@?!„BćiAµ9aÚŃżęŔ׺*s€ďd:8 $•ŮxÇÜíî®n B!„5g‰s*3 : Hű>p5ĐÝŐ˝ ËB žçéń?!„˛4 5-úŇjD!„BČj´Ä9•™h¶?ŁÓA§[t­!„BYm–¸@eFş»şujÓ?•B*•۰?Ki@ !„BČš´”*5ĐŃŮ‘”Ż@Čš#Šbfą(ß[ ţ/“ˇ=!„BćŹćäˇtYŹüł‚úbgnů·–đźÂâ€˙śżuO+[ĂH$öťöp$ěhĄ†YI ö†D"ˇ®˝ ~3nŰajëVk4ŐvVűßë·í° fA]ď)Źgž‰*GÂV‹U0 öz»tWÂLĚÁsÄŁ®Z•ŰUČt•í;ěâwâň˝„BČ#lqYNľć#ÚďŲ©’EO]×!W˙‡ýúßďw˝ěRw3 Óň|ËBëIČCw%pĹ`0DÇŁŃń(Ç~ÇŮ÷ÎFÇŁ]'»ÜŻşˇé¬şąF†G˘±ht<Ú~¤Ý}Řť{xĆľýű:NtDcQ{˝ÝÝîVw&‰úúúp$ÜsŞÇ{Ľŕ˙Sßiýď „B–Çâ"ěĚđ5ż€ö{FţţŚP;E#ś‡ś6›ÍľĂÎyő!+†Yá8 !ąä)9t#´»u·úŁÍ›í¬V!x#Ř}˛;1ť@ŇtÁüň”ű6¦ĺxÁa˙—ôĆaÔÇü¶źŰÔŢE®ţ3ý‘HäÚW×ćŤB!¤€EΨ*x@: P®LX xŕyŢVgsěwd˙˛j1zF}śʆ#ah;«°{ďîłśŤŽGG>Q”˙O×ö{ó~Přüýö_ůŻ+,Ë.ň!„˛4 ŹŽÎŽ •Špp*Iű‡†ű“UÇPmČ4ĺŮÖň´Ĺ?ŕW _kKĘŠŚ$x# ˙ýţÜĂ3ŘÖü¤yä‹ç™hđÂ`ďéŢkk™‰„B)7Z ŹŇý™R«×!—+ŔóĽ$>AČrbkŘÖ=­¦M&u|ÚĐ'C…ZÁ´É”•­a;:;„Í‚ŐbÍ<ËĎ:<ăüGç;Ot µB`,ĐóvĎ|j˛ďĄíöíę$ă‡t„B)f‰ë¬ů9y)IE§Ó©A€ĽWľ*–€P+0zćJŃlˇ„,3m/4óČż\ž“źGŰYő÷f&ďfŇ˙k϶Z¬ę˘ĽWäy^M ¤•zP4ÔF!„2Xâ:éŔŤ:J˝ĂŕŐ z_±@Öž’€¬ě(„B!„¬ ŠŚ^`î€ĘŚtľŃ `űłŰŐě ęFîB!„BÖšGj~–VeB!„BVŔçTf B!„B*ÍČĂw2ÝťP’ĘěÝÎÝîîę¦ !„BYsh@ę€"íűŔŐ@wW÷‚.GČ*dŻ·;8űÓ«UČSňŹ~üŁ[˙s‹çů"GI’ÔŇÜ ä}UEA˛’ŢćÝY&˘( ›…ÜŚC*yJî}·7“×h5pľäŚ\Ź(ŠÂ0Lß™>Ű[ÉWýř}§}¬ž…}gúÔ ŞMĎ5odÝ»ď¤ořҰ4-ńF>x5¸Đęĺ=mÓ®¦č·QVĎÖM›L‹şuB!+ćäŃőf=Ý'Źç§˙ÜlBĎáKĂuŰꊷţpW¨őżú%¦Yk¬¸ľßö…#áh,ÚőV—Ł-{éŔÜWĺ)Ůýš;řU0‹öý¦Ď}Ř­–l?Ň~í«kY‡÷śę'Ĺp$żş0TĽ&˘(rëłWdË{ÚĂ/ŽßŚGcQçgnť !„¬r4 ŹŮ;Ôé Ó-şV„¬rÍ{šC7BâQýŃÎď<ŕ”§dŰ›`ÔĹąâń8Ô¦!Çą»¬kĎozÔ…{ó–Tą^u µ‚­Î&ŠbÖEă7ă¶6ˇV°nµFcQľ“>“ɤîŃ–W/:»˝žËětľäĚ:řzX0 V‹5ÓľĎ[˝{C"‘jułÜĘh/í9â±Z¬&“)Óá GÂV‹U0 öz»úD<÷ťń›=ĘsĚcÝj5™LE˝ł,«n$î&LŹe?JĎ}•­aMMRB %$ó“fµ€}§ť3d7ß{ßíőv¦?ëř |ˇ_AyOŰ´«)ýę»ř]öŻBČ*·Ä9é„9Ćm]§ßîšgňśU˘H…ŐŰKeŇĺćR Rf߄ݩߋť~» €úO:kÉK´hSC^›0 ?üđCę©űżŻľúĺç_6ţkc*•šđŮđgę¶Á`HĄR%Kv˝ŮŐúbëśCR©şmußüů›T*őĺč—őż¬˙áű Çß˙®Đ?fë¦=jbb°ÎPčü©TĘü”9łS-Y¨zéWóUF{i_~ţe*•úě“Ďę¶Őĺ^%skÚwfö¨áφůrôKőęęîßż_˙‹Ů«¨îßżo~Ęl4ŤFăÄß&ćóę×üš©fŚŹŤŹ3÷{w?|˙SÍ´˙G»ůIsăż6f/r×ÚĂKîOĄRm‡ÚÚ˙Ł=ďK„BVłLŁäwµ9aÜ–nTź:\™s::;|]Ýř˙Ů»˙Đ6Î|Qř_ż80s±Aó’‚ti!sh š]—hZjeŽĺMą‘ob9Xn‰Ü6ÖfŮŘN9±ś˛‘ťKąĄ­ŐrS+…ÔJ ­\hÖ.lőé°NFËńvTN–U8)ťp7Tñé 7ż<Ęx¬#É?b[ţ~®Ź6 hajj'ˇjD¦přÎúBź†Ú¶“ţćŘÝŘđąay^† ¤çł3ż)Šrp-ÉĽ­pJ¨’Ň}ŘíxݡϡĚ)ń»ńŽÎŽě9k)şžnzµ©­˝Íą×io¶Ű›–Ě€/,ďüĘś’ü.©ůpĨxĹ Ł—˘(ŇĎm˙…Ý{Ň›íÖôOf1×kv¨…¶}mŔżĘ§¤ Čě)†aČÖC熼˝ŢČőHÉw»Žt}qý‹¶}m ďo˝á«á‚ĎIͨęĽĘî`Ťü Ř}˘{ňĆdÁ»&ă!2÷ťń±;ŮĐĄ–RKŁŞ•˙‘)Łxů…Y|KwżĆâô)‹˝.珤ű wpO°ä»ét:ő Eš®®lk§†a(Šj?ĐÎýΡ‹Ů©’ůwMľ%ńÓendş ~ĽóÍm’BˇÍby«ŃŮŠ•ĆÔÔäLý'šZ0Öu¬ËŢ/ĚęLm0ž7<$”ôľ+ް-ü¸h}Ô(e&oL@řZ8gMşž¶í˛….g«řÂŚO@z(ńŤ|ωžŔ…€ľś11jFMÝO‘Sśź®§­/YµĹ3Ő™´¶DÂĘą Y{g…Ňé´ÖAů2ÂďâKľË0 UG ˘7ŁÖ­çwîwF§Ł›Ž‘hJďş đŐđČĹ‘;Ń;ZBˇMd™1ŰÔ*XH˙Uc´ ™ ”1:sÎŢúhqU"ŘŁďŹÚvľ‘WçUýů§nNĺśüň¸÷”—·ń˛,Ź®§;v˛;Y2Ń%§0%źŐř•ńÁł\˝Íżµ’ŇétNłA–ĺÖ×[ąŽłrńéřŘĄ1}˛‚ď’btuvqV.řIpôŁQrĐb±đ„Bëk%«Q5¤˘Ě6zö«ë¸·î2b řÎú´˝Ŕ–x ťŽ¶îi-ÖHPć”˙ö˙ţ·…' @&ŕ ´<9Ťďb¦nFű߼řŽżď´Oźxęf´úvĽ~–[ „BU©˘Rť`›©é>°4ôlú€‚†ýĂąS€­Ćo8Pp6B!„BîPŔŔŕ@Ń)@D©€ěl„F^ž—+-BČ€ĹbÁî„Bh%V¸@uŽ”nĎŽßȧˇ÷w˝• !„BˇµłÂ€ęP3Ş6¨đ‹R#!„BmL+€ęMÇČŠ„ŃŰŃŘtL¤ä€Ćb±`0B!„Ú80 €Á·`÷žÝ­ŽVhu´îŢł;çČňËŠĐ:‘$‰¬Ú®Ě)Cç+ţ•ŃčłçŻkYĎqoă9+ÇŰxŇĚF!„ĐZÀʳ˛"#´näyąś5ďËÉÎ0Ś~ë®JŤľ?*$1)úĎűÝÇpÓ „BčYŔ„¶śVG«,Ëdď-HÝOŮ›í\Ç7ňbR$='zxü(ho¶sVŽě÷”JĄr˛kŁ $Ňťďhq™oäÝľS}ĽŤgY6ż©@Ó4y!˙]fźgźÝ#@!„¶°Ćda7é@±\Ú.`jF]ďXúzŘ?Śh“ş˝Ĺ˝Ě‰ł"ůÖ}Ä=viŚkŕ&żžôžô†Ż„eYvěu? Âč<ŘÉ<ÇŔäŤIď ďäדúě’$i§í:Ňĺ?çwp ťňözĂW ËrKKKŕÝ@äóďŚ/_2Ď'ťNďŢł;ý8 Âź„göBˇ­¬˘€©›QXZŰĎ6¨Z `=ŰËŘ ¸d €Aý>:öWt9„6&eN‰ßŤwtvoI+—˘(×Ŕ6ÝŤ ź–çeČ@zľhD»2§$żK’\îĂnÇëŮŔŠ˘Úö·€ývďIoN.†aHC‚´"×#«~!„Ę1řďÇŢ}´uPµ”8+’BBŠz:Ě÷:uŚ]gĹÉŻ&UµâßôĹSţˇpżáÎ@!„ĐÁ€«)55đtů„ކ©Î¤UĺézÚ¶Ëş"ß 3Kćá(ް-ü8ź]C×ÓÖ—¬“7& |-\ÎŇ@étZ[$7ňe„ßĹ/˙–B!T¶ĺŤ(J6{uŽ ű‡kHŐaňŰŽ=FË€ęĂ"—ˇdvI’Čśl„–‡®§;v˛;Yą _ s »“ÍY®§¸—9ŢĆk}ů9Ů5ăWĆĎr \ôv4đN d1dYn}˝•kŕ8+źŽŹ][˝[D!„PQË źî„[ť1CţaĐf‘6N B›śĹbI§ł=îZ—?X^°Do.YźGKľ3>ß™ě/‹¶üż>»–·ńdQÁ+ćoŠÇ˛lNz„B=ËŚŘPĹ1Kj˙ůjj˘Ń[ĺ\B™Sň—PĚ.ŚxzqaÄľÓ}|#ϲ¬~#¤ž“=\go˛k«¬3Ů/IëŁ-x~„B!„ ` @559Ó~r&ŐB9hŠžś“˘8+öžęőžČ."ËrKs‹ďÚśm---ÂŚ0úÁhßé>-ŁĹ!ΊÎ}Îľ·˛»ŽuůĎű…„`Ş3ź!„BˇbV¸Ŕ¦ĐŐ­DćeĘ»Ć6ÝŤŮ›ě\׺_řKv¶Ăâ¯١Úöµ˙*źzđ´ ż´ĺɰ@΋ĆçG!„B¨•Ś@Śčżj ·gô‘ĺŤ[BQż0b™‹$Vt~„B!„Š!ýúĺ|Ő&Ĺč÷¨Îť€‡ýĂ…7úŐŽ”7Pp Ųd`ňĆdŰţ¶đµ°˝Ůş5ÉÁ•ž!„BmaZ׾}{őÇ ”ج̀BK(–Ăd2MÜฉÚrŠă—Ç˝§ĽĽŤ—ey…çGp´8ÂWÂÚ·ĘśB×ÓZÜy1étÚ`™˙‚ëŘ®pmÜŠŻ“«Ě)ÚZFDŰľ6ć9¦X™Űö·±;YÎĘŮ›í©űŮY‚ŇCÉŢd笜ë€Kyş,sÁ”žăŢĆ“őôË ťâm<»“%] «Rć‚@!´a‰‰ń?}⪊(¨t{Ćp@żôˇďŚO’$!! ť"k [Q{M„.…ÄYQ, IŔ7ň©ű):¬ĺĘ??Bĺóő„>]\Đsâˉ¦×š´˙ĺŠa&z;jśfĂ’çĺś˝Ö]ď©Ţ;ßÜ)öî‰ă'R÷SbRôő¸Źe㼽^ĎQŹÍ/µŰ)rôýQ!!IŃŢŻ \HŹ$!!¤î§"W#ĆĹ+Ř *Xć‚@!TŞ*  5Łjž ż(3ˇŤ­ý`{ün\zíň}ňő,_Űs˘‡·ńw¤;ß`!Úüul5©ű){łťkŕřF^LŠ0tneYrDź^?n UCÉAĎqĎňÖÉmu´Ę˛Ě5pdłüÂč/ÝwjqąŢěUéPw´8H“;˙É”\ä7‡cŻ1˛ €ŁŮ!}ź˝Ů©Ż§:w€ű°{ęĆ”AJš¦É ůď2űâűhLśýçüŢ“^eNôŠ˙.f‡Ľ¶— çwîs.oťÜ[Ń[&“IśĹY1ż09WiiiBŕB@Ű ­ëH×ŔŮ1):ZŢŢOĆx‘_ăŮSƆ.‘uŔČ"]Oű<›ú>w˛Ť–’$ć8‹ĹŇ÷V™îĄĚ)˛,Ź\á¬\Űľ6­ůgđ(–]T„BUCPť;ľ=»÷ě&ß¶:ZÉ‹ü#mvd¶†ď¬/ôi¨ý`;é0ŽÝŤ ź–çeČ@z>;µŚ˘¨ÜZݶÂ)őëŘ:^_RßUć”řÝxGgGöśµ]O7˝ÚÔÖŢćÜë´7ŰíMeLIĎ;Î:ą#ŽŻxaôď..×ű ;©ç\E»5ý“1^äwŮł§‚‰„ÁLˇb)†!MťˇsCŢ^oäzDͨęĽĘî`Ťü Ř}˘{ňĆdÁGAI dĚ„ĽEζ*EE!´‰č?%«s ŔU‹ÇBź…˛ÁO ăPÇ˝Ř=®KÝOńvž¤,h^$Ą1Ş–Ę©DĆâ1aFĎÄ}g|ěN6t)¤ĄÔŇ,g•Ű2Š—_Ĺ·Ę^˘·ŘÂľ+ZäW't9ü$xç›;¤y¦Íż˘ëi鑤MěÉO©ç~ĂÜ$Ů)Šj?ĐÎýΡ‹Ů±ĐüGAľ•$‰{™+Yď/Y„B›ZőÇ ´ĄxŢđé1¤÷˝üĺe‹¦ĚŔäŤIĐÖ±ŐĐő´m—-t9[ĹfxŇC‰oä{Nô.ôć:í~ IDAT䌉Q3*YOF[ý¶ŕůµurő) ĎTgŇÚ c(ç*ËžĚS‘đŐđČĹ‘;Ń;úe”śżt^˝vBź…śűśĹR¦Óimm€Č—~W¶ äÜďŚNG 6łľd…ĘEůEE!TŞ€ˇsŮ愚Qďvéë ´ yŽzßôűÉ·Úň˛łE«\T,%YǶ˙L?EQ“_MćäŠ\Ź¸ŹąGŢQTĹŢhűßc®C.y^Ş– }´¸*lŃ÷Gí»Ĺlqî]rţ©›S9çż<îęt žÔęĺ‹G×Óť;Ůť,MŃâ¬SđU]3Łń+ăÝÇşűĎô›·›#×K¬ź“/ťN»Ú]9ł€Č˛Kňc™Ľ$Iź¬ëź»ĚfónÇn0o7“ŁŚşąFޱľdŐV ÎO)˲«ÝĄfTČ€ő%ëŘĄ1’rôýQ×!×°Řd2iëŔVô(ňË\¬¨!„Ş> †T‚Ůć@Ď~uűÔ—`€,řcPżŹNG[÷´b­5m#nădS7Łýo ^|ÇßwÚ§O{:ť^ůrřműÚpŽB!´‘é÷Řô#úŻŁU€H`@¦ÄÉ=Ç=LÓu¬+r5B& \\ŕ>ěŽM—Xt ˇ5%ĎË#Jv†aV¸Ü{řJŘl1Żä !„ZkU ˙Ş)Üž!¤a`8Š˘$żKšęLŇcśí6śVG«,Ë\Ç5pşź˛7ŰąŽoäŤH zNôđ6>řQĐŢlç¬×Ŕ9Z©T*'»>Ŕ]HĽŤç¬śŁĹA¦Ŕ‘wűNőń6žeŮü¦‚$IÁŹľÁj۬!„Ş2Ő](ź6,PjŔű[Żsż32qq+s É2ycÂ×Âöf{ĄĄEhÝŠŢ2™Lâ¬(Ίŕ>âűhLśýçüŢ“^ 3Öö:„„ĐófĎäĤĹY±÷TŻ÷„7?»¦ëH×ŔŮ1):ZŢ^/9(ËrKK‹ľ3ąż§ÝÇ»µÎ=!„2Vý1%63|I$ွÉî9ęéňt€Édš¸1Á5p7&HTB2§ÄďĆ;:;¸®˙tżüXŠ˘ČŚ5ر»1{“ťĽ+üE08Oň»dţ<7Š˘Úö·€ýöÔ”>KřJxÇ ;°=ŚBm|ú€lEx“ŽËUş=c8ŕ:ŕĘVž´.OÜşmXT-ĄďË—$i±Kţ t긻Ç5p©ű)ŢÎW|r]ď~Ίč˙ťúzjâĆȲlyÁň·˙řMÓË» „B­ťŞŠ(HͨÚ Â/JĹ ´‘™ęLŞšý5¦ëiŰ.[čr|+Ě,éăWT2`1[ řq0?»†®§­/Yµynĺ, ş’JŇCIř“`2™¤‡ÖţBˇŤ©úcČƦc$f1z;Jć3hGJĆ ´‘ŃőtçÁNv'K‚€#×#áka®cw˛9«ŃőôŔŕ÷2ÇŰx­/?'»füĘřŕŮA®‹ŢŽâ<7„B¨ščkűŮžpŞ–XĎ6€Á|žb Ňľ=»÷ě&ß¶:ZÉ‹ü#m"‹E›Š¦uů€ĺKôć’őyô3Ö|g|ÚL6mů}v-1oă…Ä’ý- Yȸ`!„Ú€Şj€‚Ęł˛"#„B!´9T B!„BHCŐRŠ’}]ť« ťË6'ÔŚş8ޱôő°B!„ĐV fTúé*8Ő`PżŹNG‡ýĂ]!„BˇMŠŞĄ`@ÇřďÇŢ}„B!„ęŹXlĎÔÔŔÓĺ˙Ş>ŽGřJXűV™SčzZ’$ă\étÚ`™I’†)çŕ‘$‰y®čµ”9E[ËhhŰ×Ć<Ç+łç¸‡·ńś•ămĽ¶żrÁ,…îocw˛ś•ł7ŰS÷S IRMM ×Ŕ‘%ÜI%{“ťłr®.ĺéśĐĐĄąY v§E!´aU˙>ĂţáRő_X€……ü6€cOĹË€>Ë Beňő„>]\Đsâˉ¦×š,‹q.†a6oőNž—sö:Xw˝§zď|s§Ř»ŁďŹ ALŠţó~÷1·A–‚O?‘şź“˘ç¨GËn2™ÄY‘ü+ůă.Ř ňöz=G=bR4ż`&ĎS™SĽżőĆľ‰‰IqôÝQď o©űF!´™čkűŐ9008°Ú, Bm„Ş@űÁöřݸô0Űú4ä9ęQć{łťôă:Z©T¶Űaž=ĽŤĽ ­Ů‚)‰ž“=\go˛çw0§î§ěÍv®ăy1)ŔĐą!–eÉ}z}łY«†’žăžśó 3é&×ę÷‹×ęh•e™t~,ŚţŇ}§úxϲ¬ÖŕéŹw´8ȶůO¦ďôb®ľÓ}|#ϲ¬ÖyźĎ±×ÁŠöh»#Ë—ŮçY,¶íoËľŰěľ7ęě/ö( šúzŞóp'¸»§nL]Oł;Ř´ś€´ś¶ľd5>BˇÍĄú÷ňA @MM4zËŕĚ‘/#Ú‡n:ťfžc”ąěąA­ˇgʦéÎťd@z(%ţśh?ĐNSôäĤĹY±÷TŻÖ•+˲cŻCHîĂŮŽdŁ”-qVtîsö˝Ő—sQ÷÷ŘGcâ¬č?ç÷žô*sĘ PüwQś…Á˛˝D‡49żsź3çü]ÇşüçýBB0Ő™ Šw+zKë˙Î/LÎUZZZ„„¸жBë:Ň5pv@LŠŽ‡··Ŕ“‘eąĄąEHwmζ––aFý`´ďt”š=UP:ťć8‹ĹŇ÷Vź~ľVĄ†.ą¸˛ž—ůFžłr='{´żNŹ"żH@×ÓŔ>ϦľĎ6üĆŻŚżňŹŻX^°xOyÇ.Ť-»¨!„6 ęʍ¨ÉéňϨ®˙éţ,^ŐЧˇÎťä“ҸV„Đşđő„> @čÓPűÁvš¦aÄîĆěMv®ë?Ý/ü%»ą/EQZ 2«HJ¨’Ň}ŘťÓó­Ě)ń»ńŽÎ’E~,ÓőtÓ«Mmím X'0 CŐQ¤ĺ˝µľ1!TUŞ? » P>mXŔxŔb±Ř›ěî#îĹî0Ş!´Ž šGbÓ1r_ŃŰŃś#%GČZ!„BU} @¶@ŐRëŮXF €AúÁ·`÷žÝäŰVG+y‘!„BˇŞGŐRŠdAéę\hˇ<++2B!„B›šQé§sŕ«3ˇŞ$I’¶…ÓĐůŠe4úě×µ,ż<555Úł’$-»H!„ZST-EÖ¶©Úm P5Ł.F<,}=ěĆA´IÉóňČ{#ľ3Ëlëł3 Łßş«Rd‹ŮegG!„Đł±Ub ę÷Ńéč°¸˘Ë!´q´:ZeY&;a‰łbę~Ę}Ě-Ë2EQăWĆĂq\çáÎx<îyÓľ–ËP ćíćĐĺ˲úě·ţxK[•_HÝÇşUU5›Í‘ëć9†¬Ůď9ę‰Ţަĺtčrčěž‹BˇU§źďSť1ţßű±wU±[Ń[¤ëťôľ»Ź¸Ç>gE˙9ż÷¤dYvěu ˇç͞ɉI1)Šłbď©^ď o~vMב®łbRt´8Ľ˝^rP–ĺ––!!.ňÇäy™oä9+×s˛G™SžĹÍ#„B¨r[b€ě«šxşü?BUI™Sâwăť\׺_~,EQ®.€m»ł7ŮÉ»Â_ó$żK’\îĂîŘtvsAŠ˘Úö·€ýöÔ”>‹e»ĺÇ~f„{Â=čţ—I„B­Ś~€ęöת˙Â,,ä·{Ś–ŐB-µmdT-EşóĹYQH@QO›ôO ăPÇŘĄ1qVśüjRU+ţM_ę# B!„Ú¤Ş*  5ŁjS€ żŔT-Žđ•°ö­2§Đő´$IĆąŇé´Á2˙÷ż{–›âI’Dö+H™S´µŚ6éˇdo˛sVÎuŔĄ(J9ďzŽ{xĎY9ŢĆk›.;ĎĐą!ŢĆł;Y{łť ] ±;YÎĘ‘5[@’¤šš®#˙´˙˘·Łś•㬜»Ó­mÚ€Bh ˘j)íłĄšGbÓ1ňŃ˝%±ÚŚ@ŐÁsÔútqAω/'š^k˛X,Ćą†Éţ"lBňĽśł×Áşóöz=G=bR4ż`Î/[ÁwGß‚ýçýîcn” é‘$$„ÔýTäj”9Ĺű[oě›Gßőžđ’”&“IŰZűŔuČ5vyLLŠŽrŢ+˝·BˇjĄfTúixuŽ ľ=»÷ěnu´@«Łu÷žÝ9G–_V„6Śöíń»qéa¶»7ôiČsÔŁĚ)öf;év´8R©<íÂď9ŃĂŰřŔ»Ňť_0%Ńs˛‡kŕěMöüń„Ôý”˝ŮÎ5p|#/&E:7IJ,9˘OŻ7ĐúőÉAĎqOÎů…ôkuß‚Ĺku´Ę˛Lúą FéľS}dź2­Á#$Ňőîhqm ňźLßéĹ\}§űřFžeY­ź>ßÔ×Sť‡;Ŕ}Ř=ucŞświš&/äżËěó¬AĘ‘G|Ůżu–,@×Óě6-§ -§­/Y‹,ťN«óŞ˝ÉŽ˝Ž‰ĹR"„ŞzT-ŰŞ8`ˇ<++2B돦éÎťd@z(%ţśh?ĐNSôäĤĹY±÷TŻÖC,˲cŻCHîĂŮ.gŁ”-qVtîsö˝Ő—sQ÷÷ŘGcâ¬č?ç÷žô*sĘ PüwQś…Á˛˝Äř9żsź3çü]ÇşüçýBB0Ő™ Šw+zKëęÎ/LÎUZZZ„„¸жBë:Ň5pv@LŠŽ‡··Ŕ“‘eąĄąEHwmζ––aFý`´ďtš=E„čzŘçŮÔ÷©rŢM§Ó\g±XúŢę#“¸ ¦TćY–G.ŽpV®m_›ÖŇż2ţĘ?ľbyÁâ=ĺŐ6`–çeľ‘ç¬\ĎÉeN†aL&Óäדů<’z°¤l!„¶”ęŹ@hëđő„> @čÓPűÁvš¦aÄîĆěMv®ë?Ý/ü%»ą/EQ®®%™‹¤„Z )݇Ý9=ßĘśżďčě YäÇ2]O7˝ÚÔÖ޸Ĺc¤wˇ„Ľó+sJň»¤v°DńŠF˙.EQműŰŔţ ;©űć\E»5ý“YĚőšjˇm_đŻňä «5{ŠaqV”$©ç×=Z;$źšQŐy•ÝÁŠIŃąĎŮ}˘›ď:ŇőĹő/¤‡Rďoz˝żő€e»ĺÇ~f„{Â=čţ—lĘČDdđě ×Ŕ=zühĺĹF!´yékűŮ©@›t X®ˇsŮ愚Q×÷ťń±;ŮĐĄ–RKŁŞ•˙‘)Łxů…Y|KwżĆâô)‹˝.vm2]OKŹ$m>O9ď€ű wpO°XJ†a(Šj?ĐÎýΡ‹CN§SR¤eâ:čůp`V4M÷ý®Ďľ'.lo˛ 3DoGÉ „B[“ţ,Ű j)€őlÔć‹)`PżŹNG‡ýĂ]ˇ Ëó†‡LŹ!ł˝U XĚ~4ČX4e&oL¶ío _ k+Ďt=mŰe ]yŽy@ř]ĽôHâyľ‘ojlru.20&Fͨ©ű)v'ľ68?]O[_˛j ŠgŞ3im‰…i4jĂä\Ĺ`)¤Š8éĽzíŞç¸'ôYČąĎYňÝt: ™l}=ňe„ßĹśÇąßťŽş;ݱé™îĎ0 UG‘`†čͨőE+dWřŮţ,Ě˙üésx’=ü ¸8´‚Bhë©ţ}üż÷cď>Ú:ĺŔŕ÷2g1[śűśůŮoýqqWěń+ăÝÇşűĎô›·›#×#ĺ”dôýQ×!×°Řd2…ŻŕnŮ!„Đ3Riďąľ¶_CęĘls gżşşµđЬî*@˝łguO¸Ö”űÁő.Z}ĺ·Čoľ%0u3şŽż•!„Ú´ĐÖr\|ÇßwÚÇ6RÓ}Ŕ4ôlÖU€jžZŁň ´*žM B!„¶”ň×ÔćĹlúRď_XXXXXŔ6ÚČžÁ*@!„Új–ŃèŻíoÖk˙hĂ„B­şeô0ękű›o@ëţ‡§kX,„VGB!´ęV2°ÎűäTúőß®bŕŁi;#ŇÄdvŹŇä÷R׉РĎIQtĎŃ–‘ʧŔd˘#ő´vJćB[Ž „BhŐUÔĂ8u3 * ď´/˙_±Äú¨ßŠ"€Óiĺ•_ ‘+ŻýUGőľ‘]%]–¬ýŁbÖzŔŃâĐ/ľ©Ě)t=-I’q®t:m°Ěż$I Ă”spŤH’Ä—ő%Ë˝Ż|÷¦|“WúL&F;gŕ_]÷ľň‰Ńˇ¦FޤřŤóoß ÝűĘwgÂgŢţŚęUčŮ[ëĎQO×ä IDATčÓĹ6íÄ—MŻ5Y,ă\ Ăä×S7 y^yod˝K±H™SĽżőĆľ‰‰IqôÝQď oN‚ŢS˝wľą“sPśÉ?÷awçáNrpôýQ!!IŃŢď>ć&]‡\c—ÇĤčř'Gŕ˝ěźšÇO¤î§Ä¤č9ęŃRóöz=G=bR4ż`Ö`ŕB@z$ !u?ąZÖÎ!„6‚*‰(“> | “­¬ßűĘçďw‘cçÝ}'v·©ŞbWU×ÉĐ+ΡW~5ü4zńl'´ ¦˙žUĐ'×3řáÔ+Ρ،8Ó®]=úoÉW~5ä»8čwUGű~ÝĆ9‡_ůŐĐîöˇGrş˘ŰA› ©Ů—üú3~÷2NŢ~°=~7.=Ěvů‡> yŽz”9ĹŢl'ŇŽG*•‚§]ř='zxx7@zť ¦$zNöp ś˝Éž?žşź˛7ŰąŽoäŤCç†X–%GôéőăZż>9č9îÉ9ż0#Îo­zZ°x­ŽVY–I÷yÁÂč/ÝwŞŹ·ń,Ëj !!^vG‹#ý÷tÁ'Ówz1Wßé>ľ‘gYVë’ĎA×Óě6-§ -§ó·Cvěu0¦˘ŤüĐg!÷Ůń f]-/”h7"„Ú8VíJ7żćżřŽáŮ"WĚąíxAZšrP/ž ^7,ĎËô|v‰˘(××’ĚŰ §„Z )݇ݎחD (sJünĽŁł#{ÎZŠ®§›^mjkosîuÚ›í¤»ş„Ľó+sJň»¤vpäĂŁâ/Śţ]Š˘HOąývďIoţU´[Ó?™Ĺ\ŻŮˇÚöµ˙*źz‚"ł§şŽt}qý‹¶}m ďo˝á«ĺţ:“í[†aÄŮ슷׹€ČDÄ{Ňۺ߹ϙ“=řA0‘HůEĆŹ˘ 5ŁŞó*»“bđ`÷‰îÉ“e–!„ĐúZŢ€˘l^ĎU€VhA· XĄ-u^˙*9[ř©ŰBç>9(Ëi`wXR¤öýMä UKEKŹdč9üt•ŞRu%λ›,zůZ0ogI%ţ’Š%Ráw=ES"T ‰ÝŚĹcˇĎBŮ€ŕ'Đq¨ă^ě×ŔĄî§x;ORRT^Ą°HJcT-E꩚X<&Ěń™¸ďŚŹÝɆ.…´”ZU­üŹLĹË/Ěâ[şű5ţ§OYěu±3¤ÓéÔi'¸ş˛M—2(Š2ńĺÄßÄżĺżĺ~ĂÜ$ŻíMvaF€čí(yA„.‡‚źď|sG›8”˙(Č,)ë‹ÖČ—ĐbÄId~Ă0Eµhç~çĐĹŤZŤBČŔňV˘źöto”€rjđ9d śŚú€ńʞµíî3áŔż¶ß™đQu´–˛ďMÜşŇsgÂg˘˛UUţpR¸3áSžVÔyĺęâ‡î}µd͢®Ó!˙ďś÷¦|ö&®ďüT±ňPţŔC‹GĎą˝ţ«%o!ž7<$ö”ôľ+ް-ü8h±hĘ ÎŕđµpÎâ0t=mŰe ]ÎVń…ž€ôPâůž= }9cbÔŚJ–© _ śź®§­/YµĹ3Ő™´¶DÂĘąŠÁRHĺc†ŞŁ„„Ń›Q당1ĹL|>ŃôZ“6ó>ťN“|áw=mí<]ů'řAĐ}8-ľą8r'zG ±(ř(Hś1©ý;éĽzí*„> i ÎýÎčtbÓ±üč„BÖ2c¶¬ű>PÉţ_Ë&?NÓ;{ňŹ'ţ’â^÷€i;ă9íďżüyěňçŮÇ4ř^vMڑʧȒ˙úúI;˙ýűČ‹äwRNX°ü8­˝+?N˙w{¨óJë!\9tË)ćű­»>Ě2xŽzßôűÉ·t==08Ŕ˝ĚYĚ–üy#zĹRšL¦‰ýgú)Ššü*wZHäzÄ}Ě=ňޢ*öFűŘ˙srÉó2PµTč#ÝJ»Ű`ôýQ»Ăn1[ś{—śęćTÎůÇ/Ź»:]gµzyÁâŃőtçÁNv'KS´8+ć¦äô›ń+ăÝÇşűĎô›·›É›Š¤ÓiW»+gĐř•ń®Î. ę¨ń+ă9ÉȢLňc™ĽĐ‚žCꆧçx6}×?w™ÍćÝŽÝ`Ţn&2~ŁŚşąFޱľd Ľ“ýű3úţ¨ëkŘ?l2™ôëÉ"„ÚŕV¸@v=ŰčŮŻ®âö[• \*xu}Żż~ŇżöÚ  `˝?źi;#~5@ŞćëKąoÔY‹6ŁśĆwN@«ýOÝŚöż5xńßiź>``ęft+×$IÇĄÓ¸řB!´LŤęŰHM÷€ĄˇgŁě`PËŃ*úŮËß,źÖ1ŹĐZÓ÷÷ŻJß?B!„¶ *Ů Ř\ é[pöż–fő—BhÍz˙V®ý[,ěţG!„Vb…űlŽ€ś`ßś×XűG›ËV®ý#„BhĺV2@iAŔë¸Q,`%pJ=B!„Ş>+€M1PPÍSkT„B!„6,Rł/ůU[€D_Űß”#Ĺ–B¨ęEoFűN÷©5-§íŻÚÉďůŚWÚQ攑G|g|Pd]ËŞ!I÷2§­ŻŹBU mnŹ}­>`Łě\Ń@±x„6 ŐÜěâ ¸ą„? ěNž@ěn¬t–Bäyyä˝l€aj­ý#„BŐMżtxI1ˇŞTpóŻeS2Š ąßp€ű{ěŇ×ŔM~=é=é _ ˲ěŘë~®}w´mÉEäd‰ŢŚvëňźĎ ŚŹBUżŤđĚlö eA¤âX}·V˛BĽ….…zÓ;usĘ÷¶/q7x7 Ě)Éď’®.pv;^_ć˙ĹÎCQTŰţ6°˙Âî=éÍÉ˙·¸6aŠÎò,»ŤŢŽ:ZˇĎB±obĘśżďčěČf©ĄHFr6rfr÷A÷Č{#Ů2,Í’S€‘G–÷@BˇMˇŕtü.ČŤ€*×Ŕq śsŻłŐŮx7`śX?ާŞËů5§(ÝVđ‡˘ŕyϲ,«Ě)T-E†&I’ô źyieNYv!BˇMç[áNN ŕ} ŔFŮ řŮÓ?©źń»µëX¤ŐRĹ·¶Ĺ)sJl:;'1›`źg€®§­/Y'oL@řZ8gŽ>cbÔŚšşź"ď’¦:S~cŔř<ŃőtÓkM ŮF™TŃy:vN}=ü8č9ę!ym»lˇË!ň®0#ä–đĹ왵ĺŹňłä ä] „B›ťľĆ_lú1UK)O»ČŚö¨ŮVCoŁsľ®ryוľfĽ°·ŞhľIßÚç;çcw˛ś• ~»4FŽ_<;Č5pŃŰŃŔ;KǶÁčűŁv‡ťoäŐůěŻ9]Owědw˛$Xctž""×#ńxśłr\×u¤«ŇóĐő´sŻsęĆTçáNí„áka®cw˛d’ŹŢŘĺ1ď)/ßȧľOi#ůYĆ/Ź{Oyy/Ë2I“N§ËiŇ „B›©÷Ş•ÎNý1Ś €Rž,L'm€…'U˛ň¦öŚ~ĆďŽŢGËúg5Uń­met=-ÁŰx!±¤łÜb±h!ąžcĎ1y­ĹÎj]ć  Ţ5>ŹĹbÉ_PźyŽÉß‹ ˘ó„Ż.餷Ľ`ÉąGýnö&;Í~|°ëA±,|#O’™%…«ť"„ŞzĆKŹPµl( ć5 TPž,TS@ÓZ˝ťU|kh«I§ÓmÎ6é±DSô׿Xďâ „B›FąűPP80 úÚ¤Áô3~·ö"ç­‚ÔŚ˝cęji›ŐJŐ-?”BͨńiˇĄĹH}źbw°Ë>•޲o-[Mâ‰DSŁ­Ŕ[=+ Ăä¬CŠBˇrč#~ŤbČŔĐąšˇó´v̢€Ş©ÉŤ$©¦¦†,QÂ5pdľ2I’DÖ\_úyówľ)ťž®ĄššlMMvös"™\•2¨ >x(•NWˇJo-W-45ÚV˝T!„Bč(w2ĐŰ˙Mg?ý×âëüL&ýz|›Ë’yóÓŕh® ŻÉĨO竪šMBFZÚÖ`Ą(*ő őŕˇDŐŇP 6› `±]ͨń¸ĐҼءžUŤÇĐÔdËÉKŐĽţŢZö¦–vü'“)Y–µ"‘wÍfF–Uó ćGŇ#5ŁP@6«•˘(}»iłY2p{:ÖŇl‡eÝB!„ĐÖTéţ¶ĺî@F´Îë2‰łbŰŻÚ„? ĚsLωš˘{ű{9Žk?ŘŹÇMu¦ČDÄb±čł ˇűX·ŞŞfł9r=Â<ÇH’Äq\çáÎx<ŢŰßko´»ŹąeY¦(jüĘ8cbôďjŰŁ–/bLëžĘÎ =J›ę˛'1›$ÓäÇéD2Ůdł%ď§ô»t©ŁSŮůx\hjĘv·çä­ÔĘo-ź’Q™çLV+›zJ&“¶ëÓf«•Öl!˙gÉŹÓÉdŇfłĺ$¸=SU•˘¨Ô#Élf°öŹB!Tľe,ď^Y ŔĐą€ĘwV!݇Îťý/˲¶° sź3p!Ŕ5pľőą:]=Ç{â3q!&HŹ%Y–ťűśˇKˇˇsC}oő…Ż,Y¤ëH—˙śßuŔ5tnČŰë%ďʲěŘë~{“}ěŇ×ŔM~=é=é _ ëß-źţŮ-,@t:[9.ŢĽ’Qăń„šQ” 8šx€ ¤ĺtbvÉt ĆÄ$ cbL&“©˛™NËË»ň[3fŢ΀ĹlyđPČ9˛śN¦@FĄ­-ÁŽ,Ň÷ű"űŕaŞ©/˙ş[“(wÖ»ö“E!„PEČg(gł‹‰Řz}­¨¨ĺßÚÔÍ(,Ť(=ŕÓU÷}Ĺ«ţDÁ)@žăž©Ż§şŽu‰‚H–‚Z îĂnÇëKş·•9%ů]2˙]Š˘ČAeN‰ßŤwtvdŹ×Rúw+˘ź+41F«/,@ôvĺtH $˙šJĄRV«•×úďłß6Úäy5-§“÷ęYwZWW5 (÷é%ÖúÖ*EëţŻŠÍ&ŤĺyK<.0ŰMT-˝’Čé­ł•ŽşÖ†ËIŚB! ů ]÷ÚE÷•Ş,`ĺEI~—4Ő™¤Ç»s™‹Űh›ţUKé›’$éß]žÝ…&ĆhÝä%—Ň·ľČŢžŽ±ŞJQcb=’Ěf ČóiSŁŞŞ©Ž2ŐY“¬µdŚô(7Ţ—ŞĄÝO(7ď3żµ‚=N›·3Ň#©Ŕ D ŁE@ęűÂŃĚT-e21‰Ů¤uą˙?lAĺw Tš!„B°Žµ­ °vźŕ•ĹřÎŐ9?Cçi5ŁRµ”źŘ€÷·^ç~gűv÷·(Ľ1ٶż-|-lo^ŇÖˇëiëKVíÝüÍ;ézÚ¶Ëş"{ 3‚ĺy ¬LÉa”r:Čw°l2™˛Ů¬¶k2™LĄRjL&Ćfe˛1Á@€ÍjŢĘĆgŞ–6=gĘ?k¶ÜžŽQµtSŁ-?ďłą5%ŁŢžÎţ/h21VëbMť®ĄŇ”ş˙ŕiLóRµ`ÝÉĆă±bwG°/ŹÓ¤™„B!´îÖ˝öż¦*Śx:í§śzż>Ŕú˘5ňe$ňe$‘H1¶ç¨§ËÓ5úţ¨Édšş9Ő¦ź˘¨ÉŻ&sN2~eĽűXw˙™~óvsäzî&ŁąqsŹĽ7˘¨Š˝Ń ”{ëEO…/V‡¦j)ýrřěóxŢEĺT‹óĐ4›-ZÝ×ú"›s6«n˘Ď ß\ö­ĺG“âĺܵ–~ÉŁŘÁjűäß‘~,›_ŔÚ˙ŠŕŚ„Bhm„ÍŞĘ—P蠋Ų°$ŕ:ŕŇfçűÎř@’$~ĚÉ›N§ÉkŢĆ ˇŘ»`yÁ˝Ő'Đż[ľÜHŮ"Sá—)»Ž6ř­e9ĹŤV`á˙!„2°qj˙Äę¶ĘŤ¨núZl*Ľ>R66]x2ý´ńo-'HU k˙!„ĐŞŰP#Ä*¶ĘŤ€"»}­PNwţ‘ßAžłŽ˝ňÍł6*ľµ­ k˙!„ĐZŘhµbµÚĺĆäĎç©V%ëféűĎWĹ·¶e}+ÜÁ6B!´ę6ŕ¬Ţ$mŞ–R ›ú–@°yćý/CßZuĂ6B!´ę޸öjFĄłřČôqÁˇŤo!„ĐęZ߀üň¬ţ*@ŰT­€#m:Ř@!„VцXőOůrcŞŇÔŇőC«IßB!„ĐZŰ1«ĄÜ}ŞRţţVm| Ck”!„BÄş×ţ×ôĽÄ>X{@hC©(ŢBˇĺY߀µX|_Oż@ YëÓŇ4Ô{`M/Š*­ď´O?ÓşB!´r}§}–¦!)îKCĎâ@ßéľu-B(Wßißz!„BŐ p ŔZG „*…ż•!„ZúÜ!„Bˇ*§Ź(° N;Fˇ­ cQ–źŰć‚?ŻÍ^ËŁnĹöX„ke"„Ňŕ‡ÂňŕsŰ\đ絹źWÁ t ¦¦·Ë̱Ą÷@!„BU#?^Ç Â„B!„¶1!„Bmd¤›żŘ Ŕq€ĽĹÄKÇ „B!´‘őż5h°aN˙[ϲ0M~UK) Đ4€6¨Ř€,§Ćďn;änkwwéNý5µĽBČrz·ŁmyyBˇ­‰| ÷źY¬â´r—ůyZŃ'oîÇý”,§wďi-–^UŐŕ'ˇśÝÇ˝7¦ôi^±·&˙šę:î-ł[Gţ_ňî|şĚ‡¦Ą,ř)ż0?ëÍkakË jFĄł=˙eŚę¨ÉëařrjđÂČřĄŃŐ˙!„B¨S%ţ5ĄÎ«T•śM2u´üX^Ł e?î?źy!ďS›ÝÁ\ÎŢÔ4˛´/9˙Bîc^Y–Űą€ÔbŔŃâü_#ŹIfł&nLuh—ĺtŰŻ:î|s+żń™„ô˝Ôű»žx<ÖÝÓëŹ0ogşŽ{{ÝcłYs3&SëŻ:śűśÉŮä±7Úťűś«ů×yಜÖnĐąŻ%ôÉeňĐň~Á”úźH߯=Ë®kĺ_îęç?¦5}2Ć &˙á[Ó2c¦nFŮł?éÁ3g¬/˛·§cĂFĆ>}÷"ůÓs{:ć»02öAúŢęűMoK‹]–jiq ] >zś6og®~qîu`í!„2Đ~ŔŮ}˛ż}żSřłŘ{â„Öč{Ű×÷ëň!;ňîGţsPč“ň>µüŢSĹú§nF­/.i!ä_(|y´­˝K«úE9éÜęyÓóč‘”ü.éŘëPçÓĹŠ1pş·˙Ë@OěßÖź[cńxű>gęŻ)[µ@™ĎűŐyŐńšÍ˙Ż˝«ô\7 ík7(ËéĐ'—É»Ęů)s~"u-y>mđÓĎż\SŁÍŕÇ´ŽHżA-G`éó©ly^m;ä–eYťW'ŻŹ€ŞŞ‰ż$űžNI¤ ’ÉdđăËiU Čó2IöŕÁ–;8÷9Ż^› éŰ8#źOôüÚůrbôB`uď!„Ş2&cŢnů0čÜëxúąťű!Ű}›|ňćjśaB>î!łečĚ€vĽŕ…Šißďě{{¨çMOäĆ”ó—ŞTÝyrŠÁî`ĄÇ˛<ŻĆg˝ż96őőm‹Ůb}‰…ÚB5 ¨…––ęŮ««ŔĎ»Á˘żÔŁ0¨kĚ/*x9Ú\ôµý bF> /_öźŞ–´ű3ŕíż2f}‘M}/ué6¸Ľű`»«ł›ßĹ3&†}Ńh!„Bŕ:Đîým˙­ŻľX^öÜOíB´Ź{B–Ó‰‹±ŮlH$'nL†‡JĂţŞ-z3JŐBSŁ}čbĐl1Ű› &–ĺ´©ş¦ ä?đňo°dĘŐ­küĐ&˘ß Ä*@z˝żî‰ÝRREY_˛j‘ţÉ٤šQŐŚjŮn€‰Ďł=ýEíرăöt ¦ľ^\Ŕdbřź[űŢöuě\˝›B!„ŞVKłý[ቯ#r>dí»řüZĘśOíŠ.]äB´Ş®9´ďw_€ś)"‹ŃÔh~˛5Ú ,fËÄŤ©¦×ř•—ąj|řER.ů‰,Ż®UěrĹ~LĺĚšşíkĐ8>xkŇÇT˛p-xŢpŹĽ€Ŕ˙Ô×Sm‡Ü­żr]ľ¦(Ş÷×'Úuutv®Uř˝/đŢHG§[–—,YĐ~ŔpîÍŽ^•żÜB!„Ŕ˙˙öîź'Š ŽĂř—dH~“P,ť÷@)–JÎNŃÄ\B!ťv\lD­(©Ś­Ňhc˘…‰­Ť‘ :ń@ç&;Ĺ»w.ÜqŔĺvy>ĹäáOîČ Éβ7ËňĘęŢŹ˝őgkÝO8ň;jź÷°Ű˙Df¶tďîâVľë´¬ui˙×~ď^@GçčŹ!©ą6o7óît:333'}óő4p–űőĎȱµVĎđŮřtC¦é*(ź°ú˘ĽÚźČoÚXŘüţ¶řůúm»˙×eĽŢl˝1¬?m_čłF0›6Ë›çţĂAˇxÝŞĄöóUłµÖ©ó5›6_żÚdőLůu[\Ű>ŘÝÔk_Â^^YőNď¸+0Ŕ¸†k­ź{;¬ţ‡+ď8Ç˙—S÷!`d¬µĆĺćüť±źT\ÄcžĺaGÝ ‚Ę«ýsÜ@•Wű\jî”=Ď_n\¸’8(چ׭ZŻj8_ůť-Ç«*Źy–‡-ďp ň]–×…ŃđşU óU-Ě×ĚY–É{‰=@í…|ń—˙î€ů4}±u`ÎB”ś9““Š«3Jĺ…ýü\ŞÉbů_\H¦”$Ó6ĺo$ŢLÉ”ĺď2ór2š¦iš¦iš¦+×’ś…äz—zoúŁN' ! 1Kś—dΛóRfÝiš¦iš¦iš®FççNŠA2ő6;Mä[†›Źľ“śĽ™Ir ±řŽü:B4MÓ4MÓ4MWŁ‹1„,*D™´ýˇ%izîɿŠgĹž µnIDAT˘_ňÎ$eůő‚(iš¦iš¦éJ´w–)xŮďL Q;źZ’i»8}ř1Ź€°I ¦bÜůś_螨˝FÚžHn=6YLęž"-é¤/Ń4MÓ4MÓ4}…űÄŻţŞíN>=2NIEND®B`‚fox1.6-1.6.57/doc/screenshots/emso_screen_small.jpg000066400000000000000000000410771326741342000221470ustar00rootroot00000000000000˙Ř˙ŕJFIF,,˙ŰC  !"$"$˙ŰC˙Âü,"˙Ä˙Ä˙Ú q],Ţľ8É´ŽY“‡PÜÖGť<¦N c:©5sxj`Íŕ`Íŕ`Íŕ`Íŕ`Íŕ`Íŕ`Íŕ`Íŕ`Íŕ`Íŕ`Íŕ`Íŕ,ěžüŢő¶]űŤř hŕ‡¨˙ľ§„ľś¬6%Á`W‰]Řń\"ů_ á §§éÄTÁM^š“,“,lkúseŠ;%ł %Ś#$*2@É'k]‹Ű3÷©?yŇ2+';8­ř!ëŔ—®c_‡úB|SĎľ!ęçđ¨>ű-~}>đŃÝM´ľN™ö¸zjW’Ë Í×X×b˝/’î7ă+öžńaç+xWt÷±^ď}ž€]Ą\J•Ącn2·łJÜWľ‰¶ŁzĺÎ{Cž›´°Ą·ą3uÖ5ŘŻM Ű—•véž÷ßÁŕľž§éŕzxŐZWDq]ĺťjJüęÍä^Öq7/>szLüŐ»qÍ`şëě[)krńyÓ3ëŘóš‡Ć g›O „{NŚYµ O[@ĆÜ]$D–’ť¦SuIŃ·+žĽ×q6őĎśî‹;7xÔÜ€›®±®Ĺ~h¦Ü˝çÄ őâ,;ž.ł™”6í•íy=<÷4*m«b9l9ćtçnQŇ#që‰Éy÷KłVSPŮXŕfë¬k±[c‰·.«ě`)`ťhĐA:šq|zł±óĺŐ«ÔÎĚYŠ6ŃQo],-;_OS:–zÝS9źkCŐlúóĄ4Î-\÷nşĆ·ćgRâŞŇ»¬R9•çtv©ď1AęË>%ç–ÝMXÝÍ—©M5=uŤd¶~FŹJYpVŮű¬TÎyék6rÂËPÍçtY<_fŞ Y©oĽę_Ă'T—,AéĚ>3Ď›SĎĚě÷×Bô›B¨6 ‚~а»(ťuÝŐË01`Ľţ‚LŘ»m»1nh¤ÎóţhĽL%ĺ»+ťĄÝŔĹ7şŞ).=JbäZbä)‹¦.BąYYťăśö‡;7tâĚÜ€›efóVifu:ďŽĎzç˛.â”°÷Ď@efSĚî‡?6ôŢżrnHćÍIčśÔ;źŇűěJI‚iˇFVe9Ďč2 iÜŞnĺ % ÜđIš9Phö9â˛ô“}€rçŢN~sôŞ=Ě&ŽÍŞÓ{‡“Ď˝©—î´ćt^MaÖëRIä·î¸ Ţóá 3á 3á 3á 3á 3á 3á 3áQÎj?W-Á‡#rarararasć7­Á‡ Á‡ Á‡ ż¸r76übĂOŢT5>ĺCsĆ$6 ĺĂ[Ö@?˙Ä.2 !341"$0#@%AB˙Úŕߨź¸ÚPę&]ÄŠD븑K¨•K¨™wK¸ÚV:‘Z]Ě«ą•w2®ćUÜĘ»™Ws*îe]Ě«ą•w2®ćUÜĘ»™Ws*îe]Ě«ą•w2®ćUÜĘ»™Ws*îe]Ě«ą•5âŔ4ŚŁ$hqÖ(°!űU–G¬tG7ś†Ójł†E‡QaÔXuE‡QaÔXuE‡QaÔXuE‡QaÔXuE‡QaÔXuE‡QaÔXuE‡QHű óŃFÖëQvu§é˙Ť®’öZ~ş-‹E˘Ńh´Z-‹E˘Ńh´Z-‹E˘Ńh´Z-Z+l5ö^ËŮ9Ňs“šű/eě˝—˛g“ÍĚ8łŮ, k”r®M}2»(:ä×Ó&şĘsä26Ś´eŁ)8âűăĚkQ2N˛N˛N˛N˛Nš$zúNÚg`F[vAl‚ٲ dČ-[ ş»’2ŰĽĆ+ÖbKKKKK·‰vń.Ţ%ŰÄ»x–ÖÖÖÓôŕ»ő“pľuť'zŢău Ňî=Mw¦»ŹSU~5ćńŚÄČp„gĹ˙Ł«řCíU]ŠălŘŻćqÇ?sf3EďčˇĘąW*ĺ\«•r®UĘ«B?QöAĹA𺯡ŁÂŞ|7n4VÚnžu†Jˇ¬@’őu}«[5 ®‡Lŕj×ë>¶čXˇ”.˝]Ý®‡nutŔĐô×}¦•°E[Ó}?h–L1ŃŹO„Ńý„!biÇ'%˝Ł%——««řCíXß¶łĎŽĂ;ż#ľČ®8-±Ódtă‚ٲ)™›Ô´Śŕ «^öAíf÷Óü]U>xş¦îó©Gú:ż„>Ő¶Ö5~2+lÜ˙ý˙oő†[JK±‹™őę1´Ůf, HżaTřeâęŁ? KH 9Ćpőu}«rh¬šBvŐX¬#;@lŁEý—·éě˝—˛ö^ËŰôŐUű ©Éňö´,Űn;vüUO†^.¨ěä˛hł3zşż„>ŐŽMµ÷ěšź6I‹´ą&Y&Y6X°˛,,“.{ ë$Ë$ë$Ú=‚ŞR—Ëiúńý¬uVŽ—ľ˛©đËĹŐw l?_Wđ‡ÚąÉŞł0ć¦8=ŔF/"B.FaEOňŢÍÚů›eź·ů“ŃWě'QÍ_äŕŇŢĹ.8ćHÎ"Ëúzż„>Őť“jÚ0ćH+ rq5šß!ž»efÂłËmI&Ť9ľŻáh­ŠËŤł¦ł¦dęľĺ-rk|…÷ł¬Ąšn&’śöÇtb޸ࣳ©VŻ'Ĭ±+,J˲Ĭ±+*ź^ÖÇ cţSas˙×iX5_×Őü/}ŹE/Üök»r$vq™Úaµ$á°îÁ·®Âh=Ěú˛Ő–¬µe«-YjËVZ˛Ő•OŻ?W ‰TîR÷Á™›×Őü:ŹP9;ÖŚa‰)u{c `Î$íËö©±.r)öĐęŤhÜ‹‘FNµZ­V«UŞŐjµZ­UOŻ/ĂŞ/' Ť_Wđi†Í(2sS®yƨbŘÂOXNŃéő#Ľż¨îrSŚcý_ĂI°^rC#92ɬÖ@5‘aöĚöČD#ýő>ĽżŞ4˘J±×Őü›‹aPÇţLp&™0DÉŕ%ĆĂ Ścţúź^_‡T¬Ô…vľÁXeęę‘,ÓÎúbĺÁ¦(´i‰ťë ßU„)ˇOëž/1ĚF˿ѭNßdµ§üs§–•ţa.a.Q&(Ýo‚ßŐ,Îi6;Ę[c˝ťĺ-!5Ř\EÜő̤Ľ`ÎŃţđĹ÷>RţJëc™ŤYÍĹîŻBe…NfŹşŹçôĹ‹ rެĘë.˛k5Yw®â5ÜF»×qî#]Äk¸Ťw®â5ÜF»×qî#]Äk¸Ťw®â5ÜF»Ôܬń‘^{le±–Ć[le±–Ć[leµ–Ć[le±–Ć[le±–Ć[vĆ[le±¶’CSé.Vwće#ɡcÚhÉ›S'ݰ{¤Äłc“&Ęɲ˛l¬›+&Ęɲ˛l¬›+&Ęɲ˛l¬›+&Ęɲ˛l¬›+&Ęɲ˛l¬›+&Ęɰ˛l¬›+&Ęɰ˛l¬›+&Ęɲ˛l¬›+&Ęɲ˛l¬›+&Ę˙Ä&1Q 0@!2AB‘˙Ú?«-ʲU–ĺYnR÷)Ërś÷)Ďrś÷)Ďrś÷)Ďrś÷)Ďrś÷)Ďrś÷)Ďrś÷0Mjü $‘¶—°şç­ű•7ö> N$Ë–.äÔwř$5Ě?'ă’ÓŔĂăţ‹áŢÓŁ ’ĹźĎéyFzvc§FLô叩A /n毭uĘ‚Fńú$’I$“Éiá­ˇp’ ‚ ‚ ‚ ‚.EČą"ä\‹‘r.EČą"ä\‹‘r.EČą˙Ä'R0AQ !1ń"@B˙Ú?•mĐż2ŚItbKŁ>e ţI¶ń&ÚÄ›km¬I¶±&ÚÄ›km¬I¶±&ÚÄ›km¬I¶±&ÚÄ«ŮOŹzě0ĆýŰŚ-´Dwúa†ęź I§U8’©ÇE†r¦ŘđÝĘl'ôWé4é:F:FQMô誯H˘Ąjžj*Ą»TßMĽ‰ü“đZVžŐBŁ} wÇÚyüż}$ö=-ű ˝ŰŚ0Ă(Ę0Ă 0Ă Üš«ÜšŞ3Ś˝‰­MŐ·ĺůuÔŚuGPŠ8ăŽ8ăŽ8ăŽDUÜ„Ľ—’ňB^HUrB^HkÉ y!/$5䄼—’ňC^HkÉ y!Ż$5ä˙ÄE!13‘"2AQq’ 4arˇÁ#0B‚$@CRb±Ńsá˘âDSc“Âđ˙Ú?‰“XÖ:"C˛[S 7=Ăâ’ü_^Ĺ~7ŠŇĎxŻÇćŞĎ`Q–wżĹ~7ŠŕéiWµ^żzüUëńWŻĹ^żzüUëńWŻĹ^żzüUëńWŻĹ^żzüUëńWŻĹ^żzüUëńWŻĹ^żzüUëńWŻĹ^żzüPwŞAyq6´"}R3Ü ¬Ť§€SĚÂ5®Łţ•K3 ć$ş—úU,Ä7!ö/g’†K{Sš2Fľ[€AާOa†UČUČUČUČUČUČUČUČUČUČUČUČUČUČUČUČUČUČUČUČUČUČUČUČUČUČÉČT­léĘHAk8Őв´&$~˙9 ďS˘'żˇs1ĹK0Jg6ďé< ë!ś›N*ÓRŇź!HöŻ‹ŚŠť#R“•t‚™wZÇ„©Ą1TÔŘf:9Ő›Ön÷Rآ©0ČÍZ­V«UަŐŮm©šL_‰´&Đl#UhçˇĂ{«pZŁŞ0ZŁŞÜ«pZ­Áj·ěĹQŻEL‰ĽYŔˇC:ęě9ć(;¦µââµâbŻ"âµââŻ"âµââµâbµââµâbŻ"âŻ"âŻbó+ŘĽĘö/2™|Bx¬­ŤË"C‰ ĐťŞ¬·(ęBŽYheQ]b2ë—XŚ›ÁśNÚÉłďcá¶D´UżÍKÖI,;Jp>áýŐőůŮ87KiPŽpU­*é-wĄ8g*ŞZN«ş­q; ¬ý6Żj׹ݍWQ0WQ0WQ0WQ0WQ0WQ0WQ0WQ0WQ0YAt0t…ˇ]3•:ŚF‹)XšöÁ"'b¸ÉđEͧb¸ÉđMŕ™ 5M± śţ_ĘŚN&îĘĽ•3Ć}Šm„ZvČ Đ8Ž›ű«ęň)Ąó•+FĹŤ)<ččÍiMµNŶ[ä´I5NÄHĚţ’śúŔmł ŃšKšŢĹD8Ď‚.¬4[RFgô•NáŇĘIŘď$&űDě*,Ą[Z›23Fś|ëv{‡÷WŐäSFs6iTT:zVüâő¬Ń–ŞľřuT©OŢeNÜgŕ†3m% ÷Äžčp˘Äkš+hÝ4ç3@>†đE(µÍĐř¶ ":“·ű‡÷WŐäSG–éU%‰Ąä‡IÔ¨¨µ§ä(ąŤ“«ÔÜ>JtY. a¬?%Xe˛@QekQ¸-FൂÔn Q¸-Fಎđôł1桝Ńl!kťW"ůJ“'-ɧ±7‚(!śŁG6l©5°çGdýĂű«ęň)žÎž– Ťěůz)JµűŠşT© Ş'łą™m©NGŞqRdŰÁH4ďµR`Ů.–UFŮů!Eŕhř§8‘v?tăůt°Y?÷?ő*&b#×ÖZćO Ô8‘r€ĐCŃ ĽA #ćÍT憅Ó»Ü?şľŻ"™B n•sÚˇMÔ´­ů!ĹJF7FõEźýO%S*Ąl”N>HćšŇÔ=›;Qhp*¶ O§”w‡ˇÝŔ˘ŇVMý˛ďŰŃGň¸ŹŢ©R*ˇąš’ŮV†rT¶ËÜ?şľŻ"b‡kU%6m+8­6šnfŁűŠöZbĄŹ’0ŰÝ%KÖ-š.vW0© ´Ô*ěMŠü´ČÝŕËřRľ†Tdg䄣‘Ł$ęţ¤ˇţdx˙ŹDFźĎ4Ţ ŔşŹjd&iÉÓěźYsk¬M;íŻć±HEÎ|úoȦćX]sPłŤ u+>Hq@¶„«*4íÎ!8S4†’‰ÇÉ P\_ů€@ŚťÚ{%ąW’™TAHdłk‘'#mFÔYęϢµ:ëDJ^śŁĽ=óopseR–b/‡ňžěÔRIŞĘ†*Yłů*›!˝µJŔ›Á:“i ʦ&ŮÖlěFś’ Ń-ńHÍ Ü7 UYÓu}^E0ş- ;‹© ŰňTiIQvU'ď%Eţç’pˇIDăä©·6>i9Ť5H­hb»QŁ´˘ŮĂ虪ËfŤ3>†QŢ—NŤš*ÉÄ’´OĂѢ*ě¶Ô'¤g)ş¤rxt¶Łť†î_Ý_W‘@fł˛8(Z4$l܆µ\:+€ŘŁqiH¸HKl”N>IÔ˘=Šl7FqĄ"Ů•DÇ$H¬«Č„ Ö*ň—:ÍST3®¶Ť{U \C«±VQ–ĎDyŐ7-`µ‚Ö X-`µ‚jśĺ?Ů2~‹Ú%Šë†{Tť8ďVŽ›ű©Í‘Rh2î˙•ţßňżŮţSść9ÄüĽÔGoU@HiIDăä¨śšŁ®‰ ˛VG35VF×nŞHŹQŇŞŞ;ŐY(b“á+*ZˇL4As °“Ř®!ŕ®!ŕ®!ŕ®!ŕ®!ŕ®!ŕšx›TÚ4&ß…{Fé§2Ť–ˇl=7÷Qčż˝äýa RŐ¤˘qňOˇeG±7í"5Ö@ŕŞĘdÝÓMĄ• ·'N4ÉÜŤ' UŞŐjµZ­V«UŞÔÔPyf—&ĽŃ™â©>aÜŞ7÷P`tÄíSs_dęrk[Nł+ÉŽ5ň•!;ľlě^­D‡VµĽæŚ0×6[䵼ż‚·Ţ5t\ÝiŻjé»Ü?ş†r m©fâH~”ĐDçjĄqRCаâ¬8Şm„·­¸«*“!žĹaĹXqVU‡aĹXqVU‡aĹXqVU‡aĹXqME)˝˛ÍŐ&ËÍJ© ţáýÔźl'[3ąKú„¦ýĄŻpGŰ´n©iGä«Ę*2‹FµÖ+Ů‚˝ňű‹QA ă›3Óš¬ 7{‡÷P"^éíSő(S=¨}™ćڞ}»Ö”Źš® @âťA˘Ú•ÓJ»*ţâÔPR` ĐÚŮLŁq=•í3T;:oîˇÁä٢©K)­3F,Ű9L#&D2ěSÍÄÁU&č“'IO4≠úżJ&[e÷˘‚m*-ł)đŘć-uĚÎ^áýÔ#ćÇ?ęÓ~ÖÇJsŐó1UFf*B4>eYŰ%2jŕŻ[Vâ©0Ě}Á¨ ys˝™AĐáФ=Ăű¨BcŰú·ÍKÔŕČ&“ÎJé•ö*ˇ·T6ŕ«kmZ¬R b“@î E “bÂkĂ )čÖ†s(€¶OTaƆó¸;¦ć˛ę¶hC‰ îÍŞŤ ¦¤É60&u’ŚßĎő)ţe9ż™N˝jKâĹ6sqj-k‹Nő úÁ˘ŹňTW9<śI‹#j1’˙ćNŤ°!·6[Ł{•ë9•ă1WŚĹk·¬ÜVłqTaHŐZ ĎfŤł@QlűŞ‘ËZ[Á˙Ä!Šę©Hĺíqŕ«Ęgô˘sÖşj¬ĄĘ^˛GlĚýÁŻ«lűJ«(…)íCí°LÍP{Wµtś ¸­u&H™'2+¬:'xZëĺĐ -cŚŤgb˙—Ä+`bżVc}Şň2Ľ…ĚŻ!s+Č\Ęň2Ľ…ĚŻ!s+Č\Ęň2Ľ…ĚŻ!s+Č\Ęň2Ľ…ĚŻ!s+Č\Ęň2Ľ…ĚŻ!s+Č\ËB0€vN@â¬÷v+ŠĹb±X¬V+6+ŠÄjF‹fv.­_(Ŕâ‡ŮçVôɨŽ*Ä*C7 ;zęţ)®k;”?4éFxŻaWń9•üNe™_ÄćWń9•üNe™_ÄćWń9•üNe™_ÄćWń9•üNe™_ÄćWń9•üNe™_ÄćWń9•üLUüNe™_ÄćWń1Wń9•üNe™_ÄćWń9•üLUüNe™_ÄćWń9•üNe˙Ä)!1AQa±Áńq‘ˇŃđ0á @˙Ú?!fÉ!Ôˇ6Aăĺ(6>PˇŢ ĽŇˇŹ¶6††Čŕ‚3}\Żx‹]V®?łéVđšM×bťË;–w,îYÜłągrÎĺťË;–w,îYÜłągrÎĺťË;–w,îYÜłągrÎĺťË;– Ń`ç…ĂѢ°?h›_d [AQ` ‹€™ŻÄUd®ĎÓ§â"î$€€ä^ÂG(-á ăź‘‘ ÁŘrźFé>ŤŇ}¤ú7Iôn“čÝ'ŃşOŁtźFé>ŤŇ}¤ú7Iôn“čÝ'ŃşOŁtźFé>ŤŇ}¤ú7Iôn“čÝ'ŃşOŁtźFé>ŤŇŚc·"`€f¸jˇ^@íS,f¦ EDr˛ \@­ Áą>†Ń6‰´M˘mh›DÚ&Ń6‰´M˘mh›DÚ&Ń6‰´M˘mh›DÚ&Ń6‰´¦yâsröyFú:JxÎf«đ{ŞlÉ'ÂOlĚäÉ=0bßś)đ~ŕţŽĺäjX Ô#pKl[ŠczăĘg[˝(Ulş45‚?šq ň€^ ü`ihb˝á$‘‘Ă‚ĚĂĐbô#ŕÝ$9˙ áŔ&ˇžפ%¬+ć˝`˙Ţ_YśÄPąÖňü{SÎ\Šb"MĐĘv+x ‡6©[K@ Ň ţŁąyY ¤¤%@Ľ BZ€: aG{ ü3’a6襻¬Ś íO’ŔvŔ”čZ`ČČ1´@ |čž`ő‡ňz‘{O.ačńĚĚž›Ň Q,Ľ\o`±Ä_Łąyü”7F €!‘Žm0đáB( Ťq§“뼦hŮU5Ŕ LaĆPć“~Y=‹1 ‡‘ńD¨D"W|yÎźŹxćfOąďŇ A’:S'XSŔ xóú;—_€˘Çdî˘ŇĐ@ÚŮH " IቀH÷G¸F7Źt{ŁÜ#ÝááŢ&óí¶ü+eK÷ě >PŹÉpŽ(ť’s{J÷,üżőĚĎa9˝"—)-Ş‘ÄF ,@±€ýËČ .k )ĆIů“:!n IËyg XuL6łťŇˇťQ#[ľ`“ŹżCá‰KÇx@U¸ŔgčâVíů«ÚcNňŔ/yśH˛Ä ʬL2#s‰bfF:žČ† Ĺ“Ôg؇ ˝ŕ+vžó#w  Ozćg°śŢĂDUtnŔ˛!?ÓÜĽś˛MňŁ(!HZ¦>20†»Ť›;#0č–<’˝¸d /j‘1€„‚-3´!!.ü)Ř“±'bNÄť‰€€äE(Q@÷Ęů®°˘€©G¸+&’Úq4 ÷Žf{ąďŇ „„XeV8ź§ąyÔ)řĺŞßP• ‘č\ H„ ¸ ~B$P-ŤW(x»FÔ}aJĐd@ ŔžŞP>‰ŮožBĐ’6BĺP)žźčD P@€‡đ”@PqA§šĽĎ¤'磓dT śĐ…RTł7=㙞ÂsúBX6„IČ×ôťËČ  —†ŚfÔ/TÇÆ@=gßÖń­2Ěů!¨«ö®I€”™ľ2‘Ôë#ű Ć*!|Í„Ţ+X çë¶Ž6NńšČÁí.]€u†YŘţ”÷®f{(É ‚ě u=fH^Sô÷/$•_Ş3UůŦ>p@M ‚ €\„)Č嵉ě\‘ÇH ˇ/î8q&Rč€B8Óx˛^´R%Zż7?)kč×ř}AA0jŽóĽH‚ŠĹ -D$Ny& ×Ě ď\ĚS:ňM۸.–O´Źë)ě# ą@?0ÝżGrňq6ŔPŠĐiiŹ… ´6.AŰďőň–ÝÖ+3Ř9#±â¨X=”f'©ßśޡ+ć0DĐ"Ž’şĂM.(†ŇPÄ8#1ń‰żçď¶üŕ)e˘ ÜÄV ŁŃ¦-yśiâúđEź)›Ö{Ç3&ÂÜs‰<"8ߤW0V‹TŘÍýó‚Rä˘ďôw/Â,á\@\üV‰XäZ—d•MźQ·kňL7SŮ {$-ÔZ-٬@ĎĘ^7Ňa Ů B0J űPQVj—öWm‹ĂyĄ­D~~űoĆiv= ¬+‹F ¸AEť‹÷ürąhkô…˘Bf]î±pSM$[D?Gr2=Âŕ‘8,¤ľĂ @Eë5ŞÄË‹‚jBÁÉ,\ 4¨GPXi Ďd.ÇŁ v@Ě@ ŘĘ˝!˛D@wŠö„¬E¶!Ňg‡h+0­¸:üł žµţú""9ŽpŃ“k+) 4Ŕ®đ0®ˇ÷^P’Ě`ĎŹčćŞ$ş„Üo ĆR––pO¦x'Ń!Č(Ä•5#ł 3Ř9"-TšűĽDtż]—˛! dŕ3Ľ<1(ńŽň¤ušÇś>ĹCćoÂb¨‚‘†Iť›;6vlěŮŮłłg;Î@Nh č™ĆŞ˘9e+ŕF µ ßű"9,ú;Ű˙’ !ăđS0kÁ52C¦y2+  •J+¸Űß$bo'śű@1Hč;Á.`%Ś— ŔNp“„ś$á' 8IÂNsĽŕŔ FŹa«LT0G@ŮÂ1 &0đý Lb A,…D­“l„ +RÓ ĆH“EÖ5Mf‡Bb‚©šxë’ÔaťŹ9ăĆAćfOţwśöSźŇ8ZdU  „Ż `ć·ý/ÂMŤ‰%Ő+ix%Ž:Jý˛ÍF<ÜfÚ‡b @€°d ĺX2RđľU4“‘'Ý*Ŕ»Ů4čěH‘"D‰$H‘"DQ¨Ôj5ŤFŁQ¨Ôj5ŤFŁQ¨˙Ä&1 !aA0Q±áđq‘Áń˙Ú?L›v2ĘJžá«ŕů)WżŤ¶Űm¶ŰĐŤ7^­ô„!BtŘšMéBt$¤a_ż±AĘŤqÇßACľ‚b©~ú,NéY}şż‚ŻkK–-ËťXÁ8V(<±éY}j…Őđѱ±ĺŹJËѱ˛ŃT3´î,aĺŹ:V_U‚Ýź¬&•?#vźăD2,F<˝K/Ş(Hb+?ŁÖćt9´T©Qĺ©e•Ós‰ý-U#i}zŚhÔfQq”Ą+LĐ›o}=Ů<…*!*¶Ř7]ד”¨‚čśJîyL˘Ë,˛Ë2cÓ—‹“śĽ\™¶CR­hËĹov_6J2ěťänI$’I$’I$™Ý‡ˇłĂ8Çác„pÎ1Ć8Çăc˙Ä)!1AaQđq‘ˇ±ÁŃń á0@˙Ú?øĄŠČ ëw-ŹŠôŕŁa…m¬_5 -ďŚA+EĂ\řKP»žĚ^úë[K.š¸]m+Ź [€,W.yqĚŃ€µĐÉ—]s+KAoźâqÉSL¨^uŚĂW©ĘÎńűťă÷;ÇîwŹÜďąŢ?sĽ~çxýÎńűťă÷;ÇîwŹÜďąŢ?sĽ~çxýÎńűťă÷;ÇîwŹÜďąŢ?sĽ~çxýÎńűťă÷2I˛}«µYq —€X ě‰:!˘ďĄ|Ł2/´ĘÓZâÚ4p6bµ]ľśĂÖ @˛Ö¶É ÍĂUŘ X5Ś0ú·ëůH%vS\MDRšwé‰@Z.!»P, —šŇ…ă˙¬ůóçĎź>|ůóçĎź>|ůóçĎź>|ůń¦WE•a|OIš¬$šĘ]ćńµA@Ťe 4ĚU‡*?ě–…•ń)DÇDđí#T¦:WŃš‚…ŠH¸ š‚ęc2“Ť8S…8S…8S…8S…8S…8S…8S…8S…8S…8S…8S…8S…8S…/°±˘ŰËŻËĽíe~ďö-+GMş˙نLFp/•±dTP´7Ŕ7¦uŠ2+ę§4ň/Ý»őłş˙ŮRL«€XŘAjşđDőU%ÁD[î9„8r««P×’P_óë˘Ü^ kP ˘†čšžđfśşµ¬l$XŁE »ÓSx佇lj›ľN`"¬(lókŰKÖ^ŤŃeŞ˝°— .ćĐO‹“†‰°ŽŰXÓ4ŃĹ_-ěmĄË ďyÔáő?3‡ÔüÎSóN‘Jz B©©Ąč(tŻzs,ž…B-ÎLs¬ýV~«?UźŞĎŐfw*ŤI]Z0şĄ9!Ą«ug.3k˛×F…E‹ 15k[řA˙xO‚~Ą?Bź¦OÓgéłôŮs˘uۦÓ|®§ŕ¬§i`ż ZĄxuťÚ3¬z.€jS­$ĆđĂ&Ç1§±~d5ŇŃRišlGLşbŚ4Ď,[µÓ„°Ţ$č’Fpż @Fi8tGńʶbŞ’ęŔ]K·+˝kő‡Nm…XIĂ 0B‰vßWýNíüNýüNýüCdbá"rmEjS'&›Ćmą‚¤YŐÉĽ9m5ąAivÝčR16 O†źßµćhD ô¨ęla·ŹÄ{3˛Ś0 (ߥ֊c`ÇŽ|0é®—eQU3 —đ®aĐ6Ýyöđ1ˇŔk`Ązë·1’T ś†Cj÷ŤnËPŔĹY˝ĎĐ˙3ô?Ěýó?CüĎĐ˙3ô?Ěýó?CüĆŻ§ů¸r ®2Gł>!2‘HEŚľÄ^|b4—ž¸qKH %Şľ.ľrřŞÓ˛Jă@4@m@ę¦ć®Ż¨"’¬Ą /1…ľ©.°¶Ľ•¶ýn—4hçBÍM>rÜăK Ą×˛ą/űvĽÍ –š€ťŤO:›¤ČZ–Čhu˘(KĄŢ aŢ 5ěş« զѱ€č\Ô¨r¬ă­d#4K  ^LÝ´¸”L. ¸QNěÍÚ•«ĂŢ1)š-Óqâ ĚĹ-[E°5BIH[h "?ŐŇY1R%˘Úc©`W[¬ă–šĆ5…¦mEľI€ŠuĐSÉlłŁ›Z÷ŽÓ" 6 ];hz¨Ń_ÂĂ‹ŐgXĎ@2ő¶  ‹wŰ— sÄj„ŮMÓĆşëýű^f„ĘĐÚ­ tN˛¬Ř<†(«ŔCĘSn„]éWé((˘Ž•_AŽÓM Kc4Óĺlď0ßBdĽ—wÝĐôť?«%ÇH”šŐłDGOęéř°JŽŠ ˇ p¤ŃˇF8",n´ržNa(žJĆaţ˘#vLä_…‰üRŻ›ř†ńký%ئHŃMi×=bxśÇt»TŐŇ´ţýŻ3Bcŕ%®€nŐąé{‚t4?’v^°†bCjŽĄ[eť<)Fj]yĐąď=rĂOů:M .®­®ĐzaަP´Pcm& 0<űöĽÍ ‚ĂE‰(›˝QĆZ­ćY­EfÎC1%‰­ËŇmRž€­ wâ=7t†Ę)A»˛‡~K5/5źMĄőĄ-şjVűĚb(5ęŮYưJ•ŕ%XUçm›Ă ڍh]´ ¸€đk!Öů|!XÇl,§95xëĄÉ@JkŐɉÜP)h´~úÔlB°Ó}3Żw˘ˇ °^:ń¦aµ&ÄŠÍŢüK#ÚRh§9ç0xÂÚ8±ząň×hÂm†Ávt¬{ăń+!=µą¬”Ëôü˘â¸üB­xrŤŃ(ł8”E޵W=W„-uŻřvĽÍ ŤĚ)DW˘ćÝ@ ®›k¤ď˝a(Ňvĺ,éykĂŐ®´(ęToU9WŹZů…´n^µěÇC P3Áu^ +ŐNa¶ş5Ô-®¸Ź4×q;Űęw·Ôďo©ŢßQ«¶ôP2•U-Ę$G7"/ţ¤¶)©WÁÓ*hU[žS!;ćą?Ž^ăń7*˙h:2NRí‚ę´>"„脢Ţué˙×™ˇ0v*,Ú: Ĺd+R)čşx@ş`ń%˝¤p.5Ž!Ťrá­>âRćBł“ôĎx·:رoS}Hj%eŮ%wis+h˘ŕú6yMqß‚Ľ&eÜĄWĄCOčé±$á4č7ZŚ-Qo}Ţ]%Ć@Bü·ÁJŚ& Šńd™±ćÉRTZ‘ĽŰĽ„łO˘ÖdŰyč˝Ăâ,áé·´§^­z)>c[!+†ăţŻ3BcîŚĐ qzŢÄČŤőNŽwŁŻŻË9¶[xĄ Vl$Hh4\¬ş·ćŰ»±ÁŤćrăéu|+ÎöŤÍciÉŁš8Üé—:Haµqž!X©ń:ţ%Ć˙—Hë´Ćx ˨tťc˝©Ô+×ĆsqsťöWń Ü~&ł†˛Îŕ‘˘Ď+¨MÔ/fކ żđíyš* =FĘ(s¬ 5č¶ćďvwŢ°Ü±Ž…!{hűB† ş…- ÁO=6gá ş%bhńšł ÝP·Ví/ żJŽĐ˝ôęáňŠA ”XR…µ®ľÓQ‘¤sę–=hÝ9‡]Čö‚5çüşCÖp [RęťkDcGv¸X‹0€egśő‡˘ő•ŰľH %E˛>oř„đ‰iäL,ňõ@U^ŐńŹR·a}Ç>ČŞ0J ť‡J·Đ–µ đtŐĹŹ÷íyš,˘ăAb’ÓzëáčZčiOxi°sý•”®©wjŐÔDаs’ˇµVŞXâ˙†"!ë‹Q«şZ®y€˘ťFsµÁa–CKf˘S/ć-SR#`ƇŤÚh€<פ ă$·”V¸¶!±z” ×Uľ5ÚZ-Bť9˙=a¤tť“§ř ‘Ř°Ź¬ë”+m_¸‹†D*Ý’_ViXЇą(B˘Š6t§§ńÉäánż„%h€Ŕ@ŤŐ‘úUŰţI(Ău űo ˇÉÜeÎá× ŕA`ÝiÔâ­WűöĽÍ Ę4ĄĄĐ­*ŰĐ©@:Ş%˛áÓ7Ť˘“#ťK­®BĽ*Ş@Žéü܇LçĎřByÇĚiĂĐ*J^#02Ł×(2)Y«ř×sĎřbú<̆íLRĐľqúŁw\Řçě^]nÁ=ąÍQUěŘ™Ę.8+&˛aK¨f­f™ćt@ÉDµ’ĚÄ” ‚©îĘmzÁ˝©]acn˘š÷!ű+xP«S÷‘bźZaŻz~Ę~Ú~ÚĄ>h7´~ŚDR°ůçV1čŞÄ{ s¸™|fŃıVÝ^^@Ű"L-¨)x_(č9˘ßµć!”8Ši±ŽťĐI@Ŕ? +zám­zĂ ‚ŐÔ´„¨FúSY1ÄŮÁ«tM3ÍăŮ+tfFâŚkk&fŞŐWBíőń„•$69 G\c4· ±±°1cJ˝oL6Ü”Ů:+ĹQ̰µĐ°*ĚĽŮĺ–•Zź7ŚĹM1Źb9"ńbâťUţ˙}÷ß}íľYI ,—ÄÉĄ0Q4…Ť/ŮŚ’*.km®ˇ0±ËkRüę°đé2§˛ŁSyŃŃÔŻďÚó¤—ý3ŔYŢZt J)m±sŽ™Ű"óâŇĺĘĹô.4˘bęźX˛†JŔŞVíů¬T%H/Ě+M3+Śâ4 4jčpéqˇ¤kg@ UÄq/= őlb~ö~Ö~Ö~Ö~Ö~Ö~Ö~Ö~Ö~Â{o–l%.]ݨÖ(Ú…ëŔŔĐŽSŇ^…‚‡.đJî…~÷ië`˘ďC}ĺî‹y¬ÖF+`ĘX«UV{‘łďQ<¬Ţž;L Íj©ałs WŹ´˝á˛«š8ŕQż ćşJ—Łć k}äGőbEÚę–1ǬӅv7Ŕ`Uuźá×ţ‰$’I/mňĎ}ř™®G(l†gv+”ľ¦.,,áU‡đíy†vJ> [>˛ô¸XôňŰXMQQyY ľŽ%a’Ć•xâő˙‡kĚł,"Ľ¦<˘ţg»8AËbů@Ą1˝ŐáO%Ą-›Ľâ­~ n`‚›Í7ÝÝ€ęăy=bŤ,7Ú§ť‘Ő¸@ŰŁ:7 Ł!ˇČőŽbަżř=·Ë=óâRě_†÷CA‹˝qŚéQIjŞ(2Ô˙‡kĚăó† íKHě’nśń—ݗ”Eˇ•ůĄ@ěJ"?/«­UXşů`ŕ1˛N—ěD< Âó‚4Ši‡ÂĽ"‘,ľ¤/¸zLÖ‡[ŻţmňĎ|ř‡j(riÖYîAYdĂz}EňXz]ĹCI‰.‡LžżÝđîG|-âX6™¬Őęxa$îf–—ĄăB›%†ľ"ýÇľfcŻ /u®V˘źD3¬˘K+ËŐe˙ŕ´j¸yĘ»™-ú!ٔĔA¦éÍCz"Ą2´˝ÚF¦5Ë;ŁWÁîÁ q‚pÍ|ÍH1}¬¶÷ťý÷, č'Üý3ó?LüËÍ“«pW˝ĄJX i ¦iÇFš•‚Šd3Đă]rćĐXçˇOh˛Ľ+P­T§Ťs(ŃńV&Şď"ĘřŚkÔ}b'­TI­ÚýM-t«Şď:üĹëX3µ¤şęőđÉŐ/źţ ’!R(‡B7 z:”iPńť+8‹.ü\ŤSÉ +÷`Ş t-)h_śV¶[ƨ{&ŤF9Č極ŕ…ŇÖć y𿉖¬Ľ'Đf‰›ŢŤ€[áFĚk{žđŃĹá§:ďÁ5#…lלH;ZŮ»»ťĺ÷;Ëîw—Üď/ąŢßsĽľçi}Îňűťĺ÷;Kîw—Üď/ąÚ_sĽľçy}ÎŇűťĺ÷;Ëîv—Üďo¸ĚWŘÁ^–ÄôˇŐ®8Č€íÉm;ągŇwÉŰ'ŇwÉŰ'ŇwÉ}Uhw78~“ľNů "ŢŚźěEr8BŘą€*b˘˝5u‰Ł Á˝v<ýµŤ!‘5x ó(Ä Ń×ć(hu Ň: ŠăĚBčFÜ®%2•U r+Ľ‘‚ČçLG´QpsŻ(ĚŤUăä(˘Š(˘Š(˘Š(˘Š(˘‹¤RŢDËéE*Rľ/řŁŚŇ¤6HĐŔ±Ąü0ĚR©˙Ůfox1.6-1.6.57/doc/screenshots/filedialog.png000066400000000000000000000330341326741342000205520ustar00rootroot00000000000000‰PNG  IHDR˙Fd4– IDATxśíÝO$Wžđ_,sĂÂn]†9ڎmM™¶–ÁôlVÔ’Ńf×<Č….›É”F…š=°:ˇ†–+Ł5`cú`Áj5¸i©[dÚ,íÜ]c‹©ť±Şí…Ý®˝r«µt ÷aŚ`0ÔźV>DGÖ‹—ďEĽń"âű"+3ţfü^ÄďĹ‹—Arô( ÖÖ ş/9zDß ÖÖ)I’¦×*öÓńˬ­Ó·˛|Üäú@MľĹ°{őF- ţů•÷—ŽgĎüA-Ëč‹/ö!¶’ü‰ŇÄ\ĄźŽ_^ţŹÄ öĹ_äŢ?űěł ­ÉŞlÝ|Z'Č{öĚH+ÂäODô˙ţďßŇ“ä %Ozňä =IJž<ˇ'O’ăĎ“ô}ňtř“'ůĎeÓ€›ôłäúĹ_ á€3ż!đÍ7ßţ}÷ť]ůě>»Q:Ý7ß|Sç÷h-6É#á€KŇ3˙ż˙ćé™ű÷Ö˙9ýü»ôŐO)yň„ľ˙­˙Óě˙gţŠÎîź}öŮe Ű"Ŕ“M[t A4Ů|TÖ[u~*—5řéŮď®:Xetć˙żî-Ç{ćw~o™ř‰ţ×_ßĆ™?@ÍDvQšeăđóŤc˛˘eެSŃô:ß V7ű?ú›ĹĘ4óWˇŮ YňłI‚üľ}/€6_ó˙űâä˙;‚źčťúÝE˙ ’?€‡|:{.kŇ×áÓ÷h Łf6ńď˙ĹŁ{źţéňý?ük4ű*»&ĎŽ`Ş ů?‘ţ}ö—˙ťîíýŮňłżüź˙•ö~ńÇ…Ó~óÍ“zľ@ˉ:Č•Ť«Ňăź˝g@ÓdëÂW‚ŠÖ×Çďŕ;ăýçşňŮźßţ/čđ`‰ď˝.ęŐ."Kü˛źő5I¶Ž˛•ÍĂ—ďĐÂkţěíw :‰¬lܢá˛{ čĚO÷˝É8E- g%ůW}_p§OÉŻOß jąäź>ŃŻž§úeÎ˙äǵ. /Ř'őžőĄĺ˙+gţŻŚ^¬gŤ צ·rďĄţ ›üzÉ güzÉ güzÉ g¤ŹôPuűÎ^eó~3z⻕ͿŹü%Ş,Č]‡u?˝˝Ńô*€"$˙.]nzZg1oz ’‰äčQÓ«Pżßţ-ŁÉ‚ŕ;ŽWŞ€äŻ!X[§ápHłŮ •č<Ýf{\*ë®3á&Ztjđůă_/˙˙Á‰ß¬tYHţОÄ?Ý$šţlFÁÚ:ˇeŔÖ™ps峪M¶Ěl9˙#ܤ‹Ž–Ëź.$Í.|˘˛ź‰ŢëúüńŻéĉŃăÇ҉?˘ĎXiÉ_Ăt:ĄŃhD4źS2ťÝ\VX¨¨9nR’%D,_ ş3Íăe’óĺd `2ˇĺ+_Ńh#źĎüm“® Ń|ůĎL>ďĉ ‡»®X%•{…¦É‚8ťN)Žc]ą’«,Ý›S°¶®]0™ Í˛ăGĄ‰ź}_ěđYâž.&ý“~f×!4KřeĂu—ăJą‹OřUrŢěĎŃ˙ügě´,Ѱě3•y”\Ý‚ś%ţ8Ž—źŤÇăe+@fş©v&_Ôo€˝śŔ/ŕšJ3?P®&öň >Qâ':>c¬˘@”žůWyö!şô’U°l?ŃN.!Ż&ô˛áÍ‘ĺ˘j®ů×­ökţ˛Šę°˘Ę…Ę{•ő’áf<ŃăÇż¤'ľGAR2Ňčµ·húîŰÂy±•ľß_qŕÇ• ¨BŮY¬Ý.źpČy@–ř—k«¸IÎgÂMšĄ“ôłěŐUŕL¸IŮ· çYtéE–đt*IrŢj¸š§gü™˛l×ü›T{ň7Ý@UO§2ž(ńg˛Ä˙řń/•×-“=vTť j˛ €ý/źř—źVÔ•%ţŚË ›řE}\'~[*—^˛řú4ÍŐ5~Îü+V×u1Ńr]Č&ń´E5¸4Ád (MŇǟ۞ůď/ć›…‰ą&‰y‚Ś(ńgëQĹ?Q°\˘)•ľfߡę*ťBMË,Îü+VçsąfřˇOÜďCzťýLŻůç–ȵ2¨T TȦŠ{ˤ?±řIˇúv7‰•ţT×Ăä×8ó×ds`(šÖ‡ß™†aH“É„Â0$"w‰ß´É?›M˙P'·űáj‚9NÎÇŻ«MÓ–K]ţÎßzVDTžř]-#›wn¶o~ý_ŻÂĄ7o:üéţgţ%lîfUT[*«IńU—/«ą–U.řÎyY%Ŕ4ńł×ůůkţ˘÷*ĂÚ'źh’¤ú3×ęNü"‰Ułu-.őtř«Îü ¨|AÝÚ“Ę0Ő—éőť"|%ŕúő›ĘËÍ‹˙_ô^u@»č˙Îß§ €o‰?0ZŹölo3fżŔ™Ǹş| R Ífx@QżÚ«?&TâýúÂ,ń‹ćçj{×u‡ż"¦żŔ™‡TŃoŔeK@źÔy€\ý)ˇ|Ž*żCŮń*K8ó^W1¨ë"6·Ć™‡Tľ gąĎÚ¦+ŹčmŰA9Ł› üÔl‡?ź·ĎNü&}öŮçZă»Ô«ä_${čö ŔT›;üŐˇĘGö–Aň/°żÓÁýMŻ@í|>c{HţoFo4˝ •@ň—8ď6˝ ­¦vAňk8aj—ßhz ^Hţ=äĐ3Hţ=äĐ3Hţ=äĐ3ĄżóďĘĂ=úŕÍčŤŇű.(ÝäçÂĄËNVŞŁú\ĺ;üáiu~S}ťń5˙`mťFŻ˝µ|~=´QňÖÖi8Ňt“(9śQ°¶ŽJ@K?Řg:ťŇh4"šĎ)™ ‰În +¸\ĐN“˙xóř˙×· ‡EQ„X· bÜ}q÷•ĹXĆę©~Óé”â8¦Ń•+ąJŔŇ˝9kë(L-5™L–ŻÂÇÓáDéAŁ)EeL·üő­ĽşŚqVůw±ýSwšŢŹ«ŘţŞó4YvËăÎťRšĆęwţqÓ`0 ńxLăńFs"şÇô4<»IĂáĐfĐÉë[ůw†Ŕ‚ ××¶răě ‡rŕöc”‰jń1VeśüłÄÇńňł¬0ş8_ţM7 ý:@tŕĐ‘ő áËBö^wXŃ2DÓ‹^ů˙űÎ4Ʋí*‹űyŮöGLÝrµg˙łźóă•ý/¦RndĂŠĘŠl<™®—=ăäĎ'ţLÖ đüó?¤ńxLÁpFÉlHŁ×޲ZQhNDd—˛łÂäč‘đ`2¬lĽěŚ=óČĆËvě˛ůö…MŚůí\oŐxĘĆEL͹܏«Úľ˛e¨#ŠĘJŮq¨l=ÚPö˛«°:ó—yüř—tâÄ÷čńă_šÎpsÍ?«UmooŃö¶řö‚łŮ¬÷Í,mÁ&"R<3¸ł đbÜ}®cŚă·Ěbś˛ş˝/Źż j €6HĎt~3z<jîí€wźŰ5›CSVcĽżËFÎqšü3|% Îrźßꌓ‹ßř>_¶­/ëŃEMţţÝ·yw•h›Ü 4m%É?`řÇůM~ŔoĆÉ?X[§Ńkoˇ@Ë%˙`mť†Ă!M7‰’Ăn—Đ"Ć×ü§Ó)ŤF#˘ůś’Ůč즰€ëţíÄŢó{ňúęĎ7ů{‚GQ„X· bÜ}q÷•ĹXĆŞĂßt:Ą8ŽitĺJ®°to®}ç$–ĘřĎ‹ćzr8Ű‚FQä|ů&7ýpyÓ >ÜtÄeŚE?3Ů˙›Úć]-;®b\Çwr±Ś®Ć±ăÎťRšĆŞĂ_Ç4 h<Óx<¦Ńśî1ż1<»IĂáPi^üĂLž‹ěb*{ú;<‚Vě ç2ƶóa§w°wźésŚ“–řă8^~–UFçËżéfůťˇdµ+Ů˝ťË¦“ÍĚUů×*ÇÉŹ·Ľç„ä•˙żŹLc\´MEăŞĆ†ÎŹŁ[–PvÜ<Ć×fŰëĆE6ťNY“MÓć8ş`śüůÄźÉZžţ‡4Ź)ÎŇ{űżö–ŐŠŞČ*} `˛»GŮ$YkLŃ0ŐyŤË7%‹.%ee¦Ď-E61m[á2$1Tť^4Ő˛$›FeŢ]);¶ű1‘ý¶×‰KŮ>ŻŇĽßĹ8Ńą›ŁŐ™żL“Ź÷eŢć ú¦¨éPߢc;ťa®×ŁK\ƸJ&ńUťľëeÇ6Ć&ßŐ6^&ăw=Ž.8żÉO•‰ź­••5ůăšż[e×mč4çCuŞŚq¦©Xă„ ŐÔ~lwŞă4ů7yĆOÔŻë5M0íXR„oÚfUcß!·N8!HUcYlmöń&ËK×'˙0 i±X,ßŰ$~Ů)ú,ˇ..ľ}?€W©ę @Fµóť‹ůŁĽäUc“í]6 bč–ŃďüłÄ›c2™P†Vgü˘ €I-Ńv –Ć÷„˘(P~v4—˘_qČ*wEóĐ© ˘â(gcE1”Ť§s¦®ZÎú\vŞŠ±é>^kŐňBÔż8şQ’$ =<řvŻŢ WF/ćF¸}gŹ.\ş\şá‰®__˝~´˝˝•ööźMß}ŰéĘCuŇDz`PëAšPrtXőjCq÷!ĆÝÇÇx1§Óçč ľ›ďÚôťő%Ú˝zvßűŔÍ5˙¬·˝˝EŰŰâŰ Îf34Ű´[HńĚ ŕÎ*Ŕgq÷!ĆÝgă”Őí}yüĺQK´Az† ó›ŃăéĐśÖq÷!ĆÝ·ăýĹ\6rŽÓäźá+Áp–űü†8ubÜ}q÷‰b|p˙Ň´•$˙ €śßäüfśüµu˝ö:ńt î¨Đ}FÉ?X[§ápHÓM˘äp†@‹±űo°¶N‡‡‡txxű ű7@·_óźN§4ŤćsJfC˘ł›Ň;ňAű°÷üžĽľúóMţžŕQ!Ö-”%ű˝˝= ÖÖéúőëôő×_Ńőë×—źmllP°ö}ĸe°w_YŚe¬:üM§SŠăFW®ä*K÷ćÎ濾»3Ő'÷Ńą-hEFË`ă©Ű&Ę€l™*ʵ]FŐöööhcccĎŤ˙łKDD_Ńó4™Lhccööö”ć%ş#›IŚMář°ĘŐ~ěöíÂţV6Ć/ś;Ą4ŤU‡ż8Ži0Đx<¦ńxLŁ9Ýc~cxv“†ĂˇÍ" !eO˙b‡Aŕd'ęĘŽŘ&éÍą¶éćÍ›´sňKzůŰ-+đ/o|›vN~I7oޤíííŇřŕ!Mţib?†z™>§Á8ůg‰?ŽăĺgY`tqľü›nŞ?ŔCtmQtÝ×ëgűřO•GsŠÄR4ŤÉăCUĘYŮüUÖ…źźlţMĘÖůđđNś8‘~xv“˘›_RôĺÉ´"v“Nś8±ěP ŃkŃ8ě:¨ÄC4¬émŘ6.ăëjßRť^eÚ°żůĆ8ůó‰?“µ<˙üi<S0śĄ÷öí-éĽř3QáaĎ&P;­Wv÷(ÓGY|U¦+*ü.[–j9+[¶ĘzŠĘj6^vŕjňń˛YŇ˙ôÓOiooďřŚ˙ŢśNś8‘VÎn=ó]zůŰŃŢŢ}úé§ąŽ€,•}“G'˘őÇ#zőŘîÇDfű;\VöuŽmÜßę˘s7G«3ÝÇű–%s$űć5ęRŤ§J"qąÜ˘§ĚŮĚW4žeúćÍ›ôŐW_ŃĆĆFz¦ODô‡czyăŰôňĆ·‰žůC""Šľú~öłźQtó&ílŃ3ß%˘ŃW˙™˘›_ŇÖÖ]Ľx‘ŇtąîŔ őńy?FY¨—Ó;üŮ$~tňźiÇ_ śĺ%GŹh6›ŃÉ“'é믿¦­­-úŠÎR-(Š"úŠÎŇÖÖ}ýő×tňäIç‰?[Ĥ^ľîÇ( ő2NţaŇb±Xľ7MüĐ..:×ümçáBWĎH‚µô7ü;;;ôÉ'źĐĹ‹éćÍ›´µµE[[[tóćMşxń"}ňÉ'´łłłüÝ•ëSŸ°Ę× @ń­žQł?˙ÔľÉdBa'~ľ#FöŢŐď9Á^ţߊ˘@ůŮѢřęNÇO#V´,ťrĆĎ_Ô9I…ďeuccŢ˙}úňË/i6Kźľ™őüĎ’Âp8¤÷ßź666ś,SÖi¬h;ń۱¨l€śÍ~\ÄtW™ľKű›O"J’$ˇ‡ÓîŐôĘčĹÜ·ďěŃ…K—KwL"˘ë×W;looĄ˝ýçDÓwßvşňPťô ‘Ôz&”:\>vâ:*C‡‡‡ôĚ3Ď,÷msPŻʆş¦÷c¨ăýĹśNžŁřnnĽkÓ[tţŐ—h÷ę Ú}ď7ţř–Q%`6›UrÍÜc )8 ÖpŕhŃţxńâE:yňdá8ŕ?ěÇÝ'ŠńAü'JÓ:ííŻR €6H:ż=ž‰˘ÍĐśŢ%ŘŹ»o5Ćű‹ąläç?ő#Z­ĂYîsđ›qňaúĘ÷mďűúůŰ©űD1>¸˙@iÚJ’…Ŕ?Nçţ3NţÁÚ:Ť^{ żÇhŁäźÝtşI”Îđt-€1ľć?ťNi4Íç”̆Dg7 źöíÂ>ôcňúVáp"˘(Šë–AŚ»1ËXuř›N§Ç1Ť®\ÉU–îÍ+ą!~ŠTŹÜŔDć¶ QŐ´VćDŹěĺ˙w˝ťa.Ć×ĺ2ĆMď—mÚîurc¶ b,ĆĆř…s§”¦±ęđÇ1 ŹÇ4Źi4'˘{Ěo ĎnŇp8´YÄ öÖ PţŢßü;<»\[µyÝm¸Ś1öK?ąŚ1bë'Óç4'˙,ńÇqĽü,«Ś.ΗÓÍň‡4,ďŔÝ?ťďK ęaúüďŚ(žeĂŘxM'šFöžź/?ŽÎ2UĘuQů-Z~Lc¬ş˙– Syݞ}Ú¶ÝëdłËâQő>-[ÄŘŽqňç&kxţůŇx<¦`8Kďí˙Ú[…ó5Ăň˙ȆŁZŻěîQ6ÉAϲaüpŮtş;uY9r±LѸ˘ĺfăe3“ďă‚MŚůďeoéú)nű¶m÷:ŮîÇąy5¸O#Ćr:ws´:ó—1yĽ/şßŠšuéÄZe\×eÇĹ2U׉R]“\ĆX•ÉwvŃ4íÓvŻSU1®sźFŚÝp~““Ä/RÔ¤ő+»vX7¶Fnřcâíb §ÉßUâ'˘\łjm~0íXRÓfó-Ć,ÄŰ Ä,’†´X,–ď]&~ ‚?\8\ÄSµSPUş\&ëL˛í¨ŇqĚąŽq]ű4¸cô;¶cQZxÂ0t–řůšÎü›—>7:3ˇ(:~†t™˘xšĆZÔŮGôąJÇ!UEóÖ™—îrëbc–iĽ‹¶Ż,Ţ]Řîuj:ĆŞóDŚ«Q’$ =<řvŻŢ WF/ćF¸}gŹ.\ş\¸Ał€]żľzýh{{+íí?'šľű¶Ó•‡ę¤‰ôŔ Ö4ˇäč°ęŐňJŰ4q÷!ĆÝÇÇx1§Óçč ľ›ďÚôťő%Ú˝zvßűŔÍ5˙ě:Íöömo‹o/8›ÍЬÓla""Ĺ3€;«čž.•_ĸűăî3‹qĘęöľ<ţr€¨%Ú =CĐůÍčńtí=.Ó­ËQq÷!ĆÝ·ăýĹ\6rŽÓäźá+Áp–űü†8ÉueŰtĺ{€bÜ}˘Ü 4m%É?Âŕç7ůż'˙`mťFŻ˝Ő©NP}`”üµu‡4Ý$Jg¸%#@‹_óźN§4ŤćsJfC˘ł›Â ®ű·{ĎďÉë«?ßäď EbÝ2q÷!ĆÝWc«Óé”â8¦Ń•+ąJŔŇ˝yëo„"búťÚ¶-r8Ű‚FQ¤<_ŐíŕzU-ŰőĽŞRÔt¨Ăt;şO6ĽÎ˛ÄŹçKü]ŸŚî÷uŃíăön‚Ë›7u¦u±|~Ľ>Çžçü&?&‰ź­•Ů(jF2ibrµ^uĎ» e×m¨ĆĆőx®Ö«+ŞŚ±®¶ímQGŚUc×·ýË7N“żíżms ŰŚ$:Ă” «z˝šwL;–á›˙ęO…i™ił*blŞműG[Ôă˛ŘąÜOÁŚqňĂ‹Ĺň˝MâWÝąue× ]/OW[h¶_ż·ĘYJ_řPčÓönB•1FěÚÁčwţl§ ˘´đ„ah”řłůń6řĎůaE󰙏Ęz©N#𮍓ŠĎňĎřžPĘĎŽćż+ż}DďË:~™Žgł^ůí±^8oťq›`c–éţ–®CńţŃĄíÝW1.Rtl3ŮOůiU öĺ"J’$ˇ‡ÓîŐôĘčĹÜ·ďěŃ…K—KBDtýúęőŁíí­´·˙śhúîŰNWŞ“$ŇZŇ„’ŁĂŞW«R};`ô1Ć}wăýĹśNžŁřnnĽkÓ[tţŐ—h÷ę Ú}ď7×üłšÜöömo‹o/8›ÍĐÔla""Ĺ3€;«đ_źËc_bÜgq÷™Ĺ8eu{_9@Ômž!čüfôxşöś9Ű4O·_?bÜoq÷­Ćx1—Ťśă4ůgřJ@0śĺ>żő)N}ú®¬ľ~ď>AŚ»Oăű”¦­$ůgPřüăü&?ŕ7ă3˙čť•ĆŰůŁ™.*`ŐěżłłS8<ŽcŠŢůŹTzÍź(­ DQ„ @˰÷üžĽľúóMţžŕQˇŹGË Ć݇w_YŚe*Mţa.˙źL&ŇBĺęÎN¦7iýÜ«o7|É=Dtŕ`n E‘ň|]oۢůé.«oqwcŰ;VşŘö( «\ŸęăpóÝÔźĘăÎťRš¦ŇI’P’$ągČ=˘JxŔ„XŮÓżŘáA`۵ËłűřĂeŚŰŰ¶ŻżŚésZŮŰ_ĺQü0Ń4ËűpݦËě2ŰÇm»˘m«łÝUă+Ěc,Ű®:1Ő™‡Îţ*›¦ŻeÁf?–mO“í\V6Š–-{Ż{|W)_]>îx“üEŹ5…đg겂"zě!e5B•evYv÷(›ä ŰvEŰVg»‹–!Šo6^¶Ăö1ž"61ć·łILućÁ~”!Űýxe~šŰ™ź¦¨lčÄÁäř®ZľÚvÜŃą›Ł7É_•j˘·ŠšuŘÄĆE“$;ĘIž«×eÁŚË›lg×óv=­î<Ú\ÖĽJţlm¨¬fŻÚ$c3ŤËéŰ®ěÚ!´źo1îű>Wßb Íń*ů«ŕ›kx˛ćvÓšhß;šv,öđ)ĆŘçŞ3Á‘×IDATáSڎ9Ţ%˙,yŰ6ű”]§±Ńç3ۇͶëóvŻ“ŹÉ±wËÇłlŽß(+j*żÉŹk|b—UŘĎEÓŘ.łoňĎřžPĘĎŽć;ĂâÇľW¦SAD?561f™Ć4]ý}eAť«—/GĽťUËFŃqBç"[Ócz—ĘZ@DI’$ôđŕcÚ˝z^˝áöť=şpéňĘ—Ţů°ôöľ™8Ž) CŻ7䥉ôŔ Ö4ˇäč°ęŐ‡ăîCŚ»ŹŹńţbN§ĎŃA|77޵é-:˙ęK´{őíľ÷ÍţĐ<¶0‘â™AŔťU€ĎăîCŚ»Ď,Ć)«f˙8Žm&oĄg:ż=ž­;í€wbÜ}«1Ţ_Ě•¦4Nţ>v7py¦űăîCŚ»Oăű”¦5Nţ(Xí„kţ=äĐ3•$ÜdŔ_ÎnňĂ>©(Iů'A»°÷üžĽľU8ś(Š"ÄşeăîCŚAĆIňO~züď cĄJ@ŮťTď”dzG%Ńťž|ż;Sr8_|DQ¤<ßş¶mË‘ÍS島˨‚ËóŹ4ő]×b)ă*ĆM~—ľÄŞNÖÍţ˘ÄźŠ‰h@I’¤Ă ďÇ\ő%„˛őUŮÓżŘáA`۵ËłűřűqżčäK«ä/Nü1A@AŹç¸P©<ę“&š†}|°hÝeŤ'ZF›úFŘ>ţłhŰŦě=űjŐa*TËŹĺŔ4Ʋ盧ĆßtYŞß«­±”qů߲í^ô^g:ťăsŮ´mŠ•®,«2NţůÄż8ţ<ŹĎö@9ń‹žÄ'j†áĎÔekŃC`ři˛qĘÖOe™*ăeĂł‚ZöôA_dwʞIeۤlŰšÎ_e9ŞĂT**eĚÇr`cţ;Şî*ă–®·á˛şKŰý87/ø™LWvśîb¬t±ůX•QňO´$ţ|Ó’,–Mţ®6˛j˘nBŮrŮámk^+j:Ôˇú˝Uąî<]¬“ëůřT\ŸŚéÉ@Fg—Ť×őXĘÔ˝ס«±R%ËÇe´“˙ń‚BaâŹc¶ć1 "RľîĎîđE;¸¬Ů¨l˝m*!ŞÓŰ.ÇWe×Ű®«qÓŃTڱíëă2Ć*qkňd¬důX…Ń™‡´Xť;R‡Ë¦ţ8h0HžŽ“o~puÝźo6âÉÎŘiLÖCeú˛uk;ţŔQ—Ş›čş7MĸlßęZmÓ\ĸhźA¬ęĹçcUÚÉ?9zDaH†D“Iú*JüÁb9ŤNâĎ ŽÍA¸¬đŮĚ>lۇζăË‚‹˛aŁ/qoŞ’G”ßĆUĆż/±”i2Ć*úU˘|¬Ęčwţą4É‚Iü1Ĺq¸¬ą;ăg—]t€}.šĆv™ŃÁ©lÝÚ(˙Śď E˙ÓN9ľ#Žh±ď«P´ś˘¸­»NlŰPlbĚ҉i•űfѸ]ŹĄL•1V©¨©î‡˘8¶¨±RĹçăř (I’„|L»WoĐ+Łs#ÜľłG.]^ـقXiâ_Pz­?N/t|ĂwUz4z&”V˝ZŕbÜ}MƸ‰×l>>˙ŽNžŁřnnśkÓ[tţŐ—h÷ę Ú}ďóźú%GŹ(ÂÜďůŹ›ú‘řŰŚ=`‘â™AŔťU€Ďăîk2ĆHüőĺă2V7ůY6‹r Eâo»ô !»OúoGŐc MCڻݙ#ń7C·Ă˛“{ű/Ż9ŕa>ť€řubÜ}MĹe«ś=ŐŹAhëű@»źůGď|¨4ŢÎýČtP«f˙ťťťÂáqSô·¨t:ő´—Ókţ";;;E*»ÉF˛@Ď–cďë>y}«p8QEuË ĆÝWc™J“ČÜkp2™”Ţ_Fő,ÓôlTtÇ)“yuůl}ddţwñQ% ëŰŠ¨•˘ÜC^DÉąőkE…órő˝Ëę…r¦ÇUŚŮméűví[bcüÂąSJÓTÚá/{šßb±(·čńťUrůPß )QâOĹD4P~jc°ĺÉweOxc‡—ݦ»Mß»O\Ć…8űĂô9 ­ěíŻú(ɲiŘÇ‹¦±Y&;Ď6'Eq⏟Ţ4$<OáŔQ´-ŠâĂŹ'&‹wŃ0ŮĘ?Ç}BQÄ˙´SŤÉ6ÖŮŹşşĎŐÁUŚYEń¶Ý·uć‡2¤' ˘$Izxđ1í^˝AŻŚ^ĚŤpűÎ]¸tyeCEď|Xz{ßLdžaď7vŰd‰ź•&ţĄ×úăôr@qUى}ŮŃ}YŹLš‚ĺŻ6Ę%”V˝ZŕbÜ}|Ś÷s:=xŽ⻹ń®MoŃůW_˘Ý«7h÷˝ükö$GŹ(ÂÜďůŹ›úýMüľśaű˛"ěĎţîĚ|†wźYŚSVÍţqŰL-°lţĎnáű´%Ŕ×ÄOdŢÔčš/ë!–žęü.řx:źľČ!ĆÝ·ăýĹ\iJăä_G/QđÇJ% áD¦ŇÇŔľ¬Ď×őwăîĹřŕţĄiŤ“? V?!îí‡kţ=äĐ3Hţ=ĺó/R ZF×üŮűAO^ß*NDE®· bÜ}q?±O®KźááG'^0S¶ËX÷öźL&âók€(ŠL“ĂţĽËä†)*Źu1Ż®¨*Ć>o;—e¤Ée«ŽßÄ~¬ĘĺwĆţťJ~’{:gúŁĐbě~üÂąSJÓ5ű—=Š^ĹĂ^P@«ćCڎZqż*&˘AŁOćs¦ĎiprÍßöŃEŹh,ú\ueód#,z-Żo\ĹXô9űĘŽ[VTË;ľNsµŢeË/[f]ĺÓeŚuöOŐ}×÷íç3qâŹ)‚Ü<Ë*yŞŰÎd_({Ż2ŮĽ‹>ď+ëäźÝYČôŔ‘5݉ŔĂ++˛yŤ›ŤÇ>°…/+0mx0KU\ĆX¶Sň—stËCYM«:O›őV™WŃxu”Ď*c¬Ó˘ďŕűöóY>ń/Ž?úîljëNٶsµ/”-_g¶]f[čÜÍŃŮ™öŞ{ŕPmJtŐäh˛<4wÚĹ%Ú–&ŰšĎĹ˙ŠĆ)[o›yŰŽçŞ|VcăŞLý;/Mü AâĎ7ý'ÉbŮä_–m·ťëí-›źîç}ă&ů—\;,ŁÚěWő<@Î6Ć:Lc‰2`§ÎłTâĆži‚šăÄ łg‰""g×ý›Úeĺĺg•łßů›v:ŕ›pL±ó@Í®¦1ÖaZ\•Łľ«#Ć,ť¸őˇŮÖµ8i± :w.¤8—MýqĐ`<'ßTě˘sg“ÇcY9AůÉsz“ź*:Cp«ccW±©"Će×’«š·o|‰qŐóěşäč…!QM&é«(ń?¦»š_u^×7·¨ĎäY=Ň7“ţó„˘˙)‰_ËŢ‹:íČ(šÇńş©˙^WgÜľq㲚·iy(šÎtÝl×»h9źĘgU1.Ú6ŞqkĂöóQö}łKlj?¦8—•"w‰żl_P™NÖaŻlţ˛r"űĽĎ"J’$ˇ‡ÓîŐôĘčĹÜ·ďěŃ…K—ąîűD,{‰–K(9:tşâP­6ĸ-s_׳Ęűúťű(Kü¬4ń/(˝Ö§—ŻVâ÷ăýĹśNžŁřnnĽkÓ[tţŐ—h÷ę Ú}ďýfvAD¤xfpgŕ3_cڦ;w\DZńWrô‚ Ěýž˙¸©‰żÍĚöă”Ałz† ó{ÂăéPŔÚÁĎ›6'‚Ű#6~[6˙g·đ}Ú€Äßv«űńţb®4ĄvňGAé>źcěóşÉř¸ÎU¬“ŹßňV*Y«‰âwp˙Ň´N:ü@{ éÓźú€˙üzÉ güzÉ güzÉ güzÉ güzÉ güzÉ güzÉ güzć[Ş#Ü`´€3á&í/ćFÓ@ś 7)I~Eń]:=xŻxíí«Í>¤“o“$I’/ö‘ś˙ÉŹ“ýĹ<÷÷ďţíżI(Ů_Ě“$ů•֟ʹřĂţúóÇ+đŠWĽÚďCěßůźüx™ç‰(Q>óĎŘÔJl¦€îkúŚ Żxőá5SeÎÄ5đ†^Ľâµé×:8KţgÂMWł€žňáŔ‹WĽ6ý*â:Ç:IţHüŕ‚^ĽâµéW—ąÖ:ů#ń€+>xńŠ×¦_‹¸ĘąVɉ\ňáŔ‹WĽ6ýZĆEîµJţřý>¸äĂŻxmúµŚ‹ÜkÝěŹ ¸âĂŻxmúµ«śë¤Ă*ŕ‚^ĽâµéW—ąÖŮOýP[>xńŠ×¦_E\çXÜäĽáĂŻxmúµZ·÷ý÷;˙ÁxA6Ó@?řpŕĹ+^}x­#g&IRţ`üář«úχ‡©ŕŻMżÚěCŞö Ň.ˇ‡ÓîŐôĘčEbÝľłG˙ň_lřOtůŕÚôťő%Ú˝zvßű ĽŮ˙ÍčŤĘVęWšüëę|ő@o€žAňč$€žAňč$€žAňč$€žŃş·?¬ş}gŻéUđÚ›Ń+÷Ś9n6´6ݤűÔ?$.\şÜô*x©()%ÉŻj\“î ‚ďhOäďHrô¨éUđÎÁýĹĂqY+¦­Ď¸ćĐ3Hţ=äĐ3VÉ˙L¸)üc‡‹ţ×]†ÎçľÖÖ—ěg¦óŇť‡é˛úH–ÇŘá*źµ…u‡ż˘žśş?=9n:›W‚µőĘ:˘c!€[˘S–wÚ–—x•6űŐŠŠjXĽýĹĽt<Ůü˛÷e­:ëS$;ăć_eăň­ü0ŮüUća˛,Ů|Řá˘u([g•íP7Y/Ę;mOüD ýÔŹßp¶˛l~Ůű,Ů˙Ů8EÓë®[rôHéĚź‡}Ď˙o2×Ë*š®lžŞóđ]?‘äĎ׌ŞÚ(|ÂÖY&;\wýšrV™ «kYeËSY—˛ůř¬Í×řy•^ó/b˛‹*¶Ai"¨.!’)@=L[„}ÔŘţ\n8Qł}“ëŁĘöĚ]ÔôŐ*:m /~篓¬U:˙Ůň© Î„®rÍżĘůÔM–SĘ’{ą¨JŤśůóÍä:—˝—­ęú•O˘˙Eď]Ě#{oş¬˛ĎU>ÓY6€tň™Îtľ2NţeÍmÝ }Sĺ ‰ę?€)Őfű.ć3ăäßĹŤŃGE—Ú0S}ÎcŤőö¨ţFżĘů@}ĽčíőÁ™żű‹9ÜĐôj´Îí;{MŻB/!ů[z3zŁéUhĄ řNÓ«Đ[Hţ–â»MŻ@ëôąłťpÍ güzÉ gpÍßzŞ{3zcĄÔéÁs ­M÷Áw´űP ů;páŇĺ¦WŔKEI ¦í™ž€"ů;‚»Ř@gýöoM†źňů ÉJ鞥㒨ßĐá güzĆŞŮ_ö,ä¬Ç™pSřË0]žk˛çŮłź=óž}.K4mŃ|ldó•˝řĎMć_rRĆúšŃ—qőEëXF\%ɢi«Nľěşóßđ•(Ůú–€›Ti‡ż˘ ÍÖČl‚! 0?L¶Ľlś¶ ŐV~ślNâĆ?ČZcYMKeÇsY®ŕ‡±yAgş˛a>i¤·?׉—OćeË«ârAÓgČüňd—Ę*ě0öű°źˇ2ĐlR” oÓĽ “?|>©´Nţu\S©zěü| Ýße˘EŇ]˛ €ŹÇO™˛uUý.múάJŻůQi:˛]†éň\‘uÖÓeš ‹: š4űdř @“`yˇ‰\c˘±›üÔ]Pę\žJ˙:¨tD“=js)Q˝ mŮ^üÎżîšR[jf.±­®Z$|Lv˛Ëuźéűśk9󯫹(«Ůé,Ż­µXŰ´ź˝ ĂY?t‘¨Ŕ÷ďâó‚Ęńż(ź´éRUň×é0ÁŹëŞ3…lŞË3]Ż"˛„*ę9_4~ٰ˛ůŘŢ@Ą'?.€Żt;őeďËň‚É˝g|«´úÁ>m©a@=Úp´:ů#€Ő+:űÇY?řyAM«“?ÔCĺ2tŃŰ-HţP(ľÓô*€cHţě/ćtp˙AÓ«P‰ŞšŇŃšĐ$KoFo4˝ ­Ö„f!ů[:ď6˝ ­ŽyÍňâP$€žAňč$€žAňč$€žAň處ßů_›Ţjb= &Ëä˙ON˙>ýüĘď[Ďđ§ă—éçWŢ·ž@߹ϩ7IţöÇ˙ÉáĚÝĎ Ż\çT\óč$€žAň虀’ó?ůqÓë5Ř}ďú˙ÂW¨|śIEND®B`‚fox1.6-1.6.57/doc/screenshots/fontdialog.png000066400000000000000000000273421326741342000206060ustar00rootroot00000000000000‰PNG  IHDR`ĄŇÄÝgAMA±Ź üa8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2)Ý.I IDATxśíÝ!”Ý8–đqőž€‚ ,h°  AŔ€€Đ0°Ŕ‚‚ 6ř@‚>° @@<Đ Ŕ€€  ,pâQ$ůúJ–dÉţ˙NNŽë=[ö“l]Ë’mcĚŻX†OŹĎŚůÇđ4l˝%´â—ë«‹^<˙x<ßoş1´ĺ™ýÇét“1éw§›1îžţv™1Yňşţçť˙á3çďw™bä/×WăÄéo—/˛¤´ęÚę¤8=»p>·?ŮĐu¨'Ą‘m6÷ţo—?{1ň?3~ţ8|úh>}ţzĆ˙˙züüżçĎ˙űřůăůóÇó_˙:ţ×ůŻÇ‡żĎţz|řřçĂÇ?Ď÷ĎŹ˙Ľü罝ŢK&č"čúi˘ŕl‚q¨ăvN˙Ň™~µ­‘bb‚‰5Ž@€Çě|~Ś1Ă0 Ofódž˙řŇţöÇź^Oůúí—˙ÇĄľ=xŚą7f`‚‰ž'ücx÷ěâÝł‹ń“/GĐ·ß—­˙Ď޶I5RLL0‘6ôť1fxľtžnŢťn†O‡§áÂáÉcĚÓ`ĚĹó˙úb?>> OĂ‹ź^Ź>ţó΋/ńÉgfx.ĚĹéćfě<ýíňÇ™uýúĺkü[śá—Żç‹öĚżX'‘ÓçĘE¦śýE4[µ%ż|{î+ü| /1ö%ÖÓéćôű­ŰiچĎSĚűr4<}ţřřđă‹WĆń˙Ńůán0Ć<}™˙Âa0ĆĎOźť»´¸o˙ň4üăŮĹŻOĂ4mŚ˙ś¦§ĎíEśŻśEěµË©É[»%Óo™[°'ˇ>Hsaľ\)5ćK rx>ţyoĎt~¸3Ö·v‹óÂ|sđĽf‚‰ţ'lú 1ÎăĚ9Fyauö Qáę×§aú§Y6* ľf‚‰ţ'˙ád÷#~ľíeôçüúíçŻ}qű ďŤ93ÁDçQśŘă˙i*żŤč˙)$n'\dúÜţ—¶ńÂVÝ·QLL0‘6čüë_gcíÂŢíŚç?î¦hza÷DsűţýÔůýĚşNýö4c~›3Î öźšiűO]ÂWú­Unˇü°ˇ>Č™ä7íÂaţţxţăý8ýň˙]N-Ë)RfŕŮu8 ßž†ß–öü®L×$Č sa÷&ŽÓcŹăĂďÇOîßc>Ľžc.ĆVăŘŽ§m—L0Ń˙„ÍnN+4.¶ŔľI$i‘ĹŻ„µĚIŘ_#ĹÄk&K¬Ď÷ćŮ7×Kík­_®¦çŰŻŁ^źĚ…1ĂÓp÷á~şÄzaĚGc~4Ć0ÁDĎŽXéW+„ŚźOź˙?™ľJXDކąŤYÜ~Í–S3[—L¬™ř>t‰ő;óm€4ůŘ@r& żą2×XmĎł§Ř8‚”o@˙§ÓŤ17ů×đßoó§ @VÓ5ÔëŻ/Űř¦yőöçşŰ@CnnßOÓQ¬€ @€$H  @@€ € @€€gËłX^˝qź<ţđá6a­c:n§‰„Dpdöž37-,˘˙–]TĎ©¦LÓä!ů\S°¤(_\€­ĎAĘő±×ĺTŻŻŢĽ}őć-yŢ ą’˘°|)ŇaźŚLg"SëĐX-E3Şâ—™03°(¸[úÓň®8%2Őő썱ś<Žt‘Ĺ9‘‘sPLścÁ©PÖöAN¬Pěxéç2L8&íZ8¸×ÍUf>î¸ ČeĘ7'ócóP.;¬7WRö ·‡-””9ćě\榱óÝŻ›¨žŚ|zţ~µ¸§±7 ě t®,„#]™8ÖÓ””¦tv_(ú Źs6ľ°gnbjšŻé¤ě*X,)Şúµ}Á›4ciíţ˘6r™vąŢAö˘šěü^ľžhŽtĘ®MI?<`ˇtp¤pX´xIźŽśĹfťťŰä|5‹7D§PÖHűBöúväĎPP‚? !ř­f‹šůČě<q˛óPcećËë %eóg8`ˇ|gŚž†Çóýétsőöç­·‡šUí€oG:Útsűţúúętş9ý~ŃYáŞôľ[ëČHŢUäÝ’ ťÜă5?6ç—Îa–Y:ʍ¶ ·f?±‰¬L ٍ<äHoE3Éđ$ť\(TĂζ!2˝č`+ő©Z÷<”Ţ`ÎőőŐ㟏ӟěŤŰ˘8zAI śĚ™Ł˝ÄúëoďÖm"x9Ž˝q+G/()ţ"Däđi9ŢyťĎçŕç썛 8zAI ć2ÇG$HĽňâ‡FĽämϰ83ŕÓď6Á9ŮëňŠ:˘§(…MŚŮ>š2?řᑵň  č]ÚQ̱_źs*sńĂ çLeúpŰíÜ\t€ś;ď“O=üo§Oś˛IK—°7˛eçĽćëŃmÄńŰťÁŮy«”Řéě÷Ó.îďĺsßN%,ިôqpi{#{Q9ÎŃ­<~9ĚëădQ–x‰ŐÉP9rź^ň•=Şŕ:¨ÚDt\”­R®k¨‰€#Łh ŃQ#Ďm周oě5@kŽJé}7‚łK¬‘¶˙°×Ő‘\:6— ťQ¦ţČŕŕ°UçŰizńDĆNÁpâo {Ł™é/g{iv>Ëőż‡ycV;NţŰŇű …q:~ÎÎ}ëŹe]śĚŤ…VîěTy)넨Ş%Ěĺ3ůďŕQs ľÄJp´ ж >Üęß ĹŢŘŠŁ”T,U€Ľľľ*Ľ€{cS(Ž^PR Tňtş)ĽŔ,çŔfoÜĹŃ JJ <]Đ^býő·wéۤzřpëČ޸ŠŁ”” 9AŁXőăWÄŔłŽCß ňęÍŰąŻŘUrˇ8zQ˘¤‚oʵq–Ěńe{›‡­ŻśE}/~Z~Ě&W„Şˇ8zAI JdNJ€¨8=MŃ™6Ţ;iťGešĐ“ZíÄ•s˘kŹRš ˇ8z‘·¤‚•jż5möÝ8ýmö3ĺ—€ë_řőjxĘ)r‰Ő!śŹ,>c(mî:6G‰`[t’˛Sđ?\\Ń>¬,'ĺĚ—óÜOy®höW kJj÷˛dÎĆň°{6&öś\) =âÁžlç˛j–íĂúâ0V†äĘ|yŕBÚFö.KIíU®ĚŮ @ęß[Í®wĎßw+ęěT¶ŚĹˇą^­Ď|9µ^ßüŔiYĆĚI¤łř˘đŕŰĺ÷†ëçÄžči±ŇaŰQrGđŢ­•ć9fQíŔéQĆĚ©1ŠŘÜ1«ŃF¬Ď|űç:¨†‰ńŻŐ˵-uqFĘĚ'Ďk’ …ÓJF±bç‚=Ůö@a*•ô™Ż,çY"H67TŘđl -Hl ăă"5˝×ňó´ä.ó„őî*ŽąO?\ÔYŢbj——Ż//_kÖśSżř^ĺ*Žń¶ós1o§(Ů·yśť)”9™G±_Ř8nJŢäÝÝýÝÝ}ě6¤-u´ ĘśĚthbQ–~ßŘ™ęY»EâWľÎĚG–«8†OŹc?™1ćîîŢnGŽů,”]rÁÓ·…ś}(”9Eîô“qńőőë\_EˇčhWŻS…ë׹ö·\Ö3Ĺú §ŘfÁ\‰L”ł -ČEÍőA:‚Źí|%z Ňš4PLî>Č9 Qąî:ˇrQˇĚIąÄű}Ă'ÂMÉŘ‚”。9¬ň}=j˝ (q"Ü”:-HçÚ)˘Đ‚\T(s¨­Pd–Ц1UîL. hT®R¸ď Ż[hAb' őAÚ#!§!ÁŃŞÓ·´fLɤťĎv‰pä‚;¬-H9ţuG őAkä=×sFKúź?™[ę€ňöA Ą07-S¦RxäŮôŘüż¤ZŘ şRšR§kĐą>HěDˇs=¤©Đ‰•jŢ9=d»/…2‡K¬¨-ę\ŹYZ®âháťP;ţżÎ“t:ŤŽ¦X­’ňş+`Ťóůµ;;4Ż»ĘëÇ˙|Nqt!KI9Ő¸đĘÂI5˙ĘZĹfżîjW-Čmâłríso٬Ľd9×űůď—•7{Żb_¤L„⨠KI-¬ÂŞ7ÚŻIl…ZôA˘6®Ż6…âč%%h¨r®­c7Ďí1Äň´ź˛ť‚ś¬ź¦ůvŚňÜüŠ’·ĘĎź´Ĺ3¦Óć9 }Mˇ8zQ˘¤„ʡµzCÖ\ ręÎká©.nŻYLĐOAHÖŮ€©8Ë5jŰVnUěâÓi3:N„Cqô‚’Ś?Yó˙÷Ď_ę“MďÔÔĽc[ÍĄ©¸•‰+6saŮióä­şřúş®ĹÍČV¦Ólt44YCqô‚’’˝PÜŕx:ÝDĄ™yNBñ~˛QacjśµrúÂAŢŠŁ”Ô˘ě?<ó ť±™5×Řj-YłÔ'ęĚfŠťd—|ˇ»‚¨á­7v˙(Ž^PRőĹza=wŞ©Çđ¦l‡]„¤üpnńŕt‚ŶŁ~«b×»2…fc$'ÂMˇ8zAIŐ—-@®żL!*Y'k¨ËâR…¶*yqçd"-ť6c$'ÂMˇ8zAIŐ—ŇiWÄsÓšůĺ9……_i¸Ć~ĄßŞŘĹç¶6a3ć–Ú'ÂMˇ8zAIŐÇšk`í'ÂMˇ8zAIŐ·«GÍ%`lj}ś7…âčE‰’ň+@Í3LŽăč-Č#c!ăD¸)G/ň–ÔÜ@Hłîy/;sô$ęŁÉŇŠŁyKj1Ňr0Qňý˙Ü•ŰÇĺĺk*ĺvDµK(Ž QRőŃ‚DmäMˇ8zQ­¤ś»ŘŹěč}¨ŹNݦP˝¨VRôAN¨Ť&KS(Ž^PRő• ——Ż//_+gXśű@“Ą)G/(©ú꼻»ßzP'ÂMˇ8zQˇ¤¦NćŰü.Ąȱťwww?MŘźŹühçk·íÔŇŇG/Ś×ŠŁ%JjńY•—~‰uŚjćkÜš‚™ü¦™ýo§ ŚvQéŁ#TÇMˇ8zAIŐ—~‰Ő‰jr“.ˇÁGqŻh˛4…âč%U_Î>ČĹń8×…~q7…âč%U_¶Q¬Î%Шoq( Ćk ĹŃ JŞľôäÔGíËăŕD¸)G/˛”Ô^źúă>/‘lz Ňe:Ťťq×L3żť¦c­ť‚ˇ‡˛gś7…âč%Uߪ>HaśŽŔćľőDz.Ή®Ńdi ĹŃ JŞ>5‡Ú8n ĹŃ JŞľ†ž¤ŕD¸)G/˛—TđŃ+<ŹĹ–Ň‚d0*ÖŕD¸)G/ň–TđŃ+<ŹĹA µŃdi ĹŃ‹Ľ%E#G#"@ţü÷ËrŰăž*ĺvDµK(Ž *©ÝÜp:ÝdO“$jŁ:n ĹŃ ˘ŁŕŐ›·%’e+jŁÓ«)G/˛—Ôn˘Ł1ćó_燷Ę˙őÉ QŰxz«ů˙űç/7ÜΠŮ‹Ľ%µ§čhŠíƉ—XÇ7jf|sXB‚Ů·ŐhÎpKô(ŔGd/()AˇĚiĄ’8w4G;€›EťŰ‹r}ŁńîŽéqž¦«öeC-ȱé6NŚmúÄ| uSónúJöç·'ś•˘)í’^ä-©ąŕ×QP´ÚŤSú §řäÄ6?X:Óö<Áůť™§o…UXčŘ JJP(sŠŇ™˘ZěRë°Q¬˝ ¤…2'[d°U—}€Ľh—ô‚’´Ţ‚y…šzÎ%VąĐ.é%%h´é4ě¸őč í’^d)©˝>1ô|>7Ô‚ ޵)íU0NČvI/()As-H;úAŃe#OűĘikĐ‚ě%%h˝@Źh—ô‚’4ׂ°´Kz‘˝¤ä§Żô5 „$€üh—ô"oIÉO_én-Hě"o-Č^ä-)ˇi8Ž…ě+FÚŤ ¨­Đ«M‘&ęÔ›ąˇB%ŐץÔ9…2‡‰Ú>ÜR·čŘ‹:Ńqş•®/ôAb'čôj ĹŃ‹ě%µ›čhčÄnĐdi ĹŃ‹Ľ%5weŐ­ÓEČl«9=7Ç™Ńdi ĹŃ‹ %ĺ?R»‹čhZnAö’hM–¦P˝(×9ęş&/´§H»í8Ť'ěÁÁδłěâ‡Ř«¨s=*ĺŇ(Ž^ä-©Ĺš¶ŻŞ¸Đnśr‰Uh};Ź/wîB Ţš*߯Šý÷NÍ˙ß?ąávĹŃ JJP(sZ¤cGS잦€‡ TCqô‚’”Čś ¤ÓF¬đ¶,4‹uMˇ8zAI ˛gÎ2§Ë^Fömí’» §&#mG@[c/ö™¶ÓRÓźsâ ‚Ďe}řp[K`(Ž~PR‚Ś™“Ţ‚śĆÔř‹ÓÎxśŕ‡8Żĺ ßĹŃ JJ1sx+6fď»䛣8zAI reŰ÷`ňFP˝XYRcß–ó¬Đŕ‡=ʲ ŃŞă¦P˝XÍŢ۲~7nĺA€jđˇA€€âö—Xŕ vs5µZŘŔaŮ&ŠŁ”” Dć Q[đ6^l…âč%%(”9Úůđáö|>—ŘÍúˇeěŤQ˝(WRcĘçóyš°?\ąŇ: Ť»VČëë«ë°76…âč%•@ yÁ ÚÁŢŘŠŁ”TF±@€ € @€$H  @@€ € @€$H¨Ţéxőćí4ýđávüłĐ ťť•®Y‹˝Ů‹IŐůQ•eÉűs:˛ĽČÎ2ą§4Ťw0.f/ůȢ¤súGi›śş`ÜňCU urŕPYÚ‚#ďŇ@iqŇ©dť¦_O :§´Î„=ʰŕ81×^ńŹúQšŐíµöŃä@TRs™6—lpĎŮknĺYÂ!ă/ü8¬l}Îq8cţÁéÔĹ!YNÜá4yýô…ŐíC®ň$ó‚ő˛3§_ŽX)ę!˙ ”>Č §Ţ”C‹2đ¤Ĺ§ąĄü±>Íľ¬ÉG° 8·RąćŤŠÁpČUňe >ą1'Ď“śţâ±=U"v¨sgr`Of@9ĄäÜřĆŘyÉ}cţ‰öj™Ś90.~Z‡×éŹŕ(Úň¦ď|’q„Őu4^w M†'¤őůÜf Yě!CţŁčA:Ę~,{¶ą6bpžąôíúŇěEś¶Ôâęô™Ó˛Ę90·řţ2¶Y+ßc†§áń|:Ý\˝ýyëí`37·ďŻŻŻN§›Óď·q˘·lx”s~˙üeŃ-±Qv Ú,ĘQłÚr¦± >‹ő°4—ŚvvˇlŻ(Ędv őhNčšm$—P•Ü‹L×쨅\Š?Ľ0_»@榒 ~ek¶ÓĄG ……–Q Ć{Úsl*?Ą6říšŰ …u>źTr¶Ůy±ą˙[枡ť¶şX[ĺҤéäÁřB¦“Ź‹^Ă;@šP˝Ďń}ö‹řĆřů¤Ýř›W˙Ă„Ł:Ř`ť›đ×eĎ“°©ţâ2á…A›ďm~ďóęőoËE9j°@ŰÉ4{K‚o—›MĘVٰ–Fv’QňűwmţŹ ¶DýxÜK.M˘ź¤#Qöi“Á§t˛˘~ŐŕTĆŠÄÂVé_$żl+ÎĆŻůÇŃfQŽš-ĐĘ™ćżĎË©¸í?N„oç^Ţ''Řŕ6'§ŁÉ˙Ýys 6+±é4ű4Gŕ¸HB'ĺhqÁĹş@łj9ü/.îΧěOb©ĆůăéÎXjGn>Žú*ĘŃćZ9ÓßyéÔ×r:±_e™żYS9&gťťÔ#őKmĄH¤Ą¦Đ{X–ÓáÔĽ§ŰvŃÎ~@1A›E9j¶@ëgÚ´Fą›Mnľ¤5nşhĄmd–˛ëń­Ý)Ň>5ˇÎŚ`¸šÎ[›Jŕl‰ßgłŢxͰ7ř%5ťµMmŽÝ|ś´S”Ł. ´N¦Ůu®ßrfö甿´łcřü4ŞĘ”g0Ť(ř6ŹéP\<&cCQZč–’«•őÚß DQ&h$ÓÖ‡ÍâöZ¶ B łbîn™fs)s€ ^Mť»Ä:}.Îéźf~a]ĆÔ·¸©ŚX14wgŻj_ľsZ“Ć»¬g87ş2říÜý‚=^LkŇp4"CdDÇGąůH[в÷AN1y©é*ëx)ŐŹŻi«@–?@N!-ŘIiÄ+´‹MLęřÎ3< ŹçűÓéćęíĎ[o›ąą}}}u:Ýś~żĺQs  @@€ @uäýĄ·€:®ŻŻ˙|\śMű €_{·n{Řžţ6Â'é ź–ă--;źĎĘ9é € @€$H  @ń €6]üđbś{ŽÁ4Lů!µ1ĺęä5&$’ĺg.ţ:ýlÉĄLAą©N:úÍóů‹hö™ŕRú¤‚Ű»ç¬ßÓŇ~iťUËëŐJQ›‘¶sę– fKÔŹ•łČ˙v} )oF›ş‹‚ű˙áÜ>7ç\ÜĹýÚnaŤúDQîŻĘ_çlڰ…ÁµŰó,ţFyÍ6Ě­Złöą˘Ž˙ąźď'5·38sjâŤ_Áےŕ™|tl»jĺ©›R054;çâŢeϦߟ•§žB¶ČÇÂ\ŕÔěÁ#TŘřĆŁŁéýkÚń0WŠBjsÇůđéQŘőçÖľţôvLAł{Ť«›ŰNóµ Î0}e?Ţä`*č\‰'Óo•\ vš«ĘMRŁyńčXżjÍ&Í-p@\bÝž?Zrç˘\JS33ŞŐěbtR۰ĹîÉą-~éâVáť…šů…Ě‘ç·?ŹÝţĹ’Ők0ĺ¨ĆßťDćŇ”7rńĄĘĘdZ.ľ¸aňŻ[ÜĂý• ůü-~Ęś˘m‚ą±i×·d Gµű°”Ź\× Žë]ŚŻÁ{-”cyăÓâ·rfÚj~‹&ývĆÎofŠl.† ÎĹT?eyóäüTÎ?—šŮü vG &â¤ü\y@é7†ˇL"@nĆ©ěŹ˙t^ů4í{˘jNíłxNm˙Lů¤8-:ĆŢĽhçLě˝%iĆÎěĚ,˛Ĺ0uŞä/ÜÂĹčhĽ˝Z'BšM[-8łQ4ËćIűsg˙±?RVFńŁP}Ű(wV¨9˘˘Öž|®<ž»3Ň˙JXJł–ĹŮśZ8xaŻwŠFÂĆ+ëŕďťfXÜN!ea~}sMŮ_ŘžEs™ ?0/ţęآ·—Ň|őçŔţ—ň˘ŮŤäjnM,\dÓ·QGx°˝«L-¶JJa.:j>śKDĂ`rßUą”5‰'Ěiľ=gZ\VséEżF[0+ÖśLÉ&¤ĽhAn Xß-´k•\‡YBtŚMYYó®Ů’Śý:Á^¨BÁŁ„´|Đś¨]Ě? Ü^¤ <+w§„ $:6‚Ůśäž°5ą¦űs:hł·ţąJĐg‘+ý ĹBÉŘ|ô-v+ĘkfP¦,„É(iŇÁMJ–ŤÉŽí @6a®ĆŃTŽi×5}cN“Hčů ¦é7­Śâŕ__iÚâYj}ś.+|{’¤é«˛EŮQŞ!ď!r&č[~i#ˇVÎżѱ)ČÚrŤßËH3ś/-e;FÚmPý†Ą­7#ˇćíĄ%='6„(¸p.•&o—alúBÓ_łřÜRšˇFŘr{Q]VÓ"ăÄúc)aíQśńxY"q–źlŕú«PŠjĚmhńrnň¦ú9–«¬łw¬O$y«ú[8M<,äĆćĆ@j–]ß›ÖŰ-§?h5˝PĘ5.ú°ĄŤÂZE,żÍ±X]jRÓ_Ń-ťMrČŃbăPŢŁCţŐBŹĂ\jňŠ˘v°\=¸HĆm›Nĺ+;?ěé‘'Ż]YM§UÁrm–fô8±QiŤÂ„kËvł{\ źÇţŠśO4sfˇŚŽ&íô„Ô‚Ďŕv^ü ě-HtOŽvSĆą¸Ř|Ô×őN ŃDŁqĂôíąĹÔ˘ć_ą:ÍziDb8ĺkśťç‚YZXŚ Q >eSXN!ˇąÉł[±{HôM_M—hĐämu%¤śĺĺQËŇ.ÄqĐ ¸˛ÄĺŰN¶Ąß†¶¨Ś‰ť¨Ó˛QŽMUŢ7˘LS^Wr úW^Ű‘VtŠK¬čXrł&ů‹ąoíFˇEngT.ëNDç•×ë:E Đ’[~PńçQŢ…b¬űFäűíµ+gvÖüVóŕ!Y`ءĽ#wŰ…š`¶f“‚É:íE˙NÄ5÷±h2ŕŻČ> Ĺ‰ @bĎrUÓ ÷D&?+.jÎúĆĄßé(ÄHn|ÄţЉ=(W5g©÷…ĺÔy™Ľ–´ĺgćé} GP kHNÔ˝ CoÂĂQłK{Ş€ňń@B @ŹŘ­•Ő´ćYçú.Lg“ćF‡f ÉÂ@ĺ#×cŃ|ÄÎ ±7YŞéä@塌Whcăqvš  ůÝ @˘cÂĄż5UůôΦä”eYbXT× ‰Ś˛sËÚź{‰ŽŘF±bďALHJ3[đÝOf]śMÓż÷#í.Fů…V~˛šő]ىľMŁ@:ŘüŢÁ¨»12ůćBá}ÂíüÎ6¬|zěŹâ9;Ř7$ö ×Ë1Šľ×˘D^ößU"Ł€Nq‰€$H  @@€ € @€$ÚGÍ=|¸=źĎE7€v¨äőőUáÍ -Şůř'& }  @@€ € @€$H  @ }›ěĆ‹ź^l˝ řţůˇ·ÓźŻŢĽÝpc6ggĹ$€#:Ú;î˙xđ?üü×A_břýó—šŮp\G;Q03ç AôA@€ € @}Î Ş™ĽŠB‰gQg ëç-HH4UŮc­}Ě'¦_˝żźO R8 šiÂoSNs:‹[źš¤Ůůçúź¦Ě.; WËZŤĐ¦śjöńĂŕśÝ5Iť-ŚýiúěňOD*  ŮŐwÚW˝ ţ4Íďm!OÓúf_ű GÇĘ nö÷  ›`·Y¬Oţ°ŇWoŢ&üęf/}Â<’Ë®I°úźć|(üöjŮB€€DSŚô›8cL4ËÎ}ŘýO~Ż?čwšąZ¶p‰Ňů•µSËG}»¸HS„MՏ͉»T9+MnÄî3 ŃvÖŘ}&  i'î2H€ZŽH˙Zů}#H‡óýó—[oBČŔá´Ó˵!2a}  @@€ € @€$ßÜysű~«í )_ä‹—Żßť^Ç.üËőŐ»ÓMŢ `˝uęĆLňî˙'§bĎ÷ÉËPΚčF$H|gŚąţď·[o 9ý~k†OŹ[om>=ţńđŕŕxitIMEŃ3żÇýŇIEND®B`‚fox1.6-1.6.57/doc/screenshots/foxcalc.jpg000066400000000000000000001120111326741342000200570ustar00rootroot00000000000000˙Ř˙ŕJFIFHH˙ţFOX-Toolkit.org˙ŰC    ˙ŰC   ˙Ŕ˙Î"˙Ä˙Äa !UŃÓ"1Vt“”•˛56AQSTWŇ#28auv‘–±´Ô7Rbqs’ŁĄłŐ$%34cr¤µBC F‚„DĂÄđ˙Ä˙Ä@QR!1A‘ˇđqŃ23Ba±"4bÁáS’#c‚ńCrs˘Ň˙Ú ?Cě˙ĺ } ˙ĘĆ­µ V”IŃŕ.+ž¶–á3d0´–Ă9*;Í«/¶+0I!Æ0_»Dzí¨Ĺ™Pr+K‰Fl"K®’ťâך–óŽ-G7ßWeŹT#›TáŤWź¸kĹI ü~ë‰˙Ę€­EĎýéź(1ď-EůŰ>Pb÷ĂK”áŮ˙‡‰ü{řP娿;gĘśz+q3˙{gĘśĂ%7öáÇ˝ž><(rÜOž3ĺN=帟˝±ÓyĘ/—ON öâ˘äŕśÄ˙ĺcŃ?ůXK7ś˘ůtôăëŰ7śâytôŕżn(ą8'>ĎţPÇĐźü¬%{d¦sśO.žś}{d¦sśO.žśMűqQppN‚ň±ô'˙+ Bä¦sśO.žśz.J_:DňééÄß·\Żgţz™˙‡ ^Ů)|éÎÓŹEËKçH~pžśíĹEÁÁ:‰ü{řúěńńá(\´¬ýÔ‡ç éǾ٩\ëÎÓ‚ý¸¨¸8'Q?đăŃ?ůXJ5+ťaůÂzqčą©\ëÎÓ‰żn(¸8+>Ŕ€n[ťŞ@zB Ś>ďú4nČu[¦Vî”7©:”­@Ěq#ŻŇińś}éŐi!vRŕĹ\Ęn‡•%´ şi+Qi —AR»¤éBΠšĆßľ Ň'9.5NśµąDR}$iy•˛ŁÁCK„ŹÂyŽŰ í 2"˘®M ŔYz;S–—ü€ß jś€ ÔÚô§ZĄ9)ŃťjˇŰ?dĆÁmšíV, }ĹKv,úpť¦ÔŤ[B‚Ti¬ ¤ÎJűhŐĽNHĎşJ™S­nµĘOHqŮŹ“5ýËMkJ3J3”V´$ ŔÍC2”…(+Ňv­ŘNGs•éŇÝIu J‘'Y¨©i SrNż¶·§z2?ď űłú ÷•1O5S§<ÓČ-IŚóé-IhKk@ĺB’ •$ĄIJ„‚»(•mŃ]ş.WéV»ň&hczÁ‘ hqăšS¤Ą­ę[î•–µ¨ Š”śňĆTQRý>—)™ÍĹeúBęäË*-Fc±´©d%¤äŁšÉ9'2čűXI¨Č“Lä­:ű2Ś™ [q$˛}˛·JĘ“­ĂĄjZ YÍ$ë{X€—lň 7pOT…î]aR—(!Jď;—T’X9! •wZŞcľ»Ía·˝ĘÂ)´mý˙dá‹2Ttɉ:Ě-sŇŰ ¬6űŠI!CN`űá8‘ŹkMŞÝiˇĐKŹ>i1'% mĹ•­Řě¸S›h![Ů/JËRÇ|×Ô}­F¦B—ôĆ“Ůa¦Ö°ľĂL–w.ĄĄ)eC4†ňQ%Cty)ŔĽĐ6Ä“»)¨‹Z…¸ wĂd3BrXÍiNŁ’µ6JŽh< x•4#łčĘŽ˙ňž· Q^‰pSßz­ s\`¶ň¦ËŰ×J2RP^zIQ „ĄC%+ĺÍG±ę’¨RŮb–†\SŻĘ ‰y‡d´QZ# ĽÖśŇ2V”f6±Og±·f€;|Óé+:"=˝ŢD˙kĹŁżwş?m¸82kÖ6źĄ lGŞT„31ř®„¶ř„ĆeĆYm¨ť)mÍ9«RŽ”’˘s&Dx•÷ľŘú(ą‡OwnµRÍV´rgl–Ýu×÷EÍÚ[mN¤Ožö$nTX´%T¨÷(Şä¶Ă¨ě±ŁZ\P9¨ń˙f{Ř­(Ő&•RPĄČűS­-§¤Ť KŤ©µĄ`ýĘŹxŚmTv‰B‘G]:( Ŕi×Ű}ĹG–┵!+JGŰX'ŢŕÄľ3ŻŮł }~Ľ•[¶([·÷ŻÓčś)hUA‚">…JBłS !kËî‰Ȅń*Ď-)(§Él5-mǓ٠§ ) 9q 9gžDäHČť ýćne©ĐâßjRRę´RťZ¸%*€f¬‰ĎJtâťyQĄL\RĄ˛\Č© ľ„Ł<†d'<†g3Č ň €hŹř¶ťŠ†ł°m]B¦S\˘CqĘ|U-QŰ*R™I$éIË\“KćŘ~A=-ďp řł~¨ĆĂĄEćK‰h»Ľűb‘Ż@CKp÷:“ž{Ľľčwóă–GĹNN$XŹ!­©;÷ §rő0 1Íh 4Zü“KćŘ~A=9&—Ͱü‚z1šćŃoŃ«U«mGŠë±™l ©j\‡PÓv™EcRÝhw¸j$ä8UĄÝuęĂR%P,[Ć­‰˛ˇ˘lzU9->¸ď¸Ă…!ĘšW–ń˘8¤˙ö|čZr Se®ui]­xŮŽĐß*Ö ¸ nŕ™9&—Ͱü‚z0rM/›aůôbÚÍčÚµlĆřJR *U:”>'ýkĂŕüçâăšr*vĐkvąh-4PĄ˘^ťŮxHT„é-ć­%=ŽNzÎzűĂ..n•c˘¶ łiŐ áZR»Ç … –k^Ö‚ýÜTŻ$Ňů¶OFIĄól? žŚn`ĆË虏4»¨yG%§É4ľm‡äŃ’i|ŰČ'Ł0_DĚy˘ęQÉiňM/›aůô`äš_6Ăň čĆć Ń3hş‡”rZ|“KćŘ~A=9&—Ͱü‚z1ąôLÇš.ˇĺ–ź$Ňů¶OFIĄól? žŚn`Á}1拨yG%§É4ľm‡äŃ’i|ŰČ'Ł0_DĚy˘ęQÉiňM/›aůô`äš_6Ăň čĆć Ń3hş‡”rZ|“KćŘ~A=9&—Ͱü‚z1ąôLÇš.ˇĺ–ź$Ňů¶OFIĄól? žŚn`Á}1拨yG%§É4ľm‡äŃ’i|ŰČ'Ł0_DĚy˘ęQÉiňM/›aůô`äš_6Ăň čĆć Ń3hş‡”rZ|“KćŘ~A=9&—Ͱü‚z1ÍĎT—–)6 ŃU·Žjną TĂíşy–KâKÍŽ%%¶UĽ6I*ť§K‹>žÄč2Y•SIy‡Řp-·  V• IG 虏4]CĘIĄól? žŚ“KćŘ~A=ÜÁ‚ú&cÍPňŽKO’i|ŰČ'Ł$Ňů¶OF"ÚˇÔ/-»R,ö®ęĺ˝ŰnŁRytzó¬É‚Ň2t„ÉsĽ'.<2Ă×Řřݦ]Łt—ྉóEÔ<Ł’Yäš_6Ăň čÁÉ4ľm‡äцo±ń_L»Fţč˙/Áö>+é—hßÝĺř/˘f<Ńu(ä–y&—Ͱü‚z0rM/›aůôa›ě|WÓ.Ńżş?Ëđ}ŹŠúeÚ7÷Gů~ 虏4]CĘ9%žIĄól? žŚ“KćŘ~A=fűôË´oîŹňücâľ™vŤýŃţ_‚ú&cÍPňŽIg’i|ŰČ'Ł$Ňů¶OFľÇĹ}2íűŁüżŘřݦ]Łt—ྉóEÔ<Ł’Yäš_6Ăň čÁÉ4ľm‡äцo±ń_L»Fţč˙/Áö>+é—hßÝĺř/˘f<Ńu(ä–y&—Ͱü‚z0rM/›aůôa›ě|WÓ.Ńżş?Ëđ}ŹŠúeÚ7÷Gů~ 虏4]CĘ9%žIĄól? žŚ“KćŘ~A=fűôË´oîŹňücâľ™vŤýŃţ_‚ú&cÍPňŽIg’i|ŰČ'Ł$Ňů¶OFľÇĹ}2íűŁüżŘřݦ]Łt—ྉóEÔ<Ł’Yäš_6Ăň čÁÉ4ľm‡äцo±ń_L»Fţč˙/Áö>+é—hßÝĺř/˘f<Ńu(ä–y&—Ͱü‚z0rM/›aůôa›ě|WÓ.Ńżş?Ëđ}ŹŠúeÚ7÷Gů~ 虏4]CĘ9%žIĄól? žŚ“KćŘ~A=fűôË´oîŹňücâľ™vŤýŃţ_‚ú&cÍPňŽIg’i|ŰČ'ŁE 5§#Ca•™6ĐI#J¸f,)ÖJ,š,¨ ¸ë7ŽHŽđ™XěműaI|Ó¸e¤„}¬ą$“Ä»O÷źOެlŃńb¦ă˝ež†Á,ňÜĄíďp řł~¨ĆÁ9TbńËą•đĺ˙đßü#˙űŕ=ěkŰŢŕAńfýQŚMr“mÂEn»QbťNŤ˝Kňä/Cmu¤jV`Vâ™9fˇßďc‡§çÉ̵˘¤µ˙bş[áţĘĄÚ ŻÉőŰî·g[5§Ôé6´zÔIĎ=­úfĄLY®:ŕ„Ą.B”ŰjA^EĽóĚŤäýĺP˝h1ďĆ(ô›NŽŐ.Ňn«ľY{M5.jܬşëyĹĄ*ěA¬•IWŰ+[ÎçŮĹKŰw'ĹŘšyb#MS{*˛Óš''˛µUäg[ÇÎůĽ™V¤¶w|U¬Ľî}śT˝·r|]‰§–"4Ő7˛«-9˘r{+U^FqĽ|ď›É•j@űgwĹZü<+´ÓüôüúýkŢt(»v?ĎęňV×çmE]F‹>ß·[ [qjĹ&Ş·ËĘ'PxŞ"ű·†b ,€É‚°ĄĚXźĂĺăř†Ťţ-G…˙{lΩEŻS(ÖĆÂ~¨SU‰·&őőĘĐâ[śó"›[ˇN­zTTµ'Q“aě~«M¸¶µv×č3ăÔéNŇ©Q[ťŔë y·')Ć‚ÓÖ”şŃ)Ď0A<3עˇťeăoáu~ź…‚‡đ·8ó©$Ëźá× R”Ř;ęIý÷ ›”6ÇmłkÓ+s6odČm7]iäÜ8T n§+BĂf/Ý%iJAßćˇÄiÄ˝ż@´n evăľéÔ×ęÔĘĹI©9á-ɤÇfK¦1mă’â%1w%M”}ŘxNŞČ,&TĚ8ĚÇmN¸ňËa +qekY˙R–Ą(žů*$ń8Ť«Úv­Zż»T¶¨óŞtv,ů0vD} +F‡’¤éQ*‘$Ž8÷+ĎŞő‰·B(ÖUf;;TíCĘp$DKI’„4ĘÝq䲬Ču¶Ę€ÎK­äŇ\qö_6^ÍťťQ}ŻKzm1ř-HŤ6@ÉéˇÄ‡ ‡sJIuҲâÔR ”µ3'‰g"3)”űHe×Ă`8âVP…+ľR’ă„Ŕ«.ůÁ$XL©q™ŽÚťqĺ!–ÂVâĘÖ˛ţĄ-JQ=ňTIâp!Vű, Z3l;r÷¸éÔÔÝ2Šş•mđ–gŠ’”†ÝaOŚśB·ĺQĚ|Â@űF€Źµă ¶ŕí±Ki™U‰ÔZĹvm%O=TĆŚv%¬˘:RŁ3|‡"nÔ·siy<¤„…5ĄóÚť«íłŰOµŞ?.óŻ`5Ůq»˙m§_Üw=˙ąáŢŔí§ją_~şĺµG]RNď=P2Ý©µ·©Í:Ž•4Ň“™ŕ[AŚ„*łdŐĽ›Ţ€ĹŰín ąłĘTľXaqŢSÍH ě˛ęIܡ1ril«%ąšţä˘vĺ˝*tç®UXf;ŚßÔZ-5% Ą˛ú)‹y”;µ?)YńPD2v•iÚ˛y'˛mŞ;ܧ’7W'iÓ§qš~Ő–íiË- ř†3N·¨k)«ĚˇÓdTÓl¦cŃ[Á şBČŐĄ.Ą.žAI FxŞĘMJ¬Ő¶Ĺ‡6Ľ‰˛î–ObP#Á3mŞĂÉS›ŮÇp–’^@Rr.)N6RBPćpô+Žâ—UvőMečón[RÎC‘Úa’Ä#Pžó-¤joxęŰŢ)cSŞÖHBSrÖ­;V±Iş˝µGź2—,E•§Y­KRÝФ‘­JqÂU–d­Dž'í;URdČUµG/LŠôI. >ĂÎ)×ZYÓš·µ©'‚”˘H$“ ˝“ZĽ9n=Łëy.3zš+µgŕÇrKńUCTőjJP–©qy!I@HÝ·­ aËk´«zK§ÁLˇÓaŦ:§ ±#m·j [IH !×)ȵç%Á# Ś0`B0`ÁĆŚHłéďÁť™Qe4¦_aöÂŰy ) Iŕ¤H đ ă6 UmV=ąôfĄşťR«[58±ŰŞ8CŐąŇPÚŹH†ňňPhG-™­Z7 ^đ­oHy§M›Qę4KM1*ň#˝>DÉsĺŔ†[rL—d)¦óČ” şP’Bs JsŇŽÍOŮťˇtPŕÍFŁş=YěPŔ‡»ÓŁ °^ě˝[ěŽă-×Xř¨jŞÔ`ÁVXvW÷ŰQż!ë·R±ĐŘçť•ýöÔoČzÇíÔ¬t6# Ś0`B0`ÁÁ# Ś0`B0`ÁÁ# Ś0`B1Ď<,ŢVeŢĚ(íÜ5ͩݚ­a $M¨A`WĂ1_-n2؇Cj%)ěvrvśşđ­;Vĺ.ď‰lŃظg˛™XjI›% |'Z’mđ$Žá?Ŕ„ݶ/ýß˙S˙őbśÚ¸ řĘ}UbăŰţď˙©˙ú±Nm?Ü|e>ޱ·G~nšÉ?ůgů){{Ü>,ߪ1ąŤ;{Ü>,ߪ1ąŚŃľ#ĽĘ|/†ß Ś0aiÁ# Ś0`B0`ÁÁ# Ś0`B0`ÁÁ# Ś0`B0`ÁÁ# ¶`Îz"–š­G2§a´ęż›5$śż{żńă?,ĚůŁcýLGŕŔ…!Ë3>FźčŘ˙S,ĚůŁcýLGŕŔ…!Ë3>FźčŘ˙S,ĚůŁcýLGŕŔ…!Ë3>FźčŘ˙S,ĚůŁcýLGŕŔ…!Ë3>FźčŘ˙S,ĚůŁcýLGŕŔ…!Ë3>FźčŘ˙S,ĚůŁcýLGŕŔ…!Ë3>FźčŘ˙S,ĚůŁcýLGŕŔ„ßQ—UĘ˝&ߢK­żAJED±hmŐ6Lt•¶5<[[kË Nj卉u]žĂŤ9é·e7&6§'ˇÎŔŐ%A ŢŮËJ”~%;äcŘô´RëŐ™víńHżQEBk/ÇKî¶ćé¦\Üą˝HN¤2ڵˇzTTx‚bl’ÚU-*§|D› 6©Ńѡ ‡Ů­K’—spď’¦KŽpśëUZ§gěů¶ó—} -˘QĄ•@Č<•ÉÝýÖ•ˇYwňROxŚkG®léŘ3ć®é¦Ç‹MśäÉf-‡›­ ©ˇžZV ÄWÄq v}N5HłM˙GąźŻ 2†ä‚· ÂđFáڰB’¶ČîRR"jű#§Ths)Ňv™]ťKť×Dt'ł%ŚťKŞ:\ď•’J O,OŮűŐaKjíŁ.iy¶S:Ôă‰Ö„»âTž ř ü#Ók–Şö{[»( ]qŞ#’\h˘dľĘËje˝L€TV’”çQË#‘ńlZ7djřĽ`*BnZ–7m$˘a˛Ďä”¶Ţdp#Q*Ţ·­čt˝›Q-E^ôÉ+¦MŤ*\µ˛€f)§ŇúŽďpĄ¸ťED«Š•Ă,€*ЍĺÝvłŽY-ÓăÉš«á¤IŠZ…"uF\ťóę-ä””6 ?ŚAĽq*ŠćĚÖY ŢôöC«e˘…@PZŇĐuI7–a˛•˙2řF'ljÚvŮfßb˙e¸,[Ő 2 ô)áŮ!¤!zÉ-2Če( ˇkÍZ”U‰šžÎ­Ů©Ţ›¶—X§TXmří$ĺËi¦{35şĄ©ĆÚhˇ:ÖŁ’ČŐH*!T¶w2ź"|KĘ„üX­˛ăď´¸ m¤ĽHiJPo A ţ1 ńŠ]kf±]ŽÜ›Ö‚ĘĄ°dGŢ*C­…•$–ň ((přAřŽ›ŮĄ˝˘‰TKľ“ ş}JşD7#ˇČńZ‹ qZŽâC©S¨JśqäťI!ĹgÇ,e˘Úv͉J¨N§ÔݸgĚĄ5I ěűĂ®Cď<ńÔ´'íŹKqÇ2Ë‚R:@Ŕ˘ĄJŢśŚ«tŞŤVŤ1(–Č}Ó$•2\AVéćP´¨fxĄ`ü â®Ú¸ řĘ}Uaňݱš-Ľk1*µHâ8©KeŔL§‘t\Ë2t€„!9÷’”Ź{O÷źOެnŃżš‡ćłO~UţJ^Ţ÷‹7ęŚDąW¨)FTfŇ^u(@‚Ą”:¶Ćjß'3ÜgŢřq-o{Ĺ›őFe÷‡ôŇj{'â9…ŸŞĆŠčríswěű-îYťóčţŚW_–g|ú?Ł×â/ Űbź6™e·2ž%-ôV)i Ep!×ŇŞ„t©¤•))îŇJR‚HQ€N9˘f)4ŞÂŮČäTűË3ľ}ŃŠëđrĚďźGôbşüS÷=ďX§] ŞK¶k4ŘÔ«J±Q0§KŚ9l®“–á×@)IÔˇĂxrĎ5c->ř¸Y¦Tćٌ͋R;ő<»~e)Uş]A‰©**T„©-T—ęÉďďŁŇµLń4­~ĘŰĺ™ß>ŹčĹuř9fwĎŁú1]~¬:ĽšőľšËči–帥1˝Ü–źĚ˙·J’˝ihVm÷Ej™Ĺ Ô`iTł;Ug¸î©”š$Š’ĂĄ”ć–Ĺ8§R‰wüdfr9€÷±!şÚ'ÉŰVGŐÂfŇ}ĺM˙§ţ"qpaŚŹŤĄ:ÔW ’”·[Dů;cĘČú¸7[Dů;cĘČú¸mÂEüŞíCj6ý·LşŞT’¨Ő)ŇNb*ÜyĆ^€†Á2t!ßą’G`ŠóĹ4GŠx­­ÖŃ>NŘň˛>® ÖŃ>NŘň˛>®*ŰLrҤÎ[•M‘6ťq&§VžŠlI%P=.Ęt!Ie[ĄÉB[©I m.ior‹´ąw%.‰íFŹM¨ÔjíTÉúÁjn ”E}mIm—TęTë¨-ÚBŰ%GAo"b¦ö6?e/şÚ'ÉŰVGŐÁşÚ'ÉŰVGŐĂ=9ç$ÓŘôGˇ¸óIZă>P\` BФ•ńŇĄ ÇGfÄ_?[ř¸Ąvý¶G†ôš»ÔVŢť+.ľU™Čç©HËŕřţö\uůfwĎŁú1]~'îĎp$řúĂ Kćb°¤E›ŚÓ@T§,ÎůôF+ŻÁË3ľ}ŃŠëń„Ć`&íşnŞłŞŤ1C¨74ę¤)Ҩ‘ä)k,- qeO”÷D¤% Ň”’˛ş‰§Š«g#ťîč¬~YťóčţŚW_–g|ú?Ł×⩡\—=LS¨PfŔj ă•€ĺF|%>jäÄN¦›qˇĽp8…©IPH)PCFý±"äslu–jsb¦-ękžÂ\ZcĽ·e…şĄ®-¬n’VťĐÉ;ł®×ń…v«©Z»˝ĘÇĺ™ß>ŹčĹuř9fwĎŁú1]~"đbž*.)~:>*J=rcŃúg0µ8 0çÜ8¦Ďţ˙Ć˙ĆXúĺ™ß>ŹčĹuř…ĄűŤúY_µżŚŘ“5ę];ęS–g|ú?Ł×ŕĺ™ß>ŹčĹuř‹Ĺ3G—RD•ŐwK›Ĺčś±*¶§i…“WS‘˛F¦Žá?čŕ%e*Ío›1ńVdÜw|ÝľąfwĎŁú1]~YťóčţŚW_Š’Źr]3Şh´SKŽ©Ň+ëzTôż'p•4˛‚”o^ áĐ”ć rJJs±«>جŞ=ÁŘÝŤĘÔö&n5ëÝoJôęČg–¬łČg—xb ÄaĹšoŃË3ľ}ŃŠëńŠ}Ă*$Ą95’†SŠ ¦Č3—úGŕƆ4nŹ{UwÔ85»ŐDězďV…r3pëS!´TQBŰIQâBT@ĎđđĹo_ľĺÓ*nĆsrqŔ€…y%.-3˝Oă>ö,ëłßUOÇ^őÎ(¤{ă_üďţŇö6MDt8ujöÚN ÜчTPś8Śl·˙áůëđvËţżć v\ö˛†Ű~Cú”V¸ď­Ąč\ĆP°‚śŇ˘3Ž9훌H^¶'łú5Ś.»Ü+Ľú«‡¶[˙đüŔőř;eż˙Ě_Š.ł4Ů’¤Ş—2h“ŞKbd×Vň9g ‡\*RB¤IJHęŐŽ%ÓYůˇć7®!čLĆšíLŠäżąËrń*^ď4¬”¬„÷$j7ńȨ;<–s˘4S\XöŤűNÇîŠří–˙ü?0=~Ůo˙Ăó×⢳Ş5IŻUâŐ“=Lž"ĄqB‚]Oc˛ć˛I—IÓ™ÓÁ9«-JšĹ ÜpiUˇšF=¶3ęźĺíEČń]}a%- ­@@ăđű~6fíLYŹFp´VËŠBŠ`‰.oĹ[\÷g‹ąęśK\~řgřÓž±Áă#Sz?áín–8b}Sżl·˙áůëđvËţżć¶ ·ó °ÓU7Ń&ŞPězlĂçŇ"ČV˝ă|’•T3Óđ÷°6n14ŻŮDmŁa˛ŐŮ;¸ž&Šěí–˙ü?0=~Ůo˙Ăó×℥U§A·%©—Ü‹ţµ1ŁF©Ąéó"$4’¦ÔÓjSŹ­KKŽ$M8•…iHN3Ň.z˝]šk4ćb"T„NqŐJeÖŇč‰! ­’áXVjÖ[Č‚•ž8ąĹ!ş'Dť†Ż™Ä kÄpęéŰ-˙ř~`zü˛ß˙‡ćŻĹEłgß•łŞ™/8óĎRŁ-×\QR–˘ŇIQ'‰$ńĚâk3qĄV~Ďč×°:ěíŢ}SÝGjSŰTf!±éSe7„=M·©jË5(:˘ăŢIÄż.m›íŹ:‘ő1R˝ď†ßüuÖĹنÙŠáRV­ #%–ł©őQĽą´No¶<ęGÔÁË›DćűcΤ}LIa~ý©MŠş5&ž÷bČŻÔL0 -Q#?!N! *^ęJuf”©aE+ (Sh‡ŠĘí&Ń[OŞŢĺ͢s}±çR>¦\Ú'7Űu#ęa0]î[q« ťnę—M›Oލu j JTľĹ§KL˛ód‚PBrÔ…ćî•'FÝhnPnŞm·‰É®DŽ¨âĽ…MuŮ KAqŁÁy„¸˝%Ĺ–Ő“n¨7’S®o"â•ŕ¤)RΧř4ŕš9shśßlyÔŹ©—6‰ÍöÇťHú’ÁŠßÄĹ;UÉäę}TÍŠĺj}»>my¸ HŹ)†™D­H(Z$¨¬žh8qďçÂ7iţŕ3ă)őU‰ëCŢ­OÇbú’1´˙pń”úŞÇkD¸şb8Ż!§ˇ2ŠĆ Ř){{Ü>,ߪ0ˇW¨Sâ8–ĺNŚÂ˲TëÉI#˛žă‘?€áľŢ÷‹7ęŚM3Z¬4ŇZj­9BBR”ÉX ĽĎ€ĆYČWŽskĹdtč miąU|µFçh>rŽśBßK‰[ٵÁAŽăs”U9 ŚŮp:Ś’ŰíCmY•ÜRAĹáËŐÎy¨yŇúprősžjtľśbT5´łŤCPنüۉ×=ŃfŐ#"N°Ő)Ć‹¬? ¸Ţkâ2RšhťHVa$ µŤúUƧˏ-©Íż*,!©Sk.Ę}* :ĐÇ\RŠ{$R ŠPDś^Ľ˝\皇ť/§/W9ćˇçKéÄřC™I'çč©ú|›j ąŇbÔ ¶íJ@“)]–ńŔÓmdUîld2Î}ňIÚĺŞ7;Aó”tâÖĺęç<Ô<é}89ząĎ5:_N#Á Ęş¸fč©;â|…±" ‘ĺI}Mˇ¦u+qĹÁ)2ĹŃŚś˝\皇ť/§/W9ćˇçKéĹŰ+dR©Ś‘˛)k˘Ç…«ÎĐ]vŕ¦×!ÜŐšúdY1zš«Ţ4úZŇ´ČeŃ÷QŰ €ăÇŽyząĎ5:_N^®sÍCΗӋ zqL´ůş*Ţö˛ëMŃińíY‘SbzęOW'VDY˘ah°_˙sÓŞ[.:ŃJ›mÚRŢď5ÍŻO¤@‘ZŞĚˇ\ÎČaŞť.¬Š“Ň}M¸đqRˇĄ´ëu´+B°ÚŮB o/W9ćˇçKéÁËŐÎy¨yŇúq7U>ăŃjÓ˘· žÄ&Tň›ŚŇZBź}o8B@©Ĺ’Ą«‡(’OIĆldĺęç<Ô<é}89ząĎ5:_N#ĂýU|'ęP׫ěǶd˝!ćÚm:5-ŤwiIÂ-QąÚśŁ§·/W9ćˇçKéÁËŐÎy¨yŇúqGJŐ-ňƶş*§–¨ÜíÎQÓ„+‡:»[rxľíČ}öÚTV¦Ć|˛JuČő·şu+-C T˛ťD“ĺęç<Ô<é}89ząĎ5:_N!˛vw;˘†čű&ˇý“D•D‹ ŕ®QÔí?6 ˝oşí±Łé@ܧu%KŃšJB–űśĐ%)ŃěÚ}m5X Ĺ}öéÉC´0í©Jm­ßrV­'N`(€@$bëĺęç<Ô<é}89ząĎ5:_N(s ČóôUO-QąÚśŁ§-QąÚśŁ§·/W9ćˇçKéÁËŐÎy¨yŇúqfUŐŁ7ESÂŞSŁDßTb7ĽT•Ł[é’eż’†gü8úĺŞ7;Aó”tâÖĺęç<Ô<é}89ząĎ5:_N$̤čŕO˝ŃU<µFçh>rŽśVPí Qަ{wŐ®Ą*bćÎÇžäMúÜ.—;U2Č;ĹqÜŻ% u/W9ćˇçKéÁËŐÎy¨yŇúq-”łąÝ¶@·sú*R›ͧÔ›Tßcł7kěěôöSé}ţYwNˇ*üd21·C“mQčéę„aŔŽÜhÍvXVí´$%)ÍJ$ä’N.^®sÍCΗӗ«śóPóĄôâ<ęPtuw˝U<µFçh>rŽśi\uzK¶ôöŰŞCZ×ÄĄ)’TJN@ ńqňősžjtľś˝\皇ť/§‚” 3tEŮ盛ăŻzçőµ‘#ÜËD‰L´˘§ČJÜ $vKÜxâ÷yÇuNşµ-kQR”Ł™Q=ňOÂq¸Íj°ÓIiŞ´ä! JS%`$đ>#Á˝mšŃzM¤ „s6ÖĘo¦ –yN›Î|˛zqz·ąC4ö+4Ö5<ŰŠ[ĘZľáAi)-<Ň’ ´ …|î<:˙—«śóPóĄôŕĺęç<Ô<é}8Ę$(jŃwźí]¶–şĂúżĄĹ¶Ý+“Üy©÷ ˇZ só:óčŇ .ż)Ó ¤‚žéyTN7%ÓhLĐćF§ĘŠü‰: ]B¤ëË^…jJwĘZśo#¨ˇI'vĄk '0{—«śóPóĄôŕĺęç<Ô<é}8“$I­ľ‰-ö‘Ťm‘µwů…Ç6 h4H“‹˛©±Ü¨L쥰ÄŇňZ;¦Ű9ş°•8Ąnµ©j•,ç™îŚ÷)ÓyÂ/–ON:Ł—«śóPóĄôŕĺęç<Ô<é}8!SRýŞ0ÚŘ;<˙ĄÉŐšŤ=t‰hDčĘRXJCÉ$ť'€ă‰{šŁOEÉPBçFJ“-Ф—’:ĎÇ5ËŐÎy¨yŇúprősžjtľśG€Ą®ŠâÇZµs×ú\ŻĘtŢp‹ĺ“Ó‹ś‰ň ?O­ŃŁąĺ<-•?’ËjlčyĽ»—@ęâ1×ü˝\皇ť/§/W9ćˇçKéĉ ‡tP˙jËŰeĐűEưi°ťLŢ]¬Rd®\”JÓ÷°śmĐŘh¬/˛¤’ÚRžŕ§† sÔqťTk=QQn0¦Đµ+%Tuę Ţ%dŻ5ˇÂĄˇYĄĹfĄ…(’{—«śóPóĄôŕĺęç<Ô<é}8źsŞiX<8>fżpą>”ő›KŤN…2+Q˘2†Xo˛´! %#2I98ž8Řĺ:o8EňÉéÇTrősžjtľś˝\皇ť/§Őă2hö´Asţ—*Ĺ}™×=O7%ÄŐŘpˇ•¨%$•+!đ 'ŕĽ0őËŐÎy¨yŇúprősžjtľś1˛vE-,‘˝˘1_hÂëý$\-m*ź\©AŚÍ™OóN›—"޸O@x ă%1Ţ 9)aA@$¤”(- Rqoňősžjtľś˝\皇ť/§Ô;Ҧí ]őţ—=Ú¶5Ŕýbl«¸ď7“ťvkuó-×,Ča!®Âa¶ĐJVŚ Nµ­ÂÁ_±"Tę’ĺ"·U‚Ôé-M“6ŕ´ě¶Ca™9¸ŇÖ‚Är%”ęB‚–rrősžjtľś˝\皇ť/§áÎ*K° uý˙Ż©H¸0őËŐÎy¨yŇúprősžjtľśWÂýSuďý>żŇŠ´=ęÔüv/©#;O÷źOެ6Í©Ôf4™P•!Z‚]yKüyßâpĄ´˙pń”úŞÇWE˛ÄĚ6ýWśÓ1ďáʼnJTz/o{Ĺ›őF#gÝ´ČrĚśšPRŇťě¸í„­H*n–¤¨g—Á‰+{Ü>,ߪ1GmÇßSĐ˝ű\Śvô&ڤ&ß&?_©ŕF —=6ůx s0ôóĹ[Ţ(.ǤbuŘ=ĽPţ]ŹHÄë±Î_ŻWÝĄŐ&ˇ—¸j†â­R$¸Ďs+€=Ҳ9Üń'ŐFöKGÁm§»g“¸s`%šbećŤţ<°]Wíâ‡ňězF']ŰĹĺŘôŚN»Żŕ{|ÜyPËČ©ÔŰĺl°Ą1˝B‚ĘRTTŇ8„÷kČgĂT…żPĺJ`šݡnş–V ăiqIC‰9 Ň´€°G ”2'ľkŮMÖZíľNáJüß^čT»KÍ4TŹ·˘éŹo?—cŇ1:ě}ńFąnŠ˝šTš#ž”á-©˘ŢčZ ˘7*'ŕ™9Îvö!˙ ·çŇ?\Ür˝ öv[GÉ_C;jR¶hÝ%f=‡n§ÓĐ.…“4y aę´$8ÚŠV“ĽŕG˙†1îˇsĚí>¦#îď}üaŻŘó ”a®™xL;¨\óűO©u ž`˙iő0…´K…Ë^ŘĺfioTÜěŘq—PŰŽ™Z`iRČNc{ )ŚŠ’ˇňť"ąKĄNŘ5\‹¤TY‰1/GŐÉnÍIK‹e+q Yä–”ÍIIV4Ş‘1Š«gu ž`˙iő0nˇsĚí>¦°b||SÖx—.]íTµáČ2%Ň!Ĺ•)Ô †€§‚ ˛%Cp˘xe’“‘'0!—´+aäî¶ĐŕCőm¬%I I)SŕŚŇAâ>AlŰď…żQ\ěRűQ÷ÜÁý‘śD´«"D{OµŽ%€®í‹oü«•űĆض˙ʱéX?Ľc–đ©Hąć·jł6ĄSŞ˘Ş Ú·©ÎFé+*dޢ´”ĺ«9„‘§ť#§oóę­R»?¶-żň¬zVď;bŰ˙*ÇĄ`ţńŽC¬WU ŮIj 媊ßÚÜ­ÇťĐ[đ JJ‘#0´ç ăn‹9Ů‚KRC2!˝ąy ¸\F˘„,iQ $iZ{ésrĚ‚F 4őőEJëض˙ʱéX?Ľce×}*ý]E4DĽ‘M«[ËF•<idˇHR‚‘“©ľYډäĚ^?ý?˝Ĺ¸?-Uű,¦ Üyý§ÔÂôŻ÷§?ç?Żńŕbią†Ľ·/E°Ai —wž`˙iő0nŕóĚí>¦+LJrŢJ™BÉKm©ő„¶•­A)+Q  IĎ€Ď)®4ü7Ť53ŘfS±“1!éŇ ˇ‘ďîÜhžş*d3ÄkÉŠWÓŃ-M{¸<óűO©wž`˙iő0µŻf;§˘›†­«vá¦W*U¸”ÇV÷ Ôą:KĄ(qĐĂ/ń)ä§2«,ĆDä«Ö"S\Ó(„'$’âÝm´ć­Y ֡ǹWÁ„źcďş»Cü˛wöXúŰ߸éţž?«#ŞG:wD¨Pâžö¦mÔ_žFóčÝfmÔ_žFóčÝf9ĄW (ż ˛ěwµAD¦¤• ÚÔĄ¸7_óéiJgJĎ cj¦š…Z>›ŮS‚ÂuýŰRůdéPJ˛Kj(äN¤­9ž3mËa–„;>«Ş=·Q~yĎŁuĹjŢ”k†ë«ŰôŇęäŃcĆzS™ˇMůwBR´¨ę#r˘~¨q'09ĘT™&§*™S‚ÄY‘Yiň#I/´¦Ü.%=Ň«6—Ó–ZxśČžĹOáVüń G뛋1䚨đČvš­‡nšSJyćŮYJUˇŮl!@Ě‚˙8ůöÝEůäo>ŤÖbźÚ?ľ×Ľ^7ř âľ·ou=ź¦čTGŘűHSs |8@)i#1©KÔŤŘŕVAČj­ă“Ľ,.˙ňş‡Űu瑼ú7YŚSojHOJ~c¦S‹Ń-…«Hś’— '!Ţ“Žu·k ÔíęMMÝÜUŐŁ4ëL)ĐNĄµĽĐ“ĂQ <y$半߸˛ü]~©ÁxTřHdTwŐtMçW˛i7Df_D:Ě&¦°—´!m¶ă[ŃŻ5iI ď÷Dpďś|űn˘üň7źFë0ź`}ëv‡äŚoüiĹ3xÜ,Ű©¦ą&;Žł:pŠăPŚ’Ű‹.«>ÍG1’u+ŕČŮÎ Đ,đ 1ě´ĺŇŢۨż<ŤçŃşĚۨż<ŤçŃşĚsMbáf ×H ¦;Ź=T[n%CLTĄ§’ż‡5–Ô8gĄg>ă#3ŠŢ JC;»ęŻŻű}»Ş‰oĄĹ˝2˝!ÖbîiÔ ¶ĂŹ)N¬é[ |$‘Ă,Č•ŞW ÓßSR––˛V§i°ŁĄ*9kX' ¤ţ|sÍť÷ŔlűÇçă¤âĂŰçűÜO{ü(řµłf©]·ĺźDőíş‹óČŢ}¬Áíş‹óČŢ}¬Ç2ŰWD:¤z«ŹŁ°9"[ě>d8Km­i‚rűYĐľ' …ŚÎ’q«F»^¬Qˇ˝OُЄőĘÝAšégtŰ–§”˘‚ @ŇŁ©`w‚”+mÉľuő]Iíş‹óČŢ}¬Ć R÷Ł\0kŇ驦­éÎB”Ą%98âmĺČQ NNź Č9pČž~Ł˝=čĘĺ(-Ä…””µ#|ÚĆ@…!Y$‘Ç#©)9ŔŚ”]˝ŚźÁÖŃ(Ą˙ăâaM§€V=! @–tFoýО¤ß48ňŹ!öuĄ”8Ű•iRD^Ě~ |{·~yŇpúěs¦Ń˙„:÷ăI?â« iÎÇ}pă˘DŮ ZŰmÇKhANĄ)y+ Ň2’T8e™±#ČqďŞů{ý«ťť ˘´'á˙jë/oöďĎ"zN]ŰĂkV•·lN®Î}%׉.+Ď,KŮ’O˙ľHśs-1ŮŽ°{:"#<•dRŰŰÄ(d)V@‘Ç.)0x‘1;Pţ+&żŐŇ0Ă ”Ŕö®qó „Fňđwź ]˝V©G§ .OrŤ%JZśB€ GĄ8¨ţqíş‰óŘľ}¬ÄfÚ}çĘţ˙ďc-ÁQäŘH[löD™!Ěi.¸Łă‘!)­DR„­Y9cć:kOÍIĎ™xB˘‚›¸ů‚ľˇ\ڕѾۨź=‹çŃúĚۨź=‹çŃúĚs9¸Yv‡l8î9"¦˝ĚXŽÚÚTĄ6éâ( ąŻľF…¬’vč˛*®ďQU¦±ÄdP¨Ň÷í,řfP… ¸‚ś˛)Č“O)ŢŐĎ´ćŇźV× Ô©L¸jčZeőB¨_ŚÚQ·§˝MvŁ­Ą6ăHi·l‚´¨÷ENڇĒN\3úÚ¸ řĘ}UbšŘ?ß,×äŚßÚáâĺÚ¸ řĘ}UcčľËMľnďŢâ~ä.^“hl€`Ąíďp řł~¨Ĺ ·*Ť<^)`ĎŚa·Pę ÉÔÚŚ§Ô†|•$ńř?/«{Ü>,ߪ1VŮ>ËäÔ›V´,§&Ě=’ű’h­-×çvTµnŽĄY“™Ě“ŹI˘´«´tÓâ5–¶ăL~‡ŽjPLÁcK©ł áčą›” |ú7–ON#*0¨łg»-Ú’BŢěMA/Ł!ŘĎ)äeüęQđw˛ďă©;QlŔŰĐ-u8;QlŔŰĐ-u8ôOöÍń,ýßJa\ÖčV4ÔEéý®[• ŠüZŁ*©%<ŞčyĹĄô2ŕm¶Ň¶Ďţ•'t…Ä… ţ,¤#JĄGŽÜxňa´ËHm¶Ö”Ą  ŕÇJv˘Ř˙¶ Zępv˘Ř˙¶ Zęp7Ű75Ö„°Żţď­pÄ©:¤PĹ<żµÍܡçŃĽ˛způě>q·v“}¸ŇŇ´4Ś”“Fňíž)ţtŽśd“±Í‘Ƕ˛¬$8ÚŠV“AkôqńÚ‹cţŘ>k©Ç L< Yęµ\°üݾ׍:âłI‰TŠâś«St3SK%–§ÇuŐ%Ŕ´©%-ˇj$+1ÜńË.‰jĹ• k÷Qť>-YUg¦H—92A†¸`¸–Ň”RRiGŇNd¨©ŁµÇü °}×SµÇü °}×Sżq5±ŐMÓiK]ś»D犝#§.Ń9âźçHéÇ˝¨¶?ŕmčşś¨¶?ŕmčşś[Äż/U ÍŃ-lµö$íúű~3ÍĽŇ©]+mAI9*pŕGáĹ#´Ęť5۵eş„U„CÚ´Ľ“ĄIŚŇT“Çľ#ŕ Śt…“Áˇ^Ő»^Í Ň)ŇáC‡*¤í.šÜVť*@i$Ą)+RwN# J€Í'c›#Ź!l=eXHqµ­&‚×?čâ&]#śZýV ZÖUÉ]ťç‘üŞzqŠU9NG—żU.˘0Ř}˝N¤†űůä5Ňr9Ä˙ńŘ˝¨¶?ŕmčşś¨¶?ŕmčşśi3ď?ú}Qm®(U.#6Ši­HŽ\vlg^ ËÓˇ´<×r•ćpËiHPÉJŃ«-GT‘O‚Űżë4ČvC›×ßyÔjqZRHH %)ď|y“×˝¨¶?ŕmčşś¨¶?ŕmčşśUłŽi¨‡ŐM¶âą7ł üň?•ON/ŹţźjJčUő%AIUč˘9‚;»QlŔŰĐ-u86wN±g"ŕłí[~“›ŞŞ]F3Ö؇-ĺÇaK%°‘­%! *OdR94ŚÁʵÂČŰ·öV†ŕ]±|É®Ń —¬ÓČ+9)óăă—(śńΑӌ‡d[fŘ Žř4şś¨ö=ŕmčşśxgčÉg<“íý%nĺńąAnŁbŞĐŠâ)kkL´ +SKl+?äëÔ2Čćdz㣾ô‰2«‘dI}, <ôä(ˇ ďN‘™Ď‰t“Ç.äpÇť¨ö=ŕmčşś¨ö=ŕmčşśSUJ˙˙©Eë°Xůr‰Ď<é89r‰Ď<é8ÉÚŹcŢŘ>k©ÁÚŹcŢŘ>k©ÁŞĄĚÔ˘őŘ(cĂvˇ´ZZV…Ţ.)*IĚ(˛ ü#6÷î:§ŹęČÄöÍ}¦ĆUz‹eQŕSbŃjć$ÄŔ‚¬='±ŘuKJR«ąu´ (9f’W¶áomŕ”ÄkN5´¨![îU'ľÓ»Ô—JRŰ+tŻ<ÉĚ“ŢfŻS €@cZjeH/ ‰WwµQż2eb}N#¬"I‰“–µ[Ă’Ý3 ¨<­'2…8žńŃťdëičm–$CušcN gZäv<Ç}N÷9)N’OţĄg–yâĹía¶O±}//÷\¬6Éň/Ąĺţë‚ĂÖă1.xĄ;r„ÍŻt¶äPă4ÓÂ$çŰmÝÖŃÓˇhŇu/=yj i< d­ű‹/Ĺ×ęśNö°Ű'ČXľ——ű®>%l«lR"¸ÂٱÂ]AB«ËĎ"2ů® *DĚ6ű`}ëv‡äŚoüiĹ;sR9ZU+x†ŤZÝ”ÓĂ0ëjŚű%9dAĚş3†Y˙1»µď*VÁíëJ€Ý Uf™JŤN”ąŇŢj.HŠYqhRR”sűRžţg˝¤×}¬6Éň/Ąĺţë‹˝®&ˇg—Ť ŚŁŠA¤ÚÓ"ʦʑ7˛¤Ä¨—^}÷JÜ\tF~;) )Ě«'µĂ[Ź(}ÖX™ŁĐáS$©řĎÔ–µ  ‰UI–`đKŽ(Ăż–}˙Śá—µ†Ů>BĹôĽżÝpv°Ű'ČXľ——ű®)aë@™—Teť÷ŔlűÇçă¤âĂŰçűÜO{ü(ř€ŮţËvŹjÖÝĹq{Vj D‡śú„‡^^ň+Ě€¶>éÄźşďâ{lv¦Ón”›z-¦)LťL.}JKrĄ!°˝IDu% dQřÉ㵓b‹8ŹÄ×e›=ĺRăíĄN–j(md&LW%9% ¨iîČQJ UÜčv@t3Ă TéÁ©đĚGçÇ“P)e×T†]fT­öEa$ˇcKg=*ś» ´˝v°Ű'ČXľ——ű®Ödů Ňň˙uĹl=?ÄKâ h榨Ę]U¸Ť<Ą’–˘­N%´äEj +$‚sŇśł#–Ą;{?­˘ţQK˙ÇÄÄ?k ˛|…‹éyşáŰbö%Ůjlęë§Őůʵrˇ"lfâLuQ\VYJVâš OtŃ$„+ GÝlZđJŤ˘64łˇĂÚH?b©ÝŁ˙uďĆ’ĹVjń%*|zśË’Ł6ă!—ÖPŰp «ş”[I"2eÄ)6Mod;fŞVeÔä .Í·ÜKu9!KQQ8Äĺ™řń«ÚKl?ŹéI»cľ' X•ňžÍio荆(Iâ7ýpI4Ă=LT·T¬Ăl-KJᬨç™ĎJrĎ,ŽYť¨•Ź_ęĹ™ÚKl?ŹéI»cJăŘ×jôtDz[L¶TŮZj’ÉNcżţíó° S-ěΔdË":wŤŔů«ďm>óĺA˙÷±Žz¸č†łV€dşŕ¸RĚ—xH:ÚҶČP }$jëÁí˛‘zV¨ĚŔłăĐ\ß&bęÓ^gBB›RCa¶—¨’Ž$ĺăži«{Wí“ä,_KKý×&ÓÚILé1,Í”µ…Şúô(Ś ˇH‘í©P)„ódSꊝJi÷–°BŮ)u8¬ÖJÖě…jÍE%i=Đ13E]eÍęęĚAŤŢ 3ő˝—5)Ĺ%üŔ ᤝGVIbí_¶O±}-/÷\«öÉň/ĄĄţëŽ4Og4ĚAřáq¨Żß‰ÚxÖ¸¦°Çlď–kňFoípńrí?Ü|e>ޱ^ěOf÷Ők꺍şč˘?Omşd×ŢZ–ăě8 2€ «Žgľ8bÂÚ¸ řĘ}UcéľÉĘĹ•/0Ł…kĚ•ÉŇnŚ˝˝îoŐÍwű¨×Š1ţq†Ţ÷‹7ęŚaľ*Ô¨Őı"§ §Q>¦Ü”©9´’3đŕAÇbÇw™ţRbüůz-|,Tö…gÓöĚ—_§5W–Ú”–5¤©µ…2Ę’U¨8ćý% Ë5¬Ž÷Ž]˘sĹ?ΑӍ7ĄZÎ×cV\©SĚŘ‘žŠË˝žá§TŇśNZ˛9–9‘ÓĂ,Î{Mx,€b˘!^P#Ϭ׫÷ :“n·4R)Şź!¦zCŃ!Đµé —wŚîĎÁ­$ĄĚ3ĐŞ´ĘŐ)ŞťŁŁ ü÷R˘>—šs%ť+I äA#ßb*ÓrÚ·íČth•Č®·˝*}ům©é ]˘sĹ?ΑÓe~bĄÔŕţ˝Ś^üŻËłűIríž)ţtŽśEűC·męëKJĐ»çRT“P0 äAřF0i_Ę»ČýŠÓ%ńŻ÷§?ç?Żń§&»D2\"łO ¬äD¤|ĎŹŽ\˘sÄ:GN>W®˝vÎ%w›¸,ő%im„—źi.ĚŽÓ‹ŽÖńÔˇo!*Đť*Ô­*9 'ŹŔq–3JC˛’®Qe,Ą‚Ű56ĂrW˝Ô ťŰg@Ý ىR»Ł–CAĘĹke\»˘Ëí>•ł) ´©µĄi#PR{éô‘ř1™ŞŐ·3ÍF¬6âä­µ<ěąě­D6ˇ)Đ„$˝Y< 9Ž<1K.¦ĺeąąDçtŽśąDçtŽśE—`Ѝocďş»Cü˛wöX·#HTKv;Śł­ŮO%jv+n’†˛­'!Ý÷ÇŠ‡Řđâ¨mÖ–•ˇw‹ŠJ’s ,?Ųď˝~9#ÔcţÉFy˛Äb/yZWÉ@ôsS+Jů(ŽcęcG˝6ҵe{ ž«Smš<7­Č¦Lš„8 !éu›Ŕ ëČHV¶ R›R•¬NmjH(mEaÇ ±¸+[•Ą|”G1ő1_PëU:—˛ń.V¨(Ôs3mĄ¶š+\âµ ęVIÍYfBR É !96W–ykqÂ2Ő–7Ů ™mÔŞ˛ű`Ö~múďőŰö=×ęőęEó2©9ç×ĺyÁN(¦3BR–Űť)J9|d“™$”Ś2űýëßß•2?a‡…ĹhóN—q%ŐÁIWoЬ*äŘm1·KŤ ©Çł!* göÎ˙ jvÁ¬üÚ/őßë1 wűěŞxóŢąÂ~Ó~ÓdĎŞ·ÂM•Tb¬wŇă)+>ţ•¤( BÖśĆx`hłT˘çZ˘˛ű`Ö~múďőWŰfŃ®V6Kp»O|S䦞ćîTW^K­»čQYŇ|wĆG#ŚxVŰwđGpţ/ső`sE ÷ŇwýEú]ŮŃŔRŮo0•)A$—O$ňŹĂ„Ř5ź›Eţ»ýfö·ďJWôCüfqËt:ś˙lQ.w`OnZb™\çhÄrą"í°áx(¨0@Z2J¤É$'WBĄ‘TřöŻ ăŰłóhż×¬ÁŰłóhż×¬Ç=Öź~‘łKĄ÷žqĘuYu¨ů)D¦üÍ*Ěđt7 2J”ňb‡D¶ć\7mRµN€\‹RAě÷”; Z’÷7§2   Rx‚\PđJ6‡ŠÜŮíÝ\­ű!âÓĄK[pkL°Úq{Ą:%DHqAJ9¨%D{Ŕś˛ÔsÚ¸ řĘ}Ub‘ö1˝P‘¶j аpT°^\°ă{µ‡L%z“ŇugČe‹»iţŕ3ă)őU‹Éţuži“’upţT˝˝îoŐ‹«lźeňjÍ«ZS“fÉ}É4V–ëŠs»*Z·GRެÉĚćIÄĄ˝îoŐÍwű¨×Š1ţpˇ DŚŕq)Ć!d&‘‡˘]íE±˙l@µÔŕíE±˙l@µÔă{ w¤ű†Đm˘T˘7FŞTś‡.'aűŞf<řŻ ŚŮoą …fź»Č”—Fˇ2óßô§»QlŔŰĐ-u8;QlŔŰĐ-u8U¸îéÔű¦§Qmí«R6”븄ľ§’ťJěfKRRrq×§SچÖĹeVý±Đ›­±sO›“Ô×ćk“IICĘN_k×™RPI!ZTTÚ+ šUIx[¨¶?ŕmčşś|Y0ěí[µěÚ "ť.8rŞNŇé­ĹiĐň¤’JR’µ'táâ2Á‘$¨ (lŰď…żQ\ě.<»a˛ˇ2 g=ô)’NÇ6GBŘzʰăj)ZM®ŃÇÇj-Źř`ú®§÷wľ‰ţ0ż×…‹ç–ý«Jö»î‡q§NŤćďZw»­çÚ÷Ű˝{˝çÚ÷š5÷:°Á*ÂÚĄx—Ö‹cµÇü °}×SµÇü °}×SŠęmŐR˘Y“%›’ą.T:µ!ąq*´fÓRЇ§´Ëča¤ˇöÖ‚â[-¬)iwC®w!vŹ´™ëOkNŐ ö •[©˙¬(/Ä˙Ic±w'˛™N˝;Çs ĚwCPűśTËĂ|Ő„h‡żéY}¨¶?ŕmčşś¨¶?ŕmčşś%lŇą:eôí*5~á­Bjš©pQ“O~Şq)ŤşGcG+Cˇ2ő+°‘š3Év,ŮVUS0đ{ôQÖL;…{Ví{6H§K…Ş“´şkqZt<©¤’”¤­IÝ8xŚ€pdI*4ťŽlŽ<…°ő•a!ĆÔR´š \˙Ł…˝›}đ·ďâŠ/ëť‹î÷Ń?ĆúđpčŽn ±#9¬k±P¨¶?ŕmčşś¨¶?ŕmčşśoa“N]‹&÷ŞŰťŹoň"ëp߉9/ľ¸él:óKKa·”Ú BśFiX+$­ĆUyJ)«µÇü °}×SµÇü °}×S…YwŐN•´Íz=N‘$Ą"IOĂ ÉuĆP믭–ÔҦ][ŞÝ¨6ŇuŤg4†{N¤ĺb܇Su†YT¦ő€Ä¤Hecŕq§SÁĆÖ2Z’IJ’JPsH¬3ĹIßj-Źř`ú®§ÎéÖ,ä\}«oŇcSbUUK¨ĆbšŰ弸ě)d¶5¤ˇä!EIă ŚŠ@'{ ŢĆ/~WżĺŮýŽ2ĎB 9íß·ěť-Ä} ’;"Řř$6ÁwÁ µÔŕíG±ďl@µÔă~WűÓźóź×Śxń4ÜĂ^[‡—˘ę-!jvŁŘ÷¶ ZępvŁŘ÷¶ ZęqťÄşüȰšwre-iSÁ!E¤!§QJO­-á™đc"i­{ą2ÜIÓˇ2wk^}ÖŁ­ @Ëî2sű˘UŢşöcşůSpŐ©ÚŹcŢŘ>k©ÁÚŹcŢŘ>k©ĆŢ öcşz"á«_fľÓc*˝E˛¨đ)±hµsb`ADV“Řě:ĄĄ) ŐÜşÚ ”łHI.îű؇ă’=F1T{}ŐÚ哿°ÂĂuŮł*MîcÔ+ ¨ăęe„·sÉ€Đ<˘möŇTsNjÓ™ ś’ő0É‹®'iěłeęsbĉůGŚË.Lt=%m¶§ÜJÖGÝ+BśĎ’‘Ţ ?cý™üZŹéäĎŢđ}Źögńj?§“?{Ĺ.?Ru˙Ń:bĽłľů óń5ÖźŤ˙±ţĚţ-GôňgďxÉcZv]™xÖ)úś5…B†őL9X‘PRX+#‚ă®8Ý&AŇ’ČÉI%ˇŮuj¨ř–…(ź®Ź|Ő/w×8‹¨Ä‰>žü ń™•SJeöl-·›P!HRO$‚A Ő ZÎĎ}ŮƬąKuJ}O_łKŠY=ŃQ2ó*Ď<óăž1}Źögńj?§“?{ÂîjkiXF ĄE“JˇRZĄQ)é°#ęÜŇ,˛ŢĄ(Hf˘IČwÉ8Çw{Ô©ř“ޡÂßŘ˙fŁúy3÷Ľ|˝°+!¦”ë¦z„•)Jżf;äžËŕ0\ţĄ7Ă%ěaűÜíżČÚg« W·-;bóŮU"‘DTÁl&™č"5bM?T@„BÜ6â“’›:\'ş $jH#Oěł?‹Qý<™űŢŁ˝.K#rb­ŰÖýfˇ}b‡M¨JĄ»ľ€ü¸Ťşä73IÖŇ” BłBiČć‘ń Ia/ěł?‹Qý<™űޱţĚţ-Gôňgďx]ÇęLľ-¬ Ű0üs;˙+[q˙oúW˝Fq&ť™lúČ»íú‚Ő U¤Muš:^ąĺĎÍţĹ}K!Ą>âFL»Ą'!žYęRAÇ{ěľÁş®Gęőę}ZTĺ„!jfŻPi´„¤†ťO9$ É$ń$ăd·üżŞĹ4AľŠłĆ…"™ÉÓ§­—óŤ5á!1ôdpŚśŇAËJ Ë,ő©Ĺuä›´fĘ9Ž·éʧ]´fĘ9Ž·éʧ]ŤwߥbđĂ8I8eö+ű׿ż*d~Ă=Ł6QĚużNU:ěMlŇłęmłq۶‡d7 ąî±Y ź-O"IŚÖ°ZËA˘ČÍ îHá’ĘŹ]M‰° †×ń Éď÷ŮTńç˝s…űŽ™ĘđQÇ÷q–ň)™ ¤ę-wňҢ•R Ó—u±{FlŁë~śŞuŘ;FlŁë~śŞuذ‹˛–R̸­m“…m·wâ÷?V-ţŃ›(ć:ß§*ťv#®íě>‰lO«\4ʤzTHërcŻÖꥰ8‚7ÇV}í sČNX RE(†Ë€A´ÖÖýéJţŚÎ)„Á„,ÂăŃ÷{–IÝ·» ŁJrČi)Iww±tí&̵Ż&ˇÇąăOĄka¸µ qĆgH%A…§V\2*Ď,ÎYfsTí˛Žc­úr©×b°âYm(Ż{ɵD‚¨0•čFsFó|Ái;·7„•ęNYEJ'>ů'>ţ5$ŰvěŠŔ«H Ó¨ĄÁ-Čm©ŕ¤ĺĄZČŐČdsáĹ“Ú3eÇ[ôĺS®ÁÚ3eÇ[ôĺS®ĹďJ_‡ýa)ěcďŹů!7ö¸x¶öźî>2źUX^°,ÍY»GD{z4¨÷ŞKëCrjd+°Ă¬‡-IH.nxđ'#–`+&§ű€ĎڧŐV$k:ĂőS2Ű2N®Ĺ/o{Ĺ›őF0ßjTjâX‘S†Ó¨‰SnHJTśÚI‚xp ă5˝îoŐ‹«lźeňjÍ«ZS“fÉ}É4V–ëŠs»*Z·GRެÉĚćIÂĂË#8]Ą4´:A4Ů赹v‰Ď˙:GN#«N[UJ•"lŠäTąEš©‘ĂrŰ ZŐć^yć4>łĂ#OłKµÇü °}×SµÇü °}×S‡ř—ź“ŞUĂ3tKŤŇ­îw—onënV^ŢÍi]ňµîŇ÷í ęktv4|ŹÚĆ$h[TwŞ*‰\‹»¨ÍTĹ0©mîZ€°ŇFZB–•:®ů.:â‰ÍX’íE±˙l@µÔŕíE±˙l@µÔâÇÉŐMËst^ríž)ţtŽś-ěµö$íúű~3ÍĽŇ©]+mAI9*pŕGáĂ/j-Źř`ú®§L;…{Ví{6H§K…Ş“´şkqZt<©¤’”¤­IÝ8xŚ€pdI*Qă9ěˇm Ăk]PjĄ/*Ő»˛¤Ű•h(Z%8•ĄRP HQź.§-ŞőtŮuČ­$¸Óí<̶Ì<Ó‰u§Sži%! AI%9)*+'c›#Ź!l=eXHqµ­&‚×?čăăµÇü °}×S†‰‡K=R®YZÚč”[·­—}Ę­čýVl‰0rt©QéD)=’Ă:Ym č :5↮ Ó·|R­§Ęmoč“čĘÜMi93/sĽPĚěn¤÷†g0xdÇÚ‹cţŘ>k©ÁÚ‹cţŘ>k©Ä_ş”±ŐMÓstQ˛\¶ź»!\ ®E B“ ¤ mîĘ[ Y#ż1‘–D Šł1”Ź.Ń9âźçHéÇ˝¨¶?ŕmčşś¨¶?ŕmčşś[Äż'U ÍŃ-lµö$íúű~3ÍĽŇ©]+mAI9*pŕGáõĺZŁ·vT›r­ D§´ŞJI ‚3ŕAÄ]“Áˇ^Ő»^Í Ň)ŇáC‡*¤í.šÜVť*@i$Ą)+RwN# J€Í'c›#Ź!l=eXHqµ­&‚×?čáâą±ë;ÓbCicA+.Ń9âźçHé•&Ű´bP¤Đ%]ŹÔhŹSWKŹK“Ri C†¤„QşZű„Ą!ÇT㉠9,,©»µÇü °}×SµÇü °}×S‡‡ěę– ´nwDŻ“Beš˛oŮ“*•ŘiUg'FfK(ekq” 2Ú! qĹd¦Ô­I^´d‘-jąmPh¦Ä®Eu!Ç_u祶\}ç\S®ş¬˛H+qkQ H*É)H .Ô[đ6Áô ]NÔ[đ6Áô ]N0áňuA‚Óót^ríž)ţtŽśEűC·męëKJĐ»çRT“P0 äAřF%{QlŔŰĐ-u86wN±g"ŕłí[~“›ŞŞ]F3Ö؇-ĺÇaK%°‘­%! *OdR9g˘°× »déxmcę WĚšíÉpŠÍ<‚ł‘‘ń˙>>9r‰Ď<é8ČvE±đH6m‚ďAk©ÁÚŹcŢŘ>k©ÇŠ~Ś–sÉ1ŽßŇWPDp–Ľš˝Ôd+ÚZs(uąh lA çń<$A ĺMbŮeĄ+ uĹ‘©Ůu&–@䔥 BG|’r$đăË}¨ö=ŕmčşś¨ö=ŕmčşśWUË˙©Eë°Xůr‰Ď<é89r‰Ď<é8ÉÚŹcŢŘ>k©ÁÚŹcŢŘ>k©Äj©_óő(˝v Řđâ¨mÖ–•ˇw‹ŠJ’s ,?Ųď˝~9#Ôc 5ö›Uę-•GM‹E«“ "°ôžÇaŐ-)HN®ĺÖĐT@$ ĺšBIwwŢÄ?‘ę1ŹNֆ˴Pű$7â-,@˘đŁ9´ad°·ž©/MyM·›,ÔŔ-­Îöô‰-/@Ě„)*V¶őĎb«˛,Kć…µZ-VĄ\ŁŐá·L©&©PjޏŇeHyp.J^kWc§"”ŰmŤŇR”–y€V˛OjbĽłľů óń5Öź‹ĺť÷Č_ꉍž´ü:_ßKŤî«Fč÷ÍRńÇ}s…›îáf×·WzÉ˙éQ˘µď|óŻľŰ Ą;š5şśĘ”ś3]ůŞ^8ď®p§´Ę{•K2L6č4ÚňTë z™Qeµ-”<…¸„Ąd »ˇ*Ýë!ÍD$ó+·Ý rשͪÓ×"}˝Rˇ¸—Jj‘–âĆ@ë;®§IĚŽ*4ždOŐÝďR§âOz‡ űŁIŁSjůĐýŻÓ¦Ôű"•DűHäĆ;†Ôކ¦Q­ćß{&ÔAßj9-J‚î÷©Sń'˝Câ¤nQ~Ć˝ÎŰüŤ¦z±pÉ…żcŢçmţFÓ=X¸dæ=äŠ[ąoi7©čuŠ»Ń˘·2 i̶ľŔŽâśJZ´­ÝE—ňC uϵ‘§5 )“.Ú,zťfď«ÔŕŰĎTĺU­Ö)´YÍĘi Đg´äµ"s©qÄ”©SjmćPăČ{HN¬ś¶°˘…j«Ý¬ Ű0üs;˙+[q˙oúW˝Fq»µŹá{fŽgâĺcKn?íá˙J÷¨Î:R;—/HnHXڎ×"UjˇÇmÄ®ô:T¤Ł­Äw:TI¶xĺ–y§îĐâQ'%ÉF}ŠţőďďĘ™°ĂÂÖ}ŠţőďďĘ™°ĂÂcpóZ%·»ÉEÝţű*ž<÷®q-ö"ĹvL—›e†P\u׆ŇeJ'€q$âVď÷ŮTńç˝s…{ĘšśÔÖZŐTĆ„ĺ• “x´©'îŇć€ÉOÄé$,ęI÷ĘߥJěę\i˝Ť"7d˛‡wQˇÖµ$+OŔˇžD|/m»ř#¸ąú°Ó…m·wâ÷?V{ĄC=đş#k~ôĄD?ĆgŤrŞÝ;tŇ"Č›2Feq´o] ËR»µ%)Js©J2”ç©IîÚß˝)_Ńń™Ĺ qFÍz ~7'qźŠä6–„:´Ľ¦U­jJIIe ĄE9…(šBT¸>â|Ĺ/ŤV9WTxÔ‡¤żLžÜČď0Ë”Ĺn»$)÷RŰDćěĄJW”đPĎRT‘ąA¬ŠŚ©ß§L§LŚ„:äiE˛˝ÚĘ‚ KZr%·ZłN` \ŻĐęuć¦T"§˝KdC2R—Űf4Â뎗^IQ8@B‰ ęV”ËÚôg(÷M-&C°¤3lÉ—)rÖ7‰[:ÖĄ/v´Ŕ)ç2ޱ2źžgštoČ»ËůRö÷¸|YżTc5ßîŁ^(ÇřiĆ{Ü>,ߪ1†ř«RŁWÄŠś6ťDHú›rBR¤ćŇHĚĂńÝć”Čżľ^‹_ łďÇ#ÝŹÚ,Đž—q´Ú§"žĚ”˝N Ň%%ŐéH'ýiY+|r$5ţ‘†>]˘sĹ?ΑӅŢJ´{uíľČĺľYěîÍk˛wŰÝzw™gŁuţŤ—±ţמXÚęđYE8¬ł.;†‡G/ÜTXŠyU*|Vś(–™rŰcH*ő˛\âJB\  ÔŰRÖĹo–fVPÜmé•# ™)sZ%éiĄ8´ś€î[¬¨r[+‚ D}÷R˘TlÚ•0ŞźVMB2˘9ÔŃ/!Ń»P[ąć„˘T¤‚°JRĄd’Xʢ[Ö´ZRî*|ąÖôÉ[ä7ŮR]Zť}íF·Vâô’ud2 FÚďاe7&l(lŰď…żQ\ě0ríž)ţtŽś-ěµö$íúű~3ÍĽŇ©]+mAI9*pŕGáÂ&ţtŻÄV%Ý/őâ;w•jŽÝŮRmĘ´-śJŇ©($(‚ĎĽ»D犝#§gşr6¬­oÚĺ ĘŰń·ÔřY˝Rq.d¸Ń’•Ľ”ĺöÍ)‚PS©A-­vÝ»§WŻŞ ˘ŁqB¬Ń*á…©sC”đÄ… 9µ¨>ńJ3'BĐVĽĐ‰Šű–ŐaęrĄ×"îéÓS1,&[{§Ö”, :“ž •©.§ĽCŤ6 sN5(đíZeÇ"Ż»*C’ÔôrÓýÁt4të@Ră¸ë‹PQ)) k˝XR‰Ż49v‰Ď˙:GN]˘sĹ?ΑӋÔ*PĄý›}đ·ďâŠ/ëť‹î÷Ń?Ćúń]ěµö$íúű~3ÍĽŇ©]+mAI9*pŕGáõĺZŁ·vT›r­ D§´ŞJI ‚3ŕAĆ8?ëTo„ĹńŠÝµËM•{Č«Fˇ¦ľĚ8/Í­&$X¬Şw3ę™—Fꋯîň@s<»D犝#§ UzŮ“X¨ŐY˝‡.mIŞ›1*!äů(")ĆBŰP:Řîži Wiux$6śV VҧW[ˇ5l[ń*r+QŞ.oM](†ĘˇIj;Š%µ)ĆV§»q •+íyˇ!j-ąZ5·§K¸!6óqjĐ™Â8”:€´…H% ň$gđś-ZÔKV‡WŤRję2žŠÜÔ#˛%ÇŇL·XzBČBSĹo0\řuŔF„˘ZŃrÚ·m:]ż ąČ´LĂaoKl¸¤4€„•'$Śňgđ Cmq(u8Á…ďcż+ßňěţÇ\»D犝#§~ĹÇíŰzşŇŇ´.ůÔ•$ć (9~Ś:Wň®ň?b´É|DÇ+ýéĎůĎëĆGU„č1¨írâµăÂěxTZe:CkqÝă®;!Rµć BYl§<őN`%„0ď¨ňň6…rmŠ‚íĹPv=­<Ë’ÝSn¦Ě¨âJÉ Mx€4»oQüÚčlţ«­QŞ,:ś}…=}ŽňÚ×٨´¨ŚňÝpďcş/7ĎóäuXYl,U˘S`UŹmę?‚@ý źŐcR»µZ\Ú$ČmZ7đrDwAUť? T’jďqĹł®‹ÍóüůV5ęóh°iR¦ňd÷;…»Ł”5iI9gąáŢÁf*mEÁ!lŞ¸Ý‹ěo·]ĄW([4ŘF <‰RđCH[M!JFÚó+2ĎQëvŢŁř!´ĐŮýVv'S7V˨÷EeŚźť@‰QykÝ :ňY* ÔBApäg€ă†t^oźçČę°Č„ţ$¸eŕ~«ŰÔ6ú?ŞÁŰzŹŕ†Đ?CgőXłµŃyľź#ŞÁ®‹ÍóüůVf)–˘ŕ©JĄĚ/=®X+¦[7dV©U9ŹË~ĄnËËHU>K`—l$wjJr'2T2Ď›{¸VÝĘŠ\k^í¨.!+rD zTçZČ%Ô ĄDiă‘ g–y‚“´ťšMágPé”ĺ¤\59ĺ;&HsvÓp¤?ܡ9(­¶ř’FťC,Č)ĂvÝ Đ_Be%e.­Il6ČYîR‚sÍiţ>6Kl÷)Ş˙1P<ą?ŔkëôVoW—'ř }~ŠÍęńsvɦüśŻ4O[¶M7äĺy˘zÜkµa±ŃS<ą?ŔkëôVoW‡ßc3s©ű>˝ęU:-f$פLe‰t·Ú’ë]…f† 7‹î´€”’JHś4öɦüśŻ4O[Ź­’ßďWT·b˛ĂtZÓ!„¤…-´EŽî§8žč©Ő÷˛d8IŁËÍ*ť °6kąT5Ű–\ÚäŮŤX—ŕnD—@U©70˘FkďńĆŻ.Ođúý›Őâí©m *Śn˘Ar;Şie1S‘)$ľŰŢጲiż'+ÍÖâáŃ(”[»kŃS<ą?ŔkëôVoW-¦?Z­ěţ±Ib_ “2Ť˛kMH*#€ĎwĂŰ&›ňrĽŃ=n vˇ¶$ŰŰ<¬Öé0Ëó Ă[±Ű•KE`pÖRé9ţCż–YŚó]ŠZŘŻE9·Ę×%[ŤĆE˝TzxRE&üÍŢ•¶˘\-$„ †C>$÷ÉDS|ą?ŔkëôVoWŽŤşjÉŁŔTÇ-6ŤKŇ޵é  IőüxXí“Mů9^hž·†^±^3a›UŻě©ž\źŕ5őú+7«ÁË“üľżEfőxą»dÓ~NWš'­ÁŰ&›ňrĽŃ=n/j*UžŠąŘ *“¶üšł¶ŐĹN†Í±.:źŞQ¤DAqR˘)) qBTr>äâÝÚ¸ řĘ}Ub×Ú;µÍ°Ç´âĹ@‚ş š‹ŻşŮKĄÔ?´Ą ,€ť.¬śó$ĺŢČęźÚ¸ řĘ}Ua’Uń¬®*ó!˘IÖwQKŰŢŕAńfýQş¶Éö_& ěÚµˇe96aě—Ü“Ein¸§;˛Ą«tu(ęĚśÎdśJ[ŢŕAńfýQŚ×şŤxŁá§ ÄHÎbBiz%ŢÔ[đ6Áô ]NÔ[đ6Áô ]N7°ŹŰ–}µĘ™KŃ ŐŤ"D”ł1µÍBXŐžú2´–·Á q©Iq±©EĽŇ’ă*ÁĽĄ ‡ťÉ«µÇü °}×SµÇü °}×S„Ş–Ń«t—j°ęÖgú—É1އ‘7łć®2w+ZűťűĽ×©=Ę@qR;+¬ÝuZőÝć‰NŽš]Yń…5RĐ0Ł:¤j,´T3t,(‚sqIČ$Ş´2iU7ń)_DÉÚ‹cţŘ>k©ÇĹ“Áˇ^Ő»^Í Ň)ŇáC‡*¤í.šÜVť*@i$Ą)+RwN# J€‘†;ř[÷ńEőÎĹ#˶* ĆsßB™$ěsdqä-‡¬« 6˘•¤ĐZŕGý|v˘Ř˙¶ Zęq?w{čźă ýxŽĂ(ÂJ3/ GµÇü °}×SµÇü °}×S…[rţťQ®Ćb]ąŘtéŐąôH’ű9.8ôŞ’J÷A %•7Îč¨,9Üč(Éұ±’ĺ­Ä´çíĎYr§ ·ë­Őh ‡ *K.ĆxEd8{#r„€ă€ˇĹ«IZkááÔ+_ħ~ŠŃíE±˙l@µÔŕíE±˙l@µÔâ3ewëşĹ§\ł(Ľ’š¤fĄFŚ©I}{Ą¶…(¤3%ZGQ «B”¦ĐĂ‹‰FPULËÁ˘Ž˛aŘ4+Ú·kŮ´E:\(pĺTťĄÓ[ŠÓˇĺH $”Ą%jNéĂÄd"IP¤ěsdqä-‡¬« 6˘•¤ĐZŕGý-ěŰď…żQ\ěXwľ‰ţ0ż×„C€×DspM‰Íc]Š€íE±˙l@µÔŕíE±˙l@µÔă{JĽ*ńn*ĺ-ĚÔf;t7IŁ1!îĆaˇÉ,MXqÔ¶µÂABÉR’ž â—V ĺ(L<¦ţÔ[đ6Áô ]NÔ[đ6Áô ]NcßÓ¦·MŤK·;.§'”.'g%´ˇ0$¦,ĂŠNN¬ş´î‚ĂIZs+SG†¬ß¶[‹qö7bňĹ6<ÝĆó^çzÚWŁVCVZ˛Ď!ž]á€JĂ;Š“1o[¨¶?ŕmčşś;§Xł‘pYö­żIŤM‰UU.ŁŠklC–ňă°Ą’ŘHÖ’‡…'Ž‚2)ťě/{˝ů^˙—gö88Ë=@€ç·~߲t´Sô*Hě‹cŕlŰß‚×SµÇĽ °}×SŤů_ďNÎ^1ăÄDÓs yn^‹¨ ´…©ÚŹcŢŘ>k©ÁÚŹcŢŘ>k©ÇÝIZ[a%çÚKł#´â㵼u([ČJ´'Jµ+JŽCIăđm·ukě;…ľí#yUct‘Á\ö†ł'/Śĺ—áĹuäĹ+éč¦á«GµÇĽ °}×SµÇĽ °}×SŤĽ5ěÇtôEĂVľÍ}¦ĆUz‹eQŕSbŃjć$ÄŔ‚¬='±ŘuKJR«ąu´ (9f’]Ý÷±Ç$zŚb¨ö>ű«´?Ë'a…‹]ß{ürG¨Ć=;^_.×äŃgh¤J-,'Úu í~ć˘VjĺŔŤL§Í§3 c±ŇóóĐBÔV˛âô°Ř*Í):FHOÜ1‰‹ľuƇ2ŞcBuCv–ŘrBĐR2ĎQ2\Ď2FA9‘Ď8ZĘ’Ĺyg}ňçâj'­?+Ë;ďż?Q=iřtżľ—ÝVŤŃăŽúç ÷‚ÜnŮšëu¶h‰i˘ăŐ'…&#)âăYĐ•dĄęBNJRVRX.Ź|Ő/w×8Yľíćn‹qT‡§Ěţ•SRˇî÷ĚşĂíľÚ“ĽBĐr[IĚ)$ÂŹĽ®ßt-=—.Ľĺľó•ą3$´ąJU1úŚt19ŘĄ)ÉR[mBWĽ)HB-—€J]Ţő*~$÷¨qókÓ&Ň©ëŹ>á©WSĄbMA¸Čq 4¦“¤dO“šŹ˛ęî÷©Sń'˝Câ§‚‹ö0ýîvßäm3Ő‹†L-ű~÷;oň6™ęĹĂ&1ď$ŔÜRܦ\ÔK~EÍG¬ĚŤ•OńâĆTt”%Çüő;©ŐEHBDP—Ŕ.iŢ'vů…[Úç\µ 2©Ôˇ7S‚šub4E5»ŞÄIp†.6Ą!#~řÔĘ›^Nžë4 Ą« 4˘pޫݬ Ű0üs;˙+[q˙oúW˝Fq»µŹá{fŽgâĺcKn?íá˙J÷¨Î:r;—/HnHX„¶nëvŕ©MI«C”ü%䤵%µďˇµ˘Jp$«řÁCŕÄŢ5áÂŤD·ŘkC“žČV˘u¬6†ÁăŢî[@Čpáń“ŽŽŐÉâ¶0ËěW÷Ż~TČý†°ËěW÷Ż~TČý†‡šŃ-˝ŢJ.ď÷ŮTńç˝s…úĺr‰EÝrĹb?žë˛ĺ!­ćYg§QĺĎ/Śa‚ď÷ŮTńç˝sě0{ˇ!ŢńŞÇö%EjLg›y‡iÖÔ‡FaI#qakmßÁĂř˝ĎŐ†ś+m»ř#¸ąú°;Ý(gĽDmoŢ”Żč‡řĚăť©µJłő†mµËoł!IZçJĽŢŠŚ”Ţ‘Ţި8Ŕph ¬Ťl)]µżzRż˘ă3Š&=» 0XC˛7&*kr “Ľ[Ë+.­C-?lŢş ’R¨5°´Lxj´)Üł_LФjôŠjY™"4xŤÇeƸymjwR5ŻR›$„-Ľ’BFD©r]Ţą’š¨L­Öčt÷-ŘU=Ý6ś™hdş_S…× w4€”#"t’Ž]ü›ĄŰrťT:ÍNźBË’!Ă[iiŐ(ćµ*řKkGT2ZŠŽĺ:Ź QٱÜď!± , %-4Ű*t ! p˙jˇńdqe M¦…»ěxr öŢ©NŐmŠ–<•KełštÉ„V”ń<ł‰ţs‹źiţŕ3ă)őUŠcŘńNbŹ·ŞU&2Ü[,y1šS„”˘L$‚˘ä8ä.}§ű€ĎڧŐV-'ůćy§Çü‹Ľż•/o{Ĺ›őF0ßjTjâX‘S†Ó¨‰SnHJTśÚI‚xp ă5˝îoŐ‹«lźeňjÍ«ZS“fÉ}É4V–ëŠs»*Z·GRެÉĚćIÂCË#8]Ą8´:A4Ů赹v‰Ď˙:GN&PlŮóęOU®#RbŁ TUM¸±ä”ŞKm)99“ŠBvµh ovžç ¨¶?ŕmčşś¨¶?ŕmčşś8Ě8ďgTˇsş*îźmÓ{Ö«]ŹÔ"ËŤD}U(űפ›&FŤ Ch±ÁmAJŤI‡I4gęUFěÄK“I­Ăb{âS¨~@^ůM¶”<âJÔ¶VÓŤ©( ĄJĐĎł')ÖîÍ­ë~mr”äŞM&,7ÖĚ´–Ô¶šJRNDŚŇrĚ—Ŕ1;Ú‹cţŘ>k©ÁÚ‹cţŘ>k©Äî¶z©0šE-t^ríž)ţtŽśEűC·męëKJĐ»çRT“P0 äAřF%{QlŔŰĐ-u86wN±g"ŕłí[~“›ŞŞ]F3Ö؇-ĺÇaK%°‘­%! *OdR9§˘°× »déxmcę WĚšíÉpŠÍ<‚ł‘‘ń˙>>9r‰Ď<é8ČvE±đH6m‚ďAk©ÁÚŹcŢŘ>k©ÇŠ~Ś–sÉ1ŽßŇWPDp–+E­•rěV‹/´úV̦‚Ҧ֕¤ŤAIď¤wŇGŕĆDÖ-¦šPjş]Ză*ˇa#Ž`ŰG‡|žö>űQě{ŔŰĐ-u8;Qě{ŔŰĐ-u8®«•˙1˙R‹×`±ňĺž yŇ:prĺž yŇ:q“µÇĽ °}×SµÇĽ °}×SŐRżć?ęQzě±áÄ;PÚ ­-+Bď•$ć Y~†‹ć-ýQ1cÚ÷m‹ >µ­ąTMuÇW¤ݞ9!$'<őŁ Ăł_i±•^˘ŮTxŘ´Zą‰10 ˘+IěvRŇ”„ęî]mDJY¤$—čófö#vÉőĚ^ĺŐ#VHg,ň<{ç˘k 4o˛Î*_±U×¶Áôˇoţ‡+÷Ě×¶Áôˇoţ‡+÷ĚZ<·YçyţtľśFĹż“sH·#Ţzł  ôšku]Rlé!kh+RSÝŁ‰wIřĆ)y*u¤kŰ`úP·˙C•űć6öog×č—uräą.hu©Ő¨°ă”a!¤Ç/H/9¨ťů2ËHďç‹–ë<ď?ΗӊÚÝť6w˛JřTŮ’$©Ş¶ËΩe ×PV‘™ŕ3RŽ_? ě. T{^ŇŠ­'lSŞ’f«ivŰJ’ňÝ-·g/B ”NIÎi9 řfIü'ţ×¶Áôˇoţ‡+÷ĚBŢ7 Vźp;#̶Ëm4R“Ą-$ž%$ž$â/Űu{çLy›?S|Jçřň6Q7{^ŰŇ…żúŻß1Ž]ݵąQŚţÓ­ő´ň n'Úz†i#"3>,*űnŻ|éŹ3gęcRżv×ÍhP‚c9’›ŚŇžäń Âcj5ÁZjÍně’•gZ×>ş}2-9ÚŚÚJ¤ĄÖ™B)d<Ť R›AĚ©@ C"HPö˝¶Ą ô9_ľcË\S>Ć[5öôëjԆ⠒“r<0TÚÄZlĺ¨ÝÔrZËxÄ…DmÄfĄ@ ˙1ĹDĽT¦>eĐÝdbű^ŰŇ…żúŻß0{^ŰŇ…żúŻß0šÍëWyÇ[jˇŰ˝ŰÉLV mZB´¨iŕt©'#đ(‡“ö±çłnę nÉe/±ľTDo[WÜ­9Ž)9ŕrÄř6}űʬV=ď.ů·«×UőKŞ1oJzK1˘[Ş·ägXČąŮ+d?r ń‡j?˝.›‰Ré×ĺ6•O@Ź ËxČZ JBÔ§{!:‰)ř łĚ”µĘĄOn»;fd¶ŃRś „4†ŇUɲ†d$ ČĚĺź{3—|âÁÚĹVu*S ‚ăm—ťp8TÂN”5—Ý—Ýωd+.˛ÓD>8|;nJĄďߥ _čˇýďi{÷éB—ú({Áíş˝ó¦<Íź©Űu{çLy›?S»‰™fľ…‘Ąďߥ _čˇýď ű%ŮőVĘłn bî8µ•nsł“4ŇÔÓ,¸¸í2śŮß  !D§<Č{řPöÝ^ůÓfĎÔ汚\‰Ô= Ę–ęťyË©ýJWŕ > ŔĹÇ T§B‰ Ő˛ÚlZs6=´)RÝ’ţÔékuĺ—Wµ<µ(śÉČJËľqŹ´˝űôˇKý?˝ăvăą«1nń}„4̧m=ŃҲ̧>đĆ—¶ę÷Îó6~¦.!ľžňQŤ »XŽŇ÷ďŇ…/ôPţ÷Ť+Ź`W•n.‘;iôÓk*eݱJ˛#.˛űřÝöÝ^ůÓfĎÔÂvÜ.ęĄGb·3mÔYq•Ŕ}—¦“Ĺ9ˇhÔ„‚2!IPĎăá‚ÇÓŢRذ‰bĽvµlÜ·E5VýŃ †€UŮj‘I3TřÍ%)OŰ›§3ß'‡Ő_ö—ż~”)˘‡÷ĽY[K”ô+}éqŠóMf…)´¬ Ýh w‰Ĺ\›ň˘¨,Íh&4ŤŢĺń>íÍáU§#¨© eß$eßĹa±Ĺµ^4F5ä9µYűKßżJżŃCűŢŇ÷ďŇ…/ôPţ÷Ť űJ\Ł4É·&4Ů:wžDd:îĄiN”ćs âFXתmb-6ráTnę 9-eĽbB˘6â3ŚŇ ĚâÖ™.öD粍”Öím˘›˛·xŬ­4§©Í°ĹÄŇu— Š·îg–ç,˛ußá†í§ű€ĎڧŐV*Ý“Wd×˝’ůNÎnSÍš¸ëd 4¤Ş\#©:IĚeÝřâ´¶źî>2źUXl"u€â­4A’q›˝˝îoŐÍwű¨×Š1ţq†Ţ÷‹7ęŚaľ*Ô¨Őı"§ §Q>¦Ü”©9´’3đŕAÁă»Ě˙*büůz-锸˘Ěł)M¨0ëÍ[BňîT¤$¨‘ )$ŽŽţ+tÖ®8V۵(wş­%úÝ56©>Fňíž)ţtŽś=žčYČÚ•­ËúuF»‰vçaÓ§VçŃ"Kěä¸ăŇ"ŞI+Ý€–TÜG;˘ °çs Ł'I`‹ŽĺˇQoomr⢱<ţEě8ë„Ë.Ą+Üę݇԰ڲŢo@. z>ÓŚđ©VŚ^LÝÜ žJ­Ě¬łŞk]ÓŇ»+x•pâŮŽé"4Ł2r9âIˇAžŔ…~ĚŤGŚâ\b†ĚčČĐIÔ”%a˝řl(č ˝;ݵâ˘×}ś®Ďî9×+u)/Qy>$*”¨ÝT¤¸©jŹ%ćŕHĘí9j:µŤ:R•¸Ă…űaËj…MvJäU¶ěŮS]–ŮP\‰>°2Ë€[ŞáČ ÉŇ]™§­ă©BŢBUˇ:U©ZTrO€ăm1’Ä]f5uµ8Ľ’j­†řÇJw ÷IăÄb9šĺ3"ľĺZ„iLÉ L´˘Ű‰p řđ% cÎ\˘sÄ:GNeÔÜ­UżąDçtŽśąDçtŽś]‚*ˇ˝ŹľęíňÉßŘab×wŢÄ?‘ę1Š›Řđâ¨mÖ–•ˇw‹ŠJ’s ,?ĹŁTź ±łfÇŤĽ™'FůÔŁVHc<ł<{ăţĺä>Ë~"ĹŠbŐ—˚ط’Ęë4«ţ˝Q¨SRŕ2ˇÄw•ËRkîŇű&>•¨«|ŢDëNvż/ĐąęťçHéÁËô.z§yŇ:p hµŞCĺť÷Č_ꉍž´ü9ňý ž©ŢtŽś$X’•ěľźŚóo4ş5KŤ¬)'%O"?/ďĄĆ÷R®Ń=öżýŕŁÚV–né@T˘„4…ú{•%¤Çľ Ź€ŚBrť7ś"ytôăĽ7/2FŐž#ěJŠÔĎ6ó 8Ó­¨)$ŚÂ’GâĆ ď¸“<]ĎTŕĺ:o8DňééƵjŁO]Z:2”¦ňI'Iŕ8ŕŞÚ­]š}ë¶ŹäŚ_ü~9ĺuÎL˝nv=ą[4mU&—ŘőVuşŻô(ŁX=ßrrËîOxü l 1â{­'ĺ>Ó JJÝXJsT”ŚĎÂI|dŚW§Mçž]=8D!V­sŹ=ŕ•/–{:©VbČ’Ó4Ô3\i©SYÔµ­’CÁµ:H'Kč÷ë93ŞOÚ4ů6íZÓĐéîo_†©Hy*vaBPó` ł9ńĎ1–_ ?)ÓyÂ'—ONS¦ó„O.žś:f´iJ-}źSŁíweôËql@~Tf”áe(ĄČH* žCŽ@bĐŰŹűxŇ˝ę3ŠÖÔ•Nß6}Řň{MBn­Ú²˙WJďĺ‹ o T"G~tfŢ qeµş”¨$ˇ Dç‘)WŔ~,(|U ţ_÷IXY˛ćÝňjŽ"ŕŘń$ˇ]‚Ó9ŻRr‘1óŢŐĂHĘă7ĘtŢp‰ĺÓÓ”éĽá˧§Y…@ܶđËěW÷Ż~TČý†ůN›Î<şzpßěSRWiß‹B‚’«ˇň•#°!ńT^iňŰÝä’vÚ‡ä_p`µ>dFć\rbĽ[[ŤňÖPT8€JG‘ JT‚ŻZrÖ/K¬L{˛é4J„×Ô ‚ĘdČZe-*@Nĺ†űéÓ  Ż0˘Ą›Vé«Ň]ąęNµT„¶×1Ő!i’ ÎDřŚhrť7ś"ytôâŔlŢ–]BE;ŞEĺ{G-Čö±ËűžQĺ'4ö'`ëĎł5ëÓŮ}Ć­uöĽňîq©PVżcu½ô‡µ*Şw’ZÝşżôÇűĄŁJt¨÷ČŇśŽc!ŢĹ‹ĘtŢp‰ĺÓÓ…ťłĎ‚öĘ.™™ĹŞžîIC©$đřŔE*Zę)Ĺt†ÖýéJţŚÎ9"ŠĂôŤšZĚ2ËŽSŞË˘ČÍ)%0ä‡áęNC€C -ĚČ8š”§’Xíž\H–‹Ć\¦X !˛ë:Ő˝hä3ďś’N_?)ľS¦ó„O.žśR«cş‘Oě–)UJ .N‘sK†Üé“ć-Řr[ÓšqŐît·ĹO‚Îé´„…}Îďľ‚4ÍB=;gŃęĹĂPjJ,¸ćńeŃM”©YťGVyśÎxgĺ:o8DňééÁĘtŢp‰ĺÓÓ†ŃgµôR»űć#ţHMý®-˝§ű€ĎڧŐV* >ÄŹd« Žón¤Z3ASj ö\>1oí?Ü|e>ޱ2źžgš|Č»ËůRö÷¸|YżTbŁł-›O¨?:vĎmYRĄ:§ź}ú,u¸ňÔIRÔ˘ŚÔ˘I$ž$śsÓ[Aş›m-˘ô­Ą %) ÄëChwg†ŐßĚÇU†żG8şÖţńC'l´ ;»Á_˝©öYôigú7ÔÁÚźeźF– c}LsĺCh÷L%M^µ˛˘ëi:dĄ¤ý®ţD却ŻĂjďöV+« }îů«x˙Óß%}ö§ŮgŃĄźčßSj}–}YţŤő1BöŔ»<7®˙aŐ`@şü7®˙aŐ`ŐŽÍß5Wż°ę°j·fďš5€Ëß%zö§ŮgŃĄźčßSj}–}YţŤő1E‹îéđâżý‡UŹ}˝]W˙°ę°j·fďš5€Ëß%ŃvĄ§jÚý‘ífÚŁŃ»/OdrtŁo´ç§^„ŤYjVY÷ł?!űSěłčŇĎô o©Š7ŰÍŃáĹţߪǢůş<8Ż˙ŰőX5SłwÍF±{äŻÔű,ú4łýę`íO˛ĎŁK?Đ1ľ¦(á|\ţW˙íú¬{íŢçđâŕ˙·ę°j§fďš5Ëß%xv§ŮgŃĄźčßSj}–}YţŤő1H{vş<8¸?íú¬z/kźĂ‹ţß©Äę§fďš5Ëß%wv§ŮgŃĄźčßS‹NŐ¤Đ%P©vŐ .vľĘMG‘­! ÖÚR­I'0sĂóíÖçđâŕ˙·ęqô/KźĂ‹ţß©ÁŞť›ľhÖ#/|•ŮÚźeźF– c}L©öYôigú7ÔĹ&/;˙÷ĹÁ˙oÔăŃyÜŢÜöýN TüÝóF±n^ů+ݵ>Ë>Ť,˙@Ćú;SěłčŇĎô o©ŠWŰ•ÍáÍĂůăő8÷Ű•ËáÍĂ˙oÔŕŐOÍß5Éą{䮞Ôű,ú4łýę`íO˛ĎŁK?Đ1ľ¦)on7/‡7çŹÔăßn'‡7çŹÔŕŐ/Íß4k&ĺď’čk^Ţ [TőÁ·(tÚţ@|XÓş,‹.ĺ¨"uÇhPk›h2‡ęĆd8”H@RŇHNjQË˝™?(awÜžÜ?ž?SŹEßrţů¸<~§©~nůŁY7/|•ÍÚźeźF– c}L©öYôigú7ÔĹ4.ë“Ă«‹óÇęqď¶ŰŹĂ«‹óÇęq:Ąů»ćŤdÜ˝ňW'j}–}YţŤő11jZv­ŻŮÖmŞ=˛ôöG'@j6űNzučHŐ–Ąeź{3ńâeÇáŐĹůăő8÷ŰeÇáŐĹůăő85KówÍÉą{ä®>Ôű,ú4łýę`íO˛ĎŁK?Đ1ľ¦)ßmw‡WçŹÔăŃu\^\ž?STż7|ѬۗľJáíO˛ĎŁK?Đ1ľ¦Ôű,ú4łýębźMÄűęăüńúś鸼:¸˙<~§¨~nů¨ÖmËß%|Uí;V­@‹BŞ[TyÔ¸:; ;>„”#CjIJt¤”Ś€Č Cö§ŮgŃĄźčßS¶‹‹Ă«ŹóÇęqčąî/®?Ď©ÁŞ›ľhÖmËß%ov§ŮgŃĄźčßSj}–}YţŤő1Q{g¸|:¸˙<~§¶k‡Ă»ŹóÇępj‡ćďš5›r÷É]4 žŘ4:łUJ%ŹmÓg1«s*!†^oRJN•Ą ŚŇH9ń#g¶ r¬íR·cŰu)ĎéßJ™HaçśŇ‘©jI'$€gĽĹ/í–ŕđîäüńúśz.KĂ»“óÇęq:ˇů»ćŤhÜ˝ňVßj}–}YţŤő0v§ŮgŃĄźčßS/¶;Ă»“óÇęqď¶:˙‡w'çŹÔŕŐÍß4kFĺď’¶{SěłčŇĎô o©‰ŠE§jŇh¨T»jŹ—;_e@Ť¦ŁČÖ…ëm) V¤€“9€áŠ<\U˙îOĎ©Á튿áÝÉůău85;ówÍŃą{ä­ŽÔű,ú4łýę`íO˛ĎŁK?Đ1ľ¦*Źl5ďî_ϩǢŕŻxwr˙Z7SSÄÍß5Ń™{ä­nÔű,ú4łýę`íO˛ĎŁK?Đ1ľ¦*ˇ_Żxyr˙Z7SŹy~»áĺËýhÝN O7|Ń­—ľJěşí;VčělÖճؚ»”`5's«-Z5¤éĎJsËżř±ÚźeźF– c}LU|˝^đňĺţ´n§ŠíwĂË—úŃşśN§‰›ľhÖ¬Ëß%iö§ŮgŃĄźčßSj}–}YţŤő1PÜ75Ç ßť2=őq)čń\u ł¤©)$g“#†căĆď-×|<ąż­©ÄjwÖ–»ć§Z2•łß%qÚöE—mT:Ü´(4yN4Y[ôúc1ÜR  © §4¤ĺŢĚ‹¶źî>2źUX¨ąn»áĺÍýhÝF1É©Ue 7&ő¸^@9„¸"¨ńäXƉ]ř1›ťÝâłĚiĹ„č`oď˙Ůfox1.6-1.6.57/doc/screenshots/foxcalc_prefdialog_01_small.jpg000066400000000000000000000056051326741342000237550ustar00rootroot00000000000000˙Ř˙ŕJFIFHH˙ţFox Toolkit.org˙ŰC    $.' ",#(7),01444'9=82<.342˙ŰC  2!!22222222222222222222222222222222222222222222222222˙ŔiČ"˙Ä˙ÄG   !1TAQR‘“Ń"2aqˇŇ#±ÁÂ$BCS‚’Łáđ”345DUbs˘ł˙Ä˙Ä!q˙Ú ?ŻńÝĎú¬ńTó=şUž+¦ŕôbÓGPZČĂ€lŽn·ö»äÖűążÔ?Ĺó=ą˙Už*ž`Ç·1ŢłĹv®Maź»›ýCüVź˘‚‚¦8©Úć°Çćqq˝Ď9AË<ÁŹî˝gЧ'ńýĚw¬ń^ÝřĄ$LcĄĆęXi¨öjŹĹ(ă~WÍ”Úäť5^Ť¨<7'±ýĚw¬ńTäď71ß3Ĺ{¨qJ9át±Ív±ˇÎ»HËďŃbóćĺHś—Z÷ $mµŻmľÄ'“Ľ ÜÇ|ĎNNpsóPÍLDÓ“Xďý-śßó,ńV p‡Ň¶Ť¬ íÓOzéČ™;8ůĐaQŹŇíöű~J‡‚řőďć¨öěň–ř®ś9a৉}°ö ěűvz?4]Mn83˙¨˙Â߼­ qY©1Ţ&:‡µ™s9Śp! €NĐ=Ä]mđhSUSrd<[ŇކÄł8kŞŞf“kÄ—âÚčďĹm·>¶ż?ŕ-ÇŰĘúg’ńXÔÍűSؤőś#Ž3#„f,Ů8Ç:÷i˝îăĎÍĄ´^„źďńŰ÷Cď+(ŕţ"×@ćbą\Ŕs䌷97č;5űąŔQq¨¤‚xcšc3Äd—‘kÝÎ?Ůo—ťÄĺ˝5©oČó†‘Î78m 7'WóôúŠžFo6Đ\€/źŁgę$Ňâl¨“‰€><ţŽbŃĄ†Ío¶űm̰ Ü\6)NÓng¶ŕ8m6űvľËŞRYLřă|lèZÇčćµö÷ŚšŞy#¸Á'›hsŤŽĎ¨ÖűrtŞ˝Ř‹$s›Ü͡ŔiasŰq·áÓ’őŻd†ş&FěŢfËX{O=Đb§Ą’•Ďt4¬sÜ\HŢć×ýO`ÓŘłç­Ýéűóô)(‚6zÝŢźż?Bg­Ýéűóô,•“TCM¦'1—ŇvŘtźóćµĎŻÄ]W:¶ĐËĹ<°G%Ŕzo¶÷A7=nďOßźˇ3Öîôýůú°* Ťž·w§ďĎĐ™ëwz~üý J Ťž·w§ďĎĐ™ëwz~üý J Ťž·w§ďĎĐ™ëwz~üý J Ťž·w§ďĎĐ™ëwz~üý J Ťž·w§ďĎĐ™ëwz~üý J ŁsŚŕ[P Ŕř˘Ş —†Wyľyĺç.k[bmÎăř-ź)źş·ů˙˛Đ·öźÁů–˛jvÖÔ3ŹŞ‰‘ž3ěänŁ0˝öKoŃu:Ľťlť{S?uoó˙e¬ÄkÎ!;e1†en[oâĽî÷A_5ĆFŔrú eĘ./¶÷ćÓOjŰó|U~§:šťŚfxšňĂ+…†Rá}„ýŔö*ń±ëöŤÓn»9ÔYđŞ:‰]$±]ÎpsŽb.@°żĂńXĽÇEšůlĄ¶Ěz,ŤOtŃ1Ů]#¬M‹…ôÚ«Ć0 çm‡=ÔY°şJ‰Ý4‘“#…‰#ŁŔ+<ÍB)ĺ‰<\ąs Ç[„8ŘÁ·ËéĎÓ±QŐ1…îš6´ ’\§äTP‰\üŽÔÜ ÇNžŢt8CÇëźH “4Tő3ßFę™Aôiť.PNŇ@6˝ ćÚĘźşo‚ťEPü>IniŘÜ\/v‹Űď+Ô """ """ """ ""iü™j¦¬,ś~†ç‘#€ m·śĺľ»@˝ąö­«A(ĘŔČib|Kg.µ›a©řćů|o‚Ł}C„´lŽ Ű´ń—$ŰařŘv©bx]#ă°˝–ÎĐávűÇ2»;/lÍż˝µµX¨-ÍBŇął€;6mÚŻ}N$Ţ/-v’ńĆl7ŮŮŰbذîUAŞŠ·‘‘<áínqwűeů˙ź%}5F'$±yE$q°›?+ŻÍ·oJŮ" é)UW/”ÖKM #iŚ3'¦ë›v“° –Ú¬;JĆ,•iÝ+šĐâDŚ`˝‡¤ásčťť -v&Ü5ń2®1ňĆéchš'µ˘ä¶ĎÖÖA9\Ňם ŮQż´ţĚ´•ü%Ź ’©Í§mO’°>XŤÁËť­˝ÁÓW[a[¶ţÓř?2ňŘľÖbsI=UTĽ¶*¦A+šÉA€xÖoÝěW‹™{©ÔzMŮĚ^W¦ŽVTĂO[LßĐŞâD\ëą·×)ćżIŘŻćř¨°WŇHř¨i¬ÖĂ Ť­>€Đô{”®oŠç-«A©Â(ŞřĂ$^”ŽĚç7BM€ŰđV»ŁyÍq±ë[ś›iďXćÄkˇ«ž6áňM\ĐEĆ[“s·]bÄęd‚gůľ@čË@eÍÉ"ç››ü·6‰4¸u=’IH|–ÎO9wÁJZçWŐˇ#y|™ł7>ڰ¸ą·?ą_MYU4Íd´N…ąn\\MŽšlö ś3Pşžę_RÇKĚc24ŰŐ.;~+WŹapâłŔęq1Ţ´µĺ׾§Ý{€,Ě[]6!PExLňŰ“’MýQ ęEě Ä´ ąî‘Î %Z€€€€ß×=9m˙·ŠÄúh%-2AËNa™€Řô¬ż=Ĺ5ë;´ Ĺ-Ąwä]ÇÁWÍ˝[ň‡™ŽŮťëßW< ćc¶gzúFśźRś7qNMĎ8ősĘf;fwŻ}]ň™ŽŐťëşv'KůX×[)pŢăđî<‹#‰R6+¦0H$‚771ú+ɹࣄő{ćcµgz÷Őü™ŽŐťë´‹ĂćĎ–}lIaâ4ÝŇ­ÁS S á~v‹kb7€ ÉąŕŁô?ĚÇjÎőď 1îf;Vwݎ"rnx(ů÷ qîf;VwŻ}ŹsOÍgzú'&éÇŁ€ô;Ě˙5ťëßAăĽÓóYŢ»äNUÎ=ˇ1Ţiů¬ď^úćźšÎőŢ"r˛z8_CcśÓóYŢ˝ô69Í?5ťëąEyY=?ˇńľiů¬ďWE‰¸ ocç ÓAÜşÄS•sŹG/ć•ü0AŔ‰oMúďôQů–( í„3+­`fiË`xß”ň]b'&çŽaôŘ‹…†Ŕ8Zvéż§]ă©<Öľ÷ô(ŢMĽá¶¶şoéK§DäÜăŃÉ:.yn”;썳_Ş.µĺdN5ţ“đRçń¬DAW w‘ ć’05˝Í®A“KŮnj 5˝ˇÍs śÜÍ?kB.>?6á•-ťňúBCšöiÍŢGŢÖ×ăÝol^XŢ´őRßkđZ×UâŤq î$75šs7”•Ńđ6ĺZsUŰbł5˝Žű›źµŇ¶°Fb‘—ąĺ˘ĹÎ:“mëX±řë­ěµľSéHҸďèMÍőŘY$1ÍAą»CmÖÝ““E„ĚĹ<âGA#6yý–ľÖËaşÂűďľęěp6)2ŔďfďŚčo®ť6ŕş2źĚŽW†Đ€ńgYöżűtđĎKc‚Ž•Ś Žŕ,>ćşq™yÜHşš†Ž†˘˛ˇř‘—b#ŚB#¨|~Őß›F¸_L›ĐRĎ[ÍéűsŕLőĽŢź·>¸¨˘Á`ϢŰíôiS#Ÿčç¨ ­ž·›ÓöçŔ™ëy˝?n| Ę ­ž·›ÓöçŔ™ëy˝?n| ĘŠˇ˛ľťíᒑ츋ؠŹ=o7§íĎ3Öóz~Üř+c›W Ôˇ—¸:“kîYÓ·˝Ş$‚Ů~čÖö?ódłÖóz~Üř=o7§íĎQ‰¸ăbc\řđәϹą¶î‹u+RÇY.řłVčěÓ—[rđA&zŢoOŰźg­ćôýąđ*~‡¨ý|ßľżÄ¶ˇˇŤcľV´{ëa}x¬Ĺ·řf¶ßá[=o7§íĎ3Öóz~Üř”Zi[=o7§íĎ3Öóz~Üř”AăsŚŕ[P Ŕů˘őKGI5uS ŠF0ŇKšO˝ČVËŐšîuOűďQy?ţořGđr‡Ę ë«ń=Ś5BHść=·pż˛}˘FÚ׿ٸ⥧QµÚß«5ÜęźöިUŃş‰ĚŤďy¸†Ř\8Ť:–^HbuQâ˛á&ˇŚŚąŮ‰k‡ťŕŘîĐkgŇ©ź1Ęł[EŁpć*±Ź4|ŮéžöFëfŚÜýnE´ßËŔ©¨ńW+ău<‘ę ·ł–ş‡jęyg‡=ňąŹ#~š}BÉŘ…+ÖşfŚŔír›ŢÚîŕz‘VU9$Ş’µđ@čXÖF×—HÂë— hG»őYĹQÍ1†*ß µÚË˙Ä›łŮŢüˇäF7Hz ͦ"73Ą†pGW™Ćy`sofFZoqĸ©”b«yŹgRĐÉX:Vbcq;$DE¤sɱ‚I ËZHkwž…"ĆIeďvVŤĺ­řŢÍ®ÍEPĐݰ$ =ŰäVnĹßćđĚĘÜ%kČi-- Xň\\ü•_@ć˛CSN[eĹă}¸SĂwż.PŰ{ŻöşBÜú~/ÖŽŔřA„I‡;ŰÓŇUG$áík¤ hŢŕ,oŔ}›•LoüS>ţc–ËÓń~·ň‰iń*ęfcŁqp ’Üş—»ćU5-Cšé cË]śŔéŻĐ/‡ŇIlĐ4€,©#MÜOZŻQ†ľZ˝Ľu.Šî»˛Ü-k\uŽMw¨ ;ˇŠ3ŠŐ’Çćs‹ŤÝşĂ.‚í>KNŕöFL€ßhăí®§¬©ś)cÉ+cÚ9ˇ¤ąÄh/n=%W¦ ’ž}ŁŞćÝŽq#†ëť-cÖŞâ~OAŠÖ ‰fĘDa» íÄ›Ţă—č¤Ö-Ő‰™ŹM¬rÓ’[Ë1uÄ›u¬–« ň~› ©|ń˝Ņ–؆ń}úŐ"µŻUH™źb"*˘ĹělŚ,{Cšw‚˛QÔB'ń‡ ]§P‚a”Ohk©Ł FśEüNëVcŤ±4µ‚Ŕ’m~'RµG¨ÚI“¨dnÍ`nŰëqőĺîżGLęXnžIś7ľBI?TUĂ=<‘T4:´‡µĆŔ…*«‰Q G ©˘t›15V úI 5šŘc!±µ§ŘÚO‚µĂćąÄ̶×Îq8ß; lr‡<šëY˘Ă^oÇ‘Fé1Ť«-9óŘoĐXŹk㦟+ÚŚn*Z‰"’žr#pÍmĆąlzÉ„ô/ŽŔö‚Úz’K˛†ĺ'Nžźý¸˝Rż2ÚŞ(ZË»XţVăńę^ĎMYQZăD‘@#n\Ž`»®ëďÝ•X§ť•0‰cľG}’xŽińś~\.µ´ńR˛[Ć\éKmrE·D‰×gĆmÔ6´´sÂ÷>j©$tkžÂ/qČ.¬- ŹOŠV: )#‰˘2üÍ”¸ďÖĘ9VőYťö|f˝HŠŽ}¦Áű+m-ě©s˱ňNQ{÷KŚ2WŕŽH˛‚Ă#€y:\r¬Ş-łfŰćŮŚúÚĎľ¶€·/‹±ÚxĄ|r1ůĐâčý¦m¸ń޶ó ŠvLÖąˇâŕ:× Ě_(ľűj«b-ŞvPÚ#jŁípß§Z´Şbu‡Âę«{Cn“!6Íaşé­ôLë·=ć>Vó©;HU^Č"l†ňÚn Ýa}Úoşâ}~¨˙K‹÷ŕ]¤©ˇ”‹#kČö¸ßUËŇŰsiťţçn8ľ«~±Îô‘Waż|ňĺ·ű»ÔO¦‚RÓ$Ľ´ć Ź*—ćGŔ¦ľóşĘŁĄ§ŠM¤pDÇÚŮšŔ ą.ĄáóM}çu”×ŢwY@B"á5÷ťÖS_yÝe€Ŕnd[¸‘đ^kď;¬¦ľóşĘ ‹ŢAĆÇĄbšűÎë)ŻĽî˛€‰ŻĽî˛šűÎë(šűÎë)ŻĽî˛€‰ŻĽî˛šűÎë(˛cA.{Ŕš˙ĘÂY`„4ľY˝Ł”ŇI?zgťŢńë^Ią$ž•®ˇ2d żÝĚ/ľÜ«8*)ŞX_K¤h6.n˘öż/J ‘c­–j†fK[~[‹ňŻešžÓ$ň7;qĽžĐzŠ/> ĘçÂĆŔĂ[üÖpTRÔ‡: —H줷P ĺä!H˘Žq,Ő ­ —qßěµßŐôD˘"" """ """ """ Â]ąŚ¶ #c‰ÔČÂáo€!P©ˇ®«c[%d ĘěŔ˛´ßâ$[$A©Ź –'1ôMp7S>ăó´Ô5Tql©ćŁŽ=ů[Lë1lQ(éëc¸TÓ™%{\NŔŘŰZŮţ·PŐaőuŤkf©¦!§0µ;†»żX¶hPüY# t”… ‚›żB7˙SzšžŠ˛•…ĎHÖ“sýŮÚ›Z˙÷:ĹV¤§–;¦•’>i3’Ćěµ¶±'Ýú˘˛?˙Ůfox1.6-1.6.57/doc/screenshots/foxcalc_prefdialog_03_small.jpg000066400000000000000000000067161326741342000237630ustar00rootroot00000000000000˙Ř˙ŕJFIFHH˙ţFOX-toolkit ˙ŰC    $.' ",#(7),01444'9=82<.342˙ŰC  2!!22222222222222222222222222222222222222222222222222˙ŔiČ"˙Ä˙ÄE !1AQ"Taq‘“2RˇŃŇ‚ٱ#$4C˛łÂń5Bbrđ3SÁáâ˙Ä˙Ä1"q˙Ú ?‡ögʆk?g| čcĹgÍw ĚńËŽc‹I±µĆîŐ—â´ŤłË˛d˝…‡;f§MËznxQĂýžÇúńYóYű?Źô1âłć»¦â:F˛îqĽßZűî=ĹbLJš+rŹ,»ËHőŰnăÜť7<(áýŹô1âłćłč {ˇŹź5ŰIŠŃDŔ÷ÎÓĽ‚-Ąő÷˝ÓâŐe‚39ÍÎiÜuí·jtÜđهô=ĐNJϚϠ±î‰ř¬ůŻ "tÝśôpÇzâłćłčkľDęąĎGčLw˘~+>k>…Ç:'âłć»ÄN¬‡=/ˇ±Î‰ř¬ů¬ú蟊ϚîQoVCžŽĐřßDüV|ÔĆŃbA®›ŘůĂ4Đ|—X‹:®sŃËůĄ~ěn´·®ý÷ř-~eŠűa ĘëXšrŘ÷âA÷.±¦ç=Ăé± €n´íÓo^»Gry­}ďčQ´›yĂmmtŰÖ;—N‰ÓsžŽIÔ©sËpěˇŢ¨ĺrüQu¨·«#9¨7÷źsú—?Ťb" ¸`óĽŤ4‘­îmr<4˝•ÍD˘7´9˘Îał›™§ÖĐ‹ŽŢĐ6á•-ťňúBCšöiÍÚGůµµ÷ü­ŕÍ‹Ö"7­=T·ćUř-kŞńFŽ\H;‰ ÍfśÍâJč÷qTçŞ!¶Ĺfk{·7>·Zµ‚3 Ś˝Ď-.qÔ›mU‹ťu˝–·ę~!:•Ďő°ęim_}8zťAzdÄç:: &9ÄČA$o<Ĺ9D fk‹… q7$HnMďS˦{Ý™Řu uó\ż[ńőôA\h®,pĘ,łđ˝Ĺ °ĂAGµ®ÉÓÜÎĄ9FĎ[Ńéüsô&zŢŹO㟡IDłÖôzý ž·ŁÓřçčRQlő˝źÇ?Bg­čôţ9ú”A=oG§ńĎĐ™ëz=?Ž~…%FĎ[Ńéüsô&zŢŹO㟡IDłÖôzý ž·ŁÓřçčRQlő˝źÇ?Bg­čôţ9ú”A†ć-Ŕ¶ ďE”@oď>çő"7÷źsú•dÔí­¨g/U#<§čänŁ0˝öKoÂęm:Ť¶#k4ÝďUcÝ|Ô<Ż)ËĚ-.Qq}·ľí4ëVű˝ężÔÖŃhÜŤjęyj! †SÁ$â7lŰ­”•®yiŘÇE¦%ŕ87ü­Ô“đAͱ˛ˇ’U3+žÎH€A ť{[R8/M¦­rŕ3”ى»nn5iaîë+̕Ց:bh_#NL»Hľ7Ýż…Ö‘ŤLđó4ŤiµŰs­Ž›7hnô¦§ÄN~Bv73ťw9Äݦö°¶–ÓfŰ-rAŚş&ęˇl‚ä¸ëskl˲÷>ţ«¬3Şs€8UHŮ©ţËwžŐwąÔ®cŔŚŽkź`㮀\–Ť¨3E#·Ş¨că µ›´ť7Řu©ę«ŇµYA8\ŕćďŢŰťY>ďrőKŠO<ĐC-±>FąÎ˝ěŰÄ ćÝÝv 4Ug©câgĘüĚ.sÚÇÓěť6˙ÎyźŞŤŻ1á“ČZK@ĘíNăłfÄȢŇUÉRç )¤„‚ Ż­ď¦ÍÚwűÔ¤D@DDD@DDţóîRŞš°˛qú›žDŽ1·:ç-őÚíżj·†)g™ńBĚî!ĽŐŔ#Ńx‡Fţ/ĄCeśZ’xîŇÖ—ŢÍÚ¸kđV{˝ęW˘ńŤü_JÓ-<´á˘Pś °'MmĽµĎÔâS3|nsy&HČĂ[>M»Iß§ü  QNBI&Š“ż’oÉp͊ךδşZ#ě"`µSU6gJEĹ€ůŔÔŤý‹~&čĘy**92\ĂAÎ!ŽÓ^˙r• Ó´¶ŁŤ¤Ü†4rÓ[Ňň ‰‘ą¦OŇ€lĚ®˝şöy]1ÖkX‰ť˛ÓąÜ+!©˘Ąs%“fFjE‹A¸ËĽń×´“żO"ś“bÎŤĐG'0€ă`@ő·ŹÍn†† SÉĘŇR "móئͷß˙ĽÄĘÚ™ZĘÜ: Žg8Ř–›X÷*ŇóE#cĺ^üQŐ1ŔÂů- ·eĎ˘Ń ‘N÷ń™ĂXÇ1ÁĚ sŽkűĆĎelŁŽ¶ťő§‡“ËÍ‘­8` É˝‡äµSÓV˛jü.HZy72 ŽPyÚë·f‡un†hŮR_&0l^ŤÍ-·;Q·aüÖą|߉ÇvBóθŽsÝtŮ~ł~*dĎ/6|2•˘ÖĚëu ‚ű­ŰmÖŠćb2QĽ”ĘNl® Ęçq:›|vőj$®…Ť’ĽÉŁcĐs48_Cpo¶ŰÚFő"ź˘§†8MSd  X@6ź€=ËI¦žF; Ă9,ŤÁ X4}{{€ëR(`†˘şl>śEą!®_Ě{l8µ`{§ ˇÚ´ŢÄ\nংl*,m°ş'RÄ憜¬A°h¤€l2€‚ËÉ˙ńsţŃů9kňźË†ŕ•sÓA)%+9I[”’áÍ:[`ł†§űěňü_îŹÉĘżĘß%07űS;üÇ.q;^´¬DE ´ÔT6śG™¤ç~Qbâwö-Ë j ćc´/ ľçg7®Ë[ü˘˘c\rĘâŰÜę6ń=_eČE›7&ŰÜŰz":As¸M¶„ź‰DÉ䌱˙˘Ő˝Ć·6ŮÁkź† †Âc‘ĹĎ,ÚâÝ}ji†"I1´’CŽ›ô×ŕ;—®M†üĆë·M¨"zRśQůÓĂ™pĐk›ővńZŹŃ27=ܨ °#“7ąŘ-żÝ¦ť—ł  qXČË[+tŘ‚!Ĺ)„"R^x·¨;řMű/ÁkŐ#© KKË,lH×éwr°°µ¬+ml˘Ü,‚1Šy¨ÝS d{@#)'€˝‘Ĺ,Źš6çĎfW6Ű‚ścanRĆ–đ˛ńćđŢCÉ2ň ?OXu÷”YŽŃ<´':ö» ´µ˙?‡eőIĺ%)[;[3šăfŚąoĄÎŰn·zµlQ±­cCE¬Ůo쎆'·+Łc›{Ř´‚8ĺ,®Ę[,n.-ÍÔzŻomŃeŘŐ+*dÜŁ^Ŕ­Ú, űŹnťŠĂ+o{ ń˛di7-ěAY=KPlĆČ9…Ú€-ge¶ÝçÝ˝m¤©ž8b/&BŕŇ[a¦ÝŞnF­orđiá3‰Śm2`ëjmDDđW¶ AÓ<´4µŕnvË‘Ĺ]K6<‚Iiŕ{ĂłfsŁ$[€rŢň; kí;Ľ ę!~O#d†šŢÝŽkăhŐÖB§Ĺäd•ąŽką¤ś®×{Ť´']U~ľÓ»Ękí;Ľ "kí;Ľ¦ľÓ»Ę&ľÓ»Ękí;Ľ "kí;Ľ¦ľÓ»Ę&ľÓ»Ękí;Ľ "kí;Ľ¦ľÓ»Ę&ľÓ»Ękí;Ľ "ôĆ‚\÷€8k˙•âY`„4ľYąÇ(¤’{ęA”Z…u “ ­ţÎa}¶â˝ÁQMRÂř*]#A±suµřő ô‹ĚR¶YŞš@!-mřÜ_ŠĚłSÂdžFçpcn6“»j ˘ŐçÔCĽřXŘkz÷E-Hs ©t®ĘKuŘ<Aé¨çÍPÁšĐČwĽÖ»úľj" """ """ """ ""ňć2Ř$ŤŽ'S# …» M u[Ů+ nWf=¦ý˘Ed*cÂe‰ÁĚ}\ ÁϸüE¶š†ŞŽ.Jžj8ăŰ•´Î·óŠ …=lbw šs$Żk‰ä € µ­źău¦««¬k[5M1 9…©Ü5Ů˙qY˘ ‡ŕňÉc¤¤-<Ýú°ŹŇm[©č«)XY ôŤi7?«;Sk_ţ§R±D©)ĺ€ÎéĄdŹšLä±…€sZŰX“ěüQID˙Ůfox1.6-1.6.57/doc/screenshots/glview.png000066400000000000000000000702171326741342000177540ustar00rootroot00000000000000‰PNG  IHDR”9·GÖ IDATxśěťy|Ĺ™÷=ş/[’/ůŔ’đĹ!ŰcK|€Ú„vĂ•@Ŕ D–H Kď˛/9ÖYŤ‡'z IVď±!ŕ7`›<Ś‘ŚŔ ± Ć1ľeÉÖ=ÓÇűGuuW÷tĎôH3Ň̨ľ|šîé®®®nŹú7ĎóT=%Ô˙Ű*ŇsŔáp8ÎHůŮÖ˙B:Ňspëők°§őݨ+«E|ŕ÷㓜Ëáp8śčYQw>9zź;áXfÁ đÁÁýQ×=’ó,ĽEYříKŰ‘NwN›y>®Z{9TU˘¨PŞJÖŠŞBU´ýÚńćf?r а·î_‘ _«§Źoóm˶•Ëęë޸Ńćhx¬ç^V_oŞgNu5ć˘ţůߏ#ÍÍaëł¶ĂnźÓąGü~r×p[o>çߎo'Ţö_ôW-Ĺíwţ#‚Ă}e˛"C‘}»eď{#z§÷ôp{Í=ý¦ăŞb9O«GUT´¶íCQA ME_Ţąčé  ¤8Ăç08pŻľú*îůÚýřű«Vâs_¸…ů™(ČMÇąžÓ8Ű} ‡;pÁ…ŁyËcĐ@ĐÍ·ů¶e;€¬-˙¬ŞxĂçCAYf‰"f‹"důeečîěÄeőő-ŠčhnĆeőő¦cÖseÖÔŕ˝'źÔëďî섢í˙í]w!ż¬ ŐÔčǬő_ćóˇĂďGwg'd—Ö×c–(˘»ŁůeeúůÖö䗕ᚨŢ{ňÉz­×Ptúý¦öXë—µç5Ţ˙^|;±· +—"8«\púş?Á}úÓ«xőŐWqÁüŮ8{ć$ze0˝Óż÷ź?Ŕuźż o~Ź|˙QôőžÁ…óçŢé…SP:§gŹa¨˙,†ú{0Đ×ëoşżřĺ3¸zí ôžíÂąžÓ8×} g»O˘HAQA¶żř˛aˇŔp Y–!É2–{+ (*ÎżřrT-_‚Ą‹/4—dŇŕ|*€ÉZľÍ·-ŰműňúzĽîóáPs3Vú|čôű1WqČďÇí~?>öűńšĎ‡RQÄ-;wBôcŻű|xÝçňGőÚĆŤ¸}çNĽćóéőSVú|xÍçĂĚęj\ćóá—k×â;ŞŠ×}>ĚEĽć󡤺łEO‰">Ö¬‹Rm_§ßŹY˘RQD‡ß iĎÇ~żŢţ[´:`E}=ůý(E\Ş ËS˘+´¶ĎE˝=űýzý—Ö×ăőŤ‘ 'ţířvâmSdYĆĂ?ü)ţéď@0D0(ᱟţ_ąă˝ űήZľ_ż÷.ÝRYľôbŰwş,Ëdż$C–eÜzÇ×đÖŰďn˙ĘzlýńB’eý8ŕŃŻg”Ŕ°Qą,É€ŞTUE`8@öÓăÚĹĎhçvČĐĎ·ů¶e;„Ë}>řeŐŐś'ŠŘéóˇL{q«f‹"$i®¤9˘żĎ‘9w¶("°q#ćŠ">´q5Ńý5;wâ#ż+ëëѤY wŠ"©săFÜn9µĎ‡Źü~”‰"‹çŐŤáSUtřýđkmĄíůHkłŕĂćf¬­ŻÇ\Ír˘÷ęóůđas3nE(vú|XU_Ż×ń×®…OUá@{^ú·ăۉ·=Y{O†ş ĐĎ@ó;=ⱟü”ź6l2żóA ‚Rą¬Ë–^DÜ^Şbh.(Ůzť&—WaA‚’„ $a÷[{±§µ ;~ő^üí+:µS§ëÇOťęÂâ%KŃľĺ1(¦ČůcŕŰ|›Ý¦î¨rQÄä˛2,­©Áź|>|ĘçĂ™Ž”Š"^ńůpľ(˘°¬ -MM¸©© [×®Ĺ?řýŘşv­éÜĂš \VŔiÍe%Ö×ă°ßŹ››±¬¦=(E|č÷ăóMM€–¦&xkj x[s—‰őőčîčŔ+7˘¨¬ ˵s˝55x®¦ĆÔÖ38ě÷ăJźĎÖÔŕ|Q„·¦o75á|í¸`RY™ľ>ě÷ٰ¬ *`ŞŁTőöĘŇ@~‰&ĘżßNĽmęňšżđ\8űéĎńVKö´Ľ‹/é&‚AČš °ďôÓ¦bą÷bĽřŰ?áÇŹţ–T\¨Łďôâ©%5«˝g» ’ý_ůÇ˙…–˝űĐúÎ>ěmkÇ_ş‰śŁW=YşËK¨ŻŻWo˝~ ^öżŤ˘‚,S°…kě‚:]gşńµŻŻÇ¦Yó@tŤčÔßćŰ–mă÷‹ÁĽęj|ÚçĂ­]kstüągçNĽ¬ąçƲ­ôy%ĘżßNĽíËjżŚţŞĄČÍ/Bßą3eŠ˘äµíů,Ĺ÷GýNżlőZ ôő ż÷ )g ŔÓóŮ@ý‹–ˇ|Vî¬ýW"(kŞć# ;&ÜÓßŰŤ··<őy‡ĂÓ+— T‘WP4ŢMŃÉD?ľăű‰ˇ|rě/ś}-S0oKô]?9‡“:ě;HĆÄx"”ăp8Ç\P8‡ JĄx#›¶…,ŃÂÖC±ÖW)Ţčş.k˝±‚ÖW»~ZÚÚŁnŹ•–¶v×őDŞź]‡»g·Ď‘Ăápăťa÷~Źöťź©@]Í:ý˘µÚvíú ¨ôV µ­[6ąş­§Ą­[©x+°µi*˝ú±*mۉښuú ÖÖ¬ÓĎßĘě«[ż­ţí¨o4­Ý¶ł±ią7­îÖ¶v}m˝®őžčőiyúą¶fťţ™˝ú\ś¨´<ö^ŁiŹőy46l2•‰ôÜ9ÎÄ€}żÓw }˙GzçGty56m ů•M_d­Qüú¦JGÉľ(éËĚÍKŤ=Źnłí /m*:ŤMŰt!tŰέMŰP§=<¶~ÚîÖ¶v´¶µëb`˝>@^Ňěui}v÷é~Ů{±ŢżS{ŘcážGĄ·‚‹ ‡3ÁˇďfŔůýÎľťpmˇ¸Ý©žFć×µőĄęĆB©b~ˇ×Y^Śl}[µ'}ˇŽ´ťáî“Z;‘ ÷đíîß©=VKk« ęä^ŁVŤőyP˦QP‡31©c~tŇĎVܸďÓDQôMĘÂŚ)ŶŞ,żg•LÇu×\‰˙ŞţŮ ěŻčÖ¶v\wÍ•U2łJ¦ŁŠy»©ofÉtÓµiťÇŽźÄőZ˝GŹźD]Í:ŐöąĄŠi‡ő>Ůĺ:­ÎY%ÓC®o­‡Ţ#ŰVÚv·ÖŐŠł¶É®=ôzvĎcVÉtĽřűWőňgâé˝÷Ňď_Ĺu×\©ż·­śě:·[ß#Ëg„ŚCiŃ€2Ň—ŽµžŃşX¬˘X˝ ­íŚeÝÖëD»° qŕp8±Ŕí{/RzßÁńăĆ_8 ‡Ăáp8n ‚Âǡp8'&čAů@0 $Ťg[8‡“dd¤}»ô­ĚŚ dfdŚK8‡“üp—‡ĂápbBČ8”ň˛óĐß?ŕęä¨[ľ÷ť¤.ßWż úűéycu?”źý÷ŻpčđÇ®Îßň˝ocά’Q]/ŢĎ#+++Şű ‚ŁjßXß_˛—Oµçe˝`ôߡT&DPúűpňT—«“Ź=‘ôĺ)cuŢXÝĺĐáŹń?żú™«óOś<=ęëŤĹýEs?Öşýţ’˝Ľ•Dkßhďýw(•‰8R~fé6ëٸ‡Ć¦mŘzXżŃľsíóDmůLTy+ÂŽ”ďp7ĘĘ:ĐŃQ†YEZu{܌ħüKýŁE/ířµë|eÖë„»Ű˙;š±9ôĽ±L™Â¦Ě‰f ĚOšžŚt¬ôÎŹŘÖ–¶víހޞ Üö9wĎ»y׼¶kľűŔ}®Ű4ŇöŮŃřŢ6l}oj—źIÝűgÔřžyL=ש<ĄĺD;¶ľ· [?íîąÔţqj—¬CŐ ç{Şôß”č´?Ţ*š˙^_ô·.ĽđBś:u §Oź6żNôFl×C O «§………čééÁoĽ*ěsgż‹ĘĂŹŮęEaŘk 'bűFÂ̦mčőV ĎҶü¶ö}°1”™ĄÇ_ŘŽŁÝAč8uĺ­“Űżóń–¶v´Ţx3ę–®Fíó ›Ş¤¬¬˘řýwá?žŔŽă8Đq§{ú˘n—DQ„(ŠČź<µë7Du®›\g­míhüů3hüů3xúů?FLkđPĂÜď[ʧźß€™ĄŰđôóäóC ODŐ6¸ę†;đŕćÇŃĽkOŘrŤLZ*&nłŹ66mĂbo`wۇËíŢźŻ[¦¸ŞżyפOľ˙±ą›˝#bůѶώ©çö~Xś­/tźSy¶lźX¶<@Ädî©7°ić´śśú˘ĺD;6Íśą§Ţ@ˉv´Lv8çN5 ˘2<ÔđîűĆýxţůçQSSźĎ‡ßů[˙~[ÚÚ±péřÄjl)Ľ —ŔíţVššCwęKSSSŘöĐďqK[»ľ¦K4ŮuóŰÚ±pýäkmĘokÇ‚ő&¤a,”™ĄŰ_ŘŽ‚Âv¬ß@[[!~ůü>ÜöąOŰ–olÚ†üÉíčęéC–pZ'·ŁµˇÚrç_`•˙ü5´>ú#´6<ŽĘ»ľ¶±˘Ď_ŤH¶E˛&_ś>[‹EOŤĎüăF›·Ş©© ®ËšXX9Úá÷űµ-G»Wă…ťŔK;Z±µ!tiWO€2”—‹čěĘËŽŽtőD—˙ÁÍŹŁző |÷űĐĽkÜü8®X˝Ő«WĘýKýٍôV`QůLˇą~"Qé­ŔO›šŕőz‘†ČÝŃ{{*ŕ÷űá÷‡fX¶ăµ]{đ›ëB†yÖĐ´î€ňŔ}Ŕ‚ócÖ>;˛¦â;e^<ÔŃfÚ®<[;—o™Üާ^z—–^ďxU×ţWŘ6=ő¶ąüë·GmÇ:ÔY˝ ~ŕňÍ%¸üÂÓî×˙zŻßj˙ăńWýżÂE‡."2Éęýî÷qKŢ-aŰ2ŇQVV†ŽŽkâßřžy˛Ńöďńh÷,·W u# ŠŔÓĎo@˛dW…x šQŤ&4kźšš€šš´µ‘ç}ą·ĚTzkÓ6´ú·cűvˇŇ[?ěÜŤ{ľzž}î9 ”÷Ců a“.*ÇjÖ!ż­DéŃH%-”cťëŕ÷ף§ç|DNuüµ>¬ţ…äŹăŔámh-$bRíP˙M5ë‘9™Ŕđűź/ű˙Ś©·źĎĂďŃ,k!˘ŁŁ ˘Řޞ<ýüCĘ׮߀™ĄÇ0łô¶j„ň"‰d TÖ¬@^Ř~ż………ú>7Đ$ŚnÜ(TTD‘,Ä"˛˙Ĺ,ŠĐÜ~@G”ikw<¸ůq[÷Đ›·ą–- ŹcáŇŐřĺóÔ…Ř­Wy+°Â{üţ&Ü[słéXK[čŻŇŰ>· wÝŐŚcť3Cž[cÓ˘ňß}ŕ>TŻţ-Dq#Ö,{žÍŹCĐ,.uő ¨mű¬´LnGĂÂWđ˝{Ç´D¶ě®›Ś†ë_±µ"j—n@ťw®Ľ»‹oŔ§o~W^^±]W^^‡Oßü(2߀+/ŻĂŻ_»•=6ßĂNŕÂÜ\|~Ú4Óran®cÝ]„/Ěű‚ią¨č˘m˘Ľűî»8{ö¬ţବ,lůg:ÖˇĎŰźJ~0ÜżľO?żÁu˛WQ±~ýz]T¬´´µăµ7÷ Ę[©E8uę`}í—\ŐOéóV ×[™MŰpl‚§E ëňę;Ű…ÂÂBBEÔÔÔ`Mő§Ý_hjş~=T_=T=üţzĚ,=R¶şščČťw–˘~ÔĂŹ;ď,…(Vă_ę )/Š~ěÔügw••ˇY”őë×ëżxX®˝a |>>ź–wnBË;7é˘îE˙“¦çđŤn@OOÚÚÚĐÖÖ†žž|ă†đ“¦çÂ=.ťÖ¶©D46Eç&ôűýĹ\{CeŘrŐŐwbçÎźcçÎźŁ´´ŢŐ đÁÍŹCČČEó®=¸bő ]DČ‹Ůůĺ+Šä‡D4î®pÔ®˙u‚iĄĄm *۵éŰăŐ«W@´µ&&Í»rqĺ®Íxpłó‹=í«űĹŕeŔ÷‚â÷Eř^đÁ÷‚[lCĺ ˇ?Š*_¸[lÓË _ B4ę˛Đú–&2˙?üüz=NőÓýlůÖ=í¶őSŞCŚŮ‘FhÜĐÓÓcú;]şt)¶oßî(*˝=hě؆/6m5äŻ˙\;|>b˝ŘŃ  ľŢř\SSŻ×9¶Sĺ­Ŕ«V Ą­§»{1mÚ4@Ăُ֧3`ö#{Ż;f6mÓÝ_‘AybťĘĘĘl_ŢĆq{‡ě±Î™ÎµűÄ}÷Ż˙uČ>żż€ŐđŁŮ=6CĎ n\)˙§ăP¦=úe§f@ÇÜáüƦăhmëÓb%hl:Žşš’r•Ţ <ód# ďlô/?źĎ§ĹyĘđôó¨ŠĹĆďm†ĎçĂšeçă»܇7?Ž×â(†;Î Z·W]Í:ÜtăµúçÚő˘5Śř56<Ą».[Ú¦ nýš°ő_±z:?9 wü7^ŰÜŽO. zuänťŃ¶ĎÄ$ç ż¸u˛´cĺ)ő×Őcă ńxńĐb›_ĐYŔĺo•Ŕ?ÄE"r­úëě›C÷űß&ĺĹE"üühhło€ż ŕ;ź÷â7Ú/sşĎŽÜÜ\Ľßů>ž=ô¬i˙űÝďŁ"/ňßŐoĽ ¨ŻŻGaa!ššš°cÇÇżÉEĺëŕ÷o€#@ü"ęëQܛݦÎFĆűYSSĂ1ĺ©•săŐ«ŃŘ´ WŻ]‰Ź>ÜošHĎ Öo@A[;öj‰?hŘ„™MŰx e´47¦? żßŹJŻ}ÜĹI€úΆţc,*_‡ŽŽR4ű7˘¬Ľü˛ťjÎDtC±>$«?ÉĄ©Ň›ŹJo>›ŽŁŇkß­ŠéĄŐŘt\ű#~®_[d*?Ą°~?ů˘Wk·m¸ËDgŽď>pţýűđÚžv(§MBňŕ÷â űáĆFÝ]_ÄĚŇEZ#Ďc‡!}_ÖlĚÉ*a©Öb?®=PWŻŔUßż9â9Łi_“ń’fřD@Řجď W~ă;ćxŠśPn)Ű \^\‚‡Î4ŁYŹ ż3¸^4ßŘlśŘüN3Üđú­Çqeőq­ýÚÎ%Îĺď-˝7¤w—1Č÷˝¬¬ ?ýߏ ?N+˝8ÝÝ‹§·ż‚/ÝxUHů–¶M@˝aŤ˘>0«(4FáőzMÎ2Śďń̦mä's[»Ţ[+Ú-1K™˘VP¦ćcíÚµ!űŮŮIĽˇ4ä—­ßüpcč}ňÉÔ×—Âçł–oĆmş/*+Á˘˛a\-zńÂN€ŞqÉrýÚe¦ňÇ:g˘î®¦}n,”‡jÖa«˙϶ÇÜřn©€TyóQĺ &Vc‚ULŕ;ëďÖ·›`­ľB­ +NÝkťöł“ŤĹ"e~­ŤĄćDĄ÷4*˝§#–vígóăŘ€Č"ŽhÚ+^tv‹†;6Ö 8X.Ń0µ0?ä{ôôöWpş»×ńś—vT ¶ćÓhmkÇ3OÎD]ŤýđŻ×QDěmĚĂ)?Ĺ (S ó±Ĺç.í”+˙úP=ŠPţź#^Ë*ÖĎŔČç ąZĽ W‹—Ťč\®Ed4ŘąĐâ{˝Ń‹I4K®y r!ĽĽăż±Ŕ»ŕž8żö±ă4ö6­˘űňŃÖďňnÚ˙© ŁŞß-VË„ĄĘ[ˇ÷ćŠd5Äkś ':BćCyügżp=şóĐáŹQ˝ú’¤.˙lÓc˘żď‘ž7V÷CÉĚĚ@áäp~ĽĽ\Ü˙oŤęzń~;žţiT÷s¸ăoŁjßXß_˛—Oµçe˝`ôߡT„O°Ĺáp8śŔ'Řâp8NLŃc(ŃdĄĺp8ÉCĄ·˙t÷m®r8#E”C‡?Ćg® ßďźĂá$ĺsçŚw8„ŤCáp8ÉÁôiSâVwó®=¸pἸŐĎIl¸ p8éÓ¦ÄŐő•ť•…§~µ˙ňO_‰i˝T¨â)†N×万 ‡Ă‰)ý1­ě¬,l˙ź?âĆĎÚgÝŮYY1Ô;Qོ8ś ť$ŁM Ę™p …Ă™Ŕč¸6™ćđ©ňV>oŐ~©ł9ÝÜĚZ»~žp‘ťůt¤ąáěę­­ ťÍ±RĽ­ţí!s"ŤŐ,§W‚Â{‰p&:Ż4ż‰yĺsÇ»1…ŚFmΠƆM¨[oĚ9˛ŐR†=—–wšű‡ÖOEZ§u_+#RvBdĄÖ¦nşŹťf›BcçIbŰí´ß‚+Aą´jiĽŰÁá$,í=C‡?N9Aa_ěôĹňKßňŮô˛÷oŹjzlú˘®o4]7dźfY°â`ekĂ&´´µŁný]Ô¨T1ÖH«ŤĐŐŐ¬# s˙ô^Ă]“×./>(Š3Qéďď&Äö—xĄhž´«Ň[aúőN׬ÁZv°u¸ŤÁ°/řÚšu¨[żÁ6‘,uiQkuź±±!«x°,¦0×äD†ÇP8ś űŇ´n·hżÔéËšgçrť×ÝL•·Đâ.•Ţ 4jqšF6–bł0ÄËşßz Y–=ŹĆ}t׳®cÚććšśČD-(§{úČ<đL)Ě7M”ÄáÄ’HăNžęB^nňňś§¬íď@˙Ŕ «ş&*4(Śnúv"9úŮ®L¤óÜÔët¶ýt?Ű©€ŘçAűѵ tőôádO ÚÚBç(,ěÁ@ŹßôČö˛ _Rë”Ý‹/q8Z|ĹśäÁéE¸óĘKç //7¬ĐrnęšČ¤úř vľNl‘Ë«§§Út¸ŐŐĄČvgg'2™rµZŹ *$UšOŐúEmeúÂłţLV\™n‹Ö5[Ć®{ +j´× ”Ô‡öDbqňÇ76lBřĚZž×n¤üý§«c>˘}ú´)cŢ9h<®™LüűC ¸ď«_6í‘ Üyg5ęëď Ůď÷űńĚ“ŤúgÚă"R@Ž ě±< íńŃŇÖ® Bk[»m7ĆJo…©—í…BEÄ®×'uaÄé{H»ĘV2îĂťGƤ}©F$ËŹ“:ŘM26&#ĺëţŢNÇiďÖzaE†»îŽú,í—&`îĺáf>yÎĤŠů~ń.ŁÎȉk/ŻĆ†Mş ˇŇĆĹŠ‡ő…oí˘¨÷÷o××4¨ćÔ%µH¸‹+µ°vsM7OjĹRKĄ±a¦ŽŞ}ÎDdD‚ŇÖÖ¦ÇPX¬űě‚^Nř&ËĦ‹"»_?n©ß®nkĽ&ŐŤ7RéÂÝJËéťBx–Ă1Q JoĎiřý~Çăܵĉ'GŽÇ'6ľ[–ţţî<‚)E…!ÁőĂťGP8y’©®Ď¬]ŁÇL¸eÂጜ¨…÷ŐćŚ'™»óö şęňë¦.Nü÷´ă[ľ÷mÁ¸ŐĎ %*AQ¦Ě‡2eAĽÚ’0ä>ł€ ¨ĐÖÚhkć3ݧíŘsBŽĂ\/[Ýe*G¶yď°^• ¦5čšÝű2Nç FaĘöőö±űÓÂcdm‘ € !¨}† Ânşc>f—&žu~đwăÝ„”ĺĐáŹńňo~·úŹ=Î{›Ť1<őŠ‚@^î‚ ¨‚ńĆUUć̢a® ô¸ XĘ Đ…„ÝfËYÎńmňčĹĦR­L¨h ¶Bfm#K€ UUő[Ş*đ@€żůĹ>|mĂĺŽ÷lj?Ö1]t;·5”ĘDcéqA‰)‚&BÖÝ1aµd$Wq‹QThŞÇ$0_Ëz}VČŚýZU"&fQ1ÖôUÍŔóżxźűň%Ł»Ω«Y‡Úőôq_4 pĽ%Š×ŢqÍĄđżń|ßú:|?đ}ëë×\±Ś˙Ť·°ń‘Aíţ -@ý7ż†»ď¸EżÍ}¦»9ŮŮČÎÎBNv ;;ôĎéééHOOÓ·3ŇÓµí4¤ëŰĆ~RG–éžrϤľtćs22Âżz‡Mꇆ†ôí $A’dýłdů<Č”»źÖEę”$ cph}}ý5sŠ&Orméńmě±;7Ę«Öývu;•śËŮ˝ěťęŽÚ:±ąŽą]6×6µ#ôúŐk(š˛˘*0Ôëw¤ă>é<ćţ8ń†ÎBÇăŚEÖ]˙KżÔ…Ă˙Ć[D8}™ßÝ÷­Żëűý/ýR?ćűÖ׍í‡Cőę¶×9třc\˛| ˛˛2ńQÇßđĺ[oÄŔŕľpĂ5ř ×@’$\{őZ\ó©ËqUő*ôőőC\˝«/]ŽŐ—.Çu×\‰–wöˇréĹXzń"\´hnýüßăőÝoăüŇ9úrYŐRĽŐ҆™3¦aćŚi6ĄE“ pĹŞ*üęů˙AA^.˛33őĺ’e‹ńäÓż1ícËM.ĐëZZqö¶µ›®·p^™ŢŽ‹ÍCĺŇ‹QąôbüÝUW ýŻőöÓ{şŞz®˝z-®˝z-_¸á|ń¦k108„`PÂß]UŤS§Ď ţ›_‹ÚŞă‚ęîL˘/pńr7ď˛îsz)›·mE$ä%?:W—ťXŚÔŐE¶Qc T•Š ]“óTx°çµˇ÷Ęh&ŠV˙vlmÚ†K6Šxáă-ř~L ˙oAĽö6řßxËTÎ÷đcŻ˝ ±¦÷ IDATXX F/ىg|ŕ./;Fę’2Ĺ^ěŽ9¸˝Bâ+ö KW—µŚÝőŤ6›´Lĺ0Y$Ş˘ążX+ĹXTU…ŕHg>é<‰ŮĄÓGwośaMó>¬˝îvÝ]Ŕd­°řľőuE °¬ą4DLč®0Îř Ô××«ĺł đËg¶ă3WÚ'Ä[÷ůĎâä©® ÓË+ç˙=jé­Ĺôô2őöbËŔľ·[Ö¶·—ĺ:ô4¦Üć÷Ű[1´Nl{uiźÝöębë:©< ه—¶cÚă+A@†a—U—aĹ#H?ř;î<‚ƦmމNůÜ9¸´j)NžęÂôiS¦çÓ·6ţ/˙ćç&°‹ŹP¨;ŚnĐ…Ĺ÷đcşë‹ž÷·č÷ú­Ť?ŕ1”ĆPţíţ{lż3ßÚř<\˙Ż€}?ÄŹÁ-;‚_†Ěö?[ö/MŁ·W3Fé!Ćš*ôĄ­÷â26ípŞ?’8¶Ç…«KŻ1L Ţĺ6ëâ"‹lcĄ(PU‚eß'ť'$† pâ±~f­§më9tűČŃăúľ~ďŰú€VNtäĺĺ.„pA±ţâ¶ ‚›ó@O‰tžŤŘŘ M¨őঠn‚řáĆ´Ś$OËp>B¬**úšÝoÄVAĹ'ťáGÂs8ŃĆ2K:˘xn\P CMĚq;+E+h±&ôóŁ“™Dsº͂jB¬“Q1'bBz…©‚‚·_ß‹K._ńYp’—~ďŰ&+"ÖDóËš¸ 8ÉĄą‚čóÖ&«etx'WWĚĆś°ő«*B-löi˘"ŽrĚI]ân5p1sx·á0¨ÄDqçj˘0ëČrd©×ôbvw®[ëÄľ©±uuQęy°wwŮ-’mą·_۱Ý'1áŠ-v/ajq¸w{™ĎEn/cűăţˇČřqsbÔ%@@VA±‡EĐsRž2őŕ‚âŤڍŽŃŤIů[˙¶{”. 8Ž9a»l¬‹»‹ş¸XWéíĹş˝8© O™zpA±AşřRdü…tV@ V‰Ó E ¦{°)`— ·ŐZ'¦fZË8[Ć>VôšŁ ćt7¨…Rł5â$&V7IÍBĘ—¬©rxśxBgcĄëńHIa@šR«0 Y+¦y×SzÎŘĂ]^áäĘŠŞ.اb‰8&…]»ż”^?Ä"FcN¬˘PgŔεE„“ ŚŮYáQBâ4ś±e,CˇÉ!©HX@ęű5»źM˝âă-řßxË4 glŕÉ!ČyVKXÇ$‡4F*†ĐÄyzŕ7OôŕÍ“=Fnť8&´«'B ŢZ—µžr ěǝعşQŃ’Dz2«ăĄŐ—˘jM%Ćž2~„KIc"€YX¨xXHRË„M9˙üRž’'‡LŘ[v=łĆlL -2r1u_,\]6ÖIÔÝĹ Šáţ2»ĽčĽňě>Ô"J1ጠNÉ!mÓÓ3n/Š]*{qÍĄ<9dŚŕÉ!c@đ˘Čř Mťm#QCEČş;’Űk$—r¬wpu™bl:ě‘ ¨Ó`îúK¶Yw—!"A}Mc'–ňđĐ'¶đ䣀'‡ŚBČË>dLJ¸7?ká#“âd…D˛NLͰquYŹ…Ôę겖g]]ú1Ő*"Vw—l…ÍRaëáÖÉÄ€'‡L=¸ ¸Áöĺ#ĐnçöŠŐ”0]őóÁŐĄ×&ďrŰÎŐĄ[((f‚ěÖ‘ńˇî.ă3të‚€Ůsg…żgNJŔ“C¦\PÂÂľř©p„)¶Ş0BăĆíĺĆŤĄµ·`ěę 9Őóç ZbyŠáę2Öşˇb"ć”ÎĆ,.(NRÂ%V·¨»‡~`‚ólŞy68ĎÔťŰkdřöÓ6ë»F×ďÝRVŻŹZ'4(Oô–t+z@>´­ÜÝ5qŕÉ!S.(NŘĽě\ÇMÜÔírzŕż !N®®±sÂŞE`­[ E`c)F»h ~N·N&<9dęÁ%v""hoúQL¬BŤ0nϨűH˙°vz7VČĄâëę˛\ $eýdÍB µN d¤…-b"đxT­ćÖÉxŇŇÖŽÖ¶vĐsyĄ <9äČáÉ!c€tá dĽŻMňdëö‚!8q“âŢŐ·1'6ő„ Ť!l—asŻ/Ł.ăVŞÖTqëdś©ňV Ę[ÚőĐذiĚ3Ű%„dŹ­˝îvě|ń)Ó@Fvmđ8˙üRý|ž’'‡´^GĆg°ÄF\±]!żţÝT5rW—í…l\]ě¶µ3Ť©‘ Ŕ,AB‚ éb"Ŕ*J‚Ç9Ął¸u’ 46mCĄ&,u5ëĆ4}˝]˘G ;jžćí˛®#Á“Cňä B¨Ätz`Ű:\âMŐ8»Ăb>ćÄS "K ľPAKŇŰ×Ď÷xŕń¨ä‰ ęň˘"ŇŇÖŽÍO|?fĘÓeµN¬ąş|?†úo~ °óŧôsŮô+T€8c wy…E@Ččv§žYŁq{E“ÂěGW—^këÄĺv¤@Ľ^F ¨ÔÝĄ‚ťÂ—WÍukçxŇ<¸nݵuŢĚĐ{ĺŚ •Ţ ÝŐU©eŽ7z:-‡›ŹK/ĂuoŃĎľo}ůŃ´•.(n ÎSáĺ7©X`/Öcc=愵ZúŐ"ĐŃî‚@T1×ÇÔCp1I0h eĽĐc!–ůLěňvŃă4µýΟҷé9ÖQřóĘçâí˝ď!';ç—ť‡_üżíČÍÉĆł;~€Ä=^úĂN=†’źź˙®=¦JŐ˛Ĺh}÷/z ĺý‡půĘKđQçý:uÁĄU^;qJ;ŹÄP^{ł·|îłčí0ĹPŢ~gîüŇç1čű‡őňÝg{őʱ§°Ü[aşž$Iz;Ţ?pČ+©¸p!v˝µ—Ô94„üü<ĽŇü¦CQ<»ă÷$ ą9ŮJ~÷J3¦M-ĆĆG~„yĺsŁú7ä‚«Řçi`öAN4¬¦7cRb:ćÄ)(ĎČ]¸şĚ——“5ŮÚ&fíń¸–‹ Ç‚]’G7‰!­‰&)<9äČáÉ!cŤŐ+b±X ‡¸˝ÂŤ]Aä1)LQöxÔxÓ¶ŕ°]]ThŚëł—3ĘdŰ(€ÇăÁµ·~3ąpĆžrđä±!xA2ö·8çč4!ĹWç… ˛Ź‹«ËŇŽAˇ‚ĐK ‚€YsgˇrŐr.&<9d*ÂĹŚ`Řş˝`N”ÁyĂí%„gÝTěľćEpuYöŮm;Ť9ŃËÚ u—‘CfaËys×,Ăg.]Úv΄…'‡L=¸ „ĂôŐţ甯k䱏˝ŘąĘFęę cťŚd̉użÇc9ĆTd_ľ ŮkĽ8ŕ9(¦ÓTÉ6ÂČáp’.(n0˝ÜC- ó<).Ĺ…‰“‚óvEmO· Ë1ćx,Çś°u §›&Ä2W/Eć/Ň™;áN@E{šŠi 0]p1— I¬ÓˇTz+đOwßĆc%ă”HčbbcI8ôĚŠe*««+lz—î-»íHx˝ŚŐ=&Hóxŕ™[Ďܤ͝Ďy%ŘŽĂ–{Ń â˛/ŤÜo…,`ş&2śÔ'ÖÉ!Ź? Y±~ë8c ”°8Ä+¬aĹÉíudŔśĎÇÎŐej—őX,ń!⢉Éj/2«ŻÔw›‡5şÖü^𠤑ZkVËbn˝Ś)•⍨ŐFĘ×Ő¬Cíú ¨ôV µ­[6ˇRĽQOÉns8hyS/ŻHn/ZΩJÁ°Z€P·—vüH˙ńŮ®„ Ä;ĺc{DcNô@<9dÄÄöVĂe—…w5«ĺÝ®X" X2eF„š8±‚¦^ˇy˝ęjÖˇ±i›¶ˇVŰ`ÚMÎ/ńÚŰôAŤ4—ÝÇŽ˘§©Uč>Z†rěÄ)|÷ýÓŰÁ=<—W”©Z÷Öŕ<ÝË^/§˝”MńŽ0ŻXˇÇG7mÇn̉µÁŠ€Q-˛Í˘ś8eß>¨Ď< Ľú'ŕäIçgƉ9ŤMŰsx±éX*ă”@Ň:R6>ň#Ó F¶ŚÓ`FÎŘĂ-”0(Sg™]\¬eŹT,''ŇĂ:!ĺŮ€{8"?~8qÂľ}Pµ®ĆTÜ–\¸8ÂŮśX ÄVÍimkGmÍ:Ty+ô}u5ëtáMĘ–ć]{ŕé—ŠŇŃł¨Ý„˘zš¶ĚĆG~„ŁÝĹc(ă W°ŽfŰO±OĹb¸™lóL!n/ۦDpuYöŮmŹfĚ ËĐkő§â3@ÇV*ŹŽ‡đŢ{š& €ÇŁ·‰í™Ćj1©ňVš[‹Š‰µL<  é6¬˝îv]TěĘTŻ^×6qÜÁż״™űK çłX*Ú˙¬cRFdžX`ŚĽg^ţŃŚ9±uu ć:ÂZ'ôvűëDĹĹ=›j8¦‰Č»mšPyWP«“ť/°äÂńKV8±şŻěF˛źc‘L’¦ §–‡ť…© w{%\Pdv¨Čč$/Ćü׬/ČĎBĘ;†áé­óŽ‚€ÜĄgďí€ŕŃlôí-Dđh6 ÎÇpz໺ôÝB¨(ąpuQ¬=şśl őŘ1âŇzçC@ş¨°÷ÄŠ"'µ±K i—$2R™cÇy¬mĽ™‚’ďW´5›ćÄą|FďLdô^‹ŔŞg‘S ČkÔ*2g  xÖý-Ečo-Q*ÇٸşŚCî\]l]#sbŞKĐw…čÜňcÇ€cÇ ě}Gë‹Ŕcĺşjť°řnˇp8ÉBĘ JĎÎżaf#ó°ŠĚ›ú‹>r]9y… ł˛bS$AE^Ő9dÎ’Ń×2 ÁŁŃ>bě”HcNܤW1NsłĐă¶q“ÖV¨­­&A˛­ÉşuB?ŰlsR“x'‡äŚ=)%(™‡UdÖ\WŻ’u fÁöŐ…ĺU1ˇPaIŽĚY ŠŻďÇ™ üÄEďlÝíeŚI±Š…] ŢtÜjFŮp®®Kd(ŞEEŔŮÓičíNł¸ş¬Í%]†o·@8v±c{ uťY„Io§  {|ń"nť¤2<Ą|ę‘Ô‚’˙'âşĘ<¬"ëp”'G!$4Ţ®ś\C„ĂI ‹ ‚&*@:ŠŻ—8šî#q{±ÍµDFâęš1[EĹ%AL™©B–I É$m[–‚şO¦áěé4ś>’a´@0ÄâôkˇnßáŘ1Ýň,bb' ¬Ą˘÷ćkąëâp8ÉCŇJćGŞľD%#y'±ç¨Ś|0ňď>´ż˙ĚBBI‡  QÉś•Ľ* ż%čâÚThč|'KÄĽ/¤áWWÉy*–^Ä´Y dE€,ÓBÔ˝&č—G_¨ 3OÁä§Źd ÷d&ú.]‰á9çaxÎyŔ{ďGʆ}é[]]&w–I  +Š-W±čâČĎ‹“´đä©G JÁµŔů+QvŵľßÜśĹ9ňKWĂ3˙ ?´śfYXQÉ@ţ%™@đ“aKŤ‚aĄ‚iLŠn”ظşÜZ'łJU,[ÄŚŮ dY•tĐťkúÔ˝†P  .T1ą$ě"Á"˝sÎ3ŐÎ:1Ę…wuíf-nť¤:<9dę‘‚Rđ˛ćşúHEÖ!—'9˝o"  UŚŕJđŃűńĎŹĂłđíd«‹Z'f1ˇëâ¦ăĚŽÓ~2" ΗăęB]I´˝sĘTT]DÉyDH…tIV!=Qus•©KŐÄ‚¬=SĽŽţâąś6ęľ}!ÖSxWŕäęb{uQ‘ş['cNK[;Zµ‘ď[›¶ńÄŹś¨sAÉüPEÖ!ňâ*xYE`Ögu¤É€ŹIýâńcwçß!-Ź~đ€ŠŠ±¶łVŇVUŽ!ő´QŹ.(ڰhA›’âbTž7lÜk±01}K{yĎ.W0»TŞňYhWUb¤)€G< Nńš×KńP ĺŮJ gr¶YdE€$y0óě fx€ąĹBÚ#Đ•a±čMB:>[b'Óqž.cdôxR8y®Ş^…ňąsĆ»)ayĄůMĚ+ź;âóé ĆÚőĐذɔi¸¶fťžr…nÓcNŮăŤďáǰń‘™FĐsĆ—¸ JÁď‰őŃó‡Nś‡Đ/{°¤Óo  ż ŢM‰=Á•#:-Ű;ÝUą)–Śč ńf¨ś?×ékD`ÚLź6‹”ŹwKÂŇţ×8třăQ `d®ňV Ž M8’׋ş0¦VŤď[_ÇĆG~4f×ăD&¦‚’ůˇŠ,}Ńvj?@'Ů Ąż€Ň8śQĐß?8ę:Zˇ)ŤMŰbž}“<ÄDP2?P1íq‡`ËŕĐů·ObŃgBQzŢěŐUé­Đç8ilŘDćAiŘ„*f?+4QdĽFr’J`€^µjűx…CšÚgúĂž6Ł8/ěqgĽY8?Ľ{ěŕ‡‡1Ą¸SŠ‹ËtťéF×™WuĹŠH‰ Y!©cfu´[ŹőßüÚ^ŹžąĽ†Č9Dşšz0śČX%gňtřýöE;:šđőřţ ­|ô–ë1mShYö\ë'»Ź­›Ă ÇäIŽ.ÜĂťGŕńR\„áá€c|Ô‰âÂÉ®ęšČđ,ÉEĚflTd Wč…¤!h=ŠôE±Yč1›ş:::ôĄ´ô°ľ°P19řáatťéÁĘË4qčĆĘË"`ý•GËá)˛-C®QhZ( ç—‡Ôm·f·­up8€o4-vTŠ7ę“Yծߠ»ź8śD"fŠéÁ•—GD„öćb-ş ˝Ľ(’d¸¸Ř˛ii€,«PŐH]ég¬¨ěÝÝÖ7˙†ĘUçĹçŤ3<9dę7A ~F‹Ł0#穸F<…(ś±€Ť—PQˇbB…ŠIAYgdĹ! ®.ŠŞ!ˇ±:V…˘(*ÁMB;VdXQIÇ[ZSVPxrČÔ#>˝ĽČó2 ——ÉőÝpçD0^Mŕp„öäJO'"2y2Y¨űŠuwn®’ň™µdrr;,;ŰpˇĄ§Ű‚ B‚‚č2¤š]`{wźÂ϶řÇćAq8Ł$nŠ2/#lpž.AHaëápFÂöÎ{Ý\´[o^žŮ2ˇźi …=–ťMęëë3,I‚A˛ cSZFu!$ŠeaĹ…µVîĎ,VÉ!ë´\`ô|žrbW ”yéHű hŽźö†9śŠM­B\Sä…źžN¤¨Čťx<ĆčwëB{pÉ2‰źĐE–© Pęę"˘ Ş‘ĹNT¬1jĄXFNĆX%‡´–Łî3ž2µ‰«…h݇©E˘Y)*Nˇ=Ľ<Ě·›íéE@UIKÉȰ*JÄŐĹŠ µNX …Љ; E™…-o'* Zßük\ź]¬’CŇr<1äÄ"ţĘůP=< –®Ä\T8ńŔ*Ô:ˇ/~Ŕ"(¤’¤ ” Ęĺ d9Ir; wL2mď}s_śź‡3rânˇĐă&ÖQň\L8ńA Z¦_#ĺ<YűˇŻ(D čČwšäQ’±"rîśáňęë*˛–$˛,A– %Ôň°.vâÁSLĺ÷îNA(ÔëÇ IDATáÉ!SŹ1éSąČxePww±Ósż'öČ ć0VL¨uŇßotý•$cˇóź bŇŰËĆQT ĘRt1 MP‚úbµ.ĚKfáp¶,Ô€'‡L=ĆÄĺ ´w·R8q`ĎrĐ€8 Š+e˛¬ę‚Bg`d]]ěvWpć YΞ5Ü\d­``@ÂŔ€Śˇ! ĂĂ Á Ä¸ş‚PU;1 '.A›ýě1ăř϶4ŤŮóäp˘al\^‚źĘAĆ-éěÇę꜉ÂţłË@^Ú¤KˇŞŞP˛,@–=e’$ŕÜ9sN.jĄĐůNčÜ'déďW10@,ş +ú *ş(Šť€„s{E«•’s>đä©Ç @GÇÓîÂĚ G'fĐT't0 Ş 8 ( dŮáaE@ Ä$0ŇЧĄ×”`¸¸††d *šË‹ş˝TH’¤‰‰ť«+’„Z!d;`ŮĎv-N~xrČÔcĚEúT2ţ4ŐcL µT8ś±żg AQ (­ű/µPT ËšŔx Ëi‰°°ó™¤§†‡¨Ş„`PÖ­*&DPdÍĹeµ4ě\^l9; „ IŔˇś„ŻŢ˙q{~ÖÜ]áĆŹĐQővĐÁ‘­mí¦A‘śÔf -Ý] Ňs"Âç”wĎłDPČCňË…ôđ´XЇŐžU%˘ţěii‚.*’ ŞšŐAâ#$XO%¤b"AU%¨ŞŐš°łRěDD‚YHěZOümrČşšuhary…ź‘“C&c”Ľ2Wë|#“ErÂ’wQŐx7!‰0Źë /yÚť—Ś H0}x8¨/CC qö¬Ś®.§OÝÝ*úú$ô÷Kčë“00Äŕ`CC JPŐ€ľŘ €ŐĘpZś„Äj©Äץ«äP·~¶6l"Çb,&ÔŚ©…˘”“Ë©@ŕyNŚŮßłäĹK-#FG,€Ě¤T ŞÍ-F‚řŠ’EI‡,§AU(ŠÄX A +T ’Y©`Ń2ˇVI¸.Ăn……–•q÷ý5ń|„1KY»~51ˇçs·Wę3¦ŠRžAÜ\ĽË0'ě?[Ă2‘510şË2éŢKbťH"VÇđđ°¶ axxŔčë ˘ŻOÂŕ`@Š2 E @UY+ĹŤ@uŔ˛?`Sff+%ľJ¬’CR7YcÓ¶uqR‡±ŤˇËÓ‘v(Ő#@PxrHN,ˇŁĘÓ@,Ş ‚  `LyşČzEł6Tx<Şf±¤AQH‚ B–É"IÔí¤hSüR+Eb’A†łR쬫°A„dŘr,ţń“X%‡´îăÉ!'c.(ĘůHű(Č-NA^Ŕi`tŞęŞ’ž\VA!321!(J:TU`ćW (Íâˇ/vŞJ…ĆjśÓ¨°ëp1ş [ĂBYľŇçg\đ8Jb1ö‚Rž®§^ŃÝ_N ŘŃyČË—NFež.”¦\!/^0hbĄI MPffÝNTH¬©éí„ĹÚeŘIP†a/(FŻĘUËcüÔ8śŘ1ö‚R–ˇwVąpb kť°‚¦¸Ř_1ŞŞB–ŮůŰ*"4^a¸¶¬ó”„›H+\—áHbŠŠ[Yľr騟P"Á“C¦c.( źŻM L»s81µNśĹú} 1fJ$˝Ĺść|7q–Ý(ůpî.' …Ôs÷ý_ÝăI0xrČÔc\E)Ë@Ú!IË<<-ŕ¤Ű;?ňňM˝ 8u- #Ťu­ „KILhÜ„\cůĘeÜÝĹIxĆIPŇőżmîöâÄ6 OÝ^ěčY{—W|Ĺ.=˝]7b;!aă5*îŽcş'VŚ›…"źźŽ´Ąń¸<'%‰$(¬ubş¶v›‘pń“pI!íĹęޢűéuŔ­NR0.‚šIČůîîňâÄ„ť+*(BE…B·ť…µJ˘µP¬b®»°µ{0-+['śdcÜ‚WćŔsz<[ŔIAľÎé0ÇPÜŠťŰË*&ěľp˝ĽśR®8 d´şşŘő¤M±Ě.ÜĽkž|ćůŐÇ™¸ŘÍe3®‚"­ÍAćłăŮNę0 fA çö‚¶=ÚJ¸nĂnzvQ—WĐr>iG¬­“ ÎĂĂő˙Ó:9ʸ HWćďfp’ý=Ó@%† ¤#Ôí5’ŔĽAa·ťb'NąĽč˘2çI-ă9÷ ‡kĆ]P8śŃ˛˙l H V «ŰË:Ĺęöb·ĂY'nňẠۉ ;Ó$á'Ď=>šÇÂáŚ9RPrŢ”1űćAWeW¦apUZĚĘqâA† dÂ,(¬Ű‹®)‘z{YEÄGa­“péęĂ Š cć9#“đÝ÷˙ďŮĹI:&ś Ěľi9»ÝgmÍŮ-GU>n…çĚý™1»fŞłż' @?Ś—:«Ű‹'+ĹŤ…b×ĂËÍü'쬌TLXĹdůĘeÜŐĹIJ&Ś Dc•ĵ.ŞxKŔôůý+âŐ˘äçŔY€X(ô…nííÎJˇŘ ŠťĄi@ŁťuÂvfÝ\ěu ËW.ĂOýăQ< gü‚RĽ%ň‚N6¦ôxŃUŘ6ŢÍHPÎĽ”éË› ÎG5ĎÉJqÓłËNTčqęňr†‹ '™IiAÉySFń–@L]VăĹÔł\PěČ˝¨w_˛ Oly†K)†ŘçĂMĆipŁ›`<+ ÖX‹3<ĎIvRVPĹĹʼn/ű/ö·| řóŰŔ®Ź@Ä$ †e’{+%ś¨8ăio¬HéęC(†ă'Ď=Îđś¤'%%ÚŔ;'yŮ둱#=Ľđpý·]A\^Ă ˘BÄn\Š“Ąâ4ĹjĄHĚÚ*.‘E„ÂĹ„“*¤” ¤˛U’^˝ čďV$ű+)qXÜđmz:Ë)†hD ĐŰĄ_‰ÔË‹™Čn-–ĺ+—ńîÁś”"e%ďN켇?š¦ŹwSŽËŚk–;ţ¸á› /vÖ:ˇŘ MÁ]Tv˝ĽěrQ1qĎÝ÷˙ďĚI9’^PR)đnGÁÎë‘!îs1qĹšĄŔŽG€ÍO»ÚµťAÇťĐm;q±Ëᄊ,ĺÜĂ]\śT%©%•]\” q×x7!ůXł”,ŹüŘü ËAk˘HfˇŰ¬5„Z-ŃĂÇpR§ů Ďě›S^LŇ«ßď&$4Űo­ _ŕ›_ş^V/avZc¬K‹xhíĚşĽ˘gůżÖp1á¤>22á0±z đµ˝ßţîÉHí@NRąĽ&Zw`©y ‚ţŐÜí ÂşÁbĚ_&b˛f©i÷^ŹŚ{2q·”‰J•'ĺ¤I!(©xÇ ďdřoďfJĽ JĽkóŕDŰř'ŻÜ±î®čOúć—ÉňĆ»Ŕ®÷ČľX µF,"beŻGĆ˝™řI ‡‹ 'ĺHxAIĺîŔnš×ම¸ó«q˝Ž·fŘXA‰7%˲AöčŐ–,QPŠ˘ŕÝ'ó Ş*N˝—Sű˛âÚF+ěxűořćČN¦ @0Df#6,|9tß7möąŕŢLb©|UaćpbEB ĘDsq9!5ŻÁ`Ç@iSĚęôÖ\ ď]• ˝šhzuv™§]…‘˝—.F̡âö!"._쇢(eűź)€ŞŞčúK&ÎĽźł6[±8ˇ‹ĚČD"ZžH`ŻGĆOń{FÎX’‚Ň˙ć dß|kź§` ¦b긶)(ńĂ[ł%ËćČ ň°ŠIĆü"é0ćj§ŰN“O‘Q n9E‘Qţy Š"A–%úő4|Ľ#vciţ\µ fuŤ'{=2.Íęă.0NJ‚’·jŢÇźFtn4âł‹FtŤdĂ[SŽď4”,+‘ cě;WşŐ:ˇbâYTű.Ĥ  Uwm™]\¬«+Ľ»+śŔ„!ay1˙±ĹI<˘aŕ <ř ¦ Îůîş NdĽő/Â< 1`¤Ja"ÚY)¬€x`¶RŘ\^Kg$I䀶™ U•d&&cy W +nDTó[śÄ#:A<ađLě[‘ďěÂŕy‚×÷"Ś ;úĎ7ŚĐŃíT,„Z5T@Řř’’]íA¨j$g— "*tš\c›“]ĹOěÄ$’¨ŕě9D‘8 %ą{wuqW‚räčq|rôD\P8y¦O›ŕo\łsł¶ĹŠ ¤S1±K—B……ćń¬ô Ă ±ŠĘT•ťgťV`H’HYV ‡Ý>YŽěţâ »»8‰Š+Aů÷‡ţwÜpUő*,ZŕśĎi˘ćKŞ÷ŁD<€Đ*FĽÄ)÷µR¨`Xc#l]4oµLúµëŘ‹ »OU%=Ho'n,zŽ“…2§?&úLÜÝĹIT\ Ęg®\·”ĎťöřDĚ{}ŰmöĘ0ßť…nK0ÄÄúźŠŤcĂ2†-Öť…"i“k©Ú]Ě$\96~˘(ŔěŢÝ»ź\Ł'ś\pw'‘IŠ\^ŐJ1¬k—]äĺ?fˇÇ©µŃ§-¬ĺÁNíŰ‹ĐĘŁ5Âş»¨UBRĄŚ<ďF\Ő»?ľ>ů*ď*ĚI`’BP&Ş•bgť”đŠöRg…]hﬨŞŐ}eVTú`X&ĹÄl•cRśÜ]‘¶Ľ]L…ćöZţńŽ8=ńÄfyŃÄüaĹIzĘDưN(#&‚ ň’g]_†»‹ŻIŹ+U…VŢ ŇSÁAşšDÄ*&Š"›„„şąÂą»ěÄÂ)ľIdŃł' '–Űk9Źťpś¤°P¦Ý?ńĚüküŹ0źŚř‡uvDc0#]5«„Xˇv«»ëĚnݦ{0™ž¬ óĂËZ/.Ö µNF˛8 ŚžuX6Ę,>d[Jm¸»‹“čp %ńÖŰ»şh—YUU -–"C cNČ>v 2ç¨0w=¦V íň«jZ7á ľMEF–H’‚`,’DYVôř űâgťXEÂÎB±–ˇű§žŽCȆ»»8É@RX(ŔÄ Ě/­gcÔ:Q`¶PČg˛-CU©ebŚjWUC!ńUí‡;!1Uí,B–‡!ËHYËr’€$Ńí ‚AY’`P†$ɦ}’9n©»°Ý>;QQŕ‚ýÇJáî.N24‚2‘ótĹJ—XV·ÉĄ„P§BBÝ]¬Ű‹˘ôC–‡4ń  « I’fŤČšX­÷n-§ĹmYzlţ_&Npž»»8Éwy% Šŕń5;v„ A .*ş_†ÇŁ0n/@š^Pˇ(ÍR ©QXa˘™‚%‹ËKŇ{qÉ˛Ş‹ULÜ E´BNT OěGĎŚÔÎsw'YH e˘ć§]ľßň"V …uw±™~e] %¶ë/µLTµŠ2 YB–%Ía­ĂJ1[&A’f™P1¬«ŚÖ:q#$¬{¬đxęŹIáî.N˛Ŕ-”cęj"(bĄĐ şU%żŚ.Ä€˘8‹˘¸ŠÇ3 AP Ş2NË›EIׄǣ§Ia­V HžZ'Ć‹śá%I5‰I´‚0R넍ÓČ2ś§oI!¸»‹“,$• L„ĚĂŞ “ 1$DXĚăP=Č­Ş‚ć&Ł.0Ź A4ń`Ĺ„ş˝d¦g—áî"ÖŽ¬ą˝‚ ]Ť—8ëX’h]Vvî+*n—‰wwq’‰¤”‰€˘1A0EQ¨Đ¬ÁlŹ)UĄVÍ(LÖ‚ CQŇ Şéşű,TPó—ČŚ…BG®7«x„ëťÉqÚďVTMLÇëjŚŕî.N2‘T‚2şĎż‡é×7«¨ÁxęÂbgf¤˘‰`Ś HÚšZ'TL“€8uďŤ$‘\WáDĹIXŘvL¸»‹“L$• L„®ĂÔň °‚ÂZ,Ć D‰Ł0ŹW´ú¨ë*ÔB!‚Ł0‚ŮÚpZŹt ' NVŤţśRŘDáî.N˛‘T‚2e¶»°yíń°V ;>Ĺ,(† ©z|ĹěöEl•nt!f6’r*ó˛–@ş ˙˙öÎ>8Žłľăßgß,ÇrâHJb9Ž^ ŠăJÄ4µ e,ú—;~ůŁ´dÚˇŔ`óR Sč´fH°IgܤCM[¦6†$… ™B‌K–ě(±±-Ç’ëĹ–t·Ű?ž}vźÝŰ·;I–vď÷ńěěŢîíŢŢ9Ţo~ßßďů=łŇ¶™8oQiŇ|ľ˘•¨J˛,ĎŕHv‘6(BYb‹€ŞňmaoŢаľĽÁŽ^dwi%uIy ŰQĘkú0;ËEevÖ»$ý?|˙vyrľüí?ŻR{ŞÚ¨$J<Âľż™LdQPČî"RJ*#”j8üW‡qäÓÁíÎ;˙§]?«ěÁÔ÷•ľů¸­@ff܇¦ˇϧ„E)ň•;©Äňަ48Lp„`$OaűŤlÜş`‹ Ů]DZIĄ TŐÓ«ŕ €Ý{hčÁ! =XŮ €G>Qů\[żśěř¶ßvâÁ®!GP‚¬/Ľ]nuy÷‰H’„|%y”  Šd‰ŠNĶls ĆłťÝE¤T J5ô}­Gţňź¨0 ţĆßC"ú5päŰŔŹďtó(Ą’WTüĹvxĹ+ŐI”E*~;M”$""ď“đâűŚ·v’ÝEKŚÔ ĘśóSŕ¢h›żűŞšoř?{±€™?ĺOMă"R*Ű^ň±” »Ëź„O:%© ÄE)⵸~YŚN˛»t“ZA)<°ş:AaŇ2ŕ"¸¶ŔĘyĽÁ(† Úźűű>ŠŢ·<ńcŕďŕÔ(Ű+¨ę+LT˘%®˛+‰ fybßżö‹tMńd»ëÂĆ…Ëa-dwi'µ‚R [żľGţB˛ťä‡ńeŻ?ä›öŇ.6sá'öµ„đŮuůZľéůëÓnr>‰í%Ö~Űţ¤|Đë81©¤l8¨j,,/‹‰ ˛ńĆ[;çř˛4!»‹H;©”9O¶Ĺ¤µű"xÄ´¬śéÚMiůĄ}|6`-–és‚Öż9 Lôw˘n5ď•0Aćf{%ÍŁ$Iʇ•0űîbŰą<8ëÉx€ě."ý¤VPŞĆ/ ŘfËËđ †Ř‰$źÂě> ó‰!—#*r”„[_aŐ^I-Żj˘ayE J\tdwÉŚ·v’ÝEK”TlTÚy¸ďkŇ(*B‘ʇt<ěś0Q‰;Ŕôw¶br¸~ť/ÓÓÜ ĺaÉn˙±$#ŇăĘx΋<üĺű÷ ‹żDX<É ŔŠN P{ / A‘‰ń_'ěúţkFť€ö>\żkĹ»‡`—ĄŇČ%.!,úpÔď»Ö×µkĺöWĐ"ŰKa6“lCíŠ(˘Î—Ż´íż9: ‹L˛š7ô¬¤ü ‘ RˇĚ‰0HˇD]W^K¸˙pëaôťç҆źôáâšALv&łľü#çýë ŃňI;'ČÄî’ÇD‰ÉÉ÷2îWO5dwY!ő‚RUů0;ćc>s(qą“¸÷ưěÇ}¸Đúeäó€®»˘"¬/ąśŘťwľ|6%®â+jd|Ř`ưÄ}©ä~/â]&«IxŮ]D–H˝ TŠÓÓ HnQ‘Dâ’ňR˙». <ÓŚöÍP_ďćSdQ ŠR*•0A‰ëÝ•DPda±,xc‰I–“đ˛»,‘zA©:1fwůü•F*IĹ©J9űR 6÷-ĂÉł§ĐĐŔ#•8QÂGĆ JX«•°ŃńIE|ľ˙Ţd†¶}«Ö&˙aR Ů]D–H˝ T“ď<Ú‰ˇŤCŃ˙ąT{E Ś˙şF+ë7xřśiÂ7ô"–/ Ă˙ Ç¸râJˆăl/ż řÇ—Č ŚĽó5!&dwY#ő‚¸“ćRşŽvqA’Eó]Ő5ëkýĐŢŇ„řđ{đµ#/`äĘr9WTDI1P..a¶W¨$ŤPäĆŽţF˘­Jěw[·#ďü ú׾8w®ň'eÝEdŤL J’‘óoťÉÁéż„G AÂD\”uý ý1A|lëýř»C/ŕÜŘęęĽ?QďĎ«$•¸–+ţĆŽţ,a‘Ěõăáwuŕ+Ą&<ť@|˛Ů]DÖČ„ TD Ńą řáž$RIrn!űq¸ĺ0a?”?ľb€WT>ąí~ś83ŠŻüÇ‹(\QŃőrŰ+h†Ç81 łĽÄ:¨í|R!Yżn%~¨ëďjüŤú"ţţĘ›ăOL9dwY¤će‡±Ź÷…— GŮ]~üB™ťóľˇĺCjâ÷jßďűÎô`čĚDŕűß_~söG. ź/OÖ^A‘ r>ĚţňG'IQI-Bv‘EjNPIšŰ—0H’”:oÜ}{3îľ˝Ż]ÇŔď.`ěęĄ|¤óŃŇv’1(Aą”°1$a´4-ĂźĽu ÖŻkÂĐéń˛ă¶b˙6‡ß ÝEd‘ÚQi—XŹ‹P˘l˛0¬ŇüĚX˝˘«W4`dt—Ć'đżŻ^pr*ţIş€đÉ·˘l°JE¤uUîëlvö…EZ;»;đČĆçőôđč˙ún_q3nŞ_Ž|®LĎ9 _Ô€`UĎá A×—ĽT^f›%‡Z—7ˇÁ¨Ç2Łşf€©* Ş®¨¨* čDĺ‹eŰ]Âň2MX–ËŽN¸ĺĄ0Š"DEGťn Ż8Ů˙Ň"s‚H?5)(˝Úćxq·ă„ÂťŚ@†brigŤÖŽŁ#CĎ)* j`Š,&¶č¶¨»kVô{)Â,rŰ˲L–”* ŹRt…G(yŐ@˝Îm/‚ ćFM €pŰËż•LObuĹí Jô‡}F °Ě¨G˝‘GN7¸p8b˘ŞbŻU7o"^ĎÚvW±«T‚eş}ň-‹˙ŚŠĄ¨ ŻöŇmŰ«Î0đôăű÷‹D¨YA©ČöŠŠZâ"˙ţ°× `äQgäÜĽb †ŘVWP4Űú˛ŕÚ]Ĺ"Ďź&,‹/ ĽĘ‹ Ë‹)P]UˇŰÉůśŞă©ßXěŻO©¦vEŰţ€O˛-żŽłĆHHq·µ u†¦ŘQ‰˘rËK í—í.MuŁ“’éX](•`™v”R2Ó¶»śI˝ě(…©Đ”śf N7pŠl/‚5+(ńôđ:eOĹ•WzNŘyDST(Šn‹-&BD`Rt˘HűgK|)š@É„U˛ňľë3űŹŞŘ‰yU…®¨0yÍ—AŽQËÔ¬ ěÔ÷ňŤ¸("‰Č$$¶XŤĂĹx"Ń€ŚąŃ‰PLHůľ¶L»ĘË,9U^…1gQ™-*ކĽn Ż‘íEsˇf@tžŁ‘ńż'îxÔy5Ěí!'"aŠÂE…Ů‘‰°ĽT©»Ą˘Řłyąýó­RÉĐ(Z®¸ĄĂ`v”b‹‰Ş(ĐŐ—’ÓtüđŔŁ‹úDš©mA)…ěOR6ě?gY…‰WR©±a¶­Ĺźh0Éî’“óLq§†”gů2M'gâÄ'Ś9bÂǢŠ/şŞ:#ç5EĄ1)Q%5-(;Ś=á‰őj«´’&ę‰r_ľ„17:‹°ŔT•G R2^D(–iÂ4ýmWĽíWx ±Íä¨+*ňoIcR˘:jZPĘ+ ®¤Ň«ÚĎ«q‘Ů żK˛ş¤ [D+d´Â=˙p‰Wy•řšçML·ĺŠ%µlł/Çl1¶—¦¨ĐT şŞĂĐtüđŔc‹ô+Dş©iAqƢřIR6gcEE>QŃM­Âó ‰Řv˘{aöX,ĹYľ”xwaË´`™nĎ}QëŤ?")ĎDů°˘Bc UENŐˇ)*%ç ˘ jZPzŐÍń~Ľ®ÖĆ  Ŕda’¨8űĄČDQ¸`8“ŮŰĺ¢˛Ë4%Qd»‹Ůź%óîČy.,9M‡ˇid{DÔdűzĺ˘ó'QŃJĄKصk5őo ‰,bŁ"í/•¤DĽ;É˝ĺĚfÁ;Ų/ĎŔ)1o‹‰ęv!Ω†űą8?A¤šŽP`‡¶'ř@XR!űćJ ‹ ¬´î’r&Ěţ=;ţDaŢÜJIŞî-ëMSjąâµĽäX±#a©ŚAcŞÔÖ^‡Ş’íE•Ró‚ŇĂ6…GŘ—Iš?©2ŹŇÓ’÷I;ţČDD+žŠ/[hěhÄťčŢÝć•]bń}„g‘úz1Ői)ÚÚކĐ‚¨š”^e3ŐźńîL*"ň:ް÷Ĺ ŚÄŁ_z˝÷dOPnŐÚĄč"Ńá‹" ‹éíÝĺ‰hUo§N,Xnµ—xěĎ=˝ĆxK{Eĺ‹=›ŁˇęPXŇż\‚ \Tz”Mĺő8Ë«ŇĹÝ(‘‘čéŢ„Łß›Fď=›~ŁtѬwxřžčDĘ«(̵»J%ďbJ–—3¸QTxůţŞś*/1ĐQUhölŽb Ł¦hd{D Ř<–{Ö+*aÂ’DT‚—Ý÷ űâł ľAšń©oYt"E/žV+¦ÇęíęQžŽ‡ń3óAŤNů°˘8}˝x”Â۱Ş]Ąš‚¨‰ÇňϢG Č©âDE~_”€ ŕďuO÷&ýŻiôvg3*‘ąUďpó#€7qň*¶¸”JR„RtĆźŔtńBşăP`[]bͤóno/QBĚ'ßR1|¬˙F˙‘ZHP|B$ĺ!W{ńţ^šd{‘ Drč_Kv6îĹÎĆ˝řÖŘxË{xüü>~0IEÚ·ăÁ=čą}zŰjWDdĚő„«S,ťrm.y0ŁSşkyGĹ‹±&¶Ĺĺ$äíĆp5eR”÷őr›E*v.EWUĽű#»oÜŹA)‡Ąv®ÜënŻv·űŻüÇĆžwÄ% gŐ&ôŢB˘‘„Á?ş˙FJÂCÚ¶Ó (vEEFŚŹ·ěWśyQ„^ů˘_bU!W ’B‚2ô®ŘŚŢ$sáÄmh}y ËŻĚř*ľěĹ ďäO< y·ź—÷"Lş¬<E˛ĽÄbŹIyđŰočď@i†ţ÷‹XTnéÝ_UŔŕŰnÇŐ¦şň<Š%Ů]%źřúwYľĂ|ÓĄ0»|A?Jq#”Ű×ß{ ‚H?$(Ä’bđľśčYÍ_HŲĘDÄť8"±|6—<Á–› g‰yŐîďŐÜ}ŢűĄ/.ô×%LA‚B,9ĆoĘăĄÍ­¸Úh`ľąâĄµĺN¦eŮŰîk8J46Ě5ÁvG3rkZ[¬›& ł¤E=µŘ·@¤śËmŻ5Q€u­eÇLôßA,KLP^^ě[ ‚ ŞdIĘŔ‰“śĽ¶Ř·A©ĺňWűbńĺżús żú»Ĺľ ‚H=ëÖŢ˙&‚X@]PÖ­˝ţ!Ad)OAĚ $(AÄĽ@‚BAĚ $(AÄĽ@‚BAĚ $(AÄĽŕ” ˙ă?…ŤËó^‚ ăĘĚĚ,.ľ>ş÷BA¤ĎŔĆWĎś[¬ű ‚ Žöµť™]ĐĎ()żvÍm úAÄŤç¦Ćĺ.ÔĄ+ŘýČŔţŻîĂŞËŞţ JĘAÔ0ß=üV­Z…­[·â»‡źšÓµBĄwKö<„]ŹěÁ/Ź$şXď–ľ9Ý AqăůĎŹŕCoźÄ蕉ŠĎ-Ô×9Ű‘Í!wo߆ýˇ˙ř<„Ţ Ýč?>€]Ű·áŔÁCŕl÷nčě·÷ďŢľ ˝[úĐ˙ÜáŠo ‚¸1Ś^™@㽟ƚ {péź¶ŕŇ•‰Ä¶—,&@Śĺµ˙ŕ!8x»·oCżĄôŔ[6t;Ň|ýǰ{ű6\H<ÄŁ{A±ôxúąńŃŹý5ĐöQŔÁť|JBLN¸3 F Ęîí۰ˎR‚^ Qŕ±ĹDÔ"DFĽź ‚X: ź>‡-[¶ŕôéÓ€¶¶6ś>}O?÷bäy˛tż©ÝŮ*("şčµŁ‘ý_݇ý¶µµ[:đĘůśÝŰ·yĆ ‚XZh×‹Źżű$.$pý÷Ďn͇Oz&&Ŕ>űŮĎZk[pOÇ]xőĚąy)ŢőČěÚľ o!Q!‚XÜrs“§l¸é4ďý4Vlŕ6׿|ţ>liănÓh[ął$&'Nabú:ľ±˙É…)>đŐ}$&AK7ný `čč“řÜç>Ć~ôâçLČQЧƫµe5nąąiaîž ‚X4 …z@ŠPŠů7c´ítďëŢ÷v^‘Ô€+‰>A1tťúyAd‘*źíqb"WyipoĎýąđZäEOťD{GWU7DA¤“SýýhďčBÝĘ ż6 eŰëšWx’ ĘŮWOÄ^´˝Ł k[î® ‚ %HJ×Ç"ßqöU~śzyAóki~Ŕjm™\ěű ‚ RĚů‘ţAĐ!ăAŐwłIEND®B`‚fox1.6-1.6.57/doc/screenshots/goggles.png000066400000000000000000000426121326741342000201040ustar00rootroot00000000000000‰PNG  IHDR†ÍĽh×ţ IDATxśíťyśŐążźŞęuşggfŘÄ€ Fٍ(¨ěŕľ$šÄDMĚĆ5šx"ńćfÓDcbÄë†+,"‹ €Ęâ:((‹,˛ď03ôŢUőűŁéžî™îžîžža{źĎ§§Ş«ŢzĎ9ŐSď·Î9Uç(Ť0A„#¨G;‚ ±…%ş˛có꣙Aá(Ó±ş7' żůÍo0 #í&€™ľőÉHü“ĆO·ä~’Ż$úiâ˘áKÂM7Ňš°1š魒řj’bR?Ťv6ň“ň,M¶4M=}ŇGv4ĄüĄÍi˙cŚqÚ˙3O YOáÍlě!ą?łÉć¦ţڤI$ŘÔO˘?#ąëfĂjóVi|ĹRL ʧv”°'I,H~ę̦›’d4Ý”ô 3ąź&É‹k6^My!¦ĎU?ÉżEK{¶Ňţ„‰×oęź0r4ßöo&űéšZ5ú^±tIl=At]çăŹ?n&Iš3ńO36©íšînjל0¤úIţmRCŠCÓ[%µi´#ĄMÜZłn›ÚĄ<ŁÍÚđű¦†4p#»ćlšőd&9/imRŰ5ý÷MrFSü4oÓ`×Ě%@ÂyI[ôL…!}ÔhH+CaHb—üÔ5sÖ“2ýO濡‘]s6)=%˝R_hiKňçię m¤kög63†fBtÄ*Ψ®öPÂľaé:zj " élíaahĆN„!µťCr»l…AoT{H¬1„t ]„!YND’%)Â2#$ś˘”v" INn“ÄN„!ą]¶Â`č‰$CXˇz3I"ÂÂN„!µťCr»Q_z ŢYś,áfü$~ÉT®róĽťÔ&™§ˇ—fîü…‘ő+3çČúÉ, ¦‘®Ć–" ImšÚĎÂ0ř˛KbŰľ˝¸©Í»”>64µK#y†ˇW Nř>gŢćĚ[ŇW*OŃü˝9ç­ÔąĘBFޏ’Yłç%l5âJfÍž›pH[ ĂŕK/bá;ď6ŮÝžPchô[KCł6‘Ť" É’aH™NQJ»Ł! W Äüď$µąbČĄĚ[đNBŻĽü˛ŘúÜ·î·ĆoŹÝy“G† ćń܆_9€7ç-ČXfĎy+fg#‡]ÁsćCtýÍůŚYĆ{5üĘ&ů5âJf čŁG\ÉĚŮs=b(3gĎMČŔč‘Ccë3Ţ“ˇ#vŁF\ÉôY‰űbçÁ„±Ł‡đúĚ7cűŻ=ś×gÎćŞŃ#x}Ćěȶ1#vd=ĘŐcF0mú Ăü…‹ąbđ%Ě_Ř üńßú %Îô14kŮ(Â,I†”!ᥴkkazĹeĚť·0éţˇWfΑ}î̜ą‘@>lč„őhŚ>toÎY vyB쮏v9łßŚňĂ/gö›óʬGwŁ4.MRŇi8ńiŹ~3gÍeô¨ˇĚ503j3Ží1ن%Í+ŔčC™>óMĆŽÎô‘>vĚp^?˛~ŐáMcä‘LL›>›«ÇŽ`Úô† µ˝zěH¦˝ ę×\5’×^#fsŐčĽöú,®ąjS§ÍâÚ«G1uÚ,€¸u“kŻÍ”×f¦83 ŠţoÎť˙Cݏ4ałŠżÎu%Nő1„ĄŹA„A„!©MS»ăQ€´×xüľĚ×Í´6#†_žtűČáW4Ü}7şÇŚŠÜ]Oźő&Ť52rç?}ćě¤ez=în;“üĹŻż6}Vł6MΟٰ}Ę´™\wőh¦L›ŮÄöę«F&őńękÓÖ§NOZ¦TĺHNbĂěą 1tłç&6ą%6%騩„!YSŇ©§tO™üú Sd‹fŻ †ćlâÖDDšµ9ň7#aHĽCžmo´/óu3­MCÓICć¦ÍśÍŐŁG0fä0¦ÍśÝä"ś6#u“ÉkÓßŮ%+S¶ůkÉz|±’ŮÄo{yĘëIËÔř¸ÔejZŽä$ ĂčáW0óÍů±eĚŞQS’%N2ę|^·~C\’€iŇ«ç©)›ťDŇŮ4Ú! ÂĐŚ]>…aú¬9Ś5ŚéqíÜ©šUŻ_u¤ť»ńö«Ç&ßŢt=ńśúú,®˝jTd’‹0UQškJjşnĆÖo¸vlVeŽ_żéú«šlŹĎhtű‹ŻLăć®Nę#Y™R٤+Gz„a쨡Lźţéłć&|OhJ2M …0„St>÷üFʤɧR.†t6Ťv004c—ďĂkÓßŕš±ńÍF“íS§ż+`4€G—Qű)ŻĎâş«FĹšO’Ý1ż:m&×_=:¶ýŐ×fpý5cxĺČ÷l„ˇ!ťĚk /ľ:Ť›Żż:¶Ě¦fđÂËŻńíŻaňËŻńťŻÉ¨ĆđüKSąĺ¦kcŰžq ·Ü|]l˙s/NI™fă2=ű«|÷Ű×GÖ'ż’ţ_ęH†L®3ś×f$6Ĺ˝6ăÍŘö„¦$Ă ~LU%:ěöŽÍ«9j,ëׯk&IŇ]q6±?Íؤ¶aahj“ĆN„!#ahÉ{ ×_;–W¦NŹł‰üąáş«xeĘëÉł™¤é‚4˙ ŤěšłIé)éuúB‹®Ţúíëyî…W’ÚĄ‰NilšîLűë¤˙‰cvŮľÇđůpX“˘'Ź«¦ĘŠCň$ERf„„S”Ňîx†›®Ź4ŤĽřę´ű›ŁŰ_y-ąŹÄ„3°iřr, Ă÷ną€§ź9ĄÝń, Ť‡ÄH¨1 ąb87|ŐL’0¤°aHm'ÂÜîx†¤űcš9ë'€0¤-á €ź’BGňCŞ>†FYaHa'ÂÚN„!ąťCŇ„“Ű$±aHn—őéŃŰľe öďËŔcúÝiF]Oea2™ü×g“D’˝)Čŕ<7µJrPä7µN=L|–$ţWe——F rĎĎ̆ěňg6›…Ěňłj6ů nŘ2O6©a“-Yť’4ÂÓOŐü| ™2WYć)íŮĘ"Oi…!Æć8Yb|[`K:ÄA8ń9ZńᨿÇťRu"ÇďkĽ˝ąüĺ©)‚+ÍĹÉ|×,Ú\Ú˘I%Ó4RőäÇßř¸\ó/MI‚ dJ¶ń"ßO%)Ť0vl^}ŇĚŕ&Y„|Ʋ‘co¤cuo …} éŞ/G#čžlÚ‚ d§ŽöMk‹„áhgľ1™ćGD„ŁĹ±7“qÔžJ:š?Ś Bs´V,;ęO% ‚ Ç" ‚ B" ‚ B)ű¦NźŰ–ůAÚńăÇłz劤űŇv>Ź?ľU2$‚ »4űTR*Ei)S§ĎM«Xâ_üM˙‚p"˝~R!} ‚ BÇ”0ôéןk®ż…bFJ»{ÇÝÍ˝ăîć°Ç“ÖNAČžVyÁ-—ń;úôëĎŹź{÷˛yüô'wň÷Ç˙IYY)ŞÚ ]÷Ž»€^Ěý÷ţŠĎ>[ĹYgőÁírĺ·­@8¬óÜŠ-„,*Ex¸éü3˛öárµ(žĂui÷oŢĽĄÉ¶ęę®-J3J&S˝f»O„Ö!ŻÂ˝Ĺ}Ďĺ‚®Y˝‘~˝Oá±Ç˙AyY?şýűĚ}s&ĹU=°Ů­Ô>ڎű5†-»đĆm˙vv~ů)çÜű0˙řđC~ú­ĘŁťµQQ1ćşŘ¶Ů3¦$E>D˘wßóQÓ4cËLö ‚ĐväujĎAqߦifŐ9‡qYŹŠCÓÎs˙śöŐ}pĆlm6[rÝ6<÷Ą‡Đ—KůňÝy´oßžßĂßýož~{ ߿쬣ť˝QQţfŐŐ]éÝ÷üŘţŮ3¦ÄÖł‰řaŁżń2Ő6©-BŰ’ah, Q˛}b$'|ŻY˝‘źÝ6*i.m6ăîą?ö}ůű )p:šžZJ>fX;÷WĎđ0îˇ;h×®†a ©[ü"k콲ö×ýÔě› 6}őEFvŤłřďńB‘‹HD}»!·PRVa‚Ĺbˇ¸]…Nz÷ěĆkľÂ·{KźűSÖ7‚ ´śVécXDöµh* .wňţ«Íơ]kéřĐŁx˙9‘•+?§oß3óÖßĐQ8sÄŹ±8ťĐg {ôŹ<˙?÷đâ‹/rŃEńĹ_đČ#Ź |heE,üô+ź}jĆľ3 đů Y3RăÚD|sSsmR-.λňBő°•Ćö_Üł’]Ú“'ßéČĘuÝbÇHŤAÚ–ĽC´M8ţ{.wyńÂ`čAL=„ËíNjkł'6%öxňÖßĐ’aą˙}úpŢyç±oß>*ŚZŢß°?+a’iÍ!W!iÜť,řŻ^ą˘I-"ť8Dk UĹNţůť~ěÝłźďü}!eĺíhWYĘ’u{čŮľí|ň±c¤Ć mK^&ęYUł<ˇM8× 9xDÂ:L=„ˇ‡š@”ÖęcčÓŻ?Ń’(9Ôl%Ĺüű/7ᡂŻwě«ó1rÄĽ^/ŞŞb±X¸úę«™4iť»°lÍîśňŮš5‡dO'ĹďküWŻ\;¦wßó“ţţńý kf˙‡ąUŃĄsg&ý|(5›öňŐ–=ÔŰ;đÖZ/ëv…yý¸Ýn<ŹÔˇ ÉYâűR5»dŰ­1čz =„©‡R @kCĽ(äĘü¶RŰi¦v‹ŞQčp0ę ©««C×uTU% âp8(ŻŰH]ÓÖł´´vCă§“âű˘4ţé„$J÷îÝŮ´iýűžĆG5«™óÖ;,{˙Ç\1ä2~˙Đüäá©ô8šöÁ­xGl=OFů!ä, ńÍGŤ«űńŹ­f#XŤˇ>Vc°ŞÉCµ5ĎÂĐXĚÚĎŽM«™őy5gt脦¨TWvćŕˇhšFaa!ŞŞbš&v»«ÍŽßëÍĘ[ö1äł gÖë/5Ô O=ő çśóMÎě{Ő=ÎફoĺŔ®˝¬ś9ŤĂű¶P^]Źţ§’ˇ­ÉYVŻ\k>j, rô …¨ßż‡łSˇë‰·ÔďÎy’EK–ÓçŚÓrLĄ)Ťű” <ő Vnę8ôÉ»|rî 0Ă´+îŔ—_~Iź>}đz˝(ŠB(˘°°Ź´NčˇÜ}kő1TWweóć-Ik -%ú˙˛Öń˝żŮ‹› #Ż˝ń*_®YKűk ˘űA¬Š¶‡cÇH ´--ęch|Á¶ä]†ĺď/¤˙…Qš@Ń3Ó¸ĺĆḺ®Płf ‹–Ľs#Jtěv;N§“‹ź_Ĺ齊söŰ} ÉŢK_BËÇKZ˝r«j–',3Ů'BŰŃbaö+Ä‹ä~gŮD¦Ěçwă‹ÓéDŐ’yávąRîkśßt~UÍr>Yř ʸÇľ·”'u9?|řuöÝ6Š›O-ŕĘ©ë ć#¦<ůŁś}¶fC˛±’˘âé[ÎŤiîśç˛O„Ö!/5†Eqëů¸Ë‹‡5kÖăóůp:ťôüFśNgňc4•‚űâÉ$Đ|sđ÷XUó˝,sťš ľŃ‰˙ĆMâőPvE,j(´%©D"]s“ Ç7-†ÖşŁ‹ŠĂŮgź…i(Şš÷AňڧͧŹßŃ"ÍͧĐÚ¤uµń~AŽoZý©¤– Şęq1 ĎÉ€ ś¸ź·ß‚ B«ŃlŤaęôą­šń/ţŹe˙‚p2˘ 4Âرy5oL9¶cęôąŚźżGDA„c‹ř&á‘co¤cuo@š’A„F0‚  0‚ Ă„ĂaľüňK>ýôÓ6KS„Aádűöí<öŘŁÜ|S<—_|±ÍŇ>¦ßcA8™đűýĽőÖ[Ěśůvëô÷2ôrŘüuď6}H„Aá(łoß>&Nü«>™súmçÚ1~Ž0ZřËß:3mÚ«¸Ýî6ËO^…ᦛnâ´ÓfV[łf O<ń.— MËmBA„źĎÇ?ţńw–/{‚«Çě ˙9ALÓDUáĐ!+żű}1˙ýÝ»woÓ|ĺE&LŔoű[Âá0~żG Ŕ÷Ď;ŹââČĐҵµµ"‚ D¦%>}:S^y!—}Ĺ·7Ěýn±€fQxôOv&üî)ú÷ďźĆSëĐba0awß}7>źŻ×‹ĎçŔŞëY, fł­Š‹‹Ů±c•••ÍŠĂťżľ+íţ‰ţWVyŚú›řç%¬ç“d~[+-AŽ_öîÝËo~óSştšÇ­ß®CÓL4-"ŃĎËŻş8Ł÷­Ś=ú¨ä±EÂ0aÂ~öłźQTT„ŞŞ„B!‚Á Š˘` Âaj«4w€ŢYÜ4¬#/˝”™8@ëÔÖŇwţú.A8 8q"˝zőâ˛Ë.Ëř%K–đ÷Çîâę1¨hçÇjŤÝVkdůéJ+W}“9sţÖŠąOO‹k ~ż?2 ŞŰM(âŔěßżźBÓ—ĆžŽ°ł,L(`ańbřôÓO8p EEEY§•ęÎ?›»ő\}äăîżqM(ę+*&ńű“}oÎŹ mǤI“(//ĎX&NśČűď>Ŕíß?€Ăn`łĂAÂrÇN˙­Š3&cłŮRú ,\¸÷Ţ{ŹeË–1gÎěv{ľŠ–ű{ 7Ýt×]w^Ż—C‡qčĐ!6lŘŔ_ţňFŽÉOĹÜĂ[ŮŇÎ@?`ĂşÝĘüć3bÄęęęĐu=/żCŹĚd˝µ}DIeďŻqZńyh,éň•ĚŹ ­Ź®ëÔŐmĆďű€•+W¦µ5M“żüĺOlŰr?řŢ~Š Š‹ˇ´4ň)+’PUŤ_üW!˙ţ÷«téŇĄ‰ŹC‡±hŃ"~ůË_réĄřáŻç™gžáwżű]^EZ §ťv¦i ńűýlßľťűˇC‡Ć¦÷üë#?&đ™}“űn;®Pdn…Ď>ű ŹÇÓlwţú®Ř'ÍÝ-gr7ť‚ ś<ěŮł‡Ę ßľ)Ŕ_˙ú×”v†ađŕřđÔý/#‡ŐQ\lRRŇ %%PX6›ÂŻëâç?śóÎ;/vüŽ;xîąç>|8gťu:ýn$ĺĹOđíÖŇ­[WŢ~űm÷ňµ¨)Éď÷ÇD`ďŢ˝,^ ‹}—§žzŠE‹LEáżŘ)jWVb¶Ź'ŁĂńÓŐ2äî^޶lŮB×.˝O2őµ©ĽóÎ÷¸ôŇKl ĂŕţűĂúOĆŚö`µFšŚśN((4) &Ľń¦«m,7ÝtápE‹ńâ‹/2}útşWűĐßĘíßőár…1Qůëcť™4i*˝zőJ›OĂ0¨««‹őgJ‹„!`†ÍŔ¨2čׯ),ZdňěłĎrÉ%PQQĂáŔ0 ĂhIr'Ç«Ř ‚Đ@DT‚A“Ý®ó?=ŔĹ/Jx¨ćˇ‡c"7\çAÓ"ËNgäcµFl …§ž.ĺßO<ČŚ30áA‚u şŘäˇńŐÝ‚X­‘ŽjMođť[~Çé§źDn¸}>۶mcăĆŤ¬X±‚µk×ŕóîÁnßÇGmáĹ—ć%ÔDš#gaXłf †@-U1J ě%*Ź?ţ8wß}7Š˘păŤ7ňÇ?.ŁS§Nx<Âá0@ ×är&wčąřh®oBe„ă—ŕpčč:TVč×÷cž}öYn»í6.\Čîťă×ă‘'ŹŽ8X, 5…pŢ_ęŔ8•;î¸=ü×^eđŤ4ÍŚăpDDaß~;;v]Á•:đ“źü„5kľ$ŢŹEŰOE»tę¤pę)&çÝdRYDQá׿éIź>}˛*_ÎÂđÄOP\\ĚďlvťÎ{,T‡ę™üĐClV:tč@—.]())ÁjµâőzůÁNeҤI­ţ˘[4('{Ú§-}¤ňżíhů!w6nÜH—Ž ŃF® ňŔCŹrë­·âńxřÇăżâ±GŁ(&ŠBěn_U#˘QŕąÉ[·~Ŕ}÷XčŇÉK(±łŮ"µ‹¨0¨*üßł*+VĽ…Ë9‡ Ŕ­7±Z ĹäHK} U…ç^(ä·÷˙‚‚‚¬Ę—ó n†a i Ľłčč±Ňa ě6ŘhłqČ墰°—ËEII ………ÔŐŐQVVĆK/˝ÄŔéСĂqő´Üá ‚ĺ–[naŘĺÓ(/ób·G:‘-)í÷lÝş‰!ţĂŮýü„Ă‘}WÁf‹„®C0Ü˙@ßą©›-L0ń}„Őél8Ć0`×n®UŐc˘¤(‰UŤ|vîr2uúÍLś8)e9RÍŕ–sŤAUUjkk).(fËgł)>µ+a"m^ş® …đx<†Ayy9“&M˘¨¨˘˘˘c^DAH…×ëĹfM|€fĚh?şóNénpţyţŘťżŞF{4p›fDBˇH­áŢ˙:€Ď ›ŤX'uôŁŞ öí«‚„B$B´­‘DÓzkˇ‹ź˙üżr*_‹:źÝn7;vě cÇŽ\r űl\.WK’m¤ÉF„T¦‰ĹjÄš…L4Ő䱿úqŘÍXŔ†q~×ő „ĂÄš,boAŰl‘§–ěö†šB´ć­}fĐD… ^öěµ _ť0¨i6´HTUĄŞŞŠ;vPSSC·áĂ›ŘDűŠŠŠ8űěł3ăX@„@„d¨ŞJ(¨‚3¤ #đŰW…°ÄEUĂhÖŞÚäu=ň1Í#ći‘ŹÍÖЧőc 5‹Ąá{|m!^|Tž}ľŠ_ýę˙ĺ\ľ‰‡ /Ľ­[·ňůçźăńxbď,¸ÝnÎ<óLŠŠŠdtUANŞŞŞŘw ň’ZT ŁáN>°ăżC€Dk ŠŇ VkD˘ÍIŃ㡡ó:ú˝qżBü¶ XlߡsçÎ9—//Ăn«ŞJQQn·›˘˘" Ă ¦i"‚ śPśvÚiěŘßčů­ Ä·ýLJµŇ»wvʧ6&Żs>G˘¤¤„ŇŇRJKKŹ‹ŽfA„lčÝ»7_o‰ëčűŃš4mÚ†ć#]oĆ5…xQҸŮ(ľ–ŚK/ń3}zËć‡Î«0‚ ś \pÁlŮZ‚¦)±Ú@0ůD›‰˘˘Ý/ Ńýńs0D;‘[‚˘(¨šB§N[äG„A!KśN'Ź<< ›ÍLč?>‚ ţŃíŤE!Z6#E;§sFQP4 TŤ=щ{îy°EĺËëśĎ‚ '*¦ibš&~ř!O>ů$kľ|ĘJ'úĂ9ß bzě}hł4C´šŠB¶­í‰o9+¨šUł°â7˝űüžŽ[Vch5ažDTo”–Ö‘ŽEˇo߾̟?źvíÚĄŃpäČ€V/N[ ťó‚pŚŤc_ý5˙ú׿xő•ר?d§ÔÝ·ó»ěÚĽ•Ĺo‰ˇlˇwď #‡+\>8D÷î!t˝áUÓl¨)@d* Ń㣟č6Uµ ‡lŢPČ”)ýyäŻ7´¸ÜyÓ41 ˹ܻw/.— »ÝžŐ°ŻÇ#Š˘đgő( IDATăçžĹ˝l—:źyo/Ł˘˘"!čGá…&s˙˝żbůňĺôďß?§íAh˘‚°cÇîąçćÍYŠÓr:…Ž18 ­¦‰ßĄ•…Ő(ŞÁÎŤ{xä/křß?nâôÓëůÖąpŐ8ăŚv›žĐśMżBTX˘µŻWeű+ď˝+>ÔXżŢ…ß_‚ˇ—rę7Âx<Ün7@Î7äy†Ć‚pńź˙Äá€źŠŠ 6lŘ@UUN§ó„‡(5«7ŇŻ÷)Ě]¸”ĘĘJždî›3)®ŠĽ nł[©­­ÍŰlv‚ äÓ4 ‡ĂÜ{ď˝L›6 ·˝'Á`€ˇµh”ŁD»h5M‹túŞ%Ű/DU˛÷ë˝ĚŘĽŹçź]–=\Č|„šŐůŮmŁ’ži›ÍĆő×_ű^[[›QCăó?,xľ‡ńh żÉňźl{ăý‚ĐÚDk ‹-âÁń(°śÁţÚu„őČ`  ¬ĘhJ¦âÁ`>ó+ÓŹJVł;U¨fG łoh‡ĽR^ÔŻg'źŻŢČyçúŢo¤}NáüńĎaěś‹Më„.ÄŞ‡đ…}„ jőŘm—‚Ímŕ(R±iXśT J]}ycć8ďĽóŤ…ŔĺN>h ŐfăĐ®µt|čQĽ˙śČ˛eË¸ŕ‚ Ňö7$ÁăişĐTůźřç5ůŤŹ§r '†a¸÷Ţ{Y˙EU a6µ;őCtˇj*& ͉C-Ǣž‚Uk‡E-%ę!tj8lÄŞVQ]y6k ţĐvž|ęk.8_‰ÍÓ ýhüę×6Ţšó ÂáXOÁçW „= şâÇb1p84 tŠ‹UŠK °8„Ł`7şfp(túş šRĘźţôgśSsR‹„ŕ–®çůW^eĂŢ=ôzń‡B„ Ý00 3®'ÝDűńóҬ\âG4Ŕ¤˛Ź’Jdš»sÍ„xa0ô ¦Âĺv'µµŮ›’ęęęŇö7$ÉdyNf×Ü]z˛ZGŞs›‹Żl‘aĎ…¶&Ú,ţꫯňĹk)u Ą>ř!.Űĺ(j-†âÇnq˘Y5T‹†j± Y@1˘Yöˇ„ lJ6­ »ĺLLj \Ž l¶j–,ęÄÎ]›čÔ1x$Í(¬]gá;·şŮżł?.­š@`uˇm„ĚĂ„Í:PĽX,&‡‰Űmˇ°°ŇŇát´CSÚŁéĺXtŞ%„âŘG]` [tÎŤýQa¨ľů&nąázzTTbÓ4j}^Ľ ľP &¤ë„ ťđ‘ń“ÔÝNŹ=Ř»w/Áč¬- YŚ'>Ŕä#đ7Gđ0„učzÂú&Ą5ú’đLÎA˛ăŇ PsľáxĂ4M<úÓź(uźŤ©îĂm? §Ł­`ĺE¸;wŔ]ÝwuOÜŐ=qu+ÇŐŁ};RpNWl=5”ö»ZŢĄĽ´'Šĺ޵›Í†¦Yp;úđŘă6˙—Ťç&»Ř˝ÇĘ»ďŮ{u9µ»†c†*ŮďYDجĂg|FŘ<˘X°ZÚătô ¨đlJKűÓ®Ľ?ĄĄýp»»`µ(řk8P?ŹŻ÷=Çš­˙ˇöđ6ÚU”ą C‹;ź·8‡ç_y€›6â ń‡Bő0ÁpD Ś˙Dfzíµ×¨­­Ą¬¬ ‡ĂŃŇ,SDk z CaꡔĐÂL3ąëÎ÷ťyKüImA8(ŠÂÎť;Ůżď•îÁô-˘Č:¬ŰP~´.]°Łşě¨E6‹†˘ycmź †Ži31Ę”˘0ű¶ĽCUÉ%lŰ»Îe× ¤Öł†ŻőÇn-ǨeÜ=‹°iŐ¸ÔAřŰ9řĂě…a(J‹ő»ŹÂ˘ZŠKPܱŚâb?[D4¦Ç_ŹĹߍ€'ÄÁCë ۶Üľť &0a„¬ĎEΠ( {ö졲˛’-?ş˝‰8Ě\Y/ ±ë‘żEţŕرcv»=ö$S[ĐVw±XŤˇSač!¬Ş™ÔÖÚ†O%ĺ»üéüI@ŽW6oŢLYŃل͍”¸Î®Yńň5Ö"–ö¨EE(6LUĂŔ©¨…`˘b&†FŃ6rxí×”ą‚XŐvXÄÚ5T–~ =lâÖb·– 8)+ş‡?Âaš}0ŘŹ©~ę.Áę*Ĺćî@AQڷÇUâÄć*@)P …ýřĽ^jW×Qatb˙ÁĎqjß ¶~+‡ęmĽđÂKm/ n·› 6ĐŁGŹq9se.?<hhvúŕxď˝÷7n_|ńE®IçD[«ŕ‘§˛ę÷oĆá,ÂÔCčzb‡ô»sždŃ’ĺô9#·Ů•˛%]ßA®HđN4Eáůçź§Äu:;ÍBUlčĘvśöŕ9LŕËŻ1Oé†QáÄPBމaęGĆ@ Łë‘~ Cµˇ–—˛qŰ|Nép_m›JÝáťčáOqŘŰaQ‹9ěÝŽa†ŮU; Íčf Ű0Ő”vEh%]±—c+)ÂQVŽ­])¶˛Ô"+†ÓJŘÔńűÔůˇ®ÖC‘ß`ßÁŤt­Ënß*şT^Ae7gNç˘EÂ`·Ű©ŞŞj"ŁGŹ‚-[“ Dš’‚Á á$Ođ´”ć‚^k6SÔÖÖR\\ŚňĐŠž™Ć-7ÇĺĐbĘ5kÖ°hÉ3ô;Ł3ýúžEu·®YůŹźn4ßý%©:îۤږŻó)ÍHÂŃ$ áńM‡’1ě<8L–~ŘmEőŻŮ÷Éűř_ˇźÚŹpQ;tĺ&&† †á82’aС;‡żKqÁzŞJ/BU¬(ŠÓ¬Ăô`·u˘k»[¨«;€×§˘ó%†ú9jY–ŇvXJŰa-)ĂV\ŚĄÔâ¶ ŰŔOÁ€F0Äë9Lýá0ţZ/^ó^_-6KÁ“öÚçtZ<µ§Óél"QQh,“'O¦°°˛˛2JJJňÖĆŢ8`6ž§ą­ćnŽź›‡&ŔËo2jČYčşÎšÍ»¨ůbcGŹÄ]ů±ĘĘĘłN#UyškÚ‰?¦9Ť;ť“‰Q®çSćŇŽe&O~ž?üá<őźYt*»†:ß6íy†â‚ł)vśM‰m ßöĽ·_ŠŮótÂEІiz0MĺČ ń!Ô@ÓëĄŢł…N•yaÂT–şĐu=뙿b-§-ĹŞ Ăd+5(ee¨njŠĹ]€ĹíFu`Ú ™6<ľ0ľŔ6 #L0čÇëőŕőFŻ=DĐSC7hŞťPŘ—ó`zĘ€A#L€›WóĆô—c;¦NźËřńă3rb>źŹÝ»wÓŁGdJŁGy¤‰ ”””PYY›ŔçD?É0 vďŢMÇŽůćCSż«-L8¬2ÝŐ-é1kvíÂűωĽúę« 2„ŇŇŇ6˯ܡ BŃ1’}ôQţđűÇéX6 •v×.ŔçßCqÁ7qŰOCQ<ÁŻŘsč]ĹVčÖ ˝¤=¦fLĐ7aůęklŰ´+éÍ÷GZůÁČsb­(ŃGc'Ďý„G_4 …ż‡Ňľ­Ŕ‰µ¸kEol%í±8hŐj˘``čôP á#đňz±/_K'÷ĺlŮőUĺçîÇf)ĺűwžĂý÷ßź˛Ľ«W®­Ź{#«#C÷ämjĎĆ5‡qăĆń /ŕv»ˇ°°0&'â«Ń9°ăkőź˝OáYňÉ˙ËLhA8:DG‚ţĺ/ÉąçžËĎöKöď*ٞp(^ŰvöŐ­`÷Á÷)qőٞä[”v9zß—ěüü=üöčԽčf)ÇŘľ‡bw_ú}c?—ź;€`0{Ů,űŠÝüá/(Đ.ÄţBE uĄÓ»Ý<„ᱢ `™„ĐĂz0D¸>H8h€ÇC‘^Nťg î‚N¬űU…:ď&:v•ÓyČŰcAŤĹa×®]¦IyyůI!ń4€)ó™4iRÚ!/dTA86P…‹/ľ÷—ľËřńăyć©©´s_Bçň«ń¶°§ö]ľÚąŠÎC(uźIyŃYlŮ3“«>ÄîtaUÜX­Ýp9Ş)t®Ł˘ŘA(Š ¦i¨ŞĘŕsOĄĐ˝3čÁ©ź†ďđzĚňvF]ńaŞ (VL3ڱ#„î a„mč!C×Aŕ¬óRXĐźýµ«(+:ťâňZľű˝[éСCۉ‘ڍ8tčĐ!6¬CAAÁI#ńÄ‹CMM Ź—ËĹ™gž‰Ë•| MÓRîk-¤ IRSPPŔź˙üg†Ę?ţ)žú.”žK±ű»xض÷-¶ěž…ŐćÄíčÂéŐßĆéhO xý‡ľ ¤°†ŻwxvÎ§Śľ°'.‡MÓ"/ÓůCLž·’ާ”ňŃęO(´"ŕ]ŹYżÝQ~ĂĐPŚV]C« ˇÖ{!|ĎáĂ¨Š !(˝[1ßnĘŠ{rŃĹąďľűZTH Ş*‡»Ýś\“ô4&*^x!†a ŞŞLĘ#ÇŠ˘0xđ`>ühŹ=öĎ?7…@m%e…gqFőʍő~Áî (~BĆR:98Ąc çťŢ™óO˙Á`7–­ĺţ˙,DÓT4MĂb±`ŃTF <ť;®:Ź˙~b>ﬨ§Čq‡öľ‡á©‡°Žb€jjčš«Ą»VŠÓVNű7Ín9ěŰÁş-/ˇ(Ľľý\|ńŤ-.s«Ľav2‹AcTU•Ixá ¤¤„x€qăĆńúëŻóűß˙oФ ŘĘUguâŢď ˘ŘíÓ  Ć>Şb2z@OĆ\Ř‹«•bwV«MÓ0 _Ţ8…˝C‰ý2ę|„[ݦĐő ěv•îÁĐ„ /a=€'° ĂDÓ¬(X±ZŠéÚţJ¶vě80—‹.ş¨Ĺe•9źA2$úbď-·ÜÂu×]‡ÝngďŢ˝Ś¸übv¨§Äm'‡Ńu]×cO"iš†ŰnĹn·ÇDAUUTUĄSe)żĺŕăŐaŞJ/ĺŔáŔF7+qtDł;°XT4µU±ÖĂčşź@¨Żë×ŕőďä·ßJ·nÉź~ĚA„ŽóVYYÉ˙MžÂ·oľ‘QçvŕŰ—÷Ţš ˘‹Ĺ‚Ĺb‰}Ź\˙Ϋűsă'źâ˛÷¤Ň2o`;ßVűÖ ¨AlpŘ †Břü*:tačËéÖíTUĄW·J†_hRďýŚĘRűžĆÝ/Áfµŕ°YqÚ-„u§gÄGŰ&ýß3”””ůoľĎ‹0Äg(Ş™ěA8ž‰ľ¨öńÇó‹?Ý1°€ÝAťm¨aâ»Ó«¸”sztäÂłŞésJ{~¸žÎíK©,u7 䊢đżwK“QĂ0ůŕ‹­ü핥ô:çľ˙ˇLť:•˛˛2 @UUU^źül±0(ŠÂţ©ŁSî˙ęéˇĂżŽ˘("‚ ś0D§ýŐ}ăđťjb ĐA.Ö+:Ľ[™2o3ę!Ó§sh»Î­˝Ě™§tŕÔ.ôčTFתJ #—fdv7 ĚÇk·±ř“ ,©ŮÄę ;(t9±ćŐŤËŮĽó ¶ďç°_gč°á<účŁ9Ń CĽ(”]3#¶-ž¨|ôŹ!,ýŰĄ"‚ ś0†Á’%Kř`w zw „° V4 *jˇ kgkěŽ>|0řěđ­G_Bó56]%l¨Š‚GB™ ÍTp{ŕŽ«.ŕű#ΦĐaA×#7ÚŞ¦Që 1mÉ\táfÍ~“3Î8ŁĹĺĘKSRŮ53b"±ęh‚!`Ř 6řrŇ•śńĂů¦É˛G/ËGr‚ Ç O?ý4Zg;zČAe= 0ŚŘ[Κ¦%ö8§ŠĄÂ Â&8˛®6Żó÷ňâCߡcY~żŻ×‹ahš†ŐjĄĽČÁOŻą€‹úžÂ­ßą‰wżGaaa‹ĘÔ"aŢůxmL¬ćŕö   …ŘůÚÍ|řř`–=züâmĚ_¤÷™éüĚŤí››H>W?ŮÚd’F:ą¤ŃÜ| ™”©±mŞŃZ[ú¦´ Ú'śHA/_‚~¦ ö č€aD&u>B.í˙ˇő‡ůîĄgŃąťźĎ‡ßď'`šć‘éB^–=÷ôÎ\tÚW<óĚ3Ü}÷Ý-*WŢúĂ^Šm Üyçť<ňČ#›D(bűôŰ›mFJŕRÍné|ůÉĹ.Ó<ĺËŞů–ł){2Űć„¶Ąů„UU±™V”µhěşi†‰yd®ű\›ĎőĂ!şV‡ BˇP,–Fk!ŃfŞ>§´çÓµk[\®Ľő1D‰ÖBˇPě Ě~čÂő1d2}2RąLý$›ç!]ţ§ż=Un.É„%Ó|Ąň“é]{>îňÓ•/UŤGjÂ±Ž¦işÜ\ĽîëÖ ˇ°w‰ŃŢD±E&ěÉULÓÄt(|µu s†aÄŐ4ŤÉó?cŘ€Óéޱśő[÷Ó®{ËßeČËdŃÚBT’ CŮĺ#>q;ťÓ‰Mă‰oŽE$ BöX,~đĂŰq ÷›EüÚ´ńóZŤë4 —Pă]A”'«ÔNqńňâĎY»u?@¬v…ćĘş­ű™¶x5/-řŚ›oľąĺĺj©`ČHčS…B¬[·H†P(D(l´(­lVŞ6ýlŰ`™¬Ö“Kľ2iRĘt_ľYÝ„ă™;źźĚű5ë9ß°Ó •jSᦍÍ[-|°-ŔFí0űJ(¶˘X0- Zˇś(‘€o±Y0l Ů,*^s_ŻÍŕۦ0ň‚opIß.ôěTB@×Ůş˙ŹNý€ő[örßÄy\xńĄĽřę4zöěŮâ2µ\ÂF‚(„B!žxâ  ©0[( Ů’I;{:ŽQhL>ó•ŹŔźmG2RM-*Ç2Š˘`łŮxýŤY\|ńĹTlŘÇi¦+VúšvľĄcѬö쪲Űâ3tf?¦ U…Z#„Wz=D;ŐĆ)¦•.f1¦ÂK¶đ?‹×Qď´ât:qą ąőÖďńč¤aôčŃvíÚĺmFĚ C(l$˙űŰn»ŤŞŞŞĽ×Ž©ÚÄŹvđJ×Vź­Ź––%ç"“~A8Öزe sćĚÁëőŇąsg&nŘČ@‹›†îذ(TEE ·iŁ»QŐÄŚ5 Y,–ħ–¬‘ÇWMĂ ¬‡ …Cś†Ć^Őŕ·ŻľJďŢ˝qą\X­ÖŘ'źäĄĆ°óµ›cO=đŔM!bË›÷¶¸ĆŻ@–©źtťÖmMşNăř}™vgR†¶*o6OR ÂŃĆ4MŢ~űmžůż˙°kýB:–š¬ÚäçÓŻ|¸śg†xjŁ˙!…CŁÚpĐMqrŞj§Łˇˇ…C„ŃYŹ~†—bÁjX±h–ŘÓEŠ˘ ( šŞEáÝOÁ€ó¸ŕ‚ žHŠ J´“;Ăb´ř=EQřđńÁIĹ Ö„  üř±OŇöÎç«­ůh´Y+íäąä#MA‚p˛đČ#ŹđÂ⪠lś}¶(śU]Ŕy˝ěĚůĐ‹¦YřÉHľ JťvĐY·ż–ŮŰÔŐ”˘ˇ °[ 2Xw2Ćta7­Ř Şf!¬(x-*›Í› ?_é>öXÂTx××°`Á†đ¨j>ŇS aěŘĽš7¦żŰ1uú\ĆŹo~ňzEQXú·K#} a˛Ë˙–´¦ ›üôźźĘp‚ ×l۶ŤëŻ»ĎŢĎ9˝‹•ę*+Šހ‰ÇoP^ ĐŃ`mápĂľ{YżÝ¤c±ÁüĎüŐ0Q]ÝbRZ¤ŇˇĚB— +ťŰYh_ŞbłDO„ăUU4h  °uëV¶nÝĘúőëٰa+×­eűńÖÝŹŐ^ŚŞ„9xX%ĚęaÜVÍ0±¨ *&„u6ěPX»ËdË>§=ň®ÄžCşFUÎé妺âk~öł»yţůÉ@Óá6-ZÄ“O>Iż~ý¸çž{¸˙ţű©¨¨ŕżhfL˘#äe¬¤Tß3Ý'‚pžzÇw0xđ`~ýë_óćÇo1ŕT“R§‰a@ű"ÓŐ„R\y¦B»•ŠEłă iÔűöŐ|őŐWI…Ŕívłwď^{챬G[Í_Ł” ‚EQ°X,Řl6zőęĹ”)Sxä_/SsŕŢ˙JÁ§G¦qvTšt)3(-б¨Nkö%&ENřj·ĆĹ_ś4ť… R__Ď!C¨ŞŞ˘¬¬Ś!C†dśO©1‚ ´1ŃůTUeäČ‘\rÉ%Lž<™É“'łűëĎ)w”8 PŔDETŐ$¨ëř ťN9›Wf†©Óç¶f>A„Vdüřń·eŐůüŕć’Aá(˛ŞfyVöY7%™¦ÉŞšĺ'ä2źźčŹq,”K–˛”ĺɽ̚FŤ0«««ÍU5Ëcź|Đ4M3á;`®ŞYŰ~˘.Ó}ź—T6 =6Ę#KYĘR–Ń媚äq¬şşÚŚęAÖÂp´ ŐšËĆ'*Ů'a8Ú呥,e)ËU5Ë›¬ç]Ž…B¶ĹILő‘,e)ËăyąŞFj Y-ź¨d©1ČR–˛<Ţ–Ť×ĄĆăILő‘,e)ËăyąŞFj Y-ź¨d©1ČR–˛<Ţ–Ť×ĄĆăILő‘,e)ËăyąŞFj Y-MÓ4|đÁf?™Řť,"*KYĘňŘ_6^—CK ŁŹišŰ ĺ’Ą,e)ËčrUMó  4Âرy5oL9öâ[tô˝čŘS§ĎĺÚ±CłNA8ęôî{~B ‚ śdČśĎÇS§ĎĄwßóŹv6AR" ‚ $  ‚ $  ‚ $aŘĽy ›7oɇ+!Gn˝í.Î<ű‚6÷—ŤÝ­·Ý•7»LÉ·?A8ČkŤAÄáčpëmwŃľ}{4MkS٦ۻwoúôëź7»LÉ·?A8ŃÉxHŚć1ć:fĎÂćÍ[¨®îš/·G•\…®%ĺ?óě Đ4 «Ő @(B×u>˙tYRű[o»‹ţđ‡l۶Ťůóççśn¶ţrI÷Ç?ţ1}úőgUÍňŰeJ&ţ˛=ď‚p"“7a€H@Ś6+µ†84wń¶ĆĹ=bĚui÷Ďž1ĄÉ¶řQ łĹív3kÖ,¶mŰĆľ}űXĽx1łfÍJj{ëmwńýďźn¸ßţö·¦™SšŮúË%]Ó4Q…?üáĂ 9IDAT@ę ť©]¦dę/›ó.':yh]qhîâm­‹;]Ż®îJďľç'\pą\ÔÖÖ2dČ>ýôS/^şxn˝í.îşë.~đ0sćLĽ^o‹š’2ő—kşápşş:\.WěĹšdA:S»LÉÔ_¦ç]NZ婤¨ ä»Ď!ţâíŐ«@ÂĹŰÜţÖ"źo‡«ŞŠ®ëTUU±~ýzşwďŢ$đĆç%K–°wď^, Á`0§43ő×’tCˇ~żźÚÚZÖŻ_Ďřńăąĺ–[š´ýgj—)™úËäĽ ÂÉBŢk QZŁćĐÜĹŰ÷ěSÚ´Ď$ bFÂ6UmĐď[o»‹ýčG±ŕĽyóf|>_Îéeꯥé†ĂavîÜÉÖ­[ůňË/“ŢÁgj—ďt›;ď‚p2ŃjÂů‡ć.ŢÖş¸[Ňg-ˇP(AĚE‰­ßzŰ]Ś7Ž›oľ™%K–°mŰ6<×ëÍ©!SůH7 áőz0 `0ČĚ™3›éLí2%ßţád U…ň+é‚f&űŹgn˝-Ň„3lذŘűˇC‡8|ř0@Ö©ż|Ą‡ńx<ěرýű÷c†ađć›orűí·‘ Ý©S§Śě2 晦[\\|ÂţďB¶´ş0Ä÷3´ôÎŰ4ÍX@Ęe˙ń@Ş2¬]»–wŢy‡ 6PVVF×®]±Z­±Ŕś­0dę/_é6ľsp8tęÔ‰Yłf±aƬě2%S'Â˙Ž ä‹VmDŤ…ćűĚ”čĹ’Ąćö$+ĂŠ÷˛`ÁV®\k/w»Ý”——ărą˛N#SůJ7zç Î.—‹nÝş±lŮ2–.]ĘŇĄKYUłÚéu]oŃţăTexoŃ\>ţřc>úč#¶mŰĆŢ˝{éÖ­‡#§@–©ż|¤ …đx<±GGSçLí2%'Â˙Ž äĽ6%E›ŠZKTUeýúőěÜą3¶­®®.ăýÇÍ•á˝EsąčŇa¨ŞŠŞŞ„Ăazőę…˘(tčĐ!ëô2ő×ŇtŁO•””P^^ž28gj—)™ú;ţw!_住ˇµD ¬¬Śp8k3ÎvKh«q 2)Ă»ďĚaŕ ˇ(ŠB `Ë–->|}űöĺ”f¦ţZ’n(Š˝ď.Řgj—)™úkÍ˙A8ŢČ«0Ä7'ĺ[6mÚ„×ëĺő×_gçÎťlÚ´)«ýą’Ż·š3!Ó2Ľ·h. % ŃŁG@“Guł!Sই ‡Ă¬[·.m°ĎÔ.S2ő×Z˙;‚p<Ň*O%µ†(@äÉ‘§ź~:çýÇŮ”á˝Esąŕ˘Ë±X,yyĂ;Są¦kFFÁ>S»|¦{"üďBľČ»0´–(͉|ż¨©-ɶ ËŢ}‹ó/LŻ^˝ňň$M¦ţrIwĺĘ•űLí2%ň’› 4WahMQ8ZeYńţBÎpY‹š’rń—mş‹/Î(gj—)ůö'':y†ř;ëă!ž|°ôíŁâ/S»Lsľ¸‚ dOŢj "‚ '2|¤ ‚€ ‚€CsíءŇě&Â1Mł} S§Ďm‹|‚ Ç)…!:‘It)‚ ś¤iîA89‘>A!A!„¦¤‘co>č$ŔĂ™1 ’đÜß- ­—šył+7[!I0[@hÉf ËÍf4µX®ŽżPüÄ÷ ŞkĘZ:j„«kvőá›cVLoĽđęoëÎ7¨Ť—xK3·Z¸Ĺ I‚Ő €+ nnEQÍÍÖć¦ď®¸ú٧‹ď­ůŰYŰ.5KĚhůЎO ú%˘W/)V§^€Ť(ŰČÍŚ'ż7rCÉßďÉůiő™:öpθÍÓ¬şřĆžf+˝/&‚ z$$ť ŔK“ź\×Ň/éd\¸ÄĎ_B‹f WUXU(*8‡Eኳ‚3olÁ·ŤĘ… .Gő»ËÇöĎ;Ý FfŐŕ›®ixîI9±“uęw”oĎss Ěf®ŞP¬\Q«…+ ·šąą…77Z/}{ţÂ…ÓQ—ßřĘú˙ř3-°HhĽ©u_:ŕŞ8u3 ¶ŽŘPň÷ńëjwďŢ=oÁBË—Ťš ż˛@ňŚ,aô™A„şsA]€oľăű0Yf:Q:®¨ŕ*ł2çŔ98gŕ\R!KL'ń(Q2jÎ|çžŃQ#Â9}ńÝ€L–!ë. ŞÂU«…s™ŕśKśqp&A˛ĺ‘tQßť­éwu4DGÁ˘@˝RlÓĄđ(HŃ”heDËP%HŘPň÷ńăÇĎzřˇ‡gýBěŔĽ ż:|tĺˉŇýµ*›×Y@ˇ^čŮ• Âť€açŰF~±:™7¶đ¦´a¶pł+,V®¨0[9ĚVXX®¨$Čbh I× FŰś‚üŇ·ęw™NÇ›yKoiáf3·ąĹ­®*Üb8·ˇX¸ŐÂ’$É2đ@#HѰĎ4¨ÍçźvOÎO“ţlp¤|uřh§·,AAŃÍ0[qţ—%\jFc3ZĚĽĹ ł•›Íh±r‹-V®rXU¨çŕ*—‹ă(kynvŚ˙G?vIÓ·ŐďÎC’yÓĄ^?ś7fâŮßÜ‹Yµąµ ·¶@Ulřř»mżůëÓ\ĺL’NűĂ?¤ŢŽ‚€2s<1K¦Üv;¶łląŻ:رĄÄŻwĂşµ/$>‚ooüŰ­néqĆżőÎô.˙¬wÎ@¬y2őÄ÷îÔÖu‹ęfó›µ;güŰĺ_9÷Ôă'A&h†]‚°c±âR3$ f3,Ű?łf+Ě!Ë` ```vÉkŐ0Ň*V•ą±Ă-Ţx ˛Ä[Ěqc&čó— §çÜĹ­fXĚÜjćłáť˙¸lĘŚo^.4Ł(T3ě1Šěoš8 2řiÎĎ<¶ňpQ Y…+P8¤-Ňm\Ó|s.gËrEşĹżb'ĆƧŢ{ţkudnsďv›‰»c4`jM¦‡Çš;)şbđőôżrę€()C˘°`éĚ#‚ "ä4›ąÄŞrE…ÂˇŠżŠř\P«XćĐ`6˝Şi@ΛÍfŢb…ŮĘ[ޢ0‹ «Š#/Ç[<ڏ„Fđ–f.IPU(ĘŮ˙Ééó˙Jô/Ţ~ęţńŢúŹČcşkT\…¬cÜĹóĚŁf‡)éŤ&Ůćě>˙ü3Ńě;ÖYç`ŠË$¤’ŹÁˇĺÖ2¸â¨ž\füŰř¤%s´t±®[ôͬcxbŃŐËFđěŮüŰ_>—őďăß®Čü¤q]żřGúź\dKZěyś[şµ/ô~¤ŹHlYđłĆÔzg0dĽ{Xl/;"ĺ"[Ň`ę˝ß»ÖÎ6ŢţxK¶¶5ďm5j‹A˝Ž/‰Ośřç7×{>g ­Ś›Ż{üŇ…Ąč“ť®pÍ D4^Bď«´v6FłéheŐse/źËú74j5¨×ń%Ń;ţ©xů#}ĚĹ3÷ę»řÉW÷}ńásćťÝ  şüŽ>‹{ÝńBŻŁçĽěś€ďŚ˝Žž„ĚŔ|Ç•ƶÄ˙Öű|󣡋{ő]üäᦩBۚƶ^µŤł_ŹÍÇőY|Ůď§ÜŮ»,ý‚GłŚčŻCÍů“úŁ;ŽE ŽąĄŹyçîÜ|ÝăM 3ďťőŐtÚ™xĺ{węĘ–®ęŐwń“h[›ÔKŁVÝ#7|ţŁ ďÜńjCĘť˝_n:=aŐŻ6¤Ü©®»ęűÚĘ»2Ę,Ď;ŮʱA˙|ý#‚ .€ĹŠf3ĚX¨\¨_ĆŔ“ ——ˇJP$feĚjźĺDÓŕĎŕeD ťV oi†Ĺ Ĺ ®‚sĆůé_Nu”rzćH&qƸÄT ăVĆ­PŇ!ŠG€ő˘®pŘt : \§2Ŕçźötaᆒż;˛\;tprßÄ˙{ú±˙nHÍmG„zV,â†muw*kď2řÍ|â܇ßéÍ™·–0ç&_‘*ý;ŠOć¶(…a–I“-"ۇ»˙ ~đóĄ0DbR/ó[ůvSW¤J˙^nšDçľ}_Ő´+—ľŹ¨ÁMŔĺöH’›,ŁG[íe§Ź{eÄ.3L‰Ívľ¸ňCÜd™4zé*DţJ6dhXóŢÖ«¶Sš”‚KĹŻîŔŕ{/}•XdŽű[wbÓ¶ëýOćźćĽű€ů–Ű“ZŢ›ž˛t3–ž5ßţÄŘ­žó˛ăšAÖ9ľßĚJÖß~ő”kÇZÄđŰĂďµř˛ćľ-dĎRF\#˝r7ĺçş´‚Üp‰×Úé®í“;ęVž<˙ěׯ¬‰>±çȇLJśÄU×oű]nţĄ×Κ}4ÝDŤĚM*Ňú˙č‘ÔçOę¦Úv­~ÄObxÖęŰ @,Ąď‹ä(BoűTő#úiîË9 —V?¶éŔ ‚č’(ôÜO6Z,h±@– “9cvo±ÄŔ$0P €‰yAT•)Ü-`ĂŐŕĎ+cnFtѰrÜŇÂÍ-\’™NÇÁ8ç}_Ü"ěźť}sź5H|ĺżçĹ$Î…©`VU^çčh𠽬°RŚTť­–:9€¦vş@˛ţ˛˙nEő™:I'`VEb 1â“FÉ.d%DiĽ<殎d­ î™™«5[Ş,ł(’Ýq%;Ąs”ěôą‰lŔmÉ2đíż×˙GM}hxZp^ä| ˘_X=ĺÁěwJxůöφlżÁµbŢv8´+`<­—_;üj•폞»éi͵ňîĄ<ËŻ‹§ŻúŐg;0Ă fĎÉĹ7‚(ŰÔ˛§2r4çţG93ć80pśu•öÎj–ž•˘‘ŮřfËşô¸GžÎŔ”ýeĂă_}sťV­nżÉľ‹’sweg¤ĎÁŽď{ďKZ+MŔAř0|AÁ‚fD!;f+o±@'Śm.ĐÇŕ†ß73®Úż TTf±ÍW-yÄW†\„mp&ôg€ĘÜŤĐ1Üjć–®ÓLęűÂ&±ňěś[^űČ’ÖýGęuERɱşéýŔU( SnµŹYŔbçÍUgWÉѰ2ÄG`L ý˘%//ćÓâ?üřw+üßÓŹÎć'VľQ}¦°ŐXČDŰÇŚV‡ć‘ÝoćE/»eëĚY»ŕ’îĚ 6zB#›­˛.™ĘÜé!gîźę|d»üÚá‰8š”ÚŔU×g8ýďyČZţđżNĘ'X*ĺ)_Őę3ýŮ‘ ĺęI˙…¨ě4»ć3˘ě—ČĚ™ő¨î˝x¶vIÔµ˙4gíb_ŐÂÓš÷¶^ĄlýŹzrjBîüŚą+'4—Ź˙s)nµ S€ťGjó»ź"ł÷ţŤ˙JĤ˿ŞEć DÔ)Z;ë«é´ZĆóH?ś|óŻĂź¨ůÔô…ďU¨'ďđŞŐ5±ëÚ\ÎeăNőäOĽ÷ĹWeÜZŚ&Ąl?Ń­g!‚ `#ĆQ˛ŻA’Π‚©€EĺVŞ•[Ĺ«›hť¦«ÂTp•3pˇ—íFXT¸‘%ń"›[¸ą…ë˘Öďĺ ËgćÜĘ8ç?÷ŕ Wżö€ÄM§ëîřž¤XąU…ŘŽ·Ń¸hЇSwF)Ń`L–B^žką17ęÓâ?Ŕ.šB7ÇüŹbĺ·rHŕ°ŕQv±+ŁK9¶4öë…-‰\O\B-<˛ <2;šé\DµÇ2Üł[7Z×ÝőČÓł›€˛÷ż;yŰe)CšYĘŤ2pÖôŁEµaťőŻćGÎx÷P«ÜžĎ=ějÖ+ůĂďîu”ˇ€NÍúĹ©˛żfüëźpâýúëţürěĐ…îÖŰzÖ§””ŐßđĽ6Ý €ŻËßU¶Q~ŕeă¶LćŕŠďýůő±řĎwöľNą‚WŐ7_7ň'×e\ëąłµ›Î¸Áş.Í«eđ@Ę˝ż¸tŻ­Ö-¶üâ¤V­®Í°’]\–Źiî‹ÝWíŮŹÜŁĹŢAD„Á­ôµAŘ0[Ńl†NćŢs”΄˙Xά ¬ U0YÓČ»E±~Jô4˘‹ÄÜbć-Í\§péĂw{Ý|Ǚٓ•s+S¨ W•s÷ ązĂ‘¦÷×CU¸Ő ‹•‹/!â“[ Ä€ášĎ0ŕ*\‡ËeÄč“Y”ŽŮ?Ő—3ŻĐýmńŻŐ.çčů¶ E„•pL ±Ć—ed™ł2@®|:ę8Ôńż3'Ů,¨8»ńoň÷lŢŮ왝Ö,bĂA?kJ@>ş6úS(Sg™{A®|:úŘóŚiŠĂľ=›Ăô ¨7dáS#nüesßC±[Ť"^€ő¶UF­Ýżű =ĺjŮÝ\2Ř“'‰ B…5ő†_š'ŔÓZ†EkŰć^žµuŰĐnß×Wk7Ç~;Ago„ ˛÷ÎţZłéš{y·ĚÜóë{¨Db`|ä»g§MúĐWś)Ęň¨•z©o&0at2¬ ¦@UÁeŰŕśCUau‰.vu%[­°pD1čt°ÂžańҲ"Öůä^ű¦ç/á* ¶Ń2cL¤FĹPfź‘Ë:(2d‡ć3'qšH‰ ‚č±´t&0@†EëT¬¶§ZÇJ¦B’ ¸¸›T’UµE¨Ş…C :Ý8˘eŕś,ͶtÇt*öŚÎx ±Äs đÁµ‚©‚ t $°ˇřšy€]"ËZ‰˘\s 6Ǣń"tb"nŽó•cőĎ}sŞXcšD‚ ‚ ‚č±čě ÔâôY¨fŻ€e‚ ‚ ‚ ´ éLAAAŇ™ ‚ ‚ ÂsśgeĆťˇ¬1ăçłę9~RűAA„UćŠOé {f^pęCxR_[ĺť8ăçłC_‚ ‚ žĚĆwÖřYëO:ş Ě÷~ľžx‚ ‚ ĐÓŠt©· CAA‘}&HAAAŇ™ ‚ ‚ ‚¤3AAAIg‚ ‚ ‚’ÎÝ SiÎĚRS÷(%Śtű$‚ ˘]tŽLLĄ9I©z翥»;WíyÚźő†·iG‰í.ÚmĂš7fÎzŁ<ČšŐŁŞ$‘ ‚ ‚h ­NGtQ˛WľťmpI˙6`* ž}O Ů%ow¬ĂMÓP°Ó”}ź0}ĽSźËČľ/Łc6 ‚ ‚ ‚FĄł>)őˇ‡pţüů«®şJüőţůꫯjηG81•ć,ŔsË\~¦ç`Âňе÷ů“Ŕm)ÂfČZl+ńí›v.Č7‘–”źőüŽ’{ú·Ĺb˙Iwá×ŐÜwOŽá®{ 6›ŮŹúĂ5ýŘĽÚ…ăQóĆĚ7ľ˝p|gě™gs9Žâ•F»©Şd=AAôlÂďuŇůĉ)))âŻ÷ĎW_}µýUäáC-_Şź^ŚG×׌íHĺÉ1?-)ßţ#wsĹ —u{ ŇŹÍ«­*ĐĄ“üűŹ[µźµ¸ňíäµéůĂ7U•dŘdşťţ÷-[ĽYčÚ¶ď„!e¨q[ Đ÷¶âáSú®ňpcY5€Ź¶tčĺźQs&µ˝D÷v˛kçx1RQUoĚŇ[k;I©A™„_: Y|üřńĚĚĚóçĎ?~€XpüôboAŇ+=ŇZ 0čfx쯩tąsąú ŻL*¶˙έÚÜ2^öżČZü\§»]32çN/Ű]Đ˙ř—ą·"îXŁţŮ·>şć¸ 82ôÖÜAË‹÷ÂPýĹuÉíén×ýĎĹŮźC˛¦N2Řë‰5ÇMߎ0‚ ‚ <Ń!Üź ŻłŃh,,,ôĺu.**rßhlQmU`Ú0+mţ®¶Ç ô"ćAbě­Ź®9^ţńćë2K\“˝ęo‚L{Ź|9h–á¦i_ľąŰ„áS˛;­~žC‚ ‚ $ Ö&„[6Ŕ‰'Nś8qţüyÇ_ďźÚr"gCŤs•1?M¤{ʍPľÔ9”„}íî"v"CňpcţÚňN·ąu§ Lm5z¬5«nŻáńS†Î›ž?|ŠKäŚVý §â…5_Üu“ý'Ý…¶aHg=Ň\ĺe+h‚ ‚ z*á—Î))))))W]u•ăŻ÷Ď@m˛Kj«ęk«ękw,Ď‚q~sHµ¬Ĺ•µU•ĎO€1˙×®RŘTš3˝8ëůőµUő›rĹZÓ†YÓ^‚-±¶*]Úc‹*1Ýóy m86lÓŤ-Ú4t^zŞ>)ő×G†fąć4dĎ{´xZ»ź122ç"÷V·P­ú’aÄ´‰ýR°ňËAť'd}7—٦csdxń ‚ ‚"áŹuNeW7ł÷ĎŔ!ľÖR†»ŚGjbĎ/¨óoŃĎ·ĄŹÔ`çߢźŹ. â=0ś=Ĺ–nČ.©í@<ć憅őµ ]u_PU_ĐîÂĆŐÚ]ÎŽýҨ€K¶Ś…ő틺öh7ßĹ•‘ţ"&î… ‚ P~é,śĘÇŹ÷3ÂF€¸†>ď.JťöR zéă±ő)KőÓ‹!ô‘®8‡>)Ő#ĄsÇď ¶ýP–âżÄJAD÷ üŇą˝ÎŐGţćšă_jdŘ˝­ŔÜ)c2‘bóCĎs÷=îăŽe,¬Ż]č6’q#Řj/4j2ôšµ %v|΂ ‚ şá—Îťču_°~îK¬ś‹~ţ„¬,÷uŽŃ|]_”8ľ ËXX_1('=š}l˛¬çw<‡ŞëÎ IDATgÔGÖâĘ®çr&‚ ‚ BOřĄsGĽÎ†{ÖÖßăš`´Î­°Ý —°]Ť°ZłAAѤs'zť ‚ ‚ "x„_:gffŠŻyO(3î w‚ ‚ z™Y“ügłt¦‘ ZeĆĎg‡» AA=‚†şCţ3„ßëLř§Ő.$‚ ‚ BCřg$‚ ‚ €¤3AAAIg‚ ‚ ‚’ÎAA­&HŁE ‰© u]qč}RŞGJbeĹŞ· ]S ›33LŐ!‚ ˘ť´"ťcˇ©ŃBYź” ňÁ•`Wę ľzBRŞźµť‚x`Ň933ł¬¬Lü,,, Ë“¨Oyh!‚ ÎĄ鼱ęthęŃăąŘ)V‡9łs]î:8usŃÔÇBX‡@7fffNš4içÎťeeeb ˛˛˛˛˛2}Rj(%¬ÍÉ·Ý࿸÷?}3dEű‚t)µćuŘ˙{ňĎ#F 9}ŞáűĎdŚí-~+ĄAD÷€¦Dé&ĹěJAAˇX(** ±w.aÍŽr=ts}m•wčs§#ıĘőÝ {T†C1ďÜéöŮŔ¤I“D†Hg}Rjâo,ĺÓ†/cü=ŚđÁ«›jÎÔ}˙á™˙}ĺmGÎqżĽĎËŻ‡ >ŢdčŹR‚ ‚h+4ÂF7ˇˇ®Jüs¤ěÜYp€ŕś‡@§Đ'ĄŠśŁ°°sgJ(ýÍ8TrBRjČtł 33ł¨¨^şY¤Çs¸ztĘ[ÝđČĆ˙yˇěĺËű^ŃwLĘŔ‰Cn{qfné㼺ilîLqxŚűĺýßÖ~ěĘLľm&Ľľ?Ĺ*‚ ‚č˛tîV$$q;w–y„„L= Ĺ\TTXPPXTTČ…bvŃÍÜľJŁ«V™n ‚›˝u3Ľâ7‚‡x’ůŦy‰ć$kązô…Cű}üé÷F§¤d ľíř￲iŕŹFŤűĺý?ź–ěĘ<űçuű÷ď‡Wű÷ďöĎë‚]‚ °Są).§ĐíßoËi`†Č€¤s·Âń] ř(͑Υ„@= Ĺ\XXČÄ_`ö€H±ą˘CE‚KY !,×1¤FąrpŇw&IŐýëË?ŮđúÉťśÜůAUé¦ň˙µ˙˙ŐMĽíĹ™ůůOÍş'ď¶ń™Á®Ě¶mŰ,X°Ŕ{•H‚ ş- şßĆ=ó©gňŃbs cŢmG•¶@ŇąŰâpj”Ůý۵ŕ!üÍ8çśűűÔj¸â:Jťk¸sp ©áčťĐ¨ęKgľpúÓ©ý»\ÓĎůďálůň…*ýĐħßűËúSŻ]ěĘ—ó“O<â˝J$Š AÝyő‹QG}®•^}1ş2„µ!Ú}&Ř#Ylě^g `÷ű7xŹî,FŢÁÎâ+@o},şcçÎť"CPë úŠřsoU·4|«ą¶©ú›úĂur‚¤ŹÓ›.ś ve‚ z2gËuŰíË“ďiĘęHŹůŐ›)˙­śĄeĐĐg]’ÎÝ’pžr"Zsř×ÍŚ…"ÖŮ׬(®ăÖŹÇćĚŇŮ1>ť1Ćs°+ hz‡W~¦0ÎÍ­;Ô\Rč‘Ýw`ô™¨˙W®Ř·e§ëěét69 őˇlë©ŁŹ€tްKg— ĺg6 +čf‡Ł5tłcO7ÉÝÉ÷LŇ™čdşN´F ~ĺ8ž<6g¦/e\XXČ9ăźU=ź9VŃwđŘ+ű%†Ž3Ţă+[úeűűoOľm¦đ= Ĺ,5jÔö÷ű +ADj~ęF§wöč±9Ř‚úxĺ­Üm׸ö— —¸éÔ»Á3’«ŻĽŰ?€ő Cm*ŮĹĺlI묂>´yŁ]#4ś~h/{DCŇąÂXŘdž ´† UYĘ1ž˝Z™1&Ôs°§ÍU“z_LHćĐ@™q猟ĎvM!‚ ˘ŰÁŢ]kŹviéî ŞO·âf˝áŻ˝Ó/Ż¨ŞŻ­*ĘRm´đl­J:š”:AÝ‘>Ă{dłüŚP™G;BŹTúxçw 7č~ë©€ł‡d»‹—÷ÓÄ|ĚH›„Ý.ŤcÉůŞXű ÎDýĘ%¸ŮeľîF;6ş ×Yh対úĘ‘ríµýtťpíŕFą>ތܹغӔ}ź!X…0m•6čćÚŞń€ÝEKwcPËk•¬Ĺ•ogJsŇS 6…VúÂQ+;ă:ęš[#,X»pĽf6Sőzk0źx5'†ěŽ nL‚őg7FŮkCjhŕňů]‚2ˇoÔQá ţ4:ÇuÔä3Qż*”Ĺh.ÓjŹţć!aßjöt9w¬ >ć‡Řc =6·ĺ÷áäŽX$Ľíó6w)Żłđ1őŐW_}őŐöíŰ÷íłÉS‘Ňu<ĐA}Ţ0}´wÝ{ëu»6TcO˛»úŇóŤľRÚLÍÎ-X^áTfă lË;‹Ü\ż¦ łÜ\Ś¦Ňś™Ąo¸çqsF:<ŽyOµ0d—T,ţâżv<ÓkŢXo4ć§%Ąćl¨éPéţžT˙ŤĐţNqÁ<ܵP·ÝŮ[žoDń4{żQ”ŞOZş[#§K÷ŮŔýŰaö6·•>ëŤrálvď‚ nDÚôć‡úúYď1ëż#Ďíx§÷żoŮ⬬ŕµU%÷Ôt´t÷Is ŘđŮPťŃ)®”—­Ě” híěآ ŰÎÖW,βŐdáxŇ_Ďşą¶Şľ¶jóuÇŞ5ŞÝ±™i« ćżą5o,Ř:­b­ýU‰kŹôďx{At%řyM%…:uň=M%ßŇ)ynAĂ0řÖć’BűčË ň.{ÜtŠŻ‰žâ,Ĺ×çz+(Áú'ŻÍ}ďTÄI#lxk_ž±fÍłgĎË˝{÷ÎÉɰ}űöŢ˝{Ź3Ć‘3Ľ!AŽÖúś0dÎťľf§)ű>T‘µř9×Đ“WJű°)3ŹÄĹł„eĂ ›ţ3•ć8ܨYLŢyĽëcŞţĹ+“Šíżs«öhŘÔşýÎ*]ŕź`*]nOoĄÚ‡1?-)ß­ÜVwÇQĚáČź–„͵ Ç,„©tąw˙¶ď€ CösĎĎJKş%ëů%€˘› ‚č)(y…Myç¶Ť\ˇI‚őO…ÖÎ*®ůŰĽ{±ÎqĚ PRR"Dó1cĆŚÓőtđž7Lm5wŮÄőQÍ}QŽpë®i=śÚTš“ľuZEU‰0•ć,ĐĚsĚč$ÝjD¬LŐ_d šĺmÇEąúłßÁŇèą©4'ýS"ľ;ޑٵUEŘ[”: ą›+‚ËnH ě ’q‚ ‚3ÂFEEĹ A„h>věرcÇrrr–,Y2fĚ}űö­YłfĚ1łgĎ^łfÍš5kfĎžť““ă+„sÎ9}GĐž7jvnŮ5WĽôŻ­Şß”kÜň±É<ܸu§[ýh«Bőş§´‡±łžÇĽtgÂî"—hW˛¦N2ř-+#s®˝>6 ÉĂŤůkŰJ»· =řăŮ_v|ĄŹUwBéí˘s:Ĺa-»d¦‰řŔwÇ;§©´`C 0¶¨vÇň¬ĂÇĺŢ[0›kן_ŕY.z„ ‚ ş‘áuí+üÇB=ČÉÉÉÉÉ)))Ů·oßľ}űü{ …ňkWŻ^ť—ř “N X^gÓÇ›áňŇ?CÄl¬-ÚT¦OOťd=š›c˝RÚážµ••–”jűýčúzT/÷Ě”=ďşTá÷]–ł>µ[T±8'=UoO ČięUŔ„ĺU÷ ag™˝Doű†ěyʦNK*Îz~GI;Jď(ťÓ)N2V>?+-iÖňе7¦wł$cţ-úůőüŽĂÇ›;^1g7°Ľbö‘ô°©j<0~S™>}é@‡o۵G(Ü™ ‚čb0ô­ŚéwĺM‰mš;ıÎ3RűUTT”””"Ř! EG‡C^{hWŃě /Ż«Ě4ŢÓ'â._Şß–Y_06Üő ‚ ˘§ăs"î“»p©˝q‡ĹëüěłĎ:´ŔżÚŹh Á{ŢĐ;|Ŕ.Ô×Vuń˛vĄN{I,ćn®m§n徎w­B_Ą®P?tńęA„&‘4€ô}y9«" »ŽhŻĹB©9:±¬ńUő5Ň5őVW¨UW¨şxő‚ B“Hň: Ň÷ĺD@ÇnîÝ»÷7ß|šÚş®ç ‚ ‚ ˘S0Żł@´đ:;8věXď޽å›Ńeć‘!‚ ‚ ÚGäyťTŚY }_žíp9 ?´CI“×™ ‚ ‚h‘ęuÎ[ŠŮ­hŰ·o0yňd×™ ‚ ‚čéuä­ ! óňňD 3\D3ČëLAAtŚHő:Ř·&}Ěě 1E k‡ë<‡ÝĚë\fÜŮ)5!‚ ‚ ´uŤö:Ź™]!ÖěĂl`ŚÖÔŕÝĎë<ăçł;Ą2AA=śŤď´yăHő:Żžm Ř0[K4 ş™×YĐŽn&‚ ‚ \iź;2’ĽÎcĆŚÁě›m™nöjűüV¤űyťŮ3ó:ĹAAD¤Ý3sE’×yőęŐňňň=Ćź€öĺub:Ätn‹qÎ;ŃbcÔ ő`ŕP[µU¤C=^YÖ'Ą¶»”ń:§§§WTTŔŻ€öĆŰë,–ź}öY«N‡¦ň‚NŢhST;Ńup|îI=ˇPµUŕP[E:Ô]„Äa­ćé`ŕkdxť…ĆMOíŔŹ€öĆĂëŚ0‰fAWř¶’ ‚ ˘ěG—ń:#  bĚę<8etÍ‚°[IAAt„Čđ:;‘ÚOČĺôôth čôŮyăm;vLć'ź|ňŮgźť‘Ú/\ę™t3AADDI^g«NĎHí»\ö% gó“O>)RDžp©gň:AA„}Rj»ÓĐ$¼ΰG\řĐŢo…°&Żs·ˇO˙gk†»AAtEÄHť«ž#ĚëěŔż€8â4 ^Ń, Żsçҧ˙«Őҧ©g‚ ‚ ě w…Ă«TľTź4+g¦‹#GdŮZŮĐSŐÍ}4wĺ6— şČěńmł0ËľjénG)WŠwąîhęfA7QĎ ŮĎ=?(^.ÚÍW_řMtos[Ż=°Ч‰öo_ŹŘŽűV3KMŔnËahµ.ŚaP€/«ÝŽgSéň—€¬ÜąY€qëNű:‡GvÚKÎĽ‰ŢçŁÖąăę߇„wŠť±EµvEF"Ą­ ĆúĽŔ®#ˇ‘óŽĆńŘ#±;E{[żĆ¶~•7…Y¶‡Ľ…čŢ´áhŻëŇ_ZW`ř9ň©»@÷ń:w}‚÷ĽaH Ŕ8˙Ď3dzqÖó;ęíîŠ_;Żţ[=˝:ďń\Bő żÎÜÇł ­očŔ̹/•9“!»Äö„íĺ•1ťW[Uůü xÚ¶ĚúÚŞÍŹĆüµĺţ+ěD§‹˙ü¤D:¶=RăŻM˛WŠ–‰~ÚÜŢk·¬ź ą›k«ękŽ+ŰŮ#SźsÉ9^Ó20}´ŐdÝu“A#ńŢYwMvmţČvSśö’ÍŁąůQ{VÍDöóQ«§LfM{ ¶ÄÚŞ’{ú{§ďŰF„µ•Đô0Ä ±˛ÓńjWc?gtëW qSŘ5ŻxŻŁÄąŹg‡d˙ş'm¸; ˙´xĂP»cůu@ůŇ´ů»Çłqţ-.KnW`í#źş;hDę‘Hż­ĚXX_›Y$<0ÎżEd}ĺ­FóoŃĎ·ĺ2©ÁD±4t^íÚŘ;Ĺ+_*Ű]Đ˙ř—roÍ€iC z0öÖGř`›ÓeeÚ0+mţ.ŤŚY’‹îââĽő,nyźz8»ëg‚Úm2Ń™Á2Ř%Ęg›»t÷ŢkŰÚ#)€ë’ @u;w«Ç`ĚOKĘ€G×»kŻšť[v¦MěoŔÔ,ě2nůŘtOvµx|ť2ÖŐĆn­D»}[Ďš6ĚŇč©!€¸ĚGÖó;đNéD\[™JsD|KÖÔIÁÖŤcrŰ#”/uËěűچź+łćMaË.qS ÚOŔwçÝGěŢ+č_Aöî˘TŘŹçńSrńRńĘm{‹¦đĽű:ň{fwo|gM°‹ě6"‹ ·Řآڪ"Ř/č_VWŕuŃ7U®×Ö±łžź°r~ń}aDÖó÷އí˛ÜÚ†žŚź’;Íî§«° ľö ś.wGďř´űÂc?mî»×Áłôň˛ëad-®|[Ë…Sţć<#€]óŇSç‰cţÚňě[Űlß­g˝Îť±ő)KőÓ‹aża׬őJŃR™a!˛ÚŞÜ¶ ČݬYíÎEłqÚ~^v•°ßаŇ~S :F@wçÝEť\jĎěn˝×¨Á  Ç:׼µ8µßŚÔ~3Rű-.=ôâ‚O˘\LÇŚ®Ko{Oô¦˙ŔSĂÄ©YŔĘůůFL6±?ś/ZŮĐ“ŚĚąöĹę#ŽÇÜšă_j ťĺv?LĄżžż Y‹ź»§«mâp6´ŻÍýC=$DŻ9‚*źź`ĺ¶˝ÉC&řâ„[ś’f˘>{*cˇíĂS?)]›®ŘV¦Ňˇ›łWFTxR€W ŰMáĄbŘo Dçŕ÷î<~J.śÂÖĽQTš<Ĺ+˘RóŤŠŹ#żgv·ć¨ť>ÔF—Ťu.í–˙·C|đWj8ÖŢ ďyĂm°'AU0 ë+gŮľÜň=&Ž!{žŤztö}­ŕ†žŚ˝Őb%"_ŤóoŃ'l|7ÚXn÷ qĆKčĹ('“ź61槉/B]_”`›Źť%" üŻ =ŇFËÝŽÝE©67äK´öťÍŢ^‚ë]JÜşđRYő=EËłla‘‘A+Ń­žr~`$ލ‚±Ţ)®µ*H˛ď‚1?-ĂŔE~[Ů1ć§ůţ¦ą č•Ůű¦@´—6Üť3ÚQIJŐ'Ý2ďK caĺóÄ}ADŢűŞYóČď±Ýť8¬ŐeĆť)‚ˇoeLź¸+oJĽxî›S+śc”wfĎĚ ß8寥îHŻúýő®i5o-ľĺ7•9gdžÉxkqĆ ýÍŞâ9Ř1xÓ-G§ŰňŰ·ő“żę÷W—Ţ3'ż &üeŐÚ»żK~˘\&őľ8¬ˇî#ĄĚ¸sĆĎg»¦87ľł&{fçÜc-)“«ý=(ŢúůzÁMźŽö`O‚Ú*pşL[ŐĽ1ó–yFšVŁÍt™lÝ­»=Ô”&˘§ęk«‡m|gŤ/ąĺš¨°/.ťĂÉ]¸Tße˝Îéą«ţ7µßŚĄ×Gůk·ť.žŰńă=oŐŘő›šĚÓ«~}˙»§ç®ŞĂŁíݱ%÷–ëýçŻykMţu¨:˝±ęô†=äťPt8AŃŐ1}ĽŮd-žŐ-„Ń ÔÝmG€µ}ł¨ŔëžŢ¸ŘűÇ©ŮČ-ÝxďIVmI]e_?çcÂ_n·żF»>sÎ˙–•?86ăó˛/çÜű{ÔĽĺ/˙k řÍ˙¦âUżż~áď˝/ú¶’č Ů%µŮá®AÝşÂô(¨»‡śˇ Ç:ŰűűŤUĄwďřŔ„ż¬rÎxâË`ěĂsďřĺ‡|‹ó—?ăÁŞÓ«n©Hí7#őŹź‡dWH7AAD4]u„Ťš·;B5jNš& ľş˙5†]żyĎs RWÜ0őËŠĄ;LS'&đźżć­×JOVíť3áË3!™Ržć‘!‚ ‚hşę¸Îý'Ž;đ"Ú€Kă(˝ü±=á­źc†ĐÂő‚9nŘ'÷'„®=o(!)´g@Ňą»0nŘ'÷㙹压ÚM•Ł7Ů–łçdzFNO{mŽľÔăn×?®úőň»öĐŻX9lA…ĐIú‰h(GÂTCő¤~ÂŔČéiŻMntô`öśaŮhrËaŞľk lWaCňuîĎ3†ä‰u Ő7Ř;šV•?±ë@żbQÂGKĘ—™čW̉ ›öCň–EĂŽĎ=TjŞ˙ĂlÇA? ż«ÁÄ@6켶ę˛Ř4eÝ©Őâ÷¸qƉgچúăwőwzYČžă•_óÓ‘dj¬NLćuË´!\‰&ÓďŁâĆŇţ Oݦą©ű^×ÂŽA?1±q}›Ľ‰^[i‰ZwęÁbŔžCϤe¬W˙XM«Ű×—úÔĘŚ§\ß¶kÚŚKȨknČg¤ĹŤŮi Ő•‡ß°Gż `Ô݉â5·>Ó‘ě˙ôĆ;żó<ŐÂľ6ĎÓ‚‹ĚmkĽJ´_[Paë2}ޢ¸ő¡hHŢ’›ĽµHŚ?ą¤ü1!\r“·5ć- ^Ř^/üHpÍűĺŁWŻĆ űäNý2×µă†}r[ňČ=ü‘Ó u «ˇ_áa|•íXBzBőÁĆĚq(Ý š¶BżBŁŞö‚ É[&7>3·˛Čž3¬ ‡b„‘đô"|ä·v ŐĆ/ÖęŽŔ»Ě× Ą=6ť’Ínvŕ} Ĺ?íÖ§ZÇŞXľ"Lľë a? 5Řtî6¸†BËŢcÜtş…â˝·q<şMŠ÷ř•ŕr§45”ßo ŤŕR×ÔĘ'Ážů=c$Ä˙Ą˙<ő@nňČb[ąPşŞĽŔ¸aź¬j‹„ó¶éĐÄ®«ö4”ßźŤĆ‰ e{CŔöD—•/~ĹĘ´K:ńüq9Oý­őűB %’Ë9\â“‘đÔĘŚ§lż†ˇ u [M€x™09nÉu§~·Çž˛(!űźM¨;µÚáUqs%6ŤśkkšNy”čq:’=ŤăPŮAĂ@Ч±ěźMÜ©GM|r]ăíŞÚ 25VcŔS+‡aîˇŇUm»ţE‰řh{ăÝąÉ[5>\ńÝřŢ)mę2ÍJ;lâ}­aÇŰ‚Gź’đ>Ľ¶Č%hŢOںס‚¤s·ĂT˙QݰŔřr â“ëšąÇCô+VN:^*Ą' HŚsx“)f#x«;éáÄTý»ĎŇňŇÍżçĐč=ú+˛˙© ç|ăçâŞ/;h8N?±®a™Ć6~6ě±Ô—šŮß%Á~Š[~·óÔ kí2ŰS ›ärŽ.ózXm[p—-~ Üńáo+đ|č,2űëŻIlZmŞ˙(ŃÝŐ•Ő@˛ßŞÖ?6W|;›ńT7ţ±®aë¦ę­H{mNăčUőmn|A›¶ đ†Ňľš´bÁ˝O—4iu§žů,á)ńˇ…˙:tĽ†ÁAŔĂ] ˘ĂÔ—Lx`z<`{Sc‹an!›;ąľě`Bć8@hâşFĎë !y‹ŰÝ1~ę qĺŻ—Źž[>znůč×Ü Źôeş0ő«·ăîEĂ˛íżłç8—ŰĘM&LvňB Cň–9v—d«ĘT}×ëxjĄłJĄ•Ťwß? ş˛µ jŻ {#§[`‹úĚM'k´ÎACňźíă+ż»ŠuµŕąÖŰB[ë U"<®-DhĐŻX4 úýę¦ĆęÄyă´3ŤLOp°ˇÔ%Ź-Ĺ#źÝK=2=ˇ•k…7ZĆT4ŕ6Cňgőиő3d¦ádŤ[N É+¦ÇőŹÍÝ˙V]ü@C[ëIŘtč­Äˇ[Ämş}Ťß†­ľˇ´jÓÔXť0Őŕ;ʇŹ>…öphSĺ3¬5:r v:śäuî6”®Ú?°`Ô'“!BéK ~A®›[¨tŐáĚ•źÜ á™ą^źŐ§' @ÜÝ‹lÓ§6.ŻiöPĚFp9°©ňA¤˝ćx±uđđhÄ?ŕŚ!vH÷Úʸg–4ą…Łé­×]ÝĚőŹ˝žđÉm~Ë3Ő”8ę“•Cm›/©<€d6÷z°oÚk+Ó µ§ˇü~”9ŹŔ7ěÖ8" ^[9 üőňÇÎŕµEÎ/–™żç †ŻüžçéöýwU¸lî˝ÖË‚˙ë€wV÷ő˛ą ×"8O®&űř őŹ-‰ß˛Ht˘ýë·Šz.yž™[ďö°©z}]†Čę`CŰßz×{`jDbÂGŤśAĆ M«}UŐYŤF,·-śÚľ˙®n~}h\Vtřš•Ł¶`˙úşQmnü6v™ö Ą=6ë{=á“Ewkćń¶ŕ٧Ťđq”®:śŮjktô@  }+cúÄ]Ił †šM°B3NE:ÔCm8ÔV‘ő` îl‚—ęqr.Ńl‚AA$ť ‚ ‚ " H:AAD@t&‚ ‚ € éLAAAÓE0ëç\î*‚z0ҡ j«Ŕˇ¶Št¨»7$ť##F„» Dű9xđ ő`DC=8ÔVCméP†‘V‡Ąë(` ‚ ‚ ‚¤3AAADälĚHí×Y¦h®D‚ ‚ nĂĆwÖ»“Î3RűqÎ;ËcŚÔ3AA´Â‰u·ĎÁŞ÷I Ł…Î2Ňé"Íůč“RCPJ$lÝĽłó(,,ěDvř)[ŔcŚÝľî€ëng®,(sć` ĘĽ7wŮŕöu'<¶×Ú€člý#ZüÄşŰE_ ś=˛ Ěłwo_W¶îv{×Ű2ßľ`{&ćš­ô¸Ă¦ç¦nµ:±îvŹlľ7ě)”-pî±KŹÚN!żç ? öü˝ćĆZďŰX‡€lÁÁőt+[Ň÷¸íŁ+ÜIÝęĐÍű’s^_[ŕßv—IŇŮ•˛Žîę˛, FÎ9çâ±3ĺ‘÷¸ăššR¶Ŕ–ăřÚYާωŞF[öłć¬;L]{\$_{đ٦BΉu·;zsnÄ»e9RyďřÚ©S×çË2áŇ;Ž>źúÄŇ9.ý”:÷=[÷Mµgţ˙ě˝oh[W¶đ˝ôRxćŽa†ÖˇŤFɱ]ląŃ˝0ćĹta0“XdÚ>a ‘Ü^ŰĎL‘&`|§Ę\Č•BHď8~­€†Üö6Hé`¤6:Âş3Ĺ<¸pŁÄJhěc«Î[Ş ž/SĐűáüŰ珎ŽdY˛¤őĂM­}Ö^{ź˝ÎÚgťµ·Ž‰”ăďş·‹gYĐÖ)^îh‡źjČ ŃU®v5 î!ĘXĹ€ »L&GHüĚ, ĺ]¨„Ş4hČ«ýTV_yT­ˇÜ>¨t˛a—pĄ&ÁŃjOFő‚ »ÁůkŃZ‰é1y'uÔ)tűĐě>ű—ož˝z¬Ç࿷ҡ3Ă0188X2Ěrfq»Č¤Ę†o„|W=ěrČ7BPCng櫣B}ĘęThČ&l]T»‹(aWŁ@ZP˛FX§®ÚĽsŚayѨZŁş„—-±3›ĺ"gc›Ę/l/JŢ#Ť+çBL TjĐ’×ńSŤŁj ĺöA­“Í&x @ŹřYµ¤Ę°aWGÔ˝Í?ů*—ذË“ ę#µöŠMG«č…:Ľ eřž*–4¤ĺú©<âcüŞŐ2E´ôëťőáCyâbJ㼲s.y ąŇĄ‡TŇ@ôY-ĺBąh^á‘>ąń¸ůŐc=·Ňˇ3Ă0P(TňoÂ,‡Ţmźa漰8E“ET—Mç†'¦E•ŽŚBReŘŐhąO'’Á‰9‹&A3“¨†ń…ŠËES'łrZąŠ—łâ;m¬bKÂÝY–GéB}TŁ–ýT»YŐQµ†rű é#nĘŞ}#Ő$:AÄÍ@®(&…Gĺ„7;•řB\d¦*1T‹ŁŘtT‰NĆßáĺW-Äç1^&H«5°á Ahé×9ëÚŔ;ťÖy%2Öynś€_1†NZ :đ©±á!§•R+fv5jóq« l8IuW…n(íU0ë,1j=ÎmJ6™L4M iL&ĹżL*Eę˙[ç“9,|IiI†ř”3ĄYG|^$˘ĆßuĎ{(Żą«V†‘*Sn|Iî‘ öaĐSFw×ĐÁBˇP(Ś,KĎ[jťbL|Ă*Ý»é_h™öEFČ>¬ŘŠp7¸‘ĺ*çd?-űč[¤Űî(oÝ/.H6 p/Ę÷ć·#Ä?Ĺ8…䆸ˇ.1RKDs:Ş@'ű"ăT%^Č…ŞË!nS Ňě‹ „âµĆ=é%Ľ٫⳨NĘ=뚡y^NţY—r;Y–:jČí -3p€S&dţ)LC9=âËĽ`ÍÚF¦¬n‚·uQÚ]’Ű놪\j—u6UŻÓ‡Á¨ő¸ńMĚšń´âßzźĐ!#_…ŐH97ťY)â±Umżf¤Snv )ŞË–6T•gŢť[5,O …¤/Td/#o/:e=âËĽ`VŁ6>r6\±eQíl|Đ(2ů"~ŞTÝb}ë'ŽíEgK/)Ô§{Č”ľ2ŔoŢçqKRV-ÓQe=)ˇ{˘'čeߣŕżć‘”¶ţëöáŕ=¬:˘Ó©Ď«<=ežšŘ\ńDe…,Ë,g¬5äÎ,3l–źŕőşŞ˛W˝9ä¬s h”¬3Đôŕ MÓâďŇż4MÓ4'Y(E]Ďă GÄőr­M–rćS…  6ě*v?nő5÷@O-‚—ř:ăŻ|˘(í,TSL^ĺQµ†rű 33°á oéÍîH5 <ó‹áű]Bz’]Ť–ps’2jžŽJę$˘pm…Ţgč`a{Ń™y]¶„Ć×7¸yĹĐhT6V‡ăďđÚ®z(JűĽ8ŘŐhÂ7B2|‰Bî §¦ĄśrĂŤ÷Ô–—ÁJÉ$µú*·[n?Şîu–Qŕ˛ă&L&“PÂ}*đO­‹´†Úuó_ď`ò”3L‚[u±%UOąěj4AlYuÍe‰˝Îlé5÷ZŔ}Ä!lvŔ äb?Æ]ŢDÂŰÁE9äöbĺf:ô•joČ-¶&.îëč¤Ű‹‡XHŹř€ËŤWljذËÄŰČäg€ę… éű ZZ^é§ňaUUk(·-ňŻ-“ďŔEĘOÚĽ®Őˇ«6ŢY›ŃL*ĺ)«–ötT‰N:ä…4dÔ$źáf%~úP_îśŢŁQćY’÷ܰňďHŃ:/rOE&e4\ő §¦Ąśę‚˙,LuA(c˘ŠtUę†Â^e÷ŁęÔfŻł Ţřâ{Ż˙Ă~rěŰü_żúÝßĹL2ĺ~çŁđC¸ ôŕ ż×˘`‚Bˇ`"âi.nNĄš¦Kć•M&SˇPHĄRÜ›:ŽÂ9ţđ[…!™djôçď+LËĆ>˝ë~çÇŹŰl­óę‚&$“É ´ qp¬ŚcŐč ëKYŃó«ÇzbźŢ-n‘…ŻŤ˝űy`Óđ·?7LÖ™Ď7 \»vMĚ=Cˇ`25˙fAA¤ř† =ąsšv3‚ ‚ RšÚěu~ĄŠ=>\ Yâą ĽÄħ›Ĺ¤ł©HţckAAfłÎr¸€X ˙ ‚ ‚ M ľaCF Ü_BRÎÜ‹5Śü ‚ ‚ MLm˛ÎŤłaţWIŰ3¸Íš[5šxźF&“©wltĐ‚ĆÁ±2ŽU٬6›­ŃsĂ…ÎůGYd\2Jľf2q5Ádb@Lc7&ŻĽŢYď. •óÝ×[hÁ†-h+ăŕX5:hÁ:‚{ťř |f9ŔýϤ…fýkDů5Aĺ!őAA©%ř† 4M3 Ł(ăţG&›S©”řą|¨ĘI_»v ŁgAA&÷:óIJ/iëq1›\PüÍ@  ŢËa2™7#‚ ‚4eeť+ŽžcĂF,ű’űsŮ…BaEúY˙5šq3‚ ‚ FÉEĆĎGöꫡZJŽ GdxÜë¬=s…[ń·¸?üđĂ?üŚ›S©T*•"•4[Ö9=ÝŰŢÖŰŢ6~öîźá>ň?5€µ ˙qz]]=„9 ¤NAr(F[1Jš^'ŚŐŰŢÖŰ~&–ŽŚ“†ËEĆĎOĎ·É®RT/˘Sú5‹˝ÚŤťWŻŘ*¬Ąń=Nt]ÔÓ Čkú©ĆQu‹eÎRI«™ň@ş[zş·˝-®UÓ8ůWůĽZ;óíÎĚÓ ŕ{ť•IJ/M&# –kľżůÚµk&“©P(ߤiš¦i.zćôp:kx‡Izş÷,Dňű›ůý… 'Ŕ|áŃf~źű‰LýÍ“ë'<ÜßĚďŻÜz2¦ž wžu?ääÝ—ËÁŢý3˘ÎÍü~âÍírőĄôh[Ć6îŘwVň×űŔqgEŢĚ?= ŕ¸ÔýŮ/‰ŕ¦ç˝ű›ůýMľ–tmŔZ°oÉą!XüËĐÖ)”lśKôMŻ€ĹᄥĎů0:™€soź4V±Ř»¦·ÝyOüśŽďS›łOC±”đA• y•źĘPUk(sŘŤ]®“‡§f®`Z«Nä"ăgźĚněűíµh '˙j"M†wžź­Sô,öá!Ś5urłÎIJ/b!ůn ń;‚\ľYÜńLĐâ/Í7¬Ż<™Ý¸ŢŻy,Y»4~a'5wiĐ`Ůé€ÝĎ?Rg ~¤ Te´{ŢűŐ©™°ńüĐ)‹…űeŔ(!kéěć;ńöiH¤vvžÁi‡ŮhĹćÇ|áŃćĆ)¶‘|jg+yĘbY+áJ ZňJ?•Ł<ŞÖPŞ:úOöÔ$lCTä"ă}KÎŤGŁŮŠâ™XŽĎLÇD^S]b¤–DŃéčó tŠ)ĎľÉ42Óëj d á[ôHOs%Ĺű Ą_ď¬ËŘÂĆťç;ŻgźW-ń‘©âRC*i`w]L>Ű+˘\(ç’»±óÂ!##|4"ňZfťµßćv4áö=‹QoA .ß ňŤÎd-h¦|3ŔZjne¦OŰgÖĂ“pëźeqĄł›sM¸T"$I1´B™\ůŁťś×ŕÄ9Ë~=Nc÷Á©ŰcŠĄXMťéř=G%›©Sé/w`}ĺv7uÂxĹ–d7vľ­·=>ż^†ŞQËs~ZěšQUk02XNŚ>đmqsKß’óćX ›˛^,¸ČŇ£rrrk+ątŹ‹ĚT%†jq›Ž*Ńąě›ä×1ÄgB^ćzżZC.¸|ŠËvGŢz¶kÁľgăâú•¸č‘‹Śź…HţѨE§ZúuÎş6đN§u^É'ť7ąĺ ą":ičŔ§¶w?tĎŃcV+f˝ÔR÷¤Ň°łś¤ş«B7”öŞ?‡žu64\ÖYćKťąłÉdR§ś›šKiIXçSÎ'4ëϋĦɵ xlé§ć”;Úä‰R@Óﲥčěoć÷7‡ăŇ^FµN1&ţ¨gElĹîş8_‡ÝÜS>i´b+rbôÁţfŢ•ŞňFaÂOË>Zž~aÇć¬cĄś5 ¤J$ÁyKľUFĚž˝ ÜşăÎ{ś'Š+ę#µD4§Ł tć¶ž‹%j=j –În¸=Ö>˝ÎĄşs[Ďáö´ćžô’“Ă}ĎĆĹgQť>”{Ö5CóĽüł®yđś=ůlŹ:óŕ9ű\|pj„<üŮą•cf ĺSOr9ŘűňÔ §çůĘä¶žżŐiÖîŞĐÂ^‡ îďž<ţĎ»@ #f‰ţŔfî|oďežÝxÔ°»2 ·6‰Żz$Rím˝—"yeĐł—ZJĂJşŻmě·6.Ü÷S0#8ÔŇűŁ]ÔĐ ’×đÓA˘şú¨JCŮóŔĆťń>N^ś[ÚsbôAb«˝wüÖćř[˝ś»Ů§.ͤZĆĆßj3^K{:ŞDç€˙aĽ·ŻmFSF­ÁŇ —ąŘom.XN€tů8î¬Üä«ö©’ŁQćYŇô8<»±?j€żúĽD1Çť•@Č\Šä ·%é<č© (•€Ą’ŕĽyĚÜű¬gĄXWĄn(ěUv?ŞNm˛Î&xă‹ď˝ţýü¤ýŰü_żúÝßĹL2ĺ~çF 7ą|łř î•Gü}?üVaH&™ýůű Ór…±OďşßůŕńăÇŻĽŢYóž"U㻯·Đ‚ ZĐ88VĆÁ±jtĐ‚uÄúÚ÷ËŠž_=Öűôn±p‹,|mě ŘĎĂNö˙Ü„Yg.D•˙íîŁ7#‚ ‚ ¤6Yç& ť90VFAiĘĘ7W=7ç×AA–ß°Q„˝Of˝ź|Sď^ ‚ ‚ G‡yŻóW+Ţ㣄ÂĆhQcnAA&Ą5ö:ď­}§á˙˝÷îpYůĘüîĚb™mUPĺhóÝ×[Ą…# Z°ŃA ÇĘ88VŤZ°^ĽjłŐ z®sčüÍźţÎű·úţé«a÷Ź`ď“Ůż´Ŕügi€Óż9fV—ŔŢ'łÂű‹ď?F¬îĎ€?ęÚ}ob†zbőăaóW+^ů" Ö+?ľ8Ďß|ńÝc{źĚ]ů`â·Ů9µ÷Éě‡đv÷•ů{BýđMTĐcż9żřî±šŽŠQl6[˝»€TN&“A 64hAăŕXÇŞŃA Ö‘VŘëüŐ'ŕíźüč=ńEbŤßJ‘Ţ4_{ËľŚý~âł_üëÍBĂŠ× ż0™Jű IDATç˙ňöX?sĚ˙!îß÷Î˙Ç~4|íćŹí7çł/gţ×›đÇČĐËď_Ʋ/çg7óoH_ŮŁ…&î~ňÍŢ'wgz›}Ëľüm÷—ůšŽ ‚ ‚ R6-°×yoísřŮ?™ú‡N§˙đß{`˙Ů?qyĺţˇÓ°ů˙íi•Č4Ü”ýyĘ˝Of­ÇG­ÇG1Ďw4v6ďíäě|•c?ůŮŹď­>ˇĚoţĚ'-0˙ëż>8őë9UíóFAAŞKógťżůÓľH_™°µş?ćó?}uPŤ{źĚýáíŐ—±ěËŘęÍW®č§cŮ—±ěĐ˙µµ*ňÜ‚ ‚ Č‘ŁéłÎ_ýw‚9-ěµýžŘłÁ±ľú™o.Vbx®Ä׉Aŕ›?ýá ±0Mlş0ź´¤ů*ßüé_\ŇH*ď}‰~đÓ±ěú„]žçFA »\a¶Ţ˝h~>Îh)hţ¬łbŻ…¸gĎCýü–ű~žşDâGĂ×nć~q|Ôz|Ôz<˛÷îŮn^řîV/źu6ż{öâüo¬Çg˙ăKřéŘ*_eb¦÷·żţ©FßĚ'a¦Ôz|ÔÚ˙ąóßĘ{őGaü&“Éd2qîÆ]&?#IüŚş:QÁfőµ* ŐF´7⊩P˛źQZ×fÂ.ÁôĽ°Ëď— ™H(aqQ§˛Ş¬WlŘĄ+^±U`üŇĺ]H×ő4ň «)(z”Ô©/_Yź+ŁéĆJ’©ŇeŻ?W-ÉŔ :Mc Grî¤Ő2z#P»¬sÁT˝^ÇüîŚ,ţéXöăa3€ýć<—‡Î ›Ś%\E±şůÝ™¬ô5ÁSżćźůőżúąB©DŞB(”őŠŰ°ń2–}9ăţQ ĺ0~“’…BˇP{( <ń‚@ŇN+Ĺřy‰íĹŚCí>lÖ–äĹmމ0 ŕ\Üć ¶3Žfw¸zÆ]˘ …B–…ĺ‰o/:ť‹Ű… „uD›;}¶čq˲NĹyó9aîÚĆßuo ϲ ­SĽÜŃ?Ô˘«\+ějÜC”±Š-v™LŽř™Y,ş˝ąfˇ„Ş4hČ«ýTV_㨲WúňĘ>ła—p]&ÁQ˝¨9ÇjBđ)­+„ś‡oČuRž8áŇe+¬ŞAÚ«&ć(ÜIŰčG†CÎ:óárÝ˙$ RĺĚâvÖ<Ɔo„|W=ěrČ7BPCng櫣B}ĘꔢWF3ŽŮ9Ť o°ËűMüę“+ĚŞâ’ŚnšQ4¨"YN6!6.aĂŢDÂۡ\°’ŞłűĐRwRŤŠěśK^B®4‚Ň.š«&«•]R.”‹k(¡â—GŐZHÓďuÖB™ŠÖ*A4`–C o‡¶Ď0s^Xś˘É"ŞË¦s S‰Ć« „]Ť*n˝%‘ NĚYt0 š:5ô/äP\.š:9ĺÓĘuPĽĺßic[îβ´üĹ©9ćë<—›ďDĆßÁş´BŘĺŔF—+Ľ†]ŤÚ|ܢ'›…R—‡ň¨?;ש2>i匝ř”3ĄYG|^$˘Ć_ĹI1Nąń%ąG‚XĄ§Ś®ĐÁBˇP(Ś,KĎ[jťâmű†u[l…ń…–`_d„|¤ÁŠ­wY®rNFßOËőb…<Ůg:¸íŽň¶ěđ–ű€WŤ>V⦑íEg˘śő]Č˝O\ŕâTäB©ÜâźtDuţ[đÍŽ¨{;îˇŘ9D sOŠ&¨.„¸˝Ę%*ÍęBĎ‹öˇĹŃsţyŚr;Y–}‘r;CË Čír@Ł+•Ó#ľĚ جmdĘšá&x[W‰ËCç¨-™uFŽ|uS#ĺ 싌ÓJŹ­BlĂř‹E:BäP şl ańAUyćÝŃąUĂňt°PHúBŞ­ŐÜm{{Ń)KăŃ#ľĚ f5jă#gĂ[Ő^‡rJ&_ÜOK5./ôYś&¶ťµv¬VĂ7řĽđálq+–}gĂ.ń{ Ĺv›±¸x˛ď*h@Ü6ůś­Ą°huD@Ľ88h7ş Ę Y–YÎX)jČťYfŘ,?ÁëuU÷¨uFŚCŹë3äŇż,ļ́ "lŘUô.Âř;Ľ¶bąk¤ ĐS‹ŕ%ľNÇř+ź†(ĎUđzúBÂ66ˇ ĺ‰'ü~ =bó:Ľ:‘s±Š-ö Á·mEËĄť…jŠÉËý”Ô çņäU}&ŞMxËÚ×PÍ0VC]61×\Á¬’čě}–ěj´„㫡n?U:XŘ^S3\o¤:Â#ÜIuŤ]Ť&|#4!Ă—(äŞdtQ95ä†72î! ¨!7,/•*e_Í Ł®`Ö)iUµ#ęćżmƆ'd)g:·ębKŞžrŮŐh‚زęšËźnX·1™p¸py*‡°aŘ#4{ý vup_Íń3 ß^¬\ŕ¦I_©ö†Übkâ´ŽN:¸˝q…ôąÜxŦ† »LĽŤL~¨.·©B2îˇJř ZZ^é§ňaŐ<ŞĐ©/Żîłđ6~ĄÇŞřXń׺0ZUš2J(ˇe_Vă\ ţđ[…!™djôçď+LËĆ>˝ë~çÇŹŰl­óę‚&$“É ´ qp¬ŚcŐč ëKYŃó«ÇzbźŢ-n‘…ŻŤ˝ű†ť5Ř˙3fťAA†÷:#‚ ‚ !pŻ3‚ ‚ ‚łÎ‚ ‚ bĚ:#‚ ‚ !j“u~ĄŠ=FjL&“©wltĐ‚ĆÁ±2ŽU٬6›­Ń3†Î Ě+ŻwÖ» Hĺ|÷őZ°ˇA ÇĘ88VŤZ°Žŕ^gAA1îuFAAC`ÖAAA YgAAŽąČřůČ^}5TKÉä oăS»¬ł©P¨^·‘ú‘žîmoëmożż {÷ĎpůźŔŔZ˙8˝®®ž‹Ś Âă÷wÉŹ˝ím˝ígbąšźQ«!X·—b*”,2˝®¶N:2.ž>?<ß&»H0`ń4Y"\˛^íĆÎ+ÄŠWlÖ‚ŇřÇ9 ”đA= ‚ĽÂj 4ŽŞ[Ôďň¨ÖL‚Ô ŇÝŇÓ˝ímÁt­šVLGHeČçŐÚ™ŻhtfžfŕłÎ|´ŚYçf!=Ý{"ůýÍüţÂ…`ľđh3żĎýD¦ŔţćÉő€îoć÷Wn=SO…;Ďşrň‰îËżŚí8î¬6óŹF-u8­ÖaďţŃ‚›ůýÄ•śelaăŽÝqg%˝TÖ9 ŕ¸ÔýŮ/‰8µç˝ű›ůýMľ–tmŔZ°oÉą!XüËĐÖ)”lśKôMŻ€ĹᄥĎů0:™€soź4V±Ř»¦·ÝyOüśŽďS›łOC±”đA• y…ź*KTGŐtű°;ĎÝ|cç#{Z3Iő 1L.2~öÉěĆľß^‹ÖJOGq¤ÉđÎółuŠžĹ>~ݬŕ^g¤ ÖWžĚn\ď×<–‹,Ě]ż°“š»4h0žł?ÝR:Źýş0)źětf_ v?˙ H öŠXSŹž÷~uj&l ‰Ô.ŔÎ38í0­Řü/<Úܸ#Ĺ6’Oíl%OY,k%|P©AK^ßO•GŐôű°ł•䏂Ýu1ůLv”źINRcr‘ńľ%çźż ÖÎÄr|f: ňšę#µ$ŠNGźW SLyöM¦”™^Wk K¸OĘĘׯŇÓ\Iń>hé×;ëĂÇ2¶°qçůGĹÎëŮÇçUK|d޸ÔĐĘ@~­Ą\(ç’»±óÂ!##|4"rÜëŚg-5·2Ó§í3ëáI¸őϲ8ĚŇŮ­¸)’©Äää°¸Ęs4Ľ˘iÉ%I15†¦uě×#ŕ4v?śş=¦XŠŐ±x:~ĎŃĂEÉfęTúËX_ąÝMť0^±%ŮŤťoëmŹ毗ájÔňśź»fÔGŐ´űđ$Ç߆Ov:Äß4g¤,¸Ču€‡ÂŁrrrk+ątŹ‹ĚT%†jq›Ž*Ńąě›äWBÄgB^ćzżZC.¸|ŠËvGŢz¶kÁľgăâúŐˇ“ąČřYäŤZtú Ą_ç¬kďtZç•|Ňy“[‚™+˛ˇ“|j{÷C÷=fµra6ŘK-uOA* ;[ŔIŞ»*tCiŻúYg¤,.E¤%!b}\7Q$>/›&ׂ}KΛcfŻÂ?káč§&”_±NżGČj”˘?°ż™ßߎK{Ő:ĹřŁž±»ëâ\|vsO… ĄÁЭȉŃű›yWŞĘ{ľ ?-ű¨ţŤs ţ!Ľw†Śź0ĺ\/’ŕĽujćŠÖ×ÎŢnÝŔqç=ÎOöđ᩺ÄH-Í騝ą­çb‰ZŹZĄłnʵOŻs©îÜÖs¸=&&­ą'˝ääpßłqńYT§ĺžuÍĐŰ#†Î_‡śš0!vnĺÁYCůŔŕÔ“\öľ<5čéyľ˛ą­çoušµ»*4¤°×!›0ëŚT„Ĺá$rEÚ‰˘ÜÖsGŹ™xl¶Ŕ®ŰCť¸­ąćX:»“Â⪠ś^ú8eXŢ~}3ź¸8Wd/#oܱËŇ“SOrédâ-WŃąR»bË208µ˛µC>h™Ľľź9ŞnQł–±á!ÜNĹ”sÝpś{űÂő•ÓKĂÜó-żyCžÇ-IYµ NG•ő¤„†ž{Ô6ČľGÁÍ#"faőűpđVŃéÔçUžž2OMl®x"Ăü&lí¬Ąžö-çÓřúÎłîáY]Ť®ŞěUo0ëŚg`pęö—9&×Úd‰˘Á©Ű)nZj)ýV§Ňr‘qŚ›ëĆŔ{·`†ř:Ýz ňiČ|Á—'KěÚČEĆĹ­%Ă8ËŘÂC#fĆţáS3g'ů‰µśŠ-ĹŢýi!ÓĽ–šî<©ĺŇÎB5Ĺäĺ~JjPUk0؇ÝŘ•Ii#;¦śëŤůÂżĎ>uňËBzr/µTĆfÝ2jžŽJę$˘pm…†\$x`Ŕźßśu<ÉAgwrňcU5ó…G06•ŤŐa±ě›ěţŐ٢}^{©Ąô”«źáKr95-ĺćÁsđQčůi‡NĽ}R+ĐyR&©Â^GŕeJµÉ:żRĹŹ˙óî?ľó>ů;YR™¶h8‚ô6sç{{/ŔđěĆŁ~ţćwk“řŞG"ŐŢÖ p)’W={©Ą4¬¤űÚfŔ>u ’·‡Ű'…ăĂłU&ć ŹVŕĚp{˙y*± [ ÉIÁ—"= }“i€áög‘ŤŔđěĂs„˛˙ĂK÷>ŇmĎâp>íímŞo<2CDO§ýúĘ­3ĂígřËŔîş0(ć:ŚWljöîźľĽĂí“îű)ęâĂýQ €®jhPÉ+ýôÖć Q]}TĄA€ôtďŮŰ|]>VVÎ$H=81ú ±ŐŢ;~ksü­^ÎÝěS—ŚfR-căoµŻĄ=U˘sŔ˙0ŢŰ×6Ł)ŁÖ`é„ËÜŤ ě·6,'`ăÎxwą8î¬Üä«ö©’ŁQćYŇô8<»±?j€żúĽD1Çť•@Č\Šä ·%é<č© (•€Ą’ŕĽyĚÜű¬gĄXWĄn(ěUv?ŞNm˛Î&xă‹ď˝ţ?řɱoóýęw0É”űťbŮ—Ő8—ňř?ďďrżDWýH…Î?üVaH&™ýůű Ór…±OďşßůŕńăÇŻĽŢYóž"U㻯·Đ‚ ZĐ88VĆÁ±jtĐ‚uÄúÚ÷ËŠž_=Öűôn±p‹,|mě ŘĎĂNö˙Ü06yb.†ć~á~×ůEü]-Póó@AAŞîuV˘NsÁ´X®Ţ†ˇH0‹˙’AAFß°qPÄ ‚ ‚ HsS›¬sc|M°ęÝĎ@î7Š´˙€@ŕlćFAABYY犣çĆťŐ{0ČMJ™BÁ¨^“éH}YAA© Ě:óĽúős U0™Ż3GŠďľŢ*-„aĐ‚ŤZĐ88VĆÁ±jtĐ‚őâU› łÎy˝[úP2Łl2 gťM dŰl¶zw©śL&lhĐ‚ĆÁ±2ŽU٬#ućłÎF3Ę×®ńb~XP|TBAAš€Úěun€7lüĺőnî Ąk}řˇL ůQqAAitj—u.í} ˛¬3@*•â~'·AsŰ0„wiđ§F~_ ‚ ‚4uć!łÎ4=¨ń{ˇ`ôwk ‚ HIذËfëÝ‹ćçŕ㌖ük‚"Ż~ýśűK&Ąń»ÉdôŕÚµkµ=‰šŔřM&“Édâ܇ »L$~F’0ůmlŘ%ÔGjŹhÎDŠ©P˛¨źQZ×fä¦cĂ.—ß/2)lK(q…YŐĂëTV•őŠ »bĹ+¶ Ś_:c¢ĽĎ•ôÁby…Ő=JęÔoQ9“ÓPÍ7VFú\rŻT*­ Z’)<@'ušĆŽDß‚učC}şP3đŻ ň(˛ÎŠßKn&÷CÓŃަR6Śßä€dˇP(â (O\<夜VŠńóŰ‹‡¦ű°«Qđů şĘÖ´ďp“›`ÁBˇ„eF!AyâŰ‹Nçâv!H€sq[ş¨ă ŔéłE'[–uŠ»řZҵŚż#ęćU$mY´u %Űîh‡źjČ-^!ějÜC”±Š-v™LŽř™Y,ş˝ąfˇ¤*4hČłY[R°šwBˇhUöŞDź•3II •Ń”cUzŽ­É•¸! n`ذËűMüę“+ĚŞč’Śnš‘ń%˛,őŐĄŞr6<áM$ĽĘ+©:k°-剋Ď?ŠAČÎąä%äJ#(í˘ąj˛Z‰Ń%ĺB9˙čv ‡Š_çQW0ëĚó—×»iš†đ?ţG?m\ŕ޶AV‘óŹďĽ˙ŹďĽ/{itĂ,‡Ţmźa漰8E“ET—Ťs| ‘ńaě\kŘŐhB dŤ!śłč` f»č_ȡ¸\4ur0Ë!§•ë xů0Ë!ľÓĆ*¶$Üťey¤ ŹGµ}°8jy1ĺŻÝ¬îѢčÍ$‡OŤUą}ÖAlÄ‘á'ň„7;R(Ł$­1&…‡g^¦PHúB7´c6|#ä´RŔř;˛WĹ5".˙®h‚ Oxů}Ň–eňĚókYq«Q]čyÉ>´ü…ˇ9ćë<—›ďDĆßÁş´AŘĺŔF—+®Xv5jóq‹žlJ]Ę Łţ`Ö™gÔz ×®88 3p%…BÄč: Óę-Ô ŽOZí$c'>ĺLiÖź]aVş`ě\ĘŤ/É=Äň(=ĄZŐ-, …ÂȲtçWëoŰ7¬Űb+ô/´Ěű"ĂçŘŚVlE¸ÜČr•s2Śż#ęž/6°úGő)2“Ô+-Č˝O\ŕâTäB©Ü.Ű-ʨî‚ovDÝŰqĹľČ@ČÁUďđ&¸_ŃŐe·×@ąDĄY]čyŃ>´8ÚcÎ?żQCng"˲/2ÂRCngh™ą]htĄrzÄ—yÁ›µŤLY3Üoë*qyč\ułÎ*żK±rAú!čb¨_ÜŃ$ČW 5RÎŔľČ8­ńŘ÷Pěj4Á{—#;ת«jŰd(ĎĽ;:·jXž I_Hµµš»mo/:e)4zÄ—yÁ¬Fm|äl¸bË"®’ >h™<ă×{"Ń?jCŮs`„¦«rűl¨•"™l6ěż·`d_Ť‹‹ç-ű®‚fÄ=h“ĎŮZ ‹VGÄ ă€vpŁ« ¬e™ĺŚ•˘†Ü™e†ÍňĽ^Wu/Śz€YgF@Фą-\NÚpÍĐŽŽćĘ:Ó#âú ąô/K9ó©B…»M)”B!‰yçCO-‚—ř:ăŻ|˘$pqĽ‘ęăďđÚ®z(ÝAcWŁ ßMČđ% ą*]TN ąáĆŤŚ{jČ ËË`ĄJŮWó¨+uć‰e_‚ €ű€ bŮ—±ěKI. ńK€řŰ'ŠíM–u¦Űîh‡°Ă=˛á YĘ™&ÁÁ­şŘ’ŠGGv5*Ĺ=µ†ű‰C¸J0Bą‡ŘϰaW÷Ő?ňíĹĘn:ô•joČ-¶&.Xëč¤Ű‹‡XHŹř€ËŤWljذËÄŰČäg€ęq›*$ăJ×µ4¨ĺŮŐh‚nŰjUč,Ő˘z&)ˇÇJ«’}®„„b`TPž«6^f"k+kď˘ÚĂÄ7!šG,(ĎU_Ča2ąÂTéę-Žt•ݰň/HŇsrOw5 2—SőŚ.)§ş Áďú§ş ”±QEş*uCuaÔ›ÚdťMđĆ˙ăŤď˙Ď·ŰżÍ˙ő«ßý]<Ŕ$Sîw>Ŧu‚K óŻÂĄâ/>ÍĚ0ŚX…¦iN Ŕ‡N ˙‚â»5ŽBô<řĂo†d’©ŃźżŻ0-Wűô®űť?~lłµÎ« šL&lhĐ‚ĆÁ±2ŽU٬/eEĎŻë‰}z·X¸Eľ6öěça' ű~Ąć'U6\ŚËńÜ+ęÄo  ‚č’đ?ľó>ůń/Őí%‚ ‚ R?j“un€Đ Ł¦ăüg"©LRrײ(ŔĹâb–ú(dťAAPVľąâčąABgŕö7;Z2ć˙ç].iŤ3‚ ‚ HÓ€Yg9€±a+ řŻÉ:“|]ˇş(Ź14‚ ‚ HŁYg9Ő_ @,űrÔt DNzÔz\ü›)€°ZQ#fAA&łÎ&`F|'Ă0@fšU9iŕ˛ÎФ ˛Î™L¦Ţ]@Z°ŃA ÇĘ88VŤZ°^Řl6Ě:ďÖř‹đ‹Č_„ŁŁ&Ůk7xJyMđ†ŤW^ď¬wĘůîë-´`C4Ž•qp¬´`Á¬3OÉWgHŻÝůkžŤýĄŔĆÍ:#‚ ‚ µŰël*ŞÚó*c0´Ťe_ŽZŹ÷·%^Ç ‚ ‚4‡7›ř˙š!ë,˘xëó¨ő8ů'‹YgAAFß°ÁSnhK&››`C3‚ ‚Ô™\dü Ś™ë¨ˇZJŽ GdxźÚěuţŞŘc¤Î¤§{ŰŰzŰŰĆďďŔŢý3ÜGţ'°°ä?NŻ@.2NÓőî?"X·W.2~>˛'•ě5˝.·]oű™X:2.ž>?<ß&»H™Â¶ńű»PD§ô1'j{µ;Ż+^±UX Jă#z瀠ôÁ24ň «)Đ8ŞnQż:-¶š)ʤ»Ą§k:Q+¦#¤2ŽÂ}VÖť™§(+ë\q+Í:ď}2ëýä›z÷˘ž¤§{ĎB$żż™ß_¸pĚmć÷ąźČŘß<ąpÂĂýÍüţĘ­'cÜT踳ÂÉlÜyţĄ!5gďţŃ‚›ůýÄ•śelaăŽÝqg%˝Űĺ÷7óŹFO8.uöK"¸éyďo\» Ě]°ě[rnpŐÝ_Nń 9—č›^‹Ă Kźóat2çŢ>i¬b °w˙Lo»óžř9çěĆÎóG7ÂŘůČěĆ®×ÉĂS3Wp–¨ąČřŮ'łű~{-Z+=!Ć!ďłgë=‹„R1/ IDAT}ŕýşii™¬óŢ'łÖăŁÂODÇA1>.ÎúʓٍëýšÇr‘…ąKăvRs—íćÁsö§[2çŮy–~«łĹzęĘîçźiÁţ@kęŃóŢŻNÍ„Ťç‡NY,Ü/ţŔ@ YK§°qęÄۧ!‘ÚŘy§%.©bócľđhsăŽŰŘŻ ÎÎVň”Ų¦ç´ä%ť';ŞúĘŁj ú}ŘŮJňGÁîş|&;z˛§&a˘"ď[rn<µČVĎÄr|f: ňšę#µ$ŠNGźW SLyöM¦”™^Wk K¸ŻŘ˘Gzš+)Ţ-ýzg}řXĆÄ,•Ćy=űřĽj‰O±P¬;t 2˘_k)ĘądÇněĽbZw„ŹFDŢJYgűÍůěËXöelőfîşŃ3˘ÍZjne¦OŰgÖĂ“pëźeqĄł›sžää0wŃź}2ë)<Éń·á“ťŽ'ąÜ‰Ńľ-nné[rŢlőť”ő`)@ÄÍ@®(>•““[Ă\ÉĄ{\d¦*1T‹ŁŘtT‰Îµ`ß$ż">ň2×űŐr‘ŔĺS\¶;ňÖł=X ö=ׯÄEŹ\dü,DňŹF-:}ĐŇŻsÖµw:­óJ>éĽÉ-ÁĚŮĐI D>µ˝űˇ{ŽłZą0쥖ş§ •€ť-ŕ$Ő]şˇ´Wýi™¬3‰ůÝ™Ő›ą»ź|đMô=!ýŢĘ|µňá•/ŇW&¬ÇgŁ_©ŽŔ—qݬD-#•pŮk)á]D ‘¸‘–„őq>ĺ|B»ąŞŽK±őĄÜř’Ü#A|5¤ßctďM`3żż9—ö2ŞuŠ1ńG=+b+v×Ĺąř:ěćž J[‘Łö7ó®T•7 ŻőYýŁ: ř7Î%ř‡đŢ™ä)‹EÜŕ±9ëX)gM©IpŢ’o•ł€go·nŕ¸óç‰âĘ€şÄH-Í騝ą­çb‰ZŹZĄłnʵOŻs©îÜÖs¸=&&­ĹŚOßłqńYT§ĺžuÍĐŰ#†Î_‡śš0!vnĺÁYCůŔŕÔ“\öľ<5čéyľ˛ą­çoušµ»*4¤°×!›Z)ëLb>iI™8ćţ8ĆĄ˘ß;˙řŃđµ›?¶ßśĎľśq˙Hu ˝iľö2–}9? ó~ňŤZĂŢ'wgz›}Ëľüm÷—yřcdčËł|¶űgźřÉ7JĆÄâp:ÄĽ‘VʸéL>3–›CŞ‹Ął;)l >¨Ş±Ŕ饏S†ĺí×7ó‰‹sEö2r1ńĆ»ěňśz’K'oąŠÎ•Ú[–Á©•­˘@íúČäׂíˇN" )§ČQu‹š}°Ś-ávGŹ9YxĘÝ&OŚ>ŕwl#5Ĺqîí ×WN/ sĎ·üć y·$eŐ28UÖ“üyîQSŘH ű˙5Ź…ŐďĂÁ{XuD§SźWyzĘ<5±ąâ‰ ó›°µł–zÚc¶8śOăë;Ďş‡du5şŞ˛W˝iɬ3‰ţĹ<<ßQć€ŐGí?ű'3Ŕ±źüěÇé/ójóI Ě˙ĆúŻONýú_Nííä`ţ7śŔĐ•/Ň_ć5?ă008u{űB=ąÖ&K9 NÝNqÔRKʝͭľŞ^wŢ»3Ä×éÖ•OCć >¸ =?í0É·OCj:OĘ$5PŘëN^ś[ÚsbôAb«˝wüÖćř[˝ś»Ů§.ͤZĆĆßj3^K{:ŞDç€˙aĽ·ŻmFSF­ÁŇ —ąŘom.XN€tů8î¬Üä«ö©’ŁQćYŇô8<»±?j€żúĽD1Çť•@Č·l‘žÚ€R9X:! Λ'ŔLÁ˝ĎzVŠuUę†Â^e÷ŁęÔ&ël‚7ľřŢë˙đźű6˙ׯ~÷wń“Ląßů Ëzď“Ůá}>„ýcÄę†ßż3K…ßDß›Hül~ńÝc{źĚ}y6ű/§öTGŻÁ]˛dëÇţ׎Z&ţ§1÷ŹľZńţ®ýď˝!7üţĺXżÔ“LŕăáZĹ’?üVaH&™ýůű Ór…±OďşßůŕńăÇŻĽŢYŁţ!‡Ŕw_oˇ´ qp¬ŚcŐč ëőµď—=żz¬'öéÝbáYřÚŘđ·<°˙űůŁ‘uN_™°^zbőĺ°Ţ=Ű}ś+üńʼnsbćwĎ^<ţëüŹg×Ďv÷+ŹŠJě7ç đSĄóIéťřńěúŚůG°zsvčř(WÝ~s~Q!P«ÓGAAFm˛ÎG t6ż;“}W]|ę×/cżÖ)TU+QkËľÓmZ)€ ‚ ‚4eĺ›+ŽžŹđ×AAÄ-˙† AA1F«ľ×AAAʤeö:#•ňÝ×[Ą…# Z°ŃA ÇĘ88VŤZ°^ĽjłŐ zćBgSűŤÔ ›ÍVď. •“ÉdĐ‚ ZĐ88VĆÁ±jtĐ‚u÷:#‚ ‚ !pŻ3‚ ‚ ‚łÎ‚ ‚ bĚ:#‚ R>lŘĺ łFdŚHl®*Ş´`E`Ö)Ćo2™L&wĺła—‰ÄĎHüG•ŚËĺRÔ ‰ń ő”m‘Šq˘-ľL,áuHý›ĐĐÓJcćg”S§48~Feą0v‘Ɔ].ż_.¤UĹhŃ©¬*ëv)ÄŠWlëYĺqĹ˝ ¤A^ßGô<ц’ł„NÇ‘ŞĂŤ>1ćŚßd"CśC‰u›«çťž š k fť‘r`ü&$ …Bˇ÷P@y⤜V e^˘°˝ąfU268·e"lŘĺČ,n‚´F[ŔfmĽć¤Í;!Tóńe…¸‡ĆĎ×Ů^Ě8d7qGHjESOKŔ†]⨠…$,3 Ęß^t:y#H–íŕô٢ä Y§âĽ)ť‚0o/Ćßuo ŁťeA[§x=¸Ł~¨!7DWąVŘŐ(¸‡(c[ĺő¬ň8M/ĐŃ !Żď#ŞŁek(9KX©*Śb§Ď'ÎĹlřFĆéĘ'śąÚPžxˇ°˝č¬Oš´` Á¬3RĚrfq;HkcĂ7Bľ« č  Áf¶.J%3e%J6ěęş·y÷ŇhKŇLY•Î*t0䡨!·3ó‚ĺ¤=q™{—ÖÓ¬°«Q GU‰2°N]µyçĂň˘ ´Fu /["bg6ËEÎĆ*6?ĹŻgÎť´˝ ¸-y}Q=†"łDóÜdëŕqĚś×ćv©J6<áM$Ľ|zQZ1đݬ*V¤„ĘŇŚ:=‘Łh »\á°ßÔŞkhÁÚYgÄ8Ěr(áíĐ^Pe漰8Eóź8‡X)Čb%IFTăČ•˘Dܬߖ”†94]śę˛%˛ň"2=-»U„)%‘Ś@ 1L‚f6S =â 9&ÔÔÉÁ,‡„|Łh@f9ÄwÚXĹ–DŰă yľĽľŹ¨Ź–ˇˇÔ,ÔĘsŐćťcŘđŤĚâÔüČ<ż¦÷@Ř%­[‡ŢěżXâÖ<:˛Wŵ ŠVőŠ÷„D«!ľ3dš´`ÍŔ¬3RÂîĹJ°2QÄ­ľŽ,“)C®łóîEĹşn‘¶¸=óś":(¬ń–żő‚ÔÓ2”_’{$ĺ6zJľÓ¦8Ľ…F–Ąg µN1&ľa•žžč_h™öE†Ďh­ŘŠhy\Đ÷#¤#Sj–@j =â 9:Ľ6°«QĹ“ŤSřČ­.°/2B:ĂÔáM”őäV^O´r¶řSZ°F`Ö©ůJp‘D=â“ÜN[FĚQ9ÝCž ö†UY[Ś_;JR- ł/2zab1=M ŐeKŞĘ3ďŽÎ­–§…BŇRm­ćŕbâíE§lš¦G|™ĚjÔĆGΆ+¶,2Ź(é*dňú>Räh4úŚ)çúBO-:ÁWÜߌ!űNB…éCC=©FCMZ°6`Ö1=­ç€|é_ž(bĂ~ńeŇ"z±d’|ťťňĚ/f®0«Ýv)îÄŚ_Ř›ĹÉđ‰JĐß› ÖÓ*ĐS‹ŕ%žNÄń«ĘsĽŢ„ľv‰-” ă(O< bo=bó:Ľ:‘s±Š-…Ęă´Ľ€ »ŠŽO1yąŹ”GËÖPŢ,Ô Ę/Áp8Ôtżé@uŮĺ|‚ÍjĎ!:=©¬ˇ-X0댔ÜvG;L&“©#ęćżmƆ'd‰"Ş ÄŤĚänśJbŻł "ÔöÄ“6o‡+ĚŞŰbWŁ b»«+ĚeÍ8řĺ[2Hó»pÉ®‹.S˙% ?ŁĄ§e <ńíE~ĚL&“Fh ÷ű6ěâÇĘĎ€|{±r¨č`ŇWŞ˝!·Řš¸pŻŁ“n/fb!=â#óĆ+65ŠëYíqš^ ŁA-Żď#ęŁĺj04K GĘsŐrL®0xćĄÄݱîÄ»b©éUř¦š#łXá®9 !€¬2µÉ:›ŕŤ/ľ÷ú÷đ“öoóýęw0É”űťbŮ—Ő8¤?üVaH&™ýůű Ór…±OďşßůŕńăÇ6[뼺  Éd2hÁ†-h+ăŕX5:hÁúRVôü걞اw‹…[dákcoŔßňŔţěç1ëŚ ‚ ‚4<¸×AAA {ťAAÄuFAAC`ÖAAA Q›¬ó+Uě1Rc2™L˝»€´`Ł4Ž•qp¬´`˝°Ůl5ž1tn`^y˝łŢ]@*绯·Đ‚ ZĐ88VĆÁ±jtĐ‚u÷:#‚ ‚ !pŻ3‚ ‚ ‚łÎ‚ ‚ bĚ:#‚ R>ąČřůČž#’›«Š*„-XuFĘ$=ÝŰŢÖŰŢ6~öîźá>ň?5€µ ěŁJćü™qâc0-÷Ţô4_¨j r±"_bHFěĎô:@‘>·Âńç®Ĺ¤ś^'ł·˝­·ýL,'???<ß&ORT)˘Sú5‹˝ÚŤťWŻŘ*¬ĄńQzśúš7¬A×ô5^VBC…}FÎXÄL¸hë%CśC‰uvcÜÔˇžtz‚h‚¬-uFĘ!=Ý{"ůýÍüţÂ…`ľđh3żĎýD¦ŔţćIHÇá!W˛9ű4Ë©dŢ:Ž;+\ÉĆťçÉ˝îě“ŮŤ}ż]Ł-ŘyÖÍkNt_ţe,gDf7vŢÉ÷ç!ŚťŹěiöąeŘ»F±Íü~âĘ0Ĺ2¶°qÇ’żŢ Y*żż™4zŔq©űł_qjĎ{xSÚaŢkÁľ%ç†`‘/w@[§x=śKôMŻ€ĹᄥĎů0:™€soź4V±Ř»¦·ÝyOü¬ň¸őÍŻÜz2¦őd¨Đ !Żö5ŐѲ5(ű¬á§HMq\şř4$>¸.<¶€eláÁů°š<1ú`s㎽ţ=i Đ‚5łÎH¬Ż<™Ý¸ŢŻy,Y»4~áŘŻűyOÚŮJž˛XT2â!lçYú­NłptĽoÉąńhÔR¤-IóÉN‡A™ť­äĄA®Äîş|&»%‹}nv?˙ Č뱦=ďýęÔLŘxŞ^Ľü˛–Înţ·oź†Dj`çśv”sĄŠÍŹůÂ#ŮíJéqk©9ţš7žł?ÝR‡ˇr Zň*_“ˇąŹ ¬‡'áÖ? q·ŽĚË"3I&99Ě9ĚŮ'ł.śZ qł~[|ŇbDžäxç?ŮéW÷ąČ%Ї™’–"Wĺě×#ŕT¸6S·Ç»b4ur¤ă÷=\”l¦NĄżÜ€ő•ŰÝÔ ă[mŹKgwYa¨Z^ň#-ÔGËĐ čsQ?Ejů‚Żűň˙YĎEžŢyoł’2ä:;ď0ŕĽujFćĄEÚâöÜä–~JĘ ř7Î%řđşw† [.ĺ ĺĆ—ä bą­ß#ßiSśţŔţf~s8.íjUëcâŹzVÄV쮋sńuŘÍ=ň‘+¶"ZWH_+÷hI˛ĎĹý©S·Çú&»UܦądîĽG®Đ;„Ź'{ěŰz·Ç8Żě›LW¸€`¤'Z 9ä}k9Đ‚5łÎHEXN"3T$};08µ˛µŁ+#ć¨çŢľp}ĺôҰzk¦¬­µ`{¨SJN±Ś-ᵝ[.ĺ Üh Şj,pzéă”ayűőÍ|ââśjk5oܱ˦éÁ©'ąt2ń–«¨™´+¶,2ŹČm=/ëaI&_Ä×ôŹ–ˇAŢç"~ŠÔ’~Ď;OŞ#űNB…éCC=©FCMZ°6`Ö1ÎŔŕÔíţEÄŇż<}»wZČ{­Ąć†;OjČHČ×ŮÍţ}ö©süţ®v[ąČ¸ěNlDFd7veRÚ2Űš)gxďĚ_§[TľĄĚ|Á—'KěÚČEĆĹgˇ’aśelá!Ś»Üú‡OÍśťě.ąCZY±ĄPyÜŔŕÔíT`/µÄ— /:>Ĺäĺ~DjĐňIJ4hĎJ?EjŚelˇXĂ=ťZNüXÇí-ťÝI];Ď´euzRYC-Z°&Ô&ëüJ{ŚÔ‘ţŔfî|oďežÝxÔŔßęnmŠb¦`¦Żm.>ܵhČ@rr¸}.Eňcć\D8pbôAb«˝w6TmíĄ–Ň°’”Űo“ˇţOďŮŰüď|¬¬ęOË`ľđhÎ ··ńź§›°µ@šcŁgˇo2 0Üţ,˛ŃCX †gž#” ř^ş÷‘n{‡óioo»P}ă‘"z:í×Wnťn?3Ë…\v×E)oaĽbSłw˙ĚđĺnźĽřp߯ö¸@"ŐŢÖ p)’×xđPjPÉkř±aQËËÓ 1K¤§U~Š,căSmcí·í·6nŢďăl oÝQ‰ř7$pÜYą©©q-ČżăexvăzEOJB-Xej“u6Á_|ďőď˙ŕ'íßć˙úŐďţ.`’)÷;IJ/«q.H ř­ÂL25úó÷¦ĺ cźŢużóÁăÇŹ_y˝łć=EŞĆw_oˇ´ qp¬ŚcŐč ëőµď—=żz¬'öéÝbáYřÚŘđ·<°˙űyܰ ‚ ‚4<¸×AAA oŘ@AAC`ÖAAA YgAA1Dm˛Îřrş滯·ęÝä@ ´ qp¬ŚcŐč ëĹ«6[ ˘g ť›ÍVď. •“ÉdĐ‚ ZĐ88VĆÁ±jtĐ‚u÷:#‚ ‚ !pŻ3‚ ‚ ‚łÎ‚ ‚ bĚ:#‚ ‚´lŘĺ łĺĘ—[«Á¬3RŚßÄág¸6ěâKL˘7e&ÂĹÄş&“Éf÷cĂ.IńóĘUm‰zZŢoi?Łś=%ăůҢŐH›˛a—Ëď— ÉŤ®şBŠčTV•őŠ »bĹ+¶ ¤ĺ}Ąď”Ô ç×G+óVůQA‡Ľúűᣞ*‹XőüP+ŰŐ±éŁyľŚ_ŰóE™2G1¬fťă°a—’…BˇPH‚ĂfńwDÝۮȖe9!©¬´y;żó%ůň¸‡î˛%˛Üv5 N>ĽČ8­ăçŰÚ^Ě8d7tG¨†çÜd°a—I°aˇPHÂ2Ł <ńíE§sq»¤Ŕą(˛P(Ä=€Óg‹NS©u*^ŕěä„ăJ8Şq…héJ¶ÝŃ?Ô˘«\+ějÜC”±Š-€Ň eÁ˘Ű‹™aVŰwt4hČłY[Rtá ĺťSu´oUť…_Ľ2Ĺëý˝žPž8áÉFQÎ5¤ŽMذˑ¦o9”]Ť‚Ď'NĹfťă°Ů„o„zÄÇľ¶.Š;J43ç…ĹyŃ?éŕöbżŁG|™,§×vőŞMüî! ĺß5ävňÇ€ňÄ Ű‹ÎjźXËŔ®Faq[šT9›•‰uęŞÍ;Ç–W\!şP]ÂË–Ř™ż$ Vl~”^ Ť+›MŘş(mß)®AK^ŇIYŐţ¦S¤–IJrŤ »\ápŃu ­ůA±ÉĘ—…Ő(Aă*Ł]cMËJšîa›O\ ˛Ö˛Ŕ†'Ľ‰„·ĂdrÍe`µř˛«QpOŤŘÚ÷đ˛ Ô<`Ö) ń>LYť™,=â 9H/a_dśň0‡’˛Ë!1QV.6b_€•˘GlŃU€Y‰ˇ––ä°«Ń„rtKđv¨÷DĐÁ$hf3Ő¨®b:9ĺÓĘuP4»tI«Ř’p7±ĺE˛©\ßQË‹)ífUG+ôVf9$Y·ąoşGŇą:Ľ éăďČ^×v¸¬n›áV|ˇŞ<Żr~`ü^~™˘čĺąę qk`ĚrČwŐC•ß®ˇ¦Ą’bk2 Kt‚Ś›5 @yćůÂř”UwHy÷¦G|Z±sEj0댇n»Łâäj뢀 …BadŮŔŹ—y©!7dY`WŁĐEe…, 싌ŘFrăKrʱŘGOq[JŁq…¨uŠ·íVić§G|ˇe†Ľ$ VlE(OśĺęnKdüQ÷|±Ő?Z.Ân®¦‹hҹȗ}‘R¦o‚{.r.NŃ ˝&Šů}‘ĺuŕý]XÂ0Ö®÷䨥›&J¨!·3¤Ú±Ö¸$Ŕ˝Hě®Ň@5:¦Ś5cçŠ.ڦłÎH9p7hnn%0:X($}ˇe†ęR®í{—I-ĽWQ]¶Đ2Ăfm#4·@˙‚eł Ší44 ˇ¶NĺŞ<óîčÜŞayń Ń<Ęݶ·ť˛ůťńe^0«Q[ń‡)íŠ-‹´ŹŠ§\ß‘É3~˝'’"Gî­Ĺv™ őBöc[ĽČůÍ&JHsp±ł´ůÇH»â)>e=@ÓMÓ=ä ĘľôQáŘŐh‚ĎM8B uç8ţ†łÎH°á /¸‡(6ě’mŐ°R@O-ńµ"Ćßáµ]őPŔřyYiŰ=âËܸ‘áî´TD'ndřĺ_!QŃ.¤ôÔ"x‰ŻÓ‰6©ĘsĽŢw&Ť+DOc< bń‚±y^ťČąXĹ–‚ űĹŻÖ/‡śVJËwČ­¤JŠÉË#cRň¨1o-Ő>W¤ şl‰rľÚ ÖçÍś%ńqqˇ§3G†K\VÚn‰¦ µěj4Ńtkś”g~1ăp…ŮX:×Ŕ®Fâ÷ú I• ` &łÎH9đoŹvTQCîŚCŘÇ/ÝRž¸´­Ă䀤đ4JYyŮŻ-)–ABÜ+IY!‘ ľS–‡BذËÔÁšEĄAyâŰ‹˘ÍLˇÜćčgذ‹a?ňĘÍt0é+՞Ƣ§“n/fb!=ââćfĽbSŁđŞ „qq@2}GGZž]Ť&áV «úhŢŞę0mtDÝÂ÷ŃߏĽki_ úůů&müŐÂí˘ćâ;“Éd2MdmŇĘ>5ävŠß•©¸]ݦ µĹĽŁÁˇąČřůČž#’›«Š*Ś™O-ŹăŹYg¤|vcçŰzž“žîmoă‘Řů6éc{[o{Űx`Zćl2ß#îjו•ś‰ĺ´z’‹bÓëĽňµ ˛D(oYç—kM9{JĂ8˝.ҶŢö3±tdĽ˝müţ®$|~:¨6™( SŘ6~ŠčTWy…(ÄŠWl¤ xďţŮřs6Ő´E ŇUaTÖ˘s´bňEu"u€»`kbo)Ń %Zf{őüŁÓDr|ŇÓ˝ímÁtq™2SëvŹ`Ö)›\2—.ÂŇçB¤˛w˙LďYä÷7óű›ůý<ű˙Ů{˙Đ6˛,ń÷f_vvč¸`䔝}ţŃ,kÓ3+c {†ÄÚL^0«Á’§;=ŢlK0ń€ d¤&“ž±ł´Ą°Züúű:#Ű$`$ŢצJXłł¸Y˘DN¶c—­ńĐý”ÇĚ·ÁóĎ4čýQż«n•J˛lYÖůf¤[çž{}NÝ{Oť{Km}p+ä6çěÎąŐÂA®p0ďÓż{ [Gu…ĎąÂA®đpÄJî‰$¶ ŢËń}€Ťi,ä «wžz…éxa¸»Ůu˙¨ t˘Ń8+©t¬ŢyŢř·zÔ–? ŕśěxôˇ,NíĽŞuŮh«pu=ÜłäÚ䪧:ľÜ˛NˇdóRŞgj¬N—čŮ<ť‚Kďť5W±PÝŔ-Łs˘C`˙ëł°űĽcY°ůőµę!™ď ™ďôĺ`cşi&íügÂ@}y=ťHÍpNŽ=‹®óĎí`őÎ?đ¶U“­#r›svUq zrŠČÇÇ/>ťŮ<©ÍZ‘ µ‹,uFĘe?˝>čw5•ć˛S{ŹÁĚć­^A wZú\‘ÂjT´»Çčçű°žžťě·´ô_˛?Űćť[Fćë†ŕ°Î€Î«?93FŹHś·rŹ:Đšî+!kmďŕ?µľwxĎî>‡ Î3ľTńôŁ{çăół“㣭`ż%,śgŰťĄ5l¬>•ßfZÜ_ž˙ëśđHLh +ořW µˇł_q±‰Ž —ÄôäŢâGzbß”wšÂi€ÇÓÂW.Ó)mzT¶dĐ%ކňńńËńĹé[§™||Ľgɵ)f—öQx3ö´î“QbuÖµ?YŰiłÎHYě=~®ţÖŢÁÉĚ#zňtŠcŁj($BO ŠűŃÂŃŠű ‘űÎNE°emď ź7ú®SÎ"XŔ~+.s3c_ŕ®WąKÖÉ‘IŠŽkˇÎgľÜ€ŤŐ»T«ůŠ ËFlî| €ą„} ŹŻ§gWoö”±ŕí/ OĂŻůiâ@3’GN -ŁÁŽë˙ş‘ŹĎ?›»Ú/żŇ:ň1ż§4? ‹—ů†\á Ô@Olr{}“÷?‰ďĂz¸çů¸¸ôQ%{ýú=‘CjďLSŔŇ´6c–Iţ ĎćÜ‹‹%3v{Ź­f®ww77u÷Ldč‰ÁË‘ĺÉźć5µžéëÜőöLtüD˙žÉÓ)»*ß,p _ĎvÚ żýîząQŮ3‘©0aa¦'¤†śĘľ54¸îśż)†Č&ˇrźăŐŮŘţZm§ Ě:#e°ź^ĘđÁŠë>¬¦Ň{`mď0y+PxŠbhĄŤ˘ňŰ/>+yHg)Uy§/,}–6-oż•+¤Ćf5G«98ÇmÎŮó{_ŕi>C§ŢuëćČMĘy=Üi—RPć°:]ΧůwđB‚xŔýAP:-ChZůĆ~Č9Áôúćě <©VŚâť„ Ŕ¦zRŤ†NÎKďŤŢZ˝°4(nńÎ>ĄWç¶?fťóě=~´:&lŐĺ–ąMśľ«wŕ¦ě ­ŤiRÖJ´í§—2ď¶·VÜ-}ý»éŚĽĹÇśłĚŃ2„ë%¶÷óńqq/ůôbőÎ/WvN±wđüÍ‹%OH«+6Ş”s>>®Š›óńq]űôőîÎs?¬!é1’'kP´ň4 '«w^/âžN­NL|f0ě­í´ˇ€ŠÝçdYžTÖPcĐ2ú«™g®ń…˝ö)ťk(µČ6¶ý1ëŚFµU'lâ´Ś>\˝óÔ+Bő1GŘÚĽ”ÎS>ş´:ݧ§€ükóđb†Tq—PŻw:›ş››ŻźŹ ď¨í/ óǧýU-dgIćťÚČÇÇyăLm€Ćň #÷…–'K´guşžąřęâáťö[«wžzĹ·‹ěî1yćÉ|ĹSŤćŢ[üH‘rŢO/e@:ľ¬ý˝9•†ŢéśëQ7ď#Ňű‚%‡ q •ůW '«wlĚ펱fdĚHšl®*Ş0ç>­<ÚłÎHů°1·Ĺ˘9LČ"ŠĹÜîPH1ŘcO®%×UÄ…TRUwŚQµŇđĂťCá,FmÉŚ!†hRąóŮ[ă‹ęî)qÇX˛›´UŐwÚéş&$3•Â0śOKŰEŇŔ}+O^¬ÄŠw?uTň¦zś;d®ă=%Ă#™>…›@;˙ô!"·"ŹĂJĽIZîĚ:#eĂ®% „Ä+ÄÜ'ĐE¶Î%‹Ĺb±¸uą˘;Ĺb±XLşĚ)¤|ÄşÂg®ŔGT˛Í:…iB%ćđýd×ŕ ŽĚ,u‚ĆY+ŚJ‚ň%y㇠1)ŕ Ú×dSiW@ë2%\eBm Ż‚¶m±@Ö)zÓ“h 1@‘|g¦bŔĆÜ‹3"|ĆL±X,ŇApuQŔnŮhÁćţkÚuOĄxWČ|§//Tş A˙™ŻżÍ:uü —/ŮCä¸qŮŰâÓŘí¬Ë”/IĽ!ŞĺK‹;QWí{rŠ`cngVľ•T`CÍrŹp`Ö)v-žŔ-%Źk˘;Ň8u„ c¶…eBů’;Qq¦U]“â/v #çĂ; ş7lţYĆ´Ľíeş5ęśđcKeúNŞxúˇ|IBŔlěv$xĂGÉ,MuäÔ•¬ü®0Ó"sßîÚ‰™•HpČ@ x\Ů—,ˇkry(ŮCäŘéF3ë·y<bz’Ť]ó§Rţ6>˙(í[…ÖÖT;Ň–BeéJž(Q5ÄĆÜîXL'ĺÚ°1w[Âł#Č$ű(Ľ9»Z÷ÉőŻÎşö/µýT˙`Ö) >č ň‰]K¤Äب ‰¤üm;óÔ9[j‹%‰‰W•ČazyJ¨ŔYDË;Â4čĺU8†‚§j5đ&łquq$řÎ\ņ…™őC4ŕ™ÚlaV"’e͸•ŤąŻÁ=rKt›IyÜ:1Pľ6˙,ĂĆngŁĺ•{üžRŇ1·´oHů·†ř-ŹČí L¨m놸TŃŽ‚~Oäâ;SAFŕ¸&Ź›u!óf Kă>9Ć«łý‰ÚNuFĘA\çäé0! QˇůN˝Á–“VĚ1ڬ0ŔľĚňY±F§\géXŢĐËô«q„‹Ĺb±8´"ĹeZťbäv»Kšůµľ3Y±1SÎL¨-áągĆ,A>28o!ki-‘â ßćOĄümîŰŮňäĹ;Ç|‘cŔ1Ś8Űü¶úaתç3—đ•Ű?`_f!âäFe›?ĄyŽŞ^OH ąTĎŽŤD gźŇ«sŰłÎyصDJHO‹4÷ ęDÁ/{C‹ ‘˛VĘ M88@TX.LČ09á˛ůť~ŚśL:Ë”ďřý)c!6ć[0zÂá5&ipĘŽ őť¦báJ9ł1·**ecn]ű8†ÄÍUńHŹ‘˘7g·tŐ”^ťÚţGśu¶@‘űżwľř‹·_˙Ëď7SřĂď~ýgń:C§=WŢ_Üú}Őţ Dźţď}Łr$C§G~řc•kąÂĹĎ?ő\y˙É“'6[ăütÁ)$›Í˘ëô yĐVćA[Ő;čÁÚRVôüĆ›ť‹źŞnÉ Ďxß?˝‚ť ü©€YgAA¤îÁłÎ‚ ‚ b <ëŚ ‚ ‚ ¦Ŕ¬3‚ ‚ ‚łÎ‚ ‚ bŠăÉ:żVĹ#ÇL6kř_ CN<čÁz=h´•yĐVőz°VŘl¶cž1t®c^{»˝Ö]@*çŰŻ¶Ńu zĐ>~9ľoFĆŚ¤É檢 sîÓĘŁý1댔ĎŢâĺ¦nŐČÉLu77ń˙¦ă‹—›¤ŻÍMÝÍMăÓSŠÁ¦{r…{亊’áĹL\(™Úഉ {°– H¬‡~Ě+ťµ®ž=ó2ŰĘ +·Ľ`dÎŹSa­ËDĐxGG§ô5/j–ß!*1ýŠŤ‚t'ď/ +ěĎů”č  Ň]aV6¦Ĺ‘«7℺ňî!' ą†÷¬8 Ź$Zf{íücĐ„Ü>™©îć¦pF_¦ c’–{łÎHŮäéLŽÁŇc!RŮ_îľńÂA®p+ÄáąőÁA®pŰśł;çV ąÂÁĽO˙îQ(l!Ö>ç ąÂĂ»wž¸Ő ëáž%×&w)Őńĺ.lL»`ů W8X˝óÔ+ĚÂű ĂÝÍ®űGmź“ŤĆYIu c•ŰÔ–? ŕśěxôˇ,NíĽŞuŮh«p•ŕ’NˇdóRŞgj¬N—xŹĺé\zď¬ąŠ €ęNn}ű_ź…Ýç˂ͯ¨}¨PŹ…Ě”xWČ|§/ÓMó0iç?FśD& |r3Ď" öS'8'ÇD×äăóĎí`őÎ?đ¶U“­#r›söÚ÷䑏Ź_|:łyR›µ"j–{„łÎHyě§—ŕÂýﮦŇ\vjďń#ŮĽŐ+ôNKź+RXç­VîC_hş`==;Ůohéżd¶Í=1·Ś>$LÓŤĹaťťWrţfĚ|îPĺC¬íü§Ö÷.Kě>‡ Î3ľTńôŁ{'çăół“㣭`ż%,śgŰťĄ5l¬>•ßfZÜ_ž˙ëśđHLqRv·iń~@NťýÂŰMt\¸ ¦'÷?šČĐü¦„´‡N<žľr™NiÓŁ˛˝ ž(Q5”ŹŹ_Ž/Nëm}4ůřxĎ’kóáUřޱŹÂ›±ç uźŚ«ł®ýÉÚNuFĘbďń#pő·öNfŃű§S‡Z 5 ‰Đ↯zíëÜőęm[Ű;čç¸ŮÄSł–·ßŠËÜĚHňŽ73ÉűÎN.JnˇÎg¸=„Ő»T«ůŠ ËFlî| €ą„} ŹŻ§gWoö”±ŕí/ OĂŻůiýÇíÎ'ű <­!ÇAËh°ăúżnäăóĎć®öËŻ´Ž|Ěď)ÍŹÂâe—°‡pę '¶r…ÜňäýOâű°îy>.î}TÉ^ż~Oäâ;Ó÷ŘŇ´6c–Iţ ĎćÜ‹‹%3v{Ź­f®ww77u÷Ldč‰ÁË‘Ą›ŕÎbąÓ w*˝ŽčëÜőöLtüD˙žÉÓ)»*߀p _ĎvÚ żýîząQŮ3‘©0sa¦'¤†śĘľ54¸îśż)†Č&ˇrźăŐŮŘţZm§ Ě:#e°ź^ĘđÁŠë>¬¦Ň{`mď0y+PX1ö[ąBjlVyx7żý˘á“‘‡s–R•wúÂŇgiÓňDďp1ńćś]1ż÷őžć3tę]·n‰\±Ѥś×ĂÍ‘v)e«Óĺ|š/q‡/$ÜĄÓ2%F\_`u{·ś.!ÇHŻoΓjĹ(ŢI¨0lŞ'ŐhčôŕĽôŢč­Ő Kbţčpö)˝:7°ýŹ6ë\,‚CçÓÂŢăG«cÂV]n™ŰÄé»znĘŢĐÚ&e­”AŰ~z)ón{ Ya™äăăâLÁ/Ű}ý»éŚĽ!„ĂśłĚŃ2„ë%¶÷ ŢŃÇęť_Żěśbďŕů›':KžVWl8T)ç||\7çăăşöéëÜťç~XC<Ňc$OÖ q2 ű SB¦y==;Ř~¶ěż9&¬Ţy˝{:µ:]0ń™Á°·¶wІ*vź“e zRYCŤAËčŻfžąĆöJاt®ˇÔęÜŘö?ž¬ókUě1R3ňt ć¦Ĺ4€Ý=v1ň8ď}¸ ĂÍM|y •#Tî mnŹ÷4Ýäľ9çVôA>NV¨Í“ŃÍ—Á™ĺK©‹€Áćçń®gÝÝÍ¥͇--Ó©tsS7ŔdĽŔ^ű Ă×W`°ybl™ôrĐBpÖöĽdŢÉřfç|Ź`ŰÍN­ĺeĘúBË“÷?1lĎęÔx'n¤Ó~kőÎđ`óđ öŮÝcRćÉ|ĹSŤćNŢ[ühîäÄ8c?˝”ŐŚ0Üěwróý†¦sůËÝÝ×ó‘6^)9vzI#N¤…‚›BgĆ–N˝N!Vďx ÉŰ|×~'7˙ńÜxçk»3§í mJŕś[ý¨q=Ě˙fËŕĚć­Š˛&j4ZG¤¶›»Ç!7ŻgŃ›IťŔޏÜď*ç˙¶˙ńśu¶Ŕ;_üĹŰŻ˙ĺ÷›ż)üáwżţłxˇÓž+ď/nýľ R‚ţď}Łr$C§G~řc•kąÂĹĎ?ő\y˙É“'Ż˝Ý~ě=EŞĆ·_mŁëô yĐVćA[Ő;čÁŇućő˛˘ç7Ţě\üüS˝pK^xĆű`÷·pPŔ‚ ‚ HÝż° ‚ ‚ ¦Ŕ_Ř@AAS`ÖAAALYgAA1ĹńdťńÇéęożÚ®uC¬wĐćA[™mUď kĹ6Ű1DĎ:×16›­Ö]@*'›Í˘ëô yĐVćA[Ő;čÁ‚gťAAÄxÖAAALYgAA1fťA)6ćvÇX32f$M6WUsźVíŹYg¤|ŘŰbQŤ&d Ĺbn‹ w(¤lб'WČ’ë* bŚ(b”•­b‡BڬĄLŁ˘pŁž=Y™mŐŢŕ-ŻpťĆ=j «,ŻŁS]U}‡¨Äô+6 LHf*…a8ź–¶‹¤űVžĽX‰/ÔŚ8˛ŠĆsT]ŔÝ02×ńž‡á‘DKÂmŞť z‚‘ۇ ‘Ça%Ţ$-÷fť‘˛a× BbŤ bn‹č" [ç’Ĺb±X܉ş\Ńťb±X,&]ćR>b]á3Wŕsř’Ľ@ŘL¨-áá/Ó¶-ߡťhÖÉM!ě–Ťdü×v&Đ8k…QIPrŰ‚Úň€+hKČ ŘĐşĚG W Ţ!éJv<‰¶Ô€GĽÇصx(s6ć¶Xśá«0fŠĹb‘‚«‹*y·«4ď ™ďôĺ…J·!čâ?kFśą˛j‘ďÔkV`G¸X,‹C+&V~&Ô–đÜkŕ5Ľ\géXŢfÍÍŚďhuŠ‘Űí.ićw #+ °/ł|FÓlĹĆDL9KżŰ|,dpŢBÖŇZ"ž͟JůŰÜ·łĺÉźć5µžq #Î6żí†ţ=Ă®%TĎg.á+·ĂÁľĚBÄÉŤĘ6JóU˝žr©ž‰x˘˛óY&ˇrźăŐŮŘţ§}słÎHČÖ@gR‰5¨s‡9jAPX1Žp±H#ĘĂ»ěˬ,2ˇʰç,Ą*ß=ObvÍ´<Ń;"\LĽu)ćwÇP0ű’YKŘřČŮtĹFD“r®čn×;oˇ’WsÜ“7¤Ó2Ч'߸Cđ„ăD]ÔoćPĽ“PaŘTOŞŃĐéÁĺđ…/}Î>ĄWç¶?žuFĚĂ®%RBzŞX¤ąQG ~ŮZL”µRmÂÁ˘Âr;s‹ ňË6ź®ů 6ćnđ¸L:Ë”ďřý)c!‚wŚ4&ipĘ6C6żÓo9ëUl8T)gíÝÎĆÜşöq ‰›«â€1’'k Ť¸öHťBů’z1÷tJ xŔđMęś-UΫěy1čIe 5”ď^4ëtÇŘö)ťk(µ:7¶ý1ëŚFµU'lâPľäN4ëΠ:é8Â;ž„pž˛-áŮ ;ôrĺ~•ŚŰůµ„jŔ#6.lO;Â48ą}$vp}OÉ´4ěŽ1ŮYň“®¬Ě¶ ±<+WćÓÁRíĽc¤Óމfťbˇc((Ď<™ŻxŞacnţäřëŚ×)ç’w»J48ů‘Y˛E5Ú‡ś*(ߍ`Äi±¸cŕ»'Í !Âľ?KMµÂ»†Îl´Ât&j4(_’¶ůŰÜ1J×>˘7g·tŐ”^ťÚţÇ“u¶Ŕ;_|çí׿űýćo řÝŻ˙,^`č´çĘű‹[żŻĆß‚” ˙{ߨÉĐé‘ţXĺZ®pńóO=WŢňä‰ÍÖ8?]p ÉfłčÁş=hľĹ6 IDAT´•yĐVőz°¶”=żńfçâçźę…[ňÂ3Ţwŕ »ż…fťAAşĎ:#‚ ‚ )đ¬3‚ ‚ ‚łÎ‚ ‚ b Ě:#‚ ‚ )Ž'ëüZ{Ś3٬á) 9ń ëô yĐVćA[Ő;čÁZałŮŽ!zĆĐąŽyííöZw©śożÚFÖ5čAó ­Ě¶ŞwĐ5Ď:#‚ ‚ )đ¬3‚ ‚ ‚łÎ‚ ‚ b Ě:#‚ R ňńńËńý“ )IąvćäŃ;uFĘgońrS·jäd¦ş››řÓëę)~ÍÇDZń…=ů×îćáĹĽRokx1#k g1m!b†’ÎâŻNm(ŤÜÝĚűb|aOľ<ľ,—śKP¨uş¤łÜŰ@·bٰ–ěł–;TQ2µQžA^ĺ5„«ÚËě¤SĺJy?‘َâéÔdĄšsŞ#wDfŠěDůBlvL‘–{łÎHŮäéLŽÁŇcayŰ_îľńÂA®p+Ä!©łR®‡{–\›śXŞăË]çÜ*WqóRŞgj¬N—¨ĚmÎI+Łý–°LînÓç­Öőôědż Ą˙’ýٶö©R©$/é<ŰîÔÔW_Őj(·2ÎvÚKĘ G‡lŽÝ_VěęäăăŠ]…© íŽbĎ„2ęÖ™sä»[’B!íťx<-Ë‚çăă—ă‹ÓĽ<ˇcüŐĆŢ„ĚÇÇ{–\›G¬ÂWŤ•öaońى =1ŘÜ4{*;+Ń,÷šćŐ Gśu¶@±:ź"ö?Wkďŕdć˝y:E‹±‘1}ý»^˝ »Lňľł“ ŹZ¨ó™/w`cőnŐŞ–´¶wĐĎ÷€žäĆíŧ3ľR1e9K@4rłlŰÎ~+.s3#ÉéDťĆ·ąŠ ÉŢâĺ¦îćdAů,$“hĺą”żŢ=Ł˝ŞŐ`Ş­#‚Ű=\ěµäú¸ĚÜR]—µŚ>ä7y–Ďߌ­Ő;¸›ć~&y?ŕn¶őpĎżˇzÔ!Ď9’Ľ°)±·xŮ%lž„úč‰íA®éÉű\®„/ąŐ«í䎥iyÜ ëážçăâ¦ÜG˘MZG>ćwç}ť†vÓ,÷ HúĆ uFĘA\)íî1ZŘÄ1˛ôNä ąÁ¤tâM †>é\÷’ěî±Ůäěĺźń‰+2ňÍúŹNó(­&ĺĆ—ň3˛Íľ^źŮC2§kušĽ LVlDZGä ît•Ď|݇ŤYă«ĺ!đČÍ8WËŮÓ@Ž1­xń.<ŰŢ蜼żş«˛„E~ű…sîŞŢ\­ťsdň-ý—ěłÉŤ<ťĄQˇ¸ !oBÓ1‚|ŁAëŽtŘ ňŰ/ŕ®WÜ Đ{|5°qą—®’ô7Śđ¬3RűéĄ ¬¸îĂj*˝Ööí 2Ć~+WHŤÍ&7@†6çěŠÝ×xšĎĐ©wÝ„ăůíŞą¸ÜÔZĂRłtUy§/,}–6-/wş– nŁŠ K_`u{WV ,Ć(ä×ĂÍ‘v)‰ĄB窶E3}ČÇçźq‹nëČţÄ6R38—ń»˙Ę\˛ý™gÉ XO?Óß‹SĹ9Gę©cóŇ{Ł·V/, Š[|Š—CĘ>›GXîŐ-J]YgÄ<{Ź­Ž {jąen§ďę¸){CkczjC9]î§—2ď¶·äăăâV­¦Vďü2xeoâ÷žżyq˘cP{ c=Ü3Ńńe˘«Ń7ëÍCrVĄşZFp}˘Ä© §k)ă6(Q±ˇŘ_Íőôě`űŮľ~aWťz :ĄŞBO^Ë5¨Żj5”Ůk{=ń˙ă9ĺ+BމlŽuňńń~zIé­ď]xšžNľż~ ›đe’z ďîýôR&ŕîµ:] Üf t hýŐĚ3×řžbLi)ťk .÷2ŚőźvŽ'ëüZ{ŚÔŚ<ť‚ąińßî»yś÷ŽŚ>\…áÁć&ľ<ĘA_ďćöxOÓM®Ä9·ú ŕ¬ëYww3W48łů°â’rű­Ő;ĂÍĂ3ÜzlwŹH§5č‰Áć ˇâÁ //śŚyłľ ZÎÚž—[rłsľg"0Řü<ľŮ)32 Î,_’)ë -OŢ˙İ=«“ŕtťfoRO5ű Ă×W`°yblů DÁMa¬Ť-ŚX¦Séć¦n€ÉxđŕˇÖ ‘ßO/e`5#¨µßÉÍ÷ËŞkŻj4ô–ۇ͹ńN~pfóa/QŚG‡vŽďř»M\ˇ=0)˝»ŮéĹőçăů[(}ˇĺdwOÓMĄ$/O^ Dwó·ÇČÇb ŚÝ™3ꪕÜ1ZG¤¶›»Ç!7/Ŕ9·ú± bőŽšĽÍwíIťŔޏÜď*ç=ý Ŕńdť-đÎßyűőď~żů›Â~÷ë?‹:íąňţâÖď«ń· %č˙Ţ7*G2tzä‡?Vą–+\üüSĎ•÷źŞŐIô¦c(Ya€}™–h“.–Z©ň©`&Ô–đÜÓ3¬ńŐăér”IAg˛/YqP0+ŮhŔ!˝Ěş¤oj´sŽLžđ¸"+ »–ĄQˇ¸ĺ oBÓ1‚|#Rj!~ŔČÔěË,DśâB…Ď˝fzBjČŕF:I`Ö)v-‘âg”±s ę) ˇ€:G ŕÓÁRíij¬SćMÇPPž·0_ńTĂĆÜŢG–Ô9ěâ:飸łčÜ.¨Ť&-^* Zyv-‘’™[eVíU­†rű -1îRe$KßîÚáß°ń…×¶lbr—đd# Ü‡w„i^T.ÉËć~¸ĘnĘwO ogét 1‚ňÝFś‹;ĄL-yÇpŕ ď:łŃ ĎS™lč$rMě-^nęďű||Ľą©{z]ĽĽ1ÝÔÍŤŤć¦îć¦îć© îBfŞ›/‘Ë+µ‰ ››ş››Ćöä_»››ÂÍPŻ˙Axܨˇµ§č8Ąń»›‡3ńqÎ/˘đĺ©đeąŚŕ8‚B‚CEťŇ׼¨YěŐŢâe•~ĹFa=,Ůg=¬Yb‰0úĚjäU^Óě y’#´ÚŚĺ‘cF;ÍšŻhfú%OţHő0XĹZý…ro‘›üµ+AONuFĘ$O§`r –‹ žsrěYDŚxćź ÚŔęťßśł;çV ·zö†»/BĽp+ä qHnµ­‡{–\›śXŞăË]çÜ*WqsîĹ'§gěŐ]G('żp+<9 ŕśěxôˇ,ÜéĽú€÷Ž]žm®:TŇ)şřRŞgj¬N—xWäé\zď¬ąŠ ŔţÂpwłëľř=“„eÎ&ą™g‘Ĺô…¦űjvźgŢm?5cŻč:˘:ŻţäüÍůÔ‘ľCµXŰ;řO­ď 7ě>‡ Î~—*ž~ZF*–+ű­˙ew›>oµ®§g'űí-ý—ě϶µ©RI^Ňy¶ÝIčĂţÂđü_çć}š„ĘŮNő:j¬Ť(ŹÔ«w^HRě/ +vuňńqic=ĚmL©¶z&”Q·ÎśŁÝ–”mž„ÓŹ§Ő›Ť‹ÓĽ<ˇcüŐ2łć§ ŇBĚ;hońى =1Čoűšż)dĐ%ކ”^>É`Ö)‹˝ÇŹŔŐßÚ;8™yD‹Ă e4Řqý_7ňńůgsWű5•ňtŠă'cm}ý»^Ő¦=1ČŤ®‹Og|Ąb/Ä]Gč#_ľ+gż—ąőÉĐˇŞť>Č$ď;;ą(ą…:źůr6VďvP­ć+6$ÜÎi˛ż |˛¶wĐĎËČéjĺą”żňžŮ_ž†_ÉöZG·{¸ČiÉő±~n‰×fZ© ÂmĐ2úßäY>3¶Vďxŕnšř™äý€[¸ŮÖĂ=üĆ‚*Ižs$yaŁcoń˛KŘ<9őĐŰ\Ó“÷ąÍFľäVݶc@’o<ôâÖ‘Źů]ÁůQ(eęőpĎóqq7Ż˘Mˇ!©!™—O2uFĘA\Gíî1Zvf‹z&:~˘ł Ă’¶Ţé\á 7”NĹÉ7ĺqo÷”_ĘĎHȶŰz}fĎ9TÔ)ĆÄźt®Š­ŘÝcłÉ ŘË?ăs˘f+6"­#rwşĘG‡×Ă„ĐvďńŁŐĚőn>ĹHO ^Ž/ňG>r3ÎUý Iۆ)y¤ÖIÁ‹wáŮö>@ďŕäýŐuŘX•%2ňŰ/śsWő¶´sŽLľĄ˙’}6ą‘§S Ô *÷%äMh:FoDJ-ÄŔ-»†¦Îoż€»^qˇ¬gďňzBjČŕF:I`Ö)ýôR†V\÷A~Ęz}svBÖöEś]ZŘoĺ ©±Y婸rSh GT¤Ę;}aéł´iy˘CE¸xsήđo_ŕi>C§Ţuëf Č–ľţŔęö®¬ żý˘¬‡%…üz¸9ŇľůpDť2äÂtŮ÷Ź!őŚ[đZGđç­5Č´qą¨ňHíŕn||\|QAĚ%Ű?y–Ü€őô3ő^™*Î9R÷HCŔx!6Źâ­’ Ŕ¦zRŤ†jfťóě=~´:&lôä–g6Ŕęť×˝őű®Ţ›˛·¸6¦§6Úňńqqg_»ęs›ňĘąx?˝„ MCtD…´ŚáúD‰SĆUaőÎ/WvĘ­wđüÍ‹%OH«+6ű SBčąžžl?Ű×/ěŞKŁCqJU…žĽ2n6Đ`mď '>ăOI ôry•6˘<Ͱűś,kTÔĐIâx˛ÎŻU±ÇHÍČÓ)›"í‘ǻڗ9ářxĎD`°ůyĽp«wôá* 67ńW©\žž×j_ąžuw7sE3›[ ôÄ`óLĆ Ţ€ĐćöxOÓMNĘ9·ú@›ĄEëŘž—[xłs^tÜf§Ěř08ł,ww_hyňţ'†íYť†Őč´ßZ˝3<Ř<<Ă…Yv÷€”·0_ńTłż0K`ěÎśQW­äŽ!FX˝ă&oó]űťÜ| Sˇ3€snőc˘Ćő0˙+=3›·*Ę^™lč$rłˇŽąąÍ\K’QNálőo IDATśŞ†Dm0ौMňµÂ;ѬÓ⎱@ů’;žD›ŘŤďí 8ägCŚŇqŠăĹęĂŽ0,Őɡ:ep ĺy óO5lĚÍź”°XB Pç@°‹褏â΢s» 6š´x©4hĺٵDJfîRfĺ­Ď{yGÝ$AŐ%Čët9f$˙ÜîÚáß°ń…×¶lbr—đd# Ü‡w„i^T.ÉËćé†üOůîIB!ăí,ťŽ!FPľÁÓbqÇ ”©eĂŮhđ ď:łŃ’+5“ ťDŽ'ëlwľřÎŰŻ÷űÍßţđ»_˙YĽŔĐiĎ•÷·~_Ťż)A˙÷ľQ9’ˇÓ#?ü±Ęµ\áâçźz®Ľ˙äÉ›­q~şŕ’ÍfŃu zĐ•7ÂrŐÝÜÔ=˝®^óńqŃÚŇgÁAsž ›Ćö@G§ô5/j{µ·xY%¦_±Qßüâięž^W–¨†LI ‚ĽĘk*WŹ@rlȇ[fŞ»ą)Ľ`2PŢ[4ţF¬‡/>ťŮ<ČBöĘűŽhlÄ…¸Ü%’¸ W±ź'łéňÁ¬3R&y:“c°ôXŚTś“Ź>T.ęÂΫr…ÜćśÝ9·Z8Čć}ť |Îr…‡#Ł·â»ó {°żĺ[˝Ó.X>ČVď<őň‘ě/ w7»îÇ|ŞŘ_îľqÁćqHŞĂ«wž÷Ń­^µÎšóěh«pu=ÜłäÚ䪧:ľÜ˛NˇdóRŞgj¬N—xŹĺé\zď¬ąŠ €úćĎ$ą’+äfžEóä!c  żűĽcYđÚuÍčÖ\=´†˝ĹËĽ†Ü2xOđ’yĘÉÇÇ/>ťŮ<Ťzçx[JWh1ţĆmmż€óVë!{Śčc5éD%Äýx¨aÓe‚Yg¤<öÓKpáţwWSi1µĐyő'çoĆT+4±°4˝Ó©Žë.fâÓŹ.]µŔzzv˛ßĐŇÉţl›[S[Fć6ç0UQ&{ŹÁĚć­^á{ď´ôŮ4ĺzV\űBÓ}%d­íü§Ö÷.Źí>‡ Î €TńôŁľůí·„¤Ýî6}Ţj%} $yIçŮv§¦ľúęá5ěnÓĽ°»Çčç:×€||ĽgɵůpÄŞH[.N+·2SĄ7y¤]Ů>’˘d=Ü3‘»Ţć¦naŁRvuoń˛xŠc=Üp{JUBLÜŞĚ+ą•xZ†4ĂËw Uůlţ3Éeĺµk®iPnŤVĹPĺYg¤,ö?Wkďŕdć--oö[qp©G±P=1¨ĐwőÜĽ¸äúXó¸lmďŔ5ő0äé]fš‡ŕ sžĺéëÜőJ ôurd’÷ťťśß[¨ó™/w`cőnŐjľbCÂí›'ű Ęgˇr‡ŚVžKůëÝ3Ú«•kxšçĂŁłíNń3rl,M‹qłzb{đ 'ŢWůřřE4b ÖĂ=ĎÇĹí Źâű„’ľ¨~Đţ™újëČO&ﯮd’÷AĂćPNŹ=˛éYk|Ń­ąĺÉűźh6yÔ3üz¸g‚ß&ŇÍXi]V~»¦š–JôvŐŽĚ:#ĺ ®sv÷-;łĐë›{ˇ ÄBň-xak©…:_ýž#ĺĆ—$ĎŠ’ÓąÂAn0)ťÄŐę'ýO:WĹVěî±Ůäěĺź ůH“nßÜť®r~n=ÜCz5uµ, }ˇÍK©náďľYîrxhpÝ9ó#Í vÎ]c%zb°çůxˇÔVU~ű—Nćb8úůľ¶ÄXÄá«wÇKíV! śĺ.ŃĽ˘[ĎvCaĹ źß~!ż ôPąĚ\»ű ĂüůŘsSMËJZú/Ůg5gŹĚ:#e°ź^ĘđÁŠë>ČĎlX˝Ó–>K++ K°ľńeŇ$žß~ŃĐ™ĹCcmďP>đBU™žµßĘRczÓ7éoÎŮkj_ŕi>C§Ţuë.ŐäŠ K_`u{WVPîQČŻ‡›#íÚ4¤ńŐŠ5X˝ó⪏Ăüřq^zoôÖę…ĄA4žs.n2ϧx-AűÖ„&ř&\íëÜMg¤ł@Hĺź|†ß}nîP4.3ŃnËčĂśřîSĺM7uFĚł÷řŃęز0–•g6ZFp}BuŁ ŕß´0źe@Ť\ŕţn;®©‡ ďę¸){ťncşňłb¦<›ŹŹ‹ mÉ0Îęť_ŻěřZďŕů›':Jćś4Šý…)!ÓĽžžl?K2ůř¸®}ôä•QŻ\úęá5ě-~4Qúh;r4´Śţjć™Ëŕ'2ZFĆÁH€{Dçfoýcyಏ]/î|Pţű căë#ÍđšMf![±ź^u+\Vi»%š–©ÝO/eú‰•ŁłÎiňt d['Ü=-OqA_hyRSŤX( ?žŐ<Ľ¸05ČżŘ:ňńÜ‹‹S˝Ó)¸ŘÔÝÜ4xý|\xĎla¸»g‚Kăo‚š§eôáęť§^Áć^p÷‚Ü Sůř8oŘ© Đ8¨´»•Xť®g.ářť°qo Ó~kőÎSŻxęŔîYÎÉ|ĹSŤęćoˇŕ&ÔÁËG¬ä!c A+żź^ĘŔŞ VýscÚ«‡× üfbwęBÎěO4 Ő§uäAŞăz·¸{®Ąw:Őq˝Ű0zî mν¸(-A[b,V§Ë9čęÇ›áß°"?Ă÷…–ĎóŁ•;EmőN ëČô—çĄ]…Ë*n×°i™Z˝ůí8ž¬łŢůâ/Ţ~ý/żßüMáżűőźĹ ťö\yqë÷Őř[ôď•#:=ňĂ«\Ë.~ţ©çĘűOžČM›«şËL6}Ě”•o®8zƳ΂ ‚ HÝż° ‚ ‚ ¦Ŕ_Ř@AASßYç"«×mäřřö«íZw9čÁz=h´•yĐVőz°VĽałaô\,‚Ĺřš`]cłŮjݤr˛Ů,z°®Ašme´U˝¬!xÖAAALgťAAÄuFAASOÖąÄYçKťďT¬1‰ĹbyőőV­{ ‚ś^ŘűÜKú¨š+AJR®ť9ů{p­á˝sR˛Î˙ß˙ű˙ÝżĹĎ?­ŘyŘŰbqÇXŇ7`cná s[ňB™Ľ˛MEť¦EBLőţÄÓ RXMĺÉŞ!Fia‹Ĺc´î…”BjŻi=NŇ©®Şčs«Äô+6 LHú‹eĺ‡Xb0,y•×tU—%y’8᪶ĎHí¨x.%MŕTsRuäŽ`Bd3‹2&˝Ć×iĽÉŐxÖ)v-Á $ÖXˇÄ´%®©Ćs·%<;EÚćosÇX&$•Ҷ-eŁŠzMGyÉťhÖ‰sriŘŰâş(ŘV•ĺKîD]®čN1ě™…‹Ĺb1飴îî $y¸aY>‚äq‚NŃŹžD[jŔ#:š]K€g€2W±`cn‹Ĺż3+‚Gw˘ŮŰ1ďăťhÖI˛ŠJAžÝ˛ŃâTŹnˇ–ĺ6]śľk‚— ⤫š>#5¦˛ą”ň%KeKĎ9HacngVľ•p–F›fÍEŕädť‘z]K€'0dKÉSWŕ†Í?ËȤY?DÔމ ŁĎvŽ Ű "±iĘ—Ä%¸4ěZ˘;’݉>(…ÖÝĆ{\ uNř±%YěĚnq‘łąŠ§Ę—,îD]âwÉ®ěVĘvŽbV"Á!5ŕqe_˛%4ä%ťT—KS€Ťąowí$]ŐDqÍUuź ę Ç‹l.Uď=°1·T3!ncJµíĐćO)ÔéĚ9ňÝ-IˇP´°&ß acnw,’ľ©;Ć_měĽ6źydŐnď,6vÍźJůŰ,÷ě¨ě¬Ňg°ćęčo/`Ö) >č *“#L,˝ĹľĚş”ÁuΖÚbÁ1Ś8 F•nEý¦ ’ěZ˘Ü0%ĺoÓž‰PąŰ’lj:9•«‹ë čOf%ÂwÚ\ņ„[ÄV†Tɦr…V^Lů+Sžu¤|É[śoÚž{ŞĚ–ŢUť>#5G¸ (_RÚ˙›e€ňÝFř¤±ôŔL¨ÍĎoSČę@oΑ䅍6ć–RÓနkk:ár"|IءíäŽÄ5yÜ L¨m놸)'íQľ{üa2Đeh7ă5—¤żaĽ€Yg¤ÄuT3SI_G¸X,‹C+e?–ę7Ť”AąńĄüŚ„,V2én z\«SډowI3żc(Ya€}™–h“.–Z©ň±D&D…ٵDŠ7|›?•ň·ąc1ţČÇNÔ•ŇîH0ä«GÔg¤ziEg˛/YqP0+ŮhŔ!˝Ěş¤oj´sŽLžđ¸"+ »–ĄQˇ¸S!oBÓ1‚|Ł‘OTv\Š}™…SÜ Đ{„6°›ńšKÔß0^Ŕ¬3R˛5Óĺ`˘|÷<‰Ů5îó9őű2+ź@áb‘ó2%şŤš&6hŃš·rU2w›AĎă\LĽu)ćwÇP0ű’YKŘÄä–ÉŠ ‹c(¨4DąB!Ď„ČO$RĘŹ?ŕ~|E:8ĹĆn\Őö©9Üm ďDĚ%;Ńě ĚJ¶ä!*¨ęś#uŹÔ1Äĺđ…/}(^){o§ôš{8ýu fťó°k‰TPzÝCý Jůn€ź;čćDAö¶jóŰnř(6ćG5yQ'TĎUŞi©‰jý­§G ~ŮëtL¨ňi2wëSÚă ŤIäo(9†l~§ß rÖ«ŘP°±řjýJÄŐE‰™AŮnąâ”Ş =yeÜl :głÉ˘ QžtUÓçň˙lä¨ÍĄÂń9v-!ŚtjŔ“] )#gY|,“ä Í9˛[‚]K¤‚CjŔĺĽ@AčŔťĆČ:Ý1V1î´”~\-µćë?íśň¬ó™·ş~5÷?ä˙F.ż_«ÎÔ=Ş=5Â&Ž#LąO”/ąăI'Sť@s'ÔŠ;‹ÎíŁÚhҨPiĐĘłk‰”ĚÜĄĚĘ[ź÷ňŽŞIÂUmź‘ŁťK)ß _xmË&&w©O6Ę4…#Ló˘rI^ž0çH·„pËq!ź0 ogét .‘`ó·ącTXnwů¦|7‚§đš 3Ë˝žţŕx˛Îxç‹ďĽýż}÷űo~SřĂď~ýgńC§=WŢ/‹‡ŃnŔ™·şhşČ˛¬X²˙öáÄ˙ymťd8;żúzKĺH†NŹüđÇ*ăs…‹źęąňţ“'Ol¶Ăýtţ¸}MÉfł‡ő RSĐćA[™mUď kKYŃóov.~ţ©^¸%/<ă} °ű[8(ś ‡ăĚ[šTBŽ)CĐ`ŹĄ‚ ‚ś:NůYçW_o1Ě´˛ĚŃßßoT'źřÇ·şÎH˙ü ůŁčÚĆĎŢę:óÖ/~{şOüo,1óŚ ‚ H}sĘĎ:ŔĎţsŠ˘ÄŻ,Ë:ŽŇŐś3_|˝őę?gśůçżkAA1ćř˛Î°TŻŰfáÎfhCełg6¬­ďĘżţÇ/¤lô•D4)j® ˙™_,üÇĎöA”Ľ’Č˙Ç/ÎĽő‹źýüźfî ąçßţĽK]AA9I}ÖąµĘ:źy«ëßţí߼^Żü5AŠ˘ţřÇ?ţň—ż4=ç÷žŔ„ăď źřÇ‹÷ťwÖ^}˝őjy č›˙"¸Î™/ľŢú⎝/üŹ_üíő Lüű«Ż·N}}ŕg˙!jLýËĹűđüěßcżŢzőőO[?óĎŻüë­ß\m©šAA*q©†•ęČĐ˙˝˙Ű˙ľč€ż˙‡1»?ű?7~>ĆŐéř篣żŘř´m^8sśwÖNTčśÍfkÝäP ëô yĐVćA[Ő;čÁZałŮŽ!z®Ač|ć­®ťť& üÍßüÍ™·ş^}­ó»†Î™/Âđ/w“žű§źýĂÖĎ «âÚü^yÝr¶·’Š­WŁŻ¨_śąx¸úżůxý$đÚŰíµîR9ß~µŤ¬kĐćA[™mUď kČiÎ:˙ň—ż€żú«ż"^•źâ cőüfyűĚĹűłý˙űFGą¤ňő˙ë·Wú÷$ńßţO>Ůü÷ dšĐ+” ˛đÓW_˙ň‰ü»›t QAA¤”uÖąž˛ÎđżţůŔĹ݋īĹb1Ź—Pńź>ś¸?<—ůçżóĂF_ýgű?ţÝÍá·îsťwÖ~ĂŘťîřůŕ§_Üyń·×˙éĚ/öó¨á®×Ç>{ýţđ[÷Ć~yçĹ?_ĎđWś3_ś”3‚ ‚ "ršłÎŽ´X`UĺßýîwŕŹü#ąšŐó›Ż=â·ż˙ŮÖ«ź‰ß—„€Ř9óĹ˙í±Ęu\Ťľşj¤V+3Ş’GAAN§9ëüŁý¨ÄýAA“C>>ţL?đ¶” '™đŕ©ýŻ rď˙Ą Ń}GĐŞůGŽj.BĘ=x¬p1qÉ˙5ű_!Q›ßuć~#Ůŕ_MzUß8çV ąÂAnsîĹ'ń}«w~sÎîś[-ÜęŘ_|t‰(ä\_ŇűŞ*ůčY)™ę¸ŢÍ-Ŕd HőŘ_îľqŢÂqHŞĂĄO%÷r…‡#gś“Ź>”Ĺ©ťWđţµ ÂóŁâɬ‡{–\›‚ŁżÜ˛Nń&ą”ę™Ú«ÓKŹů0šNÁĄ÷Κ«Řě/ w7»î‹ß3IXć‡ĚĚłČb6¦]\Éęť§^RŞŇ@ß}ޱ,ĎŐŹ%š«Z %űÓMó0i×ů+ăĄuäÁAnsÎ~”m”¬ŢůS”Ďü˙íÝ}Lgžđ»]]Őęz9ŐÔŤ8şĺ%ŃJ$BtË‹Č(ôŽţ’ bQ(IWć®ÁŰMtŞŚ%é`[H݉zIކ ˇ¦!ˇî?ĺZ"caŘ-B©jp˛'B"Ő‹{Ą˝ă®Ű7Çóî1Źř~="óňĚ3ĎóĚăÇĎ<3Ţ›'ľB&‡ÝÔý*ŮäÖu‰/!GËe®Ă-ݲňĚí‹ôľ_¶\¤jůďS÷ísüS¨Ą]ç’"µ éĄ}ť˙®\pź#zS¦ňLWĄö¦äČËŹţ•űËĂ4X&"zp—3 jB|Çí/§Ů'ú€¬8w&úź‹ţ}ÇdŕÂéŞ "˘śŞç*î,ĘżŠcPÚ>çžę|ypEľ„ěrďăĆ>÷&SĂw ”ŕ6€®óv!Ľ?ţ˛Ú7ĹÔg\™5gkJ¶)ś#!¸Wúw!±Ň®ő…Őő…ęâăäqň}â× ĆůŁT<ŰzáZfďDÇ/őî¸ĺÖ˝»ľ°úlŔŕ9ß“˝nÖĽŞ–±Úk5,˙áýń »¨(űѢ® ßU˝ŇÓt<~$ňčyânpă{ *ř?]ĽGç[¸-¸‚Üw¤č•K3ăç[«Ĺ#,Šís±I2É 6†’Ső\§d‰#/źÎ·dż2łÉ[g;JpëC×yŰQ[â&§ŞĎ¸bď19ń-Ő–›1gk'’çüćŁjé:|sX˙<®Šs «c\s¬€ëßľX!ŞT•UퟲA˙ŘŢgUVĺw¬ĘŞöńłܕĄ?Ńö“˝ŮżË»í«SrVY+?˘B¸.˛`ŠĽčkŹě,ŔděŕIţ…„í°č ®TYŐ~>ŚOÚ‰2°ýˇĘ3«Ü·¬ϡîP(AŮě…ň†ÄŚ®ó¶ŁpĽ˛‰ż5Łl˛÷€+˙Ą–é–“˝\t‘-ĂU6őQ§ŕqş™®Í·Y9Íż%·+Á¬ vđ$?U#a7ÎŃry”ZÍhiőľÎŁ®üę„3¤Ą;î(+CŻÄĆh'Şóöp{DD+›ŃgŘÁ“Şůٶ˝¸g,ŚAşVC˛iźĹfłRńŕnôŠŽŤ®nj]㎼|żkX¶Eé ď­ą×÷kń—ޤ۟•ŔÍ`»č›st ;Ř;´LTyfuˇ›ů”Ĺ= JĐtňwNőŠÄďuNń9D0‰ßUťí""˘Ó«-9ěŕÉ® QuöÝÁŐsĄÍľqŞŤm@} 9äěRÝ}{ťű¬ÍoŮ:ş~ąBayEßÂľź±~4ú˙ö±ZĽ,,ÖŰ—ů2˝] (>"Şî}NYĺ™ŃÓŻkĎÁÔÜ)*ĘŽí~Ű—CZqVś﫭ήíćşe϶Ň=ô︭­ ŐV»Ç‰¨:ŰŐ:ş~ĆIťí$"˘ÖŃő:Q×X űŃ""˘Ó« _<¤1ȶ_ Ü Ňx0mEßÂeÁ+ňÖĘb(M”‰ůY€y&{Ło\©îľ}.ÇA'÷>Ę]kí§5Ç,+ĎÜľxňWĐDü SĂTS•d.»Jű#Ź•żŇ™‹ăďV»(]BDî˘"7WýP[P‚ ‡ř‘fßŢ–E»ç~ň‘ÇžÎţzőËĎŢřŽ_1áÔ7ľhÔa@[$’Ľ {¨;vJň(·đƵKőŤ/~ňÉ'=™gzJÁ0ßľÜŇP‚ú!ŻôKo^_ŮńʤJ0˛dĺ?wbłJúÍ\—ëzݸvI­»%\hkŮMë«ô H둣Î)ź$•••é$Ŕö73~ľőĄuôş¶.”ŕ&ţk!‰'l¤ţ<Đ€ů0`ŽŇ®uĽ3aKC ZÁOhžj˛˘=fĽa@—Ä6¬ďƵKé>şÎ[Ř÷ź/f: ”ŕV‡ÔyĄňj«C fŠíż0á(č:oU»źř™Î-ĺŻeŘr¸¦Ś{óB„wNT‘ÖVc@׹ú‰hü?ŢŃئîůżúꫵµµŮŹÇR?"p˘ á6üť =X×”YáS!B„f†”doÇĆŚ:÷÷÷—8gđŻ Çž…ý扉 ŇŮáK>ݤßĚOĂńN÷Ř셶ƶnyăK3ž’N?]Ĺ"Dhf¨Öd°Űcüqó˝çůůůţŁG5úÍD´üÇ íuć–N÷ěwÉőv$ňąČď>ä™ć×ŐĽů\DţÎ+ÓĄŢŮn†îąđ•fg|÷Ú‹Äď®ĂŘoŽ9ꯇC‘p(ľŐĎßíb©Üóv;Q«/Š„Ď–'ťH= 0Ţ[Ű^Ć?Ĺ"Dhr¨ÖlźQg"˛Ů [ZZÖÖÖŠĎź,-iô›ŐL}4@DíĎ”Qů3­DtáŁŘhnn†îÝuńçwĺűäCţô&2Đ{€í-ăźâ"49Tl 2Űá1¸ëĚĎÓř«ůy/Qmqqß®]uęęą?Ż ˘;K}ęŽÉË%""v¸mż;ČôÝŇ=\m9č=Ŕ6–ńOq„šĘŰŚwuŚé:óS~ůůÍY’Óąk~ž:Š‹ŐzĎŽ¦SíťÁâ&=„¬Ý_XÖ|ĚÍ!"˘•ű Ž’b"Ó'ăU M2ţ)Ž!B“CI#`…NŽ]gîÍÍ÷ďßż˙ţ‘#G„Ď.9ťó zĎĄŢđŰíě(Ľś®ěě\_]ô–h¬Ć˛Ą °đýfµwf$ę:ł# öB[ěźgÚđę°ĺšcŁĚÇ“T„Ó=|yŮĽ3'i{łćw‰dcŘ~emÂé9„Ĺ3ÖśäĄ/Ł6×ÜJŘoV{a†ę6âîąwęDÄŽ4”zFCŢ2C“™Łţú;ćŃ"’?qv¸mż;ߕє·gŠň6€UP{q(ĹĚDY@†čé7Sr6ő×g»ďĽmöL‘xś ţ÷â•Fn›¶!áB|_ńň¨?Č=)‰P¶Š¸AVQ<ěp›M1~v¤ˇqdČ+Hłt3AüÓĘ稰{I§_”ţ•ˇ3ť~ç~{aĂđŠ4§G’IśŃG¨e%đ>őĎž-ŹýżÜűۨŠ„Ď–+$C™Ň9ŠvŹ®ŤĚv3˘cä4÷v3L÷\8t˝iE=Łä P‹SaŽVé°ż÷ůó˙Öˇ±Eęy¨#—Ôpőa´őÂQqp_âą*XßE˛JˇňČ’*ĎFĄ*/JĹ|V/8vä7î|_8 ‡|E*×B:a+)ěP<ŠŁľĂUXk`ún]—f”VTăF(šý)ĺhş2GŃ‚ "r˝ˇĺ~#ó0GW.9ęę2M–TyŃČöęU‰^OÁ9rÉ}Čć&"bún]wäV=Çť*»|XŐŽ±(W+Qžt•Ľ¤Žhb©éş5.źt´ńĂ1Ýş[ Ů©%ľ®Ĺ§©ÔÖ9*kî¸;ÂňĘ «śZ•MÖxjÔŤV×ú¬ŃŞ'@Z'Ë$éOň2HŇćúÍD”E»ç~ň‘ÇžÎţzőËĎŢřŽ[Ş˝Ŕ–4Ýcűč`ÄŁÖŮ€AOżY8ăŮÖ˛›ÖWi)H˙ŮÔc‚[Ç”·°ö"÷§Ć 1ěÉö›%Đu€m®ÜŠx2ť°€űÍ”ô6¶ ¤úÍjoŘPu®;v*M‰0_Rýfµ§ţ”?& şD'l|˙ů˙=öä_˙Í?~ąńí_ďź˙ü†ÄIë«´}»|´ëüÝúúŹúö'ëßűÍsŚ~fL†-VbDdÍb3(śÚ†{KÚ ú)ŃŹôĂ·Dôý¸Jë˙ťé4XÝ˙¬ýl-Í® IEND®B`‚fox1.6-1.6.57/doc/screenshots/iims1_small.png000066400000000000000000000421041326741342000206630ustar00rootroot00000000000000‰PNG  IHDRŻr%2„ IDATxśěťw]eµ˙?»ź>gzKf&=“2 !F-zą(( W˝Š\˝W˝ŠŘ»WŻţ,X( ŠŇ¤!J*é…R§÷Ówßż?ÎĚ$“IĎLČ÷yÎ3ł÷ŮgżďŮgíwŻw­ďúľÂşďüÔűÄî™lTŞú$~Y‘$ÇŔă|€‡ëx.ŕvíđ<¦K›pq°u\ËĆM'çLć¶'*Á c‚‚ź\đ }EüćŃŹ±˛üáěŕňţş»ßO8—±evÖCÚhéđ§=´wÚŚjĚHw:„Uö‘lŹÖ¤ÇÎ}iĘ+}L—·ŕv´á´5cŐîA ±Űę_–ń^đdDÄ0 "n§Tk€—5jDţpsÁőČĎőřÚ56şĽžQrGOGÇŤŐ¸Ôí`®ÄCł›)´S‡ýbĺe ×TęGýň×L•„qĚ‹tÎŮ>nç·¸äbűŞž .™$3J;v?>Ŕ!đ`łGs»Ms§Gm;Ôu‚î€ €ăBG †äÚ”Eʢó\QÜX^GÁ›îFĘ/ rççÁ6@ĹŞ$™˘’˘l»®GYf1őÁKŔ‘Ě QÚb"o4Ȥ[[Řć–‚ŘŐQAF0užţ÷4Í)?«·‹3˙uW”ýk÷°E,á[WKüm•ĚŮá–6E¸0ÜÎůÓS·qFóŰ·$>5>ŤôذĹŕüsЉîč`ę%Q&rŇŮÎ’ ‹› Wxj_źŻ1®Î.Q#şÜsłĹ–·EŞĎ˛iî”xv‘Ě˝×Yě{W&ÇßAEU«wŮH–…î‹0Dk& řI¸;:]r\¸¦:Đ„,ŔŠlkmeŰŢ! Ї˙ˇŢ+ďuŽ OPhIŘ4p%p5Đé~K8®LĆtŮP+łµI"eĂd7•Ŕ®ŰŤýŹGČ{ŕ7´}ů&Ľ–Ý0h4(H~d?H ´m ŐŃFT‚;ĎÄ’g^€š«Ađ™QĂ´·‰  ŞóŚŠŔšzö57鬋q;jŮ™Pđ<¶±ś,Í‹[dÚ·wĐpY ą) {5Ây6ŢTĆý5"9˛‡_É Z S#¨Š%YӔǢNĐ'!Ř«¶:Ć•1·˛ag=ČŐ”ű›IÉŻľÚν7)¬^ŇÉđ’ ±V™…ń2><Ą–őo%=:ţ%ܶ}$wŻĹ‹5áä[ŮČěG`Ň^Źę<Đ4Đ$Ŭ ěq`6{†^ Ĺą%Mä4Őózl^đ‘t Q]ěpaN=Ž“ ŢšŽ€mZÄý…ĽŰ¦¶âHž‡‡E6&ąµn”_Źx–ę–ą˘č9Žgš¬,ľ‘;̆]o#PłŰŁÔYYIQAĘĆz]Ŕ;Ă|˝Sçażđ>ú*@6,ëy]qÝ®}‚—HŔvÁ“ˇé]d%âń‡ű%®=Ŕî:Úz/şý>Ŕqáą2˙\ą{G,Ăő¤l㟆ˇS\TÔŢoőĆÓŢľí8lnmáÍ}»ąrČ0Fťö>ś04 ýâi´µ·€ ľ×˝9!dŇIÜłÝcĽ†aP6¨ ŰLż';tvZ€ ¨ďî;mí¶¦S<´n5Ůş‰v#Ŕ•/LžĆícjkÚiëË #Ä%lۡ¤$Çţç‰a[F Q”éö•äCÇYIVEĺ´wěD`Z&+W,gÔČa§µÝćTŠ?nx›Ç6Ż'föţŃ–É7–-äű+—ňťqǸ‰§µo' Iö!Šg`ĺ d2iÖ­]CEEůA{ÝľĆ+Š2–yřĚŘ™‚ÎŽöîÝÚŚ·!™ä×kWňÄÖŤděó˛˛AŚYÍŇe‹Q™d2‰áŘ|wůbĘC.®zZúw*EéŚ˙˝[Z¨oh<Äx˝nĂč‹}±NŰ´ž?oYOÂʦžŁŃ\.ľh&\x1•UC'\}ĺ5lß±•çţń4ť†Îż˝ü,7ʍćë3.˘ |/żĆűň™Lî8ÝH[& öîfÁţ˝¬i®gk[nת®Çu×ÝČÄł&!K«V­¤±©)S¦3ľf<ŞŞqŢŚ‹±‡×çżJGG;OíŘĘÜ=;ůpu ÷N8›˛pä=ţ†ď/ ńľđŇ|Ňű¨Çäćh\qůEýßřI ¦gřŐš•üyëF:ŤŢ„ˇęęqÜúˇŰ©©™€çyĽłu3/ľř<™Tб55L™2ťhN^ĎńŞ˘rý ·HÄY´pÍÍ ünĂŰ<Ľq-ç•fzŮ`.\EMqÉéţšŠŻăKĽąŕ)n˝ĺł|ö3÷łk×{ü'Ś©–¸đ‚ŻRRÜ˙‘q2şÍ† ŘŤµlbŠLŽm“ł/>śő¶ĽçĆkŘ6oXĂoׯ¦9s Ę"Š"SÎťĆŐłŻeĚŘńX¦ÉÂoďědܸţôŘ_xáůçXł~ Şz ä¤Č2Š˘R5d•CŘ·oÖ®eÇÎwXP»—µ{ůţĘ%L/Ě]c'2kؤ3Ťđs‚0 “ŠĘ)\=ű| ‹˛Łáş ď0fĚ•´·}Ž5k+¸ęĘ/ô{»ýnĽ_řŮď±%ĆŚa’,łoáB*FŤ"8¦šę.CÎÄýÝě csK˙µ`k[{ö‰˘ČÔ)3¸ő¶Ű©¨¨$“ÉđĘśéčhçöŰď`ĘÔéZ4’ @8éÉtéşôśŻŞj(UUCéčhgőŞĺlÚ¸ÇqXZżźĄőű˙v!_›~!TTť¶ďŢßPÇÖ9o| őÉ,5¶´$ź¶“ąsˇ˛r`Ú•ű;»(ŠO„žŕ˘Î[0ݏ‹źŔ1®ă¶ßÖsĚď÷ű~nőřáz.Ţ´Žo,[„ng]Q™:uşívWT’ɤy}Ţ«´·µń‘ŹŢɤI“{>ŹÇY˛xŻĎźÇČQŐ}ÎźÉdŰgnn—]~S¦Ě`íšUlŢ´t&ÍĆön{éi.­Ę·Ď»ĘhßϞɰ,‹;~öó×§ř„&ňw#‘’F.ç]¦é ‹đďßĹUĐvżŹĽ 8=ĚßöJ^łŁřß‘ëxöą§€F}ôîţnň¸ŃšÉđŮů/ł`ßîž}ăÇMäîOÜCEe¦iňÚ+sظqßűţŹ9jTĎqÖŻgéâ…(ŞB{[;ŐŐcpÜľYQ•#ÇÉ#99\xńĄL?ď¶lŢÄę•ËéčlgŢľ],|r/÷M:—ĎLš‚&˙s‚2ť×öÖCÚ˙1çÚbîřŰ‹LĽńzšÎşŽĽCS*Ĺoz”OÝ{Wż¶ÝďWhT8I}j­Ť<ö˝i >śĺË—ŕóU±ůrÔ·Wă†ýÝôQ±?™ä“óć°ľa?˛,sË-·sĂŤ7ăş.Ď˙ăY6¬[Guő8˘Ń\† Šëş,\đ›6m¤¦fŐcÇbdtćÎ}™‘ŁFSPX|bťđ< Ă$•Na¤t"Á\.şđrjëö±}Ç;Äbíüxő2ćďŰĂO/şśŃ…p%ú–eq÷=_ç|cĺeőďÄíz„f’şµ‹¨ťű*ŠDÉÍÍŰúź/ÓďĆë¸Eä-NČláąç–­äD6pÇw°rŐJ҉ăƱiíŰýÝôńz},[Ěž¦Z˘9ą|éË0dČžţű_Y±|ĹĹĄDŁąlŢĽž˘âţĂďČ‰ä€ ő Ě›7Źýűwóýď˙”§ź}‘üŕ;O”V)h> ͧAxž‡eš—•0ľfµű÷łyó:Ö6Ô1ë™Çůظ‰|iĘůgě(¬( 3¦ij>›ÎŽó©Ý§®ŢBp\·őE6ŕđ! ö^?™oăËýŢ~ż_•oźĆĄ—\JQq éTšËŢâŮşZ\Ó@>¨ŞÂ0 |ŠÝČ Š'ÇĚóĽlx÷änBÍ$Vż˝‚«ž{’ű&śÍÝ&źqٰi¶ăy&`61ÓćˇĎ^O]ÝvŠ ŻÁŘżŹ˛˛Ňi{@®DIq>đß=ŰK–®ŕĹ9ó6´Š«?r#–mŁeRÓ_řĺ–MŔđP°'˛ÍĹó˛a¬p8ÍçÇď÷ŃŃ#7żĎs(-)ĺúëoÂ0 Ţ÷×®% ˘É %±V4ÇdťxŔg7M“H0;ş8މt”r!Ű´I§Ó¦‰ë¸8Ž“}Ů®{hěGŕ쳦ŹÇůĂć·yjű;Ü5~"®Źz†”$ů|…¤RŤ€ŚëtP_߉$ŻGV"¬ßđš:Ś‹/śFIÉ$)NGx<đS\”O0২¨EřŃcG,ĆňÖ6&äĺ⺆“Ąĺ‡CY#ÓuťTş“1cư~ĂzÂáăĆŤă˛KŻŕÝ];yćoO"‰"˘( ŕ&Ôs†"H-M=űĮ㎲*V¦‰©›čşŽçşŘŢ‘Sť‘H„éÓ.¦©©ž—/aUC-?żdVŻŃ˙˝Âżßso-[Iss+ĺe˶¬CNS—leć%ăń<—EKV0iŇ„~oűä­ČH0Őv.žq6‡>%×/y•w2!.š2™âƤłjtV `˛nŐN ¤ĽJJr|§ÖűŁ@wl¦1!7—Śmc»YăÍËϦrËËńéĎ|ŽŹ}ě#|ôŁw1aÂ$^›ű2Źüţ·A”#<ž‡ @ÓAĆ{0úŽž}!š¦ˇiáś.ĐËÎŢ Ý@×uLÝÄ0zÓ.‹‹Ë>|ĎlYO@–ůŃĹW×µč7xk–/gč„sxgíZj¦N! ÁôiçörýuWź¶îś´ń®zýiüŐë”ţáGĽđčł„•’ovĐ »D¤;ô$G§®®‰ńÇҼg3ůĂGđĐwçÖŹÎÄ ďˇaĎnjĆŹcéŞÍäç…śăA¸ŠY—LG‘N­˘c|^>?ĚËNrV7Öcş.’("áHMÓ¨¨¨â;ßůó_{Ťĺ‹zŤ˛‡C:ť¦˝łöŽ"+öA4Éx<~r@QU! áyŽĺ`¦a’Τ1 “Aĺ•lÝş‘=±“lçTŕŮ<ö§'™zĹć<ń&ź˙f›ßZČđq™żtĄJ9{PomŘÍ´ł±pŐ; 3‰řţ]\”xž!mĹąŕŇ«7´ě”şsҶżż´ëĎœϾB{LŔíXAŘV9*ÄÚ˝IŁ•'6.ăŢ˙ü™µOňööfňś(K‡;ůÍ3óřřG>Â3s^%¬ ٸ”Ňł&ó—WçpÉSP¤ţs-ZSIüţ ©dY‘ikoăľĎ}ŠXGyŃ\ŁÇť×Á˛m$IbPY9 M ü~b±J łDYQQ”#—×8¶®ëdŇ2é ¶utÓˇeI’•˙ŢD_.Őc&±{č:–/z=»Zh×%˝m«ŢŕÝuµ ę‚Ě2…eKćłnWš{6…o,áË?ü¦˘(řŮă~Ľ§ÓG/Ł’d‰`(H0”á-ËBOë躎žÖ±ícsV“ ¦ŕ$ýÓöç†ywë.ÄpÓ&^Ŕ°ŞÆ!éHF b*ECĘcPHçÁď˙ŽŹ|ĺ{ÜčÔŃę)|äß˙Ť€ 2í’ŮL>ďěSîĎIZ‰Ę·ľóĹž­Ďvýťţ‹ź÷ěëćĽWΞŔ„ń]<€!.ú°AŮ;Ż´°ŕäşqśhËdiŽŞOCęňe…®BS˲ŔKăşńd’ ?@N$‡ÜśDIÂő\LËîaŽŠ¨rďHI2‘ěůß4OL/MQ”ĄÇ÷µM›L&“ŤHčfcNĄ“xŽĂŘÍîőTŐÇ_˙ŻěĆa}Ű,§¦këéçgvý×»âĺúkgőKú”˝ź!‰"ŞćĂç ÉÆ C’e2é4’$‘—›‡ač467˛Żs©`3c‚" H TůĐ&9oÂô^çu\ź/; ‡O! ďŘ‚(tŤę®ă’Éd]ŚL&CG{ů~?Cr˘'!Ţ'ř—0Ţa˛˘ąyřýA ńD‚h$Biq ŤÍŤ¬mXKĘ—ĆU7í ´Ër}ČĹ2bP&˝(ĆČňüAě‰UëzvdĎdRčúQÜĎËF S7ĐőědĚ;JěP$Ó †„ŁřOCśüLG·ˇ¶¶–ç_xá˝čËqĂ4MrO€:ŘŞg Q¤µą×¶ö6’©8;“ď’)4á)ů~A°j ź„ ¤—Ç)Úây«Ě ˘("wą‰xçńuDPTEU!Üŋ𸮋w0_XČN2mÇap?rţóę6ĆxßĎş ŠŞRT:śH”ĽĽ rrđ<ʦ–&r29ř ý}>نˇ“J§Ř‘NŁlˡ3#٧»b\ĆL{ípD_Ŕ‡ć×0uLFGĎčd2™ă–臒`˙ď?ŻnČ˙ •杖ŤŐÚ¶MsĂ~šöÓŇŇÄľý»ń©Y×Ŕ0mY"•NŁëi,ŰĹĹASüšź`0HQAÁ`Y’X°t!†aŕ÷pEôLć¨#o7A@óűĐüŮ'‚çzŮ,Z:Ťˇş~Ř* Çqđ‰ąţK«˙3á_Âx+"Y?ň`&›ëzÄ::i·$I"77Jnn%EE„‚ˇž8đŃJ¦öCÍ™ h~ Í@ăěpń^ĎsńKyţľOE (˝«©©™Ĺo­˘µ-A4'LĹ Â^$ŽÓ…’`E1zFEżĎÇĐŞˇäççôŽËXEw–LčĘÂĹťŮę‹#Áó0M§›Ľăe'fÝp§Ç}°]×u‘d ĐŹžŃ1 Űq…3«T޲,ćĽ<ŻĎ~I–¸ćę+¬Ý~7޷׬çÝݵH˘D]c ǧ¦|(Á@˶xň©9 ./dĆôÓgÄEÁ EAóű)-Ż"ɡ¸ř ‚'©ćh;6Š˘˘©–eěJ';Žstă„ěčo٦‰eZ†‰i94v0<ĎĂN¦.~‹ĄO<‹´{CŻą–Q_Buu5K–.ĐvűťĎ»mÇΙ2ĘĘJ:;:ٶműöď#‰0xĐ`Îżŕb6¬ßŔ“{ŽŰ>tC?·~xD}~|˛Ś‘ÉĐP·‡†:¨Ż«#•I˘* jW¨JQ44EFÓ|ü1Ý00MÓ˛H§ÓÄ1Bˇ‘H±X «Ëđ‰ᜣ/ŮQZŐTT­7yÇu\tCÇ6lt=ifăľ˝ŽqÂg‡÷P”—•’ äěŮőË_đĆ/Aç#ŹfSďqľřř·ůĐŚk™\YĂ”©SčěčÄ0 öíÝÇöw¶#ÂQ« ú˛("â8Žˇë¤’IlÇF@ŔĂCVĘ‹ËK5Â!?>_€!……ź_@ ĺ>|ík_éĂcpçě´#A”Äěg!‚c;x®G:Ó=‰3IĄ’˝Âkg ęęzmýöí? ń®4¶QI3ëk_džJ&WŐŹĹŮĽe3˛,ŤśŢĽ|Ň40Uó‘_XŠĎďgPĹ`&źMĹ  † FĹ  JËĘ))-E–eǡµĄµąÜď÷ÍŤ’JĄ°łK927šM$“IB#W»®›ő]uË´zjÖ<ĎĂvěží#Á8Zęů=DůŐ¨ ý®Ó aK !1ˆľÄęEąbĐtt]'/7QOëZÜ–ăŕz¦ˇÓŮŢŠŞ©ÔŚźČ}÷ßĎ›oÎg÷»ď˛íťmlܸž˛˘RlÇ&™J±műV†ŹČVNÄ:;ńüĺŻO ©*Ş˘’±Äu-ËÂw”0–(Š=¤Ƕł#[1á¸Ů:¶ŁáD8§‡ŽĽ§ 2ňžŞˇ˝äMƇ®$" cĄů:†aŕy¦•­ Ĺ÷ć‡p‹LÚÂqöďŻĺ—żřź˝ď~DQ¤ˇˇží»wô{ÉĚË|îTńoĽń‘śímíČŠŚ$IH’„çąř|Yu]‡`äř’,ĺöXöó.¶eőř»‡NćҺΙgČâ=yűű„ŁFT1Űv-•ě~ÎB‹µMÓ-[63vĚ0nůđÍýÝôa:ÎđT’‰™LŠD˘“yŻÎĄ®~ńxśDň¦TŹĄÔ*ĄMŤ“ʤXşt)~żźÓ>|ZJß»‘˛l,×AÄ„vĽKn4ŹŮłŻĄ¸¤”Ë/żśŞĘ!äĺPXTŘ“ňŐuťŽöl˝Úţ˝{yň/¦ŁŁĘŞ!]•§ÝqWEQŹX¸ Y·Ár,\Űí"ńXئŤnč˝y G€ë8śy±†ěČ»Łą™Éí[ąj%®ëđˇ›0Î;ʎÓĎaĆôsxę™xeîë >’ç·­ŕĽéçpíěË©¬|ě“ rr"=4Ćúúzć˝ţ*mm­¬\ą’T"A"§#Öž%' ±-Űvpl›§ţń·ÜúáΛÓuŚŐ‹çp8(ŠrŘ×±ťž‰śnčYwᆚaęśyQ^¨=’ßÍ{–9/żFýň•´®^ËĹçOć˛K/Đv4ĂvËM×rËM×ňŇśWů·ŰfżgFë¸.®çáy.‰x®ë˛nÝŢZ¶Y”‘e_ŔŹ˘j”•U …Qýţ#fÝ:Z[1Ťl¤ˇ­µµgżeY'ÍĐ’d‰@¨«Ă ăyžë‘Éd˛ú†Î R.OEćú뮂ëBĚôđč7ămÜ»“ĺë¶3íâ™Gzg®f`Šđxł ÷ŔL>“Î’ÉsrrĐ4?šĎ‡¦ůđůüHŠrĚ…Cá0zć@”!ĘNŇQ<ŞĽ©cۦ‰Ąg}X×qłţ/^źTńá`:Ň™ŕ÷z.o/]L}Ěcć•8ĆýÚľo7 µ€Ę’ţŐ,ë7ăýöŹ~Âĺ7|©u;|v=ů•ěYąŠÝbÖ W˛y{Ł“ŕ'×KĎhŘÄ8wĆeś=fHuă¨P4ůEehţ$9yśdE‚(IY#Y–ĐźŤí&S©ŁNŘş# ˛¤s×q1LŰ<(]lšG ™ąŽ_>ĎżvSH IDATćŻĎĽÁ…5EĽĽ(źĚŢőÁ<Äć˝t S& cĹşw8gĘ9,›»ö†ýXĄS™04MqE —÷Cĺ0Đ‘—ď?đU¶ÎšO˙ŕwl­7)öű>r ?ţĘ÷ÉJüéĄĺ±eő;\vĂĹ´îŮÎ ‹7őWŽTwĄˇÓÖ\ĎćŤëhi¨cß®í4Öî§Łµ…t"sśéLĎózŚ×±TUĹuťě‚Ď'Qńűý„sÂäćSR^BĹ *‡UR^YNqY1ů…ů„sÂČŠŚçyHgČňşV˘™§—l"×ŘĹÓ ·R\Ëć ¨Ć~úËSÔŚÎSsßd&‡ÎGÍ9‘R1}¶/çdŃo#ď÷ňSÚť?úňGŘľe'Z €OŢ=›Üa#řâ7ďçśIç2˛(‡=qŹ›?v;>…ł¦ÍdôäéÇ>ů)"~lR"Ăq]R©©Ô"¶*«‚A"9QüˇpźI[7<×%–Ě*Öd2iDQÄ0tTí裢c;ئ…nX]*;®ăf]†®0ZO¶ Ďé]]‘Î…NŻ(÷á`ÚyC™4(Ě–ZŻß}íž„ťjŁdŇÇxč㼺h üÇ'¨­ŹQ=(@ă­„†ŹĺóÓ‡÷[?úŃxh6T Ńë˝içL`Ě䩌9h˙ěŮýSż"‰d"I0&‰ hŞęCŐ´#ëˇHĄ’477‘J¦p=UQł¬cŚĽ’,eˇľl¨Ě´p,˲ql Ëq0-ë¨a3ĺ X9HUµú á˛ó0Ż»&«ŁVĐĹwľöš’Ą¬Î4ttńxU%ś“‹a;44ÖŃĐX×çXQ{Č/‚ PTPÚţRUÍçÇq AÓ0E‘t:Ťŕ˙#ýH!3č ›ä ۦŤaeźGáNü«á_Âxő® "ÉÄ;[ąř‚ 8wҤt•¤çääŤćŕ„đűŇQNĎdhmi!Wp@áG%4M#ťNŁŞG绎‹ifu\7ë.tĐmÇĆőÜ7âpű×!¤śÁ+ĘźfüKč6tŁ;#&I"9ąąhކ˘ůPU źĎ‡˘feGĄk.Zř&ĎüýIÂámm-ĚĽôJnţPvi.]71«·k]ęI”˛\^Ó0qmÝĚR»fÇţŢ:aőČ"~'tŢ#ŻnCC:«%†)-Ż"wzÚ0 ^}eăÇŚC†TTňÎ;›{Ţt‘r÷pĘć}!Š">żźßGwÔÓór˘řUE–4Uë51;>ůÉOń›_˙’íŰ·ńÝďü¢‹ű÷ %dGqÇq°ť,“Ě1mL3Ë->lŰBq=˘Çţ+á_Âxă]Ćk[:±ÎVb1EQńů|¨šMÓP5?>ÍwXCG"ÜőńOňěSObŰ6±XŚśśśě*>îńׄâEĂů®ëfSĂş‰nęXşŐ•8˘ 1Ăf».ÜľŤ|źŹ›«NOşý˝Fżďú ďNë */AŐ”^÷P(Ŕ®ÝűillĺěIcÉĎŹ4f=ËÔ±Ěę6‚(!Ë Á``8B(ęuŘşu»ßZŔÂo˛łŞšŻ}ë{虬˘ă©BĹ>FťťÄY=ĄBéT ź":´ęŘóXŰÖĆď·ogCgW••a».ň’;Ű[é/ŤÉt:Í˙ýňQ.ť9ťs&OěóţŢ}µüí©—1l07\ß˙ ©~7Ţ`ŔONNd*ŤŮaâ÷i<óŹ9äD˛ţ`{{'y RvÚŚ×ěz,ű|ró‹ş*˛¬"Ë2Š˘ŃuH&<ńĐ˙ăśmkąĹ/ňTĘáú+łŞŕ–ež©Ţu\ #+´×MŔń<×9p÷Ä€»?Óőżm[ŘŽĺ8ŽĂŽxŚ]ń8ë:;±]—iE…Ü?v,Ł)˝×-‹ -M,©ÝËúÎvg ć|ńÓÇÝçŁ!PYYÎCż{śŠŠrŠ‹zŻ•üöšő!ZŰÚxčâŢO|´_ÚíFżoQq1_|ęY̲Îu“ĺ2xÔ¸ží}@ËłsxŕżOmůÓăE·¬ż®§‰wvdÝźźĎÁŹ|„uáŇ©úŢ7¸±Ł–W2&/ĄL**ŞččČr‚MËB’˛Ć›I{Ň#J"ţ€ +×”5f»kŐŰ´1Lă!7ĂvŘÓŮÁ Kľ,“ź—Ç9yytč:)Ëb{K#«k÷ĐL˛;ŢI›™!%{Ś(/ć’iŁY˝°ťńˇţMÓŢ~ŰuTU–ó«_?Ćg>}gŹďÝ»ź’’*‚ÁK–.aBͨ~mŔx ťâýŤLĚ+Á˛,.\Č`·–Q Şą$âĆŹŹ°]9«ż›>"JCAč :ŽE*e‘J%z#+*>-KH÷űCCA–-[JÝ®íüXóŁó9ßmepG«ć˝Ěe—_çşx]a8÷8&]‡"kĚ]ô}`ŰÁ°˛ia˲p,+«[ćXÜůú‹ä„Pd‰ĽPE’„>˘!y!†ĺsAA”đA•ĚiĂdËľľ|Ţe'ÜĎcaú´É€ŔŻ~ý'>ó©Ź’Ńuvďi!‘H±eËFîúč- Ú˙…ýnĽá°Źł&NdâÄkɤÓüuçNЧŢȶŽišű*Ąů«¦rlYÉ&͇˘ůđů´®É›Ż‡Ëpî9S1 ‹Í+–pYăNŢ‘%ći>u×'QĄ'{Ľpl=ťu Óč#kÚť >ş+7îľâ<®ś4î¸WÜě†nšt&RŚ+č‚ ŔôiYŽî˙ýňa&Lś@:ĄÓÔTĎg?ó1‚ÁěwăýÜ ˙ÍóË_˘äĺ~xĂ9W¸¶¤„G^y„GÚaîÍsy9ŕçß>üˇţnúPU?…e„Â|~ß1 @Vö¬XĚÔÚť<•2hÉ)ŕ‡?ü_˘ą'§ )É2ÁL0ĚĘšštlÓ‚#Äw!Ëu°,›ź<ű/­ÚŔWnľŠÁ…y}Žó<Ź”i!>EAęJ‰{e…ˇŃč€if”•R]]ÍňŻ~Ť†h”ď=ůđ€. €ńnr7‘ß–ĎřĐ8xćŘW\ÇOű ŁSŁÇ4Ö7˘(2ůů§KčL3CkK=­- =«ůýě_źżĎ¤-™L˛f÷ć%ÓTŹËůcĆ÷2ÜXG'ÚIĆ]Ź63LĚ.9˰hooeÍÚĺ]̲wö7ňăgçň‹{oď{^A ¨Ştdtębť„4•¨_E·,FDó(*‰>ź:uěŮłŹÝűÚ0Ó:ű}~. …Ůř©ű <öJŠf´ďwă­ŢVMîYy<±÷Ż”Ď,ç[­RÉç~‰¬ČäGĂ 6„tÚ$č_’ÉńĂĂ42F†xg[×>Uőá řńűC ůę7żGG{%exűí•˝ÎbŰö o·ĽS÷çÝźŮíq#şe’(±u×FÖ¬YŮGE˛ˇ=Žiۨ˛ŚëŃkýgA€Ľ€ż"SŰ‘$–1©mneX?®eŃŤeËßfďţVŞŞŞČdtZ;ŰřćźËë×}†eĹťźbĘpżď|éMF׏DČŮÚ˝Vd Ü—˙ť÷s<®˝ćôeFş ěPŐBQ”Đz~4MCî’.í…«†ĄjčPvízM;5^ă88–Ý•es°-»çeZf/—ˇµµ™µëVOÄ{®Ş˘|Ô.ßÜő\Z“lBšLPU‘Dż"3´ Bs"ĂNËfh?kÄĹâq-y›––F ÁËsćđĂ|•`ŔOâń?°âŽOP5t(+?ú)Î}ě7””ôŻ÷»ń>2ăw´¶¶ÍÍĄCëä{oü†A ÜWń őŞ`8äĺĺťÖ‘××U´(EĹĺř|Ú‘Cd‡C[k+ŃŁ,Üwč í‡C·DÔ‘ŕy™tšoľŽŢŃÄ·o»Š-űëřű’Őt$ł"{˘ 0ixźżî@Ô@E CAÚR:őťi M@• ű">•’HT:Éđ`˙Ů~?U%Ěşâtëµ<ýěK47·ń•/¶×űSgśO>Ę–­;¸é†ţ×s8%•Ȇ˝;X±n¦ťĎ˘ě¤CHµĐd†^‘ťŘ´nßÍĄWÝÉĚšAýĐÝÇ+»w˛7ďµĎq,śŚ…žÉ&DIFU5TMCQ˛Äô@0ÔËëjk©™Đ7zܲ»Kݶěžr÷ť;·B˛•oř ôŽ"H˘HEaoUriťÝ­q|ŠDn@%ěÓ¨Ě SO“ÔłnRĘ´ŮÓÜJtŘ„“ď3ÉëŻ,˘hěΞMDÝ|ălę6­ŕńŤ ś?u c†dĹ÷¦N™ÄÔ)“ŽxľSÁ)ŤĽëĎEy?úçĂłXúöf†ĺX<żŃÇÇoÍĘ·73şHâąu+‰·_H(ŐĚţ¸GC %ęĹŘ´«‘ŃŁ±sśŮłŻ˘4zęˇÓuYŐŇ‚"Ŕ/×d'YŠ$‘Éč„#y]"#Ý…—ęq ]745âóőîŰÁËVDZ`vŹnĂAĹb,ză5¦Väńá oîńcE6fă¸AMíá.ä|ȢHC,E},׉úUňE˘%©cš6ńT†–Tň°ç>üő×?¦rÖ}Ś-˛ůżßü˘ŇRšëö!¸.B{#™Ň1,Zů6sçěGTü(ţĂq_9+7µ2v|„†ÚnýČNíÁß/n¤É<óâÓ´×Ć)źu1ăÎŞfî+Ąqo'‘ ĎaěčJ^xéB˛@:f3ű‚<ńôËä¤öqţ57ăS},xĺ †ž5㔍w}[+?ÝĽ™ĎTWłz˙nvt¶ ¸gÖĽU— o'™”PU5ËqP}=\‡,§Wëă 755˘gŇ„C˝_R©bφiŕ?Ć*=ŽíôđuöîŢĹžM«ůĘő—RQÔ7`»Y·B•$A ¤)č–ŔľöŞ$ řŞ aźŠ&‹Ôv¦0l—ö´A{Ú@‘šJJ7HdtVÔ×3{B˙~4îXAR+fÓ˘…XR€łĂ-áŃ”yňO1ý›hŢúíf» %aäyłxî—2űßîŔ¶O]ú”Ś× –2÷ˇź1aÚů\1ˇ’˝mS¦ŽcéâŤĚ}3Ťm:ŐŁł~Ă;\ý•/˛{ůäâ|Łűî™Á¸R‹VnF D¸ĺŽŹ1}Tá±= ¶vvňÍőëůJÍĘ5•;×®"?â§ź¸QYÝĽĎu0ô †ž˛.…$eעČĆC!´®W-x“ŇҲž¸nmÇbíDŽ‘Ľ%Á°L‹e‹P¤X|ď#×:‚ µ, tf,šô49~Ť°¦ŕSdŞň#´$ŇěďH˘HąQżJEný©ž‚SËń°“ŽDÓ¶Ů„Čʼn â¬ ů돾Îä+fqA•Ę ÝG2ŃI®b Ča”`#†đô/~0x_ž=†íµťŚ5_a9˙đA–mÜ…ÖsžS2ŢŮ7ÜĚěčěvk2\sÍE˝Ž«2€Ę«/ésŽë®«`Ň)şcďĆă|aŐJ>3z4gçĺńąůŻP”źĂWo˝ŠŠ˘|:’)\×Ćç ô]ŞŠr %|„ČĂÖ-[xńĄđ…/|ąĎ{yąyÄÚ˛ň§şˇ=FĆN’É8+–,dÖÁ\9yÜ1—ĄŠú}h’L],Ec,MŽ?;ŇG‚5…¦x†ćDöň)DiÓ"ŢĺďÖ¶´óű9óąuäľ{ÁĄÇs)ŹŠ .Ľ„ .<ôwě]áPY^Ćążű}ĎvőÁ4–Ü‘\W5ň”űď2zƱůöúu”\V>‡7¬ˇI˛řŮ'o%Đ5zúT…D,N:ŁSÎéED?\š¸µĄ…9/=Ďś—_ŕ˛KŻd|Mß»+ gŐÉr[ʶŔî]ď˛jńë|ĺć+U^rŘc,Ç!ˇ›ř™€šť0úU™ĘĽ0u±íi“ö´‰*gWÂś˘5ˇÓM’şER·Q€¦ö8żqź7‰{&N>a>Ä™Ž÷…ńú%™˙©™€î8lkiâ'«—q팳ŐüŞJgg;ŻĎźG[k3–••^R4…p$Y–E‘T*MKs3--Í :Ś»îş‡Ë.żâ°?ĽßŔî’ŤÇă}Ţď†ă8¬Z±Ś–=Űřáť×Síť÷Ľ”Š$‘ă÷ŃśLÓO řk2Š$S‘˘1ž&–11mʦD†¦D†źJÔŻ0l×Ăő<šÚ;yüŐüü‚ËYu’µ~g8Ţ7ş #"ażyŰ]ü`Ů">ő˙ţĚ—o™E$ŕç…ë°=¸ţşńů4dEÉ>˛Ă´H&“¸Ž‹ äćć’źźĚ‘JSUÔ®Jâ#ŐˇĄ“I^yĺEFD5~ö‰[ń©}cȦc“4,‚jÖ§•DŇH”aRKÓ÷ŞYŁ.‰(Ť‰LŹ®_ěj޶x’?ĎYŔog΢¦čđ#|7>ĐmxŹp$݆ŇP˙»ějŢŘł‹ž|…şDö‘%™Ý»ßeČ*T/[ł¦i>"‘(ĄĄ'ľ(H7%Ň4őĂ Ž456đâóĎpVe _Ľń äBrʶš,#‰őťIl×#7 ńi5•!ů2 ±î¤C )!ăW) hIfp©sKet^]Ľ’żĚşžŞăfů@·á4ăxu.©ĘĂ×°«ŁČňeýë_2zt5çÍÁ Az´DQÎj8¨>€`(LŔčJ.í]ŞčŽăd%N»ŕyë×®fáÂ7¸lÂ(>wíĄ˝ Ŕö\âiE k ˛(087D,cĐ”ĐiŠgđ«2Ń€Fy4HGĆ 5™] ľ=ŐU -ÂÁš|-ťqć.\ÁʧĎ<.Ă…tN;ND·!ß×[Ôq6oŮÄć-›<¸’K/ą„©ÓĎÇç Ë2Ş˘!ÉÇ÷c655÷Ůg™&ŻÎ}‰mďláĆ铸wÖ…=†k».’ "YµÇĽ€Źöt†ť­r| yŤhŔ‡O‘©ëL‘6mҦŤ$äJÂZS:VçŕP©iZĽ˛x?ž6“áąÇĎű@·á Ćç]„áÚĽ´kÎ!ŹŘöćF”¦ť,xę]ČÄäs§Q5tčqź»Ł‡N™ESc ΧłŁŤ˙ĽárfMßkŮXXĆŔń\">E’Čú ¨2 ń m)–%ÓTä…iMečL›8žG{ĘLT©ďŁ •ŃůŰĽ%|µf #€öx¦â}oĽyţż˝âZZÓ)Ö45°?ŢÉKďî`G˛“ź|âV*»2[-ť žyî1nMrÎÔL™:ââ’Ł» íířâó.\ü&Š$ń?şŠ Çe =ĎĂv]IB˘ŤŚi±Ż=‰*‹äveÉŞňdšăi:2&IĂĘŽ¶~…Âźö”Ţsă™Nď0cüqÎ|ľyöyLTŃĎWďĚĆ€ď‹s^í#7qâxŞNóĘ@ —ÉŞrßV]Ă/xŤ/ţţ︮KsK#s_{©'TöŃK¦ő.dŽçёȠÉ"!MÁŻ*TĺGh:(KőűČúúcilף=ťťŞ˛Ŕá2-›żÎ_ĘgFMŕÂÁUsáŽĂ0ůĂĂOłoß»|´RBĐh[ mm§¬¬¬çŘQنpé%Óúµý5ŢyŻ/ŕ×Ď˝Jň¬R,ŤŤ\şa+>đ…lú¨Ş*żş|6Źm\Ç—~†»/?Źë§OBĘňŁü÷Mł¸÷Ę O/}›ż=ńżĎčDsň8ëěł©?qăj†B44ÔłmŰ–^çţó‚ĺś=˘’ÁEůh’Ś,‰řd-$Ó™ŃŮŮ# *ä4J#A˘~ŤúX’–d†–d–ľXŇHš6I=k±¦ÝWţ4cX<ňň\YTÁ-ŐăOËu;bń4—•U`_8•GGŽÇN„(úôŔË ¨ń>˙â·9řnćĺßťşŚáŇĽlŻá’Η˛ŮăĆťă'RţëŐy$ ;.žÖăŁćýÜ}ůy|ä’©,Ţ´%[v°~Ő[ĽůĆ<,ÁűP–ÍöÚfF•—Đ”Č`;9~Ť¦Ű5k<âj Î Ńž2čĚd,‡Śĺ ˛Ř{RÖ ×uyvŃrĆ"üçąSú2Ś?-aů ‡Ň©Ó¨9ĆbŠýÍ:Äâ0.'Ió ŤwƇpź«Ůtă¦ŃcyöÚ[ymůF~üĚ\ĚCjĹTYfćÄjĽýZ>~éy@v}ŕĂ.dÝ„!%‚@I$@nĐGS"ĂΖő±$žç1$?Laȇíx´$uvµ&Đm‡Oî©öu<ď°†kŮŹĎ[„Ëđý /;&7â˝ŔĄ-ĎRäŐx;’ínlj描üŤTzˇĐ­ě\ąš˘ů?D~î©^űâ—cźXRĆźfÝŔÚ­{řţß_écŔÝ^VDAäčü…sGĄ´ ·gˇîěd,ŚO‘e,ö¶'ŮŐCçńu…ĺtË!©gÓ»G‚çy<»x9µuÍülć¬3cM¶Ă༑!ľđ“?x;bE˙xa>†é2ĺś)„‚Ł9OőQ˙‹˙#4÷Aś… hmkgî«o DÓ'Ť±…E<}Ý­´7´ó•Çžˇ5Ö·@|dy1ŹŢ˙1ľpĂeś;j‘.*Ł(ŚTĚ§Żş˙ůĐ,†ÍŽ–XWĺ® Ŕ hŇHAČú°Í‰ űÚSČ’*űiäyóVo`Ű»µ<6ëĘĂ‘~ż§Çq¨««c¦÷Y WŮüé±çĽÍ~wL^}í JŠË¨­ŻE@ ťNSßPĎ´©Ó(-ŰK¬łźdÍÚM\yE_Šä{‰yů<>ű&î|ĺÜ÷»'ůńÝ·P–×»č2 i\}ή>'Ë23m‡Ž´_ kZV7AÓhIč´§u†…(@اăSŇU˘Ł[ŮLŇ8>ĺ e[v0gĹ~=ó*ĆŚB Ukpăö˙ßŢąĆ6užqüçăűqěŘ&7Ç%!! Ŕ(LŔčJ[Dą Ýh»˛uŁÝ:i«¦®&Mc«ş{‘řPišÚIۤҪŐ*­ŞÖQ±ŇvĄ…)áV!¤ ‰ßŽŹťsۇ :(„‡€ň“ŽäWŻĺ÷ë9Żźăç}˙˙—Y´g[6çv,aâëŮŻäÁŐ÷óÉÁŤ~Á6›Ťh4JWW‡Bkk+Í-͸ÝSS$ąČ“Ç+ë·PćĚăÇzÎţÁ+ú dEed4!uجyÝČ#:í1’)tĂ Řç&śďA-áĆd…sĂçŁID‡ŹóĆK˛rf„wţs„'ć/bcu­©×; d9FŐě2b±(ápíĘìúÇ6TÂĄţ±#ŕ7ßü0'Ź„ŐŐ´žl%Ęz˝đ»ç( Ý>•źn‘W7>Ä3ű˙É˙ř*;ÝŔ’ęlĺÍb—ÝF\ÎĐÁç¶ăs9)ö‰x]vzc)“Ü+AŃAĺ ýq™Äč «h—Şe7Ža8,ŹÖÍżţ›'—ÓÉłĎ|źxřđ•i.đůâÔŐ•Qß ˘©At-4^wŰë’“ŕ=zDâµ×#d·Ř´óČĂ›r1LNív^\µžç?ů7?ßó6?yh-KëŞpX,@ľŰ‰č°q!*ŃźHE>zcń´B÷ŚUHăwŰń[DS7'D­¨v‹…BŹą~fáóĺńŔý+(/3˘ścíš z{†HJC=ę#rSTxU1Yt$\mX_OJž\jpąn•¬Óİ[­übĹ˝ą]ězó]_-qĎü9جVňÝٵ ĺA/‘¤L$™a0™Áë˛ăw;ń8í $dTÝ 2:ÓÚ­müÓO2ťF0,ř]ą­3ŞŮ@V[/55â MŤçĎG¨©žEĄÉn¦o_W;‡Žµ±ěľX·v)ën@Ĺ=q±›>ŮEuůÔM)‹Ŕ/َ(ÄÓű÷RwW1EÁgbäąěE7…^ŹÓAw4I"­H+Ř­|.˛˘"+˙Űy3tôö^ uЎóéÁH®–}i6šBŠ[iďwâóÜłÂ<łěË1-mxţ÷»X˝ů›tź#$cI:NśĹSZBŁGÖX¶d>‡šNĐp÷"š?<@,ˇ[+g×owŕµOí5Ą_-›ĹÖŞZţĽďc~ý­ĺŚóIDAT-xťú):cwVěŁ/‘BʨŮÜ6•Á2ÁŮA×u޶wžÂžĂý§?â­¦!‚Ăű8ŇRËś˛bC2ť=|üv+»_ú%ĺĹćźż`Öý›źý”Ö÷ţĆî7ösęěYNžiç|Nµ4r´Ą“|Ű0řëjćÖńćŢ÷8ÝŰÖ.aŢÂS>p/±­v>-ť=Ľ{ü ±t†b݇™ަŃ“ř,Ç.DÇXĐNô!ĺÂ`„öî^¬ĚÍěe&†ˇŇqúmgh=ÝĆ©‹2e59 \01x›OµĐ°úë<±é>N8L(ĎĘŕąvŮţ=<†„mćr^~áWRŠťO?Ĺ“;62{éJ*2 %WrÇćR ˛¸8ÄÇO2Ěpv0FDĘ0#ĎMPt˘•GNŤ ʆÁľĂźâłŰŮZS7ń̲kjÇ~ŢjN°ăkë( ”łeÓžÚş™Í[jčꟸRĎŐ0-mXľrÍŘë{WeŢď>™me÷ ˛}%ÁŔh{ĄY§s‹Ŕ7ęęyöŔżt ]°^±ŰÁmČh:ş×8g.ôr¬˝‹ďĚ[@ˇÉ Źf2«Ľśçvż8ÖžŰpYçśňśŤ{Ç/F7›ĺá2솅ĆÓí¬ýňB˘r†UG3 dĺężc†aOĄ&S$ä4#ŠJB–Q5Á>QĚĘ9ą]ĚđĺáÝ˝ŤÇqYm|»>7Bu·;“$4zçPčń°°°„wšš™7»«Ň# Şn“$z‡˘ Ĺ“D‘d’ˇx‚ád uśnA>ŃM<%óřÜ*˙ď=1ͤŰ0™,.)ĺý¦Nvţĺu¤tv'o‘K$ěőR’ç%ěńQëâ”Rčńŕ´Ú(vça [·@ë&ńÇRhK¨K»”´6ťÁBÚ˛î˛í‚Ś f  „ (ĚĚ9×ýÇ™ßs&™„„É$ź÷+µ3g®sťëś É7ßů^çßxlˇt]J©K‰úč9!TŇ—Ş€!3Ş@– ‹ ż‹*TUj~ŠĐ áW@D)٦zDŁđ¦zDŁ•Śüő§ZÔ«=Ć˙yLxýČÔŔ« Ó/?ŕ‡O@†, |='oëxLŠH@JiR˙§Źľ óć[ĹŘ1Wg+YŮ0F…%WI c4P- $Źu=áKD4Ôzů·IDCŤż‰R(ć7 ®CóCµ„˙›Č%_ě–ó=pö>:˙‰#ŘŚóOűhą”R]×uČ˙ďŁoŠn˛\5Öźˇe(@O7˛˛qIC–^ ł^#š÷@¦%е7ń8®0ËlQĂOýÝÁŤŮ±!«â‡n ?íé‰zµ'¸ŁPEÖ_MďéĽx¸ý_§žX,,ň;ü\÷ yńś/[Az|»+ˇX 2,–)U©°(˛GĘ,!Ť-˛„„~0ńEDDŁŽî•©Ń(Ąd Ý+e–TĄ˘‰đ@â’&|R¨>hšîłH©Á§"C"C Ą «ý:, ¤»EËţKČGoţ·)_˛H)ŔwW}B^ř8°§%Eęş®ř• żO@±đ*`ÁHCűE÷ żŽćµčú""˘Q€y#˘”é‚@Ms ęY÷€.uHtKRÓˇK¸(H/ A¶ń@“„ć—żńŞ@ŹwăWAŕ3»1!ⲯ ěś•˘gBUd¨xDÉQ†]—ľ`u¶źĄ^D)Ä?\‰hTŠźm KhRʉŚČđoËJ#VöűŔ/ˇ'ţz%| ˝Í';pÝ!.ʬ«LG"‚C‘đĹl”š.¤štčÁAëüÄŠh”Ęň‰ÂŚę‡n8ÎŇwë_Ůxúĺ=>ź—ŐɆÓ/żŮíÓü2CŃž¸'«úŃ܉9}ďŮÉwŰ^ţĹ_|š„×áC÷Eř/°ŕ|®Í‹koŢ{(\€`Ä,ŻAłĆĐ™(E$?ö!Jţ$˙ťFŕ/ýôdŕ”ş(^ô° ÇcěX%ۢ_{`ldîÜ,ä¤]źÚ˛íg‹ýýńN‰'NB2ÍzDn<”iöóób""•:dÓ¤gz&Žç.ČłĐă×'u~š)áÓ¤¦Á«ˇÇ+/ö࣋ڹsç®Áńťëgç}ĺÄ tRÖ@ľ~Ë™ď=«Žź(T‹ţń9íŁłŇŰŻWę:4żÔ4@Â&ý^éí‘Ýý>:{î܉Śk>ýňóü3Ľ>ř\<ĺ N 'Ŕu% ÇÍ€’ß˙ˇĺćÉBUˇZ„%ş&u żOJUR*RHHˇ@ ´Q,źěxc&dfŔ§AżĘ–K‘P2ˇ h™đŞČTˇ+P°eŰĎćĚ™SöÄăO”ýq«VW=üWţW§.•u6°T(µř·+Q ń QĐGĺů‹°¨ňbŹĽÔ/Ľ>éőĂç‡Ď/5^ż”€×źź&5ŠŐ¸5…b„N´Ŕš‚ňÂGúÇç…Ĺ"»/ĘžK˛§Gz˝Ňç•>źôű¤®IźŇç…ć“~źÔ4(Š˘Ş ł@ÉDpĄAsţyń˘żĎ]›Úrôđ»~e‰h„ńúqö‚T\čĆĹnôxeŹ^żôzŃă—>?züR—đëĐ)!u©‘aÜG٬“ď=™Őű?óµ ¦ťHźW˙ř,U^ş0ös ĆüőÝ'źY źW÷yĄż>źô÷@×oŢňűŹßŘţáż|GęR(аOüł@ą™đ°@ˇż ÷˙Ý\Ľ”ZOťvkhOEqź [ę_ż Í}ęŁć¨ícś?˝Áü“ń-“é-Vń’ń»ľ`ü _?Uö^ŻMG‚1Îź^s4|¦1O‰(E¸Â.QĎŹ ÝPx˝đů_^Ľ~x}đjđ†J–! ‚!Żß¤“>ůuŐIôůäĹ PŮăó×wđ–Ëż(ý^řĽŇď•>oţOţŔŐ÷/üđ5€€i…îE°`# WÁO𤠠řűE_ŽŮ+&ń¬¨Šî— ¤X>Ü÷?ĘźĎř«;#–żäř˛;űÍźÚyrţ˝Ç[çÍţ­K€¸fVtË8&˝EűÜ »ľ`q=żqŢúżů‰ěżůR÷^şK¨âë×Lě;LOIoQ¦X¬°L¶íÉ>XŘ=ř\¶ˇţ[öĄžř01„WŚčĘčß´F˛źôú řüđkŇŻÁŻKM‡_—š„_Jź.BłýTŠ€.Ą„±†źI'}Ňdt'AŇף{˝BQ¤Ď×ůőĄąß}ŔÄM?ď(˝şÍoÄÍÚçŰ ¨B(€cŃ@%şZ6ĐmV°ˇ)Á *eúô;_\˙€§V=38\¨€j&5hB1Ňnéľ§hrí,_ďsŇ*fŹŢßµî/ú§J»op7cć}hď+LOMoѬ+€)YřË9ä]W|sëmؤqč<”WŚ®¸nŻT„Đu©éĐ$tăżš1]ĐżńXÂ@âUÓN,úv·×+{üđúeŹŻ&{4áÓá×qäWůb:‰(Ť=ÝRQ ëĐ´“˙{Ń„˙€ĽĆ߼˙żćÜĽőŹF›ö/Ţ]‡ÔˇZ„ŚČ<ËL ;ÔUDčś™‰,ˇÖěüsLĐś¸ÖY…”ZÄ"¤J‚›C«}5ž\íüéµřŻűgŚJĂ×?,{_żqÍgÜüüÉŞą?8ířm–ó§×Ú˙ëbĂÄ«–MţëĽřnO°Mx/ŔR˙â Ë&{Vů˘íĹěň v6öB\?Ć–óâ»=Зܰë 0éíäĹąOő”÷żŻÉh1elŰwݞ<˙ţáä×b˙Î2beÜsűSÎŐaBÉ, €[¦ŚÇĹ ¸ázł“Í2˝tĚĂ c¸~pÚń[ŚjĘضďf¶ü»¶ě YĆĆĺ¸ĆŘ1öŠőôő˝ADDDĂ×ĹŮă“Đ%¤”PE‚;!¤€Ô …Đ%`dŠĄ˘Ćńť˝u@ęDvęÝUoT $¤®K!O|mţÄďďpóżî5Ôń÷6E‘Rę„„ĐĂ Ŕ5 1€‚Ě«ˇd"3B…fTEŤČ+‡„jťµÍš5pbŞ,R…ÚK@PăľÂ±u‚ €=ç??˙™ź\=á_Ź[–}÷ăŐ=bíš®ĘV‡źťP;Żć‡Ůgźą$ž}cĚĂ;žýö‹cß=¶vMWćgjÇŢTűě›˝Š—^łl‚·ńáÚ±7Ő>űĘľý毗Ż:ąŔńÖyjÇÎ{qě»§ăú9 ;Çľ{ Ş€đ±x§)»'ËůÓ–áĂĎO«{Síł‡/-RŢ2ďÍd߸юńµ}÷*ěřý µW˙ăaënpÍ:sYfäYĐqö¦}~Ţ{·fMđîŢ{÷ÜţÔĄsPEüÉ&ştćŤ?wÝ®/X\u›ĆŢTűě›ÎLÎnÍÎk2*€eŮť?_ř“yŻś±~á†\:‘Y¸iŢ+g¬_Đ®?‡[í?­,öŠëă{_‰ľ†źÝ^x}đkĐ%¤ý !„ (€*¤*¤ ]¦żţŕ*'¦ť˝uÄubɆEżOötĂç…ć‡Ô!ĄňÄW‹CG9ńđ§„"…ŠĐhBú…ôC× Ă‚ ™ ţ ȸ6ş`C°XH‹.Tţů;ßüć–m? 5™:íÖI7Ť˙Ĺwľöŕ?ŢÖńwGŚčYóż°ýŃIe“ŕ;‰˝6öś~óăŻým˙ă-ťt­Mům†ĽOŞ>é»÷>źŃěÍ=OýęüíCuČĎČźŚ{Çz·V»şÖ¦üv}ű| łôÇŹąç_W÷+dÜz ¸&XIr—ď3źń!3®ź Ń1NYŕţl;°űź7Ľ‰»|÷~¦n2Uó Lz‹ß7n´ĹźkĹ…ĆWZp룎ŽwöĎĚţÍ=Ýă‚HŐvđŢů+n;Ż~h±~pbĹ/qďśńźĽĺOrŞĎ{˛ř|˘Kßxőß.:v}ďŚ~çĘş·˝Ďß3ÎsäÇ=ŠÉ¨¶Ý ŕŘo˙óÍSSĽÝ×đü÷k*ýe÷5@ćÔ·Íťýfçr“ů`đů¨+ĆpŔúüWEDD4ô|Ľ~©*BH @¸B„:t]B‡¦ HřĄŐß Đ['45şČ }>ÝďUTB )! LÜžZ5ńÇ˙sňËź„”R×!!t „î=BşáÍDÖXČ«a"Š#¤EUľ2wmś>ýÎȸąčú‹n+üťg@˛Î"CJ/ ¨ÁşˇŔb:]Bé«A˘ĆÁÇ׌óY,@Ψ^K°\Ŕb ď’÷Ůîk,Ŕmľ{ĆČ'-ž×ßľâŹöZľóqgÔ_÷ĚÍíٵŔZ·u'˝s+f7Ç,®źČŞ%4Ó1É|tômhSgűŚŰoßń¨/QoŃűBŤ=ĘŚ[T`léëUĄWA=s ă§źY¦NŔ±–SŽť}~Éô ™ž?yłí¶c¸~ęgÔ‰×xżw˛Ţ—în“ĆÚuĚĚűü2Űşc–âŔ©uÍřR6€ŘQ}tČ Ýt›O "'0U]3&šžËi`¬ŮűŘŻo "˘aIăßýD=>ôř *°¨R`¶X‘ „čĐ !ŚuAt]h2Ş`#˛ ·Nř…ęÄ’ ż }=ŇŰ#UX,BJyÓ?˙Üč˙ä“÷LxéMă_ţŹÓŹ˙•P¤Ô4ˇCřuĹČ:gfBöŮë‡P˛, [Ł´¨™Lc#n0)çę˙ńűÇ?8ĄXTÂŻ)B ËҨY&ËČD˛YčĆ"˛·ŔVU*”`â6C ‡Îj8çf4ţn’ |ôŰ×ţ¨Űżcć8ŕ¬ŃňW?Gć‹?ĽiÉÎÇÇý`îźoűÍť‘‹ďGÂ|Î:pÍÔ;nÄ»jđO‰ŘÓŚí-rđŃG9pRi\°é˙ůCř:ü)"ŘRs}ĐŢĐ]˙oAéÍK˙¨}đ×mŔäŰTÇőć'kzt‡Ő¤±óG= łĆ,űN‰q× [žúýŤ÷ś2ŐÜ»‚§¨„OW Wúčř›řs™ŮÇĄHâz!“¸} ®BäőË,* ÄŽj“űÜů\7¤zpˇ¦ _`˝j%ľŔe(Ť˛ ) ŚxA @Ńť°Ňi±@BąéĹ׍O./d粿ÍmřŁ2öÚÜmďťZ0R‡¦ M“ţŕ= Dţĺj FÉ™đ \• @€ň=_ůJÖźżőŕ?~Ŕ/ľó5F˛ąbĂćăś#6ÂÄŔdF(ćQË3«2×|®Żc"¶‡;U4 6˘qhGU†3ä"z*ˇ%Ałk¦Ţ1ďćÚ&¸~ęďfţvëźřĺ1őß~Őc=Ú™cď­¬7Ţ ő—Č(™Śůśp}öŻ|ʱ²ë*Q˙ÝŚ©˙îuěG;Ű[üľqGiţŁ~¬x\iyÁĘ …Ýw¨m_ĹňŻkQ7k»Yµ»ŹtŢť‚ý†˙ŢţËń¸÷šŁť°OŹSšŮÉ&ştfW&?kŮDűŃżÜQŃi´ÓgUîzK?6/nT·„‚ÝČË~ěÜ­űRüą$LÔ㢔—Ůw""˘ˇf$Ś3ÔD7I¤€ˇ>]ú5č~é7>şÉ´vâׄ© HiÄËÁNřtDu˘*ĆAŇŰ#˝=Ň’‰?řĄŃóËRBJ@ž^z獯ţŔř×Ośš÷ EóKżŁ`#3 ŇdâŕŇUÇť˛,„P!Ś@^]éűtiĆźż…`Đl0âć¬˙­ůĄ"ý $ü¤OEF0Ř5"FŁ.彺ěżTöŚqń ˘Ô"¦™!¦qčB KDPóŃÍ€ćíţ†;3–}çÉK€ëWű»«­· t ë§Uů2ŕdűçżŢ‰ţ˛_v/{˘`ç;@§6·JĆô莗ĎË' vî C‹îř‡÷]˙RđËĎŻşn_űěi•Ń˝i öŤ-Ţ׬?üP~ĺs—î Şö¸ţ€ŚÂż ÝeăďnF}®ýÄÚ˙ŇżvŐÁÝ7Ü®]+ÝťŔ=·ęoŹ5LŤ=Ůć—ÎąĹß03îĘüŹôÖG˙áÂŁ7ˇˇÖ÷ÇĚF5µ Đ‘ů'@Äă÷LĎ%«Ž}eĚűŇŚôs¶Q€×Źn/,ŞŚ_ŁÄ IaäŹu@“ÂŻÁŻAÓŤL5ídgMv/GŚíÄ’iKźWötK‹Ŕ…7wŽ˝gŢOŢčRú…®Aפ®ť^|ŰŤ[Ž\úŐkĐ5é÷Ăç—ĆĚDőÉ=вáÍ pËźqóő¸~ ®Q‘eBśŞŻ áýľĺ§µO‡†e¤ś3Ë 5Í(+‘„:Îd; Âáuh€ş˙;mĐçüŁ77ĐŽ#ŮŰŞ~"ĐŔß,Ř8Ü›ĎŘqĘ—/ÍĽ €ún}ćź —yÇBÝ˙ťĚ÷fxÎ×Bý›…:Q>ýNţäħżÚ}Ó;ŮÍNŁ^@܌޹㪽‚[nTŁűADŔĹ”ąĆŚ˝éw~Ő{ë8ÄöVŕ3Ű·{lěhŁv ö)ňÄőÎه ^„B5ţdoý‹éĄëeV~żüÔ×ߦů©ť'çßű¦sLŁÝ8V̨ô ­ŮÍN|ú«Ţ[ÇŻď`üăřkeú>Ć\1 DDéD÷ń33"/)7>ôń W‹«Ç ;UBRĐ|Bx!z$Ľ^?şýÂë•ŢnMűčĽ<ĺÖßt'őAčä ~Mţkć{wߨ^wsµ’•-T  uĐ…ô Ý+ü=BóÂď…·[z˝ţďů‹Ú;É/˝Ł‹?†ĎéĂy ç]Ľ˙–ŔÄý<ÎťEv–"„´¨Fč¬Z¤€*á]§ÜýŮĎţîá’Ő¬ ]j Ĺ-™@úůł#]=°@ěş»×ţÜ‘Űô|ŃöuXßÜqő×oŹŚě‰zˇm×-ř˵c•«łEV,Ş4~„W« ŻŻ^Żôy5ýŁó8sHî}@])/żń„@ľ¬ľóŮëÔ«ŻUĆ\-2ł„jŠ€čFHż˘ű y…ß c]nź×ďőť»¤żó1˝+ŀϏs>xˇýO±Óu)żf¬ˇ@…ĐeÖÓÚ> «0*ß.TH Ş”čŮŽž……łĽŇŐżŔÜŹĎîZ5-ńýÓ᫿ü?z;ßÓtÁ?\‰(ĺNüE›xíůÓç ˝čÉP-ŠBęRHE‹jBőIhRřtéׄć‡ôúŃ}î–9hťdř䉿h>1Q~x>©fö@µRB © ©©Đ ů„®IÍ'ü~é×ü>yÎqÓ-ˇNÂ'¦÷D…Îҧî&ˇItU—PÔŕ}.{ĘđÝňL˛ÎüÍťî~ýĆu™›ţ%ăĎi‚bĘ—/ýŐmŕŰJDDDÉ©ů·žW}âáŞ?wt~dÉČBW ëB¨B“B˘AčRŃ5MÓˇC•~ß-ă|˙V÷7_iĽŚąÜNę/:ięţî ?ţýSźű #3Ă"…Đ…]W!!5UjBשkš]SĄîŐ¤>á–{đo_ůçsŃé€ŕóđĘ-˛»GS-Şô€?CËҡ Ő¨¶öŠQµ-µř%Ć)U xiJgú”Ç{¦„źň=M#šĆYJDD”b/˙1ş<ô“Â~íuâ/ZÍĎş_ţŹL]ĘËę¤éâËP!ýđăĺ=*üS~řơţurF«ÚňńËżĐe Ö9Ȩuľ׏…ŇŤ,ŔbüŢÍ-+¨fŁd5ňWr¦w÷JéS…ô ´R†ˇ3Q qz3QŠř‹ żMBhĐuH5ps)ˇëđGTG¦’ý~ř$2,ř(ĎđĹŲF­ó±}Á]Ď^Ŕő@g2U!„q =#€ŕrRµ@Sˇ†‚iłr’äBJDD4jő0t&J‘ *|f˙5ŕŻÚĐ‹B‡˘@‹H7é:ş¨PŐ%ź„ h@f6p•Ń0ş€#S)%Ĺ×ŘZN%Ř0\Ża<"ü€RGšSŃ•Á_D)Ł%Zy@0DVÍ6Ć4ČŘZ±;ĎĂb,Ä-‘Őă˝nvÎůÓľßh˛L"Ѩ•łô 'NB÷Ć,‘†ÎDDDDDIačLDDDD””Řű<‡¸ś»Żä8háCOž9őNč)Ż?QJÄDe‘†ÎJţĘĐŚ‡buuşă7.|čÉ+?"""˘ŃlűO^ęĺŐŢBgđFWW„H|GżDńŃ•×Gč FoCŚ…DDDDé‚Ó‰’ÂĐ™() ť‰’ÂĐ™() ť‰’ÂĐ™®ś˝5¶ś\[ukÂí[Ęrrm9ą¶E[:"_Á1%ÄĐ™hk­3bÇŔ×ĂMíIďÚgg_u®-'·nŻéjö ´Ű~ŮW_ľŽÚýťîm‹;"ç^ooZyArË6'Eú3 óKADDŁ^ß÷uR9ą¶ÇŔŮłgŻżţzăżńO_yĺÓőöFGíţ—ä·Öĺ,¨šY3©«zv2;Í©vwUőČ[űń·Ü>)?ćq ă‚´7-šUµjVÝäÎĘ9WxśDD4ZĄ8t`„ÎŹÇjµ˙ŤúĘ+Ż üíM‹fU9ŤßµˇŤ­u9 ±âµ$Ł˘A—“k3ÝžđŻÄü)Ŕyčx{űń§Ťoé§Ţ›ą;:+'m)›YľÇhĺXײmqŢŢŰüŤ°ňuwMAđ>Đ"řo!zăúŰ«6@ăüÜF tGźń¨ń/+řĚ8n OGˇĂąÇq¬Đx˘:vGµŃáĆ%9ˇĆ—äl,\˙Výcńtţ¤;€ĐLÎ1z„ˇÁÄ7/üSâ©÷f.ŔĘŤ‰.E˘wŤFfôF­Ô‡ÎFXÜÖÖf·ŰĎž=ŰÖÖŔxzg_uî’ 1Űb‚c˘aŻ_?yŰ×ě_Ľ+ż4?˝`PŠÖş™ĺ{Śż÷ÖŘć—U[Ý5ŐîF«íM‹4F„¶UOoąk›őG9 ˙j:6×üţŢę×Vn\˛!QĐÎňK¶u–:6?\´ŞĽzóÝőŹ^+ţ^gýńŰüŤUő­%5¨›żáýű­Ú·CčšţŃuEŽż `…}N˘sĽ@ŕ'¶”Í,ś¸Éq\ŇŞ_C‚KÁ_–Dţ=şYęzg#ëět:żůÍo&Ę:×ÔÔDď4»¦Ó]Ě~_ŤTÎŞ™ąU°âµm‹ó`T÷:§­ę¬ßě­±Xy˙lsî/ĹĆĆ oě«)śbÄÜ(/Ę)öw¤cď‘F+ź2˘ŇĽÇŞK€}˝Ť!řMdţ82}ĺöIůŔńŕł˝o4†FłŤáa—öű‚Ł2=GÜŢ#ß: Ř>qÓă/)°ď×É „F E˙R6€ÇăńxÖµtťÄô3Pˇ?\»:Ý;V\~ýá¨Ý˙V­ŔĆ%‘/÷űyI‰hJ}člµZ­Vëő×_úoüÓdűĘ/ŮřĹٲŢgyuxö˝Łv§{˙şB8«žŽ …źóvuş»^/5^mßR6cř×0SÚ4śÍążŔ†7ö!A~7ß: €łüG{ă÷zŃř[±csM?îÝa8~$”oîh;Ô[ËI·xŰő'hźĂîC~ɶ×KlXP¶ąÝü#…qąÇ%"˘Ń-őˇó`fťĂ7…-Zĺ4y5đűőHřW¸ń9ŻłĽ('×fĚ1 ˝jldĘ™†»‚Ęýë ±qIN®Íř“ݦ ¶A×[µ4ÎŹü Ą Ňř[q¦ńďĺ€Ůeë hÖ÷}ŮćTż¶2đϤzGŻ-ó׬wţA…' ö9ě$N|Ç {VÍ*ŰśovŽgŐLă¸+^«)Hň¸ý»DD4z¤~š ‘TnkkëĺIŠ,}6ťŃźH\µôě.k`¶ľłĽ(çocdZ IDATÄA)RPŮŐY»1›đsނʮNw—QOI”VÚ·”>x1ň¬DDD4HFTÖyŽqw­ň˘śňBGLĚ1%ż¦M-*¨ězkʢYUósw„u¬kůŞĂ÷ pÔîgĘ™Ň 3¦¦yk""˘ËúĐŮH*G¦™ăź&"}‚˙1.˘?6ůýĘČbĄ>tĬ3ŃĐI}čl·ŰŤqëž #)ťąŞ-Ą‹Ôßa(-0t&""""J Cg""""˘¤0t&""""J Cg""""˘¤ô}‡ —s÷Ń0×Gč,„¸2ă """"ćúťĄ”WfŁ˙>!"""J Rë->>sęť+5Ńő0DDDDé‚Ó‰’ÂĐ™() ť‰’ÂĐ™() ť‰’ÂĐ™()}Ż&8DrrmŐŐŐ‘[\.×öźţ0Uă!""""ę]ĘBgvű7=OÄÓ”Ť„¨Oè`Ăn·çäÚR= """""s) ť»:Ý.×7Ł·Ůď˝÷ŢŢöioZ”kË •mnЎí«ÎµĺäÖ튾‰(mĄ2ë\SScµZCO=Ź=™˘ GíţNw×[µěY5‹.]!) ťŤÚŚřP9ŮšŤüIwD>m­ gŁnjG\ŠÚŘ´o) m\´Ąˇ–7µ·ÖĺäÖU×,ŮŤóąç˝5¶Ř]hôIMčś“k{ĺ•W–.]9MĐjµž={výúőIEĎíÇß°Â>@{Ó˘ŤŽu-]ťî®×Ká¬z:ŕ:j÷wş÷Ż+ ll­›Yľ+^ëętďXgyQuk¨Çć§4x úµ•PşŁÓÝŐY9iKŮüŤtŢé޶8oĐ®ŃČf$5jöĄza$MĚÓ%Ćy32D4ޤ&t~üńÇĎž=ëńxŽoÖÔľ^yĺńÝ»wčŁlĂY53×–3«Ęąâµ®ęŮÚ×ěśĺE9ą¶śŤśG˘~Řĺ[§÷ľŃ`ĺýłĚążŔ†7‚?ÓťÓVuş»:+糼)g˘ôůyTo˙„/c†Cô!úNÁYÄđ}2gđĂ´ş˝Áń¤í«a3Ő¤µÎHš§K *Ă™(<~ăť’ď["¨Üś.'×ÖÖÖ`ţüů¦ >ýéOçäÚş:Ýćű;j÷ŻÁÓłŞś—Tßď®)nŽů×~ĽĂrL™d¶9q}—µ.‘—ĺ ÄëD”6V ý?[Gíţ—ä·Öĺ,¨šY3)ÉĂÍ©vwU÷Ý,iŤżn5˙ăźú©có‹Ť@éŞÄ3ć/®Y˙ó˘Uĺ?Ú»xŻyţâú®ĹCÖ; Hj˛Îëׯ_ż~ý+‰ő±~ɶ×KlXP¶ą=T.˙Q˘żĽCÉćČLsdş•]‰‰D”ćµ—-ŠHápúDpR„ůO›ü)‡Ž·Ç5ŽźešDČ:Ç1năćřqFXą˘4ü1bç{DOíž~nÝŢĐ!4QÝdHď;^Ţ &u¸¨Ë^¶čá¸Ëk4ëóÍm˙ýg° 0ŃŃ‘wď Ăm푌żÉěšoůHB/I~ßŃĐKMč|nŐąs«Î9xüńÇűrÇ {VÍ*Űś_ŮőV­#đă#ú'”łjf®mţF`Ĺk5ÁOŮ6.ÉɵĆ…’Öf—­+ ý0ÚúÁ7«Ęé¨ÝĎ”3QÚٸ$îv–ĹßëtďX8«ę[1'z†Ăś^¦O'E2ŠÇ_Ľ+?¦±Ů,‹9Őî+B{š±µ.gAcŕžBť-ëoÇ˝1ăŚ9üýö•]ář)żd[§»ËŘ×gyuřôťÓV“@Đ8˙ {WÄĄčmęHä™ĆOé}ÇË;Á~θěÓV=—+yŞ$?™7·ý=gDbĹäčƶNö‰ťcż‘z›]3!'f$±zýľ5Űť€„ĽÂGµď¶đŔłýşë®pöěYóÝňK¶u–„žEÖő?ÎŚOQ#ű˙ü+?vß6Źńó2˘´Y°aüd¸}R>¨¨Ë€Q^”SŘâ<Ň»ŤGÓVuÖo‹ßÇY53·Ę8Ö¶ĹyŁď­±!r–ĹĆĆ oě«)˙nzÄ˝G‚Ńä=V]ô>ßnö+–üúŤŇp·[Ęf–ď1iQźć¸-Ş&ÁüÜa^·ŕ,/Ę)Ë™ďhĚěűp±ďŃľ•hܰѵ·:Żí€Ň Đľ%‰[ëz?zäö·=(0ż>±łkâŢ÷# ď{$˝~ßŃ@Şâ~üńÇűXý„(ĄĚ§O$˙WzoŤ“;âŢšţě séü`¶Ň›Ť>÷ÖŘćořHâĹOَٛ­®^şMţ“=\ě{4»l]á†ňĆ_o™ň¶ŽuŹÎ %Uúóćö>ăĺëÜv©źß9Dt%Ą `Ă˙·»W ç&Ďř°2ţ—QŻúś>Ń_}β0=b`ŻŤ˛ŕŽÍ5IÜ»ŁŔľ2řđř‘PľąŁíP˛C5?wÓ{ĚEOéý˘  öçpáăŢ]ě6”W9Q8˙îĽdwĚźâ0ŇÉ Žnh÷ oKü;&ůŮ5ý{Ó‹tľ QIM­sW /áWJFED#S Öą—›|EÍpŘ[xúÄŔô9ËÂô•F1îĚ\[NnŃŞCqă4;‘‚őÓF!¬łĽ('·zG†?#F\_Qa? ¤÷‹vy'ŘďĂ…ä—¬2.ČŠ'ËO<’Ř˝îšď‡×&G€ŽÝ?ßGń˝Qˇsě7Rßłkb&äôOôĚś¸·‰†‚ŔMűł&Śąî®ńçOřţ÷}ˇ\ÎÝ%EJyćÔ;)ßg\ç®N÷¸ńźŚĽÔ.çî…=É‹?‚ővF:6?\´Ę‰•Ż»ű3]I›.Zuű(»/gk]΂Ć^ W"ëaxö¦EF,>8źŽŽĘ·)uř|d‹ŹÁr–Ţ„ §ql.tĄl!n"˘Q«}KYNnŃ*çŔrŤWVűďw8G_.ł Ň¸'F˘Őg–ďŁö{Ăg}ŮŃů6ĄBj¦ Ťfé´ÔEÜ=F‰Ţ¬)¨ěꬼÜ î…­oѕǬ3QR:].cµ9“/"%s„Đbr:ĽThdé»`ĂĺÜ}ĆAD4J |†™1±,üĽpý[őŹ ů 8÷Uç.Ů€Ňőębž^~‡WLŞŽ;śGBDýÖGč,„¸2ă "%.·Đٸ'C{Ó˘YU«fŐMfřEDtő:owź¸2ăőΧzD 6łČ ·Öĺ,h„ŁĐáÜăDxíŔ>Vék ,Ac—§˘·ËÇ´YŢ;Đy˘›—ĺOşpĆuhěµňuw ĚÇ%´~¸ńŞY?Ľ±d4ÎĎmJW®hŚ|şŁłrRÄrß˝_®ŕy-黇^.ăJ¨‡öřÓ‰î-ţňŹ˘4ÂZg"˘ĆB¤ťî®Î–ő8Ë«7‡Ë‹ż×éޱpVŐ·­uĆJ]ĆĆđ±vżŃŐífÇęĄM¨óD7ým?ţ6€öľ˘®č1ÇpÔîďtď_WgŐÓ –}1–VJwtş»:+k˘źÎ1nÓĽÎň˘‚oóCĎéG˝\˘ć§Ť@¶˝iŃ‚FÇş–®N·±ŔĘÓ[:LßÄŘăšî«×Ł^ĂŢN'ĐŰ1#IđÎŃđÄĐ™(Jpő¸˘UÎčnźĹ&µ´ňSFŕ›÷XµIś¸MóÓFĽhşĽ…±üެ*çŠ$Öżł©ŔÚÔG˛bbäE\w:ÉC÷ŃC/—Č9mU§»«łrŇďšťEmFVŘ8‘„obP{‚Łôu”Đ5ěít‚˝1V&Jk ť‰ÂBsřĚsÉW†p a&ŘQ»˙­Z€ŤKú¸§Çć2)ň™‘6ľŞg'˙&ĆěŘŻŁ\ć‰(M1t&" ;~dOđaGۡŢZNş­ŔŰžuFĆńEăîo›kLn—°ŤŁř{kj)‰_˛íőR”…:>°;ÍŦĎűÓOdbµ÷4üŔzčó2Ň˝ĺ?Ú±1™7ŃtÇDúlů.‘ _´Ą#ţAC#˘+Ťˇ3QQë,/ĘÉ­ŢŃkËüĹ5ëńM& TE±3Ť˛Ó®—6ů%ß[WěY5«Î<\+¨Ü±ŔžUłĘ6ç?şŢ(äčmÚbĽĐ.Ćzŕ¦ýĚ.[W4ÎϵĺäÖíŤyZPą]!6.1.‚c]KëŠ÷§‡>/cAe×[µŽ@o6#âLđ&Ć7~Ç„CîĄqě5Lć‚DŤ„÷%J/7íĎš0溻Ɵ?ýáűß÷…^p9w—<üŢaăʸ÷†óăĆňĚ©wB[\ÎÝ z2r Ť09ą¶®NwŞGADşoF˘©ś4rńřČĺ,˝ NăŘ\čbÖ™()}Ż&HDDD±ňK¶u–¤zDtĄ1ëLDDDD”†ÎDDDDDIačLDDDD”†ÎDDDDDIačLDDDD”†ÎDDDDDIačLDDDD”†ÎDDDDDII%QÚ&J)ŤÇ"úe‰>¶Č] ÁeƉ(yi:Ç’ÚBDDDDtyFuÁƸ“‡Çť<śęQQzH›¬ł"P¶!â^3rĚ"ř8ľ~#QWDDDDDIK›Đ9ě& zeÜ>»"""""JZÚ„ÎÉ*f""""J‘Q]ëLDDDD”Ľ4Ë:ÇÝš®ß·&"""˘IłĐčkš )FËDDDDtŮ,č5ć>·Ĺčsš`ň]őIR Ťjť1ŘeÜLDDDDÎń·p6ÝÎ8™C†Î2ÁăDmCÚlĄVfťű\;ľ “ĐDDDDtŮŇ&tîß6zŤ•y‡ """"€´ ťŤ`wP4aÜLDDDDŔZg""""˘¤¤MÖŮŔ…¸‰(UŇ,tLěeŽ`d3""""˘JĂĐŮ4NzŽ ŃŔ¤M­ł—[Ş1]Ńč‘6Yçđm1bŮî}-nł 4ď°ADDDD6ˇsěőiźŰ‰Ň“Ëą;ŐC ‘fáCOž9őNŞGA”NŇ0t&"­>ôdއ@#ÇöźĽ”ę!Ąź4 ťą7ĄB†Î—˝7ŃX&q¦BJ9( š]]~?DDDD4*ČŔş|issşA v7ѤGÁďÄLDDDD)—ˇóv÷ ăNNő@hTK›‚ ""h­Ëɵ…żnjOz×˝5¶ś\[ukňŰWťkËÉ­Ű˝µ}KYNh{k]N®mŃ–Žä;%"˘ô•YgĂ™ ÓR="6µű\’ßZ—ł jfͤ®ęŮÉě4§ÚÝU=hüukĺśA쏆=fť‰(mĺOq8tĽ˝˝i‘‘n­3’ÁÁİ-”6RÎá¬sdö:”şŽŢ¸ąfÉhśo–{^ą˘tĂűÂĎŤ1D4°ńá˛ŕKu{C‡HpĐöŕŕ™É&"†:Qşj˙]łp|ń®üŔ†ć§4@kÝĚň=XńZW§{Ç 8Ë‹Ş[1§Ú˝cEhϦE ëZş:Ý]Ż—ÂYőô–´Öĺ,h„Łv§»«łeýí¸·úµ•PşŁÓÝŐ—`ľßľrŁ+Oç—lëtwű:ŕ,ŻŢ*%qN[ŐéŢż®hś˙†ÝśUő­ FBDDĂŐđť;¶ÖÚ&.´M\h›XŰôţĄlë©DOűÜNDÇłjf®ÍŹ·-Î nś¶ŞÓÝŐY‰7¬Ľ6€9÷—JcngyQN®-gA#瑎˝Ć^O•ä@ŢcŐ%ůčÝěV4ţúŤn©î˘UÎ膎)“BoË‹|Ĺt$ů‹ë»:Ýáó""˘ac8Ô:·ľZô‹Ď¶ś¨ĘĐújÝqŕć+qŘĽGŞęŻÄqhđµÎ±ĂjR}¬k‰ O÷Öô{sî/ťoäąö-e3Ë÷}î­±Íß8đ‘Ѱ5<˛Î¸ý¦ŔoŤ‚Ą•@dzńo:™ŕßÔM\hűöÁŽ­µ¶o ěŘúŞń¸—ö‰ŽĚ.źjZl$Ľ–m=…÷SýĚţ=Ď,Ňü7 ĄČLóŢ tHľugůŹöĆďő˘Q‚ܱą&‰{wŘW?˛'ř°ŁíP˛C5 kť‰†­á:Ě*Ýô ŰÄ…uˇ[FµľZôî÷‰íîŰ[üCőÖSö<Óa?±ÝýÜôĽG”nzËřôu_ËĎK‹¦÷Ţľ÷wl}©ęöoąOlwźřÖ´wOăćűj^YřÂ&÷‰Ş’+’ü&˘AWPą]!6.ÉɵÍßÇş–š‚Ř]oŐ:ó˙‚łú *Ťjă™FŃĹ!łËŚełi‚€Ůë§çTż¶2PzQ˝Ł?C5  Wá`Ó+OlŻö}{ˇ­ĄMŰ=ÖŽM?·m ľľü4nEá siŁéöĺßpµ.ť]pĐuhůŁĎˇckďí{“wK>žů† ßr?7˝ňąÁ>3"l•]ť•±óK¶u–DmX\ßµ8¦Qt28nóÎMú‰ę<â†wy5ťî¸˘ŹŁďe:“Ńp0,Bç€ŮĎmw˝jk9řč­(|aSý#ăC/ul}=ŞĺË_zů đÖáçćčŁ}o –şO,Eë«¶‰ßŔňoő™Ą&˘4d"ŔŠ×b3ĐDDDI[kCĄÇÚ o˝1ď–ü=ĎěÚ×Ë>7ßY|č­ş–öâ»Çč»}oGµé} `©{ßňÂCź”îy÷ô€:#˘áɸgEW§;ÉĹSL ¬sŢÝź=<{ˇÍxb_޲e<°´ĺ…Ú˘‰ Ťm…/lŠűtü]¶W˝»Ŕm”#ôŮ>`Ď3ËmĎ–«ĺVČ»UłVŔĚÚ}UyYP:ń¶M3k÷±Ü™B†A茛ď«?q_̶ĽGŞÜŹDn˝‘\Ţ#Uîţ´7k3˝–şO,Ťn¨˝&"f¶˙äĄThTˇ3őmáCO¦zDDŁCg"˘ôpćÔ;©Ńh§©Ń0&!%†Ĺ6ŇCg""""˘¤0t&""""J Cg""""˘¤0t&""""J Cg""""˘¤0t&""""J Cg""""˘¤0t&""""J Cg""""˘¤0t&""""J Cg""""˘¤0t&""""J Cg""""˘¤0t&""""J Cg""""˘¤0t&""""JŠ:‹Ź‚h8łÎDDDDDIbčLDDDD”†ÎDDDDDIačLDDDD”KŞĐ·…¶‰RJă±€ťÓ(ăf9Ćl‘1/»b»űÄŕ•F°4ťcÉm!""""ş<Łş`cÜÉĂăNNő((=¤MÖY(Űż µ‘cÁÇńő‰ş"""""JZÚ„Îá`7QĐ+ăôŮQŇŇ&t6HV1QФYčLD”B.çîTFš…=yćÔ;©%+ÍBç¸[ÓőóÖDt9>ôdއ@#ÇöźĽ”ę!Q˙¤Yč ô5MĐŁe""ş"’O!çäÚš~üĂ!  ş´ ťĂ·Ĺčsš`ň] ¶qă?Ůg曉ŇTÚ„Îě2n&"˘!Ĺňe˘‘*mBç°PaFü-śM·3N&"""˘Á†ˇłLđ8Q""""˘Á —{× "˘ŃʵZ!„Űŕŕi+"­v…[Ő®řÝ#v0zoŤxNé.'×–ę!Ńe „ËJjG1"î+r»i"˘ˇŕZ-pJ)ĄÜµĚ Ŕşl— rV Řfu­´h«?ŕž=îÎ@óeËÁ˛§Ą hjń\É“ˇˇbÄÍŚž‰F†´ ť…†Ŕ2î+r»i›D]]×Îőmk즯yž_[ńě2Ďεóě`-*)>pÔÓĚľ&¸żŐVܵĄ %+çÍhfě<DFĚŚž‰F€´ ťŤŰbHČËüď°ADõsmsŮdój ׆2ÔŻ´Gn˛NťŃěö$ęĚÓŇ„’"kř‘}^cçt+3z&Jwi: ?j‹jŚ@ĘŮjşO¨Ľ9˘ŮµzrSɦeVDÄĐŚťÓ_W§;ţ+Ő"˘Ë’fˇł€¸ĚŻTźŤDŃŐ&)gžŁŠmÖzč]ŘÚµZ· ™äďˇÁ ›(ĄačLDD4ŚŤ˙É>۰¨(MĄač_ˇ!#¶Kł6Ě@ŃtćÔ;© ‰4 ť“©Đ`¬LDDDD-mBgă¶r0‚bŢa m–DÄ`—q3 @zdťë ĄN„ÎŰÝ'Ś;y8Ő!"ŠăZ-ka,'¸Ěęi;ą¬9üj…S®A *śrŤ=f÷ŠëŰvµDîo¶ĄRÚl ;®Ő§”RĘ]ˬ0V rV Řfu­´h«?ŕXíŠíÁăžá 4źQ¶ĽÁ×·Úę<ßŕąÂgDDD˝˛éPű{f´T(Škçú¶]vÓ×< ĎŻ­xVzvŠŠykŔZTRÜtÔ»5˛™}MpŤn«­8¦wóŚyVŃp–™u&"×εÍe“…!&ˇěÚP†ú•öČMÖ©3šÝžDťyZšPRdB]:Ät@DD)—µÎ´ďŰ —lđĹ×N,ť=xÝvl­­Ć“őŹŚĽ.‰(m«‘= s'Żv…*“)g+ŕ‰ß'TŢl”G\«'7•´í˛˘!ĽŐÓ0wyCQ°Ą®H4‚ Yčܱµ¶č™ý€™µűŞJnŞŁD˛á§­Ż.9´ĽĺÄ}y}őڰ ´i{eÁŚ“F¶čj ׆2Ô·ŮcÚxŽ(¶­4ꡗEľŕZ-ž·ń˛'˛Ď©3šwzëĐ ›†@N®-ŐC ˘!4D­Żýâł-'¶»Olw7ĺżw|hŽ'ď‘*#Śî8ÖŽŰoę+n>Ő´xá|ËmŚóÄ·ĐrđJŚ’FűĽŠµ‰|ž–¦ćS­‚)ç@˛Ř>ŻbíNWl“0OĂÜPÜõsm±-~3 s]ťn)e’˙Mő`‰¨ß†®Ö9ą,5Rą[kmÚ&.´-ţMбµ¶lëoę&.´}ű`ÇÖZŰ·akë«Ćă^Ú':fÇÖÚ˛­§ĐújŃ3ű±é¶‰ ˶žŠé'ěý?7cyËsÓϧW>7ď˙¦lâ«űB#1vi}5ĐĂÄWq,ón‰h´°Żi+iš,„“›JÚŚj OĂň¨*gű'B1ąl†3ţŢt-MÍáęf1w;˘ÖNVk¤ˇqă?yćÔ;Iţ7Ő%˘~˘Đą`Vé¦oŘ&.¬k ni}µčÝF~·ĺÁ?To=`Ď3öŰÝĎMĎ{dA馷ڀu_ËĎK‹¦÷ŢľŻŁ/myafá ›Ü'¶×߲+ľCÇďţ°'>3}ó}O.˙ą«58’ŻÝ—÷ţoĘJđZ 3˝ô®Ä§CDŁNčftˇ ׺l—ŚŽxíkw«3ąGsäÍ줔»Ö¬‰xÎ{:§Ąäăć3§ŢIő`‰¨ß†ŞÖyzĺ‰í•Ŕľo/´• ´iűŁÇÚ±éç¶`U1–źĆ­(|anpßtűňo¸Z—Î.8č:´üŃçбµ÷öÉę?.Â3ü o˝1~—ŮE_\Ňr°˛®M_´?‡Ž­Ŕ OĆ·÷n‰h´ęgÖywŞÇKDý3ÄwŘýÜvwŃ«¶–ŹŢŠÂ6EޢcëëQ-źXţŇË·?87č@í“ÓOHŢ-ů{ľ˙çŽGâ¦Ě*-yk_—ĎŞc$ę–F1fť‰F¶ˇ)ŘčŘZ*Őč8Ö^xëŤy·äďyf׾^öąůÎâCoŐµ´ß=F\Ű{űäôÖOÁÜZl* WN¬ <žţč íKJÚkź ďîĎ"®‡ÁŤ,¬u&ن&ëśw÷gĎ^¸?Ź}yË–ńŔŇ–j‹&.4¶ľ°©&v§ńw=Ř^őî·q»‚>ŰěyfąíŔňoµÜ÷r\?©âń%[6ańrŰÄŔóҦíˇńÚq—1’›ď« ÷đĹÚúě–F-fť‰F¶!*ظůľú÷ĹlË{¤ĘýHĂ»' IDAT䆪úřýioÖfz}p{}Â6‘Ć—lŮ^·ußË›đŕ¦P!GL%}wKDDŁkť‰F¶‘»šŕe8čÚôĹ'O0‹LDDýŬ3ŃČĆĐŮÄôĘ}Ý˙ŽČłÎD#ŰĐ-‰BDD4ę0ëL4˛1t&"ş ®Ő…<0ÖŐŽ´Ún!V»âwŹŘÁč!˛ĎD;ŃpĆ;lŤl ť‰ʵZ8ŕŚXN0ru@gŠmV×ę@‹¶úŽř8Řăžá 4źQ¶ĽÁOĂÜPźRJ'vĆíCĂłÎD#kť‰ȵó@}Ű.»ékž†ç×V<+=;EĹĽ5`-*)n:ęÝŮĚľfMŕ‘ŐV ŔÓŇ„ú¶đÜá×)M°Ö™hdSH!R= "˘´ăÚą¶ąl˛ya…kCęWÚ#7Y§Îhv{ućiiBIZššgLµÁ`éJaÖ™hdcÁŃ€U*+bŞ1Ś”ó2«é>ˇňćpq3\«'7•lZfPl3ߍŇkť‰F6†ÎDD—ÍZTR|ŕ¨'đĚ$ĺ Ŕsô@±ÍQ˝+[»V‹çmm»–YŤĚtS‹”ľu&Ů: Ś}^ĹÚçŤĚ±'˘Đ"*ĺlźW±Öčç1­Ĺđ4Ě ĹÍ`_YʞÉá¶k5o±‘fu&Ů8Mh€ěkÚŽÎť,Ęç z–—ˇľÍnăÜ)Ś %NiŹéÁÓŇÔŚćfŁŁ—e»Ú0wrh J…SńYĐŕbÖ™hdcčLD4`Öe»ä˛>¶Ř×H™č6ń­m¤tÁ;lŤl,Ř ""4Ě:Ťl ť‰ kť‰F6†ÎDDD†Yg˘‘Ťˇ3Ń aÖ™hdcčLDD4hu&Ů: fť‰F6†ÎDDD†Yg˘‘Ťˇ3Ń aÖ™hdcčLDt\«…Bą ëjGZí ·fKjGě0·Áł?×ŕNGĚ:Ťl ť‰ʵZ8ŕ”RJąk™ĆB€AÎ ۬®Őmőń±°Ç=Ăh>Łly(®o36´Őp0zN?Ě:Ťl\›h€\;Ô·í˛›ľćix~mųҳSTĚ[Ö˘’⦣Ř­‘Íěk‚kt[mĹŃ=X—íjĂÜĺ ű2+(m0ëL4˛1ëLD40®ťk›Ë&›W¸6”ˇ~Ą=r“uęŚf·'Qgž–&”YŁ7öľ KĚ:Ťl ť‰¬Â.®žŤ”s‚dq¨žŮ(ʏVOn*ŮÄěňHŔ¬3ŃČf ¤Lő0złĐ6QG( ˘_–čc‹Śy1Ř•ŰÝ'w¨D4JEWc¸6”ˇľÍÓĆsô@±mĄQ˝,ň×jńĽ­m×2+ŕ1ß…ŇH?łÎ»S=^"JŽü/ łÎ2ú«Ď-DDCÂ>ŻbíóFćŘÓŇÔŻbíNWl“0OĂÜPÜ˵zrŮŚDąk®u&ŮŇ0t<ăNwňpŞGADéĘľ¦­¤i˛BLn*i[cOĂň¨*gű'B1ąl†sŤ=¦OKS3ÂÓs7¸#ž=ok“q{ĐpÇZg˘‘-mî°!„”m¸×ŚÔ˛>ŽŻßHÔŃe‰+ľ0Ůb_#ĺ‹oŤ5‰ÚRz`Ö™hdK›¬s8Ř•fčµ~#QWDDDŠYg˘‘-m˛ÎÉâe""Ću&ŮŇ&ëLDD4ü1ëL4˛ĄYÖ9îÖtýĆĽ5 fť‰F¶4Ě:‹¸ŻDŰc 1fť‰F¶´É:‡o‹‘(kśt6™wŘ "˘!¬3ŃČ–6YçA v7ŃaÖ™hdK›¬sX¨#ţΦŰ'ѕ¬3ŃČ–6Yç°^–ŕćBÜDt…ąVlđŔXW;ŇjW¸…XíŠß=b‡ą ž¸ýŤ^)ť0ëL4˛ĄačLD4L¸V śRJ)w-łÂX0ČYb›Őµ:Т­ţ€#>xö¸g8Íg”-ođĹőmˇ.˝R:aÖ™hdK炍…¸ăŰ0÷LDCŔµó@}Ű.»ékž†ç×V<+=;EĹĽ5`-*)n:ęÝŮĚZwŰj+ʱҕŇϬóîTŹ—ú'm˛ÎBĂá>âŽo“¨+"˘sí\Ű\6ŮĽõˇ ő+í‘›¬Sg4»=‰:ó´4ˇ¤Č „»d˝FZbÖ™hdK›Đٸ-†„ĽĚŻPWDD—­"PmSŤa¤ś[„ę™#c×ęÉM%›–Y]°ÁzŤ4ÄZg˘‘-mBg"˘áËZTR|ŕ¨'đĚ$ĺ Ŕsô@±ÍQ Ś]«Ĺó¶6†É#łÎD#›:§M€¸ĚŻTźŤöykź72Çž–¦ćS­bRÎöykwşb›„yć2nYu&ŮŇ0ëÜË*ܦ ¸7 űš¶’¦ÉB1੤mŤ< ËŁRÎö5N8„brŮ ç{Lž–¦ćęćąÜQµÎ,vNCĚ:Ťlix‡ ÓBeŮWúżíÝlçąčůgz»8nO‹(QbUɰĘM™Fč‰q ·q\dő`Iišsă8EÜ5‰t‹äštö5˛ýcSn|w“꜀̩4J¶#¤n!ۆ Ť:nŹŕ JĂúĆĺ$Št*˙ئŮm÷Üöž3űÇđÇRE‘âřű3ďűÎKrÄ[)s>ĺ¬:ö)ÖC†9©"Úp„Ľł+uÜŤĐ6­Ľ#óBXâcZEăâ’ß«ZőЦišćBH5Rz2ö(Š˘ř¦…ŘŮ Xap·¶„Î+łSŢ#Ţ#Ţgß)=Ţ1âÝqr±°÷ŘŮbówŽí Ď^raÇ”ţáÎÓ~ÜŠ§ënpmц#ÓG­…1Ś”žPE¤"ĺ¬ G¦ç3•M Ś”ž,$®M3MŢŮ Č:îÖ–ĐąďˇńÔńť{ŹĎdżs‡ě=>“]ťË®ÎĄŽ/ż8{IDöŽ~ýÂóo®ČĘě´ťeýĎžúÉWR«sŮŐą¬Ţ˙›Ú1gkÚń‡nhÓÁt-– ęEQŹĚ_/h$FËRÎZ,->EQOx0]qIˇ‘ŇËšRłádťwëhÁĆĘ{ço»ĺ‘[wůĺ—żřPDŢůÁˇ~˙˝UMoż©Ďz°çŔá="ö<ôţ7Wň™ŕ7ŹŰĎľ“ďxö¤ő¸NűšÓËg—/éűóiňđě%ůđ͉CçĎÝŇü7€î`/ľ(mY(«rÖbů¬rŐZjhˇ¬©«čŠ.DÖp·N„ÎgŤZ‘č#ďŽ>ĽÇÚv}đńţńxgeöŤ ÇwUtŘłëŕĚÓeEgO˝w>u}ď/'f/‰Č™C+Úę\ö;wô=t˙Á™s‹""˛úńÁˇ;ę·Ż?Ű•ŮÇo&»:—]}ć¶÷.Ëçľ6ieĐWÇźkÝ›p˛Î€»ubqş˝Çg¬B•Ů©‰Ů/MZ[÷ě:|zHľţňę 2[ŃăŽĂ«s‡Eźńĺ >÷đűË2ócďLa˙čeąUöě.´×FźÎś=°{Ď;™wGţެĚÖo_Oß-ýrčiŻ<“ý·żłąWp9˛Î€»u´`Łď–ţ3ď].<»ăáă;etWťpv÷wć˛ú×_J˝#¶‚é¬Sćx÷˙"‘´Y«ŞÝЬ3ŕn„ÎĐ45´`†Ö٢ĹL3Vg?Ü…6wŁ`€–!ë ¸ˇ3-C­3ŕn„δ YgŔÝťh˛Î€»:Đ2dťw#t eČ:îFč @ËuÜŤĐ€–!ë ¸ˇ3lB&Ş(Š˘(„!"F" ŘE3Ąů§Um@E#°†+ŚÍ8Ë>PˇąíXůmĹ-ů1Jó.Âa4ʬ3ŕn„ÎЬLTńIÚ4MÓ\©bÝ+° żW•Ě|ľ…™‹/MUmĹĎ•5)0ßR#qt:ňTH-Vhad“jU›1Żm‹­‰‘xô`.';«4˛ęő×ŕtdXQ‡‚ţĄ‹†Ő:´`ćâĄëŹ ë ¸›"7ť˙Ë?őé»®˙řňď>|ţĎĹ™ôéŕľoĎeW;89—ůÁ}óđ©˙â¸ëžĎ~\ń5šIźyđQľX]¬§×{e-ŰéY`c¬_Ě⳨-wI›öŔ6UŽz a݉€'ś¬hRh3” xÂÉü6<·’D`T—¤ăćúÇ#•+Ë\hćŹçBFT™ηÍŘŰ»8ŽMij‹›ëKŚ”.Á!µ‘6"˛tѰ6©^ńqőśŃ$˛Î€»uMÖąŃ6ŰÔŞ˝Č:®)ŐbřlÁjeúÖŞ‰ž·Ő$—µ)lőŃ„!"I ĆóUëK2QŹś±Z·ŤËő|xí ۳ज[„¬3ŕn]“u¶–ĹhÉŤ¸Ya@‹©CA[·Fú¶¬BÂąŤ:0h5ń‡B±\P÷T_´Wv¬LT9ę-%§hS,mÎĹý¶şfRέBÖp·®É:»YgŔ]´áČtţ˘>#Ą3¸ĺé[#-.–1?]UkĄxmMDD ÍÄ—¬kůśŽe$eqs#mŠŚÄh8_ÁQg>Ř8˛Î€»uMÖŮŇŐ7âćď ŔeJŐ=ż>ĎHŚ–ĄoŐ)2KÚ a+ŰŘjť M ˝C éÁ°'0ŞŹe¤ôd©§Ň`›ÂÚtöJęŞů`Č:îöÉćşux]g;Ó¶Ńtj`oÖQ?¸ďožwQC f¨ţ-fš±z˝ÇX(ëo=ŞhWÝŻ±6ëÍ›łÁ¬óéNĎŔĆtYÖYdă×n›Őť‰›ŔőČ:îÖ5µÎ-\6[„ZgŔÝş&ë\ZŁÎ=·«·×Ş˝Č:€ë‘uÜ­k˛Î%uîą]˝};!ë ®GÖp·®É:»Ygp=˛Î€»uaÖąkoÄÍßŕzdťwë¬ó¦oÄÝ)dťŔőČ:îÖ5YgkYŚ–Ü›6[„¬3ŕn]“unᲬ° Eň·ćS”hĆÚ`$ŠíÖ}•ŰJm}E $2‰@Y‡â“L4?xŐ±ŠăŘEÇ‘uÜ­;˛ÎĘhçü-dťw1ź¤MÓ4Í´ř¬›\{ô`δ6 f «Qi›™ż«va„H:ż}!¤ &łÖ#Ą‹_ O..ů˝ŞH&š?V.ľä+ Ô}Óm|ÍXYgŔÝšĽw;ď)=—]‘ë~{ˇ=‡Ű:dťw1˛ÉȰuÇlm8â›7d@dp@µöj±d^K<Ęo-–‹FSF¨¸ĄHŽ˝h¦Š‘|ę))>‘ŕ*™¦#Ă1u(č×­}˘†̡D`tË_*GÖp·îČ:»YgŔu–.ÖŐë_şhhĂ‘iź˝¤Â¸¸ä©¶j)»,2íłUq¨^ŃS†qQĽŞ6<¨§ ‘Ěüt1wŰYgŔÝş ëlązămí<ÜVŕď Ŕ]´XîbŔŁ„óO#iU´iƬ˛dźDŇćXÝî¦ÉD•ŃÄĐBh((/b\Ôe $ŞWć 1..ĺ“Íčdťw#ëÜ>dť·QC V­r.î÷{Őâv-fšéČô|FLę)ĂÖĄP»lĹë·ţ=08=ź1˛Ăš:”‹†‘•ŠĆŽ#`!ë ¸[׬°Ń>+łSáŮKµö.>;âÝ1âÝqr±üqř{p)#1–ŕj$eĄ^U´±¸„G‹f˘žđŕS!UD2Ń|[#Ą'­˘ m8˛tôč’«˘Ź]Ę—{hĂ‘éůLyslKdťwŰâ¬óĘě”wÇHţçŮwěR'r­ß˛bKăC5ęěÉGŢM­ÎeWě¶?n¨ł›˙Ţ®MůőâąřᛇΟ94ęÝ1ĄX˙Č—ôý#öˇJs°•[7t輔oÉçËĎž:t^fžöî ďź*=n4±MÖ¸¦©ˇ§ĂžŠű˘ŔuČ:îÖľ6.éĎ˙xď˝9shĺŃŐąĂbŁý/ŻŽď–KúţŃcgçg.uëÔ„µë˝űł«ă"˛2;51űĄřW˙)”—WçŠŐ}Ç9!ŹV¤±Ďő*=Ý{\Dnľ:‘ĹgG~pökŰć°řěČ‹łÝ·,f"+ł… TĚmĎÔńĺâWf§ŞŹ^Ygŕç7†ëuÜmëłÎgŤzwŚxwŚ&ďÍWkě=°Âß•÷— Źo¸ëŢť/ĄJĹĐ+ď/[9]+ |ć˝Ë+?˙Ą:Ö±÷řLvuÎúIß™­?~dF.ĽÉ>‡ľ[w–Ϥ4ZskYgp=˛Î€»µ±ÖyŁ*:®ĚľŃÄ "˛2;5ô“ݤVÇűŠĺÎ ë ®GÖp·Ž®ëÜwK˙™C ‹""—~ń“ó‡îpÚUŘňŐŻHů9óŢĺF´÷Ţ/őŽRs&?ů§[›:skYgp=˛Î€K)bŠtún‚{¤ŽO í}&»§Ć®|úk“Ą-_yőŔî‡î?¸ăiďĚΩĹńŕçj¤ďˇűoŰa@ď<8şłÖL^NŤ í)µ©3·&‘u×#ë ¸›"7ť˙Ë?őé»®˙řňď>|ţĎĹ™ôéŕľoĎeWŰ=ŁĹgG^ĽµÉŹí­Îß÷|ö㊯ŃLúôČŹňĹęb=˝Ţ+kŮNĎcýbvzŘç^‘Żúnĸ»UÇ`=n’?^‘Üůăĺmu7Áł'˝;FywtŇ…qłu€kYgŔÝ:Zë\iĎěę\öŐŻmä>#]„ZgŔŤŚD jĄćü]EQ”h"P*˘Ń€˝‹‘°=µh8÷-ßPčY>“˛®Ĺ[ gVqóÁL”Ŧ[„ZgŔݶUÖŮĺČ:.d¤t‰DDO… ‰€â“´™—–ěŔ‚i𦙋űýńśiš¦ą0ćml@5äŘ·đŘÚRťgRj–_ ad˘ů™ĺâKľBđl$Šâ›ný[sŤ"ë ¸Ű¶Ę:»oîc¤t Ž & «‘Ň%ž‹i…Z¬ô¸©[ŃQŽ$ł†dć§#Ăš:ô/]´Ú©ˇ3÷oč`¨Ť¬3ŕn›Ę:óĎ ý“ż7×1Rş‡Tm8’ŹXŤ”žP[7 Ł¤uCo{˝F˝ŽFâč´ß[6)u`0™­9>6¬3ŕnŰo…Ťk+l\¸@»U®°a$Ł2łR%UŽzs !)n©bŘvĺÍŠO«T×ë[g&žpŇÚëŹçň»ć‡M+ n\cL4‹6\Ź/pwŰ’6FJOćŔľiIę)CÔŤ—ZÔp3‹µÎŐ1±qq©"Ť!ë ¸ˇ34ÇHéÉHéz@«RB‹KŘSZż"­XËBD¤"Â.Ty8ŘôLŞiĂ‘éůŚýh=jťw#t€¦)]âcZáiˇĘX -äâKľB)˛O†5‡ÎZ,Ô Ë=‹iµt`ŻuV‰LٵXZ|Š˘(žđ`ÚV¬ˇxÂVŇÚ)ĚÇĆuÜ­ÉqŔµN -,Řźk1S+î1C뵯nT{Ŕ˛]Nه4űł|ÇňŤĹ]f¬j^łEł6u>Ýéůزδ YgŔÝťhjťw#t eČ:îFč @ËuÜŤĐ€–!ë ¸ˇ3-CÖp'ÓE„Đ€"ë ¸ˇ3-CÖp7BgŘ ˘, IDAT #P”@°oËDK7ű‹&ĄB  Ř» ŰSű€†sßň ‰LY«ü+»™ŠŁTL­AÖp7BgŘ#ĄK$"Ą_‰€â“´™—–ěŔ‚i𦙋űýńśiš¦ą0ćml@5äŘ·đŘÚRĄ´%_ň˘çŠfÚP°8O#ĄKpHݲ·ĺFÖp7Bghž‘Ň%86<´Ç¤ń\L+4ĐbĄÇM ¸Ajh!_:ęPVK±ł‘%rŢ"dťw#t€¦ĺ“·Úp$ę)=98 ¶n@GɰÇVQŮLLf §fĹ=™ůéÍĚuuÜŤĐšU,{°‡ş~ŻÚÚ«Ů+1B5WÝLŽLĎgĸ¸Öšž%ę!ë ¸ˇ34ÉHéÉ|f×7-I=e:Đt©…ó€ÍŚrq©fř® G–.fRú ‘óV!ë ¸ˇ34ÇHéÉHéz@+M¬ŤĹ%ěÉ_§'"™héqIy„]¨ňppŁ2QOx𩚩hmx0ě 9o˛Î€»}˛ÓXßw‡išÖcEëV.%¦¬łĹ¬ŘYJQ沫­ť*€k‘Ň%>ŁžjĂßŃ” …rđ(…ݎHÚtč¬Ĺr%l=óÇs š çŐŞŢÉp±«?žÚ¶řă93¤ŠUÍr !UDŽ9oť fťOwzľ6¦ BçJŐ˙jd ´–ZX°?×b¦VÜc†Ök_ݨö€e»śFUĎyĺĂb uÜíš.ظî·®űí…NĎŕÔ:îÖ5YgEQňeJŐ>+ǬW×oÔ €–"ë ¸[×dťKÁ®Yőcß^Ý ÎP´YgŔÝş&ël1©blcdťw뚬3ŰYgŔÝş,ë\µ4݆‘·l˛Î€»uaÖY©ú©µ˝˘[ڬ3ŕnź”.Yą´,F­é6ü2Xa°EČ:îÖ5Yç»ÄÍZÇH%0ěŰ2QĄ(šH” h4`ďb$lOíÎ}Ë7$2ĹVŃLy§Â¨Ĺ UÜ<­96Ť¬3ŕn]:—ŘË0j•gP­ =Ś”.‘č)ٰ!P|’6óŇ’X0MÓ4sqż?ž3MÓ4ĆĽŤ ¨†ű[BZh!ß ¦I&ęŃůÝéÁ¬!"™h~Bąř’Ż<‰€˘ř¦·ň˝ą6‘uÜ­ CgłöÎŽŰ`Ë)]‚cĂÉBěl¤t‰çbZˇ+=njŔ& ¨ögć§#Ăš:ô/]´ĆUC f.îoö¨…¬3ŕn]:Ŕva¤t ©Úp$ę)=YŚ\[1 ŁdŘŁTÖdhĂ‘i_ui†ELfk‹V ë ¸[†ÎőWŘpl[!čŠŘC]żWmí€Őě ˇŠĂi1Ó4Msxޡ¶[ʬ3ŕn]:+J!^÷FÜŐmj ›`¤ôd>ě›–¤ž2DŘL©…Ă€MÓb¦™ŽLĎgĘpqi3‘=@Öp·® ť­e1L17ů#¬° 5Ś”žŚ”®´ŇÄÚX\žR˛7uJü–GŘ…*Ç7:©D xŔ| ¬ "čÍ–“ dťw벻 Ŕva¤t‰Ďh…§ÚpÄw4e„Bˇ…ś<Ĺ˙»I;ý±®Ĺr%l=óÇs š çŐŞŢÉp±«?žęľpRÄŁdÓćXp©xp<· Š¨±ô|ţ·EŇfţF"ŕ 'EÄŁ„#isc3˘6˛Î€»uYčĚŤ¸ljhaÁţ\‹˘R5´`†Ök_ݨö€e»śFٶh×b¦«šŽĂ$±iĚ:źîô|lL—…Î"U—ý™¶Ť¦S{3¶YgŔÝş¦ÖądŁ×˛ş3 ]¨uÜ­kBç.‹Á €-BÖp·® ťKËbÔąçvőöúCĐRdťwëÂZgłîÓu·°eČ:îÖ5Yg¶?˛Î€»uaÖąş cÝE6Č@Ú‚¬3ŕn]uŢôŤ¸Ř"dťwëšĐŮZŁ%7âf… ­c$ŠHöm™¨RM$J…@4°w1¶§ö çľĺ™b«h¦ĽSaÔâ„ 7évhÖ ë ¸”"¦)]:·pY VŘĐ2FJ—HDô”QŘ(>I›yiÉ,¦išą¸ßĎ™¦iš cŢĆTCŽ} Ź­ !-´oÓ$őčÁüîô`Ö‘L4?ˇ\|ÉgĎFv0]h%xn!˛Î€»uGč\™ui…Nż&n`¤t Ž & ±ł‘Ň%ž‹i…Z¬ô¸©›08 Úž™źŽ k""ęPĐżtŃ(›–ęő7{8!ë ¸[\&8—]‘ë~{ˇÓ€ FJ—প D|GSF(¤)=9ř”Úş[%Ă%śěŹçěÍ´áϧLK$mVíęŔ`rŢ)µĎ°é ŁŇłÎ§;=_ÓYgŘŽŚ”.Á!UDŽÓÄ~ŻÚÚ«Ů 6*Ăk-fš¦iĎŰk›kČD=zp¦F€Ž¦uÜ­ ˛Î–«7ŢÖé)@#Ą'“ÉbŘź2BˇÁdťtq65XôpT™ĎĆm¸¸ä÷Žĺźd˘ĘQo®*ôĆćuÜŤ¬34ÇHéÉHéz@+M¬ŤĹ%ě)%{3Q§ÄŻ:`/f6Rzrp@upŁ“JŠ4..ů˝ŞhĂ‘éůŚý@ÖĹŚÄÍ[‚¬3ŕn„ÎĐ#ĄK|L+<-”X¨ˇ…\|ÉW¸"Ů'ĂšCg-– ęž|ŹĚĹ´Z:H†=Ąkž‰L"ŕ '“aŹͨCÁâÁ ĹZ,->EQOx0Ó¬ą'mٰ>] ±Âŕní*ŘX|vä‘™üăúÜá=˛2;5tčĽěśZ~nťöŤX™ťšGăÝĐ\ăŠ-µFŰĐQ¸•ZX°?×b¦VÜc†Ök_ݨö€e»śFٶh×b¦«{p´ YgŔÝÚ:_Ň÷ŹŽßţLvőyçŘłďśúÉWR«ă}"röä±D>W·ýž;Ú0Ń }ŤÇŰT@ŁÖp·6l|řOIM}§űŢqŘz|űM}Ö†=Ę’Ę5ÚŻĚNywŚxwŚxź}Çzž}óµeÇÉEůđ͉CçĎőîŇ?Ľ¤ďÉ·ß˙ćŠ5ŇŮ“Ţbű˛ĆÎ_™ť Ď^) ž˝$ t\«Č:î¶őY畟˙ňĚí÷÷UlÝłë`điďŚC1†sűł'‡őżĽ:ľ[.éűGŹťť{Xä̡•GWç‹,>;ňâl`÷C_›<ţËR)Ĺ«sAY|vägżvřć7ĂAyyunwaČ>{ă:óź}qüög˛ŻŢ!ňαg/KĹQ(!ë ¸[[.Ü{ëőUŰî8Ľ:—]ťÓR#Ţ#ÇήÓ~ĺýĺ˝Ç»EDn¸ëŢť/ĄŢ‘Âé»ugőA‹YęGfäÂű—V~ţK)´ßľ[úećiďłď”ňĺ8#ë ¸ŰÖ‡Î}·ôźůÉ?­ÔŘ»ű;sYýëV(ÜHű­ĚN ýä+©Őąěę\ę¸C`˝{dWç˛C犵"ÔŔ €»µ!ëĽ'0%3CĄ óťcĎľł2;UĚ4ŻĽż\–fvjßwK˙™C ‹""—~ń“ó‡jfĎĽwŮz°÷Ţ/őÚ‹HßWż"ů×±2{R˙PdĎěâčŢw˙yĄáŽ€kYgŔÝÚ±ÂĆ ÁWgd˙¨wGţůA}®ďćľ°{Äk=×FSŻŢPż˝ěą#u|jhÇČč3Ů=˛ňľĂ‘úş˙஧˝3;§ďżm÷¨÷ě<8şSDäs_›,Ž _yőŔîRăŇŇxgY˝DFźIÝ*"Ňw‹Śď±Ńë§ŽŻűĎž^ŻţÚßwr˘6N‘›Î˙ĹŤźú«»®˙řňď>|ţĎĹ™ôéŕľoĎeW;8ąkÇ=źý¸"‘IźyđQr.ÖÓ뽲–íô,°1Ö/f§gm­ÁJŚą×_ îű¶ţÚßóUߍřw·ę¬çŔMň‡+bü\ţx…» Ŕf‰@Őíř2ŃŇÍţ˘1{âS#Pl÷ół=-ŤXÖ×H‰Ś˝™’żë¶á´ťsőŇŻë˙tz‚šDč ›`¤t‰D¤tÇl#P|’6óŇ2źqzô`.ßj0křăů ą î‰fDD 7Rş‡T{łř’Ż(Ű7ĺÎÚ°%ť yFJ—ŕŘđ`ŇŢĆs1­Đ@‹•WPk´R ŹJ±ł‘µ"g[łĐBu ld“Ĺ­˘:Ŕ&äóŔÚp$;)˝Ń¸UŽLűjUWdć§ý^ku`0™5¬mCw'Ă«\Ă·Óšx1hąž^oőO§'`Sť YĹ ŠRě,RyץĹLÓ4ÍáůRyr1ü=ęÍ-„ňăhĂ‘éůŚ—"ĂZíáěĹŁll ŐW’qmĐíť IFJOć]ß´$ő”!ę@©vŁAZĚ4Ó‘éůŚÂß\Üo%’ -†#K3)}Đ)r6..UëĹ<4¶{¬LÜ ¸ˇ34ÇHéÉHéz@+﬍Ĺ%ě)ad˘ŃLy<ťŻé0b«ŠđW -¤Ĺg«äІĂľ°S䜉zÂO…Ô˛mĄblVÄLÜ ¸ˇ34ĹHéb+*.ÔlXWîů ëÄůdX-– ęůR ĹŁs1MÔˇ`±•GΔ‡żZ,_ň—¨Ó†#b«Ö(Öu(G˝93…a©ÖYŇ ĺŁˇÓ›×hÇÝŔ…ÔĐ‚ýą3µâ3TŐxýMe–ď. î4TŤŤ€V#ë 4„Đh´ŇÜë/vz ¶ ˇ3-ĂMOw#t€ ˇúô×ţľÓS°…ť Q#>Úé):‰ĐuőŇŻ;=@'±ÂĐBg !„Î@Cť€†:u)¦őoBg !„Î@Cť€†: !tBč 4„Đhˇ3ĐBg !„Î@Cť€†: !tBč 4䓝ž •®»á ťžÂvˇ(Ę•µl§gŔUťŔm®^úu§§Đy™ôéNO€ Q°4„ШOQ„Đhˇ3ĐBg !„΀ć]×ëíô }ť͸®×kĹÍDĎ®¬ë ¨§§·ě+WÖ~-Uá˛őô*÷ŕv„΀z¬XąÂ¤cÓ^ďăDĎ\ŤĐ°qGŽY˙||t_‡¦íC­3`cŠŐGDdbB 4¸Yg@ĄŠúf±•mXqóÄ‘#bŠäăf™«—Ú9Ač Bg@%Çúf©¸:P+z‘ÉÉ#ŹŹný´ Óť qX„N‘É#GD¤XčüüŚWDĺbAîD­3`}µož8rÄ7[ő5-ëôz{J?áW–[=QŘJ„΀ĽžŢ/T˙Čz7=)]5xÄ‘‰‰|îą&ßÔůµě•sS>9óÄ®coµlú°ĺťyWÖ~]ý#N«8O–o,ÜYPĄáőßüĹâăłÇzz˝=“‹"ňÖ¤·§×;q¶°q_8ź¨Ţ§“ˇĐq„΀u<ľ–uĽŠóFçŰĄTYţŕW"ňv÷:íüß]ËžzL$=?ŰŘȰeť뫌žŹ±Şš+âä«kŮÇGłë\&ßŮëíŮ5ž~ěĺ+»×9đí7÷o|¶°Eťe¬ę‹B Fiă„-Pž°î&xDäČ‘«kY«~ăjwáöMť?7ĺ‘ď=2A"@Wů„Č*Óîv]Żw˛*—lʎK»ĚŇ}_Ë>Ţ`ÜléţđŤ"ňÂý¶E6Ţý€jfŰ—i Yg@QulĎ=OÚw™˛Y{źzLDÎ<±+üJ˙Ă'|ůBŽűľ·é‘`ËpK€H!ß\T˝@łU°ae—''óńôĆî~ŇüáZ°řěî‰ě•âa^Ë~ł˛őá+k‡Z@ç:D¬Jĺ^Żă^oť`őńѬ•Ťž”׊·Dף`g/Y®XRĂş °¸÷ůBŠzâČ‘çg^kď4 cČ:ś=ľ–ť,:W\X–>"2Ú¶I@':jZwÝŚI9ňř®„΀’žŢ/ŘźZ7â®`[s¸Ŕµ…ĐPâ+W°Ő@!tp á2A€łžŢ/Šź·­ý%jgç­CÖĐJˇ1M1MŃ )çęzhčR„΀M3dÉ_™]NŚJpFT[őó|¦s€Ö!t4i¸ )I–‡Î JHučÝ‹Zg@“´Ě+˘HÚ,Ű•8*ń«‘D|˘L‹ř%kű ĄÖ ť˙§/ÜÔžy\ËEą˛–íô, 1SăáĐÂúm ë¬źuľzé×mÇ5+“>Ýé) !źSéô,€mKÉGĚ\&4„Ën5÷ú‹ťž×Bg +Ť<řh§§Ŕ5‡ĐčJ\ż @űµ tţÚ˙¸ODŢüż^«Ófä?~ű÷ż˙ýG}tî“›?"Đ~­ąLđĉ»ľěݵ·§×{âĉĎ|ć3Öă–hł„Î}ôŃ‘#GTU­ż˙ţű"bĆ=÷Üłů#íׂĐůÜ?&ő×˙NDľő­oUGĎ=˝Ţ7Ţxă–[nůÖ·ľőýď_QZĽôň«áž^oOŻ÷WWZ;2`ײuťő×˙Î0ŚŠčą§×ű˙đŞŞţčG?úţ÷ż˙ýďß0ŚŞ®‹˝ŢžâĎäâF»ňŚř¦ÎŻeż+[@[Ó;ö–"uÂt€kP+WŘĐ_˙»ŕ˙‹=_YËZqóťwŢyňäÉŹ>úČ0 §k'zyAöž8˙f˙ĆąüÁŻDäö›űEdüĘţMż†őô·ĺ(؆Z|7A{îŮ7g2ǵ5–_}ńßs“qs± Ł”â={¬§×Űł/ü€µ}źľ,‹»ĆÓ"ň˝GzzĂŻĽz¬´~kŇ–ĆîőNś-t·íť8+˛¬?` uöXOď±·¬§ĺÇ}kň‘DD^şĎĘ=ŰĆil’p‰Öß»=żýöŰ'îżżNÜ,"ü×3"ňEµŻlëŮc;ź<#Ź˝|e-{ę1I?94q¶¸Ď˙ݵě©ÇDŇăńł»'ĎMůDÄ7u~-ţMµÔýľďI±{’˙éţ—DDú?\Ë^YË^YKťđIúɉW–ĺÇDDžZË^Y;|÷†'ŮČĐZ:÷ôz8đŃGÝůź˙óiè7×ňÖĎ^‘±żÝ-"w˙íAyág…h«6Łáî IßöD!,.$’‡žHoí$ĐuZ:ë4ţęí·'Eî»óÎç>ó™‘Ú‹ÖÝüöŠČŻŚŽ^uçűüÍ""˛üjxç“g|ĎĄNWŕҚйXň[¬oV4MTő3oż-"OÜyg­čą˙Łc’/Ť(˛'q7śB®ŽżűAťâc«zDDDVrď®s”MN]§ˇłµrs.—ËĺrßřĆ7ěתúö:Ńóîɵ—ÇäĚ»l‹Óí9|ţą˝ň˝Gzz˝÷}O|ĎĄ&÷l`>ýű'Oř$ýäŐ=oĎĂ'|"éńťöŤĺ¬˛ćô“C=˝§l3 ?··t™`qóć& €®ŁČMç˙â¦OýŐW®˙řňď>|ţĎĹ™ôéŕľo›¦yőŇŻëń|oö÷ż˙˝|ăß0 ĂZĽŮŞoŢőe˙="ŞaÜyçť"râí·çÖ˛[ůr*¬Ľ˛oč‰ôÁSöËű¶ë}ľ˛–˝î†/ŘßęLúôČŹ®űćŁ{Yk8vz€ ă ÜÝŞc°ž7É/Kî-ůăĺObnę§Nťú裏~ôŁe2kKńşŔs˙<-bĎ=ďú˛SkHń+CO¤÷ž8·}ăft31·ŕ–(Vy†aý×}úô銽çţ1ąëË~QUyűíŹîĽSÓ´Íq=»'ײ“[\SZ:[9ć‘˙řm«ĘYýďŞěú˛˙}MSU5“Éüo›?(Đf-»÷Ü˙ů÷uöÚ–v&n@Wjý-QW"tBč 4¤eµÎ6ާö=ęŔ6´~čśIW®7`óXN€®łNč¬(J{ćlsőBg˛bť5÷ú‹ťžJj†Î#>ÚÎy ď?ŔvS3tľzé×íś*đţl7,N4„Đhˇ3ĐçZgÖrŔ5käÁG/<«y™ ć»g+çt 6€†:%×Ýđ‡j S„Đ(rŽ› ¶,t^Öا/×ßŇÄ ›m‹lĹLZ8f›ßĂöĚĽý“ٶîĺtđŤŞč®řŘn¶í§ Ý 7×Z3c˝ĐyY ×ŰSř™8Űň6 ëľŽ[5áâ8đě±âçŐ3ąŘâ)ąŰöü[bŁ#¸ďłnĂ+jäŰüŤmĎô¶îŤjîëZĘ7×Z0Łć %ľ©óŻűEdY`—wâŤěäž–Ns]ýÁľÖŢ#náËŻ†w>yŰ©µěÝ""ňÖä±·äóÍ lm8{ůiˇMľ™|:¤‘¸Y6V°Ńüáą©_ýď…Ä@>µyě-)Ď”˙&ľĎj~ĹžC(ő-ßž·8QLr˙ĽbŔŞ]b%YËĆY~5Üă8ţ˛ţŔ>ý•IŰś+›ŮĆ?ëüşďO—Íĺ•čx:=ľł×űŔ«+•Hů|*&P1fţ…—XĎĘéˉs‡ď.<ż{˘đ¸UďáşďRĺá Ź—őö›ŘgőZyeź­{ţ]uţß§+vU˝iS­ţh*zU|”üŕJGÜWówˇ0xŤĎ®f—ę7Á6ÂKż©~CŞ^~­łĄ}źZĺ”×üő‘-ů°˙ßł}úrŤI.7řAÔ9=ęÉ,ë”Ú/NÔjcˇöÉVń‹ąÎyRç[·•çłý‹kcß·¶‘'Ź=°ÎL:÷ż@¸WuÜ|Ý _pląÁZçţ›żţͲ8±kü‹odݬeĎ?wáľbU@…ô…˙łÚČŃâ˙€[śŘő›'Ö˛WÖ˛WÎůOE+ţÇÜĘ+ű‘7˛WÖ˛WÖ˛“_]oײţŔýrj-ţÍ~Ű÷Ç­6W޸퉗Ęç–˙Ż›˝˛vřn‡i”ŹżÇé5–uĎď˝rnĘWvŚľoƦ|ľ©ókŮî_©ýFUO Ööűę}:Ëż8•ľÍÓ_§ĹćßĂŢĄZ¬óáŤ/Ü?!Öëϰü»jŰRęR±Ëá䩚jőŰčtĘ•>JÇ÷ąö·¬˙§'o;µ–˝˛–=u{Ťß…Ň஼]ť.Őo‚m„źŻnVőňŹŘÖOÍáäqřkýúlĹ7€ĂájžáŤ|ő~Żë~Éôźx쥟Z1ßŮĚ ŹiN_D¶N¶Z_žőĎ“Ú[z>W~šřľ-źů° üšŔ¦8Ć͵®l `ŁÚňżňM}wŹH˙Wýľ'3oĺżěĘůü÷ôŰüć«r`ů_ÉK/ôľThtđy5ĽóÉ3"â{ě H~äŞţâTĹ®ôřÎ]O•E?VKýb*Ë÷ůeŮ]úŻŞo*Ľ§đ*¦±,eă;ľF{w_Ťy–ͤj‰ÝwwUM ˇ1ëó}ţćzóŮô{X1BgB~ë|řĽĎ÷ůüüö»Ú˙y_e—ň]N'OĹT«ßF‡^¶ŹŇQť®˙ć/Ęř}˝rjíđ݇eY?Qçלƺ߷u‡ÝđŻ lĆâfŮpÖyů_ŐÎá›:ż–O6Xiżbč‡uţî4Ωę”ϲţŔţ»/(aIDAT®ä}çZëLŁÝZ>ţ›żNžŢP*f“ďaűUĽi Nµ•oőîɵě•5í§ŽE8m¶ ?©vN©Áłwů7•5!m›dő‰·çáďfŢ’Ĺźľ›Ď,Ô=9«N¶¦ĎäšŰu>wüűśÔ‰››]aŁĚâÄ®ń/ţŻÁţţ›żŹ[Ą–?O¦Óî‘ôo>–ňnĄ6b…wůľúďşOjěuÚuóţř)y¤˛¸í®ž‰m´ŞiTŚďřËşçTçŁXďFťA&PwĚÂŰ[^.Yawř9ybWiď[“ĺ-7˙6ţ.Ő>šçxňTLµúm¬ĘUX÷[Ö'^]Ů=ą–:ồşç‰}L§WQłKýě?©Ę#¶÷S[÷°Î©ľß{´±ę?)ů–¨¶îéQ6aǯ_řédćW_ż«żf›‚Ú'[˝é5:“u±‘óąî—ˇă?hűČ ľÉőľ`őăćM¬°‘ßŮ;.""{OśË~ł_DvOž›z`—·GDäੵÝ"»żű\xgŻWD|ŹôUtôMťm·,[ߊöľ¶ĺ;ňúľ+í{nJÖŰu÷ÄË?íz@RůÚ»ţŕ·{­ă–fâŔaeăż‘­|ŤË”u#ÓłËű„ăQúO<潯÷%ßs©VľQő&PsLű€eŐź•ú÷ÇĎKţyěĺ+ňÁ‰Vľ‡} ˝KýA‡óˇŢ´Ş©V4U˝b5†oäëżYžęyRDÄ÷\ę‡ý}Rď<)3_Zőëł\30.á±"źŻÜUýI9±ŤźZCż€u~}¶â t8ßTĂßU/mýßëň—éô]×˙U˙ŻžüÍkŐ'CŐÉYďd«úň¬sžÔůÖmÉů\ç˰ö*ĎÉ=óß௠lPsqł(rÓůżĽńSźľëúŹ/˙îĂç˙lm­ßşŇŮc=?Ó®LÔ vׄFâf{ĹsĎ›ä—Ĺ8#ĽŇÔe‚Đ=ŢšôŢ÷=ëať$1๰Ѹąˇ3—»{"{e˘Ó“l›Ś›eĂ+l]hCqs­6śłÎ#>şE“ÚoCqs­«ţś/ ĺ— R°4$_°ńßű˙}úĆĎ~îńß™ú÷-÷żý·żhÉ8@'ýá˛|”_]>:˙ůř·KúÄţűźţĺ˙nÍ1ţőhÍ8"bš-j»QZ4ŽŮ˛Z4N µčĄ)­zi­z«·ß‰­lż—ÖŞ)µň­nÝ»ÔŰě,iá÷Zk†iá'Ć7íúÜűŇZő‘íxm·)m·ŻY1ĺO˙Ż˙&Ęż‘OĘżćţĺęÇ˙rUD”myŇËöűP[g»ÍhľÓŰ-xja|ŮŞ·©U_Ä-űëB¶ÝßvűE“í÷źámö‰‰ČöüŘZ4/íĆ7vW2EţťČżÉżţID>)˙vYţđ˙tzNŔv÷˙[J<Ţ»łIEND®B`‚fox1.6-1.6.57/doc/screenshots/iims2_small.png000066400000000000000000001170401326741342000206660ustar00rootroot00000000000000‰PNG  IHDRľîĽË IDATxśě˝wxçučý›ŮŮťí‹° ,z‚ ‘beQÝ*¶|]c;Nb;q§ÜÜűůóu®ăÜ´/±sŻăÄź‹dŮŽ«K˘ )±{' ˝-úö^fćűjA’ŘäoĎÇäěĽ3çĚěž9sÎyĎ+|÷ĂźÖľ!ţŁŽ,FłI‡du"Ş häČ‘#Ş\° ę+TÉfT4 žŃ|C´Xö"4ÜýśÖ—׬ —@AS/Pn F9rĽrĹköŞQP!ĄBVtö‚ŐŃPHeAËRíCę›¶‚! ˘€Ç%Ž2c\Š™Ě ĄäîVŽ÷ą‡â©-ůňů¤Ňń¤BZt±,óQô˛VŘF5•ŚÉ4Äă žíĚň/wڞI߉ A6…šÉ ĹŁěVÚřđĎŞ™÷#‘Đ`ä7˙Ś|ŮĹw˙ 'Ë˝ŕú¨äž9rüŇ\ŞgtZ ž™ d Ç5"I„–V&)tZ)vj‚F:«1ĺÓŘu4Ěňf›äđϡůçIŹ#Ě(ţi–z"ŔPED C e*·ţ‚‚Á*ńďúůLŐĚŤĽ9rä¸LĚkĚ2Ě5&ü0„xöBč5ť…±•őK µF¤µFÇÚ%:T@Đ@ ůŃü>Lř şüěźţ3%… Đ›.Ä_t:Š‹‹P5ĐT…âÄa¦M› ­a.-!3&đŐ•aŚŠČ\Ę@•:CÄ–ĎÉ^;*h˘†hΫDűáQÖŢ^ʱíóü`˛ôÂűYŽKÉy†×ÝŤŕ=€(1Î"ëAA5\«(PH+h†gމ<Ze6[šE’Ź NŽůÍŁ|ő;ř˙LJŃf‡ ´ô2čLH& ŕk'đă5>µşśCOn‡–;ŃŤŻü:ĹßÝ3ŤĂnd߉ ÁĚaŤJGţÔÇgżˇńŐűEöwz©ŞuđhW=&‘/ŢYČ~j]în/Hîő3ÇŤDđE~çvM"§&Tţ÷^ŤH2Đ©ÁŠ  DE‚PF@ÓQcaTŮ„ăáĎř§?Âţ©˙Nřď~)“ d ‚’Ąů_G#|Öü#öśębzŐ0ëAĐX_2Î7'X^DK<Ŕ)ˇ}âřç4J˙Đ>Mx@D–Ѭf˛J„ďţĆ FH9“ă:“ ň^ćCŽ÷ Śů5F"ĚD’ž}Df‚ Á¬©‰}s±„=Š?‚27Ač_ż‚:7Ddč „ćPśi0@2#°jTŁ)ddčÔWÜKéÂÓU!÷”˝VĽšńË‘ăPS¨˛-’tZA …HZȤ˛(öÍ@QzAŃ€:’Ĺ gc•ü•ë)š§¶#ętčPłI´tšSžđ‰—‚ˇS,Öđ(ŚŠ^ť‚î•Zí7^ĽÁ—â·-÷ŽtÍČy0‹B'^čľME}‹Ď EQ4ťöĘ÷Wxu €’QŃĚ"IVŤď˙‰Ŕ}mék¬NŽ9ţ˙Ŕöă~˙O#H‚:ť€>&É‘#ÇUB§»ŕö\üîŁiě~ćižzzĂçŘslě˛Płüřń_ł˙X7h*»víbĘ;J÷ ďŇť5•®s˝ŚötÓ?9ż(ÓŃzGś?wž€ša÷ľc‹Ő/GŽ7Ň›7LMĎas;č:×ÇTß9~ń“|ü‹_á¶Ö˘‹öÓ21¦}qęôq~řťźÔ'Eb †L4×ŢuńAŮÉfÍäű˙s/®U«iÉ3’(tQ宥­µô˘!J2ÄsOGŐR8v>Ëé± [7•ńíëÇVPħ>˛íę_Ť9r\U.‰Ţ×6ńĐ[0hŠ·Ýy75ĄÖKz=J*…Ş“‘ô"–üRśňB{ ¬jĚg:`BSV¬dó†µĚ'ŇXâó¸ëJLÇÚ-·łľµ‡ÇĂ}÷m@Żi¨H,–w©vŽ9®—x06‹‘§¶?ĎęU[Řvź‡l&‹NŻżd h© ĚÓÎĚ”źO~ć˘((jvÁőL&1ffY~Ë:¶ÝY€&¬n®˝p,ÝĄĄľ’­‚ąŃAÓŘ|ŰVň QµôO‹,­/şd˙9rÜlhĆŤCÚ÷ľ ďo»ŃÂäȑ㷅§ŽůÝ/»ŕÁ¤ÓÁÔŤ–)GŽż%¤Ó^Ž$AŹ3ďŇ× 9räx'  Ě[–čętíďúD‡ŽçóŹţíť]‹Ú_đN"vużţ˙éĹ·‰ç[ß~”űÎăś8qćmË:66ĎxŰăţó7ĎńýÇ~J |Găsäřmä2FĂ ďĂhů{Ć&~BGgĎŰ:¨˘¨Ľ¸ë%Eá±ŘOŮ·ú ““Ó‹+Ä˙ü+H{ö#=ů şSg5.•JńäÓ»ůĚg>Ďúő[8ÓŢĎř¸wŃ2˙ę©íüĺ÷˙…Ç^~†ž‘!Ň™ ÁhdŃăÓY Qgâ_ţĎ÷=ćU¦§gůĎ˙ÓÓło{lŽ73âĺ¦Âd2·21ᢪćsĽ|đ;^Ř˝¨¦Óiţô/î¦çü7Xűńžš}†Mß­˘¸Č˝¨ńj}-Ń'˙óź}]o?Ůűîşň ™L‘ÍŞĚLĎ`2šŘ°a#CĂ‹ŤFůɱ瑋dNűÎńÍĂ?ĺŻűéZÔř—a*aŐŞU¸Ë*xâą5ŕđ‘ü?˙üŻd2~řŁźńôö‹›#ÇÍÎe<UŃ“L>Íććłźűť‹>¨Í&sŰÖĄtn˙*‘ß˙_˙ë5(Ę"gźeĚţâýeÔňRÄs‹óždŮ@6›Ć`0Pä)˘«« —˵¨±©tšýüđ˙†G?ö5üľ AOfQcˇ0Ź˝x€®H„oż¸‹3ˇĎś=ĎŔŕâŚ[gW7÷Ýw'Ľ˙Ú;÷*™#Ç{Kę`Ţ lBÜn7F“iŃźfË–ßü@1ígOs÷¶•‹čŕ4M#űđűAÓĐť\Ü+’Ńhäá·ńôö_Ł×ć|_75Ő•LĆ·›ďtňĹŹ~’żůĆ·řťGćCžŤ¤ăYň•uN&“<{ľD<đů@ÓřŁů[©«­ľâř;Ţw_ţĘ×yđ{ůŰż˙&˙őĎż°(}säx/đ–f÷®çůé<€Ůl^ÔA ¬ô~öÓAŔ ‘Nm^´@Ů-ČnZ˙ęÁPV.[ôŘĆĆ:ëČd˛üćÉLĎĚR]UqE™˙đ3ꤧ·Źh4ĆGyxŃçt»]|őîŰťś&  Z̬Y˝8Z[SÉ7ţéo8zô_˙Ú—©«­Zôąsä¸ŮąŚŃć#{IÓ8×3ŔŇ%µśëîgisý»kś=y Ěfds˙đ·_[BĚŹs¶śu7c5d>†}z*ť(jŠP(Kľă-ĽMĄëÔIf"KZë))ČCŻ—řđ#÷pîüÂ6gGéö±aÓZŚ:Ťđô$… ­ď¨f8×7ÁҦK˝‘L<ÄÁĂí|üá‡)Ę30ďŹRXŕMyýßoFU8{âŘ=¬XR €»ŔÎť÷ÜĂbXô5Ë‘ă˝Ŕ‚FSłyţLß˙9BÇ÷3š;×ÉXÖ¸ ř0™LüµmßűţĄ“‹ořű˘(üě—o´9räxŰhĽ¸k/ňĄ˙ަ.l040Z*Ęňsvî?ń¶NwčĹ'Ů˝÷ Oí_\/EQřÂźă ü ˙×W˝­s-†řě˙říÇřŮ»ąňÔĹ,Űô4±Eě÷ôʶżâ~Wż÷<˙ë_ľĎ/~ńsľóźp¬˙Bë‹çźř!»N prçŁüj7q˙˙óźľµŁ*śŘý<Űś[” Ůd„ďţű·yúąüó·ă—»Ź0Ňuoýä9T :ŰÇ×˙÷wřÇżůKćq‘şŹĺ±Ç~Ś7X”ŰőSľóčĐ5qˇoĎą®’™÷ž7p`ß.žxňY¦‚‹ÓŰ?xż˙Á“×XŞ·ŹoŢĎŞU+đNN-řů‚Y¤LdŠ;_bă}yôüÍW8Ü=Íť›Vr¬OAÔůY[n@Ę/e×ŢŁ´nľ•ó{Nń;ńßë>ĹtÖMČG÷®_2o¨Âě"©)¸Ş ±5qâĹČŐň“üK=M{Ç säč8í],omąjʧóL ů8ÇŽđío÷qâx;m[ÖÓ}¬G•‡M%z~ą§—‡7×sdHŔß{ ÍĎ=uĹ,`clXÝĘovˇuőrş†f)uŰžčı˛•ŰZ«®š¬oE~Ał~l±Qć úľ Vzvč@:fîL†ÓÝ#V$ů»ćH)*ţů?§nY3ÇOśÄ\Ő„8ÓÉş;?Ä‘ž`ăCżĎGď^‡QLpôülZzE$ŁŤ@(@Q*DÇ—ŮĘ#w¬ćÉ'wĐ3›âĺR•g÷ž$Ąü·Żţó“s<ţÍ ¦wśęÄ—h«Ô35ŕĘ0'Őńń“4®\Á O˙šľ©;)u^9»vęä)T[>;žř ßěŤ"8’”Šż&™Ic,vcv–’ćŘX–V„°‹>>ůĄ?ŁĐ´ř†kÉÉ/1žpP §ůożz‘ňÖ•¤6´5rŕL/zIG*ęĂNĐĽ˛…Ţ ¤‚ZţĎß~ŤŢ°Ťr]Ó‰Öä_úňŲ@ ȵd~~Ž»îÜúú†âc {0rżűńĐ}öłţ$Ź|ôęUŢ÷á‡ůp[{ĆĚ”Z24¶nbŰňJ¬U-lm+EtÚeÂS= …dR‘YR‚šj ő5ĺĚzÇě%|âţ BmÚ°†?ůc„ůĘ—‹®Şqy•ÉÁ^Ľ16)Ăňµ[ŮÔäAŃ  °ďd.c–p"ĂÝ}€FO &Ł„ł˘‹EO…#ĂŘ\„•ënçÖú" +kQAJ‹K0™®ßĽˇ†Ů©i)ŤŤ÷}ŚOßłŠ®—włš¤·—ĂÝăŘ­&˘˛ÁŚNÍTŔ¶MőŘ= ü—»6Ń\[Ĺžă=,­«b÷áv@ejbšé±R‹č¤ˇ¤ăLMN25¤¨n9_˙łO“śâěh”&·ź?őFŁ5› “V0čEŇ•űľ E5ň±Gî§mŮrÎś:…§j gNť"ĚđÜcßâů OŢ"ݧÎŔýű}X]EËÖ-”Zu$łP×覼ĽŚůŃNN ú1dĂÄŇ˙ĺłżOeę,s¶z năpűť÷PaKór×ĺ k¸wU5)ĚzH+ÉDŚ*QW*3:>ŤÍf%é¦k2–ô“H |â Ś}zZůJĚ×ٸLNN±wß!^>xňµ?‘čĄ.ëk…v÷ŻÔ8ß?ĚĐđwżoáhŃ„^P‰%ReQo@"K"«a–%¡(zŁ š€Ů$“J&u:2ŠJ6™F4čąĐÉ@ETMDÍ$Éj"vۅ´t:M<žŔb1żëZWy5Č»~í2‘zŁ łA$ގħřĹ®!>ýá; ›&«‚lő”t’¬˘N¨hHz±h ˝lAMEDEŃ$,ćk[$÷jwIC9ŃX I/!Ťču"éd$=Z&Ť˘i¤ÓŚ&©dťŢ€LFb‘š¨CSłH#ŮtI6c–%b‘(Y l6âĄ+Ç‚ĽĎíÜLJľ›p$ŠNŇŁ“ôd=Ş’%őŠ1IĄłdŇi$ j†¬ ˝„^6˘¤$2 zQ@ADT˛šÍj&ť“HeMfLňĺď˙ŁŹ˙Ś?řĚ'‰Ĺ"d#¨2ަdĐ´W–*DTUEIgĐD’NŔ Ůýź?¦týC´”-0ůô:óŘŹ~Áď}úcDÂAMÄn3 GĐŚj QË€ÎpaqyQC%âńŁ%•B$t‚€l2ň䏿GŰű?Euţ[·$ąÚ|ďŹó…?úŮĚëŻxßýţc|ěăźÂj^/´[h¶Ś(Č{Ă%O~Łđ,Ż<yß0ŮxÁĹŐëăe~Ó—Č`0`0\o@ÔIä˝AFGžňüѧš^=űEűëM ·¤xłž×I/“—w±13Ľz}Ą ×üŐnFůbť¬ö7Mí0ľ~‹íŇ)—Cu8_Q'azĹ+0Kzx­€đâ{/™Ě\®µŽüź-Äk•˘á•I  x%oúîÝőˇO-ţ× «íőűbíşľzo.ýíĽö1^ü=řŕ§>w ¤[,Úła—Üť]»ö28ĐÍDş¤Ňi˛Y8}úôŤĺ]‹ĹŃëŤěŰ·˙†É iˇpśý·Go sóţí;Ź‘Í.®ÓŕÍŠĎâŰ˙ţ(ęe˛.ďŚĆĹyď—#óŤ 8ożęÝ.?ůú˝C®kĘęrÜčĹ$83e¸\hôřçÖĆĹ˝u\b`RĄ4ňť2vQE¶±‰ sIT8ÁtTĹ‘g &OâĚHśŠBcó7ď/ŮU`¤Ě&2:ź"”‚e•FRił‘4Cľ,ÍfŚ’ČÔlś©Ćň*3óá E±d“^ wľŠÓ¦CtÉ4ÁĹţ|t"m5V4˛ ʼn,ś—t4»ş§.H¬(5â›JňnUM.Ň‘ĽLX]ŕŁ[\ě><ËÄLśGnuÇŃJmşµ€ł#Y YŞß—&ĎadÎźd}Ł•q’Ń…R§Čđ\†XF%L2żú…ýÚň‘˘)NyuÜZb ¬äËá´†Ý Đ1ž ŮóúöOúٰÚAw„ćyTZč áöŘČ&Ň-FććbxJlTÚňÍq˘z˛’Ćžg"Já°É8¬*SV‰ůJ­[OH™ťIP^f!›Hc2đqŢuŚ­¸đĄ™›‹˛¬Ć‚Íef°?„’UĐhkvb3ę°&RTTZMXîşáÁ ˘E2…@$‹  A2­â $8=cÂ#ßm&•R§’YŤááó5vÓ}aBŠČ†Ą†ĆŘóLĚĎ'‹08—ai˝ťTěúÄ&ć.,í;9›@6ëI&\v‘p†`JU#•˝A"H Z%DEŁŢNŐŽ/ìId4Ö¬[Ť&ĘřÇ:čČSŔĚÔů(îÚUś~öçk—SdL‚Ń…™cx:N8@™Żďş ›#GŽ÷:MbÓ¦-˘¦Ş˘Č¶;„Kâ±—U/ŁČďluĹ9nfŃ0˘lAÖ/óTÓ#ň ÷‘0˘É‚Ľ`ĄwO,Â`±ˇ×-USŁ yö«“ÁşȢ·Óh\XşDCU2Bwµ^0ňŁi{·˙OózbŢ.ž9Gcˇ±twßľžáÎŁś8ҧ® $ÂŇU›¨+s_{­Ţ&J:ÎΧ~FÖÂbn]^ÍŹ~đk,6‘BwޱA¶Ü·ŤăN173ĂÝŹ|iŞźłSSŃ ˘ÝBĘďGg’©©_†*éđźbbFĄ˘ĚĆŘDňšeÜľmí5ץýĐsč‹—3ţ(ţ¸†.Äľt[V7žíă@ű2wž]»ałÚđTV»™eóC˘ÔśeĎ ĎO(ÉöĆ[ąý–+÷网;đÉPwă2˛É,·Ť™9?îÂ|fçý”ŕťSě¶23 ±ą•‰ŽĂśô"( %–µ,g| OU-ľÉ~<ŐK™‰ůµ …ěůĺ!˛z‰ ·4‘Čf±ę[ĐeĚMőâYşŽř\HRáý=Hľýćôxţ!‚™2Ţ÷ľŐŚ ŤS[WM8'2;ŤŐĺÁš—‡ĎŰKiÓfňśy´­hFŐbxçDćvÔdśX*KÝęµLtG6IĚͧ(ňŘźĂY]OMĹŐ  -„¤%‰¨yT{,Śś vĹ&’3*ëË‘e=“““‰<\ŤšőkÍ'©¬ŻÄls˘„¦ł´mnćě®!6Ü˝’HH‡»¸»^$–UÍM˘łQ_UzÍuy7tî}–xQ %B€çwĽŔwł^ăđ±łX ““łÜż—ńÉYL’Š.݄Ѯn{đaL‰i˛:ť]ĂLvćŔ©n<ĄnöěŘCAy9}'OPXŰ·ă8‡ÚĎŕ;?ÉôPçúş™šôáť S 'ٱsÓsóÔ”sbĎ38ŮKyĄ‹ľ‰µ®Eé19ŕŽű¶đĚ7gh~©‰(µ …<ůăg(­-`űOźĄĽuC's¬«łĹß祮ĆÍh÷ă>?łýŁxŞś<őĎPµ¤„Ţa:5ÉäL ˙d?ďţĐ熆©­kD3zAÁ"iĽŃČhšJ2•Á čőJ<˝Ă{Ó¸‚pxŮ^Ndf’ÖÍw2Ţ˝ ˇ¨š 7s~˙Ó ă;-śî<‹d-Ľ)ŤŚ$[é>±›ľˇqâ~/‘Xš‘ž!,#zťŚÍUNUžž¤µʧ©ń|3Aô#˘$b˛łyÓJFćqŞqE$9 ›ťćŔŃnŞśôžó˛t}9g)őŘ…âě~îlův””€»¤†Ň’Âk«Č»$®J¸Ś!zű'0Ů–ŐRWé!#š©­ô0ĺG¶Xp•ÖR[áÁhub×Ĺyůŕ!Â)‘¦eÍĆÇÁ¤Ăh.¦mő2´xšŮŮqtÖ"V¬hd¤żK^óťeĄµuąÁëťĂlłQTYŹŰŞ1‹!›‹Yµ¶…LRŔSä\”ĂGčícŮ­ËIĄJĘ ™śśˇ©µ‘ńž\ŤM,]RÉ`O/¶|'•őm8Ě"EEůd䶬k&K05<…»q ­ËëH'e"S=”5Ý‚U™Ă…ŰokĄ§/Dë˛úËřď ˝]–7z0š¦\b`.É"íťá®>pEÉ‘#ÇŤ"#€›bÇŐm n3¸ĺ, Ĺ`Ţ2‹D6雵t.GŽoŮ䦮ţoZ‹‰ÁHoN+Űeę\7ßëNŽ9nT%ޤ¸ŘČ\Ę% §$IBŻ×3?5FD5’đŤRÍ”4äÂjŠ ,g&ŤâÔĄ`fEsý5Vçť331Ĩ?E}E 6“H{ű0&łB$®QXä¦Ň㤧»—h"MYM‡Ä™ö^ŠŠ đNÍâ°ŰÄ3,k©GQ%R‘††˝ěá0UMËp;Ż˝AΤd‘‰ţn E¤fĽ¸jqZe@!N’ĎPĚŘ„0sI- Ő¤b:ş‡iY±%Ăl·!ŞYş;Úq–מÂTREbr‚˘ş&ň,×oAąwB0@GšŚä ß¶H·?›âÔ™ł3Uµ ä[P Ó=ˇą~á ÷äČ &W9Ϋt}ĆúĎ1—XŃŇŚN„ńˇ~ňJ«±É $vÓşÇR4×’bČ룼Є?m (ď ß=%I Şât\űt¶"@ZIrEfˇŤššâÇŹţ;>üI{I󏍵·¬Ĺ®KňŇţNŞ–7=ŹŰSGSë*ę+\´=.˙úd]jjëŃQŐĐťĂ^ŕF—Ná› ‘ç*ŁČn@­äéőIb+iB řőÂó*K—ÖQWQJ*!’ԏͰtŐjššpä硄GyS‘ÔÍ–Î7Kxűú:ßΩŤĺnÎ ]řűŘ‘Ó ôśĺôŹĆ2ľpśX"CEy9ů;6määľřć'Ůľó­knaßó/ŃĽn‰€ŹŞÚRz'9zô%˘Á,í/˝Č/LpzŠ3ăĚ rľë ťăěbżo’í;Ѷî†&­‡l±Q][EçK»ÇSlÝşŠ_ţ`;«66ń̨k(ˇ˙ü ‡Ž¦¶e=éĐ,ĐÖRA0jeä\7k67ńÔŻ°nóz&gâ´5Ő T0>1‡3!ňłóh'Vůę ,˛FWńĄŻ=ř†4u8’¤ąyéä(UËČjж|9©v ęW˛vÍj¦:žťF§f™ ëŮĽą•… o4’ÉAtţ<Çű§qhaĆfĂ„f#8ě0<6G]s ­Ť čN\ Î<éaÎŹ„YµĽ’îs˝¸«ZxřÁŰöŇTQMy}%çĎž&%Ú¸ëţ÷cHĚâ(.ájÖ0-Äp7ľpś±šÖo%2>@MŰrbţ(QşúF©©Ě#e-"ăĂ adD!J{˙ §“É‘ó:3˘(ŇŐÓAŤáľę—­&–J˛őö-XŢbůÖ›ŁÝÉŇŇ<ćÂ1,ÎbV.k¦¬¤üüBJKŠ04$K+—-ĄĚS„Íf§şĽÝ»^D_XIme)v«‰”ް|YuŐe”—xčí룱ą•ÚęJ˘Q*ęZĐeb,żm+DC”.ieÝád{ľ‡­Í”¸L٬hmٶş ‹É‚ó2•Ŕo&č s8Ć>v7ţÉ)*j+8wŢËG>q/§žă¶ű7SZTLhnęĆ6ękk(*°ătćcĘŻ`ăš%—–Đur€­÷oˇÔ]ÉZD24J]ă2Ęś"Ţ”‘[[‹™JÚYZ㹪÷AUł¨ĘĹY¤…ę`.éÉ››ě#ÇoJ&"Č®rˇ–’ÍNExŁŁ*é+§©á3ľ˝Ś_Ž9®©«~DIÔ0®ądęV=~íęĺäȑ㷠3 fRĽŁ,šF×ńýůUÄĽ] ůRÔć‰čKV˛|I˝§é8ďĹbČ’ĚČlş÷^n@7ľ+˘© gíe6¦R]ß@ŤÇÎÎíű±Ř4LH˛5kZ8zŕ`•›îÄ%Ĺ8|˛§Ý‰?¬7Č(´®nCdÂ“Ý L‘_TfžÚ·˛´©âšë2>؉d/eôĚAt®rRŢaÜ­h¨("žaŔÇe*eÇcŚ36źaË[IÎóňÁÓ44×ŃßăĄuM '‡Řxď]‰rxç^Ü-mĚöź%„‰űďşóšëňn€TŮÓLIţââ‘™1;¨“i˝ővJę«›šăHG€őknx?Ôy KE3EÓ»˙5NżôÓá·=€Ý,ŃwúM­Hˇ'§8ŇgýęZČŮłż“¶ćĽ '-µo­d‚ z3ÔV-n>Ô»B{s€÷2ĚÂc#zń m÷˛zăűŰţSÉ•D†úB8Ë–ŕťäÄŕ•u­nBă ŽŃÜl»­†ýGŰi¬ö`s;ě;‡»¶™°’c'#äU,G˛NQWéađđntEĚŹ ÚťB! =Nfćbřg; 5ˬO!żČ‚˘·â›¸.FI„h.*ë*9¶Żęĺ+ńvŇPQ„$jx˝#Xâ"zÝ<îm›ńíÝGJS~)-ŤóÚÝÁšmËŘ÷Ä ÖŢŰÂřČ<Ą&?1Eŕü™>¶Ý¶’cŢk®Ç»ĄďČ dÜ«Yˇëäďţu7 ő%d˛*˘  jŤMőěÜqĆz©¬Ćí}‚Á“lşça&NĽŔÁg§°v5/=‰ˇb)v]Ń\Śšfb>C4ęCkg(iĹ0;CyS ÇŽbó4ďś ¦ÖĆs;ŹŃ\ç¦iĹ:ö˙ú'«–áЇ)lľ—MË+ĄGT3±ő}-ě|üg Muawבwî4‹‹t @Ö ă©m"9|„©¬lHajŞš‡¶-Ł˙l'á€J2’GĎľY˝ŚĹÁ쪦·Ł«ě¦˛LŹw^Ą˛ş˝(Ň´zËUMS_pX®śEşLäG¤Ľ®–ٱqşě¤iăÄBýÄE¶Ľ&Ú÷Ó7—ÂnqPę.@ąI§ŇÉ|ă}´·wâ›expÉ‘ dGžB'悬ÉđE=…ĺbĆđÓ)JĘĘĐëôiE/owyĹeŘŚ2F˝T"Ać:蟊G™eÚFăĚŚô5ÂůŽ~˛™s““$ÓłL'ôîÝÎ\ÖŔř™Nć§úŘ»Ż“˛ }˝Cä•éď&›#¦+Ä&DZ¸ h?~ś–µ«®˝"ď“«0Îń#í¸]vâşV­hE1¸XµbçÎvăvŮK…¬ZŢB&ťÁd€öSÇ™đ%XÇÝLuśĹVZĆüLµ[ď$>Ŕá)Fô4/­`Ú§ d¸mŚöQ\ßJI±“´.Âŕą~\N3IS1Ć´gU9łÓÖ˝ď.”čâÓüq˙4çNźCg(i\‰ÇíŔUę!4ă'ż8ź/ÍŇćRf"j*LíŞ÷QřĘŠ m+i®o#‹’_śĎü|† wŢ…„…’|-k «a4j«\ ±ݞ Áb<ËLv|°Av ji,Vˇąt–|¬f±Ź`(‚$IdłPTVvÍgżS"Á9"IŁE dÓ$I#ťŃ°bŇ ¤5“ÉH*ÂçŹa· †"­yäĺY‰FbőzDŔěä˙ÇŢ{Izźç~żÎ9ç0=Ý“óîlŔ"-2$ń¨,Uą\ÇeWéÎĺ*ßřÂ.»ĘuJ®s,É–(Š˘HŠ ‚ŔŰ9ΆŮÉyş{ş§sÎŃKR »âŘ,ućw×Óóu}ĎtĎ×˙ď}˙ĎóFËUčôęĺ ­~Ë3ys©(µ–V­ŚĘ`ˇšMŁ4h5šEMÉ •ň~&ołDˇ\G§5 ‘´Ç“hô*… &‹Žd<‹Ń¬§ŐM'1ZlTËETjÍÖŠx TĘeÄÂ6ů|žjÔęűy´ŐZ™TDĄ\ Xn ÖhIDD„4nn"×ШÔ*rą Ą•ZA˝V'—M#WhPiÔä!2 őbµÉJ>C˘Ňˇ”‰(•ŠÔ ŃhK…Äă J-*Ť‚z˝ŤBţh;}sÉ(Ą†›Ĺ@4BŞTS.W°9¬$Â1´f#2™śL,H®E&W!h7É$TjmRĺjťl"u˙wĄbju(çc(4VD­2™Bť0ĆtZÇŢŢÇۦVŠXĄ5~WI =şÚţ掛z‡vř=P Xeu~§›ú76:a‹đń·µvŘa‡?Eż6őČ]$ŤZ…٨ŰŇ“Űa‡Ď‚r1ŹPŞ|h&o¶Đ@÷ÜŰR!ŹX®DşU™ĽůRĄúˇ™ĽŮb ťćńt°ŤFŤzµČ'ě"µy˙íŕ9D!xŹS··ę cŚ/żxzÎĎú§łüĎ˙Ăźoť‚Ç@ł^âG˙ň6-©ŁÍÁó{|üçżú!Zť“ĹÍĆĆ:Ż}ţ8çĎNŽDřň˙)ňč2—ü!ÄĹŤŠj:…H.gpp-©ŘňuVĂmş<Výzú÷đú+ű¶\Ëőóďˇtî&0DfsÓw*ÖjvąeÜ›‹ňµ?űÔŁsüä+ě=zś{·Żóµo|půĚOŃwěfęÖö{‘ŘÜeLýÇčx´D¶ĎŠ‹źˇśÍâŢE»ŢĆaVMe°tÄŇ9śf=±ł’h*Gßţ»Wą¸€z Ow7ă#ĂÖÖqtxHEý8<˝„ć®r+(ĺŘ>­Z±ĘNłAf°“Ţ‘ÉÄŃ»{Ń) ť«c7Ȩ·DÄ"Qśťť$7×pvŤ U<šŐâíďü-Ĺf‹/|•z*L2A¨6˛g×0ks«8}n ů<Ťr™¬Ĺ™«!ž{f?ú*˙Ű_ŔWŽYY*{éŇpúÜDC+ŘL Ţ=ďçčx&Ł’X¦ŽÝ¤@*#PkQ<ĆBéýőĘ'XÁÜ?.ÁüŤeˇ‰/<ż›DĄŽ®ÖK#ĺ©wɦó”’BĄ&.ĺ“8•ú>ĺTŁk?/>íĺÄékH:ÇzXź›F(—áîěäŢÄeúw?Ź#qtl¬ťDĽ™ ·™DŁÓĐn7É+hśvfŻžG!“R©‘Ę„ EŰäÝń¸]l6¤ěÚ=ĚGď]ařŕ1ázłĄ8DŁŃAź¤DĎŢC$“7Š@íęgw×&:ł »QűkŻ·´¶Dt#ĆŇśź·“lă mţ ›łw¨÷Ă“đ·oźÁÝá¤×căäZ„>ź˙ŠSçoâń8éî°˘0ąYZ‰ńGoľÉĘŐ“Dj9NśşH|ţ›m/?5Ęű'/±wĽźőÉËtůlD&/0™Ş`- Ń$,…ĂČdzä†OŹęůîĎ®ĐŰĺäŤăÇ8űŢż°ŮÖóúsŁĚĹĄ|éŮG MWY<|ńĄ=ü?˙Ó7I©ŠEfž}ľź˙ôż˙5Çžá˙ň_üoľÎňĹs,fł8ĚĂ\¸|‰?~m‹¨ÉÇ·W)ÄWŃäű˙ç{|î ă̬ա–ćÜ•&fE–JIަ&Siđą7>˙X߇űë•ßÝEzŮq7‰ä"µ“lŘĎţ㯲|÷Z6//=˙,áOďďg-ÔĆç~rżńD2%·.ÄÔňŮź\©ÁÜä*ť ™TĆâ¦G/ˇ¤v k×ńt8 –‰†„bÄ2 2•…WźŮËÜzC#GÇĐ0ţ­š=‡ž%˝±Š·żwËÍŽłw.łÎÚXAc˛_źEÝă%˛C#/óŃ…;XŤ ‚-É©K„ĘáÍFźžť¤·×Ăí+#DLˇˇ`sy‚ÍŠ­ĽŽÖ쥛g#'`°ëÉýÎŐÁ*Ďp{ĆŹÎhŔâěb¬ÇMĄ­`¤ÇÍÚú:*­«»‹Ń ­­ ωó—H•a߾݄—–kHd&ž=¶źZŞÄfr&ž:4ÂÜĚ<:ŁťB€H­E«5ŃŮëĂi5ťNŹÓŰK ±r±ÔÄóĎěŁRlăq™IÇěÍ LÍŘut„FK†ÇŁ'I24ÚŤ1©§‡Că]LM͡7ié:„QѦĂi¦*wňň‘!2™á` swOˇ\’ /Ň5vM#Ž?ź{iŚŰ3íé{¬™ĽíV“fó×»HĚä•]m˙ÝŽŮq‡ţ]RM­i[é4=ŢŞŐ`ŘEúÍ«Z­VŁRŢÉäÝa‡(ěŘŕ±˙O·ŰM>Q &Vl°–­?čwwŘa‡PŠ[XźÄ‹$XB.ąI©%Ł–Ý¤Ô’c”µ‘hÍ$6üč]^, ­ětlxľ†ĂjE)˛¶ĽTÖ˘\mŁ5±š´×Ö(Wë]>Śj«KkčŤz‰*•Šrµ·«“f[H˝"Ž"Ui¨ X˝˝č·ˇ}بWi¶$‚«HŚvę©:§µR ´(«4J) MJA‘LU×ă˘^Îłľľ«ÓMt#«ÓBČÇÓçCD“Łż IDATŤĄ nÉŕ:·ÍĚvO…|!5š"őŁźkłĆňâmˇK‡˝ň»myV7JtyŤřî·ŢáčA ±˘i9‹c ›dp‡×ÇŮsSô{Ľtx´řăuşĽHŃzzĐ>ÎŘĚGô"=¤÷‘C­čdůî]$Ő˝{žA®r!k·pt o=řĹž4šµ< ­źĎ{?“W,Ăd3Ł·şččĹÝ7NjyťÍŤŐáFŻUáŘłm-E$Ó˘odµ¸Ćť[K¸†{)1X;q÷ ávY›şŤČđh]O‹Ç×1žž~ÚĄ4zkÂJ•\&ŹÖěĤ‘"ę0ȤHÄ4ö~…,"ąŠzQŚŰćŔŐa٬ătŰ)§24v„•(ŃXŤŐF»śŰ-ź†fąLY%'XžâîRŹÓÂĚr ŹÓÂä­ü‹÷\ŽŃa7“Ě—)řş{1tě:p©+×Ȧ"ś:u®Ń˝\9yďŢCTŇ1lˇŐ·&ΑMV»pŠŤd†Txé?ąŤ«sw™ögĐ*äÓa>úđ"˝»÷â_yt7ş\c { ŹąłÎĺI%Šě?˛‹wżýúôrúÇçpúśl¬&¸ŽŁo•ĚýLŢÁ>7ɬŚĐě,‡úůčG3|đ›ŃC˝>Đ8ŘĆPW˛SqÎMLˇ|ÜmÎGtS?dtěęµz÷0ŤF“‘Ńq2›wĐ{Ç(DÖđŽěĹbŇ>đź$Ä2ąč,Ó«a”Í,Ńx\,F- ÍĐŃ;@żĎHcÄ Q ×ëČDVńoäéďw\]Ăŕäř+Oł±¦ÓîÂŮÓI`nІXË‘ăŻ!*FŃÚ\[nö ,Ď’ÎŘ\›Ç;ţĹđ2îŃŠÉbA‰…ĹuÜn-5Ą™Z|ŤD!ʍ!B@ŽąĺUÜý6VSyi‹Óôt[©6Ää ?÷™Ť]#{9SöłB˘ÖÓeS’Čä‘kÍô â°YĐčLŘmDÂb…žľź˙\©Öârč¸rî "˝O‡…LLµU§·ŚÎN7V‹ ˙Ę"=CtvvOú±yú7ĘôZŮĐ Ss!,v3ńH‚áýÇŘ=čŢr-ÁŐ9Äj Ű}T+8÷<Ĺ ÇB9giŁ´ŕ'PŐá–çYI4yőĄg)%Öřŕă[Śď`z*ȡ#˝\Ľt—g_z›NŔŮ'‘9»É…–ȉ´ĽůÚń-×ňi¸~á ]»2w÷]=ý”*búş¬LßFjď§Ă|ż˛<}›[KqľňĄ—Ů˝F>Eő˛yy‘RΕKóĽöŐ/âچѿżÉ…3±ëČSÜ˝y™žž~ŠU9}>+Ó7ŻcÇüóµS7®±’.ńů—źgeňyeÖV„ŘI=ľÁ¨ŕÄG‹üéűu ňí›iő¨^¤‡¸© śüÉŽ}őMž~î%˘oźŔ×ëăüµ_ţŇK„ľýźY W¨‹ üč{çů‹˙ĺĎřţ˙ý·<űŐŻłďéç8óáeęń:Ť’jÝMf~÷¨šĹgŽ=Ë™Ź®[)§Ä+zľř|7'/Ýe°ë:ł’őąiśý#$Â+śż–ĆčŮ…Xyßě8wö$b›‹ŤĹiZz3ńDo—ŤŔF–dbŤV)ÄF¬ŤŮŞ@¨2˛şĽ¶-|2D±ŞĂ×ăáŇé»ôîŮÍęä ‚f…ů•E U)"á&Ž×ž!öáYĘ-PěôpúÝ Žľ>ĘfRĘţ›‰,6ť_ʇ…ő ĎŮÇé ˙–ëř´Ä7ýLĎ-’­TČŠÜ™ 0äÔ‘+d© .Ł6t˛|ç:jW/Jµo——Ů+Ôšwn]$źĎâpŰH¤Š\üń[Ü[ŹÓçÓłçŘçëyĽÉo#]á­o-S6)dsÜZL0d•’JgÍÜD¦đ2?yµ}«ë~ë»·Ż“×S4H1·6Ap#ÉШD˘Č鷾Ý• ÝJö?ó5Ľ[;qôQÝÔ­üô±±ĽĘ˝s'yú%6yšŤÄýÇÇ^ÂéíAVo˛ëŔ0·&'é"¸´Â‰ú.W'}vY“ϬQ i·›ÄŁ~öOßCëö>~Ĺ@$S’Żsov‘d,ÄšP0‚Ćâ ·Ó‰ÖÖŤŞäWß*˝^ÔŮk›5ú‹…äe%­X{çž®^,:Ťr‰j­ą-™ĽíVťŘfd±F«ť%¶±B]ÚbzrÚmŇń•z’HĄÂĚŮH´ŐřďN“¬rňă9|Ý––‚”‹!NžźCŐČâ&HUꔋ1®_şÎľĂ¶^ȧDŞu2¶k}&B%>»™ŞPËíá…W^%\ÁĐŃËň‹řĎ&ksKÔD"@ČČđccă‹÷ósă™$Ăc#( N†¶éâ 7řßłźUAK˘ĂgŐQi°;=Ľňú+l.ĎaďĆnüĹFşËÓK4¤@ČŔŔ(ă{÷üRG"›al×Jc'}[|qG_ÁüVéľŮń+$6 0!˘ŠAg č_A®ł"4ĐkT,-¬bvşJĺÔJ9šőB…‰B*DM @%¬#ŃZh’Hő¨$I—ZšEjB˝Ţ­˙ÖHĆB$ŠMÔ‚: ˇŚZą†LÖ˘T›ÓF&¤Ü!hÖQ«U”rI›,FŃxťŃ‚Ăj ™Ę˘–JÉ…¬-Ż#Ui±ŮlT 4FË–»©ă›ĘM1ÍJ˝ÝM)EgsŇŞ7ŠęřĂ ,z5ä9R…*V“ą¬Ĺz`łŐJ!SÂf×ŕlb2ŰШUDÂŚŽÚő ý“ëŚ˙…B•ZM1źˇ-”SĚĹ´ Ô—ÓF­Z#!ŃQÉečő*Kk=^Ä­‰śv˝B©RˇŮ™6")lv+ťö±:ŽIG.M[¤$źŤ!l5)·$t8-T*5"( T ):­‚őů5=Ý´«e$ %őr‰jŁJ­ I›ŤX‡ÝŠN«ŮrŞÁ<0“÷Á7ő;ěđpŮMý›FRyV6SŰ~Â;ě°Ăr1•đ{w‘b5ÉăÍŽŘa‡­¦V)!Ë‘ü|CY­R˘\m˘Ő=ävˇŐ ťÉŁÖéśűQ)•Ëĺ…Âź?.Rk¶ŃhÔŃQ'™* 3ę ·ëĢPűÝż÷ ¶ŰmÎ˙ěGXű÷S MscÖĎ~7›euŤk7. Q÷aëTŁVú(×ËHjqűI­Ü"]SŁä~ů8U#Ę%‘vŚ˘iE¸µâż˙Ź˙ńqkţ-šő2§Ţý M‰˝˝Ănľ˙íź˘Ň ĐěÄŁ!Ž˝ň×/Ü$‹sü‹o"K®qŰD\…¶BJ#—G Ó=0F[,!µv›ŕf ·KËF(§g7Çžßr-÷®žDć%:{Ť|SŠ G?|”#»űÉĹ–¸6›AWńŞič·IX\‰óĘ›oRŹ-púĚ5L&‘x݇™ąy—±§_§Ç%çüÉ“šBČĺ1 ćČžŹN}Rřč­oâ;|ś[çO1ľ?+«ííeaz±ÁÉĐ`?épL2ĘÔz’Ż}ýóDç/2—2ҧI1ť Í̡vząws•ă_xq«…^+Ł)P`Đ«·EÇ{ßůkv˝ř—ĎśbďžÝ,«ëŕŢí»}^z»űÄ"aŮ2_|ă÷N±VíÂŮZ%ضR\˝Žg°‡ §×řĘź}ŽVĄN%˘%Ö HxůcăS™ŰI–nű .ݱ{ď8ý=c ŽŤ!n Ů˝w7}=CËuŞ…"gv†Ý‡úXą °ĽÎřÁٍőűŹWüŚ<ŠV­¦Q^[c×ř.ú{ǶHőŻSÍŃ8öňúŻP/•(´tvQ+–ČäNfn_Ąsř0»öÓÓé@®S!”Ę)äł´„Bš­:ĹrąŃĚćň Rm – )KT·éŰĎétRoJ¤‰Ń1x„F8 €ÖhC*(S«Úé é?€ĹdE$­Ł—Á./ŮpGGi´, úĽČU2«@PnĐ´ -Żn‹–OÂ`ĺŇŰ?@$ł¶¦ŹqíęMÚµ"ĹtůöwxëżĹĄëóż<ĆĺëGÜjQkJ(,_'°ľĽJ¸đĂďňo‡wŢů Őćö™x56~÷{(dÖü›˛®^»C»šŁňóOóüđź˙ë·Ö~yLgß ÔT›r2łg‰䬭ŢţĚ?˙ß˙ćwxďÄűlK´ň§3;Ž‘L,"RŘČo®1|ě9î\:MS¬  1|d?«s~LV##ʰ>?^ŰF¨°pűôO‘:şŃ)+nťţ)rgV=}$V9öň­…Ĺrî]9ĹňúąX€bąÎŇÔrµąTŽÂčÂŁjSV;´j¸\˘á5’›qę !ą‰Üđ٬…˛¨«)ĂlٍŐ*ĆŹ’ ­áîíÝrłăŇäeü›⛫ȴRÁ”>Éő8*Y™‹—ď`ÔÖ‰4ĄdfŻ­‰©Ç24›ś>woŻžąŮ FC“KW§1©Ä”Ę ¦gnˇ2şPČkt Žc5=Ů9?‰xš#/ľF»’B¬±SĎD´ĘTZRFöíŁšËˇŇqy]Ä2zz]Lśü݇^ŇŔ=r—QA±\F(”cµë09˝Řś.ú{ľoă1Od9öňëÔ Q¤ZĺTa#O{ď%źĚ 6ŘpşíČ” şĽv®ľ{ąoU»Lďţç1©„T›Ušu9Î=ćŽ.lv'}}][ŢEÚ1;î°Ă[Ć'6;Ňl@ăwovŘa‡˙šiń‰¬6•źţńÄî°Ă˙Ni7i·ŞüŢmj‰T‚\.# "ÖZ©f#”dí2‰BnŹťµĹ¤#›–B±‰XЦK"ŐÚĐ©ET*-Ź)»ôÓ’IF‰ę8ĚFRëëQ¤Ňĺhő:,Á•Z“Í…A%bmmť^C*ťE©PP®6éětĐj‰¨—łDcI¤ %µr «Ë‹N˝ő9¶ÍFŤFK@2D˘·PϤĐÚť¨ĺ EąTŁQÎQhÉPP"[Ňé´QŻđoDqąěD7ÓxşÜÔJe¤JB QŻŃj ÉĄŁ”F4r­¶©ôɨW,P*ĺ÷[ĚZíoŤrÍ$¨ő:*•&ęGͦm5H¤óh”2„Rů¶´­ …‚V \‡R*˘P(‰Dčęéůy-¨E"™¦ZČ‘,Ő|ĽłŤ> ÷7ÚŐřť×~łČ›ËWpńţ[gY -1q~‹[Í…s·W6ZśüÇ“HZňŤ—f7H§X› °‰!-.q{CFď0‚´VLđ“÷/˘’ ¸»č§ßcćíwN2;u‡JŁÍĺ3'¨DĚ.D™žša`xő g™)Tżt…ÍB‘…©Y$Â2`˙¦źé‰Ó\»„z‚•p˙r”ˇaď–kązúÇ$Z2áE®] “J°+1Đí"žă폧H//2łâGŻ—sçâUśCc´ňQfîÝăŇ©kd*Úr=ď˝ócűĆNţD N~p Oď÷.˝OAîÂnx2÷B}řÓÓhçy÷äMÔ˘&W'¦Č§7¸vűŢ^>zëďI‰`nr™ĹÉ›¬DsŤ*Vćg)¶Ö¸z™LąÂíëÓÖş1Ërü_˙廩Ťnrîâ DŤ—&éęéÜ’ý%Ľós‹¤TąrkžJ%ÇOţůŰ,űŁ)ş»»i$ů?ţîGĺR66(…Ö ĄłLN\g3W§ÓeűĚ.8Ź:xíÁ—j ‹MŠ3ËÓ/ďâÎíۨ >ö즿:N±ÝâěE?^E…RŹFďCŐjáëî~HÄöS/§Ń»Ř=2€I¸;Ś6z{}tŹ›ż‹ÍÓŤŻ«»Q‹{ß8ÚFŽpşIo_/jI“[wVéÜŐGÎż€ŮÖ‰«ł·ÝŔęěbóödňŢOź—Đ30 śĆÖŃ‹¤\!ź+˘·¸°j%Äfśr9J•“kQ)ŹL­GÔPĐaq0Đçˇ^ŇíqRŻ”)WtwwSL$°[lÜ˝vŹî®nžĚµË}Z­&•J•l*Á‰÷~F2•âŢBźMO4SDëęCś\áÖÄşvďböú-’©«±—Ţú3łwX‰$ą{ýý»Ć™»{ŹNťexd”™É)nÜ[aĐgăŇÄtĹ{SřFžB+ óýťâřK¸s{–}Ď˝NSĂ®”`:Jas]×ŐL<ËPo綉}ąžxđ.‹aäő áDD(…V/"/ŕí`¤Ë‹Pk¨–c6m¬°Ě2Řď"ŘŔÔ1Ŕ—?˙,ËKtŰěxşX™ťŁ%ŐrüŐĎŃΆ1ą:¶Ü츲0E,] °:O÷řa2ÁE<»†Iof‰JÜ™YĹۡ"Ż0S/˛Y,Cąd[Ĺ;ěfe!ÁŢý=ĚÜť@€”¶XE|c˘XRÇ;´‡ll•d©MW‡}k}BDR9C…RF†»Č—[ â˛[PktČ%Bz‘kÔśůéŰčűÇÉÇtôŚQ®¤yń•ă¤6c¸űčňşQ*őÚ;ŠH¦§ËmF%©ňĎ'.ńâ3űäÚěßÝ·%+©VO·ÄjUÄ öwŁikÜtąíhőZB_úňëd7łt b× [ťty»°TM¦'~ó{™ăá5Úr VăöěvÜa‡OJłVdn~ť®”?Ż'ĺó4š{¬H&ľq˘DŻgŰöÄü!ň‰ÍŽą|‘D*űŔČŤh>ôůvx’°»Ý” ţő&G@őw}vEĚ&Hí|Ć˙MDÂ6rÉ'›kK·žěé~;ě°Ăg‹’rę|˘ČL€d`š¤ĐŽC\ŕÂő[X\}ěŢ;¦…ŘŇ<‹•ĐÂޱChmT˘&ÓsłÔŰ2ş]&ć—WŘ÷ü—°h·/'ô7i·[ĚŢĽČF¶A__n‹’3\AĄiQ©KQé´ěŢÝÇő‹WČd Ś~»˘Î•k·°ÍDâ 4J%…J=‡öŃlK)DX\ ·XČÄăôî}šľ®­OB‹‡WAndýöeÄŐŕ ¶]Gń9ŚÔĘi›%Důu"56iž`şĹSĎĄ’ pńŇm†ÇY °k7“7W8ňĘ (ĹB˘Á„  7.ăŘuU+Të¨Űúq¸ź„ąëg $ zîUtĘýl2Ir-éŔ<"K7zr\Ľ|ďŘaú<˙ZOşsăŁ|ćŤŔú:­RuÇ(fŤ”x4J©\&‹1~ŕŔýB{«ÂŤw1(¤˛ež;vôÉąm{D/ŇCCżg–üäĘK¬×ĽüĄ/sőÄ ę ł˛4MĚźĺp§‘u™ťŔň" U ©šb ű üă_ť˘cHK ‘Ǣýě&T2A˘ĎéćÂÍ|ű”g°v ĚsŁ™BăE Ř¤§ÓÁâąínÂK34µéŢ. ëë ą ÍbÍXťY‰Xggmay[.0éÍUĘZŻ“Ű—năeíŢ<>ÇZŐ<óKËčj„˘†çź"~ţĺ&Č5f†ű<\xď*ű^ăÔ[—Ůűâëk †z­$BËTä6˘áyµŹ$†Đe|b/0É"}z7?ľLtý&Ú®ĽÝť¬Ü[B)kŕ÷‡yîM·ŻßŕŔ‹źŁ¶qŹ·żő–.rÁ©t„…Ą9ä}#ű¸{ć=ÄŽn¤ŤÖá—92ş=͉©ŹßEâ9ŠÉ˙>?\1¸o„µ[çi‰d,.ĚóĆ׿A=4ĂÝ™}>˛… ?ú/‰ČfŁZ(ŁvvňąWŽvűb>Ť›şÝ*ł23ĹÚü:ŤfťµőU•"ëË«TšĆöqýĘĘŮ(•Ş€!»ŽPNF5›$ ˛Ů褜Ęo•ĽGB(‘‘ODđűäÓqbŃéXŤÍCw'{’lśęŻŁé@ť6E!l $‘u4Ł~,îA<}#Ř ňń(Ͷ€Ć6ô %1ąd‚rKDŁ‘%Ń’´Xť_G(’PÍç¨7rdj5ü7ÎSĎ/M…¸v} _—ŽÍp •QÂf8F­ Ď#‹‡ühť]J÷ç2OnýˇVĘňoO…Aˇ „ŠĹ‰¬Zbéž.R±€Ŕę ëk~l^k÷0u ŕčd÷p?u;‹H­b}-ĆľgŹS˶M‡ŇŇI­şÎj0§ËKĄXĆíŔŮ=ĆhŻŹjŁÉôĚúV–;3Đ,’.·qŮő8úźB/~¦męG]Á<ĐěřŇëŻS(¸Q™ŐĹe:zzŮ\^ÂÖÝOŇż€ÎćA¦PÓ(¦QšLÔ urɡ«FH ”ˇolđ3_Š&6×Iš¨5"9µb™ĽE©ŇĆÖщV. ÜCłŽF٦”ŤâßHa5k‰DâčĚN#ÉDµT†X!du~ ©Ć€ÝᢒK˘±Ř·ĽMŰXˇÜ”Đ,g18}#!t.­Z™¸Îz0‚Ĺ Ł‚q#M*WĹfu"“·X_ `q8ɧ třlע¸;í4‘O¨"§]Ěač覔 R¨đ¸·/ű÷!Z#Uláë´łľ¶ŠŮŃ…¸YG,—P+Ąňtz}©ł´0ŹŮí#ăčö±ą˛Âä ‘QŞ6ЪĬ­®ŁŐŰ0´T«-4ęíYąĺóy$Ôɫē.'‚Z–r[…^%E¬PQ)QkÄ‚q¤Z%µLŚRĚ&´ë¨5[ź˝ű0”ÂVŮŻ×`ÔEÚqSď°Ăż7źŘM­Ô1 *Ű~Â;ě°Ăâßş=zÄ.’NŁÂjú·7#í°Ă“J­ZA –>Ô°X*•P(•OŚiđ7©–ËerD?ß=\-—©µZ¨Uއfň¦łe´:Í/ŹŮ>ÝčX`ęÚ‡l lLśćµ7ßä˝§)FĘ{j€™Ť{ă·?ŕůoü9ľű¶Ý{147Kܤf®P®™xí {xďø{úxéČž­QúoЬWřéŹßˇ*T`wwđÔhó·ď ŐÖ`'‹đęĎňńélĆb|:íçüŇ:˛Z›¦\J«±”á±]´ĹRâ+7YUétëđÓôěăĄvoą–›?@ĺ#xď yŽbÚý4ĎŤ÷‘‰,ra:±`µŞaÄ&dz9ĹWżń&Őč?ýđ.›8Ăč‹©™0Ż}ý«8µ2®~ü3L˝GI.]Ćěcvâ"}/Żßżĺš> 'ô]âĹ2űŽ}•°ŠŢ`D® é L^=Ź÷Ŕq¤±>žZapl.ŤłÓN*âĘŤ ö9ŚAĄ ŮĎćĐ›L2 ôJŮöT đ÷ĹÁ׾Ŕ™“pôŔ^C ŽŤwrăęuôy˝ÄĂü+‹¬fJü‡Ż|žĺ;˛ZëĆÝ\e;…•kô uńÓ÷řďţÇ7ÔŰh•BZ":ő#:É?!źrtl›™ŐÉü ßüËoŇ{đ . Ăyţôë_§^ŘŕbĄĚąó‹(ŚRöÔ>' IDATŔěZ”t1ڏśŁ&U3}eš7ţ䏰~F•ŢrĘŹÖ1ÎńŁ^Nśľ†DˇĄg°“őąiôöNĚV×.Ń=ú –Äýѱáą"ą‚\<ŚBi§V«Pk¶ęŚ,Ţş‚LҤPŞ#‘´ÉĺK”·©–ďvÚج‹Ůµ{ŹŢ˝ÎđˇŁ$ü1ďCo˛!noP.Ůé•č9p”dň"!\ýěíŤrďn‚g_ăÔ÷ďrüOv ¤pŽ8p;¬dj \+ٶ’g`2đäŢ" UfţčKůŕ{ž=‡vŕÝÁµ‚F…RŽ[óő7ß$>s™ׄ“y|]]d“Q.ť;C,‘ćµ—^ŕ‡ßú[ :GĆ:hh†řňł[?Ň@k6ńĂ˙ď°u™]X#š®p2ľŽ´™#ĽRáŁDhs­uîű÷Ţ–®)"&6ű!ńŞ–ÚüďüÝß°®38bĺK_ů3t[ěćyÔѱŽkčs05łŽ´ŐFbëäk_||2ŔÝ›Ëôv¸pg’ŔĘ2¦ž}c‹4j-µ ŤHš-Ś}# ę%45.ś»@ŞÜ¤»cű»B©śkg?`f-D"´JˇÜdrb…ZŚB¦DntĐĄnQT;×+řĽn6B«DQJĄ&rµ±TĎ ‡ÇX çPc¸‡F¬GĐj•Śî9B2°N×`ß–w‘¦'ÎłʲZC¦V_źCáó_K ‘—x˙ĚMĚÚ:ţ†ä˝ ŞjŃ ÍF·NLĐ7 çÎ=?{mLÜ^Će׫J -\ĂźPO,˛Ëqú˝X{űč~BÍŽł7/29»ŠÎ¨¤.cőîB Ň;ĐE)_"Y(002†şžääĹ«”k5b ,^'éh ĄÉÉ®~…¦źA@ĽÖ ÝVóňKOQĘ5đuX¶EG(’ŕĺ7>G5FŞóRJG4 T*žyţ0‰p “ĂCG‡©BÎ`Ż›Ó?|ď~&ołČđˇ0«„Tę%*eŢN#ÎŢ~ś»Fú·ü°ŐjŇjţzé‘2yw&;î°Ăż‹GűŰ× ęµú¶źđ;ěđ‡C«ŐŕŐ`"ą*ˉ▞Ü;ěđ‡ŤRVĺ'ń"‰% •Ó¨¨!Ł^. Őé)äÓ”rUĚ#ŃÍ›“Fą€JŁ%—"*(çł(uz¤R%‚v‰\ţ™›łŠąůJ˝VT, K#·©ŐŰ(Ô*´jÉx‚zŁĆ`A%ŹĆQŞ”ä Ed2µzłŐL»- Y-’ÍdË4Ş´fJůÖç·šuš-…T‘ZGłCa0#—ŠŐjVµHµ-AJŤRC€Ůt?¶´Z.ĐB@>SŔd·!˘E2A®5PÉeP,(¶©{ňi)¤Ş ¬6;żÚ•­×ŞD ©(B• ­\H4Ae° Vük:ŔF €ÓóŮg˝äłTĄb±Dr™„DxĄĹŽRr˙ýH„7H•ëôvű(e´ĄZ¤TiĺĐ(C«Âü|”Áń!âmĚ"ţ˘ţň‰ÜÔmn_ůxSKfć"ĂÇ^ćÚíeTÍ&ť. ›“–HÂů·ţ’˝üÜţ—;ěćÂůU,nŽ®—‘ćW~ţyT[¤ďQ¨—Rś9yg‡{UxáЧOś¤ŐČăčě&°<þ珱ľś ŰäŐ/}•ĐŐˬ ¤Ô‚ŤŞ©6—˙š“–¨A68I(&¦§[O*/A)ÓńĘçźŮr-w/˝ŹČ±Źzd˙zµR†ĐÚÍ‹Çö’‹.rúfc=IŞ)elÄĂüí9žůÚź «§ůčýďÓl)Š|ýMzMB‚ţ%V×i7Ę({ńęÓ[ßj\űř4*żż‹Rb ‡Ż‹ÓĘÚä,jŁŠ/ńô×ţśŔÄeŇb-¶|–Đü ýG˛zý*Áx“Ó…Ëj@˘0°±4Ź­»ź„ ďřËtڴۢ㣷ţ_<{Žqóú öďäĆtś§GíĚ/P™ä Ź?ËÚť ÚR™F“žnĺÔ"·‚ś¬˛R’‘ś»Jßľ]ÜąGˇl‰±ÚČÍř:Ě[+@ äQşH6;¶[ĚMĎ1{ Çđa¦.ߡ×碣ÇCą,`ĎŢýhAâ5·ÎOłëh«+Aôň¶VŁIŁŐúĚ73ŐË)4ćĆÇwÝĎä•*quu Ö°»śtí%şp»o_ď vłÇî1T­"‰l»ËŤRÚby1„c°—|p˝Ů…ÁęÄdŇ]_FdÚžL^Ź÷~&oW˙ ‚j»oI±LąTAkrbÔH‰¬8 4F#&W?âZ‰Žt˘Ś?Ľ‰Z!ˇ^*PkKѤtöv!×hhW·Ďä÷i‘ë­Ś>D|vŽ|j“ÉĄe®ź;KĽeâö<{îA¤RUĆ÷„ě&ö~/ďţĂ?c»Ő†Ă¨ĺÖÔ::y›B:ĚĎŢ;‰{`”ĹE˙¶é°ôěaůć]ş; äkb†z;×4 ÷v°kß^Ţűö÷äÓ„‚ń_c¶ąďÇwеHS«h\»IÄî?ĺô)’ásţ÷_\ÚŹ6I$đüĹ˙ú…ßŰíFe`Ôç@ łńňk/ѬćŘX 3şŻ‡Ë—.SlČyĺ«ß@Ţ^âč śŠâŮuFxš˛ÚDżÇ˝őB˙ Är1˙-¦—CHkiâ©"©pŤVL.WÁîíĄŻĂ3:…ŁŃ@bc™đfNŻťd,†ŢŃË‹/?Ĺúj·Ń€łŻ›đĘBą–Ď˝B+ÂčěŘňѱë‹÷H¦ólúqî'ZŔ6šHĄÍĘÍk45ŚőJŽő`’´š©@žjl‰›sAşĽ°ľx›H"ÍĄ‹¸ş»Qăô‰÷) göŇÇD+bÜö?Ś/•É+gą|{ wg7˛_ńgäR ę áĺŠB5ŇZ–÷Nś¤©4aŐ˙ëűsýę5ěîĎĽM}ýĘE V;“w®€@D2SÇ S2w÷"­…ä~ËyîÎó+tű:Yľw‰pIA;µJ  "˛6Cˇĺíw®Đ=܇|« żB»Ő¦ŮüőŮÔŞÁ<4“wbf™LyR«|wa…’ÂŚĎ$ăÜG×řň7ľJ-çŇÄ)2 Ë‹ ^ńXS{¸{ĺdÖC,OO±ŇŞđ•Ż|Ž÷tžÎ7_Ý6ńż ś˛–đĆSśĽ:EwÇ!: Ës 8űGXźżMąEëŮ}łăÔÉw‘vřXźš ®7‰Ąv3·%_SĎ®ł 7ÉQY=ĚOÎ1ÔeŰr-Áĺ{ÔM㸼N®źżA×Řs·fč~ă)j…×&—°¶$´iĚ/#rćc M¨lÜăggĎŁëČç‹l$źbĐ*çŔ±Ł\Ľp‹řÂ{†lůů?.˘Ů/ć҇—lÜAç˘żŻ“é[óč ¦ý|ńĎ|Ěž˝ČÓŻzŕ.ßţ›÷qďę'ą 1ą0‡ZCcąuî$"«q%küUžŰžLŢĐň]ćç—I•ň w§¸6g—CF4žD6y˝i˙ümD'óý doo'®Ç)a>x›Ŕj€]űş3\~˙ć‚9<6;üĽ[ŰIjóh]¤‡fňÎMŢavj©cźĎ× $ťĚ!l7هYşu†.ćŻ_ăŘł{8uć‰H_~žRC 4…7h‹?›M\B±„R&Ih3J1ź!‘L“Iç0{z8¸kđţxŐD_őGĆ0ä,EZ>rµ¨Îô=?Z§…zx»gáńýtŮŤ–ćie4·ÁP­Ń¨)d2´d*•$ůLś¦¨Éâ\©\ µ őf‘\ŁÎÚ­Ë”vâóK ĐáÔk „"ô÷y‰®,Žg9ýöIşúxú+/°<9·őőJ‘Čf‚Ttťş@@¶.ćÎĹËĚJŃ2CC]ŔýLŢP(Äňę:ľ“—ďâ§ł{Ă˝ZZ4­4M‘é9?O?N9‘Ů6JK/ŢN˝%U”ô»,Ôdş»{yĺµ—Xś¸ŠHoG«řĹ˙N‹řF”şHđą\ŚîŮO&s˙ś—×–q»ťÔţ˙öŢ;8®ôZđűÝÎ9wŁ‘#‘‚9s8¤&‘4#˝‘ŢÓęY»+˝}µ^—]ĺZo­íőľrŮŢ-—k·\Ţç'k%­âHi4‘“s‰@$"ÇF#uDçü(Î ‰yĂá @ę©U¨čľáś{»ľ{ÎwΩ]că pë`î‰"MÂ|íĹ#D–A›KCM‘ŰAhq–áÁ -›«¸~Ł—˘ň ”—x çšÁ[VŮlÇn’‰&UdcóVşşűŮ´m7¦‡Ô˝dfüSQ§&§±ŠĄ0™$bI…Ę p›TÄ% 䲸śvb‹ÓôŽĚS^č`t2·°Śš ?3yśF#ZłšÎëÝ*++I„ćp—ˇ_ăŮéäpqIKn9Lae‘ÉqĽŐSYŚÚ 7‡¦(+p‘PĚčÄEf–RT””ă+ö"Ąâ$)FÇÔ×U É#=h¬TÉ0ľŞ&|އą$ňţ™é'Shm(Ą§·ź’Š´bťYG*gr6BSc:˛´ß褸¦ž…ŃqjZęľŮŤ­°‚‡‰x*‹Ű¦Ł«w·§„Bż“dJƵN×!ăp:‰,Q46–ćÇQËqIGCmËËiĆú±úËqX x=6ş.uRłe3J*ŽÁb#˝#•I‘JŐ Ó?6GMM>·kÍĂÔ«ů`V­É»šÉgSçÉ“çďCsd3q>w6ő|x™ń`hÝΓ'ĎzŤ‚Ăx÷cŇ˝Üc`˛j)ŤimĄË“gŤsYµµjőgÖl&VŻči,źĆjňĺ˛Y$YAoxtäÔđÉ(Ňj|Ş÷u¸ă$óB!Ńľ ěxć){f ĚŹˇŐ)6«JAY‘ź¶M­ś|ďuâŃ»öwĆö§źáßťŔ]RĚS‡ź|h!AYĚpňč›dŢŇ 6Őňę/Žb¶ ­"‘Eö?±ŹËg®˛¸¸ČcGľ†)6Műđ(zYCNŁ‚TY­˘¶iĄ&oxĽ‰™$EEv0ĺu›Ů˝»eÍuéąz ż™@Ď%2Z ňŇ,Ζ˝loŞ&6?Lű`Gv‚錍jŚLDxňk/ˇ$.źü 9•Ź…ŕ;Ż:ΉŁďcŻm#g%Źíٲć:|\x÷w,Ć—iÝűvťŚŃlE«×ĐZěŚt^ĆÓ¸]h+˝CT5n¦ĚcÇět’ /qíj;wîÄbĐ!+éd“ŐF&ĹdsŁÓ®OFrçőkdBs”nÚ‡Q ‰ĺ(“ŁĂÄI¶ěÚŰá„\ßüîCęË‹ 'ybßvTR.ŤJkÄb~Ý7dT·ÇUřÔšĽĂSKD—gđąĽt];E×ĺ$ů?ý5Sď#˘Ń(zÂŃ(Rj µą…gš¸pü él‚+»©Řtëü 1ŕaő(HG&1ůÚřĘŽrNź˝†ÖPKqM)Á^,žb,ť×.R\ż{hĄul°Á`"śGçńË$µZ“•É›WŃiŇ$’YÔZ…řrŠ„(®‹.ţ‚‚9 ŤÍuś}˙*¶î"<1MŐŘ\>TR€DÜCˇ&Eů–}DÂë:Ć•ëm‹¨r™¬¤MŹ-˘Ä˛lm®Ło(ą.:|(‡ź>ÄŮ×.Ňßő!ަ]”—23@P2hT*ÜŤ02ŕéŻţáÁ+\8uŤXZÄă- <7Ĺąc‹Dc ö=¶źwň}D_ŤŐ.÷&žÚݰ.zL^=®ő9ÂŻ˙‹!ÚßMvn Q“GCzéω t‘\3uâű˙öo0W–a¶ř1»lĽôâóo=Ź ú¤qQ ß»ŮęFŚXN#¤sd n­–Z 8öÚ+h#Ĺ&ó3QâBV;±`ď˝)bµ;±•o%2ŐÍěč,%•ĺ¬O ĺŐŃYýËŃ…~b‹®éa¸űf›%“Bo+¦P!˘QŁŐ®„ą’R!#•’ŃË2sŰZĘ™]Ä,%ńÖ51>ŮA.Űö$02HZÚ„aŤ˙ńMŤŢb"1G@YÄŕ±0Ö}{Ăf:.ݤşRK˙Í^69­Ä_ű)sŠĂ™Ë4>ţ4ßr•pńB'˘( ˇSPiť˛ËÜčBg)][áżD2ˇi>|}«ÍŠŻľkQéŮ[46V1>É?ú!Q‘™ŃY¶íŰĎÎf?‘¬ĺĄĘë¶0tăĄu[şvśé‘‘uÔC‘ď/Š´j=††ZnőQ^WÉÔŔ[vŐĐŮ7Ni‘źŢî›lÜóąX?=3|ý;ĎsůÂEĽ…eT=bíFµF—ą>0Ť:˝Ä\(ÉěÄŻ‡Ň’BÄtšŠ¦ŤDÂłěÚ˝ ŻßËŐ3Çť‹RUS‹Ó˘#0>DAc ‰©a|ÍŤ¨Ó1ÜŐzěëŞÇ­ö ÄÔȆńWP]˝˘GEąźÔrššÖÍ̇g9°s;%>Î~đ.Óá•Uµ8Ěj&†nQľi3‹Ăý”oŮS¸ˇźs}j++(HąOF‘ů>jňć“óü± Íărů¶_GYŹLň3YľŹšĽËËIÂáčĂ9Ož/AĐ˙ř ?Ęz¨Ő U=ŔJެ!(­yËv‚Ôr”ë×®±4;K_ß-\>'ËI‘ʼn>®ś=ĎüÂ}×ŰQ[|8íkź} Ď‘Ě*ô]:IHT1Ůy ĹęĂfÖ#ĺ’ĚĂĦűšI[ˇw8@II1éČ §OśĹb5Đ~ˇ‡SĂąSgń–T˘Sçh?~ÁîâÖĹSD0áu®OgĂevf“YËČŕ8‹ Ý]íRGzn`°ZYXŚcµŢç}‘’ôÜD§–‘4ú{Žą¤"®uÜDg´c1}ô=03٤bv>‰ŐňË>˛ót„đűě ¤x÷•_ă®n¨[ű %­ Ě*ń3}0«‡©ł‹ Ž-2ą±; űoĘ-půĚ,ő/_ćÂۧŃ:ôt*´ă˝Ř+ZŚ`–‚¤'G±ÔěeôÜž,˙KR1;2ŃiFđŘÎ&ÎÝ x˙V4V-c˝řŞë˝F2=‡Ńߤ[Ivě?öş˛j&{®“ł9™ Ĺhj,¤żošLfŽlt’©Yz§ sa5·şz¨,=°ćşLö·#z6á)* űňeJęččˇřÉݤŁ®vŤă‘ŐŹíF{ţËŤ6jK8öę‡lůJÁ 5%LLÍS˘_"§·Ň}±ťşZÓ“A¨*^s]ľťgŢCÖ«™^ÔŇ<1ĚÄě.‡šĺŚÄ#ß`b¨ź©řËíé()Ť‹ÇmcĽŻ˝ŰGx2ČŇě(F—1ł€żĺ ĽY._4Nm™·ÓI&“]3? AĄ"›LŤFɤ“$–¤)ÜőlßŇŠ«¤ynŠŹKčiÝŽcy’±yرo?V!MÇŐÜĺEd#x‹©ßş—Şb#]í 7ÚµýRqş=ä’Itv7ąä"™dE%15:Áâ@/ČHJ–Ś$1ß߉h)&>6Fr9ĚÍÎ6l( O f˘ÜěžÁo,Ą&! ś^ŇŃąµWä bőWńäsϢ—3ôötaq8‘4NZ6LeĐŮ ń©˛ NQÖÚJ|6ČÜě4K˛ťá“ď "ʲbYaóţ,  R^żŤŕP/SK)Ş+‹™žŹă·ęÇ3k˘G&ąL"g&Ą¨´šŻŹtNÄYZĎSĎ&22¨ĘŃÝ;ąňľÇGRă  ¸ Łbxj›ĹDp¬—¬ŢŽ×_ŔÖ={1¨×ÉŔ¬–M˝ «šfÁP[;AIófnŤPÖR‡×Ľ {ů4=#ěyćâR:—̬‹CE_wÍ›7á–ô4a@Á]ŕ Šâ*ô®©®ź†ŢVĚćÖă q6ŘźĹçňa4Éô÷ ÓŘÚŠ‚đZ·IDATŰ´‘¸¤…’•đ¬A•#…‡ŻľTËHW'%-»Ů_UH`&Čî'^FkŐĐ}ő:Ki/~űŰ$– čÖ¸$0ër,Lβçë˙Ńń!ę64 Ą˛¤Si< %~IĹ‚67O4»ŚĘP* {‘ÂĘjÂÁ^2ńɌˤÁZÜŔ憺®±q˙Ł˝Č ©­ µĆ“Ď>ŤA”ŐÔ`7ëQé XŰÚ°ŰŚŘýĽň˙ţ'6~íŻÓËlinćóěÜwÇŐ+|ĺx\^L›|¸ěZBŃš¶JĆű/đë·ÎňĎ˙›ďšOPě^›˝‹ÓŁ4lyŠćÍfëJ]‹AKK[*­‰§_|’©éI¶ď/Çzű\”d4· Heé8q Ľü×»ďíÂŕ(ˇŐ»~őaEFP©e •JŤ,Żžśo›'OžĎŤY-áѦď•J˝’–rwúnw–™%˝ęAóäÉ“@ŁČź0.ź6ąçÉi3Sč}X5čňäů|H’‚őj>E&')h×!*´®üA/µđĐô“¤™Tě“3ůŢT“U}0rršżűáűT6–3Ö=AKSq…完ÍĐ´ˇš›ýčôvÄđ ‡˙ěEŢ?qŤo<ŮÂ~rڦm;ńŞfYŇ•“Y Čá¦zëF:Ţ{—‘$SóČ©Ä"*Ü´n,ÂWQĘŃWŢÂŕq˘ÎdU°e÷aę+ť|d1ËŃ7ß`YÖQZYÉŽ†B~řăw°ŮÁhńŤ†yú™}ś<~™ŕÂ"Ożđu쉧{‡0)Z2j2i$AMë¦M Ńł0ÚÎĐd‚ŇbSÓ!j›¶óřľµŻŰwýâ‡X‹›ë¸@ĆŕDZĆ۶ź˝-UD‚C\şµŚ+;ÁhÚNťKd`<΋ß|‰t°ź·>ĽFUy!ĂăKlÚ\FÇŤIżüWÎľŹŁ¸–ŢógqÖ7ł8Ř‹·e/ÚŞ×\§áÄ›ŻĆŮý•ŻQ`Q3~«ŮUEc…źt"‰Îh@E%„\/ĎđÄÍT ~đ‹9üX5=A{[*Đ dÓ)tŞ—şçŮÚZŤV«&›•Đë5¨*Ôkŕ8M†gxýd'/<˝µZ‡,fT*tz©ĺ“A­Ae”LWß<‰Ł¨Ś;ÚXšľÁő1#‡wŘyďJ”goEÎĄQëM·łë×E~Ŕ R’Ĺpű2T6”˘SeŃY¬ôO…ůöË/sţ­·yöĺo1ňćűôص|˙˙ú;*·îFÉ%Xڤ@Q¸5&şĽŔ“őn^‰ńßmU2Zł•…©žęâÓK`4Rč7đŢk'ČęőčLrĹd ‘Í}ˇ‹ ŤcôµňÜî Ţ=~­ˇŽňš"Ćű{0»‹°Xő\Ľx–ň†˝8˝+­c§ş¦Ś˘ł3h=>˛‰8˛Ń„˘51Ňsť*A$žˇB-ŽĄeÖçq˛¨ŔĂlZÍƶ>|ó*M»vł8€–*nJvŠXÄC©:ɆťŹ±´x p׳Ła‘+—gŮ÷L#Ç^éä+ŃĆěřÍ…ůÜ NQ˝q7Ł7®‰‘BŔŁi`$ťŤo~ë ~ůďĆĹëř«[¨©ääŰ9Ü=Ąu›v’9Ăµą •®~67Á÷ľq)âŤ÷&@¶±0ĐÎô|„ň2+*ł‡é‘aÚ/»©ö«†dŠĘ<(˛ÄÖýOSěüň˜ŸŤ]Ľúź˙I5¨ô:4‚•ž® zţ%L‚ڎ¸ŤÂĺö<ű•úyţă˙÷eE Ćgôü—ˇE’˘‡˙2ŃÎl˙ Ď˙Ő?akcĹ—.ëjÜíŕý´Ěę¦YPˇŃ¨ĐŠ:.Ý$¦D†§1Ş2üüŐWQĚ^űő/éŤGđ;Ęů§˙ě{xLj4ěyâ{Ű X _ suA LłDF‘É("‘‘)DŤ%ť˘°~ ­EffÓ^2RŽ:—Eëŕńm›™ś˙BÁ`+`˛ç,żúý»ŚÝęäĚůktµ÷Łh4Čé4Z[1•V#)•€F˝bů—!˛D$śAeT&/6·2\‰PRÓ„Z-É(ě{ěËÁRëPÝot¨Źžî.´wˇskéo?IÎĄáŇŮn"ó3´_ď&™Ł'‘ŕÔĎŔŕRŚöc¸ÄĎßą§TćĂרÚîŕ؉ké9nŤ‡ěc24ĎÍ‹'Hٵ:ću»?(Ëó“Ľö›Ł”l©aÇţClj.&ž)(t‘N¦0:Ů1OžOŤLr+˘§Ą˘ŕˇÉpŁ«ťM·>2˝>ÎŞ>Ő˘Hwç'ɲŚô)5yóäůSAm-¦ŃĘCý.llŢ„ü~%I|0L ś`0řhfpćÉ“çŃŔ¬đĺ"iő 7!ć2dr2&Ł\.‡Z€t&‡Ńd$ťL˘ŃPÄ,*­)›FĄŐˇ»Ý[HĘeÉjAá!ÖyÍe3ä$ťV‡ZéTfe•ł¬ ÖjŃiÔ¤ÓidYA«7 U ¤Ri4ÍŠŢj5˛¬`0PEÉf˛¨ÔjdIBg0˘Y‡0ˇ"Ë(@.“FĐčPÄ,ťáv„CA’dIDB… Q0ôČ’H:ťAoĐ“ÍäĐtdŇY &#‚˘N%Që ĺ@­}äCş’( Š ľłŞő3Qd’É$©Ä2z›‹a•ě8)ĹěbšÂ‚ŐŁ–ŃĹy´V&ý—“—”M§0ŚČ˛„ Rˇ„{¶‘ăG-cCsALn/ŤIQi4đ‰ß×Y•CĄ’,ФČŽľúkĚî"¶o/ĺď~v‚µ…D±ę\ôÝšÁé4 Î†(¬¬c&ž@ /óâ·˙-2g~÷*Y·źÄĚ09ÉÎsßýsÖfÁőߏŽrôő·±ą=: ·×ńËţť^˘¨´’±ˇö<ó=ׇX›ĺŮ—żEf°dŠÜ\­ÇIrn›Ç‚§`˛F!4~Ŕ‚†ę +ÓsĽŢ ž~nßšëŇyţ-TţÍ$&n0a$ Um<±w±ą[oźĹ• ”Ll¬őŃ×5Ä“ßú„Ć9sú"Ů”„¤Ńb·‰ÄSlę«T8ŕúĹ,-fÉJI¶zޞGĽ˘Ý…§(i¨e.ٞÔÎäô%ELćŘP]Ć­áy*JěLćٵďc×N2É!'c(Ř´m?í”7¶ąAEËnF/ŔDş€–ÚČ,˘˛W#. b.Şc~ •Ń„ŮíĹ “™ť]¦ĽČ„‰Éˇ[T4µąNő–§ń;ď/űýWÂBVÍö­m„—Ňř‹mćR”荳÷±Çřŕµ_’ĘŮĽŻŤ@ Ni–ž® ĘJHfu ś‡ť_yžĹP §U!ŹcňUŃ\_˝ć†F%¨ĺěE‘”ěFG+‡žnś<ÁěŘ×nŽRZâeęÖ‰ĹÍ»¸t†Ŕč0că˝,ĄĚMłA@ů>WňŞ5e˙íß<W=šĆĚŹ_ˇ«goő^úęŚ Fůę_¦˙F/ cJĘĐÄfđmh¦ë »›ęB/™L†‘ţ.dŤťúÖMěŮąőˇőĎŐčL\¤oh RK„")ć&f±: 9đ–VQSŕF´y±ę5x‡Q—¦łkˇ†°ĆF|¤‹¬šŹ#K tôŤRZçc¨?ČÖCµôtŚQ^b'OrőâyĄĄ5iüÍřĽë[›öó"kM”ÚDĆgĐ-”VŐRRčEc´S\č&±Ť‘ňę:ŠýL^»Š3§O“VY¨¬®@L&ČČY<…ŐÔÖU`ŃŔ毤®¶‚ŮÉA¬žt*‰â 5H©,Eµ l(51·Ak´P^SŹÇ¦a6Â[XC]]jtxÜ÷WO'ś$ŁłS][ŤËa#‘ ŁR›¨ŘP‡ßăÄâpc0YŮą{'z%IB0RY]‰Űn#›‹Ł2Z± q´67‚ÁJiIn%‹·×»ć3˝ ŚŞÜ'ŚĚŞ5y {F•|)ÉŽ #ťW^PŐ˛R˙ŻŔÍ“'ĎŁŤQ•Ăoř¤F‘ĹĎ®É+äŇéÄť´¦ľ…šúŰ<ŕ1ňäÉóčŁÖ ȲňůŁHĹnő%ëÓë'Ož<śą b.u>çîé‹ÔŔŘ@'Ç®ő“ąE×č%N ŻżýNź—ăożlô0ŢuŽ®±9Lą(ďź|Ź™ĹÁŔ<_űłgůŕ?F_ş‹ŕP/9Ť–-•:~řJ'ßţŢó|řĘĎč›LŐh±eĆč^0Q[úđ|1éČ4şB<ł«žsťý4ŐV129Îpo¶?}7ç’\ő (ěŮÖÂÍŢ'[ŃŔ썫dŤfb±$Ű7Ó{+ĘäĚ-¦F»™ÎRŕŃbő×1Ö7LccŐšërýÜQB¸qYˇçÜ śĄe OSW[F|nw.ö‘ eIEç¨Ř´™đ@/ŽŞ:ô*«VâÍWNRżµ”cŻ]ĄvŁźĹ¸żŰĚŐSo3źďżI0ĄśhglšëĘ™óÇéčîg÷Ö Îť űÚ)ĆçÂ(j…ËşXšäř™+T¶l¦ăŘ1¶<ýúĐ oüî≫'ÎĐŰ×Eßđc7É*:Î}đ6}“ş®ž&¦őSć]ź˘çďýć'ÓtáqŽžnµĚń7ĂčÄý#SÔ64’šîâ'ď^ÂnŇXšgňzC3ś?sŽŃ…8 5íIâJ)QY^Y— ŻüęW´´¶}ÂŔ¨VťŘ ˛$‘J§)¨l Íď&…B*ťAŕćĄIŞíb)'ŁR«ČäD´j›÷Â,e),-CČ}±lč/ŚRN$ťÉ ‰9˛Ů,ąlŽ’şŤ<}`'ţĘ&rÓ#|ĽęjŃνx—ÇčźSqäČaB‚ŁďµSŇPIzrY3;<ÁĆj?WNC±8QÖ!.XRZŠ’q–’‹łYDĆGg±8}8 dE"'ËĚő ¸ŞXž •ŠÓŮ5GKS ™LµV “Í’Š.±JRRZJ2¤¸ľ‘\xUNÍÔôôş„:YÉĺ$&‡XŠDÄr\:y“UĹŕtśíŰH§ÓLŚŤÓ¸µ‰óďśeĂÎÔÔ5łµľ‚Ą´›&‹p©}€= .®›‹‹¸ŔŐk—0MĚ͇¨®ÝL]S+ IfE®\ďÄ'†¸Ř„\ë˝#Őľš]äÔCżG˛”ĺ_ţ«˙‘oüů·^u›U[Ç6µlĹaJqudŽj‡Ü<ł»ă'/qč…Ż±qÓVJě2’”aIróÔž ._ŕ+/<Ëô@­;ö’‡Hä2T”¬oSńŹŁ5Ř1°D÷t„bŁÄôb%+ŕ˛AßĐ Í›ÚhmmĂępPäsb1›ČF LĄ8¸§Žö«7(®ŰĚ‘#ĚÍÓҸ™’ ?ĂÝí,cçé#‡qé’ž5S3¤E‘ą‰Ú!»4GăÖͨd¤$ůµŐ…Ľĺč”ÁP·»ťVbj.@YSŃ…,O>»©±(›ËPT:˘ˇ *‹M*Áć}ŘŘÚLMe9VóúŐwý\¤Ł ĚdxćČ^’ŮŰ6oŁ®˘‚Ęęr*K=ĚÇdŞËŮPWε ç(iÝÉŇD€#/?Çd×UüŐŤ”—SRTHq±źxFä±Ý{(.ôăvٰÖ&{ún\>?­ĺ~Ü%Ő,§ŇlŢĽ‘"·«ŚĘň¬3o)ž:DŢH]SĘF7-µ•ú˝X,ć‡7‘rČR–†şjÜ.۶nâúŤÎ{f0ůÖ±yňäůÜd3 2©(ąlęÎk?üŃOů‹ôťż?L‹†Yśź˝ó·"ËĚf))y´űĺäyt‰„#huzl6+ĎëÂ#7*(÷=ŞPżśńvu~Eľ{”n/^űĽăÝ+lżčÜ%şző }˝ťźxÍéĽ×ßzŹ1tn7oRd™ŮŔ,}ÔÔ”ŢÇG)Ož{éé˝NUu>źGÁ|9ŁćËÍíľBePé@–h\12şŰF⋏’A­6ÍĄQ©VlCOOőÝďÜsŻ—Sźô ­šěË$řÍ«Żc2ٶµ `%$•'Ď K"+žđ‡mÁńîće˛*őmcń`ăZĚ`$)Ëżţ×˙3ßý'ߦ˛˛üľď˝ęÓ’óŹź8sßÉ“ç3/óŁ8Ţc\„/d\ř’Ť‹ęcb~~‘®îžĎuŰď™Á(Š‚˘(üŕű˙‘`pîÎ߲|wí»~Qîësđiű=$™ó|AĄF?µRč˙NÍŔµËüîµßrŁöŽ—XQäĺ Ž_ž@ZçÄ•)dIľťÜ·Y:âŁs +żźvžŹż÷©çĎF9v¶ëαÎ?ĹÔ|äÎń˛·Ż›,\çŰ?R†ŕüÇô—éěżł-«śď^9îŢ‚“Ł\<‰áŮŘ=űŢ+ŚÎŢÉ;×ďäńĚ,D?’ń2g˘tö ĽýŢÇŹ‘çËGP©ÉfEBˇŕc>P\ä™—ľÎĄ·Ţć''#čţęýHóčSčK!†´üňWůćw˙käd€đô"iYĂ‚çJ0F2‘`l1Ă׾~žođż7ĚĎţĂĎ«?ý)nŁť_xŠýOüŐů`,ÇŢ'sY5%¦§G’´ŘQëU8«¶rd““§ŽŃuŃHÎčâ;ßÜĹŹünuš·.Ýâ©göRVâg¤˝“#lŢĽ¦ĘbÎ^ź¦Î+ńáµ1ţÍż˙_ŹősĄs÷č gd×Ďža˙7˙šĄYţöőÚjṁ$RlŰŢÄ™KcÔo8Âë?‹ĄÜ2˝}ă”ÖUÓűÁ‡$<l®rPRîĺâŐ~7E$š•pŮěŐ{xn׆‡ň%ü‡ĘŚK:•Ŕĺ*>šÁ(é(ożů.§cĹşkĚÜj?Çdx™\NÂb· 2jůĘ3ĎŇPWÉSű·’s(Š‚ @NĚ!ěÍQŇé#3¶VĽĺőTVşůĘ3G¨öÉýa&x+(÷Ř‘u+“[«»‹úöĘO uÇön«ED…J­Âî)Á¬ĘpőâÍáUjté0ż~ă]F‚aDQDmv 7„Éd2ŚĎ'h+÷@”Ä;˙Ŕ$§y˙Ôe°şhmnˇľĽ‚ęÚŞŠ‘ÂęÚŞŠđVUóÜám2´”şIÝ–Ç_UÍłĎ¦‰"— §§Jş3mWŚřÍYÂEAď(`Sk^Çm§ş˛r-JjŰh)÷#Ł˘ÔçCc/ŕń}Űéëčg÷c›0\č AQČIâĘ~ *-óŁýtŹ(­o¦ąą»ÎŔŽý°k–xję1 *vî?€]ĄBR«P©P˛’¬dÚä$ŁÓ…˘,’Ë$Ćę ,DeĹłqµ~+’ĆŔîŹct&'«>ȬllĄ¤Ľ€#Ď?Éă»ZŠQ[[Ě‘ž¤Ľ˛šÖMő8•˝•g_x ŹE‡Ď[„F«cďÁÇ1k`×llđŁq8qa"Ë"ŠVo[q›5€€¨¨VúCiMlÚÔDuSOÜŚ,‰čĚn\& ‚Ь€ÎĚţCŹcČ„ązed-żoRüÁ¸¤R F3ˇĐŠSW0ěUţ·żžçź>˝ş&O€Î«g děŢ·ńa‹’çăăĆĹh4“N%8=XĚ_ţółhIf4VČŃ.ëę{+źŇ>)ĎźşAG;?{Ó<ZČ’Hhi—»ĐŇ.w\^YDJ_WÓíĹ«ˇÜţÉ“'OžűEQ 1Ď˙§3ńRź™DIEND®B`‚fox1.6-1.6.57/doc/screenshots/iims3.png000066400000000000000000001552041326741342000175030ustar00rootroot00000000000000‰PNG  IHDRÄgŢ1 T IDATxśěÝ|S×}?ţוäüJ 8qZj" 'ˇíĚ]ڤ:tvéÂhLĂH|[Ű…Ćt)n1t«ă}Ü­Ř,NłŘ”ĚöV ŁĹ-#+Ĺ ń$7ĆŮ”®ĄA! Ú(1 !üňé~˙8÷^]IW?,˙eżž‡HG÷ž{tuŹî[ď{î˝Ň¶µŹšĚfłÉ$™L’Ůô˙z·I’€<f Bj:ĚŇ̰1č…Ĺ,™Í˛WĆ &L€O™&Q‚™ݢIOęOt &7Yż+4Ţ€WűÄ˙úTô"Őý&¤ZĐ`Ä€)2`X0 Łďťo˙•$K€ ’d˛Mf˛Oţű«ßúńOHÓ¦LO7ĄĄŔ3,é*éâłLáfź/ěKD46"ôP"Ü%\ĐŢĐçwf‹˙ßpn—\í€+×ńáŐŹśĂżáęµO|° €X$dYţ‡kUҬŹZ¦NLń¦$}·–Ž›^¤ ˘HíCżď Ő˘TÝľDDDDD 1¨f˘-f˙ÓÁ[jazpk„ĎâÚ×đjź:Łd–Ňţäţ>ĎŤßőĽ´đť'Xů<‹Ű?"ßř` Ý„>ô Ľ/f7ĄX$“RŠ%ĹŇ'ËfŮŔb’űd9M’BQ M’d/$IÓbDD4©ůúĺD7hR3ĄJľ~YN“ͲÉ+ůI7˝Ň€,™ŕőú,˛ěĹ€)^ BJ1e/$5ĐôÁb‚lÁŤ[Ęŕg‹7‘.˝ő±ŮďYL">đ¦~Dľ~M™Ó’‹Iöů|¦ASĘŕ€&& €AŔ %Tő `ň Jf|ď •BDD4É0«D”`}0A­Śžö €OöAĆ-€ěőÁ'Ŕ €ÜČjŘ-xe’wPöOa–Đ7€k·pÁ…đ@îšé¤ĎPfNK”x€d6ÉÚSŠż‰>˙pÉç“ÔQŢ&F”püAKDD“^čą >^˛/oî಻MSS‡đł÷Ć-ď‰7otţöô˸=Ýxçnź"I7ä´©†3KjSd Ę^ź$K˛W|đ©ŤöńŘ%Ž6hZ2j¦yP|yw{ş[öţń˛>źěóA–!Ëâ?Ąe˛O–eÉdY~ĎÝđMéüß ŕÖ ^`ÁŐK¸mNČň• ôÜ#źÜwŕ§ë×~ńâŢ•ľúž@€CËP‡}@ Ł˝ ¦‰Jć"˘Dc7$WdĽŕ“ĽËćYĽü˝”šI‚× ź˛2 Ë€¬ÄÓJ$í“|2d|^xŻ_r/»waç˙~·L0őŁďś×Rp0h’ú §ů—8÷č§÷řéňfϱcǶTlđlÝý˙đ®ô•w!AÉFűt——Ö˛Ń<ľLDDDD‰ć•Ě"Ś–´°ujšyPöA’$I’M&IöiIiČ$@–%H˛$ %Ŕäšn€ţ4@ąŔ‡˙ >S L§ŔbŢwŕ§Ë—//ýĘ—żRúU1Á–ŠmçÎţ®áwJ_yWągSđx‰']%SbDD4É)´x €,˘_ź>Ż,™ŕóʲ"ý,ËZ~Z–El­Ž¶$@j ĽđÝÓe(Á´śS*ĚĽ©č7#Ő źé·żýőúµ_ĚÜ•Ą-ýÜŮ߉Ň ,>ßEŇŕA4đ7-Q±%–uĂ%Ľ’ţ>˛,K>/ŕě»ŃíׯşÝW ˲:Ë"-eµŢ>mjĘoűž’·VfNn€)€¦YHMÁ Ě’ľóŻüóBJ•§ }BßB“ HĄçÍčţűéV]űgďÎŰpEě‚ wůšżýnéylýöÇę¸YńĄ÷wEZS?žeÓž˝óaáÓ¶Eš~dčŰiô’4|5şů3şż7ĂŞ<‰úöÇ@¸5lizîÎčWxŔ”ÎüŢţ_Ao'řWוÁKƵřě,ůkS”Ň_ľ/}ďćđß!Qđ¦fD '‰űµ­•eŮ'C’ᓯ_„,[çŢÖíľâʤeŮj˝>ůúµ>1~ZÔP‰Żjf: )SílGeş/®ýRĐrµä´Ćd6ůe@Í{ţőźďűŹ6AúüÇnÍą=p¦Ą7˙=}đ/=¦_śLyxĹ7ľý±şŹ…”qhÚăż‘äO~gő‘|·đ[SĆ žÖÚykŠ®ěłłŽ|ÁâÜٸęŮ?JňGŇ˙4đŐ¨ćĎčţŢ üű±)_sńÉĂÇďxăR^rÓĘ1§_Ăß8źúý;”& üĆô««)ň©ăţňě”Ď˙Ř$ÁöOţĽ»đ'Ö#Ô]úłĎţö`®|Ç%é%h?HľÚřôĎţôÂŐ6kŠăkSÜ?=r˙擢1î5­ďHÔZ!"Šź%ú$D4Š"˙ •eř|$ȲűÂÖ¬˛ ëÝ·ą»Ż2 [­·‹Úíľ@ŤtըڛܙéŔP^í©ůţű?őĂiúáż4….]˛$µ?łĹ˘ÜF Ö}ó»ńP±ř ‰¤ýv}ď÷©ňă˛ę·ý:%ĚÄRfţő‡˙ôgż˛Ľź ?ŮhŰš3xűHý}‹‹Ż?<ÄH€Őb.üŻ »ţđźÚ¶J˙u۬Ńhg¤Ěüë?ř»w€¬ë+Ď^|qŠăkSđű7V}ţÇć»ňoëuADDDÉÎň›6 CíĎ@C†űÂU(‹Úz÷L1‘»ű}ĺĂV»@EĹ—nd?7Ë +÷đYŕ—WĄďéď†nÖ*ń×yő ó§uoŞUĽŐź˝Ż!Đ-ëť…O_oôS:đžýż¤9~|›í—7š?6µä.mˇíÔż‘­ßľŁîßůNeˇ¨'ÖšUnŮ ¬řî—ţzĺ¬:řÄ­?[¨ľ— zn4lj Ôw$^o0úĽWĄďő‰Ć«Ť üě´5<zţ]Ŕ±÷:nLIńżq>;Őt4ü´ă¶ś~u´ĎŔśµs‚? ¶˙6]řËŮůöžô«Ř€Ž_ťő.xüÖ”mď¤Ó|üWé™„Ż Ŕ'n=ü ±NDc~ń޵”9‰OŢQňw!Dż ¦AŔ¬„Ô>dźš –eČî Xďľ ¬óf*¶ű}ń*´k}hf€tHÓ:¦T¤¦C2ĂklĚĘRic¦˝˙rĚ)ĘŔ, ˛ ŔÝ_ţęÍc ĺĎjú„ł“PŻm[T3íŁ5«ţő˛úýO÷~óŰ.~ńĘS[Ţép±kŐ]5ÓV=7íwü‰o­!& ¦´U]g|bZ÷÷¦âĐëSţťłÖ/Ěr.ű¦4ÇŹg•ŕýĎ/Ş™öŃšígo®5ý*E7媽lűÚÎŐj¸)m?:eݡí˙ďąiż{×°ťĐeáwŐőnëpvű]5«Ş÷¤gĆXłîí\¸ŃpŔ˘ÚŁwČ“¦ż— zžůFË»¸kę·ďűUŠIÂgÓm@Ç?=óšéš;úĽĎMűݱµH={ŇŻčŹ+¨ ~xőµ_ý©ü˝©Ö“ż™ňŘo0ý#ţM@ĘĎR"fŻőłŃě$ĺ© Ř?*WĎ˝L›ĄLyŃë¬ -öʇŻM÷·őń©V ăçżÁôŹDŚĆDDD©Ę_ŞEą˝·şhçŞ1µŰí?®DŇ’ˇe ęU¨¤HJrzđ:Rn L›%X$XL-~űŰ_wÇŽ}~Ş˝ľ`Ń'ć~ôÎ˙řî×˙â; /ýů[D<ím0A7fZ’3Ň?óř­ű§äß… /ţ[ăŐ{lŹřî¸ řłš73”h˙¶x` 0ŔĂ«ŻýpŞ{ĘcţŘçó—§Yq˝ĺ_Űń‰'®ź»Ó Řţě·é)sm@Ç?5ü¬x v7RΞ{äŻ>«Můó¶tç—a[z,ýČ#đ‹Î§˙óřĚăµČJ±/ŰNY×qĎŔŠGň ŇbŞ9kžľ†]»Ţ˙~ę™·~{÷’Űä»R±N>mř^^ýhp=˙“Ţü{”O{¤4ő±żLĹďĎÔ6ăáĆąwÇ2oÖĽ]µď˙͆”?ź xGĘüšiŹ˙Ŕ×Ty󝬊uň.˙7pĺÜĘÄ[·ÍŞ[ÎĽożhŇŐc8ä20E_Ŕë [[‡:íŠiuK€·»j›áýÔĐP™ŁOBDD4ÁyÍţAý€TXÜRnjčĎ)´ZodH Ď›7ËÝýGČE<-%1CJnˇ?iÓX OEŠĐŤř-řámČmĽ˙ţOé#éü™7,,˙ň›żż’ü”"Ëý€IŮűm¸•Ą¶Z¬@ÇŹ÷ž?°X´óaÖöö’?.™` Ţb€_šţ%~gőŠŮřěś/üüŢ‹çiĹ+‹u“~öŁ>ŕĂsoŔ» gŔ÷=q˙Ýfŕ˝7_Ď@n†¶ óĺ÷€i0çĎnͰ î ×NK@\"im¶,ž[Í6ŕý¤ő‹ŽŠ-öÚ‡g~˝ŕhĂś•ˇďŰžÖ_ ”|ţž˘˙ŻŻř.tT˙¤ăöĺeó ÖC¸6 Ü÷ŤűBZŁĆ¸ŇÇľpý޵GűËžůő‚Łß5WűPÚ/ÉŔĚ÷eŕŚfěúÇżßú˙v‘ÔÓ~m›şT3Ěĺă~Ëă9Ě\pÄ,B^2ŞíĘ7nÍ`q|-ř°ĺŻ˙«ăöĺŢ;y%!/Ź%šÂy}°\˛ČßŢ’eY’}2L”1Ö»oh·űŠď±`ÁGÎť»¬ĆҲHsФcÚ Sš¸lµVR`‘`R­‘4€ąÓ˙â;Ď_üĂ»ć4‹¸u‹4č5IŇŕő˛5I)Jóe3Xfâ˙2¤Ŕ$ľ\$¤üiŠ.y™pZÖVĂÜů¶ć«rInă7O,|Ő|úřcËšÝýßţ‰Ą§íŔm 3kˇţéwd`Ć=Ţá˝Ýě_©f5|7›ESĂ·Ó,é‡ëÚcÍĆn˙Lťc`óĂ)€űôďń'ż—¬%ˇő´ťźź]üđ{Wínx—}ć7†ëÁhŢpükŘl–R̲Őt7pnóĄO‰‘@€ ŻűśaŰô){™ąívČśŻÎĄ~\&“”bţÖg,â÷ ¬)nŔşĐŚ˙3K·Ŕ·>c~˙óf`™ĹY®6ł”‚om™b.üëţ§_żĂ»â3)ŕi¨äţD·€x™i˘ńĆëEŤ)”"á,Yďľ 2$Ŕ}áî W¬wßîőÉV«ČO«7sńg¦ý;Z‹š NĹ „©©$ÉŚŇľM›ŇţŻĺďţâ;ĎřŹď~€HHomxńâŢ`¶ĽđAŤĆdYGÂ"k‰îN8K`űňŠżţáŐş;>˘N é2á&@:çMyl ŕ­EĐ™^ńiÔ=1ďťWKţ'íBÁěâňÜÍ y·î3w O}ŰŰvÖäl›>i/ł™*5}/eÁĎúí˙ă»P0;5ĚG,ů_I±ˇŻĄţ7ŔR­ZĄ©áŰit`i‹±ćŔß“v~ŰŰŕăć»qŁĺÇq×­ E!ďE÷Ćőőěl볤]x嵎ŰWxďPÚËĽ[·¤Ö}Îć~{gč{ńOĽu™ř°ýĂ<`oľ*—äţüo\©MóćŇ}čyéuźĆ…íúő;‘*7śBÝ—żŘđ?WKn}y–şOăÂŹ7ŕ~ďjłČy–şO8ŰřmŹ÷ŢŇ[S™–Ž‹ńŹb""˘IcĐč‰WL+' ZďV®‚×íľ"‰ wČp»ß×ô°Zg*ń4 Ž™6©Üś D›âEš€$™M’$K0}­˙ÓĹ©˙×ňwPĂhADŇiß'çĄČ2LE%őÄ/+»˙s`~«ĎţŐ·ť˙Ľ¨ÖZý›ŇÇHąôç·Jľ’{řMŔă-¬ôţ§úŠ?• Y°kĎŕŞeł‹w»]Ox­{Ţ—7}öćĂäćĘNç#%ď3öŻľíüçÜź˙L,˝÷Ţ]?H_´Íşç}yÓc˘UÎg~řôëwzóďŇW ŰNIßTIWţ¶7¶šýä»%k¦ůČż8UnţÖ~ăő;‘źjÝÓň^4¬§í'fgűČ·=ŢĹ1čoC óŠaAçkÓ˙¸­ďN]“Ä˙^}í¸˛¶}ćűŤîDľzMC`ôßéŇoş˙1»ąRě>Ôţů`= űĐťĎ\ő]ŹoqißmřÇĆ~©dvín!(ęK1ˇ¶“ŁDÖ‹vľSąS¬ĄšŻ]©ŹhÜ“yîQBYÄÍĹ]-ů[5»,˲O–L>Ŕ4mšůúő·ű‘Vb=%žľ}Ú´%‡­Üi\ uî7ýi$Üýk||&fNÁ 3Ň,’d–R,’zAoCĘŹkľ©µJ¤ĄÓľé•Ő»x˝źO ůŕ»Ţ•Ţć0éŽĘű>őµţOĚöá­ôźüX+—äLoAé­i—Ó?0˙qq˙c«˝€Ďshę±Ó¤Yö~{®v˙G1Żyţ—n.YčŠĹýŹ­Đf‘3˝ĄýÓüÓ‹e‰ĄCW9ßňďôgW«_VP;Eµó©ď¦žWÚ{ÍţEčVQ@łCŢK¸z|x+ý'oxŐÄ>ŻůÔwSş•F†T¨×ę'‚ËéŽá˙8‚>_ĺĂ * ¬_,Ôđ%ăÚîS "ç|FÇ5‰(!´ţ8čđ·Ëßí?űkÍ0™$ɤž)§ćžeY‚:D$°}˛,Ë^ź|ˇ™÷=đ÷˙>ň®}żĂŰ'$|ěćÍÁ´”žf’$ŮbÁ´Ů"K0÷}ßüĐźýŮk˙í“›¶Őőnç^íD=].]ä7%XŔĎZőńß~ć}oţ &łd2!8†zŐőÂy˛˛,˲WĆ-/fÝ˙Ŕßž‰A|0€ţ3čůżŕ>Y6 za¶Ŕ+C2ÁŚ´oxŹ›‘–«ť“§Ě˝0˲O[üń´dá cD‰Ä´DDDL)’?žN‘D<}c@†9ŢAČ>I’ý×pDH-iw=TŻE-‹Kű¦¤ŢčÜĂúú‚iyŔ«\ÚÂ+đÂgöÉ0™%ěÚe¦ą'"""˘ńŔpŔŐ‰·Ó–|޵·»}ý×ĆSţS&– Kâbx˛R(Ë@Jꌹó»Ü)Aµ‰`Ú«růVź×l1Ë0âMóÁ'™}2 hW’–˝˛AËdŮ @ň †ľDDcÉëĺ™ODDDÚĐőDłAčěą>,›{ďÔÔ! ¦¸Ń/wťOé<7ý÷Ńe¦Ż_G`1Ă Ż7 /nZĚ©7˝ĘŮfř´9S}!WĐ”dI”™á4Q‚ńQÂyŁOBDŁg°1č…W†ä…Ď٬ŚčĺÎ Ó:ĎMóŹRÖŹŐÄ€Ś  Őp|`PWݏ ‡«ł^ąŽ™€§©fI’Ä‚|)鼀dV&“ÍxÍ0«űiłt‡'™7|"""ĐÇ`š(ˇR1`Խʯ]íEÉ“ ^Ým6|>Lđů”›&úd$ ČĘĄöRÓ©bÂŔSÍ”ń!€iŕ–R®ćٵHŮ?ĘCąŢžä@D‰& Ä"˘±ÄÝ!Q‚y#Ą5ëţ * š@?FzŠúŕV:n\…0ĄYŇ>6íöOßvő˝÷ß~~@7 ş•ńE~˙|ý!ź‰(6 ¦‰âÄ`š(NÁw@śŽŽ1nѸőŘă/żűfhąq0-fÍö%‡źüč…p/… ¦FßDDDDD$pĚ4QśLʼnÁ4Qś"Ť™5űÎ{F©šMC¦gßy#Ũ22ł{=®D·‚ĆB¬Á4#éµîß#âifńăŁß̸‡„«n’ŕ=yđłÂ8„Ƨˇ ó ń·GÜ´Ô>×áPqŐMü '~ÖAxě—Ć'ÓŁ‚ßzq©}Y–ą‡Š«n’ŕ=yđł˘űMtC$2ÎČĚÖłoQŇIL0-ÂčsçÎéJ€!5ŤŽçwďŹ<ÁןZ76-!"J}KŹ{^˘aë`ZFżúꫳfÍZşt©VšFÜó»÷Űl¶8ťN7¤É \,5Tě,É+ôł©­‚h2»`ZFżđ łfÍZ»v-RÓhŠ%’٦Ťň°kpúĚ;‹ď˝kCD4!XFéˇ?vµ0ŔĆŤÁ:ŃĆ'éĺpťçwďŻŞŞŠ0Auuő5†h\ÝJ(žŞD4’L& ŢÄhd¦ĆCĎź?ŔD˝téŇĄK—2¤Žj¨a4TUg|ęččHtĆYnjZ’Ź'±I¸3%Ł2Ěăĉ"†>ţüůóç¬]»víÚµ8yňäÉ“'c©ĹWżřúž$ßCŁ«ŞP]­üËĚôĐíر#ŃM -A ă…eYîččX±b…řwäšFD4AŚÖé“'Oq|!µÇĹ«{öěŮ´iÓ(5u\ɸóD™`@‹¤™™ş;v8ťÎČăŞ'›OHš$?n'‚ádŁ% €ˇIOćA4F+>pŕ€öx¨!µ>ڦ(ô‘43Ó!"ź_("iž :¶T=÷ĘIcx3ÄX)f¦'vU˘Ń0ZÁôÎť;Oś8{HÍ0:€ţÄ8-QmX¨Ź¤™™ůD›ÍĆH",Ö’—Úć•.ććµdzጓ–$I  IĹKă-;ąéÄÚ=-KÍ0:\U%ň@RäBf¦#Š|˘¤'ůé€H?Ďb·căéńLůŢ+E­źkřç/Rbń€ŃhÝëL/;ą @,!5ÂDŇłfÍz˙ý÷Gµ‘ă“ahPČĚ4ŕůÝűwěŘÇľc¦@’†OOî$ăź–TN,Ě«xL  ‰FĂXÜ´%–Zd¦5çĎźź5kVôHş«6cM‹öĚ^ß~`ýśm{ÂQ5(dfZ˝ž´–`Öß<|<Ž™mŮŢŢŞś1]n˛0¬V–cЧőôŽرcÄîĺŃÓşvYĄĂ^sjQÖTRýľŇ%ĺťXß‘iĂťÇu@<»Ć„3{śÜďź5M,ŁLźXşŔ˛“›"‡ÔZZZ䪵Ř:R<={cU•Á>/LaôĚôݍăU™P|Čłmą—$0(‘´–łşQKGG‡Íf wlzc¦¶!Rś°~’†~iuä|łŃ«ńtU7Ľ-G¬dŐжíăM坢ŘWš‘9[ďřę#zĂ?} úqo>čŞÎŤsAC_c#şÂ'nŽż¦âÝ‚ľâ.˝¸.‹#osĹjż””ßDĂ0™éM/ŕÄĆ(!5€W_}Ŕ#Ź<‚Ř2Ó=îłě Cľćô_…bĎ­%şž>żdÍY»˝ÓáPżëĹÄb˛(3běľb?1Ń™é¬őM˝ëÇx™~Z$-̙ن ĂŤśrNÚżťT.©ž;q~Ĺ óĐźŚٍĂs4Fâvň@ÎçĘĐĐx¶»Ëł€ž×9€˛ŤŐU9ŐĘ~éŇ,„(©ŚŇÝÄmz›^Ŕ‰Ą{ô‰ęµk׊Zxä‘GyämÔǬYł eYp”çgdfgdfŻÝw zZ×®i±×·÷z\˝‹á¨üć>­c·}sM °hËÓĹŽ‡úŐżů颬č3Ž)ąŞĘiłÉŁ0( ĘLǬg_©XoţU «V+ĚX×ÚÓÓşV{ŞNv¬Zd[VgfgdÖłT7®SĽş®t­Vç°ÖJ}$-=;ťÎ;vTëŚĘެůvg.Ć´~˛VE%g^^'F“«®TaÚźu‹Ú±#ŕ/YEĎÔç-Ďî»Ý–ám*/é¶śž}/4öúę H:¶ÍďxŐ˛J€Ć ™Ą/î3nCFfvUB[XŐ}]kOWmFfí±ńÝG4A´&čiÚě‹ď˝+ě`žžÖg{ńf;ŕhëčQ ő«Hy†…Ýă/ĄH9Ă· l Ąkש[­=Ńg¬=6„ŹqĽXľ˛č<ôšŘçžw›WćhźZđÇaô‘éŤŃ·ŃhŁ`úä Ëś<‰“'Bjý4Żľúꫯľ:ţüůóçź?^ä¤#Ť™ÎÝÖëŮ»Y}ć(ĎϨ>ŢóZ›C‹°×´pĽĄvNǢ-WŻgŰň\ŰfŤÎc¸Ô}@ńçrÓŚ#·B˘ŠőÄ ĚtŚşj—”w˘loŻÇu¨ Žň|%tIzŹ«×Óţě˝@VŃŹ«W<µĂQ^őb–W‰u^|Q~¸ IDAT(hťÖ©(xĆă:T8*›şB[?}$ 5¶ŮlUŞŃ¸R‡ŘTěŹ>Ëú ]«ŠŔubô[®g_éęF(…×čk–e˙ź©wěPţŤĺ/fĘoŕ·ü»ĚHoł«vu#P¶·W7¨ćâ[ťîł®ŤX7żśę5vöšSž¦'­! SF§ţŔ÷}DĐGĂRĽŘl¶÷ôQ»ĆĄŹćů-Á^sĘă:Uź§0,Ôó/Ą‰ťŁ éţâ—kŰ 8^~˝GyłĹźÓ é ţ8Ś>2Í~ËŤš±ć`éĆâÁ '±XşÔ`m€b3 9ŐW5Ô3–Î\Ľ¸ĺÖsěóçŞs•Öç5”·Ľ˛oţŘëźXŢmƱë q]ÍCů®_™‘chli8züsPw0çÉŞ"čNŐŠŻÎę•”Cęc©eD$š~Ö]l°cÄ–ç¨\’Y e{Ĺvuýřw«€˛V»jŕu"˘”çg”«‹zëbż^>Ę7Ç`G4Fołí›k:aŻ9Ă÷an~úŮckî˘-ž&1Lmś÷‘0†uUŹ0gš^ęxąČ[ýĐś,ŘŃéxůőžő#=˛¬‹€NÇ[—đQˇ5¸Fî3Ú+ń¬˝e‹6¶ÇHLŰ@˘ű’!Ć:‹üt|·Bt:ťáď(~ü•F@ "ˇD–ťŽFç±âů@Ŕ©ę\u\]PačŞČë/ĄcŐŮ«ýOŐ9ˇÝóŔC!3gm)«t4ĺhbq ŤÜ,ç¬x4ŽN}^ôhř‘) ş?Q’¦,;;#'ăę{ďżýü€Vętt<öřĆËş¸łďĽçrlăqĹWö‰'´-¤ôg.}A »OŞ!¶~Ě´xĽsçNÝ·Éđ<„ßŢÉéč(Z·iHÍ8}ćť ;đéżď”Z–Q]í´ŮÝc\O÷&˙Ĺ ”e9ćím?ô«ČîءܙĹxYjy|wOo†şęĺvâA7m˘Ź ąi‹Xź#sß–„Í×—ČŤűνŔ%IąFµ$IN§sź˛á-xFůľ<F|굎gŽbě:cÇ–h¤„ĆĆE¸;qŁwä3Ób+ׇԆYęPA™i„Łő Jv"’–j JýWÄ5N§ÓiłA$§;:lńŢ1ô;tb¬ş¨śNă{˛¬°Ůt %’źżÜFŇÝ´%T¸]ř8[{ú»Ŕä={büFŇĂW>:Va?č5ُTŠFű\"˙’’ÔÉbé˙űh,˛wäűčD ©śXşgüuěaôDIW˘Däˇwh“Ć{ÄɰC9ť¶p/uč"ěsŇ|Žć0Ź$Yuęu&´aŢţ0ň>hÁrcęhäedfÇř‘k“I™ŮQűl’tj˘±3Š—ĆËČĚô˛eË`R/۸)čÚçĎźaôöíŰwîÜ™CŻžÄ>jGČż‚Óé´‰1ÓăňăSP$4ŠFo2l`‘)ż{‡7ĚcTnŽCŁ`8·?¤ä{$­'ÇO‘Ţ(Ó˝—ČLG©-!˝}űvQ"¦™đń´XKÚ{̸óAúË'«ˇłÁ q]gz"ٱ#ř*&ˇáßÄŢ„FDŻÇuúĚ;â±-¶a†t’žř‚ÂbFÉU|‘´Ŕxšh¨F÷¦-úÁáBęPâěCjł?ţ+ţFż"3Ó1x~÷ţp/MŚ3‡)î43#éń/\fZDŐâ©(×JpE6w@ŚR ÚčŽůóç3ڦ¦^#ßŃiłiÉE†5á<ż{U•8ÉSúW’&őV·řŢ»´í'ľŮG°14J"g¦µ§ˇďő&Ľ1şť8‡Ԃ~ŕÇdhډpŮđD]$­•1¬śNgP¦ůůÝűm6[GGŕt:«€˙ß;üIëÉ™˘Ö¶śŘŁjnlÉ%43úočKbzŽŚ'"24vÁ´R Ł#‰pĂŞ*gGI‡IkŻ`Š:nE•a*:ôßЧ7ŚdŃëqIń›–¸/&˘±¦}H­/!§ŃÉőJ¸Ăy÷ÜŐ ˇ‘tĐ…QwěŘ”˘¶Ů”Ç;vpk¤ ËpĚ´ţt#§Á1ÓÉ,ľxš‘4QL ě±Axl=>ˇçe†Ң®ŞŞęččąęÉ9ş&ʍ¤#<¦¤#âiń8ĘM[tłŚj“&¤DÓ$8ťÎĐ0:ÂđDFŇz;Ś.ßazď.} Ü‘ĐĆ3'!í;Mš·'źL'ăáę>€ű šś¸ĺOrÜFŹ)Ń """"JVRú’7o{đŽ«ď˝˙öóZ©ÓŃńŘă/ën§7űÎ{.Oľ»ëĹÁéč°ŮWĚľóžD7„â$I’ţNhlśQd»7z9Ěc„Ůě+đ‡Q’r:˘_BMĂaDDDDDqb0MDDDD'ÓDDDDDqb0MDDDD'‹ĺľHa ih6ŃřtĄŽXIŔ0oÚňŘă‡3;QbýäG/ göá^Ź×€#"""˘I‹c¦‰âÄ`š(N ¦‰âÄ`š(N ¦‰&§Łcöť÷$şDvX˘ €Á4QśLʼnÁ4QśLʼnÁ4QśLʼnÁ4QśLĹÉ’čPXNGG˘›@ń{ěńŤ—ß}3Ń­ ¤ÁţžÔŘß' öÄq›×c0=®=öřĆD7âń“˝č&PňaORěď {bTÜć0ďřËŹhÜ’$©u˙žD·‚hěp›Ĺ`š(X,‰   ‰„Ű|Üx"QśLʼnÁ4Qr76»#—Ńčc0ť zZ×ffg¨U]ú’Úcb’}ĄÚk÷]2E«,hĘĺşJôSѨsVHš gŔK#4»› %I’$Ć├ŽUďé†?Ąčţ>Á«^RÓ]µł3łµż™cŢ™÷•ÎÎĚžťY›¦¶aĚígŻ9ĺqőz\˝'jŢx®µ'«čŔ‰»˝ć”gŰr g_é’— ” <í«ßz˝'h–5ĘwGŕ”{ď+ĎQ˛q =çď;¨MYőbĎXżiJnvöşVsČ$˘sŤ]‡JĚwČńÚHlÜÍ…’YáŔa§ţekÉ‘#%Ö‘lˇµä,w7ŚdťD†.+ô—覅×UšF1rĽ*$#’7 ¸ôâşěŚĚŇŞjÉămjőńáÖ3J ¶.n}j˛EĐIąÍ'ZňÓ]µł×´ lďeŹKü]Y?gl[Đ’ËoŮŃÖsŢqďܬ€˘ăMĺx¶®H-śódUQŔYEDWŕl·¨¨çőC lcu•áÄOöćí‹Kśeţ; %cÝ\ˇ/Š«ăŤɸÍ'\ŇÓf÷YŢ…!]Wźj©ŻžÖ™âqWíěĚŇ™ë˛ggfĎčŇM,&‹2cp©ż¬8ő¨.Ą¸”JŐ—jÓ´ĄhiąĺĆ”śsT.? ל}¶8'फ़‹oŘ Vd…™QČš{źăüĹĐ)Ă•éyý˘-‚(‚¬ů^g.šz™čŐÇŁ÷ťH=NßŮK§*{}ő%µ Ćß!Z€´jő»"pY† ĐjVŹ\…kUíŚę ©Đ2=3{vfíÔ¨ýÝÝŢÚ¶x5¤Ľ­ÔµJ–eŤ¶ÓŮ»eY–»›P*ŇgA%îć§J‹ ·c±ËŰge-9˘¦ÄŐ0BTëŘşËţÄťÍn8+ćą¶‹)»‹ZźjvĂZ˛}ë.‘Fw޵uűČćĎ%4†×QEO볍€˝xłp´uî ŔëJ•‘{ëZ{€cŐ eµČ=‡I/_Y tzMlŰçŔć•9ţڞ ¸®µ§«6¨ý€ ń8ĆA‘ÇękĐŞ]ݨ›_MĚkďÔpĘ0™ř¶:ěş‘VΊyJ§ęn:­Ľ ôÍ]#É$Ů6?$M0íµ.`.ĎŢi­ińÖ·_VS_3üŁmĆš`Ńͧ‹88íh €ţ§‹ĽŃg ±ŇÖßčôGŘYEW”üVűM;ĚĺUSµ €cŃMŹëJ}Đ2ý¨í˛Çu­ pTNíŠÜŕüc6 U„K6pţŻŹˇ3¬áxŐ˛¶ŐuEŚĄ)nć×ÚĚ€÷Ń˝JA^ˇďDčqť˝sJËqm‰ýO©K ó˝ćŠhŚľźvŐÎ,ďŮîke0—çĎđżRŢcŐŢ~(ľćq]ölë‹e}d[ ›6Ű‚JŠň­`Í/*hsąCK¬ c—]ŞpŠôv,‹†.©fß…ÓçüŐZł ´ÜçNc—]L9Ż´M4Ŕ¶JDÓÎĂ»¶®Šuăź>’çQEĎkmŔţ襏ćů`EÁ3ס2ŔQŮÔ…ĺU{7@ń!Ź«×łmy¸sm›ÇËŻ÷(9ďâĎĺ†NÔöMĂ-š´Żtu#ěőí˝Wô|vWí’ňN”ííő¸•ÁQž_ŐdPG!>k‡C ;ěŞ]ÝmJua­k×´(Ë:X Gĺ7÷]2ž2f¶ÍM§wޱűÜiµ'Zó‹ ÄoG­oFčÉ&‰¶ůń i‚iän»ěű$@쫏‹ýĄ˛w\ÓŔü–úĹáXtSěşrmýťi¸d> ¸?1ÍÜ‚śţ˛–ÔŁţçjF*Š#pBűüAőaPĚpąC;Ň-rÉÁ%"ý0çÉý®Ţ5#2z.ľaź?×?e¸ňĐŽWeľ°đDÓ“ Ą)>ŽĘ™™Ů"âôoäázYřľ=Ψł§˝Ü):»źŃwHÔć+!ř[— •ßç+sô­ô˙nŹđŁ÷wë‚Ĺm­íî¨M‹…­N–eyŐaÓĂp7Îk-ęIµhٍ šşeŤÖE4=Ábi@Ť'Ć}Tq©ăĺN oőCs˛*°«A°"x`ţĚné‹=rJëóŕ8Ç_iĘla·cŃ–Č9ŕ(ĎŹ%,ƨl^™%)ކŁÇáOWçoqL©ż%IJ2Ö´pĽuÉpĘ0ĂZŚXKvµ6´GźĐĎ k$ź$ŮćÇ…ä ¦ çC‘š:Q#‹ű7*‰^ńWĄö˙^9çF}Đ’şďőTĽőOhű¶h3ë[YśÚ¨üř6ď+ťYŢ)j¸6Ä_şĆËŤQ—łÁ>n@QNi=¶„MW8^µ¬ňľ§‹˛‚§<^µ¬Ź>R®ęi]ËHš†IŚ™ÚÔĂ÷˛p"ő¸ĐÎ^ýŇ”Ŕή ţ ='rÄ ý=Şl››P:Ďű:+˘ÄÁîöÖ¶ŔŘU)q7W4»[ťÜÝT ’ĚîćÂ0Ł8Ý®6ń@Mo»Ű[Ű",Őş`q[đhRŃúÓvűé4úQE×K[:·,ËÎXV递„šÜm˝JXůňĎz¨ŔŽ–Wö]|#$$Uď•d­oę=X,;Ęóă8ݰg_é’ňN‘oŽ%µ¬eÁ{=®ŢˇîdŤXK¶Ł´´ ›}hżS§6îÉ( ¶ůń!ą‚iUĎy3€{çö)Çm_Š|šĽ÷ˇ/Z^iF^˙Csŕ?ŕeĆ`"ď°ĽŐ©> ď.wc¦qhQVOëÚe•Gĺ’ĚÚc@Öú¦Sʶ)(ń±n–Ěžp‰S ¦ĚÜ€ĘďrĂz^ks/e^Ź-ƧtöƨťÝú˘  Uësϡ…úl´á”ˇbéďÖ’#ÝM§íęi€v„Iň¶•ÎG’[‹”óJ¬ ŕ/Ř]bŕvµ©Á˛B˝źýtÓdűbež§\‹#f¦muúVjş5ż¨ h4FD V %OŐçAÍěKÖ«íh(ŻtŹńqćbpjFč†NéłŃZFů˘®űw«ÝîÂ<o¸şR–uGůKÇt…†SĆ:fZa«slU¨›ýĽŇĹă¤s®A—%Ń UZuötÝŢúö+ëç9—OĚźą¬rzfËt­üˇ™łŠn–UNoĘ6ŢIÖÜm1Í,§ż ©ŤĐWµ7µqCjyţěň/µĽezfËt߬ŹéýZKŽČ%úŰ‘#ş×Ž@Сóauúçá][·ËÖHÓ„ĚeŃęr/p6”˘¨Ű\Lcŕ•F1âiÖCvt:ťÇVNžSZź×P޲:ł(>t0BĹsV<šG§˝ţ‰9 ÷‰gí-[•KtJä••'öšSˇ©âĆ Ťę«ű·ťŞ?»¤\)±×·Wçą{77nh(ĎĎ(Ďł«Ý?k}őł/ço)ĎĎ(×7`[ď‰ůk—U®ÎT#ŰëŰN•¶ť ¶:٦–ë7{ýd‘»M\RÚ×íŢyő˝÷ß~~@+u::{|ăĺwßÔJfßyŹţ©á44˛¸†“W?»IżŮ\šş.Šý]Ć’B3ÔÓ:sYĄŮ^seż˙üEă‘#>¸Q¨8€»ą°aÁ‘QÂ鬯JÚQ˘:±t"§ŁŁhݦÖý{âît“ľĂŽ;cÓǧ±ŮćǧО(Ţ©~ Kč4E\čÄőޤÉLE×ózް×Ü;’žĐ¬%Gę˘O5,ZţŽh’`0MDHVŃ•0ś†[ÉÔLÉĂéčHtĆ·ů¸1&"" IR˘›@4¦¸Íéqí'?z!ŃM ˘1Âţ>~´îß“č&PÂLΞČm~8LŹ_“ö˘Iýťh<`O¤8XÖ·&Ňy˛Dű;ŃxŔžHC ˛„d˝i Ń8Ŕ`š(N ¦‰âÄ`š(NĽšÇřĹ˧'µ v«UměďIŤý}ÂĄžČ-dbc0=®ń=Ijr^¦”†‰ý=I±żO0#Ţą…LxćA4Âx)˘Éýť"ă203M«XŇń`=ŃÄŔţNQEÝH¸…LĚL WFfv˘›@‰Á`šhXD$Íxzrb0MD”„ÜÍ……ÍîČ%D4&ô14ăéIÁtňpVHš gđŽÓÝ\¨˝ć,6;› %É?ą»ą°°˘"p"I?A@…Rałaę ž5 Uîć ÉÂĎH4ŇŞłggfĎčJt;†/¨żëŤ|ЬvovG˘PA{áŃ3ăéÉ&9é®ÚŮ™Ůţżu­ćQYĚń™Ůł3kÓĆAÍîćBɇ¬pŕ°3h kɑ‚¦nąÎ  ©[Ö)±[·>ĄűČŢ|D–eYVćҦśóZ‹”*‹]nש–tµÎ«p°ćˇµ],ĹÝŢŠ˘|kl3&ŹŚĚěp‰nÚ¸Ř[gî»4ů3ŇýÝZrD×WG‚µä,w7Śdťű{zö•fdfgdÖĐU›‘™˝vߥcŐşµ·®µŽWéWiőńŔj"żQaí±ˇÎçv-v¨{ĂҧBĂé^Ź+ôoŘ­Ąd’śÁ´P¶÷˛ÇuůDŤ×Q9sTBŢńĂÝŢŠ¦î:›úÜVçłěÍŰ—68cž~ńkĚKł.X¬>ňGÓn—Ąc›1i„ű–ä·§®ÚŮkZ”®ęq]ö¸®¬źĂĆDcÔßÝÍ……ÍÍęˇ'%?ćj( Ę——řsj1gťÓpşYÚa/ĺppíîćB-Ťî¬‰nö÷ahyEwŚhy•«÷`1”ííÝ_”…ăU™÷ě 5­ĘŃÍůŐ±ĺßZłq:‘˙Ćľ±”ÉL YEÖç-SD’IźyëžÖ™ˇiěŔB%A% ×µš»jggÖÎ¨Ţ -ÓEVIyµTť±6M[––]ş(ŃćZ×jŇkžşŻ4J’ĚÝŢÚ¦…¶±i+ť:’ÂVç€=¶<°mŐÖ]ö ăˆu ÎĂ» ˛E­ ·ąÜ˘Litl3&‘Đý(÷¬†Ě CbÖĐžbThŢWÜIŤ:ÔŃł3ł§7±1˘ÂęăЉáKC[´A##~“ÄßßŰJ]«dYÖý´m;ť˝[^‚’/ *q7?UŞäÔÔLŃYKŽČZNüüŐ:¶î˛?ń`głΊy®íÚ!¦§šÝ°–lßşK¤Ńť‡wmÝ>˛ůóDaŹĎć˛â†ŁaÓÉ=ű^hěőŐOf áU5çť-˛Ý€’ůyk‘ü®ęR ו®Ő%ÂŹUoh€–ՙٙµ/î+őW#íp+@’¤˘u›˘ţ ˇ~JZÉL^ë"ć·.ˇ§ućšo}űeŹëňÁb8*ghýÄ^sĹăşRź§f]Q˛Sí7í0—WMíŃęk›±¦@ŐŢ~(ľćq]ölë/:Ýő eúQŰeŹëZਜ*vŔá–Ž‚uSöÖŮP#NýČ ÝaŰć¦Ó;cĘŮędY–ĺU‡ýi¨Đ:µ(ygv·¶ŰŞ­»;á>wzë*[ĆÎTô{SîYĂQúfy~p¬ÚSDÚŘ^sEôĘ{®Ú™ĺť"‘|­ ćň|ÝH者®ÚéŤĐ¦Zc"úŇ0,ŚÔČß$‘ö÷‚¦Í¶ eżnÍ/*?aJ¬ c—]Şpép––o¶ďÂésţj­ŮÚîs§±Ë.¦śWÚ& t8ďRű˙DŔţŹ•¶ÍŤÎpc*.ľŐ ŕ>«ńŃ!ăW»j—”w˘loŻÇu¨ ŽňüŞ(gG<ăq*•M]X^µw3ň¸z=ŰV ńÝ(ŁwűwXrl†ĽJB!Ö_k3k;Ë5-¶Ž?ěöç“ň§8kq,şaźgź?¨Ő⊴ô{çzĂ7Ű»ľ)Ęgë‚Ĺmę@äa˛–ě.jmhŹyz[ť,;Ô\S%w7);ružU[Oźs¶·.ż/5ž1É}*÷¬‘än»ěˇ$ zGőqĂž’v´@˙ÓE^sŁŞČ"JVćč[Y UËrv¨4Ý”CmLÔw ˙Ň-L‹ĐČ0ß$cÚß•ĹúßÄѸ› µó%˘Ž˘8Bë"šž`±4ŔţŹśĎ•µĽrtÄŞ;v´Ŕć•9–Ż,!ó ÷Î5Ęz+˛Ö7őz\bëĺ¬0Ęý\~÷ÍČĽ‘ř$1‚é Ł·JĆKü…eeŢW:łĽSLśĘŇ…ËqeéCgŰÜ„R݉zΊřOÚł–lGii[ä‰ÜÍ…ÚÜçNG΋[KŽ8`×íŞm«—ÚK#ÄŇáfL:ÜłĆ çCŃNÔxśą(n»::=eČŤťs— ç›dČýÝÝŢÚ»*%îćŠf7`«“»› D’ŮÝ\f,łŰĄ|-¨émw{k¤/ ë‚ĹmgaŘ67ť¶ŰO‡¤Ń'ö÷ˇZľ˛¸ˇ±Ĺ𥹠óĽá6>@ůŐ±ćn.Śx•çđ'Ł’ IDAT§’)éŹ@ô´Î(ď„˝ćĂősÔø/…;QK#YŢęTË.™ĎŚLC˘.=sÔ1”ʵ:NŰŐÇv¬˛A?ąÂén.śWÚÖV:OĦúaĘÁ»N[ťck”6Yó‹´Ąi¶"Ôi«ën:m× m«¶B·oŹ}FšŔzΛÜ;·Ď¨§(iÝçÄ@äKS«[u‰ŢČąçÁ…yĚűÝ(ÝJmŚ’áU.Z+싹‘±6 @¸ţJíYóZ‹”óJ¬ ŕ/ÝŘíj+<1X˝źýtÓdűbež§\‹#f¦•ŢÜł­ůEQĎ=¦I!×¶9Ě+Yë7nĺU/öÄúŞ>­ĎRŔ™‹FŐDŇóiw{k›n7ş»â¨úÉK– €%Ń †Ć łĹÉFöš+ű‹Ľr·]>1ć˛Ęé™-ÓŢúö+•33+ l@îŢÔĆ ©ĺůłËóĽöp ČąQź—ZŢ2=łe:ŠŻťĄ=†K·FŻůf}Lo×ZrD.ŃŘ‚źëžÚ_PbÓOZ'kO­%GŽÄ°4„Ö8nˇ5Eš‘&”´ę€3˝őíWÖĎr zĘúm—böµźÚkú޶]©?;ł\éćŢúösŁ!’ŢőŐ7_ÎźRž?»<ŽĆĚąio™˘}?č}iô¨‘Á{őęďGtŻ€ŕžcĐ—lu˛\§/p޵u»lŤ4MČFŹ=ľ‘§ŚP˛cź0řŤ”ÔŘcÄí\ŹÁô¸ĆkôDĹKóŇ„Áţ>đi`OŚŠŰyó """˘đÖŹˇ™&"""šěb¶Áa0†™&""""Ši""""˘8™8ň…(ɸ› ›Ý‰nĹä&C–ÁĚtZuöěĚě]Ń Çg…ÚsÜÍ…’^…S_ľůkφ2˝:µX\@‰ň<ć"LOD0ęnD4\ÇŞł32ł«bŮż»› ő;Ç‘«áKŚt'“$ ¦E«ü­k5wŐúźŠ’ĐyÔiĆQpÜÓ:3\kĂs7J’}—úÔZrDV9¶˘ Ű ·k±C)X\úTh'ŞÎ É1Ç‘kÔ%ÂyX™Zîn:˝łŮ g…2wÓi»Ńţ>¨†¨ÓS2éi]›™ť‘™˝vß%Ą¤«6#3;#łôĹž0sě+ >ŘńŞĚěŚĚÚcŁŃÚxöţ­k óćFZHw#š٧âP°uq«ÁÎtb ţ€t‰nÚř•dÁt_•ëňÁb(Ű{y‘W”Úk®x\—ĂQ9łúxĐ,iG[ÄÔç†ĽŽŽă32łg/«ŚŁ%Ö’#rwSAč îćť»¶n/±ÂVWgS¦Í6.¸çáÓMÝę±,Ń_żŰŐ¶xŐyx×ÖU6°ćś>çŽRCôé)ůŘóđňë=péĹçÎÚ푦ÍZßÔëqX?glš6l9ŐWŻÇuŞ>€˝ľ˝×ăęÝ_”56 înîćB-Cí¬ ›ťÍ……ÍÍL\S2IdźŠGöćí‹KśeţŔ˘ëą›ź*mk+ťpŚ7°Đ?‹2IđdwsaaEEˇ¨TyQéŘ!óúKć•¶ŤÂ{îő¸†TNHş`:’¬ů^g.Ä©=­S{qżp´Ą©żµ ÷ôF˙´…Z ą«vvfmüyn}"\ź/źąď’a‰*çCŹú{@eŢW2Ů8JѴ٦/r··˘(ßeľĂ»ÚJç ő0˛čćWÉQ¸uÁâ6—;Ö&}zż Vß[ŮÔôĽ~čŢ‚ŐZ±š·ÎĐgŻEęşú¸ň`]éZ]jęXő†hY­ĺ§•T·.}e4c¤eMˇÎX“d—^\§Ëľ‹EŻkí lC„ĹEKĎëé»›µdűÖ]‡ť€řYş˝Ä ´•şVɲé'1Qr톆ýZéqjżÎ¬=¦ÍˇŹ«Ł;22łW«ű÷X{˘­Îý‘TgĹĽŇŇX­%»› šşŽńę Ýó\Ű•ăLE"Óí?¶ěPő¶ÓŮ»eٱu—ý)âpđĽţç×FBhÜĚH:˛‰L›_k3ŢGô>qăŃ< 3ő5e/;˝(Ű{ŮăşV¦NjX¨h›±¦zZg®ińÖ·_Vá3ö]2ď+ťŢĄĐ㺲~NhÉ(ľm--íç¬×Z´ŰhÜF°­ţĂČ±Žşß«GeM“ĚŠ•Ĺ GŹk©ĽoĺţҬ˘WŻÇŐëiÖGy•ŃŘŹ‚g<®Ce€Ł˛© Ë«ön€âCWŻgŰňžÖµkZ”ÜŐÁb8*żéßíĚqYSvŐf¬i˝ć”ř^ ŇR Íyňéb sKËq=ݵ9€ÍO«©5{Í)‘uő ąň ÝͶJDÓţC<A?ى’“aO‰ĐŻ‹¶(éí–ŐGm˝ú>nXUWíęF lŻ2ĺŮ6ëFZąĎťVűť5ż¨@ů‘űÜiě˛kąd‘HҲËö]Çi Šň­€5»@{`8Ż®ŁJ=3’ŽjBÓŽĘ™™Ů3Ë;Q¶70r˝”ör'×˙ĐďC^ŔüňëfuŕG˙Ę}†…jý‹nz\—=Ű_k3ćňüٙٳ״0żĄěEˇ>»ZŽw}SÜ1wHZÚY!íĚî6ŢG]ŘVm L,»Ďť.ČÂ2‡:=ŤgąO<{fĂę35ĄąĹ"ń“‘™żĹfĆ{çF8Ľ+âTGy~FfvĆšµ»…ÎvYS;Úě;çÉŞ"DXJŘ÷kŰ  Ńy —:^îŠ?řĆł¬‹D=†oačc]´î&˘i,M41„ëěaűµ}ţ\íáÂ9Q«R:~ŕţ}=ŃZ˛»¨µˇ=Ţ·  ©[;ÉI®łą› çµuÇ–]šw­*C3’ŽĹ„¦ĹiŹërU`(ÜőŇ€Î)ËÔaĘŽĘ©qś†hź?¨{¦ĄśĹ˝ë›´aćňüŮŐÇCKâyS±JK»› "iý0Ë`¶Uâ w{kŰâÖČÓĂÝ\ˇţ6wŢUmUeş ˘.1xzšć<ą?xŕcĎľŇ%ĺť"?G*HŁdÄ_•ŃoÝ‘XV,KŃÉ)­ĎZ^©~i‹öú'–ŹdĺŠî ™Ý~šůhš‚zĘpúu|ť.kÉv”–¶AŚQTĆe¸Ű[Ű´¶†Eˇnże(¦»˝5ҸçĐy­ ·µ¶»cw$0’ŽŃ„¦ĂÉf˙p‹ú<©GŹ.Ě`väź x­‹Ë_J z!wŰeŹëň‰o„’đb3ín.”ć)'4T8!ÎoЧĄÝí­mđ6ĽPŹľ[]wQë,Q}±dTFvĄ Iŕ¶ŕÂ,|äSAD íĐÇ’ś~ădŐµ‘5ٶL)¬çÍŽ>fHÉá‹$J¤ä˙2@ÝĽçž[†nÎ5×\3jô„!OŁF©; lŠ÷Ę5‚ôÝrúÇ{K»Ki‘żĎżGő"""ŔLżVgÔşfK=˘Bm°`Z s対°´ä”-™ŰÄű”Gp<ëTL¸ytˇđ-CžFŤF8˙ÖĐ6‹»`1 ÖrCŤýTf¸š6ÝŇm†Ľ{D`\î›wĎťö„č–·źwĎ játúj-DD´vÂŁv­Î¨ŐőOC> 6Ź.¤L´ĂS2– űšó^ 9˘IÓh]ď¨ze?O!Ç}u«Ű/Qv,®wŁ—lĐ>˝`ŐK­BßÍH0zɱ÷@ĆąěôŻôbčő—ÜZj‰F‚ŃČäY˘Ăy®ŕ9Ú&bónKć!Ďé3]ݵ`0É}Ť*ýŇGŚĎąçă[˛Çäřˇ żfŹ!0~¦ë f«eîýPsÎúSŃňľĄČ(eLgťşÖ!4ś˝ŚF‚ŃH0ꬕŁĎ˝˘ęx3ýÚăŢř-Ť/¶TĺŘ˝ľĹť·Ď2ä<î­ł Lç˘ß-¸u7%: ű΂­CD˙Őř{‰“ň¦ád_•ĆÄůLżň´>í„XyŠ/ťšg¶ÄŐşśµ€Şęý¦î„•çë+˛ĂÝaR6…&}°š y¶?ă·WçŻŇH%•’Ś‹ĄFá†=5ţ`¨Đ)Ńşęh· ]Ét†Gß„A×I˝˛ąÖ‰ÇÜ™›„nö*ă…s'ŇSŕrcâJ˛kvÚŐ:ަÔ|yz¦ůÖ›ÍysĎŠă~<Ż8ě¦Áť©ű=·ş#/‘Ňć ¦Ă×ü" ĽpHŻŇř˘ý…`jěÚĚô7 Ëâ±öxWŐF™˙Őă^űšŹ{…ÁÉhü„řŐŃ…đ¨˝irc$x±Ą*łEmşľłĂöęUŢ\†DZ:)Đ]íłľˇV·‘®+YµˇZĄˇBŞ.96žŁĘšĘÍSÇp […ĂÝ;SľgXFÚXoŘ@tńkŐó/4·çĂr¨-ŢY@řúrh®wŽt€m,ŚFzęĄ ·”iŽLžÝźŘĺ×ŇáXěug©ŇL÷gú8¦GpŃaVvĘGđŁ©ű}ľđ•(źML‹˝tFi!ĄF® W/O M‡«ô‡- ^ľŽ~t©UގÚ_g$ŤôěşćźÇ˝>)¤.sÚ9nfKRŘ×,]8,ĎëWuń+#-čÖś6Ϋ–@g—­J#+Ó±®ÔDtčý9‹qYű$"˘uT{´ÝűÖ•âŤW׍Há) ň\łzĂ>`ęNxáę婎vnÝ ‡?s†éňÁ÷©nłę¤3^ŔąW®\Sęq_yŻ?bLĂÇŹŕő©ąě„o›"–ĎhĄ/…™óť"€©ÎńŞŻě'¸9Çß˝Ků]<ĺ,íQßâN\“?M2ZRgŐ/AłŤ%ĘľW&--ň4¦EŇ!OcÖ Ó±®3§ĄôrhŇçŻŮcČÝ!Ow<?c1LǺΌRČ=•JýŰаWő­]{ĽZnÍC­K:Ţč“Ë-ęLŔ{ˇëwĆ˝6S‡čw_ą ŘŽÖ­vňé˛÷Uz¦Á‰Ö¦¦łNU±ďÍÁCWfU?5 ů(‰_Ő:ź~Ą¬®'ůi’­Eö5K#BßÍř‰r5Ó!O٦Úî÷Ű«ĺççTJZ:4éó#YťY‡‘6‚i`Ţę«Öh4šjźUíNÄ´ţ†=.@śh3Ŕ4 BĐh4šj{Ť¨v+cĆśUZh=Ô™:˛ĽŁoy©Ë»'>EřR.ąöh;DGď`y^_µWžĘÎʉdů  ç\+yT€2ťë:łrʬ™¦ây˘ÔXžiWüîŔáVí­ľ›Żäč;űÖ0¤é{ýa‹€)q8p7â:{ŮÜé0kÉŢú•Ćtu=Ń»›ö6éä“{apň×ppLÉ„ľ›ÎÚđ¨=­Ee(±÷€®Wę0öBľ€T­Ü–«!Ł€¶‰Ř2F€!w˙Xl u|SzSžT'IDDë öh;††Ěé«+2]kçAc§Ô·}$ę„S'Ý´'ł:.]ńsr€08)•LěÚŰLa˙.˝tź˝~/Pklrx›t^Ŕ6é‰^‚öxňxóČň˛şž›·8ZµĂňd\u@zTž˛ßłËß Qš­Ďýń›˙üôÇűŻ˙ýËDk@Ľúłźż´řŃ-•Ď|Wů­j*.é¸Ôł(wżűí›ü=TâÂÜ ¸Ţ7‡ĺ~"qÁ–®ÄBlľ#oćJ W­'^ŽF‚9úh­‡?]çŃÍ\ćADDDD´¦L­i""""˘Ú`7 >n~÷Ű7K=""˘ÇŹĽ´\ ¦Ëď ""ZO<ňŇ 0._›é>Y""˘ňÇ#/­k¦‰VÁ4Ń 1&""""Z!ÓDDDDD+ÄËW@ĽZę)ĐĘm˛?µJDô8ŕ‘·@<Ć)1.k|FĎĹÇ”mP<ňćĹc\–y™FŁ)őhť03MT¨B.iń!Ńc…™i""""˘b0MDDDD´B ¦‰V豦+Fí•:cĄÎ¸ctˇÔsÉ)äiÔHşÉ×Ň÷ńw»‰înŤ¦Ń*Ől‰Vl¦_«3j]łĄžQˇľ¦‰ĹJ=‡ěÂľiÁîLĄÎX©ło Ż~ôŮmŽ)}÷"Á{-Unň”ÎX©ëßşúť/‹ˇmbŢm±¸çc&÷|,‹ĹbóîąÓžKW—ü yNĎY,ë<ĂljVgĚöUꩥ ŹÚµ:ŁV×? 9Nm]v)>»NřÂ0ëT~ ąfÓZš3łNRÔ›ŁCĆ4šGâĂöOŻěçIÝi|ň…XÝ~‰TČ!ôFČL ¸|˝¶˝~{I(Ұá»öďZ*Ňx% úköŔxĚ ßd@`Č^cµ–tZ›\4\V;Qđľ5“ü¦ŢŚ^˛@űHô‚UŹY§®u goŁ‘`4Ś:kĺw#Áhdň¬Ńá<§Ś[gúµÇ˝ńÁh$x1gZJßâÎŰg„ľ›‘`ô’ bďć°©Ô6B0 ËĂý˝Űf€đő-ű-ÍńĽuJ©†”ş>a—ß:á«H4şflu+uƧffź:Ř[`¸µRgß6Ł6TbĂřPŰ\­[Ŕ»]ĘO« źŐ _ĹLżśĂN¤é}¶ŤÚ—Wjâ·WKEÂś»Ă$µÚ^«±BžÓsîóŞ˙Ë)§Ě¸™‘4•łŽvŰĐ•¬AgxôÍ!@tťÔ+›k]RHŤŞęý¦î(‚épč6aŻ28^8w"=.7žđ…ăĹÓ®Ö!đ6ĄćËÓ3Í·ŢlΛ{ÖďÜşN&ŕ9ň°ŻY—Řuż3użç’™r˘ŐÚÁ4±mą2»ŐŰ»täP˛Uo˝ .F‚‹‘ÉĎT8śŠÚËýHđ“v@ěÝ6Ł2 P{˙Fߡď^ÄýYťÚP3ý•Ç˝RČbdňóýxŕy¶O"ÁĹHĎ\Sö?uÜ aߎăŢĄÁÉĹHpń’ bďSÉĄďł\É2«ďT˘6Út¬ëŚPmŻy­Í°’Aiy”Ń3#i"*wGLĂlwďLřž!KÚ8ě;;  aŻ"ÔÖöfEüZőü Ŕíů°j‹wľ>&BxáPbÓzçHŘĆ"Áh¤§^ĘpK™ćČäŮý‰=X~ ޵bŻ[ý8Žđ5ż/ŇĎôpLIiň±vł3ą‰˙Őă^GS÷ű|ľ˙0˘ÂmŚ`u/~~«uű­ľĎęRšăwšźSű/żx#s¨­WĽľb]€ŞĎśÖeŚ)îű<\Śô<şćŻ*ćJť±ň¸@Ĺť…´>굏—Q·­`ŘSă†âß™:Üt3-{Z)†f$MDAíŃvď[W–ż]Ř×|°W XžWć­ëz˘)<¤¨Ú5«7ě¦î„®^žęh·áÖÝpř1GL_ńčxĹŞ€Ş“N«Ľ“ý»ôٶ öĐĄúbK•<Č‘ZőGl’ixq_§µ§Pä˛zĽm`Uź].^H g+Fí;SRŇ÷“öUŤ^ġdÂîGŠďäĚ´ô%_5Kďłń3Ł!ń­ˇmBşC‘Ö #i"Ú(ęŹŘ††Ő/‡îÚŰŕ˝Ú-†R$ ŰŘkFt[ë’ ¦oôÉĺu¦ŕ˝Đő;bĂ^›©Cô»ŻÜlGëŇ·\-9“ŻíÎŐs÷®bďś(ÍF ¦UY"ʍ띨p%Ň điDDDDD+Ä`šh…L­i""""˘z"Ƨç–+ţ‰’l˛żÚJŞ6÷zOű®|滫SŁŃ(˙Ň/QQlî•XD<0)ńieŤĎč!>ńôń±Y×»ęďđ*ĂŚxhílÖ•XD<0Ąa™Qůâź]$""*sĚL•@!i9ćŢĘ3ÓDDDDD+ÄĚ4•žVgT~Ë› ‰hŁ`0MDD%¦Őßżŕč±ć·Ć/ÎĽýŽVgd* qńQPĐ/ď+äiŢ‹–/ŰUěMxu[hŔĺë°°íőŰK9ŃR‹{1Ľ×RµŞ=¶Ź,F‚EG9ÚŤľ%±wÇęc弒«Ď`´Śźé:fŮj™{?¤Ň˘ňś>ÓőZĆů­ˇm"6ď¶älÉŐ?}VE‹Ĺ**žđĚ·ő˙¸÷űź?řŔÓßŢźř*ţ.7 ˇďf$˝dŘ{ ăj§ľĹŤ/e!Ęű–"ő[ď F/Ů }$zÁŞÇ¬S×:„†ł7‚ŃH0 FťµÉŢ3ýÚă^´ŹČo­÷ĚÓĄ®‚W˘ńľÉ€Ŕ˝Ćj-`?naÎý“RéBXšö÷şg€đő±ý–&Ĺńłđ”łçÄYxÓ°˘«ňT;5yP@ÚŔ40ď†}(€ç”Ď:?Ńf0ë:#¤\K tW_“SÉVź”6ňŰÇb±X"ŢÍčňś˛ËÉ&µü¶iŹ‹ €§ńŢPd ăgüöęś—”)źĚ¸yFŇ`y¸żwŰ ľľeżĺa˘9ž·NÉ"KÉ`׬üâ„}‡"+ĽŐŐşĽŰ Îou%—ŇŢ•'|©»Î—rč­÷ Ş3W™›2±}ÂW‘?ďž*4éCj˛Ę°§ĆźşT3ZCv¸;Lí`E2gU _}µ´´ô裿†oßz÷í™˙řjé+Ç^ĽľßĚĽ{­Č;Ű”ô»·î†ĄkŞ'|á™~­®:QR(·Ű›ĺQü­ÄQ)~16ĺ –2š˝ů„âÚlâ­Ô‰t´Ű†®d­` Źľ9®“zµwC·{SčÔ‰%÷¨z`UkĚ<.Ż6aźs%Ú^«±BžÓsîsĽCň€©ŃTŰýŠMJot ¦ ňüŰĐ•Ůioď÷ŽJ¶ÎôpLI'Đcífç 0Óß4ŚDŁ,ěk>î'ŁńäÁ«Ë]Ŕ†¶7Üs‚¦Úg•×›i ‹ĹbÇĆĺH6ôţΉU*-iKę5łŹaO Κî€2ë¤Üë„´ŹFO(4éóËŐvżß^Ýxz]ÉJáô )ŁçMIŔ#¶-Wf·z{—”‹Ho˝ .F‚‹‘ÉĎT8śjµ–ű‘ŕ'í€Ř»mś#ŔöI$¸éymĂ­‰b’Îŕ'íŇŕłŰSúî]°.IÝ„ľ{‘ŕ˝Á˝O°*— űTÜYPťyúܾǽK“‹‘ŕâ%[»Pt'W|ÁiéÄu§+1 뿢Yĺ3óö;Á÷ŢýË_ţüQ䣏ďůó‡.,˙Ťhłľ\÷ěaÄłÔEÝí¦ľćá…CńŐ˙ęqŻJ?q_g$xs°đ6]1ɇ*±×=č­ĺ|đäY˘Ă©(h”FŰ×ůŠ ęôÎ&öŘńŠ5=*>bęLg™çÝ;SľgPĎ7ë űłJŤ‡ĐwSšąt U=°Ş6Ş—×–éXסÚ^ŁĽBdqĎ'*±”×|Jo||šGaę^<űşą }7ť¸úşÜ6}Ĺ  ăH-€ú#6 {‡®ĚE˛1AúÄìuČ-âťä×úw´%˙ {jz«i ;Ö­taqĎ++—CžÓ™Ł¤őL±ŘÝŤ€.1¦Zła:Ö%ڇ ±¶řČŤ§đĆÄž!Íx|rf«Ĺ÷~&Ęö”W4ÜüĎ.¨{ńó×ÍŰŃwω­Ż'›+Fí;Są6ÜżkiUí#‹ŠkÇś“·ĚOślź$"é¸%Ă>`ŞâÎ°Ś Ęyg^qÍ_Ŕa®Ś/üŠ; KN÷bë]ş=Á8źq3Bčý9‹±#{K`Č÷Ľ €t6ÜVČľdôĎ2«ŐŃh4żüŐĆďîűäÓOc±ŘÂÂź˙mČSűŻĎ54xę›ßzî~ňĂęi40ěÚD·‘Ř{@× í#[Ş EŔâľÎű"€™ţ”ÎÂî]‰—{ÓáĂŁöŞżŐ‰Ń0ŰďĐp`ÚY5y °­Ëě]{´˝ő­+¶•ü,u=ŃÉ©k’vë0kďŚD#é ű€)ńÎB*VŐĆé;*Ç叼Yĺ[‰¦·ĺLđ ĺ(Đ-Ěąç « •3ÓŞ:y!˝qţ˝ňąrf‰XA¤›â÷ý„<Ť‰Dpčý9‹Ń`ŘSă·˛é"Tjź§ŰL±ywjÝĄüĆĎdŢËéĚ[ľÉ"4éó'j¸i%6y$ Uź].¦˛R<*ĺn?YŰŚŃB…X„Q*B·,í­*|ćrfZú*pá‡<Ť)1«éX×™ń\j™-ň†ŞŐŇĹ‘>«bjhţÉ/ućÄÉ—ě/;˙Ł÷—ż:łßüŹú=ĎxôčáŰ\űĺ/uíÚőâďxsj¦ÓŽ,Š ą@R$-ŞŇ3¸ÉŃjí €÷-×ůNÂŕ‹őjCŐ± «ĺĹ]{ĽĘq•¦Ö%ý87úä•ě]U¬«;ÚćPđJ„tnš˙ž"fĄ7Ó+WÄ@Ş Kd©U?&â׭Ϋ^ö* rKzjĆ€ ¦±Ć^Ý0­sBĽôJşäjw'Ú˛\¦ÍčcŘą+ýÂmňŤQýđi·úŞĺ­y'"-ßw9°…Š[+ˇŔä­®Ö-°}yďöŚňč­WĽ©Í3ZŘ÷”c Bßý–ŞBf.ׄ8Î+ » ™phŇçWÔW6zB¦‚TcU#d¶!Ď©\ŐŇ!OŁ\ŁżÉ!ł%G˙ĚYĺř–ëđs˙]ŁŃśčyá˙˛˙ćý‡^xöË/ľřAínż;uěú×î=árý˘ˇáPţhî*~«çłŻGýa‹ {†¦ĂY.ćÔ™:Ô߀ľĺĄ¤Ődţ@°—2Ť•8ÚŞXUUŹËÖL§­‚ÂVbáăg”ĄÔ¬–ܨXć± u=7op´j‡@śtŐu®ł—ÍťŠkLRĎčŤÝÍ{›tň™ş08yŃPřžL±XÚKSćőŘŚk´Š·&Ôű ÄbY÷©ţNr´e_F&JńŔ9˛e¸u‹Ă\éhČý…Ú϶8ĽŰuŢí°}>Ą×pkĺ0, Ž<ĽÜú¤‡—zʶ8zwśŔ=é·[ěÝż>~żˇ<Ł%ę­—Ôgž2·O"=‹7vď8Ř»]çÝi2“÷ ř ŐÖ•!cAf.Ń<ë1óíܤż«ňˇS4?<ř,€çöúÖן~çťw~"<ž˙ó‡_,}µt¸éĐÍëďj4 –wZŤzçHÇpëìu4äzn•ŢÚŮŢ+í/©ŢD¨=ÚŽˇavĹoűnŐŢę»yÁꊌ@×ÚyĐŘ)őmI䏓ťHÇĘ–*„ď)Ő,®:jÖŐFµăra2ÖHćşKmIÓ[RÚăŤŮ´´‘0ÎIo˝I{¨MŐÉ Á“‰÷UŠ®R:äŞ'éÔ®Şr‹¨śé­÷2Ńg‚źÉŻkďgÖ·č{ăK#ţśÁNůýĄ–”˛ăĎŇ–O]bó¸–Äîۆ}RnFĚY}´3ĎAĺÇ/°fúńňűkcvV}çăż}şuëÖď쪚ţýŤÖ=űŐŁb±_ß‹ĹbŚĄ3Ő%Ž# i‡›dźÚd»âŕUď FĺĹUëŠ]éĂeĽäĽuZ2RʉŠa/Tw”¶UˇďfZ±ĄĘU˝Qĺ¸\·şši"ÓDDTbçu ŔţáÝ?üé]íÎoř‘đýĄG_VďßůđŻßÜąMŁŃ0š.áëc" ôŮUn=$z1&*€xµÔSxě©äŚ©4ţö×[žţöţ'wVÜy ‹i4šgľó÷[¶nÝöŤo<łó›?ţ‡zđĺżűÚ–RĎ”dÉo˛=-Çžë­/ŤFSę)•#׋Ůţ´9QůŃČ˙™.kżű훥žźďÂoJ=*GŹůz—ňÓD%÷ŻDZÓĺëg?©ÔS ˘uÂőNT¸iL—ŻĹŹţXę)Ń:yÜÖ;o ňô¸­D* ÓDD´®xŰm& ¦‰h]EŐŃMD´Ańω­i""""˘b™Gůâ :ÚĎ~ţod!"ÚXxä-ŹqJ ¦ËźŃłAń1ĄDDŹĽyń—†eDEĆ'=>™&*T!—´x‰č±ÂĚ4Ń 1&""""Z!ÓSČÓŘč «­k¦7§±ÚîXÜóćOGň4žÂmŐo‰¨`…TŰóYT´Q„GíS„ÁÉ‹-UĄžŃÚb0˝vfźŇµn‘_Ű>‰ô<^ÎôW÷&:- NŢË˙Ač®öYçcîîĘ$Nch›(őÖžVgĚö˙H2­†őÄË9Ţĺo@Ř×|°WT©3ýÚă^ áě ÷I}÷4ëÔµ%ľk‰:k ßÖí‚Đwó‚Łv­nj Bjiz¶±HO}?Ů ąL#ÁĐ6!BŞ’ f+Nźžłš 0­‡vľbŐK9lˇď¦4ć~ܵ7 ÇÓíyŹšŞ -ŐIŞ&ŘT˙Ç–ťŠ#*\ŐÉ ęבżóË®uŽŰµ·Ŕ{ˇ’žňĹŁ˙ÄÍ…\GT¶L݉Ą–—Žó[`v›c °}žv,P`˙.ä­™6­srťEJY„ˇíµ{µFŁŃhNk,RÓîDßÄ ¦±Ć^Ýč Á°~HłaÎĚÍŐq”LóÉ1ÓďôËŞt'çźśT|ü@·F€8`’§–}[*…\ů-EşXNş+#wUP¶©®'‘®çŇ”\ł¨3uLcaţŰŃ:ET U'ťÖ]‰M ČgKheNR5Á¦ú?¦Ú“ů0Z;ń“ĎóÓËŮ*ój‰ľĺĄ¤źâ*×ŲÓĚąô[wsܧ!Őś€ĽŢs)|’ĽFDEÄGă­‘Úű‘‘§t­ŰuŢí@âŃx[]ĆíŠëÂŇsń*FßĚ7šˇm"Ö–Ň"?„Î0‹ äě+ż4 ČO0 ÄLH´)^¦Ť“ň»Ěýgi7M¤n›xX^Ɖ§ř ‚ň”ţś©đ] %z^ 壬¦]©őéj]‘  ń‡‚Ýş†Ő>Ř0äđľ5şű=Âŕ‹ő@fô oqG ýrhë0kď,ëŮ^Ëť$ń?6íZÖŢV­®'zcwóÁŢ&ť|ůHśĽxxŐş"#еv4vJ í#QgĎÍÁŰ­ÚaydWPpń±ľĹuö˛ąÓaÖ:”~ń¬ŕí{čzłmXďénrµŽĹsKjĄ&ť°Ť]J ¸ŞI­ éµS{?Łŕ3řŔ™Ţo©Ĺ˝Ř˛Ns"*„ްç§[wöŐ˛˛M˛đ"âîĂSCŽ^ áěá*H©aďĐë>{ťUŹ…s®ëĎ;­úşžh¤'ńhŢäÍŻĚşęj ­»WZ3'ąko0ő^huɸYőLµ'K«˘·^ŚXS›ŞN^žĚŐAŃŇâŽĆ7őÎ`T:Ő%â'±Ęť·dô”–XÚ€Ę=*:ÄçąpS´­Ë|愳Ě$s2‰˝:Iőźšh%XćADęz˘7úů±SĹ{ ť‚t3ľč0kuαěÝRžĄ%%KŮe˝µSŞžlI~zW]ŹT¬|@ŞĘ¸…»‰ öŠBßÍĚ´ôpkň~Áşž› R‹TiíŞSź¤ľĹuV+:’ąjµ˙1őžDŹ©Ůř8ÍťbĂŮku˘N´ţ™&*T!đyRÉĺäÎoĄuPMw!‘ ŞUË]©e›ôÉRF˙t*oŐĄmnÍšyJď™ţSÄ©¦ÄTsiŞ˙cPé™=Ťů×ÂióRO0m ¦‰ ˘ŃđĎŃúŮĎ_*őh%L—µßý6i´N|~Sę)ĐfĆś4Q™ŕ‘—–‹Átůb¦Šh=ńČK+Ŕ`ş|1SEDD´žxäĄŕÓŻőŻť|č[Üę±Ań0’¦Ę(Źľ9/Ö@­}°đž]‡nö°Hô»·î†ĂľćŚLö´«uĽM‰ÓYe.‘»őfsţ$w\ú çN(ΧĄwĄqT÷%˙ŕË9ĄMú`5”Mń3~{uŽJŽą÷CŇ Ń’xM”O|AMËkÓuRźĄgŘwvl úŻJżßňďż˝9}ŘĎ…ĺ­šuFí‰~牔%Ů<ş©gŽU™ą äŃ|á™ţ\ <;i%¦\ţRű$AĽfC«36 +¶WŰ]fĎőIˇQeĆÍŚ¤×ę‡ Ň×׹´ş|­ÉWř!8ďJTFĎŚ¤)·2 ¦ďŢ™đ=4ë űwäłJŤGŞđ5ż/Ňë­ĺ4öäY˘Ăy.ŚzçH9óÝS/%ĽĄ \dňěţÄ0–_G‚cí€ŘëÎ}Á:ěk>î'ŁńŢ«Ł8ůŠ ŔĐ•YÄOŻ;^±ęUz®ěPč®öYßHŻäşäy÷śN›ć­>9Ô®¶űködlL¤*± ş6ł÷|ŃţB05vMůë­\PU'_±SťŢŮÄVŻôŘ_hnχ!ť9‹wľ>&Bxá^eŐĄ—ŘŁ˙Őă^ w53ýSҰ±vłsPű$ÁLÓ0=ă˙j»SíI2zf$˝¦Ô?L2Ž×ϧĐĺ­w÷,ĹЉHšÓ”MÓYŐőD#Ҳ¤¨:łCě= 3JÇBéBO<ÉdîŐGM.3¨:é´Ę‡íý»˛eßŇHk^ŽňŹ{!u¦Ăi,Ěß`;Z—Ąg\Á×§ÝšÓĆůŚ˘h%Ůš™{6´MÄCm‹Ĺck"YĆ‚Ęiáęĺ) ˇép•ţ°EÄËדiŕ´ĄX W/OI DoŘLÝ /\˝<ŐŃnĂ­»áđ˘2|O$ׂ÷uF‚ŃHĎ®ś‹.“üp¤@ý‘äń8ó“DŮ3÷”T{®ĂőhZ R ÍHzŤ©d=^g*ř\ŕJd$M…(Ł`z×Ţď…ä^juG­KĘÝč“ 9Ň6–OXĺRÎđ¨ý€cJ: ]ë„|˛›Ü»\ ňÖčő11Qµ˘Ús9BžĆ´H:äi”k:LǺΜ–n, Mú¤Üsň]ŧěé"DŞRTÚÚL7sľS0ŐyШ=Ř+"÷UťřqťďL,:Sđ^čú±aŻÍÔ!úÝWnKGÁ\sT]PÂî]yűląź$«Ü•9FŇkny&ŞŠvVFĎŚ¤)·2 ¦ő-/u˘ăü4ĚşS€­3í¬1üüÉc©bäsSrňIľżaáśkŮwMĹëOΧ=D:źrôŠhh:\•٧¤ĘФϏdatÚ39’•Ő>kćťň“ńŞ}ÖÜim"uńµé<§¶H¤¤Qâ@us°ń´®úhŇö"ľ@€ÚŁí˝C‚ĺy}Ő^ajhx*-,N!ç‚*ĽŹ’2ťČ(«~’¨žZ¨îNµ'k¦‰˛Éöa˛¬ău‡ŕBV˘C3’¦ĽĘ(j]ňC<ŚZů±=őŠ;x¤ 4ÂŕdŢsJ©’a85ŠÍ\ ń¸űwéQU˝€˛`:C! Ş>©Ëůć`ÔŇ4 apŇU§ţI˘oqťäKĆÉŐv§Ţ“˛Čúa˘rĽN= +G)ę!‘4Bóőüo‡žţřo˙őáż™h WÓţZfĺ3ßMűă™™}¨¸¤˙áRϢÜýî·oň÷Pi#,Ě…s'Ěť":.]9 9+\ďĺ¦EŻZOĽě»đ›/şŤ°`/ńŞIx>wźĚ6şĚ•(­neqWfmóMăÓżńωŃú _ˇĎÎHšĘ ĎiiLŃúŇ[/F¬ĄžQńj©§@%Ŕ”3­i"ňXÇ IDAT"˘ü#DT8Óeíwż}łÔS ˘uÂő^>|~Sę)цÁ`ş|±r‹čńÁőND´A1._¬Ü"z|p˝mPeőśi""""˘Ť„Á4Ń ±Ěŕ#7‘őüsH ¦‰dĽxXç‡#1._›űü8óďŐŻ~LŤFŁüËźDČć^ďEÄ?ľMDĺ†ÁtY۬çÇŞ§Ś«<@2ˇŤnł®÷"⣸‰¨ ńD""""˘b0MDDDD´B ¦‰V5ÓTľ´:Łň[Ţ\HDDD写i*SZťń­ń‹oŤ_đÖřĹ_ţ˘+-¶&"˘Í*ĺLKńqâ넯˘€Ť*Fí•:㎬§°ë<«Ů§tĆJ]˙ÖUî4¬c±X,kě§XÍE‹aOMÚÁ5Ţň4žÂGă59«břꫥĄĄGý5|űÖ»oĎüÇWK_8ö˛ŕőýfćÝkEŢ=¡ۄ˝ÇŃĚý4‹-,üů߆<µ˙ú\Că§ľů­çţá'?¬ţ‘FĂ.Ţ’H«ë‰FLNťTa ŃaÖŢąą×/pµńU)*>:#î‹fúc„Gír.sI˝3=ŇŻ}}÷Í ‡®ž0Ź˝0)çŔęÜŃĽëÝb5·µÍٱş{OL*۸ÓYęÚ t sîůCĘ(RZzŢ”6xĘ'Ćš¬_˘bŞ3uŔ+­Ůú#6 {‡®ĚşęjYę”ČXoŘL‰ŽóÓ-=ő)ăôD#=űšöŠń…, N29M«·‘‚éŠĐmKńK´K“)…Ń3Ś-j?lŘâđnÝ]!biđĹ@…ę¶á» ě~”¶ˇ [âćť•IK#ou·gÝ$}ď…H/ 4ëĆ&B“>Ík•–µ—­¬łš"ĹÓ¶cŰ'ź~ÖĐü]U%€GŹľýÁµK˙ó˙ô§?-ţŽi“«uE‚.@>¦Ţş{w/¤Săź »R7V€§]ƦlË\*ÎĐDłöÎHÔY[řD mo¸«=óć<=ŐCi)-“ZŐ>ÖrýOíŃv Ik­®çćŕíŽVí0“®:µöÁ†!‡·Içlc‘žčŤÝÍ{›tň' gňXč»é¬Ĺč›%řQh“Ú8eaßSŽ)}÷[ŞäĘ Çůü7#¶,[˝hxx¸ ‰ŞŚ|ŰĘ{ß0ﬞ¸“HV-TÜĘ2¬ÚŢ ©™Múü‰ ˝MŁ'd!H5†@fK^!OŁ\\VfKŽţ™ł*d§:üÜ×h4'z^řÁżě˙y˙ˇžýň‹/~PűŰďÎ_»ţµ{O¸\żhh8TÄ=Ňă%ü`˙®ząöă|!©˝«XćóY–yžÝ.ㆶ ±Ć^Ý8”űĎĆĎ(Öab)źJ©–Îü|P]żą?ÖŤTÓ쪤ë<ńúf©=í>BEcO=”ĺXr7ĺVŃ V=k¦©¨6Bfz¸µR:%úî]°.¨ëYĽ±{ÇÁŢí:ďvR®× ¶­Ţúy{ďöa ýĄĎ¤[éU·=\Ŕ†ůfµäŮ2ÜşĹa®t4, ‰~r’{»Î»¶O"*{ż_Ŕ˙Zą…a Hi1e´(¶ź(hŘÜuéďšň¬Ü> ŕą}‡ľőő§ßyçťźφç˙üŕáK_-n:tóú»Ť­Őîi3JË%dzѵ™y¬‹™ź €zçHÇpëìu4‚z QOňćŢîçŻŮ\¶ÜĽ`-ôa)«Ő4ËűK®şđ3—rz7ŐĹ^@eĄ(ď`ş®g1ŇŁţ–Ţz/bMmJt®UnőŔ|ŕĚ»mf‹ś]~x$ă˛lÖYŐŢWű{×K-©%Ń*{/°fúńňűkcvV}çăż}şuëÖď쪚ţýŤÖ=űŐŁb±_ß‹Ĺň‡D őÎ`Ô©ö†Ţz1ă3!ĄE޶ČU")›'ßMš aß^z:ž+Ië[ ¨™&"˘ŤŁĽé _ß"Bßg…ÝzHEwţW—üçŢýĂźŢŐîü€ ß_zôeőţť‘˙úÍťŰ4 Łi*_u=ŃŔ¬ĎÓ•60ÓY¨äŹiýüíŻ·<ýíýOî¬8¸ó@,Óh4Ď|çď·lÝşíßxfç7ü˙ôŕË÷µ-Ąž)=ÖLSYs˝Č?lLDDDĺ‹ÁtYűÝoëg÷Hůi˘ÇÄcľŢ‰6(Óĺëg?©ÔS ˘uÂőND´A1._‹ý±ÔSXWńj©§@T2ŹŰz'"Ú4LSYĐh4ĄžѲ1¦˛U{D7Q™Ű8Nś¨Ě0&""""Z!–y•oŔ-ĐĎ~ţoÖ$˘˛Â`š¨,đéxyńQÜDT†L—ŻÍť©JK/U>óÝŐŹ©Ńhx##­'ÓemłfŞTÓK«Ľt»ąĎ=¨<ńD""""˘b0MDDDD´B ¦‰VÁ4•/­Î¨ü*őtÖY »ŃJĽÖÄuÔ[BžFůűäfÉŤĺ¶ĚqhULS™ŇęŚoŤ_|kü"€·Ć/ţň]ڧ)ż™~éÔË9łú±fť:ŁV×?­ŇúuÂ^ýŢR…<ŤŤp&ń}`b,‹ĹbóîąÓžPfKČsĘgťŹĹb±Xc?• §ÝšÓč˛d‡V‡Á´ÂLĄÎXéšU¶mu+uƧŠp`^ťdÎ)‘tJdůĄĚĹéą*Ĺ›™i¬¬ťSŢULŞČ‰.)’ţVĺÓ?úń?řqmĂżăiĘkúŠWz1ôzń\@­+ŚF‚7“ŃH0zÁŞ/ön m±y·%ń˝i`Ŕ$˝ ý5{ j-ÉŤŤ‰ CžĆÓĆů‰cÖqhu6o0-EƉŻľŠ,+Fí•:ăŽŃ…˘Ź }Jg¬Ôőo]Öä3…‚5r>IN:ş)Ă4ďžş€J‹$%/•6jZöK­%GCŰD,Ně‚ĹhXĺO™f÷ůáÓKKŹvę ßÝ»·¸ăÓföť[‡ţ«ńhzÚ•Ě"7Ź.¨¶$RÚ‰Ló´«uĽM*ůi•]7ë2ĆLÝ‘”/ŹÚ•–C:{?‹ÇĂ)-†¶‰×‚ŐŤFŁ©öYßh3!Oă)Ľ1ŃfČ7­Üć ¦%í#‹‘ŕ'í€Ř»-Kvy©Ĺ˝ Ţk©ZÁČ‹7ú–ÄŢ«Ź•óJ擤¤S`üL×1ĚVËÜű!• 3/•*=űĄÖ’»ż,ä9}¦ëµôcöjĹb±ŠŠ'<ómý?îýţçľđô·÷'ľŠ»;ÚčÂ×ü" Ľđ˘ý…`jěÚ€đ¨˝i8žBŽ/¶Te¶ ěk>î•[.Ů öľ:şPďéŰX$ŤôÔçŢ·Ţz1ŚF‚ŃČäY˘Ăy. Ěô7 í#ŃHp¬}ő?źtözl+ĽŞq¦ű°"«ťÓ’a€Š; Đ[ďE‚‹‘ŕbdňsç¶08G€í“Hp1Ňó ěŰqÜ»48ą .^˛Aě}jyW{Ýń ¸PÉKâUΦ¤B…ô_›´ôĚŰďß{÷/ůóG‘Ź>ľ˙qäĎ~¸°`ü7˘ÍúrÝł‡ĎRwż´QÍśďLu4jöŠÄ^÷ ô-îč%›ÔEtµ®ŮĚéu"WŤŁÎZµ}dµpLI## ť.äéŽ/ÁŔř‹ŃŃbŢS#ĺŁ!-}őzčĚqh•6{0-c\˛a¸5-÷śĂÖ+^Ź,ďhŠxŽYßU;\óWsĄÎXyÜ  âÎBÁu&nÍiă|fäűsiÇDąE%/eŠ7®6Đ-ŇŇŤć—ż:ó˘xë˙÷í·˙ĎÍ˙oöć˙}÷߆<µ˙úścČö˙śű˙+paţOÁĐÝ`QwK”NÄŇ ‚CWf ®' Foô ‰Ţ©-zĂ>˘ă|žÂčěîŢ™Šż\ż%żÚµ·Ŕ{ˇ”ćk¦CžFůXŁéŔ°Ňy±F#@śh3d¶ćÝsBĽfz^˝:s""ZĄ'J=uˇß˝TÜş[q¤řcW„nXÚ[U1jßáZśĽ×RµŐ•«>D과݄<ŤŐ>k2’6ëĆ&“”„z͠Ҳ.¤´t¬ř{khţÉ/%ßë¸ýŰ>ůôł†ćźčŞ*xé…CKřnÝ­@®¬óŁ˝ ŔTEhuůBްď)Ç„ľű-UO¸’©©Š[ęÝ— ű€© Çů­-=ÓSDáŮöšôůá÷Wkě‹{~b@×h4Đ%ĆLL-y…<ŤŐv?€jŤ˝KŚ TZröyNŮáž/hgËtřą˙>í»ńóîýĂŤ;Ű·oľüň‹/~Pű˙ç˙˝÷Ńýç×»\żĹÖ`Ç´1ą"A—ň{˝őbÄ*˝<Ů’ÚµĹMkIíźlSí©ţVmú ęä…ŕIX8wÂÜ)ÚŽÖA_—uL""Ú6{0=ÜZ)e…ľű-UŔ‹ź Ţ'ĹŢşŢ-µ¸>żl~Ňa®Ě‘ORŚ|ď‚u XrŽlnÝâ0W:–’—“k?lŘâđn×y·ĂöI¤gńĆî{·ëĽŰĄ} NŢ/ŕçPK9 HU)¶ź(hŘą-µwsw_•|Ŕsű}ëëOżóÎ;?ž Ď˙ůÁĂ/–ľZ:Ütčćőw5 ŔhšĘ٬S'=_@ĂŮů BDDĐć ¦ëz#=­Uź]~–ŢčY›ŘD­[î‘ÔŢŹ¨”đ.µ¸•‰(˝ő^z,µ~m ŔÎŞď|ü·O·nÝúť]UÓżżńĂşgżzC,¶ăë;b±3ÓTŢTÓŐDD´©lŢ`š6¸óżşŕ?˙đîţô®vç·üHřţŇŁ/«÷ďŚ|ř×oîܦŃhMQi1¦rô·żŢđô·÷?ąłâŕαXLŁŃ<óťżß˛uë¶o|㙝ßüń?üÓ/üÝ×¶”z¦DEó»ßľYę)Ѳ1¦˛ćz1Űź6'ÚT~öó—J=""Z Óeí1ĎTIůi˘ÇÁâG,őh%L—/fŞĘéňő¸eŞâŐRO¨@é ˝ ¦©,Čm†hCa0Me!Şön"""˘2Ç`š¨ôXćT źýüĄÇ­ŽĘi"˘˛Ŕ{ŽózĚpDDĺékĄžŃFĹ`šh…XćQľXCY ÖPQ©0.k¬ˇĚ‹5”DDDTB,ó  ŚO§&""˘ŇbfšĘQ!e,ˇe™v›†Ńq)čŞ+őThafšĘŢLżVgL~ťđ…×cŻłNťQ«ëźVťŚk@xÔ®UíCDDŹ ÓD´A}7#Áč%ÄŢ®ŮRĎű^uL¶±HO}©çBDDĄÂ`zł y=ˇRĎ‚¨hô»·î†Ăľf)K=Ó/ĺ†ăybŁVgl]şO»ä–¦ářŠÔ˛ô®sFŃO~źsµ€·I=÷|÷\wŻt\ŠGŇ©›‡±pî„Q«łź“˛čńŮNŹÚ•Ó#"˘ŤŽÁôJ9NgRŃóy5’î@¶FĚnĹ îl•«đ5ż/ŇË ţWŹ{`¦˙€c í#ŃHp¬˘Ăěśfú›†‘hĚe¦_{Ü+'ż#“g÷ăyçHŘĆ"Áhfîy¸·SÚGä ě°Żů¸WśŚĆs篎âä+6`ŞÓ;›vÇ+Ö]Eýß "˘’[ß`ş4…Ź« %“”i$ůGg›Ö‡ˇmbŢm±¸çc¦Ue»Îśö„„<§!®zŔµ”ňŰ’úUę©Q)˝tF)bľŘRoÜ× F#=¸âĐq¤@ý€ˇ+łÓŠĆÜ䞯XőPuŇiŐçŮ02ÖR¬,:ĚZťQ{Ü @Ľł€:S‡Ügáęĺ)Ŕv´úw4LÎź6¸Rd¦Ë­đ1/ˇ—݇`áÜë·ˇ¤“ y=žne¦:ä9e÷űíŐMŁ'¤Hc«'«MbŤý”'ŕ9ĺłvâc¦m’– WŮézF‚Ëj§MNNŁNEp,ě.M®·}d¬€·Iń!&g¦““¬µ6Ţ·\ç;E/˛´šhó)]™Ç2 3ęŐZő‘‰m3[TĆĎC*KÓţ^÷ ľ>¶ßҤxŁĐÍ,łU˛ŚJż=x,‹Ĺbr’ŮĐö†”·ŽM´…ş«ŻĹb±X,6oőťR§;ܰ >ëmdlč®¶×±X,6Ř9}§ë$3nf$MŞŮh$ŇĚGjwímđ^HmqÝşÎÜüuź|ÚěĘݬ^ŞnuÎ@oŘ@tśOűôжŔаhh:\…¬w""*o% ¦—[řVΨVˇ¸µ7 '“C[Ş2[ÔÇO›C†çŹŘ†®ĚN{{żwäP˛µđMµŮ®ü˙Îâ–3ĘŁ%í­Đűs8#H äj»ß © `ŘS“k“Đűsń]ĚVË™ń@îť®1eôĚHš˛Şëą9Ř€áVéJůq_gÄ}vˇ,|ö]™=ŠôrĆđ¨]ŕ0kńQď,`/ •-: N&Ş•-Ói…•Ăޡ+ł.[ĘTÔ˝xöusún:qőuąMu(yŞ©5šŇ™Cúl ňk}‹;Ú˛˛˙J5÷üD›!ńmČs:˝G [€(Ö§‡‹čÍqfúHpşĽŤh/lL;]^íg`i§î‘˛KˇşFŘŚčP~.'˛uÇADD-Ž5Ó‡źČ¤ť.o>—nt,Do`cÚŮÇČb>ŇůćącůÁ:ÖëŚćŇQ »:^“fWď¶ży0DDÔş83}Čéç¤9?M--›y@:mI^őÓŐb’8›Ż7¦ť®ĐŔeŻÓĺŤlč:+‹ĽÎč¦ýÖ– Á%ě¦Ěף†9ěČFÝ3âDDÔ¤Z5™HGý3)łĐëPô.d¬Ë­Ů3óij]nĎr8`řŰĎ&úăŇěj>—Î?‚<ůyńüĽ?śűlŔÜŁMëŹâF? şµqĹ„·4µ•Kçs«·Ď–łTpÁűąt^Ś AGîfŤéľy`d1źK/Źěý/„šAS$ÓŮĄór"‹ť»—ŐŮŁ 6cá5ńáWĽĆj,¦<UŚ™ô9ąP( ů\čş5ťÎ+źî†źÄI´'|ůÜâ¨úNśŃÍě÷IY˰űăäçjâ+źËĄóą‰.źŔ|j;ŰO }č+ŽjLŻŰŻD‚(3fię~`L6Ž|ŃP”âŚĺő.""jqMQ3ýâůšôQÔťýaYîb…시=é¶.’¦¶îÝÓÎţÉóŃ“{R[ŮĽü3ęoËăí1,á.×4 IDATĂ:čRJ–‘M \”źľxq̵ËŮ ť:©®šíž Çż]:őŁ iöÓ®*¶TS=´ľ„z=ę훯~ʍµ5xfZöÍCś&e¬Ť]0ONkę…ÝÍČ…IŔüU§+t×vţŮ}JđôEÖP:9˝n3€j+&őĺŹb]k‹Íř–LkíA ef5`ŔŁĽs8ÁË˙ŁâOý›#j¸ěĎ2€ł'»”ÚŹŻ×ËvwĐ#sáIÝ}R䮋Cćľć;wŁ T7¦Ţ‹çkęK1ů 'Owř1cřÓfÍ4Ń!ÓeĺlLźŻiE‡r8ŮčŚ>ž’HS[ąŘ›Ůi+żŇGď« Eé¤íhŐVLf—B}óPséűíÖűńŤ1l[×zS©ńŽDđΰG}_¨Îo—č@n桑Nř&ňʧ$ÄűĘ?/ĎUË#×Ě ß„ř3?/Š4ž˘Ú1uş"‹ŁJeHdYŰć`ô¶¤”‹p®šč°jp™GW$ťż8íüňÔÖ˝÷ż»XţČ|]U_tŘuqóńąG›ŃˇŇ#Ę“ç]“0˛x°bJY>3–‹ÝÖŁ^ëhÂ\1™] ÉÂgXőůNâĂ2l¸ţ«o)­Cv)dZ«ŢGt ©qÇMďöJ1•Ŕ/mˇĂ¨+’ÎGě¸÷sAc“µĹ˛şo"ź›°y]rLăróź­ZbĐ~ĺ^ú ěÜ˝“‡>ôÁí{“żw""j: M¦Ĺ”0༠śĎßě!˛˘fÚܨ•NÖ2’ąb˛3ďQ–Ă"ΩeąÄPúÜćµęßßĚBoG"hɤ5¶Ďîŕ=De3âş:§Ľîľýx˘šZm""j-Í^桔3ęźiu±ţTŰv´*&}ů\:/ŠLěZŞŤÖ¸VÝ5”™ŐDÉPGɧăYóffŇD¨3Z|Ž}Mµş†ÎLű&ň9ÄőŐéDZ?~:˙MŹÍ¤˛obköŮůđUç<Hł«QP÷CďlGĂDţśýj}4µ™Č?>5pa˛ĎĄLśKł«Bä|X˝ÇHšÚŠtŠű÷ő-@gĹhmÖZúŞľ˝ń ݆+ôÉçŇÚü43i"""˘˝ŐčGăm¤ćpfŮ­>Ď®‹MI±m9ٵęŃ®§}rU“–톪­M‡7Ş™®LäÓ̤‰šÜ_˙Rçy55PŁ“ißD>¤YM¸I5ąŹ?ąÖčŕi-Ő®ŃÉ4í>¬¨µT|žÖRLB‡ŁŃ!µžÖRL7µú.6%îýyĎ#!""""+&ÓÍ‹›š“éćĹ‹MDDDDÍĘBL¦‰šo®ŇÇź\ăD5&ÓDDM•]ń™e´ßxZŰŇu˛ÍdšHÁÓÚŐŔ“m&ÓDDDDE,%˘š0™n^ĽŘT%ÖPQŁ0™njĽŘTk(‰¨~×čZ“i""""˘:1™&˘¦·1ítyµźĄťĆ…˛ŃE˘ü\NdŃá¶ő:]ŢČF#FË&̇í0˝®t*ÓâuşBwÍGkµÝöHbCńXâ`¨ŞĘ`”ĄŮĄáŕݬýr1™&˘1˛ĎĄóąôýÁöĆŃÍĄóąôÖl7iv5źKçďÝŤ h_tÍ”KUEdW–ÔĘ8ŕŢĄČ%6·'˛?ż÷ ťĎĄóąĹ÷‘»Y¬GŻâ8<ë‹n6-€ˇĺśX1vĹxt°íź] 9]W窋ÓÎ~,—8Ú U2ëR÷`,ŻĽM/Ź@:mßĚÎÝËĘîä ďO+0™&˘Ö#>‰ĹÔ2•r9‘ŐÍš'ŚEăĺDvcZůÄŐĎs«G1 ~ĆĹÚRŽqÓZý "uŃ6trťŞă›úÄ«öÓ€Íoç‡>ô€űé鋬MKyöýݱüă)©Ş°ţčŮíÇ]%6Pn(!›°™˘¶év{~hl°ÝĐßĚÎsYŮřüŁňĎ/*ŤzX1™ncQď —÷ťjĎËSăŐxĘĽ0łĐ«.ě]ČXÚ˝ dzµeb±ŇęĐŃ÷ j2óWµk‘]‘ôňäpänv3^4µĄMKS[bćXžüĽł&?ďŹ@61ĐWf” ‰>ŮĄP߼:ÍśKßl·¶TÍĽŻLç¬Ţ–D`ŔĆt߼2ˇľ<˛oż˘QĹăŔŇÎzTL‹ĆűŞś0¶=Ö Ű7_.›Í•=[ÖF«í´6űĂ2zţ¨źÖuź|Ď”;ZD˘Q˙‰bm)C­5 ŚÉJËúŁ8€Ń‹ť†ŔcŤ®T!Ş‹ÝŁő´ł+˛8 ¨Ĺ%'PÍLçŔ¶'˘v7gw¶üƧµ›‘ Éľ™ę«ą”b0­0C+DXŞ*yÖő×>úÔÂŚÇS?öW<]1wđ~±ŢòT‰@ť–†©ż)Îčăže%łŚÉg:ŽjĹŰĎLKS/séÝC'Ź×SŚu€6¦OôÇ1˛¸›K‹ź— üüóĎĚřĹ«L:yî]O©Ąo€Ô\±;Ăj/Ďđ̰i ‹Ô¸ôD· QóŰy.Wî¤NťÔżS?űóąt>ŇéŚĺ ‰Er8ŕŚnZ[Ęź] ť݉a9 M‡•őŚQ¨é´ł íŘöD´LĹvgËovZ»q}uú±ĄÚ8űâGăQŦE-ĚĐ ‘ďž,Űß›.Ľ1¸ßď«a2X ¦šĄe§ĄŤÁhg8ʧ¤»s4¨ĚĂ}ę5€§/Ú˛‰ăb–zcú„kúж˛™ ÖĎ‹)mk‹Z8ˇ_×Úb3ľ%ˇ-ó Ŕkső}â¸íüş]<ĺ|[˝Ř$BŞbÚ[”d<ĽTP3g›.« řé‰ís2Ôˇtt„’ş%LĄ©ĺ¬GŻÎah9·8ЏőĆ—RĆʧuřkótŽoBů<(ÓRÚ‹çkęËťí§Ę«“§»ü1üiłfšZ”íc­§ť{€-ÓŮňl21`Čb;?‰»¬ýěI·M °1­T_dX6OÖÚőŻ=†ŰJöbßÂŚľÚ6Tý´4ŚýÍÁhvîŽOâŁ÷ŹęÄt’é¶ď“mŔëŹŢ­4$ßĺŚÓÇĂkb2řź#h ŢŮPgĹ”vnő׳@6qĽ?ţzvuWťä~gi§m)ôö<”Ć\úĺ`»µĹ~|S Ş×ž3Ú›ięe.ýr¶[lÚ6űĆŤé·çˇP#Q’qéaÉĘćÔxG"hH‰Ő’h±FOL-ü(¶c=şőJS Pj¦˝K›w/{űć1ú`˘ ťˇŮnČ“çµ|Zž4q­Yś®Č˛ÚčŚŢ–”I˛bÝ'Qk˛=cŞ>íôůĢÖ`óŰyę˝k*íŘöD´d:¶gËuźÖfżOĘ((,ítEŃďuşĽçĂg–#ť¬-pźú±_9zĽ÷Ŕ\čbÓ_saR–'Ď[Ę íbXíű&ŕtyť’}–;ÍC• ĆnéÎÝń’ÓŇÖ`Ô őŔňG«GązíŔżN\ž<‘Ĺ—íź~ň™_s±WŔ±¨Ŕo;Ľş8ôö|ü­G›ÇđŰgÁ×ĐţK$ضjś+ٶ=ßÁi@äľaĽž]ŐJ2ô-ÇĹ­ăcČC‘ob7çÇuő-mśç‹»CĹĺŻ=g€µ¶ç;mHZă±m<öĽ@qśÁŘî`őżA˙ĄŇĂ ŕ1µ§Ć7˝Ű+ĂďžKŢ\Í {<Ă+…áĚBďő2¦ĆĄ'±íóxDÍĂ7‘ĎMZÓWÔ—îÁX^üe 7#B\… Öµ¶@ˇ8ľĄĹČmîĐÍĄŁć^íWî‰8wî^ŚÉCúŕöU™¨‰Ě_uŠó@ijëŢâčüŐąpŔî–ÔÄYĚ+oÔÓÎĐl÷\8ŢçŠCËŲéÎhn®«}.1oŐmx$…Ŕ˝ýM`,p†µčŠŘtš6—|jऺHł«÷mF«†ĺĎ@»ĺ/Ýň·os„)Űß~Cĺ©–jú—=Ú„Ún\×Ç.ËÁůH:đdZšzy/řÚÜxę_µŹ¤Ďť»žéýqh‰o$fjůgąŔlcčüG. ŮÄń “mO_”ąiŇOŰŇWÖĆc–Ű*eĆW˘đ9őđVŹwČ,ôv¤ż%Ęý†+ęä˛4vłăúB`Ąňl3Si˘}ł)>đµ»ĚÓ¬šŽő °9c´KőJ§†¶çś,çŔÖ”®ôęćÍŮĺ˛6Łń´–öNs=ďŐĹ!o=Ú Í"+Ť_Ššăť?DP 0ľ>fZß7±›Kď>žz]˘ĹvüŞ"ËţÜŕěIýi€6Âk»xl˙uş@›ńbS55ÓžwˇÖ;KÍ9rf5‘ÔD÷.d<Ă+ŰÁD‡ZŤ’OéH=ĽĄ/Ą¶>uʍu[ašč+T´;ĺK}]µ2Đ€™éň|/gź_=1ŻgW˙á0±ű'úŐúięUdb÷ń©ă&ßvĹ߆Ú‘ăş‹M/#ťmK!S Đi3~‰;aŹE‹÷B›cÎľ Ĺ*J„–x^Ú6Fý&đoşÚŹjůg …C‹gxĄ {9l^ĂŇ8Ľ˛b\Ľ–q‰J…˘˘p€É´ob×ZXăľ4ţŮ[×µ¬XV´Ęf|›ˇŕU$ý*bm`W¬b;]ă/÷Ňżš|5ŐLŃáô׿|Őč¨fM63MDt$}üɵF‡@DOk©vL¦kTb›čMěţýoŤxZKő`2MDDDđ´–ęÂdş©ńbQ3c2ÝĽx±‰¨É1™n^ĽŘDDDDÔäL5^Jţ®Ń!ĐŢřř“kś !:RL5VvĽŃĄŐń´¶J(Á/,Ś·}=”L†:ĦŔ¬RăʶL›.Ž<ž˛ŮŠ]¨´WDň§+ö.©5ťÍÖX=ł¶ÚŻÜKçOIo4HŮĄłËęŃi)Ăî»÷ď[ŕ0{´1™&"•ű”ŕé‹,ŚźIâ)›ŻĹ˘ “2€ů«NWčn¶XňQś»5ôź^Wކ”nÓëÚ&ôă›}´µ´ŹFkxÖU6ó €tÚ’[VYŹ^ť€xźËëtMGŚo×µ˘DT"ĄĐ~DnˇoXÚ©rzűzčś\( ů\: ůÄ{§PoÜ’®CĽ¸ąPl/Eúd4łĐ+A Q(ĚřSăĘ۱'JÇšÇďH!Ý&®/dPą°ë±Ý™d(}IđćBžá;±žžŘvˇ°2ś± LOŮŹ•aŹuÓÚČ3~›­Řő§#bd1źK/Źňdlďć­uGąĐݬ3žŽ\ěʶrFQ<š…îf!f¸Ő“ŤÍŇ(ě|÷ n?žčRßwE&ş˛‰Ë‰»QŻräTŽ0?Ç.ëÇ´i)FČÉěá(˙2™nĹ)–â‹®Í4ÁSf’‡¨¤ě÷I>zßťM ôÇĄŮŐĽ:]ýy1ůK~ކ–ĹlŤ4µ•‹]ÉNźŻi`r8 ›ŁýUň™±\zk¶÷=ň>đÜÁűĘÜĚęm r8˘űĽéů“ľ§iłéąŐŰgrĂí9@Ěąľe•®Čâ( -çŇůÜDÔř¶ &ć¨úćuźââWşꛇ˛•ZfµĎá–äOţ™?€ž`ŔxĽ=Ú %„`Ŕđ_ş'?eÔő3« ÄFýÚŰźžô(o=`Ď­‡©:Ćăŕ–¤ÍC'ÓÝČ%i´Mč´¦I†::Ň_\ŮşiýČÖ­Řö§ýf<%¶žgöÍŰ÷•¦łŮuŘź$ŰŚfcgű)€îÓn‘ćŞ ¨z’ż^{Ő–¸6•ĎĄóÎŚĹ7@~vz&ť04×xńe"‹ÍČ…źÇDĎÇ=Ëă‰,ÚŻ|64÷h6Rs#×®hSÍŮ–ĺ3Ö™gyňůEăaGl+—ŢšĹŘx"kmÉ&>ź3ÜËg~QýŽŃkt2˝1}ÂĺŐ~ŽX1b6qÜ´E%’Đšól.“Vć~ ňąĐu‘9w$‚Űuâ%˝šĐSZ¶cOnr&†Ş&OžwyEB|°]dŐJöŮ ?W˙Rä3c–ĚrýQŔčĹN]‡(ÖţŇ©“ęZÖ©buZ%0&‹I”Í}&.}¶_‰Q&`ľ‰|N¤Ĺ€čÝ,·ŹU˛Ťęb§µŁŘŠřŘ®˛Vd¦P(.=lÂóbí SP§„÷s[˛~şşÖMd¨¤'Mm‰sfqZkwži{ňl:›í˛=I¶ÍdţŞrąvĹÝ~ĺł!`M¤żâôłŕÉ«–ŁťôÇ•+xRĎÝ€ű”¤˝€(ç^ç…IYţůźt>µ¬?Š›ŹşŁ˘ţwň™Zzţč÷=’ÓÔâ>ůâ}®éu1˝]ÇR˝šLoLźčŹcdq7—?/ř6&©ßüĐ;řňŮë}­ŠzCĘôÔY—Ô\±;ÚÍ=žáăŤ>™tňÜ»†˘2”YŢt>R<Ękó©†vŰă~ą‘«íź] ť݉Ť–üŚ,ż)Ű€ťQe˘hJ”˛Ľ¨ĽĘpĆň†Äk‘ÄWąâřBđ϶c=ĆąáRRoi3Ę< Bs)íí»ç’ĘŰĚj"yă’żš LcÇѵ$V3ęČŐ +©âJy†WdH˝ ›M—W¦fˇ·ŮNQ#ĺŠĐóťRç™%OžµvgĽeÎZ‹Ä †0ŐÝ„Ď? `>µŽťďľY†>ôŐ~ D61p!Ů÷Xw)C;˘§:?‰»±ůíüЇú,Ů}ň=9ůÝŢĚ≣ś˙Ű7¬;§Ú52™nË<đÚ®±8]}9Ńu"ůr˘mcú„+tü˛÷„ËűΆ®łčVaĹécć-őüvvň@ö‡·ÎöüVU ˇăJűô1­Źč´-…Ěłě6‘«“ßę˘cKˇfĺ3« řé‰éCNH†:ÄeMéIĄ+ŻD%©u_Wy8ÖĎFWőQgçĹó5őĄ¸>[is_Škľ;wŁ TpögŔŮ“]5îcE'Owř1cůCöMč?}«}$ň§Ü‘Ţ)÷DŚâź‚<ůŽ®Xóťţ8pć×φĽőhŔ±Gqż}|]yEŻ.˝őhóX|ňőĹ÷‹­e†’ĎüšKżśíâo?ňďćŇ˙äÉ?lÓÇĂkb˘ýź#h ŢŃ•Ťę"_ű·ř&€¶ď“mŔoź˙UĂď,5nţlU ĄĹGE±Ě7ÜĐđMäOIÚ•ĘŠÉźobk¶óWEŁ4»ő•ënK\á•ç+˛\1<ńŕ1­ő´BŔ†űĹUăHg‰U”]µdÓô¶÷`ô¶¤Ě˘iĄśĹű.LĘŇÔVŐ©ŔŚZť°2ě)>cÎú˘XÉ`ÉC=Ă+ú‡âŰżíPĄĆíún}p€_ vefĆđ,<ÓŠúM¨+){g» ĹÎţsĎBˇôČ(ŞˇťUo¦8× `óŰyé^=íĽÚö<łš“gŰłú’g­Ĺ›@D!07şű>hGU§µâŃ"^g˙łŰ3A·;8vVsĽź??Svfş3úxęÇ~ËýĐî÷ű$eë†ÝŚmÍ>ÓD}đŰçúĘĎ{ţ›ĺHbjqź„rgH`ůŁč>ä5ôëÄ}»9˙;®«oYőóĹ—§“mÂaĄWŰó|@$˛±W°ůâoͧŽEÚŰžú͇¶ĄjV´ĆđéŻ_ŢĆÔËŽ}©®ř}顤SZîkšSWŇú‹ť^]z{>ţÖŁM •Žü›5ůk_lw°šßWjÜqÓ»-> Ţ=—Ľąšöx†W Ă™…ŢëĆľžwĎ%fO5ÓQć›Čç&lÚÝÁűą ±ÉŘběŕŚĺM˙»K÷×uóń˛3šKGÍaĂÓő´ Ű&`ë&ĘFh»#Ć·ęF;í˘jżr/}vî^ŚÉCúŕöY~-Ö_QëéŚćáşÚçUÝúçQ@ž<‘ŨđEo śáâú]‘ĹŃů«sá€3Ü-3ÓÎĐl÷\8ŢçŠCËą‰üăS&Ő­@š]˝?h3šŮüU§8ˇ•¦ţ$ 9ÜÁ±‘Iy^TQWżŹ†#’őHr˙Äŕ6/¬‡ŁŤŻÇĐłe·uËńłSG7¦y@›MŘBé@44™€ÎäŇMż0ŮöôĹďOŔëŮUCýtö Od;™í~+kéT›Ś×łźľDˇEĄ­Úą—ţ̧§öCŐÇyo©‘WEąßP›{ńŹĆnv\_”úN„ÔĂ[=ŢQŰED´/6#.ń,s‹}â^Yi…1ép*ťşIS[†G#k癕W7§•vY©ÝhŞRłęü·VfsţżĎÖĹG?KsľřPjôÓ<4ٟۜ=ůJ©ýřÚRßlđúž×Ŕ[áÉ6t˙öA;ŠE#V¬F}C˝şh)>±+U"źŹCŤĽ­ŠšéĚj"Y¬dtô.d<Ă+ŰÁD‡úŕ' ęrĹŽD´ŻÔ{sé|.Ćk¬DM$űòl÷ŚÔI×Q˙F-ˇ‘3ÓǢ޷u‰Tg‚;wź:~aňmWüm­ýËĘîŕŻ#“oĎ#×~Zľ‰ŞV¬F}Ců&^Î>;ľzb^Yĺ>Ŕz€5ň*x†W Ăí:ŚŇŐV ִѡĐČdúU$ýŞD!ăKK±¦ĄĹnőęV,ŃS«÷¨b¨Áb•ł>Ś×–ęg›qvÚžşyk›µčhëí]¸Ă‹KuČ,ô^uDt^3}ôdxK¤©_xą‡¨Éüő/_5:j1L¦śÍ\5Q9™…ŢŽřF”žŘöĘ0zŻ#x.şuC.Ěřu‹ĹrO±EĽ× t=}·n%qCŢöŢě%qC.ĚřőŰĐ6Q±§şőb0Ł?őjß®‘q/zbŰwp]›BÓÉwp]ݢ2´§ş±J[żJ&Ńáw›¨Zr­Ń!Pëa2MDÔěŠ7H¤Ćs©áQ JQ(ĚHŤw„ÎÉ…ż’•©ńŽô… D‹ń±?É'ŢíB!3î®ÇÄ‹› ŁţwçL«Ü)ÓSŮ\fˇ·cž×f?Ĺ=@jÜ!Ť_Úöš[ —–ßúťX‚eôv˙ţ·F‡@­‡ÉtSăĹ&" SÓčńfô¨_ršůéIOěŽ_ßů§'¸uËqK}#ŁäĽňĺ©ŢžŻňÂ~oÉžęć<`OčajÔ[ €˙Ň éajĆŹ‡·n\š)Fĺy÷B’raĆ?3ĚÂMënj_ěężt7ĘxÍ-)o…­8&ÓÍ‹›Đ3_XńhsĎúĄé¤u–·Ž*Ó*¶ÉnUD6} Ć\Z|‘á R㇄ň¶ÝĚ4Q b2ÝĽx±‰ęmf5‘„ń¦ ˙Ą’ř>TµĹó4—®á+ł«_E×3łšHŢřb?™Ňn˙hěf‡„ض!—Î,ŚŻf†ý3…moďőź2^$ÓŔc»S©‡·z‚Ű$L-ţwÓR…­kĂڦůŇ""ŇżŁi<ĺţâśňözú\Źą«FV+Ą ţ™íŘÉQü’§ĘŰ«~•bĎŽĐ9Ů6űö‚=Z}†Öř.Ô(Á;Ăţá;ę‹;eýÚ)sKĄ­{†ż¸qKŞr§‰ög¦‰šÎJˇ`x?ŁÜ`Wě ˙Ňożş85îxř®%ľç şo ·}a\ĄÚžÖo OÍ…Üö¶í7í„y™›ękKĄ­›7CT‹”ü]ŁC3ň*„IDAT ú}üɵ˝Şď`2MDÔęRăIąuđ†\đ74ćÇxµްԢřĚ&ÓDD­­Ůćbý3ueôÖnk Ńŕ=KT&ÓÍ‹›Ştŕ—uL¦›/6UÄGqU&ľb°üĂňŞéł·[lě€DD{„Oó ":Ľ2 ˝ő=آ̊uŹIDtqfščđeÇ™…:W$"˘J83MDÔ„RăęCźÇS@fˇW÷™…ŢŢńń^ń^Y¦tSŰu-şYäâ8j«Ö˘}]ąÖłw!“Yčí]X7nűz(™ u!LŮďGďBƲéâČă)›­Ř…J¤·1ítyťŃÍšVZŹzť.odŁşŢŮÄ€Ëëtyť.ďŔŇ`3˘´LŻ+ťĘ´xť®ĐݬiPk]l—ćîĺb°Ŕf¤8N•Á—ÚcÓżb0G“i"˘¦łĐ+A.3ţÔxGčś\( ۱'’H6“OĽw ůĆ-é:Ä‹› ­˝ ™ÜÔxGú 1čv0q}!âČ…íĺë`ÉPú’:ŕÍ… <Ăwb==±íBae8c^FěÇʰǺimäżÍVěúÓAŞ+U fW¦LQźr©?6ąZ“ÉţüŢt>—Îçß Gîf±˝Šé|.˝5ű¬/ş Ř´†–sbĹŘ·aČý±őŢĆTE ĺÇĎ.…ś®«s†¶’ťK--Ś}˙ňă L¦‰šN±Qżú&óÓ“ĺ­'ěąő0ő Ć=Ţí…č¬}ó ˙Ň <ů)Ł4óÓÜ’´yčd:Łą$­¶ ý€ÖŔ4ÉPGGú ‘+[7­ŮşŰţÔÂ:Ł9‘AvfWóątţ^°ŮS/ßDÔ'^µź–l~;?ôˇÜôHO_dmZĘłďź] Ý>˝zčT1TŕŚĺO•ëM ”ťB6S©?ÉtË(^ń,^ňÔµ™®·–ąćJDGXOl» ±ý*đ˝Ü–¬ź®®uÓ*UCWo +9P '´Ćő¨Ť÷ŮU2ŘŚş2Ź©›7TevÓ¬öÓŻL-vÝ´ űć ŰŐö˘R”?,ŁçŹúÜß}ň=ůç(Ő"vżěřj˙ěRčsDď¶×Că•ďlXZE0ÖŃj ćpj…dZ˙‡Qű…ˇÚţ`*m˝a˙ŻdŇĘĄŘ‚|.t]dΉ úałLŻf űřŮŽ=ąÉ ŁD­*Đ\J}ăy÷\Ry›YM$o\ňW3Dęá-m–Ú2Ž®%±šQG®>>1U\)0ĎđŠ ©w!cłéňĘôĎ,ôr® !ÜÁűĘŐüŐŰäpänŮĄP߼:ÓśKßlďŠ,ŽęĄ˙‰®ňcnLźŻad1źK/Ź@JV3oL;ű㦶Dgµ=ĘĄ—Gy2¶dýq%žC'?_ÚÁĆtß<´­Ôn3r!Ů7Sý<ş2 Żfh' K/,ťwľűfMś.Żó¤,OžżśX/ö×R} ćńk îŕýb=†i©M0Ůrýk ćĐjť§yHS[÷‚îŤig˙äůčÉ|¤łĘőܱü`˝˝#‹ŐonżřgÔ/8ASs!͵G®z†g† 7ěgŇÉs—< ˘–4|'ÖŰápnČ…™míí ąŕGć§’k&CŽşŢ°Çđżn '¶˝2<#?tt8B@ĎŤö5ÓVžá/n8$Ç­žŘöŠ)0 ˙ŚüĐŃŃ }O '¶}§ü6,ˇVčO!»:^ł¶Ëá€3 ivµňôŞŃúŁ8€Ń‹ťş.a>>÷h3z±tĎĎD6Ů~%ÄĆ4ś=é´5ű}R8ĂjlĎwÖź·˘©:7ŘŚ¸ľ:ýŘR ś}ńŁt*TľE-ĚĐmk3ţŮŘż˝ë^úŠŇ’ÇźîÝc+Cu…ŐuKŰŻŘSĺh5sŘ´ÂĚ´žű”ŕé‹l×›”kCÚ#ńârh ÄŐźâ*Şlćé´ńč`Ü´2N‰xl®7YZj›;Ϭ& ŕ§'¦9'!ęEŇ“J…DÔÄ<Ă+ú‡âŰżX*ľľÄú˘Xˇë©ď¦•N˙ŚňnffE˙•(¦ő›PWZö3­®ö5ö,JŹŚRˇÚYőŃ"““ľÚü®{0–0$^Ëá@]7,î=m¦<źKżŃ\X61`Čb;?‰»¬ýěI·M °1­$Ů–ĺ3†lÔ®m1”ßÂÚY_]ÍPĺű×ĚáŐbÉ´8é”>zßmw˝©şK9ĆKBeWq{Î@ ¬5ŇÔ–¸—B\E*Źů˛”í¨¤Ć;Á;úďS ĄE%u±Ě÷żŃžyń\›“ŢŮ~Ş[ŕ›ČçŇnz+ˇë‹G›0ÎR€ńf>Ąç—blçnÔľŕSýÔţZ_«}ňt7€3†OŰj¦±˛ß'e¬Ť](N“uEŃďuşĽçĂg–#ť¬-pźú±ß+*%Ţ{`.t±é_–5†ňăg—BJ…†,ŰąÂR+k˙ZG8¤Z§ĚCž<‘Eq!Éz˝Éü§hËxI¨Â*ľ‰|ÎQź2#‡Îç‹ůˇâr·ç °&?ßÚKĆŁ»,•] YŻ@ą#U^lJŤ;nz·ĹäĚ»ç’7W3ĂĂĎđJa8łĐ{ÝŘ×óîąäĂ ŕ©f`":řM+´·ćŻ:Ĺ{ŇÔÖ˝ĹŃů«sá€3Ü-©‰łáOšÚŠtÍvĎ…ă}®80´\ľlÚ7±5űě|XŮŠ4»őřô¶Ó>ôŐžůpö«ŤŇÔ–]5|ůǧ.LöąâJPł«÷Ł·ż Śé>y«dW ŇÍĄŁ†–Ns‹;x?,=ŞĄż~Ĺ{ŐÄPn|KKg}xeBŐ‚)ßżÂέ“L‹šiőťv˝éţ`űz´xî>P˙żĎ&.LĘ%|SS˘Ťh“ŢŮ č{ű©ŚZ¬ĚCc{˝ÉöRNy5¬’ýY†2±­Ń&¶mă±^–‚ݨj.6eVÉbA´Łw!ă^Ů&:Ôç°BTPk¦!—Ęł‰hŹ´ÎĚ´QWÄćz“»öK9ĺW1Í1+3ĘŮ€ˇě$ę|6ńŘ\–ŠŘ\úSqz†W Ăí:Ńľů˝ŁŃTfw±©DŐ‘vmhçîĺŔ,ľgH[˝Óî’í*°tł0–ť”¬‚˛osŠ›ZMˇ€Öť™.a3RüJúîŰŹ«ą±´ŽUčpúë_ľjtÔbY2]ú&Ů=\…÷®Fr­Ń!Pë9dÉ4Qťv˙ţ·F‡@­‡ÉtSăĹ&"""˘fĆdşyńbQ“c2ÝĽx±‰¨Éµę—¶5“i""""˘:1™&""""Ş“i""""˘:ńÄć•’żktTżŹ?ąĆ[H‰=&ÓMŤOÇkQ|@8ŃÁ2˘=ćp8ÎLU«š˛ ç)ś™&""""Ş“i""""˘:1™&""""Ş“é‘Yču(z2z–ęˇ-*Ó‡Şö» ŤŽá@lL;]^gtSĽ[Źzť.odŁÖQ6#.ŻÓôs9‘Ýë`-Ră‰ŕvˇP( ňąt¦\_ĎđĘʰ§üxŐôˇĚ˙č~”B83]ŁÎh.ťĎĄ·f»Hł«ů\:/č>Mź{×#^řgfü€Ô¸:W=ľ°ĐŰ»°0îp8ĆSbÖ9łĐŰ;>®Îfʧd®‡’ÉP‡ĂŃ;>®öki} Sŕ•ćŔʍ|.]S;bL¦•Yjń3°´¨ÓŘŐN<ďÜ˝ěuşBwEżlb@¬%^XDZ ž] 7mĎéĆ-©đČ,ôJĹ\ua&$CéK…BAI´ ůÄ{GĚe߸%Ť§ŕľëé‰m +ŁęŞ˛Vˇ ߸us!ÔxGčśv;ÖSëŻňȰćÍ̤‰Ž¦ŁžLg—B}óęs.}°ŮÄ@\iy0yňóri.€ö+ź kcńMŮď“20ú™:]-Mm‰™l1NÍ+ü3…BˇP¸ôP™Cά&őëzôßč Ăr·çŚÇvp÷`LÉă+ňĎ ňŤ[Sőěe2éä>Ť|‰š™4ŃQvÔ“i÷`,˙`HĽ–ĂíEm®:źKç#ť•†é ÍvńoŁ_ŹÉf?í*Ű»ĆÁĚBŻVŕ‘ůéIŹ×ă šK•YG'őđ–6Kť,{÷˘˙ŇŤdbµ\2`&MDDtÄ™dş8y `óŰyçŹ}ů\:˙xJ Í"‡ż^Żex÷=07şű>0Ď1Ż?Š˝Ři;xĺšiO řDRn ěHď {ŕľÓÚĆWíÖJ†:Äb ˛xv‡gř‹·$‡Łw®T čź‘Ď)«u„8KMDDDTŢďŔéŚćáşÚ犺o?žč˛Kˇóá5Ą‹4µé:óŹO \T{Bš]­\ᎍLĘóŔȵ+ú§{Č“ç]“0˛ő°ţ§ĘÁ{†W Ăĺۆuí+@f=±mËóďü3…ÂLńíĘŠq-}ŹÔ¸ăỦՉHďč$Ó¶‹›Ü±ü ĄŁ;x?,3ÝZ;ŰO`ô˘±lCšÚ2=;Ďfp»$5în‰—7䂿ˇ±-ýËWŤjv¤’éý”ýaY¤©Żrß Í4×Č4uMDăăO®5:""Ş“é=bťo®4˝M-'%×ččĐÚýűßŐÉ4QUGŁC ""˘¦Ădş©±†˛y$îýąŃ!QÓa2ÝĽXCIDDDÔäL7/ÖP5ą#óĄ-DDDDD{ŤÉ4QťLŐ‰É4Qť~çźžKDDDDT«83MDDDDT7&ÓDDDDDub2MDDDDT'&ÓD‡Š_ú#żî‡¨Uđ–č`2MDDDDT'&ÓDDDDDub2MDDDDT'&ÓDDDDDuúý›¬ü׿|µWqµśú“éŹ?ඇqµśú“i>͇Ž8ÖLŐ‰É4QťLŐ©†šé”üÝţĹADDDDÔrŞM¦ÇľĆADDDDÔrŞM¦óąôľĆADDDDÔrX3MDDDDT§ßXľADDDDTPp€3ÓDDDDDu+Y3ý׿|uqµűdúăO®pDDDDD-Ç>™Ţýűß8""""˘–Ăši""""˘:1™&""""Ş“i""""˘:Ů×L§äď8""""˘¦őń'×lď*,ůh<>Đeź]2™źéADDDDTk¦‰ęÄdš¨NL¦‰ęT®fš¨'ţŰ˙Őč‚ĂáČçŇÚ[îő!fÚë2LŃ8ôĎ-°}p0÷úPŞé!Ń,ó """"Ş“i""""˘:ýÎQ¨}Ąlâ¸kúXÝŰÜ>áňžnęŰŽE˝'\Ţw6ę´~ Üô~;Ä»FDDDÔHŔQ@Í3ÓŮÄq—÷xügH§Ú˘Ţ"Ąɱös9ql)tÂĺ=ľ´ł·1·íϰÍďČî8Q“«ńDwđe.ض:>oű,˝Ń-YÜŤtŞo‚Ż÷(@ť×±Ý}¶ůŮ'"""jrőĚLżóüĚkięő#ufÚJ_Čˇź·ľśh3vu'\Ţ·çmÍÓ±Ú°âĹĺĐqŰał‰ă˘qcÚfî\íl»iĂ¦Ş¶ľÄĎ;†_]±HCk|ó]#"""˘˝Sc2íľĚĄ_ť‚üóëHz77ńJ[4Ő&ýÍ&Ž÷Ç_Ď®îćŇ»† OľcLŽßžFwséŽ(mmKˇ·çˇ¬’Kżl/MĎ?ÄŠňälĘ‚“ďôÇKĆ`·iÓnîćŇ»ąŐ_%´…#ČV7ěĆPÎ> KDDDDµ©ë9ÓîŕËśĄQ_桦¶mß'Ű„'ÂjËóx”×ÇĹüv±máŔ‰0^Ď®–K¦Ďž|]fä3żćbŻ€¶Ą5†cĎKnZéł:^«uX ˝úÎc(iź†%""jnN—·ĘďŃ VqţMâK[Ě9ńFŞ\çÁŘ®gúD"Ą~®/Ĺ®…tę_Ąc8-·ŞČ¤Ĺ*ǢĆb‰˛Ăîa ĺěÓ°DDDÍĘéňŔż·pîŐş‘ď“Cđo*ěďs¦_{Îh m[ZýŻÓÝÚ2–ęßÄn.˝űxęőľĹPrÓ€ß?×ć¤wÚžÖ0ěžĹđôE›MkýĂňy DDÔşś./ţ ü;đďhѬËéň´ôQm? Ś ÓN—×i|ZńÁŘ÷Óܵ}ţŇßÄîă©×żmwCáëÁčŻÚÂý­r"í;áňž¸0Ů&M˝¬oZşR ¶›ÖĽŠ,ţ&ćĹ]‘·ęÚµúcđ}ú«ȓǫą}°ö]#""j-JÖő˙”Ďş6#jnętMŻ‹6]:•] ,‘I[[ Ŕcc†m¤ß©Ć¤Ľű¤şSő_ĐĺŤ4÷7fěE™‡ob77Q˛Ĺ|™ W(.ýĺ^úóhĄW¶SáU$ý*běfݢM v›.ęü‡Í?mUĂÖ®¤Ý.°âŽ×ąke~«DDDÍŞęLúꆖs]ŘŚ¸®öą°ś›čŇ–gź‡× th¤ŕpyĹ ˙Q®ŻŘ©îŰŹcWÜŰ©6“ÖĹĹ‹ą/!_°i ü:q"""jFUf]ŮĄŻćiöÓ.č ÍvńŰĹËĹ/îŽOĘŔčFfŇúĽYźI_€ý®©;5dŇŮÄ€n®z@죾˝R]N(O S§u‹ŤÖ–W}&Ťlâö< ŤJ€śü.«4ęĘ^Ř6*^Ü˝ěuşBwő«ďőľ3™n Ż"éÝ\úľFÇADDÔŞĎş^<_đžGąßí9@~®&Óó“c20˛m܇l>—ľ fĎúzŹR™4,;ĄpďçŇů\:ź[˝-AGîłÂž?ĺŇË#€<Ű6¦ťýqHS[˘óY ›čŹKł«ů\:˙`ňäç~'U ™4ý>)ŇGź†>ęÖ–ż×E+MmĺŇ[łÝ†˝°mÄÉ+ź kcńMmĚŃĎöx’›É45í†<%ëÚCó©†TKkôů4€˙(›I—ˇĆdコ'ő ˘(PłĆö+‘ ľOĘ€8]^gúóŤýTďżéÎw߬Ý}´»?č‘ů›LÓÉ泦RŤ>˙(Ä˙b̡÷ú´ŠÉ45ž’lýYwC^uS'OwřQ}ŚU6ó €tZťÓY\ďk‚řţoă‹2Źň0í”] ť݉Ůĺĺşľ—M™™?oţڇJęţ7ĹĆ×c2€µ± ^ç…IęŚ{=”ĘźoŁ_ŹÉZ9Đ^b2MDDDM¦ębîÁkŁ€ţz6cá5`hL÷ ]‘ĹQóWřPí˙ˇ«÷(č&nMÔťŇr(µ€ťíŹîş.űRďÜŤ& ¦l•ßR#Ôňo*fÖµÔk¶ŔÜŁMkźQă·ÔŮ6Šąíąů¸ę~ă=1c2MDDDŤ—ĎĄń? öŹÎhnqń>—×Y|¬‡ˇCHdcý x4žH—M7jőĄźŽ'vjměBńŃxâ¬@ś®Črů­ú&DaôyQňđMäOIĘoIw˙â~Ş÷ßtóŰyč_‘ kuäÉó.o߼±޶QY?8&&ňG®íÇŁQâ‰jPő¦Ş3šK›żŘ7‘W¤ëŚĺńXý¦őŹďpşĽŹŐöŇĹÓ6;eł›îânvEŇyíyÁşÝW{ď[žVlîłjř7µě¸y6q€4µuĎrˇ©Ń°űĘDľiĆzŻ0™&""˘VŞň¸ľ+1źK;ěňf‘Ok}¬+ÚîT3ěŃÁ(ůoúxŞžá˛?,Ë€4Úź'ş0™&""˘¦ ¤˙^Ű´t“§Ąňćňa7ůNUoĎ˙M-“ë¶3î5vx3L¦‰¨YÜëФ’Â!ŰťZĘSEŕ DDDÔTgÖu´îS&ÓDDDDDub2MDDDDT'&ÓDDDDDub2MDDDDT'&ÓDDDDDuâŁńh¤äďBp݉É4˝)‡ĂŃč€{M`2MDDDoîp?H¸î55ÓDDDDDuc2MDDDDT'&ÓDDDDDu*Y3ý׿|uqµűdúăO®pDDDDD-Ç>™Ţýűß8""""˘–Ăši""""˘:1™&""""Ş“i""""˘:9đný˙ýčxű÷˙ýßţçţż…ßŢŮ“q_˝:¶'ă5—˙őźxů/_ŕ—üďńzűďţĎ˙˝ Ŕš­˝ú řćŰ»ć‹hĎ~ŮŘ»˝sě]L…=ŠiCÚ«_SaŹBrěá˙”{ř[Ú#Íř×d˙ ˙Ýšó_nŹĆá®m{ů—»gş{4ÎáVÚ€˙Âý~Ź˙úOüŻ4:&""""˘Öó˙ ÷9™‘ä™IEND®B`‚fox1.6-1.6.57/doc/screenshots/iims3_small.png000066400000000000000000000567041326741342000207000ustar00rootroot00000000000000‰PNG  IHDR9ÍĂ•J IDATxśěťw|eţÇß[˛»)¤÷Mď $@B± ę©çéťwżkzŢYĎŠgA,¨A!é-@hĐŇ{ŮH˛Iv“-ż?6"-`Ęn÷ë•×ffž™ůÎóě|÷™™ĎóŃĚ6~ ~’‡~Ř)ÄXŰHĘDH$"ô0 FF`hťa4‚QD‹ÎŃŤZ~ňZŢ©C6~1Ó±Čd`mVR‰[·č[˙„|sŔh‘ŚdzAözDz#Ł ĐÔŘL~™†xy5ŇĚr;5#nVńXŚ‘=űv“- %´4›˛¤^hY@řÁ7Śşr¸#HM?‡  k˝Á´LŻÇ`Łgm…‡Źd!F'‘ŚAÁrÂä›y"QGXÍbSc xş‰™>XA‚ŹŚě#Á×AL¤Sëelëß˝Ś ’´›wŁżx˙KĺGő—á(ľzą„w†HojŰ—˙ņȞ C~Ů>ď¬ ÖKLB„Śűú[µ›´í7' Ó+p“ÝÚ>…?áOřëÂ?=Đ Ł0âęd `ŔŃŢ ŁAʵ b¤Hě@"‘„@·Pň ňŃëZ®$ â˘ĺh¶măH•ýâ}řăd+Žl( ąĹŔüŮŢ<ú•âz1\2© ö&˙¤–ŘŃ.¤žhĆŐKŠ+FÎÖC‚‡%âý$śĚi!:RĆďĂK¸'ŰŤ„DO»äň§W†Ř´+WŚ„?óŹd=žJ?’ĽEě-4-GodűI±Áô21¨őč$"<Eä_€Ş2•Z;¨–Ő©ÍĚđŐ2:ZLţg–r™ż’ąwůpŁ/Ýa…—Ud¸ńŇ0#‘u<ą”r*qF@IO €h1îÇőĐ˘Ł©Üݬ FĄŞo-g" R¬ěŔJŽ®ľ™\ŠťLÂ}ľů|T›A‹}, fh‚ {Ź{đ§Ŕ,Že+ŃI$xęZ¨)(˘¤ÂěPú»Ń§ŞžqS]QÖ1ő!2óůď^[޸_Ěú|'ţ>BGć±l˘=JĄŹHÔ6JÉ(Żĺő»ä¬/¶•Ű[ă Ö.lnńáÍÇ@á¦%§BÄ0˙f2Ź‘éŔű©ÎÉ$!‰ŁŮŕ˝E؆€Z Öž 7ě ASkh ŐPę7?ʍęÉS;TAůI9yM®DFRuZD@\IÖŤdg(zŞ9/qńL@ŕ¶GA¬±tF4ö}¤č› čőS”ÉAjd ‘“Ł‚ü#űvłci-}$ ·í˝ uE`d€ł#ó›@/§ĹŃž P/rę ¤´môHęZřhů~wż?C›¤”˘eP¤5§‹ą w$WçĆŁâfW Ö¶ a´uŁTâĐ®\˝łHŔÁ*ŞÓiŃą’“QC±Ä˝#;rŻÂŕč Ͱ‘N‚ŃŃj+ŔÁŞkę0ÚxH‹XÝ€ÁĹqyĎP× Tç#nŇ`PFsmŘőą˛ ŞĘť—bPC]ëňĆ:°±u"ŤŁŤ¤ö@4vöĐXmŠŰÉZęÁÁQU."­ â •<#A_‡¸˛ÄôżX‹¸$Ł'Ć>N=Öžm'—y üĐ­ŞŹInů„ę3A,ŁŚ:0Đéas}gS31°ŔHHËA.©¤€ˇőćቒ9 $9F@g˝/…†8»rD˘Ö¤U/§ŐIŘ•çLsÎq¤b+÷«@d4eC1€ä’ÚÎI7'ĐłŤ´izˇ Ě ŁÁ$sSÎ0€ŤLĎ„¨*Öe6#•yJYô§ku„äf>í üšëźN«5H/N”–©°¶±íňş'S>kKrÖ6¶m3,™óµ m˙K˝P"•#_1»[Ůąs'#F ëń8.ŇŇÜ`őbn±t&:ť©Ô 4‰ťLKsĂŤ tWś)b±ô†ŤRRRFÚácL™<±K‚:uúÆ%˘×i»dű7ËŇĺkőđtłÇśbéLľ[˛ś'ć>Ń+ÂwK–óج{:ŚŰ–›ę”””‘zđ M:†ʲ•)(d0uJç';ŁÁ|t+--úëĆŁV7’~"ťÎôčMĄRáďďĚ „¸nŹĹRŃjŻž´Ąĺłęo®ą^lS /Ü÷TW…Ő)\ëŘşiGžź~4˙[”J?lmmŃ%xząR^QŽż¬\ł…Lş÷®.¸DÝČgégůěÄŮö ”JľMŚaŠ{÷ wó T„†…·MďŰż++˙nŹŁ·q(í(ë~JAV}ĺ˝búőíGN^ND&`9č;Ö“+ݍdČĐáôíŰ1bNfś$'7‡°°0dV2Ľ<”¤¤¤tK’{É+€uŤb¸ăNÓ¨{{8pĐôŮhµZT*UŰ´\.ďö’Źś 9§€uÇ2 ®ľm~‚‡+ ž®ĽůÔŁÝÓoĺ§ă§©=ţŞËšsr>}:ß˙}7G%`it(ÉeggógŐLS%‘äCß~}‰îMA~ű÷íG*mż™CűvQ­łaÂČ„. zAU5ŰŁ"Ńćä298ąuµ¦WWŠîéɩՍ>z‚°jjÎ#“]ş$Q©TyŢÔö?É Ń·Ďă›wARĚlJřő¦D—VTHZúYüř3Ó§Ý{Íő« sh°őÂßĹć†űJݵ•ĐřQ¸ÚvíĂŹ$__´uőlzbîËTŔ¸üÇ>[Сm•äťç”Ý˙$Đłtř[ę!sć\ą?™v[ Űq‚ˇ^8vřÚ-^î^mĺte'xýŰÍĽů·gŘľńgÎäWâĹÖĄ(<­î-CgçKnnîAdîNĄ˙]3›ŕÓá ż2QŐŐ\Nqe%¸ąBÝđ 4¨<Ă쯳蟳Hݵ[ďp\¤Ť¤ť«ÄĎ*´r¬ öńc–ˇ!F¦ ‰ĺti#1~öś8WDTÂëžěju#ĹĄµ”—ťGŻ/Ä?0ÔÔT&Śź@VvVű*Ď0âą/őqĺ÷ÓGµŰ˙‹sâ9q®’7¬äá»gpç1¬ß´—ŘaŁ(<ľżhbB};\7śĘ0ý]Ö›PUÖ·Ĺrç˙}G‚‡ qI‘řEÄQzîâŞ\*• D)]I˛áď˙ü’a“î"ÖŻO»şńń°aŢWŰIĘ)gJR'2Ë Fa«@ŁŐˇąP‡NĄe$ äŮ93ăD"‡Ť¦đÔI† O$íĐQ•$Ewčľ®5őŘ›››ŰÍ߸i#čumÓ%G62ćŹK8¸u!ű7íÄ1(ۆ2r/€®ä iuö<|ß˝ä¦ĹĎĎ—Â¢ĹřĘ^!.6‘aĂŮ»ç±I¨.,˘˘Şš!Cqş I]1z{luŤ(ť ěř÷Y ką©źâÂv<(›ÉZçxf÷á|íyěĐé.}Ѥ^1Ľó»FţöÚű84«¸÷ˇYTäf<ô^¤‡–óĺq#c#łČŐm`}µ‚?ßD‚ss#ĂŢžfyI>JŽVV^µ'W›µ‹uőT­ű« ożń&żü˛ž­É[ąűž;‰Źc˙®%śM?ĚČ`gţ»É@T_Ž$ďäĺą×~˘V7’ź_HHXőuőĽ˙Á&úGK¨®Ş.Ţh¶ľb˝A 1˛é˛ýż7ďSŢ~ăM~ÜđyGWđö‘=X9yS˛n%›ÖoáŮ—^'ć¦jçĆ(ĂúçRÂ/űÓ±ËČĄ Xͱ®|ńţ<>_ň-µEű±ŤŠeĘDžyńŹíë&[‹»Ż'2N“•qXWgqpGUŮ@Ćž,žxl4™ČkďlőUĽţÖ«Ľđäăü罏ą đÇą6™¤yź^7΢˘"T•çŮ´9U«ŠŻZfÜťvÜs÷Hľ[–Lb¨ ëwěc˙B4»vă˘Ó7Ęžý9j´şjţýÚËüů_óí'3#µC1Ž áóĄ+HMÝ…ł_U;¶°uÍśÎëoî ¬o?ví?MxT ęÓÇ™0÷÷„vrŁ Ü2Jr>>>Ř9q$r!jç™móťśĐ¶hŃ6k©ąP@ĽűůRDóěôçŮ{ě‘#ÇŁpóÄ#nˇĄÍ uc㆝(lÝůÝś vęa\Ön$éPÍ“&‘q×x´Úfđńnß““÷A)QsşÖ/I6‘C†ă`l"yó>´5ŐDőŹ#$ş/Y»ł‰éß?[1UµLá Ôj쮇§§+'ż‘•OjękÔŐIč˝+My¦LžČďfŽă»Ď?i·˙‘#†‘ĽyqńëÓ„]@Gž#i`$JG;tMÍ×Ůđ-ĐZ7ŐÖĚ/ˇ7˘r2qôqćŻĎ‡q,5ť¸©Ă Ţş”äm3$±}ÝÔiđtm‹=.’FvnÚνsîăÔ‰ÓDF„ăé„‹Ľw”ľţČŁňŃČxxz4GŹśŕIă9QÖŚuýŤÎťý źĚŤÄÄ,¦Oż˛7«Őơ®wĽ8…cP gŤá‹ĺ›©Č=˸űF’˝s+Ą-ľLżŁ/çTő(˝˝8ş#GC}‡c”»¸2áîqDG‡’v(ŹAýÂAďĘäĂ8ôĘ<žv7-uMEGSÝGARBř± ôŇŽ¸[üĺ…'ůěËĄĚJNQ9Í9ŕO‹®…ôôtäV"ľ˙.A‘q,úú’tbŠßĺ—$6 r0ý7á&5vű÷fŰäř?ąąSżj%î“&“aogęÁ]Ö“+©—áŹÄhä…§ŻĽźs‘Čľ·.ń8uÖýîny˙5Űw$`—‘AS°S&?ÔV¶¤^B­Žäu)<öôn¸˙ĸXâú÷ďp< žn¤]c™»\Ž»›{[, ¦'ż~á±$)˝`tâë<úÜĹz»rŮEN§Ŕ#$‰;űr÷č1í–Ĺ^śÚ÷Šő†0âÚÓŠ••ŰPl¬‡P_'»ârµ±©›¶łowÖď8IB˙’†ÜA\t0'ÂCŠŤF Ś˝ÖŽnăđ1[§aĐŔÁÄ´®ňć[/đűçćftŃ}h[§C=9ĄŇ‹É÷Ś!yÝf4Í:ţsÁÁÁ,[ľŚ°Býş:N† ‰GµđS’™M»˙»îâ•”'í8€ęÎЧŹ--z”J/”JŻoô7đę yěÝí@u•޻à cěQTźŹŠŮ—şžżm±tu<[ćĚ$+[Ĺ–_¶‚ß%ůJżľýpwwGémęńtf,Q ‰DuĘ–®ŤŻŻ/ăÇß‹L&k›'“›ţź?>EEEmóŻ&Nʉ˝ő‡9˝ß“”Ç „8Ą%yÝf–-]ĆĚîcü¸Q]~_NżÖęîÚfÔ®.|ßÜĚčş:fZŰ®3beŐ˝NŤ†'Ź0uĘx>ű|)^^ŢDFőA®(fóÖ•Ü5vF·ŐOh;Jĺ4t-í/íí-{¨TuU5v}ěÚ¤9őőőôéÓk¦=ŃńŰ·'7­¸ěz‚đđHâKËP%ĆănoMRýěŃNbűîK´çΞb×®]čő-üá÷Źđđ÷’˛i§2´Ô×5sß”îKp±±–]홇ŢkŃvx˙U—‰h±ř.Đől&K¶pľ¶'[¬d¶=>~đô™łôď?°Gc¸śü‚"üoBĆŃ…S,ťIn^>!ÁÁzáµÜĽ|‚z:ŚŰ‚ť;w2tHB[>sś~ó=ąî *2˘Çíĺ(˝śÍ&sŠĄ3ńUşˇŐÔőt]‚ŻŇ­W¶™9ręô)†i˙đGz­ů•UŐH­„KóÇĘJ‚ťÍŐóŐ5{rR+…`˘) `\n’ůk„—8Í-şčQ„6˛,„$gf44 ŢcćŽĐF–…äz5fůtőFh4ęę,˙IśŁ“32+‹l‚ëR[[Ű+Üp=<˝zŤ óĺ~‡=EOŐ§EžauuuřDXü{T•*dŮ×Ĺ€”°¨=ĆMѬmăzĹŠeÜ_`Ż‘~ŘôqÇÇ·ű¬QĚ©>-ö Óë´˝ć x[ SSvĽś0}ş]ß饻i¬oßÓ9‘~”űď›ÜCŃX>ćTźť—ä´uČ–$cŤDwN ’”•D®ŚÖ´LLęřţš ygŢ|B](>ULü Î76Ł©jŔĘÉ ×@jrĎ!‘čđV†’Y]IX`Ăă»zHyRWŚâăµü}iž5Ş—6bč¨éć-¶ˇŐ‚e´<óP»yňO°|çi<±1*°˛*f˙‘z&ŽŤ eëY&Nľ‡ŞěT|űŹ& 5áťI]EĆyh¨$>)Ž’˘<¤H öräxQ‘ÎŘ%H˝|±ëäźç’’2^zĺM¦Lúí/fҨÎń—O¶đż×˙Đv’­^°ŚQŹŢEIi#1ˇľ¬_˛‚¤I^ĽŽ„QŁ®mŽZWĚü­ąü~ęŐť[T)|yv_ľőCžü”~n—Ę}ţöËŚ|p&y9:tŐeÄ‹ĺěń=$ŚŔî”팾oR§Őkg×çoˇóľ* 5H·îÄ łAĽq)˛ô´ă† ͡} 5FWdv˘;Ń–´ĽôoÄ٧=lo[Ž Ńc÷FlŚdĂO\iNËŁíßU ;—ä@‹¦…?kRĘ <9u Öţ€łĎ@ĆŹräż]ÇĂ›ŔŃŚŇN;\łD[Źôd:uЧ·Ł‹ GVvCf ";-Fi#ÍsźÁú­7hyüYÄßţ.6č§ŚE\,Eű@d[ĘÖ­ĄĹµěű!)UaôńFĽ+|ť1( E‡ÁÇé ¨` p@dtnűˇ:ť–ËÔGfâˇÍfĺöóŘi+ÁáťëťĚá­? ŻłĂĆŁŞ-ÉEĆÄr臓Xňůŕă\†Ä)AnÍáűK\iÝÉ©9S;X›RéĹ”IIţ)…)“'’q*ă7m/yůJ¨Ż'5í o}ľ'°Í/D`ĂŹJާ+ü°h5Rk[ć-^Śćd>®^vÄŚŠŁ0݆»·óŹ˙~Ähď&ŇΠQťăʬBj%â®W>\Ľ'̉Üó(•L›ú .ôwi@]^†~ăJ¬&L"ÜÍ$’őë?ŚŇôěßÓČ3šČ˙ó˙zýŢüűGôâͱ“Ĺ ŹíGăήĎßBç=]•Čiypĺ¶hźžÁ^†nÖýhď AZî„Áۆ–ˇi ‘Ń·:ťě@uq3Fę@n‡!Ę}X˘ó5|#Đ>2ĺWűłÁĂĹg[Jr*đ rćD^%ţ¶l\—‚wżČĹy¬^łź9˙Âţ}ǰUȮڻ—aŠ@óöK ·C7}´ifP(FGz¬¶l¦%.qMDDóá_żů1ÍßŮ® Ťz5’Ě2Óú:-(ZŐäRQ»ýéfMÂŕwĺ›ÉMĘĆ%‹Ůtŕ,!ÁľxúS•ßřˇ¦ĎP8I‰«XžĽаqÍ~Üť°rt!v@áˇDř0 :·†&őýŤßAq«L™<‘E__ß­¸Łl>˨ř`~X’ŚGp$Ö†:ü/Ö“Üž)“Ç’xçDv˙´‰)ŁMvP.‘ątGĄ#µqfP¤;™ŢJW’yŠÔ“ąmŰßş/Ť_'Ş4ČĄĐëqńŤŕůG¦€®ĺŞ1yzz20*‰ř;úłĺ§cŚ›yöŽLś0±Î_Ç«®w«tf}ţDŠÉEƲ« Đż8mލT*”>–SřjuÜíő®«C¶d ÍŹO»ębŃľ-ÝâĐűŐꣴ<4<_Ű@`pżŽí^]‰Zę†cFj.ˇQřv¨ěÍ’yú`»é/.âŐ˙ĽzŐď9ź×BÝD·>x¸™úě .¶É— ńԳ̀ţŤ°¶¶ĄŞşÚâ+¬­ÍŕD‘Ú_3Á‡Žăb-w$Á™V‚⢼›BŤşŁEëó:^¶‘šz ÝĽţ=c'ÖU455Üd›Ü:ćVźzą´ąŃ§Ź$kâähYíęKÄUnú[ú•Âĺ¸9w_›[}ZdON›7‚ŘüčŘÚÚ¶Wv ,ň «««#,jpO‡qSčZ4í.ŻwďŢ•ÜV› ć$^í ®&ľüµZ ›6mćÎŃ7!ă˛,ńjŐ"Ń6ŐŃXŻjű;z$µ§Cę^tjĘ*Ő—>ÍŚËۦ±^ʼnôŁ=R—ÓXŻbĆŚ,[ş˛âlŠ‹Żţn[K§Ó»˛ůź‚Ěž–‰S0*íŻ[V”¶1AmR’›+§céÂo0Úşcë¨`ęťĂxő•Opó’âćNÁąCÜ=k&)ÉiTUd3ýŃ'q®ĚgGqúj-rŠË°őěŻWŤş¤Ť'H=ÖÂÁě?XApP(ŹĚß µb⥽AIi9JoOüý»ć ëVkWŘš–±ăŔ¶Í›‘‚â hćNÄŔf"^ť÷Úë„% @"•±÷Tm(ĐË5f vęľ_{ř1#yĄtÇD=ß,ŘÉśgî˝bI~Ć/dÔrĎŽOgHR<ŞJµµµ]{P=H§'9iN)Ť˙7ëů ťNGä^rl´Ü3 ĹGóÚ„¨F?GD°úúŕUĹżFÉyôF †$ĺEHÎčiľ(Öcë’Ŕ}÷Ĺ’˛qHíHKYöI[6Đ$|ŚŚť ^ÄE ń”`W]AáůÜ=°¶µˇ˛¸–¸±ÁÚŚLîT˘°ł˝Łcçꆞ}z.Ź?ńoľö6nîÔm_Dtx?Ť=Ʀrä+·˘K‚¸ş––Ĭda´!®*1ŐëŔhÄ%çÁŻőÝŞ— ş1pωW+Őĺd-_ͬ矣¤QĹ»vđÉĽŹřú‹ĎIšő.‘’žţŰH­D¨âZ‡JHUm5Aˇřé« '?Ň& ät QZ~eë ŮOžÎ˝j,˝ńŤßc~“¨«‘­ÜFËĐżńę‘ěÝÖNÚ|˙Ó˘k‰m1řŰ`ô¸Ę/–"kQK–'ŁQW˛sĎОĘpňômŽ®&ᣍ«žžž”•W@“ž~ÁH;7žýĂl˛Žś@iëHdâ(<ÝěĐh$Ü;óqĽD5¨;ŃQ©ôbËĆŐ]ú/ýč1čEk/ ŻMk˝Šk5Ą¨ĚÂ*%U›‰x…+î6rsł))("ÔŃ…ďפPR«eĐŕá¬_˛”´3mĹôj޶¶UT˙Hô"Ü®.|ĎĎ+Ą˘"___ĆŚŚŁ˝†%ĹvˡőÝ"¶úv-Ź?tă‚DĄRY܇Ң,Ôő5mÓ+V®aÖ¬Y=/ľ‚¸÷Š3ODŁŐ +¨­­eoęqtzEřŰčq1pg&80=ęî.acg±jŐÚvÓ}ě]ĚC |1pďŕ×bŕ«sRRbw‡Ő-X¤~Áµ<–ú y+b`óă×bŕksoÄ"“ś9{«p˛3č-b`č=‚mÁŘÂ01°Ą].w'–(ľy9˝B°};; b`NÇśÄŐť:@_t|ňťĹD•dö4?ô0F9˛×ţ†î‰cđ¶Áę­çĐ?ů)†ŠËD¨×E‹Ő§_b÷ ú0×vK. 3Č(kŔľáÔ–v× †‡ş’.Ťźöť#ÎŰŽŚ2O_ÇĄŁ§Yúů‡ÄN|Ś­Kňŕ_ţŠ»t Őśnuź“#íŘgÂá÷q:í+6î`Â}3HŠîĽŕnȦĺK8TÚČcłgáďŇqůĚŐś»sWwj?ܨtGÜXřĚqô~ŢjµkŽ"®1"[µ cŮnDĺeV|¨ę<¸yŁň$†!XKG—4 éŽÍh^|ĹĽOŃü÷#ôýŔşqu#âĹ‹Ű9_68€’]»p¶ŽÁXa:0;7üÝěĐŞ%ŚR:áŢľ§kpUřç«äěy5#žĢÇW2űŰK)‡PGvďIĄ¬TKż{§S˛ëLgVQ§sâL%ő˛…śÍ-"÷Tżí î™ń;¦˘–6GZi¸K>ýš—@<$çq4j9÷>xËT~ŶĂř8·Ü@P˙‘äÝÄôŢţf1q ‰TŻř‘—:ţňćR¤uą4×V`°UĐŻo8ëÖď$*iŃ}cyäf,ěnČđ!al_WHőˇ5<÷U ±gŔ™íáŹ[CÍčq÷ĆĘ>~ş®3pwbNâęN˝\ĺf#.(ąÚ7ßÂŕgo&? ńÁZKEšV*‚ă•&á긡č#ýžR™>ť´Od#>{öŠý]6îŮÇ0ÄV'xy“şó:u%3ó%V IDATŮYYŘ{[qJŻ'wÓŞh`ßú}T×ć‘’–…rP¶,ÜĆÝŻŹcËÂm¶#5µGźxžé÷ŢIęţ8tň¨‡®ŕŃ9%Ě]Î]›‰Ś‹Ą¦ĆôP¦ť#­NwÉ9ÖĆ‘(¶mąTţbŮKŘ2÷é9řŮ_•ÚzÇâPž‚W⤀="©”„ˇą˙j˘cNC $ ťČ„01… Î(Z´Ł˘\‰ Łá|Í ť»sW‹l&K,ĐŘ<ŘYwţvÍąŢ~\ü w<0‡ŤË–1íń‡¸ZáfÄŔćN^N†Ů ¶;‚ŕ laX˘¸·0íŃ9<ŇÉo®ĺ¶vî±=˙}š€ŔÍ!8[‚X@ŕćÄŔ† ¸9ş[ ükŠ‹ňJ‚X@@@ łéÔ$—{|/ýď{>úč|Ľŕ jMăç˝ö7N–6&‘bF%¨2Rxăë”lµžŐK~ä»U›:3TnaOĘJÖoÜÎÂkxéµw8yâ8ź}ş„Cg2Yńé'ěɬ yíj’ץPŐpÉŔ° ëÇvmgkÚ%[ňŮ/ţłí˙CŰćăĎżáÇ˝żÖrÖóÍ‚ź»ô¸,‰N˝\ RşSŇXHÉ™ăxřyS]«Ĺ±ć(ą5F–ŻÚÄ÷e»Q——ѸâCĘ«ÎcçćÍĚ)O70„=Ç҉JĆŃ›yńĹç7ďSţńߏÝ?€‘ĂÂůÓkhiRńÄeb`s§0űĺF*Dn¨.ÔrhÓb’f˝K¬—”Ňý?SXmúńĎ<Ľź\Ť=§ŹEć5j1 ŤZD:Y[“OŮ$šĆ üńwsxá˝o(ÍË$·TCUÝ6¶ţĽ©•›Ş âű˛ů§ăWuľéÜž\«“©NîŔ+oľEśź=?,I&,~Yw i)j4ä­b`—Č ŹW’0t"ŚĘ H?öśR1(ŇŹť‡Î‚¶ŠISž&:n˝ăĺp·îNvhjË()(Ä#d ë—,ĺĐ™LNźČ&łUäž4z Ž"Âűr¶Ţ•ł©gbor_N«»ˇŐä%aÂ,ţ9űÎKËĺv<öÄC×tľégŕÎF›7‚Řüčn1đŻ).ĘĂÉÁVwA , pst§řZűď©‹Lr‚>M@ŕćčN1đŐ°łîş^ÜŤ°Č$gbŕΠ·¸Î ?‚ŘÂ01đ͢kŃ`¸¬wďޕܶW¸Î ?‚X ËŃ6ŐµsJ=z$µ§C¸-řŐ«‚o Ńľ-H/ôÁ -Fl7€–ˇˇW/¨;Źâ…÷ĐĽűŘ^ęÁŇv#&}‚ĎMěUÇŇ…ß`´ugTR89ez”vjŞŐ-Ř9ąRYŹ[P?ÎçĂ5$ }Ů)Î+<Űsľg/ýë JJËQz{âď3Ç*`©ěIYI­Č•ňÚ äef1sĘ]ěŮ}’ř1±>‹ZaÇcÓÇ“Ľv5­6v®­çFAÖ)jJ+¨¶ clëą1űŲhŢ[€I | łď~ILvů÷şžoědÎ3÷v÷áš%ť“äŠr‘ĐKó{ş"^ó üˇ!˝Q}1x»#ÉČG\ĄÇjŐ×Č—í@;w4â{ŚŞ ÄşHäËOŃâZöýžÖˇ·ĎB–^‚vܤY2ô‰ö4_kбuIŕľűbY»ęGäͰW&A®×ˇ(8ŠŃ~4Ą[7ٰµ!­hv1`Wô\’{öéą<ţÄsĽůÚKlظąÇâč>®'RůÓkxlúxA Ü…tÚĺŞnÄtC‚ę,âgŚÔŤ#PŘ 9”n‚‘LCç넨ő•ˇUđhÔ«‘d–™¶7k`‹öé9ěečfMÂxůX‹˛X˛<7'*ą-ýC‰%ŔGIFÚN<úEÓlÔŕ‰^—EvŮůÎ:Ü[B©ôbËĆŐ(•^=‡@÷rU1pú‘6‘»A Ü•ôNg`ťš˛óŕĺf×nvYY9^^ž]ÝŐ)-ĘB]_Ó6˝bĺfÍšŐ+„¦żF›‚ŘÂ訸¸¨ň*ózFąjŐÚvÓ}ě]°¶¶¬ĄĂ{ŹUoi#A laX˘řńG§÷t݆“ŁĺµOoç¶o\ĆěÄŔćMmm-Z­¶K÷ááişŻ)•^ű¦zaa>^ž=ôâQ3ă¶[b’ÄŔćŤ)aQşlű…Ąpý÷üĽ~O=1»Ëâ°$1p/˘¬¬Ľ§C¸*‚¸ë())ăÝ÷>ć›o—öt(–ŤNMYĄş§Łčtz¶ˇ­â•·Wňç'Ç1˙§Łüóém‹T)|y^ž;h/‚ !›WßßHHľž:S¦§±ü0Ĺ>ÉĎĎ#>iŮ'÷ęË×)Eüűůž˝/Öbŕsű¶zˇáŇbŞípO«0űhz:qýűP¶›L‚Ú¦óçJPżÁL™pőŤÖóŇ‚źńsvç±'ďo}תůN·ü˛ť  0š››xé_o0yŇD%ôĚ+đ~-Đ-Č:…­wx›Ŕ÷F\[<<‚AANĚ_’LPhäµŰŞ•/ßzŽ!O~JżË®ÖuęJľZł‹ľöz72Đdž#ĹŤÜ32’Zu v6:¶í-fĚ]Ă);ť†WT"ýB®|ë–ĄŃłINßHIáY>ŮÔŐ™l^zůoТĂCéNiu G%Ó¦>DK }`áâĹW8{x(Ż—Pťv y3Ôʨ<™Ť•!ź>>Ăżţ2™}GňIŰCy‰îWĺr°@D“4Ť§+ݬů„"ü1«ˇń ŤúÇÄp¤Ľa ŁŇŇO5đľţčuN–‰÷·ćp‰űĐD^{|hë)ŃŰkČbEň6,šĎťŹĚeĂO±—ó݆=D% #şo,ŹLLę’ăşĹ%ĄĚ¸?‰ŚŚ“+a#ÇŢPDĽzÁ2F=z%ĄŤÄ„Zľp·+0Ű$gµk š˙{돿C”—Ag¨ŕ -—‹őjŚŽŽ¬_»&‰ ĺ}•MníyÄőŐäéÄlO=ͨř~ÄDp8Ϥ•+/HG-DŐń-(Ľď††ljsŇđ>›@ &)†Ôs90<ŽĐţ8{ş×N0W˝U1pmIŻ˝ţ܇ÍbćPŽť«$)Ę‹\•‰¤–ęÂFě\AéáĆöă(í¬pTbŰPF‰VŽ6{7 žMáîüRbËť”8x ®.ÇĂņcç*‰ň·!GĄgÂČ„¶Ń%Y§8]ÚHB 3{ŹťcŘŘqś9°…?¤đŢ?lI;WÉťIÁü¸äkň ţLť0ŠP_ŞkÎó׿żÚCťŞÇn:wż¶żů÷Ř•^¤qCČ.«kőľiÔÎ÷»vđÉĽŹŮńăg|™UŹŁ3żÎĂÇ©™–śr´ú&¶îß‹ťDŚťŤŮzw쫢h>r‡·P„?ÇذtËae ¤V"ÔU%85ÄŤĎŕŃ“n{g`łMrGd˶ђ”(1ɡ żĚđRbÇ˝3§&÷(’ČŞšĺxŮč8Utž‘8ĄUyř( öräÄŮ|Üĺü´j#ľÁxÚűBĂ@ÎeěGîăMPżŃ4U–ľTÖTâăăKęÎH5%TaŕĽZ‡›Ýo«®‹bŕ›ĹAéE\”?Ăůŕť ‹`í#yş@šrR‰˛Ć™Hví=LvE5:‡Pśk“=d›’·žŘ—@ŔŻ_ŞŐ˛]4–ň¬_°·µˇ¦¦€·ßx“·ţó؆ßŮn¸ĐŰ ľbd°3kŞâąp6•ă'3Đ8…âjďĽ7Źđ°^Ůö#ÇŚ&/ł÷ŤyĽY. Űźá]Ŕ–ąOĎÁş*™W_˛U ÉĎnµéčÂ÷kR ö’[‹Gp$ÖUqňó#ČĎ…‚3e¸8ô™ µé4KŔÇÚŽ{Gyó×]ÎXŰÖ]é &Ń·k]›{đíNďt6C~«xOĘJÜ&‘»uu6}đµˇ÷O `ß<=¤Ř{úRTXEym=ôńÁş> IS#µő"‚˘ýqŹ…kC'Nf"N@{2‡řiÔžŮM­Ń?+2K5üîÁ{?˙S”ÁШ‹©®ŞĄŻź;çJŞń $˙\Í")ýśí¨łéw#'2‹qrrÂĐÇ—G&&±>e3¸ÔănŃ6ôŞž\wťµ%¬ßĽ±S‰öűmrŰY l‘I®ľľ‘Ô×nZ•‘Â_§Üp»ćLIIłç>ÇěąĎ‘ĽÎ|ŹeŢkădicŰôę˨n¨ćDVŃu׫S7ó׿żĘ?Ż_h»C˝ťßt¤?~˙9 łŢĺÓ÷^&Üş…\Ť= ŁĆ\rG•žă•µ ÚD‹ř÷á—]'’HEΞüË?ůęý·HKĎhP& '82†Ó…µdŘy]gŕۉ‹őZż»ŔˇĽ:&€äĺ+ˇľžÔ´Ľőů:|śôŘj¤Ä†öápˇ 5j1 ŤZD9ĂÁ ?ŃŕH´¤ž„x¶lŘDK żzł­=.:5Ź˝ű>>›÷wÎá#GhT_j«±ăb©ą EjíÂŇ”Ôqî ”J/¦LšHňO)L™<‘ŚS=ŇÔ楒[cdůŞMü¨:DP˙‘Ř–‚<Ŕ†ď6ěFéŢ}u&nÖMěM/áîi÷0~ŇĚ61đŚ3(**bé’o{řHş—ßÔ“4x8—-ĆÓ1”¤ŃctQXmú•I0‹?Ţí×ćLűkѢGp$Ö†Ö‡ęj’7íEß* |ö™'Yřé"žz`ôµťoS&Ěâťý‘†ÓÇZ{rZ6ĚeT|0?,In­×hu›ýÇ ś­wĺlę…ŘŐ?’†ó5—ęUnÇ÷Ťh_ĎmíaâŔ®-DĆĹ˘Ş¨@Фu®©­ť•+Wâë{{ ˙˛Hťś9‹‹ň°łîüívV˝ßŠŰlgŃŐÎŔ]Aćéí¦ż\¸W˙óęU<óąq- F růĄá]˝U»Řktr–č ÜÝÜŠŰl§ŃĹÎŔťMqq©©ÚÍ‹éß3oűę*Ä"ýmű¤Ř"“ś O3oşÚ¸ł‰ő%â*·kRčmXd’ë1đE×^+ٵOŘââ"<Üť»4KÄÄŔ‚ër{ ‹U8»¸÷tż™šjÁA7§_´ČoAwór2Ú\{ŻUˇë~úI°ßľ ć ľĽýŔŮĄgť{’^ç ÜU|˙ý*Ţxó}JJĘz:Ű]C5{ŇÎq"ătŰĽÚ’rK,˙ť']E§üÔÚţ3i…uxxF1mĽéMőÉ_@sŹrCwS€ůó?E!łgřÄ)„)M¶2«,cě3ápŤuň3~!ŁĆťę#{úřˇ+.Ľě3’‡§ŹA§®ä«5»Űßç’Ă/¬Xµ;Ďx*łö0ăŮg¸Ţ]¤äu)Ś»sďĽ˙?>™˙%‰2yâMÖ’eĽv5­6v\»v+Č:…­w¸i^ĺfuE˙śECŮ)~I+fĐ»đľ¬w­]NˇFŁ[(•gŽ ňôG^QŚŢÇC^R'ŮZü ㉠Sâä扔FÂ<ŤdÔxQwb'zź$Ĺůč}"b$Ł&‡ćÓ¬Ýy‚yoĽÜ5Ôłh«˛ů×Ű?Ó·#ΆQQU‹Ż´‰-nÜ=ÄžÜüJbúz“YŇŚ‹•šČ‘SÓĚÎŘHi^&ĘÁłůů›÷8·s»ŇKHÚźÂS›8ľ-™;† n'썖ԣŚô§Hí´.—7Ţy…´śRţß~żč<ŞN¶ Ąá,ůôk\ąxx;1p@` §k48»:“]©"¤Ýg){¶ţDDâDüÝěÚ~ŐůG9Š3ýűErľą™>ëÂ=r„‡gNĺ•÷ß E.Âh쌚3?2ď'Wcʤ©ś/Wn%věh2·ÄŐËŽč1w±uéî™ńX[ůżýóßś(ŃđtSm›ź '¦Ţ7ž˝«Ö SH¨×”ăă1±€fWg˛ËĎ®Xä@ !ˇčU™Čü tätŤ 7ŹáŚ'{ Ç`¬ 0Ó50 ”ó"ď©s`X‚+»S‹hQ×02Ř™ÜWbâăřaŃkLxhR©5×,cć3Ďâb#\˛wÚĺjÚ¶źPú÷ă˘HÔĎŢ$DĽűˇGŻöĘíxâ…?ăPž‚WâS¦UWóőĘmŚčÓ^@¬Ó]SśźWJEE®ľö 1ęWźI ; 'Γť•Ĺ/ë6PE>1ĸÁł™Ř;řR]UHVöő‡Ä|ţĂ·üńŤżá=ŔŤŔľž4jzŹĆčr.ŠşłjI:‘iC#q‰ČŘxěÚLd\,55­—FuĹd• ľˇ!í¶cra^…2:[+[B|#¶:Ä+ČÔ>ŁďÄÓÍ×€Pîť>ť± Ń(m‰ŚŹom׆ÖňZ?˝[ççq"Ł‚qc⻿rĚąk=đ(ďżňćIúMŕą§Ŕoľ÷r@nëČ#sź"ηOO‡kô¨řÇĹßpÇspąÉ÷«t‡8/'Ł­>öíŰĂ+ľĂ»ź+M-Ť$ő* ŐŐŞNđ`iBÓÜĽbä #JŻK s_lż®ŔŇÚz޸ł¸–ðي§=:ç–Öë1đĺ.ŞLÂĐŇŇÖWV·Ź'ŐŐ=˙ÂŢž&(đ*o31pOşŕ yÁŢťbŕoľ]DSÓ•UĄŠęęš«¬!`ib`ŢŤE&ąîdÖĂ·Źmyg!Ě ‹üÔÖÖbčâĐ­¬$ŘŮ(+ě1\Ă{÷ž=$ î]c;A ,`NXä·@«ŐvůI”—cň3®=°ůäÉB’0szfĶÉ™SÇŹŢňfŽîů…ŁgóÉHÝIvŃ…+>.eł3Ő”°Ş*«Z×Ô°qŐF4Ŕ…ĘŞ:ę–””ńŐÂ%<ůÔ lß±ű–ă5G:â*|ŃŐą¶¤€Ź?xŹŻ×ěşať|űŮ.űÜ“ň ź|ô5‹.bĺâřúÓĎŘş÷ ­ RÝ‘- Ü<]žälžúÖsź@rꢢÄGS‘}˙ňµ»‘lKAţŮ7mĺd}tűa¤ëRgˇö’´sHöíBr2qzz»mĹ$Prf/eR2ޤüęs/iGÎŃR‘O­ş’e?˙ŔąŤŰŔÖ9ü°bŮ _ž—vřÓ¦N%22Š•k×ńöĽO:˝žz “«p;áΉ“ٸőîś8™_öěaÚÔ‡đäKěٖž´s8(ýM*úńl\úŁÇÍdŮwň÷żÂËoÄŇ”ÔvŰjZr!?Ť“…:Ϋ›‘É[8ąŁ€{źžĚŃ/~ÁJ^Oúq˱f°,şĄ'gđQbµl Ňý»‘ý˛iFdďÂꬣ]k!;šgŚÁjW*âĘR-?ôľdK¶bµc×ŰÍ;–Fhtâ5÷»gëOT6zR;7BĽśČ?{”cg/ťP!a:†·Ţ}›&Ťš˛ĆRTŤĽ?oAÇ+ŔŚąč*üăęÝ ŠôcĎ)"ýŘ‘zŞM„ýkWg€­űŇńu˘şAsMgŕ‹BëęŞB*už<;űAî™xH<őĆ$¶,ÜĆÝŻOÇF'GéăÖŐ‡*p›Ňĺ÷ätýŁ­h‰@z,}xĎzČ]PA°i¬«.ŘŮúăh‹lí>tűbPd· ď!:Iz:†ţý۶­Ö5Q”_F‡…ĎD4ĹÇ/űFŻ#О9^¬A®®¤A]ŹcŔxfţ)ŠŤ«v0vúҶž"/»~!×·„®Ł‘*unÁŽD÷ŹÂ^ëŘ+trß.3ůýOk7÷ávSF&\Zňü« Y°0]®߼±S‰öło·ŢÔYO0 ä©¶yq±žÄĹFđČӦϾżů8®…`~ .ńź—ÍËo˝IłmFşá©đD.—Üö#®Ćů XÉ{ö¤PČn\îV°Ä6F=ëWź™y–¸ţ ssÇ"“tďMÔfmŤő—ž¤ŞT*ŇÓOZd’›˙Ń˙ĐËě™üĐĂř;´÷¸Re¤đĺAxynűŢk›Cs]1ó7g +¬ŕw~ŚŰŰoVŔR¸é$whß.Jë%Ü3~ŘoĎşFvě;ʼnáě8Vĉ}ŰŐek6Ü?Ú4ljţwËřýc]¶®š/>[ĹcĎ?Ž8}ě8A±P»6n"~Âxv­ZB5n¸PI7/ŠĎC]QQŰ:7uÜiG۬–üý•żí¸{´ĂÇńđóćç/>â@ľ NÎEŘ·čđPşSZÝ€ťŤłßŞĆľę NÖvőÉm)ČărO€÷^ţ;˙üp üývĄ—4(†¨řXNĎ#r`Â%g`3á¦óÔgß®a|’/}QHmĄ˙šŞZîHČÖ#ŮDű¸[Z‹_0%™'HJJ$5őÇ gÇŢT]ÝÔW!˛ ŕá{B˙á§ä=>ŤÔ퇩.ޤ˘Ş–!±lÚ¶ ˝k K OÓ w -=…‹_˛?—ÚáęĹźżGI˝‚8|p/ë·l#hŔ=ÄO€˛ňršŚ:\B˝K ţ8(t·ÔQz{ńřϑǻ˙}…ă'2oa+f€ÜWŢ|‹ôźă4|"§7Ě@«iőĘl¨ÍH§YNÖ¦Uü.'N™ĆŽĺK Uš G ŽbŇ”'YňýÇ:wˇ'ŽH@ŕşÜ|gL[‹(ŕA’*Ź“6Ž?ĚČ`gţűĹ7üî˙ŢćôŠ˙R ëKT´ś´¬ 6Š]hĚĘ`Ey)·śÜżçF/}> ńL 1ŇźăŰłm˙F;óîׇ™=ă^öěKç»3řý“&»Ł¸Ë„ŔčÔ¤í9FôđX†b4dW”3ᾇEx…D3qÂx–~ňiVÎćB}ţFOÓ‰N©ôbKĘj”J/T*Ë/ZřCf>Í€¤wnĽŇŚ m˙®xçW/ŹŃŐ1÷wż#,8’°ŕ΋űŘAsIDATS@ ł¸é$÷ě /Ë…B·˙oďĚâşî>ţ™ŤeßŮŠb\bL4®i’7j5‹6[mÚ&m“¦mŇ&±í›ľmš´&¦ŤĆ,MbŐ¨I4DŤŕŠ‚AŮe‘ŐAf{˙@P4b=źçá™áŢ;çžsďťßÜ{Î÷|x«<ćó#ňŞZůpe(Ű’r׊gÉKKG)—űl˘b"Év·'&iU'Łšő4´ś·dDzqaĹ’Ů„‡řńČĂ2ś ŻŞ•wô`÷Á–,_É犨ÔÉxjůbŔÔŁćĽôÇ_÷ŞŰ”Kę:göÝüđ'ż`—犸VĽ˝=Żűł7-rG{¤÷| á ,Nô;Č%ÄY¦aąřâŕ_°e]—ÜÂŻóµëÎ+Ŕ×2eĘoęĚÎR:§PÉ퉍´üüÇÄXúă.–ŐąŤż'Q}Ôc0żD{÷î!;«·[JT´°XşB ,NXĺ誻‡'růŕŤíý`Ń~°hÁeËŻä3w«#ÄŔ‚á„U^ć«Y †! '†Ć4ó{R[[KK×ôwčČ·(lÄă“@p«"5}÷6ĂźŃţ}ţŤR«Đ4Vłg×Ně eď7C]Őá…®™5ď~ŔWű2®¸IYa.őÚËťzűë , ®ű~Ţ m  ˛ożPz ç“?ŰŚ[äÜĺ­dd“4 ?gű¨ë)Ě:BÚńî]¶ đÖÚuTVŐß9H"¸AŰČÁ=©4ě9ţŐGěËŞdţ¬I)” 1U‘čoGe‡‚v‰ś‘ÎţřškŘĽ'ťyóň#łpV´ŕßé üú)¬\:ěâ&äv΄E%1°`ŘqÝAî•çcw¦Ž'^z™ĺSxă˝MŚtQ“˛ńK~7ťŚÝ˙EăÁko®%@ab¤Ď4-uÄOšĘńô#„Ž Ąľ¤­RŤł¤•gÚę\Ëk]çę5ćřóĺáü‚LxyFPYvꢸÁŃ©)ŻĂ|úń&‚‚C e×7ѶmřpĂ Sň?‹ďcoúI\°zíꋵl>5_ń·ý­,˝ÍÄęt@üä9,LŰ«śKťűÎg& =×äšĎ’V$A®‚°°`4ĺÇ©6:‘sř0n^^řů:Sdź®ĺ…'ćńňk_3É.ŘIóů×»˙Ä=t‹]ő,};“˙č~ ¬ŰśĚăťY·9WESťH>ÜLŕä *KfÝćd^X9żĎęd$LęÉó„M7°lÉýüęą_SYUĂę—CĺY‘; '¶jO.𼂻ĘălZdyw%5aś‚áŔő9G^|ţy̶z|GSYPµ§[č«âgĚ%Ćq4ŢjxüŃŮDŚäË=Gyý/oR|âEFţúłETęd¸ű‡đěxh,áŮńţxٶ“WŐĘSţNhUTI;×›Zú¬NüÝK·č~Ń6ĂSO¬ ăX¦ďjo?–>úpď…B <ěhĽ ¬úÁŇŽQęţ™s\÷ăjŇÔ¸^˙'^"ôőöí^×%říş{p™<µsMŕ%Bß‹ó‚şDÁ.ô_äJ_˘wÖ®ˇ­Í"/9™{cÝ}#ÄŔĂŹŔë·>ĄöÇ`hď×g¬RHt51đóĎýę˛eý=(‚ď‡?ne]©U^B <ĽbŕáGiyjµz¨«ń˝čč0ŕîÚ˙6XĺU0śŰZµ¸:‹Ç2u V«­.ĂŘĄ4i®ďĆĆ* }zµˇîXż^Ö¬ů'·Mč•KőZŃT–ńţ§˙EĺźŔC÷NµŢ‹gPY’NcđľÄťtdf”Ú˝MmI.1ă.B\j(›—‘C@|d/ű°=ź­#dć zxçf’‘]Ahą•:|•¤—ëX:*Ű>ŰÂÝ÷ţ[ yÇ.“BIŢú-ń‹î!@­$uçVĚnˇ«Î€{3'„SVxśFł/šSG0»űw›Ţnűl AŢdu–Ť¶†Ť;ŇŹšŚĘpŠz›B\nĚíţ]§şfÉ1„bŚó°ÎňŚá‘‚ŻžÜYńţ:ô­čµ,eÇ&ZdŘ·—böAR“‰Ů#†™o.:[÷ď×Ŕ’‘•Cřřé¬{ăr*ĄÄůŮq¬˛G/ v%v|2łOLâxĘ×<óĚ*ţö·ňë?˝ÁŚč1B <@děý&<ŚRs–Ż÷ěÁwÜíd§ď'>>Ő/nâőw˙—ěÎmö~°žÜ#éÔ$$Ć‘šşŁK_]8Km‡ ™?bć/žĺüé\´J5jI“wŃ2‚łçęj 1Ôžm¤¤Ě@¸RƉ2ár[ľü€ŁßÖŕŕ•›łŽvöśN­`ú'“ůy&ůÎçQęĂ0ź;Gcc5t¶0!?o ˛ZQşÖV¤¤aĐrřŰŞĎ«čî@Úˇ4ăą{b8GNfđm^Îţ¶Ă8Č5W˘8RŽ)u?ҨĚ '¤- ]\Á܆Äěq„yiú/䕼m,ŻŁP¤źÄ0i"˛ťß`ĽëA¤Ç?BjB»ĺ«˙Ŕ<ĆŁłyi“˘PdžĆä†4'Yv.H>@ßC <ýžy|±u3&C¦ęH QÎěgőçź ut@ÓjGuă)d®‰ěßţ1/ýőM\DbÚu0µŰ —[&g :lmmq;ž)q´Ű{3wf$ňšSČ­%a¬/©é§™=¦» !Nţ’좪̣9_x’'üĽ‚đv¤ŘFI}K3čUdź*'4Ä–77X eSŹäóe±–¶3j_˘|L¬ř»EwúÍŽÝD…xâłýĹŻřń˝źsŕ´†PŻěŻ62ÎKÉţ*?^ąOűDOŚGlصO˙1$żż›ŕé÷`ĎßÝÉÝm‹jKÖî˛ârNë÷‘ŃŘĐĘĹ‘és—Ł´?HKűyöWťcćH/ *řŰšĎY˛ňA^Éî¬Á=ĆŰćęwőݧ6–ěÔ}f Ż;…ĂŞwhűýĎQĽ±†ögďÁvW#’˘Ăőí´żş»Çǰd&WĘ×סô‡(Ö„ÉÇýK±ůć0ć;Ú__čňY%îHtEPyĂ’eHňŇŘ„bÔˇ8ç ů»čxčG˘Ł©­­%$|˙ří/qNş ÎśĆč3ŮŮRŚŁä8;Ť`ßţ"^üí]lůϲ*µ¬ţĂŞKľr¶˘»*¬ťť=˙Đ.j]c™rťż¬}‰›4ZüoČjö›’˘“7ě8Ä9Ş,É'#»ŔÎVVâ7ĆŹ‚üÂnsY÷ Ľ•ěŮţ ľ1x÷Ź/2ţţeĚçÍî9„DEP•]Ę×/(?/Gm¬ŁR§$Đ ňŠë ôĂÓ?•|ĐŻ«ÁŐÚеî_ďnౕw˙?jBV?ś®YAĆČ@¤™9b"‘íŰŮ+łĽy~úpO™ůÇx#«ľ€!pň˘&ôSƢŘsýô$¤eu"‘ś:ŽĽ ý¤0ěV˝IÇďŽQe@‘™Ź~zň”ÂĂ‘ĺÁL˛^An(ąY‚ÜŤ éĽ…rhŰ —­ÍŤ)ŰĎQqi9öÖýc4ËđtwîsÝŐ‚\˙W•Ž#-żÖ¦HËŽ{uőť`˝ŻĄżÎÔ™’Aß)ěŐwŠMťeÇƢďśٶńďËéüĽˇkűŕ1—Ue¨;ţŰZµ8U}ź1đđ#4děwod\ŹtĚ*Č۸/F©UB«w†x ¸YDĹ·ňµj•gO‡7ĂA ${ ýQΗ!ŐŮ`–·"‘ą`ňí{¤äZ)=ťF˝Éźó凨mQâ`nâĽÁ%‹Yoôî ÝŇrŠlićĺçS8Říć«GSťŹ­Ă¶ëlP{Ź&ýłÂÜi”Ę9/‰ÂXËüq~ĽţA .Š'Ż˘wź ĘĘŞ™;-Š ˙ţ­ł?_ý{5ÇSÜ†ýwáS's:ů$hĽ8®­ ^›‹më;Ś4·1>’˘J‹řčţ˝<óĚ*:„řzh®ä­­ÇÄQś#ę)«(!8r<…9ËÎ%.ô ©ÇN¨já«bWî™äHqi±Ń~a°űD´cÍÖ˝ąg36”8_{Ž”4rÇü»ĹŔ*çѨ$eĽóÚhámS {T6.>ň ‹X­B‰Ü)ŚQő§qď<Ü:ĘůŰß·¤Ł°ĐDůé64çí(/VPüm ®zČŹ!>€WçúbAu6¶ď}MŰsO"űę ‹ř7ČĹŃ*Ě Ś^6ŕ0Yq ¦¤űÓ0Ţő ć˘Ý(ËTäÇy,ĨŻD˘TcÖT#Ń0{;`‰4ç¸E`|ˇšµHĆNĆ\[¦Ž^bŕ1Ł]É;tŁ)WÇzŠókĐHOI=¸„±ćOO°úůz¸ůŢGÖ§|ťi(Ľ€óŘńĚŚ†“8s¦ÚKĎt wµFŹKyI˝ĄPçŃa¬¸w6‰3îŔ|ř…Ť­7ŕ9ăůGZ~ľ~?ŐYű‘„»4Ó ±€%öN±pĆi"Łăú¨ąŕ;Q*‘·´ÓŽś–sŨÝÝřř?ď2~.ą|ş} ŤüçN'*.–Ť^fö’eěٱ•„éłČ(łăŤ´.ĺą"ţ|ÄŔ«ĎއS1p^ĆjkŃĘJ"'ÄCĂAô*Gęëő¨ôVRVÝBdŔP´k§:ąH3Ž`÷ć':j1,Y†ą¦IČ>ÔŚ—ô<5ô8Ú¶c2¸ńČĎşáSąnuťÜŐ‡x čKT|#ÎQ^ĆÎG ,=Ŕ– {žyě> ŇR1ŽđŔ˦˛†&MŠ %ĺ$ń1>ddćNff!Q1„{©şWť3ŘXîĆň‰î¨Ľú'ÎČĘ$>zŕsŁÔÖÖâíăĂN Ü…¦Ej¦eΩ˛Ef>†Đ@pŤY®AVŐ1ŘůŽTLˇ —cŠ „ň"$*OĚ4 ŐÚCŐ)¤:%&G[ĚRĚŽHŰĺHĘs1{…BËyL1‘(_ř úźýTźb`+@ąáÇP‹5 áă†$Č]ßăŞÚý‚‹Öâ]â] ö;GŞ —ćđ ÄÜąŤÉđMâŇ”&˙®˛-ťéş?ţĂňŻŰĹNo!®ťˇ{ű ťy­UöĎ 1°@Đ?nĺkŐ*ś ýc¨ĹŔpd„X`M µx ÎŔĚP÷ ¬›kqÎË8BAUăUľé{ż€ iť©A/ň}ť§Ý3‹ÔÎW[čtGRYŘíÜĺlŞĘGęÁô¸î}DĆ’“q„±3ĺiOńÉ}śÓ{p®ĽF8˛pFҀϫ1`A.ýĐ>Ş.Č{wŇe…ĎĘş˘R>ýĐ> ö×eÇ}Ë7×â ?‘5Ďţ‚5w'ńĆÚuŚtqĄEŰBč6|˘I?yMQ-éĄ4NźFý©¬s6Žvöč´ ¤Ëčt®C†Ĺ0éĂ0ź+Ą˛D‹ö\.ň L™žHíŮFĽ"(;YĹYjíŮ”ś†ł˙t檩T î Ȁł·ŢűŚ»GóŃNŠšŚż´»1Jl°w°#-í0Ćv‰‰QČČĂ/| ĆĘy彯YýÜ“|´v-µ w͜Ɖ錿ô´ý„Ž Ąľ¤­RŤLßÄĘ[T ,¸9ąš3pšňLŞŤNä>€A/AâŮJIF ű Eç ŃyŹä`ň6Žž:?`ÎŔvţś:ť ł§N·8{âmoq†(ęëv`ň $,ΆŁŚúî}x†ä›/J´¨GGóÂSŁŘťe íL÷Ý7yPŹńŔÝđč4HĆ,Ƨj8U±™G$Mů»hĆrÂ&ą4óń–îž5ŤŚ’~0c˙űx+Ď˝ü;©±ĺĂÍ›0·i)¬úŚ–,vŐłôm‹­łŻKďůrĄg 8q¦/é™N10ŘëĄč´aÁŔ?c.ŮGqŹĹ´‘ťÎŔ.XśG¦¸˛™oGV,_†:8šU{PÍzŰöňŠëX:=‰””„Ü>ww'ÚfňŔą"*u2~ňČ2ňŠë¸DŁMěŚůÄÎ转+Íű¤ŹŹ˙x1ťŻ¬\ÎĄôµĚ˛Ë«_Ż%_îLüérÉôÔOJl\ ÚJOô# ĺý?ŻF?2Ч€‹RĎm+/ľú&÷ýüÚ5ŐT5˛úĹ_đŃ_˙ŚCŘ|~ćÉáśBĂc8_q’"ŁýŮ"*u˛Ëö9&z/ůâ+ÄŰ?ďN“ŮČHËă[xĹ]ÖŻ‡mW7Ob÷˛Ń„XüjYx©Őß“¨Î·]ŰtŃÔÔ0¤N Ń,ë<° —g™ ˘ööc¶·«ßZŰç¶›¶]üŐXŘ)*~míšîe]źÇ·ëw&°űäu1Ô˙B ,°&†Z ĹÄ}ÓÎ~†CpÓ'v±Z¨nOWhŻáxa ž–˙‡۶ďę*·äzŘ;»Ä6ŇÔÔJR¸3OăĎĽ‰ˇh·¬ÇÁ3¬ßđ)qľö7(?wŽŕ4…ą}Š[Ť¸Řęyď­·iŐ¶–Ě®m§‰IpŔ¨Ss¦ę,­uFbâTÔ5ŹÂAquČlî˝=h0ZÝ'ʬ\Ĺ{ďţsČö/ÜjHe/]öÎ-rÔj_}¶™}ş‰âpW÷%•Ł:WÄź˙›‰“±µ»+Ű·|ĘűÉ™¸»ąöžfhÇ(•QvŞ˝Ń¶#™w`@opŔ#(Q #ŘŽbŢÂy´Őµ`â‡ó… ćpňġËőMŕ†18_{ÇžYTË9ă$śá‡+cîĚXvďHĹVn‰łIł@ĺ˘Äeb Ĺ^nŘR@^i xéeNe\.–ŹdÉňe—íęˇĺs ‡-pGŇŤ*O?˝€/ľ8DT”ĎŤléwâííůÝY;ćˇ×1vB iő Ú˝MxüDÂ;ßűY„ÝĚîqGă€ËÔů3ÔąÎ{bŇ5‹]ÔÔ_a]â´ pˇšł®§ߏwÖ®ˇ­íâŔCCCăŕWb5RÁđÁ*GW‡¸ż<˙ÜŻ.[f20tCPŕÖÁ*ś ‚kE:8#@047ĚPŮ_ę+nsd] 7̰QXeÂ-…8GÖĹĎ–B.»îÄ@08::Ć>×]1Č9¨¬kôR ÜĘôŕ Ź —ššJn^î ­Ž@ Ü,wt˝‘›.Y0yR<“'ő?s–@  GşďäDś@ ¸YčŮG×äDś@ ¸y¸ŘG×䪪k±łsÁÍA—ëvwłłW +n@pSĐłëM¨‚a„­˝Ó 7mŘđţ‡,]|/6¶ŽMW–^ šf »ľŢ5hV˙ëßŰŔ˛Ą˝÷ŐgŢUIÖ!důFŚńîČł‹0ą»bŚŚ•šĎbł§Ž{oGńţ:ô­čţś4+ Sôwd{.?Žâ čgÄ~żÖhVµb }ŮŞKë%X FOhµÍŔŕ]´4_´ SŤžvf]ôť\ZŰ´¤É… dm>Ą:äéíHËĘ0ą8 ĎŞ„Ş\dŮą•Ŕ3ĂÔxä'r!í0´čxň'HŽíÂ&ĄĂřQČKëĐGűˇH݇Ä}"zC+ň{vŘ`n©Âlë†Dw‰RMÇây(Ţ[ßk™YŇ„´¬Sh4&75ŇZ ’v=lÜ)0 ©î<&˙0¤9ȲsŃ?t٧@ °úś»jž4ŹŽçţă´™Hj‹±Ů´Imˇ4©ÂłHÚ[±Ůś €<ë$ň‚ Ě­ůH›ARQŚir6>Ćäĺ|ÇVô q–ťÔ• O;Ž|_˛Ł§1LńÄ&9ł›+ŔeËdéÇ0kĺ -.B–_€<÷Ň[$Ť™–ş5eu×Kš•5‡O ¶íßÉĂ/­đr?{ťĄüëMş¤k&ýTYż?Öźö¤źČéWŮWí“3Ě N š‹a‘˛iť|Ń=˙"’˛|¸íQ̆Ftă-éuË`Rę1;“îĬň@˙—WQdćŁüČ3óčžN“0űzbĆ>‘´ý¬ i§ÍyÇăËz-ëxd6ý3úçźCšźCÇ‚IH &ĚfLc=‘ďHĹŽÁ6n{´_A °&¶íßÉov˝Ę®'·`ĐVóŰß­G†Ż1JŠ:đ‹ÍÓÄőŻÜí;ąýĹŐüűóťL9–Iş×fâcÉŮ·•mG5Ü5g E%x‡GŇ®9KC˝‘;§GńeňAbâcÉĚ8NL¨;omÍ#aěĺ© ®µ=kţř<'őţĽňČLfć“@^Z:#ByçQb´ł-Z•'~ÎöW-˙ŞAÎějyٶĽz&`xŮöĆq‘˝řbpDďkŮ^ď;¦{µaÁĚ^››&&Ń5Ăyٲö –` »Ľ®«n¦ŕ1—­n¶íßIƱăĽŐşžŻlî΢©ČEI$yě.şŔ7űsŮőĚĺNÔßĹÂsŘĽ6†źËäOO<ĘOă-ýćéG0wŮkD:jXwä›Ţ8ŠIŇF‚g+żŢ÷ ű ©˙ů 5Ş ę*kÓÜ^©=čůúŘY¤”“–bFăčĂßţ7ňöQ´ďŰČůňÓŹŃĘmxćĹ—ľs?btU °*«ŞykÄzžT=JBüĹ;ç°)„¦l¤‘`~x· ‹îžĹžŻŹđŘSűUţż{• Ç2yÇË{×®gł—'÷=ą‚ű–>Á¶|BKśZ ÄŤŹŔ,52˘ŤXźhŇSv};-E $D‡˘Ůń˝ÚS[\ŔňUż$€2vď˦¤áţ9I¬ýűf-šŠ^×Ćťc¤üiŻ·k°öAN °N™Ăöwňăe˝•••ŤŘ{ą`„Ć\wF8—¸X=Ë^ů-۶ďäľÎ§ŁüŞĽF;Ł”9đĚł+/űÜĄޏĹQăż_{ôŽ~Č 2)GÎěŮÓPÇâ§§ßziy"¬//â÷O_[;E¬ooOv=żĄĎĺ‘ę2qÁ;[ĎÜŔ=ﲒţ¶§+Ŕ¸řârŤűÎŔŕ¦FÜÉ ĂőďmčSĐ:tĺü,ďČqŃQ”—•ňĹŽ7|_}ůÉIěT+ßŐӤъą«ঠ+žŤš%üäÁ͇đ“79Ť$RżífFH1®2a– Ć(Ua2‚¦‚˙řw;‰“ňÜIEND®B`‚fox1.6-1.6.57/doc/screenshots/imagedebugger.gif000066400000000000000000000650051326741342000212260ustar00rootroot00000000000000GIF89a Ć÷UŞ˙$$U$Ş$˙IIUIŞI˙mmUmŞm˙’’U’Ş’˙¶¶U¶Ş¶˙ŰŰUŰŞŰ˙˙˙U˙Ş˙˙$$U$Ş$˙$$$$U$$Ş$$˙$I$IU$IŞ$I˙$m$mU$mŞ$m˙$’$’U$’Ş$’˙$¶$¶U$¶Ş$¶˙$Ű$ŰU$ŰŞ$Ű˙$˙$˙U$˙Ş$˙˙IIUIŞI˙I$I$UI$ŞI$˙IIIIUIIŞII˙ImImUImŞIm˙I’I’UI’ŞI’˙I¶I¶UI¶ŞI¶˙IŰIŰUIŰŞIŰ˙I˙I˙UI˙ŞI˙˙mmUmŞm˙m$m$Um$Şm$˙mImIUmIŞmI˙mmmmUmmŞmm˙m’m’Um’Şm’˙m¶m¶Um¶Şm¶˙mŰmŰUmŰŞmŰ˙m˙m˙Um˙Şm˙˙’’U’Ş’˙’$’$U’$Ş’$˙’I’IU’IŞ’I˙’m’mU’mŞ’m˙’’’’U’’Ş’’˙’¶’¶U’¶Ş’¶˙’Ű’ŰU’ŰŞ’Ű˙’˙’˙U’˙Ş’˙˙¶¶U¶Ş¶˙¶$¶$U¶$޶$˙¶I¶IU¶I޶I˙¶m¶mU¶m޶m˙¶’¶’U¶’޶’˙¶¶¶¶U¶¶Ş¶¶˙¶Ű¶ŰU¶Ű޶Ű˙¶˙¶˙U¶˙޶˙˙ŰŰUŰŞŰ˙Ű$Ű$UŰ$ŞŰ$˙ŰIŰIUŰIŞŰI˙ŰmŰmUŰmŞŰm˙Ű’Ű’UŰ’ŞŰ’˙۶۶U۶ŞŰ¶˙ŰŰŰŰUŰŰŞŰŰ˙Ű˙Ű˙UŰ˙ŞŰ˙˙˙˙U˙Ş˙˙˙$˙$U˙$Ş˙$˙˙I˙IU˙IŞ˙I˙˙m˙mU˙mŞ˙m˙˙’˙’U˙’Ş˙’˙˙¶˙¶U˙¶Ş˙¶˙˙Ű˙ŰU˙ŰŞ˙Ű˙˙˙˙˙U˙˙Ş˙˙˙, Ć˙·HB° Á"4a ‡KPQŔD‹&RH‘±c %T|)REÉ“O*ů¨DEK'.](‘)¦%7ťäÔÉł§Ďź=Ýčt#E¨'G“"%*獜§s J•µ*Ő«V«Jšcg’ś;’ŔŠ ;ÉÎĄ˛—.YJ»–mÚ·păĘÝtëÝM—vĺÝ»ëî.˝éöÝukÓ߼}o .Lx“¶$˙´`ŐŠU˘6”14QŔŔC‰%8‡Nđ0E %4r4 ruČŐ%_4™räĘŰ*’¸ÔÝD…“ż§PŇ„¸’8›ČTÎçN <…:J´ş”éE±»yStR§E‹Ę˙q3ţ©›¨OÓ«*‰Ş$;aĺlµŐë%9eóĂżŻ?˙Ú˙Ş%ŕjíBŕ&¶¤• ^şěUX]˙ěăÍ>ŰřłMjCˇ…měňĎ6úlŮ>n“Ƈ4ŇJ4–H"I=Ť BUÔY§ąX€FnLäŁF-* ‰%e¤l$m3ť%n¤p‹$´Ýâ“*$(Ç6n¸¤BoJ$8Ó—7ŐäNIčd‹%GńdË-AEçÄuŇiça–<ˇËRRŚ'Ĺ?O‡zReĺ^Uv\…_ˇsĽW–÷ÝgÉ$ôý‡Ös¬Ĺ¨€bÚÖZ…%x‰&…]b ]źŢę&şlŁÍ5ÚhŁ*dI˙ +Ű$±‹«I´šÄ6MÜňXd ábIX‚D"L’¬$čhË$N¸č™ŰH­%%81I“HRÂ%Ő¦p‰$S.9 GNl“”˙@*‰-U`‰ ˙Đű‘ęţ†“ –Ř"Ç™nŔűŻJôűÔ-iţ“îSţúzIŻNŘâÄ-¶$z ›„ోµn(\-ŠI˘XÇWÜpy€®7U˘řµě^WrŔ|ź$Ť2jłZVęÖ¦nőěé&m‘**^¦>x×-‘iă«5µţÓ†Ş&j“Ć&űh# %Ř"µc' ”†5ö ‘µhđŹŽ.vűŹŮ’lłK-ş(I·Ńž}‰Ś4KňO {ź˙ín -Š4‰6Ź>*îp–¨{ –)Ô[đ-ĂálÉ-ků{É? NţŹ%˙ŕ¤đš˙ =9čN„ž . c®ęĺlîYrčŐî˛&ęR,žęâP‘7ÇyXúçS]ÁĚ•}‡ög©Z:ŻEóŁ.ßs[šHy–нѣšşŤ5­nŁËŻH¨ŞÍÓ¶BMŻîŇ´6 Ń#DĐDhŔçŚÝĘ·öýsK˘ľ|-Úź‹ ç˘( ^›sŃ%ľ%K4nHrC“.Ń8ˇXb^˙ŽH~CągMn-˙€Ś¨ÔŇ9ť4ÁcrPXÄÔ‚´Ň%t¦Ó‰ÂŽ‚B…ˇîş¸XčrHąÍ=Ae*ŰŠ|˙˘ŻPMůą™µĽJMâk˘¦¦©şTo/i©K¨FĹ—[|ă1ih«NԦ٢ Źń5Hp&k @+b‹6  ’`„Ś–Uů$kŹ^Aq&±±hËZŃŠł°%‰t«Z IÝ- é[÷"W•ÎE9ßÇ%Ź"Ź%Č(KlL˘ÜMDE°Ý'AM*עâP–Ó™Ółj'2Y˘˛v˛´EW¶‘Ţ Ę*éAŹW*uÄC͇Q4»YXś§<ÉM‘g"Ú 4áĹ@z•«Ú@N\ť­ M g­n5WĄńWěkD," Y ÁŚ€BB˙#‡ŕČ3†L‚gR°#Ď5° ‰Nd3‘DYŞMI –-q 9ŔqAdR¦*]'Č1ˇs Ł&K anR RVz4•)ăiQS€¨˛ú xË|&3ő3ÍK%,‘Ň™YxÖ*rj-ÚĽÄň2ąŁm˘IhCT§JΨ†1 ¶’ŞT±*UőAF Áj™˛‚†3™HjꑌĚInMÁCçÚÝ g8şąÉ]gR&ľîdL:Á qžCRźÄ)NG©ÎJE™Qî.O㉊§S>PO˘˘‚&°T*Q`áOW"©qajyĄÍX4¶j/ *Ő]˛7ż˙&0¶µ-br ©E&B˙řÇ7öÜŕ÷Ć .q;ÜŕŠH¸ÎUnt…K\÷şňvźK\äţCŢ=î>´+\đJhß°Đ?ĽAÝô˘WŠĐ„ľ›Ý벷»˙ os›_ëąÚzĎ;ŕářúxďuŐë_ E¨ąćťďyü!í"řż!šđ€]5ŕůVč˝"‚/‚EŕóŽhBŃ6(´âáNB,Nń‡B´ ř«ŞŇ«Re ]ôXÜ뱿§µ ·JČ@n•Ö|śäů{LţŢŽ“üä$ŰBUHć^Ş´ˇµíą“i@ör},ľ.sŮ{JkŐŞ´ÁdkÜŠ˙{\Vň‘Ő g0Ź{âł«đLf(łŠÎ­şĆťŮüç)˙ŮËoÎłřţ ç<»ÓĚ`ÖĆ.đć{YUŚźš“,čMZ͚ޞ%ŕYµE‡yĎŢĂ´;·5łÓUş`•ŞS˝ćY׺ֱv§¬O­Ş[± ̲&ó™ŮĚja§˦vŐ•y=fYÖ¬ňµ”uťëIoŁËf^łł­˝e0_ÚŇvŢńĄűĽŞď][UK“6ÝÜ*_íyË<†µ–{ d_KÚťk¶v»ËÍ´Ëb}Xľ¬ÇÜo]wŻÇżVu¤}ĄŞ\™áĺ~÷ľßťăVśŢě>ő˛ ®ď5k{ÚünU˘7nę-/ŰăŞ˙Nłš]kîýąUć>řš«Ý=™;{Ď?4ĄkŽďvFZç(w9ÎuŽl„şÜXîůŞFݵ}đ¸VipĹwí{ű*Ş’pU$‰^Gš{IĹŁ±ÜísçĽÝmcŇ˙<é[ďJŇ‘ß.ş‰¬{ďĎććžŔˇ&ô= ĽÓ^.´”…Ýöíý=ĘÝűžŻ×ďÂÇüăfř©· ÷Ę·ÝW‚fŐ•ą‡yBOÍâŢ7čÍÝĺ Úî]ç^ /t±Cßşj•$đ†cëąV®ŠDđH‚¬ŮÚĽÚfżŤHV}mp Z5p¨DjµFn äDęô~­Băs!¸kXö4ꄲлw!ř4LÖp¨*hä}%đ4l ‚äxő¦ &x!6HNł§dČöi çqî¶4EGqi–q 't&7tĂq_vnxo¨€|Öoą¶yě¤cQčy=×exg›G…{7†éTä¤Nąňk‰Ó5âă+OŁmŕV3s™5×ĐÖ†Ć=Ë–+'¨Nä¤ 'uÎ&>µwFĽBh"Ç˙÷¬ösЍNł7{˙ćwۧfö¶~<·wy·jţÇgkćmGuśÖg`¶wB·lâ¦wŢ&€2nňvi\„p'w•6Šô–5F‰i×îäz#˛eĹçf˛ –‡°×*éô.m€Ś˛Đuč|ď"~( řŚSs¬¦4i—u˙Ćn Ő"vŁÖ¶€ŤĘřcv ‘` Ψ bç{ťvvťo'tĺ'r.—kąvwî”hé'h‘GoA¨mc†oŕV…FÇq|–rťkíd„‰nţ‡fŢÓoŐdęh5(@‡×6lk—†6Ç}çƇ Čzr–íT|řňeúFfixríd€/˙iF5ćyä’/©rí¨t¤HŚYs‘fÓ¸nI–‘ÝHuúqS6‹ý8kwöjLCyö÷dšĆo^öŠ’çn2©Ź[9{.)Ź>Wu_UjFykřöj|Wiy—j7™i=WŠ}w–›—kîö”řw«V€qw•dwZ9Š—fš7póx„‡ďVföj ‚řgä'ok…ŞĆ*îFuËĆ…™‹ ŠU¸fË}ISŤéh ČŘšŐŤĐčšgňš–pŚýň.łů.·™›°Y›żŮ›Đč›­YśĽ‰Ś·éšÂąśĂ©śÍ©›ýňšĐ) ­™ś¬Ůś»YťÔů.­ůśĆi ߉Ťé˙(ťµ)śäÉť¬y›č ś±é›Ö9žŃ™śĚ™›É źŰ ž¬9ťĚY›]‡ýµaĂecUła3ö ŞB!3&"`6bZ5 j!祠ćµb)6ˇ (F’2` ڡ⠂b!˘`-&c$f˘2¦!Ş*‚˘ć…˘*˘zˇŢ@bčĄ!*Şa:j`żµ Ş #˛ ! ˇ+Zc &Ł.Öb3j˘6ˇ$ůze†9 ¶s8wisV|oŮŤ§†YŞ~`şr8g§”Tömeúl_&są¸”i g…–Ki ‰ĂeÚY Úyb6§]8Šźv{uę”'q?wĄGçqaz¦„˙ŠŹ;çšż˘bßđobÇ:Il·e·" _D…w~–†©ZC†HsTnĄz~÷Vuirč×pĘ&‘ŕ&pěäŹfo,8lšÚ*śj ¶\Ŕ\ţđfmW«łhf¸JŞIkdVzŠ9mLéyËF¬Ű׊¶zfˇ”p—kmH’®R “jsÚähFbGrÜc űPpň§ ]×o9„^f„ězdóšő ŹúúĄg”B×iCřr '§âz ďhŠůZ|‘ˇ7ÉŐ)d\Ut˛€ ­uépý*ŻąH¨‹oDwtű§¦F¨·¨Ű v'´b®Â©± mâS€@Ž­€íÔŠ'˙§o¶Đx„–x‚ąFâCn†·gn4…y·e%@–´öjYxĺćFy‹¸Ęn„yf˝Ç•ć­’P5żj\ xFĆő ®(i± ‰ ˛Đ Ů~gfEF«SH«9x•3fÎ xy™Ź*‡y¤×¦•÷gYGĄÚđ ±®k§l` ‰t Y-‘w×˙ŕFđ yIg nzÝz––¨ŞLÚ@NÓ•ŘJmXŘnŕ«ůFiw g‡×cŽŔĄźëqD¦* \r 6‘± h ­@€€ Ť0tƶkËv„|‰(7yÁv*s{—¨A‡t”Ć­&2"ĘVuÓJgÂ˙+vPC¨ę:m\z‡é„îXşęyަ ó4ˇÚŻňűŽ\qŘ”ĂpŤđH°.v…[Ćó÷’Uă{ďŰyz#ŹÉŐľŇ1Ěĺ‡î¤Ă;Ľ­Đ Ĺ&“˘§‹G;e·úާ[@¨w±ÚŻ©„9X…cx˛‘ 5W†v» „°¸„P©Ü·ez3oVó«¤K‡ÎŰ™‘€4qČ™…ęn’Ž8W«Ű#ठ©W‹HLť!ägTĂp©‹dÚ·0|îŰy,· äH8É%D’«\ś*­@Ľ€|€‰wÍ ‹+®MŚ…ŰÄ™č”Zęq—cZózĄV 0L”Ű˙0ĽPÓ 5‡Ź…{qňxFn°Ťëfď’zdŞk0`x„L3‡čxrőq5ÇťÉx“vésÜć‚”üid‡~¬˘®l\Ť° \®« ­ qśÇqLůŹą–]‰‹t»¬m¬ĄGnѶ±€ůjy«gËj5Ű»j¶®HĚ=‰ŕ~bG€¸üEé*Ä>’­˛µ3ÉĽläeÚPă3Ă—̨‰»$PjiGk—a¦*%ŕ±Ä¶s×Pľ]\qPI»2ÜN¬"‡żq¶}ü7ĐQřcë­“®şhÁ• iýËŇßv”Ű·Âj–wÖöcMéĂu9‹\,•ß‹Ąyyš¸ŠŠvvAýŔ˛¬¶ĺögµČŞ;çuž­[Ö™ZĚ•ěĆĎkű…kŮ_VŔâJŚb‡!ň­R¨ QµĽo· qĐŤ"MË®‚ßGvľ7xȦڇfđŘuŽŔŹ­r%«(  «*Ҹ|Qi<Ćc lɉs.ŹJÜĹUąÚ®×€Čf¬˙Ł\ÝcŰyX˛Ľř·ÂÖŤË[p` ť]§¦©Â…‡…——Ű&Ěź8ËMł“ç&Ťr!Ö°ue´Đ»‡ŔřÖ«©’L Ž ujwh"Ču»u§ šË4é4> üĂW#ľ[VŢ MWă{^¶zŃç"i  â×*ô»Đ¶€U¸Ým ąâ(~µ˘+‹FîÔĂżŠ!ß-">.¶Żr ä¤{×Ý(.”çťíí+ěÔwB÷äL֙ߣŠTpţ:p>ÍÇGĆtÜ{mghlP+äDihŰdµ¬ňŔ¬BrP‚áCŔ8Šg¨Ťm5’P{ř–é)Řâý]iĽ˛*m€YwÄ÷˙†¶ŕF)uâ[{»Pč"¨‹č¨{6čʸ+{&ÂŞśj5gŁż,ŽG"e(ĐJ ăĺ}ŐÇ&gëÁ8‡´ds™‹„ŮxĎVdLig°ÚĚ0,¸dl¸Ź±‡ 8{3{ŠČŔ ŰeS§N¶\^Ţ"ČÄč•«·{O“|'žtĂŽŽÇWÉW‰gĽŘßeÔ/qřßţťNÖđÚşâĹţ'Î*"HäčŘ|^öŇ=Žľ"ă] f»R“äôß¶ Ť YëHÍ{}#mŘ*çu7©i1‡‘‰7°ĽćŰ«˛m-v±†N‚6ĘóĽ đŠŽ‘˝ĽÚ€ĹŕyÚW¶ŤLžăte9}~Ć]wY˙¬5şŮęjGNŠŚ·–Óćř4żlâŰłŰ<[o¬űšhtťä¬âřŇčăNĺŰŘÄGę.2lΧ‡·Űgäň÷|¬o8gÖšŘĚ8†•—niÖýżt‹rŚŢę˝^†GŐ~k€¬f=¬ËăBÜrżĄ×ě—Ö¤éÎ }ŮÝc“ĎŰv5·‰­IŘ­©M›Ł–“5×±R“gŮdEgŠóÇwŠŚ„ y“BčNIýkIÍ–#˝jl÷”|ĎęÍ«t|çÝɵh5믰˙oŮKö 7yšćn _ÇĆVp`¸‚÷Üh®oĘŞ"Śk¬{ óʧ>&;±ćcú?dZ3Ănf am—­m¶t]Óeí -… micx0áC†Z»QŰ­‰1j4řń!G 3¤Ł­%QęBYńZK‰4­ŮşułˇÄ’ABĽŘĺÍ„ 2ÜhÔÖ®›LUž<:óćE¦·Ýô¸ÔD[A3B ł Đ„ svť(u—$mIţi“ÔF®\7síÖµ{—nĽxóţĺ«7đŕŔ}˙úő;×đŢĽ‰'vĚđäÁŽ®kYreĹ€{ŢĽ92dĐ“Ëe™Zuęmhţm#aKŇ˙lK˛$%Áť·$Y–xKň­; ’ݶĺ4’ăH‘Eš§`ŽÜQśéÓť3/‚"{uęÔ—CoŽ"I‰¸’ÜD:ďI‰$$ÚŹ7Ź˝ůőë“hOr\učăď;/Ż óâzŻű’8O?é´{.»"şS®:ítPAl0ľôčc/…űîsd¶Ůd»M¸Ý|ëMDO´m¶Ţ„{k¸h“$’«´iâ­"ţá±Ç „ĐG‘#2ąHz I%—d˛I'ź„2J)§¤˛J+ŻÄ2K%ăňůŇ‹DŽ.yüR>IĆüG@5żQč$x‹D–$´‘Ń­mP“;îĐ´ą6Ô2PA%´PC˙µt¤K0ÓkÍEŃűsĚ%هζ’h"7ŻÉq"Ʋ:4‹$ňLˇÉTX5ÉT[u5V%_euÉU[˝UUYk…UÖ^iµu×\­ŐW]‹Ťµ×bqÝŐX'ą˛ĚŃ”6S»T3.6éL+[ćÔ¦­·RČ3Th»ěSŽH˙™•2·•Vˇ—{奷{Y‘w^}ďő·Föw`€óÝßz^_… î—^N8ŕŠfř_‡óť¸ŕ‹VXă+f¤d"@X5Q!uŁŃ1Y^WČI÷ŃĺŞLqk# ·±óÓ.ÍUąKRŹ»VIH ŤxSÉąTIĄ•T˙IĂiFPi%ŞŰ@…T™şęDĽ›ęFĆĆ:‘VŇČ™ě¨Ů©łnűé¨işë©™Öşkµůvš•˝sćZđ˛«~ë°AÄk©ÍF;ëµĎv{í6â~śí4Wo´Yéś DN^őÜ«sĚjŻ2Ű?·âąR›¸ŃN<»Ôł;>‡^WI$@#D´fś§[Aäěâ[ůZyVä–[kD~^é©G^ůơf$k§OtíA7\úçłż^îŻÓGźńó!>ě×/^nńϦž|­ĺOŢpüÁ_Üş7˝’ŃklDD‘4”!IAëË\¦(iĹĚGúSÍpd©˙m¤ÁRnŃFVĂ’ťq+#,a Să;&to^Uó+Ę&—Ć}Mjmpź µ†Ă®uŹiT»WÔqąçńkjmł× ŰĐ8~©Ť†÷r"›Ř ąŚÍó"âŔ„Xµ«Éđ†<4śĺ ¦6*Âltű— Í60¬Í p€ÚĽ˘Ć6­jmHRPhBŤ„|<Ę·QBktP5mŘ™í¦Ó27ÄÁ Žâ ¤ZII(‰ hhC*ޏą«YĎyq´\ŕČXµJîŽ]‹ŢŮÚ`/ą)Żpróââ¨5Y*îrŻĽ!ŢW6]žŹx0Lݶ7·Ëut“ۜܦ¦Ę§•vŚ77°‰˙Ž x3[’ĐHGD’Üôć—Ěi2‘$†xmlĄgú‘Ź{ä:IPgTęRüŚGą±ůKk%š qxµîÉđźÓÜç÷\/űyËkĹýÖ=TDBbkDŔJÖ ¨q ~°XCĺUQzMO†2<$dľ!~o^ţ, ż< Kăt¤Ś“ŘK§·?O>/I)pÄ—Lç#ęČç8ŹTjdA61‘–z*ĎĆE¤ ˇiRjÚ]%“t·śu1­a!ÓTġqčZ+ľÚ4VŚUfµWE_(°±fô¬óÚW#ŃŐ±Ę1mDZc1×¶Bâ­Íë\Q×#F‚Ť˙j-#]WjV´Ú+ôÂ!,{×5b°Ő¬Ú†’EíntśĺH–Gz:ęKČ9’8”s†kOĄ"Ýů"\5¶Řş*놄Ď$y¨¸,ëĄR°íU_ŤóěY±Ďe˘u`jĄ aŃą»6˛-e…JEkVęuϢTF—©@†µë@§+/¦ˇ®Y;/Fń…·én×_qČ߼º°˛1 vGI›Qďŵ“˘ˬJO¦RmĐĆ5ÚUEZ‚¤đîä ¤¨y­d˝dŰj¸µ®ĄŚUŰÜópXC¡rĆĎ3›‰ë–b÷}mÇb31ŰZĚ66Ö7Č=&˙Ü‘Ç?"NO–.ŢŢ‘ś†.Ň2®]}šçäĹ6@˘{‰xcG§wŕ©ĺqQCŤ`µĐDaáVę Q˝m†q¤#s­9¸÷l„’$wµ!Ęďi˙Ăń*˙LeŻU‘ĎŘü3żĆĹ®9y˙ôs™lâ!t‡”FŹążJ'şpŞěâ) *hV\N”8,bK{(äUM_¨¨Ż÷ QÇ9ľ1j.m+´ů¨KkÂW›dÔŰ"á5(¸ł¤B<&ý( l]LŢ*ŻÖ´ť^nzĂ[bµů'ĺéÁ: Éd2˙`üĽnÖŰöAżíľ oÚü+5«ĄĚ?G/ŃM+o1§˝Äµ»dÉŁ2ź˙ŰÖ¸b:yS㲗ÁG6xĎŔôŇ5T&×ňZ¶­őQĄr;Ča'’·4ˇ B§Š|gJbt÷ ăß7h ’P"" 3G„ŇŠ„4 ‚ h0D’†„4$˘ J#n|nsŁ˙ÎlhřąŠ@Z6" …hBŠ^tiÎ< }NCŔ˘[ťj7O6aŚ›˘ăđrYż#ŢÚą°Ílúú-s–uĎáSU¬ďܵŽĂ¨µ‚´4e’U’ËÂŹ)$ą%ĎÇţ1#¸˝míŢRqf¦0kö|9O•¤?í˛-zh®4ž'!ćIw=돮´ŕ%˘ĺ‰čů»n^˙„śâŰhHŚá•tŠnëiĐzˇ46ĐśçTK„íÇľő!ŢĽ ·<{Ę·[Ň˝ibËT}űÜ„64Ás[Cľ‡©ľS-üxŰj— Ç$!ŐGmPWč×ÜMýw>0oÉ-9»0ŹŰcŁ ň×BŔéČŃ*)ęů62` 2H ü¶kú¶Ë ÍÁ=Üc 4Đ@Ľ±9ٞ­kĂ!4иA6Ŕ$ܢZ·­Ă›„±ł["Ń <»‹;ÂQ»ş»Ą äľ­iš!¬»>ű‹JŁž˛1-ăI’ßꑢ:ŹĄ˛ł˘’‹R@ŮmppѰ/ ;!¤ •SýhŔ˙´ňEK±BXľá):%Ě—;˘C;T%µ»CłABWóĂ–ZA.ŰCě<=ôC.ŁAő;BlÂ>=ĽĄ?ěűAG<ŻÚ+\“śLL…úĂÁż;ť–9*ô@øřŘaĽF$kČqˇ ‹{ĹHؓр"ęś,BÜ[: Ľľľ›ÄHě;$äCCÜCHôśŞáÁľkż"4FěŁ:F\F% FG„FaüAE”»żşĄ˝’&42­(ü™Ü™ •1*"©8RÔ !ĘŚ8ŘcŤ¤ň5yä&{˘EĂ) ľ™.-+™6š­™š~!Y¦ŚŇšÉ—Ë*Hzů*…l„ü ČÂ˙ óʨ‡d(‹ŚČ‰ ޤ—X„‡T+‘ĚČ‘ɑڄX`I”\ÉŻŠČ•<(ăA¸éáD!Éĺč5QDŽť´‘vÚw´GJ;1@s„E¤¤8ZśDę˘H̨Xčˇdh†ą‘Łh¸Ęą!ÉT`ÉŚŠ­dÉÁb0ŻüŞÁŠ…f´+°ş¬±ô,µŚ†’DK¶üJ­\K·ô,‘«˝l…hK¸üJ–¤KĽÉÁZÉ–ËZŔdÉJËłŚ…J0-8ňˇŃbqs)Ga)ôĚx:EůBtJqŃÎë’j±żh‘0Z´«ťĘ¨ÄÂŚ(Żq†­ÄJµěy‰˙!jË~áͶ¬~±KŢ´KßTδKâôK»Ëş$NâdÎä$Ě±Ś…ZËěĽNîdLĆŚ…jđĎĹ,µIY€=ßômâóÍ_y`Y*žb+öX(.e+¦_8އŘÝŘá «40š0" ‚zŕÚá-c\N`{Ţ7¦c¦ŕ®ŤÝŽÝ9žc<>f*{é(.ʏ-hVC!XŃ ¶U…ő”o`Rm¨ [řćÚřĎ gÇ“Ľ“3Đ%r›Wc´”Ë”%ŮU–‡D8Ĺhĺ› e˘meLĆĺĄ=ăĎŰ öŘá•ŮáŤŃ$`[…68šUÉ™4¸ă˙a6ć7†caVŕ.ćc&f<ćč;ĆcĐÉ!-óę¦DĐrgYŕ8’Ł“ŢPhÉëŤq¶îŤJÉávĘ0)$cKÍV—EęÉ—A?馼1ÂeŁłl†9OL¶·řYŔbFeů%ĺ}NßÎßŰťŢ6f\a&Z3†QX^ÇKŁq6Şů匦č îeąŢebnc;Ž]¶c˝ĆëŽÖ‡ÂC:"Ë!rĎ1jGjlAęŔżAN“¸8ŽoІ°‘mи°-ŁÄ^îplÔi@⮩i¦yˇÖhhb˘UX2‘’ĺOnâ$nĺŻ.k±h ľč°ŕz…˙X@č%ÉŰ6p9H’ß»‡_Ţh‰®č ¶hcîh öëľîhŘ›ňĘ­ŃL)de6e›ŽF̶0˙Ü­xôáYŚEFi@r3µb›ąÁËvßů=Ę‚M_z_}ŽßbÖgžß–ÚÜeŠf«%$phň¤]KHź=©=ă]k^ţj»vîľľpdćĺ|Đ` Ďp}ĐkűF.kfxášÄnť^ń5 ďř†}đŹsĹÍl^z4Şôβ´Už4x)Ťř.ĺöUŘ3!‚Vpâ®eŘţoݦmPhŕ­í-.ć3nă¤nČÚنK9čm8š v`˙«%c2ĎhŹfcľĆk{č˙đçč]ZĎĂ“šëî‘ěÜEů5ˇ™BÚ«ą@dq!oś¬3˘^” ęŢŚ¨&L0°zgÓNr"°…F¨túŐ_–Ő_U.eNŕM˙t$ţęüŐĺ7hÓF–K°„KHđ[Ř…6(€,€ł‰7¶ő¶Z8Ws;đ çed.ażvnHžŽ˛ăa[štIG0±3¬Ú™)Ý.ŔýÜě ÁqÚ˘E©Y¬ô"-!ş¬ -Ń}&Ů4 jUl…ĄÍt’5s$f_©Ą%çęOżčQÖâÉŤ&Ů…[؎ۆkhđš}şŻý˙mčŤÝ˙ć–9:ąOy2ĽŞřL“ Z3ôbČQŰ$Ę)Ć‘h¸Jg€ÓýËë×ĘVfHËf`­”…¦†…uVíÖXčŃV ~XLWĚH˝Ti…žýŮňó÷kĐ|U—&A…||ůě´§ĎžŔ ęk¨Đ!ć˛BĹŞQ*Fp5jŐ $n"ŤtÓčĘ”(ŰHjC2R7*Uş,I2ÎL×ti“µM›­m˛´ýLňO[9Ť”*u43ĺK›2źţ{ @"V‰qEŐ"F­’Ř*kö,Ú´jײmëö,€nÚ|۶m×­]›vٲd $ Ib˙Ųf°âú,(p bĹNvč"A}—nFĹČk«FŚ al˛DT’T˙µlͲÍj×®gţÜfÍQmÚ$ił¶ Éżm(Ĺ!N\Îj©/WżľĘ†ŁTŤ,˘jÓHM«H(jÓeŤ§­îßőˇô—ŇĽJô穪_ýT=|”šěÚewۦĽ·öćMҦ H AD, -´BöÜ“ŕD™5äŕm6‘?©„†´’H+ &lT˝&s Jň”5DńćŰnµ…Tq1:âS©•KWaȡt`5’F8ýC+ŮJ‘Iş^-GˇäŤyćyóŹ?şŮ%•Yfé˙–]R‰–Zš7ß.—Ü—ß&h^˛KM$H´’`cŤ1ŕdB(źśE´a+bh"€ăˇTŮŘ)Ő¶J۰¦›6F gśŚÉ٨ť-]ĹHX\UÄJ‰´ŃJÔĎŞ¬şşŞ˘@% *Ő‰-°…&Ż[–·žbŕF}öŐw‰.ű٢WmČ D4b`fuJvm•5¶YešA´‡‰@ÇQG 6"K%˘{"UĘąÁ®JßőÔlłAůf)®1µÚ¦S=ŐÚUŇ5És®dUQ,B˘ńj< ;\ŹSţhçĎIUm©Ć˙ÄaŤK»›ŢŻ˝‹Ä-vˇą˙Ęůé•×U ɉcő䡶5×ěçD9‹#l¬Qt¦„Śqř;“‰4δ©Ň˙|ŁÍ5@ŮETx»h“ĆQ)DµTĹOąËéSÍÔaĎ• XE¦Ú*Ă­ âŰżęúlŤčňÚz`úŞ÷ŻľfIBÉř)»—%eę˛ćš-‡Ëś%ö`d|ÚˇÎNč­CŚđl!ĐgTDŃ]Ď´nşín:Ó>şmĂÔ»őö[pDÔ%im¶Hb;î'Ö6őęąă~ßUˇ…ÖHX>_K ŻÚęň¬žäĎ6M"ˇÍ?ÓÓýODErbŁ~źßzŁGźÉËîr ^{!~x*€€DP&Y˙>qkcÝÎĎ™ť—űŻ"Dc* iĂ}îă»Űénw?a ďx—@Jâ,˛—.¶˘XŞVakÉKšĄ®×¨F> ±ŹÁłAµBHŞzXĂŘ&$Ŕ+%áé›?Rľ`ĺMK8ÄaδôĺY(Ó‹ÜP‚«€ű ™ă§ô!ĐžtÖˇj+dËH3ş¶¤i)yÍHđF•8,Ĺ:˙đÎęrc [¤¨RG1ĘcB’–đK*ĄűGđ8ä‘° Á#‰@J”ǰWu­JÔY{~¸7îJ¶Đů·‰kÜq»(Üš”ŕ„%†޲BdFüAFB˙ąâ·bé@i+ŇÁHD‡’IQhŰL¸&Ř\đuşJP°¶ "ŤtšRNJ®˛DřČ:ұ ŮÖÚh5rÄÓ~BÇmxÇ^vÔF ¨’´g¦ć¦XáH¨¸’ ­ †ŰěŢIŽz”ŢŘŁ7ęQ§7tAŐJTáW÷ĽĹU/™Očĺ(’Üîr—_¤// ,Ó%6a;(1 ¤Lr±-ŚZgĹśsAE®Ś°B`a|ĘH÷e:hž´8Ä„ÚíÂn¦#"l/M°pHٱX¶H>ŹJ8iFC c ýÚ#JNĺ‰&ި‹u˘äž’€í-.y”đ…źµUu‘A“ÝBGüí%ö0)8!ŠË5 ˙CWÉÍu•ýŐâĺôŃ!ŃlÄB?š.5vŘâ 7*«i]Rd xÔô€í˝‚ĂL•Lv»•Uo_ÔĆ}†übŃ V4ŁĐhĹ”›ńdó¤Á˘ŐőňŹh¤DSŇĹ”¨—Z*ý$8ÔŁ'›©G'Ů1JÄęŽůs˛ĂÝ!ˇNĂ[ARŤj dr”ÜÍm™ŚúI:"͆rÚ†ëÎdĆġ¬MV#X9¤Îj¶H@˝ÁÇ&‚¶K Q$% Së.Ő÷aŕU<ĂQ® ,O>¦-pťë]ËÖ†’ZMľ÷Ťöđ­obú‰z"|cáĹ›(čšú<9LÁĂ-«Ea$Ł-˙XVÔYtîD¸8®ŇäT0˛°ÄąĎťŔűěCč~÷ą÷qWłÚ'ón©yž¨u°%ÄiĂĄED’š¸„9$ ž…Řk* Ą"E`¨Q*ëL\âqeĹ1Îë@ăih–Ć-Îq‘7‚ §xł6Ţ6$ -O‚čŐ¬{ÖE}vé-šřr‡Iě|¶6Š0o!ffw˝kЎ«bJ  ŤËŇFĎeŕŔ¤‰ŐÝŔƧä†ÁQ ŻĄDRXEŮ”ě‘dÚ0îĹC2.ѡ<ě!ŹUÉ#î®RHĂ ˛<»ÇPf™ILµT-˝Ë¬i(A R oě˘.ŽżĎš4qóO6˙esŘůĺ•ô$A‘˘s-·hpŹľŃ€jEń˘ó‘¸Ś˝¦­_ZŮվ؆j˝y,j¸ëµÓujŇ ŮŠ_§#]6d‡śä¬ĆŰă!w{¸Ęł®Š"bę±ü»S«Z:‹D,"!tzeÝşý~ˇ]¦ôY—Ă$ć)´ lE,"w­m˝ôyކÂčfÓ1^‰‰`Úr¤GÔpcYl‘ĚŘѨDżÖU´XGeń19ą]5¸JÝ5ó8ŚÜÍ]ý ĆňÉ« ^ť|›fXG¤A° OŘǺ͎]HرTálBů]ÂÎٰ_Ë$A+Č\A·u˙‹č‘¸aĎOFŔ€Dľ KŤÝŮĄ—ěŮ)–mlCżˇËŐťQn×UäÔWd…¸"D””EC,D4´ŠÜm“=x ňŐ! ’ŕÜ­Ęť8:DÇ$ÁÇmĎ„mĂ7Čŕ÷ýÂ]hĂř­ÉŮ%HŰČÁ€Hˇh<ýí‰ţ]Š]†t Gđ¤ŔŚ• ˇbk<ĹxŤ—íéĆ‹$˙…T3%ŠëL+xÔ‹ ăHY3H5HCóE_=ÜCDÝáa2Ćť=ĐôEQˇšüíWǸIá0âÍ݇"zß]ŕ ^ŘÂ&dň ĎĄ@ ´` ˙čOŇi†AW;B˙ }QyČĐ ‹SHÖş4`JYJ¤Ę‹˝lCäŁy­"ŽMGxĆNRDECĘ‚5ÄPßŐCÜÉĂĆ]ŃedĘL=Ħŕý8ÄíąD#4KH]Đ`Ń X‘'őŮl‚´]‚9Z ĉ]QHÔßfĄŁI‡¸<ťĐř‡ľ¨bÁőMˇÄÓř†‚1Ő¨˝HíÔE$ ›»É‚»É[]xĺn0X * #\„fĺ"’“4ĽĺFßęáÜŐa2Îĺ3âaˇÉźüŃQ°Qł°”Ő â6â÷1[}`X8ŇäĚÁ´€üôF5ĺsÁăE­˙XGH× YJĘnś›$¦,|ĺ}ÇŞŮÎX®›m1P$tPČlń[pĚ v ÓM4?˘DYŤ\…ŹŔÄ ¤Í’µ‚DF=X$«$#HÎ ®JfÄĂr‚d Ą _ĆR5`ĹÁíŽKŢÇ7ڧ!z_ú$ ĺťß$ř LÁLâ PDÜO'Ú_ÎŢ5m#ĚŠ?ĆŔ(Łô&ÝŔD•PŘŘXŠä[שUžIpM÷¨DqD©|±WP*ôb#ÜíˇôńÝ3^äňŕÉžĄCX¶u îĚŽ}ć]ڧږçÍťŚšđ܆YÁLA%¶ĚÄݧˇ%aFĹ˙ŁG¤ÍŠuH„ˇqD‚8LôQkLť>¶DěCÍQ@ĺOŘ‘pPEUi˘qč^¦AZr„-uÄq&§Ű… ăś G’ će Ý;ꌕś[öĹ"*#˘„-4¬Ú=ه.ěB˛l8VŘ-”_ůĄźČÁ@ \"üĽá UC'ĆŁŇů¤CđŚĎĎs>…Ś8KŔ™×ˇâ?°l5¨mnPĹ,ţźŚ BF`NU„ÇqQ[ş]4TCFâ]ŞłEŞD"Ď9Hâ€â ˇ§†ä¨ţŹę ĎŞІ¬ęLěę3Đ»ČęNĚŃO|]íáKw–¦eW×”á5ˇžŹüH/&gŰÜ!Ç"ĆóÍé‰R”őá JP†„â÷e#V&^”@řĹ-…m‚»*€¦@  A±ëUpjá’@©¤ZCýi¦eô’It@Bľ˙ÓÂş^©ł¤Ô¨Ž+Z nVšŻNhJ`mHĎ’r-ś şs˛J‰ •ť6ß B« nÇ~a›É˛¤nÍNxZ ¸UX‚tß™đ…BµF$žŕ6 ®â\€Ě F+@®äŽę|n‡”Š_ ŇŞ„Ň2ĺyˇď?´"Ô4VRĄ% ęŞY‚WĘ[p´›üÎoýŇÎ>lŹ$Lg+°©XD‚ńEC\ÖĄ>\ä܉­tÚéßi[,íC•E$ŔDYdPăm+"˘$¸A[ą•¸Aá ć6XÂ%Ü‚wÍŔ Ľ¤@@`@hęC@Ô-´AaXĂeÂ+ŠŮ˙ź›NÓđb©ÉďiÖď7ěĂ7äďjÚ…UZĄ˙Ęo÷ÝďÓ|ťęp‡Ő( HŁ€ńÖ­Q#DÁD™ö*•MłdĹgx(RdŢiŢ1D«(Dô„\D;î—$ŔAJ"žwYÍ/Śç6ÚEa"âo ¤ÁjJiÂĤ›4%—šRHÂ05·nőÂçůpü…Ţ]u + 0u@]H€ĐMĂľ/eJčCK]ŇŻ9VŘIĹ…~Đ»sł„ĐŔđ # 5r"'\ćÝćĂuŇÉ F4ęßEŽĺ¤ňDÂó–€$‡/dyră}o 4TŘNři˙Ą$»É$7<7‚żĹĚY˛›Ěp(“Ě5B%Ä‚¨*ÝeP 55}&ë˝ 1+¬#D©R s•~đŐYPĺ ÷ĺĆ‹äVÇü2ěĹŽtĐšgtč’e`0şĘ[F,H™GDüIă0ĂĘt,@a¸ˇŰ˝%÷Ć~Ů~Y°$¸I ÄDXB®ňŚ˘¬]Čs„€âÎ…$“,T‚,ÄA$0JÉA»˘Ć€f/ ô‚DA ô0ě÷ÎëĺŚ"¨¤˛W”ŰĐHęîq0Ę™ú’6 @BmíD ěüĆa)EIeZ§¸Á§ Á ”4DN¬ěÖŰŐ|2¸˙•CMŻô&.hvgŰm4¨$Ł0‚wž,`+RÇá!^ XăÍń„nŻ“â$źbkiÚBfُlK&o1Ş-84(ˇ›tD¤Ťa¤ůآé64I1%b§„1bxř—f-ş¶>žHđچ4dĐx„K¤Ă _4” ábŞ[mvgo6~Sć=[rwşÄVb«YČA:×…ÇP´Î@>hW;ţBqh†fW#*YW”ŠGđLkYĹ7§ź{ . ˙¸:)…”SOőü‡â¸KŽ•Ü^H“SJN8%šĎŮu‡ şů›÷…$řG ÝŁç}/gp‰Ł9äŹü9hŇŽjB±vX<í@ńŞe;íTq$< KuÇJQ é \ǨşÔ2ŘÄX|$lĹ!A¶G¬ŢĐ€N_伔ëĽÎÇ‚,ä|YHYĚŃĎçJ-[KÖĹ1éBĽU÷˘ÖÇ®ůE‘·Ś$@)vʧه¸®3bwäš&H_Čňm7‹ĽnE0ÎTˇ K‚¦ĽˇŁ<ËË*w/–nřD2EUÖÔK´ˇ„…*´e °Ł ńuH“S †#çzř}=OdĐíI˙Ołő~ů4Ë˙î[Ť[±k٦¸ĐŞâ€ŔkýyÄvŚv#Ł2Ş„ĺĽ.Ś}YLË@r3š>H`GH¬¬}\ć:`0ĎŮý=á_aČçĆČ‹FߦétôŤŽk `Y|e„HŻŘ×V]M©yĂ6€żř—' ‚˝o<ĘíµÎYtł4Kip vąqĚmCÉĽţ˛TBYd‚-ŘsĽ@$řOŰ7˙üýÓ÷íß¶oŰti۵m—6]#îŇeI“Ą‹–8Z’‰D H’ž5mú`Âô§Ď_˘FŤXµbÄČfŁD(Ýü:ÔM¤6‘Šşô_ŃŁG•2š˙)A[ŰdŮŇjK’6kŰ4$"őRIT’•ÔfmŰ6CQhe“ "F©ć¶J«Q´hŐ"%j7M[d—îSüOqcÇŹmµqÄ$IIqfMܶůá·FrÄEiIV¤Íş´ĆŞ«V-mB%‰ őuBˇ…zÓĄ#D­·Ů±dG«&áz4ůq'¶č8nÍŚéŹ:ŢD¬x6j“¨U+”‘¤še;±Y7nËSݦm˝$[˛H_eź„` ˛ă‘ćG<Ţ­$¸(őb6¸kD/c‰ĄšhnJ#®&’8 1ˇ[¬Â}Űçš8i˘Ť$˛ĺÍ4ۦ¨dO’‡v±E“+©˙%“×ţL´Ť¶aJ„Z/˘1˛ĹŁ‹ŚÓDHŽěĐą¤d[Αéh˘./T°Kă&Ľ€’Š?ţö[+ż¨´DĎĄmşbO›®\jB,µ¶\+˝/«*®DiÄ®F¬«ł•HZń+›LC 1,4C +ŚĄ “HĂ÷vąełÍvů&I’€€¸$y”R!# 5[h´EĄ¸ÚĂöńCmŘcL7Ţ€ĽČŢ@iŁă””d$NB©ŤÂhšŽ:Tt˛Ë&›Piä;©ú#ŹÍhëo˝m¬±„=—$ą–ľmP¸/Z˙ČBK?9QŞ‹WR1N4‰Ą•Xš‰¦»TâŞlPÄlc˙J±»‡&’PH#‰"f˝eÍÚĆ#7RHˇ”äĎ͸’…CI.ę‰dkBŁI‡˘"‰,ÚM"]Ś#ÎH­Î=fn# S"™¨‹ FPqd»î~F%K¦Úd«Ë6—vÓšeµ˝mŐÔ¦I°ÎÚ?†räZë¬ÁËQě†˛Ž‹xŰĹ«xŃŕ+šzó t_¦úµ-!ÇfÚçž}`Š• ®h—MnĄc[â(gDZq›[H"†ţů&"ŮÚČhł’!â­"ŚR®8e¦Y8á˘h”@Đ™çžőaĺgÁđ4J”řÚ? säýRÝ ^ěßżľ!3»ş˙j©Ă×˧Ŕ»Ď¨éÁDÚ¨9[i’ťÚÍ>>ém¦•íŚP* ‡ZL¨˝cŇG﬑¦‘rTŇ,ůM#ŤňÇ:S”NąÖT¶°†P`ĄŤ6‹SްĹnĽq›”)e‚CÍ®:˘á̬t¬Xt—›XŁ}úhO ź\ %IŔĎQ–6=Š z3ʶ΄Ăn]% b‘Ăg!ˇ!BäĐ[Čb–¸ p0PÚşĂ'żÜÄFpáÜÔw(ˇ°Š}îűL¤a 7(nQ–±Öŕ#$‹h#ď±Ĺ˙8%‹ĺÂ.ŠĺvQE”¤1"”»Čçţ8A‹äOf±…é˙8x:™ÉAu«CI#ŇP ( ¦ ¬€$‡ć+ňÇ H” ‡8$D9x’)_:‹›b2I-‡°˘Ź6JźŁü1?ŚĂg>=©8e‰7ŮI#xâ=đ˝m.ÎB „ć–!ĆPUţč"Lži {DB .L‚s©J€ä0’,ŕ(,¶Ô˘ëŃĆ>´¸Hŕ,DH5”Gˇld˝Ů FŚÔt$IŠěg%ä`‡& Á‘HCd!š, ;uŞ 6Ů–8IĹI·ä.™B¨`ôx×8ÓfŘÓ•ő| Nú!-ÉDP1‰ç‰ ^Ô6 »tg^±řK,°tLó‘e1 Řf˙ˇÂDŰi„ ”*íh‡ŞIŁG™/Ô ĄŽşŃ9Ç9\de?˘ŐËy:ăřŞ™¨¬ ‡(T1b‘xťÚđÔ TüŚ|mCRłŇ“’r)¦”ÖR\r¦÷ôOý ˘%‡ĽVÔIK["w 4 Ľ 385¦A ł”„°Ş1BŘ33TTĂJ.lBaN‡éĹ"±xÔVš ›c ‰ŞÚŞ$Ô0Ęq¦V+$Ë yśDÇb•(«¤°Ö(ÄEb’x]^đÂěŘÄF.”„,‰xR\*–†ýaʵ»•2mă•×Ün#Ć‚˛Zl!žîr6ž°b/}YPö~˘S,˙2¦™‚ÉżřćE •oÖHtRU”H4"T’hŤóˇĐ&BµřGO” $XĎ.(ô×ä4;ŇČ·zÁCĘě8•ŽŚk‰*Ř!ąR ‰—D)O>šťŚi].‘E»Úm/µň´kĆ+94lC»%î~r˝éĄáśÚ4Vhç:@f5¨(·,~Ń}{3óg÷‘} UoŽź5d! Ő¸kut‰ťďĽ Ů ˇ‘¸§lŇб-Úr4"ČŽ˘2ŚňHýÔDbLłűɡ U8«t¬$ldÇÜi¶7,éÍ®mÉîy§Ś´q}yfZ%{ÂbµĄŹ˙x×Ĺšńľ±KéŽ\˙@•MXˇ¬6P‰5ýKĘg őq6ŔenĚ÷Öl1ŚŇxm‚\5<{Ď{fÍçBF[˛XÄ·AôV-ř@ʬX‘y´Żd\+XA $Á„ C*äŚ8ˇO°#¬’5„xÄ3ž®÷Që¬ox`#ČWLó4k$Oj áCčýÁćÉ ÷¤—ěÉ‹ŮËW°¨†vÍöXs›câň·ÄÚŞĚaRs4ąS‘A B°© ” -ÄQŹ6ÇŞśĚ …$č€Ü™őÓbrHkęzg˝)hΠťUůĂ.hđžO‴,?N˙鵪kČѡ´};ĘáµL^‚ˇ»ăY;S¶D–ú%Târ#äU»yőI|92‡r7Ç”ĐŮ7ź¶ŔrŽs—[~Í3Ź ·ó§‹L %!0˝°*Á†lîÂŮMÓďąŐÎą¬,nŤ­…(Ä!­ÉŤÂ×[€’"l§Ô© đW‘?‹)ýqJ-UÄż/ĹZ^نiHµdlٶ!á’J‘q }[†]¶"W’Űk.róWg,ť÷ •ŔĎŞtčßr{ŕçúp nGJďôO•.GŽ`o‚N H4ÁV@ÂtĆĘä@ (-Şą¸ÎëŔî„Ć^Ř@äňO˙ކíV-Ąli9>ŁiŢ‚=¸ÂLr¨"zhĆB*PmQ0úâ€ăÄăůđÄm¦č&ňĄ d1~ŞŮö†ţnN˘­ íćţ‹Ěr®óÚG"Ć`Ň@b¸PqF/R  Zŕ´zH‚TFśîžl%ęüÉtĎć- Ş€÷*° ~/‚OS€ba&ň^ˇ;ě‚ Źú’f±ôŞޤ(Öâ®e•ľâ•ěĘVę–‘±8.mX!Řę˘;ĦŞa|¬ęń"„ĚŢÚîóšp ő/ 1Źł(ďćĘ"Aq & 'bčGbv±Şi‹^oĐmžęI• ¸ô ź,ë˙ŞŔ ô`÷˘­âëZ b+%PÜJDŽ Đ vˇ.JpîN˘.wéKţÁ*b-Ú EŠűh,Ş,Ő–b˝Ŕä˝~&„'x‚/¤˛ Ę ’@ţ%oşťP˙ÖŚ}V1Ŕ¨ŔdÂ}ŇRcŚJŕ`V˘ ąđçv±Dr+>fÄB7,⢠ţČőč"iă€Ňä)ŤŇtOcŕĆ«:ŕë—v˘Nq(Å݆â[ )Z°°ňNyşŹ,©˛Ę8ŽvşG/ŘŕläŦ*Ëń!b -ďňň§0ŹňňćŮĽh¨ Ľpô"f;’~˙FŻFo/ąđޏjGÚč"ühŤ,(¸Śc‘D ˘€Ć¤±.÷L –|RäÔ⪅"iŢ.«1ĐâäC VHóɬkj-ÄBL5Á†\t-Ä~çמ¨vdjOţÂ^HPřŠĚÎló`qÍJHˇ ©ŮC¤bö’.=r#$Ačęş 5\enV2;…ëĹ$ëĐ '«±®q`ôʤ]ş˛ý w\ł×0G N5ď}rÄÖę3}âËÄŁ˘r>şŻ˘Á*µ—Vj?–ĂllĚ.ň/˛ç˛Ć’"őF¨VńĺŚŔpn ˙›Í"Ý̤!+Şˇ1ęh~|±xń.yŃó$W‚>ĽAž,9<¤ 4ÂUŇHRŚHr‘ęŔę˘ŕw/Ł t/.J":< €©J»%R A+j?ÜKQ©d¤¦ |dâ`űľ…Š,Äo9 ŹňA ŻO@Bp.ľňŘ )P$IŔ\ÎĚÎróÚl-Ď- ĄŽ¨ ©’%…ŠE›Ó#]Ô.et/?¤ Ti3ôČ­%]ŹHlĹH„ĂÝęŕ¬rŹë¦Ńd ë–Ë9¤Ä=ævójĆĄÂ-”f)“âV«"[°ĄW T˛T»žăÔ.Q˝8$.‚m^˙nâ=-ü"ŁŠ Ú„“C]8§móZ.ß’[*ŁRhÍ$Á ő2`”#UF‡n#?äíś@6đd,Če¶Ât*!(P T•ŁUé0d#:Ř“;ŕĄŘ¸#§PÉÖŃ\@NŞçxľ‚LĄćLÓD,Α)ŞŇĘ,q‰ZA¦1®BqApJ“¬č Ck8U[9Ź-ď,FeT/Kŕ=Ú .źSą°.K R…áC.ź´ôžtSÚŔ+\oS/hÝI¬.ą˛®–´ ňp'YŐŠt‚ ŔŻŮWÇv)Ě„-T3*GŞű˘d™˘ĘvĐ“%Üs@˙L6ůÄO¸#.Ę \aCŇeó8k~ę #ŐfŐÓä’f—gUb°TqdAšŕ Qb/…ĄŽ,¨QŁŤbfҤ±.4šŃó‘¨ălB0m|˘+qGbË…bĺn*l—Ő®"¶ÂHs÷üâÖ5ń* @ÚE]ňOçĹBő"_XöZaV[_1f)ŻÉvŃg›>3"r{]ůŇ$°4b¸Â ~ÎIG%Ň@i„Ü$"ôňçt|…1Uµ´ âŕ±6.â€:ئ;ÖN[¨ČŚR(lwú†"Ąâ+´Á \ cé1ĘÚ˘b‡n‘Őhł]ĘÎ2óVZ˙#.Š Z — µ}ÜŇ˙lkQ¬iŁó\W"{S RQ«2ĽPb$ą0 6%=N¶PŹÍőBŻź ÍT­Ńt™¸ĐÓޢG€ĺ+ńäSMq)L3*wk—vĹ”=0Ö%ČxąoëŁrM(áwÔ8+O(ůŕ%/ÜfA¦z]!pĎŇ!ďˇCqN ýĎ’ŠQęr†©3{˝ĐC*ă†Ń•›“.g8‚ÖWר%!B|·„٬FU÷TU'ńW'y’\šemę„/hJ3˙Á?×x)°(Ęř»pW?ĺ#iŻE‚«ďđę>öĘM9 ç¡€)ňt}B„Ó đe˙s Eë-aÂ.ĺ´’ę(–㮊 ‘§F‘Şqax‡q¬$ÖWq:é¨ô(f’G˙’Hş‰_í`“3—Tu÷ ŔĂ`*(«´]†r3su-x3Ý"—Ă„<¬/Ś×cÁ‚ čă ˝Ëx‹—đ:YmÚ¶! }Üań4˙¶ń=Po‘ÔC´Mđ'+TŤşżDÔQ˘XŤ˘YăŮýghWFă•&Ď˝<¦óĄJŤ 5©µ¨Yő9jĺFnŔ•Bv˙‘PBZ`%Z ĆĄV_†@’„B]g‘ŕF’6Ř.¶(FašX˛b%vÔ!GUDĹf6¦pÖOŤ´Q iţüăO"Ť$ÂJ+Ş%"# Ń†oLŇvÝIżô‘B%ˇÍ- aIśEŰ 0RuĽ…&o)ýÔJ#©¸–H2±ÂHN±Hc‹,9ýTDCÉÓN<íČ㎟ńČWß|†Úw_ÖŘbM]|AX_jEiĄyŤU„¤u•đS_+×O+5q˘aĄč‰c¶Řa‰z´ŠY5ŘŘB *±Ä˛_V¤­©¦šl˛Ú”Áť”[nfĺAĂérM'˙žÄ6Ölc‘6ElÄ-LÓ‘)oŮ­l*CÚ”Z‘‘Č"Ť48E˘^®%¨;€úI}÷Mő”˘ÚXŁé¤bz©‚Ħ‘nÚ)§+EkŽĆa*>¦ «­ÖEłÖŔ™­¸ŠZK$ŮřJZ+‰´Rnx°Q,tN&[vĐ TĺµÚ !*UÔ 7ű¸!-«ŇJ©u‡$,q˛INŐđäÓJD ‘  €Ú§3ŇôŮŽS;1…(~ÖTÔDcý„†ky­ŔŔ›ÂĄđXIÜ@‡ SŔ¤IH‡X|“ÚÄÄ©¨ŞduX!‡±ĆCš€7E$QDiů#l˙°Ě$/±3A‘đFólHOůŃpĹI›Ř@a{Qű|sű>Űl3mď¶lłŹ7Ŕo»ďÓŹDIč p±Ô‹,Ń×"K5ÖXÓĽ,I°I#˛eŤQúµkO4÷le˝=WEĄ gź-I$Ř–#¶Ô˘#I´Ń†# Ř…Č ě_ä@ż&¸€ äßţB$‰ŞPyŽpD#Ld‹ĂĄH1¶ČÄc,a‰J„đEr¨„ܤ<4Bţhß?†CšHÄb]ҫĮ¤·=Y4g‡Ľ3Ţďt§ŤŰmC>üaq„¸ß=$"´DUdń/ ďú"q7Ľá]1xŰđÇCt—Ĺ˙ŰéăţČÝ7¶±ĂÜĄwg<6^ČF/˛qŢ0#»HĽ;΋mĽcáÇ}ŇŚ‚Tă ×XČoŇh<$ő±H2⎇Ä"%Ń(ČjňŽfÔŐřF=fňvA¬cwFÝ]qŚVĽc·(Ľ1†xuĚĎnY GgşĐq~ąË‡čěl?fݎ kýňl»L›©Ťßs!ĎTć3ĎĆf^s™Đ<›`¤ÉLk&śżĚ qĚiÎ(Žs0Ú4§8Ői-ÁüK™ëÜe=źůĚ^BӝܴćżlILu2SĹ‘§1u¦L‚sžÄ‰HC‘„f0" ą–—´± „Š˙3"·(Ž4ˇŐĐdbSg݆`" ‘df©8ÖÚH3ú3dFTŁĹˇfD˛9;i¶”w»»LˇŐRâđ”"C…iq"Qk1$¨)S1JÔ”>¤ŐéMŻ%ŇĄ^«¨[µ©H ŠŇ¦"ôŞPM(VĹ:ašT©×úÝ7X*ĽÝ Ok-ÎO×X\é"Ĺj.ZSâ0$—ÍĄ/ŁąD˘fP™(ĄHGk*OdĆsve,qJÚËźe4— i`MĘه.v0m©_:O[ÖT eh.UĘ˧2VžAE­$öÇ?ţŽ$ńkâ‹x˘ŘŮ8ňGNčŔ$ áwúřë-φk]ä—˙¸´ĹDŚÓśJá-IHC ˝›Ű˙M0·ÜŠDJ"‡ŢĘo˝ÄŽ$*á^ŕ8qľ±KĚpOôDČwż˝»O4ßi W© »ßâş—˝Ĺ-®Ě+BÉ€á­pÚ˘ĽĐ(7 –& ‘¶m´xMŢ˙цâDâ!(F㋏§xqxŠ“â·¶V.ń[§ă‘€˛»#,DlˇćhC)P^q†\śŚľ ű1e#úâ_F™ű(±P©›ËS7 łós‰ĽŤ™Čośňš ËŽk”ČúČňB‰ł9ł¶YŞńŮf:»S6—n¸ň.ŇŇčj [¶¸˙†-R ţ‰8‚f‹M\§_Śs›wÇimĽřĆśNŹŰđ»‡ČBDń1ľX{¤ĺÇC¬űşćŘ‚m(“ Š­Éb´Ëó¨¨)âĐÁNš˘¦…Č7RĽeˇľÓŃěc·ÁibS­Ű3CŻŐV4Ć9¦ç´f·»ĺÚľ8Ůg{¬ť›Ě.+ł˘8®é`S ŐWkcȨ^2 $á]/ oÄŇ?ţlé–Ćł‹1.čŹxâ“K˛öň°úPß ‚ć%¶đxúe[VbĽ¤vfe-ß@pĄĹPň†u›-6PU€SWLmŐ€HSÂ$t&z 5nÁÔr˝ä†ŽĺZçFM+…R]wSČť%pq-¸ CÖqiA’€ţ3q7pmćz,V-úpcÖw)¦iS×u™x„>v˙k’°îĹqP6;íöĺPE–@rq[ˇÁ)”6vvt@ş%Ô rŕÇŘ[ęµ`á^`ů% ÓâDŹ1ŤŔŐQÓ‚A·ĐK˝L¶ŕ_űĄ_Ź!`u2_ÓH`ń%_ Ö^Ë(6¸Á?ăeaÖ‹űIh %0Wo:¸}‚¦iB§'†hˇ6jÚpwG8vł“…á Ćk¸>"‡q‚†ÍńeD¦3×ŔfÉPµŐrF¶ZeXĘĆNĘdTKUG÷Y!iX¸ÄfŃ&SQU UMZF’–…PQU’9;(5hE†L˛€˝Ř?qańóD•`T•Z|†f=YLłÓ“ٲ(Őh_‰1ŤčX'Uq_ŐČ˙ź÷ÉźŇůeŤ÷;˙iŤ&\O„ŽOtź÷d÷ĄźţÉ űYŤçX :\úąˇAA†ˇjŽż•öů:`řĺDřyˇ: /j ęˇşˇóT %:Ť-Ў8zŽ=š_IL™ő;Ś÷}ç—·öW©ÇLőťEu˙G>Lu9’ĄőN䥤÷mŰéLQjś‡eĄ:X4ĹnŐ4ZQBą¤`ĆY8M¸mTęgŞ‡Í Ef•M_vM?ŁMÚ“µG]Ůň|eś8h?‡†L÷–­O„*—?W§™ĄRŹUzË™V¤u©XĺKÉv–ޏw‰| ŞŃuAĘVČ˙ž*ĄOŹ©¨§sQzŞ"ZŠŠX€Ąl™µZ¶YdÚ`¤z¸‘p¸ AEMŰ Y>™X…hT% ÄQb+f VSË:šŔE“éLűł ­±ŕ ÖĐ ®đe×P ŰPuđu źÚđu2w§LĂĹ«± Hx|aŠŞe hŘd—%’l™¦ˇ…Ż5tĄUťCů¤dŞ«őNaʤʉL›J[Ä”AĂ1¨˘!j}·Ę!±6Pp‚i#†zo“d&¨Pűö˘ůk#FpaXY# ŮŞWÚĐ Çş µ`Ú fč‚uwo°¬š…XňC˝Š%?sm‹…«°zNč9®u˙ĄÚ©ěTy×ö´‰Ř°=‰z›UR®Ş©Hú®ÎĺY†Ju©’ą‘G»¬!FpĽşb+&iy”·¬Ck©;—AĚQ¤˘ć‚‹QÖ0bb§€űÓËŞ¶€­ŕ Ţ:ł;Wcĺj qPăz6“ŕ·°@–u·ňšArV–¸©Vh9VČć–xT¨+Y‰|a…şXę´âäKéź=Ů’ĄĄžŠşâ¤°Y0Y‰¶ ^¦Ý–ýřK·őbáDżŞjř·dŘRoĂ +6ţ¨±üCW—G'ÓË+Ůş 3{6čú;ć B6¶ ’0 Ú0ÚĐľĽŠ|‰±ľŰ𶛂J»Î‰˙©°µť°l)‰żçů—‹5¬i©çٵŢÔ–Č7¬Pn;'«zZ§!Ĺş(y )+iŐ'*Ö|ö;ťrË«t5ÇR˛űcł“‘};i{ĽÇöÂÇkz·Dp¶Đ ભŢz6ŕj"u  –Pő© >lcĺżShń\Ń´¬~koŐYŠ•ĄPŠZł›Z:S©˛šśµIYty[Rq:hC'¬ş›X¶Io5ů–°šAŕ¦áiqöŰa ĽŰaXv·‹˛AÔtC•A'{´lÖ«ŐĹʫn6;&% _9”Ů)mmź@çĽ?ÁS•ĄsŠ:µţ«ŻřO‚©»pE٤U¸©˙‚c6Xpř›Ě&©R|“ľ¶»“Ĺ1Č%­kël¶f5´ŇtQ¶ĐÁFˇTEÍ1FąSdl”;AtFUÔJWdEá;H$<`ÔytJşSEbÄFÇLĎ>qPLTEx€¸Ŕř<<8@@@|€ĽĽ¸Ŕü (,(0,000088<@@PPTPXTXXXXhhdXpxx|x|x€€|€€€€€€€pśś  Śh ś    ¨h¨ °¨°¬ ¸¬ ¸° ¸´ ¸Ľ¸Ľ¸¸Ŕ¸¸ü¸ŔŔ´¨Ŕ¸¨Ŕ¸°ŔĽ¨ŔŔŔŔŔŔüŔČĽ¨ČĽ°ČŔ¨ČŔ°ČİĐİĐĸĐȰĐȸĐ̰Đ̸ĐиĐŘĐ؜؜Ř Ř̸ŘĚŔŘиŘĐŔŘÔŔŘŘŘŘÜŘŕ ŕĐŔŕÔŔŕÔČŕŘŔŕŘČŕÜČčŘČčÜČčÜĐčŕČčŕĐčäĐđäĐđčĐđčŘřř|ř€ř ř¤ř¤Př¤Xř¨XřĽ¸řŘ řÜ řܨřčŘřěŘřüřü¸řüŔřüřG_7tEXtSoftwaregif2png 2.3.2¦Q‹ IDATxśí˝ŤăČu'öf"Ż4Y)Ţd†«1 KZě4ŐĽ˝ä®Éś Ż}’uş9j­;™tä“âÜĹăĹd/g‚ń×§ŞđUU(řxEÄű±ůŃ řŞP|żúŐ+Ô#ŕ $ü/@ŔÁ§˘· ˇ~P öćź׌·EDGq”,)ˇJ,zűç1`Ä­`جĽýEqçLć«íW}Gi÷¬ęůsVłř^Ăâ5ăËkĘqŚ,9ˇ‚ú˙ţńźţń˙Ű˙‡řý˙ő»ż˙Űßýö·o˙óŻ~Ĺ őo˙â/řCřśâxę–ôE •˝Ž”Z§/Ťö.Ţě—ř„ ŢýăgÎ˙_˙Űßţć?sÖ”2âYrB˝ű§˙GfňoýĂ/8ˇ~üg?âź@Ą?–¶ä”·~¬ívl§JűUÜKŮ=ýHňśú˘€‹7űţˇ8?ř,ăĆŰżć¬I‘ÎŢĺŚČÉň{ö.gSN–śPń.˙7ű—ń €ďňË_ýâ—‚PĂEět‰Ć^Ĺ,Ş%ĄűGňgRŢ=X˙TľłşíÇŃŹÍ‹źTv×j8J$;Ş—l Ĺřô‡ßýýoáío~őKΚś9#˛·~˙űYrBqůúĂţëďăO˙ęířŐ/ţúç?˙'Ô—ĂEÉéť=Dâ˙—˝É»©˙Č;Kć5S‘´A-P­@l0*nUwĎŽ {Ž’ówsí†A€˙Ƥäw˙ĺ·oáżü9gMĘ1 űŤÄcdÉ %ŚZěň«x—»ż1Ô—_đO J¸ţW¤X©že®«ф§4ŠčŰTĆOŞś‹ň˘łZ}©•żHßąxł_äOŕđ;AřĺϡF¤ •3âČ[ˇţđ1#%÷W?űŮO…BýŮ—CüűRa‚¬2¦ÜąŔ6… ™“>U˘(ßQ5˘Pµ:•‹›ŔĹ›ýślüö·˙…ŤÝ~˙ţç?ĺ¬I‘˛&gÄ‘·$Bý^âp’ţěŻ~úÓżüKN¨ Q$żJďůCúľüNĽ-{ˇX)ZW>%˘(TËÓk%×ěGúަ)©ă ęoá·śO Ěń9kJ‘ż•ÄNYrB%#Eö/3 ĚčĎ~úÓóoţ5*!ł…PşáRB™ !ÔŹÔšj¬ţ“Ö°‰®‚Pś:lěös¸cŽĎY“ĹNśOl@—1B&‹€D–śPźLţńěçl—˙íň—˙ZęßţčGüűQ3Jî‘ö­ źŞ~/ŮŞ ”T•éĆ‚té6żĐź Ô˙ÉÜ?fs|ΚżĎ¦ĂźţJbDöVJ(‰,9ˇ~óŰ·o•ÇNb‡˙őűWśP?üłńď‡?Ś˘¦`>)ţMďů‹jł]ů‹(·"+ů”lÖ´­`0~!oU>ţCm·´Ô|‡ř=Ůčĺ›ý‚Poó~Ĺśźą>s|ΚRF#K•µ|ţCÂĹQ #_âŻĺ+[ťÄđÖ<ĺK \ Ž RB•sŽ@ TGJ¨;ĐD(D(D(D(D(D(D(&BĄ+ţŘ ăg’wă—b'ĂŽŮ.5Pü3Sż€#V Ś{5-3/ŁIË:ńĹĺßžé{4ęČÔÍ9Ż űÔöł——™iěF«•ĘnÉ„”P­Ś.‡V„Ęħ´3Ź÷eîż#ö¸Ó_¦oBVĎr'7‘⿤ř¬š˝˛úçď%ź4®›Ö>U(Ňđ¤ŰTę%ß ť‡És´ďîˇLß¶<Ü+ňIĘ%íb|™ąlq<ĄHĄéÍŚ )# öJjş…R…’M«µ7Y|2×ŮĐ„îCí©eËPC%ŔqÇ©D¨;˝r%ţwĘ9!cÁ^‰·‚R%ăŔ2;Ę"™î´íŇ“V1Cł¨íš˙Gč> ŕú˙:­PĄăąÖ„:ÉKą"ÇhťíX´gŞ˛ŻĘc‡YÉj ĘvťPůŻPěÝťZ/"Tź:[ţ˝7 T‰Ůö„:-%Ç•sH:PłŮňf©N¨|›a»N¨Ü„Iö”zˇúŮsîĚž‰Cdőeâ›ęŘ`ŃD(SŠi˝öG»cGS<"ón„N˘č9c¨;ůsĆnV6ygö…SB%•Ńť´hĹX‹"ˇĚöL#>iL¦INˇ#qóOéÇ'í`,Y&QÖĚD¨ľ@űö$d¸ę•ä¨Ë(¸PéTFąŤ;TÚĄŽŘ9UDyĎĚjuűM`Ă&á|0xNB] Čs ö1 BŠ@@Š@@Š@@Š@@Š@@DN¨×ˇ%$B˝#-AC>D(D(D(WG¨’`.µ˝i˝°Źç”˝ôý’Ů«’Źť.Żją×#ˇÎ:ŃwiÝߏ‘\j{Óz5ý\S{ů+–WµÜk™PĆFí2îP-íI BUE ˇ‚®C8ˇZÚ“,ˇZ ·„Rë[‹PRRXKâ€aűWZÍŞ× ĺsD¨Ë˘”PžűĘő.M›rś T<”÷H·łű˙űĎ&"()ľŐ`^ÜţŐWĘţj˝ô‡ŞNP>ôĂ”í)o •|üéB Ké˝”P_IŤóŐťqżľŁŚPŢü‘ݺ˨㄂ÇÝ@Ţ##ü3hŰĹ[˙â‹Ě+ >3ę+yą^Éď(ě}ůe|/ű\ú©ˇ"SÇ!ňřóÍD(xűö?˝}űž<­J(ľçťô\[ˇľĘ‡=ż3î×w”*ćc”ëşž›z1Űó’$’q”PÚ„ĹťL(¦Oüf"Ŕ_|Ĺíâ˝âţđYˇrFiŽ wÚŻ˙%źűňK•Oµ:řÂýťÁýÂł=Ć'ƨ·˙ńíŰ'&…zňôI‘POŁ'BŇç´Ľ§Ož<‘ďĺCľ´qľú*–ĽÁĘŤ$x ŤşC§S„ŠĄ[ţĹsÎüsqFý 3ˇLŠöY9ˇ2F鎬˙šfú9ŤO&BA1öc\bĚ‡ź¦š‘l÷\/ů Ľ/ „ýĚ[řO±FęI¤0*U¨'bźôąA őN4NʧáęUô8ĎnnL$•>^_ďäu*Jđ(e”B¨Xź2ŤŇc">ę+nĎ]9ßÎůTN¨Ż˛íJ˝@UOMˇ »宨D˘ż{ĘFĄ ĺĄE¸ŻL„bşö6ľ±!ź1†zÂěVގžVŤˇ˛öIÍ †Pn”ói.+Trďˇî$·,*?Ş‚BĆ‚ęďGlc¬QŃîďő!źŕÓB}•n—ë%*Ŕă–řžŞJ u§L?ä đ$fŐSi»÷E~3Šq)ĹŚб´¨PE4™ĺ“ř4By…’ •Őe u—Ó˘ Pâ-]ˇD¤žBVĆ'>ę+*ă“N¨OÇőU˛]®W™·đĎ>ű‰\>¤OpW˘P†ÉŚXˇžđŹ]ňí,†ňľHb3ˇřG«R{’ĺ$†**T:ŇËF|Ť*˙Ľľ_ßŃPˇ.Pe~\_C ĆJ"ÔÝťBÁ§Ôm˘1>=Ń5?©PzĐťĚňÁŰźüä_2>ýËď~÷'PĄ‡ĎŢ Oĺ÷5…âÄĘ· mŠ·ÇcÁÂ/Šç3J ežĺK&#žh“ÇꯇhĂřZP#†ęžBĺî_9†Ęßďîd‡Hř”µ€4Ôb|zúD‹­ć'b¨BĐťVřm]ˇ˛Ę¬PO¤ą-†ŠĺřiľťńéŐOŁ|,h&TTJ¨xLśĎöĄ őTě“ÍÔW¨¤iŠCâkAźc(©ľ&…JG}:ˇî ąßÉ­đI&űăăźxÔ—oźťĺ+ݡ~’ˇŽBq~ĘY%—bąBA<|jňĹÍsJˇžĆł}X1TÖ4_ l–Ż4†ęĐ,ź\_B=–)ÔťAˇ4>©± °Xä^'”`Tˇ A·¤P˙1ľ×Q¨'BˇtBĹx’pŁCE9Óę*T†d¶i–O´MŇLZą×‚2…ňä[‡Î?Ą8­PćóP1ˇôJçSľżxŕút_¬—®”ȽϨP"†Ş§PO¸×>-#Ô…JĆ‚ŤęI<ۇ·R"k›wćýúޞĄGęóĄéSÄqB•NŹ—J˙^ÓíńÍ›+4/YË'őćEB©“Jľ>÷4ć”CĹxúäivnW>=đEˇâŮľtĄÄÓdĄÄSuĄDĺJj›­ĺë:ŽŞiéä篎ő°É¬\Śź×řÍŤ„’GGh«Ís.ťřś¤\Ó +%¤V¨<ˇ°RBÝB„ę Ţ)ůş—ʇšĄÔ ďéélĄoTE_ ĄŹę.C¨ ۛ֫éçp Ą*T“ňŞ–{-0ęRµi"TK{’"T  ejŇ®#«»ůG\ŕRŰ›Ö űxNŮKß/éLß5-Żją×‚«ű1čšÖ űxNŮKß/ë°š–WµÜkÁŐŠ@¸$P"P"P"2B™'a:ŹxEĐ ĽË uij7CL¨Kׂ@A„"A„"A„"ˇ*=u]rţZßÜ…Óܡ˛3ďĆZ™6V9O_ő\~–’&ţ`üS|ÚŹ€®:ˇŽ˛¤‹>!*ŮRą–ŐUŐV¶kN!éż.6ÁŠ„JľţôOęsŐGĺßĘ=9ţđ‡śP‰ďj•‘ĚŁÝĺń•´Ç€?č„*Ö*ËĎÎë™o*¦úR;fu“¦Hˇä±źÁ6áqŚP…ńŠJ(ݱ.tü!Ź˙t¤»ąŔ¤ „ŇwPąyúŁľă[pNňĄľ™Péžůč2ŔŠ Ą×ĘD¨#ěČ´HţO–U ď¤ˇ¤Aˇî”¦#}şfś"”Řé(ˇRKbTéO­UmBÉűČÍ…MĄ„Ňß$…Ěł|…îŘ8Ô3řâ€?Tڎî´-Ç e|:ńŽfř.W©âp’pŤ(=ĄąÜď*C—^Íň•J:¦˛-†zź;eýšĺ»~ĐJ‰S ß'ÔęP„ Bťń‰PD(D(9ˇÎůŁ”GA tô#-"P"P"P"čwů&şů<”vŐÂ×ú?nđćËé|:›Îŕaś_RPzŹŇ€|Sz lyźęPő5#TM+‚!”‚×ę3€;÷§Ó©ŰIşK)ˇÄŐ;™Pń† }®Yc ݉P„Nˇ˛BĄH7Ěb…šç…~Ih"ˇC¨ŞPŻŐ¦7SŘÖ×vhL¨jX–ÍúŞ eS)xčˇö{›uµlţŚ ž§Z(G“ ¨%BAMB±Šn?î?ÚŞ®eóç,ŁĄÍŽÇ®ůKŁ•B]1 NSŞA¨h °ŰŰ’ËćĎ XE+›„˛kţŇh©P€`P<ĺ_ŹPQää20B­•eóJQâÁqc›#X.–˘úČaŮ|GĐLˇŔą\Ă”žD«I¨(—‘ýţŞKZ6Ż”ÄĎé±Â° `Ň1‡1¸f{ă˛W T)±lľ+h¤Pŕl/7´i8){|&#â†x –Íkń‡12ĄŔ߬gţ&ZşÎŘq—Ńf5[o|´,›ď )DÎřaßč´l{´$T&#ř„˛d^-GčS4ž R &sůÎŘu}׏ühĺ/&x„˛kľ3h¦PQ4O¶Ěe¶ŇgŇŮ—\X3ˇ¬—LÔ«q B-Łĺ|6…ÝĂö!‘š…_ĘĽR $÷GSĄ`â,6®ă>°ÚÜ=řŽ»Y8„˛jľ3h´R„ç8|l3ÎwI™Ł.8 ­óµS¨y4źĎǰÝń tę•}1ór)‚O÷÷÷Ź cÄX `í:ţnűa»ß~ŘďËŻ1G –ÍwŤÖňđ›9 Źwů‡ „Š'¤ 4jK(e±|-B-™Ăłű|ƆeźĂ–ő•hý»]óy!1źľ{śO ŤqJŤďů¬Î" ÷}Çß`Ę®ů® Ůjsć5Kƨĺt®Ż6Ď •r›P…ĺň5*î|&"ŘÁ$”EóYa̧Oů\"ź&¬%ݕDŽŤăÇŁńžąüÎ÷.ŰŽ°XÓ˛ů.ˇŽBĺ„Jüf:WW›+1”‘PjěÔ4†’oŐ µŚoóä6]NxŘ"ąĽeó˘0Špىói¬U€¦O°‰6ţ†8L@&#4ů¸?ě\¶-ÂË滄ę ;B¨ÔgäŐćŠîhüʉ¦ÇPµ őîNżUU¨L@xW něĐeŐ| ř†śTa<ěK)…§ĺj=żY˝bÁM¸÷ÁÜcĎáöUtłVí Y6ß)´P(ć1|µą“î˘*{ťúÓéOˇěšg| ą>…Iµ}ŹI)ąž?™ŻÝ—ç°R½ż\M|ϵ'”]óť~Ćn6knË%ńB‰ˇ‚3*”ŕ,yw0AT(»ćĂCČă§Ct^2=Ľżż˙cz*QÎŘy‹Ąű°ç…°`-üč΢Ůmďľů.ˇ»ŤJ p¦l¸:ť:źă)”Móđř(ô‰ăeĚ"ΨoĹáŻn¸0d2âްđk1ŚeóB/3v)Ô\ př 1†˛jĽÇÇÇ—ßąe:ë»E9ź<¤BÜĺjćÎř‰˘mĽěÎĂś¤´kľ+č_ĆnS…šúj€CY6˙Ěe”úţłŰ—<Śzż ĹäDü.N“ąĎ\>Ząľď»ěyéú oRĹ®ůΠ—»ŤjâLgr€äŘ5/&‚Ąž…ŃíAŚřx4%˘á0ZGë™ë-6kfu˝Y01a[ĐęoŮ|gĐżŚÝ† Ĺ<ŇßHŽr§áěš%¸ü4Tt{Ë•éýű0ďM‘¬Ż6Q´ňž;,¸Ył`Çyî­ÖŃf…”hŮ|wĐËŚÝ& pŹ3IÜĘľy^@x¸ĺCľ[®RáF¬RüÄŚĎVßĂ‹‘ë±ŰčŚ=łša)¸]óÝA˙2v›*—‘4ŔA>Qtó|’ďö–ÇOLĄâSĽHúÄŚŹ}—9|<_2 Y>ç[<×cĘ®ůî —» ŠD°c#ȱn^ś‹b·7bČ÷†©Zü$ĚOśřĽ ORwă3„¸ůP6ÍwýËŘmŁPq°c#ȱlĽ0×'ľŘOź„ýäě»·bÁČ›ú`ľ+@ĚŘU–D¤ńÂ#LęµS¨¸Jc'rĐżUkćÜŁż‹řéŰXń“VĚĚ·ÚX6iXČŘM'ÓŐĺ±hh«PqĄâ`‡9tÖšyF©0Ňů§b!cÇfhcŮüĄa!c7suehś¨q[…Š+Ëť‰ #Wkć¦q$eKźDVţú–É@ĚŘ äź~džBŵä+3­(”UóÇRđ Ő* »AJ©"ˇşCĺµµCY7Ď\s~Ź€ÄŚ]ńŽB ič‡,…JŞksřaÍ<ŕÎďđ€ť±«dB®X5ĆR(Ř»ĹôÜ.+€ ÄŚÝô<”PÝŚˇt &c—@8“±K śÉŘ%ÎÁděžĘO§5ü| Oĺč–âÔFĂźv›×Uý‘ąöV»Šáděž B´ýĽf©­ý“%7~˙اPEtaťU¨L™ň.ą‘€§'ď˛ĎË+N‚2űÉ›AüîÉRłS„’žfÂú5‰ňŤŤŽ'Đk¬—~EVĆ®Uh+®rç¬m'%TŃR©}…Ő´F. –Mf›Ť4s‹Ĺ#h56î$†–±k&‡oR­D(r—–ś%lMBşgë˙)ą oÔ:žň.aP„şŇŚ]k0¸K#JńĎůI"Tqü•ůL&ˇ˛ˇ'Ş"đ2vňE±o¤o…=R¨ Łňń‘Y‹Ô­ľ™P(!BťbƮœô?eř€Rc…jć¬ć!~«* gt{łsV%ÔqËúݵ‹ĘËaJA…ŚÝś9ńâşH ‡ Pv•9‡ěí ŠÉ •zqfTnRÉľşkĄŁ+Ěł•¨”\zCď×>«XµôM\»J‹uYˇ'q]^~F fěę„V u5¸>Ů8#P3vSBIRN ŐC\fúö:€±+QH‰'şC¶€±{&B‘B: ̌ݡÔ3’C®”±K ‚2v DPĆ.€ĘŘ%A»"”±kYLmkµ¸6­złZˇ”± {«Y‘–ÍŻ"žĄâzŢó\ÉŘeÇČÓMlU۲y·@(ף`-mv0)T\$ˇśĹĆuÜVűŹ»ßq7 “PVÍwV2vĺ-Ú¦öŚj§Pb°:†íŽßX Ó˛2ç2b(\…b_ÍÚuüÝöĂvżý°ß1—_cZ-›ď đ3v;C-™Ăłű|ƆeźĂ–ő•hý»]óA©B!jă{>«łĂýGßń7„˛kľ+ŔĎŘíň,_<™Âŕ;0Á&ˇ,š,ÇPćîĘcÂBżńhĽg.żó˝ź÷@HxłlľKŔĎŘ-ś‡Ę޸đy¨e|›/ł«[$—·l>°CÁ&Úřŕ0™ŚüŃäăţ°pٶCF,›ď“± ’€á*ż9°C#”UóÝ –«őüfőŠ7áŢ[sŹ=‡ŰWŃÍ"Zµ§¬eóťÂ`2v! pÄt?sy1džBY5ŘŤˇřI"&,Ä ™tx/ĂGLBŘ– ĆÉ"Ëć;…Ádě‚" ţś W§Ó žBŮ5ŘŤˇ`äzţdľvw\:XśEa¸÷—«‰ďąŁö„˛kľSLĆ.hÎ’X' eŐ|`;†rĆÎČ[,݇ý!<0ł‡đŁ;‹f#¶#†˛kľKLĆ.¨Δ W§Sçs<…˛j>°}JĚů«."a1qoXxŐaZ6ß! &cćZ€Ăo1”]óÁ9ÎCyîr5sgüDŃ6^v‡ąÝ˛ů®`0»0őŐ9†˛k>8ĎZ>ćňŃĘő}ßeĎK×_¸¨ků,šď †“±;q¦39ŔAގěšěŻĺ­ŁőĚő›5łşŢ,°-hő·lľ3LĆ.Ć;ă)ŔAž„X6o}-¬6Q´ňž;,¸Ył`Çyî­ÖŃf…”hŮ|w`%c7ô DĄÜ“ÖRę«5n¤P˘°1“‘4ŔAr,›·CÁlµń˝1Ľ‰T˝€±çoVł~ďleěfWÝ.ż‘Ͳ+oÖ]Ý×Tˇâňťqŕ 9–Í[ގ`ě»Ěáŕů’IČň9ßâąţ¸ć»[»%„ Wß­I¨ć WŽ;V‚ËćĎ\F; eĹĽőŠ€+»APů ŞP9Ą;6b(KćÝeľ\Pľˇ:…Áděay­Şy(Z  &c—@8“±K śÉŘ%ÎÁděçŔ`2v „s`0»Â90ŚÝęů°&§ÁJ —˙×Ü\nG·(źŮC+57Ś%ŐŔrYÁp2v9R%Ż›,Ô¨\†RBŢÇ®Ĺㄺ:2qXČŘUóX>ĐBˇĘÓHšA˛“ýIk«ôö5: l•~ŃNö¨”\‡Še@ Ů— ˛ýěŻvSeźŞPÖ•ŔBĆn`Ţ„Őf-J'TĐRbuBúJrIůe5Ëiő Ţ]¤±ŇkUvNµVP¨«R8ä´nŘ@'ËşXÉŘ5őF^Rc4… ÚRJ?¬â“˛Kő˘’Ţ[aJ*§Ç UŮëóŘZd@­ţ@.C­`yYWüŚ]co¤żjÖá (TšŠokń]Ö"Tť˛řG‚|d$JfŤ)ŐĆ ˇ¤˘k¶ĘŚę»rŻfčJŰtxIŤ[+”Üß·ú.kŞ:Ł”H-&;Ĺr^{„ŞÜ,JD¨ 3vłö)tĄŠ4nĆöł|iMŰJ1¨öJQµŹb =FSŤfEŇU«úĂʱ4úÂ2kĘşŕgěć dĆč2 •ISŢe"MK][)*kŹŞ…ŞÂ»é IDATĺ„ ”źôJ+§6ˇňj^¤ZíꡡVňHY×üŚ]co„H(Z)q&śÓÉA(5ݱh˝N‡—ÔÖňYGăî®ăeŮǰ3v eh;îjYÖA»"(c—@@eě Ś]”±K ‚2v D ,c—@°‹aeě–—±«­(*.a“źóµ™ĐXˇ®éô!ˇ«@ĚŘ•WBU¤Z3o¬P°żÜ8µW ž§3vÍ„Jżméuó\ ŠUŠwä+'Kť 3v•µćöŐPˇ ěö¤R'«hEmÔ» uĆŠĹ}‘“«Ŕ¨nÁ•‘}3ŰÁr±­cĄŤ,7Îű«ELťS(ŽLĄöű¶ľTxŹÂ łS€5óL™ć0wĂlo\öjaA©,7Îĺ±{&BµP¨(W)qłňĄŠ‚řĂŘŠ×X3ţf=ó7ŃŇe±±»Ś6«Ůzăc“Önăt»r2nçfů »*m˘RľŇĚeXĐ6± #ÖĚĂdîŻ"ß»®ďşă‘­üĹ·ú–§ ŔĚŘMC˘Nž‡Š ŧűgSŘ=lbŤŞ[zĄb ą?:č2bχ-ëŠm iľ{ÜecąĽUó°ń=ź5‰1ĂýGßń7vÔŐJătÉŘ…Lź8|&"–Bď‚ĂŘe>ĺÓYřdÉü„ą€»ň>±Čr<ďŁvľ·pŮv¤!ĺĆé “±+–K‰j™Mú;đ°E¬>„Qt€CMśOăîPůdŃîű—m‹TĘrătÉŘIźÄ”?ż9°ĂűB™Ë„!÷›0٤^Ç'kćaąZĎoVŻXěî˝E0÷Řs¸}Ý,˘Ę:$ËŤÓ &c’řI,™bŚÓţcŔS¨ŘeÜc¸Ë|“yMĚósPLŤX2eň^0>ELˇŘ– Îą(ËŤÓ! &c}ňçÓ©?ťNđ ÂwÁa)lßߣzŤ]ó0r=2_»;®L,ŚbĄ„{ąšřž;j_€ĺĆ铱 Zü´ä“ţ4…‚đňᢗĚQŢßß˙1J˝¦ëćŮ7:vFŢbé>ěy!,Ü ?şłh6bŰ»_ű.a0» ĆOÓé »;ź#)<>Š.ăeě(ÜiľArËćä$»żşáĹ”„©”{â'”ŻŘ~í;Ěkě&ŹŇJ [؇G˝¦ 5×â'~C‹ˇŔ{|||ůť[ÖÇ]0»EąËxÝ6źâ.W3wĆĎCmăU}N„vŽÚwx»ˇ2.éËř0ĐTˇ¦ľ?áĆPđĚe^óýg·/y¤đ~Šř;~·ëćE“ąĎ­\ß÷]öĽtý…‹Ă(űµď 3vő|§ÖKaM5n¦Pg:“ă'ÜJ¬f^ó,ŚnbPĂŤŔ¬ć`´ŽÖ3×[lÖĚęzł`ZŶ -k˛\űÎ󻆵±€O¨† ĹĘwĆ7Rü$b(ĚóP|Ĺ0?ÓÝŢňÎ÷ýű0ŇL{aV›(ZyĎ;­Y,ĺ<÷VëhłÂĘ1´Ü8ťţ5vmŞˇB‰Ś™JĄńj •nů¨ć–wÄáć;ÄÁŞy­6ľ7†#×c·Ń {ţf5CTp«ŤÓ`^c×”˝ťQ¨¸†Î8ŤźĎC ó|ëö–‡¬#ŽĎb"vÁVÍĂŘwź‚ŕů’)Ôň9ßâąţńÄ·ŐĆé 3v i…ÝQ¨¸’<–˛C%§[ŘíŤŐĽa1j`Űüĉż'žďĆßb>”ĺÚwx»¦Yľ ;ł|âXĘJ ĺ… xĚ vÁ–ͧßx+KĽ ĹşĺÚwx»?%!‰Ą’ ÓiŔ=0Źáw"|7D°l>+fćăEN’ŮóÔţŇLĆ®‚4–â1ęzć5aüS,–Í'…ŚĽČI1|ŽÚ_=ĚŘUŤ•ĆRˇP¨+¨X«ÄÁ‚ť.زů¤ [_é9jaô/c÷îť„×M «”­P±a.Ŕ+T«ç2oý®}ô2c7G B‰X 7†Ę ?s=‹SX–Í[FżkýËŘĹ#”ĹţěNaY6oý®ý ô2cŤP2ú—±K„"t˝ĚŘ%BşŠţeěˇ~Ć®¶¤ťsD(B‡ź±«§éb3ŠEč0đ3v%"Y6$Tˇ. ‹k®#’l‡JŁ.®*ŰŮ*ĹŚ¶\RZ0٢Á«|Ľ†ýňľÔ¸őj~NĚFĆnŇš–Z© „’2żŠ/”Gyđ[ŘŻRťĎ4¬ďÓ ŘßUÍ* P ęeěĘIř5®J(©{Ď;qMI‹ŹUj÷2é„’_ˇŞP°BÖjĐŰ%;úüĺU.]ů›UęŰ bËz‰Zaků*x'*}wR(ÂĐPgµyö<â«ř\oű°‘ß”(TrOžHˇCCłß”pýé|î{BĄB2ˇˇę–BŃK‚}4ĘŘ FłůŚçěr•2)TňĐ-…‚ýĺ~ť“ăş;¶fůPŕň”Ýő|3Ýe1TÇŠ#˙Ůł«ţ2{XFË+ţĹPL˘Ü cÔ&ú8îK Ń`·'•: 9űÄ‚őU´şâŻ aĆnϧ«uES5†ęî,°Ę:ąJŚ,Ô-)JĄ¬™żżżĎěç|âŻqěĂdîŻ"ß»®ďşă‘­üĹdP„*ŔÄ0x>JĘ”żŃ9Bń‹̦°ă§¤…Fa×Nrř(zt°eÄšůűP9ź° ĺ,6®ă>°¶˙¸{đwłp†E¨Z»}>|´S(q™1lů)鋣+—;Íů}>cŁľ‡ĎaËúJ䉬Ěż{Üá·—·eţ>&”§XĄđÚ6ľçłl¸˙č;ţfX„:ÍiĘď|ÝmŁPńex|&"–B­6/#ŚţS>gOvĚÇ?A¦ó O\'̸»ň>±Ŕu<ďŁvľ·ŕuçţ]GËŔQ¨s^t·1ˇ–ńmľĚ.uŕŔñÖFŃa4q>…(ŹC°řd×|aí ÍI`‡M´ń7,~bú4ůŁÉÇýa˙ŕ˛mѵ©ŽBťó˘»Í*Ó'qˇ~s`‡8¦ Ł0ä^ć.É}ŹO6ͱiC…O(öaąZĎoVŻXěî˝E0÷Řs¸}Ý,˘Ő•­CBR(ÓEw ˙™PéÇMŰ׸!ˇâřI\(Ž1J\ě` x ;üű;wÉopM¶Í3} ĂđüÎĚŢŢf|ňlű›5S#A…L™ĽŚOS(¶esuç˘+Ôé‹îĘż´›ý*oű%bM Ąč“?źNýét‚§PĚą€„Iśł}Źęó–ÍÇöya˘O Ą0řŔČőüÉ|íî¸2±n—D¸÷—«‰ďąŁÁŞ€ňŐ˛ĺÝMźł_$˝ˇ´řiÉ“$'h á!äÎ!:D/™#>Ľżż˙#ިɲů“„>˝‰’G>ń{쌼ĹŇ}Řóc`±`řŃťEłŰ~]|jˇPApꢻ:ˇpVt6V(%~šNoŘÝůIˇCĆý;ĂËŘÍąËäň–Íó|śGVÄKđx$…¬OÂ>‡żşáĹd–©”{â§+ü™ÚV •ĘxŃݡP(Ő‚PJüÄoh1xĚ!_~ç– I, ěĺßÖ/-›ç%"y “ Qź’a)řjE+ďąĂb§5‹ĄśçŢjmVW—c3Ë'ľmý˘»2gžţ{©J?f*•ĆO¨1TZëáă1Źđ óüâ¸É¶y/碥Ţp>| `¶ÚřŢ^Ś\ŹÝF/`ěů›Őěę$ ç<Çą.şŰćwů¸JĄńňy(a>ëŕEâ móĽS Sp˘"ň)€±ď2>Áó%S¨ĺsľĹsýńUŔ©µHçąčn»şK١’“EěöFŚÉŢ0A p¬›E•:$‡Č'ĂĆC~žďĆʇ NěqŽ‹î¶ýĺŘ8–˛Cyi˙O“±~U@ěšO *$1ů”ű˝‹Ą@ŢtUŔ·˛Ş®ýO1'±TC!Ö—yc…Äη1çť­›ĎJńPçË ögţőEN9pęŔřmó4–â1j ‡!!Ň ˘ó™OK±É';9×9ĺLĆ®†8–š…BUHơޱlţ¸ľĺF2“±[W)[ˇbĂ"ŘW¨VĎežĐÉŘ5€ĹR¸1Tfř™ëaOŔťĎ<ˇ “±k„µ … ¸ó™'4‡ÝŚ]yý iC-ݦ ®: «»2P„!ŔnĆnšVĄěJÉ»ňĺÍô"B: ‹» qÔWę†@ˇŮ©°†Eč0,fěŞcş\zT!*ędŤ‰P„ÎÂbĆnže„eXaĽˇť†ĹŚÝŚÎN(Ľ_˛ËS˝Ň±jö3„é{ůłôŞŞůĚ`ö!ąŹĘ›-¨h»É9äÖ˛aą[°±{$†Đ UqF‚×řµŚËŞ×Ż2LwxÍý«WU6‘oÉ5^/丵š¸R··›»ů,ź2‘§ĐKfUćG*ęJjćl;”rB)ÎŹC(©Č̢,UÇŤ©­,@j{©yŠĘ…2UÎe¦_ľbW6'9Äu »ďîô[uBĺâ( d#Ç\Ůc ˇjŽş ĺ:§‡Qń@”ń€ň™.ڻʇr”¤˛z‘jáůw‘Ű»ô2cWaSMBißlc!”4Ő’÷ĚRź_« éÓ' u\2TNŞ•=gŞgzK#YUT •ŹRX»Ž­kč_ĆnK…Â#”6N:ˇPYa5UĐ8uX,±C­BąµBŤuŠĎrÁ˛-Ţ^ĺTůËÍŹPt&c· Ąô˛UUŁ_/˘ř:ˇĚ %‹PˇŚ"ˇNHáÓنG¨Žfěv#†RŘ’ŃĄQŹP…úkG¬™Ź\Ö@uÇ´ĹtB+ŠUµČBw&żˇ čLĆnc…ĘżĹÔš~ʞw§VtBeöe‡oCŞC§†5ŠĆă˛ÖŽÍňé NŠŮ2 ”Ź%#Á©c)pX­IţúŽţeě¶Q(° 0BĐ™ŚÝć E@vĚC1TaŹsfě’B]ŘßóYüćL°ś±kˇˇHˇ†ĺŚ] „"…"t–ݱ‹3Ą¦ŐŠĐYŘÍŘĹZ8'ŠĐaXÎŘU …TcR(Bga9cסHˇ†ĺŚ]R(°`7c—b(ÂŔ`7c·Sł|WtöĐY (cög[E8‚ëîŘ“±ËŽ‘źwľę/ł€e´Ľâ/a0»Ťv{R©KVŃꊿ‚ÁděBEN®R#k5Lł“ČĽjXŘÁr±Ťoó+¸“±Ë ĺ*µß°ĺ’ńŮVťújž)ÓĆŕníŤË^-®R©“±*S)qłâ’˘ ţ0¶âó}5ţf=ó7ŃŇuĆŽ»Ś6«Ůză_Ł“±›*S) •Î<’m ý|_ÍĂdîŻ"ß»®ďşă‘­üĹdP„* ×»1ˇx–Él »‡íC¬Qص“<2Šô~ľ·ćaâ,6®ă>°¶˙¸{đwłp†E¨ëĘŘMJ䙌a»ă7G!W.÷ČűűűG†1j4Ňgók×ńwŰŰýöĂ~ǵľĆ W‹»…ćR74mÍ µd|b÷ůŚŤú>‡-ë+qżŇÜ#ż{Ü#cůdźÍĂĆ÷|Öâ"‚ ÷}Çß ‹P¸×Ř °ŐFˇâMFţhňqŘ?¸l[tm*u–Ś]ůÇóW W 7W¨LźD¦ ż9°Ăű>™G†!wË08ĄN‰çđ}5ËŐz~łzĹb§pď-‚ąÇžĂí«čf­®l’ÝŚ]5ŞËŃPŤ*ŽźďYME¶Éđ*öČwHî‘ßdNIćů9(¦F,‚ ™2y/ź"¦PlËćęÎEŮÍŘ=I¨cľ¦ Ąč“?źNýét‚§P†Ľ‡“@dűţŐ){mF®çOćkwÇ•‰…Q¬”pď/WßsG!Tő3v+(T7ʎ¤řiÉsM&h á!äČ!:D/™>Ľżż˙c”:ĺŔÍŔ˘ë‘·Xş{^ ÖÂŹî,šŤŘöëâ“őŚ]íIŽ«ÎC©ńÓ”q:u>GR(x|=<ÇËŘąO~ä“ý6ÄłOŕŻn¸F1d*ĺްčéš~26ĹŚ]eRŻ0˝wöYľą?ńZ ŢăăăËďܲž>îáŮ-Ę=Ň´ů´wąšą3~neŻęó®ŤMÁ€2vaę«ńn Ď\ć”ßvű’"ďwˇďăpn^1™űŚQŃĘő}ßeĎK×_¸×ǨáděNśéLŽźpc(1ěeNů,ŚnbĚÄă.ŔŚĚÁh­g®·Ř¬™ŐőfÁ´Šmˇ®+c—ŐÍßHń“ˇ0ĎCńa/?‘ÝŢňľýýű01MÉ<łľÚDŃĘ{î°ŘiÍb)çą·ZG›ŐŐĺ&cWÔmĚT*ŤźPc¨´€đpËM·Ľźß0×< E }7łŐĆ÷Ćđbäzě6zcĎ߬fW'QÉŘŕ*•ĆOČ硄y>Mv{Ë#ÖĎÇ'I±¤çća컌OAđ|Éjůśoń\<$BĐëŚÝ b)1Tr6‡ÝŢAÓÖĎŁE W`~âÄË:yĽ/đ¤|¨ lŹîgěfc)+1”&ŕ=<_ €) =7źťÝ÷V,–yÓUa0»’X*‰ˇ0ÓĽÁ=0‡äw|/Ŕéżů¬™}‘SŽÁdě*Hc)CˇVš9eé ÎŐO ;×9ĺ°|Ť]yyťQÁŤ«;u{…ŠËă±ÔD(j70Ťc;=|żÍ'e\1źÎ±+ŞŘ¤ŐCˇâůĘLd…Š ‹h^ˇZ˝óWë»ůB>9ĹPZ*›ď©äő©1†BĹDގ2ĂĎ\s†ěŞĚ_9¬fěĘIş)eä˙e^©IRG ĆR¨¤Šv†€;Cv]ćŻöݱ+żÔî%OÇë§P:ě_c7•ś „J‡‚G©P2ÎvŤÝj śžž …"tV3vőJW*9“·r^<)ˇĂ°ź±«“ĄH¨Â,߉“B: ‹»–&ĐHˇ†ĹŚ]K„ŞŻP…Š4]¤q¤„d>ȧ˙Űź:.ű¸y{˝ÂŚuĂřęJCbi‹9[ň—3ĂbĆnwʡé4ú q¬•ůŞŰ뱓u,儺 !c7źÉĂ4cřÖEöäćš*S<ůäi;˙' S!ý§n1ęyŤ@.P±]Á^ľ»<ă¤6ľR¤ľ[üńţŇk»ů,˘ňíĺ_źFú8F¨š’‘,©Żö$•^ď@ KşµŘńÔ7—˝2,™Ńi”Q©ŇĚTw1„Ś]“´1Š1”"{ÍzܲúšŢÎď5DőđôŁ’ŕµ TÚŻŇ}ň(tn [«+BĆnBµf”)Tî;M†|GĄżť˝TöýĽćJĹĺăŃ$ĄžąˇŇfH_ •]ŤC膱[MˇÚŕˇTW­ađˇŚ˙ĺ=CŤÂJ*ýş ˇ´FŠ-!Tź5„Ś]@·×q™˛ňIś0eňMă“ĚŻşifJm×7g4Ę›ňwÔ*®8_Ć.Ú(T Ěg)O­ľÂ\ňN%Ó(›ęYLG‘Źü)Ż-ˇÔVQ›¤ˇ‚ld*7rňZySV¨aÎň5¸Ć.hĄˇĂ°±«tˇx˝­ĺ#tvݱ›R óÜ)ˇĂ°š±«Îě ŐŠĐYXĚŘ•ą„H(R(B‡a1c7ČĎdB»×صqnŠĐaXĚŘ äąšĺ# ąĆ.p ć»Â90śkěgŔ2vóŞŮ­0ŚÝ°?[Š a°BĆ®;Fľv—(E°Š!dě @4ŘíIĄV1„Ś]˘ČÉU `d­†ůF2nóÇ2v“*rd*µß°UWřúVťČ|§a3c×ĐfÍŘBˇ˘\ĄÄÍĘ—* âc+^s%毖R63víŞ•BI*Ĺaá+Í\†m|Żąóţ”ŮŤÂ+Ą”Őkě~ AŮÔ¸Ć-Šó~6…ÝĂö!Ö¨ćő8R $÷G»źżós:0‹®UĄ,fě~§îo~ĐNˇóǰÝń‹ŁWăH)Â#ďďďƨ^Ó{ó!ă“ű n"ˇP×H)‹»…ߍĘ6µjĂ µd|b÷ůŚŤú>‡íĂö#î×™{äwď{d.yf><đ±‰;ŹëĂÓ|G`3c7Ţe?|%ĺr4Żq…ŠG¦ ľKˇ~›ĽŚ0öČOůt–‡ď±ů0â®0ž‚ĂŚN…_„WÇ'«»ęŘNţm‰6Śj¬PËř6_fěwŕówąŕFçÓ¸·dŹěµyˇOß÷ź"7îiŻŽO63vłˇžCµýŃ–ć •é“ŕ>ż9°ĂűB™G†!wË0›Ž]¦÷ć…@MÇB–ÂQB¨kă“ŐŚ]Ă/ž*ż Ú´Ć *ŽźÄÜ c”ŕ˙đ*öČC<Eß Ý}7ŕĆžĎ\r»3Č~]îĘ0Ś]PôÉź3îO§<…‚0ä=|"Ű÷÷¨NyćCřö”ź˙źł2ľ©B]Ą“± Zü´äěź )ë‚C˘Cô’ůáĂűűű?F©S’yQLśérâd”Ň®ŚQÉŘ5~š2îO§ÎçH ŹŹ˘‡çxű!÷Éo|ň Ěs…âx~3žG˙ŁD¨+cÔ`2va®ĹOü†C÷řřřň;·¬#Ž{xv‹rŹôČü!!|ß›f` S_Ťźpc(xć2ŻůţłŰ—<yż ăĄâ\2ĎĚ'„‚çÓqF¨Ă|§0śŚ]6~źÉńn %N0ŻyF·bŔ{ŹđW‘ya>!‘“EP|RĹ|‡0Ś]öť:ă)~1ćy(~ę@śdą˝ĺ}űű÷ńr5’ůÄ| ×É …fľ3LĆnŔżÓ1S©4~BŤˇŇÂĂ-4Ýň~>|Ă\ó€"ôŰ|ńo,óéşâ'ŽÁdě p•Jă'äóPÂ<źËş˝ĺëç㓤]p˙͆«Ó§KgěJ‹’jÔ¸©BĹ%ňXĘF •ťn}{˝aýĹBć;‹3eěf:dšĺ«'Qx E  c0»Â90Ś]áLĆ.p &c—@8“±K śĂÉŘ•ĎwÎćâČŞš›€dT2]aŻÚVÖ§&NŻ“ľ &cW=Ëlz·=$ÂâU-ŁěÖp÷ B™ĐŻŚÝüWvî+;Ź,-tĎ÷ĚÎ5>Begé”sâęZ­Â~Zĺ«E˛†te{P, îaä'óĄÖĎ7Ĺ;Ö©sçq˝»ĹďP^™!-ÔĐ–l´8 B©KK 5$?TöÓŽ¨RáŞĺ@· ņÜúú6) «°™±›ľŮ˛ß×PCˇ4ŃďĄ>Ů[*(qHýňŹ?UĄ,ÉÝ%/ŘŞ{,ćú› պݻ›» ŠĐ Ő*÷”j„j=“€ĄPA™CĄÔZ=”Jee&†‚nË:ˇ2"÷V3vło$oČöŤVSˇJČdV¨ ď/@¨bĺkxżYˇ‚lÖ˘Yę:e1c·Řr;6FóJW*ąbŤÇ6j‘ʋƄ*]«Şą7(~ŞbY…fĘZ«ľÉâaäÎ f›Šĺô3vKśˇ}ŤkĎňťčďł—mżÔˇš(˛>mW^kůđôÝ+•[ZÜą´šĺ“¬h/ő޶v…ĹŚ]#`PŞN uŤ8×qˇ—SbđĘľ'‹»&B!0ŞN um8ç¸Ő3vŐń3Ú8yĐ uĆqŞlfěÇĎçśĺ#.ĘŘ%A»"(c—@@eě Ś]ÉŘ%ÎÁděçŔőfě`;şs˝ÂÍjy¸čwí»ëÍŘ-övI˙*ŇáY*ÎF3źŻö׍3děúň’vîĐPˇŘ1ňüG‹”r .éÚńIXFKtĂg«ý•ă »´sę† Ń`··¨R^Ń%çV|VŃ ÝîŮjĺ°ź±›/哳aʲpŞÔ¸™B1qr•U)¬ }|„ë“q Ť`ąXŠęc„ýÚçÉŘUś›3ţ*ŻDo¬P™Jí÷°ĄĘ…D¨>É”icp7ĚôĆeŻJe˝öĺkě¸cdR"PUkÜXˇ˘\ĄÄ —R†>ľYÎn Ŕ߬gţ&Zşl$ŕ.ŁÍj¶ŢřXÖm×~(°|ŤÝꄪL©V %©Ş·Ł9ˇ&sůÎŘu}׏ühĺ/&XÖm×~(°|ŤÝ:„ŞČ¨V ĹçNfSŘ=lbŤŞP`Uűř¸H‘PßóYťE î?úŽżA3n˝öÁ`2v!Ó'߉ĄýĹj2aß‘»ň>±Đo<ďŁvľ·ŕ3( N1“±+Î=‹j™Í 8đ`^ŮŃVŁŘDĂâ'¦O“‘?š|Üö.Űá¨ĹP8hµ–Ż€g삤Obţ„ßŘáUÖfËŐz~łzĹb§pď-‚ąÇžĂí«čf­Pśžb( &c’řIśfŚs(c°ŻP8„ň7k¦F,‚ ™2y/ź"¦PlËé\ĹP8ŔU¨s ©B)úäϧS:ť`*”Í(F®çOćkwÇ•‰…QQ†{ąšřž;Â(b( &c´řiÉgP&gP(¤Ę;#o±tö‡đŔĚÂŹî,šŤŘvЎ:„f uĆÝ+”?M§7ěî|Ţ“*Kżşá†S)÷†EOhClЎpĐHˇÎ™ [@S…škńżő&†Ď]®f‡ÚĆ«úđŻR …F uÎÝš*ÔÔWă§^ĹP|-cT´r}ßwŮóŇő.­ĺëš)”9A·"żZ˛°©BMśéLŽźúC1ŚÖŃzćz‹ÍšY]oL«ŘZË×-TU¨ şU‰Ň’P ŠëŚo¤řIÄP}9đl¨M­Ľç‹ťÖ,–rž{«u´Y!ĺR …Ş U%A·‰«ľ§Ľ©m¨ž´ŰPˇDc¦RiüÔ· f«ŤďŤáĹHü$ŃčŚ=łš!™§ •*8• {$ý¶şQĚ娞´ŰTˇâŠ8ă4~ę[ cße| ‚çK¦PËç|‹çúc$óCá ŽBĺ„*KĐ 4ĘŢ‘W–r±Ýb‚ÔÉ7U¨¸8Kő2†b5Ź»žďĆťĺCu ŐŞJ‚®šŢ”ś@“ęqşŢj˝Ôn0hćź"Bť‚ŐŚÝî)TäŁlBIFŐ—gR¨üđň§“ő–*ČÇXk"TXÍŘ…îĆPR}[@ᡊm¦6¨Ú¶ĄˇÔéz«%äŇd®Şěfěf_ô^űŁĚňˇÔGĺQ~®H'T2xŞT >ËW¦RşĎËM|Ş ŇÔG}"BUÁp3vű u f·Bm 9c·žVˇÚ`Ř»˝4–Ă@˰bv  Ś]”±K ‚2v DPĆ.€ĘŘ%A»"đ2v‹ ltşáĐŹŠĐaŕeěébGżHˇfĆnaM¶>LZsÖŞĆ ĘöU\úV˝Y-P‚K׫OŔËŘÍ)WtćŮ5-ż Ć {»3)ĹëWx=sĹ4qTCĎŽâ˛ŔËŘŐ2 ťPr&C»7R(V>DµH©â–Üž1 –tE›¶ŔËŘŐVţˇ,B5T(Ć»˝E•*^Đť÷‹Ql(źPH`N„ŞĽŚ]ELYQV(ćN®RŁÖ5Ń`P¨ČŁňF·ĽLčôď>űw˙űź~é˙ř%]/đ2vĺ!źy¨wŃ „‹g*µßŔvIC Y`DĽ™u|J MšĂ˙ôÉ'ßűěłď}ňÉ·’ Řĺ\3đ2v‹éŁjh ĽŐ¦ĆŤ*ĘUJÜp]Ň P&ÉÄqđ‡1>Ą„"q>1F}ďOżőÉ'D¨šLĆ.dnž¨Ş«śĺ:ęźXL8Á¦¤yJ¨OľĹoÁ,ăÚQgĄ„†~eěĆ„â'¤gSŘ=lbŤB¬Ř9®Ł.ń)Šd•â |¬'đ­Oľő'ß"T= &c7Q(qJz Űż±8 ±bg¸ŽzΧűűűG†1j,Ĺő>Kő­X˘PőĐBˇ8ú“± Bźćü>ź±QßĂç°}Ř~D¬}‰B!úcΧďŢçSŇK`•+T¨?ůä[ßűě{D¨šLĆ.dúÄá;0±˘łXʎř!„1ź>ĺs}Ř|JJŠËÓgD¨Úh©P@c…ZĆ·ů2;-íŔĂď mÇPFŃa4q>Ťµ pů”)ÔgĘG|ź˛çO‰P5QIˇ.™ [@s…ĘôIś”ć7vxGf9†b| CNŞ0öĄ” ŃÄśŢgß‹§ř¸TŃ,_]TQ¨‹&čĐXˇâřI,ęeŚ'¦Ç`_ˇü1ćÓÓ‰ó雌R(Ö“2Äy¨ď‰ę[Âřô]:UUę˘ ş4U(EźüůtęO§L…˛CAr} “0jűţŢĄ’…1ˇž|ďÓďŇJ‰Ú¨¤PĆKęf Ňo`§k!ň„Ť|Í„ö~‹7ʎ¤řiÉOKOΠP(1„‡ÇO‡č˝dFŢßß˙1-oR"]Ë÷É“§Ož~Jků „PŐ/©«¬+—¶Ëoˇ®Źm¬PJü4ťŢ°»óy?b(x|úÄń26Ë•‰Tűâbhµyk”J~6&čV%”’jA¨¦ 5×â'~ëK ŢăăăËďÜ2ťŠő‰Ý˘śO^űâb(Ş5Ž ‚“—Ô .@¨¦ 5őŐř©W1ä»ĺ*ľaÄ: ÄOp`z#¨t+ßR%Ś"BŐA%B•^R7¸ˇš*T\¶3Nă§^ĹPbšďö–ÇOLĄâSĽú”(”~c¸"T]T™ĺ L şB•ÄPB]$†ĘjÍc©ĆPÉą(v{#†|oJaÄOÂňáń ăĐĺńńń ,éÄn]T9Ĺq±ÝÚ(GKő1†ňÂ\ź"ľ Eź„BiÔ'BźćsR¨ş¨ľÚüB ş´S(Ž$–Jb(´:C ĺťř]ÄOßF;˙ôćöö¶pOřD„Ş…:ůPIĐ- ­Bq¤±ŹˇĐ–(žá7%ĄÂ íĎ?ĺfMÓJ‰¨—…ć|-Đ^ˇ8âXj" é Îń›|śś&BÓ'Éx¶ŘQÜ,ô׏ÁděŔUĘÁT¨3ü¦ıĽÂ5+LĎĎq׍ÁděŔb)Ôj™/”ďčÍ Ď\i~O3l>‚~řEG0Ś]#P‡°ćHÄĘ °ć÷tłç:€ëĹ`2v „s`0»Â9€—±› ä5ňŢĘ{ ˝yZďQâ’B: ĽŚÝÂşsugý=őýlĂ)$…"tŘ»Éjľ }”÷•X¤$|µE Eč0°3v*R(B˙™±ůşsuF“PMĘ`·ő$‹2¸UŰC CţÜšř#ŤLV0Q’nÓ‰‰©;c7ů7燴ďqBĄ’fKˇl*=ňĚAkW,A0K„ÂvĆnćVÖŐPˇrýĐţi#†)›WŃÔëˇNb8»©»HŞ‘qĽi]Ž+T 9g}<7ˇ”ąĄ @$"T5 'cWu7P\ŇÎO*¤„Jß …j»»pjsr‡"Z(˝ł] -9}Ń3ómŤ e’Ą˙‚üRŮX͸ú!SˉuĘŘ…ďo±ŠĹëCąvKä‹NťŐü•c0»Ťv{‹*UĽ‚ˇ;·Â(XE+›„˛kţĘ1Ś]`îä*0®Aˇ"\FĹC€,KQ}ä°l~Ě5vA¸x¦Rűýě#1ÄP*ŁtĚa ޸ěŐUJ,›“± ‰“'*%n¸cP(ÔŔüÍzćo˘ĄëŚwmVłőĆG;Ë懂ÁděBćć‰Jq ş‹í«ŔĂdîŻ"ß»®ďşă‘­üĹŹPvÍÉŘŤ ĹWůΦ°{Ř>Ä…X1ŰW‡‰łŘ¸ŽűŔj˙q÷ŕ;îfá`ĘŞůˇ`0»‰B‰uľcŘîřŤĹQł~x€µëř»í‡í~űażc.żĆ´Z6? &c„>Íů}>cŁľ‡ĎaËşbÄĂ*Q(DBm|Ďgu1`¸˙č;ţ“PvÍÉŘ…Lź8|&"–B<"«1Ô„5ľ»ň€°Đo<ď™Ëď|oÁç=N Z6? ´ľĆ®¶+(ËĐó=¤}ĺź©kTㆠµŚoóe¶Öׇ-٬ĆP°‰6ţ†8L@&#4ů¸?ě\¶-ÂË愌]ňŹ%Ę{HżpĄěŇÍ*Ó'±Ň—ßŘáą‹Í –«őüfőŠ7áŢ[sŹ=‡ŰWŃÍ"Zµ§¬eóCÂ5vM?lŞS¦H¨ĆĂÇĆ ÇO"S’1J¬ö}…Â!”żY3ą`!NȤĂ{Á>b¶l0NY6?$´ÍŘŐ~··ˇ†dMJŃ'>ťúÓéSˇlĆP0r=2_»;.lđEa¸÷—«‰ďąŁö„˛k~Hh›±›łHĺQL©ăĽâË5nCIńÓ’ŻőťśAˇb(6>y‹Ąű°?„fö~tgŃlĶcÄPvÍm3vµ€©şBĺ&j˘±B)ńÓtzĂîÎç=‰ˇ’ŢÉ_Ýp ĂÉ{ì©WË懶»Ç*w.ĆPgU¨ą?ń[ob(đÜĺjćÎřěĐ6^v‡ąÝ˛ů mĆnI ĄĚňéşCŤ ŐTˇ¦ľ?ő*†âŕ‹íËG+×÷}—=/]áâŃŐ®ůˇá»E2içˇ –ť‡jVăf 5q¦39~ęW Ĺ0ZGë™ë-6kfu˝Y01a[ĐęoŮüP0Ś]vÎřFŠźD Ő—óP °ÚDŃĘ{î°ŕf͂繷ZG›R eóÁ`2v~c¦RiüÔ· f«ŤďŤáĹHü ŇčŚ=łšőĂü`0Ś]®RiüÔ· ĆľË>ž/™„,źó-žëŹűa~0LĆn±T/c(Vó8řäIęn†âćCŮ4? &c7CKő/†Ę§Ľ vZśÉ»Śů`0»’X*‰ˇĐśĆúy¨0óm†6–Í_9“±« ŤĄx …6ڵ}*ël†6–Í_9“±«!ŽĄ&Bˇe;†ĘA?ĹÜ] &c·®R¦BYʎ=@óŚ]iI„´ )ĐšăÓGˇâŠâĆPË|ą |'B Í3vĄőzŇş˘@]«¬éĂ–BĹŐC¬”­B÷pŤ]±Ś6áUúh‘Px E  á»ňŞŘ@#”…Sˇd´ÉŘ-.5Č6IńUWc(8»±Ä ÔQ2ŁHˇBĆ®ü´ÔAЎĂBóŚÝŚ, ł¤ Ľ"HˇFóŚÝ4f*!TgÎCŠ×6µHČWÎĂ™Jhń#„Š•ňňŤEź2yd‹±Ę4˙_ן±[‰P%;žÄ)Bµ0]´râťö¬•_ˇšáę3vóYÇl0*oĘbżf'y•3…ĎtŢSÚRÁ`~Ş\ţ¤ôń°ô˝*–WĚhKźV*n$qý» “ýnH©śP˛=s)UJP+ŞR$ݢTIy§ ËÍ—×WŻ1ę4®?c·¨×kA(IŰň×mxQ¬¤L¬âAľ&•¶š-ťP —A8†ëĎŘM‰”9ş˛©5ˇ¤Soą¤Ssą¶TsóĽ‚GuG:µ¬lŰéš«;K¶@>¤t"T\Ć®ěš~f_­ÂŔIłeB·g¨•±’©NŠQŠ=ÝVˇľm†ĹĂÂőgě¦ŐAAvťśu+#>g;š´šB·Rz$ůˇTʎ޶JIĄG1€ŚÝtđ˘ dµJݧÁ1ć„Jť9ł)kˇTŢI^_Jĺ1U>*vÔ–¦PZëŽ`¸»ýD'ľB902vĺÜţ7>ܵ|$=FĆnú%ĂYľń+TGĆ„#ŔČŘ=/ˇ†«P„+c7y>Ăąô+ˇűŔÉŘÍb¨3ŠŠĐa ]c7{mťP €Eč°®±›ż¶ŻP^ˇťBĆ®B¨ł ůrˇÝBĆîůĎCˇ]E˙2v‰P„Ł—»w±&ŠĐ5ô/cW0(áŠĐ1ô2c7f ůÝC˙2v“ (†"t˝ĚŘĄI BWŃżŚ]"ˇĂčeĆ.ŠĐUô/c—Eč0p2v•˙““D ŻM‚ô· Úsňîµ "ˇS@ĚŘ•Č%=ę;´¨ Bş…PĹĚ-Źz¦›ţ D(B‡ JÍŚ(ř6: enjľŠĐ]h„’őuAˇđEŞP†Qˇ´ZˇÝĹ1Bť}aŞ’Bˇ}‘Pů2ąÎ(äź Bş ˇŇu§]R("ˇ0J^ČÝ…‚l5,ŠĐ] ĐM…ĘhN„"t¤P"(†"Ał|"č<€Z)A B%”šˇ{ök|TR(-_Eč.B3#ä›ţ6 *đI˙ŠĐ]Č„BÉť1ˇ.] !FN(üěŚó@Đd„ş4µ „kŠ@@„L( óx„žŁŐÉ’KW µÚ@!T›Ć#\%ÚĘĘÔđąQŻ P„chI¨KOc7‚:Ë ĘđŽ3Šp $”z J¸\łÜ#ÇL„"J%ĚŮ­°Ľ@Šp í •ţŕ©ň Ă mĐ {u~%Ô˙ĚŘR‹PI fŔQb®©3in!^žt×^ĄO!T ˝P‘ýzwů.–q”P_˙Í×Ëš„*k*"Ô‘ęNö€„Š˙tB%2âäÔI7äűžůeśŮőëŻçG‚¨wĺ„Jz¤ě)ů#b :ˇbwŹŇËěŐA^§¬)#”$^ÚŰćâ×'TńÂči;|ýwQT΀wĺ •5SN&"Ôđ *qąŰÍŘ”1ęˇ Ű˝›óFĄĐĹU¸0zŇ nÄŻJ[«4†’ZFj§”T„ŔC•ęN%Çëě"FĄ •ŹůŚşˇô Ł x řyćsQlÇ×F…JĄ<{&B ŠBÝe·ČCŤP){Ž ůŇ­úś…áż3Aţm•PśOs!Q&p>ňÝ),JUé«"ôˇŚCľ»â˙1*ĘCĄ¸$ˇŇcP 5_Ć„rMMőúČ,ź1†ĘE´Ę •;…®PR u‚P†Yľ. ć‰@E]‰ůTi–Ožâ»#B †!ź.Q¦*FŁ•2‡:vęë#„JřTĄ1iP8˙ŇŁîę×_˙:ž“~ đuˇť^›gůN€¤iX¸ŔZ>íďůńNɆĘőőß|ýw_ >Í˙ŽżÖšéuÉ,ßqź†!.ގ~ýő×1ˇŕkţZmĄ×eł|‚„v„ÂŞĹe‘¶Áß0]ú?ńWęŻKgů ­u™ßÂGz˝&B͡ó)W(€€PEüŔ°Ť@ Č0±Dę_đč-@8ŠC„"šE ‚E ˘ŚP—ž!®ŇŹÖ„¶řţ¶ ąp÷GóIEND®B`‚fox1.6-1.6.57/doc/screenshots/pdiary.jpg000066400000000000000000000513041326741342000177370ustar00rootroot00000000000000˙Ř˙ŕJFIF˙ŰC    $.' ",#(7),01444'9=82<.342˙ŰC  2!!22222222222222222222222222222222222222222222222222˙Ŕ=,"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?íuŢYëŇé±ĹH­˘Ë$łK–Ű9ţsďVąŞ!ݧž?1ÜÜŰĎVň°§Á ×9«ÚOyă›Říí^ĺ–ÂŃš4™ă%CËžT˙ë­8|+¨6Żnôy#Iew¸“üÁ™ăž8ôÉÍŠ­ Rµí§—d˙_źBŁvrÉń{ÄÚµÜ>»–Ôoýüw!~ńÝłwô¬ďř_·_ô˙Éć˙âk‘“Ć ¦xHµÓŁ‹űJÍď•ĺ’6&…ů9ÚrĄşŠŐĽń‚Ś}—LłCö)RŐ~Ă—ŽC „ĂŕśŘäîçőKAoKńćaĎ.ćĎü/ŰŻú˙äóń4§ăŐŕ@çĂä#}µ°Hëü5STŐĽ aŞ´/i§\˛†6ň[[)ŠÖʨğ˝ÉčřçéTî‡ňĚG^ů·gĆÎąăý?Çž"Ô®ő;x4k%:l‹ď&¨Ęą žÎzć›ÄÓĄłÝ§šW"çí0ă™ űŰşJ‹ĂšţŹ ďŚšmCNŰwt†ąć_ë•ägő¨‡#Rn EçÝy…ßs°Ôüeâ]'Ną˝ąŇ4˙*Ţ#+Şj®[hô]y÷Ťüm®Ď¨i×Vzťő„WZt3ů]8U-“ŘŚźj’ňçHÓĽ'®Z¦˝§_Ëshn&Ě Źůd “ňáČ÷ë\ĎŠľć˙`koäj$˘éórĄŻźęÂîűžűwŁŮ^ęŤ<°ÇçyAL§ í8ČçźÎˇţÂÓ˝ç'řV™˙Źą?ë‘˙Đ+^¸¸¶Ň‹Ú´«+O `ÄľUSŤ˙.pOZĘěcü.NN›¦gţ¸ţ&“ţo Đ3L˙ż˙‰¬ą|Cq§ękfRęéʔȫ¸ľŘßź-x–č>ÜŽ–Ňŕ]ŮÁrŞČ&Ťd ÝFFpjýµOćx¬ŚďřAĽ-˙@Í3ţüţ&ŹřAĽ-˙@Í3ţüţ&µč§íŞ3űÂČČ˙„Âßô Ó?ďÁ˙âh˙„Âßô Ó?ďÁ˙âk^Š=µOćxYđx[ţšgýř?üMđx[ţšgýř?üMkŃG¶©üĎď ##ţo Đ3L˙ż˙‰Łţo Đ3L˙ż˙‰­z(öŐ?™ýádd áoúiź÷ŕ˙ń4 áoúiź÷ŕ˙ń5ŻEÚ§ó?Ľ,ŚŹřAĽ-˙@Í3ţüţ&ŹřAĽ-˙@Í3ţüţ&µčŁŰTţg÷…‘‘˙7…żč¦ß˙ÄŃ˙7…żč¦ß˙ÄÖ˝{jźĚţđ˛2?áđ·ý4Ďűđřš?áđ·ý4Ďűđřš×˘ŹmSůźŢFGü Ţ˙ f™˙~˙Gü Ţ˙ f™˙~˙ZôQíŞ3űÂČČ˙„Âßô Ó?ďÁ˙âh˙„Âßô Ó?ďÁ˙âk^Š=µOćxYđx[ţšgýř?üMđx[ţšgýř?üMkŃG¶©üĎď ##ţo Đ3L˙ż˙‰Łţo Đ3L˙ż˙‰­z(öŐ?™ýádd áoúiź÷ŕ˙ń4 áoúiź÷ŕ˙ń5ŻEÚ§ó?Ľ,ŚŹřAĽ-˙@Í3ţüţ&ŹřAĽ-˙@Í3ţüţ&µčŁŰTţg÷…‘‘˙7…żč¦ß˙ÄŃ˙7…żč¦ß˙ÄÖ˝aßkf×^‚Đ䍫0Çw$.01HáłĎ{jźĚţđ˛%˙„Âßô Ó?ďÁ˙âh˙„Âßô Ó?ďÁ˙âk6ËĹN¶Vď ’^HVO•Ł*Io»Ăd—÷«?đ’yÚ†™ko îş–@áŰ•DŢ3ÇrS#čG˝Ú§ó?Ľ,‰¤đ_…Łţ%zk8@y?•ywÄč"¶ń-ĽF±Ĺ”hŁT öYţüőÓ˙e5ăßämŹţ˝˙Bj™Tśľ'qŘ÷ dÜHÄű˛ÉZČĽ‹íФ‚ĺT0pcu äwőçđ­Kźőçč?¨jÍű ł@bźN7†§XÜżOĽIç ü‡Ą[˛¨U´”0)ÇëSŃ@ůŇϬżš˙ńTyŇϬżš˙ńU5ť'üúËůŻ˙Gť'üúËůŻ˙SQ@ůŇϬżš˙ńTyŇϬżš˙ńU5ť'üúËůŻ˙Gť'üúËůŻ˙SQ@ůŇϬżš˙ńTyŇϬżš˙ńU5ť'üúËůŻ˙Gť'üúËůŻ˙TuŹézÄÚťĂ[¤­µÄ쥽2ŕńOÖuÍ7Ăö‰uŞ\‹xA±Fl±Ŕ=  ~tźóë/ćżüUtźóë/ćżüU>Vx–T†@t(@#ń§Đ>tźóë/ćżüUtźóë/ćżüUMY+â}ő¤®ˇ˝bBÇÉ@l`‘éśĐ‡ť'üúËůŻ˙Gť'üúËůŻ˙P¶©d—˘Ń§bBăiÚŚ…-Ś#śg4>©eč´iŔ¸Úv†=¶0öäĐŢtźóë/ćżüUtźóë/ćżüU2÷PµÓŇ'»D˛Ę¦A;ťŽqęjÍCçI˙>˛ţk˙ĹQçI˙>˛ţk˙ĹTÔP>tźóë/ćżüUtźóë/ćżüUMECçI˙>˛ţk˙ĹQçI˙>˛ţk˙ĹTÔP>tźóë/ćżüUtźóë/ćżüUMECçI˙>˛ţk˙ĹU ôôžáćhŻW{xÖUÄFyč?*Ő˘€3SO°Žh±,AüÁŠ ˇ˙˝Śő÷©,Ť ÓvmĚÁ#É<“žĽČzUę(ł4’Éî$PŻ’Xݎô>őä?ämŹţ˝˙BjözńŹŠżň6Ç˙^‰˙ˇ5{mĎúóôČT55ĎúóôČT4QEQEQEQEQEQEĚřĎMZ´´Ňć!¸’ESĆUĽ™6ś}q^{­Ý^ęź Íޤ†9-Dvj˛™¤Y@‘čxU9ë^Ĺ-­ĽŇ¤˛ŰĹ$‰÷YżCÚ’[+[… 5´2Iăő<Đř˙_ľ±şŐłőy|Č#‚HŇ9 Bß,88—pG<ö­ťxęV>1´KYďfłÖ kp«;í¶—Ż¸<|Ľđ8Á>ŐÚ}†Ďű,Ůĺ˙«wűżOjŁk˘}›X–ůŻ®%Ś˙©¶s”€ĎAĹjD‚(’0X…P ł'¤ňMp¦µá«ßi¶MwLۢ†fyg<]ŁSדÇc^USL°ŽA"XŰ+©Ča‚®q@c¨éş”ĐkvEdkÉüI‚NLgXî…Ç==¨ŐtÝJhѸLĐa̳ʣʍŔzf€<żÇW—Ď­hďq¤Ţ(‡Y…`}Čc‘Tśůłą¸<€8¶O©Ó$†)¶y±#ě`ËąAÚGqďO Š( Š( Š( Š( Š( Š( ĽcâŻüŤ±˙עčM^Ď^1ńWţFŘ˙ëŃ?ô& iż8vǢ˙!\Ě:Ľń\J—Ä©ó%‚HHbpĂćRHéšęníhlăI'`6«ľŔxç·µc˙Â%©0ř•éÇí Gç–’ĺŕäÇqžŐčajÓ„-'­Ďϰ8ĽF)J”Ź*Z5˝Ý÷kˇ—˙ M iŠč$RĽ-!Q·z‚p9îţ\ă"ˇ˙„©-ŮĹíĽńź<Ćv“ůBďäŕ‘ôĹn'‚58ˇňSCÓ–-ĺö łŤÄ'îz*ŕ]H“ześs!n]@—9V9Cś‘¸}ë¬Sţe÷Ŕ<…”bďoe+‰ň_çţołżKäw‹xÁNď]ˇż“ łą˝OçNłđ®˝ag­ľ™d±F»T}łő?'ZźűÄźôł˙ŔÓ˙ÄV‹BÚ´qĎ%Íyź$%oUţemÍę:ˇgsw%őÄrI°§GŤJ…lś®rr@Ç5±ýâOúY˙ŕi˙â*…‡†µHeťlll «m•R-°őÁNÓůPń.µEC&ÍTdś%~šŻó&Üާó­ß ˘ËŞŢ,ŠE•ą†pL·? ü…e˙`x“ţÖřřŠłˇ˙niúőô Ą[<‚ĘŰ ^`ć\słÜţUÍ‹­Jtí­Ďk‡rě~牋QĺkW}nĽÎÓěÖ˙óÂ/űŕQökůáýđ+3íÚďým˙đ;˙°ŁíÚďým˙đ;˙°Ż4űcOěÖ˙óÂ/űŕQökůáýđ+3íÚďým˙đ;˙°ŁíÚďým˙đ;˙°  ?ł[˙ĎżďGŮ­˙ç„_÷Ŕ¬Ď·kżô·˙ŔďţÂŹ·kżô·˙Ŕďţ€4ţÍo˙<"˙ľf·˙žßł>Ý®˙Đß˙żű >Ý®˙Đß˙żű Óű5żüđ‹ţř}šßţxE˙| Ěűv»˙@[ü˙ě(űv»˙@[ü˙ě(OěÖ˙óÂ/űŕQökůáýđ+3íÚďým˙đ;˙°ŁíÚďým˙đ;˙°  ?ł[˙ĎżďGŮ­˙ç„_÷Ŕ¬Ď·kżô·˙ŔďţÂŹ·kżô·˙Ŕďţ€4ţÍo˙<"˙ľf·˙žßł>Ý®˙Đß˙żű >Ý®˙Đß˙żű Óű5żüđ‹ţř}šßţxE˙| Ěűv»˙@[ü˙ě(űv»˙@[ü˙ě(OěÖ˙óÂ/űŕQökůáýđ+3íÚďým˙đ;˙°ŁíÚďým˙đ;˙°  ?ł[˙ĎżďGŮ­˙ç„_÷Ŕ¬Ď·kżô·˙ŔďţÂŹ·kżô·˙Ŕďţ€4ţÍo˙<"˙ľf·˙žßł>Ý®˙Đß˙żű >Ý®˙Đß˙żű Óű5żüđ‹ţřËřÂö-Ć{őµ2ů1ň˘3?ŢŕRqZżn×č o˙ßý…bëVşö§:7Ú-tŔŞ‹ĘűInNvWqŚvëčĆÇâ#®Ç ÜÇo=™’ě¬ĐK–ĘDNpxÁÍyďĹ_ůc˙ŻD˙Đš˝f_ ę?iµ»˝Őáť-$2,qŮůe‰R˝wźďzW“|U˙‘¶?úôOý ¨ßtßůEţďţÉYxoÄ6÷V’Ç3·Ľ»ą†7“!T¸w<¨b„×R06óݦ˙Čz/÷öJęh‰KołÉ$rßGQ»ÁĎg“÷XFxĎ›ŽzuŞŮř±öâoEě¶öÉ$ĚѸ2ˇ°ŤCŻîňëÔ‚čzW˘Ń@ß…'Őnţ×=üŢd ůqŚ1ŢěJă°‰őŚ×IEV—i:x‚ňäŮ5­ą‰bEm€d1'nĂČ=rÜäÖőVE·üŽ:—ýí?ôeĹk×1©j_ŘúĆ»¨yhţF™hű^MŠyqŐ°p=đh§˘ą«OŰĘĐ­ÄJ˘U«Z»\ YF" »¤rOŐĆńVŠ®Ş/ †PČńÂaU‚Ěw.Ç#ŽhfŠÍ±×´ÝJa ­Ă4„1ÚŃ:UŠ•;€Ă§ĺ<ńśbŞÁâ5“Ăú†«%«Ć,–fh·‚Ě#?ČŹ¨8$` Ę+ ëFÂ1ýµ6’1%EĽŹ:ěÜěv)U\ŚłŁ#'š˝o¦Z5ŐÓ8‰H¤M!ä㢂JłE`ÍâxʆőfÂŮîŇËÍůó–V< g#?źçń G¬ýŚÚfßí?d3+–7Čóţŕ^WoÎsŰĐĺÍÜř–îit”Óíäş™ĘÂ>ÖvŚ+?ďHBc%P•6}«kLľ]OJłżD(—P$Ę­ŐC(8?ťZ˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(¬ }Ěr«(\íQ’ ˙{Ö·ëžńß_˘˙ěÔÇkwľŁ˘)`Ţ6B¨ýÔťq^WńWţFŘ˙ëŃ?ô&ŻOÖ?ä'ˇ˙×ăč™+Ě>*˙ČŰýz'ţ„Ôîö÷eŐVo&i¶Źą îcňöŻýľ?čŞ˙ŕ7˙^ł´ßůEţďţÉMHßGą×o­íźqÔ`°wK,aQč7Hxi˙oŹúężř ˙ףű|Đ'U˙Ŕoţ˝s–ţ&ń-Ρ űĽ6ŁÎŘ&‚a#*ďŘř F2H=p: Žç]Ö%źM‘ăyoć#łpÓŹ"C¸śŕ ŘyÉĆJé˙·Çýu_ü˙ëŃýľ?čŞ˙ŕ7˙^°´/k·şŚw–Đ~ńŽŮ"ŤÂş&|Ö€#á#’[íÚĐ?öř˙ N«˙€ßýz?·Çýu_ü˙ëÖĹs}UüG®>Ąmu Éĺ4BGV(. GµŹđ…'8ä“Ć@  ˙Űăţ:Żţőëćú-K]ŐíĄÓµtIôűT&;ťq$ç<ä}>†»zȶ˙‘ÇR˙°}§ţڏ  łł2Ap,ü@·°łş]‹uŢţócrFGÝĆ ă<ÖLÚ,Âm¶qjvö6v˙a,"‘vbBKeŘ3ŚyϦQ@^‰éF)ć¶×.nŔ“Ěsmµ]¤ČÇhéË:wĆy§ZŰiÖ¶·Ö«¤ëOo{“$moŇ< ÁáN2I*˙ČŰýz'ţ„ÔîöđIqެQ]Mjäq,! /ËŰz°üĹH&Ιöăâť]GÓLVľ` pF<žˇľ\zÓ´ßůEţďţÉSż„mźR7fć_,ÍĽÁ“łËÎó3Ś>rqČůqŠCČćyŘĽa¨,r[­ÖY†HŘ–WĄE‚~ϨI}o|‚qpóÁçDň(.X°u2a‡Îq·f03śUdřwhÖö?mH™¦HJyډ®v°8ĚcŁgŽ´˘štI,—I⻥’XDŻ0[0^%Îź'•<ô梲š+řĐřĘř+Bîű,±»#0ý×+•'>”ŐđHŤ# {¸˙GČ2¬ľ`',I\äťÄ Őď]Ojß­ĎÍ3Ľ Ĭei ýá ?x~đcÇPBšM䋹Ó˙F\Pc_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Gö5˙ý şŻýűµ˙ă5±Ec˙c_˙ĐËŞ˙ß»_ţ3Yş­¬Ö«˛kë‹Ć%H’uŚ>n>EQŹĂ<×U\÷ľúý˙f 'X˙ž‡˙_Ť˙˘dŻ0ř«˙#lőčźúW§ëňĐ˙ëńżôL•ćämŹţ˝˙Bj÷Ý7ţCŃ»˙˛WS\¶›˙!čżÝ˙Ů+© Š( Š( Š( ą-vćîÎ÷ÄŘ:ĄÚi–žS8ůCy·ϵuµ„e‚ęňܲ¬)§Z,21ć\Pü&ZśW·˛¶šÎ¬–ÉmhŇö13ů…ŰśsÇ ëšWńŐőˤvşJÂK`%–ĺůŢ-ŕž6ČFá‘Ćk®…ěu[S"Ć“E'Ęë,X?)čĘĂ#±$±ZBł\Ë JgĚr%č}Gµr~:ťě-ćm0ćhŕ‰Ţë%¤eŤ˛řO•G™Ërx'mh7Šç]Úôi‚i§ąšÔEo1uóť ´eX ççśVÔÖ:Žś`1ŹłLźňÉŚd©ˇRČăŽÜSětŰ=:Ę;H8!ÉEäŕ’I9<’I$“É$Đ să]Fîů…łC Ád|3si·+Ćĺ,pOFÎ~^tőťnňm3J–/2ÖI5)mgH'Aź-'uŁ &şyĹ•ż•ç$KľEHňď˙ýjI¬í®#ň涆HĂoÚčÝëß“ůĐ ¦ř—P˝ńN—hÓ°‰Ěk8Ŕ !6fR@#*2GŢř«ăĆ7>'µŇ łŤ"k˛†f—"HÂIž6ĺX:®~™®Ş5µ•ĚŃ]Ă]@$0ůHϨéúUT—JţĐ’(Ö¶vH1Ľ°PüńŘ2śôäw4JÚĺćń<ŃŰę 41«,ń1]¨üaPśŽrzr\ăv¨Núfźp×3$LęĚe1€ĚÜFěrp¤ă®=ŞÔ·VđZµÔÓGş¦ö–F ޸ÎI=KEQ˛Öl5 ZyĎś«żĘ’6ŤĘôÜ€%rq¸qďO˛Ő,ő•mfó xĎĘ@ ç ¤Ź™Ndu  tU[˝FŇÁî§XUČKä  8ő )8ŕUŞ(˘Š(˘Š(˘Š(˘Š(˘Š+žńß_˘˙ěŐĐ×=â/ľżE˙٨‰Ö?ä'ˇ˙×ăč™+Ě>*˙ČŰýz'ţ„ŐéúÇü„ô?úüoý%y‡Ĺ_ůc˙ŻD˙Đš€=÷M8ףĎ÷öJę7/¨üë‘·´¶ľŐ–ŢîŢ+|ŃĘÔár2k6âÂÎÄę˛ËˇčwZę6Ö‘E”ˇĘČa'ťÇ-‰Hµzĺőť—Ô~uĂIwŕČěeş>¶>Tílń‹w 3#/§HÎqžřć–řřjŢ+ÄÂ6ň]Â]R#cÜUK’@ŔÇr  A Ćĺőť—Ô~uŔÁ}ŕÖąŽÎŘ‹–Ś0d˛„Łą}¤gI“ß·‡|5wi ĚzTYuśyÁâ€6÷/¨üčÜľŁó¬źřE|;˙@/˙ă˙ çü7cˇë9źDŇĺ’ě±*î+÷aÇxb€;mËę?:ç® ž Ö­öE'™¦Ú€’1U'̸ęG#ę:UżřE|;˙@/˙ă˙ Ę·đ΀|[¨Ćt=4ƶ6¬ě‘ŕ%ĆN1ßň^çĂzŐŮÓ™ő‚ÝÜÖě¶ŔYJťďiŽvź›­U—ÁÚ˘éŃŰ$Ö÷(lbŠhg»,—]^MŰX÷LqÎÜq]?ü"ľ˙ —˙€q˙…đŠřwţ€:_ţÇţF÷GÔ^[´žÝŢ͡-$Ź€űpP0FqéŔä7pě|«¤’ËČZ=Č!Oµ3ěOś˛ĺcAË<(éůő_đŠřwţ€:_ţÇţÂ+áßúéřřPoá?]Ř‘%Ě6wAî\ýˇÝćc)Ů)@] |Ľś†íҶ4ŹjVŘĽ·é ®ÎŻt_b8]± <ŚôQÉÎîŁgţ_˙ĐK˙Ŕ8˙ÂŹřE|;˙@/˙ă˙ Ć“Ă7ë|ňA5ľÇşyĂ™ťZ2Ň.)±”Ć@Ŕ<ŕZ}ö=OZżł»Š)µ±Ę …XqĂ+8Ś‘Ć/˙Â+áßúéřřQ˙݇čĄ˙ŕá@‰đ6«$0¬·±H"30Š[’ęăňĆ Ć c%ľď^;ć·‡‡î`Ńďl –&ĚĐÍmł1RSËfWb Ă26O<1úV‡ü"ľ˙ —˙€q˙…đŠřwţ€:_ţÇţŹáíâ TŢOöŘlͶäÄĆRĂi;’F=ą<ă°Gđޡ,R[yCf%FŽÝn¤uC䌏§Č2ŁoZŮ˙„WĂżôŇ˙đ?đŁţ_˙ĐK˙Ŕ8˙€9+żj×Is—¶Ď€¤óľÚŢHÜôăç·żµnA ^Zë©*˙ČŰýz'ţ„ŐěOáM2ŃăĽVĽymŰt~uÜŽ ®pN3‚kÇ~*˙ČŰýz'ţ„ÔîöňOŞŻmžP8ŚľĚüľ¸52ßIs%Ň.‘c#ůËqpRRC¦Ý¬ÜqŤ‹˙|Ѧ˙Čz/÷öJ¦4mnĎGŰg$‚â[»™"P¬ě8ä1uÉç·4$šJĎpŻ'…mR^@>Ü9-ÍŚu;Č'ĐéRĎĄËsçůž‡3ąyu¬IÎy[ pKÜÖTöž'7˛N±Ţ‰ü©"iÇ–Ë™U“Ę@Ę[ĺP$u'<`ęřJë\˝“v§0aB9ŔŰ9XË(Ć~ă,€óŐ±Î(µÇ‡äžXŘxu#U`ÍżW۵”€ "±ŰŤÄsśśîýż[ó‹˙G˙[P?ŰőżúÇ˙Ł˙‰¬Í6âH®®[NѬÚbz#Ô•ĘrxĆŃśđ03]]eiv;ëűů X¦žS(ĺ‰ Čë¸ĺ˙ŕ@vÍ3íúßýă˙ŔŃ˙ÄÖU˝öł˙ n˘ĂFŚą±µ~Ř8eĆvý*ëk"ŰţGKţÁöźú2â€íúßýă˙ŔŃ˙ÄŃöýoţ€q˙ŕh˙âkbŠÇű~·˙@8˙đ4ń4}ż[˙ ř?řšŘ˘€1ţß­˙Đ?ü üMoÖ˙čţŹţ&¶(  ·ëôŹ˙G˙GŰőżúÇ˙Ł˙‰­Š(íúßýă˙ŔŃ˙ÄŃöýoţ€q˙ŕh˙âkbŠÇű~·˙@8˙đ4ń4}ż[˙ ř?řšŘ˘€1ţß­˙Đ?ü üMoÖ˙čţŹţ&¶(  ·ëôŹ˙G˙GŰőżúÇ˙Ł˙‰­Š(íúßýă˙ŔŃ˙ÄŃöýoţ€q˙ŕh˙âkbŠÇű~·˙@8˙đ4ń4}ż[˙ ř?řšŘ˘€1ţß­˙Đ?ü üMoÖ˙čţŹţ&¶(  ·ëôŹ˙G˙GŰőżúÇ˙Ł˙‰­Š(íúßýă˙ŔŃ˙ÄÔRÍw3»´Ň€‹(“#×8­ÚËÔżăáÝţ¦€2ď?ăŇOĂů×€üU˙‘¶?úôOý «ßŻăŇOĂů×€üU˙‘¶?úôOý ¨ßtßůEţďţÉ]Mq‚ţ-3Ps¬­‘nWő«żđťi_óď¨˙ŕŐF–©UĹP¤ůjM'ćŇ:j+™˙„ëJ˙ź}G˙ŢŹřN´Żů÷Ôđ 꽕Oĺqź×đźóö?ř˙3¦˘ąźřN´Żů÷Ôđ č˙„ëJ˙ź}G˙ŢŹeSů_Ü_ÂĎŘ˙ŕKüΚŠćá:ŇżçßQ˙Ŕ7Łţ­+ţ}őüz=•Oĺp} ˙?c˙/ó:jĺďîžĎÄş¤č’ą]>Ôěe›÷—N˙„ëJ˙ź}G˙޲Ó_ŠűÄ·łŰXjR#Y[-[QÉČ㚢ţ;lÖqć†iĄŚ¬‚EXŐAąÎĎ“"<í#<ô5^}*Ň{éď—¬¤˛˛É”´¤ŠT«·$‚‹Á%xéU¤đý´¶ňA%·Z9šGś}™zďż,~Nďîŕtâ·†ĽŁW˙&4|Ž„x·Nhډ¨<€;ë÷@lmlă8ÚsĐŐ‰uűh#µ–KÇXî±äľ©Î1“Ś.r:ă­r÷úT­ ąÓm5kkcIžĐľŐÇŚd‰rçÍMq¤[Ý[éńK§ë_čqĆŠVĚá#;”íäu\z‡ĆčŇ«oűz˙—őĺ¸ůŁäkŻŚ´—Ž9TĘȻӆů—î}Üîé€yůN%OŮů ,š‚(IZ&Ă1‚–ÇAü#?§5‰ýŹe‚?˛őľt˙ěďř÷?걏O˝ďJÚM„ęú6®Ĺáh 6¤ť¬ĺý;}¨xFÂř·Nu,şđŞÄl|Ś–#*ÜuI< ÓćńMŤ˝ĂA-ó¤Ş@ÚQůă9|Ŕ’F@ďŠÂM"Ö;y"]?\S"Ć®ëj;Řp(űíĐqÁ ‰ô;a¨6ˇ›«µŔó4–Ó)—6ěĚăŐŽ: kŚ»Ň­ľĺý~kš>GK6ĽÔĎoö‹°˛Ů`8ĎOLůÓ,üA=ÝŇŔlőwwĘ„(úšŁ¤źě­:+TÓ5geĚ•­X™9őÇáŇŻiÉ˙@­S˙Z°–2WQ§QůűĹsCş4üůżç«ţtyóĎWüë3űNOújźř ÔiÉ˙@­S˙Z±ú¦oü•?ňaóSň4üůżç«ţtyóĎWüë3űNOújźř ÔiÉ˙@­S˙ZŹŞf˙ÉS˙&j~Fźź7üőÎŹ>oůę˙ťfiÉ˙@­S˙ZŹí9?čŞŕ+QőLßů*äÁÍOČÓóć˙žŻůŃçÍ˙=_ó¬Ďí9?čŞŕ+Qý§'ýµOüj>©›˙%Oü9©ů~|ßóŐ˙:<ůżç«ţu™ý§'ýµOüj?´ä˙ V©˙€­GŐ3ä©˙“5?#OĎ›ţzżçGź7üőÎł?´ä˙ V©˙€­Göśźô Ő?đ¨ú¦oü•?ň`ć§äiůóĎWüę)ť˛ĚX㹪?ÚrĐ+T˙ŔV©ŕť®ł[ÜAŤłĆPźpjöř{CĄŚÔl÷˝ż*®: Ľ˙ŹI?ç^ńWţFŘ˙ëŃ?ô&Ż~Ľ˙ŹI?ç^ńWţFŘ˙ëŃ?ô&Żľ9Oiżűíô_ä+‹K‰¬[QhUć”dů¬—Ŕ §°Şö»K˙ľßEţB¨W­Ťé|˙D~{ĹUT1É5tâżô¦rVšćޱ\\ÜÂv¶í°» „•ď†e©ŞK"eňós  şU$”ú¸Ĺ­ÝĚ+Ő…Fą#`®@óţßućůŰónÝ÷·ąă8ÇN1]ÜnÓ&ya(Űp­˙ ˙Č^÷ţĽmżômÍ`U{­zçĂňÜÝ[’?Đí÷ˇ‰ýíĎŁjr1śŹnkĺ?¶đúű˛ű—ůźcţ±au÷e§’˙3ŐhŻ/;ÔHŚ‹űr$ÎĚ*|ŘëŹZVńΦ…C^Ŕ «•^IčOöîůe÷ÁúÉ„ţY}ËüĎO˘ĽĹĽmŞˇ!®á\uĘ(Çţ†Ş§Äkçşű7Ű#Śî4ůHŮĆ}NőĆ)¬óöŚľĺţcŹáe´e÷/ó=bŠň‰~!j°Ţws…U/(‰6.âBçżQéVÇŁ9E˝€¸;J„\ץ<Ă­ye÷/óÄxT®ă/ą™éôW'Ž5I˘^ŔĚmŞŠNCM˙„ďQĂ·Űá[iůSéőĄý»†ţY}ßđI˙Y0źË/ą™ę4W–ęFôZ-ÜM6Ćr˘5;@ sé÷…x÷R” ]ÄĄťăUhÔ(ĹN~E?íĚ>ü˛ű—ůŹýcÂÚü˛ű—ůž§Eypńޢ@"ţÜ‚vŚ*rzcőťM˙ Žł˙? ˙~—ü)<÷ ·Rű—ů‰ń.o}ËüĎK˘ĽÓţgţ~ţý/řQ˙ Žł˙? ˙~—ü)oa{?ążÖli}ËüĎK˘ĽÓţgţ~ţý/řQ˙ Žł˙? ˙~—ü(ţŢÂör˙0˙Y°}Ą÷/ó=.ŠóOřLuźůřOűôżáGü&:Ďüü'ýú_đŁű{ ŮýËüĂýfÁö—ÜżĚôş+Í?á1Öçá?ďŇ˙…đë?óđź÷éÂŹíě/g÷/óő›Ú_r˙3ŇčŻ4˙„ÇY˙ź„˙żKţÂc¬˙ĎÂߥ˙ ?·°˝źÜżĚ?Öli}ËüĎK¬˝Kţ>ýÁüÍqđë?óđź÷é¶´}NëUµy®Ü3«”(`ßZéÂć´15=śżźü9ŐÎđŘʾʚwóKüË7żńé'áüëŔ~*˙ČŰýz'ţ„Őďןńé'áüëŔ~*˙ČŰýz'ţ„ŐéÁěş˝Ä6©$ÓĘ‘FˇrÎpJĂţŢŇč%k˙Et˙}ľ‹ü…rę’ÚÜL.%i‰•Tčc Ň„Č d`0Č>†˝\ š§ó˙#óţ(ĄŐĄß*ënŻÉ—˙·´źú Z˙ßŃGöö“˙A+_űú+-|Y˝&™l[¤Ď Čł˝•YSÎ{Ž˝Ł&ą¶’DšŮ.í;a›>XbŞNŃ»,Oˇő×íWŔů˙¨ËnG˙/ň6?·´źú Z˙ßŃGöö“˙A+_űú*M3P•łN±íMŘV ¸0Ŕ$ő$}A«µ˘»WLĺš§ rĘ.ţ«üŚďíí'ţ‚Vż÷ôQý˝¤˙ĐJ×ţţŠŃ¬=&îîMRâ ‰|Ôď Ys¸Ź—€8<Ňm¦‘P…9ĆRIéç˙·ý˝¤˙ĐJ×ţţŠË×/tíR+‹hŻíŹ™iç!ŔýĺÁägžŁó®–·ü'˙!{ßúń¶˙Ń·5ććÔ]l7łn×höřvŤÚ[Xŕ]J(Âł1TB¨2AůT0Ć1Đ’9D~^wnéßëŢľ‘˘ľUeÓÚ?ąZ˛++*Żî_ä|ç …¤;±% n„‘´ł§žIĎAŚTRiVłJ˛KŞFÄ/—€ĄFĚ(ěĂź”uČäńéôŤ,˘ÎţŃýČCguUßŃ‘óÍý¦źq$­|z*„őlźZ¬şU€Yż‰Ś‘H€”VuEÜ9ěő<×ŃôRŽN˘¬Ş?ŔQČU•W÷#çŰ…·žöIMü" V5xö|Ça$ałÇ_J¨Ú}łÜĎ;jtźq—pd9Îs»28_FŃJ9,cµG÷!G‡ŁŞżą<ŮÚéöZ‹ÜÇwÂHĆ~\㎸ǀޑéV‚îYćÔŁ”˛”’nĺŹ?7`°Ż¤h¦˛tŻűÇ®ť˛®ý«×M‘óµµ´Ň3.§9QcĂ‚ě’rAÁp)‡OłiᙵŢ­˝ń¸ŢcI•°9c×w}kčĘ(ţĆ[űG÷ ţŔWżµr˙#ćŘô‹0óĽş”R<ɱBJ 7|Ěyů{cŻjč?´-?çâ?νʊš™$j|UŕE^…[sŐnŢHđßí OůřŹóŁűBÓţ~#üëܨ¬˙Őú_Î˙/őZ‡üüáżÚźóńçGö…§üüGů׹QGúżKůßŕęµůř˙Ă´-?çâ?ÎŹí OůřŹóŻr˘Źő~—óżŔ?Őjóńţ†˙hZĎÄťÚźóńç^ĺEęý/瀪Ô?çăü ţĐ´˙ź˙:?´-?çâ?νʊ?Őú_Î˙˙U¨ĎÇřýˇi˙?ţuŮxFhçÓ&hť\ $}zeę_ńđżî˙S]X<¦žŻ´Ś›;p,eZ3m™wżńé'áüëŔ~*˙ČŰýz'ţ„Őďןńé'áüëŔ~*˙ČŰýz'ţ„ŐëáíÓŮO¨]kicŠW"Qž€ŹçTÂ÷ŰŞhě/%hGúţőÔ6ŕ~~pşúVö›˙!čżÝ˙Ů+:/]ÁuÄ7‰Ĺsup€D/2LĄ—ŽąxŽ8ç'"µ…jV‹819f?iZv·]ľL`đ>¬űKś‘ö7ëÓ?~ŞźÜË+Y Ý$I 6Ą›«Fŕ©%‘ϢžŐ™ä”ΖĺcłCÜŚ±H|¬6p3Ę9äqş©Íá }˘»In“K ĽËtŢdňGć“)-É‘NĐ~GZŻ­Uî`˛,˝mOńćM‚u‹xµ9#ŤBŞ‹WŕźÇR®ĐOO˙ŔW˙âëS–:…żÚî/ć•ÄŤ˛%— ‘˝Ü±§Í!QŔůQMt”ţµ[ů‰yZÝÝ%÷żó8řCőĎú é˙ř ˙ü]d®’ŃE=Ä:ćę.<‰ZŢÎI K·q\+’ĚÉĆqϡŻN®rçGż[ůo­–ŢWĽŽ)$(~Č °Sśž‡€=x>µ[ůű-˙źKďćcÇá=bh’Xµm1ău ®¶ÎCĐćr*]#O׬ýÁüÍeŢǤź‡óŻř«˙#lőčźúWż^˙Ǥź‡óŻř«˙#lőčźúPľéżň‹ýßý’şšä-äž-U^ŢßíÄ{Âgĺő5Łą¨O+Ĺ• ’'ßDżŚ•úŇ€7¨¬í gţ€C˙ü)§«©´EŽo“ůPÍŹýˇ¬˙Đŕb…ÚĎý‡ţ'řPĹŹýˇ¬˙Đŕb…4ęş° NŠiæ§Žăó  ŞÂ±řżQ,áA°ł$ “-Ŕó©´5źúü Ođ¬ގ¨xŹR†}8kMČ/•Ä“•`ĂôÇ ŚÖ5âĺMĆ;Ťn>?ŮŰiúlšŚrů×VIrßgPĘĆd(qlŕ8éŽrjĎü&zxÔb°h/VéYË a%]ŔNHţŘmç’' F<ĄÚ±ĄöČŔŘP| HS·$gŞGÓg’ěÜ·†PČÍąĎŰ@{n^ŤŽŁ9Áäb¸~Ż+|/ď_×ůr{ŹČtűË++‰EÍ×’Đ‚B6±8%‚çĺýG^*ńĽRĘc˛¶šŕůŤĹU5‘7 ĺ˛Ç‚Nŕםôˇ±[?řG Â’Wf˘UĂźâŢěóŽ˝8¦Ç¤És…aS!ڶ/ű ŹL8ěNhT%Ö/ďţż­BĺyĽlĂĂňO ŤĂę‹§µß’ČŞˇBó\|™aĆwóŇ®Íăm* ‹¸d[ŚŰ—-´# ŽXÝ1őÁÎ8¨.tg»ŹË—Ă ·Ęĺ/öĆÂT‚WČ< ô şňŢ%ČđůP˛ #z¬ŚTĺF!@98\u§ě%üŻďţżŕ…ÎĂśsžśRó»ľsɬźµë_ô_ü OđĄű^łźů®3źřű_𬖷oÇúţ´Ń©ü=ńŽźŤ/9ďśśVOÚő¬Č sŚÇÚ…/ÚőźúŻ9˙—µ˙ K [·nľ× ]>ýłGnřç˛ţ×­Đ {ËÚ…kÖżčą˙Ż´˙ >­[·ăçýz…Ń©Î{籣śgľk/ízĎý×őöżáGÚőŻúŻţ§řPđŐ»~?×ő ]˝Ç\d`RsŽůÇ_ƲţŮ­g?ŘKś˙ĎÚ…'Úµścű qŹůű_đˇá«vď×ú˙€F·s×9¤çŽ˝±YlÖłźě%ÎOü˝§řQö˝kţ€kŰ?éiţţ­[·ăýZ…Ń©Î{çśš;wÇqYkÖza®?ëíÂŹµë]°—?őöźáKęŐ»~?×üćF§>ýńKÎ{ç#5•ö˝kţ€kßţ^Óü(ű^łźů®2?ĺíÂźŐ«_oÇČ.Ť?áďŚtüiÜîďśńY?kÖ±˙ 5Î1˙iţżkÖs˙ 5Ćs˙kţ–·nÝŻřtjsŽ3Óšˇ}ţązăoÚőŻúŻţ§řU OV6Ň^ęńǧÇ‹H®¸9ä¶@Öřj5!Q9!6¬>óţ=$ü?ťxĹ_ůc˙ŻD˙Đš˝nYß­‚éw0^Cur`’D …Â3đA<ĺEy'Ĺ_ůc˙ŻD˙Đš˝"złš;}e%•¶ ^Oü k¤±“Z»˛UYfÔ`™|´Ą„,@3ęAÎ9üęźőçč?Ąx Ś…idÝ€N#r3ýęηÖT{möů·dŤÇ<Źji˛×‹ýµmĎý8˙ötŻEcý‡]˙ Ő·ţ˙öt}‡]˙ Ő·ţ˙öt®ßtóŽ:Š«§K<¶j×ç$+2íg^ĚW±>źË ĄöwţVßř˙ŮŃöwţVßř˙ŮĐĹŹöwţVßř˙ŮŃöwţVßř˙ŮĐĹfé?ň:ę?őÂ×ůËPý‡]˙ Ő·ţ˙öu&ź§_Y]Ţ^É×sÇ+ýźj¦ÍŘ%ws÷ýGJÔ˘±ţĂ®˙ĐjŰ˙ű:>Ă®˙ĐjŰ˙ű:ŘŞz„łĹFŰ-)›r®Cáç>Ýúa×č5m˙€?ýťa×č5m˙€?ýť\µ–wşąFË@­ňH˴纏P=ž3W+ě:ďý­żđ˙łŁě:ďý­żđ˙ł  Š+ě:ďý­żđ˙łŁě:ďý­żđ˙ł H˙¶ą˙_I˙˘’ĽĂâŻüŤ±˙עčM^­ĄiÓصܗ7Kq5̢Fe‹Ë ÉôŻ)ř«˙#lőčźúP¶Ü˙Ż?Aü…+Cl6 /¨Í%ĎúóôČQsţżţżú ˇţ{źűâŹ.ůîďŠ†Š›Ë‡ţ{źűâŹ.ůîďŠ†Š›Ë‡ţ{źűâŹ.ůîďŠ†Š›Ë‡ţ{źűâŹ.ůîďŠËÖ^Hô=AáfYVÚBڇ§{ÖŹ©éXŃ–1™n+ŽDŤ†Ü8č6´pŘyp˙Ďs˙|QĺĂ˙=Ďýń\žť«j—zŽš—+QÍl·ĐŕďVÂdźĽ źCŚqšé¨o.ůîďŠ<¸çą˙ľ*(o.ůîďŠ<¸çą˙ľ*(o.ůîďŠ<¸çą˙ľ*(#s Ö#Ócfi/7qn ýjŮŠHóĎěV4ň=C˙^_űTV«ýöúĐž\?óÜ˙ßyp˙Ďs˙|T4PŢ\?óÜ˙ßyp˙Ďs˙|T4PŢ\?óÜ˙ßyp˙Ďs˙|T4PŢ\?óÜ˙ßyp˙Ďs˙|VvŞÎš=ëD̲-Ľ…Jśvścް-őfłŇ­ŢĐĹrŇHVR·’]ř1fäÁ*9ç€h°ňá˙žçţřŁË‡ţ{źűâą˙ ÝÝ^iÍ-ŮĂ…”SI'’y<ýkj€&ňá˙žçţřŁË‡ţ{źű⡢€&ňá˙žçţřŁË‡ţ{źű⡢€&ňá˙žçţřŁË‡ţ{źű⡢€+ĂyĹÝän?fFĚF2J†ăóŻ ř«˙#lőčźúW§éň×?ëé?ôRW|U˙‘¶?úôOý ¨Űnן ţB±îcצąwŠţÁ#'ĺShÄ€8;ů®oŚ3<̱Pv˙Ź“ŰŹîÓ?áoÍ˙@d˙Ŕ˙ÄĐwöo˙ĐKO˙Ŕ6˙ă”}›Ä?ôÓ˙đ żřĺpźđ·ć˙ 2ŕA˙âh˙…ż7ý“˙˙@ßŮĽC˙A-?˙Ű˙ŽQöo˙ĐKO˙Ŕ6˙ă•ÂÂß›ţ€É˙˙‰ŁţüßôOü?üMwfńý´˙üoţ9GŮĽC˙A-?˙Ű˙ŽW ˙ ~oú'ţţ&Źř[óĐ?đ ˙ń4ÜMc®ÜDŃK§Íâú i˙řßür¸Oř[óĐ?đ ˙ń4Âß›ţ€É˙˙‰ öÇOÔaŐÎŁwym4«•Ç@>mŮ9cžžÔ†ßÄ%‰ţŇÓů?óćßür¸?ř[óĐ?đ ˙ń4Âß›ţ€É˙˙‰ ďěŢ!˙ –ź˙€m˙Ç(ű7č%§˙ŕńĘá?áoÍ˙@d˙Ŕ˙ÄŃ˙ ~oú'ţţ&€;żłx‡ţ‚Zţ·˙ŁěŢ!˙ –ź˙€m˙Ç+„˙…ż7ý“˙˙Gü-ůżč źřřšîţÍâú i˙řßürŹłx‡ţ‚Zţ·˙®ţüßôOü?üMđ·ć˙ 2ŕA˙âh»ű7č%§˙ŕńĘŻs¤j׏ÜÝir´|ˇ{;~źĽö®3ţüßôOü?üMđ·ć˙ 2ŕA˙âh»ű7č%§˙ŕńĘ>Íâú i˙řßür¸Oř[óĐ?đ ˙ń4Âß›ţ€É˙˙‰ ďěŢ!˙ –ź˙€m˙Ç(ű7č%§˙ŕńĘá?áoÍ˙@d˙Ŕ˙ÄŃ˙ ~oú'ţţ&€;żłx‡ţ‚Zţ·˙ŁěŢ!˙ –ź˙€m˙Ç+„˙…ż7ý“˙˙Gü-ůżč źřřšîţÍâú i˙řßürŹłx‡ţ‚Zţ·˙®ţüßôOü?üMđ·ć˙ 2ŕA˙âhĐtť>ćÉď%»ąŠy®eEÂŞăźîו|U˙‘¶?úôOý «SţüßôOü?üMpŢ/ń[xYKĆł Ç´I»ˇ<ô÷ ˙Ůfox1.6-1.6.57/doc/screenshots/printdialog.png000066400000000000000000000234041326741342000207670ustar00rootroot00000000000000‰PNG  IHDRŰü±’ígAMA±Ź üa8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2)Ý.I IDATxśíÝ/xŰJşÇńŮűpA€Á€€‚,0¸ °0°°Đŕ€Ŕ€…,(0XP° PŔŕ‚É™NćźF˛Fz%}?Oź>ЬQěźÇٱ^uó`lď×ęoJ©úTŹ}$°hźv×ű?îŢčŽŐý¨PoěöűŰ7ýu«~˙÷ß{Ü,ĚŔîßú3ß8?í)”?í®őÄţ￯{Ů"–gçő§í߬—O/ÓvŹzö–Ďß  ”úö÷ß˙á…ň˙|ţY?ýTO?ëÇc­˙<>˙·zţďńůgőüłzüOőüźęńxxŐJ©ş®ë“ŞëZťÔűß6öŁż]\Ő§ZýőčË˙z­×O÷R÷JŐL0źţ{yBF~ô˙}}łúúf•X q;±‡Ě–u”7îEČYeBňDĐËX‹—ßýí×ýmýôł>Ő+Ąę“RJ©S­Ôęý˙ľ$űĎăˇ>Őë‹+ýăńß*µz‰ŕ“RoT}ŞWjµż˝ŐýČűż˙ţ[dß@§ż˛/8ÇLűţŁÎ|ăëëöŻżÇÄ~퇂[ŇjĄě^‹ýţö×X‹WËŐĎ&d_žn§çźÇĂoë­RJ˙ŻU‡?kĄÔéeů•Ru­”RϧggÇ@7ćÉóůT+Ąľ„2Ô^¬~ý¨^ţó©ÖÓ_ެ‚Ű î11żöÉě"ăw˘BýČjĄ^:ÔJ˝´‘ëSýóÇ˝˝PuřSYŹÚmę•zőĽĽb‚‰¦‰Ď§Z˙SˇŐ!ËÁnůhöřŮëkv"8±‹+&hš ôZ<ţ¬VJ÷»Q»¶Ć±U‡?íGugE­^ş/îţőÍôZĽWŞú«?› &b¶tŢůŹ&˛23FcĹV÷óÚYWČYeBň„ßkJä˙TJ5ıV=üi.ĺ­ěŢdĄîľýJä· hçćT+Ąn"‰ě?jĎqM<”łÇŕęéĂr¬B‰kń×؉çşV§ş®Ĺńáá[őđMOo.YRýeQ«šŻeC bňyĄVvʰžÖ˝Ć‡‡ozÎáţ›Ręđý›îÜPVÇ…ž¶ýÎM¶B ä„V d™Ż "ä¬2!y"(ĐkńłşWo^uA$ú‹Őë. }1°>Ő~ż7˝+Ą~*ő›RŠ &âĆ—S­”ú»^ç=jĎqM˙ظÇĆ-kÁCÍů•™XňÄŰś~dŐ;‘¶`"żŹÜ×M-lď{ß"ĚÔŻDŢďo•şí˙üŘ˙6`úL·ÄîŻ[ł˝j#_üǰÇKw{÷ÍLżł‰ RČ ‰ RČ ‰ RČ ‰ RČ ‰ RČ ‰ RČ Ĺ›ćEZÚ~pożyř~\Ćźźł€łýÄFRŻŰx0…¶ŽţY3ń´ýđqűᣓV燗‰BăÝ65î@•Kd‡iEÚ-\óŁ=ˇ¬VpcÚęÍbÎĆí]Ű3ťíűÇŕ´yó·XŘß,8Z$ňúbśüqĚ܂ߡaćŰŮÚ-ĽśX feÎöťiµ…ŕÂÁÍÚkĹN,€ŘďoŻ.·™ ·k#KŁwl «PCR•o6šÍY¸÷–Ćíô[p€¦\S¦Ö˝™a  >°ł^·L;@¬iß—ü÷Oó6P?ň`bď:U;\Śő@羅GN‡`¬ĺkĹŤ­ăóC–С‰lÚ¤‰$u˘6ŘAëµhÜľ$ÎŽŕzé$°XSJŐ§úXÝď÷·×˙‘Xt}±nuŃ.'6oďľív×űýíţŹ;ˇmdX ¤ ‘@ ¤ ‘@ ¤ ‘@ ¤ ‘@ ¤ ‘@ŠâwăĽ8iî‰ Ygń盯fΗ›OŠ\€R‰|˙pĐY\?ýŞÂ·z·VJ=?VÁŇ|ţŤ†7>ÎĎ_Ä*ŰkaDZţ±ŞŞô*v©P˙ţĹD-€+’ČşlâX7ŤőŹ›Í¦ŞŞőĹ:ł‚µióK©úµ˘ÍZ~&ç~óÁ-ŔŠŹµĐqlOt«ś¬ëˇĽđőÓ™RLWů4ŘV‘ÚŁç4lťř€ŃOäúéh÷Z4Š“î|Áć0) @ "‰|uąýróiőn­SŘÎâVťČ˝ |LEŮ~dgdEă@‹9McS:¸$ÝĘ$(Őkquą}~¬Ôë^_¬•REČşëŮľâçôD€Xű‘uňę¶çÄäô /Ç%Ć,űŰĚ™Ł(~eŻß1 ^3&nô[A `Ƹ'HA"€$2HA"€$2HA"€$2HŃóxd»Î)™v»ëôW·ěŻÚ"áíűMż_’č˙"v©SŇd&Č7hś¨ Đ"ßŮËĽ2€^Ô§:sÉ·ď7EŹgšŘ·¨ĺ4iéT”Ź+{ ‰ RĐk ;żţÎ7h´kĎ;uč§ŽDp.vźw=$20‰Š‘C&—i·:ö‘řËŘë&–´÷â¬îŻ›)ýČŔ|Äg”$2QhBÓĎM»$fă’z"XÚ-¶nb2ŃFfĹoKÖ±ë@c¶:¶ÎżÎ}ů dE"óăgâ{Ěś™#ŕ™[ ľ™šôňC™DfH‡˛ü :ç°cď ¦Cř9ˇ'áŃŁ%:4LöĂęfÝXëŘŢxlz$2€˛]Î`‰ĚNłł)]z-,Hfr" ť‡2× Ž¸ČďÎŽ­5zdÓF)Hd‚^ `&w§ÍŃűd"‘Éă>ôłŃ"ľßUUŐűfÄ”hoN®Ń=='ňnwÝď ŹF÷XzNdŞ%3@'ďXkRČ ‰ RČ ‰ RČ ‰ RČ ‰ RČ ‰ RČ ‰ RČ ‰ RČ ‰ RČ ‰ RČ ‰ Rô\‹Úw˙p0ÓW—ŰŇ»€é*Č:‹?ß|5sľÜ|Rä2D”Jäű‡Îâúéhf®Ţ­•RĎŹŐńÇŃ_eűácpS‡ďwúˇĂ÷»"Ç 2”íµ°ăX˙XUUzbŔbIdÝ@vâXŰl6UU­/ÖÁf˛#Ř4¶›Ňć!Ńf`bc-LňęđŤutŔkŃ– ŮV ^ZÇf@\"çd+McłT$‘Ż.·_n>­Ţ­ý®äüNäZÄf©l?˛3˛˘q E+ŰMcŮž€‰*Őkquą}~¬Ôë^_¬•Rç4őŘän}Í \Á~dťĽ:…í91~Ľš9öCÁ&šĚ@ń+{™-â`ź9 `Q¤Śµ |`b߀#‘@ ¤ ‘@ ¤ ‘@ ¤čy<˛]ç€L»Ýuú«[öWm‘đöý¦ßďRô˙ »Ô)i2äĚ4.A‰h‘ďěń<č€~d‚D)HdBĘ˝ßL‘éÁVPŽŐëęr;Ę‘L‹”D0?»ÝµžŘďoď„rٞ‰l߇^7cí&­™¶Ëĺ™í‰Ěý]; €rěQtë‹ő~«”şşÜęF´™Đtd›‡§íµb3§Ą`?˛‰B;F‚Ő›Lȶ]Ń9{#ů‡ ťzb·»Ö­i;Río©8ÓÁµ›šą˝˝4`Ń1M(M·5Óa˙h0Miľ÷‡ýţÖnçšŔµ7~uą˝şÜšUüMMî{.rąÓ4ćz 0»ŮNX=ż1.MsŘvüqÔ)¬ű¦ťGí÷€)ZV"k¦sŮď}Đ/§ŮoÉvެ鶯:-ńÉmţ8ę&ą}łpbZŽ‚‰ě"03ťLôç;Ă$ňWt n„\ ;ü.`Ă$ol§/XO›áöZţ¦×Ó”íµĄdđQá؉ó7 sÁÍfş€Kšüµçg®Ő83˝M –ŘŹ  ({8šăęrë÷ Çú”ýÖqăZŤ3Óۉ  géć§Ŕ”Cb"—‰ `Än7Üű ¤čżŤLă#Ă– çDžúđlJ©·ď7cÂBőśČt3Ŕ'ݱЏ RČ ‰ RČ ‰ RČ E»Ńo 7€rZ$ňÔËĄ€p-y˘Ő¶`*čG)Hd‚D)Hd‚D)Hd‚D)Hd‚D)Hd‚D)Hd‚D)ÚÝ9ÇöĂGg•Ć‘É~ň´zÚčy¦aęJµ‘ßďô?ĘhŔgRµĂÓƬLZ˙mä`óÇĽí6NbIg&fĂiä&ţî‰ç ĎL]‹D^_¬óŹ?ŽŤë:/퇏ö+Ę~µ¤—´g憷ßßÚĹ zÚ‡ôĂy2đü4Î+"­]9XŘ)¸łVM'”cô )¸5*N ¬Ä˙´ÉסťËóĂk[›´uŻEć ÉŢ·ęt¶[7ÁŤSqJ¸˙@<0Qő#Çşůb‚ Ó”ö?u6ž?(ă‘cm5‰Ö ćÁy·6ńĚn.ž?–Ůż¨âOřKš?ubüżrâďî\ŻKl$6¨˙^‹ŘÓÝŹÝŘÂů313ţ_9ńw>Łb«đüÁ$ŚŮkŃřÉeĚDćł$؆űÎ^)ڶxÎ`ĆDڵ(ä ‘@ ¤ ‘@ ¤ ‘@Š‘Ç#XŽű‡Ă؇ŕÚí®sŠ' ¦x"ŰîB ,Ü盯cÂ/żmT0‘uŰ€/7źą ,[ýT¶MZźęśĹŢľß=ŚnJ%ňýĂAg±}öWďÖJ©çÇ*ř1ÁżëP¬Iâť­íÁ2š&­±#B`˙‰VöĘžófX?sjî%ęĂźYŢľ!z獖 ˝Ţ‹$˛n ›8^˝[ëÖ±RjłŮóK˙:e üŞö-=s÷ĚL0-&(Ć>,ĹGż™,6$Ę>Ů­éôŤđťŤLĺ/´(Î-łĎĽvépŰM„~·9îÚnpĝۭ˝ çéTţÎ%nô›}ÖL÷®ŠTMĄµ;K“¨LZčÂŔ_\ŕ!©ĽžÁňźZĹą~:ęs—yµtIžIĽOÂá×2×ďÖÎ{¶óţ\]yďúÎ6c«űË«Č+Ü_>§±Şí‰íwí||L/;†`ó(¸°żÇŇÁ§ó$ťËÂĂ7¨HŻĹŐĺöËÍ's˛ę§Ł‰ăŞŞÖëá‡dŰĹ4W!“ :ěşţ_ÖI ż¬Ş˝dpţň‰ţ±ŕňéťźŤm·ăŹs´é'|đzé*ËýĂ!ýoěŚ*ŰF®ŞjłŮŘ?ÝťMţÇ ŁŐÓ ßçLÎÖ:ěŃ~ďéEşZqŰ®ÂŃ_w2g*•ČW—ŰçÇJ˝Na=ĢhY7Żă©Ëo&wܸŔçL0 ‡)M)đldŇÉÓHfpl#ë䵺Ął8§9ř)¶LzfÎZ«©üącOfÓ‰1•_d`Óý†Hń+{Bîâkpń„+ŘLîĐpNÄVé–fÎösRŐż¤–ó"˙\ő•ěöµV ݬ`ě ż‹¸Ńo…Hx~ 3»3Şm(;a6eÍÜő9Ë'6‹°¶ŰńWtş8fŚŠí*ĽşÜ:ˇ,<ŽŐr“čJň;¬b=Wé%ýsM¬rÎň‰î¸Ćíäo¤Ő*m» ‡ĚĺĆ1µv(ËŹcĹëĚ›âIı"‘ĚŢTâXŃkŚEBŻ«„c(AěPŠF$2€Y‘9Đ8‰ `8‡ďwĄż»;é†?‰ ` »Ýő؇ ‰ ` Bľ/&µ¨@ jQ€«E}ľaö”íµđkQ7^f&Í^d~Ŕ2Id§µmłŮ´*#¬ÇăßHŰ)jĐá¶)‰ :‡HIg&´2Ő±NDÚí\s‡°üĆopkÁjcé%ýbĚM\";ŤM˙6Ś˝•iդͼdďµvćażżű€É—Čť»ÎÜK«MŤXkgrZä+’Ȧµß•ܡµ}—îBĄbÝĉCЧ˘Ö€®ĘŢŤÓYQčűěv•„BŰOď—Ö1€^«EěáŐÍOżN~­ť4§n÷\;•„:×Ú€FŇkQ'MĎI”kś«Ôv&´"ĄµŔZŃtD”±Źľ“’Č2‘†DĺS‚D)Hd‚D)Hd‚D)ýArî’š_— Űw|Úŕ›DčQń6ňýĂÁü+˝/Lš‰¶ü›đÍň°dÔ˘†NKłmą¬X‰/eݵqSţ1Ä ĘÄZčýVĂ ŞE­µ}Ů$fŞP‡—ÄŔě[MŮrnx’Y.+¸X°:♕·ě”Wyżśm±3™Ůďo󛡲jQ*XGĺéq ;őřQiČ?¨ÓÜάřĄBI˝«%h[dRP-ęÄgF˙Ńŕ*ů¨<=°Ň]U™±xfżpŰŽééľoc-Ň۾̨<=3ůEąřKńdŔ9&6ąŰÝâunÚ—Ń«dľ˘ś‹ň8“9®ÇqΦb÷ŹA5=+~­LŁŤ|&*OOBđ†Ô9·¨Žĺň;ľZm*g±ĆŠ_@+¨EÝ»üąZ¬aľĄňtßZŐîŠńĘ™nu ÝŁŐNMP-ęśĎŚÁí÷ăaăçPZÇ )•Čşőúb]YÖët9Ö!`ćűí‘MT˙˘ś?‘8z-"¨µ–čąóÎlµµĆŤt»–HŻE­ €4xŚNĘX‹ŃŁ ĺF'%‘% …Śkb߀#‘@ ¤ ‘@ ¤`¬$˛«2ra,‰ Y(Ď%+žČ4vŻCyĆŘ·=óG—'ľ®9@ťĆ˘ÇŹÉˇ5Äi[žQÎŁę4’§ĐŐ˘ÎiŹ46ĆmďŕNyFýlŃ?&Ę3úüz‰Á’]ţÝ_Ű6Kíí÷ôă‡XeÇZřŤťĆ'Ť]u)ˇg>íŇۇ:Ží‰Îü;nŰýĆŰĆ6čl']§ńśç[ďÇÉŐ˘еŇí‘¶í…XÓĂŮ~l~şĹ”č,}‹(':ŰľŻ·jçÚ—âU…Ź2Ť±‰şŻ®šj™N¶Úiîl?ÝňWGgőÓŃîµh”8ç~ݶO’XďY¦Î•Ăś‡(•°â9ŘV‘˛xž”~{'çĹŕĎo|™ń‚iË)ĎhgqŹĺgHěĄNcgç?$—ČĄkv_Hçw(Ó%ÝŁŞŞ6›Ťýc/›µűacϦ%>Ď©óžÉĂ?ĆUäĘžiěřI¨E­ĽŽ9uö5CsÁ—Ä9ş•gĚűÔoćgţíüŞVuG?~HV¶Ť\¨±“Łč4§Dg_7mË3úg81ü Ń Őy~z´CΕŔŘśóŹ“S*‘ucG˝Naý2+Ú@¶/ĵ]Ĺ™NoÜîŕŢRŞoŁŠj‹7`ôBP-ęś&F°ů[&sSé­5>Új&ćŠ7fôBJ-ęŇWŢň_<´Ŕç7Ö˘^^-´µ”Dî )  j€$2HA"€$2HA"€ڵxa×b·»2š{x”gÄ2‘ČżŘ%G·Řav”gÄ’‘ČŻ”ÎAű;ĺ oßoššŁÎĺ;˙á«‹ŠuŰKzď>ľGşX$ňĐ;"öź ¬C-ęrě‚2…n(HžÂ ‘Gv˙pŕó¸Ö{yFÍŽTgf·ÂŚé˛ŠŤs6î—;Pzk1&ݦQÜŻ`Íćľ 9§7,Ŕ_˙)¶»ŹÂIl#Đ7€Ć>;i)÷(qÎ)D á$&˛6ݧ]ÎkŇoĘ=Š˝©SÂÉMd[fźš_ÚĂ^@e´[{‘ó)•đő9µ¨m:‘……¨!Ű4YóűÔTĽepZzŤ•(ĎH!jL‚ÜDv®ťs‘D ř¬·ŘĆ™:—gt>3ů…cŐÚfLoĽ\ĆľŽÂÉMät˝»‰ŇqÓhÉÁÝ{yĆĆ çĚOo<çJ`lNţóŻ ry®ř†HŽiÝĐ«mč˲YÎ+'»\î›( 0˘/“L伮.·N(Ç“6Ĺ'!’Č9=hé99ÓĄ5îËeâ€â[ÔăŇALĐHä‘Ç ‰˝óĆP 1$ň –<Đ@#ů—®űqE@‰üb·»ű,‰übZ_0K$2Šăó‰DFYűýí؇L‰Ś˛p ä#‘_&ĽŰ]Ó» , ‰üË盯cÂ/Ś“D~ĄtÚ7bOŕ‹$Ŕ2‘ČCăŽőb¸ÓĐČČ_‰<&Ç„2mÚ˝±˘Ô.‹5V˛řţáŔ(1ÓNd“wr č©řű„ÍoʦťČ v,Üzűé\&|řć™Čvňę©BšĎŠ^cqóLäŃs™Ć–•ČŁ{~¬r#¸e"‘‡Ć7DÄ,+‘ĺ ÉĆî’/÷ ů§‘ó4óü†}MO‰|íůá»ä8 Í¤Ťěgn0…‡ŚćĆ}]]nMK™8ň‡0:o±Î šÄÂfÚ,&j Í$‘'J‡ňĽă8v»»ĆţôVCó6ˇě/yg> •ýţ6˙5N"ŹlŢq¬ ;5ţâ±O9&p{ď’˘z×¶Č$‰<´eĄčöĆ“ó}ô-áÝ‘Čb qľD±äk¶Ŕ9Hä_xy“ ٵµą¸iHäm»{PB˘-l_Żł‡Lř «żŢůüNggaâŇČ/¨ú<®ĆŃŠŤÓ[ČYÝ<ż!‚yřŠ0Ă5=Ě˝˛3F¤ ‘@ ¤ ‘@ ¤ ‘@ ¤ ‘@ ¤ŕ;{¨Ăť+ř.f€D†Pő©Î_xőfĹÝ51ôZ`&ęSÍ=á0u´‘1ő©^˝YŃRîńť‰“90łB(k­ú|bč ˝‰Ő›•ţ§¸Ą}č mdĚÓ$ÔŤ;Ňî>đ±cH´‘1O˝|l‡FKy0$2µŠ|Z¦/h`ôZ`ÂVoT}ęs÷3}uąísÓ‚ĹâŘď Ęßć2ĎäůHdLU,GşŃ ňůć«™óĺć“Z@š´:Ť9˝ó‹=“˝ ‘1I˝Ç±NúéřkďÖJ©çÇęřăčŻâ„ĎżöŐöŞŁ˝|żW,ŰžF}•/±@ç3yţo4Źką$2¦§ß86ěŃ?VU•^ĹĽţ·>–ş[4eęS˙çłĂ™„ÖîO±Ű]—9  ťsD7ëLčťţqłŮTUµľXwAvŰŮiŐ:ÍjťŕÎŁÎb±-ô’ţ%záí3ik{&O‚ý^¨Ľ7-őü™é9«÷®Ĺ“zżż-t@ľŢsäŐĆß­ÍD0YŇśî;7Íë٩ۏ&¶[·›˘§ńLéÓ¨OBđý,±zţĚôŽü%űŐ"‘éÇč¤ĺÓnJŹKż†‡ď-ÔůsľÄ©=ű\ŢĚ찣ҤţM€˘9R?í^‹FůŻŰü8`ŘŻóĆ&0šĎ9 vKV5ťůV;ŕO#ďODĘ‘«Ëí—›O¦›ÂÎâ¶ťČçó‡Uô.ö9ăüĎΙ´učD>ó$Vs˘‡ˇíŽh8óť=LC"GúâŚ`xŔ9™Űm]}şě“›>Ǹg˛±ulČÜ`‡Ő;ŁŤŚ 09bBŮÉ‘ówĎŹ•zť답RŞUŮ\ 2?¦ó{?í-8[ó×Í?0Ă?QýöËw>“~Ź|â$řKÚg2řWhśé/`Çzć_ö|SJŐ§úXÝď÷·×˙Qh7X¬őĹzżżm{Yxűáă9· Z˝Yu»c™ÎmČΊ~ťyöbZťŐéžÉ~żi’óüż˝ű¶Ű]ď÷·ű?îh#żL+;$ăLvC?2HA~÷Î$20C­îś 9Hd`nĚŰúTW÷ßĆ>´@"łEKyrHd`ž¦~§ŕeb¬HQŞŤśs/ŃyÜó…đ‰ T$‘»—(ćĘľ65ö±Ăé?‘ť–oćřsîä?Ě=ü! -e,J‹D¶ż¨nËůşdşŐśSyˇ±Ý;< ¬Ă],bxßĹŇ´k# ;•®-b7™u(:%•s´îµ¸¶“Óű‘¸ó)E§LÝÄFż{Ą`úOd§DJ_÷ŰϬšÓUdô[đ~ű‰;đçÜź°{řŔXJ}CÄOĚôś¶ËŔüL¬fŚ; ˇ8†Ä™Hd”Ĺ8q ‰Ś˛'䣤 ‘@ ¤ ‘@ ¤ ‘@ ¤(>ůţá`¦š Ygń盯fΗ›OŠ\€R‰|˙pĐY\?ýŞÂ·z·VJ=?VÁŇ|ţm”cR7‹-ĐáŢĘ9…Vąe3€•íµ°ăX˙XUUz»J_Ţ´söµ]±±Đ*ô®H"ë˛ÇÚfł©Şj}±Î©`­¬dtZ¬Î|żp‰ ţň‰ć­óP°”T¬n?šł/0¦1Ö"VĘ$o,CtB<óL%lgĹÄŁ”Iܽ߂ma嵂í™ Ü\ĄuÜ(ç*BéťßÝ!‰KäX‘˝áʤ/“>řĄŻ"ôËI^ză¬ĎXIDATłGţ^Q‘DľşÜ~ąů´z·ö»’[u"ů˝ó}őă/]¨Đ§4˛˝+ŰF®ŞjłŮŘ?Ýťíś–©{ݶŻľőĹ:8?ç]91âEO›™é%·«››ĆţGŕÄ~Y,Ů~›˙%ŚR‰|uą}~¬ÔëÖĎע d'LĎߎůQýő"´ç¤—‡,ě|Žć·@[ťáŘÂÎź5gŕM%¬ŕh[d˛`Y'ŻÝjHgqNrp4EÎ圏'='gůĹĘl#¤Ç6 .ÜřW0MěŘyp$eßGĹ™Š_ŮŁËť›'třN¦^Ĺď5¶—9g/@+ÓŹ 8mwťż‹ÄčąŔ€Ţ‰ýÎĹ7§§Ţoä¶ęÇwV‰­eo“«(ŤD†é‹oötââjć6Ó ¤żůI Ł(z-@ ¤ ×CżfŚ62HA"€$2HA-j‚ZÔ µ¨ŁńʤsAëއ7ëߢń–ľ±UŚ‚ZÔŹd„üRv×0!»Ýuż7S˘µnë'Q‹:˙ŔĚń$fúÇи©t™Ś3c4Ř.öOÝŔĹ2ěŢ-`JĽ.Š_ŮÓq¬'ü"O™b7Ůr Iä笳b·ăqjI¤ Lät§d–ÉHĹH?űĹďm‰b%t~z}©Ouć’oßošjOÜwö‚maąInŃNŚD#±í-lď‰M%nľ“ľĄ˙Nł;*ď–îĺúŮŠ'rýt´{-ÉąáVşąÇ{㊽ͮŘćjZÔvĎŁu‡Ú±Ďţm7ŐjGgö;Ó Vö;{ÎČŠkQ¶ŻŕŢÝ=Ö¶(ÇŮţđĹ2VďÖćňCěGó/g ť÷ ¬T"ëZÔë‹ueY_¬K7MđťßľÓIlfú—Ľě‰XË4Ńî7l‹ţjŤŰoü]ĆbzŔô?e]:f€ZÔąG’X7Qu˘Ő±5n!±ŁüLl'çäL—ťÝNšë6\Pl•¶WG09‰Ď…E_Ĺď4tüq4˙Jď łgbŃn,ç¬č,ďä©sÁĂYĆOgćł×¶ąÖîý†‰±#rÄdĚ3ŔD5~ä-DĆ$9ßÍÔ!īŠ1|?ž¸o voÝó›©C’ľ §G”vY…62ıűmK\@ 6{ť9ţŹô/ÖWąi#C®`wމ°vłW´/âéův»ŰkᯔC"C˘Düĺ$cp™ŘŠţ=c«Ë(Š^ ‚D)čµ€_Ć­hC"Ŕ‹B÷ˇĎG"C„Ă÷»!o Ť~;ăŰí®Ç>@ăă.T€ĆX ‚D)Hd‚D)Hd‚D)ÚŤ~cÜ(:ŕidj‘Čűým±ĂŔlń´ňµHä«ËmąăŔ\ń´ňŃŹ RČ ‰ RČ ‰ RČ ‰ RČ ‰ RPŐ Âúb=ö!ŚŕíűŤ]Ktűáă3˘ü‚Ş$20Ą•Ľ8ř3źWqüíűMţÂ$2€A-ęť)ř¶”@?2HA"€$2HA?201ö…ü‹řvQhăýňÇoř‡ÝřëČů}i#Sb˛CÇÇbÇ“9ô ‰ťó|´‘ÉpšrfÂo5›%ťU‚íëÝs~}Í>öi1Ël?|ý×§Ť L[˘Ől"FĎ .9ăFwěwqN‹˙7"ÚČŔ´%r¤ŰCSl +ŻlĎ”‰D&ďü†íÔ›ĆÁ•śĽ1$20mÁ.Ѷ¦^łD?20ţ•¨Î\÷ś ÎĂčż>‰ L‰ e˙ŠśsÁ*gÝŘĚĄ1'aô_ź^ `büÔ°ç´}´qár~ŁŕhŠŘ2ă"‘iH·|—i~ç„D¦aş)SÎüÎ ýČ ‰ RĐk ¤m9‰ąâ<$ČŔZ[›1ÎC‰ a~× :ŕ$4˘¤ ‘@ ¤ ‘@ ¤ ‘@ ¤ ‘@ ¤xőť˝Ű»ocŕ%‘×›«Żű«¶+Ú]Ýßö{@0QçEâ­2‰üçż:oE«űÎëŔĚś§ô#€$2HA"€SJíţ®ç ĚţŹ;U?Ç> €ŞźŽ˙›)‡ŚŃ–‚KtIMEŃ1”VĽIEND®B`‚fox1.6-1.6.57/doc/screenshots/replacedialog.png000066400000000000000000000100401326741342000212360ustar00rootroot00000000000000‰PNG  IHDR€Ő^ó'OçIDATxśíÝAhÇŔńď… $ĹąöP“†6m°N ¨ĺZˇCÁ' °n%F‚âbá ¦…‚µ ‚VC)BĄ7ŰÜä$›'8‡\“C|ë-lŐ<ŹV3»ł»ł;3;˙<´ogwŢěĽ}óíÎě®&"o"@^&"REş€­ĽűŽ<­Ţ<<ş˛,€=mKŘśť˛€ž¬Ţ6Î7€ÍŮyy©×âv+]’›“Ioź×GŢ@ ţ>;/ż6§l+Ľ,"ßżfşďiýĄüi2™ľ”•˘0®ÓĺĄřÎ×őCý3=îik8‘ŻĚ4Ó}Mox)úĽ?jAŔ´N—W_ůşľbů.ď´Íô* }xsv^~T±Ч÷Ž»d~_ę’©›Żčéú:Mň­ĘÓ´L“2CűŻČ©. ­í]ű pUÔ† ď«Zjš˙Áq»Zň^QLß+jž-]Ď×%ĎŐRݧ»– ÍÚôŞ<9Eešéľ§ő—˛ZÓ—ňţdb\¶î˝Zď}­Q¶­óţdrâsĘéŞXş°˘<€ěÜÜ›N[ŻŚ2E€L SČ2E€L SČ2E€L SČ2eý§đąť[8ńţđ`đĎoň™ŞĽC—ŔřdLŤoÓyH1— @zč*1ő*łĄ©÷úüŞ|ôt›&y𖀞¬Ďö+»TĘGÜúűŞ4źË–Ëę3OyË:ȉFRďş^›ôrZŤłž'Ť?“ě€RudmC €”e\şFléMÄAŕ|5ň 1Čú @ÖçŮŇëŇępMůř*{Už 0™HQ…<<ş#[Ű»˛ta1t™=Ůąą'—/]”­íÝĽĎŞTuÓp4 ` 4ňĆŽA`Č2E€L SČ2•Ýe ·îŢ ]đjőÚ9úř“ĆëeDDÖÖ? ]đ˘Ë=KY‘âńŁĐE‘çźk˝ędr¶ÓGg mşo|tg3 ™"@¤úţß!Y€É™s§^Őř÷˛ĹăGÓÁ`}B*7ú}¬ÄĆÖŘ÷¸ "2ä˙"á 2Ĺę5¨ëÝĽ]  ˘ř¶őş< ÇŁ â "Ru˝żďKD9€Řů>î @dĘŤ}_7‡eôŔń081QŤ~źwg=ŔĂßĬďÇBd}9Ëú bŔŁ C< b`‡űrt˙óĐĹ€A˙\–]X˝v%t ˝€>˙‡e×hŮć™0F\™ęĺ dźŔM1SA†5Č€jÜŐüÍ7N­3ż¸$""·÷v*óřŃű€©ńőĹN˝Ö76ä»ďľ›|č× cĺĆßäŐ_Í7deyYć—äöŢAz4ŘU@UŤż˘‚ =ŤüJDDţ)łs '˙ó÷ěO»ÔY€ĘKĺç·śý FĎÎ-Dwö˘—É6 /ŮÝ \fę®c8ĆmĐMOcö#őن ‘ďŁţ¦ôł˝UBĄW5°¶<ş¤•ËQ÷ľ\^ÓruŰ`\˛?¨âÚ¸šŇÚ¬ăšÖ… ę>w¬gCţŻ×űŞŽZËB54]î7pYÖw~¦u\OÓĎĄńĆ­÷3€Ă}™_\’őŤŤÚ«€DD>ýňąş¶6˝!¬o¦nťŹ۵ͣχęŔ`ĎZY^ž^ d;˛üôËodeyYfffú(V-ÓŃtף`[_»kyÚ|]7\ rŔí˝™™™‘•ĺeůôËoŚËčŤ˙úĆF”Gżĺ2ů.cU~UiĺFź ŔĹ`Ďş˝·#ó‹KrumMÖ76N­sumMfffäĺ—._=üB6oÜŢ Š~ŐŚzoKŻęG/çˇçŞüë>»+—AĆm""EQňđčŽlmďĘŇ…Ĺ명 ňŞçýčô‡ŔÍÍýR^yĺůńK?t<  G)Úąą'—/]”­íÝ0˙ ŞAWĆŠ~W0Nsé†"P0‰ň>Ő]¤ěhÜ´Ý˙V ZěA€†@ę˘űźŔz𸽷#Ü—Ď>űLľzřĹ4ş‹ţ—Ď~D9P¦‚Ŕ÷Łé€ÔE7P¦Ź ü‰n  ,Ć;‚` ˘đíÖÝ{ˇ‹^­^»"GŇx˝$Ć|[[˙(tŔ‹.ÜY‘âńŁĐE‘çźk˝ędr¶ÓGg mşo|tgG? č"Ő÷Ujüű Lß˙}P!@DlŤ}A€«€ "CŢHËdŠ3,Ô#jP×»y» @@Eńmëuy$ŽGAĹD¤ęzß—r±5ň}Ü@€Č”űľn#@„TŁßçťÁTߏ… @¦¸ ăQ!1°Ă}9ş˙yčbŔ Ź.Ë.¬^»ş…ě@›gnŔqdŠ™"@¦)d*»«€lĘwâ˝őćëJŇŹ±o_ڍs?šŢ%»zí Wű9Ę>¨ťkmý#czę?Ú±o_ڍs˙luYň¦ŞenÝ˝7ݱŠÇŹN¤MÎś‘úŁ ŰďékGśť[pÎŰ×öĹţŁ*!Ë›â>ŐŐPűHą>MŞîđ7Ő«Źr‡úŤřřܬ€bÚ±ŠÇŹśëSéş}13ýbZcß§t)—5†}%¤lŐ‘šţCťś97=J9˙‹źĘŃÇźČů7^kő¦#}ŢěÜÂôeZ®ś¦¦«ţg¨bÚľ˛6ۧ—ÉV6×í)ŻW·¬)OÓŹ×ô#Ż+—ky«ôUçĺrŮćU}MëąÉ|Óűş24©×!5ýMš–Ń˙–ç›Ţ·ůmřÂŔ1˝áźś9çtşYçđ`˙D#e›vM+ç7´rëŇ]¶µé˛]ĘěZFßeđ©jź*ż÷‘ćZG¦|š–!´®űe›íi[_ľ‚ŔŞľEőŐç•§ëÄô#QôíŇçµÍ«/®yÇVÇmö)Ó{×´¦ëÄř]»¨Úg»ü&Ë wŐÁš>żî3«ęßG +?šž4=úo»SÇzšďz±ĺWŐ†ţn†h(›ÖKU}Ą˘®áń˝‡Üײ ęR<˝»§ÜđÝ˙\ÎżńZ§kŠ›t3řdÚľ2ŰןŤK]=ŰľŹ6eŞÎ}uُś-Řę%¶îşü&]Žř]şŤ†ŮëLWfř¸BĆvZŘ&ź.úŘľˇvԪϱէkŮ|/§ µOµý^\ň}V[ť>żÜčűĂc Ŕ·Ţ|}úbĘGdę* —#µŞţZ›ŞťĹ”Vţ<—ťČ×ö™ĘÜ$ŐmOŰemĺ¨j mő\·Ž«ű”ZĆĄ›¦j»tu©»!řŘWĘë•ókŇČ× ۲ľĆ&"RE!ŹîČÖö®,]XěśiŠĘ—ĺĹÖ-ŇUŰ7Ćnź†Ţ§Ćú}Üş{ŻŃÝÓ1vkĆdçćž\ľtQ¶¶wó>Đ ąĂÔukôˇÍöą™Ŕ¬Ź}Şjŕv¬|ü׺Łĺ1×_@©ěl¦K c>˝ĎAŽuî#ćXo.h„RĽřnĐW@¦)dŠ™"@¦)dŠ™"@¦)dŠ™ęô0¸[wďů* Ą&˙/A×)řxN7 ›¶ŹĚîřŻ;.Ć SČ2E€L SČ2E€L SťîöíüŻ…. “ÉY9<Ř?1/…2ęb+ojRŘRCťúW×ŘDDâyĽDŐîR(Ł.–ň¦&…} 5Ô©]ĘIdŠ™}ť[]„©ĘŁ16¸1– @ž˘ö%ć†vvnˇŐ}lĘur›b«SÓţçŁ|!·ÓöŮúüĐßĂë˝OŁ 17ţJę;”©ü©o“ocŞUö¶aLőŢ·Ń€%ŐÓVnÓĎ”¦7&MÖ«KKMŰúqÉŁKÚŘQďOŚ*¤Ôř+©:ĺíŞz_Ő…ŕš–š¶ő㚇ĎzÔÓS9 °I©Ţ‡0šbăŻÄ°#řV·=®Ű›r˝t#qYÖw~cA˝»MĐOÝRűNŇVßGJßqůhŻĚǶ´ÍŁézÔ»ź”ŃÝ[WI©¬:[ ú?µ`_ĄĽ-ľ·-—zl*÷zŐ€’™@ŞŤżbŞăňQVůŠ—ŁFÓz.i©©Ű—«QŞę8—zlŠz?i”@$î ĂďCÓ^ýJ—ĺš|fluj*O“íl›‡kWG×AxŰç„ţĆRďCm‰3Ķ4ĺRź©ocHŞ~űşŁuĚęöMęď´Q‘¸ľôĘŇÖ¶!f©_guÖÜčÔŃ…‘c˝ SŃuuů÷fCIˇŚşÔĘ›ęÔ?ętxQ€Éälč"ÔJˇŚşÔĘ›ęÔ?ę4ڍ@ }p)”Q—ZyS@ťúGť†ÁdŠ™"@¦)dŠ™"@¦)dęÔťŔ;7÷B”0°‰EQxËpĺÝwdóĎő–ŔŰşňî;OÎţőŹżxËXDäáŃŻůü¶ŐŚ@¦)dj""Ĺĺĺ·C—0°˙yŸ5fž,IEND®B`‚fox1.6-1.6.57/doc/screenshots/rezound_thumb.gif000066400000000000000000002370171326741342000213300ustar00rootroot00000000000000GIF89a,í÷˙   &, +39 : 5. 8-35 ').-%$%...*$+222<<<995,.1'] BF Eofz ys"K&Q&+U48\*.P7úĐ “ÉX,YąşuăäÉ“'OšĽl»5‹Ű6\Üpqㆠ7€¸¸ †+.n¸¸qĂĹíÖ·n¦dńă‡ĎŰ/'ąÄDˇĹ •(§ŔT’k™/č¦P‰RE•…oŢ Uů÷… 2˘©EJ•(UÂń† 7nÜpqK†K.\¸¸áâĆ-.n¸ÄëFĹ‚Şo¸Ľ‰áćK†(6ĚhŇ$a¸„]Ă…+.aÂ’áÂĹŤ›0\Űpqă†ëš0a¸p%»&,Ů/a¸ †+7n¸páÂĹŤ.\¸¸ † ®m¸pq»ţEĆ[†Q¬,d¨bćÂ)o¸pqㆠ.aÂpáÂ…‹.\¸’áJ† —0a„]Ă%Ś.aÂ’á•k›0a¸p ăĆ .\¸páÚ†‹.\É„áÂĹ­\7 ˛.lĂuĘŔrµřô騏 Vß’Ý—ŠOź>řĘdíZ.mÝ@yŇäI“&/ŰrÍ↋.n¸¸á↋®dÉ„áâĆŤ.\ܸÝň– ׸{˙î™űu+7YŰnÝş&ë.\ąş}Ă•‹Ű-\łpť"Ž›°\ß„ÉâFëV®m·fqŁ…ëV®\߸qăĆí7nÜ„%Ău .\¸¸ĺÂŐMnÝvÉňĆŤţ›·1ÂTŃbµ*ŐS¦T±J卷dÜ„qă&Ś7n߸qăĆŤ7nܸqăĆŤ7nܸqăöŤ7nܸ}ăĆŤ7nܸqăöŤ7nܸqëĆŤŰ·o·ÄŚ;×)V¦X•šŐŤ7nܸqăĆŤ7nܸqăöŤ[7nݸ}ăĆ 7nÉ’qăĆŤ7nܸqăĆŤ7nܸqăĆŤ7nܸqăĆŤ[2nܸq+ÇM¬ âd•ňVnź>|řÄ€a&®[ćXőéÇOŚ ŚšÝÂŐí(Mž4iŇäĺ[®YÜpqㆋ.n¸¸áâ&L.aÜpáâĆ ®[Ý„qĂ5K—.ţ]·nÍŇuK—®[şnÍšĄK׬YşnÍş5ëÖ­T˛néŇĄk–®[łnÝş5ëÖ­[·fÝŇukÖ¬[łnéšu ×µn߼}ëćÍ·\¸¸m #Ś1`Ä€SE 1dČCf 2dŔFŚ1bÄ#Ś0bÄ€FŚ0bÄ€#Ś1bŔ#F 1`ÄF 1bŔ€PŚ0bŔ /dÄ€C†Ě2dÄ€#Ś0bÄ€#FŚ1`Ä€F 0bŔFŚ0bÄŚ1bÄ€#Ś1bÄ€#F 1bÄ#F NĺţşiuK–]ÝĘŃâĂ'Ć„ ¸qăvk«>|`Lč ٲ[¸¸};ĄI“&Mššt»F‹7nÜpqă†K0a¸¸áâĆ 7n¸¸áâvë[7UUJŤCf ™1cČŚCć§1dĆŚ3†Ě1cĆ!SjĚ1dĆŚ!3fĚQvČâ4f ™1cĆŚ3† 2‡ľĚňVÎܸqŢĘáĘ… 7n`ČéĂ×>}řöéó·>|řđáÇßľ~úúá>|úđéÇź>|řôáĂ·ľ}řđáÓ‡O>|řöáÓ‡ź>|úđáÓ‡>|úđáÓ‡ß>|řđáţĂ·oß>|řđáÇ/>}űôéŰç>}űđíçľ}ýöáÇ>|řđőÇO>|úđíç>|řôáĂ·ľ}řđáÓ‡O>|řôáÓ—o\7 ˛8h!n[ąY5bLřâJ–*UŞtŤcĆ 1™†eŠĄ ×7nŁ0a„I“k·fqăĆ 7\Üp%K&,.n¸pqĂ…‹7\Ün}ëĆJż~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńë·Ż?~üřńăÇŹ?~üř7nľSłĽŤĂ… ®m˛ráÂŐŤ›~üđáâÇţŹ?~ýţ•ă÷Źż}üřőăWWľkűřńăÇo?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřÉÇo_?~űúńăWîß8ĺĐńăGnż~üöíă7îÖ­~űřńă׏߾nüřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üöŤë¦AÖ-şq+G F”[ßrĺ† ×­q¬`|É•ě2dËnáú¶íPśČQĹíÖ,nܸáÂ…‹.a¸¸]ㆠ7\Üpá↋ۭnŢLÍş'¦Tţ9rĺ’ë7._ľr÷Ş‡Ż™\äňńËćą}ĺňí§ď_9~¬ÄëWj>tůĆń#WŽż~·VíÚĹi–·qŰ’ ăĆmV.\¸şqŁŹ_ľTüřńă·ŹÖ¬CłL©RĄęż{ĄT‰é&+_?Y˛n­JĹí?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ_ż0ĄnŃše*•.SłT©:%Ë”)\ĄdÂĄŠ«UÜd͢•K–,\§VÝRĹj•7~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹßľqţÝ4ČĘ ˘…8nĺnťęĆM·dܸ »5N+oÉp!C†l6\˝%ăć 8oŢşmË5‹.\ܸqĂĹ-.\Üpqㆋ.nÜpáâvë[7S¸ĆÜâw!Ę1d¨ÜŞ2ćV”n`ÂůRĺË~÷˘PSĄŠ0UÂ``ĹoŚr`ľPCĺK2UNőăÇďÚfÍň6Ž7nÜşÍĘ…+×7nbôńÓ'‹_ż~üîíŇ…‹VoŞTuăWNŚYĺnýăwëK7V¦Rĺâ׏_?~ýúńëÇŻż~üřńëÇŻż~üřőă׏_?~üřőă׏_?~üřőă׏ż~üřţńGĆ›)YŞXÝZF+Y¦Nɓʷ\˛L}ˇĄ‹•.n´ĆpŁŠ 92łL©šĹŻ?~ýřőëÇŹż~üúńăׯ?€ýřńă׏?~ýřőă·o7 ˛.h!.™7]ąnÝ•ëÖ­[şnq»•KW®\Ël Ë5 —°[·néŇĄK×­\łtqㆋ7n¸¸ Ă… .n¸¸áâĆ 7\Ün}ëfęÖ*Vą˘pf×1·4Ě#«Š“0bT|9Ĺď”0©6°e 0üř"S®Ę'śľDłkŐ }üúu»ĆŰYŢČÉ:t¨T©[ąpáú† L?~üţńăţÇŹżrĺôÝ·Ď•7{¸Ä•Gîľ~ůöuëGîą}üúńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~÷ČůĂ'®\ľ{řî‘ĂGÎŔ{Ţđq»·>râîá·ďž¸~Űúu§_7rĺöńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üúŤë¦AÖ-Äq+×mÜ8\łf]óöíŰ·qÝĆy»5kV¸uŢľyóöÍ[·oŢĽ}ëö­[.nܸáÂ…‹.\Űpqㆋ.n¸¸qㆋۭnŢXŃâ'kţ×-~´nýSĺm›¬ŰĘÍúĄK–¸YÝříÓuÍ-oŰĽŃňvŤżo«ŔuŁeËT”o˛ţéšĹŹ_?oŢĆŤ5Ë۸kş®ÝşĄ+®dݶ… vî\şsçÎť;—ÝąséÎK̰tčŇťKwîÜątçҡKwîÜąsçÎť;wîÜąsçÎť;wŕąsçÎť;wîÜąsçÎť;wîÜąsçÎť;wîÜąsçÎť;wîÜątçÎĄKwÝ9téΡK‡.ÝątçÎťC‡.şséΡCw.ÝątéСK‡.ÝąsçÎť;wîÜąsçÎť;wîÜąsçÎť;wîÜąsçÎť;wîś9ţqß4ČĘ ˘…8nĺn™*Ő‚… 7޸áŇ5N+1/X¸ys¬Ů­\Ýp ăÖMX·oܸݚō7\¸¸á↋7\ܸqĂ…‹7\Üpq»ĹÍ›)YüřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üđ©şĹŹ?~üřńËwŞT)VXjy3—+W®\ądĺÂ…‹[7,#H  $H A‚ gHś9s† $H A‚ $H8C‚ $Î A‚‰3$H A‚ gH q† $H q† gH q† gţH A‚‰$H A‚ $H A‚ $H A‚ $H A‚ $H Aâ $H8C‚ $Î A‚‰3$H A‚ $HPCŽ›YD´Ç­->BŢčšőfζo·Ć±â٦Ž0Lj9»–Ë›0n«R%ŁĹ*·\ł¸áÂĹ 7n¸¸áâĆ 7\ÜpqĂĹ .n·şm»ĺm_ľ|řđĺÇ/>|řđĺĂ—_>|řđáÇ/>|řđá/>|řđáˇ_>|űúáˇďą|řĽĄZµjUŞqß®éŇ5kÖ¬[Âráâ¶m ‰3jň¤ţ9sć ‰8yŕ”HCB hΔH“ćL 4gÎś9s†Ä™3gÎś9sćĚ™3gÎś9sćĚ™3gÎś9sćĚ™3gÎś9sćĚ™3gÎś9sćĚ™3gÎś9sćĚ™3$ňŔ!‘ĆDš4hĐPŁN5jH”X٦DšiŇ”P'Nš4%Đ”HC" 4gÎś9sćĚ™3gÎś9sćĚ™3gÎś9sćĚ™3gÎś9sćĚ™3iĘ}Ó ë‚‰⸕›%cSąĆ‘EK—9V3ö\QulÎ[˛rqăLT¨WŁDŤň–k7nÜpá↋.n¸¸䆋.nܸáâĆŤŰ­o„ÍR%ţK•,YŞvÉÚµk—*Y»dÉR%K•¬]Şd©’µK–Ş]»dÉ’µk×®]˛víÚ%K•,Y˛dqëÖŤŰ·qăĘ•+× ®mܸqăĆŤ.\ÜşM!q†5hÎś!‘'N=qx©‰CBMž8q`Ĺ‰Ł†Ä™3gÎś9sć ‰3gHś9sćĚ™3gÎ8CâĚ™3gÎ8sćĚ™3gÎ8sćĚ™3gÎ8sćĚ™3gΔ8s& Ż6ŕiŁ&Ë6n·Ć±âCäM$/Y»†«·Z˘B˝ę”·\´¸qĂ%Ś.nÜ„áÂĹŤ.\ÜpqĂĹ .n·ľyc%‹?~üřńëÇŹ?~üřńăÇŹß˝}ýúńăÇŹ?~üřńăÇŹ?~üříĂÇŹżrĺČá3Ąj\.n¸¶á•Ś[2n¸®qĂ…+.nąpqë†e‰4jJţ A‚D hJHS˘D‰iLPĆ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ €$H A‚ hŇ )‘&M‰hҤ1‘&M5$Ô )Q˘D‰4iФ)F 5$Ô¤)& š4%H A‚ $H A‚ $H A‚ $H A‚ iÄqÓ@ë‚⸕ÓĹ§ŹŤ)8á†ëV9V}úŕxbFĄfąpuăVKT(^ŁBŤňvk7\ÜpqĂĹ W2aÉ®qĂĹ 7\ÜpqĂĹíV7o¦r‰9ţ$&W.|WR©*—Ď›·mýřÉ*†Š,\ăV…ÁGnľ\ŢĆÝňv¨?]aVńë—KĚťQbdŤĂĹ 7\¸pmĆ —0\Ü’áÚĆ ®oÜŞŔ8qŕÄ8pŕŔ8pŕŔŔ8pŕŔ8pâŔN8qŕŔ'8pŕÄ'8pŕÄ'8pŕÄ'8pŕÄ8pŕŔ8pŕŔ8pŕŔś7pŕŔóÎ8pŕŔ8pŕÄ'8pŕÄ8pâŔN8pŕŔ'ţϸndeŃBś¶rłřđ1Á‰*nąpÝÇŞşC¶ěV®nÜj‰ UkT¨;ßrÍę&L0\Üpq&Ś7\ܸqĂĹŤ®k„Ýňć­T®R`¨¨CL©/bČ€©Ą?*ůĘA©b…Ś0_ľŚ!ŁŞ *T”â—oT:~üľIđĄÔ®qą¶qㆠ7\¸páâ&L0aÂ’qË…ë›00úřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?ţ~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřő÷M¬ "Ză6nV =ĆĐ’ĄJ•Ş[ăXĹ…Ő°Lb©ÂՍ۬'Ot=yęŰ­YÉ„ KĆ 7\Â’ĺÚĆ .nܸá• —°[ÝĽťÂ…GV0UĔްԬ 㢔şÇoŚ*PNŞTL*cľ€©’aś/ řQqŐŹ_żnŰJŤ#k.\¸pqăĆ ×6n¸~%K& —0nąp}&?~ýţřőă׏_?~üúńëÇŻż~üúńëÇŻż~üřőăÇŹ_ż~üřőă׏_?~üúńëÇŻż~üřőëÇŻ?~ýřőëÇŻ?~ýřőëÇŻ?~ýřőëÇŻ?~ýřőăÇŹ_ż~üřőă׏_?~üúńëÇŻż~üřőăÇŹ_ż~üřőă׏_?~üúńëÇŻż~üřőăÇŹ_ż~üřőă׏_?~üřőëÇŻż}ă¸iuAD q×ČÉş!FŘ·dɸqăvkś©Ľ%C† ™µkąľq¸MĚn¦ĚĚú–kV2a®áJ¶ .a¸’áÂĹ .nŰp –ě–·n¦fáţĂWŽś·r÷¸‘ëwŹź·nüřńËőË\·(Ţîm»—ďV?oărő»‡ë?o·Đńă7Î۸rĄdŤË…‹.n¸¸%–L0a×p ĂĹ ®nÉŔôăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřäÇŹ?~üřńăÇţo_9ndeŃB7s·\}†K0\¸pÝň&‹–·\¸!C¶,W®nąp}ó–ë[·mÜrÉJ– .nąpáÂ… .nÜpqㆠW2\Â’ÝęÖÍ”,~ýřńăÇŹ?~ýřńăÇŹż~üřńë—‹?~üřńăÇŹ?~üřńăÇŹ?~÷Ä3&Ьqą¸á↋®_„ –,™0\ܸĺĘőí}üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹţ?~üřńăÇŹ?~üřńăÇŹ?~üňăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üří+×M¬ "Zxëćí–°[·rÝşuë–­[Ýrĺş•ë–-[ąrÝ&ěÖ­[·nÝşuëÖ-\ŢĽyóćÍŰ8oŢĽyă&LX2a¸¸qĂĹ ·[޸ĺ÷Ź9räČý+‡î9räČýű÷Ź9räđ‘#GŽ:räČ•#÷ď_ąäČ‘#wĎ۬YłfÝ*Ç 7\¸¸áÂ…‹·k¸¸qĂ…Kض\¸şáŁŹ?~ţüřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~ůńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹż~ĺ¸i uAD qÜČuóÖÍ[7o߼ywîZ·qÝ„yó&ÎŰ·oßĆ}óÖÍ›7oÝĽyű&lÜ8nŢĽyó6Î۸o·¸ý&Ś.\Üpqăvë.nݸţq&Ś·mɸqăĆŤ7nܸqăĆŤ.nܸqŰĆŤ7nܸqăĆŤ7nܸ}óćÍ›7pܶqĂĹŤ.nÜpqĂĹŤ7\ܸáJ†+—7\bôńăÇŹ?€üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăţ·oÜ7 ˛.hэ۸\Â~áÂĹ­”0¸FAQ%+Šo¸pá•ë7\¸pqËőMLŞYTľŕe7\¸p ă6k7nÜ®áÂĹ 7\Ün}Ă… 7\Ü„áÂ% ×¶k¸pá•L.\ÜpáÂĹ .\ÉpmĂ…‹Ŕd¸]ㆠ®kÂpáJ– .a¸áÂĹŤ.n¸¸áş&Ś.n¸¸ĺÂő }üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹţ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üöŤă¦AÖ-Äq+‡ ×6nÂĽ‰ůć‹•0b˘„ó —°mÜpáę–L0n¸şC% *_ŞĚâ& W2nÜnéâ– .nܸá↠·[ÝpmKĆ W˛kɸ K–L7n„%»Ć 7nܸáâ& —0a¸pqK&LX2a¸¸qă&,™°dŰpqă–LŘ5nÜpqㆋ.n„á↋7\¸ş łŹ?ţ~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹßľqÝ4Čş ˘…7năpqKP.oa¨PaĺB©/ľ»ĆM·\¸ľá–Ś.oUÄą@ĹÔ† ł¸qĆm·[·¸qㆋ.n¸¸áâvë›°d¸ţpqㆠ.\ܸáâ†+™0\Üpqㆋ®d„%&LX˛d¸p%†‹.n¸¸á↠7\Ü~%ۆ‹.n¸pqĂ…+™°dÂpqă–+—7n`ôńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńČŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńţă×o7 ˛2h!ŽŰ¸\¸páÂĹMU*VÜhU‘Ő Ěˇną¸á–+7\¸páĘĹ-•¬obÄxKőĺV2\¸„ĺâ6k7\¸¸á↋.nÜn}»¶ 7\ܸmĂĹ .n¸¸ Ć .n¸¸áâ& .aÉ„áş&L0\¸¸á↋7n¸¸qĂĹ —0a¸pá↋7\ܶ űuM0aÜráúvMĚ>~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřäÇţŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üúŤű¦AV-Ä%w+W®\ąnáJ†+.oÂnuă–+W®[¸n}ăv+W®\·rqËu«›°[¸¸Ýşu+W®\ąnĺâĆ 7nܸá↋Ű-oܸqĂĹŤ.n¸pqㆋ·dÂpqㆋ.n¸¸ &ě.aÉ„áJ&ŚŰ5\ÜpqĂĹŤ.\Üpqㆋ.n¸¸qĂĹ-.aÂ’ K&L.\ŢpŮÇŹţ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üňăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹßľqÝ4Čş ˘…¸däşyëćÍ[·qÝĽu7KXą[ąĽyóćÍ·năşyëÖm\2]ăşÍňćm\·qŢĽyóćÍ®[ÜpqĂĹ .n¸pq»ő .\ţÜpá↋.n¸¸áÂ% 7\¸¸á↋۵d¸’%&LX2aÂp KĆ 7\Üpá↋7\ܸáâĆ .\ąáâ†+Y2a¸„ – W˛m`öńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřţńŰ7Ž›YD´Çm\.aąpáâfŞĘ)nb ¨RL·\¸páĘ•ë[.\¸p};%ĺĐ,)_p©ŞBF.\¸„q›u‹7n¸¸áÂĹ .n·ş K†‹›0n¸¸áâĆ 7€¸¸á↠—0\×’á↋7\Üp †+.a¸®%Ă•‹7\Üpqㆋ.nÜpqĂĹ —0a¸„ ĂĹ 7\Ürĺň† Ě>~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăţÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~ýĆqÓ +⸍õ 7n·ŞĐ S…Ę—0Qľ€é†K7n¸puõM@\ßLUѦړ(ad…Qő —0nÜfÝâĆ 7\ܸqㆋۭo„ ㆠ7\ܸá↋.nÉpm–L.n¸¸áÂĹ 7\Érm–,™0a¶%ĂĹ 7\ܸá↠7\ÜpqK–,.\ÂpqĂĹŤ.\Ţ„‰ŮÇŹţ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇ ?~üřńăÇŹßľqÝ4Čş ˘…8năpqăĆŤ.1NŔĚŠbÁ” _Ľ &,®\Ý’mK†ËۨWv]¸°ę*·¸]K&ŚŰ-]ܸqĂĹ 7\Üpq»ĺMŘ5ţn¸¸qĂ…‹.n¸¸áÂ…‹.aÂ’%Ć .nܸqĂ…‹7n„ K–L.\¸¸qĂĹ 7\ÜpqĂ…‹7n„qĂ•Ś7\Ü„qËuí70úřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńă?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üţřńŰ7î›ZD´Ç­\.\¸pá↠խn·ÄĚęvČT7\¸pmË•ë[.\ÂpqS%×50łşqK5‹›0\¸’%›Ą‹.\ÜpqĂĹ .n·ľáJ†‹.\ܸá↋7\۸áJ†K0\Âpqㆋ.ną¸áâ†+™0\ׄ K&Ś.nÜpqĂĹ 7\ܸáâ†ë7\ܶĺÂĹ .n¸r}ă&f?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńČŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńţăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~űĆqÓ ë‚â’]“E‹–,Z´h͢%kÖ­Y˛né’5k­Y˛rÝ’EKÖ¬Yłn͢uk–,ZłfɢE‹–,Z˛rqăĆ 7n®qăĆíÖ7nܸ K†+.nÜpq»– .\Üpá–L7\ÜpáJ&l.nÜpqㆋ.aÜpá↋.n¸¸áÂ%L.n¸¸áâĆ .aÜpqĂĹ-®oŰŔěăÇţŹ?~üřäÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇo߸ndeŃB\®kßşqۆkŰ/\¸páĘ…KX®\¸rĺ•+W.\¸ráĘ•+®\ÂráÚ† —0\ܶqëĆ­Ű5\¸ru›5K·\ܸÝꆋţ.a„]ㆠ7\Ép ăĆ ·dׄ ĂĹ 7aÂp%ㆠ7n¸rĂ%,Ů5nÜpqĂĹ 7\„%Ć 7nÜpáâ&,Ů5n¸¸qË…ë[.1úřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~ţüřő×M¬ "ZĂu«Ę1cN•Jej•ŞT´vÉšĄKÖ­\łráÂ6ëׯYłnŃ’5K•*U©RĄ*ĹŞ§0aľěňV*Ś0«|!3& 7n·ľqŰ–L®d¸áâ†K0a¸¸áÂĹ-™0aÉ’ ăv-™°d׸á↠7\Ü’ ㆋ.n¸pqă†+.aÉpá↠7n¸’ K† ×6n¸ruăf?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřţńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹż~ăşi•AD qÉfE™QĆT.€¬şťâ¶íąY»ÄŤcŐŤ«mĺHŤRF.®rłdÝ“Ek\Ş[ÜLyc• J•C§ÄŤÚRF $1¦ČTá†ëV7\¸p K†K.n¸¸%–L.n¸¸á†K0\Â’ Ă%L.n¸¸qĂĹ W2a¸¸á↋7n¸páÚ†+7n¸¸qĂ…‹[2aÜpáâĆ-®nŰŔěăţÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ@~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŻß8nd]ŃB·YT I…+U7Sß„ť"7K•7o¬¸ýKuË©QÜʱşUNÖ®˛dŤKuk›)o©TIůrĘT·\şhu»†‹Ű¬YܸÝúĆŤţ.n¸„áÂ%,™0\Üpqă†+™0a¶á↋.n¸’ »Ć 7n¸pá†K®dÉpmĂĹ .n¸¸]ĂĹ ·dÜp%– —0n¸¸ĺÂőŤ›}üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇ ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?ţ~üří÷m¬ "Ză6‹ 1¬r™ňvŠ®SäfÉú捷r¬n™#Ĺé9V·ĘÍRőO–,q¬ná:单*(UN™ň¶­›·mÜpuë–L·[ݸá↋[2aÉp Ć 7\¸¸ ö+.\¸¸á↋›°_ÂpqĂĹŤ[2\¸„ & .\Üpqㆋ.nÜpqㆠ7\Âp%»Ć ·\¸ş%łŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńă?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üţřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹż}ăľiuAD q¸f]"Ć.VŢLuŰVŞś.YἥúF.®r¤8űÇ ×żY˛îÉš5.Ő-n¦Ŕ±RĄJ)Sݸ•buč™TŞnqăvë7\۸ Ă%LŘ5aÉpqKĆŤ.n׸á↠7\¸¸]&LX2\Üpqõ-Y2\ɸá↠7n¸¸á↋.n¸¶á¸ —0aÂpáÂĹ-®o¸ÄěţăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńă·o\7 ˛2h!.Ů-*UŔ1U*Ő)UŞXÍ’%kÖ-Yş„ÍĘ•,۬_¸féş%KÖ-UŞd±JµŞTŞ1cľ|©âŠ[7VdČ|!óĺË­dŰnuĂ…ţ+ٵdÂ’ K†KX˛k¸pÄĹ 7\Üpqă– ×6\Ü„%ű%Ś.n¸’qvM0\Üpqㆋ7\ÜpqĂĹ 7\¸„%K&,™°mܸĺÂŐ ~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹţ?~üú•ă¦AÖ/Äĺâ–l[.\ąpÝĘ•+®[ÂnÝş…ëÖ­\·nĺşuëÖ­[·ćĘu+W®[ąrĺ•+W®mÂpmË%L×­TşRÍšu‹·[Ý’ ㆠ®m¸„%Ć-™°m¸¸ ㆋ7\ŰpáJ†+®mÂ’ õ .nɸáÂ…‹7\Ü„áâ&L®d¸¸qĂ%L0n¸pmĂ… ×¶[ąşĺ˘uďŢ˝{ůňÝËw/ß˝{ůňÝË—ďŢ=|ůňĺËwďŢ˝{ůňÝ»‡ďŢ˝{ůňĺ»—ďŢ˝{ůňÝ»w/ß˝{ůîĺËwďŢ˝{ůňÝ»—ď^ľ|÷đÝ»wďŢ=|ţůîÝËwďŢ˝|÷îĺ»—ď^ľ|÷îĺ»wďŢ˝{ůîĺËw/ß˝{÷îÝ»—/_ľ|÷îÝ»wďŢ˝{ůňĺËwďŢ˝{ůîĺł—/_ľ|÷ňÝ»wď^ľ{óÝË—ďŢ˝{ă¸i•AD qɸqăĆm[7n߸}ăĆ-Y·nɸqëÖ­[2nŢş}űÖŤ[·nßľqëÖí·nܸ}ăĆŤ7nß„}űć-™·nݸqű–Ë7nܸqăĆM7nܸqăĆŤ7nܸqăĆŤ7nܸqăĆŤ7nܸqăĆŤ7nܸqăĆŤ7nܸqăĆŤ7nܸqăĆŤ7nܸqű&l›7\ăĽţyëöÍ›7oÝĽyóÖÍ›7oÝşyóÖÍ›7oŢĽyóćÍ›7oŢĽyóÖ­›7oÝĽyëćÍ›7oŢĽyóćÍ›·nŢĽyóć­›7oŢĽyëćÍ›7oŢĽyóćÍ›7oŢĽ}ó&Λ7oŢĽyëć­›7oŢĽyóćÍ›7€ÝĽuóćÍ›7oŢĽyëć­›·oŢĽyóć­›·nŢşyëćÍ›7oßľyëć­›·nŢĽyóćí›7oŢĽuűćÍ›7 ˛.”@1ŞŽ1bĆŚ1dÄ#F 2bÄCFŚ1bÄ#FŚ1bÄ!#FĚ1bČCFŚ2bÄ#FŚ1bÄţ#F 1dÄ#F 1bČ#FŚ2dÄ#FŚ1dÄ!#FŚ1bČCFŚ2bČ#FŚ2dÄ!#†Ś1dÄ!#F 1bČCFŚ1bÄ#†Ś1bÄ#F 1bÄ€C 1bÄCFŚ1bÄ#FŚ1bÄ€#F 1`Č€CF @1bÄ!#FŚ1`Č#FŚ1bÄ#FŚ2bÄ!#FŚ1bÄ#FŚ1bČCFŚ1bÄ#†Ś1dÄ#F 1bÄ#FŚ1bÄ#FŚ1bÄ#FŚ1bÄ#Fţ 1bÄ!sAV/şýÂ% ·[·ľÍşĺmÖ­nłn%›•ë۬\Üfá6 ·Y¸É–l–0\˛¶á˘Ĺ ×,nąhqËĄ‹Ű­YÝnÍúvkV·[·¸ÝşĹmÖ­ołn}›•‹Ű¬\ÜfáâF 7Z¸¸ŃÚ†‹7\ł¸ášĹ ×,nąfu»5ëŰ­[ÜnÝú6K×·Y·şÍşŐMW.nłr}Ł…‹­\Üh ă6k[2ZŰpŃ↠ŕ,nąfqĂ5ëŰ­YÝnÍúvkV7]şľéşŐmÖ­ołr}›•«Ű¬\ÝfáâF W7Y¸¶Ń–L.\ł¶ášĹ ×,nąfqË5ëŰ-ţ]ÝnÍúvk·YşĽÍŇŐM×­ołnu›•ë­\Űháâ6 7Z¸ÉJ†KÖ6\´¶ášĹ ׬nąf}»5ËŰ­Yßnéň¦K×7]·ľÍĘ%L°kܸqۆK.aŢ Čş ˘…¸nÝ®yó¶*U9U´Ľ©’5NŐ,s©t‰+5Ë›©[ÝXĺâf 7SÜpáI†‹U·\¬ľĺbĺMW*ołJŤ“µ -UŢd©ň¦JÖ8VŞĆ­šĺmŐ¬q©nŤc•Ë[©[ÜLáâf 7SÜr™ę–‹“·\©ĽÍJĐŰ,Vâf©ň¶ËÔ8YŞĽ©’ĺM•,p©hy+Ek\Ş\ŢRÝň–*W7S¸ţ¸ŤÁ…Ë7\¦ľĺbŐíV*ołF™›µ Ü,Uăf©ň&k׸T©Ć©’5n-o©f}K5Ë[©[ŢXáâĆ W7Sܸ±ęĆm 7\¦ľÝ2ŐM«ołRy“uĘś,Uăd©'K•9U˛Ć™R5.-o¬t}cu««\Ý8áęfŠŰ6Vܶ™ę†‹•·[cĽÝJőmV*ołRy›µĘś*VĺvŃň¦J–8U´şqăĆ­·dŢČŤ+WÎŰYD´—*•7H¸\Áş…K7\ąnÝÚ6k›®d©p%ă¶-7nܸqăĆŤ®Q¸nĺşőm–°\Ü„m»•L–¬oܸḍŰ5nÜpqţăÖ-•¬[Üfu»•kV.\ł¸ÝŇuJ7nܸqăĆŤ7nܸ]3•+W®\ßfuĆ-·\ÝTÉęĆŤ[2nܶqă¶Ť7o¬fÍâ6ËŰ-\łr%»%ěV7UܶqăĆŤ7\ܸqăĆmÖť\¸náâ6k-nܸÝâ¦J7nÜrqăĆŤ·mÜ’}+Ąë–0]ŢtášĹ-×­\ąf©ęĆ-Ů6\ܸqă–Ś·n´RÝvK7\·nuõí·Tą¸q۶Ť·dܸ%ăĆŤ[©\·pÍú– ×-n·rÝÂ5K7\ÜpqăĆŤ›°d„uSĄĘ®Yɸ庖«›0\·fÉâĆţm7aÜrŮr"ë‚äÄ\ĐUŕš¬QĄČ$“Ş1¬d‰!GĚ©RŞşá↋۶\ܸá↠Ď)1dJ­ŁJĚ·Sś@‰cŞÔ6\ÜpqK& W2n¸ş­:UJ ™TĄF±J% Ś1¬Č’ő .nÜpáÂ…‹·[‡L‘!c*V_Ć‘9Ä LU§¸ ㆠ.\ܸáşöŤU)Nd8©"Ă Ś*U`ČŠ-nܸá↋.n¸¸ÝÂcJ S¬Č¤Ó L)0©J±2Ĺ ×¶m¸~ ăv ®o§N‘gŐQah­C¦L+SĄtqă–‹[˛m¸p ăĆŤţ§Rdİš%Ćn`JSĘTŞo¸„ ă&L0n¸„qdŠ 2·ČĐË1cÄ”:•‹®d¸rĂ%ě.\ßT•ş#†L*Y‡d‘ůöĹUbL­*÷­·[·ś¨Ę â9N˘X¸Ą‹2dR•C¦Ô*2dĆ)%&Ő7\Üpáµ W2n¸p©2E†L©TbdťşEćĐ©1dÄÁĹ 7\Â’ ¶í7Y¬@q:” Ď2¦n}IĆÔ¬1ŞşáÂ…‹7\¸¶%ă†kU)2dJ±"sęË-0Ą@sJ 7aÜpqㆋ.n¸’Éb5f̡TdL­:5ëK*0ţśČ‘őí.n¸¸áâ†K·[©N‘!sĘÔV˛r}a%&•©1cľá– —°d„qĂŐM•)‚ $H A‚ń±ţ`Á‚ ,X° A‚ $H°`Á‚ ,X`Á‚ \° Á‚ ,X°`A‚ ,X`Á‚ ,X°`Á‚ $X`Á‚ ,@ŕę߸rÝŔČR%‹ÖŞ\Md]ŃBÜ5nÜp}ŰĹ A 4hĐB @hĐ „ 4pĐ „ 4hĐŔA 4hĐ  4hˇA @hˇA @hĐBC†A‚d$FŚ12Ä$C† ‚d#F A2É!H† 2ÄČ#FŚA‚É$C† 1bÄ$H 1b ţ$H ‚d$C† 1b $C A2ÄČ#F† 1b ’!H† 2Ä#FŚ‚d‘!HŚA‚É$H™âĄ’!H 2É$H|4hĐ „ 4hĐB 4€Đ A4hĐ „ 4€ˇ„ @hĐ „ 4€Đ „ 4pĐB 4hĐB \•FRTŔ‰B Ь "Zű… —°o»4hĐ A 4hĐ A 0hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ Aţ 4hĐ A 4`đaČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!‡ 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ"SĽ2dČ!C† ‚‰Ź 4hĐ€A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A­m2ţČ“ę‹1Uf9q•AD q¸pmĂŐÍU 4hĐ A 4`Đ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A  2dČ!C† 2dČ!C† 2dČ!C† A2dČ€C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† RdŠ—"C† 2dČ!C€ ńţŃ A 4`Đ  4hĐ A 4hĐ A 4hĐ€A 4hĐ A 4hĐ A 4hĐ A 4hŔ A $¨5®Ű8n`R‘aĹJ̬&˛.h!W2n۸ÉbĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hŔ A 4hĐ Ŕ 0hĐ€A 4hĐ AC† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dţČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C†LńRÄČ!C† A2d#>4hĐ A 4hĐ  4hŔ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4`Đ A 4hĐ A_Ä€ćË*UׄĄšĄAÖ-ÄĺşĆ W7W 4hĐ` 4hĐ A 4hĐ€A 4hĐ A 4hĐ A 4hĐ€A 4hĐ Aţ 4hĐ A 4`đaČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dH‘)^Š 2dČ!@ bÄG 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ€A 4hĐ A 4h°A 4hĐ€A 4`Ŕ`,rŢţĽŤ+§Ę”*UĄf5‘•AD q¸’ ĂĹM 4hĐ A 4hŔ A 0hĐ A 4`Đ A 4hĐ A 4hĐ  4hĐ A 4hĐ A  2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† )2eJ‘!C† 2Ä#FŚřţhĐ A 4Ř A 4hĐ A 4hĐ A 4hĐ€A 4`Đ€A 4hĐ A 4hĐ A 4hĐ A B,¨…ďßż˙v©še+Ő- ˛.h!.—°d¸ľąbĐ A 4hŔ A 4hĐ A 4hĐ A 4hĐ A 4`Đ€A 4hĐ A 4`Đ A 0hĐ€Á‡!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2ţdČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C†2dČ!C† 2dČ!C† 2dČ!@ŠLńRdČ!C† AÄ#>4hĐ A 4hĐ A 4`Đ€A 4hĐ€A 4hĐ€A 4hĐ A 4hĐ A 4hĐ A 4hĐ Aµđ•ű÷Źś,U´hĄŞĺDÖ-ĽáÂ… ×·] 4hĐ A 4hĐ A 4hŔ A 4hŔ A 0hĐ A 4hĐ€A 4`Đ€Aţ 4hĐ A 0€0dČ!C† 2dČ!CŚA‚’!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C2d$H† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dH‘)^Š 2dČ!C†‚ÄG 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4`Đ€A 4hĐ A 4hĐ A 4hĐ A 4h°€>rţ˙ţý“ĄJ–,Uş4Čş ˘…8\¸¶áęćjA 4hĐ A 4hĐ A 4hŔ A 4hĐ ,4hĐ A 4hĐ A 4hĐ A 4hĐ A † 2dČ!‡ 2dČ FŚ2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C†IÂ(’!C† 2dČ!C† 2dČ!C† 2dČ!H† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† )2eJ‘!C† 2dČ$@ţřhĐ A 4hĐ Á 4hĐ A 4hŔ A 4hĐ A 4hĐ A 4hĐ A 8`Đ A 4hŔ AĐşGîß?r˛TÉ’ĄęVYD´‡‹.\Ýv1hĐ A 0hĐ€Š 4hĐ A 4hĐ A€ 4hŔŕĂś 4`Ŕ A 4hĐ A 4hŔ A 4hĐ€Á‡"C† 2d’!C†‘ŁČ C† RdH%‹| 2d‘!EŠ2dČ!C† ‚dČ!C† 2dČŚ(ů@ţ2dČ!C† 2dČ!C† 2dČ!C† 2Č!C† 2É!C† 2dČ!C† 2dČ!C† 2dČ!E¦x)„Č!C† 1Ä 4hĐ A 4˘A 4hĐ A 4`Đ A 0hĐ A 4hĐ€A 4hŔ A 4hĐ€A 4hŔ A‚Z÷ţ‘#÷OŔq÷îqłĄAÖ-ÄĺâĆŤ·W hůB 0řĐŠ 0hŔ€ 0hĐ A |ł ABR,`Ŕ€ 4hĐ ţA >4`Đ  0ř0 ’!C 1bÄ ŠA‚ #F† Q˛hQ$Ś€ A‚„H—FA A‚ÄČ$HŚ1bÄ$C AâCR%F 2É#FŚA2d$C 1bd’!F†ČA2ÄČ#FŚA2 $H† Abd$H 1bd$H† 2¤Č/;)2d’!F Iâ 4`Ŕ€AZR,Ń A 4hĐ A 0hĐ`4hĐ A 0`Đ A!4hbÁ- 4hĐ€ 4`°ŕ>ţr˙Č•›ĹŞT)V¶śČş ˘…8\¸¸áę¶KŠT+p•râ+f! !‚„$Dđŕ„4X %Ĺ‚ l±  6h!< >4X°Ä‚†‚dČ!C† Aň“3 C† !2„’]¨˝ëĹ ^/f”Š1‹Ź#KI,őęŐ¬—˘ Häüč˛Čś H|0rd –Ú$I/%@† 2dČ$>(Iň1dIH”X 2’!C† 2dČ•2dČ!CŚřč-Ö3jĚËÂéR5hŠQĘQŚYŁbţŤ|,`Q¬:(T,hภ|¨‚„ZĚĄXŕ A 0řđk ę€k Ä‚ 0XŔ AÜqˇA 4hĐ A hŮ#GŽÜżYĺţýgˉ¬ "ZĂĹM°o®jńăÇŹ?~ůĺ«U ?[Żňńăg ?W ¤‡ ÖŻ_ýR,XŔB_ŠpQ±€Auę,hĐ A >$¸S'„ ¶€hĐŕŹF˝ä2dČ#FtT‚6d r† ADŽ;hϢAsíÝ»iĎžcÖËłhΞÁSô#É$F’bĹ뉏aÍ~ţA2Ä’ H~4Š×Č’!C† ‚Ä%I>Ś ")Ic@’(ńd$Ť€ 1âcX±!I€2d±¨ ›6­šłab@a‚6­—%c8†9kT¬—Ź*Z}C÷j ‹€3— Aµ°,h€ ż R€XĐ A еJ!A~XěÔYŔ€Á‰(R,`Đ A€wj`Đ A 4hĐ Á‚ZřČý#Wî–,S¬dáj"ë‚Ţpq»†ë,püřńăÇŹ?~řĐńă÷k\?~üĐéă‡K‚üŔ˝Â׏_Š Tđ»“ŕĂ.)0€Ď/ 4hţĐ Avj%hĐ`Á– ´4˛šś F† 1bÄLцDŇ!C‚Č™ Ú;hÓ A6 ´iЦ={íť´w‹~$éU‰Y4xĆ| 2ě] F‚ “3dČ:ńý02dČ!Cř Äȇ#?z1’ĂĚśFJ1âŃE$H‚ôz·¨%C† A˘ŁĽjϦM{‡L6gĐŕőęµLN1xĂ5óŃ ?~üúýR± Ŕŕľ-€Đ`AľZ>$hĹďŽVu 0hĐ A}Ż|HP‡ßť;ü°,ř€‡­2'>0€ŕŽ2 4hĐ A 4X@ ţ9r÷ĘÝňĆŤŰ·[3veŃB.aÂpuőŤ?~üřńăÇŹ?~üřńăÇŹ?~ýř˝B°…_?}üřńc±` ~¶pA0ç ŘA 0hŔ¸  @…ĺĂ–IzM“4dČ!C† ńQ)9Š|HB‚I9ÓÜM6mÚ´gÓŢ={ ´iÓžMŻWEÓŠ˝6ÍX$?zĹ‹5 ^ĆäůŃ(%H† 2d”†ů0b$H%hŐŢ)QR©W`*,¸g+Á‡żř«őëÎ 4H±ĎU‚ ćđ3w‡_ť*j-PöKßťÜá§ 4hĐ  ^á+÷ď_ą[âľyë–K¬ "ZË…+™°n«ŔńăÇŹ?~üřńăÇŹż~üřńăÇŻ?`Pńë׏_?~¨,`Á/_[´đ›Ă Á[żđ,€Đ AÜQvg‹ ­\5ز I5hĹä12d‘E8zAó±ČY’^r~"gÚ4wϦ=M4hϦM‹6íŮ´iĎŢ1B)Ţ;hĎŢESpH^đţ¨92¤19@‚(‚÷Ś!C† 2Ä%b>Ů Ţłiräs Ţ"KđŞYbäŁWĽgѨ9Cd˝ŕ={ö4jÚ®Q{6ÍY/xŐ˘Möě:üúńăÇŹ¬ üâgUŠů€!€° ż~µ~ŐůµďĂ®îýZ!A~ýľń«Ł˘U-;čřńCő„;ýępY€„ 4hbA-|äČý+wKÖ©R˛®i•AD o¸¸qĂŐ 8~ýřńăÇŹ?~üřńăÇŹ?~üřńă‡OK+~ýřńăÇ„,řńű…N…~ĺT€@X9 0ţhĐ A‚:üđýâ·ĺ8°q6-ž$F† hÄ’Ź^Đ|0Чh±$C€tö Ú3hЦA› ´iÓ¦ą› ´iÍ$˝6 Ú´iÓ(ůđá ^4x’sf©’EÓŕIâadČ!Cđ DĚ$>*Á‹­W›hĐžMłÔ+ž3bĎrôŠmZ4xĂä⣼gÓ =FíŰ5xĎžEs6 Ú»iĐžÁŁT‡?~üřńă§bÁ‚_ü̡›3 ź­,(ă×oź>XčřXâWľ|) $ŘÂŻ_?~wĚ{UŽ_?~µZýzU‡ßŻWę`IĐ A $xeţŹÜżäfýˇŻÜ­˛.h!.\¸ş­ÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üîŮâÇŹ?~üřäw' ~üúő«‹:t° €łĹď0h`ż~üř˝şĂďÄ/IŞ=Çč‡#F€B)ž˘XÔz1§ČÇŹFÓ¦A›6mÚ4hЦA›íŮ4hî MöŽŮ±wЦA{6í49>zĹ‹ŹX#fđA‹ÖëŮ´f“’ 2dČ ˝ŕ- ‚d±xĎŢmÚ»iĎŢMsF,šśJđ˘A›6ŤY±JC€ô‚Í´iШi»FíŮ;hĐžA&mţ´wĐjńăÇŹż~ü¶,Xđ‹_?~ภ«…ęŐś}üřńă·Żż9 >čăׯՂwřńăÇ\9~ĘĐńăÇŹ_?~úŔńăwĎŽ>s @,hĐ A´đ‘#÷ŻÜ­YŞŞšuM­ "ZĂĺ­Ű7o®ľńăÇŹ?~üřńăÇŹ?~üřńăÇŹż~řřńăÇŹż~ü\ ÂŹ?~üjńăÇO_ľ~µúń• AĚá׏?p¨řýĘת‘łgď|ýňHb”*ÁŁÄěÝ´wŃIRb 4hĐ A6m4hÓ A{& ´iĐ AöěŮ´iÓ¦M›Ö(GŻxţŃŕŁTěÝ3hďŞA›6 žś C† B¤Xt¨4hĐ`A-|äţý+7K­Yşn5‘uAD qłRĄb•Ë7~ýřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~ýřńăÇŹ>+řńăÇŻß+~üřńăÇď?~ĺ ţÜaĐ A‚2üúńă×?~üř1bö.Ú;9I(Ń R,žłwĚ A›6íÝ;xŤ,Á{ 4hÓ M š;hî¦A6 ´iЦ˝‹& Ú3hď)1ö´wĚÁ{ö,Ú;hϢœ$G$H†,{÷¬’$ÎŢA Ţ3hÓž={íŮ»gîÜA 4hď EĂÄ Ţ3hĐÜA›öí5€ĎžA›m4hĐ AÇŹ?~ýřőăׯpüúńă׏?~üúńăÇŹ?~üřŤŽ?~ýö˝ÂÇŹ?~üřńăÇŻ?~üřńă׏?~üúńăÇŹŞ , ţ…ŹąäfŤ»÷ĎŰ­˛.xAL)Y©¸}ËÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńă‡?~üřńűĹŹ?~üřńăÇŻ_ su|HŕŠ_?~üřńăÇŹ?gѦIŁfĚXĽj̦M›&mš4iÓ¦I“Ź’%xҦI“&MÚ4iÓ¦M“&MÚ´iÔ¤M“6mš´iÓ¦M›&mÚ4gѦI›Fí1jÓ¦I“6mÚ4j(Ó±c@ÇŕQ{wŚŮ»iÓ¤I“&Mš´iҦM“6Mš4iÓ I“6Ťš´iÓ¦I“6Mš´iÔ¨y»FÍť4iҤM›6MţÚ4ińřńăÇŹ?~üřńÓÇŹ?~üřńăÇŹ?~üřńăÇŹż~ýřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńë—bAŻđ‘#÷ŹÜ,U©R©ĘŐDV-Ř!ÇŹß=oőęŐ«WŻ^˝zőęŐ«WŻ^˝zőęŐ«WŻ^˝zőęŐ«WŻ^˝zőęů«WŻ^˝zőęŐ«WŻ^˝zőęŐ7ŻŢµn©¶ů«WŻ^˝zőęŐł×nÝşuíÖ­[·®ÝşuëÖ­[·nÝşuëÖY[¶nÝşuëÖ­[·ŕşuëÖ­[·nÝşuëÖ­[×nÝşuëÖ­[·®ÝşţuëÖµS·nÝşuëÖ­[·n]˛eëf©Š)Ü:uëÚµ[·nÝşuëÖ­[×n]»uëÖ­[·nÝşuëÖ­[·nÝşvëÖ­[·n];lŘÚ­[·nÝşuëÖ­[·n]˝zőęŐ«WŻ^˝zőęŐ«WŻ^˝zőęŐ«WŻ^˝zőęŐ«WŻ^˝zőęŐ«WŻ^˝zőęŐ«WŻ^˝zőęŐ«WŻ^˝zőęŐ«WŻ^={ţR…˘ľr˙Č‘“µÍ›·\·4ČÂ`˘Ĺ81ĺřń»çŤŢĽyóćÍ›7oŢr˙ţ‘Ű•kś·[łśČĘ ˘…¸\¸páę¶ę?~üřńăÇŹ?~üřńăÇŹ?~üřńă׏?~üřńăÇĎÖüřńÇî?~ýřńăÇŻżWţ ¶$ř!A~üřńCW‹?~ü1{-ž$"Śů ćŚŮ»wÄžM6 Z/–â=› ´iĐ MćZ´iÓ¦A›6 Ú4hÓ¦ą Ú3x’rô‚÷ Ú;fĆŕE‹6 ´wĐśuQ"gČ!@M{6MŽgcVŚÚ4hĐ Mm´i§M› Ú4hÓžSâlÚ3hĐÜAŁĆí$¨ĂŻż~\îđŰÇŹ#fÓŢ 32d ĚQ‚WMŇ4hŃŕĹÚDÎ;hϦM 4wÓ Mmš;hÓ M-´iÓ ={Ç̀æ=öÎX±wĐâ1#6íYŚ 2d@”â-’ݱi”~‘m´iϦM›6 Ú4hĐ Aö.š4wĐâUęő.š»iĎŕňĂţĽgĐžY*ŻY/9•ŕsfɇ‘!C† ůŃ ž%FT›íÝ1:ŐŢE‹6mÚ´iď–áčÚ3wĚĹb łiÓžMŤÚ·kÔ ˝& Ú4hÓ˘A竿~üřńăÇoË‚żřőă—Żş|ująâÇŹ?~µôńc‘@ ż~üĐai°…_?~üřńă×?~üřő»W®?|°Ŕńăwç* 4Hđ ą˙ţí:Ĺ*Ő¨YNd]ŃÂ.a„u[Ž?~üřńăÇŹ?~üřńăÇŹ?~üřők€Š_?~üřőëÇ üřńC‡`Kż,,řĆoK‚ţ 4hĐ A~üîŐů`çW«W‘|řrŹQ#F† ˘ŁR€Ä‚ ^Ż$Ħ1 ˘#$˝KdfĎžA«”ä±hńU‚÷ĚŁ ˝ŕM‹ön%#r†©/š»hÓ Qűv 4hď¦M{íŮ´hđ(Íá׏?~üî0h°ŕ?}®^!Čg űřőëwďŽ9~ €řĹŹź­ ęôëÇŹ?~żĆ˝â§Ź8XX^Ůá×ďD~řP°Đ’ A ţjĺ+Gî9U˛¶iS–WD´‡‹[2\Ý`}ăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~č âÇŹ?~üX0XŔ‚ż|XĚA‡ AŕřIhĐ  $¨Ăď:î´Ň‚ĄŹ^đŢIňadČ$H|Äzg¤z«4-If±,IĘѨ%I?‚ô‚G,Z$°Ĺ;Z°€XŔŕĂ |Ż|HP§\ż{żîŔbQk ,Ŕ4ř€Ŕż2¶¤€Đ A |HP _ą˙Č­sO]Md]ŃB.n¸’u[Ž_?~üřńă·O0~üřőă‡._ż~üř˝Bbß+~ůĘmY~ß@0X€…Ĺ‚ Ô˛“ Aţ 4h¸ $…—AbIb¤Č!C†á©:Ś’2dH9đ†9{ ´iÓŢM“o1g̦ cŹQ‹ś)‘ô®˘!A1óÉŹbŤ‚ Ҩś H† 2d”ă1dŹ^ÄE“¤‘$#@Ś$‘ÓHŽ˝â5˛ôLN$CŚřčoZ4fĐŢ[ĄŤš;xÄ*ëíݱeĹrśČת•˛_®„,hśą!4řU‡„ŔôÝy•Ä– 0` ď ęüB÷ĘVť)^-h° EŘá7Á– 4hĐ€Aţ dá#÷ŹąUL0©`k†¬ "Z»† ®nŻîôă·Ź?~ü^髬_ż}üěŚç 8 XĽšĂOŮ 0X€Î‚ ´¤XĐ ‚;u4`Đ Aŕ—B*°,`đŚşě2dČ#>(ő˘HŽŹ!C† ҆±^Ńž=Ł6íłh§13†©±xĆśĹSdH—hCşŔŁôIFÎdŘ‘!H|,ędČ!C† 1‚Ä%_> áQ‰‘hr€2ÄČ!A’ $–4%Ś,ů@2d’ •¦‹Öë],ńˇA öÁJđaAŠW\jÍi° –4hĐB‚;ůR,ń 4hĐ`A-|äţý»gj©OOdA‘•AD qżpmĂŐÍ~ýěčă׏_ť_wNčű…ŞtćNŔŞ…ŕC `©ŘŇ A îŮIĐ€ @@©‚ 4hĐ A€vĚ%hĐ€ , @ B„˘$D 2ÄŹJ˝ A2dČ!C€téU ŁJď¨A“+Ú;c±-’ô¬%h]€ů1i‰"bH ńţÁX!CH’ÄF”|2dČ!C†ŕ ÄČ’!D)AÂL $C† 2d#F~TŞ´‘¤ F† 2„Qł^ņ1cvI §FŚŢɡSěH/x±ŚóÁŕĵę,€Đ Apŕ4`b  ´J±€A 4hĐ8 0ëĂ 4hŔ€A 4@p§U 4`Đ A $¨…ŹÜżĺnٲl7 ˛2h!W2\Éş­Jń –|üřńcˇ Ŕ÷ZaąłŕŽąu^!hŔ Á‚-R0hĐ€ÁtX4`Ŕ€A ¤Á ţA 0‘ŔŽ«!0Ń€C )2 ’!FůQ©×"HŚ1b %”&QÂY1xĆ0IrFiŇ9F†1’C©Č!C† A‚d$DYň1dFJ€!Â(V%C 12Ä’”$A‚„$$J†1bdČ"F AbÉŹ^’€tA‚I#C†aԫעIr]‰ŇFR1E@-±ôLޤ^>0`°`KŠ 4HđÍÜ‚ >lYĐ A 4hĐ A €°Ĺ A ^P‚A 0`Ŕ€A PŐIĐ` 0hĐ Aţ jĺ#÷ď߸räĘŤ÷«‰¬ "ZĂ%L®nŞVüúrO.~®H‰p"_ HČA$HpB‚‚$pđČAi 8xŕŕ8,É!çČ)Qrtv]ţĺŕ$Ç $Hđŕ j•QP‚„eHđ@‚„Hx álIxđŕÁ )@x á„$Hđ@<]Hđ@Â"Dx Á¬|äČý7n[.\łj9‘•AD qׄ%ĂŐm- €p°K RŔZĐ€ @áŔA4€ĐŔA`AhˇA 4h 8`ŕ A 4pĐ  ! D†B$9A†2d!D‚a4dH%˝ä(i¤’ś!@†ňCŽ’ @†B„ C€ţI˛č A† „ C€Bd C€d!C‚(©äc!@€!2Č!>Éč @€ d A† dŠtń2„ C€ńáŔ 8hŕB‚Z'4hA4hŕ A 4pŔ,4p 8hŕ 4H K4pĐ A $x…Ź9răĆqűćíÖ- ˛2há —°d¸şąbŔ  4`Đ A 4hĐ€A 4hĐ€ 4h°ŕĂ 4hĐ A 4hĐţ A 4hĐ  4hĐ€Á‡!H† ‚dČ!C ‚Ä‘!C† A2d’!H† ‚  @†2dČ!F† 2dČ!C† 2dČ!HŚ‚É!C† 2dČ#C† 2ÄČ!C† ‚dČ!F”2dČ#CŚ2dHEr€ A‚dČ!C† 2ÄČ!FŠX™R$I’!C† bdČ$>0Á  0hP§A ,hĐ A 4hĐ€ @8Á A 4hĐ A 4hĐ A T`YĐ A 4hĐ€Aţ˛đ‘űwŻÜ¸m¦hĺ˛ĺDÖ-Äá& 7Y 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4řŔ A 4hĐ A 4hĐ A 4hĐ A 01dČ!C† 2dČ!C2dČ!C† 2dČ!C† 2É!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2É!C† 2dČ!C† 2dČ!C†A‚ $H† 2dČ!C† 2dH‘)^Š2dČ!ţC† ‚Ä 4hĐ A >4hĐ A 0hĐ  4hĐ A 4hĐ A 4`Đ A 4hĐ A ! 4hĐ A 4€° >r˙îŤÇMŐ­[şśěş ˘…¸\É„áňćŠA 4hĐ A 4hĐ A 4hŔ A 4hĐ A4hĐ A 4hĐ A 4hĐ A 4hĐ A >2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C†ţ 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ#H€2dČ!C† 2dČ!C† )2ĹK‘!C† 2dČ!Cř`Đ A 4hĐ A 4hĐ A 4hĐ€A 4hĐŔA 4hĐ  4hĐ A 4h° A 4hŔ A ĽÂGîßżrăľ}ëvë– €».há —°d¸şíbĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hţĐ A 4hĐ A 4`Đ€„!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2d$H€ 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!E¦x)bdČ!C† 2d 4hĐ A 4hĐ A 8hĐ  4hĐ A 4hĐ Ŕ 4hĐ A 4hĐ A4hĐ A 4hĐ ţAµň•ű÷oܸm·pÍŞĺDÖ-ÄᆠW·] 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hŔ A 4hĐ A 4hĐ A 4hĐ A 0ř0dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† AÄ’!C† 2dČ!C† 2dČ!C† 2dČ!C† b¤Č/DŚ 2ŕţ!C† ‚ÄG 4hĐ A 4hŔ  4hĐ A 4hŔ A 4hĐ A 4hĐ€A 0hĐ A 4hŔ  0€ >räţ•ă6‹Ö,Yż4ČĘ ˘…¸\„ ăćŞA 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 0hĐ A 4hĐ A 4hĐ A! 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!Cţ† 2dČ!C† 2dČ!C† 2dČ!C† pČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† )2ĹK#C† 2dČ#FřhĐ A 4`Đ A 4`Đ A 4hĐ  4hĐ A4hĐ A 4hĐ A 4hĐ A 4hĐ A ÔÂGŽÜżr¸¸qăĆÍ›YD´‡ W2aÝT1hĐ A 4hŕ  4hĐ A 4hĐ A 4hĐ A 4hŔ  4ţhĐ A4hĐ A 4hĐÂ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 8dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!E¨L)bdČ!C† 2Ä 4hŔ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐŔA 4`Đ€A 4hĐ A 4hĐţB‚ZöČýűGN7aÜpuÓ ë‚â®qĂ…ë›+ 4hĐ A 4`Đ€A 4hŕ A 4hĐ A 4hĐ A 4`Đ A 4hŔ A lĐ A 4h€dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2¤Č/E† 2dČţ!C† AâŁA 4hŔ  4hĐ A 4hŔ A 4hĐ A 4pĐ A 0hĐ A 4hĐ  4hĐ A 4`P 9r˙ĘáJ&L®od]ŃBÜ/n¸pu“Ĺ  4`Đ A 6hĐ€A 4hĐ A 8hĐ A 4hĐ A 4`Đ€A 4hĐ A 8hĐ A!12dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!ţC† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C†™âĄČ!C† 2dČ H|4hĐ A 4hĐ A 4hĐ A 4hĐ A 0hĐ A 4hĐ A4hĐ A 4hĐ A4hĐ A ĐÂGîßżr¸„ Ă…«›YD´‡ .\Ýv5hĐ A 8hŔ A 4hĐ A 4hĐ A 4hĐŔA 4hŔ A ţ4hĐ A 4hĐ A 4hĐŕĂ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ"S¦2dČ!C A‰Ź 4hĐ  4hĐ A€ 4hĐ A 4hĐŔA 4hŔ A 4`Đ A 4hĐ  4hĐ A 4hţĐ Á‚WřĘýűWn[2aÉpqÓ ‹âpm†ë›+ 4hĐ A 4hĐ A 4`Đ A 0hĐ A 4hĐ A 4hĐ A 4`Đ A 0hĐ A @bdČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dŔ!C† 2dČ!C† b¤Č/E† 2dţČ H€ AâŁA 4hĐ A 8`Ŕ A 4`ĐŔA 4`Đ A 4hĐ A 4hĐ A 4hĐ A 4`Đ€A 4HP ą˙ĘáÂ%ě®ndeŃB®dÜpu“Ĺ A 4hĐ€A 4hĐ  4hĐ A 4hĐ A 0hĐ€A 4hĐ  4hĐ A 4hĐ ÁC† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČţ!C† 2ŕ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C€ ™âĄ#C†   C|0hĐ  4hĐ A 4hĐ  4hĐ  4hĐ A 4`Đ A 4hĐ A 4hĐ A 4hĐ€A jáű‡îąmÂp%ÖM¬ "ZĂ%ěš°o®4hĐ A 4hĐ€A 4hĐ A 4`Đ A 4hĐ A 4hĐ€A ţ4hŕ A 4`Đ A 4hĐ`Č!C† 2dČ!C† pČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ"SĽ1dČ!C‚ Ź 4`Đ A 0hĐ A 0hĐ A 4hĐ A 4hĐ€A 4hĐ A 4hĐ A 0hĐ A4ţhĐ -|ĺţý+—KX2\¸şiĹAD qą’ ĂŐM 4hĐ A 4hĐ A 4hĐ€A 4hĐ A 4Ř€A 4hĐ A 4hĐ  4hĐ A |2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† RdŠ—"FŚ 2ţd$FŚ ńŃ A 4hĐ  4hĐ A 4hĐ A 8hŔ A 4pĐ€ 4hĐ A 4hĐ  4hĐ A ,¨…Źąĺ¶%&ěÚ7 ˛.ŃB\®dÂpqsĹ A 4hĐ A 4hĐ A 4hĐ A 4hŔŔA 4hĐ A 4hĐ A 4hĐ A 4hĐ Á‚E† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČţ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!CŠL™RdČ!C† 1b$>4hĐŔA0hĐ A 4`Đ A 4pŔ A 4hŔ A 6hĐ A 4hĐ A 8hŔ A 4hĐ A ^á#÷Ź\9\„áÂőM¬ "ZxĂ%L®n»4hĐ  4hĐ A 4hĐ€A 4hĐ A 4hĐ A 4hĐ Aţ 4`Đ A 0hĐ A 4`đaČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2ÄH‘)^Š2dČ!‡ 2dŹ 4hĐ A 4hĐ A 4hĐ A 0hĐ A 4hŕ A 4`Đ A 4hĐ A 4hĐ A ţ4`Đ`A-|äČý+w 7\¸ľi•AD q¸p ĂŐmׂ 0hĐ A 4hĐ A 4hĐ  4hĐ A 4hĐ A 4`Đ A 4hĐ A 4hĐ A 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ€C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dĘ”"F† ţ2dČ!C† ńÁ€A 0hŔ A 4`Đ€A 4hĐ€A4hĐ A 4hĐ A 4hĐ€A 4`Đ A 0hĐ A $¨…Źąĺ„áÚĆ 7 ˛.h!7\¸ľąbĐ A 4`Đ A 4hĐ A 4hĐ  4`Đ A 4hĐ A 4pĐ A 4hŔ A 4hĐ€Á‡!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dŔ!C† 2dČ!C† 2dţČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!CŠLńR’!C† 2dČ$B4hŔ A 4hĐ A0hŔ A 4hĐ A 4hŔ  4hĐ A 4hĐ A 4hĐ A 8hĐ AŻđ‘ű÷Żś0a¸’áę¦-ÄĺâĆ W7W 4hĐ A 4hĐ A 4hĐ A 0hĐ A 4hĐ A 4pĐ Aţ 4hĐ A4hĐ  4hĐ`Č!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† dH‘)^Š2dČ!C† ‚Ä 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4`Đ A 4hĐ A 4hĐ A ţ4h° ľr˙ţ•– —0\Ý4Čş ˘…¸kÜpáú&‹A 4hĐ  4h°A 4hĐ A 8hĐ A 4hĐ€A 4hĐ A 4hĐ A 4hĐ A 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† )2ĹK#@†ţAdČ!CřXĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4`Đ A 4hĐ A 4hĐ A 4Ř A $x…ŻÜżĺ¶%&LX7 ˛2h!î7\¸şąbĐ A 0hĐ A 4hŔ A 4hĐ A 8hĐ A 4hĐ A 4hĐ A 4hĐ  4hĐ A!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2ţdČ!C€ 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!E¦x)bÄ#C 2d 4hĐ A 4hĐ A lĐ A 4hĐ A4`Đ A 4hŔ A 4hĐ A 4hĐ A 4`Đ A´đ‘ű÷oś0n¸„áú¶AÖ-Äáâ†KX7W @hĐ A 4hĐŔA 4hĐ A 0hŔ A 4hŔ A 4hĐ Aţ 4hĐ A 4hĐ A 4€0dČ!C† 2dČ!@† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2I›!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C2dČ!C† 2ÄH‘)^Š12dČ!C†1‚ÄG 4hĐ A 4hĐ€A 4hĐ A 0hĐ A 4hĐ  0hĐ A 4hĐ A 4pĐ Aţ 4h >r˙Č‘v —0\ß4ČĘ ˘…8\Üp ă&« 4hĐ A T4hĐ A 4hŕ  4hĐ A 4hĐ A0`Đ€A 4hĐŔ 4hĐ A€ 2dČ C† D‰ C† 2dČ!C‚ 2dČ!C† AdČ!C† 2dČ!C† 2dČ!C€$adČ!‡ 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C‚ 2dČ!C† 2dČ!C† )2ĹËŽ$I€ţ 2dČ!HřhĐ A 4hĐ  4hĐ A 4hĐ A 4XBK‚ 4hĐ€A 4hĐ A 4`Ŕ A 0hŔ A ÔÂGîßżq¸’ K†«›YD´‡‹7\Ü\1h â 4`Đ Á 4`Ŕ A 4`Ŕ A 0hđaÎ 4`Đ A 0`Ŕ€A ,Xń 0hŔÂ"H 2dČ!H(RÄ€C† 2dHEm€ IdČ!C4B‚dČ#C1bdČ#H† ţ2dČ Š$ý2dČ!C† 2d#C† A2dČ!C† A2„’!C† 2 ’!C† ‚"%D† 2dČ!C† 12d"E¦xŮѨŃ#F† 12d‘ 4hŔ€A $Đ’bA 4hĐ A 0`Đ  @lYĐ A 4hĐ  0`Ŕ€Av´$hŔ A 4`Đ Á‚ZůČ‘űWN.nÂpqÓ +âpqĂ…«›¬ ¶8pp"@€Â°0pŕŔ@hŕ‚$lYˇ@4pŕ ţ 8pŕŔA ¶śHˇ„ 8€„‘ @B$ČŚé„H @řăH‘Ź"Ś’ !B䇒hH~!D€!$ C!‚%C€ !B A‘ @ ˘(I D~0B„"A 2$‘ @€ř¨¤ D€!B$%A€ Ňf•):äČńA€ÂĂ‚8€ŕ „YV$pÁÁ@€‚4pŕŔÁ‰- @hŕŔA8pŕŔ4€€U@pĐ ţ @H@ _9täĘ ă†K®nd]Ń ¸\Üpqű¶KÁŠT+N•Y±âAň­đŕ„2 0`Ń — 4Á 4H V‚ ¤Á A)>0`Đ A $°c'A ć€XŔŕC$H†1b‰‘!H|ôbäcČ!Š AB¤ 1b<UşÔË’âIb„H#I˝$É2dČ$HţA‚ÄHFĚ€1Ä‘’!FŚ I2 ’!CŚA‚ä%I? "éČ#HŚ A‚ #C AâcX5"DŠ ‚ ĂbiTiQŻ6SĽiôlF>ů„‘ °¨XĐŕC B$g'Ać,hĐ€A9,B0`Đ A >kŔ Á-s4Á€ 4hĐ A‘ě$hŔ€A 4hĐ A‚WöČýűW®mÉ„uÓ +âpá↋-¶řéă׏,`áwÁť-[~Őiu'AuÔŃ’B °|ÁÂ.)4h°ţ` Š 4hĐ€„v\%€Đ`Á @B¤Č!@† dŹ^Ă|2DŇ!C€(&­‹1gŃśIšÔĄ×»aJ~čXTÉ’¤E?† 12ÄIG€ńŃ‹Y!C€SdČ$”ä2dČ!CŚŕ äȇ$@L$Č!C† 2Č"C†řƬHŁ!Iş)2ÄÇ0LH,ŁÔěŇ•)mESbDŹ^ÎpôRâD-,ÔÁ˘„ŕ\%hŔŕĂ ,Řë– 4hĐ Á[ 4@pçW 0řˇÁ‚ 4řŕN- 4`Đ Aţ 4X@ ą˙Ę ă†ëÚŻod]ńBś0n¸¸uső«?~üřő…NŇsüě řëWż_żP%hŕ‹;¶”±XĐ` ~Z4X€EĹ‚ l9±  4h°Ŕ8 ,¨bA;şt2dČ!C(ŃQ)Ú!C€H2d9Ôśe‚çî]´aŇő˘6ŤŽ$9Ž2cÖ‹ I,)ÁÁhZ F|sdČ ˝%2dȰFAŚ 2dČ!>(1úaÄIF’0bdČ!C†$I2Äâɉ%§Q# C†đ0V©M´hĹ–a’⥑¤iţĆ$1Ęaě™%btr€čwĎÎťW[X$h°ŕ›ą |(ł…AsĘµšł€  0€đ  ęÜCŔxZ-HÁ€A ÜÉbA 4hĐ  já#GîŢ8aÜ’ ÖM¬ "Z»¶-®n«”ńëÇŹ?~üňµâ˛Ź_«-ýĚ•ă×_«¶đ«ŐŠ_>`[,`ÁŻ ęŕAđˇÁ-'4hĐ A!Ř)Ç„QÝqŔŕC‘b‹|2dH‘!±€ÄŠ6d‘˝äDλiϦAmµbĚÜ˝#F¬WŻgď˘ĹŁd1JC(ţÁ3fÄŹ^ń䤗$9@†©ÖhČ!C† ‚ÄĄJ<Ś ‚INbAş٤hHEŤ|ňŁ×4JĚIRô ˝I‚ď±hS°aęőÎٰ^@zĹkćËXŽ;üřպǯ–Š!€— A°ę0h` ż_®>,€ubA~ŐY!A~[¶ @€§ß/[>0hĐB‚;ü 0hĐ A 4hĐ`Á+|äČý+· ®d¸ľm•AD oąp KÖÍ8~üřńăÇŹßľoŻřńă®?€üřőă׏–_üúéă·Źßť Xđű‚A‚-Ŕ@,€ţ° ŽŠ 4hŔ AuúŮ‚ A$| R42­×!C† R„’Jφd C‚ȡöŚÚ´iĐŢM{oÚ3wĐŢ˝‹öěÝ3x’r(©Ö‹3hď Ň+žś F€ë%Č!ĚŠ- bdČ!C†ř°ä Č#:bI’3,ČhÎz-Â!©‘śErpřzWě]ŻEt‚ AňŁRĽhϦ9cF­ÖµLŐâ1ëŻWŻxĹĹň‹?`řřˇS‘Bpŕ@h°]­há×¶@0`Ŕ ¸: $ĂO–:"ńÇ厝;4Hp‡— 4hĐ ţŔ 4XP _9r˙Ęáµ —°nd]ŃBÜŻm¸pusŽ?~üřńăÇoß7~üřńăÇŹ?~ýřˇŞÓŹ?~üúńsŐ` ~űN4H°ĺ €3·eA 4€ ?puZ¸ĂŹĹFŞcôcČ!C€ô2+ZE‹pô’ 9Ď ={6 ÚłwĐ M{6 Ú4hÓ¦A{/Vbďš˝›-ž¤AzĹ“‰ŹbÎ$ýŇč(Á{6ÍÝ4hď A›6í´iÓ A› Ú;fĨA6 ´w˝€#AŸ,ŹFďâ óAdQ— C†!Ź!CśMöL’’hÓ Ák4)Ţ3hŐś˝“& ´wÎ, I‚¤Ú´gÓ¦AFíŰ5xϦ={6 ´gÓ MkÖŹ?~üřńĂ÷A‚_üĘ©ř°Ŕż; lá׏?Tčî$€` ?~u$¨ĂOß+~e”ńăÇŹ_?~­|@`‡_?})ę€[‘ţ A ,¨…ďßżĺ„qĂ… W· ˛2h!7aÂĽąúĆŹ?~üřńăÇŹ?~üřńăÇŹ?~üîýâÇŹ?~üřń«@ż~üľ%ŘÂŻżVŔńă‡çÇ_ 4HP‡_?~üĐ˝â§O‹$Ѧ˝ł”CRŻ@M›FŤ%x˝–|' ÉJđž={6m4hÓ A{ćnÚ3hÓ¦A&-Z´wÓ = Ú3% ăÇŻsřőËÇŻU9~üřńăÇŻ¸VĺĐńăÇď›>~ű„$hĐ AŻđ•#wŻ7nÜpqű¦AÖ-Ä]Ă…+7WßřńăÇŹ?~üřńăÇŹ?~üřńăÇŹż~üřńăÇŹ_?~żláÇŹľZňëÇťpüúń+Ăŕ×”á׏ż}µřńăL3jÓ–±DMbđ =ëíĽwŃšSd)ŢłiďžM6 ÚłiÓ¦M›6 ÚłiĐ ˝{6íŮ»gţÓÜM{·‡3jĐŕĂQě´wŐś˝ Ţ’I–|A¤Ř»wŤpqöîŮ´i•˘M›6íÝ´wÓ =“ölÚ´gÓ¦˝{÷Ž’’jďÜ={6 µnרą6 Ú´gЦ={ ?~üřńă׏*'řńëÇŻU ~üöÝ㇎?~üřőăW }üřŐ˛µb ?~üřńăÇŹ?~üřńăÇŹ?~üřńă׏_ľW 0h°€>rä‹.\Ý6Čş ˘Ĺ¸RżŁK8~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ_?-µřőëÇo ~ýřţń÷Ť_?~ć S1@XüúńăÇo?~üřĹŠ6íŮ»I’â‹ĺě´gŃŢ=s7mš»xŚ$Ĺ{ćîŮłgď MÍÝłiĎ E{m4hďžM{ćnZ4hďŞ-˛6íŮ»frŚÁ{öěÝ´gĐžÁëÂČŽ @‚çŽX—EΦM{6Íť»gĎž={7 ´gĐžM{÷ěŮ4hĎ =+ÖěÝ´iĎžA“ÖíĽgĎž˝{6 Ú´gî ąăÇŹ?~üřńă÷ëż~üřýÂÂŹż~üřńăÇŹ?~üöm±ĹŻż}ü`ýâ׏?€üřńăÇŹ?~ýřńëÇŹ?~ýúńăţÇo_­! $x…Ż9rĺ„qĂĹ ×7 ˛2hQ 9~üîŤăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńűĆŹ?~ýúńăÇŹß+}ŕî´ĘŽ?~üřńăÇŹ?xÓ¤˝›-Ú4jđ¦IŁ6 š4xÔ¨M›6Ť1xÔ¨M“Ź5jÓ¤Q{G Ţ4iҤMŁFmÚ´iŇ M›6 őüůóçĎź?őÚµk×®]»gëÖµk×®];kíÚµk×®];kËÚµk×®]»víÚ­k×®]»víÚµł°]»víÚµk׮ݺuÖÜÉkg­ÝşvÖ¬µkg­]»víÖµ[¶LžĄH -k×n];yĎÖY[÷¬]»víÚµk×®Ý:kíÚµk×®]»víÚµk×n]»víÚµkw Ű´uíÚ­kg­]»víÚµóçĎź?ţüůóçĎź?ţüů#çĎź?ţüůóçĎź?ţüíóçĎź?ţüůóçĎź?ţüůóçĎź?ţüůóçĎź?ţüůţó篟« ÔÂGîßżrɸá↫›YD´—‹9r˙ĆńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńăÇŹ?~üřńűŐŹ?~ü€máÇŹż~ýřńă÷ D>; hĹŹ?~üřńČŹżhҤMGÉ\řőëÇĎŐ/~ýř˝BO ¶đëÇŹ_?tüřńă'‰Ů4wË’H"Vi1xĐ A;í´hďŚý/4hĐ AsmÚłiЦA6 š»iҦą‹6 šţ´iϤų„ŁÚ;hđů(ďYĽhĚŢAÖL‰$K> RěÝłit|8{÷ łbďžM Ú´gÓ¦M{mÚ´iÓ ÁcĆlłwĎ MŤš¶kÔ Mö 4hϦAöŽ?~üřńăÇĎ;üúőă÷*Á8~ýřéĹŹ?~ýúń{5?~üúńË‚Š?~üúńăÇŹ?~üřńăÇŹ?~üřńăׯ?[ 6hŕľräţ•ŰĆ 7\Ý4ČĘ ˘…¸\Ép%ëë?~üřńăÇŹ?~üřńăÇŹ?~üřńë׏?~üřńëÇďüřő«…` ?~ţř¶,ÇŹşl…hĐ A~üřńC‹_?~ü1{ĎQFŚŽ)öÚ;fŤŢEkŻW”ŕAönÚ3iЦM› Ú4hĐÜI 4hÓÜA› ´ir| {7ŤY/Ĩ˝ë%‡µiŃä ‘łčÇ!@˝G)gÓžMcĆ(Ú3hÓŢA6m´gď A6mZ´f’‚$iönÚ;hÓ˘QűvŤÚłiĐ M›6mÚ´iĐŕńăÇŹ?~ýřm˘?~ü´$(Ç/ß>T·đëÇŹ_­}üT$ˇŹ?~ü@lá׏?~üřńăÇŹ?~ýŔíăÇŹ?~ýřţąŞĹďN‚ÔÂGŽÜżr¸¸áâĆí›YD´—‹.\Ý\ă׏?~üřńăÇŹ?~üřńăÇŹ?~÷~ńăÇŹ?~ýřŐAŔ‚?e lá‡ďU‚ŕř™SŕÄś $¨ĂŹ?~ŻîđëÇ"gÓŕIÂ!I ĦE'INä âY±^ďŽ(zW¬3%C~X‚m´iЦM6ÍÝ4hĐ A“mš´iĚŠĹ6 ţ´iďŠůŃ ^49A‚‹')@ tŢĹ“Ä#C† Ň+^Ą CT{Gí™%9ŃÜ˝sg„R&ÁëI_ŐMŁ“$Ú;I–€,"VlłaÄŢA6ŤX, FŚř¨4hÓ QűvŤ4hÓ˘˝ëĹŚ4hĚŠĽâׯż~üX,ř°ŕ?X B,¸g+Á‡ZřőăÇŻÎ/, ,Ŕ ęđŰ·Xť_üú•«ŐJ_ŠÜá—Äś;eţ4hĐ A jŮ#÷ď_9a¸páÂŐm­ "ZĂ…k®n°ľńăÇŹ?~üřńă׏?~üřńăÇŹż9 PńűĹOźľ|X,PÁŻU‚ ¸Ôb°Aŕř`Đ A $¨ĂŹş îÔÚ’Ącńb)‚d–Q‚öŁQµ$˝äDδjѦA› Ú´gÓžImš»iďŢMŁd¤ĽiŃŠM‹'ÉÇcŃčA„X5%@ YV)É$C† Abć%jE€ ÁыآhJ’Dk¦$’ ”c¦¤ĽhҦĂÄ•ŕAö š;iÜ®Áţöî]ĄwĆšÁcVěX ü~}ăÇĎ‹üâwbAůl%ř` ż~üĘq‚ ö˝Bđ!Á~Ż^Őa‘ÂN-<ŻęÔiĐ A;üę Ř‚A 4hĐ Á+|äČÝ+ÇŤ7n¸ľiuAD qą¸](ě›+WüřńăÇŹ?~űjýâÇŹ_żWčř•Ó‡nATü\őű,W‚ XđòŕĂ,w0€°ŕŽ9 4hĐ „uřýjőA+- ¸0đŃ‹Ř"%@€ 2$ÉŹ^Ď|,j”Ă— F€ČˇfŚŮ2hЦ=›6íŮ4bÄz9cŤY1xrxH*ţŤ¤wĐ$ b‰#C€ kdČ!ÎA2dČ!Cř°4- $>z[Ô ś^@ 2$I%L‹|ô‚ÇĚXĽJŚ 1¤W0hŔ\«!lA‡JŮ–[N,hĐ€ľW >$¨ĂOK >Äň ˇ4‘Ŕż: >|hĐ A @XP 9räĘqĂĹM®nMd]ŃB.nÜ„%ŁeGż~ýřńăÇŻ,;üĚ3W§żWĘ^%HĐĘÖ}ZîlYĐ€~Y4XŔ%Ĺţ‚ lQ± A 4hŔŽą,$hµ%A>0Éů1dČ!C† ńAÉŘ#I~PRÄ9ń-Şô´iϢA‹6¬—$I˝zŃéŻŃ$r5Râ®X# A92Ic] 2„XŁC† 2d–Ţ%‚DG,JŚz‘ăË’!CřX$'Ź^ńbë…„!F|ôz홳iĹ2Iáä¨3K‹ŕůrVŚła9˘ČgçN-[Z4‘¸ 0ř……AXđhyb  4` ďU‚ °Ô‚ )P-h° Aŕá·%Aţ 4`Đ A ^á#Gî^ą\ܸáÂŐm†¬ "ZűµM°o®Těăě?~ý~ĺSˇ_9; €wçU- >hňŠA  0`đ+Ĺ‚ @|`Ŕ€A‚-(4hĐ Ř—ŕC­¶$h!¤$C€ 2dČ!A(a: C† Ňĺ±’(W-ZŻhÓYň‘D%Eľ¦!!b„‡¤.>Q22äŁX?†AbÉČ!@XRÉ C† ÂR±CřŔÔHN/ “Xd!@” âŁW49”ů@d˝ŢÁŁ$ž¤6VĽţ8ęŐ‹R9Ś|1ŇËQްR ¨óëÄ‚€— D® 0h°‹,N0`Ŕ AľmY‚X)@@h° …– 4hĐ A‚;ů@,hĐ A 4hĐ`Á+|ĺţÝ+· 7a¸¸­uAD qąp ĂŐÍZµîüBÇŹß– @컳eÁ‡VµÔy•B R„XŔ A ~}`Ŕ  „X  4hĐ D;ż4h`‹– BY„ $H† A‚$Ą^IŚ A‚Ä#@Ú#D ^ń «¤š1IA†‘#GR%€A Aţ‚É9I€ !r‰$H 2É$’A‚ $HŚř $é‡$>z)JBŚ9H A‚É!F‚ô˘$I$H 1âcŘ0_Ś€ôZ¤ĂĘ”"‹É bÄ1g@$ÉÉ sî4`Đ Apć4hđa  hI±€ 4hŔŕ- ,H±e @@Á A 4Hp§ 4hĐ  ,¨…ŹÜżĺpqĂ• 7'˛2há .n¸şíb°"ˉ,wĆŐ’ŕŔÁ‰+˛@HĹŐ,«@€ Ŕ@p‚- 8ŕţ8x‚H@€§śXˇŔ@?ü„ČŹ?üŔ1IR A~üřńČ%Śý‚5b‹ˇV ‰"?~üŕ‘D~üâă"9YĘA„ČŹ?~ůa„"?‚ „‘–ĺBĄ.K&á ‚ČŹ?~!ÂŽ^Šxü„ČŹ A‚Ä#F A‚„Č#FŚ 2dČ!CŽ AbÄ:]Ž A‚„’!FŚ1bd$C ţ1bdČ!FŚ Q‘!F†A‚É!C† A‚Ä#F0Rbd$FŽ ‚d#HŚ1bÄ#@)2dČ!C† 1bÄ#F )bĹËEŤ| 1b ’!C’ř`Ŕ€ 0`Ŕ`Á+ 0`Ŕ€A 0Ř€ 0`ŔÄ 0h°€A 0`Đ€A 4H`gK 4hŔ€A ,¨…Źą{ĺ„%Ć W7 ˛.h!7a¸şíjĐ A 8`Ŕ A 4hĐ A 4hĐ A 0hŔŕC– 4hĐţ A 4hĐ A 4hĐ A 4hĐ „!C†2dČ!C† !2dČ!C† 2dČ!C† Bd"D,"2dČ!C† 2dČ!C† 2dČ!CŚ 2dČ!C† 2dČ!C† 2dHFJ‚ 2d‘!C† 2dČ!C† b$H#9@† 2dČ!C†2dČ!CŠXń˛É‘!C† 2d#>4hĐ A 8h€ĄA 0hĐ A 4`Đ€A €Ŕ˛ A 4hĐ A 0hĐ A RpIĐ€Aţ 4hĐ AŻđ‘#G®ś°kÂ’qă¦AV-Ä]ăĆ-7Y 4hĐ A 4hĐ A 4hĐ A 4hĐ  4hĐ A 4hĐ A 4hĐ A 4hĐ A ,hPÉ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C2dČ!C† A2DΑ!C† 2dČ!C† 2dČ!C† ˛HQ!C† 2dČ!C† 2dH‘)ţSŠ 2dČ!C† 2Ä 4hĐ  4hĐ A 4hĐŔA 4hĐ A 0hĐ A4hĐ A 4hĐ€ 4hĐ A 4h Vľräî•ۆ‹.\ß6Čş ˘…¸_ÉpqëöŠA 4hĐ A 4`Đ€A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A† 2dČ!C† 2dČ!C† 2dČ!‡ 2dČ!C† 2dČ!C† 2dČ!C†ţ 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C†2dČ!C† 2dČ!C† 2dČ!@ä(2dČ!C† 2dČ!C† )bĹK‘!C† 2dČ!Cř`Đ A 4hĐ A 4hĐ A 4hĐ  4hĐ A 4hŔ A 4hŔ A 0`Đ A 4hĐ AÔÂGŽąq¸áâ†ë›YD´‡ ®dÝv1hĐ A 4hĐ A 4hĐ A 4pĐ  4hĐ A 4hţĐ A€ 4`Đ€ 0hĐ A 4hĐ A!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!E† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!E¦x)2dČ!C† 2d‘ 4hĐ A 4hĐ A 0hĐ A 4hĐ  4`Đ A 4`Đ A 4hŔ A 4hĐ ţA 4`Đ A‚ZřČýűW.Ů6nÉpuÓ +âpm†‹@W 4hĐ A 4hĐ  4hĐ  4hĐ A 4hĐ A 4hŔ  4hĐ A 4hĐ A 4ř0dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2¤Čţ/E† 2dČ!C† 1âŁA 4hĐ A 0hĐ A 4hĐ€A 0hĐ A 4hĐ A 4hĐ` 4hĐ A 4hĐ A 4€€>rä 7\Ý4Čş ˘…8\ܸáę&‹A 4hĐ  4hĐ A 4hŔ A 4hĐ A 4hĐ A 4hĐ€A 0hĐ A 4hĐ A€ 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!Cţ† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C†™âĄ!C† 2dČ!F€0h°A 4hĐ A 0hĐ A 4hĐ A 4pĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A ĽşW®ą[×páâ†ë›YD´‡‹.\Ý\1hĐ A 4hĐ A 4hĐ A 4hŔ A 0hĐ A 4ţhĐ A 4hĐ A 4hŔ A 4hĐÂ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 8dČ!C† 2dČ!C† 2dČ!C† 2dČ!E¦x)dČ!C† 2d‘ 4hĐ A 4`Đ A 4`Đ A 4hĐ A 4hĐ A 4hĐ A 4`Đ A 0hĐţ A 4hĐ AW˙ČÝ&W2nÜp}Ó ë‚ârqĂ…ë›, 4hĐ  4hĐ A 4hĐ A 4hĐŔA 4hĐ A 4hĐ A 4hĐ A 4hĐ A „2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C†2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 1b¤Čţ/EŚ 2dČ!CŚ AâA 4hĐ A 4hĐ A 4hĐ A 0hĐ€A 4hĐ A 4hĐ A 4hĐ A 4hĐ A @HPk›)˛ŔäâĆ ®nd]ŃB\.\ÜpusĹ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ ÁE2dČ#C† 2dČ!C† ‚dČ!C† 2dČ!C† 2dČ!C† 2dČ!ţC† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2ÄČ!C† bdČ!C† 12dČ F†™âĄ‘!C† 2d#H|4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A 4hĐ A \•ŁBEX\ÜpqĂŐM¬ &ZË…k®n»0`Đ A 4hĐ A 4hĐ A4hĐ A 4`Đ A ţ4hŔ A 4hĐ A 4hĐ A 4hĐ Á$C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ"C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† 2dČ!C† bdČ"SĽ2dČ!C† 2‰Ź 4hĐ  4`Đ A 4hĐ A 4pĐ A 4hŔ A 4hĐ A 4hĐ  0hţĐ  0hĐ A-€˙Ä•óW2aÂp}Ű ë‚ŢpqăĆÍ­ 4hĐ A 0`Đ€A 4hĐ  0hĐ A 0hŔ A 4hĐ A 4hĐ A 4hĐ A |BÉ!C† !2dČ!C† 2dČ"C† 2dČ!C† )2dČ"E† 2dČ!CŠ !2dČ!C† 2dČ!C† !‚¤Č!C† 2dČ$D† 2dČ!CŠ 2dČ$C† !2dČ!CŠ 2dČ"C† 2¤Č!C€ )RÄţĘ”"C† 2dČ"C†ńŃ€A 4hĐ  0hŔ A 4hĐ€Ŕ 4`Đ  4hĐ A 4hŔ A 0`Đ A 4hĐ  0`P†“1b¨ŕ& ®nd]0ńÂ^ąrĺĘ•Ăs‹®o©đxKĆ-Y2nÉ’}ăö-ŮŻoܸýâö-Ů·dß’qűĆ-™2nÜ”qSĆŤ·dÉ’%S–Ś·dɸ)SĆŤ·dɸ)K–LY2eßľ}űöíŰ·oßľ}SNŮ7eßľ}űćíŰ·oßľ}SöMŮ·o߼}űöíŰ·oßľ}űöíŰ·ţoŢĽ}űöíŰ·oßľ}űÎŰ·oßľ}űöíŰ·oßľ)űöíŰ·oßľ}űöí›·oßľ}űöíŰ·oßľ}Sö-ś˛oßľ}űćíŰ·oßľyűö  ·o߼}óÖíŰ·oßľ}űćÍŰ7oŢľ)KöŤ[˛dܸýâö-7nß”qăĆ-·oÜ~qűöŤ[˛dܸýâö-™2n߸qűĹí7nܸýâ¦ě·oܸ}ăĆM·oÜ~qű•ë®o¦ĘČJĄj•,nÂ’qĂőM¬ "^Řă†ËJ.n_ĆŤËĹmUŞ~÷îÝ»—ďŢ˝{÷îÝ»wď^>|÷îÝ»wďŢ˝{÷îÝ»w/ß˝{÷ţîÝ»wďľ{÷îÝËwďŢ˝{÷îÝËwďŢ˝{÷îÝËgďŢ˝{÷îÝ»wďŢ˝{÷îÝ»‡ďŢ˝{÷îÝ»wďŢ˝{ůňŮ»wďŢ˝{÷îÝ»wďŢ˝{÷îÝ»wďŢ˝{÷îÝ»wďŢ˝{÷îÝ»wďŢ˝{÷îÝ»đž˝{ůîÝ»wďŢ˝{÷îÝ»wďŢ˝{÷îÝ»wďŢ˝{÷îÝ»wďŢ˝{÷îÝ»wďŢ˝{÷ňÝ»wďŢ˝{÷îÝ»wď^ľ{÷îÝ»wďŢ˝{řîÝ»w/ß=|ůîÝËwďŢ˝|÷ňÝ»w/ľ{÷îÝ»wď^>|÷îÝ»wďŢ˝|řňÝË—/_>|÷îÝ»w/ß˝{÷îÝţ»w/ľ{÷ţÍâVΔ©qßľuű& W˛k¸şiuAÄ {ÜrÍČĹ Ś·YdĄb…ŻÜ?räČ‘#GŽ9räČ‘#GŽ9räČ‘#GŽ9räČ‘#GŽ9räČ‘#GŽ9räČ‘#GŽ9räČ‘#GŽ9räČ‘űGîąäČ‘#÷Ź9räţ‘űGŽ9räţ‘HîßżäČ‘űGŽÜżäČ‘#Gî9r˙Č‘#÷Ź9r˙ţý#÷Ź9räČýűGî9r˙ţý#GŽ9räČ‘#GŽÜ?räČ‘#GîąäČý#÷Ź9räČý#Gî9räČýCGŽ9räČ‘#Gţî9räČý#GŽąäČýCGŽ9räČ‘#GŽ9räČ‘#GŽ9räȡ#GŽ9räČ‘#GŽ9räČ‘#GŽ9räČ‘#G9räČ‘#G9räČ‘#G®Üż0Ľť:Ő —0a¸¸áâĆ ×7 ˛.haŻ®1ݸ'lĂ,U¬đ‘#GŽÜ?r˙Č‘ű÷ďß?räţý#Gîąäţ‘#÷ŹÜ?r˙Čý#GîßżräţüGŽÜ?r˙ţýűGŽÜżäČÝ#Gîß?räČýű÷ďßż˙Čýű÷ďąěČý#GŽ9räţˇű÷ŹąäČ‘ű÷ŹÜżäţ‘űGŽÜţ?täţ‘ű÷ŹÜżäČý#Gî9räţˇű÷Źş˙Čý#Gîßż˙Č‘#GŽ9r˙ţ‘#÷ŹÜ?r˙Đ‘űGîßż˙ţ‘#÷ďą˙ţ‘#÷Ź9r÷Č‘űGŽ9r˙Čý#÷ď:r˙Č‘#GŽą˙Č‘űGŽÜż˙ČýűGŽÜżäţý#GŽ9r˙ţ‘űGî9räČý#÷ďą˙ţ‘űGîąäČ‘ű÷ď9r˙ţ•»ĆĘ8S¦Ľ]Ă%Ś.n¸páę¦AV-ţĺŇfÖ­/×ŢşĄ«T*|äîý»÷ďß?r˙ţýű÷ďßż˙ţýűwďßż˙îýűwŹÜżţ÷ţÝűGîŢ=r˙îÝ»÷ďßż{÷ţÝűwŹÜ˝{˙îÝ#wďßż˙îýű÷ďßż˙ţ‘#÷ďßż{÷îÝ»÷ďą{˙ţÝűwďßż{˙îýű÷ďß˝÷ţÝű÷ďßż˙ţÝű÷ďŢż÷ţý»÷ďßżäţý»wďŢ˝˙îý»wďß=r÷ţý»wďŢż÷ţýű÷ďą˙ţÝű÷ďŢż÷ţýű÷ďßż÷î‘űwŹÜ=r÷ţý»wŹÜ˝{÷ţýű÷ďßż˙ţýű÷ďßż˙ţÝű÷ďßż˙ţýű÷ďß?r˙ţýűwŹÜż˙îýű÷ďß˝÷ţý»÷ďą˙ýű÷ďßż˙ţţýű÷ďßżäşÉĘ…ë)o׸qăĆŤ7\¸ľmuAD‹[_Âů¦J0aŔTŮEÎ۸qăĘý#GŽ\ąräĘ‘+WnąrăČŤ7®Ü¸răĘŤ+7nܸqăĆŤ7nÜ8oăĆŤ7nܸqĺĆŤ7n\ąqăĘŤ+Wn\ąrĺĘ•#W®ąäţ•3gÎ۸q㼍7NݸqćĆŤ7nܸqćĆŤ7nܸqćĆŤ+7nܸqăĆŤ3gnܸqăĆŤ7nܸqăĆ…3gnܸqćĆŤgnśąqăĆŤgnܸqăĆŤ7nśąqăĆŤgnܸqăĆ•7nܸrăĆŤţ7nśąqăĆŤ7nś¸răĆ•7®Ü8€ĺĆ•Wn\ąqăĘŤ+7n\ąqăĘŤWn\ąqĺĆŤ+WnܸqăĆ•7®Ü¸qăĆŤ7®Ü¸qĺĆŤ7nܸqăĆ•W×0_ÂTQőŤ.\¸páÂ…‹[7 ˛2h!Ž9růîÝű÷Ď[ą{ĺĘŤ+7N›)1ĄJť2eĘT*V©RĄRµJ•*U»díÚ%K–¬Y´hŃš5kÖ¬[·tÝŇuë–®Yłf͢E‹–,Y´dí’ĄJŐ.U«V­J•*+V¬L™*uŠ™SŢĘŤ7®Ü¸qŰpᆫ7a¸¸qĆM7\¸páÂ… ţ.\¸pᆠ.\¸ráÂ… .\¸p Ë… .\¸páÂ… .\¸p Ă… .\¸r]Ă… @\¸pá& .\¸páÂ… .\¸páÂ… .\¸páÂ… .\¸páÂ… .\¸páÂ… .\¸¸ĺÂ… .\ą® Ă… .\¸páÂ…‹[.\¸páÂ… .\¸páÂ… .\¸pá•‹[ąr˙Č™7n\ąqŢĆŤ#Ç®\ąăş•7®\ąrăĆuă¦AV-Ä +§k•Ş[ł„É— —0nÜrŮęä„ UbnÝ*E W*UÂnÝbĹíÖ·m©ľáâćmU7ţnÂČÍŇĺÍ›·rŞĽuKVN—®o۸•cŐm[®q©pĺ•Ë.]¸LÉĘĄĘÔ-1˛ľóĄ\7nܸqăvkV7\ܸ©šĹŤ›¬Y¸d ÓĹMX2aÉp ĂĹ 7n„ K†‹7nܸqăĆŤ.nܶ%ă& —°dÂ’ –ěš0aŰp K†‹7nÂ’ †‹7nÜ„ KĆ 7\Üp]ăĆ 7\¸¸qĂ%,®mɶqKv-Y2aܸá↋7nÜpqㆋ7n¸„áâĆŤ[˛dܸá↋7\ÜpqăĆŤ.nŰ’áâĆ-Y˛k¸¸qĂĹŤ.nܶy7+Ő,oŢţ¸y»Ĺmś7oÉşuűćM–7o¸¶á¶Ť›0ZŢ4Čş ˘…8a÷¨|ÁC悬Yă’műĆŤ[.[ťž¤“ë¸n¬pŰE«7n¦ş%óĆ-•7\ÜĆ™ú†+W9Ył¸á6Î7a¸ĘŃ’ĹŤ[˛r¦ľáĘE..nÜp™ňP7VąĆŃR5Ž .1¦L‰)׍7\ܸݚŠ׷TP˘ŕJ… • _d}Ă%L0\¸á↠.a¸pqĂĹ 7\ܸáÂĹŤ.a¸’ Ă%Ś.\ÜpqĂĹ W2\Ü„ &,®dÉpqĂĹ —0a¸¸qă†K°dÂpqㆋ.\ÜpáţöK.\¸p &Ś.n¸¸á↠7n¸¸áÂĹŤ.n„ Ă%Ś.n¸¸áâĆ 7\ÜpqĂ… 7\Ü„ † 7\ÜpqĂĹŤ.oäf‰˘j ­TÄŚ)uJ•*U˛VŐJć-×·oݸqĂ%«›YD´wí^3dŞ@™5k7a¦TuËU‹Ó&TdtŤúöÍT®n»dq —)n¸şqKŐM·q¬ş%ËőOÖ,nÉ„•cőMX.v´hqă¶mś)nŰp•c…‹Ű¶\¦şáňĆę–7YŞş‘ą%ćP)0ă¸q#sáÖ·[ł¸qó6L\©ľTIUJL*]Ű’ K&ţ,.n¸¸áÚ†+7\ÜpqĂĹ 7\ÜpqㆋŰ5aÉpáâ†K7\Üp »Ć ®d¸’ &L7\Üp KvŤ.n¸¸%K& 7n¸¸áâĆ 7nÉ„áÚ†‹›°d¸„á↋.n¸¸qĂ…‹.nÜpá↋®d„á↋.n¸¸áâĆ 7\¸¶áÂĹ —°d„qĂĹŤ7\ÜpáÂŐ­ś+U˘DŮ@…Ę…(b˘PˇĘ(`ÉĽä¦*U*UÜpŃú¦AÖ-ÄýşG…•©/TLÍÇ —¬YÜrŮę´©Ő[xş}3•Kś*Yß¶á2ő W7n©ľáÚćÍTţ7\ąĘÉšĹM°q¦¸ Ë5N–,n„Ť3Ĺ W.r¬páچ˷\ŢRÝňFKU72·Ä”:%f\7n©˘ŕâ–k7\ßXA±’Ş (ÜL}±PŞ.\Âp]K†KX2nÜpqㆠ7\Üp Ă• 7\ÜpqĂĹ-™0n¸pqㆠ7aÉ„ K&L°kÉpqㆋ·d„%&Ś.a¸pqĂĹŤ.n¸¸qĂ•ěš0\ÜpqĂ…‹.\ܸá–L°k¸„%ĂĹ 7\ÜpqK† .\¸¸áş&L.n¸rĂ%,®d„á†K.nÜpqĂ…‹.nÜpu+7c(ţUŔPrA aÂPrkÖ7o×dÉ’5k[.YÝ4Čş ˘…8näfáĘuëÖ-Zăľmëö­[.[ťž "ckÔ·o¦rŤS%«7\¦ş óĆ-•7nßƱňĆMŘ?YłşqűVŽ•7nÂČÍšĺ­7r¦şqăöŹŐ6nÜp±'Ě›©[Ţh©ňFć–PĄŔŚë¶­›7nßrÍâv-Ů7UłnÍ’E‹Ű¬\˛p K&,Y2a„áĆ 7\¸¸qăĆ —°dŰpqăĆ 7\Üp ĆŤ7\¸¸qă&L®d„ Ă…K0\¸¸áâ&L.a¸„áâ†K7\Üpá↋7\…ţá&Ś.n¸¸qĂĹŤ.\Üpá–,™0a¸qㆋ.n¸pmĂĹ ×6\Ü’%Ă% 7\Ü„ †+Y2aÉ’áÂĹ 7\ܸá↋.oĺf%Ó•K•°YłfáĘEëÖ­[şĽÍú&.™7oŢľmK&Ë›YD´ǭ۬Yłt麥ĘŰ­YłfÍ’Ą‹L0`Ć€1eę©T¦X©RĄŠ•,Yłd­š5kÖ-Y·nÝÂ5ë–0aÂ’é& ®[şnÝŇ•KŐ¬Y´f©’µK•+SŞV­:e*U©1¦Ä † q·fÍš5k–¬YÜp ÖŤ7nÜşáâĆí.\É„ ţ– 7aÂpqĂĹŤ.n¸® K& 7nܸáâĆ W2€Â’á↋7\Üp%†ë.\É’ &L7\Üp%Ă•,Y2a¸p%Ă…‹.\Üpá↋[2aÉ„á↋7\Üpá↋›0\¸„ K–L7\ÜpqĂ…‹.nÜpáJ&L0\Â’áĆ —°dׄ ĂĹí7\ÜpqĂĹŤ.nܸmĂĺ ׬YştÝšuK×­YştÝšĄkÖ,UŢrÍš5kÖ¬Y˛dyÓ ë‚âpáşuëÖ­\·rmËu+×­\ąpqă–+W.n¸®]Ău+®\·náş•+W.\·rĺş•+ţ×­[·rĺĘuëÖ­\·rÝş•+×­[ąnáĘ•+×­\ąpĺĘ…+W®\ąpĺ•+×¶k¸„ &,×­\·nĺĘ…‹@aÉ„ ăĆŤ›0\ܸq˵ —°dÂp]ă†KX2n¸¸áÂĹ ·d¸„ Ă• W.\ܸáâv —0n¸¸áÂĹ 7a¸’ K&ěš°dÂp%ĂĹ 7\„]†‹·m¸¸áâĆ 7n¸¸á&L®d׸áâĆ 7n¸¸áâĆMX˛k¸„áÂĹ 7\ܸáâĆ 7aÉp K&LX2aÉ®qĂ%,®dÂpqĂĹ 7\Üpá↠.\ܸĺşuëÖ­ţ[ąnÝş•+×­[ąnÝş…KX®[ąrÝĘ•+W®od]ŃB\®mÜşqăĆ-™0\ܸmۆ+Ů6\¸’™ë&L7nܸqăĆ-ٵ_ܸqăĆŤ7nܶ%ĆŤ·d۸qăĆ 7nܸqăö‹7nܸqۆ‹7nܸqăĆŤ7nܸ ăĆŤ7nܸmKĆŤ7nÉ„ K&L.n¸pqĂ%L.\¸¶áÂ… .\„ẖ‹Ű¶k¸p%»–Ś›0aÝĘýűWN.n¸„áÂ…‹·\¸¸m»† .\Â’ K&,™°k¸p]ă¶-7\„%ĂĹ .n¸¸á†+™0\Éţ„á↋[2aÂpáJ–Ś.n¸¸qĂĹŤ.nÜpqㆋ7\ÜpqĂ…‹.n¸¸qĂĹ 7nÜpqㆋ7\ÜpqĂĹíZ˛d„mËĹŤ.nܸqăĆŤ[2aɸqăĆŤ7nܸqăĆŤ7nܸqĂĹM¬ "ZăĆ-—¬_·¸uăĐ[®\߸}ăć ×7YGdu»ő-7nÝ’]S¦,7nܸqăĆŤŰ7nݸuűĆí7n¸’qăĆ­·dÜp}ăĆMŘ5n߸qăĆ ·dܸáâÖŤ·nÜ’uËĹŤ7nÉráę†ë.aÉ’ ăĆ­[2nÜĽqă–ě®mÝľuţűĆMX7n߼qëć­Ű7nܶ »ŐÍ[91bĽ}ÁŐŤ[·nɸqăöŤ.nÝş}ëĆí[7nݸ KĆ —·dܸÝâ†+Ů5n¸pqㆋ.a¸]K& —0n¸¸áú%l.\Üpá↋.\Üpqㆠ7n¸¸áÂĹ 7nܸqㆋ.\Üpqㆠ7n¸¸áÂĹ 7nÜpqĂ%,™°dܸá‹7\¸¸áâ&LX2aÉ„qĂ…‹7\¸¸á↋.nÜpuÓ ë‚âry ĺJYŞd­cJŐ-UŞLq›őgPŚY·¸u“UĄĚ­d‡F}»–+—·TŞn™sţŠ STpá–L0\ÜnI™µ-82bf ăví VŞnýú%ě.n«¨ĐĘE…•8N¸pucĘ[.aßpáâ– .\ÜTAaĹ ×YÜn…ÉĹmĚVTdm“J o‡ľ°˘"k[.\·ľ•ÓuႬ0ÜÄ„#†[®nŻľäâ6ëJŞ*x¶cŠĘ,oł8úÂ-·[ß¶ űµ 7\¸¸qĂ%,.a„ Ă%ěÚ5aÉ„áâĆ ×6\Â’áÂĹ .n¸¸䆋.\ÜpáÂĹ 7n¸¸áÂĹŤ.\Üpqㆋ.\ÜpáÂĹ 7n¸¸á†‹.n¸¸áÂĹ ţ7n¸¸]ĂĹM.n¸pqㆋ.a׸á↋®ndqŃB\®q_ €RĺB'*śl€˘AĘo§%ęSŠ7p¬f\!E(QÄäšµ •/`ľDŃ%*nÜ’]Ă…Ë[)bŞHůÂÁÉ—xľEˇň…L*NŞÉĹŤSĺČT9tJ+Q.¨â–«.n¸„ ۆ‹7 ł®Dą`Š )d¸EŃEYUđČŇP®J†*đĚ(ŐíÖ¸YbLĄSĺ(Q¤jƉ†1ł mPáDJ'dEQő Ę—TU†‰ÂíV·dÂpᆋ7\Üp%– —°dţÂp%Ă%L.\¸pqĂ… —0aܸáâĆ 7\¸¸áâĆ 7nÜpqĂ…‹.nÜpáâĆ 7\¸¸áâĆ 7nÜpqĂ…‹.n¸„á↋.nÜpqㆋ.n¸páÚĆ 7\¸¸áâ&Ś.n¸¸áÂőM¬ "ZË5.L©nTľDáK*_˘ds-— >2rÝâć-•“)T.h3ŁĘ\Ş4D©eĚ—(N®\P…‹Ű7\ÉpuBe†”&P6¬p’á 71Q4T‰bęBRąĽ‘ˇ˘ŞT*d,d€â¤É…Rßr}õ —0\É„ K¦BÖ'QČdČŕ¤T·(¨ţdř2ëËRť”ОJ1RÂt»őm\®*_tÁUŠŠ“0_.\ Cĺ”.S¨lR ĘVRŔ˘%Š,1pÝę†k›·nݸáÂ…ë7n×páÂ%L7m޸áęÖŤ›·kÉĽ}ĂŐ ×/aÂpq†KX2n¸¸áµ 7\Üpqㆋ.n¸pqㆋŰ5n¸pqĂĹ 7\Üpqㆋ7\ܸáÂĹ 7n¸¸á↋7\ÜpqĂĹŤ.nÜ’ ㆋ.n¸şiuAD qą¸qăĆ-7nłđtõÍ[)2Ű~%űuęÖ·[߾͢E‹–,U´híRuË۬\¸fÍŇţ%K•­Tßrqă†k7n޸ɒ%ë+YşVÝâ–J•.U¦fí’µ ×7€ŞR©ÚĹę–7U˛TąRĹŠ[®mÝpáÂ%,™0aÉ„©Ú&K–.Z˛V­ZĹŤ–Ş\©dɢĄkŐ+U´TĺJ•‹Ő-ną¸Ť+G…J·0Üd±ĘĺŠÖ.S·f±ş…+U.U´TÉ’5+•¬Y¸dÉÂĄJŐ·[ݸÍ"Ł*Ő-oݼ墮۷n޸ÝÂs -o©TŃ:•lUÝTyű&ěš°kÉ® † .n¸pqĂ•ě7\¸¸á↋7\¸¸ † 7\ÜpqĂ…‹7\¸¸áÂĹ .nÜpá↋ţ.n¸¸qĂĹ 7\Üpá↠.a¸¸á↋Ű7 ˛.h!î7n¸¸%&LŘ7a¸’áâö-ٵ_ÜĽ ăv«Ű6n߸qëÖŤ@nßşqĂĹ ×6nܸ}űĆ­·\ܸáĘĹ ×7nܸuăÖí·nÜpuűĆ­Ű7nÜşuK†«[7nßşqĂĹíŰ·_ßşqË…«.\×’ Ă%ŚŰµoܸqăĆŤŰ·oß’qëĆ­Ű·nܸuăöŤ[7nݸuă–+—·\c "Se·nÂşqűÖŤŰ7oܶuăĆŤ[7nܸuűĆ ·nÜľuăvë›·;*˘h(%0aĘŚ%Ě5ţ2˘l2F)d‰«"¦T1bľáöK0aÂpá↠W˛dÂp ĂĹ 7nܸá↋.aÂ’áÂĹŤ7n¸¸áÂĹ 7n¸pqăĆ 7\¸¸á↋.\ÜpqĂĹŤ.n¸pqK†  0\ÜpqĂŐM¬ "Zű…‹›7n¸p »– .\¸puĂ%LX·\ܸÝâĆ-·n¸¶áÂ… .\¸’ĺJ¶ .\¸¸qăv‹Ű·mܸqㆠ.n¸pqĂ…K.\ܸqăĆ .\„qă†k7nݸáÂuŤ.nąp}ĂĹí›0\ܸáâ– 7nÜpáÂ…+—0nÜţpqĂ…‹7nÜpqㆠW2\ܶĺň†ëš.[·Ŕŕ•ŚŰ6\¸pá• ®nܸmĂĹŤ7n¸páÚĆŤ[®\Ünuó6*¬(Q,DŮŕÄÉ +VŮ&& QNiĐ0¤[QdEÉPE7\Â’ K– W˛m¸¸ Ă%L°dÜpqĂĹ .n¸¸áâ0Ů/a۸áÂĹ 7\ܸáâĆ 7n¸¸á↋7\ܸqĂĹŤ.n¸¸qĂĹ 7n¸’ ĂĹ 7\¸ľiuAD q¸ş­łëŰ·nÝş}ă֭۶Sßpq+… ·[ܶuËĄ*.nßľqëĆ­7oÉnyţëćŤŰ­YÝnáú–ëÖ­[·Ľuű† ·[Ţľ}ű¶-—,]·nuűć ·\´¸qŁ…k­nÝşÝâö-®oÂpÉćŤŰ­nÝľyË•+—7nßľuă†K·YÝşÍúeK7\ł¸qĂ卷\ßĆ•Óŕ¤[\ÜnÍĘ…«Ű·oÝşq»6‹Ű-\ŢpŮĘ5‹[2n¸nÝ÷ŤŰ-nŢT™*7ć”T*F•SJ 1·f}( Ě©RcƤSĘÔo˛Č”:Ä .n¸¸ &L7\Üpáâv —0aÉ„á↋[˛kÂp]&L.n¸¸á↋.n¸pqĂ…‹.n¸¸qĂ…ţK.n¸¸á↋.n¸¸qĂĹŤ7\Üpá–ě×· ˛2há-—·/Q¨śúB&L)+ިú’A ·UQĆ€1ĹŤ·[UÄT‚K•,WŞf­şµęP•UŞXqcµA®mŢdQ ¦Ę.Uş˘TY%F•,Y¬Ä}‰˘ŠĘU«Xĺę¦J«mRŞdH%+­/UşáÂĹŤ›“(´Rť˘˛KŐ,0PĄJ5k•,Vݨ¬ř’Ď© _śgĺB.1bRÍâ–«7ST¨”úÂ-W†0PŔ”ĄJ–ŞT·R]łÁË®QXČ`PU®”/bd±úvë7nÝpuóÖMŞoßľy›Ąęţ7nÝľuóÖ­[·oÝş}ű&Ś›·nă¶%ㆋ.\Â’áÂĹŤ7n¸’ K&L.n¸¸á– —°d¸’ v .n¸¸á↋7\ܸá↋.\Ü„ ㆋ.nÜpqㆋ.\ܸáÂĹ 7n„ ë¦AÖ-ÄĺW… -'śd(ă$Ę…*ś”úĆ*ЬRĄ’qófĘĘ?0¨DÉŕd…“ N.xˇB%Ę©d·¨ÜĘĹŤ·(0Y1cĆ•c4hp˛"C®*`R]€bJ)aÜpQQĺí”2Uśd!ĺB©oąşáÂ%Š*PbđŇŚ06@Ůĺ·(ţN 8 F” T¸‰ąf• `ľĺňv‹•*U¦ÂpË&Š04@Ů&×! N HI•*J ©fe¨"FLÜnqă†+7\¸p ű† .\Üşĺâ& .\ÂpáÂ… .aż¸ vMX2\¸¸áâ–LX2a¸¸á↋.n¸„áJ†‹.\¸„ K& W˛d„ýÚĆ .nܸqĂĹ 7n¸¸qăĆ —°dÜpáâĆ W2\ÜpáâĆ ®mÜpqĂĹ —0aß4Čş ˘…8\ÝXŃ žS«ÄČC Ź<¸¶‘©B†[®nÜr…ů†Ę—*R Tˇ2ĺK1_Ŕţ|ÓŤĘną¸qóF¦J”Y©TůŠJ•(V¬|± Ś*UPľT#&—·0UN‰©&Ě”*S¨DŃ j®o¸ÄTCEL*‡ľóĺK”0TŞé& (bČHc…ŠRPh…ůReL·\ÜĘuË!\·ŔTCĆĘ QÄĚ’ĄŹ”/‡T})Ś)N_J‘……Ű­nܸm– W2a¸®%&L0\Űp%Ă%L°dÂp K† —°d®q& 7n¸¸áş–Ś.n¸¸áâ†KX˛k¸áâ¶MX2aÂ’ &,™°dÂpqă†+×¶dÂpqĂĹŤ.\Üpqţ& 7\Üpá↠7n¸pqĂ… 7\Üpq»Ć­ŰYD´—+×7nąĽyëÖíW7€ßľuëÖ­®dÂnq㦋Ű6n¸nq»vŤŰ¶\ŰpáJöë—°\Űráúu ×­mÜpqă¶-ٵmÉp)Ë• W7Y_p Ă… ×µk¸r Ă…ëÖ-\׺ĺâ¶-×5a¸¸ÝĘő ®[Ýpáâ–ěÚµ\Ürq»ĆM°\„ ㆠW.\ܸmĂ•ë7nÜrýÂu‹›·dŁđäú‚ëZ.\Ýr]ëć.\ż~}Ă…ë7\Üp]ĂĹŤ.a¸®qÓĹí.\¸p † ®dżráÂ… ţ.\¸’áÂuí.a¸pĺÂ…ë.\¸páÂ… —0\¸„ĺ↠.\ŰpáÂu .\ׄáÂ… ×µmą®áÂ… ®k„áÂ…K.\ż„áÂ… Ŕk¸’áÂ…k.\¸~áÂ…k.\¸¶áÂ… .\¸pĺę¦Ö-Čuű¬Ű·nÝĽuóÖÍ[7oŢş}óćí›7oŢľy×í›·oŢş‰óćÍ[·oßŔ)ëćÍ›7oŢĽyëćÍ›7oÝľ}óćÍ[7pŕĽyóćmś8oŢĽ}ó6î›·nŢľŤóćÍŰ8oŢĽ‰óöMś·nÝĽuóć­›7o߼yűćÍ›·oŢľyóć­Ű7ţo߼yűî›·nŢĽyóćÍ›7pต»UĆ0bĽuóć­›7oŢĘyëć­¸nŢľóć­›7oăĽyëćÍ›7oÜĆűćÍ›7oŢĽuëÖ͸nŢĽyóć­›7oŢĽŤëćÍŰ·oŕľyëćÍ›¸nŢĽyóć `7oŢľ} ćí›7oŢľ‰ëćí›·n߼yëć­›·oŢĽyűöÍ›·oŢÄuóćÍ›7oÝĽyűö­Ű7oŢľyóć­8eŢşyóć­›7oÝĽ}óöíŰ7oăfČş â«CĄFáuh(Úkd*P¬ĹI\,1Ćwś±“K™D•*4AĺČFJY/ĘV:Áň—[’YćĚ2§¦š3łÉĄšw:ˇ'šwÝçž j¦o-‡Ž*ęhž†úŚč†fJéŐ—¦‹´ŐV_Mi€rL¶–=‡%s¤ŠjÚg‹}‰$“X2‰$oObGÜgźý6¬rČ˙ťjŢ—Ne°ĘV¸á— .[â…'î8°ŤGî8«ščZą±ş\’yć¶lrK嚇ľ‹%»$ëžQ÷Eb I°‹µLµqK ĄÁ­$·lč-ně’Â6»ŘB6đ%\2ň6ML˛ÍŢ·ěBî”ýŠ{îIl#ř%۬‹pŤ2&pż5Ţ[đřŹ/ţů@FĚpŽF:ٱ» ‚)Čź„ü%#éÂýó§@żËőÚ_˝šP/'¸Ŕd¤Rrö%:0gnÚ™¤đ& ÍÉgěSĐ0¸AGqPh{˘SÓĹ´K1 QrZŁ*ĹÂJI"S0´š`¶IY˘o_ŐĄBe*ŔĺÍT¨şÚ˙ 'ÄIÜáwĬâ¦Ä·Í V±šśä&+Ď]ÂsŁś°Xe,V-ËX4łĆą]hCćŃ…l‘;ŐEâÚ(íÚ°‹o¨! nXă6äGY" ·h‚ńtŐ„ Ęz%j˘W7  nŰ(ň(ĽąÝ‚lr¸D„zd!q!Ě ;ż¸—#¤/}í+ŘĂ<$‹ą/b-ű ¦„ýÁO M@R ¦4ŔůQÉ—YŞ’ÉľT@\Ji\Bć!č@5Qg=«ŕ™žIM Ú‰hĚWĄv§90-OéR”Ąe)¬™ł…XaÇV*±ˇíTa»ŰĄĐ–Éz¶SnwË'Ţ`u˙*ą pvó§%P5PÉůÓqPLh­ +côUÉc˛€µą+ZîsĚ"ťč<÷ŤH@ÚČLâ„]DÂz¶Ă-â° o(NpŮ"D  i覲i¸(Ôˇž–Ŕg=M‡<$Ô˘zĎC=j ŠJÔ-µ`3XĹĆ1Š9)V­˝0vŐ‹íoŞ^˝ßÇěE?\Ni—&™X]ö?µ˛•­#[`\ʦa:ÁdrM¦™č†mÝUNyÜ™›«§kćN…uÚŃśĆŘDŤpQŤ‚¬ W()Lbň…—uf7kŮzö†/-Ů(C¶ËŘ2î¤[ßě·˝1‘ź‰kíAévPŘ˙..r·ŤÜ-`,`íÖW Vo­¸,6VÎteÔ\ó”ë٨p…lnŕŠ$ĘB]|C}lC`cf%7\éL[ň®^q¦&śqI $ďĚĚ[^.ŐÉfMSç»X?Ĺ)°ó…ScŰXČ>–Q*”l¤üë_H¸˛bĂd‚ěŮŻiöÁ™m0&Ó66 ‹Ťµ— Đ;Ó¶6IČsźnŁ[ŮęćĎג؉"F±Šĺ†Đ(*TŠ.®ŻlĹ[ďĆŐŐ° Ç+Čůę˝=Ö->׼ćun˘XěÜčF×<ďl˘tžŰ\ó<· )—Î;Í*]•Ĺł #oă>»ŰsŠüăĚ˙řšŃěŹ5˙#˙ŰÚŠ˘śâ7(EQN“éX¶—´P—şÓŐsźeJ]§ jşŞóťűڍ¨üyşRîŐ†6$áŇM¸4¦5˝éNs: ™Öt¨=}é4šÓŁ.5¦Mť„4dÚÔ°Ö4«‘`j$´šÓ¬Vu«GťéL[zעF¦Ű`ë$űÖ—ţuŘ0ěb—ÚŮL ő§9íě6¤Áٟƶłµ-ë$űÚ—6­mMnpÓ:ۭƶ·oÝ„X×úҶvőĄŁ-jr×{Ýđ¦öł§ýîu«ŰŢčÎ7Ŕ5Ímu7âŢHŐŁĺ¤ÇĆ©–$X§é! XĹ*§3ŽńŽkÜâ—ÖřĄ/.ňo|ÚI˙@ĘWŽŐ‹{ÜäIŔfNóšŰüć8ĎąÎwÎóžűüç@şĐކo ýčHOşŇ—ÎtĄeä8ĕ٠ęČ‚9U1Oť€M~č¦j‚ÂNö˛›ýArŘ×Nvµ‡=B’ĐEÓçN÷şŰýî4§ đÎ÷ľűýď4_>˘ŤkčăgĽaĚc”ĆK"ĹS™T€(řý4J“Ŕ…dÓ´ŹÝó ˙ĽčCĎ ·Ź]ěž/}J ¶dĽěgOű ë˝ö¸Ď˝îgŢxoÜçŚhŚ‚ôĐ‚ś‘=ÚH ş2Y€w]âL?ĹY„¦ż!ęźť§g·©ę·Ďv´C¨@˝rý˙-vOţň÷ťvćOżú›n棬Ç–(ľ Kčâ(©Ľ“‰.˙e(\ăSŰ—!˛I›·zšG€žW!Ây ‚}˘y˘vR®g ë—Ht۰wř hsŤ§ ż‡x»P@)p Ô˘ ÖR™]Rˇ]•¶@qĐ•V·` Cv ¶p ?„;ČF„C„@„Dh <Č„>„M„FŘ„Tř@Ř<ŘA!Ř…x{^†ëGń‚íFrí"„Wx0čfi<_6d¤‡vx‡x‡z¸‡x¨ bř‡ć‡~€8ş÷tGa Fxé!ęá‚Ô˙bF’ v¸HM)ж f|¸‰śŘ‰{8~„Šł†˘XŠ}÷G1xř‚_v÷a†Ô˛ ™1‰‡Ń¶rpfšč‰ĽŘ‹|(w¦ŚwGŠÂXŚLwî‡xîç$ ’čfß`’ ĚŇ’ ‰Úŕ‹ÜŘŤn†Ć¨să8Žás‚xŽę8tGag¸$–@;¬Ź”±avfF1 Ž`‹Âj¦ű` ě! o¶‹ŢxŚĆXŽä‘ XiŚÄ¸ŽÉsűŕ päŽÇÇ đgô{şGíG‡vhf mđf’ŕ˙€>˙¨:y‡Ö`ŠĺX‘ăXYäHr”µq¶€fa E{Ą¸‘9•7Ç á/:×ĐF÷R±ŕ» ˙pÓE˛±˛° W÷ޱ“réf׊ $0”!@ŽJP$p P±·”v¸¶ŕ8éH•Žis¨č~Šh†¬č•«Ńxfm:8Ťf6— ů‹€‘°—]g‘¬#GPH G¬sŰĐ:k¤Źxx IRůTiá†Ë’_‹‰kvió5dך̹‡ŕč…ăšy `šé!npi%sŘ;\1Ź4‡‘˙™™ąfű |Ů…»É›É’îŘ•-čŚ|!eúÚUşĐśüy‡Ú   : Z z  * ş Ę  @%Ŕ…¦I I$•–› `”xyi[akmŕrBIŽ{IŽ€t‡‡‘渍ɞŽé›úŔxÖ`FŘę‹űŤpx™±śhvmÖźÍŮ“  Jş¤LÚ¤NÚ¤Iú¤MJ$Pąć˘yšĆćmjiŘEvviF9›–Ŕˇłă˘ {s©Ź’ é©ë)Łę¸ôŮ‚G\Ń‚îHy¨‰Ň˘‹Fʜϩ~(ŕšŢfo( ˇ(˙@Ą4‡nŔ•†M ˇ€Éˇx) ]Šq ]$PťC E ۇ%pš0ÚtúG’ŹŰŔI°ŁóA-ł¨‡ű0“i†piźgf?:¨›¸ š~DĐ:݉äĆ:Ż™lIpq®&n­FEPˇVˇšF*—UQYޱ÷Qdąf’0sâ™~1şŞ‰ŠŰ g4ź=ÚÔ˘ ó‰ľ ‡ ›’0 l¤f±Ł 1·H»¨1{*¬x¤ĺ{‹Š‹H@ۨ[l¶f±TĘ:ާ;nI€źÚÉ:)€ţŘ­ąťľIÓ‰GPY~sę®Ĺ˙-ßpهřž;z|ęqy¸ ssăBk’;o–¤š@ ¬ {‡…Ş{®Y($p˛®y˛­“r­ŁˇŢ–¬VĺÖnáĆĄřf”CEne±×i‘¤Ę”Óą—iš4«Ş6Ű‘© ű0ލ’é‚îw«w¨‰^j Q š~¸{Ŕ:*7n$Ŕ¬ţ†¬€I!€dąöƬ’ËlI l릡°X›y):«hö JŽ.š˘ş×®yŽFŻîG‰x_¦>ʇ]ö™‰«“SK{§±^«ˇHđ¸)WUş¨É;ąţF¶ů¦iyIéęmMPlFi·Dyťę˙qf×@0·Ô‰šąWłµ[ŠvꆱH‚ËxőH¸üşŤé!´¶ÉfĂËŤÄš{éšqHĐ8ąË:âą‹ZŤšDP±ţ¶¬‘‹o#‹ę:ˇX ¶Ś]Eé?…¸˙° Ó)”帮µ§ľëŠ­š»ú1‚µ:f!e ţy•˙P=±¨h GŠeI‘°@ĽżpXĽ€×¸€‰’` mŕ¬Ôˬ'«Ŕ ̱X›¨ÜZÉš¬¶† @  ®Fů©{‡‘ Đ­‹˝°›žµá) ťŞKť @”´G»)Śđ:xgxF7Ş:F±/x Şs‡˛¸¶sëp˙RŇ…L—qR‘PŞBĽf‹;{Ş»ĆA9sIP •±̨‹j±SŚRŚąY{ĹŤŠ‘ŐI”k<}kЍ$Ŕ…€Yˇ@ľáš‘EYÁ9ť·Ľ—t x(|Ç€Ś=«2ŮŠx|!Už–l·đ®7]ą@ZČWg m9‹Ő\ÉkFÄ|WąuKľYirµ ,±¤|ş[ĘŽ‹ĹĘĘ­şŞŃYo‡ŞśÉäË‰ŞżÜϲ+ĚxKĚŨ pD‚Ë#ȵş|¸˛Đ¦|¸ŻŢÜż€×uYIľŘşĽ‡ŇY[Ŕ!=šLŔŰ:€YĎ| ‘DF)ą”J§˙Ë^\ľA‰ÓXę˘űüËÁěwvlСÄĚśŻëF¬FƉ‡ÂëÍÄ+{·=Çčkš\講ëoi€šš™Ë BŽ\¸ĎuŤwA=ŰŘŽţ0źĹ;8:Ë´›8% Ś;¨gf-މӨ:ÖҲ¨ˇÍµü™Řw7Ő©M‘đm”Łü±Xuµ›‹ĘŔXKŇŚŞŮŽ+şpěË×ů¸Ěбö&ş\řË@IÎú“z~˛­ß„uî8™:ڞpRąkRmÉkö™»€f:«†‰ř'-MëѬ:Ő! × ĂÍ ÎM÷Ů)‘×»É'{˛$@X+± ˝ÝˇĽâ(®ŔD ćuľĽ¶Ě—|Ş]Ç­—=ŢĐŰ­ęĘy˘jć©˙‰Á}§u7ĚBţC‘ŚúaŻĚ¸Ś˝˝‰Ej‡j†–)¨‚މmŞf=—mw›L·ĺ¸—,+Ć­Óš-ŽÎ°žâ{â,~âTÚ¨‹ęĹÝĹ[±¸Ţ:6ţš۸3w˘8íĎI”?mwůýč]uWyŁ/¸Ś ŤÔ¶ ć„üä?JťÔ Ú]ÚJÖÓÍĘÝ>ÇĘŘ.—b®t›üăä®ě´\©q>±‰z˛kµaĚâ+^±rľšęĘʸĽ]ý±—˝¨V{đF9Ýo˝čäÇ':ŚAîěbĐî—űa çŃ‚ó ‰Î̇C±r €nPJ°/âIűňSb!%Pň¬‡Řxâ˙9תž‘DI•еi^ŔŢmѶ±+±)‡ď–ş¨Ë[ŔŮm±é˝ťłŽŮŔŢâĘäČŃá‘ŔÜÚ ßč/ń^uß Ż^) µŔ…ó:ČxĄŠ-I;%f˛ o€.—°&Sň|p4Jp ;Cy‡˘ÄˇÝtwěŠÁĘţ“‰mŇe oĚM@©ÂćóOżÝŁ\ůu^ô+˝ÎÎűšFŇm®ˇBĹăq|ˇq˝č8ÍěĄÎőb-ĘŘ·äŮŤŔHgä§ž¸Q>(;S nđS~iw?ňy4 ŕsS<ÍwWÝ,—ÎtYć2/ř®ŢW ź±ëĆ]Ú’Ú?˙/±źŇDŹđč˛X‹— Śµü>Ň+.âŤ+îâN‘fÍŃä»ę/ÚtŽ®úé÷‘_ßxÖŔÄNKaKŰŔ]Ö$Ůú—PáBm &””$…ś9Jś”¸č&…I:ZTŇÄI%)J^t’ÂM I]ľ„ůĎš5mŢÄ™@ť!”Řŕg|-A ‰$$ś6E‘„IŁ6m"QeҦ ›$( Ű…Ó±cť’0 v,%¸uK"ÚłhK Đ–Ŕ]ˇGI(@Ô(€ByÁSçâĹm¶‘`YňdĘ•-_ĆśYsÍmÚ:k»FĐš®ÎŰ:‡ľĺ9’¬/ż)Ľ•DI˙›$mÜ4i’ÄI7Iš„ô-;w“4żŤ§ń}«őň—Ű6çD,0a‡AŠ7îܱwÓTŤÄ(NŞlš0‘šâëW˛N 8%0·XDĆ"áN÷¬Y§wóŢ-„źÜ#ˇ®Kl§ˇ® á°çlrěA '¤°B -ŰçµĎRóLk¶íĂ>”Ä’^S4[va®E_Śi& ű ÁŔ¨»ń¨˘äŞkľŻČcĂŞň¶j ôľęŞ«ü’Ş«,´şBk©˛¸»k.®ü‰źx/…»ţúËÁ 4'ź|šĐ1Č.dłM7ß”ěłÎl1H[¶HĎ>$M›ŐZCqKâ„ ĺ˙`D4Ńĺ´™‘ş#¬(-« *±łşšŻ-$„ĽŠĽ6‚D˘H&Bőމ˛îr2Żąč:•>îśěn/ĽB(аL›2s¨(!:ź”PM8‡%¶X ˙iČ3["iC’HŇ$h­’¤ ĎjN›;‘•¤Z7âhB!A˙1Ĺ„XT4ÝÖn™1Lµ,ę:HăéŇ6ľ˛Ź"á—ĽH‚ÔŠ«PŤL‚öśĚ…ů\ĺűÔrŠJ"nË@ d˝‹ŻZÇ”®ÖάőÁŤ%ąd“3íłkšŤÄ‘HŞŤĂeg[—<ëěź6,‰"xŢ&ˇZţ‘Ą [śuĂ[Ś6Q]§bôAé˙úr0ş\?V°-°Ş˘Ť€®’Şň’ŕ =łÎoUV­2JµR(KJVŃâŽKš¬µ×Âhĺő§ę®«Tşç„=ąpĂŤÝG›oצŮFlŃĺCĄş¦Ďnł-­ 9ÚřMLôG¦kŽ–D–ZŇłĄ§W—iB €˘7Á§ 0×/ąőIŞj$H€A˝wTSÍfĘa'y’•żěcďŐ†áVXáÄ, v˙’îşZűţđÁ;<|ńŮÜĆ›C+Íš]:”Óml~hÎÎ’°„…84±CsnČ’}ĽůGiXÇ:çHÍ@Ź“a#8žĚ§Ya’°  i¸ żU˙łIe`LPŹZćC”!…>›˘‡µ´pn|yÔ_j•ľ]ç/eŠ”Pľ7>^¦-?ÜĚš*#Dś€`qßčh«4[ěY'%@VmÖza±žOYP”ÄhđÔˇ]$7–ѢĄm™KËTojęüô8ýVĺb®ŐqŚEIe [ÄâĽă¨˙DënÚô˝SUŠWîh%ąxsš7Ĺ,0%*¦H;ǦNŻB¦ě3űpbŤłfZç}Ö32UÝĆ[˛ŤŮňů­I´Ĺw^F­=i#5˝eN‰ŐÍЇbć(@ÁîĽÉL&0îŽs/b! ]¬—_±¸ UţEę“é+ŠU pÝÝ\7EUđťfÇňŁH 3˛Ź˘vŠł“ăźdmŘZUĆ‘LlĄĘ„4Ž&rO"úf^•i¤Ă8_(‰«Ň毴Ĺ>âđ)R]; »)Ł@í’LAđôÜҰ-=ŽqLĄG“†Z4B˝ĽŹyXíÝşÚH>‚˛Ăwí˙¶µ)ŚčŔ0™Ę ĆľŢâfŇ’Ü^™eĂÝdRÄ4fîţVÓ=”ň\mZr‹~FÂ44Ľ-âXşĄŃ D–cÍą2a;­D˛°„ťLt<Ť5Şť6ćYś™M&0aä1í©žO!Ő€„!ł·HŘ”Z`–bJ‘"5c˘5$h$AS‘Š)ó®QI’őx¸°c' {”xŮ.ˇ«Áࡣ«`Ëh>ç#ą»ëcŚ}:š—ńľ˛6śĐ;$¨‰$č;7đ>ĂS"›Óč%r±¦q‘ű†WZ+8[‘F·Ąé)2;a®†ĐżŞ®2 ˇAÁ@'Ń ’Ň/9Ş…˙˘µ4@ "$=Âj48 şC´Ŕ¨0÷Š5+Ó5Ř™«IQ$aˇó,â43 â{;4Çđ‡ +f 9Ćh‰jc ľKKÄ ”ŰłŞÚ*µę 1m(Äk Ĺk értӿ蛌ÂP' =_±(\¬Ä C®|»Š«@5ĽŠ ’ ˝"µ¬(’"‘,$0­ÓĂ"1f´2¸Aź!>¶3ň,b›+CFŠqÁŽD’!„ŤÚ¸8ŁŞ†€°š9NŞAĎđÁš€*YÂ"t«?U4Ľ?鄚ę* ľů‹ŁČ.1«ˇ|“„|#4h˙Yh˝M‘@ Ů+ßI©ł™ É:¸jt8°Ř/îř4„T Ľ -˘‘⣨ź a>s"Děą=éđ´TÁž :–,Çš,śÝѓΨ¤‰ŞŠG›8ş+<ŮAĹ\śöQBĐś$ZV<‘Y˘×  ŁÄ§o0GGk‰ďăBKÓ<É Ŕąy3rÚ‹µ$Ź\ ¨«Č˙XCű¸!#,R"ą©;ň® Ij’¬µA‹Ďc ÁQIE Š0Ę. SŤSIǤ‰|™”IÄÔ ¦@ĎË ťx‹ČŘťO:Ď˙Ç"s"THéG€%ł „Â庆8(ۨ„p溼†˘EĆřâ+ˇC2áN«°ŠĄ»7󊆥k˝ ˘Ťń€űĂ|¸¸tĆ $IjbŹ+ą.‰#>í$şŔ< bkDy1ÄĎz,ĘOĚ ŇĚ!5Ň"5Oň1ŤÄYôńGm´Ň(‘€EC±…[)ÄČŮRÓPšnY–kP7›ŚŮ$¶˙ż4;ë2ŚÄ9k°†Z†{łČ«XC®H°Y&ß1)&°Ł d şśËň&}ń¦ĘśD§ˇ>–„3"ľ_:03Ä™ ""("©ý!Ľ€ˇ Q˝ ( ‚/YUČ€U*XÝD§U¸Ő\]ŐňŚŚP-‚`VřU$Ĺ Ńę UÖg VQĺŐ^ýŃjµÖkĹ dI"(•´Tt˘ÎMőcŽ*eYj-m·ň5ˇň4Ăš}Ŕ5¬†}ŁŠÁ˛†‰…Zh ÚS±1©˛řúŠ([©C-¸ü ˝ä±ŠK>˘SAµăĽFzÔ˙®śI«ÖfýŃfĹÔŚ±5ąp ¶§Ś*‚đÔ"H‚“µµŕ „*ŚA“­Ť$(ťŮšŮ"x ™µµ–ĺŮŚ™Ů¶řŮ řU"ĐTfÍXŁ Lî ¶UíŁ‹EZ˘‚UĹTL%ľ×YVŤVŚÖ™ŤÚcmVÄ€ ů}¨ż~ë0Ą, Ş\ťŘŚŚTČ XÔÚŔŚűŽZ°†jČň2˝ň*Ć ‘#ß ’¬ µh˛©)küC’´@ LŘłË.ÁĽ®Úą¸1:$J1ľ2ů´Ť‹ ÇÁN›+Řů4G1D•<]‡µÎOKČę)ťm‹“ÍŤš:Y j‚OŠ›¦Tďb˙ »ĂjöR¬Ź\¬›rŠ6úˇő @őŤĘjŠĺQYŃ”şĐÝ“%‚Ű%čµ @–Äi$Ü“>©[X¤'re·} «”M4#AˇâNoĚ•Ňë·~ۨ Š„óĘ_9˛ FĐHßA, ҵ˛˛ ¤Fµ ąČ®2«¸ÚľÍšQQ;ΕŽŮO>{ w˝G\4ŁĘ5A™‹ă›şş­ź™Â‹{I޸ÝŮm ˛aşh# *žúPôT·XŠ·pŠĽ$‚ă…’ Š‹—§ĄŕX‘Ő—6‚â"FĎłś ˝C"ÎÜ“&5Ľ~$ŤH€Ę1†X®ł"Í;1š˙Ô@PťY«FłY\·vĂá[ČFLHNÉ6S«¨sC"(ŻÓ;˝ădÔRŃĂčT‹‚C\ľ¸ĺsŘÂ`I˛¸ô›Íí5JéŁÉ]ęä.2T¤˝™+ľ¸\‘q˛Đş!«í•ę¬iĽŘ‹˙¸ŔŞ ąP!v¬‘NşČ‹Ľh´xť’ÎXăŽ6е†s©śŠ›b•śB ˛‹yúł@ ´BËĎǤĘëŁq–]¸Üj¦Kż cÖ´´Ő‰RvD_QAJć N~ó ­ ’ş8r™!kF(©: ś ?…Ż;:äş‹ ڞ+á`Ó,˙őĽţëŕ%:ŞXŔ¨ÎyQÔ»ŞˇĚe»c$ëÇíˇPÓmdB /Ľ Ő»8ŮŞ©Ţ±P›l˘›^NŠV‰ &0Ô& ›´đá§đ @˛˛/Qş!‹Ýć?óÝŞ%J •‰Ňp}Eę»k0.¦®Ö¬?ă‚ľŁ±XP†2SÉ eFšcŕ#§ľ O;ч~Ë_ňh„±ŚżMĂQłŠ5Š ĹjˇhňCö.Ú‹5˝Š3Â96ĹÜD2;Ö¸CMÎ`Ç­ř%ş)چ¦(î™QJ5ły‘ż)Ő–ľ_öe­éţ¨ ű¨Źş¨&® |© ‚–â ‚íâ‘â˙\fŠ8`Šhb^ŃŻ ˇ1¦ł´ {ZśŮâ$Rź¤tź)Wŕjôť%ť#_[bgčxÉ -şáĂhV´LW‚ş¨űE~C‹şN č€Iîűp/ĺÄCĄĆ‹!Ěu:]’Ž·“ŠŠžqśťäIĂÄž(#ÝrzWÓĺN #ÄKŠ–Ý‹–ŮčM•µ¦"^!ŢUdBYd$ń˝Ú ’ŇŠĂ’ ů˘ŠA‹Ś˘Ţ´x艒ć=ŹóŢ­ŠÄ(ĎęóCźRüĚôSß.„ŰĹHÁŹá4ă -ëPëś*GȵĚß~łł…V-Oµ…a.# D.ë:˙ĆR§‰rן:¤íěÎwćF´Ó±0ş!Ę®‘‡®hpśš2ńd†.ŐMśŐZ•UŘNmŕ&‘âáÎł\=-˛ń 2eş—$°C4pŔä>îÄE) XK TÁ‹Ţ»”'‰ďŚęcjKQk§.Ĺšű ŤĐPŤěĆĄ„´Yę"—Đ9]HöeŚtâ­,;2áĽů‰HřŐ$`ŔF(Ż6ŕ·˝˝ň+ß7°:NŚöx\艵\`ű:  śÓ…XÓ CáˡçRćŃ >]ěŔ]!ľ 6 -•ŮyŹ]”MŁ—µéăf ÚŠ} ŢďČŤH'Ź"iô’ňWA¸dâ×M!ń˙cD)˛’‡C\Vů *ęą9\±Ó.jćÉQREč^ÝŞ9énŽřY«»‹]Đ“;‘mënц—Ô„Éa.Kł†vű/OžÜC¶D Ňh„$PU‰T/)׋…˝µ…=î”ßY\oňýŔ „’꿍dâó¬K^eËÝGý=ČžÉáłrŞšJ^ዟ 'N\ B;dúc¬ śE ?®ű:$&4 ôoVHş! d€µzÍgÝô@^üÁb„e÷WĆW˝8DÚeŁţÔ¦0FĐ×ôĐ?ĆMą§}Hź%r%ŞśĐ@?¶…´#×úćÓaă)g˙¶r-Ň SKÓË ĺdđ–|Đx ź„U]–ŤŇçŢ$˧_üő ŢĹ"tB­~ĺ즤ŞŮˇäÍ*ÝŁw2۬8A¦+ëˇsd ‹ íń‹–Ťi‰—xF§ĂĽĎą1śýŽďdş/-HŤ" Śd+R,ŐdŐ"PŕŔFm$JśibŁŚmÚ$šŘ†‘Ĺ JDŇ& ›$m¤I’‰K—HŇ´Q™2e&mLÚTą‘ÍĆŤţ¶mÓ§m—5mŰ´]Ӧ͖S¦LuI˛őď*Ö¬ZŻnŰşOé?«¶¶ŮŰUÖ?K˙d}{:Vim[çŇ­«Ő€Ľz÷ň $˙P¸ŕ ˙5Ľxqŕż$@Ô$ŃHRJ$3ĘŠ•ńaĹ6lrćD‚‚D ÓIP XťE‘Ö/_kn=xp żŹ\¸DâÜąN<ŘďmĆt ÂoßčyÝl ˘0 čÍłO.Ab&K6HĐ´(ZtŁ4Ś2‚̬™‘ď/“™˙3ä@‚úeU’e-–-±xFB9’ŃH%4‚ćťÇĆ@˘Ń$áD@ť¤I„ŇE•”…m ‘Lä}(bP?‘řÍ6,:µ”5Kݢ”T»8uŤAvueŹ=úř#×H']‹-ÇŘcÎćX‘‰öÜs% I# !K$H4Ó˙D XĐEٱÄDdÂtf(FÂi$đ& I€ÚšG‚oŚů%sÚ=·ź’ąoÍćäsCňŐĆ6F^·św%W„L>ˇaŇyzaF™ń©ůDL4UDPD1Ä€.Xŕ@ťI‚ި"ŕzyFQ„ä1Řá­‰„ˇDŁťčQ±ĆAzUP_ŃÔ5şh“Ô61ęB­S’¨ä?;‚;.ąŕâşč®ş ¬ %xV\`‹ý)čťĹ@#Ű´‘ÝF/!al$XFŇŠE‘ÇF™Ąéf łˇŕaÎ q®–[‡&o` ‡gdžÉ{˙Ľgťťz†ŔX`ŠîŨ›î‚@Blźb”©Ĺá`#>K‘{Dx÷‰=Ń!Ş$‰g±tVpBy”Fixů…a#µĚJѲŔŠdaAN§ÚH%ę—×T^”«yÁ¶7ˇ6ßüCăŚK-ĄÍ¶~eMUăúsŐ>’\%]‘Ě5Ö?ű”;ůâěÂĺkD tŢc|"&˛Ęşyü×b$`™%ěÄZL72`# ‡ą™L¤ŕ&Ć·‰Ba~Ők\™űŐśo‹í©ťňHšŻrĐ:`'ç+ł^4‡PB .i¨)Š G´đOA/É—D[¦ ‰Î*Ë˙©ôŹôŞ€ťĹBĺŐkß>ŇyîW«|©i©[„Ř źbi#‘¨…5¬{hc‡Ęßľ"A6 ÷[ŇđŤ}îZR™QS˛8mH-uVşBČUĄ ¶°ˇ «b‹Yݰ‡důG$ĽµCRŽG·ŔŢ^Ł2'%&PĐ)YFć•Őä9M؉fř™„x0?JB ”÷2‹)Q8ů* žŕ’&@Lx!řSĽ€sťëĚ7u$ĚŁ’ăDŃ!)xH¤Yř´žNÁ­"WQŠîł“ú°OM31ŐF¤f4č "ůĎÔ:S [Ô˘U^ĘH€Ţ׊·ÍÎVů‘dŠXˇ aÄ#˙JU+‚6;[čㇳĺUji”…ÔK :Ď™^҆źíĂE©‘Sbô"kÁh‘řÖ¸X¨¸°üŁ*’Đan1ę…d±&TŠř#m Q/ĎAăťÓ›(–Îc‡ZâőJĐÜ`60ÉČÔŇĐFNň Ě:K—â@F0eęŠ(<>oˇĚiŢ˝ ÇÄ"ŤuLt×·ˇ™$(UYíĘ&šeš|"’Ó§„™*•4˝âŚDňW W ÄKů»©%5Ío“ť4X+»ćˇďy¤<ťˇ#>úŃUAđ)±Ř‡>¬[HP@Ąjy.b&•(ĹEşČXµ1ŁQËZ…˙ă´"C†Ë*;bëŽv(F‰ÓG¶(§ď˛Ä4tOŠQbŐ¸! ër‚i`˘ŔŞŃÎm5y˘@őÔ¤—-ť(x0îĄŕMŇ+No¬GQ&ѱIö‚ě?);ŘŚ’Y¨ú¤y«bĄaDG9zžŹ–%k$±5dń‘űítW­d~|Ů*Ü*@•˛4ÂX<´ň«šBşlČÁ¦ę%Eâ|5˝O¸ô±”¦<ĺo4R YčBş±®ö-â6đzĽČś6µ KLęěÄ±Ň ×/*I,M"ńźŃO?q Ápş¤& 1/‹Y @&ĂJ)) `]˙–Ż—ť‘9‰9ĚŁbÇęé—Q›AŕoË7 ˇĆ%Ę*łµ:×’±…4zéѤH2!ľ ŻŹ·xUĐK„|Ś•*K Yź š]ţ:idôrŞ×’ 5zYŤ0ŹW¦iZ\•^ )b˝–ßÍIîľvŇ]ń:ŕŠ>éxË»đ‘s¨Ü(Ć ’Ŕhk먶8îc˙„% J“t P& ł@Ě_ âyńY^•-źţ´ę ćśËŽĚh6Íh¦AěŃŻ$ kŚą­ŘőŁš23˲€D…Ň VŮ*Ľs€ö'µiwćČks6I¬5˙ă×"µÚHGFsľťµ@qv'Âëhó@ ž1–jK“„sűř궦ő·mX«)T± ¸ô®~Q3+iŤ W¸˛ÉjŢŮGäÄ+ˇRý×ŇEx˛‘I§éňREj Ię»M‹e–˘)+@ĘĺĽŃf ˇ)pA F@EĆy§mLÉîµ×ß©yŹAĚ2z&RŃDga[ݵ1ćjh#ó—˝`GĐ“‘ZD¨Ę ©¬¦®‚Čą âlçZ5¦`Ź…#vĹ\F@˛lG–±@B‘$×M? eÝĆűq’TÄA ‰f‡ ÎSaďX˙Ö”ęh+4’ÄŚÂrCI ˙AmŕaYl„H$a,V âĺ#áÇ5\+GÄ+Ę…ę#ÝëćÇů';!Učܨ, ©iBňË,5˘¤q ´rčČGř‰„ánlĐ‚¤@Jőa(Îz€†ă5 šTN+,väni€lQŤěZĂ(öŕµ>ŞˇŹzhŁQ­F5Đ -{©ŞaţĎ®Eíý!ÚęÔtĐL„Ýô„ô –ÍÔQYR˙áĘIśOmČ„üĘ´/ÍFD`ßuÜ|HPÔV ĹWŔHTĽŚŘR<ÓäČ‚.\…ç•…\ąÁ6Á`YlCUÜBY‚,ŘBLSéaĹĂ•¤ä Ç XôĄ˙ŢÄÁŚsÄŚ`€ÄLkdŃg„n!”Ę`üŐ‘ě•^É nŹa€ Xđ|ZëhÇCQš_ßgˇXĎá\Ľ^q_ěćŔÄ–qüĹü=ŰŇůa:[•ßů©ź6ś_'ŐTR$EüĚŻIM-4D˙Ô”RiŐ@˘P•-ť-DĂGabüYŕţ¤‡H\„Ť!Á§ĚDGÉŇ MڱĚǧÔGQÝÖW|>|Ő›5ĹXX.°WµŔI}ŐEZůČ5ü VäY9éśť´ž’śÓź„ëAĎqđF†™DríO$´ÖN ‰˝SrAáKGČ€@ ¨@ D “L˙ŘQÜÝ\ĽˇÉ,I˘ťŽMÄL â?š„u†-ř‡,Lť€_ vbůEUúÝź ¦ŰA–ź«H$âý\d´Yŕ@´ÂŁíĘÝ}bţ|†-´‚ţčZ)e„ŻlQ,dÁŚ’+ěJ" ÂLĽDJÁ¨‰0éV‚IG•Čf‹¨™2­×‹`K|ť•2.ĺääÄĹáËŕFźQŕß´%d4D˙M$HĂ˙iY@D™Ť˘ÚUmaHQMAŚŇě”â­ÜTŐěUE űĚGN O"QÄŘČ6ŤxŢŤ03ÁY5žVcŹ#Sň3"‘2ˇ‰ťb”É1Ź’Gôe0µT‡hFš0F“ “ěᥞ´lÉ{Ŕ‡yX p€”ĺĹČ^r°Li-QȨVĐmß6ÓčĘÜEĚÉw ˘G¸[e^Kv‘]říš«hâ˙ů=tR€ô’«T['5â‚,`Á0×kbbE2HW*ČěXĂěĐOt-††YµU4 dKĆR,ÝŠŤvPzŚŻXMµzUĐ/ľTd‹Th˙‹ ă¸řËYŚĹ‰Ĺ?ŘPWX…%ě%XŁ'sÚYBçC]őő™X‰Ů`ITbĺwŞDvĺ“tĚ…IÄ$¨É–4A  @@ĚĹHQY˘ˇĘ-ϦÖjńă+ń]I¤TŕĺŢÁÔÂ5ä.Ť&whHT¤MabNuŮ(©ťţ$d%ćfŇ íxŽV„Ü›JŢ BČB4HC,Č*¬ćĎ#ţZk‚‰­) $…K[`KR8E|˝™TäČ 9^X´Á5Dé“ÎĘ5]S ^žĺí ŔUEYSsžž®SˇťÓ’ŃóP–—n‡¨` ŞçNhßő5ˇő˙"÷8Áapçš$Ôť¤@VŞ^ ±“ĄŢľ6Fa(ŹĐqMÂ`†Ŕ$A#ČÂJҬ´J5]e.(&íÚ 2b D ÎN¤"€DC´E¨Ł˝Jb ÔÄhî“DU$t„ŤvĄFčhÄOÂ,Jd„z€É—”’$ „ÜxŻlŃŻ-„RRřbS¤P/šŕ55%ă…XŃ` b JÂÔŢ 6ŘPsn)—’ĚhÇšÖ \Gjy«@k8’† SúF¸QĎń\¸BŘp`Ô›điČx‡¨4íˇ\ő F,Gr4‡Yö+vÂ#ÇĆîÇőÝIíGD-D•ţ)Čř‘˙ě˙ý_5ěři6ř?XP˙™ĺˇŁelüĺT€ěÓ× K, ¤®…*Ż9›ÔŰěě‚L$/űL ×éĎL9DŚ˙ŢÖ¬6Vd+HC$Śŕe>…Tô"Rě›0rŻ˙SBܤEŘ»šˇý ĽĺMcআšč¤–‡f4źźÄ«lś±”¸‹áľŚĽ ďÄŻ^i LĚIĘnPÚŁ¤áŞˇ~€‹ť&šůJ“őG,lË.Ő"Č`™ 9čZĐ˙Ąźřm.wť¤ f&Ő€7^ÍzHMüE“ĺMĄ$g¨¦˙D„Ľ"®}FÚÝÔQ•ťGȉś ńŤ5,¬Â*TěĂó&m ý YĄŕśyĹVxC %]('4_qVaĹ .0_É&ů‡6ôŹ$8‚÷Ä«üT‘˛—éC´YC_&ÓM´ţŤ(j‚™T5lh6š¬FŰDş(HŘ–đ~FM9z—­­ttńĘÓŞţtkć(M´„i qśAî‘"HB-8ń ëT•ŤŘHKW|îB5y“çŮ 3U… ¦E¶X…9“{­ĚĚ­YÔ5ŠŃťx)ŘVV ĆÍśkmhVĂ؆?KÚk°ók !‰QZΑ”Dśw´Déă?›Ú«ißľ¤ ľúg#neZ €h^@U4Ä=H»[ů]č_fS…˙pč*ÝĎşBAh¨Ô•u5ÂŦ¨ .ÝÔmÚśthíÎün®ńŠŠśDHŚfµ]™4AúĐűHn/“ E[čŤř› )ăëUÜRälí-\Z8kmŇ-Dőä•…óĘ‚%Îek!﫞Tě@ń%č@ŹŮŞžţjÚjĚ9Ňiä…üjś±śüs;­X`°¤¬Ë;-Ô…5üpÄ‹’(ŕJŘněŤ-®>ŚĚQHÂeb˘&^*Ch°e/—ÄvTeě—ehGščbŃJFóšcŇŹym*.3‹°H—nvMŢĐ|FmÓ”´!Č+"/űK"  !˙­¶4…/3Ť …·PޏčâSďPXt…âČ‚7±A()÷j5öDɉ ź_¶Z:%Ç=ÎʉL:#Ćčz·-LĚFóŮží±s¨4@s`XaŚĘXY’X„ťśđ ÉľŇ^‚7Â?T¦?l®$LĆ—Ŕ…ghw5X“ipAżVÁ@BDj&§_,@Đq«ś$ł([Mˇ¦Łˇ˛«Ś 4FäJ§´ô*Éö+ŕĹşŤFBLNM+@ŤHČöń"ćůŢ˝aËQ© ±Wőn…Ŕ]ą[łŽA)Ń ¬C™§»˘ĄžHŠzĂDšč1hšĚ7°€N楫±ĚĹPÔ˙.ôü7‹ýĹwc%ąú392Ł,řáN.h›LyhřS|˘s5¬Ôi8T-ŘŻQBú• Ä ÍΗĄ›ŤŢÔ¦šjφ׍B‹l'o"É[•…„°`Č÷¸xď’qeMtŐlš ‘O1ľ)“T7]ÔY.Ť öRs’v÷Ř:ÍŤeţČŚCăTbŚwś1Lśśłs·ż†ľľÓŠÉKĘĽë?8ˇ%G¸ęËíŐ9ťăÚ;V'ş6Ô‡řŢÖ”źSĚß(d ›ĄG•»q®‹ň–AĐe:¤ůqׂC§ä­’PŮn"…ŹmŞbÎĆ s/ä’ϨsjgŕŠ1łTD˙±+ÓW©`]Ü’Rě‚6Ť…ˇăĽ}9;—FŹ´CÇ€—÷\·L:QÝ‚NÄyXĆÄA-}¨@“¬ÓqĘ]˛L:Ń‘v”íÜć•důܡ&8p’@<Ë÷@Â@T? xÁ”ĹęW—iŇDvxH¸–)O,řW¦úńÚbRĐ…lEęş­č~]Ť¶zoäÖîK\ŮËIčDŇÜ–h¨'@$AŇf $IŘ´iÓ¨Ť¶}ű´i»ń𮉻¬IÔfQ›5I¶ţ…)ŇÖ6m˙$%I‘ÄMÉH!myrdM›7qćÔySź?€D€ „P@RJ(eZ"˙ŔS«!Ž:Ť €]Ť.% $ %@ m™ h‚)‰%H0ÍʵhWŞ]µőšiFÇú<öh€Ş†{:9h›mH"5Š)aÂ8l"ŐҦϟ>kŐb5JKV5[ѬŮ–9ëĚ .Ś«–-׬kó¶V«ÚéÓ˛‚·®mÍ·µX¶€'Ż©ŐnYµj7ŇÎP{ćŰÚ۰I#>!’4hÚśOŻ»Ńîö±$µÂ^aš‹D’?‰}$8Ť¶IP›’"2i"“8ŇƤŹpÚćţŮĹŤäC—B’D”l‘EŹlyi§Yl1¤[(‹˙ń§@ŕĘĆ­"+ )®ş‚ЬČh¬*˝–ň ¬Çžr,,¨@(…TB"$ÚJÂ-P2ŻĹ¸bjČ Ť,’«Ăş)H !4Ź´Q°¨ĚŇQFĘ,C‚;FÚ`DµXFëSm\“&–H©Í7ßb‰Ťµî‚s®ijqşA#‰$&čśCnĐŕ­f{´©‡ąâHŤÍ–á¬An·DŁ9•ÓFôÜ®ŇöT»-·ůJ˝öjď»íJ# 4ĘŻ@’hÂľ¤R $JđÇÂ;ÚĆ]"şE#kuŮ&’yŠi[Ú°DŽ&RÄ™ů(EI^jăI\¬×Ţšzš3F§°:˙3+Ą¶Ę(¤ »ę0¨ÂDa!‹ÉŞÔ¤2Ë,§´’Ę)›Hb,‚{KG/ 3¬„Âx$ „"RHSDZŠL+őť¬ÎF@S­OP­Ń‡4ťM‹-Óç€S5;N‰čç°ĂnşŐ˘3®šVű–SĄwNą×†Ô6XW}<î2S=ôrSHˇîÚ«NVíâŕ® 4„=Č­Ż P@HHĐ$kM’Đšľ#ĘČAu+”Pźo’Mˇ‰&ćý&$ ż) ¤qď­ü^[bŽqá…›˛Çüüă˝+€ąr*ɢr2‰)F‚ ,Uę‹LWfę«IpŁ âHB­4˙›&Ú@˙ź Pł„8żĘ+sˇ,CC’HuM{ňŃą´ŇF#;ęÜcT»ŕ$iąë˘Y?6{NÔ©iÝ“µjŕŻFÓFZá Ňëe´Ű¤fOש rŞś÷¤&lnCnĐ€„¦ˇW•’Ąl6łĄá<ç)H0  $’Ö?$T-[H¨$ű›.ţ¦ Kéd!‰Ă.tń‹ČY˘–óáE˛Ťé0^9ĚSţe$…ě*„Ń‘Ź&–˘@ĺ陬B‚¶PI?M8^¤´ŁčmĹGMq ^—¬×ˇ iL‚B`%'ˇHÂÉä (–‰Äź2’=žílÚ; j˙XĂę¬&mDT˙:ő´čŤ€ÝMüôwŔG-h‡jÍ'•śţij} ¬_xÔă6†Ř‡@Ü Ö‰đ ë§+‰€âĺ2 ęŰD"‘]ř­oó’ÉNla‰$DBq°…ă€ÍËńQ(áśă°( tbŘ›ŚH”0I,! ] Đéş82!އ’éF·Ľ´L© Čc fÇ„&°ó3Xr•´4î±II ćOŞw¨jFÝăřlťćX퀱h$ó3RF§”ÚÖöČUˇ ‘š"Z­>jťZDăKsdtTĄťZšímb ĐŽeźł5@ –nľÓ˙D¬‡űa‚¶±lýRÚĘHF"$"ťX¨&Ь‰?¤™Uťäë >ÓŔř$¤i*R‹Ťä–‘ĺ‰(gcşr•őDÖ$™ĄÎ/K)AŤ„0&Aź afĆ”érJڬ_÷ŘŐ:цk‰˛Fiţ¸Ř5ďŮ_Đ’ŤX´/”iµŐ¨v; -ŽĎHu*× ’Vx:źjLşŃŤmVb3Ühšdĺ’—dŁ)źőSíČ‚µy2Ű}`ii$†ÄÔĆ.&’BÂĺÄŞ"©á‹BB“‘÷ şIwµzuuFŰäŃŽÜš°÷i­Yy }·˛˛–˙Ů®U´Ż_ž¤OŕŽ,«ó’‘…p‘ť˛cgŞK-é˛-rŃ Ř €ę9˘R•b $®ăa—F"}çŰŤl8% ýŐb»Ôˇ˘V?‘¶öĜҊ}&›ő­ŠSíc`p2‰ľAq¸:aŁ`My…ą˝Î2.I¸ko!i,b˛ ŞvYr–ń!W $¬1c١u÷Ţ´&ŠnĄŃĘLw»(–ń+ËS“>ËjNUĺ,Éâ˘k8ęç Zl¬Ä‹,·,Ź˝“EŰmĽÓ®çÄş˙VȱüŚ# źtŤ*N‹KăóÝOÎá”ÓŚJYTĘÓéß"łÚE’oPËöŐ×ĚVŃr=·Rí­jІÚj=B50Ň7kmD#_Ö…ę5-7Đëxn$´Ń†LŽÄßh„2݉–Ŕ„^Iř‡Áé}ď{ŰBúö!ć2ě“mé8šŻ ÁÚ9ŰF›dcZ6–lşő)MA٧÷čč´¬Ľ*%`Á>Ű2Ąű¬SbVj F˝Ř\jqb‘eŻ´‘á–·Á‰vÔG)¤ÝoRUŐG[iČĆزH h­]«Ą}VŲéHl˘‘µ…ÔÖQ{%É÷m†'n˙ ĐxzŐ«ŻŮ–>Ëz#Hs#Ą0p±.Gb8g˛HBmFľo!.Š«©Ó:Ő0z­0Aű¦U+'Ä“®HTqR>6–L uŹa4bčĂčĹôWD—ĐbĄŕ…+*I#SśŔ†Áę§±úĽŘž”%ÂJĚI(HY`7o™FڦÚN¤*ČŔÁÇW Ü“˘r«¶ę@*g¦IÔ«  ­A­ŘŚÎ{Ťš×ĐĆŮiŰM« @g»'Ö™%q#›"a„ ˇŐŻÚ čN¸Ě#¸Ţ†•Ľ!AüáAäZř†"6âĆ 'ĐëBZDĽtâ0Ż&*/˝ nó~¤s˛‰›˙ŘŠóH2v„ăćK›Ŕ"äVĎŚÔ G°¨îŁböŤň ڶڍŚt0—ܢJ|ĎI ř*ů¶¶at¦űxƆĂÖŢc7feSŞîÇ‚ĆěAP#“dAţ††Ř‰5®# SăčÁŘű(jSp+fË9¬a× Ą6ŞcěŔ#!đŻ>lęV  ŰÖn âô=’@öîş\ďôLp ďZä»Ňk·jó~b*pd¬ÖjôBNݏ‚śH¬Ćę0Šbt­tô«HL†-ä¦)Ř‚°tp‹†Ź°‚ç´çô㟤ć0 gşG{ü¤#¦ăúĺ[Ej*J::e ˙_K ¦”C^ 9¨ćhŽń=^8J…ĹîG:út ´`-XÂ;hćÉÎFÉc!đ<řŹYH@§X)‚d‡Aţ†A$†¬%,aŞl‚&ĆĹB &H‚$2Ľ\dďe˝,±GH12ĘČcLđ"ŮĘ˝ÄĘ1&N`JîKĆ*+ ť”–QaCkÂĐ×ă9˘Aiú^c™Q;bĄâ‘!l‹µ‚ =Ŕ(‚!˛Ě<ĚCÍ…ľÁşšŞ× B˙¶AŞě%A’©†Úlá"AHŚ^îmÎŘL&ä…\ŘŚ&Ú€Í,Ĺá,Đ6ď‰x¤(&˛(mwľ˘Ą˘H@Ż`Âb/¨âMŇ"ö°éőĆ„%lźdçYŚďb¶ČĎ[Ń-Ł n’ ©#ă|ţ¤8rR‹Ci’ńúJeˇ:bל#€^«UŠŁ˘~sŘ2S˘“5NŮbÁ5Ze×ĆjDKS‚ĘŰXË–Ţć>tęYBl„덞 !‚…ŠÝĆĚŕÍ^´Ažißd!đÍ2d^¶ˇ1—‰áÜ%DV( öÁ2ň3Śé‡>0"ÇęL,Ž­f"Ý©d†äFJLzw˙ĐJ®:Ô1|D`ŠäŤ".BÍ‹f“ÂŇ„Âd´-´°ň 7“pňa40 łr2Qüa¤Ď4´TxSHGăÄdCĹŠ’U2~Ĺ([#ÇŠ:t#µdé˙EP`«ŠsTšĹ¨¤!+[c“„fبpS* Vjj=Đ  Ą? K§Î&{éć˛oŞK[˛‹©¶ '$q' ‚ŞJ"΂ČB,ä»ŐnAdÍ ŻÎr/grFC2Bo­¶©ôΨC¦_D”H^¦4-0N1úB"}ÂÓB­Áz.Z’FeUMnÝÂç|Q|t|´#´çG­!Ę{ ‰92˘{¶ˇ˙pć:“T–ĂKÇń€ÚÖLjĄšC;ź#¶ Ł`i’LJ“`J^<ŕf=uĘ-×ă·B˙B’ ÓÍ+b%ä[2P$ç4Đ)ń_GbBg’2Ýjâ\+ŕ 2 mt m392Iîsŕ„ŠĆ˘ôŘdeâu2f÷¦DoU—@‹ŘÂř(ě>.•&á©WTĹ&]{Śuf˙Äű¶sY·'¸g{ęˇ ßç4čÂu€î‡Ĺč/mMĽcV`ÍĂ–mSđ¬čćZUe7.H¤˛Ž;:ŁÄĆÎćVÄăđB˛+…V(…bHîs«b‚ÄH –%“B V˙Ođsvg#ćaIµHp§B ô>q)¶DsÇ'H€ßbbhFAVź$FkTÁNVů|'w5śđ yóˇ–µO¶Ôu{LĂHe óaXµpIˇu źÓ®×Ř/µRŁ]}Ĺ:xiR%j¶8v#Ä“SfXl =ŽLOÖ17ŕŐ!€•od"Đ ×Ö&0Ď?Ł  ŢL_ă6˝ ňd5•u$Ö#6†ŻB5H0n1:34ađLÍKxP7´kőIB–6Ż„)*7G1łľ.XÁ'gŚTgT¶sµ!Tú¶Đ—Ő8zV óGsŹűľĎŘhl”nWÚ˙˘fx˝1lđD7zĂj:¬Ă6…ÇâC‡věň. ˙Â=ä2…¶[2B#†)††Iđxb‡ObĚ%ě`ZŔB˘?yâ{#S|˝Ę,<†ĐČwŇôŞ12&rT=łä@Ż7re¶iCSŔ ôéx,r]’ÂJ d‹çhJ†GˇWź° ˝ÇX#g‚•7GĂ9ľĄ8–5‚­ˇ"XgL7TŔN×ŇĎ8–9śŁ;ő ›:ô­1XcYPp•˘/¸Bâŕ>Ţâ÷fµq‰Žő—JÚ@WřŽsň8ŠC{šĎfcCž;×űjA‘·~LWP®OTęˇH˙µ0:[ĂtŤJµC<ö¤RĐ@wŤfJCĹŚr8 3;Ľ–zKÄ.…™¶Ö”ńWĚç;Äí¶"u>ůŞ(Â2'äšŔ 4Ed™y:«–™™5’őJŃoÉ‚‹7ňÉ÷FDT©÷b/*Ť"M† Ü€qËąś@dă¸d€}Zůžđ e« v5šĂH‰7ťgęžťcűöŮ­}¶8DěÜYTt¶#˘s!"…ijá|Úyźµ8DËiK°tŮž¶U‹‘ÚĂ! UpŞ‹#Ôm#Ô|&öÍ-!ń,ä[D{Îđmâ§Ťů#ŕ% ,2ŤAČŢ«ndoű˘YĐ2ƉöĘa[ű«Ţ‰1$*J ŢBÄ+LM(¬H–6y.enß'*}“ű7°S GCg»ĎJYćZ8ů™ ź#âK}Č!iŐá'Z!,_¶tńhů“_°·Uka”JĄäPÂZ¬F‘"%jË–µj±bÉŞőĐD e$č0V¤†‘eÔذaŁ‘±˙Úč۶M[ĘkÚlic™Ňš.–Ö¶Y“dëźÎť{ő´í^şš˝†µgďÖVoˇFŹÖň鳆\›@Źą“÷N«–µŘ­-”UMZ-‘?ÚŞ&Đ–ĆŤŕ?ׇ>ľHFŃ{Ź>äÂď!9\żQ€ ©7ĐF˙µ2Ő6ßhŁ)µÔŕJş¨‰%_éÔFnč˘USMő´Ď7>ýóá…&ž¸•6¤­ČâXr±Wb‚ĺU%@X_Đ%Xʇ±ĹÖŽwůĺVl0ŁŤoyÖMLVYg(” Y HHF źĐb—ĄmÓkމ©\-ŇÄź5ĹUôÜlöT^rmĆňÜmiň7Ň~zÎŮJnz˘Í@ýEłP Y4R#mP›-’×™ń©9©5 yç]oöhSŤ™ÚZ ŤH F±EbQóŤdJű´d“6·¨$M ^“W%ętË®(ţ ,°·xI¬hmŮ…\Ęâu^C* ÂaI˙Ţ-`n%fă]%¤‘Äc‘};Ů·WrF. ĹžK–iŚü“ĎjbŢćťtč冟n ťiĎ~ů gMrčŐöŢľ­4BuĐEÓšŢé÷¦ž"U ˇÁ&R#l¤ÁHG¤" ‚±ôyŢÄzÚivĐiŞś@¸-TjA 8Ryç©[lîăŤ7Ň!tŰčbÓ„AˇxKF‹tŇ_©nÓbPŁ‘kaVăub5n=5}Í5äŽAJ^$ŃF†HPIdśeI%H8ĆĄÓ窫Źt®eóz®Eó©5†bçg6ů¦9iśđź ű)„^Gëč™ YNqyFsŢC±˙Tó˙%”Qy˛ŕ'Ţ™gR[¤Áéló řC-·hÄ^,˛ű‹$'˝jSńZł‹tŇĄ´ÍS(~“DNJOO˝NaŮíôÔwÉUu†­łËţ-PĂŐlŮmE]ŘŮm4Fr'ĆĹiÇďXŤŘß˝MĘŔř´GpűyÎĺô…śýđ+_vş l<ÂŘŚg ŰCR Î= <Şj],RÇ‘xĚ!‘„y&*ôHjb±YE4ć2ő§=ˇŞ™"Aź˙L<ťĐk’mx%.‰^˘Ť™hCÚJRlńˇ¤¸ÁC;iXvÂ<5hDŐ›Ţ6ö—=˙Żé0Wë‹©fµî%f/‰ŃÚŽ ¬Ä€€%`CÚš†EĹÁeMJŃe4”JP,OÇ ¤8ÝĚ&ł!ˇŕ“šzĽ©asÜD¶SŤňč 7ŕOëJH’Ž-*$ Ě`غЅjRŻŰOCCŚ|,!€KŹ%¨śŢŤ.$’ĘŽ,ô!˘#Ť%łB^(”•É"zŠUZ˛śH"mV1M$¨éś,Ą‹J»ŢĎő"©Éń/Ěßö#-$y}wÉ q—đ‘`(mČc4&‹4¬ ˇů¦—y*G(*”ňČF¤ńAűTC:jÚS¦ °M-DrË H.µĘË5˙Äc}˛YyH2Ăń°,?˛ H˘bÖ;OYN;·ĂTB®6\Dc–SŽÁ~—őÔ‚f ‘ĺCÄĂr ę­x“Ę=&cZ÷˘%Ůşá[ç[¸F7zŹ%¨ ©ą $ś´ l ó^eÁ_z˛Ďí1ܤ’§^¶"Ń€ďHzH‘cDr’óiI´Ü†D([Ů"%+—_kGl9×D©ďDÜAŮ=„“&íçâ Lťíöľ­‰Lb%Ü­čc'ş°ČŤC ę/Ţ:{vą‘Ź¶&$ąyGđ4Ź®‹­đĽi¦ŃuüśeEˇ! gwě±X4ClÝ˙ÚoĂTČWM»˘ÚaéˇČÓ ¶.QhĄ-6PVi;ˋڲ~µC±D]LŮ'˙c©»VĉRů-ŐxUŘţüç<Q‹ç[ ±AWń Tu!‰&Č!\8¨G=q‚·0ęl_<É GuÖČ\! {ÚťVńE!ăŠŇgňH’« QvdŹ];óŽ´ÂS*tĄŕ5źžS{$%M}B¦ž%Ę@nĆ€;©a–¨=‡ĘeŤůx_±śĺ>HZţ¨ŠŻßŃP“¸<č\#·Ătž_‚’8 ¶ ’ŘĹRŹžřĘěŔÚńÝ›†#»čČťÝó ×÷»<ßn¦!B=7ކŤ˙=Ű$qi3" 5‹€Ô†íOCUÓocy¬đL[8žĎ=Ř”Ňü@P˙'u;Ěf`¶a#t®ô:ó°ÄkV`łSyŁ Ż˘D0ˇu ˘uŰo<±D‘đ3mŕLa ·Eź& O! –0MÓ¤ËÇ|_ń\ŰÇcU$6Hj”6Ĺk't±pr ĺCŽĄ…BĂq’gQ´ó°IŰ[™eR|ç€C/§b ¨BB>)ú*ścJćh}ćJ˛Á}’aha)ÔrĄc{<3TşÇ{ş§ RĹ(Á G»p ˛P"FqR%UÉő3¸4:xWoˇŽ]'P¶ečń‡7/::ŮŃ…94m€Łt/Öµ00˙`˛ŐsL¨2›U˛¤YŃQľ#Y±AĆ†Źł0Č/1±Ax»g q˙pDEô30±<â˙¦E(áVJ0 \a 3ĆŔ‚v’(ŽăŘ%$ }" Ń7'—š¸0HšWs$QOŚ „ŹŇW~©8_Ŕf9Ń€Peá·„â¶lަ‘f6U0Ă_°ľsŚźł/”Ön“ˇ3~č[»ç[Ňqi4±]!"IPIđi߸UGŽ1)“_’2g)ޱÎAäÚ2éQQ|ć1éÇ÷8ZýgaĂ…E lXRŚĐ/Ň)§˙Y=GyŁĺ9sfbŐ€ńP•#fÔ“ńKŚ2ý§ŽRR˝s*'á)qiĆcLö¦uL,ßnU.ŮEá8“)“őPŐPúPµqÚĐ0mXC¤ŹáÖăQ*}B™C2×~č†*µP CK‰;˝Vz uxC#aG9„u©rk‘g‚(8tš91ô±P{̇ âb"i¨Â—Ĺ©c€‰ś©.8Ů“ůQ*$†—BKĄ’J]Ř;ʞQ%řäaňâ9úĺ0=Ő ¸Ô2'öť`«”Ź‚ _)8łS ő"(¶É;¨˛ę˙C*q[/ö@S+°’D'iśßXÉÉ ’HŠé;µť’DľAJ†xщ‚5ă”ý÷WšÓ‹‰s&ŻD2 E1%Ş3Ś!QP3ˇÓ:5E(SS¸ŃW"Tg*Ö 9Ä€>”Ž !B"Ľç;+’¶DÉ” Ćé| *ĄwHű 8εŠ€&ŁÁ1í6B$Á*g¦ ‰f*Ö ˘ńz÷R)`6K'Ąš›×=9Y!;”(l80Ú&­g2ÂPđ9qFÄ3"ů35Á{ň¤ ę—SJ©TÖűŔű7;™ yc8ś’93Ć™:%™R˙mŐÖnŤPs=čE)D "ćH”8J0–¸«v ‘^1*őr±8±úJ÷±€ň›gřš!ŃMĹ tą¤ôĆ<©fĄ•Ş­“¸ ŚŕΙ“ůÂ7°! ¶óJGř8U‹bG˝¦Ş‹2Ź$1sQQ†ň†ś†ç1é)µ ڰ`Rn&•1­@C+•:ł7K-TŚâQ/Ƕňâ€h‡ça 'QŤPŤŇĘ łBś×Ę—Jń>iĐi62˛%K˛&;˛)‹˛(‹G%‹61ű˛4kłjP˛N!nP˛Jđ>n0ł@űł3»ł4«łhŁł9;˛<Ű8Ű>ŰN˙Gx”´wTO%Kł‚˛3K˛+ű˛'‹Gďsµ,۲i“˛˛  „Č y“'áŢ‘\–bc6–­Ň‘–i) ˛` |Ű·kB±·~›\~‹DĐa ĹÄ[—˘/·ą•{öV¸Éu Űń·–ŕ·~{“ą•–v;·}sŰi‰‚—2ş5ńÂio6‘–xk)oyLËsDŠD*a­ jßp A ĚDĽű»˝ë»~ĽŔKĽĆ[Ľľ  Ë‹ĽÂ;ĽĂËĽĚ«ĽÇK˝żk˝ÔëĽ× ĽFTÝ!Bô 'a ű {©«lË Ż’¨ĚŁĐx[A%Lnë 㛨Äý„ż÷‹żú˙*ĐA¬ÔŐýŐ-üŐQR%4Ľ(<ĺB-Ţ>ěÜMNĚâ}ÝťAGE¬Ö0%m#4‚iÔ,‡Ń=pÁLC\°\sôSÜhĐ(.Ř žšçŠ2ŮŠ‚âH€ÉM?‰~ô3 zŮŚŽsî:óWš}M“ŤŘžÝ$hÜ˙G· É{éŽQsú~‘ kbűČZbG˛ŤŘžGmň. ˘Ľ 2++»môĐŽ˙ÜV˛î-Śd>ÖY-ćáÍŢXÎÂT27Z=Ě!lí"ŚŢ¸ÝFďěĹíÓëőśfÍÖm?%oőNa•NŐujAR{ţŽ‘úÜĆľń(Ţ®›|?^ëď? ]s…N0ŽCĐ‹~MÎk„Ř“ľřĎđ3đ[<⏡ŕő¤ř Ć®űiG"ĎĆMb1÷ÓÁéşC:EĚŘë»çŔ: ľ©AoěEýß` őŔÍŢ‘QĚŮ­őĹlĺe~ÝĽÔÖľíZ]Ýa_îŕÍŐÍźîé=ÂÓţŃëý!,ĂO]ެpÉÎbóNč-üťÍh“ÉüśůÎđŁŘŹ˙šˇŘ‚>tĎĐšŚEjÔÍ@Ťl#°`Â6hĐ´a“†ÍD6H(¶A‚IŹ“ A’d˘F6m"YlÓ2%ÂFm`räX˛¤K•2S2ŇÉçŔX‘‚"DsPh¬Xm´íۧm›6mÖvYŰö”Ş-§Úlm“dëßW°aĹŽ%[ÖěY´iÍę"$LP p[—Eşs‘¤`’ÉÝĽÝću‹wŻ`żzçN±Ř±Ţ$Kž‹…e›tk†<·-]ą%űĆĺëV®ĺŔ‹S4&Q€ëB €mÜ@Č ÷nÚBÔŽłÍ5€$ih¦L)ÓůD:#’ś˝aĚ˙ŤmšP$™¤"sç#Uä™°˘Áë8+nd‰f;’4LĐ$©ţwď#ÓŔw~đaK†ÄÓɤšlŠh#ôNjD–Hd ʧHĐŠ  ­©FĽ}¶ůŞk˛ÚĆ]žrĘš¬´‘DµRTqEÓş†.Ľ3¬ $ZĚŻĆLKÍ2Ô,Ű,ŻĆYăË#—J!•€‚P%6š ‚U“7’9j™2ÂŞ®pę“â¨oôiŠŮ¨žÚ ÄuéĐ–®ÜÖł´‰ś°ŇÄe.Řúaî㤠Ť 5ăú ś´"”«Š f6ó#n‘dq› ”,w/‘¦ďzŤoŘ4şŇ!ĚtpMšX€4Ĺp7¶q˙J%ę˙ FQL2¨á=ĚéI’šxgeÝńË:˛ś44!$Y•M”—©šÍ*:Ô‹ …”†üä‹>IbJJŐ’ým}¨"Ô&ÔXآÖ°†­@ [yMCYˇ ‡ ""@šEü#$!mˇ&$ ůĘËĽ6#·B N: 0ăx9Žq@â$şŠ4Ż’ŔHoĺ˛`]FB—Âéę`HP€1ť©LżI“mbH¦8ŮFN¸y  ă” %% üô…DPóGŁÁîAKŮЇę76m(Ô*#’„$*zŮjU,K¨”›\P€·˝„FŁďúl`ćµpµë^źőŰ˙jq4.ÇćŁ~ ­"˝5ÂyÉ”0‰Ô(I–Ŕt•62`HW›ZöfLĄ“ÓOMçÂ49Â8 MNrL/†¬<ˇTyR­nŹ©L´É}wĽý€ä«čőMDrňE‚' [#„Ö9”ŁLoBůäH[F’»>ŢŽÖ™@ĘsˇŁ!a{¤Ş#bQ 9ZöřÚűI"Ç’ˇX‘D%öńŹo|8Ä q‰I|â§ŘÄ*FńŠ]ÜbŹřűřĆŚkLăoă‡Ě oUŞAĚQérEŠmiKŰA *¦łŔ•”÷Ń Îe‚Ş©Ś|‹%!łÔ0’!ÜWSl®Ä%S ˙şá„.8¸€´›6$Ç›Ę9Č9’]ć\5z›R™ď wź­˘dÜ9Đw4‚nl'QĄ$„†Tńjżćă“QŽŇ÷!z¨r0^¬ŹĄáźŐŕ•LŕG«%XŇŔU4ęŤ yă~ŽŐŠŘÚ,§DÂU®jBr\ő‘ä”$ 4JĂŻ{˝^ĂÇŘÁNv±ĂÉěa+űŮČŽ¶łMí­öúż7‘[ü†J€ńk¦]ä”P«ZÖ:ůn3L ňRSr%pݲÍÝNJ ş%‚•a©éő–ŇĚÖo‚O_ą94őF—cbó›ry›Ű8,ş€¦Ű žÚ‰Lz˙)OUť‰˙?ŃäĽQ¬7]Â(Ž€ä#Úl¤řé‚.Ä»Ť¤ÝyGŔ^D‘ĐyHFXŐ5¬ő W¶’Ł@e"ˇŔŃ`@­¬j8µp,śHKY ŤU$Q]KČB•čJWdQvüť¶;´dÁöYbí š»ÚÍŽö»["a—…%Đ~v˝óÝír|ă~öHT Ąóö\XŔ„0F6©âNŰ#y±ôÝŠŮŚeçŇN)2GZŇ-‘LYŰ»Ř;OµíŤ 悱ytżXmfٰ4Ç’ö¤+lZ—Eś0dzŮîKvJ-­wĂ„çó2¨Q jR˘:ŐisH˙ލ"t#â“ňĘ3ŚŐű˘…b«8Fk˛“Đ;ßÎĎ©-}ŽŤ:ú“ňŹaÉď)˘ ‰üHYč  ‘ł™,¬ÉĘş?ň?ŞŘ†,‘Z >š@‘@‘@†şŔ®€)Ő˛y ą­o!˛żŔĽ!9·Ő©"—×Ë7Ď‚ ’ ż€‹-á– I%¸Č~á–Ź!XBł˘‚’“׸ #t89i!Ú«7©®_++&0§¸3Tń‡Ř šéžŢQ"ţx>“ičC™€ŞdŇ/ر/¤¨«ńA@!FAŹ>ˇ/‹¸#T«ˇ€#‚¨IPź*l^ ¤¨¤˙¨6 ¤I@\+ŔH 7ŘŠ°şk¨ü±ŞĘJüQiI¸IIH‚FŘ…H°Qt…Ú@§®ë#úI–łéżé?®;›©›­PčĽŽŞś¸X$ŹşÁĹ;7ĚѲĹ;—{á­Ę©ÁŹč‹Ëq2#C©Ŕń}áĐPFŐ Ú˘ ĐH’-´­mâ·˛’)ĎŞĽ¶ô­W*u<“u„¸Ů(ˇ8!ť‡›˝3‰“6ۆ„i‰ť‰ęx9·‚ yâ'ę!g’™Cë™ůh˘K)”cşÇáó ˘9 ŕĂt"ź8h٧ “č˘u˛Łşę“…HD¤ř">Ů8뱚¨a–k" "`*Ŕ?„bI«ôż!‘ŻS›F Ę…ş6(µ™Ä®˙)EüiżÓÉ®hµϮРä?äşfŮ eéż§LĎô,@d‰OfنF8¤Í*ĆŽB%( PÁ ˇKú sC7Ń»ŚĂ’)k¤i, ä7w Ą˘˘Đ˘"ŢjFĆÉAĚŕ€ş Z®ÂlG]¸Ů¸Nר.F‰a*Iń;ʸŤé¸šHiHąŹB,¤Bű‚*G!Z¦-´ŻŽŮ'>9'Š/•đ˘Ă¬tІô™šZč9!:CHAäC™Q˘4 Ç$Č=*Ŕţ[ʮۅ´)n[D§@`‚Jöt,8­Š¤E$‘fŮ??˛Š@Ňżř‰,ţ˙k–>Ť@čd‹S*-Eš©Ś* a’ŹęO"ëŚKŞ›}ÁÔÔ€śxë7Ô-n™’’ZePş©˘ň‘Ń`©Ć(€WZÇ9qG…CŁ"B…CB7“Łę `"€BÁ¦đÁŽ-|ďë“ A&ěŕČX Ízňá“{üˇÔ$·:§˝’ÚDŹ8Ȭ±Ö¤+H0«šSÉÍÓ$8x ‹q 2UGÇ$üĂŠÇŠ¬¬č­űş›ä?ĚJc›mřšmEó ·7j˛ÚŤ#SÁĆ“KQ…˛ł”ĆĂů1żhĆ:ĄÓ’zś©ŃȨe¬ŚM}ĄW…Ť˛%$썢šŤr˙”“ÓAëÓčý  ĺy"ě8=¦:~Ň>@)Źá{'H…mMC¨Š AĂźÖ;â!Şť&m…pĺC>ŚŠd'š} ©q„S,sG]:žbˇ@[|(?꿯sł§‰Z‹Ż„oбŻ$Q 8ŐŠâ𯄯0ů9 mř/QôźF%ÓŔK¸°Š] ÇcÁ%áDâ‹Ü›E©`D’¸Ě·ŤŇ<ú¬ĎؤW©ŹÄ¨\+2)iŚŘ@¸X­ĄŕP9Q!"Ž1‰“4éUä(Żí‰łůŕł‘řŽg-ÍsâhMşßĽ>(M'H3>ń8Zů˙˛/Ě„4Zy„đcÚ:ô®©«ĐôÍěj@©HAŹ4°#LúŤ§ŔżéE…ň#Xä p„Z#‘°¬­ĐI¤<ĘkřťĽĎđÔIé V$JNä «+E7čšm¤ĘÂË2‹´![E¶¸ËiDţU’ Ő ŮUáoŚJ $ů—ę-íhŚKj) b$N-ńŔ`l ÚHł]M®^ЎµőĄ^š 7¸ë$"(/Kj‹›ŮLá– ÖzÚł8€Ú†DV욨íČëSÍwÚÍŐô˘őÚˇa(~Ö7âF‘>Z”µšž¤p“Ń7ib8!˙ ¤5ĺS¨¸ !Â]\€’»$ر˛C`ł7[¸Î&°:Áź»[¨ Ó…e™°[¨„b‘ťĽäł¨eńÉŠÁ‹îËoąV•b$ŰJ·’iÔ­_î1xă¬8ktA ›H øÁÖ{XM’ĆŔqŐw”U•…Ť•MY\őś7!ťÄkŤm‰bۦ”§ů/-l¦„ř‰vu‰ř˛4ĹÇŚ#×¶Zź#•´ŮMúęˇč«á‰ZĂÚ±Yş*ç¬ň3:ŁV8ŠŁH…b"TÇńŤŞĐ1˛µ|EŔ¬ř:˙톢WżU‹n›‘& § –a)‹}(Ĺ˙Y»l)©liĽZ·d<ąŕ .Qś†ćIňŚŃŰTşŚ€)h¸+·‰Hýşp’˙á’áŇU‡I3•%Á\Ç«†&FŞÖ@6a +ÉŃ"ňHˇ”îi mK/«%V$mŁE‚•ďÓ^ě]'8rč˝^h퓏ĂÂGąRáŽ`šÖl„WÁ”p~˘™9:A¬…Żâ[5â;Ž6ˇ1Ăí:óT ‹„É?Ji°Đ±Şé ±.íÔţДֱ–€őŰŐţ0ű űŠ#±đěć-á¨ŇPĆćÎs©™‚ÔŠ¤ł„‹-ŐDĆ$&HŁ˙¶î$Ö%“˛˛É`­ŘĐJ}C0Ů ŚßÜcbá¸ŐZML5q¸˘Ö˝‰–{™î©牕—A6hŤ˙ŢP`š§éLgâ”)lŇíµ>!Äëu~DÖ0b‡p4ü°˘ě!čŃ3˛ö™ű@HQ›6 Ó4űę1ń)Ç´ (m ‘CeO©ěŕňčaq ]P‘ Ńfm˛¨hIÜ S‹µ1‹ťtS<$ĽG¤˛HÍś†ËÝ2K%­¨VÝsů$· ‘–^+˘v•Ëh‚ úoĺ®Ć¸\ćF=AžV·×łÝXYĹťďP_ Ń‚ysÓq3/˙o 7p“˙!V:3Wz×ř}ářď(‚@W‰v˘ĐHŢ"ýˇ|ŢĚě’ž5|ôś°HhCˇĐ‰˛˛#*t•΂`QJąt„řď^z„Ů]—-8y[?}Ŕ ÔĹů:I8ä†J›–6OŰ \@ľä E`Ş…m°„F ‹8x;îôŠđÔ†UćDEďl´€ä¨ŕm “ ’Ž-2L‚Řp8ÇZ··ĚéTBĄé6fWYŤ$¸îzßÖŞPmI%ş jnÜ\+z)“˘2âß]bÄ„Ů99Lרaű5Ą*M#‚Eo9÷ë8›$ęň ĺŽv¤® EĹśŹF¨ł˛LG˙Scţ¦ČŁ ă«*tźşr4ăÝř_#őńÚţH±ĹłýĐjůýj ú Đĺ<–YĎÁµ]ŕ×«Ś VĹĘ‚vG°$ dI`üqľC‘GľÎ! Gř† “.‰„}đ»I܇UîÎOňVľďŠĂQaM•˦ KŇ Ęë÷ŕBKd–jśŇ¨as)ë^ü˘ę@ü{)«ČWî+·Ľx '®5űść"9ďÝĂ=$î Š)óÓźR.2%Ó×"Ésźrő;źč˘=¸ˇBűçďP/w¶ľä«ž-ô܉—Bžłg†pVd;NňF‹Ź pf‰;s¦:˙C#"¸%–uLáp!®€¦ ›O®[]¬ŰŚţ‡v@ŵ×8– ×1`żqŮą‹aÉłíŻx K1ҦW€ř'pŕŔomşi#I $(R8L‚b˘ĂQHtč‹9bäČ" ‹ŤI\D˘ĹŽQ®Ľ¨± Ç6r$&Iˇ3gÎ)x–HҤIDLf"!zdEŤ)™‚´H˘ ( ¬Z €`5@!Ŕr%»ukذYŰl#]ëbµZ‚«V$H¤ř»•@ÖµŞĐ€„XĆB&Qâ ‘6H"µ‰sM¤Fm:wn‰Q6mĐ”˙.Ť¦3›Fžµ>Č5Ëh’ ńÜĆuŇhL›Ć]„HâÄ…˘Nsđ oŢH¤A#:V¤Hއőş•ńŐ°ŽËZý·m›ľmÚni3M—5mߥM GîŰ›˙÷mź~ń·ý7€ţů·Ď7íw`‚˙đ7 7îÇ`„ Čź?jă€Ű\¨ź>‰É6@•ŇG qÔŇGNuä!]„ŇEť˘Ś€qÔPH?5áF?Ą BAýäS >dn ‘ÄQ1Q”&1%¸„B €UxdU^XU9@^W¶X_]eVqlóUVÍé–bU™µUŚA6˙'[^ęą•š‚şµf]$Ä#ŁÁVťhŤ@âZ¤ź±s˙֍Ä]kl(WŰm–Yöśrh4ŃFĐ­Š9ZjŽTš¨ ˘Z#iDK-ÖÄâY´™ÖXZů©–™t‰÷Ť{浇^zç=ŰŢ5‘ ‡6đíb  ř­¸ă~›ąç˘ î´ ŮĄL%:EQŠ&!±ÔF%<ô’”OM$UJEA™YG™B’GîäSÁ9)Ńd51nH””‹0껑J)X›l–ĺŐa~ÖÉ _˛ĄV^ŤÄ•b#ŻcXaťgvŮݱ…íőrb•8Z]Đ‹>ú§¶6ů˙šgąwšk°5’ś¨Ş"QÄs¸­:qI¨šĘE}Đ©i—ĘĄŃ-˝6 °žŃĄXW#ă™&ČmîłMŢÚX#´ŰXŁž{čmCź}楷M$¶řŹ6Ś˙ăŤ@éAž®¸şŔeŤł¶dhąç¶ A‚r ‘ ‘Ľ4™>‘“¦S©:-ĽžÔż(Î’Ś*i)oDK6ˇđN:!ś¤OF&É“IČŃ"E%Ńä’FřBőŃ«őËĺcUűŘXkyů2÷f]oćUeAćFËŰĄ…ćw1›•×]g ^ÎcŃ9ŘaĄ_´Ł»uFÚ˘lĹ2LhZiČÖ&Ůę4¤ "ÖÜ$ˇ!ĄC˙qjÂâ7M ňś©5É ‘ŕš$j! a˝ŻMŕ)Ë^ uµěgZ€ăâŘci™‡>"˛ˇ6öˇÔĆjS$Řő–}F‘„ç˘Dô±rM<×6d‘„](D2ŞW ^¤±/ökcşc‚“JÄ/ŤĐ(F'ÚN4Ă’‚ Ž@^OrR<®Ai^QžŤ¤t#Ś ¤[™ćĆłAŐo/ŘźZȇ&HBZQŚÎâW•ŻŚĹŕy ÍŔă&Ć`§j" Pę­DŰ”gHăA"\ €±YŐ¸´Üćjµ)`“$Bś^6© (Č%ÚjóšJpÎ=m]˙ć$83D‹ýÜŇĄ±pRO Á6äžiu p{ßćC7L«o˙…-,!‹&üĂ –„$la vţĂ˙ g$Đ3Ĺ}‹ť¶¸ĹÓeO{¦ˇž:‚ČQ`7#0ľĘ)DÉFjôĐ‘<Ą!RBc‹zdG ý$'ŔëI‘Ć“­ť”&% Gą”D,%[˘™›*)–µ(’‘‚z řŇä>«Ź1&ËNwh*¦ś…ldőłY™vš>ŻLFĚ Ígř'šĚ4°#Dj6“„Uí¦7—!×Ňв )‚% [S ś6ˇ‰‘LPpc‰öhC˛řĘ]´˛µ"ŚŻfzŮ^źč„˙'O:n<Ô«6Âi Ä­Gq%Qŕřv ‚bA™ťâAíą‡hv«‘ňZÂÜĚ«yµC‘Ć(•Ô9¤ ‘hO †$‚•tkĂË-Ź ¦(A AmS ň3â®ůB@™ľ3–.uĹ“iĺMk–§łŚ"ęÓ`ČG'—Ą©P<ݤÍR–´„‘¤äšiz•JŇD˘i­ÂR Ř€‚Í<$ŘŚg0sUąüŔ~ń aÚD,RA.¶ ±ő—TEĐ/bqKY@`+µ}/, –…•Ľ]śâÄ+ŕä“kĐ.Ź3O¸ ‚DřCţHnCý×fý19ń˙¤g–čçí\d\Úí1$&)IIň•‰¨EůâobR#! x#đ”Ú¦”IĆ­Čô*Ň/Ŕ|&ă’ pš>lš,M™D‹OS†&¸p-K“öŇ{I§*f°ŰĚKUčüBR:aŞbUÔn¸ŞRŚ$y,+ßÚ é…”¤ÝÎ"?±(ËÓ[Á ú”%J_S1ÜůnžSć‡ĹńÁ«|ŕCCüDb˛ ś>8'.{ÄŢ—Ĺ%‹HlösŐ)b$aŞ;ŐQ„% ĄĹZô:ÖB„ü2­Fň7‚9JĘmkĽ9*‰·9y`QŽ [gOO%ĵȖ<ś«l˙‘˘l‹šͧ<őŚ|pB– Ë=5QX{˘đ›ą#ł›ŞÚ/MxTg"UťJ}0‚!B`2=,%ŘUĽ’\¤K]žŢ›,ěî÷U·™Áy{ôx±ŇŇ'ši<äŃ…­GśWř¨GŠ;ç¶„žžzF2’qđÖ6úĆî Š;(ŃĄDÎI" ČNö·¶‘H˛‹#DjźŻ 6é(‹ŰcÂZ%?„kn(RÁŠ÷»ÝzŮ`ż;©’¶Ň68ÁEN L¤t" N¤ciRaMńÍ•žžI/ß;µüŕmĽ/MÔí’#Ĺ·ôĺy”ËËËŽď« ™SŞŹďAČş‰¬7 ˙Y+ţXʵ6LRP{™Óâ™j¨M»-LąwnĘÂéúTMgšS™°—˛Ş€ŕ"§ŃĹ™Wّܖ{öńX¸Řé9¨­Ń†ů„_nřGžŽ®oČÂ…["Aą"ĘiC! QŠF0Ú¤hźDĽŃQXT­Ľ„ÄQ ¸)‰ ą•ÔÁěVý„ü„‚™ “ĽÖqĄČnDI`°Á‰ŇőÔ‰(ýTtZOˇą:ąĘ‹ýč™äŃOˇä Ě vĹd–$h, Ą”jˇ,AĐ_ ”01!É5SČŘOűČśaôÉaµ™‡ŮŚäY—N•—aaׄĄĹ˙î‹ń\9= á_áě—y¤!üé|ߌ5ÝříÂxŘüeHÓµýeÖ6„UB4Q8ÔFÉˉ”ĽT¨YŰ˝¦@¸Á—‰”ąu™N íßߡ”’ČÁ°Dš©ÎjĚ–°Iî”ÄYÝHáéuaaHBËŕvÚŢ›Pő˘ţÝ4Ć0Ž…/@ÄÁU}Jj‘–ě‡7˙BîC.d…0¤x|ČŽýC?‰]kA›łQnEód›“ÔČľť4˛Ź@(¦›ŢŃnO°$ߙÄT§…R VFGD ` ›ő 6šL›”aXđx×ř8ź şIzŐ OE—a¬/*KzMáQyVü…ŔČJjDŚIxeÇĹM]ä˘ćĄ\ˇ}OýařWQmXÎČM& eu˝ż˝ F7‰‡ĐÍ·´‡<6–9ˇÓ‰u ľź@řŁaZCČS¤NH „D0!W3ĆË«0ĹĆíHŞĐV$‰ČäJ ŢńVşÝ…”’ Ěsŕ$TĽ^î<"ľ€\ Ö¨QŘ˙˘eö<׽ىYŔ‰Íl™¨Iç•6aWÎŚPŢĹ©)U«É™†ĹŕO¤JAď #5‚ažxăwhö°`†ß &‹wĘ8Ž…ÍĐT6¦ x8N:ć7™G·śX‘eQ)†DŘ“ł¬_zč‚ű¦ĺ´“bZF˘Ńěh$FxŃĽĽ•ŕÝ^(ĎhâÄŠ”&r(IYhÖ–Ý}â$>Đi9Dŕî<Ç#N…pnĹ8âÜż%Ő"\Y®Ĺĺ-RˇĚ\ŚßâŐ`ÉŘ#™LReě’gQÄÔs FĆĘŃOžŤÉéMe¦Üń 0–WĎdX˛ÜĄä˙ż…,:äÍ7”lj=Vŕ¬é6čaŽ€Yđ“Č-fQ$„ *\L‘, hşÔ“ىžÄcĆΓ  ”ŕÄpµT©ä‡‚‘ś[–- nˇÔGÝQX ąŤ„=čŇěĺě1םH—ÍŐT'Îp—( śUp^!qćŢ 'Mqéx©—Ílé` árÜĆAZRĐVzméćYÉđ^tť×\tĎśeWĘĆwMi'ˇeRÎIř %¶Hâŕa~|ôŤ9iKŕ´‡űĹź@]$Ő!E‚,ÜB±ˇËă*şDÂ5ŔRę´uÄ^Ě5ŮŮ1ĹAśÔ…úÝ˙Á„HůNZP$L§ÖąŐŃI±ŰDy Ć†fFěµč¶ţQ2ŢĂ-ŇT*‹š°Ě"Ń  FĄŤ ż-ŐâĺE ÁâéeĹÔxĺĤFLĹ }ay:žpăÍĚ™ÍXÓ6jÇ®>^Ęş‰8¦g 8Ň—ĚÍc@d©á ÉĐ›^}°Ě´ÜBbć+­@řXľňG$0D!`Ú…QS8Ŕ\”EX™i¦f(ÚݥʦújŞ¤ÝĄŰnÍPDL“9ۉţ‘JHYŇE^”Ěröŕ„‰ŇPŃ̆ÉćÚÍEĄt)\´®'ĎKa%\Q ĘY$Ré,ÇRpŤd ÜzGO-Őţ›˙řź\Ţ ÷Đŕ*Ą0˘ô….ÎńVĽTeÉarޭч¶¬‡{p-­!|Řš­±©–Ó_f/ö˛Ç›ZĂ›˘çŻ|~Ó´”/^iŻöŽ5| ”µŽ>ÇÚńQD”"JL¦®ĹęĘ‘ÂPęLî]Ţ*‰˙ZŕńÔdF…»ÁHDl «ćĹ ˛šń9_˛ĄĺIRS¦ÜnNĚNmăÝL›‰LăY“'QŇž$`oM˙§ć]!ź”ßĹÁâb¦ŽpŮI†JĐž™dÉ8/’X śWˇ3ŇméÂÉܦ1\ Ë挅•Ň€­•Ě•W' ĎĚ[†§Ď¨IN“4ŻfiMÚuˇ×·Vú‡ô=K9ťń8©«FÂ]]¤y´ď ÝâŘť*DW+Ž$Lśéˇ13ö&Đ Îł°‡€VáP űŤĐEÂ.ŔÔJxQě M´9ę}Ń–ď­L†b˘[Z=ěĂîÄÔ%"vńEŕŤYJ¶EŔ”T’ XW+nař,ŇźÍpX0e.vʍ}2TÎ0 ę¬ö sďM©,Ž.ô ˙IëLjđT®ĘąÚ,Ëeęf™h6úä¦Yć*¨ieC Î÷E–{Ž.ĐS$Eť°­Ż”ťŠHg”<¦!8źĐ}łŕ¬µ´łÖ‡ôB‹Ńq_e jí8‰ěř+ë¸&GĽM\˘Kâ–Bă­ŕâÖHĺ/Ţ‚b¤ţoÂĐ$O´AdÎwDTöŠj †2ďâĺSp[śÚ-‚ŁŽľ2kźL̼٨í`o‹!ĚĆżŃÔb O8śŤB.Oű®šŕ›z’ěhcëЧ?Ő ÜSqŁnóßpźůşqce_ć’X✡łčŤŢ쇬ĺM¬ťiR”Ţôaâ(¤”łXŢ;*ÖŢ,ą˙yěM7Ey+COŽDĹś˘ĽxQKFÄA]íď~ đbcj‡†!÷]BĎ9H9ö}«$uR„˝42îÜČ_l ±”Ś·r볲vúŔ…bĚ8 Dmĺ1mO)÷´‡U˰ÎĚĹ–€ ´ĘČnćqNzŃî6‘~Wµň"›h8yy϶Jˇ ±™b|.}¦ł9}í •íŘD~ ;H‚58›F•âFŁQł›E,b{śB˘`č6€ď~e`ĚłEÔ‰Şˇ8ú4e*ĎěŞ@ć^8wş7¶eG·úSbřŕ_°Vŕ—|ťMRÖp† ž,<ź©çŽ?Ľ­·" ć{^éźČĄmgşż@á‹q·¸„6m·´]ÓeM‰8Ű®iŰfë_¤[’ţٲµ­˘Ĺ‡%Yô¨í_Ç[˙•4iRŰE'Y¶tů˛eGHPФŮ ›LjöL‚(‰ź(~ÚlŇ&E’¤)’–PZ"E‘¦K—*•šÂ)T©J•$MňŐkX°J“(k–iT¦`‹|u›˘Mś˘L )Z3˙P˘zIčZ@ @‰Á„@ŘpäĂŠ7ÚFń`ŠCfě¸3ăÄ‹1cD!<.\xs€ŇŹc·6ĚD‰6m´ałűw#&Iv“!;3cÎŽÍśyä†;W‡~ü°óĂŰ«g‡<¶áÔŤm Ď:9t´‰Ô¨Í>mßôéÚfÍľµ‚·ńw¨-!GüsȤ}ľŮ¦’,%żůgÁ’0:iÂ-„Éź’"Ů…€ľ’N§žHˇ.óŇ E›zJA.¦ś˘Š,¬Ş‚*+“€J©ŞĆ+)łbü‘¬Ő‚«&Ü`˘š’@˘‰šhęÉ® z˙‚ň'ˇJŔě0,EmËŞ#LµÎä¸ :ĘÂ\ͰÖPËN´ĂZŰşĆŕl¬Mİ»9ŮŠŘÍ·6a¤ 4üüm·7ì5ŐŤěµŰč”SşÖ$ S2ń6[lµD….´KËl“µľk,‰FyŻŤmü٦?‡ôëO—†.Ňχ")a!üŇ?¬Ů%ĄšµÖ‡ú»č ”¶Iżű’-č ]|M¶Vühĺ•Zlő»ÖZ^ŤŤÄššš ‹'&‰B˘\(Q QŻ'Ńu’ 7ÔşQ­źR«©‚´H·”jÂÇŞ2`ĺ`^†Łë\vŐEÁĂ)ˇ$bÁk 3Jisô3ĂR˙Ĺě¶ă2fłS/1í4äÔ,TICý.µIł”í(6Đ@˘Ď6pŽľHÚ0Ž2:1kOŃcT:˘­#YÎŃ>ó,ĽÂÍ4łńŔTŠx/’X‰E}T˝Źloýł¦?˛jÄIdIU7dyH’˙ú3č>IęľHŮý,yí´_u¨ŘýXµŰˇ´GĽ?`J[`˙ëč\îz÷&Ł€˘I( î 7rLKČ“P!Ç«h+HŻ|4 ö&Ę Ň_{_ü1)7Ú¸«¦%Cl·a›Ří vŚ©Ü4cě6ĆFMŃĆĆ$:cĺ¦F.čä4ý T¨“ăîéC“#ľÝęâ‰4˙ήÝÍ‹Y´JŐ˛;ŃĘ‹ôeÍ `mć“7ŐÎNČa™g4“ŘŔO’h¸¬a‹}xrŢ:ČCţó+n°%"Q&8‚gq„ĎŇ?ĄĘ=m„ ůt”6Ģ MhDŠ5AľˇŤWŢŞ•AôC_ŃĘY A[łtĺ-ý\cC$ KNn".(5éIŔó‰Âl’١ -»ŠŚče:Óyĺ‹hń×Wd—Ł·”Ś<šť[⢢%®x6é đŠ˘"9 DčÉ•H¦ŮH‡cÍ1Śe•-­MkZÎlŽVô€¬QčˇZ󆦛H\’ Ť¨Ë’ú$(" áŤëů’v–†ś˙BB¦;őëRgŢ4žĐŔljů `¦J &"¸á’­E,Şa ±mŁ>ŹűŹ«„-$– –…6´ ŽĐ¶h.A؉tp,aGŇ 7¶›٠—CWµjWeóOšĄŤHŘ/‡M]ZHŔ§"ˇŐqěŇľyF9BLaş¨^*RCuĘQEšăÔ)j™I*e Y\Ňk±h…$ü1źVQ˙mŕĽĎä2‹.rÖ¸E$¶!‰8Dż2VdŐ‚Ôę"dCAڵÉ=®Î"[±jĺ¸Xd8D›$t1›ŕss+Šŕ‚tŮÄ ëÂÝUT×”†Ö‹v::(W¬xŇţh´»© ĂâÍb|ąÜë2śznTJ(Ĺ–÷4Ő@dZikR)šŮćRŠLéš,ŐČý˝I€4T$Lhľžö©.v!Ĺ@ŕ©ăPF21 Ul@° ˛éMJšFIŽć¸Ü٧˛­eU—±čZ$öLvţ°±2Ú"A‚ş ®?˙„ţ’±iĂ@ňQ°‚Ar oôWÁ˙úřF‚dž Ógý=Đ|"| cĹbSđŞVĽŤ}#×€‰ŇUÝŃ]tT—Ľ˛Ň•ÓÉ( úęŃgĄâ”~¬´¤-ăZÎąLÉŤ‹­^N$%»”‹]ÂcoÄÚ+]é;˘Bęy>-Męd+í-} Őô8fKűskH †ŕ g8sújęÓźvĆQÍë^ô‚Z€SJ©ţ˘3‚§ĘÉ1n"4ȲT€"” Ť…¦c!‹]‚Mlß°[­rŘ*Éń5@űÁ„&”\HA®NP«T˛ŤZ|c™ő®#b %fxLŚâćeÚ˘ /’Ń‹”}•вEG¬«˙JĘ:3&Ą rqŁđú˘GÇvŽsĚ lí¸tˇk&3©’ÄRÁ0社Sö.ĺ&WNĐű#ľáGK‹‰ ŢŚŮ q’ŕ36ř,íł ’Ŕ†$¤'zlŹ](Ö€łś)ŤŁK`_$Á D “ŹĽ=™Ö$`hŁŽx"ĹéL®E˘8ߥ5v¶ónůk:1(‹U‘Ř[pAR·»« xµHmń ľmăťl=‰>:˛‹6ü# `˙GŞjÁkX3–x ëPš”Ë•{Šžs-Qäb• ߎÉcÉĘŹ¶BZŘ‘-`,mWĐâBĽDö˛Ŕ›IM˙únMůŤPę)Nš´—˝´{IMą’ŃCČčHM,®˘ęä˝G‡TĚk´˘P“ťő¬|[Ţ(ĂŰP ő%A(»ĂýWJĐń.5fćZyzOI8BĽoŚSpyŐÝÜčqJbĘCU9·G ÔŻ~ż¶sŻ5xް "-XÉ –"HÚ [(Ó ÉŘ%a‰FŔżmˇČ?dˇ· Ę‚%ÚĘ",ăëRĺťVÂě$‰´ Ź‹Řf îlÂr6G^®-Úúé^RŔ,nçtĆw&Hj7.KI0Iň‚sÖň¦ źh"]‚ 'Ň-ŹÖ.˛^ËÝĚC޶K …ľĘ$ßĚ˙l4PŠ–ÂKeě­6R g"!“ŘŔá ĎÜBá– Ú#PvÇ7 ná(& Nĺ(—jáOş†űŢcű>­~bH€të} Ľ‘(÷˛j—pç(żôK>úË?fe?1mÂčŇ"¬áFBPÁ:˘"(¸,áŠ#>"˙–ĄBţaUDítAţqđBdÂÜŚŤ&Š źä)ÇJńIb(_´Â_tď8K/°ÉüĹGH« ä€7>$Ž>¤÷˘ń fÜänĘ(ë\ŠâsVkI(† •(Ž’0Ö%7zŻ1J Ňô'Ąnc{ćä÷mS Ă6šJHâ\8¬˙‹(|cIhoáR #'°ĐőŕŁ(Ó¸&; ^¨Óđ1jÁ2jAż|ć_I ä@ůé8Vă+bHP ŇkđńO2M«®ęÉ \Ĺ>,oH@@ ##ćŁÁäAä4 Ă2¤$'#äÂ( AfRB& $ $Côˇ$üa2(3¤%5ńA|(!$‹‰đâť(˛L×EqŻ'Z¤u’Ŕ bÄŮň勣$źś'® *OŹć&ęFąç0R©1 Ă‘†46&’&ŁiVć8ŕâ„zćŕŇqPŘ 70ł.ࣧ®mô„ĐŔGß U®´Á’´”6w˙É8i“[1r—ľ0çZA—ŔT«Ň`HťTjá6± ń1%/¨?ę´üÖXÂJ-ÁŘĘ™ś)…N„ÚŹOV(J¨-vCd4¬† X VĆOZČO<áJ,±0±†p(o|­ëÓTM]¦rî ¬}*+=K,FkŤĆb N‹,ÜŕÉ2§ËЇ.t‚µäIÜRpńfpńVŐY'H„ŰpK(”$ŘH€­ĚËŢÄăz$CͶöNči-Nć‡8<óŕšg.' \ďF ® Ň F{Ę AÓOŢĂ"b! Ö6“xnHkI‘ôÓĽ/^ĎĐIkÁ¸/7Ń5˝µűě—Śł]ý˙$pěpxČWŘ VĆŞ­2¨mÔT ¶I…!Ţćm¶Á¶ˇ)şIé”Îşéu'(%„sŹčśb;ÓiptW KŐ”…­Ž6ŁÔ Z`ŁnĚDŔM—÷Ť”Är°@őGhÖSj^<0Űp‚(X‹ĆęB'Ue©0¶&ksŕP@é2­‹O 8P†Ł=8 gĐH}f"±ęp˝†x.ś46rŁÁqŁÁ†” /É„ł]yÉHłçÄPżęÖ"/I>VĹ?':iW?‚­p˙hśÔrZĄüúé Ŕ'±vY óbÇę›ZĐ&:ÓŞ9çť’¶&B$ĘpLyá˛7g/AŽ^t)¶u45)P',˝Bw2 Ëčb\>ÄŤË­ËÎe\"K.mË)Ói§Ň]zŞ'jUË7Ł ęk®F¨ĘckC ;T‰dŢDÎ Ł€ý$Ą Ĺ„<3öʧY?ł§® »đ(LłG3ÍA µAôÁĆŐ5Ł!Ó¤!6[ł Ô[ß¶ĄoďŐqw©6¸]-Rĺ2ÉkľîpŘś€îč0Č |X0lB€ňĹn’ÁÄ@ d%1ĚÄ&l9łY&µ9'Y’śo˙2CĘ™ÁX2›÷!‰îtěs>É Łh0ŠřiFěŽ+™ŚđĆHČ"26Ç\쨊Ęea†Âű¸Ž~Vňř¸.euŠ´÷Ę@'˛ň"R+ľ~ŇÔ#°Pj6dFĚXONj*.Ág… ł šP}ΖOLŘ7|Ćşş°x.“ě±OČÝIőÁ˛ˇŞa\a9Iz‘T4ÓtÉ5˵\gÓÓFh—‹ą€a•UĚ9LŔŽečn…­>$ô[ÂŐRâ$ĆÖ‚EDwŤ(ŃŽ‰řXŠJ¤˘Vp¶µwř *f^‚Śź=Ő)˛mxoŐs:Ęx›$ń Zź z¶ś¶wl˙k‰š×'Ęe“z‚x~b\ü0<¤/ Ř*{ţňzĽ±N¶i0újgFúr/…‚Łł‰ \PŘ18îl¦wÇŁ6I}ňÖ=č’Ęçk¬ˇ•ŕ焻I‘”¸—kęV¤AÓ5cˇ×\ąôOÔ•ŃŔŞ3íŞäăpĆé‚ĺ«ôݬî#pâ"®É¬8čţa!lA8˘VĚNo¤­ÍN"ćŘúبRî¶ ?ť’E2đ+TS×b` fHľBŰp‰ćË஍˘sÂwܨ Yë±oőÜ€Ť.–¤IŇîI*† 1ÓŢLF –::ô\ ’ź†8vP"ó’ ˇ ˙á·Ű€L |F6‡x8…jŐ‰ť+bš $ôćë®$q„šŔwÍýţćľé»±üŰYöQéŮÜ^Đ.7g+—M‹†¤?ŞS“bÍqbD‚–‰ľ×9Ľ}7*J&3ăŠÎ ˛ńra6 UU[Ő*ÇŤ ?&ÎX4ôJŻô"ÍWQ\úN4]/4Ý#Ça”g !ŢăYk|8emÝ#}ftČ3mu±ý„2‰qÉ\˘ÜtÉZ˙y—ŞÜ§gó•_S¨ëáH…I[Sż†ÔOD“çŢC »ĆÚ`/Čl¸:dő!Dňß BÁ.B "ütí!*‚plá®"äBX2Ń0ƬžĎAŹíBGĘN¤UŰ€(‚¬?üÚÜŤŮHgj• âŠđ8óîŐŐNîÜ ŇvsĆI†W-IÄćKdÖŃĺsüXźrĚ}M\2Ć+Ĺ1Cß6ÚR¤cßbNj y’{ôŕ~44#„Ȥ#ó7Ţă|čÂF×ç2í>’@PV·3{ÔŢ]ł€[A ąó•‡»´aÝ_ó•Icď·’/IKwé\™7ż¦ż‡ Kś ç"¦˙ó?.BĂÄ™Á$Â*ś%„šYĚV,%Ś(ż(C˙'Mbó˙­yňA6ôMí"ܲ!pî`>* :ć•Ä ŠŹŻéĄ-rqGââĺmKĺíB'ľ7-Üřc>ˇÔ˛ě‚ňćŤkţ¶ĚÔ1‡ĂçóżáŃŽű"xŮd1$­}ýNžcőÍ€Ľ$22Č=HřĄń± t|ż2oh“ˇU¦Ř2!xĆEפ›Ľ"A83 ŞŮÓ§Żš>kÖôe#xPź˝löVh­š´ZѬŲ«‘ÇŹ#Eş(-c,Y±b]Ü·M›¶mÖ´ĹÔvíĄ5]-e¶”DÂM›˙‚ J´čĐmF‹˙¶LĘ´©Ó‘nˇ@’ÉÔ«V‘¤ČŠ˘ęÖ®L’ Ŕ ‰V«)ŚťJ˘I’)J¤x›Ä\şs“(I˘"‰_9mĘNe‚$,a…«bmaµ*W$,Äbm V1’&…ÍbÎŚąÉÔ$5cëŞŮŇŹÇ’Đ:‰$m@@"€±€Đ»@żq˦€@€·(°\önĹo(‘¦M¤F×Ů´a+űvěŘEŠż~˝›8×ă„ěľ š6Ő۸7)eý;vlT±ÖŔlůX“Ď@ŐÔS=ŮcM‚Ő¤ÔJ,ĹŇJ}ö5ŇĆFa5&]”Đ7˙¸ÔŇ.ÖädKK˙%âôR$%ıŤ./˝d‹-Ú„¸”6ßXCă?3ţłM<ÚX RNEbËSH&)‰-$ĆDgSmeVXµ–•Zgˇ€ ©u•d(¤€‚I”đVs• —\~ĺŐWmÄAU†eXuâ9WQFi•ź`‘eVb†ÝI l´VfN^fŐ–XáŮ™YXŃ Ż!g[q›rĘ\›BjĐ‘jۧÓI·im˛‘Z@qX×vm°Ń$"…Gw˛'^’'l®Â~$߬őŐ˛aA')K-˛TŁM>USCúÔŁŤEždQJ*U#‹IYÓJ#)IcMFŃH#®†%´ÍĽ˙.ť¨S‰1–Ó5‘ôdS‰ţHňŹŔIü(‰|Ű$Ô‰PIňÚ’ÇŮÔ’IVÜT$۬¶%a|âYŘVž5ńdYT~śŐV_=Ö†[sÁŐrm*‘śr’ĚhUO:Š–X®Ĺ§U^î)( (¬6'V› şU;ę–iKźµ(ś+űEU ZUE‚$W[pŇ…ŕőq©–ŔimąíVtŔĺĆ)Ŕ‘`}ľ—«­ő]ÇČuݱÇvÝE˛·Ţŕu÷7yáí}ř†Ö6XKE˛$¤MCúLNPă!ô¬»ńžô7¸ěJh­»q»nEîF®OKűüŁŠ7ĺt Ś<ɡ“6GÎhËÁ<Î(pT˙< Ě5;ĚpS=Z¬2,ä %}kyúž\ů*oaD­ ‰A(@©Ć>ňáŹĘD=̇ĺ´áîčç$é"<‚ˇxEĂŃş2RŹu)¨tY]`]Ô_5ą…´Áź´äDűXŢPާĆ6&)*«IËTŞ×šÍh)}m8Tž®â3źˇě˙3„iđҦ6Á¬ rCaöǨËŇ‘Ž´ úš?]jOb˛ ѬW™Cae“¦iWđ”ŕ”¨NYŔUđ7$h%@`;°!9bŰ ËFăÔFSş!ŰŔŞĚ¦-ŤPO 8fö …ŕW}Đ5Íhę'<ZÜł&R}PË=Ľ\ĺĽI%ń#ŔJCy:" •Äâ] â–‚TE{DQ"§“ĹęčUµDŚ.ůI‰xâ"měBDEŃSä#§ěăHyhż‘ƤQ˘ EJD)jŃ ¤ŃíhE_łšÉ´¦Kw ĄöÇÇö‰_qĚX¨$4µĚLo˙J`脳«äě0š)١8é'ÄÄt--Ő Ć"ĄÄ‘~NjB`ĚbĘTŔ”¸*m¦C‚ŕ$«% #şŞS-ç¬ˇÓ šm7Ds~SëüŤ„Ě OอŽÔ#±áł(ĂŤômš{ó‡äüЇř!ĺ*§ jpä#)ąćJ— {T1[ń¬5ŞŤv™V‡Úđ‡‰`‚"›”&´ó×˝B$°¤é% ŠK$ K¸qyFúZ ăýeFJ¬á#R‘@´¬üiX’j `63îMµJNcEĆR¤ŎđŰ“d¸B4íý©dI/ö.Uë…Ą UMe˙VW‰SÚ· AXŻÖ6l—ŔN0uY6^zĐ‚Âůsp9×kÇBű)â"1!t1šz–,¦Y¸”ü5»‚p±—Ť„HÖ ŚMµČi {[ś{śµT„TQ  ­D¤ ÄĂ?®‡EäŐ’"kC)‚‰Kj#‚΋FHŘ‘ÚpŤ8ěÎaŤ8’$|k‹FčbIĹ{M‘$öŰŠIB$xžsŁ»Čţ!ˇB»TVšKÄlĆcb‚Ó\ú˛7H‚iŰsZ˙r6(-…)5IU*'-ů<Ëü©ĽgĺXîĚQž2«We%¦MyK”ŔÓú uX·¶ çtĐSh­ mL˙Ő›˛‚PŐËI3®DhBW”]ĐÄŽeSbCŚ€«‚óđ~¬IŘFĽç®ţŮV7%[p’łZaP4ŮŐ¸hKAŞGeŰYÔÓŰ<ţěĽôäźřÓ 1a­5Ęx;k|C<ÚFţ! Ilř łŃ?ÚŔ»Fl#I`cRVf‹ÁńdgiÂhvö?獏͍)DzŇ%)M>ya‚ŕŕÜłLé*Ť^ôÖű§Ż¨“S™dy­W\GÉŹOÚsŚgŘ_«Ş26łÄoGÖž“Ŕ ÚĐ.Ěŕ7Ëů tjĂôMµęč ÂÁleÂbvšŐlwô*ěýP“×˝2’@˙ů@¸;Ű’ÜŠ B-{¤˝í8lWşÄ5|:Ä› Ч=bQÚČĂÇ@ö¬=ĹýŤ˝¨&5Ar‘o˛˘ĺd“rŤ¦P‰U´ˇßŕw ÎyˇÔO‡2‹ťŁ\Eµć’' KhHŁTI”  ¸r‹Č.sňáÉ0Y“VĽDż«dR~{*ośżÄ>˛,z~ee)/ŤJÝd5çΩ/ĎE˝sŚA°6\ÎŰŇ6 Ö¦SmSkš#!źę`¶˛hÄąľ~’Ž@Bšhh$ĐuŮ?Ë>öÉ[$Đ6¤ î1+¶!ńŇBt ˇpa"!’ ŮâbŁ!EÖROôäYŇđc˙±O«C#řb(‚řÂn#AQ#i´ E$H"R18"EQĄP Ő u[˙"ß Zţ"ÁUhóS=ćăSň“Ia2¤Ô(iáp Äo‘3l@{¤¤‹„…Žâ%ś$ăur'|ň# Ô>"(-5)†JtJż1 äst¨_=Ç5Mçt t ötz¸jGWô•* TuĂĆwP¤,í„Ńŕ,Íäďˇ . 8!çÂAď!ńg““Ň‚-¦# Ś N^‡.r:8–- qm ˘mŢ6Z ˘m´( ´ňP ű°:cäO4’/˛Ó/¶c e ˙ś7yNˇ ·ĐyH˛$$îĹp„RIEr-Ő¸W|¬g)0ćĂ•¦3~‚Ť#ׄ´7së)ÄG4NőpbRRkáhŚQzîcIEăT¨„švUÔ×sÓ…hS®ˇ ¦’*łAA¨Â}făKśŇA¦b¬”Ž`8™#wV AlF!Ö|# ‡.ƵŤđ8‘` Đ2-ÖPbҲwű‘~W.¬čbÁ“ÚÖc˛‹B‹öd ˘E˛Łx12;6aPdä/-ŃO»S#Żu‚SÉ#@˘ ţ•;şóFÂŚOAR@Ł3D•%’ńr€†­QŽ)sˇ]˙ÚĄh0q’bIjˇ'Ě…rI†”b=ěřp€I4a…ŁöîS\Ďxz–Dđ|VĹi\őŹTAv3ăR· ¦‡¶K·„`Á$ou6´ˇ_sCuˇ‘ !ŞÉ‘ŇN.-$’Ô¤~&y‰)ŕ!Ch€בŤ€ źcbN„ŠÖ4.ܦmrw4†˘U×cC9ťQťâ¶”"ö’"ćĆ";úŕ[˛đ i`0‘ŕř¶0QĆoţŕ_g Ć81d–I€4G…]”D|rć\#g§‡z*e\“")OŽÂĹń¨Ť}‚4j†€éŽDĂ@o¸@ĺuˇĂ%4˙i†J¤b_™¶sˇ–D@ăÓ^ăc} "ÚGA™VťÉľ!‘ÇL`&¸R8Zg!&Ô ď’Ť¨ʲa§‰›;:›çwkbvµ‚ýgl‘~ÝÁ•“ ·yM(Q.ĄcEw×bâROD‰cD9¦žŐHá^äŐ$č:üB#R"˝ł;‘ŕ#d¤e5B1S60¶ŕ3ÂPI;ô91h†IµgI”g©!,%(b˘= ÓfŤ´ăŤO¨IĐ\k–Ú'š4†qAĎagu·¤_ZĄ_‡^ 7¨”U§Ús™“Y˘~‘M ]ˇ»ˇ6¨¶‡Đ¬˙ÚwVWŤ9¤v~|7.Íꀵ€!Ww~#”+!y‰&‰Mä×i'żŮ¶P &‰W”.|·.˘wŃbĚ)bm‚ç‚7Ż8VG9/FöEJĆd5A"˙&7c$Kb bt 4B°¸y;#Äذŕj°¸d{7A°ş;K± «;«;:b :˘#Hv°űo¶pzéxI|´Ť'÷'Š iÖ>ç8ł7C{6K=%ó¨Č§\ŞTc8E0@™Ůt»`KÇ6®¤@c¨_ó•s@>WEP«đq,Ç’–Đ5š‚VŘ*)š©bLĹŞ_·M:z´6+fM'‘­˙źs‰–xk´ö6ąxS7gű›OÚîa ÁÁ.˛(xÚ0Ú` ±śUô“‹ŰYBąŠĎŮ“5¦ßŕ ­•¦8e3;<±QE–‚AA/vZµ,¸–«QŰđPóâ#5Ş‹/řP"%»Q3ČhV–á…:ŰqGˇ?ăśôSy„{‰ę(tŇ…xů>Ę&™TBc=NVĘa*ŕ÷™bcżáµ‰ńUUN»słZ˘V+Umŕë ®Ą&*¬2€řA«¶˘fEE6%iaš× ›č!&’V7Ŕb‰pwEé×e,hŕ­ą’Ö"Š˙9ä.˘wË Ż‘;Z^ą qÁ?ÄX±ś“łş†—n馦+ĚĂťÇ$}|áŐqи\Şa˝ą·3Üu„‚{H8^s¤Ręgď¸=‹TśäTTßűK„6P¶¦´KŃ™¦˘őuU5Ş_&Ę4ŐÁľn@ĆëŰ~t©¦łaAź‚6¤Čáięt+#4+f÷żŕ‘§ůLö·Čb‰&iŔ˙+Bl€Bul (‘ý7+ć'Ń29“…Oh’űĄ ’ ď‹aęvőZÝô· Á‚2#覌:eO)Ă®ěFßp˛Y1ŹŮCč|.KrRŇuR(s3Ť)˙Ë{)ŢuĂŞÄ:ś—ť)6eő}ő+6Ľ**ľ‘˘ÂÚƶ!K˛!jH`&·*UdśLŽŽ reůA-j­Lf‡YĹ$3FaqŔm°DV9*!yő`xËBŮ"‘2”™…¶+ŮX±0COŠD°’&FNn§“ žµ“(Zó:?řĄ 2 Ňś=99,1F ‹ĘJÖEëFŻÓËCĂ‹ÚRR˘\ö(ˇg=]8)!‡3żL()ăhŽQ̽ǟ›ÚGđ#´iE´ Ç0Ş˝Ł~Ů›™ýsúµÍăÓc<+r Ť ‘PV+ bf+ %2KOA¤B¬ľˇJ ĎÖ­Oj¤ Ŕâuv=¤:Š˙€Ć6¸RĐFÚ›HB˛ŮQ:+2„¤,$6NQŃ ÂźÝ“aZ-ÓiťEiŮD‰ ˙ó*xÚöc«cąŘ™¦©\Ś/˛Ú­=âIAÓ3EĬ=Ă«˛7{%îC:mł[ńÓ93GűůŰŹaÜÉ…Ěń8ˇ%ТɱKÝË)ĘQżqEVĹÚU›„Ýí[Îd f˛°;8±6m,WĂÁVeÓă<α §Č7×DM´Ö7°‰ř쏌ÇNB-äs .Ńçó-‹|dž !D î椓 Âśź%ZčŃČŮń:¦D Ň÷"6ˇ"MéOŠ×/$^éE!Ëó8|ƧÖŇ> ·3`1{>Ť3łçSnYŹj¸f9|1Ű„ŞĚ˘Ć6fUĹJ×jPwjĚ ™$€sa…&T«˙ň1ÎÓ[Än –Ŕ°Ű0«fä­Ä_Č:Îí؄ו(B|ŚÝNĆB~üwkţWŠÖ8 ‰‘(ˇuEIt–Y7äŘ“í®m1čÚÂE M”Qňʸ}”ş›°÷B‚ŢO"né•î &>JĐ›ă€y*5Ä3ăŹAh»w, zţů>šá©d‘fHČL˝(żt–g5WĚíĆΑŘW´­´ë;Gµí[<ÇޱşÓŔ4´ßKgěŘŃ€ĐTah[ł~l ’8y›ąŮü€ą)Bö­úě,éîŔ¨ ~°i ęb-Í8¶ N˙[šłW'ô1ˇ÷…¶řuTIL|LUňÔ;ŁĆň{hL›2tĂŃ6Ö)›Ň˝ś9Ka5]~ÁŐě‹+Ć3ĺşs :┞ŻůçťęÁ7ö\Űqk·†‰Ńp&áŢŕÁÖ>·¸żB (4ŔÖ/˛ čŢĄ#N‡[¸Ó“!‹Q¸Q¸˙ö´¨ŮCéĄňúŠŁ¬-O´:­•§ü"úé,ň÷ OĂ‹–2šę'hI?I3ă" “Q 9â B$)4a’‰› Ŕ$˙ 1˘PHcG† I(@)€xé2/k°g < „  “$@(Z‚Ĺ$iÚ´‘ÓH’$[UmݲĄÍÖ.k¶¶i ±R§NJK´q©ŃÚXmeµ…Ű(ÖZşk­Ué­\kúŞY«&+ŇÝFmÖ˛i¤6–µą‘ŕFj+R$ĂlÚ¨% —1`Ćpíµ•+Q-kÖ´ŮÓ—ZujkőěŮł†Ú^5ŮŮěĺëkŻžľľőbŰv­űµo×´gßFn÷ěľŰľiŰfM—6k_«kÓ={uI$ţ}^üxňĺÍźGźŢĽ-’!ů “’YP<ČB!Ăů˙ů;ôď"‰˘Ď"‰4:pŔ†Ţ+ ‘rO!‡:€ t a¦  ,ž.d)Ä™B €°j"&€R*„˛P("‰$šhĂŤFäDKd©Ş«[¤»:m>ěé¨"¤JL®$“+–·dÁ+Ęş”l¤µZ!íŻj"KĚJşkr0ąlik˛F1 Ť(kKŔôŃFźĎk‹±ZěŃ&ÔVKͶӀ»­µÓx#´žA ޶ֆN¸ÝE Qk˘é뛯„ 2;]Ş3-şm¦ëN=QG%µÔôŘĂčÁŚ>ŞĎ Ť4ňϡúp@ü d¨V˘HŔ‰Z]°˘‘†Ý•Ł‘4Ę˙&Z«CÇzÖÄžzÚ0ŮiI©˛H("ź‚*GŞ®Ú*«[´újlZĘŤ‘Ľ2–ČćzK˛.!“¬*“„+J«‰f/}ci0%k¬YŞqk®4 cr®ąů«Bí©%´X¤áŚĐÔňáN{l“Ó8ÚôŮíŻÝz‹4R9QnRD_ÓÓ5=í‰O}śłnm‚ĽşNŻ ŐTŁŹFş<[V5¨ŁW?ÚĎ?"Čż†ú›‰&®ÎşŘ$˘lţÄN"…:bŐi¨ŃĆ(¤”16\I% €Ş[D i‚§ äž¶E”rč[7ĐšJKzôĘ\m„d p.ăR˙ßÄ$‰$­&«ňŕyç­Ň­ŔţŠ&†űM݉3XâZkÄ©%e©ĺ­ŇcŮÓ7†yĂMËÔ 9µÓTn­ä’g“Ó5Ţ$Őí´›mŁŤ6×v›eĆh‹s›ť…~ü«ĆˇŰT袓&ż|RŮ»zŐ’ÚsoŁ‚Jň•@©sŐ:#öWÝZkë["µŤ% Űж‘¸'2QJ\–Ů'wŃÜV“laë$f!‚Ś’.MĄ*çŞĘ6ĽruĄ(EŔśÄRǶ8&]Š…$bá zőËѸáÂBS»¶ČĄ^eú’šŇ $(%É0r9[ČÔ—jŔitŐh„΀WŤA­&NMŚ˙žlš<ŔŔ†wŻAŽő`Ʋ™g8~ŽqőŤç\J„?ë^§´q.mŚĎ|wÄăxPŐ ĐŠ#éCItĹ X„>,ŕdĹ6„mkL¨Ő~˘Ö6ů|D€&AR­íŤn ÔMxâ“ á'ë‚IXB‚ Ž•$đVSš`#IHĹ*Wc>µŤm e(I@#X¨B')L_ńabň…Żz…¦ҨĆ3o' 6L0“‹az ÄLM”ˇLačŇ–ńć/€Ń6t7i ,N|:MÇţ‚<ÔĎ5‹ň uł(EŤě8Ó»Ů̦—Ď}ěăqttŁt˘#$Ú1Ź˝ă˙i!VÍ#OăÚ@R5‰\Ä?ĽčBjĄŃWI„ đ1%-iżŤŔR$qP`ŔJ‹CzkBÁý„&?e—ÜVtÁĄČ¨ Nq×TĆőĆse‡ˇ-AŕĹĄaę _S¦#ŁŻy9)`8üŞWeŃU&ˇ‰-Ĺ4Sa,ÓË !h`C+:“•®‹ç”^U2Ce±5ś‰ćkĐś›Á7Ë‹MÍh&łŘ$ŞQ©áŮ〦ťKqE+Đq(D5‹4T©!íŮHTúY‘ž4µ˘A*‚ ŚřjkmPmEBë TÉ €+­¨h‘â¶VĘ­&sŁ ĹTźLZ ęŢ€˛˙-ĄÄ¨)5Š#tdkpĹSpüŠQ’PKČL¦_O˛U±:Ě"l/maX5ý富ŐuPBX™äŐ4$ i@BĐpDޱ3˝čeL4ĚiŤ›ťf7(SÍžPEýecÇŃŇ>÷é› 7jzŻ©qZ#=~ę&ź_1¨÷ŇešÉr/ł›Eń¨ľ±ÇŚLň=ąDŢ7 ú<@­d%2؋ҕBě§ľÝ"Ĺ·uËPKVr˘TžŇ&)e(o“Ł ä‚%ĐČŚžâ8HB<:×5¦ăłtńr)‚ŃÜXĄŇŠzE&Ľv3%vUyÁ%4č,ÍWsč:¸’ěČ܆ŰeŇ$®Mh­)pZ’ÖM@97ž®GQJY4†ĂM%GVů”. §$ĽE†ňšŚ•ó1«qqRd~™hFwŃřפn×+ŐëLŮWě±_ľŕLŕ_XéĆ™ëSO©Á°î&µńgÖ‰ÂŃ™„łxáâxÚÓ6s\Ť{ęĂR˙ŕÔ©Łť ˇË¬vuÎőȶ˙ČtĎNZŠPÍĆżš¬†EÖj´‰,ŚŰ¶tnk¦ŔUĄM|˛.'PÉ>QÝ0´·VËßzJRm±81WÇ©Ľô/Ń ˝¨ĄK|!xťCcął\2ÔtRťKchŇć/ç ÓĽćý§ 3t‹ů4ˇ9řĆâid•S#­%hÎ&`mˇk—''ŕ,6nŤ<\ăiEŕ”Š>1¶8]j:žş˝/…sť÷ţ°.۱9@Ž`T¤Rml}=ź&°ˇ '%~EI‹ŃĐýÖ y)G„|6gpp~ĂK„r7šĚM‚2Ął@©d °ň•fŃ`ŤÚ TeEݤ˙ćĺÎĐB»O¬»źw »Ş3¨Á-©Ă5Ž( č­ňst| Żs–UR fŞó› +c.x®r;·ŞŔ®tů†}ČC$ČGąx·&9ČČ jbŽăŚÉ‹ĽőjHrz‹KHk†Dµ`„CŔ Ψ÷Z Îě ą2ůˇ>›3ÉÍ ”.A€ŚŇ‰¦k˝Ö<Jc0Š<€Ť}đK95!±¬OÉÁ:ňގĘ΂ŹĐŞ>ř$üŘ1­‰„­ˇ6`¦KŞTh„Ą†0 ą”J‚Ž(­ÔĘ-<‰( (ôL–nó-˛*®+Ke‰Oă2żpk˙®řC qů čGčřz˘5ŚĆlyˇ”Ť)ŤĹ Ľ9H|Ä~1<Ť µ´!2 m˛†…±HŽô3B«@¶hĐI<+µĐ&Ľ(ŤÁŁťł4Ťŕ w Łčé<•AEżŕŚżj0[Ř™íůŠs1Ťëŕ”ZNâ,ÎŁ$Y#-‹ę5&č±[!©÷¤TŤ(ś†O˛şV*Š˘ČĆj¬:ó„6 ɶąAĄťJKßÂ: j˲¬Oć‚%ütĄB7UÓ<ÜQ=¬‹‰«ŽŰŚI‰L€±†V`ąâĽŽĚ¤!ÉÇ‹ý˘Ż4h«%Q 5Q“Ŕ#“ ‚4A†Ń Ć€˝(˙¦3©‹mťÝgB#J±Ľ—q™=y9‰“Ó°YŤŤ@}¦H0¨ç0Ťîů™ŰË˝…J"ÍŁc:‹R)քਭŮ1&śç{Cm  zCŢj%Ąđ©!ôDO”‰n- ŚĎ(s…¶lý)‹Pş :´”–$+K˛,’·ą  Ú r‹©Pśb¨ŻxąŻŞrŚşÍ ĽI©F€<8ĐA“Ś÷2¸ ͦ!2Ă€Ô§H Y¸‹HŔ/(˘k:ÍÓ™X1IŃŠ%LČ· Ţ“ZťŐŠCŤwZćxŔ- ‡s&ąĐ‹Ů˝„ŽrŞ É”Żđ˙™`V<ę,!›-b‘±…hJ˘­°ůµďěÖl!ś«9‰n}›ˇ0 iS‰pěÖlͤł%«D‰5ť×sD.©¶Ż{Wş˛±€Ş°Ď˛Ą Ş̡CŇ˝ÔÍm;$'e’ € %ŔDijרŐsbŚ‚@ŞľëˇÂ ŚŘ©Ě"’ČO'Ń PŐiĚŔH Ĺx iŽLÍUĐżŕÄJręY-EÝŔ¸Yő@ÚÄ!†áŠ\@[ČŐ8âŰš™cÚ¦5źĄ1Ę„Ŕƨm§Üź)XúÚ 2 ·Ń[˝ €2˛ą!‘»Á‰ôś‰0 MJn,€řm–T ˙G5ähă‹Z–śx ú67-}Ý ‘/[…âOmxŽ˙$ŘQÍŚq0-L°˛HÚ€Éű. |ŚĹÇ$É/ŚÍÓÂ@¨ "1“‘lŮ ´ŘŘ˝žŇŘČgE¬DS…&Ó™8Ȥ"Ś”Ćę˘KĂ™VX, — 1mřMÓ3!ˇŁću^ňBSĘ”z’6¦Ŕ^†¸ĘđüN--[ ì»ş)ťHOhCgDO•.vő­¸u z5? ‰¶hS öÄŰYÇ‘6pЍđ \ş†tŃÉ6ŞG…‘ ý*,ÉĹŤ<Ř(ťlÝ΀·Ôé&{™Î#Ę ‘˙ť E (ÜżHŕ!P }ű‹@,´’„YŽ\ČŚ<'Ĺ!Η%'}‹4€ëĽäظŮ8HiÚQ{ę§zc1'~bÎr\)ź“1ŮJ$9W¨8d_$ ßôë6%Ă[tUŐx”É-ââX/ę!¤4* ±#1ę°.S“Žę„hf! 6÷É­ďś˙ćXA,f-e%ł¨jôEGßÚ:hÉľQÓÁájkŁă˛4ˇyE  IC(ŁORS»=K=Ţ[ ˘Z«3ZĚŐ}xŽ4°ťÍÁdÄI™a†Ř:8K®‹(tŠ˘ ÁŘhFˇµ€BÇ®Ěɬ“¶ ÇČłDÍ‘ÔkŔá”Ôl· Ť_î"Ó"°Ë$pűeCá˛j±ń»š`çuýVŻ6.®‹á’ăn_#§›'Wë;~u„6ćr®žż@¶Á-ńĽüŠ4`e ŤC¤ÁΦ”’Q”hHĐ€<7_ÔÍť»ÂFüb¸!š· 2!4±…ŠlaŔÔ €«:©Ő7Ѣ‘F§ŔHĐĘÖdíĚK™Éc°I¦äŇq3ÖŚŤú†˙¬b®ąOGb8ş¬kęO1‹­[i±‡X¶4`‚ý…0‹â2Ąx=‘›ŠWç^–2¦2l;˛ )ßłľőá’˛ă˘6Pr˛ţÝőął(‹†C.C`\"3ččgç€4 ČýVÄ~™ ±@†Rv”˛"KŤ2W˘PÂc‰†7%‰˘Ä… sš´i“Ň$J<ŘĆMIRmŮşem›¶mZłúŰćmYŐbI‹e-V5kÖ˘Y«V íŮX˛bŃ­[·ZŮFdĺŇmŐČŻŢF·l«›F‘Zµ‰¤XpŁą± DzĹ7V«HҬŮËąš=kő8׳gŻôi{ Kë«§Oµ=mĄE›­Z4gÓśŐ¶=WZ5¶ŐććF šöëŃ­ő1ß˙öM›¶kYŻÚĘŞKş¶[Útm‹DâřđâÇ“/oţ<úôęÍc%€$™o~AHš$I˘? É$ŇCD=DSx`M4UÄ`‚ ^äQHj4ˇD,(TE :ôaQ%}x`J%6ŔP¨‹$qPm<‰$˛XB•6»dĹ•V˙`•6ÂI [ѤŐÖ\yŃĄ—,ŃĹ—_E‚]®ÄâŘd‚&X$ŽyŮH]B&\µŚ©—-č•e[i…Ćš5ůŘóZ>¤Ů#gj©ˇ&'k®Í9giŁÁćÚhÎIljŤ…[l‚Ę™\rjŁĎ6ű`]uÓAtŰX˙ŁŤ$$$ŃŤÄáH$Q™*‰ŞrDâH¬˛Ú$‘¸‘Ş$«’Jë©‘”š+°´ ,±Ă[쯪:ćŞ$¶Ô_,d_ńŐ÷ě})EÂBHŃ·ŐtJ= ő“IQD†ëPH6‰F3ͤn9ĺÄ‘„úv"Dř:áRI-ED I¤ńTT4ReVoÓŐ7”2Z[mISKĆcŃUË\k–%W4µ´Ň—c~ťur–c~ůĄe‘ Áĺ–f‘ą¦eiŘ’Ö_núöšlśµV[hDźöÚkŮ´i†çŰҦ!-ôlşŤfMYsâ… ‘]'Ą_qŞŐ§»\ĄKth{˙*IqHśŐŰŹ˝ăVqË}7Ýyă˝·Ţzs§7VŇI˘KA(<›éç đU[B)(E’K~H.‚F•äaJiď€NhTNwŢíFĽ#<â…5™d/‰š«»­R06±đŻ–ČBŐÝXíóÍ>_ĄˇnxU“V5;«e [t‰}]­4X”ŃĚĺe`¦ÚŚmtď—ą¶ĚädŇc¦Ö“V ŇĄÉůľjŻ­¶kwć‰Z=˛!˙ZjŇR(@!Ç5ÖXNĆÖŇ´ yđóSiŕ¨9QjúŕΧ¬ˇŁéxŠş•$®˘ Ú˘Y‘¸FuH( mŘ…¶Ä6d˙1Â]D‚SśşĘ§®ˇ ęd‡…ۨŽvlńĂ >4˘sxĂ…Đp(xâ Ňh˝)†ËA Ŕ“ÍŃD$*ú×F~/‘ôÄ!ůIGb·“έ¤'aQäe/2F#:é„„€‘¤\!@JÁJPQ)¬ m@ŐTp¤ť=ç•Ň#šă8°-vŃ Č¤ç—&٢,,‹Ëú´&ÁtO1hXŘcCľFĽ%}˛8 úô‚±ŃPlŤ6Ţ„® M’ĚĺlJŁ4ÚŘhň%ĆđŤ5iŤ4|”ˇŕD)G~ĘSca§Îv•X€Y‘hBV`ľĆ°ŠF2ęN—dÄŞ˙XĄŞ1CÔwÔÖ©y—ş'=ń)ÄAço#ěÎ.ęă$” ŠŐ‚RĆő§[4Šąč{Q%¨űPDA‡!ËmHŚ˘‹]ÂG×y®$Ł+Ńh7“”Ü„"¤+ŘRŠ E†IĄYU[VöˇŤáuEmp ň\Łř9Lę#Ë”ęŇ$ŽÁ’K˛PLfÖ†Ä(†QEU,Ň0ł1)5dua’‘zs?qĆtŇĄ›đ4´h6-4rꍟĐÚÚŠ9¸‰Ćač'ęo9¦ÁS˙ôˇSť±źł/*GŘ"*mXŰaduČ8XŁT%d•,j•„ĆĘbF‡˝aµĂCé˙ńS˘"iC;Ă$®¶:ěŽ-PІ'® pbH°Đ˙č–"ńh…~KF€Ą”$é‰4Ü h^ćjn…ňŰŠ h&ú"ťĽx2ťěqu-!nŽb0¦$la3ŞUö±Żč”xÚ8ŢÔ@3Tűf2I­L]ĘÉXďL¤ź–Ä÷%.)fJ!kd(ŁýćFhceZZâ·K·J­Ô›bŔ˘Qđ€‡JŽ˘Ff–?é/8ZkÚ×tŁŹo<çźś’ޱŁAP‘ T‘D,ŃŕYÂ+Ľ±5JčcÚ"Č2LoiíéCč`§Xˇ ťěbţÓźRá ±hź˙dˇ˙9YJA*"‹`„%#ęc‰8ŞĄÍ4\évń‹ěéň,»”zÎDł›í\ŞŻ@şFO9•$|§H¸a…xĎŮĆĹÚt§85ÓIWBźö´W˝˝ …‘‘§í+‰DPŔŠÉL#ŐÁ¤O.SM-Źs$łČ·°ÉĺP‰A=™ćgĘ1`mę±ĽĎ ŠŇxˇËbÄr´×ÔBóí+× (XKŐS;üśńŚ×FIě-OĆ[ß°˛ČNqź8ĚQ5«#ťë@ç´;ÄJ’­ůO%‚T±EAäźĹ€˝ 3˛ĹwDŽkĆó… [Ć­KązŢWçŚb‘–Î!Â˙×u÷ĹÝŽřv¤Ú"»ęSĄ)1Ь9náMl>ŇF#‚ƤÍÜoiEłÇ"™ł¬ěJ­(ĺ– #>ˇwOU`B‚©Wyľhl-TrŇ-SKÓ:²źýŠÓë]+ç„Â.HÎÔBÓŇps"Č–?É O|:ͤä¶ĎzCY:Ý)A#ľ=ÂżmĐlLŢiÓ&xKąÉŰqr5ł©©Ka§Éďö'ÔRÇĐr0O_d‰5ÂĚDBŘWdTĂc ’,¤J÷˙DüÝRXůŃEY‡˘ĐßQ©ĎÍóÉf PŻé ˘Ü†ň8ÝYhŹňLŇfDĎú‰…!M>ĐInĽ•`Y Vŕ&Ťą=i‡ŽüP v őşő”]ÓâŢ ‘ŰŽüÍŚ ž“ýÍÜIąÁVAäŰ~„_ЇBé–C©E×č á r%ČDˇY¨”A—KWÁ…×íĺއŔNî5×K¨‚dŁpŔČąČ쎰“M-ŇŰ<ÇËĹśoÔ ó$PŮBfX c$‚”R,äJLF"Ä‚Ś<hU°A÷0]ěŚXŕYĚ…$Ř~Ő’ Ú­uŘŐX"Ő˙ĆĐP"- üeĎýŁ›¨E,,‡>Śb®) N2GŰéO`i…7HÇÖ] 5ÍÝąíČą•Ť2/Α>q %‘Sf…şŮä Ą‹ ލ Ä!LQ}LNC‘oĹÄ8RŚH˛TéˇŃ–DŠtŽFtv‰HĆa×uĄČľá激ęáÎR4EŚŤ,ßÝt…˵MŃ›Zť`lUTѡcĚĚdś…Vi *5Ć“‡YDĎndÚŇeIúLÉc¨üí…YXC6Ěś‡[J¤đOŃŰ“<ÉFΦ ĽO44ĘĚĺZ„ĹÉqÎ×jµmV.ž*˙VÇ6„JŢeVl š ß5Ţ»!ÖĄčȧ(ŮąY›ßm<™ŰEĺĄTSâˇçŕE‚5ČG %d la D#‡\HžY„E DČľ MHžĹÎJ HéYGpIýçN(Ľüg…*(ź±_v]DOîta4Aň%’ýÍVD_ôm"lC„ŤÎ}ŚdXF*a¦ĚČ‚VůE+đś_0‚^ü#\Fü I‘´EôLÝ+É…Źę…•ČB+D‰XL]e "UJňćŃđ&&ŢŇn ÉLÚFViÍÁ†|ŤâŁÓ}ĂË• 6áS n›-˛ąÖĽ©ŕ<#ťz »Íťv˙&şX.VŮ,˛§{Ôµ<ËX˘€żéV6nŁr˝ŢK€NŠčĽ¨ŚÇ•cK9‡׺@WĽ¬QŠ Wš ‰ËwqHMtÄKŇ$Áî´AďüÎĘA_ŹXĐ64‚%Ĺ‚“F#hF°šůČůT¤\(OÖ4‰Xâ\hâgX’ž&łRÉdśĚÉ€’ô°ĹfldZE5L sÜF˙śhäRőmťoŚĆ-}XÔ©… Ŕ¨˘ŐĚŤbÓŕFÍ˝ťPÉ ?IG,ţSu¨›w¸âܬ`5©Íµ[6É)VÔâż*%ťb[ß™ÖäťŕVFĆŠPłX‘@ÁČRDGlA×Ŕh—‚˙¨‘r5—›í;ÚťiÜ8ľYęQשě›A—]ň‡ţŢš•ȇZ ä’ĐŠ‰Ć ôŮŞ6 eđ€!]OD¤©!Fd4ŇapľŹ%•…ÇĐE&âF'Âß*ą¦kęŞ°Ź«mí‰, OlTóGo1"lôcmÜŐqî$ü°áŁŘ+OĆ­ËíbYGŢĐŘ ˇ'ŚEç·)Ń=%ŢŽÄŰY¬ÚP' "âÂg­˘ż’ ŕEá8‘|LQ ¤@BLŞZ*Äë™TąXăK„ŃwacžŞĹÜ›ťN™ť¬î”PäQ‡Úńv׿¬Ž™…DńRĐš¬.&U˙h`V¬¨Źt…÷Y­c ÁY8FaśŇř=$­0¨HF_hĚpnĆEĘB&=Éh ^‰.L"]`P‰ú–E`´ŇíňŔ…›|+îí…ń!›Jć1Źę6ĽU˙ěäŕöUÜ…'ĹjEVRÇ›>–ý«ž˛ uQt %Šj.ĺŃŤÉ"VFLuÄ"»YŚí‚5%žćjJ5ލ |¤@€ŚŁG„‰h€ZHČ4öYDŞź)/üeíVăë¦%źíî›Ý¬I±Ł7Ž‹MülÁ$Ś>­”P‘ŢÄč#VİÄL$€Ą DTĄAîE“ĹpNŇ^ŕ•“˙ěĚ~G3dÍO,¨Úcf”ÎÇ Ç‘$Ć$ëˇ(˛ó¤Ą °JnŘŤśdnîMv2Cđ'ëCmŢ O^Ą”Q§Ź‘‚Y šPłÔHłdb ŮŤ ×޲,żF/ׂTTFŤřNýu¤ q, 3ďr ˝23{Ą¨Ü°Cí°ë–‘žDçńI^çĚlĂŮŃ„ÚQ¨"¨ÍĘž)hsEáí~Şš]j©6!ÇÁQÉZ‹!!­8 đśđŠUĘŁyšy FÚz/T‹©€O+”,Ć^hä‘” Ď5›¦iL]¸Â Z,-FRńśľoưkĆś¦˙˘¤ZP‡éĎĹÜöŐŃÔÔčärÎt˝2°kĐkÜ–•Í /™Ń ¬§d ˇ biĐQďPÂѡŤP#Vv –eGŔnGu\Ç™ÍQ«›R“ đ^u ŢppÚÔ NńŤYŰÍY3ÚŮ uZźuđ„›[ËőZż5ŇÖÍŰPžôîMÜTĚó5µmŕĎ5\EĄŘŤÄ5aEĚbăősv`ÓŤVL6^S6ŢvbçTbvÝMŁIvőŤ# co¶68R#ťvV¬Xń öŽÖs‘WY? ő?ěĂ?¬Řm˙šúnß6ń€Çoďöđ·qăvp«épď¶ŹŚ‡Ë˙1÷s?7xřw_÷€ű÷t‡Gpăvq“G€OŚuc·ß¶?üv€+8vă¶`Ýv†78x\8sʆ ÷?L¸ď‡ 7vŹřOڏ—¸§8x@xŕ·rŰxx÷ö‡«¸yŕvz§wxȸ‡“8swĹ˙vŠ ąv÷PĎżň+xÚPe.tđPWŁ m#™–o9¦lJR{›QW9¦6} wő™y›şgÂ^n•·ą›ŹçĺFą {ą_®Ś˙aůxާŚĹy•îś‹yâú9ˇďytşî »y¦u?A秤Đĺę“âÁ“%¬ĄďiVn{"ząy=To‡ˇ“`VźpU—y—gJŁo ¦,e —úśSGâ&î»ŮşĺĐą=îŢa‡µ%™hĄM¤Cˢč˛giÍ",r¢çŢč­Gx °vŘťa«˘ă¦0ő´µoőtęÝ"q‡¸‰5Çđg]“^ŰÝáíÓkťÍşů«¶/Ň>Ť»5éµ§čČ»ë;wěűŘ˝‹őGŚľ÷«¶G®Ľĺ{t2µ°‹ç“cSşĎŤÂ{˝M ›ŕ¤×iá xľ'ÝÜ:”ok˙zOËWęvţ{ 2űâÁ` ÇXĘ;%ŰBĹl‘ýŘĄ€Ę )®SţPT4;¨ÔW®`‘I;x|J®”PVčŘwî4şµ «Č6ü0# ŮÜX‚›;B Ń Q妬ۥěÓŽmCB†đź·Vˇşµo»¦ČXäjĘ ęâPZ%¦gĘP¶} ę¶ŕ ’z{ş)Űßijťđx˛`Wľß˝*źç‹MäŮb°>.V~ŰCűŽĽ–Ęł[,Ş…ÜëČ »‰ţć˛Q9tBüĄăⓍţă¶ýC•PĂ(źOůraÜŠTGŔÜ6ÔţĎmŞÄc¬ŮHEµvü$˙Č~cýĂc5ŚŚŕľň)źcóďw‡#hŻt–v<Övä ":Eż68zI‚#€? ‘@VN »?V;©Jłü{=‰ĐÂ(Ą—Żü•é˝Tj%@hÓfMൂ·YŰ6pˇAm! $P ®„Űt)|(đˇEmŰlmÔfk!ČŤ üň 6]uuü8pfÉ×2V\¨1ćJm·8Üą‹ĺ™8Nüřr&PŚŐHr`OŚ©š„şQ¨K1*´8QĄVmD/2Śi4¬Ď­omű’dIŤÚ8˛»-’^YIÚlk“Dă­Hwí¶A˛PŇáżm®EJBŇŐ6¶lI˛ewî?˙Ͳţ}Ś´MŇ`kwÝXkÓHRśŇŤšHâ¸Ů®¬6‘./¤ÚŘŤ¶$’’°N2˛q¤4’ŇÄił1íY@†Ľfë°$Ű‚?˙(ýčY‚NťRuú2cŰ]U5ŠMČíŘ™cתíţÓeÂóO2Ô˛ˇÄ…c)ňéľµ("j»Ź"Ji=Š€ú*&°pęŠ)ˇ¨Ú@ů ɦiŇO˘Ąňűo¨‡L‚ɨ®¨K»üÜŰIż± ,Q óp:‰˘®i!˘Bú†$ k Ň&›4"r›ţ†¬©2ąţ9R›Îl ¨]ţ -='‡´éšoVÂň(¶4ÂQ $m‘ĹÉ.ud%††,˛»ü˛š(¦"˙UŠ>ĄssG‚4bŽ&Śľ:¤ősĘO¤Ľ˘o¦ú¤Ź?úô‚;µ%=艔µĄs<©mą¶™GmçtŰ­]çuŁß•}şőęŘábWnü2SîÉż‹˙÷Nľ»ůđĺŹJ =ŘIčmđĚi§/š>do,pa) ‚şÜqÉ»\Ú-sčrÉ.ĚM"Ç.·H˛ŕ%^˘Ŕ%Îá„Aw¨`ŕ%w0xK—¬‡“ŰlBˇ¬í2„rÜBá2ÎáA/X’ァ÷„/ÜaIŰ 5P…—Üň`’/N1‰%nň—…WČHˇ%”eZYféV—0=Ŕ%p‘Ůĺ^–™ć™&t–An:dś ±¨Ao„r˛¨§Av&„§ 9íµˇL ˝@ÓěHóO3Š1¦T LüGˇ9"(š`P*jŮ%B 5h Ü!Ih>ępşŔ-–H˙1É nLÓ’6A3XâÄ-Bf h‰äÓP2·¨¶N2É%N hë–L"Ă$včT­n¸€ˇC(“%S@9‰ťs(pćÉ.ş‚şëĺśó$o—đ‚ÉçźYĘîľóâ 'śůz 0ť|ŇąĄşzňé×6»Ě6Ç €Yx2ö4c1s`oÂň+h«]°şSÜXň E•ě˛A/8ÁÉ!·ZđČę– ×ŹOÄôBCpN‘śĽ® Đ&'=°Ň9/ítÓP»őË/7=°ŐUg­4ŐV3Lő*Ľđ‚ }˝ŕ‚Ů+Li2ČDęqRůy×Qr7uťrĘÁM·@Ů˙ÝŰjR5RrRáýÝSK…¤ŕ‹‡D8Cyň­řŕ|/^›SÜAwyáp[ţxR™k…•Ţ~[E:â|3uúަ§^şRb;!¶/ &öbçţÓŢüăŹďűřÓ»>ßüîMđĹ˙ŁŹďÉűSü>˝;żüńÎĎüďŐďŹö˙$Ż óÓűNýóĂ_˝ňÉźĽ÷ľKďű6ţř˙?Ţ„/˙ďÚř|đ‹?}üă‹ß7ě7ŔęŃyäžď¸Ŕß-đ{ ÄŢ?8ŔNĐţ€ xÁhc~ś ď´ń˝ r%ě %xĽŢŃOŃ« ő”÷äío{ż[ž·Ámčc¶řŕń˙ŕ· ZŁű؆7ŠčC$2ń‡?ü ń~¸mT‘‰V´âꍋ*BĎ‹Ţř ˝aŤ-ĘŹ„XôŕłxE)J>?ô`żg‹}l1Žc´Ł6ľńÁ$Rq‹I”ź‰E"zń{l$""ŁŠ‹Ô†-¬ŃY±büF-ˇ ;PA@Ł%áKTˇmd˘ő@NJâ‘}Ô…-lqJ>r‰ô‡$ţQ‰SîCF|â6"ˇFŢqjÄĄÍHD9¶ű^dцYzĐI°EŃEęUó•¶°D,"a‹zC‘°„,,a é}#˛ä+ŻIN[HžÚPç59˙KYĚRĺ#@#qOtÚ3űÔĆ= j †Öb–ą˘%qOIhŹ÷ó!ú.šÁkď{-übďľż}Nń×Dd+‡H|˘ÚhC=Éą KDi¦=ëŮĐmČBy¨ôĐ*Ty ôÁΆAµBşĐHhă¶Đ¬Ó˘úÓ© Ő…Ví°ŹHlăž6 §BSĘVD^sŤ)iđŚůĂhîĂßHC5ŐřŹjş!·ČhCŰ ‰oÚó­ę$l$"ȲJ˘°Ö¤Ł-d*‰8H˘Śmá,#aYĚ~ń},9[Çăý ţ´,Aďé·ÖbmałŘÖe˙ţP~Ä“«JCJғޙ»=$ýęŔ& S§uCe! @ ˇŻ“%la_ůJ+Xˇś•(¨YÍz‡*\•n;·a)q–˙„h8«`‡PFw˛µ§>ě`;śÖI (aŰPV¶63Ź&5)FŤ)Wo0ćx¶¨ĹÇ?kÂő®ĺĚ-ohMý%´A\đ_ąŤ}ČŻąuđń ajňµ€Ź`ü˝/fô‡•¸Ć?Ę(á*ţ®Ŕm«}ËĚŘ·%Ťc!XĂ.Ö°†ÝĆ'čáZŇrĚ­»em@ąÉ ôđ÷¦ż׏,ă‘'8?”‚öĆP^ž±,Ĺ·Ř˙´¦}ł‡í¨ż/řËv´Ĺ€Ć>Ă“Xě3 ˙ěçA‹Ą( ËFZŃ\4ˇ -čJ7:Ňž4ˇ5˝G.GT~adk’“|ŇoCŔÚří2;ŤÄ%f·Ö"—3HČ&Âz§Ţَ`˙öŐJüa ťż}Ä1š´đňöG=/“tŁ7Ößý‚mdćVÚč›+ ihm&×YŮH¦6µźýŮ)ÚyyÖNv—Őîk—»‚.N·–ˇ˝ĺ –pÝó6·[Ýj‹ŔS¤ú.zR[Ú"ž«ţ1Ž%Ä*^5˛€.őŘÍdşř⌨§ ë>tŢűŢń;÷¬ {Ä‚ĂK˙¤EQŻ‹‡Ž× b'A;;H⋺¨„&÷A%6ń™Vž9 eQ !1Ąű,"m¬ &´!®Ţ†.H©Dčő;˘Ú Zwl‹KDAËĚX%šÉÉJÜh”źŐÜN|ź6†_-&Q9f0¶ĺĄ$nVmÜŹÍ"2' ?ŠŢÓ‘ř«"Aۆfľł TŃ%,auôŽWśĽí-$ Ä"nţ V2)ZAH]Ŕ€Yśe7ËęI¸ňÁ ą$ŹZ¶Š¶Ŕ$ €ŤŁÓ‚U gąů<© °˙Fä’  Pf Ô€ 1@ Y pP”HEEJ¶ IyUtJUP ÎTEÜwF7†HÖP ßpD¸ôHúÓEmFGč”ůpcr€ Đć'©pxPj”»—l˙(I»@y` ňc ¤Žč;sP U€ VDA¤q˝¦IW==$e ·`I°KYÔ®şDXgUN¨uTűxÚ$ ČÔg%Ge attcw< Ŕ•` 5ÄI ¨Ż”juŘoW‡—ĐIÚШ@ ĘUVu€,  5SĆx ńĄ[¦¨rp`Že Ý 1`±°O¶ĐM0T„|…ĺA“e IQ•šJne…U÷DRôŐpD )FqĄLR´ × ń°E-`T EńP  uţ ŤPtĐa|´ PPD¤ q@ŤäCâtJ)D¶@W˝FH˙V[$UoK%D„|čÔEMŐPV„^ę´GŤPMŽ<‡‡Ed7 Őx3ĆN±•gč%‡JVu~§ txW’`{Yx%?‰[epŻ—aVJúŕ ¶@"”×c6ITŃôě„pV şPmţp fĹvO„R‰HߏsĹeɤ<Ş´}@R/¦I*%tci“ŽDDÖ RwmĺT“E<ĺ˛tML¤`‚7€ĽUm@‘pőAפfŽiZ(•cRdpçÚŁ@şŁB*ٍŁŚ1e4 nŕ,LÚ¤Nú¤PĄR:ĄMş¤M: Ú WČ×KéKÉĄČ'[Č÷Ą[úzŻG¦dşĄ_ş¦[ަnz¦m§n ¦c:§ëäOEeyzÚP^ ¦‰×ŰÔŽŔĄZXK9¨‘@¨J¨Ť˙đWŚÚ§‰ ¨‹Úr°”şMŽÚ”–*¨… ¦š*Sśz¨š¨ź©•ş_€ş”†*S^ZGą Ů@BCfĺôŤŔ• Îr ·Đ«“p T¬Â ĄnÎb¬Ć: Iŕ·0L?ńÓ>ľŁú` Ë­Đ ­ŇŠ=9”aĎĘAŘ}ÜŞ­ÝŞÜş­eçú­ĎJT–÷U_…^đާózpýtŻö*ŻřZŻüşŻţŞŻůŻý°÷ŞNřjŻś¤ ”0ucw¤ÄŚ˙ŕü0±o0 ľę,Ŕú«۱ű±˛+˛ë,o¬I@«¬'+IT) Ő hgŮ %˙G­Ú ÖxÖ ~ö@­?› ?[r5űłúĐş4–ú`Őjő@­úPłµ€vđdQs¨1›łDO˛ ~D»´Ů€}˛D‰ŕÚ@ÜZMëNTyPäÄNU wZ á”¶m›¶c©NěDN…·N…·¶§¶n[ ę$·{Kt·{P‰;–…»¸sk  ·é…¸ëT ń¤ p ›`UłĘxä¬ đŰ«$;¬¨Ą뤫ű« § -`QmP ¶ úP Sł:« QĐ6›jµ “•jů`e±` µ ‘ŔT˝‹Ľ±pĽAôĽh‡ĽÖ@‘¶ \şŤ= ňS“VµĽµ˙жд_i MĐHeeą?ˇšŤą˛`ąęôPxją+ĽţDtó*ąöĘżń;ż÷{Żţ;·ýd{ô›`E%ĽötŔiëO–+·öú·ö{PN°r»Ne r kÝpdş"Ü«ł0Â&|Â(śÂ*ĽÂ·ŔT;p  ĎKNđôĽA¤łş L`­6[ ‘ m`łÔÚr𤼥$ p ąµđt2ĽX·‹v÷ر Ů€NĘkłn  ¶{Ľ5 4ëOMŔR’ôPőT­ő”Ľhk°“‹°‚űU‰[żĺOu»Y|¸_ő¶w,¸ ܶýä¶}LÁ•ËNÂË·r ČkÁ °˙Ä™hÔą€µ`úˇŚ6ÉŹÖź•, Z ?dąşP\heM+ĽÉ«ĽÖp qŔ,` ĎOsX»‘đPÇ[łË+ rŔ(Ľ2[ Ë+ ·;IÉI±:‡©¶Ľ9LŐ ĽVfe˙„L HBAä5HLţPMG¸ö[ąůëTń{pětŔţű·ůŰĆ Ŕţ¤Ćç Żâlżäż…lŻwZ»×<Żä„żvĽ—é%NMu@ĐtÝłWĐĺÎö Pň»ÍüÎ|Íůzp.Ż lżŮ|ŻŰĽNJd –j8»ćŞŃ©ÖN2kEˇąŃ"˝FŐęHÖ ÄU´CŰcKÝ }ÔIĺT ńëC(˙m®ż ÍósBaÚ  ×ŔyAD×đ–GD›DŞŘÓE-IÚ°yÖđ–?]“Ame»đÔPĚÔH ŐL}ÔJćÓ9ŐYJCýÔś×ÔLmeˇdŐVČyO}EäôAť;eT'uUwctťś¶F‰L6ROÍ×Ŕfg˙ĹV˝ćAŽ Ł7Ł€g–f™]hőXŽmS€—]€—N‰=ىŮŹeOę$ ”MPędŮŹŤŮ‰}Ů9ú˘ĺŘ”˝wź˝ŘŹŤy–-Ú6őX’ťŮ¦ŰŚýÚą]Ú•˝Ř–ÝÚžÍۉýŰĽťÚĹ-ÜŤýXéÍuĺĎ3–b§ĺA»° Ý—¶° nPuőJMDŕ NB(g Đ=ŘŔ±đ7'I‰igwő —`µ T‡KUQŔŚF§ –PŢć_łv—†–[ë·GJW<(ĺ ߀R@Ţ=<.ä?ţăÝăăCţ ˝óăH^=<^äAäRîăÝăń î㽳äţĺ^îĺTľäAžĺĺoç\.?ëäA+uäŠôyž[$kŢ˙źeHřůšŰ9ă•îŹ{ eEO;´×ů=‰ąĎŁnß /đ?äęLżôoë˙ôGOőŹëG_ëDń¶ţěW_ß ż@I.ë^Żôşąńgőţ?×  ^OMu:O`űÖťLo•îkçťę=Ll•QTä&ôாěüŤ¤Vö‡ďë†á©.BŚĎŕ>ě*„ę $ŕůmB“/ě•Oů >řöS•—˝ĹaśĆˇŠúˇŔEŽyTV§ <‚ĂtOŞđXMm`á$ MĐ˙€űáÔ,Žűy€|÷áDNąKśMĂČd –  aZ«§…ďग˙ ô˙gÍ,ďřŕţâ?ţâżîu´çP»tkÓg4´e±˙ő†žďOoöon]ĆťSDu÷Ă‹y¨JqiŰ6m’,Ůşeëßµ Űlű·Í–D[’léú÷OˇĹH¶&JŇv+cĆ}˙$i,hÍÖ.•˙Eş¦k›$o^‹s dFIß&NěčŇͶŽDšTéR¦Mť>…UęRoŰdéŇ÷ÍŔm#mó'Iß6oűĘž5kV’¤H˛Řr\++ŇZ[s×¶˝»V’Ű˝kcŵűŐŘ}ßôýW0qĬc5Bü–âTĘK#O–±2S7ZôTmĄ Ú2p ęܱ‘"Nkě˙6}'GOő7Ńě6]ÚČîs]ppăŻ]m]Ű5éÖ¤YĘo Ľ]útęŐ­/őmZŰ®ű<‚}ëQ|]‚…˙Ôe{â¶ą}‹F’d§¶}M,éR›X–aţAK?żĺš[zn‘®C0A´î›HŠHl›Ô ‹ăˇÚ<’Ą[’hËÓÂŞË-…(/ťŽM<ú +č"ŕ“d0Řč+Ë–ČJĘŚAwä±GĄôIA=6Ńf+ăÄrp6߬‘);łöűçTšHłĹD#¨ Ů`\),ýřË* ţ¬yNą7¶QN9Ď|dłM7GłEľJ­ĆŻj[¬«®ĆjěúţŮÇź(GtP8˙=˛ĆĎą} FÁÓ3$']îKßÄ4SMťę )2ň%Ř[Ś60ůŰ';UµË˛4íTmŐUYłË·ĂpDJOYJ­5˘DGŠ,Ł%ĂlÍ‘ŚU ŮM—e»ÂĆŞÓ»ť\35«T_«Ťń¶ĹĐŁY¸ĺ6!ńÄőč ň´a1±Ö"˘6+,ô)ŔIĐü獞;S'‹´iŁ«r(<ßL _/­tŘff¶«ŽĐÝŠ H’HIßî›},Ůq,[ôÔ¸+đôC‹˝‹­Ůe č ž:IGé#„L„h=ďŤčfJćąáďŠTÍ»8Ŕ‹¤‘6:ňčbScŃqźř@JU[Ź˙ľ î$=Q*̡«NŮžż^–>m# µ®ŠmlĂ­ŽíÓ6µůĐşöňĐjYĐňF˛ôŃe^ÍÜ捄Á&ĽđÍZ„6čŠއ Ç‹ O!Š]ĄµYW1=÷ÁĘ×.ÉŔĺ¸6ĽtÓ•řˇ"ązi˘Úü1쟲®¦EßšVÍeÉXź‰{祿>˝řŇůUh;Ő¶i$ź­V¶Áţ9 PAKňÇęôźě3Úţzďqô×{@µ‘ĹY,Iß#Ký?ol™7ÍĺśSŘxý kÔŐéÓmüç¸ěd‰€ş3 «^uŔ&pÔÉĚ’Yśl š”ßö·A˙Â}ĂA‘jÔ÷×dv‡9Ě÷®¶ĄNŻ…yaž^SŘČzQş•6,ąŹE?bń|·/ -@%˛EKŽ% âm }łă’q‚D*v-ÉKŤ.2¤>-ŞěR°‚ 2b Ą+ßKDŚóťmx°f§)cFÖ8"ßŘŽ)š[LµaŤ&VŃŹŇňÂk4â/‹Ů`ô0'ddnąWEÄ#µńXdnAaIób“ĹÝ‚’vÄN%â;SýŞ38I˙¸ĘëH©XäŠ;ÚŃŠĆU©f“đ%b6Ä—Řbcvv‘IîÂ%ľ9 T4ç%IÔBc}»Ć%öq‰„ˇ˙éf¬Ä&Ƣ-?ŕTLń¶ Ť}#şpťU& TŢK•Ů„§hŕFź˙ÁŞIA×6hˇˇĄĽ3A:ÔGŤĽ)tÁnP‘Ah°¦¸P`54# }¨C 5QRT˘ĹčE5QŽZ´ŁýčF=:R’Ôˇü™gýTAÚpěX_±?dšÜâÖ&á@Ş_5&‚‡t8żD‘‰oHŤÄĐM( Űqk |Ŕ‡»:IHIÚ+r2 >˘Îń}(‡x0Ŕ¬ĺ™­H?•'ĄŹ~şţłkqŤ8¸­K¦]›yBĘ™T ˇ˛(§í»ŁŻÁ‡Ů†F“9đÁÁ9yů­ ÄBÔy”PQ®m¸ŻcÉlاš)¤č­üBľÁ˙ËńB)9–cQ™9¤Ă:´Ă;ÄĂ<ÔĂ=äĂ>ôĂ?Ä@D| )‹ŮŘ-9r„x4~¸'[pHp~Y á˛mqHR¸™ ×`©ÜŠ7°$ĹK°„;ĐÁS4ĹK¸KĐÁQ4ETtETŚĹUlĹWLEYdEWĽXTĹYäEZěĹ\´ERĽĹa¬E`ŚE^„EV4ĆgÄĹhüE] Ř@‹Í"©]?^îmśŢAńíޣ쓺ܲe_ÚißĂ5•(ęŐú‚řŻDŃż3– […(ĺ3n‹Z…R&ĺÚ‹Z°XVeK8ăJŘ"Y°e[€eő™c;eSć3–ĺŠPe AšŽŘ"¤± Áe]^Qˇáíĺ´¸áŚĐ…8h9ŕ m‰ZjĘÁ#ůu 9˘d=Qn RŚŹA'NüŻLŽa݉G!¦„”Ń›$"KJźőˇôaź9†0\nźŢí:ć倖¤[Îe˙:že‡Vh‡–ľ–¤enĺ‹®hI˛ăŹ!ŰîEJĽyĄ¸üă–2ě‘§<•ŽbDJźŽ(ĺ ±šľ©š¶ĺ\n¦g–¤šöÜxămééńă-nf‡~c0ţâ-cU6a0ŹZ8¨ö©Ö嫆bnÁę©ćęŞćb­$ŇôI”i†žÁ´…›°9| ˛ŽÎ”Ť<šĘ¦‘Ŕ‘˝Ök¤Đ¤¨žî1ëŃ’ `"ö[öĹ^T‘‘SâÂpÜŮbëŐŢkY‘ÄĂ‚ßđ _ÂÜGaß7mÝŰ–Ö#ĽŘ^``ĹOÎpŤŽÝŹĹ†Ę, š2˛ČŽŞ(Ť˙Tń’ mĐm"L^šĘnâD~‹żĐ »x F©żŔF‘‹Ľř‹ŔXnµiî»ŔnëŽnčînîf¶îŔŔnÜQnć>oń†ÝŰíŢjÖĄ$° –Î5|iöÇKÂĐěŔJĐ’Ý6Ť˛0<Ç­ âš­) ůáśş^Ů`š,Ä8Ő– `NS<&€(č KŠ™ńh“íălŤ‰®¶‘ô ß6@â+bM« 9` ŰűŔCtŤň]¶hąĐ†#Nb ůă%ˇGú–đ§aö^`3íđae6H2ń‰xtŰM|+Ś1©ČkÂĹÜÄ¨ŁŹ›[H”˙úËć•˙ ®‘5†ň˛´ôIŕ軌֖+*r!TmuľOČąć‡jś¦ë®áŔCtˇ‹óGD Ľ°eôfż°„á [ď+ş"_`ľŤ[>!Žń"Úó˘9— m@ëCTëjÉsď@§>׺N\­âK@;cZčZv‹]^ćťč\¦eb‘ĚŽžĆިô BáôĐ8r=^müE[ŢŠU#^tYÂÎ.ńA74/ăc$jő±c†®076mÇ8nÓ^`ËÎ’ v"^Üu—žjI÷wďxw÷x§÷y·wvW÷vŻĚ¬@ëŮ0SËħľ¸ńh„x˝˘–ËmđUouVĺ˙]Ö錏f"ăš.kŞN!&iu$i@Ż‚ˇđ•w|y}7ů|Gů’Oůz'y–“Ř5öŮáăáČó Ó9ÔtŕŇ#^/äA×!‹Ćö7Nź*@ććö6Ćv~BdŤŹJ R‹ÇD „»úy¶©ńČ1b2.ż^żÜ°˙ě±ű˛'űł7űGůôµbťĚó$Óá°é)rVőfő 9d6fWgź,¨(‹´ůbKbź\~őö)w÷M÷ÓŽiß•…ć!9[xĄ6Xd¸ń]Ě×´mp«Zh}ŕi%~´HäŇ×lÓw.Ô‡ßŐ_úÖÇřőĎîV´xmĄp‚˙8\I}_ő‘!gđ‹űĄHĚă‚Ćh[Čŕ‹$ČeőjfźYŽŕķߍ×x2A8˛¸+NŽb"&ŹŘ‡Z—Óđrtʱoů{?y•w—_ůb' #„Ú]뉀h€e«¶ ›I˙,hđ „µYÚçmß7}#ęÚ§°ŕ­KÚdŮŠeIV-ޱlIŞő±Ň.¶V&áXňŁ%[!C’”iëß6‰îÓöϧ6žţܶŇ_ΠŰţ»©mN{â,ŞíćN¤<źĺéÔĹś·i«s,R bu.]Ű–-R¸n㢝;÷IÁ‡z·80ôç>K ő˙ ¨2p[$I¶Ś]é"äČ 7ę ¬ä[‹k)¶ł¦-ގeµąĄËV’H+E{”łVhKÖŢNÜů·­eźú,E’Gs$Ł‘†Ż´ŐFVâ䶆·ąÚč[ŁH–J¶Qg[ŁÓ‰ŤŻlÓĆVvĹÚ$%&\µ$ĹŤľo˙éž(ü÷ňăÓźď>盂[XĐ5˘` AtT’x`BáÄ`e¦k2DlŞĹGO· !‰,•ÔÔH®…XQeU|íT\I$m$›–čłoĆ$‹b’XłŇ?ŐYŢj㱸\zŰéI’$‰?éŮô]g‘ő OUi›ŠT>dĺ˙–Xr™Ą6nDÔ6|ů•Ą>´#q‡ śq´'îcË7™ŮÂ0‰¦H$5’Dß…ÖŃJyۡHiŐĄ•őĹTV<˝•EvúcežAiCĺ7vFôORŤš)`Rmj‘Vş}łŤeQŮ%­uŐŞm¸:ş^cţ„Tń©iĐ7ńČcĎ-8•lSŠ5Ő°r"8ž}>٢ĎÁ6ˇk#䧇q4R“…®…’%ŢVU]•¸_Šc ŞCąrő^»şľµÖDž*[”7gá:TZ?Ń«ŤŁ°zÓ]úŢš+Ä ç*Żý§M_&†6öLCM˛+ą±çM+ ´˙ŹŇÂąM,Z¶űÓSznĂ™g®Áć§Lm4ŃD0´ŔDj‡˘+˘ÉĹU Ř»c˝'ŽI~”ŁÓâč'L9Ňě$‡PŁ×mŽPw-µźŠmýô‡e{mö‡> č©y˛­â?‘쓟ŻJő—k€mcM=иŹ.Ří˛YeúT Ę2$°Ň7eË·IX凮 °Ť¤şÖř¤WONÖŽÚ„žÓ?’ čÓE'ţ:ěFÄF%÷j#RLö:|ßdlY´ĹÂaěĹ”&Ň//¦'ź~-Űi¤ë2Űi‹]Ő’ŚĘRQ’T×3zźXz8޶çR’\eTgÔ^u•%ŮÇş˙ńőÇ.‘$#ůtÜi¦‡Ř>*f±­ë>MBČ6 1f%„~öŚ‚Ç” 8(2ŃV˘5ĘíH3Ő[ÉŽV“®šŚ¤E˙hŇx¬qš¸1f%WŮ“,ľÁ.ŐĄ;5iÖ.Bčě=°‡*‹$â°ÄŞ:˝‰5$ń ÎÇLyK޲ oŘăŮ™‹–×™Ô]%x>üÉb–°Yp3gQ% š@®fiĽH@´’R-…* Ь5,×5ĺ&|<Ěy ‰ g\ţXĚŚ w•¸íĂ ‘ _ü“Ľ(JqŐ G˛rő5e<ŚY¤ yǤ9΂:WWłU~Ä$˙ŠŤ·ô’íń¤-řzWŠBčgN’á%d€™8aúĐT¸z RrB–±pEALt—-ó„´"ŃČÓŚĘ‹ěă1nqĎňĘŘĽšśDIˇyckbŁ$ŽŚ[6©VnňČŻf“,i©×íČrL}®'ĘĽÝSř™”îSźÍ'Bů©”„tź¦shBŞĎ~ö 9$ńHI8”ĆŞoLÄĆŔ°ô!Ä»hČ6ă´¸/=¤‚ą ·f"—­8ś;ÔѦŁP…ît¦#‹O{úSÓ U‘>*P›9Ôž"u©M=*Qź*UĄRU‘MMŞRŻÔśěN>ŰđÝ™şBÉx†r Đ˙@Ú€¨üq›©Mm '3š}¦ś–  ÍTCÓ’ĐŻ˛EOňË‹ÖD­éKڸΎH.Do¤şÎ%ąUžS˛’Đ]9ňXĹ ‹&’¬Í4Ëš1§ŁíŚ˘8˘×V޵lśě?>z"\0(*é."qť>žo•ŤádJqâMÜ•ňĄ§Ś©b kąśš+D«ŮQJö [XĂŤˇî I¶Ř(ĆCěśéskj®‘Lö|‹-/fM+Ţyf bďdQËŢ4r7QóýSdsWýÖä±ńÝxW•§ü®6^lŠ.XŔ„8†peB(K§ş€ł­ŃLóú´ĘĚšDI«]§+[˙y®-ZŻ'»Eá¬Z88NNDÜ5É[®X:WŤjT—Ťë\ëx°ŐńŚŐyNmČ&Ű*u®6~°ŽSÂjëž„ĘÁťŚ@r 8‹4Ů M…_VBîyŁěUDS9ŘPî…äíMäاď-˛äÝ yá{ZŞ4©….hšŰŢ•äŮłzo,ËÖŮ×°6$yć‚Bő;±&DH(®€ŻŚŔ–í>)ăĚ öÜ7Ş&1qDެúą¦0ŰjU©:T¬Ňš¨NÍj¬—*k]ĎÚÖľĆ*®µşkŁF5ŘÁöGWńIĽ*L€ ňżHh¦d(łpb™˙ż`Z!0=”·hbąęx/ Żü.›Ő"ŽL0*TŃ÷Ѱ©Hĺ!L±e™BÇzË»Žö†JVę8*µQiW¸E0upSő›ß”•żűMŞ“Ę=:ů‡®úŤ-řx>`}•+8X¤r ił„G)—g1ŹBĎĹ\‡ąĂŔ@ŻůncE›äˇ(®K؆+~ZĹźÇ4:Yî©*˝'múCŁľô‚Ný N‡úÔąŇf2ł-ž˘Ę“8)“4AŘäŮ{¨ [ĄŰ ů¶ĐZk‹4R; M€Jp:’‘lÔ#ŢrЬ.ÎvxŠQ,t5ע“Ĺ_Nń‰g<ăyČ?˙^ňŤ§Ľĺ‘DyÍ7j'µgzŇq2EŠ%őڦ·§ů8d62ë;Ő”űŁ mHLś-ÇĘ9zc\ž›ž%ʢ‹§„&Zß‹\Ăe˝qyů©~dÂôČ_EŇ];-4Ń#xdQVĂV@J±~îăů–§JDMč|ä!AX şĘčÜER‘ézŻ|_ŁY¸ÁÎŤTáÝĚ’đ‘¨ô-`ë@šmaĚ™TĆ4„IéT†T‡ÉD”(FGz4‹•ÁI7EZ§56˝ÉX˘„WFÉ P@@Đ*%W!Š‘Ěô¸šuŇ-ŘÉá`‰7üÉv˙–cxOÚ1`ęiCÇ)ŰÝŃ­„‚1á¬c” YĎ-´"©ŹŰÉÉJť µ8ź·—*…›KÄADA  €~ ąÜbɇÄS¨X\]žDČţˇJŤž¬xäĆXáI"ÇÄăÔÓ\‰Í*éWh©ŃXÎßYΙÉÓPŚîLŚm,!©đRó Ä(J)Š")¦bĹ­â(˛˘*¶",ľ˘,®"‚SŘńN-Ő–Š"ž8‹"Dm[úu™š©Ů͆ľPvGL°ŕ~­D#ÂâK¤XÜU°™Md#6›uăšQŽ7®D8†c6–ă8Š#:¦ă9jŁ:¶#Ę ˘Z˙NLaÄ÷ˇ‹T[꬞„5DĐ­ž0OşŘŃś2nu‘ 2˛źYŽUśČ÷ŮVťćaGĄXŠ=EF– Fn$Gj¤Gv$HŽäG–¤I†$Hv$F¦$IZŐOČÖ{H™OŘ.üCŔÁÉlRgb¤LJŤGá“|›1ĘÄd•Łšq#Ôl]͆?$y,UFâFě¤2RĹţ"W"ÖK!Ĺ!jCĆ.$„ăŚ_p±ŚËŔ©`¨ĺßsĹQaIŽäŕ&ZâQ4†wp‡lGu|‡khŞU#đäáŕ†`W*˘Nź2EáZđ"ę Ä 8Á¸Ŕ8˙ÁefffjÚĆUSáŰť¸YfÍséÜK`ϡ$Ď@- nŚmµËv†µ!5&>¦ĹĽÇÇBě‚&4@lfj¦ p&sr&iň!8ĄŕE`؆™K|‘Ů‘•SCŠŁÍ™¨ 2LĽ°`ń&zľä#$IÝIÄAäÉČÁ$XÂ$Ě \‚$ĚÁ%8u†ŇÚµ=ç…×¶Đ„j´ĆQ“©g G ß^ĺ*ŤőmĘYĽŚDÔĆ}‡v(ۨ7|h‚č˘h‰’¨‰¦č‰ľ¨‹Ć芪h‹Î(ż=DW‘ŢďöIB"ç%LÜ<˙%Lüg€ ŇűT˧ÁĺFiŠ^Q_m—ĺTŹ@ŇĂ4Ś4Ž‘ yé–)ůś)™˘©™nů¬©›Ş)ś˛©ś¦)ť–é›Î©DŔ$ÂTß$•”4BĚ~ ę%ř§$ÜÁ$ÜúĐůى´-*F¦LmËýĹ…ŕÔu6c Ů‚n)ʰ‹ZÄĹž¨ČH9„¦'oú¦€=ŕďH`I}CLđf JäRXË’"„u‚Ţ”î™ö°CBއřQřFôbG$¸Áů†M%y¸épŃWNS¬ŐżáDŞ>GMźÝ”–”ŞI -ÇŢ”Ě[ţ¤?ZE@*AŔ˙Ô—Q©•’V¬#hŕIô—Í(™TMOrĐttFŤ âŤj"É4ť\ĺ\cnëéCŽgX^źA$ËM Y’ϢlŘ€¦,Ľ‹^—$:oÍ@Żň’óRŻôVďó.ĘÇ6RÝ€eXbIYBÔŽŹĐnŃ6±%ĽŔ (jF\’V^Jz$`ŠĐŢŠŮÎ -úě‰ …ét””ÎN ”Ú˘Ş®jOH¦Nđâ74Dáxß í&“ĘČ—XËPž’|!–¦&I\Úy×unÔkęC`žÇ±:«÷ Ď1kÜ-=D°ML¨îŰ®*NgePDz˙Ná,ź7<Ĺ­ Rtúî!µ/ÉÔX®†›Čgśśfmk •ř`Ĺ„6\ĂôĚĚŽ 2>…,¬2±Ď’†#ř仕č:mµgTP™, €_Y±žKU'„,^ …Řľ’‡#´zä^öNȆڛ0R š°”V†_ů˝±„Ý"™@ŕ?&­AX@A´Ť‰ÉălDk(­˛ď\µQ'eR‚ĐŤÄ+˘l}@Ĺáʱύ'ĄśP© SA1ůr/ďR0Ä/ ł1źĐ0#ó1ó@섞â„.>Ä!ţC0¸Ž âĺ±Ęĺďrđă $bˇ°‡”ŽÍŠĆW/ôŇ`ě˙!Ű]ÉGšďBR?Őł§ÜłÓQÝŐÔ@]@%Ý?ă3? ”?3]@ďs>ő3@4ćŻ&K“B¤Ě !Î5¸Đ.ŕJU„R ÚE·â‰FÎÇE·Ů-ĚÄ’±âŮżÔlňŚmrŘa‰>…^¸Ç–ĚÂÔôRäáNwhOčO;ĘDŘ4ŰřDMuQ˙ĂQ˙ĂDµOk(PCuáé©÷I¦QrhnhźáFxÖŽŘú5č`ť $N»v©Xo»tÓ.¨UOšQÜž˙šśŞYYÔĎÍŠ­ěµFK§_Ă `óuÄĽEÄEpRÚżU#Ę•85¤Ů×*©ÖĄÎTşńY Ż˙5ââŇ}0N7ąu‰z‡5x‡÷ŠqćrfTG`F˘WµŰŕ ^xŽ”ŃrÎĆÇxÎvk+L­çصç.RrÔn±P†ó†…›’1Jŕ¶ô®[°ŢR-Y¨Wm(™ŕ˘Ňń÷N¨ŔJ@ÓöB9·¤¬Ż–A’Đąsášë™7}ŔcQČ#Q2Ý`8Áed± 1%]Ân  ]Ë—&L`/¶—ÖíĹ! ZđăŢx!`#®'Ţr4 x·t5Š L¶éŽ z˛nmnuiľČťĹ˛ŻŤŐ,/uKEĽv^Łő)Ź­„x×­áR¨8…Iä-{ésż8wsoŰzŻĆL3Ş˛˙%"…ČzŰ'÷{·wb©ö™SL•U[”Ky¬Eą•SąQ]ą–÷Ú•CŐ–{9®źčŠ-ßVbŻke,…ÜVěĂwzějMôÖD^ÉDgč.”Ů VöäŕŐ fPŚ-Ůą%¨ űŐ+zLťćˇ/y ŁRˇŹÖ™…HźGş¸AşMHş¸mŹűđWµ*O`8o¦I^4¨ÔŕÜp «Ćî]rŻ_,pĎO]×J|P }ĺtöÎ9¸Xoňćúô>ďŐĚą®şą”¬°“Żëj‡I/9©›éÄqŔđ©{·7ťňšGę‹üŐˇ“-¸|ňźIľęX”–LR]á!š)˙%ľˇłş«§tůyĽjűúMú˘KzwşÖŁł_‚ZúßÁ˛Fń?Xň}D4Źîp“Ć‹ë5ö›Í%h´ TqMČA eó]ß;]_—î’ÍŮŘ•k>ďśĹŢ,ÁARŤ:0ZoÉ»ĽÉGďËKb”ĘĆy+4ű¶4cu–ˇ‡ăę ú‡g”.,XµYČd{ ßůSůš®›°9}±-®ÔW}čxNPY˝­M•Öw˝×K=­AěCKDD»ęw´Ŕ¨yWěf¨łÂş†|Ƥ‹`ÖWCƉŞ÷M-÷„÷iĹo…ßSIZĂŠ2‘*Nx_âţâď˝á>©ťá#ľvď˙˝tľáď[9>®LĹář}ĺ wćg>á;JÇYƲ…ë™K78ĄmĎţq ďť8‹L$A>T‘€5Ňç»”?Ě–-™Č"őÔ•R;LŔč…>xĂďËńLűCŔÔĆž2ĹQ ÝM#őÄüţŞěéň/?őC¸SgO+nÇ•H4!¶Â3"\9ť§YŻ«S-ČÉ0B5Ô˙¸ĽYqHúá8.ó‹á@Ř8ĐÖ-[˙¶ůK¸ˇľoű¶íó&˘B‘$٢řMßB‡~ÜöO[G’'¦Ü§­!G—űztů‘ŁLš"CÎ\čć_ĎYj3° (L}–|&Uş”iS§OˇúÜé˙¤Ę‰şöEýwë’6Y–jŮŠeK–­Je–•$+NDŚe´$+¬¤ZĺÚ’dM§ż ¶ůP%GIY*U¨Ť IÇÚŁ”¨MŇTŔŤZÓek›@mš#ŮŠ4Ő3A[Ś%Oü yÍ•Ź[…­Mňę7IUjŰfŕŔÄ™‡µ>śéQŠ6m}Ójp[­ŻeÁBŹeiz¤8LÚX’Ô(#ÝądŽĄ‹–dg‡+[×zeQßeí©Ô«­6i«Ľ0çĘ6izŇ曯Ú¨ŔFtÁLíŇ(pmî[Ë’6Ęân¶ýÎËͱônb¶—&â/"onóI˛o†ZíŕkŃŧ(˙L!ÇZ®«çśÓ Ľ#qDŚ M­Zć˛Ä#3ŞÄš„ÂH'˙ ÍII$‘ň÷ÉH Ą`ŇM/E”1Ěů‚ŇńËm:+ݤÓ:c¬ÍĎ´ŃĺA¬BĚ §1ď3OâÉ'ýtă Đ}zŃĐC{Ú&Â^ J·ĺNëH¬)Í´J#h3Ó$Íń Ý€¬’ĘĐţ ˛;*eˇS˘„ eJ0Ç\sŻQö;ŹĄ;rl6İ&;kzŚ=«f%vĐÂüě)Ă•†˛©UDˇNKn V#˝2˛,mvaŚ[Í<­27)ÝSk2ĹkK–˛Ň§'Śé<ÇÄÜ5"xaýÉ7lę˙wĂ˙jMÄj? ę›ü$rÍŘF«ŞhD‡7\Ďľ¶Iöź™ľŮ­7ÉXŚÖă¨ô9 áż’´ąŻî’4­ŃB‹Ó#].+ÇÇ~pâ=uoL;GRQVŐţů5<…=vŁe‰őąá…=léŁ'’ş3Ĺ;ţŘj¦,kš6¬°}Ľďě:r¬ą*Ůq:YÎ"K۲ĺ˛F?woĄX~#¸_1_őyĄ8ĘrŚ/¤÷ŃEŤB X ę q YÚy`Šq–Ébť„ÚŘŁgŻÎÜ'o/üLą¨ bĚ»ń¨S»,şÔNąĺҧĎS”Ź5â‡דQŚmöׇJó⎦´…»Ś"ąĄ’µŇ˙Ő´’„±»śŰ˝čăxžťŕÝ#s"jڧFsÍ3§lú‘®ýĆďt(#ç\™ů°żJë¬"cQUDë_RúC“„ĆťöĄOÔ‘Q$Ü)P„äĽ*ŮGT™ ~d ]Č‚J¶Cmf#aďa¸[JJÔ“`jc*ˇ řP¸Şě/!,)č8–łÔ%Gń‹hp¸Łő}ĺ†2#ĎjhŐą MVúÍý°´ oĐ&@˙Ŕ×|ň;ŔTÄ(ßŔÂT˘µÎýË_µăÔ|ҡfɨj(´Ú´ŘĂ®™/[jůÚXĆv:ő™Ą,g3XäŇ7„íNaĹ’ G˝Á܉ JD˙ĽÁ!%ęC5Á"ěDB¬Řůohs!'29šTnPß3ŁÇĽ˛0ođRőÉaÚŚôťĐPG[éCY<%3Âý1c:‰KˇťŻ,‚ş<^xI% U°Js‘Äń(𵓂w ¦„ząËHP—ş4ć4µăL žUݤ΂bAĚi˘ĘŘ$ž„Vň ‹‰!Ý3Š'? ­¬ĺnkYacOW:şh©eĐĂg‘`ƶu• LgŇMČ<3•Ö°éK)cÚ˝„…Ą’Ë\R***Ý-ôk_‘Ü&-a¤@^‰mbĘhćQĹÓ‹,t†s¤UŰÚh˛w‚š<E1j5Ź‚ˇ˘L§6đ ĺ¦n¸©$â€@ŽÇu>üÔ?ܵźxÁŠQ™‘Hj”¨Ä®¶ŞęÜPĆČ!IJFÔŃkR›UĆ©uc± ńlńŁ]Ö!PčĚŚ4?YâoŰ8ŘőŞu´ˇ„E‘Š.’2Únw˘IÁE9¶]ℬaµăL)e?őät™K$˛+đ­t’:ťK?KĎń˙ŐMz,ç4›!Q•JGâÝ.S·Çݍ&dŞĆÚ 3¸FÝŇQRżĹaŮÜ ĽjTŁ Ř––‹2€2÷fŽĂÂ$‘1ÎěU·ĐŤâăŕ͆˘á¤ĂŽ"c­¸ `ŹqěG9#žV†g˛µhC6ęQŹH8ľâ©!xÄ#8ĘNicЅޱLźo„´/AQ6Ű,ÇH&¸ W“‘é@//ŔdE#‘†•Ô.d (_‰?†ĹŽÁş¨Ôˬ”?o)Ëí®O~EBbť°ĐLQˇÓřs^Ö§•-SYXŃî¤l,9Šĺd?5ÄňŽÚ‹h¦^Ú°ŤQmC;ĽltDY˘˝0>µ˙#± L =­ëΞRŮ윪ç0—˝“Ň’\Î&P[ŘşŚťž7:¦ÝWłv°ŢeäŞ [1cŮ+ţł±´ťÂś—Öď42č–Ädn(–˘#-ä}Ô'eŢ(ěÂŇ˙ú˙4¤…ÔBÄ@JĄ@¶Ä>t¤ Ä ŢŹťB@4%Üi" NƬ €$ě)âO]B•DĘáě˘çx«łćgIđF‘O'.$ĹhcéČĹŰĹ$äăLĆĎM†o!ŔË„îîŃ<ŽI>Çůö©Ř\‰m:0GĘŤ*-¤ŚčmĘäfDdQnÁ)ľc-ÁjÂÖěódáJĄßH/Ír®Î8KH&+ăÂbź*±çg,öŮ<(R˘‚¦ÂH‚ü Äú†ňĘŽxŔP°ĐÚ\˘îN˘¬Ű˘ëL0Đ}B, pHâxŻú@-íg?0)őa*álAa32 ˙ńé´DŐt  ФxÖďň$ŕ‚…óŠ‚ŕîÎ2é*ŃćJo~\j.*ŃŻŕ(çP¦Žđ(‡$ĎňFŢ”(KVQ©V˘ĆŤŢ˛ŃÁŚŁN8ÄŁ„đ4ÜH˛@,Ź<%ăZ)Ź"Uö$Ţô†#(˘ň1©lÖŞëě îČ,oJEáă× o:ś Ů –včqh/n n Pč/ZŞ Ńôˇ°6Ćîŕn±ÔîÇ ˛VF™ľĆҲurŃkFp†=hĎú°&! _K5bë#dŃŔt­±JKŹ(ßHl6đÓÂf,B#G´dëQ?<®´ÔJ*!jĺ~Ç%ĘС˙F†FÖ° ëCKŘgő† eÔ,˛–«í'2ř^ăŃŕň“˘©şLÁŔ¬vhRĽ˛¦ÇęéëBÎ⧳ϾćHżŁ†JÇ5ČčÓŚn’ĺjâĆ$Đ#)ĐgřČ„2uX&}ňb†NOfp †Q1O00^Ł2W“8¨rÖÎăËd%+Ĺë†|ĘţJ/ Éć3ý.źÖKţÜqG0h’öŚ&řĂ8ŹS8„ĎÚZ¨.'ĺRîŃXČ/Je/ĂÍ Ď(}ŃH Ż%sDąđčKČ‹Ś#*Ë3s˘ęş,^ Qý1Ťô!Q7;°lÎ{hȶmä‹ţoŢ~†< 4*˙hcřRĽxRęBiXj3(ýÔ´ł!7 G'mâgűúŻaĽ-XČ+DŻ&9ťŞQ.Çz˛ýčÉëî©őRFąöÓŇ" č`ĆS:„‹n4`"%xôŚHbřjÂĺ>DWkŁřč!r>˝"eVĎ·ŇÇ3Á˘;=óçDöŇńP%le%ě”6đôNő4OůtOý´OőO5P uP µ$ţA«…#˝4± 6ş’ôľÍKľÄ ¤Rm¦ 25S-p‚ńn>Č*řĂ%TÂTýTÄ!J•UOŐUSV_ń¬”%j•V%Â1nuWsŐV{W˝AWUD4i!`‘6śs»|R&˙m†”Ă^~⩪(+Úĺ'@ë'Î_ uW:ęş/&‰±9$a,ĘnI¸jäľ„RŠ Hě]˘ńáĘ.RLĂ+2E05Š˘HŤ–ŚF_ó’)Ĺ!â*UEQ6jP)vá‰?ôÇ`X#‘D5‘rÂż‰QŔÓhŚ$B‚UěŁ …@F#šŕĎ Ä¤Ţ4,Áľ¬"á@"Ą (Ȧl! "câÍsvgć/t&ŠŻ„ěîđň4›Ż âůĄ.P‘ŻNÝ4[‰ë.ö[O¬qäuOL®B€ţÁܰâ4äd Ů$(µĹç`®Z¤ĚK˘-‡fYň'6.*n˙o'wŇă;5ŹŇŻQK#l:—‚+ŘIEŽ+2í¬a;d0~„3Ą&"ÁAĄa~Kř¨gč!:b^Xâ§Ő5~…9čLětAŐv$ăg[ΰbE93I(çsÉ4#đtCÝlaVÂ\,AÝ#JH0Tge'c6rtćbφ_ę `źĐnŞwçćfT·Zr0%vP>Ob/á°eJĚW¦DTÎw}Ő—J¬Öq¸^OzqV&/VÔ¨´gâMkÔÎ4`ç P¸L&Ô“1Ą óäho&®5ZŻ_8´vĺsÜĺ!xĹžěĄ^tögĘ,1…’˙dĄrŹ×űnn=dZRJSŘ‹6®%,¦n8/Lü°¶2ş Ô1ől7Ő (•S/•S55wx…ŘR‹Ź¸‡8‰•‰‡źX‰Ą8Š©ŠV*ò-?OĽÍf ĹZĺWŚ8Šĺ©´5W®µfpŐ‰2÷]˛‚Wh8MëL‹"ä×]ęmŹ9"2^î8ŰĄŹëÍŽ3"tĄŽZOË‚ĺĹ‘˙ř‘'ZłU’Ů^öý&óťÂ‘H1a“‚+ă`bA‰pdÄ·5I ·&TC|+b‚D`VőA$ˇ0®'`J`sď1‘hĆ!VcV ¦ŮH‚ë—Á•˙ô_¤Kn%ćzť÷„Ą@}$7hö†ŢFÂbdâXÁ·'óáöN>­!"(€/jáÚ`q]Đ=mˇţˇ,^V/i?lˇFÂö!¤Űo…lşÄ–źcZ™…Y´I1ýU"ý÷Ź*&)n:†˙í$Yi ôÔ”}âÂ!0ë'"X)˘ýbˇÄ%r…WÖó1v!đô]8$•Ťa‡¦iWE yő'¬×˛–,)­gnÔŕ×!t:‹ŤohĄ9•8{â\l\ßë›Dc›ľb4Rf-¤m¨$śě#JÔŚ¶őJeѦ |ĺ˙J™˛CŮţŹ_ß~“yąőćXv")4¨o;YIć̸:‘:uŁpFM"–Ľ‡NŃăď1_q áVÚŮČzć–e"geZŐŽłóVi;ŘaŽ[ ń8=¸,7"0$ěšÚfSw.täŕ \ćŔ ć@&áÁ%\ü \ÂaÂ˙'ÜÁÝ ÂÂ%AÂM<ÂQ|ĂQ\ÂÜÁ]ĽĹ-|ĹeüÄYüĹgüĆiÇuĆu<Ç}|Çm<ÇÇ-&5ľ÷ŔW :%㆛bß" ""b"Ę "Ş<sM M˛ĽË±ÜÉĄ&Ä|ĘĄµĚÇ\ĚĂ<ÍŃüĚÓüÉc"Ëל̭<ŃÜÍçüĚÍÜĚżÜÎŰ<ĚË\Ú⹀ŮÓ߸/ĆôJ˝GOB(:ŹŚ‘Ę1Ń%]Ń f‹‘µ‹AŘv'}Ó_äş7ą`aq^Â1HťÓMýEVK1Ę#Ťx‰3eĐ`ťˇ¦X›/őlyŘ[rXеąRy˝×}Ý×k=ŘsÝֽ؍ýŘ˙Ť]Ř‘}ŮÓŐIśýŘŰw4Ž ł.ó%nŕĆZí5®Lc/FÚ ÚŁM"dŚř‰ÓD…mÂ=+¶Z­KĚŁŐÝĺ]_¸µŹńŘ(č]~çŢůýÝý}ß˙=Ţó}qŘ]G""W˛‚ß~á DHکߩB¦Ď‹Ĺh'ąŘ#Íĺ`pW0\¨@¶ĺá&Č‚d*—0Ł Dn\RŚB(—¦IĄba©c$Ă‚Ű>¨b=R"(RB«”řZcŠ™}ž$rţ`vž#(vUo^č†čÉč{ţ#vSVĺâZąš€¸Yy[ľ$'9‚otäĎ\¨šN ä†ä$oVHQT’@ÓLţ€. ˙rŻ^ƤÖ"]Óěs©”7ăÖb3:đťD7ŕu Ě%t§žOł)»zň÷˛q÷BD8ň6MćŘŞíĂ(lˇŰ!€$B3Âc°Âż˘$ĂBB§Ę‚ŕCä´'b†©Ş5ÚâGD’`-Ú dA%Ś U ä(ŇçkÔÇ…óÝN§ČGfЇ‡6ţ)÷ě {¬ňß"ewh űŻ_ĄfđÔ;4nŠFnĘX1%RÂ÷&HN8uĂ)ĺ’ťJe_©‡‰´6VäDŕ%U3—sH2Âß·}ŢîűöOŰż}Ú&<čo[ÂŰ"ęX0ŁAŤ>,¨°!ČŹ˙~ÓWqŰE”O¦\ůŇeK–*eÖ¤±ĄAmŰlŮz8QäÁ‰Jň‰ÔçE…ú&l”ÔVL”|ůóźÖ­\»zý 6¬X±ĘŇŁŹGQDOůă‘_Űś–Ţ@ŔQeBR*ôäEQ„e•ÄM™%[VQDa´OJ‘4PDÝ´¤ANét•›ůĄ·$ž)Ů™'źwň©&–nî©ç 9J蛇ľ©h k ş'Q µŮ†VűüÓ楗JôÚ@“.„饠ŽÉ-“X"‡V aş7 ůóÚ@e‹6>E˘–ťş¦·kB˝jók°Ľëëź7Ůt¨>U”źP# e[\3˙ťFSP$5KL3Ą´I}{ćJ'iDmąť[®¸ę¦kîł5±XHŔe$7ŔŞd/Ag…–‘$şlcM*¶eëR˛hŁËĄł- V–üh‹ŹŰt íµWŚ1Ĺ?kĐqÚzś¨ł‡kSPçr nł#«Q´'ż\Đi0“ĽnÍíÎĚn“ţTŠ­>áę)®śąąO©¶Ä#M;şXcKµ"u$OüÍ%•OÖč‚IeşĽµÖ:qýµ×Çⲷ!‹§Ę2“KöˇÉ˘móČŘşmÝ7M…÷¶Źś÷ÝnK”Ä›âÚF-ˇ ţŤ?’DÔŽ4ŃlÓ YŇ~µ˝öZEC±}sĚëŐ˘ű9çA‹n®ĘÍm·ŮhŰŃĘÝrŰrźt]zž{ŰÓŢ(7ů±Ü›]iШˇ.‘ŁŞĺWt¶Öüs“SzŽŃÔOÎ…Ü{SĎ“őóT=}Ű?™˝÷Ř×÷l©ĹVöç_?ý÷ÔŁoľűk]ź}ůŐ3×ţú×§yůó?öÉď|á ÷ţ÷?îp-śŢüň·ŔóťĎ~đË_˙Řw?[IP}˙Kr\Â?*5°| ů˛g€Şp…,lˇ _ĂĘp†4¬ˇ oĂęp‡<ěˇh€€;fox1.6-1.6.57/doc/screenshots/searchdialog.png000066400000000000000000000060121326741342000210740ustar00rootroot00000000000000‰PNG  IHDR ęŢĐ ŃIDATxśíÝżkGÇńďs¸ż“ ç/átä¤*&`˘´gÔąp*¬€U«1XŤš”D†śU¸9„Âu–1 ¸’° ‘c”ŔWXÂ^q™çVŁ™ý9»;łß÷ Bü<»ĎjvžÝůěĚţx&ŮĹy6™™€.ŮĹą\›ĚĚI–eC—ĐŁőďľ•ÉĚś\3oĽ;}>dy¸ć›0ż¸Üg99;9ňNs†€śťť9ßźźźďą$W™˛ĹPŔg~qŮčą,@-ůźźżÔŘúÂ@u„’oü9ęÂńžbrvvVvĎŔž§hz~XÇ5Äc÷H|e,› =DÍn}C@ů†Ű|&?oŮt{ľ˘÷|ó0T…Ń@ôěF»ÉÉŘŞóúze Ľ™žďI)  W” ůTťÖ¤ŔHNŃŃvŮx}ŃP çµ˘óC‰­<@ô3ôSvŽ=_ťá"ł,~Ś=D­ęešľË=ËćŻŇ¸ý- uô˝¦Wö”MŻsšoşë}B)ˇ'Š]ę ě<Ţ‘{kß R@7Lű."rďîťéżŻ ­Ţ^é§D€Ţí==¸ôšá PŚĹPŚĹPŚĹPŚĹPŚĹPŚĹPLýŹĘ,.Ýşôúäř°÷ż_çošňö]Nă¤:\ pÝFąO1— @š˛¸BÁügóM3Żóď-'?ݧÎ2]ó€‹ęžŔÉńaáđŠ}äť]4-äĽvYC.T‡€\j(óŻ«~®Ét{Z t~™ő!`aű0Ü uŞC Ę0‰ozť°€Xqb¸†P = Ş{ůĂů÷|Ó˦•ťÔu-'TŮ‹–ɉa>ɲ,“w§Ďeçńľ¬Ţ^şL€Žě=={wďČÎă}ŮŮ}˘»'P¤hȆŁjcAxĐĐЀà!Š !Š !Šur‰h—ŹEh{éćł/•âđŕŃ}9ýéçFźUyźŔĆć÷C‚h{`ÜI¤pŁUvq>t@äOlüŃÉäzë??HOŔ5\”Bp@š ĺ„Úî圀ýë]Ű»»W>łĽ˛*""G{…Ë„ÓůŐA®řüÓO®ü·ąµ%?~ś†Ť>íúří‘^Î Řŕňů§źČöî®¬Ż­ÉňĘŞěÔ2íf׿ŇŰ}E` Íě@—=‚ŽÎ ü]DDNŽ”ĹĄ[—`ˇ`eNʧCC¦7`–e–cćkđ»ę¨ĽObŐ÷0xGçüGě§5WŁč=ŘŹłéô>_·†›ĹŕBÜőŰFç=“ăCY^Y•Í­­Ň«DD^˝˙ 76¦7ŤŔeŮ6ÚÇF¸Žę××Ö¦W ůŽú_˝˙ ëkk2;;ŰE± JC>6˘—űŽödvvVÖ×ÖäŐűÎyň°ąµŐËťr ]oĎ::Ř“ĺ•Uy¸±!›[[W>ópcCfggĺłĎţ*ż˝űU¶ww§÷ €EŔÉŢ'`nr0 şy>P^ţÁq“ÉDDäŇMc ÁÉńaŻĎ ň{EŤş9‘l´±`ĎŞăč`OŢľ}#Ż_ż–ßŢý: ĐÂ4ü]_>Ýo ›6ç z´éăţ©čzůˇGÝŠţ7†íŚÍčš ‚·oß0`TFůŘ7zĺĎ„\ćé›_‚-šúąiŃ÷B˙ÂG÷- Rý9Đš<ŁĆ*ş«ý!@1B#@1B‹ţŃľŘwě}ý啤c_żQçaÔ˝›öÁŁű\Xú0ŘĆć÷Îé©ď¸c_żQçáůęŇóĺé±RĎ^Ľśn\ŮĹůĄi“™9)?ŞđÝÝŐĆXçćąPëűŽĺú%»ˇ¤¸MµŐ×6b×§KŃ“şúˇ–ˇö‘PWu®Ť+»8Żüh‰XwNŁíúĹ̵#Ä\cߦňR.k ŰĘĐÔž6Glůťu237=ZYřŰ_äô§źeáćŤFĂuä‘oqéÖô?×|ö4óď*Ďfr­ź­ÉúĺËä+[Őő±?W6Żk™®ŘµŁ—•«jy‹tUçvą|ď}uëąÎű®×eeů|±ęî“®yň˙·ßw˝n˛o„DOŕwůĆ23W©ëYĆüDśi”|˙®:Í^^ßě2–Mݞ®uçmSćŞe ]†Š¶)űuiUëȵśşeZŰí˛Éú4­ŻA@P4Ö˙­Đü—[gc‰iG1\?†Ý´ś]®_ŐeÇVÇM¶)×ëŞÓę~&Ćﺊ˘m¶Í>i7ŢElů÷ËţfQý‡ BŕwŮĹů´7P·ĐtĂŽµK<´Đőâ[^Qc:ôwÓGcY·^Šę+eŤ÷ßűĐŰšÚ0—éĺ‡~ěĆ˙ôÍ/˛póF«kŽë 9„äZ?[őëBȦ¬ž}ßG“2ôU硆TŞô|őŰPNmöÉ*GţU††µ'†ó\Wl„¸rĆ×El˛ś6şXżľ6Ö˘żă«ĎŞe =_ŢPŰTÓďĄĘ2†>bŤ‰o¸.˙ľÝđ‡<§Ç9@ľţň‹éŹĚŘGfćęŤ*GlEă·>EŚkšý÷ŞlHˇÖĎUć:V¶>Mçő•ٍ‘ôŐsŮgŞr›2óT˛)ZÇ6ĂAmę®!¶űsöňę4ôeÁá›7ä9‰dY–É»Óç˛óx_VoŻYpjěKöb"i«‹őă@H}oScý>ž˝xYë.ë‡8c˛÷ô@îÝ˝#;Ź÷eg÷‰îž@^źMŮGš¬_Ő#¸u±MťĚ«? [vÔ<ćú+C • ÎuůaĚ]} 4Öy0ŐXoU¨…ť)^|7h‚«@1B#@1B#@1B#@1B#@1B#@±VĎzöâe¨rŞó¨m[«ńW@;mž´Ú*řáHç@1B#@1B#@1B#@1B#@±Vw cnŢş—L&×ĺäřđŇ{”qś¨Ç0\őX!‰ç E%¤ŚăB=†ŃöAž €b„(F ‹K·†.ÂTLebC ¸ÝËÄ€Ă*ćĆvqéVă+(†d×éë@6˙ű±Ö!€`b#ćťŃĹUŢÔÖahÔa1BA¤F* €Żś®Í5Í|ŢLŻúą˛ic˘.ňőkŢ/«7ßw1$B­ĄF*APĆ^Ź˘×ľ×™–˘˘ iWˇć'†ŃJŠ`¤\v٬!©ÚĐÄŇ uĺäřpuľ÷6őkO‹µŽé  •üQVjbÝ)ëę˘ţSýN˵űڵ. B­Ąc €ŞŤYc©‘jC/ľé]ŐoLB)5©”Ő®}ůʱá+j}S©7z&…A*`¸ę4żötűj•ŞË-[fĘšÔaŃ´˘«¶R¬7BAũ씶şCćuىÉ:'5«–%V]śŕ­růnŮ2b@ ¸ ¦ť®Š*ő—Ú: ˇ¬©CB‰i犩,UĄXćQŹĺ81 Š ĂA‘ö?Q×ʨőŘB2™\şĄ(ŁÔcż$qňŚ2ęA=ö‹s !Š !Š !Š !Š Ř•;†÷ž QŔ¦!đç…Żdű‡ŻZ/pý»oeű‡¶^ŕ˙·­ű"’ ˙ë~y€đm+ç@1B#@±‰d÷Öľş€žíě>‘kŮĹąLfć†.  gŮĹąümó|ů_ĽIEND®B`‚fox1.6-1.6.57/doc/screenshots/table.png000066400000000000000000003301401326741342000175400ustar00rootroot00000000000000‰PNG  IHDRX,=Í– IDATxśěťwXTÇÚŔ»ôĄw©"‚€¨D±÷Ţ»±\ŰMbzOĽ‰Ń\oľ$¦MÓX˘)ٱEcĂ‚Š‚‚iJ•ľ»lcËůţXXAMV|ö÷<<ĽsÎ;çĽsfŢť9s¦-Z$8:ŘaÁ‚ ,X°`áî€SÇc 0zHŽźJÁĂÓëŽ/P^VJ˙ţýHřú[Š“ËN ,X°`Á‚…[°¶·'öĹ'Č*-ÇĘVR§ŽAŻÇÝĂ“kW3qusżăk———LE…üÎ ŔŐÍ w{6ýú“±ŕă×’˝BŻ7 7č1č ¤\¸LD›P.^J#4$ÁtţÔ)¶vŇW¬FŻÖŕŘĄp‹l ”’˛#`SŹl Hë­y•,ţ›˛¨h@v2>”UÇë“ €ę6˛ĐTÉşzd-PY‡\YĄ'©Gv¬şF]˛şęŢŐ˛ˇ*nµěX•á6˛˘ŞL4$WT=_ÇŞg\—,«Ęłşdë*ۤóľ¦ě±,Ô%—a,CŐ˛]UÜšr)`“ě”Ô#WéJ‹Ştë’ťŞ®URuĽ>ą9ř‡gŤ|v §Ő¨Q„ŽCN\×ČÚą€Ŕh5r$‡_€6żhĺW®P“€>}›8‘+›6>y2©żüBÄ´iä=JîˇC( hŃ˝;QŹ>Ę瞣>|cci7w.űž|€°I“đŤŤĹűˇ‡¸şgi›7#Ďή3®gt4ť_ť?gĎF¸cń‹Xꏡţ(ň:¶CÖšIc&˘Q–’p*™+i™D·Ť 8Čą\AvA9A!mčÚ1˝Î€Á` ńĚ9RÓ20 ‚@td!!AtĆ6Ή„DÔ•#FŚ˘RY†Ţ ŻŠ«'ůÜ%Dbáˇ!¦6‘Ţ`@ŻÓ‘‘]B5¦€R!CŻ×ŁÓë9ťÂĚÇ_föŁ“ůaýŻ|öŃ":ĆD›Î«TĆÇĄŞ2A±ŔŐ%s“¬Ş ×%‹« ëß•ąŤ\ťů†ż) ČŤ$ őȆ*˝údů=–ő {C˛ˇąÚá…»”5`jĘüMąşśV6 ‹o#7TöďD†űĂ?Ęą‘Ďׯ\Á=7ůőëś˙ůgz-ZDČر%'ÓöŃGÉ?y’Ń[·’ľc"˘˝N‡O»věž;Ĺőë\]q Łĺ1¸„…ŃíÝwÉOH děX\"#±vp lĚW¬`ř/żÓRT„ë›eY˛őmd]•ľô6˛ř&YV‡ÜüĂŞ*Ş˙zľű./ƱU+ňÎśÁ10ČG%˙Ě’Ö¬Aäŕ@÷ ććâKEQň’Ô:ť©‚öîĐ//¬ťśHݵ‹ Q”•áJŇÚµh**}ńE-Y‚,?ŻŽ >i^ŠŇRQłíÉ')ÎÍEřôę…Ť‹ éqq ţćJł˛ĐVV"+-EVVFËÁ9¸x1­VËď˙ţ7…YYH«žĄĹ?,ţa©?ŚúŁ­VÇÉ„3´oÄÁžđP“ΡŃhL:5Ű0—/ĄńĂşM¬ůq3ë7náZvîMmcÉŇiu¦c Ţűż/đ÷ĄE –|¸˘Vśš÷‚›XjuĄéďÔé>βŹßáô™óO8SëĽéćIÄ U=ë›djč4$kď@ľť~u®KÖÖ#×§ŻŻ’ Ȇ;Đ©–«Y\Źlu‡˛î&Y¨şNµ\}ś›tęÓ×ĐżYÖÖ«­qÍ›eQ ýşäĘúŐoÁuÉâúuÉš›äę¸7Ż)[Ő!««d«*Y|“|»¸7—qQ ť›ĺćŕŐ˝Ŕżo_J32(şvŤ'ž@ZXµł3áá䧤Đĺ•WČA÷®ˇŃTĹ„ZmG§OdöŁ#‹yöÉ اÖy˝ľŞŤŁÓ›ŽUVVâă剷·'Ţ^xyą×ŠŁVWRѢE‹„©c{sŕŘY|Ü% ô‚A ´¬g'ĘĄ2%AŔ ż_•đÄܧřĽM”j ¶ż+0öjYcl™Ţ­l…±ĺ{;Y]%W;ä˝”©ĘL;ntÁß©\ýc{‡˛ľęĎ®ęŘ?•µU×­–…Şë˙SŮŽÝów*Wż•ÜNWÉJŚyy/eĆňTS¶Çřćs'˛MU\yŐó¨)ŰVéÔ”í¨íőÉ÷«TŹé°srÂÖŮy~>n-[˘Ż¬ÄĘÖk;ă¬cŤ\ŽF.ÇÎŮŤL†K@•Čňň¨‰ÄĂei)´j5îî¨ĘĘp  (6–˘+Wč2gĘňröż˙>®T*•ČrrLzŇśÓ5]Q–” U©p ŔÖŃiN‚Á€[p0Z• iv6.Äb¤UăłÔÇnXüĂâ–úăÁ¨?Ď‘˘ŕ@Ľ}ý©•PTTŠT*ÇĹĹ ‰=šJ-­ÂŰ‘›“Ť›ł5˝€Á`Ŕ Đëôdçäăďďk’ ,-ztĆŻSgěěëŐ‹Ĺ ˙wĺźÄ‰Ä rţw©±çµŕzŃ᡻…‹+Aożú÷âX°`Á‚ ,4)âŰ«Üx‚ pîJŃ]ÝŃ‚ ,X°`ÁB=X7trÝĎż#ßhEG…cĐééôP»żuÁŔŻżďB«Ó1iĚ0ěkťżt%r© wWĘËetŤŤů[×oßţŘĂŕţ=qqv"3+›ěĽúöěRŻţö?Đ»{,n®.užż–“GZĆUöíQëřŽ?Đ­óCś:“Bç‡Úăĺyç š5„ ě=p”˘’R<Ü]6¨/â=Ťs*ryŹž ;;''G‚ýČĽ–CE…’Áý{’y5›Ě«989:2vÄ ¬­­Ľ÷šŤżˇÖ¨™ţđXľ[˙+€­Ť —Ó2H ĺüĹT tďCAaç.¦r-;‘XD—Ž;–Ŕ¨aýŮąç‰=ÇÎŕęâLĘ…Ë88ŘÓµSV¬úY…mĄ™\Îî}qh*+éŃĄ#§ĎśĂßϗ¢FéÇö? ŃTŇ-6†č¨đíżp9Ťź·ě`ÉŰŻ±bĺz<Ü]ÉĚĘAĄÖбC[~ßń­¬8rü*•šv‘H$=~[[öéÁW«7Đ·gü[řâĺéÎ/[v˘T©‰Ž #;Ż'G ůEL?‰CöX°`Á‚ nĎm?ţ´y;gR.˛iŰnÓ`Żw>XFHpď/ýMeĺm®ç/ĄŃ.*ś6­C¸–“ÇůKi:r[[ÖlÜB‡čÂ[‡›_ŔéłçXňńWŚŇŹŻWoŕÔ™s8|{{[ľ˙q;ö˘¬\FĄ¶Ý®ßw(ž]Ĺ‘šž€T&§ePß˙¸‰ř„$ö<†ŁŁßüđî;ĚůKiě=xG‰„ŻżßČžG(—ĘM˙«ŻčĎO›·ŁRkđôpŁCt:ĆŢÇ8qę QmZóĺŞőě;ŹBˇdĎţ#ěÜ{ČÔř)—Énk{td8/>5›Żżß€­­ M%›¶íĆÁŢŽĎľú€+éYü˛e'‰=ź~ů=_}÷#mÂBčء-öövú· Ct$GOśćČńÓlŮľ‡ž];ňńňď8v"‘śÜÎ]Lĺ؉¤;zž,X°`Á‚…†ąmkÚ¤Ń<Ô>ę–ăîn®Lť8 +«†{"ÂZqéJéY×ôoŤŤ5M%A¨Ąw)5ŁÎř~ľŢŘŮ'ĽčÓŤĐ ÖlÜ‚ĽBQ§ţÍL3”îgěAüşu'"X‰Ť¶{{yŕ(©ÝsS©Ő˘×ß=_PTvcO˘-Ű÷ ŐękĄż °˛r)ua\M<=Ü8f(™×رçŔmmżšÎ¦m»÷Â\IĎâbjÖÖÖ„†1t@o“žµ•­Z1lPÓ± …­Ö8éľ\*#˙zQ¶Y°`Á‚ î Výű÷ÇÝĹO÷Zł5šJT*5í˘Â©Ôj±łł%6&?F éÇ…Ki´Ť#$8°Áه•••ôéŃ…żĺň• žr&™Y9 Ow¦?<†m#ČÍ/¤sÇvúű1zřŽťLdä~´ŤhŤ·—'-đöňŔŰÓk9y Ô‡¶a Ţ[«Ő˘P©éÝ=–>Ţřáä(aÔĐ\ľ’É„ŃC)+—ұ}[BC‚đpwĄuH0öö”–•Čäń#éŐµeĺR"Ă[Ž _†îËĺ´ ĆŽDi™”q#SZZNŰ0ő뉽­-ů׋xtęx\]ś‰lŠł“„‡ÚEq-'{{{;WWç3ČŢÎŽŇ2)'O'Ő¦5F ĹĂÝ•śĽzt釻=şt$ŔĎ—ěÜ|ztéH˙^]ILľ@eĄŽŽÚňP»Hň éŘľ-Ýb;čGjzŹN‡—§;­C‚ńpsĄu«`ÜÝ\˙~)˛`Á‚ ,PXZFÂéłĆu°B\nY¦!5=“ËW2Má‘Cűcu›±Vu‘‘uŤó—Ňj»ś–‰§»s™ôĎSpää”rá–ăzwĂÉ©ţ53Nś:ñ“‰ĽüĚżÓĽ;"ţdĹĄe¦°»›+˝»ÇšŃ" ,X°`ÁB]—iHgĹ7këo`Y°`Á‚ ,X¸sj6°LłĄr9růťŤi˛`Á‚ ,X°Pgç_ÇL ¬ŢŢ´ 6‹A,X°`Á‚ Í…BEvA!PŁĄR«Qk4őF˛`Á‚ ,X°P?BŤŐnYhôŹÝűÉŻj}Y°`Á‚ ,Xh‘§˙=˝^_ëđ- ¬ř„$Ľö ööö7źjVśżŠ·—ţ-nl!# p î8ý{w»íęó÷7Źś¤W÷Xl¬\Ś˙ľ'îXÝbc°łł5·)wE|BíŁÚ48;µ9pár®ÎN´áöú÷+ąy”Ëä´‹ GhĆéW(8wá2=»ĹÖz3nn‚ŔľCÇÜż—ąMą+¸:¤[,66ŤW‡čőzô¶66Ťvʦŕp|m#Âđňô¸ĹAŕť–áéáFaQI­su>Ů ?ţŘ˝żŢýřšß|˙˙yi®iőy0.š”|)FŢň šR™śŁÇOóđ¸áÍ:M%{aâˇÍ:`ÜĂrč€ŢČäÍş"ŢMláť±ăĎD"FíŔsŻżË˛ß®µÉvsaá’Ďxé©Ůxz¸™Ű”»&5-“ť{ńŇÓłMÇŇ2®˛m÷>^ąÖ¬P©Ô,_µžÖ!AL3ě_gæmúck{ozvݤg±uç_řz{ˇ×ë™ÝŔ„ZťŽ×üŹĎ?XxG׾ßüŁ °u?oĹĘJĚţ˝iß¶M­óÇN$‘qőŹNWëř˘%źóü“3ńňto2[S.\ćŹÝx~î ľúnS&Ś $8đ®®ůů×?0|P?"Â[Ý#+ďŚUë~A©TŁŐé5mB“>Ǧ&ójűăń™SÔkŢß—náŁ').)㥧góěëďđŘŚ†Fc#•Éůé·í îß­VǦ­»iĆÚź~ĂËÝ?_R.\F,SPX\µr˝;ľŢ^\¸ś†J­ćÇ_˙`ĆÔq·ż™8 wwW.^N#!1™eß®c@źn(•*D"EĹĄ¤\¸Ś‡»+-‰îĎ.öěÜ|~Ýş‹‘Cűóó–Ä'$qńr7ýH$bę„QĽűál\ő)żďü Ťúţť’xö<»÷ĹQZVN»¨6¤\¸ĚĄÔ :wlGVvÓ&Žbă¦?pt”Đůˇvć6·Adň Î_şÂŰK>cň¸‘lÚ¶‹Đ`Î_ĽÂ;˙·Ś ن`gkËÚź¶Đ­óCf±ńŕŃřz{’r!•˙¬Ů¸…·ç=Ë˙o9“ÇŹŕř©3””–ÓĄS{öÇgń[/łŕ˝OxtĘ8Ç' Vk6i4{ö!$8ĐÔČż[Ň2®RXTÂđA}Ůů×!ĎžgëÎ}čőz¦NÉâW0~ô2˛˛1¸/ÇN&’|ţ2›·í&ĽuYŮ´i‚H$"ĺÂeÚ·Ť ĺÂe¦?<–ř„$~ٲ‹©Lť0’ żnC$3eÜ´‚¶‘aŘŘXăáŢ4Ťüćý—÷ľ†ŻŹ'3ź~ťŻ=Ëď;öâ`oGß]8xäW2®Ň±C[6nŢŽÄÁžž];‘|žßţř“ÜüëL­ö ‰]:uŕ·í{đöô@­ÖŕëăuĎl-+—qôř)şĆv ĺÂe:Ĺ´ĺ»u›pws!4$§Î0{ú$Tj5[wî#"¬…Ĺ%—”Ńżww.¦¦ˇŐę°¶¶FŻÓáççĂůKiTjuČ~­ŕ_“FóÓćíxyşăăĺÉĺ´LA ¨¸„ż{–0ľ Đw7WŢx÷C¦ŚEzÖ5ýçů{zssöÜ%^ž˙>R™śüëE,xí™zuë­ášű,[[zwŹĺÄ©3,_ą_//ZÜ=&^îü˛e'›¶îĆĂÍWg˘#Ű ŇhŘ{đ(…Ĺřůz3ű_É/(äą'f0aôPzuíDIi™WsĚśŠ[Ńëőě?OvN>9ą=‘HIiCôfçŢC””–a0řtɲs Ěmîm oÝŠĺ+×qřX~úS.•źŔ¨aXľr=_®ú‘‰c†›ŮÚ[)—ĘĐW}ŻP().)3ýĎÉ+``ßśMąČářSd\ÍF«ŐrâôY3[]7Z­™ĽÂ.(,F­ŃţŚ9«ÖłbĺzÓžŁMŤ^ŻçŔá\ÍÎ%;7źř“Iäć ÓéÉÉ+ŕŔáăDG†cogKąTNN^z˝ńśX$˘´LJ  ZÚ’Ń÷̶ľ˝şňú‹O°jÝ/äĺ]'îXR™…RIâŮó\ËÍcÜČAl˙s?íŁ#‹ĹDE´fÇž9~Оr2yţ-Ęäřq8ŢčÇ cÇź8ŠŇr)Ť†„¤d®fç2t@o¦NuĎŇr;ĘĄrÜÝ\pqvBĄRsúĚ9ělmyăĄ'éŢĄ#íŁ#iÝ*´Ś«X[YŃ.Ş `ŘŔ>$%_¨ň‹*µ:Nś>KnŢuÚ·mĂsOĐž˝sSYôźçyçŤX÷óď(•*’Rđöô SLtłĚޱC[˛®ĺňâSłřëŕQ®ÓľmE%ĄĚš6˝Ž2iĚ0ěĚklĽřĆ{9~‰ÄoOJ§Ďś3ťŻ.K®.Îřz{Ń)&š];šËÜIMĎâŐ˙#ëZŢžĆýHĎ]Lĺza±IçˇömiáăC…RE÷.ćIGN^WŇłXřúsĽ=ď9~úm;öö¦Fş·§Y×rąšť‡Ťµ5‰éś€@·Ř;ɉÓgńöôŕjvW2®ŢŰ~Űö'k6üĆŚ©ăąšť‹·§ţ-|čŇ©íŰF`08rü4ŢžD"<ÝÝ8př8Ţ^Ä´Źbô° ^?îčIĽ<ÝńöôŔ×Nj؇ÚŃ)&€.ť:4éoפ±Ăř}Ç^¶îü‹ŢÝ;菼BÁŽ?rüÔÜ\]¨P(ÉČĘFˇP’›Ýôź„}U:<‰}(šUĺ©sÇöŘ4Ň`í^Ýc±·łĹÉQ‚NŻ7ć‘—=ştÄŢŢŽ€-i…·§aˇ-éß§[=i§ÎśCc:Ľ˝čŘ!šţ˝»űP»{öéůf˛sóŮą÷ăG ÁŰËľćďÔ¸W‚@iY9J•šJ­ÖřW©­őňw3÷oŤ}Ź fč€^řz{R&•›Ő–¶aĽúÜżńőňB$ѱC[üZxÓ˝s "DĚ{q. …’Ö­‚qvr䍗ž¤BalpµŹnŻ—'Ż>÷olmmI<{ެiąoOţďťyxzşóďĚăÓŻľ'6&šľ=ş P*q”8ŕěěÄŇĹoââě„ŘJĚĹÔt3[~+ăF ˇş)ŢÂ×›ďľř1í"iŚŻ·׋ŚűCíŁ;Ň<˝%·ă“÷瓝›ĎŇĹočOdx(î®h*+Q(Ux{zđżEŻŃ:$č4•Z"Ű„ÖÚô~!:2ĚäĂőEäѧGgś% ěÓ0ćG§¶fłÓ×Ç‹% _5ĘŢž¬^ţŽělm‰i…F­ˇ´\JIi^žî,]ü¶66DG…Â…ËiĽőĘ3DG…Ó«{,©i™(Uę{˛lÎôÉcHą Ŕ7ź˝‡§‡;).#‰o…••íŰF°jŮl¬­YőĹ˙‹Ĺ¬ţâ\/*aĘ„‘‰Ś“KkľŞvëü-|Ľř~Ĺ˙áçëMhH1í"ůöó÷°jâ—ő'çü‹sSŃéôŚŇ‚üĐęt´ŤĂÖÖo/wÂCC¸’‘…V«#*˘5űöŔĂÝ•];Ň2(€Č6ˇTVj‰jJ /|}ĽŢă:$¦]$ţ-đńöäăĹoŕß‚.ŰŁT©Wő۲đőgMű/xíŇł˛iß6_/"ĂCńőńbŢ O˙ż8ŕä(ařŕ>„‡†Đ!:ÂXŹÄDÓ!:o/ĎF™óôżA*“cggKT›Ö¨Ő2ŻÝ_[ţ)IÉOHŞó\qIYťÇëm` ‚Pk^sCA îčIž5[[[SˇŞ>×Ô8;9â\cXŐŕö°V·rÖ­n¬¬ďäh”ťś‘Ęä&ťűeĆš­­ QmZ#¶66téÔžńن`üÎďáîjŇmiś<ˇŃg©ÝOéhQăÍPbÚEţ·đőâÜĹTúöęB€źo-űď—´x¸»šžą DEÜ:9"ŞjÂD͉÷[:Ş k|Sř†ĎřúxQXTŚV«eü¨!fË;[["Ű„}ŔÖÖô|«mĚÍżÎéäó„¶ fp˙ž8T è._‚ `cmMtd8'“ďI:Äb±éúŐT‡µ:Ó&ŽĆŻŞ·A“ ܶ·č}#M÷"wJtdx-›ŞsL᪠\5'rŐôAjĺ_µŹÜët¸8;áâě„ „·0ýŻľOuť!NN޵žŻS•_T˙Żé'ľxÝZŹT]«1ęŕ€ZvŰŮŮzßý–ü]Şmďء-cG B©RßtŢŔ3Ż˝SgÜ:Xń I¬\ó3B3^§°¨”Ô´,˛˛sÉĘÎ5w”8°zý&.\N3ŁuwŹAŘĽm7ń gĚmJ|¸leçŐj {ĺĎý‡›Č˘{Ë™”‹HĄrNž>ËÖ]űšőŹIQq)W2®ňÎa+˘ IDATĂĆßL ŕćÄg_˙€L®ŔĹŮ‰Ź–­B^q˙í±úĹ·ëîHݞRKűč>úb%ĄĺŤjÓí|őnńoáç_~OnţőF˝Ocó Ô!‚``ó¶?ë핹x¸»Ň!:’GN4Ú=š…B‰H$B­ŃPRZ»·J„[­¦ÎV§Ńlüîł{oe˛ďĐQÂÚFňčłskWI˱ܱ¶u0“e÷†Ju‚­‚)OÜÓÓ˙)z­u‰†ácg™Ű”»F^‘EżńcÍmĆ]#Ď/aĚÄÇĚmĆ]#—^cşß˝›ńe.ä× qv1·wMEy?Ä÷éěá;ĺÁ«Cć4Ú=t5Z©Ŕ¸‡źh´{4˘k§˙vĽ:Xvv¶·´ŇšGŽź&$*GŻÚ?°;Á[{g3Yvo°˛.Ĺ`oŤÄĂĂܦÜ:ŤA©ÄŃőŢN6Cá-ĺ­9˘)Ó<ůQYú`ä‡Lń@äGĄZŽŁ§W3_ÝR‡ü*• ÄZCł/żž˘Ży—ôddełčźłdéWµŽż=ďmţ·čL5™Ň’Ňzb7>:ť…BBQFŁFˇP°eË/ôęĂńăGké* d2):ť®*^ß|óóçżĚ”)cČĚ4ßŔp˝^O…Ľ•R…F­ˇB^Á_»˙bdż‘lúiS-]•R…L*ٞ˛Á€\nüî_R\ÂŘAcŮđĂs$0vëĘdRÔj5Ť™LʉÇř׿ĆńŮgÖŇ­>ŻVż˝ËdR45QQ,_ľô–ükjä29µ•J…\.ç|ňyžšőŻ=÷Z-˝ĘĘJdR*Ą € yÉg’™6f/?ő2żnřŐ曨é EWŻfňź˙ĽČ´iµ{u:2™…˘˘*ž‚ěě«|ůĺ§ĽöÚł·č755}CĄTQ\TĚ’EKčýPďZz™Tfň •JEIq “GNćĂ˙~Č3sę__§)¨éjµ•JĹŠźrk…,“I‘ɤ‚€FŁF­V3uę–/_ĘĂŹ@§Ó5©íµ|B&ç\ň9žśů$ó^WKŻ.ź¸xî"ĎĚy†ź|€Wź}•÷ľĎä‘“))nÚÉ«}B©4úDVVóć˝ŔôéăkéÝđ EU<×®eńć›/3i’qŃçmŰ6ÓŻ_,qqű›4 Í‘cÇâ2e_ýů]]çi`…†Ńącű[–¬˙ď‡˙ĄCǸ{¸›u™¸¸ýÄƶaüřˇ¬_żš7ß|‰ ¦ŕââZëűmję%&OÉ×_/cĺĘś;w–W_}–'ź|žîÝ{ŁPT ŐjÍ–ŽĚôL"#yxäì_˝ž9Óć0xř`‚Zˇ­ĽaWIq ŁŽćÇďä˝…ďQTXÄŚ‰3ĐVjYýőjZ…¶2ëV,Z­––-Ý™>}ëׯfÔ¨ţtëÖ“víbĐhjb<¸[·n⥪­—FŤęĎúő«éÓg ĄĄ%‡'Ut‰ęÂäQ“ůěĎ1q^>^ôę×ËTiT3gęV˝šWžyią”9Óć°wç^ôz=Ź?ó8c'™·a2aÂ0ĆŹ›oľÄ«Ż>KYY)ŁFŤ35¤Şyűí×ůčŁ÷7ďrr®ńć›/QPϬYsIM˝ĚË/ża¦yţ‰çŮo$s¦ÍáĂ÷>$áxÓgMG.«=íŰ/ľĺÍ—ßdţËóąxî"ź}đ»¶íB&•™_ćäĂ3dHOFŤęĎÚµ+ůé§µ<ýô‹HĄµÇ‚íر•'źśÁŰoĎăĉclذ–µkW’śśHź>ý9xđŻzǨ4±±L5…Ď?üśG&<‚ŹŻ˝úŢęł'ĎćűoľçŐg^E&•1{Ęl\Ü\č;°ŻI÷ŔžL›1ŤŚ´Ś&I7năÇeţüWxĺ•gɤŚ9öźX°ŕU–.]ÂĽyĎ“››ÍţóEE×3f˘IwěŘI¸»{6yc·9Ňłg_"#ۢ©g ś;ĺ_¦a劕dedńŮ7ź!‘HŞn©‘đőőcÓ¦ť¸şÖż˘qaˇqÎyónlSńő×k٬^ý 99×đi\cŔŮŮ™Ő?­Ć·…/Ź=S÷XE…‚ëů×yúĄ§MÇ~ßű;_}ţ^Ţ^ÄÇĹăäâÔT&׉H$ćÓOż¦eËV<öXý˝))gxä‘9ĚaLëáĂI¤ĄĄŇ§Ď@ţřc3«V­ŕí·—4•ŮuňĆ;oĐłOĎuRΤđţŇ÷ ŕ׿ňóúźŃh4lţi3"‘…ďßŮö(ŤĹ¬Ys™6m†)\×ŰvrňćÍ[HßľXV58űřńٍŐ*şukř94ĂFcŢ½%YY·č$źI¦gźž<úoăâ•Qí˘ČËÉăý…ď3ë‰Y čŇđÚSMA‡Yľü;S¸®™ĺ))ghßţ!ćĎ˙/Ý»7t6l4YYf›ôńćߤ{Żî ę$źIćĎ? 8Ä8ÓnÓ®M ę›9sždĘ”GLá˙şE'9ů óçżKďŢýLyvěXóś<ô đŔô`ŐÇ—ź~‰Ł“#ëWݧĽ¬qgáÜww\]Ý8~ü(O>9łN??ŢyçMV¬ř„ÄÄć̙Ʒß.çí·çˇŐj jJłoÁAâ€o _®]˝ĆcęÔqrvÂ?ŔźO–|Â[ŻľE~~>Ăzăá=LżAýpuwĹËŰĽăcÄb1-[¶B§Ó[˙ŞŮť:uaĺĘ<öŘż0 ÄĆFžžĘüů/“pśNťş4ˇŐuSÝhÖ{ůůůuętę҉źÖţÄcÓCZ.eĚŔ1ŘŮŮ!‰ČĎÍÇÓËł -®›PćĚ™FbbBť:±±]Řľýw|:99×xňÉ™?~”Żżţś§žş?¶ĺ¨ÎŹ·^}‹í[¶×©Ű%–CűńÄ#OpńÜEŢ}ó]öěŘCPË ~üţG:uéÔ„×Mu~¬Xń ß~»ĽNťNťşŔÜą38~ü(+W®`ĹŠOX˛äm.^ae%FîÜ'ŞĎUëÖ¬oš˘©T*Đpvoz?Ľ[ŚĎÄb+ =Y);đňt§¨¸ögbAżx)ß}ń? ‹JsWŇYńÍÚú?Jeć]őün©Ţ‡í~Ů^¦ćMą.űn>V­kccţÇjľY®kµf++«ZÇk¦ËÔxlLc@$™*‰šňť¤ŁZ·±¶Íř»XŰÜx®5óćfnnČWëŢ/>RÓŽšňÍr}é¸_f§Ő,+ő•¨]îŠg.ęł§®rżĄŁ–OŘü}ꍩ{łNSR—O+ý;ó‰ęsu·Đ0÷˘ěÖů´ăŽ%přXB3^fÔ¸A¬Ťä…µ»†ŐR):ÄhTR3YvoĐj*Ô*ô:ó xż´:4J ň˛ćďř•ŠŠ[Ę[s¤R)G^Öü·¸¨TĘŚüPT 7˙üШ¤T î=aďKrçč4tŠćÜ’0"˙¬+ ÎZ­W÷XúöězW™› żnE$ŘŕëV{‹Ťr]>‚vv÷ß˝…XÁÎ g·ć˝ÎŹVŁA¦¸†§Só΀˝Ë-ĺ­9RPŞŔ÷AČŤý‘Rő‘…*+ĽÜ‹Íß;w7...řůůaemµ`…ŤMăě&ţwP(•ääć"‘H hPW©R‘ť“˝=ÁAAX[Ű`°±ĹĆÖľ‰¬­źĘĘJ233±±±!44ôŽâ`ooŹŁ=VVÖ÷E~‚@jšqű‹đđŰhCjZ‚ ŕá——1÷A~¤§§ŁÓé ˝í§ĚŚŚ ´Z-­ZµÂÖÖöľÉ€k99¨T*‚‘8Ôżrvµ&ąźň#??™LF‹-pumx tAAR©___ÜÜÜî«ü(.)ˇ¤´OĽ<žQRZJqIÉ-ţa®Ößń ©TŠR©ÄĎĎ™LF~~>ÎÎÎřűű›˝ąSźŁ_—”h•ť›‹‡»;Ž ÖÖ6ąŃë´÷Uů˝S WŇӉŴiÝáź-3ŇüżËT‘‘•ÍŽ=Đęt8;ŢŘPyٲe„††ňé§ź˛eË$fĘçâŇR®^»†^ŻÇÓòňr±¶¶fýĎ?łüăŹißÖ8°8!1‘˛ňr:wěH$âJz:ÉçĎŁÓéřeË>~ď=Ú„…% …‚¤¤$\]]‘H$äççSXXHff&ॗ^bđŕÁś;wŽĽĽ<˘ŁŁńôôääÉ“ôíŰ—łgĎňÔSO1gÎćĚŞ{6ecc0Řwč!ÁÁĹb2˛˛H$ěŮ·Ź+Ś:”G¦L =3“ôĚLBCB e„0jĘ>Y˛„6­[ămĆĂ:D`` jµš’’$ ›7oFĄRáííÍ[o˝@^^çÎťĂĎĎŹöíŰsäČĘËËůꫯ4hÁÁÁ<üđĂfKÇÉÓ§Mľa0°łłcÝO?áéáAFV+—- ´¬ŚSII¸»ąŃĄS'N%%áćęJzf&ěŢŤĽ˘‚őß~k¶t¤¤¤|ĂŐŐkkkľţúkbbbظq#{÷îŚ ‹>|{{{úöíËůóçŃjµĚž=›W_}••+Wg¶t\IO7ůF«–Ć͵?Y±‚QC‡2zęT®$&št÷ě7.§1dŔ2Ż^Ĺ`00fÚ4ţďÝwy}áBÎĹ7팶jźĐh4áččČćÍ›Q*•´hŃ‚7ß|€ÜÜ\Îź?Źżż?íÚµăđáĂH$>ůäÄb1ëÖ­cęÔ©Lś8‘oľů†ß˙˝Ië§NáĺéIąTŠ^Ż7ů„‡»;Włłůć3ă–vuů„­­-+׬áLr2‡wďfó¶mĚ÷]ľřč#†Řt‰h†:z”#ńń¤\¸Ŕäńă™4¶îŮň·ăţz běÁdçä3¨_Óń pĺĘĆŤ‡·wău…ŢŽÄ3gč7r$K—/çüĄKÄ=ĘÓŹ=†V«ĄsÇŽ„VÍ>;™Čk °uçNŠ‹‹9př0ŹĎś‰·—‚ÁpŰ·–Ć$77—A±páBÎź?ĎÎť;™8q"aaaxxxĐąsg“Ţ”)SpvvfăĆŤ(•J¶oßNEEţů'íÚµ3[Ŕ8›fč„ Ľđź˙pţŇ%6mÝJŻnÝ=|8eee pc ˘C†ŕע«×ŻÇ`0°iëVÎ_şÄĂăƱiëVĘĘÍ;ăvúôéĚž=›S§N±}űvBCC™={6Lś8Ѥ7~üxAŕ÷ß§ĽĽśť;w’ššJqq1ÎÎÎ 2ÄŚ©€—ß|“I3gwô(FboĎ+Ď>Ëéłg™5}şIď©—_&'/ŹCGŽp-'‡¸ŁG©ÔjéĂĄÔTŢ|ůe3¦>řŕ† ĆÎť;9yň$ĺĺĺ,^Ľ}űöńÜsĎ™ô-Zĉ'HNNćÜąsś:uŠěělIOOÇËĚŰüüđăŹô:”M[·’rá—RSYńńÇl޶Ť7j<ă/W­bËöíääĺqěäI.\ľLĘ… ¸8;“›źOzffťëg5&Ó¦McÎś9&źhÝş5łfÍ"33ł–OŚ7€ß~ű ©TĘÎť; fřđá&ť´´4úőë‡L&3­”ŢTĽôĆ<}ú°jŐ*Nž<Éwß}gęz×jµ( şvíJDD®®®ĽńĆ,]ş‰DÂąsçĐétfëÁ°¶˛bë† ŘŘŘĐłkWö8Ŕ'+V°uăFlmoĽ¦É+Ď>‹H$âý… Iąp}űr21‘m»vŃ˝‹y×ÂZ»v-­Zµ˘´´”´´4,XŔŹ?ţX륢¨¨đđpşv튳ł3Żżţ:۶mŁeË–Ĺb^xáÖ¬YcĆTŔ§ďżĎ€ľ}‘JĄä2ëé§ůjéRÂZ·6é̤±cqppŕ±™3qppŕĐáĂXYYeĆyë­·3grąą\ÎĉůŕL/ `ĚŹČČH&OžŚŤŤ !!!••ĹO´đőĺŮ×^C§Ó‘–‘NŻ'77—¶‘‘€1ďNž>ÍÖ;čŢĄ ß{Ź>>lÜĽ™—ź}Ö4žQ®”áěŃô;$&&Exx8ď˝÷ś={‰DÂĹ‹éر#ööö:tíŰ·Ă·ß~‹R©ÄŢŢž¬¬,bbb0`ň˛"ś%M_é_ş|O:ĹİjÍÎ]ĽČŃ'đőőĺxB=Ş€înněŮ·Ź]{÷Ň:4”=ű÷“xć żďŘAzf&­Z¶dô°a(•2=|‰˙ĂÉž={6mŽŽŽL0www (--Ą˘˘Â䤤¤°eËČŁŹ>ję­Ş¨¨`ŕŔ(•JΞ=‹§§'&L@ĐW6Yr$>ž}űâëăĂÓŻĽ‚^Ż'-3ťNGn^Ţ­>±s'Ý;wć­Ĺ‹ đóĂŢÎŽô¬,ĆŤ @üÉ“t‰Ť%( €J­ÁÚ{‡ĆŰQC§­D«¨Ŕˇ‰ë©»e×Ţ˝(”J˛®]ĂÚĘ ˙-¸^x ‰ÄĄňÖÝ`öĹĹ3nä`Uç KËH8}öÁZh´&ËW®cÎś9ô4ŞÖńŇÂ$‚öö3Yvo¨PH1ŘŰăb† ä^˘Ő¨)ĎÉÄŰËßܦÜ5yeyř‡ż÷änÉ»’‚żOóź}—W”Ťy?Eß ň2.ŕďŮđ$ć@Áő«ř„E7űY„R˘··ĂŐŁńľ†¨•r”…x¸7ďzĘ`Đs6ĺČ˝YhT˛só1ÓR÷­eCK ,X°`Á‚™¨łučh—®¤7µ-÷wWW¬Ez r®Ô:®”KQ`ŤŤuóš6z3šJt¨ň®!ŘŮ=h*©Tv¶ŕŕp#lk ¨¬D¤¬Ö"R*lm@"ą¶±G hµ …u kkprťQECa=˘Š ++pv˝LŽJŻCohĆ­ů**Te·”·ćHE…”rÍmĆ]Sˇ(0ňC^FÁ?r_!WČrÓšäacň Ő!‚Ť•RÖh÷ĐVjĐV(¨Ô6ď±˙é†ĺu6°ú÷îJŻnćßhônř懍¨=µ»&u…‚Yö"Ľ×Ą)¸nŰ…vęD Á®fc»iÚÉ0„·Dt-Űu›Đ><C›–rň°]» í¤±Ćpnľ1=Ílá˝Eś–Aĺ“s°Ú•Z¬Î¦ÜëtXťI6†˝qͰA@śT>x€řĎľ"+2śľ»˙"@$Â*ń¬ńüˇ#`e…U♪đQ°±FyđŰ}Ľ—ž ¶¶Xť®:wěě°:ťT>öXťŞ > V§QĎ÷É| ÁŔ/ż¬DL›6ă¶ú?˙ĽA0ŐŽűë…dŰćm(JĆLŁSĂL·oŮN…Ľ‚‘ăGŢw3¨öíŰMQQ!ĹǧE˝zEE…ěŰ·OOo† ŃT&ŢńGâąšq•n˝şŃŞu«uOĆź$ăJť»w&¬MXYxg$'źáÂ…dÚµ‹ˇ]»uĎźO&%ĺĚ}ă[7mEĄT1fŇö‰ĚôL ň čŃ»Ç}W‡üő×nŠ‹ 8p>> Źź*,ĽNrr—ť8p`/‘‘Ńřů5˙1ŻŤ‰V«eóćŤXYY1yň#˙ř:Ě2 Y٨5ĘĄ2V¬\‡Db\+j˙žýôîß›™Ďä§m?áédľ5¤î5ú>=üZ ďŢ›źC7f„1ÜŁ+6?mF7z¸1Üł6~E7j1Ü«;ŰÉKϵmî®.~·Ž±ĐNýŘó0Đ DžA`Sj:n«ä‘wçłăxaî˙±‹Źň Řşg?ŁďĆćűőčőCđk®lż[‡n`_cx@lW­E׿wU¸/¶+× ë× ÁËr”M˙ěôz>ýô:v쌽˝=ńńGčÓgNNÎ>|€ŇŇžyć%ŔřŁtńâ9"#Ł0`K—.ˇGŹŢ¬\ąśU«6ÜöG®±ůňł/‰ŠŽBŁÖ™‘I§.ťP«Ő˛xÁb>řě‰?OPHŁÇŹć»/żĂÚĆš¸ýq<őÂS‹;ĆđŃĂos·ĆăÇżÇß?ÂÂëčő:BCĂČÎÎĆÉɉ—^zŠ ~ =ý ;wnĹÓÓ›)Saó柍íĘСŁX¶ě#ł6°ţŘňNNN¤]NĂ/ĐOΞ>KLl 3&ÍŕČ™#łaÍ$Ěž;›}»÷aeeĹĽçç±rĂJ¦Ź›ÎÉ‹'Í–Ž¸¸čő:Nź>I·n=‹Ĺ?~”‡ţ}útäÚ5ăKleĄ†ŻľúAxę©ILL@Ż×ńŻŤăôéËÄĆFž^Ô¤¶Żřtm۵ĄRSIzZ:±]c©ÔTR_Ŕű ßgÉ'K8}ň´±ń̨ńŁXµb1±1¬Z± ‘XDŹŢ=>~:_¬ú‚§g=ÍĆmńqmĽYw7ł~ýj‚(**D«­¤uëprsłqpđĘ+Oł~ýo¤ĄĄ˛k×6ĽĽ|2e:żţş‘VüöŰĎ$'źađŕál۶™wßťĎG}ai`݆“'ăquugĎžČd2ćĚ™űŹ®ÓĽűjkDtdŇ3ŻŕăMwŇ´I|úÁ§Ľőß· 1źŤ€ő_°Ţ¶«3)TÎqvŽ1śtÖÎÍ3†©ś˙*˘ücřÄ)689ňÎÓ/ă{ě$eRĽ_~†©C’řńrBťťŚúĄe,=… ą‚–oĽLNĘyĽâ#řő IDATŽawŚ?Ă[Ó/ĐĘĄXí?dÔW*±Ţ¶ë=ŚaµÚŢý—1¬ŐĂ;÷Ăz=Vű™ĺŮéőzŢ{o۶mĆÉÉ ß˙gďĽĂ˘¸ľü.ěKgéE@{/‰˝×Ř{oÄMb4QŁ&š_LLŚKěšŘM¬±Ĺ®ŘQD°aoôÎ.,Űwż?V±&*¬đń>sgĎΞ;wÎÜ3wî=ÇÓ‹÷ßo€ŻŻ?Ţ'0đqŚ™nÝÚđŃGźűÁ€§§ööö <śŻżţ‚˙1KňřeÎ/¬^ľGgGÜ=Ü©R­ 5ëÔäĆőůFK†öJ‡®Đj´Čłĺ¸ą»ˇÓę¸wçÇŁT€y®[÷+sçÎÄĹE‚DâJéŇA´mŰČČ‹”.ý8ÖgźŤ¤zőZ¸ąą‘’’„‹‹[[;222 ;ËČ‘źĽäW žż·ţÍÔńSqswĂÉŮ O/O† äÜ©s– 4ÉM˙r:W •«VćÁ˝8:;âěâŚÄM™gňÉšăÇ3jÔŕÜëÝ{{G>˙| ÇŽ&0đq{Ě›7 ą<›ćÍ[}{{{ěíčŮł[¶üANNáG\8{!kV¬ÁŃ)×&ŞWˇFíܸ~#ßyŇkťşwB­V#—ËqópŁR•J´l×Ň$ŁT(qvvF§ÓzŔÔµkWńóĎ?l˘L™ Z·ţ€¨¨‹ůÚ`ěŘÔ¬Y‰DBJJ2‰„€€2tíÚŰ$ÓąsJ• (Tý‹* 6ÁĂø¸üý_ű8ĹĆÁJJIEĄRQ»FnŢľgÚ?´÷PzôíA§îŻęţ]Ćŕ`YŮĆ˙€Á>·l˙T9ďó§äżěÝťÎmšă,qF«ŃrE$˘K›ćDw0W`ĆWŃBˇ… WRµjM<=˝ąsç&ŽŽŽT«V“Ë—/=#ďĺĺŤ@ ŔÓÓ›7˘±°° fÍ:\ľńśŁ.?ýň 7ŔÝĂťÄřDTJ š4 *"ęYww,--qópĂRhIą ĺ(\–ů?Î7ćů™6m&mÚ|€DâFv¶ŚŘŘG´ióQQĎžcW¬¬¬‘H\±¶¶ćÜą“–ĆÇÇüó=ĆOO·>ÝpvvD^ڤ{źî\ޏüڬٓ#b[1NNN âcăéŐż×se ›‘#?aĐ s,;ÚÇŕÁ>÷š··wŔÁÁ;;ŁŐˇCĆŚo ˘\ŘĚ^4›úŤëăáéAb\"jµšŤ<÷ĽćŮ„»‡;–Âw+ŚÄôé?Đşu{$7˛˛dÄÇÇŇşőĎm‰Ä ++ë\Ű(Ú“đÍÉÍ›ŃH$nT¨P™k×^ß‹ŤegkË©sáÄ'&2đq>µşőęríň5–Î_JfFŃŽíő4úĘŃčŤÁÇŃ/+0ŘŠŤe?_cŮĆí€ŢčJ!úeDĆr`í3Ą”jß í€ŢDHeČţř‹čgŘ«ŐńÓ´I~Y@o`ÂĆ•ÜIOçř_a/¶ábĄňč+–ç_ĆôëÉđ1Ă)WĄ˘Q^©B; 7şę•Ťeyޱ\Łš±śťm,×®n,Keh»vxuE † W<¸gg ›7ŻGŻ7äY¶lË—/4EE>xp-[¶ĺáĂ(•J>úč3łÔ!Ź~űakgŚÉz$ˇ•ý{öËSľ0ÉÍY<‡ż·ţÍ­›·‰DśŽČZÄľ]űŹ‹gü”Çi~ć.™ËÎ-;ąsë"‘GO ČQT.¦-›Ƈ—=;÷0fÜJîP§NÝMSÂÂΠTŞ8wî4/†1}ú&ą˙ýďGÂÂÎpţüYllÄ\¸pŽôô4<=˝éĐáqşśví:âëkţwGG'6mZ‡X,fČŻ}śbhtŕ°Ôn™?©eVrR±X˘”§#8żë–Íî=€ÁĎ‹{÷Ńtë„pßA ľ>XÜ˝‡¦{g„˙ÂŕăŤĹť»hztA¸˙oo,nßAÓł+‡1xyaqëš^]8‚ÁË‹›·Ńôî†đŕQ žXܸ…¦Ow„‡ŽađpÇ"ú&šľ=>†ÁÝ‹čhúöÄňČqpsĂâú 4ýzby4\]±¸vM˙ŢX; WŻŁčÓ y:8U„éQHrsJeŇoÇ!)«ÓS®! *úťIú˝‡H\«™[Ť7&#éNAEaqęCô6Rl pˇ:GŽ*YŹC1XEřŕĘŢ·h4.!‰c'Ďé@Ł ‰ÉćVˇŔŃű—ÂúçEĆ0 ËŁ/ĺk,÷ꆾrôţ~ĆrĎ®č«TDčo,÷茾jeôĄŚĺnťĐWŻ‚ľlicąkGô5Ş˘.c,wţ}­ęčË•5–;¶G_§úňAĆr‡¶čëÖBWˇś±üAôďŐFW©Ľ±Üľú÷뢫\ÁXnŰ}ý÷ĐU­Ő˛ß÷fîSYB %”PB o•ç:X1q „E{açZáfoŹ<61ß~U– = 4Bk3iövP«`ٶ-b(Ôä´m‹A/0–sž*˕ƲÁ2™ÜrŽÂXsŹ—űą…(Yhe,+Uąek ±‰ TˇxâsTjcYôTŮĘx<Ô Í›ŁÎJD®Gb5ĽjEÖ3×[QDťťŽśćVăŤQË3Çíű€:K†\WÚ#Ťś8=ŔÜŞĽĹ©1 rÔöZµM¶ MŃ űô$Ăë-nxîÝÇB`ÁžýǨ^µčćUÚż;nnžřř•Ď·ż8ĺ‘ŇŰř|.ÂŕW”źÓótąěËË߼\„ŢŻĄŢ»D|†á™ë­(ŻPăăQ Ú#E[<ÚC­Ăǵč·G˘AŤ‡opI.Âw„’\„˙˝^Grâť˙ü˝>ŢU(W†azĽ‘Rć">1‡ÜŕŠű÷ďçňĺË8::bfÍž%Gˇ`ÁŇĄôęÚ•ŕ˛O{#Ź9ÁácÇŰŘ0jŘ»÷JMŁŃ°bĹ ęÔ©C˝ző^*«ŐjYµjU«Vĺýşu IÇÁ``Ăźâ&‘đA›6/•;iĄxŻvmľ˘Îć`ďŢ˝¤§§3hĐ‹¦Ęd2–.]ŠFَgĎžT¬řî=Tť=ž°‹7zô eâřkÇ”J%"‘ ź~Zţ;nÝşĹĆŤ™1cĆ e´Z-kÖ¬A*•R®\9:wî\ţ;RÓŇřćÇY2wîKĺţز…¤dcČ€Á}ű’v/g÷îÝHĄRřB™LĆńăÇÉČČ`Č!ďdr&,ŚđK—űŃG/”Q(„]ĽHDTźü1q üţçźtjßžŠĺ‹ţGAŁ×ëY÷ÇřúřĐŞYÓ×:FŃ?Š“g/đÍŹ ٵi%A.žXYYŃŁGz÷îMÇŽ±5ÓĘŐ¨(~[żŤVKłFŤ¸vă3§Mă×uëř}ËÖ«Gpٲddf2{Á¬¬­©Qµ*ĺĘ–eݦMtďÔ‰:5kňÓüů4nĐ€ ĺĘĽúG €¸¸8&OžŚ§§'µjŐâرc¬ZµŠµkײ}űv¨WŻ …‚ü±XŚD"ˇ{÷îLś8‘µkײ~ýzvî܉ĄĄĄŮ,ŤFCŹÁ©SŁAeʰyűvvmÚÄ[¶°ďŕA*–+gr°fÎť‹­­-ŮŮŮ|=q"]ú÷§o÷î„]ĽH§öí©˙Ţ{f©CC† !88GGG"""3g‘‘‘lßľ˝^or°V­ZEjj* …‚É“'óŮgźĚ•+Wřé§źHN6ďĽĹ‰Ó¦áää„Bˇ@ŁŃ0¤_?´:żoٵčh“ő÷ľ}\ŚŚD­V3éłĎřyńbzuíĘř1cřř‹/¨`ćÎcîÜą(•J>|H… ¨Ył&•*UbŐŞUlÝşŐä`ť;wŽíŰ·ŁÓéřüóĎٶm®®®,Z´©S§ňÓO?™ŐÁZżiŹââ8ń"˝ştA$Ń»[7­\ÉŇ_59X÷<`ÁŇĄ 0vÔ(Â/]BŁŃňÉ'Ȱ÷ńˇo÷î…Şű A(_ľaôčŃ?~ś””† §ź~ĘŢ˝{éر#Í›7ÇÝĺĺQŕß&ľú gT*JĄ’a ÖhřcˢoÝ29X;÷îĺRTjŤ†‰cÇ2wŃ"Z7oÎůđpö8ŔçLLl,›¶nĄFµj%Öż`㟲çŔŢ«]»ÄÁxOV–ű'Ň řűűóĹ_°fÍüüüHOŽ5‹n©iiěÜ»—ŐK–PŁjUęŐ­Ëß{÷Ҩ~}¶îÚe’‹şz•3çĎłoË““ńňđ`Ô°a”-]šű"P« îťů«ËĺěÚµ‹_ý•&MšP»vmŽ;Fpp0~~ŹWŠ$%%±nÝ:n߾ͽ{÷prrbňäÉś8q‚€€üýýÍV0ŽTíŮżź.íŰÓ˛iSŞV®ĚĹČHěí)”˙=ç×ߏ.=ťk7Śó`fN›†‡›U+Ubĺúő\»q㥣+ÍáÇ ¦{÷î´iÓ†¤¤$233©[·.aaa&ą~ř#GŽ V«±´´d„ ś:uŠ7n0kÖ,Z¶lI­ZćKir&,ŚęUŞ0aěX z˝žKáá´mŃ‚kŃŃ&ąK—2mŇ$ýý±‰řpĐ <ÜܸEÔŐ«Ěúö[łŐŕŇĄKdgg3{öllmm1 ěÝ»—ľ}ű˛uëV“ÜŠ+hܸ1mÚ´A,Ó˝{w˛˛˛P«Ő¸ąą!—~€Î'ąyű6Źcő’%¸»ą°|Í> aĆO?™ä6lŢŚłł3ŹÁ` E“&č –ĎźĎâ•+Ńé ?SőáÇ©X±"ÝşuŁU«V$$$ “ɨ[·.ááá&ą™3gŠR©ÄŇŇ’‰'R¦L˘ŁŁ9xđ`ˇëý4§Ă¨UŁ>ý˝^Ź^Ż'âňeZ·hAô­[&ąůK–đíÔ©řűůaeeĹđÁńpwGhiÉž¨W·®©Kx9aáá¸I$”-ýň´VŻ˘hŻ—}Šß6l!=SJ¶\Îĺk7čÜą3'NÄĎĎĎ,†ţ$•+T mË–dËĺś8sYv6ˇ§OĎŮóĆ”ÂÜĹ÷< ,<śÔ´4Žź<ɟ۷#•É(U*sVOOOzőę…P(äźţA&“qéŇ%˘ŁŁ9{ö,`Ś3% IHHŕčŃŁ( öî5¦¸|ů2WŻ^5Éš ˇĄ%Ś›«+ŰţţYVwsĎűŮ Lr666¤gd°g˙~ Űţţ›Í۶±iŰ6śee™±F† †źź{÷î%55•BCCąvíR©0ÖC*•rčĐ! ˙üójµš   ŞV­ĘîÝ»Í\ Đ»7e9~ň$qńń$&'óĎáĂÄÄĹë‘•k;é™™ś8s†¤”öLLl,±ńń&ł˛˛8~ę™™„ž>MrJá¦'*Ndeeqóî]Â/]Ę×üWŠŐÖ·SŚ/D\¦vőĘ|˙ý÷Üąs‡;wîеk×—}˝@©\±"ĆŽ@,ăăĺE›Ć]Ę•Łf5cś›Főę1ĺ‹/Š˘M‹XXXŕăíM­5Řčă?ţMš-—šĄžžžĚšeĚm'‰đ÷÷§K—.Ô©Sooăd\Ö­[ÇńăÇiÝş5Bˇ:věŔűᅬ›ź¦,--ůmńbei޸1Í7¦YŁFůV:ť=t˝Đ®U+,,,(ČŔ>}Řř×_ôzöéc®j0ţ|cÄpŚç˝nÝş4kÖŚŰ·o“””„““`śrúôijÔ¨łł3ţţţ´jŐ OOO˛˛˛?߼‘Üżš0Á4ŃÇŰ›ŠĺËÓ¬qcéüÁ”ňő`ÍŇĄ8|/üýüđńňB,ó^íÚT~ćŤ5Ę4šëáᏏÍ›7'++‹š5kRą˛ńŢ4gζmŰ@•*UJĄ¸»»łiÓ&ÂĂĂŮżżŮęĐŁK„ąQŘ]śť±´´äËqă0 ¸ş¸Pżn]ľ7Žu›6‘śśLŰ-¸rý::ťŽö­Z±÷ŔB÷îĹÚşpWÜ-\¸ĐtÝlâÖ­[¤¤¤’šďŮł‡3gÎP«V-śśśđ÷÷G$Ń AscÚýý÷ßśeóč+N+@ô66żŠ°€Ń¨ňVýäŁńńřý›Wüí+řx÷îŰ >%ź *ćV㍉żwW_s«ńĆ$&=Ä#¨rÉ*Âw„’U„˙˝^GÔ•So'Ш§‡+źŽŚŁů‡Ú_±Ř­ą•(ˇ„J(ˇ„ţ_ň\ËÝU‚ť]ŃöÎOž ÇËĎŤuţw檬l„8`)Ě1“fo­:(‘Śś˘±^ŻŐaČJÇ 7˙|“7ĹHľöJąwK 9ąč¶ĚĘÎáaěUs«ńĆäde Ńí – ąeÜőbh´8ő! 2s n®–N­F›m KS´§{żŐ@ٶ¶bRÓ2ŢH!sł÷ŕ1€ł_©|űKňH˝[hU*ô:î®E»%Ľ{¨°Ŕń)ű/ŠčŐzś]_#ݍ`0čpň-ÉEř®P’‹đߣ×ëČHŚ~µŕSX6kÖě.ŽÖx¸ş 8râ,ťÚµ@ˇ(z©KĆOťIl\"J•Š„¤ŞŐ¬ĆźíääŃ“lÝĽ•†M‚V“űôaţ'‹Ď3nÜ(RR’đő-…ă e7o^Ď–-°sçVjÖ¬ŤŤµP…H,.DŤźO\lý:÷Cš!ĹÁÉ7÷—O^ĎÉÉáłźˇ×ë .W,;[ó×ăm3áëY\ľvµlÇÝ]‚źŹ×kgĹšMT*„H$zĄl‡ŢĂiŮ´}B>ŁEăú¦€»˙‘ĺ(±vu5·ü0ývďŘMbB"ŐkVˇ\Ž<‡Éă&s5ę*'Žž QłF(2¤m nžĚaőęĺüöŰR<¸GÝşő_*;yň8nܸĆ_ýNË–íPĺd`#±3ŰVĎzňčÁ#”*%ĄËľxůý{Xôó"N?E“ćMXđÓN=Á¶Íۨߤ>­Ö¬}Č'ź|Hxx™™T¨đâ¤ě))I¬Zµ”ß_Ăt&4ô_=‘RĄđőőC«Qx˘ÓhĐÉ X‹_Ü·˝‹( Ú·oLvv––BĽĽĽÉLľŤ­­śĹ3ňGNśĄË­ç~–śžÁ…‹QĹgááăgHKĎD(R!¸,QĆĄĐCG ĺÁý|3ůÔj5fŠ3ĘÉ“Çřú뉅–ôčŃ— ääČńňňĆÍÍOOă껇Lš4–˛eńňň¦~ýĆ,\8›E‹~E$˛bőęČd2ślĚRŹ{wďŃł}OJ•*EŰŽmŮłcUŞWÁŐͱ AĺŚ1¤¤™RF EÍ:5ÉĚČděı ę>g˛bŃ tZi©if©Ca}ë...Ntnß‚ô )Őš1:¤?§Î…3őóŃ,X¶KK ú÷ěĸ©3 Ř‹ł"hݬ˙ E"q¦gç¶,X¶©,›#'Îâá&ˇË­Ř8”_VoÜĆ™âíiśDzůÚM.]ľĆ™°Nś9ĎńÓçńtw%"ę´iĆŁx“Sńôp%9%Ť& ę2¤_á,îŚűhI IH3¤T«U ˙6oŘĚĐC©Z˝ŞInË[8v芓¦MbÓúM– äjÔUÜ=ÜązŮĽŻ7çÎťIxř9˘ŁŻ1|ř,--ůůç=z•+?vĎś9Éҥ󱲲bäČO‰ŠŠ@­V±víJnŢŚ§lYwfÎśW¨şż_ů}‚ËT>GOĐł_O2sű‡ęµëţůčĎńđôŕfôM®\Hď˝YĽz1^Ţ^\8g\žżţ×őlŮ»…Ţ{“”„—Ká9 =z´ÇÚÚ{{{rrrhĐ 1/ž§wďT«VÓ$7oŢŹ¤¤$“Ď÷ßĎeÚ´I„„Ś˘|ůŠěßo żRŁFmŇÓÓČĘ*úÓ1 š%K~ĆŃŃÁ@ŐŞ5^ű8ĹĆÁzżNuŞW©@ŘĹ(,[‡»ńÉ5ěl[ţŘÂĆ­qtv$+9É,úi4Švď>Ч§q$ăŃŁ¸ąyĐłg;|}KѰaS>ĽŹTšÉ÷ß?NC±~˝1îLŹ}ٰa5±±Źđ÷5ĎŞ ˝NŹL*cŢŢy” .ËńcHKŔÖΖ/Ç~‰ŤŘ†ţCú#Í”r5ę*›wm6}÷đąĂlް™ ŕ "/D’š’j–:??…RIÇľ#™;ăKŇŇ33|3^ĘÂYÓ¨P® —ŻÝŕp¨ńáŕŁaý»čWjWŻBPĘ—1}–ŁPP&°Ő*—çpčiö6ž9ßÍaČ!4ŻŰÜluăHłP($*ę`\-Ő˛e;‚Ë#‘X’™iĽîNś8JĄJU:Őˇľ^˝†4iŇ‚;ţÂ`0<˙ Śô † ¤]§vdfdŇ˝Owî;Č7“ľańoĆ-÷d_č>üŤ«f÷ź2†Ć ţ ©4“Ţ˝ű3r¤1ő“\žM§NÝą{÷6ź}6’]»Žpřđ~¦Ný–FŤš°ző&Ŕčüćáä䌕•ą†ŠŹ $d4 üÄ’%ó;vÂk§Ř8X×nÜfó¶=”ňĹĎ× µZŔ”qSř|Ęçś?{žúM^>¤]ĐřřřáééETT;vüErrRîŻggśťŤďĂׯ˙­VK˝z ůý÷µ”/_ťN‡N§E"1ďkG'GĘ—%!>ďľú˙@äYr222đö1ŽÄŮmp‘¸°ăŻÜŚľÉ‡c>dęř©|>ůsâăâ‘ËĺȤĹűIŞ÷бĚřę3Ú·l‚Tf ^¸iënü|Ľ8Áő›w¨[«Q×ĐhţŰš× Ňlß}ąüůmJđ÷ľĂx¸»R&ĐźďŐÄÁá˙ďë¦FăSď‚Ů đööfÉü%ŚútĄżš*T†ëW®3cę zőďĹŃCGqssĂŐÍ•“ÇNć“55jSYýńÇZ,--™5k?ý´ŇĄg;(]ş,‡ícÖ¬˙ŃĽyk=zFŁ&**‚-ÚXĆ,ŻóÚ`x˙á´ţ 5;·ě$ tŔ3mpęř)®D^aĘ·Sřrě—|3ë›|Ç)Tš3'Îŕŕ耭ĺµÁ”)ă©QŁ6¬¦E‹6ůÚ L™ .^<Ď{ů裱¬X±^˝Šn%słgĎN"". —gQłćë§s{n¬óż#-=ó-Ş[8ÄÄ% ŐęđóńbĹÚM 6I`i4ŁłX&Uf†Y&(Ęĺr22Ňđóó7mK$®ÄĆĆ ŰRŞÔă¸C11ŹP(rđó+HKKÁÍÍťGŘŘń÷0Ű$wµZM\LĄË–6mű–ňĺÁ˝D˘|s‘IexzybkgKĚĂĘs(&%$a-¶Ć^,Fű XNrOKĎ$%÷5hą Ň8ů×äĘŮ}m¬ńtwăÖťű89: •e磕 äî\śŃéôX[‰P©ŐdeÉqvvD§Őamm…JĄćŻťűčЦ9ŤŰ÷ĺ±řzçčÜą÷€RľČsrP(”Ĺ6$&Ąŕč耝­yŽ"˙y>ŢďĆüž·MLJŽÁĺ ýwâ°łłĂŃÉŃ´ť#ĎA&“áéíi €©Ńh¸÷>Bˇ2AeHLHD,ŁT(‘JĄxxyŕěěLú˝‡H\«˝âWß>©©)\]ÝLŰ|´ĘŞ IDATôô4\]Ýpu}<×ňÖ-ăŞÓŕŕň¤§c ŇŇR‘H\qss'#éNA…3Éýîí»”@(rďÎ=J”"ća Z­–ŇeK›ć3J3Ą$%&áčč—Ź÷ďŢÇ·”/J…ą\Ž·Ź72©ŚÄ„Dđöő.ÔIîŹ=ŔÝݱXĚŁGqww'55…Bźźż)J~NŽ<·/SŞT11Źpuu%Ż˙(U*€ŘŘG¸¸¸bggW2Éý%čőzîÜą…@ 8¸élŘÚĽP¶°±˛˛2ťÓ'·ËUx¶#óňöÂËűńÄî<ç Ŕ3·Sך9íOAâ*qĆUâl*óĺ§x{şcť;L_.÷IÚÓăqGU®lŕ3Çńňpf_˝:5ŘőĎV.ś‰Ź×ă×ĹAeŚ×Šł“#ÎNަí<śžűż„·GŢ(î“ŰŽNĆüID"Q>»Éł'g'“}77÷Wnçńä˝éIÇëÉí¤lđăU—y÷ť'ď?y89;áäěd*?yos̵G'GÓvaăďřĶѶóśĄ'±µµË×Oö!yý€ź_Ń \XXXĽ•ţöąÖé°ţ9ŠÂwţ¶HĎb (źĘçĄQ(Ŕ CŻ/ÚaHŐĘ,ôú,„Eű-ŻNŁAŻV›V_gF8­V‡Vűću­\±•+;çś"¸â·0ШŐĎŘQD«RˇĚ)Úas´jެ¬"«¤ů÷h” 4*C‘ż~ ú·«n­Ş4|żö)dnö8Šv†üďĚu969Vzó&~~S, rôëgęWÔĐÔdl1ś^-üŽ“š•Š›÷łO—EŤÔ{¸ąĺM±@Yäí@vzó'S”¨°Ő‹‹|¬âÔ‡č ¸Q@iH/ňׯŢđzmý\ËJ$"-˝h{śá‘W©Zł.öNů'„«UŠb‘G čmlž©_QCŁR˘‘fbo_ô,™F^`í‘Ŕ°aĂHMMeőęŐT«VpsrdÉńĹŁ=˛"o˛´¤bŃŮňLěť$E>aqęCt6Öj#J‘(”EţúŐż¦3]´%J(á˙ ;věevvv”-]š{ 78qú4§Ďť#=#ż˙n¶z}HNNćÇŚťřŤ7‰DT¬X‘T*  Oź>>|}űö™­‰II&ŰđpsĂ|Đł'źŽIčéÓ¬[ľÜ${ůŞ1obŐĘ•INIÁ`0Đ©o_Fʲß~#ěČ‘BŐýúőëH$´Z-2™ŚřřxćÎťKĺĘ•iܸ1]»v ==ťŘŘX\\\(UŞ7nÜ@©T2gÎ,,,ذa  V­ZěÚµ‹íŰ·c]sô궉ôŚ &MźNóĆŤqsuĺă#€gmâîýűh´Z–¬ZEäĺ˜ܿźm»v1őŰoY4gmZ´(ĽJAţز…ż÷îĹÉɉ‘C‡R»Ć‹´żŚbóŠ0&.ťVG­ę•hXďq‰ďż˙kkkęׯ˙ŻGW ‚łçĎS§Y3>űňKŽž8ÁꍉĽr'''†br®"Ż\!ä㏉Ľr…ß·láÁŁG¬Z·Ž1ÇSµR%0ZšoÎÇ©U«ŁFŤâčŃŁĚ›7ŹČČHčׯźÉąJLL¤S§NÜ»wŹ%K– •J™={6 …‚-[¶PĄJłŐŚOv55bč1=q‚é3gyĺ v¶¶tj×Îä\ÔoÝšäÔT~7˝^Ďô™39zâ=şt!"* këÓ3ůpę:îFq{ľľľ„nťÂâá2>¬yť˛ř$ĚňŃGtîŰ—Ő7˛jÝ:Î^¸@zFµŞUŁoĎž&౓&qčŘ1~[żžG±±¬Ţ¸‘ěělşvčŔý>i’kS¦LˇU«VĚ›7Ź­[·rňäIděGp˙áCZ4iB«fÍŘůÇ\ t@GOśŕŹ-[řaúôŃŃ©Ú$RB‡đ ü7ΰlĺśÓ?Ě×ęă°°*ÚËźźfÚĉtj߀#ˇˇŘŮÚ’)“1rěX¶oÜŰc`ź>´hŇ€ďżţ€ÓçΡR«©Yýőž6ß&ŁFŤâÓOŤ zďŢ˝‹H$ÂŢŢž.]şŔýű÷iܸ1!!!T©R…ŘŘXĆŹĎ#¨ű„“o.şvčŔĎ3gĆ©GŚ BąrĽß˛%éđŕáCJäsş:¶mKZzşŮ‹.Y˛„Ę•+°jŐ*śťťąrĺ ˇˇˇĚť;0¶A čßß·ď×_5‹®/cú¤ItČu ;†ťť™™Ś7Ž­ą+Šď?|ČĐh–;˘=3÷~tňĚó(] đtwg׾}ÄĆĹ1â5ű©b3‚U±|Y,,<ډ§JĄÇé'BCCÉÉÉaÉ’%dd/¶—µ•Ą|}ŰŘpęěYúNÇv폌ÄĂÍ /cšŚ2¸»ą1áëŻůyńbÎ_ĽHĎÁY´bă§NĹŃŃ‘reËľâ× ˇPźźE`a|F’ËĺÄĹĹ™őSÜ\]ńň0¦ýé9x0éřúřEĂzőLr۵c÷ţýô:”G±±ô>śSgϲä×_ů~Ú4s©oÂĹĹĹ4Ú8nÜ8BCCyď˝÷ ĄI®SĐ®];Nź>Mź>}¸ző*“&Mâźţˇ^˝z¬^˝Úô`b.đĎń»h‹V®¤{§NěŮżßäÜ´nŢśč›7éÂésçX´bs-Ⓣů{ß>:·oŹe!Źş{yyáćfLÓóŢ{ď›_îďż˙ľI®K—.¬[·Ž>}ú •JiÔ¨Ź=B,ăââb’ٸq#U«VĹÝýŮ4AÉ“6Ń}ŕ@¤2>^^\ş|™†OÔŁc»věúçú FL\ýBB8†••n®Źă\ąJ$¦T]%Ľ6-Zđ(.ŽôŚ jĽAĚÁb•ěůIŻÚŔ°aĂhܲCľýéɱĹ"H\¶\ŠŢĆG‰Ç«…ßa4*%™±÷qw3Ďś˛·I|F<>_ď»ńń(•JRRRđööF«Ő2tčPĚ… ?ľi‚í… Đh4Ô©S‡ôôt˛łł=z4=zô 22’9sćŕŕđú9ăo_ÁÇŁčç,‹O‰Á'ČĽŻ˘ßń÷®ăăękn5ŢĤ‡xU.ňF‹S˘ł±ĆIRpoC”9Yä$'"q)Úý”^Ż#ęĘ©·—ěą„J(<¶lŮÂŹ?ţHÓ¦MéŐ«ŮŮŮ\ż~ťNÇ#LÎŐ¶mŰř믿hÝş5R©+++îÝ»Çőë×éŇĄ Æ {#窄J(ˇ„·C±yEXB EťŽ;˛iÓ&şvíĘ€hԨݺu#%%€ääd\\\:t(­Zµ˘iÓ¦ :€† ŇżâââĚU…J(ˇ„r)Á*ˇ„wggg±°°ŕ÷ßçÁ 8]»vŃĽysěííhҤ §OźfôčŃtëÖŤ¬¬,®\ąÂ€Ř»w/ 6ÄÉ©xM|/ˇ„J(Š”8X%”đ0dČÓö A^(Wąre6殦ˣOź>¦W %”PB ŻGÉ+ÂJ(ˇ„J(ˇ„·ĚsG°Î…G˛}÷A †ÂVçí—ĐjTůöë´Z´=ZmŃÎă¦ÓiŃk5ĎÔŻ¨ˇŐ¨ŃétEľ=ô:]‘oČ­GI{Ľ3—öĐéuh5ęW¦©y×)N}NkQ 6bĽżk‹üąŇëuŻő˝ç:X5ŞT¤^ťšĎű¨ČpňěyhHLożR.CnpF¨~—˛ŕýw4*zu&rC¶ąUy#t-*Ą­LanUŢl…ô™ë­(’­R’XÚC•S<ÚC™E˘ĚŮÜjĽ1rĄ}úCEűŢ[ÜúĽŔ~C«RˇUPYíű‰Áđz™žë`ŮŘX“–^t=qŽeËâŕé•˙kV6E{)»RžŽŢFŠ­DbnUŢ­J…@•¤č§pĐŇź˝ŢŠ ™®x´‡NV<ÚC®*íˇŐ(°÷t/ň#X%}ČżGť#GĄ×ăŕâW`żQčő:RcŁţó÷ŠÍ$÷{b8{á÷Ä Ű`mmŚV;}ŇtÄb17oÜdÁň+Äťá9ď[wîÜBBB;wná‡ćQ§N˝Ę®\ą‡ďĎŚłńp5Źq?O·#Žp+úGaĐđAtíŮő…˛€ě¬lBú†Đk@/şőč\ŕ:?ŹçévţüY.^ ăüůłĽ÷^ĆŚ÷ڬ@ 0•kÖ břđ1Ô©SŹzőŽâĎáéşÜ¸vc‡Ž}-'g'ľźűý3ryő¸uă?~ó#.4i@Żţ˝ U÷'yşqq1ěÚµŤŘŘâYłfó3ryőHLŚgÇŽżHHçţý;lܸŁPu’§ë!“Ęř}ÍďȤ2Ž:ĆÓž‘Ë«‡<[Î'~Bĺj•IIJaö˘Ů…Şű“<]ÁŔňĺ 1 ,[¶«WľP`ÄÔ¨Q›đđ0~ýőŹ×÷IžÖ'új4ÇçúŐë¸H\řnÎwĎČ™l"úK,El+fÖ‚Y|óĺ7ŘŘŘp3ú&ó—Ď/ÔNóézÄĆ>b÷îíÄÄ<"99‘ß~ŰôÂz$$ıtéB>ĽĎ† [ٵkK—.`Ú´™4lŘ„^Ě™3'ŚĽČ™3'iŢĽ5ÆŤ|­ă«L`)Ľ<Ý4j‹ç|ö]ƛ،Ů3L†eNŽ;ħźŽŔŐŐ•ľ}qéR8«Výή]Űqw÷49W÷îÝć“O†S»ö{xzzQż~c.śĂúő[صk+V,F©Tćq°îŢľK‹÷[P©r%:÷čĚžť{Řş776­ßdr®2Ň2čŰą/-۵$#=±Ç2¨Ç öźÜĎŇKńöńFž]pCÓŻBŁŃŕé)¦Ył–´nÝž•+y—ŕŕ üôÓ Ö®ýË$Űşu}şwďĂ… çří·MÔŞĚČ‘źPŁF-˛łł.o¶zTô«H…Ѝ^»:§Ośfö >¦uš˛űČn“܇ý>¤lpYîܺ čץ-Z·@­R3~ňxĽ}˝ÍX h۶VV"Ľ˝}Q©Ô|öŮDBB>˘{÷¶ĚńŘŃřöŰ)dgg‘––ĘwßÍáŰo§2š?MŻ^™<ą`ňBţ[F AěĂX,,-¨^«:ő×gä'#>`8cĆ?NöĽfĹN‡žĆ 70qÚD6oŘL`é@â¨P©ńqńć«đÝw_sâÄRSSřđĂŃDVŚ=ŽÉ“?cĚń&ąĂ‡÷łté|\\$Śń QQ¨Ő*Ž=Č”)ßňż˙MF§{˝9,ŻKyźňTŞR‰šujz4”MobđđÁ4©Ő„˝ˇ{MrĂú Ł\…rÜľy›…+ҧcVţľ’úŤësôŕQvoßÍ–˝[čݱ7©)©xą8Z=Z·n€ŤŤ >>~(9Ś?…ŹčÚµ 3gţl’űć›/Q(rHMMáűďç2}ú$FŽü”>čĚŚSčÜą«WŻ@ĄRšţE• šPştY.śÍĆŤŰßʑгT®Ś·çă°ü¬űđsá,[· {{{˛’“Ě¦źłł ;wB"yśjٲ|ýő÷¦r|Ľ1HäwßÍ1í[ż~ đŘ@bcáďkľÔb±_7ýŠ_)?S‡±lÁ˛|ťGVVq±qLš6É´ďđŮì^ľšRţĄ¸v‘GşîO"={ÁÁĺMƲe ňuááaý‡B×˙IĆMGłVÍLĺ «7PŻa=|ü§  gúÓ ,ŔľĐ}üąńOŽ<Ęň…ËqrqâËé_˛ćůéÝ{ 7•Oś8ŠĄĄĐôĆö4iMš´`ŐŞß8wî4JĄ‚ Ě˙tިY#ľţţkSůÁ˝\ żÄÚżÖšö…‡…ÓĽus† ŕŰźľ%>6žŮßÍfČ!4Ż[09.˙ eĘqřđ9SYŻ×łrĺb22ĎI ŁNť÷™:u€i4·]»NDG_}îčVađů”ĎiŇâńµ°ţ×ő4lÚoźÇáaáĚ=˙@cj¨NţSčzľŠľ}1p`©|üřa¬­­©]ű=Óľđđ0¦Ný–FŤšF¶Îś9Y¨ş'ž×üWŠřËđülŰu€ťÚćŰ7ç»9”`÷öÝČd23ifÄÝ݉ĕđđ0ĆŹ˙‹ð´´¤zőZ&c^¨źţ‘ĺË!**‚Ź?á·ß–1gÎwhµĽĽĚ;Ň`go‡_)?bĹŇŻs?âbâ¸|é2m;<>÷vvvxxy°jń*ţ7ů$%&ŃŁ]Z·oMĄŞ•‰DXY›7騅…ÁÁĺŃjµ4kVťNÇúő«:tD>ą*UŞłyóFŹ6&{nÖ¬‘‘™2e—/_˘J•ęfŞÁcĘU4&ŮîŃ®I‰I¬Yľ†ˇ#‡ć“©R˝ »·ďć㏑fJé׹Bˇ± J…kkk3hžźr匹?ţ8„¨¨VŻ^ÎСŁňÉT©RťŁG2věbc1~üG„‡‡±fÍň×ĘŰäµÇw_Ç=X˝|5CG Í'SĄzÂ΄1nÔ8˘ŻFóÓŚź8rŕŢľŢěÜş“*ŐÍźG1Ż=V­ZÂÚµ«^ĐŐ¸ví2_|1†sçNłnÝ*V­ZÂ/żĚA*ͤRĄ*f™w•×ÝÚv#%9ĹŘϱ‰]ŰwńIČ'Ȥ2útěC|lü32{vîAâ*ÁÁ±đßäµÁčŃø|92· ň_çUŞTçČ‘Ś;‚¸¸>űl$/ž/t]‹ …‚íŰ˙˘_ż!Ż~ Ĺ*ŮsVV6vv¶XXX°xŐ@PíÚ¦ái'g'rŇR±6xúEŤFŤR©ÄÁÁŤFR©ŔĆFŚR©ŔÁ!˙sV– ŤFcÚŻP(‹ĹdeÉ …8::™m’»N§#;+'g'Ó¶˝˝iߓȳĺ¨T*ěě슄dɲpvq6}& ±€<6'·ŔB­‡Á` 33 ŚŚt\\$dd¤çaP(rLm Ű’žž†‹‹„ĚĚt pq‘ HĎBX¸őČĚČÄŃÉ 232qpt K–…Ł––ŹgŞT*äŮr¬­­±ł·Cš)5µťN§ĂÉŮ KKKŇoÇ!ń¨TčőɤŶD"d2b±ŘtŢE"‘INŁŃäÚ‚GGG˛˛d&[˛±±A$2:îé)×ţäÚěělD"ÖÖÖ¦m­F‹P$ĚçÄęt:¤™R,,,pvq6Ů„V«5ŮŤµŤ5é÷"q­VčőČÉÉA ä¶C ŚŁQbqţDÇééi€Ń”Je®ś…"1¶¶¶d$ÝÂ)¨p&ą?mŽNŽČ¤2±°|üű/˛ ­V‹FŁÁŢŢŢ$cemez RX}L&ĹÖÖˇPd˛…"Çd'yäŮ„H$ÂÁá±M€±˙pt4ö%ĆýF)´IîÉEo’ű“ý'ą?¸˛÷í%{Ζçl …9 ăűe˝Ţ8„ýt§o.D"+ÓŤ_$™ŚăI#Éăi‡+OćéŽßXZZšÎé“ŰĎ;ĎvövŘŮŰ™ĘyÎUŢg`\EhÉxéÜ>ď‹Ĺ¶ů:”<ó·ä?ŻyŰOîËĂÚÚ:_˙˛¶3ŽŽNOlmŕyö!‰ňµSž˝»1y ĆáY‡ęižl±XüÜíÂäMmÂŇŇŇ´˙i™Â$żM·E˘gíőE6‘÷Ůóö—đbžěŢ„ç:X'φsôÄŮ7>¸9É–ç €<--ß~UVzDhTć›`ý6Ш˛Ń«ĺf›ßđ¶Đi4¨*äŇDs«ňĆhrržąŢŠ"ĄĽx´‡R^<ÚC‘S,ÚC­Ě"'Ý hĎL)éCţ=Z•MŽ ‹˘=Ýű­ĆÁŞ_·&Ťë×}#…ĚÍÖż÷aa!çź .ÍŃcX[mÇ$GŻGo팽řÝEy]´–*dÂX$ÖE»=´*Űg®·˘VY<ÚC(,&í!+íˇ‚‹Ř ą‚弊S˘łvÂAěV`żˇČQŠRp*âׯŢ` ů5ľ÷\K(´,’FÓ3¤čő:\śť¸văďŐoŚA`Iff&b±gggr˛m°6Xbcóň!ďÂ@ĄR‘ž‘••®Żx®V«IKOGde…›D‚V§AomŤ­ýKżWhµZRRR°´´ÄĂăßuhR©Ô8OEl‡HdőN´‡Á` 1ɸĘÔŰëŐ*’’Ŕ`ŔŢ΄ «w˘=’““Ńétxxx䛇ő2Ywww„B!Bˇčťh€´ôtÔj5‰k«/ŠČłŔd#Bá»Ó™™™( śśśň˝z{R©”śś“¬đ±€¬ěl˛łł±··ÇÁţĺç6;;›¬ěěÇö!a#¶ÇÂÂ<VRRz˝ţ_Ů„Bˇ@ĄRáěěŚBˇ 33\\\ĚއäŮ„«D‚ŐKlŚv‘•ťmę_ŇÓÓŤsű¬­Ńę4謭 ŘF čDÖďĚőűoŃëő$%'#đňô, Óp1ň*k˙ŘŽŹ·Gľ0 łfÍÂŰŰ›µkײcǬÍôđ”)•’^ŻÇÉŃYv6ż¬X§»;ÇOťbŮĽyT*oڧtýĆ dYYT,_@@Ll,'ĎťC&“±˙Đ!ćĎšEŮŇć‰ě¬P(¸yó&öööŘŘŘššĘţýűyôč÷ďßgňäÉ4mÚ€»wď’’’B™2eprrâÚµkÔŞU‹7n0lŘ0ăßÁf©‡^ŻçBDŢ^^XÄ%$p˙Ń#¶íÚ…^§Ł_ĎžôěҀظ8băăńőńˇ”Ż/aáářz{Ó m[f}ó U*V¤ZóµobB IDAT­řŠŔĂĂ•J…T*%99™_~ů‚‚‚0a)))Ü˝{777‚‚‚ŚŚ$%%…źţ™zőęQ©R%z÷îm¶z\‹Ž6نAŻGš•ĹÔożĄqddf˛xŽ1t‰,+‹ë7nŕŕŕ@ĺ ¸~ó&V"á—.qôÄ 2¤R¶¬]k¶zÜąsÇdööö(•JBBB8p dĎž=€ńëŇĄKXYYQ«V-îŢ˝‹Z­fĐ A„„„°cÇ:d¶z<ŠŤ5Ů†Ź—ŕž=ůjÂfţü3WĎ>žFrîÂŢŻS‡¸„ z=ťúőc§źňÓ‚D„†Şî/^ÄÓÓµZMff&IIIü{çĺń5ŕ‡ĄôŽ  E Š(v±ĆŢK4¶±Ĺ5šÄKş%»Fc‰+±+6¤"…eEzŻ[ľ?Ö¬ágŤĘ®řńśĂYŘťűî˝ĚŢťygîÜ»nÝ:j×®Ť‹‹ _|ń żąHJJÂÜÜGGG˘˘˘řůçźěÚµ‹#FСCöíŰÇáÇŃV⨇‘ˇ!ůHĄRrňňX°l­[¶$ż €_ř€ÜĽ=şżZč9TíÍđQنb±‚‚"tt´Ď/]ş”ÂÂBĽ˝˝12R]=ݰk×đęÚ•o–-#$<śţţčëę’•-_)Ôzyý:“żřˇH„ßáäDě?|IăĆáhoŹL&{éť|e“śśŚ——3gÎ$$$„íŰ·ŁŻŻOnn.eeeŠ ÖGŹŃżňňňضmůůůlÝş•˘˘"Ž=Š› '$ _uóęŇ…‰3fΚ Đ×ŐĄ  €‚ÂBôtź{uíŠT*eÍúőňÇ  gpßľ\ B"}łýůwEź>}9r$gĎžeëÖ­H$ĘĘĘČÍÍE_˙éI§’’’ÂöíŰÉÉÉaűöí\ż~ť‚‚4hŔG}¤B+`âŚô9’ţţě?|ŚŚ @~ÇţďŐ’©łgĹ#Gx(rĐßźââb:wč@âÝ»,x2ˇT‹/¦k×®lßľťS§Nqçδ´´HKK«ĐË—/çďż˙ćĚ™3ÄĆĆröěYnÝşEŤ5ži« 6mßNënÝXłaWÂÂŤ@OW—GŹŁ˙/˙ŘöÇlŢą“«‡…Á•°0ÉPSSăV|ĽâĐ‘˛čÝ»7#GŽäÜąslŢĽ©T޸ů÷˙uŔ€D"¶mŰFnn.Ű·oÇÚÚš=z(ÚÜĽy“^˝z‘ťťM~~ľRíđ™>ťţ#GrčďżŮwč™™ňSjYŮŮú`Ę_píúuüŽ!9%…GŹ"•ÉÚżż˘Í ľ}©kSőK.)}]]ň (**Ş0üW>¬{„X›Ň˘Yc®]ÇÂ\›ôĹ_`kkË·ß~‹††ĹĘőŹ 4iŘý;v ˇˇD*Ĺ»OV,\ČőŘXR=˘žyOx`ź>H$ÔŐŐY0w.ĺb1z÷fÓöí< ©SŰRevXYY±˙~jÖ¬I˙ţý?~<Ý»wçÜąsÜşu OOOJKKÉËËŁk×®tęÔ Ö®]ËŠ+ĐÔÔ$66±X¬˛,źňŰą=]]úőěɲź~ÂËÓ±XLhD=şt@(ŃŞE <ÜÝQSScç† DDEŃżwoCBđ;r÷ĆĘ?F˙o6mÚ„‹‹ ĺĺĺěÜą[[[Ú¶mK`` ź}&Ď[$ qww§oßľhhhđË/ż°oß>,,,HOOgöěŮlŢĽYĄv,_°€]şP^^ÎĹ  űőcŮŹO3ą E"Ćą¸Đ®ukÔćĎš…ş@@PHĺb1MT>>>´hˇú8ŘŹ‡ áű%KH$H$†ŤGđŮłĚţćEˇHDkk>źX17S·Nť())AMM5E‘·lŮ‚łł3eeeěر;;;ZµjEHH>>ň\wBˇf͚ѧO444Xµjď×°¸rŃ"şy{S^^ÎůË—ŃĐĐ`Pßľ|·j•˘ŤP$˘ˇ‹ mZµB] ŕ«ŮłQ¸rőęK®\Í‹¸A;//Ň33‰Š˘S»¶otťfË­3b±„›·éĐći†Űëׯ“““ĂożýFv¶ęâĘtjÖÄŢÎ---BÂĂůtÚ4÷í˱S§°©]›z898PÇÚšů‹łaŰ6®EGóÉgź±uçNć.\ą™.ÎÎ*łCSSGGGtttxřđ!=zô _ż~#‹iٲ%&&&´k׎ĺË—óÍ7ßššŠ··7K–,á›oľÁŰŰ›îÝßlŮő]QĎÁ}==$ ŤŰ´ˇW·nÄ'$”DĎ®]íF ĆÚ ?m2™ŚĆmÚ PWgăöíÜŠŹ§W·n*´ěě쫳ŢŢŢŘŰŰSRRBhh(ýžls >ś]»v1nÜ8ňňňčŃŁ–––hkkG—'JUQÇÚs3yŔí'ź}FAa!V––ś8s†A}źÖ¬Ô·/'Îśaě¤I=âÓiÓ gŰîÝ|·d‰Š´ŠĄĄ%ÖÖň úóçĎ'$$„Ö­[łk×.†®hׯ_?BCC=z4ńńń,Z´€€:uęÄďż˙Î#Te¦&&ŘÖ‘ç/Z»q#›věŕă!CX»aن S´ëٵ+‰IIŚž4‰đČH6nßÎÚŤ™ýÍ7üyđ ĂTú¤ĹŢŢ^áť:u˘^˝zFß}–†ÎüÁ¸qăČĎϧ[·n$''ŁŻŻŹĄĄü&vذaěÝ»OOĎ׎1}WÔ±¶ĆÜTľX0ĘLJâ’,ÍÍ9yölEźč׏ă§O3vňdD©©Śź2…Đ´µµ©mý´šµ•:*JťQ•čÝ˝;±·n!‰čÚéÍ+*|P‰F˙Íş-ň¤]ç^žĎJ˘óžąż …ąHµµ10©Ú§¤ĘKKČŢĂÜĚúŐŤßsDŮ"¬í¨ZŤ·F”pk [U«ńÖŇ“±®§úŐ¬·E”‡µimU«ńÖ¤>~€E˝†* rW|HcD»†&•·RR”OQZ*&ĆU{ś’J%\żôRßäPâűX¬Üâ˘ŐTSM5ŐTSM5˙đÜ ÖĹ PbnĆ+[—wŠž®j +<_”źChjĽYźß”Ҳdšę©¶ľâŰ"—Sśź­ô ŘĘ  8ç™Ď[U¤  —ÇU­Ć[SPřaôljS§yř ę'-(ČA×ÄĽĘ'-.ĚcĚ›V^ţ(ePZV‚TS@IQĺ&——•R^P@yyYĄ˝‡2ľa2ÖçN°:¶mYĺŤnŢąŹb™í:ćž/O“ޤá;çI)m%×"|×KKKj˘­äZ„•AQöőg>oU‘˘â2´UP‹đ]S”~óčŹ+×c(Í—Ńľý›Ç‚Ľć¦RÓRAź`-ž·‰ˇĂ'ˇmá˘jUŢ%Ś!‚˘BH3D»ŠŐ"ü_¤R ¤&ýgąnćäV˝•‘«áQ””–ѲyŇŇĺ%2„ÉB®_»ŽukÜ=ÜU¬aE22Ň ˝‚©©­Z˝ü”BVV&!!™Đ¦M{%iřzrńěEjęÔÄ»ŰëĺW‰‰ŠÁČŘk+Őť†ü_d2'N WŻţŻh 'NE&“áč茋Ëű5! 8@Iq ťşuzebË g/PTXD‡.*ÔŃ{$;;“V­Úbú’üx/}$úZ4)É)4nÖŰ—•ʉŠ!ůA2Ťš6ÂÖN עE+FŚŁ U_J|ü-ăqrrÁŮů匄„xîÜąĄđe{~çNťŁ´¤ďnŢÔÔyy ·đˇôôtÜ›»“’śBôµhĹňËĘ_”¤ńó ľLvvÖ+} 33řř[´nÝ€ĐĐ+888an^µc˘*±XĚéÓÇÔůčŁ>o|ť÷ë<ę[pîR0ç.^ˇˇ‹a‘1čÔ”çÂ:~ä8^m˝řÉDöůďĂTO5'(’“‰X\Nť:¶¤¦ŠŘłçw†Ĺ·ß~Í·ßţ„‡‡üŢŃŁ‰„ôí;55aaÁ”——aeU‡~ř–ůóѬ‰j‚ws˛s8á K Ť I¸ť@ôµhlíl‰Ť ??ź~ä'×Îź=O|\<»t¤ŽmŽě?Â'ź~ÂĹsY±p#ÇŤdÔŐś”’H$lÝşž¦M›#Ś ŁĽĽ‘HD"ááĂLž<€đđ«DD„ŇĽą'žž^lÚô+Íšy˛jŐwlٲ##Ő®"ţ±ő¸5 ° äÉ\ąřjćW¬Ţ¸šŹű}L`”|"ź—Ďîßw٧ŻÇ'ăĺ~0kŇ,6ďÚĚžCŤ U•„†+|ĂÝÝPcČž\ĽAÇŽ'**‰DĚý8sć ]»¶ćÖ­ĄęľsËN\ąRTXÄ{¸|ţ2 7$80ż¬ŕöÍŰ\8wú ęăÝÍ›=żďÁŮĹ™Íë6Ł&Pcó®ÍŚ8ŠĄ?,eĘŘ)ě=şW©v:ô66uyüřĺĺĺlßľ‘QŁĆ3sćgěÚu€””düýam]›~ýăď+«Úřůí!&&šS§ń÷?ČŇĄ_óÓOżáí­Ú“Ďď;kÖü@AAąąŮotťŞ˝Vű/ěmë “É¸}'‰‚‚§E8GŤĹß-|ńŐÔµŻ«2ýâ™0ác®] C&“!•JiÝş=‘‘áD)”––t‘M›~ĄOź„……ň¶C†Ś$++‰D‚™™ęî>2Ň3>a:ţ™L†D*ˇe›–$Ä'đŕŢ źüďŢČô ÓůxĚÇ„…„ňIŤH(â~Ň}\ÝT»â#‘H7o:›6ý&·C"ˇy󖤦ŠHH'7÷é)Ú®]˝đń™JDÄU¤R)‰™LĆ€Ă7oWŻ^Qˇ%°rńJľ[ňťB·ú®ő‘H$\ŹşNnN®˘ÝĐ^CéŢ«;"ˇÜś\$R …ů…<¸÷€čČh\\U»ĺ±aĂZćÍ›ŽT*E*•bm]SSs®^˝Rˇ?&Nü„  >D*•˘ĄU™ "#Ă™4i†ŞL`ß®}L5‰T‚T*Eß@źŤpáě… ý1oĆ<ôôô°®mÍ­Ř[HĄRjÔ¨…Ą§prqRˇpúôq† é‰D"A*•Ç těŘ…'ŽVčŹďż_JffÍ›{~őI˙ÉčÔ©+'OţMNŽňÓă¬X´‚ď—~/÷ ©—†.Ĺbb˘b*ôÁŕžů¨ĎG ÉËÍC"•ŕÜŔ™Î=žć+ËÍÉĄvťÚ”••!‹•jÇúők?†Â'j×¶ÁÄÄŚĐĐŠ>áă3І !•JIIIF*•>ąyZ™ˇoßAŘبn ¬Jxx´"%ĺ!‰‰wČËË}µŔ ř`&XF†Lůt$^ž·ÇĎG}>bčȡ*Kx÷^^íXľügśť]prŞŹ·w7ľür!ÖÖĎÁ600ŔÉ©>zzú8;»wöí˝ŃÔÔD(|¨íźbkoËÚMkiÔ´ 5¤±{c,[@ýőźi«­­Ť[c7´´´hÔ´ţ‡ü)*,".6Žđph˙ M¶o˙“-ZáîނڵëTXIü7wwÔÔÔpwoH$ÄÂÂ’–-[ňś«+—uŰÖáÝÍ›FMaemĹ‚ĺ đîúěv­@  aă†Ô¨Q†ŤRC»Î.ÎÔµ«ËĘE+U yEV®\Mż~qvvÁĘĘš/ż\@ż~źi'prŞŹľľâ1<<„Zµ¬±µµSľâ˙ĂWKżâ“ńź`ç`‡•µ3ćÎ`ÔřQĎ´SSSŁ®}]LĚL¨kWíšÚ<Ľ˙1>c¸ˇÍ+2mÚl¦L™…µum¬¬¬™4i:“'Ď|¦ťššš˘Ť••5ÖÖµ™0a S¦ĚzeÝżĘÂw»/ťşv˘QąO,\ľN]źŤcňď¨Z¸5vŁFŤ*ĐöĹ|÷Ýúö„łs¬¬¬™7o!}űz¦ť@ ŔŮŮ==}…OTófŘŮ9°dÉOVnßśf‚Ą®.ŕÄ™‹<Š9äi¶zNőżĎúŐëÉÉV]n/KK+:tx"Q §N#==ŤŤĹŰ»;Mš4 I“ćx{wcăĆ_IOO#5ő'N%33M›~ŁuëvĎť( =}=>ę+/©’ź›ĎÁ?R\Țu›°©kC÷^ň䡖V–|öůglX»{wďQXPČ_»˙bŇôIL™5…ŃźŽfŘ'Ă^öV•Š@ `đ`ůö¤T*eçÎͨ«k°yó:JJJ3ćé’đŹ?ţĆĆŤk‰‰‰`çÎÍ´háEll4yyyŚ7I%6üCź}%ŠţÚý%%%ěűc÷’î1eÖE»%ß/áß‚.ˇ¦¦ĆÁ?ҲMKěíąsűÓfOS• x{wĂĚL”~âÄQŇÓÓ8qÂź«W;w˘ÝÜą ¸z5'üś:u ‘(ˇđ!sć|­*ő´lÓR;uůüe’“şÄż#,ů~‰˘Ý”YS¸—tŹ}ěCC] KAdge3ő‹©ěßłźoüVEČiÔ¨ ČC"#Ă‰ŽŽ$&&šŤ×ň㏿)ÚŤăCII ›7ŻC]]ččH"#Ăąyó6¬aůňźŃÔTî©íľű˘­-ůk÷_”––˛÷Ź˝<¸÷€É3'+Ú-ý~)‡ţ:Ä•ËWPSSĂoŻůůůÔµŻKËÖňďŮE+áČź1>c°©«ÜR3ť;wWÄY?~„ŚŚtŽ;Bhh0sć<ő‰/ż\Hpp 'O>ő‰GŹR033ÇŰűiŇ伱´´RŞ U•-[Ö!1âÍ«Ť|ЉFGŤIóÎďâóÓ§KžśŃůN ‹0üNfe_ÇÄÎNŐjĽ5Y )|§łŇobRŻjź^ůŮL»´düxŐNäßUąż+<ę{°w÷߯ ňßQĆRVTHišýŕáýÇßM˘ŃŚĚlC"ńfąŢ22UW§šjŞ©ć]’šúŰ·ăT­Ć[‘—yý˛,ÔŞ Őx[ĘJ«vN§j”Çs'X©ié*[—wJkOw´Ő+&č+ÍĎEB eď×>űĄĽ¬™¦iQŐvv©¸śŇü ¤ĄŞVĺ­)+ÎćóV)+Ȣ€Şťh ¬0›aŐ?(]ׂЫÁÄD«Z•·˘´´-=•ÇÂľ-NŽP$˘ ­jŰQ^V„´’ÇqY)â‚RÔĘ _Ýř=F&{łDŘĎýöqkŕL~AŃ[)¤jBŻ]G"Ó vťŠ×R©¦ˇäćfµT­Ę[#Ę–b]çŮ@˙ކ¨¸ k‹ ?ŇË?ţ8n KŢز·ĄşáűEu-Â×G*•žšđźĺ^x{WVVµWFŠ‹KT­B5ŐTSM5Ż`Ýşuäćć"•JŃÓÓ#==ťE‹ˇ­­Mdd$yyytěŘńąččh˛˛˛đö~˝äĆ˙KDD÷ďßÇŢŢž¤¤$6lČÇéŃŁÇ[ZTM5rŞţúy5ŐTSM5U–iÓ¦ńóĎ?“ššĘÂ… 100ŔŐŐ•´´4śťťÉĘĘb۶mdgg#>}:<~ü‘HÄŽ;HOOGMMŤéÓ§ŁĄĄE@@iiiܸqFŤqăĆ FŚÁ¦M›Xşt)K–,ÁĆƆ[·nˇĄĄETT .$99YŐ˙Žj> ŞöqŽjŞ©¦šj>8š4iÂŇĄK‰ 22’ŔŔ@îßżŹŽŽ˛'…wPĽöď2O‰‰‰\Ľx;;;Îź?Ź˝˝=k×®ĺčŃŁ)ĽĽĽpuu%++‹«WŻrâÄ üüü(((P‰íŐ|8Té –D"áŕß§)(,B*“qřŘvď?JnŢÓęŕ±±±¬^˝šcÇŽ)SUČd2’îßg˙ayÉŹű°Ú×—żzĄnÉ))¬öőĺO?ż÷ÂŽŚŚ ¶nÝ @VV«V­bëÖ­HĄŻ”Édś:uŠëׯW¶ŞŻÔ٬¬Ś_Ö­@,‘°Ę×—UľľŻeÇ*__VŻ_Ď•«W+[ŐW"‹Ů¸q#yyyHĄR6oŢĚŞU«ČÉyyş©TʶmŰXµj™™™JŇöĹH$öúů!‰Édě;xŐľľ!ˇđɤI¬X¸Ë—SËŇ’mÚP\\Ě–ť;),*˘Sűö™pěÔ)ęÚÚŇşeKľůö[ęÔ®Ť{“†Jłă÷ßGKK‹¤¤$lll¨]»6ěÝ»— &0cĆ şvíĘąsçĐÔÔdĚ1”——łcÇrrrhذ!^^^¬ZµŠeË–qŕŔVŻ^ÍرcquQ^ňŃ'((( "* ďöíQ×ĐŕNBó/fö´i,ýţ{455‹Ĺ,űńGĎźŔžýűIËČŔÜÔ”‘C‡2sţ|şwéÂţÇٵiő”f@PPqqq$%%Ńľ}{rss)..fţüůôęŐ ???®^˝J۶m™5kż˙ţ;§NťâĆŤ2nÜ8V®\‰,Z´şwď®4;ânßćÄŮł”••Ń´qcîÝ»‡ĄĄ% –/gçĆŤÄ'$°yÇĚťËŘÉ“ąpěa×®pé:5kâ3v,Űwí˘K§NĚš2…Ë–QP¨ÜKŹ?Ć××  eË–,]ş”éÓ§Ł­­ÍçźÎąsçčÜą3÷îÝä«,{÷îESS“©S§rěŘ1´µµůňË/ůăŹ?9r$7oŢTšĺĺĺĚ]¸fMš`ffĆ™€† ČŠź¦ť—žÍšŃˇW/Ä™™¨› {2™ÉĘÎf͆ ¨Ó'M"<2±XĚ€QŁ(|ô=kkň_1đööV¬(ýřăŹhkkóăŹ?Ň´iSJKK100 00`ll @»vípssĂÄÄ„K—.±oß>,,äÁÔmÚ´ÁÉÉ ±´´ÄÁÁYłf‘ššĘŞU«puu%??ź.]ş “ÉhĐ ąąąXY©.çÍ[·8@II îMšpďÁ,ĚĚX°l»·l!îöm¶íÚĹüYł7e ţţ„FDpţňettt8f [ţřF®®=~śkŃŃŚ<żOťbŃŠüúăŹŘýĎö]óčŃ#6nÜŁ˝-˝;ľ_…ןGyy9ľ[¶đí?0}Ň$,_Ž…™©ŹóÓŻż2wúçotÝ*=ÁęűQg6íŘ÷Ň6ÝşucÖ¬Y¬Ył{{{˛Ň^îčďż#G°®U‹ą3f ‹ičâByy9?¬YóB™Đk×8čďϡݻąuçĆFFx¸»ÓÖË‹°0E ¨29}ú4BˇĄK—bdd„ĄĄ%vvvěÝűâ§))),_ľś[·nqĺĘ´µµi×®111¨©©Ń°ˇň&˙Ć!V­\‰Ł˝=ęęętíŘ‘9 ľTnÔĉH˛˛8vú4]:vÄŃÎŽŻżř‚Ą?ü@—ŽűńÇĘ0ŻĘ.[¶ŚźţGGGŠ‹‹iÚ´)‹-z©ÜäÉ“  ))‰˛˛2Ú¶mKbb"·oßć÷ß§wďŢJ˛@ÎCˇ•żüÂw‹ăhg‡±ˇ!^žž¬YżţĄró/fá—_˘]Ł………4kÚSccââăąĚ?ţP’r˛łłůůçźYşt)ŽŽŽÔ¨QÎť;łk×®—Ę­X±‚víÚáîîNvv6®®®ňÚ…úúÄÇÇcnn®$ äH$~Ý´‰ofϦĄ‡ť;vÄËÓ“Íš˝Tî·M›řxčPŇ32p°łC"•2Ö,Ömެ(Üý2šýë=&M’'TýěłĎ*´iÚ´i…ż›4i˘ř˝qăĆ^sss{ć÷ź÷Ý3věŘWę¨ $'Wô ##ľ–ł* IDATĽZ´`ő+|âËE‹Xúő×hjjRXT„GÓ¦8Ő«‡†ş:מ¬„öďŐ‹ő[¶(Ă …O¬X¶D)ď÷¶hii1iÜ8ľýá‡wzÝ*˝Eř: 4)S¦ĐąsçW7®ćÎW‹äĺĺQţ …–——+dňňó9€­Ť ¤gdT˘ĆĎgęÔ©tîÜ™‚‚JK_?g•T*%;;©TJNN111$''«X’W&ăFŤ˘wŹS\ňßNšfee!“ÉČĚÎćbP’“iPż>w+IŰÓ»woFŚ—ú)üŹ+6999H$˛łł‘H$¸¸¸Đ¨Q#ÖżâKĽ2hѬźŤ‡žžy˙Ú¶yňňóţQ^^ÎůK—psuĹBÉćÎťK­Zµ^ąMőżRZZJaa!999¤ĄĄŃ­[7îÜąSIÚľ-MM–-X@=˛˛˛^-đ/Š‹‹ĺ~őä§ž˝=3&O~«Z„{öě!**ŠĐĐĐ×jűöm‚_ť/l˙ţýďmŚ•góćL;]]Ý [™ŻĂ?ľ—źŹ¸ĽĽ’4|=lmm“ĺ˙ݍwěŘq‰±A ,LŤQSS#ŕr}zxW©4Ť\ťiŕě@Ff6ůŚÖŹ›·pwwÇÄÜŠäädBCCqqqi9šĐШü­B™LFł&M040ŕrp0v¶¶`ldDÓFŤhŐ˘‚hÓŞ˝»wG PÇÚu€«ááx6oŽ@MŤ7oŇÄÍŤGŹâ٬ýzőB")G¦ˇAŤšşJ±ĂŐŐKKK"""000ŔŇŇ’š5kŇŞU+ZµjEpp0vvvŚ;uuu °µµĺüůó4lŘSSS.]şÄgź}†——tîÜ™Z–”äĺ «SůĄ‹d2vvÔµ±!îömÄb1umlPSSŁc۶´jŃ‚¨(455™óůçhhČx[yxpěôiělmqrtÄ˙äI&ŹĎ•ĐPÔÔÔóůçhii‘_’ŹľQĺî2™ kkkęׯĎýű÷IKKŁ~ýúČd2ĽĽĽhÖ¬"‘ÜÜ\fĎž­XńlŐŞgÎśÁĐĐ&MšŔ!C((( 33“Ůłgc``@~Vúş•źhX&“ablL77ŇŇÓą}çM5B¸7nŚ›«+jŔÝ{÷řbÚ4ĚLĺŰţ˙řŤT"ÁËÓ“«ááXתEZz:CÄäÉR~QúJČ'“ÉĐŃѡeË–LË–-ŰNÎÎÎÔ©S‡ĐĐPfÍšEť:ň˛!˙řMff&ť;w&&&sssZ·nÍ•+W5k¶¶¶äg§ŁŻSů…{e2€mÚ •J9vęÚ¶E&“a_·.v¶¶´lŢśăgÎ0sňdĹÖx+®EG“”DŻîÝIşź˘˘"tuu9vęS}|pqv¦°0] ÔÔ^˙ľľ}űöx{{“››‹żż?ĺĺĺÄÄÄ`ggÇożýĆĺË—iĐ ::ňśTłgĎfßľ} 0€Í›7séŇ%śťťŮ¸q#nnnřúú"“É1bőëׯ°ŇőşćUÚ"“É056¦±›ŹÓŇOH ‰››b,iÔ°!2©”¤řbęÔ >q)0©TŠ—§'ÁaaÔ¶˛ÂŘĐCÜź¬öÉd2»ąablLYy)2 ´kľű™L†®®.ÍÜ›R^X@M%ŚSďuuuÚµnM«-»v ===¦Oš„şş€ÇiŃŃ©IQQń3r—Cč׳ …O^KËĘ&üÚő»á¸qăh׹W…ç?¤$qL˘Qá=ĚͬU­Ę[#Ęam×@ŐjĽ5˘„X[Tnچ2Ą'c]¢8¬Mk«ZŤ·ćMŤ1sćL˛łłŮµk~~~ :”Ď?˙śŰ·oăŕŕ@nn.ľľľlذëׯăîîÎŮłgquuĺŃŁGXZZrďŢ=455ńőőĄAR·nÝ˙lLJ4†T'}=¤R ×oýçZ„üa5ŐTSM5îîîŠßKJJptt¤S§NĎ´‹ŹŹ§¤¤{{{şt邉‰ ąąą*ŠM?|řPX_M5•Aő«šjŞ©¦š÷<==i×®>>>Ô¨Q &ŕă㇇BˇOOOEűŹ?ţ>ýôSĽĽĽHNNĆÓÓ“¬¬,víÚ…%%%lܸ‘H„¦¦ňN•Wó˙Ź*}аšjŞ©¦š—ź~úIńűŕÁřáÉIŻ <ÓŢĐĐoľů¨xZpůňĺ,[¶ €ž={VŽÂŐTó/^8ÁĘÍËGµé,ßÉ[$«¦šjŞ©¦šjŞyž;ÁşN`H¨8cřŰ .Ł®&%ëqĹĽWyY”# ¨řż}ß()-BV˘…¸Ľjĺ–Ë),ĘC=űÍŹrż/ć=óy«Š•ýXŐjĽ5ĹEůFć“%¨úýQT\@vZĘ:Eř>ň!Ť!ŇM$•ΡĽ¬ŇÂ\¨ŇË5 {Ă›çN°Ú¶jNűÖžĎ{©Ę°Çď(Ą212ă_h “Y"«Q5ŽŤľA˛yĎÚWĹ•…&ČôlT­ĘŰ#)¨ňý@¶.2˝ŞŠŇâŁ?ň´>Śţ(#3Ş‚Ş=ÁúĆ*y ‘K Ě™žę˛ăż ä¬˙ž—îą,@@fVöŰ꤄˘TjYˇˇˇAAA!%ĄĄ™šô€VÚRT\ÂăGŹŃ7Ч–u-¨Ë´ĐĐTMť©˘˘B˛˛˛¨SG>ˇHN~©©™"ŹË‹(..B(|¶vMllę"ÖĐBMS --e¨ý eee„"ěěH}”ŠŽŽ†Ż—Żçqęc´µµŃ­©Ť@]¬˛ţÉd$&ŢÁÉI^˛'3SžÄŐÔÔ앲 ń€ ccSĚĘ̌««¬?’“°©k¦¦&ą9ą”—`iőę#Ř÷“îS^VN]‡şhii!P×PY$'?ŔĚĚśš5užřK&uęĽ|‚ńŹ ¨k¨´?RE©ččĘ}˘Ľ¬a˛{GűWĘ=N}L^Nµ,042”®TŘéj=ń—xśś\^)—••IffúżüCu--Ĺ)>e”„m][445ä>QR‚e­WűD^nE…EÔ˛®E^^ŹEŞCžő‰§cČË(.."##ą˙…É› «««”1D*.G .Uéç÷u‘JĄ$%%RŻž3ię"•ľşÁó¨Ň·GŽźeÔÄ٤ed‘t?™•«7ň릊e26ŻŰĚőČë ď7‘P¤Tý""®’””Htô5""B‰Ť˝Î‚s:u‡ď§wďNDEET‹Ś ' ŕ4YY™äädsíZ~~{ ĽČ”)㎾¦T;bŻÇ’”DHP7cnĎ÷Kżg@·ś;uŽá}‡süčń rq±qś@”"˘¤¤„+—®p#úŁŚâđţĂJµ#1ńII‰\¸p–»wHJJ`ÝşU´j%† f„‘lÝZ1ŁyRŇ]N“”$ĎŘ~ţü’’6¬7II‰ääü·Ś×oKJr ·oŢ&čbI‰IÜľy›ť[vŇŃŁ#i©iÜŠ˝Ĺ¬Éłřö›o+Č=JyDŔénŢ×· áÔ±S|ůů—ś=y–“ţ'•jGff†Â7’’‰ŠŠŕСżčŐ«ŃŃ× ˛pá\&O[A.;;‹€€Ó\»@TTʉ¸˙6üĘňĺĎ?W&……„…óÄOC8{ň,Ăűç¤˙IrsrůáŰčßµą’âN(üâÖÍ[ÜľÁ  ŹdDßJµC"‘<ńŤ§~zźŹŮ¶M^ôvýúŐxzş>#{ţüN#“ɸwď.wď&ĐŁG[ďĐŁG[ĘĘ*7”AřPČí¸Ű^ TřÄŽÍ;čĐĽéiéÄÝcćg3Yľ`y9QŠ€ÓÄÝ řr0Ńע™=e6‹ćÉKOŤ6ž †÷NŠ0ĄRíČČH':úááOÇŽ÷Ń«Wbb˘HN~Pa ů‡|"22Ź!7oưxń<||Fŕď~ýşzĄRm(((ŕjĐU’“*ý˝ŢeeĄ¬]ű#:4 8ř2ăĆ g×®mouÝ*=Áęß«+şşň•;ĽZ¸?ÓfÎ7sHLH¤Wż^™żzUâ]2ţLĆŚBHH ĐŃŃĄOźŠ× еuł׮…±`ÁÔÔÔ8yŇźĚĚ ‚‚.2zôĚĚĚ‘Ječč(wizŐw«Ôc§Ť ??ź‘cG*^ďŇŁ őT,Ú,J1vČX 8řçAŠ‹Š9}â4……ś?sW·gż¤+›Ý»·ÓŁG[ţţűqq±$&ŢaҤéŠ×[¶lŤ‡GËgäşvm…•Umvďţ©TĘß$>>Žţý‡př°ŮŮĘ]í=}ü4ÝŰvgĎŽ=ÄÇĹ}-š1>cĐŐ“.¸5 S×gs}Ü_^/ńÄ‘äćärîÔ9îŢąKfF&:ş:těŇQ™fAĎžXż~5ńńq2pŕ0¬¬äIgëÔ±Ą_żÁĎČÍśůʉľŚPřŕŕË”——Ѹ±;wîÜbÖ¬ůJµ#EBßÎ}ůnńwÄÇĹsîô9ş~Ôgůť°ˇ‘!ŁĆŹzFnŢD†Gr+ö·boMJr şşşÜ»{3ĄÚQ^^΀Ý™7ońńqřű˘eË64o.÷ @ŔäÉ3ź‘۲ŗcÇóčQ aaÁÜąs›Ű·o˘Żo€H”½{w‘Ur<ď©c§čѶ{wě%>.žë‘×;Q^nŔµ‘ës}bDߎ9F^ngOťĄŽm:÷xZZ-)1‰6íŰź—OQaĺćÍŠŚ §WŻlذ–řř8BB4h8µjÉ}ÂƦ.}űzFnút?~Ä•+—HII&8ř2ššZôď?TѦoßAŘŘü÷ÄŞo‚𡾝űâ»ĘW)ď÷¶hiŐ`„©Šż[·nŹ»{ó·ľîź¦aşĎtš{6ç“O?A đúUôŢ ßż†6m:››ŽŽ.Ü{iűâbą·k׉˘˘Bttt;v"yyąôčчíŰ7!>Ͷr3ăÎ]8—ŹÇ|L~^>ZZZ“_<,.STTDłͨç\Cf͛źUë¨Ył&q±qĹbFŤQî]úřń“™?1EE…€ÚkÉdffŕââĘÔ©3QSScÁ‚ÄĹÝ ]»NDF†qň¤?-Z´Ş\Ĺ˙‡ŢzóŰÖß(+-Cüš5.332qtr¤Y‹fčéë1mö4Nţ}[;[444?c>vn¨dÍ+ҢE+¶lŮD"ˇM›gKP<ŹĚĚ lmëҧĎtttřä“OŃÖ®IPĐEÔŐ5pqQ~!q[vúíD 5Zµ}˝ĎBfF&őÔ§˙ţhhj`S׆´Çi<Ľ˙1>cčÔâŮ AeŁ©©ÉźECCOĎÖŻ%“™™™™9G̬ČhŢÜ}}ćÍ›ţŠ+Ľú ěĂŻ›Ą´´ô?űDÓćMŃŐÓeúśéŻćPYxzz±eËn$ %%˙Ĺ'ěčŐ«żÂ'tttČČHŻdm_Ś­ť-?üúĺ.đżWTé,€zöuŃ|R3ÎĐ@ëZ'é¤>JeăÚŤäd+·üŹ““ FFňşh_=‹řř›čëëăčč¤hSŻž3şşOkA9;»ŕäTź•+qôčAââbůć›9?~„+bkk‡««rËÔµŻ‹…Ąü˙şć‡5^¤FŤ4p{ZĆÖÎccĹߦf¦tíŮ•Őß­f‹ď2Ň3đĺĂĽEó>w:Ý{u§GźJµĂĘŞ¶"–gĎžß9tčOÔÔÔhҤ™˘M­ZÖXZV Čś0a*6¬eĺĘ%Čd2† 鉑‘1ěĺţý$úôyöޞ2153ĹŢŃ@ŔŮ“gٸv# 5T$N415Á¦nĹŤŃFă·ÇŹożţ–â˘b¦ŽźJ]űşčéëqăú ú î§T;ôő prrA]]ťë×#Yşôkśśę+|BOOGGç r#FŚćüů3,Zô%YY™,Y2ź(Ž?ÂÂ…Ë”j@ í¸6rECCQŠiźN*ú„––V4|×#ŻóŐĚŻ E¬_łžkˇ×ř¨ďGěÝą—±Ç*ŐŽ|ASS ±XĚС˝|˘–˘Ýżý w襤$óĺ—ÓHLĽĂ{Ů»w'kÖüŔďżoběŘ‰Šşž•…™ąöŽö¨ Ô8}ü4}âŤ˙ĺfĎúÄź1üµű/–}łŚââb&ŹťĚăGŹ161ĆÖNţ]1zÂhě;@{ďöŻżő6<ő‰¨¨ľýVžÓKîňŐ8ąO8U1b4çÎťbѢ/ÉÎÎbńâůܸq]]=ęŐ{ş»ŕč脾~ĺO µµµ>QU4jÔTń·µum,,Ţ®ż?čZ„ŁĆŤ¤ygď Ďç§=¦†Ě -íĘ/.\™”f!ŐÎEÇDąŰďqi)…Â" ÍěT­Ę[“•};;U«ńÖd%¤`bˇü-ÜwMVúMLęŐQµoMVŇLL«ZŤ·&űń ë™+5Č˝2¨C^ź˛˘BJÓ¤čWm?”J%Üżqü?×"|îôR&“ńPřŞś»˘ü5—«©¦šjŞ©¦šjŢ5/L4zűNŐţ&F†ÔPS#ďN}”äçSNU;?NyY2ÍrÄEŻ·G˙ľ"‹)Í/AMZyÉî”EiqŢ3ź·ŞHiA6y$¨ZŤ·¦´0‡<áëĹٽϔćç‘'ůú#ü”rÔÔŞvźTŹ!ŻŹ¸¬ qYyŐ§d˛wh´COZ{6{ŢKU†M;ţD*ÓĦNĹ­Ž¬4!:2u´µ_žwę}§ 0©¶6&Ę v×”—–#ą‡ąYŐ¶@”-ĆşNW7|ĎßŔÚâčŹôR¬ëTý­NQYÖ¦Uż?ReĹXÔvA ¨ÚU>¤1D˘]C“Ę‹++)ʧ(-ăŞýů•J%d¦Ć˙gąF ĺ引BĘ"ŕR0^žîčÔ¬IŔ劋KčÔ®•"†,))‰ŔŔ@h×®ťŠµQj*±qqtóöćQj*g.\ –…Ý;w~©ÜăôtNť;‡…™uíŞ$m_L^^çÎťcŕŔäççsčĐ!ôőő8pŕ«…ŕŕ`ĚĚĚ°Ż«Ú ŐR©”=ű÷óÉđáHĄRvýőjŔčŻ>ݸkß>¤2Ť\]iÖ¤Iĺ+ű üüüčŮł'şşş8p€ÂÂB „žžŢKĺ>L^^ýű÷ÇĐĐPIÚľ“gĎҬI,-,8uîŹÓÓéŢą3µ^2éűÇ?ĚÍĚčůřH`` ÖÖÖ8::ÄÝ»wiÓ¦ őęŐ{©\pp0 xyyáěěüŇ¶Ę *&u€ĆnnDÇÄpýćMšşąŃ¤QŁ—ĘĹÜĽITLŚJýĂĎĎŹ^˝zˇŁŁźźEEE 2„°0¬,,8těyůů|6ně]·JçřßDŁšÜşs—©ž&ő>|8+W®dٲe888(Uż-;wňÝęŐš`njŠ“űôQĽŢŻgOvîÝË'C‡ŇĘĂ€ «Wٶk#‡%áî]´´´035eŘŔäćĺ!‘J156~Ń[V ~~~Ě™3 ŚŤŤ±¶¶fěرŠ×»téÂĺË—quueđ`ybȇ2kÖ,|||¸wďęęęXZZr÷î]222psSľÓť˝pqS¦`]«úú0}Ň$Ĺë^žž…BJJJ“+€n2cŇ$„"2™ k++ôőôđ=šŮ püĚĄÚÁ§ź~Ц¦&úúúáăăŁX©rss{’úŕ:Ë–=M[0lŘ0ú÷ďŹX,¦   ¤R)‰‰‰ś9s[[ĺ®&&&%1mΧĄˇŻ§‡©‰ ĂT|ůŰÖ©Ł˝=ŽeĂęŐ ąĎfΤY“&›™‘–žŽ™‰ĽôGfV!ˇˇL›8Q©vddd0gÎ"""Đ××Ç‚Ź>úy9###Ľ˝˝ůţűďńóóSČÍ›73337nĚ˝{÷022ÂÄÄ333ĹŞ»2‹Ĺ,X±‚#ÇŹŁŻ§‡u­Z´iŮ’–Íĺ ăFŽäÓiÓ8˙÷ß ąďWݦ°¨nŢŢÄÝľŤžžúzzŚ2„=ű÷SXTąÉ9A~ó0~üř >1qâDĹJUŁFŤPSS#66–oż}Zá`čС 8ňňr ±°°ŔÍÍŤ=ž¦)))ÁČȉD‚ô ‹ţľ. wď2uölŇ22>1|Đ ¬kÉÓdÔµ±ÁŢÖ–ĂÇŽ±ţ—_rgĚŔĂÝ3SSŇ22031Áˇn]†öZ=`PßľÔµQNÍ×ôôtfĎžMXXRŢďm©ˇĄĹÔ ·őňâNRLţôÓ7ľn•ž`ý›đ(üO°`ÎŤ ä4bÄ  ˝V.ZDŹ.]011Qäců‡©łgÓ¤Q#|ţ5Yů-MMLLLäŹĆĆ\ ÇĂÝM R=R’öOůꫯ2dFFFÔ¬YńnĺĘ•”••±dÉ’gäÔŐŐ177G]] Îť;GVV±±±„„„(Iű§L›8‘q#G˘§«űĚ6ÁŽ={¸Ććµkź+[ËÂ555,-,¸yű6jîîDĹÄ(Cő 2„éÓ§cjjú̶ŢÉ“'ůăŹ?ŘĽy3úúĎ%˙§?ţytqqÁÉɉďż˙^Yę+hݲ% ćÎŦvmLţçĆ!ňúuŻ\ɦ5k°˛|6NÄÄŘ---ŚŤŚĐŇŇ"(${;;ęX[+K}vvvüôÓO8;;cfV±b„H$bÔ¨Qlذ''§gd ©Ył&†††HĄR„B!#FŚ **JYę+ĐŇÔdÓš54mÔč™í'‰DB›nÝX˙Ë/ĎÝňÓŐŐEďÉŹľž}?úYS¦ ®®ś«aÆ)|ÂŔ b®§ăÇŹł{÷n6oŢüÜ-ó˙ő UŇÖË‹sćPÇÚc#Ł Ż]‹Žfé?°qőjj˝Ä'ţyT%|ýő×*ŐáMŮ´};±qq¬űé§·şŽzÇŽ—ÔŔÂÔ555.‡Đ§‡7ĹĹ%ďHŐĘ%7/źfMÜ().!7?źűS((,äŃătÜÝÝ)— ČÎÎ&,,L~G)-GšŻľř[’ť“C‹ćÍ162b˙áĂŘŮÚ˘««‹¦†-=<¸÷ŕąąąDDEaS»6úúX›STTDhDv¶¶.]˘®­-~GŹŇŔŮ™}úRdÔ¨YůesrssquuĹÚÚšS§Nˇ­­M­Zµ())ˇS§NŔÁ^˙»Ż™˘L\=jAab ®ŽŐ›|đ*™—Ž«×ż?ţ㯙‡«ťŰ_?ř/GvÎC˝ZĽÎ"ü—ŕuá߇Z]ĆíKŻFh4#3‡3#ĐÔ`ˇŃĚěÜę6á5^ă5^ă5^ă5ţ?Ĺ3'X2ąś–>OÇ Ô$Ô±˛ÄPPŠPxżŇu…¤ ćÖ ‘¸2Šd5»’¦VhTJ‰şfŻj¤ňGO˝o5Ňâ"„äT·/ ©T\;úCR€°¬F'| •ŁĘŻ’#B}˘vŤ!ĄHd˘*űŚ2e Şb%2UÍݬW,4ęÝŘÂ"ÉKTÝ8~ę­ý±v˙S:j®Áë:R˙"”–”@™ ëZP‹P%’?ýľŐ@¨äj¬«_éeˇĘSŐŽţP*±¶«ůýQŞ+·š_‹đőň÷Q›jćg'üĎíž»,*--{)ôڬö<Á¸‘obddČ®ýG)-+ŁW·Î(UÚŇ+'Źť$.&+k+ĆţglµÚ+“Iąví*÷ďÇńî»3‰ŚĽÂĺËç133gâÄ©›?˙L?:úçÎťÄÔÔśI“Ţ©ÖôOĄRIĚ­ţ8ňóĎ'1>‘};÷allĚä÷&?•Áóg”––˛yĂfšű6'0°ú*h4’’âٰa5ß}·šüü<ÖŻ˙€iÓfakk÷ÂösćĚ aCOüýhßľ“>L~.RSR [Ƈó?ÄŔŔ€ «7PVZưŃĂhěÝřąí$E~^ó3*•ŠAo ˘©OS=Zý422Ň ßĚС#qvveÓ¦ő(r‚»Řţąí˛˛2Řż …cccfĚřXŹV?Ťśěě>@@Pľ~ľl ŰŠD"Á§ą˝ú÷zn»RU)żmúM›€áíEżAýôhőÓxô(ź'ŽŕŕŕHŹ}رc+"Ń#lmí9ňĹß§»vm#//—zőę1r¤ţôîĘQΉŹ|„@ `Ăę ”––2üíáxz=_CR$áâą‹ ÄŚž0šSÇOq÷ÎÝjC„Ât¶oß̰aŁprr~Ě ]»†Đîąíär9ׯGrűö Ţ˙C23…ěÜąŤ~ýŇ´iÍŹ}•P«ËŹżĎÖ­żđŐWËÉÎÎ",lĽűî˙X€ąF/%22sřýŘ)dr9R©Ś¦ŢŤËś8}A÷Ś™™† `Ë/[ČËÍÓ«}ź|ň!ß}·”/żüŚO?ý[·®Á±c MŢOr˛¶ÖX\Ŕ˘Eóřę«Ď9|x?÷îŲpáÔj5mÚpâÄâăő'>°ňŰ•|·ô;fMťĹŞe«8űÇYbnŰkŰ.@Kä€v\»zŤ¨(r_.ü’ĺ_/'l]ůyůĽ;^«9ľ9śŁż%>î/=đ2ضíWľűn)ŁGfűöÍěŰ·„„xÂÂÖ Đ®]'>|Ŕ‰Gtíľűî Ö®]Á˛eKŃh4Ś9Ý»·} źuĐ«ýEó1ařvoŰÍúדš’ĘÖ°­H‹ĄŃşmk$ {wěŐµűuĂŻ,˙j9_~ö%r™ś“g¶.ڏŘ8Ćüg %Š˝úqëV4}4ť3&ł{÷6–.ýˇ0ťÝ»ĂÉÉÉB.—áíÝccc6oިkwôčď|őŐB>˙|"QK—~B^^Ó§Ď&#C©©™^ýČHĎ`ę©|ňá'ě޶›™Sg’“•á}‡HJHBĄRáVß 'g'~Zţ“®]TD ˙o!ź|ř YY¬[µŽ};÷±qőFÜÜÝXőÝłĺBŞ JĄ’QŁńÍ7‹Ř˝{ŁF ˘  ź“'ŹrëV4¶¶¶4kÖ‚Żż^¤k—ššÂś93;w&ÉɉěÝ»;¶0}ú¦N}Ź>ŠJUµµFO9Áâů‹?|<»·ífĂę ¤¦¤˛ĺç-Ȥ˛ NJŘ»ł‚›Öobů×Ëůrá—ČĺrŢ˙Ďű$%$qůüeÎť>Ŕśsxcđ¬]±–‡V©7nDńńÇď1cĆŘ˝{_~ůBa»wo#77™L†·w3ŚŚŚŘĽůg]»Ă‡đŐW Y´HˉŋçsýzŃŃ‘>Ľ€ĚL!űöí ##˝J}HOKçť±ď°fůš*˙¬WµZM||śî{¦°PLPP’’8sćźëÖčý _ĚLµçŕNŽö››q?1…˘˘bŚŤµ®ąŐwăÓŹ?emŘZÜÜÝäę/¶$2ň ~~Ľ˙ţǨŐe899SR˘äŇĄsZű:’ššhP©”ÄĆŢáÚµ«ěŢ}”ĽĽś4é]<< V«9qâ0ýű"$¤-[¶ĆŰ»Ťkăq˝zőçîÝJüرc+66ő2ĺ}4 ÁÁÝŃh4¬\ąž VSVVő§!éÓuśhčŃŇŇR\Ü\*sÂĘ’čkŃ•ţŻ?|őGĎĄ¤¤Dˉ9аQCâďĹsćŹ3Un÷źˇĺÄď¬Ył‰–-} ęDÆŘŘhż§ěíčŘ1¬¬ŚJ}°ví ,XŚ»{LLL0a*ööqüřaÚcgWő22Ňb-'ްR/ź÷˛022&4´B\¶iSlll8pŔ™ěźó°Fď`=‰”Ôt"®ßÂÚĘŞ’NŨŁů3quwŐ Ń˙ŚáĂߦaC.\8ĂŁGů•îíŢ˝MG’ňI“‘‘vbššLTTŹĺqáÂöíŰIaˇ@@I‰ţ5Ęż5Ż&^DED‘ţ°ň čŹ#žšŽ±‰1ňÇ˙{ŚŚŚČÎĚćÜésČä2Ž>FqQ1wďÜ%.6ލ«Qz÷Ł˙Ařř´äîݧv##Żpűv4VVÖWÄ š™™!püř!4 ěfĎžěŢ޵µ5ĹĹEúvN];Ř>aş[×oUşw/öçOž§®M]Š‹*ľ„ÍĚĚ(rćŹ3Čĺrţ8ú*• O/OZ´jÁ‰Ă'ôí>>-čŢ˝‰„Ë—/Tş'¦±˙.lmí*ýŹÍĚĚHЏxń,"Q—.ť'//‡'ÓąsW¬¬ôăäěÄ a004ŕäŃ“•îŠ Ů´~NOő‡´Xʵ+×ČÎĚćfÔM’“’)))ÁŃɱҳú‚‘‘1cĆL˘^=;ŘSéžZ­fĹŠopqq}Ş?är9·n]çÁdâăă‹‹!??Ź#Ćbaˇ ¤Î!ť h@zZ:7Ł+‹´ĆĹÄqţô 8qâ ą‚?ŽüńÔĶüCCC˝ÄŹ5oŢŠnÝzRTTÄ•+ç+ÝKOČďżď~.'.]:‡X,ââĹsäĺUo&˝ł‹3˝ßč]­6üS\ľ|»wc°°°¬´¸ű_Qă…FťíńnÜG;RÓ3ن ŕVLľ~ľřuę@nv.I Ixxz (+Ĺk˝d€8;»ŇĽyK,,,ÉËËÁÝ˝!vvö4něMŁFŤ±łs 2ň2={öŁK—n¸»7ŔŮŮ•””$BBz`ll‚L&#(¨‘‘— éA÷î˝(UÉŃ•`l^uu±ĘaďhŹO lęŮPđ¨;;hÔ¸M}šâčâȵ+×hĺ׊7‡kóëÔ­C›€6Üąy‡Î!ť©S·ůôÜźŔ4kŢŚî˝»ccSU‘ 3 ›ż°âĺacSŹ&M|ptt˘¨¨ Kťńđđ¤eËÖ¸şşu'¦LyO×®wď\˝z‘öí;ăěěBF†ńă'“““M˝z¶L™ň>Č9ŰT˝VÖVx7őĆ­ľŇb)·ún¸×w§ĄoK\Ý]‰żŹÓ>¦StíĘ­ë·hÚĽ)^MĽČÎʦ˙ ţ[šŁ.S3mÖ4LÍL‘H0·¬ú•®™™ąŽ …‚’Ť5ĆŮŮź–¸¸¸‘››Hô3>ÂŇR+Ňű÷ďâääB›6ţäççâęꆉ‰)˝{÷×M°ä˛<Ěm«^ ÓČŘĎĆž4ńiB©Ş‘HDSź¦Ř;ŘÓ´ySś]ťQ©T$ŢOdÖÜYÔłŐîFtéLjJ*&¦&t錨@Dý†őéŮ·'÷bď1{ţllíl‘‹ 1·¨:­˘r‚Ç\đEŁŃ™™AË–­uĽqrrĆŇŇš‹|üń§89iË·´oß™śśld2)˝zőG"‘`ff†—W®^˝Č¬Ysqs«ŹBú3[KÁ+·ÝÚÚďf޸ą»Q\\Ś– ÜiáŰWwWîÇÝÇČĐw?xWlj}{p3ę&ÍZ4Łq“ĆdgeăĺíE=Űzx7ń¦~ĂúZŢDßbäŘ‘´nŰĄTZecąą9Ť7ÁĂĂóśh…‹‹99ŮĹ"Ţ˙INôäŢ˝Xśť]iÝş-yyą¸ąąëĆOOmq''g||Zbmm]Ąc±±1ž^ž4něA™T©yŐóđea``€‡‡'-Z´ÂĹĹ•¨¨«¸»7`„)ZŇÜÄ×BŁĺX˝q+c&ľŤh÷J×%ą9Ż3@ţE(-)A*”Q·dncëáQÝfĽ4 3°ul^ÝfĽ4 ňîbëUłł— Rbk§żŁŰŞ‚('ş^5?‹đőň÷Q›˛ScŽĽˇŃk7î°÷ŕ 4šš«]‘”ň1ýŘkĽĆkĽĆkĽĆkĽĆ+Ç3'X-šyضfݮߏąŔ…°rÜ“J"A€µjV%”Jc#˛Ş­î^ŐP—Ş(• Pë?ŢäUŁT.}ę}«‰(-.@Alu›ńŇ(•ŠQő›QX(•HP”Ő†ţQ’!¨ńBٵi QaP…cH©RŞX‚BUłOÄţéfÓ3'X–ć5ţđčÉóLśč‰“{e  ÚTGŞÖÔ",ÓÔŠZ„e˘Ě§Ţ·š2ą 'ÇúŐmĆKŁ,ŹÚŃĘśjA-BŤFŤŁ›çëZ„˙Ľ®Eř÷ˇV—‘•ýŕnWŁ—g.\eę¬O+ť‰†ý¶›uaáşßżůć–,Y´iÓ(*ҶדČĚÎćË~`Ú‡ę®eçä0pÔ(˘oÝzAKŘĽ};s?˙ś©3g’™ť]Ő¦ľEEEüôÓO ü—íe2&L`ßľ}Uić_˘L­fóöíuŻÓÓh4Ľ÷ŃGlřő׿lß.4”VŻćrDDZů÷°wď^BBBČ~âÝXşt)‹-za»””&OžĚ|ŔˇC‡ŞŘʿƉӧ8r$7ďÜŃ]űeëVŢ™őbŚŚ¬,V¬]Ë‚%KřŢ{/|V¸técĆŚáČ‘ =µŁGŹ2`Ŕ€¶“JĄL›6ŤŻľúę/űN¸uçÓ?úź·l©¸C@HČ_¶ý`Ţ<~X˝š÷>ţ¸Z2¸÷ěŮC×®]ÉͭȦ[˛d K–,ya»””>ůä>űě3ľýö[–,Y»ďľKaaa•Úü,?uŠ#Fp+¶bsăćÍĽ;{ö ŰĺäĺńíĘ•L~˙}Nť;Ç1cŇööżJ•а­[éҧBŞˇ´´”wfÍâ×đđ´|1jôËżMKŇ3˛P•–pěÔdrEĄBĎS§NĄoßľ$&&ę]?Ş÷! =š±ďĽĂ1cHMKŁ©—‰ÉÉ”••±iŰ6ňňó)–jS¦§3hÔ(>ţôS~X˝škŃŃ 7ŽÁýűăçëKbr˛Ţ'ŠS¦LaŕŔtëÖŤ™3grňäI‚‚‚}LxµZÍš5kP*•>^'čřŰoż!“Éxř°Bqúôé|ţůçŚ1±XLpp0áááH$.\Hpp°^ý8}ţ<ţ]»Ô˝;+Ö®eĚ”)´  '7WLJs—.‘š–FBR’®Ý7+V0kŢ P(pööfШQ¬X»Ż6mđöňÂĚÔ”ě­~ ˘¤„#'NTZ^¸r…7ÇŚaä¤I\Žŕ§őëůţ§źŘ¸y3“ĆŽeĂŻżRúř;şŞF÷îÝuś?>Ýşu«Ä‰-[¶ —Ë+qbÚ´i,Z´#FPXXHçÎť)--ĹÍÍŤÔÔT~ţůgFŽÉ™3g*-`Ş'Ďž% $„ŔnÝX±v-cßy‡ödçć"}̉3.&ęĆ€Ż~řŮóç3bâDŇ325i÷ăăiŢ´)ńŹąض-IŞľ ^||E ćHŠĄÔłŃJŰ_ľ|™íŰ·łgĎlll(Čę;¢"ôéĂűS§ę®ť<{V÷óʵk ň÷gĎÁä=žlm»‰„&Mšđý÷ßë®%&&ę~ŢĽy3Íš5ăĘ•+äĺiŐňĹb1wîÜ©´+ÁÖ­[ńöö&**J÷¬ľ “É055%ńĆ Ýµ'¦=Š«‹ ŇŇP(*dJź8ÁďŰ·3űńÎHĘíŰäĺçóö[o±qË–.[ĆW ęÍ…BAYYŃŃŃXXTSjŹ^.]şDQQ–––Ĺb”J%&&&;vŚÓ§Oăé©-ráÂ~űí7:Äś9sđńńáăŹőWbFĄRˇP(8sčNŽGĆĆÚŘ–{ńńDDEáٰ!'NźF*“aiaÁ‰Ó§ůlÎş?ž†˙¬U´ľAţŁG ěŰWo>€vˇTTTĆ đňňböăť…r‘ËÜÜ\ÂÂÂčÚµ+6l@,cccĂ©S§fҤI,[¶ ˇPČŇĄK™2e zőŕQA‹ćĎÇĎ×—ŮÓ§čŢ1µZÍÇź|»“&ńé_—źŹ˝=g/\ Uóć,Y°€Níµ%ŤBŮ˝ż^’ĄžÇ‰ňńáâĹ‹HĄRĚÍ͉D¨T*ŚŤŤ9zô(çĎźÇăqöďĄK—ŚŚ¬r›ź•J…˘¤„3âčP!•RΉ¸ű÷‰şqŹ 8yćL%N,^°€ÎťŘŔĹ+WtŁnť::yŠŞFYY‰„yóćéĺó^Ř?‘Mą÷ŕA¸»ź¨›˙Ńß}Ćýŕâě@wWŠŠŠQ(Jt[ŇłgϦ{÷î\˝zU·Đ'üýü5>wď߯tŻKÇŽ”––˘T*)|Ľ+e[O«‘łqófţűË/Äܽˇ đó–-¬ Ł´¬ »jfđ÷÷ŕ믿ćĚ™Ę Ç››#“Ét[čćććŘÚÚ˛sçN-ZDnn.ożý6m۶ĹŇŇ©TZ-ŰíţŹw›Â~űŤđ=•…›űřŕ`oO‘D˘ë/OOŽť:Ĺ{}„Z­¦ď°aś8}šćÍ#!) /Ďç×5«*řřř`aaÁŃŁGY±bEĄ{4nÜ‚‚¤R©Ž ^^^ś;wŽYłf!‹™0aöööŘŮŮUËş»›NŽŽDßşĹü?‰9:8ŕçëKîŁG”””PR˘-ĺăĺéɵčhţďłĎH ™űůçܸ}›­;w2fÄ˝ű`cc——BˇP7a*‡••]»v%;;›˛˛2Ý÷——111,X°€ŘŘX–/_ÎŮłgqppŕĚ™3xyyéÝCCCü|}Q©Tô6¬Ň=@Ŕ€ľ}ffč8âĺéIRJ źý5—## ß˝›_ĂĂŮŽ«‹ Ť5Şí«?ŁyóćXXXpřđaV­Ş\f¨QŁFxzz"‰ÉdşµrN|đÁ2~üx˛˛˛*µőňňâÂ… Ô©SKËŞM­ď憣Q7n0ńâJ÷śiÓŞyůů(JJ(y|*ăĺéIäőë|üŮg¤gd0gáBÝnLuÁĆƆƍkf d«ćͱ­WIqqĄ±ŕEŤ×ÁffăěhŻS@/–ĘP(ěŘw„‰'âÖČGw4čééI±8WoŠÓÓq´·ÇÜÜś‡éé8ŘŰŁŃh((( ľ{….HšP˝­­nĺ•&"“Ë©ďć†@ ??{{{Ň„BĚÍĚhXżľ^Ü333±˛˛˘Nť:şźÍĚĚ …şÝ€¬¬,,,,t…1ł˛˛(,,ÄŮŮKKKŇŇŇt„ËÎÎĆĚĚ Ks3ÄÂz rĎËĎÇŔŔ;[[Ý϶őę‘”DSooÝsůŹŹ9ííětżç`ok‹˝ťń‰‰4ńň"!) ĐÔË @@¦(WŹŞ/˘*‹µÇ9ÎΕ~NJJ˘aÆşŐ®X,F.—ăââ@aa!YYYÔ­[RRRpwwG(˘T*ńôôÄÄÄ„ĚÄ\TąĹR)"±únnHĄR D"ę»»ë¸bńXQ*“ń¨ €Ź9#“ÉHËČŔÂĚŚőë“.bkkKAA¶¶¶X>ćQf^:®^-«ÜŹ’’222đôôD©Tęx‘™™‰ĄĄĄŽJĄ’ôôtT*ÉÉÉÓ¸qc' b±ggglllČL‰ĂUAîjµšÄ”šzyˇŃhtĽČËĎGđÄ _ŁŃź”Dł'8s˙ńŽvS//‰DhÔj Č{ô»zőp°·';ç!Ž^-Ş$Č]$QRRňŇśHNN¦~ýúČĺr¤R)®®®‘™™Iť:upuu­Ň ÷'9ńäĎ›ćć4pw'M(ÄÎÖV7~4¨ŻMZI ±­WKKË* r/ç„«łCŤ rW«Ő$Ą¤Đ䉅Mn~>†Ôł©ËíK˙łÖs'XYŮy@ÍŐÁZ˙ë&MšD—Đţ•®×¦ Z“E¨§ VUC_¬Ş†ľ&XU }M°Şúš`U5Şr‚ĄOÔ¦1äuáßZ]öŹ&XĎŚÁşyc'Ď×ŕéDb Đ -Uş^"—"VP˝ IDATĐPVVµA—U ąBŠF­Â°†k±”Ş””(ĺHĄŐ›áů* ,‘?őľŐD(•ŠÚŃJEí菒ÚŇ%H%" 5{‚U›ĆµZ…‘QŐĹe)2JJjţ÷»Zóϴž9Á lŰŠNíü_Ę ęĆág(EE±¦rĆ„\#§Lc‡’š˝ú(Ń”ˇŃŁŃT}FHU˘T٤DcJq ď•ćé÷­&B…A-éjI”ÖŠţ(ÁbM15<ô·¶Ť!T!GT9JŤ 5üőJ'X&ĆĆ<*¨+ż˛˛2 ”••ˇ ˘oĹâă×kkÔj5CCCT% L56ŐVGJŁQŁVk044DŁŃč _Zţlą @m¦Áěq|‡ľQnŹ‘‘Q%? ţV­±r_ŚT*Ę eYÚUµÉĎÄËřQ([ţ¬L)¬¶ţ(·§ü=*·­â}yq;¨xeąĹŐÖđ Nk4éÇ“}Wţ¬L–]­ýQţŽčütń˘/j§Ńh*Ţ«GâjíµZ;¸ V«uż˙•ĺĎ–ű!/~„Yťşz­EřO9ˇV«Ńh´ßÓĺ~TçňO8Z^¨ŐjÝsÚżS®¦_őc±ČŐŐúţţ]Ľh,ř§áR5z)qŕČIBŤ#+'©LÎđ‰3ŮľŹk7*ôc–,XÂňŻ—ÓŻk?ňrő+ ™)D$* ;;“ĚĚ ăůčŁ÷2¤7ż˙ľ‡Ţ˝;ö_˛˛2uí˛˛2xđ ą\ŽB!'33ŤWłxń|ěABÂ=˝ú‘›“‹¨@„0MHnN.i,ýt)Í´iä7Żß$Č'°˙†‘_!ß—›ÇäHŠ$”––’ö0 aš>ťű°ĺç-ĎüĽŞBAÁ#D˘RSS((xDAA>«W/ÇÉI›N˙čQ>ŢŢN„…ý—›7ŻëÚ‰Dżnř•FvŤČÎĚFR$!Č'—ýČĄs—tí$EŹ9ńxlHNěťXŢűÓ&L`ęŘ©|»ř[úuíGnÎ?×Dú;ɤdggUâÄŢ˝;đók̵kWËeôď—_~ʱcuížĹ‰””DćÎťI˙ţ!<¸—  ćś={ŞJ}€ NjČFŤRYÂĘ•ßҰˇ6‹?#CŹŹ;aa˙ĺÎť›˙řďÖč Öŕţ=±´Ôn=ŢŽ˝O‹fMĘdXWÔ[ôÍ"ÜÜÝhŐşU%}}`ܸa ŢźµkW˛bĹ7”–Ş0`î~DÄ%şwďEvv–ζ¸¸ţóźŃś9ó۶m"))‘U«–1uę Ű?nYő)ĎObŢó:/>ý‚-·ČŰŢÖÝ?wę}ö%ýa:uëŹĺĺä1´ďP˘"˘ř釟ř|Îç”(JŘůŰNš·l®W~üń;zőęćNăđáýś:uśwßť©»üř!Ţ|s8ÉɉŘŰWhĐôěٸ¸X–,ůµZÍěŮďpěŘA ÂǰµŐďęlĎö=t čĆű˙yźcʱcËĆOŹĄ•6…üꥫu˘P\•µ•®Ýřaă9ć<ËľXFˇ¸Ą –rőâUĐŔŔˇé7¸ź^ý¸rĺť;·aÚ´ ;v5kV0dČ\\´  ÷qrrĆÄÄŁ'b çĎźĹŢ˝ŰůńÇď ÓXłf9……bFŚ‹PÎüů‹ź÷‘U‚Ô”T‚šńÎŘw8vđ_|ú=űö¤Ił&äçĺŁ+p«ďF©Ş"nçÇďdÝŞuüĽćgîĹŢcű–í\˝tU»KQZ¦×ťĐŠ~~ŢLž<šcÇ2{ö4ڵ넿;@;‹ŹŹĂĎĎÉb•{ölgéŇOří·0®]»Â‰‡9|řůůą4męĂ­[Ńş]ŻŞÂ®m»čXÁ‰ť[w2aꝬ•‹Whß©=b±¸'ĆËĹłY¶tE…E,^°{{{Bű„ęžąqí#ÇŽ$?7źBqŐJË\ştžÎť[ë8±víJ†‰łł–÷ďÇáě슱qeNĚť;“}űvňÓOß“‘‘ÎęŐß#‘3xđpÝ3Ą~ý†Uj9R’Rhע ç|®—Ď{Y2yrE?ţ8 AĂxđ ;;űüwk´Đč“pwuâÍ7z‘•˞ߏăč ôľűâ;Ôejľ\ţ%¦¦¦Hdú-*}śđđ_Y¸đ+˝úáčÇ/ŰŃĄź? O/OĆMGrB2aëÂh ő#!‰Đ&L™Ŕ†ß6°ó·ťšp=ň:Çăë_ëÓ <=˝Řľýw,,žÖrrrf̉˛lŮRúöŐ–™IJJ`ČkK}ń…V7"â2%% üüôçŔcŘŮ۱iç&lęŮ0zÂčJ÷¬¬¬5~müŰ00t ă&Ź´ýѱKGĆLŇîTů´ô!SÉÂ˙[Čř)ăéŘMď~˛~ýV=zBĄ{€#Ć0jÔxlm ůč#­°hRR^^MX°@[‚¦]»NôîÝźÜÜl˝h`řůóó¶ź12~zX+çDÂý6­ß„6Ć8)!‰!ş>ůyŰĎz±őEhÜŘ›íŰ>sCŔŮŮ…1c&bddÄňĺ_ӧʶjARRÇżMçÎ!|ůĺr®\ąřÔßĐěííůâűĄ ß*ŻmÚřÓ®]'vîÜĘŢ˝;9óź 0×č,ЦČ%lŢľźë7cđkĄ»pďAJKKůeí/EúŐö˛´´ÂĹE›^=fĚnŢĽŽˇˇ‘n0ąq#Š+ľĹĘĘZ·˛hĐŔ+++>ýôcVŻţččkŚ7ŚőëbÁ‚ŮШ‘~ĹŰĚ-Ěq«ŻőcÎĚ99pÝJ059•ďżü±HL«ÖÚ˙}]›ş4kŢŚo—|ËüŮóÉĘ̢GűLű`ă&ŹŁ™O3Z¶Öo ˝©©™î˙ĽjŐ26lř €:u´»nb±oľYLlěm:wîŞkÚ›˙ţw%&Ś@­VÓşµ'"Qß~»„[·˘u_jú‚‰‰ ®î®ł;|7‹ć.ŔşŽ5i±”Uß®âŇůKwŻ(Ó­g7Â7‡3aÄ Ĺ…ô îGť:u044$%1źú•022ÂŃŃ K®\ąŔ”)Ú‰†ĄĄ†††( 6lXÍ‘#żR±ŁĘ‘#ż3a„Â4&OÍŐ«—ذá'ţď˙>Ń« ŤŃ°ł·Ă¦ž ©)©ôŃJĂ[cllLii)żmúŤđÍátëY1i îĚĄó—8b"÷bď±pÎBţ8ú-|[°ő—­tëĄ˙ –ŤM=Q*•´iŁŐ255ĂÔÔ€˝{wňß˙®$4´·®MçÎ]‰Ť˝Í¤I#‰¸Ěúő?ńÓOßóÉ'rîÜ)şv ýËXˇ—E9'ŚŚŤŘůŰN?ŢĹ|’+ż]Éĺ —éŇ­‹®]÷^ÝŮöë6&ŽHQa}:÷!=-cccĚ-´šSÝzvcÇÖxzybkWµ"ĎFFF89ą`aaÁĄKçxçť±ŔÓś8zô ]»>ɉ>|€‰G‘‘ΤIŁŚĽ‚ˇˇa%qT ËżŚť{000ŔÎÁNw˘QSP§NňňrY¶l ‰‰ń´oßé˙˝/4ú<¬Ţ¸•1ßĆ?´{Ąë’ÜL5.ŐäţŞ  6+ĢTÝ_%JKJ eÔµ÷¨nS^˘ŰŘ>.ąQ“Q­ŁţŹp_5 ňîbëĺţ×ţËQň[;ßę6ăĄ!ĘI ®—ŢŹ>_5^Ź!J™”’\5Öőj6Őę2Ü9ڱ±˘?křjůşżŻ˙H„¦+aUGőö×xŤ×xŤ×xŤ×¨}»źČĺkĎxŻ÷śťşgN°Î_şFdôíWgY5ŔŘČfT.î¬HPjJ126{NËš•R†ĆHŽJ.«nS^ eĄĄ(‹•đuFţMPČŠžzßj"Ĺ… RŞŰŚ—†˘XLaFu[ńňPH )Tׂţ@¦=ĹdU^Ź!ĄJ%Ą ęŇőÔ5AméŇţ™÷źWĐü™¬ŕNtíÜîŐYW řeë.4cę»VŽ+)Čͨ%e Q›9PÇÖáŻţCUR‚Xőűš}Ô )RŕęÚ¬şÍxidJcq­ ýˇ‘âęZ J)îáZű?ú@v™G—¦µ TNíCĘĚě©[…ĺÖ˛bddc[Żfżżju‰â˙}‘óĚ –@ ¨1BŁqńIx5j€‰‰ qńI(•*|š6F™ ČËË'11š4i‚@ @€@o™-†¸°af&-}|r÷Ţ=ęÖ©CËć/Žy)’Hą{kkk|[´Đú!(ŚÓ?är9qqqřűű#—Ëąq㦦¦ü˝ ®¤¤$¬¬¬°«gŁóĄ: V«‰Š˘c»vh4®DF‚@@§v˝Ŕ¸‰FŁÁÝÍŤ†őëWkDEEáëë‹©©)ׯ_§¤¤ĚĚ^ĽŇŽŽŽFˇPжm[ĚÍÍ«µ?îÜ˝KĂúő©[§1wďR$‘вysę>@}Ęůü‰#Ő× ŘŘŘŕččHBByyyx{{ăčřâ-))‰śś7nŚłłsµ÷ÇĂôt ¨ďćFZz:éÔww×~Ň32HKOŠúě“'9…R©$ @´˙<äćć"‹iҤ yyy$$$`ooOÓ¦M«e ąs÷. PÇÚš;wď"ůś(,*"-=ťV-Zp÷Ţ=\]\¨gcŁ—1¤â3ţý»–eeeDݸAűŔ@ĘĘĘŠÂŔŔ€AAZűźłKő"ÔčhĂGN2ýŁĎÉ/sńjażí&=#‹'ÎI·lŮ‚T*eÄ<|řPŻöť8}š»w9sáś9Ăő[·żx1łćÍŕťŮł‰˝wŹý‡#̬=uîá»w“ť›Kn^'ĎžeߡCdĺä0{Ţ<"˘˘ôęÇĄK—‰‰áСC\ľ|™›7oňĹ_0bÄ-ZÄÉ“'9sć qqqşv„‡‡“śśŚT*ĺŔ\˝z•±cÇrđŕÁg~^UáVL 1wď˛cď^nĹÄpçî]V¬YCp?­ţÓşM›ŘĽc×oެô?Žą{—đÝ»ą Ŕö={ą{—w?üCC˝í&&&ríÚ5öíŰGLL ‘‘‘lܸ‘ž={’››Ëďż˙Î×_MBB'OžÔµKII!<<ś«WŻpđŕAvíÚĹ’%KHNNćřńăző#3;[ÇŤržěÜ·ŹÁŁFqçî]˘nÜ`ćÜądçć˛÷‰w%'/ŹđÝ»9yö,§Ďź''7cccvíßĎęŤőęGaaˇŽĺ<9věŁGŹćĉ…B† †L&ă×_Őµ“JĄ„‡‡ëxÉ•+W8p b±7ŢxCŻ~”••é¸QΓˑ‘Lž9“Íáᔕ•ѡW/ŚŚŚřiýúJmĂ÷ě!|÷nÔj5±qqÜŽŤĄsź> ĐĄO”ĘŞ="JHH¨Ä‰k×®±aĂzôčA~~>ŕŰoż%>>ľ'’““+qâ÷ßçÚµkĚž=›ĄK—0lŘ0˛˛˛ô2†ddeqöâĹJcÇŽ˝{8j1qqD^żÎ¬yóČĘÉa˙ˇCşv9ąą„ďŢÍ©sç-'˘oÝâÓ/ľ`úG°÷ŕA†ŚCÔŤUęh9qřđabbbŞüł^J”JľűńGz ŔŹë׳sď^"®_©˙WŤž`=)4*.”“űqaľ-+ŽifÍšĹńăÇ™4innú­H˙ů×_3îÝwIMK#ůÁěíě2`€î~fV±÷îѸQ#\śť¸ÉŇeËhÖ¤ §ÎťC*“‘’šĘ„ŃŁ¨Őjlô\ţcőęŐ 4„„ŇÓÓL0ˇÂŹĚL©[·.MšhĹÓŇŇ3f ;v •JĹýű÷‰DDFFҲĄ~%věÝKČo{ď9ąą<*(`ć»ďVř‘•EşPJ©ÄżMÝő={Ň-8CÇŹk{÷ČÉËcřŕÁ,_ł†„¤$˝úqúôiBCCąpá999ddd0eʬ¬´˛ůůů…B=zDÇŽuí——‘‘‘ĹbČĘĘB(’››[éY}ŕNl,ý‡g÷ääĺńŕáCF ‚«‹  Ý•ff’š–F×ÎťuíţóŢ{šš’š–FšPȇ¸:;s;6–˙›1CŻ~dee1dČÖ¬YCNN ôíŰ—fÍ´ßC%%%dddCŹ=tíćÎťKnn.2™ŚŘŘX„B!R©”zőęE ôę‡JĄbÔţĂÂŻľ"'/ŹŘ¸8:µkG;˙Šş´™YY\ąvŤ~˝zé®}˙ăŹD߼‰••QQäćç““›K“ĆŤązíYYĎŤQyU8uꡡˇ\ĽxQlj©S§ę$ ňňň …СC]»ФI"""(,,$>>///úôéSásf&ľľľČd2 E•úq;&†~o˝ĹŢÉÉË#5-Ť‘C‡âúx|(çÄĂôt‚;UČLś>sssR>$=#”ÔTlęÖeřă ŔĐiXż~•Ú_ŽŚŚ Ţ|óM~ůĺ˝|ŢËÂÔÄ„÷&OÖýž™•Ejz:m|gđţ]¸=Áú3<=ęSϦ.+ÖnŇ]{űí· dĆŚzŃ˙ř3Ö._Τ1cč׫ŽöO+Âľ5x0ë6mâŇăTąđe3ooşt耓}zô M(¤Oh(ĆĆƤ őHýĺ—_ňŃGLŁFŤžşß»wo._ľĚ¶mŰíŃ›JĄÂĂĂ>}ú`iiɰaĂX·nť6Ť56V·jÔ'>ž1/>ý”¶­[ë¶ÍźD‡  ŠŠ‹ůę‡tפ2N 8@ŔŘ‘#)))ˇeóć´iŐŠÓçĎëÓFŹÍĘ•+ ¨4`”ŁE‹ŘÚÚňńÇyR©{{{ €……oľů&ÖÖÖ4kÖ fĎž­OîŘ‘Ť?ţH‡Ŕ@zu{Z÷©ľ›~ľľL~˙}Ý5©LF=z‡†bgkKŻîÝqqv&úÖ-ęX[ăÝXż:qžžž„‡‡Ě›oľůÔýşuë2xđ`†Ş»&•J©S§ÝşuĂÝÝťŽ;âââBjj*S¦L!""Bź.Úćŕöí„víĘŘ‘#źş/řŕÝwéţÄBQ*“aiiIÇ  Ľ7Ć·E ü|}YýÝw|ôţűU®UŽ1cưbĹ üýýźÉ‰–-[bccĂś9s*l̉bnnÎСCu •ęBHçÎlXµŠöô yę~wwZ·lÉ”™U(Ę9Ń'4Űző芳““­~^^^¬\ą˛ZmxtéЬěl–Ż^ đŹN* CBBŐ«cŠŁ]=§/\e@źîČĺU;SU¸źLçö¸:;r?!qˇ„ޡ]HĎČÂĎĎŹ¸ ŽŽÖ®(Ő*Ś1¨Tf ŞG§öíq°·gŃ7ßŕéቱ1"±ÝşaýxĹW>x›››cme҉Ľ~]W¨t]X&&&ěÚż;[[Ţ<##4FFš?­€ýŞ‘€ŹŹŤ5bőęŐŕââBRRĆŢŢž‹/bjjĘرc©S§&&&Ĺb˘ŁŁIOOÇËË‹yóć±bĹ :tč€D"!88ĆžŤP‰±´¨zM™‡éé8:8вysvíŰGZz:-||ŚŽfĚđḹ¸pöâEdr9SĆŹÇî±>ŚFŁávl,Q7nĐ­KĆ˝óهgűž=HĄR&ʇ˝=…k›ŞO:ČÎÎĆČČöíŰsćĚÎź?O‡ŽŽćŤ7Ţ aÆDGGSPPŔŰoż­Ű 111áúőëDDDĐĄKćÎťËoĽArr2ůůůŚ9$ąX[Vý.©H,¦°¨Đ®]‰‰‹csx8=BB˝wŹAAx5nLň32ÔŻ>M›PÇĘŠ«×®q9"‚ö¬Z»g''Nś>ÍôÉ“u«}‰¬ë* ŕ-‡\.'%%…A‘••ĹâĹ‹4h‰‰‰4iŇ„ćÍ›óčŃ# %0P[ĂÓÁÁ‹/ráÂصkjµâăă ˇ}űöHDyX[Ľ8ÖćU@­VuăŁßz‹ŇŇR&NźÎŰÇ“&bog‡o‹¨ŐjnÇĆŇ. €n]´‚ťĺĽ9ů2ľ-ZpéęUî'&rĺÚ5nÜľM@›6„víŠTV„Ą­c•Äü”s˘]»vś>}š‹/Ňľ}{®_żÎ€đđđŕúőë:NÔĽ“SΉČČH:wîĚś9sčÔ©rąµZM§Nťt1Ť^^^ôďßź2•˘ĘĆ‘XL‘DBh׮܎ŤeëÎť:~tj×/OO’RRff2ř NX[Yq5*Š+‘‘´ dĹš5¸ąhKsóňčŞ%Ť»ź??\ťťQŞJĐafţę'”2™ŚĐŻoTŇbĚő0N˝,ĘĘʸyç#‡ĹĹɉł—.ˇT©p±“Ćręř)î% AC÷^ÝńińâÁ@ŁŃpöäYśśťhÚÔKOV?ŰŽ˛˛26lř‰éÓgy…ččH4 lOPĐÓ™HObíÚ•€†¶m^Şâú«€Z­fËĎ[:j(‡BΞÔjD5mŢ”ĐޡĎm§ŃhضiE…EŚ?Šz¶őôeň3ˇV«Ůż:tF­Vsđŕ^\\ÜxóÍáĎm—••Áţý»prrfčĐQz±÷yĐh4ś[P«Ől޸™·FżEZjçNť Y‹ftďŐýąí4 ÷ăî#LŇłoOâăâ9}â4^MĽčŮO˙cZ­fßľťtęLii)‡íŔŐŐťÁßzn;ŤFCf¦ČČ+ 2µZ͡Cűđó  A=Y_3 Ńh())aË–ŤLť:+W.pëV4 tčĐ™6mÚ˙ű.˛ţu ^!;ÍŞő›iĐOŹúxzÔgţ’ď±­W‘uăÚ ˝5ˇ}†Ň¤Yě¬Ěőfßš5Ëqrrˇ°PLI‰__?öďßERR ăÍ7‡“””ŔLŐ  …śÍ›F&“Ü[[;Ž?Ś»{}ÚµëÄâĹ pqqĄ­żxĂ ÇÄÔ„Ô”TÜÜÝpq#5˘ IDATuáŇůKěݱ—±“ĆŇŁOüü=x´n0/U•˛}ËvD"Í[6' ]kW®eÁâüľçwÖ,_ĂŰßÖëëرHĄRnŢŚ˘K— ç0}úlÚµëH``{zöěPirµgĎvrsłqppbذQ,Xđ!ˇˇ˝Ř·o7ţ†‡‡~e".Gp/Ô”T:véHaa!Ňb) ç,¤gßžř´ôÁ§Ą†OŔŮŐY×îô‰ÓÜ˝s›z6Ś?Š߬ŔĘĘŠ›×o2çł9D_‹¦Gź/řäW‹řř{ś:u ĄRI«V­IM}€ťť=K–,`ÝşÍtčĐ…éÓgłpá˙UŞĽy3ŠłgOaaaÉřńSří·˙ÇŢy‡Eu|oüłÔé˝(bDÄÖX°bŹ5ŁQcŤŃDK4&1&1&–(¶¨ŃÄě±Ĺ.ņ"é HÝƲí÷Çę*AÍ7Ć]?ßçńńrďśÝ9wî»3wćĚ{ÖŇ®]ăĆMáóĎg!‰ ć@^nkV¬ÁŮĹďZŢ\şp‰ŕ¦Á|1ű ĆNË ˙AŚ›2ŽŐËVséÂ%Ý+-5Ť­żlĹÔÔ”QďŹâŕŢÍ…Ěš>‹UW1rđHb“b ć‡Bˇ`ÎśŹ jŚŁŁ#ÇŽ&<Ľ? ÎŁe˶4kʸqS8th+W.Ő °Š‹‹X±B»̉\Ľ¨Ý=tč›Ü˝+ÁĂĂŠ¬,ý¶ÉąSç¸uă©·RiŐ¶ĄĄĄJEĚž>›®=»â菠?#úŹŔ˝ş»ÎîčÁŁ\»z ;;†Ś·_~KŰömY·r S·N ̶}ŰŘs µęÖÂÍ^;:Ż_OâčŃ?ôŤHOOĂŢŢyófµ‰VŚ7…O?ýĹcËn/ĆqüřQŞUłâí·ßeÆ5ÔŻŔŢ˝»HH¸D߾طďwćĎ˙”ŻżţAď¬Ü{ą¬[ąŽ:µĽčÚ¶×߼d(ĺüôÓ,Z4źŃŁ'вe[š6 ˇ{÷7hŮR»[ÖČřźĎĽVéąÚđîaTł|´“#ţâ$)íZ=JsÖ-Ś9Óçđĺâ/ń®ímĐúíÚµ•]»¶Ň AAAMđ÷¤gĎŠ9?ü°ţý‡ŕᡝB=>–ččíŚń.rą[‚‚Ó«W_”Jjµ++ĂNM9x„UKWŃ4¤)őęáSχÁoWś!X·r-۶¤žżV\1';‡…óňî¸w››Ň2„¤«ZĄw˙ĎN ¤ÄĆžeÁ‚Ů´nÝoďÚx{×fô芢”Ű·oÁۻ͚=Jęůî»C3f–žµ6mÚáĺU‹)S>ćË/çđëŻ ęGŇŐ$Ě^@˝€zxŐňÂÇχšŐŁ­ĐÇŹG&“ѵ×#ÁÄ)c¦Đ»_oŞ{U§ĽĽśfˇÍZąqý›Ţڵµaź«ĚĚt-ú[ĽĽjDź>qs{´ŁôÚµ+\ĽĎđá#uçfÍšNÓ¦!4jÔ‰DL``#ěííIIIćĚ™DFŽyŇ×é ĹEĹ,ůz b‘ŻZ^4 mJX×0|ëůęĘäŢËeÓşM|0ăѬĎ×óżĆĂÓť;PXXo=_Ş×¬ŽµŤ5ד®ăâjŘťW*•Š+ľçĆŤdĽĽjŃşu;BBZҤIs]µZÍ'źLĺË/ëÎýôÓh4ú÷L^^^^Ţx{×bҤé¬Zµ•JĄ÷ş_»zŤłŕßŔ_lj·G˝­řóđź”ËËéÚă'&˝7‰7ĽIőŹ8Ô8]ž>ĂĄOdd¤±hŃ|ěěěńňŞEAôí;7·G«W¸|ůÆEčÎ}úé4š7oAÆÁĹb6lDýú 4ĂŐ«W_ŞW7Ěîŕ˘Â"–,\B~Ţ}|ßż…™™9#GŽ­pî·ß6âççOpđ˙–ţíI¨Ň¬żâäŮxš7nĹc[)‡÷NäHÚwŞ,bhLž<ť–HĄâJ?4÷îÝĺÖ­´jŐ¶’ťJĄB*• R©HÄ;v/ŻZp˙~ľˇŞŻĂčńŁiÖ™T¦C}‘HÄŮ“géÜ˝s%;ŤZX$F­Q#*qĺňr˛rHJL"ţśaSţ I·n˝‘ËËË宩Őj~˙}}ű>y)Ş´´ŤFCii gĎž$;; ??nŢL1DŐ+ [Żn :###Ęž Y·÷~Ú…µÓ ‡X$F­Vëţ÷­ç‹˘–6Ĺ @ăĆÍ9r,ÖÖ6Hž°ó÷řń#ăčXY¤W"‘ T*‘Jµ˙ź>†ŕŕ¦F$&^& ččí7ĄGŹ7ѨĘŃČ1µĐ˙’§Z­¦ž=\\]¸w+k+\\]0šÓ,´R‰‰DBßA}u6VÖVxV÷ä䱓řÖ÷ĹŃÉ‘SÇN1rěHšµh†“łot|WWgĄ „–vńĂŰ»65jÔ$99…BAŤ5Ńh4´iÓŤFĂŤÉ•Ţd7nΡCűđô¬AÝşľěÝ»‹ČȱÄÄśŚ˙!fffČĘr±°ÓżŤWwW|ü|Hż“NŢ˝<|ęů V« i‚ąĐśëI×1¬B˘ç&Í›đçá?©fUŤŔ @Ž>Fx˙pÄ"1……Ľ˙ÁűŘŘÚ +aQM˙‚©Ť;;{ČĎĎĺúő$ˇŃ¨ jŚ­­))Iôď?[ŰG÷µI“Îś9R© yóÄĹťĹÍÍÜÜ»ôí;{{mĐ®LšŹ…ţ:5 Bˇ¦ˇM‹Ĺś;}ŽfˇÍ´×úľ¸şą’’”BĎ>=qu{tß$¤ qç⸟wź7:ľAbB"N4oŃśł1Ś™4†5k +*ÁÂR˙Áúµ|Z·~µZÍţýŃ´nÝŤFŤ—W-ĽĽĽIII",¬+5k>ĘćФI—/_ŕöí›tîÜť;wR‘JĹ…üńÇ>FŽ‹ź_}Ę$…Şé%ńŻFŁÁÍĂí'róđń{ŚćZN ŹŽąđŃo˙CNXY[Ń ¨Ç# 0ˇPł«3őüëѤyŽ9N÷đî´hÓ…LŞ·>DË 4"//—””dP«µś°±±%%%‰†TâÄéÓÇQ©T4kÖ‚ŘŘ3¸»{bkkʵµ5AAŤío`AŘŰ; TČôÖ‡h4,,,nÜ•Dą…ţyř" hŐŞ-*•Šôô4FŚĐ¦ĎŃh4H ď`fútqŮ˙wBŁĂ"†Ň¤cĹ©^Q^î+±¤ěÚE(É’bű ě",,JŔÁŰűeWă_Łđf6.†_Â}Ń(Ěż†CÝŞ˝{  05dž/»˙Eą7°­[őwľîCţw”K%ČóÔXż»soÁĘęÉŠô˙Hhôfj:ŹśÔk…őŤ;é†Ď×÷ŻńŻńŻńŻOŮEh!4'Ľ»ávéő}ë`!0Fš•Wá|ą¨ 2”Ż€HśĆTŇ*.ŕ¦TP.*AŞţďË‚ü2qĄç­*B!.DJňˮƿ†BR„4«jó@!!U˝ íQ€,[Ł—\„†Ä«Ő‡ ×>DY.G!– UvgFó|qyO`U÷p«ňK„gă.âëß÷ę>ÎżJy¤^™\„ŞW#ˇ¦JĎ[U„FV†»Ë+ĐůŞWŁ=ʸ;Výö¸§QŕâY÷u.Â˙^ç"üߡV«—ţóěUZ+ůĆm¶GäýQĂŘĽm7´oŞ“µßĽy3éééLž<ůĄŐ ¸¤„?ŽĺĆíŰĚš6Ť‡ń"`ĘرŘŘ<=đČń㜎‰Ť†ÉăĆaň[N&“qüřq8Ŕ?üŔůóçٵkŤ†É“'ăâňl2•——łpáBZ´hÁm /@řjµšsqq,ŤŠbËš5¤gfňăĘ•h€ÉcÇRĂóŮ v‡Ľű.M iŇ„VˇˇĎ,«o\¸pĺË—łpáBÔj5‹/F 0`Ŕ‚źj—źźĎ÷ßk5ŚÂĂĂiŢĽůSˉÉɬٰŃx¸ą±xůr@‹ćÍéÜáé[çłďŢeë®]Äb ó?ůÄp•~n޼ɦM›čر#Í›7×µGőęŐ6lŘSíär9ß˙=ŢyçĂUú ČČĘbŰďżSËË‹>˝ziŰăAú”qăžiűĂO?ˇT©Đh4[V8ţ<Ë—/ç›oľAˇPčžóAѨQ٧ÚĺççłgϤR)ăÇŹgË–-¤ĄĄiý2ĹPŐ×!1)‰Ő7262Wľ_ľZ…„Đ©ýÓwÇ—ŠD:vګ׮ńŮĚ™$Ą¤°nÓ&† DPŞźýEB©Rq&&†µ7ňóO?q+5•Uë×kű´qăpwuçŘśQĄçjhĄĘĘäÜIË$ĺćJĹbâ.\Ń•ń÷÷§Oź>DGGS\lŘYą‘&0yĆ &}ôŁ&Näʵkäćĺqâôi˘@ĄVsěäI˛îŢ /?ź±|ŔĚyóXży3—Ż\á˝É“ńpw§Q` 'Ďś!=óźKö˙|úé§Lž<™2{ölţřăÄb1ű÷ďŕČ‘#qéŇ%’“µK‰„ &°`ÁľüňKrsséÝ»7«WŻćüů󤦦ÔŹeQQLž16Ýş±bÍÖoŢŚFŁaŰďżp.>žô¬,ŇŇÓ‰=^g7yĆ /[ƤŹ?F­VÓ˛sg˘6lŕöť;¸»şÚ¬™AýŘąs'ŁFŤ˘cÇŽDEEńĹ_ Řłg2™ŚÄÄD(,,äčŃŁ:»… ňůçź3~üxÄb1ýúőcőęŐ¤ĄĄ1eĘěí «â~..ŽAô:”¨ 8}:ŕŘÉ“Ü/( #+‹ă§NˇT©Ř}ŕ€ÎnĂŻż2ăłĎűÁäćĺ1aÚ4˛sr2nwŇҨĺe­ź‡HKKŁ[·nĽýöŰDEE1`€V* 66–ôôtŠ‹‹Ůµk–––üúëŻ:»Ă‡3qâDFŹMjj*_|ń›7of۶mXYYńË/żÔą\N«Îť™0mQ6ĐşK@ŰÁ'Ą¤ ŃhX»q#n..¬Ů¸Qg—”ÄČ xwâDY·i?­[ÇÔO?eüčŃĚřěłJŇ./;vě`ôčŃtčШ¨(ľúę+»wďÖqâĘ•+pěŘ1ťÝW_}Ĺ‚ tśčŰ·/ŮŮ٤§§«yť={6ýúőcýúődddčŐŹł±±ĽÉ›C†µa“>úŽž8ÁýÂB2˛˛8qć …‚=ęě~ŢĽ™™óći9‘źĎű~ČůK—¸_PŔ±“ÚxjpâĚróôĆpçÎşwďÎěŮłőţ]/ *Ą’ť{öp:&†ěśn¦¦rţŇĄçţĚ*=UĎ·ffÚm“…ĹX[YâíUť´Ś,¬Dű1mÚ4¶lŮ‚»»;…y† ~ż–śLÇ7Ţ`ęřń¨5l¬¬ËĺşÎ"=#.:đç©S””h5g’RRHş~ťĂż˙ŽH,ĆÚĘŠ/fĎĆŃÁWgg–®ZEQq1đô´:/·nÝÂĚĚŚeË–abb‚P($+ëŃ}LOO§~ýú’›› hßwďŢMjj*8::˛zőj8€żż?çĎkŐž ‰Ěěl®$&˛uýz¬,-u¨:?22đöňBĄT’ţŘé’+P’›—‡@ `ÇĆŤX…tëŘ‘ĄQQÜIOgćÔ©ó#//Źřřx¶oߎ««+jµ[[[ĚĚ´1!÷îÝĂŢŢ___îÜąŁłűé§ź8zô(VVV…BV¬XÁţýűŮľ};3fĚ M›6řřnI­¤´”¸ رq#>uęĐŻgO°¶˛´3ľ€†lزEg·nÓ&fMźNPXU«ĆÜ3°ŞVŤ¸ ¸yë?-^ü´ŻÔ ĘĘĘŤŤeçÎť4iŇ„đđp\\\prrŇ]/))ˇyóćDE=ŇŰĽy3mÚ´ˇoßľ™™1nÜ8 ?>ˇˇˇşCAŁŃ{ţ<MžLű¶méŮĄ î®®xzxč®§geѶU+FOš¤łŰ±{7žîîL›8€:ŢŢhwWW–EEDh477—řřx¶mŰöDNÜ˝{üüüt++V¬ŕĉXZZ" ůé§źpppŕęŐ«í3wá;6l nť:(zőÂÁŢ^lj˘âbŚŚŚhŔćmŰtvk7mâł™3 ô÷ÇĘĘŠy3gbee…écKőýü°{Ć*É‹„LB–©S&äűţ-LŚŤiÖ¸±îďôŚ j{{SX\LćĂľî9’=Wé¬ÇabbŚJ­¦ĽĽSÓGUßľ}™8q" …˘Bş Cˇg×®8ŘŰłţ—_ČĚήpÍĚĚ éAĽ‡b|t‹ÎÄİ÷ŕA2˛˛Xży3›¶nĺŇ•+ Ń`b áľÇŃ­[7śťťŮµkWŻ^­pÍĚĚŚ˛˛2T*&mbb‚……—/_fÓ¦M”––˛dÉ„B!III¤¤¤pńâEűŃ©}{Ü]]9vę§bb*ůQ^^ŽĽĽ\÷Ă ŕ`oĎŤŰ·Yľf Ť†ß|ĂĆß~cÁ·ßV*k(„„„P·n]Ř»wo…k¦¦¦¨T*äryE?¸sç«WŻF,łlŮ2”J%ŢŢŢřůůgh7đ­[—ĆAAdegóËÖ­®=ä„L&«ÔYŮŮlüőWróóŮ´u+wŇÓů}ď^şuî\aĐl(8;;Ó®];¤R)Ë—/ŻpÍČČccc$IĄöČÍÍĺ·ß~#55•˝{÷růňĺ'–5LLLčÝ˝;B!_|óMĄë榦ÄâJíQPXČďűöqőÚ5Nť;Çź§Nq1!naa8:8čEűęŻ ĄnÝş\ľ|™}űöU¸fjjŠR©¤¬¬ě©śH$üř㏕V:HKKĂÜÜÓgč ˝(řůřDFVż<6í@@ŁŃ ű«8±á×_ÉËĎgăoż‘öŘ@ňeŔĹĹ…V­^nŽÖç…™™ňňr …î>?Źm•ő©ăŤw O|ęxcgcŤµµoöăŇ•$‚éŢŹ˛˛2 ©QŁ*E¦ab˘˘Ô÷őĄľźźnĐTĂÓWgg‚‚¨îáA§ví((( Ľ{wBšjĺř«{xPß×—R‘ömŰbii‰……-š5#-#îť;Ó*4”r…Ť‰ ćOÖĺx‘¨]»6ş1wwwśťťiҤ µjŐ˘m۶HĄRZ´hA÷îݰ±±ˇM›6äääСClll011ˇC‡4kÖŚf͚ѥK¬­ŞQVZL5KýkĘT÷đ Đ߇KaNŽŽ8:8Ьqc|ęÔ!´iSÔj5>uë2lĐŁ„Ú}zöäVj*íZ·ĆůÁ¬Äţý162˘vÍšŚxë-˘2Övúčtvv&((WWmpŞ­­-®®®áççGPPööö8::©ëzôčAvv6Mš4Áű^W×®]ńôôÄÎÎŽwß}333D…yXWł}Ú׿0ŘŘŘܰ!ŐĚXZZRÝĂzľľřűůá[·.~uë";r$–ĂÚµŁ°¨ź:uhP_›XĽş‡.Î΄µk§Kź%’–bm€M Bˇ°Â=533ĂŰŰ›Zµj@Ť5hŐŞEEELžř[[[DEůX[ęćA č¸đđoź:uđtw'Đß'GGÂ{ôŕvj*Ó'MÂń~ŇĂß. ˇmµY)íí äÖíŰLť0WÄ’Ş9¸čeá_9agg§ăD˝zőhÔH›NÉÉÉ©'˛˛˛hÚ´)5kÖ V­Z¸ąąŃ¨Q#ÜÜÜčŢ˝;999Ś1d’R˝ő!¶8ńpÖ°ÚNÔ÷őĄľŻ/~>>řÔ©‘‘cGŽÄâ!'Ú·§ °ź:uxŚ®..éâI}ëÖĹßĎŹj––ş>DhaőÂýxȉęžî($b, ĐOý[Ó48şµkÓ˘Y3”J%ţőęńVßľh4 sžůŇó˙Nh4""‚6{T8˙*íyevf˝»sŠrđđ®˙˛«ńŻ‘só*.†ŤcŇrň3ń¨[őysR“đp|ö†‹Ş€{ąé¸Ô x˝‹đ?‚×»˙w¨Ő*nÜŚ1BŁ1ç/łsϡçYrüĎ ;ç A©¨¸,¨R)Qj4(•ú şÔ7T*%jĄ˘’U JE9*•ŞĘ·€ZĄŞňíÚ“W˘=ÔŻH{Ľ*üxĐU}€ő*ő!*Ą‘^9˘T*´÷«Šß+µZ…ŕ92ˇMźľµ»*ŕÔąx(¸Wp§Ây™¨ vČ«đčPČĺ¨Ë‹‘¨+'–­JP)•ČËĘQ–VNô[Ő –•TzŢŞ"ÄeeÜ{ÚŁLúŠ´G)÷Jőżd«oHĘ( Ó12@<–>ńŞő!Ruĺ„Ň/ Ęr9 ™ąQŐţ=Q?ˇú§xŞ’{AaŃż®ÔËı“çV§6Önn/ ^ç‘úA)—#K±v¨úKR AQĺç­ B!R˝íˇ˝í!•żíˇT”aíZősľîCţw”K%ČŐŻF.²˘›˙Ř®J?éŃű3(bąy÷IMËdĆg‹řü›ĺúó´®ĚśŹćđĺś/‰x+‚⢗W–™™ÎĚ™0jÔP–.ý–Ył>$"b99Ď–ŹXµęGfÎśBDÄ[dfľÜÝ!ĹEĹ|9÷Kşżˇ hßůŰN&ŹžLÄ ®']˙[{±XĚ žŘ¶yŰß–Ő'T*Ë–}GŁFÚ ŢŘŘ3Ś9AÄÇÇüŤ5×eéŇo‰‰9ŁďŞţ-6¬Ţ@hPîĺÜ#91™AL5‘čŃĎ´»‘|AL3…í›·¨¶OÇ®][éÜą%/Ć‘••ADÄ >ůd*+V<[˛ŕîÝl–/_ĚěŮÓ>ĽŻjűt9x„~]ű±gçJŠKÁWź}ŧ~úL;±HLä[‘,ú|MüČ@µ}:bcĎđÎ;YąňGÔj5o±lŮb"#ßú[ŰŃŁ‡±té·DFľepI€źŁ~&4 ”Ľ{y$]M"bPŢťŔžť{ži—’”Âä÷&3cĘ ć~<—/ç|Iä HŠ^ÂÄĂÎťżŃ©S .]:Off:9ó~úé‡gÚĺäd1kÖ4FŚŔž=;éÖí Ξ­Úy†őňr9K–,"$$€“'Ź1zô0""qéŇůż±~:Şô«w÷0D *µšÔ4­n‘·—'§Ď=ş!sżšK˶-Q”~ 8,,”^˝ÚóŢ{Ă6¬/÷ďçÖ•Ľ<­VÔ©SҤIw¸sç6©©·čŃŁź~ú!K—~Ë… qŚŃźQŁĆÚšĽĽ\d2Ăćí‹|+’nm»Ńł}O¦OśÎ™ăg0dwłµâ¨çNťĂ§žJ…’‹ńZé…˘Â"ş´îÂÂy ™1ewsî†R©důâ帺ą"ëojúI;÷c:wnIăĆ>,Yň5kÖ,gÔ¨ńşk\Ü9ÜÜÜquuăčŃ?tvť:µ`ٲďxçťA¨Őj‚‚jł|ůb!‹ńő­gP?Öţ´–– [ŇÔŻ)Ë/gîGs>r8ĹEŨT*’“162¦®o]ţŘűČŹ‘Gňů¬ĎygĐ;”—Đ˝mwvďŘŤ\.ç> Ü ~9rŔ@oÚ¶ fůňĹŚ5Ś7ßËĺdeeźźGppSöí{4PüěłLťú>ďĽ3¬¬ Ţ}wiiw9r —3fŇÓżT¸qýŢŢtiÝ…ĺ‹—ÓŁ]:véŁR‰”’’Ż$ňF‡7Ř˝c·ÎnÝĘuŚ<’A$'&3{úl¶ţ˛•ěĚlTJŮYŮĎřÖʞ˛2MčÓ§3Ë—/¦QŁş4oŢ’:u|(--AŁŃpôčAzö|“ť;ÓŮ=ú}űv!2ň-bbΰrĺŹüřă79r=ÂŮ˝{‡Ţµ°V/_M« V4ńkÂňĹËůlĆgŚxwE…E¨T*’®&albLź:ü±ď'"E°`ö"EPZRJ×Ö]±¬fIH« î°{ÇnHÂĄîçß׫‡í§aĂZ´iŁĺÄ{ď §Oź€v™™AAÁ}‚›°˙#NĚ™óÓ¦Ť'"bŮŮ™DF&33ť®]{‘—w€ž=űč$uôŤëIשĺX‹¦ď› IDAT1oŹŃűw˝ššńYYÚqDlěY<=˝°µµçÄ ­Xłú9žá*-4*të˘aíZaiiÁé Ęü¶ń7bĎĆňÓĎ?aem…čÁŕĆP4hÆŤÔýý矇uÇK—®%&ć4bńŁ8Şśś,4 źţHfĂíĚBďŢýX»v%YYxyvWFë7ZóÉüGéGn߼­;žűŐ\Ž:ĆţÝűuçDĄ"˛3łůhöŁ·đ#1GX·r5jÖŕběE2Ó «HP«V]:«űűq…éń㧲wď.věŘ‚ťÝŁióřřţřă ￯}IHH%33=ú°}ű/,]ú-łga8'W7W¶DoAh!Ôť{Č…ľoőĹÚÖşÂŕ >&žY fá]Ű€ý'÷óۦß8zč(Ë/ÇŢў鳦Ě[[;~˙ýŽşsý mÍŚs9uęx›řř¦OźE۶ÚÔ9«Wo &ć 2™”V­Ţ0LĺP(dí–µxÖđdÜmZ‡~xŐôbĺĆ•\ŠŻ¨OűNí©Mť3ďëyädĺ°hţ"Ţő6í›== Šľ řúëńńńcܸ)şs ÝĆ~čĐY._®řCÓ¦!Ěś9€ĐP­öQ—.=ILĽ˘K[¦o¸şą˛9z3BaeNôŇ[;[î=XÁ&>&žĎ~†—·v öŕéě^ěěěŽ>Š˝ýŁß ‡őiٲ Ó§ĎćÔ©?+ŘÄÇÇ0sćg´nÝ€µkµÂĽgĎžŞđ†ôKh!dÖ‚Şˇäţ×{3eĘÇ8°›-[6ŕí]ëą?·JĎ`=ŽÔ´LŽźŽEˇPP·vMÝů…óR«n-öýľŹŇŇR×ËĎĎ€÷ߏŕęŐË®íŘń+·nÝŔÉÉggí€ÉŮY»evńâŻXąň.1~üHÖ®]Á7ß,@©TâęęnX'??ć2źĂW¸vřŔa.ťż„P(ÔuŢ–Ő,qquaőňŐĚť1—Ü{ąôďŢźŽ]:R? >&¦&íű+üü´2 QQKٸqM…k±±g9yň …’€€@Ýů€€†üöŰ&ĆŤ‹@­VÓˇCs.]ŠgĆŚÉ\ąr™€€†ő f­š-„ěŮą‡EóU¸–śĚţčý”——Đ0@w> a{ßËř‘ă)).aHřť ¬\.)íáââŠ#ńńç:őý ײ˛2Řşőäň˛ ÷8  !ţyI“F“••ÁŚĺüůXÖ­[É;ďŚ2´ XY[áYĂ“ĚôL†öZáZIq kW¬E&“UjʏsqL3…äÄdľž˙5ÇĂÍĂŤÝ;vW(k(ăăă‡Bˇ C‡ ×Ôj5?ü°©Tú—öäÚµ«L›6ž3lذšŐ«—łté·Ĺ"ę×0HÜ•wmo„B!ŃŰŁůfAE‘Ô¤«Iěßłźrů8±k/FN ´¤”·zżENVŤľ Ř˝{{¬môwĺâ↽˝±±gůđĂŠśČĚLg۶'sâرCLš4šěěL&O~Ź‹ăő^×gÁÚÚĎęUS~çěŮ“ś9sŤFM˝zĎĎĂ*ŻUR*ÂĘŞĆFF”–ŠQkÔX[Y±bí/ ‹Jíŕ`ť«ť˝Ň‚ű P,))ĆҲ¦¦¦şcŤFCY™ [ŠrJKK155ĹĆćŃ.ˇŇŇ ĹABR©KËj”––`bb‚­­ťAÜEĄ"ĚĚÍ077G$afj†‰© Ą%ĄŘ;ŘŁR©(.Ҧp°wx”ĎN,#—Ë©fĄ˝Ë?Ľfbj‚‰@€$KŠ­“·ŢýJ%,,,uÇBˇ……8::ˇŃh(,Ô. 8::=f'E&“baaĄe5 îăŕŕ¨+ëŕŕ@  °(oýűQ&+C©RbeeEYYJ…+k+Š ‹°±µÁŘآÂ"Ôj5vöv:Ety™±XŚąąy…ň˘R*•JW¶đf6.ţz÷ŁĽĽ\Ç…ÇŹ˙ĘĄR‰ŤŤ­n¨P(*pˇ´´ d2Bˇ…N °0˙uő\«RމDŘŮۡR©•jŹĹ"1¦¦¦ Íu\°˛˛Â\¨Uš˙+orB©Pęx# )LMÇÁQ˙ř‡Ď˙ă\pttB*•,-µĽ‘ÉdXXXbiůHŞ @»tćŕŕř „A*đ¦(÷¶uőä^Źakk‹‘±Ń9QVV†D,©Ä ĄB‰BˇŔĘÚJÇ3s3¬­­ĺĺę­y~NhűSlmmuśxŘŘÚÚÚľĺ!Gôه(•JÄ"1–ć¦ČóŞF»Z­¦¸¸GÝó/€jµŠĽ[G©VíÉÚg˙H @"•j9ň‡‰±1eT獍Ť0Ʋ˛2Ý ęńßĐxřP˙őřa`jjVˇ#Ç[ŹŰ>©¬!đř[›µőŁă‡÷ÖŘŘG'ÇJvVÖVXY[U*˙đhw ––Őžxüđľ ‚'ŢcKËŠťÉĂ2/«=_ …đŕĎÇď{sˇą®sĽŚť˝]Ą˛†€™™™Ž Ź?Ť7ajjZáŢ?ä‹©©áSË›ëńŁăÇźýżráaŮÇyŁ».¤RYCŕńç˙ńăżňćńżâńöxś+Źë8ńŘńßqB(VXR|ü7í!WţĘ}âů9aöDNüµü_ű}ÁÄÄ;{;ĘĄ†Ťłý7022Ň…*<©/xa:X§ĎťçčÉsUZhT$–b"IAA…ór±µ¦EyŐÖĺP”‰P+$‹oĐÔ ĺ29’RĂĆĆé ™´ŇóVˇ(“ĽíQ&y5ÚC&}%ÚŁĽLŚ´ĐřĄĆ7˝ĽîCţw(ĺe(dŚŚ ~đ"ˇyŽ<„đ”Vhł`Z·höŻ*ô˛±=úFS,*ć†+‘ŞjÔ›=ß űŻ@ŞRŁ6łĂʢŠë`—Sj’…CoĄ‰eĄç­*BiRôj´‡±É+ŇĄŻD{¨MÔŘ ťŞĽÖ«Ô‡¨Ěl±¶¨Ľúđ˘ GB™É}l«ř˝R«U<Ď\ÜX&&ĆUBh´L.G"‘ann†U5KŠŠKµkě¶Ö\»~“ć-ZŁPR˘]ʶµµE*.Áü%ć‘*,*˘\ˇŔÁÎ PT\Ś™©©.ńÓP^^Náce•*js!B$I~JJJÉdŘÚjăîßżŹ±±1ÎÎ˙[‡VRR˘ŤO±¨†©©ŮKk‘XŚD*ĹŞZ5ŞYZ’›ź€›ËßďŇĚÍËC6!«µ•&2ł—ÖR©”ŇŇRÝsžźźŹJĄÂŮŮYoň4ÜżĄR‰““&&&ĽĽö——WŕÄă|yV˘Ő‡üt¶&¦/Ż=”J%÷ďßÇÄÄ''§ |y ÷ixXÖĆĆKKK­/©=4 ąůů@›°Y,Fü€/VŐžťŔW,‘ –HńĂÄ ˇĄ•ÁRĺüNČd2ĘË˱µµE&“QRR‚P(ÄÎÎÎŕ}\.§¨¤s33ěíěţgN€–b‰D׿cii‰ą™J••ąąŢ9˘2U‰ĽŤ"‘‰L†µ•–Úç^ ŔŐٵZĄ ;ú'¨Ň2 «7lĹÝŐ…čý‡1¸/ŃűŽŕá悇űŁÎń«ŻľÂŐŐ• 6°k×.Ě ëÚőëŘÚŘ –HP©Th4–EEaog‡T*E^^Žł“'ÎśaĹwßáď§Ý©—ś’B©XL=Ś2łł9yö,Ĺ%%:z”ďżúŠÚµjĚŹ[·n! )(( Z5m ţ˘E‹¨_ż>'Nś E‹¤ĄĄ‘––ĆŚ3h۶-©©©äççS»vmlllHJJ"88ëׯˇý÷öů‘™•…ŔČ»÷îáćŞÝ­9÷Ë/iߦ ßüř#3>ř€íŃѨÔj†öďOżp­.TvNYwďâéćFuOOâ.\ŔĂÝť–ť:ńĹś9úűÔŔpI…sss‘JĄáââ‚Bˇ`ĺʕԮ]›¨¨(>úč#Ö®]KŤ5đőőeęÔ©äçç“ššŠ““uęÔ!!!üü|ľůćBBBđ÷÷gĐ A󣸤„{yy¨T*-OÄbţ8v …BÁžđŢ{,]µŠÖˇˇ”Düřő×”ŠD$߸µ•ţ~~\żqâ/^äŘÉ“—”°íçź ć‡L&ăĆŤT«VMÇ“””‰ŹŹgäČ‘|ýő× 2„ŁGʞgŹVčR.—sůňeĚÍÍiÔ¨©©©”——3lŘ0"""ŽŽćСCóC­VsáňeÜ\]äÜ˝‹ĽĽśŃŃdde1dŔ>űę+>ţŕľúî;®ž;§łŤ»p ĐĽqcrîÝC­VÓű­·ř`üx-YÂ…'ôZ÷'qbĹŠřřř°rĺJ>ţřcÖ®]‹§§'ţţţL™˘• xČ gggj×®ÍĺË—Ńh4|óÍ7±qăF† B›6mŘşu+;wîD¨Ç^ł¸¤„ÜĽ<”J%¶¶¶%>ŚZ­&zß>&Žò¨(Z4oŽD"aÉÂ…Ŕ#NŘXYQßĎŹä”4ŔŠ5k¸|ĺ §dÇîÝĚüě3~\´Î:čĎ ´ś¸yó&–BSĚţűĂ yy9SfΤeH«ÖŻgld$;†T*%rřpzvéĚóÄLUéąÚńن#–HmLI‰{[ü¸}'CWćłĎ>٬¬ŚöíŰcggŘ`Ţ‘ăÇÓgčP¶GGłeűvLLLóńǤgfŇ˝sg““ k׍FCţ}í.ś‹ Ś™2…ôŚ ¶îÚEVNżîŘÁČH|ęÔAŁŃüí[ˋƧź~JçÎťY»v-űöíăŢ˝{|űí·$''3`ŔiѢÎÎÎÜąŁÍýv÷î]ÂĂĂ)**"** ‘HÄĘ•+‘JĄDGGÓŔ€’‡X¶z5­»tańňĺś:wŽř‹‰úáÎ_ľĚ;C†śL`@ ę×'19YgעS'ĺĺ|·|9jµšď–-ăl\ýÂĂ9yö¬ÁăŕvíÚE‹-X°`gĎžĺŹ?ţ૯ľ˘  €nÝş‘——‡››!!!$&&ęěúőëGFF«Wݦ¸¸Ő«WsůňeÄb1tďŢÝ ~ÄÄÇÚ±#3çÍăl\Ű˙ťIcĆŕäčH`@ĆĆĆŃáŤ7HLJŇŮŤ˙đCâÎźgëÎťdde±ő÷ß‘Ędtjߞ۩©|:mšAýHOO'44”É“'söěYÖ¬YĂŔiŐŞxzzr˙ţ}z÷î]ˇ=,X@tt4 11‘C‡qíÚ5ĚÍÍÉĎĎÇĘʰîĺĺĺ„těȨ‰9ÇâeËhÓ˘‘Æ!++Łip0×®_gpż~ř±făFV¬]Ë™ÎĆĹĎ™Ô ĆĆĆ$Ą¤<×Ű˙?ÁŽ;*pâđáĂ|ýő×äççÓ˝{wîÝ»‡‡‡G%NôéÓ‡¬¬,˘˘˘())aőęŐxxxеkW]™ÄÄDzöěIaa!"‘HŻ~śŤŤ%4,ŚOćĎ×r":š)ăĆá`gGP` ccc:´m[ˇ Ć}đń/ňŰÎťdfgłu×.Ô*ß|SW¦_ďŢÔ¬aó;wîĘüůó ň}˙ćff¬řî;._ąÂđAHLN&80ßşuINIyîĎýď-źŻ˘fu† g˙á'ż!Mť:•ęŐ«3oŢ[M·°°€ÓŘŰ;ТEŐöé¸|á29Y95Âł†' ptv¤zŤ˙ŤHW/_ĹÖÎwĂî†ü+RR’ą}űľľő©[×—7®#đńńű[Űö Ń¨©SÇ?ż—; ÉHĎ ńr"5jÖ °Q ™™Ń0řď“?r©DJŰŽm . đWÜżźG\Ü9ť iIAA>·nÝ $¤Ő3íňřOpD"–pâč ,«YŇ.¬R‰”¸sq´ k÷·¶W/_%3=“A đň~ą±pjµš÷ čÖ­7Ť†öĐ˝{ďżµ˝uë7n$ż4~d¤eđ'Ň3).*&°ŃßďřÍÎĚ&??źFŤ‘ť•MÂ…—ׇäçç''š7oÁýűůÜľ}“–k[XX@JJ2-Z´ .îµjŐÁŮąjÇDéÉɉܹs›ző¨]».ׯ_ĂĚĚŚÚµ}žű3ŤŰµk7×ŢĆG{GOžŁW×Č$Pţ/c÷ŁřÖńfćĽođŞáÁĆß~çÚő›´oJÜĹ+4 nČńS1Ô¨ĎwĆÖ- K3SL°ĆŘD˙É;wíÚŠD"ćŇĄó$%]E$‘pđăŹßđá‡ă i‰—WMťÝž=;9~ü0îîH$bŽ;ÄÍ›)8::±pá|jÖ¬…»› 9¦Řräŕ 9ůçIrďĺRx_{\łVM&Ľ;ę^Ő™ůÁLś]ś zôăőç‘?9´÷VÖV…B¶ţ˛UŰ&GŹóéÔO±¶±¦aŁ@Ą „–ú×(‹Ť=Ă˝{wŮ·/•JÉÝ»ŮěŰM۶čÜąˇˇ­™;÷cD˘RZ·~Cgwţ|,{öěDŁŃŕéYťU«–˘Ńh7oďáää‚……˛˛\,  µ–t5‰äkÉś~>Č EXTÓ˙ĚOFF:§O')é b±‹µŔ·_|ËŘIcuv˘RëW®çzŇu7äÄѤ§¦3fÄHÄ[Śz˛˘,,ő˙"˘T*YłfJĄ’{÷rŘ·/ĄRAAA§N'5őqqg?>’Ź?žSÁvĺĘąp!–ĆŤ›qńbÂÎÎŽŤ×°{÷~$q“ťťĹ–-ëÉÉÉÂĎĎź={v"•°rĺŹlÝú ÆE˛{÷¦M›@PPcjŐŞR!Ó[RXXČ”–âj…ţyřoP^.gÆŐ4kÖ‚>}:ܔٳ?B©TÚ ŤF¤0ő™”‰T@^ań޶LCßžťŮ˛c/c"†Ú´-šW*3EX¶ě;¦Oź€R©D©TP˝z š5kÁîÝŰůâ‹Ĺôé3ŹŠ»Nź>ΊKčŢ=śŘŘs¨Ő”J%Ą¨¨•J…““a—=6ŻßĚčaŁQ*”(•J¬m¬ ďβbý Âş†áWżâŚOFZFN`ĐđAÄž‰EŁŃ P(¸›}—;·îŕßŔđo´ěaŔ€(ĺ¨TÚMcÇNâăŹ'±eK4!!-iÚ4¤’]§N-ŚK\ÜYÔjµÎľoßAĚś9…ŘŘ'kÓč 1gb>śěT*J•’÷"XúíRć|1‡vaíhß©}%»=Ö-ڬŚ,JŠKP(EbŇÓŇązů*ő »ňĆŤdFŽĚůóqZ?”Júö}‹÷ŢŹ^˝úŢż’Ý{ď Ç×·>jµŠ¬¬ ”J%ffć.^ŚgěŘÉő#?/źń‘ăŮłsŹÖ…’NÝ:qűĆmjÖ¬Éŕ9¬’ÝÇ“?ĆÂŇ777’“µ~›áěę̱CÇđń{ţ7ççR©dÚ´ń¬Ző#*•J+<Ň @@QQŁGŹâ˝]¸půůą4jÔ„řřÔj5jµŠ7ŢčŔ죨¨Pďu?wúoő~‹{9÷P©T¨T*"ÇDňâřlágĽŃńŤ'r˘÷ţtîљڴ JKJQ”+đ­çKÇ®ueJŠJ¨^Ł:ĺĺĺ(J˝úqýz‘‘oqńbĽŽýűćŔhúôHĎž}čÝ»_%»ŃهQŻ^JĄ’ěěL”J%nnĽůć㲠ý¨QĂ0}`Ţ˝<ŢŹxź}żď7öÍť IDATČ÷ý[™™1†ąs?făĆ´lŮ–ŕŕ&Ę<ĎŇv•ť6ű+÷ëE«Đ&O-98’á‘Ăéńfʧ–Ń'.\Błf-HLĽBZZ*_|1›őë·áččôL;[[;üüęcmmM˝zţ$''ҶmGÖ®]IVV^ž†ťâť9o&ý÷çfĘMäerĆľ3–ź·ýLŤšĎV¶°° °Q fćf5â÷íżŁQkHJLB©T2ěíÁň@‹ ¦2nÜ22Ň5]»¶ćçź·ăç÷ôÁ…ć"u“&Zý«¦MC¸{7WW7š7oA\Ü9şvíőT{}`Ŕ|4ű#rďĺ"KÚg(?śH‡.OײzčG`Ł@ĚÍÍiÜ„‹ řÖóĹ«¦ f-`őćŐôZ¶lËçźCqq666Lź>ĆŤ›ňÎ;ď=Őćˇ~~ţX[ŰŕçW[>€««;^^ކsŕĽk{łdŐd2ć˙ÇŢyT]˙˙Áeď%({‚ B@ÁQ¦&·8˛4ËĚťiŮG­4qáÖĚ­•{Ź2Q@†‚ě}áŢËÜ{`”9úfr>˙bĽďsx˝Ď}ť÷ëśó<úú¬\¶±HĚâďžÎd­V«¸y¸ajfŠžľ 2ďg2*dď<Ô6ôôôŮĽywMÓÉţý»8uę(›7ďxb3Ęv888=lW V«8ńc‚řę«ŮŃ}ĐđAĚ\0“üÜ|Äb1Cú aú¬éO ¬ţŞ»¶¶6ŢľŢčéëáí덾Aíg7ž…ví:°xńň‡>aÎŚSdÔ¨§Ęüa‡—WSLLLk|ăeÂÝĂť/ż]€¬ŕŐo`ެ”Đ·og¶oߏ‡ÇSĘCžăäµN§SÉĺÜNJÁÝŐ…˘ ]=]šy5ŞIć•"•J‰˝K#ŻFTJŤĄł˛2 ÂĘʚ͛×bllByy9ąąŮäććŕéŮ”ěě´lPs*eiiEqq!QQ››#hóŰo°¶®ÇŻżîĂÉÉ…>} -Pk,E—›‡gOť9´ç …ˇPHiI)w“îâíëM~^>Ť<Ő\† †×o P(ptvdýŹë™óŐ‚@ mßi‹łłŁĆR„ĹĹ…ŘŮŮÓ¨‘çÎť˘  ꞞR*+%DEEHII¶¶  ¸,-­ąq#śüü<üý[łhцÍń㇑ÉdŚ7ss ŤĄ…eBŚŚŤđiéCtD4·boˇP(JĄÄDĆŕŐÜ ©TŠľţžęÚÔ·!âZ™÷3  `튵ôčÓÜě\ŠŠŠ6fvövKŠĹb”Ę*‚‚Ú‘––ÂÉ“G122B"©$..g´µuËĺ´ióvŤś˝˝#ׯ_%%%‰€€ öîý‰úőÁȑ㰵­N§i*E(—Ë)).ˇSp'Š‹ŠŮ˛~ ě KHKŔ̬fŘp箝kä\Ü\żέ›·hÔŠł'Ϣ«§‹«»+ ń ôěדć>Í5–"T©TÜżźNĎžýP*•|óÍ|<=˝‹Ĺ$&& Ą%ŔÎÎôô”GNQ6lDxřbbŞ}čćÍ(˛˛2ąw/ť«těL«VAČ$%µ–"– 111ÁŰ×›¨(nÝ|Ô'š´h‚´RŠ‘Á#uT6őmĽÉŚřúłú‡ŐřřˇRŞĐÓÓŁe@KlŘq-ź–>tęŇ •\Vk{řáÜÚŔŔv¤¤Üĺôéc!•J‹‹ÁŃŃmm …‚6mţ¬3´·w$"â*))ɱgĎěě011ˇ˛˛’ví:““…ŹOKlmë×jŠP.“SZRĘ;ď¶C)Vżň)ÂŞ*117¦eŁńókEQQööxxx˘V«‘”ŢGW÷égROJľÖDŁĂÇ ĂŻÓŁoôůŻEôaŃkĐE(Î’`ţt–”Ćaĺęú˛ŐřĎ(IÉĆę5č",)ĽŤ•GÝî^(IĎŔĘúź›^u”ćßĹÜŁîwľŮCţďKÄČ Tľ]„…iç12zr0úŻF‹JJąŤšşË˝RT˘Ů±8ođođođođzây¸ź`ĺćbnV·Łó _ ´˛ňůą¬B)r ¤k ąµ® •¤Ž¸U)U©d/[•˙ yeĹcĎ[]„\T‚çź ˙Ş@..E”U§ËLW”#RľëQ„8[‰V'}ťöU-ď!UrU"Z q­ÝCP«źŻŽě‰ź>-š6F$’ü'…^6ÖnůĄZÇG Ö^§9RŻÍ,Bĺ=lę5xŮŞüg䔪°wügţ¬W9•rěm_ő(TĽë!Wbo]÷×#O-ĂÖˇń›Y„ŻŢĚ"üżCĄRr·,ó_Ë=őőN&őOFbâns;)ŰzVĽÝ¶ż=L&§ű{ďÔé_˝z•đđpěěě4>ťţďËĺl۵‹2ˇÁÁ(•JNž=‹•Ą%#‡ AO÷éŁî$%qôÔ),ĚĚ=lµ~UUUěÝ»—ĽĽ<qvvćçźĆĐЉ'b`đä@©T˛oß>6lŻĎË«-Q«Ő>~śôŚ 5lČ;m۲jýzĐŇâ“É“1ţ‡Iđóżţ+++ZµlIŰŔ@ iýd\Ľx‘ččhčŐ«6l@*•2räHž>(X*•˛aĂ$ C† ÁĹEłT&G\B§ĎťĂĘĘŠÁ°kß>J…BşwéBó&OďôĚÎÍeß/żTÓš2iĚ jý8233ٵkFFFŚ7Žß~űŤÜÜ\ZµjEűöO'AU*•8p€¬¬,üüüčСć”~Ę+* CKK‹i“'sîâEŇîßÇĂÍŤ^Ýş=SöŘ©SÜMKĂÍĹ…>Ý»?óÚÚŔ… ‰‰ÁŃŃ‘ž={ÖřĨQٰ·úpy©TJdd$ůůů 8k×®qíÚµ—¶‡ÜĽu‹3.`miÉ řyßľę=¤Kš=Ă'ä w‰Ś‰aÂčŃ” …ě=tŽożMن 5hÁ«•JĹŻGŹr˙ÁšyyŃĘĎŹu›7#:q"úh=Gí`ťî"LJI§UKo–ü°ž&ŤRߦąůÄÄßFKK ___ŠËDtěŘ‘©S§ŇŁGôuč"@Gs¤ľüö[ąxů2g/^DGG ssT*;ö졡«+mZ·fѲeřúř`ß ĺ,_µŠKWŻ"—ËQ(¬Ý´ śY»iM˝Ľ°µ±F­Łľˇq­Ű±zőj"""Řż?)))”––˘­­Ť»»;sćĚ! ___6oŢŚ……Ť7F&“±rĺJ._ľLff&öööĚš5‹nÝş±k×.6mÚ„ŤŤ ľoů -/ĂبöSŇ{ä•+¬Ý´ ąBÁÝ´4*++ îÔ‰÷GŚ Ű{ďá٨§ÎťŁ¤¤ż·Ş»ŤVoŘŔŐ˘bbhĺçǨI“P©Őü´gĆŚˇµż?ZZZTH+0µ¨ýî»sçαoß>věŘ\.çÚµktîÜ™‰'€““iii„‡‡Ó©S5§Ďž={8věááářůů1sćL‰ŠŠbęÔ©deeáěěLEI¦ĆćµnG\B«ÖŻçÄŮłTD>v S“jźXşgGÇę ZZlŰą“˝«ŮĂĎ]şÄν{ąÎ[ŢŢü°f ÎŽŽôéŢťC‡ŁŻ§G›Ö­©”cŞŢśśfĎžMTTEEElŢĽ‡źĐÓÓĂĐĐFŤ1kÖ,ĆŤ@||<ˇˇˇś?ž-Z°k×.ŇŇŇřꫯ6lłgĎf„ T”bj¤™nȱS¦ńŕŮąą,]±ŻĆŤńjÜgĎRZV†Z­¦Ű{ďŃwčP>űčŁjűssY´|9g/\ IăĆś˙ýwnÝąĂŔŃŁůu×.|Ű·ç‹iÓJE[ŮÖJŠđĚ™38p Ć'ÂĂĂQ«ŐtîÜ™Z·nŤłł3)))DDDбcuóÓîÝ»9~ü8ׯ_ÇĎĎŹĎ?˙śzőę±sçNnÝşE˙ţýéر#‹-bâĉtíÚcC˝ZŰCnŢşEč† ?s‘HÄ‘'011ˇ]ëÖ,üß˙pqrÂÚĘ µZÍŽÝ»éß«šćěĹ‹ěÜ·ŹË×®ń–·7ß…†püôi?ÎŘáĂąÁ˘ĄKiĺçGC77ä j _üô†ěělćÎťKfĆ=Zx6ĆPűÔ˘ŞŠŰIIĽÝ¦ #&L s‡4ńôäȉH*+ńiޜҲĽÝEX§ <=Üř~ÍΞJSO~Úű+"q%Ga㎽řúúňé§ź˛~ýz\\\()ĐÜŰSçÎáŐ¨3>ţĄJ…›‹ ż=Jdt4«—/G&“ńŮܹ̞>?bââ8sá‡÷ě!#3» čŰŁŢÍ›sëÎŕůĎţ ®\ąBii)ß|ó &&&XYYqóćMÂÂÂ8xđ FFFĚ1~ýúŃłgOrss %99™řřxLLL>|8‘‘‘XZZâááˇQ úĂëÄ™3¬ýţ{ěíŃ( ™4}:WNťÂÉÁóćáŐ¨FŹ®‘űxćL”%%\‹`Â1898°üëŻŮ´c±qqL;Vcv¤¤¤°aĂÖ®]K“&MËĺčččđÉ'źđÓO?ѲeK–/_Nee%óçĎŻ‘›={6çÎťŁ¸¸şÓečСÄĆĆ’””Dhh(ÁÁÁł 7/ŹÍ?ýDč˛eřűúâéáM˝z|6osfĚ k§Nü´w/á‘‘¬ýá‡ąŻ—/gţĚ™ŘX[ŁR©čٵ+ööÄßľMdt4‡÷ěѨĺĺĺlßľť+Vŕď‹ žžžĚ1ţýű3hРΞ=ËÚµk9tčPŤÜŠ+hßľ=íÚµC©TҡC¤R)™L†ŽŽf?žU*;÷îŧE ü}}i`k‹włf|>>Í<= 5Š„ÄDB¦N%üĚ™ąŤŰ·ch`Ŕř‘#QŞT´|ë-T*KżúŠŐ6ÔúÖ&RRR cÝşuxyy!—ËŃÖÖfÚ´iüüóĎřúú˛téRärů#>1kÖ,.]şDaaaŤO4oŢś6mÚpúôéZ×űďČÉÍ}Ě'ęŐ«ÇŚąs™?s&]:vdÇîÝDDGłú»ďjä/[ĆWsć`ei‰JĄ˘w·n89:˘Ł­ÍĹ+Ő#¤:˝óvő53šL(˛}űv~\ńÝ?_ü @OW—†nn|>>珥­-3ćϧĄŹنEĄzľg¸NXźĚţ†Ĺs?ˇQCWÎ\ĽĘí¤Ď™ŽŽÎź9ţľ}ű˛~ýzüýýQ«5ß9qěXš7mĘîHLNfÇîÝÝ»}}}†Žτѣ îÔ©¦ÍóËËIJIÁĘĘŠ;ÉÉÜMKĂď­·” …·côčŃřűűsěŘ1ŇÓÓ™1cóńÇÓ´iS†ţR©”řřxš4iÂÍ›7±˛˛âÁ$$$PUUĹQ#źq׏ÁĐ60+áá ĄEďÁI»ys33ľ E |:eĘcv¨T*nÄĆҦuknÄÄ‹T&ĂĹɉĚ,Ííŕ˝÷ŢŁk×®ÄÇÇ“——Ç´iÓŘ·oÍš5cĎž=ÄÄİ}űöÇ6i•JE||<Ť5"..™L†§§'ľľľlßľ]ăAÖ[-ZđAż~ÜĎĚ$)%…Ď,ŕĂńăéňî»\ gËO?q|˙~ôő-(V©T$Ą¤`nnNňÝ»™šręÜ9Zůűc©.˛żĂŢŢžńăÇSZZĘąsçŘĽy3-Z´`ذaÜżźŹ>ú7n`lü蛼JĄ"==GGGrrŞ™ůKKKń÷÷'3óß×|üWčęęňé”)(•J~9r„+×ŻŁĄĄĹ'~HUU킹ŹąŮŁ'jjµš¬śxH:ŞT*L aÖÂ…Ń=88ŕŕ`âââ(((࣏>âСC4iŇ„]»vĎÖ­[źčqqq4nܸ¸85zśA˙y:ČžľŢŢ ěŰ—{$§¦ňŮĽyLť8‘Î:đűµkl۵‹cűö=Ů'îŢĹŇ¢Ć7^&2d’‚Wżń§B$˘ç A$ݸ™©)ß|÷Ɔ†|4aÂ_â†?Ô類ž.™Ů9‰Fť´¸“śŠH,!7Ż___7iAjj*‘‘‘xzz‚Jˇ±ˇ©‰ >-Z`jbBbr2.ÎÎGn^>Í›ó ;›Ččh035ĹŐŮ3SS"ŁŁéұ#--˛ssiŰş5ż=Ę;íÚŃ»{÷šă]M¤ŤŤŤiÚ´)őęŐ#==KKK4h@ll,ÉÉÉřűűSTTDdd$fffŘŘŘ`aaAóćÍ9{ö,ďĽóććć$&&2|řp‚‚‚pssŁsçÎÔł¶ÖXŠĐĐŔ€F â`gGVNÚ::x¸»—@TL %"ŁŁŃŇŇÂńaťF·ÎťůĺčQZűůáěčHTL MŔÍ[·ĐÓŐeÖ'ź 4–"Ô××ÇŐŐwww ¨¬¬¤iÓ¦$''IóćÍŃŇŇ"** ‘HDÇő]ştáäÉ“4lŘfÍšĎ|@UUĄĄĄĚ™3CCCŤĄuttp˛·Ç«qc„ĺĺäççăݢ˛˛ŚŽĆŮÉ S˘ăâČÉÍĄ©guÁzç¸tő*f&&µjERJ vvȤRúöě‰ĹĂŤES)B@@ đńńA*•’’’‚źź………DFFbaaťť]ÍiˇŻo5ůkÇŽ‰ŚŚD.—Ě˝{÷ppp K—.\şt‰ Pż~}ŤĄ¬,-iĺç‡Z­&&.ŽŔ€Db1‘ŃŃ5lH\B‘ŃŃúűС];îÜ!;7—˝{“›źŹpqrâ—ŁG™űŮg¸ą¸  k-E¨ŻŻŹ››nnn"‘Hń‰-Şg¤FEE!‹qwwŞ˛'NŕááQăMšTOĐpqqÁĂĂ.]şpęÔ)FŚA`` •âňZŰCtutptp¨ń‰‚‚|š7'óˇO¸89aňĐ'róňhň7ź°03#0 €¤»wq´·ÇĘŇ{;;šyy`blL‹fͰ07ŻŐá>Ѭ© ±č•OBőţ—@l\­ýý)‰ŚŽFGG»ő)*Ęţ׳_k˘Ń1cĆĐľÓŁ#r^§צ‹0ë6őž^tZWSš˝«fçůŐrRnaoëü˛ŐřĎČ)|€˝Gó—­ĆFNú쭟ިPW—ź­Gł7]„ŻŢtţߡR)ą›r“'Š˙Šh4ţv2‡Oś{))µ…Ä»é/[…7x7x7x7ř˙O °íë3uâ(MëňBqëv-™Y·ůą¬˘!¦hëÔmâłj˘Qe’—­Ę‚ŞŞ Y…ŚJUݶ@RYDŐßž·ş‰¨ś*^ő _Źő¨(ˇJůôÔD]D,F–ťX+ł5‰×mJŠjíJąś*‘‘˘nŻąZ­z®çö‰–•ĄEťOž˝tŤáîn;>:éÍ©W U2ĺë1‹PY*~ěy«‹PVjan«ů.Ď eˇěőXąsëşż*µ 3‡7ł_Ľ™Eř‡JĄDVń‰Fëv8BĄT†H,¦O÷Îěűĺ8:::ĽÝ& ćšMk7QVRFyy9_,řâ%j EE…üđĂ Ťđńi‰Bˇ )é6‰Ď>›‹••őSe>H\\ I%ź}6Ă—WÇ ‰Yşh)fćfXXXŕŐĚ‹“GO˘+úůTśž]/"­”˛pöBŢíü.ťŢë Ąź•JĹ×_ĎĂÚşBaďż?„°°PÔj5~8ŹĆĎ”ďß?Nť‚ńókM``[ iýd¬]±©TŠP(dÄlX˝]]]zôëA›ömž*—“•ĂŹË~DOOŹÎÝ:óN§w4¨őă8p`7ÉɉH$bĆŚ™Ŕ–-aŃĽą}ű|Ş\nn6żü˛Ź˛˛R„Â2–.]ĄA­ÇďççôńÓ(ä B¦„°cóĚÍÍ153eÂÇž*'­”ňíÂo±°°@O_Ź)źNŃ ÖŹ#)é7®ÔLž<Ť]»v`m]Ź’’bćĎ˙ú™˛K–|‰ąą9ĹĹEĚť»X3 ˙«XŤB®@X*dřŘá„­CWW—^ý{Ô.č©rŮYŮÜ}ŞŞ*>ťýéKßCöíű™ÔÔdÄâ?}ÂĐĐoď–ôé3ŕ©r%%ĹüöŰ’“ůß˙VrăĆu¶mŰŔřńâëëŻA ^}TU)řć›XYY#•JéÖ­Ű·oBĄR2eʧ¸şş=×ß­ÓŻď´mEű6ţÄĆßAGG‡ŽoQR&$%ý~Í5]şwˇGß\żv‰XłăFŽ|ź †óá‡c=úRR’řřăEPP;7öâćÍhJKKČÉÉfüřaĚź?“őë$&ćcÇĆß?¦M›Kqqíé> ł¦ÍbÂđ ô}Ż/s¦ĎáÜÉsŚ˙p<.n.„_ §±WcZ·iMňťdr˛s¨(Ż dXË/cţĚůäććҵ}W6­ŰD~N>ą9ąµcŐŞĺL0śÖ­›ú=[¶¬cřđ±řűráÂęŐłĄk×^m [Ć×óľ¦Wż^Ľ×í=®ţ~}}z÷ďMA~‰ ‰5r_~ń%Ë-#dXĺô|·' ’î$Ő//ý>čDZ_ŹŐ|ľŐ._ľHź>ťéÚµaa«řđĂ1´mű6|0śŘŘ(är9ýű@EE9±±úÄúő«?˙sBB†‘““Ĺ„ ĂIHĂÔÔŚ›7Łptt"%ĺnÍ^S›HKIŁc«ŽĚüxf­ßëE@ ĐfäČńx{űréŇ9ěěčÜą+÷ď§s˙ţó×s×é¬ěÜ|öţrś•ßÎÇÜĚ»ú6dĺäw›zőŞŹ=332Yżr=»ŮŤµŤ5ůÓ/''‹Ţ˝űóᇟjŞŞŞřß˙ľÂƦ>Ó§ĎB ĐŻß ¶n #??—† ‘žžBNN6ü„JĄB °aĂNtttčÓg ;vl!'' GÍĆä`emĹš­kĐŇŇBĄR±yÝf˛2łŘřóFÝzwăȡ#¤ŢM% 0€Ň’RÂŻ„ła窪ŞĐŃŃáČů#üş˙W<›xGEE…Ćl€ę7ş˛˛2®\ąů°“IÍáÇ8|ř'O^A[[›Ž»pýúnŢŚ¦K—ęńűöídýúí(•Uhii~ ‰DÂŔĂŘ´i ß~ű%óć=űmţE˘˘Ľ‚Üś\Ž^<Š©™)¨áňĹËlZ»‰ýÇ÷cnaŽŁŁ#©wS‰ŠŞ‘;´÷‡ĎĆÁÉž<ČÁ=9rčźOůżÖ~„L Ń••˛˛đëŻg°·w¬îľIcٲE„…íŔÉÉ•JEyą•+—ÖČ>|™3çÓ¦ÍŰVŻŢ‚@ "âŮŮčß_łăL ™÷3Yłe žM=;y,ŮYŮ|1ő –|ż„fŢÍP«Őčëë3°űź§pǧMű6 9–€ą‹ć’—“DzĹËř`ŘlY·EŁv¨ŐjîÝKeÍšÍřű2vě$$ ăÇĺłĎćÔµZŤŁŁłfM«‘;sć 6â‹/ľ eËVřůµbăĆ5!-–“››ËńKÇ1155ü~áw6ŻŰĚÁ1ł0ĂÁŃÔäTbŁckäî9ČńKDZs°CGG‡_N˙‚ŽŽ7cnB|­«ý*+%dgWű„ťťjµš[·n˛|ů×lŘđŽŽÎ¨T*ĘĘĘX˝úűąĂ‡2gÎW¶C °ví6ׯ˙¤ŰŮ9`ôăż^ţđ‰k–kä~/׸xń,żývmmm:wîĘďżź'!!Ž:=Zť°ţoź}4ŽŚYčéę~#©L^\|<îc,Y@ZjF&šo« jŹŽŽ_=[Űú\ştŽĄKWq÷nW±°°ŔĤ:źojZÍwsřđ!„Â2Űrđŕn\\Ü144@ĄRŐ\ŁI¶ DWW—ő«ÖcbbBčňP¶íßĆ‚)OI IDAT­¸[dedQR\‚X$Ćş^ušSO_S3SÎź>ĎÍ蛌ž0šoćĂđ±Ăąź~źüü|˛24OĐŘ]]=ŘŤ@ $d'N\&&&•JEtt$yyą´nýgĘĎŢŢ‘7Â9|ř‹/gҤQĽóN'®_ż‚ľľ>ÍšůhÜŽ>-°°´ŕâŮ‹ÜO»ĎŇEKů~í÷$'&٧ŻÇ…ÓUh`˙ç`{G{âbâرiÓfNcÉ‚%ř´ôÁŢÁWwWd<и..n89ąljG8{öŹ 77‘¨‚ß~;•• üIăaoďHRŇm®]»Ěđácصk;=zôá—_öŃ·ďű/ĄĆÇŇĘ’¦-š’—“ÇŠĄ+()*Á§Ąb±´”4~Ţú3>-}[Ź{i÷ý.”®=»~%s sĚĚ͸ű‘k5mmZ·nKUU“&ŤĆŐŐ {{G´µµÉĘĘdÝşéÝ»˙cëq•°°Uřůµ"??…BA\\ Ý»÷ĆÁÁQ#…íŢoycnaÎ…3ȸ—Á·_~ËĘ +IJLBOOŹ g.P.,˘Ol۰ŤOľř„ĹóóůĽĎů»öŽöÄÇĆcdlôŹsV_\]Ýqtt&>ţ&§OăÔ©Ł :†śślĘËË9rä ćć–Ź­Abâm®\ąČăŘąs+˝zőŻu]ź+k+š4óBV 9’Öç…X,búô‰üöŰ9bcŁJ+ą}űEE´hQ=2Ťç`U¨Ó*700 ‘W#nÝĽ…ľľ>Ţľoľ—vŹ˘Â"\Ý]137#év>-«‘űé÷166ĆŇ q–fŠÜł˛2ŃÖÖĆÎά¬L´´5롥Ą…ź_+˘˘"ĐŇ˙?Ó~ŮŮYäädaoď€QQřůµ"::µZŤź_+%ĄqXąÖľůHÄ\Ý])Ě/D,#,"8 ÝŰ×›¤;IČerĽ}˝kź‹ ‹¸—vëzÖ¸{¸sëć-y5"%)©TJ źP’’Ť•mÓg©đB –‘źźKăĆM ËČËËEĄR!Uźlzy5%;űxy5­y±¨¨(')馦¦xy5#99;;{rsshĐŔsój&÷’ÂŰXyÔ~qmee%©É©´x«ŇJ))É)›S\T €[C7Ę…ĺăÖĐŤz6ő€ę”\|lí×ÖÖĆǧ%117ýAI~ĘŮÍőÔ«°¨ö󴵉5›v2běpü:u|äço:@^-TÉd °jš °jš °jš °jš °jµ`ioö˙;^§.ÂüÔs?9 öŻFĂ#cůířŮçĽóę °¨ —Ńčk´‡hˇ[»>"ÓBĄ(GO^·jősű~b€ĄŻŻGqIéRčeăZd žÍ|0·~´PT©¬z-ćHikëĽ6łUbćfOç«++eŹ=ouâ’Â×c=d’×c=„%ŻĹzTVŠ0łŞ_çgľN{&fjË«ęüó«R))(ş˙ŻĺętXůýęÍlŘľ—)3R^!B.Wđż•a|˝|MÍ53gÎäË/ż$88˘"ÍňG ËË‘TVR^Q°ĽśÔ{÷4f ţ9_÷É))4 âJxxŤ\yy9Ĺ%%(  ÂňrBĂÂ>gÝßźÔtÍÎY¬¨¨@"‘PVVFEEyyy 4ůóç3aB5ibnn.íÚµăçź®‘‰D#•JQ*•”–VítčĐ-[4ۆ.‘HTVR\R‚D"A$3hĚľ_˝š®Ş űÄ ˝ćŰď˙lţ« Pýue%vžž|żz5WŻ_רR©‘HDiiiµ"Ó¦McńâĹ# ‘JĄLš4‰I“&ŐČÉd2Š‹‹k fKKK‰‰‰ˇGŹLš4‰]»viÔąBQăřÉňU«ř|ţ|ş ŔýĚL _÷ÝßżFNˇPP\R‚°Ľ€ňŠ îgf˛bíZ&MźNĎAšĄiP*•5ľń‡źěŢ˝›‰'ŇŁGnŢĽ‰R©d۶m4kÖěąââ⿉DĐĄK-ZÄ#4j‡Z­®yÎ˙xć/_»Ćqăč5x0._F­VsöâEL%..)ˇ¸¤µZŤ¤˛‰DB·÷ßç»Ő«yŻoßZçÁz’O|üńÇ|ýő×téŇ…ňňr¤R)&LŕĂ?|Dîď>‘ŔčŃŁ?~<'NdŢĽyŮCärůc>±tĺJf.X@·Čxđ…BÁâeËčůÁ5rŹůDy9÷22řdÖ,şôí ŔÁÇy«];Î]şT«6TUUQVVVó™ůŞC&—3hĚ–®\IߡCęý»Ű€ü°¦:žxžS¬:`}öŃ8\ť°©g…޶6GNťÇ¶ž5ň‡ť#Ë–-ĂŰŰ;;;ôô4;Ď+¸‚űőcöÂ…L›5 ‘HÄĆU«Şąděí)ݍŕČÉ“XYZ˘|¸x‰ÉÉô< ۶±nófnÝąĂôŮłůxâDÚRYYYëVGHH:t`Ě1|űí·ÄÄİ}űv®®®Čd2¶nÝŠ»»{Ťn………tęÔ‰={ö°páB :t(rąśŤ7ҨQ#ŤŰ±hŮ2ÚtéB÷ٲs'{bĎ–-čéęŇČݵZÍňÄ×Űű‘g(¨sgŽž<ɇ3f R©č:`;öěˇË»ďRXT„ł†Ç±l۶Ť–-[ĚŽ;X±b?ţř#88Ts\m۶ '''d2YŤÜ|Ŕ¶mŰ6meeeŚ5ŠS§NˇR©0aýűk¶­űüĄKxĐcŕ@věŮì/żäó©Séұ#–püĚ ôő©|Ř 0cţ|–ŻZĹŚyóČĚĘbć‚ä2j)iiĚýě3ŤÚ‘’’‚łł3˝{÷fÇŽŚ=š!C†0yňdôôô055%&&†ňňňG6śU«VńĹ_0kÖ,řá‡8věb±•J…X¬Ů”L&ĂÖĂ~ƱcĎş @ű6mXľx1 …kKKrrsIMOGôÝ~9r„qĚ‚%K¸Á®}űŘşk ‰‰´ ââ•+µÎ…µeËüüüj|bĺĘ•„††âîŁ#:::lٲ—G|bŕŔlßľťiÓ¦! 9r$tęÔ©ćşóçĎ3räHîÝ»Gqqq­ÚqöâEšĐýˇOĚ^¸/>ů„Î:ÔřıS§000xÄ'>ť;—ďWŻfĆĽy<ČÎfĆüů3 wďšëôîŤm˝zá%»{÷....L™ňr'ü_ˇŻ§Ç®M›ĐŐŐĄˇ›JĄ’×®ĄEłf5ť¨ęç i¨ÓńŐś9th×€ ?ţŔĺkמzźÚ†……K—.^},…BÁ_~‰‹ł3ßó a[¶`aaAĚ­[Xü‡SË:}‚µűŕQtut8řŰI7tˇg׎Ř5°ĹĚĚ]Ýę˘éU«Vˇ««Ë† jŽâ5 WggúΖź~"2*Šä»w9xř0Ó&M˘Cűöc× şVÄŃľš<îóůóů~őj"ŁŁyäHBĂÂřtÎ …ĆOL\ŇLť:•őë×sŕŔJKKŮşu+ŁGʦk×®XYYagg€™™ŽŽŽ,Z´éÓ§“““C`` #FŚ {÷îX[[×\«Q;®Ç˛äÇőëY±f ş::ü¸~=ý{ő˘oŹ4¨_»ú°ţţü¸nĆŚAĄRáţÖ[¤gdđéś9\‹ Đ_ós˝ěěěĐ××g×®]Ěš5‹•+W˘§§Çúőëiٲ%#GŽÄŮŮkkëš ,00­[·2hĐ ĘĘĘxçťw000@­V“‘‘ńRÖĂĘŇ333~żvŤá!!¬ßş¶î܉…™…„ŕѰ!¦ĆĆWż4úűsđđaŤCfVĂĆŹçJx8+Ö®eÚ_Ň?š„‘‘¶¶¶¤§§ÓˇC¶m«fŇŢ˝{7ĹĹĹĚ™3‡¦M›˘ŻŻŹµuu=J`` gÎśaĐ A$$$đĹ_pôčQ\]]Ů´išÁ pvtD.—ăáëËžŃŇŇâ—#G¸Ă˙.Ä×»š2âiíďODTCĆŤăęő넆…ń]h(s-"*6__´µkżîĘŢŢ===vîÜÉěŮłk|bÝşuřűű3bÄśťť±˛˛Ş Âٲe  B(Ňľ}{23ęČöí۱µµĹŇҲÖí°˛´ÄĚÔ”‹W®0bâDÖoŮRăV––L ˇ‘»;&&&üĹ'üöĆŚáAv6CĆŤăZDD­ëú,üáu•R)k6mB­R±făFöëGďîÝ©ocóČ^đoQ§‰F˙ţf¤ĄĄUół5›v2fĚÚuěţČ5Ą…Ů+PüC—żęőw}˙~Ý_ż´´´‰…+r‘vüýwUreY÷°©g˙ص//ÂŽgÉć”ć`ďÚä…ëýwü“˙Ýż¶#ĺö¶Î/ZíÇP[vüq]Náě=šżp˝˙ŽZ_Źô;Ř[?{€ú‹ŔóÚńW٧AKK‹Ľü l=šŐJ‘{m>Kż¦¤ «ÖöÚö‰żĘ‰ÄÂZ+r˙ă>˛J’‚<¬,_í@ëźţ_jµŠÔôŚ źĚä˙Żx°Ę„šMĄ˝hüQÓô2[‚˙zďgéń÷ß˝jm̵aÇ˰ńEŮń˛×çŤoě¨ <Ż˙t˝&P›k IŰjűYŇ”-/űyř·ř§˙×ófąź`ý~íWÂŁę4ѨR©D[KEqţŁóŐÄĺ%ČŐt%š-xŃÉ*QUę˘PČţůâWJ…‰¸ĽÎł;TŠË{Ţę"*%—ä˝l5ţ3*%ŻÇzË)ÖŞŰÔ‰’ü¬:O4úzí!:T)äµv…LŠ\T†Zýę×a= Ď«˙¬v~ĽÝFó…˘/;÷ýŠL]…–•᣿Pꂺ>Zš/°~ˇ”ˇĄ_Ž–Ąá?_ű*C&‰5ZfN/[“˙ŐíÇź·ş2S´Ě\_¶˙rŮë±ĺúŻÇzČ”`eXç¬7{Čżą‡ 6h™iľľóEB­Rˇ.Éú×rO °Ať -ŻQXT‚©‰1¶6Öd>ČAQU…©‰1i÷2 ę"±„śěĚĚÍppt@ Ł¶Zmý—˘sFĆ=$ ..®¨Őj233pqqĹČčÉ$$1÷144ÂŐŐ mm]T::hëľôś¬„B!öö’–’€ť˙(ꛓ‹¦ĆF´/m= ó)**ÂĆĆkëz$%Ý ^=llž]7”tµZŤµu=lmë#ĐÖ~iëQVZFnN.Ř9Ř‘z7…Bą…9öĎ®oKKIC.—ăîᎾľ>öK[±XDffĆĆĆ8;»Öř‹‘‘1..®O•űĂ? quu©ë!—ÉIKMCOOʆŤÖř‹®®.Ť=ž)››“KYi ě`ieYmÇKZµZMRŇ´´Ş PTTÝéܤIłgĘRXXđ§Ş?Ż4uZ]ZRJ^n–ŘŮŰ‘šśŠ˘JQă#Ď‚°LX$ĆŢŃa™đĄî!"‘÷‰?ľ$1……¸¸¸™y+«zhdŃÖŐE ­ziĎďżA~~%%ĹŘÚÖÇŇŇŠääęŽřęď-ź‹K»C‡ -Íô±µ¶DKK‹sż‡Ó«kG*+Ą˙,ý’±}Ď!ZZ|űĂzšxzđĺ·?âę쀡ˇ©÷2đöőćĐŻÇQ*•|ţńçtéŢ}m:jdÁ#"®!“Iąw/Ť¬¬ JJŠŮµk;ŮŮ8p`7EE…üüóV6l„ŤM} «ß$˘˘®“ŹĄĄ%R©”[·nrůň˛łđÝwKhҤ96Ö–¨udčÖţz|l<"‘Ä„D„eBJ‹KŮ´vUĘ*–,XBýőYřĹBĽ}˝±°´Ŕôa{qB|7Łob``€®ž.á—Ăqqs!.6ŽÉŁ&٧݇÷[-P”+00úç ěż"%%‰˛˛Rbbn<$>-&4ô;lll=z ďľŰ…aĂúÔccc,-«‡ ¦ĄĄZ­ĆĘĘš3gN0thZ·ÂČČ++k*Ąůţ‚Ë˙Š™ČÎĚćN”J%y9yěܲ¦Mś†_+?&ŽgOLLL°±µŞâđ+áH$ę7¨Ď•‹W¸›ď—|Ź@ /7ݦ^T–T`hlSëv’x›¬¬ ¤Ňj?9{öEE…|óÍ\\Ü5ëęŐłÁÄÄ;»ęBď’’b._ľHII1ŽDEE T*ÉĘĘdďŢź¸pá4={öŁRRˇ•Y­Ű!‰ą~˛Ň2D"wîpëć-âŘĽn3Ć&Ćüď«˙ˇĄĄ…©™)N.Ő§µ•••\8sěٸ¸ąpűÖmrłs5p =2÷Óą ;śĘR!†FµOˢT*9ţôCâÔR˘Ł#)(ČçěŮ“=ú •••„……R\\„™™nn kdĎś9NZZ îîÜ»—Fqq!}űľG«VŚýcĆLB!-ĂŔʸVęsd< '+‡Ű·n?âşzşL ™Š ?†O Ił&›×řDvV6ׯ\§RR‰m[._¸Liq)ßĚ˙†Kç/Ń«/†öŠĄ…%s?›Ë{ÝŢC_§ööÂÂ’“ď™™Qłwś9sśââ"ľţz>®® ůâ‹©ŘŘŘbbbŠť]őËÓ“|˘¤¤\ĆćÍë>|,‡dňä14kÖ7·†T)*kmU¸qýR‰3Kô kß˙ ärK–,ŔĚ̂ɓGÓŞUBB†ŃŞU&&&››#.I&—¦––bI%%ĄÜŽ«Ű4 F ćNrÁťŢF*•ŃÚ߇Č[dfĺÔ\óٜϸ“p‡>úÔ8•¦0wî§Ś=¨¨ë\ż~SBB¦Ác‘HDx{ű˛gĎOH’ÁEGG°`ÁčëpňäQJJJ¸Ęă°°°DĄRalüô“®ÚŔĘĄ+Đużź˙ť›17‹ĹĚ\0“s'Ď1yÚdňsóéĐą»wěFTQÍś“•ĂĆ`ccĂ/ű~AZ)ĺÂŮ Eb.ž˝HÓćM5jŔĎ?o#8¸§NăîÝDîßOçŰoWrŕŔn>˙|>iiwé×ďvďŢNiiIŤÜ{ďáęęĆž=;P©Tś:u”ÔÔdúôyźýűwŐĽŃk gŽźˇkű®ě˙y?©É©$Ä%0ű«Ůܸ~Á##ŞŃ)¸Î\ =íOÖ˙ˇ}‡˘§§Çéc§– ątţé©é˘Ł«C‡Î4jÇÍ›Ńôěů.6¬&55™7®3n܇”— iŐ*sss|}ýINľMLĚŤąO>™Hqq!‘‘ádeerăĆuŞŞ4kÖ‚¤¤D¦OźĄQ;˛ł˛éű^_–-^Fjr*żź˙ťŢzcgo‡µµ5Mš5ÁÍÝŤra9gOś­‘űfţ7Üşy‹Ô»©$&$’p3ĽÜůd"ˇˇ›pvv%>ţ&˝z3yň(ŇÓS°łł§˛˛: j‡X,ÂŘŘ„áĂÇRZZB×®=ٲ%ڬ¬Lś4Űö:ká,ŹڰL¨BÄđţĂY˛b -|Zphď!şöęĘş•ë¸qýŤ<«YÚ+++ńn鍓«fćfL™>…Ő?¬ĆČŘ; w¨ŞŞbř¨!µc„Ź9s>"Q*•ŠŢ˝;1gÎ"Ú¶}›óçOÓľý»Nź>NË–ŐDŹ%%ĹxxxňZZZĚś9źÄÄŰ´ió67oFqęÔQZ·nŁQ;úĽß‡UW!­”˘P(?d<Á=yčűÄFĹâëďKEyÇ~=FŹ>=Şí(.ÁŐÝ•ć>Í161fâÇ9uě®î®2ó㙄ý¦Q;Z·bÆj˛ÓV­Ä|őŐ,ĚĚĚůňËoą?ťFŤĽpwoȲe‹?ľšăŞú-݉®]{allĚŕÁ#066ć÷ß/˘§§‹§§ćw''¶ďߎZ­Ćݵ[Öo!!.Đ͡Ë„Ř9ÚŃ÷ýľôîÔ›KŞIiKŠKđjęEď˝ŃŐŐĹÁÉÂüB2ďg2*dKq;tuuŮłç0ÚÚÚřúúsćĚ 6n\Íî݇ßđ§aeĄÍúőŰ«í()ĆĘʚ޽ű×´««ŐjŢzË+++ćĚůôîúbĐo`?VnXY=íBQĹŘAcéŢ·; ćF ľľK…űíÝzw«ÖýˇO4mŃccc&Mť„…eíźB? mٰá' ‰/żüKK+,X½{i4nÜW~řá[ĆŤ›\mGI1ŽŽN÷ŔŘŘ„!CFU“‘ľĽ!á.®., ]FUí’ßżČdR čĘüůßĐşu[Nź>N‡ť8uJĘůó§iŢÜűąRŰu:ExääyŚŚ IĽ›†}}N_¸B©°śŽo’›_·Ż7—®D`dlD|l<ŤĽ!P)5–"ŚŚĽFűöďbcSź™3§Ř-ţß IDAT>$tĽŹě˙µwŢaUk˙ťCďH)Ѝ`/Ѩ±+öKb,Ř5&jr“ë5‰&ŢDKŠŃ¨ńĆÄ QF° EAşH•Ţ9Ŕéß(Šb‰ÂAüÎďy|Ö]fvßŮÝ÷ĚěĚ[ÄŐdgßF&“|CC#ĆŚ™€zzzÄĹÝ <ü2……ůhhh˛yó$ ‡DOOʱc'˘«­©Ň%B77ś]śůüăĎ)Č/ >6---ă1·0çČoGP˘dâô‰¶0ESS“ĚŚLb®Ĺp-âmÜÚ°řÍĹlŮą…n=»‘ź—O÷ŢÝiÓÖE…K„ XXXС7?ýô‰‰ńDD„affĆŐ«Wpw÷dďŢ(//cúôŮXZÖ,Ë””“ŔÉ“Ľúęüüăç7‘}űvQVVĘ”)3±±±UéˇRˇ¤gźž äÔńS¤$§`dlDTxN.N:p‚BFŹŤ“KŤýEuu51×b<HďWzłxÎbLRBĹ…Ĺ = W•.ćĺĺ2xđ0˘˘®˛cÇW”——ŁĄĄEll4VV6%'ç6ýű˘C‡ŽBÂĂ/x _ßîlܸ++ţüóW,XŠť]M ^U.ŢľÁŘIcÉĘĚâÝ%«‹L.#9!#BĎ…’–šF—®]čŃ»úú„ś !čxžŢžě۵qµ}}nĄÜ»‹7˝úőRéáąsg1c2™Śńă‡ŃŞ•大ßB rýzII ¸ş¶cŕŔšAŠ™™9gĎqćL mÚ¸|šëף >ÝٰáClm[˘««Gzz*C‡Ž <ü ]şřbggßčK„q1qŚ;ąHůÂ/ŠĹŐ8°cc"#ĂqqiË?QYYÉ´ił07· ˛$-­GĎIŐ·DجŤ>ŽŻżŰËôŮÓčňę€:ÇËórŃQÚ˘­kÔD’5 Ő˘"şĄč›™5µ(Ď…L,F”Y‰‰…cS‹ňÜ_ĂěNÄűćLQRfVŞźjhŠňo`ÖFőYš˘”4ĚĚ˝šZŚç¦87“6–Í>$‹şyz$•"Äy ŚZ4o=T(ää§üŐ0Fĺr·Ň3iΰ$é“ ©QŁFŤ5jÔ<‰†Jör9śÄű ›#–fč”efŐ9^]^Ž ŐÍŔmôqH%•(µ¤ČîLI6W2âňjŠć? W•=ôľ5GÄĹ”‘ÔÔb<7bQ e™Í+˘t}ËË(“ż ĎŁ€ň,ił‹ňý ę>äé‘K$H+d(ĄÍ»źR*(ž!LC˝¬ľ=}éîăýÜB5%;w@ˇÔ˘•}ÝĄŽĆĚ#ĄJT™‹°1‘Š«)‘ßÂҢy·ŕv± ;űĆĎEŘŘÜ®ŠĆ®™$i}·óĹŘŮ7˙ĄÎŰ’XěĚ›˙óČQVaŐŇ­QrŞ’—©i¬\„w©®,oąź„B!'±$ő×{¤ĹVy…čyäQ i·‰ŠŽĹÁŢ–N^ýBeU_éIQq)ÉÉÉś?ggg^y啦8H^~>ĂF!—sňĚl­­:hĐcëĺćĺqěÔ)¬,,1dФ}4ÁÁÁ¤¤¤Đ·o_¬¬¬ří·ß022b„ OU˙Â… XZZâ쨷áGŵ:wě—‡»ţ€7¦ObÝÝű÷ŁP*ńňđŔ§S§Ćő±$$$‚««+˝{÷ć—_~A$1qâD qú·ß~٬¬ŚqăĆabb˘"‰ë'+;›Ŕ3g°ł±aČŔ;uŠÜĽ<†ôجöwőx!t¤´´”C‡ŐęÄůóçINN¦Oź>´mŰö±u/\¸@bb"˝ző˘]»v*’¸~ »ţ@ŔěiÓŠ"*&†N^^tňzĽ]XTt4×®5™~ÄÇÇZ«˙űß˙¨¬¬|*ťHNN&++‹~ýúqóćMÎť;×d}HćíŰś:{öžN’›źĎ°A°yŚNääćĹđ×^ŕäéÓtpw§ĄÝă˙äJx81qqřvîŚ[۶ěýĺ4449ĺŮ=Ý›u†+×čáăÍ’w×3jř@’o¦2Ńo8Q×ăjËś={–ţýűăççÇ‘#G05T]ţ¨ďöěÁŢÎŽüÂB$ íÚ¶Ą¨¸}}®\IiY+-"'/ŹĚŰ·±·łC*“±ď—_(,,dŘŕÁčësúÜ9 iďęĘż>úccc:w||ĺ†ä×_ĹĐФ¤$ěěě°´´$66–Nť:1iŇ$:uꄏŹ€ŘŘXÜÝÝ‘Ëĺüţű蠟§ÓŁG<<<řţűďYąr%|ňÉ'Ěž=gÇ*kGĐ_!“ɋڤg×®hhhÁ´ đęŐ‹ĺţţTVWÓ·G.……ŃÝ·&LÉ  â“’hצ C â?ź~Jß^˝ŘńăŹüüý÷ŘÚب¬ aaa¤ĄĄ‘’’‚ŻŻ/eeedff2tčP^{í5ć̙Í7?>.\`ČťÁĆĹ‹ ĄU«VŚ7ŽŻżţmmm‚Y±b˙ý7#FŚPY;’nŢäď‹ku##3 MM|:ubáĘ•DÇĆrüÔ)¶nÚÄą ®\ąBFFÉÉÉtíÚ•ňňrŇÓÓ>|8dîÜąÄĆĆ2wî\BBBxí΀#44”‹/âŕŕŔرcŮşu+ľľľl۶ ˇPHż~ý=z4{öěaÚ´i`nŇxžŰ‰ÉÉ„\şDµXŚ›«+YY…B|;ubÁŠDÇĆrňôi¶lÜČą&Ť @\BG±03cúäÉě˙ĺ\śť9xř0Qׯ3üµ×8täk×­cë¦MŤ>ŔĘËËăŔ8:´¤O§ŽŤz­†@,‘đ÷Ĺ‹Ś>śľC‡2{Ú4t´µéěíMXD]Ľ;>SЧfíÎ1¸o¶˙x€‹ŢÄĽ…)i· ą^ `üřń|ôŃG|üńÇ8;;«TľöîĺóŻżĆĆĘ [\Ű´ˇĄ­-‡ŹeŰçź#–H8Dn^¦wfB.]b÷ţýLź4‰´Ś tuu±µ±a’źeČ ĚT ŕ~:Äš5k°··ÇŇŇ{{{zőęŧź~ĘÁ‹Ĺüý÷ßÄÄÄ`sg°‘‘‘ÁŰożÍĽyóČĘĘBSS“V­Z‘””DII žžž*mŔ™sçxkéRhajŠY‹L›07/ćl@b‰„Čk׾pG‡ÚzĂ&L`éüůä T*qlÝš¦¦Ěă V}đGŽWi;ÂĂĂ™7oŢťhó-°°°`ňäÉĽ÷Ţ{lÝş 8qâöö÷Ľw¦NťŠźźBˇ‘H„˝˝=JĄ’äädŽ?^§¬*¸yëËVݦ¸¤„¦¦ŘX[3jȾ۽›ŮÓ§ÓącG2oßćđŃŁuľÔ¬XAooěllČ/,ÄĆÚCCCňňň˝t‰…o˝ĄŇv˛zőj˘ŁŁiѢööö 8   ĽĽĽ3f EEE8p ‹{ÁC׬YĄĄ%ť;w&-- ,,,077'44G{¤Ęĺrţ˝q#'‚‚hajŠŁ=»u#éćMr9KćÍŁZ,ćÇýűkŻ>۲…ĘŞ*†D|R¦&&´05ećÔ©ütŕ@mlżĆäęŐ«Ě›7CCĂ::±fͶoߎ™™ ś>ž×_ťlmm™1cFmgabbÂůóç±´´ÄĆƆňöŰoÓŁG čßż?-íě¨.+Á@żńcĘTVVâ`oŹ‹“—®^Ą¬ĽĽ&_^W®^eî¬Y\ C,]°=Ýš'®..ś9-MM:xx°ă‡3s&§˙ú ą\ÎŇůó1Đ×§Ľş#ÓĆĐY]]Ťąą9žžžÜ¸q›7obhhHAA—/_fĚ1dddPZZĘÂ… 1»çĆÍÍŤŕŕ`Ş««éŇĄ `ěرRXXżż?”ĺadĐř¶X©]|;w&#+‹Đ+W°¶˛˘¸¤„°ČHşvé‚PCÔ´4ćÍž];pňpsăďĐPň éáëËńS§°ł±!19™×'MÂÂĽf»Ľ˛ #8Čĺrd2}űöĄ¤¤„?ţřgggJKK‰ŔŢŢ'''"##yăŤ7hÓ¦&Ůs‡ ­µe ÁŘŘ///ÂÂÂ={6®®®”çc¤ßř•J%ĄeeĽöę«ČĺrľÝ˝/*D"˘˘Ł …ĽŇ»7gĎźgĆäÉtđ¨1SččéÉĺ°0˘ăâĐ·/±ńń!‰8ĚÔńăéäĺ…HTŠ™AĂ`î׉RRRę脟źééé”––˛hŃ"Z´hÜÓ ±XL—.]řůçźéÔ©SíHÇŽißľ=ÁÁÁ 0€ţýű#©5ZrżN¤gfr),¬ŽNt»cŠ‘–‘ÁĽŮł±»O'·†RXXHw__Žť:EK;;LŚŚĐĐШ5w(+/§“—ććH¤b”šščę=ŢíYËĺČĺrzöč†TTž ú©çA!—“šžNvNá‘‘Ě™1‹W® ­ŁĂ·ŢBGG›˘âlu Ń»|ýÝ^fĎžMźW‡×9ţ2y€Ľ4^„™·°´hţF—·‹ocçřx&Ecgĺđä‚/8·ó3°kŁúĄč†ćvJ,vć-›ZŚç&'7 «6j/µáÓŁPČILşŠˇaýĎüÍČĘćĚ9Ő/ß4$YŮąM-‚5jÔ¨QŁćĄ ŤJ$R•z©5f-LĐČČ̬ë…S]^NzhľAâä”U6LšŹˇ&Đh%bEóţި¨*D‘©:ŻŻĆ˘˘˘ Í˙ĄBTňr<Źň"ňfíđ €HT4+áĄ4úňô!2Ę+‹í2‰Y…„Ji3N CM Ńgˇ^­uqr ¤´üąjjŽž<‹G—NŮ?°ô¤Î#őB!‹A^‰ŃK‹PZ\őđűÖ ‘V)1˛rmj1žiľôĺx)FćÍ˙yČ”`زůç"T÷!OĎË”‹PTšţŹë=ňłH.—?—@Ş řÂeŇ3n٧§KGO7Â"Ł©Ubkm‰T& đh ń±ńčč1kά&•W$Şŕ‡¶#‘HčŰwYYdgg‘‘‘Λo. M›G˙†…]äÜąłhkëđć›óiĘů‰XžďöPYY‰›»š$Ć%’“ťĂżtíŃő±őĄR)?îřOoOşví˘"©F©T˛oß.ĘĘĘ033ĂŮą-áá—),,Ŕ×·C†<>&ÔĘ•ţ8;·ĄK—®tďŢKER×ĎŃĂGIINÁŔĐßîľ\ľ@YiNLť9ő‘őĘJËřîëďÉdŚ?ŠöMkCzž‹/ ««ËŕÁĂ :Aee%şşş,Z´ň‘ő˛łł8|ř UUUhhh°lYÓz/ĹßçŹßţ@SS“IÓ'đ{R©”Ň’R>řäGÖ“JĄüôýO*D8ą81rěHJý0yy9|űí×Ěźż„k<Şăٲeçcë8đEE…3mÚěF—őA~ŕÖÍ[âÓ݇ Á(--ĹŃŮ‘)3<˛¬´ŚsgÎQZRĘô7¦x,řxô ô™ůÖL¶ †s\ş‚®® ĺôéťĐÓÓgáÂ召WYYÉ•+ˇ\żÉ’%«ČĚLç˙ŰË~¸ą5˙  ‰\.gßľ]”——ammKË–öDE…SPOŻ^}éßĐ3}4ëyg#Cú÷éλ˙ţŚ}ş3mÂ(¬ü/Źv¤gŢŔĐŘ‘cG2{ňlFŚ‘¶ę†&«W/ĂÔÔ‰DJuu%#FڎwďWŠ ççźwłeËN˘ŁŁXłfćć5ńqŠ‹‹ŘĽy#şşşxxxѶ­ű÷˙ȸq“ńöî—_~Fßľýqk뤲v|±á $b Y™Y8·qĆÝĂ/*++ٶyżţŽgGO& źÄüĄó¨ŞŞbÓG›044ÄČŘ1ÇđŢň÷řvß·üĽçgN;…¶Ž¶JX{÷î"++ťČČ«Ś5mmměěěéÖ­5S§ŽćęŐ|}»ÓĄ‹kťaăĆcllBii «W˙›‰‡3~ü˘˘Â2d$]»öPYŹr!ř©)©Ś3‚˘Â"<;z2Âo3ĆĎ`ÔřQř/÷g䀑tďÓ˝¶ŢŰ ¤¸Q…·ß›U WáÚŢ•řŘxÖoZOA~JŰy•={ľC"‘ĐŻßâăă6l~~Y¸đ ú÷Śż˙r.śM·n˝këüÎőë‘TWWł|ůjľúj~~“đ÷_Ί pwď Ňvdfdňá;baeAgźÎś>Ď‚% 8m"k–ŻÁ§»ţËýůtݧ5îýH_ąLŔáä29‹Ţ^Äźżţ‰ą…9?îř‘%ď,aŰćm*`I$¦O÷ŁcÇδiăʡCżđÉ'_0eĘ,6lř€łgđ÷_Î5WwIIIf۶-0oŢ"#Ż"•JY˛dŮŮ"ěě ™8ńÉ™ž‡“' ý;””äFúŤ¤¸¸÷îŚđÁëă^gô„Ńř/÷gř+ĂéŐďŢÇĐ÷Űľ§¬´ŚŠŠ V˝·Šţ+·xW.^!7'—éoLgͲ5üzěW&ŽČ+^Á¦Eăyt†‡_aßľ]TWWóĘ+Ż’ĎС#ńó›ż˙ PŁ ̢WŻ~µőŽ9Dtô5Äâ*–-[Í—_~ĆŔC¸~=ŠăÇŹ°dÉ*ňňr9räť;ű6ú+#-ukÖáÖÎ…y35굥R‰#ćć,X0‹ktîÜ•>}Ľ™1cÎ3ź·Y°ĚÍLůü›]|ňÁJĚÍ[đ×ß—02ĐÇÇ»áQ5±‰llmxoĺ{ěŘ˝;{;ĘóTg[rőę%||ş±hŃJ ––VüôÓ÷deeňÉ'›řôÓ˙đÖ[‹iѢfšöĆŤë\˝z™ß~;AAA>–Ě›·G22Ň„TW«6„F̵šOë>]‡®®.†źćDŔ vÜ ŔW›ľbü´ńص¬Y’ÉĎÍçŕľD&G’‘š©©)ď~ř.‚/ŕäâDËVŞ÷Šşy3‘s|óÍŹ´ha†P($%%™÷Ţ[A``ß~ű5ĹŮąMm˝Ť×QT$'))€Ź?ţ33 Ľ˝}Ř˝{‰‰q,\řp\ Ć"+#‹ŔŁěÜ»“V­[!“É(-)eÍň5ě>¸KKKţ<ô'ć–ćôę{Ż3ůňł/9rć …MMMVľ·’ó!$Ć'ňߏ˙Kźţ}đě¨:Ż»ÂÂNť:Îöí{đđč@Ďžý …¬^˝”uë>ĹÝÝ“°°K¤ĄĄ˛iÓ×µővîÜĘ;ďü ''tttyóÍ™YÁŤѬ_żIem¨Ut"m»·Ń˝Wwşö슙…+ćŻ`öĽŮĽňę+dedqřŕaCkëíů~=űôdŕčéë1vňXĘKË©®ŞĆ®ĄeĄe*m‡Bˇŕôé“řůMâŐW‡Đ©“/NN.,Zô&ĽĆĉÓP(Ľ˙ţŰ\ľ[[ďŕÁý™™1oŢb”J0`0JĄ‚­[żçŰożQÉjHfFfŤNü´űÖöČerJŠKXłl ?ýöććüůëźXŰXÓŁ÷˝˘-źnářąăČd2455Yőţ*ě쉏Ť'7Gőv5:qŚíŰÂÝÝ“^˝ú!X˝zë×Fűö\ąJff:cÇNŞ­·cÇW¬]»ŽÖ­ťĐŐŐeÎĚÍ-ĐĐĐäřń?čÜŮ33‹G]şA‰DťÂo\ÓÎŔ>-šššhiiłqă:ΰsç— 2GGgŠg{‡ë Ó°ůăµčëżř.¨r……BÖťx$÷ď‡E\ǶUKlťť‘+ähkפČ——ى *0P‹«ŃŇŇ®3µřౚ}­Z×e…BŽT*EGG·ţsJÄhij˘‰QjUˇĄ‚ç$KĐĐĐ@CóŢěźD"ACxďD"EC(¬ÝW*•«ĹčęŐm‡L*CSK©DŠ@(DI‰]Ć·%“ʤ NüšŹŐW¦ŞŞf:ľ>d2)J@KS‹ĘŞ,•ŘÄÉdr” ZÚ÷d”ËîĽűwŽÉerä Ú÷•©®ŞFGW§Ž‘qM99BŤZ=©Ě/Eß°ńÓ˙(5ńŁ´µuę“ĘdčÜ9öŕ>ÜÓÝý R©¤Vw*E9č[4~{椛(W(ľPČÄbDňJL^`#÷§ML¤(®ŔÔ^5©(E•S+—¦ăąQäWcŞâô?ŤB˘ŔÔ\5ĎŁľwýÁc˙4Q×ÝňJĄ“—ŔČ]݇<=eRvvö„…Ĺ7Ú5TÁ‡ľ‹LöĎc6ď7˝™q…5k–ŐîŻ\éOtôÓĺjZ˝zaŤ%Z ޱtîR¶ţwë#ËT”W°ç»=5SóŞ6‡ßÓňÓOßłoß®Úý!Cz7z˛ĆâőqŻ“ű’Ä„»v-‚U«ęÚsDG_cĺJ˙&’ča*Ę+X䡿ź>öÉ•žŔ;ď,&**Ľ¤űg¬=ďżý>+ýW’•‘Ąňë76J Z,®÷_\âÍzë4kq+´«‹IDAT¬'př(żüq’Ť_ndx˙ál˙q;憍— ýI”––°k×ĆŹź‚X,fďŢčÖ­_|±;»–Řٵ$,ě ŕöíLlm[âŕŕ••5qq1ěŰ÷_~ą‰őë?ĂĘĽńSgüSŽýq W7Wă9sň kW®e줱ˇĄĄEFZáW±´´Ä«“¦-T›´úiÉĚLgűö/™:u۶mćŇĄ®^˝Ä¶m_"Ŕ[o-bţü\˝šŔ®]Ű‹Ĺ,]úNS‹]/‘W#ůeď/äääеGW.‡\&<,śţűĎÂĺ ٶy¦f¦ôěÓ“‰Ó'6µČʤ¬¬ŚŘŘfÍšČüůKŮąó+:tđćĆŤhćĚ™ĘěŮóĐÓÓă‹/6°oßá&‘ńȡ#xzyr#úAÇřü“Ďůvß·Ě™6‡y‹çqîô9233yuđ«ü~đwöţ¶—×ǽΒUK8uü"‘˙eţűăInI =¬AäJOO%;ű6ăÇO!0đÁÁ§Ů·ďGd2)sç.bţü™Ě™SóÁ7sć[„†ţMXŘEľţú |}{q…Nť| „…]Â×·;aa—X°`—.…°}ű._ľČ˘EËٶm Bˇ7ßôgÁ‚Ytîě·wfNńk¶<‰qCĆńż#˙ĂÎŢŽ^^˝ŘĽc3{ľŰ‘‰‡ &čx7˘oĐ»_oľŮü Ć&Ćôܟȫ‘ü°ý’’jôbË6LLMčÝŻ7»vîÂÚĆ+k+ţőŻG{łţSJJЏ|9„żţ "&ć±±×ٰáClmípqiË_ťfŐŞ÷‰*Ř˝ű{<=;PXX@zzŁGŹ#<ü2Ę;!¦¶¶vÄĆưwďlŢĽ‘… —óÍ7[pphŤąąŃŃ×ËeHĄR~řö‡k@R|c'ŤĹ®Ą3'ĚäM˙79öDZ˝FSRUU…‰‘•¤T*lŮľ›o·|ôPť—zk¤ß®\ĽÂÚĺkq÷tÇŃٱ©E˘U«ÖěÜů5»víÄÎÎss şuë…X,ćĉ ňńňęćn$//—őë7±xńŰŚ9ŽŇŇ’“›¸#•J9~ä8‰ ‰¤§¦t"Q…©3§rôđQJŠK015áTČ)r˛Uź¬úźŇ­[OÖ®]Î_ť M›v¸şşQ^^ĆŮł,Z´’µk—óŮg±`Á˛'śMőd¦g"“Ö„*©¬¬¤¸¨¸v››ťË䓹yťł§Îr+倰&–ş~ŞŞŞČÉą7łPPŹD"®Ý,\¸śőëßăß˙^‹żżęîG*‘r"ŕń±ń¤ÝJăLŕrsr‘Ëĺäfçt<î}şcmcMyY9ąŮ5ËÉÎÁÄÔ„Šň ś]śiďŃwOw|{ř6l}ű૯ľc۶-DD„qćL ĺ( ˘˘ÂÉÍÍaîÜĹüůç!|}{ ˇˇ·w~j<>ËĘJ‰*îčA9íÚąsöě),XF@Ŕ!Ξ=Eii1Bˇ+ÜľťÉÜą‹T6ŁĽ¬cc ¨®®ćrčeŚMŤŮúýVFމo_Ú{´'1>Cş÷îNĐń ¦ż1ť¨đ(Ξ:KjJjM;Â"ČÍÉeČ!|¶µá˘·kçŽH$"33ŤÄÄxD˘ ÂÉ“GY¸pëÖ­aýú÷X´h'NA"““s›´´®_ŹbČ\żÉ!#9q"€ŃŁÇSTTČŮł§ŠşŠ@ 22ŚÂÂÜÝ=Ůżżń>@ŚMŚ)/+çÔ±STÝÉÍ÷2 ¨‹IIMçzL|Íżń•<ґ㥞Ář`ĂL=•¨‡§Š›{{||şˇŁŁCVV:‰‰q;öS¦Ě$.%řúvÇŘŘ@ŔÁű‰DM-öÉĘČ"ňj$×R®‘–šFG§Žšx,ÇšĽv>Ý|šXʧÇǧ‰‰ńlذ™®]OrâÄŇŇnáăÓť[·’Y»ö?řř´cÖ¬ąµ/oM‹9ţs015ÁÁŃë‘×ůűŻż*gim‰­ť-:vŔÂJ5F˙”ÄÄ8Ö®]Á°aŁqppD péҲ˛2jËtęä‹«k{âăcéŮłO“Č™z+•ŘčXÂĂą™t“^^˝pmďZűďŕč@̵âcăqusĹÄÔ„Ł‡Ź5ČÎľťůý—ßéÚł+ŽÄĹÄqăú l ź?ﯿî'!!Ž×_“>xGĘË˱·o…·wd2üń+­´lيÇŇŞUk:tđfčĐQŹ=˙ˇC˙ŁU«Ö888rëÖMÚ·÷Äǧ&DČÝ­ŞX¸b!;·îÄĘĆŠŃăGăćéFĚőľÝú-NXŰXS\TLRB%Ĺ%$Ć%âŕč@ČąŽýq cc°±łÁłŁ'VÖVħ{ăý~˝öÚ0ľřb-Z!•J‰‰ąŽ#˝zőe×. ŤđööÁÁÁgç6acóhOěÓ§O˘P(pppÄÎÎOĎŽ8::säČďŤú<ânÄqĺâć-™GÚ­4ňróHOÉl´ë5ůE,]˝žÜĽŢ>o>:ÎŕKťěyúěi9:±éŁMlŢľ]ť&5P,//Ł  KKk99ŮŘŘŘ’““]ëĹ"Uŕä䂡ˇ))ɵűyyąXZZSP‡……%ZBŮ eä.KHą™‚›»‰„ŕÓÁ¬X°‚“źDß@źJQ%úú‘ś”Ś‘‘úúú Ę|±ŚÜssłšçammCttžž‰‰ą†ĄĄ5ůůąxzvdÖ¬‰|üńçŘŰ× ‹ŠŻaö€SESQTXDVF¦f¦´rhE|l<-ĚZ K‰j‚X¦ŢLĹŃőԛ©H$\Ý\ŃŃŐˇ() 3«+áÍ›ITVŠprŞ ź‘›[Ł3†TT”ăâŇ–ďľű###&Ož@Qţ ĚÚ¨ÎČ]\-&őV*íÚ·C,“z3}}´u´kg+E•ůý˝_éMß}ŃÖÖ¦¸°ç¶Î$Ä& ©ĄI{ŹöH%R’“iďŮž˘”4ĚĚ˝žK6ą\Nll466v™™Ť@ ŔĹĹGG3®]»‰P¨••599· …(Jňós±¶¶AˇPŢůťRrW? &©•• JĄŰZ»ŇťąŽ‡G„B!Ĺą‰´QŤ‘{\L2™ 77´´´»‡L*Łť{;´µµ‰żŹs[gR’RJĄ´soGJrJ­Ž´jÝŠ„Ř„˝hďJjJ*ŽNŽ Ţ‡”••RTTŁŁ3ÉɉŘٵäöí,ŞŞ*qqi‹ľľĺĺe…P^^NjęM ±˛˛&//÷ľ­ yy5«÷ëĹÝ~ÄŃŃĄ¶˙022np#÷´[i”•–ˇŁ««›+ŐŐŐś>~šu«×żFîĘęŢ^<‡ü‚"ró ąÁŘQ*•¬]˙9?lÝđt^„˛;‘Đ›+Ę; ÓÁ§yýűčč6}Ţ(##cŚŚîŮNą¸´­ł}űc1Ý9GͶZÔxůŁžmmÜÜÝjţŻ­M×]™żt>ö5ś™ů=%ľ?Z¸L,V­ OµµmťýĽëlmlląző2S§Î˘eËÓkĐĚܬÎ=żűlî§ť{»:Ű™uÄĐđŢľµµ ŮŮYčęę2nÜŁ#t76:ş:´k_s/uttęÜWkkLLMřeď/xwńf” hëh×ţ  ÷˝©ZÚZ´÷l¸¨úµďď]îîKĄRV®\‹ŤÍ˝Pu˙_WÄÚşnHŹűŻÓˇCÇg–ůyxđŢ=ˇŔÍĂ­ÎÖ‘űźßÝçÚĐ›`l\Jän&Ź3zÜßgŐążwű…{Ű{}ĆÝçr?r·˙h Z;µ®łŻ««‹kűćźâ©>¬­,;bđËŐ;Ŕ ˝ÁŃ“=Cîč‡ÂÂb„ŔÔiWT «®F ¬¨€5W¤b ŞjŰő˘ˇ§ĄÉ[sg=Q>ąT‚LZŤ¸JµAź—w~°%Ő÷rvĘ$’öyüdRqł{f¦FL?…¬ ±¬ĆîC&żPĎĂĚŘ k˘B+ĄÄRÉSŐ“I$Ťţ<–.^Úč×I«‘DÍ>Ůłşyz$••äćfłhŃŤv UqŻö­ůóřŞśP*)Ż¨ßŚ§Ţ–{»6řx?śn˘¤´śÓçBä7üů%Vő„‹)D•ó&•UUč4’ťŽ8űvŁśWŐ”Š^·Ţ҄ҦˇA(Í*lj„Ň„k¦÷Y)]ij„˛ÄĽ¦ˇAňr´·1Şłíż6řySR3ČČĘf@߆ł'S*ˇşZ\'8ó]:··ĺ\č45„ę?‰`Ćäú=dë`™š×;"»ť›Kn^a˝¨y4ą\ţđČWŤ5jÔ¨yI tô|Ř<áy©U˘©©IďtéąÎóŘ–g{WŢ^<§Ů%ŞQŁFŤ5jÔ< B!o/y w·ú=üź–z—Š{KĆ Ą˛Ş…BqÇkB=Řú§(• W¨—WŐ¨QŁFŤšçE©TŇNśwÇ>ł§ŹG_O·¶Ď~VŹŃ‡XĆƆ|ňĹŽGşş8: “Ő^Mýř-€çśjTŁFŤ5jÔÔŘIőďÓ˝AÇ"R©”Ożü– QĺCS(”´ui]O­ÇóĐkÝęĄčë5]Bä—‘×á©FŤ5jÔ¨iz´µµůתEĎ\_CCăˇc °ŞŞŞ©z [´5jÔ¨QŁFŤš§G@GG—„”ôÇ”J$h˝€ImŐ¨QŁFŤ5jTT*EKëń±@utt;,W7Ź'ž43»€.ÝPŞC¨QŁFŤ5jţź!—Éą‘ŠŤ…écËÝ5Š×ČLO~ň™µL(+Îiöů—Ô¨QŁFŤ5jţ)rą”O3Ý' †¶¬”¶zŘjţa„hi>6l–5jÔ¨QŁFÍK‰R©D®P˘T>!ä’’düY_cž…¸IEND®B`‚fox1.6-1.6.57/doc/screenshots/tmp_vision_snap.jpg000066400000000000000000000163461326741342000216660ustar00rootroot00000000000000˙Ř˙ŕJFIFdd˙ěDucky(˙îAdobedŔ˙Ű„     $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;˙ŔŐ,"˙Äł !1AQaq"2‘ˇ±BRÁŃbr‚’#đá˛Ň3Cs$˘ÂâS“ĂT!1AQa"q‘2R±ÁŃBđˇb#árń‚’Â3ŇCSs“$˙Ú ?ůR""""""""""""""""""""""""""""""""""""""""""""" Ć€T­ě·jĐrV-ěć¸?¶ŢQćyÁŁ´Ż…Ŕf´µŽqŁEQÍ-49…0´1„ŠT78¸’s*Íý-KśéźŽćéřŻ,v˘w/g/h„hp#‚Sj"""""""""""""""""""ő­.phĚŻ›xô·QĚĺÔ­ŘZ:ę`Ě9žíÍţ+Ëť¤UlcĆĐv•áŢŔwťö,‰Tä CuߏܺÁIŽ€9śZłĽĐvUA\ĘÂéô`opQŰ—ę’ś‚ÔąŽ±qď^ČA«cý¶˙w?ÎŞhĹ oŹ7…°ÇµínÔDEô˛drHhĆ’¶ţJAâ jžYćĆ8Üá•r%y/h̬ Ź[Ş|!KX±ˇŤ «Ş°łm¬¸kw4Žă»°(\íEbá©ÁśńwP[ŕÖ—rXÄ* ĎÍ—RÂéÔŚ7‹Ź¸)]/±k5ŃÍÍÔŢĚŁőŻzůJ¸7ńĹD$’I̢"âI$ÔíVQJ´ddSSřHĐsREË im¸Äç!ϱ^éĎŽ) ňč-` ćv­…ŤßÄŕĽIR(Üχzšů"€jśęÇÚ°ş}Ěl†ćNŘţQLhy¨µÓNƸ’dpĎ3EŇzŞĐ[ŘCAŹ`*Ě˝A× śžV€4 ăŽ×ŞŁËcšĎ3Ą.đ—pÇĆ–Ť €@äÉG˝µmÄdŢ^±á°GOˇµö”răBł˙¨®kÍůp\kµ7a\nçlč\ć¸T’|ś‰\Ķ„‚¨+}ŃCÔmé¨6hü®ÜNĂúJéşuĹbkĎÝB¨E˛x čr9­s’Äřžčä\ÓB¨ Š„DEá}DDDE&ĆŘ\=ÚĽ,ö•\ě±Ëąççu;łdŔéۨŃWx(n$Ń#<‚ś,˘Š1ˇ´4Ó¬PŞŰ§Ź0±¸†áQĆŠŰu¸üĽ ŚSĚ•” ĹîTk©µi5ŕÚŔ¨Úęp/vÜ‘xć—6 ŕQd Ë›ŻäěٵZÉ{СܿT”ŕ܉e,m@ŻZ„I$“™Yýăt6هCß»HČ)"n:Š""ćÔČŠN×™ąZłś¬ţ]G®ţJŮĽĺ'Řßç\˙§™ŻyµŃĹŘţ—}ŠďÖ®.·¶®ZÝO`_ˇ®txŐÁżćĎÁfÝ ßÚv?ຆ’cŹ‘c~zĘ× y/#?ş`4cMGP[`†g·\m'Ź;ŘË’ékŽđwwć:Č_',l.v9n^M 7Vň[ĚÝQJŇ×´ô®>8$·¸—mąĆk ţ¸Ď…ă±v3G,Nďó˘¨ő”“Aăj+weWiúăůŘ~!ntžŞÂňćCyMssU›Rűy 2ň 2ŻÚý‡ż"¨o6á#˘ççđHXńÔyŻ [˛ŢţÍ—âÉQĚs©RîŰH{H¦?)ä·.Łeë*4r;Ô='ä´¬ďčóPĐ+•Eś±> opX,4´–¸PB ŮPľ".ŽČ2ÖÂ'»-:Čç«.z(Ý$€SŤ9+»ą9 Śi‰4q4«[ŁZ>Yí'@ĺ.ŮĽŠďU.Ć­ Ů]NîQ®nq3ĄyÄś!Ŕ-YŻH 49Ż*şŤ-hvŔŤ & 8‰ [â´¸jcNʍäŁßYIDŘ–¤×TŻ®_ .|lÓćÇ!Ľď_Zći.Zf™®n–űV”EĘ\\Iq'ą%+J`((¬€ DDPݍŠçŇlŢăňG#żáÓö«?[äZÁĎŻh ŁbŐ}<źDZiÍű–˙YT‹Qž/ű,qż0 ŻňŤ_5›pkÔm‡ĄŽ>:—kcd'¶‰úČv–ÔTS­#t,!ě 4šµń૭ÁÖ‘(ŕĐě['‘íi-ńljÂäç’I$p{Şkµ^év–â6˝Śn·ÍŹă«lń2FTbŞdi…ôůNJU­ë¤%ĚsŠŘc3ŠHŔÂ@4­sě ÝĽŇ[I¨l^:·J÷EöcŹe% bŢ N!»nŕjϦ99uw=¬rŽň+ÍçcŠîĘHę´â)›\2r©Řw9\×í×çMíŻwăgt®§§ugHÁ˘ź¶hęúNŢĺwk3F·‚ŮŁhSrkţNQ·źO˛X‹höâ×QrĹ$2ä\3 éůl~˛íDóT×›MŤÝŔ’Pi^ë5ę[B9†­CÝe÷p?"¬ŘuF4ËW2•ö.ByîĺÂÇHăÁ˘ŞŇ ‚Lî^î1ł?IŮŮ[ln†Ź,Aţé¸;őŠ×=„0ŕÜř4p^ěú|dë¸w.Ć Ďi__Öu¸¶>QĂ⹇EmfÍ-\JĆf58 â?MÍw?™!ĐĂâUݧ§­í€Ł{üÎ+q÷ÇŠ!¤“p ÄÝFŰ‹‹ä9®1űeËäqkŚ|çŘ­6­Ť’ç3YŐŮ{Yţ—)LÖV–-„žŞ^Ő„V…R—¬ĆCyOßf‰ěN pôă9GW7Oň$a†®č^IpŢđ§_I÷.eI ĆŕAŞŁÍĂ\×›—ȧ…öóÉ‚Ź‰ĹŽ-4+Ü\úVŰpÝ&Ľ–RŘćpp‰˘†´:Ťs*“qôĂáÜ|‹i­ÝŽ˘u9”Í® X¬gşd‰'N“Z™]dJ Ä849ü§H4ň×z˘Y˛ dkM9đ] { vôžlźSňěnI-”¤ăäµ-şHu ďŇ=,Äřݦţ2ykťş¸sůC´łpĚö¬n\e:#Ö†Y0»ŔZ0÷/AĘŠË'kŤŞFĺ\HZ(ÜÁ‘bZ©X™FůŢŠB!ó`ëřŘß*Üi`Č7µ® Ž[Vۇ9¸3StĺŠĹ|ş&×ÔđçO“šľ*çÎiip%śĆGçsyvőăîUŃÉ,†• r ŇÎĹŻ ďt•ťsÓcyףM*\ŕOj ëpjóCö‡ă ţbR ‡@ŕNj\Vvńň*çd_ö:-ľ=Zë9•=¶Ń€`%ąBGR”YÂcmI§›j§5ŕČV›† ¶ÚÚW¸<Ť Ćşłě lv”†'šßĄ”<Âň9siĂ’ #®ŤŹ<8ܵď'z¨ůžę‘‡śaşqĚ`V—JčÉo±d] Ó6śÖ™ Zqsr<–vK-»„nŃqmš6´Ż-n59”2÷‰q©)$Ô<úi—Lq<ˇxX%EGĂŠŁĚĐBŘcgţĆŞ칎eYŠŘ=Ŕ»•›M> KîX3*·‹3(Ďcd9 ýą-.’ ›Şş»B‰-«%«<¦éćs[6Ŕ^uë[…”!ţaŚóQ\u‰*4Ç ńs©˝Ůx.–Ç A]VMBş2 ťš~§ ź}-ŔŠ8A„DŽ št¤6ÖGTLXúç…¤˛Ľ–x×1‚Hň{Yâ+_ś'Ó Ďšq 5Ň=ÔpŁkŤF&˝§şmácDQű`Sš‡´Ó&“Ŕ[w·$Ői#ˇqĎO€őł%Żó·í­Ô:š3–¸vłÄěG3kĎ‚-«â5n\–ĄźXw+nN |˝˝ŽwćąËŰâC™»hďú¨&K;¶k…áŕňá×ÉT_XÄę‚ âk;YÜKăÓ/ýŘ·ţÓ~Ő m¦čc ÂoĂ/uß´Ü=ËĄ´ż‰íÄŐ§Ľx*HÖ;ÎYÁ˙Qü1qbčÉ,Är9¨¤W÷Wš´ş´ăŤ*Ü?jl$>6‘ńSÍa ­÷ pk˝5ĺ?EłČ jp{IčPŞNnŽi#nÉâ3WĚAíŁ@7 €–ĐŐŘmNn:{U ·c+W§yţ’ĂvÇ1Ő"2ď™Ŕšâ·Ü6‡<,Ź&G0‘ĘHĂ‚ćg•î™ě.I-«vŃF•ŕ:Ť^62ŕ\ăJ(ÓĘ#Ô-2^<řrR‰ž*VÄâĺB^šćČY˘]€ůkÜV”]wP«Ścu_NコąťĐ?!—w™<Ę‹5ÔŻ xT:zŚO˛¶w\Ć«Ç?}9mĐ“ČO÷…f>Öh÷\‡ěŰ]”U.ş”Ó9ÁŹŤ¬"€ Y–Úâ¶ţ'5Ö˝ ߸íĐđó˙™k‘Űü@ÖĆŮŁübJŇŠĆw ‡ [—pYôĐ:?ü¬ú­íâµÍg — _s»îĐV°ZÖýĘűµíŕúc¦b:é÷­«K+€Cy‡ę*xí&$8´oŻÁ{yůHśZÎ󇪮ĽŤ%Ň´¸P1K›Řâ«cďÉĹÜ®{Ü÷<Ôž*ÍÍÜí1´ ‰iC«7ęVĹ˝»€“Ús+ÄDXJę""""""""""4eLŽł ÝÄ«¶:[ÇĘ5Ť¦§;ÚW—<5c:q8’¤D Jí­-#µ1ŤÄ|Ug8¸ÔŻ ¨Ľˇ9ŕË ®ęúM02Łć‘Ř4v®›oŘöűĎK™Ć5pîĐß˝x¸¸Ť•÷©ßôŮţbŞÜ^Ĺwú[ź~ĺC¶úpżŁŁg•8Ęü`Ě®«nŮö˝¬‡µľ}ČÇΓÂÜ‚™%řŃź T—NÔqYň\OsV˙ĄĄ»G±ĺşąş¨'ÚŹĐÝ˝§j´¸ÜxŐTÜî’µuŤ<ŇČtĆ Š×ß,¦łI qľÇQŠš`ľĹmb® |VąîÄÔ¬#ťÎ@ŞŰvv»őT9Ăćy®*’ďÔ/st[6„$#‡CT]F[AĚďJż.”~Ű =NŔ+k™YjÍwl`â5>Ŕ©®wé‰-µ«őş•ödŞĺ–Y\_+‹Üx“UŠĹźŞ\IO¶ßÓźŠŃ†ĹŚĹô‘Ýśľ d—3K'™3Ś®üd•µ—ďgČÓíQ‘A őĚ!Â)K5š»,OUŁHĄ0 Öő±*Óúî ĆYÇ ý=®§9OőW2‹ÓúŤŰüŇ“ŕ«Éam'ť„˙}Ăć»?÷Fíŕńč[ÇńĂËŮÍć|ŔHÝ5č:j¸TTĺŐĎŇ÷7ŕŁgI°i˙@ćsŹÄ®çýò˙â›˙#¨µ»ř…hsoźĹ0׊Z±ŢgĘîŮźőRŽźd2¶ŹŔź‰]“żlá·cÓ1?úÖř…'Ë`Ŕzdq˙”.AÖŰ1¦ É_űŻ˙‰ …ˇ˙‘řędţ î&ľ]´,ĺ]NĂÚęÝöę¤ŁŹ‰Ř5UsŁŽ= 7Ě÷ĐdŃ“FA]·sWľIJQî«»\r ÇôëPy`Śq-V“]É9ó._P:÷6ŠĹóä#î3ŢTg=ϦŁZdĽW.ú٤o·1GJ^wvťĘf@ÖÓ†@db™LŤĎ8eĬTÁ@2˘»ajˉ{¨ÖP3+ËÝL¶Ż#‰­gÍH`$PâxŠ2ü˛S"€ .ĆŢŢ84Q  4ŞrHy­ÚĎ;´±˝§®ěöXĐűć?F{hĘR'ąełuK#chÎĄGsvóP×i3—ćł§¸•çDgOfeOšę #kY‹Î–±ŁÚJÔ÷¶2e•ŕ32÷í\ŢĺęXŢß.ŐĄî˘WŕPTw7·wD~bWHA8ˇ’Ŕ—¨Ĺoď8ŚÁĺŻj[ô™ž}ş“«V.=˵źw·q †˛śŞ0ұlÚś -kx®2;ąXÝ5ÔŢÂÉ÷÷n†¸µąP}ŞOęÖţÝ@vżOŐgúU0iď+®şÝ6űAWH5}#îT—ţĄš`Yl<¶}G?b¤$“S‰Eť?Rž\Đ8f¬ĂÓˇŽ…Ő‘ß«/”’É+µHâ÷s+EH’MI©W@‚""ř·E/t0đČ­(¦·ťĐHŢÂ7ŤËá…oa&.Śäqjcî`¶•Ŕ§ŠˇeÔŃŠ1Ô?W¨’MI©˙9-ƆóU’Ď4ÎŐ+ËĎIX"ÉšćYOî<»†Ďý˙ÖGďW¦p»N-mzň\ń$’ŃťBř. ů#;ňŰŻ×G·â—7x W€"Č\b6ÉÉÇi ăj†NóoXKě^G™üCáßŃ_ýd~őřwôW˙Y˝^łÂˇşµ·tľ˝[™ <†•zÁ>š©ŽÇŹ‹™ž>.© ¨“*±\d)ëÎŘĎY9Ł'xu„ľĹäyçÄ>ý˙ÖGďQń‡Eő‘űŐë¶"ćK˨î.FręٰócÓšŁ·±đŹKăjňQ‘NÄ’pO=XÁĺŠ2w‡XKě^Gź|CáßŃ_ýd~őřwôW˙Y˝[ć¶đݤŽ/lCoŇÓJöŽY>m˝u{Äúi,ôÚľdÖ¤…)eq«;duŠ2w‹¬%ö/#É>!đďčŻţ˛?zŹ|;ú+˙¬ŹŢŻCK :hŮ¸ě „(Ôťąă+Ś˙[×%µđť!./m+…\‚Š ÂÁÓü)ä\ì%ö/#Ď~!đďčŻţ˛?zŹ|;ú+˙¬ŹŢŻYái}.ĽFö+‰ ,€.yך­¸±ăˇĄ6śf#8é6Yȶ’üľzY;ÇÖű‘çřwôW˙Y˝GÄ>ý˙ÖGďWŁMcá8xxĚ(ý«dşl°zň6ós멼2+ŕń% Ä] Ş…:öß`6çěŁ'xu„ľĹäygÄ>ý˙ÖGďQń‡Eő‘űŐé÷đqx’Âđ@šPě6Őź<÷^ŻÁ;Ść“Âí¸Í˝Ń~!Ĺ!¸‰‹ŠĆŔ.6äsŰžTdď°—ŘĽŹ2ř‡Ăż˘żúČýę>!đďčŻţ˛?z˝#ŤZqkž!pŢ mâĐdŤ ‚Nqź0ąM‹úwcÇ` N©ŇąěĆ Çő¶ćNńu„ľĹäa¸đĆ+‚×–ÜEăĐŔbŕ66$kőб»áÜzKIVß…qEĚLyşPaq“¬ő‡Űc}«Đ8rÝEk‹ű¸§ś±:P:€ű}5/¤OžľşymĄČKäóeGž5‡čNĹC‰ Ý ăŘ•'¤çś€{1UĽG„xQ5ÄÍeaÄáéč”ÝŚŤ‰lťg‘ Đ.żUéçŻ®Ž‘>zúčjâŽ)ĹÝEsńOkpÍøŕ¸č[ĄĐe †9é3‚iÁÂ.üESžyůŤWqžáTüNI8Uź‚С$ąořgíŻWéçŻ®Ž‘>zúé5rQĹĘ.ůQăřwôW˙Y˝GÄ>ý˙ÖGďWłô‰ó××GHź=}t˛w–u„ľŘů1ń‡Eő‘űÔ|CáßŃ_ýd~ő{?Hź=}tt‰ó××FNđë }±ň~_l|Źř‡Ăż˘żúČýę>!đďčŻţ˛?z˝ź¤Ožľş:DůëëŁ'xu„ľŘů1ń‡Eő‘űÔ|CáßŃ_ýd~ő{?Hź=}tt‰ó××FNđë }±ň~_l|Źř‡Ăż˘żúČýę>!đďčŻţ˛?z˝ź¤Ožľş:DůëëŁ'x|üľŘů1ń‡Eő‘űÔ|CáßŃ_ýd~ő{?Hź=}tt‰ó××FNđë }±ňzúę7éd˛uµ—DŮRĄHĎ”3ĚöfŚťáÖű#äbü á|~Řß|uͨ'CÓČ8Üă«Ů±Ĺj®-%ntC|A—äe( ©óíŽóŹ>:ŞŞŢËÂhĺáí'‰Ń-Âą)ŚśíąČÇ<ďĎťh®nnUâ[e‰Ł ôŚeŇFýCű*kłˇŠ¬úYąµb?¶Cż¶IĄH±#*öÉŔôŐ@·˝‡ÁëńĆbłiôĚVH#„*tڰN=]ődËÄߏĹ?Ă•xt`HËě9úsęYÄŠ/ âĆúčM ‚`@ŕč]Gc€2qŤýYi\ŞČĐY» +pŤ—ěou;%Ň ¸ˇŽhä#1 ,…H0Îzé‹0>ÉÎ=‡Ýí®XŢÁÄ!i /…‘˘:—Rś…®îH‰%÷ąÄ–Ý pEv"v3Îé`ŹüIĽ˝âŻ{w—@‘ZƬď4ÁsIŔÁ<…OŠkyf”!âm.|\‚{{ď‚")řâŠ{âi"Y]K(~xŽĎÉ?ŃJPĽ®źŠ^ó˘I5$•b2UŽââ7rZYĽČÇ#ݱç8˝]â¤UČI5 NÄc4Ř‘$/‰ 8loŚÔÖ÷hrM¦–v·féc`\PŰěpPś ÁžjŹđ××ţöşúnŹ˘ČĺŻůĆő3 3T(ÉÂŐLĹt˛N°˛I˛r»®@ę'¶¦•îŇĐVvµĘŢ+áđŢ% ·iĆYź<ŹV7ű{|ŐŢ=Ć$±Š×ˇž8^f-™¦HĆ€7mł’ĽŞÂ+¨.&1ŻK¨ňáe6“ąçëçĘ™JĘk˙€–s0$aŁŰlő‘ŽŁB§Rîënâ š×WŻ˝[ŚŞđ;{·şHúB¨eéNs†9'N68ôTŽÄVţ,Çr' ##HެŠHÝväE8×6˘ajÎ5r @Ĺ1/¶´ťáčĺů?(˘®F{{ BmAvôż0©VŐç$–ÚŤ)yč%Bcw ąńy±óŰO,óęĺRnîŻ#ĽŽ;u.…s!*|Aź+9ßó|ŮďĹ<(áĽ"ýl®žnśÄ&#I$úš›wÄá´ź˘e™Ű˘3`(ç’qS©Jj MY=oÎĹđ—GÚ’şz§žH`’DW‘—’Ď•Cŕ×÷wŇ®ât*bń´4zµĆýÝGŻŞ¤Ĺs°C*łh•C®@ŘOeu®’$Ž\ĘC2…)c’@a°óŐQśe7Mk%ÉWIŮ/Ż!q]Ë-Ţ ZJjŽěa:Knsçę|UśS‹5•Ĺ´=3F&•ŰNF_Vç5gń›Énd3\hf*C©RH8äGš¸Ž“® OfŕQR2ŮhÂJMv^ĄTţGłżiZ5¸*şäH$çł‘§,řÚKÁĺ˝2´‹-°Ď"9yU™E*ĺŮ\P„2Ż pp3Pq•÷ŕAÂŁW\y•śŽÇÄŇp˛‡hpĚU†0zľÚc…řOâFŐ$Ő¬@JÔqWZUUŠősŔ{ű 9š9®&P2X` ňĆ2pvçBŚôÔ2ÔŇňńÓs2ţńQÇŇ1[fż6ˇ u€Ŕ6ĚuuŐ·â÷vwRGÁ@Č ÔwČű*}żá—r¬p_ŰK+xÁE-ęçH‚˙áOt±¬Y¶ ҇—UpI>/aź]JśeßQ¨4·ý˙¶KšâHěŢ`X‘‚|Ă'Ńą¨|#‰Íħ:ˇ\—8/¶űuvyđz±™ÓK{?ÁíZÎy4łŽč1p»cRě{joĹÜ[ńHľ°?v‡›5˙·©ľqőŃ©ľqőŃ%—Š6‘íb  ’~9ňŐw âqN”ŰÍ ©SŇA2ʧ%†21¤Ô€±Ôß8účÔß8úę¦ëŽŮÚ\͆]PčÖ@\ \±““čĺVNËlěĚA'; mX¸ć¦ůÇ×F¦ůÇ×UÉƸ\ŠYx•ąÁ+÷ĹÎG`ëĺK‡‹pۇD‡Ű;ż’‹*ę>Ž}b•€ť©ľqőŃ©ľqőÔ+K™ŻîžŢŐ#iČ44şN€'ÉÇá/_]Oř»‹~)ÖîĐu7Î>ş57Î>şWĹÜ[ńHľ°?v¸ÖU±´‹dü¸ýÚć¦ůÇ×F¦ůÇ×UĽ?ŠÁÄdu‚h%UÎZ ÖP HĆŐŰŢ3ø|ë ÝęĹ+c Ü÷8]µ8SśŢX«±]:›ç]›ç]'”j´qţaŽSġT‘u)v âă9 ňsµ@e¦¦ůÇ×F¦ůÇ×Pʵ{Y§·ąŽŕD…ŠEnC=]ă×LŻVš8UíĚ’°Xצ9l•Źpu®#šv –z›ç]›ç]+âţ-ř¤_X»GĹÜ[ńHľ°?v Ôß8účÔß8úę?7|*Í®ď’ÚŢÝ $—AU{É›+Ą˝¶Ł $ 0e#´±@µ7Î>ş57Î>şm]YŮ6WÚ•ŹĘ4­M󏮫<"fűź˝ńŹŢű|â¬qůF«|!໓ň¶šÜY]K%š4VW2ĹŠ]Uq•Č;–ľĘ¦›đuă0^ŻV[`á#/E—ΦŔ8,sΩŢęáÄÖÍ<†™ôÇ«Ĺç•5\ĽOĹz)¸RŽ«Gs§†řnx)Ô–ü‹›ţ%Á8ŚÖňË ňnç Q$‹Ť%ţv¦qx7áß–% édřEş˘Č›Q8ĺŐYŞ*…ńĽBˢěíÜhęşKfÍ4^đ¸-"¶Ž Óq¬K®0IU öňě¤ZxCÂl ča‚đ'ť2Ośśî|őś˘ ţ/Y»´˝GŐ”ílĚÔż…ś9Ő”Áw†>'ń¨–śo…ZNÓ"_3° –‰wÎ;1ŮööŐ r…ńŠÉY$YOîfŽřt2™ĆOť^+î7m\łŐČy¶¦—ŚpUż[Ńo}ÓĚ óŰ>ł˛¨h©uÍ}ě˝DľIÉšá kľ›ˇ˝Č:´tcIoťŽÚfă‹p›™ä•—)“•c\€ďęŞ22;Q 6v;¶ˇ?ŠÔ¨’śS·2şźĂÔYjjżŃcĹźÁţ3ÄVúć>$&~M@A'—ůŤIââr ŹĆqťú˛ju·…Ľ2ÖŐŕ†ÖéRW/7É)ér0Cg« ş…dčĹ.¶«öŻ_ě:˛—7čkěĽ,ŕ|:S%§ ’':‰eŚäęĆzúôŹUN˙ň5§â·«ţ5‚˘Ž¶«öŻ_ě}[O›ô73˙ę ¬öňEĐ]&µ+©#ŮČöUE§„<.Ő¤‘ű™BŹ$XěeÎk;ŠB j^ĂöÓ_«oĄz‹«is~†–_8\Ď#2qŇhÔ x§;vĎ#Ú*OÝwúżŐÉâş.¶«öŻ_ě:˛—7č]§đr)‘đÉ‘†7X±Čc·ło=*׋p '/mĂî"c̬{ťóŰŰ˝QŃG[Őä˝±ue>oĐŐŘř[Ářt¦â+ “9 ¦<± ÚŘöăĎ€;*ŔęM™8Ó糣ţ5® <`óŃÖµ8Ĺz‡VÓćÍ÷˙‘­¸ý_ń¤K˙¨v˛Âńüé5)]KČĎXÉĹ`ôcÉfÚ\qO!Â'IŽxŰuĄNK×űř}5«oĐĐŰřAĂ-Ąiâć‰9'ĹrjD\VĂ‹^oÄ“ \(ś¶FÇĎćťXb@LŽ\Žk6ďnB­8 ‹ńÄ ‚5RdłâžleYKâug5–ŻĽÍS EEämŰČĐ'icI#±»du ¬îŕůUZÖ\0éř-Áů-[ÄcĘä3ËÎ|őiĂC|]ht‚>  <ĽQŐęĄ>G‹' ~\ł©k·s\ÂÖÖŢń—†]ĂÁŢv];äxÍŤ\đ=•b—v°Ě˛'Ň,‘¶T€ľ)Ęě@eUó’i侨‹cŰc4Ť`ů ·pÚą§¬ĆĚ{IöŇµŽµ`{łöRĘ1!ë <ŰĐ#PrFOiŢ»­zÉŕŠ:DęuőŃÚ䢺<Žh¨Ç(®ŃŠĺbŚS˘Š(¤‰ĺ ^Ú]%üśüÓšqÜLV(®âŚT@ĺĄVv ŞI=@Ti 3„'’/ŚçĐ(!:‘‚Ľ™žKi k|GÎsüiî’8~öЇç6ýÂyÉ|ç.y3·ŁřSÔ§Ąśţ…eÍŽ…‚1˝!ůŇx«čÍ&K‚ăI%—ćăJŹňŹŰ\6ěŔjü7ůcŻ*˝+¦ô˛±˘áö1? łfyÁhíq @<`W Ś_D5Oź÷™>rţU3gÄľĂěău‰OAîKxR漚;ř¤’ÝTtL2€7eĆýć˝uťÎ‡xťŚ+Âo4ç9ŢâCÔzµTÇáđëlÉqĚź÷™;:«ďŻŢçßt1E"d É8lljLśSMËÂR!&˘45Ŕ=ŢšZ†ieĆŤSŃFrn¤;ŻU¶Q;fŕa;™˙µv9®Źś‹0[ŁŹnmĺQ|÷+ap Lˇß¤_[\8>pŕ˙˙Lż˝ÝQí¬aéďAyĆ.1ţó'ŃÇůT˙Âî#6ę¤öĚi‹Y®z{ĂđL˙´ré>÷ Ë„QťSď4cýćCřCňŞGŔ ŐŤw˙š“÷Ş=ě÷Mz­ľŹűĐSĆňhĺDkUţH2Ѩ ŘŘÂmIŐ>zi€ćAź•ʨ>ÚÇWF•‰éŤ3¸űÔťDš™e5ÂÚ’mÓMżJ÷ŻPxíĚ—1Ŧ2$!őç?#%5{‹™ţţăüVűk¸®qţ3}´¬WĹ˙ž~,ő8_đĂÁ ŬW+9yĘ)XŁME+M˘ŕ&»¦»I-ľj>ÁM&öÎŕ ɤ䷒0;Mt.NXäű*ťŇâB…ď<ɦ枀şŚň™ôS3ÜM!1ÚŚĺKĎĽ(ë;SÜ9őjLH$łéÉnyű;ke,5ÖzŽÝÜLµqt‚¸ř˝:c•ÓűNô±ypäÇçq€}<Şx˛‰Pk28S‚Ĺą€ymśŃČr®Éc‘–Ř!ç¶aç= ŤłŹH%ĘťĚĆń•ˇ«JÄ~c"Š«ÍÂd ÖýjwÇścnţăVQȒƲFÚ‘†A¬őhş}ĄŞ|MŘ|L+ÇMůŤ4SŢ(čÓ©qݵ*Š«3ćh˛ŃŻk~‘ŁAúFö{©tQ™ŠČF—źÖ(Äť¨}ĄŃFf;Ěź1KřQ©ľŚúĄ× *ó;öuÓNüÄęíFŚý•ÝkŤĂcó =˝Äę]P$cś’O,ŃŤM›†ůÎt§ s>Š4(ťhÇMŮŘ€ d `•äÔµ‚η2°ć±ňěv™®™—RŹŔJŽĺý4YVI¤čSđKz–‰Y»•JuĽžUę)îJ©XôĆ;#ý­Ěű)”†âe: TëŇݤźÚiđ"€aWS|ůÇŘŁöÓRÜ<Ťă)“ł$`w/!íˇ]hŠăméĆýěÖÜ ł4Ǭ!ń},vĄt‹ÄacŚKččĄu×3tKŰ)Ǩ{«ˇ"Q…˙*Cˇ}\Í+±K-˙’Yź$6¬Ĺ±ŕź›ą>žtt•uŚž˘rÇĐ)Ă.5ś|ŘĆ…÷źe 9PB@yéý<é;G¤jĐŠŠ”~™ŽźţŁz±ŕRă0#‡ńT_$őuŐN «NŻ€°Ň0üö'Ä5v˙4|Q ô’¦ÜĺwbZY]˙qţ3}´y›öWŤĹë^~,őXm(ĂÁ ĹÚ+) ĺÚáŔ; ÂÁyóęĚły;Óű+ˇB÷ždÔ¬–âßa8fň¶ť+ ]˘“w *ą1F!Śáß™ě^şźYŰÉĚśBsťł ďă[04•J—| kɨŮq&Ú2`*ă@ 9ővävú»ŞćŢÚi"Yem¶Aą'ąŽdíŐT0·6<ąl~ß]hmř” ˛.ůß=ă;ţ*ß()=J'F *¸ńdu-€Úr51>0*3ĚdެŽúT!ŁH‹nFCq¨çĹQó‡‹Ë ×'déĂ#|ˇ ęVÁŘ‘ąQËbpIÁ®,đˇc »ăÄíśťą‚Ř#帬r‹q3M)Fä>7f^Ůůc:Č …;väŕť÷ßsY~Ä>rmĺ?"í±ů¦´ÜFí&‰°şpŇTÉqżW3ŰŢkq÷ÂG*Ű„¦ŞAÓžĆÍŇ©š&Ţ›–x –DAůGśŹI‡DFe]•ąíUrĘóąwvf'¬ŐTľ9I©»%ętę|F vŮş0AÜ]ĹBᏎnřÚ9cz«$„\gŇ}UĚ©O$śyă;Ĺ0; šN¬ů ·ź«×S‡é ÜÉ žJ|f=Ę)Ţ–+˝FüçĂ?«¨]p)–!_,u}Ät˛™ĐI3bícŚţÓč§•mí‡ÉĆ |ůG>ĺ÷ŇMq/É«´‡¬řÍëęôbś±ĆOÂ$ÔăśqnGyä)9p)›—ţä­Ü·yäťÇ•#ujßĂĄ›R72écřĆsčęô×ZčF BKÖ#ć{ŰźŞ’–óK˛(şŮŽi¤%x®ĘĘą˝ĹtéĐ Źň¶gőňŠeÄň“1Ď7Î㽍=‹xBô­ó¤ńWĐ9šn[–aް9)ŮGrŹŰšhQWw‚Ěů°X"\ęs+k!ŢÇaJéş?˝éŹü=ŰôŹě¨č&ť´ÎG, ±ű)Ń«i’A«ć ÖޡM«2SŠŢ´˙ „6ĄośN[ÖiLůŃ­»q“RT寞VÔD~ÓIi 3;ŽĚč_P÷Ńw˝ÇijP˙CFĂO üÝZŹ«zqP¨űŮ?•)Đ=[šH‘”a1ěAŠHçCú:˛úĄoFB¤‚ďŹţ ={šźŔŽŕ‡ÜîŢIë;Ő}Ypí;źý®ĂJőcâŠęĐ„iÉîíÄľ°7†Y•K}"Ţ=$±Î4Ź55vgřPÚ´f ¬Ij]±Š]Ź˛Ź†ŮŁ^Ű+¬‚­2‚Q±¨ĽJęÎäˇâZŚ<€®­J@Ř‚=×°K]N ˝´żą¸ny-ÔüC¤ËOVŢqRnlŚ÷I5Ť„ŽIË8É8ďC4ö[Ü U†ŰȲI%âČXi8 5ĽvV•řź éýqţ3}´ĽSz§¸$oÓ6ăľşUTdČTůŰß^G“Ż?zŚ7ř!ŕŽů›öR©żů%Űó€öS_ímGž@¶ŞÉ›‰fk—ß 5` &NXäű  ŹÉOü×T81=ę-m‡qĘ)=k±ôă죢­úfˇeĚzŠ˘‘Ń'ZçĽćŽŠ?Ł_UŹ0ÔéeŘzë#vÚ/§cĄc·}k¨ä z+;ÇáŤ.ă‘OŹ ń—»®ş_ šU9˘ŚBvRäE†é€Đ|`F0{9ÓćWfČmĎő×ßí¨@#5"2Ą€9Çmu'M't8ÍZĹĺťč†=GĆaŤłścĎĎť¶ôŇZv8ČĆŰlyă·n|Şg—X$ ˙\şÇŞž]đۨvî¬rŤĚµmq©Ć#ołŤ†|ÝUQu+n*űVăç#ŻÚwţ¨±–RÜméěű9Ő´efrë-JR)p)šT`30Q“żž‡\HŹ5Đé,gu2łŃ-,#µ‰c‘Ő´(!ßÖÜ…<÷]éBDF|oKŮX›.1sh)Y¤v;Żul-/8l° a‘g#›Ht…?š7őí^g†©NYž·:´«Ó«Óoą\Ü"·|~cŇIűińĽCTŽfaŐÂŽö÷Re»i@Q–KŚ(îQűsK2îA žJ۱îZČß3KÍęň/Q©8€)Ń *ź1ŞúO3K[Y]Îë'q«l÷/3N™ŕµÚŢ=-óß ţČ}µÉ-ĸPěí×ĺ1ŁĂAB/zjÝě{Ą·¶8…±řrŕ·ˇyM1%Ä’ľ˘Yź©äú;=÷ĹŃÇţöŔ7>‰gôőMx Č¶Ť!ęĘ ąďnŻE=8Ë›Ež^ s˛Ä\‡sčçJÓ\±ůÓxŁĐŁ]0ňÎ2¤ó ťGÓΙčűǧ?m4—ŢŽ¬ţ§eÉd™. ©RŇRŹG {饙™ ŹuŞě=”Ó <ĺo0Ŕ÷RJNN¤d_Î\“ę5%ÖäŁJŐ!ęáe_)€ď¦Ő]Ľ˘[Z°}”â…S÷˘ľp¤â‘f`Ö’»‡íĺGĘJĽäú©aÓ¬éü᏶ś\0ĘGÔ[·\kŁcĺ9îgŔbUă00 >ääů&˘«1šîoôš· 7ÓCĹV·G/ňŃn§±¶™¸ŤĐi"G!Dx¨;xľz{ ¸˙‰]˙ÓýĘç ţɲ˙–Źý¤×±<ń ¸˙‰]˙ÓýĘ: Źř•ßý?Ü©R?Aq˙»˙§ű”tń+żúąR(¦~‚ăţ%w˙O÷(č.?âWô˙r¤QHýÇüJďţźîQĐ\Ä®˙éţĺH˘€#ôń+żúąU||ÜCĂMíÄ©"Ȭ®tnÝJ5yTľfŻ|źöd¦·2Jš¦¸%›3l:éĹE_$\OľÜŚßm( “ČWŶń]ďözś2] <—ÉńG3ĎĚ)XŰÚ¸ î[Ę>Ď5*ł·Ŕą!Çŕőy«¬ŞŢRŢ)GqHň“Ô{)Ţűn:0<–eî4bAÖ­ßµ9Eź˛ÖG”Ś;·®««öuŇń\*a€#Î(ĽybŞřĺšĎ¦UĚ‘očë«.Ś$˛÷1 ëV„b­ŁQҨ§± Ç<\Y†ÔW•p9Ď›˛®xß‚Ţ1ČÓČťŞŽ˝n¬+SĎŹ[<%•—Ü:XŤ¸)RI,ç ·gŻÔ)sÍ ă0úvőóŞ$žH÷FÁíĹ#Ěw玮ĘSˇ™ęUť­™r—«%¦¬1%FrzůëÓN]Ł3•#Ćß>~Ę©±´Ŕ‚®Ż Y4‡ŇvQן>6¬•ˇrYJ*Nú"šk`s§p6¤AdŚŐԶꨀ˝‹ŚňÁôó?Öi»[&wĆ–ćqŚwÝ×TĘ·gS,“âWĎk… 9*"-äDěŚ:Á­Ű82jQÚpyçúôŐDđŕF¬P§Vú2µš.č»á^ü†h’&Çßă]ÉóóǢ­c¸’ńôÄ 3ď„ńµzzë±’qč©¶f÷‚łş >ůp§ŞłŐÁFwtôgCŽČ˙‘]ó6ëĂ’ď%ŇyôQá›ÓÔ+’_,Jc¶A zŚ{ŰÝU6üEx„=,/©:ăäT˙_ů§CĺϲąRĄ(;Ksµ}*Rś®»¶ÎÍ‘śÁIĹŘ(±ä dźE8mg2é-€4[™s”)«l2Ě™Üňf€ż {iô·QžŚI!ë1Ć[ŰKÉô8˙U_fćžĹ/MěďŕGTUÜ űO:Xî‚9Énżš¬çŰF•ëšfó&ǰ‹×v.žoéüč6a>V=MŠAž$ŮäŤ[ó§ş(3“1í—>ÓN,Ś1˙ơ~Ę3FÖd[®ů":ĚhăšOĚŚšéŠW9ř g¶B«öštË/)df_śOŰKĹJ;"9*=ĺč0¶÷Ψ"ókgö ŞĎ‚BËĹáfąw 7Š*ů'ĽÔ@*Ç˙”‹ążŇjĚ5VëĂĹ~ĘŞŃJ ¶ŮyòlżĺŁ˙@©5†˙dŮËGţRkŮ`˘Š(˘Š(˘Š(˘Š(Ş_ żłWľOű2UŐRřMýš˝ňŮ’šÜ•Źď“˙Ś˙mwË|~ ý´Hyńĺ]8ŁJ^GĄyľözŚ6´aŕŽâŚQEd4Ł5Ú(Ä8>OQý”Şé# ׊pÜşŤKr;ĹĄSÉmÄł¸Š#Č‘»wş‰Î0W“U,ÁTO *H¶ŽţŇÇ_>Š=ŰÓÔ=5Çş ;gśŤîîŇ„)pJjÝaQă·śç—y§gÄÉ:ň’şěŻ_Â(<)źU´$hŠX¶„Üě:ŰŻťf–ľXí«˙ . ]Ŕ˘$Ž5ŚéUß™ß'¬ě*™3`őףÁIĂ Ń §,Î˙‘Kf%]Di<ÉĎU4m>Sm×<ŤZÚŁş‡\»óýn­1"gG<öůłčzÄIhB˝GV2vźzrNĺ21ëôzŞm™iŠť ¸Üę'ĎŹNôő‡ \+]˘„%r@çŢqťŞÔY¤2Ěm%w•†T€{ýYÍdŻZ)sf ť«ţ.-Ź“d×’Á‡“ÚŤŹ0őŇă·ŤÇđ‰©Č\ŰúąS˙&Á°‘´Ś¬DLŁVTěr?­…5,ź(P<€·Ęc‡,cŻú&ą®r“łC‰ć WĆ„ YÎ1§aöfŞ."ĂĄ†TťÎqć«mZ´ď#rĂ#y˙^š‹4D¨W“wrFÜůíývŐ°“NĚÉRťŠť€`pXúŽi»›y\|śeöüSHM*8cŮÖ)qĚöÓ‰ Uł·^1î­P›ODgpľŚˇ‚KîrfŠ)ĄÁ]Ź× đůřeݬw0–™şúfÓ¤őŤ+ż®˘Ú\Áq%UNą/ČgccĘ”ś:Ó!Ł€‚Ů< ŘőúęśeX×ú–Y.&Ü=J”Ł–úx–ŢéŮh<Ä` ő Ď®Ł‰\ťQ2.zÂ}|ę;E†pŤŹ0“Ýż:iČŤÖfgQř,§=ůÇ#µbT]´7ĂIoű&3\IĺÍ«ó?¶ą‰GĚ>±Q>é’Ď0|Śäˇąó×úD4n@ú6šŹAQň4,e.˙"h2üÄý/á]ĆĆ<źÉ#öâˇÚŢO9Ţ8đ0IŚłSń `>L®N[V000yyĹW*r‹łH_9GźŁţ„ęo˘gľş)\—?e1%č´Č"1%äOW/M qk}a{qľµëôŃĐT{D—ĚSćKé!±çCî®+ŞŞŮ’őŽîÚŹ±y1#:3° źQóS‡‰ĄÉ1Ĺ(ł‡|“÷Çü€§ĐMobÄEiY&iˇµ8š@ňŤ|f>Š™Ŕ¤ąź‹DËn#€Ô]˛çĹ8Řl*4pXXƲ—Ë7’‘RIßSřAą“ŠÄ]Ľ1XcůG¬Ô°Ş*´l¸­üx#-iĘIÝů|7ű&ËţZ?ô “Q¸oöM—ü´č&˝‰Í (˘€ (˘€ (˘€ (˘€ Ąđ›ű5{ä˙ł%]U/„ßŮ«ß'ý™)­Á™$ •éX$oßOڇB?4űčŹď“˙Ś˙m(©)€zÇQŻ%‹•ëÍwłÓáU¨ĂÁ Äť©ę4|§ÍCçÎ?e,0o1Á®â˛·nĽÉóSôŹşŹ”ů‰ú_œŠ2ÄçŁ7pËŹîýMKE–f°3“Ô§#Ťž33‘ śŹű2kŻ;<}A˘€óůňwžˇć§ř3TŻ®HjΙ"łP-ĹÂőťŃ<ß”i„×ó–ĚŚăËv i}üQÝN%ş„˛0†Ţ#»őwÓI–fşNŤPĹj7őżť˝ÔÓVşó3¸Ľöú§č…ôń۶+©ů5Ééí4EčÚ{†hbĎŚď»9óvš8­c[›‚ĺIÄpĽ§łĚ)‰ây„Ó€ĚíěöŃŁđőžŃÖ\_ŕBăĐüaj˘:3ĘąwĎ<źŮYČ ,ÁXľvĆűó­Ë4VQ+Ü.©ßďpŹKv Ç^ęn#tĚF¶“ c9Ű»zéŕ*·´[…^ŽY`ďßŢYD´·@Ň—‘Ô7F™$uöü÷T›hRÎúLľHÔJ`žXô]Q[NČĹ\±,¸±ßúŔ«Xn0Éldś+I=[újúęKDJť5S·'v[-Ň3c¤%KgWH ŽÝGÓM(Đ]„c(ľ3& A' fˇtĄ\X«ăcťşęE´],ŠHźdÉ·ě¬y-±oD–ăşô¸N †ăńp6ę¦K+—N ¨gĎľsVŁ éÓ‡l9Y‰!ű?ŻŰQ®xuÄ]ăhť‰]//gXíĺIÁ­JżŽZ&AáĘž“ĺ:ąé¦ŮtŚ)\)!Ű;SŠż"â9 d$ť@mµ6¦çŤ¤!ŞŮ‚Ç °ÎG>{u`Öh»;3L&šÜ«‘@R@Pů‰\’NüűsQüSř+¨xËŚďVsŰK¤’ĄrŤD¨ 8ĺçôSf1H08Ö6c|őyŞĹ= ±FI],5ŻŚŔíŽ˙M »°$Éś¨'ĺNřý•0Ť:@×±#——Q>Í©—‚R1Ąó¤ŻŚąĎ«ě¦™j…Čo‚[۬7·úę¨ň ůŽ;ęTж[*psÍN9Tyb`Çbz­Tě: (ÉŘ÷§TȤhf^Îcúę®Ç!§®ď¶¤$%ĘŞˇ,FŔ&N{1Ěź}N¤FÜb'š úhť–Q䑜סř+Äú Y¦uIßZhëbÉÇvő‰·°šęs0–+ĺMA{ńß[ź¸Mź xŐ|kŤ-©ÜrAÎä+ySu)©}Y—¶g¬Ňş‰wòlżĺă˙@©5†˙dŮËGţRkĐśđ˘Š(˘Š(˘Š(˘Š(Ş_ żłWľOű2UŐRřMýš˝ňŮ’šÜfI˙ƶť¦cdź 雫~tçFO9ů¶exěb_1=xżŮę0Ďř!ல†‡¨ŽŞiĄXŽ$e‡<é} u®ŻÎ9űiáj:ň2Á ü2:üìŐ)ÇfY9(,ÍŘeĚ@‰yň8É>Š˘†ŃľTt÷?FËůÇ«¸Pe Ű!NÍ!(˙ş=´Ň@ĚÁ!Ô ę]óë§tŚÎU+-4Ź>?˛;Í ’f ăÉaS̢ťŃ î‰|×Ęů˝ôj[RPiąąCČŹóŹYóTsŇZYK+~FðŞVľäbî˛PŃqb¤i.]^pŻŢá_%=çĎNCŃÁln.‰čŁ:BőČÝ@Ws ®5o"0aŮç¨ĹŢęá'ś®"(Ôř±˙i9-v‹ř¨ďĹŠYć77|# ”kŘ*A‘,­MÜ‹­ó˘ţ{ű…"M*ĆŚy‘¸őIZúüÍÚÜ Éć żg®„śťĺ˛÷bSJ)Q§»öبŃňŇĚÚçĺŰ·ÍÝYî)GÄĄŔńYCË«ř{kGˇŹ”çąF*ŁŽ[¬7VůaŞD9LřŔugż>ĘŐťŞ˝wDçB1ŠĐ«)łŔ'úţ»ič•”řľ0ňI<Ĺ$nąÉ¶ňÜ{Ĺ>»ä¶řÁ*Ł—QôWBSv±Ş•4ÝΆm|dęńr»úęeŤËC1 6–#Q]Gmą`ó¨Şt70Č;X&–Şt‡hmY!O.ĽćŞr.•ŁĐxgŚ@ż"ňJ©â)š],¸>VŘĎ?n:ęY¶„B˝†4Daj†6Î0śď׾9mX+Y™\ˇUlL D÷cúę«űKů]"ůY0ĎŻR|r ×±ÓýoVF˛ËfŽ#áňŚóA’xÍŚ ·=*İ`aÁΞóŤ±ČźEPMT…Ł—L`öç;{7Ĺ\ÉrF[Ł„lÎÚŹ•žłŤű˘©.ń*»I‘ńHëqż1¶ŐŠvľž˙štäáiŤă-,©°Ë7”?óšŤyü#r59cťKhÝŚmťëß=cŰ]xây•Hn“IĆwnŞ©JÍ3 z ^Ćfdl¸*p=_"–ć9ÖŠîUÝWV˘ ĎVjŞhH,Ü÷ĹthÔG.JÎĹ<±mžľŞ×ř,ńÜđ’"3ÂÚ +ľ9ʶłsÄFjĂÁ[‡‡\BŞt ŽŇ?óVb“«AŰu©vĆĽM‡ÁâČ"5Č$ŽDó4lŹ´j@Ć5j8Ě3N#6&ÔôźŮSz42L P Ë;í®”ăĆďÄíIÓJí!řl.§YaŚ»´Ť€;yÔ8ě ľąZFŃYˇŮŘĺ¦>`y¶ž’VâA^Th8RśŞ± eü¦ß8Ą7–u)Âá5ŘÜČ4˘ŹÉĎ:±:ËgŻŽ‹ţĚ2ś˝´ Ë>k Ě¬óŕE]Oß·*ŹJëŇ]ëMG!a#Ä@íľ6ĺO[\ŮŮČĆ5ýóůrÔO›<€Ą\\ń GűLđđčŹVuH}%RşěĆVď{ţ üB^Á¸bę™Ý™±Ą5e›ĚçNŰp™oťd’&±µę‰\ë~óŐöÓVQÜMĂě..fß73íź_ě©E8•Ó0¸»hsXb;™°W)ÔŮO^o$W)ßrŘKtęŽ(׫4ŽĆ­®řš[Ú«ĘmR*ř«âžf˘Áŕý©ÄŽż<ĂO)ţŁom]YÁĐȡX*€|HĐ*ň>źmQ…裆­»Żßä®SŇÇxoöMŹü´č&Łpßě›/ůh˙Đ*M{Ň€˘Š(˘Š(˘Š(˘Š(Ş_ żłWľOű2UŐRřMýš˝ňŮ’šÜ—ŤI>#¦~G~u*¤śFQG7lć“lđD&fC#ôĎł(»őžľáNK#MŽ•µÉ@Â/rűëÇă?Ď;®,ôzŇ•(Ć’ľ‹W±Ó=ĽtE$cýě» îŰ즋™_Ąg2IóŰ|wBž1N–gGóÜă=Ă®“Ş8Îmâ ĂűéW-ţUęôÖtŐ´Ëv»räqmÄ*^ĺş(ŘĺF2Íž 9Ňd¸%LjE´GŐăżyęîÜ´Ď]Ą'Ę,K7őŮN¬ kŽ™đÇ~…>®^š—g~"¨žőÝ—$"!«Á ÉUŔ}éĂ2CâÄ«=Ŕ翉óžłć¤Ë,ҦŤ"8O8ŁmĎç7])b#Ž'ŠaęÚ“Kr]şŠßL}čkˇg”Í,Îň·68őÁ\ř We‘J ÔÎçÉěÜújK<0¶‚zyG÷qť‡{rF7‡Nڦ%ŮďTŁ)ď{ J6čč+ţ†¤“¤‰ ´gĄ¸9ËŽĹězr8z8Őb| QŠq\…ŹÇ=5}”?Eŕą2î˘ű¨mËKЧCµ9]żz „0ť:BĄ3ľŘŞ;ęÚîä‘$Ćfm`çIz·« ĹĹŇfř4GbĆcŢÜ…9mj۬P¸ŽA>ü欄ş.× :Ő35em.găÄŤŚîÜÓ«äěI´wQ=ą´ąkrśĺO^žßE9¨˛ă8ëÔ˝Duzqě®wZlΕ]\čPĆo%›“^ú\a ĚV Ł<đyöRŮ •ňX~#«¶ť^j$.G’Úş‡Łľ©sĐף„4l‘Ju®GŤ‚{Ľő5.H¬mJA‘XýťŮ¨ŁYQ”\“†Ď=ű+€D’,!YövT/}Ч5$‹ = bA¬çPü®ÓKR:fgpWč'—>ßŰM”Äë•GÁÁ9Ďţi×sn:V]N1ąaÝîŞŰľśĚóŤ(/M Óşç=gŻnŻëť9úuN˝'oÂÎÝt˝".†ŇČŔřÇ˝”äi J_8Nú»Oź˛Ş“9ŐÖRX™Ťܜ`ŚóoYŞY­ščäÝÔť]ţo]j!‚gťČbp QŃ׊f~uqt&w `t„ߏáR§]'i3Ź:wŘČ\Ű`6Ţ1ß™đqY|(¶UÜ0qßµn–PüĄÜĚŰcĆ5öřÇŐO[‹($ř?µ^®pŁČóź,ŠÓó«Ł”R˝ĐSŚÔ‰Ž6Ó!Üţcč¨ć Ç2˘*ź6ĎF»zÍH•:/öíaSýվŻńą§!IÂă‡pő…~–o(ú=ćąpµ=M')î@ř÷'¤xt¨ţúôçČ6šł8AđŽ)0üÚ5ý•o IIÄ>pü°ń}JO¶¬>B1RXqÔ‘0¬bŁ“S­¸=ŤˇÖ‡“®IlíáÎ[¦q¶”8P|íî¦ä–i×Ińcú4Ę/§¬ű(kHšB!Ś.ŚÚqÝKSc0Ćó0ĺ$ĚUOrçNŐ5‘+ÄŚšrµW™ňBRͦŹI˘ŔPR#ŽÖ=™ß?Ýť)é'ź˘»,‚ożĚĚÝJĂJŽĺĺöŇžÚcy'ř: ŐĄBă4Ó{6JY­­˘˝BNžEĂHýYEôžf» gďqŔĘR®ŢĎŰB•äˇćnzĺ&5ô(ÜŇ&™´•¤p‹ )ú*sëĄfű$`ŇÖ”oŢÇc‹)$Ł^˘tGă·>Á\(˛¶ę§çĚř>ĄŢ–°j‡o‘‹S }cz@ąŃÓś‹ˇ?HŇ[Ýn)Íí9ţÜĘ ĽŽÚÚ1°ŠÎ94ÝşĹvX/жú«1ĺRŁ™Âé€F‹Úľ9ôł{©‹Ź‡»ŻGn× ŰXľź°{*Řżř˛8¨ţ[/Š2ŹÔ*qäÉ…ać8Í)x@t ·Ăgäăfěĺ]Ž ¤|K}#?{‰rřÇ/§ËY­ĽęgUäó'\śwŃ)ĎKJäăV­5–śîůoęGnNá2¨rmŽţŃR€ĆÚq<ť§0źm*Ů5Z‰¬ZÝÓđ…şËß«e:ĚT©Ľ›H$ĺd–Ćü€ôURs˝®?śÄkÚó°ĚŢÂ?psă ő`µ ­´˛Ąá°Á1ÂĚMO·€Üş‹4Ťť¨ŚI®Ý‹ČTk’=IĘ6z·ßŘ)Z«Kr·‹«'e+ż08\xÖ×2ÖúP{rk‘GefYbŽŮś‘–ťóöR.űĹĆ3×3ęcÜŁöú©L ŹŁŽ9&8Îą@ŚwŕuT-,»űýNSo´ÉMzúD™Ç,~Š Óećëšu´FßJ€„÷ójbK‰ŐŇ'‘˘Ö|#ĆŰžc$Ôe*gqzt™\źIÜăÝB†…M0•í#VvJy–bc_ÚÇŃK°-utW‚8 oť]íĚÔ©%˙C$ȦRI€n1ěűsZ›ck Ľ±$HˇCĽĂŻżí©b%ŃÁYjČE«Ý Ž '·s¨ěÂ2\ţÓVpĘeĎE8ç­€Çxć=TärŮĹ’'Ťóbă&“-Ť×,DŽGXČî=UÍśúG|Żßp§Y-‡Hź­ŁO0RÄzvű)¶Ź>\˛·ů´ý¦ Ę'‘wšě·ßši¸•şýöDO> G¬~ÚŠĄSţ+ÓŰ2NŻ!Ů0Á#EÜŘ ŔëŢşŃFpBé `ŘŠŹĚ$hő>ţXŘu |H¬2¬<5)gŽš™ĄWS‡¦NDH<ű7¸ű(ˇ`§*ÇđXcŐŰč®ę®6—X¨ŠŤÓÝşQ4íˇ˙i^ćű C1•űŰ•ü“¸©N˙ EtĆCn§#É5«üŠv|WěQ•ä‰7ű&ËţZ?ô “Q¸oöM—ü´č&ľ„tŠ( Š( Š( Š( ©|&ţÍ^ů?ěÉWUKá7öj÷É˙fJkpfv+‚±MJV>™üUńsżYćiôŤŢ0ÁPĂGżŃšjŐÄ_xáNĚů‘đÇźP÷Ňó%ÔĂK<“ň.Łč^ŠňÄşyřłą†ş§Ž6v݋ŲxŃ@˛ż>–QĄ}™¦äi.rĚ…N°ńGrŽ^Ú{ŁżűLáź®(—SúNp+Ťq"° €6çAË·ůŽĂŃY•řyă7éý ř3Ćş¸h{fcÜ1ź],JQ~E:0?˝› ţ… j ydbPH¤î[ÚÇ?m%ⲉÁé$¸p|ßJç<˝B¤’nßč'&żÉ+w#…'ą”‰’CĘI±Űý”ŕŁbň|ÉŤâv>ď]r[ąŠiñä@4KBZK$lâCm;4/¬ŤéënĐ“’]••gč°b…`?$žľŻFi¸.&eŚ<łöî[ą<˝”°Ö‘r n§”éAé;źEO4Ä+H­üŰBwmą˘Ţýëú#7x,Ď›8đFŹň·.wkoI; qgčÁ­Ç[;ź>yz«‚Úá#ÔV ëéJú6÷ŇJZmţĂ“˛čEîë>Š.šÔ$őíĘď’)s,šá‡áź*RIô ~ÁR4¬d‹ą; Ń[¤sćŔşfKÂXC$ęĆz0|Řć}•ŘíŮšU6đ“Îl#óAÉőTšmv˝űđÜ~›E´ČЬ¶ń¨t“áŰôE »_]clíݤ~ÚLrYŰ0đ $9#QčÔ÷/3Εđ™'&2ňg80¤f O>xß×K-µH…ÔżűxěF{ #•’ćö5‰żşUËwi]©q5ť˘jeä×/¸˙*ţÚu-ŚQłL¦Ő"fܧ'jËĂl“Ł‘Đś—+žxxĆ­O>Ź_Q¨ăŮrü"H»»¸]#:‘•ŤFˇGí«K) á¬’N!Y1†‹Hf>¬Ő|\NťRŞBÂ'É'vŰš‘k>ŚČ‘ŞpI|/é.ţşŚ©In¬YnkłĽufˇř…ÇKgĂ-­ÄkŽž`©…>ng•Cľ3V»ż–ëYŔéóä˙‡kw/KĽff9&2'°űę@ľ–mrËDWĺ[`ÁÜdzČę¨Ô›ľşŰ›! OQ»`ŽÜŞŻA«ĹUµ|äWY'T1@2§v2»sî8¦Ňw“Iéş`Ůô`l<厣~ŞŹ'¶µG#ͬlř-ŐȰyíśuUjśäě•ýţ¦XěJŮWh9!Éę';sý”×D÷ZaA–VÔÁаžg¸}™5Ë ;ž-bŹjVŇÔŚFŔęŐ̧öőŐ˝•µĹ˝ĽeJ2”äÓK ąnHöŠ…IĆ•ŐÖeď^>­eŔzˆCnˇ¤Egç¸ü˙ÖI(SxHQó“ü?­©•bí¤\°ošČőCŁŞ–{–P:đŁíĚ”§)^Rý™%U±Îś ŕŁő×ÜzčvŔ$í¨Ž˛JĄRIOá:®źłzdŰI —RĘ´/‹çĺüj]^ňüjgśÉ-3>Ń.GĎn^ŽßëzGF3©Éwí=]ĂŞ¸UČȸrh_u ¤źLDSVZ'o?čË9 Ě{ŻZ{«†OB6y’»ŇĘŠIš YOăQąwŐ"öłFF}«cËWű3ąľdľ†ˇŹôEpĹÜň¨öS}ýźz<źfâśH!p*¸ęf:˝¦†śwłČIh9 $cز3}†Ąpěü:="la·c·’zŽô mR¬†.—ąľĂW`ę/‚ď_˛ĘRyŃŰĄř,ÄÄ=ôcU·“Žc<±ÎťĹßoý+ouVŹäâqZ\¬7ŃÍ%”j 3Äş(ń€-žľ}Y§řC}đüc;ÚŤ »„®­ňXň·Ż r^.űx§é[{¨Ĺßoý+ouYlč@=‹ľŢ)úVŢęLŤsm#·  ±:­ąE7ĂüĽá·)p"âł,@žę&7oŤçöʱ–;˸&·†ÉšWŤ°˘xIëňůgj‡›­:łĹ1ŚůVŢę­âŽeá…ĺ7ä4nŃtŻśźOÉŐé­)´â}Ź‹'Îś}ň/ߪ^%ŕâYđ9îä“ý©-ľS .Def$ÇĐ2‚ĐÁÂşIXĚŮAâŞďÖĆś{Ů1ŕĆźGňNM"Ţ<,Ż%ĚqFf}*WSú€4đ•Qz8aUë×0ÔŢ…ä=5ä1vů‰»qgj“‹§Ű“˛Ńl7="łýâýă+üO®śW…N"V¸naćńyŔšŤ/M<Ľć{¸#sÝŤ‡ SÍm >.ç3Č?»„e‡y ĄĄ»~ý÷–ĘRJÓyW$&Yg¸ĐŇ" ¦0ŁüŁřÓŻ†ěĹ ő):ŽŔ¸¦ ŰZüśĽu´g[w'oE%!şž†ÝXëgvSŹ;ż¬SËÇeďđF7K°˛®oqós$üŚüép[ЙǮéęM–âiµc2F}aę®ôV°ťO/NŔi)¨@<Šnn')SaŁMüHďŢÜϲ§_é_’ĽŃnë´ý Ł˙µ]4/ŐadsěűkŹ*F$" ‡.O“ź6ŢŁ°ĹŘLµđfÇÁŰKňÜ#‰Íľťm~&FřÇn=`őÓľŰđ[‰"ŹŚ^ĎĽl)€,ŮŇqř#9ě{óÁľ%ÁnîĚ|3…Ig'@ł[¬cF@cÝęóQá5˙ ˛¸OŚ8j^+E™08PvNÇs°ĎoeGŔŞ…ř’^)Ň z˘7®ś€3»iĎn|őqÁaŕÉƦ’Âℼr—‰ő*‘Ó6Ł‚áň<ŔŽÝęířÇŹ0ţĎÓâu_¨$P€oĚd0oĂ/,ĺă)|$ŰÜs‚LŞéśňÂ3g˙ݶŁłeîr¤ĘůŔď×µ;´ —n’FŇéśuTT™g Ń)é›çKkxü­lÝ ą9ý•ĺqZb'Żű;ż-:¸jj”˛ěݸ®(“-Óč™Őbú(rŞŹXÁţ»)¸Î˘WhčCř–Ý*'ßQĐů×>Ń‘NÁ<2>"umŹ#žŞ ’ájiäaŚçV>ĚWx`ńX¤%¶ §SOŠ{jü?1 7ł_łCÁĺfŁ„J á Đ)Óm˘•Řč_OqoQ¦î¸§„đÜ\ n —1ÄZ¤ť9#$äç#ĚĂ– ?Áľ8_ )’~ PhÓˇwaśç»´yę=Ç đšK‹—°ă@Ż&U[ĺB ť°Ęq¶=9íú­ˇÍCŃń e<52‡ĎŽŁN27 «~\Źš­¸l·˛Ă)ľ‰cq+đ1”ę$dďÎŞS†xDăý«ŤFp6F'Zś’- ŚyúęŰ…Ásog˘ę^’Rěć,O Nřz­’Gx¤—°Ř<ś:$šĺH+śČÁĆk<Ľ[Âő»1żđĽ:T e6|cŤ\±öyöĐq[{››ŽÎëŕ·99q ரFG¦łéÂ|.KÂÉÇíÚ 0Hů^O23ëćqš–\˙Ž]\•â|&;8ş-ZÄÁŽĽŹĚO«Ď±ĆďxŐ¬ÉńU‚Ý(Śł«56píÖI#¨sÎÇ´ăö÷%¸·‚ę‹c)בľŔmĎúŢąĆěř˝ŐÄmÂďâ´uŚŕ»–'™L@őů…C.-áCľ—đ~$4ĂF˘Ë«#°Ţ‘çÚÂÂăŚ?Xď-ă[}u\xÂ\GŹóMÎŢę 𬾙¸ěD’ÔP,G‹ÖßV6ĆţŢţI.o:hB¸Eéó‘dŚ…Ň ŽĂĎl7aŐçŢş·çI˙fJôóď żÝ[ó¤˙ł%ÜlÉĆ\úXc¦}óҰ•ďQźăIj’ăňͰÇm9Ń'^O{^KŇÄNüŮëp‹ř!ŕ†u[¬ŚĆ ŕś˙XĄ|›y Ďť?evXŁŇ Ť0§$i®G“•öýµNhÚ÷eŮXÓB­“Ó°o3í]BŠAÖ¬Aäţ1Ą’#8n‰Źg#űi˘éŇ’Öď¸xťő5vŠĺjšßqéĄy ¶  ¤ťî4ŰĆÄgĄ•srď9 xŔ¨‘cĎS6O¨Đq«\‰ SŤĆ?n Nď~F|>–š§IY/~#Né(=©#Śd‰JSł9b ±Qĺ`ä}ąőT™eV t±+Ş<ţÝÍ7* 9Rw2Ă·¬ÖŠm+qą_p¸Ůę p}»Ô6‹.Ĺ‚î Ć@>z¶d`0 ÓÍ@ÉÇ`=fxđB2Č«‚9u÷sőVęušFIÓ*‚*€.q·›«9Ť”šŐ1u8Ŕ>~îĘś© Ňč1Ú:ţĘŤđtüBŮݵrî­J˘’i™Ü-©ań”+  ¶!íĎŃ×˫њŚ÷˛Nş `u¤¶›—/˛ˇH¤ şČÂ=Ńi,¶Ň4Úˇ ˛şă'?×m8ŇŠWD%«Ô‘J‰Ňľ‘;ă7,ă4Ü—@DQăF¦'nľľż]2×biJšŘŚríošśřDaUcŤ†Ě3ŐľäňĺQtäÝä„ß‘"T;©±ýw mĄřXôÇ’˝ĽĎQţşę^Y”ń‰ćßÍśšxC h4žĽnOŻ«aW*‰ÉÄŻ† % ęˇJ†$çО˛qnÁQy’¤’wíĺŐżôićh„FNJ2GŚp=Gż|TA»>*‘#xŞŘ'ĂŰPsu4z"_NĹĂjlrłůŚéR4°óśíŞ8îV)$ŰîtrĆßÖò¬ŁšIXťeşÉÎűçź·omb©BÜ áŹ\‰$eâtža#íťĎ‰äőůŤJ6ę4•…™Iş= Ďň[NqíŞ´™/HÎ[bC°Ŕ'©¶:vä=5É/SL–¸uÓ8Ő×ŐĎ‚TdއJŽ+i%Ä„V1@+*łŚäŕg»"‰%€fD´I$<¤EÎ{9€1é÷ŐZ\\źzU ňHíäOő×\3Č%–5–€Ç~߲«t{ť t"‹†™¶xAňýr>ĘŤ6%(~äçšHF_Y4ÄDÔ)™Q•“*GŁ#ě¦ÝK?HÖ‘*€ůĺçţ9ĄvziďĽÔ ’%®ͤu«dúŽ}•οޮOÍŇ@ôâŁGŕ4˙0GŻßš"e1®`DÎŕľÜ÷ŘŹ}šµ÷‚ؤ-˘‘\3Nř-ş€1ß˶­89“ăHµ2‘†ęÁňMTÍ ťbş¶wűsV<9‹B]ËěŰ“ŹÁ=CcWaěęÁÝn¸ ˛µ)iŔŘpxłĂřJ‰Ŕ•­#`ÄxĘşa¶:ąÓΫ/¸GžöôÜxCqi1—3™` ç nFp¬¸@·<#†gü6‘˛4jĐ›î?—`óŐ?â>ÇsvśFÉܤ¤3e¤WbÍ’0vńµ÷öďí%}6‰…pB‰8ě׌*˝Ŕ—~‘ l`ď¨('Ďź=_đ3`x{7Knf‘óŚ`»™ä6ńöóbł–ĽKÁER,¸sł"¤'H Ťµvě=Ő¬˛°µáĐt¬Qç:W·űŠ­’Dn= ”ü&H¸„ćŢeů`pQµ '=[ŕzq×Y8¸'FůĄ‡ÂyŃĚQć!vŠş5xŁvóňN|­őĽv{Kn4—öć{OJ€±`3ŽŔqX±Ĺ|n&Ë' tşŇŚICą'eŘőx»umŮ€Ga3Cŕ÷ ávwť%—–ţC€Źt˛ 9l?_i=´xMcĂ/.`řljËdĆ6X™H@»ä°r0!ąŰ8QË> ]ř3q|W‚Z´S|Ý(čň02vĎ’{»ŽáMß¶ť¶i•ˇ:ʱ:WZ‚6'sŽĽC .Ŕ#&OşyäNŠ0Ęo•†€ëľ<ěOśŽşµŕ©ÁˇârĄ…Ö»—ŽBŃăQ3–ęťČÇw}QŰq/ľ fD@čq©Dc}‰ÝHó1­7¶áÓ;q;[>†bóBĹĽ­Ąm|‰ş“ęˇě¶Ż8đ¦ňÚx^8na‘ĂK•GŹ’“¨WŁÖ_Âoý˝ÄÁ˛”FĘ^ rŘÇŞ$sÓJwPzÚ©¸§„śRĘâîx JŃHË[7`ęÄ:üŐyŔFxrţi?ÖÔž7ÄŻxu˘ÜÚY›•Tg‘7Î¶Ď«Ż‘šĘ›şLWvŃŘTR^dpŃ3–\¦•]9Ť #´šď¸ż¸¸E›čʤ!¤uUŇ3ŮĚ÷Ô{^+Ĺn.BIÁÚŢ-—i5e±9Ďhäv¨Oá'[ĺµNîÝ”±rąw·Ť°'řÔr.AšW˝Ůyy+[D N’IYUJ®ČIÜź7_ţiL°ü:ÄNÁ#g`çH;h'—xUsĹ8Ü0ZĽ\(M#GŞh†F–ß 7«·9¤ž9Ć?˙]”áôŚOĚoż“ć±Ut ´×zÎů—ěl~PÇ,n#AľŢ|b¨z.3p°ĄŤ…•ş±‘¤ą¸9CŇ0 ¨1ť€ß8§ěxŻą»Ť.83[ŔěËŇtĹŠáCdŤ#“§žsW=žÚ•:;ĽŢ>˙c”ÜŠ kľ.ňGiÁ/ƲÝƢ“ĺxž ’NqŹ=-î8“\¤öÜ1Ű‘­šÚKdRv›V|Śu ÷«ĚžĎm=žÚ˝Ę-·•Ľą”8ś(^i=ŘX é @.ěúĘjëŔéŁsĆ[‰Ĺ^D¶Nř–IuíŔôV'łŰFOg¶«VSĎnpgdŠńňÇZp~4fĎI+”rJŚäh=yĄp”âsGâÜ.ÚŢstęDQ‚49RvíŻr{=´dö{jniÇ.UţĹŻ2®Y”q9 đĺ6‰3dŘg4í§V2[ľ«xqpÎĹYşL6›0Řń#ŰŰĘsë­6Og¶ŚžĎmFť Ózř†ĽĚĺ›ŢĎĂ'7|5e†FmśŽ]]•ç׼_ĂÁ;ÁĂ$±ČŔháŠSśo§öײdö{hÉěöÖšXÂMşißź´EĹľ'šř/Ĺü#ă°q?Hž(U E´Tµ \Ćçzj©<:đ‡‡q6[ŽËŢ3m¤ěpp@Ř펱ćŻ_ÉěöŃ“Ůí˘ť\?JęTĄum®Ň]âË%ł×˙ßÇB»†F·öí<ÖHş*Ť:AE8ĺÚMOQ/+TchĹ+'łŰFOg¶˛»»ÖQ7•j‡ľ1Jŕr„ĺŁ'łŰFOg¶•6T©·R­ŚŤr¤|_ř${rů1î§2{=´dö{h˛ż‹­˙‹őCÝN|ĺŹ'ŞŚžĎm=žÚvLŕĂ9čG,y4źĆNM˛çžtR˛{=´dä sĄeČwg¤c•şŽä®üoň#~~-Uń‹Ţ#i7łřA*ÄŤ%Ľl®Äc ±Ďäö‘PGăBix=1FJËąlî9wzşĆôň.A™š#l­Î{Ň’Öqłke$u”Ş Ţ;Äě,âťřYâiˇ +kß~D(Ç=éˇÇ| Ž|gÉPTHG1’ymŚŽĐhČą 34˘ŐTa` •ß.1ĐŚ~eWđŽ%/·šImÝŁ”Ǥľ¬áAÎp:ÉаÉěöŇĘą3‚®ß 6ĺâWVÝ@ć% ÁÓ‚6®dö{h¬’!uÉL˛śň8#ě&Ś«]ś±ťˇ±áĆ5W‚¬al¨čĆ[:°űíËĹÎN¤Ýń^3ewv‹ČŹFńŚĂFŘmG,FvňkĎ"áţ´’(ŻĚ‘´}bşp3°ęßźujŁłźˇQ-‡2ąD`Ýýż×Pś„ÚiNĹ/Ż®w<K40‰ łă "Ćţ HIëII^DŹŔŘ“·`Î箨"°âi2—µżtÁČčŘoŹn*ałrßîT C’ťĆŢ~˙e XFLJÍ%Í”SÍjmĄq–ś•ß—!UĽs‰q ă6\-Ż”FYĐ!śŕŰ€yťÇWž˛×ś?‹§¶×ý8RĘŰÓńźĹŻE¨H.i"ăÜjY:1༱ąDefiÉ`'HĆ$÷rë«~ u}yĂVn!h-n Ţ0ÇŻĎ‘çĆzë ńüZ÷ôZŹ‹řĎâ׿˘Ô4=2˛ţíî#ţ ý•›řżŚţ-{ú-Wüxŕ­ŕlęÇ9íĹ XwĐ®đýÂ?ń¤˙[QÄx…ý@Ööâ[e·i$ć• Ř5sçŽtx?ţářŇ­ŞĚy ůě¦÷ŘøŹşv[˵ӑ÷ÍYÁŽÇ9ţŤXëoś}tš ›:FçHÉô C±šY-ěŢI™í±'›>ÚĄ“Ťx@Đ …|·DÚBBëĐIP?8iÎjĎ…Ě&Hô#¬ H ŠC:Ó sé©´ŔL3Ë$Aś26HĆO H–š_‡@‚F UÉç€1öÓ”Ă˙hŰ˙‡'Ř)‹^ńK[[gáÖëpěǤ O“ż-ůŐ]ź„|vňyTpcqËeŚ„ţéź }c®´©÷űżi®Ó¸Ši^wĘł(%rv=”Ő¤˛Č—‘™ä=ŘęŐOT{/˝Aţ<żëz@Tßńľ5a;…á¦ę8Ž7F)…:pO<îÄur««k‰ć·W•'9ĘjÎ7§(¦SK(žŃFĺ!°y€ŚqëŁqKľ!mĂ Ľ>!=ÇJF–íčŢźźýîÇüc˙méäűČüö  Ćü ésń3&Xř¬I۱´ŽG;ă5'‡ń~-u4iuÂdµG –2ęÓ‚0^çŃVôQp!­ĺÄ׎‹©nŽUÚF]Ű)€0IĆ ;ŽşŻâ\_ŹZń­x_Â`¦' W@:ŹhÔX`voŽ»(˙OüĐ˙JTÇňŰľ€3/Çü# Uŕ”‰úl†8ěÇ,ýŁľŻ$ąśŰ@Úš6’h‘€'szRćÁ­íĚ!Ă—$‡ÉĘźF7ĺßšcŤř:xťëÝĹ{5˝ÇD±©Ť±Ť%Ź>¬–öS<3Á©l^ Ąâw3̉‡ ěT’ÁóÎří©iaj^\Í*¤zde-4JHě2(>ÂiE™¦Ábp2{é3DҬaqâÍśö+©>ÁI†Tś¤Ńś¤¬§Č9"˘2âRÎęŮl¬ľnb-&śę €<˝u_/„śnÄĽŇ='Z™·C¨“Ťö9Űí­)äżš>Ęĺ;ťűˇăâ$ąé¶úVăÉŰ9Qż›«ŐS8wâ×WŇGwĂZÖ:UĚ…µsß—-‡®­¨˘ŕ&ŘÝÉj.fdT|éU'P߯5K?ăq^Ë|I ŠH$Ó˛äcŻ$ă#–ÄUé$Śk”ŰWŃ 'Ĺ™¨| đŚĂ—Áçé.¬M€9g¨ö˙ć®ř]ÝíĚr|2ÜŔภ’rşţˇO§ŞĄR“Ę=Ç쨶2OY>-á8xXJe !B.ˇžY9?ĐŞéř=ĽüNęko ĺ´bdé"†@ [sľĺHaŘ0yš±ŕŃç…đż–¶‰0¤"áwÁÁëëóŐ7oߌN8¤.·¤ËJdmCQ F ŔČŔ;rrŔś¸@|„4ŔřewžrqĚl|oqŤ»Ź¦­>.yxĄĽéĆšŽÚ8â‚9‹$ C˛í’wßnşÍç˙N` ořY·9üĎn­ö«ąÁ¦ăV‰vň|=í"6ĚzEŃ ev7Yß~u2ŰŽYü/Ü[ÝńO‡’=7Qü™Ś‡R¸9ćXc9ëŞDŕ¶Âęi>ë.ş>’6š5»+’«Ĺgu źÎ›WCŕĺßĆý$Ľ5ť:qŇ;‘–P9€“çŘćł©'€/Đ9¸ŽhtÎYđ†2ÚŁ—QÍ%°2U§‰`Ť­Ľ/śŰüGYüQ…XĂsŰ9ě'ľ¦q~ Ŕ±ŽN8Ö’¤8§1ëpůć@öžÚ¨·oĺÓ YÚÉrŚg%`ńtęÁ#O§ucĆľĺĹťâĚlM ˛3„ޱ•PĎŠ9díž[0¸«—ÂËŮ!č2µĎPeËg;dŚgÎEYpžomÄeĽ¶˝é•D°˛ ¤Ę_ÎÚrF<ç>lěŔ”Éną”EÁfÉMI `óßAÇ^­â(Ţ\pëeŠ@^iFĎŚĆŘËÍz¶vŇw°"ú˛ţíî#ţ }•¨¬‡„÷vëÁoˇ2ŻJńşŞ“ť$ý€ŇŢÄ˙Ü#˙OőµYŹ!?0}•MÁ®>f˝4N‘‡v`ĺŰnyöc~u3ă0™@ ĐűęOq-‰´‰eXbi$(ÎɨżCôëúß\kűviŽÂ‡ß@Ép[Éj-á’9c1ÁŃ"é'JśRę<Üa.&Íp•!ëôÓ_CôëúßC&Ô[îŻímKYa,U[#:µ y'¨Ň>0‡é×ôľś‹Ąą”ĹpŠeP®tŔÎ?9őĐ’ď1÷~Ó]¨_@TL» n‡·ľŹŚ!úuýď¤2[¸Ž6‘ą($ú*=´‚ę;›˘ŔK¤"L`äÇ9Őě¦ÚúÝÔ«L…X`Ťq매ă 1‡Ą¸Vy !Űnúb$QPľ0‡é×ôľŹŚ!úuýď¤1Űź„ĘËmg«¦ugńa2vaŹ(SĐFbµHÉÉFe'·+ĽÝ4W ˛i)«AäH$sóU'ă4ă¦\ę,N×é¦"e ă~ť@űčř§_Đ>úC…Ű| E0ŠyVUwM!Ň;ygÓRźËnóPĎŚÚĂlg^‚,P‡`9t–â0–'¦]ĎĚ>úlH™PŻnîbžŢÚΖârJŹ^4ŕťµ ý=T|aÓŻč}4×qü2 ¸ŻZ)ˇ ’1řXĎ<ö{h]ŕÉ3Ą['Špâhś$šůçHóžŢÚ•UđŢõْIdéÝ9ścĹ/ă~ť@űč6Ł˘4‘ÜܤSźÄé a2…”ŕőďźU5ńŚ?Nż }ô±ĹcFÍn@K6‡™$“Ď´“B1üłI¨mÄ f$L ~a÷×>0‡é×ôľÇ/ ŽěÁo%»NZUeEŹ^tťGnŕG¦śH„2–1˘(4ŤöÇU3Š’dťD‰ť- íťŹ]pń(c#Ě lg Goľ‰§’ţjý•ʆxŚ™@ Đöw×>0‡é×ôľÉ´T/Ś!úuýďŁă~ť@űčm ă~ť@űčř§_Đ>ú›]RoÖöń„?Nż }ô¨Ż˘’â8ŐşBĺ€Ň‡ośťům@Řqk^bÓZçE¤R<ť•Tämž[s>Š’x˝śÓǧ‡@ćYYÚ,g1–Č$xŔŤ˛6޲·¶ĐńenŇ„h­”ąRHĆ’;wĆF<ć¦@Ö–Ťg 'L0Ë…Ëł‹@X0I€ĆőkQĘťőäVĄ,Í5ˇˇ7ö†&—â|ŞŁ9˙dbt‚q§<ǧÄmzy•¸p”†HĆUĄc¨Ś7!ry ‡=«#qĂ šo„-ÁYµłé  çly·έą×V¦ęžs•u2ÄÚK´z€ źFFŔŃ8Á[+ż0„¦ďť[—řq‹Y (Qő3)čm$ Î1žXĎ022&ߊŰĘ!•xZ™Yó±ž@9íËžŐY7řT±<契â9ĆĺtáB’I$ŕě64ĎâfĘ8ŢsmdI,‹‚űíçP˛ąalx•‘–Ľ.”‘˘,ĐéŘ#˛7\v`ÓŇ_Ă-żÂdŕĎ$H‡ ÖlpŞqâňěőŐ—ŃIwŽă? wl36G’@Ç1°Űzž<"ÓŔ¤á‚hÝ5ü&AĚś~yÝąP˘·Č›·řLˇx| ŃPÁFy:¶Ĺ>8śq»J–‘ŇrĘ8ÎHĎy϶łŃ^[ ‹˘e]—SíiŃ%ÓŽGÝQ±"ŢÚxâŬ…Ţ5|"3 ús±Ű°f±Üv5x§˝ÄzćiŘ[ôlÚb“'vÎźj. ·˝··.*í!V ‚>iĆ3ťąăjG(8*ŔڬŃô‡ĹÉz'ť€[ †p*IXnŮwÔ™syÄ­¬í …»\ré9_6ŢŁżădś áNWĆ’ĺ´ŕ‘śí¶ŢŻFôpxw*@Š¶ŚŁHňgţZť÷v›ë_ÉNÖ+ą¨°ą’ňÎ9äŽxÔ7Fň6@##Ó‚3Řr*V˙I'ëßXß»łř”ßZţJ>îĎâS}ků)YŽčŮoô’~±˝ôoô’~±˝őŤű»?‰MőŻäŁîěţ%7Öż’‹0ĚŤ–˙I'ëßF˙I'ëßXß»łř”ßZţJ>îĎâS}ků(ł ČŮoô’~±˝ôoô’~±˝őŤű»?‰MőŻäŁîěţ%7Öż’‹0ĚŤ–˙I'ëßF˙I'ëßXß»łř”ßZţJ>îĎâS}ků(ł ČŮoô’~±˝ôoô’~±˝őŤű»?‰MőŻäŁîěţ%7Öż’‹0ĚŤ–˙I'ëßF˙I'ëßXß»łř”ßZţJ>îĎâS}ků(ł ČŮoô’~±˝ôoô’~±˝őŤű»?‰MőŻäŁîěţ%7Öż’‹0ĚŤ–˙I'ëßF˙I'ëßXß»łř”ßZţJ>îĎâS}ků(ł ČŮoô’~±˝ôoô’~±˝őŤű»?‰MőŻäŁîěţ%7Öż’‹0ĚŤ–˙I'ëßF˙I'ëßXß»łř”ßZţJ>îĎâS}ků(ł ČŮoô’~±˝ôoô’~±˝őŤű»?‰MőŻäŁîěţ%7Öż’‹0ĚŤ–˙I'ëßF˙I'ëßXß»łř”ßZţJ>îĎâS}ků(ł ČŮoô’~±˝ôoô’~±˝őŤű»?‰MőŻäŁîěţ%7Öż’‹0ĚŤ–˙I'ëßF˙I'ëßXß»łř”ßZţJ>îĎâS}ků(ł ČŮoô’~±˝ôoô’~±˝őŤű»?‰MőŻäŁîěţ%7Öż’‹0ĚŤ–˙I'ëßF˙I'ëßXß»łř”ßZţJ>îĎâS}ků(ł ČŮoô’~±˝őÍţ’OÖ7ľ±ßwgń)ľµü”}ݟĦú×ňQf‘˛ßé$ýc{čßé$ýc{ë÷v›ë_ÉGÝŮüJo­%a™-ţ’OÖ7ľŤţ’OÖ7ľ±żwgń)ľµü”}ݟĦú×ňRłdl·úI?XŢú7úI?XŢúĆýݟĦú×ňQ÷v›ë_ÉNĚY‘˛ßé$ýc{ę'ąľ´ŕWsđřÚ{´‰š(É-©€Űżşłwgń)ľµü•ĂáČnv3űŻä§$›WŃ ¸Ď„ň$ŇŮÝßÜŰŰY‰ć’Ke€łŢ*#FI Śs¤ÜńŹ  ąĽ˛–âKx%AŇŰä”0\ŽŚ®X+21šť÷p?—ë_É\ű¸˙đKőŻä­˙9O˙‰zEy_2ăÁűţ)s{ÄÓŠO:O ě‰mđb‘¤`á\H|˝CĎRü"vűźĽŰxůgĎYĎ»Ź÷ ~µü•YÄ<3{Žsٱ  ™úńů˝ŢŞÉVJ¤ó%biŮX˙Ůfox1.6-1.6.57/doc/screenshots/udine_physics.jpg000066400000000000000000000370361326741342000213230ustar00rootroot00000000000000˙Ř˙ŕJFIF˙ŰC    $.' ",#(7),01444'9=82<.342˙ŰC  2!!22222222222222222222222222222222222222222222222222˙ŔŘ("˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?îµKŤN)¶Ř@%ůŞžß0-Ś /©Ů­ Gťíck¨Ö9ČůŃN@50V}Ř`€w7OţżQIś0RA$d{ŹZ„›Ź2Ř|Ë›—©÷šŃŠQmgć°.ÜűťĽ1±˙×éZÖŻ;Ű«\Ć#—'*@8ç>˙ët©ŔQ;’ p¸Ü}*=ä‡ëĆďIj®‡ÔĆşŰ]şEa†eŢěc#8=s׎9­WhÄr‘–@s´úf¸éőďÚŰÚť*Ę9ćWŢ»Áʬ@˙YÎNÎsÇÍí[öú•ÍφŢţ8‘î„RD•Ýr\>ĽŐ8´ąşʶúŽ»)˙z îÜ n9#v=OŻÝ˙hTŃÝëÂ5ݧD͸´Ş˝řŔý}şsŚ–C­Ďo¨MoŞGH±yń«aşqĎÔôÍhC¨+épŢĽlЧj Ä qëÖŽGkŘ.‰ĂÍö0ĺźËÎĂÓv:qžţ™¬hő-i ‰×MbfF.e^Ď·#®z{rjĘęűaß ŤË+Ę*@ zŹ`Ź|ă­ĹzżgyĄxüµp˘H‰e|ŕ qž§oN˘›„–âşe®uĐ’Â2pCŻRFGŢ?]˝łZ„“Ĺdďlą”ŔÁt ΩŢë0Ů̱žl!yZ>|±Ű#ߟʯ™Qa2“ňÝźjTŚŐâÁ¦‡Ń\ö©âSgo§ZZ5ÍôŇ1†áG» €– >ú·z‡Ů¤%­Ĺ̤d$ ¸Ö±‹•­Ô™IE]—(¬«]e^é­ďRI‰QFá]ß9꣡ăĄYšňé&dJ˝şUŔ2B€®qśu÷ŞT¤ĺĘK©s(¬ń¨\#Ć.t›ëdw ćJh$ŕgźZsŢ݉CŁßĎ$ #@U±ÁÇ>´ýŚďoŐ ÚÂ×ýzŠŁüćx˘ąÓo-|ŇUd8ü¦›űŇO•˘j2¦H0ĂÔsG±ťíú ö°µ˙FhQT ľ•îV ‹ «Wt.žrŕ0Ďóv˘QqveĆJJč(˘Š’‚Š( Š( Š( Š( ł5k˝BŘĶ«;89 žĺÇ `p[©+N•T1ťPd Ě{ž‚šWŃ ™ş]ĆŁ3\.ˇj!ŘĂË ‚{qŔĎV‰)»jHŻŚ©˙>ŁóPŐ´`„ŽęÚ?2+’íóeT±uŔ¦çL˛ye4Ú€€ ĎSÇĐ~^ő”|Gj.Ě7J«ČHÚĄ‰' Ć{ţ¸”ßďż–6»đ¬*ę~ĚeÉ,TŽcť z“ë\Ôđîo™Ú÷·BĄ$ő¶¤÷Z¨˛BRH şi6ńŔ㏯֤´uš2>ö•‰-´®ONž€°§Eť E««ĺĺ 7ăoWÇ9]n­ eŰÄV©… ĘÖ‡+Ćp~~µ¤((6×Q9ÜĄ­ÜI [ÜĄŚ˛\Ű’ŃŞU›Ś×Ó˙­G‡âÔ"°+qn–é·tp†ÎÖ$“ÉäŽ{ŹZÓ™c†$ë¶ěŻ'–Ąm çŚ˙`AĄeEÓľŢ5Ț؜+­‹ÇŔůąčGÔ] É«2t1uůĺŠT¸¶ÓĄščFŃ,y;s“śÄôÎ)c’çMđÝÄ·Ö…ŇĂGoů€ł“Đ÷ëĆzÖ¤’Ä“y#\Ťä±•l[ĺ sóö Iö"„sňëqîÎlX*…ÎrKńČ#đ>”Ą)5aĹĹ;˝ND—WŐ-nu‹Řťí_ý@ K¦QśĺAד]˘×ş§çĹł}ĄÂ€9orüë]dŤŘ¬zÔnL{Ó'÷ťx\ż$m#ëÇ­9Z…&_@bq•qbÄc$gďtČ#>Ő„iMO™Éż#¦ľ"oËC‰µ´Ő­4Űt†ÂqsłËťž<ĺ9R:<×O 7z†cşąT.ŰFsźúţ¸«he1Ë®E€ W± ç>~Ha‘źźŽ=}ý+Js‹‹9“łąV­â˛xD¦i%|ŠŚĺŚJ‚ôVgŠüEq˘é0ůpq:€ĚŔśsÇsú*čĘWd:ô!—ď/Ř*rÍÁÉąÇZí1}”Îu•Ëó›ÜF; ţąQô©ŁISó•Îő­mÇÚć7vÜ«ď(P6ĐÉŽăůWsst˛*Yüăϵfßµ‰Î^@9 ±8ëĹZAł2kđDÝŇ[&Vă¦˙×ńˇdńĺë±8*X•±nă9l…d Nw˛ôďŚçĄY¸¸H¤Ehî$ŢhhíLˇ 0pĂŽCŰ•Ymž4‘g}•$˘K¸V8® {·¸w{F((ă,sŐGnç©5e/­íîĽĂŕ”[ů Đş’ ů˛<qŽô¦[eźŔ˙§ô$p(wHËďÖ˘P˛GZĚŚ—_Đú`ŃĚď{ •ZĹ{W 5„Ĺ9[x¦ß,–ĆK”= <’ńÇ ­J«&mă·{­YmÄęěľe–q´€AÚ瓞zišŮA'Ä0 Ó‹÷Źâî#Ö¦WnĺĆÉXąEFÖĺ$:Ô{Ą zś á¸ç×ĐŐńáŰň?ä+ţöu6Ę”UżřGo˙č+ţţ.ŹřGo˙č+ţţ.‹Ę”UżřGo˙č+ţţ.ŹřGo˙č+ţţ.‹Ę”UżřGo˙č+ţţ.ŹřGo˙č+ţţ.‹Ę”UżřGo˙č+ţţ.ŹřGo˙č+ţţ.‹Ę•—ŻigWÓEşĘcxĺ©ç‚=Ťo˙Â;˙AXđ˙ńtÂ;˙AXđ˙ł«„ĄNJQÝ$¤¬ÎoHÓ§´žY%}ŰÝśś`rPٰc úqÉI©j2éšČÓďĚąů_Ć@Ą Nü•}}=h˘r”ĺĚÂ)EYwź<1ay5ĄÖ˘#ž)"y2ť¬:Ś„ĹCĹG$Ňřd2ŞŁů–Ұ @ÁŹÔ˙/Jó/hÚ,ľ#ÔdąľÔípćA˛m<ă/śVgö‡ç˙T˙Ŕh˙řşëŚň´—4Ý˙Ż#™â ť®Źc?<DŁí6ŁÎ`Ň´”#9 ě*íżĹ_ \·ú4ŃĘTŽc˛ŕ’HéäýkĆŕđn™u– u‰Ś‚–±žäŘ˙“Wô˙ŦĄłşÖD˶Ú3»a#'÷ť2Ýř4ĺ<¶ŢěĺëČkç¨ÂŇđś°ł‰ xˇŔ,,%*™Î9ňřĎ?­F>*ř4(A= QČQc.őĎĐĘĽĺlÖTądľŐXÜâ 1mo”ó8á‰ţX¦6î]ś^jŤÎ [8Žźž8öéĹgí0?Ě˙Ż}b=Ď@<.-’IĹ”Ł$‚üłô$~4źđ¶|…iłÂŤ }ŠNsűľ™ćĽľű@łŐ.Uîď5fEĂ[Çó!n6ćO›,ŢůÍSźÂ:U´"i¦Ö#Ś;ZFČČç}j§–[YËúů ë1îz×ü-_ďGهB °˛”GL.śź|y,Vń˝¤’V4[I'Ś  9őă?Ř^˙źýS˙Ł˙âęÖ›ŁhqjvŇA{¨´«*”[ RsĆH~”ĄS,·»7ëČ* Účö«ŻéÖZ•ÔCóĄŽRd“ËŚĺ™A$9čqQŘ™ÖcˇI˝ e;cŕ8ÝŽ€W;Ş˙ČÁ©˙×q˙ -V®$tťhń˝’ďĆ€Fő ŘŠ€üÝ ăk@@mŁ ňâă’xů˝Ďç\•ŔěÇ–®Ą_Cv$G99?ĹëÍE/Ť,'R˛h2F ČČ<áżŮ•r”R®9˛Q…ĐX1=3źďRŻŽíPšmH‡BtoPá\…Ö/Ťl©;aXÇ#ŚuÝéĹ*řÚĹ˘č ’vâĆO^7w®JŠę˙á3ÓÍ»A˙űyMśŻ—9Ďű^çó§Çă›8ąM ÁÁ\ůqt9ČűÝ9<{×#EvăŰiCv˙z8ŹţÍQÂg§›vţöň›9_.,çýŻsů×)EugĆ– qçAs,CŰ"ůztů˝…]ŘůÝä?ţ*¸z(ą˙…ßô ş˙ČüUđłţ·_ů˙Š®Šîáf7ýnżň˙Gü,Ć˙ m×ţC˙⫆˘€;źřYŤ˙@ŰŻü‡˙ĹQ˙ 1żču˙˙řŞá¨ çţcĐ6ë˙!˙ńTÂĚoúÝä?ţ*¸j(ą˙…ßô ş˙ČüU'ü,Ć˙ m×ţC˙⫇˘€:Sâ(5MI¶Ú–f™>S$aÜ1Ŕ9ÇJ+L˙­źýwOýQE€µiđóO×#]BóRąŽk•óĺ!v)+¸óźJ®~řiL«ýµx^Ű* 3ş?ś.XgŹĽŇ˝SÂvđź é’“y¶\¶Ń“Ć:ý)¶ÓÚB’LÚmĽ$ˇ76ÜńÓyÁúTű8v3öTßŮGšĂŕ­Ö'O^BŤ´ŰśGś• Î:†ňsčkjĎáD3CäZýŕ‹"np#ŤŘ®ĂI{MY¶‹ 1„űذŮ$€6• őî+ UT@ˇUF =ś{Ůñćkđz%ĆÝ~ěa‹ŚGüD`ź˝×R˙¡LČĂ{×?sżýőî:ôĘ(äŹ`öpěyř5nÎë·E€/Čţ/P?*Gř3m$b7×.YE1‚ţ=^ˇEÎ…ěˇŮT~éŕČ^oűň?ư_Ŕf›®Ăl/.ĺ’9ŕĎú1T*ňŞ?+žs޵îgĄpš˝…ĽwńĚ«'™öűs“3‘“2v'Ą'N  *4˙•&«˙!ýOţ»ŹýjµYŐä?©˙×q˙ -V­ ·ěí­ĆŹo*é s+¸ŘŽÁ°k ńg‰u? xsBźJuŽâ[©P9# íő¤ŔčŢ[xŻÖ &XÄ…d¸pv’@=}E9ŇMű<<ŚUŠś\żQŹńŻ#Ő~"řŽŰSÝ\YÝÜ´@yČ\€ ¶9óT˙áh롙„vۜ厓ďóQ`=Łu¶ĆřFČUűÄÍ'ZŠKÍ: …ô(Ŕq¸¤żJńĂńG]*TÇm‚0GĎČéýęc|KÖ(k{F 02ŻŔ˙ľ¨°ÇýŁĄ˙Đ?üz?´tżúG˙^5˙ #V˙ź[/űĺ˙řŞ?ádjßóëe˙|ż˙E€ö_í/ţ€‘˙ŕCŃýŁĄ˙Đ?üzńŻřY·üúŮß/˙ĹQ˙ #V˙ź[/űĺ˙řŞ,˛˙héôŹ˙Źí/ţ€‘˙ŕC׍ÂČŐżçÖËţůţ*ŹřY·üúŮß/˙ĹQ`=—űGK˙ $řôhéôŹ˙ĽkţF­˙>¶_÷Ë˙ńTÂČŐżçÖËţůţ*‹ěżÚ:_ý#˙Ŕ‡ŁűGK˙ $řőă_đ˛5oůő˛˙ľ_˙ŠŁţF­˙>¶_÷Ë˙ńTXeţŃŇ˙č ţ=Ú:_ý#˙Ŕ‡Ż˙…‘«Ď­—ýň˙üUđ˛5oůő˛˙ľ_˙Š˘Ŕ{/öŽ—˙@H˙đ!čţŃŇ˙č ţ=x×ü,Ť[ţ}lżď—˙â¨˙…‘«Ď­—ýň˙üUŮ´tżúG˙ZÚ]ť†©lÓ¦•a\¦âCŘë^ ˙ V˙ź[/űĺ˙řŞą/Ä-piQyšmŚ–m!`e¶.žf1Á'ŔŞPrM®€{MŔŇmQŢm,a]×÷Fyí‘Ö‰ż±m–#sc FiZ(‡™3oem¸“Řu C^'/Ĺ}~e*ŃڀŋmW\îĆěáş)“üQÖ®D~u¦ź'–Y“|$í%9ŕä}Şl3×Bľ(˛[xD1 ě O>cryě(¬żęę·ôáDłÁ0Aź6J)öO˙ČŁĄ׺˙*Ôş2‹g0ŚČĘ+/Â?ň(é_őîżĘ¶¨îőX-€ŽÔÉ+#$nĂ|»s÷xĺŹlăµU—X× płŕ”-äîŘÉň+-¸‚rYz€ýuux®ćłŰg*G&ŕI|ă@F:ń/řORżńnŁpšˇw+JÜÇxȢ‘Ôg}9­)AMŮ»)Yh{–«>Ą,VPAl™Ű8¸Ýżč1Ć~˝«a$I>ăú×Ě/ŕŤQÚE˙„STT, 2ŔAćČűŢ…źcë˙ ôYôM+U‚[+›HŢ÷|+p›Y—b ŕöČ5ĄJ1„nĄrc6ݬz Q\ć\nµ˙1×ő·ţŽJ쫍ֿăć/úţ¶˙ŃÉIŤwŞ˙ČS˙®ă˙@Z­Vu_ůęőÜč U©+âaÂľb¬Ę·s® ­ęÎńąqŁxeŁÎőąą#ěťóŽ=}¨Ę|OyöÝ[y{‡eM¬n+çq<€­cV–·‘z‘*‹89î{ç©5›@Q@Q@Q@Q@Q@Q@Q@Q@\žęVÓ­íNĎ)Iqň.rNÍŚúqžĂŇ©Žµv3hÖčg[śŻ@6ő÷­a5M>«őEBî×·©JŠ˝˙żú{ü–ˇťa?5˛Ěcć._°RżCIŃĺWćOŃžÝŕĎřőđçýzÁ˙Łd˘ŹÇ݇?ëÖý%F'·řGţE+ţ˝×ůVŐbřGţE+ţ˝×ůVŐfkvÉwf±=Č·ůÁĆ{đ3Y÷ş|hđŢK«ÇşÂ°ĄÇ‘'|‘‘’zőě:ÖơkŐľŮ!Hl?PAëVŇt©ď-ţŮ4űÄk “ŕăąëŇ€%‡A‘b‚HuP*' ¤.1óz©n¸%ŹbA…|?Ş­¦Y"čÄĺňÉÜsžĄ˛oĚő¦\é޸’ĺ¦Ôv<®âUűPO1Ç8Ďę0*}:]J¸Ĺľˇ»!C‰C…‰%éËc&€‡©¬‘4şÔĚ©!fUç\ä –ăŚţľIٱ·kK {v‘¤hŁT.Ä’ŘÉÉ'ő¤·ż´ş [ÜĂ.A#Ë7ŕô÷«4W­ÇĚ_őým˙Ł’»Ňąyôa> %–úí•nQŘ*á€űąĆ@ďIŤeŞ˙ČS˙®ă˙@Z­Vu_ůęőÜč U©+3ÇE‡áź0¦ęáxMç•ŔŔî?pzVťdřú9%đ÷†ăŠU‰ÚćŕdŢ>ďB0rOĆ€<ł\„ľ˝, (“ 0XÄj;($;öŞ×ţ›C˙}ŐéË®© —bLyPc•8ů ëÇ\ç˝mK&”šVš÷÷ńNđ’~ĘŠCry$‘Í$›vA)ĆNI»»iés–ű/ý6‡ţűŁěżôÚűî·ţÓáßúk÷î?ţ*Ź´xwţ‚ßýűŹ˙ЧË.äűjĘţďř&Ůé´?÷Ý'Ůé´?÷Ýuúü#×zͬ"˙TbĎÂĎlcčpOňŞ2ŮX•âETě1#ńâź$­r~łK›•§÷3žű/ý6‡ţűŁěżôÚűî·ľĂi˙C4÷ĂQöOúŁ˙ľŽIŹë|ţća}—ţ›C˙}Ň}—ţ›C˙}×g?‡foZKi©Ĺ,Ť<¬$än]±ŕĎNx÷5—˙öł˙?˙ßĆ˙ &… Vj÷ţ‘ö_úmý÷Kö_úmý÷[ßđŹk?óůýüođ«:w‡u3©[ ‹ČĽź5wáÉČϦ9ĄÉ1ĽMŻëď9ʞ˙ÓhďşO˛˙ÓhďşęµM&ŢÓT¸†_E 'Ë NĐyčjźŘm?čfŹţřj|“BŽ*„’j˙s0~Ë˙Mˇ˙ľčű/ý6‡ţű­ď°ÚĐÍýđŐz;m "inu»‰ťeA›eą Ŕ Ž?ÔrH&Ščţćre˙¦Đ˙ßt}—ţ›C˙}Ö˙Ú<;˙A oţýÇ˙ĹQöŹ˙ĐC[˙żq˙ńTąeÜŻmĺqö_úmý÷VćžtŃ’Ě:Vmí‡ÎXŽ;ó~$ÖŻÚ<;źůk÷î?ţ*Şř“íQÂÎmŐá1‡<;Ňi˘á8M´“_# ®E¨Í›5ŠŞůR°f$¶r÷ÇoOä1NŠb=ŰÁźńëáĎúő˙FÉE ˙Ź_׬ú6J(Űü#˙"Ž•˙^ëü«j±|#˙"Ž•˙^ëü«j€#źýKTÁ´NŮÎppÄ'śuüjy˙Ô·OĆ›'Hş}ďčhtŇ[Tą·ą±F…ÝÝY—ć Ězc×§5Mµ B%Ť,žGŚ6Q $ýÜ‘“Ŕé·¨J×kÉăÖně24Ia"G÷ţRpzäÓőâ©É­\Ťé‡î ;Ë;Nú¨=xéś^(±k—$ĺ#0Ěż,аł1 ŕŽ3¸äă>ľő»a}Łl·n11 B§Áç¨5‘.ł4z îwB@1ÇňČzOÓ>ŕŚdńZÚuË]Z,­i%©$ţęA†8ä{ă4hô5”ßëĎű˙ÖµOCYMţĽ˙żýi0<U˙ţ§˙]Çţ€µZ¬ężňÔ˙ë¸˙Đ«S¬Ďş†ËnŰö‹ťŰvd śý˙—§­i×9ńWţDÍţľ§ţB€<ęöY&Ő!’PÚ2JĆęČ>÷B¤ýNyÉ5cP;m4†IlFĺunƱě˙ăé~‡ů×ÔăÇJ˙Ż'ţmUOâ }ź_Ń•¤´»y˘ŚË»`$uöZO°ß˙Ď?ü—?üMn´‡±ł7płM±÷$?ňŐń÷x¨üŹ˙Ďą˙ľg­äĄ}?SžX«I®W÷Á&đU•ŇřÇL3B ~o9€ŽÇąZÁ67Ůâ/ü—?üMv^‹F_éćÚł Éx;O÷¸üë đţăţŽj\‹çßČĺŽ)ýfO•ü1čűËĚĆ6ă¬XĎý;źţ&“ě7˙óË˙%Ď˙]fŻ‚~Ĺş8µLnY}ý?Ż5™äxţ}Ďýó5)FIŰüÍáŤrWĺwü{›+“ŕ;!hż›'Č9ĆÄí·Űô¬°ß˙Ď?ü—?üMv·hßđ…Y ňě»F%űŰW>ţ•…äxţ}Ďýó59©]kůa±MF^ëřźGÝůćĂPb#ż6ç˙‰«ú•ŕń›ćE”űT[łé¸ł[úě:=Ź› ö8€Č—¦8éíëÍWŃ`Іą`b€‰Ě{NŮşîëĹ(ó]?ó*x×:-ň˝źOř&F»cx|A©yqźj—n =7ök?ě7˙óË˙%Ď˙]>µ„uËó,ČndÜvÍ×qĎN*Ź‘á˙ů÷?÷ĚÔIJď_ĚŞ8·ěăî˝—Gţf9°żb#ënřšŮ†ÎčxBčy#Ě7hsäăi˙gßő­MrÍiç@I±mâ_»·Ž”čaŃá¸ĺ}Ąr1/\~tˇĚŐ˙̉ăáĘ÷]?ŕśŘo˙ç—ţKźţ&—ě7˙óĎ˙%Ď˙[G‡˙çÜ˙ß3Qäxţ}Ďýó5—ĚčúŰţW÷?ó1§ŤâłhćE‚IýŢŇÉŽŔ÷?ť\ńBŞjÚ‚¨D±a°Ôţ) BQ"! ;AÎqĺĹëQxŻţC—ýv‹˙@5şŇź?,»ĹżČçh˘ŠĚŁÝĽ˙ľ˙ŻX?ôl”QŕĎřőđçýzÁ˙Łd˘€=żÂ?ň(é_őîżĘ¶«Â?ň(é_őîżĘ¶¨9˙Ôµ6N‘tűßĐÓ§˙RßÖŁ•Ő|YA-Ŕ'ŘĐ:šęó”Tk`€Ć¤€IÚÝO\gݵU’ăÄŇy¶Vꤒ‡ĘppXޏőôç­\m>÷űR{¨ď Ł TŚśŞ¤gn9äŚö÷Şo§x†_1[WŚE #hP>R(=qĎĽt Ëqâ8Ľä·±¶”)"'–]Ą€î@őôç<Íjiďy%޵ôQĹ9'(‡ ńÎyâł&°ńfÚ¬1ˇ'Ęň täőô9ĎLóśVť„WPÚŞŢÜ çÉ,á@xŔvĹY= e7úóţ˙ő­SĐÖSŻ?ď˙ZLŐä?©˙×q˙ -V«:Żü‡ő?úî?ôŞÔŔ+śř«˙"f˙_S˙!]sźäLĐ?ëęä(Ęl˙ăĺ~‡ůŰż†W°ŇY#vcq¤÷jÄł˙Ź•úäknţYĂI #¨űś#»USřĹ;Ú6ďú3r#­&ťf¶şq’ ʆóĺŚ˙­~ˇ\Ň“ĚńýOţ\ńÚ¬eÓţĹiö›”Yv>á$Ó)˙XřűŠGLT~nŹ˙?v˙řu˙Ćë¦\©˙_ćy“ŤäýŢŻżůť'†\>$˛:iŽçs}¦gÇłHAüEd™Ő_F“J:倎ę˙hŹh7$“¸zǏΦź*ĺůt˙‚._öwîô}˙Ě·«IŻ˙lßyZaxţŃ&Ćű\ă#qÁŔřU?3Äô ?řq˙Çiu™4ˇ®_ů—PűD›ąąÇŇ<~UGÍŃ˙çîß˙®żřÝ98ÝęiF»Ź»Ńw˙3{W“\[y:w>Íâ.f\6ŢG |RkżđŤĎť4‰ľĐ¸OµMČÇ\ů™ýj–·&&µó.bSöX±ş{ĆŢ>ęך|2iźđ‹Ü´Ăĺ}Ąr~ŃqŚă×fJšN*+ĐË—÷q÷z®˙ćUódô4¤ĄĘ˝Ő÷żň5'ľxBŇMÖ»Ťäţ?Ŕ_şżĹÜűV7ö•Ď÷ěżđhµ»=üÂv˛mN »yżk‹'ĺ^3Óđ¬í9żča¸˙Ŕčj¦ç§§őĐĎĄĘýŐ»ęűúµ«ëÚËţ=5¤l _ÝÇ_ݵA¤ę¬Ř©k2 Ä`ăQ ~đč;ý*Ö±~ń˝¦Ýrx÷ZĆÄ-ÔK“ŽĽőĎ\Ž*'Q•ő‹%:őÄ€ÎaĽ„†ů‡šŠ|Ë•z ŇöÝ[>ŻüőmBá5›ĺ f¸ ę!OŢ=GoĄSţŇąţý—ţ ´5mFTÖ/Tk×;Ť‚ňć<`ň*źöśßô0Üŕt4äçwý~†”T˝ś}Ő˛ę˙Č»¬_\G5°ĐfŢ3ó_„ç¨÷§Ĺ9đÜďşÓ"áGü„:{úRę×ňG-ľÝnx·Śŕ]D»¸ëĎŻ­>-BSáŮźűnrEÂŹ3íqdqÓ=*isrüŚěýś}Őşę˙ČÇţŇąţý—ţ Źí+źďŮŕŃj_í9żča¸˙Ŕči?´ć˙ˇ†ă˙ˇ§y˙_đÇEĄü«ďäcř¸»j× ęŞć(‰ r?ŐĹĐ÷Şţ+˙ĆĄ˙]˘˙Đ ^ńMě©©ÎReyQbFDbß»‹’qĎZŁâÂ[YÔ‰ęf‹˙@5•]‘ęaŻË ˙/ůíQPl{·?ă×ĂźőëţŤ’Š<˙ľ˙ŻX?ôl”P·řGţE+ţ˝×ůVŐyć‘Żę Ą[GiŚp¤Cb=ăUÇq°˙:Ľľ ÖTÓ# ‹Öäc?óÎłub·1xŠKG#ĄÖ/Ť…źš!2ĺ‚íüńY×ZŲÝĂ ¶JÎđ¬˘yF"B„ÉŚţ¸ăšĘ—_ŐŇ’H´ńÎOŰ·ýłĄö°sű­?†ÚÓŻL«ëGµ†÷¬Rţbq­iŤ4O.—g.ˇśŚžqÓ’śr2pi¶şöŤĄ˙ŮŠ@$ćőşżň϶i{xw¤ö‘zĎĹ:*CçÚŮČ€»‰2@ˇő玎Ćďí¶Ë7–Ńä°ŘÄ$s‚}+’‹ZŐÎ+};‘ś-Űzúg銗ű__ňíe˙O˙Ćé{z}Ăë4żěJäďuĶŐ~Ć-çi<ŘsáäTűÝ23śuâ™ýŻŻ˙ϵ—ţż˙¬ř¬®gÔášâÎ"Lë!?ÚS¸0 „+´ŕňJ=˝7ł¤Ý”Ž'U˙ţ§˙]Çţ€µZ¬ężňÔ˙ë¸˙Đ«VĆÁ\çĹ_ů4úúźů čëśř«˙"f˙_S˙!@Sg˙+ô?ČÖőě &ꤱž$˙Cq†'=[Ú°l˙ăĺ~‡ůŮľ'ěú(Ú­›R0ŮÁËNiÁĄ+±I7Č—Ńť-µ®í2ĎđË…Ţf/›÷Źýô'Űđ§ýŚ˙Ď”_ů/˙Ć«!o,­c*2¨x:rĚY›‚Ç?ĹÓëIöćţâŕš?ń­ťz]˙?ň9§—b9›Đęü?^´•í˘ŤU‰, ĆçĘ/Îß˙ŤV?Ű›ű‰˙‚h˙ĆŹ·7÷˙Ń˙Ť?mKżçţF˙ŮŐü…ńU˛¶«>e‚ÝEň~_ÝĹÇ•Pń`Ƶ© űčąî_ܵĹÜ’ă*ËxĘ1!:c)Iâżů j_őÚ/ýÖu%%ĘuSĄ:N0žę?äs´QEIG»x3ţ=|9˙^°čŮ(ŁÁźńëáĎúő˙FÉEtV‹k<6PĘŇo6ઠčĄzóëŰÖ®]iöđÍpSí2ąP‰µ×.ˇŔů{ôţá÷¨´÷¸ű-†aXn2…' ß)8ü·f¬Éu¬Ć¬ÍwóaÚÇŢ'Ź˙W'ĄLťKG–i+uđ_.[hvóŮĆĆ[„ ĆRą_ĽH?Ýç•đ©ĺĐ!š_1î®wdž6ąĎđűźÎŁš+»“oĽ1ÜÇ´€dśmč1ÁÇůćˇY[‚_Q!ŢBR!ć&2věýÎ Î2yŕúĹkßśÎÍő4­´›[m?ěJˇô'óŰé‹d#XĽ·ňŐJ268Ďőýk2Ý59dňmµt>[>ýÉ»řşr9ÇNżÜ1Ąmˇ ęfťe„çp$ $‚0٧O׎•„Ü›mËV&šę>-.ŇçĽEa+śźă?78˙ÎŻV"izśq:6ˇćU™ °\nÜ:ô “O:~©öP;¤1YĺEW űóßę µ~˘jűČŘ© ˙ŹżßÎł, ˝Šwk«(9Ć=3ŔĆ1Ď=óíZpÇÄ_ďŹçDU¤‚ ÓG™jżňÔ˙ë¸˙Đ«UťWţCúźýwúŐjöVÇĐsźäLĐ?ëęä+Ł®sâŻü‰šý}Oü…0<¦Ďţ>Wč‘«—ŤÂ¤ţ飊%l2y#ÔŐ;?řů_ˇţF–ďýb×4˙ĐE/´]“†§ [Orú%——ŰŹ-I‘¦÷Oů›Ż;Űk@c9ňb>źě{ţ˘˘µµűN‡d~Ä×;b^EĎ•·>Ů˙>´0ňF‹(8ÎFĄžëĎŢ÷ý}ŤzDťÜŕÍŽ.iy~KĎô-#_ĆčÉk®†çÉ‹×|”'ŰD«‹Ms=ÔĹéźîT_Ůsţ$7źú Žy?íqţ}iSHýŕ˙‰řô:ôĎŻăúVé+nyŢÓĎň˙äŤ=nk“rëwŽľcgě¨?Ĺ•?‡ăY ŢHµÖÎ= ‹Žźě{ŐÝrÓí7N~ÄnJČÜ‹ź+nO¦Fěăô÷¬őŇ‹+gC¸8lýĄŚt˙kźţ˝c…ł¤ŽěĆ\¸†˝?%ć‰÷ßXţË®m'§“<žź'ÖšŤz%\Zk}Źú¨ł˙ T٧üHn9?ôňÚăüúĐ4‘çý‡0čpu!éźďž•µ—‘¦»ţ_ü‘ݬ=Ă\íŽ+÷S,™‘!ŽyĘž¦k1őpëi®n ů1qÓýŠ˝­Y››µ"ÂK¬K %.|¬qśu_Ăš4Źźě+ŹŻöő˙ç­a…ł¤ŽÜĆ\¸‰/OÉy˘IřťĆÓ[,Ä’L1sĎű”‘µďš¸´Ö˛é_üGµFtŚ˙‰üžúç“ţ×çÖ„ŇGš?âI'n?´‡§űßçĄn’·CŤTÓţ˙’55ą¨ŽéĚ“?d‰÷ĘžxŞ!ďü’że×6ç?ębÇoö*Íý—ÚŮOöt—x’^RďÉÇę3ëT‘ňý…qßźí1ę=˙ĎZćÁYŃŤĎG8’Ž:˘]ü»zŽ&ôţ‰­sž±EĎ?îSŁ{Ń*˙˘ëC‘˙,˘÷˙cÚ˘:HÜźń#—śđu1Ď?ďqţ}hM/Śh˛źó™ţ÷ůé]IDóą˙­?ů#Ĺ—˛ÇŻĚŔyţ(ž§ÔVfĄs-ŕšâvÝ,†fŔ;Ą[ń‡üŚžćł®?ăŐżíŹţ€kŔ÷QőĹWť‘FŠ(­3ÝĽ˙ľ˙ŻX?ôl”QŕĎřőđçýzÁ˙Łd˘€:;W…tŘ|ĺ`Ą„d ÇhçI\=jôş•śPF%L"cŰ!ÎÖ qůžĆpXXjWM›Zܬp´ — žô8ü+n[ŢE•/"©ă ŕ7l÷$ř sŐ­IF*J˙3Ăś—31›X··š)ڤŚmfYw Î89#>ă,¶W·pBlNî 7vĚñďřôŘÓín-˘uąĽk§fÎâˇqÇ@*ĺsNµYCńfnKˇ‰i/“s;%›>fŔ7|Ě9ĆOăđę*y5Ų:@wů…$&6G÷ęoÓ­j`QŠĺćO ś“whdNd‰Ł2‚TőÔú(©$*H?ăâ/÷Çó¨ęH?ăâ/÷ÇóއĊ‡Ć˝O2Őä?©˙×q˙ -V«:Żü‡ő?úî?ôŞŐí-ʎ ç>*˙Č™ ×Ô˙ČWG\çĹ_ů4úúźů `yEł¬s«ľvޏ54ĆŇWM(ÂŞ˙Ş€ŢŞtR±JVV4Ĺů©öÉvŞ…Č^üi>Ű˙Or˙ß…˙͢„­±ŁŻ7»ü_ůš?móő/ýř_ńĄŘ˙—ąďÂ˙ŤfŃEĽĹíĄý\ÔmIźď^JxÇú…éůÓ>Ú?çę_űđżăYÔP•¶Ż7«‹˙3GíŁţ~Ą˙ż ţ4˘űň÷/ýř_ń¬Ú(·˝´ż«šŤ¨łuĽ”ńŹő Óó¦}´ĎÔź÷áĆł¨ˇ+l7^oV˙ţfŹŰGüýK˙~üiEö?ĺî_űđżăY´Qo1{iW5Qfëy)ăę§çLűh˙ź©?ďÂ˙ŤgQBVŘnĽŰ»‹˙3GíŁţ~ĺ˙ż ţ4˘űň÷/ýř_ńŞö¶ÉqěŇ2×pů2‚sÇOzÓ¶đú]ß-´W,7L#Üńcĺ8ä|Ü‘žźNh·˝´ż«™óˡ–ćV`Ď’:ßT—3@Љ¤f>_Ţ@>ę‘ę}j擢j2˘ĎĺÉç¬n …9ä|Ů'ŽüiaŃ>Ńdś‰˙VčćÚ[®p y>Ü`ć—(ťFîßSŠ×ąŃÍĽrď›Í†0 íĚMŔäž=9úűP<9|Ń™ *6`‰G;ţî>Ľ~b¨Ěő˙ÇŻ‡?ëÖý%x3ţ=|9˙^°čŮ( ÷NÖtm3N·±»Ö´č® @’#\¨*è5kţĐL˙Ŕ•˙ó˝_áťö٬^^jéńyó4› bW'8éTżáS_ĐgN˙ǿ¼ůP»nÇBĘňŮk*ŽďúězŹü$ţ˙ ţ™˙+ţ4ÂOáďúiźřżă^imđ»Pµ›ÍM_LfÚˇ G*GB1޶$đn¦ŰŮ/4Xĺrw:+88ŕ{Nzа˪3žW—§îÍżëĐě˙á'đ÷ýôĎü _ńŁţĐL˙Ŕ•˙á%đ˘ćÝăÔ4e†A xĂ.qĐpýjTđ ěvëÝčĹŔ »©br ĘőČ'ńÇ˝?«.ÂţĚË˙™˙_#ş˙„źĂßôÓ?đ%ĆŹřIü=˙Aý3˙WükŔ¤1EjZ<ËmůČĎÁ9î;sÓÔŐ+Ż…·÷W2Num1 śí@@€¤đˢ*9^\Ţł×ČôżřIü=˙Aý3˙WüiđřźĂâxČ×4ć!Ú— ÄóŘMy_ü*kďú éßř÷řTö_ omo`¸:ľžÂ7 @,3ô˘8{4ě[Ęňثƣşţ»ÚŻü‡ő?úî?ôŞŐÓ]xqnµ«ŻíO&đ¸Î>P?ĄG˙˛˙ĐNĘ»îŚv›¨Ĺc«iÖÖ–‘ ě6ÎĎk©" ·_ą]'ü"Ë˙A8?*?á_ú ÁůQt ˙·†?čU·˙Á•Ĺđ‹xcţ…[ü\Ws˙˛˙ĐNĘŹřE—ţ‚p~T]ĂÂ-áŹúm˙đeqGü"Ţ˙ˇVß˙WÜ˙Â,żôňŁţe˙ ś•@pßđ‹xcţ…[ü\Q˙·†?čU·˙Á•Ĺw?đ‹/ýŕü¨˙„Yč'ĺEĐ7ü"Ţ˙ˇVß˙WÂ-áŹúm˙đeq]Ďü"Ë˙A8?*?á_ú ÁůQt ˙·†?čU·˙Á•Ĺđ‹xcţ…[ü\Ws˙˛˙ĐNĘŹřE—ţ‚p~T]ĂÂ-áŹúm˙đeqGü"Ţ˙ˇVß˙WÜ˙Â,żôňŁţe˙ ś•@pßđ‹xcţ…[ü\Q˙·†?čU·˙Á•Ĺw?đ‹/ýŕü¨˙„Yč'ĺEĐ7ü"Ţ˙ˇVß˙WÂ-áŹúm˙đeq]Ďü"Ë˙A8?*?á_ú ÁůQt‡Ľ= şĹᨑd\.©pCëOmBtŘŢV]ŰöťVäŤŢ˝z×e˙˛˙ĐNĘŹřE—ţ‚p~T]ĹÂ=á튟đŤE±Nĺ_íKŚę?!JÚ€čü8ŚŠ»BťVŕ€˝q×§ň®Óţe˙ ś•đ‹/ýŕü¨şŠ_řy@ ᨀ cT¸ŕއę*aĄi43Ć˙‰˝ĎoĆş˙řE—ţ‚p~TÂ,żôň˘č =&8˘ÔôčííRÖLPÇ HŇPäýćçřŤŃŮřhC{żÚż—"ľĐĽśŃEĐW¶şĂE1Óä@Xa\aNć%şg¦Ţ˙…=b×6ď˛óW)'ńwäźĂő˘ŠÜÇâ5IšÝ-˛|µnăSzQESzQĺ7ĄPĺ7ĄSzQESzQĺ7ĄPĺ7ĄSzQESzQĺ7ĄPĺ7ĄSzQESzQĺ7ĄPĺ7ĄSzQESzQĺ7ĄPĺ7ĄSzQESzQĺ7ĄPĺ7ĄSzQESzQĺ7ĄPĺ7ĄSzQESzQĺ7ĄPelÄ˙źóřsEP˙Ůfox1.6-1.6.57/doc/screenshots/vorhour1.jpg000066400000000000000000001665201326741342000202430ustar00rootroot00000000000000˙Ř˙ŕJFIF``˙ŰC    $.' ",#(7),01444'9=82<.342˙ŰC  2!!22222222222222222222222222222222222222222222222222˙Ŕšĺ"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ěĽgă9|'q¦Á™ă]ˇ HöíT'’§9ÝúW7˙ cR˙ˇ^ü ‹˙Ť×O«"żĹO+¨e1ÝäŃ–˝ěvßóíýđ+¦ˇGžoÎÝY„Őg'É$—Ą˙SÄnľ/ęQ¬—>HщU&t䎣ý]U˙…ă'ý Ńßő˙ău·ńîbĐôsH„Ý>J¨ů*µöŹá™mtíQl´×‹Ĺ·ÚtPŮB¨†ÁŹ<#/'$lmˇ0[žx®ĂâĄÉż›%JŞm7±ť˙ ľOú˘˙żë˙ĆéáwI˙Bü_÷ůřÝZŇětý_Yń5˝ć—¦´żYCh±YEČÚđĆĘŰoRśŮúŇëF–ş–ŽÇM¸2xµ­’KEHˇ·WU6Ó€Ş ç6T1 Aäöt/n_Ĺö¸ůŞZ÷*˙Âí“ţ…řżďň˙ńş_ř]’Đ/űüżünłćđLJu kĆ7Ň™´ű äDaFwť× ¤,Q\Ç‘ób¨^xsĂ6ö»Ýţ«§ QlmN-›i‹Ě,ĹălNßşżtžř¨áßŮü˙ĚžzťÎţTźô‹ţ˙/˙Ąd˙ _÷ůřÝ.˝ˇŘkÚ~ś’Żl< üs,ŠceŹř mÎNOÍ»Ž88çÂĂG“áC^jíćţÜň…Ő˝˘M)_ śş|ąÉë×·zJŤŻËř±ąÔîoŹŤĐ/űüżün—ţ<źô‹ţ˙/˙«~%đV„Ţ(ą¸–ˇ·ąÖ­t¨m¬J@ď¤űŚ-÷@ůçŚŰo†úgöׇtéď.ßí÷Ś!U˙ŹveR€·;yš•O Őů>×j·µËđą¤˙  _÷őřÝ(řË'ý˘˙ż«˙Ćë”ń>…¤hzfŽmćľ}BţÂŢń–@žR««ďÁ9ÜrNxéő[&Sá¶mNÂŔʶúdś»€Ďöó«`€Žzš§B†ŤGó=Näżđą$˙ _÷őřÝ/ü.9?čýý_ţ7VĽ7ŕ˝ |Mmq3KľłuĄMm|Ru›dË'ÜP9_şAíĎňi˘ř~OÜx…ΧűsYŰŔ$Ž\·‘ąw6Őă$ÓŚg椩aŰ·/çţcs©Üč˙ápÉ˙@8żďę˙ńş_ř\Đ/űúżün±|AáMJđëkv×ňË˙“ý“śŤ'LÍçůOËň“‚@5ĹŠŇjWKó%Ő¨·g§˙Âß“ţ€qßŐ˙ătżđ·¤˙ $_÷ńřÝy§ Ż©Ńíř±{i÷=7ţäźô‹ţţ/˙Ą˙…ą'ý"˙ż‹˙ĆëĚĹ8RúĄß‹m>çĄ˙ÂÚ“ţ€±ßĹ˙ătżđ¶d˙ ,_÷ńřÝy¨§ >©G·âĂŰOąé?đ¶$˙ ,_÷ńřÝ/ü-y?č ýü_ţ7^n)ETŁŰńaí§ÜôŹřZŇĐ/űřżünŹřZ˛Đ/űířÝyȧ >©G·âĂŰOąčżđ´ä˙ <_÷Ú˙ńďřZRĐ/űířŠóˇNľ©G·âĂŰOąčźđ´d˙ D_÷Ú˙ńżđ´$˙ D_÷Ú˙ń炜:ŃőJ=ż/m>çˇÂΓţßk˙ÄRʉ˛Đ&/űířŠóáN}RŹoҶźsĐ?áfI˙@żďĄ˙â)áeÉ˙@żďĄ˙â+€áGŐ(öüX{i÷;ßřYRĐ*/űéřŠ_řY2Đ*/űéřŠŕĹ8QőJ=żÚ}ÎďţDźô ‹ţú_ţ"—ţ<źô ‹ţú_ţ"¸QJ)}RŹoҶźsş˙…‹'ýâ˙ľ—˙Ą˙…‰'ýâü×˙®S‡Z>«G·ćÚ}Îăţźô ‹ó_ţ"—ţźô ‹ó_ţ"¸‘N}V—oĚ=´űťŻü, ?čćżüE/ü'ňĐ6/ÍřŠâ…8QőZ]ż0öÓîvźđźI˙@Řż5˙â)á=“ţŃ~k˙ÄW)Ôľ«K·ćÚ}ÎČxňC˙0čż5˙â)á;“ţŃăżüEqÂťGŐivüĂŰOąŘÂu'ýâ˙ÇřŠ_řN$˙ |_řď˙\€§ >«K·ćÚ}λţy?čţ;˙ÄR˙Âm'üřE˙Ž˙ńÉ pŁę´»~aí§ÜëŤd˙źżńßţ&—ţI?çÂ/üw˙‰®PS…/ŞŇíů‡¶źsŞ˙„ÎOůń‹ň_ţ&—ţ?çĆ/Éřšĺ‡JpŁę´»~aí§Üę?á0“ţ|bü—˙‰Ą˙„ľOůň‹ň_ţ&ąN}V—oĚ=´űť7ü%ŇĎ”_’˙ń4Â['üůEů/˙\Ч >­K·ćÚ}ΓţÉ?çÎ/ÉřšQâą?çÎ/űĺřšç8Qőj]ż0öÓîtCĹ2Ďś_÷Ę˙ń4ŁĹϤ_÷Ę˙ń5Ď pĄőj]ż0öóîtÄňůt‹ţů_ţ&—ţi?çÖ/űĺřšŔáGŐ©vüĂŰĎą˝˙ ,źóëýňżüM/ü$rϬ_÷Ę˙ń5…N}Z—oĚ^ާssţ)?çÚ/űářš_řHd˙źhżď…˙âkS…VĄŰó·źskţ ?çÚ/űářš_íů?çŢ/űářšĆ˘—Ő©vüĂŰĎąłý˝'üűĹ˙|/˙Kýą'üűĹ˙|/˙XâťGŐ©vüĂŰĎą®5ąü°‹ţř_ţ&”kRĎżď…˙âk$S…VĄŰó·©ÜŐĚźóÂ/űöżüM/öÄźóĆ/űöżüMeŠpŁęô»~aíęw4˙µä˙ž1ßµ˙ _íY?ç”_÷íÂłE8Qőz]ż0öő;š?Ú’Ď(żďÚ˙…/öśźóĘ/űöżáYâś)}^ź`öő;—˙´¤˙žqßµ˙ ž)®fŹĚH­öçaóřŹqYupÍľ“çĎ"E o#ĽŽÁUT*’I=•jP„y’üÍiTśĺfË{®żçťŻçCä—-:Â-_Č—ÉŹ+ö«žü2ôőÇZ̰״}RvOŐ¬nćUŢc·ąI.@ÎÂ/«ať >żS˛ţľaőx÷gŽEá˙ĐÝOsÚŚw|éWRPŇm]Ç~N=)¶řĄŔĐićúŇ&mć;}AcRŘ89Ŕ•{-2iV$™Ă•ŤK]<(“ěM/ŻOůWőóaěń[ŹřĘďĘűM¤Óy1˘ó.ăm:(Ëđ`8«Ë üDŃ[ µoĎ./íµ6W~z`WŻŃOëŐ;/ëćÂ=Ůăđ‹xëű—ńńöżřţ_őßóÓďý˙öşŇÝx[Ç7ŃĽw‰wpŹ •–kĺpÎhb ňv€3×W±Ó&š+x$žy(cRď#°UU$’z(úőNËúů‡°Źvy>©áĎj¶Úu´şLQAan †(fE^ąg#yŘňÄc8ś<âoúäx˙řŞőý?T·ÔĽĎ";Äňńź´ŮËsžžb®zvÎ?.µk?¶ý˘}źb¶W#‘řn?ęߓǸˇcŞ-_×Ě>ŻÔň!ŕ/˙Đ7˙#Ç˙ĹRŹř—ţżů?ţ*˝J¦w„ÜŞ¬IB0ŘÁ?)Č#Śő}Ú{/ëć/«ÄńŹřA<‹ídůĺ–M›§9óS‘ŔĎ=ŻŐ쿯}^'•ř‹ţßů?ţ*ť˙Gżč˙‘Ł˙â«×a•g‚98Y0…3Ę>ÄdT_Ĺ©o§•:x%ťX´,lŠsď™CG×ęv_×Ě>Żʇ‚|C˙@˙üŤ˙J<âú˙äh˙řŞőę(úýNËúů‡Őâyđ_?č˙‘Ł˙â©ßđ…řţ˙ů?ţ*˝jŠ>żS˛ţľaőxžM˙fż˙>ů?ţ*ś<Ż˙χţFŹ˙ŠŻW˘ŹŻÔ쿯}^'”˙ÂŻχţFŹ˙ŠĄ׿çĂ˙#'˙^«E_©Ů_0úĽO,×çÇ˙#'˙N×çÇ˙"§˙^ŁE_©Ů_0ú´/×?çÇ˙"§˙J<%®Ď—ţEOńŻO˘—תv_×Ě>­ĚáÖ˙çË˙"§řÓżáÖ˙çË˙"§řצQGתv_×Ě>­Í?áÖżçË˙"§řÓ‡…uŻůň˙Č©ţ5é4Qőęť—őó«Dóqámgţ|˙ň*Ť8x_Y˙ź?üŠźă^ŤE^©ŮŐ y×ü#Çüů˙äT˙pđα˙>ů?Ć˝Š>˝S˛«@óŃáť_ţ}?ň"Ť;ţ­_ţ}?ň"Ťz}z§dVŔ ęßóé˙‘üiáŐżçÓ˙"'ř×}E]©ŮŐ pcĂşŻüú˙äE˙QáíWţ}ň"˙ŤwtQőÚť}Z <=ŞĎŻţD_ńĄŐ?ç×˙"/ř×qE/®ÔěęĐ8‘ jóí˙‘üi°u?ůö˙Č‹ţ5ÚŃG×jvAőh`е/ůö˙Ç×üi°ő/ůö˙Ç×ük˛˘Ź®ÔěęĐ8˙ě=Gţ}˙ńő˙Q˘jóď˙ŹŻř×_E]©ŮŐ r_Řş‡üű˙ăëţ4ŁFÔ?çß˙_ń®˛Š>»S˛«@ĺŤ˙żă]M}v§dVËŤ"űţxăëţ4á¤ßĎü}Ćşj(úíNČ>­šUďüń˙Ç—üi˛ďçŹţ­ťţĚĽ˙ž?řđ˙pÓn˙çŹţ­i·óË˙ăJ4ëŻůĺ˙Źń­ę)}r§dV‡ýźu˙<żńáţ4˘ÂçţyăĂüknŠ>ą>Č>­XÜ˙Ď?üxRý†ăţy˙ă¶(Łë“ěęĐ2E•Çüó˙Ç…(łźţyţ˘µhŁë“ěęĐ3¤˙ÜýE(µ›űꍭ*(úäű ú´ ám7÷?QNŇ˙sőf{¸-¦¶ŠWÚ÷2ˇ'sgÇ·ĘŚyô˘ ¸.fąŠ'ÜöҦ#kWÇżĘęxőŁësěęĐî@-ĺţďę)Dwő§ZßĹwq}já¬çHX 1¤ś{bAřć­QőąöAőh|™?»úŐ-RËSľ·ű,VĐÚ2°’)mDŢfŕ,01Śzőí˝Ĺ·’FŤ\†U‰ă úéIçG˙>Ń~m˙ĹTË)+I!Ć„bî›8« ^is´ú|ÚM¤Ě» –úDq±\چdĘĄj’ŘÜŮMc=˝ÍĂ\L“iÂEv!!śŚ,Ç_Ă9ąó/d„E*FŽ ç$’Ăś“ýŃOÖu]ËP˝–ŃZ (ä•Â,U'0Ŕö¬ů×ňŻÇüËĺ}ßáţGšŢxçtH¦Ť¤‰˘Ä¬¬A5±eĄjÚ}ťęA¨Cö«ÉüŮ'kl€0ąwőĘsÜńŢ©Ań ›”µ>Öld™dňĄżłh˘,±łŕź3Ń»(¶-Ľ’4jä2¨ÜOĐŹJjĄş/ÇüĂ’ý_ŕs?`ń'ý ˙Ŕ˙ĹŇŮhúŚzĘę7÷ńÜşÂaP–â<ĘŮűÇűż­UŹâw†Ź‡Ż5yŁ6ßcĂ=śęËr’ó„Ů»ďsŽHÚŘŢ´Ô´n,ÚŐ^Ú)ÄR)Yľď•Á'` zćŹimR_Źů‡%÷ođ-ř ýVż˙ay?ô\tQŕ/őZ˙ý…ä˙ŃqŃHdü‰—y$ލ‰fY™Ž>I4¶˙|–Ń#x–Ä2 n=qô«w?ëWţą§ţ‚*„ěUŽkĆž6đϬ´›-'[łşą]bĘO) TL ŕ˝GÜôşZ(ˇ»‚GśMÚ6ą`5N»u&Ł 6?Ű<3Ë$˘5ň|ÍuŕŚ‚yÁ˘óÂZťĹÓĽĐ^0i. ŻŮ¤¶fvşžO4ĽŞÍĺ’#ş \läeTWŁŃJá`˘Š(ĘÜ隇öNĄáÔłw‡Pk­ş€tÄ“»»nRŰ÷.öCar˸ěČľ6SjzŽ•iâ-:_´>ťŰdŽúud#†ŢĘÝMĆXŻA˘‹óí?ÁěgłFÓŻ"ÓĹęÉ=˝Ë[F0 ťKyvŔ!V2F§$—0ÚĽÝÖĽ3}uo¬ÚŔľe§Ů®§°‡*3uq« “ž •˛ß)űN8ňĹv”Qp<úOŢ^ęzšÎo#–ďíh÷ßčţSE*ȱ®BůňmČä()Á :–&ŞÚÍ…ýáŘ%‘µđ§ÉźËx„Yćýܨ»‡čŮĆd$u´Qp «©=ĽZ]Ü—q$ÖË´±ąP®NAŢBŕŚýâ©ĹZ˘žcĽIÚé—“Ob’G4šaÔ­ďn¤dW`$’XĘn{s‡l`µßřCîÖćÓĽŮ®ô™,­.nZ'{MÁĂ• ±JĚ‹¶%`6•űŞ ô(¸ŽĽ0·Ú턍áŘm´uňwŮĚM«{ś˘ł/Ţš#Ć~ţzŚOŘ.źĄ_Zęšt7oumsmŁŰ´3۰šržR;ĘIn3|ЏP}VŠ.9ŤJ¸µńNˇvlvÁ/Zîň8ŤĚŚÎ ¬rFÄ@,€2á$p˝=P33ÄQÚËáëčîďa°‰ăÚ·s0?r@Ie}¤r@Á¸};PŇΩgw{â],CpĆúňÝő]cś4…#??Î@š0}Ž?UŰétP#Ď´? ]Ůi1O.™ zÄw:vÉÁŹÍXcŠŐ&ÁČ\$ŔŚň3Ô70Çá‹đÖt/*â /+QşÝţÓa5»Č2sů‹Ă÷ˇsż ŤĆ˝Š.8UđµÝÄŔÇiö :ćImÚÇ÷cěÖ’$A„bŁ{[şá #íň"ş é÷ÖV÷’jRů—w7;ämŞ7lŤ!…8ÄBLý˝˛v¨˘ŕQE (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€9ż%›bɨ^%ĄśW奙Ż>ĘT}ž`0á”çqśg¶k’:=¶­}{ýťrú¶™ŰHaµ»¶˝—‚ÝRFűIuŔ1N “Ľg ň“^ŁEćźŘŻkâ[xum ő đLéĽ7 Űa°ŚČZR€ťČă8 sśkľŃí®¬ôK [ŮĽű¸mŁŽywŢá@fÉää‚ry«´QpóĂoa#Í*F¦T»3†őŻ?ţÓń˙üţř#ţţĎţ5ßQ@m§†ăR¸xeIC%śżĄs?4Ý+Zń™ÔtăŞÚ[-Ň<0^GG+<[IÝ*vWOŇ»J(¸k˘xN±·ż–'Óm"ą’âËL{$µ¨».Ä’Ň`oÇN+Óxmě$yĄHÔĘ€`pŢ´Ú(¸;uáÍcUÔ%ń¤×EŻ!ťdłŇ٢’3d‘óóHF0Ůă•ăËôí*đßJn9žÖ,I(Dçy)¸ppN3޵(˘ŕ/€żŐk˙ö“˙EÇE˙UŻ˙Ř^Oýˇ$·?ëWţą§ţ‚+?űNĂţmżďę˙Ťh\˙­_úćźú¨lî'M6ĹRiE¤8ęÖł(ĎÔuQc<ŃYÜŢÝLŻ"Ao°6Ĺ*˛ě«€]3ꛀppôŐlľŐog=Ä6ú„ń‰ĘY“ÎĆ ?('8ĂdŚŽ5W^˛—P‚ŤĄę†.Ńę•T`0 Ź)ňp[Óů¬+_]ŰßÄg¸űr-§–ękŰ„%áH—&;$ba ą› ·!¶ŔşW¬5M,Éqmo{¨ZGu“N¦M¬»¸śv4ËĎčVS$rę–ńóöi\&-ßc¶$9ů3ĺ°çśń\ţ“ŕ›»˛Ž&d_˛I,źn¸TG‚8“ÂIĚ ‡bÜ2§hBŰFÖ-tÍ&Őb±vŃ1lMËt˘„—ýŮňŽ6ţF3üTÓM<6čiR5'»3řÔ?Úvóűm˙WüjâHń6čÝôĘśTźką˙ź‰ďł@˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WühţÓ°˙źŰoűúżăZką˙ź‰ďłGÚîçâ_űěŃ ˙Úvóűm˙WüjÄn’ƲFĘń·*Ęr8ŕýA«ką˙ź‰ďłU­Ék8™‰$ĽÄ“ß÷ňPž˙UŻ˙Ř^Oýx ýVż˙ay?ô\tV„’Ü˙­_úćźú޶ßň˛˙ŻHôZŐ«źő«˙\Ó˙AVŰţAö_őéţ‹Z̢J*•έcg©ŘéłĎ˛îűĚű4{ďŘ»›00r*{[¸/aimßz,’DNů‘Ę0çŃ”ŹÂ“QEQX>+{g§Amw=Ł]jv¶Í4T’PŤŚ‚3‚zZ˙đ®Źý%˙żÖ˙üfšWÉ誑ř)žd‹Ćľ"w…öJ«qnJ6ĐŘoÜđv˛śÄő'ü+Ł˙C‡‰ďőż˙Ł”.OEA˙ č˙Đáâ_űýo˙Ćh˙…tčpń/ýţ·˙ă4r…Éč¨?á]úŃŹ\c=łžzŽÖćÎËĎ6é´ň´Ň±‘ŮťĎrJäŕŁŃUT`' ™Ä蚆˛‰}ŻÜ\Ďku>«¦EwĄQaß=˝Śrd2ůŞËćś ă ň 6ń¦±u޵ť¶łi|ń8‰g‚k˝85í´F7ŹČQ ěťÔ¬†R>÷ĘKzWö´~±ßM˙ÄŃý­¬_÷Óń4î‚Ĺ_ÜÝĽşĹ…ÝÔ—gN˝ńÜJ¨˛H­2ĺö\) 8©É;•›ý­¬_÷Óń4kGëýôßüMAcJŠÍţÖŹÖ/űéżřš?µŁő‹ţúoţ&‹ ±ĄPÝ˙Çś˙őÍż•SţÖŹÖ/űéżřš©Ş_Ü]i—X]ZZÜČ»RicyU3ÔěsĆqĎ\učK ±äŢ-đG‰ďĽCÖâ}FŇĘęOô¨šö\[u%ĐnĺN1łŚ1…?.ţ—bşoÄ 6Ígą¸h7kćÜĘe‘Ď™K1ęIü@Ŕ«_Řľ)˙ˇÇL˙ÁC˙ńĘ—Iđţˇiâ!¬ęšýĄóĄ”Ö©- ůĘś’Yĺ=şÔŚŮ˘Š) (˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘ŠâďôŰýWSmRăD™¬˙qúdď Ir±­Çmć2ˇç‰€fĆN24żá»’ÓVžM2yýśWI,c2ZÉćÜĽqŁg÷l‹$*v‚Łi!s^Eç!đę[ŘMö›îˇ’hE¬pK[Ę‘)n&fĎ“çh`HáTŽ·JŇIÖď…•ś6šd–ĐyqŔŞ‘™Kć‹Ń¶8ä9ÇTQp8[?OmŁi’ů_éÉš˛Á¸~íŁ’=·nÁĘAŔ˙ž\rÇ4´Ď jv©č/ ŇÉhnĺ–KeŽĺŇćyWËPň`$„4¤8 Đ—lz=\.=燵·ĐSR¶ą‚î-)cě´cqrË*ůڎUÖHHdÎBÁskÄ>ÖŻőBk{ ľÓsÔ2MµŽ bkyR%-ÄĚŮňrí *‘čôQp±ÉZxvK%Íť„6Ö騆‰¶ĚÚr€‰ö‚[g÷Žěw®¶Š(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETvżńăűóčé*JŽ×ţâë `-ö˛UçĚ|ýň{trk™ńmŻÄ{ŔľŐüí:öM Ioú!äçfJ`7'řNN7oév÷6ż4Ř//^öĺ4±%Ăƨdo2<ťŞĐzc$žL”Z»ÎĄămKÔŕ°FÓĺ»y%´óňRDLąqź3®{t­/řCü[˙C…Źţ űuQ…Ň?ţd·źbŤ|=vZë*<&‡/—F:üŔŽ9­´iÓI=Îą›w,kc§}¶fĽąp˙¬vócßň·–v,;ś iTRZ Ś˙„?Ĺżô8X˙ŕ—˙·Q˙‹čp±˙Á/˙n­ý!µ=9,´ËŰK»˘Q™ď–XŢ(f+3¸–B«µ7ě%¸fÁ-Ś˙j…§…‹´–ąpšťô–HDĄRęe ŰÚ4Ŕ ŕŕ˛Cţ˙˙Đác˙‚_ţÝGü!ţ-˙ˇÂÇ˙żýş˘ń—–¶şö·˘jWŰ´űKÉ'şšs$2H±>Ř"„ţěyl´A=„»4»cĽŽ[?ŰxfíHiwOlň«_ĚŇ墿fŰ1s*‚mˇ8Vĺ?Ţl–@Y˙„?Ĺżô8X˙ŕ—˙·Q˙‹čp±˙Á/˙n¬ëąî[Â7ú„z­ŰÝčďzŤAŃ­`†âác˙ÇËí…@YŽ×ňÎXĺ˝2‹ 8OřCü[˙C…Źţ űuZ¶Ňu .ÖTÔő8ő Ë©I"µňT†ănćÉČëźN~Ʋ5Źâ˙¶ű=&´3ŠŔ‘D]$fu,pŕ¤zJć|Aâ;_ř@µMkB›{GľEŔ`éąX© Ă`Đă<Žş!ŹLŐtyt‹Űĺ…'·hĄňîr($űúÁŕ‚8®ëO‡Ăßµ ę6·RÁmpâqó©‘g´ŚŽpsÉëHg¤]ę]–Ż™4Ś·WaP ˘bqó/ŞüËČă测â›mG˶ľŃÎÝB?2Ů_ný«2í#jĘ v8ácnĽ‚úN±mc~–űăţÎT°˛dŤÉKfś<…íi·ň ďß …;ľf@wŐ p\ÍsOąí¤L0FÖ(ŻŹ•Ôńë^},ßŘmQő-Gű7Ěůż`˝ó3¶.Ä›í;sçśČŘĎÇ–kOBW´Őî.5!y$sr±ůlf6°!•Ő ™ ¸RU$îte€Ůń5Ýő­ť’iÓÇĹÖˇoh%’/1TK BJägłŚŽťj˙ü!ţ-˙ˇÂÇ˙żýşł|Q÷t?űXčôŻEżšâßNąšÎ×íwQÄď ż#ó\U7''¦j’ĐLă„üQógńe¤§ĚčšFĆeĘpHďŹCZ¦ţÝ,d- đ8žż…gřBűV»OE«Ç|&†đ`Ýy@&ëXXĆ‹ŽA%€ÉáĆY›y­ ćŠŢöćI¤Hă`,ěO˝ JăSŇío,ěçfK›Će·Ę7HUK6Ţ€ON©Ł§ßµÇеËIw›KH,Ě1‚ 'śX“Žs±/®yŰýN¸řĄx® ^%şĽWÉqąY nŞSź”‚ÜŽ‡$đsşö—fž1ń#5Ü ˛A`P™ Ź´ŽyĆi č´íOKŐ´ř/ě®-g]ŃČ’Ś˙|đAŕČ Y>Ônu]nîÜ4­sr™ łČŞ?P?kŔ:ťŕÍÚ6Ż ĹÔě%¸aqű°řĆIŕĆq–Ç=€Đđ'üŠ‘×Ýßţ”Ë@%QHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPQÚ˙ÇŚ_ďÍ˙٤©*;_řń‹ýůżôt”—Ŕ_ęµ˙ű É˙˘ă˘ŹŞ×˙ě/'ţ‹ŽŠĐ’[źő«˙\Ó˙AVŰţAö_őéţ‹Zµsţµëšč"ŞŰČ>Ëţ˝!˙ŃkY”IEP0˘Š(7WÓ.5FÓÜĆ>Í©[]ČdpŁdRlg© `SŘd×[3i×hóěŕ—í1'ßĺ7›Ý„lź™~vŕńóSX”SN±Ży‘¨\ZÜ^éÖ—3Ú>űi&X]ˇl”$ĺNTŹAéUçŇü9u-ýƇ¦Íy*’âH`iJl ±9 ŻËŹN:U (ć ÷‘iŠN—ÚuĄŇN“,ë ‰˛Éä+@= $TigˇGyky‘b—V‘-¦Xá `9UÁ#ŽMfQG0Xľš_‡#¸»¸MMYďQŇęE†Ó«ś¸sś°cÉ9ďQ¦‘ˇ[Ĺk•„6¶÷bđŰZbŠY•RękáŁCź–ŞQG0Xč˙´bô˙ȉ˙ĹU=WPąm*ĺtŘmĺĽdŰÜܬqäđIeÜx=9Ć8ÎFEsŚž9˙ź/ ŕĘOţ7NŇ4Ź.ł¬®“ QiÓÚŞŮŢY‹”aĂ(ţéőę+rŠW•¶’fńö•ÔVóiÇKšĆXĄe>a’HŰ[‚»PźQלjxAmŢÝ|1ŁŐŢ1koµ™A HčH ŔŰŹ­AE;…Ť»Ó´Ë8ěě,ŕ´µŹ;!ĘŤ$“…$“řÔzlZFŤnÖú^ťic9vŽŐa‰K` ¤ ŕźaYQĚ/ĂĄřrŰT:¤› ]śÝ¤0,Ą›;Žđs“““žrhŹKđä:\Ú\Zšš|Ďľ[E†·˛gü«É‡ĄP˘Ž`±§-ž…7Ř|Ý"ĆOěü}‹tpźłcňůů1µzcîŹJĐţŃ‹Ó˙"'˙\ĺsŽŹűF/OüźüUgęS¤ČYH(ޤń»ĐźQY”Qp±‘7…|;q<“Ď irÍ#yÎ6fbrI$rI¦ÂáŹú4Źü‹˙‰­Ş) Ĺ˙„?Ăô.iř˙SÚxoB°şK«=N¶¸Lě–TG\Ś28$~5§EQEQEfęúeƨÚbŰÇٵ+ką ŽlŠ@íŚő$ ę{ ší´bô˙ȉ˙ĹW9E4ě+Ź5¨ŽëɆ8ä¸ËHĘŃ‚í´(f!ą8Uôv®{XÓ´ýZI"żł¶Ľ€L]Rx–EĎ #8'źz–ŠMÜ,b˙ÂáŹú4Źü‹˙‰Łţ˙ Đą¤ŕ _üMmQ@Ě_řCü1˙Bć‘˙€1ń5©igkaj–¶vĐŰ[¦vE EÉÉŔI?ŤMEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEŻüxĹţüßú:J’ٵ˙Źżß›˙GI@‰|ţ«_˙°Ľźú.:(đú­ţÂňč¸č­ %ą˙ZżőÍ?ôU­˘Ş¨Â¨ şź€>ý[ą˙ZżőÍ?ôTă¸ócY#·ĽtpYm% жłÔˇßeµ˙ž2ŕT˙ü]eµ˙ž2ŕT˙ü]ař‹ÄżŘwÖVżń.OµG,žnˇöXĆĂÚĆË38ă…5f?Y ϰ\łÇxŚ‘M¶ZĺeV ç “˝@Éî8ŁP4ţËk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙Ëk˙”µţ˙UŻ˙Ř^Oýx ýVż˙ay?ô\tV„’Ü˙­_úćźú޶ßň˛˙ŻHôZŐ«źő«˙\Ó˙AVŰţAö_őéţ‹ZĚŁ3SÓ/î5K=CO˝¶¶šŢ  +qlÓ+,Ťv‘0AŚző¨O‡Ą’ ±=â4×Wö·ÎÉ U *cĂ=xÝßîŃ@Ě-'ĂŇéłéĺďXtűIl­ÔBUĽ¦0íŢw°ň@îč¸ĺú“öŤJňH<™n®_l{÷lHě9Ď;ťä—Ôy»z(­Ş(QE (˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*;_řń‹ýůżôt•%Gk˙1ż7ţŽ’ř ýVż˙ay?ô\tQŕ/őZ˙ý…ä˙ŃqŃZKsţµëšč"ŞŰČ>Ëţ˝!˙ŃkV®ÖŻýsOýU[oůŮפ?ú-k2‰(˘ĽăE˝Ö¬Ľ;¦j¶Ö÷‡Ď¶´Žoí[ă*]M4°*şň× .x_ľż+cŃč®bMoS‚ęfvł{{;Űm>t2ĽĎ(‡2+o!ÇČCüß6F,~)סIâ·˛†äŘůó]˱¸3 ĄśW“źŢ ÷@P `=Šăµ-GXĽŇ¦Ľ¶»¶µ‡űR+Hc9udľHK;‰ĺ`­” Ľ63ĆO]•`ŚNčóŮŞłc’'=˛~¦Ź˘Š(˘Š(˘Š(˘©jÖ×WzdĐYÍĺNŰpwÜɸr›€+Ľr»˛9°´BH5ˇ˘^6E¸kź2ö[ĽH‚Ř®É$;¶ěśd>`qęŔŽŞŠóďëz›Ăs­»Y›{ËŰ=°ďžŢŃ +ďŔPdI;HĎ9§ŠµŘt­&âTÓ®n5[h.!D‰ŕH·Mo#ÎNEÇ ĆßşŮŔ,uEskzśS3µ›ŰŮŢŰió •ćyD9‘[y Î>Bü‡ćů˛1cńN˝ O˝”7&ÇĎšî\…ŤŔąťÝ,คśţđ(oş€Kč4W©j:Ĺć•5ĺµÝµ¬?Ú‘ZCË«%ňBYÜH7+l Uᱞ2zčD«bwG(Č…U› 8í“ő4 }Q@Q@Ďę÷Zś>)Ó"Óc†}öWM$3Ü´1ś=¸ ňŁĺ†âóëeâ=b/T•Ť¶í-nŻnR]ó—í7 Eĺv U¸#ĺpK郞;VńeýʇNˇVĆaw¨Aµ•¶í.Y;ő&ĎÔăbíŢ«¬XßŘGz¶ÖÖ˛´k-Ę[ĽčŇÉ&Ő€á´y¬ĄX·DáHIE‹â˘˙ŘŞ‰,Ńy·¶q3C+Fű^ć5`H# ‘Áď@ÍŞ+‹˝ŐuţM#IŽkĺy!Š™ţĐđČÉ4’!g‘7á"FÚŇ<Ü䍫SĹâ\¶ś÷–đŘŰI ‚iüŻ´‡ĚŃy_ş”ů,v“˝A}Ą˛ż1amÉC­ë·~‰wiÇűjDňcx}™ %ů›yóm^`Ź—vV’x“VŤ5™á6b×JŽ{©"–9$’p·7Kµ\Éň|° |¬nZ,uEp2kşŽ‘Ą¶Ąs*^@š¦ŁĺC™ÂD·Ťµźy ?v ¸QŘŃąÖ5Ű}fßCűFś×sIűWŘÜFăąmľ_›ťŔŰuߌ?N9,[Egč·ňę:oť: ™'šÝĘš)Z2Ŕŕ™ĆN3Śśf´(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ\Z®ŁuâÍS쩨ďQVäŢbÖ(D04‘Śśł)“Ë?3‘ڬ1x›V6šíĚvkq©ŮEČcÉ-¤jYwř3#ňłÝQ\v­ŻřM»{Xm­ŻZÎŃnîćHŇŮY¤s$ăĘDr˙ĽęN0vµ;Ë˙íK=3O’Ú §‚k5Ä-*…ŤŁ]»C'$ĘsĆÜ`ç ^ŠăŻĽY§ZKŞÉ´¶^}ĺĽvެ’+[¬í¸É’ołž6 oťż5+ÍG\Ň|Quű5ţŁyś{]ŠŠ>Ů!ůa¸â6ë®yưőź˘^ÜęLSŢBÜîxäDu`ýÖ` Ű’»›i%I$f´(QEQETvżńăűóčé*JŽ×ţťf×1g”ŔĄĺB*ÇeŔŽZ†­ŕŽ#HˇŤB$hˇUT č¨˙á]úQ\cé¶ęjY[=ěK˛;–‰LĽđć?™őŞĐx{LŽUšŇ©m¤yŁžć5yW}îŕăĺb˙7Ë€@\˙…tčpń/ýţ·˙ă4Âş?ô8x—ţ˙[˙ńš9Bä/Łé’]\]>ťf×1g”ŔĄĺB*ÇeŔŽZ†­ŕŽ#HˇŤB$hˇUT č¨˙á]ú›a.ˇˇ%•łŢÄ»#ąh”ȋϱ>cůźZü+Ł˙C‡‰ďőż˙ŁţŃ˙ˇĂÄż÷úß˙ŚÓĺÉę»;[űWµĽ¶†ćÝńľ):6FAŕňü*[_ 6ň ·ńąz±Čą·ą–#äóŤIëž˝ąČâ°uČn/ĽEáÍ*FňÂ+ۉ’i-C°;€7+¨;zҰîicéźŮźŮźŮÖŮ˙óëä/•÷·}ĚcŻ=:óBhúdwV÷I§Y­Ĺ´b%(x©ĆUpHŔă“SÂş?ô8x—ţ˙[˙ńš?á]úQ\†L¶ş{¨4ë8®$“ÎyRWgĂ Ä’ŘwëóSUO†4vÖ©&źm%ČT—…‰•ŢMéĆU‹HI9ä€zŐČ|ĘĆľ"•˛K‹v•аâˇv Š“ţŃ˙ˇĂÄż÷úß˙ŚŃĘ4ŰĽ{Áel.ť•Úqďf TŘÉ!Y”{;Ó-4}2Â4ŽĎNł¶DĚ‹ \®ŇŔĂm$g®)Óř+[yn.€zTM°helaHÝc1.Ő€ `c…!W#§ұü#á{źxv=VçĹ:ôËqrž\ÂBNč nžŠ:“[đ®Źý%˙żÖ˙üfź(®VŽ©h‹¤Ř…łböĘ-“1;‰N>Sęký6ĂT`Ô,­®áVŢ#¸‰dPŘ#8 ó‚:ü+Ł˙C‡‰ďőż˙ŁţŃ˙ˇĂÄż÷úß˙ŚŃĘšm„Z„ş„vVÉ{*ě’ĺbQ#ŻĆHůGä=*´^СµžÖ-NŽŢăoťZ I6ś®áŚFzUĎřWGţ‡˙ßëţ3Gü+Ł˙C‡‰ďőż˙Ł”.I 1[ÁF‘C„HŃBިĐO¨?á]ú4Őő=f-ÄS›]:ýě÷Ţ_*;ŞŮÂŰ0čăżcĹ.QÜô +˛đŽ…ěÚ~&’;"ŕJÖ×ÂI'*µ˛Ž¸ęxëĎCŮĚ‹"(ŕFťNOÝűĐŐ‚äuŻüxĹţüßú:J’ٵ˙Źżß›˙GIH |ţ«_˙°Ľźú.:(đú­ţÂňč¸č­ %ą˙ZżőÍ?ôUmżäe˙^˙赫W?ëWţą§ţ‚*­·üěżëŇýµ™G?ńţD sţ˝źâíFčx˘÷[‹Fľş‡ÂţG—wŔß K{ň´Š_}łĆŁ*pŔăiůŤýH:ö{Ą …·ű\F#3)`€ő8~źĘş˙íhýb˙ľ›˙‰Ş‹8ä1öWŘá.ţŐÔľÓç®ű>ŰŻłýŁoď>Ďź˛ă×§jşÖ©#ńB´šżI™dm(îËM  )Ź”ĽŞŞ…R}KűZ?Xżď¦˙âhţÖŹÖ/űéżřšwAb ß\j: W2yĚe™#źh|K+¬Rń€w˘Łĺ@S»* VĹf˙kGëýôßüMÚŃúĹ˙}7˙EĐXҢłµŁő‹ţúoţ&Źíhýb˙ľ›˙‰˘č,iQYżÚŃúĹ˙}7˙QĎŞł[ʶň[G9B#yş«c‚THĎlŚúŠ.‚Ç”x÷Â^"ŐgŠ˙Ă:őő¤ěËöżm’8Šä1p~R$Č7 rĎH}Ä>ł—PĽÔ'ó4·7rłĽŚmäÉ'jú(éîrN§ö/ŠčqÓ?đP˙ürťgáÍTř‹IÔő_Ů]ŧLÓ,Péď1dd?6óýěôíR†Iw˙#ďżëîç˙Ie¬m6óĂö:fťqx e]ʤ.Şň^™-B%áČýă9™Oś@9—qŰľşvÓľŃâS7Ćşl˛ĘQ&Bń4xŚo'>Řď‘Ó˙kGëýôßüM4ôGšĎĄřfk}>üëžKD{”\Z­Ţ™nň Š#ć"#nH.^W  ľ™ˇKçx{L—ű;ű7}¤Mö»~Í”»Ć6ýÜ`tč)żÚŃúĹ˙}7˙Gö´~±ßM˙ÄÓş TVoö´~±ßM˙ÄŃý­¬_÷Óń4]Ť*+7űZ?Xżď¦˙âhţÖŹÖ/űéżřš.‚Ć•SŐ?ä/áüĹCý­¬_÷Óń5›Ż\ßj:a¶Ó5 ;™Ái¦çG8 6ŕç’xĎäAcɵ‡ţ'“ĹŃý‹ĹşĽZą’LßĘe‡~ír~lç†=9Éw[ář–řž.V=:ÁAw.ÄrÄ’Oą94˙ě_˙Đă¦ŕˇ˙řĺYĐ´+­*˙VÔ5 fŰPąľ†@‚ѡ #f=Ůł÷ʧJ‘–|˙#˙ŠżëŇĂ˙kÖߍ?äZ}˙ńďö»Oµgî}źíůŰűy~^ýůăněńšÍĐěĆ—ŻjÚ«ÜDßoŠŢ! ·ňNsćtíŹ~:íhýb˙ľ›˙‰ŞM ƄﴻI/á°’Ň®ő_'H«›wŇ9Ełĺ ˝''oüY®OÉđ‡´ëéô˝SFł·) Ź t÷ĄÄR‹čĂ`J™(˛HŇ0.Ęž•ý­¬_÷Óń4kGëýôßüMAcÁígý‰u…¶”–±_ŞĄÖ“n!¶Ľâ2dE‡ÉÜÜÄytc]˙Čűŕďúűą˙ŇYkł}J)B«e$yřÎY1×_ÜŮęzuÍ…âE%­ÔO Éć8ÜŚaąô«ÚŃúĹ˙}7˙Nč,yLľ-şĐü'çéšÔěňęW‰=ĺÜGŞĄÎUPy-ç7É–XĚ\J?0+¨úžˇŁi7ĐŮëqÁ;ë·Bń.ç†Ó!y®dŤË\Ć%"<UĂovîzö´~±ßM˙ÄŃý­¬_÷Óń4]Ź1ń&ż{uŕ˝R kÄPX«h“=«ŔŃ„Ő\™Đ ybgČÄ©ź;rü¬ôęzމö]BҵŰüöŇYîX÷Í& Ľ‚Fd :~˙qá*÷ö´~±ßM˙ÄŐ{‹›;ąí&ť"y-%3@|ÇŁFO ĎĘě9őőĹAc‘ţŮń-§‹ŕŇ®5›kymmü™ťb’ţ3fYÖÝago™ĄĂ$ŞŠců†Ëe·ŤµÉµV¶±Ő­Ľx¤Ž ĄŠâ}?uí´^TФqÎŮÝYݲ¸ĄK7ĄkGëýôßüMÚŃúĹ˙}7˙EĐXć~!jş‡l.-nwÝÁö’·3CľôÓîś?ÝÚ­ą;@î1´‘[4·¶Ţ!Ô´k­F}B8--®’{”ŤdW™JţívŹ%Hůs–l’0ďíhýb˙ľ›˙‰ŁűZ?Xżď¦˙âhş cľ$ÓĽŕ{ř§±ľňm<Ű8l$™pcVo5·ôÁ ŞI’ÚÜ1Üöü¤HĘ3ąNN±˙ehßdň<ďěř?á)ň±»ĚűUź›öÜϵîóyŰçgŤőęßÚŃúĹ˙}7˙Y’xŇÂ;»‹e†ňy-Ü$¦×O»ťQŠ«€Y!+ť¬§î(¸Ž2kĎ Ä—v’Ť ´ŰŤA˙±…ë§ödQ {6TRDo¶Rŕů‹´€V^ÄQÁŹác×ç†ÂÖíő¦š'"?˛N‹+É"´gyd]Ä`™9"´żá4´˙ź _˙×ßübŹřM-?çĂW˙Á5÷˙¦nťŻ^Ďâ-›Tón¤Ô.­îôŤ±˙˘Z ›Ęźh_5wůp|ÎĹOťŔ“ęw>»ńâZµć›i«Ű\@eşžáVíź ÉmnîŔŤű~R$e™Ü¦·ü&–źóá«˙ŕšű˙ŚQ˙ Ą§üřj˙ř&ľ˙ăç°}Źű+Fű'‘çgÁ˙ O•ŤŢgÚ¬üß¶ăř¶}Żw›Îß;żţ ŻżřĹđšZφŻ˙‚kďţ1@5Ě˙Âii˙>żţ ŻżřĹđšZφŻ˙‚kďţ1@5Ě˙Âii˙>żţ ŻżřĹđšZφŻ˙‚kďţ1@5ĘÍăÍ:ŮĎkŞD…Ő>‘| ł0UÁÔ±äRÂii˙>żţ ŻżřĹtÔW3˙ Ą§üřj˙ř&ľ˙ăÂii˙>żţ ŻżřĹtÔW3˙ Ą§üřj˙ř&ľ˙ăÂii˙>żţ ŻżřĹtÔW3˙ Ą§üřj˙ř&ľ˙ăÂii˙>żţ ŻżřĹtÔW3˙ Ą§üřj˙ř&ľ˙ăÂii˙>żţ ŻżřĹtŐ…«­?őĐ˙č)Użá4´˙ź _˙×ßübłŻüKk9 ¶:Ń%‹ş%ď(ďô¤ö'řa˙"Żý}Ţ˙éTµŘWá]bŰĂž‡L{}ZvIf”¸Ń/ÔfI^LcČ=7ă=ńž:VĎü&–źóá«˙ŕšű˙ŚSÓQ\Ďü&–źóá«˙ŕšű˙ŚQ˙ Ą§üřj˙ř&ľ˙ăÓQ\Ďü&–źóá«˙ŕšű˙ŚQ˙ Ą§üřj˙ř&ľ˙ăÓQ\Ďü&–źóá«˙ŕšű˙ŚQ˙ Ą§üřj˙ř&ľ˙ăÓW›év:ΡaăxĽ?«˙eęcÄĽ4I"1Cň8eo”ú‘ÁçOE˙ Ą§üřj˙ř&ľ˙ă“eâHšřŰŬĂ%ĺË]\ŇŻéžmřůUF=˝rh¸?­ţ$ÝĽş‡ŤuY!¶Š*-?ěĐ+LÁö—fTČ@~îÍ×;qż©ą˙ZżőÍ?ôUŹŤôÖĆďíf†ÁŇnůÁĎkzŠÇXÓőëu-.ä\Ůʡc”#&íż)á€=TŽEL†‹ŻüxĹţüßú:J’ٵ˙Źżß›˙GIR2_Ş×˙ě/'ţ‹ŽŠ<ţ«_˙°Ľźú.:+BInÖŻýsOýU[oůŮפ?ú-jŐĎúŐ˙®i˙ Š«m˙ ű/úô‡˙E­fQ•âÍFăH𦧨ÚаČČőwţ˙˙Đác˙‚_ţÝX˙?ä@×?ëŃëÔę˘&pźđ‡ř·ţ‡ ü˙öę?áńoý?ř%˙íŐÝŃNČG ˙‹čp±˙Á/˙nŁţ˙˙Đác˙‚_ţÝ]ÝYÂÂâßú,đK˙ۨ˙„?Ĺżô8X˙ŕ—˙·WwE@pźđ‡ř·ţ‡ ü˙öę?áńoý?ř%˙íŐÝŃEeý“âOú-żđH?řý@‡ZÓüO Y^ë±_A¨]4RFšh€…Xťó»Ínę1ĐžEcxö[Oď…5– c’ËČ…š&$ĘĚĽ©=r~^żw;nYÚj¶^!đţÉń'ý –ßř$ü~—@źQ:ţµ¦ęŠ_ +[yQŇĐ[€Ň;‚1˝ó€śŽ§Ž®;P±řť‹ŁÓ¬µýúLŮ‘oä´€ů(ʸ2ă#`7^m˝o‡Ń˘ńź‰ăy^f]:ÁLŽg!¤äŕ“ěö©č ×őßęÚvť¬Űiöö0[H¶>ys/™žw®1ĺűő­?řCü[˙C…Źţ űu˙‘˙Ĺ_őéa˙µë»ŞHG ˙‹čp±˙Á/˙nŁţ˙˙Đác˙‚_ţÝ]ÝYâ¬ü/âKŘ&Ôż©=ޤ53Éob謍ko´ŕˇÜOËž2+Ú«ĺo‹?ňUu˙÷ŕ˙Ňx«jUYň˛'7sĐámřWţzŢ˙ŕ#˙…đ¶ü+˙=ođ˙ÂĽ2Šíţ·s¬>Çą˙ÂŰđŻüő˝˙ŔG˙ ?ámřWţzŢ˙ŕ#˙…xegC¸}aö=Ďţß…ç­ďţ?řQ˙ oÂżóÖ÷˙ü+Ă(Łű:Ăë±îđ¶ü+˙=ođ˙ÂŹř[~˙ž·żř˙á^EŮĐîX}Źs˙…·á_ůë{˙€ŹţÂŰđŻüő˝˙ŔG˙ đĘ(ţ·púĂě{źü-ż ˙Ď[ßüđŁţß…ç­ďţ?řW†QGöt;‡ÖcŘ5ź‰^ÔN–±Ot˘ßT´ą‘žÖ@i2łč8ö­?ř[~˙ž·żř˙á^EŮđîX}Źs˙…·á_ůë{˙€ŹţÂŰđŻüő˝˙ŔG˙ đĘ(ţ·púĂě{źü-ż ˙Ď[ßüđŁţß…ç­ďţ?řW†QGöt;‡ÖcÜ˙ámřWţzŢ˙ŕ#˙…đ¶ü+˙=ođ˙ÂĽ2Š?łˇÜ>°űç˙ oÂżóÖ÷˙ü(˙…·á_ůë{˙€Źţá”Qýťáő‡Ř÷?ř[~˙ž·żř˙áGü-ż ˙Ď[ßü割Źěčw¬>Çą˙ÂŰđŻüő˝˙ŔG˙ ?ámřWţzŢ˙ŕ#˙…xegC¸}aö=Ďţß…ç­ďţ?řQ˙ oÂżóÖ÷˙ü+Ă(Łű:Ăë±îđ¶ü+˙=ođ˙ÂŹř[~˙ž·żř˙á^EŮĐîX}Źs˙…·á_ůë{˙€ŹţÂŰđŻüő˝˙ŔG˙ đĘ(ţ·púĂě{źü-ż ˙Ď[ßüđ®ŞŰĹşkx55ѵXífž b—u¬ň|Í!\`ŕ‚1‘ü$㦠‹á7ü“-#ţŰčç«÷ş—‰^Âá$đNĄ4LFş·ÂŚrOď;U„ßňL´Źűm˙Łž¸žĆçiQÚ˙ÇŚ_ďÍ˙٤©*;_řń‹ýůżôt”€—Ŕ_ęµ˙ű É˙˘ă˘ŹŞ×˙ě/'ţ‹ŽŠĐ’[źő«˙\Ó˙AVŰţAö_őéţ‹Zµsţµëšč"ŞŰČ>Ëţ˝!˙ŃkY”fřźJ¸×<3¨iv†1qu ‰ ݵA=Éô®çűF/OüźüUq$ŐdĐü9ŞEĘö±1Ŕlv§eř˙ţ}<5˙Ó˙ńšjŕÎ×űF/OüźüUÚ1zäD˙⫊ţËń˙üúxk˙§˙ă4eř˙ţ}<5˙Ó˙ńš­EˇÚ˙hĹé˙‘˙ŠŁűF/OüźüUq_Ů~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇÚ˙hĹé˙‘˙ŠŁűF/OüźüUq_Ů~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇÚ˙hĹé˙‘˙ЍçÔŠŰĘÖńG$á Ť$ťY±Ŕ, gľ= qßŮ~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇOgŽçËĂ_ř2“˙ŤÓmtŹŢx§CżŐcŃ µÓ®f6×ĚîCFéŚ2ŐëŘÓżâ˛˙ž^˙Ŕ»źţ3L‡P×íüAŁiú¤z0‹Qą0ćÎyť×lläáăQŃq׸ŕóR3RM:{ŹčŠÄtÓK6é’Ś©ËôŘĂűF/OüźüUpzΡ©Á©év“ś·ZڞFżk‘‘dm&IPOE#§qS˙eř˙ţ}<5˙Ó˙ńšjö;_í˝?ň"ńThĹé˙‘˙Š®+ű/Ç˙óéáŻüź˙ŚŃý—ă˙ůôđ×ţO˙ĆięŻöŚ^źů?řŞ?´bô˙ȉ˙ĹWý—ă˙ůôđ×ţO˙ĆhţËń˙üúxk˙§˙ă4jŻöŚ^źů?řŞ?´bô˙ȉ˙ĹWý—ă˙ůôđ×ţO˙ĆhţËń˙üúxk˙§˙ă4jŻöŚ^źů?řŞËńîˇ.”ŃhÖöRÝ;¨?l»"ŻRrˇ‰<ŚąĎ<÷ö_Ź˙çÓĂ_ř?˙¦Kaă¸c2IkáĄAÔý¶ŕ˙íZ†…mž9˙ź/ ŕĘOţ7RřIÖ-5moTÖF›ŢŰŰĂvw&^cf$śŞ‘ĂŹ^†˘˙ŠËţyxk˙îřÍIˇęťÖ±ŞéÚ˘ië-Ť´3e$ާĚfę˝Ŕ?xsÁ†jřvĘm?ÄÚŢ©7—ö{čmb Wvcó7 ĽúlőÚ1zäD˙â«Ď…ßő/ę:^‹kĄ:XĹŽ÷·FO™żmFÎ<łéÔUĎěż˙ϧ†żđ:ţ3M\ZŻöŚ^źů?řŞ?´bô˙ȉ˙ĹWý—ă˙ůôđ×ţO˙ĆhţËń˙üúxk˙§˙ă4ő ĘKŘĄUQ…ůÔäČ0?Ţö®JM:{ŹčŠÄtÓK6é’Ś©ËôŘYiž0°iÁˇÇd\ ZÚęi$ś|ŞŃ¨ëŽ§ŽĽô4uťCSSŇ4í& 9nµdŤ~×#".ČÚL’ žŠGNâ–·ĽţŃ‹Ó˙"'˙GöŚ^źů?řŞâż˛ü˙>ž˙Ŕé˙řÍŮ~?˙źO ŕt˙üfžˇˇÚ˙hĹé˙‘˙ŠŁűF/OüźüUq_Ů~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇÚ˙hĹé˙‘˙ŠŁűF/OüźüUq_Ů~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇÚ˙hĹé˙‘˙ŠŁűF/OüźüUq_Ů~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇÚ˙hĹé˙‘˙ŠŁűF/OüźüUq_Ů~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇÚ˙hĹé˙‘˙ŠŁűF/OüźüUq_Ů~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇÚ˙hĹé˙‘˙ŠŁűF/OüźüUq_Ů~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇÚ˙hĹé˙‘˙ŠŁűF/OüźüUq_Ů~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇÚ˙hĹé˙‘˙ŠŁűF/OüźüUq_Ů~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇÚ˙hĹé˙‘˙ŠŁűF/OüźüUq_Ů~?˙źO ŕt˙üfŹěż˙ϧ†żđ:ţ3FˇˇÚ˙hĹé˙‘˙ŠŻ—ţ*H%řˇŻ:ô/pĺŢ/N+Ú˙˛ü˙>ž˙Ŕé˙řÍhř -Bń,z˘[%čŐWĚ[WgŚ˘[c€'ŚvëšÚ…WJ|ÖąŹ2±ňĄő|ž>Ó±5-I"’$ł¸Ž7n°¤Ë#¬q\É˙Gfl‰pxG b¶-uý6k%š]KMW[>o&ídDPěÁ¸Ę‘⧍»?´?»ř˙Ŕ1úż™ńĹöŢ,đÝ˝ťµäŢ ŇŁµşÝöyžö0’í8m¬NŽ•»âť7CšÖŇ[«FÔ.n-âŠÉ®U%u–e‹zŻR,Üv‘‘ÔÚÝüŕŐüĎ(ݰě$˘ľŰ˘Źíîţ?đęţgÄ”WŰtQýˇýßÇţ}_Ěř’Šű?VԡѴkíRádh,­ä¸‘c±TRÄ 3ę*ťŻ =uYôyˇ‰®;÷fűŇGd*§ď|Ů\‚ŔROíîţ?đęţgÇ”W×çĹúŰt»uÔí5D”ŮÜ$čb™ŁtBŠŰľg- ýÖô­ =[MÔ..­ěµ K™íeĚp̮жHĂ€r§*FˇôŁűCűżŹüúż™ń…ö|𶛩—.ˇhš„Éľ+F™D®Ľň©ś‘ň· v>•]ĽK Ş^»kzhK xĆé1nĹŠ'?!,ÁÇ#hwń˙€Wó>8˘ľĂŹĹ:#Α6©cM*Ĺkşî/ô˘ÉŹ,$äJś`q†RkßxşÂ k‹ Ô!˝–8â– Ę×0ŔÄIm¦lđůpJ’2hwń˙€Wó>D˘ľżľń~akwpÚť¤Éeq˝ŕ†tclŇJ"O›ä‰'8ŔVôĹHŢ)Ń"µ’îçT±¶łYR$ąšî!Ą˘YWknî­  m “űCűżŹüúż™ńĺő˙ŠÓöŘüż3¶nÎ7cśuĹlQýˇýßÇţ}_Ěř’ŠűnŠ?´?»ř˙Ŕ«ůźQ_mŃGö‡÷řő3âJ+íş(ţĐţďă˙>Żć|I_Cü8˙’gŁ˙×KŹýkŐ+ V˙Zëˇ˙ĐR°Ä⽬9mcJTąîaęň Ľ˙®˙ šĺ~É2Ň?í·ţŽzęµ?ů^×˙ĐMrż żä™iöŰ˙G=pô6;JŽ×ţĆ˙M™–!ű‰X¤$¬ů O§iç®Y¶µ'|&ľ¶qę3Ď&’Íą‡r8ě3ŚťOíOĐ‹©˙ŕUż˙PÁµ_xrćçÂ÷ş}µŤÓË,ÓM ¨  á\ž¤v¨E.˙ä}đwý}Ü˙é,µčőŔKcuqă ^C’[ŮO<—Ł"5h$Aź«0Čî~Ó÷e˙żMţKa2j*´ÇýŮďÓ…iŹű˛˙ߦ˙ b&˘ˇűLÝ—ţý7řQö˙»/ýúođ  ¨¨~Ó÷e˙żMţ}¦?îË˙~›ü(j§ŞČ:_ĂůŠ›í1˙v_űôßáY>#Ô. Ňű?IĽÔ®ŐD0…ŚÔ±2ădäŽ:=¨x—âE§‹ŁĐ!Ňt‹Ź?/Ř‚U‰˘eŘů‡nÜŚŽH$ś®z߉WĆ~'ş<ĂN°Č…U›t™ p3Ű'ęi˙Úž(˙ˇS˙Ŕ«ţ.ťáË=`ëľ Őu=çLŠęÖÖ(–wŤËwÝĘ1ţňőĹIF‡˙äńWýzXízîëŠđ˝ťÍ§‹ĽA¨Mo*Ú]Ai2„$;'›żôŢĽűűëţÓ÷e˙żMţH’j*´ÇýŮďÓ…iŹű˛˙ߦ˙ `?ę—ţş'ţ„+Ď®˙ä}đwý}Ü˙é,µŢÍ2ĘŞŞ˛çzcaŃî+Š–ĆęăĆĽ† $·˛žy.FDjĐH?V`0?4şŹˇßŃPý¦?îË˙~›ü(űLÝ—ţý7řS5Úcţěż÷éżÂŹ´ÇýŮďÓ…MECö˙»/ýúođŁí1˙v_űôßá@QPý¦?îË˙~›ü(űLÝ—ţý7řPÔT?iŹű˛˙ߦ˙ >Ó÷e˙żMţ5Úcţěż÷éżÂŹ´ÇýŮďÓ…MECö˙»/ýúođŁí1˙v_űôßá@QPý¦?îË˙~›ü(űLÝ—ţý7řPÔT?iŹű˛˙ߦ˙ >Ó÷e˙żMţ5Úcţěż÷éżÂŹ´ÇýŮďÓ…M\ť¤wÓ?Ž˘ŇćŽ AďvÚË Ę¤¦ÂŰc°zˇ®›í1˙v_űôßá\敨[i÷>5Ônä1ZŰjiśŁeQlm‹c=í@áíîźqeź­OscVPÉ˙– Ą­ÔRÂÇôO´O%—>ŁRë“JúýĚBĐ]ßjvwĐąČ.¶ËnV)Ľ.27mgäVć™­YjţhµiÖH°^›i-äPs†Ů"«m8`%Xqˇ@ž‘áÝJ>ż|m#{„ą3[Á+H#g[D@®Uw ¶Ą‰!p\3Xúouí/FłŇił@×eŐŐĂ\ş4Ml¶Ęč‰ĺŕ‹l†,ź dú%Áčľ Ô´ß Ť.iíq{ĄÜnGb»m’Íd®rMłăŽëśdâ? Úępř‡M°–Ë:•6/6Ěž{o· Űd‰"?»iwnT· Utľ·“QšÁdÍÔ1G4‰´ü¨ĺÂśôäĆ˙—¸  QEQEQEeř—M›Y𮯥۴k=í”Öń´„… čT€N2} cŢhÚö®^ţáí4űřmÚÚŢK§uxŢHžPÓlVBâ%@ČąŹ,Ŕ± /I}o¦i×7÷’yv¶±<Ó>Ňv˘‚XŕrpéUôÍjËWóE«N˛E‚đÜŰIo"ś6É[iĂŘÁ*Ŕ€OĂţÖt}lę͡yn%W·}J{‚Ę–Ş_Α7»jp„C¸mäÓ|Ş6Ľ·:ĹÄ’D¶S[KułućÜHňBţbÇ…ŔůD”Ť±óä íúŢ=F“SE$ѦÓó" sÓ"~~ƬP¬xOVĽŐ­|‰Ľű.ěć‰çŐnÁ2FÍ„IŘŮĽÉvdÁű€Őx|%­Á¤ÇoP"ŮËivk¬KŤ<¬r)‘. ß!ńĺH®€2T„EyÝĎ5«­4ÚŤĄĚ÷úeݧžŕĆd–[k8˛Ş µ´„ś\gśXÔĽ©^xŞmR9í{ŔVvݵ_Nb>î3‹){˙zśw̲ĽČ˘@b}Ťş6PNĐß)# 0Ă‘‘śŽ OTÖ-ô…„Ü$íçKKĺÄHIceľčůĄS‚r@bÚh‡>×çŐ"Ľşž fµ<ş”ňý˛eą¶ś)“e˛ą· ÷Ţ0(b÷ÁşµÎµ>´R¸–Wo˛Ă«\ZAhŚ|ř“sm{fJá†8+Šî/o­ôřk©<¸ÚXái9ycAÇ«2ŹlóĹIË+ĚŠ$'ŘŰŁeí ň’0Ă 9ČęcĂĎż…m­Ú‡F•K…   µ–Ǭ‹Ă1ŕIëĎęŢ ŐµMkÍ»H/í·.ĆmZâ14RA4IŮŐ q`J¨dRX…-ŤĚEv¶¬šTPŁOuqs/“omÝňľÖrvUDvů}Ü ’Đ ?›Âü˙bĽşąű]Ĺ·Ú"ŠÓűb{o&<ś/Ú˘ŚI.Ó~tÉó>f%7i¤Ř.•ŁXéČ# io 嫨^38îÄú“Ö®Q@Q@Q@Q@ajßëOýt?ú VíajßëOýt?ú R–ĂF§˙ «Ďúŕ˙ú ®Wá7ü“-#ţŰč箫S˙Uçýpý×+đ›ţI–‘˙mżôsÔtÚTvżńăűóčé*JŽ×ţ×âżúďżđ>Ó˙ŽWŁŃE\ó/ío˙Đźs˙+?ţ;Ko®jgYÓtű˙Ëb/ç0Ç+ŢŰČÎ~XÝ›î©íŚŕdf°ĽqăýGÁWQ™<;ö˝>l®ŇďhÝŽQ†Ăµş‘ÉČät XłÔ5SÄ>ĽÔôżěÉĺż™–ŘÍć:ŻŮäÁo•v±ţďn3Î@‘›šĆ±q§]éövzdş…ŐüŹPĹ*!ʡsË>ę·~ÔßµřŻţ„{ďü´˙ă”]˙Čűŕďúűą˙ŇYkŃ餬&Ď8ű_Š˙čGľ˙ŔűOţ9GÚüW˙B=÷ţÚńĘôz)ŮĎ8ű_Š˙čGľ˙ŔűOţ9GÚüW˙B=÷ţÚńĘôz(˛ žqöż˙ĐŹ}˙öźürʵřŻţ„{ďü´˙ă•čôQd<ăí~+˙ˇű˙í?řĺ5ďĽRŠYüzŞ:“¨Z˙Ł+Ňjž©˙ éć(˛ ž}ý­â?úîđeg˙ÇjĆŤ«]jZ…ýŤćú|öPE3ŁÜE)a#2Ż1ł÷[©ĎN9ÍqW˙uË/‡_ÁŹ&˘íV;ü¬Ęs‡Rc.98ĆqŽ«ĂćVńź‰Ěč‰1Ó¬ Ş9eVÝ&@$ Ś÷Ŕú ‘’Ë­jrkwš^•áëťIí#ŠI^+c $Ý·ýc/÷¦zTźkń_ý÷ßři˙Ç*ç˙äńWýzXízî餅sÎ>×âżúďżđ>Ó˙ŽQöż˙ĐŹ}˙öźür˝ŠvAs€±—ÄWĐCyá[«wpŻs-廬`÷Â9céŔďŘsPëĹĆťw§ŮŮé’ęWň×âżúďżđ>Ó˙ŽWŁŃE\óʵřŻţ„{ďü´˙ă”}ŻĹô#ßŕ}§˙ŻG˘‹ ąçkń_ý÷ßři˙Ç(ű_Š˙čGľ˙ŔűOţ9^ŹEAsÎ>×âżúďżđ>Ó˙ŽQöż˙ĐŹ}˙öźür˝Š,‚çś}ŻĹô#ßŕ}§˙Łí~+˙ˇű˙í?řĺz=YĎ8ű_Š˙čGľ˙ŔűOţ9GÚüW˙B=÷ţÚńĘôz(˛ žqöż˙ĐŹ}˙öźürʵřŻţ„{ďü´˙ă•čôQd<ăí~+˙ˇű˙í?řĺkń_ý÷ßři˙Ç+Ńč˘Č.yÇÚüW˙B=÷ţÚńĘf—i©ęŢřdÚl–ş•ÔłB–rK0v°TV+ÎAëĆyŻJ®Ăßňńgý…c˙Ň+Z,+úÖ™«x‘×P:TöKklne‰¤ĽŤ®-ĺ™>Gd ŃŔc›d`Űeł×ĂS$ââçÂźjĐŚłV,!VQŽ\V|~ľMćĐnŢ3q ˘Kob÷w®«!c}űŃÄ[™H;–MÜđĂĚ> g…nÝĄŚNčΑ–™T€Ä¤Ę í¸zŃđÝ[Ĺqo,sA*ŽHŘ2ş‘AG9 +ąđ>ł4šŚŇi"é4ű“bmJ,p]›Kâh7LJ‚P­ÁPŁ‘‘›—žÔăńţĎÓc‹I‚őÖ(ž4Ž(Ľý2VŘ™Fč.€H'« úeäoŕíjďP¸{ŤB“˘ĎŞBRÉ-ofK»yŠÄ#ĂČRp¦ă+ąÍXÔü}yy,ͣݦ×ăÓ-RĆF\ÚÚG1Ϻɝ2á‘·*ÄתQ@žŁá¦Ôt˙ Řj6‘ę0XÜ+_-Ü‹p-¤Éą‹¨óÉÎĐI9ŔíĎę^Ö®<]. ¶:”RJ÷)sw¦(D–ĆŢT$„‰Ěąň8ě)# ŞG¦Q@O7‚ő ´ë(ćŃ<˝6)nÓôű==frÂÓĹ.ëc Ę ˇ Ő}3I¶šĎF±µ¸’I'†Ţ8äy&330P .UK’GŢÚ3ץ\˘€ (˘€ (˘€ (˘€ ÂŐżÖźúčô­ÚÂŐżÖźúčôĄ-†Ś=OţAWźőÁ˙ô\ŻÂoů&ZGý¶˙ŃĎ]V§˙ «Ďúŕ˙ú ®Wá7ü“-#ţŰčç¨č3´¨íăĆ/÷ć˙ŃŇT•ŻüxĹţüßú:J—Ŕ_ęµ˙ű É˙˘ă˘ŹŞ×˙ě/'ţ‹ŽŠĐ’[źő«˙\Ó˙AVŰţAö_őéţ‹Zµsţµëšč"ŞŰČ>Ëţ˝!˙ŃkY”axęn<¬Ao,Ň[2$hĄ™đ©&˝+ívßóńýö+—Gd`ČĹXt ŕÔżką˙ź‰ďłM;GGö»oůř‹ţű}®Űţ~"˙ľĹsźką˙ź‰ďłGÚîçâ_űěÓ掏ívßóńýö(ű]·üüE˙}Šç>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ,tk¶˙źżď±GÚíżçâ/űěW9ö»źůř—ţű4}®çţ~%˙ľÍÁcŁű]·üüE˙}ŠŽ}FŇÚŢYŢu)a.ÄžrXűIíXką˙ź‰ďłGÚîçâ_űěŃĚ9)|[a:›C×dPĘá_G€ĘC)ĺz‚„ ‚-Pëž6đł[éš´Iky#Ę÷6ÄŠ . îeÇRâ+´ű]ĎüüK˙}š>×s˙?˙ßf•ĐĚ;¤s㏠ĘŚpÜÜ<ŻŽM´‹’{ ˛Ž{;×ö»oůř‹ţűĚÇ,‘gË‘Ó=v±§ý®çţ~%˙ľÍ …ŽŹívßóńýö(ű]·üüE˙}Šç>×s˙?˙ßfʵÜ˙ĎÄż÷٧Ě+Úíżçâ/űěQö»oůř‹ţűÎ}®çţ~%˙ľÍką˙ź‰ďłG0Xčţ×m˙?ßbʵŰĎÄ_÷Ř®síw?óń/ýöhű]ĎüüK˙}š9‚ÇGö»oůř‹ţű‘â]nĎMŃžV%ťQcłçrsźş€0'·R*źÚîçâ_űěŃö»źůř—ţű4sŽHř¶Á§I·®™‘YCŁÍąTHo•\ýĄ;Â×âoęĘúŢŢk;DCwjđ–*ňn0ĆGOQ]_Úîçâ_űěÓ^âwRŻ4ڧ¨,H©źá1äxăÄÓËű¸d¶±D‘řVeó‹{sé¸z×kö»oůř‹ţűÍ%ÄčˇRiG@Nű]ĎüüK˙}š®`±Ńý®Űţ~"˙ľĹk¶˙źżď±\çÚîçâ_űěŃö»źůř—ţű4s Ćü÷:*¤Ńł0'ď á.‘ĎŽ<'(V1Ăspňľ8E6Ň.Iě2Ę9î@ď[źką˙ź‰ďłLŽY"Ď—#¦zíb3Jă±Ó}®Űţ~"˙ľĹk¶˙źżď±\çÚîçâ_űěŃö»źůř—ţű4ů…cŁű]·üüE˙}Š>×m˙?ßbąĎµÜ˙ĎÄż÷ŮŁíw?óń/ýöhć Úíżçâ/űěQö»oůř‹ţűÎ}®çţ~%˙ľÍką˙ź‰ďłG0Xčţ×m˙?ßbʵŰĎÄ_÷Ř®síw?óń/ýöhű]ĎüüK˙}š9‚ÇGö»oůř‹ţű}®Űţ~"˙ľĹsźką˙ź‰ďłGÚîçâ_űěŃĚ:?µŰĎÄ_÷ŘŁívßóńýö+śű]ĎüüK˙}š>×s˙?˙ßfŽ`±Ńý®Űţ~"˙ľĹk¶˙źżď±\çÚîçâ_űěŃö»źůř—ţű4sŽŹívßóńýö(ű]·üüE˙}Šç>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ,tk¶˙źżď±GÚíżçâ/űěW9ö»źůř—ţű4}®çţ~%˙ľÍÁcŁű]·üüE˙}Š>×m˙?ßbąĎµÜ˙ĎÄż÷ŮŁíw?óń/ýöhć Úíżçâ/űěW) ˝ÖĄoăë]2čCyqvŃ[N$*#‘¬-¶ĺä`ŕär1V>×s˙?˙ßf“ÁŽĎyâ†v,ÇU\’răÎÚšwŚ›ŤoV2Üišf“XŻX˘Š(˘Š(˘Š(˘ŠĎ×mo/Ľ=©Ůé×gľžŇX­ćŢSË‘…mĂ‘‚AČäWq­ęĆ[Ť3LŇg‹LM=“ČUĹłŘhc!eG 6Ôyś,ĺŚr˝Šó? A®^x‚ÚËÝdéVŹtŃ»Asjł€,š5q9iHó|nrNÖP|ĽĄg±ńުЬĂëÄ÷öŃC}Ůí¶ÁŁK‡r¬op A±J©l`.ß\˘€<î-.â۵âk/ĄŘ\Mmc*Ës#fD˛‘Cş’ňD]n2Ň۵ŠËĐań[ßhݍ_j±\¬6BÖw2o‹É‹ĎódóVb˙h ć«J:®O–+Ö( Š*9§†ŮĎ,q!u@ÎÁAf`Ş9îX€r@  (˘Š(Ş÷×öześ——÷pZZÇŤóO Ť$–< ’ăV(˘Š(˘Š(˘Š(˘Š(¬-[ýi˙®‡˙AJݬ-[ýi˙®‡˙AJRŘhĂÔ˙äy˙\˙A5Ęü&˙’e¤ŰoýőŐjň Ľ˙®˙ šĺ~É2Ň?í·ţŽzŽ;JŽ×ţÓi˙?ö?ř˙EQQý¦Óţěđ.?ţ*Ź´ÚĎýŹţÇ˙ĹQf”Ti´˙źűü Ź˙ŠŁí6źó˙c˙q˙ńTY%Úm?çţÇ˙ă˙â¨űM§ü˙Ř˙ŕ\üU`IEGö›Oů˙±˙Ŕ¸˙řŞ>Ói˙?ö?ř˙EQQý¦Óţěđ.?ţ*Ź´ÚĎýŹţÇ˙ĹQf”Ti´˙źűü Ź˙ŠŁí6źó˙c˙q˙ńTY%Úm?çţÇ˙ă˙â¨űM§ü˙Ř˙ŕ\üU`IEGö›Oů˙±˙Ŕ¸˙řŞ>Ói˙?ö?ř˙EQQý¦Óţěđ.?ţ*Ź´ÚĎýŹţÇ˙ĹQf”Ti´˙źűü Ź˙ŠŁí6źó˙c˙q˙ńTY%Úm?çţÇ˙ă˙â¨űM§ü˙Ř˙ŕ\üU`IEGö›Oů˙±˙Ŕ¸˙řŞ>Ói˙?ö?ř˙EQQý¦Óţěđ.?ţ*Ź´ÚĎýŹţÇ˙ĹQf”Ti´˙źűü Ź˙ŠŁí6źó˙c˙q˙ńTY%Úm?çţÇ˙ă˙â¨űM§ü˙Ř˙ŕ\üU`IEGö›Oů˙±˙Ŕ¸˙řŞ>Ói˙?ö?ř˙EQQý¦Óţěđ.?ţ*Ź´ÚĎýŹţÇ˙ĹQf”Ti´˙źűü Ź˙ŠŁí6źó˙c˙q˙ńTY%Úm?çţÇ˙ă˙â¨űM§ü˙Ř˙ŕ\üU`IEGö›Oů˙±˙Ŕ¸˙řŞ>Ói˙?ö?ř˙EQQý¦Óţěđ.?ţ*Ź´ÚĎýŹţÇ˙ĹQf”Ti´˙źűü Ź˙ŠŁí6źó˙c˙q˙ńTY%EᏱů>0ţŃň>Ăýˇţ‘öŚy~_Ř­÷oĎqśçŚRý¦Óţěđ.?ţ*¦đC#Üř™Ł’9꫆ŤĂ)˙D¶čGQ8Ď ęwPxkE‹FŐ~Íc•ŁÇäÚEFfş¸’ Ü’„ůŠAn¸Ţ§poxżRKŤN9\p𛼶VůůßňŤ¬ĽçÔ( 'ÔüYâ[yüC*j–0Ék VĂÍWšâIL3y É»dMľIYIŔË 5ů/-ˇâ)n¬#ż´ą‚hďĹŚ©”ĨĚŤDFÄd •f:‹uťCÄ×–“Řß}˘Ňk¸ě.µY–%L#· •VóNäĆá‚[Ň( ;×R>?ę-Ł\Ď/‰-7ĄÄ"ćň+ë1i†Y˘±™ŁÁ—ĺ\Çp2ř†D§Ő( #—ĚĽͭĺݨ´˛ąÔš‹H[‡†ËOuK9Ě®iR:¨kZ…ëx’ &ęçí‹c¨CÜÍ biÚ´™FćEP9ť†(!S •ÍzĹăwţ&Ô5‹™¬›UŚZJđę‚ć.´ĄŠúÔź5*!(Žĺ„†\Ž[ Ĺ®_ř‹R¶Ô.á±Öěmô÷»ËjóÜ[Ú‰ł˛17‘$lÎ$‘±°ĺ!SiőŠ(‹ÖVűS¶đGźw%Ťü÷ˇĺšŇ-Ąě7¶¤čHČĂ®@<ŕôÇÔĽe©Űřş[{MSM…${ާy6Ć+y\Lń,K"DZŰ̬ r´n}2ŠňyĽW«¶ťd ×|‹W–ŕM«j¶Ă$!Ú\-»Ĺ$mľR3ą1ľJěeŻLŇfąąŃ¬g˝‹ą-ăy„qş(r ¶ŔuĎ ů«”PEPEPEPXZ·úÓ˙]ţ‚•»XZ·úÓ˙]ţ‚”Ą°Ń‡©˙Č*óţ¸?ţ‚k•řM˙$ËH˙¶ßú9ëŞÔ˙äy˙\˙A5Ę|$x[áĆŤą¶1™Dm:$ĚřIĎ5=vµŻüxĹţüßú:JtR$Ń$±śŁ¨e8ęJmŻüxĹţüßú:J@Kŕ/őZ˙ý…ä˙ŃqŃG€żŐk˙ö“˙EÇEhI-ĎúŐ˙®i˙ Š«m˙ ű/úô‡˙E­Zą˙ZżőÍ?ôUmżäe˙^˙赬Ę˙‡ýşG˙Ł%©*6˙‡ýşG˙Ł%®>ů¦…üS«EwyöŰ •[(ľÓ!‰›ěвĹäîŘŰÝĘ㉔†ÁĄÂř‡ĹzŤ˘ę ·›¦Ď+lŃC+7Îło8h]xDő Ŕ,ű ^˙Nłą·‚Ý$k«»Ô°mŚGÚ>Ű*‘&ÝĂ#üĽěŽcü"‹ŰŃXZŚ—çĆD—I-is$ńČŚë"¬–ă€pŘc†9ĆO5Ď^ř‡XąŇô·YíˇmYmo-š(śe76Ęc“çýč"p 2ńópßQ\­÷5;-Rى.íažŢÎúD·©<¬!šmŔbXŰ®7u+KÂZ­üV^±¸Tµ˛–ÂŢ;bÖí!»al±"ľ"#ĺuä!*NNŇŔvôU]6in4»Iç’ÚY¤äµbŃ3”'Ş“ÓŰĚxž{>˝2]\ÄÚVŽ—¶‚)š5Y‰¸%™T ýŇ|®pxääŘŃYÔörÚ^ęä˛Î"6ö3lši6îeHe8!řeŔbusöZ†žf»ÔnžňÖĘÁež5›%·@ó1 qٵąRć"I8wÔQ\ ĺ˙‡4››éµŐ“ßę‚;uŤŁ‘Z7ą›&MĚ>QŘ1¸ś`€wÔW0şŢ§iâ+Mń¬îY#/<04CcĹrÁB—o5¸ç8!±ŚlJǡĎvP°m‘áýBâţŇăís#ÝA?•2-Ł[[j¶ÂßqĂąX©`ž§^…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@'„a[–ńdd &¦Śr20ÎŘpĘASî#µ-'„`†éĽYoqsA.¦HäPĘęlí#ŚSŽâg?Łř‹[Óü%Ě70Mo¦řjÓXş«,óÝĽ‹3Ȣc/Éź+‚U±»¦sÄţ˝ö™ô÷š=*áďmľĂ ´w2B/­âóŚé.ÇFóE„pŹ™»K} G´ł’ÎŰJ±†ÖXĽ‰!ŽÝ<±ŘT ËąÇOť˝MhZÓśçĚăçÎć럼}jÉ9˝KĹľź¬ŰC1ŢŮÁqka©K¨ŤRâfŤr§Ü  ˘m˘9;wç%y?ęÚŤ—†ĎEŹÎÔçű$˘ł,Ů…4Ű íóM Ś4‘ŹľOÍžJúcřkA’âŇáôM5§˛DKYŐ @¨r2ˇO cµxkAą˛Sčšl¶ŐÄjŚ•jv‘Ś„Aě(‡ŇĽGŞęvWşŮš5°ąÔôˇ“ ŔgKÁeWQ° [äŘ$“JťŹxŁ\×n-¤Ô´Čílő /·ZbFUĘa@;J1 Ë”‹\¸ Ň GYa”iV"HbH"qn™Ž4`čŠq«*°€@#‘RYé:nźquqe§Ú[Ovűîd†F™˛N\–9br}O­\˘Š(˘Š(˘Š(Ć“Íkŕ_Ü[Ë$3Ŧ\ĽrFĹYDÄG ÎkňěřSR{+›ąŕšÉ¤)u,—ŤÓKVŔpł¸ÚÎŞ|˘ALHǰžn­ĺ·¸Š9 • IŠ]HÁ#ŚU;] G±Ó§Ó¬ô«{÷yÖĐۢG&áµ·(9ž˘€8˝#]ńŻă+ź=’^G{ °egQö)¤ě¨űgŔmňc“ʍą¦xÇVąŐŠ"{Ű ËI/´Ç‚( yˇY"QŤ÷ »+2¶\BFßşIÂôxkAµ·ŠŢßDÓa‚+uqÚ˘ŞL€€ŕq»­Ikˇhö:ŚúŤž•co}>ď:ćtI$Üw6ć'$sÔĐ7©x·S·ÖmľË§Čúz\ZŮߤĆÚyÚ0Ę'ę«4M„ŽE=7Ś’µăń7‰¤·ąŤ¬ŁŹSŤá{›1`ÎÚt$>a"l^ÝíIVęvî]u—ZŹ}¨Á¨ŢiV7Đmňnf·G’=§ríb20I# W˙„OĂŮßŮßđŹé_aó|˙ł}Š?/ĚĆÝűqŤŘă=q@?ü'ZšI¨]XÍcsioi6§$ŤĂíQĹic&ŘŐ¤ýĆ˙´7f Á*͸±®k—÷ŶŹ}äI5¦ˇrĎ’$”­Ţ™"‘v‹ŤĽ–?.APĹkŃ%ŇtŮžw—O´‘îŇfxT™ŐUqČ+PŠ; $ŇtŮn Äš}ŁÎ\9‘ˇRĹBqść(Žéšt`Îő/ë·¦+{qö{]F[k­*üŰĂCöŰT•gf‘Y'\†śdmů[—>%ńíć‹§ZGy~.¤š8ĽĹ۵™lE-ĚakŹá“Ś}Ö,Ď]‚xkAŽâîá4M5g˝GK©ŐN®ráÎ2ÁŹ$ç˝xkAą˛Sčšl¶ŐÄjŚ•jv‘Ś„Aě(›ńÜxŹGđŠ±‹űRí{{•¶Ě ¤ňě`¬«*†U ŚŞ°č(»ń~łĽc°Ň˙´4ۉn--Ä}Ě1JĚža™‰ůŕ‘9‰9Ü@űI †g…ĺŠ7x_|LĘ FÚW+čvł ŽÄŽőź?†´«ůoî4M6kÉP¤—ZŁHęSaÉ~\zqŇ€8öńĺx4Ë#ĽŐ‹În•tĎ(ÚůKchĺşPÇý!O’˛‘ŤˇÜ;Ť&őµ-ĆýâŽ'ą·ŽfŽ9–eRĘŻ~đŕő^O h3ipérčškéđľř­Ő HÜň©Śó7 w>µ©@Q@Q@Q@ajßëOýt?ú VíajßëOýt?ú R–ĂF§˙ «Ďúŕ˙ú ®oŕßü“íţşI˙ŁŢşMOţAWźőÁ˙ô\ßÁżů'Úýt“˙G˝JŘgI¦Č*Ďţ¸'ţ‚*k_řń‹ýůżôt•™˙ «?úŕźú©­ăĆ/÷ć˙ŃŇR_Ş×˙ě/'ţ‹ŽŠ<ţ«_˙°Ľźú.:+BInÖŻýsOýU[oůŮפ?ú-jŐĎúŐ˙®i˙ Š«m˙ ű/úô‡˙E­fP7ü„?íŇ?ý-VţÇÓ?´˙´˙ł¬˙´?çëČ_7îíűřĎN:ô⬲ÎdÜ—LśC` śež¤ž˝Íş˙źé?ďÄün€)Í č÷’^O¤ŘËu"”yŢŮŮJí ± ŻËôâžt«_·[]*lű?šÉ€#ß!¤Ć>˙ŢşâGţń«8ş˙źé?ďÄünŚ]Ďôź÷âţ7@ ąłµĽňľŐm ţL‚hĽÔ ±ÇF\ôažć ŹGÓ"űg—§Y§Űsö­°(óóśďăćÎćëž§Ö¬âëţ¤˙żńş1u˙?Ňß?řÝS}Gyí§}&ŦµUKy ˛…TĺB| éO¶ŃôË+Łui§YÁpc™bUö\ť *€:p=*Î.żçúOűń˙Ł_óý'ýř˙ŤĐĂ VđG¤Pơ4PŞŞtTZm…ěöóÝŮ[\MlŰŕ’X•Ú&Č9RGĘrOASbëţ¤˙żńş1u˙?Ňß?řÝV»ŃôËřŢ;Í:ÎĺA3¬Đ+†p»CG-´ž¸¦ GT´EŇlBٱ{eɝħ)ČŽős_óý'ýř˙ŤŃ‹Żůţ“ţüA˙ĆčJ…líWËŰmňäi“>WmŰz1ŢŮ=NăęiŘş˙źé?ďÄünŚ]Ďôź÷âţ7@ÓAŃâÓĺÓăŇlRĘVß%˛Ű ŤŰŽJăüŁň”řt}2ÚŐí`Ӭⷒ?%âHQ“,v ĺÜă§Ě}MYĹ×ü˙I˙~ ˙ătbëţ¤˙żńşmĄť­…ŞZŮŰCmn™Ů(''p9$ţ55G‹Żůţ“ţüA˙ĆčĹ×ü˙I˙~ ˙ăt%.żçúOűń˙Ł_óý'ýř˙ŤĐ”Txş˙źé?ďÄünŚ]Ďôź÷âţ7@QQâëţ¤˙żńş1u˙?Ňß?řÝIEG‹Żůţ“ţüA˙ĆčĹ×ü˙I˙~ ˙ăt%.żçúOűń˙Ł_óý'ýř˙ŤĐ”Txş˙źé?ďÄünŚ]Ďôź÷âţ7@QQâëţ¤˙żńş1u˙?Ňß?řÝIEG‹Żůţ“ţüA˙ĆčĹ×ü˙I˙~ ˙ăt%.żçúOűń˙Ł_óý'ýř˙ŤĐ”Txş˙źé?ďÄünŚ]Ďôź÷âţ7@QQâëţ¤˙żńş1u˙?Ňß?řÝIEG‹Żůţ“ţüA˙ĆčĹ×ü˙I˙~ ˙ăt%.żçúOűń˙Ł_óý'ýř˙ŤĐ”Txş˙źé?ďÄünŚ]Ďôź÷âţ7@QQâëţ¤˙żńş1u˙?Ňß?řÝIEG‹Żůţ“ţüA˙ĆčĹ×ü˙I˙~ ˙ăt%e[_\ižř‡g'—uk,łBűAÚëaSÁÁ­hâëţ¤˙żńşo…ěaÔ­üa§ßqou¨f ˝ĘÜňcqЍ‰™—~)Ömot­1ď1yo(´Ô”źľqya“¦Ě‚ŕľŐ?/›Śî^; kë‰Wy.CőäFź—ą˘űÂÚ6Ł«IŞ]Yů—Ďh,ĚÂWR" nÚÁŔ`ă б¦h¶ZGšmVv’\šććK‰ áwČĚŰFX…Îf dśĐŤ (˘€ (˘€ (˘€ (˘€ (˘€1üY}q¦x7\żł“ËşµÓî&…öµÖ6*px8 u®NOjvz†—¦Ý\Č÷09łżŘ±©šQwcK÷Pń\ů… ”®C(eď/ěmő=:ćÂň?2Öę'†dÜFä`C ŽFA=+>÷ÂÚ6ˇ­.±ugć_¬QÂ%ó\a#™gA€qÄŠ­Óś`ńĹqíń SŐt¤¸Ó4yíĽůläłžhćHäŽK¨P¤Ź$U™%˙–fQŤä•Kt×§¶¶†Ú4žßR[»ś­¬­YnaI&xÂ?Ë!|ÝN#đ†‡L‹i!Ib+ÜJÂÝC ·îeB{pQĆĹĆ„Ú]ĄÎ–4éŇImÂ*Ťň»8Ű‚­ćżx ůÜ9ć€9˝[ÄúŽ›ăOě«k?·-ĚV±ŰŔeX„r8˝vvb Ű‹t© ź•ŁÔtůą XĐĽIŞk>+ą·KhÂHĹĘ4˙4¬÷PąŹţńY ,S ĆI±iá}&Îxn帆_9'ą»–yt|ŚX¨Yd“´bNjKi–—©ymÎŻ+–ŽyHdwvŢaĆé$e RÇn3@”QEQEQEQEQEQE…«­?őĐ˙č)[µÍë—¶°\湆7Ţ[kČĆŐçč*RŘhĘÔ˙äy˙\˙A5Íü˙’} ˙×I?ô{Öޡ¨Y>›t‰ynĚиJ¤“ď\ç´†ş;Evńç(Ž?|ýŮ ýjz ë4ĎůY˙×˙ĐEMk˙1ż7ţŽ’![{xáBJĆ=p(µ˙Źżß›˙GIH |ţ«_˙°Ľźú.:(đú­ţÂňč¸č­ %ą˙ZżőÍ?ôTŇŢXáŠ!~›cŤcł9¨ţZűUËźő«˙\Ó˙AJÎÎ,í?u4˛Éo±űLŮbPpÜÔ?É›ţŁ˙Ŕ3˙Çhňf˙źč˙đ ˙ńÚ›ű,ĎŤĎý˙¸˙âčţËóăs˙î?řş‡É›ţŁ˙Ŕ3˙Çhňf˙źč˙đ ˙ńÚ›ű,ĎŤĎý˙¸˙âčţËóăs˙î?řş‡É›ţŁ˙Ŕ3˙Çhňf˙źč˙đ ˙ńÚ›ű,ĎŤĎý˙¸˙âčţËóăs˙î?řş‡É›ţŁ˙Ŕ3˙Çhňf˙źč˙đ ˙ńÚ›ű,ĎŤĎý˙¸˙âčţËóăs˙î?řş‡É›ţŁ˙Ŕ3˙Çhňf˙źč˙đ ˙ńÚF·´K†·hťgTWhÍÜÁ‚± 7ç«Ů>•?öX˙źźű˙q˙ĹĐ>Lßóýţźţ;G“7ü˙G˙€g˙ŽÔßŮcţ|nďýÇ˙GöX˙źźű˙q˙ĹĐ>Lßóýţźţ;G“7ü˙G˙€g˙ŽÔßŮcţ|nďýÇ˙GöX˙źźű˙q˙ĹĐ>Lßóýţźţ;G“7ü˙G˙€g˙ŽÔßŮcţ|nďýÇ˙GöX˙źźű˙q˙ĹĐ>Lßóýţźţ;G“7ü˙G˙€g˙ŽÔßŮcţ|nďýÇ˙PĎkmlbÁ$FWŮ’ęuŢŘ-—äáXăĐÚ€&oůţŹ˙Ď˙ŁÉ›ţŁ˙Ŕ3˙Çhű-Żüń“˙§˙âë.ď[đĹ…ÓÚŢj–6× ŤńMŞş:ädd28 ţ4©äÍ˙?Ń˙ŕ˙ă´y3Ďôřříb˙ÂOŕďúéźř8oţ;Gü$ţ˙ î™˙†˙ă´µäÍ˙?Ń˙ŕ˙ă´y3Ďôřříb˙ÂOŕďúéźř8oţ;Gü$ţ˙ î™˙†˙ă´µäÍ˙?Ń˙ŕ˙ă´y3Ďôřříb˙ÂOŕďúéźř8oţ;Gü$ţ˙ î™˙†˙ă´µäÍ˙?Ń˙ŕ˙ă´y3Ďôřříb˙ÂOŕďúéźř8oţ;Gü$ţ˙ î™˙†˙ă´µäÍ˙?Ń˙ŕ˙ă´y3Ďôřříeµ˙ž2ŕT˙ü]eµ˙ž2ŕT˙ü]Lßóýţźţ;G“7ü˙G˙€g˙ŽŃö[_ůă'ţO˙ĹŃö[_ůă'ţO˙ĹĐäÍ˙?Ń˙ŕ˙ă´y3Ďôřříeµ˙ž2ŕT˙ü]eµ˙ž2ŕT˙ü]Lßóýţźţ;G“7ü˙G˙€g˙ŽŃö[_ůă'ţO˙ĹŃö[_ůă'ţO˙ĹĐäÍ˙?Ń˙ŕ˙ă´y3Ďôřříeµ˙ž2ŕT˙ü]eµ˙ž2ŕT˙ü]Lßóýţźţ;G“7ü˙G˙€g˙ŽŃö[_ůă'ţO˙ĹŃö[_ůă'ţO˙ĹĐäÍ˙?Ń˙ŕ˙ă´y3Ďôřříeµ˙ž2ŕT˙ü]eµ˙ž2ŕT˙ü]Lßóýţźţ;G“7ü˙G˙€g˙ŽŃö[_ůă'ţO˙ĹŃö[_ůă'ţO˙ĹĐäÍ˙?Ń˙ŕ˙ă´y3Ďôřříeµ˙ž2ŕT˙ü]eµ˙ž2ŕT˙ü]Lßóýţźţ;G“7ü˙G˙€g˙ŽŃö[_ůă'ţO˙ĹŃö[_ůă'ţO˙ĹĐäÍ˙?Ń˙ŕ˙ă´y3Ďôřříeµ˙ž2ŕT˙ü]eµ˙ž2ŕT˙ü]Lßóýţźţ;Př{PŹDÓük©Ýš+Ö¸“ĘŚ+2Ą•»±çąüŞo˛Ú˙Ď?đ*ţ.ťŕű[y˙á+µ–’Ú]L#Ĺ.dWSgl;‰Č9<hL—QńĄáxEďE¤ö“$̱éń0{vŽ'(K¶%"qżňĺĂ–Ś"ŤÍ¬ÚFĄ¨]-5Ľ“,ˇÖFVV€Ä3™ÁýŮă•Ü\ř6ÚúĘęĎPÔµ+Ř%·–Ú¸‘Ú$QŠ™gÚĹwČ]±ž~gÝcR𽶡Ş6¨.îíoÂB±OBa1ůŔ2‡VRJÜJ§p#`ŞËŰ|PÓôË5]yäŠí®.ŢT’KxÚÚşš4Ę™BĆF"óäîYwtĆ=…ýőľ‘©Oocq-Ľň&'‘d`ŇČ€˘ůy-ś|ŕu;_ÁfżčúΫ’ď’ŁÄŻv­,’ÄF6a¦—/-†ţą E‹ź Á>™”:ŤőŞĹ¨I¨ "ň™I$Ă+Ł)PňnPW ˘ĺs@Ăă+ižéş”03Á óM µžeC2!}ű˙{;U”# Ž~ç➍fͦ_Çnc¸´Ď$Đ2µ«]C®B»†Ů„a»•m˝!đśx'—Qľ’7–›Ę uq@“90ň˘8B¨v—ŽŰCk ›jZ”–vĎ´¶i%˛C*HˇP‰t…Űáf$rĆëíÖqÜ‹yŕY2U'MŹ·'ŻUČÁÁĂ ŕ€rЧ¦é°éVímlŇ `äĂ VŔůŚ„$ťąŔÂ…Qr€ (˘€ (˘€2üK©MŁxWWŐ-Ö6žĘĘkÖ@J–D,Á˘ł˙¶Ż´k‰muÉ-.źěSßĹ=¤f]”# d!Oď†.Ëgfܶƭ¦Ă¬č×Ú]ĂH°^ŰÉo#F@`®ĄIgĐÖ[xN $ţĐÔoŻîÎĎ*ö(Io±ÖEňÂ" ÄŽr§qU ąU@ËÓ|·¬é¶úM”—vóĄĘÝĄ…ÚŮăk|1u”Ćɶ|ť…Ď c!€ąŹôŐµ:ęň ),7™$žî›VA$¤ŤĺüĚlc»€HlIeŕř¬Ż˙´FŻ©K¨5ĂM-ÔžNéQ’hŠÂ"Ţ.B†ůxa“™4ź Á¤j6×1j7ÓCghöVv“y^]´,c;TŞlěÇ’IÍG{ăŤĂYÓté'ŤĆ˘‘5˝Äw02żĹcÂyžk8ů• ó’@ ExĽ§ĎĄÁ©Cew%­íÂ[iŇ mŔżvÝ2áN¸—aĎËŤß-\żđśÚ‹\®Ł}o ·p^ÜZCĺçšFbČ\q`…e^™$š˙đ…BbÔ ŐďšďRŘ··m©{‘YV'S–ˇnJn<Ű@ĽŢ<‚ĘúîŢóOľ˙Gß,űc}Žá·’Fů§~ß´/ú°IäljúŻŤ%7vv©=Ťá»†+›iáFx˙ҬՔş»'1]ňîű˙yH7ĂÍ!Ľ‚»† ›)¬|´RCo X¶±ŕ’y-śäbĹß‚´ŰÍfMRIîÄďp·U×nĺkVî粋żń?¨Ŕ^ĄńÖ+‹Ë >;S´»†/ł ŕ”̆ę($۲S±żx0%ŮË>VÄ—ßtýYâÔc’;qĺ%¬’[ŔČHŕÉ$Â6*gQĂs€¬ą°ľ˛S¶§©<–˙g°Ś[l”IP÷1F‚,y…ó·ćÝ“›Áń-Ô—Đjú””ŽYďSÉ.ŔĹ n»Z2ołÄÇ AÁ‘@üCŻĎ.‘ Ďˇ5ÜŃë ±Éd± ĚF & ź ň×;ÇÝ-»’˙ÇÚ&•Ż\é:„żg’Ţ'•¤ób“!b37îŃÚUÂ9díŕ’WvÄş=Ľ­Ąó˙IJ_6 Ň—,|§‹çfË7Ë#“’@$žs–ţ‹íńÜÁ«ęVńCq=ܱů&8g•$WŚą9šFĂ1\žP;ßšv›§Y]ßYĎl×ŰšÖ)®ě×ΉB“*ČgňŠüę߸ç!HŽ˘ÂúßSÓ­Żěäó-n˘Iˇ}¤nF©ÁädÖąűZŮţţËRľµÔžYĄ›P… LeŮćnCgĘ‹%P¦s–bÝ$­µĽP!¤hL’3±c–bKrI=čJ(˘€ (˘€ (˘€ ć5o řQŐ&»˝Đ´Ë«™6ďškHävŔdIŕ(ü¸ěÝ=fÝsrýú^ߏŻëÓś:cG:<áN1áŤŰý/oöO·ŻnąůńĽ-h Ň&†Öhm­ăÔo’8RÓ*Š.Ą H1Ó»nľůüsüý}ú÷ĎĎĆřv$°»wŤŮާ–®Ňĺ쯏óŢÍo&oůţŹ˙Ď˙§Ç†Ţ(„†B»Ë1M™,ěÜ źďzÓ>Ëk˙ëĆc#ě^ąmÔüYy§XéqK©Dďś,mÜvÎŹµąYHđq¸|­’  šăŻíuhI%‹i=Ľs-ŚÖ3ZM-´Ą˘Í,¤•eO n‰·e\–?+DkI›v5 •Îq…ŹĺÎî™Nۇ_î.sónŇfÝŤBĺsśacůs»¦S¶á×ű‹śüŰąËďj3M¨Áiqä۬wsnŰĺÝÎŚ¤îxŘL­žAűFX©Ľ!Ł6“öÂ-o- —`Xn~Ěź0Ý–ۨATn$±Ű‚Q Ö´™·cPą\çXţ\îé”í¸uţâç?6á­&mŘÔ.W9Ć?—;şe;n¸ąĎÍşŐ äü;3\řżYť™Y¤Óô÷%1‚Hń†aŹŁîz×ew˙“˙×FţuĹřa·ř«V}Ű÷iÚqÝ»vx›śîlýw7Ôő®Ňďţ?'˙®Ťüé±"Ą¨j¶šg–. ĚňgdpA$Ň1“±¶Ń Ć`;Š»X·qÝéúÜÚĄ˝Ś×ésm»ĂƲFci7ÎĘĄOšAäTprvˇšđĘłÁČ,ŠBŚĺHb2)őćž"Ô-˙á,µ¸şą¶˛˝‚{R™ą±Ť r4‰3;yÁ°Ňń(U”s–ͨ<%wcŁhđYéŔFťę°ÂcOµH’[3Fř HĚ‹p ±Űó°$4XG Ő[ řµwžuUžXpÝŤtí•8öĹq§†&ż¸·’ŰHĽ±¶Â+[[o±§ŘĄó$-!fĺnÝß[ĺÉU×h“ŮiŇĹp›Żnĺ üŻq#©ăŐXĆ€4ë›×˙äkđźý}Üé4•ŇW7Ż˙Č×á?úű¸˙Ňi(@t•ťˇK$W^ ňätΫÎÖ#?č–µŁYz7ü}k˙ö˙ŰKZ_ką˙ź‰ďłGÚîçâ_űěÔ4P3.÷Ć–ÖQŢ9›QZG,’46ň´»R΢\y{†Ň1»ď §ž+kíw?óń/ýökĚŽ˝bţ——ww'N}>ÚćBÔÇ;yE#™C†c´ciĂd¸čI ŢµäÄX\ĹuçÝÉ>©k,I-Ě,˘8QËoÜ»áŔpLCĺ\±ďÚîçâ_űěŃö»źůř—ţű5ćRřVö[T—IŮc“eekd˛ą" ’Í› .6H ! ¸ (ďtŘ%µŇí-çw’h DwyL¬ĚK7÷ŔĎ\ @h}®çţ~%˙ľÍs~?Ľş×qs76r)ůĎ ŚůVős?ä@×?ëŃč[ŇQE (˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š*/ _[éřÂţňO.Ö×Pó¦}¤íE˛·,p98ô©j/ XŰępřÂÂň?2ÖëPňfMÄnF˛· 29ô§ÄÍ |Q6’<˙XG¦YČ’<ĄÁ¸a˛6•–UTů_ËGoČż# ŮŰľ;żi¶íeĺÁ}'źv-ĺŘÜ$ń˛+ ~c)1.>ńĎČEGŞxFű]Ón¬u}f;„óCfégĺ´o$O›.8Ga…ŻĚÇoÝŮcTđĽ×ž ţÜ´żŽ Č’n%·2F­ąR\RŔ­Ó€\$dU’\—Ĺ:4K4—›cŠ+ąśůNp–Î#śôţ {öȨî|_ˇÚ=ŇĎw$ij’´“y|Łĺ©i$۱ÝBľQIa±řůN2ď>éןÚßk»Ž÷p¶˙:/˝Î˙´^|ÝWí}ÄĹ;ż†–׫äÓaÉxVäih×j÷ mó–Ë 2¶BRÄܸţ5ĐRUOµNĘŃ ĚÉg3B‘uYZ@›2crRŁp;y©.|_ˇÚ=ŇĎw$ij’´“y|Łĺ©i$۱ÝBľQIa±řůN2őź ęšÇutK-tŤGJ‚Ćĺš2IűŤâ2$[”|̬2Ă‚ ;ż†–׫äÓaÉxVäih×j÷ mó–Ë 2¶BRÄÜÖišŐ–Żć‹Vťd‹áą¶’ŢE8m’*¶Ó†±‚U€9ź™ĺx†÷Vółö›H-Ľ­żwĘy›vsÎ|ěcmďž4(˘Š(˘Š(?]Ô˙±<=©ęŢOťöIn|­ŰwěBŰsŚăÁŞvÚĺĚ7ZkV1ÚÝýžK¨–ĘW»YbBˇöâ5}ę]>]Ľď]ĄŽŕ·5Ý3űoĂÚž“çy?n´–ŰÍŰ»fô+»ĆsŚŠÇ»đµć­Ňjúśßy^D ohb#.’:âÇ̸ŹĚy¶ö°ůŽŰ†öeÜx/ŰŘľđ/Ű|C.­ýŁłĚ»Kź+ČÎ6˝‹mÎďúqĆq˙-?Ůů€.jŢ4Óôȧ>UŰĎÄ14/k4lęó¤,ń™)ÝîÎTgć\Č<_¦«N%3–IDi—ÎAŠ) xD{×T‚ĺ†mŁźá§“~.…őŠÉAbž=;lóČłĂ2Iu'™űöÝî !mîARx±¨|>ţŃľ“Qş›JĽľ’V­ţ—çŰ ĐŰĆűb26ĘU·p”†űÔ©â_;MŇçÓ¤ŽQ©ÜˇąŽÚKĹU1I(qGt€ńň‘ŤŰłˇ?tËKůlîç’ŐăBć[$Šo;fe± ŹđśFÚĐ#Š}‘čň‰yJ<Ŕ-ä„ U_ő™ůW`:s÷ľŃŻKÎҤķoşŇüë‰|ŘĄŹĘ–_0yŻ›€›GČąă4¸|[Ą-şLË©îĘ.çĎm a—Ľ Ü ľÝ °ÉĹlA<7Vń\[ËĐJă’6 ®¤dGÎk‡“áÂËolf¸Ónî y¶C§µÍ”) چ—1ä¦Đ…Ý {K 4Óôëk(Žc·‰"S±S!@ĺ@tč Ř@(˘Š(˘Š(˘Š+6ë›—ďĐzöü}^śáô«6ë›—ďĐzöü}^śáÓ"ëďźÇ?Ď×߯|üü‡‡tűłśçSżç9˙—ą}Ďó5×ő÷Ďăźçëď׾~~CÇ:}ŮÎs©ßóś˙ËÜľçůš—°ŃŻQÚ˙ÇŚ_ďÍ˙٤©*;_řń‹ýůżôt”€—Ŕ_ęµ˙ű É˙˘ă˘ŹŞ×˙ě/'ţ‹ŽŠĐ’[źő«˙\Ó˙Až~Řt[u°ž+{–˛…RYb2Şć5í ąŕśs×zV…ĎúŐ˙®i˙ Š«ökOůđ±˙ŔH˙řšĚŁ•o kĎ»~µ¤6ěîÎs»9ýď1˙ď¶ő47†5çÝżZŇvwgD9Ýśţ÷ż˙÷ŰzšęľÍi˙>?ř ˙GŮ­?çÂÇ˙#˙âiÜ,r­áŤy÷oÖ´†ÝťŮŃÎwg?˝ďć?ýöަ†đĆĽű·ëZCnÎěč€ç;łźŢ÷óţűoS]WŮ­?çÂÇ˙#˙âhű5§üřX˙ŕ$üM «xc^}Űő­!·gvt@sťŮĎď{ůŹ˙}·©ˇĽ1Ż>íúÖŰł»: 9Îěç÷˝üÇ˙ľŰÔ×UökOůđ±˙ŔH˙řš>Íi˙>?ř ˙EÂÇ*ŢןvýkHmŮÝťçvsűŢţc˙ßmęho kĎ»~µ¤6ěîÎs»9ýď1˙ď¶ő5Ő}šÓţ|,đ?ţ&ŹłZĎ…ŹţG˙ÄŃp±ŤˇčwÚ~©¨j:ŽĄíĹäpĆLVľHQüq˝łťţÝ*9¬<[4ňK˙ .ž›Ř¶ŐŇNOA™ł[żf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4Ď˙eř·ţ†{ü˙öÚ?˛ü[˙C=Źţ űmtf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4\ű/Ĺżô3Ř˙ŕ§˙¶Ńý—âßúěđS˙Űk ű5§üřX˙ŕ$üMf´˙ź üŹ˙‰˘ŕs˙Ů~-˙ˇžÇ˙?ý¶Źěż˙ĐĎc˙‚źţŰ]Ů­?çÂÇ˙#˙âhű5§üřX˙ŕ$üMźţËńoý ö?ř)˙í´Ř|=¬Ë­i·ú¦ąmt–2<‰V"KFÉ÷ĽĂýěôí]Ů­?çÂÇ˙#˙âhű5§üřX˙ŕ$üMJçî4}q/oeÓ5»KX.®>Đc“O2°o*8ČÝćŚDAÔő­ĎłZĎ…ŹţG˙ÄŃökOůđ±˙ŔH˙řš@s˙Ů~-˙ˇžÇ˙?ý¶Źěż˙ĐĎc˙‚źţŰ]Ů­?çÂÇ˙#˙âhű5§üřX˙ŕ$üM;Ď˙eř·ţ†{ü˙öÚ?˛ü[˙C=Źţ űmtf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4\ű/Ĺżô3Ř˙ŕ§˙¶Ńý—âßúěđS˙Űk ű5§üřX˙ŕ$üMf´˙ź üŹ˙‰˘ŕs˙Ů~-˙ˇžÇ˙?ý¶Şjžń.ŻĄÜé×~&ł6÷1Ü.”AÁô>muf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4\ (¨ţÍi˙>?ř ˙GŮ­?çÂÇ˙#˙âih”Tf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4h”Tf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4h”Tf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4h”Tf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4h”Tf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4h”Tf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4h”Tf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4h”Tf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4h”Tf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4h”Tf´˙ź üŹ˙‰ŁěÖźóác˙€‘˙ń4h”žžVńeĹıĂZy$‘‚Ş(ł¶$’xsLű5§üřX˙ŕ$üMCáí.ŰVÓük¤ĘľMµĺë[żŮŐPŞ˝•ş’Ł“Ű­TDÍŘ|QmĽ˙hZ]éP24\j"IŃTłó„(-¶@Ť€ÇoČűt/5m7NIŢűP´µHfžeA»BŮ<`@'© ÇmRÖ®­WÄ0i¦ŇÉÝŐm٤ŚŃ<$ş:â4Ů#ţď2d°ůđ§~<ţ˝}6ÝŢîKÝJÚôJ[ů`yˇŽ) ‰ ÄcĚC±üÖŔ ČŇŕäŠĐk>)Ót˝óRŠęŇéá˛kČ`K•áDo"í<đË@<+pjÄ~%ĐfŇćŐ"Öô×Óá}’Ý­Ň‘¸áź8ć^ î=k“ONšf˝GcÖŁ˘=„ e–S’Is$Ą“s˛–š<·V(NŐáEĎřB÷VńŐ`xŘD–¦(ä¶­#F.Ő– Z1‹Ą ®s°©ĐI.»ŁĂö7U±ŹűCbÝpí9Ć<ľ~|î^™űĂÖ©Ţř§M¶ńťˇEui>ˇupb–ŮnWÍDK˝““Ź‘G8űŕç±äőŹëW>“Jłh sÚOu{¸Úi^GwfÚë>bćŕ~ěŞě[ř{X·Ö4ضX¶™eŞÝę_hűC‰źĎ[Ź“ĘňöŤ­qŚď9 ś ŕvQEQEQEG<đÚŰËqq,pÁ’I*˘’I<9¬x|QmĽ˙hZ]éP24\j"IŃTłó„(-¶@Ť€ÇoČűt5m6gFľŇîE‚öŢKy2u*HČ#8>†±ŰGÔµ««Uń i´˛wu[viă4O .ޏŤ6H˙»Ě™,>|)ޱy«işrN÷Ú…ĄŞ@ó4ó*ŐŘŞÉŕ3=H V~łâť7KĐo5(®­.ž&Ľ†ąPnFň.ÓĎ ±9±çąůü zúm»˝Ü—ş•µč”<·ňŔóCRALJců­€A‘ĄŔɧ€'M3^Ť#±ŽëQŃÂ2Ë)ŠI$ą’@ŇÉąŮKM[«'j𠬏ĺ Ú\Ú¤ZŢšú|/˛[µşC73çüËÁ=Ç­I.»ŁĂö7U±ŹűCbÝpí9Ć<ľ~|î^™űĂÖążřB÷VńŐ`xŘD–¦(ä¶­#F.Ő– Z1‹Ą ®s°©Ö^±ŕ]jçĂ’iVmŽ{IăňŻw[M+ČîěŔ;]gĚP|ÜÝ’P˛÷Ĺ:m·´í +«Iő «¶Ërľl ’]ěśś|Š9Çß=Ť‹-nťGQł—ËíoEś[¤ťŤĽsüŁŽv»p3ÂôĂ·đö±o¬i±l±m2ËU»ÔľŃö‡?ž·'•ĺíZăŢr8ŔŻŞř"ňúçÄ·]AšÎűoŢá-䶆`1ňH­l/«sµŁé#ń.6—6©·¦ľź ě–ínÄŤÇ ůŔ?2đOqëUěĽ_ ß]j6ńjvěK)iÓrůËóŞŰ"Ťç ýNˇáÍoSĽ—XšÎĆ=Oý-ŁU•ą\ba/‘ó1űC/–Ń” r[;h¸đޱ6ť©XOyßŰ%´ľ{Ď5í¤’ân mŤO–Żö|ůŠŮBü!Ű’ĐMâĎ ŰŮŰ^Mâ *;[­ßg™ďc .Ó†ÚÄá°x8é[Çř·Zfą§*A讄ń‹Ůîß|źe Lł|ĎňŰś.2ŞÁcąá­6mÂşF—pŃ´öVPŰČŃ’T˛ RF@8Čô©EPEPEPEPY·\Üż~×·ăëúôçĄ\çő[mÖçPĽÝöx˛e`˛>Ä ĽíNp7xŕdž3IŤ:űçńĎóő÷ëß??!áĂť>ěç9ÔďůÎĺî_süÍCcńEń® şɸšŢݤwΡ22\É$ŕĽńÖ˛~ě˝řy¦Ý^CŐĚĎ;Ë=Ä+$’1žBK3I÷&ĄŚěę;_řń‹ýůżôt”}šÓţ|,đ?ţ&¤ŕ""¤h0©P2OqÔš@/€żŐk˙ö“˙EÇEYđeĚsŮjQÇn‘4ڱČëŚĘÄ+nVß÷éÂą)´ëż®«-µňłĎи{P¶Ń*&řťČiA%dĘĆJ6üdnr3ÓĂşÓj “ĎŹ~˘Š-c‚íÄđ»$a0:Ź?ś>ŤÍHÎÖ=.îâúě! g8‚BĐ® ŇN=± üsVżł,?çĘŰţý/řW•q§Ľ“é¶?ŘWwš‹Ac—ÄR[F$;Qš1µˇ3c9o'oůí,`űÍ6ŢÓĘÓím˘Ky<ÍŮĆĺ)ĎĘ9'ťŢĆ€ý™a˙>Vß÷éÂŹěËůň¶˙żKţjŠUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáGöe‡üů[ߥ˙ µEUţ̰˙ź+oűôżáOđĄÍžŤkâűÉĘŰŮZjiJˇÂ"ŮŰłž€žOY—~ĐŻîžęóEÓ®nĺšŐŰ$Śž…4ě&ŽËLÖ¬µ4Z´ë$X/ Í´–ň(9Ăl‘U¶ś0 ڬČ8¸fU¸H“{Ł8"6+… ¶0Ě0 ÉçÁÇťÂáŹú4Źü‹˙‰Łţ˙ Đą¤ŕ _üM>aXďdŐ-"¸»·/#Oin·3GNě#báH bLn6®O9±Ë+ĚŠ$'ŘŰŁeí ň’0Ă 9Čęu˙†?č\Ň?đ/ţ&ŹřCü1˙Bć‘˙€1ń4sŽ÷IÔˇÖtkRÝdX/m㸍d0WPŔ3ęjĺy·ü!ţ˙ˇsH˙Ŕżřš?áđÇý šGţĹ˙ÄŃĚ=&ŠóořCü1˙Bć‘˙€1ń4ÂáŹú4Źü‹˙‰Ł,zMćßđ‡řcţ…Í#˙b˙âh˙„?Ăô.iř˙G0Xôš+ÍżáđÇý šGţĹ˙ÄŃ˙†?č\Ň?đ/ţ&Ž`±č7÷Öúfťsy'—kkÍ3í'j(%Ž'•_LÖ¬µ4Z´ë$X/ Í´–ň(9Ăl‘U¶ś0 ڬČ8áżáđÇý šGţĹ˙ÄŃ˙†?č\Ň?đ/ţ&Ž`±č¦e[„€‰7ş3‚#b¸RËcüĂśžqśW“T´ŠâîÜĽŤ=ĄşÜÍq;°Ť‹… (%‰1¸ÚąK™Ëů±Ů“ĄĐŮĎł&-ŰPţÜîŘp[–ź=wljwź4cÍîá”ć¬y±N—Cg>ĚŔ¶­#űc»ai¶-űc»cI¸Ąył>lGwŻ6g¨!ÉŇčlçŮžM­>ksl8-YăűS›b÷rKsvş‚;ąeü]A“ĄĐŮϲ”ZsĽĺͰŕ´g9Ë›bŰs1ŕ[ęîçgŔ·Őäiô6sě¬ó~Ͱâg¦Ź÷ëŰó x$uDw2ßGTC‘§ÔŘϲg&|2öĂ‚jcĂ/l"Ň›nΗK»—;REAJ%J®?ĂO®#Y¶Ë6ŚĘO2 ›ă8”wYá?űÂŤ>¦Ć}“^µZ•rfqő†Ň@ Q5Ô”â~¨©źĘg‘}RsrÁ!K)Î4ă—€Cd&‰P)$©XťZ0‹yąé9WŰ–q•©Ő¦©"]Ĺ$€şź¬¬¶mw$&Ąee,¶¦u!KRÖ”ZŕjNB Ç óÇ)¸đë†3ŚTů8ćQ8Ňdî–]­aŐ®ć‘~T®8q}z‰ö$Ă“Rj}ŐUn(ž’Ú WZ–ąłç¬ůfěÖßLČNqŢހި¸té¤[Y¦đ™U«€Đ}"LÄ­Qo¶Ë“ m*Ut”WŹ\TŞß˛’”6ňd®ćmhĹTqhѧąsçţxĚDDśŠĐ %Ą”śş„‘¬}ľ¸äŮRӬͅ©’µ% $ ŠÔ)†"„C޸´ÝZ †˘‚a•–$RśŰ”2ÝJ”z9śńt˙0 ľ5+Ş`Ľ5+ŞaÉŹĎú991âŮ˙G0 Łp¬, Ţ ĂQ$AJ:AA†›[D$§N¶L:ĂČ™—iöëqĦ˘†„TB‚ŻúŞęMÖÂ|¬ŮŻŮA›ĂRş¦ ĂRş¦o Ję/ JęT Ľ5+Ş`Ľ5+ŞaP@&đÔ®©‚đÔ®©…G´¶…-j JEI&€^•Ő0^•Ő1Ф•…@©Ž••¤(čă^•Ő0^•Ő0gUt-5©®­0¨Ţ•Ő0^•Ő0¨ xjWTÁxjWT €Má©]Sá©]S ‚7†ĄuL†ĄuL*Ţ•Ő0^•Ő0¨ °‡ŮPÔPOôŽŢ­ŐuL*„Ô “ҸMJ ˙ŔÂŕ€A¸q(>R‘L>â _{WÁ%ßg>}ÄF±I-Ďś;ůă1Dś•‘CPzję»âďŃN˝sçţxĚP‰L Hm)ś— KF·‰Q.R‚¤§×-]1•IReäŰ—feiHt¬şęęˇT‘Z멉ÎJ¶¦ÜÍe$ÓN¸ TâjjŇ®ŹNŞb]÷ŮeIJěĆq7ݦ­•Ý8x«U%h„-"ıřM›«Km•!Z€č˘ĽtˇÔ$ŻĄ­YvCfmNP’łSBI¤ÔĐaőCÝÜđÂ3É•ź  ÉűšbR„jS"Đ!ĆnŚ Át\XÄU®yŻް<ׄGXD¶lôĄ,ç,‹=_»÷›j·Ş‹µ ĄiFäÖ‚ ,ŮÜé˝fH†®Š|K«…kÄp˝Ş¤'@¨…^yŻް…‚¨8¸”˛¬Ó$Á™łäĆm9Ú2Š^¦ËŚ•”ßM M*ňĹDŰ–›–Ź&Zyl2PÉS!(¸Ą(őĆŁO&c3>‡/On…­­2^|˘óŞIQ&Q¦‘•dĚš‚čôĘT¤%`QŤ5ă]u:MaodäíÖŕ¤% ˇHĽU‡XŹ$[ÁQď^T©J33U'*4qŇşGŮŞ,¬ű=›6\°Ę–PU{†kLţ‘*(‚  ‚‚  ‚‚  ‚‚ ľöŻ!‚KľÎ}0ű}í^C—}śúa÷Ĺ™)Đ ű„jxĎI„đő'­î…8™pšŕpÄë1HĹ…2Ër¨îŁźşŞęJBĹĄ/aúĆżćč•]± '¬{ ĽçGXöC2Ě-ądˇ÷ëJŠű)Xvâ9'®®ŘŁ·śčëČ/9ŃÖ=‘Ëäžş»`¸ŽIë«¶ íçz:Dz ÎtuŹdrâ9'®®Ř.#’zęí€íç::Dz ÎtuŹdrâ9'®®Ř.#’zęí€íçz:Dz ŻRzDz9q“×WlÉ=uvĹ’ťľč8|”í÷Aq“×WlÉ=uvŔv«Ôž±ě‚óťcٸŽIë«¶ äžş»`%;}Đpů)Űî‚â9'®®Ř.#’zęí€8|”í÷AĂä§oş äžş»`¸ŽIë«¶áňS·Ý’ťľč.#’zęí‚â9'®®Ř‡ÉNßt>Jvű ¸ŽIë«¶ äžş»`%;}Đpů)Űî‚â9'®®Ř.#’zęí€8|”í÷AĂä§oş äžş»`¸ŽIë«¶áňS·Ý’ťľč.#’zęí‚â9'®®Ř‡ÉNßt>Jvű ¸ŽIë«¶ äžş»`%;}Đpů)Űî‚â9'®®Ř.#’zęí€8|”í÷AĂä§oş äžş»`¸ŽIë«¶!j‘\4ű ’ďłźL>â#ŠBB ‚-]±Ů.ű9ôĂî",{I-Ďś;ĺţ¦*ś¶’Ă®ĄŮWÂH H¨UM5ŤŰ„Ząó‡3Y§gÝśgš§7ś Q»…+ލ€ŚŁ•Rî&ëtđ@Ă’0ÇN¬b\Ë®ËYBlN4ŕ[ͶąŠsaK Q)ľI45ĄD-ÁšQJ­ąkáĐÍŢç®·Şţó@¨'P"şD(µiʉ~ %f+śP ŞAMę‘ZńŹ/ÔbÂFŃn|şmÔféŠŔ˘«]QĆϰ[¨·ĺD©wSg®ňé¦9ŽŻ¨ę4”űbUâËŮC"‡Q(ÜJŻNÎ(RYč!¶ĺÖóŤ!»vMyÔ…6S$˘ ş sš+‡I#\BLäşÔ„Ł(dÖUwȨšžAĺ…JÚĆ‚^B_,ŞÜ•J™µ"Ş$đ´śćëN¸yHRC—m©wŰ+yhEž˛R”| Fs\(q®©-"Ť@o[ňi˝®Exk©ÎqTWUF±TĚß”uĆ޵š mA Ąśł‰ŃýçĎ%U%ĄÁ ś@IrŮaWčUg®śÇ9ţaëÔh™”;+2eݵZÎ^¸łÔjx…sśśޤ´#˛VdÜűjq‹Z\Ą*şk"ˇÄ„ÔDIŢí§ăI_BWâB¤´X"V÷m?Júż îÚ~4•ô%~$*KE‚%ovÓń¤Żˇ+ń Ţí§ăI_BWâB¤´X‹=6©6ŰRYSĄk»u:t«Ł k#LZovÓń¤Żˇ+ń"Ě”ëV„ťž™¶3Ż^xËšP$ś q¤µl˝».űÍ3} qE Ś)ŻÎ4­ 0öSĘ´Ú”%ćvá čU4Pâ@::: ]îÚ~5•ô%~$Ý´ük+čJüHRZ.Ąöu „­!@(PĐŠă ‰[Ý´üi+čJüHÍZś…Ş©7-[) fDł9égBžYm ˘@Q˘ôWŠ+k•÷µy ]ösé‡ÜD)äÜ š‘Q]p™.ű9ôĂî",$–çÎüńfÎľek+“®L¶vŹ+sŐJÎÄ^X?(qń9ó‡žŘĐbrzÚvQÖŐcĎ4•$‚´;/TŽŠ¬ý‘™Xe ›Ý­Ú5ÜN“ž[$–ę›×nqčÓYÜŻ±Ý’y¶m -h)É”„šë"żdclë6AąYöd]˛ŮiRĎ y˘í Č%J%"‰§F$†¸"h,¬d‘ľtŞ’Ő8×MýxÄÎé[~"›ó¬~$ó°Ľe)çÓŰüě/JyôöĹt­żMůÖ?+­y›Vj] ~Í´eZ´ěµIˇŔŐF,wĺaxĘSϧ¶)ržŰ±mŰ%V~ęłiĂń‰zs7‡AH&µňD¬÷RĂě-™YççňčÚÖŐňć`Ô’M.té‹—LëĘZťÉU¸§++ÜÄŞš+ĂĆ”Cc.JΓj›łÚ”fqK—ď6‘Í„*t$j7ĺaxĘSϧ¶+-6;˛é ”0’Ő\Yp]ĄŐüŞV¤BÓ*ňoS$+Uâ%Ž#A<4GmKfδŮiö'Ą‹RÓ şă™ĐR—¨HĐM("~üě/JyôöŔAĚľPQ˝péMŮZç…Żw:Ą)Ü—uŐ(•âĄÔj@Kš€Ů÷çaxĘSϧ¶ ůŘ^2”óéíŠ#ˇËA»—2]ÄÜHBhe…ÔPy‰‰Žű’E_'NćýZ]ý~*źż; ĆRž}=°oÎÂń”§źOlÔÉKaY$ĄćÍRWą”AĄ+RşÖ€c BfÚR”ŢI”)i¸˘‘, NŁĂŃ÷çaxĘSϧ¶ ůŘ^2”óé퀊­Ř˛J˛QD‘t“ą±ľ_@Š‹nŰ–˛ivĹ™)f4ýőg¦ŘiŔâę’E˘jjI'ThwçaxĘSϧ¶0¤ůg˛ő‹6G&ËÓęq牆ĹÔQ"¸‘ĆDoOË(‰š†r™¸KßîM’×tělÚjRŤÂh+JĐW lyy“.-K]Ąb©J%DŞ@’IŇtńÇ–§ôI–«­Ű!††“lŕzńß‚<¶ĽSÜtÔ ‘şŮöăŮĆŃů>św3ęővI6˛JX¶ě¶’Mâ(¤‚uŕ¨wáFÉýáłý~Ôy'Á\x™>”Ď·Á\x™>”Ď·6ŹÉôngŐëGôŁePÓ(,ňÓ/Ú„łúSłVĂjrŢłĐáH*NçYşiůQä˙qâdúS>Üsŕ‹-üNźKgۇGäú73ęőĎ…'÷†ĎôeűP|(Ů?Ľ6Ł/ÚŹ#ř!Ë'Ň™öă‡ôG–Ŕl„€8ĚŰ>Ü8Ú?'ŃąźW®ü(Ů_Ľ6Ł/ÚŽţl7mg”29Ökv’ë¦ ŽVŁ]đE–ţ'OĄ3íÇú$Ëe¤)B“ ‰¶HűđăhüźFć}^»đŁdţđŮţŚżj…'÷†ĎôeűQäźqâdúS>ÜqâdúS>Ü8Ú?'ŃąźW­ü(Ů?Ľ6Ł/Ú‡ĄňžVe´NJÚRŽ&vdĄ*LŞÔč@O+ÁW¶<{ŕ.ÄŢujÍ·8°.šPüZî˙X㯣§†7ŽW-ážYML/ěËAv­‡)h¸„ˇsRéyIN€TšĐm‰’]ösé‡ÜDTdżö2Č˙B×Üo%ßg>}ÄG—Y-Ďś;ůă1i“ŠK*鸼óꢰ4.¬ő‚ Uąó‡;c»ˇźť±Q˝[7•;éŻ{PoVÍĺNúkŢÔT[î†|"vĹVĚşlbÜŚÓ¬M)TmÖe”ýÓCĄ) ‘#z¶o*wÓ^ö˘§(¬f,»)sR2óÓo¤ŕŔźu%}•R°‘ÂDÇtdť>ĺ'Öµ:ó%˘ˇąJo( °ŤćčgÂ'lyí”Úç&%e&wCHr}H[beeIšýŰő©átĆŻz¶o.wÓ^öˇ &˛€‡Śžk‡vn]Fî4Ô’~  ‹ÍĐĎ„NŘË[T˝žĂ K®d%ů©vÖU0µ*ęťJHšŠ‚tE–őlŢT尿íAűˇźť°n†|"vĹFőlŢT尿íA˝[7•;éŻ{Pűˇźť°n†|"vĹFőlŢT尿íA˝[7•;éŻ{Pűˇźť°n†|"vĹFőlŢT尿íA˝[7—;éŻ{Pűˇźť±OkîY©”2üŔm•Ęş—) ­ˇLAčúă»ŐłySľš÷µß±ěŰ:ŃmeS7.şŢ™qfˇĆŠiU`oSDP5`HîT´Ý®ý JâŞÄ¨« +ĂŇ8ŹL6rzG:©„ŰoÎi+ĎŚ( kŇq§‘T„ćňL´ĺ^ €ÚC€<ľ #iNÇF'0†%rEɤ0„$8µfV ŤżĹN‚i¦Af;-/eË5»™~ăiĐ °Ó¤éňÄćÜC¨ miZMEäš§VIX‹Îß‘Jł¨JUT¤¤§ŠęvEś¤›M–ĺŃq&Tť z :#&‹ËRe”Ý®¤%·p!iJT®h'i®4}ÄDŹd–çÎüńq™‡eŰ ˛˛Ú&ęp&§ÖI†ś4}ÓůŇb1›e.)µL!+M*­;FŃ®2«Ý5á×¶ Ý5á×¶+Dě±e··SA·EP˘@ Ŕź°ő7t®őŚâ˘ź”4Š×îťň'<ű“,­—ŐťibŠBŔRT5bv|‹!a™F󉸻Ś%7“¨Đb:!N>ŰY»ď%9Ţż¬NŠB›eŮ…0ŰáNŁĺ$ X Ý5á×¶ Ý5á×¶+Ń6Ă•ą4١RH¨Ŕ¤Ń[ -%ÚćŢBé¦éwtׇ^ŘŹ6”ZJ'Zje 5J^m+ëš+•ꂊĺz Q2ě1)ssK˛ŔBŠŇm)DP‘A¦WTLÝÓ^{b-ĘőAEr˝P:óŹÝÎŞýŐ&đ­5ę8Ă›şkĂŻlE˘ą^¨(®WŞVîšđëŰîšđëŰh®WŞ +•ꇒ’·tׇ^Ř7tׇ^Ř‹Er˝PQ\ŻT<”•»¦Ľ:öÁ»¦Ľ:öÄZ+•ꂊĺzˇä¤­Ý5á×¶ÝĹ3ĹÉ io‡ˇÚĂnŠĺz –ué{O:ĘsަMŇ”Ü*©ľ×Ć,{$…Űą4†JSc %WR´nTV”4Ŕit b±%ő€&Ń›˛×ş3”A©őtĹSůÓ÷vŃJÔé°3yWI*R«‚G==•eśŁ¶K(.Řa»ë˘H©® i¬˙@vĘB2ĘĎP5blŞëÁ±Ó©5úÄZٶŁ6Ł*u”:”¤ÓăBF8úŚ?(ňć%yĆ”ĘÖ€Ą6­)'ĂĐd»ł`‡Y[–S!÷ܨRZB± T•aŤ H#+¬&‚3ÂÝ´ŇXJ¬‡ś.(_ZP¤„ +ÔUBş ĐpćÖɤ±.{š‹“şťČ7†±M$â*08ÂŐ–VsL|T»éJnĄĺI¦(8˘AĘ ĐÔş……9yÚŢ|Ś@ÇŁN4h†”VľmEŔ$¤&µ'’j(5ž>#ôžWČOM!†ÚIqw˘Ś ¦5Ô+‡Ő«le¤‚ěL!ŕÚ¶Ň›×o Śx˙}ÄE6KĽű$ű'ů\ÉwŮϦq#Ů%;ßÝüńŻ™˛$§C›¦YkÎÎh `‰î˘ôæúP‰'ĘzD7FůÓ=ůÄT6ě‰&ĺŇÂeÔJ‚ŇČ)!7F ×ۦ6VÚ·ŞßČřŐpq®-qań|éť/ţp|_:gŻ˙8ť“aöÚCŤ,†(˘Č ŤS jĎ–fct!—3µQĽ§ ´éŇaöf[Î2ú‹ĘMáZTÖÖ!ÍÎŻ źĎţPÎŘ–{ĺÂäŞÉqEjŁŞ&¸ŕ®“´ë‰2˛ŚI… v ¨ ¨Ŕ4ť@DŤÎŻ ťżň„<‘.ĂŹşúRŰi+R±ŔSúĐ ĽyŐăČ>¨eçÁ@[‹ŞÍŇÔ}DÂ7C|§ýŢŘ 7Ź ú ĽyŐ·C|§ýŢŘ7K|§ýŢŘ 7Ź ú ĽyŐ 0¤L0‡šzókI¸ˇQőŞÍ ü§Ú€íăČ>¨/AőG3GÂ)ö Í ü§Ú€íăČ>¨/AőG3GÂ)ö Í ü§Ú€íăČ>¨/AőG3GÂ)ö Í ü§Ú€íăČ>¨ă­vŞ&B2ËşĄ€@ƫꬣá?”űP©6r×JzęĚ«´8§őÚ¨­ITb+XG´•ÝŚ«QlŽę6”9›M@)"őTM)ĹB‘ĺ-(5Fmű/( ¶Mŕ GA[¤¨R‚§Ź]ĹHĺ ŐZčĽR@R›F¤Ö—8…+ÓĺÚ40EuŹ-;)+›ž›.•_Ą)RM?;"ƇDfćV!Â…5*´U':H¨€šŽ:§ĹĹZŤ9ŃŃf[¨Ě%»M BTŕQ+*Ą8Č­ Ó TŤD“3ëO-m°ÖaJ áPŕĐ$ #‡¦•Ŕt„Iż”κ§%dŮo8©lŢUÜkC{ÉďĐTdň„·.i°šçNlc˙.8j ăÖŽĺ—”kiAvŰiĽRHÍŠké Ő§@€ÓĐj‚Tgd¬ű}©´93k!ĆĘęăaŇ”4tbk†‚ÚlěˇCaą{e¬Ň[BRĄ (’’Rtž<|šO!  Ř 7”&šapg­×DĹ´wA1ˇŠkJBNfp­ůF]Đ/-°Łë‰+ vKWzUAp3Žľ\ÉwŮϦqA ‹5‹¤Ą±DšRš4˙H—%ßg>}ÄDŹd‘<đeJ)qUM[AR‰®ˇ“V¸rQćÚ“´ŠmAs­8‘† Tyb]ˇ?/+:[}Ö›˝R’´ŁNJS^ŢKiKRÇ’—K ?u´’@¸¬*IAîý™ÎŰWder“(Úě I©”Ą&óŮ»5׉§É ˘MőV “˙ëú1öD‰.ű9ôĂî"*rq©„dÍ—ź‰V݇7Â®Ś Mk_®±u úŇą´¤Š°ŞAýDÄŹd©¶,÷ÝZž’S·Ş8`+ŁÔ6DuMŘË­l´Ô¤¤4Ą4ýf" i·ĺ(™URh…o†[›9¶!@ß ·6slá–ćÎm‚P7Ă-ÍśŰřeął›`‚ đËsg6ÁľnlćŘ …|2ÜŮͰo†[›9¶!@ß ·6slá–ćÎm‚P7Ă-ÍśŰřeął›`‚ đËsg6ÁľnlćŘ …|2ÜŮͰo†[›9¶!@ß ·6slá–ćÎm‚P7Ĺ-ÍśŰřĄął›`‚ ńKsg6Áľ)nlćŘ …|RÜŮͰoŠ[›9¶!@ß·6slâ–ćÎm‚P7Ĺ-ÍśŰřĄął›`‚ ńKsg6Áľ)nlćŘ …|2ÜŮͰo†[›9¶!AµŰňę=ĺŔ8†źĎ–,ěUîĆf_@ş•=€:pBDE˙Ůfox1.6-1.6.57/doc/screenshots/vorhour2.jpg000066400000000000000000001777341326741342000202550ustar00rootroot00000000000000˙Ř˙ŕJFIF``˙ŰC    $.' ",#(7),01444'9=82<.342˙ŰC  2!!22222222222222222222222222222222222222222222222222˙Ŕ»ď"˙Ä ˙ĵ}!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä ˙ĵw!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú ?ěĽgă9|'q¦Á™ă]ˇ HöíT'’§9ÝúW7˙ cR˙ˇ^ü ‹˙Ť×O«"żĹO+¨e1ÝäŃ–˝ěvßóíýđ+¦ˇGžoÎÝY„Őg'É$—Ą˙SÄnľ/ęQ¬—>HщU&t䎣ý]U˙…ă'ý Ńßő˙ău·ńîbĐôsH„Ý>J¨ů*µöŹá™mtíQl´×‹Ĺ·ÚtPŮB¨†ÁŹ<#/'$lmˇ0[žx®ĂâĄÉż›%JŞm7±ť˙ ľOú˘˙żë˙ĆéáwI˙Bü_÷ůřÝZŇětý_Yń5˝ć—¦´żYCh±YEČÚđĆĘŰoRśŮúŇëF–ş–ŽÇM¸2xµ­’KEHˇ·WU6Ó€Ş ç6T1 Aäöt/n_Ĺö¸ůŞZ÷*˙Âí“ţ…řżďň˙ńş_ř]’Đżýţ_ţ7YóxcĂş†µăéLÚ}†Źr"0‰‚Ł;ÎëR(€.cČů±T/<9á› ű]‚î˙UÓ†¨¶6‚'Í´Ĺćbń¶H'oÝ_şO| TpďěţćO=NçA˙ ®OúE˙—˙ŤŇ˙Âę“ţ€ßĺ˙ătşö‡aŻiúrHnb˝°đl7ń̲)Ť–?ŕ)·99?6î8ŕăž~ÂĂG“áC^jíćţÜň…Ő˝˘M)_ śş|ąÉë×·zJŤŻËř±ąÔîtđş$˙  _÷ůřÝ/ü.y?čýţ_ţ7VĽKŕ­ ĽQsq,3Cos­ZiPŰX”!ß;I÷[î€;óĎ¶ß ôĎíŻéÓŢ]żŰî5.$B«˙ěĘĄnvň 5*ž«ňţ}®Őok–ásI˙@żďę˙ńşQń–OúĹ˙W˙Ť×)â} HĐô˝ŰÍ|ú…ý…˝ă,<ĄWWß‚0s¸.8äśńÓę¶:L§Â:( lÚť…™môČ79wźíçVŔ=ő5N… Źć.zťÉárI˙@(żďę˙ńş_ř\rĐ /űúżün­xoÁzřšÚâ(f– }fëJšÚř¤ë6Č–O¸ rżtŰž9ä“Eđüž ąń ťNöćł·€Iąo#rîm«ĆţI§ĎÍIRĂ·n_ĎüĆçSąŇÂâ“ţ€qßŐ˙ătżđ¸d˙ _÷őřÝbřš&“áĆÖíŻĺ– ˙'ű&/9N™›Îňź—ĺ'€kŠ+Ha¨I]/Ě—V˘Ýžˇ˙ ~OúĹ˙W˙ŤŇ˙ÂŢ“ţ€‘ßŐ˙ăuć"ś*ľ§G·âĹí§Üôßř[˛Đ/űřżün—ţäźô‹ţţ/˙Ż3˘—Ő(öüX{i÷=,|[“ţ€±ßĹ˙ătŁâĚźô‹ţţ/˙Ż5áGŐ(öüX{i÷='ţÄźô‹ţţ/˙Ą˙…Ż'ý˘˙ż‹˙ĆëÍĹ8QőJ=żÚ}ĎG˙…­'ý˘˙ż‹˙ĆéájÉ˙@hżďµ˙ăuç­8QőJ=żÚ}ĎF$˙ <_÷Ú˙ńşQńNOúĹ˙}Ż˙^t)ÂŹŞQíř°öÓîz'ü-?čýöżüE/ü- ?čýöżüEyŕ§ _TŁŰńaí§Üô/řYňĐ"/űířŠ_řYŇĐ"/űířŠóáN}RŹoĹ‹ŰOąčđłd˙ L_÷Ú˙ńżđł$˙ L_÷Ň˙ńŔ pŁę”{~,=´űť÷ü,©?čýôżüE(ř“'ý˘˙ľ—˙®S…TŁŰńaí§Üď?ádI˙@¨żďĄ˙â)ácÉ˙@¨żďĄ˙â+„˘ŹŞQíř°öÓîwCâ4‡ţaqßK˙ÄRʞĐ./űéřŠá…8Rú­ß{i÷;ńOúEůŻ˙J>!É˙@Čż5˙â+áGŐivüĂŰOąŰ2Đ2/ÍřŠ_řXĐ6/ÍřŠâ…8QőZ]ż0öÓîvźđźÉ˙@Řż5˙â)á>“ţ±~k˙ÄW)ÂŹŞŇíů‡¶źs˛˙„öOúEůŻ˙K˙ äźô‹ó_ţ"¸ŃNľ«K·ćÚ}ÎÇţą?čţ;˙ÄR˙Âs'ýâ˙ÇřŠăĹ8QőZ]ż0öÓîu˙đśI˙@řżńßţ"”xŢOúĹ˙Ž˙ńČŠpŁę´»~aí§ÜëGŤ¤˙źżńßţ"”xÖOůđ‹˙˙âk“áKę´»~aí§Üę˙á4“ţ|"˙Çřš_řLä˙źż%˙âk•áGŐivüĂŰOąÔ˙Âc'üřĹů/˙K˙ „źóăäżüMrâś(ú­.ß{i÷:řKä˙ź(ż%˙âiá.“ţ|˘ü—˙‰®dRŠ>«K·ćÚ}ΗţŮ?çĘ/Éřš_řK$˙ź8ż%˙âk›áÖŹ«Ríů‡¶źsŁ˙„®Oůó‹ţů_ţ&—ţ™?çÎ/űĺřšçGZpŁęÔ»~aí§Üčá(“ţ}"˙ľW˙‰Ą˙„žOůô‹ţů_ţ&ąńNľ­K·ćŢ}Í˙řI¤˙źXżď•˙âiá%“ţ}b˙ľW˙‰¬J(úµ.ß{zťÍďřI$˙źXżď•˙âiá#“ţ}˘˙ľW˙‰¬!N}Z—oĚ^ާssţ?çÚ/űářš_řH$˙źhżď…˙âkS…/«RíůŹŰĎą´5ů?çŢ/űářš_íé?çŢ/űářšĆáGŐ©vüĂŰĎą±ý»'üűĹ˙|/˙Kýą'üđ‹ţř_ţ&˛(ŁęÔ»~aíçÜ×ţŰ“ţxE˙|/˙Kýł'üđ‹ţýŻ˙Y"ś(ú˝.ß˝˝NćŻöÄźóĆ/űöżüMW“ţxĹ˙~×ü+0S…WĄŰóoSą¤5i?çŚ_÷í”j˛Ď(żďÚ˙…g pŁęô»~aíęw4F§'üň‹ţýŻřRŤJOůĺýű_đ¬ńNľŻO°{zťÍ練EDŠ"Ě@ËNIü*ĆëŻůçkůĹTl?ăţŰţşŻóŞ—úöŹĄÎ°jµŤ¤Ě»Äw)ÉÁ#ŚůW5x›I/ĎüΊ2”Ó»üŤ;‹É-V6ZŻ™*B€yDł»Pő$>•6ëŻůçkůĹ\î­4WAž XdŐ,Ý$F ¬¦@AuW<Ţđď‰|IâÍ_NűMÂ^Çżź"aE´ +ŐŹçXsÇů?ó5ĺ}˙/ň;»Ë÷°…eąű*#H±®<¶%…2y?ץN쪟*Řd3ĺČŕ×™Űé6:şn›‘ií|¸÷łc0۱ĺ‰=Iď]Gާ‚Ű@ɨŢXÜ(‡ěŹg––IöŤ‘¬yÄ»Źg8ĆE^<·ĺü˙ĚV|ÖżĺţGHŇ\˘ułUQ’KDÄx˙Rű„đ˛ů3I)D ąO#<čpj†}¨Ţ6µ˙ ó[ëëhs¦˛Ţ(1Ä‘Ě$ÉÎç$~^XĽG˙$·O˙rß˙@hâÝż0Ő5©Żăű/ľµˇę~5ĺ”r~đ´&řŃz9ÁČÝX_Úßżľż÷ÍĄz>Ż#Ăi<±ś:[SŽ„F1\TÚ·Ť†Ż%¤ÔžĐNcKÖąŚ#&ě X±Žp?Z¸bbŁĘť» •4ÝîÎSÄ:_ÄßA͸¸Ž/ l$cřH¬y|ăyí`µ–Ęi-í÷y1=äe"ÜrŰFü žN:×}s­ř˛Ů´ö˝ŇçÓâžňÚ'’Iś<‘B )ÉëO1·b¬{ĘŃcjEYE_2}„_VxĄĎ‡>%Ţy?j›RźÉ”M›©«yrŚą“†ŕŽjąđWŽŮ.Ń­îJŢ0{Ą7ɉŘŔżĎó’rsÍzä~%Ó¦žh˘[é M*3¦źpÉş2ÁŔp›IHŕś‘“Wl/âÔmŢxUŐVy`!Ŕtr4mÓ¶TăŰ}z˘čżŻ{÷g˙Â;ń'íßnóµ/µů~Oźý¦ľfĚçnď3;sÎ:f–/|H‚ę{¨¦Ôُ¸ŰçJş’‡“hÂî>fN=+ŮčŁëÓţU÷Áaěń?řDĽ}ýËĎřöű'ü§úŹůĺ÷ţçű==Ş!ŕ}‹ě_c›ěžgťä}®?/~1»nünÇëŠöu˝>@XĽÎ&ܨĚ!s;cj4€lV9\) ťËó čQőúť—őó«Ç»Ď±[ «Ź‘ŽČŽü7źőoŔÉăÜP±Ő‰/ëćW‹ęyü ^&˙ oţGŹ˙ЧÂâ_ú˙äx˙řŞöa*™Ţrޱ%\@Ăcü§ Ž3Ôeô˙´*ö_×Ě_W‰â˙đ‚x—ţżů?ţ*ť˙/‰?č˙‘ă˙â«Ů¨Ąőúť—őó«Äńˇŕ_Đ;˙#Ç˙ĹRŹxŹţßů?ţ*˝zęî (V[‡ŘŤ$q‚~gpŠ8őfń¨V±ŹĎß><‹ídůĺ–M›§9óS‘ŔĎ=ŻŐ쿯}^'•řŹţßů?ţ*”x#Ä_ô˙ČŃ˙ńUëĐĘłÁČ,ŠBŚĺHb2* /âŹT·ÓĘżť<άÚ6E9÷Ě‹ŹˇŁëő;/ëćW‰ĺ#Á>"˙ ţFŹ˙ЧÂâú˙äh˙řŞőę(úýNËúů‡ŐâyđWč˙‘Ł˙â©ĂÁ~ ˙ ţFŹ˙ŠŻ[˘ŹŻÔ쿯}^'’Źxţ|?ň4üU8x7_˙źüŤ˙^±E_©Ů_0úĽO(×˙çĂ˙#G˙ĹS‡µďůđ˙ČÉ˙ĹWŞŃG×ęv_×Ě>ŻĘÇőďůń˙ČÉ˙ĹS‡„5ßůń˙ČÉ˙ĹW©QG×ęv_×Ě>ݎ„uĎůń˙Č©˙ĹRŹ kźóă˙‘S˙ŠŻP˘ŹŻT쿯}Z˙Â%®Ď—ţEOńĄ˙„O[˙ź/üŠźă^›E/ŻT쿯}Z™Ź kóĺ˙‘SüiĂÂş×üůäT˙ôŞ(úőNËúů‡Ő y°đ¶µ˙>ů?Ćś<-¬˙ĎźţEOńŻG˘ŹŻTěęŃ<äx_Y˙ź?üŠźăNÖ?çĎ˙"§řעQGתvAőhx<3¬ϧţDOńĄŐ˙çÓ˙"'řסQGתvAőh˙ÖŻ˙>źů?Ć”xoV˙źOüźă]ý}z§dVÁjßóé˙‘üiG‡u_ůő˙Č‹ţ5ŢQG×jvAőh(đö«˙>żůĆ”x{T˙ź_üżă]Í}v§dVĂŹęźóë˙‘üiĂ@Ô˙çŰ˙"/ř×mE/®ÔěęĐ8ŻěOţ}żň"˙Ť;ű R˙źoü}Ć»:(úíNČ>­ŤţĂÔżçŰ˙_ń§aę?óď˙ŹŻř×aE]©ŮŐ rŘš‡üű˙ăëţ4ďě]Cţ}˙ńő˙ëhŁëµ; ú´LhÚ‡üű˙ăëţ4ŁFż˙žřú˙ŤutQőÚť}Z*4{˙ůá˙ŹŻřÓ†‘}˙­i×óË˙ăN}×üň˙LJřÖĺľąS˛«@Ä_óË˙ăKö źůç˙Ź Ú˘Ź®O˛«@Çű Ďüó˙Ç…/Ř®?çźţ<+^Š>ą>Č>­+ěwóĎőżdźűꍭJ(úäű ú´ ߲OýĎÔR‹YżąúŠŃ˘Ź®O˛«@ĎÓsőáo/÷QKý­cöOµy˙¸űOŮwloőľo“·ĎúĎ—=;ôćźťn“Ě®ĘÓĹ;¤‘c^˝˛Ă>ŮŁësěęĐî0A'÷QNÉýßÖ­ŃGÖçŮŐ VU¸‰!زŻĚ…Ćĺ :d2=˛+™żđ•ć©:ϨM¤ÝĚ«°Iq¤G#É8ÉcĆIüëąťâŠâHÖÚ,+-Řýj­ĺâŰŮO2ZÂZ8ŮŔ%ń3ýę‰Ös~ň_‰Q¤Łłg04-d-”Ú–‚9b––Ŕ*)ڂ٠ăŽ1ÚŞ]ř2{ű§şĽmćáńľY´hťŰ$¶O»¶-Ľ’4jä2¨ÜOĐŹJćµĎŰčš Ódžő]Fo!gfÓíšeEfeľq”jŽuü«ń˙2ą_wř‘źoá+»xŕ‚;›m#ąK“®ś†u çĺn¤3Z·vŢ žĺ¤‹V·†.#A¶¨Kňp9?ËĄK˘ř‚/Ű ¨,ĄłŹiýÔčRUa$Á†ăŚú~~Ňx“ĹzW…ő;}FŘĹow;Ŕ·d7“‚FÝňç·‰8š~ÓKrŻÇüĂ“[Ýţtşg¦‰â“[€Ł©Va×řëĆ–gOř™mţCCěcvŃŚă·JčĆšmÖ±Şi6˘âçN¶ig™UڏŕF[wßööaś‚_ÄŹů›ţ»§őĄĎĄ’°rë{ťFż"EĄŢI#Ş"Y–fc€Ź’M-żĹĄ´HŢ%± ¨Ź\}*ÝĎúŐ˙®i˙ Š†ˇ;cšń§ŤĽ3â+-&ËIÖěî®WX˛“ĘGĂ(8ŻQŔ÷=®–Š(nŕ‘çA¤6Ť®X b®ÝI¨Ă ŹöĎ ňÉ(Ť|ź3`bx# žphĽđ–§qtď4ŚKköi-‡Ůť®§“Í/*łEądî9UčôR¸X(˘Šr·:fˇý“©xu,ÝáÔën q$îîŰ”¶ýË˝€Ř\˛î;2/Ť”ÚžŁĄZx‹N…×í§EöÄY#ľťYá·†F2·C“q€–+Đh˘â<űOđ{ěŃ´ëČ´ńz˛OorÖŃŚ'RŢ]°UŚ‘©É%Ç 6Ż7uŻ ß][ë6°/™iök©ě!ĘŚÝ\FęĂ$ç‚el·Ę~ÓŽ<±]Ą\>“Á·—şž¦ł›Čĺ»űZ=÷ú?”ŃJ˛,kľ|›CÇň9 pp¨Ą†‰Ş¶łaxv dmFć<)ňgňŢ!Aůżw*.áÇú6q™ m\ŞęOo—w%ÜI5˛Ŕí,nT+ Sw¸#?xęqV¨ gć/FöşeäÓؤ‘Í&u+{Ű©YŘ $–2›žÜáŰĆÄŘ-wţű†µą…´ď6k˝&K+K›–‰ŢÄ“ppĺBěRł"í‰X Ą~ę‚}Š.#…o -ö»a#xvm|ťös$jŢç(¬Ë÷¦ńźżž ăÄv §éWÖş¦ť ŰÝ[\Űhöí$ öě&ś§”ŽŔň’[€" ß"®U˘‹…ŽcEŇ®-|S¨]›°K滼Ž#s#3‚«‘±& ¸@ /OE Ěńv˛řzú;»Řl"xö­ÜĚĎÜF_i0A®NÔ4łŞYÝŢř—KÜ1ľĽ·}BXç !HĎĎó&ŚÇcŹŐvú]óíÂWvZLS˦C±Îť˛pcóVâµI€pr 0#<Śő Ě1řbü5 ] ʸ‚ËĘÔn·B?´ŘMnň †ÜţbĹ0ýč\ďĂcqŻG˘‹…Ž|-wq01Ú}Ną’[v±ýŘű5¤‰a¨ŢÖî¸BHűFü‚®Ăz}ő•˝äš”ľeÝÍÎůjŤŰ#HCáNń“ĂżolťŞ(¸Q@Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( 4hvöň őËhµ8őĂ;Űľ·µ˙Iɰ8ĆsŰuI¦xKSµH÷Axn–KCw,˛[,w.—0»ĘľZ‡“$!Ą!Ŕn„»cŃč˘â8_ić;ňŰIţÍ·ţÉTą|Dżm‘„E$ÄlK`,śľó8¶;Ş(  /ęŇ_ěđő怬˛Č.Ą+‚FÝ»űŮϵgŘjÓéşšx†ó@fhH·l®I8mŰ·ź÷qŹzëh˘ŕ9ç†ŢÂGšTŤL¨vg ë^1aá" $A \XëpÉhŇę#Q’6WC,LěČn+Ůh˘ŕbh–ö/=˝µă^(_1ćvBĚď,˛6v˝\đíYż…ć´§@Ó¤ÓŇŢöwKű»™ľĘŠAâ2rÎOB:ŘËÖŃEŔóŹ X\xR-_@I¬nt6†K‹;Ĺ–5›{pb‘G.ŘčŘčîv~$ȤßőÝ?­uŐČüH˙‘IżëşZięisţµëšč"ł˙´ě?çöŰţţŻřÖ…ĎúŐ˙®i˙ Š†ÎâtÓlU&‘TZC€ţ­iź¨ę˘Ćx-˘łą˝ş™^D‚ß`mŠT3eŮWş g?7ŕáéŞŮ}ŞŢÎ{mő ă%”ł'ťŚ~PNq†Éj®˝e.ˇ0 KŐ! ]ŁÔ%*¨Ŕ`Säŕ·¦=óXVľ»·żĎqöä2[O-Ô×·K‘.L vHÄÂs6AnCl€7tŻXj6šY’âÚŢ÷P´Žę;&ťL›Ywp8,8ěi—ž-Ь¦HĺŐ,˙ăçěÓ0¸L[ľÇlHsňgËaĎ9âąý'Á7v eţLČżd’Y>Ýp¨Źq& „“AĸeNĐ…¶Ť¬ZéšMŞĹbí˘4bŘ›—éD/ /űłĺ8l üŚgř¨¦šxmĐ<ҤjNvgń¨´ě?çöŰţţŻřŐÄ‘âmŃ»!é•8©>×s˙?˙ßf€3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@3˙´ě?çöŰţţŻřŃý§a˙?¶ß÷őĆ´>×s˙?˙ßfʵÜ˙ĎÄż÷ŮŁ@)E{kq Ždä…I''í\ÇÄŹů›ţ»§ő®şYĺ–ňÉd•Üoáźůa%r??äRoúîźÖš´ą˙ZżőÍ?ôUmżäe˙^˙赫W?ëWţą§ţ‚*­·üěżëŇý´€’Š( aEPEPEPEPEPE™«k–ú;ÚÇ4“ËtěĹinÓ;Ą ą==;Ó˘°á(ô/ř—˙×üMđ”úüK˙‚kŹţ&‹1\ޢ°á(ô/ř—˙×üMđ”úüK˙‚kŹţ&‹0ą˝E`˙ÂP?č_ń/ţ ®?řš?á(ô/ř—˙×üMaszŠÁ˙„ Đżâ_ü\ń4ÂP?č_ń/ţ ®?řš,Âćő˙ @˙ˇÄżř&¸˙âh˙„ Đżâ_ü\ń4Y…Íę+7IÖ˘Őîn­ŇĎPµ–Ú$šD˝µxk±U 8ä«r>SZTQE (˘¨jú˝ľ‹h—7);«ĘŞA‘ŮŘá@QÉ$ŕ`zĐú+ţ˙B˙‰đMq˙ÄŃ˙ @˙ˇÄżř&¸˙âhłÍę+ţ˙B˙‰đMq˙ÄŃ˙ @˙ˇÄżř&¸˙âhł ›ÔVü%ţ…˙˙ŕšă˙‰Łţ˙B˙‰đMq˙ÄŃf7¨¬řJý ţ%˙Á5Ç˙Gü%ţ…˙˙ŕšă˙‰˘Ě.oQX?đ”úüK˙‚kŹţ&ŹřJý ţ%˙Á5Ç˙E\ޢ˛tí~-KS]Ëţ˝!˙ŃkH +Ď´oę±hÖ:”‡QŐ’{k´­Ĺ˛ŰlžY!EXX¤ję|ÉV"üËśźAŞK¤Ř®™m¦1ikäů1ďo—ĘehůÎN /SÎ9Íf7®˘şu–ÂoosťÓ­É.“Ę#ŔEŘ 3&X•?{ĺŕ‘ŤîáýÁŇnn®bižĺ!LUEı…ŚÇţé±ćy|mË¸Žž]O›PĎ ™·+˛‰śFî¸Úí;† A#jŕüŁ đ¦ž-ŃnĂĎ1ivI$śÉ#HĘč­‡Źsľ÷ŽrI4–ĄŻjݧÍu§ZŰ$ ¤RIpCČâí ueňČE?8Ü `ă<ž+Ať&* Ş9eVÇ F{ŕ}gż‡ô×’áĚSbă%ă2Ă ˝P6Ô}Ăvő·dç$šĐ†%‚áBĺcP »—bÇ,I$ű““@ŚÚµý޵­ß˝«ŢAmwocixČß˝˙(9•›{6ďáČ^F‹xŠę+§Yl!ö÷0YÝ:Ü’é<˘<]€:2e‰S÷ľ^:o¤ŘÉçď>}ĚwR|íóK͍׌yIŔŕăž§,—DÓćÔóÂćmĘě˘g»®6»FĆa…ĂHÚ¸?(Ŕźă+«¨lćąŇá†)ă´™ü»ł!Dş}ŕ×-ĽĂ (Á‰Ŕëk2?iQCIk„Ž;hyŤÂŰąxG_ábOż|ÖťQE Ç»˙‘÷Áßő÷s˙¤˛ÖĹcÝ˙Čűŕďúűą˙ŇYi­ÄÍłăa¸ÖÚęĆD°Óí縶¸Ž@íx¶çmČ@Řc“ ó›9sV#ńDÖ×6:µ„qjQ$/ µŤÁ¸űGšd¨Y#;ó „äU‹®:|.ÓĆ›glÚž¤g[yíď® ÜĎöĄž'YGvD/#,§ó ëÖ¶#đś7÷7^&M7Xžt†0†Ŕ,± ŽŇůšL¶î„$Ů&~›ăř'¸·{řdµ´ąŃěµ%t·–U€ĚeßćĘ«±B/ĚŰGŢ$ŕqÚWođîk-,i6zť¤:|ú<:Mň ľUO7|‘°wóÜüĘüňsÎ{Ę(˘Š(˘Š§ŞČ:_ĂůŠń»ż‹şMŽ®úMΉ®¦ ’Ť¸·ŚącĐ$ůł‘Śg9ÎkŐüQ«éÚ.‰%Χ{¤,ęŠó8PĚNp3ÔŕŘJó‰|Sŕµx5i5M-µ#h˘¸,7Ş·PçôËcďËÜhĐđű´ľ3ń<ŹÂͧX1ŤČ,„´ś2=‰ő>ˇ}¨Ĺâť*ÎŃ!’Ţkk‰.Y6`+Ŕ) İŘ^Ď'T<'ŞXęţ.ńMŢťwŐą˛˛Q$M‘ňdVýÖźmy=Ľň«‰­ŰtrG#FĂJ’¤eI*r§ ŕRc34Ë©Ďh%łH!ż´7¶l“fĎ6ŤŤ‰S€X}îxݬű OÓgi­aum»<Îëd‘«#^ĺ@ĘĽ|ن⏻ˇ˙ŘrĂ˙GĄoVŠ>î‡˙aËý”-Äηţř«˙±ľÇţ‰ţŁíŢoüľy~wŮüĽgýOď7çođýî*žźăe™-nuHěěő #a$s4Îńnt ĘLńD2d’Î7G˙ ţ×í_ÚÚ7ßÚÚżÚ_hűTű?ÖýĎ+ĚŮţŁ÷ÇÝíÚ¤Óü ikk«Ii©éöGOł¶’ĚcÉ-ýöća#Ź",¨2íämĐ’Ľg*qüÁÁW­ë7öz^Ťwysµ´qťňĘáTgÉő$ęHĺ·ľ)đŁugsyŞisĎe'›lîŔŰČýÔÔ%Ťt»ĆÔ> i·misheĐnŰČąP˛ ó#Ćŕ ÁÇ8ÎFyÁČ®˘ą\ŇőωpKĄßÁv‘č·Jć'ÎÓľ.µ×Rc (˘ÂŠ( Š( Š( Š( Š( ŞßęÚl -Ë8 Ű#Ť¤wl…EŕŔ8ž€ŐŞČÔíîbŐ,őkkg»6đMnöѲ«˛ČŃťĘX…$‡Žśä` K¸/­RćŮ÷ÄůÁ ‚8 ʰ ‚ ‚*jä§Ń5RÓęöG욥ŐË„+!’8ˇ äí,ľTs3“@H;Ť/řDĄ¶ń42AçŮŕ’ÜYËííăDSHęÓŚě“*ź+Á#s*Čňއ6Úۨ'đHů†ädg#¨"¸ë/ ßiľŃłWěšĚËĂ’˛‘ć"$„–$6±¸ä@p¦łőN·REŤĚšDs‘ ­żŮĄfŢÚ8ßmÎS ĺJą??šđŤ:d´űLo2ĽV†ţô8’ĐM‡xŘÁůXX+1¨řZń´+‹Y4IµC.śđX$Ň[»ŘĘZc“’‰B1 y[FB©%€ôzÇ7şÎ©Ş]iţÓí¦6a~Ńwy9ŽägĘ1 ¤Ś`Î2ąŘ¦xZŢ]PÖ‹<-g}p·qŤř•e(Lç ł 0sťŮ톑Ů.§ögţŐ°wČc!e$€űÄ#ťŚsŤŔ7ĘrV—Z˛‹P?é2OąQĽ›YeHٱ€îŞU?1Á·őµť\rFqÎÎ9őäôăĄq—ö—/Ż$š~ť}o?źIz.Um¤@WĚÝ“,Ć0c c'!yCIPÁwĚ×1DűžÚAĂmbŠř÷ů]OµŔŻ…µ mm-ĆöŇF¶ńęW 2FÚ„«qní8tmĚBÇ3n}ŻűÎIÄŇŰéöšćąĄŮ[igRĽT*5ż-„PŁŰŘîݲ7uV_+î–8ȢŔv’_Ĺ©o§•:x%ťX´,lŠsď™CE­üWwĐF®Îq…€ÁcIǶ$ŽkϬ|7qoy_ř^çQÓbk•·´¸["Ї[RĹe‰AhćűĽó’2Ä’Oë .§ÍühĂÍ[so3O/Ů­câä 4S ÇóqĂ5Ň誺lÚév–ó»É4P";Ľ¦Vf %ČŽ{ŕg®Z aEPEPEPEPEPgţ?¬˙ß“˙DÉ\ŻÄŹů›ţ»§ő®¨˙Çőźűňč™+•ř‘˙"“×tţ´Đ™Ú\˙­_úćźú޶ßň˛˙ŻHôZŐ«źő«˙\Ó˙AVŰţAö_őéţ‹Z@IEÇh,żÔl´1{´w·“¨¸XŐ‚ůOm$ńĽ`śăĺ IČÜ’Ó4ŘŃ\­ŻŹtűŕ©eisutÓ¬"ÚŢkyćI6ő”Ć"“ŤŰ¸éČ%óxďI·±űT«4aü¦·YZ8üřäc‘Yś"«ä ;+|¸  –§˘©i:­®µ¦C¨Yľč%ÜČ8*ĹXd# qHÁ«´ (®VOMe­k^E|Ú}”đÚ ·Ž7ŤšAhýëI™ŹA·hŕë |I ݤ±ĽDY"‚yŹ–RŢi‰°ĺ‹~ň1• ż8ů¸8mQ\ÝŹŚ­/RÖC§ß[Çp°ČQ&;afÚäáŰ*ÉÁF é(QEUK^ŇôŽ}JîÚÔHJ$“¨9î@$qŰňö«ŐŹw˙#ďżëîç˙Ieˇn&C˙ 'ÂßôÓ?$˙ ?ádř[ţÚgäźá]­żŠtIŕł”ę–1­ôŻžë¸ŹÚJľĎÝ•b'‘¸ŕGˇx§M×&ş´ŠęŃu k‹Ą˛[•yQb™˘ŢËÔ·#ŤŔdő7a\ăżádř[ţÚgäźáGü,ź Đ{Lü“ü+µ˙„łĂŮßÚ?đi_aó|Ź´ý¶?/ĚĆ훳ŤŘçqZO ŐĽWňÇ4 xäŤ+©Ásš,<ŰţO…żč=¦~IţÂÉđ·ý´ĎÉ?½6Š,<ËţO…żč=¦~IţÂÉđ·ý´ĎÉ?½6Š,<ËţO…żč=¦~IţÂÉđ·ý´ĎÉ?½RvK Y« `ÔW—Íń{ÂÖóÉúőÄSFĹ7¶¸VVS‚ &€ŢŇĽQ¦ř€\&•}mv!Pf0*ü ž2@î{{J»X:ŰŢřÓÄł4“2ť6Ŕ 2˛©yN6·+Ôđ@Á&§żŐnm˙ ö™ů'řQ˙ 'ÂßôÓ?$˙ í_Ĺ:$]MuŞXÚŰŰ]›6žk¸• ˇCÎîd‚­†ůOÁ1Ůx§MąńَKuiˇkp"ŠŮ®WÍťLË˝SŹť‡ű„ç°» ç˙ 'ÂßôÓ?$˙ ?ádř[ţÚgäźá]Ëx—AT˝vÖôĐ–ńŤŇbÝ‹N~BXŽF*ĺŤýž§gĺ…Üv˛gdĐH$FÁ á‡řQ`ąç_đ˛|-˙Aí3ňOđŁţO…żč=¦~Iţé´Q`ąć_đ˛|-˙Aí3ňOđŁţO…żč=¦~Iţé´Q`ąć_đ˛|-˙Aí3ňOđŁţO…żč=¦~IţéD­¤Ě¤‚#·ć:ŹĹ?é:„öúÝĹ˝Ô ¶HŢŢ|˙|ňäÁI 54ŻéĺŰYéZ•ťŐÇ–ÎÉ)!ä’ź×Ţ´+›Óő„Öü{ĄŢAq<Ö’čWrBeWL$_0WŚŕsŽFLWIRĆQE (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€ (˘€#?ńýgţüźú&Jĺ~$ȤßőÝ?­uGţ?¬˙ß“˙DÉ\ŻÄŹů›ţ»§ő¦„ÎŇçýj˙×4˙ĐEU¶˙}—ýzC˙˘Ö­\˙­_úćźú޶ßň˛˙ŻHôZŇJćĺđF•€;AËg^ŠÂ‡Âv[ĂËrV, RYrVÖC$yă©'ćő1[´Q@Q@cÝ˙Čűŕďúűą˙ŇYkbˇ’[ k«{«Ą¶óâ,`’gÚP‘†+Čçô$w4-ÄĚËo kzV® Šá×âş¶”Ý»Ĺ%¬/uu"JaŢĹ.łĺ±Ś‚  ;v$đ¶¨të(mŻ µş·Őu ĺ¸ ćybqv#!HĂ2›„%NĘÜž2˙řI-çňŰ˙[˙‹ŁţK_ůü¶˙Ŕ–˙âęî+šOuhaŢĽŢëAđĄçŠ-üE?ŘŰQpÍ]¬Ă]‡vP0lű.7u+ÝY·[}R=.úpëÓůŞdb3‚F}Íe˙dxţ€˙ż˙Ť'¨ ĐeŽox¦Hť] …ŽNAůĺďZ—zj]_Z^,óAqmąCŴ–Ť6±DÉa·‚2riPhVBâ=OŇíZUo±"©e‚vžÄ÷ő÷«µ,fF™áű}.x¤K›™–ŢmiĄvŰBJĺj‚ĂäN\±ůG<śëŃE ÁńGÝĐ˙ě9a˙ŁŇ·Ş ź±/•%ň[˛Ĺ*ÉžŘ ĺXr9Gˇę(Bo¤ë â­SÄ}¬3]Ď P^ĘöÂHÚDir0ö¬ Ă¸cq¦x"óKđóé+uŰu 6â9H+ş;d´VČÁĂł9$rĽőĹżřI-çňŰ˙[˙‹ŁţK_ůü¶˙Ŕ–˙âęî+źđëóë—wsÁ#[ů~eĚš”ó–[»Y™Ä,›-ň¶ďňFJ‚Ę˝ÚiZlÖ:Žąq+FRţőn" NB‹xbĂq×tlxĎ}7ü$–żóům˙-˙ĹŃ˙ %Żüţ[ŕKńt\,u´W%˙ %Żüţ[ŕKńtÂIk˙?–ßřßü] mÉÂIk˙?–ßřßü]đ’Z˙Ďĺ·ţ·˙EÂÇMzĘ–ěV&$“€ y†ą řSÄZ…Ťö§ö9§łlˇ2®$^~GÄą9ÁďěX†űUŇu;9,ďÎźwk&7Ă<ľb6#*[řV?öGżčáŻűńřŇz´đÜ|NµxeIh—`”`FwĹé]géVľ±»gŃ´˝ÚęHÚ2öqŞąR2GĘygđö­ –0˘Š(QEQEQEQEQEV.«w©˙mŘéşlöpyöÓĎ$—6í7ú¶‰@]1ţ°ó“Ҷ«3RŃŤýőµäZŤĺŤĹĽrDŻl";•ĘHŚ:Ć˝1@w^7°Ól-®µü$“Ĺ.'‹´.RB˛Ľ‹HŘĄÇĘ ‹á­GRŤ7˝´ "®q’ŕ˙*źOŇŕÓZčŔó7Ú$YÍącHÇĚyĎç“z71+4ËV2Ś~JvđNW7`đ¶™oö_.,}šĺîĺ^sŃq1ŃŰÉ‹ű‚łAÔäľą¶–ŢŃ.$›}Żö›(Ű)o1ö¬‹îv ‚Üc BĐ?á>°ĽźO6÷J ŃÔa✲4˛bg™ă(;Écćěav–äxže cr !#ˇÁ##Ř‘ďYĂpÎжŁ}y¨ä/‹Ż/c‘”(¨©·ľxÉă$€Ô´¶ű%ŞAçM0L…y›să<ÝNNIĆI'$€eŰé‹âĎßi—·71éšm¬/-¬ţÔň—ÚY× ˇ<®€ňHç†Ü‹Âöž[esxÖňhíî&2¬8`ŚŮoľNćnś`qQŰÁo®š§’MâBÖë(rŤb¸űĽ•^ ôăjćíî ÎppI'$ă§·sĐ´î¬Ôä5O]i>%–ŢK_;LŠĘ9‘iĚîeŘŁ»[É(Rî€}î!Ó|_:iLúµ§™wkç6Ł%‚Ź&Ú4šXüĚ;e>Kś(fůO  BÂükŢYéÖ7‹4#‹»ĆŚ+DîčB__9ĎP02iZřQ§·ą[ć{3tŇĄÔ6·"dą…äy 3÷?)­µ˝>m@ؤÎfÜȬaqşçr,„lfl¨$Ť­‘ňśsÖ~ –Ćńď­®4»[ĄhžłÓ 0E™ xÄ„ą+;qµză퇄mě5çÔQlpg–á\XŻÚKČX°i‰9\»`S€ ±î4¤˘Š(ÍżŠa¶ÖµHďçKK Žw¶“iwćo¸Ł2…ŘFF7Mâ 4ÝEne™^M-m"˘3€UŠíŤÎĺÂ1 ó/0ĚčwŰżŇqö­FÚ˙ý_ÝňĽŹ“Ż9ň:öÝĐă–\xzYő ťol®n὞ 2bňöí}ŘUýĚyIűÜŚŤ ‡ŮřłFżű?‘q6.6ům%¬±‚îY@ äáIŔr\EmW1oáłÚ[AöíŢM¶ťď'ű$¦LýďăÎ1ŰŻ5ÓĐ?iâ¸'T3CäůvĆKĐą·›Ěň–ĚŚdI”mÎLcď\Ýţß°6?kQxč$ňš8ě¦iQ±śłż´‚îÖK»Ťđϑґ•<áSxg@˙„wO{_´ýŁw“óy{>äCÓ'Ż•»ţŽŮ.»˙‘÷Áßő÷s˙¤˛Ó[Řé˙áđý šţ ˇ˙âh˙„Á˙ô*hř.‡˙‰®‚ОNţO˙Đ©ˇ˙ŕşţ&ŹřA<˙B¦‡˙‚čřšč( ţO˙Đ©ˇ˙ŕşţ&łő?x Hň…×…´¦’\”†ŰE0ËlŽ6mŁ* c˛‚rF{ çüO6¬>Ëka¦ß\ÚMżírŘMs"ŚaÉ"mß“—RYB0Ě@1Ć›đŮŻ!¶Ź@Đĺóvž-)\ŠÓ*Ő2mRŔťé€w.cŽĎᤩ3݇ô`‘¦ôgŃ‚‹…,3ďÁf@ {˛]ÎőÉý‹¨žÂŰE’ÚŇ÷S°Ôcpđ¬Vq@¶ŰˇuWČqöf"˛|Éóc;kŘŘx“J°ŇM¶‰#Ýčz9ŇĆůa+rîöĘey(« ľŮ E˛Ł‚IP 8<;ŕKý.ćňÓĂ:*¬!„‚m%!x.pččNl0„ᮆ•Š-í-üáŮ´r»fľňl8ÁT<•^Aă'<—ćô[-2ÖóĂ7–Úž‰pW2\Ç«y2˝Ű€§Ě-™O* 6„*¨Q\%Ö•cŠ-ôŘ>hiŇ®ó¨áUcQŤÁ“aů˛xůłÔa¶¦4[đÄ60xżÄńéÖÖVöÂÂËjŮ‘ˇ>dą8@9ď׌v­kÝZ-?P·‚çdVŇÁ4Ťu$Q=§iĎ*]şôŤŹ@Hˇář¬ěüWâK?M°°¶†ĘÍ„v–ëćg“%äôž8ęss]Ń ×¬RÚs´,ł‚r¤‘x#ďFň&{oČä –4Rµń\Ăe,đů"[#srki7˘J’ěćD–‰€ä 'ÄÚX$\ł32ů g3N¤Nč‚ďP!ÉP>uţđÍ+ŹYĎoŞÄYľž9UdŹz I<তüęfiXŽ ČqJOŰ´äE˘™âiO”úB›P %a oÝ'Ě]Ź,:hľ›â/µËo:äGhaËy±ýž)K’26ć\nŕr©Żă!şµŇ-î"Žh%ÖlRHäPĘęgPA‚ăí;ÂɤÝËugu˛i$‹qňUC‘G–ʸSţ¬˛ac´˛łĽQ÷t?űXčô¦·użđ‚x?ţ…M˙Đ˙ń4 ŕ˙ú4?üC˙Ä×AEY'?˙'˙čTĐ˙đ]˙Gü ž˙ˇSC˙Át?üMtP?˙'˙čTĐ˙đ]˙Gü ž˙ˇSC˙Át?üMtP?˙'˙čTĐ˙đ]˙XqY|7šâx—Ă:j¤2Ks&€RÝ E„™ť˘€Ągv21]ĺyŢ­á}Jđjşn“cw§‹Ô˝[‰çÔšk)ÖxĺĆČ˱ŤĚ˛Fí—dĽSLđ÷€µ4Zř[JY"ÁxntQo"ś6É#VÚpŔ60J° ă…וe¨XĹĄx#ĂşŤ«6ëą„6Q”NF62ŮÁçŚ gśŻ˘éö3ęşľŻ©é2ZÚ^ŘÁbm/'wÓ—$Fλąá˛Á<&ąĄXéú…Ťľ™đÓ@Ô`şmŹ9 ą9q°áp3‘žxĆJîLh±ĄŰéVßm—JłÓmâ:5ٰŰÇfßŢ(™÷«ţ$×˙á·łśŰyńMsĺĚŢfß&!É$ťí©Ł“ĐsPXZéÚgÄ+{=3GÓtřäŇ.ĄÚÚŞ3Ń–ë“ŔăžsŤKí?í—zlţnϱ\™öíÎüĹ$xëÇúĚçžďRĆdAă gŐ5;i xŕ´hŇ c +Ý1iQÂÄ«»*đĘ8ÎBűĽŐ¦ńfŚ’*‰Žc»-¬Ą!RĚą•‚â,pw•۵łŚ«/„Ö+Ë{­6ĺ-ZÎ xm#’#*F"YÓćů0)pè ¨9<ŠbřCĹąľËę–Mo#xGwžGp7}Ý× ś€Ł,zŇĐ W>$‡űsNÓmČg»x&ŰÉ倱JÄ,¸ŘX2@$Ś0ĆAĹ«oi·SE K4sË'”Ďm$2±Ü® …"7Ă‚T€r1YsřVęi’Ő|ť>;››”Xa+rŻ2J‰wŕ`ÎĹ~LŚ(çšCÁóŘÚj&Ő4áqyöT‰tű!k Ą„ĺK°vBűö’7Â÷ †ď[‚)ďm‡Ú?ŇE˘)%Íä`’2HpH€HŚżJÔeľq\ۤV“ů$rqDmbŞHŰ"őQÎG8ÉölhźŮV±B¶émöxŁť ±… ´RrËŽ žGzĎÓ<#ŁéđDN±–tśÜ‰Ş"Ç) Ťĺ çĺ–l±šßXໞA¦żźcwöTŤćQćĺ#`äŚí\Iží´tÝňÔúFŁ.Łć{t†h'hĘÉ0;Şîť§†V^٬öе?/[jđÄú•ĘMĄ« ĘH“')”ˇ’ăm48ŚŁT¶Ň`lÚۨ €™öTrč8â€)Oâ[Ë9^˝-#™Ö6çyS$« Č\FK8ű¦@BI‚vň'ďćĽ:\:m±ŐciŃ˝Ű,QbbVAbqqńsŔÜË ębÂK[ÍVÎrŇGs祋$ŹpŽŽŻ!2Ë”¨ ňáT¨§‡/áĽ:¤:•°Ődi Ň=Ł4]bR1 `qo%ĎńqČÚ$~$žxôŰŘ´ßř–ßů"'yŔ¸c*†b‚ŞX—ŕ…ş ćô˙_éW–ć×R¶’ÎŢ­bK›FycC"şČŞ Ü[g'ČU¤ Š( aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPgţ?¬˙ß“˙DÉ\ŻÄŹů›ţ»§ő®¨˙Çőźűňč™+•ř‘˙"“×tţ´Đ™Ú\˙­_úćźú޶ßň˛˙ŻHôZŐ«źő«˙\Ó˙AVŰţAö_őéţ‹Z@IEP0˘Š(˘Š(˘ł#ń÷úŤ“ÝĂ ĆźóN’ČŞBlG2c9Ř€Xŕd»iykj—Vw0ÜŰľvK ‡FÁÁÁA…MEPEdZřŽÂé"|ĽJÖŤw3KµEŞ© Vn~FÎńŢ)?şjw×´x´řµ 5k˛•¶Gr×(#vç€ŮÁ?)üŹĄhTdµ}JÎţhäk‹&w·*űB3)BHÁĎĘHç××jŢZ˝ÓZ­Ě-pąÝp\`)9x‡ţľ˘°őÝ>ßWńO…´ëĎ4ÚÜ\β¤S—ßř5»˙ăµvbą§ý­'¬ż÷Ň˙ń4kIë/ýôżüMf°đ§üú_ŕÖď˙ŽŃ˙ ĂÂźóé}˙[żţ;E\ÓţÖ“Ö_űéřš?µ¤ő—ţú_ţ&ł?áXxSţ}/żđkw˙ÇjžĄŕohÖëqŞK%Ś áK­nć%-‚p Jp DZ˘Ě.o˙kIë/ýôżüMÚŇzË˙}/˙XxŔPęérË"j&ř­[ąşóʧ›’>VäÇŇŁ‹Áż&űw•ućgçí»uëölg>gďľLmn¸ű§Ň‹0ął¨Í«§Íctnü‰†×\Śçř<ŚÁ®gţo ˙Ϧ§˙{Źţ*´ đ‚o´Ă§ ®íŮYŁš fćHŰ ˛ŕňü+şÓü;mâ‹}xg]–÷—ńÜß´9ĆŐ,$äś°áxĎńm@uÚN‡Łč?km2Öĺ%şDI^{É'$)%GÎN1–éëWkšđÍ•®źâßŮŮÄńÁ Ť™E{‰f łČXćFb3…ŕ>QĹmÉzĄľžUüéŕ–u`б˛)Ďľd\} K-QYţ#°¸‚Âr^olPY&Ú«J#'yĎݍŕóë;ëÚÜH‡rÇ8 {sÇZ×VŠâúúÖMµ˝ŘµŹt31&ŕzáŹđ¤ý3|a ÜŮévŇW˝ś2yr21G™U€e Ś‚G˝Giý­'¬ż÷Ň˙ń4kIë/ýôżüMf°đ§üú_ŕÖď˙ŽŃ˙ ĂÂźóé}˙[żţ;Wf+šÚŇzË˙}/˙Gö´ž˛˙ßK˙ÄÖgü+ ĎĄ÷ţ n˙říđ¬<)˙>—ßř5»˙ă´Y…Í?íi=e˙ľ—˙‰ŁűZOYďĄ˙âk3ţ‡…?çŇű˙·üvŹřV˙źKďüÝ˙ńÚ,Âćźö´ž˛˙ßK˙ÄŃý­'¬ż÷Ň˙ń5™˙ ĂÂźóé}˙[żţ;Gü+ ĎĄ÷ţ n˙říarüúą·–k’!F1Ě€#2¨*}Áv®Oţo ˙Ϧ§˙{Źţ*¶cřoŕéždŠ·x_dŞş˝Ń(ŰCaż{ÁÚĘp{{×®iţŃu Uđλzł·ď¦´ąż‘-Ó•äç(ç>V•á˝ Dľkë K±taxĎ,Ŕ+c $UzzVŤrÚ^—c¤üE¶¶°‚H˘m"ęVu4Ů`Ѩ?ĽvĆaĆ>ń­ÍKRM:8q5ÄóÉĺA;wČŰYQ…V<‘Óצ2íJNµyn×ě/~tđÜËřS,>Öe v1ÎqÁô8-µŤ2ňú[+]FÎ{¸sćÁęŇ&ĺ#ŕç˝!—h¬+h÷7wâ=FŬ¬ŕ†I/Vé a¤ii=~wŹÇLjV Î/mŚ)Ü4‚UÚ±Hśđ¤+`ôŕúPŞ*–ˇ%—–°é÷—ŇľNË`hÉ,ěŞ:Ž3“Ř Ůë¶ş”ÖăOŽk¨%Ťe{ŔÂ7 }ÄĚ;@$Ą‚†€iŃTµ=R *$ť&a=ĚVËĺF[ #…ŹE\žIúrH{»ź˛ZĽŢLÓ•ŔXˇ]Îäś;HäR@ĐÔVńţr7}ĂŽttk+«fżąĽĄĹőČťâ…ˤxŽ8Ŕ B–â0s´}ěsŚť:(˘Š(˝đ»ÜZëQ§’Ťw{ ĚŁ;c1ɰşŚ¦éVVĘçRÜ’EUÔâ´J 2ÎňĎjş˝Ňb¨ŠćëG !vŞáÇ@[±˘‹ćüáÉ|=e2\‹fą•mŃĄ‡$•ŠÚ(°Iŕ29ÍŘ’*ĺßüŹľ˙Ż»źý%–¶*aÚΙ©Ë,‰&śňI*ž6Śîäpťńé‚ÓÔÚŠČţŘ˙k˙ ˙ötlµ˙ű:«ˇXע˛?¶?Ú˙Č?ýťŰíäţ΋ ±Ż\ߊ5#aqd±Zݬó¤¨um:K¶µ‹(\(DrÎݡ†Ď±Ý°#]ţŘ˙k˙ ˙ötlµ˙ű:.‚Çž-bźFÓôëčáąŐtËËkY¶-¤+fůb6Qo Ů!ňŽ eɢDđÁáÁwŁ_Lş‰öKčÚÉľIĂÚ1îM´Á#ć-˙pmÉd Ř˙lµ˙ű:?¶?Ú˙Č?ýťAcHÓˇ kńßEíŻnĽĹą›}ťŐŇ,1)gUců‘ŁŔDĘ $Ĺ›‡şÓ<-kâ‹}řsĹMpľdw1ęr6 nbĆ^’g‘€w.}#S»}GNžÍ/®,Ě«·Ď¶…<ĹńĽ°äqÓż85ĘÂ$črń/ţK˙ń› đŐžť¦řźÄvu¤¤VVŚŇMu$îĺ¤“Śą8ęrNF'ń6…˙ ›¨“aYNqň:4Rv?7—,…{n ž2 ť@µŃ'Ô.†©©jW±E˝ŕŹ€ŚHĆŔ?ĽzçµhÔ±Ł’źÁÎđję“|×71KóY2©9ąÚĚ c,’®ĺÎŐŘpH9Ş|xŻ ěq'ÚwMć[®łv„ďŤĆç—rĺÚ«†Ó-ŰŃEŔĺto \hwĎunöĚKEŹćŮöq1ť»·Ř4Eş¶ŕ1'k%Ď}ÝţĂ–ú=+zŞŢé°jMf.%’5µ»Ší|µłFÁÔž™>Ţť@·ą˘˛?¶?Ú˙Č?ýťŰíäţήčV5謏íŹöżň˙gGöÇű_ů˙ł˘č,kŃYŰíäţÎŹíŹöżň˙gEĐXת÷đÜ\i×0ŮÝ}’ęHť!¸ňÄžSBľÓĂ`ŕŕőĹPţŘ˙k˙ ˙ötlµ˙ű:.‚ĆĽ?{¦Źi÷Ň"ŰÜ^Ż—%¬2Ű4…­ˇ*»HěI=[qmęěX“…âµÍ3ÂÚˇcfŢńEë^·— –šś¬›ů%IiFÓ€['śđqéóęŤ5Ľ±%Ä;ˇU–8˛>đÜÄduäę qżđ‰úĽK˙’˙üE&ÂÄV™¤čŢ?·´Ó¬çF“Iş‘渽–vŔhĆŐÄÜń“Ó:şŐĽ·zy·ŹN±ÔFK{é FTsź¸ů Ć=óĹE¤řjŰJÖ«&µ«j7"ÖKd‚-Ş®Tźş őQë޵i1śEÇ…µ´ťBÖĎě2¶Ą`Ön’ÎńĄ˘—™‘cÂ6őQ>Ŕ0śF0p¶µ ]j"i­q Y˝ż™äm©p·*¸e‡žąĎLő´R¸•Αâ ëë»éRÎÜËĽ_f¶Ô%_9c3 ËĽ|ĘŤňť›O j­§†.!ţͰťL­t÷ć)ZX¤·7rÄň2ćFÜęż8ĺăąÍvôQp1uűMN÷ěđÚAgqdw¨..7¦Ő%Qňź{rŕnŕWr¶cxbę]uői§GqqsÔ—ĘäÜ[ěXŐáC°F•-ąx•˛ĽaşÚ(źŐ4K”ŃŁłŇśâö –ţĐż™¸ŽD€ě$n|°1ĐdźcgSÓnÂ]]éşęS*˘ů÷ry*ą]ĹPîEm ŕě<ő˝ ć!ŇőkY,Ż-´ý:9ícžÜ[ůehÜČe1n/ş3TîÜX¶x5l|'§ZEĄG-´¶^}ťÄ—LĚ’+[¬ ´G‚ołŽwŚo<ż7cE…§i—éŻI©]ĹcZÍ›7­”Ű$€¨ÚT! ĄźF¸ů·h˘…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@źřţł˙~Oý%rż?äRoúîźÖşŁ˙ÖďÉ˙˘d®WâGüŠM˙]ÓúÓBgisţµëšč"ŞŰČ>Ëţ˝!˙ŃkV®ÖŻýsOýU4·–8b_¦ŘăXĆlÎpŞ˙–ľÔ€šŠŹÉ›ţŁ˙Ŕ3˙Çhňf˙źč˙đ ˙ńÚ,”T~Lßóýţźţ;G“7ü˙G˙€g˙ŽŃ`$˘Łňf˙źč˙đ ˙ńÚ<™żçú?ü?üv‹%“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´X (¨ü™żçú?ü?üvŹ&oůţŹ˙Ď˙˘ŔIEGäÍ˙?Ń˙ŕ˙ă´y3ĎôřříJ*?&oůţŹ˙Ď˙ŁÉ›ţŁ˙Ŕ3˙Çh°QQů3ĎôřříLßóýţźţ;E€’ŠŹÉ›ţŁ˙Ŕ3˙Çhňf˙źč˙đ ˙ńÚ,”T~Lßóýţźţ;G“7ü˙G˙€g˙ŽŃ`$˘Łňf˙źč˙đ ˙ńÚ<™żçú?ü?üv‹%“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´X (¨ü™żçú?ü?üvŹ&oůţŹ˙Ď˙˘ŔIEGäÍ˙?Ń˙ŕ˙ă´y3ĎôřříJ*?&oůţŹ˙Ď˙ŁÉ›ţŁ˙Ŕ3˙Çh°QQů3ĎôřříLßóýţźţ;E€’ŠŹÉ›ţŁ˙Ŕ3˙Çhňf˙źč˙đ ˙ńÚ,”T~Lßóýţźţ;G“7ü˙G˙€g˙ŽŃ`$˘Łňf˙źč˙đ ˙ńÚ<™żçú?ü?üv‹%“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´X (¨ü™żçú?ü?üvŹ&oůţŹ˙Ď˙˘ŔIEGäÍ˙?Ń˙ŕ˙ă´y3ĎôřříJ*?&oůţŹ˙Ď˙ŁÉ›ţŁ˙Ŕ3˙Çh°QQů3ĎôřříLßóýţźţ;E€’ŠŹÉ›ţŁ˙Ŕ3˙Çhňf˙źč˙đ ˙ńÚ,”T~Lßóýţźţ;G“7ü˙G˙€g˙ŽŃ`$˘Łňf˙źč˙đ ˙ńÚ<™żçú?ü?üv‹%“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´X (¨ü™żçú?ü?üvŹ&oůţŹ˙Ď˙˘ŔIEGäÍ˙?Ń˙ŕ˙ă´y3ĎôřříJ*?&oůţŹ˙Ď˙ŁÉ›ţŁ˙Ŕ3˙Çh°QQů3ĎôřříLßóýţźţ;E€’ŠŹÉ›ţŁ˙Ŕ3˙Çhňf˙źč˙đ ˙ńÚ,”T~Lßóýţźţ;G“7ü˙G˙€g˙ŽŃ`$˘Łňf˙źč˙đ ˙ńÚ<™żçú?ü?üv‹%“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´X (¨ü™żçú?ü?üvŹ&oůţŹ˙Ď˙˘ŔIEGäÍ˙?Ń˙ŕ˙ă´y3ĎôřříJ*?&oůţŹ˙Ď˙ŁÉ›ţŁ˙Ŕ3˙Çh°QQů3ĎôřříLßóýţźţ;E€’ŠŹÉ›ţŁ˙Ŕ3˙Çhňf˙źč˙đ ˙ńÚ,”T~Lßóýţźţ;G“7ü˙G˙€g˙ŽŃ`$˘Łňf˙źč˙đ ˙ńÚ<™żçú?ü?üv‹%“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´X (¨ü™żçú?ü?üvŹ&oůţŹ˙Ď˙˘Ŕţ?¬˙ß“˙DÉ\ŻÄŹů›ţ»§ő®®8\E,·bAňm¶d”eëćďzW)ń#ţE&˙®éýi ;Kźő«˙\Ó˙A Msţµëšč"¨ZZZ >ĎýĚ“mÖČI%’I<Ň/ő m6–ĺśm‘ĆŇ;¶ ¢‚Ěp ŕO@jKK¸/­RćŮ÷ÄůÁ ‚8 ʰ ‚ ‚+;S·ą‹TłŐ­­žěŰÁ5»ŰFĘ®Ë#Fw)bb8bs˛gŃ5RÓęöG욥ŐË„+!’8ˇ äí,ľTs3“@H;[Epżđ‰Kmâhd‚ ĎłÁ%¸ł–) ŰŰƦ&‘Ő§Ů&U>V‚Fç"k/ ßiľŃłWěšĚËĂ’˛‘ć"$„–$6±¸ä@p¦€;•dyUCmmČT€x$|Ăr23‘ÔOŻ;Ô<:ÝIv72iÎD6¶˙f• {hă}·9L/•*äüüńĂWSú͜ŹÍi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€IEGökOůđ±˙ŔH˙řš>Íi˙>?ř ˙F€I\ŹÄŹů›ţ»§ő®śCwöf+[h›ttP"ő2qs?äRoúîźÖšÜÚ\˙­_úćźúŞÖ€µŤŠ¨$›XżîÖ¬Ü˙­_úćźú¨ôżőz_ýp·˙Đ€$ű%ĎüűË˙|>És˙>ň˙ߡ˘ĹZéíÔĚŞí4cp ¤«)ÇpAv"Ąű%ĎüűË˙|á<3©ßŰřsJÓôű+k™®.5IË\\´*«ĘŻhß$™§Jرń†ŤiçÇpęV¦’#ŚH¨Č¤~f(U–9 ’§Â:?˛\˙ĎĽż÷ÁŁě—?óď/ýđkźiŞÖ‡ÎňŇi$Ić9!ňvFdmű“äm 6nT–ă—ŹifÉr¬¬«ä=śË; b+˝ ç!Hůű§ ߲\˙ĎĽż÷ÁŁě—?óď/ýđk K×áÔő+ë$·ąŤ­™pĎŠ®­rrJ€­űĚl'wǦ˝,jÓK4Q)y `’˘ŚŘ€Ŕ0ěpAç±˝KöKźů÷—ţř5Ăéúżö5źŠ'Ů ßâ™q7“_ččwI&Ĺăh89fQß#n ~Řió\ŢËm[Ú ŮţÍ#OŔŰöşľÁĽoˇ%€Ýű%ĎüűË˙|>És˙>ň˙ßą[/Ů{ÇÔ]íšÚ{µg6ҬlÉ ů\Ť®ŰqU$đÜpqiĽYŁG´×@Í ‰bžÖXĺf*Ě FĘîŘáxůŠ•ň˙ߢ¶VĽ¶ŽćŐLđJˇă–!ą]OBŕŠ©©˙Č*óţ¸?ţ‚k”ÓÉs˙>ň˙ßąSâű&Ö!‚7±I§iÚÚP$exV?)ġĽĂŤ›·¸ę3µa¨[jP4¶Ěä+lt’6ŤŃ°S‚ dz@dą˙źyďQ\+ZEćÜ©†=Ę›äFć!Td÷$€=I’ąż˙ÇŽ•˙a‹/ý´Ő}’çţ}ĺ˙ľ dą˙źyďXľ!×˙˛µKŘŰ|­™fľf>Ó)—Ëňúź< ÇŹŢ碚’-oO›P6)3™·2+\FîąÜ‹!†* #kd|§ßdą˙źyďQF­4łE—’ *(ÉŤ Ç{{Ö#xłFŽ5i®&šAĹ=¬±ĘĚU™@Ť”1ݱÂńó*2x¬}'\µŇ#ń[I$-/ü$«DŇ…*Ź!˙eQdsŰ· A`;ʞ\˙ĎĽż÷ÁŁě—?óď/ýđkź˙„–Ň9®’d›\´ýž).p¨…Ü,jNŐv1“Č ¸$Šśx‡Jk¨ KŻ3Ěٶhăg„ 2€QY.`NĺÇŢÔ¸V´‹ÍąS {•7Č6ŤĚB¨ÉîIz’KöKźů÷—ţř5çÚŽ´ş×†|=p̆éďtą®5;ät} śóťą$¤ýŕNÓxżĎąŐ|Ë.[mUlŐ<ěů‘=Ń·go:Éňőů:ŕNŔt˙dą˙źyďGŮ.çŢ_űŕÖlj´»S:ÜIsBÁJ˝śÁ¤%ÄcËs ÜĘ2›‡ĚľŁ"x›H‘%arëĺ®ě<)~B•@T`̨UrÁČR)»öKźů÷—ţř5 ×HĎn¦eWhŮŁ€e%YN;‚#±RĂP¶Ô im™ČVŘé$mŁ`20 §@Č ô"ąO ęwöţŇ´ý>ĘÚćk‹ŤRr×- ŞÇr«Ú7É&AéŇ‹Ýý’çţ}ĺ˙ľ dą˙źyďXCÄšzŮĂu0ąŠ9DrmÝ–Ť¶Č$tP+ ·‚A f­&­c'‘˛|ů÷2ZÇň7Í,{÷ŻN1ĺ?'Ž:Ś€iý’çţ}ĺ˙ľ dą˙źyďPŃ@ÉľÉs˙>ň˙ßʞ\˙ĎĽż÷Á¨h  ľÉs˙>ň˙ߢ¶VĽ¶ŽćŐLđJˇă–!ą]OBŕŠ©©˙Č*óţ¸?ţ‚kOŐ˘Ń>řfú}žJŘXĆěňTYP±' PŮü;u GUöKźů÷—ţř4}’çţ}ĺ˙ľ s1xËHžúę.áş‚áa-›ý Čňv©$°n8ÉÁ' ŐŃâ)­n®E×î­mľŐ91¶cŹ.F2¤~đ*AĐĎŮ.çŢ_űŕÔAY®žÔ)7‹#DÎŞIę*ŔcéX˙đ“i'dąy|‰Í»¬PI#y °1ŞŞ’Ě61 BáŹĘA8ęĎeâßZŰyĎ-®•QNZeťnĘ–\oÉsĆ1E€î>És˙>ň˙ßʞ\˙ĎĽż÷Á®}|C·›«ŮŻ˘ŘLűî|Ŕű¶ö¨g˙W&FĐFĆ8ÚÓÄl’[ÇłLóă ´ŽcůŠţđ*ź+ć >}¸*ĂřN6~És˙>ň˙ßʞ\˙ĎĽż÷Á®}ĽYŁ$k#ÜL±<‚(¤kYBNĹY”DŰq&BlÎ~P2YrĹńn–˛É ňşÉ?ŃA4‘Ä‹,‘î’MPf'ÉbÚy n Ů.çŢ_űŕŃöKźů÷—ţř5ĚŰx˛ŇlůËöP—łÚČ÷DŹyÇrąMŤÄ$ž@PNN@ 3xŻIHŐ™ďÚAŔl'UÍűHGů±Ź‘ąŕĐAöKźů÷—ţř4}’çţ}ĺ˙ľ S´»‚úŐ.mź|Oś ‚<« ŕ‚8"¦  ľÉs˙>ň˙ßʞ\˙ĎĽż÷Á¨h dßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4Pßdą˙źyďGŮ.çŢ_űŕÔ4PÜ+ZEćÜ©†=Ę›äFć!Td÷$€=I’ąż˙ÇŽ•˙a‹/ýµŇP"3˙ÖďÉ˙˘d®WâGüŠM˙]Óú×TăúĎýů?ôL•ĘüH˙‘IżëşZhÚ\˙­_úćźú¨ôżőz_ýp·˙Фą˙ZżőÍ?ôU­ [«+ wieµ E!GĆŁ*Ŕ‚§ĐŽE>Šĺ đv‹4QHt»ŐWUb»vfx Śżĺ\ăqÚőđVŚvďŇîÇMŘ×îŽ>îqÇ=_ëµzn;K )xgöLJ4«˝BŢÚękŤR1oqČĄžĺNîz##§ń~{wť¦Î׼˝†ö2cČŤâXv3ó.čA<‚A ÖŞxKÂZ‰|1óÁ{q]]Ĺ0ęW ŞĂň~~Xő,zź@­‘đżĂ']Kžźń4¸ëÇý4˙?Í7©ihs×ţźP mw7›ö»™®/î!Q(kF¶ ’Ä6O;‡Ęä‘•Rű_µYí¤Ňí/bťfŮé‚2DůĐ>ç;eăapÍ»j†Ţ¶·’âáďâ‚$.ňI«NŞŠIbdŔsźňd ü2q…Ôąé˙KŽĽÓOóüË öOÓn¬Żî®îďlł €©óÂ$e”ď8M±Ź”‚rOÍÚ´ęř_ᓌ.ĄĎOřš\uăţšźć…ţ8Âę\ô˙‰ĄÇ^?é§ůţjč=˘0ôďä‹ĹCOą¶·›űx×í2•ű:q€éÎqÎ ŠçÁ·Ma}oiŞCęVŇAzňÚŢňČL`H»>iäŕ—ăoˇ-Ń/ĂźÉF ¶űĹĂÔgä+·,Cĺ°“ŔÎ:“H~řdg+©q×ţ&—y˙¦źçů; çG/«xKQźDÔ­Vň”n¸˛·Ž.C4ë0 ň3•*<öuyÚsÁR?ÝI¬Űj×÷đËw H‚ŘĹ"G:*ŕ»ٸbNp@’uÂ˙ Śĺu.:˙ÄŇăŻ?ôÓü˙ ü/đČÎWRăŻüM.:ó˙M?Ďň.Ú#-t)í.’q?Ú--.gľ·µŽł4Ň 7)‘źi_ßIµqňĺ¸9ËŇ<– §Í7ösĎ vĆyĹeIhŠVű|µŕˇ<±IzđżĂ#9]KŽżń4¸ëĎý4˙?Č? ü23•Ô¸ë˙KŽĽ˙ÓOóü‹ öLJ×öö6±jVŘŇŮśÍhÇj¬o%ýçďÇ<®Ďgůk¤Şgá†Frş—âiqןúiţ~řdg+©q×ţ&—y˙¦źçůAííOţAWźőÁ˙ô\÷†Ľ;asŁxoX»·¶ąhv1ÁćŔ¬Đ4fFܬz\tÇ݆ůř_ᑜ®ĄÇ_řš\uçţšźäćřqáëâYýVĹĽHš”ę©yUp?“Ô“EĐsŁďÂ1_ii§ĎvâµŢ\;"Ĺnu*2Nőç;zsĂ5/ ÝkfźR›H»»¶ó??K2A±öű¶”ťŕ ĂnĆ ç5¶~řgś.ĄíťRă§?ôÓü˙ ü/đĎ8]KŰ:ĄÇNé§ůţEĐ{DTąŃXŘi°Ů\$3鬭nň@2#hľdM]¸R v5›Ă·RÝ;K ·¸ą‚ňé؇yâŕŁo!S*C˝órÔ? ü3ÎRöΩqÓźúiţ~řgś.ĄíťRă§?ôÓü˙"č=˘9©<-Í˝µťÖˇm5••§Ům"k2NŐ’_8—"Aű„ MŔ·ÝăÚŽš-‹Ŕ«f¦I ڶv‹o8ĺ@IčŁ%™ŽsČsđżĂ<áu/lę—9˙¦źçůá†yÂę^ŮŐ.:s˙M?Ďň.Ú"ĺs~3˙Ź+ţĂ_ú9k`ü/đĎ8]KŰ:ĄÇNé§ůţGü+_ [2ÜÇóI‰ăęşîCąIRävü‹ ö‰’ë:Ű5‹IüÝźb˝yöíÎüÇ$xëÇúĚçžď\âx&Ţ=Bęá$¶„NÓČ·YŞ^«Í»qűA'€dm¸U# Ýź Ľ9$Ź$§TwbKłj·–9ç>g?_ţľ~řdg+©q×ţ&—y˙¦źçůAíĎi~ ţĎÖbÔ|Ý:.HßČÓô˙łFŰcť9Űć?hëč€c¸Ą˘řbĎWÖuŹćëňtÁ"µáZřjŐ–ĺ"ľi-ÜL‚MBwPčw)Ú\‚ ň;~N“á—‡$‘ä”ęŽěIvmVŕ’Ç<çĚçë˙×ÁpçG+€|­BźµŮŹ+`ó#±Ű<űg†mÓÉĽůŽ|śŔĺŘăµZĽđTW°¬s]#޵ӄ’ČÍ-Ôw*Iů”‘ĆŕO+[Çá†Frş—âiqןúiţ~řdg+©q×ţ&—y˙¦źçůh4-4[VÍL’líŢ pĘ€“ŃFK3ç0;áť2ţăĂšVˇ§ŢŰ[MoqŞ@Vâ٦VY.U»H Ć=z×R~řdg+©q×ţ&—y˙¦źçů8|8đô%ˇ[ő†ŮťbDÔ§P 6ö'É,Ç,y<ŔQtčć5źĹ©Yµ´WÄI‘łßÚ –Gvwy˘Ă ŽFi bÔŔqZö:NĎjZ¬y[±?>íůHüÉ:ń»Ë‰6‘Ç‘‘÷Í^ ü2q…Ôąé˙KŽĽÓOóüÁđżĂ']Kžźń4¸ëÇý4˙?Ěşh‹”U1đżĂ']Kžźń4¸ëÇý4˙?Ě ü2q…Ôąé˙KŽĽÓOóüŐĐ{D\˘©Ź…ţ8Âę\ô˙‰ĄÇ^?é§ůţ`ř_ᓌ.ĄĎOřš\uăţšźć]´Cµ?ů^×˙ĐMdi:ö—ĂŹ Áćů{,¬'Ý·9ňť$Ç^ű1žŮĎ5Ş>řdă ©sÓţ&—x˙¦źçů©řsáë¨a-řX#B‰©NŞ‘¦U@đ8‰ÉęI§tŃşŹ‡ĄşÖżµ­Ż¨Ö’"+ ťI`K· Ŕ#AÉéY÷> şk ë{MRźR¶’ ×–ĐČ÷–BcEŮóO'ż} n„ü/đĎ8]KŰ:ĄÇNé§ůţAř_ážpş—¶uKŽś˙ÓOóü‹ öËąđŰÉŁ}†9¬ŮţŰ5ÚËsjŇyfI$pSlŠČëć`8lŚ1ž2¬ôin5Żé°_8šŢĎItąşS33C38.]Ä”ç‘Ô×R~řgś.ĄíťRă§?ôÓü˙'GđăðyÖŃ® ±\…iÔgŢáíďÎv;zg¨.ť3 PđŹö¬b}B{;­DHŹşk=ÖÄ"ČŞ†ů*˛7/ťÇ9Ŕ Ľ#äÜiĎ övÉk‚íggöy[4†5dp$śŮ[#$’ÇpŰ ü3ĆWR÷Ć©qÓŹúiţ>řgŚ®ĄďŤRă§ôÓü˙2č=˘2ě|;ujşMĽ—đÉi¤Č¦Őج…2BŰy Řu9 Ł*x猿řDµ¨jÖ«y iš…±Žwh7HâIîduBleYŔÜĘŔ’8"şđżĂřgŚ®ĄďŤRă§ôÓü˙2č=˘.QTÇÂ˙ ń•Ô˝ńŞ\tăţšźć…ţă+©{ăT¸éÇý4˙?Ěşh‹”U1đżĂřgŚ®ĄďŤRă§ôÓü˙2č=˘.QTÇÂ˙ ń•Ô˝ńŞ\tăţšźć…ţă+©{ăT¸éÇý4˙?Ěşh‹”U1đżĂřgŚ®ĄďŤRă§ôÓü˙2č=˘.QTÇÂ˙ ń•Ô˝ńŞ\tăţšźć…ţă+©{ăT¸éÇý4˙?Ěşh‹”U1đżĂřgŚ®ĄďŤRă§ôÓü˙2č=˘.QTÇÂ˙ ń•Ô˝ńŞ\tăţšźć…ţă+©{ăT¸éÇý4˙?ĚşhŚ˙ÇŽ•˙a‹/ýµŇU/řVľµ)t‘ß4¶ěł “Q™Ô2Ęp\‚Á˙őݧrŁ$ČĎüY˙ż'ţ‰’ą_‰ň)7ýwOë]Q˙Źë?÷ä˙Ń2W+ń#ţE&˙®éýiˇł´ą˙ZżőÍ?ôQéęôżúáo˙ -Isţµëšč"«ZJĐYXLI;Gk˘ĆůŤNŐÉ' ÉÜPběҬÓnͰ Ű·n>QĆ6®>›Wč:Qu%úOn--­Ą…›´· "är #n8ĎŻAĎÄŔçç×«Ź˘7xßçčX\ݱ18Ď8Çťxô˙?@śgścŽNĽzź¤?k‹ŐÇŃŽĽoóô>×«Ź˘7xßçčX9_bbqžqŽ8=:đ9éţ~8Ď8Çťxô˙?H~×«Ź˘7xßçč}®/WDn:đ=żĎаrľÄÄă<ăpzuŕsÓüý#‡Ř`ťřŹĽßOóú7íqz¸ú#q×íţ~‘ĂuĆĂ >v8ŘęĎůŕ°ěěZ'Ż>üž˝y<ő˙?@žĽűňzőäó×üý!7qsËźřsďő˙?@ÝĹĎ.ŕ Ďż×üý 1r˛bzóďÉëדĎ_óô ëĎż'Ż^O=ĎŇw<ą˙€7>˙_óô Ü\ňçţÜűýĎĐłVLO^}ů=zňyëţ~=y÷äőëÉçŻůúBnâç—?đçßëţ~»‹ž\˙ŔźŻůúaĘɉëĎż'Ż^O=ĎŇ;žm¦ď”cĎ~'ßüýnâç—?đçßëţ~‘Ü]DÖň¨.r¤rŤĎ“ţúņ“ąhśgścŽNĽzź N3Î1ǧ^=?ĎҵĹęăčŤÇ^·ůúk‹ŐÇŃŽĽoóô,.WŘśgścŽNĽzź¤c‹™;aqŰ–ŕ{ž;7íqz¸ú#q×íţ~‘‹¨…ö\|€ #qËqôéţzL´N3Î1ǧ^=?ĎĐ'çăÓŻžźçéÚâőqôFăŻŰüýµĹęăčŤÇ^·ůú+ě:çţ=¦í„aÇnŰüý$'çăÓŻžźçéV{¨šŢEĆQ€ůŽOóô“íqz¸ú#q×íţ~…‡gbbqžqŽ8=:đ9éţ~8Ď8Çťxô˙?H~×«Ź˘7xßçč}®/WDn:đ=żĎаą_bbqžqŽ8=:đ9éţ~‘Ĺţ¶q€3&0…ăéţ}‹~×«Ź˘7xßçéWQ›†ż@ŤČŔŕűźbXi2Đ9Ç9Ďž˝8<ô˙?PăśçŽO^śzź¬?k‹ŐĎŐžśoóő>׫źŞ7=8>ßçęY‹•“śsśńÉëÓĎOóőÎ9ÎxäőéÁç§ůúĂö¸˝\ýQąéÁö˙?SíqząúŁsÓíţ~Ąr˛`sŽsž9=zpyéţ~ 9Ç9Ďž˝8<ô˙?X~׫źŞ7=8>ßçę}®/W?Tnzp}żĎÔłVLqÎsÇ'ŻN=?ĎÖ+sűŁÓ–sׯĚÜőëţ~‰ö¸˝\ýQąéÁö˙?XˇşŤb ďÎć8ŘÜňyú˙źˇaňł•ńŇZK¨ii©MĄÁdb¸c6µšĎĚĚaUŁgAçżcnČU”m9%"˝ľYüccqö´¸Ž .}F Ög‘-žeýˇČPß$s 2 Ĺ€;Cw<ą˙€7>˙_óô Ü\ňçţÜűýĎŃ…źcĚ-LJ·¤űwöYđa–äŮ}ŁË™ĺYíňň|˝Űľ×ŤĽçÎď»×…ľŮ˙Ö€u;íßٱ} ÎO›ćmMŰłÎěäóü«TÝĹĎ.ŕ Ďż×üý#7Q}©/€¬7llő˙źţµłěZ§>üť9ő˙?Pśűđztäs×üýaqqËŹřqďő˙?P]ĹÇ.?ŕ Çż×üýU‰ĺ}‰éĎż§NG=ĎÔ§>üť9ő˙?XEÜ\răţÜ{ýĎÔqqËŹřqďő˙?RÁĘűÓź~NśŽz˙ź¨N}ř=:r9ëţ~°‹¸¸ĺÇü¸÷ú˙ź¨.âă—đăßëţ~Ą•ö&§>üť9ő˙?Pśűđztäs×üýaqqËŹřqďő˙?P]ĹÇ.?ŕ Çż×üýK+ěLN}ř=:r9ëţ~ =9÷ŕôéČçŻůúÂ.âă—đăßëţ~ »‹Ž\ŔŹŻůú–WŘśűđztäs×üý@zsďÁéÓ‘Ď_óő„]ĹÇ.?ŕ Çż×üýAw¸˙€7˙_óő,ݱ0=9÷ŕôéČçŻůú€ôçßÓ§#žżç뻋Ž\ŔŹŻůú‚î.9q˙n=ţżçęX9_b`zsďÁéÓ‘Ď_óőéĎż§NG=ĎÖw¸˙€7˙_óőÜ\răţÜ{ýĎÔ°rľÄŔôçßÓ§#žżçęÓź~NśŽz˙ź¬"î.9q˙n=ţżçę ¸¸ĺÇü¸÷ú˙ź©`ĺ}‰éĎż§NG=ĎÔ§>üť9ő˙?XEÜ\răţÜ{ýĎÔqqËŹřqďő˙?RÁĘűÓź~NśŽz˙ź¨N}ř=:r9ëţ~°‹¸¸ĺÇü¸÷ú˙ź¨.âă—đăßëţ~Ą•ö&§>üť9ő˙?Pśűđztäs×üýaqqËŹřqďő˙?P]ĹÇ.?ŕ Çż×üýK+ěLN}ř=:r9ëţ~ =9÷ŕôéČçŻůúÂ.âă—đăßëţ~ »‹Ž\ŔŹŻůú–WŘśűđztäs×üý@zsďÁéÓ‘Ď_óő„]ĹÇ.?ŕ Çż×üýAw¸˙€7˙_óő,ݱ0=9÷ŕôéČçŻůú€ôçßÓ§#žżç뻋Ž\ŔŹŻůú‚î.9q˙n=ţżçęX9_b`zsďÁéÓ‘Ď_óőéĎż§NG=ĎÖw¸˙€7˙_óőÜ\răţÜ{ýĎÔ°rľÄŔôçßÓ§#žżçęÓź~NśŽz˙ź¬"î.9q˙n=ţżçę ¸¸ĺÇü¸÷ú˙ź©`ĺ}‰éĎż§NG=ĎÔ§>üť9ő˙?XEÜ\răţÜ{ýĎÔqqËŹřqďő˙?RÁĘűÓź~NśŽz˙ź¨N}ř=:r9ëţ~°‹¸¸ĺÇü¸÷ú˙ź¨.âă—đăßëţ~Ą•öä˙˘KÓî×ŰŻ^żăůóŐ·=Ômm"Ťů*@Ž:˙ź˙^%4kMXŚ˙Çőźűňč™+•ř‘˙"“×tţµŐřţł˙~Oý%rż?äRoúîźÖ©3´ą˙ZżőÍ?ôQéęôżúáo˙ -Isţµëšč"ŁŇ˙ŐéőÂß˙@ZmQHg+ám^ăHř}XŘ˙hj•Ü6¶~p‹Î>VaĽ‚ŽÜőŰŽ¤VÝ÷ŚV;y/4ëT»°·ÓŁŐ.fyš&ű;‡*b]‡{â';X§đóÉŰŕďA­řMąşąşXlîµŰÜK 2˝Ă&čŮNUD‹ôţ:‘ř í´éôë]SmťŐ«X\,Đ´®-|ÉZ8âc'ČČ“˛nmăĺC´`ˇú猾Ăý§…·śÖšeĺâÝ?ú“-ľŔbrŘ.@É`ÁwtÝbĎUóE±™d‹⸷’ á¶HŞŰNĆ Vđq…¬řIÔîî®íí¬¬în,/-^hěÓy’pŁÍ,0Kzź1ąç[KŇîíŻîµFň›Ë˘€›{s b8˲ü¬îwfWÉÝŚmŕ`’­EPVŻ©Ë§Ëm­˛\]ŢĘ-ŕIe1Ǹ$’ĚcnŠyŔŕF+řÚ_ł]ÜE¦#&™Üja®J”T’hŘCň4ćŢ\nňň6tÉ۵«é’ęŰKkr–÷vR‹XŚ‘î)$d2†RFŮŁpyŠţ —ě×vńjh©©Ŕöú™kbĹŐäšF0üăĘ9¸—ĽĚ ťpw^µń,łęPFÖ(–W“ŘŰÎ'&S4>fýńíS÷2`‡c÷rNކąë_ KĄŤ|Źaky=őĽ%Mćoß&â?}&E?w$ŕîčh˘Š(˘Š(®oUńşv©›ož&›ŰQľ6«33˛„‡ą‘Á0ŔĆô뻎’°µť'PÖmn,ţÖ 2ę)-îckFyб`Ĺ$ó©ÚxĘ6<ô  îĽK¤YŘ}şâďe·›<;ü·?<"C(ŔŕC'×oČĚ ă #Vw˝YQŰť>ŕNX«0"-›ö‘üŰqň7<Âńu;˝úÖĘöm—í×6Ö†ß<×NĄL¦@»w\1 ŔÁ&{˙k˛júv¨—öRęKt‚I…›,B\…&#.ćb×d?uăĺ9Ú“Ĺz4iµÓ”uŢ̶ň0A*LŘ_Ü€UÁ2mÁGî¶*]řŰK‚hßÎĽS~ö7ŢŢY&b6ŞĚ 8*9•ŹĘA5Á2ýšîŢ-M58ßS-lXşĽ“HĆśyG7ăw™ł®ëÇĂRĹcn–·Č—vşŤĆˇ˛Ŕ^0Ó4Ä« `Xť‡ 9ôʆŠ( ™7ú‰?Ý?ĘźL›ýDźîźĺ@ö©â‹Ťi¤Ô4˝¶+ın—!BěíŞ¸ Ľó$`…,BÇ'‰ő/—IźKµÄ­†4˝f·eu™i A”âÚ^vsÉÚIáŤBéőxouKY¬µE–ĘŮ2ÜX2¤k!”¨ŹÝŕüÄŤĚÄ’xcPžůuiőKS¬DŃdK&[uTY”ŚĘYŽ.eä8çgŔÜřÂâ :+ďěŘDK,–ó,—^IŁ‘ăhm—i391>Đ|˝ŮNĺ‚ő#ý{ş?™®jo ŢÉŁMĄ&®‚Ňőg[őkL–3;ĽŤ d™ Ţ`'†-ŇŹőíţčţf€QĎ#Eo$‰ Ě襖(ʆrÝ=9 {Š’ ˝Šâ{ m.~Ës$L±\yaü§ €ŰO ×›§j—w’jwÖpÁsjŞ\Ű\âůÁ!w”B ]Ľ+ˇÉÝÄđ•éÉ5äR™Ś–÷Ml!‚Öyf;QƱîÚ<Ĺů†ĺĂ!ÝóRhúmö•§Kkuse4J§ĘÖŻä»9yd.ĚNK’rI$Öd^ÔÎą¨kV·Ů]Ëu(…naóÔÂŃ[ĆÄŞ:á‹[+)Ý·#' cOń}ťÖŻg,źşK¨˘´ąŠ  H"uĚŔ÷3H@†r€HÍ»źi6fándş‰ŕ`…Ę`Ň"Ć<ˇł2Ťî)¸|ëýáš^ ‹OŇM·˝sŰ,®ciU¶[u p@%…ż\ néÇ9°|:ňu(nľŰd<ź,y±iű..6ÜA6ë‰|Ăćąň0[hĺٱڀ:ý?RµŐ-ÚkWr¶:KE$m€pČŕ2śp@Č ô Önż«j< qeakv’\Ĺnâk¶„«HńĆ„b7ČËóÓqš˝a¦ý†÷T¸ówýľén6íĆĚCXëĎúĽçޏíšf©¦˙jÚýźÍň¶^[ÜnŰ»>T±ËŽŁ®Ěg¶sĎJZµKyîDŠh'†Ňĺ#Üëňö m °&Tů°<ăGâ˝D•ÖéÂ"ďVkyN¤…Żď,€÷dş÷—5/ü3ws3Űj0Ăgums–¦I °èU"«–9ä™cđňŰN±šÖ´&O!m˘ótTo1)ÍÁŢ ĎňAA¸–*~P ő˙ZižĽ˝µK§»K9n!†M>ă*T6Ó2í S‚űA ÄF•ď‰4˝6kŻešßěń4Ż$–˛ŮU °G۵Ř('j’p­ÇĘq…sŕ›ćŇn¬íµĎŢ_ŘÉŻ`{–d-+,™C.<÷{?x%§ŹÁž_ŠíőŻ>ÉĽ›©n|ƱÍÜ›ŇEňÚă(ľgĘ»xTEíšéRňÝďć±Y3s I4‰Â9p§=91żĺî*zÂđŽŤý‹ ĹÁöyćIJÿ“ňŞ$[˛Cyq¤qî{făËÝ ™Ü?ď7ó4úd_p˙ĽßĚĐf©Ş]Ű_ÚéÚuś77—K8Äq”Vů•îĚ©·ÝČŔ¦ˇâ¨­Ľoâ;xPĂr¶ĎÝĚ TYť >IÁčjŢ©ĄÝÜßÚę:uä6×–ńK7ćhĚrfůUĐîĚI»ÝÁČ!–ş%Ö›¦Ç§éúŁĹomgomh$…\ŁEśłž7‡€Ű€§iRr([ř›P˝K8¬ěô‹««µšhšßTg¶0ÄQů˘ďß Băó1Vĺń_đŹXëđŔíks!b†VŹtŽF@Ś]»aO sU#đơójĐj–ŁX•¤3HöLÖě®°© ”2ś[EÉsÎţ9táЬ˘đüuy¬ÇěL$l3Ä'%qÉĆ? ¦Ţ%–{ëť?O±IîÖy#·ó')©Äe¸S€Ż'•… wŚ`Ĺ`oęęPéV:]«ę!f7qÜ^´i Gäś+¬MĽ0¸FČ •Ăá©lělZÎůVµYC]Ëxći<ĺ˘ 0Ŕ|+ ¤Ü©©qŕ-3S»[Ťe!ÔZH®ŇË’Ę!]éĎîö¤6%‹e¶ńĹś·čgIˇÓçÓ-/á”ÚČŢX”˸Ěč#P¨§,@1ÉŤ;ŹčÖŻtłÝ:%˛ČŇJmäňŹ– :¤›v»¨WĘ),67)ĹKź Ü^Úk1]jžlş–4ă1·¨S>$` Řd  •$˝ß‚ľßÖZ‡üJš[©ăŠ(vβ\,«&d,T¨óĺŔŘů2Nŕ mGÄşF“v-onü©ŰfŘÄnĹ‹‰ *ŕły2Ł’@e”ďyn—đŘ´ąš'š4Áĺ cžśóö5ĎCáŤBOÁ­jZĄ¬ÓBŃŽÚɡR©Ę`î•ÎIą'?ěcäijš]ÝÍý®Ł§^Cmyo°qnfŚÇ!Fo•]ěÄ;±ŤÜ‚ łńއ4QŰ\Ěë'•¶ci2Ă™^52”–DÂ’X dâ ŹĹÖ×ZôV–‹4¶`¸»’ag7ď<¶„)…¶âU"F?&ěü¸ę3“ˇx7S±Itۋزˇş˛•1oűëo°WćŠdJ“€pyN<vĐŰZË«BÖv6 cił!Ś{á`'>a©*ş€8ůsŔń}Śšľźc WR µ›'ě҉!th€Y#Ůş0DÁ·>ĐÓŃ«ú~ż¦ę— ¤ÎĎ·ĚBđĽk2d ń3$NWćBGĚĽüĂ8Z'‚ĄŃ/…őµŢźĆyâ¶ÓŚ6âtHÄ„«“n¤>â2Í•9źĂ ¶đÍŔxO f‰­ôô†gLŻ3K’d”r6K§ĺÚnóĆ:„ŇÇss2,~né…¤ÍcFyJˇeXß* 9R1‘Š·}Żéş}Ä–÷?Úc&(^I9}»UA.u!‚@BNÍsZ·Żo%¶ÓĹŇI˘Kyy,Čí¸„\CrĽÂĺXo€y®s´“%˙‚nő‹ąoukí2ňç÷Lo¦n<±8ýäm+ȸ|a—Tó‚´ž2Đ#Ţ˙ćŽŐ®äA …ىwîfPą]¦'VX 3(:Éyn÷óX¬™ą†$šDÁá¸Sžśßň÷“ řm4;™fŽXvÉk(-–Ф“HJŞđ™Č’ňĚI4xGFţĹĐb‰ŕű<óbYaßżÉůU-Ů!Ľ¸Ň8÷˝łqĺŤOĄř—HÖľĎýťwç­ĚO4,#p˛"lÜA  ¨ˇČę¬~1ĐďćŠ;k™ťdň¶Ěm&Xs"+ƦR2ČRAËŚśTxfîÂĂDM;Q…/4»° n-L‘Éî;Ô†Ě(GĚ@†AôĎfč#KţĐó1ucqćy8˙Źe·\cwń}ź9Ďűă öž1Đď- ÔW3,F%š35¤Ń:.K ůrč:˛ähéä®ű×–]ř‚=>áćM›7oŤPş¬ŚüŔd:‘EfÜř+˝HÓ¦»IMÓ–Ě -Ă$ĚŻnęÎĄąLŰÉžC¸u«z'„ÓGż·ĽG˛ŤŁŠá ¶„™L<Ş‚HŔ€gqbK@@ÉÔě±bËrŽ—í˛ŐăůÖSĺ´qŤÇ=8÷F_čĐś5Ó­"ČÉo#,;$hŮĄ`¤F‘Ć÷ÂťŚA Q݇6x.Ó@[ĽKik P]ůrXBĺŮžpč­´ś`äUKď,–ňYé×Iiaq§GĄÜÂđ´­ötDŰĆÇÄ®70áă¸ýÇŠôkWşYîťŮdi%6ňyGËťRM»]Ô+ĺ–Ź”â=cÄÖú†·käĎ–(Ńç”Á2ÇĽąS„·n‚Ł# YşŹ‚eÔlî´öÔŃ,®ć·QlL±Íp’«—}řth… §îĺŽíÝ{L—WŇţËor–ó,đ\G,‘4R¤€ ¤‚SGZˇiâ› ÝéµspĎöuŃä—Q"ŕ3Ť‘Ŕc´ť¸¨',ńM®ŻŁiSÜJ‹}v°Ç$qĆÁDďl. 獇vsŽŮĎIŁër\[_¶­§˙i۬°¬O$Ă!ڰ1ůŰ·î‰pŰń‚FŢă6×áő˝­‡’—źé1ŘAQýŐÄB1çí݆ɷµ;Éイ~hó0Ů,Ó¬¸kqigq;Ľ~T2neXňĽNžŁćç*:'ŠćŢ;‹yRXePńÉWR2#‚ď\ţ‘ŕű}\űu¤űm–'†+m„ůhbµŚ ʼn8ŁŻ]ţÜŰ´đΞľÓ4MJÚ×R†Ć˘_´Ű«+2&Íá[ géž´{KÔ"Őô‹-JÝ]a».#Y Ô0Śŕú×=7Ť­Ž»eiióÚMfžkyŁGc=ĽHb“fŮůĚrąäů”Ő§áź éţŇ-ěěí­Rd‚(®.!·Xšĺ‘q˝ńÉ$äňOSÍb§‚.÷é‘K«BÖzTQAiŮ•“ËIíĺců„3bŮW!Te‰Çjé-5› ď°ýš}˙oµ7vß# ń ™nGëĎN _¬+}űj]>ďě÷Z†ď"o/ŮłąÇĘNK4śăýfŢŠ1»@Q@Q@Q@Q@ ›ýDźîźĺY5­7ú‰?Ý?ʲjdR#?ńýgţüźú&Jĺ~$ȤßőÝ?­uGţ?¬˙ß“˙DÉ\ŻÄŹů›ţ»§ő¤ťĄĎúŐ˙®i˙ Š­iÝYX[»H‹-¬Z) 85V>„r*ÍĎúŐ˙®i˙ ŠŹK˙WĄ˙× ýhź˙„Â˙óé©˙ŕŢă˙ŠŁţo ˙Ϧ§˙{Źţ*·«•˛˝ńřÂň ě¬VijĎę22ƦIÁt– r>_şĽúac{áÔPOákhšÖyt‘Ä$2` Üe™ňÄž¤÷' ŕWT-Ć'“žźwŻßçůů&”?´Ľ¤xyô‹ťVÖűQÔ'ľµ·’8Ě–ńNünyM%ą9 7l†uŢ ş¶‹yq®„ţÝ] m´ßµüÓŞD÷1Íö]¤Ź3ĚHŹîů˙Uę §s7}Uť ¶·’ââóĘ‚$.ňHČŞŠIbxsţL‚Đby9é÷zńíţź—xĆ-v=KZźQ[Y"›ĂÚÂÄńŢ9 n<ť€DPnSwĚKc» ‰]ź…őF˝Ôoííőł®éŃEG~LM™XČ$„Ľ!P… c‡™É!”RÔWfđ´žNz}ŢĽ{źć @q‰äç§ÝëÇ·ůţvÎ9ÎxäőéÁç§ůú€ççÓ{ĺ}‹=ö}“o—Î<śq· zŽďąëfĐ ćy8ë÷zóíţmÎg“ŽżwŻ>ßçůqÇű%~ Ů>—%ˇľ7%üQ![äÄrťÓ;Ím‘U*«“ +m µÜ“ŚóŚqÁé×ĎOóô.ĹĚĘćĐ ćy8ë÷zóíţmÎg“ŽżwŻ>ßçůX'çăÓŻžźçčŚóŚqÁé×ĎOóôWaĚĘćĐ ćy8ë÷zóíţmÎg“ŽżwŻ>ßçůX'çăÓŻžźçčŚóŚqÁé×ĎOóô.Ă™•Í Ěňq×îőçŰü˙&Ek”lĘŕîn>^Äű{žÖÉĆyĆ8ŕôëŔç§ůúG°Ŕ;đyľźçôwaĚěFm8žOlíéĎ·ůţA´ây=ł·§>ßçůX'Ż>üž˝y<ő˙?@žĽűňzőäó×üýŘs2ą´ây=ł·§>ßçůĐs‰äöÎŢśűźĺ`žĽűňzőäó×üýzóďÉëדĎ_óô.Ă™•Í çÉíť˝9ö˙?Č6śO'¶vôçŰü˙+őçߓׯ'žżçčן~O^Ľžz˙źˇvĚ®m8žOlíéĎ·ůţLžÔ,‘4‡ Ho#Żß絲zóďÉëדĎ_óôŽç›i»ĺóßÉ÷˙?Gv NäfĐ ćy8ë÷zóíţmÎg“ŽżwŻ>ßçůX'çăÓŻžźçčŚóŚqÁé×ĎOóôWaĚĘćĐ ćy8ë÷zóíţ“¨óܤQ“ňőË{{žÖÉĆyĆ8ŕôëŔç§ůúF8ą“¶Gąn·ůăł»&FmÎg“ŽżwŻ>ßçůĐ ćy8ë÷zóíţ•‚qžqŽ8=:đ9éţ~8Ď8Çťxô˙?EvĚ©=¨X%>t‡ r>^¸>ßçů<ÚśĎ'~ď^}żĎň’çţ=¦í„aÇnŰüý$'çăÓŻžźçčîÙخmÎg“ŽżwŻ>ßçůĐ ćy8ë÷zóíţ•‚qžqŽ8=:đ9éţ~8Ď8Çťxô˙?EvĚ®mÎg“ŽżwŻ>ßçů2;\É(ó\řŰĎ íďţ{Ű'çăÓŻžźçé_ëg2cđx^>źçŘ»°RdbĐby9é÷zńíţ-Ć'“žźwŻßçůŘ8ç9ă“×§žźçęśsśńÉëÓĎOóőWaĚĘâĐby9é÷zńíţ-Ć'“žźwŻßçůŘ8ç9ă“×§žźçęśsśńÉëÓĎOóő.Ă™•Ĺ 8ÄňsÓîőăŰü˙0ZŚO'=>ď^=żĎó°qÎsÇ'ŻN=?ĎÔ8ç9ă“×§žźçę]‡3+‹@q‰äç§ÝëÇ·ůţqĂmş2|çswÔ˙‡ůípăśçŽO^śzź¬Vç÷G§,çŻ_™ąë×üý °ćc  çÉíť˝9ö˙?Č6śO'¶vôçŰü˙.KÇZv—s¨iwşĄö‰m1\D\±óíÜąŚç&DTřä‚ŘS‰îuÍ?*k_`†; Iî4łÖ•ŠG ±@ކ2­µpđŞNŁĽŽÚq<žŮŰÓźoóümGÚPyŇcküąĆ@éŹóúW™MĄxfk{˙íż ­˘µĘ.-–ëM·yĹó#HÜĂ`ŕąy*‚Bú&‰'ť¤é2˙g˙fď˛Fű0m˛÷xŔÁ_»Śť;P». AĆg“ßzqíţ-žO|méÇ·ůţvéĎż§NG=ĎÔ§>üť9ő˙?Uv.fWŚĎ'ľ6ôăŰü˙0Z3<žřŰÓŹoóüěÓź~NśŽz˙ź¨N}ř=:r9ëţ~ĄŘs2¸´fy=ń·§ßçů‚Đq™ä÷ĆŢś{źç`śűđztäs×üý@zsďÁéÓ‘Ď_óő.Ă™•Ĺ ă3É8ö˙?ĚŚĎ'ľ6ôăŰü˙;ôçßÓ§#žżçęÓź~NśŽz˙ź©vĚ®-žO|méÇ·ůţ`´fy=ń·§ßçůا>üť9ő˙?Pśűđztäs×üýK°ćeqh8Ěň{ăoN=żĎó ă3É8ö˙?ÎŔ=9÷ŕôéČçŻůú€ôçßÓ§#žżçę]‡3+‹AĆg“ßzqíţ-žO|méÇ·ůţvéĎż§NG=ĎÔ§>üť9ő˙?Rě9™\Z3<žřŰÓŹoóüÁh8Ěň{ăoN=żĎó°N}ř=:r9ëţ~ =9÷ŕôéČçŻůú—aĚĘâĐq™ä÷ĆŢś{źć AĆg“ßzqíţť€zsďÁéÓ‘Ď_óőéĎż§NG=ĎÔ»fWŚĎ'ľ6ôăŰü˙0Z3<žřŰÓŹoóüěÓź~NśŽz˙ź¨N}ř=:r9ëţ~ĄŘs2¸´fy=ń·§ßçů‚Đq™ä÷ĆŢś{źç`śűđztäs×üý@zsďÁéÓ‘Ď_óő.Ă™•Ĺ ă3É8ö˙?ĚŚĎ'ľ6ôăŰü˙;ôçßÓ§#žżçęÓź~NśŽz˙ź©vĚ®-žO|méÇ·ůţ`´fy=ń·§ßçůا>üť9ő˙?Pśűđztäs×üýK°ćeqh8Ěň{ăoN=żĎó ă3É8ö˙?ÎŔ=9÷ŕôéČçŻůú€ôçßÓ§#žżçę]‡3+‹AĆg“ßzqíţ-žO|méÇ·ůţvéĎż§NG=ĎÔ§>üť9ő˙?Rě9™\Z3<žřŰÓŹoóüÁh8Ěň{ăoN=żĎó°N}ř=:r9ëţ~ =9÷ŕôéČçŻůú—aĚĘâĐq™ä÷ĆŢś{źć AĆg“ßzqíţť€zsďÁéÓ‘Ď_óőéĎż§NG=ĎÔ»fWŚĎ'ľ6ôăŰü˙0Z3<žřŰÓŹoóüěÓź~NśŽz˙ź¨N}ř=:r9ëţ~ĄŘs2¸´fy=ń·§ßçů‚Đq™ä÷ĆŢś{źç`śűđztäs×üý@zsďÁéÓ‘Ď_óő.Ă™”ç¶Űm#yÎHBpvă§ů˙=qkˇą?č’ôű„őöëׯřţ|ő4kM·ą˙Źë?÷ä˙Ń2W+ń#ţE&˙®éýkŞ?ńýgţüźú&Jĺ~$ȤßőÝ?­R-ťĄĎúŐ˙®i˙ Š­i+Aea2A$í¬ "‹ä"5;W$ ž$qVnÖŻýsOýTz_ú˝/ţ¸[˙č @˙ö§Š?čEÔ˙đ*ß˙‹¦ gÄĆw„xVÜŞ¬Iž¸$†ß‚~SGę3ĐŃJč _üÍ;ÂpÚÝŰĘ—}v8ÓÎĆik´{•p'ňő8=0Ő`ho&üŞŔłÖ3*A;víÉnČaĆG#wŕÝfăFřo Ři˙Ú:•Ć©w Ą—ś!óßΕŘo …Â$ŤĎ]¸ęEtWţ6XíäľÓm#˝Óí´Čők©žf‰ľÍ ©‰6ď¶';X űŁ<ťµËs7ÍfŐ`Tf0ß©#ô‰"2 çźşK •Ü93 ´iŢ.䲢±-o R #±Đđ #ŚőąýĆ˙`ţŐ‡NµóšĎJľ˝[ąîZk}€Ä9|b‚ą,'A¦kVZżš-Zu’,†ćÚKyá¶HŞŰNĆ Vä.D.DIçîL~±7=8>ßçęyĂű“¬MĎN·ůúܢŽDËk´ŽđK’e ŠVl9çĺc'8H¦˙jÁ˛vß36,fÎq„~~Pđą$#†SQë¬ÚmÝĽ6–ŃÜ^_H¶öé,¦(÷–B]±Q¶7ĆóŔ$ŚŮ|]|şOöśz4monňEwşó eIšŠÝB3—B7—»|`rĚäCäFĎö„_nű'•x%ňĽÝÂŇ_,.HŔ}»sţÎsŽqŽ“ůĂű“¤MÇ^·ůúgĂâXn|Tš-˝Ľ’Fm畯2~dOÝĎÓFˇ¶˙TßőŃ˙ô#G ů sňLí“sďő˙?@Ě9ů&?öÉą÷ú˙źĄĘ(äBäE30çä˙Ű&çßëţ~sňLí“sďő˙?K”QČ‘ĚĂź’c˙l›źŻůúaĎÉ1˙¶MĎż×üý.QG"DS3~IŹý˛n}ţżçéÄ ŰL6KĘž±°Éăü˙- †ďţ<ç˙®mü¨ä‚)O¨Emťń^DňţęŇWÂŻP6©É9^§°ăµ’émĚW›Ű+i)Aä Ávň¤c+ÓrÖV­âËŤ yĺÔt­¶ ÄŃ.—%!Bí#E€«Ű€ŢaćH.BÇ'Šő+{őŃî4›A­Jń"ŽůšÝ•ŇwĄ1S‹i¸·;9ů‰S‘ ‘Ňj°F‘1†˙L`]–31VË@_•2>ůÂă8 ‰„Łí.BJ>@8Ť˛9n:t˙?N~çĆ·údW˙ŮpVY-çY/‚ĽłÇ$‘´6«´™ä&'Ú­ĺîĘc’Á:Ą˙ŹÉëš6Ł‘‘ůĂű“¤MÇ^·ůúR·Öí®ŻĄ´Ž Ee‹vć“N¸Ž>0®Č‡N‡‘Čă¦ÍG<Ť Ľ˛¤2Nč…–(ʆrÝ=9 z‘G""3üWv×B8®ÓĘ/y¶˛Ć2đîQąz|Ă ö>’.ˇ]5şĹxwsöIB 8 Wi:÷çtíˇĄëÓjŃęÖ·ö‰=Ů#ŘÝ›ŔĆ\˘*•ů“oĘ~lé±Ď{¦s%˝Ű[mí.&™Š¤lĚcX÷mbüŔ2aîËG""-GŞÁ,rĂ~«ąĆe`\0ĄAÇĚą8Âóśm;_6ˇĽ‘ŁEy—ű¦;I\.2«€2Ă®8É褮V›ă;+˝kP˛–_ÜĄÜQYÝEo#A"I2&éŔ1îf”…†r€HÍËźhöFĺnd»…íÜ!G±ś4¤Č±Ź)vfQ˝Đf=Ăç_ď ś\¸—i#Č«Č1¶Ă›ygůIpÁŽ3ÇP@ŹíI•Ú)ČiUq?]Ş={ “V4ÝRÓV·i­BĘH’ÄńI`:8 § B dřXÔ´XľŃa§Z^$—۸žń *Ň´Q!Ťň7>OLĆzQȇȋí¨DľfbĽ;$H›ýS¸¶Ü*7 °Člžˇ›[¶‚Ő. E‘‚uþܨĂ*ˇ`~aň‘žŹ•ކ›âĐÚÖˇĄęŃýšâ ¸­ăh ™ŕŕ…ö´ĺBn2HĘ í'ärĂ7.ŮrLN Qf@w.2d1¸ €kbŽD§çîL~±7=8>ßçëů%űěxŤąůŹëţ~š5 ·ú¦˙®Ź˙ˇ9ů™¨ëvÚnĎ> FO3;~ϧ\OÓ»yhvžF3ŚţMy¨Eek%ı^:&2!´–W98ÎÔRÄôč?.É­ęÚ}ż›ggi*"<łĎ{yöh!E%ś+śóź»Ś+Ă€ŃÝëßfđ徬,§Y.~ΑZÜŹ)ÖIÝN»0Ň(lF#äBäEy|Ke¬7 m«˛O»`]"íźĺ8%”GąLd ööš}VaŽýˇľ0ů{°–S4¸b¸>PRůç‘·Žţ•›Šő+‹öŃíô›C­Dň‰â’ů–ÝU%ec‹x1Ż;ůůAmk-Oű_J±Ő´čsöË´ŰĹpŢ^wŞ2«oP ±ďG*" ŹÄŹĚ-ő@ĄKŕéw!€ĂşS9ýŰqŚň˝w®é[¶ŠčŰ´Žő•"%të†@Î2`…Hŕĺł…îFy©eâř?˛bĽŐ­ä˛v¸ą·”Ă·B`™˘fy„`"|»·8QŚúąâŤ'Kžć+é§·ű4O3É-¤«*ˇ‘‚I·lŚ3mB[ Ü|§""+ŹŮy"_łjá|ż7Ůy~Ξ^wgřzăćĆ9/OZ<÷‹}P5˛łą:]Č\)ěbr{$žqžňÇâťUÝćĺýÁ "|0žV†SŹ™]Ԁà Ś6vMsă%n®Łó÷¬P,1K$Ď'›K´…ž;śUů-äb 3€sÉčIŕt(Ł‘"2_U‚'•Zü¬í¶ĆfP¤í!Nă‡$ťŔd« zj=Ń·^\ä›IB $†+´źśwç ×kVťr äFLZ¬Ŕ&XoŐw˘á¬fVÂv•ĎńŚśa~lăkTž ´ĽFh­őDč§ÍŇîb ±yęFBŽN'vŠ9r#&]V—†˙÷nTův3?!7’0§I‡ý˛n=ţżçërŠ9r"qňL?í“qďő˙?PL8ů&öɸ÷ú˙ź­Ę(äAČŠbaÇÉ0˙¶MÇż×üýA0ăäŰ&ăßëţ~·(Ł‘")‰‡$ĂţŮ7˙_óőĂŹ’a˙l›ŹŻůúܢŽDθ”YFÉ~áë8ëţýx5ÔÝ˙Çś˙őÍż•rÔš±qŠDgţ?¬˙ß“˙DÉ\ŻÄŹů›ţ»§ő®¨˙Çőźűňč™+•ř‘˙"“×tţ´ŃLí.ÖŻýsOýTz_ú˝/ţ¸[˙č R\˙­_úćźúŞÖ-Ő•…»´˛ÚŔ…˘Ł€cQ•`ASčG"€E`˙ áůôÔ˙đoq˙ĹQ˙7…˙çÓS˙Á˝Ç˙K@"đ'†`׼7¦]]Ý]¬7š‘Hmîe€™^ŕ&řÝNUD‹Žx•şwÚŹáóÚé—e¦­¶ĆîѴ딞•ÖÓĚ™ŁŽ'2|ډ; fŢ>T;F1|<™áQd†ŇÜ^]*DČ@¸ÉgË3dśő'Ňşź:ăţ~ţů_đ«$Ă×>čú­ĺŐĺµ­ŤŤŐÎź{i$ŃŮ&ö’ŕ(ó‹ ĘŹSć7#';N“yk¨ÝęZ•ěW×1EnMµ±‚5Ž3#/ĘÎçve|ťŘĆŢ +=ë[[Éqq{ĺC—’I6*˘’I#Ţźç\ĎĂ˙ß+ţŔÔ˘˛üëŹůřűĺÂŹ:ăţ~ţů_đ uŤ*mJîŢkKíď,d[‹w–#,{ŠK”°Ű#ă 9ÁäL~Ö,î­§˛Ö¬O“ćËĺÝéĎ*%ÄŇÉ$˛ĆdŰź0¨ ¸Ş‚|Ď»dK?žçĎlí^pľ§Úźç\ĎĂ˙ß+ţ€¦ľŃâńmżm´ű.ŁŠád1Ú"Ľ˛JČ|ÂăťŔ+ŚňOÜŽsĐV_ťq˙?˙|ŻřQç\ĎĂ˙ß+ţŔÔ˘˛üëŹůřűĺÂŹ:ăţ~ţů_đ  J+/θ˙ź‡˙ľWü(ó®?çá˙ď•˙ Ô¨mżŐ7ýtýŐ:ăţ~ţů_đ¦E,á'aó7eő>Ԁע˛üëŹůřűĺÂŹ:ăţ~ţů_𦥗ç\ĎĂ˙ß+ţy×óđ˙÷Ę˙…jQY~uÇüü?ýňżáGťq˙?˙|ŻřPĄCw˙s˙×6ţUGθ˙ź‡˙ľWü)“K9‚@gb śŚ/<})•'…5+·Ö`żŐ­&±Ő’hg)bËt!euŽ5”ĘPÇîđNâFçf$žÔ®/×X¸Ő­µÄ`–;[uTIĐĘYŽ.fäHĽěăĺ!¶<ëŹůřűĺÂŹ:ăţ~ţů_đ¦<Ţľ“D›GMf1g|“® Źg¸±ťÝĺhpb$Ęŕoó@8$1~™ăň_úćźÍŞŹťq˙?˙|ŻřSłůî|öÎŐç ę}©ŻQĎMo,I4;ˇU–0Ą‘÷†ŕFG^A Öťq˙?˙|ŻřQç\ĎĂ˙ß+ţŔ«i¤ŢZÉ©jZ•ěW×6ÉnMµ±‚5Ž?1—ĺgs»2ľNěcośŘĽ7Ş{Q×-.`±Ľ–îQ ÝAö„04VѱeI ZŐYNfig0H ěAS‘…珥?θ˙ź‡˙ľWü)ŹcŕxtíM.ŢúCŰlnŁi#•mVŮB am÷°1ż§ĺŰü4ňuH.ţÝb<Ź,y±iŰ.nv\Á>ű‰|ĂćČ~Ď‚ŰW™±ÚşďZW•#˝Ţđ¶ÉvŤ€Ř|2űçóčÓÎůWhÂĆ‹ž3]gťq˙?˙|ŻřS'˝kky../|¨bRňI&ĹTP2I$`;Ó¶Żá;[Ööů|ČZŃí§,<Ü«˘6ŕĂR{•Ŕëçdň‹Śwř~â˛öĆk©"€K5Ý‹Iűő{‰$¸Źd¨b‘žĺał/Q·¤ó®?çá˙ď•˙ <ëŹůřűĺ€9ůţ­Ü˛Ç>§ ´’ČŮÍ$Éwv Në™w”ś€Y—t`«cS¸řd—:\ö˘}*ĆIĽŔÇLŇÚ2Úx*ł0űAl—Ć–cÔÉzŃ–Źt^ŁŤ|©YŤ‰NݬAg! ŻQç\ĎĂ˙ß+ţÁzÍpöë{™‘UÚ1łr«‘Ś€J¶}§Ň€1­| ökKoíßg´Ň­·yÝö)Ś»±»ŤůĆ?‡ŻÍŇ©éż -´Č˘† 4ŘRÝí„2Űiiň$3Ĺ/ďäÜLŽ|•—`Ë3?(^–KÖ‰âI/v<Ͳ5m€»`¶ś+z{Q5ë[ yŻ|´,¨öYUޤîH>ť¦}‚űVąóĽĎí µąŰ·^!Š-ąĎ?ęłž>ö;dčV_ťq˙?˙|ŻřQç\ĎĂ˙ß+ţ©Eeů×óđ˙÷Ę˙…AgŞ&Łh—v:”wVŇgdĐ2:6 A…mŃY~uÇüü?ýňżáGťq˙?˙|ŻřPĄ—ç\ĎĂ˙ß+ţy×óđ˙÷Ę˙…jQY~uÇüü?ýňżáGťq˙?˙|ŻřPĄ—ç\ĎĂ˙ß+ţy×óđ˙÷Ę˙…jQY~uÇüü?ýňżáGťq˙?˙|ŻřPĄ—ç\ĎĂ˙ß+ţy×óđ˙÷Ę˙…jQY~uÇüü?ýňżáGťq˙?˙|ŻřPĄ—ç\ĎĂ˙ß+ţy×óđ˙÷Ę˙…jQY~uÇüü?ýňżáGťq˙?˙|ŻřPĄ—ç\ĎĂ˙ß+ţy×óđ˙÷Ę˙…^»˙Ź9˙ë›*ĺ«big0H ěAS‘…珥cÔH¤FăúĎýů?ôL•ĘüH˙‘IżëşZęŹüY˙ż'ţ‰’ą_‰ň)7ýwOëBv—?ëWţą§ţ‚*=/ý^—˙\-˙ô©.ÖŻýsOýU[Y͵…Śâ&1ZŔâ(ńąńś Ä žś=ĹIEsŰú˙ý ·ßřm˙Ç(ţß×˙čMľ˙ŔŰoţ9JŔsúp—„4źľ•u©ÚŢ_ę¶¶ď‚)ߍĚé‚%’Á…=¸.şÔ§Ł]Ükj‹­¦¶úpą‰´â{ć6Ř8ó<Ä‹ý_?ęş|µŘř ôŻ Ĺm¨BÖ×&ââSĹCĚîą*Hčᮓípô5wB<ÇĹđëqęZÄ·éjńKáý\DŃÝą ň¶b#ţćď–,Çp ‰]‡†u#yľłýµ§Ĺ/ţboޱ<[˘UCµV6Ć73“‚¸Ţű\ßý kű˙ˇ˘čDÔT?kű˙ˇŁípô4]Îřżěžf•ý§ä˙d}°}żí8ň<ż"}ľnď—o›ĺcw¶wĹrfăĂ’Ú[éú…ŢźipZâK[ŰÉŐ>Çfnf=¦ó€ĺěhřUDbHXŃ˝,\Ăćło਽?ípô4] ŕôk=3Mń§—Ńoď§ż»yviţUýs,ždŽX±ND`íPÂD ŕ€Ţ…Pý®ďţ†ŹµÁý˙ĐŃt"j*µÁý˙ĐŃö¸?żú.€šŠ‡ípô4}®ďţ†‹ &¦E÷űÍüÍ3ípô4ČîaU żńĐúŃtš*µÁý˙ĐŃö¸?żú.€šŠ‡ípô4}®ďţ†‹ &˘ˇű\ßý kű˙ˇ˘č ©“¨“ýÓü©źkű˙ˇ¦Is Dę’¤ C<óW¸Ńď®u×Đ®ímő»x/cOłÎ?´onrĎ™ĺˇű«Ý‘ …HÔĽs˙Â=ý¸źaţĚ˙„?Ͷűo‘ĺýĚňŻ7yýŢíßeÎyĎ“ßmzWÚŕţ˙čhű\ßý B<ĆüiGÂĄťíF˘­vÚRL„É$yĽ”°bB¤…|­Źb•ň°ňëÔGúö˙t3Lű\ßý 0\Ăćło਽C,ÔżkűĎŘ<ź¶yMäyůňüĚ»±ÎÜă8çżkű˙ˇŁípô4]äüˇo/Š!Ô<ĹżRŇ ¶ťťÍ¬%˛LhĆŇ0Š…UQśůuI¬üEŞŮŢkßŮ:yż•›Q)ooöŤ%Ý ¬’ă ą› sÜÉs Dę’¤ Ej¶6~w6´ň´Ň±ÜĚî{’y< PC8MűWD˝×g¸šÚćmONŠëM0˘Ăľh,ŇL†_1Y|ĂĽ`¨Č×÷˙CEĐŚĎÜÝ<şµŤŐÓÝ>đ[¤ňެ’)†)rŰ®A”ŽpS’s|Y%î›5¶µ¦Â“]ĹćŮ*J~BgEňň2Lńۦs€‰Ŕů—Ąű\ßý 1na äżVČŕú .†yâťWKÓîM˛$oáčH·•Ü‘É:o’FĂVŮ-eß´Ş—rTŕ˘Ďiâç·µMSÄö¶zs´űu‹i˘u‘”C˛34¬.NůţâőXÎRL÷˙kű˙ˇŁípô4]ó_ ę:¤>±Ľ]Nc¤şU„v&8Ľ“ĐZ$ěó7;°ůń8# šo‰üE>ťw=Ƶ˘Á)µY.âđěůL‘‚ŚD[¶E )•·Şý௟Jű\ßý kű˙ˇ˘č.ńľ÷žÔŁ»×otűi4yd´7żeI5)ά™ QÔ*E·ÉÁ+*śťĘkVëÄ:ĄĎڞěµhm~Ů,öim4±I=«$2ś[ůA‚–Ś0-#W(Ü6÷źkű˙ˇŁípô4]‘áÍJ˙XűMýÔ_eĺ·KMĘű%Ź"sĽN$-:~çpáëj/¸ŢoćjĄ’ŘéÖÖ6˶¶‰a‰>cµO'€:Ô±ÜÂŞAâ'ˇő˘čsĹ?Ů?ŰÚWü$?bţĆű-Îďí źgűFč<Ľďůwíó¶÷Ćüqš‚^Â×Ŕ°x•ćyŕÓ,¤ż†ŕ˛»4ź"¬ŚÄžDe`ä»đ¤×[ö¸?żú>×÷˙CEĐc>™áÉ­ěo޵áTµFąQ ŲÝiÖîâbďEG0Ü\Ľ®Bôş¬žg‚t›“aýť>źq-©]˘Î5¸Ü7jĆ ä IĆ+©ű\ßý 0ÜĂć«oŕ)µ@yţ­â WńZßXxŽ=*ëě–sęvňÂń‚©}!Ź{†@Ůň˛:á×ű¨ř‹_ą»đ¦ŻĄ®ý‚ěËŹ±?îSűW縌ręCć8ŕoÝm˙]‘Ă&=&áln¦µšaşKYLĐźmrŚ„ń×ĺvúý*ÇÚŕţ˙čhşĚ|Wâ JîďVŇmnT˝‚öČiO:5ʶ‡X ŕ;F ±‘Ă,€í†ŰzżµH.mŁŇ|Geqj-D¶×wW1í Ś’Ś,p?ť·b.Čv?ÎI`Gˇý®ďţ†ŹµÁý˙ĐŃtý¤oĽc˘ĄÖłţť±t‡GĚCɉ!şXĺŰ·Íů#e©ó2 ăzîóWŹÄ«¤Ĺ'îîĺŽîŚ'îmăOßâů„k¸ś˙ĄdŞ5˝ö¸?żú®‹b—ó_(ĹĚŃ$2?ÍĘ!rŁ82?çě(şŃüU®Écysk#µžůŕ·¸W“Mť™yź¸Ý{–™XÉů¶>gđÇ5ťk]·Óεk-´ režŐŁąűJĆ,Ý@”".s;©!Ë‘ŤŔ8ďţ×÷˙CGÚŕţ˙čhşŽÖ®ď›Ç°i¶—Ďb—Kj’Mo F]ľ]űăsŁq“‚9Ć7šŤÝîˇŕtfť ÜzÜ6©<‘ä1‹RX•ÝT¨$„‚퓍Łě~×÷˙CGÚŕţ˙čhşÎu«ďi"ľ2jZzË41Í|©ö8­áÍëZO9T—U]̤á@†ŞźŰ—‘kV“_ëđéËw¬7Ś Ći2óFîňăůÂlĺVę?kű˙ˇŞ÷ cu5¬Ó ŇZĘf„üĂk”d'Žż+°ç×éEĐzk¬ćËRÔYîít›=GPg‰Wsäň­ćă2Aç•菖 aFŢmšďFÓd°Őmn´Wľk FâîImŮMâŢB.ç;…Ě„€@Q´üŁśú˘-Š_Í|Ł3DČ˙7(…ĘŚtŕČ˙ź°«kű˙ˇ˘č |E3Ě ¸ń?Ů´Q,Â{6ëö’©Tó '-%ŔůTÜz«ä·ń…úŘ$z­Ô6ÍŐţš!±‘V9 R‹_8$móÜ× žH!†rĽwźkű˙ˇŁípô4]ŔYŔÝBÜęw5ľ‰$3Ç!Źu¤‹m†€„PT©ěŮažMi^\ëú}ţŻ ®Ł6ˇý›ŁĄÜPKmIupćä*±ŤWĺůmP *¸#ćÖý®ďţ†ŹµÁý˙ĐŃtš˝őćŻg¦iž(š÷Ožę4:¤ m#î0];ÂcňřňalmÜ7ňpĂŢ ÖoőL}¶;íe–¦2ŠľSOćîŤvň/–6îËrrÍĆ:oµÁý˙ĐŃö¸?żú.€óqáËűK‹ÝďOŽÝšÜ\[A:´·6żi„ÍqyÉb6nϙʣČ\ćFT’řGż·íßŮźđ‡ů·?bóüż°yžUžß/?»Ý»íXÇ9ó»îŻJű\ßý kű˙ˇ˘č9Ň.4{«ť ×Q»µµń ĽFňćúp·ćo.6ń;ŔlŤřůNöP ;”Ő×.n´ßj·Ö·N·ŘllJ©]BhţÔĹ#{”Ü„Řg‚+±ű\ßý kű˙ˇ˘č  ęFňţţ }gűkOŠ(^;üÄß˝c x·Dއj¬mŚng'qÇ‹Ź_Ú\^č·z|věÖââÚ ŐĄąµűL&k‹ÎKłv|ÎUBç22§§}®ďţ†ŹµÁý˙ĐŃtšÁ˙÷öăý»ű3ţ˙6çě^—ö3ĘłŰĺç÷{·}«ç>w}Ő$×ěţ{‡OřI•lÔW(ßÚ/‘cąÜ±ć«+8­˝«Ńľ×÷˙CGÚŕţ˙čhşj*µÁý˙ĐŃö¸?żú.€šŠ‡ípô4}®ďţ†‹ &˘ˇű\ßý kű˙ˇ˘č ¨¨~×÷˙CGÚŕţ˙čhşj*µÁý˙ĐŃö¸?żú.€|ßę$˙t˙*É­ .ahťCňTÁ¬ú™ĎüY˙ż'ţ‰’ą_‰ň)7ýwOë]Q˙Źë?÷ä˙Ń2W+ń#ţE&˙®éýh@ÎŇçýj˙×4˙ĐEU¶˙}—ýzC˙˘Ö­\˙­_úćźú޶ßň˛˙ŻHôZŇJ(˘…Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@źřţł˙~Oý%rż?äRoúîźÖşŁ˙ÖďÉ˙˘d®WâGüŠM˙]ÓúÓBgisţµëšč"ŞŰČ>Ëţ˝!˙ŃkV®ÖŻýsOýU[oůŮפ?ú-i%Q@Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ĎüY˙ż'ţ‰’ą_‰ň)7ýwOë]Q˙Źë?÷ä˙Ń2W+ń#ţE&˙®éýiˇ3´ą˙ZżőÍ?ôTˇqÚŰÄl_tpGÄđc*€ůiíWnÖŻýsOýUâ[X&{Č•Ą‰$*- r†Ć|Áž´&nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřříş˙ź?ďüürŚÝĎŚź÷ţţ9G“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´fëţ|d˙żđńĘ3u˙>2ßř?řĺLßóýţźţ;G“7ü˙G˙€g˙ŽĐ›Żůń“ţ˙Á˙Ç(Í×üřÉ˙ŕ˙ă”y3ĎôřříLßóýţźţ;@nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřříş˙ź?ďüürŚÝĎŚź÷ţţ9G“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´fëţ|d˙żđńĘ3u˙>2ßř?řĺLßóýţźţ;G“7ü˙G˙€g˙ŽĐ›Żůń“ţ˙Á˙Ç(Í×üřÉ˙ŕ˙ă”y3ĎôřříLßóýţźţ;@nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřříş˙ź?ďüürŚÝĎŚź÷ţţ9G“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´fëţ|d˙żđńĘ3u˙>2ßř?řĺLßóýţźţ;G“7ü˙G˙€g˙ŽĐ›Żůń“ţ˙Á˙Ç(Í×üřÉ˙ŕ˙ă”y3ĎôřříLßóýţźţ;@nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřříş˙ź?ďüürŚÝĎŚź÷ţţ9G“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´fëţ|d˙żđńĘ3u˙>2ßř?řĺLßóýţźţ;G“7ü˙G˙€g˙ŽĐ›Żůń“ţ˙Á˙Ç(Í×üřÉ˙ŕ˙ă”y3ĎôřříLßóýţźţ;@nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřříş˙ź?ďüürŚÝĎŚź÷ţţ9G“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´fëţ|d˙żđńĘ3u˙>2ßř?řĺLßóýţźţ;G“7ü˙G˙€g˙ŽĐ›Żůń“ţ˙Á˙Ç(Í×üřÉ˙ŕ˙ă”y3ĎôřříLßóýţźţ;@nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřříş˙ź?ďüürŚÝĎŚź÷ţţ9G“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´fëţ|d˙żđńĘ3u˙>2ßř?řĺLßóýţźţ;G“7ü˙G˙€g˙ŽĐ›Żůń“ţ˙Á˙Ç(Í×üřÉ˙ŕ˙ă”y3ĎôřříLßóýţźţ;@nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřříş˙ź?ďüürŚÝĎŚź÷ţţ9G“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´fëţ|d˙żđńĘ3u˙>2ßř?řĺLßóýţźţ;G“7ü˙G˙€g˙ŽĐ›Żůń“ţ˙Á˙Ç(Í×üřÉ˙ŕ˙ă”y3ĎôřříLßóýţźţ;@nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřříş˙ź?ďüürŚÝĎŚź÷ţţ9G“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´fëţ|d˙żđńĘ3u˙>2ßř?řĺLßóýţźţ;G“7ü˙G˙€g˙ŽĐ›Żůń“ţ˙Á˙Ç(Í×üřÉ˙ŕ˙ă”y3ĎôřříLßóýţźţ;@nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřříş˙ź?ďüürŚÝĎŚź÷ţţ9G“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´fëţ|d˙żđńĘ3u˙>2ßř?řĺLßóýţźţ;G“7ü˙G˙€g˙ŽĐ›Żůń“ţ˙Á˙Ç(Í×üřÉ˙ŕ˙ă”y3ĎôřříLßóýţźţ;@nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřříş˙ź?ďüürŚÝĎŚź÷ţţ9G“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´fëţ|d˙żđńĘ3u˙>2ßř?řĺLßóýţźţ;G“7ü˙G˙€g˙ŽĐ›Żůń“ţ˙Á˙Ç(Í×üřÉ˙ŕ˙ă”y3ĎôřříLßóýţźţ;@nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřříş˙ź?ďüürŚÝĎŚź÷ţţ9G“7ü˙G˙€g˙ŽŃäÍ˙?Ń˙ŕ˙ă´fëţ|d˙żđńĘ3u˙>2ßř?řĺLßóýţźţ;G“7ü˙G˙€g˙ŽĐ›Żůń“ţ˙Á˙Ç(Í×üřÉ˙ŕ˙ă”y3ĎôřříLßóýţźţ;@nżçĆOű˙˙Ł7_óă'ý˙˙ŽQäÍ˙?Ń˙ŕ˙ă´y3Ďôřří—wnďlbHĚŚĚÓDzÄę8W'«ŐĘüH˙‘IżëşZęTJ—P#\¤«!p@·(F#v;ŰşŽÝë–ř‘˙"“×tţ´Ú\˙­_úćźú¨ôĚ}–Č,c8##"R\˙­_úćźú¨ôĎřôł˙Ż˙Ń"€$űLźÝ‹ţý/řQö™?»ýú_đ¨h¤2o´ÉýŘżďŇ˙…i“ű±ߥ˙ ŕĽf/u=Q4ű 2ćök C} Fń"ĂvĚVÚC˝×!Lsdr9´ž*}GR{‹MaüÉněĹ®ŽâÍo,P3ąPľa*$‘˛g9Šz ·â3ŰĆĄ••“âµcIöO;w™›ägĚň|ĹóvăćÝĺďĆß›?wśW#Ş\čVqY]x:"{¸neŧ*6÷WF5a'$^¸ GűLźÝ‹ţý/řQö™?»ýú_đŻ;şńđÁr,üMmu§#@NŁ-Ų9f—†'Ůä™HV˛Ă*T‡^Öeń¬?lKxË[,vwαÜÜDńĆÎíÂYWDSČ ‰ö™?»ýú_đŁí2v/űôżáPŃ@ĚM{Pş_xfŮ%ňážîo5cP»Ŕ·€p9ç2ě+ną˝ţFż ˙×ÝÇţ“I]% AEP0˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(3˙ÖďÉ˙˘d®WâGüŠM˙]Óú×TăúĎýů?ôL•ĘüH˙‘IżëşZhLí.ÖŻýsOýU»–ËF·ž9o%[‚A"ł“\€:ääô©âŻ\˙­_úćźúŞ‹kF‘­ŐđTEEâŕ€?Őú Ŕţß×˙čMľ˙ŔŰoţ9Göţż˙Bm÷ţŰńĘč>Îźó÷}˙}Ĺ˙Ćčű:ĎÝ÷ý÷˙ >ţ]WQťfźÂZę0] [ë‹ă$ýŘçžză?•?MşŐ4ćKOjźľ“Í•¦Ő!™Ý¶ŞäłĘOEQ×µużgOůűľ˙ľâ˙ăt}ť?çîűţű‹˙ŤĐ3gŞk6övľ ľŽŢŢ5Š$űuąÚŞ0L™<ôZęšĹ”-ż‚o‘I%#íÖçćw.Ç™;łř×Möt˙ź»ďűî/ţ7GŮÓţ~ďżď¸żřÝs˙Űú˙ý ·ßřm˙Ç(ţß×˙čMľ˙ŔŰoţ9]ŮÓţ~ďżď¸żřÝgOůűľ˙ľâ˙ătÎřzN_kĄţ—.ž—0[GK,nIO7wÜcýĺ뎵ÓTgOůűľ˙ľâ˙ăt}ť?çîűţű‹˙ŤŇçÄZä—S<~Ô 3±R×vŔăÎźó÷}˙}Ĺ˙Ćčű:ĎÝ÷ý÷˙¦3wŞëw¶Żo/őEGĆL:ś1?<2Jtěj­„ş®ť;M„µ×b»H¸×uĆAű˛N@Îźó÷}˙}Ĺ˙Ćčű:ĎÝ÷ý÷˙ ű_˙ˇ6ű˙mżřĺŰú˙ý ·ßřm˙Ç+ ű:ĎÝ÷ý÷˙Łěé˙?wß÷Ü_ün€9˙íýţ„Űďü ¶˙ă”oë˙ô&ßŕm·˙®ěé˙?wß÷Ü_ünŹł§üýßßqńşĺµ­_ÄşĹLJ®l-ě§–I%–âh]äőaŰ˝uőŮÓţ~ďżď¸żřÝgOůűľ˙ľâ˙ăt€’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńş’ŠŹěé˙?wß÷Ü_ünŹł§üýßßqńşüY˙ż'ţ‰’ą_‰ň)7ýwOë]\pD“$¦ką=ŰDŹÜ•+“„ŁőĘ|H˙‘IżëşZhłW‘á´žXÎ-)ÇB#Ş˙e›ţ‚?÷ĚüEM®Č>ëţ˝?öťpľ'Óĺ˝ń6¦Đé–×2&—jěäÜYn–ŕyШBY—ďŕ2±ŘÉ"€;O˛Í˙A źűć?ţ"ʞÍ˙A źűć?ţ"ą)µýNo¬VşŤŠŮ™ŕ[{s8-w˘3J‘™ä3€ë" Ů–V'=<]©>ˇqwđ'ŹÎtiă’}5<řQĽÄ(‰’9\‘!' ŰŇFeyR=Rgh›dŠľQ(Ř ňđpŔýő§ý–oú\˙ß1˙ńÄiş­ĹęÚŽź}ýąhÚ‰€·™óĺ{kq ŢŠý`` ~÷s}Ă]ĄŚű6i·iÔ-í˘{‰<˝›÷nPř Ć7ŕ1ô ý–oú\˙ß1˙ń}–oú\˙ß1˙ńjŠUű,ßôą˙ľc˙â(ű,ßôą˙ľc˙â*ŐWěłĐBçţůŹ˙ŁěłĐBçţůŹ˙«TP_˛Í˙A źűć?ţ"ʞÍ˙A źűć?ţ"­Q@~Ë7ý.ď˙řŠ>Ë7ý.ď˙řеEUű,ßôą˙ľc˙â(ű,ßôą˙ľc˙â*ŐWěłĐBçţůŹ˙ŁěłĐBçţůŹ˙«TP_˛Í˙A źűć?ţ"ʞÍ˙A źűć?ţ"­Q@~Ë7ý.ď˙řŠ>Ë7ý.ď˙řеEUű,ßôą˙ľc˙â(ű,ßôą˙ľc˙â*ŐWěłĐBçţůŹ˙ŁěłĐBçţůŹ˙«TP_˛Í˙A źűć?ţ"ʞÍ˙A źűć?ţ"­Q@~Ë7ý.ď˙řŠ>Ë7ý.ď˙řеEUű,ßôą˙ľc˙â(ű,ßôą˙ľc˙â*ŐWěłĐBçţůŹ˙ŁěłĐBçţůŹ˙«TP_˛Í˙A źűć?ţ"ʞÍ˙A źűć?ţ"­Q@~Ë7ý.ď˙řŠ>Ë7ý.ď˙řеEUű,ßôą˙ľc˙â(ű,ßôą˙ľc˙â*ŐWěłĐBçţůŹ˙ŁěłĐBçţůŹ˙«TP_˛Í˙A źűć?ţ"ʞÍ˙A źűć?ţ"­Q@~Ë7ý.ď˙řŠ>Ë7ý.ď˙řеEUű,ßôą˙ľc˙â(ű,ßôą˙ľc˙â*ŐWěłĐBçţůŹ˙ŁěłĐBçţůŹ˙«TP_˛Í˙A źűć?ţ"ʞÍ˙A źűć?ţ"­Q@~Ë7ý.ď˙řŠ>Ë7ý.ď˙řеEUű,ßôą˙ľc˙â(ű,ßôą˙ľc˙â*ŐWěłĐBçţůŹ˙ŁěłĐBçţůŹ˙«TP_˛Í˙A źűć?ţ"ʞÍ˙A źűć?ţ"­Q@~Ë7ý.ď˙řŠ>Ë7ý.ď˙řеEUű,ßôą˙ľc˙â(ű,ßôą˙ľc˙â*ŐWěłĐBçţůŹ˙ŁěłĐBçţůŹ˙«TP_˛Í˙A źűć?ţ"ʞÍ˙A źűć?ţ"­Q@~Ë7ý.ď˙řŠ>Ë7ý.ď˙řеEUű,ßôą˙ľc˙â(ű,ßôą˙ľc˙â*ŐWěłĐBçţůŹ˙ŁěłĐBçţůŹ˙«TP_˛Í˙A źűć?ţ"ʞÍ˙A źűć?ţ"­Q@~Ë7ý.ď˙řŠ>Ë7ý.ď˙řеEUű,ßôą˙ľc˙â(ű,ßôą˙ľc˙â*ŐWěłĐBçţůŹ˙ŁěłĐBçţůŹ˙«TP_˛Í˙A źűć?ţ"ʞÍ˙A źűć?ţ"­Q@~Ë7ý.ď˙řŠ>Ë7ý.ď˙řеEUű,ßôą˙ľc˙â(ű,ßôą˙ľc˙â*ŐWěłĐBçţůŹ˙ŁěłĐBçţůŹ˙«Tŕ#I#âA—sĐ W†ŮŁq<÷ó›xi7Ŕ rFBޏ?ýnµËüH˙‘IżëşZęd‘]c¸¸Ť…¸oôk_╿ĽÝ=3ŰÉĆ>N[âGüŠM˙]ÓúÓ[Řj0‹Ţb‚H śeÎ;Ô›mżç¬ż÷čńUŕŻăHĺŰV¸Éô ˵7ţďĐZçţú§Ę+žů¶ŰţzË˙~‡˙FŰoůë/ýúüUxü%Ţ ˙ µĎýőGü%Ţ ˙ µĎýőG(\÷Yě´ű™­Ą•Ąg¶Ë ŮŤ¬Q“?{ź•ŘsëSí¶˙ž˛˙ߡ˙ĹW˙Â]âú \˙ßTÂ]âú \˙ßTr…Ď|Űm˙=e˙żC˙ŠŁm·üő—ţýţ*ĽţďĐZçţúŁţďĐZçţúŁ”.{ćŰoůë/ýúüUmżç¬ż÷čńUŕđ—xţ‚×?÷Őđ—xţ‚×?÷Őˇsß6ŰĎYďĐ˙â¨Űm˙=e˙żC˙ŠŻ˙„»Äôą˙ľ¨˙„»Äôą˙ľ¨ĺ žů¶ŰţzË˙~‡˙FŰoůë/ýúüUxü%Ţ ˙ µĎýőGü%Ţ ˙ µĎýőG(\÷ͶßóÖ_űô?řŞ6ŰĎYďĐ˙â«Ŕ˙á.ńý®ďŞ?á.ńý®ďŞ9Bçľm¶˙ž˛˙ߡ˙ĹQ¶ŰţzË˙~‡˙^˙ w?č-s˙}Q˙ w?č-s˙}QĘ=óm·üő—ţýţ*Ť¶ßóÖ_űô?řŞđ?řKĽA˙AkźűęŹřKĽA˙AkźűęŽPąď›mżç¬ż÷čńTm¶˙ž˛˙ߡ˙ĹW˙Â]âú \˙ßTÂ]âú \˙ßTr…Ď|Űm˙=e˙żC˙ŠŁm·üő—ţýţ*ĽţďĐZçţúŁţďĐZçţúŁ”.{ćŰoůë/ýúüUmżç¬ż÷čńUŕđ—xţ‚×?÷Őđ—xţ‚×?÷Őˇsß6ŰĎYďĐ˙â¨Űm˙=e˙żC˙ŠŻ˙„»Äôą˙ľ¨˙„»Äôą˙ľ¨ĺ žů¶ŰţzË˙~‡˙FŰoůë/ýúüUxü%Ţ ˙ µĎýőGü%Ţ ˙ µĎýőG(\÷ͶßóÖ_űô?řŞ6ŰĎYďĐ˙â«Ŕ˙á.ńý®ďŞ?á.ńý®ďŞ9Bçľm¶˙ž˛˙ߡ˙ĹQ¶ŰţzË˙~‡˙^˙ w?č-s˙}Q˙ w?č-s˙}QĘ=óm·üő—ţýţ*Ť¶ßóÖ_űô?řŞđ?řKĽA˙AkźűęŹřKĽA˙AkźűęŽPąď›mżç¬ż÷čńTm¶˙ž˛˙ߡ˙ĹW˙Â]âú \˙ßTÂ]âú \˙ßTr…Ď|Űm˙=e˙żC˙ŠŁm·üő—ţýţ*ĽţďĐZçţúŁţďĐZçţúŁ”.{ćŰoůë/ýúüUmżç¬ż÷čńUŕđ—xţ‚×?÷Őđ—xţ‚×?÷Őˇsß6ŰĎYďĐ˙â¨Űm˙=e˙żC˙ŠŻ˙„»Äôą˙ľ¨˙„»Äôą˙ľ¨ĺ žů¶ŰţzË˙~‡˙FŰoůë/ýúüUxü%Ţ ˙ µĎýőGü%Ţ ˙ µĎýőG(\÷ͶßóÖ_űô?řŞ6ŰĎYďĐ˙â«Ŕ˙á.ńý®ďŞ?á.ńý®ďŞ9Bçľm¶˙ž˛˙ߡ˙ĹQ¶ŰţzË˙~‡˙^˙ w?č-s˙}Q˙ w?č-s˙}QĘ=óm·üő—ţýţ*Ť¶ßóÖ_űô?řŞđ?řKĽA˙AkźűęŹřKĽA˙AkźűęŽPąď›mżç¬ż÷čńTm¶˙ž˛˙ߡ˙ĹW˙Â]âú \˙ßTÂ]âú \˙ßTr…Ď|Űm˙=e˙żC˙ŠŁm·üő—ţýţ*ĽţďĐZçţúŁţďĐZçţúŁ”.{ćŰoůë/ýúüUmżç¬ż÷čńUŕđ—xţ‚×?÷Őđ—xţ‚×?÷Őˇsß6ŰĎYďĐ˙â¨Űm˙=e˙żC˙ŠŻ˙„»Äôą˙ľ¨˙„»Äôą˙ľ¨ĺ žů¶ŰţzË˙~‡˙FŰoůë/ýúüUxü%Ţ ˙ µĎýőGü%Ţ ˙ µĎýőG(\÷ͶßóÖ_űô?řŞ6ŰĎYďĐ˙â«Ŕ˙á.ńý®ďŞ?á.ńý®ďŞ9Bçľm¶˙ž˛˙ߡ˙ĹQ¶ŰţzË˙~‡˙^˙ w?č-s˙}Q˙ w?č-s˙}QĘ=óm·üő—ţýţ*Ť¶ßóÖ_űô?řŞđ?řKĽA˙AkźűęŹřKĽA˙AkźűęŽPąď›mżç¬ż÷čńTm¶˙ž˛˙ߡ˙ĹW˙Â]âú \˙ßTÂ]âú \˙ßTr…Ď|Űm˙=e˙żC˙ŠŁm·üő—ţýţ*ĽţďĐZçţúŁţďĐZçţúŁ”.{ćŰoůë/ýúüUmżç¬ż÷čńUŕđ—xţ‚×?÷Őđ—xţ‚×?÷Őˇsß6ŰĎYďĐ˙â¨Űm˙=e˙żC˙ŠŻ˙„»Äôą˙ľ¨˙„»Äôą˙ľ¨ĺ žů¶ŰţzË˙~‡˙FŰoůë/ýúüUxü%Ţ ˙ µĎýőGü%Ţ ˙ µĎýőG(\÷ͶßóÖ_űô?řŞ6ŰĎYďĐ˙â«Ŕ˙á.ńý®ďŞ?á.ńý®ďŞ9Bçľm¶˙ž˛˙ߡ˙ĹQ¶ŰţzË˙~‡˙^˙ w?č-s˙}Q˙ w?č-s˙}QĘ=óm·üő—ţýţ*Ť¶ßóÖ_űô?řŞđ?řKĽA˙AkźűęŹřKĽA˙AkźűęŽPąď›mżç¬ż÷čńTm¶˙ž˛˙ߡ˙ĹW˙Â]âú \˙ßTÂ]âú \˙ßTr…Ď|Űm˙=e˙żC˙ŠŁm·üő—ţýţ*ĽţďĐZçţúŁţďĐZçţúŁ”.{ćŰoůë/ýúüUmżç¬ż÷čńUŕđ—xţ‚×?÷Őđ—xţ‚×?÷Őˇsß6ŰĎYďĐ˙âŞk€f_ôxąŠxfăćcţz}6řWü%Ţ ˙ µĎýőGü%Ţ ˙ µĎýőG(\÷%ó—}É(×Íň«ą ńÂ˙‘śśmĺ~$ȤßőÝ?­yżü%Ţ ˙ µĎýőUďJłľĎ•ű”ůF~Kłľˇ+÷)ň‡µĹŃ<9öy°éUşĚßć"AŇ›p˙™?ĚG˘ü—gýF[îSĺů2Cę2ßtź({\]}žxž“ŰgüĹţb$OIm“ţb÷8ďţMú”·Ý'Ę3ňtŹÔĄţé>Q=®.‡>Î tŽŘűAîq¸éŻő÷ąÇsň|—Ôĺţé>Qź“侨ÇÝŹ({\]}śJzAk}}îq ·í_Ż=Î;.ˇ'őF>ěFzڧŐXű±Úâčx3ěänÚ‡˙9Ţq ¶í?®»Î:ľĄ+őf~ěFzśŻŐ™đ{<}}ś¸¶­#˙ď8Ü[‡×ç/T–ú»^U—ú»^gʎŕĎłžM­?ő·9Ă՞úÓśá÷V—ěđ:»‹~Ůăčx3ěH›Nt˙äąÎ%MŁ9ő‡9Ă|{&ü" »$xD=ž>‡>ĹbĐ›íÜç&zk‹ëç pZěŃáa7٧”=ž>§>ĘBrd˙űŻśH™©ŽŮ|ăi×[“•S唬%I Š€­NYVąÂą xNĚ´Ńłi.$)* t­)ŔT{ł‡±ÇÔđgŘÔÚY—š)i´Ţ$“ý3'¸B™ž”!Ä…ČϰŰkâßiĹ”×µ@RUţŚôŻ|6śź“ł’Ö;k%Â@Ăensş y…öÍ®őź),dä›}őM”‚ă|˝ńÇ>HĘn>0ÂqŠź•í3貚™ açÖŕIo %7*UrUrÔé:G:äÔë/oÚ‚JMAĹřč­[rfÍłdźnÎna÷ëŠŘ*8B•˝čTĂS§(EŇŐ…Úl,`´ůĘŚmŐKĽqCiε®ťđt–Ď!· ͸˘RP¦”JHŕi\ýšq¤9s÷‡>8…2˛é%†€  G#ŰG+<Ěâ¶o”ĄA5R­RQ^",^+”a 6Đ!´%çDŠFĐĽ6W(/ •Ę3/ •Ę ĂerŠË´¤[qM®m”­&ŠIX¨1ŻĘ¶×ń w†ĘĺᲹEO•d>¸ĎŚAň­źőĆ|bÝᲹAxl®QŇł.ŘmĹxĄ*©¦˙‹Ľ6W(/ •Ę#~e‰T%Oş†ŇŁtšTëOŔÄ*Ů˙\gĆ -Ţ+”†Ęĺ>Ułţ¸ĎŚAň¬‡×ń w†ĘĺᲹECkYŕTΰűÄ[( AĐŔ†ĘĺᲹF`€ĹᲹAxl®Q 1xl®P^+”f ^+”†Ę傆ĘĺᲹF`€ĹᲹAxl®Q 1xl®P^+”f ^+”†Ę傆ĘĺᲹF`€ĹᲹGÓ[Y’8˧ó*;áş_ô¤żđÉüĘ‹şs÷‡=żÔÂĄŮOâ©Ć­VĄ)IĄS™¨â4üxĺ”5s÷‡=żÔÂW&-ÔL¸–ä™q˘±qw€˘J”3Τ€{ëMt2vLë*eSŁŹa¨*á )J‚*=µÓŰYßł_reÇŮžq’łR¨Ń qŕA>üÁďg˝hĽ§şô˘%Ň›¸e.^Ë:ÓHŃ÷-Fć\,°Ű¬“č@"=üIPîĄsĐ„ňĎJK–Ţš\ÂŻT-B„ ˛Ô×ţâÔUrqÉrgYCN…RUAę{âÔ^VVÔą0eçÚ–mN*ëk¨$’ úŹ`S‰‡6Qť•›|ĎZmL˛˛˘š UU9S* µŰÚy©v±ŢšHł¦&Ü/&JR Ą Ó@ç© ,ä$%g&ÔÓ¶üłi!8ŽÍ:+T“P+¦T­u#|· :ž»-Ű&+ÎĎK‰'Ę\Ľn*‰@©9p_ű1dö/ĘwőD3]˛š•uŔÓ©)A53NĺAţčBĘ–ťLňŐ35;20^Ů–Ń@RŰ)H ´ 9Ă>Qé6ŠšSů ĘžŇ{ąoRUXîM*ŃP}†Ą×‚őÖŰťTÂTŰ Y¨­N[k ä덞şĘ[Xć‘™ăˇ?ś*rÔ$}™‡fäşłĄĄŐŐâ*«.&ő8ШE…ËŰe¦®Űl¤—¨PšH7rş.ĐŚ«©1FѡvI*CŽ$ş˛ZBÔ’ĺqA5IP2Ţ‘¶RÚ–z9>Ş®ëiLÓŐĄŃš«¦…vÎăô’ěZśd6·ĐWLČұż]–í“ Ąş9f=,ŰŽJľÚÔT4íRi§Î‰łOb÷ü§TiÇKĚĚäúLśÔňCj4ÄşV‡ę“@TA#:hw‹­¤ˇ¤%B„$ zU+ňdâZ–IeM¨Ľă–‹S9I­îc8jÉ%†ÉÖčţQ‰XoDhAUë†ĺ/S*éXRµŰ@Âj]Í?˝4W}hi˙Tă V´¶…-F‰H$žč˘«rÍEÜI¤6T+E‚’z¦‡_ë:弗m‰5˘”­H©Ąk®[qÓż)ßfĐšłCX­K̨µ&ńHÓBM+B *ŤÝ¶,ćUuŮÖrůËQ_ĺś´[“z]’…-ÇÔ€’‘™ ™’D6™¦RŇe śAšzJ ĄoÝ׍tĎXVÔÇHŇčJĺXZµUFž†Â•e®~ři3jČÉľY™™CN$R¬¨7ögüö1™[NJyç•™mĺ6*«Š¨‘ý" rî[‹™dL1.Ó7żh[54»Ţwřă —@SďľăĄâĺJVnt­ęšëßÂ"*nNą.ërJ”47ÂkR%\6ŠÂ޲Ë%Ń8‹€¨V‡:kAL˙ěn"ŠÎ9n6—.!˘€ µ ń  Iö>Üč"[Ý$S«[RŇáUBTFc=sŻíä2ÓLÎ6\eW’Rrˇp‰˘†pAApÝ/úR_řdţeGs7Kţ”—ţ?™Qa%Ý9űĂžßęa4ÇHĄeKÔ.©s jjFyĺăŔ\ýáĎoő1‚Ľ”ëSňřěŢąx§ŇMQUűe™Y—y·h(A I?‚‡·†pĘ# —‹!ÔRhQxTe]=„ ŚÚĚLYÎδ‡Km}%>Ą ä BÇH$źśjQ!Đű…I (âťa›Ž!¤¸°”ŤI4˘fĄÖ@Kí’­áS=—'hĎ·0ă6ríˇő6” r­Ě›Ă}˘÷ȶŻŰ(˙Š\Qł'-ŰEźf¸ëAő^^"U•iUWh˝×íď˛űÖżTm'ĺm 9śW­pQťnJTŠtżÝđŠ-®buÓ.%HR®™ŞZäN©RtÔwа››´–g,fÔô1śdçCĄUµb°~aGö6;vę‚VÓŚ_H)ˇ˝µ=Ô€KcĚľą×\¦ pÜ9É–J®­ PťAšpĘ2zS"”‚¶¦SZÓöGQĂ‘I®™Ć¶1’D놝Bî:J”´Öú1>o«ąj'Ą¤ËZ^ůăJ‘^`Ćea ¤ă–šěޤŕaS/ßq»ĹmjŇŁ?FžĂľEµ~ŮGüSúá8šjĎzU•LĽ§ŽB€ô°×Rj@ů·żq×íď˛űÖżTXúI"ÚżlŁţ)ýqJŇ—ź˛ĺĐűö˝[R DĄnäMOí4Ëť»×íď˛űÖżTFóöĚÂB^°ń“x­ŁCľjŠ9kiÉ™g˘ß\ZҢ· šĄa”ÔPH9¦™ľ‘jrÚD“­ˇć]äˇJq]MâFdśłŽŔĹ{|¶§Ą•hH:Ń +«ˇ§Z&é˝v„ÓŃ®ĐL°’†ď„‹Á$čž˙Ž™ ­Î”Ůí¤,‡n_)Q)ډ­+S§ź ÜůU’ě˛RÓĹ/•¬3‘NµŚň‰úüťôŁ­2T¤•$_ŠŇĽă&fY§Ć"˘(„m2÷ÁTż,©uĽ˘–Đżś2Ľ*# ź(‰ľ’˸řg IR€"«Nu#-uĎMÁÚ°ŐÉ©vµ-ä%(UŐ’rIĄsŰ#XŤ»JMŐ„70Ú”H‰áYRB’R "„1WäąDőFjť Á”[‚ «ňl‘unfĘ×KĦµ •Ę-¤Ü]ôĐ.…7©ťŁđŁAć$e¦Żc2•)BéVЦzÔŔÄ”¬±«,! Ą/ź=bÄV®!.Ë*]@`¨( †z󩊲d­Ş¦¤ŻÓ<Íbě4ËL$Ą¦Ň€MHHĄLoAApÝ/úR_řdţeGs7Kţ”—ţ?™Qa%Ý9űĂžßęc:_Yľ IĐSdDŰŤ:‹í̦´ŞT’+Ę –+™s8™˘ŮĆI$*ńĄHşr­4%ôj*ŞtÍ>QšŃ|Ç”i˛¶śMä-%*š±,ćfŃ4ܰKČ*RUyYk•i¨;EóO”˘ů§Ęő‘4‹:]ćÖ ËŹ)̸V™~妻5B*Ń|Óĺhľiň‹r†6ŚÄ­¦ČiědŁ:„úUΠű} E’ a%× ¤Ą”š…ä}Ň«Y˙۸Ąhľiň‚´_4ůB䢻.É\ŚÚŢ_UˇiŁ,ĄŢRH‰š Nqşş;d(d[ $äHĚ€ ×ý"Đv‹ćź((;EóO”EG#&ÄŚĚ‚N2®©ŔŘ©­[Z(6ůŐçËMvj„T˘ů§Ę Ń|Óĺ™Cß–šěŐąk0ëjmm,Ą@ť2„”˘ů§Ę Ń|Óĺä˘Ű^ÇDßUnM™T3.Ć LĂiqJ*JI ¨"„i&¬ąIÔ L ¸P› ßR}şµAÚ/š|  íÍ>QąV˛’eϢ ´ŚEP(R†•ˇů©×a®Ç‘p4d¨4€„µP¦UĄs9ń‹”˘ů§Ę Ń|ÓĺUv\’ÁťT’ĐG!D§-2Ň5jÇ‘aam˛   ĽÜQĚqĚĹĘŃ|Óĺhľiň€ÚÖ´_4ůAAÚ/š| 6‚5 íÍ>PPv‹ćź(  Ťh;EóO”˘ů§Ęh#ZŃ|Óĺhľiň€ÚÖ´_4ůAAÚ/š| 6‚5 íÍ>PPv‹ćź(  Ťh;EóO”˘ů§Ęháş_ô¤żđÉüĘŽÚµ_4ůGÓ Y4éüĘ‹ąR/M9@+ż8Rý‡e…2‡’’ĄŞę/.µşš¶IM?îL:¦\yiiN¨ $€MIr„SáŰMůwl逜R śD$¬„(Đĺż €´çEě·0Ż0†(€  mĄ}µÜĂ ie%ŇĂ mŃ7«Jš˙XF˙G'B–hJ†I›h©[őăřťáŚŤ›hȇ,©Ą—˘·™©4§­Ý6…Ć–ÓěĄä- ‚M2:D¸]čć#ś´.©)Ä©Hm.Ţfé)§wöDŤtrŇi*RĐZŠď©†©‘9RözŠű.đ†čć"5)´<†”¤¬^•ţbIôz~MlݍOşZUá‹2ŇłˇU—Î:Dö…‘?i:вÁJH)¶ Ťä( •ţ“ŕŰ ˝Ä`¶©(LČ„­t~}§ŰtHÚ*¸´¬4Öd géfňwžčŐ ú..NѦZL˛4¦zë–şćwpč0żŮĚDl–ćmćÔ‚‡“ZTÄ@ĵ§/.Ű)˛fTHH*}˘M77ˇhčüúŘ• łçë ´’¶fH%‡üYŠśë­Ńŕć­ăŕŢF%ŰôŻ Ň0úš–enş´% IQĎ€î„ č¬ň_B•'h)$Í·Sž`ú_6žŤ6QŚ+˘łémeąKDŻ  ¦ŰR@ď \:\!ş9ŤĹ4ÓŤˇj@S„„ç­'đ=›m䩹+H6śbešP Ĺ{˘UtzŃ,0ÁśRxşĄ<űKRŤ4ÍDk™÷Ŕ¸>ÂďG1z9O#cZR3 q2Î%D›ŽL´@4SŇŕćaŤËSěwţůŻŐụ¶R•-HKJ©D9‘aĹÄRš•µ_K)ů%ä„>Ű„—šŃ+ź;ş˙g'”´š¨M´iD„ńV”iP6.Ę›Ké`©Ĺ ¬ đř¨D]čć#ťţÍĎ.i+23jB)˘źeJ&‰©;w©‰čäű*Aęv’ÂhhকZęU^ďyÜŔ¸=ĂŁŚáłŽq®‹O¶šKDŞőëÂaiéP|8k)%iIË%„YSKJt+}˘4 …ě.ôsawŁ.Zźcż÷Í~¨.Zźcż÷Í~¨B|.ôsawŁ.Zźcż÷Í~¨.Zźcż÷Í~¨B|.ôsawŁ.Zźcż÷Í~¨.Zźcż÷Í~¨B|.ôsawŁ.Zźcż÷Í~¨.Zźcż÷Í~¨B|.ôsawŁ.Zźcż÷Í~¨.Zźcż÷Í~¨B|.ôsawŁ.Zźcż÷Í~¨.Zźcż÷Í~¨C(q§TâPB‹j¸¬´4úâş_ô¤żđÉüĘŽľJZb]S&e’ĘÝx¸T@şd8G!Ň˙Ą%˙†OćTX_Ă·™Ä:[hş As©Ś)ô&„ÔuËhÖ㞡ć"­ˇgőůEK8”¬ŹI$TS<ˇPV+ŘÉőUĆNĘŽq]qObBz—²ZA&čükíްÂBÄMžűŹ!O8·J‹ŠI ŕŔl2…A®&ÉőU †Ŕ5Ë3´c ĎPóškŁMOM.eĹ<ĄD„PP‚™ć8îF†buŽ‚±@NDpô„CR2ŇŮÖPłP¦Ú(,Ţ7Šx§…6‰&d ď2ň‚`¨„ú4$Š{yyB ¬WqŃZg]i”j·ĐšPÔÓh@:&Ś039|7‡y+HËŹôäť„]EŠ„Y‹łÖ^u§SqEŐ+ćPźiĄ}¤Â ¬M1“˛ ˇB˘¤i•! ú.ůxÎÚ®Ą …)AĄr×^:Ćň=ęč™P$¨¶Ą€šščíŔwŐPk‰ŇťMJÔ8]9gKMN=2·^BÜ•2ʦ— ©9ń‹ŞC”ů‡QÄo ćěvććÝyĹ8ä±—ZM.RsÎBK.FVËIC qi)»Uč3áMĎş›C˛Ő@®gAQŮčä˛eú˝÷śMA&úk‘5Ťj {Ť#CŃ)bů~łŇ€Š…$P ( 5ÎŁ…AXşdúŞŚĐH d3¤%—čîWZťXEň§E Rn“ČsÎ+žŠ ĹŮéŐâ,,UHôt;kQŻH…A®.Ź'ü*>Şˇ ŻEŰ”AJśUZÂ7ťľ•âHĐ’u'Q”FÇEKE rvyĺĄ4ôž˘t¦€ŚŞ+Żľ¸ş,dúŞ>Şˇ3ýÇ@ ś -¬ĄÁé€kźy:ňE7+3>n¦”Ć&őjG ö´* qtÉőLj©†Óó˛Ęą‘ fl˛đtż6’ n‡Óʇ†ľÚžýmćCe鼚-—Ą(^5'SĂŮ”* q>ÇIŕ`TĂiU@ČTŇËômÓb`?:µ$$$-ŕ 9~#ŘŁĎFÚ•L˛ś› ĄŇîo^$•jŞÓ1L¸ą…A®'xÉőU2}UEYiG% U×˙Š÷çíĎßaąŮžb¸¤ĆOި1“ęŞ#Ăsł<Änvg…A®%łę š$2ÇžôżéIá“ů•:™ Šóî—ý)/ü22ˇź‡rňÖ‡žSmT˘@'^$ :Чm™dLK̲‡ÜUűϡA@4ş¤ *+^ęĂ·–´<ň›iN¨D$€NĽIş…OÚ6|Ľä»’ě)ĹŢ8Uᄺ§"u­xV’LŃIU7E*{+' ÍŢ©P;ҵ:WM…:€‡ţí\ÇśskčŐ–ZSS¸Y:\MęŢIŇ”© gJé°ŽN6ÍW!XcXsÓ3óJ뮺eM+źçÂJË)‰FYBRÚ€TEh3νeYĎĎLLĽóß¶?´n©Đ3ůĂ"x˙!%^bZQ–ÄRm(IU á¬Ă|7;5sq…!w“ű5k¸Ř÷ÄťqżU|„j©ĆĘ‘č«#·q†°i aąŮ«óŚáąŮ«óŤşă~Şů:ă~ŞůkÓ }šąŹ8„­H$a(ćsĽśłď>řł×őWĘMŮłŽLĽűÉZ—z€ R„4Ěz5ĎsŔĂX4„_qY4ˇJŚÔ“¶Ć5ZśH2ë@˘¤ĐĺZë^ďúŠö[¶bTŰ uiQ©*»‘)áN $ęX›q—\•¤34¦|a¬ÂP· ‚p ůÉóř¬ajZR•-Ą#=¤í턣ňE!&vwĺä) ÝĐÓäť„_LŚŁvZěő­÷Yu7§HRłEŇ}¦—˝¤k°ąáHR%ÜX" ĄHĎ/÷Fo¸TR™w N_ýB‘$R¤”ÎO!Ţi.˘Ą7k—šűMcA`Ę2µ:™ůäŐÂâÉRR7B»L¨‘ěËhk|´9t~ÍZŽ#l-śł±§ź CŞ”,’‚Ý jNŠăRuË8jąĆĘ~jµ;á|켴ÜĂÎ-çP\–S!(É$ćjE¦PÖ aZÍ’M…Ą‰i‚•( ĄmĐi˘¨>2†%ÇÁ4’|űŚ˙ú…LY2 Ęőf¦ąTŢ ˇW‡ óĺŔFŤX2l,ÖĐ´‰( ľ=Ěe]ˇ¬ÁĘ\yH˝ÔŢb¤WZzߍPűΩ2O]P¨7Ű#óBěô7Lý˘–T0­j +Żřb1щVŰe¦m ä6‹×)%UŻ-@Đä) `Ň1ž ©j“y ŃJGę¤nâ“Q.áÔd¤ę?ö÷BCŃůEĘ)—g§U}°…ɡ Ě„@':ďSZÔĆ­ôzA•8ˇhZ7şN8ôTt#eTÔwk| ¤‘ŐÜČT§>ý`ý·Ő]ćźŐ¬™IK/ů—ŻPE…R/ÂöB‚MoĐeSMxĂX4„Dľ GTtޤ)Ž\}/vQ’÷w°§Î%3ÍR摏”­*8k…Eđ’DŁĘ9dŠţhÝ!ŇŞśµ%>q!žh  7Ę1ňĄOáç `ŇťšąŹ80ÜěŐĚyĆÝqżU|„qżU|„5Hk†çf®cÎ1†çf®cÎ7ëŤú«ä ëŤú«ä!¬A¤śUA#wŇ˙Ą%˙†OćTz-¤°äâ”Xó®—ý)/ü22˘GŰuPîulşňĐŇťPIšÔq B·zÔ–jfQéyt-JuWĐj’…&í:Ö‡ş°ŮĎŢö˙S‚¨+ٶbŰĚΕPáP˝¨VÔ­R3Ąy tuťŐĘA ’LŮ2sOľëŻUâ šd(¨Ż~şű5fa†m Ą¨!! «2h)śQ‚%őĆwW(ÁśjŁ5dv…đB䣸Îęĺ\gur…ĐB䣺ĎúąBy»*Fvms.ĽřZ”RŠ @Ó<Ŕ×r41<ą)%śÔ­š…¶ĘÝRToŕeŕ’dJLż,úË’ĘRۡ T¤¤ÔqČĹx!rR°¤°ŔTäĺü<;É eLř{9'aS'&›5R%镶޵+Óé˝Eďi0A ’”•`YĘJ“Ö§‚UJ¤¬Qť@"€Ö¦ŁsĽ °¤ÚŰ3łĺ+* XP5hAŔ‹°Bäˇ!,Ĺžµ©3S/h5ˇ*$ťłË‡Úf^Zbqɬw›qrć\ÝJHşMk9ţ¬ą)l©ĺÔÂJ '+ąU%&‚”Ě(ĹSŃŮm·gç”R›Ą@¤^Ti’M4ď;c.JWnÉ“in8‰ą˛µ‘|Ţ*e°Ď@FhÂl‰$Ě6čťź7Äş]¨V™ĆC.čł.JB»*AĆÝB¦&ČuĹ8hşŞřáÜş{VnŔ”d¬"Đť¸»¤ŢPRŞ8Ţ>Äźw˛—ŕ…ÉJMX2 áNĎ (‚T@¦\ŮQˇ‰ŃeH%†[ëEL‡(ĺ@Q+ ’HÔA ’"Ę“C´&ćČu7Wz鯤„S…ĂHŤ«Îja/%ůŠ‹ ¤Ą)AóŇ?Ě[‚%"6l–Ăbb`!ňo $U^9íöTń5›°ěćŢ.%ůŠ‘J'Avś?Ň?ĚZ‚%őĆwW(:ă;«”.‚%őĆwW(:ă;«”.‚%%q.şTť)Kţ”—ţ?™QÜÇ Ň˙Ą%˙†OćT —nű‰DĘęF}ăscŁqâqf´|ě?¬Vź´LŚ““%Ą»r€!´•)D{` tnüůĂD4°€¤’2­áź|m†wO@Pe¦“ęÍM§?H/ŇĚ’Mką1]R -%*´źRHˇóB9Ă|3ş|B 3ş|B;vtł-†Ú´B‰KÔÝXŰ©3öśÇßź8m†wOA†wO@Q•n^Qµ!ą”ŞňŠÔĄŞń$÷Ö'Ço·kăßáťÓâaťÓâíöí|{ŕÇo·kăßáťÓâaťÓâc·ŰµńďľÝŻŹ|O†wOA†wO@AŽßn×Çľ vűvľ=ń>Ý>!Ý>!;}»_ř1ŰíÚř÷Äřgtř„gtř„íöí|{ŕÇo·kăßáťÓâaťÓâc·ŰµńďľÝŻŹ|O†wOA†wO@AŽßn×Çľ vűvľ=ń>Ý>!Ý>!;}»_ř1ŰíÚř÷Äřgtř„gtř„íöí|{ŕÇo·kăßáťÓâaťÓâc·ŰµńďľÝŻŹ|O†wOA†wO@AŽßn×Çľ vűvľ=ń>Ý>!Ý>!;}»_ř1ŰíÚř÷Äřgtř„gtř„íöí|{ŕÇo·kăßáťÓâaťÓâńŰíÚř÷ÇÓŞŔŁ«¦‡˙eGpŞŁ *{ł§ÇÇÓĄ™×÷qż¬­âŔ@ç÷«˙qţq¬FAAAAAAAAAAAAAAAAA+´xOűó0A˙Ůfox1.6-1.6.57/doc/screenshots/xfe.png000066400000000000000000000564201326741342000172410ustar00rootroot00000000000000‰PNG  IHDR|Ńĺó¬ pHYs  d_‘\ÂIDATxÚíÝqçť'üo5đL` ŇKôr3Ľó˛Ó:ÁzDŽłď ě)g•ő ±¤…‹ööeWNŽ˝ńlÉYÎ’bn#ďń&’vc/w+9p»ě(Çĺ2Ëi|śÖ3Ç+żw ĂMCÄű¨xź¨`Ţ?žžrMuWuuwuWW÷÷(UWWUWU×ÔŻĎóT=ŤDŔţţ~ omo‰łPô.Ń´{ëĎŢxëÍkEoEš­í­ăőăNř˘ŹU¬ż»ţôs6·Eď MµĆŻ4úŤeٱţî:'6éęĺ«]—üpëĂĎ^""Eď Mµ0ŮŘ–ŃéçNŹlˉ˝qĺµ+YVý5!A^Ť¨/Ágé_ö@V_©Űp6šEĐžéŻﺊh¦k1=™3_ŞÚ‘[żĐ˝U""˘v±ô/K9óú»ëő•ú8Ó €Č®žyŞzëçńPťŘq""˘”¤ĚuĐL‘HR˙ÖO÷Îyá­źî…Sb/Dç'""ĘC>‘%) |¶-TěÝăőă_˝­Ę šé ĐŢŽ*6%ý%Ń€Šj]túąÓW/_=^?Ć]¶;F\ä‘éĆ3×7Ţm¬=W{ăÝ€pÄZ{®ŕÂ3 áśáÄđ%QĎŠ+^ţpëĂăőă6îÚš”#Ź:]iO]ßřáÎÚ×íHűôčÄčËŘ[DDDŁ×2»¦ŁaÜEjÄĹŕ™®¤&őß '^<·xőŻ>‹˛W˙j'6…( S’ÖB9´^6É•´ߊNĽxn1Ë"DDDi m˝ć¸a9sŇśgşA‡töÚ¬ĽôgŰŃ‘¨čüíďő¬SĐíµ)r˘ĄĘ]ănuşÁˇ‡c\űĆęKßß´ă/}3úň`Óyś¨/‚ܢI–ä3dź ±6»Ţý–ˇ~Z/í¤ŠMIzůâźl^˙Öę‹ňYHŽ˝$""ʤS¦ŰGFŰë"§ź;Ý\‡ŘzYşečŻ<ý{ßŮÎů{ßŮMŚÎoߍľěő•Ą€ÁďÓ•čc@~ďۢftbű !""ęA$čnmoőÔ ĐČA.˝ •Ąˇ6M®V$:ýÜéúJ=ÚÇ@WŁYÄrbŻ{íŘ`şDDT,9śéöşřhA{Đí5Yľóî[Ţ/ůřF""*Xĺ˝ĂkfşW/_-z ‰zÖÓ­>#Ó%č¸yűnŃIDDTzgź=›ň÷ŠŢ$""˘iÁ KDD4" şDDD# KDD4" şDDD# KDD4"9ݰyt{;éŃ(|˛l[éV>%[8Ę˝›ěŁA41r˙Suú[¬};ěݽûÇ7é“Dß=űěÉA6,úŃS{s!vŘ‹=t±ó§đď±đ šBí±`ŔčЇ>.Џjxť ?zôßĐ8íuIÂě•]˙A·ŁŽ×˛agŠÓ˙pKě»vű§'íZ×]ŽnŢÍŰwŁ›×ľ©×Öľ`űĘs9říß©ýÜöíŹm^l_şnUŇŞrŮ‹ôŢĆ$ý^Éx4Ňlj(GéÚ)ׄžät;îĆP3ŚöőÇfFŃěZ×]NYťBTŇÚ’~âŚřÝńS{Ęńé8>ě˝dcß¶É(E *»,‰ą\]űşŁŻé,°Z.Çşôމc;•~NŚLŽź8Vń&—Ťi/čuÁöaц¨Äąçň×7Š:ÝĽ"Ö8Ôéb°ŔÖ߲`R9pű.”K^{‘Ą. ×őä‚-™‰F¦˝Ü±ăřđ ˝xeľÜ箏dĄkůyúĘ'Ł.0—˝ČXÖÝßzrŮ;"*ĐhţGýpŚ)żW‡ó¶R¬Ľ}ťĄŽßůʤĎ>{2ăA‹ĄăYęȉ(wĂ»J=ÓŤ]˛ó* W+{ěx¤’Zůö÷ŃŃöM=MŹmOĆŤé5ŽĆ*S6Ł×u&­*é­¤ĂŢë)1ÔÖýŢ·'÷Q˛ü%ćň§Z°żżżµ˝e_Żçź=eÇô‹¦Aß-r>ÜúĐŽŻż»~őňU>{™hDt‰F„A—²e"šy]ët‰F„A—hDt‰F$í>Ýť{wŠŢ<""˘’YVGDDDIŇ2ÝŽÁuçŢť”Ä™’ úěeÖűRv…Ą)D4‘rčđŕęĺ«EďM>m&X— Ű±cźvűűűEďM‚JĄRô& Q— ë8Żč­Ą˛ĘR\<¶UW˙äĆĹo](z+J&ĽnĽ˙_>•Ŕ¬˙ĹŐS_—cxő[/ÂŘaăďv~°ţ3űÖďťţÇá8•Ë™ß^˝őKP-Ő˝xą×Ţł—–ëĘQ@9@ xđÉVŃ»IÔ§wŢŰŻ-ľń˝[kß<3Čzö~ŐMY8ZdmáâŃńľ7iŤéčňżľ,(GýÓřN?úÎoŚCÜ}ă;—Ö^»>˙Ä‚Ť¸Í‡{WľýâŮÓ'o®ß ďŁ;ž}}ŕ«/‘”űh˘n˝·yéňĄR4ňÍT§›=âÖO¬®˝|}ţč…@µ}oŁv¬Ţ`ÜĄQyç§;ŤíŤ>rÓŤ{ŤĆÇ;ňX.|ýtkUďmč_{ĘUs 7Ţ^§÷çĄ?ü,l_{óÖ€WĚ3Ϭ†ĺŃńt±ëľÝ$»1áÄ\®ăµ•§Ű/˝ň(¨W˙řŐw~řNŽfŤí $lSrńŐ‹]Żą—ľőâ…o\ŕ=Ô€ ߸|ă»˙ęěé“ uöŮ“6+GI ym°ýşc!äÚ›·ĐË×]»Â[ďmöz.ŮŻŰ.Ş3ż˝zćüĄÔâ_úÖKŮw9:§ÝßŘłGU9Şż ;űě@róvĎ1Ű.{óöÓíÓ“Ö–CCŞPíŘŇ…o\Ć Ľ‡ÚţČ•@jµĹ3çÎWf*áI=ˇYLą3ss },(€<–˝ćž}ąqݱ÷ë=WŚVn3<îFŻ/ýá™koŢe¦ŇqíEßć[ŃŮŮ* •ŁlĵĂ+Ż]±ąo^ŐUŤíŤW˙řŐ蔫—ŻW»¬Vdçămů[OÍÎ)ŢĂ=8.`ŽĚWçç/ľvýĄož˝ö§7×xcő˙ęŽÖŕŕŐoť_{eĐÇŮCş÷«Ć­÷MŹůŚÂüŘ®0 çŮĂ]6ühűŰkx· śůíŐK|©ţíŐ¬RJ}đ‹Ţř·o=Č}íǶƗ–ëî3 ¦ÜĽóÓm 0oü鍵™5Ůݸ×`o·ˇ\U[\ąsŻá=l ®r•ĺ*8ĆÝhVa^ß)¦ Ř}\˛-{ť s/{íßí5÷ŠzőŹ_Ĺ?z ŔÓO=^N}ůÔÉo_˛3\ţ×—ű>€Vq/˙ë˵•§ŁÓÓë¶0ö˝DĂd.?łb+ěăű OžaG\?ţŹ?ľňť+Wľsĺ­·ß:˙őóě<¸ńg7.˝r)Ëç¶'µ'öťéZ6îöľś„K>ńd şYľÔćnCĽ=q ĺ×^ąî:JűRť=44tWÍFLĐçFF›ŇD‹—cÎYâ®˝^÷—ć›mşaRG+›Đďqłb'Ź}=yě””¸ë ‘Ŕ(@)w~Ţő|3uçë‹'ž~đËĆů?¸ôŁŢ8óő5ĚÍΙÁHńo<•<(×ígµa Oúˇ–Ţ<*<í˛aäł‘,ú[Á¶Ňęo#Ď<łzćwoÔćksGć\¸&0®ăšŔTg«ÚŃ뵾î¬ooo?ůĄ'ÓË™‡ťéöŃ~*töŮŤŽ-°Î>»‘TčŇ˝xŮĆÚlżt”Í_.`DŕZ©Şçk5[ő| (nĺÁj?L6LFdĘËp<zŰgK­ÇC{ÜÍ«u¨§\%áeÝQŐĎAü®Ëą\ŢCoĎ÷fÔ¬ >¸WI  7pŐ÷~Çńô‰T¬aUÔ{řË‹Ż\ŕÎşF›Şăz€ _;uő;îś:(’@0㊯đĆŰm•‹6ĽĆ úŽIF8w˝GŠ?+¶›}_ŁŰÖk)wGCŞÓ uuZŚ@»Ž[[\\0µŤźľÓ÷v¶×„†ŃhĽ±t¶}Á2]`3ĚÁm¨âHu®úŁ÷~ôŇż|©ë Fpźn7y®9Ďâe#"¨ÖÎ+ďŃAdu”¸ůŮkÄô‘6°j–ÚŮką3®6fnnţŕ­µ®‹+GUgá=lŘńŤű{ ó(đlI‘r€ÁZ7v `}dş—OĆÄ˙ŕ©ŘętCgź={ţTxçîĹW/¦/« ĽGŢÜçćĽGŘŰŻĺQëˇ=ő°Š®ă_UăëAętíµ™nO?­Ff™nýDý{(WÁ–*Ď(ĚŹ€Y Ŕć˝Í®+/.ÓE×VÍů?‘ާâea.{¸Xéłz\ E»ö6ĘNż|cm’Ł-ŃcÖŰ÷‚TRjvNĄ\xŹtöĄÄRs›ě,;/feá‰đĎLŮz\ G X§Ó±Ŕą'¶•)˛]Ç“nPéX˙7ČV ŻN×:¨ŮŤw*ÚýIl¬µCĐżÖ®rŤWąp =]ť«j_+(íiĺ¨AętGéŘđ-úL«hŁĺŘÍNdşZk#&<ŕPP3 µĎ×¶Ľ­Íźov-˙:űr™n¶VÍ­zß›·źÎí‰T=µ^¶`Ú×.\Q0b Ś WĂŘ9Ü€ Ś$5ÇŹČ®Ť¤˛ŚÓ4Řůů:ŕłŇâLÔçćÔçćVŽÖŕ{P6'Sđ=wNÍŮłĎv¨}AAan¶š×¦flęŇľT,ĘĆšČöôˇ×ŢĽ5x଱yűî?~ú$€»˙宲řĹE{Y°™h^Ő 7oߍ> Ň>c˛kb`Ŕńµ;[µC@฀˝[”ŁŚŻ[ő÷öÉÝÚ$‰Řa”'÷w µŻ!ůŢÜAďÓ°ý·Ű s Č _{ˇ±Űřŕç#ĘQOůé­í-Ď÷ćfçđĐKZ<űçć›é¦´j>,ĽÇ7§'RőŘzYl[ť­j_» ŔŢ( Q‘tÝÉÍČ4=˛&·k|˛ăôőf¸ ć žz<÷Á÷ dGm*˛ăĺU+i X.ŢÓz˘3~ŐîČ^}NţáÜęúü©vÍ_î\ůăóUqUU‹ŽŢ“m§·.K;˝Ůě'XéŔ¶Ľ˘!zŰRú°WgžY˝ö˝k OÔśrázž·đÄ‚šUsź›[_pá.¸źsÓîĐýíŐK—/%µËRK=+ăéš˙©z*^nî6®˝ŢŰÓ[šý>bŤ(GW^éúx©SřrŃ[‘cťîđžf5†=p˙ŕ?Ś®ŻÜq{LŘčÝzoóĄoľ} ŕĚ gn˝·é5e'Kě˙¸YŠŢúz’gń˛1¦čÝ9„eËăcl;¨'˘áiŹü-’÷Ă1Úđ6k""+‡âĺ›·ďňÇ ĄĂbF"˘Bd-^NrĺµA»w&""šެΗ(Ł´ ËĆ/DDD9J ş—ľ})é-cЕ׮DËHxFŃ$‰]â˘Ň2]¶U¦‘áÉFDÓŕď˝DDDÓ‚A—hDş·^ÎRß–R~MDDDV¦[†®^ľšň.}@DD”EÖâĺýd||{÷IýM¶qŰž)ao!y¨®vőóÜ#*ŁAŽ‘ĹŮgOƲápJQYrćľ©gö؆Ç3ö’˘r9,í_D4¶FtÇŻSCróöݳϞ´‘`[`,˙06ţ[HDtŁ×ŽAŠšŁ+ ŻőčërßqµąlŹťŘuý Ś»9îcÇď´§cŢuÁĽ>::OúéÎtŢvýí-ďřYŮËŕ;DÔŐ¸dşíW«^§wĽđő𤬶í)/{ůî{głĎŚó cş.qµh Ŕé{štÚ$Í“~ÎÄ6ŁŹíďxXş~. nDAw”Ť>2^)F–qNç•+ĚŔrŮý^WťŔ Ů×—ôA9n@×Ă2ťç*Ń(Ť(č¶˙T|ť®$÷ëK–í™’â»0‘ +w{]|Ř'ĄŽ ŹmŁ”e ٰ™hlŤKńrĆ-heÜž‰/ľ‹]öw‡mŔíÉR\\Ţ˝#˘áÇÇ@öqSl·rŽĎöډ›·ďĆŠ1©V¤ŠůĽV›qúÎ4źŠDc(S¦{óöÝa?ĺ1VîÚÓ8ňűißuµnĎ44]™ľĎžě8gl לńTÉń8DKú8,ŕůI4|űűű[Ű[öőńúqűǶsďŽímíĚ3«YVÄg/SvgžYŤő§kO6Ţ›[ŕŽ˙ *‹đwöŮ“n}h'®ż»~őňŐî™.Ł)Q.ƱN—¦V™Öř'yăż…DÔ. ęD#Á KDD4"‰uşW^»Rô¶Ń´ŕÉFDS"1č˛ýŤ O6"š,^&""]""˘aĐ%""‘Ä:Ýť{wŠŢ6šXW^»{"UŃ[DD”›Ř%.*í‰TW/_-zËiuĽ”'M†ô[Ţ»<rżë\úöĄŚ·|$Íťľ´\żřÚŕ("(GņxŚŘ”—_zđÉVűj+•JtűĂ—ąOϸŕËŢü8ĺY˙Sr¬¬éą> ®\Ç*ýzCşůŢdiD$H €ňyĘQžńŕ(1^+îF"®•˙Q«T*=M§,c\úöĄôxďM‰°J…ç|Wv¬rşŮ3]d¸ěŔcxń52D+â€Z´ë¸v’>ť¦\· eJ^{XJ@űş:[506‹u×Ŕ@D´hťâŁ|™(o…Őé&-ŐÜm\{ýĹžVŐÜm áČĐ ĘŢ)zö™Oś*zc‰¨F]§Űu)cLŃÇ„r`[)—=îvŤ¦gžYeM6e—Cńrľ™.M€č}A)÷ŤąĹ§Ň“]F\˘14ćל±Ët‡±ŤRűß_ľk×]°ěy3QşŽŃ‚ç|’Řá Ô±±«ÓĆR4Jc~Ć÷Ä&» ™™ćRîÂżţľěŞý•ĺ MT¦»´\?¸ŁźTEeqóöݤ?¤čŹÜŘĄ*š"wL—Ű$s±?„đeôśÇtźęí?Y’RábŹĚädşő«k/_ź?ş`! ¨í{µcőăî$J*vŽý˝E/LHľrĄčě2ÍĄń‘tţłj¦ăOÂŹĚާŰĎRµcK/ś[Ă Ľ‡şąŰđęfłQ«-ž9wľ2S©T*îŚ[©T˘ăąF–čŻřŚów'*µčB,NLçynHô_ĘĚcő›cr2Ý폶ŐÇ;±ľvîoľżńéAîk÷¸5ľ´\p\’ŕôÇyGBYô–&ęďWT ™űn ŘÇ‚±d—i.•Â7â\Ć:ÝŻą(AťnĘŐ<\Cs·!Ţž8PŽň ‡kŻ\wĄ}©Îš@”SŽçX•˘{ŤźÄíDŮ—źĽDCĹS ‘¸Ř#SŽL7©CŔp|ţČâ©çĎĎĎ× ët‘Ú×JUµŻŐlUűŽk‡’đÄfęĂÍŰwmţ—eŘßú‡׳:…É.Ó\*J¬‘`OĆŞ|5Yö(ŻyňU‚L7*)ísjGj¦Ő‘ q%˘•ăŠr\ńµr\ lŻD&%ÓíŘ7QÓ{Z9:#Ű)v8Îůnö›KĐę;Çś°ËM§Ž§ôÄźę팷9~dĘ‘éf lţŠŔ p#/ĐJU=_«ŮŞçk@ t+TJ¦Ű±Gú>¦·Kęî>iÜö$8ÎáÖFÄŤý1¤żlźeĽ'6Ů˝5ęCKÓ(ĺ,Í^X:y¶×Ď#SšÖË•J%Lű:·=ţĘqaŰR‰QŽ_ŰĽVµ".DĽa×éVë:˙řGÖ=eşEo,QaJ“éÚ””öµž†Ř–É"Ű㽣<ßSŽňĵmNú¬¤ŮÓô¤ :‘w+Ť˛lą@ěM 4yő˛Ó©4™n:±µą@|/:lĹ×Çđy‡† 1×ĆőPßÓ“ě–ăA(3]˘aëZĄBĄP˛^†’˘”‘@¨0˛ĘA”µYoă1;†&&ëť’L—h@ĺh˝ś)-~ ĎxŃŇăç0«V €í:®ďȶ]|z–•Og¦›wł÷O4xÎgW–c•^U‚:Ýls¶˘¬öµ WŚăÂŐ0v7€`#"&[ëĺA¦gź961ú˛9—;1y?QF<çł+ѱşy;-č–¬N7y)AíëęlŐŔŘ,Öu\Ѣ!""vŠ;ĺË“"—:Ý}"˘ňKżZ– ÓͲTs·qíő{ZUs·1řľ“Ĺ:]"˘,ĘQ§Űu)cĚpŽe’ű©Ř52M¤ Ét©XůF\vŤLD“jbęt©H9ާˮ‘‰h‚1ÓĄä›é–şkd˘Hz6_)Ő>ĺ&*Ó]Z®×WV—–Wë+«KËőĄcőśŽu‘c¦k»FöĽDG‡¶kdńmçQÇa©MTf•6EoQ9ÄTŇL9°Ł?ŕ““é˛"°@9fşě™¦3Ô^µGÖýN}¸eěŰmd&$ÓeE`±rĚtm×Č­N‘:Hv…ŔÄşF>xÚ¶a¦K¬kúŰSz×ĄŻ¶ň<^U?9™ná]żÂ ®nɵN7Ď®‘‰J-%KKšˇë‚p!Ęk y(o îÓMɉĂ5ŘŠ@q ĺmE öĄ:{hh<=Š}ńe?Ź‘ó}şʆĺ¸":Ö5rô‘Ú ˝kd˘Y(ű•*Ç é?h†¤™nÇ™ŁÁĹĘ1âćŰ52QYä~Ĺ/{rĆ]łă)Goż—>iF duşIÇ.ߊŔ,u!íU#±™s¬†9ÖéćŘ52Ń4ëéŔ%Ű©,{7Vǡ™nyVf© ±żž˛Ü*—Ą¦c+»É1Óµ]#+}ˇĽGžr”g<8JşnĚŇ5r×oh¤üRçů?>ǡ4™n4Ĺě|n¤G”ăÂ^”#°7tÚŠ@é§"°żo«đďxrĚt„Y¬ĎĘí9€íTęłÚ_˘Id܇Ú/&ŃbMLŇś<)»¨Ś2ţ™÷:}¨J“é¦Ë±"ĐĆőaW$U·„S¦¶N—]#Ń+M¦k%EÁĽ*‡aîßÍ1Óe×ČD4ÁJpź.2¦ĹŹáÄ×Č0R €í:®ď({–ÎŮ^Ä‘~Ë]Ň …Ü©ť‹ďÓe×ČD4ÁJéf›3źŠ@+{]Hßµ)VÝ’o/CDD“ŞduşÉK±"°H9·^nł°°Pô.ĺ ™n–ĄXX¬ˇfş¶ÎűŇ+—®ľ~µĽ…DDL×ÓřäAO˙Xwَfşsă:€+ßą˛żżéëçËŐ®›(*‡ ;™.+ÇL·ňOľR*ß»ŕ«O~ĄŇh\ýł[—ţđ|ĺ©§+rĺę_˝˝żż˙Ň7_bč%˘2šL—Š•g¦+ţĹż°ţµP«©WŢ| s řŘű˙ţű‡®}ďÚţţţ•ď\ač%˘ra¦K9ČłNWąö˙3ĎťÁ7ϨŠčźţĎĽđÝYl?ô6?h­áŇ7.íďď_ůöĄ2†ŢôÇä¸Î|H/u5¤ł…şš¨Lwią^_Y]Z^­Ż¬.-×—ŽŐs:JÔEîuşOwžż ŔĽRżńŢřŻ?˙ę3OÍ™ßŰÝĂcsë'?ެ­~ő{o]úŁ+űűű7ţüFőóŐŽ«Ję3ާéCű Á‹±ąYé ďÄ«´±ÓK}’ôÚK[ß˝ş ă"0!­—ÔO¬®˝|}ţčBŘźîö˝ŤÚ±ză“­üu–{ëĺź8ZĂ_üSüů•·?ţ˙ţGßýţKę µ7ć«qĎţđťµűgŢđߪ˙rcëOo]řý /^čĐ|=ĄŻˇ^§ ŐđNĽ ;‡3öŇÖ÷ôč”al˙„dşµcK/ś[Ă Ľ‡şąŰđęfłQ«-ž9wľ2S©T*îŚ[©T˘ăąĆi—ëĺ˙űÓ?üë·çźX€O˙_ĽöŇ…—×ö¶—éaË7Óýť˙ăwľňOľľÜŰÝkě6žXŘkîUçŞŢCŻ:[ÝóöŽ.ěýz/Ą6·ýéř%}qąˇ…ź)ă-…ďć裄3÷Ă>1ßă¸íHi2Ý0•LlYü”ă¶ĄŁ%ľ¶y­˛%ĎDĽĽęt§ö÷`Tľ™îţţţŹňăJĄ˛úä*€Ż>÷Őú?¨ď|˛ł0ż°×Ü›źźoüޱú›«ę˙[=ýřŰŔJšyxq7şéźŢµ5i¬.*K+ÓŚ»źq›“ÖÖß§PLŇ1Ůa/Ë÷Řë·ó¶uşčÖ(T9™k D¶ďzGyľ§ĺ‰jŰśôY]Żżc{:e˝ …ßř“żőä曵ZmóÍ…'¶?Ţ^XXX8ş`ŚÉŇh9c×ĹaQR–Ĺ;ľŰÓxĘ˝LYZfĄďT=7c{(»ě§YöĄ2.;Ô–€CŇëéű〔&ÓM'¶7ďE‡­řúŢ#ďĐ0!ć¦T±9ÉđzÚßßßü`łR©<ýĺ§Wź\]ýŇęĘ˙ş˛ň›+~ă7ú¬ÍíU%A!‡šJ­4™®•t‘5"˛ŃĘ{ä)GyĆŁÄÄÝHŽkİű µ?]D˛Ţ§ţŃS?ß°GvonY~ţŃř+Á}şČ?†w_#C´"n E»ŽkÇ;JJd+ w†U&ë¸ţäxźnŠ0ôľđµĽ_{´'~‰¦P 2Ýls¶˘¬öµ WŚăÂŐhÝëé00L`DĤ¶^Î8±×™'Ő"nhÚŽ-M’’Őé&/% }]ť­›ĹşŽk` "Z4DDÄNqYľśźáŐéM’dşY–jî6®˝ţbO«jî6ßw˛F™é•W9ęt».eŚÎńé‚EťÖętmKň¤aŃ;MDÔł’=‘*ďçXQ>†q/}űRÇ!ďŘ!˘2šL—Š•{¦F֮âwť¨Ět)ągşö!ťŃ§DņáÝşCĹ|šŠŐő ä)Z:Óz––ëő•ŐĄĺŐúĘęŇr}éX=§ŁD]ŚľőňP»CŞŚWI^L§Jß;ëŁ_„Ľž­Vŕ)š´ńY¦·oöwdBZ/¨źX]{ůúüŃ…°?Ýí{µcőĆ'[ů.ęlx­—ŁĎ»®D:¶dwČ4aúč#vO)oíL%ˇÜJj?»w¶ß ’éÖŽ-˝pn 3đęćnĂ{¨›ÍF­¶xćÜůĘLĄR©¸3nĄR‰Žçz§]î™nS“:¶LĘt+m]Q ňُëjł¬°ëćĹŢí8QĘ™‰ĂçĚ ÉkĘG`âNŃBş žśLwűŁmőńÎág@ĘÎýÍ÷7>=Č}í·Ć—–ëî3 ÎÇętŃé§h×L7ú 7ĺÇoĆËçAä™”Y~eG7>K†ÁfbÔ®ë –rćg‘ń7¦¨S´ě%h˝ś’‡khî6ÄŰĘQ^ ápí•뮣´/ŐŮCCČ*§çş9Ľg/'Ŕ”ŻoŘĺrů~cS^†wćŹí)Zië7éhTƦcÖrdşgŽăů#‹§ž???_$¬ÓDh_+UŐľVłUík8®˛R0G#¨Ó őZ§›Tü•{±Xß+ĎËŤX×®SFP›ôăyЦ§ć]‹µŠR˛:ݤsÂU¨©Ů'0ŁŐ§¸ŽB`”ăŠr\ńµrÜnwMJŞÔµVŻżZŔ 6‚:ÝXÇŮ *:.^Iî5ąo?(‹0ŤČe3¨¤ŇOžaś±éŰШĆçµ×ŐqűQ92Ý ”Í_.`DŕZ©Şçk5[ő| (nĺÁJJ•R~.uOš<ÉXŐé¦čéä“˝vm:Oí—¸19E{݆qŘć¨ŇdşaĘ;˙帰m©Ä(G‰ŻíE\µ".DĽŚ©Ňjň&ĚđîÓ0Óµ—‰P¬ú§˝|":˝§Ż;éRć̸Â<ż'*­¤3vx‘±ą_!§hĺ°ôíOŮŻîaeJ“évL+CĘ9H} "°}×;Ęó=ĺ(OěđPŰćĽ"ŻŚŁďe(éëk?=zę ?ł’~{eůM–ľI)kଥéŃÓŮŘq†^Ožôµe܆qk˝<ČűČ” őrŇŞÇEĹ‚Çđڧ‘_;*^so˝,lţb3vXlXôNő¬4™®•ŢŚ˘Z ňDVG‰9»‘K¶“±ű˛×ŚFî™î•×®d)€-zż‰zSŽL7SđA.{8%B+âäÁZ´ë¸vĽŁô›˝zš˙đ“ 'Ř0îÓťřFDS¨™n¶9[QVűÚ…+ FŚqáj´ú·w&0"b’ëtłÔvdl`5%‘côuşDDeTšÖËÝ–Đľ®ÎV ŚÍb]Ç50-""b§¸Ë—)Ń÷2DDTF%Čtł,ŐÜm\{ýĹžVŐÜm ľďd1Ó%"ʢuş]—2Ć çřP&Ă{ö2Ń$ɡxy2]*#.QS§KEbť.QĚt)Ět‰˛¨Lwią^_Y]Z^­Ż¬.-×—ŽŐs:JÔ3]"˘,&¤ő2€ú‰Őµ—ŻĎ]űÓÝľ·Q;Vo|˛•ßá˘ÎlţšeX©TnŢľ[ôöcBZ/׎-]řĆeĚŔ{¨Ă'RŐj‹gÎťŻĚT>—ĘA8>%Ź­™,),«ä‰hĘMN¦»ýѶúx'öXüťű›ďo|zűÚ=nŤ/-×ÜďžOçł”űĂúZ"˘t%ČtSŇŁp Í݆x{â@9Ę $®˝rÝu”öĄ:{hhrí¦†™˛(G¦Űqćh0ž?˛xęůóóó5@Â:]@$€öµRUík5[Őľ†ăÚaŽýéeQ˛ÖËIÝ˝ą µ#5űf´ú×QŚr\QŽ+ľVŽ‹€Ŕ¤dş•®ÓíxűÄŽk "˘iVŽL7eóW xVŞęůZÍV=_J [yp ’2ÝXYqR·}ál¶˙ľ”>XřLDDVi2Ý0kLL€r\ضTb”ŁÄ×6ŻU­ /Ç:]""˘,J“éÚd1)kTZ™k D­{„”ç{ĘQžŘᡶͽnsö˛b–*Q»ŇdşéÄÖă@ń˝č°_Ă{äösmĽĺ2'M•’={9)† H € #«DY›ő†9®“Ą{&¬DD”Łܧ‹ŚińcxĆ‹–+GIř,Ş@‹v׎wdFĄŹ'-mZ5ř%"˘ S‚:Ýls¶˘¬öµ WŚăÂŐhőoď00L`DÄ$×éFóé¤ń”EŇç$"˘©U˛:ÝäĄ´Ż«łUcłX×q D@D‹†Ř)n–ňe""˘ü” ÓͲTs·qíő{ZUs·1řľeWŽ:Ý®Kc†s|rS˛ÖËy?ÇŠht&¦N—hÜ1Ó%""‘‰Ęt—–ëő•ŐĄĺŐúĘęŇr}éX=§ŁDDD” i˝  ~buíĺëóGÂţt·ďmÔŽŐźlĺw¸ú7!™níŘŇ çÖ0ďˇnî6Ľ‡şŮlÔj‹gÎťŻĚT*•Š;ăV*•čx®‡‘¨»ÉÉt·?ÚVď~¤ěÜß|ăÓÜ×îqk|iąţŕ~‡$ÝßŃ”ŕ>Ý”ś8\Cs·!Ţž8PŽň ‡kŻ\wĄ}©Îš@Řź.ŤX92ÝŽ3Gńü‘ĹSĎźźźŻÖé"´Ż•Şj_«ŮŞö5×űčO—h%«ÓMŞ‹ujGjö Ěhő)$®Łĺ¸"˘W|­÷ Ű]Ó5ÓŤ}Vř2:ťuĂDD”]92Ý ”Í_.`DŕZ©Şçk5[ő| (nĺÁb¦KDD#VšL·R©Ř´2‰ ţĘqaŰR‰QŽ_ŰĽVµ".DĽ®™n´[ÜhëŞp:›\QOJ“éÚđ–ç”Vćí»ŢQžď)Gyb‡‡Ú6÷˝Ë6î2âQOJ“é¦[ŹÄ÷˘ĂV|} ď‘wh8@鲍¸¬Đ%"˘ž”ěŮËIÉĄ‘@¨0˛ĘA”µYoă1Yú°·‘5–Ô†/w‰¨'%¸OÓâÇđŚ-=VŽ’­L7Т]ǵăDDDŁT‚:Ýls¶˘¬öµ WŚăÂŐhőoď00L`DÄ$Ôé¶'Ó±)Ń—¬Ö%"˘ěJV§›Ľ” €öuu¶j`lë:®hŃ;ĹÍRľLDD”źdşY–jî6®˝ţbO«jî6şÎĂ&ĘDD”ŁrÔév]Ę3ŚŁĂKDD9*Yë弟cEDD4:S§KDD4îéŤČDeşKËőúĘęŇňj}euiąľt¬žÓQ"""ĘÁ„´^P?±şöňőůŁ aşŰ÷6jÇęŤO¶ň;\DDDý›L·vlé…sk÷P7wŢCÝl6jµĹ3çÎWf*•JĹťq+•Jt<×ĂHDDÔÝädşŰm«Źw?RvîoľżńéAîk÷¸5ľ´\p?Ď$8Ľ©—w÷QG%¸O7%'×ĐÜm·'”ŁĽ@ÂáÚ+×]Gi_Şł‡†&®ýéöŠ–Ň•#Óí8s4ĎY<őüůůů ať. @űZ©Şöµš­j_Ăqípţt‰úP˛:ݤşXWˇv¤fźŔŚVźBâ: QŽ+"ĘqĹ×ĘqşÝ5I™®ýŰŁ_8%öą•®ŰFDDd•#ÓÍ@ŮüAŕF^ •ŞzľVłUĎ×€čV¨”L7Z;‹răhMmÇîu‰Ň• N׊ćťčXzĐc.(ÇŃĘQ"F9J|ë[W/ĄN—ť÷QXdB”Łq»†—&ÓMo¬´2×@l|u”ç{ĘQžŘᡶÍ}ď2/‹4T}_&¶¶·¶ďm˝ů4Öß[˙ń{?.z+ŇlmoŻ/z+âJ“馓V=.@ÄSŽ:4 ŹáO9*˘ß ü Ŕ4 [ŰýÜ϶ţîzí µ·ţň­˘7ź&_ă— ô{˘ŽĆú»ëEoBĄÉt­¤ ŔH ĘF_(ďŃAdu”¸ÉqŤöaOăoýÝő«—ŻvťíĂ­Ăqĺ(ĄxrÓĐ…5t=ŶÓĎťŮ"ă©™n¦¦Îąěáçc|VŹ ´h×qíxö÷÷™ÝŇhś~îtĆ?“Ď®r‹Ţpš‘č‘ý,­ŻÔíą:šEĆP 2Ýls¶˘¬öµ WŚăÂŐhőoď00L`DÄ$Ôé&µ˘ęÚşŞcŰf˘A¬ż»žĄRęP¦;Łz}đËÚ·ÖŢř“7ŠŢW*™Vör K[w˝ľRń"㦙n†ĄÄf±ŐŮŞöµ¸\Ç5”‚†(Ŕ>5€Ëňe{ýeşĘýěÜľđŤ çżńýľqáĆ÷oŘ—ŃE2É!zLŁdşY–jî6®˝ţbO«jî6ßw˘ˇę#Ó«Ó}ë/:´«RJ˝őo…s˛z•דt“ÎđŘY˛ bﯿřęĹq®Ę MH¦kŚÎń!*R™®rTüĎ:Ë_9ł*‰ÓĎťľzůęńúń0îÚ°]Š‹‰Ét‰&R?™®O[“˛Ř3_;s뇷Úç9óµ3v$|7I8glć”é·~x«ăúŁ“4…ĆKq?Ô>Üúđxý¸Ť»ö$)-C’éM¤>2]×qc­—Ł!Đ ďľç GN?w:|÷Ě×Τܧť3:sŇôö—±·Ú]łö8Ë±Ł¶öŮő·fwQŞ fşDă¬ĎL÷đŐđÎ{wbó‡3ÄFN=sęÎ{w‰wŢ»súąÓí‹·ĎigVŽę8=ş’¤őÇfk_ŤVIôe˘2ÝĄĺúÁ˝ą@ xđÉŢŞE”Euş‹—Ło…#§ž9•4Ď ÓSZlE§$ŤÓ*ö'Qă†ĺĚEʬ&'Ó­źX]{ůúüŃ…°?Ýí{µcőă.•V.­—{ ş›żŘLšgé ş¨Sôčµ)r˘ĄĘĄ‹»%ëO7i©Ú±ĄέaŢCÝÜmxułŮ¨ŐĎś;_™©T*wĆ­T*Ńń\#ŃPś~îô~‡ŕţ×>Ąý-d9ăj‘í:ÍżůÁćę—Vá`őK«›lfÝţ+č_ěá°Q3ú/efŰ bířx>iąÝädşŰm«Źw?RvîoľżńéAîk÷¸5ľ´\p¸Ip×®vŮ/Ąëç‰TŽŠµ?JiŽkHµ˝˝˝úäęöögý­¬¬D_†’ćLšŢŢb«ý­č lBUR}¤›˝.rúąÓíw•%ÍE)ętSrâp Í݆x{â@9Ę $®˝rÝu”öĄ:{hhF…(ĺ«Ď'R PĽĽłłł˛˛ΰłł“´xŇśékH_ą]6ĺCiڰ!U_Ę‘évś9ŚçŹ,žzţüü| °N  }­TUűZÍVµŻá¸v8HşDŁŃ_¦ýAŮř¤‘ôű2|+6Oă“Ftm)ź›4gʲ¬śŤ–K!ú5mmoőZş;šEĆP 2ݨ¤TŇU¨©™VoB‚pÄu”VŽ+"ĘqĹ×Ęq%°ý ™¤?lű¶Ň×~Vt<ś'§Ű‰í3§,{‹Y2Ĺ ţěĺq“ľm Göv÷Ćyűé33­˙O?wşľR祐Ń,2žĘ‘éf lţŠŔ p#/ĐJU=_«ŮŞçk@ t+TJ¦†öXčíŘŹP8݆ę¤ŔŮq‘”q"«ŹĘĆąl¶ë¶ŤóĆST,ÓíuńŃ,2†J“é†é`R*ö ĘqE´r”QŽ_ÇúÖ•ŔK)ÂęÚ‹_Že)]Żĺi7ţě†çyEo5MgLË{Çü!ĚĄÉtŰÓͨÖÓ0Ű2YD`㫣<ßSŽňĵmî{—ű¸ă7)Q®^ľZô&uöÎ_˝Sô&t0ůAwž˘,­Ú\ €§uhĂ3žrT8Dż17řłDÓ>! ÝĽ}·čM *‡łĎž,zşČáá٬ÓM*Ś5"‘@ĺ=ňđŢ#OÎ۬7ĚqŤöaODD#VŽL7Óă«rŮĂĎÇř¬hŃ­©}îoض9ĺ­ŘŹ”ERZ5Ń„)Aťn¶9[QVűÚ…+ FŚqáj´ú·w&0"bęt“ZQel]ŐÓ"ڞDDSeBž˝lďÍŐľ®ÎV ŚÍb]Ç50-""b§¸,_&"˘Ń*A¦›e©ćnăÚë/ö´Şćn٧ů‰TŽ:Ý®Kc†s|rS˛ÖËy?ÇŠht&¦N—hÜ1Ó%""‘‰Ęt—–ëő•ŐĄĺŐúĘęŇr}éXéűŁ "˘I2!­—ÔO¬®˝|}ţčBŘźîö˝ŤÚ±ză“Ič‚&Ŕ„dşµcK/ś[Ă Ľ‡şąŰđęfłQ«-ž9wľ2S©T*îŚ[©T˘ăąF""˘î&'ÓÝţh[}Ľsř˛sóýŤOr_»Ç­ńĄĺúű…%Áě:—h •ŕ>Ý”ś8\Cs·!Ţž8PŽň ‡kŻ\wĄ}©Îš@RúÓF\"˘)TŽL·ăĚŃ`<dńÔóçççk€„uş€HíkĄŞÚ×j¶Ş} ǵĂAúÓ%""ęCÉęt“ęb]…Ú‘š}3Z} ‰ë(F9®(Ç_+ÇE@`’2]ű•J%ü¬čxtJlzĘxúĚDD4%Ę‘éf lţŠŔ p#/ĐJU=_«ŮŞçk@ t+TJ¦V¸Fűé‹ÖÂĆz¤O)+nďľžËDDS«4™n)¶çť-ÁÁ?@9.l[*1ĘQâk›×ŞVÄ…—R§›±żöĄÂ-LZŠ—hš•ć‰Tűűű6b…#QĘ"±CĎ×°}×;đ|ŠŰ6÷˝ËKŚqwY‰rqöŮ“ąŻ-\gűȰ·¤§•¤ĚśďaÉ}ŹĆgóĆS Z/g!­z\„Yěˇa x ĎxĘQáýĆÜöăŘ[Ś»4b׾›·ď˝EăĄŘ2Č·ťůěł'Çö›ÍľŹáśÎS %«ÓM fFDQ6úByŹ"«ŁÄÄÝČý»FLî}؇±6%î2Óh´_‹ÇůęśqŠZŰ]z€)×—•´ĺYö"ËΖ÷€´+G¦›©ř —=ü| ´"îA¬E»ŽkÇűÖÝö13#.%–µOŹ]×—vÄ.NÉľÚv˝^@“6¬ă'¶omöŐfÜňŽs¦Ň,“ľť÷‡ ĚSŽI×0â=Jů¦A 2Ýls¶˘¬öµ WŚăÂŐhőoď00L`DÄ$Ôé&µ˘ęÚşŞď™‰F)%†eY$=6÷´ÚěŮÓ<}důYv0eÎ,óô·ďé‹Űř—qk{ú¸ţö¨ż/˝§_  ™n†ĄÄf±ŐŮŞöµ¸\Ç5”‚†(Ŕ>5€›{ů2Ńئ/á”AÖÖÇ[9.2ěőg_¤×•Ź%eŽ{Ôß>–ĄŠ:/%Čtł,ŐÜm\{ýĹžVŐÜm ľďDckôuşy5[͸©Iĺ˘ý­mŔe{Ý÷ŚydĆ}dKňZOű±š¶hšŃ„dşĆá"ĘjôWŐAJq˲ď˝îc^[Â9$ĄąOwĄ¦Í€éNöĹ“ćěű6ÓôĐ2xú5‚e»ndĘAË7ÔŤ,ëíXŹ>ŕVMęýľ’éQTJťně­ŽÓŰOZs×Őć»/Ńń?.űŞrŮ÷ěówť-Ö–¸ŹoaHßfĆ5ô1[ŮSđÖł…·¶[=ËŻ·»´sďÎŐËWŮČ–˛¸őŢć™gVo˝·™>›=©nŢľ›™'[”˝™»ýOrŚů˝ąC-Ä.¤„<—-Ľl?¶1n}hÇ×ß]/ä½¶oĎDeşKËő{s!@đŕ“Âş©'")…EoÚ4šÖËę'V×^ľ>t!ěOwűŢFíX˝Á¸KTů†!Ý%UŠ}ĺľ0x÷¤4˝ Ą/U;¶ôÂą5ĚŔ{¨›» ďˇn6µÚâ™sç+3•JĄâθ•J%:žëa$˘É7yŃeňöhüMN¦»ýѶúxçđ3 eçţćűźäľvŹ[ăKËő÷™Ńč” N7%'×ĐÜm·'”ŁĽ@ÂáÚ+×]Gi_Şł‡†&”ţtűĆţ (E92ÝŽ3Gńü‘ĹSĎźźźŻÖé"´Ż•Şj_«ŮŞö5×éO—¨%«ÓMŞ‹ujGjö Ěhő)$®Łĺ¸"˘W|­IĘtíGD;¨ŹuVť!iúŕG•&O92Ý ”Í_.`DŕZ©Şçk5[ő| (nĺÁJÉtĂRb>Ăń°č¸ă8»Ż'"˘tĄÉtĂ 21• ţĘqaŰR‰QŽ_ŰĽVµ".DĽ”:]vĚGDDĂPšL·=ÝŚj= °-“E¶ďzGyľ§ĺ‰jŰś˙á$""JVšL7ťŘzÜ ľ¶âëcxŹĽCCĆ\""­’ő2”T®kD$"*ڬremÖć¸F ű°'"˘+Á}şČ?†gĽhéńÁsU+@‹v׎çζĄ+}‰¨“Ôéf›łeµŻ]¸˘`Ä®F«{7€`#"&ˇN7©U8 ¨é/‰¨¶ăš;ŢŇG‡«-¤ŁßKO;2y} ˘duşÉK h_Wg«Ćf±®ă€ ±S\–/Óä:űěÉö#řТ÷»4r‰đÉ…(A¦›e©ćnăÚë/ö´Şćncđ}'Oá5±ŚůAŰ<ţ‡«tÝîŽ˙!±rÔév]Ę3śăC4˘R,<Ű·Â’ĂčRŃ9“&Fďřą}\ĂŹ‹.ŰÓ.t]0ŻŹî¸§óŃXńlűµďKÇm‹ÍĐßaIÚ†ô#Óń¤,›ň)7{2LH¦K…Ë÷0Ş”đE’¦Ű—yŐ¦GŻŽőIó cş.qµ)G/ăî¤Ď“ň´oFŰßń°týęłďc›”ĺ°OŚ Ét©X¬Ě› cŘŰyŻ‹DçpwFvąOú 7 ëa䳲/;Č·91éRnŢľ{ć™Ő[ďmf˝±4菤áýĆAf“´ńŮ?ş¨źŰ ŹţC_vŞ~µOT¦»´\?¸7>a7őŁ=â2î.KgşRçnüŕGoś÷Ž›=““éÖO¬®˝|}ţčBŘźîö˝ŤÚ±zqwřq'[Jhé)JźyôxąÜ5Űqµ=MďiS‡şHŽkč{ى¬ÇŤšL·vléÂ7.cŢC>‘ŞV[Ĺ"GĚtK$Ú‚4ălIăh«,M[Ó”mČqÁŽs&˝,‡+ă‘ďă8D۲őqX’v6÷ełŇÉŽ¸ZĎ,ÜÚnĄÇëÇí>ďÜ»sőňŐ˛D¦Ú±ĄŐ§N·=Rvîo^ţ“·r_Ç˙Ő~őÁýś“ŕ©íO·× ˝ĺ:ن͞Eí’ĹvţÁ{s ÜÂŽëĎ=ÍÍq>űěÉ·>´ăëď®ra‰^ëÚ·§™nĘ˝(áš» ńöÄr”H8\{ĺşë(íKuöĐĐ’Ňźn߲|»™éeQŽ:ÝŽ3Gńü‘ĹSĎźźźŻÖé"´Ż•Şj_«ŮŞö5×ŮźnŽq'Ň( ý Ě5Ç<Í-j GsŃ*Ůł—m>í\…Ú‘š}3Z} ‰ë(F9®(Ç_+Ç=čvפdş•®Ă·˘›ťž2ʚ˥§L·čŤĄ¬nŢľţ+z[hFóýň,˛Ę‘éf lţŠŔ p#/ĐJU=_«ŮŞçk@ t+TR¦Ű±ř761ú2©¸¸ă<¶ďż¤U•3]"˘,J“éFłÉÎapđPŽ Ű–JŚr”řÚ浪q!â R§›Ôý_Ň<Ź™.QĄÉtm KĘ [OĂlËdAë!ĺůžr”'vx¨msŇ…A}sÄ7$Ět‰˛(M¦›Nl=nß‹[ńő1ĽGޡar;ŞýŁ©dńÇ 3]"˘,rşŁ¬ÓMĘŤ‚@$@…‘U˘¬ÍzĂפűňFÇ!a¦KD”E îÓEĆ´ř1<ăµ=ăŕYT €í:®ď(PĂKC3ŢŹŰqţpUayO«OĽOwLěÜ»Sô& ×â‰SEoÂ@JP§›mÎV”Őľvኂc`\¸­ţíÝ€ Śä:ÝěÓcł4°Ę>[‰0⎏«—Ż˝ DCtóvąnÉęt“—Đľ®ÎV ŚÍb]Ç50-""b§¸”/Óa¬Ó3űą˙#E˙q Ş™n–Ąš»ŤkŻżŘÓŞš»ŤÁ÷ť,fşDDY”ŁN·ëRĆáź>MŔϱž°N—(‹’µ^Îű9V”F\"˘,&$Ó\ý÷ßĆj“lýůůQ~ܰ1Ó%"Ę‚™.倗(‹‰i˝ KËőŐ/=m˙--×kÇę9%ę‚­—‰&XĄ˙×ţVl~J2!­—|噯\ţÓ›ŐY®ť˛µ˝U;¶ÔřäA.GŠR0Ó%š`±†ˇaL­T>{+ŹN¤v’é.-׿ţű—´o´oŹ-^řŁË•™JĄRqgÜJĄĎď3]˘i‘Sq»š”L×4>Ůqg«Ć×áŔw˙Żż©­ D­§BBžXXZ®?¸ż•㡜fĚt‰˛(Aë唜řĐüü'o?őOľ@9ĘĆ×vż:x†řŕ§ď<ůĺLr/C[~~ÄŤ™ËŽ­—‰¦A,‘Ýß˙¬¨ŮŽÇ¦P»rdşgŽcŐÔžrç_üýŻ(Gá10ű4ćŻ<ó%p¸őŃNă—o4wwň?śÓŠ—h:Ĺęt;ÖňRT 2Ý,$ăë˝_5ö~ĄM ®ŁMß˝rý{?@8°ÓĂńßűzç;eí´vć»ŃŰjŁëż˙VtÎöĄÂ0ň[G‰™.ŃÄcÍE92Ý®·łý·ë‹‹µ+—/°-€ tiëă=8 ŔQtu®Ş=]ť«zž×qU6LFdĘËp<zŰgŔD—Z3âM3ĆăěJ“éĆÚÇn\űű‹/|í˘;ë~¶[hß €ž‚˛Ă˝‡{­ˇ“C/CŃ Ú1 Nj”Ťa¦K4ń’Âj4â˛N·«Ňdşé]((OĽćŻ›@9hzŘöĚĘÁž·Wť«jßËţéöÔĆÜ1âM­Řµ™±6]i2Ýt<’ťżkĚ?1×xčuŘŰmĚÍÍ%,§’„µoĚt‰˛(Ůł—9ĐžV@óˇ ů°Ů>Ţ|čI ŢCO4z¶üąĚzŰ1âeQŽL7Óă«ÂňdeK•÷ţnsá‹«‘rfŽ{÷’Ök“mŚłŢľ,fşDDY” N7Ëś ĘUUďłř ĚÍÍÁF\ :ÝŽĎÍ/¤¬0 »6’Ę2>ÁqÇÄâ‰S7oźň?Č·Ţ+zß&BÉž˝śDQćž›bnnnnţ‰ąą'ć„ăáô…/Ôćź[8RËńÓ‰Ď^&"ʢ™nŤżŰyăő—Ś´íč*eDÚ‡öÉVs·Ń÷ÇQ 3]"˘,ĘQ§Ű•1&ßă’‹))[ët‰˛™L—ŠĹ[¬ť{wŠŢ˘QXÝ”ś8\Cs·!Ţž8PŽň ‡kŻ\wĄ}©Îš@éO·Łž‚ÜřGÄŕ}şDDYŚ:Óí8s4ĎY<őüůůů ať. @űZ©Şöµš­j_Ăqípdýé2ľ&aÄ%"ʢ°:ݤşXWˇv¤fźŔŚVźBâ: QŽ+"ĘqĹ×Ęq,™n%"}şiź3e/b‹·Pű‡¶/ŢuĂĆët‰˛(¬N7™˛ů+ŔŚĽ@+Uő|­f«žŻ%Đ­<8P]3ÝX†ľěąÚî˙2f´±™“>(ă¶%mŘřÇ]fşCuöŮ“Eo壀g/ÇňĽaé Ç\8PŽ+˘•ŁDŚr”ř:Ö·®^îuşIŚ!´™šŚňjÖéχ[˝ D”›2Ý”,€rĐĘ\ "°ńŐQžď)Gyb‡‡Ú6÷·ĺaźöH ~I‰,…q‰˛(¬N7‰Í_í?ń˝č°_Ă{äĐŽj˙ŔřáŽ3ÖéeQXťnRĘhD$eŁ/”÷ČSŽňŚG‰9»‘×)Wö˝F÷Rü`¦›Ż­í­őw×‹Ţ "Ęߨët3ĄĹŹáÄ×Čđłz\ E»ŽkÇÓĹŮhqqűÄčü±_]Ë–“>(VŽÝ5Žö:áX§›ŻăőăEo ĹH3Ýls¶˘¬öµ WŚăÂŐhőoď00L`DÄ$ÔéĆâhú ŮßJź3iÁŽ“˛l׍+ڏ9˙Ż›ú6vĎ^¶wčj_Wg«Ćf±®ă€ ±SÜr•/O"Öée1vĎ^nî6®˝ţbO«jî6†pd¨Ět‰˛(ŕ>ÝôĄŚ1Eęët‰˛Čˇx9÷^†¨tq‰˛Ă:]*ÖéeÁL—rŔL—(‹1Ít+•Š;ă†Ă˘ŽeÄL—(‹±k˝  R©üÍúŞsU8ĐM]}˘Ę‡Ź9fşDDYŚ]ëĺJĄň÷3ńĽ=_<íÍUçö~ŮřÁżűŮŤ·7^ú?˙qř\*ĺ g<6švž}öäÍŰwSÖEĘJwöŮ“űűű=ý”äp˛‡=ť<ÝŻNűűűn}h˙¸yűîÍŰw/ľz‘ţFŔĺsóňsůßÜĽüĆÍpŔĎţű˙üŮÖ˙üŮ?řw0^ČvRÔÍŰwłĚfO*;ł=͢'[+!Ę]ě,ĺĂpŘëÉcŁo^í»#ÍtSęqŁk¸zń÷?uY>tÔšRîÓKÎť÷~ó©˝Zmá‰Űó~¸—Ňźî€ĺŇ,ÖîI.EÇ=­„…Ő4$ă]q8>C{VärÁuťnÇ™ŁÁX9¸yűĂęUóyŁúÓő˝O5Î]h8¨ÎUçţí••ń;«ŽúѸ §ŐŃ}ßýéuTřUžĂqćujÖz9©M˛€ăjOOÜűŰú˧˝tŞ:ż€Ú“ęŻ~)_XÜ›_XřU€r\PNÚGT*•čgU"b3Ǧw\śFďěł'‹Ţš:ăp•çp|†±Óc‹Ra­—STç”öŚ;§4óI]«ˇąŐ퍹fٱň¤÷[OĎýçuüó5 HB×~űűű±ňᤗ‹‘ۧ,:žŽ}·{bÄĄB~•çp܆±3¤ďćśdşaî”DOhOĚňŠ©-XŘŮ®ýĺ+ycűź_ÜůÚ˝ĽR˙ÉşxžçĄÔéŇčµźŚ¸T:ăp•çp|†O’ţ.P<‘ʶňŠŽD)ńO{Ţžř˘ţŰFuŻŮX^Ů;¶(/&Ř>íí0łŽĹË6©eIr^˘Q–—ʨđ«<‡c5L:Oú¸LV§›D±C8jᓝÚýmýůyď·žF ĘQžöäČ"O{Ş—2ňX ďöéŚ»ą°±v»iy'.¨đ«<‡c5L:Oú¸LV§›RW*‘µş×|ú[gpçź­yGjĘUbśúË7îüł ž‘ÖË}n9«l‡jđ¨yóö]ć»TÂŻňŽŰ°ý$éď7ę'ReI‹mÄť«ÎéŁóő˙±ą7żĐPsŐ0Űm¬ţt}®ŮŘSsnĺ`/ő>Ý0s ´cĄĘv¤ăÄöĹiôw©ăp•çp|†ígHßIĹH3Ý,s*žöŕŔÓŢťp jŰśúowŕ(RŰţŔ›źośxĘť«joŻ:·ĐzJF˛XĽě>Sb*ĂmáXÎLŁWřUžĂqFOŹA.J…={9‰Đž®ÎUŤ§«sŐ;żu żő´‚ >÷4ăi é©N—¨«q¸Ęs8>ĂO­qĽO÷Őµßi=m*ÜĆ®ăT´\ÚÓő´’|[đE~•çp܆y^pöëđŕâ«{~¦8M–žÎ·¤ĆÇ~ŃĎÖçp¬†=ť<é´Z mmoŮąŹ×ŹŰůvîÝY0čŇxé/ȵ'ľ)/ĂńX荍ĺŽ ©h| )ţE×ÉřJDŁÄL—ĆÔŕ7ZJś]Xř †d"Ę.ŤťöJÖţô˝¶&˘!ań2Ťçruýe˝DDůb¦Kc' ;ŕ°ąrřn¬Mr´”˝d˝lşLDĂĂ Kă%cśKşy·§y:Ž3ĐŃđ°x™hDt‰F„A—hDt‰F$±!Ő•×®˝m4-x˛Ń”čt[7c˝e4=x˛Ń”Ý·>,z“&ët‰F„A—hD[Ű[ëď®˝%DDDDDDDyř˙LźŁť˙IEND®B`‚fox1.6-1.6.57/doc/screenshots/xfe_small.png000066400000000000000000001275431326741342000204360ustar00rootroot00000000000000‰PNG  IHDRŹ$X#*ťbKGD˙˙˙ ˝§“ pHYs  ­#˝utIMEÓ† l IDATxśěťw|TUöŔĎ+Ó'“Ţ{ˇ…Ţ;R¤JA@Ć®®®uîĘŞ«˛Ë" ®ŕb)Ň$@ !¤÷žIOf&S_ą÷÷Ç Ă0 ™ĐŢ÷“O>sß;ďľűŢĚśą÷ĽSčččŃŁGC·X¬Ła »ąŰ`Y1¦Đ ›|öDň zôčŃë˙±Ţ`0´µµ!„ś„ärą‡‡GYy™™ ¬mánę€DDDţpŤ†µqŘ ^FŁńJ2rąśă8ŽëZ$)—Ë- ƸK‰Db0JJJh°-Ő5ŐgĎśeĆI.&&fđÁş6§ĐÔ4X®őŠDDDîL¬ćv®®®®©­ đč,`2™âbăRϦ†‡dë3«Í›|29>.ľó^žçÝÜÜĚfłŐfĄ…MËŐÖÖZ­V'QŤF#L¸¬,6š­ QR3/ě•IÂĆ":ĘO¦3óů5Î=ÜÁŘ,6ž§ ±W˘L&ë,PRR˘R«`ŕŔ ťňóóŐ*µŹŹO||ĽÁ`pÚk2™X–Ą( :´A©¤óJ–ĐAbYać%UKB<é˛ $«KęĚ Â}äżĺ´]ßU‹üń`ŁŽ“Ífë,`±XĹ‚x¤Óé6lŘ`ß%“Éžţy‹ŐbďjçÎťC† €˝{÷0ŔŰŰŰľ„ěĐV …b衝µUPP Őlo01`±˛c݆sWJô&›¶Ĺę©–(Ąd§Ôdĺkš-ń!j–CĄőćwCDDD~§0V–CŇž Űď÷|ooŞŐęçźŢŢ$ 2 ŕůçź_ż~ýŃŁGSSSgĎžm6_Ň$tOX†±€8_hÝĎŻEoK/hâ¶Í˛jÁŔr¸w¨˛UoŇT´]Xe@W0›‰Ü°63 UĎĺ'Nš8ďľyÂ믾ţĘiďđáĂŤFăsĎ>çááńî{ď ;;ÚĘĆŘŠŠŠ:[ŮY– Ç›Ě{MfĆSM×4 F›ĐÔ™Ür}t°›ż§ 0€¨ UQ•Îdf{~"""8X†áĐUx Ť9Bx}ŕŕÎőőő>ľ>&“É`0řřř8îęĐV<Ç755u¶˛űřřËC†AF+$A IđŢ{˛ÚßKëZĚŔňČhe¬ [®5äWęŕ\aS‹ÁĆ#qn%"r'ĂŰĚ_úš˙íőżĺääŘ›ŻĽúŠR©t”oiiÉÍÍ^·ÚwaŔ?|˙CzZú»ďľ{>ăükŻľöń¶Ź:´I’*•Цť† …˘ĂĘαŚĹ í«‘&gÔć—ÂŇ©1_lÄńŚĹVŁ5„ů*jęôĐ7ÚłµŤc¬˘‹–Čť ĎŘxÄŰ›ăĆŹë•ŘËŢ p|̧P(úőďg×VcĆŽqě cđÚ__óđđ0q‚RĄ4™LŽĘ®C=Éĺň¤¤¤î¬ě g2[`P\đ× 9ŔáÔ*?wiyťˇ¤Jg2[MfëŢăĆĄSă «¤ąąŐ„Aś[‰ÜÉđ ĂńfłY§ÓĹĆĹĆĆĹ^Ú‹x»¶jimiji5z”ăáµÚZ–e€e٦¦¦ĐĐP«ÍZ«­€Đ†eÚÚ˝˝˝ámEQ”››[g_R…B!Ľ@gł0đkJą}o~iłđb˙É2á…Í[ľÍĽŢ ""ň±6ŚxŤFŁT*==<; DED©ŐęČČHµJŐY W|/„QLtŚŻŹŻ›Ú­ł€ŹŹO^~ص•Z­niia9gُ¶N«­Ó6·4WW·¶5”\ÜY`ÄÚĂjjj:[˝íäćĺ@ScS÷]UUUuŢ(‘HlŚMxxÉPőĎľ‹®·l˛0î¬óC‘?×ŮťíH7Їn^_ŇVjŤ×COľ|3Î'"""rmüoó›ö×b‘?˘¶ůc j+‘?®µUKsٶşBřĂ;ô#|˙Í'W{¦†şˇ“zmŤăvˇ+ˇ[«Ĺlµ¸‡ć8VčĘlľb0;ĆvĂˇźż»ÚŃ:ŽíÚĐëZµŐuµ]<ćhkíđ˙®ýFa2¶ 7§Ą©‹ěÝ““™V\}Ą˝•eĹe%×7:‘»][‹Ý#ĘţQwäľ\®µŐWźĽîěIáŹçů Sf@c˝öjĎôÉďťdgžuÜ.t%t›ť™–—•ᲫćĆúĎ·m:wöäţvşćy®µąńjGë8¶k ­µůčÎť=™žň[ĆŮ“]Ęěúl«đB¸öEʉ_ýeĎął'“ŹíŻ,/ľŞcŤFŮtĹ€đ¨Ř¨„ë Č]Áń|G(‹ýŁîČ5|ą\ç`Jełć/ł7?˙x㫟^ź:~0'3 †Ś7pŘ®Źż—Źźc?çÎśH?sŞ*JíÝ?ô#˲V«eä¸{şď-ˇw˙Yó—}´q=0Śíđľ=Ő•Ą0}î’ŔŕĐĂżě©*/€iłyxů€Ĺl:ôów÷Ţ·äËm›C›´ý ?{ęxlŻľc'ÝŰÖŇ´ëóŹ ľwŇř{fn{˙í€ŕP:âżó˛ÎY,ć„Ţýýü]c˝Ví¦Yşj]÷ĂŰ»kÇ’‡ž”Éäă?(M?ó›RĺVQZzĎŚů9™iEůYozkőş—„kO=u43í4$ 9lÔÄ­˙~# (¤ˇ®¶ßŔá#ĆN>—šśžňLźsXdL÷g=aZt\bVF޶ş"<2vď®OëµŐî^Sg/*Ě˝ĐX_[W[Ąq÷ś:{I~úVßÖâ¦ń6{‘S?™é)$Eö0¬¶ŞĽ0?Ë×/çąĐđč?î2¶ë=Ľ|¦ÎZ“™“ \Eʉþ~1 }şˇČ]Čo‡÷䜀ác&÷4¬óŽ­ÔwS»aâ´ą±®>6®µ•Őb”¨ńSű$ qüíÍ>ö‘§^€m›ßv©­ęj«…~Tj·eŹ<ť~ćÄŁĎĽ ÂFˇŰńSfS$5p‹Şvúx˝¶ş´(!^ßÖjµZě˝-|đQc»ÁŢĽĺăŁĂżě6z˘D"5™Śń‰ýz'íßűÍ#O˝¸}ó?ÇNş×ĂËgŐ“/Ŕ¶÷ßĎLŁŃ0`đČŕ°ČŹ6®ĎËĘhin3qzAN¦—Ź˙¬Ë…P¤î±Y­2™‚ (’ç9‹Ĺ?uÖÂ#űż×ÖT5á|Ú©Őë^˛_{fÚiű‡Ťšhl׏÷°@đG׏;9#5yŐ“/’Aöŕě<Ďs‡1"fÎ_†1ÎĎÎČ˝Ž"âŃg^-Ě˝ť‘JK$˝ú čÝpiQîůôÓŞË=‰Ă"˘ŹŘŰoŔ°Śł'[§­á96ăěɡŁ&DĆ$dźO-Č9›Đ'ĺÄá¦z­§·oAnfeyqďţ\ŽPän`Űűo QĆşÖČĎΰ« A[aŚ ú¶W?­Rk>Ú¸ţh+ąB)|‹:SSYöéÖ ŕăŰE>f'CŻÔĎ50däř9‹V „¶o~{î⇺Î9ź6kÁAˇ@ÓtDt\eYqDtf2ÄÄ_ö™8ôów¬mÔř©:]‹ă./ż–ćĐÖT†„×]48ţĽç ŤĆ&LťíŇPWòL@PhSC]»ľMăŢEř…Č]Č#O˝(|Ĺ„IEY‘ .Cě2Aa*µ¦‡ö4_—Ä&ô™6÷~Č:wĆĄ0Ë0 őµ@‘”Ź_€B©j¨Ż­­*V‚rąÂ ok7čÝ4îÝ÷f4ęk1ÂwOa˛#t®q÷¤HŠ {ú ¦vs;“|xŘčI]öVR”7sÁ2řfLJŽŰ ‚:ká‰#żLś:G"•Ć÷îß»˙˝®ŤeŁĆOM9ńkT\"Ç2,Ç@SCťŮlâ8V"•€\ˇl¬Żő»¨’ •0f…˘‹ÜfIÍ\°¬0'ł±®ÖĄ¶š˝pyt\˘đşŞĽ¤WßÁa‘%9ťă@ĺ ĺŘÉ÷FDÇ·57"Ü…/ňÔY ˙ţâcł,·oQŞÔ§Î k¬«ĹŔ‰Ó‹ňłúľ÷ŰOg-xĐĺÍą;IčÝúÜ%u.ŐľŃb6 {µ«Ż<PIIIcÇŽeć×ĂÇ íb5GD`H¸SSřzćÄŻ5•Ą#ÇŢŁPşČ¨kk)/ÎŻ©,mlĐĆÄ÷ Ť9ulżÚÍ˝wżAöýµŐ•fS»`p·ť5•Ą5•Ą5Őĺ –®V(UAd¦ťŞ©,]°tµ\ˇ¤hÉůł'k*Kç?°Š$H‰DÚ'ihKsŁŹ_MŃ!áA(J/o_áĽ‘Ń ÉGöŐT–zůřĹ'ö·_2I‘1 !a‘Ő•ĄEź>~°¦˛tŇ´űT]Ĺ^:âÜÖÚśťq¦±^;sŢRš–dgž­«©Ş«­ ŹŽOěA!á)''ôNNŃŃ˙ôąJ•›ăCÂO˙v¨¬(ĎËÇŻ˙ŕÝźš O/űŰU\Sśźe6µ'ôŕáéíáé­T© ‚PŞÜzőPYVT›É#4dÄ8Ť‡§ÚíŇoťJ­1čZ %—+‚pÓxôî7¨ 7ł¤ ["‘ óy…R-“+C#xŽŤíŐ·űá‰Ü%&¬…ϰŻPęÉ#5•Ąc&L—É$AřúřqÇ25•Ąs­ :e¬€ĚłÉ÷Lž`6›ýőWbĹŠŻĽňJ»±ý…˙*FŢÜ<ľúßćYó—ąif˛\ˇt-'"r× •ĘFŤźŇsůë˛[‰ôŃSIDÄ Š¦í֞ଭâůNY®DDDDn1-!ÉËüuśµ•R îę›’§FDDD¤çčpŞëଭ&Ž(ä\¨«o¨¨w®ő,"""rłáŕ·8k«6)%óRFcmyVPd?hÖłĚ3™ŠÜ$FŤžXVă"?¬Č]BVöüě ][+DĹ^2 ĺe¦ź9íXÍBä¦ŇÜÔ7`Ţ\wQ[‰tˇ­xÄoßüvpXäşż¬ż4ðlٲ§žz cÜÚÚ&l“H$Ť ?I‘îŃ6ę Ë»F?~p·¶ÉuňśkăůłéYCőŁi×Q‡c|1ĺ6A’NĹľŻtA!‚tá"Ś HW’Nh«+~ŘůIlB˙ácďim¨ ‹éÓ“őžç3Îśl¨«€Öć¦)łć‡Ü»kęçŘ1Â+ ÷Äĺh{r÷n%r©ş2ŕé¦Ô6ëoÁşĐV}úyöµwB¢4îZŁsޤ_Źűî‡cRą0Źl¦??·&*2Ľs'"=Älµiuť·kµZôÔ•´¤ŞI%Ĺ~ÝČTÖ¶¶µµ&ő‰a9îxJfEu“ÁÄNť0Äĺ×Ćll pW*ämúöÚ†w/źîĺyŽSËŽ”674÷JŐ6¶u–A~™yنô€’ňę6ŁAĺÖE$*I’…eÚĸE¨˙•Ô™§M.—Ö7¶˛ŇČIФĎ€{EĄç”wy”ťÔ3§eţš˙ŘżăŘŔĐŢŇrŞ6cÁ€{ÇNěŃ|g÷—Űëžzţďľ!ĐRWŐÖÚ줭(’ډ—ˬŐň۱}A!ŃŐe%…ynîžRYn[[—÷żu÷·$ĆG””ŐPr©Ébkjn•É©Ěl2t7?eń|ݏ¬śe_vnˇă^©\.ż÷NQ4A’F ‡ +«8Žă80&HRő—H»ř<8ĐÚRÝŻ_˘ľ˝ečСÚ:­ľąĘM˘38[!Ć‚·€ ›8žçxÄ &×S:"0Póâ_FźÉę.=ä±~ u¦ŢQAýľ ąśutÚ*:Ô'ݍĽ¤ÜjµśvI$ň‘ă¦6H ažç@á0ćUň?üPSSCQÔ AňóóóóóŕľűîłZ­eeeµµµ±±±‰äÂ… 3fĚhkkkmmÍÍÍ%bÖ¬Y.ŻţN o{ďďĎkk*…¦T&{ř±ç{x¬¶±őôŮ,Ś’–ěůéđ¬éăÝÔ—…—ÚŤűʦęu@gh¶Đ4Ëq" ňK$$7jH7gÁéôıJ…DˇT¦e•X̶`ﲚf·Nůa’TŞÔĄĺ•Ó&OąPÚe‡:˝Q§żşě¦vćŽ>xŘääS ő ĺĆö ©Y®öT¸ąĐ %…ąÉG9väŔČq÷46· ÚŞ¨¸0'3mĺÚ? ą1|Cűôډx›_p„Ĺb&Ę*‹#˘ă{÷ŇP_ŐÚZsĺóh4ę¦f]»•ó÷ő6[›1Fł‰ł¶‡‡Ó ŔçŹR™<2Ř;;§016<<4¸_ďۢŐb‚¬oh˛"ZĐ&Vłqě°ľ$Ieç—ůřůyhT:};Ć ˇ)ĄB†1®Đ¶v3BĄBz.ĺ·–&­T.%€H>‘lłŘFŽ)—1ľˇžĄµ:„.ÍšXŽoŃ@­”@›Áİ<%Řŕ\©+•šţzg&Aŕ)3»ł©Ô˛¸^2wŹ «T9«Ú.µÍD\tŇÍůH’”ZĄĆ"xÄs,DZË2Vł…al6› 9h+ę"ŤŤŤ;wî¤iš¦é˙üç?mmmK–,innŢşuë–-[L&ÓŽ;JKK—.]ĘqśÍfŰľ}{÷‡ˇq÷\ű§×Ôn«Ḻ́ěÜE+ŹדB™yĹĂ@©ŞÚů+¤mhim3đo4¶·éŰ9†E3lÓcĆjáXn@ßŘÄxÉH‚ !čçëíˇ–ĹEt‘Ú ‘_Ş˝ŇbǑș÷Śž1yÔŕţ˝h Ĺőŕa0-—Hd4-ˇčšl8–M>ş!töÔq†±@Úéă;¶nříđľ]_|Ä9Dqł Ă0ŚA©Rj«Ęâöí7ŘËËż¦ŞDqe[’# µŰ¸aý<=Üĺ I’úÄ…űűřxŐµšmĚ#F«Ą­Ýŕܬ3žąP*ü>‘¦7I‚°_¬R­Ń[PIuSŻ^±PRŮĐĐbШ$IT×u§§:Ŕß;–ĐŤĆÝÝ]­V»{¸gśËČÍÎVI0ÝĽŹ=äÄáĎ â{€NůëÍ[˙•űý7%đŔz˝ţµ×^?~|^^,[¶lŢĽy“&MĘÉÉąwčEPHřKoü'84bÍÓŻL™ŮSĂ_EU]eM˝·»LŠŔÖ¤őô9–śę$“>rX?ŁŃ4|äčukćz»«,FKü$fĐę¦Ŕ(%& 88Ŕ×ÇEţĽĘšzŤ››źŹ§L*Eµ´č$$j7šOŤs¦ «Ůd1µŹŇ× ×iä`OÎ}%Ü5ęÜ’šäô‚Ňš–đŕ€#'RďZaaŚI I‚B\ŮN ˇOŇ Ż˙;84âĎ˙÷^źţyŽ+Ě» ‘HŔj6WW–Ů%9Ŕ6޵qśŢhÎ:FĺćáÄ#ò\QqîÁú‡cŮS……ĄU6«EŁV5¶ Mo4-ť Cvd ĄżŻwC‹ž¤¨˛šK«ˇ¸87·ËÁcŚkę[M&KC‹ˇ­M/ٰꗛŃd1™-<ĎM]ŰËí­LÇ%ÄŃš–Đr©\&“Ĺ'Äßżt©V‡ö˛7NBSž•§F%¬1ÝÝ”ž•J!—7ŃňµŹ>óęŁĎĽşâŃgŔlćĚíGqĘóé—­őűyçÖűúů=úĚ«3î{ ďç§F]¬›ŰŚR™2.2¸¸ÂůÉ:Ćem¬ŤáxFXżbŚĎsŠöőőÉ/w]°ć1‚7@Ź”@Bďţ=ţ|l|"P4=ůži9)¦Ěś{˙Ăĺđuŕx‹ÉDÇóR™Üf±DÇö±XM!Ń<âÖő3{Š˘F-ި‹ ńZ"­¬ę‘!Ľ˘¶ łşÎ`nŐCĽNŰBGń<`Žă ‚ŕ8cÜ“Y*A2‰LJIĄ2)B¨®©®ŃjőFgMG„TBIHiš$řެß=ľůÁZ­~äČŕŠĆËŢĺ^}űbë™Ôt7µ˘ąą9'·`Xŕ”ѧőđ*ĆÝ3+±Wďożů”ăř« ŚěĄP9»¶5µ6ä§@ 2“đI`IB­-Ť^®–ĎmzE6‹™&PSłŕR§ đój2¸Đ ďÄ„¨>˝śßSš¦.T;nQŞTŤZ©@»Ń‚0VJh__/hÖuç`¬KY«ˇ˘¤AĄP 1$ů·dw7÷¤¸¤śĽ<“鞙лZńËá“<Ď‚IýbŠ<¬] IDATÎl‚ ¬łK+»Ú!Í«×Ęrx ®LKŻšµ0l΢M3Śsa˝.´ĆĽQ×X¸órńěůÔĂĺ%„U â9 aE@Ô×”9Ę«ŐęŽű˘P(ż $I*•JP©TÂ+•JŠ˘ÜÝÝ˝˝/{Š|W€±Ł±ĎasO?1Ń1ŃÝ(ä҉#ű’I’@€T.Ă&Ţ'ÎBEPŢ^®óa;Ž*5«¬‚ *7µÚ­°¬Ž Ô+>$*µ-•Úp÷ňń¸ÜřUVÓr…Ł:Ęd¬zş¬¤ ąˇN˘ ž±hTHXdĎŻ‚$)˙°Ř'_XߍĚđŃc ‚$0F€ ‚$! I@H­ éćp®ËÓ9ŇĂhC§EV—‘–í“CŔjăęšşp0îÉ)⣂$DŹČâj}BźµŤ†Ćvđ ŠŻżÜ7ť ›Ťé0řŔĹĹĄňčÎ-ą3 —­érűĚyQŽÍił#śşĐVr™\ăćď^\áü€iÚ´©Ó¦őÔ…÷ŞLň7Łçß3ˇm[6^ČşĐyW[[[ßÁnČY¤RIb|w®Ć7ŽGUu.ÔŤ#í&k»éZćŁbn^ŽĂ>ý»séč +sU÷áÖc¶ŘrË.͡ZŚ ]mzťq=Šąátá1>yü°Í¨w“KěŤ`Ë'Té)żuÓ<—šŚ]ćÂéąŇ-ćK~‰y٦‹ylî0¬sNfšÓťĽf*ËŠ*ËŠó˛2®áŘô”ß8ŽÍL?íRň~;Dn#WĚoőřăŹ'$\rfiŐ›šZť‹ßä^8DzLŇŕđÓî/ĆMž™Đ'ÉQŕ\j˛c:Śł' Iô,¶ű‡ť;´5•B ŇĽ%űú_¶2ĘËÎ W(;Ľ rÎűúŞÔŚ´Ë;?ŰÂsüŚűřbűú$ 7yF7ÂU%MŤuEyY=LĚĐ=ů9™ľţĄE‰ýşN¸Ř çR“ ›Đ§{1–a r2BÂżţß÷Ż|ڏ_y‘n¸®ZÍ ce/†ÚŤíńé©§ÇO™eе}óé‡P”ź íý×˙ŰlošŚí_nßc&NďŐwŕńC?yzű¦ž<2jüÔŢý/Ĺ<›Ś†ĺkţ¤vÓŘ·|ţńF‹ŮÔ«Ď€1“î¶`Ś?Ţô&T–Ź™x/|ĽéMŚń€!نŚź|ä˙ Ô“G\ýĚ·źÔÖÚ“pĎŚů×sÉ7„Y üđ˝żmúç«!áQÝ«*8vđÇGźyµ(/ëä±yYç¦ÍYÓÜXżçëí0ećÂč¸ă‡~’+ş¶ÖÉÓďűäĂwć.~Č/ ¨¦˛ě—ľ€Ů W…Ć¸ŞĽxđđ±ĄE_ďř ]Ż[ýÔKIžO;•vú8¬zâ/ ËdťK6z?ôÓř)ł˛ĎźM9ń+جVŽc3ÓSű Ş*/ÎĘHel¶UOţEŻk-+ÎĎË:7tÔ„Ř„ľş¶l1›ÎĄž0čŰfÎ_±óÓ-z]kt\â¤é÷]8—˘PŞŽúéˇÇź?zŕŤ»×±“SNüęíëüĐO˝űîya‘»ŠëýÝËĎ9ňŘ“ÇTW•@aŢřúÓWŻ{yőş—ăző€Żţ·YhĆ÷î_lß$4Ď$a&ó\ŠĹlZ˝îĺs©ÉVËeaMgN9yě@iQ|óé–Ů –Ż^÷2˲Ĺ)e>Ţô¦ĐŐ ácŕăMo­zň/«×˝¬­©¬×VäT–/{äé}{ľ1nĘęu/ßsďĽëĽŢ‚R©^°ô xĆĽş—<ýŰŻ#ÇM€Ćz­§·ďęu/ďß»v˝]¸đ? )'~U(ŐţÁÖ˙eőş—żßů?Ř÷ĂׂĚŢo?zűxÓ›kž~ÎĄžq߫׽üńűoŔ€!ŁÉíü“eleĹ‚|aŢ“±ýÂą3Â^™\Îó|Ia®ŮÔţÝ—Ďŕ‘ĺkţôɇďX̦Ý_n›łhelB_ŘóÍ'ó–¬ ‹KěżzÝKÁˇ{żýlÜ䙫׽¬Tąeeś©®,;{ęřęu/żö§Uń˝“tm-Uĺ%ĄEyEů٫׽l2¶——ܤ;/ň‡ćşćV vs÷ôö€Ëň“a|YLüĺM“±ýż˙ůÔŐV …rřI‚—wîéé-WŞ”*µĐ‰kÄ%Aět"Ŕ˙ÝôĐÔX?rÜ=0~Ę,‚ †Ť™´˙‡oĚ&ăâĺk=\A¸T•˙÷?o9ţĂ÷^ţ˙6tł€-/Éźłh%řőî7ŕb˘Yű…c ^>~ý ?źvj”YA«+J…űll7@eYQxd¬Ú5hŘXŤ»' J9q8'ó,Ŕ•rQáΆŤž¤T©Y–ŢŠ!#Ç łŕ¬Ś3ýdű?Śżůl‹BˇÔëÚfÍ_ ¦Î""2&>"*.?űĽ ?aĘě[·FäăzµUhx”đ-Ę9ÖiWSc]u奠֖¦†ŞňbP©ÔŹ>ó*\8—âTçމřŢIŽ+Á+a6 r/+Á5ë^&I˛(?KˇTŰ||\ý |´q˝pęŰKIaîňG˙”Đ;)(4Ú¸Ţ×?P ť9oéG×{űú÷I 1kÁ·˘˙ $I ‡€Ż cÉ_˙@ĘÁ?cŢŇÝ_młY-ŃńQńŐ•e4M/^ńŘG×+Uęţ‡K$ŇEË×n{˙-Śq\bżčŘDżŔ`ÁÄ›™ž’zňĚ_úČ ¸g×ÍÄis…ĂFMĽ’ŚĹlĘÉLŕˇ'„¦ý. /&ß;O¸‡ĂÇL¶o´żBsô„i‚Ěř)ł[šŚíúđ¨X %’ŠŇBa×âĺk5îžAˇBÓÇ/@íćýŃĆőý ‰P(UQ±˝>Ú¸ľOҰH’$ýü¤Rą§—/é,‘ĘĽ|ü ^[MQ´Ż‡_«đv̸ďÉ÷Ţ÷ĂÎĆvCpXä=3ć{zůJĄrű8=˝|dr9ěŘúMK˘b{…„_‹/""@¬X±â•W^i7¶żđâ_zňemyVXLRDo—ŇeŐŤŽ‰ĺEn ţ>î*…¬¬ş‘e,ş¦ęV˝µ®¦rü”SPă»/>ž0mŽ·ĎŐeö¸Z®gęúŶ˙Üw˙Ă”§ş"·€I1)™%˙Űüć;o˙˝©©é…^čbnĹń¨Ë j"·’¸^}]ú ôśyKľ…yęĄk>6"*ަŻ×.!rgăüůP*rW™EnRIÇ{A¤RˇPČĄÝË_%·ć=˝öłLž~•–Eî(Ęů÷ŐY[Ťź0Y|,s»¨¬m…R5¸widDDîŚfçşÎÚ*3żňV F¤k–;ź'ľ ""ÎQ""" :ĺ·úm·¶¶G%ĎDn,3fÍ‹NHިmfkÚń=ÍÍbúC‘»Ť»×SO­Ë.»,-Ął¶Ş(/Oę׿sA‡¶¶¶–Ö–č.Jyyyůřtř—»»»űůúmú`{żÁ“Ď ×c€c9Ŕ-MőaţŠ1cG G•””Î1Ăh4~óÍ7“&MĘĘĘš3gŽĹbůěłĎ¦Oźžžž>oŢ<ťN÷ŐW_Íť;÷Ô©S .4Ťź|ňÉâĹ‹Ź=Ú·oßúúúÉ“'7778p`đŕÁ•••S§ţŽ"ÎZtĆü2-ŮÉ.1>~ř™Ú碻ÎÍÉąńß®ýHDţ¸:t *2*&6îväŞÁ}°yóÓĎ<ÓM•é"¤jŤ@·Ú FŚ1eʧŤ&“ÉĐn č"ˇeęŮÔÖÖVw÷Ždr«eřđááaáßě9اß„ žç#H ‡0` €Ş+‹$xĎžÝń$(==ýôéÓĺĺ塇zhذaz˝ľĽĽÜfłEFF.X° µµµĽĽĽ®®.<<|ţüů ĺĺ卍Ťaaa÷ÜsŹV«5jTYYŮěŮłkjjĘĘĘFŹíááaď˙÷@mCŰŽ·ÚX§íĆvýéŁ{ť6& ZZߣRN"0Fµµµóć/n±9ç™űýcÔ7µŰű ~¶Űm7•žz¸AS] ÷íÓWŻ×€^ŻwwwŹŚĘbD0 Ă2,I‘ ÇP@[1K`0ć·1 rP҉‰‰ŻĽň PŐŻ_?XµjUcc#řúú<ňČ# ááá&“É××wÍš5őőőáááFŁ1 ŕŃGU«Ő}úô˙'žxBŁŃÄĹýî~ÁBçrť‹Ä1¶îJTŠôT[!„¸NeÄ”JĄPÍÔh2^š|ikJíßISĎ#Ś0‚h´ÚÄÎqěÄiůlo€—— çšp±ŘŞD"v ŐU·¤ś8ř§L&OI>|ěĐŹAÁáűö|ŐÔX—{!=2:>4<ęÇď>ďܧ‡O¨®©Zx-“JhŠ4uŠrąőś=}ÜfµŰőçÓOŔŽ­l6kdtüĎ{ľ€C?+Ľďż|˙Őí)(”*mMĄ¶¦Ňb6& QŻ­.)ĚU»i"Łă}|r/¤ŔŻűľĽoĎ—7ä¤WaegXÉجVëU lÜô>--mB‚I$˙Úň%Ź9‚¤ „fN9ďľď‚pňäÉččhÇ 7nŚŹŹ_ąrĺ ?ť#Ů9ŮŤ5UNďěÓŕÄ„©łŹě˙ŢţkŃ ­É<—M uĐ7iHŇŕ‘ąYçć,\.‘ČR’ł6[Î…4«Ő‚2›ş¨=CKĺ´Tn5éĺ*÷Ďş&Źn…ŤH÷Ä&ô).Č.+Îź8uDÇ% Đ˙˛ ó˛$RT”ÝŢqŔô9÷źI> ăč¸D’˘ŔMăAQô…s;,[9™R™ŞĘKşď­‡\…•Ý©Â`gÚŰ».ʤ7čwíÚ%<ĽËÎÉćx.0 pě±V“ÉÄaÄ[0`Ŕ›ĐŻWbA’c„1EÁ‰_vÜ m•––ććć樭ŢxăŤW^yE&“Ýđs9RUQňß7Ůc H‚¦(`XP´\"é.éBŻľĎź=…2¶Χťš6{1Ą:ş$.ˇß=3ćcŚš›şNţŁtó2é›=˝|ÜÔŠŇęĆë»2‘‡—Oc}-BH&“wŢë@×Ú|âČ/÷Î]"W( 8¬cŔZç_čkăVdÂGEEMš8éăŹ?^µj•ŃdLMMµĆcÔy2™ ’ç9žçńG˲pyńÁěěě 6ŔK/˝ź——÷Î;ďŔ /ĽXXXřÖ[oŔsĎ=×·o_ÇBŻľúŞV«4hĐ“O> ĺĺĺ˙ţ÷ż“’’ž~úé#GŽ8pŔh4nÚ´é¦Ţ‡ţýű˙ăťMš‚@ >Á -ŚPgčÚz%$ ˙ußn„x™\®T©w~¶„•˛0ç"…BX$ééíKŃÔÎ϶9iúÜ.»•)ÜZ*üĽ5őMş›q±"=Ä1Ůwď~~úîó¸ŢÂõҢ˘/żü˛‡‡Gssóźţô'xřá‡{~á7 :ŐőTĽúÚđ ŚľŤgq˘¸ gа1ö¦P—HÄNOµĎó6›‹ÇFfswO⇠ň裏Ž;Öh2 [ÎĆ2 Fĺ8@<Ďó“,Ď"Őçźnź=ŔŽ;›Ű·owl<ŘńŘ7ß|3111//Ź˘¨¬¬¬^őŤ…¦H„I@ÂÝv~[ÜĐś|DEn/Ną­Ý\D઴•Őć⑟ÉÔµł;MÓőőő»÷ě€ďřa <ÂV‹™˘hŚI„YŔ4<ĎóP6ކrZ ®X±BĐDBď‡~Xh ßóŐ«W MÔéńÖÚµkßx㍦¦¦ÄÄħžz*$$DŃńöö„zx®Š˘x]Énĺ”›áĚéY9ą·`T"·’ÖÖÖóçΗ9ÇŠţţÁŰŤÇý|ć¬s-ľ›·_đ$gďË«Y ‚«•ŕÔjőŇ–@FFĆ€&Ă0 đ<Ď#ž†ăl€ @!|y}ť &LpÉí{ěرcÇ^ŞÄ7jÔ¨QŁFu9ŤFóî»ďÚ› .´"ĽxńĹ»ż´îřדIcłŤyűŤ©"7á=ÂZ˙pŚ= .^Â͆”v1ëż+»Ć••Ý×Ed{,„Ř̬ăpĺPllh‡÷‡ŔƲ m7«wXŮY:[ŮçĎź]S[›y> ߯oźČđŰ6z‘[H]“ÎbuvđĽť5‘|đÁoăé÷čő†¶~éMIe6‹ĺŔámĎ?»JJKđEK}PPË‘;†{‡ňśKWuŁŃčBŔäBŕÎFHžC‘„°ěVö2DťsŠľőÎ{Xl˛ŘŔbLÉ_z} ÂAP€ń÷ϸwúď(9ŞČŤâ§ź~š5kÖ•šw-=ŽĽá‘ŤqńLĐĄł{g=ß˙|řč)‚¤9Ž6¨˙Š÷w."vÇ@Q$B—¬ě‚ßneďüLĐb2ZřZ‹I!Ř»B#bgÎ]FÂa )śĽ‡¨­ţ Ěž=[îđńńyď˝÷śöîŢ˝ŰQ=95čőúgź}vűöíV«őăŹ?>wîĽňĘ+aaa۶mKKK€_|1!!ˇ¶¶öÝwßŐét}ôŃu†‹ôx%H€ËE‡ë°gň2ďÇ˝?ţśž]=fĘb’¦Y†=źzüń'§ Š0ůî{ďţÎ3ę]c  @>VÓŐw‰›ĆsÂŘĹ©‚‚ă9Žç0ç –eo««–Čuáĺĺĺč\\\,Äi<ýôÓ˝ző6¦§§o۶ ´Z-ś?ţŁŹ>€W^y%44tÇŽ6›ÍÝÝýţűďżőă߼ysAA0¶¶¶6»óĐoĽQ__oonÚ´éż˙ýď믿Ţ9Ô5Đc+»Dę2cŚŕ¸3 Ëś@@NNŕëëŕpúô骦¦¦JřâňÍ]đ´D"AI‘Ŕ˙ă­ o®˙«Ë±™L¦ňňr!Íń¶mŰyäÇ˝ŤŤŤ˙ůĎţńŹôđJo ËIhę’•ť¦ŕĘVv|ýyž·1$AÚX+ 0 @söđůŃĐаsçN0a‚źźßŰożýÁŔO ďż˙ľĐd6nܸeË–!C†Üâ‘···oܸqíÚµĹĹĹ.…Ífóž={*++`ŐŞUö8–kăVXŮÍ&sAAA˙ţýŰ íJŤŇl6gggř„dĐĐ!w ˇts—Je%ˇya‚rĘ­Ě0ŚN§OOO‰D"Ö@EEĹ_|ńŇK/yzz.Z´L&“ŕüĺëë‹1úioo·X,$I Ź&ŤFŁŮl&Â÷÷ZZ†"€al$I$‰Bó¬°'0FˇŰë/r=Đ4-}ş^Żü-ěťüYłćRń.žçyž—J»Ë/*"rgÓSmŲ¬P$ąťNÖE ›D"é•Đ ˛˛łâ/Ő×dlĆł)G¤)ÇsB¬/âX ]\)‰Ëěú~~~Ž3áÚ_ÇÇÇÇÇÇŰ7ĆĹĹŮ 5Ëd2aFÖŻ_?Ai€»»»cW· MsO“$€1ć8„–źŻ›c?ýôS•Rĺîá>mÚ´[4\‘ß=ŐVcŽďşVł—fx'§źzRŻ7tŐ¬Tt‘ťúŹ Ic‚ Ś1ľÜzŐů.Ô47·ŞŐa7¶›0ËE'&¤ťĎüóÓO?ľîé ŕ áٶČÝCOµI’ZŇ˝ŚËuŠ“@HHHHHĎ'€"Há_v!Ő*BzŞł•ýoź}ľ­wŻ/héÓ-ć™?WT–ÚŘ]«NOKgSŮđ°đŃŁoLşk‘?= ĘŁiÚžˇřJ¸»»¨ČčŢ©dcSSÓ‰äS'NśţíÄÉÚÚ;Ľ'Ëń4Eńq<Ź1ĐES”`žĂ¸‹$‚@’˛†ĆÍźíl9XÍ0–čâŰÍÖ{gM÷މŇ­6l8›vYj´ŚŚŚ}űöýöŰoĐÔÔ´oßľ}űö?~ZZZ„ćŃŁGŻmüüé§źŕÂ… Â!.¤{„˛=‘täő×_śŚîTŽ9"Ľ---=?ŠeŮ}IOO·Z­źţyaaáűďżó†Ú™ÂÂÂ}űöýňË/Bł¨¨H’Đ,..šÂGş´´Th::ľćććş\Šućv†ł,»éĂżĄ–žĘ¬9–RúÖ;[ÚÚtfđ]î«MEĺ†Â×ßµXŚMÍ}űÄ1¬íÇ´´÷ţąűY'–Ż\±ióĄ:=gĎž=yň¤Ůl.++Ű·o_FFĆŻżţj6›ËËËwďŢ}áÂ…ýű÷›Íćęęę]»v9ť !ÄqśŮlćyžeY!߆`Ú·ďe†aŽăŢ}÷]áÝYľ|90 ò¬Ůl|—1ĆÂŰ'4…Ě‚$ĎóÂ.ásĚ0ŚÍfsüÔÚŹŐëő‚ŚĐ´Ë85˙¸lذA¸–­[· —Ă0ŚŮl¶?1wj ŤĆ-[¶Úl6ą\ľxńbžç1á—ąR®­V»k×.łŮl4·nÝÚŘŘřő×_ CúŕZ[[wîÜioętşO?ýÔŢz(..^¸pá•R wĂUXŮŤFc÷VöÖÖÖ.­ě—ÚZCC/%Ř{ýŤ71DI”T®¤äšWŻ#1ÉcŽ (ă§źxhň¤ Ýtx%222˘ŁŁ]Îőn1R Írq:QjjęűďżďéénµZőzýC=TTTDÓôěŮłłłłŹ=§NťJOO˙óź˙üĎţó©§žÚ±cÇâĹ‹ű÷ďßŘŘöâ‹/¶¶¶ľöÚkňŇK]Ö¬YłcÇŽýë_ĺĺĺ0jÔ¨ĄK—Nžůw’$ĆEÁá_ţwmÚĘßß˙f—2ýöÎ;>Šjý˙Ď”í›Ţ{#˝Đ{ď ˘€ -¶+\ËUQż^/–űă"xEDTíZEŞ:BGB€@ôžlźvÎďŹË¦Ý Mś÷+ŻĽćĚ<{ff79{Î3ĎóynŠ˘€xÓ) 0vŚm5ăďŐG&mú`ŃčˇCvü°6ĆR? Ł PEYI—GBΨٿÓG‹—ü㥴qƲ˛˛üüüőë×Oź>=??żĽĽś4gÍšŐŇ8<<üÝwßť2eĘ{ď˝WUUµ{÷îŕŕŕ–fěŐ«IŻ%¨TŞYłf…„„?GwwwbňÚkŻ5›8p€Ô|üç?˙9yňdOOĎW^yĹ1LďÇ$îË/ż ß}÷iľöÚkŤŤŤß|ó i–””ÜcÁŃŃŃ3fĚ(++[şté<¶`ÁAĘËË-·mŰFŢgűT…púôi??żôôô˘˘˘-[¶ÜşŃ*00ĐfłĄ§§SŐęüă˙¨¬¬ś>}ş‡‡‡N§#yyyŮŮŮłfÍJHHČĘĘjhhŘĽyó‹/ľHzfY–ÄÍ‘ćÉ“'§M›v·}ľí˘®®ŽÜ YV566fee™L¦ŘŘXOOOŁŃ••ełŮ,Ë#Ź8/#ęăăÓ§Oź„„ŁŃŘ.Ď}{Ńjµ˘(fee!„’’’4 ĆÜKrrr]]ÝĘ•+É_KRR’R©T(ähBB‚FŁ!ÎĘĘĘyóćµWôŠéÔ©Ó€xžĎÚľ«sŹţ§OdwďÖ­e®Ż ‚ ´­Ť×ŘŘčéŃĘém6[yyycCăľ}űâăă‚‚c˘cöďűÍÍ' Ś%IB‹<‡$#„$Q’ÄŞŇs#†_Kž:uęÔ;ScÇŽ3gÎ<ůä“•••«V­â8®[·n{öě™={vXXX^^žV«-))INNľžŢÖťÂĆ FłŤ$3SEÓת Reĺx–aę f$‰'í7vś··÷}Łď«¨¨Ř±cGEyEß~}ÍfłŮj ¬«­ă8®™`Hdd¤Ůl.++Óëő÷ßżN§ ňôôôőőŐjµ!!!^^^ŢŢŢnnnz˝žeYt­Väăă¦V«»téb±XĘËËźxâ‰čččČČČ   ŹÎť;?~<111$$$,,ěűďż7›Í&LđňňęÚµë±cÇĚfsÇŽÓŇŇĂÂÂH·ńńńgÎś1›ÍŹ<ňZ­&;@ˇPřřřřúúöěŮóСCz˝~Ú´iˇˇˇýű÷?xđ Ůl6lXDDDź>}rrrĚfsź>}˘˘˘îÄgxÓP«Ő fłůá‡ööö (ޤ¤„eŮÇÜĎĎŹeŮââb»KŔ0L`` }…NÓt@@@TTTPPP§NťA(++Óh4ö4˝[»»»‡‡GQQ‘Őjť={¶›››··÷Ĺ‹ÍfsFF†FŁqww/,,4›ÍsćĚŃjµ.\0›Íłg϶‡@űúú†††¶‘zl˛ŘDQ*©¨;qhßđaÉ7˘«s+žç FCŰ^öššš6ĽěăĆŤ«ŻŻźnŐË 4hPaaá˛O–%%&uďŢ=22ňůçź˙ä“OZ;ę9Ę08ÎŚ 55ő•W^q X°`All,ĐŰŰ›L”ě(G<<<&Ožl7vss#M‚^Żwlň;"""""˘Ů!đňň"KB…BářZplRŐěčź—ńăÇ7ŰÓ«W/2'%ôčŃ9˘T*»víjo˛,KÔřČĄ~ýúÝžĽNť:uęÔÉŢtĚ€””"ŤIHNNNNNnÖCłâÄ.ŇŽęîî>cú 8söŚcž Íó<Ă",a 4ТČ`a„š=dś0a‚ŁŠÝ×HřĎţcWüyć™»±$w{˝ě-iőűöŽC24edn5í­Ô*'ŹŘśV|Đi›ú{ť<ş…¦ékOW6®4Ă]Ő ŽŚŚĽŰž¶äĽěŔó|ii)Çq ĂçfłůvŠĘČÜ%´g%ŘŞ`śŁÓĄbÓž{öY×ĎŢ6d…x—C]ýŤ›ímóműôÓO}|}0Â@˰pîÜąéÓ§˙užâËČ\ÍĽáyľ Ůu‚ÓÄ®{;óË)JĄBD–ˇ –˘@DA,Kš­zŮsss{÷î­`‹EÄŕŕŕ?â*2›ÍöD?™»„ěělwţ•ą“•ĺ`ĎŢß6lÜ ŔH?dP˙űďٲč_ (ooďřřxÁŕééŮŘŘčííMâën¸Ďšššź~ú©ŮSB§,_ľ|ňäÉ-Cę6mÚEÄd\gúôéd-2gΜ޽{ŻX±˘Oź>ÍlÚGzć™gL&Scc٧§ç¤I“FŹ݆ńÉ“'ËĘĘnŠ8š(Š_ýőž={hš^´h‘››Ű˙ţ÷?’*˙Áx{{űí·[¶laY¶WŻ^FŁńĉőőő<®ÂeżË8ŤuDßĚ`÷Ţ}›¶é6pĂ*ž˙uצżQ0,(Šš;w®ÓĆ?˘(1 -!LÖ~ÄoEęË@«~+ c|ěرm۶Ť7nóćÍŹ=öX3÷ßáÇU*ŐĆŤçÍ›·eË–łgĎúřřBëÖ­;}ú´——×SO=6lČÍÍ­ŻŻ×jµĹĹĹuuu›7o~ôŃGËËËĎź??mÚ4řá‡.\¸4}útű)ŞŞŞľůć›’’’'žxÂl6mذaôčŃźţy@@Ŕ”)Súöí{«Ţ¸{ڱc„7ŮyęÔ©őë×@FF†··÷… "##srr jjj^|ńEÇ|’Ź?ţä .]ş”ě!···wFFFQQ‘ÉdJII!UéżţúëÂÂBžç˙řQXXHę›ÚcŮ‹ŠŠě÷’™™yńâĹ·Ţz‹d•ŔńăÇW­ZuSęşşdhĆićÍőFQ/_ľ\|Y’¤â’âËĹ—IÂŻżn­©«ßµmĂö-?íٱÉ`2řFööŤěíŃŰ7Şź_dŻ˙ŰJH‘‹ŤF{ý» ]y&HžŇ4MäŘIłUŻ”Ńh,--]¶l©îÓĚý—ťťýá‡N0!;;»±±q„ :třěłĎ gĎž&LHJJZ¶lYNNNiié„ ĆŚEEEO?ýôřńăß|óÍS§Nyyy}˙ý÷›7oFM0! ŕ›oľ±źÂĂĂ#66vܸqˇˇˇEEEGŽątéŇ‘#GhšîŇĄËŕÁíĺ…eţáááäÁ7)łvíZ“Éô·żý-99y„ öláVŮ·o_MMÍ„ –/_^SSł{÷*RM«{÷îÝşu»)”###Éwá… bbbÔj5ĆřŔpˇ8@ţ¤ @ľ,˙8.g5nE€©)HjÝŔd2íŮł'!>Ě&łŐfĺ8nř°áH‚ȨwORý<}}}ü(Z’$š†sżďjÇ­4%77÷Ô©SŽĄ8î8ö¬fěÉ|Ą @Ë ]W_,ËÚźx2 ÓŇňŮgźŤ‹‹;wîÜwß}wđŕÁ†††Îť;ŔćÍ›>l0’’’,‹V«Ť‹‹S©T»ví€'ź|2!!aŮłg8pŕäÉ“E‘I~uuµc®™JĄňňňЉ‰Ńëő?üđ˙ţ÷ż/żüň•W^ˇ(ŠÄŁ“PR×ÉĎĎ'5ĺΞ=Kä1S,GŹMć­m'ošÍć~řáČ‘#ŤŤŤ)))Ýşu3 ~řáĽyó Ŕl6ţń+W*•ŢŢŢgÎśYż~ý«ŻľJśŃ'Ož„«ů›ŁGŹ>|řp]]É9ůăg´ă˛b /MĆ€€€6ljëjŻ—Ü˝{÷§žzjéŇĄf‹ůJVłNשkoŠf( #$ "ŔXBĆHhöoůůçźďßż†>yňä±cǦ¦¦–––2dęÔ©_}őY<8púôéźţůŮłg%IşYăú‡(ĆŘ׉bŚBÁB¨eőS@€0Ć!!!öżé¶}ééé=ôÁ`¨ŞŞĘĘĘR«ŐK–,ąpá©D oţő3gÎČ‘#ëęęČC•C‡5űB.((¸|ůr‡öďß?|řpWo^¦)±±±K–,¦‚şË—/w,%ß^¦Nť:qâDŁŃX^^^YYąsçΡC‡feeq±›©,ŻT*_|ńE0 E‘ NOOź4i’Bˇ°7oîhuűÔř^zéĄ;v<ůä“y§®f´RŚŐĆńĽ(IŘjµŘ8çm}:##cÁ‚Z­¶sçÎä ü­·ŢŇjµ;v,,,LOO/..Öét …‚¬Ü‰ă\ˇP¨Őęäääddd,\¸ýúëŻÉYfÍšőĘ+Ż9rdďŢ˝ŁFŤzüńlj‡ĺľűî[»v-Ń•qµZ­V«I0ůzôč‘‘‘‘‘‘a±XČNš¦íaŚ-qPe÷wíÚőüůóożý¶N§ËĎĎďرă!C> ©©©—/_^±bĹżrRYţĚ™33fĚXąre`` FŁIOOOOOź7oMÓ[·n%MRPjÓ¦MďľűîęŐ«›IÜÜÔ´iÓćĎźo4_~ĺÍéĎľ¶&ó?OÍÉh©•e2™ FCpP+‚GvÎť?ŰŠţCCCĂŃcG‡jŻ,đŕÁáÆ˙kÁűáIĂX–µk- Q”$É>Hť>´iѢwěý^Ë&Ů0`@Ďž=ŔĂĂăő×_ĎÎÎľŰV‚“őrY-¦€˘) F€ŞŢ`V*ŘÂâ*·f.ýן“››kµX‰ŻŠ<0­ŻŻűí·WŻ^}‡ďGFć–Q^Ý`µńN¬Zúî˙{˙íęęę—_~ůfV‘h#5Çh2–••Í™3§˛˛’|o'đů±G**«Ż÷ŕĽ<ÜoăĺČČČÜŐ¸:Z) ˝ÎI¨şSÝŇfM$Ľţ)>]‰Ô'5ĺÉ ‹˘¨ëi0ČČČ\­(ŠjC–”ŕTŻĄźŢh4UTsěçççéywŐÔşą Ś)ŠÂcŠ˘ě5ĺÄĘŁ•ŚL›¸:Z!„ŃIÉIžăŰ6ŕx®ŮžŹ–}QoÄŚBĹ٬ŚdzwÁ+÷Xĺ%GhšľXR­Q+hŠEÄ "hŐJЂه˛“R:Ş”7RFFć/‚«Ł)ä۶Mَ±mfš3ďľżĐ"z‡ă’˘să™FcĘ^ýô­7_îÖµ•˛hż˙ţ{{%îLf[BTPKoşŃhذö›°č+W%#óávxŮÍfóć-›IĚnQQÄĆƦĄ¦ŐVW•T_ľTt–ůú‡>őü{4Ă`„0P ׬YŐęhµxńbÇ0QÂéÓ§+++ď¶ç€Í ięŔ‰‚f;y΂śU–•‘‘i‡—ÝMď¤÷őR[Ađöö:dčîÝ»h4<© sózxčXťŢ hŠÂ”( WŞźŇ ‰ Íë oÚ´ *** ¤¤„T!;vlppđŹ?ţXXX12dȱcÇ:łfÍręn“‘‘ůSŕjž EQôuJHŮi{\(,,üřăŹĎś9c1[ěö4CóĎsĽÉbâ9ă9Žç¬fÇsś•kćx^˛d ) D2§ÜÜÜH“”“ż CďĽóN‹ ‘‘‘ůSŇ/;Ď;q˘Űšs6cëÖ­EEE?˙üó<@öĐĹq<+aša$I”0…HÍ 1–Z†Î×ÖÖ’(S’ŢYSSCBŰÉ4*&&†˘(˘°sţüům۶  —‘‘ąh‡—Ýjł¶mc4Ű8úÔSOY­ÖçźŢl1WVU€„„kŐO1Â@Q€EQ’˘$$5«~J(--%b~‹-"údÄf§ĽĽ|ÇŽ¤˝\ęNFćžá6ŲźÍ?ŰĐбî—u‚(řúř€ Š6›•eE Q€E ’$Ib‰—$ SMV‚˝{÷NOO EştéňÚkŻÁUé˛ÄÄÄ­[·®X±â‰'žP*•äÄ$#sĎŕęhĄT*ÝÝťäÁřúú¶şßÓÓó™§ž€K—.…‡‡;Ô‰`xžE #, F8 0-„$‰ÄyŰ™3gŽŁJŮĚ™3gÎśioúűűżűî»dűŤ7Ţpńľdddţ,´cnu])^»łr5Í 4J*{÷Z˛@ö »PL˙˝Ú.##Ó.\­$Iâ¸ć‘čͰ?ě»®AÓřŇ×_źďâŮeddd\Ť`$ÉƵőČĚó4‘‘‘ąíY ¶sˇçŠA5«Ć@c$Ž=ŞWď›PAHFF枤=^v·ô˛_3đibpâ÷“™ßnî5p,«TňVîóoÖžÉ?­R(íŐO'LІz˛ŚŚĚ_ŠŰQó!d0  FŁŃ`0ŘŹ«×Ú|`˙®ý;·:°›…’:ćR u© .Ő˛—Şáó•_9öłpáÂŰpµ222w'.G‡JÎŁCMĆÖĄ Ă굫##" đb!Çs*Ąjř°á<Ç{xřąą»Ć”Ö%8( 0EI14ěß’éŘO^^^+˝ËČČü5pun…$ç™7m gŃQŃÇ ß˝k÷ÁCô@vęÝÜ{÷ޱKżŽ]úwęÚ/ HEAŢ& ˘ÍÚJo<Ďżůć›dű•W^A‘(ĐĄK—–””¸x/222F\ö˛Sđłšßx㍟~ú©¦¦fĆŚWş¤ŽX4ÍrĽ…@„( ˘(-#цQ©T………ąąą={ö$Ősrrjkk=<äŕ,™{WçVJ…ň†cóçĎďŮłç˘E‹ââ®THe(lăm6Îf¶QDÎfµXĚ&›ĹČY¬˘Ŕ·LlfĆĎĎŻ˘˘âđáĂÝ»w§(jҤIëÖ­{đÁ[V˛•‘‘ą—¸M•ĺA$)##ěQ¦śŔ‰<'đśŐlĺĚfłŮĚs<ĎńVžç9Ţd6µšĺ7jÔ¨/ľřBĄRůúú"„–/_YŽÍ IDATţěłĎ®[·®˛˛ňöÜ‹ŚŚĚˇ=JÇV'ˇę†FC«űIÂľýű`˙oű ::¦lVE Đ"ći¬Ŕ”(I ˛!„¤¦Šš÷Ýw„‡‡WVV>ţřăjµcÜŁGŹĐĐĐŢ˝{;­a!##ó§¦=U$'U$Z‰ h4šQ#GA‹ę§HJŠ • Ą(I# (IäÂĆĦe)H‰ćššš„„„ˇC‡Y Ŕ#\Ľ™?)í¨ĐĹ2NŚťWčjj0jÄĐ‹E—˘ěîů&± }Z***^xág×+##sŻŃ]v˘/ÜΫźz418pŕŔ.ž˙)))í~ŤŚŚĚźź;YYDQ´ŮlV©T˛ďIFFćz¸:Z ‚`6›ýüüÚ°ihhŹhË ±!,,ĚqĎÇź¬ĚË/¦%ĎYC˝Ţ?W°dddZĹŐŃ c,JbŰ6NÝđÍ –-_QÝHuí5hIRÁŮßť2ťÁ´„EŠ˘) ď˝÷v‡hŻPRRPWWĐ®ĘČČÜĺ¸:ZŃ4ítÖŁR¶®—`µZ÷ěÝC¶·nŰ ŃŃŃq±q… .—[/^8Cąyú¤gü‹aXŚšˇŃgźŻü÷{˙tń ąąą°|ůň ´ë…222w9®ŽV,Ëj5Ú¶mÜ=Z—”!á ýűőĎÍÍMII1›Í'sOĆĹĆ©5îcĆ?¬wsŠ˘€ŠB!$ ’$H͢COž<)I’BˇŠŠÚłgĎ!CÔjuIIÉÉ“'`đŕÁŤ&$$ÄĹ;’‘‘ůsq›Ľě …‚aĺË—/]şÔ.YĄP(ôîî ÍP")Dń’€‘„0E’š…˛Oź>}Ę”)Ç <řăŹ?~á…A0™L°téŇ—^zé>gU· žo%;JćŻ EQjµúuîęhĹ ĽŃdlŰË^WW׆—ýťwŢ9xđŕ /Ľ`Ďj¦)Šłň¬Ó +ŠĆ4–®U?E±™ŇhjjęÜąsW¬XŃż˙>}ú¤§§Çquuu““ăâ˝ČÜ,ž|ňI§é™’$•–”šÍ˛ČőťÄĆŮüüüBCCoíYl¶“ą'Ź9z‹úwyn…]­Ls=Úţšý׿ţ…zűí·ÍóÁ!‘ç9„„ĚW}‹˘„˘F˘ŕÄŻOň}ôQŘłgŹ«÷"s“`Yö˝÷ß+//Ż©©±¶¦đałŮ~űí·ěŮň€u1›ÍÓ¦OKLH´Ů®[]A§ÓŮl¶ëý3 ŁQkLćÖ5ě@ĄRUUUÝŇ•ŤË^v†V*•mŰhÔšë*ĽX¶ŁAíܵ“¨ń/ śÍ*±˘(`M’$„)#A”D śÔ.Ą(ĘŰŰ{Æ Т ŽĚíAÄĆĆĆÜÜ܆ú†–G;Ät¨1ŐđołŮäčbµY1¡VµR““’÷Úßj‚ >r81!±ĺQŽçü|ý ÓĆÁe/;ö1ônúV÷»»»?2ń¨®®&kÉ«®+†çyASâĚÇh E,J’$4­~şxńb>>öŁV«!TWW7pđŔ=»ä©ń-„†ˇHLLl5Ҩ´´ÔÍÍŤU°ÉÉÉĺĺĺ- "##‚CCC[~ńÔÖÖ:ŐżűăÜ/;MÓ¤ÎsCC›››=«™ł¶lřšeX„™Da$şę]ňnâ®óňň{ijµZ­VŰĚĆiYi™Ű ESZťcÓ!ĆßßźřŔh4"„xžwÓ»éő­ŐÉÜ,®Ś&¸ő¸Hg#U‡‘„._ľĽěăeöCţţĎ=÷ś]:Řd2effŽ;ÖĂĂcüýwß]ą&.Ą'«TqVŰŇ?N_©R*ÉŚŞwźŢ,{‡U"dś‚0ŞŞŞjŐËNžŃ4­Őj)šR©U¬Čęô׾´X–Őéuä·$IŁŔ˘ ÚÍ4ŤR©´7ŐjµB©°7{ĄR©P(tzť(‰>ľ>EIHr<ă_^ŕi††«Ďë2ćd”–][Ź;z©%%%ÇŽ#ŰÍ|ę’$}ú駢(ţkÁżvîŘůĎ·ţůÁânáĄ;Đž• Üä•ŕg+3yäqˇ €”śçDq}Ö–f–€b(ŚŠŠK§L~Ôő+t¤   ´´´™€ÖŃŁGY–íرăŤő)Ó*\%HĐ4­Ô(…JĹP*͵Ż=šĄUům±ZÔZµŐbU(zw˝ŃpeíF1”B©Đęµ’$éô:Ś0«`µnZI”t:ť•łÚ{???ŁŮ¨Ň¨jkk#Ł" čb‘ă˙š(­J†şöMś8Ń1rĘÓËł¶ľÖŢ ŚŹŹ/..&M˘0n!Ô±cÇNť:©Őęű¸ß?Ŕźn“O°=^vÁßĎż ›ššRâ´ ß~÷m`@ 9zD_ßaC‡ŮĚfL+)`ĆĐ­×ŕČČ8Š€fŘŰ´ú©+|űí·AAAC† ©ŞŞĘĎĎo6Z)•Jy´şą0 “””ÓňIÂ`XĆMá¦d• FÁĐŚ»ţÚ[$"w˝;ůmµXý}ý5jŤ ŐŐŐŽf&Ł):2ša‹ĹŇĐĐ`2š˘"˘X†µX- ő îzw˝Vź—µuµ \9…Ŕ !Ç~ţ˛đ6ž˘)h44VTTÄĹÇ9mhh ékáĘŞJÁĐĄKGââb˛Š´q¶ŞŞŞň¬‚‚‚ŚŁÁhđómëÜMá6­łâ†úÁ<˙üóöXv˝»g§>ăJ™[I’tU”IšÎĹ,X ŐjŐjuż~ý>řŕ7ß|3::zßľ}_|ńĚź??66vĹŠjµşľľ>((ĽjѢEąąąˇˇˇŻľú*”””¤§§Íź?_~j~S (ĘĂĂ»]wfMÓ´N­SĐ `(Fˇ˝&ć!r˘^«'ż@° ‚M˝¦ůGc6^ …'–ŁĹ±‰24@A+ěý»éÝLF1ř‹cŃZh†öó÷óőőm5ľ'..ަčظX/O/{ =GtZť b:¸»»·áďďůňĺ›é´CÁithŰ?ůä“ďľűÎjµ>đŔdMłĽ "Lµ¨~ $I”PÓŃjóćÍË—/ĎÉÉÉĚĚĚĚĚLOOĎĚĚěßż˙ţý€4gÎśřŕűďżGMž<ŮÓÓséŇĄk×® }ë­·\Ľw™»Űáe×ét'L„ŐO1ĆŤŤő$ĂH´$r¤đ)ŚFMłšź~úi°‡Ř’ćСCI%TĂ0ŻĽň Ů&Η^zɱ“ž={ޢ۔‘‘ąĄ´GéXë$řÓĂÝŁmf#şwI;}öúč#Á`0HRˇFٱŮlJĄŇ±^R©tşŚ•ąĄ`ŚwgmřtÉ‚O—,ČŢ“u;ú‘$mݰÚu{Śńo»¶žţýHŢďG$QDH:°7«ˇľąÂ„$‰Ű6®q±Ď˝Ű7™MI’–-z‹Ľ &㕯öúÚšś};ŤEA ďĎöÍ?ą~ŮNůuýWkKAÉĄÂ܇ϟÍ]ľříO—,ř黕ޖăý»~ýtÉ‚‹g÷sśíÓ% ~řň“›xUíÂe/»RѶ řx_wţRVVvřđá'ź|ňرcÖ«ßśŔŰl–UŠ$J@3€$„0ESHâE»Pý”eYAF«U«VeffľóÎ; XµjEQ•••łfÍrńNenů§BsćľąÇ5Ö×yzűěÉÚ(IbXd‡Ř„”ógsŁbX…˘äRˇ‡§weE©Nď–ź÷ű ÉŮkh¨óöńďÔ˝;¸żˇľĆÓŰ·KŹ~ާ8›w".1­eU»­VŹz`Ňą3ąŃ± ,«(ąTčáĺíćîąoççBÂŁÂ"bŞ+ËŠ/Ć&¤…VW–1,ăíP[])Š+) ˇľöÔ‰ĂAaÉ»’nżZ±dę¬y§sŹéőîů§âÓB#˘EQŘ»}tHH Źěp:÷»‡WÉĺBňŚ‘J­™ńĚ?/oÝ«ćĚ}˝ˇľöŘÁ}Đ©{_AŕBůyżďß˝UĄÖôrź±±áđÝÖĄ—Ż`ł<ť{L©T]ľx>ąc÷€ ‹Ů”ło;$Ąu ;ť{LŁŃÖ×5Q(ŮťµaÎÜ×sömď3pDZ—^Í:üm÷V/o?ňa9’ůÉZ¸:·"j¶NúbZ7Đëő  Đéu‘‘‘=ş÷Fŕ«Ő"rś•łJ6ÎbłŘlVŃjłŘ,ljMăQ_ýu7n\jj*iRőüóϧĄĄĄĄĄ˝ýöŰv›ôôô°°°É“'wîÜ9--mÚ´iAAA/Ľđ‚FăD˘KćˇPŞžŻ(+®(+ŽŚ‰óôöŮĽî;˙ °ČgóNT–—Üż“ălp:÷XMuĹáěÝ»·m‹Ś>’łWŕů°ČĎť?{ęřáßl6KXd«Ĺ|âH¶ă)N?Ś[vX,&ˇÁ?(äŕţ<ÇŔéÜŁµŐ•Ű6®ńňö ‹ěŕĺă×P_űŮGď{yűjuzŘł}Ó€ˇcČË ňóĘK/@öž¬°Če%EÎť€’Ë‚B EÖĆ5y'Ź„EvŘżëWÎf]żú«°Ča‘ěÝn±vmýĺ÷#ŮA!á×®ÇlŞ(+¶O¬NÉîÔ­lůĺ{ňBµZsňhNcCť—ŹźNç›×}G޶:I\żú«K…çÂ";lŰ´6ýô?bśµi-lţů»ógOů†Ří÷íÜÜčh˛]W[]QV,6uIďÝľi˙®-ź.YĐěľă¸:·’äTçzr\,ˆ‡…@ţąü°Đ0‡ę§Ć=;~aŻÔM$•EŔתźzišüńučĐě:¤éďďďďďßĚ&$äĘgăĂLDdî‘ŃqŤőµŰ’(=ľş˛|ȨŐjMA~gkĹ+4ćˇÇÝ=Ľvüş."ŞC‡ř+Ĺödm||Nţ-<:66áĘťú»{xFwH€‹ňÉ\áÜ™“-ďŃËŰwč}ă`çŻëŕrŃyňßtćÔqps÷q˙5M7«Ĺ\]YŢąG?‹Ś9’łďŕo»ônîCG=h·ńń s¨O—, é]‚ËŁ•(Yťyţ´łëŻĎŐf»îcDP*ĺ€{‹Ů١c×ްń§oŤ†ÖÓ’ĘK/Ű˙c1 d е׀¸$‹É¨h*YVr)($Ü1ú×ĐPůŇ…ľG^ë_’ĘK‹ăÓ’;v ‹âyŰŹ_-ď7äJ•Śń™S'Ň:÷hű^jŞĘÍ&CdL|ËC,«:ú!HîÔ]ŐBk·ĽäҸ‰S`Í7źY-–şšjµZăëCFŽ3NËÉĎű˝e·îŰÄ´®m_huzbśÚąĺŃK…ç}üőD«ąžO—,:ęACc=EQnîžÍ^Â٬FCcËčíçNƲ{z6_dîU$QĚÚüS}m5řúzyűő<ęëK’|ü|üúůÝŞŹ1`$I`t’ÓşfmZ»cË:˝›űű'$¤tÚ¶ií±űtz7Ç)üúËSçĚsÔ/=“w<1ĄŮî;hä˙V~„ČÜ'gßöߏćĐ4=dÔEE€$‰ĺĄ—F?ř(\)ÖW7¨ďV}¬Öh=Ľ|F=0qßÎ-˝ 'GmV˧K@PH¸R©ę7dÔęŻ?€Ŕŕ°¸„ÔkC'EPFc#1ö ŃëÝÖ|űŮśçç“㫿Yah¬÷ôňéÔ­Ďą3'Éi#˘bżZ±xęěyťş÷!ÝFÇ&¦4ťQ@}] é6<Ştď=‡FD§vęaż˛±wǦŮWOzňřÁŤ?} ť»÷€üÓżł¬˘s÷ľi]z‘Ł:Ä@uUĹÉŁ9ŁÇ?6`ŘO—,đôňydÚSíúôo®ŽVJĄ˛UńyGH^» JJKŹ9ÂXJKKŤ‰‘k÷&nž“¦ĚqÜ——doFuHůÜ+ŽM˛6eVůü)3źoőO>órł='gŰ˝Âѱ‰Ń±‰öC‘1ń˝úł7xř řbéżíö‰©×Šľ8n7ÔŐX,f»+J­Ń::žS:vOéŘÝŢ´Ź ŹLÍ/ď„ä+ŁgŢɣɥǦ?síb&L!ŁĆ=B6ú Ńgŕ˛]zů"ńť‚Ă"ĽĽ}ݎ[ďÝz_+ődż†™Ď˝şׯ}]›i’5¬ťî˝‘ŤŢ†őpíÍ Ź Ź€Ä”Ή)­Ě×ní[Qŕ$ĂÎi ^łę–}ú­OP,«TqV1k×ĘąĎNQ©Töę§aáaN]ű22×cěŐű›hŻw÷2r¬˝ŮrÝä"‘1qdh/ťŢ/0řÚő¸yş~ ©ť{\O;˙OË~+I˛µ çŮlvb`ibđź>Ŕßh˛X3Ş·ţ˝ŚFÂ"E±F“ĆűŔhŻPF¦Aˇ7Ýže~׋ǟ|¶Ý—:Ý Vş÷öńk¦ďú5xxzßŘIďÚ1Zµ‘XC¸^°»Á`X˝vµ§‡'ś>}Z’¤ŕŕŕ~}űŮĚf_ÎsŤ€1„Gŧ¦=AŃ4Ća`Ľgsf{G«uëÖůůůőíŰ·]Ż’‘‘ąűiĎJĐéBď:ˇČȡC†fffNť:Őd6Ů«źöí=^ĄÖEQ@I’(!…$©•ę§+W®EQ­VŹ9rţüů .ôôôĚĚ̬®®>wîÜűďżďëëűá‡j4šYłfÉş¤22÷íń˛»ý!/ű/żü’™™É0Ś=ЦYA”0ÇQĂ 6  0H€BH”noőńÇôŃGąąąŻľúęŠ+fĎžýůçźżűüňK\\ÜěŮłW®\Ię0Ű+MČČČÜ3Ü>¶ŹŹŹFŁńóółWQe(ŕžçyžçB˘$ň6głŠ<'rśH*ˇ:ššÚ§OŠ˘fΜɲ,IµéßżRR’˝IÓ4Ă0˛o^FćŢĂŐą•(ŠNŁCŤFcGűőë7kÖ¬#FĚ&(ŕENŕx,!A#RýT% c@$:©~*##ó×ÁŐ9BČi捭µü `X¦¬¬líOk1ŕź×ýĽuëVć¬V«Ĺ*p"Çq'ńĎóĽ$b+gĺyA“Ń*&&üýý‰i’ßöŤqăĆíŰ·oíÚµ.Ţ—Ě˝Ť$I5ŐUĄ7Ą7َŃhh¨­ą­•ŞŠRŚqUe™SËúşá&•€ŻŞ(#÷îř» u5<ďäc\]Y~S.ěĆhŹv(íDtĺzŞ,nz·)OL€żźčÖŃÁOq<ŻP`I’$$QŔ‹"„ÂR“•ŕoĽ>ř csţüůŽMwwwąó]HUE٦ź˙goŽtş§× *ŽíŰąĄ˙Ő\§X-¦­V› Ť7E< ÷řAI’ĘJ.‘hĎvńó÷«fýíµÚęJ‡VŮ·cs÷>Š.ä÷č;an<Ű!ôËŹ™Dú˘¦ŞÂ?0äçďWµ|öďŢÚą{ź0çÁ_˘Ŕo\űÍô§_rjy‹hŹ.»3ŐMoo'ŃŢ^M :D…žČÝář$c ľČH'ź«Ěź?˙ŔÉO>{đ·]Zť>µSw…RGě‘{éâyťÎ­¨đ\·^Ný~Äl2@‡ř_˙Ľ“GMĆFOď„äNŐ•ĺ{·oRŞTťşőqĚU.<Ć1TÝÎ_.ź–ńÂKßżTxľ˘Ľ8.!ŐËÇĎb1ç?±ń)Ţľţ…çĎ(”JłÉźÔńPö®¤Ô®nî†Ćz’śŇŮÝăJÁĽßŹ<üř̲’K'Ź´ZÍÝ{˘işĽô2‘ĺëÖk`(ą|1":Ö~I•ĺĄE…ů ©ă§KŚť8…v¶şşŐ´ĂËîT鸱±Ń‰ˇ1 Â\<ă˝GeEÉ‘C¬6cĚ2ŚRÉiĆ%¤j®~űýu ĘJçň,ɸIÓtz·m×Ä&¤DuH (ĘjµÔTW”^ľčk¬(+V©5‰©]Ľ}üZĘL›ó÷–ýź;ťŰąG_đő 5ö8¸'TU”Žtş˝ééĺ3úÁÇrŹŇh´ťşő!;Ďź=ĄÓ»‘ ¨Ż­646„GĹę:uďCŇčĄŮd(+ądĺ’Íj!WKŚ Ýű ěŮw0Ćřł˙îęÖk`מző eĹE4E‘$D_żŔŽ]{)”ŞŞŠ2CC˝‡—wńĄB"Řp߸G#˘cîß9dÔ¸¬Mk‰Í؉S=<˝ëj«É´4?ď÷ř«9‰vbRcżň’ËăŕĐÂógú ٵg“ŃđËŹ™Q.ś;Í*˘ 4Ô×Ć'uěŐh÷Ţ×Ü[·Ž›YE©ľĄÁ†ŤżnŰľ(Fů>=»>ţřĂ÷pđArrňłs˙ˇ` („$!P(X@5ś|Üc¬_ýUJ§î …˛±ľ®UšŞ ť›;ÄÄ%…GvčźŇ†««¦Ş˘™¤ImM•Íj ‹Ľ±ËÓëÝR;ő€Đđh(,8ßňŹÓl2ĘŢÝgŔp¸tńĽ}]m5r¬Ż«qZęÎś:žĐZÚ05Ť‰Mň rĹOßPWÓPWc_^ŹłyÇ[Śh„ đÔN=BâÝT_˝^vÖ™ĂĎiý«f›6˙š}äBꎓh–áHöŽCź§ X{őÓď,ĐjďťB˘(»oެeě1e·O¨üî 6!…´_*<ç( Ü){϶ý»¶rś5ĄS÷¸ÄÔßvo-<V©RçzZ—^_öáCŹM×鯅+ŻýßçÍüÇÖ|ýXú3ĐIi]żţěCą~^qRZ×ÝY ($ ŽŘcď?ďÄáŻ9zö˘P*•J±”DQ©TéÝ=ľţěC˝›»$Ь‚őôňůúłőnn®üŰäç]=Ňů_-˙đ íťNÝz1(J«ŐŔ¦"=Zť! ĄjňŚżµçżÉÜ/»Ůl>yňdjjŞ(,ĂZ­Ö%'†Ŕ¤uęäîá ¦ôŢ:ť;EQ˘$ Ѷ5ÍŁ¶űÎt:Ă0&“ !¤T*Őj5Çq4M[­ÖîÝ»Seo* ŤFĂóü˘E‹>ůä¨E˘XŐjµ˛©ř¤Ě­†e›ü˝iŞ+•×jho^÷]ueą‡§÷&‚Ăó,EŃÚeĂ•MµŚý‚u:7»¦žŁ_hşId§=ţĆŢ´ŰtîŃĎÇ×˙ęŮ©fgW(”dś˝rŹ ë°†hÖTŞT  •Žç""¨†ŽQ7ťĹŘOäřŘ{#Ż%M…B©Ő鉽»§wŹľíß ÄŚüvĽňţCî#Ó•7D«oöqŘ?š¦ék|'Kť»:Z ‚`2›üüüÚ°©ŻŻŹoý§ŻŻoRbŇĚ™3IőS’Ő¬Őjă“:’ #@@Ť!$!  Íô°–-[VPPóćÍ«¬¬üńÇEQtwwę©§>űě3«ŐjµZ»uë’““ÓĐĐŔqś››Űěٳϟ?ěر×_}áÂ…[·nÝľ};<ôĐC rńöo J–E‰ehŔ‹˘d†…1ľ‡víĺˇÇfüÁtz7ťłM®s{žÜGĆÄÝđkž<Óľ­VkëV\űÄ"câ[nľŰpu´Â;u¶ýŢ^ý4#ăJd´ŐĘ) šfyÁ,ĆQ¤fy‚.\3gŽ——Wppđ_|ń÷ż˙=44´¦¦†5jÔŕÁżţúkb<|řđ#F|˙ý÷gÎś5jTĎž=˙űß˙@vvöś9sÔjµ=ţ¶AŃĆŠÂ_Ľę˝r"p!#ó—ÇŐŃŠ¦i§NtU›łÄ… Ö××;έ( ń<‡„0ÂH%IÂWk4Jb“ńqîÜąkÖ¬±ŮlS§Nµď´ ?4+is˝ 7o˝őÖG}$Šbż~ýú÷ďßöÝ\B4M!ډGť¦)°¤Ä9?»ŚLűpu´bYVë, ¨ áöşşşsçĎ=őÔS… íq[Ďń6«Ä*®V?ĄhŔ!Ť/ňÍţ/^Ľ’’ręÔ)‹ĹwŕŔ˝^ńâšC‡¶<ăž={ *++IÍ®-[¶Ś1"///%%Ąşşş¶¶yőÝ[Ť J CĽěhE@/ű˝9Za„ĚĆŰýVËÜ:hšŃşÝ ŇŰáe×ę´ Ç1,ĂŮ8†aHůR ĎńŔ 0âĚň "ŚPŘ'!I”š,-ŤFŁÍf ŃŔÎť TBż~gĎB\üąÜwR1cĽęëď%JŁ`U&“©şň—˙÷Î|Ç09`RFć†ih€˛2€ź†Řľ”Jŕ8¨¨€ŽaÝ:xéŽÉęÝ .{ŮyŢ`0´íeŻ©®ą^,űšš°°kŠ1o/x/&yC+(†DÉ?(jäý ‹°H­P(^ýÇÜAďSü¦ŁR(AdY†˘(„™UŮ5îa/»Ěˇo_čŰŠŠŕÂŚ„ělřüs(+ĺËaăFČĚĽÓ××~Ú1·rľx=“ÉôËú_ČBňbŃE„QTdT·®Ý€†ň’B„Q@`¸$ ŤFŹ{ڎŠÎj1›׬Ýŕ8ZĄDůiTŠĂgť+fÜĄPö_22·‰ĚLHO˙˙íťyxUş˙ßSU˝¤;űž„° l˘˛eEŻ?u`˝233îăĚ˝Ţ{ç‘gp;ŁŔ (xĹmDE‘°„-ČľvŇ[şk9ËďŹJ:ťÎÖ$ťŔů<ůŁŢęęę÷tžśT}ë=ßŕ™gŕ‘GŔh„~ý + –-QŁŕ‰' #µąěl%Š˘ŮÔnŐ–IĆ899yćí 5śN—SŻePYU3÷öńăĆŚqˬŕr>vQJc& ° 1Ú¬-ĹÂÉCŁĂMfŁřÍÉ⛇§ŚśĚlÚ}<Âbš;4-îX~eě–á©oy:)Ć6ydšŞ‘műN9Ěn…"ЎL/×Đu+Ýĺ ¸nĹérNś€čhĐ«z† -[ ¤^ `ëVر€ąsCśdđtb¶ja ´ďEuäČ˝)N˙ţ w‹g-L˙úe%¦Jz+0“ÁŔ€}˝ç]˙3śĽTa1ť*¨NŤŹ3(i÷á‹BżX|óĎ=uߤ߾ypń´a%Ő®ă+šť}˛ ňW÷ŢşvËA«Ů°lîč­{N9Ňî*M*»®ĘůTvţLÓ唕˙ĘýŞ*ŘľV݆?üľůl6ňˇ|/ˇ3w‚ý9±v׎\ľ|Y·jń‰_ŃQ±FÍü­­©u0Ć0Ö$Id”ŞZ3ŻŃZ·¬jwË‘VcÎŘţ©qáľZ­ŻOž+˛ âŰ_žŽŹ¶DZŤ°ë»ü˘JGldX”5”6>tK `Ľ§×^q8ÝŔĽyÍB§~bcaőjص FŚ€Ćľé}Ψě.gbb{5¶_)yK–.]Şo8]Îâ’b ”•xĽ ˇ0„$i×:ůŔ‰˘-{~€‘™í ˙˝ ŁQŇ4ěs:ć*;§‡<¸a#1ąVWžĐ H@v»]1Á)É)(šŞ¨ c R<5&K Q€ŇĽoĹ™+5÷ß>bÁä!űr/+~ńá©Ŕŕ­˝§(ĄY·WJY˝¬Ŕ‚ÉCFJT5˛mßé&§u˛X#˘c)@ç:z†YÁŰz;]N(QÔ9µw¡ĂRuÝ™ł%Q‘Q+]ŃrżŔ«%śQ@D„˘"ű«„@ ±ú沽Ý-żţÉ1}ű­˝Í„s]G_÷Ţa¨qx¶î99fPâ®ďň?ěUH’H^Ë.PJőQ4Ő˛óŮęz‡1VZt9­˙5­÷¸‘éŐwĹ#Gf=pŻGhűtć”á=™ç„1–űýÁc‡ż€ź=ń´ˇŁµýí@ţâÓ÷yâ™®ËîĆ"ŘŮĘh4¶eă#.6îšóiFjjęÝ S»öś!DU±A1ˇ @@ČШ˛ë!ˇ¬W˙ë¸QÉýţ (ŠŹ?ąî˙lúĚy…ů—ňĎ@άů„ÂËůµ5Un·súĚ»$I*),¸pîL»ýNÁXZtůüŮ“05g®ꕪ}ťN|}ęŕŕ–ż ›ÍVTT\TT\XXÔjµÁ Ť*;B€klÝ \eď•;üÍř[¦ęŰÓg΀¨čôŚé?~˙-YölŢđ_Ł1=cŕ'ďż%ËŢC˙ÜŁżzđËÝšŞŘż[w}¸-¤ă¸öß9ˇ¤ßaŻ·™źTIi醿n'``ŽşşiG>üĐŇ«Lóş@„} !hě)ďëđĘUöľBUEé©ă?@ue9Śľi⸛§ŔW_|L ŃTuHV6 ÉĘVdůě©ăúÍcYIaHłľz¶ÂÄ+w`nçv»ýĂ5/ý÷‘S#˘b€üŐˇľ÷ŃG D)5%é·/=›ÔÜčýŔˇéÓ§wf}I ˇ>ÇÝ5”«ě˝śÄä~Ue‰É©PZ|%""ęä±Ăłîü Ľ·}c;o,-ľźÜ/cŔĚą‹ Ş˛÷–wőş@*ąTpéĉúvaa!äĚȉ‹‹»|邬 zs0jě¤{Ćý\D (CĹ…ç8tk}çٶmĆ8,,ě‹/ľČĘĘĘČȸöÜ8śkdޢű?ŰůNUEĚ=?!)Ĺh4ľż}#P˘-7Ő MćȨ7Ö˙Lš>;95=µ_†~đ­Ső~šüŇŐÓ •=*˛ő2Ëššš[oą5--íСCS§NÍÍÍu×»ăââ ő“{B2 AVBĚĘUc~ĆČ6›í­·ŢZ˛dÉ´iÓÖ®];|řđ%K–DFF*ŠrčСčččE‹]ó`CŚ˘jäs:ÖŻŞ|NÇ„R :¨żĺô0•ĺ%çĎśŚKHŽKH€ŞŠ˛¤”´E÷-÷?ćß–?ˇo<öËŕîĄÍ–y-Ľ÷a˙đ‘'žîŢŚŻkşć!…¦i………Ż˝öZQQ‘o§Á`d©ŠŞ*Ş»ŢE4˘jŠě•YVUEUš©`ú3ÇŚŚŚđđđŘŘŘÔÔÔ¨¨¨'N¬\ą233SÓ´;vtIŞNđÍ–„Äd˙źk±Eâ\#AëV„ČJ›ý’ěűÎŹvćççoÝşu^cÇE̍Ŕ¨ cĆ(#*€Ŕ(%XS4ą€FDDôë×oÚ´iž0aBZZÚńăÇüńśśś3gÎ|úé§×2ÎŢ€$Š„PQ@ú퀮[‰ŤRąnŐ ‰Š‰ŤŠ‰ uś:1[)J› kâ^~ůe“ÉôüóĎçććę;5˘hŠJĘ(`1ćóŔňzĽ”ÜX7>˘(PÚ¤˛ëĎ}*;&ŘcÔ{<÷<}öl¨iFiŔ3+tJeo§ŢęŔÁV«uÄČ;?ŢY]S=göPTUö¸”`”‚(Á„0F‰Ş)€Z7u5kÖ¦M›ćĎźýë_÷ěŮÖ WŇtÝ#4@he ř<ճخĽ‹ĺČęDÚLź˝Xäv1Íé‚Zö[nľeÂM ¸¤8=-k(EŞŞbŚBŃ&`¦! @ĘŠ`0´~ýzÝćaÔ¨QëÖ­a÷îÝŹ=öŘO~ň„Đu`ôŁh«ě˝kxDÎśˇÎ‚Óiş` đ™É¸Ę¸íe_ď}G@Óëµ™~UŐP±íń¸'Ť^â˙÷ęs“ÉdÁ`ŕMn8Ng<JŐ[ârąüĂO?ůÇU&ŐČś9s®ń ˝ WŮ9śk Ř J©Şu°ňF–Ű|hČAlXyÓx§L)Ąľó\eçpÚ§3ޡBGޡbŕŮ>ţäÓĽÓç€`Ľęç˙Ó{uÍ€ůy‡BăôäkĚĹ×4s8íÓ_öđŽ|Ůc›ů˛żłă …îáăîöşÚç_úĂĚă(P(66ö¶Űn»Ę¬ű&ކ%Iô©ěş/»Oe§”WŮ9ś¶é•c¬Ű3Lô~3fłY„·w|8hřÄĂßĐójěT[`ŚCHÔΔIÓ´©“őW/^ĽxîÜ9˝jˇ-4McڵUL|ôčŃ 6Lž<ů±Çë슊Šrss/^Üńˇ'D;[iXóuľ ŕ豣…E…ápţÂůŠĘŠŰo»˝FMSĂĂMF“€ÁÍ“·Fęw?„˛’˘üŠň ßIěvű•+WÚĎa˙ţýv»ýţűď×⢢úúz_gů 6lÝş5Čáŕrą.]ştuď $bLDA@cz·IcĚgĂápZ%č^Í”i¸Í.“'NNKK{ńĹ˙űßűjŮ3úž4í]—AŐ4L0˝™ ÓT,çq8Ż˝öZAAA||ü3Ďú¨˘(‘‘‘úúžřřř1cĆÜvŰm›7o~îąçzčˇXňn4HIüTvIÔĂľ¨˛çääěúdW¨łŕô"nËéƲ¤ UvĆ|7qdöĎĚěź ąGsőĺÍ:^Ź»¬¬PDˇ”2Ę(ĄŚ0BőâČşšJJš:zeddčÖĆţőŮŮŮţóźý?kůňf¶Ťţ<ôĐCúĆĎţs˙ý+W®lypZZZZZôl“T„PšîݞŁ>¬˛/_ľĽťß‡Óµ;[ ‚`ě¨ďŁÉdňÜ9C#‹uOšÉHě7*;+ČOż> ” ˘ŚéŠşŢSžRŞ/ôżŇäp8- v¶’$),,¬ýc|ŕt~ö3ţ_·&˘¨«ěTýž´Ie糇Ó.Ýk…1¦şÓ€$Šm7çp8ś v¶Ňź¬µŞ˛ű°Ůlý3úű²˛˛—~÷?UŐ¬iÇgţöĹg;Ujpýa4Hš†%IDQJő«*źń±ŘUv§'éĵU‡Ď&Ľ@_Xó»q·Î‹ŽOf”Ú*K˙ô—˙;őă7„––şć…gŁ˘Zďúu]bwzŞk]Ŕ€ HĐť­4Ś ˇ»wľ{۬;SSS|˙ëÄĹ*W+÷†•ĺßÜżčžúâ3ÄľŽ˘(íŘúËŐO$‘2ć‘U0 ’(ĘĽŠ a&Ł( L¨¬j`1„4BU«Ů„h(k ¨Q1FÖ0(*Ö˛Ť «&T„0“ĽŠFhSč‘UĘ$ŠfŁä ’h2HPďU€Q’Ś‘Ô{0¤–ůSĘ<Š˙p¨WŃÚN@ţ¨š_ţÖ0A€¬aĆV†Łh¸1˙‹E•fS+j¸ÇăygŰßźţů€ýÁÎV˘(šŚ¦V_*))9wţśľýĺţ/`„ ŃQŃÇŽĺ–ŘP4а+gţlUőŘ)˘pňčżŢÝńîcŹ7=Ü˝{÷¬Ył¤ú–9r$))©ŹöF’™äpšÖ»ť?ć~3-gVŔţôäX›=°®"˙ĚŃ3ç.¬NO¬˛9»1QNkÔTţţP˝÷z¨+Ťz%Š_čőťÍCö´ }ŠĄÖüHOO?sćŚÍfcŚ€^K9eĘQ'Mštçťwfgg™y/ä¶;^ątᛯ>·UWÎuWűţö«użÚë©ď™Ü8íŁţ ’A4 k‘`0H˘/[ =4¤–!c­…„6†TÓ0i i%d¬!ÔBh5¬iPł0 Tţ ˇáj‡ÓjţŠŇdëň޶7¶mZßţ—ß Ą–µmš’şuëÖ… nŢĽŮ·,{ęU·U'ä~WťP‘5 »ÝK4ÖTYQÚ”íSRR222ćĚ™3a„™3gNž<9##ăŐW_ >ŰŢLtLÜŻ^řďÉ3f?ńÔËc±vŕÚĘáôuŚFSl|bűÇtnGŹÍż?ÁüŻ˙ůuYYYBbĘTŤPŻ÷–mĘ;éěÜĄF¬ŽúěÝË™CĽ˛ę•=Ś5+h;wîúőëď»ďľ[o˝ußľ}”ŇĚĚĚÜÜÜĎ?˙tˇjüřńź}öĄtęÔ©A&ß ILN]ůëßsäđQă~˝ć»>ÜŢÍq‚B×­üűQĆ€°¦2]ĺh5Ôß"Ô~D±©I’ĐĽgR@ŘzGĄć łŔ‘ŕóżćář'¬Kc:®řĺíwÜÝţ—ßĎÇŚ3dđ¦pô†˘vŠë=őő±ÉĆ)sÂťµÇż‹¬*a×Ĺ'{ę]BŇŐ]wÝ5bÄÄÄġC‡¦§§+Šb±XRRR‡n´ ĎV&LHII±XZXů]ż 9&%­O>˝ţĐH5¨Ôb3•]ס}*µčël䓥[‘Ő[Şě¤™Ę®ëč>•Ú?¤”QÚLe§-eő–*»ŘLeo7$ÍTöΧŐü}íéŢóĹÚq1f'Tö¶˛™Mfł©•Ë®’’··Ľ „Ć+)†hń›1·Ë1tŐŠ€· 0@ßĐ—ëDEE”eőë×/ř´{GŹĺ–줤ßE›ÍćqV:ÝMĺőu% x]přűoË+Şş3SN+¨rÓÓ[ä·ŃĘF[‹Ô‚6ţŽöw°+đĺ&OÇfźĚXSë·ć-ŕPłMÖV@ŕ‹A§Y¦Ťź­iÚ÷ß~]]ç—­éąŢŃę[g«„Äd…JWJköŰíu6›mÖ ťkç§{Ú˙ÎEQlůA×1?ţxâOŻmhő%&ZL~3~ZĆŔvlkă4Ś1řË_7vC‚śŽIHîďt{Ť‘PVď‘ Ěl4H"&ÔăUŔf’DAĂÔ++`µE©Č˛ áVł€˘a]`ŽCr=VU Š´šŔëÖ4 #A°Ŕăň`LA· Îé!„˘¨×^Ö:ę)Ą’$Y̰ŮÝŚ1ŁA2› PSç`&ŁÁd”@M­Ě&Ń QĆܵMůű†ŁçďŽŐbAĂ \áł µ±Ľ+†(*VT E†›@vkކBúp\š†±/»ËqCţ;Ţ~« żus´ŚC[î ś­ž|ň×fKD@U:DFFEFFµÜßÁ, ěÔ ű:ŮŮŁß|óͶ^5 —KŞŔb±®yq­ŃtÝęöUâ";>¦«‰Ź #‚š‡‰±ÍóďńἴćŮv^ŤŠüś­Ž_¨¨ěâ¤8ťAĂôčٲPgÁáô:řZ3‡Ó7Ľ¶Ş,:ĂmáBB|\\rúš:ÁZué…P§Ăá„qcÇ•×5łó ś­V“3űp™xß%9>*ÜVSç˘ ˘ź:8Ôq8ˇ¤Fzy]łžÄ-* Vpzä÷µ#„řosP`×­8N߀ĎV˝š˘Ë /çŰkmţ;ťŽşÂËů.§lŐü.çFĎV˝—ďżŮźwňčŮSÇľŢű±ÓŃäXf«®úŰź˙§¶¦>x{Sčäpz”îí"ÁąśÎş;Ü#â®¶ą]ÎȨ†şŔ‡őKĎě?pČĺKç/ś=ůĆú˙XňŔŁŠěÝłë=¬i‰Éýć,¸gď®÷M¦°’âË&N?{úxTtěśů÷”•~ńÉ{pÓÄé&Néŕ8śNĂg«ŢËś»î‡˝–P×J˙ކ Íýř“kŕíżo¸{é˛đČŻżř¤˘´XU”ĚAĂć,¸çŐß=µę©—÷|üžËéřjĎÎźţűŻB¦ÖÖur8˝>[őjöţ‘ŰíZ´tY0ďÜńwŃ7Oš€„¤”đ†5á?[ůÔ›oüQĄIÓg :˘»’ćpş>[ő^>~ďÍŘř‘Ło*-ľ’”ÜO2ôýn—ĂSďv»ťáá‘Q1qĄĹW“RŁ˘c'Nťił\hkőe]­mÖĽĹ.‡˝ ˙,ź­8}®˛÷^ ćtÔť;}üř‡dąÉ:¦Ş˘lČđQŐ•ĺ°äGŽ˙pČăqĎ_ü˙.]Č;ţá¨čÄäÔŃ7M4‡YAĽyRdŹ»Ĺb /,¸pü‡CĄĹWfßµ$Tâp®~mŐ{=~âčń[î8$kŕ,}Ű`0Î_ň ľ=gţ˝ľc˛FŤk<É­0lä;aňŘ “»5g§űŕ×V§oxm5zäđčř¤¤rfwyŔh4ŽĘÍ śškXŔž¦ŮJSę·üů?ăc#Űňhĺt7®zݬh‚ ÄEó&7śÝěTóë Ü4[ýńŹëB‘‡Ăá…¤iš­Öćp´nŰÎáp8!Çî°JKOKMI•9Ôůp8N›˙[˘zě¦úűIEND®B`‚fox1.6-1.6.57/doc/screenshots/xtc.gif000066400000000000000000000421671326741342000172410ustar00rootroot00000000000000GIF89aj?÷ ű3®sY)˙đ\=.Éěú°Y¤^‹žăă%Y„ůřôőřřţţţŐ±ˇ˙ÜŮĎe¦ľç™v2z´][ZţáÓţľˇ˝Ľ´ŮÜs‡čŕÎd—ÄĘcc˙|ys /ŤĂ`•éxŐ«đŻńîä.>>Ş˝Ë‹\Gť›’V©Şqµâ­“…ŻŻ˙Fd€yÍţ̶íęŢŹŠŇÎÄŔ{´·Č×lkiˇˇ]×ÝÚ**˙˙ďŰ­°\µ°88Ae~hzŁŁšöŁ~LJGÖâé×ÔĘ(?Ä‚dfôrőů˙ďç«ßô…‡F{őôń–’‹ĘĘö´«ĂĆhvN<"d( Ć lšnĂÁąîĹş/šÎI/tťĂ¦™rŕŕfČČűü×[˛˛<¸šfNJŹżź¶ĘÔŃřŁŁ˙ÔŤl‘‘˙'%$ňđçśqfډ‚#b‹n‘VX-ěÍÚęĺŘ>^Aݰ°şŞ†"šž¦řöń˘lStrl˘ę ‡öôňëÝÍ´ÄÄĂĹËËćÜĘČĆÁŔľ¶"i“ĂÓßÝÚúť SF˙W®±/.-čÜĚlÔÔ|{{~ňňĺ«ÓíÜŰ'©“ÍĐmÝŔ¨ţ©‚”bKž–’Ť¬ Ëj+Ł+qŤ”ŢŇąŽţţu—˛gH5ÎÓÎĘČŔż¸ŁŁŁËËËčăăŐŇᡩ˘8QŕŇ»Ź“‹„ş´źŤ«Á ¸»a»»»ŮÖŃ– uu>ą¶°łłł”””˝ž®‚VB’Žyy˙BCB(JUC~‚ćéz†ęęa¤Ń@všĘƻےq±®©}ČçRUQN·^ŕÝÚ‹‹‹6e‹*'aŰŰŰ‘Ěö;rtsss˛¦”ććýŽ–,j?˙q$ŕD—‚*\ȰˇĂ‡#J,(!…ľ‹ú(€ŁÇŹ CŠI˛¤É“(SŞ\ɲĄË”)Ú‰l'/¤<™ ŰqÚ…C`‚ź Ö ăAt Đź÷ÂĘŁM›ż 3î%fŕŚDQµ%JÄtY<śf$X¶uYRwËüüLt/ěQN~8…YF(ĚŁ îÉÂ;U*ßźĽĽQ0+^̸±ăÇ#KžLą˛ĺË3S–丝 A ćĚXˇžxyUÍďŚËÂh[6•`DjňDĄ¤ŕ˛Ů/dq’u/‘;w%îÍ äGŰĎ V9•ŃÔßmPíúyť LD?˝W˙MTWŤź0bJXż^Ra0ňŘËźOżľýűřóëßĎżż˙˙(`’ÜWŕ(C$8JË‚ŚÂ{¨u$¬±†_G©áˇyÔ%‰6aČBHRXq˛Ś,\Í„l˛¸#‹i©qχϩ!Ł;˝q€‰3̆/„Ä23ä]\Í•,yb˘?G­Çí| ‹>)đ!Ď•`†)ćd–ić™h¦©ćšl¶éć›pĆ©¦$e6Č `Ƣtň‚xň±^…r˘Ú<+ßëď˙˙ă{‡śŽň}â|tx€@:đŚ 'Ř>ţá|âŁDŇ@ ó1! ďx%¨ĐÁńu%<_ É·Âđ9á.ŚA ÔG‰OÔP„ć3 v˘C Bhŕř˙”‰` '  —ČÄ&:ń|Ä`ř6¸A&$q|§ŕ`hŔ„y<`|o°ˇĽáWß9¨J(A opĂ Çg+2á'řŕÁĆŠďóxŇE!ŚŹP‡:!ľ‘2‚ĐĂđ)ňŇřÄNzň“ „_Ç—†lĐL _)ť@…l|1Čcń&t …ôvq %ě”äĹ)h° !śŔxD-Đ!†Ź t°ĺ.ŇĐXXŕ‰TGÄ× #“ňĐD ħ„!¤#Cŕd(×ÉÎv>q”!%(áňť `‚(q˙‚/šđülÔ)OXŔâď8AĂh ”°Ŕś˛RťNřÄE)ŃhbS‘Ű _ćNyÜ™JŘnႺóĄ0Ť)ţŕľ{ÖÓ€ąDźÓCň”}MĂŮwĎ4P!|G%&ň@”ľŕ~€€TăŕLŇ€ü Á5eĘŐ®zµ‚ýűŞţ„‡˛ú`|° ü)Ö¶şő­ăł \A׺Úő®xÍ«^÷Ę׾úőŻ€ ¬`KŘÂö°M¬bËŘĽRˇ'°X…d'KŮĘZö˛Í¬f7ËŮÎzöł  ­hGKÚŇšö´¨M­j/ Č®Â#­lgKŰÚ˙ÚÖ¶uX­nG›Űúö·ŔÍ€5vKÜâ÷¸ČmkqY?>P…t§KÝęV7Éí-Ýîz÷»ŕU®kťë@:dc~ý/g·«Ţöş÷˝Ć]nsE8ŹyŚ0t Âz>\< ‡čCFh>ACš÷ʦs;Đ„­š/˝đµlř(7°RŹ Â#h€Ťđ! @ń#ĚâGĽ#-±€ČÝ ŰřĆ8ެ|WáÇ4ă48 h°Ĺ„Ď §pÄ!~xŠCĚc4”Ý„¸A /xđ,€ŤĚNŇ|GĐ€§02†s,ľ]Čň˙Ž8ř>lpqŘpś„aNfFÇ<ĐxŽľ Ć9N´˘mĽă›# _Ž#1ČââMĆ%&pS@ř3 Z „,ź1đÁźOá\¨şĎ8:N0č¬Çm>•i7¤™ ˇŞś\c@p„¨i‰ tAf¸ĺˇMíj‡·Ńá{%š@[vô€ˇ#¨đ"wŔ `u’Óŕ4[€ż>A’ß`†yXĐ|öuf-k[+Z|'`e/}Đ´˛T‚®O „!§»ÝŔ†ZÚ(áGE´µ7ÎńÝb{§7Őźyé@ČěŰŹ˙xŔŠń»âOĆ·ľqűb@Ĺ&ď FnźĆ;ÎóžŹŰ|°řčrőĹÜĆěőąŇ—ŢY ?7©ń{Ä'¦NőŞ[ýęXĎşÖ­Ž]+Ń[»ŘÇNö˛›ýěhO»Ú׎vW¬bÇ®€«‡»Š Čýîxw˘Űážw%ŇÝî}Ľŕ˙·w×Ć}đü;âĎřřžąŻ=ßO?ĹSţň'ßă#{řńŤ@  —FřŞZ>Ň˙—ôß'‚Hľ˛Átx,Ƨ@ň¸|B Żű,>Ý‹/ĺ웺ęčűńťl źIď>:8“Ľźp~ćóľůČż  ŻBlgÁFŢ”NxÇ˙‹Żé—›|#Ţ.zá‹?*´ °,Fś!ßĹ0jř„€Őő·?|$ö[ĹOL𔀶 C1đŹ`ačĂ{QĺÓQoŕbď`HăóÎBăcMúb8t4Pŕp€÷4§k@n/¦ ôź uâó  bN@·¬ rˇ_É7}\U}‡‡Ž`4@Üç}SÔt Np ”€ Ž 9wnŔ~j4ELf¶”ŘŔ[6>@@>ľŕ0`€oähl/Ŕĺ6H·¤U—¨ä’µ‚Y&k‡ŔIYÔČtć˙Kâ7"Ő`FâđŻ0>>0 …° Ě ~”V/`°Pe’(~ öbBô M `fx€GÝ N M„NĐ“g„]…„á€-0 Oř}TDHĺŘPJ[Ř{äĐ ÎĹ@Q]fJdćpg`-dC Ö¨FTpf†¤Kµôn°AďĆQo„ U„ĺ#tđHQp¤$4p@s(~äÓ e· ă ŕ ŕ˘x ĹQLPKJŤtŕ #  BPŞp˝GnâP‰ĎF#Mđ¬Đů%âŔ|ŔřRÂřâĐ-˙Ó ł —@B`T/0‚EY>ž`!ŕ C§”¦ŠőlÂDń÷ ;”JÉ”âD!&> ]Î'Ř@ #v2dH’x>H ó@E€ CçJ'P•%>Źp—Źđ‹OĺŔ•ůEzůÖŔ„4Ŕ …°‚ď@|‰_"H>z¸Ř AeO5z }YfŹ3 S5Y30őđ ˛u¤ą>źĐ sŘ{Âg>ĹG>§™šî#|­™>ř" ´šď[Ş>ź° 5 ť¨{şą›ą™W“48›ńSśůăśT›Oô PťĚ‰śŘ©yogxŮ?ŇŮťŕ)SĘ˙žëóťäyžë$ڬ°žěŮžîůžđźň9źôYźöiź†ôwźpźüŮźţůź : Z  ź/0žč©–…¸ ĘNHŘ‘Ö5ˇZˇzˇšˇŞˇ‚Yşˇ ˘":˘$Z˘&z˘(š˘4„ŞŔ0Ł  0đ q Ł8šŁ:şŁ<ÚŁ>úŁ@ĘŁZw/šŁÝ0S¤Jş¤LÚ¤Nú¤PĄR:ĄKşÔEÉŕ˘Ń°ĄŁż0Ľ8š ăcĘ ;*x ŁŃ0kJĄpŞŁCšŞp łř¦ `ŰĐi ŁK x Łş:ş—`¦9 h ŁÝ˙ ‹§©’:©”ŠŁĄ0y Yşťç Ş —p ŹzZŔöŕ§ĐŔx0Đ@ö »0öŕ™ ¶Đ ¶ 0€ «¶1ú©Z©T:§ŞĐK°‹Ú R0;‹Ł™đŃ€™ jJĐ€ ůĐ €®â0ŕĘ ŤJ¨  ™€®ö°Şâ [ŞÄ:ŻôZŻôz©É ® ©ZĘ âĐ 0ú ’ ¤ŁĘŰZ«Ý €`€° µş®ă0{ Žp ™ŁxčjŻNj¬Ń äĘK° s°ż€Č ­0š «®™¶p ü«™˙ „ŃĐ üĐ ™° x°Ş:¬ ° ¬P«Đ łĐđ»´LŰ´Kz©uĹŻśĘyŞŔ [ ¬ ` ĹR,˙ Łâ0­Đ°Ąů`§¬ >;ŃŔá®Ö Kŕ¶6‰¶N»¤ĆŠ¬Ę ŁJ°ôŕ ·´ Đ ¬Ú«ö€±™ "k ö° ÝĐ +«öP«ů°¨Ž0,› ö`KP«s»ąś;·Ş}Îg› wE*ŁŻ ¨¶Ajµ@ €ÚąAj¬v:‹1Š :Đ JşnúŁů0±0Ę ¬ »Â;ĽKk^ŮpĽŮ0ş†WşÄKĽĆşŁÚĽŇ;˝ÔŰŁŐŐĘŰ©ĚËŁ»đdJ[˝“˙úĽ@šŃ˝ŕ{ľčË´—*>RKş9z T ¨fÚ Q ôŕß«¶ëj°~›ľ@*ľ?:@iëż|Ŕ’şľáÓľËűľů0¸i P /Pj1Šşäú°â` ¶ ®JąśŁěµ[ ´—p sP ‘€§"»¦†şű?™ż!\Ă5¬Ŕ/ŔŔÚűľŃ@x¶™S čż˙š¸ůpł€Ŕ€±6,Ł#Ł¬Đ­iű{ (‹â Ĺd*K ü` 4€¸ăбO|Ćč‹Ă:Lµď»¸¬°¦/`Wu 2:Ĺ—´ oĽĄ|ĆQ Ł z i› ·Îp[ Ł€˙:Žđ­Ŕ;_ł4ŚĆ”<˝jś˝lĄć[É8úÇ»Ą‹*;ŕ a€Ł— /¬Ű všcËɰ,˝—ě˘@šłŹË>ęÉ:J;jƸü˲¬—küZŰ Łˇz „š   «´“ŚËş ĚÔŚĆł<µÄüľ?K@Ś EŁ@Ŕ@ Č’)™űV‹Ě~üwĹĽ¤ţ0Ő<ĎĂ{ÍîkĘÝ0 Ëⰸن1jü° »@ «KŔÁ™ŕĚí\ďüŁŚĐeૣ—đKüđK0¶ťK > ÇŽĘфڦKÇ(˝ĄJ‹Ę¶0áóŃ’‰Ěcű¶}˙LĎOlĎ lĘ/°iŰ  0Ž` ů±ĐĐÄ™¸M x° h<Í=ęŤŕĐ=¶ęm»ÄFM˛1[¸ă°« Łą:«ö€ş»@Ç  «Ýş«ü𸠱6}Ć8˝Ă8ެń Č˙š×ÉJ˛Ň€¨5ěÔ<ęŕTmŃăjąE±=śąű­ëŇö€¦€ Ş”K®Ű¨×:×s ÉöЦëižť±t]×6|×™¬ÚMjŘ;Ę+°‹-¨/ŕĘxpŰ®| ¬Ś°čĘ ® Żą Łđj¦ßú·ác¦Î\ÂůđąýĂ2ěĘÇíÚ7,ĚśÍ?š MÝ0 Ű˙ęËNÚ±ŕí§Ü]Ýě{Ýž*ÂVŰtLżŰP řŁ€˝o+Íî\Ţř]˝¬ŤÝ2ú“ŔÚÓ,ńݲ p ăĽâ@«<ËÉŢŰç€^›ŞGűÂtśÄtśŁoZ´2ŚŁxšŰ©­±9şÉůťĆÖMËř¬ĎĽŹMÎ~ ¶° €Ŕ­={Ş•Üŕ8ę€RÍŘ2ÜÁ9{Ü‹^lµ†›@ŕ ëž™€¦o ¨âŔŰ€:B®;¨#nŔűťŢ¦l®[ŞŞQ6¬Đ±ăŠE¶9˰ ~ßMŠŘ ĎŚ Ł>ű­@޲ĐpÖB­ą ˝±Ú}Ň4€¦›ł»` I\´/^«oüĆW˙îżYţÎÉ*ŢMÝ6.ŁPÝeŕ§{Ç!=±fÚ«€űŞ4°ÖLÍ ![ć®›ŞO¸=üh» _‹şŐ Ńśč–\âجĺ>š´Ëݑ޹ęÜÝ5m¤´žľ‹^¨˝Ž@čěłž× M¤ĂíM[ě[ľ°ÝüÍ,.ęŽćx€±ÍťĐp Ű Ííía.ÇzŰÓ*˝ ~SpŇďPJíýťĎűś P/ít}ąGÍă` ŕĹĐ` ŽŔÖă° íĘ«g=-ťŃě®ć8ĘÇŁJ0ď1ş¦- ̄ônŃ©ś® q€Uů름~ÔF °… K¦ ˙OćfkŕŔ ńÍëÉ\Ŕ> P 0Č ĺ@Ŕ°ʱ!űä„ýńůňÝ˝ŢtŔ¨ ˝ĺíĘý“(ÝŃ~¨w»áX/â°ëÉŔű٬ŕó Î ô¶ş aě°0˙¶Ú«ÍÎôÔíôň.ö᳨§pöVŔŃ‹şÝĐŘjÚĹ©JtOëvŻŁ˝úáŞíÉŇ}á pż0÷Đ ö‡_÷¶~Ď~jµ ú·Q€;@ů Ľů»ł‚jůçŰŕŹ~ů®Łv˙“<ý·>ŕyĘÄSüävzŕ5믎¶ěŻ‹ńýúČߤ±oď=íĎ/Đ®»0žÄ3ţä m l­đöź˙ÎÖÓŠçÎ+ńMĘn°fşôŠ_­kşëPĽ»;¨oę»>J»=˙ÉϤ±˙ł‚ü·†™ŕÁ@ ´q¬Će×­ nĐ.Ť+pˇ8h€–ŚÇ E@¬~RäH’%Kľ°¶jUU&Kúă€Č˘Ź—ćEs$.š=†¬2uËč14ź mů„‡!LL9„ş„A·źIń¸šRťńűĘ _7{Đěe":ÚPqٱb…Çĺ\şuíŢĹ›×d©/üÂJćj,8`­rŐRä%ĆR\ĘwIŻ]Ź“-ĎE©’Ą^¬yÉÖYGĐ2ťÎ”ĎQľÓ ^t;H•˙­L¶ľÇ”©-śövJćwmâDŹ~azo{şŃBs´< [€2Ů»ÄOnÓËÝ˝’Żß€6ŚX±KňáÝż™yĺú»ţnÜ(š4Ó ů‚H+Źpă˘]ţ-7ŘřĂ Ř^Ŕ#š%ća€ ˘á'´€H &˘đ€h+Ş‚†]–ŔŁ2ř^„ńĹńţ l°ÂKŚ.ĐB˛śLľÍ€©ĚĆń1F#]ZÂ#V#2J)éš±ĽŃĂ‘>.醊¸Šç˘iđ[–03ą–€S 6+ÂČL©2ió{4O×ŕ”ŠÍ?ˇ|QH-˙§D4QEý®JólL/Ç.‰††™Â Đ1S qě9‹w• Aë,OAíĆ‘ÁĂČý #mV\u¤,‚¸ŃĐËüiQa‡%ö=GŻĽQ˝Ĺ°…Ň ŁÂ :ĺp¸źvÉgń80qěÉç,?ŹL¨KÜ.9 ÝÜlˇŠ ĄlůŃ׼™e…F©iś%čeJBĹ:б@Süȱ]”*EÇ ™îˇ¬ Íb/ĆřŘó’•44*ŢĘG @ö )ä|Nľäµ±˘aŹK–čćČz‹ČR6rˇ !ËçVBކgźżŚŃ^ĽüiÄƨihvŐ[˙§Ű¦đŕG­]˛>m4[ľ'ä¦29Đ‘[Oî¦RęP•ˇŞĹ9H7ŚçVcHł¤/j{Mi>Î<#´]wń5Ő–@¨eźjËGD;í ™zaäłž 1Ä 7í4V.,KîĽG—Ňn,•ť«!@HŻ·ď!ńb¤Ś2@Křad=%ůs$Ëâ?•‰ĎŰdS‰‚čÂŹ(“Ĺ ‰˘AP‘T J-':R’2SVâźC.gAµxÁ´>Ҕʅ3„pĆ0Ó‚‡  “6<áIőlĂ“ÇaL¤ta„?JşTÖ1tR•şT& E NÍDŇbkŞsëˇ FCŞÇ°&“XG-IRŰp~ÉÉ"Ž,‰h@ŠŃŽrH.!±^á*›ýŇ$¶cęőś…|IO4ŕú R˝…ä1‚˙ůŔ$n*—łXUöc©,ôŚPΰŐçhš8řÁ“až "ĎiYÖ´0¸M T{’LN€P…ô1śÎŮS7*Č” yS-ŁőâuřSĎŔŇm°ĹÝ$góâÉŔŐ!„çi—¸ť†ŤC!1%Dz뜥!gYQsĆVĹqtD+KU&`iĘ%7fEîĹŽ[’htĂEńýZIÂp€vrj+Ŕ‡fâIqM> AŠ(±YČ ŰAĹH¸ůTú´„šĄŤŔćŠĆk¸‹_ăžôQ§s&_&–yŻwY1X`ő랻¨Ć[2hFCF+jľŹi†"ąKŔŞNm˙Ü’H:ă7Yľ&FÖ'ÂŠŁ„/č§@r{`‹Çd2IÚP͉}Y =‰ °@]ö1’AsŔňŃľ8ŚINfÔ ,ŕ>ű Ę*­Ék@4PĚCjťR$B˛öâ%+÷hc8‡Úú\V/ĐId w˛áaO?ËTęą%.—•›Ą8„µ#W* ţÉ \V.h ć4dď‹g)ŤŕżvJ'™_‡ŤŻâPrÂâ”ăg†$žä€R·4ĚqôtO’ŁU®–µn –Ú‘anGlJv \ż ´¸ źĹŠ•öčésË«ťĐÁ—×@R€*ô­ď;Ĺ÷>‰Ł˙ëă™˙>¦p1ĺU´˛şęv—[âÍžF­"ť„¨)©5YyG• yČvÄQnáyzŮĂ#ö8Śň˝oUôűnĂ.‰zÖdgdł¶˛Ů(8ÍąBÓń–đ2żđüÍlö]Čç%Ě9Gä- ^¨ßÝ D7NůŹVľo—ŁřP>‹F$ÓŤ(lŁm™Ź,)˛FG3ëoÖÖůío˙UnĐÝx©Đ®[ŠĐ@zj»ßŕ>řDÉ˝ĺtˇYŤܡ ENôąřaő‘Öü#řBĤ}6Ě„ě#< Öťôw€Š$-˘d}AÄěŹěšđď1|×·×Đ´± 4Â<ž$˙—Ą ˝K¶=-Ď âŘá–t/Ćn°’!Ďi ÔÂť§÷ç+ňÉÉcőËí"^6°Ńb=ăd{…;M*ɲűđőމ=âÓ\g¤ăyřž VMŇ[SŞĆ—ą©®Ë„%ŽďĂ“ X3Ý‘q~ ‹Ř„č2:b &xÁ ÖH]pŤ z?ŘcąĂ{ą ČÂ:üş?D@2sŤŤŇ"k Şx+ą¸ţŕVňĄPŁ nB± Öđ@Ů(Ö¸ ăh‹ú:—h° ź°ž"tż´Śř+AJG t¸(’03%>ËčBDa‘ąXł1¤Âď°B˙ŻŁ˝ÉÉ"C4„Z‹†ąZ¦0LĂ<$‰5ś˝)S”˛ĐČŁ»…8ŘDă@Bd°)\"3*¶‹š‚9čS€ęB×sD€D@“‡j:(Ž ÉŻˇ "Ďű'3ʤLš)(†jĐŽj vinżTĚşU„ą÷óDÉů_,gF«ş,ŻĺřBdd*e4AÂ3# xŔ†h„µă«‚x ˘Š˝ŇĆ&ăF,|;32:@AČĆvLąwÔC<ÄG*ÔÇ<äÇ~|żLĂ0ÄĽIs§R$_ú É 0<3ĹzŚ˙¸1 #‘űrH˝ H*\ÁăK>‘ř”büžĆŃ–p¢Ť°‡í`ŠëĘ>2ŤŔ ĹŮŁŔŤŘôaרÍČź8ŻŽÄ‹Ź ÁűóŚüŰ뙍ÇÁRJ‘SŻěĘ6Ď9ą ¬ [ŔzY@jTňĘÉ‚0— ˇŠvşëÂŤn-LăDŁ ¤dFD¬‹âC¦IÓ0ëéŠTżsI2˛đŘ¨Ż´Y¬€'±ŕ d[( #1 ţ9˘d4ठş|˝€ ʎ ‰¤$ÓôĚGAŮ‹D´ËÔÔFĐôĆ×´ 1pAş¸Ç/»G؄ټ˙ű3IËŻł¸ť–IЎkµZd — ĎC•|lń< IŤ9cą€IŢTąŐ”ż‚¤M—đ$D`Ęęq €žČ„  ł{(%Ń"ŃČ Ý貧‰ _:“y¨Cx±…ó3OîěMďĽÂ} O“Ŕ?ÁI%@Ť*BŹč ś>·Żbxa0᪢ýLŠďJ¦P7—±C…?eC€LP“h6h®Źx ˇ”B3u™—q™ a )•—Ń EęžČxŚ3Qd9ÖdĹşt»G2łÝ<ŇĎDŃ>Ď&ŤRGôM¸ĂC ‰Š‚+ꉻӒH9¬‘‹˙ŠÓ5˝Ň*śŇÖLĘ% 8ľ.5¸&I ÔŽLâĘ«Vj@EŃZţsA6Ó€“ń™µ0‹­#4lÓşČŇx”Ó‘đ¤‚3Ď|°¨dŤŇHźĺ Ŕđ»ŻéĘ®]€˘ °¸ë`7Ţ‘ŃND/=É âšTJ}Ó% ÍK űŔJ‚9%°#Yťoɶpz‹„pV¶3sÖÜH K¤a…¸!ź ľ\•Ň$ýN×´ReęV‘Ř=o˝‹JÍ:ŃD×mÜŐeěŐq].¦lבR×”>F}™´‹›@1;Kt˛“á9ÇŔ ~¸¨™ µ°ł‡y† ˙“ u©×=|×nüM_ ¤Q˝$ÉKČëP Q© ‡\Ꮕ©šŃyPŻç ĄÇL7Śŕ‡Ë˛/íD•XâŹŇÄ‹‰{8Ąt€58_„Ő€Pxů9 L•Ű[śÖŕxŽňjt“ŤŠP0Y}őş„ć`\Zˇ˝·|•zMź±ŠNł±Pś¸č™â Ýá˝Ű±[źi7×hśň ěÉtŃÎ X ťËŚ…ÇuĺŘëń'ÖË/ ZĂEPyu\U„\•\»Đ!L¶řÉ#ÂEĐ ż0…“k5±°‘™éůĎýÜz%[^»ż2‰¨‰#k­ĐZEŞ˙Ĺ™'%,/‰ľŇ“Á:ú‰´Yú ا;Eş°§€"… µĐ ±őÖصżÄýO%krŤN}TB• ůŹ­1 ‘ŤZęcŠ®ÉśŢČ¬ŁżŠ† HŤf‰V°»±­Ü*ĽŁˇ&ĐŚč˛OńĄYÄÁ"µX-b’Ĺ @ ±ůZěHż‚ą@@č)˛řž9ę  <™“Ô\Ĺ^'cWş™« ĽŘ¦9íť\w×µÜ˙u áĄrá3#ÄE%Ĺ7 A \4Čŕ!/dÜ~‘&1O„“Ę )jđaL $ëJAB6Ö¨Ž@ÔÔhßCE˙'Ž(VÁ×4:+Ţ€_paVĘ@ŘĄpáŹë:ŤVAÔŕÚP4–5Ž/3j‚3 Hc¸…#¸y IŤć‹—© ޛ叧9cB.ĐNQ˙}ť0 Ď[uиe 2däb˛ˇkĺzĺâ:áYŢ Z–1ľ<Úm]±8Ó€ń!AŠ˝yÝS6™×vŰš¨ŘÎ$‰Ő˝/\şI6en]lvÇţW¶ 8‡ÚýD ă¸đ–Ć)ăT:9I qČw&¨0[iäXçßs“ăT z pŃ[ r(ŤČŁIܦç$9čˇhśY‚†äH·¨0˙‡F=Ęe*íćRţfj %9ŃVęc2ĄŃú‰¬¬Ú¸V˛XÔ`%\˘Ŕ›^Šë`™pň>ĂQ›fŃ:Š*RBÉpśf©"¨±łč2Çś°ş®pşŮůÍGnŽÓËí$I»Í§Ó­L†¤H¬N>Š ą"VżúLŻë@ă˝-—©AL­°4ÖPŻ¸ÉŤO˛`‘¸čÎ PŮ(_’.¸?V ÖÚß{Óe¦şeF) QáîĐß§®h8eRoĆeäÁz°pŤjĘÎ!Ł­lěů±xĺěąP+¶úňłŻšaéLźĹ>í¸®ő đ<šĚ°Ń$É˙‡ř¨’pgÔÔCľX…`H†łčÍĆč»<ľF 3 :¨Q úŚ®OńdąŞ≛dO·Ü“‘É,âkç@lĂ%Ä©Ţ;ěXâŞ[Y‘qAGőroëmDľř„U@)&ĺĂĹTŔˇ$“Ăcmk¤E§nQꦗłpkÚ #´Č@%VŞ”sŽř5—ŢÁđô!%sa ˛jçÎPU{:7oń@”«o(ÓěÉNn¤:‡s(¸ŐB4‹ÔŔ4s(w.ɱh étB‚:ezÚ‡" Ć ”Á1±ç­H ¸`'4’é¨qcí*Ô3 ŕr?ó·Á0ó1'ó˙27ó3Gó4/s!s5wó7‡ó8W… 9/s!x;×ó=çs>˙;t@˙a«W0ôCGôDWôEgôFwôG‡ôH—tCW‰UČěIÇôL×ôMçôN÷ôOőP÷ô:xąJ7őSGőTWőUgőVwőW‡őX—őY§őZ·ő[Çő\×ő]çőU?ť^ö`öa'öb7öcGöd?ő_·†fwög‡öh—öive·ökÇöl×ömöÓů„÷p÷q'÷r7÷pŹ;Č…ug÷vw÷w‡÷xw…dŕöz·÷{Ç÷l÷vňŕ÷~÷÷x§„€'ř‚˙÷Č÷„Wř…gxZßw˙* Jx‡~Źđ 'xO°xJřŽů€§‚`hř’7ů“Oř}‚Sč€HJpyX€—~3 '8'H!đ4ř&8Gxůw „ĐůđlřxŹy   _‹úřJ ú­˙„­×ú¨ďz`y”'ű˛7űcß÷HsHS0č&P&đ 3 78\H 8%8 H'83&@\PG8„4°xŹSđ&p pGŔ Pż8%HC° @G8t %@‡ `Ü;\Ŕ–?±?űŘ—ýŮwřdůxµgű˙S8JHĚď€xÄď|\x8túÖďÂ7|\đă?„w|Č?Ń Ŕ†Sxż8JŔĎ\8]8„ đ~&¨ţň?…MA‡O€}Ú‡˙ř—˙—»}* ‚Oxy—ż˙Đúݧ„'iĽÁö‚‰:i(19ÎBšGoĽxAéÓ‹…”hĐHsj! :/Ąˇˇä Ýś˛Ä‡G€P<áč•`«vňěéó'Đ B‡-jô(ҤJ—2męô)ÔU°pŕ€µ cŬZł> ä•’Č­Zßtđ!Ö"Öłg}¤IVmVďpęŚj÷.ŢĽz÷ňíujŐ«p˙†{±0bµŹ*RY•ě1äČ’'S®lů2ćĚš7sîěů3čТGŹŢ ŘjÚÄŞĎÎ]íú5ěزgÓ®mű6îܸ]IĄjŐUěÔş‡źNü8ňäĘ—3‡Íűô*ŕ¬Ô~j˘ö™ŞÁt„4‡=˝;řđâÇ“/üÜwôß›8±ŕäÁ‹ę׳ĂÝ^ľđ÷űú÷óďű|`Ň˝@‡CäŔ)ńY×?–Xb‹YŘĹG 6ć`s!wömŐ 1€`śVM4D ”@h ˇ‚Vůů÷"Ś1ňŕoę˝đ„Čł ľŕÄňČ“GŹz3 .¸€Î(» ČÝ€t|"Ą˝ČŕËVSjy˙%ńĽ•Rb„L_V4e/¨ŘŔbą(#śqĘyŤéM‡#.ňĐŁ|N¤ÓN;„™Ý‘ä‹&8áÄÝ»â‰+ľ8ăŤ;ţ8ä‘K>9ĺ•[~9ć™kľ9çť{ţůć/Ś0úŔÝ -ę©«ľ:ë­»ţ:ě±Ë>;íµŰ~;îąëľ;ď˝űľ»*¤ŹĐĎ §˙~<ňÉ+ż<óÍ;˙<ô©gÇ4ńĆG=öŮkż=÷Ýç®Ę'ÁóIő˝ř‚÷髿>űí»˙:ř_—˙pďŰ?ţůëŹűvBř˙FńĚWŁý°€<`úbđŽľc¤ú(Á R°‚ßS1ř@ôÔŹü C(Â’°„&ĚRŠ?€Ç0ô)Ś“¶ÓM<¨hÍcfłĺđaŹ)Ś&3Śí4ŃN4V±h)3LŹręó )Íf6€Qfü V\euúGA’ôˇ„ÂRZfôáú$f˙SˇÚƇ˛µ­n}+\ŃNîp€*&=‡‰Wk:óŽŇ4.ăDróŚÂŕć˝xO\’‘ŁdpWČ` Ĺz±? "ŕa‚Xa,¦1‹ůŘr €žQýÁ0Ýb>3ŚĽâ5k {沣P¬+]úÎAâŇ]Dlb\+Üá7’sÍa]+Z 0·ąÎ}.tŁ+ÝéR·şĚÍ‚s±ŃëN·Řŕn°ˇî’·Ľć=/zÓ«Ţő˛·˝î…n%8‰ÜÓ€°+P·„h0ŕK° €,ŕëI4ąőc@&ř‘ V¬ á˛Ĺa‹L@# žđ ۢd ΄-˙n@ÄÝ0+ĆqâŹřľâčJŤL\ľ1Ž'X`ăeb¬ =.Á űXĂ΄=^PáţÚ#€P1?`ߏŽ(14l!aě™Ć8řQĺ|9]G>r¬ć5ëoÇ=p7ćndb ¬P—8^‰8‹CÂ4¶ň±Ş G G&hphł¬P0Y q4ş÷=´8.‘ /żŔĆlţ4¨Óçf¶Îj­ăoě^Ě:T‡şŐ®Îߨ9ÁWÓşÖ¶†V¬yxë]óšÍą`Ż-l˙ş˘Ă>6˛ Xě'»ŮÎn߲gýěiS;{Ń®6¶łíĽ˙kk»ŰŢî·ż-îqĎîÚ\şÓ­îuł»Ýî~7Ľă-ďyÓ»Ţöľ7ľó­ď}ó»ßţţ÷˝ą _ž®pྦ$<áO`8ÂN #$ÁF Ĺr‡ ¬´ČA¸ŃńŹoÜâ580<®ńXĽĺ.oy ^.sĂŔxůÁgn„Ü\ćŔp¸Ć's—Ó"á/§Ez®óĄ3˝éN:ÔŁ.ő©S˝ęVżúË®Á‚?9řyÂÁńp8ě/zĚn„\ŔOČA×YNvnxé=‡ČiŃő'ťě‡- ArZ0# I 9$Ŕř$@Âđߍp†7˙>€CQó{ĽI0x<Ţň Ýďi/:8‰źa†O˝ĺ1ź„'`˝ö¶ż=îsŻűÝ»\ë%u ş~š'î57ţŮ߉›săÜŕ†Ĺ‡źńč×|úFŔ;0ńöësźű©G88RŽô˘_‡âŹ}˛ë˝ć'~úÉnxâaő~FÖQsÉÓBńĂ_‡ŕ±ŢŰUźĆˇŰń& . >ťďú<-čßR 0ßĆĺôŃžä­Ćţq0¬Ś`¶śÂ­ĆÝÜĎőí=A ¬8Ŕ0 _\€Âĺfíi BŢđ ‚˙Ăä!7pŕđ•ŕ¬CĆ\ JˇríĄ ß Ň ä˝ť 6 †ˇŽáÔ=ŕép¦ˇ®!¶ˇľ!¶á¤á CĆá;4ÁrC ě! ˘ "!˘!""&˘"˘ľú@C4ŘüW†Q˘%ö× ü—ŁQ"´@ĂŮŘq"ąŤb¨]?@Ă.ôŘ.tŚĂ*"-ĐŔ8\B7ĐŔ¦9 @¶Ř4Řâ8d‚#đ"’‘"1~Úµ}™†©ˇ)c+ÚĂ‚ÍY”‚1ťí™ mŘ.\ #7âصÍY§c†uúĚ+pM~áÁ$ŽĂEC>DC7,˙:& /vŁ= X¸5O~Ý#?VP>ö#@&Ű?$AŰ@$BÚÚA&$C¶ÚB6$D®ŮCF$EŘDV$Fú#]YOFvd€]¤G†äţ\›°2¤2”äI*CJš¤Iň‚¤$KÎ$J˛;đBMşäL®¤MĘäMĆ$;”$LŞäNĺLƤQ&ĄĺN.eR¦$R%JždTĘäQNĺQÂäSn%WvĄW~%X†ĄXŽ%Y–ĄY’e#’Ú‚  ŔLÂ>\A[vA\\˘€ ŘĺD ÂhÁ$ÂčÂ>tÁ¨ĂlAa˛ĺôe¸ĺ>Âüe$l[şee^ć$ô˙Ą4ćđÂhhę‚ h/čjvfg˘ćiňB^˘€.lhĘf$t.&nN/ěĂ$üÁüÁmöĺ ]¶%ljAh ć 4渥lŞf$ fcö%uV§u^'vf§vn'wv§w~'x†§xŽ'yf§2¤Ą¬1ŔlA$\A` ¦]Ş đ¨_^¦}Â$hÁ ¦Če²ĺčg^Át°ĺ‚öçüĄ ôg„R'‚ŞĂ\A¨ ´§† Â$´§ tA{Úĺ¤CbFh‚ Bm>¨]F[ŞĂÖ§\*&[RgĽ§p®`ŞĂ$¨Cf h^ňf† ‚†˙hy)’&©’.)“6©y˘' &†¨e©eZ¦]NÂđç~şghNB6&`Ęĺ$L§[§.ČeŤ˛ĄaF(cNg„Ę'iÂčşifć%›†( üçpvAśę©‹Ę'}’¨`îCÂc’¦[ć––faú©Ł–ć{Ň©“^*¦fަnęwžçµ±~fh†*hĆ&/|¦hÂô%/đBgţAhšf_ĆŞoVgcţA«ŞęŞÂŞîŞoň¬ŞjŻňç_ÂŞ¨C€&­â*r hcꬶ*¬é©®*nšćg‚&^fłĘf¬6+p:«€6«˛†&§ž+ş¦«şŽ§§n¤#F˙ ëHŰ%,@ë,˝BKI›Hî+ňtŇ@ ‚ĺŔ ,´ŚC4đĐ< ¬8D"+h+~ ?8,°‚ťĄżf,đä,, üŘ.ü˘ČŠY´X8xŚ=ŚÁN€ś!4„‹—Ń@}9ĆÖ,îĐGEĚOzŠl7¨X7¤X0f‹‡í‚YŘ˖ءő4\Ł8Ś lŁÍF­ěĽĂWP‚(¬âdęčYi‹eKâdE´h ú„í+J-ÚľŽđŚŔ¦­ŰvHľ­Ü&OÜέ݂›»’ÚÝî-óÔ-ßţ-íř-ŕ.üämz.â^Đ|˝kâ6ní®ă&îµĺV®ĺ^.ćf˙®ćn.çv®ç~.膮čŽ.é–®éž.ꦮę®néBéÁĂýY–ěZÓyŐdÝ’0äÓ­”/őÁýQ.-Öa™jÝNÝ’đ®U#é.$ÍŇ)pÁ-ŇĺŇ(ŃAďîNď ‘÷ů–ŻůşŐqÜ»‚Ŕ1S@µJüRGÁ,<<Ń/±ŃeÁnMÓK‘’ ôÁé“!Ŕ39UXuŃű’Adďő5ý’oýńfÓ<Ö/™ţ°»5Y!R/5‘YÁîđĂđ’S“áoEÖůć°ď°%ĄďÖ­o(ą‹F…˙Q-• °’+™´I‘S>]4ˇÖ0ř0 Ó“4!Ó”4Ó-é %TmqP • XU:1/•“łŃ›ÂT ‘UĹ/+U‘µŠÝRPÉ/ŤUĹ’ČďŹ2"'˛ůđďĄ'Ŕ0 'ń©–0Á° QJ™<8“ű=Ý’1xri1ŇNyŃ]=Ó»4`áŇ Č/ C9•7ůŇ›‚ yň+÷ ´Ň…“UAÁ*iSq”»´2{˛/_ň3ѲUň%ď8qTő*˛6ołp12Ŕş@„ł8Ź39—ł9ź3:§ł:‡ł Ś˙3Ă:Ł3< A<«ŔŠÄ3>çł>ď3?÷ł?˙3@´@—ł ¸nE=YÄ˘Ž§A‹:ÚÎBG.żré"Ü×ĂŢ—™íÂŇzbڱ$.=BźA8Dk¬DŰÂŹáAeK ­J-2-tĂ5ZXyŮIg,· DCMWŮUŮŘW4<Ů śO_‚Óú4 „l>íNď+ä*ô%´+N5O.-ÁĄ­+`,«Ú9všVŁíµ}ěžąt+ÚÓ~†ĺĂĘvÚSSZ‡9ÚWźµGc$c+RŮ/ÎŘ4Z5µ-Y4@­^wäµ Ś8\a{š…˙,F_¶H;5‰-vHVµgż-h‡vÚŽ6iK­iź¶Í¦¶jŁ4W[k#.kÇ6Uż¶±ŃöŕÎ6nďµm3Űnóm'ĹŔR@%·q7r'·r/7s7·s?7tG·tO7uW·u_7vg·vo7wS7ŕVč,ÝU("ĄÓ0wKĄ÷Ö31ÖĺS§Q”Ă42.aŃPŤ˛0hÉď#YV$±Óde/ńÂQô‘“eąV!Uď“í)sł…_8úâĐ'ě÷]I9•*‘}ëVąR()VL‘0FíjaÔ -Ö%«Ń”<13Đ”bŮ“=]ó,Ó™˙@RíŇ/ S9“Yýň%8ł*…‘ •MQ{ @L-ó9Ó.e±>ąQM±0a8™—yBEÔ <Ć xxE]Ji;YQY!q6ŔHÁmď8Ý“ž»ÔbéÔ8Íy6]˛KĹ’)ë“<­1•SˇQ6É1RMS #ąŤ±TĄř0Ôń‰ëTđT˛ü>Ď99“«•™§şŞKšg›×O0A0hWÄú¬7@xi—v©@?¸vą@ hW¨@;°{x5ׯgA0ŕ:6C­;űvůúuůz?;¸@?0łÇú´;6P»·űú®÷vM{¬7˙@ŚW¨Ż{®˙şwˇ» —°÷±űş Hű¸ż{şO{¶żÁĽÁ<Â'ĽsĹ—X€Ă[Ý‹DM<ĹWĽĹ_<ĆgĽĆo<ÇwĽÇ<ȇĽČŹ<É—ĽÉ[Ľ¤ĽĘC`á´ĽËż|­P”_Ě<Í׼Íß<ÎçĽÎ˙Uí‹Mä†#08Á#hĚ;Ř`dĹ(%¤ď7Ď,˙8Á<‚#Ä>,ĽĂ'P?w0A?ÎCö›Î`Cö7ÄčoE7Ô=,|Â(ČİÄa0L(A(Á Đ@Pň"Í/ľéđ&M‡4ŇśŘuĘ &o^ś°0á%ó LónÂŁ4BFN s2 %GŚ@8S•n8p°z뮞‡(ů8Ôaž\T9z±kfS§OˇF•:•˙jU«W±fŐş•kWŻ_ťŞzAĄj'”Ň(™đŽ“/ś}űâ Ąś:•ĆIl”Ě]̸ŃĄSL`˝ý{Ę‚ŰۆÓ)•¬pę„őÂç”˝{ËÂ;:L(q»šukׯaÇ–]U,YŞ6SyÇd,ť/8âáJTbPqÂ$Ćć1„Ľ{+$ô#ç< qň‰s!ť»Cď š2š/ľgŢYő“OłáÇ—?ź~}Ú/ň©Ňżźý/üSe„˙#ĐŔ”é…ČBĚrz)¬Đ 1ĚPĂ 9ěĐĂA Q?í›ď<_¸)'YlŃĹaŚ\QĆi¬ńŔRča‰¨BVRČ!‰,ŇČ#‘LRÉ%™lŇÉ'ˇŚRĘ)©¬ŇĘ+±ĚŇHˇaĹË/Á SĚ1É,ÓĚ3ŃLSÍ5ŮlÓÍ7áŚSÎ9é¬ÓÎ1ˇÁ! ;fox1.6-1.6.57/doc/serialization.html000066400000000000000000000414131326741342000171500ustar00rootroot00000000000000 Documentation: Serialization of Data and Objects
    Documentation: Serialization of Data and Objects [Remove Frame]

    Philosophy in FOX Serialization

      The FOX Stream classes have been designed with a number of goals in mind:

      • Speed.  The serialization and deserialization should be very fast.  Thus, a minimal amount of computing overhead is required; also, I/O should be minimized.
      •  
      • Flexibility.  At some small expense in speed, all I/O eventually boils down to a few basic virtual I/O functions; thus, it is possible to derive subclasses and serialize data into byte streams with different destinations or sources:- not just files, but also memory buffers, sockets, or perhaps shared memory segments or mapped files.
      •  
      • Type Safety.  In order to make sure that the number of bytes saved exactly matches the number of bytes loaded, all stream insertion/extraction operators are defined for all basic machine types, and these types are guaranteed to be the same size on all FOX implementations.
      •  
      • Byte Swapping.  Since the types are known, the FOX Stream class is able to swap bytes upon stream deserialization.  The FOX Stream can swap bytes on saving, but also on loading.  Most often, however, swapping should be done only when loading, because:
      •  
        • It is faster to serialize in a machine-natural order, so that as long as one works on machines of the same architecture, no cost is incurred with swapping bytes at all.  Loading and saving on the same type of machine is expected to be a very, very common case.
        •  
        • By byte swapping on the receiving end, an in-situ swap can be performed, which will lead to much better caching, and eliminates the need to temporary buffers etc.
        •  
      • Predictability.  With the exception of serialization of FOX Objects, the FOX Stream class serializes exactly as many bytes as it is given by the application.  This has a number of interesting benefits:- for example, the FOX GIF Image loading routine works based on a FOX Stream, permitting it to read both from files as well as from memory data arrays; this makes handling of compiled-in or embedded resources (e.g. by using reswrap) very simple indeed.
      •  
      • Future expansion.  An escape tag is prepended for serialized FOX Objects.  This will in the [near] future allow deserialization of FOX Objects that are available in dynamic link libraries (DLL's). Currently, FOX can only deserialize objects that have been compiled into the application code.

    So How Does It Work?

      From the application programmer's point of view, it works very simply:
      FXuint data[100],numdata;

      // Save my stuff to a stream
      void savemystuff(FXStream& stream){
      stream << numdata; // Save the number of data values
      stream.save(data,numdata); // Save the data
      }


      // Save stuff to a FILE stream
      FXFileStream stream;
      stream.open("datafile.dat",FXStreamSave);
      savemystuff(stream);
      stream.close();

      As you see, this is pretty simple. Note that the code fragment doing the actual serialization does not depend on the type of FXStream being used; I recommend simply passing in an FXStream&, so that the same code may be used to serialize to FXFileStreams, FXMemoryStreams or other stream classes as yet to be invented.

      From the stream's point of view, things are a bit more complicated. Saving basic types (FXchar, FXshort, etc) into an FXStream is done by tradional C++ insertion and extraction operators << and >>.
      Note that all operators take a reference, rather than a value. If we would save a value, regular C++ type promotions might be silenty invoked, and more bytes might be saved than expected;  by taking reference arguments, one has to first store a value into a variable of known type, then call the insertion operator.

      For arrays of basic types, the FXStream class supplies a few regular member functions called save() and load(), one for each basic type.  Note that FOX also supports a type FXlong; FXlong is always 64 bits, or 8 bytes. 

      For objects, things are a more complex. A network of objects can be saved into a stream, and should be restored upon a load. Of course, upon load not all objects will occupy the same address as where they were initially stored from, so pointer-values can not be simpy stored in the stream:- a translation is necessary.
      Also, objects may refer to each other, that is to say, the program's data structures may have circular references.
      Thus, care must be taken to ensure that each object will be saved only once.

      FOX currently implements the object save by means of a hash table to translate object pointers into reference numbers and vice versa. In a nutshell, here's how it works:

      To save an object-pointer to the stream:
      1. If the pointer is NULL, save the speciall null tag.

      2. Consult the hash table to see if the object pointer has been saved before.  If the object has been encountered previously, its data must already have been saved, and the reference tag found in the hash table is saved to the stream.

      3. If the object has never been encountered before, generate a new reference tag, and add the object pointer and the reference tag to the hash table. Subsequently, a class tag, an escape code [0 for now], and the object's class name is saved to the stream. Then the object's member data are saved by calling the object's overloaded save() member function.

      To load an object-pointer from the stream:

      1. Read the tag. If the tag was the null tag, the pointer was NULL, and a NULL is returned.

      2. If the tag was the reference tag, the object has already been loaded, and the hash table is consulted to return the object-pointer.

      3. If the tag was the class tag, the escape tag is read and [for now] discarded, and subsequently the classname is read. The FXMetaClass is localized from the class name, and a new object is constructed by means of its makeInstance() function. The a new reference number is generated and the reference number and the object-pointer are stored into the hash table. Then the object member data are loaded by calling the object's overloaded load() member function.

      In the current implementation, only those objects whose implementation has been compiled into the application can be [de-] serialized.

      Future versions of FOX will use the escape code information for additional methods to localize the FXMetaClass objects.  In particular, the thinking is that certain object-implementations may live in DLL's (Dynamic Link Libraries) and the escape code will help localize the DLL and pull it in to provide the object implementation.  It is clear that this will be a very powerful mechanism, enabling for example drag and drop of objects whose implementations are not a-priori known at the time the application is compiled.

      I added the escape code so as to not break people's streamed object files when this capability will be introduced.

    Future FOX uses of Serialization

      Serialization is not only intended for features such as saving/restoring from files, and drag-and-drop of objects.  Future versions of FOX will also allow FOX GUI Widgets to be serialized or deserialized; in fact, it is with this in mind that the two-step [Construct/Create] sequence is so religiously carried out throughout the Library. Once FOX Widgets have been deserialized from either an external file or perhaps from a compiled-in [reswrapped] resource, a GUI can be created in one fell swoop with a single call to FXApp::create().

      A FOX GUI Builder will be a program that builds a nice-looking GUI, and then serializes it for incorporation into an application [using reswrap].  Using the escape-code mechanism, the FOX GUI builder will be able to build GUI's that contain Custom Controls or Widgets written by third parties.

    Tips and Hints for Serialization: Byte Swapping

      Proper use of the serialization mechanism will allow serialized data to be read across different machines, with different byte orders.  In the scope of ``predictability,'' FOX's stream mechanism does NOT contain any tags or markers, nor does it contain things like byte order and such, with the exception of course being the saving of object-pointers.

      It does however try to help:

      FXbool FXStream::isBigEndian();

      returns TRUE if the stream is set to big-endian mode, i.e. items are loaded or saved in most-significant byte first order.  The default is determined by the host machine; architectures like x86 are least significant byte first, and architectures like MIPS are most significant byte first.
      Note that FXbool is defined as FXuchar, NOT as C++ bool.  [I've never been able to find a statement that says how big the standard type bool is, but I'm pretty sure a char is 1 byte!].

      Thus, the following chunk of code may be executed before saving any actual application data:

      FXbool endianness=FXStream::isBigEndian();
      stream << endianness;
      ....
      save the data
      ....

      Then upon loading:

      FXbool endianness;
      stream >> endianness;
      stream.setBigEndian(endianness);
      ....
      load the data
      ....

      In other words, the bytes are swapped on input, if and only if the byte order of the saving application differs from the loading one.

    Tips and Hints for Serialization: Container Object

      Many applications have one so-called container object, which may not itself participate in serialization for one reason or another.  For example, the FOX FXApp object is normally created by the main startup routine of an application, and will probably never be serialized [although its member data may be].

      In order to accomodate references to such an object without saving it, the FXStream class allows you to specify a container object.  During serialization, when a pointer to the container object is encountered, only a reference tag is saved to the stream; likewise, on deserialization a reference to the container object is translated into the pointer passed in with the FXStream constructor.

    Tips and Hints for Serialization: Use FX Types

      FOX defines a number of typedefs for the basic types, such as FXchar, FXshort, and so on.  The idea is that the size of these types is fixed, and the same on all implementations; there is an FXASSERT somewhere that will trip if this is not true.

      Writing applications that should work on heterogeneous mixes of hardware becomes simpler if variables you intend to serialize are defined in terms of these basic types; for loop variables and such ephemeral things, you may want to use the ``suggested'' system-specific types, as these may be faster.

      The type FXlong may NOT be natively supported on all platforms.  It represents a 64 bit integer type.  Usage of this type may be slower than the regular 32 bit integer types, unless you have a 64 bit computer like x86-64 or ALPHA.

    Copyright © 1997-2005 Jeroen van der Zijp

    fox1.6-1.6.57/doc/styles.css000066400000000000000000000040051326741342000154360ustar00rootroot00000000000000 BODY { } .DECORTHING { color:silver; background-color:gray; width:20px; height:100% } .SEPHOR { color:silver; background-color:#000000; height:1px; width:100%; }                .SEPVER { color:silver; background-color:#000000; width:1px; height:100% }                UL { list-style-type:square; } LI { white-space:pre; } #TOPTITLE { color: silver; background-color:black; font-family:verdana,sans-serif; font-size:10pt; font-variant:small-caps; font-weight:bolder; letter-spacing:4pt; text-align:center; }        #LOGO { color: silver; background-color: silver; font-family:verdana,sans-serif; font-size:10pt; font-variant:small-caps; font-weight:bolder; letter-spacing:4pt; text-align:right; } #MENU { color:black; background-color:#6495ED; font-family:verdana,sans-serif; font-size:10pt; font-weight:bolder; vertical-align:text-top; padding-left:5px; padding-top:20px; margin-top:0px; width:130px; height:100%; } .MENULINK { color:black; text-decoration:none; background-color:#6495ED; } .MENULINK:hover { color:silver; text-decoration:none; background-color:#6495ED; } .PAGEMENULINK { color:#6495ED; text-decoration:none; background-color:white; } .PAGEMENULINK:hover { color:#6495ED; text-decoration:underline; background-color:white; } #submenuitem { color:black; background-color:#B0C4DE; font-family:verdana,sans-serif; font-size:10pt; font-weight:normal; text-align:left; vertical-align:top; padding-left:2px; padding-top:2px; width:200px; }                #PAGETITLE { color:black; background-color:gray; font-family:verdana,sans-serif; font-size:10pt; font-variant:small-caps; font-weight:bolder; letter-spacing:4pt; text-align:left; padding-left:3pt; } .PAGE { color:black; background-color:white; font-family:times,serif; font-size:11pt; font-weight:normal; text-align:left; vertical-align:top; padding-left:10px; padding-top:10px; padding-right:10px; }        .NEWSSECTION { padding-left:30px; } DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }      fox1.6-1.6.57/doc/timers.html000066400000000000000000000367311326741342000156050ustar00rootroot00000000000000 Documentation: Timers, Signals and Input Messages
    Documentation: Timers, Signals and Input Messages [Remove Frame]

      Most messages your application will receive are generated from FOX Widgets, such as buttons, sliders, and other controls.  However, FOX also provides some messages which are generated from other sources.

      There are four types of such messages: Timers, Chores, Signals, and Inputs.

    Timer Messages

      Timer messages are used so your program can receive a message after some specified interval has elapsed. This can be very useful, for example for performing an animation of some kind. Like all messages, timer messages are handled by specifying a target object which is to handle the message.  When the specified time has elapsed, the object will receive a message of the type SEL_TIMEOUT,  with the message ID being the one which was registered at the beginning of the time interval. The length of the time interval is expressed in milliseconds, and the interval starts at the time the callback message was registered.  The message callback to the target object will be when the interval has expired.

      Here's how you would  program a message map entry to catch a timer message in a target object of type MyObject:

      // Message map entry of "object"
      FXDEFMAP(MyObject) MyObjectMap[]={
          FXMAPFUNC(SEL_TIMEOUT,MyObject::ID_ANIMATIONSTEP,MyObject::onAnimationStep),
        ...
      };
      
      

      A timer may be registered with a specific target object and message-id identifying the object and method to be invoked on that object when the timer expires. An optional user-data pointer may be passed which is made available to the message handler when the timer message is invoked. This can be used by the handler to e.g. determine what to do. To register a timer message, you would call the function FXApp::addTimeout(), as follows:

      // Register Timer callback message for 1000 milliseconds
      MyObject* object;
      void *userdata;
      app->addTimeout(object,ID_ANIMATIONSTEP,1000,userdata);
      
      If a timer with this particular target and message combination already exists, the interval is reset to the new time.

      Timers can be removed or unregistered at any time, by calling FXApp::removeTimeout() with same target and message-id with which it was registered previously:

      // Unregister Timer callback message
      removeTimeout(object,ID_ANIMATIONSTEP);
      

      It is OK to call removeTimeout() on a timer that has already fired. Timers in FOX are fired only once, not repeatedly; thus, to do animations the timer must be reset each time it expires, as is done below:

      // Receive a Timer callback
      long MyObject::onAnimationStep(FXObject*,FXSelector,void* ptr){
        if(continueToAnimate){
        
          // Do something ...
        
          // Restart timer for another interval, passing the user data for next time
          app->addTimeout(object,ID_ANIMATIONSTEP,1000,ptr);
          }
        return 1;
        }
        
      

      It is OK to call FXApp::removeTimeout() even when the timer has already fired. A typical scenario used in FOX programs is to remove any timers that may be outstanding in the destructor of the target.
      Since a timer is uniquely identified by the target and message-id, a class using timers does not need to bother with bookkeeping issues like keeping track of which timers are still in use. This is very convenient in destructors:

      // Destructor: just remove the timer, regarless of whether it was set
      MyObject::~MyObject(){
        removeTimeout(object,ID_ANIMATIONSTEP);
        }
      

      Which makes for much cleaner code.

      Timers are fired when the application returns to the event loop. In other words, handlers may be invoked a bit later than specified by the timer interval. To maintain smooth animation sequences, you might want to call gettimeofday() or some equivalent function so as to decrease the next timer interval in the sequence a little bit to correct for this effect, particularly if some of your applications are CPU intensive.

    Chore Messages

      Chore messages are messages which are delivered to their target object when the application is about to block for events.  They are used for background tasks which are to be performed when no other, more urgent tasks need to be performed.  You can use chores for housekeeping tasks in your application, or  perhaps for animations.  A chore will fire as soon as the event stream is exhausted and there is nothing else for the application to do, this is why it is also sometimes referred to as idle processing.

      When the chore message is fired, your object will receive a message of the type SEL_CHORE, with the message ID being the one which was registered.  To intercept this message, here's how you would program your message map:

      FXDEFMAP(MyObject) MyObjectMap[]={
        FXMAPFUNC(SEL_CHORE,MyObject::ID_IDLETASK,MyObject::onIdleTask),
        ...
        };
      

      As you see, it is very similar to timer callback processing.  Setting or registering a chore callback message is similar as well, and is done by calling FXApp::addChore() as shown below:

      // Register Chore callback message
      MyObject* object;
      void *userdata;
      app->addChore(object,ID_ANIMATIONSTEP,userdata);
      

      Chores can be unregistered at any time prior to being fired, by calling FXApp::removeChore() with the same target and message-id as was used to register it in FXApp::addChore():

      // Unregister Chore callback message
      app->removeChore(object,ID_ANIMATIONSTEP);
      

      Like timers, it is OK to remove chores that have already fired. Thus, classes which are receiving chore messages can remove them in the destructor, regardless of whether they were set or not. This can substantially simplify book keeping.

      Some notes:

      • Some computer graphics books describe using Motif work-proc's to perform delayed drawing for complicated 3D graphics. While FOX's Chores are indeed equivalent to Motif's work-proc's, this is unnecessary, as ALL paint operations in the FOX toolkit are already delayed.
      • Repeatedly resetting the chore callback will mean that your application will never yield the CPU, because there will always be a chore ready to execute prior to blocking for event input.
      • The GUI update and the Chore processing are interleaved, so that each time through the event loop, at least one GUI update callback and one Chore are always being executed. This means however, that if a Chore takes a long time, the GUI update process itself will also proceed much slower, as it will proceed in lock-step with the Chore processing.

    Signal Messages

      Signal messages are generated when certain asynchronous events happen.  On most systems, these events are generated in the form of POSIX signals.  The POSIX signal facility is available on most systems to which FOX has been ported, although  non-POSIX [e.g. BSD) signals should work also.

      You can use Signal messages to allow FOX objects to receive signals and process them.  For example, you could  register a signal handler for SIGINT, so that an application may be closed down properly when the user hits ^C on the controlling terminal.  Another use might be to register a handler to catch the SIGFPE during a computation, so a warning panel can be popped for a divide by zero, and perhaps gracefully save the user's data rather than core dumping.

      When a Signal message is sent, your target object will receive a message of the type SEL_SIGNAL with the ID being the one specified when the callback message was registered:

      // Message map entry of "object"
      FXDEFMAP(MyObject) MyObjectMap[]={
        FXMAPFUNC(SEL_SIGNAL,MyObject::ID_INTERRUPT,MyObject::onCleanUpAndQuit),
        ...
        };
      

      A signal handler can be added by calling FXApp::addSignal().  There are two methods to deliver a signal to the application: synchronously, and asynchronously (immediately).

      Synchronous or non-immediatesignals are held until the application returns to the event loop, and then dispatched to the application.  Thus, in most cases, the normal flow of computation in the application will not be interrupted, and your signal callback message handler can assume that all data structures are in a consistent state.    Relatively harmless signals such as SIGINT are best handled synchronously.

      Asynchronous or immediate signals are dispatched to the target object immediately.  Since the regular processing of your application may have been interrupted by the signal, you will have to exercise extreme caution in the handler, as data structures may be partically complete.  The immediate signal handlers are best reserved for last-ditch efforts, such as cleaning up after a SIGSEGV or SIGBUS, when a grave error has occured but there may be a chance to perhaps recover some of the user's data.

      // Register Signal callback message
      app->addSignal(SIGINT,myobject,ID_INTERRUPT,FALSE,flags);
      

      The flags are set as for POSIX signal handling facilities, pleace confer your man pages for sigaction(2).
      To remove the signal handler callback message and restore the default signal handling action, you can call FXApp::removeSignal() as follows:

      // Unregister Signal callback message
      app->removeSignal(SIGINT);
      

    Input Messages

      Input messages allow your programs to receive inputs from other sources than the GUI.  Input messages can for example be used to watch sockets, pipes, and a host of other synchronization objects [if available on your machine].

      Writing networked applications, such as e.g. a chat program, involves watching inputs from a number of different sources.  You could have your program continuously check all these inputs for activity in a timer callback, but it is far more efficient to register an input source and yield the CPU until there is something going on.

      Fortunately, most operating systems provide such a facility, and FOX can take advantage of this:

      • On UNIX, the select() system call is used.  The select mechanism allow a group of file descriptors representing sockets, pipes, and [where supported] asynchronous files to be watched for activity.  In fact, the connection to the display, i.e. the GUI is just one of the file descriptors that can be watched.  Please consult your UNIX select(2) man pages for more information about this system call.
      • On WIndows NT, the MsgWaitForMultipleObjects() system call is used.  This system call waits for GUI messages, as well as any number of synchronization objects, such as asynchronous files, sockets, pipes, event objects, mutexes, and even directories.  More information about this can be found on the Microsoft Developer Network CD's, or on their on-line version of MSDN.

      To register a callback message for an input source, you can call FXApp::addInput().  The callback message will remain registered even even after it has fired, unlike for Timers and Chores which are automatically removed after being fired once.

      When a synchronization object becomes signaled, a message of the type SEL_IO_READ, SEL_IO_WRITE, or SEL_IO_EXCEPT will be sent to the target object, with the ID being the one specified in addInput().  You can intercept these messages as follows:

      // Message map entry of "object"
      FXDEFMAP(MyObject) MyObjectMap[]={
        FXMAPFUNC(SEL_IO_READ,MyObject::ID_ACCEPT,MyObject::onAcceptConnectionFromTheNet),
        FXMAPFUNC(SEL_IO_READ,MyObject::ID_SOCKET,MyObject::onReceivedInputFromTheNet),
        FXMAPFUNC(SEL_IO_WRITE,MyObject::ID_SOCKET,MyObject::onSendOutputToTheNet),
        FXMAPFUNC(SEL_IO_EXCEPT,MyObject::ID_SOCKET,MyObject::onDealWithExcept),
        ...
        };
      

      In this example, a server type application may be creating a socket (socket(2)), and listen for incoming connections.  When an incoming connection is received the callback handler onAcceptConnectionFromTheNet() presumably verifies the request and calls accept (accept(2))  and registers another handler to deal with incoming or outgoing data, and exceptional conditions.

      You can register a input handler by calling FXApp::addInput().

      // Accept the connection
      socket=accept(...);
      
      // Register input callback message
      app->addInput(socket,INPUT_READ|INPUT_WRITE|INPUT_EXCEPT,myobject,ID_SOCKET);
      

       

      Passing INPUT_READ|INPUT_WRITE|INPUT_EXCEPT will register the same callback message handler ID for all three types of I/O activities.
      To remove a callback message handler, you can call FXApp::removeInput() as follows:

      // Unregister input callback message
      app->removeInput(socket,INPUT_WRITE);
      

      This will remove the callback message ID for I/O output.  It is usually a good idea for output, because the file descriptor will remain signaled as long as there is buffering to accept more outgoing data.
      You would add the INPUT_WRITE back only when buffers get full [when the other party is tardy processing the data you're sending, lets say].

    Copyright © 1997-2005 Jeroen van der Zijp

    fox1.6-1.6.57/doc/top.html000066400000000000000000000015731326741342000151000ustar00rootroot00000000000000 FOX-Toolkit
    FOX Toolkit
    fox1.6-1.6.57/doc/widgets.html000066400000000000000000000221741326741342000157440ustar00rootroot00000000000000 Documentation: Writing your very own Widgets
    Documentation: Writing your very own Widgets [Remove Frame]

      FOX makes it very easy to build your own widgets.  It was designed to do this from the ground up.  This is actually one of the prime benefits of FOX vis-a-vis other widget libraries.  As FOX is completely written in C++, and most important functions are overloadable, writing your own widget typically entails picking an existing widget class which looks close to the one you want, and then redefining selected aspects of that widget by subclassing it.

      We illustrate this process with an example from FOX itself:- the FXProgressBar widget.  First, you pick which widget to subclass from; in this case, we subclass of of FXFrame, as the progress bar widget needs to inherit the margins and borders from FXFrame.

      In terms of C++ code, this means:

      class FXProgressBar: public FXFrame {
        FXDECLARE(FXProgressBar)
      

      The FXDECLARE() macro establishes some boilerplate member functions that every class derived from FXObject should redefine. Next, we add some member data.  In the case, we want to add:

      protected:
        FXuint   progress;                      // Integer percentage number
        FXuint   total;                         // Amount for completion
        FXint    barsize;                       // Bar size
        FXFont*  font;                          // Font used for the percentage text
        FXPixel  barBGColor;                    // Background color of bar
        FXPixel  barColor;                      // Bar color
        FXPixel  textNumColor;                  // Text color outside of bar
        FXPixel  textAltColor;                  // Text color inside of bar
      

      There is nothing unusual about this. Standard C++ programming practice!  Next, we make the default and copy constructors protected; while this is not required, it prevents an application programmer from accidentally creating an object with these, causing the creation of an improperly initialized object, which will most certainly cause problems later on.

      protected:
        FXProgressBar(){}
        FXProgressBar(const FXProgressBar&){}
      

      So far so good.  Now comes the meat.  The progress bar should  of course draw itself to reflect the amount of progress.  This should look something like:


      Progress Bar

      This is done by implementing the onPaint() message.  Every time  FOX determines that a widget needs to be repainted, for example, after moving a window out of the way, it sends the widget a SEL_PAINT message.  This message should be intercepted by your widget so that you can make it draw in a different manner.  If you didn't intercept it, the message would be intercepted later on by the base class, which will perform its usual drawing behaviour. Hence, we declare the message-handling routine (handler):

      public:
        long onPaint(FXObject*,FXSelector,void*);
      

      Note that the message handler should be declared public.  The message handler is passed three parameters when invoked: the object that sent it the message, the selector, and a pointer.  The sending object is in this case the widget itself; the selector is a combination of the message-type and message-id.
      The message type identifies the type of message that occurred; here it is SEL_PAINT.  The message id identifies the sender of the message; for mesages from the system itself, this id is always set to zero (0).  The message type and id can be extracted from the selector by means of  two convenience macros: FXSELTYPE(selector) and FXSELID(selector).

      The pointer which is passed to the message handler may refer to different things; for system messages, however, it typically points to a data structure called FXEvent, which contains information about the event that caused this handler to be invoked.

      The onPaint() handler may use the information in the FXEvent structure to determine the rectangle that needs to be repainted.  Widgets (especially complicated ones!) should try and redraw only the indicated area.  This cuts down significantly on expensive drawing commands, as well as reducing visual flickering on the screen.

      Next,  we define the widget's main constructor.  As a first argument, all child-widgets pass in a pointer to the parent widget (Toplevel or shell widgets pass in a pointer to the application object).  Next,  the layout and other options are passed, followed by the x, y coordinate, followed by the width, and height.  All of these have default values, as in many cases the exact widget placement and size is left to a container class such as the Packer or Matrix layout manager.

      The options should be passed in as a bit-wise or (|) of a number of option flags. Care should be taken so as to not conflict with any option flags which have already been used in base classes of this widget .

        FXProgressBar(FXComposite* p,FXuint opts=(FRAME_SUNKEN|FRAME_THICK),
                 FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,
                 FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD);
      

      The constructor you write should simply pass the arguments to their corresponding arguments in the base class of your class, then initialize the newly added member data to some sensible values.
      The intent is that your widget should be useful without setting additional parameters or calling additional member functions, at least for the most common usage of your widget.

      In order to interact properly with the layout managers, each child widget needs to properly compute its dimensions when asked by its parent.  The two functions involved with this are:

        virtual FXint getDefaultWidth();
        virtual FXint getDefaultHeight();
      

      These two functions compute the minimum width and height of the widget, given the current state of the widget.  The layout managers use this information to place the widgets properly.  In the case of the ProgressBar, for example, getDefaultWidth() computes the widget's size based on the border, left- and right padding, current text font, whether it is horizontal or vertical, and presence of the percentage display.

      Next, the create() function needs to be implemented:

        void create();
      

      The create() function is called in the second stage of the widget instantiation process.  In the first stage, the C++ objects have been created, but no windows have been associated yet with those C++ objects.  The second stage takes place when the application is instantiating the widgets, and building X-Windows associated with the C++ objects.  It does this by recursively travering all widgets, starting from the root window.


      It is sometimes necessary to overload the create() routine, so as to determine resources which were not yet known before.  In the case of the ProgressBar,  until the connection with the X-Server was established, it was not yet known which colors were going to be available, so these colors will have to be allocated in the create() routine. Also, the create() routine makes sure the font is available, by calling font->create() to create the font.

      After implementing the ordinary C++ member functions for your new widget, you may have to define a destructor:

        virtual ~FXProgressBar();
      

      The FOX library usually implements a destructor which intentionally thrashes the object; in this case,  it sets font to (FXFont*)(-1).  Thrashing objects intentionally may cause dangling pointers etc. to be discovered much sooner, and thus ease debugging and increase program correctness.

      Note that FOX does not try trash the other member variables:- thrash-values for the other variables would not be distinguishable from good values anyway.  But a thrash value for a pointer like -1 will most likely cause a SIGSEGV, when accidentally used!!

    Copyright © 1997-2005 Jeroen van der Zijp

    fox1.6-1.6.57/doc/win32.html000066400000000000000000000370321326741342000152370ustar00rootroot00000000000000 Documentation: Developing Win32 GUI Applications Using FOX
    Documentation: Developing Win32 GUI Applications Using FOX [Remove Frame]

      FOX provides a nice platform-independent alternative to the traditional GUI frameworks for Win32 (namely MFC). While most of the other FOX documentation applies to FOX programming in general, this document deals specifically with some of the logistical details of creating a FOX-based application for Windows. Many thanks to Daniel Gehriger, who provided a lot of the information you see here!

    Compilers and Development Tools

      One goal is for FOX to work with as many different compilers and development environments as possible. We have used Microsoft Visual C++ versions 5.0 and 6.0, Borland C++ Builder 3.0 and gcc (or egcs) to build FOX applications for Windows. The standard FOX source code distribution includes project workspace files for Microsoft Visual C++ 6.0 as well as make files for Borland C++. You may also be able to use the Visual C++ project files with Visual C++ 5.0, but this is unconfirmed at present. For detailed information about how to build the library itself, please refer to the INSTALLfile which is found in the top-level directory of the standard FOX distribution.

    Using Microsoft Visual C++ 6.0

      This section, and the following two sections, deal specifically with FOX development under Microsoft Visual C++ 6.0. This discussion assumes that you are at least minimally familiar with how to use Visual C++ 6.0. In particular, you should know how to create a new project workspace, and then add new project(s) to that workspace. Most of this information should be useful for Visual C++ 5.0 as well, although some settings may appear in different places.

      1. Create the project. All FOX applications are just standard Win32 applications, so when you create a new project select that option:
      2. Open the Project Settings dialog for this project. You will want to make changes for both the compile-time options and link-time options of this project. Choose the Settings... option from the Project pulldown menu. Change to the "C/C++" tab and then select "Preprocessor" from the "Category" drop-down list:
      3. Modify preprocessor definitions for linking against the FOX DLL.The FOX library can be built as either a static library or a dynamic link library (DLL). If you prefer to link your application against the DLL version of the library, you will need to add FOXDLL to the preprocessor definitions (not shown above).
      4. Modify preprocessor definitions for OpenGL. If you plan to use FOX's OpenGL-related features you should also add HAVE_OPENGL to the preprocessor
        definitions (as shown).
      5. Add FOX's include directory to the list of "Additional include directories".This setting is on the "Preprocessor" page too!
      6. Add the FOX library to the list of input libraries for this application.Now change to the "Link" tab of the Project Settings dialog box, and select "Input" from the "Category" drop-down list (see below). Add the appropriate library name (foxd.lib or foxdlld.lib for Debug builds; or fox.lib or foxdll.lib for Release builds) to the list of libraries under "Object/library modules".
      7. Add FOX's lib directory to the "Additional library path". This setting is also on the "Input" page.
      8. Change the entry-point symbol. Now select "Output" from the drop-down list on the "Link" tab and type mainCRTStartup in the "Entry-point symbol" type-in field (see below). Note that this field is empty by default. This setting tells the linker to use your application's main()function as the entry point instead of the standard WinMain()function.

    Common Problems

      This section lists some commonly encountered problems for building Win32 applications with FOX.

      Unresolved symbols at link time. If you get one or more "error LNK2001" messages at link time, this usually means you've omitted required libraries from the list. Open the Project Settings dialog and change to the "Link" tab. On this tab, choose "Input" from the "Category" drop-down list. Finally, add the missing libraries to the list under "Object/library modules". Here is a list of commonly forgotten libraries:

      If the error message is...
      You need
      this library
      foxd.lib(FXPrintDialog.obj) : error LNK2001: unresolved external symbol _EnumPrintersA@28 winspool.lib
      foxd.lib(FXRegistry.obj) : error LNK2001: unresolved external symbol __imp__RegCloseKey@4
      foxd.lib(FXRegistry.obj) : error LNK2001: unresolved external symbol __imp__RegEnumKeyExA@32
      foxd.lib(FXRegistry.obj) : error LNK2001: unresolved external symbol __imp__RegCreateKeyExA@36
      foxd.lib(FXRegistry.obj) : error LNK2001: unresolved external symbol __imp__RegOpenKeyExA@20
      foxd.lib(FXRegistry.obj) : error LNK2001: unresolved external symbol __imp__RegEnumValueA@32
      foxd.lib(FXRegistry.obj) : error LNK2001: unresolved external symbol __imp__RegSetValueExA@24
      foxd.lib(FXRegistry.obj) : error LNK2001: unresolved external symbol __imp__RegDeleteKeyA@8
      advapi32.lib
      foxd.lib(FXApp.obj) : error LNK2001: unresolved external symbol __imp___TrackMouseEvent@4 comctl32.lib

      On the other hand, if you get this error message:

      MSVCRTD.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
      

      this indicates that you forgot to change the application's entry-point symbol to mainCRTStartup. See this sectionfor the details.

      Missing support for JPEG or PNG images. If you're trying to use the FXJPEGIcon, FXJPEGImage, FXPNGIcon or FXPNGImage classes and it doesn't seem to be working, it's possible that the FOX library was not compiled correctly to include support for these image formats. Load the FOX library project into Developer Studio and then launch the Project Settings dialog box. On the C/C++ tab of this dialog box, look at the list of preprocessor definitions and confirm that HAVE_JPEGLIB_H (for JPEG support) and/or HAVE_PNG_H (for PNG support) are defined. You will also want to be sure that the compiler can find its way to the JPEG and PNG header files, so make sure the include paths are correct as well. Note that these settings are only relevant for building the FOX library itself; you don't need to have HAVE_JPEGLIB_H or HAVE_PNG_H defined when compiling your FOX-based application code, nor do you need access to the JPEG or PNG header files. You will need to link your applications to the JPEG or PNG libraries, however.

    Other Tips...

      1. If you find yourself using FOX on a regular basis (as we hope) you might want to add its installation directory to the lists of standard directories searched by Visual C++ for include files and libraries. To do this, open the Options dialog by selecting the Options... command from the Toolspulldown menu, and switch to the "Directories" tab:
        • Select "Include files" from the "Show directories for:" drop-down list and the list of directories should show the default include path (in order). Add your FOX installation's include directory to the end of the list. Then select "Library files" from the drop-down list and add your FOX installation's lib directory that list.

      2. If you do link your executables against the FOX DLL, the executable needs to find it in the path when it runs. You can copy this DLL by hand to some directory in the path, but you may want to instead make the following modifications to automatically copy the DLL into your application's build directory (requires Windows NT). Start by opening the Project Settings dialog box and change to the "Post-Build Step" tab (it's on the far right, you'll need to scroll over to see it!)
        • Add a description such as "Updating DLL..." to indicate what's going on; this message gets printed to the Build output window in Developer Studio when these commands are executed. Then, add the following two commands to the "Post-build command(s)" list:

        REPLACE C:\src\fox\lib\foxdlld.dll /U Debug
        IF NOT EXIST Debug\foxdlld.dll COPY C:\src\fox\lib\foxdlld.dll Debug
        You should, of course, use the correct path to the DLL for your FOX installation. You should also be sure to copy the release build of the DLL (named foxdll.dll) to your project's Release subdirectory, if that's the configuration you're configuring.
         
      3. You may want to add the fox or foxdll project (fox.DSP or foxdll.DSP) to your own workspace, and configure a dependency
        from your application's project to the appropriate library's project. You
        can do this by selecting the Dependencies... option from the Project pulldown menu, to open the Project Dependencies dialog box. That way you can simply unpack a new FOX drop over the existing tree and your project will first re-compile the new files before compiling your project.

    Using the MinGW Compilers

      The FOX library, and FOX-based applications, can now be built using the MinGW compilers and related Unix-like tools. If you are not familiar with this development option, but would like to know more, I recommend starting with the MinGW FAQ list.

      Disclaimer. The process described here has been tested using the most recent release of the Cygwin tools (i.e. the 1.1.x series) and the MinGW tools, under Windows 2000.

      To get started, you will need to download and install the following packages:

      • The Cygwin tools, or
        some reasonable substitute. You will at least need a bash-compatible shell
        and GNU make version 3.76.1 or earlier;
      • The latest MinGW distribution; and,
      • The latest FOX distribution;

      If you want to use OpenGL, you'll also need to download the OpenGL header files MinGW; they are not a standard part of the packages listed above. Check the MinGW FAQ listfor more information about how to develop OpenGL applications using MinGW.

      Now, because of some problems with the version of make distributed with MinGW (currently, make-3.77) you'll need to use an earlier version of make, such as the one distributed with the Cygwin tools (make-3.76.1). Ensure that the correct version of make is picked up by either renaming or deleting the version of make distributed with MinGW.

      Next, unpack the FOX distribution somewhere by typing, e.g.,

        tar xzf fox-0.99.149.tar.gz
      

      and then go to the top-level directory of the FOX distribution and type:

        ./configure
      

      If configure stops rather quickly, right after it prints the message about "checking whether make sets ${MAKE}", it's picking up the wrong version of make (see the notes a few paragraphs earlier).

      Once configure is finished doing its thing, and assuming there were no errors, build the library and supporting executables by typing:

       make
      

      and then sit back and wait ;)

    Copyright © 1997-2005 Jeroen van der Zijp

    fox1.6-1.6.57/doc/window.html000066400000000000000000000164641326741342000156120ustar00rootroot00000000000000 Documentation: The FXWindow Class
    Documentation: The FXWindow Class [Remove Frame]

      The FXWindow class manages a window on the screen. FXWindow is the base class of all FOX GUI widgets such as buttons and sliders, in other words, all widgets are ultimately derived from FXWindow. All windows are organized into a so called widget tree; at the root of this widget tree is the root window which is a special window which represents the entire screen. Top level or shell windows are children of the root window; they're special because top level windows, such as the main window and dialog box, are positioned and resized directly by the user. Layout manager windows are composite windows which may have zero or more children, possibly including other layout managers. Layout managers position their child-windows according to certain layout patterns and layout flags. Child windows or simple windows are windows which do not themselves have any children. Child windows are usually simple controls such as buttons and sliders.

    Navigating The Widget Tree

      As each window is positioned somewhere in the widget tree, each window maintains some information about where in the tree it is; this information can be obtained with the following API's:

        FXWindow::getParent()

        This function returns the window which is this window's immediate parent. For the root window, this returns NULL as the root window does not have a parent.

        FXWindow::getRoot()

        This function returns the root window, or the window's ultimate parent.

        FXWindow::getShell()

        This function returns the top level or shell window of this window. The shell window is always a child of the root window.

        FXWindow::getOwner()

        This returns the window's owner, if any. The owner of a window is the window that is resposible for this window in some way. For example, a modal dialog may be owned by a main window. The system usually ensures that a top level window stays on top of the window that owns it. Windows which have no owner return NULL as the owner window.

        FXWindow::getFirst()

        This returns the first child of this window, if any.

        FXWindow::getLast()

        This returns the last child of this window, if any.

        FXWindow::getNext()

        This returns the next sibling of this window. Use this function to iterate over all windows which have a common parent.

        FXWindow::getPrev()

        This returns the previous sibling of this window.

    Querying Widget Tree Information

      There are a number of common questions about the various possible relationships between windows in the widget tree. While it is possible to answer them with the API's above, it is cumbersome and so a number of API's are available to make this more easy:

        FXWindow::isChildOf(window)

        Determines if this window is a child of the given window.

        FXWindow::containsChild(window)

        Determines if this window contains the given window as a child.

        FXWindow::containsChild(window)

        Determines if this window contains the given window as a child; also returns TRUE if the given window is the same as this window.

        FXWindow::numChildren()

        Returns the number of children of this window by counting them.

        FXWindow::indexOfChild(window)

        Returns the 0-based position of the given window in this window's list of children. If the window is not a child of this window then it returns -1.

        FXWindow::childAtIndex(index)

        Returns the child window at the given position, or NULL if the index is invalid.

        FXWindow::commonAncestor(window1,window2)

        This function determines the lowest common ancestor of window1 and window2.

    Primary,Clipboard, Drag and Drop Selections

      Many widgets display some data. For example, a text widget can display some text. When the user highlights a range of text, a primary selection is in effect. This primary selection can be obtained by other widgets, or even by other programs. For instance a selection of some text may be pasted into a terminal by means of the middle mouse button under X-Windows (under MS-Windows, the primary selection only works within the same FOX program).

      When a selection is copied or cut to the clipboard, a clipboard-selection is in effect. Usually, a clipboard selection is made by Ctrl-C for copy, or a Ctrl-X for cut. Again, other widgets or other programs can obtain this data from the clipboard. For instance, an application can obtain the clipboard selection by a paste operation, typically invoked by means of Ctrl-V.

      Finally, when a drag operation is started from this widget, a drag-and-drop selection is in effect. Drag and drop selections are only in effect while a drag operation is ongoing. In contrast, a clipboard or primary selection remains in effect until another selection is made (possibly by another application).

      The following API's pertain to the selections:

        FXWindow::hasSelection()

        Return true if this window owns the primary selection.

        FXWindow::acquireSelection(types,FXuinumtypes)

        Try to acquire the primary selection, given a list of drag types. The list of drag types must have been previously registered by means of FXApp::registerDragType().

    Copyright © 1997-2005 Jeroen van der Zijp

    fox1.6-1.6.57/doc/xml.html000066400000000000000000000164251326741342000151000ustar00rootroot00000000000000 Documentation: HTML/XML resources for possible future widgets
    Documentation: HTML/XML resources for possible future widgets [Remove Frame]

      This page is intended to collect some background resources for the FOX HTML viewer widget.  Yes, we're planning to have an HTML widget!  Currently, we're in the information collection stage.

      If you have additional links or HTML and XML URL's, please contact me and I'll add to the collection.  I'm looking for all sorts of references, ranging from source code to technical background articles.

    W3 Consortium

    Parsers

    Web Servers

    App Servers

    Low-level tools

    GUI's

    More

    Copyright © 1997-2005 Jeroen van der Zijp

    fox1.6-1.6.57/fox-config.in000066400000000000000000000032261326741342000152270ustar00rootroot00000000000000#! /bin/sh version="@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.@FOX_PATCH_LEVEL@" prefix="@prefix@" exec_prefix="@exec_prefix@" libdir="@libdir@" includedir="@includedir@/fox-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@" LIBS="@LIBS@" X_LIBS="@X_LIBS@" X_BASE_LIBS="@X_BASE_LIBS@" X_EXTRA_LIBS="@X_EXTRA_LIBS@" GL_LIBS="@GL_LIBS@" FOX_LIBS="-lFOX-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@" usage() { cat <&2 fi while test $# -gt 0 ; do case "$1" in -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac case $1 in --prefix=*) prefix=$optarg local_prefix=yes ;; --prefix) echo_prefix=yes ;; --exec-prefix=*) exec_prefix=$optarg exec_prefix_set=yes local_prefix=yes ;; --exec-prefix) echo_exec_prefix=yes ;; --version) echo $version exit 0 ;; --cflags) echo_cflags=yes ;; --libs) echo_libs=yes ;; *) usage 1 1>&2 ;; esac shift done if test "$local_prefix" = "yes" ; then if test "$exec_prefix_set" != "yes" ; then exec_prefix=$prefix fi fi if test "$echo_prefix" = "yes" ; then echo $prefix fi if test "$echo_exec_prefix" = "yes" ; then echo $exec_prefix fi if test "$echo_cflags" = "yes" ; then cflags="-I${includedir}" echo $cflags fi if test "$echo_libs" = "yes" ; then libs="${FOX_LIBS} ${X_LIBS} ${X_BASE_LIBS} ${X_EXTRA_LIBS} ${GL_LIBS} ${LIBS}" if test "${libdir}" != "/usr/lib" ; then echo -L${libdir} $libs else echo $libs fi fi # EOF fox1.6-1.6.57/fox.lsm000066400000000000000000000011361326741342000141470ustar00rootroot00000000000000Begin3 Title: KDEVPROJECT Version: 1.6.0 Entered-date: 9/23/2005 Description: FOX is a C++ based, platform independent library for GUI Development. Keywords: FOX, C++, GUI, Library Author: Jeroen van der Zijp Maintained-by: Jeroen van der Zijp Primary-site: ftp://ftp.fox-toolkit.org/pub Home-page: http://www.fox-toolkit.org/fox.html Original-site: http://www.fox-toolkit.org/fox.html Platforms: Linux and other Unix systems, Microsoft Windows 95,98,NT,2K,XP. Copying-policy: GNU Lesser Public License End fox1.6-1.6.57/fox.pc.in000066400000000000000000000010431326741342000143600ustar00rootroot00000000000000prefix="@prefix@" exec_prefix="@exec_prefix@" libdir="@libdir@" includedir="@includedir@/fox-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@" LIBS="@LIBS@" X_LIBS="@X_LIBS@" X_BASE_LIBS="@X_BASE_LIBS@" X_EXTRA_LIBS="@X_EXTRA_LIBS@" GL_LIBS="@GL_LIBS@" FOX_LIBS=-lFOX-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@ Name: FOX Description: The FOX Toolkit URL: www.fox-toolkit.org Version: @FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.@FOX_PATCH_LEVEL@ Libs: ${FOX_LIBS} Libs.private: ${X_LIBS} ${X_BASE_LIBS} ${X_EXTRA_LIBS} ${GL_LIBS} ${LIBS} Cflags: -I${includedir} fox1.6-1.6.57/fox.spec.in000066400000000000000000000145541326741342000147230ustar00rootroot00000000000000%define name fox %define version @FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.@FOX_PATCH_LEVEL@ %define release 1 Summary: The FOX toolkit. Name: %{name} Version: %{version} Release: %{release} Copyright: LGPL Group: System Environment/Libraries Source: ftp://ftp.fox-toolkit.org/pub/%{name}-%{version}.tar.gz URL: http://www.fox-toolkit.org Packager: Joshua Weage BuildRoot: %{_tmppath}/%{name}-buildroot %description FOX is a C++-based library for graphical user interface development FOX supports modern GUI features, such as drag-and-drop, tooltips, tab books, tree lists, icons, multiple document interfaces (MDI), timers, idle processing, automatic GUI updating, as well as OpenGL/Mesa for 3D graphics. Subclassing of basic FOX widgets allows for easy extension beyond the built-in widgets by application writers. %package devel Summary: Development files and documentation for the FOX GUI toolkit. Group: Development/Libraries %description devel The fox-devel package contains the files necessary to develop applications using the FOX GUI toolkit: the header files, the reswrap resource compiler, manual pages, and HTML documentation. %package static Summary: A version of the FOX GUI toolkit for static linking. Group: Development/Libraries %description static The fox-static package contains the files necessary to link applications to the FOX GUI toolkit statically (rather than dynamically). Statically linked applications do not require the library to be installed on the system running the application. %package -n adie Summary: Adie Programmer's Text Editor Group: X11/Applications Version: 3.0.0 %description -n adie Adie is an extremely fast and convenient programming text editor written using the FOX Toolkit. %package -n calculator Summary: FOX-based Calculator Applet Group: X11/Applications Version: 2.0.0 %description -n calculator The FOX calculator is a simple desktop calculator geared towards the programmer. It supports not only a full complement of scientific functions, but also common operations that programmers need, such as bitwise operations, bitwise shifting, and base-2 logarithm and exponents, and numeric conversion between hexadecimal, octal, binary, and decimal. The FOX Calculator implements correct operator precedences, so expressions like 2+3*5 yield the correct result, which is 17, and not 25. Also featured is a constant memory, which permanently stores its value even if you exit the calculator and restart it later. %package -n pathfinder Summary: PathFinder File Browser Group: X11/Applications Version: 1.0.0 %description -n pathfinder PathFinder is a file browser application written using the FOX Toolkit. %package -n shutterbug Summary: Shutterbug Screenshot Utility Group: X11/Applications Version: 2.0.0 %description -n shutterbug Shutterbug is a FOX-based screenshot utility. %prep %setup -q %build CPPFLAGS="$RPM_OPT_FLAGS -frtti" CFLAGS="$RPM_OPT_FLAGS -frtti" \ %configure --enable-release --enable-threadsafe make %install [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT %makeinstall rm -f doc/Makefile.am doc/Makefile.in doc/Makefile rm -r doc/art/Makefile.am doc/art/Makefile.in doc/art/Makefile rm -f doc/screenshots/Makefile.am doc/screenshots/Makefile.in doc/screenshots/Makefile # remove docs as they are supplied by rpm rm -rf ${RPM_BUILD_ROOT}/%{_datadir}/doc/fox-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@ rm -rf ${RPM_BUILD_ROOT}/usr/fox %clean [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %{_libdir}/libFOX-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.so %{_libdir}/libFOX-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.so.@LT_CURRENT@ %{_libdir}/libFOX-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.so.@LT_CURRENT@.@LT_AGE@.@LT_REVISION@ %{_libdir}/libCHART-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.so %{_libdir}/libCHART-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.so.@LT_CURRENT@ %{_libdir}/libCHART-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.so.@LT_CURRENT@.@LT_AGE@.@LT_REVISION@ %doc doc %doc ADDITIONS AUTHORS INSTALL LICENSE README TRACING index.html %files devel %defattr(-,root,root) %{_bindir}/reswrap %{_bindir}/fox-config %{_mandir}/man1/reswrap.1* %{_includedir}/fox-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@ %{_libdir}/libFOX-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.la %{_libdir}/libCHART-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.la %{_libdir}/pkgconfig/fox.pc %files static %defattr(-,root,root) %{_libdir}/libFOX-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.a %{_libdir}/libCHART-@FOX_MAJOR_VERSION@.@FOX_MINOR_VERSION@.a %files -n adie %defattr(-,root,root) %{_bindir}/adie %{_bindir}/Adie.stx %{_mandir}/man1/adie.1* %files -n calculator %defattr(-,root,root) %{_bindir}/calculator %{_mandir}/man1/calculator.1* %files -n pathfinder %defattr(-,root,root) %{_bindir}/PathFinder %{_mandir}/man1/PathFinder.1* %files -n shutterbug %defattr(-,root,root) %{_bindir}/shutterbug %{_mandir}/man1/shutterbug.1* %changelog * Fri Aug 20 2004 Joshua Weage - Updated to use built-in RPM macros where possible. - Sanity check RPM_BUILD_ROOT before deleting it. - Delete docs installed by make, in preference for those from rpm * Thu Dec 4 2003 Lyle Johnson - incorporated Yan-Fa Li's changes for compatibility with latest RPM tools. * Thu Sep 25 2003 Lyle Johnson - added files for the new chart library to the fox, fox-devel and fox-static packages. - added a Prefix tag to the header section so that this package is relocatable. - Spin off Adie, calculator, PathFinder and shutterbug into their own subpackages. - Removed the '--with-opengl=opengl' flag from the %build section (no longer needed). * Thu Aug 28 2003 Lyle Johnson - correct installed file names to reflect new naming scheme * Wed Aug 27 2002 Lyle Johnson - remove Makefile scraps from the doc subdirectories * Wed Aug 21 2002 Lyle Johnson - added the fox-devel and fox-static subpackages. * Tue Oct 10 2000 David Sugar 0.99.132-3 - rtti forced for rpm build specs that use -fno-rtti. * Fri Mar 24 2000 José Romildo Malaquias 0.99.122-1 - new version * Fri Mar 24 2000 José Romildo Malaquias 0.99.119-1 - new version * Sun Mar 05 2000 José Romildo Malaquias - some adaptations * Tue Nov 10 1998 René van Paassen - initial package fox1.6-1.6.57/include/000077500000000000000000000000001326741342000142605ustar00rootroot00000000000000fox1.6-1.6.57/include/FX4Splitter.h000066400000000000000000000157311326741342000165700ustar00rootroot00000000000000/******************************************************************************** * * * F o u r - W a y S p l i t t e r * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FX4Splitter.h,v 1.30 2006/02/20 03:32:12 fox Exp $ * ********************************************************************************/ #ifndef FX4SPLITTER_H #define FX4SPLITTER_H #ifndef FXCOMPOSITE_H #include "FXComposite.h" #endif namespace FX { // Splitter options enum { FOURSPLITTER_TRACKING = 0x00008000, // Track continuously during split FOURSPLITTER_NORMAL = 0 }; /** * The four-way splitter is a layout manager which manages * four children like four panes in a window. * You can use a four-way splitter for example in a CAD program * where you may want to maintain three orthographic views, and * one oblique view of a model. * The four-way splitter allows interactive repartitioning of the * panes by means of moving the central splitter bars. * When the four-way splitter is itself resized, each child is * proportionally resized, maintaining the same split-percentage. * The four-way splitter widget sends a SEL_CHANGED to its target * during the resizing of the panes; at the end of the resize interaction, * it sends a SEL_COMMAND to signify that the resize operation is complete. */ class FXAPI FX4Splitter : public FXComposite { FXDECLARE(FX4Splitter) private: FXint splitx; // Current x split FXint splity; // Current y split FXint barsize; // Size of the splitter bar FXint fhor; // Horizontal split fraction FXint fver; // Vertical split fraction FXint offx; FXint offy; FXuchar mode; protected: FX4Splitter(); FXuchar getMode(FXint x,FXint y); void moveSplit(FXint x,FXint y); void drawSplit(FXint x,FXint y,FXuint m); void adjustLayout(); private: FX4Splitter(const FX4Splitter&); FX4Splitter &operator=(const FX4Splitter&); public: long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusLeft(FXObject*,FXSelector,void*); long onFocusRight(FXObject*,FXSelector,void*); long onCmdExpand(FXObject*,FXSelector,void*); long onUpdExpand(FXObject*,FXSelector,void*); public: enum { ExpandNone = 0, /// None expanded ExpandTopLeft = 1, /// Expand top left child ExpandTopRight = 2, /// Expand top right child ExpandBottomLeft = 4, /// Expand bottom left child ExpandBottomRight = 8, /// Expand bottom right child ExpandTop = ExpandTopLeft|ExpandTopRight, /// Expand top children ExpandBottom = ExpandBottomLeft|ExpandBottomRight, /// Expand bottom children ExpandLeft = ExpandTopLeft|ExpandBottomLeft, /// Expand left children ExpandRight = ExpandTopRight|ExpandBottomRight, /// Expand right children ExpandAll = ExpandLeft|ExpandRight /// Expand all children }; public: enum { ID_EXPAND_NONE=FXComposite::ID_LAST+ExpandNone, ID_EXPAND_TOP=ID_EXPAND_NONE+ExpandTop, ID_EXPAND_BOTTOM=ID_EXPAND_NONE+ExpandBottom, ID_EXPAND_LEFT=ID_EXPAND_NONE+ExpandLeft, ID_EXPAND_RIGHT=ID_EXPAND_NONE+ExpandRight, ID_EXPAND_TOPLEFT=ID_EXPAND_NONE+ExpandTopLeft, ID_EXPAND_TOPRIGHT=ID_EXPAND_NONE+ExpandTopRight, ID_EXPAND_BOTTOMLEFT=ID_EXPAND_NONE+ExpandBottomLeft, ID_EXPAND_BOTTOMRIGHT=ID_EXPAND_NONE+ExpandBottomRight, ID_EXPAND_ALL=ID_EXPAND_NONE+ExpandAll, ID_LAST }; public: /// Create 4-way splitter, initially shown as four unexpanded panes FX4Splitter(FXComposite* p,FXuint opts=FOURSPLITTER_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create 4-way splitter, initially shown as four unexpanded panes; notifies target about size changes FX4Splitter(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts=FOURSPLITTER_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Get top left child, if any FXWindow *getTopLeft() const; /// Get top right child, if any FXWindow *getTopRight() const; /// Get bottom left child, if any FXWindow *getBottomLeft() const; /// Get bottom right child, if any FXWindow *getBottomRight() const; /// Get horizontal split fraction FXint getHSplit() const { return fhor; } /// Get vertical split fraction FXint getVSplit() const { return fver; } /// Change horizontal split fraction void setHSplit(FXint s); /// Change vertical split fraction void setVSplit(FXint s); /// Perform layout virtual void layout(); /// Get default width virtual FXint getDefaultWidth(); /// Get default height virtual FXint getDefaultHeight(); /// Return current splitter style FXuint getSplitterStyle() const; /// Change splitter style void setSplitterStyle(FXuint style); /// Change splitter bar width void setBarSize(FXint bs); /// Get splitter bar width FXint getBarSize() const { return barsize; } /// Change set of expanded children void setExpanded(FXuint set=FX4Splitter::ExpandAll); /// Get set of expanded children FXuint getExpanded() const; /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FX7Segment.h000066400000000000000000000126141326741342000163640ustar00rootroot00000000000000/******************************************************************************** * * * 7 - S e g m e n t D i s p l a y W i d g e t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FX7Segment.h,v 1.12 2006/03/01 02:13:21 fox Exp $ * ********************************************************************************/ #ifndef FX7SEGMENT_H #define FX7SEGMENT_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// 7 Segment styles enum { SEVENSEGMENT_NORMAL = 0, /// Draw segments normally SEVENSEGMENT_SHADOW = 0x00080000 /// Draw shadow under the segments }; /** * Seven-segment (eg LCD/watch style) widget, useful for making * indicators and timers. Besides numbers, the seven-segment * display widget can also display some letters and punctuations. */ class FXAPI FX7Segment : public FXFrame { FXDECLARE(FX7Segment) protected: FXString label; // Text being shown FXColor textColor; // Text color FXint thickness; // Segment thickness FXint cellwidth; // Width of cell FXint cellheight; // height of cell FXString tip; // Tooltip FXString help; // Help message protected: FX7Segment(); private: FX7Segment(const FX7Segment&); FX7Segment &operator=(const FX7Segment&); void drawCells(FXDCWindow &dc,FXint x,FXint y,FXint cw,FXint ch); void drawSegments(FXDCWindow &dc,FXint x,FXint y,FXint w,FXint h,FXuint segments); public: long onPaint(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdSetRealValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdGetRealValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: /// Create a seven segment display FX7Segment(FXComposite* p,const FXString& text,FXuint opts=SEVENSEGMENT_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Set the text for this label void setText(const FXString& text); /// Get the text for this label FXString getText() const { return label; } /// Change text color void setTextColor(FXColor clr); /// Return text color FXColor getTextColor() const { return textColor; } /// Get/set cell width void setCellWidth(FXint w); FXint getCellWidth() const { return cellwidth; } /// Get/set cell height void setCellHeight(FXint h); FXint getCellHeight() const { return cellheight; } /// Get/set segment thickness void setThickness(FXint t); FXint getThickness() const { return thickness; } /// Change 7 segment style void set7SegmentStyle(FXuint style); /// Get current 7 segment style FXuint get7SegmentStyle() const; /// Set the current text-justification mode. void setJustify(FXuint mode); /// Get the current text-justification mode. FXuint getJustify() const; /// Set the status line help text void setHelpText(const FXString& text){ help=text; } /// Get the status line help text const FXString& getHelpText() const { return help; } /// Set the tool tip message void setTipText(const FXString& text){ tip=text; } /// Get the tool tip message const FXString& getTipText() const { return tip; } /// Save to a stream virtual void save(FXStream &store) const; /// Load from a stream virtual void load(FXStream &store); }; } #endif fox1.6-1.6.57/include/FX885910Codec.h000066400000000000000000000011131326741342000163770ustar00rootroot00000000000000#ifndef FX885910CODEC_H #define FX885910CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-10 Codec class FXAPI FX885910Codec : public FXTextCodec { FXDECLARE(FX885910Codec) public: FX885910Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX885910Codec(){} }; } #endif fox1.6-1.6.57/include/FX885911Codec.h000066400000000000000000000011131326741342000164000ustar00rootroot00000000000000#ifndef FX885911CODEC_H #define FX885911CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-11 Codec class FXAPI FX885911Codec : public FXTextCodec { FXDECLARE(FX885911Codec) public: FX885911Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX885911Codec(){} }; } #endif fox1.6-1.6.57/include/FX885913Codec.h000066400000000000000000000011131326741342000164020ustar00rootroot00000000000000#ifndef FX885913CODEC_H #define FX885913CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-13 Codec class FXAPI FX885913Codec : public FXTextCodec { FXDECLARE(FX885913Codec) public: FX885913Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX885913Codec(){} }; } #endif fox1.6-1.6.57/include/FX885914Codec.h000066400000000000000000000011131326741342000164030ustar00rootroot00000000000000#ifndef FX885914CODEC_H #define FX885914CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-14 Codec class FXAPI FX885914Codec : public FXTextCodec { FXDECLARE(FX885914Codec) public: FX885914Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX885914Codec(){} }; } #endif fox1.6-1.6.57/include/FX885915Codec.h000066400000000000000000000011131326741342000164040ustar00rootroot00000000000000#ifndef FX885915CODEC_H #define FX885915CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-15 Codec class FXAPI FX885915Codec : public FXTextCodec { FXDECLARE(FX885915Codec) public: FX885915Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX885915Codec(){} }; } #endif fox1.6-1.6.57/include/FX885916Codec.h000066400000000000000000000011131326741342000164050ustar00rootroot00000000000000#ifndef FX885916CODEC_H #define FX885916CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-16 Codec class FXAPI FX885916Codec : public FXTextCodec { FXDECLARE(FX885916Codec) public: FX885916Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX885916Codec(){} }; } #endif fox1.6-1.6.57/include/FX88591Codec.h000066400000000000000000000011041326741342000163170ustar00rootroot00000000000000#ifndef FX88591CODEC_H #define FX88591CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-1 Codec class FXAPI FX88591Codec : public FXTextCodec { FXDECLARE(FX88591Codec) public: FX88591Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX88591Codec(){} }; } #endif fox1.6-1.6.57/include/FX88592Codec.h000066400000000000000000000011041326741342000163200ustar00rootroot00000000000000#ifndef FX88592CODEC_H #define FX88592CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-2 Codec class FXAPI FX88592Codec : public FXTextCodec { FXDECLARE(FX88592Codec) public: FX88592Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX88592Codec(){} }; } #endif fox1.6-1.6.57/include/FX88593Codec.h000066400000000000000000000011041326741342000163210ustar00rootroot00000000000000#ifndef FX88593CODEC_H #define FX88593CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-3 Codec class FXAPI FX88593Codec : public FXTextCodec { FXDECLARE(FX88593Codec) public: FX88593Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX88593Codec(){} }; } #endif fox1.6-1.6.57/include/FX88594Codec.h000066400000000000000000000011041326741342000163220ustar00rootroot00000000000000#ifndef FX88594CODEC_H #define FX88594CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-4 Codec class FXAPI FX88594Codec : public FXTextCodec { FXDECLARE(FX88594Codec) public: FX88594Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX88594Codec(){} }; } #endif fox1.6-1.6.57/include/FX88595Codec.h000066400000000000000000000011041326741342000163230ustar00rootroot00000000000000#ifndef FX88595CODEC_H #define FX88595CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-5 Codec class FXAPI FX88595Codec : public FXTextCodec { FXDECLARE(FX88595Codec) public: FX88595Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX88595Codec(){} }; } #endif fox1.6-1.6.57/include/FX88596Codec.h000066400000000000000000000011041326741342000163240ustar00rootroot00000000000000#ifndef FX88596CODEC_H #define FX88596CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-6 Codec class FXAPI FX88596Codec : public FXTextCodec { FXDECLARE(FX88596Codec) public: FX88596Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX88596Codec(){} }; } #endif fox1.6-1.6.57/include/FX88597Codec.h000066400000000000000000000011041326741342000163250ustar00rootroot00000000000000#ifndef FX88597CODEC_H #define FX88597CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-7 Codec class FXAPI FX88597Codec : public FXTextCodec { FXDECLARE(FX88597Codec) public: FX88597Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX88597Codec(){} }; } #endif fox1.6-1.6.57/include/FX88598Codec.h000066400000000000000000000011041326741342000163260ustar00rootroot00000000000000#ifndef FX88598CODEC_H #define FX88598CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-8 Codec class FXAPI FX88598Codec : public FXTextCodec { FXDECLARE(FX88598Codec) public: FX88598Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX88598Codec(){} }; } #endif fox1.6-1.6.57/include/FX88599Codec.h000066400000000000000000000011041326741342000163270ustar00rootroot00000000000000#ifndef FX88599CODEC_H #define FX88599CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// ISO-8859-9 Codec class FXAPI FX88599Codec : public FXTextCodec { FXDECLARE(FX88599Codec) public: FX88599Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FX88599Codec(){} }; } #endif fox1.6-1.6.57/include/FXAccelTable.h000066400000000000000000000114521326741342000166510ustar00rootroot00000000000000/******************************************************************************** * * * A c c e l e r a t o r T a b l e C l a s s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXAccelTable.h,v 1.27 2006/01/22 17:57:58 fox Exp $ * ********************************************************************************/ #ifndef FXACCELTABLE_H #define FXACCELTABLE_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { /** * The accelerator table sends a message to a specific * target object when the indicated key and modifier combination * is pressed. */ class FXAPI FXAccelTable : public FXObject { FXDECLARE(FXAccelTable) protected: struct FXAccelKey { FXObject *target; // Target object of message FXSelector messagedn; // Message being sent FXSelector messageup; // Message being sent FXHotKey code; // Keysym and modifier mask to match }; private: FXAccelKey *key; // Accelerator table FXuint max; // Largest table index FXuint num; // Number of entries private: void resize(FXuint m); private: FXAccelTable(const FXAccelTable&); FXAccelTable &operator=(const FXAccelTable&); public: long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); public: /// Construct empty accelerator table FXAccelTable(); /// Add an accelerator into the table void addAccel(FXHotKey hotkey,FXObject* target=NULL,FXSelector seldn=0,FXSelector selup=0); /// Remove an accelerator from the table void removeAccel(FXHotKey hotkey); /// Return true if accelerator specified bool hasAccel(FXHotKey hotkey) const; /// Return target object of the given accelerator FXObject* targetOfAccel(FXHotKey hotkey) const; /** * Parse accelerator from string, yielding modifier and * key code. For example, parseAccel("Ctl+Shift+X") * yields MKUINT(KEY_X,CONTROLMASK|SHIFTMASK). */ friend FXAPI FXHotKey parseAccel(const FXString& string); /** * Unparse hot key comprising modifier and key code back * into a string suitable for parsing with fxparseHotKey. */ friend FXAPI FXString unparseAccel(FXHotKey key); /** * Parse hot key from string, yielding modifier and * key code. For example, parseHotKey(""Salt && &Pepper!"") * yields MKUINT(KEY_p,ALTMASK). */ friend FXAPI FXHotKey parseHotKey(const FXString& string); /** * Obtain hot key offset in string, or -1 if not found. * For example, findHotKey("Salt && &Pepper!") yields 7. * Note that this is the byte-offset, not the character * index! */ friend FXAPI FXint findHotKey(const FXString& string); /** * Strip hot key combination from the string. * For example, stripHotKey("Salt && &Pepper") should * yield "Salt & Pepper". */ friend FXAPI FXString stripHotKey(const FXString& string); /// Save table to a stream virtual void save(FXStream& store) const; /// Load table from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXAccelTable(); }; extern FXAPI FXHotKey parseAccel(const FXString& string); extern FXAPI FXString unparseAccel(FXHotKey key); extern FXAPI FXHotKey parseHotKey(const FXString& string); extern FXAPI FXint findHotKey(const FXString& string); extern FXAPI FXString stripHotKey(const FXString& string); } #endif fox1.6-1.6.57/include/FXApp.h000066400000000000000000001021331326741342000154070ustar00rootroot00000000000000/******************************************************************************** * * * A p p l i c a t i o n O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXApp.h,v 1.230 2006/01/22 17:57:58 fox Exp $ * ********************************************************************************/ #ifndef FXAPP_H #define FXAPP_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { // Forward declarations class FXApp; class FXWindow; class FXIcon; class FXBitmap; class FXCursor; class FXRootWindow; class FXMainWindow; class FXPopup; class FXFont; class FXDC; class FXDCWindow; class FXVisual; class FXGLVisual; class FXGLContext; class FXTranslator; class FXComposeContext; // Opaque FOX objects struct FXTimer; struct FXChore; struct FXSignal; struct FXRepaint; struct FXInput; struct FXInvocation; /// File input modes for addInput enum FXInputMode { INPUT_NONE = 0, /// Inactive INPUT_READ = 1, /// Read input fd INPUT_WRITE = 2, /// Write input fd INPUT_EXCEPT = 4 /// Except input fd }; /// All ways of being modal enum FXModality { MODAL_FOR_NONE, /// Non modal event loop (dispatch normally) MODAL_FOR_WINDOW, /// Modal dialog (beep if outside of modal dialog) MODAL_FOR_POPUP /// Modal for popup (always dispatch to popup) }; /// Default cursors provided by the application enum FXDefaultCursor { DEF_ARROW_CURSOR, /// Arrow cursor DEF_RARROW_CURSOR, /// Reverse arrow cursor DEF_TEXT_CURSOR, /// Text cursor DEF_HSPLIT_CURSOR, /// Horizontal split cursor DEF_VSPLIT_CURSOR, /// Vertical split cursor DEF_XSPLIT_CURSOR, /// Cross split cursor DEF_SWATCH_CURSOR, /// Color swatch drag cursor DEF_MOVE_CURSOR, /// Move cursor DEF_DRAGH_CURSOR, /// Resize horizontal edge DEF_DRAGV_CURSOR, /// Resize vertical edge DEF_DRAGTL_CURSOR, /// Resize upper-leftcorner DEF_DRAGBR_CURSOR=DEF_DRAGTL_CURSOR, /// Resize bottom-right corner DEF_DRAGTR_CURSOR, /// Resize upper-right corner DEF_DRAGBL_CURSOR=DEF_DRAGTR_CURSOR, /// Resize bottom-left corner DEF_DNDSTOP_CURSOR, /// Drag and drop stop DEF_DNDCOPY_CURSOR, /// Drag and drop copy DEF_DNDMOVE_CURSOR, /// Drag and drop move DEF_DNDLINK_CURSOR, /// Drag and drop link DEF_CROSSHAIR_CURSOR, /// Cross hair cursor DEF_CORNERNE_CURSOR, /// North-east cursor DEF_CORNERNW_CURSOR, /// North-west cursor DEF_CORNERSE_CURSOR, /// South-east cursor DEF_CORNERSW_CURSOR, /// South-west cursor DEF_HELP_CURSOR, /// Help arrow cursor DEF_HAND_CURSOR, /// Hand cursor DEF_ROTATE_CURSOR, /// Rotate cursor DEF_WAIT_CURSOR /// Wait cursor }; /// FOX Event struct FXAPI FXEvent { FXuint type; /// Event type FXuint time; /// Time of last event FXint win_x; /// Window-relative x-coord FXint win_y; /// Window-relative y-coord FXint root_x; /// Root x-coord FXint root_y; /// Root y-coord FXint state; /// Mouse button and modifier key state FXint code; /// Button, Keysym, or mode; DDE Source FXString text; /// Text of keyboard event FXint last_x; /// Window-relative x-coord of previous mouse location FXint last_y; /// Window-relative y-coord of previous mouse location FXint click_x; /// Window-relative x-coord of mouse press FXint click_y; /// Window-relative y-coord of mouse press FXint rootclick_x; /// Root-relative x-coord of mouse press FXint rootclick_y; /// Root-relative y-coord of mouse press FXuint click_time; /// Time of mouse button press FXuint click_button; /// Mouse button pressed FXint click_count; /// Click-count FXbool moved; /// Moved cursor since press FXRectangle rect; /// Rectangle FXbool synthetic; /// True if synthetic expose event FXDragType target; /// Target drag type being requested }; /// Application Object class FXAPI FXApp : public FXObject { FXDECLARE(FXApp) // We've got many friends friend class FXId; friend class FXBitmap; friend class FXImage; friend class FXIcon; friend class FXCursor; friend class FXDrawable; friend class FXWindow; friend class FXShell; friend class FXRootWindow; friend class FXTopWindow; friend class FXMainWindow; friend class FXPopup; friend class FXFont; friend class FXVisual; friend class FXGLVisual; friend class FXGLContext; friend class FXDC; friend class FXDCWindow; friend class FXDragCorner; friend class FXDockHandler; friend class FXComposeContext; private: // Platform independent private data void *display; // Display we're talking to const FXchar *dpy; // Initial display guess FXHash hash; // Window handle hash table FXRegistry registry; // Application setting registry FXWindow *activeWindow; // Active toplevel window FXWindow *cursorWindow; // Window under the cursor FXWindow *mouseGrabWindow; // Window which grabbed the mouse FXWindow *keyboardGrabWindow; // Window which grabbed the keyboard FXWindow *keyWindow; // Window in which keyboard key was pressed FXWindow *selectionWindow; // Selection window FXWindow *clipboardWindow; // Clipboard window FXWindow *dropWindow; // Drop target window FXWindow *dragWindow; // Drag source window FXWindow *refresher; // GUI refresher pointer FXWindow *refresherstop; // GUI refresher end pointer FXPopup *popupWindow; // Current popup window FXRootWindow *root; // Root window FXVisual *monoVisual; // Monochrome visual FXVisual *defaultVisual; // Default [color] visual FXTimer *timers; // List of timers, sorted by time FXChore *chores; // List of chores FXRepaint *repaints; // Unhandled repaint rectangles FXTimer *timerrecs; // List of recycled timer records FXChore *chorerecs; // List of recycled chore records FXRepaint *repaintrecs; // List of recycled repaint records FXInvocation *invocation; // Modal loop invocation FXSignal *signals; // Array of signal records FXint nsignals; // Number of signals FXFont *normalFont; // Normal font FXFont *stockFont; // Stock font FXMutex appMutex; // Application wide mutex FXEvent event; // Event FXuint stickyMods; // Sticky modifier state FXInput *inputs; // Input file descriptors being watched FXint ninputs; // Number of inputs FXint maxinput; // Maximum input number FXuchar *ddeData; // DDE array FXuint ddeSize; // DDE array size FXuint maxcolors; // Maximum number of colors to allocate FXuint typingSpeed; // Typing speed FXuint clickSpeed; // Double click speed FXuint scrollSpeed; // Scroll speed FXuint scrollDelay; // Scroll delay FXuint blinkSpeed; // Cursor blink speed FXuint animSpeed; // Animation speed FXuint menuPause; // Menu popup delay FXuint tooltipPause; // Tooltip popup delay FXuint tooltipTime; // Tooltip display time FXint dragDelta; // Minimum distance considered a move FXint wheelLines; // Scroll by this many lines FXint scrollBarSize; // Scrollbar size FXColor borderColor; // Border color FXColor baseColor; // Background color of GUI controls FXColor hiliteColor; // Highlight color of GUI controls FXColor shadowColor; // Shadow color of GUI controls FXColor backColor; // Background color FXColor foreColor; // Foreground color FXColor selforeColor; // Select foreground color FXColor selbackColor; // Select background color FXColor tipforeColor; // Tooltip foreground color FXColor tipbackColor; // Tooltip background color FXColor selMenuTextColor; // Select foreground color in menus FXColor selMenuBackColor; // Select background color in menus FXCursor *waitCursor; // Current wait cursor FXuint waitCount; // Number of times wait cursor was called FXuint windowCount; // Number of windows FXCursor *cursor[DEF_WAIT_CURSOR+1]; FXTranslator *translator; // Message translator FXint appArgc; // Argument count const FXchar *const *appArgv; // Argument vector const FXchar *inputmethod; // Input method name const FXchar *inputstyle; // Input method style bool initialized; // Has been initialized private: static FXApp *app; // Application pointer // Platform dependent private stuff #ifndef WIN32 private: FXID wmDeleteWindow; // Catch delete window FXID wmQuitApp; // Catch quit application FXID wmProtocols; // Window manager protocols FXID wmMotifHints; // Motif hints FXID wmTakeFocus; // Focus explicitly set by app FXID wmState; // Window state FXID wmNetState; // Extended Window Manager window state FXID wmNetIconName; // Extended Window Manager icon name FXID wmNetWindowName; // Extended Window Manager window name FXID wmNetSupported; // Extended Window Manager states list FXID wmNetWindowType; // Extended Window Manager types FXID wmNetHMaximized; // Extended Window Manager horizontally maximized FXID wmNetVMaximized; // Extended Window Manager vertically maximized FXID wmNetMoveResize; // Extended Window Manager drag corner FXID wmNetPing; // Extended Window Manager ping FXID wmNetTypes[8]; // Extended Window Manager window types FXID wmNetStates[12]; // Extended Window Manager state FXID wmWindowRole; // Window Role FXID wmClientLeader; // Client leader FXID wmClientId; // Client id FXID embedAtom; // XEMBED support FXID embedInfoAtom; // XEMBED info support FXID timestampAtom; // Server time FXID ddeTargets; // DDE targets atom FXID ddeAtom; // DDE exchange atom FXID ddeDelete; // DDE delete target atom FXID ddeIncr; // DDE incremental data exchange atom FXDragType *ddeTypeList; // DDE drop type list FXuint ddeNumTypes; // DDE number of drop types FXDragAction ddeAction; // DDE action FXDragAction ansAction; // Reply action FXID xcbSelection; // Clipboard selection FXDragType *xcbTypeList; // Clipboard type list FXuint xcbNumTypes; // Clipboard number of types on list FXDragType *xselTypeList; // Selection type list FXuint xselNumTypes; // Selection number of types on list FXDragType *xdndTypeList; // XDND type list FXuint xdndNumTypes; // XDND number of types FXID xdndProxy; // XDND proxy atom FXID xdndAware; // XDND awareness atom FXID xdndEnter; // XDND enter window message FXID xdndLeave; // XDND leave window message FXID xdndPosition; // XDND position update message FXID xdndStatus; // XDND status feedback message FXID xdndDrop; // XDND drop message FXID xdndFinished; // XDND finished message FXID xdndSelection; // XDND selection atom FXID xdndActionMove; // XDND Move action FXID xdndActionCopy; // XDND Copy action FXID xdndActionLink; // XDND Link action FXID xdndActionPrivate; // XDND Private action FXID xdndTypes; // XDND types list atom FXID xdndSource; // XDND drag source window FXID xdndTarget; // XDND drop target window FXID xdndProxyTarget; // XDND window to set messages to FXbool xdndStatusPending; // XDND waiting for status feedback FXbool xdndStatusReceived; // XDND received at least one status FXbool xdndWantUpdates; // XDND target wants new positions while in rect FXbool xdndFinishSent; // XDND finish sent FXRectangle xdndRect; // XDND rectangle bounding target FXint xrreventbase; // XRR event base FXID stipples[23]; // Standard stipple patterns void *r_fds; // Set of file descriptors for read void *w_fds; // Set of file descriptors for write void *e_fds; // Set of file descriptors for exceptions void *xim; // Input method FXbool shmi; // Use XSHM Image possible FXbool shmp; // Use XSHM Pixmap possible FXbool synchronize; // Synchronized #else FXushort ddeTargets; // DDE targets atom FXushort ddeAtom; // DDE Exchange Atom FXDragType ddeDelete; // DDE Delete Target Atom FXDragType *ddeTypeList; // DDE drop type list FXuint ddeNumTypes; // DDE number of drop types FXDragAction ddeAction; // DDE action FXDragAction ansAction; // Reply action FXDragType *xselTypeList; // Selection type list FXuint xselNumTypes; // Selection number of types on list void* xdndTypes; // Handle to file mapping object for types list FXushort xdndAware; // XDND awareness atom FXID xdndSource; // XDND drag source window FXID xdndTarget; // XDND drop target window FXbool xdndStatusPending; // XDND waiting for status feedback FXbool xdndFinishPending; // XDND waiting for drop-confirmation FXbool xdndStatusReceived; // XDND received at least one status FXbool xdndFinishSent; // XDND finish sent FXRectangle xdndRect; // XDND rectangle bounding target FXID stipples[17]; // Standard stipple bitmaps void **handles; // Waitable object handles #endif private: // Internal helper functions FXApp(const FXApp&); FXApp &operator=(const FXApp&); static void signalhandler(int sig); static void immediatesignalhandler(int sig); void leaveWindow(FXWindow *window,FXWindow *ancestor); void enterWindow(FXWindow *window,FXWindow *ancestor); void selectionSetData(const FXWindow* window,FXDragType type,FXuchar* data,FXuint size); void selectionGetData(const FXWindow* window,FXDragType type,FXuchar*& data,FXuint& size); void selectionGetTypes(const FXWindow* window,FXDragType*& types,FXuint& numtypes); void clipboardSetData(const FXWindow* window,FXDragType type,FXuchar* data,FXuint size); void clipboardGetData(const FXWindow* window,FXDragType type,FXuchar*& data,FXuint& size); void clipboardGetTypes(const FXWindow* window,FXDragType*& types,FXuint& numtypes); void dragdropSetData(const FXWindow* window,FXDragType type,FXuchar* data,FXuint size); void dragdropGetData(const FXWindow* window,FXDragType type,FXuchar*& data,FXuint& size); void dragdropGetTypes(const FXWindow* window,FXDragType*& types,FXuint& numtypes); #ifndef WIN32 void addRepaint(FXID win,FXint x,FXint y,FXint w,FXint h,FXbool synth=0); void removeRepaints(FXID win,FXint x,FXint y,FXint w,FXint h); void scrollRepaints(FXID win,FXint dx,FXint dy); static void imcreatecallback(void*,FXApp*,void*); static void imdestroycallback(void*,FXApp*,void*); #else static FXival CALLBACK wndproc(FXID hwnd,FXuint iMsg,FXuval wParam,FXival lParam); protected: virtual FXival dispatchEvent(FXID hwnd,FXuint iMsg,FXuval wParam,FXival lParam); #endif protected: /// Return TRUE when new raw event is available virtual bool getNextEvent(FXRawEvent& ev,bool blocking=true); /// Dispatch raw event virtual bool dispatchEvent(FXRawEvent& ev); public: long onCmdQuit(FXObject*,FXSelector,void*); long onCmdDump(FXObject*,FXSelector,void*); long onCmdHover(FXObject*,FXSelector,void*); public: /// Messages applications understand enum { ID_QUIT=1, /// Terminate the application normally ID_DUMP, /// Dump the current widget tree ID_HOVER, ID_LAST }; public: /// Information static const FXuchar copyright[]; /// Copyright notice of library public: /** * Construct application object; the name and vendor strings are used * as keys into the registry database for this application's settings. * Only one single application object can be constructed. */ FXApp(const FXString& name="Application",const FXString& vendor="FoxDefault"); /// Get application name const FXString& getAppName() const { return registry.getAppKey(); } /// Get vendor name const FXString& getVendorName() const { return registry.getVendorKey(); } /// Connection to display; this is called by init() bool openDisplay(const FXchar* dpyname=NULL); /// Close connection to the display bool closeDisplay(); /// Return pointer void* getDisplay() const { return display; } /// Is application initialized bool isInitialized() const { return initialized; } /// Get argument count FXint getArgc() const { return appArgc; } /// Get argument vector const FXchar *const *getArgv() const { return appArgv; } /// Return true if input method support bool hasInputMethod() const; /// Get default visual FXVisual* getDefaultVisual() const { return defaultVisual; } /// Change default visual void setDefaultVisual(FXVisual* vis); /// Get monochrome visual FXVisual* getMonoVisual() const { return monoVisual; } /// Get root Window FXRootWindow* getRootWindow() const { return root; } /// Set root Window void setRootWindow(FXRootWindow* rt); /// Return window at the end of the focus chain FXWindow *getFocusWindow() const; /// Get the window under the cursor, if any FXWindow *getCursorWindow() const { return cursorWindow; } /// Get the active toplevel window, if any FXWindow *getActiveWindow() const { return activeWindow; } /// Get current popup window, if any FXPopup* getPopupWindow() const { return popupWindow; } /// Find window from id FXWindow* findWindowWithId(FXID xid) const; /// Find window from root x,y, starting from given window FXWindow* findWindowAt(FXint rx,FXint ry,FXID window=0) const; /// Create application's windows virtual void create(); /// Destroy application's windows virtual void destroy(); /// Detach application's windows virtual void detach(); /** * Add timeout message to be sent to target object in ms milliseconds; * the timer fires only once after the interval expires. The void* ptr * is user data which will be passed into the void* ptr of the message * handler. If a timer with the same target and message already exists, * it will be rescheduled. */ void addTimeout(FXObject* tgt,FXSelector sel,FXuint ms=1000,void* ptr=NULL); /** * Remove timeout identified by tgt and sel. */ void removeTimeout(FXObject* tgt,FXSelector sel); /** * Return TRUE if given timeout has been set */ bool hasTimeout(FXObject *tgt,FXSelector sel) const; /** * Return, in ms, the time remaining until the given timer fires. * If the timer is past due, 0 is returned. If there is no such * timer, infinity (UINT_MAX) is returned. */ FXuint remainingTimeout(FXObject *tgt,FXSelector sel); /** * Process any timeouts due at this time. */ void handleTimeouts(); /** * Add a idle processing message to be sent to target object when * the system becomes idle, i.e. there are no events to be processed. * The void* ptr is user data which will be passed into the void* ptr * of the message handler. If a chore with the same target and message * already exists, it will be rescheduled. */ void* addChore(FXObject* tgt,FXSelector sel,void *ptr=NULL); /** * Remove idle processing message identified by tgt and sel. */ void* removeChore(FXObject* tgt,FXSelector sel); /** * Return TRUE if given chore has been set */ bool hasChore(FXObject *tgt,FXSelector sel) const; /** * Add signal processing message to be sent to target object when * the signal sig is raised; flags are to be set as per POSIX definitions. * When immediate is TRUE, the message will be sent to the target right away; * this should be used with extreme care as the application is interrupted * at an unknown point in its execution. */ void addSignal(FXint sig,FXObject* tgt,FXSelector sel,FXbool immediate=FALSE,FXuint flags=0); /// Remove signal message for signal sig void removeSignal(FXint sig); /** * Add a file descriptor fd to be watched for activity as determined * by mode, where mode is a bitwise OR (INPUT_READ, INPUT_WRITE, INPUT_EXCEPT). * A message of type SEL_IO_READ, SEL_IO_WRITE, or SEL_IO_EXCEPT will be sent * to the target when the specified activity is detected on the file descriptor. */ bool addInput(FXInputHandle fd,FXuint mode,FXObject *tgt,FXSelector sel); /** * Remove input message and target object for the specified file descriptor * and mode, which is a bitwise OR of (INPUT_READ, INPUT_WRITE, INPUT_EXCEPT). */ bool removeInput(FXInputHandle fd,FXuint mode); /// Return key state of given key bool getKeyState(FXuint keysym) const; /// Peek to determine if there's an event bool peekEvent(); /// Perform one event dispatch; return true if event was dispatched bool runOneEvent(bool blocking=true); /** * Run the main application event loop until stop() is called, * and return the exit code passed as argument to stop(). */ FXint run(); /** * Run an event loop till some flag becomes non-zero, and * then return. */ FXint runUntil(FXuint& condition); /** * Run event loop while events are available, non-modally. * Return when no more events, timers, or chores are outstanding. */ FXint runWhileEvents(); /** * Run event loop while there are events are available in the queue. * Returns 1 when all events in the queue have been handled, and 0 when * the event loop was terminated due to stop() or stopModal(). * Except for the modal window and its children, user input to all windows * is blocked; if the modal window is NULL, all user input is blocked. */ FXint runModalWhileEvents(FXWindow* window=NULL); /** * Run modal event loop, blocking keyboard and mouse events to all windows * until stopModal is called. */ FXint runModal(); /** * Run a modal event loop for the given window, until stop() or stopModal() is * called. Except for the modal window and its children, user input to all * windows is blocked; if the modal window is NULL all user input is blocked. */ FXint runModalFor(FXWindow* window); /** * Run modal while window is shown, or until stop() or stopModal() is called. * Except for the modal window and its children, user input to all windows * is blocked; if the modal window is NULL all user input is blocked. */ FXint runModalWhileShown(FXWindow* window); /** * Run popup menu while shown, until stop() or stopModal() is called. * Also returns when entering previous cascading popup menu. */ FXint runPopup(FXWindow* window); /// True if the window is modal bool isModal(FXWindow* window) const; /// Return window of current modal loop FXWindow* getModalWindow() const; /// Return mode of current modal loop FXModality getModality() const; /** * Terminate the outermost event loop, and all inner modal loops; * All more deeper nested event loops will be terminated with code equal * to 0, while the outermost event loop will return code equal to value. */ void stop(FXint value=0); /** * Break out of the matching modal loop, returning code equal to value. * All deeper nested event loops are terminated with code equal to 0. */ void stopModal(FXWindow* window,FXint value=0); /** * Break out of the innermost modal loop, returning code equal to value. */ void stopModal(FXint value=0); /// Force GUI refresh void forceRefresh(); /// Schedule a refresh void refresh(); /// Flush pending repaints void flush(bool sync=false); /** * Paint all windows marked for repainting. * On return all the applications windows have been painted. */ void repaint(); /** * Initialize application. * Parses and removes common command line arguments, reads the registry. * Finally, if connect is TRUE, it opens the display. */ virtual void init(int& argc,char** argv,bool connect=true); /** * Exit application. * Closes the display and writes the registry. */ virtual void exit(FXint code=0); /** * Return a reference to the registry. The registry keeps * settings and configuration information for an application, * which are automatically loaded when the application starts * up, and saved when the application terminates. */ FXRegistry& reg(){ return registry; } /// Register new DND type FXDragType registerDragType(const FXString& name) const; /// Get drag type name FXString getDragTypeName(FXDragType type) const; /// Return drag window if a drag operation is in progress FXWindow* getDragWindow() const { return dragWindow; } /// Beep void beep(); /// Return application instance static inline FXApp* instance(){ return app; } /// Change default font void setNormalFont(FXFont* font); /// Return default font FXFont* getNormalFont() const { return normalFont; } /// Begin of wait-cursor block; wait-cursor blocks may be nested. void beginWaitCursor(); /// End of wait-cursor block void endWaitCursor(); /// Change to a new wait cursor void setWaitCursor(FXCursor *cur); /// Return current wait cursor FXCursor* getWaitCursor() const { return waitCursor; } /// Obtain a default cursor FXCursor* getDefaultCursor(FXDefaultCursor which) const { return cursor[which]; } /// Change default cursor void setDefaultCursor(FXDefaultCursor which,FXCursor* cur); /** * Write a window and its children, and all resources reachable from this * window, into the stream store. (EXPERIMENTAL!) */ FXbool writeWindow(FXStream& store,FXWindow *window); /** * Read a window and its children from the stream store, and append * it under father; note it is initially not created yet. (EXPERIMENTAL!) */ FXbool readWindow(FXStream& store,FXWindow*& window,FXWindow* father,FXWindow* owner); /** * Return a reference to the application-wide mutex. * Normally, the main user interface thread holds this mutex, * insuring that no other threads are modifying data during the * processing of user interface messages. However, whenever the * main user interface thread blocks for messages, it releases * this mutex, to allow other threads to modify the same data. * When a new message becomes available, the main user interface * thread regains the mutex prior to dispatching the message. * Other threads should hold this mutex only for short durations, * so as to not starve the main user interface thread. */ FXMutex& mutex(){ return appMutex; } /** * Change message translator. * The new translator will be owned by FXApp. */ void setTranslator(FXTranslator* trans); /// Return message translator FXTranslator* getTranslator() const { return translator; } /// Obtain application-wide settings FXuint getTypingSpeed() const { return typingSpeed; } FXuint getClickSpeed() const { return clickSpeed; } FXuint getScrollSpeed() const { return scrollSpeed; } FXuint getScrollDelay() const { return scrollDelay; } FXuint getBlinkSpeed() const { return blinkSpeed; } FXuint getAnimSpeed() const { return animSpeed; } FXuint getMenuPause() const { return menuPause; } FXuint getTooltipPause() const { return tooltipPause; } FXuint getTooltipTime() const { return tooltipTime; } FXint getDragDelta() const { return dragDelta; } FXint getWheelLines() const { return wheelLines; } FXint getScrollBarSize() const { return scrollBarSize; } /// Change application-wide settings void setTypingSpeed(FXuint speed); void setClickSpeed(FXuint speed); void setScrollSpeed(FXuint speed); void setScrollDelay(FXuint delay); void setBlinkSpeed(FXuint speed); void setAnimSpeed(FXuint speed); void setMenuPause(FXuint pause); void setTooltipPause(FXuint pause); void setTooltipTime(FXuint time); void setDragDelta(FXint delta); void setWheelLines(FXint lines); void setScrollBarSize(FXint size); /// Obtain default colors FXColor getBorderColor() const { return borderColor; } FXColor getBaseColor() const { return baseColor; } FXColor getHiliteColor() const { return hiliteColor; } FXColor getShadowColor() const { return shadowColor; } FXColor getBackColor() const { return backColor; } FXColor getForeColor() const { return foreColor; } FXColor getSelforeColor() const { return selforeColor; } FXColor getSelbackColor() const { return selbackColor; } FXColor getTipforeColor() const { return tipforeColor; } FXColor getTipbackColor() const { return tipbackColor; } FXColor getSelMenuTextColor() const { return selMenuTextColor; } FXColor getSelMenuBackColor() const { return selMenuBackColor; } /// Change default colors void setBorderColor(FXColor color); void setBaseColor(FXColor color); void setHiliteColor(FXColor color); void setShadowColor(FXColor color); void setBackColor(FXColor color); void setForeColor(FXColor color); void setSelforeColor(FXColor color); void setSelbackColor(FXColor color); void setTipforeColor(FXColor color); void setTipbackColor(FXColor color); void setSelMenuTextColor(FXColor color); void setSelMenuBackColor(FXColor color); /// Get number of existing windows FXuint getWindowCount() const { return windowCount; } /// Save virtual void save(FXStream& store) const; /// Load virtual void load(FXStream& store); /// Dump widget information void dumpWidgets() const; /// Destroy the application and all reachable resources virtual ~FXApp(); }; } #endif fox1.6-1.6.57/include/FXArray.h000066400000000000000000000160771326741342000157600ustar00rootroot00000000000000/******************************************************************************** * * * G e n e r i c A r r a y * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXArray.h,v 1.24.2.1 2008/03/25 20:18:43 fox Exp $ * ********************************************************************************/ #ifndef FXARRAY_H #define FXARRAY_H #ifndef FXELEMENT_H #include "FXElement.h" #endif namespace FX { /// Array of some generic type template class FXArray { protected: TYPE *ptr; // Data array FXint num; // Number in array public: /// Create as empty FXArray():ptr(NULL),num(0){ } /// Create with given size n FXArray(FXint n):ptr(NULL),num(0){ if(allocElms(ptr,n)){ constructElms(ptr,n); num=n; } } /// Create initialized from another array FXArray(const FXArray& src):ptr(NULL),num(0){ if(allocElms(ptr,src.num)){ constructElms(ptr,src.num); copyElms(ptr,src.ptr,src.num); num=src.num; } } /// Create initialized with n copies of object FXArray(const TYPE& src,FXint n):ptr(NULL),num(0){ if(allocElms(ptr,n)){ constructElms(ptr,n); fillElms(ptr,src,n); num=n; } } /// Create initialized with array of n objects FXArray(const TYPE* src,FXint n):ptr(NULL),num(0){ if(allocElms(ptr,n)){ constructElms(ptr,n); copyElms(ptr,src,n); num=n; } } /// Return number of elements FXint no() const { return num; } /// Change number of elements to n bool no(FXint n){ if(n!=num){ if(0& operator=(const FXArray& src){ if(ptr!=src.ptr){ no(src.num); copyElms(ptr,src.ptr,src.num); } return *this; } /// Index into array TYPE& operator[](FXint i){ return ptr[i]; } const TYPE& operator[](FXint i) const { return ptr[i]; } /// Index into list TYPE& at(FXint i){ return ptr[i]; } const TYPE& at(FXint i) const { return ptr[i]; } /// Return pointer to list TYPE* data() const { return ptr; } /// Adopt array from source FXArray& adopt(FXArray& src){ no(0); ptr=src.ptr; src.ptr=NULL; num=src.num; src.num=0; return *this; } /// Assign object p to list FXArray& assign(const TYPE& src){ if(no(1)){ ptr[0]=src; } return *this; } /// Assign n copies of object to list FXArray& assign(const TYPE& src,FXint n){ if(no(n)){ fillElms(ptr,src,n); } return *this; } /// Assign n objects to list FXArray& assign(const TYPE* src,FXint n){ if(no(n)){ copyElms(ptr,src,n); } return *this; } /// Assign n objects to list FXArray& assign(const FXArray& src){ if(no(src.num)){ copyElms(ptr,src.ptr,src.num); } return *this; } /// Insert an object FXArray& insert(FXint pos,const TYPE& src){ if(no(num+1)){ moveElms(ptr+pos+1,ptr+pos,num-pos-1); ptr[pos]=src; } return *this; } /// Insert n copies of object at specified position FXArray& insert(FXint pos,const TYPE& src,FXint n){ if(no(num+n)){ moveElms(ptr+pos+n,ptr+pos,num-pos-n); fillElms(ptr+pos,src,n); } return *this; } /// Insert n objects at specified position FXArray& insert(FXint pos,const TYPE* src,FXint n){ if(no(num+n)){ moveElms(ptr+pos+n,ptr+pos,num-pos-n); copyElms(ptr+pos,src,n); } return *this; } /// Insert n objects at specified position FXArray& insert(FXint pos,const FXArray& src){ if(no(num+src.num)){ moveElms(ptr+pos+src.num,ptr+pos,num-pos-src.num); copyElms(ptr+pos,src.ptr,src.num); } return *this; } /// Prepend object FXArray& prepend(const TYPE& src){ if(no(num+1)){ moveElms(ptr+1,ptr,num-1); ptr[0]=src; } return *this; } /// Prepend n copies of object FXArray& prepend(const TYPE& src,FXint n){ if(no(num+n)){ moveElms(ptr+n,ptr,num-n); fillElms(ptr,src,n); } return *this; } /// Prepend n objects FXArray& prepend(const TYPE* src,FXint n){ if(no(num+n)){ moveElms(ptr+n,ptr,num-n); copyElms(ptr,src,n); } return *this; } /// Prepend n objects FXArray& prepend(const FXArray& src){ if(no(num+src.num)){ moveElms(ptr+src.num,ptr,num-src.num); copyElms(ptr,src.ptr,src.num); } return *this; } /// Append object FXArray& append(const TYPE& src){ if(no(num+1)){ ptr[num-1]=src; } return *this; } /// Append n copies of object FXArray& append(const TYPE& src,FXint n){ if(no(num+n)){ fillElms(ptr+num-n,src,n); } return *this; } /// Append n objects FXArray& append(const TYPE* src,FXint n){ if(no(num+n)){ copyElms(ptr+num-n,src,n); } return *this; } /// Append n objects FXArray& append(const FXArray& src){ if(no(num+src.num)){ copyElms(ptr+num-src.num,src.ptr,src.num); } return *this; } /// Remove object at pos FXArray& erase(FXint pos){ moveElms(ptr+pos,ptr+pos+1,num-pos-1); no(num-1); return *this; } /// Remove n objects starting at pos FXArray& erase(FXint pos,FXint n){ moveElms(ptr+pos,ptr+pos+n,num-n-pos); no(num-n); return *this; } /// Remove all objects FXArray& clear(){ destructElms(ptr,num); freeElms(ptr); num=0; return *this; } /// Delete data ~FXArray(){ destructElms(ptr,num); freeElms(ptr); } }; } #endif fox1.6-1.6.57/include/FXArrowButton.h000066400000000000000000000146131326741342000171620ustar00rootroot00000000000000/******************************************************************************** * * * A r r o w B u t t o n W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXArrowButton.h,v 1.39 2006/01/22 17:57:58 fox Exp $ * ********************************************************************************/ #ifndef FXARROWBUTTON_H #define FXARROWBUTTON_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { // Arrow style options enum { ARROW_NONE = 0, // No arrow ARROW_UP = 0x00080000, // Arrow points up ARROW_DOWN = 0x00100000, // Arrow points down ARROW_LEFT = 0x00200000, // Arrow points left ARROW_RIGHT = 0x00400000, // Arrow points right ARROW_AUTO = 0x00800000, // Automatically fire when hovering mouse over button ARROW_REPEAT = 0x01000000, // Button repeats if held down ARROW_AUTOGRAY = 0x02000000, // Automatically gray out when not updated ARROW_AUTOHIDE = 0x04000000, // Automatically hide when not updated ARROW_TOOLBAR = 0x08000000, // Button is toolbar-style ARROW_NORMAL = FRAME_RAISED|FRAME_THICK|ARROW_UP }; /** * Button with an arrow; the arrow can point in any direction. * When clicked, the arrow button sends a SEL_COMMAND to its target. * When ARROW_REPEAT is passed, the arrow button sends a SEL_COMMAND * repeatedly while the button is pressed. * The option ARROW_AUTO together with ARROW_REPEAT makes the arrow * button work in repeat mode simply by hovering the cursor over it. */ class FXAPI FXArrowButton : public FXFrame { FXDECLARE(FXArrowButton) protected: FXColor arrowColor; // Arrow color FXint arrowSize; // Arrow size FXString tip; // Tooltip value FXString help; // Help value FXbool state; // State of button FXbool fired; // Timer has fired protected: FXArrowButton(); private: FXArrowButton(const FXArrowButton&); FXArrowButton &operator=(const FXArrowButton&); public: long onPaint(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onRepeat(FXObject*,FXSelector,void*); long onAuto(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: enum { ID_REPEAT=FXFrame::ID_LAST, ID_AUTO, ID_LAST }; public: /// Construct arrow button FXArrowButton(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=ARROW_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Get default width virtual FXint getDefaultWidth(); /// Get default height virtual FXint getDefaultHeight(); /// Enable the button virtual void enable(); /// Disable the button virtual void disable(); /// Returns true because a button can receive focus virtual bool canFocus() const; /// Set the button state (where TRUE means the button is down) void setState(FXbool s); /// Get the button state (where TRUE means the button is down) FXbool getState() const { return state; } /// Set status line help text for this arrow button void setHelpText(const FXString& text){ help=text; } /// Get status line help text for this arrow button const FXString& getHelpText() const { return help; } /// Set tool tip message for this arrow button void setTipText(const FXString& text){ tip=text; } /// Get tool tip message for this arrow button const FXString& getTipText() const { return tip; } /// Set the arrow style flags void setArrowStyle(FXuint style); /// Get the arrow style flags FXuint getArrowStyle() const; /// Set the default arrow size void setArrowSize(FXint size); /// Get the default arrow size FXint getArrowSize() const { return arrowSize; } /// Set the current justification mode. void setJustify(FXuint mode); /// Get the current justification mode. FXuint getJustify() const; /// Get the fill color for the arrow FXColor getArrowColor() const { return arrowColor; } /// Set the fill color for the arrow void setArrowColor(FXColor clr); /// Save label to a stream virtual void save(FXStream& store) const; /// Load label from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXArrowButton(); }; } #endif fox1.6-1.6.57/include/FXBMPIcon.h000066400000000000000000000070501326741342000161200ustar00rootroot00000000000000/******************************************************************************** * * * B M P I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBMPIcon.h,v 1.22 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXBMPICON_H #define FXBMPICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /** * The BMP Icon class is a convenience class for working with icons in the * Microsoft Bitmap (.bmp) graphics file format. This makes it possible to * use resources created with Windows development tools inside FOX without * need for graphics file format translators. The bitmap loaded handles * 1, 4, and 8 bit paletted bitmaps, 16 and 24 bit RGB bitmaps, and * 32 bit RGBA bitmaps. */ class FXAPI FXBMPIcon : public FXIcon { FXDECLARE(FXBMPIcon) protected: FXBMPIcon(){} private: FXBMPIcon(const FXBMPIcon&); FXBMPIcon &operator=(const FXBMPIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct icon from memory stream formatted in Microsoft BMP format FXBMPIcon(FXApp* a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in Microsoft bitmap format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in Microsoft bitmap format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXBMPIcon(); }; /** * Check if stream contains a bitmap, return TRUE if so. */ extern FXAPI bool fxcheckBMP(FXStream& store); /** * Load an BMP (Microsoft Bitmap) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadBMP(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an BMP (Microsoft Bitmap) file to a stream. */ extern FXAPI bool fxsaveBMP(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXBMPImage.h000066400000000000000000000070321326741342000162520ustar00rootroot00000000000000/******************************************************************************** * * * B M P I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBMPImage.h,v 1.22 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXBMPIMAGE_H #define FXBMPIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /** * The BMP Image class is a convenience class for working with images in the * Microsoft Bitmap (.bmp) graphics file format. This makes it possible to * use resources created with Windows development tools inside FOX without * need for graphics file format translators. The bitmap loaded handles * 1, 4, and 8 bit paletted bitmaps, 16 and 24 bit RGB bitmaps, and * 32 bit RGBA bitmaps. */ class FXAPI FXBMPImage : public FXImage { FXDECLARE(FXBMPImage) protected: FXBMPImage(){} private: FXBMPImage(const FXBMPImage&); FXBMPImage &operator=(const FXBMPImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct image from memory stream formatted in Microsoft BMP format FXBMPImage(FXApp* a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in Microsoft bitmap format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in Microsoft bitmap format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXBMPImage(); }; /** * Check if stream contains a bitmap, return TRUE if so. */ extern FXAPI bool fxcheckBMP(FXStream& store); /** * Load an BMP (Microsoft Bitmap) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadBMP(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an BMP (Microsoft Bitmap) file to a stream. */ extern FXAPI bool fxsaveBMP(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXBZFileStream.h000066400000000000000000000146461326741342000171710ustar00rootroot00000000000000/******************************************************************************** * * * B Z F i l e S t r e a m C l a s s e s * * * ********************************************************************************* * Copyright (C) 1999,2006 by Lyle Johnson. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBZFileStream.h,v 1.5.2.1 2007/09/28 16:42:19 fox Exp $ * ********************************************************************************/ #ifdef HAVE_BZ2LIB_H #ifndef FXBZFILESTREAM_H #define FXBZFILESTREAM_H #ifndef FXFILESTREAM_H #include "FXFileStream.h" #endif namespace FX { struct BZBlock; /// BZIP2 compressed file stream class FXAPI FXBZFileStream : public FXFileStream { private: BZBlock *bz; int ac; protected: virtual FXuval writeBuffer(FXuval count); virtual FXuval readBuffer(FXuval count); public: /// Create BZIP2 file stream FXBZFileStream(const FXObject* cont=NULL); /// Open file stream bool open(const FXString& filename,FXStreamDirection save_or_load,FXuval size=8192); /// Flush buffer virtual bool flush(); /// Close file stream virtual bool close(); /// Get position FXlong position() const { return FXStream::position(); } /// Move to position virtual bool position(FXlong,FXWhence){ return FALSE; } /// Save single items to stream FXBZFileStream& operator<<(const FXuchar& v){ FXStream::operator<<(v); return *this; } FXBZFileStream& operator<<(const FXchar& v){ FXStream::operator<<(v); return *this; } FXBZFileStream& operator<<(const FXushort& v){ FXStream::operator<<(v); return *this; } FXBZFileStream& operator<<(const FXshort& v){ FXStream::operator<<(v); return *this; } FXBZFileStream& operator<<(const FXuint& v){ FXStream::operator<<(v); return *this; } FXBZFileStream& operator<<(const FXint& v){ FXStream::operator<<(v); return *this; } FXBZFileStream& operator<<(const FXfloat& v){ FXStream::operator<<(v); return *this; } FXBZFileStream& operator<<(const FXdouble& v){ FXStream::operator<<(v); return *this; } FXBZFileStream& operator<<(const FXlong& v){ FXStream::operator<<(v); return *this; } FXBZFileStream& operator<<(const FXulong& v){ FXStream::operator<<(v); return *this; } /// Save arrays of items to stream FXBZFileStream& save(const FXuchar* p,FXuval n){ FXStream::save(p,n); return *this; } FXBZFileStream& save(const FXchar* p,FXuval n){ FXStream::save(p,n); return *this; } FXBZFileStream& save(const FXushort* p,FXuval n){ FXStream::save(p,n); return *this; } FXBZFileStream& save(const FXshort* p,FXuval n){ FXStream::save(p,n); return *this; } FXBZFileStream& save(const FXuint* p,FXuval n){ FXStream::save(p,n); return *this; } FXBZFileStream& save(const FXint* p,FXuval n){ FXStream::save(p,n); return *this; } FXBZFileStream& save(const FXfloat* p,FXuval n){ FXStream::save(p,n); return *this; } FXBZFileStream& save(const FXdouble* p,FXuval n){ FXStream::save(p,n); return *this; } FXBZFileStream& save(const FXlong* p,FXuval n){ FXStream::save(p,n); return *this; } FXBZFileStream& save(const FXulong* p,FXuval n){ FXStream::save(p,n); return *this; } /// Load single items from stream FXBZFileStream& operator>>(FXuchar& v){ FXStream::operator>>(v); return *this; } FXBZFileStream& operator>>(FXchar& v){ FXStream::operator>>(v); return *this; } FXBZFileStream& operator>>(FXushort& v){ FXStream::operator>>(v); return *this; } FXBZFileStream& operator>>(FXshort& v){ FXStream::operator>>(v); return *this; } FXBZFileStream& operator>>(FXuint& v){ FXStream::operator>>(v); return *this; } FXBZFileStream& operator>>(FXint& v){ FXStream::operator>>(v); return *this; } FXBZFileStream& operator>>(FXfloat& v){ FXStream::operator>>(v); return *this; } FXBZFileStream& operator>>(FXdouble& v){ FXStream::operator>>(v); return *this; } FXBZFileStream& operator>>(FXlong& v){ FXStream::operator>>(v); return *this; } FXBZFileStream& operator>>(FXulong& v){ FXStream::operator>>(v); return *this; } /// Load arrays of items from stream FXBZFileStream& load(FXuchar* p,FXuval n){ FXStream::load(p,n); return *this; } FXBZFileStream& load(FXchar* p,FXuval n){ FXStream::load(p,n); return *this; } FXBZFileStream& load(FXushort* p,FXuval n){ FXStream::load(p,n); return *this; } FXBZFileStream& load(FXshort* p,FXuval n){ FXStream::load(p,n); return *this; } FXBZFileStream& load(FXuint* p,FXuval n){ FXStream::load(p,n); return *this; } FXBZFileStream& load(FXint* p,FXuval n){ FXStream::load(p,n); return *this; } FXBZFileStream& load(FXfloat* p,FXuval n){ FXStream::load(p,n); return *this; } FXBZFileStream& load(FXdouble* p,FXuval n){ FXStream::load(p,n); return *this; } FXBZFileStream& load(FXlong* p,FXuval n){ FXStream::load(p,n); return *this; } FXBZFileStream& load(FXulong* p,FXuval n){ FXStream::load(p,n); return *this; } /// Save object FXBZFileStream& saveObject(const FXObject* v){ FXStream::saveObject(v); return *this; } /// Load object FXBZFileStream& loadObject(FXObject*& v){ FXStream::loadObject(v); return *this; } /// Clean up virtual ~FXBZFileStream(); }; } #endif #endif fox1.6-1.6.57/include/FXBitmap.h000066400000000000000000000167671326741342000161240ustar00rootroot00000000000000/******************************************************************************** * * * B i t m a p O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBitmap.h,v 1.37 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXBITMAP_H #define FXBITMAP_H #ifndef FXDRAWABLE_H #include "FXDrawable.h" #endif namespace FX { // Image rendering hints enum { BITMAP_KEEP = 0x00000001, // Keep pixel data in client BITMAP_OWNED = 0x00000002, // Pixel data is owned by image BITMAP_SHMI = 0x00000020, // Using shared memory image BITMAP_SHMP = 0x00000040 // Using shared memory pixmap }; // Forward declarations class FXDC; class FXDCWindow; /** * A Bitmap is a rectangular array of pixels. It supports two representations * of these pixels: a client-side pixel buffer, and a server-side pixmap which * is stored in an organization directly compatible with the screen, for fast * drawing onto the device. * The server-side representation is not directly accessible from the current * process as it lives in the process of the X Server or GDI. * The client-side pixel array is of size height x (width+7)/8 bytes, in other * words 8 pixels packed into a single byte, starting at bit 0 on the left. */ class FXAPI FXBitmap : public FXDrawable { FXDECLARE(FXBitmap) friend class FXDC; friend class FXDCWindow; private: #ifdef WIN32 virtual FXID GetDC() const; virtual int ReleaseDC(FXID) const; #endif protected: FXuchar *data; // Pixel data FXint bytewidth; // Number of bytes across FXuint options; // Options protected: FXBitmap(); private: FXBitmap(const FXBitmap&); FXBitmap &operator=(const FXBitmap&); public: /** * Create a bitmap. If a client-side pixel buffer has been specified, * the bitmap does not own the pixel buffer unless the BITMAP_OWNED flag is * set. If the BITMAP_OWNED flag is set but a NULL pixel buffer is * passed, a pixel buffer will be automatically created and will be owned * by the bitmap. The flags BITMAP_SHMI and BITMAP_SHMP may be specified for * large bitmaps to instruct render() to use shared memory to communicate * with the server. */ FXBitmap(FXApp* a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Change options void setOptions(FXuint opts); /// To get to the option flags FXuint getOptions() const { return options; } /** * Populate the bitmap with new pixel data of the same size; it will assume * ownership of the pixel data if image BITMAP_OWNED option is passed. * The server-side representation of the image, if it exists, is not updated. * This can be done by calling render(). */ virtual void setData(FXuchar *pix,FXuint opts=0); /** * Populate the bitmap with new pixel data of a new size; it will assume ownership * of the pixel data if image BITMAP_OWNED option is passed. The size of the server- * side representation of the image, if it exists, is adjusted but the contents are * not updated yet. This can be done by calling render(). */ virtual void setData(FXuchar *pix,FXuint opts,FXint w,FXint h); /// To get to the pixel data FXuchar* getData() const { return data; } /// Get pixel at x,y FXbool getPixel(FXint x,FXint y) const { return (FXbool)((data[y*bytewidth+(x>>3)]>>(x&7))&1); } /// Change pixel at x,y void setPixel(FXint x,FXint y,FXbool color){ color ? data[y*bytewidth+(x>>3)]|=(1<<(x&7)) : data[y*bytewidth+(x>>3)]&=~(1<<(x&7)); } /** * Create the server side pixmap, then call render() to fill it with the * pixel data from the client-side buffer. After the server-side image has * been created, the client-side pixel buffer will be deleted unless * BITMAP_KEEP has been specified. If the pixel buffer is not owned, i.e. * the flag BITMAP_OWNED is not set, the pixel buffer will not be deleted. */ virtual void create(); /** * Detach the server side pixmap from the Bitmap. * Afterwards, the Bitmap is left as if it never had a server-side resources. */ virtual void detach(); /** * Destroy the server-side pixmap. * The client-side pixel buffer is not affected. */ virtual void destroy(); /** * Retrieves pixels from the server-side bitmap. */ virtual void restore(); /** * Render the server-side representation of the bitmap from client-side * pixels. */ virtual void render(); /** * Release the client-side pixels buffer, free it if it was owned. * If it is not owned, the image just forgets about the buffer. */ virtual void release(); /** * Resize both client-side and server-side representations (if any) to the * given width and height. The new representations typically contain garbage * after this operation and need to be re-filled. */ virtual void resize(FXint w,FXint h); /** * Rescale pixels image to the specified width and height; this calls * resize() to adjust the client and server side representations. */ virtual void scale(FXint w,FXint h); /// Mirror bitmap horizontally and/or vertically virtual void mirror(FXbool horizontal,FXbool vertical); /// Rotate bitmap by degrees ccw virtual void rotate(FXint degrees); /** * Crop bitmap to given rectangle; this calls resize() to adjust the client * and server side representations. The new bitmap may be smaller or larger * than the old one; blank areas are filled with color. There must be at * least one pixel of overlap between the old and the new bitmap. */ virtual void crop(FXint x,FXint y,FXint w,FXint h,FXbool color=0); /// Fill bitmap with uniform value virtual void fill(FXbool color); /// Save object to stream virtual void save(FXStream& store) const; /// Load object from stream virtual void load(FXStream& store); /// Save pixel data only virtual bool savePixels(FXStream& store) const; /// Load pixel data only virtual bool loadPixels(FXStream& store); /// Cleanup virtual ~FXBitmap(); }; } #endif fox1.6-1.6.57/include/FXBitmapFrame.h000066400000000000000000000072701326741342000170640ustar00rootroot00000000000000/******************************************************************************** * * * B i t m a p F r a m e W i d g e t * * * ********************************************************************************* * Copyright (C) 2001,2006 by H. J. Daniel III. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBitmapFrame.h,v 1.6 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXBITMAPFRAME_H #define FXBITMAPFRAME_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /** * The bitmap frame is a simple frame widget displaying an monochrome bitmap * image; the bitmap is not owned by the bitmap frame so it must be explicitly * deleted elsewhere. */ class FXAPI FXBitmapFrame : public FXFrame { FXDECLARE(FXBitmapFrame) protected: FXBitmap *bitmap; // The bitmap being displayed FXColor onColor; // Color for on pixels FXColor offColor; // Color for off pixels protected: FXBitmapFrame(); private: FXBitmapFrame(const FXBitmapFrame&); FXBitmapFrame &operator=(const FXBitmapFrame&); public: long onPaint(FXObject*,FXSelector,void* ptr); public: /// Construct image frame and pass it an image FXBitmapFrame(FXComposite* p,FXBitmap *bmp,FXuint opts=FRAME_SUNKEN|FRAME_THICK,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=0,FXint pr=0,FXint pt=0,FXint pb=0); /// Create window virtual void create(); /// Get default width virtual FXint getDefaultWidth(); /// Get default height virtual FXint getDefaultHeight(); /// Change the image being displayed void setBitmap(FXBitmap* bmp); /// Return the current image FXBitmap* getBitmap() const { return bitmap; } /// Set on color void setOnColor(FXColor clr); /// Get on color FXColor getOnColor() const { return onColor; } /// Set off color void setOffColor(FXColor clr); /// Get off color FXColor getOffColor() const { return offColor; } /// Set the current justification mode. void setJustify(FXuint mode); /// Get the current justification mode. FXuint getJustify() const; /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy the widget, but do not destroy the image virtual ~FXBitmapFrame(); }; } #endif fox1.6-1.6.57/include/FXBitmapView.h000066400000000000000000000112241326741342000167360ustar00rootroot00000000000000/******************************************************************************** * * * B i t m a p V i e w W i d g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBitmapView.h,v 1.8 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXBITMAPVIEW_H #define FXBITMAPVIEW_H #ifndef FXSCROLLAREA_H #include "FXScrollArea.h" #endif namespace FX { class FXBitmap; /// Bitmap alignment styles enum { BITMAPVIEW_NORMAL = 0, /// Normal mode is centered BITMAPVIEW_CENTER_X = 0, /// Centered horizontally BITMAPVIEW_LEFT = 0x00100000, /// Left-aligned BITMAPVIEW_RIGHT = 0x00200000, /// Right-aligned BITMAPVIEW_CENTER_Y = 0, /// Centered vertically BITMAPVIEW_TOP = 0x00400000, /// Top-aligned BITMAPVIEW_BOTTOM = 0x00800000 /// Bottom-aligned }; /** * The Bitmap View widget display a scrollable view of a monochrome bitmap image; * the bitmap is not owned by the bitmap frame so it must be explicitly deleted * elsewhere. Thus, a single bitmap image can be displayed inside multiple bitmap * view widgets. */ class FXAPI FXBitmapView : public FXScrollArea { FXDECLARE(FXBitmapView) protected: FXBitmap *bitmap; // Image to view FXColor onColor; // Color for on pixels FXColor offColor; // Color for off pixels FXint grabx; // Grab point x FXint graby; // Grab point y protected: FXBitmapView(); private: FXBitmapView(const FXBitmapView&); FXBitmapView &operator=(const FXBitmapView&); public: long onPaint(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); public: enum { ID_XYZ=FXScrollArea::ID_LAST, ID_LAST }; public: /// Construct a scroll window FXBitmapView(FXComposite* p,FXBitmap* bmp=NULL,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout immediately virtual void layout(); /// Image view widget can receive focus virtual bool canFocus() const; /// Return the width of the contents virtual FXint getContentWidth(); /// Return the height of the contents virtual FXint getContentHeight(); /// Change image void setBitmap(FXBitmap* bmp); /// Return image FXBitmap* getBitmap() const { return bitmap; } /// Set on color void setOnColor(FXColor clr); /// Get on color FXColor getOnColor() const { return onColor; } /// Set off color void setOffColor(FXColor clr); /// Get off color FXColor getOffColor() const { return offColor; } /// Set the current alignment. void setAlignment(FXuint mode); /// Get the current alignment. FXuint getAlignment() const; /// Save list to a stream virtual void save(FXStream& store) const; /// Load list from a stream virtual void load(FXStream& store); /// Destroy virtual ~FXBitmapView(); }; } #endif fox1.6-1.6.57/include/FXButton.h000066400000000000000000000134271326741342000161510ustar00rootroot00000000000000/******************************************************************************** * * * B u t t o n W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXButton.h,v 1.38 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXBUTTON_H #define FXBUTTON_H #ifndef FXLABEL_H #include "FXLabel.h" #endif namespace FX { /// Button state bits enum { STATE_UP = 0, /// Button is up STATE_DOWN = 1, /// Button is down STATE_ENGAGED = 2, /// Button is engaged STATE_UNCHECKED = STATE_UP, /// Same as STATE_UP (used for check buttons or radio buttons) STATE_CHECKED = STATE_ENGAGED /// Same as STATE_ENGAGED (used for check buttons or radio buttons) }; /// Button flags enum { BUTTON_AUTOGRAY = 0x00800000, /// Automatically gray out when not updated BUTTON_AUTOHIDE = 0x01000000, /// Automatically hide button when not updated BUTTON_TOOLBAR = 0x02000000, /// Toolbar style button [flat look] BUTTON_DEFAULT = 0x04000000, /// May become default button when receiving focus BUTTON_INITIAL = 0x08000000, /// This button is the initial default button BUTTON_NORMAL = (FRAME_RAISED|FRAME_THICK|JUSTIFY_NORMAL|ICON_BEFORE_TEXT) }; /** * A button provides a push button, with optional icon and/or text label. * When pressed, the button widget sends a SEL_COMMAND to its target. * Passing the BUTTON_TOOLBAR style option gives buttons a "flat" look, and * causes the edge of the button to be raised when the cursor moves over it. * Passing BUTTON_DEFAULT allows the button to become the default button in * a dialog, when the focus moves to it. The default widget in a dialog * is the widget which will accept the RETURN key when it is pressed. * The BUTTON_INITIAL flag makes the button the default widget when the * focus moves to a widget which can not itself be a default widget. * There should be only a single button in the dialog which is the * initial default; typically this is the OK or CLOSE button. * The option BUTTON_AUTOGRAY (BUTTON_AUTOHIDE) causes the button to be grayed * out (hidden) if its handler does not respond to the SEL_UPDATE message. * This is useful when messages are delegated, for example when using a * multiple document interface, where the ultimaye destination of a message * can be changed. */ class FXAPI FXButton : public FXLabel { FXDECLARE(FXButton) protected: FXuchar state; protected: FXButton(); private: FXButton(const FXButton&); FXButton& operator=(const FXButton&); public: long onPaint(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onCheck(FXObject*,FXSelector,void*); long onUncheck(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); public: /// Construct button with text and icon FXButton(FXComposite* p,const FXString& text,FXIcon* ic=NULL,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=BUTTON_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Returns true because a button can receive focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Set as default button virtual void setDefault(FXbool enable=TRUE); /// Set the button state void setState(FXuint s); /// Get the button state FXuint getState() const { return state; } /// Set the button style flags void setButtonStyle(FXuint style); /// Get the button style flags FXuint getButtonStyle() const; }; } #endif fox1.6-1.6.57/include/FXCP1250Codec.h000066400000000000000000000011061326741342000164350ustar00rootroot00000000000000#ifndef FXCP1250CODEC_H #define FXCP1250CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP1250 Codec class FXAPI FXCP1250Codec : public FXTextCodec { FXDECLARE(FXCP1250Codec) public: FXCP1250Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP1250Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP1251Codec.h000066400000000000000000000011061326741342000164360ustar00rootroot00000000000000#ifndef FXCP1251CODEC_H #define FXCP1251CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP1251 Codec class FXAPI FXCP1251Codec : public FXTextCodec { FXDECLARE(FXCP1251Codec) public: FXCP1251Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP1251Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP1252Codec.h000066400000000000000000000011061326741342000164370ustar00rootroot00000000000000#ifndef FXCP1252CODEC_H #define FXCP1252CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP1252 Codec class FXAPI FXCP1252Codec : public FXTextCodec { FXDECLARE(FXCP1252Codec) public: FXCP1252Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP1252Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP1253Codec.h000066400000000000000000000011061326741342000164400ustar00rootroot00000000000000#ifndef FXCP1253CODEC_H #define FXCP1253CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP1253 Codec class FXAPI FXCP1253Codec : public FXTextCodec { FXDECLARE(FXCP1253Codec) public: FXCP1253Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP1253Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP1254Codec.h000066400000000000000000000011061326741342000164410ustar00rootroot00000000000000#ifndef FXCP1254CODEC_H #define FXCP1254CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP1254 Codec class FXAPI FXCP1254Codec : public FXTextCodec { FXDECLARE(FXCP1254Codec) public: FXCP1254Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP1254Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP1255Codec.h000066400000000000000000000011061326741342000164420ustar00rootroot00000000000000#ifndef FXCP1255CODEC_H #define FXCP1255CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP1255 Codec class FXAPI FXCP1255Codec : public FXTextCodec { FXDECLARE(FXCP1255Codec) public: FXCP1255Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP1255Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP1256Codec.h000066400000000000000000000011061326741342000164430ustar00rootroot00000000000000#ifndef FXCP1256CODEC_H #define FXCP1256CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP1256 Codec class FXAPI FXCP1256Codec : public FXTextCodec { FXDECLARE(FXCP1256Codec) public: FXCP1256Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP1256Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP1257Codec.h000066400000000000000000000011061326741342000164440ustar00rootroot00000000000000#ifndef FXCP1257CODEC_H #define FXCP1257CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP1257 Codec class FXAPI FXCP1257Codec : public FXTextCodec { FXDECLARE(FXCP1257Codec) public: FXCP1257Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP1257Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP1258Codec.h000066400000000000000000000011061326741342000164450ustar00rootroot00000000000000#ifndef FXCP1258CODEC_H #define FXCP1258CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP1258 Codec class FXAPI FXCP1258Codec : public FXTextCodec { FXDECLARE(FXCP1258Codec) public: FXCP1258Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP1258Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP437Codec.h000066400000000000000000000010771326741342000163720ustar00rootroot00000000000000#ifndef FXCP437CODEC_H #define FXCP437CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP437 Codec class FXAPI FXCP437Codec : public FXTextCodec { FXDECLARE(FXCP437Codec) public: FXCP437Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP437Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP850Codec.h000066400000000000000000000011001326741342000163540ustar00rootroot00000000000000#ifndef FXCP850CODEC_H #define FXCP850CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP8502 Codec class FXAPI FXCP850Codec : public FXTextCodec { FXDECLARE(FXCP850Codec) public: FXCP850Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP850Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP852Codec.h000066400000000000000000000010771326741342000163730ustar00rootroot00000000000000#ifndef FXCP852CODEC_H #define FXCP852CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP852 Codec class FXAPI FXCP852Codec : public FXTextCodec { FXDECLARE(FXCP852Codec) public: FXCP852Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP852Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP855Codec.h000066400000000000000000000010771326741342000163760ustar00rootroot00000000000000#ifndef FXCP855CODEC_H #define FXCP855CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP855 Codec class FXAPI FXCP855Codec : public FXTextCodec { FXDECLARE(FXCP855Codec) public: FXCP855Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP855Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP856Codec.h000066400000000000000000000010771326741342000163770ustar00rootroot00000000000000#ifndef FXCP856CODEC_H #define FXCP856CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP856 Codec class FXAPI FXCP856Codec : public FXTextCodec { FXDECLARE(FXCP856Codec) public: FXCP856Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP856Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP857Codec.h000066400000000000000000000010771326741342000164000ustar00rootroot00000000000000#ifndef FXCP857CODEC_H #define FXCP857CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP857 Codec class FXAPI FXCP857Codec : public FXTextCodec { FXDECLARE(FXCP857Codec) public: FXCP857Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP857Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP860Codec.h000066400000000000000000000010771326741342000163720ustar00rootroot00000000000000#ifndef FXCP860CODEC_H #define FXCP860CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP860 Codec class FXAPI FXCP860Codec : public FXTextCodec { FXDECLARE(FXCP860Codec) public: FXCP860Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP860Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP861Codec.h000066400000000000000000000010771326741342000163730ustar00rootroot00000000000000#ifndef FXCP861CODEC_H #define FXCP861CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP861 Codec class FXAPI FXCP861Codec : public FXTextCodec { FXDECLARE(FXCP861Codec) public: FXCP861Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP861Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP862Codec.h000066400000000000000000000010771326741342000163740ustar00rootroot00000000000000#ifndef FXCP862CODEC_H #define FXCP862CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP862 Codec class FXAPI FXCP862Codec : public FXTextCodec { FXDECLARE(FXCP862Codec) public: FXCP862Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP862Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP863Codec.h000066400000000000000000000010771326741342000163750ustar00rootroot00000000000000#ifndef FXCP863CODEC_H #define FXCP863CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP863 Codec class FXAPI FXCP863Codec : public FXTextCodec { FXDECLARE(FXCP863Codec) public: FXCP863Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP863Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP864Codec.h000066400000000000000000000010771326741342000163760ustar00rootroot00000000000000#ifndef FXCP864CODEC_H #define FXCP864CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP864 Codec class FXAPI FXCP864Codec : public FXTextCodec { FXDECLARE(FXCP864Codec) public: FXCP864Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP864Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP865Codec.h000066400000000000000000000010771326741342000163770ustar00rootroot00000000000000#ifndef FXCP865CODEC_H #define FXCP865CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP865 Codec class FXAPI FXCP865Codec : public FXTextCodec { FXDECLARE(FXCP865Codec) public: FXCP865Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP865Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP866Codec.h000066400000000000000000000010771326741342000164000ustar00rootroot00000000000000#ifndef FXCP866CODEC_H #define FXCP866CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP866 Codec class FXAPI FXCP866Codec : public FXTextCodec { FXDECLARE(FXCP866Codec) public: FXCP866Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP866Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP869Codec.h000066400000000000000000000010771326741342000164030ustar00rootroot00000000000000#ifndef FXCP869CODEC_H #define FXCP869CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP869 Codec class FXAPI FXCP869Codec : public FXTextCodec { FXDECLARE(FXCP869Codec) public: FXCP869Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP869Codec(){} }; } #endif fox1.6-1.6.57/include/FXCP874Codec.h000066400000000000000000000010771326741342000163770ustar00rootroot00000000000000#ifndef FXCP874CODEC_H #define FXCP874CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// CP874 Codec class FXAPI FXCP874Codec : public FXTextCodec { FXDECLARE(FXCP874Codec) public: FXCP874Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXCP874Codec(){} }; } #endif fox1.6-1.6.57/include/FXCURCursor.h000066400000000000000000000064441326741342000165260ustar00rootroot00000000000000/******************************************************************************** * * * C U R C u r s o r O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Sander Jansen. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXCURCursor.h,v 1.18 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCURCURSOR_H #define FXCURCURSOR_H #ifndef FXCURSOR_H #include "FXCursor.h" #endif namespace FX { /// CUR Cursor class class FXAPI FXCURCursor : public FXCursor { FXDECLARE(FXCURCursor) protected: FXCURCursor(){} private: FXCURCursor(const FXCURCursor&); FXCURCursor &operator=(const FXCURCursor&); public: static const FXchar fileExt[]; public: /** * Construct a cursor from memory stream in Microsoft CUR format. * The image is limited to 32x32 pixels. */ FXCURCursor(FXApp* a,const void* pix); /// Save pixel data only, in CUR format virtual bool savePixels(FXStream& store) const; /// Load pixel data only, in CUR format virtual bool loadPixels(FXStream& store); /// Destructor virtual ~FXCURCursor(); }; #ifndef FXLOADICO #define FXLOADICO /** * Check if stream contains a ICO, return TRUE if so. */ extern FXAPI bool fxcheckICO(FXStream& store); /** * Load an ICO (Microsoft icon format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadICO(FXStream& store,FXColor*& data,FXint& width,FXint& height,FXint& xspot,FXint& yspot); /** * Save an ICO (Microsoft icon format) file to a stream. * If no hot-spot given, save as an ICO instead of a CUR resource. */ extern FXAPI bool fxsaveICO(FXStream& store,const FXColor *data,FXint width,FXint height,FXint xspot=-1,FXint yspot=-1); #endif } #endif fox1.6-1.6.57/include/FXCanvas.h000066400000000000000000000047461326741342000161150ustar00rootroot00000000000000/******************************************************************************** * * * C a n v a s W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXCanvas.h,v 1.21 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCANVAS_H #define FXCANVAS_H #ifndef FXWINDOW_H #include "FXWindow.h" #endif namespace FX { /// Canvas, an area drawn by another object class FXAPI FXCanvas : public FXWindow { FXDECLARE(FXCanvas) protected: FXCanvas(); private: FXCanvas(const FXCanvas&); FXCanvas &operator=(const FXCanvas&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Construct new drawing canvas widget FXCanvas(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Return TRUE because canvas can receive focus virtual bool canFocus() const; }; } #endif fox1.6-1.6.57/include/FXCheckButton.h000066400000000000000000000133601326741342000171030ustar00rootroot00000000000000/******************************************************************************** * * * C h e c k B u t t o n W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXCheckButton.h,v 1.32 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCHECKBUTTON_H #define FXCHECKBUTTON_H #ifndef FXLABEL_H #include "FXLabel.h" #endif namespace FX { /// CheckButton styles enum { CHECKBUTTON_AUTOGRAY = 0x00800000, /// Automatically gray out when not updated CHECKBUTTON_AUTOHIDE = 0x01000000, /// Automatically hide when not updated CHECKBUTTON_PLUS = 0x02000000, /// Draw a + for unchecked and - for checked CHECKBUTTON_NORMAL = JUSTIFY_NORMAL|ICON_BEFORE_TEXT }; /** * A Check Button is a tri-state button. Normally, it is either * TRUE or FALSE, and toggles between TRUE or FALSE whenever it is pressed. * A third state MAYBE may be set to indicate that no selection has been made yet * by the user, or that the state is ambiguous. * When pressed, the Check Button sends a SEL_COMMAND to its target, and the * message data represents the state of the check button. * The option CHECKBUTTON_AUTOGRAY (CHECKBUTTON_AUTOHIDE) causes the button to be * grayed out (hidden) if its handler does not respond to the SEL_UPDATE message. * With the CHECKBUTTON_PLUS option, the Check Button will draw a + or - sign instead * of a check. You can use this to make collapsable panels, by hooking up a Check * Button to a layout manager via the ID_TOGGLE_SHOWN message. This will give a * similar visual element as collapsing folders in a Tree List. */ class FXAPI FXCheckButton : public FXLabel { FXDECLARE(FXCheckButton) protected: FXColor checkColor; // Color of check mark FXColor boxColor; // Color of check box FXbool check; // Check state FXbool oldcheck; // Old check state protected: FXCheckButton(); private: FXCheckButton(const FXCheckButton&); FXCheckButton &operator=(const FXCheckButton&); public: long onPaint(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onCheck(FXObject*,FXSelector,void*); long onUncheck(FXObject*,FXSelector,void*); long onUnknown(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); public: /// Construct new check button FXCheckButton(FXComposite* p,const FXString& text,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=CHECKBUTTON_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Returns true because a check button can receive focus virtual bool canFocus() const; /// Get default width virtual FXint getDefaultWidth(); /// Get default height virtual FXint getDefaultHeight(); /// Set check button state (TRUE, FALSE or MAYBE) void setCheck(FXbool state=TRUE,FXbool notify=FALSE); /// Get check button state (TRUE, FALSE or MAYBE) FXbool getCheck() const { return check; } /// Change check button style void setCheckButtonStyle(FXuint style); /// Return current check button style FXuint getCheckButtonStyle() const; /// Get the box background color FXColor getBoxColor() const { return boxColor; } /// Set the box background color void setBoxColor(FXColor clr); /// Get the box check color FXColor getCheckColor() const { return checkColor; } /// Set the box check color void setCheckColor(FXColor clr); /// Save check button to a stream virtual void save(FXStream& store) const; /// Load check button from a stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXChoiceBox.h000066400000000000000000000127351326741342000165420ustar00rootroot00000000000000/******************************************************************************** * * * C h o i c e B o x * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXChoiceBox.h,v 1.8 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCHOICEBOX_H #define FXCHOICEBOX_H #ifndef FXDIALOGBOX_H #include "FXDialogBox.h" #endif namespace FX { class FXList; /** * The Choice Box provides a dialog panel to select one item out of a list * of choices. The choices are provided as a list of text strings. * When the dialog closes, the index of the selected choice is returned, * while a -1 is returned if the dialog was canceled, */ class FXAPI FXChoiceBox : public FXDialogBox { FXDECLARE(FXChoiceBox) protected: FXList *list; protected: FXChoiceBox(){} private: FXChoiceBox(const FXChoiceBox&); FXChoiceBox &operator=(const FXChoiceBox&); void initialize(const FXString& text,FXIcon* icon); public: long onCmdClicked(FXObject*,FXSelector,void*); long onCmdCancel(FXObject*,FXSelector,void*); public: enum{ ID_CLICKED=FXDialogBox::ID_LAST, ID_LAST }; public: /// Construct choice box with given caption, icon, message text, and with choices from array of strings FXChoiceBox(FXWindow* owner,const FXString& caption,const FXString& text,FXIcon* icon,const FXchar** choices,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Construct choice box with given caption, icon, message text, and with choices from newline separated strings FXChoiceBox(FXWindow* owner,const FXString& caption,const FXString& text,FXIcon* icon,const FXString& choices,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Construct free floating choice box with given caption, icon, message text, and with choices from array of strings FXChoiceBox(FXApp* app,const FXString& caption,const FXString& text,FXIcon* icon,const FXchar** choices,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Construct free floating choice box with given caption, icon, message text, and with choices from newline separated strings FXChoiceBox(FXApp* app,const FXString& caption,const FXString& text,FXIcon* icon,const FXString& choices,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /** * Show a modal choice dialog. * Prompt the user using a dialog with given caption, icon, * message text, and with choices from newline array of strings. * The return value is -1 if cancelled, or the given choice. */ static FXint ask(FXWindow* owner,FXuint opts,const FXString& caption,const FXString& text,FXIcon* icon,const FXchar** choices); /** * Show a modal choice dialog. * Prompt the user using a dialog with given caption, icon, * message text, and with choices from newline separated strings. * The return value is -1 if cancelled, or the given choice */ static FXint ask(FXWindow* owner,FXuint opts,const FXString& caption,const FXString& text,FXIcon* icon,const FXString& choices); /** * Show modal choice message, in free floating window. * Prompt the user using a dialog with given caption, icon, * message text, and with choices from newline array of strings. * The return value is -1 if cancelled, or the given choice */ static FXint ask(FXApp* app,FXuint opts,const FXString& caption,const FXString& text,FXIcon* icon,const FXchar** choices); /** * Show modal choice message, in free floating window. * Prompt the user using a dialog with given caption, icon, * message text, and with choices from newline separated strings. * The return value is -1 if cancelled, or the given choice */ static FXint ask(FXApp* app,FXuint opts,const FXString& caption,const FXString& text,FXIcon* icon,const FXString& choices); /// Save choice box to a stream virtual void save(FXStream& store) const; /// Load choice box from a stream virtual void load(FXStream& store); /// Destroy choice box virtual ~FXChoiceBox(); }; } #endif fox1.6-1.6.57/include/FXColorBar.h000066400000000000000000000116651326741342000164030ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorBar.h,v 1.20 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCOLORBAR_H #define FXCOLORBAR_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// Color bar orientation enum { COLORBAR_HORIZONTAL = 0, /// Color bar shown horizontally COLORBAR_VERTICAL = 0x00008000 /// Color bar shown vertically }; class FXImage; /** * A Color Bar is a widget which controls the brightness (value) of a * color by means of the hue, saturation, value specification system. * It is most useful when used together with the Color Wheel which controls * the hue and saturation. * The options COLORBAR_HORIZONTAL and COLORBAR_VERTICAL control the orientation * of the bar. */ class FXAPI FXColorBar : public FXFrame { FXDECLARE(FXColorBar) protected: FXImage *bar; // Intensity bar FXfloat hsv[3]; // Hue, saturation, value FXString tip; // Tooltip value FXString help; // Help value protected: FXColorBar(); void updatebar(); private: FXColorBar(const FXColorBar&); FXColorBar &operator=(const FXColorBar&); public: long onPaint(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: /// Construct color bar FXColorBar(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /// Change hue void setHue(FXfloat h); /// Return hue FXfloat getHue() const { return hsv[0]; } /// Change saturation void setSat(FXfloat s); /// Return saturation FXfloat getSat() const { return hsv[1]; } /// Change value void setVal(FXfloat v); /// Return value FXfloat getVal() const { return hsv[2]; } /// Change the color bar style FXuint getBarStyle() const; /// Get the color bar style void setBarStyle(FXuint style); /// Set status line help text for this color bar void setHelpText(const FXString& text){ help=text; } /// Get status line help text for this color bar const FXString& getHelpText() const { return help; } /// Set tool tip message for this color bar void setTipText(const FXString& text){ tip=text; } /// Get tool tip message for this color bar const FXString& getTipText() const { return tip; } /// Save color bar to a stream virtual void save(FXStream& store) const; /// Load color bar from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXColorBar(); }; } #endif fox1.6-1.6.57/include/FXColorDialog.h000066400000000000000000000067111326741342000170720ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r D i a l o g * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorDialog.h,v 1.20 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCOLORDIALOG_H #define FXCOLORDIALOG_H #ifndef FXDIALOGBOX_H #include "FXDialogBox.h" #endif namespace FX { class FXColorSelector; /** * The Color dialog is a standard dialog panel used to edit colors. * Colors can be edited via RGB (Red, Green, Blue additive color model), * via HSV (Hue, Saturation, Value color modal), via CMY (Cyan, Magenta, * Yellow subtractive color model), or by name. * Commonly used colors can be dragged into a number of small color wells * to be used repeatedly; colors dropped into the small color wells are * automatically saved into the registry for future use. */ class FXAPI FXColorDialog : public FXDialogBox { FXDECLARE(FXColorDialog) protected: FXColorSelector *colorbox; protected: FXColorDialog(){} private: FXColorDialog(const FXColorDialog&); FXColorDialog &operator=(const FXColorDialog&); public: long onChgColor(FXObject*,FXSelector,void*); long onCmdColor(FXObject*,FXSelector,void*); public: enum { ID_COLORSELECTOR=FXDialogBox::ID_LAST, ID_LAST }; public: /// Construct color dialog FXColorDialog(FXWindow* owner,const FXString& name,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Set the color void setRGBA(FXColor clr); /// Get the color FXColor getRGBA() const; /// Return true if only opaque colors allowed FXbool isOpaqueOnly() const; /// Change opaque only mode void setOpaqueOnly(FXbool forceopaque); /// Save dialog to a stream virtual void save(FXStream& store) const; /// Load dialog from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXColorDialog(); }; } #endif fox1.6-1.6.57/include/FXColorList.h000066400000000000000000000102571326741342000166060ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r L i s t W i d g e t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorList.h,v 1.4.2.1 2006/07/27 02:18:50 fox Exp $ * ********************************************************************************/ #ifndef FXCOLORLIST_H #define FXCOLORLIST_H #ifndef FXLIST_H #include "FXList.h" #endif namespace FX { /// Color item class FXAPI FXColorItem : public FXListItem { FXDECLARE(FXColorItem) protected: FXColor color; private: FXColorItem(const FXColorItem&); FXColorItem& operator=(const FXColorItem&); protected: FXColorItem():color(0){} virtual void draw(const FXList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h); virtual FXint hitItem(const FXList* list,FXint x,FXint y) const; public: /// Construct new item with given text, color, and user-data FXColorItem(const FXString& text,FXColor clr,void* ptr=NULL):FXListItem(text,NULL,ptr),color(clr){} /// Change item's color void setColor(FXColor clr){ color=clr; } /// Return item's color FXColor getColor() const { return color; } /// Return width of item as drawn in list virtual FXint getWidth(const FXList* list) const; /// Return height of item as drawn in list virtual FXint getHeight(const FXList* list) const; }; /** * A ColorList Widget displays a list of colors. */ class FXAPI FXColorList : public FXList { FXDECLARE(FXColorList) protected: FXColorList(){} virtual FXListItem *createItem(const FXString& text,FXIcon* icon,void* ptr); private: FXColorList(const FXColorList&); FXColorList &operator=(const FXColorList&); public: /// Construct a list with initially no items in it FXColorList(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=LIST_BROWSESELECT,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Fill list by appending color items from array of strings and array of colors FXint fillItems(const FXchar** strings,FXColor *colors=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Insert item at index with given text, color, and user-data pointer FXint insertItem(FXint index,const FXString& text,FXColor color=0,void* ptr=NULL,FXbool notify=FALSE); /// Append new item with given text, color, and user-data pointer FXint appendItem(const FXString& text,FXColor color=0,void* ptr=NULL,FXbool notify=FALSE); /// Prepend new item with given text, color, and user-data pointer FXint prependItem(const FXString& text,FXColor color=0,void* ptr=NULL,FXbool notify=FALSE); /// Change item color void setItemColor(FXint index,FXColor color); /// Return item color FXColor getItemColor(FXint index) const; }; } #endif fox1.6-1.6.57/include/FXColorRing.h000066400000000000000000000142611326741342000165710ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r R i n g W i d g e t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorRing.h,v 1.11 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCOLORRING_H #define FXCOLORRING_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { class FXImage; /** * A Color Ring widget provides an intuitive way to specify a color. * The outer ring of the widget is rotated to control the hue of the color * being specified, while the inner triangle varies the color saturation * and the brightness of the color. The color saturation axis of the * triangle goes from a fully saturated "pure" color to "pastel" color; * the brightness goes from black to a bright color. */ class FXAPI FXColorRing : public FXFrame { FXDECLARE(FXColorRing) protected: FXImage *dial; // HSV dial image FXfloat hsv[3]; // Hue, saturation, value FXint ringwidth; // Width of hue ring FXint ringouter; // Outer radius FXint ringinner; // Inner radius FXint dialx; // Dial x location FXint dialy; // Dial y location FXint satvalx; // Saturation value x FXint satvaly; // Saturation value y FXint huex; // Hue x FXint huey; // Hue y FXint clrx; // Color corner of triangle FXint clry; FXint blkx; // Black corner of triangle FXint blky; FXint whtx; // White corner of triangle FXint whty; FXString tip; // Tooltip value FXString help; // Help value FXuchar mode; // Mode widget is in protected: FXColorRing(); void updatering(); FXfloat hueFromXY(FXint x,FXint y) const; void hueToXY(FXint& x,FXint& y,FXfloat hue) const; void satValToXY(FXint& x,FXint& y,FXfloat s,FXfloat v) const; void satValFromXY(FXfloat& s,FXfloat& v,FXint x,FXint y) const; FXbool inCorner(FXint x,FXint y) const; FXbool inHueRing(FXint x,FXint y) const; FXbool inTriangle(FXint x,FXint y) const; protected: enum { MOUSE_NONE, // No mouse operation MOUSE_HUE, // Moving in hue-ring MOUSE_SATVAL // Moving in saturation/value triangle }; private: FXColorRing(const FXColorRing&); FXColorRing &operator=(const FXColorRing&); public: long onPaint(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: /// Construct color ring with initial color clr FXColorRing(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Change hue void setHue(FXfloat h); /// Return hue FXfloat getHue() const { return hsv[0]; } /// Change saturation void setSat(FXfloat s); /// Return saturation FXfloat getSat() const { return hsv[1]; } /// Change value void setVal(FXfloat v); /// Return value FXfloat getVal() const { return hsv[2]; } /// Set hue, saturation, value void setHueSatVal(FXfloat h,FXfloat s,FXfloat v); /// Change width of hue ring void setRingWidth(FXint rw); /// Return width of hue ring FXint getRingWidth() const { return ringwidth; } /// Set status line help text for this color well void setHelpText(const FXString& text){ help=text; } /// Get status line help text for this color well const FXString& getHelpText() const { return help; } /// Set tool tip message for this color well void setTipText(const FXString& text){ tip=text; } /// Get tool tip message for this color well const FXString& getTipText() const { return tip; } /// Save color well to a stream virtual void save(FXStream& store) const; /// Load color well from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXColorRing(); }; } #endif fox1.6-1.6.57/include/FXColorSelector.h000066400000000000000000000150551326741342000174540ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r S e l e c t o r * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorSelector.h,v 1.30 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCOLORSELECTOR_H #define FXCOLORSELECTOR_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { class FXTabBook; class FXColorBar; class FXColorWell; class FXColorWheel; class FXColorRing; class FXColorList; class FXList; class FXSlider; class FXTextField; class FXButton; class FXIcon; class FXLabel; /// Color selection widget class FXAPI FXColorSelector : public FXPacker { FXDECLARE(FXColorSelector) protected: FXTabBook *panels; // Color panes FXColorWell *well; // Main well FXColorList *list; // List of color names FXColorRing *wheel; // Color ring FXSlider *rgbaslider[4]; // RGBA sliders FXTextField *rgbatext[4]; // RGBA text fields FXSlider *hsvaslider[4]; // HSVA sliders FXTextField *hsvatext[4]; // HSVA text fields FXSlider *cmyslider[4]; // CMY sliders FXTextField *cmytext[4]; // CMY text fields FXColorWell *colorwells[24]; // Custom color wells FXIcon *eyedropicon; // Icon for eye dropper FXIcon *dialmodeicon; // Icon for dial mode FXIcon *rgbmodeicon; // Icon for RGB mode FXIcon *hsvmodeicon; // Icon for HSV mode FXIcon *cmymodeicon; // Icon for CMY mode FXIcon *txtmodeicon; // Icon for TEXT mode FXButton *accept; // Accept button FXButton *cancel; // Cancel button FXfloat rgba[4]; // Accurate RGBA color FXfloat hsva[4]; // Accurate HSVA color protected: static const FXchar* wellname[24]; // Well names protected: FXColorSelector(){} void updateWell(); private: FXColorSelector(const FXColorSelector&); FXColorSelector &operator=(const FXColorSelector&); public: long onCmdWell(FXObject*,FXSelector,void*); long onChgWell(FXObject*,FXSelector,void*); long onCmdRGBSlider(FXObject*,FXSelector,void*); long onUpdRGBSlider(FXObject*,FXSelector,void*); long onCmdRGBText(FXObject*,FXSelector,void*); long onUpdRGBText(FXObject*,FXSelector,void*); long onCmdHSVSlider(FXObject*,FXSelector,void*); long onUpdHSVSlider(FXObject*,FXSelector,void*); long onCmdHSVText(FXObject*,FXSelector,void*); long onUpdHSVText(FXObject*,FXSelector,void*); long onCmdCMYSlider(FXObject*,FXSelector,void*); long onUpdCMYSlider(FXObject*,FXSelector,void*); long onCmdCMYText(FXObject*,FXSelector,void*); long onUpdCMYText(FXObject*,FXSelector,void*); long onCmdList(FXObject*,FXSelector,void*); long onCmdCustomWell(FXObject*,FXSelector,void*); long onChgCustomWell(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdActivePane(FXObject*,FXSelector,void*); long onCmdAlphaSlider(FXObject*,FXSelector,void*); long onUpdAlphaSlider(FXObject*,FXSelector,void*); long onCmdAlphaText(FXObject*,FXSelector,void*); long onUpdAlphaText(FXObject*,FXSelector,void*); long onUpdAlphaLabel(FXObject*,FXSelector,void*); long onCmdWheel(FXObject*,FXSelector,void*); long onUpdWheel(FXObject*,FXSelector,void*); long onCmdColorPick(FXObject*,FXSelector,void*); public: enum { ID_CUSTOM_FIRST=FXPacker::ID_LAST, ID_CUSTOM_LAST=ID_CUSTOM_FIRST+24, ID_RGB_RED_SLIDER, ID_RGB_GREEN_SLIDER, ID_RGB_BLUE_SLIDER, ID_RGB_RED_TEXT, ID_RGB_GREEN_TEXT, ID_RGB_BLUE_TEXT, ID_HSV_HUE_SLIDER, ID_HSV_SATURATION_SLIDER, ID_HSV_VALUE_SLIDER, ID_HSV_HUE_TEXT, ID_HSV_SATURATION_TEXT, ID_HSV_VALUE_TEXT, ID_CMY_CYAN_SLIDER, ID_CMY_MAGENTA_SLIDER, ID_CMY_YELLOW_SLIDER, ID_CMY_CYAN_TEXT, ID_CMY_MAGENTA_TEXT, ID_CMY_YELLOW_TEXT, ID_DIAL_WHEEL, ID_COLOR_LIST, ID_WELL_CHANGED, ID_ACTIVEPANE, ID_ALPHA_SLIDER, ID_ALPHA_TEXT, ID_ALPHA_LABEL, ID_COLORPICK, ID_LAST }; public: /// Construct a new ColorSelector FXColorSelector(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create the ColorSelector virtual void create(); /// Return a pointer to the "Accept" button FXButton *acceptButton() const { return accept; } /// Return a pointer to the "Cancel" button FXButton *cancelButton() const { return cancel; } /// Set the selected color void setRGBA(FXColor clr); /// Get the selected color FXColor getRGBA() const; /// Return true if only opaque colors allowed FXbool isOpaqueOnly() const; /// Change opaque only mode void setOpaqueOnly(FXbool opaque); /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXColorSelector(); }; } #endif fox1.6-1.6.57/include/FXColorWell.h000066400000000000000000000153721326741342000166010ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r W e l l W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorWell.h,v 1.35 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCOLORWELL_H #define FXCOLORWELL_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { // Color Well Styles enum { COLORWELL_OPAQUEONLY = 0x00008000, /// Colors must be opaque COLORWELL_SOURCEONLY = 0x00010000, /// ColorWell is never a target COLORWELL_NORMAL = JUSTIFY_NORMAL }; /** * A color well is a widget which controls color settings. * Colors may be dragged and dropped from one color well to another. * A double-click inside a color well will bring up the standard * color dialog panel to edit the color well's color. * Colors may be also pasted by name using middle-mouse click into/out of * color wells from/to other selection-capable applications; for example, * you can highlight the word `red' and paste it into a color well. * While the color value is being changed, the color well sends a SEL_CHANGED * to its target; at the end of the change, it sends a SEL_COMMAND. * The message data represents the current color value, of the type FXColor. */ class FXAPI FXColorWell : public FXFrame { FXDECLARE(FXColorWell) protected: FXColor wellColor[2]; // Pixel value of RGBA over black and white FXColor rgba; // Color with RGB and Alpha FXString tip; // Tooltip value FXString help; // Help value protected: FXColorWell(); static FXColor rgbaoverblack(FXColor clr); static FXColor rgbaoverwhite(FXColor clr); private: FXColorWell(const FXColorWell&); FXColorWell &operator=(const FXColorWell&); public: long onPaint(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMiddleBtnPress(FXObject*,FXSelector,void*); long onMiddleBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onBeginDrag(FXObject*,FXSelector,void*); long onEndDrag(FXObject*,FXSelector,void*); long onDragged(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onDNDEnter(FXObject*,FXSelector,void*); long onDNDLeave(FXObject*,FXSelector,void*); long onDNDMotion(FXObject*,FXSelector,void*); long onDNDDrop(FXObject*,FXSelector,void*); long onDNDRequest(FXObject*,FXSelector,void*); long onSelectionLost(FXObject*,FXSelector,void*); long onSelectionGained(FXObject*,FXSelector,void*); long onSelectionRequest(FXObject*,FXSelector,void*); long onClicked(FXObject*,FXSelector,void*); long onDoubleClicked(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdColorWell(FXObject*,FXSelector,void*); long onChgColorWell(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: enum { ID_COLORDIALOG=FXFrame::ID_LAST, ID_LAST }; public: /// Construct color well with initial color clr FXColorWell(FXComposite* p,FXColor clr=0,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=COLORWELL_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Returns true because a color well can receive focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Set color void setRGBA(FXColor clr,FXbool notify=FALSE); /// Get color FXColor getRGBA() const { return rgba; } /// Set status line help text for this color well void setHelpText(const FXString& text){ help=text; } /// Get status line help text for this color well const FXString& getHelpText() const { return help; } /// Set tool tip message for this color well void setTipText(const FXString& text){ tip=text; } /// Get tool tip message for this color well const FXString& getTipText() const { return tip; } /// Return true if only opaque colors allowed FXbool isOpaqueOnly() const; /// Change opaque only mode void setOpaqueOnly(FXbool opaque); /// Save color well to a stream virtual void save(FXStream& store) const; /// Load color well from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXColorWell(); }; } #endif fox1.6-1.6.57/include/FXColorWheel.h000066400000000000000000000117521326741342000167400ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r W h e e l W i d g e t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorWheel.h,v 1.31 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCOLORWHEEL_H #define FXCOLORWHEEL_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { class FXImage; /** * A ColorWheel is a widget which controls the hue and saturation values of a * color. It is most often used together with a Color Bar which controls the * brighness. */ class FXAPI FXColorWheel : public FXFrame { FXDECLARE(FXColorWheel) protected: FXImage *dial; // HSV dial image FXfloat hsv[3]; // Hue, saturation, value FXint dialx; // Dial x location FXint dialy; // Dial Y location FXint spotx; // Spot x location FXint spoty; // Spot Y location FXString tip; // Tooltip value FXString help; // Help value protected: FXColorWheel(); void updatedial(); void movespot(FXint x,FXint y); FXbool hstoxy(FXint& x,FXint& y,FXfloat h,FXfloat s) const; FXbool xytohs(FXfloat& h,FXfloat& s,FXint x,FXint y) const; private: FXColorWheel(const FXColorWheel&); FXColorWheel &operator=(const FXColorWheel&); public: long onPaint(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: /// Construct color wheel with initial color clr FXColorWheel(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Change hue void setHue(FXfloat h); /// Return hue FXfloat getHue() const { return hsv[0]; } /// Change saturation void setSat(FXfloat s); /// Return saturation FXfloat getSat() const { return hsv[1]; } /// Change value void setVal(FXfloat v); /// Return value FXfloat getVal() const { return hsv[2]; } /// Set hue, saturation, value void setHueSatVal(FXfloat h,FXfloat s,FXfloat v); /// Set status line help text for this color well void setHelpText(const FXString& text){ help=text; } /// Get status line help text for this color well const FXString& getHelpText() const { return help; } /// Set tool tip message for this color well void setTipText(const FXString& text){ tip=text; } /// Get tool tip message for this color well const FXString& getTipText() const { return tip; } /// Save color well to a stream virtual void save(FXStream& store) const; /// Load color well from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXColorWheel(); }; } #endif fox1.6-1.6.57/include/FXComboBox.h000066400000000000000000000241771326741342000164120ustar00rootroot00000000000000/******************************************************************************** * * * C o m b o B o x W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXComboBox.h,v 1.46 2006/01/27 02:07:44 fox Exp $ * ********************************************************************************/ #ifndef FXCOMBOBOX_H #define FXCOMBOBOX_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { /// ComboBox styles enum { COMBOBOX_NO_REPLACE = 0, /// Leave the list the same COMBOBOX_REPLACE = 0x00020000, /// Replace current item with typed text COMBOBOX_INSERT_BEFORE = 0x00040000, /// Typed text inserted before current COMBOBOX_INSERT_AFTER = 0x00060000, /// Typed text inserted after current COMBOBOX_INSERT_FIRST = 0x00080000, /// Typed text inserted at begin of list COMBOBOX_INSERT_LAST = 0x000A0000, /// Typed text inserted at end of list COMBOBOX_STATIC = 0x00100000, /// Unchangable text box COMBOBOX_NORMAL = 0 /// Can type text but list is not changed }; class FXTextField; class FXMenuButton; class FXList; class FXPopup; /** * A Combo Box provides a way to select a string from a list of strings. * Unless COMBOBOX_STATIC is passed, it also allows the user to enter a new * string into the text field, for example if the desired entry is not in the * list of strings. Passing COMBOBOX_REPLACE, COMBOBOX_INSERT_BEFORE, COMBOBOX_INSERT_AFTER, * COMBOBOX_INSERT_FIRST, or COMBOBOX_INSERT_LAST causes a newly entered text to replace the * current one in the list, or be added before or after the current entry, or to be added at * the beginning or end of the list. * Combo Box is intended to enter text; if you need to enter a choice from a list of * options, it is recommended that the List Box widget is used instead. * When the text in the field is changed, a SEL_COMMAND will be send to the target. * The Combo Box can also receive ID_GETSTRINGVALUE and ID_SETSTRINGVALUE and so * on, which will behave similar to Text Field in that they will retrieve or update * the value of the field. */ class FXAPI FXComboBox : public FXPacker { FXDECLARE(FXComboBox) protected: FXTextField *field; FXMenuButton *button; FXList *list; FXPopup *pane; protected: FXComboBox(){} private: FXComboBox(const FXComboBox&); FXComboBox &operator=(const FXComboBox&); public: long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusSelf(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onTextButton(FXObject*,FXSelector,void*); long onTextChanged(FXObject*,FXSelector,void*); long onTextCommand(FXObject*,FXSelector,void*); long onListClicked(FXObject*,FXSelector,void*); long onFwdToText(FXObject*,FXSelector,void*); long onUpdFmText(FXObject*,FXSelector,void*); public: enum { ID_LIST=FXPacker::ID_LAST, ID_TEXT, ID_LAST }; public: /// Construct a Combo Box widget with room to display cols columns of text FXComboBox(FXComposite *p,FXint cols,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=COMBOBOX_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Enable combo box virtual void enable(); /// Disable combo box virtual void disable(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /// Return true if combobox is editable FXbool isEditable() const; /// Set editable state void setEditable(FXbool edit=TRUE); /// Set the text void setText(const FXString& text); /// Get the text FXString getText() const; /// Set the number of columns void setNumColumns(FXint cols); /// Get the number of columns FXint getNumColumns() const; /// Change text justification mode; default is JUSTIFY_LEFT void setJustify(FXuint mode); /// Return text justification mode FXuint getJustify() const; /// Return the number of items in the list FXint getNumItems() const; /// Return the number of visible items FXint getNumVisible() const; /// Set the number of visible items in the drop down list void setNumVisible(FXint nvis); /// Return true if current item FXbool isItemCurrent(FXint index) const; /// Set the current item (index is zero-based) void setCurrentItem(FXint index,FXbool notify=FALSE); /// Get the current item's index FXint getCurrentItem() const; /// Return the item at the given index FXString getItem(FXint index) const; /// Replace the item at index FXint setItem(FXint index,const FXString& text,void* ptr=NULL); /// Fill combo box by appending items from array of strings FXint fillItems(const FXchar** strings); /// Fill combo box by appending items from newline separated strings FXint fillItems(const FXString& strings); /// Insert a new item at index FXint insertItem(FXint index,const FXString& text,void* ptr=NULL); /// Append an item to the list FXint appendItem(const FXString& text,void* ptr=NULL); /// Prepend an item to the list FXint prependItem(const FXString& text,void* ptr=NULL); /// Move item from oldindex to newindex FXint moveItem(FXint newindex,FXint oldindex); /// Remove this item from the list void removeItem(FXint index); /// Remove all items from the list void clearItems(); /** * Search items by name, beginning from item start. If the start item * is -1 the search will start at the first item in the list. Flags * may be SEARCH_FORWARD or SEARCH_BACKWARD to control the search * direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. * The option SEARCH_IGNORECASE causes a case-insensitive match. Finally, * passing SEARCH_PREFIX causes searching for a prefix of the item name. * Return -1 if no matching item is found. */ FXint findItem(const FXString& text,FXint start=-1,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /** * Search items by associated user data, beginning from item start. If the * start item is -1 the search will start at the first item in the list. * Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control the * search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. */ FXint findItemByData(const void *ptr,FXint start=-1,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /// Set text for specified item void setItemText(FXint index,const FXString& text); /// Get text for specified item FXString getItemText(FXint index) const; /// Set data pointer for specified item void setItemData(FXint index,void* ptr) const; /// Get data pointer for specified item void* getItemData(FXint index) const; /// Is the pane shown FXbool isPaneShown() const; /// Sort items using current sort function void sortItems(); /// Set text font void setFont(FXFont* fnt); /// Get text font FXFont* getFont() const; /// Set the combobox style. void setComboStyle(FXuint mode); /// Get the combobox style. FXuint getComboStyle() const; /// Set window background color virtual void setBackColor(FXColor clr); /// Get background color FXColor getBackColor() const; /// Change text color void setTextColor(FXColor clr); /// Return text color FXColor getTextColor() const; /// Change selected background color void setSelBackColor(FXColor clr); /// Return selected background color FXColor getSelBackColor() const; /// Change selected text color void setSelTextColor(FXColor clr); /// Return selected text color FXColor getSelTextColor() const; /// Return sort function FXListSortFunc getSortFunc() const; /// Change sort function void setSortFunc(FXListSortFunc func); /// Set the combobox help text void setHelpText(const FXString& txt); /// Get the combobox help text const FXString& getHelpText() const; /// Set the tool tip message for this combobox void setTipText(const FXString& txt); /// Get the tool tip message for this combobox const FXString& getTipText() const; /// Save combobox to a stream virtual void save(FXStream& store) const; /// Load combobox from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXComboBox(); }; } #endif fox1.6-1.6.57/include/FXComposeContext.h000066400000000000000000000066541326741342000176540ustar00rootroot00000000000000/******************************************************************************** * * * C o m p o s e - C o n t e x t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXComposeContext.h,v 1.8 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCOMPOSECONTEXT_H #define FXCOMPOSECONTEXT_H #ifndef FXID_H #include "FXId.h" #endif namespace FX { class FXApp; class FXWindow; /** * Compose Context manages the state of an input method * if input method support is enabled. */ class FXAPI FXComposeContext : public FXId { FXDECLARE(FXComposeContext) protected: FXWindow *window; // Window we belong to FXSelector message; // Message to send it private: #ifndef WIN32 static int editStartCallback(void*,FXComposeContext*,void*); static void editDoneCallback(void*,FXComposeContext*,void*); static void editDrawCallback(void*,FXComposeContext*,void*); static void editCaretCallback(void*,FXComposeContext*,void*); static void statusStartCallback(void*,FXComposeContext*,void*); static void statusDoneCallback(void*,FXComposeContext*,void*); static void statusDrawCallback(void*,FXComposeContext*,void*); #endif protected: FXComposeContext(); private: FXComposeContext(const FXComposeContext&); FXComposeContext &operator=(const FXComposeContext&); public: /// Construct compose context for given window FXComposeContext(FXApp* a,FXWindow* win=NULL,FXSelector sel=0); /// Create resource virtual void create(); /// Destroy resource virtual void destroy(); /// Focus in void focusIn(); /// Focus out void focusOut(); /// Set the spot void setSpot(FXint x,FXint y); /// Set the area void setArea(FXint x,FXint y,FXint w,FXint h); /// Translate key event FXString translateEvent(FXRawEvent& event); /// Destructor virtual ~FXComposeContext(); }; } #endif fox1.6-1.6.57/include/FXComposite.h000066400000000000000000000064431326741342000166400ustar00rootroot00000000000000/******************************************************************************** * * * C o m p o s i t e W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXComposite.h,v 1.24 2006/01/22 17:57:59 fox Exp $ * ********************************************************************************/ #ifndef FXCOMPOSITE_H #define FXCOMPOSITE_H #ifndef FXWINDOW_H #include "FXWindow.h" #endif namespace FX { /// Base composite class FXAPI FXComposite : public FXWindow { FXDECLARE(FXComposite) protected: FXComposite(){} FXComposite(FXApp* a,FXVisual *vis); FXComposite(FXApp* a,FXWindow* own,FXuint opts,FXint x,FXint y,FXint w,FXint h); private: FXComposite(const FXComposite&); FXComposite &operator=(const FXComposite&); public: long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onFocusNext(FXObject*,FXSelector,void*); long onFocusPrev(FXObject*,FXSelector,void*); long onCmdUpdate(FXObject*,FXSelector,void*); public: /// Constructor FXComposite(FXComposite* p,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Return the width of the widest child window FXint maxChildWidth() const; /// Return the height of the tallest child window FXint maxChildHeight() const; /// Overrides this virtual function to return TRUE virtual bool isComposite() const; /// Destructor virtual ~FXComposite(); }; } #endif fox1.6-1.6.57/include/FXCursor.h000066400000000000000000000110661326741342000161500ustar00rootroot00000000000000/******************************************************************************** * * * C u r s o r - O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXCursor.h,v 1.28 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXCURSOR_H #define FXCURSOR_H #ifndef FXID_H #include "FXId.h" #endif namespace FX { // Stock cursors enum FXStockCursor { CURSOR_ARROW=1, /// Default left pointing arrow CURSOR_RARROW, /// Right arrow CURSOR_IBEAM, /// Text I-Beam CURSOR_WATCH, /// Stopwatch or hourglass CURSOR_CROSS, /// Crosshair CURSOR_UPDOWN, /// Move up, down CURSOR_LEFTRIGHT, /// Move left, right CURSOR_MOVE /// Move up,down,left,right }; /// Cursor options enum { CURSOR_KEEP = 0x00000100, /// Keep pixel data in client CURSOR_OWNED = 0x00000200 /// Pixel data is owned by image }; /// Cursor class class FXAPI FXCursor : public FXId { FXDECLARE(FXCursor) protected: FXColor *data; // Source data FXint width; // Width FXint height; // Height FXint hotx; // Hot spot x FXint hoty; // Hot spot y FXuint options; // Options protected: FXCursor(); private: FXCursor(const FXCursor&); FXCursor &operator=(const FXCursor&); public: /// Make stock cursor FXCursor(FXApp* a,FXStockCursor curid=CURSOR_ARROW); /// Make cursor from source and mask; cursor size should at most 32x32 for portability! FXCursor(FXApp* a,const FXuchar* src,const FXuchar* msk,FXint w=32,FXint h=32,FXint hx=0,FXint hy=0); /// Make cursor from FXColor pixels; cursor size should be at most 32x32 for portability! FXCursor(FXApp* a,const FXColor* pix,FXint w=32,FXint h=32,FXint hx=0,FXint hy=0); /// Width of cursor; returns 0 for stock cursors FXint getWidth() const { return width; } /// Height of cursor; returns 0 for stock cursors FXint getHeight() const { return height; } /// Set hotspot x; returns 0 for stock cursors void setHotX(FXint x){ hotx=x; } /// Get hotspot x; returns 0 for stock cursors FXint getHotX() const { return hotx; } /// Set hotspot y; returns 0 for stock cursors void setHotY(FXint y){ hoty=y; } /// Get hotspot y; returns 0 for stock cursors FXint getHotY() const { return hoty; } /// Check if there is color in the cursor bool isColor() const; /// Create cursor virtual void create(); /// Detach cursor virtual void detach(); /// Destroy cursor virtual void destroy(); /// Release pixels buffer if it was owned virtual void release(); /// Save pixel data only virtual bool savePixels(FXStream& store) const; /// Load pixel data only virtual bool loadPixels(FXStream& store); /// Save cursor to a stream virtual void save(FXStream& store) const; /// Load cursor from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXCursor(); }; } #endif fox1.6-1.6.57/include/FXDC.h000066400000000000000000000351241326741342000151620ustar00rootroot00000000000000/******************************************************************************** * * * D e v i c e C o n t e x t B a s e C l a s s * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDC.h,v 1.37 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDC_H #define FXDC_H namespace FX { /// Drawing (BITBLT) functions enum FXFunction { BLT_CLR, /// D := 0 BLT_SRC_AND_DST, /// D := S & D BLT_SRC_AND_NOT_DST, /// D := S & ~D BLT_SRC, /// D := S BLT_NOT_SRC_AND_DST, /// D := ~S & D BLT_DST, /// D := D BLT_SRC_XOR_DST, /// D := S ^ D BLT_SRC_OR_DST, /// D := S | D BLT_NOT_SRC_AND_NOT_DST, /// D := ~S & ~D == D := ~(S | D) BLT_NOT_SRC_XOR_DST, /// D := ~S ^ D BLT_NOT_DST, /// D := ~D BLT_SRC_OR_NOT_DST, /// D := S | ~D BLT_NOT_SRC, /// D := ~S BLT_NOT_SRC_OR_DST, /// D := ~S | D BLT_NOT_SRC_OR_NOT_DST, /// D := ~S | ~D == ~(S & D) BLT_SET /// D := 1 }; /// Line Styles enum FXLineStyle { LINE_SOLID, /// Solid lines LINE_ONOFF_DASH, /// On-off dashed lines LINE_DOUBLE_DASH /// Double dashed lines }; /// Line Cap Styles enum FXCapStyle { CAP_NOT_LAST, /// Don't include last end cap CAP_BUTT, /// Butting line end caps CAP_ROUND, /// Round line end caps CAP_PROJECTING /// Projecting line end caps }; /// Line Join Styles enum FXJoinStyle { JOIN_MITER, /// Mitered or pointy joints JOIN_ROUND, /// Round line joints JOIN_BEVEL /// Beveled or flat joints }; /// Fill Styles enum FXFillStyle { FILL_SOLID, /// Fill with solid color FILL_TILED, /// Fill with tiled bitmap FILL_STIPPLED, /// Fill where stipple mask is 1 FILL_OPAQUESTIPPLED /// Fill with foreground where mask is 1, background otherwise }; /// Fill Rules enum FXFillRule { RULE_EVEN_ODD, /// Even odd polygon filling RULE_WINDING /// Winding rule polygon filling }; /// Stipple/dither patterns enum FXStipplePattern { STIPPLE_0 = 0, STIPPLE_NONE = 0, STIPPLE_BLACK = 0, /// All ones STIPPLE_1 = 1, STIPPLE_2 = 2, STIPPLE_3 = 3, STIPPLE_4 = 4, STIPPLE_5 = 5, STIPPLE_6 = 6, STIPPLE_7 = 7, STIPPLE_8 = 8, STIPPLE_GRAY = 8, /// 50% gray STIPPLE_9 = 9, STIPPLE_10 = 10, STIPPLE_11 = 11, STIPPLE_12 = 12, STIPPLE_13 = 13, STIPPLE_14 = 14, STIPPLE_15 = 15, STIPPLE_16 = 16, STIPPLE_WHITE = 16, /// All zeroes STIPPLE_HORZ = 17, /// Horizontal hatch pattern STIPPLE_VERT = 18, /// Vertical hatch pattern STIPPLE_CROSS = 19, /// Cross-hatch pattern STIPPLE_DIAG = 20, /// Diagonal // hatch pattern STIPPLE_REVDIAG = 21, /// Reverse diagonal \\ hatch pattern STIPPLE_CROSSDIAG = 22 /// Cross-diagonal hatch pattern }; /// Line segment struct FXSegment { FXshort x1,y1,x2,y2; }; /// Arc struct FXArc { FXshort x,y,w,h,a,b; }; class FXApp; class FXImage; class FXBitmap; class FXIcon; class FXFont; class FXDrawable; class FXRegion; /** * Abstract Device Context * * A Device Context is used to maintain the state of the graphics drawing system. * Defining your drawing code in terms of the Abstract Device Context allows the * drawing commands to be rendered on different types of surfaces, such as windows * and images (FXDCWindow), or on paper (FXDCPrint). * WYSYWYG may be obtained by using the same identical drawing code in your * application regardless of the actual device surface being utilized. */ class FXAPI FXDC { friend class FXFont; private: FXApp *app; // Application protected: void *ctx; // Context handle FXFont *font; // Drawing font FXStipplePattern pattern; // Stipple pattern FXBitmap *stipple; // Stipple bitmap FXImage *tile; // Tile image FXBitmap *mask; // Mask bitmap FXRectangle clip; // Clip rectangle FXColor fg; // Foreground color FXColor bg; // Background color FXuint width; // Line width FXCapStyle cap; // Line cap style FXJoinStyle join; // Line join style FXLineStyle style; // Line style FXFillStyle fill; // Fill style FXFillRule rule; // Fill rule FXFunction rop; // RasterOp FXchar dashpat[32]; // Line dash pattern data FXuint dashlen; // Line dash pattern length FXuint dashoff; // Line dash pattern offset FXint tx; // Tile dx FXint ty; // Tile dy FXint cx; // Clip x FXint cy; // Clip y private: FXDC(); FXDC(const FXDC&); FXDC &operator=(const FXDC&); public: /// Construct dummy DC FXDC(FXApp* a); /// Get application FXApp* getApp() const { return app; } /// Get context handle void* context() const { return ctx; } /// Read back pixel virtual FXColor readPixel(FXint x,FXint y); /// Draw points virtual void drawPoint(FXint x,FXint y); virtual void drawPoints(const FXPoint* points,FXuint npoints); virtual void drawPointsRel(const FXPoint* points,FXuint npoints); /// Draw lines virtual void drawLine(FXint x1,FXint y1,FXint x2,FXint y2); virtual void drawLines(const FXPoint* points,FXuint npoints); virtual void drawLinesRel(const FXPoint* points,FXuint npoints); virtual void drawLineSegments(const FXSegment* segments,FXuint nsegments); /// Draw rectangles virtual void drawRectangle(FXint x,FXint y,FXint w,FXint h); virtual void drawRectangles(const FXRectangle* rectangles,FXuint nrectangles); /// Draw rounded rectangle with ellipse with ew and ellips height eh virtual void drawRoundRectangle(FXint x,FXint y,FXint w,FXint h,FXint ew,FXint eh); /** * Draw arcs. * The argument ang1 specifies the start of the arc relative to the * three-o'clock position from the center, in units of degrees*64. * The argument ang2 specifies the path and extent of the arc relative * to the start of the arc, in units of degrees*64. * The arguments x,y,w,h specify the bounding rectangle. */ virtual void drawArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2); virtual void drawArcs(const FXArc* arcs,FXuint narcs); /// Draw ellipse virtual void drawEllipse(FXint x,FXint y,FXint w,FXint h); /// Filled rectangles virtual void fillRectangle(FXint x,FXint y,FXint w,FXint h); virtual void fillRectangles(const FXRectangle* rectangles,FXuint nrectangles); /// Filled rounded rectangle with ellipse with ew and ellips height eh virtual void fillRoundRectangle(FXint x,FXint y,FXint w,FXint h,FXint ew,FXint eh); /// Fill chord virtual void fillChord(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2); virtual void fillChords(const FXArc* chords,FXuint nchords); /// Fill arcs virtual void fillArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2); virtual void fillArcs(const FXArc* arcs,FXuint narcs); /// Fill ellipse virtual void fillEllipse(FXint x,FXint y,FXint w,FXint h); /// Filled polygon virtual void fillPolygon(const FXPoint* points,FXuint npoints); virtual void fillConcavePolygon(const FXPoint* points,FXuint npoints); virtual void fillComplexPolygon(const FXPoint* points,FXuint npoints); /// Filled polygon with relative points virtual void fillPolygonRel(const FXPoint* points,FXuint npoints); virtual void fillConcavePolygonRel(const FXPoint* points,FXuint npoints); virtual void fillComplexPolygonRel(const FXPoint* points,FXuint npoints); /// Draw hashed box virtual void drawHashBox(FXint x,FXint y,FXint w,FXint h,FXint b=1); /// Draw focus rectangle virtual void drawFocusRectangle(FXint x,FXint y,FXint w,FXint h); /// Draw area from source virtual void drawArea(const FXDrawable* source,FXint sx,FXint sy,FXint sw,FXint sh,FXint dx,FXint dy); /// Draw area stretched area from source virtual void drawArea(const FXDrawable* source,FXint sx,FXint sy,FXint sw,FXint sh,FXint dx,FXint dy,FXint dw,FXint dh); /// Draw image virtual void drawImage(const FXImage* image,FXint dx,FXint dy); /// Draw bitmap virtual void drawBitmap(const FXBitmap* bitmap,FXint dx,FXint dy); /// Draw icon virtual void drawIcon(const FXIcon* icon,FXint dx,FXint dy); virtual void drawIconShaded(const FXIcon* icon,FXint dx,FXint dy); virtual void drawIconSunken(const FXIcon* icon,FXint dx,FXint dy); /// Draw string with base line starting at x, y virtual void drawText(FXint x,FXint y,const FXString& string); virtual void drawText(FXint x,FXint y,const FXchar* string,FXuint length); /// Draw text starting at x, y over filled background virtual void drawImageText(FXint x,FXint y,const FXString& string); virtual void drawImageText(FXint x,FXint y,const FXchar* string,FXuint length); /// Set foreground drawing color virtual void setForeground(FXColor clr); /// Get foreground drawing color FXColor getForeground() const { return fg; } /// Set background drawing color virtual void setBackground(FXColor clr); /// Get background drawing color FXColor getBackground() const { return bg; } /** * Set dash pattern and dash offset. * A dash pattern of [1 2 3 4] is a repeating pattern of 1 foreground pixel, * 2 background pixels, 3 foreground pixels, and 4 background pixels. * The offset is where in the pattern the system will start counting. * The maximum length of the dash pattern is 32. */ virtual void setDashes(FXuint dashoffset,const FXchar *dashpattern,FXuint dashlength); /// Get dash pattern const FXchar* getDashPattern() const { return dashpat; } /// Get dash offset FXuint getDashOffset() const { return dashoff; } /// Get dash length FXuint getDashLength() const { return dashlen; } /// Set line width:- 0 means thinnest/fastest possible virtual void setLineWidth(FXuint linewidth=0); /// Get line width FXuint getLineWidth() const { return width; } /// Set line cap style virtual void setLineCap(FXCapStyle capstyle=CAP_BUTT); /// Get line cap style FXCapStyle getLineCap() const { return cap; } /// Set line join style virtual void setLineJoin(FXJoinStyle joinstyle=JOIN_MITER); /// Get line join style FXJoinStyle getLineJoin() const { return join; } /// Set line style virtual void setLineStyle(FXLineStyle linestyle=LINE_SOLID); /// Get line style FXLineStyle getLineStyle() const { return style; } /// Set fill style virtual void setFillStyle(FXFillStyle fillstyle=FILL_SOLID); /// Get fill style FXFillStyle getFillStyle() const { return fill; } /// Set fill rule virtual void setFillRule(FXFillRule fillrule=RULE_EVEN_ODD); /// Get fill rule FXFillRule getFillRule() const { return rule; } /// Set rasterop function virtual void setFunction(FXFunction func=BLT_SRC); /// Get rasterop function FXFunction getFunction() const { return rop; } /// Set the tile image virtual void setTile(FXImage* image,FXint dx=0,FXint dy=0); /// Get the tile image FXImage *getTile() const { return tile; } /// Set the stipple pattern virtual void setStipple(FXBitmap *bitmap,FXint dx=0,FXint dy=0); /// Get stipple bitmap FXBitmap *getStippleBitmap() const { return stipple; } /// Set the stipple pattern virtual void setStipple(FXStipplePattern pat,FXint dx=0,FXint dy=0); /// Get pattern FXStipplePattern getStipplePattern() const { return pattern; } /// Set clip region virtual void setClipRegion(const FXRegion& region); /// Set clip rectangle virtual void setClipRectangle(FXint x,FXint y,FXint w,FXint h); /// Change clip rectangle virtual void setClipRectangle(const FXRectangle& rectangle); /// Return clip rectangle const FXRectangle& getClipRectangle() const { return clip; } /// Return clip x FXint getClipX() const { return clip.x; } /// Return clip y FXint getClipY() const { return clip.y; } /// Return clip width FXint getClipWidth() const { return clip.w; } /// Return clip height FXint getClipHeight() const { return clip.h; } /// Clear clipping virtual void clearClipRectangle(); /// Set clip mask virtual void setClipMask(FXBitmap* bitmap,FXint dx=0,FXint dy=0); /// Clear clip mask virtual void clearClipMask(); /// Set font to draw text with virtual void setFont(FXFont *fnt); /// Get text font FXFont* getFont() const { return font; } /// Clip against child windows virtual void clipChildren(FXbool yes); /// Destructor virtual ~FXDC(); }; } #endif fox1.6-1.6.57/include/FXDCPrint.h000066400000000000000000000257211326741342000162010ustar00rootroot00000000000000/******************************************************************************** * * * D e v i c e C o n t e x t F o r P r i n t i n g * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDCPrint.h,v 1.30 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDCPRINT_H #define FXDCPRINT_H #ifndef FXDC_H #include "FXDC.h" #endif ////////////////////////////// UNDER DEVELOPMENT ////////////////////////////// namespace FX { class FXApp; class FXDrawable; class FXImage; class FXBitmap; class FXIcon; class FXFont; /// Printer flags enum FXPrintFlags { PRINT_DEST_PAPER = 0, /// Send print to paper PRINT_DEST_FILE = 1, /// Send print to file PRINT_PAGES_ALL = 0, /// Print all pages PRINT_PAGES_EVEN = 2, /// Print even pages only PRINT_PAGES_ODD = 4, /// Print odd pages only PRINT_PAGES_RANGE = 8, /// Print range of pages PRINT_COLLATE_NORMAL = 0, /// Normal collate order PRINT_COLLATE_REVERSED = 16, /// Reversed collate order PRINT_PORTRAIT = 0, /// Portrait orientation PRINT_LANDSCAPE = 32, /// Landscape orientation PRINT_BLACKANDWHITE = 0, /// Black and white output PRINT_COLOR = 64, /// Color output PRINT_NOBOUNDS = 128 /// Must determine bounding box }; /// Printer media size enum FXMediaSize { MEDIA_CUSTOM = 0, /// Custom paper size MEDIA_USLETTER = 1, /// US Letter size MEDIA_LEGAL = 2, /// US Legal size MEDIA_A4 = 3, /// A4 MEDIA_ENVELOPE = 4 /// #10 Envelope }; /// Bounding box struct FXPSBounds { FXdouble xmin; FXdouble xmax; FXdouble ymin; FXdouble ymax; }; /// Describes printer struct FXAPI FXPrinter { FXString name; /// Printer name FXuint firstpage; /// First page that can be printed FXuint lastpage; /// Last page that can be printed FXuint currentpage; /// Current page to print FXuint frompage; /// On output, this is the first page to print FXuint topage; /// On output, last page to print FXuint mediasize; /// Media size index FXdouble mediawidth; /// Width of paper in points [1/72 of an inch] FXdouble mediaheight; /// Height of paper in points FXdouble leftmargin; /// Left margin FXdouble rightmargin; /// Right margin FXdouble topmargin; /// Top margin FXdouble bottommargin; /// Bottom margin FXuint numcopies; /// Number of copies FXuint flags; /// Flags }; /// Postscript Printer Device Context class FXAPI FXDCPrint : public FXDC { // friend class FXGLViewer; // This is TEMPORARY!!! protected: void *psout; // File Stream for PS output FXFont *font; FXuint flags; FXint Xr,Yr; FXdouble mediawidth; // Media width FXdouble mediaheight; // Media height FXPSBounds mediabb; // Media bounding box FXPSBounds docbb; // Document bounding box FXPSBounds pagebb; // Page bounding box FXint pagecount; // Number of pages printed FXint nchars; // Number of characters on a line FXint pxmin; // min X coord in content FXint pymin; // min Y coord in content FXint pxmax; // max X coord in content FXint pymax; // max Y coord in content protected: void bbox(FXfloat x,FXfloat y); void tfm(FXfloat& xo,FXfloat& yo,FXfloat xi,FXfloat yi); private: FXDCPrint(); FXDCPrint(const FXDCPrint&); FXDCPrint &operator=(const FXDCPrint&); public: /// Construct FXDCPrint(FXApp* a); /// Generate print job prolog FXbool beginPrint(FXPrinter& job); /// Generate print job epilog FXbool endPrint(); /// Generate begin of page FXbool beginPage(FXuint page=1); /// Generate end of page FXbool endPage(); FXbool setContentRange(FXint pxmin, FXint pymin, FXint pxmax, FXint pymax); /// Draw points virtual void drawPoint(FXint x,FXint y); virtual void drawPoints(const FXPoint* points,FXuint npoints); virtual void drawPointsRel(const FXPoint* points,FXuint npoints); /// Draw lines virtual void drawLine(FXint x1,FXint y1,FXint x2,FXint y2); virtual void drawLines(const FXPoint* points,FXuint npoints); virtual void drawLinesRel(const FXPoint* points,FXuint npoints); virtual void drawLineSegments(const FXSegment* segments,FXuint nsegments); /// Draw rectangles virtual void drawRectangle(FXint x,FXint y,FXint w,FXint h); virtual void drawRectangles(const FXRectangle* rectangles,FXuint nrectangles); /// Draw rounded rectangle with ellipse with ew and ellips height eh virtual void drawRoundRectangle(FXint x,FXint y,FXint w,FXint h,FXint ew,FXint eh); /// Draw arcs virtual void drawArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2); virtual void drawArcs(const FXArc* arcs,FXuint narcs); /// Draw ellipse virtual void drawEllipse(FXint x,FXint y,FXint w,FXint h); /// Filled rectangles virtual void fillRectangle(FXint x,FXint y,FXint w,FXint h); virtual void fillRectangles(const FXRectangle* rectangles,FXuint nrectangles); /// Filled rounded rectangle with ellipse with ew and ellips height eh virtual void fillRoundRectangle(FXint x,FXint y,FXint w,FXint h,FXint ew,FXint eh); /// Fill chord virtual void fillChord(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2); virtual void fillChords(const FXArc* chords,FXuint nchords); /// Draw arcs virtual void fillArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2); virtual void fillArcs(const FXArc* arcs,FXuint narcs); /// Fill ellipse virtual void fillEllipse(FXint x,FXint y,FXint w,FXint h); /// Filled polygon virtual void fillPolygon(const FXPoint* points,FXuint npoints); virtual void fillConcavePolygon(const FXPoint* points,FXuint npoints); virtual void fillComplexPolygon(const FXPoint* points,FXuint npoints); /// Filled polygon with relative points virtual void fillPolygonRel(const FXPoint* points,FXuint npoints); virtual void fillConcavePolygonRel(const FXPoint* points,FXuint npoints); virtual void fillComplexPolygonRel(const FXPoint* points,FXuint npoints); /// Draw hashed box virtual void drawHashBox(FXint x,FXint y,FXint w,FXint h,FXint b=1); /// Draw area from source virtual void drawArea(const FXDrawable* source,FXint sx,FXint sy,FXint sw,FXint sh,FXint dx,FXint dy); /// Draw area stretched area from source virtual void drawArea(const FXDrawable* source,FXint sx,FXint sy,FXint sw,FXint sh,FXint dx,FXint dy,FXint dw,FXint dh); /// Draw image virtual void drawImage(const FXImage* image,FXint dx,FXint dy); /// Draw bitmap virtual void drawBitmap(const FXBitmap* bitmap,FXint dx,FXint dy); /// Draw icon virtual void drawIcon(const FXIcon* icon,FXint dx,FXint dy); virtual void drawIconShaded(const FXIcon* icon,FXint dx,FXint dy); virtual void drawIconSunken(const FXIcon* icon,FXint dx,FXint dy); /// Draw string with base line starting at x, y virtual void drawText(FXint x,FXint y,const FXString& string); virtual void drawText(FXint x,FXint y,const FXchar* string,FXuint length); /// Draw text starting at x, y over filled background virtual void drawImageText(FXint x,FXint y,const FXString& string); virtual void drawImageText(FXint x,FXint y,const FXchar* string,FXuint length); /// Set foreground/background drawing color virtual void setForeground(FXColor clr); virtual void setBackground(FXColor clr); /// Set dash pattern virtual void setDashes(FXuint dashoffset,const FXchar *dashlist,FXuint n); /// Set line width virtual void setLineWidth(FXuint linewidth=0); /// Set line cap style virtual void setLineCap(FXCapStyle capstyle=CAP_BUTT); /// Set line join style virtual void setLineJoin(FXJoinStyle joinstyle=JOIN_MITER); /// Set line style virtual void setLineStyle(FXLineStyle linestyle=LINE_SOLID); /// Set fill style virtual void setFillStyle(FXFillStyle fillstyle=FILL_SOLID); /// Set fill rule virtual void setFillRule(FXFillRule fillrule=RULE_EVEN_ODD); /// Set blit function virtual void setFunction(FXFunction func=BLT_SRC); /// Set the tile virtual void setTile(FXImage* tile,FXint dx=0,FXint dy=0); /// Set the stipple pattern virtual void setStipple(FXBitmap *stipple,FXint dx=0,FXint dy=0); /// Set the stipple pattern virtual void setStipple(FXStipplePattern stipple,FXint dx=0,FXint dy=0); /// Set clip rectangle virtual void setClipRectangle(FXint x,FXint y,FXint w,FXint h); /// Set clip rectangle virtual void setClipRectangle(const FXRectangle& rectangle); /// Clear clipping virtual void clearClipRectangle(); /// Set clip mask virtual void setClipMask(FXBitmap* mask,FXint dx=0,FXint dy=0); /// Clear clip mask virtual void clearClipMask(); /// Set font to draw text with virtual void setFont(FXFont *fnt); /// Clip drawing by child windows virtual void clipChildren(FXbool yes); /// Temporarily public; do not rely on this!! void outhex(FXuint hex); void outf(const char* format,...); /// Cleanup virtual ~FXDCPrint(); }; } #endif fox1.6-1.6.57/include/FXDCWindow.h000066400000000000000000000220061326741342000163450ustar00rootroot00000000000000/******************************************************************************** * * * D e v i c e C o n t e x t F o r W i n d o w s a n d I m a g e s * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDCWindow.h,v 1.46 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDCWINDOW_H #define FXDCWINDOW_H #ifndef FXDC_H #include "FXDC.h" #endif namespace FX { class FXApp; class FXDrawable; class FXImage; class FXBitmap; class FXIcon; class FXFont; class FXVisual; /** * Window Device Context * * The Window Device Context allows drawing into an FXDrawable, such as an * on-screen window (FXWindow and derivatives) or an off-screen image (FXImage * and its derivatives). * Because certain hardware resources are locked down, only one FXDCWindow may be * locked on a drawable at any one time. */ class FXAPI FXDCWindow : public FXDC { friend class FXFont; protected: FXDrawable *surface; // Drawable surface FXVisual *visual; // Visual of drawable FXRectangle rect; // Paint rectangle inside drawable #ifndef WIN32 FXuint flags; // GC Flags FXPixel devfg; // Device foreground pixel value FXPixel devbg; // Device background pixel value void *xftDraw; // Hook used only for XFT support #else FXID oldpalette; FXID oldbrush; FXID oldpen; FXPixel devfg; // Device foreground pixel value FXPixel devbg; // Device background pixel value FXbool needsNewBrush; FXbool needsNewPen; FXbool needsPath; FXbool needsClipReset; #endif private: #ifdef WIN32 void updateBrush(); void updatePen(); #endif private: FXDCWindow(); FXDCWindow(const FXDCWindow&); FXDCWindow &operator=(const FXDCWindow&); public: /// Construct for painting in response to expose; /// This sets the clip rectangle to the exposed rectangle FXDCWindow(FXDrawable* drawable,FXEvent* event); /// Construct for normal drawing; /// This sets clip rectangle to the whole drawable FXDCWindow(FXDrawable* drawable); /// Begin locks in a drawable surface void begin(FXDrawable *drawable); /// End unlock the drawable surface void end(); /// Read back pixel virtual FXColor readPixel(FXint x,FXint y); /// Draw points virtual void drawPoint(FXint x,FXint y); virtual void drawPoints(const FXPoint* points,FXuint npoints); virtual void drawPointsRel(const FXPoint* points,FXuint npoints); /// Draw lines virtual void drawLine(FXint x1,FXint y1,FXint x2,FXint y2); virtual void drawLines(const FXPoint* points,FXuint npoints); virtual void drawLinesRel(const FXPoint* points,FXuint npoints); virtual void drawLineSegments(const FXSegment* segments,FXuint nsegments); /// Draw rectangles virtual void drawRectangle(FXint x,FXint y,FXint w,FXint h); virtual void drawRectangles(const FXRectangle* rectangles,FXuint nrectangles); /// Draw rounded rectangle with ellipse with ew and ellips height eh virtual void drawRoundRectangle(FXint x,FXint y,FXint w,FXint h,FXint ew,FXint eh); /// Draw arcs virtual void drawArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2); virtual void drawArcs(const FXArc* arcs,FXuint narcs); /// Draw ellipse virtual void drawEllipse(FXint x,FXint y,FXint w,FXint h); /// Filled rectangles virtual void fillRectangle(FXint x,FXint y,FXint w,FXint h); virtual void fillRectangles(const FXRectangle* rectangles,FXuint nrectangles); /// Filled rounded rectangle with ellipse with ew and ellips height eh virtual void fillRoundRectangle(FXint x,FXint y,FXint w,FXint h,FXint ew,FXint eh); /// Fill chord virtual void fillChord(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2); virtual void fillChords(const FXArc* chords,FXuint nchords); /// Draw arcs virtual void fillArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2); virtual void fillArcs(const FXArc* arcs,FXuint narcs); /// Fill ellipse virtual void fillEllipse(FXint x,FXint y,FXint w,FXint h); /// Filled polygon virtual void fillPolygon(const FXPoint* points,FXuint npoints); virtual void fillConcavePolygon(const FXPoint* points,FXuint npoints); virtual void fillComplexPolygon(const FXPoint* points,FXuint npoints); /// Filled polygon with relative points virtual void fillPolygonRel(const FXPoint* points,FXuint npoints); virtual void fillConcavePolygonRel(const FXPoint* points,FXuint npoints); virtual void fillComplexPolygonRel(const FXPoint* points,FXuint npoints); /// Draw hashed box virtual void drawHashBox(FXint x,FXint y,FXint w,FXint h,FXint b=1); /// Draw focus rectangle virtual void drawFocusRectangle(FXint x,FXint y,FXint w,FXint h); /// Draw area from source virtual void drawArea(const FXDrawable* source,FXint sx,FXint sy,FXint sw,FXint sh,FXint dx,FXint dy); /// Draw area stretched area from source virtual void drawArea(const FXDrawable* source,FXint sx,FXint sy,FXint sw,FXint sh,FXint dx,FXint dy,FXint dw,FXint dh); /// Draw image virtual void drawImage(const FXImage* image,FXint dx,FXint dy); /// Draw bitmap virtual void drawBitmap(const FXBitmap* bitmap,FXint dx,FXint dy); /// Draw icon virtual void drawIcon(const FXIcon* icon,FXint dx,FXint dy); virtual void drawIconShaded(const FXIcon* icon,FXint dx,FXint dy); virtual void drawIconSunken(const FXIcon* icon,FXint dx,FXint dy); /// Draw string with base line starting at x, y virtual void drawText(FXint x,FXint y,const FXString& string); virtual void drawText(FXint x,FXint y,const FXchar* string,FXuint length); /// Draw text starting at x, y over filled background virtual void drawImageText(FXint x,FXint y,const FXString& string); virtual void drawImageText(FXint x,FXint y,const FXchar* string,FXuint length); /// Set foreground/background drawing color virtual void setForeground(FXColor clr); virtual void setBackground(FXColor clr); /// Set dash pattern virtual void setDashes(FXuint dashoffset,const FXchar *dashpattern,FXuint dashlength); /// Set line width virtual void setLineWidth(FXuint linewidth=0); /// Set line cap style virtual void setLineCap(FXCapStyle capstyle=CAP_BUTT); /// Set line join style virtual void setLineJoin(FXJoinStyle joinstyle=JOIN_MITER); /// Set line style virtual void setLineStyle(FXLineStyle linestyle=LINE_SOLID); /// Set fill style virtual void setFillStyle(FXFillStyle fillstyle=FILL_SOLID); /// Set fill rule virtual void setFillRule(FXFillRule fillrule=RULE_EVEN_ODD); /// Set blit function virtual void setFunction(FXFunction func=BLT_SRC); /// Set the tile virtual void setTile(FXImage* tile,FXint dx=0,FXint dy=0); /// Set the stipple pattern virtual void setStipple(FXBitmap *stipple,FXint dx=0,FXint dy=0); /// Set the stipple pattern virtual void setStipple(FXStipplePattern stipple,FXint dx=0,FXint dy=0); /// Set clip region virtual void setClipRegion(const FXRegion& region); /// Set clip rectangle virtual void setClipRectangle(FXint x,FXint y,FXint w,FXint h); /// Set clip rectangle virtual void setClipRectangle(const FXRectangle& rectangle); /// Clear clipping virtual void clearClipRectangle(); /// Set clip mask virtual void setClipMask(FXBitmap* mask,FXint dx=0,FXint dy=0); /// Clear clip mask virtual void clearClipMask(); /// Set font to draw text with virtual void setFont(FXFont *fnt); /// Clip against child windows virtual void clipChildren(FXbool yes); /// Destructor virtual ~FXDCWindow(); }; } #endif fox1.6-1.6.57/include/FXDLL.h000066400000000000000000000046761326741342000153170ustar00rootroot00000000000000/******************************************************************************** * * * D y n a m i c L i n k L i b r a r y S u p p o r t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDLL.h,v 1.8 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDLL_H #define FXDLL_H namespace FX { /** * Open library with given name, returning handle to the * library, or NULL if the operation failed. */ extern FXAPI void* fxdllOpen(const FXchar *dllname); /** * Close library represented by dllhandle. */ extern FXAPI void fxdllClose(void* dllhandle); /** * Return address of the symbol in the library represented by * dllhandle, or NULL if the operation failed. */ extern FXAPI void* fxdllSymbol(void* dllhandle,const FXchar* dllsymbol); /** * Return the string error message when loading dll's. */ extern FXAPI FXString fxdllError(); } #endif fox1.6-1.6.57/include/FXDataTarget.h000066400000000000000000000230341326741342000167110ustar00rootroot00000000000000/******************************************************************************** * * * D a t a T a r g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDataTarget.h,v 1.25 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDATATARGET_H #define FXDATATARGET_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { /** * A Data Target allows a valuator widget such as a Slider or Text Field * to be directly connected with a variable in the program. * Whenever the valuator control changes, the variable connected through * the data target is automatically updated; conversely, whenever the program * changes a variable, all the connected valuator widgets will be updated * to reflect this new value on the display. * Data Targets also allow connecting Radio Buttons, Menu Commands, and so on * to a variable. In this case, the new value of the connected variable is computed * by subtracting ID_OPTION from the message ID. */ class FXAPI FXDataTarget : public FXObject { FXDECLARE(FXDataTarget) protected: FXObject *target; // Target object void *data; // Associated data FXSelector message; // Message ID FXuint type; // Type of data private: FXDataTarget(const FXDataTarget&); FXDataTarget& operator=(const FXDataTarget&); public: long onCmdValue(FXObject*,FXSelector,void*); long onUpdValue(FXObject*,FXSelector,void*); long onCmdOption(FXObject*,FXSelector,void*); long onUpdOption(FXObject*,FXSelector,void*); public: enum { DT_VOID=0, DT_CHAR, DT_UCHAR, DT_SHORT, DT_USHORT, DT_INT, DT_UINT, DT_LONG, DT_ULONG, DT_FLOAT, DT_DOUBLE, DT_STRING, DT_LAST }; public: enum { ID_VALUE=1, /// Will cause the FXDataTarget to ask sender for value ID_OPTION=ID_VALUE+10001, /// ID_OPTION+i will set the value to i where -10000<=i<=10000 ID_LAST=ID_OPTION+10000 }; public: /// Associate with nothing FXDataTarget():target(NULL),data(NULL),message(0),type(DT_VOID){} /// Associate with nothing FXDataTarget(FXObject* tgt,FXSelector sel):target(tgt),data(NULL),message(sel),type(DT_VOID){} /// Associate with character variable FXDataTarget(FXchar& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_CHAR){} /// Associate with unsigned character variable FXDataTarget(FXuchar& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_UCHAR){} /// Associate with signed short variable FXDataTarget(FXshort& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_SHORT){} /// Associate with unsigned short variable FXDataTarget(FXushort& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_USHORT){} /// Associate with int variable FXDataTarget(FXint& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_INT){} /// Associate with unsigned int variable FXDataTarget(FXuint& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_UINT){} /// Associate with long variable FXDataTarget(FXlong& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_LONG){} /// Associate with unsigned long variable FXDataTarget(FXulong& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_ULONG){} /// Associate with float variable FXDataTarget(FXfloat& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_FLOAT){} /// Associate with double variable FXDataTarget(FXdouble& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_DOUBLE){} /// Associate with string variable FXDataTarget(FXString& value,FXObject* tgt=NULL,FXSelector sel=0):target(tgt),data(&value),message(sel),type(DT_STRING){} /// Set the message target object for this data target void setTarget(FXObject *t){ target=t; } /// Get the message target object for this data target, if any FXObject* getTarget() const { return target; } /// Set the message identifier for this data target void setSelector(FXSelector sel){ message=sel; } /// Get the message identifier for this data target FXSelector getSelector() const { return message; } /// Return type of data its connected to FXuint getType() const { return type; } /// Return pointer to data its connected to void* getData() const { return data; } /// Associate with nothing void connect(){ data=NULL; type=DT_VOID; } /// Associate with character variable void connect(FXchar& value){ data=&value; type=DT_CHAR; } /// Associate with unsigned character variable void connect(FXuchar& value){ data=&value; type=DT_UCHAR; } /// Associate with signed short variable void connect(FXshort& value){ data=&value; type=DT_SHORT; } /// Associate with unsigned short variable void connect(FXushort& value){ data=&value; type=DT_USHORT; } /// Associate with int variable void connect(FXint& value){ data=&value; type=DT_INT; } /// Associate with unsigned int variable void connect(FXuint& value){ data=&value; type=DT_UINT; } /// Associate with long variable void connect(FXlong& value){ data=&value; type=DT_LONG; } /// Associate with unsigned long variable void connect(FXulong& value){ data=&value; type=DT_ULONG; } /// Associate with float variable void connect(FXfloat& value){ data=&value; type=DT_FLOAT; } /// Associate with double variable void connect(FXdouble& value){ data=&value; type=DT_DOUBLE; } /// Associate with string variable void connect(FXString& value){ data=&value; type=DT_STRING; } /// Associate with nothing; also set target and message void connect(FXObject* tgt,FXSelector sel){ target=tgt; data=NULL; message=sel; type=DT_VOID; } /// Associate with character variable; also set target and message void connect(FXchar& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_CHAR; } /// Associate with unsigned character variable; also set target and message void connect(FXuchar& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_UCHAR; } /// Associate with signed short variable; also set target and message void connect(FXshort& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_SHORT; } /// Associate with unsigned short variable; also set target and message void connect(FXushort& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_USHORT; } /// Associate with int variable; also set target and message void connect(FXint& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_INT; } /// Associate with unsigned int variable; also set target and message void connect(FXuint& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_UINT; } /// Associate with long variable; also set target and message void connect(FXlong& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_LONG; } /// Associate with unsigned long variable; also set target and message void connect(FXulong& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_ULONG; } /// Associate with float variable; also set target and message void connect(FXfloat& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_FLOAT; } /// Associate with double variable; also set target and message void connect(FXdouble& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_DOUBLE; } /// Associate with string variable; also set target and message void connect(FXString& value,FXObject* tgt,FXSelector sel){ target=tgt; data=&value; message=sel; type=DT_STRING; } /// Destroy virtual ~FXDataTarget(); }; } #endif fox1.6-1.6.57/include/FXDate.h000066400000000000000000000132441326741342000155500ustar00rootroot00000000000000/******************************************************************************** * * * D a t e C l a s s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDate.h,v 1.10.2.1 2006/07/17 17:57:30 fox Exp $ * ********************************************************************************/ #ifndef FXDATE_H #define FXDATE_H namespace FX { /** * Gregorian date object. */ class FXAPI FXDate { private: FXuint julian; private: static const FXchar shortMonthName[12][4]; static const FXchar longMonthName[12][10]; static const FXchar shortWeekDay[7][4]; static const FXchar longWeekDay[7][10]; protected: static void greg2jul(FXuint& jd,FXint y,FXint m,FXint d); static void jul2greg(FXuint jd,FXint& y,FXint& m,FXint& d); public: /// Names for the months enum { Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec }; /// Names for the weekdays enum { Sun=0,Mon,Tue,Wed,Thu,Fri,Sat }; public: /// Default constructor FXDate(){} /// Copy constructor FXDate(const FXDate& date):julian(date.julian){} /// Initialize with year, month, and day FXDate(FXint y,FXint m,FXint d); /// Initialize with julian day number FXDate(FXuint j):julian(j){} /// Set julian day number void setJulian(FXuint d){ julian=d; } /// Get julian day number FXuint getJulian() const { return julian; } /// Set to year, month, and day void setDate(FXint y,FXint m,FXint d); /// Get year, month, and day void getDate(FXint& y,FXint& m,FXint& d) const; /// Return day of the month FXint day() const; /// Return month FXint month() const; /// Return year FXint year() const; /// Return day of the week FXint dayOfWeek() const; /// Return day of year FXint dayOfYear() const; /// Return days in this month FXint daysInMonth() const; /// Return true if leap year bool leapYear() const; /// Is the value a leap year static bool leapYear(FXint y); /// Get the name of the month static const FXchar *monthName(FXint m){ return longMonthName[m-1]; } /// Get the abbreviated name of the month static const FXchar *monthNameShort(FXint m){ return shortMonthName[m-1]; } /// Get the name of the day static const FXchar *dayName(FXint d){ return longWeekDay[d]; } /// Get the abbreviated name of the day static const FXchar *dayNameShort(FXint d){ return shortWeekDay[d]; } /// Return current local date static FXDate localDate(); /// Return current UTC (Zulu) date static FXDate zuluDate(); /// Assignment FXDate& operator=(const FXDate& date){julian=date.julian;return *this;} /// Assignment operators FXDate& operator+=(FXint x){ julian+=x; return *this; } FXDate& operator-=(FXint x){ julian-=x; return *this; } /// Increment and decrement FXDate& operator++(){ julian++; return *this; } FXDate& operator--(){ julian--; return *this; } /// Equality tests bool operator==(const FXDate& date) const { return julian==date.julian;} bool operator!=(const FXDate& date) const { return julian!=date.julian;} /// Inequality tests bool operator<(const FXDate& date) const { return julian(const FXDate& date) const { return julian>date.julian;} bool operator>=(const FXDate& date) const { return julian>=date.julian;} /// Add days to date yielding another date friend inline FXDate operator+(const FXDate& d,FXint x); friend inline FXDate operator+(FXint x,const FXDate& d); /// Substract dates yielding days friend inline FXint operator-(const FXDate& a,const FXDate& b); /// save to stream friend FXAPI FXStream& operator<<(FXStream& store,const FXDate& d); /// load from stream friend FXAPI FXStream& operator>>(FXStream& store,FXDate& d); }; inline FXDate operator+(const FXDate& d,FXint x){ return FXDate(d.julian+x); } inline FXDate operator+(FXint x,const FXDate& d){ return FXDate(x+d.julian); } inline FXint operator-(const FXDate& a,const FXDate& b){return a.julian-b.julian; } extern FXAPI FXStream& operator<<(FXStream& store,const FXDate& d); extern FXAPI FXStream& operator>>(FXStream& store,FXDate& d); } #endif fox1.6-1.6.57/include/FXDebugTarget.h000066400000000000000000000050461326741342000170710ustar00rootroot00000000000000/******************************************************************************** * * * D e b u g T a r g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDebugTarget.h,v 1.15 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDEBUGTARGET_H #define FXDEBUGTARGET_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { /** * A DebugTarget prints out every message it receives. * To use it, simply make the DebugTarget a target of the widget * whose messages you want to see, */ class FXAPI FXDebugTarget : public FXObject { FXDECLARE(FXDebugTarget) protected: FXObject *lastsender; FXSelector lastsel; FXuint count; public: static const FXchar *const messageTypeName[]; private: FXDebugTarget(const FXDebugTarget&); FXDebugTarget &operator=(const FXDebugTarget&); public: long onMessage(FXObject*,FXSelector,void*); public: /// Construct a debug target FXDebugTarget(); }; } #endif fox1.6-1.6.57/include/FXDelegator.h000066400000000000000000000056501326741342000166030ustar00rootroot00000000000000/******************************************************************************** * * * D e l e g a t o r T a r g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDelegator.h,v 1.15 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDELEGATOR_H #define FXDELEGATOR_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { /** * A delegator forwards messages to a delegate object. * Delegators are used when you need to multiplex messages * toward any number of target objects. * For example, many controls may be connected to FXDelegator, * instead of directly to the document object. Changing the * delegate in FXDelegator will then reconnect the controls with their * new target. */ class FXAPI FXDelegator : public FXObject { FXDECLARE(FXDelegator) protected: FXObject *delegate; private: FXDelegator(const FXDelegator&); FXDelegator &operator=(const FXDelegator&); public: virtual long onDefault(FXObject*,FXSelector,void*); public: /// Construct a delegator FXDelegator(FXObject* target=NULL):delegate(target){ } /// Return delegate object FXObject* getDelegate() const { return delegate; } /// Change delegate object void setDelegate(FXObject* target){ delegate=target; } /// Always trash during detroy virtual ~FXDelegator(){ delegate=(FXObject*)-1L; } }; } #endif fox1.6-1.6.57/include/FXDial.h000066400000000000000000000166411326741342000155500ustar00rootroot00000000000000/******************************************************************************** * * * D i a l W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDial.h,v 1.35 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDIAL_H #define FXDIAL_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { // Dial style options enum { DIAL_VERTICAL = 0, // Vertically oriented DIAL_HORIZONTAL = 0x00008000, // Horizontal oriented DIAL_CYCLIC = 0x00010000, // Value wraps around DIAL_HAS_NOTCH = 0x00020000, // Dial has a Center Notch DIAL_NORMAL = DIAL_VERTICAL }; /** * The Dial widget is a valuator widget which is able to provide a cyclic * value range when the DIAL_CYCLIC is passed, or a simple linear value range. * While being turned, the dial sends a SEL_CHANGED message to its target; * at the end of the interaction, a SEL_COMMAND message is sent. * The message data represents the current value, of type FXint. The options * DIAL_VERTICAL and DIAL_HORIZONTAL control the orientation of the dial. * An optional notch can be used to indicate the zero-position of * the dial; display of the notch is controlled by the DIAL_HAS_NOTCH option. */ class FXAPI FXDial : public FXFrame { FXDECLARE(FXDial) protected: FXint range[2]; // Reported data range FXColor notchColor; // Main notch color FXint notchangle; // Angle of main notch FXint notchspacing; // Angle between notches FXint notchoffset; // Notch offset FXint dragpoint; // Place where clicked FXint dragpos; // Value where clicked FXint incr; // Rate of change/revolution FXint pos; // Reported data position FXString help; // Help string FXString tip; // Tip string protected: FXDial(); private: FXDial(const FXDial&); FXDial &operator=(const FXDial&); public: long onPaint(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void* ); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetRealValue(FXObject*,FXSelector,void*); long onCmdGetRealValue(FXObject*,FXSelector,void*); long onCmdSetIntRange(FXObject*,FXSelector,void*); long onCmdGetIntRange(FXObject*,FXSelector,void*); long onCmdSetRealRange(FXObject*,FXSelector,void*); long onCmdGetRealRange(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: /// Construct a dial widget FXDial(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=DIAL_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Returns true because a dial can receive focus virtual bool canFocus() const; /// Set the dial value void setValue(FXint value,FXbool notify=FALSE); /// Return the dial value FXint getValue() const { return pos; } /// Change the dial's range void setRange(FXint lo,FXint hi,FXbool notify=FALSE); /// Obtain the current range of the dial void getRange(FXint& lo,FXint& hi) const { lo=range[0]; hi=range[1]; } /** * Set the revolution increment, which is the amount of change * in the position for revolution of the dial; the dial may go * through multiple revolutions to go through its whole range; * by default it takes one 360 degree turn of the dial to go * from the lower to the upper range. */ void setRevolutionIncrement(FXint i); /// Get the current value of the revolution increment FXint getRevolutionIncrement() const { return incr; } /** * Change the spacing for the small notches; this should be set * in tenths of degrees in the range [1,3600], and the value should * be a divisor of 3600, so as to make the notches come out evenly */ void setNotchSpacing(FXint spacing); /// Get the current notch spacing FXint getNotchSpacing() const { return notchspacing; } /** * Change the notch offset, which is the position of the * center notch; the value should be tenths of degrees * in the range [-3600,3600] */ void setNotchOffset(FXint offset); /// Get the current center notch offset FXint getNotchOffset() const { return notchoffset; } /// Changes the dial style. void setDialStyle(FXuint opts); /// Get the current dial style. FXuint getDialStyle() const; /// Change the center notch color void setNotchColor(FXColor clr); /// Get the current center notch color FXColor getNotchColor() const { return notchColor; } /// Set the help text to be displayed on the status line void setHelpText(const FXString& text); /// Get the current help text const FXString& getHelpText() const { return help; } /// Set the tip text to be displayed in the tooltip void setTipText(const FXString& text); /// Get the current tooltip text value const FXString& getTipText() const { return tip; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXDialogBox.h000066400000000000000000000065671326741342000165550ustar00rootroot00000000000000/******************************************************************************** * * * D i a l o g B o x * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDialogBox.h,v 1.23 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDIALOGBOX_H #define FXDIALOGBOX_H #ifndef FXTOPWINDOW_H #include "FXTopWindow.h" #endif namespace FX { /** * DialogBox window. * When receiving ID_CANCEL or ID_ACCEPT, the DialogBox breaks out of the * modal loop and returns FALSE or TRUE, respectively. * To close the DialogBox when not running modally, simply send it ID_HIDE. */ class FXAPI FXDialogBox : public FXTopWindow { FXDECLARE(FXDialogBox) protected: FXDialogBox(){} private: FXDialogBox(const FXDialogBox&); FXDialogBox &operator=(const FXDialogBox&); public: long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onCmdAccept(FXObject*,FXSelector,void*); long onCmdCancel(FXObject*,FXSelector,void*); public: enum { ID_CANCEL=FXTopWindow::ID_LAST, /// Closes the dialog, cancel the entry ID_ACCEPT, /// Closes the dialog, accept the entry ID_LAST }; public: /// Construct free-floating dialog FXDialogBox(FXApp* a,const FXString& name,FXuint opts=DECOR_TITLE|DECOR_BORDER,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=10,FXint pr=10,FXint pt=10,FXint pb=10,FXint hs=4,FXint vs=4); /// Construct dialog which will always float over the owner window FXDialogBox(FXWindow* owner,const FXString& name,FXuint opts=DECOR_TITLE|DECOR_BORDER,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=10,FXint pr=10,FXint pt=10,FXint pb=10,FXint hs=4,FXint vs=4); /// Run modal invocation of the dialog virtual FXuint execute(FXuint placement=PLACEMENT_CURSOR); }; } #endif fox1.6-1.6.57/include/FXDict.h000066400000000000000000000123631326741342000155570ustar00rootroot00000000000000/******************************************************************************** * * * S t r i n g D i c t i o n a r y C l a s s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDict.h,v 1.26 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDICT_H #define FXDICT_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { /** * The dictionary class maintains a fast-access hash table of entities * indexed by a character string. * It is typically used to map strings to pointers; however, overloading * the createData() and deleteData() members allows any type of data to * be indexed by strings. */ class FXAPI FXDict : public FXObject { FXDECLARE(FXDict) protected: struct FXDictEntry { FXchar *key; // Key string void *data; // Data FXint hash; // Hash value of key bool mark; // Entry is marked }; protected: FXDictEntry *dict; // Dictionary FXint total; // Dictionary size FXint number; // Number of entries protected: static FXint hash(const FXchar* str); protected: /** * Overload this function in a derived class to return the * data pointer given an input pointer; the default implementation * just returns the input pointer. */ virtual void *createData(const void*); /** * Overload this function in a derived class to delete the pointer * previously returned by createData(); the default implementation * does nothing. */ virtual void deleteData(void*); public: /** * Construct an empty dictionary. */ FXDict(); /// Copy constructor; does bit-copy of void pointer data. FXDict(const FXDict& orig); /// Assignment operator FXDict& operator=(const FXDict& orig); /** * Resize the table to the given size. */ void size(FXint m); /** * Return the size of the table, including the empty slots. */ FXint size() const { return total; } /** * Return the total number of entries in the table. */ FXint no() const { return number; } /** * Insert a new entry into the table given key and mark. * If there is already an entry with that key, leave it unchanged, * otherwise insert the new entry. */ void* insert(const FXchar* ky,const void* ptr,bool mrk=false); /** * Replace data at key, if the entry's mark is less than * or equal to the given mark. If there was no existing entry, * a new entry is inserted with the given mark. */ void* replace(const FXchar* ky,const void* ptr,bool mrk=false); /** * Remove data given key. */ void* remove(const FXchar* ky); /** * Find data pointer given key. */ void* find(const FXchar* ky) const; /** * Return true if slot is empty. */ bool empty(FXint pos) const { return dict[pos].hash<0; } /** * Return key at position pos. */ const FXchar* key(FXuint pos) const { return dict[pos].key; } /** * return data pointer at position pos. */ void* data(FXuint pos) const { return dict[pos].data; } /** * Return mark flag of entry at position pos. */ bool mark(FXuint pos) const { return dict[pos].mark; } /** * Return position of first filled slot, or >= total */ FXint first() const; /** * Return position of last filled slot or -1 */ FXint last() const; /** * Return position of next filled slot in hash table * or a value greater than or equal to total if no filled * slot was found */ FXint next(FXint pos) const; /** * Return position of previous filled slot in hash table * or a -1 if no filled slot was found */ FXint prev(FXint pos) const; /// Clear all entries void clear(); /// Destructor virtual ~FXDict(); }; } #endif fox1.6-1.6.57/include/FXDir.h000066400000000000000000000076301326741342000154130ustar00rootroot00000000000000/******************************************************************************** * * * D i r e c t o r y E n u m e r a t o r * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDir.h,v 1.24 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDIR_H #define FXDIR_H namespace FX { /// Directory enumerator class FXAPI FXDir { private: FXuval space[256]; private: FXDir(const FXDir&); FXDir &operator=(const FXDir&); public: /// Options for listing files enum { MatchAll = 0, /// Matching files and directories NoFiles = 1, /// Don't list any files NoDirs = 2, /// Don't list any directories AllFiles = 4, /// List all files AllDirs = 8, /// List all directories HiddenFiles = 16, /// List hidden files also HiddenDirs = 32, /// List hidden directories also NoParent = 64, /// Don't include '..' in the listing CaseFold = 128 /// Matching is case-insensitive }; public: /// Construct directory enumerator FXDir(); /// Construct directory enumerator open on path FXDir(const FXString& path); /// Open directory to path, return true if ok. virtual bool open(const FXString& path); /// Returns true if the directory is open virtual bool isOpen() const; /// Go to next one virtual bool next(); /// Return current file name virtual FXString name() const; /// Close directory virtual void close(); /// Create directory static bool create(const FXString& path,FXuint mode=FXIO::OwnerFull|FXIO::GroupFull|FXIO::OtherFull); /// Remove directory static bool remove(const FXString& path); /// Rename or move srcpath to dstpath static bool rename(const FXString& srcpath,const FXString& dstpath); /** * List files in a given directory. * Returns the number of files in the string-array list which matched the * pattern or satisfied the flag conditions. */ static FXint listFiles(FXString*& filelist,const FXString& path,const FXString& pattern="*",FXuint flags=FXDir::MatchAll); /** * List drives, i.e. roots of directory trees. * Return the number of drives in the string array. */ static FXint listDrives(FXString*& drivelist); /// Destructor virtual ~FXDir(); }; } #endif fox1.6-1.6.57/include/FXDirBox.h000066400000000000000000000110051326741342000160530ustar00rootroot00000000000000/******************************************************************************** * * * D i r e c t o r y B o x W i d g e t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDirBox.h,v 1.25 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDIRBOX_H #define FXDIRBOX_H #ifndef FXTREELISTBOX_H #include "FXTreeListBox.h" #endif namespace FX { class FXIcon; class FXFileDict; /// Directory Box options enum { DIRBOX_NO_OWN_ASSOC = 0x00020000 /// Do not create associations for files }; /** * A Directory Box widget allows the user to select parts of a file path. * First, it is filled with a string comprising a file path, like "/a/b/c". * Then, the user can select "/a/b/c", "/a/b", "/a", and "/" from the drop-down * list. The entries in the drop-down list are automatically provided with icons * by consulting the file-associations registry settings. * The Directory Box sends SEL_CHANGED and SEL_COMMAND messages, with the string * containing the full path to the selected item. */ class FXAPI FXDirBox : public FXTreeListBox { FXDECLARE(FXDirBox) protected: FXFileDict *associations; // Association table FXIcon *foldericon; // Folder icons FXIcon *cdromicon; // CDROM icon FXIcon *harddiskicon; // Hard disk icon FXIcon *netdriveicon; // Networked drive icon FXIcon *floppyicon; // Floppy icon FXIcon *nethoodicon; // Network neighborhood icon FXIcon *zipdiskicon; // Zip drive icon protected: FXDirBox(){} FXString getItemPathname(FXTreeItem *item) const; FXTreeItem* getPathnameItem(const FXString& path); private: FXDirBox(const FXDirBox&); FXDirBox &operator=(const FXDirBox&); public: long onTreeChanged(FXObject*,FXSelector,void*); long onTreeClicked(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); public: /// Construct a Directory Box FXDirBox(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_SUNKEN|FRAME_THICK|TREELISTBOX_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Set current directory void setDirectory(const FXString& pathname); /// Return current directory FXString getDirectory() const; /// Change file associations used to look up icons void setAssociations(FXFileDict* assoc); /// Return file associations FXFileDict* getAssociations() const { return associations; } /// Destructor virtual ~FXDirBox(); }; } #endif fox1.6-1.6.57/include/FXDirDialog.h000066400000000000000000000076621326741342000165400ustar00rootroot00000000000000/******************************************************************************** * * * D i r e c t o r y S e l e c t i o n D i a l o g * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDirDialog.h,v 1.17 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDIRDIALOG_H #define FXDIRDIALOG_H #ifndef FXDIALOGBOX_H #include "FXDialogBox.h" #endif namespace FX { class FXDirSelector; /** * A Directory Dialog provides a way to select a directory. In function, * the directory selection dialog is very similar to the file dialog, except that * the Directory Dialog displays a tree-structured view of the file system, and * thereby makes up and down navigation through the file system significantly easier. */ class FXAPI FXDirDialog : public FXDialogBox { FXDECLARE(FXDirDialog) protected: FXDirSelector *dirbox; // Directory selection widget protected: FXDirDialog(){} void initdialog(); private: FXDirDialog(const FXDirDialog&); FXDirDialog &operator=(const FXDirDialog&); public: /// Construct Directory Dialog box FXDirDialog(FXWindow* owner,const FXString& name,FXuint opts=0,FXint x=0,FXint y=0,FXint w=400,FXint h=300); /// Construct free-floating Directory Dialog box FXDirDialog(FXApp* a,const FXString& name,FXuint opts=0,FXint x=0,FXint y=0,FXint w=400,FXint h=300); /// Hide this window virtual void hide(); /// Change directory void setDirectory(const FXString& path); /// Return directory FXString getDirectory() const; /// Return TRUE if showing files as well as directories FXbool showFiles() const; /// Show or hide normal files void showFiles(FXbool showing); /// Return TRUE if showing hidden files FXbool showHiddenFiles() const; /// Show or hide hidden files void showHiddenFiles(FXbool showing); /// Return wildcard matching mode FXuint getMatchMode() const; /// Change wildcard matching mode void setMatchMode(FXuint mode); /// Change directory list style void setDirBoxStyle(FXuint style); /// Return directory list style FXuint getDirBoxStyle() const; /// Open directory name static FXString getOpenDirectory(FXWindow* owner,const FXString& caption,const FXString& path); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destructor virtual ~FXDirDialog(); }; } #endif fox1.6-1.6.57/include/FXDirList.h000066400000000000000000000253341326741342000162500ustar00rootroot00000000000000/******************************************************************************** * * * D i r e c t o r y L i s t W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDirList.h,v 1.70 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDIRLIST_H #define FXDIRLIST_H #ifndef FXTREELIST_H #include "FXTreeList.h" #endif namespace FX { struct FXFileAssoc; class FXFileDict; class FXIcon; class FXDirList; /// Directory List options enum { DIRLIST_SHOWFILES = 0x08000000, /// Show files as well as directories DIRLIST_SHOWHIDDEN = 0x10000000, /// Show hidden files or directories DIRLIST_NO_OWN_ASSOC = 0x20000000 /// Do not create associations for files }; /// Directory item class FXAPI FXDirItem : public FXTreeItem { FXDECLARE(FXDirItem) friend class FXDirList; protected: FXFileAssoc *assoc; // File association FXDirItem *link; // Link to next item FXDirItem *list; // List of child items FXlong size; // File size (if a file) FXTime date; // Time of item private: FXDirItem(const FXDirItem&); FXDirItem& operator=(const FXDirItem&); protected: FXDirItem():assoc(NULL),link(NULL),list(NULL),size(0L),date(0){} public: enum { FOLDER = 512, /// Directory item EXECUTABLE = 1024, /// Executable item SYMLINK = 2048, /// Symbolic linked item CHARDEV = 4096, /// Character special item BLOCKDEV = 8192, /// Block special item FIFO = 16384, /// FIFO item SOCK = 32768 /// Socket item }; public: /// Constructor FXDirItem(const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL):FXTreeItem(text,oi,ci,ptr),assoc(NULL),link(NULL),list(NULL),size(0),date(0){state=HASITEMS;} /// Return true if this is a file item FXbool isFile() const { return (state&(FOLDER|BLOCKDEV|CHARDEV|FIFO|SOCK))==0; } /// Return true if this is a directory item FXbool isDirectory() const { return (state&FOLDER)!=0; } /// Return true if this is an executable item FXbool isExecutable() const { return (state&EXECUTABLE)!=0; } /// Return true if this is a symbolic link item FXbool isSymlink() const { return (state&SYMLINK)!=0; } /// Return true if this is a character device item FXbool isChardev() const { return (state&CHARDEV)!=0; } /// Return true if this is a block device item FXbool isBlockdev() const { return (state&BLOCKDEV)!=0; } /// Return true if this is an FIFO item FXbool isFifo() const { return (state&FIFO)!=0; } /// Return true if this is a socket FXbool isSocket() const { return (state&SOCK)!=0; } /// Return the file-association object for this item FXFileAssoc* getAssoc() const { return assoc; } /// Return the file size for this item FXlong getSize() const { return size; } /// Return the date for this item FXTime getDate() const { return date; } }; /** * A Directory List widget provides a tree-structured view of the file system. * It automatically updates itself periodically by re-scanning the file system * for any changes. As it scans the displayed directories and files, it automatically * determines the icons to be displayed by consulting the file-associations registry * settings. A number of messages can be sent to the Directory List to control the * filter pattern, sorting order, case sensitivity, and hidden file display mode. * The Directory list widget supports drags and drops of files. */ class FXAPI FXDirList : public FXTreeList { FXDECLARE(FXDirList) protected: FXFileDict *associations; // Association table FXDirItem *list; // Root item list FXString dropdirectory; // Drop directory FXDragAction dropaction; // Drop action FXString dragfiles; // Dragged files FXString pattern; // Pattern of file names FXuint matchmode; // File wildcard match mode FXuint counter; // Refresh counter FXIcon *open_folder; // Open folder icon FXIcon *closed_folder; // Closed folder icon FXIcon *mini_doc; // Document icon FXIcon *mini_app; // Application icon FXIcon *cdromicon; FXIcon *harddiskicon; FXIcon *networkicon; FXIcon *floppyicon; FXIcon *zipdiskicon; protected: FXDirList(); void listRootItems(); void listChildItems(FXDirItem *par); virtual FXTreeItem* createItem(const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr); private: FXDirList(const FXDirList&); FXDirList &operator=(const FXDirList&); public: long onRefreshTimer(FXObject*,FXSelector,void*); long onBeginDrag(FXObject*,FXSelector,void*); long onEndDrag(FXObject*,FXSelector,void*); long onDragged(FXObject*,FXSelector,void*); long onDNDEnter(FXObject*,FXSelector,void*); long onDNDLeave(FXObject*,FXSelector,void*); long onDNDMotion(FXObject*,FXSelector,void*); long onDNDDrop(FXObject*,FXSelector,void*); long onDNDRequest(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdToggleHidden(FXObject*,FXSelector,void*); long onUpdToggleHidden(FXObject*,FXSelector,void*); long onCmdShowHidden(FXObject*,FXSelector,void*); long onUpdShowHidden(FXObject*,FXSelector,void*); long onCmdHideHidden(FXObject*,FXSelector,void*); long onUpdHideHidden(FXObject*,FXSelector,void*); long onCmdToggleFiles(FXObject*,FXSelector,void*); long onUpdToggleFiles(FXObject*,FXSelector,void*); long onCmdShowFiles(FXObject*,FXSelector,void*); long onUpdShowFiles(FXObject*,FXSelector,void*); long onCmdHideFiles(FXObject*,FXSelector,void*); long onUpdHideFiles(FXObject*,FXSelector,void*); long onCmdSetPattern(FXObject*,FXSelector,void*); long onUpdSetPattern(FXObject*,FXSelector,void*); long onCmdSortReverse(FXObject*,FXSelector,void*); long onUpdSortReverse(FXObject*,FXSelector,void*); long onCmdSortCase(FXObject*,FXSelector,void*); long onUpdSortCase(FXObject*,FXSelector,void*); long onCmdRefresh(FXObject*,FXSelector,void*); public: static FXint ascending(const FXTreeItem* a,const FXTreeItem* b); static FXint descending(const FXTreeItem* a,const FXTreeItem* b); static FXint ascendingCase(const FXTreeItem* a,const FXTreeItem* b); static FXint descendingCase(const FXTreeItem* a,const FXTreeItem* b); public: enum { ID_REFRESHTIMER=FXTreeList::ID_LAST, ID_SHOW_FILES, ID_HIDE_FILES, ID_TOGGLE_FILES, ID_SHOW_HIDDEN, ID_HIDE_HIDDEN, ID_TOGGLE_HIDDEN, ID_SET_PATTERN, ID_SORT_REVERSE, ID_SORT_CASE, ID_REFRESH, ID_LAST }; public: /// Construct a directory list FXDirList(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Scan the directories and update the items if needed, or if force is TRUE void scan(FXbool force=TRUE); /// Return TRUE if item is a directory FXbool isItemDirectory(const FXTreeItem* item) const; /// Return TRUE if item is a file FXbool isItemFile(const FXTreeItem* item) const; /// Return TRUE if item is executable FXbool isItemExecutable(const FXTreeItem* item) const; /// Collapse tree virtual FXbool collapseTree(FXTreeItem* tree,FXbool notify=FALSE); /// Expand tree virtual FXbool expandTree(FXTreeItem* tree,FXbool notify=FALSE); /// Set current file void setCurrentFile(const FXString& file,FXbool notify=FALSE); /// Return current file FXString getCurrentFile() const; /// Set current directory void setDirectory(const FXString& path,FXbool notify=FALSE); /// Return current directory FXString getDirectory() const; /// Return absolute pathname of item FXString getItemPathname(const FXTreeItem* item) const; /// Return the item from the absolute pathname FXTreeItem* getPathnameItem(const FXString& path); /// Change wildcard matching pattern void setPattern(const FXString& ptrn); /// Return wildcard pattern FXString getPattern() const { return pattern; } /// Return wildcard matching mode FXuint getMatchMode() const { return matchmode; } /// Change wildcard matching mode void setMatchMode(FXuint mode); /// Return TRUE if showing files as well as directories FXbool showFiles() const; /// Show or hide normal files void showFiles(FXbool showing); /// Return TRUE if showing hidden files and directories FXbool showHiddenFiles() const; /// Show or hide hidden files and directories void showHiddenFiles(FXbool showing); /// Change file associations void setAssociations(FXFileDict* assoc); /// Return file associations FXFileDict* getAssociations() const { return associations; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destructor virtual ~FXDirList(); }; } #endif fox1.6-1.6.57/include/FXDirSelector.h000066400000000000000000000130321326741342000171050ustar00rootroot00000000000000/******************************************************************************** * * * D i r e c t o r y S e l e c t i o n W i d g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDirSelector.h,v 1.21 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDIRSELECTOR_H #define FXDIRSELECTOR_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { class FXDirList; class FXTextField; class FXButton; /** * The Directory Selector widget is the reusable mega-widget component which * is the core of the Directory Dialog. The function of the directory selector widget * is very similar to the file selector widget, except that the directory selector widget * displays a tree-structured view of the file system, and thereby makes up and down * navigation through the file system significantly easier. */ class FXAPI FXDirSelector : public FXPacker { FXDECLARE(FXDirSelector) protected: FXDirList *dirbox; // Directory list widget FXTextField *dirname; // Directory name entry field FXButton *accept; // Accept button FXButton *cancel; // Cancel button FXIcon *updiricon; // Up directory icon FXIcon *homeicon; // Go home icon FXIcon *workicon; // Go home icon FXIcon *markicon; // Book mark icon FXIcon *clearicon; // Book clear icon FXIcon *newicon; // New directory icon FXIcon *deleteicon; // Delete file icon FXIcon *moveicon; // Rename file icon FXIcon *copyicon; // Copy file icon FXIcon *linkicon; // Link file icon FXRecentFiles mrufiles; // Recently visited places protected: FXDirSelector(){} private: FXDirSelector(const FXDirSelector&); FXDirSelector &operator=(const FXDirSelector&); public: long onCmdName(FXObject*,FXSelector,void*); long onCmdOpened(FXObject*,FXSelector,void*); long onCmdHome(FXObject*,FXSelector,void*); long onCmdWork(FXObject*,FXSelector,void*); long onCmdDirectoryUp(FXObject*,FXSelector,void*); long onPopupMenu(FXObject*,FXSelector,void*); long onCmdBookmark(FXObject*,FXSelector,void*); long onCmdVisit(FXObject*,FXSelector,void*); long onCmdNew(FXObject*,FXSelector,void*); long onUpdNew(FXObject*,FXSelector,void*); long onCmdMove(FXObject*,FXSelector,void*); long onCmdCopy(FXObject*,FXSelector,void*); long onCmdLink(FXObject*,FXSelector,void*); long onCmdDelete(FXObject*,FXSelector,void*); long onUpdSelected(FXObject*,FXSelector,void*); public: enum { ID_DIRNAME=FXPacker::ID_LAST, ID_DIRLIST, ID_HOME, ID_WORK, ID_DIRECTORY_UP, ID_BOOKMARK, ID_VISIT, ID_NEW, ID_DELETE, ID_MOVE, ID_COPY, ID_LINK, ID_LAST }; public: /// Constructor FXDirSelector(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Return a pointer to the "Accept" button FXButton *acceptButton() const { return accept; } /// Return a pointer to the "Cancel" button FXButton *cancelButton() const { return cancel; } /// Change directory void setDirectory(const FXString& path); /// Return directory FXString getDirectory() const; /// Return TRUE if showing files as well as directories FXbool showFiles() const; /// Show or hide normal files void showFiles(FXbool showing); /// Return TRUE if showing hidden directories FXbool showHiddenFiles() const; /// Show or hide hidden directories void showHiddenFiles(FXbool showing); /// Return wildcard matching mode FXuint getMatchMode() const; /// Change wildcard matching mode void setMatchMode(FXuint mode); /// Change Directory List style void setDirBoxStyle(FXuint style); /// Return Directory List style FXuint getDirBoxStyle() const; /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destructor virtual ~FXDirSelector(); }; } #endif fox1.6-1.6.57/include/FXDockBar.h000066400000000000000000000175031326741342000162020ustar00rootroot00000000000000/******************************************************************************** * * * D o c k B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDockBar.h,v 1.24 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDOCKBAR_H #define FXDOCKBAR_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { class FXDockSite; /** * A dock bar widget can be docked inside a dock site widget, or floated * around freely. Users can move, undock, and dock the dock bar widget * by means of a handle such as a tool bar grip. When docking, the dock * bar sends a SEL_DOCKED message to its target; when undocking, it sends * a SEL_FLOATED message. In either case the dock site involved is passed * in the void* pointer argument of the message. */ class FXAPI FXDockBar : public FXPacker { FXDECLARE(FXDockBar) protected: FXComposite *drydock; // Parent when docked FXComposite *wetdock; // Parent when floating FXint gripx; // Grip offset x FXint gripy; // Grip offset y FXuchar allowed; // Where we're allowed to dock protected: FXDockBar(); private: FXDockBar(const FXDockBar&); FXDockBar &operator=(const FXDockBar&); public: long onCmdUndock(FXObject*,FXSelector,void*); long onUpdUndock(FXObject*,FXSelector,void*); long onCmdDockTop(FXObject*,FXSelector,void*); long onUpdDockTop(FXObject*,FXSelector,void*); long onCmdDockBottom(FXObject*,FXSelector,void*); long onUpdDockBottom(FXObject*,FXSelector,void*); long onCmdDockLeft(FXObject*,FXSelector,void*); long onUpdDockLeft(FXObject*,FXSelector,void*); long onCmdDockRight(FXObject*,FXSelector,void*); long onUpdDockRight(FXObject*,FXSelector,void*); long onUpdDockFlip(FXObject*,FXSelector,void*); long onBeginDragGrip(FXObject*,FXSelector,void*); long onEndDragGrip(FXObject*,FXSelector,void*); long onDraggedGrip(FXObject*,FXSelector,void*); long onPopupMenu(FXObject*,FXSelector,void*); long onDockTimer(FXObject*,FXSelector,void*); public: enum { ID_DOCK_FLOAT=FXPacker::ID_LAST, /// Undock the dock bar ID_DOCK_TOP, /// Dock on the top ID_DOCK_BOTTOM, /// Dock on the bottom ID_DOCK_LEFT, /// Dock on the left ID_DOCK_RIGHT, /// Dock on the right ID_DOCK_FLIP, /// Flip orientation ID_TOOLBARGRIP, /// Tool bar grip ID_TIMER, ID_LAST }; public: enum { ALLOW_NOWHERE=0, /// Don't allow docking anywhere ALLOW_TOP=1, /// Docking at the top only ALLOW_BOTTOM=2, /// Docking at the bottom only ALLOW_LEFT=4, /// Docking at the left only ALLOW_RIGHT=8, /// Docking at the right only ALLOW_HORIZONTAL=ALLOW_TOP|ALLOW_BOTTOM, /// Docking at the top and bottom ALLOW_VERTICAL=ALLOW_LEFT|ALLOW_RIGHT, /// Docking at the left and right ALLOW_EVERYWHERE=ALLOW_HORIZONTAL|ALLOW_VERTICAL /// Docking can be everywhere }; public: /** * Construct a floatable dock bar, with a default parent p and an * alternate parent q. To allow docking and dragging the default parent * p must be of type FXDockSite, and the alternate parent q must be of * type FXToolBarShell. * Normally, the dock bar is docked under a window p of type FXDockSite. * When floated, the toolbar can be docked under window q, which is * usually an kind of FXToolBarShell window. */ FXDockBar(FXComposite* p,FXComposite* q,FXuint opts=LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=3,FXint pr=3,FXint pt=2,FXint pb=2,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /** * Construct a non-floatable dock bar. * The dock bar can not be undocked. */ FXDockBar(FXComposite* p,FXuint opts,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=2,FXint pr=3,FXint pt=3,FXint pb=2,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Return true if docked FXbool isDocked() const; /** * Check if the dock bar would dock or undock if at locaton barx, bary. */ FXbool insideDock(FXDockSite* docksite,FXint barx,FXint bary); /** * Set parent when docked. * If it was docked, reparent under the new docking window. */ void setDryDock(FXComposite* dry); /** * Set parent when floating. * If it was undocked, then reparent under the new floating window. */ void setWetDock(FXComposite* wet); /// Return parent when docked FXComposite* getDryDock() const { return drydock; } /// Return parent when floating FXComposite* getWetDock() const { return wetdock; } /// Search for dock against given side of main window FXDockSite* findDockAtSide(FXuint side=LAYOUT_SIDE_TOP); /// Search for dock close to coordinates rootx, rooty FXDockSite* findDockNear(FXint rootx,FXint rooty); /** * Dock the bar against the given side, after some other widget. * However, if after is -1, it will be docked as the innermost bar just before * the work-area, while if after is 0, if will be docked as the outermost bar. */ virtual void dock(FXDockSite* docksite,FXWindow* before=NULL,FXbool notify=FALSE); /** * Dock the bar against the given side, near the given position relative * to the toolbar dock's origin. */ virtual void dock(FXDockSite* docksite,FXint localx,FXint localy,FXbool notify); /** * Undock or float the bar. * The initial position of the wet dock is a few pixels * below and to the right of the original docked position. */ virtual void undock(FXint rootx,FXint rooty,FXbool notify=FALSE); /** * Change set of sides (a combination of ALLOW_TOP, ALLOW_LEFT, etc.), * where docking is allowed. The default is to allow docking on all sides. */ void allowedSides(FXuchar allow){ allowed=allow; } /** * Return set of sides where docking is allowed */ FXuchar allowedSides() const { return allowed; } /// Save toolbar to a stream virtual void save(FXStream& store) const; /// Load toolbar from a stream virtual void load(FXStream& store); /// Destroy virtual ~FXDockBar(); }; } #endif fox1.6-1.6.57/include/FXDockHandler.h000066400000000000000000000072201326741342000170460ustar00rootroot00000000000000/******************************************************************************** * * * D o c k H a n d l e r W i d g e t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDockHandler.h,v 1.3 2006/01/22 17:58:00 fox Exp $ * ********************************************************************************/ #ifndef FXDOCKHANDLER_H #define FXDOCKHANDLER_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /** * The dock handler exists as a common base class for tool bar grip * and dock title. */ class FXAPI FXDockHandler : public FXFrame { FXDECLARE_ABSTRACT(FXDockHandler) protected: FXString tip; // Tool tip FXString help; // Help string private: FXID xxx; protected: FXDockHandler(); private: FXDockHandler(const FXDockHandler&); FXDockHandler& operator=(const FXDockHandler&); public: long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); protected: FXDockHandler(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb); public: /// The grip can receive the focus virtual bool canFocus() const; /// Set the status line help text for grip void setHelpText(const FXString& text){ help=text; } /// Get the status line help text for grip const FXString& getHelpText() const { return help; } /// Set the tool tip message for the grip void setTipText(const FXString& text){ tip=text; } /// Get the tool tip message for the grip const FXString& getTipText() const { return tip; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXDockSite.h000066400000000000000000000153711326741342000164030ustar00rootroot00000000000000/******************************************************************************** * * * D o c k S i t e W i d g e t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDockSite.h,v 1.30 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXDOCKSITE_H #define FXDOCKSITE_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { class FXDockBar; /// Dock site options enum { DOCKSITE_WRAP = 0, /// Dockbars are wrapped to another galley when not enough space on current galley DOCKSITE_NO_WRAP = 0x00020000 /// Never wrap dockbars to another galley even if not enough space }; /** * The dock site widget is a widget where dock bars can be docked. * Dock site widgets are typically embedded inside the main window, placed * against those sides where docking of toolbars is to be allowed. * Dock bars placed inside a dock site are laid out in horizontal or vertical bands * called galleys. A toolbar with the LAYOUT_DOCK_SAME hint is preferentially placed * on the same galley as its previous sibling. A dock bar with the LAYOUT_DOCK_NEXT is * always placed on the next galley. * Each galley will have at least one dock bar shown in it. Several dock bars * may be placed side-by-side inside one galley, unless there is insufficient * room. If there is insufficient room to place another dock bar, that dock bar * will be moved to the next galley, even though its LAYOUT_DOCK_NEXT option * is not set. This implies that when the main window is resized and more room * becomes available, it will jump back to its preferred galley. * Within a galley, dock bars will be placed from left to right, at the given * x and y coordinates, with the constraints that the dock bar will stay within * the galley, and do not overlap each other. It is possible to use LAYOUT_FILL_X * and/or LAYOUT_FILL_Y to stretch a toolbar to the available space on its galley. * The galleys are oriented horizontally if the dock site is placed inside * a top level window using LAYOUT_SIDE_TOP or LAYOUT_SIDE_BOTTOM, and * vertically oriented if placed with LAYOUT_SIDE_LEFT or LAYOUT_SIDE_RIGHT. */ class FXAPI FXDockSite : public FXPacker { FXDECLARE(FXDockSite) protected: FXDockSite(){} private: FXDockSite(const FXDockSite&); FXDockSite &operator=(const FXDockSite&); protected: void moveVerBar(FXWindow* bar,FXWindow *begin,FXWindow* end,FXint bx,FXint by); void moveHorBar(FXWindow* bar,FXWindow *begin,FXWindow* end,FXint bx,FXint by); FXint galleyWidth(FXWindow *begin,FXWindow*& end,FXint space,FXint& require,FXint& expand) const; FXint galleyHeight(FXWindow *begin,FXWindow*& end,FXint space,FXint& require,FXint& expand) const; public: /** * Construct a toolbar dock layout manager. Passing LAYOUT_SIDE_TOP or LAYOUT_SIDE_BOTTOM * causes the toolbar dock to be oriented horizontally. Passing LAYOUT_SIDE_LEFT or * LAYOUT_SIDE_RIGHT causes it to be oriented vertically. */ FXDockSite(FXComposite *p,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=0,FXint pr=0,FXint pt=0,FXint pb=0,FXint hs=0,FXint vs=0); /** * Return default width. This is the width the toolbar * dock would have if no toolbars need to be moved to other * galleys than they would be logically placed. */ virtual FXint getDefaultWidth(); /** * Return default height. This is the height the toolbar * dock would have if no toolbars need to be moved to other * galleys than they would be logically placed. */ virtual FXint getDefaultHeight(); /** * For a vertically oriented dock site, this computes * the total width of all the galleys based on any "wrapping" * needed to fit the toolbars on a galley. */ virtual FXint getWidthForHeight(FXint h); /** * For a horizontally oriented dock site, this computes * the total height of all the galleys based on any "wrapping" * needed to fit the toolbars on a galley. */ virtual FXint getHeightForWidth(FXint w); /// Perform layout virtual void layout(); /** * Move tool bar, changing its options to suite the new position. * Used by the toolbar dragging to rearrange the toolbars inside the * toolbar dock. */ virtual void moveToolBar(FXDockBar* bar,FXint barx,FXint bary); /** * The dock site is notified that the given bar has been added * logically before the given window, and is to placed on a new * galley all by itself. The default implementation adjusts * the layout options of the bars accordingly. */ virtual void dockToolBar(FXDockBar* bar,FXWindow* before); /** * The dock site is informed that the given bar has been docked * at the given coordinates. The default implementation determines * where to insert the newly docked bar and adjusts the layout * options of the bars accordingly. */ virtual void dockToolBar(FXDockBar* bar,FXint barx,FXint bary); /** * The dock site is informed that the given bar has been removed. * In the default implementation, the dock site fixes the layout * options of the remaining bars so they stay in the same place * if possible. */ virtual void undockToolBar(FXDockBar* bar); /// Change wrap option void wrapGalleys(FXbool wrap); /// Get wrap option FXbool wrapGalleys() const; }; } #endif fox1.6-1.6.57/include/FXDockTitle.h000066400000000000000000000077031326741342000165600ustar00rootroot00000000000000/******************************************************************************** * * * D o c k T i t l e W i d g e t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDockTitle.h,v 1.3 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXDOCKTITLE_H #define FXDOCKTITLE_H #ifndef FXDOCKHANDLER_H #include "FXDockHandler.h" #endif namespace FX { /** * A dock title is used to move its container, a dock bar. * The dock title is also used simultaneously to provide a * caption above the dock bar. */ class FXAPI FXDockTitle : public FXDockHandler { FXDECLARE(FXDockTitle) protected: FXString caption; // Caption text FXFont *font; // Caption font FXColor captionColor; // Caption color protected: FXDockTitle(); private: FXDockTitle(const FXDockTitle&); FXDockTitle& operator=(const FXDockTitle&); public: long onPaint(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); public: /// Construct dock bar title widget FXDockTitle(FXComposite* p,const FXString& text,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_NORMAL|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=0,FXint pr=0,FXint pt=0,FXint pb=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Set the caption for the grip void setCaption(const FXString& text); /// Get the caption for the grip FXString getCaption() const { return caption; } /// Set caption font void setFont(FXFont *fnt); /// Get caption font FXFont* getFont() const { return font; } /// Get the current caption color FXColor getCaptionColor() const { return captionColor; } /// Set the current caption color void setCaptionColor(FXColor clr); /// Set the current justification mode. void setJustify(FXuint mode); /// Get the current justification mode. FXuint getJustify() const; /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy virtual ~FXDockTitle(); }; } #endif fox1.6-1.6.57/include/FXDocument.h000066400000000000000000000063431326741342000164530ustar00rootroot00000000000000/******************************************************************************** * * * D o c u m e n t O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDocument.h,v 1.16 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXDOCUMENT_H #define FXDOCUMENT_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { // Forward class FXWindow; /// Abstract base class for documents class FXAPI FXDocument : public FXObject { FXDECLARE(FXDocument) private: FXString title; // Title to appear above windows FXString filename; // File name to save to FXbool modified; // Document has been modified public: long onUpdTitle(FXObject*,FXSelector,void*); long onUpdFilename(FXObject*,FXSelector,void*); public: enum { ID_TITLE=10000, // Don't interfere with viewer's message id's ID_FILENAME, ID_LAST }; public: /// Constructor FXDocument(); /// Return true if document is modified FXbool isModified() const { return modified; } /// Set its modified state void setModified(FXbool mdfy=TRUE){ modified=mdfy; } /// Set document title void setTitle(const FXString& name); /// Get document title const FXString& getTitle() const { return title; } /// Set document filename void setFilename(const FXString& path); /// Get document filename const FXString& getFilename() const { return filename; } /// Save document to a stream virtual void save(FXStream& store) const; /// Load document from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXDocument(); }; } #endif fox1.6-1.6.57/include/FXDragCorner.h000066400000000000000000000065421326741342000167240ustar00rootroot00000000000000/******************************************************************************** * * * D r a g C o r n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDragCorner.h,v 1.15 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXDRAGCORNER_H #define FXDRAGCORNER_H #ifndef FXWINDOW_H #include "FXWindow.h" #endif namespace FX { /** * A drag corner widget may be placed in the bottom right corner * so as to allow the window to be resized more easily. */ class FXAPI FXDragCorner : public FXWindow { FXDECLARE(FXDragCorner) protected: FXColor hiliteColor; FXColor shadowColor; FXint oldw; FXint oldh; FXint xoff; FXint yoff; FXbool ewmh; protected: FXDragCorner(); private: FXDragCorner(const FXDragCorner&); FXDragCorner &operator=(const FXDragCorner&); public: long onPaint(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); public: /// Construct a drag corner FXDragCorner(FXComposite* p); /// Get default width virtual FXint getDefaultWidth(); /// Get default height virtual FXint getDefaultHeight(); /// Create all of the server-side resources for this window virtual void create(); /// Change highlight color void setHiliteColor(FXColor clr); /// Return current highlight color FXColor getHiliteColor() const { return hiliteColor; } /// Change shadow color void setShadowColor(FXColor clr); /// Return current shadow color FXColor getShadowColor() const { return shadowColor; } /// Save drag corner to a stream virtual void save(FXStream& store) const; /// Load drag corner from a stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXDrawable.h000066400000000000000000000062671326741342000164230ustar00rootroot00000000000000/******************************************************************************** * * * D r a w a b l e A r e a * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDrawable.h,v 1.25 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXDRAWABLE_H #define FXDRAWABLE_H #ifndef FXID_H #include "FXId.h" #endif namespace FX { class FXVisual; /** * Drawable is an abstract base class for any surface that can be * drawn upon, such as a FXWindow, or FXImage. */ class FXAPI FXDrawable : public FXId { FXDECLARE_ABSTRACT(FXDrawable) friend class FXDC; friend class FXDCWindow; protected: FXVisual *visual; // Visual for this window FXint width; // Width FXint height; // Height protected: FXDrawable(); FXDrawable(FXApp* a,FXint w,FXint h); private: FXDrawable(const FXDrawable&); FXDrawable &operator=(const FXDrawable&); #ifdef WIN32 virtual FXID GetDC() const { return NULL; } virtual int ReleaseDC(FXID) const { return 0; } #endif public: /// Width of drawable FXint getWidth() const { return width; } /// Height of drawable FXint getHeight() const { return height; } /// Get the visual FXVisual* getVisual() const { return visual; } /// Change visual void setVisual(FXVisual* vis); /// Resize drawable to the specified width and height virtual void resize(FXint w,FXint h); /// Save object to stream virtual void save(FXStream& store) const; /// Load object from stream virtual void load(FXStream& store); /// Cleanup virtual ~FXDrawable(); }; } #endif fox1.6-1.6.57/include/FXDriveBox.h000066400000000000000000000076331326741342000164220ustar00rootroot00000000000000/******************************************************************************** * * * D r i v e B o x W i d g e t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDriveBox.h,v 1.17 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXDRIVEBOX_H #define FXDRIVEBOX_H #ifndef FXLISTBOX_H #include "FXListBox.h" #endif namespace FX { class FXIcon; class FXFileDict; /// Drive Box options enum { DRIVEBOX_NO_OWN_ASSOC = 0x00020000 /// Do not create associations for files }; /// Directory Box class FXAPI FXDriveBox : public FXListBox { FXDECLARE(FXDriveBox) protected: FXFileDict *associations; // Association table FXIcon *foldericon; // Folder icons FXIcon *cdromicon; // CDROM icon FXIcon *harddiskicon; // Hard disk icon FXIcon *netdriveicon; // Networked drive icon FXIcon *floppyicon; // Floppy icon FXIcon *nethoodicon; // Network neighborhood icon FXIcon *zipdiskicon; // Zip drive icon protected: FXDriveBox(){} void listDrives(); private: FXDriveBox(const FXDriveBox&); FXDriveBox &operator=(const FXDriveBox&); public: long onListChanged(FXObject*,FXSelector,void*); long onListClicked(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); public: /// Constructor FXDriveBox(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_SUNKEN|FRAME_THICK|LISTBOX_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Set current drive FXbool setDrive(const FXString& drive); /// Return current drive FXString getDrive() const; /// Change file associations void setAssociations(FXFileDict* assoc); /// Return file associations FXFileDict* getAssociations() const { return associations; } /// Destructor virtual ~FXDriveBox(); }; } #endif fox1.6-1.6.57/include/FXElement.h000066400000000000000000000220121326741342000162550ustar00rootroot00000000000000/******************************************************************************** * * * Generic Element Handling * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXElement.h,v 1.19 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXELEMENT_H #define FXELEMENT_H namespace FX { /**************************** D e f i n i t i o n ****************************/ // Generic implementations for generic objects /// Construct some elements at a location template inline void constructElms(TYPE* ptr,unsigned long n){ while(n--){ ::new ((void*)ptr) TYPE; ptr++; } } /// Destruct some elements at a location template inline void destructElms(TYPE* ptr,unsigned long n){ while(n--){ ptr->~TYPE(); ptr++; } } /// Copy some elements from one place to another template inline void copyElms(TYPE* dst,const TYPE* src,unsigned long n){ while(n--){ *dst++ = *src++; } } /// Move some elements from overlapping place to another template inline void moveElms(TYPE* dst,const TYPE* src,unsigned long n){ if(src>dst){ while(n--){ *dst++ = *src++; } } else if(dst>src){ dst+=n; src+=n; while(n--){ *--dst = *--src; } } } /// Fill array of elements with given element template inline void fillElms(TYPE* dst,const TYPE& src,unsigned long n){ while(n--){ *dst++ = src; } } /// Zero out array of elements template inline void clearElms(TYPE* dst,unsigned long n){ memset(dst,0,sizeof(TYPE)*n); } /// Save some elements to persistent store template inline void saveElms(FXStream& store,const TYPE* ptr,unsigned long n){ while(n--){ store << *ptr; ptr++; } } /// Load some elements from persistent store template inline void loadElms(FXStream& store,TYPE* ptr,unsigned long n){ while(n--){ store >> *ptr; ptr++; } } /// Allocate array of elements, uninitialized template inline FXint allocElms(TYPE*& ptr,unsigned long n){ return fxmalloc((void**)&ptr,sizeof(TYPE)*n); } /// Allocate array of elements, initialized with zero template inline FXint callocElms(TYPE*& ptr,unsigned long n){ return fxcalloc((void**)&ptr,sizeof(TYPE)*n); } /// Allocate array of elements, initialized with bit-wise copy of src array template inline FXint dupElms(TYPE*& ptr,const TYPE* src,unsigned long n){ return fxmemdup((void**)&ptr,src,sizeof(TYPE)*n); } /// Resize array of elements, without constructor or destructor template inline FXint resizeElms(TYPE*& ptr,unsigned long n){ return fxresize((void**)&ptr,sizeof(TYPE)*n); } /// Free array of elements, without destruction template inline void freeElms(TYPE*& ptr){ fxfree((void**)&ptr); } /********************** I m p l e m e n t a t i o n ************************/ // Specific implementations for built-in types // No-op constructors for array of basic type inline void constructElms(FXuchar*,unsigned long){ } inline void constructElms(FXchar*,unsigned long){ } inline void constructElms(FXushort*,unsigned long){ } inline void constructElms(FXshort*,unsigned long){ } inline void constructElms(FXuint*,unsigned long){ } inline void constructElms(FXint*,unsigned long){ } inline void constructElms(FXfloat*,unsigned long){ } inline void constructElms(FXdouble*,unsigned long){ } // No-op destructors for array of basic type inline void destructElms(FXuchar*,unsigned long){ } inline void destructElms(FXchar*,unsigned long){ } inline void destructElms(FXushort*,unsigned long){ } inline void destructElms(FXshort*,unsigned long){ } inline void destructElms(FXuint*,unsigned long){ } inline void destructElms(FXint*,unsigned long){ } inline void destructElms(FXfloat*,unsigned long){ } inline void destructElms(FXdouble*,unsigned long){ } // Simple bit-wise copy for array of basic type inline void copyElms(FXuchar* dst,const FXuchar* src,unsigned long n){ memcpy(dst,src,n); } inline void copyElms(FXchar* dst,const FXchar* src,unsigned long n){ memcpy(dst,src,n); } inline void copyElms(FXushort* dst,const FXushort* src,unsigned long n){ memcpy(dst,src,n<<1); } inline void copyElms(FXshort* dst,const FXshort* src,unsigned long n){ memcpy(dst,src,n<<1); } inline void copyElms(FXuint* dst,const FXuint* src,unsigned long n){ memcpy(dst,src,n<<2); } inline void copyElms(FXint* dst,const FXint* src,unsigned long n){ memcpy(dst,src,n<<2); } inline void copyElms(FXfloat* dst,const FXfloat* src,unsigned long n){ memcpy(dst,src,n<<2); } inline void copyElms(FXdouble* dst,const FXdouble* src,unsigned long n){ memcpy(dst,src,n<<3); } // Simple bit-wise copy for array of pointers to any type template inline void copyElms(TYPE** dst,const TYPE** src,unsigned long n){ memcpy(dst,src,n*sizeof(void*)); } // Simple bit-wise move for array of basic type inline void moveElms(FXuchar* dst,const FXuchar* src,unsigned long n){ memmove(dst,src,n); } inline void moveElms(FXchar* dst,const FXchar* src,unsigned long n){ memmove(dst,src,n); } inline void moveElms(FXushort* dst,const FXushort* src,unsigned long n){ memmove(dst,src,n<<1); } inline void moveElms(FXshort* dst,const FXshort* src,unsigned long n){ memmove(dst,src,n<<1); } inline void moveElms(FXuint* dst,const FXuint* src,unsigned long n){ memmove(dst,src,n<<2); } inline void moveElms(FXint* dst,const FXint* src,unsigned long n){ memmove(dst,src,n<<2); } inline void moveElms(FXfloat* dst,const FXfloat* src,unsigned long n){ memmove(dst,src,n<<2); } inline void moveElms(FXdouble* dst,const FXdouble* src,unsigned long n){ memmove(dst,src,n<<3); } // Simple bit-wise move for array of pointers to any type template inline void moveElms(TYPE** dst,const TYPE** src,unsigned long n){ memmove(dst,src,n*sizeof(void*)); } // Fill byte arrays with constant inline void fillElms(FXuchar* dst,const FXuchar& src,unsigned long n){ memset(dst,src,n); } inline void fillElms(FXchar* dst,const FXchar& src,unsigned long n){ memset(dst,src,n); } // Type-safe save for basic types inline void saveElms(FXStream& store,const FXuchar* ptr,unsigned long n){ store.save(ptr,n); } inline void saveElms(FXStream& store,const FXchar* ptr,unsigned long n){ store.save(ptr,n); } inline void saveElms(FXStream& store,const FXushort* ptr,unsigned long n){ store.save(ptr,n); } inline void saveElms(FXStream& store,const FXshort* ptr,unsigned long n){ store.save(ptr,n); } inline void saveElms(FXStream& store,const FXuint* ptr,unsigned long n){ store.save(ptr,n); } inline void saveElms(FXStream& store,const FXint* ptr,unsigned long n){ store.save(ptr,n); } inline void saveElms(FXStream& store,const FXfloat* ptr,unsigned long n){ store.save(ptr,n); } inline void saveElms(FXStream& store,const FXdouble* ptr,unsigned long n){ store.save(ptr,n); } // Type-safe load for basic types inline void loadElms(FXStream& store,FXuchar* ptr,unsigned long n){ store.load(ptr,n); } inline void loadElms(FXStream& store,FXchar* ptr,unsigned long n){ store.load(ptr,n); } inline void loadElms(FXStream& store,FXushort* ptr,unsigned long n){ store.load(ptr,n); } inline void loadElms(FXStream& store,FXshort* ptr,unsigned long n){ store.load(ptr,n); } inline void loadElms(FXStream& store,FXuint* ptr,unsigned long n){ store.load(ptr,n); } inline void loadElms(FXStream& store,FXint* ptr,unsigned long n){ store.load(ptr,n); } inline void loadElms(FXStream& store,FXfloat* ptr,unsigned long n){ store.load(ptr,n); } inline void loadElms(FXStream& store,FXdouble* ptr,unsigned long n){ store.load(ptr,n); } } #endif fox1.6-1.6.57/include/FXException.h000066400000000000000000000107041326741342000166270ustar00rootroot00000000000000/******************************************************************************** * * * E x c e p t i o n T y p e s * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXException.h,v 1.14 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXEXCEPTION_H #define FXEXCEPTION_H namespace FX { /// Generic catch-all exception class FXAPI FXException { private: const FXchar *message; private: static const FXchar exceptionName[]; public: FXException():message(FXException::exceptionName){} FXException(const FXchar *msg):message(msg){} const FXchar *what() const { return message; } ~FXException(){} }; /// Generic error exception class FXAPI FXErrorException : public FXException { private: static const FXchar exceptionName[]; public: FXErrorException():FXException(FXErrorException::exceptionName){} FXErrorException(const FXchar *msg):FXException(msg){} }; /// Index out of range class FXAPI FXRangeException : public FXErrorException { private: static const FXchar exceptionName[]; public: FXRangeException():FXErrorException(FXRangeException::exceptionName){} FXRangeException(const FXchar *msg):FXErrorException(msg){} }; /// Invalid pointer class FXAPI FXPointerException : public FXErrorException { private: static const FXchar exceptionName[]; public: FXPointerException():FXErrorException(FXPointerException::exceptionName){} FXPointerException(const FXchar *msg):FXErrorException(msg){} }; /// Generic resource exception class FXAPI FXResourceException : public FXException { private: static const FXchar exceptionName[]; public: FXResourceException():FXException(FXResourceException::exceptionName){} FXResourceException(const FXchar *msg):FXException(msg){} }; /// Out of memory class FXAPI FXMemoryException : public FXResourceException { private: static const FXchar exceptionName[]; public: FXMemoryException():FXResourceException(FXMemoryException::exceptionName){} FXMemoryException(const FXchar *msg):FXResourceException(msg){} }; /// Window exception class FXAPI FXWindowException : public FXResourceException { private: static const FXchar exceptionName[]; public: FXWindowException():FXResourceException(FXWindowException::exceptionName){} FXWindowException(const FXchar *msg):FXResourceException(msg){} }; /// Image, cursor, bitmap exception class FXAPI FXImageException : public FXResourceException { private: static const FXchar exceptionName[]; public: FXImageException():FXResourceException(FXImageException::exceptionName){} FXImageException(const FXchar *msg):FXResourceException(msg){} }; /// Font exception class FXAPI FXFontException : public FXResourceException { private: static const FXchar exceptionName[]; public: FXFontException():FXResourceException(FXFontException::exceptionName){} FXFontException(const FXchar *msg):FXResourceException(msg){} }; } #endif fox1.6-1.6.57/include/FXExpression.h000066400000000000000000000072261326741342000170350ustar00rootroot00000000000000/******************************************************************************** * * * E x p r e s s i o n E v a l u a t o r * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXExpression.h,v 1.13 2006/03/21 01:41:43 fox Exp $ * ********************************************************************************/ #ifndef FXEXPRESSION_H #define FXEXPRESSION_H namespace FX { /// Expression error codes enum FXExpressionError { EXPRERR_OK, EXPRERR_EMPTY, /// Empty input EXPRERR_MEMORY, /// Out of memory EXPRERR_PAREN, /// Unmatched parentheses EXPRERR_TOKEN, /// Illegal token EXPRERR_COMMA, /// Expected comma EXPRERR_IDENT /// Unknown identifier }; /// Expression class FXAPI FXExpression { private: FXuchar *code; private: static const FXuchar initial[]; static const FXchar *const errors[]; public: /// Construct empty expression object FXExpression(); /// Copy expression object FXExpression(const FXExpression& orig); /// Compile expression; if error is not NULL, error code is returned FXExpression(const FXchar* expression,const FXchar* variables=NULL,FXExpressionError* error=NULL); /// Compile expression; if error is not NULL, error code is returned FXExpression(const FXString& expression,const FXString& variables=FXString::null,FXExpressionError* error=NULL); /// Assign another expression to this one FXExpression& operator=(const FXExpression& orig); /// See if expression is empty bool empty() const { return (code==initial); } /// Evaluate expression with given arguments, if any FXdouble evaluate(const FXdouble *args=NULL); /// Parse expression, return error code if syntax error is found FXExpressionError parse(const FXchar* expression,const FXchar* variables=NULL); /// Parse expression, return error code if syntax error is found FXExpressionError parse(const FXString& expression,const FXString& variables=FXString::null); /// Returns error code for given error static const FXchar* getError(FXExpressionError err){ return errors[err]; } /// Delete ~FXExpression(); }; } #endif fox1.6-1.6.57/include/FXExtentd.h000066400000000000000000000114031326741342000163010ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n E x t e n t C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXExtentd.h,v 1.8.2.1 2006/07/25 01:35:36 fox Exp $ * ********************************************************************************/ #ifndef FXEXTENTD_H #define FXEXTENTD_H namespace FX { /// Extent class FXAPI FXExtentd { public: FXVec2d lower; FXVec2d upper; public: /// Default constructor FXExtentd(){} /// Copy constructor FXExtentd(const FXExtentd& ext):lower(ext.lower),upper(ext.upper){} /// Initialize from two vectors FXExtentd(const FXVec2d& lo,const FXVec2d& hi):lower(lo),upper(hi){} /// Initialize from six numbers FXExtentd(FXdouble xlo,FXdouble xhi,FXdouble ylo,FXdouble yhi):lower(xlo,ylo),upper(xhi,yhi){} /// Assignment FXExtentd& operator=(const FXExtentd& ext){ lower=ext.lower; upper=ext.upper; return *this; } /// Indexing with 0..1 FXVec2d& operator[](FXint i){ return (&lower)[i]; } /// Indexing with 0..1 const FXVec2d& operator[](FXint i) const { return (&lower)[i]; } /// Comparison bool operator==(const FXExtentd& ext) const { return lower==ext.lower && upper==ext.upper;} bool operator!=(const FXExtentd& ext) const { return lower!=ext.lower || upper!=ext.upper;} /// Width of box FXdouble width() const { return upper.x-lower.x; } /// Height of box FXdouble height() const { return upper.y-lower.y; } /// Longest side FXdouble longest() const; /// shortest side FXdouble shortest() const; /// Length of diagonal FXdouble diameter() const; /// Get radius of box FXdouble radius() const; /// Compute diagonal FXVec2d diagonal() const; /// Get center of box FXVec2d center() const; /// Test if empty bool empty() const; /// Test if box contains point x,y bool contains(FXdouble x,FXdouble y) const; /// Test if box contains point p bool contains(const FXVec2d& p) const; /// Test if box properly contains another box bool contains(const FXExtentd& ext) const; /// Include point FXExtentd& include(FXdouble x,FXdouble y); /// Include point FXExtentd& include(const FXVec2d& v); /// Include given range into extent FXExtentd& include(const FXExtentd& ext); /// Test if bounds overlap friend FXAPI bool overlap(const FXExtentd& a,const FXExtentd& b); /// Get corner number 0..3 FXVec2d corner(FXint c) const { return FXVec2d((&lower)[c&1].x, (&lower)[(c>>1)&1].y); } /// Union of two boxes friend FXAPI FXExtentd unite(const FXExtentd& a,const FXExtentd& b); /// Intersection of two boxes friend FXAPI FXExtentd intersect(const FXExtentd& a,const FXExtentd& b); /// Save object to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXExtentd& ext); /// Load object from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXExtentd& ext); }; extern FXAPI bool overlap(const FXExtentd& a,const FXExtentd& b); extern FXAPI FXExtentd unite(const FXExtentd& a,const FXExtentd& b); extern FXAPI FXExtentd intersect(const FXExtentd& a,const FXExtentd& b); extern FXAPI FXStream& operator<<(FXStream& store,const FXExtentd& ext); extern FXAPI FXStream& operator>>(FXStream& store,FXExtentd& ext); } #endif fox1.6-1.6.57/include/FXExtentf.h000066400000000000000000000113651326741342000163120ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n E x t e n t C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXExtentf.h,v 1.8.2.1 2006/07/25 01:35:36 fox Exp $ * ********************************************************************************/ #ifndef FXEXTENTF_H #define FXEXTENTF_H namespace FX { /// Extent class FXAPI FXExtentf { public: FXVec2f lower; FXVec2f upper; public: /// Default constructor FXExtentf(){} /// Copy constructor FXExtentf(const FXExtentf& ext):lower(ext.lower),upper(ext.upper){} /// Initialize from two vectors FXExtentf(const FXVec2f& lo,const FXVec2f& hi):lower(lo),upper(hi){} /// Initialize from six numbers FXExtentf(FXfloat xlo,FXfloat xhi,FXfloat ylo,FXfloat yhi):lower(xlo,ylo),upper(xhi,yhi){} /// Assignment FXExtentf& operator=(const FXExtentf& ext){ lower=ext.lower; upper=ext.upper; return *this; } /// Indexing with 0..1 FXVec2f& operator[](FXint i){ return (&lower)[i]; } /// Indexing with 0..1 const FXVec2f& operator[](FXint i) const { return (&lower)[i]; } /// Comparison bool operator==(const FXExtentf& ext) const { return lower==ext.lower && upper==ext.upper;} bool operator!=(const FXExtentf& ext) const { return lower!=ext.lower || upper!=ext.upper;} /// Width of box FXfloat width() const { return upper.x-lower.x; } /// Height of box FXfloat height() const { return upper.y-lower.y; } /// Longest side FXfloat longest() const; /// shortest side FXfloat shortest() const; /// Length of diagonal FXfloat diameter() const; /// Get radius of box FXfloat radius() const; /// Compute diagonal FXVec2f diagonal() const; /// Get center of box FXVec2f center() const; /// Test if empty bool empty() const; /// Test if box contains point x,y bool contains(FXfloat x,FXfloat y) const; /// Test if box contains point p bool contains(const FXVec2f& p) const; /// Test if box properly contains another box bool contains(const FXExtentf& ext) const; /// Include point FXExtentf& include(FXfloat x,FXfloat y); /// Include point FXExtentf& include(const FXVec2f& v); /// Include given range into extent FXExtentf& include(const FXExtentf& ext); /// Test if bounds overlap friend FXAPI bool overlap(const FXExtentf& a,const FXExtentf& b); /// Get corner number 0..3 FXVec2f corner(FXint c) const { return FXVec2f((&lower)[c&1].x, (&lower)[(c>>1)&1].y); } /// Union of two boxes friend FXAPI FXExtentf unite(const FXExtentf& a,const FXExtentf& b); /// Intersection of two boxes friend FXAPI FXExtentf intersect(const FXExtentf& a,const FXExtentf& b); /// Save object to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXExtentf& ext); /// Load object from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXExtentf& ext); }; extern FXAPI bool overlap(const FXExtentf& a,const FXExtentf& b); extern FXAPI FXExtentf unite(const FXExtentf& a,const FXExtentf& b); extern FXAPI FXExtentf intersect(const FXExtentf& a,const FXExtentf& b); extern FXAPI FXStream& operator<<(FXStream& store,const FXExtentf& ext); extern FXAPI FXStream& operator>>(FXStream& store,FXExtentf& ext); } #endif fox1.6-1.6.57/include/FXFile.h000066400000000000000000000116611326741342000155530ustar00rootroot00000000000000/******************************************************************************** * * * F i l e C l a s s * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFile.h,v 1.100 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXFILE_H #define FXFILE_H #ifndef FXIO_H #include "FXIO.h" #endif namespace FX { /** * Low level file access. */ class FXAPI FXFile : public FXIO { private: FXFile(const FXFile&); FXFile &operator=(const FXFile&); public: /// Construct file FXFile(){ } /// Construct file and attach existing handle h FXFile(FXInputHandle handle,FXuint mode); /// Construct and open a file FXFile(const FXString& file,FXuint mode=FXIO::Reading,FXuint perm=FXIO::OwnerReadWrite|FXIO::GroupReadWrite|FXIO::OtherReadWrite); /// Open file virtual bool open(const FXString& file,FXuint mode=FXIO::Reading,FXuint perm=FXIO::OwnerReadWrite|FXIO::GroupReadWrite|FXIO::OtherReadWrite); /// Open device with access mode and handle virtual bool open(FXInputHandle handle,FXuint mode); /// Get current file position virtual FXlong position() const; /// Change file position, returning new position from start virtual FXlong position(FXlong offset,FXuint from=FXIO::Begin); /// Read block of bytes, returning number of bytes read virtual FXival readBlock(void* data,FXival count); /// Write block of bytes, returning number of bytes written virtual FXival writeBlock(const void* data,FXival count); /// Truncate file virtual FXlong truncate(FXlong size); /// Flush to disk virtual bool flush(); /// Return file size virtual FXlong size(); /// Test if we're at the end virtual bool eof(); /// Close file virtual bool close(); /// Create new (empty) file static bool create(const FXString& file,FXuint perm=FXIO::OwnerReadWrite|FXIO::GroupReadWrite|FXIO::OtherReadWrite); /// Remove file static bool remove(const FXString& file); /// Rename or move srcfile to dstfile, replacing dstfile if it exists static bool rename(const FXString& srcfile,const FXString& dstfile); /// Link file static bool link(const FXString& srcfile,const FXString& dstfile); /// Read symbolic link static FXString symlink(const FXString& file); /// Symbolic link file static bool symlink(const FXString& srcfile,const FXString& dstfile); /// Return true if files are identical static bool identical(const FXString& file1,const FXString& file2); /// Copy srcfile to dstfile, overwriting dstfile if allowed static bool copy(const FXString& srcfile,const FXString& dstfile,bool overwrite=false); /// Concatenate srcfile1 and srcfile2 to dstfile, overwriting dstfile if allowed static bool concat(const FXString& srcfile1,const FXString& srcfile2,const FXString& dstfile,bool overwrite=false); /// Recursively copy files or directories from srcfile to dstfile, overwriting dstfile if allowed static bool copyFiles(const FXString& srcfile,const FXString& dstfile,bool overwrite=false); /// Recursively copy or move files or directories from srcfile to dstfile, overwriting dstfile if allowed static bool moveFiles(const FXString& srcfile,const FXString& dstfile,bool overwrite=false); /// Recursively remove file or directory, recurse if allowed static bool removeFiles(const FXString& path,bool recursive=false); /// Destroy virtual ~FXFile(); }; } #endif fox1.6-1.6.57/include/FXFileDialog.h000066400000000000000000000146651326741342000167020ustar00rootroot00000000000000/******************************************************************************** * * * F i l e S e l e c t i o n D i a l o g * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFileDialog.h,v 1.34 2006/01/23 06:03:15 fox Exp $ * ********************************************************************************/ #ifndef FXFILEDIALOG_H #define FXFILEDIALOG_H #ifndef FXDIALOGBOX_H #include "FXDialogBox.h" #endif namespace FX { class FXFileSelector; /// File selection dialog class FXAPI FXFileDialog : public FXDialogBox { FXDECLARE(FXFileDialog) protected: FXFileSelector *filebox; protected: FXFileDialog(){} void initdialog(); private: FXFileDialog(const FXFileDialog&); FXFileDialog &operator=(const FXFileDialog&); public: /// Construct file dialog box FXFileDialog(FXWindow* owner,const FXString& name,FXuint opts=0,FXint x=0,FXint y=0,FXint w=500,FXint h=300); /// Construct free-floating file dialog box FXFileDialog(FXApp* a,const FXString& name,FXuint opts=0,FXint x=0,FXint y=0,FXint w=500,FXint h=300); /// Hide this window virtual void hide(); /// Change file name void setFilename(const FXString& path); /// Return file name, if any FXString getFilename() const; /// Return empty-string terminated list of selected file names, or NULL if none selected FXString* getFilenames() const; /// Change file pattern void setPattern(const FXString& ptrn); /// Return file pattern FXString getPattern() const; /** * Change the list of file patterns shown in the file dialog. * Each pattern comprises an optional name, followed by a pattern in * parentheses. The patterns are separated by newlines. * For example, * * "*\n*.cpp,*.cc\n*.hpp,*.hh,*.h" * * and * * "All Files (*)\nC++ Sources (*.cpp,*.cc)\nC++ Headers (*.hpp,*.hh,*.h)" * * will set the same three patterns, but the former shows no pattern names. */ void setPatternList(const FXString& patterns); /// Return list of patterns FXString getPatternList() const; /** * After setting the list of patterns, this call will * initially select pattern n as the active one. */ void setCurrentPattern(FXint n); /// Return current pattern number FXint getCurrentPattern() const; /// Get pattern text for given pattern number FXString getPatternText(FXint patno) const; /// Change pattern text for pattern number void setPatternText(FXint patno,const FXString& text); /// Return number of patterns FXint getNumPatterns() const; /// Allow pattern entry void allowPatternEntry(FXbool allow); /// Return TRUE if pattern entry is allowed FXbool allowPatternEntry() const; /// Change directory void setDirectory(const FXString& path); /// Return directory FXString getDirectory() const; /// Set the inter-item spacing (in pixels) void setItemSpace(FXint s); /// Return the inter-item spacing (in pixels) FXint getItemSpace() const; /// Change file selection mode void setSelectMode(FXuint mode); /// Return file selection mode FXuint getSelectMode() const; /// Change wildcard matching mode void setMatchMode(FXuint mode); /// Return wildcard matching mode FXuint getMatchMode() const; /// Return TRUE if showing hidden files FXbool showHiddenFiles() const; /// Show or hide hidden files void showHiddenFiles(FXbool showing); /// Return TRUE if image preview on FXbool showImages() const; /// Show or hide preview images void showImages(FXbool showing); /// Return images preview size FXint getImageSize() const; /// Change images preview size void setImageSize(FXint size); /// Show readonly button void showReadOnly(FXbool show); /// Return TRUE if readonly is shown FXbool shownReadOnly() const; /// Set initial state of readonly button void setReadOnly(FXbool state); /// Get readonly state FXbool getReadOnly() const; /// Change File List style void setFileBoxStyle(FXuint style); /// Return File List style FXuint getFileBoxStyle() const; /// Allow or disallow navigation void allowNavigation(FXbool navigable); /// Is navigation allowed? FXbool allowNavigation() const; /// Open existing filename static FXString getOpenFilename(FXWindow* owner,const FXString& caption,const FXString& path,const FXString& patterns="*",FXint initial=0); /// Open multiple existing files static FXString* getOpenFilenames(FXWindow* owner,const FXString& caption,const FXString& path,const FXString& patterns="*",FXint initial=0); /// Save to filename static FXString getSaveFilename(FXWindow* owner,const FXString& caption,const FXString& path,const FXString& patterns="*",FXint initial=0); /// Open directory name static FXString getOpenDirectory(FXWindow* owner,const FXString& caption,const FXString& path); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destructor virtual ~FXFileDialog(); }; } #endif fox1.6-1.6.57/include/FXFileDict.h000066400000000000000000000216441326741342000163610ustar00rootroot00000000000000/******************************************************************************** * * * F i l e - A s s o c i a t i o n T a b l e * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFileDict.h,v 1.31 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXFILEDICT_H #define FXFILEDICT_H #ifndef FXDICT_H #include "FXDict.h" #endif namespace FX { class FXIconDict; /// Registers stuff to know about the extension struct FXFileAssoc { FXString command; /// Command to execute FXString extension; /// Full extension name FXString mimetype; /// Mime type name FXIcon *bigicon; /// Big normal icon FXIcon *bigiconopen; /// Big open icon FXIcon *miniicon; /// Mini normal icon FXIcon *miniiconopen; /// Mini open icon FXDragType dragtype; /// Registered drag type FXuint flags; /// Flags; 1=cd, 2=term }; /** * The File Association dictionary associates a file extension with a File * Association record which contains command name, mime type, icons, and other * information about the file type. The icons referenced by the file association * are managed by the Icon Dictionary; this guarantees that each icon is loaded * only once into memory. * The associations are determined by the information by the FOX Registry settings; * each entry under the FILETYPES registry section comprises the command line, * extension name, large icon, small icon, and mime type: * * command ';' extension ';' bigicon [ ':' bigiconopen ] ';' icon [ ':' iconopen ] ';' mime [ ';' flags ] * * For example, the binding for "jpg" could be: * * xv %s &;JPEG Image;bigimage.xpm;miniimage.xpm;image/jpeg;term * * The association for a file name is determined by first looking at the entire * file name, then at the whole extension, and then at sub-extensions. * For example, "name.tar.gz", "tar.gz", and "gz" can each be given a different * file association. Directory names may also be given associations; there is * no command-line association for a directory, however. The association for a * directory is found by first checking the whole pathname, then checking the * pathname less the first component, and so on. So, "/usr/local/include", * "/local/include", and "/include" can each be given their own file associations. * If the above lookup procedure has not found a file association, the system * uses a fallback associations: for files, the fallback association is determined * by the binding "defaultfilebinding". For directories, the "defaultdirbinding" * is used, and for executables the "defaultexecbinding" is used. * The flags field is used for a number of bit-flags; two flags are currently * defined: 'cd' and 'term'. The first one is intended to cause a launcher * to execute the application in the shown directory; the second one is meant * to indicate that the application is to be ran inside a new terminal. */ class FXAPI FXFileDict : public FXDict { FXDECLARE(FXFileDict) private: FXSettings *settings; // Settings database where to get bindings FXIconDict *icons; // Icon dictionary which keeps track of loaded icons protected: FXFileDict(){} virtual void *createData(const void*); virtual void deleteData(void*); private: FXFileDict(const FXFileDict&); FXFileDict &operator=(const FXFileDict&); public: /// Registry key used to find fallback executable icons static const FXchar defaultExecBinding[]; /// Registry key used to find fallback directory icons static const FXchar defaultDirBinding[]; /// Registry key used to find fallback document icons static const FXchar defaultFileBinding[]; public: /** * Construct a dictionary mapping file-extension to file associations, * using the application registry settings as a source for the bindings. * The pointer to the application class is passed down to the icon source * which is inside the icon dictionary. */ FXFileDict(FXApp* app); /** * Construct a dictionary mapping file-extension to file associations, * using the specified settings database as a source for the bindings. * The pointer to the application class is passed down to the icon source * which is inside the icon dictionary. */ FXFileDict(FXApp* app,FXSettings* db); /// Change settings database void setSettings(FXSettings* s){ settings=s; } /// Return settings database FXSettings* getSettings() const { return settings; } /// Change icon dictionary void setIconDict(FXIconDict *icns){ icons=icns; } /// Return icon dictionary FXIconDict* getIconDict() const { return icons; } /** * Set icon search path; the initial search path is determined by the * "iconpath" registry setting in the SETTINGS section. */ void setIconPath(const FXString& path); /// Return current icon search path const FXString& getIconPath() const; /** * Replace file association. * The new association is written into the settings database under the * FILETYPES section; the format of the association is as follows: * * = " ; ; [ : ] ; [ : ] ; " * * Where is the command used to launch the application (e.g. "xv %s &"), * and is the file type string (e.g. "GIF Image"), * and are the large icons shown in "Icons" mode, * and are the small icons shown in "Details" mode, * and is the RFC2045 mime type of the file. * * For example: * * [FILETYPES] * gif="xv %s &;GIF Image;big.xpm:bigopen.xpm;mini.xpm:miniopen.xpm;image/gif" * /home/jeroen=";Home;home.xpm;minihome.xpm;application/x-folder" * */ FXFileAssoc* replace(const FXchar* ext,const FXchar* str); /// Remove file association FXFileAssoc* remove(const FXchar* ext); /// Find file association from registry FXFileAssoc* find(const FXchar* ext); /** * Determine binding for the given file. * The default implementation tries the whole filename first, * then tries the extensions. * For example, for a file "source.tar.gz": * * "source.tar.gz", * "tar.gz", * "gz" * * are tried in succession. If no association is found the * key "defaultfilebinding" is tried as a fallback association. * A NULL is returned if no association of any kind is found. */ virtual FXFileAssoc* findFileBinding(const FXchar* pathname); /** * Find directory binding from registry. * The default implementation tries the whole pathname first, * then tries successively smaller parts of the path. * For example, a pathname "/usr/people/jeroen": * * "/usr/people/jeroen" * "/people/jeroen" * "/jeroen" * * are tried in succession. If no bindings are found, the * key "defaultdirbinding" is tried as a fallback association. * A NULL is returned if no association of any kind is found. */ virtual FXFileAssoc* findDirBinding(const FXchar* pathname); /** * Determine binding for the given executable. * The default implementation returns the fallback binding associated with * the key "defaultexecbinding". * A NULL is returned if no association of any kind is found. */ virtual FXFileAssoc* findExecBinding(const FXchar* pathname); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destructor virtual ~FXFileDict(); }; } #endif fox1.6-1.6.57/include/FXFileList.h000066400000000000000000000331541326741342000164100ustar00rootroot00000000000000/******************************************************************************** * * * F i l e L i s t W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFileList.h,v 1.57 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXFILELIST_H #define FXFILELIST_H #ifndef FXICONLIST_H #include "FXIconList.h" #endif namespace FX { struct FXFileAssoc; class FXFileDict; class FXFileList; class FXIcon; class FXIconSource; class FXIconDict; /// File List options enum { FILELIST_SHOWHIDDEN = 0x04000000, /// Show hidden files or directories FILELIST_SHOWDIRS = 0x08000000, /// Show only directories FILELIST_SHOWFILES = 0x10000000, /// Show only files FILELIST_SHOWIMAGES = 0x20000000, /// Show preview of images FILELIST_NO_OWN_ASSOC = 0x40000000, /// Do not create associations for files FILELIST_NO_PARENT = 0x80000000 /// Suppress display of '.' and '..' }; /// File item class FXAPI FXFileItem : public FXIconItem { FXDECLARE(FXFileItem) friend class FXFileList; protected: FXFileAssoc *assoc; // File association record FXFileItem *link; // Link to next item FXlong size; // File size FXTime date; // File time private: FXFileItem(const FXFileItem&); FXFileItem& operator=(const FXFileItem&); protected: FXFileItem():assoc(NULL),link(NULL),size(0),date(0){} protected: enum{ FOLDER = 64, // Directory item EXECUTABLE = 128, // Executable item SYMLINK = 256, // Symbolic linked item CHARDEV = 512, // Character special item BLOCKDEV = 1024, // Block special item FIFO = 2048, // FIFO item SOCK = 4096, // Socket item SHARE = 8192 // Share }; public: /// Constructor FXFileItem(const FXString& text,FXIcon* bi=NULL,FXIcon* mi=NULL,void* ptr=NULL):FXIconItem(text,bi,mi,ptr),assoc(NULL),link(NULL),size(0L),date(0){} /// Return true if this is a file item FXbool isFile() const { return (state&(FOLDER|BLOCKDEV|CHARDEV|FIFO|SOCK|SHARE))==0; } /// Return true if this is a directory item FXbool isDirectory() const { return (state&FOLDER)!=0; } /// Return true if this is a share item FXbool isShare() const { return (state&SHARE)!=0; } /// Return true if this is an executable item FXbool isExecutable() const { return (state&EXECUTABLE)!=0; } /// Return true if this is a symbolic link item FXbool isSymlink() const { return (state&SYMLINK)!=0; } /// Return true if this is a character device item FXbool isChardev() const { return (state&CHARDEV)!=0; } /// Return true if this is a block device item FXbool isBlockdev() const { return (state&BLOCKDEV)!=0; } /// Return true if this is an FIFO item FXbool isFifo() const { return (state&FIFO)!=0; } /// Return true if this is a socket FXbool isSocket() const { return (state&SOCK)!=0; } /// Return the file-association object for this item FXFileAssoc* getAssoc() const { return assoc; } /// Return the file size for this item FXlong getSize() const { return size; } /// Return the date for this item FXTime getDate() const { return date; } }; /** * A File List widget provides an icon rich view of the file system. * It automatically updates itself periodically by re-scanning the file system * for any changes. As it scans the displayed directory, it automatically * determines the icons to be displayed by consulting the file associations registry * settings. A number of messages can be sent to the File List to control the * filter pattern, sort category, sorting order, case sensitivity, and hidden file * display mode. * The File list widget supports drags and drops of files. */ class FXAPI FXFileList : public FXIconList { FXDECLARE(FXFileList) protected: FXString directory; // Current directory FXString orgdirectory; // Original directory FXString dropdirectory; // Drop directory FXDragAction dropaction; // Drop action FXString dragfiles; // Dragged files FXFileDict *associations; // Association table FXFileItem *list; // File item list FXString pattern; // Pattern of file names FXuint matchmode; // File wildcard match mode FXuint counter; // Refresh counter FXint imagesize; // Image size FXTime timestamp; // Time when last refreshed FXIcon *big_folder; // Big folder icon FXIcon *mini_folder; // Mini folder icon FXIcon *big_doc; // Big document icon FXIcon *mini_doc; // Mini document icon FXIcon *big_app; // Big application icon FXIcon *mini_app; // Mini application icon protected: FXFileList(); virtual FXIconItem *createItem(const FXString& text,FXIcon *big,FXIcon* mini,void* ptr); void listItems(FXbool force); private: FXFileList(const FXFileList&); FXFileList &operator=(const FXFileList&); public: long onOpenTimer(FXObject*,FXSelector,void*); long onRefreshTimer(FXObject*,FXSelector,void*); long onDNDEnter(FXObject*,FXSelector,void*); long onDNDLeave(FXObject*,FXSelector,void*); long onDNDMotion(FXObject*,FXSelector,void*); long onDNDDrop(FXObject*,FXSelector,void*); long onDNDRequest(FXObject*,FXSelector,void*); long onBeginDrag(FXObject*,FXSelector,void*); long onEndDrag(FXObject*,FXSelector,void*); long onDragged(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdDirectoryUp(FXObject*,FXSelector,void*); long onUpdDirectoryUp(FXObject*,FXSelector,void*); long onCmdSortByName(FXObject*,FXSelector,void*); long onUpdSortByName(FXObject*,FXSelector,void*); long onCmdSortByType(FXObject*,FXSelector,void*); long onUpdSortByType(FXObject*,FXSelector,void*); long onCmdSortBySize(FXObject*,FXSelector,void*); long onUpdSortBySize(FXObject*,FXSelector,void*); long onCmdSortByTime(FXObject*,FXSelector,void*); long onUpdSortByTime(FXObject*,FXSelector,void*); long onCmdSortByUser(FXObject*,FXSelector,void*); long onUpdSortByUser(FXObject*,FXSelector,void*); long onCmdSortByGroup(FXObject*,FXSelector,void*); long onUpdSortByGroup(FXObject*,FXSelector,void*); long onCmdSortReverse(FXObject*,FXSelector,void*); long onUpdSortReverse(FXObject*,FXSelector,void*); long onCmdSortCase(FXObject*,FXSelector,void*); long onUpdSortCase(FXObject*,FXSelector,void*); long onCmdSetPattern(FXObject*,FXSelector,void*); long onUpdSetPattern(FXObject*,FXSelector,void*); long onCmdSetDirectory(FXObject*,FXSelector,void*); long onUpdSetDirectory(FXObject*,FXSelector,void*); long onCmdToggleHidden(FXObject*,FXSelector,void*); long onUpdToggleHidden(FXObject*,FXSelector,void*); long onCmdShowHidden(FXObject*,FXSelector,void*); long onUpdShowHidden(FXObject*,FXSelector,void*); long onCmdHideHidden(FXObject*,FXSelector,void*); long onUpdHideHidden(FXObject*,FXSelector,void*); long onCmdToggleImages(FXObject*,FXSelector,void*); long onUpdToggleImages(FXObject*,FXSelector,void*); long onCmdHeader(FXObject*,FXSelector,void*); long onUpdHeader(FXObject*,FXSelector,void*); long onCmdRefresh(FXObject*,FXSelector,void*); public: static FXint ascending(const FXIconItem* a,const FXIconItem* b); static FXint descending(const FXIconItem* a,const FXIconItem* b); static FXint ascendingCase(const FXIconItem* a,const FXIconItem* b); static FXint descendingCase(const FXIconItem* a,const FXIconItem* b); static FXint ascendingType(const FXIconItem* a,const FXIconItem* b); static FXint descendingType(const FXIconItem* a,const FXIconItem* b); static FXint ascendingSize(const FXIconItem* a,const FXIconItem* b); static FXint descendingSize(const FXIconItem* a,const FXIconItem* b); static FXint ascendingTime(const FXIconItem* a,const FXIconItem* b); static FXint descendingTime(const FXIconItem* a,const FXIconItem* b); static FXint ascendingUser(const FXIconItem* a,const FXIconItem* b); static FXint descendingUser(const FXIconItem* a,const FXIconItem* b); static FXint ascendingGroup(const FXIconItem* a,const FXIconItem* b); static FXint descendingGroup(const FXIconItem* a,const FXIconItem* b); public: enum { ID_REFRESHTIMER=FXIconList::ID_LAST, ID_OPENTIMER, ID_SORT_BY_NAME, /// Sort by name ID_SORT_BY_TYPE, /// Sort by type ID_SORT_BY_SIZE, /// Sort by size ID_SORT_BY_TIME, /// Sort by access time ID_SORT_BY_USER, /// Sort by owner name ID_SORT_BY_GROUP, /// Sort by group name ID_SORT_REVERSE, /// Reverse sort order ID_SORT_CASE, /// Toggle sort case sensitivity ID_DIRECTORY_UP, /// Move up one directory ID_SET_PATTERN, /// Set match pattern ID_SET_DIRECTORY, /// Set directory ID_SHOW_HIDDEN, /// Show hidden files ID_HIDE_HIDDEN, /// Hide hidden files ID_TOGGLE_HIDDEN, /// Toggle display of hidden files ID_TOGGLE_IMAGES, /// Toggle display of images ID_REFRESH, /// Refresh immediately ID_LAST }; public: /// Construct a file list FXFileList(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Scan the current directory and update the items if needed, or if force is TRUE void scan(FXbool force=TRUE); /// Set current file void setCurrentFile(const FXString& file,FXbool notify=FALSE); /// Return current file FXString getCurrentFile() const; /// Set current directory void setDirectory(const FXString& path); /// Return current directory FXString getDirectory() const { return directory; } /// Change wildcard matching pattern void setPattern(const FXString& ptrn); /// Return wildcard pattern FXString getPattern() const { return pattern; } /// Return TRUE if item is a directory FXbool isItemDirectory(FXint index) const; /// Return TRUE if item is a directory FXbool isItemShare(FXint index) const; /// Return TRUE if item is a file FXbool isItemFile(FXint index) const; /// Return TRUE if item is executable FXbool isItemExecutable(FXint index) const; /// Return name of item at index FXString getItemFilename(FXint index) const; /// Return full pathname of item at index FXString getItemPathname(FXint index) const; /// Return file association of item FXFileAssoc* getItemAssoc(FXint index) const; /// Return wildcard matching mode FXuint getMatchMode() const { return matchmode; } /// Change wildcard matching mode void setMatchMode(FXuint mode); /// Return TRUE if showing hidden files FXbool showHiddenFiles() const; /// Show or hide hidden files void showHiddenFiles(FXbool showing); /// Return TRUE if showing directories only FXbool showOnlyDirectories() const; /// Show directories only void showOnlyDirectories(FXbool shown); /// Return TRUE if showing files only FXbool showOnlyFiles() const; /// Show files only void showOnlyFiles(FXbool shown); /// Return TRUE if image preview on FXbool showImages() const; /// Show or hide preview images void showImages(FXbool showing); /// Return images preview size FXint getImageSize() const { return imagesize; } /// Change images preview size void setImageSize(FXint size); /// Return TRUE if showing parent directories FXbool showParents() const; /// Show parent directories void showParents(FXbool shown); /// Change file associations void setAssociations(FXFileDict* assoc); /// Return file associations FXFileDict* getAssociations() const { return associations; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destructor virtual ~FXFileList(); }; } #endif fox1.6-1.6.57/include/FXFileSelector.h000066400000000000000000000244031326741342000172520ustar00rootroot00000000000000/******************************************************************************** * * * F i l e S e l e c t i o n W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFileSelector.h,v 1.61 2006/01/23 15:51:05 fox Exp $ * ********************************************************************************/ #ifndef FXFILESELECTOR_H #define FXFILESELECTOR_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { class FXFileList; class FXTextField; class FXComboBox; class FXDirBox; class FXButton; class FXMenuButton; class FXIcon; class FXMenuPane; class FXCheckButton; class FXMatrix; class FXHorizontalFrame; /// File selection modes enum { SELECTFILE_ANY, /// A single file, existing or not (to save to) SELECTFILE_EXISTING, /// An existing file (to load) SELECTFILE_MULTIPLE, /// Multiple existing files SELECTFILE_MULTIPLE_ALL, /// Multiple existing files or directories, but not '.' and '..' SELECTFILE_DIRECTORY /// Existing directory, including '.' or '..' }; /// File selection widget class FXAPI FXFileSelector : public FXPacker { FXDECLARE(FXFileSelector) protected: FXFileList *filebox; // File list widget FXTextField *filename; // File name entry field FXComboBox *filefilter; // Combobox for pattern list FXMenuPane *bookmarkmenu; // Menu for bookmarks FXHorizontalFrame *navbuttons; // Navigation buttons FXHorizontalFrame *fileboxframe; // Frame around file list FXMatrix *entryblock; // Entry block FXCheckButton *readonly; // Open file as read only FXDirBox *dirbox; // Directory hierarchy list FXButton *accept; // Accept button FXButton *cancel; // Cancel button FXIcon *updiricon; // Up directory icon FXIcon *listicon; // List mode icon FXIcon *detailicon; // Detail mode icon FXIcon *iconsicon; // Icon mode icon FXIcon *homeicon; // Go home icon FXIcon *workicon; // Go home icon FXIcon *shownicon; // Files shown icon FXIcon *hiddenicon; // Files hidden icon FXIcon *markicon; // Book mark icon FXIcon *clearicon; // Book clear icon FXIcon *newicon; // New directory icon FXIcon *deleteicon; // Delete file icon FXIcon *moveicon; // Rename file icon FXIcon *copyicon; // Copy file icon FXIcon *linkicon; // Link file icon FXRecentFiles bookmarks; // Bookmarked places FXuint selectmode; // Select mode FXbool navigable; // May navigate protected: FXFileSelector(){} FXString *getSelectedFiles() const; FXString *getSelectedFilesOnly() const; private: FXFileSelector(const FXFileSelector&); FXFileSelector &operator=(const FXFileSelector&); public: long onCmdAccept(FXObject*,FXSelector,void*); long onCmdFilter(FXObject*,FXSelector,void*); long onCmdItemDblClicked(FXObject*,FXSelector,void*); long onCmdItemSelected(FXObject*,FXSelector,void*); long onCmdItemDeselected(FXObject*,FXSelector,void*); long onCmdDirectoryUp(FXObject*,FXSelector,void*); long onUpdDirectoryUp(FXObject*,FXSelector,void*); long onCmdDirTree(FXObject*,FXSelector,void*); long onCmdHome(FXObject*,FXSelector,void*); long onCmdWork(FXObject*,FXSelector,void*); long onCmdBookmark(FXObject*,FXSelector,void*); long onCmdVisit(FXObject*,FXSelector,void*); long onCmdNew(FXObject*,FXSelector,void*); long onUpdNew(FXObject*,FXSelector,void*); long onCmdMove(FXObject*,FXSelector,void*); long onCmdCopy(FXObject*,FXSelector,void*); long onCmdLink(FXObject*,FXSelector,void*); long onCmdDelete(FXObject*,FXSelector,void*); long onUpdSelected(FXObject*,FXSelector,void*); long onPopupMenu(FXObject*,FXSelector,void*); long onCmdImageSize(FXObject*,FXSelector,void*); long onUpdImageSize(FXObject*,FXSelector,void*); long onUpdNavigable(FXObject*,FXSelector,void*); public: enum { ID_FILEFILTER=FXPacker::ID_LAST, ID_ACCEPT, ID_FILELIST, ID_DIRECTORY_UP, ID_DIRTREE, ID_NORMAL_SIZE, ID_MEDIUM_SIZE, ID_GIANT_SIZE, ID_HOME, ID_WORK, ID_BOOKMARK, ID_BOOKMENU, ID_VISIT, ID_NEW, ID_DELETE, ID_MOVE, ID_COPY, ID_LINK, ID_LAST }; public: /// Constructor FXFileSelector(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Return a pointer to the "Accept" button FXButton *acceptButton() const { return accept; } /// Return a pointer to the "Cancel" button FXButton *cancelButton() const { return cancel; } /// Change file name void setFilename(const FXString& path); /// Return file name, if any FXString getFilename() const; /** * Return array of strings containing the selected file names, terminated * by an empty string. This string array must be freed using delete []. * If no files were selected, a NULL is returned. */ FXString* getFilenames() const; /// Change file pattern void setPattern(const FXString& ptrn); /// Return file pattern FXString getPattern() const; /** * Change the list of file patterns shown in the file dialog. * Each pattern comprises an optional name, followed by a pattern in * parentheses. The patterns are separated by newlines. * For example, * * "*\n*.cpp,*.cc\n*.hpp,*.hh,*.h" * * and * * "All Files (*)\nC++ Sources (*.cpp,*.cc)\nC++ Headers (*.hpp,*.hh,*.h)" * * will set the same three patterns, but the former shows no pattern names. */ void setPatternList(const FXString& patterns); /// Return list of patterns FXString getPatternList() const; /** * After setting the list of patterns, this call will * initially select pattern n as the active one. */ void setCurrentPattern(FXint n); /// Return current pattern number FXint getCurrentPattern() const; /// Get pattern text for given pattern number FXString getPatternText(FXint patno) const; /// Change pattern text for pattern number void setPatternText(FXint patno,const FXString& text); /// Return number of patterns FXint getNumPatterns() const; /// Allow pattern entry void allowPatternEntry(FXbool allow); /// Return TRUE if pattern entry is allowed FXbool allowPatternEntry() const; /** * Given filename pattern of the form "GIF Format (*.gif)", * returns the pattern only, i.e. "*.gif" in this case. * If the parentheses are not found then returns the entire * input pattern. */ static FXString patternFromText(const FXString& pattern); /** * Given a pattern of the form "*.gif,*.GIF", return * the first extension of the pattern, i.e. "gif" in this * example. Returns empty string if it doesn't work out. */ static FXString extensionFromPattern(const FXString& pattern); /// Change directory void setDirectory(const FXString& path); /// Return directory FXString getDirectory() const; /// Set the inter-item spacing (in pixels) void setItemSpace(FXint s); /// Return the inter-item spacing (in pixels) FXint getItemSpace() const; /// Change file list style void setFileBoxStyle(FXuint style); /// Return file list style FXuint getFileBoxStyle() const; /// Change file selection mode void setSelectMode(FXuint mode); /// Return file selection mode FXuint getSelectMode() const { return selectmode; } /// Change wildcard matching mode void setMatchMode(FXuint mode); /// Return wildcard matching mode FXuint getMatchMode() const; /// Return TRUE if showing hidden files FXbool showHiddenFiles() const; /// Show or hide hidden files void showHiddenFiles(FXbool showing); /// Return TRUE if image preview on FXbool showImages() const; /// Show or hide preview images void showImages(FXbool showing); /// Return images preview size FXint getImageSize() const; /// Change images preview size void setImageSize(FXint size); /// Show readonly button void showReadOnly(FXbool show); /// Return TRUE if readonly is shown FXbool shownReadOnly() const; /// Set initial state of readonly button void setReadOnly(FXbool state); /// Get readonly state FXbool getReadOnly() const; /// Allow or disallow navigation void allowNavigation(FXbool flag){ navigable=flag; } /// Is navigation allowed? FXbool allowNavigation() const { return navigable; } /// Save object to a stream virtual void save(FXStream& store) const; /// Load object from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXFileSelector(); }; } #endif fox1.6-1.6.57/include/FXFileStream.h000066400000000000000000000145021326741342000167240ustar00rootroot00000000000000/******************************************************************************** * * * F i l e S t r e a m C l a s s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFileStream.h,v 1.15 2006/01/22 17:58:01 fox Exp $ * ********************************************************************************/ #ifndef FXFILESTREAM_H #define FXFILESTREAM_H #ifndef FXSTREAM_H #include "FXStream.h" #endif namespace FX { /// File Store Definition class FXAPI FXFileStream : public FXStream { protected: FXFile file; protected: virtual FXuval writeBuffer(FXuval count); virtual FXuval readBuffer(FXuval count); public: /// Create file store FXFileStream(const FXObject* cont=NULL); /** * Open binary data file stream; allocate a buffer of the given size * for the file I/O; the buffer must be at least 16 bytes. */ bool open(const FXString& filename,FXStreamDirection save_or_load,FXuval size=8192); /// Close file store virtual bool close(); /// Get position FXlong position() const { return FXStream::position(); } /// Move to position virtual bool position(FXlong offset,FXWhence whence=FXFromStart); /// Save single items to stream FXFileStream& operator<<(const FXuchar& v){ FXStream::operator<<(v); return *this; } FXFileStream& operator<<(const FXchar& v){ FXStream::operator<<(v); return *this; } FXFileStream& operator<<(const FXushort& v){ FXStream::operator<<(v); return *this; } FXFileStream& operator<<(const FXshort& v){ FXStream::operator<<(v); return *this; } FXFileStream& operator<<(const FXuint& v){ FXStream::operator<<(v); return *this; } FXFileStream& operator<<(const FXint& v){ FXStream::operator<<(v); return *this; } FXFileStream& operator<<(const FXfloat& v){ FXStream::operator<<(v); return *this; } FXFileStream& operator<<(const FXdouble& v){ FXStream::operator<<(v); return *this; } FXFileStream& operator<<(const FXlong& v){ FXStream::operator<<(v); return *this; } FXFileStream& operator<<(const FXulong& v){ FXStream::operator<<(v); return *this; } /// Save arrays of items to stream FXFileStream& save(const FXuchar* p,FXuval n){ FXStream::save(p,n); return *this; } FXFileStream& save(const FXchar* p,FXuval n){ FXStream::save(p,n); return *this; } FXFileStream& save(const FXushort* p,FXuval n){ FXStream::save(p,n); return *this; } FXFileStream& save(const FXshort* p,FXuval n){ FXStream::save(p,n); return *this; } FXFileStream& save(const FXuint* p,FXuval n){ FXStream::save(p,n); return *this; } FXFileStream& save(const FXint* p,FXuval n){ FXStream::save(p,n); return *this; } FXFileStream& save(const FXfloat* p,FXuval n){ FXStream::save(p,n); return *this; } FXFileStream& save(const FXdouble* p,FXuval n){ FXStream::save(p,n); return *this; } FXFileStream& save(const FXlong* p,FXuval n){ FXStream::save(p,n); return *this; } FXFileStream& save(const FXulong* p,FXuval n){ FXStream::save(p,n); return *this; } /// Load single items from stream FXFileStream& operator>>(FXuchar& v){ FXStream::operator>>(v); return *this; } FXFileStream& operator>>(FXchar& v){ FXStream::operator>>(v); return *this; } FXFileStream& operator>>(FXushort& v){ FXStream::operator>>(v); return *this; } FXFileStream& operator>>(FXshort& v){ FXStream::operator>>(v); return *this; } FXFileStream& operator>>(FXuint& v){ FXStream::operator>>(v); return *this; } FXFileStream& operator>>(FXint& v){ FXStream::operator>>(v); return *this; } FXFileStream& operator>>(FXfloat& v){ FXStream::operator>>(v); return *this; } FXFileStream& operator>>(FXdouble& v){ FXStream::operator>>(v); return *this; } FXFileStream& operator>>(FXlong& v){ FXStream::operator>>(v); return *this; } FXFileStream& operator>>(FXulong& v){ FXStream::operator>>(v); return *this; } /// Load arrays of items from stream FXFileStream& load(FXuchar* p,FXuval n){ FXStream::load(p,n); return *this; } FXFileStream& load(FXchar* p,FXuval n){ FXStream::load(p,n); return *this; } FXFileStream& load(FXushort* p,FXuval n){ FXStream::load(p,n); return *this; } FXFileStream& load(FXshort* p,FXuval n){ FXStream::load(p,n); return *this; } FXFileStream& load(FXuint* p,FXuval n){ FXStream::load(p,n); return *this; } FXFileStream& load(FXint* p,FXuval n){ FXStream::load(p,n); return *this; } FXFileStream& load(FXfloat* p,FXuval n){ FXStream::load(p,n); return *this; } FXFileStream& load(FXdouble* p,FXuval n){ FXStream::load(p,n); return *this; } FXFileStream& load(FXlong* p,FXuval n){ FXStream::load(p,n); return *this; } FXFileStream& load(FXulong* p,FXuval n){ FXStream::load(p,n); return *this; } /// Save object FXFileStream& saveObject(const FXObject* v){ FXStream::saveObject(v); return *this; } /// Load object FXFileStream& loadObject(FXObject*& v){ FXStream::loadObject(v); return *this; } /// Destructor virtual ~FXFileStream(); }; } #endif fox1.6-1.6.57/include/FXFoldingList.h000066400000000000000000000562431326741342000171170ustar00rootroot00000000000000/******************************************************************************** * * * F o l d i n g L i s t W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFoldingList.h,v 1.34 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXFOLDINGLIST_H #define FXFOLDINGLIST_H #ifndef FXSCROLLAREA_H #include "FXScrollArea.h" #endif namespace FX { class FXIcon; class FXFont; class FXHeader; class FXFoldingList; /// Folding list styles enum { FOLDINGLIST_EXTENDEDSELECT = 0, /// Extended selection mode allows for drag-selection of ranges of items FOLDINGLIST_SINGLESELECT = 0x00100000, /// Single selection mode allows up to one item to be selected FOLDINGLIST_BROWSESELECT = 0x00200000, /// Browse selection mode enforces one single item to be selected at all times FOLDINGLIST_MULTIPLESELECT = 0x00300000, /// Multiple selection mode is used for selection of individual items FOLDINGLIST_AUTOSELECT = 0x00400000, /// Automatically select under cursor FOLDINGLIST_SHOWS_LINES = 0x00800000, /// Lines shown FOLDINGLIST_SHOWS_BOXES = 0x01000000, /// Boxes to expand shown FOLDINGLIST_ROOT_BOXES = 0x02000000, /// Display root boxes also FOLDINGLIST_NORMAL = FOLDINGLIST_EXTENDEDSELECT }; /// Tree list Item class FXAPI FXFoldingItem : public FXObject { FXDECLARE(FXFoldingItem) friend class FXFoldingList; friend class FXDirList; protected: FXFoldingItem *parent; FXFoldingItem *prev; FXFoldingItem *next; FXFoldingItem *first; FXFoldingItem *last; FXString label; FXIcon *openIcon; FXIcon *closedIcon; void *data; FXuint state; FXint x,y; private: FXFoldingItem(const FXFoldingItem&); FXFoldingItem& operator=(const FXFoldingItem&); protected: FXFoldingItem():parent(NULL),prev(NULL),next(NULL),first(NULL),last(NULL),openIcon(NULL),closedIcon(NULL),data(NULL),state(0),x(0),y(0){} virtual void draw(const FXFoldingList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const; virtual FXint hitItem(const FXFoldingList* list,FXint x,FXint y) const; public: enum{ SELECTED = 1, /// Selected FOCUS = 2, /// Focus DISABLED = 4, /// Disabled OPENED = 8, /// Opened EXPANDED = 16, /// Expanded HASITEMS = 32, /// Has virtual subitems DRAGGABLE = 64, /// Draggable OPENICONOWNED = 128, /// Open icon owned by item CLOSEDICONOWNED = 256 /// Close icon owned by item }; public: /// Constructor FXFoldingItem(const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL):parent(NULL),prev(NULL),next(NULL),first(NULL),last(NULL),label(text),openIcon(oi),closedIcon(ci),data(ptr),state(0),x(0),y(0){} /// Get parent item FXFoldingItem* getParent() const { return parent; } /// Get next sibling item FXFoldingItem* getNext() const { return next; } /// Get previous sibling item FXFoldingItem* getPrev() const { return prev; } /// Get first child item FXFoldingItem* getFirst() const { return first; } /// Get las child item FXFoldingItem* getLast() const { return last; } /// Get item below this one in list FXFoldingItem* getBelow() const; /// Get item above this one in list FXFoldingItem* getAbove() const; /// Get number of children of item FXint getNumChildren() const; /// Change item label virtual void setText(const FXString& txt); /// Get item label const FXString& getText() const { return label; } /// Change open icon, deleting old icon if it was owned virtual void setOpenIcon(FXIcon* icn,FXbool owned=FALSE); /// Get open icon FXIcon* getOpenIcon() const { return openIcon; } /// Change closed icon, deleting old icon if it was owned virtual void setClosedIcon(FXIcon* icn,FXbool owned=FALSE); /// Get closed icon FXIcon* getClosedIcon() const { return closedIcon; } /// Change item user data void setData(void* ptr){ data=ptr; } /// Get item user data void* getData() const { return data; } /// Make item draw as focused virtual void setFocus(FXbool focus); /// Return true if item has focus FXbool hasFocus() const { return (state&FOCUS)!=0; } /// Select item virtual void setSelected(FXbool selected); /// Return true if this item is selected FXbool isSelected() const { return (state&SELECTED)!=0; } /// Make item show as open virtual void setOpened(FXbool opened); /// Return true if this item is open FXbool isOpened() const { return (state&OPENED)!=0; } /// Expand or collapse item virtual void setExpanded(FXbool expanded); /// Return true if this item is expanded into sub items FXbool isExpanded() const { return (state&EXPANDED)!=0; } /// Enable or disable item virtual void setEnabled(FXbool enabled); /// Return true if this item is enabled FXbool isEnabled() const { return (state&DISABLED)==0; } /// Make item draggable virtual void setDraggable(FXbool draggable); /// Return true if this item is draggable FXbool isDraggable() const { return (state&DRAGGABLE)!=0; } /// Return TRUE if subitems, real or imagined FXbool hasItems() const { return (state&HASITEMS)!=0; } /// Change has items flag void setHasItems(FXbool flag); /// Return true if descendent of parent item FXbool isChildOf(const FXFoldingItem* item) const; /// Return true if ancestor of child item FXbool isParentOf(const FXFoldingItem* item) const; /// Return width of item as drawn in list virtual FXint getWidth(const FXFoldingList* list) const; /// Return height of item as drawn in list virtual FXint getHeight(const FXFoldingList* list) const; /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy item and free icons if owned virtual ~FXFoldingItem(); }; /// Folding item collate function typedef FXint (*FXFoldingListSortFunc)(const FXFoldingItem*,const FXFoldingItem*); /** * A Folding List Widget resembles a Tree list except that it supports a * header control to provide each item with multiple columns of text. * Subtrees can be collapsed or expanded by double-clicking on an item * or by clicking on the optional plus button in front of the item. * Each item may have a text and optional open-icon as well as a closed-icon. * The items may be connected by optional lines to show the hierarchical * relationship. * When an item's selected state changes, the folding list emits a SEL_SELECTED * or SEL_DESELECTED message. If an item is opened or closed, a message * of type SEL_OPENED or SEL_CLOSED is sent. When the subtree under an * item is expanded, a SEL_EXPANDED or SEL_COLLAPSED message is issued. * A change of the current item is signified by the SEL_CHANGED message. * In addition, the folding list sends SEL_COMMAND messages when the user * clicks on an item, and SEL_CLICKED, SEL_DOUBLECLICKED, and SEL_TRIPLECLICKED * when the user clicks once, twice, or thrice, respectively. * When items are added or removed, the folding list sends messages of the * type SEL_INSERTED or SEL_DELETED. * In each of these cases, a pointer to the item, if any, is passed in the * 3rd argument of the message. */ class FXAPI FXFoldingList : public FXScrollArea { FXDECLARE(FXFoldingList) protected: FXHeader *header; // Tree header FXFoldingItem *firstitem; // First root item FXFoldingItem *lastitem; // Last root item FXFoldingItem *anchoritem; // Selection anchor item FXFoldingItem *currentitem; // Current item FXFoldingItem *extentitem; // Selection extent FXFoldingItem *cursoritem; // Item under cursor FXFoldingItem *viewableitem; // Viewable item FXFont *font; // Font FXFoldingListSortFunc sortfunc; // Item sort function FXColor textColor; // Text color FXColor selbackColor; // Selected background color FXColor seltextColor; // Selected text color FXColor lineColor; // Line color FXint treeWidth; // Tree width FXint treeHeight; // Tree height FXint visible; // Number of visible items FXint indent; // Parent to child indentation FXint grabx; // Grab point x FXint graby; // Grab point y FXString lookup; // Lookup string FXString help; // Help string FXbool state; // State of item protected: FXFoldingList(); void recompute(); void mergesort(FXFoldingItem*& list); void sort(FXFoldingItem*& f1,FXFoldingItem*& t1,FXFoldingItem*& f2,FXFoldingItem*& t2,int n); virtual void moveContents(FXint x,FXint y); virtual FXFoldingItem* createItem(const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr); static FXint compareSection(const FXchar *p,const FXchar* q,FXint s); static FXint compareSectionCase(const FXchar *p,const FXchar* q,FXint s); private: FXFoldingList(const FXFoldingList&); FXFoldingList& operator=(const FXFoldingList&); public: long onPaint(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); long onHeaderChanged(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onTipTimer(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onAutoScroll(FXObject*,FXSelector,void*); long onClicked(FXObject*,FXSelector,void*); long onDoubleClicked(FXObject*,FXSelector,void*); long onTripleClicked(FXObject*,FXSelector,void*); long onCommand(FXObject*,FXSelector,void*); long onLookupTimer(FXObject*,FXSelector,void*); public: static FXint ascending(const FXFoldingItem*,const FXFoldingItem*); static FXint descending(const FXFoldingItem*,const FXFoldingItem*); static FXint ascendingCase(const FXFoldingItem*,const FXFoldingItem*); static FXint descendingCase(const FXFoldingItem*,const FXFoldingItem*); public: enum { ID_LOOKUPTIMER=FXScrollArea::ID_LAST, ID_HEADER_CHANGE, ID_LAST }; public: /// Construct a folding list; the folding list is initially empty FXFoldingList(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FOLDINGLIST_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Compute and return content width virtual FXint getContentWidth(); /// Return content height virtual FXint getContentHeight(); /// Recalculate layout virtual void recalc(); /// Tree list can receive focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Return header control FXHeader* getHeader() const { return header; } /// Set headers from array of strings void setHeaders(const FXchar** strings,FXint size=1); /// Set headers from newline separated strings void setHeaders(const FXString& strings,FXint size=1); /// Append header with given text and optional icon void appendHeader(const FXString& text,FXIcon *icon=NULL,FXint size=1); /// Remove header at index void removeHeader(FXint index); /// Change text of header at index void setHeaderText(FXint index,const FXString& text); /// Return text of header at index FXString getHeaderText(FXint index) const; /// Change icon of header at index void setHeaderIcon(FXint index,FXIcon *icon); /// Return icon of header at index FXIcon* getHeaderIcon(FXint index) const; /// Change size of header at index void setHeaderSize(FXint index,FXint size); /// Return width of header at index FXint getHeaderSize(FXint index) const; /// Return number of headers FXint getNumHeaders() const; /// Return number of items FXint getNumItems() const; /// Return number of visible items FXint getNumVisible() const { return visible; } /// Change number of visible items void setNumVisible(FXint nvis); /// Return first root item FXFoldingItem* getFirstItem() const { return firstitem; } /// Return last root item FXFoldingItem* getLastItem() const { return lastitem; } /// Fill list by appending items from array of strings FXint fillItems(FXFoldingItem* father,const FXchar** strings,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Fill list by appending items from newline separated strings FXint fillItems(FXFoldingItem* father,const FXString& strings,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Insert [possibly subclassed] item under father before other item FXFoldingItem* insertItem(FXFoldingItem* other,FXFoldingItem* father,FXFoldingItem* item,FXbool notify=FALSE); /// Insert item with given text and optional icons, and user-data pointer under father before other item FXFoldingItem* insertItem(FXFoldingItem* other,FXFoldingItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Append [possibly subclassed] item as last child of father FXFoldingItem* appendItem(FXFoldingItem* father,FXFoldingItem* item,FXbool notify=FALSE); /// Append item with given text and optional icons, and user-data pointer as last child of father FXFoldingItem* appendItem(FXFoldingItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Prepend [possibly subclassed] item as first child of father FXFoldingItem* prependItem(FXFoldingItem* father,FXFoldingItem* item,FXbool notify=FALSE); /// Prepend item with given text and optional icons, and user-data pointer as first child of father FXFoldingItem* prependItem(FXFoldingItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Move item under father before other item FXFoldingItem *moveItem(FXFoldingItem* other,FXFoldingItem* father,FXFoldingItem* item); /// Extract item FXFoldingItem* extractItem(FXFoldingItem* item,FXbool notify=FALSE); /// Remove item void removeItem(FXFoldingItem* item,FXbool notify=FALSE); /// Remove items in range [fm, to] inclusively void removeItems(FXFoldingItem* fm,FXFoldingItem* to,FXbool notify=FALSE); /// Remove all items from list void clearItems(FXbool notify=FALSE); /// Return item width FXint getItemWidth(const FXFoldingItem* item) const { return item->getWidth(this); } /// Return item height FXint getItemHeight(const FXFoldingItem* item) const { return item->getHeight(this); } /// Get item at x,y, if any virtual FXFoldingItem* getItemAt(FXint x,FXint y) const; /** * Search items by name, beginning from item start. If the start item * is NULL the search will start at the first, top-most item in the list. * Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control the search * direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. * The option SEARCH_IGNORECASE causes a case-insensitive match. Finally, * passing SEARCH_PREFIX causes searching for a prefix of the item name. * Return NULL if no matching item is found. */ FXFoldingItem* findItem(const FXString& text,FXFoldingItem* start=NULL,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /** * Search items by associated user data, beginning from item start. If the * start item is NULL the search will start at the first, top-most item * in the list. Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control * the search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. */ FXFoldingItem* findItemByData(const void *ptr,FXFoldingItem* start=NULL,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /// Scroll to make item visible virtual void makeItemVisible(FXFoldingItem* item); /// Change item's text void setItemText(FXFoldingItem* item,const FXString& text); /// Return item's text FXString getItemText(const FXFoldingItem* item) const; /// Change item's open icon, deleting old icon if it was owned void setItemOpenIcon(FXFoldingItem* item,FXIcon* icon,FXbool owned=FALSE); /// Return item's open icon FXIcon* getItemOpenIcon(const FXFoldingItem* item) const; /// Chance item's closed icon, deleting old icon if it was owned void setItemClosedIcon(FXFoldingItem* item,FXIcon* icon,FXbool owned=FALSE); /// Return item's closed icon FXIcon* getItemClosedIcon(const FXFoldingItem* item) const; /// Change item user-data pointer void setItemData(FXFoldingItem* item,void* ptr) const; /// Return item user-data pointer void* getItemData(const FXFoldingItem* item) const; /// Return TRUE if item is selected FXbool isItemSelected(const FXFoldingItem* item) const; /// Return TRUE if item is current FXbool isItemCurrent(const FXFoldingItem* item) const; /// Return TRUE if item is visible FXbool isItemVisible(const FXFoldingItem* item) const; /// Return TRUE if item opened FXbool isItemOpened(const FXFoldingItem* item) const; /// Return TRUE if item expanded FXbool isItemExpanded(const FXFoldingItem* item) const; /// Return TRUE if item is a leaf-item, i.e. has no children FXbool isItemLeaf(const FXFoldingItem* item) const; /// Return TRUE if item is enabled FXbool isItemEnabled(const FXFoldingItem* item) const; /// Return item hit code: 0 outside, 1 icon, 2 text, 3 box FXint hitItem(const FXFoldingItem* item,FXint x,FXint y) const; /// Repaint item void updateItem(FXFoldingItem* item); /// Enable item virtual FXbool enableItem(FXFoldingItem* item); /// Disable item virtual FXbool disableItem(FXFoldingItem* item); /// Select item virtual FXbool selectItem(FXFoldingItem* item,FXbool notify=FALSE); /// Deselect item virtual FXbool deselectItem(FXFoldingItem* item,FXbool notify=FALSE); /// Toggle item selection virtual FXbool toggleItem(FXFoldingItem* item,FXbool notify=FALSE); /// Extend selection from anchor item to item virtual FXbool extendSelection(FXFoldingItem* item,FXbool notify=FALSE); /// Deselect all items virtual FXbool killSelection(FXbool notify=FALSE); /// Open item virtual FXbool openItem(FXFoldingItem* item,FXbool notify=FALSE); /// Close item virtual FXbool closeItem(FXFoldingItem* item,FXbool notify=FALSE); /// Collapse tree virtual FXbool collapseTree(FXFoldingItem* tree,FXbool notify=FALSE); /// Expand tree virtual FXbool expandTree(FXFoldingItem* tree,FXbool notify=FALSE); /// Change current item virtual void setCurrentItem(FXFoldingItem* item,FXbool notify=FALSE); /// Return current item, if any FXFoldingItem* getCurrentItem() const { return currentitem; } /// Change anchor item void setAnchorItem(FXFoldingItem* item); /// Return anchor item, if any FXFoldingItem* getAnchorItem() const { return anchoritem; } /// Return item under cursor, if any FXFoldingItem* getCursorItem() const { return cursoritem; } /// Sort all items recursively void sortItems(); /// Sort root items void sortRootItems(); /// Sort children of item void sortChildItems(FXFoldingItem* item); /// Return sort function FXFoldingListSortFunc getSortFunc() const { return sortfunc; } /// Change sort function void setSortFunc(FXFoldingListSortFunc func){ sortfunc=func; } /// Change text font void setFont(FXFont* fnt); /// Return text font FXFont* getFont() const { return font; } /// Change parent-child indent amount void setIndent(FXint in); /// Return parent-child indent amount FXint getIndent() const { return indent; } /// Return normal text color FXColor getTextColor() const { return textColor; } /// Change normal text color void setTextColor(FXColor clr); /// Return selected text background FXColor getSelBackColor() const { return selbackColor; } /// Change selected text background void setSelBackColor(FXColor clr); /// Return selected text color FXColor getSelTextColor() const { return seltextColor; } /// Change selected text color void setSelTextColor(FXColor clr); /// Return line color FXColor getLineColor() const { return lineColor; } /// Change line color void setLineColor(FXColor clr); /// Return list style FXuint getListStyle() const; /// Change list style void setListStyle(FXuint style); /// Set the status line help text for this list void setHelpText(const FXString& text); /// Get the status line help text for this list const FXString& getHelpText() const { return help; } /// Save object to a stream virtual void save(FXStream& store) const; /// Load object from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXFoldingList(); }; } #endif fox1.6-1.6.57/include/FXFont.h000066400000000000000000000366631326741342000156130ustar00rootroot00000000000000/******************************************************************************** * * * F o n t O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFont.h,v 1.66 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXFONT_H #define FXFONT_H #ifndef FXID_H #include "FXId.h" #endif namespace FX { /// Font character set encoding enum FXFontEncoding { FONTENCODING_DEFAULT, /// Don't care character encoding FONTENCODING_ISO_8859_1 = 1, /// West European (Latin1) FONTENCODING_ISO_8859_2 = 2, /// Central and East European (Latin2) FONTENCODING_ISO_8859_3 = 3, /// Esperanto (Latin3) FONTENCODING_ISO_8859_4 = 4, FONTENCODING_ISO_8859_5 = 5, /// Cyrillic (almost obsolete) FONTENCODING_ISO_8859_6 = 6, /// Arabic FONTENCODING_ISO_8859_7 = 7, /// Greek FONTENCODING_ISO_8859_8 = 8, /// Hebrew FONTENCODING_ISO_8859_9 = 9, /// Turkish (Latin5) FONTENCODING_ISO_8859_10 = 10, FONTENCODING_ISO_8859_11 = 11, /// Thai FONTENCODING_ISO_8859_13 = 13, /// Baltic FONTENCODING_ISO_8859_14 = 14, FONTENCODING_ISO_8859_15 = 15, FONTENCODING_ISO_8859_16 = 16, FONTENCODING_KOI8 = 17, FONTENCODING_KOI8_R = 18, /// Russian FONTENCODING_KOI8_U = 19, /// Ukrainian FONTENCODING_KOI8_UNIFIED = 20, FONTENCODING_CP437 = 437, /// IBM-PC code page FONTENCODING_CP850 = 850, /// IBMPC Multilingual FONTENCODING_CP851 = 851, /// IBM-PC Greek FONTENCODING_CP852 = 852, /// IBM-PC Latin2 FONTENCODING_CP855 = 855, /// IBM-PC Cyrillic FONTENCODING_CP856 = 856, /// IBM-PC Hebrew FONTENCODING_CP857 = 857, /// IBM-PC Turkish FONTENCODING_CP860 = 860, /// IBM-PC Portugese FONTENCODING_CP861 = 861, /// IBM-PC Iceland FONTENCODING_CP862 = 862, /// IBM-PC Israel FONTENCODING_CP863 = 863, /// IBM-PC Canadian/French FONTENCODING_CP864 = 864, /// IBM-PC Arabic FONTENCODING_CP865 = 865, /// IBM-PC Nordic FONTENCODING_CP866 = 866, /// IBM-PC Cyrillic #2 FONTENCODING_CP869 = 869, /// IBM-PC Greek #2 FONTENCODING_CP870 = 870, /// Latin-2 Multilingual FONTENCODING_CP1250 = 1250, /// Windows Central European FONTENCODING_CP1251 = 1251, /// Windows Russian FONTENCODING_CP1252 = 1252, /// Windows Latin1 FONTENCODING_CP1253 = 1253, /// Windows Greek FONTENCODING_CP1254 = 1254, /// Windows Turkish FONTENCODING_CP1255 = 1255, /// Windows Hebrew FONTENCODING_CP1256 = 1256, /// Windows Arabic FONTENCODING_CP1257 = 1257, /// Windows Baltic FONTENCODING_CP1258 = 1258, /// Windows Vietnam FONTENCODING_CP874 = 874, /// Windows Thai FONTENCODING_UNICODE = 9999, FONTENCODING_LATIN1 = FONTENCODING_ISO_8859_1, /// Latin 1 (West European) FONTENCODING_LATIN2 = FONTENCODING_ISO_8859_2, /// Latin 2 (East European) FONTENCODING_LATIN3 = FONTENCODING_ISO_8859_3, /// Latin 3 (South European) FONTENCODING_LATIN4 = FONTENCODING_ISO_8859_4, /// Latin 4 (North European) FONTENCODING_LATIN5 = FONTENCODING_ISO_8859_9, /// Latin 5 (Turkish) FONTENCODING_LATIN6 = FONTENCODING_ISO_8859_10, /// Latin 6 (Nordic) FONTENCODING_LATIN7 = FONTENCODING_ISO_8859_13, /// Latin 7 (Baltic Rim) FONTENCODING_LATIN8 = FONTENCODING_ISO_8859_14, /// Latin 8 (Celtic) FONTENCODING_LATIN9 = FONTENCODING_ISO_8859_15, /// Latin 9 AKA Latin 0 FONTENCODING_LATIN10 = FONTENCODING_ISO_8859_16, /// Latin 10 FONTENCODING_USASCII = FONTENCODING_ISO_8859_1, /// Latin 1 FONTENCODING_WESTEUROPE = FONTENCODING_ISO_8859_1, /// Latin 1 (West European) FONTENCODING_EASTEUROPE = FONTENCODING_ISO_8859_2, /// Latin 2 (East European) FONTENCODING_SOUTHEUROPE = FONTENCODING_ISO_8859_3, /// Latin 3 (South European) FONTENCODING_NORTHEUROPE = FONTENCODING_ISO_8859_4, /// Latin 4 (North European) FONTENCODING_CYRILLIC = FONTENCODING_ISO_8859_5, /// Cyrillic FONTENCODING_RUSSIAN = FONTENCODING_KOI8, /// Cyrillic FONTENCODING_ARABIC = FONTENCODING_ISO_8859_6, /// Arabic FONTENCODING_GREEK = FONTENCODING_ISO_8859_7, /// Greek FONTENCODING_HEBREW = FONTENCODING_ISO_8859_8, /// Hebrew FONTENCODING_TURKISH = FONTENCODING_ISO_8859_9, /// Latin 5 (Turkish) FONTENCODING_NORDIC = FONTENCODING_ISO_8859_10, /// Latin 6 (Nordic) FONTENCODING_THAI = FONTENCODING_ISO_8859_11, /// Thai FONTENCODING_BALTIC = FONTENCODING_ISO_8859_13, /// Latin 7 (Baltic Rim) FONTENCODING_CELTIC = FONTENCODING_ISO_8859_14 /// Latin 8 (Celtic) }; /// Font style struct FXFontDesc { FXchar face[116]; /// Face name FXushort size; /// Size in deci-points FXushort weight; /// Weight [light, normal, bold, ...] FXushort slant; /// Slant [normal, italic, oblique, ...] FXushort setwidth; /// Set width [normal, condensed, expanded, ...] FXushort encoding; /// Encoding of character set FXushort flags; /// Flags }; class FXDC; class FXDCWindow; /// Font class class FXAPI FXFont : public FXId { friend class FXDCWindow; FXDECLARE(FXFont) protected: FXString wantedName; // Desired font font name FXString actualName; // Matched font font name FXushort wantedSize; // Font size (points*10) FXushort actualSize; // Actual size that was matched FXushort wantedWeight; // Font weight FXushort actualWeight; // Font weight FXushort wantedSlant; // Font slant FXushort actualSlant; // Font slant FXushort wantedSetwidth; // Relative setwidth FXushort actualSetwidth; // Relative setwidth FXushort wantedEncoding; // Character set encoding FXushort actualEncoding; // Character set encoding FXushort hints; // Matching hint flags FXushort flags; // Actual flags FXshort angle; // Angle void *font; // Info about the font private: #ifdef WIN32 FXID dc; #endif protected: FXFont(); void* match(const FXString& wantfamily,const FXString& wantforge,FXuint wantsize,FXuint wantweight,FXuint wantslant,FXuint wantsetwidth,FXuint wantencoding,FXuint wanthints,FXint res); private: FXFont(const FXFont&); FXFont &operator=(const FXFont&); public: /// Font pitch hints enum { Fixed = 1, /// Fixed pitch, mono-spaced Variable = 2 /// Variable pitch, proportional spacing }; /// Font style hints enum { Decorative = 4, /// Fancy fonts Modern = 8, /// Monospace typewriter font Roman = 16, /// Variable width times-like font, serif Script = 32, /// Script or cursive Swiss = 64, /// Helvetica/swiss type font, sans-serif System = 128, /// System font X11 = 256, /// Raw X11 font string Scalable = 512, /// Scalable fonts Polymorphic = 1024, /// Polymorphic fonts, e.g. parametric weight, slant, etc. Rotatable = 2048 /// Rotatable fonts }; /// Font slant options enum { ReverseOblique = 1, /// Reversed oblique ReverseItalic = 2, /// Reversed italic Straight = 5, /// Straight, not slanted Italic = 8, /// Italics Oblique = 9 /// Oblique slant }; /// Font weight options enum { Thin = 10, /// Thin ExtraLight = 20, /// Extra light Light = 30, /// Light Normal = 40, /// Normal or regular weight Medium = 50, /// Medium bold face DemiBold = 60, /// Demi bold face Bold = 70, /// Bold face ExtraBold = 80, /// Extra Black = 90 /// Black }; /// Condensed or expanded options enum { UltraCondensed = 50, /// Ultra condensed printing ExtraCondensed = 63, /// Extra condensed Condensed = 75, /// Condensed SemiCondensed = 87, /// Semi-condensed NonExpanded = 100, /// Regular printing SemiExpanded = 113, /// Semi expanded Expanded = 125, /// Expanded ExtraExpanded = 150, /// Extra expanded UltraExpanded = 200 /// Ultra expanded }; public: /** * Construct a font with given font description of the form: * * fontname [ "[" foundry "]" ] ["," size ["," weight ["," slant ["," setwidth ["," encoding ["," hints]]]]]] * * For example: * * "helvetica [bitstream],120,bold,italic,normal,iso8859-1,0" * * Typically, at least the font name, and size must be given for * normal font matching. As a special case, raw X11 fonts can also be * passed, for example: * * "9x15bold" * * Note: use of the raw X11 fonts is stronly discouraged. */ FXFont(FXApp* a,const FXString& string); /** * Construct a font with given name, size in points, weight, slant, character set * encoding, setwidth, and hints. * The font name may be comprised of a family name and optional foundry name enclosed in * square brackets, for example, "helvetica [bitstream]". */ FXFont(FXApp* a,const FXString& face,FXuint size,FXuint weight=FXFont::Normal,FXuint slant=FXFont::Straight,FXuint encoding=FONTENCODING_DEFAULT,FXuint setwidth=FXFont::NonExpanded,FXuint h=0); /// Construct font from font description FXFont(FXApp* a,const FXFontDesc& fontdesc); /// Create the font virtual void create(); /// Detach the font virtual void detach(); /// Destroy the font virtual void destroy(); /// Return family part of name FXString getFamily() const; /// Return foundry part of name FXString getFoundry() const; /// Get font family name const FXString& getName() const { return wantedName; } /// Get actual family name const FXString& getActualName() const { return actualName; } /// Get size in deci-points FXuint getSize() const { return wantedSize; } /// Get actual size in deci-points FXuint getActualSize() const { return actualSize; } /// Get font weight FXuint getWeight() const { return wantedWeight; } /// Get actual font weight FXuint getActualWeight() const { return actualWeight; } /// Get slant FXuint getSlant() const { return wantedSlant; } /// Get actual slant FXuint getActualSlant() const { return actualSlant; } /// Get character set encoding FXuint getEncoding() const { return wantedEncoding; } /// Get actual encoding FXuint getActualEncoding() const { return actualEncoding; } /// Get setwidth FXuint getSetWidth() const { return wantedSetwidth; } /// Get actual setwidth FXuint getActualSetWidth() const { return actualSetwidth; } /// Get hints FXuint getHints() const { return hints; } /// Get flags FXuint getFlags() const { return flags; } /// Get font description void getFontDesc(FXFontDesc& fontdesc) const; /// Change font description virtual void setFontDesc(const FXFontDesc& fontdesc); /// Return angle FXint getAngle() const { return angle; } /// Set to new angle, in degrees*64 relative to positive x axis virtual void setAngle(FXint ang); /** * Return the font description as a string suitable for * parsing with setFont(), see above. */ FXString getFont() const; /** * Change the font to the specified font description string. */ virtual void setFont(const FXString& string); /// Find out if the font is monotype or proportional virtual FXbool isFontMono() const; /// See if font has glyph for ch virtual FXbool hasChar(FXwchar ch) const; /// Get first character glyph in font virtual FXwchar getMinChar() const; /// Get last character glyph in font virtual FXwchar getMaxChar() const; /// Left bearing virtual FXint leftBearing(FXwchar ch) const; /// Right bearing virtual FXint rightBearing(FXwchar ch) const; /// Width of widest character in font virtual FXint getFontWidth() const; /// Height of highest character in font virtual FXint getFontHeight() const; /// Ascent from baseline virtual FXint getFontAscent() const; /// Descent from baseline virtual FXint getFontDescent() const; /// Get font leading [that is lead-ing as in Pb!] virtual FXint getFontLeading() const; /// Get font line spacing virtual FXint getFontSpacing() const; /// Calculate width of single wide character in this font virtual FXint getCharWidth(const FXwchar ch) const; /// Calculate width of given text in this font virtual FXint getTextWidth(const FXString& string) const; /// Calculate width of given text in this font virtual FXint getTextWidth(const FXchar* string,FXuint length) const; /// Calculate height of given text in this font virtual FXint getTextHeight(const FXString& string) const; /// Calculate height of given text in this font virtual FXint getTextHeight(const FXchar *string,FXuint length) const; /** * List all fonts matching hints. If listFonts() returns TRUE then * fonts points to a newly-allocated array of length numfonts. It * is the caller's responsibility to free this array using FXFREE(). */ static FXbool listFonts(FXFontDesc*& fonts,FXuint& numfonts,const FXString& face,FXuint wt=0,FXuint sl=0,FXuint sw=0,FXuint en=0,FXuint h=0); /// Save font data into stream virtual void save(FXStream& store) const; /// Load font data from stream virtual void load(FXStream& store); /// Destroy font virtual ~FXFont(); }; } #endif fox1.6-1.6.57/include/FXFontDialog.h000066400000000000000000000054021326741342000167160ustar00rootroot00000000000000/******************************************************************************** * * * F o n t S e l e c t i o n D i a l o g * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFontDialog.h,v 1.14 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXFONTDIALOG_H #define FXFONTDIALOG_H #ifndef FXDIALOGBOX_H #include "FXDialogBox.h" #endif namespace FX { class FXFontSelector; /// Font selection dialog class FXAPI FXFontDialog : public FXDialogBox { FXDECLARE(FXFontDialog) protected: FXFontSelector *fontbox; protected: FXFontDialog(){} private: FXFontDialog(const FXFontDialog&); FXFontDialog &operator=(const FXFontDialog&); public: /// Constructor FXFontDialog(FXWindow* owner,const FXString& name,FXuint opts=0,FXint x=0,FXint y=0,FXint w=600,FXint h=380); /// Save dialog to a stream virtual void save(FXStream& store) const; /// Load dialog from a stream virtual void load(FXStream& store); /// Set the current font selection void setFontSelection(const FXFontDesc& fontdesc); /// Get the current font selection void getFontSelection(FXFontDesc& fontdesc) const; /// Destructor virtual ~FXFontDialog(); }; } #endif fox1.6-1.6.57/include/FXFontSelector.h000066400000000000000000000112001326741342000172700ustar00rootroot00000000000000/******************************************************************************** * * * F o n t S e l e c t i o n B o x * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFontSelector.h,v 1.18 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXFONTSELECTOR_H #define FXFONTSELECTOR_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { class FXTextField; class FXList; class FXComboBox; class FXLabel; class FXButton; class FXCheckButton; class FXFont; /// Font selection widget class FXAPI FXFontSelector : public FXPacker { FXDECLARE(FXFontSelector) protected: FXTextField *family; FXList *familylist; FXTextField *weight; FXList *weightlist; FXTextField *style; FXList *stylelist; FXTextField *size; FXList *sizelist; FXComboBox *charset; FXComboBox *setwidth; FXComboBox *pitch; FXCheckButton *scalable; FXCheckButton *allfonts; FXButton *accept; FXButton *cancel; FXLabel *preview; FXFont *previewfont; FXFontDesc selected; protected: FXFontSelector(){} void listFontFaces(); void listWeights(); void listSlants(); void listFontSizes(); void previewFont(); private: FXFontSelector(const FXFontSelector&); FXFontSelector &operator=(const FXFontSelector&); public: long onCmdFamily(FXObject*,FXSelector,void*); long onCmdWeight(FXObject*,FXSelector,void*); long onCmdStyle(FXObject*,FXSelector,void*); long onCmdStyleText(FXObject*,FXSelector,void*); long onCmdSize(FXObject*,FXSelector,void*); long onCmdSizeText(FXObject*,FXSelector,void*); long onCmdCharset(FXObject*,FXSelector,void*); long onUpdCharset(FXObject*,FXSelector,void*); long onCmdSetWidth(FXObject*,FXSelector,void*); long onUpdSetWidth(FXObject*,FXSelector,void*); long onCmdPitch(FXObject*,FXSelector,void*); long onUpdPitch(FXObject*,FXSelector,void*); long onCmdScalable(FXObject*,FXSelector,void*); long onUpdScalable(FXObject*,FXSelector,void*); long onCmdAllFonts(FXObject*,FXSelector,void*); long onUpdAllFonts(FXObject*,FXSelector,void*); public: enum{ ID_FAMILY=FXPacker::ID_LAST, ID_WEIGHT, ID_STYLE, ID_STYLE_TEXT, ID_SIZE, ID_SIZE_TEXT, ID_CHARSET, ID_SETWIDTH, ID_PITCH, ID_SCALABLE, ID_ALLFONTS, ID_LAST }; public: /// Constructor FXFontSelector(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Return a pointer to the "Accept" button FXButton *acceptButton() const { return accept; } /// Return a pointer to the "Cancel" button FXButton *cancelButton() const { return cancel; } /// Set font selection void setFontSelection(const FXFontDesc& fontdesc); /// Get font selection void getFontSelection(FXFontDesc& fontdesc) const; /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXFontSelector(); }; } #endif fox1.6-1.6.57/include/FXFrame.h000066400000000000000000000143121326741342000157220ustar00rootroot00000000000000/******************************************************************************** * * * F r a m e W i n d o w W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFrame.h,v 1.24 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXFRAME_H #define FXFRAME_H #ifndef FXWINDOW_H #include "FXWindow.h" #endif namespace FX { /// Justification modes used by certain subclasses enum { JUSTIFY_NORMAL = 0, /// Default justification is centered text JUSTIFY_CENTER_X = 0, /// Contents centered horizontally JUSTIFY_LEFT = 0x00008000, /// Contents left-justified JUSTIFY_RIGHT = 0x00010000, /// Contents right-justified JUSTIFY_HZ_APART = JUSTIFY_LEFT|JUSTIFY_RIGHT, /// Combination of JUSTIFY_LEFT & JUSTIFY_RIGHT JUSTIFY_CENTER_Y = 0, /// Contents centered vertically JUSTIFY_TOP = 0x00020000, /// Contents aligned with label top JUSTIFY_BOTTOM = 0x00040000, /// Contents aligned with label bottom JUSTIFY_VT_APART = JUSTIFY_TOP|JUSTIFY_BOTTOM /// Combination of JUSTIFY_TOP & JUSTIFY_BOTTOM }; /// Default padding enum { DEFAULT_PAD = 2 }; /** * The Frame widget provides borders around some contents. Borders may be raised, sunken, * thick, ridged or etched. They can also be turned off completely. * In addition, a certain amount of padding may be specified between the contents of * the widget and the borders. The contents may be justified inside the widget using the * justification options. * The Frame widget is sometimes used by itself as a place holder, but most often is used * as a convenient base class for simple controls. */ class FXAPI FXFrame : public FXWindow { FXDECLARE(FXFrame) protected: FXColor baseColor; // Base color FXColor hiliteColor; // Highlight color FXColor shadowColor; // Shadow color FXColor borderColor; // Border color FXint padtop; // Top padding FXint padbottom; // Bottom padding FXint padleft; // Left padding FXint padright; // right padding FXint border; // Border size protected: FXFrame(); void drawBorderRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawRidgeRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawGrooveRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawDoubleRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawDoubleSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawFrame(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); private: FXFrame(const FXFrame&); FXFrame &operator=(const FXFrame&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Construct frame window FXFrame(FXComposite* p,FXuint opts=FRAME_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Change frame style void setFrameStyle(FXuint style); /// Get current frame style FXuint getFrameStyle() const; /// Get border width FXint getBorderWidth() const { return border; } /// Change top padding void setPadTop(FXint pt); /// Get top interior padding FXint getPadTop() const { return padtop; } /// Change bottom padding void setPadBottom(FXint pb); /// Get bottom interior padding FXint getPadBottom() const { return padbottom; } /// Change left padding void setPadLeft(FXint pl); /// Get left interior padding FXint getPadLeft() const { return padleft; } /// Change right padding void setPadRight(FXint pr); /// Get right interior padding FXint getPadRight() const { return padright; } /// Change highlight color void setHiliteColor(FXColor clr); /// Get highlight color FXColor getHiliteColor() const { return hiliteColor; } /// Change shadow color void setShadowColor(FXColor clr); /// Get shadow color FXColor getShadowColor() const { return shadowColor; } /// Change border color void setBorderColor(FXColor clr); /// Get border color FXColor getBorderColor() const { return borderColor; } /// Change base gui color void setBaseColor(FXColor clr); /// Get base gui color FXColor getBaseColor() const { return baseColor; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXGIFCursor.h000066400000000000000000000065221326741342000164770ustar00rootroot00000000000000/******************************************************************************** * * * G I F C u r so r O b j e c t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Daniel Gehriger. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGIFCursor.h,v 1.22 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXGIFCURSOR_H #define FXGIFCURSOR_H #ifndef FXCURSOR_H #include "FXCursor.h" #endif namespace FX { /// GIF Cursor class class FXAPI FXGIFCursor : public FXCursor { FXDECLARE(FXGIFCursor) protected: FXGIFCursor(){} private: FXGIFCursor(const FXGIFCursor&); FXGIFCursor &operator=(const FXGIFCursor&); public: static const FXchar fileExt[]; public: /** * Construct a cursor from memory stream in Compuserve GIF format. * Hot spot may be specified using hx and hy parameters, since the GIF * format does not specify a hot spot. The image must be smaller than * 32x32 pixels. */ FXGIFCursor(FXApp* a,const void* pix,FXint hx=0,FXint hy=0); /// Save pixel data only, in GIF format virtual bool savePixels(FXStream& store) const; /// Load pixel data only, in GIF format virtual bool loadPixels(FXStream& store); /// Destroy virtual ~FXGIFCursor(){} }; #ifndef FXLOADGIF #define FXLOADGIF /** * Check if stream contains a GIF, return TRUE if so. */ extern FXAPI bool fxcheckGIF(FXStream& store); /** * Load an GIF (Graphics Interchange Format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadGIF(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an GIF (Graphics Interchange Format) file to a stream. */ extern FXAPI bool fxsaveGIF(FXStream& store,const FXColor *data,FXint width,FXint height,bool fast=true); #endif } #endif fox1.6-1.6.57/include/FXGIFIcon.h000066400000000000000000000065351326741342000161160ustar00rootroot00000000000000/******************************************************************************** * * * G I F I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGIFIcon.h,v 1.24 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXGIFICON_H #define FXGIFICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// GIF Icon class class FXAPI FXGIFIcon : public FXIcon { FXDECLARE(FXGIFIcon) protected: FXGIFIcon(){} private: FXGIFIcon(const FXGIFIcon&); FXGIFIcon &operator=(const FXGIFIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct an icon from memory stream formatted as GIF format FXGIFIcon(FXApp* a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in GIF format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in GIF format virtual bool loadPixels(FXStream& store); /// Destroy virtual ~FXGIFIcon(); }; #ifndef FXLOADGIF #define FXLOADGIF /** * Check if stream contains a GIF, return TRUE if so. */ extern FXAPI bool fxcheckGIF(FXStream& store); /** * Load an GIF (Graphics Interchange Format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadGIF(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an GIF (Graphics Interchange Format) file to a stream. The flag * "fast" is used to select the faster Floyd-Steinberg dither method instead * of the slower Wu quantization algorithm. */ extern FXAPI bool fxsaveGIF(FXStream& store,const FXColor *data,FXint width,FXint height,bool fast=true); #endif } #endif fox1.6-1.6.57/include/FXGIFImage.h000066400000000000000000000063461326741342000162500ustar00rootroot00000000000000/******************************************************************************** * * * G I F I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGIFImage.h,v 1.23 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXGIFIMAGE_H #define FXGIFIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// GIF Image class class FXAPI FXGIFImage : public FXImage { FXDECLARE(FXGIFImage) protected: FXGIFImage(){} private: FXGIFImage(const FXGIFImage&); FXGIFImage &operator=(const FXGIFImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct an image from memory stream formatted as CompuServe GIF format FXGIFImage(FXApp* a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in [un]GIF format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in CompuServe GIF format virtual bool loadPixels(FXStream& store); /// Destroy virtual ~FXGIFImage(); }; #ifndef FXLOADGIF #define FXLOADGIF /** * Check if stream contains a GIF, return TRUE if so. */ extern FXAPI bool fxcheckGIF(FXStream& store); /** * Load an GIF (Graphics Interchange Format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadGIF(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an GIF (Graphics Interchange Format) file to a stream. */ extern FXAPI bool fxsaveGIF(FXStream& store,const FXColor *data,FXint width,FXint height,bool fast=true); #endif } #endif fox1.6-1.6.57/include/FXGLCanvas.h000066400000000000000000000100331326741342000163220ustar00rootroot00000000000000/******************************************************************************** * * * G L C a n v a s W i n d o w W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLCanvas.h,v 1.33 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXGLCANVAS_H #define FXGLCANVAS_H #ifndef FXCANVAS_H #include "FXCanvas.h" #endif namespace FX { class FXGLVisual; /// GLCanvas, an area drawn by another object class FXAPI FXGLCanvas : public FXCanvas { FXDECLARE(FXGLCanvas) private: FXGLCanvas *sgnext; // Share group next in share list FXGLCanvas *sgprev; // Share group previous in share list protected: void *ctx; // GL Context protected: FXGLCanvas(); private: FXGLCanvas(const FXGLCanvas&); FXGLCanvas &operator=(const FXGLCanvas&); #ifdef WIN32 virtual const char* GetClass() const; #endif public: /** * Construct an OpenGL-capable canvas, with its own private display list. */ FXGLCanvas(FXComposite* p,FXGLVisual *vis,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /** * Construct an OpenGL-capable canvas, sharing display * list with another GL canvas. This canvas becomes a member * of a display list share group. All members of the display * list share group have to have the same visual. */ FXGLCanvas(FXComposite* p,FXGLVisual *vis,FXGLCanvas* sharegroup,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Return TRUE if it is sharing display lists FXbool isShared() const; /// Create all of the server-side resources for this window virtual void create(); /// Detach the server-side resources for this window virtual void detach(); /// Destroy the server-side resources for this window virtual void destroy(); /// Make OpenGL context current prior to performing OpenGL commands virtual FXbool makeCurrent(); /// Make OpenGL context non current virtual FXbool makeNonCurrent(); /// Return TRUE if this window's context is current virtual FXbool isCurrent() const; /// Return current context, if any static void* getCurrentContext(); /// Get GL context handle void* getContext() const { return ctx; } /// Swap front and back buffer virtual void swapBuffers(); /// Save object to stream virtual void save(FXStream& store) const; /// Load object from stream virtual void load(FXStream& store); /// Destructor virtual ~FXGLCanvas(); }; } #endif fox1.6-1.6.57/include/FXGLCone.h000066400000000000000000000056731326741342000160110ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L C o n e O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLCone.h,v 1.17 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXGLCONE_H #define FXGLCONE_H #ifndef FXGLSHAPE_H #include "FXGLShape.h" #endif namespace FX { /// OpenGL Cone Object class FXAPI FXGLCone : public FXGLShape { FXDECLARE(FXGLCone) public: FXfloat height; FXfloat radius; protected: FXGLCone(); virtual void drawshape(FXGLViewer* viewer); public: /// Construct with specified origin, height and radius FXGLCone(FXfloat x,FXfloat y,FXfloat z,FXfloat h=1.0f,FXfloat r=1.0f); /// Construct with specified origin, height, radius and material FXGLCone(FXfloat x,FXfloat y,FXfloat z,FXfloat h,FXfloat r,const FXMaterial& mtl); /// Copy constructor FXGLCone(const FXGLCone& orig); /// Copy this object virtual FXGLObject* copy(); /// Change radius void setRadius(FXfloat r){ radius=r; } FXfloat getRadius() const { return radius; } /// Change height void setHeight(FXfloat h){ height=h; } FXfloat getHeight() const { return height; } /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); /// Destroy virtual ~FXGLCone(); }; } #endif fox1.6-1.6.57/include/FXGLContext.h000066400000000000000000000103611326741342000165370ustar00rootroot00000000000000/******************************************************************************** * * * G L C o n t e x t C l a s s * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLContext.h,v 1.14 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXGLCONTEXT_H #define FXGLCONTEXT_H ////////////////////////////// UNDER DEVELOPMENT ////////////////////////////// namespace FX { class FXApp; class FXDrawable; class FXGLVisual; /** * A GL context is an object representing the OpenGL state information. * Multiple GL context may share display lists to conserve memory. * When drawing multiple windows, it may be advantageous to share not only * display lists, but also GL contexts. Since the GL context is created * for a certain frame-buffer configuration, sharing of GL contexts is * only possible if the windows sharing the GL context all have the same * GL visual. * However, display lists may be shared between different GL contexts. */ class FXAPI FXGLContext : public FXId { FXDECLARE(FXGLContext) private: FXGLVisual *visual; // Visual for this context FXDrawable *surface; // Drawable context is locked on FXGLContext *sgnext; // Share group next in share list FXGLContext *sgprev; // Share group previous in share list protected: void *ctx; // GL Context protected: FXGLContext():visual(NULL),surface(NULL),sgnext(NULL),sgprev(NULL),ctx(NULL){} private: FXGLContext(const FXGLContext&); FXGLContext &operator=(const FXGLContext&); public: /** * Construct an OpenGL context with its own private display list. */ FXGLContext(FXApp* a,FXGLVisual *vis); /** * Construct an OpenGL context sharing display lists with an existing GL context. */ FXGLContext(FXApp* a,FXGLVisual *vis,FXGLContext *shared); /// Return TRUE if it is sharing display lists FXbool isShared() const; /// Get the visual FXGLVisual* getVisual() const { return visual; } /// Create context virtual void create(); /// Detach the server-side resources for this window virtual void detach(); /// Destroy the server-side resources for this window virtual void destroy(); /// Make OpenGL context current prior to performing OpenGL commands FXbool begin(FXDrawable *drawable); /// Make OpenGL context non current FXbool end(); /// Swap front and back buffer void swapBuffers(); /// Copy part of backbuffer to front buffer [Mesa] void swapSubBuffers(FXint x,FXint y,FXint w,FXint h); /// Save object to stream virtual void save(FXStream& store) const; /// Load object from stream virtual void load(FXStream& store); /// Destructor virtual ~FXGLContext(); }; } #endif fox1.6-1.6.57/include/FXGLCube.h000066400000000000000000000061231326741342000157720ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L C u b e O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLCube.h,v 1.17 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXGLCUBE_H #define FXGLCUBE_H #ifndef FXGLSHAPE_H #include "FXGLShape.h" #endif namespace FX { /// OpenGL Cube Object class FXAPI FXGLCube : public FXGLShape { FXDECLARE(FXGLCube) public: FXfloat width; FXfloat height; FXfloat depth; protected: FXGLCube(); virtual void drawshape(FXGLViewer* viewer); public: /// Construct with specified origin, width, height and depth FXGLCube(FXfloat x,FXfloat y,FXfloat z,FXfloat w=1.0f,FXfloat h=1.0f,FXfloat d=1.0f); /// Construct with specified origin, width, height, depth and material FXGLCube(FXfloat x,FXfloat y,FXfloat z,FXfloat w,FXfloat h,FXfloat d,const FXMaterial& mtl); /// Copy constructor FXGLCube(const FXGLCube& orig); /// Copy this object virtual FXGLObject* copy(); /// Change width void setWidth(FXfloat w){ width=w; } FXfloat getWidth() const { return width; } /// Change height void setHeight(FXfloat h){ height=h; } FXfloat getHeight() const { return height; } /// Change depth void setDepth(FXfloat d){ depth=d; } FXfloat getDepth() const { return depth; } /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); /// Destroy virtual ~FXGLCube(); }; } #endif fox1.6-1.6.57/include/FXGLCylinder.h000066400000000000000000000057321326741342000166720ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L C y l i n d e r O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLCylinder.h,v 1.17 2006/01/22 17:58:02 fox Exp $ * ********************************************************************************/ #ifndef FXGLCYLINDER_H #define FXGLCYLINDER_H #ifndef FXGLSHAPE_H #include "FXGLShape.h" #endif namespace FX { /// OpenGL Cylinder Object class FXAPI FXGLCylinder : public FXGLShape { FXDECLARE(FXGLCylinder) public: FXfloat height; FXfloat radius; protected: FXGLCylinder(); virtual void drawshape(FXGLViewer* viewer); public: /// Construct with specified origin, height and radius FXGLCylinder(FXfloat x,FXfloat y,FXfloat z,FXfloat h=1.0f, FXfloat r=1.0f); /// Construct with specified origin, height, radius and material FXGLCylinder(FXfloat x,FXfloat y,FXfloat z,FXfloat h,FXfloat r,const FXMaterial& mtl); /// Copy constructor FXGLCylinder(const FXGLCylinder& orig); /// Copy this object virtual FXGLObject* copy(); /// Change radius void setRadius(FXfloat r){ radius=r; } FXfloat getRadius() const { return radius; } /// Change height void setHeight(FXfloat h){ height=h; } FXfloat getHeight() const { return height; } /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); virtual ~FXGLCylinder(); }; } #endif fox1.6-1.6.57/include/FXGLObject.h000066400000000000000000000146311326741342000163250ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLObject.h,v 1.28.2.3 2006/11/17 16:02:31 fox Exp $ * ********************************************************************************/ #ifndef FXGLOBJECT_H #define FXGLOBJECT_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { class FXGLViewer; class FXGLObject; /// Basic OpenGL object class FXAPI FXGLObject : public FXObject { FXDECLARE(FXGLObject) public: enum { ID_LAST=10000 // Leaving ample room for FXGLViewer subclasses }; public: /// Constructors FXGLObject(){} /// Copy constructor FXGLObject(const FXGLObject& orig):FXObject(orig){} /// Called by the viewer to get bounds for this object virtual void bounds(FXRangef& box); /// Draw this object in a viewer virtual void draw(FXGLViewer* viewer); /// Draw this object for hit-testing purposes virtual void hit(FXGLViewer* viewer); /// Copy this object virtual FXGLObject* copy(); /// Identify sub-object given path virtual FXGLObject* identify(FXuint* path); /// Return true if this object can be dragged around virtual FXbool canDrag() const; /// Return true if this object can be deleted from the scene virtual FXbool canDelete() const; /// Drag this object from one position to another virtual FXbool drag(FXGLViewer* viewer,FXint fx,FXint fy,FXint tx,FXint ty); /// Destructor virtual ~FXGLObject(){} }; /// List of GL objects typedef FXObjectListOf FXGLObjectList; /// Group object class FXAPI FXGLGroup : public FXGLObject { FXDECLARE(FXGLGroup) protected: FXGLObjectList list; // List of all objects public: /// Constructor FXGLGroup(){ } /// Copy constructor FXGLGroup(const FXGLGroup& orig):FXGLObject(orig),list(orig.list){ } /// Return list of childern FXGLObjectList& getList(){ return list; } /// Return bounding box virtual void bounds(FXRangef& box); /// Draw into viewer virtual void draw(FXGLViewer* viewer); /// Hit in viewer virtual void hit(FXGLViewer* viewer); /// Copy this object virtual FXGLObject* copy(); /// Identify object by means of path virtual FXGLObject* identify(FXuint* path); /// Return TRUE if group can be dragged virtual FXbool canDrag() const; /// Drag group object virtual FXbool drag(FXGLViewer* viewer,FXint fx,FXint fy,FXint tx,FXint ty); /// Return number of children FXint no() const { return list.no(); } /// Child at position FXGLObject* child(FXint pos) const { return list[pos]; } /// Insert child object at given position void insert(FXint pos,FXGLObject* obj){ list.insert(pos,obj); } /// Prepend child object void prepend(FXGLObject* obj){ list.prepend(obj); } /// Append child object void append(FXGLObject* obj){ list.append(obj); } /// Replace child object void replace(FXint pos,FXGLObject* obj){ list.replace(pos,obj); } /// Remove child object void remove(FXGLObject* obj){ list.remove(obj); } /// Remove child object at given position void erase(FXint pos){ list.erase(pos); } /// Remove all children void clear(){ list.clear(); } /// Stream save and load virtual void save(FXStream& store) const; virtual void load(FXStream& store); /// Destructor virtual ~FXGLGroup(); }; /// OpenGL Point Object class FXAPI FXGLPoint : public FXGLObject { FXDECLARE(FXGLPoint) public: FXVec3f pos; public: /// Default constructor FXGLPoint(); /// Copy constructor FXGLPoint(const FXGLPoint& orig); /// Construct with specified coordinates FXGLPoint(FXfloat x,FXfloat y,FXfloat z); /// Copy this object virtual FXGLObject* copy(); /// Called by the viewer to get bounds for this object virtual void bounds(FXRangef& box); /// Draw this object in a viewer virtual void draw(FXGLViewer* viewer); /// Draw this object for hit-testing purposes virtual void hit(FXGLViewer* viewer); /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); }; /// OpenGL Line Object class FXAPI FXGLLine : public FXGLObject { FXDECLARE(FXGLLine) public: FXGLPoint fm,to; public: /// Default constructor FXGLLine(); /// Copy constructor FXGLLine(const FXGLLine& orig); /// Construct with specified endpoints FXGLLine(FXfloat fx,FXfloat fy,FXfloat fz,FXfloat tx,FXfloat ty,FXfloat tz); /// Called by the viewer to get bounds for this object virtual void bounds(FXRangef& box); /// Draw this object in a viewer virtual void draw(FXGLViewer* viewer); /// Copy this object virtual FXGLObject* copy(); /// Draw this object for hit-testing purposes virtual void hit(FXGLViewer* viewer); /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXGLShape.h000066400000000000000000000135061326741342000161570ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L S h a p e O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLShape.h,v 1.25 2006/01/22 17:58:03 fox Exp $ * ********************************************************************************/ #ifndef FXGLSHAPE_H #define FXGLSHAPE_H #ifndef FXGLOBJECT_H #include "FXGLObject.h" #endif namespace FX { class FXGLViewer; class FXGLObject; // Shape drawing options enum { SURFACE_SINGLESIDED = 0, // Single-sided [both sides same] SURFACE_DUALSIDED = 0x00000001, // Dual-sided surface SHADING_NONE = 0, // No light source SHADING_SMOOTH = 0x00000002, // Smooth shaded SHADING_FLAT = 0x00000004, // Flag shaded FACECULLING_OFF = 0, // No face culling FACECULLING_ON = 0x00000008, // Cull backward facing surfaces STYLE_SURFACE = 0x00000010, // Draw filled surfaces STYLE_WIREFRAME = 0x00000020, // Draw wire frame STYLE_POINTS = 0x00000040, // Draw as points STYLE_BOUNDBOX = 0x00000080 // Draw bounding box }; /// OpenGL Shape Object class FXAPI FXGLShape : public FXGLObject { FXDECLARE_ABSTRACT(FXGLShape) protected: FXVec3f position; // Middle of the Bounding Box FXMaterial material[2]; // Front and back material properties FXRangef range; // Range box FXuint options; // Drawing options FXString tip; protected: FXGLShape(); virtual void drawshape(FXGLViewer*){} // To be overloaded by derived class void drawbox(); void drawhandles(); public: long onDNDDrop(FXObject*,FXSelector,void*); long onDNDMotion(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onCmdShadeOff(FXObject*,FXSelector,void*); long onUpdShadeOff(FXObject*,FXSelector,void*); long onCmdShadeOn(FXObject*,FXSelector,void*); long onUpdShadeOn(FXObject*,FXSelector,void*); long onCmdShadeSmooth(FXObject*,FXSelector,void*); long onUpdShadeSmooth(FXObject*,FXSelector,void*); long onCmdFrontMaterial(FXObject*,FXSelector,void*); long onUpdFrontMaterial(FXObject*,FXSelector,void*); long onCmdBackMaterial(FXObject*,FXSelector,void*); long onUpdBackMaterial(FXObject*,FXSelector,void*); long onCmdDrawingStyle(FXObject*,FXSelector,void*); long onUpdDrawingStyle(FXObject*,FXSelector,void*); public: enum { ID_SHADEOFF=FXGLObject::ID_LAST, ID_SHADEON, ID_SHADESMOOTH, ID_TOGGLE_SIDED, ID_TOGGLE_CULLING, ID_STYLE_POINTS, ID_STYLE_WIREFRAME, ID_STYLE_SURFACE, ID_STYLE_BOUNDINGBOX, ID_FRONT_MATERIAL, ID_BACK_MATERIAL, ID_LAST }; public: /// Construct with specified origin and options FXGLShape(FXfloat x,FXfloat y,FXfloat z,FXuint opts); /// Construct with specified origin, options and front and back materials FXGLShape(FXfloat x,FXfloat y,FXfloat z,FXuint opts,const FXMaterial& front,const FXMaterial& back); /// Copy constructor FXGLShape(const FXGLShape& orig); /// Called by the viewer to get bounds for this object virtual void bounds(FXRangef& box); /// Draw this object in a viewer virtual void draw(FXGLViewer* viewer); /// Draw this object for hit-testing purposes virtual void hit(FXGLViewer* viewer); /// Copy this object virtual FXGLObject* copy(); /// Return true if this object can be dragged around virtual FXbool canDrag() const; /// Return true if this object can be deleted from the scene virtual FXbool canDelete() const; /// Drag this object from one position to another virtual FXbool drag(FXGLViewer* viewer,FXint fx,FXint fy,FXint tx,FXint ty); /// Set the tool tip message for this object void setTipText(const FXString& text){ tip=text; } /// Get the tool tip message for this object const FXString& getTipText() const { return tip; } /// Set the material for specified side (where side = 0 or 1) void setMaterial(FXint side,const FXMaterial &mtl); /// Get the material for specified side (where side = 0 or 1) void getMaterial(FXint side,FXMaterial &mtl) const; /// Save shape to a stream virtual void save(FXStream& store) const; /// Load shape from a stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXGLSphere.h000066400000000000000000000062471326741342000163510ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L S p h e r e O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLSphere.h,v 1.18 2006/01/22 17:58:03 fox Exp $ * ********************************************************************************/ #ifndef FXGLSPHERE_H #define FXGLSPHERE_H #ifndef FXGLSHAPE_H #include "FXGLShape.h" #endif namespace FX { /// OpenGL Sphere Object class FXAPI FXGLSphere : public FXGLShape { FXDECLARE(FXGLSphere) public: FXfloat radius; // Radius of sphere FXint slices; // Longitudinal subdivision FXint stacks; // Latitudinal subdivision protected: FXGLSphere(); virtual void drawshape(FXGLViewer* viewer); public: enum { ID_LAST=FXGLShape::ID_LAST }; public: /// Construct with specified origin and radius FXGLSphere(FXfloat x,FXfloat y,FXfloat z,FXfloat r=1.0f); /// Construct with specified origin, radius and material FXGLSphere(FXfloat x,FXfloat y,FXfloat z,FXfloat r,const FXMaterial& mtl); /// Copy constructor FXGLSphere(const FXGLSphere& orig); /// Copy this object virtual FXGLObject* copy(); /// Change radius void setRadius(FXfloat r){ radius=r; } FXfloat getRadius() const { return radius; } /// Change slices void setSlices(FXint s){ slices=s; } FXint getSlices() const { return slices; } /// Change stacks void setStacks(FXint s){ stacks=s; } FXint getStacks() const { return stacks; } /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); /// Destroy virtual ~FXGLSphere(); }; } #endif fox1.6-1.6.57/include/FXGLTriangleMesh.h000066400000000000000000000101711326741342000174740ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L T r i a n g l e M e s h O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLTriangleMesh.h,v 1.15 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXGLTRIANGLEMESH_H #define FXGLTRIANGLEMESH_H #ifndef FXGLSHAPE_H #include "FXGLShape.h" #endif namespace FX { /* * Arrays Formats * * vertex: x,y,z * normal: x,y,z * Color: r,g.b,a * texture: u,v */ /// OpenGL Triangle Mesh Object class FXAPI FXGLTriangleMesh : public FXGLShape { FXDECLARE(FXGLTriangleMesh) private: FXfloat *vertexBuffer; FXfloat *colorBuffer; FXfloat *normalBuffer; FXfloat *textureBuffer; FXint vertexNumber; protected: FXGLTriangleMesh(); virtual void drawshape(FXGLViewer* viewer); virtual void recomputerange(); virtual void generatenormals(); public: /// Construct triangle mesh with nv vertices, and optional normals, colors, and texture coordinates FXGLTriangleMesh(FXfloat x,FXfloat y,FXfloat z,FXint nv,FXfloat *v,FXfloat *n=NULL,FXfloat *c=NULL,FXfloat *t=NULL); /// Construct triangle mesh with nv vertices, and optional normals, colors, and texture coordinates, and surface material FXGLTriangleMesh(FXfloat x,FXfloat y,FXfloat z,FXint nv,FXfloat *v,FXfloat *n,FXfloat *c,FXfloat *t,const FXMaterial& mtl); /// Copy constructor FXGLTriangleMesh(const FXGLTriangleMesh& orig); /// Copy this object virtual FXGLObject* copy(); /// Change number of vertices void setVertexNumber(FXint nvertices){ vertexNumber=nvertices; } /// Get number of vertices FXint getVertexNumber() const { return vertexNumber; } /// Set vertex buffer void setVertexBuffer(FXfloat *vertices); /// Get vertex buffer FXfloat* getVertexBuffer() const { return vertexBuffer; } /// Set color buffer void setColorBuffer(FXfloat *colors){ colorBuffer=colors; } /// Get color buffer FXfloat* getColorBuffer() const { return colorBuffer; } /// Set normals buffer void setNormalBuffer(FXfloat *normals){ normalBuffer=normals; } /// Get normals buffer FXfloat* getNormalBuffer() const { return normalBuffer; } /// Set texture coordinate buffer void setTextureCoordBuffer(FXfloat *textures){ textureBuffer=textures; } /// Get texture coordinate buffer FXfloat* getTextureCoordBuffer() const { return textureBuffer; } /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXGLTriangleMesh(); }; } #endif fox1.6-1.6.57/include/FXGLViewer.h000066400000000000000000000471261326741342000163650ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L V i e w e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLViewer.h,v 1.74 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXGLVIEWER_H #define FXGLVIEWER_H #ifndef FXGLCANVAS_H #include "FXGLCanvas.h" #endif namespace FX { class FXDCPrint; class FXGLObject; class FXGLVisual; // GL Viewer options enum { VIEWER_LIGHTING = 0x00008000, /// Lighting is on VIEWER_FOG = 0x00010000, /// Fog mode on VIEWER_DITHER = 0x00020000 /// Dithering }; /******************************* Viewer Structs *****************************/ /// OpenGL Viewer Viewport struct FXViewport { FXint w,h; // Viewport dimensions FXdouble left,right; // World box FXdouble bottom,top; FXdouble hither,yon; }; // OpenGL Light Source struct FXAPI FXLight { FXVec4f ambient; // Ambient light color FXVec4f diffuse; // Diffuse light color FXVec4f specular; // Specular light color FXVec4f position; // Light position FXVec3f direction; // Spot direction FXfloat exponent; // Spotlight exponent FXfloat cutoff; // Spotlight cutoff angle FXfloat c_attn; // Constant attenuation factor FXfloat l_attn; // Linear attenuation factor FXfloat q_attn; // Quadratic attenuation factor }; // OpenGL Material Description struct FXAPI FXMaterial { FXVec4f ambient; // Ambient material color FXVec4f diffuse; // Diffuse material color FXVec4f specular; // Specular material color FXVec4f emission; // Emissive material color FXfloat shininess; // Specular shininess }; // Feedback buffer sort routine typedef FXbool (*FXZSortFunc)(FXfloat*& buffer,FXint& used,FXint& size); /******************************** Viewer Class ******************************/ /// OpenGL viewer widget class FXAPI FXGLViewer : public FXGLCanvas { FXDECLARE(FXGLViewer) friend class FXGLObject; protected: FXViewport wvt; // Window viewport transform FXMat4f transform; // Current transformation matrix FXMat4f itransform; // Inverse of current transformation matrix FXuint projection; // Projection mode FXQuatf rotation; // Viewer orientation FXdouble fov; // Field of view FXdouble zoom; // Zoom factor FXVec3f center; // Model center FXVec3f scale; // Model scale FXdouble worldpx; // Pixel size in world FXdouble modelpx; // Pixel size in model FXint maxhits; // Maximum number of hits FXdouble ax,ay; // Quick view->world coordinate mapping FXdouble diameter; // Size of model diameter ( always > 0) FXdouble distance; // Distance of PRP to target FXVec4f background[2]; // Background colors FXVec4f ambient; // Global ambient light FXLight light; // Light source FXMaterial material; // Base material properties FXint dial[3]; // Dial positions FXString help; // Status help FXString tip; // Tooltip for background FXGLObject *dropped; // Object being dropped on FXGLObject *selection; // Current object FXZSortFunc zsortfunc; // Routine to sort feedback buffer FXGLObject *scene; // What we're looking at FXbool doesturbo; // Doing turbo mode FXbool turbomode; // Turbo mode FXuchar mode; // Mode the widget is in public: // Common DND types static FXDragType objectType; // GL Object type protected: // Mouse actions when in viewing window enum { HOVERING, // Hovering mouse w/o doing anything PICKING, // Pick mode ROTATING, // Rotating camera around target POSTING, // Posting right-mouse menu TRANSLATING, // Translating camera ZOOMING, // Zooming FOVING, // Change field-of-view DRAGGING, // Dragging objects TRUCKING, // Trucking camera GYRATING, // Rotation of camera around eye DO_LASSOSELECT, // Lasso select when mouse pressed LASSOSELECT, // Anchor of lasso rectangle DO_LASSOZOOM, // Zoom when mouse pressed LASSOZOOM // Zoom rectangle }; protected: FXGLViewer(); void glsetup(); virtual void updateProjection(); virtual void updateTransform(); FXVec3f spherePoint(FXint px,FXint py); FXQuatf turn(FXint fx,FXint fy,FXint tx,FXint ty); void drawWorld(FXViewport& wv); void drawAnti(FXViewport& wv); void drawLasso(FXint x0,FXint y0,FXint x1,FXint y1); FXint selectHits(FXuint*& hits,FXint& nhits,FXint x,FXint y,FXint w,FXint h); FXint renderFeedback(FXfloat *buffer,FXint x,FXint y,FXint w,FXint h,FXint maxbuffer); void drawFeedback(FXDCPrint& pdc,const FXfloat* buffer,FXint used); virtual FXGLObject* processHits(FXuint *pickbuffer,FXint nhits); void setOp(FXuint o); private: FXGLViewer(const FXGLViewer&); FXGLViewer &operator=(const FXGLViewer&); void initialize(); public: // Events long onPaint(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onChanged(FXObject*,FXSelector,void*); long onPick(FXObject*,FXSelector,void*); long onClicked(FXObject*,FXSelector,void*); long onDoubleClicked(FXObject*,FXSelector,void*); long onTripleClicked(FXObject*,FXSelector,void*); long onLassoed(FXObject*,FXSelector,void*); long onSelected(FXObject*,FXSelector,void*); long onDeselected(FXObject*,FXSelector,void*); long onInserted(FXObject*,FXSelector,void*); long onDeleted(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMiddleBtnPress(FXObject*,FXSelector,void*); long onMiddleBtnRelease(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onClipboardLost(FXObject*,FXSelector,void*); long onClipboardGained(FXObject*,FXSelector,void*); long onClipboardRequest(FXObject*,FXSelector,void*); // Commands long onCmdPerspective(FXObject*,FXSelector,void*); long onUpdPerspective(FXObject*,FXSelector,void*); long onCmdParallel(FXObject*,FXSelector,void*); long onUpdParallel(FXObject*,FXSelector,void*); long onCmdFront(FXObject*,FXSelector,void*); long onUpdFront(FXObject*,FXSelector,void*); long onCmdBack(FXObject*,FXSelector,void*); long onUpdBack(FXObject*,FXSelector,void*); long onCmdLeft(FXObject*,FXSelector,void*); long onUpdLeft(FXObject*,FXSelector,void*); long onCmdRight(FXObject*,FXSelector,void*); long onUpdRight(FXObject*,FXSelector,void*); long onCmdTop(FXObject*,FXSelector,void*); long onUpdTop(FXObject*,FXSelector,void*); long onCmdBottom(FXObject*,FXSelector,void*); long onUpdBottom(FXObject*,FXSelector,void*); long onCmdResetView(FXObject*,FXSelector,void*); long onCmdFitView(FXObject*,FXSelector,void*); long onDNDEnter(FXObject*,FXSelector,void*); long onDNDLeave(FXObject*,FXSelector,void*); long onDNDMotion(FXObject*,FXSelector,void*); long onDNDDrop(FXObject*,FXSelector,void*); long onTipTimer(FXObject*,FXSelector,void*); long onCmdXYZDial(FXObject*,FXSelector,void*); long onUpdXYZDial(FXObject*,FXSelector,void*); long onCmdRollPitchYaw(FXObject*,FXSelector,void*); long onUpdRollPitchYaw(FXObject*,FXSelector,void*); long onCmdXYZScale(FXObject*,FXSelector,void*); long onUpdXYZScale(FXObject*,FXSelector,void*); long onUpdCurrent(FXObject*,FXSelector,void*); long onCmdCutSel(FXObject*,FXSelector,void*); long onCmdCopySel(FXObject*,FXSelector,void*); long onCmdPasteSel(FXObject*,FXSelector,void*); long onCmdDeleteSel(FXObject*,FXSelector,void*); long onUpdDeleteSel(FXObject*,FXSelector,void*); long onCmdBackColor(FXObject*,FXSelector,void*); long onUpdBackColor(FXObject*,FXSelector,void*); long onCmdGradientBackColor(FXObject*,FXSelector,void*); long onUpdGradientBackColor(FXObject*,FXSelector,void*); long onCmdAmbientColor(FXObject*,FXSelector,void*); long onUpdAmbientColor(FXObject*,FXSelector,void*); long onCmdLighting(FXObject*,FXSelector,void*); long onUpdLighting(FXObject*,FXSelector,void*); long onCmdFog(FXObject*,FXSelector,void*); long onUpdFog(FXObject*,FXSelector,void*); long onCmdDither(FXObject*,FXSelector,void*); long onUpdDither(FXObject*,FXSelector,void*); long onCmdFov(FXObject*,FXSelector,void*); long onUpdFov(FXObject*,FXSelector,void*); long onCmdZoom(FXObject*,FXSelector,void*); long onUpdZoom(FXObject*,FXSelector,void*); long onCmdLightAmbient(FXObject*,FXSelector,void*); long onUpdLightAmbient(FXObject*,FXSelector,void*); long onCmdLightDiffuse(FXObject*,FXSelector,void*); long onUpdLightDiffuse(FXObject*,FXSelector,void*); long onCmdLightSpecular(FXObject*,FXSelector,void*); long onUpdLightSpecular(FXObject*,FXSelector,void*); long onCmdTurbo(FXObject*,FXSelector,void*); long onUpdTurbo(FXObject*,FXSelector,void*); long onCmdPrintImage(FXObject*,FXSelector,void*); long onCmdPrintVector(FXObject*,FXSelector,void*); long onCmdLassoZoom(FXObject*,FXSelector,void*); long onCmdLassoSelect(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); virtual long onDefault(FXObject*,FXSelector,void*); public: // Projection modes enum { PARALLEL, // Parallel projection PERSPECTIVE // Perspective projection }; // Messages enum { ID_PERSPECTIVE=FXGLCanvas::ID_LAST, ID_PARALLEL, ID_FRONT, ID_BACK, ID_LEFT, ID_RIGHT, ID_TOP, ID_BOTTOM, ID_RESETVIEW, ID_FITVIEW, ID_TOP_COLOR, ID_BOTTOM_COLOR, ID_BACK_COLOR, ID_AMBIENT_COLOR, ID_LIGHT_AMBIENT, ID_LIGHT_DIFFUSE, ID_LIGHT_SPECULAR, ID_LIGHTING, ID_TURBO, ID_FOG, ID_DITHER, ID_SCALE_X, ID_SCALE_Y, ID_SCALE_Z, ID_DIAL_X, ID_DIAL_Y, ID_DIAL_Z, ID_ROLL, ID_PITCH, ID_YAW, ID_FOV, ID_ZOOM, ID_CUT_SEL, ID_COPY_SEL, ID_PASTE_SEL, ID_DELETE_SEL, ID_PRINT_IMAGE, ID_PRINT_VECTOR, ID_LASSO_ZOOM, ID_LASSO_SELECT, ID_LAST }; public: // Common DND type names static const FXchar objectTypeName[]; public: /// Construct GL viewer widget FXGLViewer(FXComposite* p,FXGLVisual *vis,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Construct GL viewer widget sharing display list with another GL viewer FXGLViewer(FXComposite* p,FXGLVisual *vis,FXGLViewer* sharegroup,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create all of the server-side resources for this window virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Return size of pixel in world coordinates FXdouble worldPix() const { return worldpx; } /// Return size of pixel in model coordinates FXdouble modelPix() const { return modelpx; } /// Return a NULL-terminated list of all objects in the given rectangle, or NULL FXGLObject** lasso(FXint x1,FXint y1,FXint x2,FXint y2); /// Return a NULL-terminated list of all objects in the given rectangle, or NULL virtual FXGLObject** select(FXint x,FXint y,FXint w,FXint h); /// Perform a pick operation, returning the object at the given x,y position, or NULL virtual FXGLObject* pick(FXint x,FXint y); /// Change the model bounding box; this adjusts the viewer virtual FXbool setBounds(const FXRangef& box); /// Fit viewer to the given bounding box FXbool fitToBounds(const FXRangef& box); /// Return the viewer's viewport void getViewport(FXViewport& v) const; /// Translate eye-coordinate to screen coordinate void eyeToScreen(FXint& sx,FXint& sy,FXVec3f e); /// Translate screen coordinate to eye coordinate at the given depth FXVec3f screenToEye(FXint sx,FXint sy,FXfloat eyez=0.0); /// Translate screen coordinate to eye coordinate at the target point depth FXVec3f screenToTarget(FXint sx,FXint sy); /// Translate world coordinate to eye coordinate FXVec3f worldToEye(FXVec3f w); /// Translate world coordinate to eye coordinate depth FXfloat worldToEyeZ(FXVec3f w); /// Translate eye coordinate to eye coordinate FXVec3f eyeToWorld(FXVec3f e); /// Calculate world coordinate vector from screen movement FXVec3f worldVector(FXint fx,FXint fy,FXint tx,FXint ty); /// Change default object material setting void setMaterial(const FXMaterial &mtl); /// Return default object material setting void getMaterial(FXMaterial &mtl) const; /// Change camera field of view angle (in degrees) void setFieldOfView(FXdouble fv); /// Return camera field of view angle FXdouble getFieldOfView() const { return fov; } /// Change camera zoom factor void setZoom(FXdouble zm); /// Return camera zoom factor FXdouble getZoom() const { return zoom; } /// Change target point distance void setDistance(FXdouble ed); /// Return target point distance FXdouble getDistance() const { return distance; } /// Change unequal model scaling factors void setScale(FXVec3f s); /// Return current scaling factors const FXVec3f& getScale() const { return scale; } /// Change camera orientation from quaternion void setOrientation(FXQuatf rot); /// Return current camera orientation quaternion const FXQuatf& getOrientation() const { return rotation; } /// Change object center (tranlation) void setCenter(FXVec3f cntr); /// Return object center const FXVec3f& getCenter() const { return center; } /// Translate object center void translate(FXVec3f vec); /// Return boresight vector FXbool getBoreVector(FXint sx,FXint sy,FXVec3f& point,FXVec3f& dir); /// Return eyesight vector FXVec3f getEyeVector() const; /// Return eye position FXVec3f getEyePosition() const; /// Change help text void setHelpText(const FXString& text); /// Return help text const FXString& getHelpText() const { return help; } /// Change tip text void setTipText(const FXString& text); /// Return tip text const FXString& getTipText() const { return tip; } /// Return the current transformation matrix const FXMat4f& getTransform() const { return transform; } /// Return the inverse of the current transformation matrix const FXMat4f& getInvTransform() const { return itransform; } /// Change the scene, i.e. the object being displayed. void setScene(FXGLObject* sc); /// Return the current scene object FXGLObject* getScene() const { return scene; } /// Change selection void setSelection(FXGLObject* sel); /// Return selection FXGLObject* getSelection() const { return selection; } /// Change the projection mode, PERSPECTIVE or PARALLEL void setProjection(FXuint proj); /// Return the projection mode FXuint getProjection() const { return projection; } /// Change top or bottom or both background colors void setBackgroundColor(const FXVec4f& clr,FXbool bottom=MAYBE); /// Return top or bottom window background color. const FXVec4f& getBackgroundColor(FXbool bottom=FALSE) const { return background[bottom]; } /// Change global ambient light color void setAmbientColor(const FXVec4f& clr); /// Return global ambient light color const FXVec4f& getAmbientColor() const { return ambient; } /** * Read the pixels off the screen as array of FXColor; * this array can be directly passed to fxsaveBMP and other image * output routines. */ FXbool readPixels(FXColor*& buffer,FXint x,FXint y,FXint w,FXint h); /** * Read the feedback buffer containing the current scene, returning used * and allocated size. */ FXbool readFeedback(FXfloat*& buffer,FXint& used,FXint& size,FXint x,FXint y,FXint w,FXint h); /** * Change hidden-surface feedback buffer sorting algorithm. * This can be used for move/draw printed output depth sorting. */ void setZSortFunc(FXZSortFunc func){ zsortfunc=func; } /// Return hidden surface sorting function. FXZSortFunc getZSortFunc() const { return zsortfunc; } /** * Change the maximum hits, i.e. the maximum size of the pick buffer. * When set to less than or equal to zero, picking is essentially turned off. */ void setMaxHits(FXint maxh) { maxhits=maxh; } /// Return maximum pickbuffer size FXint getMaxHits() const { return maxhits; } /** * When drawing a GL object, if doesTurbo() is true, the object * may choose to perform a reduced complexity drawing as the user is * interactively manipulating; another update will be done later when * the full complexity drawing can be performed again. */ FXbool doesTurbo() const { return doesturbo; } /// Return turbo mode setting FXbool getTurboMode() const { return turbomode; } /// Set turbo mode void setTurboMode(FXbool turbo=TRUE); /// Return light source settings void getLight(FXLight& lite) const; /// Change light source settings void setLight(const FXLight& lite); /// Save viewer to a stream virtual void save(FXStream& store) const; /// Load viewer from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXGLViewer(); }; } #endif fox1.6-1.6.57/include/FXGLVisual.h000066400000000000000000000134371326741342000163650ustar00rootroot00000000000000/******************************************************************************** * * * V i s u a l C l a s s * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLVisual.h,v 1.24 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXGLVISUAL_H #define FXGLVISUAL_H #ifndef FXVISUAL_H #include "FXVisual.h" #endif namespace FX { class FXFont; class FXWindow; class FXImage; class FXIcon; class FXBitmap; class FXDCWindow; class FXGLCanvas; /// Visual describes pixel format of a drawable class FXAPI FXGLVisual : public FXVisual { FXDECLARE(FXGLVisual) friend class FXWindow; friend class FXImage; friend class FXIcon; friend class FXBitmap; friend class FXDCWindow; friend class FXGLCanvas; protected: FXint redSize; // Desired #bits for red FXint greenSize; // Desired #bits for green FXint blueSize; // Desired #bits for blue FXint alphaSize; // Desired #bits for alpha FXint depthSize; // Desired #bits for Z FXint stencilSize; // Desired #bits for stencil FXint accumRedSize; // Desired #bits for accum red FXint accumGreenSize; // Desired #bits for accum green FXint accumBlueSize; // Desired #bits for accum blue FXint accumAlphaSize; // Desired #bits for accum alpha protected: FXGLVisual(); private: FXGLVisual(const FXGLVisual&); FXGLVisual &operator=(const FXGLVisual&); public: /// Construct default visual FXGLVisual(FXApp* a,FXuint flags); /** * Test if OpenGL is possible, and what level is supported. * Because of remote display capability, the display server may * support a different level of OpenGL than the client; it may * even support no OpenGL at all! This function returns the lesser * of the client support level and the display server support level. */ static FXbool supported(FXApp* application,int& major,int& minor); /// Create visual virtual void create(); /// Detach visual virtual void detach(); /// Destroy visual virtual void destroy(); /// Get sizes for bit-planes FXint getRedSize() const { return redSize; } FXint getGreenSize() const { return greenSize; } FXint getBlueSize() const { return blueSize; } FXint getAlphaSize() const { return alphaSize; } FXint getDepthSize() const { return depthSize; } FXint getStencilSize() const { return stencilSize; } FXint getAccumRedSize() const { return accumRedSize; } FXint getAccumGreenSize() const { return accumGreenSize; } FXint getAccumBlueSize() const { return accumBlueSize; } FXint getAccumAlphaSize() const { return accumAlphaSize; } /// Set sizes for bit-planes void setRedSize(FXint rs){ redSize=rs; } void setGreenSize(FXint gs){ greenSize=gs; } void setBlueSize(FXint bs){ blueSize=bs; } void setAlphaSize(FXint as){ alphaSize=as; } void setDepthSize(FXint ds){ depthSize=ds; } void setStencilSize(FXint ss){ stencilSize=ss; } void setAccumRedSize(FXint rs){ accumRedSize=rs; } void setAccumGreenSize(FXint gs){ accumGreenSize=gs; } void setAccumBlueSize(FXint bs){ accumBlueSize=bs; } void setAccumAlphaSize(FXint as){ accumAlphaSize=as; } /// Get ACTUAL sizes for bit-planes FXint getActualRedSize() const; FXint getActualGreenSize() const; FXint getActualBlueSize() const; FXint getActualAlphaSize() const; FXint getActualDepthSize() const; FXint getActualStencilSize() const; FXint getActualAccumRedSize() const; FXint getActualAccumGreenSize() const; FXint getActualAccumBlueSize() const; FXint getActualAccumAlphaSize() const; /// Is it double buffered? FXbool isDoubleBuffer() const; /// Is it stereo? FXbool isStereo() const; /// Is it hardware-accelerated? FXbool isAccelerated() const; /// Does it swap by copying instead of flipping buffers FXbool isBufferSwapCopy() const; /// Save visual info to a stream virtual void save(FXStream& store) const; /// Load visual info to a stream virtual void load(FXStream& store); /// Destructor virtual ~FXGLVisual(); }; /// Create a display list of bitmaps from font glyphs in a font extern FXAPI void glUseFXFont(FXFont* font,int first,int count,int list); } #endif fox1.6-1.6.57/include/FXGUISignal.h000066400000000000000000000111711326741342000164520ustar00rootroot00000000000000/******************************************************************************** * * * S i g n a l G U I T h r e a d * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGUISignal.h,v 1.6.2.1 2006/05/24 12:08:45 fox Exp $ * ********************************************************************************/ #ifndef FXGUISIGNAL_H #define FXGUISIGNAL_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { class FXApp; /** * An FXGUISignal manages a waitable object which is used to awaken the * main user-interface thread from a worker thread. When a FXGUISignal is * constructed, it automatically calls addInput() function to register itself * as the message handler for the SEL_IO_READ message from FXApp. Likewise, * when FXGUISignal is destroyed, it calls removeInput() to remove itself as * the message handler for the SEL_IO_READ message from FXApp. * When a worker thread calls the signal() API, the waitable object managed by * FXGUISignal is set to the signaled state, after which the worker thread * continues execution immediately. * Meanwhile, the main user-interface thread is awakened because one of its * inputs has become signaled. It invokes the onSignal handler of FXGUISignal, * which clears the waitable object's state and subsequently dispatches to the * target of FXGUISignal through the SEL_IO_READ message. * Thus, the SEL_IO_READ handler in FXGUISignal is executed in the context of * the user-interface thread, allowing any user-interaction without blocking * a worker thread. * In a typical scenario, a worker thread updates some common data structure, * then notifies the main user-interface thread (via the FXGUISignal) to update * the user interface and perform some appropriate action. */ class FXAPI FXGUISignal : public FXObject { FXDECLARE(FXGUISignal) private: FXApp *app; // Application protected: FXObject *target; // Target object void *data; // User data FXSelector message; // Message id private: #ifndef WIN32 FXInputHandle fd[2]; #else FXInputHandle event; #endif protected: FXGUISignal(); private: FXGUISignal(const FXGUISignal&); FXGUISignal& operator=(const FXGUISignal&); public: enum{ ID_IO_READ=0, ID_LAST }; public: long onSignal(FXObject*,FXSelector,void*); public: /// Constructor FXGUISignal(FXApp* a,FXObject* tgt=NULL,FXSelector sel=0,void* ptr=NULL); /// Get application FXApp* getApp() const { return app; } /// Set the message target object void setTarget(FXObject *t){ target=t; } /// Get the message target object, if any FXObject* getTarget() const { return target; } /// Set the message identifier void setSelector(FXSelector sel){ message=sel; } /// Get the message identifier FXSelector getSelector() const { return message; } /// Set user data pointer void setData(void *ptr){ data=ptr; } /// Get user data pointer void* getData() const { return data; } /** * Signal the event; this API may be called by the worker thread * to send a message to the user-interface thread. */ void signal(); /// Destructor virtual ~FXGUISignal(); }; } #endif fox1.6-1.6.57/include/FXGZFileStream.h000066400000000000000000000146431326741342000171730ustar00rootroot00000000000000/******************************************************************************** * * * G Z F i l e S t r e a m C l a s s e s * * * ********************************************************************************* * Copyright (C) 2002,2006 by Sander Jansen. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGZFileStream.h,v 1.5.2.1 2007/09/28 16:42:19 fox Exp $ * ********************************************************************************/ #ifdef HAVE_ZLIB_H #ifndef FXGZFILESTREAM_H #define FXGZFILESTREAM_H #ifndef FXFILESTREAM_H #include "FXFileStream.h" #endif namespace FX { struct ZBlock; /// GZIP compressed stream class FXAPI FXGZFileStream : public FXFileStream { private: ZBlock *z; int f; protected: virtual FXuval writeBuffer(FXuval count); virtual FXuval readBuffer(FXuval count); public: /// Create GZIP compressed file stream FXGZFileStream(const FXObject* cont=NULL); /// Open file stream bool open(const FXString& filename,FXStreamDirection save_or_load,FXuval size=8192); /// Flush buffer virtual bool flush(); /// Close file stream virtual bool close(); /// Get position FXlong position() const { return FXStream::position(); } /// Move to position virtual bool position(FXlong,FXWhence){ return FALSE; } /// Save single items to stream FXGZFileStream& operator<<(const FXuchar& v){ FXStream::operator<<(v); return *this; } FXGZFileStream& operator<<(const FXchar& v){ FXStream::operator<<(v); return *this; } FXGZFileStream& operator<<(const FXushort& v){ FXStream::operator<<(v); return *this; } FXGZFileStream& operator<<(const FXshort& v){ FXStream::operator<<(v); return *this; } FXGZFileStream& operator<<(const FXuint& v){ FXStream::operator<<(v); return *this; } FXGZFileStream& operator<<(const FXint& v){ FXStream::operator<<(v); return *this; } FXGZFileStream& operator<<(const FXfloat& v){ FXStream::operator<<(v); return *this; } FXGZFileStream& operator<<(const FXdouble& v){ FXStream::operator<<(v); return *this; } FXGZFileStream& operator<<(const FXlong& v){ FXStream::operator<<(v); return *this; } FXGZFileStream& operator<<(const FXulong& v){ FXStream::operator<<(v); return *this; } /// Save arrays of items to stream FXGZFileStream& save(const FXuchar* p,FXuval n){ FXStream::save(p,n); return *this; } FXGZFileStream& save(const FXchar* p,FXuval n){ FXStream::save(p,n); return *this; } FXGZFileStream& save(const FXushort* p,FXuval n){ FXStream::save(p,n); return *this; } FXGZFileStream& save(const FXshort* p,FXuval n){ FXStream::save(p,n); return *this; } FXGZFileStream& save(const FXuint* p,FXuval n){ FXStream::save(p,n); return *this; } FXGZFileStream& save(const FXint* p,FXuval n){ FXStream::save(p,n); return *this; } FXGZFileStream& save(const FXfloat* p,FXuval n){ FXStream::save(p,n); return *this; } FXGZFileStream& save(const FXdouble* p,FXuval n){ FXStream::save(p,n); return *this; } FXGZFileStream& save(const FXlong* p,FXuval n){ FXStream::save(p,n); return *this; } FXGZFileStream& save(const FXulong* p,FXuval n){ FXStream::save(p,n); return *this; } /// Load single items from stream FXGZFileStream& operator>>(FXuchar& v){ FXStream::operator>>(v); return *this; } FXGZFileStream& operator>>(FXchar& v){ FXStream::operator>>(v); return *this; } FXGZFileStream& operator>>(FXushort& v){ FXStream::operator>>(v); return *this; } FXGZFileStream& operator>>(FXshort& v){ FXStream::operator>>(v); return *this; } FXGZFileStream& operator>>(FXuint& v){ FXStream::operator>>(v); return *this; } FXGZFileStream& operator>>(FXint& v){ FXStream::operator>>(v); return *this; } FXGZFileStream& operator>>(FXfloat& v){ FXStream::operator>>(v); return *this; } FXGZFileStream& operator>>(FXdouble& v){ FXStream::operator>>(v); return *this; } FXGZFileStream& operator>>(FXlong& v){ FXStream::operator>>(v); return *this; } FXGZFileStream& operator>>(FXulong& v){ FXStream::operator>>(v); return *this; } /// Load arrays of items from stream FXGZFileStream& load(FXuchar* p,FXuval n){ FXStream::load(p,n); return *this; } FXGZFileStream& load(FXchar* p,FXuval n){ FXStream::load(p,n); return *this; } FXGZFileStream& load(FXushort* p,FXuval n){ FXStream::load(p,n); return *this; } FXGZFileStream& load(FXshort* p,FXuval n){ FXStream::load(p,n); return *this; } FXGZFileStream& load(FXuint* p,FXuval n){ FXStream::load(p,n); return *this; } FXGZFileStream& load(FXint* p,FXuval n){ FXStream::load(p,n); return *this; } FXGZFileStream& load(FXfloat* p,FXuval n){ FXStream::load(p,n); return *this; } FXGZFileStream& load(FXdouble* p,FXuval n){ FXStream::load(p,n); return *this; } FXGZFileStream& load(FXlong* p,FXuval n){ FXStream::load(p,n); return *this; } FXGZFileStream& load(FXulong* p,FXuval n){ FXStream::load(p,n); return *this; } /// Save object FXGZFileStream& saveObject(const FXObject* v){ FXStream::saveObject(v); return *this; } /// Load object FXGZFileStream& loadObject(FXObject*& v){ FXStream::loadObject(v); return *this; } /// Clean up virtual ~FXGZFileStream(); }; } #endif #endif fox1.6-1.6.57/include/FXGradientBar.h000066400000000000000000000275601326741342000170630ustar00rootroot00000000000000/******************************************************************************** * * * G r a d i e n t B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGradientBar.h,v 1.52 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXGRADIENTBAR_H #define FXGRADIENTBAR_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// Gradient bar orientation enum { GRADIENTBAR_HORIZONTAL = 0, /// Gradient bar shown horizontally GRADIENTBAR_VERTICAL = 0x00008000, /// Gradient bar shown vertically GRADIENTBAR_NO_CONTROLS = 0, /// No controls shown GRADIENTBAR_CONTROLS_TOP = 0x00010000, /// Controls on top GRADIENTBAR_CONTROLS_BOTTOM = 0x00020000, /// Controls on bottom GRADIENTBAR_CONTROLS_LEFT = GRADIENTBAR_CONTROLS_TOP, /// Controls on left GRADIENTBAR_CONTROLS_RIGHT = GRADIENTBAR_CONTROLS_BOTTOM /// Controls on right }; /// Blend modes enum { GRADIENT_BLEND_LINEAR, /// Linear blend GRADIENT_BLEND_POWER, /// Power law blend GRADIENT_BLEND_SINE, /// Sine blend GRADIENT_BLEND_INCREASING, /// Quadratic increasing blend GRADIENT_BLEND_DECREASING /// Quadratic decreasing blend }; // Gradient segment struct FXGradient { FXdouble lower; /// Lower value FXdouble middle; /// Middle value FXdouble upper; /// Upper value FXColor lowerColor; /// Lower color FXColor upperColor; /// Upper color FXuchar blend; /// Blend method }; class FXImage; /** * The gradient bar is a control that is used to edit color gradient, * such as used in texture mapping and shape filling. */ class FXAPI FXGradientBar : public FXFrame { FXDECLARE(FXGradientBar) protected: FXImage *bar; // Image containing colors FXGradient *seg; // Segments FXint nsegs; // Number of segments FXint sellower; // Lower selected segment FXint selupper; // Upper selected segment FXint dropped; // Dropped segment FXint current; // Current segment FXint anchor; // Anchor segment FXint grip; // Grip being dragged, if any FXint where; // Where dropped in segment FXString tip; // Tooltip value FXString help; // Help value FXColor selectColor; // Select color FXint offset; // Offset protected: FXGradientBar(); void updatebar(); FXdouble getValue(FXint x,FXint y) const; FXint getSegmentLowerPos(FXint sg) const; FXint getSegmentUpperPos(FXint sg) const; FXint getSegmentMiddlePos(FXint sg) const; void drawUpArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr); void drawDnArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr); void drawRtArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr); void drawLtArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr); void drawBottomArrows(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawTopArrows(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawLeftArrows(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawRightArrows(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); static FXdouble blendlinear(FXdouble middle,FXdouble pos); static FXdouble blendpower(FXdouble middle,FXdouble pos); static FXdouble blendsine(FXdouble middle,FXdouble pos); static FXdouble blendincreasing(FXdouble middle,FXdouble pos); static FXdouble blenddecreasing(FXdouble middle,FXdouble pos); private: FXGradientBar(const FXGradientBar&); FXGradientBar &operator=(const FXGradientBar&); public: enum { GRIP_NONE, GRIP_LOWER, GRIP_SEG_LOWER, GRIP_MIDDLE, GRIP_SEG_UPPER, GRIP_UPPER }; public: long onPaint(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onDNDEnter(FXObject*,FXSelector,void*); long onDNDLeave(FXObject*,FXSelector,void*); long onDNDMotion(FXObject*,FXSelector,void*); long onDNDDrop(FXObject*,FXSelector,void*); long onCmdBlending(FXObject*,FXSelector,void*); long onUpdBlending(FXObject*,FXSelector,void*); long onUpdSegColor(FXObject*,FXSelector,void*); long onCmdSegColor(FXObject*,FXSelector,void*); long onUpdRecenter(FXObject*,FXSelector,void*); long onCmdRecenter(FXObject*,FXSelector,void*); long onUpdSplit(FXObject*,FXSelector,void*); long onCmdSplit(FXObject*,FXSelector,void*); long onUpdMerge(FXObject*,FXSelector,void*); long onCmdMerge(FXObject*,FXSelector,void*); long onUpdUniform(FXObject*,FXSelector,void*); long onCmdUniform(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: enum{ ID_LOWER_COLOR=FXFrame::ID_LAST, ID_UPPER_COLOR, ID_BLEND_LINEAR, ID_BLEND_POWER, ID_BLEND_SINE, ID_BLEND_INCREASING, ID_BLEND_DECREASING, ID_RECENTER, ID_SPLIT, ID_MERGE, ID_UNIFORM, ID_LAST }; public: /// Construct a gradient bar FXGradientBar(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /** * Obtain segment containing location x, y. * Returns -1 if no matching segment was found. */ FXint getSegment(FXint x,FXint y) const; /** * Get the grip in segment sg which is closest to location (x, y), * one of GRIP_LOWER, GRIP_SEG_LOWER, GRIP_MIDDLE, GRIP_SEG_UPPER, * GRIP_UPPER or GRIP_NONE. */ FXint getGrip(FXint sg,FXint x,FXint y) const; /// Return the number of segments FXint getNumSegments() const { return nsegs; } /** * Replace the current gradient segments. * The gradient bar makes a copy of the input segments array. */ void setGradients(const FXGradient *segments,FXint nsegments); /** * Return a copy of the gradient segments. * The array of segments is allocated using FXMALLOC and should be freed * by the caller using FXFREE. */ void getGradients(FXGradient*& segments,FXint& nsegments) const; /// Change current segment void setCurrentSegment(FXint index,FXbool notify=FALSE); /// Return current segment, or -1 if there is no current segment FXint getCurrentSegment() const { return current; } /// Change anchor segment void setAnchorSegment(FXint index); /// Return anchor segment, or -1 if there is no anchor segment FXint getAnchorSegment() const { return anchor; } /// Select segment(s) FXbool selectSegments(FXint fm,FXint to,FXbool notify=FALSE); /// Deselect all segments FXbool deselectSegments(FXbool notify); /// Returns TRUE if the specified segment is selected FXbool isSegmentSelected(FXint s) const; /// Set lower color of a segment void setSegmentLowerColor(FXint s,FXColor clr,FXbool notify=FALSE); /// Set upper color of a segment void setSegmentUpperColor(FXint s,FXColor clr,FXbool notify=FALSE); /// Get lower color of a segment FXColor getSegmentLowerColor(FXint s) const; /// Get upper color of a segment FXColor getSegmentUpperColor(FXint s) const; /// Move lower point of segment sg void moveSegmentLower(FXint sg,FXdouble val,FXbool notify=FALSE); /// Move middle point of segment sg void moveSegmentMiddle(FXint sg,FXdouble val,FXbool notify=FALSE); /// Move upper point of segment sg void moveSegmentUpper(FXint sg,FXdouble val,FXbool notify=FALSE); /// Move segments sglo to sghi to new position val void moveSegments(FXint sglo,FXint sghi,FXdouble val,FXbool notify=FALSE); /// Get lower value of segment sg FXdouble getSegmentLower(FXint sg) const; /// Get middle value of segment sg FXdouble getSegmentMiddle(FXint sg) const; /// Get upper value of segment sg FXdouble getSegmentUpper(FXint sg) const; /** * Get gradient ramp. * The ramp argument should be an array of size nramp, which will be * filled with the appropriate color values. */ void gradient(FXColor *ramp,FXint nramp); /** * Get blend mode of segment, one of GRADIENT_BLEND_LINEAR, * GRADIENT_BLEND_POWER, GRADIENT_BLEND_SINE, GRADIENT_BLEND_INCREASING, * or GRADIENT_BLEND_DECREASING. */ FXuint getSegmentBlend(FXint s) const; /// Split segment at the midpoint void splitSegments(FXint sglo,FXint sghi,FXbool notify=FALSE); /// Merge segments void mergeSegments(FXint sglo,FXint sghi,FXbool notify=FALSE); /// Make segments uniformly distributed void uniformSegments(FXint sglo,FXint sghi,FXbool notify=FALSE); /// Change blend mode of segment void blendSegments(FXint sglo,FXint sghi,FXuint blend=GRADIENT_BLEND_LINEAR,FXbool notify=FALSE); /// Get the gradient bar style FXuint getBarStyle() const; /// Change the gradient bar style void setBarStyle(FXuint style); /// Set color void setSelectColor(FXColor clr); /// Get color FXColor getSelectColor() const { return selectColor; } /// Set status line help text for this gradient bar void setHelpText(const FXString& text){ help=text; } /// Get status line help text for this gradient bar const FXString& getHelpText() const { return help; } /// Set tool tip message for this gradient bar void setTipText(const FXString& text){ tip=text; } /// Get tool tip message for this gradient bar const FXString& getTipText() const { return tip; } /// Save gradient bar to a stream virtual void save(FXStream& store) const; /// Load gradient bar from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXGradientBar(); }; } #endif fox1.6-1.6.57/include/FXGroupBox.h000066400000000000000000000104301326741342000164320ustar00rootroot00000000000000/******************************************************************************** * * * G r o u p B o x W i n d o w W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGroupBox.h,v 1.23 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXGROUPBOX_H #define FXGROUPBOX_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { // Group box options enum { GROUPBOX_TITLE_LEFT = 0, /// Title is left-justified GROUPBOX_TITLE_CENTER = 0x00020000, /// Title is centered GROUPBOX_TITLE_RIGHT = 0x00040000, /// Title is right-justified GROUPBOX_NORMAL = GROUPBOX_TITLE_LEFT }; /** * A group box widget provides a nice raised or sunken border * around a group of widgets, providing a visual delineation. * Typically, a title is placed over the border to provide some * clarification. */ class FXAPI FXGroupBox : public FXPacker { FXDECLARE(FXGroupBox) protected: FXString label; FXFont *font; FXColor textColor; protected: FXGroupBox(); private: FXGroupBox(const FXGroupBox&); FXGroupBox &operator=(const FXGroupBox&); public: long onPaint(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); public: /// Construct group box layout manager FXGroupBox(FXComposite* p,const FXString& text,FXuint opts=GROUPBOX_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_SPACING,FXint pr=DEFAULT_SPACING,FXint pt=DEFAULT_SPACING,FXint pb=DEFAULT_SPACING,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Enable the window virtual void enable(); /// Disable the window virtual void disable(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Change group box title text void setText(const FXString& text); /// Return current groupbox title text FXString getText() const { return label; } /// Change group box style void setGroupBoxStyle(FXuint style); /// Return current group box style FXuint getGroupBoxStyle() const; /// Change title font void setFont(FXFont* fnt); /// Return title font FXFont* getFont() const { return font; } /// Change title text color void setTextColor(FXColor clr); /// Return text color FXColor getTextColor() const { return textColor; } /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXHash.h000066400000000000000000000063321326741342000155560ustar00rootroot00000000000000/******************************************************************************** * * * H a s h T a b l e C l a s s * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXHash.h,v 1.12 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXHASH_H #define FXHASH_H namespace FX { /** * A hash table for associating pointers to pointers. */ class FXAPI FXHash { private: struct FXEntry { void* key; void* value; }; private: FXEntry *table; // Hash table FXuint total; // Table size FXuint used; // Number of used entries FXuint free; // Number of free entries private: FXHash(const FXHash&); FXHash &operator=(const FXHash&); public: /// Construct empty hash table FXHash(); /// Resize the table to the given size. void size(FXuint m); /// Return the size of the table FXint size() const { return total; } /// Return number of items in table FXuint no() const { return used; } /// Insert key into the table void* insert(void* key,void* value); /// Replace key in table void* replace(void* key,void* value); /// Remove key from the table void* remove(void* key); /// Return value of key void* find(void* key) const; /// Return true if slot is empty bool empty(FXint pos) const { return (table[pos].key==NULL)||(table[pos].key==(void*)-1L); } /// Return key at position pos void* key(FXint pos) const { return table[pos].key; } /// Return data pointer at position pos void* value(FXint pos) const { return table[pos].value; } /// Clear hash table void clear(); /// Destructor virtual ~FXHash(); }; } #endif fox1.6-1.6.57/include/FXHeader.h000066400000000000000000000336741326741342000160740ustar00rootroot00000000000000/******************************************************************************** * * * H e a d e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXHeader.h,v 1.70.2.2 2006/11/17 16:02:31 fox Exp $ * ********************************************************************************/ #ifndef FXHEADER_H #define FXHEADER_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { class FXIcon; class FXFont; class FXHeader; /// Header style options enum { HEADER_BUTTON = 0x00008000, /// Button style can be clicked HEADER_HORIZONTAL = 0, /// Horizontal header control (default) HEADER_VERTICAL = 0x00010000, /// Vertical header control HEADER_TRACKING = 0x00020000, /// Tracks continuously while moving HEADER_RESIZE = 0x00040000, /// Allow resizing sections HEADER_NORMAL = HEADER_HORIZONTAL|FRAME_NORMAL }; /// Header item class FXAPI FXHeaderItem : public FXObject { FXDECLARE(FXHeaderItem) friend class FXHeader; protected: FXString label; // Text of item FXIcon *icon; // Icon of item void *data; // Item user data pointer FXint size; // Item size FXint pos; // Item position FXuint state; // Item state flags private: FXHeaderItem(const FXHeaderItem&); FXHeaderItem& operator=(const FXHeaderItem&); protected: FXHeaderItem(){} virtual void draw(const FXHeader* header,FXDC& dc,FXint x,FXint y,FXint w,FXint h); public: enum{ ARROW_NONE = 0, /// No arrow ARROW_UP = 1, /// Arrow pointing up ARROW_DOWN = 2, /// Arrow pointing down PRESSED = 4, /// Pressed down RIGHT = 8, /// Align on right LEFT = 16, /// Align on left CENTER_X = 0, /// Aling centered horizontally (default) TOP = 32, /// Align on top BOTTOM = 64, /// Align on bottom CENTER_Y = 0, /// Aling centered vertically (default) BEFORE = 128, /// Icon before the text AFTER = 256, /// Icon after the text ABOVE = 512, /// Icon above the text BELOW = 1024 /// Icon below the text }; public: /// Construct new item with given text, icon, size, and user-data FXHeaderItem(const FXString& text,FXIcon* ic=NULL,FXint s=0,void* ptr=NULL):label(text),icon(ic),data(ptr),size(s),pos(0),state(LEFT|BEFORE){} /// Change item's text label virtual void setText(const FXString& txt); /// Return item's text label const FXString& getText() const { return label; } /// Change item's icon virtual void setIcon(FXIcon* icn); /// Return item's icon FXIcon* getIcon() const { return icon; } /// Change item's user data void setData(void* ptr){ data=ptr; } /// Get item's user data void* getData() const { return data; } /// Change size void setSize(FXint s){ size=s; } /// Obtain current size FXint getSize() const { return size; } /// Change position void setPos(FXint p){ pos=p; } /// Obtain current position FXint getPos() const { return pos; } /// Change sort direction (FALSE, TRUE, MAYBE) void setArrowDir(FXbool dir=MAYBE); /// Return sort direction (FALSE, TRUE, MAYBE) FXbool getArrowDir() const; /// Change content justification void setJustify(FXuint justify=LEFT|CENTER_Y); /// Return content justification FXuint getJustify() const { return state&(RIGHT|LEFT|TOP|BOTTOM); } /// Change icon position void setIconPosition(FXuint mode=BEFORE); /// Return icon position FXuint getIconPosition() const { return state&(BEFORE|AFTER|ABOVE|BELOW); } /// Change state to pressed void setPressed(FXbool pressed); /// Return pressed state FXbool isPressed() const { return (state&PRESSED)!=0; } /// Return the item's content width in the header virtual FXint getWidth(const FXHeader* header) const; /// Return the item's content height in the header virtual FXint getHeight(const FXHeader* header) const; /// Create server-side resources virtual void create(); /// Detach from server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Stream serialization virtual void save(FXStream& store) const; virtual void load(FXStream& store); /// Destructor virtual ~FXHeaderItem(){} }; /// List of FXHeaderItem's typedef FXObjectListOf FXHeaderItemList; /** * Header control may be placed over a table or list to provide a resizable * captions above a number of columns. * Each caption comprises a label and an optional icon; in addition, an arrow * may be shown to indicate whether the items in that column are sorted, and * if so, whether they are sorted in increasing or decreasing order. * Each caption can be interactively resized. During the resizing, if the * HEADER_TRACKING was specified, the header control sends a SEL_CHANGED message * to its target, with the message data set to the caption number being resized, * of the type FXint. * If the HEADER_TRACKING was not specified the SEL_CHANGED message is sent at * the end of the resizing operation. * Clicking on a caption causes a message of type SEL_COMMAND to be sent to the * target, with the message data set to the caption number being clicked. * A single click on a split causes a message of type SEL_CLICKED to be sent to the * target; a typical response to this message would be to adjust the size of * the split to fit the contents displayed underneath it. * The contents may be scrolled by calling setPosition(). */ class FXAPI FXHeader : public FXFrame { FXDECLARE(FXHeader) protected: FXHeaderItemList items; // Item list FXColor textColor; // Text color FXFont *font; // Text font FXString help; // Help text FXint pos; // Scroll position FXint active; // Active button FXint activepos; // Position of active item FXint activesize; // Size of active item FXint offset; // Offset where split grabbed protected: FXHeader(); void drawSplit(FXint pos); virtual FXHeaderItem *createItem(const FXString& text,FXIcon* icon,FXint size,void* ptr); private: FXHeader(const FXHeader&); FXHeader &operator=(const FXHeader&); public: long onPaint(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onTipTimer(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); public: /// Construct new header control FXHeader(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=HEADER_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Return number of items FXint getNumItems() const { return items.no(); } /// Return total size of all items FXint getTotalSize() const; /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Set the current position void setPosition(FXint pos); /// Return the current position FXint getPosition() const { return pos; } /** * Return item-index given coordinate offset, or -1 if coordinate * is before first item in header, or nitems if coordinate is after * last item in header. */ FXint getItemAt(FXint coord) const; /// Return item at given index FXHeaderItem *getItem(FXint index) const; /// Replace the item with a [possibly subclassed] item FXint setItem(FXint index,FXHeaderItem* item,FXbool notify=FALSE); /// Replace items text, icon, and user-data pointer FXint setItem(FXint index,const FXString& text,FXIcon *icon=NULL,FXint size=0,void* ptr=NULL,FXbool notify=FALSE); /// Fill header by appending items from array of strings FXint fillItems(const FXchar** strings,FXIcon *icon=NULL,FXint size=0,void* ptr=NULL,FXbool notify=FALSE); /// Fill header by appending items from newline separated strings FXint fillItems(const FXString& strings,FXIcon *icon=NULL,FXint size=0,void* ptr=NULL,FXbool notify=FALSE); /// Insert a new [possibly subclassed] item at the give index FXint insertItem(FXint index,FXHeaderItem* item,FXbool notify=FALSE); /// Insert item at index with given text, icon, and user-data pointer FXint insertItem(FXint index,const FXString& text,FXIcon *icon=NULL,FXint size=0,void* ptr=NULL,FXbool notify=FALSE); /// Append a [possibly subclassed] item to the list FXint appendItem(FXHeaderItem* item,FXbool notify=FALSE); /// Append new item with given text and optional icon, and user-data pointer FXint appendItem(const FXString& text,FXIcon *icon=NULL,FXint size=0,void* ptr=NULL,FXbool notify=FALSE); /// Prepend a [possibly subclassed] item to the list FXint prependItem(FXHeaderItem* item,FXbool notify=FALSE); /// Prepend new item with given text and optional icon, and user-data pointer FXint prependItem(const FXString& text,FXIcon *icon=NULL,FXint size=0,void* ptr=NULL,FXbool notify=FALSE); /// Extract item from list FXHeaderItem* extractItem(FXint index,FXbool notify=FALSE); /// Remove item at index void removeItem(FXint index,FXbool notify=FALSE); /// Remove all items void clearItems(FXbool notify=FALSE); /// Change text label for item at index void setItemText(FXint index,const FXString& text); /// Get text of item at index FXString getItemText(FXint index) const; /// Change icon of item at index void setItemIcon(FXint index,FXIcon* icon); /// Return icon of item at index FXIcon* getItemIcon(FXint index) const; /// Change size of item at index void setItemSize(FXint index,FXint size); /// Return size of item at index FXint getItemSize(FXint index) const; /// Compute offset from the left side of item at index FXint getItemOffset(FXint index) const; /// Change data of item at index void setItemData(FXint index,void* ptr); /// Return data of item at index void* getItemData(FXint index) const; /// Change sort direction (FALSE, TRUE, MAYBE) void setArrowDir(FXint index,FXbool dir=MAYBE); /// Return sort direction (FALSE, TRUE, MAYBE) FXbool getArrowDir(FXint index) const; /** * Change item justification. Horizontal justification is controlled by passing * FXHeaderItem::RIGHT, FXHeaderItem::LEFT, or FXHeaderItem::CENTER_X. * Vertical justification is controlled by FXHeaderItem::TOP, FXHeaderItem::BOTTOM, * or FXHeaderItem::CENTER_Y. * The default is a combination of FXHeaderItem::LEFT and FXHeaderItem::CENTER_Y. */ void setItemJustify(FXint index,FXuint justify); /// Return item justification FXuint getItemJustify(FXint index) const; /** * Change relative position of icon and text of item. * Passing FXHeaderItem::BEFORE or FXHeaderItem::AFTER places the icon * before or after the text, and passing FXHeaderItem::ABOVE or * FXHeaderItem::BELOW places it above or below the text, respectively. * The default of FXHeaderItem::BEFORE places the icon in front of the text. */ void setItemIconPosition(FXint index,FXuint mode); /// Return relative icon and text position FXuint getItemIconPosition(FXint index) const; /// Changed button item's pressed state void setItemPressed(FXint index,FXbool pressed=TRUE); /// Return TRUE if button item is pressed in FXbool isItemPressed(FXint index) const; /// Scroll to make given item visible void makeItemVisible(FXint index); /// Repaint header at index void updateItem(FXint index) const; /// Change text font void setFont(FXFont* fnt); /// return text font FXFont* getFont() const { return font; } /// Return text color FXColor getTextColor() const { return textColor; } /// Change text color void setTextColor(FXColor clr); /// Set header style options void setHeaderStyle(FXuint style); /// Get header style options FXuint getHeaderStyle() const; /// Set the status line help text for this header void setHelpText(const FXString& text); /// Get the status line help text for this header const FXString& getHelpText() const { return help; } /// Save header to a stream virtual void save(FXStream& store) const; /// Load header from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXHeader(); }; } #endif fox1.6-1.6.57/include/FXHorizontalFrame.h000066400000000000000000000055541326741342000200040ustar00rootroot00000000000000/******************************************************************************** * * * H o r i z o n t a l C o n t a i n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXHorizontalFrame.h,v 1.17 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXHORIZONTALFRAME_H #define FXHORIZONTALFRAME_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { /** * Horizontal frame layout manager widget is used to automatically * place child-windows horizontally from left-to-right, or right-to-left, * depending on the child window's layout hints. */ class FXAPI FXHorizontalFrame : public FXPacker { FXDECLARE(FXHorizontalFrame) protected: FXHorizontalFrame(){} private: FXHorizontalFrame(const FXHorizontalFrame&); FXHorizontalFrame &operator=(const FXHorizontalFrame&); public: /// Construct a horizontal frame layout manager FXHorizontalFrame(FXComposite *p,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_SPACING,FXint pr=DEFAULT_SPACING,FXint pt=DEFAULT_SPACING,FXint pb=DEFAULT_SPACING,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); }; } #endif fox1.6-1.6.57/include/FXICOIcon.h000066400000000000000000000065761326741342000161300ustar00rootroot00000000000000/******************************************************************************** * * * I C O I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Janusz Ganczarski. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXICOIcon.h,v 1.20 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXICOICON_H #define FXICOICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// ICO (Microsoft icon format) icon class FXAPI FXICOIcon : public FXIcon { FXDECLARE(FXICOIcon) protected: FXICOIcon(){} private: FXICOIcon(const FXICOIcon&); FXICOIcon &operator=(const FXICOIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct icon from memory stream formatted in Microsoft icon format FXICOIcon(FXApp* a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in Microsoft icon format format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in Microsoft icon format format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXICOIcon(); }; #ifndef FXLOADICO #define FXLOADICO /** * Check if stream contains a ICO, return TRUE if so. */ extern FXAPI bool fxcheckICO(FXStream& store); /** * Load an ICO (Microsoft icon format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadICO(FXStream& store,FXColor*& data,FXint& width,FXint& height,FXint& xspot,FXint& yspot); /** * Save an ICO (Microsoft icon format) file to a stream. * If no hot-spot given, save as an ICO instead of a CUR resource. */ extern FXAPI bool fxsaveICO(FXStream& store,const FXColor *data,FXint width,FXint height,FXint xspot=-1,FXint yspot=-1); #endif } #endif fox1.6-1.6.57/include/FXICOImage.h000066400000000000000000000065511326741342000162530ustar00rootroot00000000000000/******************************************************************************** * * * I C O I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Janusz Ganczarski. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXICOImage.h,v 1.20 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXICOIMAGE_H #define FXICOIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// ICO (Microsoft icon format) graphics file class FXAPI FXICOImage : public FXImage { FXDECLARE(FXICOImage) protected: FXICOImage(){} private: FXICOImage(const FXICOImage&); FXICOImage &operator=(const FXICOImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct image from memory stream formatted in Microsoft icon format FXICOImage(FXApp* a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in Microsoft icon format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in Microsoft icon format virtual bool loadPixels(FXStream& store); /// Destroy image virtual ~FXICOImage(); }; #ifndef FXLOADICO #define FXLOADICO /** * Check if stream contains a ICO, return TRUE if so. */ extern FXAPI bool fxcheckICO(FXStream& store); /** * Load an ICO (Microsoft icon format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadICO(FXStream& store,FXColor*& data,FXint& width,FXint& height,FXint& xspot,FXint& yspot); /** * Save an ICO (Microsoft icon format) file to a stream. * If no hot-spot given, save as an ICO instead of a CUR resource. */ extern FXAPI bool fxsaveICO(FXStream& store,const FXColor *data,FXint width,FXint height,FXint xspot=-1,FXint yspot=-1); #endif } #endif fox1.6-1.6.57/include/FXIFFIcon.h000066400000000000000000000061371326741342000161130ustar00rootroot00000000000000/******************************************************************************** * * * I F F I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIFFIcon.h,v 1.10 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXIFFICON_H #define FXIFFICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /** * The IFF Icon provides support for the EA/Amiga Image File Format. */ class FXAPI FXIFFIcon : public FXIcon { FXDECLARE(FXIFFIcon) protected: FXIFFIcon(){} private: FXIFFIcon(const FXIFFIcon&); FXIFFIcon &operator=(const FXIFFIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct an icon from memory stream formatted as IFF format FXIFFIcon(FXApp* a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in IFF format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in IFF format virtual bool loadPixels(FXStream& store); /// Destroy virtual ~FXIFFIcon(); }; #ifndef FXLOADIFF #define FXLOADIFF /** * Check if stream contains a IFF, return TRUE if so. */ extern FXAPI bool fxcheckIFF(FXStream& store); /** * Load an IFF (EA Image File Format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadIFF(FXStream& store,FXColor*& data,FXint& width,FXint& height); #endif } #endif fox1.6-1.6.57/include/FXIFFImage.h000066400000000000000000000061201326741342000162350ustar00rootroot00000000000000/******************************************************************************** * * * I F F I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIFFImage.h,v 1.10 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXIFFIMAGE_H #define FXIFFIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /** * The IFF Image provides support for the EA/Amiga Image File Format. */ class FXAPI FXIFFImage : public FXImage { FXDECLARE(FXIFFImage) protected: FXIFFImage(){} private: FXIFFImage(const FXIFFImage&); FXIFFImage &operator=(const FXIFFImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct an image from memory stream formatted as IFF format FXIFFImage(FXApp* a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in IFF format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in IFF format virtual bool loadPixels(FXStream& store); /// Destroy virtual ~FXIFFImage(); }; #ifndef FXLOADIFF #define FXLOADIFF /** * Check if stream contains a IFF, return TRUE if so. */ extern FXAPI bool fxcheckIFF(FXStream& store); /** * Load an IFF (EA Image File Format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadIFF(FXStream& store,FXColor*& data,FXint& width,FXint& height); #endif } #endif fox1.6-1.6.57/include/FXIO.h000066400000000000000000000143721326741342000152050ustar00rootroot00000000000000/******************************************************************************** * * * I / O D e v i c e C l a s s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIO.h,v 1.8 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXIO_H #define FXIO_H namespace FX { /** * FXIO manipulates a handle to an abstract i/o device. * The various subclasses of FXIO perform i/o on files, sockets, * pipes, and possibly other devices. */ class FXAPI FXIO { protected: FXInputHandle device; // Device (file/pipe/socket/whatever) FXuint access; // Access being performed private: FXIO(const FXIO&); FXIO &operator=(const FXIO&); public: /// File modes enum { /// Permissions OtherRead = 0x00004, /// Others have read permission OtherWrite = 0x00002, /// Others have write permisson OtherExec = 0x00001, /// Others have execute permission OtherReadWrite = 0x00006, /// Others have read and write permission OtherFull = 0x00007, /// Others have full access GroupRead = 0x00020, /// Group has read permission GroupWrite = 0x00010, /// Group has write permission GroupExec = 0x00008, /// Group has execute permission GroupReadWrite = 0x00030, /// Group has read and write permission GroupFull = 0x00038, /// Group has full access OwnerRead = 0x00100, /// Owner has read permission OwnerWrite = 0x00080, /// Owner has write permission OwnerExec = 0x00040, /// Owner has execute permission OwnerReadWrite = 0x00180, /// Owner has read and write permission OwnerFull = 0x001C0, /// Owner has full access /// Other flags Hidden = 0x00200, /// Hidden file Directory = 0x00400, /// Is directory File = 0x00800, /// Is regular file SymLink = 0x01000, /// Is symbolic link /// Special mode bits SetUser = 0x02000, /// Set user id SetGroup = 0x04000, /// Set group id Sticky = 0x08000, /// Sticky bit /// Device special files Character = 0x10000, /// Character device Block = 0x20000, /// Block device Socket = 0x40000, /// Socket device Fifo = 0x80000 /// Fifo device }; /// Access modes enum { /// Basic access options NoAccess = 0, /// No access ReadOnly = 1, /// Open for reading WriteOnly = 2, /// Open for writing ReadWrite = 3, /// Open for read and write Append = 4, /// Open for append Truncate = 8, /// Truncate to zero when writing Create = 16, /// Create if it doesn't exist Exclusive = 32, /// Fail if trying to create a file which already exists NonBlocking = 64, /// Non-blocking i/o /// Convenience access options Reading = ReadOnly, /// Normal options for reading Writing = ReadWrite|Create|Truncate /// Normal options for writing }; /// Positioning modes enum { Begin = 0, /// Position from the begin (default) Current = 1, /// Position relative to current position End = 2 /// Position from the end }; public: /// Construct FXIO(); /// Open device with access mode and handle virtual bool open(FXInputHandle handle,FXuint mode); /// Return true if open virtual bool isOpen() const; /// Return access mode FXuint mode() const { return access; } /// Return handle FXInputHandle handle() const { return device; } /// Attach existing device handle virtual void attach(FXInputHandle handle,FXuint mode); /// Detach device handle virtual void detach(); /// Get current file position virtual FXlong position() const; /// Change file position, returning new position from start virtual FXlong position(FXlong offset,FXuint from=FXIO::Begin); /// Read block of bytes, returning number of bytes read virtual FXival readBlock(void* data,FXival count); /// Write block of bytes, returning number of bytes written virtual FXival writeBlock(const void* data,FXival count); /// Truncate file virtual FXlong truncate(FXlong size); /// Flush to disk virtual bool flush(); /// Test if we're at the end virtual bool eof(); /// Return size of i/o device virtual FXlong size(); /// Close handle virtual bool close(); /// Destroy and close virtual ~FXIO(); }; } #endif fox1.6-1.6.57/include/FXIcon.h000066400000000000000000000121441326741342000155610ustar00rootroot00000000000000/******************************************************************************** * * * I c o n - O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIcon.h,v 1.29 2006/01/22 17:58:04 fox Exp $ * ********************************************************************************/ #ifndef FXICON_H #define FXICON_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { class FXDC; class FXDCWindow; class FXDrawable; class FXTopWindow; /** * An Icon is an image with two additional server-side resources: a shape * bitmap, which is used to mask those pixels where the background should * be preserved during the drawing, and a etch bitmap, which is used to * draw the icon when it is disabled. */ class FXAPI FXIcon : public FXImage { FXDECLARE(FXIcon) friend class FXDC; friend class FXWindow; friend class FXDCWindow; friend class FXDrawable; friend class FXTopWindow; protected: FXID shape; // Shape pixmap FXID etch; // Etch pixmap FXColor transp; // Transparency color protected: FXIcon(){} FXColor guesstransp(); private: FXIcon(const FXIcon&); FXIcon &operator=(const FXIcon&); public: /** * Create an icon with an initial pixel buffer pix, a transparent color clr, * and options as in FXImage. The transparent color is used to determine which * pixel values are transparent, i.e. need to be masked out in the absence of * a true alpha channel. * If the flag IMAGE_OPAQUE is passed, the shape and etch bitmaps are generated * as if the image is fully opaque, even if it has an alpha channel or transparancy * color. The flag IMAGE_ALPHACOLOR is used to force a specific alpha color instead * of the alpha channel obtained from the image file. * Specifying IMAGE_ALPHAGUESS causes Icon to obtain the alpha color from the background * color of the image; it has the same effect as IMAGE_ALPHACOLOR in the sense that * the icon will be transparent for those colors matching the alpha color. */ FXIcon(FXApp* a,const FXColor *pix=NULL,FXColor clr=0,FXuint opts=0,FXint w=1,FXint h=1); /** * Create the server side pixmap, the shape bitmap, and the etch bitmap, then * call render() to fill it with the pixel data from the client-side buffer. After * the server-side pixmap and bitmaps have been created, the client-side pixel * buffer will be deleted unless IMAGE_KEEP has been specified. If the pixel buffer * is not owned, i.e. the flag IMAGE_OWNED is not set, the pixel buffer will not * be deleted; however the pixel buffer will be set to NULL. */ virtual void create(); /** * Detach the server side pixmap, shape bitmap, and etch bitmap from the Icon. * Afterwards, the Icon is left as if it never had a server-side resources. */ virtual void detach(); /** * Destroy the server-side pixmap and the shape bitmap and etch bitmap. * The client-side pixel buffer is not affected. */ virtual void destroy(); /** * Render the server-side pixmap, shape bitmap and etch bitmap for the icon * from the client-side pixel buffer. */ virtual void render(); /** * Resize both client-side and server-side representations (if any) to the * given width and height. The new representations typically contain garbage * after this operation and need to be re-filled. */ virtual void resize(FXint w,FXint h); /// Obtain transparency color FXColor getTransparentColor() const { return transp; } /// Change transparency color void setTransparentColor(FXColor color){ transp=color; } /// Destructor virtual ~FXIcon(); }; } #endif fox1.6-1.6.57/include/FXIconDict.h000066400000000000000000000103351326741342000163650ustar00rootroot00000000000000/******************************************************************************** * * * I c o n D i c t i o n a r y * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIconDict.h,v 1.6 2006/02/03 00:33:15 fox Exp $ * ********************************************************************************/ #ifndef FXICONDICT_H #define FXICONDICT_H #ifndef FXDICT_H #include "FXDict.h" #endif namespace FX { class FXIconSource; /** * The Icon Dictionary manages a collection of icons. The icons are referenced * by their file name. When first encountering a new file name, the icon is * located by searching the icon search path for the icon file. If found, the * services of the icon source object are used to load the icon from the file. * A custom icon source may be installed to furnish support for additonal * image file formats. * Once the icon is loaded, an association between the icon name and the icon * is entered into the icon dictionary. Subsequent searches for an icon with * this name will be satisfied from the cached value. * The lifetype of the icons is managed by the icon dictionary, and thus all * icons will be deleted when the dictionary is deleted. */ class FXAPI FXIconDict : public FXDict { FXDECLARE(FXIconDict) private: FXIconSource *source; // Icon source FXString path; // Where to search icons protected: FXIconDict():source(NULL){} virtual void *createData(const void*); virtual void deleteData(void*); private: FXIconDict(const FXIconDict&); FXIconDict &operator=(const FXIconDict&); public: /// Default icon search path static const FXchar defaultIconPath[]; public: /** * Construct icon dictionary, and set initial search path; also * creates a default icon source object. */ FXIconDict(FXApp* app,const FXString& p=defaultIconPath); /// Change icon source void setIconSource(FXIconSource *src){ source=src; } /// Return icon source FXIconSource* getIconSource() const { return source; } /// Set icon search path void setIconPath(const FXString& p){ path=p; } /// Return current icon search path const FXString& getIconPath() const { return path; } /// Insert unique icon loaded from filename into dictionary FXIcon* insert(const FXchar* name){ return (FXIcon*)FXDict::insert(name,name); } /// Remove icon from dictionary FXIcon* remove(const FXchar* name){ return (FXIcon*)FXDict::remove(name); } /// Find icon by name FXIcon* find(const FXchar* name){ return (FXIcon*)FXDict::find(name); } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy the icon dict as well as the icon source virtual ~FXIconDict(); }; } #endif fox1.6-1.6.57/include/FXIconList.h000066400000000000000000000532511326741342000164210ustar00rootroot00000000000000/******************************************************************************** * * * I c o n L i s t W i d g e t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIconList.h,v 1.95.2.4 2006/11/17 16:02:31 fox Exp $ * ********************************************************************************/ #ifndef FXICONLIST_H #define FXICONLIST_H #ifndef FXSCROLLAREA_H #include "FXScrollArea.h" #endif namespace FX { /// Icon list styles enum { ICONLIST_EXTENDEDSELECT = 0, /// Extended selection mode ICONLIST_SINGLESELECT = 0x00100000, /// At most one selected item ICONLIST_BROWSESELECT = 0x00200000, /// Always exactly one selected item ICONLIST_MULTIPLESELECT = 0x00300000, /// Multiple selection mode ICONLIST_AUTOSIZE = 0x00400000, /// Automatically size item spacing ICONLIST_DETAILED = 0, /// List mode ICONLIST_MINI_ICONS = 0x00800000, /// Mini Icon mode ICONLIST_BIG_ICONS = 0x01000000, /// Big Icon mode ICONLIST_ROWS = 0, /// Row-wise mode ICONLIST_COLUMNS = 0x02000000, /// Column-wise mode ICONLIST_NORMAL = ICONLIST_EXTENDEDSELECT }; class FXIcon; class FXHeader; class FXFont; class FXIconList; class FXFileList; /// Icon item class FXAPI FXIconItem : public FXObject { FXDECLARE(FXIconItem) friend class FXIconList; friend class FXFileList; protected: FXString label; FXIcon *bigIcon; FXIcon *miniIcon; void *data; FXuint state; private: FXIconItem(const FXIconItem&); FXIconItem& operator=(const FXIconItem&); protected: FXIconItem():bigIcon(NULL),miniIcon(NULL),data(NULL),state(0){} virtual void draw(const FXIconList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const; virtual FXint hitItem(const FXIconList* list,FXint rx,FXint ry,FXint rw=1,FXint rh=1) const; protected: virtual void drawBigIcon(const FXIconList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const; virtual void drawMiniIcon(const FXIconList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const; virtual void drawDetails(const FXIconList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const; public: enum { SELECTED = 1, /// Selected FOCUS = 2, /// Focus DISABLED = 4, /// Disabled DRAGGABLE = 8, /// Draggable BIGICONOWNED = 16, /// Big icon owned by item MINIICONOWNED = 32 /// Mini icon owned by item }; public: /// Construct new item with given text, icons, and user-data FXIconItem(const FXString& text,FXIcon* bi=NULL,FXIcon* mi=NULL,void* ptr=NULL):label(text),bigIcon(bi),miniIcon(mi),data(ptr),state(0){} /// Change item's text label virtual void setText(const FXString& txt); /// Return item's text label const FXString& getText() const { return label; } /// Change item's big icon, deleting the old icon if it was owned virtual void setBigIcon(FXIcon* icn,FXbool owned=FALSE); /// Return item's big icon FXIcon* getBigIcon() const { return bigIcon; } /// Change item's mini icon, deleting the old icon if it was owned virtual void setMiniIcon(FXIcon* icn,FXbool owned=FALSE); /// Return item's mini icon FXIcon* getMiniIcon() const { return miniIcon; } /// Change item's user data void setData(void* ptr){ data=ptr; } /// Get item's user data void* getData() const { return data; } /// Make item draw as focused virtual void setFocus(FXbool focus); /// Return true if item has focus FXbool hasFocus() const { return (state&FOCUS)!=0; } /// Select item virtual void setSelected(FXbool selected); /// Return true if this item is selected FXbool isSelected() const { return (state&SELECTED)!=0; } /// Enable or disable item virtual void setEnabled(FXbool enabled); /// Return true if this item is enabled FXbool isEnabled() const { return (state&DISABLED)==0; } /// Make item draggable virtual void setDraggable(FXbool draggable); /// Return true if this item is draggable FXbool isDraggable() const { return (state&DRAGGABLE)!=0; } /// Return width of item as drawn in list virtual FXint getWidth(const FXIconList* list) const; /// Return height of item as drawn in list virtual FXint getHeight(const FXIconList* list) const; /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy item and free icons if owned virtual ~FXIconItem(); }; /// Icon item collate function typedef FXint (*FXIconListSortFunc)(const FXIconItem*,const FXIconItem*); /// List of FXIconItem's typedef FXObjectListOf FXIconItemList; /** * A Icon List Widget displays a list of items, each with a text and * optional icon. Icon List can display its items in essentially three * different ways; in big-icon mode, the bigger of the two icons is used * for each item, and the text is placed underneath the icon. In mini- * icon mode, the icons are listed in rows and columns, with the smaller * icon preceding the text. Finally, in detail mode the icons are listed * in a single column, and all fields of the text are shown under a * header control with one button for each subfield. * When an item's selected state changes, the icon list sends * a SEL_SELECTED or SEL_DESELECTED message. A change of the current * item is signified by the SEL_CHANGED message. * The icon list sends SEL_COMMAND messages when the user clicks on an item, * and SEL_CLICKED, SEL_DOUBLECLICKED, and SEL_TRIPLECLICKED when the user * clicks once, twice, or thrice, respectively. * When items are added, replaced, or removed, the icon list sends messages * of the type SEL_INSERTED, SEL_REPLACED, or SEL_DELETED. * In each of these cases, the index to the item, if any, is passed in the * 3rd argument of the message. */ class FXAPI FXIconList : public FXScrollArea { FXDECLARE(FXIconList) protected: FXHeader *header; // Header control FXIconItemList items; // Item list FXint nrows; // Number of rows FXint ncols; // Number of columns FXint anchor; // Anchor item FXint current; // Current item FXint extent; // Extent item FXint cursor; // Cursor item FXint viewable; // Visible item FXFont *font; // Font FXIconListSortFunc sortfunc; // Item sort function FXColor textColor; // Text color FXColor selbackColor; // Selected back color FXColor seltextColor; // Selected text color FXint itemWidth; // Item width FXint itemHeight; // Item height FXint itemSpace; // Space for item label FXint anchorx; // Rectangular selection FXint anchory; FXint currentx; FXint currenty; FXint grabx; // Grab point x FXint graby; // Grab point y FXString lookup; // Lookup string FXString help; // Help text FXbool state; // State of item protected: FXIconList(); void recompute(); void getrowscols(FXint& nr,FXint& nc,FXint w,FXint h) const; void drawLasso(FXint x0,FXint y0,FXint x1,FXint y1); void lassoChanged(FXint ox,FXint oy,FXint ow,FXint oh,FXint nx,FXint ny,FXint nw,FXint nh,FXbool notify); virtual void moveContents(FXint x,FXint y); virtual FXIconItem *createItem(const FXString& text,FXIcon *big,FXIcon* mini,void* ptr); static FXint compareSection(const FXchar *p,const FXchar* q,FXint s); static FXint compareSectionCase(const FXchar *p,const FXchar* q,FXint s); private: FXIconList(const FXIconList&); FXIconList &operator=(const FXIconList&); public: long onPaint(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onTipTimer(FXObject*,FXSelector,void*); long onCmdSelectAll(FXObject*,FXSelector,void*); long onCmdDeselectAll(FXObject*,FXSelector,void*); long onCmdSelectInverse(FXObject*,FXSelector,void*); long onCmdArrangeByRows(FXObject*,FXSelector,void*); long onUpdArrangeByRows(FXObject*,FXSelector,void*); long onCmdArrangeByColumns(FXObject*,FXSelector,void*); long onUpdArrangeByColumns(FXObject*,FXSelector,void*); long onCmdShowDetails(FXObject*,FXSelector,void*); long onUpdShowDetails(FXObject*,FXSelector,void*); long onCmdShowBigIcons(FXObject*,FXSelector,void*); long onUpdShowBigIcons(FXObject*,FXSelector,void*); long onCmdShowMiniIcons(FXObject*,FXSelector,void*); long onUpdShowMiniIcons(FXObject*,FXSelector,void*); long onHeaderChanged(FXObject*,FXSelector,void*); long onHeaderResize(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onClicked(FXObject*,FXSelector,void*); long onDoubleClicked(FXObject*,FXSelector,void*); long onTripleClicked(FXObject*,FXSelector,void*); long onCommand(FXObject*,FXSelector,void*); long onAutoScroll(FXObject*,FXSelector,void*); long onLookupTimer(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); public: static FXint ascending(const FXIconItem* a,const FXIconItem* b); static FXint descending(const FXIconItem* a,const FXIconItem* b); static FXint ascendingCase(const FXIconItem* a,const FXIconItem* b); static FXint descendingCase(const FXIconItem* a,const FXIconItem* b); public: enum { ID_SHOW_DETAILS=FXScrollArea::ID_LAST, ID_SHOW_MINI_ICONS, ID_SHOW_BIG_ICONS, ID_ARRANGE_BY_ROWS, ID_ARRANGE_BY_COLUMNS, ID_HEADER_CHANGE, ID_LOOKUPTIMER, ID_SELECT_ALL, ID_DESELECT_ALL, ID_SELECT_INVERSE, ID_LAST }; public: /// Construct icon list with no items in it initially FXIconList(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=ICONLIST_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Recalculate layout virtual void recalc(); /// Perform layout virtual void layout(); /// Compute and return content width virtual FXint getContentWidth(); /// Return content height virtual FXint getContentHeight(); /// Icon list can receive focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Return viewport size virtual FXint getViewportHeight(); /// Resize this window to the specified width and height virtual void resize(FXint w,FXint h); /// Move and resize this window in the parent's coordinates virtual void position(FXint x,FXint y,FXint w,FXint h); /// Return number of items FXint getNumItems() const { return items.no(); } /// Return number of rows FXint getNumRows() const { return nrows; } /// Return number of columns FXint getNumCols() const { return ncols; } /// Return header control FXHeader* getHeader() const { return header; } /// Set headers from array of strings void setHeaders(const FXchar** strings,FXint size=1); /// Set headers from newline separated strings void setHeaders(const FXString& strings,FXint size=1); /// Append header with given text and optional icon void appendHeader(const FXString& text,FXIcon *icon=NULL,FXint size=1); /// Remove header at index void removeHeader(FXint index); /// Change text of header at index void setHeaderText(FXint index,const FXString& text); /// Return text of header at index FXString getHeaderText(FXint index) const; /// Change icon of header at index void setHeaderIcon(FXint index,FXIcon *icon); /// Return icon of header at index FXIcon* getHeaderIcon(FXint index) const; /// Change size of header at index void setHeaderSize(FXint index,FXint size); /// Return width of header at index FXint getHeaderSize(FXint index) const; /// Return number of headers FXint getNumHeaders() const; /// Return the item at the given index FXIconItem *getItem(FXint index) const; /// Replace the item with a [possibly subclassed] item FXint setItem(FXint index,FXIconItem* item,FXbool notify=FALSE); /// Replace items text, icons, and user-data pointer FXint setItem(FXint index,const FXString& text,FXIcon *big=NULL,FXIcon* mini=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Fill list by appending items from array of strings FXint fillItems(const FXchar** strings,FXIcon *big=NULL,FXIcon* mini=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Fill list by appending items from newline separated strings FXint fillItems(const FXString& strings,FXIcon *big=NULL,FXIcon* mini=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Insert a new [possibly subclassed] item at the give index FXint insertItem(FXint index,FXIconItem* item,FXbool notify=FALSE); /// Insert item at index with given text, icons, and user-data pointer FXint insertItem(FXint index,const FXString& text,FXIcon *big=NULL,FXIcon* mini=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Append a [possibly subclassed] item to the end of the list FXint appendItem(FXIconItem* item,FXbool notify=FALSE); /// Append new item with given text and optional icons, and user-data pointer FXint appendItem(const FXString& text,FXIcon *big=NULL,FXIcon* mini=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Prepend a [possibly subclassed] item to the end of the list FXint prependItem(FXIconItem* item,FXbool notify=FALSE); /// Prepend new item with given text and optional icons, and user-data pointer FXint prependItem(const FXString& text,FXIcon *big=NULL,FXIcon* mini=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Move item from oldindex to newindex FXint moveItem(FXint newindex,FXint oldindex,FXbool notify=FALSE); /// Extract item from list FXIconItem* extractItem(FXint index,FXbool notify=FALSE); /// Remove item from list void removeItem(FXint index,FXbool notify=FALSE); /// Remove all items from list void clearItems(FXbool notify=FALSE); /// Return item width FXint getItemWidth() const { return itemWidth; } /// Return item height FXint getItemHeight() const { return itemHeight; } /// Return index of item at x,y, or -1 if none virtual FXint getItemAt(FXint x,FXint y) const; /** * Search items by name, beginning from item start. If the start * item is -1 the search will start at the first item in the list. * Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control the * search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. * The option SEARCH_IGNORECASE causes a case-insensitive match. Finally, * passing SEARCH_PREFIX causes searching for a prefix of the item name. * Return -1 if no matching item is found. */ FXint findItem(const FXString& text,FXint start=-1,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /** * Search items by associated user data, beginning from item start. If the * start item is -1 the search will start at the first item in the list. * Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control the * search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. */ FXint findItemByData(const void *ptr,FXint start=-1,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /// Scroll to make item at index visible virtual void makeItemVisible(FXint index); /// Change item text void setItemText(FXint index,const FXString& text); /// Return item text FXString getItemText(FXint index) const; /// Change item big icon void setItemBigIcon(FXint index,FXIcon* icon,FXbool owned=FALSE); /// Return big icon of item at index FXIcon* getItemBigIcon(FXint index) const; /// Change item mini icon void setItemMiniIcon(FXint index,FXIcon* icon,FXbool owned=FALSE); /// Return mini icon of item at index FXIcon* getItemMiniIcon(FXint index) const; /// Change item user-data pointer void setItemData(FXint index,void* ptr); /// Return item user-data pointer void* getItemData(FXint index) const; /// Return TRUE if item at index is selected FXbool isItemSelected(FXint index) const; /// Return TRUE if item at index is current FXbool isItemCurrent(FXint index) const; /// Return TRUE if item at index is visible FXbool isItemVisible(FXint index) const; /// Return TRUE if item at index is enabled FXbool isItemEnabled(FXint index) const; /// Return item hit code: 0 outside, 1 icon, 2 text FXint hitItem(FXint index,FXint x,FXint y,FXint ww=1,FXint hh=1) const; /// Repaint item at index void updateItem(FXint index) const; /// Enable item at index virtual FXbool enableItem(FXint index); /// Disable item at index virtual FXbool disableItem(FXint index); /// Select item at index virtual FXbool selectItem(FXint index,FXbool notify=FALSE); /// Deselect item at index virtual FXbool deselectItem(FXint index,FXbool notify=FALSE); /// Toggle item at index virtual FXbool toggleItem(FXint index,FXbool notify=FALSE); /// Select items in rectangle virtual FXbool selectInRectangle(FXint x,FXint y,FXint w,FXint h,FXbool notify=FALSE); /// Extend selection from anchor index to index virtual FXbool extendSelection(FXint index,FXbool notify=FALSE); /// Deselect all items virtual FXbool killSelection(FXbool notify=FALSE); /// Change current item index virtual void setCurrentItem(FXint index,FXbool notify=FALSE); /// Return current item index, or -1 if none FXint getCurrentItem() const { return current; } /// Change anchor item index void setAnchorItem(FXint index); /// Return anchor item index, or -1 if none FXint getAnchorItem() const { return anchor; } /// Return index of item under cursor, or -1 if none FXint getCursorItem() const { return cursor; } /// Sort items void sortItems(); /// Return sort function FXIconListSortFunc getSortFunc() const { return sortfunc; } /// Change sort function void setSortFunc(FXIconListSortFunc func){ sortfunc=func; } /// Change text font void setFont(FXFont* fnt); /// Return text font FXFont* getFont() const { return font; } /// Return normal text color FXColor getTextColor() const { return textColor; } /// Change normal text color void setTextColor(FXColor clr); /// Return selected text background FXColor getSelBackColor() const { return selbackColor; } /// Change selected text background void setSelBackColor(FXColor clr); /// Return selected text color FXColor getSelTextColor() const { return seltextColor; } /// Change selected text color void setSelTextColor(FXColor clr); /// Change maximum item space for each item void setItemSpace(FXint s); /// Return maximum item space FXint getItemSpace() const { return itemSpace; } /// Get the current icon list style FXuint getListStyle() const; /// Set the current icon list style. void setListStyle(FXuint style); /// Set the status line help text for this widget void setHelpText(const FXString& text); /// Get the status line help text for this widget const FXString& getHelpText() const { return help; } /// Save list to a stream virtual void save(FXStream& store) const; /// Load list from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXIconList(); }; } #endif fox1.6-1.6.57/include/FXIconSource.h000066400000000000000000000157741326741342000167560ustar00rootroot00000000000000/******************************************************************************** * * * I c o n S o u r c e * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIconSource.h,v 1.13 2006/02/03 00:44:32 fox Exp $ * ********************************************************************************/ #ifndef FXICONSOURCE_H #define FXICONSOURCE_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { class FXApp; class FXIcon; class FXImage; /** * An icon source is a class that loads an icon of any type. * It exists purely for convenience, to make loading icons * simpler by concentrating the knowledge of the supported * icon formats in a single place. * Needless to say, this class is subclassable, allowing users * to add additional icon types and make them available to * all widgets which deal with icons. * Note, the icons are loaded, but NOT created (realized) yet; * this allows users to manipulate the pixel data prior to * realizing the icons. */ class FXAPI FXIconSource : public FXObject { FXDECLARE(FXIconSource) protected: FXApp *app; protected: FXIconSource():app(NULL){} private: FXIconSource(const FXIconSource&); FXIconSource &operator=(const FXIconSource&); FXImage *scaleToSize(FXImage *image,FXint size,FXint qual) const; public: /// Construct an icon source FXIconSource(FXApp* a); /** * Load an icon from the file filename. By default, the file extension is * stripped and used as the icon type; if an explicit icon type is forced, * then that type is used and the extension is ignored. * For example, loadIcon("icon","gif") will try to load a CompuServe GIF * file, since the filename does not give any clue as to the type of the * icon. */ virtual FXIcon *loadIconFile(const FXString& filename,const FXString& type=FXString::null) const; /** * Load an icon of a given type (e.g. "gif") from reswrapped data. * Returns NULL if there's some error loading the icon. [The optional * parameter is actually mandatory at the time of this writing; future * versions will attempt to inspect the first few bytes of the stream * to divine the icon format if the parameter is omitted]. */ virtual FXIcon *loadIconData(const void *pixels,const FXString& type=FXString::null) const; /** * Load an icon of a given type (e.g. "gif") from an already open stream. * Returns NULL if there's some error loading the icon. [The optional * parameter is actually mandatory at the time of this writing; future * versions will attempt to inspect the first few bytes of the stream * to divine the icon format if the parameter is omitted]. */ virtual FXIcon *loadIconStream(FXStream& store,const FXString& type=FXString::null) const; /** * Load an image from the file filename. By default, the file extension is * stripped and used as the image type; if an explicit image type is forced, * then that type is used and the extension is ignored. * For example, loadImage("image","gif") will try to load a CompuServe GIF * file, since the filename does not give any clue as to the type of the * image. */ virtual FXImage *loadImageFile(const FXString& filename,const FXString& type=FXString::null) const; /** * Load an image of a given type (e.g. "gif") from reswrapped data. * Returns NULL if there's some error loading the icon. [The optional * parameter is actually mandatory at the time of this writing; future * versions will attempt to inspect the first few bytes of the stream * to divine the icon format if the parameter is omitted]. */ virtual FXImage *loadImageData(const void *pixels,const FXString& type=FXString::null) const; /** * Load an image of a given type (e.g. "gif") from an already open stream. * Returns NULL if there's some error loading the image. [The optional * parameter is actually mandatory at the time of this writing; future * versions will attempt to inspect the first few bytes of the stream * to divine the image format if the parameter is omitted]. */ virtual FXImage *loadImageStream(FXStream& store,const FXString& type=FXString::null) const; /// Load icon and scale it such that its dimensions does not exceed given size virtual FXIcon *loadScaledIconFile(const FXString& filename,FXint size=32,FXint qual=0,const FXString& type=FXString::null) const; /// Load icon and scale it such that its dimensions does not exceed given size virtual FXIcon *loadScaledIconData(const void *pixels,FXint size=32,FXint qual=0,const FXString& type=FXString::null) const; /// Load icon and scale it such that its dimensions does not exceed given size virtual FXIcon *loadScaledIconStream(FXStream& store,FXint size=32,FXint qual=0,const FXString& type=FXString::null) const; /// Load image and scale it such that its dimensions does not exceed given size virtual FXImage *loadScaledImageFile(const FXString& filename,FXint size=32,FXint qual=0,const FXString& type=FXString::null) const; /// Load image and scale it such that its dimensions does not exceed given size virtual FXImage *loadScaledImageData(const void *pixels,FXint size=32,FXint qual=0,const FXString& type=FXString::null) const; /// Load image and scale it such that its dimensions does not exceed given size virtual FXImage *loadScaledImageStream(FXStream& store,FXint size=32,FXint qual=0,const FXString& type=FXString::null) const; /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy virtual ~FXIconSource(); }; } #endif fox1.6-1.6.57/include/FXId.h000066400000000000000000000057261326741342000152350ustar00rootroot00000000000000/******************************************************************************** * * * X - O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXId.h,v 1.18 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXID_H #define FXID_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { class FXApp; /// Encapsulates server side resource class FXAPI FXId : public FXObject { FXDECLARE_ABSTRACT(FXId) private: FXApp *app; // Back link to application object void *data; // User data protected: FXID xid; private: FXId(const FXId&); FXId &operator=(const FXId&); protected: FXId():app((FXApp*)-1L),data(NULL),xid(0){} FXId(FXApp* a):app(a),data(NULL),xid(0){} public: /// Get application FXApp* getApp() const { return app; } /// Get XID handle FXID id() const { return xid; } /// Create resource virtual void create(){} /// Detach resource virtual void detach(){} /// Destroy resource virtual void destroy(){} /// Set user data pointer void setUserData(void *ptr){ data=ptr; } /// Get user data pointer void* getUserData() const { return data; } /// Save object to stream virtual void save(FXStream& store) const; /// Load object from stream virtual void load(FXStream& store); /// Destructor virtual ~FXId(){app=(FXApp*)-1L;} }; } #endif fox1.6-1.6.57/include/FXImage.h000066400000000000000000000242401326741342000157130ustar00rootroot00000000000000/******************************************************************************** * * * I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXImage.h,v 1.64 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXIMAGE_H #define FXIMAGE_H #ifndef FXDRAWABLE_H #include "FXDrawable.h" #endif namespace FX { /// Image rendering hints enum { IMAGE_KEEP = 0x00000001, /// Keep pixel data in client IMAGE_OWNED = 0x00000002, /// Pixel data is owned by image IMAGE_DITHER = 0, /// Dither image to look better IMAGE_NEAREST = 0x00000004, /// Turn off dithering and map to nearest color IMAGE_OPAQUE = 0x00000008, /// Force opaque background IMAGE_ALPHACOLOR = 0x00000010, /// Override transparancy color IMAGE_SHMI = 0x00000020, /// Using shared memory image IMAGE_SHMP = 0x00000040, /// Using shared memory pixmap IMAGE_ALPHAGUESS = 0x00000080 /// Guess transparency color from corners }; class FXDC; class FXDCWindow; /** * An Image is a rectangular array of pixels. It supports two representations * of these pixels: a client-side pixel buffer which is stored as an array of * FXColor, and a server-side pixmap which is stored in an organization directly * compatible with the screen, for fast drawing onto the device. * The server-side representation is not directly accessible from the current * process as it lives in the process of the X Server or GDI. */ class FXAPI FXImage : public FXDrawable { FXDECLARE(FXImage) friend class FXDC; friend class FXDCWindow; protected: FXColor *data; // Pixel data FXuint options; // Options private: #ifdef WIN32 virtual FXID GetDC() const; virtual int ReleaseDC(FXID) const; #endif #ifndef WIN32 void render_true_32(void *xim,FXuchar *img); void render_true_24(void *xim,FXuchar *img); void render_true_16_fast(void *xim,FXuchar *img); void render_true_16_dither(void *xim,FXuchar *img); void render_true_8_fast(void *xim,FXuchar *img); void render_true_8_dither(void *xim,FXuchar *img); void render_true_N_fast(void *xim,FXuchar *img); void render_true_N_dither(void *xim,FXuchar *img); void render_index_4_fast(void *xim,FXuchar *img); void render_index_4_dither(void *xim,FXuchar *img); void render_index_8_fast(void *xim,FXuchar *img); void render_index_8_dither(void *xim,FXuchar *img); void render_index_N_fast(void *xim,FXuchar *img); void render_index_N_dither(void *xim,FXuchar *img); void render_gray_8_fast(void *xim,FXuchar *img); void render_gray_8_dither(void *xim,FXuchar *img); void render_gray_N_fast(void *xim,FXuchar *img); void render_gray_N_dither(void *xim,FXuchar *img); void render_mono_1_fast(void *xim,FXuchar *img); void render_mono_1_dither(void *xim,FXuchar *img); #endif protected: FXImage(); private: FXImage(const FXImage&); FXImage &operator=(const FXImage&); public: /** * Create an image. If a client-side pixel buffer has been specified, * the image does not own the pixel buffer unless the IMAGE_OWNED flag is * set. If the IMAGE_OWNED flag is set but a NULL pixel buffer is * passed, a pixel buffer will be automatically created and will be owned * by the image. The flags IMAGE_SHMI and IMAGE_SHMP may be specified for * large images to instruct render() to use shared memory to communicate * with the server. */ FXImage(FXApp* a,const FXColor *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Change options void setOptions(FXuint opts); /// To get to the option flags FXuint getOptions() const { return options; } /** * Populate the image with new pixel data of the same size; it will assume * ownership of the pixel data if image IMAGE_OWNED option is passed. * The server-side representation of the image, if it exists, is not updated. * This can be done by calling render(). */ virtual void setData(FXColor *pix,FXuint opts=0); /** * Populate the image with new pixel data of a new size; it will assume ownership * of the pixel data if image IMAGE_OWNED option is passed. The size of the server- * side representation of the image, if it exists, is adjusted but the contents are * not updated yet. This can be done by calling render(). */ virtual void setData(FXColor *pix,FXuint opts,FXint w,FXint h); /// Return pointer to the pixel data of the image FXColor* getData() const { return data; } /// Get pixel at x,y FXColor getPixel(FXint x,FXint y) const { return data[y*width+x]; } /// Change pixel at x,y void setPixel(FXint x,FXint y,FXColor color){ data[y*width+x]=color; } /// Scan the image and return false if fully opaque bool hasAlpha() const; /** * Create the server side pixmap, then call render() to fill it with the * pixel data from the client-side buffer. After the server-side image has * been created, the client-side pixel buffer will be deleted unless * IMAGE_KEEP has been specified. If the pixel buffer is not owned, i.e. * the flag IMAGE_OWNED is not set, the pixel buffer will not be deleted, * however the pixel buffer will be set to NULL. */ virtual void create(); /** * Detach the server side pixmap from the Image. * Afterwards, the Image is left as if it never had a server-side resources. */ virtual void detach(); /** * Destroy the server-side pixmap. * The client-side pixel buffer is not affected. */ virtual void destroy(); /** * Retrieves pixels from the server-side image. For example, to make * screen snapshots, or to retrieve an image after it has been drawn * into by various means. */ virtual void restore(); /** * Render the server-side representation of the image from client-side * pixels. Normally, IMAGE_DITHER is used which causes the server-side * representation to be rendered using a 16x16 ordered dither if necessary; * however if IMAGE_NEAREST is used a faster (but uglier-looking), nearest * neighbor algorithm is used. */ virtual void render(); /** * Release the client-side pixels buffer, free it if it was owned. * If it is not owned, the image just forgets about the buffer. */ virtual void release(); /** * Resize both client-side and server-side representations (if any) to the * given width and height. The new representations typically contain garbage * after this operation and need to be re-filled. */ virtual void resize(FXint w,FXint h); /** * Rescale pixels image to the specified width and height; this calls * resize() to adjust the client and server side representations. */ virtual void scale(FXint w,FXint h,FXint quality=0); /// Mirror image horizontally and/or vertically virtual void mirror(bool horizontal,bool vertical); /** * Rotate image by degrees ccw; this calls resize() to adjust the client * and server side representations if necessary. */ virtual void rotate(FXint degrees); /** * Crop image to given rectangle; this calls resize() to adjust the client * and server side representations. The new image may be smaller or larger * than the old one; blank areas are filled with color. There must be at * least one pixel of overlap between the old and the new image. */ virtual void crop(FXint x,FXint y,FXint w,FXint h,FXColor color=0); /// Fill image with uniform color virtual void fill(FXColor color); /// Fade image to uniform color virtual void fade(FXColor color,FXint factor=255); /** * Shear image horizontally; the number of pixels is equal to the * shear parameter times 256. The area outside the image is filled * with transparent black, unless another color is specified. */ virtual void xshear(FXint shear,FXColor clr=0); /** * Shear image vertically; the number of pixels is equal to the * shear parameter times 256. The area outside the image is filled * with transparent black, unless another color is specified. */ virtual void yshear(FXint shear,FXColor clr=0); /// Fill horizontal gradient virtual void hgradient(FXColor left,FXColor right); /// Fill vertical gradient virtual void vgradient(FXColor top,FXColor bottom); /// Fill with gradient virtual void gradient(FXColor topleft,FXColor topright,FXColor bottomleft,FXColor bottomright); /// Blend image over uniform color virtual void blend(FXColor color); /// Save object to stream virtual void save(FXStream& store) const; /// Load object from stream virtual void load(FXStream& store); /// Save pixel data only virtual bool savePixels(FXStream& store) const; /// Load pixel data only virtual bool loadPixels(FXStream& store); /// Destructor virtual ~FXImage(); }; } #endif fox1.6-1.6.57/include/FXImageFrame.h000066400000000000000000000064731326741342000166760ustar00rootroot00000000000000/******************************************************************************** * * * I m a g e F r a m e W i d g e t * * * ********************************************************************************* * Copyright (C) 2001,2006 by H. J. Daniel III. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXImageFrame.h,v 1.8 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXIMAGEFRAME_H #define FXIMAGEFRAME_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /** * The image frame is a simple frame widget displaying * an image; the image is not owned by the image frame so * it must be explicitly deleted elsewhere. */ class FXAPI FXImageFrame : public FXFrame { FXDECLARE(FXImageFrame) protected: FXImage* image; // The image being displayed protected: FXImageFrame(); private: FXImageFrame(const FXImageFrame&); FXImageFrame &operator=(const FXImageFrame&); public: long onPaint(FXObject*,FXSelector,void* ptr); public: /// Construct image frame and pass it an image FXImageFrame(FXComposite* p,FXImage *img,FXuint opts=FRAME_SUNKEN|FRAME_THICK,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=0,FXint pr=0,FXint pt=0,FXint pb=0); /// Create window virtual void create(); /// Get default width virtual FXint getDefaultWidth(); /// Get default height virtual FXint getDefaultHeight(); /// Change the image being displayed void setImage(FXImage* img); /// Return the current image FXImage* getImage() const { return image; } /// Set the current justification mode. void setJustify(FXuint mode); /// Get the current justification mode. FXuint getJustify() const; /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy the widget, but do not destroy the image virtual ~FXImageFrame(); }; } #endif fox1.6-1.6.57/include/FXImageView.h000066400000000000000000000101351326741342000165440ustar00rootroot00000000000000/******************************************************************************** * * * I m a g e V i e w W i d g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXImageView.h,v 1.16 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXIMAGEVIEW_H #define FXIMAGEVIEW_H #ifndef FXSCROLLAREA_H #include "FXScrollArea.h" #endif namespace FX { class FXImage; /// Image alignment styles enum { IMAGEVIEW_NORMAL = 0, /// Normal mode is centered IMAGEVIEW_CENTER_X = 0, /// Centered horizontally IMAGEVIEW_LEFT = 0x00100000, /// Left-aligned IMAGEVIEW_RIGHT = 0x00200000, /// Right-aligned IMAGEVIEW_CENTER_Y = 0, /// Centered vertically IMAGEVIEW_TOP = 0x00400000, /// Top-aligned IMAGEVIEW_BOTTOM = 0x00800000 /// Bottom-aligned }; /** * The Image View widget display a scrollable view of an image. */ class FXAPI FXImageView : public FXScrollArea { FXDECLARE(FXImageView) protected: FXImage *image; // Image to view FXint grabx; // Grab point x FXint graby; // Grab point y protected: FXImageView(); private: FXImageView(const FXImageView&); FXImageView &operator=(const FXImageView&); public: long onPaint(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); public: enum { ID_XYZ=FXScrollArea::ID_LAST, ID_LAST }; public: /// Construct a scroll window FXImageView(FXComposite* p,FXImage* img=NULL,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Image view widget can receive focus virtual bool canFocus() const; /// Return the width of the contents virtual FXint getContentWidth(); /// Return the height of the contents virtual FXint getContentHeight(); /// Change image void setImage(FXImage* img); /// Return image FXImage* getImage() const { return image; } /// Set the current alignment. void setAlignment(FXuint mode); /// Get the current alignment. FXuint getAlignment() const; /// Save list to a stream virtual void save(FXStream& store) const; /// Load list from a stream virtual void load(FXStream& store); /// Destroy virtual ~FXImageView(); }; } #endif fox1.6-1.6.57/include/FXInputDialog.h000066400000000000000000000131251326741342000171100ustar00rootroot00000000000000/******************************************************************************** * * * I n p u t D i a l o g B o x * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXInputDialog.h,v 1.17 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXINPUTDIALOG_H #define FXINPUTDIALOG_H #ifndef FXDIALOGBOX_H #include "FXDialogBox.h" #endif namespace FX { /// Input dialog options enum { INPUTDIALOG_STRING = 0, /// Ask for a string INPUTDIALOG_INTEGER = 0x01000000, /// Ask for an integer number INPUTDIALOG_REAL = 0x02000000, /// Ask for a real number INPUTDIALOG_PASSWORD = 0x04000000 /// Do not reveal key-in }; class FXTextField; /** * An Input Dialog is a simple dialog which is used * to obtain a text string, integer, or real number from the user. * A password mode allows the key-in to remain hidden. */ class FXAPI FXInputDialog : public FXDialogBox { FXDECLARE(FXInputDialog) protected: FXTextField *input; // Text field widget FXdouble limlo; // Lower limit FXdouble limhi; // Upper limit protected: FXInputDialog(){} private: FXInputDialog(const FXInputDialog&); FXInputDialog &operator=(const FXInputDialog&); void initialize(const FXString& text,FXIcon* icon); public: long onCmdAccept(FXObject*,FXSelector,void*); public: /// Construct input dialog box with given caption, icon, and prompt text FXInputDialog(FXWindow* owner,const FXString& caption,const FXString& label,FXIcon* icon=NULL,FXuint opts=INPUTDIALOG_STRING,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Construct free floating input dialog box with given caption, icon, and prompt text FXInputDialog(FXApp* app,const FXString& caption,const FXString& label,FXIcon* icon=NULL,FXuint opts=INPUTDIALOG_STRING,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Get input string FXString getText() const; /// Set input string void setText(const FXString& text); /// Change number of visible columns of text void setNumColumns(FXint num); /// Return number of visible columns of text FXint getNumColumns() const; /// Change limits void setLimits(FXdouble lo,FXdouble hi){ limlo=lo; limhi=hi; } /// Return limits void getLimits(FXdouble& lo,FXdouble& hi){ lo=limlo; hi=limhi; } /// Run modal invocation of the dialog virtual FXuint execute(FXuint placement=PLACEMENT_CURSOR); /** * Prompt for a string, start with the initial value. * Return TRUE if the new value is accepted, and false otherwise. */ static FXbool getString(FXString& result,FXWindow* owner,const FXString& caption,const FXString& label,FXIcon* icon=NULL); /** * Prompt for a string, in free floating window. */ static FXbool getString(FXString& result,FXApp* app,const FXString& caption,const FXString& label,FXIcon* icon=NULL); /** * Prompt for an integer number, start with the given initial value. * Return TRUE if the new value is accepted, and false otherwise. * The input is constrained between lo and hi. */ static FXbool getInteger(FXint& result,FXWindow* owner,const FXString& caption,const FXString& label,FXIcon* icon=NULL,FXint lo=-2147483647,FXint hi=2147483647); /** * Prompt for a integer number, in free floating window. */ static FXbool getInteger(FXint& result,FXApp* app,const FXString& caption,const FXString& label,FXIcon* icon=NULL,FXint lo=-2147483647,FXint hi=2147483647); /** * Prompt for an real number, start with the given initial value. * Return TRUE if the new value is accepted, and false otherwise. * The input is constrained between lo and hi. */ static FXbool getReal(FXdouble& result,FXWindow* owner,const FXString& caption,const FXString& label,FXIcon* icon=NULL,FXdouble lo=-1.797693134862315e+308,FXdouble hi=1.797693134862315e+308); /** * Prompt for a real number, in free floating window. */ static FXbool getReal(FXdouble& result,FXApp* app,const FXString& caption,const FXString& label,FXIcon* icon=NULL,FXdouble lo=-1.797693134862315e+308,FXdouble hi=1.797693134862315e+308); }; } #endif fox1.6-1.6.57/include/FXJPGIcon.h000066400000000000000000000067301326741342000161260ustar00rootroot00000000000000/******************************************************************************** * * * J P E G I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2000,2006 by David Tyree. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXJPGIcon.h,v 1.20 2006/01/24 13:53:11 fox Exp $ * ********************************************************************************/ #ifndef FXJPGICON_H #define FXJPGICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// JPEG Icon class class FXAPI FXJPGIcon : public FXIcon { FXDECLARE(FXJPGIcon) protected: FXint quality; protected: FXJPGIcon(){} private: FXJPGIcon(const FXJPGIcon&); FXJPGIcon &operator=(const FXJPGIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct an icon from memory stream formatted in JPEG format FXJPGIcon(FXApp *a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1,FXint q=75); /// True if format is supported static const bool supported; /// Set image quality to save with void setQuality(FXint q){ quality=q; } /// Get image quality setting FXint getQuality() const { return quality; } /// Save pixels into stream in JPEG format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in JPEG format virtual bool loadPixels(FXStream& store); /// Destroy virtual ~FXJPGIcon(); }; /** * Check if stream contains a JPG, return TRUE if so. */ extern FXAPI bool fxcheckJPG(FXStream& store); /** * Load an JPEG (Joint Photographics Experts Group) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadJPG(FXStream& store,FXColor*& data,FXint& width,FXint& height,FXint& quality); /** * Save an JPEG (Joint Photographics Experts Group) file to a stream. */ extern FXAPI bool fxsaveJPG(FXStream& store,const FXColor* data,FXint width,FXint height,FXint quality); } #endif fox1.6-1.6.57/include/FXJPGImage.h000066400000000000000000000067101326741342000162560ustar00rootroot00000000000000/******************************************************************************** * * * J P E G I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2000,2006 by David Tyree. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXJPGImage.h,v 1.20 2006/01/24 13:53:11 fox Exp $ * ********************************************************************************/ #ifndef FXJPGIMAGE_H #define FXJPGIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// JPEG Image class class FXAPI FXJPGImage : public FXImage { FXDECLARE(FXJPGImage) protected: FXint quality; protected: FXJPGImage(){} private: FXJPGImage(const FXJPGImage&); FXJPGImage &operator=(const FXJPGImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct an image from memory stream formatted in JPEG format FXJPGImage(FXApp *a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1,FXint q=75); /// True if format is supported static const bool supported; /// Set image quality to save with void setQuality(FXint q){ quality=q; } /// Get image quality setting FXint getQuality() const { return quality; } /// Save pixels into stream in JPEG format virtual bool loadPixels(FXStream& store); /// Load pixels from stream in JPEG format virtual bool savePixels(FXStream& store) const; /// Destroy virtual ~FXJPGImage(); }; /** * Check if stream contains a JPG, return TRUE if so. */ extern FXAPI bool fxcheckJPG(FXStream& store); /** * Load an JPEG (Joint Photographics Experts Group) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadJPG(FXStream& store,FXColor*& data,FXint& width,FXint& height,FXint& quality); /** * Save an JPEG (Joint Photographics Experts Group) file to a stream. */ extern FXAPI bool fxsaveJPG(FXStream& store,const FXColor* data,FXint width,FXint height,FXint quality); } #endif fox1.6-1.6.57/include/FXKOI8RCodec.h000066400000000000000000000011031326741342000164540ustar00rootroot00000000000000#ifndef FXKOI8RCODEC_H #define FXKOI8RCODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// KOI8-R Codec class FXAPI FXKOI8RCodec : public FXTextCodec { FXDECLARE(FXKOI8RCodec) public: FXKOI8RCodec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint mibEnum() const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual const FXchar* const* aliases() const; virtual ~FXKOI8RCodec(){} }; } #endif fox1.6-1.6.57/include/FXKnob.h000066400000000000000000000162211326741342000155620ustar00rootroot00000000000000/******************************************************************************** * * * K n o b W i d g e t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Leandro Nini. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXKnob.h,v 1.7 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXKNOB_H #define FXKNOB_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// Knob Control styles enum { KNOB_NEEDLE = 0, /// Use a needle as indicator KNOB_DOT = 0x00008000, /// Use a dot as indicator KNOB_TICKS = 0x00010000, /// Show ticks around the knob KNOB_INDICATOR = 0x00020000, /// Show only the indicator (like a speedometer) KNOB_NORMAL = (KNOB_NEEDLE|KNOB_TICKS) /// Normal knob looks }; /** * The knob widget is a valuator widget which provides simple linear value range. * While being moved, the knob sends SEL_CHANGED messages to its target; * at the end of the interaction, a final SEL_COMMAND message is sent. * The message data represents the current knob value, of type FXint. */ class FXAPI FXKnob : public FXFrame { FXDECLARE(FXKnob) protected: FXint range[2]; // Reported data range FXdouble limits[2]; // Starting and ending positions FXColor lineColor; // Color of indicator needle FXint pos; // Reported data position FXint incr; // Increment when auto-sliding FXint delta; // Interval between ticks FXString help; // Help string FXString tip; // Tip string protected: FXKnob(); FXint calcValue(FXint x,FXint y); private: FXKnob(const FXKnob&); FXKnob &operator=(const FXKnob&); public: long onPaint(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMiddleBtnPress(FXObject*,FXSelector,void*); long onMiddleBtnRelease(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onAutoSlide(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetRealValue(FXObject*,FXSelector,void*); long onCmdGetRealValue(FXObject*,FXSelector,void*); long onCmdSetIntRange(FXObject*,FXSelector,void*); long onCmdGetIntRange(FXObject*,FXSelector,void*); long onCmdSetRealRange(FXObject*,FXSelector,void*); long onCmdGetRealRange(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: enum{ ID_AUTOSLIDE=FXFrame::ID_LAST, ID_LAST }; public: /// Construct a knob widget FXKnob(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=KNOB_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Returns true because a knob can receive focus virtual bool canFocus() const; /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /// Enable the knob virtual void enable(); /// Disable the knob virtual void disable(); /// Change knob value void setValue(FXint value,FXbool notify=FALSE); /// Return knob value FXint getValue() const { return pos; } /// Change the knob's range void setRange(FXint lo,FXint hi,FXbool notify=FALSE); /// Get the knob's current range void getRange(FXint& lo,FXint& hi) const { lo=range[0]; hi=range[1]; } /** * Change the knob's movement limits (start and ending angles) * accept values in degrees from 0 (south) to 360. */ void setLimits(FXint start,FXint end,FXbool notify=FALSE); /// Get the knob's current limits void getLimits(FXint& start,FXint& end); /// Change the knob style FXuint getKnobStyle() const; /// Get the current knob style void setKnobStyle(FXuint style); /// Get the knob's auto-increment/decrement value FXint getIncrement() const { return incr; } /// Change the knob's auto-increment/decrement value void setIncrement(FXint inc){ incr=inc; } /// Change the delta between ticks void setTickDelta(FXint dist); /// Get delta between ticks FXint getTickDelta() const { return delta; } /// Change the indicator needle color void setLineColor(FXColor clr); /// Get the current indicator needle color FXColor getLineColor() const { return lineColor; } /// Set the help text to be displayed on the status line void setHelpText(const FXString& text){ help=text; } /// Get the current help text const FXString& getHelpText() const { return help; } /// Set the tip text to be displayed in the tooltip void setTipText(const FXString& text){ tip=text; } /// Get the current tooltip text value const FXString& getTipText() const { return tip; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy the knob virtual ~FXKnob(); }; } #endif fox1.6-1.6.57/include/FXLabel.h000066400000000000000000000154021326741342000157100ustar00rootroot00000000000000/******************************************************************************** * * * L a b e l W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXLabel.h,v 1.31 2006/03/01 02:13:21 fox Exp $ * ********************************************************************************/ #ifndef FXLABEL_H #define FXLABEL_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// Relationship options for icon-labels enum { ICON_UNDER_TEXT = 0, /// Icon appears under text ICON_AFTER_TEXT = 0x00080000, /// Icon appears after text (to its right) ICON_BEFORE_TEXT = 0x00100000, /// Icon appears before text (to its left) ICON_ABOVE_TEXT = 0x00200000, /// Icon appears above text ICON_BELOW_TEXT = 0x00400000, /// Icon appears below text TEXT_OVER_ICON = ICON_UNDER_TEXT, /// Same as ICON_UNDER_TEXT TEXT_AFTER_ICON = ICON_BEFORE_TEXT, /// Same as ICON_BEFORE_TEXT TEXT_BEFORE_ICON = ICON_AFTER_TEXT, /// Same as ICON_AFTER_TEXT TEXT_ABOVE_ICON = ICON_BELOW_TEXT, /// Same as ICON_BELOW_TEXT TEXT_BELOW_ICON = ICON_ABOVE_TEXT /// Same as ICON_ABOVE_TEXT }; /// Normal way to show label enum { LABEL_NORMAL = JUSTIFY_NORMAL|ICON_BEFORE_TEXT }; class FXIcon; class FXFont; /** * A label widget can be used to place a text and/or icon for * explanation purposes. The text label may have an optional tooltip * and/or help string. Icon and label are placed relative to the widget * using the justfication options, and relative to each other as determined * by the icon relationship options. A large number of arrangements is * possible. */ class FXAPI FXLabel : public FXFrame { FXDECLARE(FXLabel) protected: FXString label; // Text on the label FXIcon* icon; // Icon on the label FXFont* font; // Label font FXHotKey hotkey; // Hotkey FXint hotoff; // Offset in string FXColor textColor; // Text color FXString tip; // Tooltip FXString help; // Help message protected: FXLabel(); FXint labelHeight(const FXString& text) const; FXint labelWidth(const FXString& text) const; void drawLabel(FXDCWindow& dc,const FXString& text,FXint hot,FXint tx,FXint ty,FXint tw,FXint th); void just_x(FXint& tx,FXint& ix,FXint tw,FXint iw); void just_y(FXint& ty,FXint& iy,FXint th,FXint ih); private: FXLabel(const FXLabel&); FXLabel &operator=(const FXLabel&); public: long onPaint(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdSetIconValue(FXObject*,FXSelector,void*); long onCmdGetIconValue(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: /// Construct label with given text and icon FXLabel(FXComposite* p,const FXString& text,FXIcon* ic=0,FXuint opts=LABEL_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Enable the window virtual void enable(); /// Disable the window virtual void disable(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Set the text for this label void setText(const FXString& text); /// Get the text for this label FXString getText() const { return label; } /// Set the icon for this label void setIcon(FXIcon* ic); /// Get the icon for this label FXIcon* getIcon() const { return icon; } /// Set the text font void setFont(FXFont *fnt); /// Get the text font FXFont* getFont() const { return font; } /// Get the current text color FXColor getTextColor() const { return textColor; } /// Set the current text color void setTextColor(FXColor clr); /// Set the current text-justification mode. void setJustify(FXuint mode); /// Get the current text-justification mode. FXuint getJustify() const; /// Set the current icon position void setIconPosition(FXuint mode); /// Get the current icon position FXuint getIconPosition() const; /// Set the status line help text for this label void setHelpText(const FXString& text){ help=text; } /// Get the status line help text for this label const FXString& getHelpText() const { return help; } /// Set the tool tip message for this label void setTipText(const FXString& text){ tip=text; } /// Get the tool tip message for this label const FXString& getTipText() const { return tip; } /// Save label to a stream virtual void save(FXStream& store) const; /// Load label from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXLabel(); }; } #endif fox1.6-1.6.57/include/FXList.h000066400000000000000000000410601326741342000156030ustar00rootroot00000000000000/******************************************************************************** * * * L i s t W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXList.h,v 1.88.2.2 2006/11/17 16:02:31 fox Exp $ * ********************************************************************************/ #ifndef FXLIST_H #define FXLIST_H #ifndef FXSCROLLAREA_H #include "FXScrollArea.h" #endif namespace FX { /// List styles enum { LIST_EXTENDEDSELECT = 0, /// Extended selection mode allows for drag-selection of ranges of items LIST_SINGLESELECT = 0x00100000, /// Single selection mode allows up to one item to be selected LIST_BROWSESELECT = 0x00200000, /// Browse selection mode enforces one single item to be selected at all times LIST_MULTIPLESELECT = 0x00300000, /// Multiple selection mode is used for selection of individual items LIST_AUTOSELECT = 0x00400000, /// Automatically select under cursor LIST_NORMAL = LIST_EXTENDEDSELECT }; class FXIcon; class FXFont; class FXList; /// List item class FXAPI FXListItem : public FXObject { FXDECLARE(FXListItem) friend class FXList; protected: FXString label; FXIcon *icon; void *data; FXuint state; FXint x,y; private: FXListItem(const FXListItem&); FXListItem& operator=(const FXListItem&); protected: FXListItem():icon(NULL),data(NULL),state(0),x(0),y(0){} virtual void draw(const FXList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h); virtual FXint hitItem(const FXList* list,FXint x,FXint y) const; public: enum { SELECTED = 1, /// Selected FOCUS = 2, /// Focus DISABLED = 4, /// Disabled DRAGGABLE = 8, /// Draggable ICONOWNED = 16 /// Icon owned by item }; public: /// Construct new item with given text, icon, and user-data FXListItem(const FXString& text,FXIcon* ic=NULL,void* ptr=NULL):label(text),icon(ic),data(ptr),state(0),x(0),y(0){} /// Change item's text label virtual void setText(const FXString& txt); /// Return item's text label const FXString& getText() const { return label; } /// Change item's icon, deleting the old icon if it was owned virtual void setIcon(FXIcon* icn,FXbool owned=FALSE); /// Return item's icon FXIcon* getIcon() const { return icon; } /// Change item's user data void setData(void* ptr){ data=ptr; } /// Get item's user data void* getData() const { return data; } /// Make item draw as focused virtual void setFocus(FXbool focus); /// Return true if item has focus FXbool hasFocus() const { return (state&FOCUS)!=0; } /// Select item virtual void setSelected(FXbool selected); /// Return true if this item is selected FXbool isSelected() const { return (state&SELECTED)!=0; } /// Enable or disable item virtual void setEnabled(FXbool enabled); /// Return true if this item is enabled FXbool isEnabled() const { return (state&DISABLED)==0; } /// Make item draggable virtual void setDraggable(FXbool draggable); /// Return true if this item is draggable FXbool isDraggable() const { return (state&DRAGGABLE)!=0; } /// Return width of item as drawn in list virtual FXint getWidth(const FXList* list) const; /// Return height of item as drawn in list virtual FXint getHeight(const FXList* list) const; /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy item and free icons if owned virtual ~FXListItem(); }; /// List item collate function typedef FXint (*FXListSortFunc)(const FXListItem*,const FXListItem*); /// List of FXListItem's typedef FXObjectListOf FXListItemList; /** * A List Widget displays a list of items, each with a text and * optional icon. When an item's selected state changes, the list sends * a SEL_SELECTED or SEL_DESELECTED message. A change of the current * item is signified by the SEL_CHANGED message. * The list sends SEL_COMMAND messages when the user clicks on an item, * and SEL_CLICKED, SEL_DOUBLECLICKED, and SEL_TRIPLECLICKED when the user * clicks once, twice, or thrice, respectively. * When items are added, replaced, or removed, the list sends messages of * the type SEL_INSERTED, SEL_REPLACED, or SEL_DELETED. * In each of these cases, the index to the item, if any, is passed in the * 3rd argument of the message. */ class FXAPI FXList : public FXScrollArea { FXDECLARE(FXList) protected: FXListItemList items; // Item list FXint anchor; // Anchor item FXint current; // Current item FXint extent; // Extent item FXint cursor; // Cursor item FXint viewable; // Viewable item FXFont *font; // Font FXColor textColor; // Text color FXColor selbackColor; // Selected back color FXColor seltextColor; // Selected text color FXint listWidth; // List width FXint listHeight; // List height FXint visible; // Number of rows high FXString help; // Help text FXListSortFunc sortfunc; // Item sort function FXint grabx; // Grab point x FXint graby; // Grab point y FXString lookup; // Lookup string FXbool state; // State of item protected: FXList(); void recompute(); virtual FXListItem *createItem(const FXString& text,FXIcon* icon,void* ptr); private: FXList(const FXList&); FXList &operator=(const FXList&); public: long onPaint(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onAutoScroll(FXObject*,FXSelector,void*); long onClicked(FXObject*,FXSelector,void*); long onDoubleClicked(FXObject*,FXSelector,void*); long onTripleClicked(FXObject*,FXSelector,void*); long onCommand(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onTipTimer(FXObject*,FXSelector,void*); long onLookupTimer(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*);public: long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); public: static FXint ascending(const FXListItem* a,const FXListItem* b); static FXint descending(const FXListItem* a,const FXListItem* b); static FXint ascendingCase(const FXListItem* a,const FXListItem* b); static FXint descendingCase(const FXListItem* a,const FXListItem* b); public: enum { ID_LOOKUPTIMER=FXScrollArea::ID_LAST, ID_LAST }; public: /// Construct a list with initially no items in it FXList(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=LIST_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Compute and return content width virtual FXint getContentWidth(); /// Return content height virtual FXint getContentHeight(); /// Recalculate layout virtual void recalc(); /// List widget can receive focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Return the number of items in the list FXint getNumItems() const { return items.no(); } /// Return number of visible items FXint getNumVisible() const { return visible; } /// Change the number of visible items void setNumVisible(FXint nvis); /// Return the item at the given index FXListItem *getItem(FXint index) const; /// Replace the item with a [possibly subclassed] item FXint setItem(FXint index,FXListItem* item,FXbool notify=FALSE); /// Replace items text, icon, and user-data pointer FXint setItem(FXint index,const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Fill list by appending items from array of strings FXint fillItems(const FXchar** strings,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Fill list by appending items from newline separated strings FXint fillItems(const FXString& strings,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Insert a new [possibly subclassed] item at the give index FXint insertItem(FXint index,FXListItem* item,FXbool notify=FALSE); /// Insert item at index with given text, icon, and user-data pointer FXint insertItem(FXint index,const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Append a [possibly subclassed] item to the list FXint appendItem(FXListItem* item,FXbool notify=FALSE); /// Append new item with given text and optional icon, and user-data pointer FXint appendItem(const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Prepend a [possibly subclassed] item to the list FXint prependItem(FXListItem* item,FXbool notify=FALSE); /// Prepend new item with given text and optional icon, and user-data pointer FXint prependItem(const FXString& text,FXIcon *icon=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Move item from oldindex to newindex FXint moveItem(FXint newindex,FXint oldindex,FXbool notify=FALSE); /// Extract item from list FXListItem* extractItem(FXint index,FXbool notify=FALSE); /// Remove item from list void removeItem(FXint index,FXbool notify=FALSE); /// Remove all items from list void clearItems(FXbool notify=FALSE); /// Return item width FXint getItemWidth(FXint index) const; /// Return item height FXint getItemHeight(FXint index) const; /// Return index of item at x,y, if any virtual FXint getItemAt(FXint x,FXint y) const; /// Return item hit code: 0 no hit; 1 hit the icon; 2 hit the text FXint hitItem(FXint index,FXint x,FXint y) const; /** * Search items by name, beginning from item start. If the start * item is -1 the search will start at the first item in the list. * Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control the * search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. * The option SEARCH_IGNORECASE causes a case-insensitive match. Finally, * passing SEARCH_PREFIX causes searching for a prefix of the item name. * Return -1 if no matching item is found. */ FXint findItem(const FXString& text,FXint start=-1,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /** * Search items by associated user data, beginning from item start. If the * start item is -1 the search will start at the first item in the list. * Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control the * search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. */ FXint findItemByData(const void *ptr,FXint start=-1,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /// Scroll to bring item into view virtual void makeItemVisible(FXint index); /// Change item text void setItemText(FXint index,const FXString& text); /// Return item text FXString getItemText(FXint index) const; /// Change item icon, deleting the old icon if it was owned void setItemIcon(FXint index,FXIcon* icon,FXbool owned=FALSE); /// Return item icon, if any FXIcon* getItemIcon(FXint index) const; /// Change item user-data pointer void setItemData(FXint index,void* ptr); /// Return item user-data pointer void* getItemData(FXint index) const; /// Return TRUE if item is selected FXbool isItemSelected(FXint index) const; /// Return TRUE if item is current FXbool isItemCurrent(FXint index) const; /// Return TRUE if item is visible FXbool isItemVisible(FXint index) const; /// Return TRUE if item is enabled FXbool isItemEnabled(FXint index) const; /// Repaint item void updateItem(FXint index) const; /// Enable item virtual FXbool enableItem(FXint index); /// Disable item virtual FXbool disableItem(FXint index); /// Select item virtual FXbool selectItem(FXint index,FXbool notify=FALSE); /// Deselect item virtual FXbool deselectItem(FXint index,FXbool notify=FALSE); /// Toggle item selection state virtual FXbool toggleItem(FXint index,FXbool notify=FALSE); /// Extend selection from anchor item to index virtual FXbool extendSelection(FXint index,FXbool notify=FALSE); /// Deselect all items virtual FXbool killSelection(FXbool notify=FALSE); /// Change current item virtual void setCurrentItem(FXint index,FXbool notify=FALSE); /// Return current item, if any FXint getCurrentItem() const { return current; } /// Change anchor item void setAnchorItem(FXint index); /// Return anchor item, if any FXint getAnchorItem() const { return anchor; } /// Get item under the cursor, if any FXint getCursorItem() const { return cursor; } /// Sort items using current sort function void sortItems(); /// Return sort function FXListSortFunc getSortFunc() const { return sortfunc; } /// Change sort function void setSortFunc(FXListSortFunc func){ sortfunc=func; } /// Change text font void setFont(FXFont* fnt); /// Return text font FXFont* getFont() const { return font; } /// Return normal text color FXColor getTextColor() const { return textColor; } /// Change normal text color void setTextColor(FXColor clr); /// Return selected text background FXColor getSelBackColor() const { return selbackColor; } /// Change selected text background void setSelBackColor(FXColor clr); /// Return selected text color FXColor getSelTextColor() const { return seltextColor; } /// Change selected text color void setSelTextColor(FXColor clr); /// Return list style FXuint getListStyle() const; /// Change list style void setListStyle(FXuint style); /// Set the status line help text for this list void setHelpText(const FXString& text); /// Get the status line help text for this list const FXString& getHelpText() const { return help; } /// Save list to a stream virtual void save(FXStream& store) const; /// Load list from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXList(); }; } #endif fox1.6-1.6.57/include/FXListBox.h000066400000000000000000000214741326741342000162630ustar00rootroot00000000000000/******************************************************************************** * * * L i s t B o x W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXListBox.h,v 1.43 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXLISTBOX_H #define FXLISTBOX_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { /// List Box styles enum { LISTBOX_NORMAL = 0 // Normal style }; class FXButton; class FXMenuButton; class FXList; class FXPopup; /** * The List Box is a control to select one of a list of options. It looks * similar to a Combo Box except that List Box yields integer numbers only. * When an option is selected, List Box will send an SEL_COMMAND with the * index of the opton. While manipulating the list, it may send SEL_CHANGED * messages to indicate which option the cursor is hovering over. * The List Box is able to receive ID_GETINTVALUE and ID_SETINTVALUE which * will retrieve the current option or change the selected option. */ class FXAPI FXListBox : public FXPacker { FXDECLARE(FXListBox) protected: FXButton *field; FXMenuButton *button; FXList *list; FXPopup *pane; protected: FXListBox(){} private: FXListBox(const FXListBox&); FXListBox &operator=(const FXListBox&); public: long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusSelf(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onFieldButton(FXObject*,FXSelector,void*); long onListUpdate(FXObject*,FXSelector,void*); long onListClicked(FXObject*,FXSelector,void*); long onListChanged(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); public: enum { ID_LIST=FXPacker::ID_LAST, ID_FIELD, ID_LAST }; public: /// Constructor FXListBox(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_SUNKEN|FRAME_THICK|LISTBOX_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Perform layout virtual void layout(); /// Enable drive box virtual void enable(); /// Disable drive box virtual void disable(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Return the number of items in the list FXint getNumItems() const; /// Return the number of visible items FXint getNumVisible() const; /// Set the number of visible items void setNumVisible(FXint nvis); /// Return true if current item FXbool isItemCurrent(FXint index) const; /// Set the current item (index is zero-based) virtual void setCurrentItem(FXint index,FXbool notify=FALSE); /// Get the current item's index FXint getCurrentItem() const; /// Return the item at the given index FXString getItem(FXint index) const; /// Replace the item at index FXint setItem(FXint index,const FXString& text,FXIcon* icon=NULL,void* ptr=NULL); /// Fill list box by appending items from array of strings FXint fillItems(const FXchar** strings,FXIcon* icon=NULL,void* ptr=NULL); /// Fill list box by appending items from newline separated strings FXint fillItems(const FXString& strings,FXIcon* icon=NULL,void* ptr=NULL); /// Insert a new item at index FXint insertItem(FXint index,const FXString& text,FXIcon* icon=NULL,void* ptr=NULL); /// Add an item to the end of the list FXint appendItem(const FXString& text,FXIcon* icon=NULL,void* ptr=NULL); /// Prepend an item to the list FXint prependItem(const FXString& text,FXIcon* icon=NULL,void* ptr=NULL); /// Move item from oldindex to newindex FXint moveItem(FXint newindex,FXint oldindex); /// Extract item from list FXListItem* extractItem(FXint index); /// Remove this item from the list void removeItem(FXint index); /// Remove all items from the list void clearItems(); /** * Search items by name, beginning from item start. If the start * item is -1 the search will start at the first item in the list. * Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control the * search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. * The option SEARCH_IGNORECASE causes a case-insensitive match. Finally, * passing SEARCH_PREFIX causes searching for a prefix of the item name. * Return -1 if no matching item is found. */ FXint findItem(const FXString& text,FXint start=-1,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /** * Search items by associated user data, beginning from item start. If the * start item is -1 the search will start at the first item in the list. * Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control the * search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. */ FXint findItemByData(const void *ptr,FXint start=-1,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /// Set text for specified item void setItemText(FXint index,const FXString& text); /// Get text for specified item FXString getItemText(FXint index) const; /// Change item icon, deleting old one if it was owned void setItemIcon(FXint index,FXIcon* icon,FXbool owned=FALSE); /// Return icon of item at index FXIcon* getItemIcon(FXint index) const; /// Set data pointer for specified item void setItemData(FXint index,void* ptr) const; /// Get data pointer for specified item void* getItemData(FXint index) const; /// Is the pane shown FXbool isPaneShown() const; /// Sort items using current sort function void sortItems(); /// Set text font void setFont(FXFont* fnt); /// Get text font FXFont* getFont() const; /// Set window background color virtual void setBackColor(FXColor clr); /// Get background color FXColor getBackColor() const; /// Change text color void setTextColor(FXColor clr); /// Return text color FXColor getTextColor() const; /// Change selected background color void setSelBackColor(FXColor clr); /// Return selected background color FXColor getSelBackColor() const; /// Change selected text color void setSelTextColor(FXColor clr); /// Return selected text color FXColor getSelTextColor() const; /// Return sort function FXListSortFunc getSortFunc() const; /// Change sort function void setSortFunc(FXListSortFunc func); /// Set the combobox help text void setHelpText(const FXString& txt); /// Get the combobox help text const FXString& getHelpText() const; /// Set the tool tip message for this combobox void setTipText(const FXString& txt); /// Get the tool tip message for this combobox const FXString& getTipText() const; /// Save combobox to a stream virtual void save(FXStream& store) const; /// Load combobox from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXListBox(); }; } #endif fox1.6-1.6.57/include/FXMDIButton.h000066400000000000000000000121571326741342000165020ustar00rootroot00000000000000/******************************************************************************** * * * M u l t i p l e D o c u m e n t B u t t o n * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMDIButton.h,v 1.16 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXMDIBUTTON_H #define FXMDIBUTTON_H #ifndef FXBUTTON_H #include "FXButton.h" #endif namespace FX { class FXIcon; /// MDI Delete button class FXAPI FXMDIDeleteButton : public FXButton { FXDECLARE(FXMDIDeleteButton) protected: FXMDIDeleteButton(){} private: FXMDIDeleteButton(const FXMDIDeleteButton&); FXMDIDeleteButton &operator=(const FXMDIDeleteButton&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Constructor FXMDIDeleteButton(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_RAISED,FXint x=0,FXint y=0,FXint w=0,FXint h=0); virtual FXint getDefaultWidth(); virtual FXint getDefaultHeight(); }; /// MDI Restore button class FXAPI FXMDIRestoreButton : public FXButton { FXDECLARE(FXMDIRestoreButton) protected: FXMDIRestoreButton(){} private: FXMDIRestoreButton(const FXMDIRestoreButton&); FXMDIRestoreButton &operator=(const FXMDIRestoreButton&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Constructor FXMDIRestoreButton(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_RAISED,FXint x=0,FXint y=0,FXint w=0,FXint h=0); virtual FXint getDefaultWidth(); virtual FXint getDefaultHeight(); }; /// MDI Maximize button class FXAPI FXMDIMaximizeButton : public FXButton { FXDECLARE(FXMDIMaximizeButton) protected: FXMDIMaximizeButton(){} private: FXMDIMaximizeButton(const FXMDIMaximizeButton&); FXMDIMaximizeButton &operator=(const FXMDIMaximizeButton&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Constructor FXMDIMaximizeButton(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_RAISED,FXint x=0,FXint y=0,FXint w=0,FXint h=0); virtual FXint getDefaultWidth(); virtual FXint getDefaultHeight(); }; /// MDI Minimize button class FXAPI FXMDIMinimizeButton : public FXButton { FXDECLARE(FXMDIMinimizeButton) protected: FXMDIMinimizeButton(){} private: FXMDIMinimizeButton(const FXMDIMinimizeButton&); FXMDIMinimizeButton &operator=(const FXMDIMinimizeButton&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Constructor FXMDIMinimizeButton(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_RAISED,FXint x=0,FXint y=0,FXint w=0,FXint h=0); virtual FXint getDefaultWidth(); virtual FXint getDefaultHeight(); }; /// MDI Window button class FXAPI FXMDIWindowButton : public FXMenuButton { FXDECLARE(FXMDIWindowButton) protected: FXMDIWindowButton(){} private: FXMDIWindowButton(const FXMDIWindowButton&); FXMDIWindowButton &operator=(const FXMDIWindowButton&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Constructor FXMDIWindowButton(FXComposite* p,FXPopup* pup,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); virtual FXint getDefaultWidth(); virtual FXint getDefaultHeight(); }; /// MDI Window Menu class FXAPI FXMDIMenu : public FXMenuPane { FXDECLARE(FXMDIMenu) private: FXIcon *closeicon; FXIcon *maximizeicon; FXIcon *minimizeicon; FXIcon *restoreicon; protected: FXMDIMenu(){} private: FXMDIMenu(const FXMDIMenu&); FXMDIMenu &operator=(const FXMDIMenu&); public: /// Construct MDI menu FXMDIMenu(FXWindow *owner,FXObject* tgt=NULL); /// Destructor virtual ~FXMDIMenu(); }; } #endif fox1.6-1.6.57/include/FXMDIChild.h000066400000000000000000000265611326741342000162560ustar00rootroot00000000000000/******************************************************************************** * * * M u l t i p l e D o c u m e n t C h i l d W i n d o w * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMDIChild.h,v 1.42 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXMDICHILD_H #define FXMDICHILD_H #ifndef FXCOMPOSITE_H #include "FXComposite.h" #endif namespace FX { class FXMDIClient; class FXMenuButton; class FXButton; class FXFont; /// MDI Child Window styles enum { MDI_NORMAL = 0, /// Normal display mode MDI_MAXIMIZED = 0x00001000, /// Window appears maximized MDI_MINIMIZED = 0x00002000, /// Window is iconified or minimized MDI_TRACKING = 0x00004000 /// Track continuously during dragging }; /** * The MDI child window contains the application work area in a Multiple Document * Interface application. GUI Controls are connected to the MDI child via delegation * through the MDI client, which forwards messages it receives to the active MDI child. * The MDI child itself tries to further delegate messages to its single content window, * and if not handled there, to its target object. * When the MDI child is maximized, it sends a SEL_MAXIMIZE message; when the MDI * child is minimized, it sends a SEL_MINIMIZE message. When it is restored, it * sends a SEL_RESTORE message to its target. The MDI child also notifies its * target when it becomes the active MDI child, via the SEL_SELECTED message. * The void* in the SEL_SELECTED message refers to the previously active MDI child, * if any. When an MDI child ceases to be the active one, a SEL_DESELECTED message * is sent. The void* in the SEL_DESELECTED message refers to the newly activated * MDI child, if any. Thus, interception of SEL_SELECTED and SEL_DESELECTED allows * the target object to determine whether the user switched between MDI windows of * the same document (target) or between MDI windows belonging to the same document. * When the MDI child is closed, it sends a SEL_CLOSE message to its target. * The target has an opportunity to object to the closing; if the MDI child should * not be closed, it should return 1 (objection). If the MDI child should be closed, * the target can either just return 0 or simply not handle the SEL_CLOSE message. * The SEL_UPDATE message can be used to modify the MDI child's title (via * ID_SETSTRINGVALUE), and window icon (via ID_SETICONVALUE). */ class FXAPI FXMDIChild : public FXComposite { FXDECLARE(FXMDIChild) protected: FXString title; // Window title FXMenuButton *windowbtn; // Window button FXButton *minimizebtn; // Minimize button FXButton *restorebtn; // Restore button FXButton *maximizebtn; // Maximize buton FXButton *deletebtn; // Close button FXFont *font; // Title font FXColor baseColor; // Colors FXColor hiliteColor; FXColor shadowColor; FXColor borderColor; FXColor titleColor; FXColor titleBackColor; FXint iconPosX; // Saved icon position FXint iconPosY; FXint iconWidth; FXint iconHeight; FXint normalPosX; // Saved normal position FXint normalPosY; FXint normalWidth; FXint normalHeight; FXint spotx; // Grab-spot of mouse on window FXint spoty; FXint xoff; // Mouse offset to add FXint yoff; FXint newx; // New location of window FXint newy; FXint neww; FXint newh; FXuchar mode; // Dragging mode protected: FXMDIChild(); void drawRubberBox(FXint x,FXint y,FXint w,FXint h); void animateRectangles(FXint ox,FXint oy,FXint ow,FXint oh,FXint nx,FXint ny,FXint nw,FXint nh); FXuchar where(FXint x,FXint y); void changeCursor(FXint x,FXint y); void revertCursor(); protected: enum { DRAG_NONE = 0, DRAG_TOP = 1, DRAG_BOTTOM = 2, DRAG_LEFT = 4, DRAG_RIGHT = 8, DRAG_TOPLEFT = (DRAG_TOP|DRAG_LEFT), DRAG_TOPRIGHT = (DRAG_TOP|DRAG_RIGHT), DRAG_BOTTOMLEFT = (DRAG_BOTTOM|DRAG_LEFT), DRAG_BOTTOMRIGHT = (DRAG_BOTTOM|DRAG_RIGHT), DRAG_INVERTED = 16, DRAG_TITLE = 32 }; private: FXMDIChild(const FXMDIChild&); FXMDIChild &operator=(const FXMDIChild&); public: long onPaint(FXObject*,FXSelector,void*); long onFocusSelf(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMiddleBtnPress(FXObject*,FXSelector,void*); long onMiddleBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onSelected(FXObject*,FXSelector,void*); long onDeselected(FXObject*,FXSelector,void*); long onCmdClose(FXObject*,FXSelector,void*); long onUpdClose(FXObject*,FXSelector,void*); long onCmdRestore(FXObject*,FXSelector,void*); long onUpdRestore(FXObject*,FXSelector,void*); long onUpdMaximize(FXObject*,FXSelector,void*); long onUpdMinimize(FXObject*,FXSelector,void*); long onCmdMaximize(FXObject*,FXSelector,void*); long onCmdMinimize(FXObject*,FXSelector,void*); long onUpdWindow(FXObject*,FXSelector,void*); long onUpdMenuRestore(FXObject*,FXSelector,void*); long onUpdMenuMinimize(FXObject*,FXSelector,void*); long onUpdMenuClose(FXObject*,FXSelector,void*); long onUpdMenuWindow(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdSetIconValue(FXObject*,FXSelector,void*); long onCmdGetIconValue(FXObject*,FXSelector,void*); virtual long onDefault(FXObject*,FXSelector,void*); public: /// Construct MDI Child window with given name and icon FXMDIChild(FXMDIClient* p,const FXString& name,FXIcon* ic=NULL,FXPopup* pup=NULL,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create window virtual void create(); /// Detach window virtual void detach(); /// Perform layout virtual void layout(); /// Return the default width of this window virtual FXint getDefaultWidth(); /// Return the default height of this window virtual FXint getDefaultHeight(); /// Move the focus to this window virtual void setFocus(); /// MDI Child can receive focus virtual bool canFocus() const; /// Move this window to the specified position in the parent's coordinates virtual void move(FXint x,FXint y); /// Resize this window to the specified width and height virtual void resize(FXint w,FXint h); /// Move and resize this window in the parent's coordinates virtual void position(FXint x,FXint y,FXint w,FXint h); /// Change normal (restored) position void setNormalX(FXint x){ normalPosX=x; } void setNormalY(FXint y){ normalPosY=y; } void setNormalWidth(FXint w){ normalWidth=w; } void setNormalHeight(FXint h){ normalHeight=h; } /// Return normal (restored) position FXint getNormalX() const { return normalPosX; } FXint getNormalY() const { return normalPosY; } FXint getNormalWidth() const { return normalWidth; } FXint getNormalHeight() const { return normalHeight; } /// Change iconified position void setIconX(FXint x){ iconPosX=x; } void setIconY(FXint y){ iconPosY=y; } void setIconWidth(FXint w){ iconWidth=w; } void setIconHeight(FXint h){ iconHeight=h; } /// Return iconified position FXint getIconX() const { return iconPosX; } FXint getIconY() const { return iconPosY; } FXint getIconWidth() const { return iconWidth; } FXint getIconHeight() const { return iconHeight; } /// Return content window FXWindow *contentWindow() const; /// Change MDI Child's title void setTitle(const FXString& name); /// Get current title FXString getTitle() const { return title; } /// Get colors FXColor getHiliteColor() const { return hiliteColor; } FXColor getShadowColor() const { return shadowColor; } FXColor getBaseColor() const { return baseColor; } FXColor getBorderColor() const { return borderColor; } FXColor getTitleColor () const { return titleColor; } FXColor getTitleBackColor() const { return titleBackColor; } /// Change colors void setHiliteColor(FXColor clr); void setShadowColor(FXColor clr); void setBaseColor(FXColor clr); void setBorderColor(FXColor clr); void setTitleColor(FXColor clr); void setTitleBackColor(FXColor clr); /// Maximize MDI window, return TRUE if maximized virtual FXbool maximize(FXbool notify=FALSE); /// Minimize/iconify MDI window, return TRUE if minimized virtual FXbool minimize(FXbool notify=FALSE); /// Restore MDI window to normal, return TRUE if restored virtual FXbool restore(FXbool notify=FALSE); /// Close MDI window, return TRUE if actually closed virtual FXbool close(FXbool notify=FALSE); /// Return TRUE if maximized FXbool isMaximized() const; /// Return TRUE if minimized FXbool isMinimized() const; /// Get window icon FXIcon *getIcon() const; /// Set window icon void setIcon(FXIcon* icon); /// Get window menu FXPopup* getMenu() const; /// Set window menu void setMenu(FXPopup* menu); /// Set tracking instead of just outline void setTracking(FXbool tracking=TRUE); /// Return true if tracking FXbool getTracking() const; /// Set title font void setFont(FXFont *fnt); /// Get title font FXFont* getFont() const { return font; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy virtual ~FXMDIChild(); }; } #endif fox1.6-1.6.57/include/FXMDIClient.h000066400000000000000000000162041326741342000164420ustar00rootroot00000000000000/******************************************************************************** * * * M u l t i p l e D o c u m e n t C l i e n t W i n d o w * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMDIClient.h,v 1.32 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXMDICLIENT_H #define FXMDICLIENT_H #ifndef FXCOMPOSITE_H #include "FXComposite.h" #endif namespace FX { class FXMDIChild; /** * The MDI client window manages a number of MDI child windows in a multiple-document * interface (MDI) application. MDI child windows usually receive messages from the GUI controls * by delegation via the MDI client. This is accomplished by making the MDI client window * the target for most GUI controls. The MDI client filters out messages intented for itself, * and delegates the remaining messages to its currently active MDI child, if any. * If you use the auto-gray or auto-hide feature available in some GUI controls, these * controls can be automatically grayed out or hidden when there is no active MDI child. * When delegating messages via MDI client to MDI child windows of different types, care * should be taken that message ID's do not overlap, so that all message ID's only map to * the intented handlers no matter which MDI child window type is active. * The MDI client sends a SEL_CHANGED message to its target when the active MDI child is * switched, with the void* pointer refering to the new MDI child. * A MDI Window selection dialog can be brought up through the ID_MDI_OVER_X messages; * a menu button connected to the MDI client with the ID_MDI_OVER_X message will be * automatically grayed out if there are less than X MDI child windows. */ class FXAPI FXMDIClient : public FXComposite { FXDECLARE(FXMDIClient) friend class FXMDIChild; protected: FXMDIChild *active; // Active child FXint cascadex; // Cascade offset X FXint cascadey; // Cascade offset Y protected: FXMDIClient(); private: FXMDIClient(const FXMDIClient&); FXMDIClient &operator=(const FXMDIClient&); public: long onCmdActivateNext(FXObject*,FXSelector,void*); long onCmdActivatePrev(FXObject*,FXSelector,void*); long onCmdTileHorizontal(FXObject*,FXSelector,void*); long onCmdTileVertical(FXObject*,FXSelector,void*); long onCmdCascade(FXObject*,FXSelector,void*); long onUpdActivateNext(FXObject*,FXSelector,void*); long onUpdActivatePrev(FXObject*,FXSelector,void*); long onUpdTileVertical(FXObject*,FXSelector,void*); long onUpdTileHorizontal(FXObject*,FXSelector,void*); long onUpdCascade(FXObject*,FXSelector,void*); long onUpdClose(FXObject*,FXSelector,void*); long onUpdMenuClose(FXObject*,FXSelector,void*); long onUpdRestore(FXObject*,FXSelector,void*); long onUpdMenuRestore(FXObject*,FXSelector,void*); long onUpdMinimize(FXObject*,FXSelector,void*); long onUpdMenuMinimize(FXObject*,FXSelector,void*); long onUpdMaximize(FXObject*,FXSelector,void*); long onUpdMenuWindow(FXObject*,FXSelector,void*); long onCmdWindowSelect(FXObject*,FXSelector,void*); long onUpdWindowSelect(FXObject*,FXSelector,void*); long onCmdOthersWindows(FXObject*,FXSelector,void*); long onUpdOthersWindows(FXObject*,FXSelector,void*); long onUpdAnyWindows(FXObject*,FXSelector,void*); virtual long onDefault(FXObject*,FXSelector,void*); public: enum { ID_MDI_ANY=65400, ID_MDI_1, // Select MDI child 1 ID_MDI_2, ID_MDI_3, ID_MDI_4, ID_MDI_5, ID_MDI_6, ID_MDI_7, ID_MDI_8, ID_MDI_9, ID_MDI_10, ID_MDI_OVER_1, // Sensitize MDI menu when 1 or more children ID_MDI_OVER_2, ID_MDI_OVER_3, ID_MDI_OVER_4, ID_MDI_OVER_5, ID_MDI_OVER_6, ID_MDI_OVER_7, ID_MDI_OVER_8, ID_MDI_OVER_9, ID_MDI_OVER_10, ID_LAST }; public: /// Construct MDI Client window FXMDIClient(FXComposite* p,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /** * Pass message to all MDI windows, stopping when one of * the MDI windows fails to handle the message. */ long forallWindows(FXObject* sender,FXSelector sel,void* ptr); /** * Pass message once to all MDI windows with the same document, * stopping when one of the MDI windows fails to handle the message. */ long forallDocuments(FXObject* sender,FXSelector sel,void* ptr); /** * Pass message to all MDI Child windows whose target is document, * stopping when one of the MDI windows fails to handle the message. */ long forallDocWindows(FXObject* document,FXObject* sender,FXSelector sel,void* ptr); /// Set active MDI Child virtual FXbool setActiveChild(FXMDIChild* child=NULL,FXbool notify=TRUE); /// Get current active child; may be NULL! FXMDIChild* getActiveChild() const { return active; } /// Cascade windows virtual void cascade(FXbool notify=FALSE); /// Layout horizontally virtual void horizontal(FXbool notify=FALSE); /// Layout vertically virtual void vertical(FXbool notify=FALSE); /// Change cascade offset X void setCascadeX(FXint off){ cascadex=off; } /// Change cascade offset Y void setCascadeY(FXint off){ cascadey=off; } /// Get cascade offset X FXint getCascadeX() const { return cascadex; } /// Get cascade offset Y FXint getCascadeY() const { return cascadey; } /// Save object to a stream virtual void save(FXStream& store) const; /// Load object from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXMDIClient(); }; } #endif fox1.6-1.6.57/include/FXMainWindow.h000066400000000000000000000056671326741342000167610ustar00rootroot00000000000000/******************************************************************************** * * * M a i n W i n d o w W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMainWindow.h,v 1.21 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXMAINWINDOW_H #define FXMAINWINDOW_H #ifndef FXTOPWINDOW_H #include "FXTopWindow.h" #endif namespace FX { /** * The Main Window is usually the central window of an application. Applications * may have any number of main windows. * When a MainWindow is closed, it sends a SEL_CLOSE message to its target; the target * should return 0 if there is no objection against proceeding with the close, and * return 1 otherwise. * After the SEL_CLOSE message has been sent and no objection was raised, the main * window will delete itself. */ class FXAPI FXMainWindow : public FXTopWindow { FXDECLARE(FXMainWindow) protected: FXMainWindow(){} private: FXMainWindow(const FXMainWindow&); FXMainWindow &operator=(const FXMainWindow&); public: /// Construct a main window FXMainWindow(FXApp* a,const FXString& name,FXIcon *ic=NULL,FXIcon *mi=NULL,FXuint opts=DECOR_ALL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=0,FXint pr=0,FXint pt=0,FXint pb=0,FXint hs=0,FXint vs=0); /// Create server-side resources virtual void create(); /// Destructor virtual ~FXMainWindow(); }; } #endif fox1.6-1.6.57/include/FXMat3d.h000066400000000000000000000122451326741342000156430ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n 3 x 3 M a t r i x * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMat3d.h,v 1.12 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXMAT3D_H #define FXMAT3D_H namespace FX { class FXQuatd; /// Double-precision 3x3 matrix class FXAPI FXMat3d { protected: FXVec3d m[3]; public: /// Default constructor FXMat3d(){} /// Initialize matrix from another matrix FXMat3d(const FXMat3d& other); /// Initialize matrix from scalar FXMat3d(FXdouble w); /// Initialize matrix from components FXMat3d(FXdouble a00,FXdouble a01,FXdouble a02, FXdouble a10,FXdouble a11,FXdouble a12, FXdouble a20,FXdouble a21,FXdouble a22); /// Initialize matrix from three vectors FXMat3d(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c); /// Initialize matrix from quaternion FXMat3d(const FXQuatd& quat); /// Assignment FXMat3d& operator=(const FXMat3d& other); FXMat3d& operator=(FXdouble w); /// Set value from another matrix FXMat3d& set(const FXMat3d& other); /// Set value from scalar FXMat3d& set(FXdouble w); /// Set value from components FXMat3d& set(FXdouble a00,FXdouble a01,FXdouble a02, FXdouble a10,FXdouble a11,FXdouble a12, FXdouble a20,FXdouble a21,FXdouble a22); /// Set value from three vectors FXMat3d& set(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c); /// Set value from quaternion FXMat3d& set(const FXQuatd& quat); /// Assignment operators FXMat3d& operator+=(const FXMat3d& w); FXMat3d& operator-=(const FXMat3d& w); FXMat3d& operator*=(FXdouble w); FXMat3d& operator*=(const FXMat3d& w); FXMat3d& operator/=(FXdouble w); /// Indexing FXVec3d& operator[](FXint i){return m[i];} const FXVec3d& operator[](FXint i) const {return m[i];} /// Conversion operator FXdouble*(){return m[0];} operator const FXdouble*() const {return m[0];} /// Unary minus FXMat3d operator-() const; /// Matrix and matrix FXMat3d operator+(const FXMat3d& w) const; FXMat3d operator-(const FXMat3d& w) const; FXMat3d operator*(const FXMat3d& w) const; /// Multiply matrix and vector FXVec3d operator*(const FXVec3d& v) const; FXVec2d operator*(const FXVec2d& v) const; /// Matrix and scalar friend FXAPI FXMat3d operator*(FXdouble x,const FXMat3d& a); friend FXAPI FXMat3d operator*(const FXMat3d& a,FXdouble x); friend FXAPI FXMat3d operator/(const FXMat3d& a,FXdouble x); friend FXAPI FXMat3d operator/(FXdouble x,const FXMat3d& a); /// Set identity matrix FXMat3d& eye(); /// Multiply by rotation of phi FXMat3d& rot(FXdouble c,FXdouble s); FXMat3d& rot(FXdouble phi); /// Multiply by translation FXMat3d& trans(FXdouble tx,FXdouble ty); /// Multiply by scaling FXMat3d& scale(FXdouble sx,FXdouble sy); FXMat3d& scale(FXdouble s); /// Determinant FXdouble det() const; /// Transpose FXMat3d transpose() const; /// Invert FXMat3d invert() const; /// Save to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXMat3d& m); /// Load from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXMat3d& m); }; extern FXAPI FXMat3d operator*(FXdouble x,const FXMat3d& a); extern FXAPI FXMat3d operator*(const FXMat3d& a,FXdouble x); extern FXAPI FXMat3d operator/(const FXMat3d& a,FXdouble x); extern FXAPI FXMat3d operator/(FXdouble x,const FXMat3d& a); extern FXAPI FXStream& operator<<(FXStream& store,const FXMat3d& m); extern FXAPI FXStream& operator>>(FXStream& store,FXMat3d& m); } #endif fox1.6-1.6.57/include/FXMat3f.h000066400000000000000000000121731326741342000156450ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n 3 x 3 M a t r i x * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMat3f.h,v 1.13 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXMAT3F_H #define FXMAT3F_H namespace FX { class FXQuatf; /// Single-precision 3x3 matrix class FXAPI FXMat3f { protected: FXVec3f m[3]; public: /// Default constructor FXMat3f(){} /// Initialize matrix from another matrix FXMat3f(const FXMat3f& other); /// Initialize matrix from scalar FXMat3f(FXfloat w); /// Initialize matrix from components FXMat3f(FXfloat a00,FXfloat a01,FXfloat a02, FXfloat a10,FXfloat a11,FXfloat a12, FXfloat a20,FXfloat a21,FXfloat a22); /// Initialize matrix from three vectors FXMat3f(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c); /// Initialize matrix from quaternion FXMat3f(const FXQuatf& quat); /// Assignment FXMat3f& operator=(const FXMat3f& other); FXMat3f& operator=(FXfloat w); /// Set value from another matrix FXMat3f& set(const FXMat3f& other); /// Set value from scalar FXMat3f& set(FXfloat w); /// Set value from components FXMat3f& set(FXfloat a00,FXfloat a01,FXfloat a02, FXfloat a10,FXfloat a11,FXfloat a12, FXfloat a20,FXfloat a21,FXfloat a22); /// Set value from three vectors FXMat3f& set(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c); /// Set value from quaternion FXMat3f& set(const FXQuatf& quat); /// Assignment operators FXMat3f& operator+=(const FXMat3f& w); FXMat3f& operator-=(const FXMat3f& w); FXMat3f& operator*=(FXfloat w); FXMat3f& operator*=(const FXMat3f& w); FXMat3f& operator/=(FXfloat w); /// Indexing FXVec3f& operator[](FXint i){return m[i];} const FXVec3f& operator[](FXint i) const {return m[i];} /// Conversion operator FXfloat*(){return m[0];} operator const FXfloat*() const {return m[0];} /// Unary minus FXMat3f operator-() const; /// Matrix and matrix FXMat3f operator+(const FXMat3f& w) const; FXMat3f operator-(const FXMat3f& w) const; FXMat3f operator*(const FXMat3f& w) const; /// Multiply matrix and vector FXVec3f operator*(const FXVec3f& v) const; FXVec2f operator*(const FXVec2f& v) const; /// Matrix and scalar friend FXAPI FXMat3f operator*(FXfloat x,const FXMat3f& a); friend FXAPI FXMat3f operator*(const FXMat3f& a,FXfloat x); friend FXAPI FXMat3f operator/(const FXMat3f& a,FXfloat x); friend FXAPI FXMat3f operator/(FXfloat x,const FXMat3f& a); /// Set identity matrix FXMat3f& eye(); /// Multiply by rotation of phi FXMat3f& rot(FXfloat c,FXfloat s); FXMat3f& rot(FXfloat phi); /// Multiply by translation FXMat3f& trans(FXfloat tx,FXfloat ty); /// Multiply by scaling FXMat3f& scale(FXfloat sx,FXfloat sy); FXMat3f& scale(FXfloat s); /// Determinant FXfloat det() const; /// Transpose FXMat3f transpose() const; /// Invert FXMat3f invert() const; /// Save to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXMat3f& m); /// Load from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXMat3f& m); }; extern FXAPI FXMat3f operator*(FXfloat x,const FXMat3f& a); extern FXAPI FXMat3f operator*(const FXMat3f& a,FXfloat x); extern FXAPI FXMat3f operator/(const FXMat3f& a,FXfloat x); extern FXAPI FXMat3f operator/(FXfloat x,const FXMat3f& a); extern FXAPI FXStream& operator<<(FXStream& store,const FXMat3f& m); extern FXAPI FXStream& operator>>(FXStream& store,FXMat3f& m); } #endif fox1.6-1.6.57/include/FXMat4d.h000066400000000000000000000140501326741342000156400ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n 4 x 4 M a t r i x * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMat4d.h,v 1.8 2006/01/22 17:58:05 fox Exp $ * ********************************************************************************/ #ifndef FXMAT4D_H #define FXMAT4D_H namespace FX { /// Double-precision 4x4 matrix class FXAPI FXMat4d { protected: FXVec4d m[4]; public: /// Constructors FXMat4d(){} FXMat4d(FXdouble w); FXMat4d(FXdouble a00,FXdouble a01,FXdouble a02,FXdouble a03, FXdouble a10,FXdouble a11,FXdouble a12,FXdouble a13, FXdouble a20,FXdouble a21,FXdouble a22,FXdouble a23, FXdouble a30,FXdouble a31,FXdouble a32,FXdouble a33); FXMat4d(const FXVec4d& a,const FXVec4d& b,const FXVec4d& c,const FXVec4d& d); FXMat4d(const FXMat4d& other); /// Assignment FXMat4d& operator=(const FXMat4d& other); FXMat4d& operator=(FXdouble w); /// Set value from another matrix FXMat4d& set(const FXMat4d& other); /// Set value from scalar FXMat4d& set(FXdouble w); /// Set value from components FXMat4d& set(FXdouble a00,FXdouble a01,FXdouble a02,FXdouble a03, FXdouble a10,FXdouble a11,FXdouble a12,FXdouble a13, FXdouble a20,FXdouble a21,FXdouble a22,FXdouble a23, FXdouble a30,FXdouble a31,FXdouble a32,FXdouble a33); /// Set value from four vectors FXMat4d& set(const FXVec4d& a,const FXVec4d& b,const FXVec4d& c,const FXVec4d& d); /// Assignment operators FXMat4d& operator+=(const FXMat4d& w); FXMat4d& operator-=(const FXMat4d& w); FXMat4d& operator*=(FXdouble w); FXMat4d& operator*=(const FXMat4d& w); FXMat4d& operator/=(FXdouble w); /// Indexing FXVec4d& operator[](FXint i){return m[i];} const FXVec4d& operator[](FXint i) const {return m[i];} /// Conversion operator FXdouble*(){return m[0];} operator const FXdouble*() const {return m[0];} /// Unary minus FXMat4d operator-() const; /// Matrix and matrix FXMat4d operator+(const FXMat4d& w) const; FXMat4d operator-(const FXMat4d& w) const; FXMat4d operator*(const FXMat4d& w) const; /// Matrix and scalar friend FXAPI FXMat4d operator*(FXdouble x,const FXMat4d& a); friend FXAPI FXMat4d operator*(const FXMat4d& a,FXdouble x); friend FXAPI FXMat4d operator/(const FXMat4d& a,FXdouble x); friend FXAPI FXMat4d operator/(FXdouble x,const FXMat4d& a); /// Multiply matrix and vector FXVec4d operator*(const FXVec4d& v) const; FXVec3d operator*(const FXVec3d& v) const; /// Set identity matrix FXMat4d& eye(); /// Orthographic projection FXMat4d& ortho(FXdouble left,FXdouble right,FXdouble bottom,FXdouble top,FXdouble hither,FXdouble yon); /// Perspective projection FXMat4d& frustum(FXdouble left,FXdouble right,FXdouble bottom,FXdouble top,FXdouble hither,FXdouble yon); /// Multiply by left-hand matrix FXMat4d& left(); /// Multiply by rotation about unit-quaternion FXMat4d& rot(const FXQuatd& q); /// Multiply by rotation c,s about axis FXMat4d& rot(const FXVec3d& v,FXdouble c,FXdouble s); /// Multiply by rotation of phi about axis FXMat4d& rot(const FXVec3d& v,FXdouble phi); /// Multiply by x-rotation FXMat4d& xrot(FXdouble c,FXdouble s); FXMat4d& xrot(FXdouble phi); /// Multiply by y-rotation FXMat4d& yrot(FXdouble c,FXdouble s); FXMat4d& yrot(FXdouble phi); /// Multiply by z-rotation FXMat4d& zrot(FXdouble c,FXdouble s); FXMat4d& zrot(FXdouble phi); /// Look at FXMat4d& look(const FXVec3d& eye,const FXVec3d& cntr,const FXVec3d& vup); /// Multiply by translation FXMat4d& trans(FXdouble tx,FXdouble ty,FXdouble tz); FXMat4d& trans(const FXVec3d& v); /// Multiply by scaling FXMat4d& scale(FXdouble sx,FXdouble sy,FXdouble sz); FXMat4d& scale(FXdouble s); FXMat4d& scale(const FXVec3d& v); /// Determinant FXdouble det() const; /// Transpose FXMat4d transpose() const; /// Invert FXMat4d invert() const; /// Save to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXMat4d& m); /// Load from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXMat4d& m); }; extern FXAPI FXMat4d operator*(FXdouble x,const FXMat4d& a); extern FXAPI FXMat4d operator*(const FXMat4d& a,FXdouble x); extern FXAPI FXMat4d operator/(const FXMat4d& a,FXdouble x); extern FXAPI FXMat4d operator/(FXdouble x,const FXMat4d& a); extern FXAPI FXStream& operator<<(FXStream& store,const FXMat4d& m); extern FXAPI FXStream& operator>>(FXStream& store,FXMat4d& m); } #endif fox1.6-1.6.57/include/FXMat4f.h000066400000000000000000000137271326741342000156540ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n 4 x 4 M a t r i x * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMat4f.h,v 1.9 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMAT4F_H #define FXMAT4F_H namespace FX { /// Single-precision 4x4 matrix class FXAPI FXMat4f { protected: FXVec4f m[4]; public: /// Constructors FXMat4f(){} FXMat4f(FXfloat w); FXMat4f(FXfloat a00,FXfloat a01,FXfloat a02,FXfloat a03, FXfloat a10,FXfloat a11,FXfloat a12,FXfloat a13, FXfloat a20,FXfloat a21,FXfloat a22,FXfloat a23, FXfloat a30,FXfloat a31,FXfloat a32,FXfloat a33); FXMat4f(const FXVec4f& a,const FXVec4f& b,const FXVec4f& c,const FXVec4f& d); FXMat4f(const FXMat4f& other); /// Assignment FXMat4f& operator=(const FXMat4f& other); FXMat4f& operator=(FXfloat w); /// Set value from another matrix FXMat4f& set(const FXMat4f& other); /// Set value from scalar FXMat4f& set(FXfloat w); /// Set value from components FXMat4f& set(FXfloat a00,FXfloat a01,FXfloat a02,FXfloat a03, FXfloat a10,FXfloat a11,FXfloat a12,FXfloat a13, FXfloat a20,FXfloat a21,FXfloat a22,FXfloat a23, FXfloat a30,FXfloat a31,FXfloat a32,FXfloat a33); /// Set value from four vectors FXMat4f& set(const FXVec4f& a,const FXVec4f& b,const FXVec4f& c,const FXVec4f& d); /// Assignment operators FXMat4f& operator+=(const FXMat4f& w); FXMat4f& operator-=(const FXMat4f& w); FXMat4f& operator*=(FXfloat w); FXMat4f& operator*=(const FXMat4f& w); FXMat4f& operator/=(FXfloat w); /// Indexing FXVec4f& operator[](FXint i){return m[i];} const FXVec4f& operator[](FXint i) const {return m[i];} /// Conversion operator FXfloat*(){return m[0];} operator const FXfloat*() const {return m[0];} /// Unary minus FXMat4f operator-() const; /// Matrix and matrix FXMat4f operator+(const FXMat4f& w) const; FXMat4f operator-(const FXMat4f& w) const; FXMat4f operator*(const FXMat4f& w) const; /// Other operators friend FXAPI FXMat4f operator*(FXfloat x,const FXMat4f& a); friend FXAPI FXMat4f operator*(const FXMat4f& a,FXfloat x); friend FXAPI FXMat4f operator/(const FXMat4f& a,FXfloat x); friend FXAPI FXMat4f operator/(FXfloat x,const FXMat4f& a); /// Multiply matrix and vector FXVec4f operator*(const FXVec4f& v) const; FXVec3f operator*(const FXVec3f& v) const; /// Set identity matrix FXMat4f& eye(); /// Orthographic projection FXMat4f& ortho(FXfloat left,FXfloat right,FXfloat bottom,FXfloat top,FXfloat hither,FXfloat yon); /// Perspective projection FXMat4f& frustum(FXfloat left,FXfloat right,FXfloat bottom,FXfloat top,FXfloat hither,FXfloat yon); /// Multiply by left-hand matrix FXMat4f& left(); /// Multiply by rotation about unit-quaternion FXMat4f& rot(const FXQuatf& q); /// Multiply by rotation c,s about axis FXMat4f& rot(const FXVec3f& v,FXfloat c,FXfloat s); /// Multiply by rotation of phi about axis FXMat4f& rot(const FXVec3f& v,FXfloat phi); /// Multiply by x-rotation FXMat4f& xrot(FXfloat c,FXfloat s); FXMat4f& xrot(FXfloat phi); /// Multiply by y-rotation FXMat4f& yrot(FXfloat c,FXfloat s); FXMat4f& yrot(FXfloat phi); /// Multiply by z-rotation FXMat4f& zrot(FXfloat c,FXfloat s); FXMat4f& zrot(FXfloat phi); /// Look at FXMat4f& look(const FXVec3f& eye,const FXVec3f& cntr,const FXVec3f& vup); /// Multiply by translation FXMat4f& trans(FXfloat tx,FXfloat ty,FXfloat tz); FXMat4f& trans(const FXVec3f& v); /// Multiply by scaling FXMat4f& scale(FXfloat sx,FXfloat sy,FXfloat sz); FXMat4f& scale(FXfloat s); FXMat4f& scale(const FXVec3f& v); /// Determinant FXfloat det() const; /// Transpose FXMat4f transpose() const; /// Invert FXMat4f invert() const; /// Save to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXMat4f& m); /// Load from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXMat4f& m); }; extern FXAPI FXMat4f operator*(FXfloat x,const FXMat4f& a); extern FXAPI FXMat4f operator*(const FXMat4f& a,FXfloat x); extern FXAPI FXMat4f operator/(const FXMat4f& a,FXfloat x); extern FXAPI FXMat4f operator/(FXfloat x,const FXMat4f& a); extern FXAPI FXStream& operator<<(FXStream& store,const FXMat4f& m); extern FXAPI FXStream& operator>>(FXStream& store,FXMat4f& m); } #endif fox1.6-1.6.57/include/FXMatrix.h000066400000000000000000000114061326741342000161350ustar00rootroot00000000000000/******************************************************************************** * * * M a t r i x C o n t a i n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMatrix.h,v 1.19 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMATRIX_H #define FXMATRIX_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { /// Matrix packing options enum { MATRIX_BY_ROWS = 0, /// Fixed number of rows, add columns as needed MATRIX_BY_COLUMNS = 0x00020000 /// Fixed number of columns, adding rows as needed }; /** * The Matrix layout manager automatically arranges its child windows * in rows and columns. If the matrix style is MATRIX_BY_ROWS, then * the matrix will have the given number of rows and the number of columns * grows as more child windows are added; if the matrix style is MATRIX_BY_COLUMNS, * then the number of columns is fixed and the number of rows grows as more children * are added. * If all children in a row (column) have the LAYOUT_FILL_ROW (LAYOUT_FILL_COLUMN) * hint set, then the row (column) will be stretchable as the matrix layout manager * itself is resized. If more than one row (column) is stretchable, the space is * apportioned to each stretchable row (column) proportionally. * Within each cell of the matrix, all other layout hints are observed. * For example, a child having LAYOUT_CENTER_Y and LAYOUT_FILL_X hints will * be centered in the Y-direction, while being stretched in the X-direction. * Empty cells can be obtained by simply placing a borderless FXFrame widget * as a space-holder. */ class FXAPI FXMatrix : public FXPacker { FXDECLARE(FXMatrix) protected: FXint num; protected: FXMatrix(){} private: FXMatrix(const FXMatrix&); FXMatrix &operator=(const FXMatrix&); public: long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusLeft(FXObject*,FXSelector,void*); long onFocusRight(FXObject*,FXSelector,void*); public: /// Construct a matrix layout manager with n rows or columns FXMatrix(FXComposite *p,FXint n=1,FXuint opts=MATRIX_BY_ROWS,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_SPACING,FXint pr=DEFAULT_SPACING,FXint pt=DEFAULT_SPACING,FXint pb=DEFAULT_SPACING,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Obtain the child placed at a certain row and column FXWindow* childAtRowCol(FXint r,FXint c) const; /// Return the row in which the given child is placed FXint rowOfChild(const FXWindow* child) const; /// Return the column in which the given child is placed FXint colOfChild(const FXWindow* child) const; /// Change the matrix style void setMatrixStyle(FXuint ph); /// Return the current matrix style FXuint getMatrixStyle() const; /// Change the number of rows void setNumRows(FXint nr); /// Return the number of rows FXint getNumRows() const; /// Change the number of columns void setNumColumns(FXint nc); /// Return the number of columns FXint getNumColumns() const; }; } #endif fox1.6-1.6.57/include/FXMemMap.h000066400000000000000000000070671326741342000160550ustar00rootroot00000000000000/******************************************************************************** * * * M e m o r y M a p p e d F i l e * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMemMap.h,v 1.8 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMEMMAP_H #define FXMEMMAP_H namespace FX { /** * A Memory Map provides a view of a file as an array of memory; * this allows the file itself to be used as backing for the data * and very simplified file access results. * Moreover, mapped files may be shared by processes, resuling * in far less "real" memory being used than would otherwise be * the case. */ class FXAPI FXMemMap { private: void* mapbase; // Memory base where it is mapped long maplength; // Length of the map long mapoffset; // Offset of the map FXInputHandle handle; // Handle for the map FXInputHandle file; // Handle for the file private: FXMemMap(const FXMemMap&); FXMemMap &operator=(const FXMemMap&); public: /// Memory map access modes enum { NONE = 0, /// Map is inaccessible READ = 1, /// Readable WRITE = 2, /// Writable EXEC = 4, /// Executable (where supported) TRUNC = 8 /// Truncate file to 0 }; /// Share mode enum { PRIV = 0, /// Private SHAR = 1 /// Shared }; public: /// Construct a memory map FXMemMap(); /// Map a view of the file; the offset must be a multiple of the page size void* mapFile(const FXString& filename,long off=0,long len=-1L,FXuint access=READ,FXuint share=PRIV); /// Unmap the view of the file void* unmap(); /// Synchronize disk void sync(); /// Return pointer to memory area void* base() const { return mapbase; } /// Obtain length of the map long length() const { return maplength; } /// Obtain offset of the map long offset() const { return mapoffset; } /// Destroy the map ~FXMemMap(); }; } #endif fox1.6-1.6.57/include/FXMemoryStream.h000066400000000000000000000147111326741342000173170ustar00rootroot00000000000000/******************************************************************************** * * * M e m o r y S t r e a m C l a s s e s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMemoryStream.h,v 1.11 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMEMORYSTREAM_H #define FXMEMORYSTREAM_H #ifndef FXSTREAM_H #include "FXStream.h" #endif namespace FX { /// Memory Store Definition class FXAPI FXMemoryStream : public FXStream { protected: virtual FXuval writeBuffer(FXuval count); virtual FXuval readBuffer(FXuval count); public: /// Create memory store FXMemoryStream(const FXObject* cont=NULL); /// Open file store bool open(FXStreamDirection save_or_load,FXuchar* data); /// Open memory store bool open(FXStreamDirection save_or_load,FXuval size,FXuchar* data); /// Take buffer away from stream void takeBuffer(FXuchar*& data,FXuval& size); /// Give buffer to stream void giveBuffer(FXuchar *data,FXuval size); /// Close memory store virtual bool close(); /// Get position FXlong position() const { return FXStream::position(); } /// Move to position virtual bool position(FXlong offset,FXWhence whence=FXFromStart); /// Save single items to stream FXMemoryStream& operator<<(const FXuchar& v){ FXStream::operator<<(v); return *this; } FXMemoryStream& operator<<(const FXchar& v){ FXStream::operator<<(v); return *this; } FXMemoryStream& operator<<(const FXushort& v){ FXStream::operator<<(v); return *this; } FXMemoryStream& operator<<(const FXshort& v){ FXStream::operator<<(v); return *this; } FXMemoryStream& operator<<(const FXuint& v){ FXStream::operator<<(v); return *this; } FXMemoryStream& operator<<(const FXint& v){ FXStream::operator<<(v); return *this; } FXMemoryStream& operator<<(const FXfloat& v){ FXStream::operator<<(v); return *this; } FXMemoryStream& operator<<(const FXdouble& v){ FXStream::operator<<(v); return *this; } FXMemoryStream& operator<<(const FXlong& v){ FXStream::operator<<(v); return *this; } FXMemoryStream& operator<<(const FXulong& v){ FXStream::operator<<(v); return *this; } /// Save arrays of items to stream FXMemoryStream& save(const FXuchar* p,FXuval n){ FXStream::save(p,n); return *this; } FXMemoryStream& save(const FXchar* p,FXuval n){ FXStream::save(p,n); return *this; } FXMemoryStream& save(const FXushort* p,FXuval n){ FXStream::save(p,n); return *this; } FXMemoryStream& save(const FXshort* p,FXuval n){ FXStream::save(p,n); return *this; } FXMemoryStream& save(const FXuint* p,FXuval n){ FXStream::save(p,n); return *this; } FXMemoryStream& save(const FXint* p,FXuval n){ FXStream::save(p,n); return *this; } FXMemoryStream& save(const FXfloat* p,FXuval n){ FXStream::save(p,n); return *this; } FXMemoryStream& save(const FXdouble* p,FXuval n){ FXStream::save(p,n); return *this; } FXMemoryStream& save(const FXlong* p,FXuval n){ FXStream::save(p,n); return *this; } FXMemoryStream& save(const FXulong* p,FXuval n){ FXStream::save(p,n); return *this; } /// Load single items from stream FXMemoryStream& operator>>(FXuchar& v){ FXStream::operator>>(v); return *this; } FXMemoryStream& operator>>(FXchar& v){ FXStream::operator>>(v); return *this; } FXMemoryStream& operator>>(FXushort& v){ FXStream::operator>>(v); return *this; } FXMemoryStream& operator>>(FXshort& v){ FXStream::operator>>(v); return *this; } FXMemoryStream& operator>>(FXuint& v){ FXStream::operator>>(v); return *this; } FXMemoryStream& operator>>(FXint& v){ FXStream::operator>>(v); return *this; } FXMemoryStream& operator>>(FXfloat& v){ FXStream::operator>>(v); return *this; } FXMemoryStream& operator>>(FXdouble& v){ FXStream::operator>>(v); return *this; } FXMemoryStream& operator>>(FXlong& v){ FXStream::operator>>(v); return *this; } FXMemoryStream& operator>>(FXulong& v){ FXStream::operator>>(v); return *this; } /// Load arrays of items from stream FXMemoryStream& load(FXuchar* p,FXuval n){ FXStream::load(p,n); return *this; } FXMemoryStream& load(FXchar* p,FXuval n){ FXStream::load(p,n); return *this; } FXMemoryStream& load(FXushort* p,FXuval n){ FXStream::load(p,n); return *this; } FXMemoryStream& load(FXshort* p,FXuval n){ FXStream::load(p,n); return *this; } FXMemoryStream& load(FXuint* p,FXuval n){ FXStream::load(p,n); return *this; } FXMemoryStream& load(FXint* p,FXuval n){ FXStream::load(p,n); return *this; } FXMemoryStream& load(FXfloat* p,FXuval n){ FXStream::load(p,n); return *this; } FXMemoryStream& load(FXdouble* p,FXuval n){ FXStream::load(p,n); return *this; } FXMemoryStream& load(FXlong* p,FXuval n){ FXStream::load(p,n); return *this; } FXMemoryStream& load(FXulong* p,FXuval n){ FXStream::load(p,n); return *this; } /// Save object FXMemoryStream& saveObject(const FXObject* v){ FXStream::saveObject(v); return *this; } /// Load object FXMemoryStream& loadObject(FXObject*& v){ FXStream::loadObject(v); return *this; } }; } #endif fox1.6-1.6.57/include/FXMenuBar.h000066400000000000000000000065621326741342000162310ustar00rootroot00000000000000/******************************************************************************** * * * M e n u B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuBar.h,v 1.15 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMENUBAR_H #define FXMENUBAR_H #ifndef FXTOOLBAR_H #include "FXToolBar.h" #endif namespace FX { /// Menu bar class FXAPI FXMenuBar : public FXToolBar { FXDECLARE(FXMenuBar) protected: FXMenuBar(){} private: FXMenuBar(const FXMenuBar&); FXMenuBar &operator=(const FXMenuBar&); public: long onFocusLeft(FXObject*,FXSelector,void*); long onFocusRight(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onButtonPress(FXObject*,FXSelector,void*); long onButtonRelease(FXObject*,FXSelector,void*); long onCmdUnpost(FXObject*,FXSelector,void*); public: /** * Construct a floatable menubar * Normally, the menubar is docked under window p. * When floated, the menubar can be docked under window q, which is * typically an FXToolbarShell window. */ FXMenuBar(FXComposite* p,FXComposite* q,FXuint opts=LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=3,FXint pr=3,FXint pt=2,FXint pb=2,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /** * Construct a non-floatable menubar. * The menubar can not be undocked. */ FXMenuBar(FXComposite* p,FXuint opts,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=3,FXint pr=3,FXint pt=2,FXint pb=2,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Returns true if specified coordinate (in parent's coordinate system) is in menubar virtual bool contains(FXint parentx,FXint parenty) const; }; } #endif fox1.6-1.6.57/include/FXMenuButton.h000066400000000000000000000171041326741342000167720ustar00rootroot00000000000000/******************************************************************************** * * * M e n u B u t t o n W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuButton.h,v 1.24 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMENUBUTTON_H #define FXMENUBUTTON_H #ifndef FXLABEL_H #include "FXLabel.h" #endif namespace FX { class FXPopup; // Menu button options enum { MENUBUTTON_AUTOGRAY = 0x00800000, /// Automatically gray out when no target MENUBUTTON_AUTOHIDE = 0x01000000, /// Automatically hide when no target MENUBUTTON_TOOLBAR = 0x02000000, /// Toolbar style MENUBUTTON_DOWN = 0, /// Popup window appears below menu button MENUBUTTON_UP = 0x04000000, /// Popup window appears above menu button MENUBUTTON_LEFT = 0x08000000, /// Popup window to the left of the menu button MENUBUTTON_RIGHT = MENUBUTTON_LEFT|MENUBUTTON_UP, /// Popup window to the right of the menu button MENUBUTTON_NOARROWS = 0x10000000, /// Do not show arrows MENUBUTTON_ATTACH_LEFT = 0, /// Popup attaches to the left side of the menu button MENUBUTTON_ATTACH_TOP = MENUBUTTON_ATTACH_LEFT, /// Popup attaches to the top of the menu button MENUBUTTON_ATTACH_RIGHT = 0x20000000, /// Popup attaches to the right side of the menu button MENUBUTTON_ATTACH_BOTTOM = MENUBUTTON_ATTACH_RIGHT, /// Popup attaches to the bottom of the menu button MENUBUTTON_ATTACH_CENTER = 0x40000000, /// Popup attaches to the center of the menu button MENUBUTTON_ATTACH_BOTH = MENUBUTTON_ATTACH_CENTER|MENUBUTTON_ATTACH_RIGHT /// Popup attaches to both sides of the menu button }; /** * A menu button posts a popup menu when clicked. * There are many ways to control the placement where the popup will appear; * first, the popup may be placed on either of the four sides relative to the * menu button; this is controlled by the flags MENUBUTTON_DOWN, etc. * Next, there are several attachment modes; the popup's left/bottom edge may * attach to the menu button's left/top edge, or the popup's right/top edge may * attach to the menu button's right/bottom edge, or both. * Also, the popup may apear centered relative to the menu button. * Finally, a small offset may be specified to displace the location of the * popup by a few pixels so as to account for borders and so on. * Normally, the menu button shows an arrow pointing to the direction where * the popup is set to appear; this can be turned off by passing the option * MENUBUTTON_NOARROWS. */ class FXAPI FXMenuButton : public FXLabel { FXDECLARE(FXMenuButton) protected: FXPopup *pane; // Pane to pop up FXint offsetx; // Shift attachment point x FXint offsety; // Shift attachment point y FXbool state; // Pane was popped protected: FXMenuButton(); private: FXMenuButton(const FXMenuButton&); FXMenuButton &operator=(const FXMenuButton&); public: long onPaint(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onCmdPost(FXObject*,FXSelector,void*); long onCmdUnpost(FXObject*,FXSelector,void*); public: /// Constructor FXMenuButton(FXComposite* p,const FXString& text,FXIcon* ic=NULL,FXPopup* pup=NULL,FXuint opts=JUSTIFY_NORMAL|ICON_BEFORE_TEXT|MENUBUTTON_DOWN,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Returns true because a menu button can receive focus virtual bool canFocus() const; /// Remove the focus from this window virtual void killFocus(); /// Return true if window logically contains the given point virtual bool contains(FXint parentx,FXint parenty) const; /// Change the popup menu void setMenu(FXPopup *pup); /// Return current popup menu FXPopup* getMenu() const { return pane; } /// Set X offset where menu pops up relative to button void setXOffset(FXint offx){ offsetx=offx; } /// Return current X offset FXint getXOffset() const { return offsetx; } /// Set Y offset where menu pops up relative to button void setYOffset(FXint offy){ offsety=offy; } /// Return current Y offset FXint getYOffset() const { return offsety; } /// Change menu button style void setButtonStyle(FXuint style); /// Get menu button style FXuint getButtonStyle() const; /// Change popup style void setPopupStyle(FXuint style); /// Get popup style FXuint getPopupStyle() const; /// Change attachment void setAttachment(FXuint att); /// Get attachment FXuint getAttachment() const; /// Save menu button to a stream virtual void save(FXStream& store) const; /// Load menu button from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXMenuButton(); }; } #endif fox1.6-1.6.57/include/FXMenuCaption.h000066400000000000000000000133621326741342000171160ustar00rootroot00000000000000/******************************************************************************** * * * M e n u C a p t i o n W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuCaption.h,v 1.33 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMENUCAPTION_H #define FXMENUCAPTION_H #ifndef FXWINDOW_H #include "FXWindow.h" #endif namespace FX { /// Menu Caption options enum { MENU_AUTOGRAY = 0x00008000, /// Automatically gray out when not updated MENU_AUTOHIDE = 0x00010000 /// Automatically hide button when not updated }; class FXIcon; class FXFont; /** * The menu caption is a widget which can be used as a caption * above a number of menu commands in a menu. */ class FXAPI FXMenuCaption : public FXWindow { FXDECLARE(FXMenuCaption) protected: FXString label; FXString help; FXString tip; FXIcon *icon; FXFont *font; FXint hotoff; FXHotKey hotkey; FXColor textColor; FXColor selbackColor; FXColor seltextColor; FXColor hiliteColor; FXColor shadowColor; protected: FXMenuCaption(); private: FXMenuCaption(const FXMenuCaption&); FXMenuCaption &operator=(const FXMenuCaption&); public: long onPaint(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdSetIconValue(FXObject*,FXSelector,void*); long onCmdGetIconValue(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: /// Construct a menu caption FXMenuCaption(FXComposite* p,const FXString& text,FXIcon* ic=NULL,FXuint opts=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Enable the menu virtual void enable(); /// Disable the menu virtual void disable(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Set the text for this menu void setText(const FXString& text); /// Get the text for this menu FXString getText() const { return label; } /// Set the icon for this menu void setIcon(FXIcon* ic); /// Get the icon for this menu FXIcon* getIcon() const { return icon; } /// Set the text font void setFont(FXFont* fnt); /// Return the text font FXFont* getFont() const { return font; } /// Set menu caption style void setMenuStyle(FXuint style); /// Get menu caption style FXuint getMenuStyle() const; /// Return the current text color void setTextColor(FXColor clr); /// Get the current text color FXColor getTextColor() const { return textColor; } /// Return the selection background color void setSelBackColor(FXColor clr); /// Return the selection background color FXColor getSelBackColor() const { return selbackColor; } /// Return the selection text color void setSelTextColor(FXColor clr); /// Return the selection text color FXColor getSelTextColor() const { return seltextColor; } /// Change highlight color void setHiliteColor(FXColor clr); /// Get highlight color FXColor getHiliteColor() const { return hiliteColor; } /// Change shadow color void setShadowColor(FXColor clr); /// Get shadow color FXColor getShadowColor() const { return shadowColor; } /// Set the status line help text for this menu void setHelpText(const FXString& text); /// Get the status line help text for this menu const FXString& getHelpText() const { return help; } /// Set the tool tip message for this menu void setTipText(const FXString& text){ tip=text; } /// Get the tool tip message for this menu const FXString& getTipText() const { return tip; } /// Save menu to a stream virtual void save(FXStream& store) const; /// Load menu from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXMenuCaption(); }; } #endif fox1.6-1.6.57/include/FXMenuCascade.h000066400000000000000000000077501326741342000170500ustar00rootroot00000000000000/******************************************************************************** * * * M e n u C a s c a d e W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuCascade.h,v 1.24 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMENUCASCADE_H #define FXMENUCASCADE_H #ifndef FXMENUCAPTION_H #include "FXMenuCaption.h" #endif namespace FX { class FXPopup; /** * The cascade menu widget is used to bring up a sub menu from a * pull down menu. */ class FXAPI FXMenuCascade : public FXMenuCaption { FXDECLARE(FXMenuCascade) protected: FXPopup *pane; protected: FXMenuCascade(); void drawTriangle(FXDCWindow& dc,FXint l,FXint t,FXint r,FXint b); private: FXMenuCascade(const FXMenuCascade&); FXMenuCascade &operator=(const FXMenuCascade&); public: long onPaint(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onButtonPress(FXObject*,FXSelector,void*); long onButtonRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onCmdPost(FXObject*,FXSelector,void*); long onCmdUnpost(FXObject*,FXSelector,void*); public: enum { ID_MENUTIMER=FXMenuCaption::ID_LAST, ID_LAST }; public: /// Construct a menu cascade responsible for the given popup menu FXMenuCascade(FXComposite* p,const FXString& text,FXIcon* ic=NULL,FXPopup* pup=NULL,FXuint opts=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Yes it can receive the focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Set popup menu to pop up void setMenu(FXPopup *pup){ pane = pup; } /// Return popup menu FXPopup* getMenu() const { return pane; } /// True if this menu or is popup logically contains the mouse virtual bool contains(FXint parentx,FXint parenty) const; /// Save menu to a stream virtual void save(FXStream& store) const; /// Load menu from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXMenuCascade(); }; } #endif fox1.6-1.6.57/include/FXMenuCheck.h000066400000000000000000000077311326741342000165410ustar00rootroot00000000000000/******************************************************************************** * * * M e n u C h e c k W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuCheck.h,v 1.13 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMENUCHECK_H #define FXMENUCHECK_H #ifndef FXMENUCOMMAND_H #include "FXMenuCommand.h" #endif namespace FX { /** * The menu check widget is used to change a state in the * application from a menu. Menu checks may reflect * the state of the application by graying out, becoming hidden, * or by a check mark. * When activated, a menu check sends a SEL_COMMAND to its target; * the void* argument of the message contains the new state. */ class FXAPI FXMenuCheck : public FXMenuCommand { FXDECLARE(FXMenuCheck) protected: FXuchar check; // State of menu FXColor boxColor; // Box color protected: FXMenuCheck(); private: FXMenuCheck(const FXMenuCheck&); FXMenuCheck &operator=(const FXMenuCheck&); public: long onPaint(FXObject*,FXSelector,void*); long onButtonPress(FXObject*,FXSelector,void*); long onButtonRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onCheck(FXObject*,FXSelector,void*); long onUncheck(FXObject*,FXSelector,void*); long onUnknown(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdAccel(FXObject*,FXSelector,void*); public: /// Construct a menu check FXMenuCheck(FXComposite* p,const FXString& text,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Set check state (TRUE, FALSE or MAYBE) void setCheck(FXbool s=TRUE); /// Get check state (TRUE, FALSE or MAYBE) FXbool getCheck() const { return check; } /// Get the box background color FXColor getBoxColor() const { return boxColor; } /// Set the box background color void setBoxColor(FXColor clr); /// Save menu to a stream virtual void save(FXStream& store) const; /// Load menu from a stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXMenuCommand.h000066400000000000000000000075131326741342000171000ustar00rootroot00000000000000/******************************************************************************** * * * M e n u C o m m a n d W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuCommand.h,v 1.30 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMENUCOMMAND_H #define FXMENUCOMMAND_H #ifndef FXMENUCAPTION_H #include "FXMenuCaption.h" #endif namespace FX { /** * The menu command widget is used to invoke a command in the * application from a menu. Menu commands may reflect * the state of the application by graying out, or becoming hidden. * When activated, a menu command sends a SEL_COMMAND to its target. */ class FXAPI FXMenuCommand : public FXMenuCaption { FXDECLARE(FXMenuCommand) protected: FXString accel; // Accelerator string FXHotKey acckey; // Accelerator key protected: FXMenuCommand(); private: FXMenuCommand(const FXMenuCommand&); FXMenuCommand &operator=(const FXMenuCommand&); public: long onPaint(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onButtonPress(FXObject*,FXSelector,void*); long onButtonRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onCmdAccel(FXObject*,FXSelector,void*); public: /// Construct a menu command FXMenuCommand(FXComposite* p,const FXString& text,FXIcon* ic=NULL,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Yes it can receive the focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Set accelerator text void setAccelText(const FXString& text); /// Return accelarator text FXString getAccelText() const { return accel; } /// Save menu to a stream virtual void save(FXStream& store) const; /// Load menu from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXMenuCommand(); }; } #endif fox1.6-1.6.57/include/FXMenuPane.h000066400000000000000000000045341326741342000164050ustar00rootroot00000000000000/******************************************************************************** * * * M e n u P a n e W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuPane.h,v 1.16 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMENUPANE_H #define FXMENUPANE_H #ifndef FXPOPUP_H #include "FXPopup.h" #endif namespace FX { /// Popup menu pane class FXAPI FXMenuPane : public FXPopup { FXDECLARE(FXMenuPane) protected: FXMenuPane(){} private: FXMenuPane(const FXMenuPane&); FXMenuPane &operator=(const FXMenuPane&); public: /// Construct menu pane FXMenuPane(FXWindow* owner,FXuint opts=0); /// Return true if popup contains this point virtual bool contains(FXint parentx,FXint parenty) const; }; } #endif fox1.6-1.6.57/include/FXMenuRadio.h000066400000000000000000000102441326741342000165530ustar00rootroot00000000000000/******************************************************************************** * * * M e n u R a d i o W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuRadio.h,v 1.13 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMENURADIO_H #define FXMENURADIO_H #ifndef FXMENUCOMMAND_H #include "FXMenuCommand.h" #endif namespace FX { /** * The menu radio widget is used to invoke a command in the * application from a menu. Menu commands may reflect * the state of the application by graying out, becoming hidden, * or by a bullit. * When activated, a menu radio sends a SEL_COMMAND to its target; * the void* argument of the message contains the new state. * A collection of menu radio widgets which belong to each other * is supposed to be updated by a common SEL_UPDATE handler to * properly maintain the state between them. */ class FXAPI FXMenuRadio : public FXMenuCommand { FXDECLARE(FXMenuRadio) protected: FXuchar check; // State of menu FXColor radioColor; // Color of the radio protected: FXMenuRadio(); private: FXMenuRadio(const FXMenuRadio&); FXMenuRadio &operator=(const FXMenuRadio&); public: long onPaint(FXObject*,FXSelector,void*); long onButtonPress(FXObject*,FXSelector,void*); long onButtonRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onCheck(FXObject*,FXSelector,void*); long onUncheck(FXObject*,FXSelector,void*); long onUnknown(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdAccel(FXObject*,FXSelector,void*); public: /// Construct a menu radio FXMenuRadio(FXComposite* p,const FXString& text,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Set radio button state (TRUE, FALSE or MAYBE) void setCheck(FXbool s=TRUE); /// Get radio button state (TRUE, FALSE or MAYBE) FXbool getCheck() const { return check; } /// Get the radio background color FXColor getRadioColor() const { return radioColor; } /// Set the radio background color void setRadioColor(FXColor clr); /// Save menu to a stream virtual void save(FXStream& store) const; /// Load menu from a stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXMenuSeparator.h000066400000000000000000000060351326741342000174600ustar00rootroot00000000000000/******************************************************************************** * * * M e n u S e p a r a t o r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuSeparator.h,v 1.17 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMENUSEPARATOR_H #define FXMENUSEPARATOR_H #ifndef FXWINDOW_H #include "FXWindow.h" #endif namespace FX { /** * The menu separator is a simple decorative groove * used to delineate items in a popup menu. */ class FXAPI FXMenuSeparator : public FXWindow { FXDECLARE(FXMenuSeparator) protected: FXColor hiliteColor; FXColor shadowColor; protected: FXMenuSeparator(); private: FXMenuSeparator(const FXMenuSeparator&); FXMenuSeparator &operator=(const FXMenuSeparator&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Construct a menu separator FXMenuSeparator(FXComposite* p,FXuint opts=0); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Change highlight color void setHiliteColor(FXColor clr); /// Get highlight color FXColor getHiliteColor() const { return hiliteColor; } /// Change shadow color void setShadowColor(FXColor clr); /// Get shadow color FXColor getShadowColor() const { return shadowColor; } /// Save menu to a stream virtual void save(FXStream& store) const; /// Load menu from a stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXMenuTitle.h000066400000000000000000000100461326741342000165760ustar00rootroot00000000000000/******************************************************************************** * * * M e n u T i t l e W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuTitle.h,v 1.22 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMENUTITLE_H #define FXMENUTITLE_H #ifndef FXMENUCAPTION_H #include "FXMenuCaption.h" #endif namespace FX { class FXPopup; /** * A menu title is a child of a menu bar which is responsible * for popping up a pulldown menu. */ class FXAPI FXMenuTitle : public FXMenuCaption { FXDECLARE(FXMenuTitle) protected: FXPopup *pane; // Pane to pop up protected: FXMenuTitle(){} private: FXMenuTitle(const FXMenuTitle&); FXMenuTitle &operator=(const FXMenuTitle&); public: long onPaint(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onCmdPost(FXObject*,FXSelector,void*); long onCmdUnpost(FXObject*,FXSelector,void*); public: /// Constructor FXMenuTitle(FXComposite* p,const FXString& text,FXIcon* ic=NULL,FXPopup* pup=NULL,FXuint opts=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Yes it can receive the focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Set popup menu to pop up void setMenu(FXPopup *menu); /// Return popup menu FXPopup* getMenu() const { return pane; } /// True if this menu or is popup logically contains the mouse virtual bool contains(FXint parentx,FXint parenty) const; /// Save menu to a stream virtual void save(FXStream& store) const; /// Load menu from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXMenuTitle(); }; } #endif fox1.6-1.6.57/include/FXMessageBox.h000066400000000000000000000144611326741342000167320ustar00rootroot00000000000000/******************************************************************************** * * * M e s s a g e B o x e s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMessageBox.h,v 1.28 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXMESSAGEBOX_H #define FXMESSAGEBOX_H #ifndef FXDIALOGBOX_H #include "FXDialogBox.h" #endif namespace FX { // Message box buttons enum { MBOX_OK = 0x10000000, /// Message box has a only an OK button MBOX_OK_CANCEL = 0x20000000, /// Message box has OK and CANCEL buttons MBOX_YES_NO = 0x30000000, /// Message box has YES and NO buttons MBOX_YES_NO_CANCEL = 0x40000000, /// Message box has YES, NO, and CANCEL buttons MBOX_QUIT_CANCEL = 0x50000000, /// Message box has QUIT and CANCEL buttons MBOX_QUIT_SAVE_CANCEL = 0x60000000, /// Message box has QUIT, SAVE, and CANCEL buttons MBOX_SKIP_SKIPALL_CANCEL = 0x70000000, /// Message box has SKIP, SKIP ALL, and CANCEL buttons MBOX_SAVE_CANCEL_DONTSAVE = 0x80000000 /// Message box has DON'T SAVE,CANCEL and SAVE buttons }; // Return values enum { MBOX_CLICKED_YES = 1, /// The YES button was clicked MBOX_CLICKED_NO = 2, /// The NO button was clicked MBOX_CLICKED_OK = 3, /// The OK button was clicked MBOX_CLICKED_CANCEL = 4, /// The CANCEL button was clicked MBOX_CLICKED_QUIT = 5, /// The QUIT button was clicked MBOX_CLICKED_SAVE = 6, /// The SAVE button was clicked MBOX_CLICKED_SKIP = 7, /// The SKIP button was clicked MBOX_CLICKED_SKIPALL = 8 /// The SKIP ALL button was clicked }; /** * A Message Box is a convenience class which provides a dialog for * very simple common yes/no type interactions with the user. * The message box has an optional icon, a title string, and the question * which is presented to the user. It also has up to three buttons which * furnish standard responses to the question. * Message boxes are usually ran modally: the question must be answered * before the program may continue. */ class FXAPI FXMessageBox : public FXDialogBox { FXDECLARE(FXMessageBox) protected: FXMessageBox(){} private: FXMessageBox(const FXMessageBox&); FXMessageBox &operator=(const FXMessageBox&); void initialize(const FXString& text,FXIcon* ic,FXuint whichbuttons); public: long onCmdClicked(FXObject*,FXSelector,void*); long onCmdCancel(FXObject*,FXSelector,void*); public: enum{ ID_CLICKED_YES=FXDialogBox::ID_LAST, ID_CLICKED_NO, ID_CLICKED_OK, ID_CLICKED_CANCEL, ID_CLICKED_QUIT, ID_CLICKED_SAVE, ID_CLICKED_SKIP, ID_CLICKED_SKIPALL, ID_LAST }; public: /// Construct message box with given caption, icon, and message text FXMessageBox(FXWindow* owner,const FXString& caption,const FXString& text,FXIcon* ic=NULL,FXuint opts=0,FXint x=0,FXint y=0); /// Construct free floating message box with given caption, icon, and message text FXMessageBox(FXApp* app,const FXString& caption,const FXString& text,FXIcon* ic=NULL,FXuint opts=0,FXint x=0,FXint y=0); /** * Show a modal error message. * The text message may contain printf-tyle formatting commands. */ static FXuint error(FXWindow* owner,FXuint opts,const char* caption,const char* message,...) FX_PRINTF(4,5) ; /** * Show modal error message, in free floating window. */ static FXuint error(FXApp* app,FXuint opts,const char* caption,const char* message,...) FX_PRINTF(4,5) ; /** * Show a modal warning message * The text message may contain printf-tyle formatting commands. */ static FXuint warning(FXWindow* owner,FXuint opts,const char* caption,const char* message,...) FX_PRINTF(4,5) ; /** * Show modal warning message, in free floating window. */ static FXuint warning(FXApp* app,FXuint opts,const char* caption,const char* message,...) FX_PRINTF(4,5) ; /** * Show a modal question dialog * The text message may contain printf-tyle formatting commands. */ static FXuint question(FXWindow* owner,FXuint opts,const char* caption,const char* message,...) FX_PRINTF(4,5) ; /** * Show modal question message, in free floating window. */ static FXuint question(FXApp* app,FXuint opts,const char* caption,const char* message,...) FX_PRINTF(4,5) ; /** * Show a modal information dialog * The text message may contain printf-tyle formatting commands. */ static FXuint information(FXWindow* owner,FXuint opts,const char* caption,const char* message,...) FX_PRINTF(4,5) ; /** * Show modal information message, in free floating window. */ static FXuint information(FXApp* app,FXuint opts,const char* caption,const char* message,...) FX_PRINTF(4,5) ; }; } #endif fox1.6-1.6.57/include/FXObject.h000066400000000000000000000166221326741342000161040ustar00rootroot00000000000000/******************************************************************************** * * * T o p l e v el O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXObject.h,v 1.35.2.1 2006/08/05 00:58:29 fox Exp $ * ********************************************************************************/ #ifndef FXOBJECT_H #define FXOBJECT_H namespace FX { /// Minimum and maximum message id enum { MINKEY = 0, MAXKEY = 65535 }; /// Minimum and maximum message type enum { MINTYPE = 0, MAXTYPE = 65535 }; /// Association key typedef FXuint FXSelector; class FXObject; /// Describes a FOX object class FXAPI FXMetaClass { private: const FXchar *className; FXObject* (*manufacture)(); const FXMetaClass *baseClass; const void *assoc; FXuint nassocs; FXuint assocsz; private: static const FXMetaClass **metaClassTable; static FXuint nmetaClassTable; static FXuint nmetaClasses; private: static void resize(FXuint n); public: FXMetaClass(const FXchar* name,FXObject *(fac)(),const FXMetaClass* base,const void* ass,FXuint nass,FXuint assz); /// Check if metaclass is subclass of some other metaclass bool isSubClassOf(const FXMetaClass* metaclass) const; /// Make instance of some object FXObject* makeInstance() const; /// Ask class name const FXchar* getClassName() const { return className; } /// Ask base class const FXMetaClass* getBaseClass() const { return baseClass; } /// Find metaclass object static const FXMetaClass* getMetaClassFromName(const FXchar* name); /// Search message map const void* search(FXSelector key) const; ~FXMetaClass(); }; /// Macro to set up class declaration #define FXDECLARE(classname) \ public: \ struct FXMapEntry { FX::FXSelector keylo; FX::FXSelector keyhi; long (classname::* func)(FX::FXObject*,FX::FXSelector,void*); }; \ static const FX::FXMetaClass metaClass; \ static FX::FXObject* manufacture(); \ virtual long handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr); \ virtual const FX::FXMetaClass* getMetaClass() const { return &metaClass; } \ friend FX::FXStream& operator<<(FX::FXStream& store,const classname* obj){return store.saveObject((FX::FXObjectPtr)(obj));} \ friend FX::FXStream& operator>>(FX::FXStream& store,classname*& obj){return store.loadObject((FX::FXObjectPtr&)(obj));} \ private: /// Macro to set up class implementation #define FXIMPLEMENT(classname,baseclassname,mapping,nmappings) \ FX::FXObject* classname::manufacture(){return new classname;} \ const FX::FXMetaClass classname::metaClass(#classname,classname::manufacture,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry)); \ long classname::handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr){ \ const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \ return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \ } /// Macro to set up abstract class declaration #define FXDECLARE_ABSTRACT(classname) \ public: \ struct FXMapEntry { FX::FXSelector keylo; FX::FXSelector keyhi; long (classname::* func)(FX::FXObject*,FX::FXSelector,void*); }; \ static const FX::FXMetaClass metaClass; \ virtual long handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr); \ virtual const FX::FXMetaClass* getMetaClass() const { return &metaClass; } \ friend FX::FXStream& operator<<(FX::FXStream& store,const classname* obj){return store.saveObject((FX::FXObjectPtr)(obj));} \ friend FX::FXStream& operator>>(FX::FXStream& store,classname*& obj){return store.loadObject((FX::FXObjectPtr&)(obj));} \ private: /// Macro to set up abstract class implementation #define FXIMPLEMENT_ABSTRACT(classname,baseclassname,mapping,nmappings) \ const FX::FXMetaClass classname::metaClass(#classname,NULL,&baseclassname::metaClass,mapping,nmappings,sizeof(classname::FXMapEntry)); \ long classname::handle(FX::FXObject* sender,FX::FXSelector sel,void* ptr){ \ const FXMapEntry* me=(const FXMapEntry*)metaClass.search(sel); \ return me ? (this->* me->func)(sender,sel,ptr) : baseclassname::handle(sender,sel,ptr); \ } /// MetaClass of a class #define FXMETACLASS(classname) (&classname::metaClass) /// Set up map type #define FXDEFMAP(classname) static const classname::FXMapEntry /// Define range of function types #define FXMAPTYPES(typelo,typehi,func) {FXSEL(typelo,FX::MINKEY),FXSEL(typehi,FX::MAXKEY),&func} /// Define range of function types #define FXMAPTYPE(type,func) {FXSEL(type,FX::MINKEY),FXSEL(type,FX::MAXKEY),&func} /// Define range of functions #define FXMAPFUNCS(type,keylo,keyhi,func) {FXSEL(type,keylo),FXSEL(type,keyhi),&func} /// Define one function #define FXMAPFUNC(type,key,func) {FXSEL(type,key),FXSEL(type,key),&func} /** * Object is the base class for all objects in FOX; in order to receive * messages from the user interface, your class must derive from Object. * The Object class also provides serialization facilities, with which * you can save and restore the object's state. If you've subclassed * from Object, you can save your subclasses' state by overloading the * save() and load() functions and use the stream API to serialize its * member data. */ class FXAPI FXObject { FXDECLARE(FXObject) public: /// Called for unhandled messages virtual long onDefault(FXObject*,FXSelector,void*); public: /// Get class name of some object const FXchar* getClassName() const; /// Check if object is member of metaclass bool isMemberOf(const FXMetaClass* metaclass) const; /// Try handle message safely virtual long tryHandle(FXObject* sender,FXSelector sel,void* ptr); /// Save object to stream virtual void save(FXStream& store) const; /// Load object from stream virtual void load(FXStream& store); /// Virtual destructor virtual ~FXObject(); }; } #endif fox1.6-1.6.57/include/FXObjectList.h000066400000000000000000000124631326741342000167370ustar00rootroot00000000000000/******************************************************************************** * * * O b j e c t L i s t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXObjectList.h,v 1.31.2.1 2007/01/29 20:22:29 fox Exp $ * ********************************************************************************/ #ifndef FXOBJECTLIST_H #define FXOBJECTLIST_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { /// List of pointers to objects class FXAPI FXObjectList { protected: FXObject **ptr; public: /// Default constructor FXObjectList(); /// Copy constructor FXObjectList(const FXObjectList& orig); /// Construct and init with single object FXObjectList(FXObject* object); /// Construct and init with list of objects FXObjectList(FXObject** objects,FXint n); /// Assignment operator FXObjectList& operator=(const FXObjectList& orig); /// Return number of objects FXint no() const { return *((FXint*)(ptr-1)); } /// Set number of objects void no(FXint num); /// Indexing operator FXObject*& operator[](FXint i){ return ptr[i]; } FXObject* const& operator[](FXint i) const { return ptr[i]; } /// Indexing operator FXObject*& at(FXint i){ return ptr[i]; } FXObject* const& at(FXint i) const { return ptr[i]; } /// Access to content array FXObject** data() const { return ptr; } /// Assign object p to list FXObjectList& assign(FXObject* object); /// Assign n objects to list FXObjectList& assign(FXObject** objects,FXint n); /// Assign objects to list FXObjectList& assign(FXObjectList& objects); /// Insert object at certain position FXObjectList& insert(FXint pos,FXObject* object); /// Insert n objects at specified position FXObjectList& insert(FXint pos,FXObject** objects,FXint n); /// Insert objects at specified position FXObjectList& insert(FXint pos,FXObjectList& objects); /// Prepend object FXObjectList& prepend(FXObject* object); /// Prepend n objects FXObjectList& prepend(FXObject** objects,FXint n); /// Prepend objects FXObjectList& prepend(FXObjectList& objects); /// Append object FXObjectList& append(FXObject* object); /// Append n objects FXObjectList& append(FXObject** objects,FXint n); /// Append objects FXObjectList& append(FXObjectList& objects); /// Replace object at position by given object FXObjectList& replace(FXint pos,FXObject* object); /// Replaces the m objects at pos with n objects FXObjectList& replace(FXint pos,FXint m,FXObject** objects,FXint n); /// Replace the m objects at pos with objects FXObjectList& replace(FXint pos,FXint m,FXObjectList& objects); /// Remove object at pos FXObjectList& erase(FXint pos); /// Remove n objects at pos FXObjectList& erase(FXint pos,FXint n); /// Remove object FXObjectList& remove(const FXObject* object); /// Find object in list, searching forward; return position or -1 FXint find(const FXObject *object,FXint pos=0) const; /// Find object in list, searching backward; return position or -1 FXint rfind(const FXObject *object,FXint pos=2147483647) const; /// Remove all objects FXObjectList& clear(); /// Save to a stream void save(FXStream& store) const; /// Load from a stream void load(FXStream& store); /// Destructor virtual ~FXObjectList(); }; /// Specialize list to pointers to TYPE template class FXObjectListOf : public FXObjectList { public: FXObjectListOf(){} /// Indexing operator TYPE*& operator[](FXint i){ return (TYPE*&)ptr[i]; } TYPE *const& operator[](FXint i) const { return (TYPE*const&)ptr[i]; } /// Access to list TYPE*& at(FXint i){ return (TYPE*&)ptr[i]; } TYPE *const& at(FXint i) const { return (TYPE*const&)ptr[i]; } /// Access to content array TYPE** data() const { return (TYPE**)ptr; } }; } #endif fox1.6-1.6.57/include/FXOptionMenu.h000066400000000000000000000145521326741342000167730ustar00rootroot00000000000000/******************************************************************************** * * * O p t i o n M e n u * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXOptionMenu.h,v 1.28 2006/02/06 02:03:38 fox Exp $ * ********************************************************************************/ #ifndef FXOPTIONMENU_H #define FXOPTIONMENU_H #ifndef FXLABEL_H #include "FXLabel.h" #endif namespace FX { class FXPopup; /// Option Menu Button class FXAPI FXOption : public FXLabel { FXDECLARE(FXOption) protected: FXColor selbackColor; FXColor seltextColor; protected: FXOption(); private: FXOption(const FXOption&); FXOption &operator=(const FXOption&); public: long onPaint(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); public: /// Constructor FXOption(FXComposite* p,const FXString& text,FXIcon* ic=NULL,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=JUSTIFY_NORMAL|ICON_BEFORE_TEXT,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Returns true because a menu button can receive focus virtual bool canFocus() const; /// Set focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Return the selection background color void setSelBackColor(FXColor clr); /// Return the selection background color FXColor getSelBackColor() const { return selbackColor; } /// Return the selection text color void setSelTextColor(FXColor clr); /// Return the selection text color FXColor getSelTextColor() const { return seltextColor; } /// Destructor virtual ~FXOption(); }; /// Option Menu class FXAPI FXOptionMenu : public FXLabel { FXDECLARE(FXOptionMenu) protected: FXPopup *pane; FXOption *current; protected: FXOptionMenu(){} private: FXOptionMenu(const FXOptionMenu&); FXOptionMenu &operator=(const FXOptionMenu&); public: long onPaint(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onCmdPost(FXObject*,FXSelector,void*); long onCmdUnpost(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); public: /// Constructor FXOptionMenu(FXComposite* p,FXPopup* pup=NULL,FXuint opts=JUSTIFY_NORMAL|ICON_BEFORE_TEXT,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Delete server-side resources virtual void destroy(); /// Perform layout virtual void layout(); /// Remove the focus from this window virtual void killFocus(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Return TRUE if the position is logically in the pane virtual bool contains(FXint parentx,FXint parenty) const; /// Set the current option void setCurrent(FXOption *win,FXbool notify=FALSE); /// Return the current option FXOption* getCurrent() const { return current; } /// Set the current option number void setCurrentNo(FXint no,FXbool notify=FALSE); /// Get the current option number FXint getCurrentNo() const; /// Get number of options FXint getNumOptions() const; /// Set the pane which will be popped up void setMenu(FXPopup *pup); /// Return the pane which is poppup up FXPopup* getMenu() const { return pane; } /// Returns true because a option menu can receive focus virtual bool canFocus() const; /// Return TRUE if popped up FXbool isPopped() const; /// Save option menu to a stream virtual void save(FXStream& store) const; /// Load option menu from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXOptionMenu(); }; } #endif fox1.6-1.6.57/include/FXPCXIcon.h000066400000000000000000000062161326741342000161370ustar00rootroot00000000000000/******************************************************************************** * * * P C X I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Janusz Ganczarski. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPCXIcon.h,v 1.18 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXPCXICON_H #define FXPCXICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// PCX icon class FXAPI FXPCXIcon : public FXIcon { FXDECLARE(FXPCXIcon) protected: FXPCXIcon(){} private: FXPCXIcon(const FXPCXIcon&); FXPCXIcon &operator=(const FXPCXIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct icon from memory stream formatted in PCX file format FXPCXIcon(FXApp* a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in PCX file format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in PCX file format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXPCXIcon(); }; /** * Check if stream contains a PCX, return TRUE if so. */ extern FXAPI bool fxcheckPCX(FXStream& store); /** * Load an PCX (PC Paintbrush) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadPCX(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an PCX (PC Paintbrush) file to a stream. */ extern FXAPI bool fxsavePCX(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXPCXImage.h000066400000000000000000000061711326741342000162710ustar00rootroot00000000000000/******************************************************************************** * * * P C X I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Janusz Ganczarski. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPCXImage.h,v 1.18 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXPCXIMAGE_H #define FXPCXIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// PCX graphics file class FXAPI FXPCXImage : public FXImage { FXDECLARE(FXPCXImage) protected: FXPCXImage(){} private: FXPCXImage(const FXPCXImage&); FXPCXImage &operator=(const FXPCXImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct image from memory stream formatted in PCX file FXPCXImage(FXApp* a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in PCX file virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in bitmap format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXPCXImage(); }; /** * Check if stream contains a PCX, return TRUE if so. */ extern FXAPI bool fxcheckPCX(FXStream& store); /** * Load an PCX (PC Paintbrush) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadPCX(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an PCX (PC Paintbrush) file to a stream. */ extern FXAPI bool fxsavePCX(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXPNGIcon.h000066400000000000000000000063721326741342000161340ustar00rootroot00000000000000/******************************************************************************** * * * P N G I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPNGIcon.h,v 1.22 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXPNGICON_H #define FXPNGICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// Portable Network Graphics (PNG) Icon class class FXAPI FXPNGIcon : public FXIcon { FXDECLARE(FXPNGIcon) protected: FXPNGIcon(){} private: FXPNGIcon(const FXPNGIcon&); FXPNGIcon &operator=(const FXPNGIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct an icon from memory stream formatted in PNG format FXPNGIcon(FXApp *a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// True if format is supported static const bool supported; /// Save pixels into stream in PNG format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in PNG format virtual bool loadPixels(FXStream& store); /// Destroy virtual ~FXPNGIcon(); }; /** * Check if stream contains a PNG, return TRUE if so. */ extern FXAPI bool fxcheckPNG(FXStream& store); /** * Load an PNG (Portable Network Graphics) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadPNG(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an PNG (Portable Network Graphics) file to a stream. */ extern FXAPI bool fxsavePNG(FXStream& store,const FXColor* data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXPNGImage.h000066400000000000000000000063531326741342000162650ustar00rootroot00000000000000/******************************************************************************** * * * P N G I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPNGImage.h,v 1.22 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXPNGIMAGE_H #define FXPNGIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// Portable Network Graphics (PNG) Image class class FXAPI FXPNGImage : public FXImage { FXDECLARE(FXPNGImage) protected: FXPNGImage(){} private: FXPNGImage(const FXPNGImage&); FXPNGImage &operator=(const FXPNGImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct an image from memory stream formatted in PNG format FXPNGImage(FXApp *a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// True if format is supported static const bool supported; /// Save pixels into stream in PNG format virtual bool loadPixels(FXStream& store); /// Load pixels from stream in PNG format virtual bool savePixels(FXStream& store) const; /// Destroy virtual ~FXPNGImage(); }; /** * Check if stream contains a PNG, return TRUE if so. */ extern FXAPI bool fxcheckPNG(FXStream& store); /** * Load an PNG (Portable Network Graphics) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadPNG(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an PNG (Portable Network Graphics) file to a stream. */ extern FXAPI bool fxsavePNG(FXStream& store,const FXColor* data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXPPMIcon.h000066400000000000000000000063021326741342000161350ustar00rootroot00000000000000/******************************************************************************** * * * P P M I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPPMIcon.h,v 1.9 2006/01/22 17:58:06 fox Exp $ * ********************************************************************************/ #ifndef FXPPMICON_H #define FXPPMICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// Portable Pixmap icon class FXAPI FXPPMIcon : public FXIcon { FXDECLARE(FXPPMIcon) protected: FXPPMIcon(){} private: FXPPMIcon(const FXPPMIcon&); FXPPMIcon &operator=(const FXPPMIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct icon from memory stream formatted in Portable Pixmap format FXPPMIcon(FXApp* a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in Portable Pixmap format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in Portable Pixmap format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXPPMIcon(); }; /** * Check if stream contains a PPM, return TRUE if so. */ extern FXAPI bool fxcheckPPM(FXStream& store); /** * Load an PPM (Portable Pixmap Format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadPPM(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an PPM (Portable Pixmap Format) file to a stream. */ extern FXAPI bool fxsavePPM(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXPPMImage.h000066400000000000000000000062631326741342000162750ustar00rootroot00000000000000/******************************************************************************** * * * P P M I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPPMImage.h,v 1.10 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXPPMIMAGE_H #define FXPPMIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// Portable Pixmap Image class FXAPI FXPPMImage : public FXImage { FXDECLARE(FXPPMImage) protected: FXPPMImage(){} private: FXPPMImage(const FXPPMImage&); FXPPMImage &operator=(const FXPPMImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct icon from memory stream formatted in Portable Pixmap format FXPPMImage(FXApp* a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in Portable Pixmap format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in Portable Pixmap format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXPPMImage(); }; /** * Check if stream contains a PPM, return TRUE if so. */ extern FXAPI bool fxcheckPPM(FXStream& store); /** * Load an PPM (Portable Pixmap Format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadPPM(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an PPM (Portable Pixmap Format) file to a stream. */ extern FXAPI bool fxsavePPM(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXPacker.h000066400000000000000000000152331326741342000161000ustar00rootroot00000000000000/******************************************************************************** * * * P a c k e r C o n t a i n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPacker.h,v 1.21 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXPACKER_H #define FXPACKER_H #ifndef FXCOMPOSITE_H #include "FXComposite.h" #endif namespace FX { /// Default spacing enum { DEFAULT_SPACING = 4 }; /** * Packer is a layout manager which automatically places child windows * inside its area against the left, right, top, or bottom side. * Each time a child is placed, the remaining space is decreased by the * amount of space taken by the child window. * The side against which a child is placed is determined by the LAYOUT_SIDE_TOP, * LAYOUT_SIDE_BOTTOM, LAYOUT_SIDE_LEFT, and LAYOUT_SIDE_RIGHT hints given by * the child window. Other layout hints from the child are observed as far as * sensible. So for example, a child placed against the right edge can still * have LAYOUT_FILL_Y or LAYOUT_TOP, and so on. * The last child may have both LAYOUT_FILL_X and LAYOUT_FILL_Y, in which * case it will be placed to take all remaining space. */ class FXAPI FXPacker : public FXComposite { FXDECLARE(FXPacker) protected: FXColor baseColor; // Base color FXColor hiliteColor; // Highlight color FXColor shadowColor; // Shadow color FXColor borderColor; // Border color FXint padtop; // Top margin FXint padbottom; // Bottom margin FXint padleft; // Left margin FXint padright; // Right margin FXint hspacing; // Horizontal child spacing FXint vspacing; // Vertical child spacing FXint border; // Border width protected: FXPacker(); void drawBorderRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawRidgeRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawGrooveRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawDoubleRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawDoubleSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawFocusRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawFrame(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); private: FXPacker(const FXPacker&); FXPacker &operator=(const FXPacker&); public: long onPaint(FXObject*,FXSelector,void*); long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusLeft(FXObject*,FXSelector,void*); long onFocusRight(FXObject*,FXSelector,void*); public: /// Construct packer layout manager FXPacker(FXComposite *p,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_SPACING,FXint pr=DEFAULT_SPACING,FXint pt=DEFAULT_SPACING,FXint pb=DEFAULT_SPACING,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /// Change frame style void setFrameStyle(FXuint style); /// Get current frame style FXuint getFrameStyle() const; /// Change packing hints void setPackingHints(FXuint ph); /// Return packing hints FXuint getPackingHints() const; /// Get border width FXint getBorderWidth() const { return border; } /// Change top padding void setPadTop(FXint pt); /// Get top interior padding FXint getPadTop() const { return padtop; } /// Change bottom padding void setPadBottom(FXint pb); /// Get bottom interior padding FXint getPadBottom() const { return padbottom; } /// Change left padding void setPadLeft(FXint pl); /// Get left interior padding FXint getPadLeft() const { return padleft; } /// Change right padding void setPadRight(FXint pr); /// Get right interior padding FXint getPadRight() const { return padright; } /// Change highlight color void setHiliteColor(FXColor clr); /// Get highlight color FXColor getHiliteColor() const { return hiliteColor; } /// Change shadow color void setShadowColor(FXColor clr); /// Get shadow color FXColor getShadowColor() const { return shadowColor; } /// Change border color void setBorderColor(FXColor clr); /// Get border color FXColor getBorderColor() const { return borderColor; } /// Change base gui color void setBaseColor(FXColor clr); /// Get base gui color FXColor getBaseColor() const { return baseColor; } /// Change horizontal inter-child spacing void setHSpacing(FXint hs); /// Return current horizontal inter-child spacing FXint getHSpacing() const { return hspacing; } /// Change vertical inter-child spacing void setVSpacing(FXint vs); /// Return current vertical inter-child spacing FXint getVSpacing() const { return vspacing; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXPath.h000066400000000000000000000147731326741342000155770ustar00rootroot00000000000000/******************************************************************************** * * * P a t h N a m e M a n i p u l a t i o n * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPath.h,v 1.11 2006/01/23 06:03:15 fox Exp $ * ********************************************************************************/ #ifndef FXPATH_H #define FXPATH_H namespace FX { namespace FXPath { /** * Return root of absolute path; on Unix, this is just "/". On * Windows, this is "\\" or "C:\". Returns the empty string * if the given path is not absolute. */ FXString FXAPI root(const FXString& file); /** * Return the directory part of the path name. * Note that directory("/bla/bla/") is "/bla/bla" and NOT "/bla". * However, directory("/bla/bla") is "/bla" as we expect! */ FXString FXAPI directory(const FXString& file); /** * Return name and extension part of the path name. * Note that name("/bla/bla/") is "" and NOT "bla". * However, name("/bla/bla") is "bla" as we expect! */ FXString FXAPI name(const FXString& file); /// Return file title, i.e. document name only FXString FXAPI title(const FXString& file); /// Return extension part of the file name FXString FXAPI extension(const FXString& file); /// Return file name less the extension FXString FXAPI stripExtension(const FXString& file); /// Return the drive letter prefixing this file name (if any). FXString FXAPI drive(const FXString& file); /// Perform tilde or environment variable expansion FXString FXAPI expand(const FXString& file); /// Contract path based on user name and environment variable FXString FXAPI contract(const FXString& file,const FXString& user=FXString::null,const FXString& var=FXString::null); /** * Simplify a file path; the path will remain relative if it was relative, * or absolute if it was absolute. Also, a trailing "/" will be preserved * as this is important in other functions. * For example, simplify("..//aaa/./bbb//../c/") becomes "../aaa/c/". */ FXString FXAPI simplify(const FXString& file); /// Return absolute path from current directory and file name FXString FXAPI absolute(const FXString& file); /// Return absolute path from base directory and file name FXString FXAPI absolute(const FXString& base,const FXString& file); /// Return relative path of file to the current directory FXString FXAPI relative(const FXString& file); /// Return relative path of file to given base directory FXString FXAPI relative(const FXString& base,const FXString& file); /// Return path following local path separator conventions FXString FXAPI convert(const FXString& path); /// Return path to directory above input directory name FXString FXAPI upLevel(const FXString& file); /// Return true if file name is absolute bool FXAPI isAbsolute(const FXString& file); /// Return true if input directory is a top-level directory bool FXAPI isTopDirectory(const FXString& file); /// Return true if input path is a file share bool FXAPI isShare(const FXString& file); /// Enquote filename to make safe for shell FXString FXAPI enquote(const FXString& file,bool forcequotes=false); /// Dequote filename to get original again FXString FXAPI dequote(const FXString& file); /** * Perform wildcard match of a filename against a wildcard pattern. * The wildcard pattern may comprise ordinary characters or special * matching characters, as given below: * * ? Any single character. * * Zero or more of any character. * [abc] Any character from the set {a,b,c}. * [^abc] Any character BUT the ones from the set {a,b,c}. * [!abc] Ditto. * [a-zA-Z] Matches single character, which must be one of a-z or A-Z. * [^a-zA-Z] Matches single character, which must be anything other than a-z or A-Z. * [!a-zA-Z] Ditto. * pat1|pat2 Match sub-pattern pat1 or pat2. * pat1,pat2 Ditto. * (pat1|pat2) Match sub-pattern pat1 or pat2; patterns may be nested. * (pat1,pat2) Ditto. * * The special characters may be escaped to treat them as ordinary characters. * Matching may be influenced by a number of flags: * * FILEMATCH_FILE_NAME No wildcard can ever match / * FILEMATCH_NOESCAPE Backslashes don't quote special chars * FILEMATCH_PERIOD Leading . is matched only explicitly * FILEMATCH_LEADING_DIR Ignore /... after a match * FILEMATCH_CASEFOLD Compare without regard to case */ bool FXAPI match(const FXString& pattern,const FXString& file,FXuint flags=(FILEMATCH_NOESCAPE|FILEMATCH_FILE_NAME)); /** * Generate unique filename of the form pathnameXXX.ext, where * pathname.ext is the original input file, and XXX is a number, * possibly empty, that makes the file unique. */ FXString FXAPI unique(const FXString& file); /** * Search path list for this file, return full path name for first occurrence. */ FXString FXAPI search(const FXString& pathlist,const FXString& file); } } #endif fox1.6-1.6.57/include/FXPicker.h000066400000000000000000000053151326741342000161100ustar00rootroot00000000000000/******************************************************************************** * * * P i c k e r B u t t o n * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPicker.h,v 1.10 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXPICKER_H #define FXPICKER_H #ifndef FXBUTTON_H #include "FXButton.h" #endif namespace FX { /** * A picker button allows you to identify an arbitrary * location on the screen. */ class FXAPI FXPicker : public FXButton { FXDECLARE(FXPicker) protected: FXPicker(){} private: FXPicker(const FXPicker&); FXPicker& operator=(const FXPicker&); public: long onMotion(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); public: FXPicker(FXComposite* p,const FXString& text,FXIcon* ic=NULL,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=BUTTON_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); }; } #endif fox1.6-1.6.57/include/FXPipe.h000066400000000000000000000055471326741342000155770ustar00rootroot00000000000000/******************************************************************************** * * * P i p e C l a s s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPipe.h,v 1.7.2.1 2007/08/02 21:31:17 fox Exp $ * ********************************************************************************/ #ifndef FXPIPE_H #define FXPIPE_H #ifndef FXIO_H #include "FXIO.h" #endif //////////////////////////// UNDER DEVELOPMENT //////////////////////////////// namespace FX { /** * Pipe i/o device. */ class FXAPI FXPipe : public FXIO { private: FXPipe(const FXPipe&); FXPipe &operator=(const FXPipe&); public: /// Construct socket FXPipe(){ } /// Construct file and attach existing handle h FXPipe(FXInputHandle handle,FXuint mode); /// Open device with access mode and handle virtual bool open(FXInputHandle handle,FXuint mode); /// Read block of bytes, returning number of bytes read virtual FXival readBlock(void* data,FXival count); /// Write block of bytes, returning number of bytes written virtual FXival writeBlock(const void* data,FXival count); /// Close socket virtual bool close(); /// Create a named pipe static bool create(const FXString& file,FXuint perm=FXIO::OwnerReadWrite|FXIO::GroupReadWrite|FXIO::OtherReadWrite); /// Destroy virtual ~FXPipe(); }; } #endif fox1.6-1.6.57/include/FXPoint.h000066400000000000000000000102371326741342000157630ustar00rootroot00000000000000/******************************************************************************** * * * P o i n t C l a s s * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPoint.h,v 1.13 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXPOINT_H #define FXPOINT_H #ifndef FXSIZE_H #include "FXSize.h" #endif namespace FX { /// Point class FXAPI FXPoint { public: FXshort x; FXshort y; public: /// Constructors FXPoint(){ } FXPoint(const FXSize& s):x(s.w),y(s.h){ } FXPoint(const FXPoint& p):x(p.x),y(p.y){ } FXPoint(FXshort xx,FXshort yy):x(xx),y(yy){ } /// Test if zero bool operator!() const { return x==0 && y==0; } /// Equality bool operator==(const FXPoint& p) const { return x==p.x && y==p.y; } bool operator!=(const FXPoint& p) const { return x!=p.x || y!=p.y; } /// Assignment FXPoint& operator=(const FXPoint& p){ x=p.x; y=p.y; return *this; } /// Set value from another point FXPoint& set(const FXPoint& p){ x=p.x; y=p.y; return *this; } /// Set value from components FXPoint& set(FXshort xx,FXshort yy){ x=xx; y=yy; return *this; } /// Assignment operators FXPoint& operator+=(const FXPoint& p){ x+=p.x; y+=p.y; return *this; } FXPoint& operator-=(const FXPoint& p){ x-=p.x; y-=p.y; return *this; } FXPoint& operator*=(FXshort c){ x*=c; y*=c; return *this; } FXPoint& operator/=(FXshort c){ x/=c; y/=c; return *this; } /// Negation FXPoint operator-(){ return FXPoint(-x,-y); } /// Addition operators FXPoint operator+(const FXPoint& p) const { return FXPoint(x+p.x,y+p.y); } FXPoint operator-(const FXPoint& p) const { return FXPoint(x-p.x,y-p.y); } /// Scale operators friend inline FXPoint operator*(const FXPoint& p,FXshort c); friend inline FXPoint operator*(FXshort c,const FXPoint& p); friend inline FXPoint operator/(const FXPoint& p,FXshort c); friend inline FXPoint operator/(FXshort c,const FXPoint& p); /// Save object to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXPoint& p); /// Load object from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXPoint& p); }; inline FXPoint operator*(const FXPoint& p,FXshort c){ return FXPoint(p.x*c,p.y*c); } inline FXPoint operator*(FXshort c,const FXPoint& p){ return FXPoint(c*p.x,c*p.y); } inline FXPoint operator/(const FXPoint& p,FXshort c){ return FXPoint(p.x/c,p.y/c); } inline FXPoint operator/(FXshort c,const FXPoint& p){ return FXPoint(c/p.x,c/p.y); } extern FXAPI FXStream& operator<<(FXStream& store,const FXPoint& p); extern FXAPI FXStream& operator>>(FXStream& store,FXPoint& p); } #endif fox1.6-1.6.57/include/FXPopup.h000066400000000000000000000151641326741342000160010ustar00rootroot00000000000000/******************************************************************************** * * * P o p u p W i n d o w W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPopup.h,v 1.35 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXPOPUP_H #define FXPOPUP_H #ifndef FXSHELL_H #include "FXShell.h" #endif namespace FX { /// Popup internal orientation enum { POPUP_VERTICAL = 0, /// Vertical orientation POPUP_HORIZONTAL = 0x00020000, /// Horizontal orientation POPUP_SHRINKWRAP = 0x00040000 /// Shrinkwrap to content }; /// Popup window class FXAPI FXPopup : public FXShell { FXDECLARE(FXPopup) private: FXPopup *prevActive; // Popup below this one in stack FXPopup *nextActive; // Popup above this one in stack protected: FXWindow *grabowner; // Window which will get grabbed when outside FXColor baseColor; FXColor hiliteColor; FXColor shadowColor; FXColor borderColor; FXint border; protected: FXPopup(); virtual bool doesOverrideRedirect() const; void drawBorderRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawRidgeRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawGrooveRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawDoubleRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawDoubleSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawFrame(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); private: FXPopup(const FXPopup&); FXPopup &operator=(const FXPopup&); #ifdef WIN32 virtual const char* GetClass() const; #endif public: long onPaint(FXObject*,FXSelector,void*); long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusLeft(FXObject*,FXSelector,void*); long onFocusRight(FXObject*,FXSelector,void*); long onFocusNext(FXObject*,FXSelector,void*); long onFocusPrev(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onMap(FXObject*,FXSelector,void*); long onButtonPress(FXObject*,FXSelector,void*); long onButtonRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onCmdUnpost(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onCmdChoice(FXObject*,FXSelector,void*); public: enum { ID_CHOICE=FXShell::ID_LAST, ID_LAST=ID_CHOICE+1000 }; public: /// Construct popup pane FXPopup(FXWindow* owner,FXuint opts=POPUP_VERTICAL|FRAME_RAISED|FRAME_THICK,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Return the default width of this window virtual FXint getDefaultWidth(); /// Return the default height of this window virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /// Return a pointer to the prior active popup FXPopup* getPrevActive() const { return prevActive; } /// Return a pointer to the next active popup FXPopup* getNextActive() const { return nextActive; } /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Show this window virtual void show(); /// Hide this window virtual void hide(); /// Change frame style void setFrameStyle(FXuint style); /// Return frame style FXuint getFrameStyle() const; /// Return border width FXint getBorderWidth() const { return border; } /// Change highlight color void setHiliteColor(FXColor clr); /// Return highlight color FXColor getHiliteColor() const { return hiliteColor; } /// Change shadow color void setShadowColor(FXColor clr); /// Return shadow color FXColor getShadowColor() const { return shadowColor; } /// Change border color void setBorderColor(FXColor clr); /// Return border color FXColor getBorderColor() const { return borderColor; } /// Change base color void setBaseColor(FXColor clr); /// Return base color FXColor getBaseColor() const { return baseColor; } /// Popup the menu and grab to the given owner virtual void popup(FXWindow* grabto,FXint x,FXint y,FXint w=0,FXint h=0); /// Pop down the menu virtual void popdown(); /// Return current grab owner FXWindow* getGrabOwner() const; // /// Popup the menu and grab to the given owner // virtual FXint popup(FXint x,FXint y,FXint w=0,FXint h=0); // // /// Pop down the menu // virtual void popdown(FXint value); /// Return popup orientation FXuint getOrientation() const; /// Change popup orientation void setOrientation(FXuint orient); /// Return shrinkwrap mode FXbool getShrinkWrap() const; /// Change shrinkwrap mode void setShrinkWrap(FXbool sw); virtual bool doesSaveUnder() const; /// Destructor virtual ~FXPopup(); }; } #endif fox1.6-1.6.57/include/FXPrintDialog.h000066400000000000000000000130771326741342000171130ustar00rootroot00000000000000/******************************************************************************** * * * P r i n t J o b D i a l o g * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPrintDialog.h,v 1.17 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXPRINTDIALOG_H #define FXPRINTDIALOG_H #ifndef FXDIALOGBOX_H #include "FXDialogBox.h" #endif namespace FX { class FXRadioButton; class FXComboBox; class FXListBox; class FXTextField; class FXSpinner; class FXIcon; /// Printer selection dialog class FXAPI FXPrintDialog : public FXDialogBox { FXDECLARE(FXPrintDialog) protected: FXRadioButton *sendtoprinter; FXComboBox *printername; FXRadioButton *sendtofile; FXTextField *filename; FXRadioButton *printall; FXRadioButton *printeven; FXRadioButton *printodd; FXRadioButton *printrange; FXRadioButton *firstpagefirst; FXRadioButton *lastpagefirst; FXRadioButton *printincolor; FXRadioButton *printinblacknwhite; FXRadioButton *orientportrait; FXRadioButton *orientlanscape; FXListBox *media; FXSpinner *firstpage; FXSpinner *lastpage; FXSpinner *numberofcopies; FXIcon *landscapeIcon; FXIcon *portraitIcon; FXPrinter printer; protected: FXPrintDialog(){} private: FXPrintDialog(const FXPrintDialog&); FXPrintDialog &operator=(const FXPrintDialog&); public: long onCmdToPrinter(FXObject*,FXSelector,void*); long onUpdToPrinter(FXObject*,FXSelector,void*); long onCmdToFile(FXObject*,FXSelector,void*); long onUpdToFile(FXObject*,FXSelector,void*); long onCmdBrowse(FXObject*,FXSelector,void*); long onUpdBrowse(FXObject*,FXSelector,void*); long onCmdProps(FXObject*,FXSelector,void*); long onUpdProps(FXObject*,FXSelector,void*); long onCmdPortrait(FXObject*,FXSelector,void*); long onUpdPortrait(FXObject*,FXSelector,void*); long onCmdLandscape(FXObject*,FXSelector,void*); long onUpdLandscape(FXObject*,FXSelector,void*); long onCmdPages(FXObject*,FXSelector,void*); long onUpdPages(FXObject*,FXSelector,void*); long onCmdColor(FXObject*,FXSelector,void*); long onUpdColor(FXObject*,FXSelector,void*); long onCmdGray(FXObject*,FXSelector,void*); long onUpdGray(FXObject*,FXSelector,void*); long onCmdNumCopies(FXObject*,FXSelector,void*); long onUpdNumCopies(FXObject*,FXSelector,void*); long onCmdFirstPage(FXObject*,FXSelector,void*); long onUpdFirstPage(FXObject*,FXSelector,void*); long onCmdLastPage(FXObject*,FXSelector,void*); long onUpdLastPage(FXObject*,FXSelector,void*); long onCmdCollateNormal(FXObject*,FXSelector,void*); long onUpdCollateNormal(FXObject*,FXSelector,void*); long onCmdCollateReversed(FXObject*,FXSelector,void*); long onUpdCollateReversed(FXObject*,FXSelector,void*); long onCmdFileName(FXObject*,FXSelector,void*); long onUpdFileName(FXObject*,FXSelector,void*); long onCmdPrinterName(FXObject*,FXSelector,void*); long onUpdPrinterName(FXObject*,FXSelector,void*); long onCmdAccept(FXObject*,FXSelector,void*); long onCmdMedia(FXObject*,FXSelector,void*); long onUpdMedia(FXObject*,FXSelector,void*); public: enum{ ID_TO_PRINTER=FXDialogBox::ID_LAST, ID_TO_FILE, ID_PRINTER_NAME, ID_FILE_NAME, ID_LANDSCAPE, ID_PORTRAIT, ID_MEDIA, ID_COLLATE_NORMAL, ID_COLLATE_REVERSED, ID_PAGES_ALL, ID_PAGES_EVEN, ID_PAGES_ODD, ID_PAGES_RANGE, ID_PAGES_FIRST, ID_PAGES_LAST, ID_BROWSE_FILE, ID_PROPERTIES, ID_COLOR_PRINTER, ID_GRAY_PRINTER, ID_NUM_COPIES }; public: /// Construct print dialog FXPrintDialog(FXWindow* owner,const FXString& name,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create dialog virtual void create(); /// Set printer info void setPrinter(const FXPrinter& pr); /// Get printer info void getPrinter(FXPrinter& pr); /// Save dialog to a stream virtual void save(FXStream& store) const; /// Load dialog from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXPrintDialog(); }; } #endif fox1.6-1.6.57/include/FXProgressBar.h000066400000000000000000000124001326741342000171150ustar00rootroot00000000000000/******************************************************************************** * * * P r o g r e s s B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXProgressBar.h,v 1.22 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXPROGRESSBAR_H #define FXPROGRESSBAR_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// Progress bar styles enum { PROGRESSBAR_HORIZONTAL = 0, /// Horizontal display PROGRESSBAR_VERTICAL = 0x00008000, /// Vertical display PROGRESSBAR_PERCENTAGE = 0x00010000, /// Show percentage done PROGRESSBAR_DIAL = 0x00020000, /// Show as a dial instead of bar PROGRESSBAR_NORMAL = FRAME_SUNKEN|FRAME_THICK }; /// Progress bar widget class FXAPI FXProgressBar : public FXFrame { FXDECLARE(FXProgressBar) protected: FXuint progress; // Integer percentage number FXuint total; // Amount for completion FXint barsize; // Bar size FXFont* font; FXColor barBGColor; FXColor barColor; FXColor textNumColor; FXColor textAltColor; protected: FXProgressBar(){} void drawInterior(FXDCWindow& dc); private: FXProgressBar(const FXProgressBar&); FXProgressBar &operator=(const FXProgressBar&); public: long onPaint(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); public: /// Construct progress bar FXProgressBar(FXComposite* p,FXObject* target=NULL,FXSelector sel=0,FXuint opts=PROGRESSBAR_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Change the amount of progress void setProgress(FXuint value); /// Get current progress FXuint getProgress() const { return progress; } /// Set total amount of progress void setTotal(FXuint value); /// Return total amount of progrss FXuint getTotal() const { return total; } /// Increment progress by given amount void increment(FXuint value); /// Hide progress percentage void hideNumber(); /// Show progress percentage void showNumber(); /// Change progress bar width void setBarSize(FXint size); /// Return progress bar width FXint getBarSize() const { return barsize; } /// Change backgroundcolor void setBarBGColor(FXColor clr); /// Return background color FXColor getBarBGColor() const { return barBGColor; } /// Change bar color void setBarColor(FXColor clr); /// Return bar color FXColor getBarColor() const { return barColor; } /// Change text color void setTextColor(FXColor clr); /// Return text color FXColor getTextColor() const { return textNumColor; } /// Change alternate text color shown when bar under text void setTextAltColor(FXColor clr); /// Return alternate text color FXColor getTextAltColor() const { return textAltColor; } /// Set the text font void setFont(FXFont *fnt); /// Get the text font FXFont* getFont() const { return font; } /// Change progress bar style void setBarStyle(FXuint style); /// Return current progress bar style FXuint getBarStyle() const; /// Save progress bar to a stream virtual void save(FXStream& store) const; /// Load progress bar from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXProgressBar(); }; } #endif fox1.6-1.6.57/include/FXProgressDialog.h000066400000000000000000000105301326741342000176120ustar00rootroot00000000000000/******************************************************************************** * * * P r o g r e s s D i a l o g B o x * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXProgressDialog.h,v 1.14 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXPROGRESSDIALOG_H #define FXPROGRESSDIALOG_H #ifndef FXDIALOGBOX_H #include "FXDialogBox.h" #endif namespace FX { enum { PROGRESSDIALOG_NOCANCEL = 0, /// Default is no cancel button PROGRESSDIALOG_CANCEL = 0x01000000, /// Enable the cancel button PROGRESSDIALOG_NORMAL = (DECOR_TITLE|DECOR_BORDER) }; class FXHorizontalSeparator; class FXProgressBar; class FXButton; class FXLabel; /** * A Progress Dialog is a simple dialog which is used to * keep a user informed of the progress of a lengthy operation * in a program and that the program is in fact still working. */ class FXAPI FXProgressDialog : public FXDialogBox { FXDECLARE(FXProgressDialog) protected: FXProgressBar *progress; // Progress bar FXLabel *message; // Message FXHorizontalSeparator *separator; // Separator FXButton *cancel; // Cancel button FXbool cancelled; // User hit cancel protected: FXProgressDialog(); private: FXProgressDialog(const FXProgressDialog&); FXProgressDialog &operator=(const FXProgressDialog&); public: long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdCancel(FXObject*,FXSelector,void*); public: /// Construct input dialog box with given caption, icon, and prompt text FXProgressDialog(FXWindow* owner,const FXString& caption,const FXString& label,FXuint opts=PROGRESSDIALOG_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Change the progress message void setMessage(const FXString& msg); /// Get progress message FXString getMessage() const; /// Change style of the progress bar widget void setBarStyle(FXuint style); /// Get style of the progress bar widget FXuint getBarStyle() const; /// Change the amount of progress void setProgress(FXuint value); /// Get current progress FXuint getProgress() const; /// Set total amount of progress void setTotal(FXuint value); /// Return total amount of progrss FXuint getTotal() const; /// Increment progress by given amount void increment(FXuint value); /// Has operation been cancelled? FXbool isCancelled() const { return cancelled; } /// Change cancelled flag void setCancelled(FXbool flg){ cancelled=flg; } /// Destroy virtual ~FXProgressDialog(); }; } #endif fox1.6-1.6.57/include/FXQuatd.h000066400000000000000000000122321326741342000157450ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n Q u a t e r n i o n * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXQuatd.h,v 1.15 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXQUATD_H #define FXQUATD_H namespace FX { class FXMat3d; /// Double-precision quaternion class FXAPI FXQuatd : public FXVec4d { public: /// Constructors FXQuatd(){} /// Copy constructor FXQuatd(const FXQuatd& q):FXVec4d(q){} /// Construct from components FXQuatd(FXdouble xx,FXdouble yy,FXdouble zz,FXdouble ww):FXVec4d(xx,yy,zz,ww){} /// Construct from array of doubles FXQuatd(const FXdouble v[]):FXVec4d(v){} /// Construct from axis and angle FXQuatd(const FXVec3d& axis,FXdouble phi=0.0); /// Construct from euler angles yaw (z), pitch (y), and roll (x) FXQuatd(FXdouble roll,FXdouble pitch,FXdouble yaw); /// Construct quaternion from two unit vectors FXQuatd(const FXVec3d& fr,const FXVec3d& to); /// Construct quaternion from three axes FXQuatd(const FXVec3d& ex,const FXVec3d& ey,const FXVec3d& ez); /// Construct quaternion from 3x3 matrix FXQuatd(const FXMat3d& mat); /// Adjust quaternion length FXQuatd& adjust(); /// Set quaternion from axis and angle void setAxisAngle(const FXVec3d& axis,FXdouble phi=0.0); /// Obtain axis and angle from quaternion void getAxisAngle(FXVec3d& axis,FXdouble& phi) const; /// Set quaternion from roll (x), pitch (y), yaw (z) void setRollPitchYaw(FXdouble roll,FXdouble pitch,FXdouble yaw); void getRollPitchYaw(FXdouble& roll,FXdouble& pitch,FXdouble& yaw) const; /// Set quaternion from yaw (z), pitch (y), roll (x) void setYawPitchRoll(FXdouble yaw,FXdouble pitch,FXdouble roll); void getYawPitchRoll(FXdouble& yaw,FXdouble& pitch,FXdouble& roll) const; /// Set quaternion from roll (x), yaw (z), pitch (y) void setRollYawPitch(FXdouble roll,FXdouble yaw,FXdouble pitch); void getRollYawPitch(FXdouble& roll,FXdouble& yaw,FXdouble& pitch) const; /// Set quaternion from pitch (y), roll (x),yaw (z) void setPitchRollYaw(FXdouble pitch,FXdouble roll,FXdouble yaw); void getPitchRollYaw(FXdouble& pitch,FXdouble& roll,FXdouble& yaw) const; /// Set quaternion from pitch (y), yaw (z), roll (x) void setPitchYawRoll(FXdouble pitch,FXdouble yaw,FXdouble roll); void getPitchYawRoll(FXdouble& pitch,FXdouble& yaw,FXdouble& roll) const; /// Set quaternion from yaw (z), roll (x), pitch (y) void setYawRollPitch(FXdouble yaw,FXdouble roll,FXdouble pitch); void getYawRollPitch(FXdouble& yaw,FXdouble& roll,FXdouble& pitch) const; /// Set quaternion from axes void setAxes(const FXVec3d& ex,const FXVec3d& ey,const FXVec3d& ez); /// Get quaternion axes void getAxes(FXVec3d& ex,FXVec3d& ey,FXVec3d& ez) const; /// Obtain local x axis FXVec3d getXAxis() const; /// Obtain local y axis FXVec3d getYAxis() const; /// Obtain local z axis FXVec3d getZAxis() const; /// Exponentiate quaternion FXQuatd exp() const; /// Take logarithm of quaternion FXQuatd log() const; /// Invert quaternion FXQuatd invert() const; /// Invert unit quaternion FXQuatd unitinvert() const; /// Conjugate quaternion FXQuatd conj() const; /// Construct quaternion from arc a->b on unit sphere FXQuatd& arc(const FXVec3d& a,const FXVec3d& b); /// Spherical lerp FXQuatd& lerp(const FXQuatd& u,const FXQuatd& v,FXdouble f); /// Multiply quaternions FXQuatd operator*(const FXQuatd& q) const; /// Rotation of a vector by a quaternion FXVec3d operator*(const FXVec3d& v) const; }; } #endif fox1.6-1.6.57/include/FXQuatf.h000066400000000000000000000121501326741342000157460ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n Q u a t e r n i o n * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXQuatf.h,v 1.17 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXQUATF_H #define FXQUATF_H namespace FX { class FXMat3f; /// Single-precision quaternion class FXAPI FXQuatf : public FXVec4f { public: /// Construct FXQuatf(){} /// Copy constructor FXQuatf(const FXQuatf& q):FXVec4f(q){} /// Construct from components FXQuatf(FXfloat xx,FXfloat yy,FXfloat zz,FXfloat ww):FXVec4f(xx,yy,zz,ww){} /// Construct from array of floats FXQuatf(const FXfloat v[]):FXVec4f(v){} /// Construct from axis and angle FXQuatf(const FXVec3f& axis,FXfloat phi=0.0f); /// Construct from euler angles yaw (z), pitch (y), and roll (x) FXQuatf(FXfloat roll,FXfloat pitch,FXfloat yaw); /// Construct quaternion from two unit vectors FXQuatf(const FXVec3f& fr,const FXVec3f& to); /// Construct quaternion from three axes FXQuatf(const FXVec3f& ex,const FXVec3f& ey,const FXVec3f& ez); /// Construct quaternion from 3x3 matrix FXQuatf(const FXMat3f& mat); /// Adjust quaternion length FXQuatf& adjust(); /// Set quaternion from axis and angle void setAxisAngle(const FXVec3f& axis,FXfloat phi=0.0f); /// Obtain axis and angle from quaternion void getAxisAngle(FXVec3f& axis,FXfloat& phi) const; /// Set quaternion from roll (x), pitch (y), yaw (z) void setRollPitchYaw(FXfloat roll,FXfloat pitch,FXfloat yaw); void getRollPitchYaw(FXfloat& roll,FXfloat& pitch,FXfloat& yaw) const; /// Set quaternion from yaw (z), pitch (y), roll (x) void setYawPitchRoll(FXfloat yaw,FXfloat pitch,FXfloat roll); void getYawPitchRoll(FXfloat& yaw,FXfloat& pitch,FXfloat& roll) const; /// Set quaternion from roll (x), yaw (z), pitch (y) void setRollYawPitch(FXfloat roll,FXfloat yaw,FXfloat pitch); void getRollYawPitch(FXfloat& roll,FXfloat& yaw,FXfloat& pitch) const; /// Set quaternion from pitch (y), roll (x),yaw (z) void setPitchRollYaw(FXfloat pitch,FXfloat roll,FXfloat yaw); void getPitchRollYaw(FXfloat& pitch,FXfloat& roll,FXfloat& yaw) const; /// Set quaternion from pitch (y), yaw (z), roll (x) void setPitchYawRoll(FXfloat pitch,FXfloat yaw,FXfloat roll); void getPitchYawRoll(FXfloat& pitch,FXfloat& yaw,FXfloat& roll) const; /// Set quaternion from yaw (z), roll (x), pitch (y) void setYawRollPitch(FXfloat yaw,FXfloat roll,FXfloat pitch); void getYawRollPitch(FXfloat& yaw,FXfloat& roll,FXfloat& pitch) const; /// Set quaternion from axes void setAxes(const FXVec3f& ex,const FXVec3f& ey,const FXVec3f& ez); /// Get quaternion axes void getAxes(FXVec3f& ex,FXVec3f& ey,FXVec3f& ez) const; /// Obtain local x axis FXVec3f getXAxis() const; /// Obtain local y axis FXVec3f getYAxis() const; /// Obtain local z axis FXVec3f getZAxis() const; /// Exponentiate quaternion FXQuatf exp() const; /// Take logarithm of quaternion FXQuatf log() const; /// Invert quaternion FXQuatf invert() const; /// Invert unit quaternion FXQuatf unitinvert() const; /// Conjugate quaternion FXQuatf conj() const; /// Construct quaternion from arc a->b on unit sphere FXQuatf& arc(const FXVec3f& a,const FXVec3f& b); /// Spherical lerp FXQuatf& lerp(const FXQuatf& u,const FXQuatf& v,FXfloat f); /// Multiply quaternions FXQuatf operator*(const FXQuatf& q) const; /// Rotation of a vector by a quaternion FXVec3f operator*(const FXVec3f& v) const; }; } #endif fox1.6-1.6.57/include/FXRASIcon.h000066400000000000000000000063031326741342000161270ustar00rootroot00000000000000/******************************************************************************** * * * S U N R A S T E R I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRASIcon.h,v 1.8 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXRASICON_H #define FXRASICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// SUN Raster Image format icon class FXAPI FXRASIcon : public FXIcon { FXDECLARE(FXRASIcon) protected: FXRASIcon(){} private: FXRASIcon(const FXRASIcon&); FXRASIcon &operator=(const FXRASIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct icon from memory stream formatted in SUN Raster Image format FXRASIcon(FXApp* a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in SUN Raster Image format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in SUN Raster Image format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXRASIcon(); }; /** * Check if stream contains a RAS, return TRUE if so. */ extern FXAPI bool fxcheckRAS(FXStream& store); /** * Load an SUN Raster Image format file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadRAS(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an SUN Raster Image format file to a stream. */ extern FXAPI bool fxsaveRAS(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXRASImage.h000066400000000000000000000062561326741342000162700ustar00rootroot00000000000000/******************************************************************************** * * * S U N R A S T E R I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRASImage.h,v 1.8 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXRASIMAGE_H #define FXRASIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// SUN Raster Image format class FXAPI FXRASImage : public FXImage { FXDECLARE(FXRASImage) protected: FXRASImage(){} private: FXRASImage(const FXRASImage&); FXRASImage &operator=(const FXRASImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct image from memory stream formatted in SUN Raster Image format FXRASImage(FXApp* a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in SUN Raster Image format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in SUN Raster Image format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXRASImage(); }; /** * Check if stream contains a RAS, return TRUE if so. */ extern FXAPI bool fxcheckRAS(FXStream& store); /** * Load an SUN Raster Image format file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadRAS(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an SUN Raster Image format file to a stream. */ extern FXAPI bool fxsaveRAS(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXRGBIcon.h000066400000000000000000000062221326741342000161140ustar00rootroot00000000000000/******************************************************************************** * * * I R I S R G B I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRGBIcon.h,v 1.14 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXRGBICON_H #define FXRGBICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// IRIS RGB icon class FXAPI FXRGBIcon : public FXIcon { FXDECLARE(FXRGBIcon) protected: FXRGBIcon(){} private: FXRGBIcon(const FXRGBIcon&); FXRGBIcon &operator=(const FXRGBIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct icon from memory stream formatted in IRIS-RGB format FXRGBIcon(FXApp* a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in IRIS-RGB format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in IRIS-RGB format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXRGBIcon(); }; /** * Check if stream contains a RGB, return TRUE if so. */ extern FXAPI bool fxcheckRGB(FXStream& store); /** * Load an RGB (SGI IRIS RGB) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadRGB(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an RGB (SGI IRIS RGB) file to a stream. */ extern FXAPI bool fxsaveRGB(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXRGBImage.h000066400000000000000000000062031326741342000162450ustar00rootroot00000000000000/******************************************************************************** * * * I R I S R G B I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRGBImage.h,v 1.14 2006/01/22 17:58:07 fox Exp $ * ********************************************************************************/ #ifndef FXRGBIMAGE_H #define FXRGBIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// IRIS RGB image class FXAPI FXRGBImage : public FXImage { FXDECLARE(FXRGBImage) protected: FXRGBImage(){} private: FXRGBImage(const FXRGBImage&); FXRGBImage &operator=(const FXRGBImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct image from memory stream formatted in IRIS-RGB format FXRGBImage(FXApp* a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in IRIS-RGB format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in IRIS-RGB format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXRGBImage(); }; /** * Check if stream contains a RGB, return TRUE if so. */ extern FXAPI bool fxcheckRGB(FXStream& store); /** * Load an RGB (SGI IRIS RGB) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadRGB(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an RGB (SGI IRIS RGB) file to a stream. */ extern FXAPI bool fxsaveRGB(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXRadioButton.h000066400000000000000000000126161326741342000171270ustar00rootroot00000000000000/******************************************************************************** * * * R a d i o B u t t o n W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRadioButton.h,v 1.29 2006/01/22 17:58:08 fox Exp $ * ********************************************************************************/ #ifndef FXRADIOBUTTON_H #define FXRADIOBUTTON_H #ifndef FXLABEL_H #include "FXLabel.h" #endif namespace FX { /// RadioButton flags enum { RADIOBUTTON_AUTOGRAY = 0x00800000, /// Automatically gray out when not updated RADIOBUTTON_AUTOHIDE = 0x01000000, /// Automatically hide when not updated RADIOBUTTON_NORMAL = JUSTIFY_NORMAL|ICON_BEFORE_TEXT }; /** * A radio button is a tri-state button. Normally, it is either * TRUE or FALSE; a third state MAYBE may be set to indicate that no selection * has been made yet by the user, or that the state is ambiguous. * When pressed, the radio button sets its state to TRUE and sends a SEL_COMMAND * to its target, and the message data set to the state of the radio button, * of the type FXbool. * A group of radio buttons can be made mutually exclusive by linking them * to a common data target. Alternatively, an application can implement a * common SEL_UPDATED handler to check and uncheck radio buttons as appropriate. */ class FXAPI FXRadioButton : public FXLabel { FXDECLARE(FXRadioButton) protected: FXColor radioColor; // Color of radio ball FXColor diskColor; // Color of radio disk FXbool check; // Radio state FXbool oldcheck; // Old radio state protected: FXRadioButton(); private: FXRadioButton(const FXRadioButton&); FXRadioButton &operator=(const FXRadioButton&); public: long onPaint(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onCheck(FXObject*,FXSelector,void*); long onUncheck(FXObject*,FXSelector,void*); long onUnknown(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); public: /// Construct new radio button FXRadioButton(FXComposite* p,const FXString& text,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=RADIOBUTTON_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Returns true because a radio button can receive focus virtual bool canFocus() const; /// Get default width virtual FXint getDefaultWidth(); /// Get default height virtual FXint getDefaultHeight(); /// Set radio button state (TRUE, FALSE or MAYBE) void setCheck(FXbool s=TRUE,FXbool notify=FALSE); /// Get radio button state (TRUE, FALSE or MAYBE) FXbool getCheck() const { return check; } /// Change radio button style void setRadioButtonStyle(FXuint style); /// Return current radio button style FXuint getRadioButtonStyle() const; /// Get the radio ball color FXColor getRadioColor() const { return radioColor; } /// Set the radio ball color void setRadioColor(FXColor clr); /// Get the radio disk color FXColor getDiskColor() const { return diskColor; } /// Set the radio disk color void setDiskColor(FXColor clr); /// Save radio button to a stream virtual void save(FXStream& store) const; /// Load radio button from a stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXRanged.h000066400000000000000000000135151326741342000160740ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n R a n g e C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRanged.h,v 1.17 2006/01/22 17:58:08 fox Exp $ * ********************************************************************************/ #ifndef FXRANGED_H #define FXRANGED_H namespace FX { class FXSphered; /// Bounds class FXAPI FXRanged { public: FXVec3d lower; FXVec3d upper; public: /// Default constructor FXRanged(){} /// Initialize from another range FXRanged(const FXRanged& bounds):lower(bounds.lower),upper(bounds.upper){} /// Initialize from two vectors FXRanged(const FXVec3d& lo,const FXVec3d& hi):lower(lo),upper(hi){} /// Initialize from six numbers FXRanged(FXdouble xlo,FXdouble xhi,FXdouble ylo,FXdouble yhi,FXdouble zlo,FXdouble zhi):lower(xlo,ylo,zlo),upper(xhi,yhi,zhi){} /// Initialize box to fully contain the given bounding sphere FXRanged(const FXSphered& sphere); /// Assignment FXRanged& operator=(const FXRanged& bounds){ lower=bounds.lower; upper=bounds.upper; return *this; } /// Set value from another range FXRanged& set(const FXRanged& bounds){ lower=bounds.lower; upper=bounds.upper; return *this; } /// Set value from two vectors FXRanged& set(const FXVec3d& lo,const FXVec3d& hi){ lower=lo; upper=hi; return *this; } /// Set value from six numbers FXRanged& set(FXdouble xlo,FXdouble xhi,FXdouble ylo,FXdouble yhi,FXdouble zlo,FXdouble zhi){ lower.set(xlo,ylo,zlo); upper.set(xhi,yhi,zhi); return *this; } /// Indexing with 0..1 FXVec3d& operator[](FXint i){ return (&lower)[i]; } /// Indexing with 0..1 const FXVec3d& operator[](FXint i) const { return (&lower)[i]; } /// Comparison bool operator==(const FXRanged& r) const { return lower==r.lower && upper==r.upper; } bool operator!=(const FXRanged& r) const { return lower!=r.lower || upper!=r.upper; } /// Width of box FXdouble width() const { return upper.x-lower.x; } /// Height of box FXdouble height() const { return upper.y-lower.y; } /// Depth of box FXdouble depth() const { return upper.z-lower.z; } /// Longest side FXdouble longest() const; /// shortest side FXdouble shortest() const; /// Length of diagonal FXdouble diameter() const; /// Get radius of box FXdouble radius() const; /// Compute diagonal FXVec3d diagonal() const; /// Get center of box FXVec3d center() const; /// Test if empty bool empty() const; /// Test if box contains point x,y,z bool contains(FXdouble x,FXdouble y,FXdouble z) const; /// Test if box contains point p bool contains(const FXVec3d& p) const; /// Test if box properly contains another box bool contains(const FXRanged& bounds) const; /// Test if box properly contains sphere bool contains(const FXSphered& sphere) const; /// Include point FXRanged& include(FXdouble x,FXdouble y,FXdouble z); /// Include point FXRanged& include(const FXVec3d& v); /// Include given range into box FXRanged& include(const FXRanged& box); /// Include given sphere into this box FXRanged& include(const FXSphered& sphere); /// Intersect box with normalized plane ax+by+cz+w; returns -1,0,+1 FXint intersect(const FXVec4d &plane) const; /// Intersect box with ray u-v bool intersect(const FXVec3d& u,const FXVec3d& v); /// Test if bounds overlap friend FXAPI bool overlap(const FXRanged& a,const FXRanged& b); /// Get corner number 0..7 FXVec3d corner(FXint c) const { return FXVec3d((&lower)[c&1].x, (&lower)[(c>>1)&1].y, (&lower)[c>>2].z); } /// Union of two boxes friend FXAPI FXRanged unite(const FXRanged& a,const FXRanged& b); /// Intersection of two boxes friend FXAPI FXRanged intersect(const FXRanged& a,const FXRanged& b); /// Save object to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXRanged& bounds); /// Load object from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXRanged& bounds); }; extern FXAPI bool overlap(const FXRanged& a,const FXRanged& b); extern FXAPI FXRanged unite(const FXRanged& a,const FXRanged& b); extern FXAPI FXRanged intersect(const FXRanged& a,const FXRanged& b); extern FXAPI FXStream& operator<<(FXStream& store,const FXRanged& bounds); extern FXAPI FXStream& operator>>(FXStream& store,FXRanged& bounds); } #endif fox1.6-1.6.57/include/FXRangef.h000066400000000000000000000134541326741342000161000ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n R a n g e C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRangef.h,v 1.16 2006/01/22 17:58:08 fox Exp $ * ********************************************************************************/ #ifndef FXRANGEF_H #define FXRANGEF_H namespace FX { class FXSpheref; /// Bounds class FXAPI FXRangef { public: FXVec3f lower; FXVec3f upper; public: /// Default constructor FXRangef(){} /// Copy constructor FXRangef(const FXRangef& bounds):lower(bounds.lower),upper(bounds.upper){} /// Initialize from two vectors FXRangef(const FXVec3f& lo,const FXVec3f& hi):lower(lo),upper(hi){} /// Initialize from six numbers FXRangef(FXfloat xlo,FXfloat xhi,FXfloat ylo,FXfloat yhi,FXfloat zlo,FXfloat zhi):lower(xlo,ylo,zlo),upper(xhi,yhi,zhi){} /// Initialize box to fully contain the given bounding sphere FXRangef(const FXSpheref& sphere); /// Assignment FXRangef& operator=(const FXRangef& bounds){ lower=bounds.lower; upper=bounds.upper; return *this; } /// Set value from another range FXRangef& set(const FXRangef& bounds){ lower=bounds.lower; upper=bounds.upper; return *this; } /// Set value from two vectors FXRangef& set(const FXVec3f& lo,const FXVec3f& hi){ lower=lo; upper=hi; return *this; } /// Set value from six numbers FXRangef& set(FXfloat xlo,FXfloat xhi,FXfloat ylo,FXfloat yhi,FXfloat zlo,FXfloat zhi){ lower.set(xlo,ylo,zlo); upper.set(xhi,yhi,zhi); return *this; } /// Indexing with 0..1 FXVec3f& operator[](FXint i){ return (&lower)[i]; } /// Indexing with 0..1 const FXVec3f& operator[](FXint i) const { return (&lower)[i]; } /// Comparison bool operator==(const FXRangef& r) const { return lower==r.lower && upper==r.upper; } bool operator!=(const FXRangef& r) const { return lower!=r.lower || upper!=r.upper; } /// Width of box FXfloat width() const { return upper.x-lower.x; } /// Height of box FXfloat height() const { return upper.y-lower.y; } /// Depth of box FXfloat depth() const { return upper.z-lower.z; } /// Longest side FXfloat longest() const; /// shortest side FXfloat shortest() const; /// Length of diagonal FXfloat diameter() const; /// Get radius of box FXfloat radius() const; /// Compute diagonal FXVec3f diagonal() const; /// Get center of box FXVec3f center() const; /// Test if empty bool empty() const; /// Test if box contains point x,y,z bool contains(FXfloat x,FXfloat y,FXfloat z) const; /// Test if box contains point p bool contains(const FXVec3f& p) const; /// Test if box properly contains another box bool contains(const FXRangef& bounds) const; /// Test if box properly contains sphere bool contains(const FXSpheref& sphere) const; /// Include point FXRangef& include(FXfloat x,FXfloat y,FXfloat z); /// Include point FXRangef& include(const FXVec3f& v); /// Include given range into box FXRangef& include(const FXRangef& box); /// Include given sphere into this box FXRangef& include(const FXSpheref& sphere); /// Intersect box with normalized plane ax+by+cz+w; returns -1,0,+1 FXint intersect(const FXVec4f& plane) const; /// Intersect box with ray u-v bool intersect(const FXVec3f& u,const FXVec3f& v); /// Test if boxes a and b overlap friend FXAPI bool overlap(const FXRangef& a,const FXRangef& b); /// Get corner number 0..7 FXVec3f corner(FXint c) const { return FXVec3f((&lower)[c&1].x,(&lower)[(c>>1)&1].y,(&lower)[c>>2].z); } /// Union of two boxes friend FXAPI FXRangef unite(const FXRangef& a,const FXRangef& b); /// Intersection of two boxes friend FXAPI FXRangef intersect(const FXRangef& a,const FXRangef& b); /// Save object to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXRangef& bounds); /// Load object from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXRangef& bounds); }; extern FXAPI bool overlap(const FXRangef& a,const FXRangef& b); extern FXAPI FXRangef unite(const FXRangef& a,const FXRangef& b); extern FXAPI FXRangef intersect(const FXRangef& a,const FXRangef& b); extern FXAPI FXStream& operator<<(FXStream& store,const FXRangef& bounds); extern FXAPI FXStream& operator>>(FXStream& store,FXRangef& bounds); } #endif fox1.6-1.6.57/include/FXRealSlider.h000066400000000000000000000207771326741342000167320ustar00rootroot00000000000000/******************************************************************************** * * * R e a l S l i d e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRealSlider.h,v 1.11 2006/01/22 17:58:08 fox Exp $ * ********************************************************************************/ #ifndef FXREALSLIDER_H #define FXREALSLIDER_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// Slider Control styles enum { REALSLIDER_HORIZONTAL = 0, /// Slider shown horizontally REALSLIDER_VERTICAL = 0x00008000, /// Slider shown vertically REALSLIDER_ARROW_UP = 0x00010000, /// Slider has arrow head pointing up REALSLIDER_ARROW_DOWN = 0x00020000, /// Slider has arrow head pointing down REALSLIDER_ARROW_LEFT = REALSLIDER_ARROW_UP, /// Slider has arrow head pointing left REALSLIDER_ARROW_RIGHT = REALSLIDER_ARROW_DOWN, /// Slider has arrow head pointing right REALSLIDER_INSIDE_BAR = 0x00040000, /// Slider is inside the slot rather than overhanging REALSLIDER_TICKS_TOP = 0x00080000, /// Ticks on the top of horizontal slider REALSLIDER_TICKS_BOTTOM = 0x00100000, /// Ticks on the bottom of horizontal slider REALSLIDER_TICKS_LEFT = REALSLIDER_TICKS_TOP, /// Ticks on the left of vertical slider REALSLIDER_TICKS_RIGHT = REALSLIDER_TICKS_BOTTOM, /// Ticks on the right of vertical slider REALSLIDER_NORMAL = REALSLIDER_HORIZONTAL }; /** * The real slider widget is a valuator widget which provides simple linear value range. * Two visual appearances are supported:- the sunken look, which is enabled with * the SLIDER_INSIDE_BAR option and the regular look. The latter may have optional * arrows on the slider thumb. * While being moved, the real slider sends a SEL_CHANGED message to its target; * at the end of the interaction, a SEL_COMMAND message is sent. * The message data represents the current slider value, of type pointer to FXdouble. */ class FXAPI FXRealSlider : public FXFrame { FXDECLARE(FXRealSlider) protected: FXdouble range[2]; // Reported data range FXdouble pos; // Reported data position FXdouble incr; // Increment when auto-sliding FXdouble delta; // Interval between ticks FXint headpos; // Head position FXint headsize; // Head size FXint slotsize; // Slot size FXColor slotColor; // Color of slot the head moves in FXint dragpoint; // Where on the head is grabbed FXString help; // Help string FXString tip; // Tip string protected: FXRealSlider(); void drawSliderHead(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawHorzTicks(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawVertTicks(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); private: FXRealSlider(const FXRealSlider&); FXRealSlider &operator=(const FXRealSlider&); public: long onPaint(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMiddleBtnPress(FXObject*,FXSelector,void*); long onMiddleBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onAutoSlide(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetRealValue(FXObject*,FXSelector,void*); long onCmdGetRealValue(FXObject*,FXSelector,void*); long onCmdSetIntRange(FXObject*,FXSelector,void*); long onCmdGetIntRange(FXObject*,FXSelector,void*); long onCmdSetRealRange(FXObject*,FXSelector,void*); long onCmdGetRealRange(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: enum{ ID_AUTOSLIDE=FXFrame::ID_LAST, ID_LAST }; public: /// Construct a slider widget FXRealSlider(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=REALSLIDER_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=0,FXint pr=0,FXint pt=0,FXint pb=0); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Returns true because a slider can receive focus virtual bool canFocus() const; /// Perform layout virtual void layout(); /// Enable the slider virtual void enable(); /// Disable the slider virtual void disable(); /// Change slider value void setValue(FXdouble value,FXbool notify=FALSE); /// Return slider value FXdouble getValue() const { return pos; } /// Change the slider's range void setRange(FXdouble lo,FXdouble hi,FXbool notify=FALSE); /// Get the slider's current range void getRange(FXdouble& lo,FXdouble& hi) const { lo=range[0]; hi=range[1]; } /// Change the slider style FXuint getSliderStyle() const; /// Get the current slider style void setSliderStyle(FXuint style); /// Get the slider's head size FXint getHeadSize() const { return headsize; } /// Change the slider's head size void setHeadSize(FXint hs); /// Get the slider's current slot size FXint getSlotSize() const { return slotsize; } /// Change the slider's slot size void setSlotSize(FXint bs); /// Get the slider's auto-increment/decrement value FXdouble getIncrement() const { return incr; } /// Change the slider's auto-increment/decrement value void setIncrement(FXdouble inc); /// Change the delta between ticks void setTickDelta(FXdouble dist); /// Get delta between ticks FXdouble getTickDelta() const { return delta; } /// Change the color of the slot the slider head moves in void setSlotColor(FXColor clr); /// Get the current slot color FXColor getSlotColor() const { return slotColor; } /// Set the help text to be displayed on the status line void setHelpText(const FXString& text){ help=text; } /// Get the current help text const FXString& getHelpText() const { return help; } /// Set the tip text to be displayed in the tooltip void setTipText(const FXString& text){ tip=text; } /// Get the current tooltip text value const FXString& getTipText() const { return tip; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy the slider virtual ~FXRealSlider(); }; } #endif fox1.6-1.6.57/include/FXRealSpinner.h000066400000000000000000000175071326741342000171230ustar00rootroot00000000000000/******************************************************************************** * * * R e a l - V a l u e d S p i n n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Bill Baxter. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRealSpinner.h,v 1.16 2006/02/10 03:53:47 fox Exp $ * ********************************************************************************/ #ifndef FXREALSPINNER_H #define FXREALSPINNER_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { /// RealSpinner Options enum { REALSPIN_NORMAL = 0, /// Normal, non-cyclic REALSPIN_CYCLIC = 0x00020000, /// Cyclic spinner REALSPIN_NOTEXT = 0x00040000, /// No text visible REALSPIN_NOMAX = 0x00080000, /// Spin all the way up to infinity REALSPIN_NOMIN = 0x00100000, /// Spin all the way down to -infinity REALSPIN_LOG = 0x00200000 /// Logarithmic rather than linear }; class FXTextField; class FXDial; /// Spinner control class FXAPI FXRealSpinner : public FXPacker { FXDECLARE(FXRealSpinner) protected: FXTextField *textField; // Text field FXArrowButton *upButton; // The up button FXArrowButton *downButton; // The down button FXdouble range[2]; // Reported data range FXdouble incr; // Increment FXdouble gran; // Granularity FXdouble pos; // Current position protected: FXRealSpinner(); private: FXRealSpinner(const FXRealSpinner&); FXRealSpinner& operator=(const FXRealSpinner&); public: long onUpdIncrement(FXObject*,FXSelector,void*); long onCmdIncrement(FXObject*,FXSelector,void*); long onUpdDecrement(FXObject*,FXSelector,void*); long onCmdDecrement(FXObject*,FXSelector,void*); long onCmdEntry(FXObject*,FXSelector,void*); long onChgEntry(FXObject*,FXSelector,void*); long onWheelEntry(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetIntRange(FXObject*,FXSelector,void*); long onCmdGetIntRange(FXObject*,FXSelector,void*); long onCmdSetRealValue(FXObject*,FXSelector,void*); long onCmdGetRealValue(FXObject*,FXSelector,void*); long onCmdSetRealRange(FXObject*,FXSelector,void*); long onCmdGetRealRange(FXObject*,FXSelector,void*); long onFocusSelf(FXObject*,FXSelector,void*); public: enum{ ID_INCREMENT=FXPacker::ID_LAST, ID_DECREMENT, ID_ENTRY, ID_LAST }; public: /// Construct a spinner FXRealSpinner(FXComposite *p,FXint cols,FXObject *tgt=NULL,FXSelector sel=0,FXuint opts=REALSPIN_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Perform layout virtual void layout(); /// Disable spinner virtual void disable(); /// Enable spinner virtual void enable(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Increment spinner void increment(FXbool notify=FALSE); /// Increment spinner by certain amount void incrementByAmount(FXdouble amount,FXbool notify=FALSE); /// Decrement spinner void decrement(FXbool notify=FALSE); /// Decrement spinner by certain amount void decrementByAmount(FXdouble amount, FXbool notify=FALSE); /// Return TRUE if in cyclic mode FXbool isCyclic() const; /// Set to cyclic mode, i.e. wrap around at maximum/minimum void setCyclic(FXbool cyclic); /// Return TRUE if text is visible FXbool isTextVisible() const; /// Set text visible flag void setTextVisible(FXbool shown); /// Change current value virtual void setValue(FXdouble value,FXbool notify=FALSE); /// Return current value FXdouble getValue() const { return pos; } /// Change the spinner's range void setRange(FXdouble lo,FXdouble hi,FXbool notify=FALSE); /// Get the spinner's current range void getRange(FXdouble& lo,FXdouble& hi) const { lo=range[0]; hi=range[1]; } /// Change spinner increment void setIncrement(FXdouble increment); /// Return spinner increment FXdouble getIncrement() const { return incr; } /// Change spinner granularity void setGranularity(FXdouble gr); /// Return spinner granularity FXdouble getGranularity() const { return gran; } /// Set the text font void setFont(FXFont *fnt); /// Get the text font FXFont *getFont() const; /// Set the status line help text for this spinner void setHelpText(const FXString& text); /// Get the status line help text for this spinner const FXString& getHelpText() const; /// Set the tool tip message for this spinner void setTipText(const FXString& text); /// Get the tool tip message for this spinner const FXString& getTipText() const; /// Change spinner style void setSpinnerStyle(FXuint style); /// Return current spinner style FXuint getSpinnerStyle() const; /// Allow editing of the text field void setEditable(FXbool edit=TRUE); /// Return TRUE if text field is editable FXbool isEditable() const; /// Change color of the up arrow void setUpArrowColor(FXColor clr); /// Return color of the up arrow FXColor getUpArrowColor() const; /// Change color of the down arrow void setDownArrowColor(FXColor clr); /// Return color of the the down arrow FXColor getDownArrowColor() const; /// Change text color void setTextColor(FXColor clr); /// Return text color FXColor getTextColor() const; /// Change selected background color void setSelBackColor(FXColor clr); /// Return selected background color FXColor getSelBackColor() const; /// Change selected text color void setSelTextColor(FXColor clr); /// Return selected text color FXColor getSelTextColor() const; /// Changes the cursor color void setCursorColor(FXColor clr); /// Return the cursor color FXColor getCursorColor() const; /// Change width of text field in terms of number of columns * `m' void setNumColumns(FXint cols); /// Return number of columns FXint getNumColumns() const; /// Save spinner to a stream virtual void save(FXStream& store) const; /// Load spinner from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXRealSpinner(); }; } #endif fox1.6-1.6.57/include/FXRecentFiles.h000066400000000000000000000116561326741342000171030ustar00rootroot00000000000000/******************************************************************************** * * * R e c e n t F i l e s L i s t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRecentFiles.h,v 1.24 2006/01/22 17:58:08 fox Exp $ * ********************************************************************************/ #ifndef FXRECENTFILES_H #define FXRECENTFILES_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { class FXApp; /** * The recent files object manages a most recently used (MRU) file list by * means of the standard system registry. * When connected to a widget, like a menu command, the recent files object * updates the menu commands label to the associated recent file name; when * the menu command is invoked, the recent file object sends its target a * SEL_COMMAND message with the message data set to the associated file name, * of the type const char*. * When adding or removing file names, the recent files object automatically * updates the system registry to record these changes. */ class FXAPI FXRecentFiles : public FXObject { FXDECLARE(FXRecentFiles) private: FXApp *app; // Backlink to application FXObject *target; // Target object to send message FXSelector message; // Message to send FXString group; // MRU File group FXint maxfiles; // Maximum number of files to track private: FXRecentFiles(const FXRecentFiles&); FXRecentFiles &operator=(const FXRecentFiles&); public: long onCmdClear(FXObject*,FXSelector,void*); long onCmdFile(FXObject*,FXSelector,void*); long onUpdFile(FXObject*,FXSelector,void*); long onUpdAnyFiles(FXObject*,FXSelector,void*); public: enum{ ID_CLEAR, ID_ANYFILES, ID_FILE_1, ID_FILE_2, ID_FILE_3, ID_FILE_4, ID_FILE_5, ID_FILE_6, ID_FILE_7, ID_FILE_8, ID_FILE_9, ID_FILE_10, ID_LAST }; public: /// Make new recent files group, using global application instance FXRecentFiles(); /// Make new recent files group with default groupname FXRecentFiles(FXApp* a); /// Make new recent files group with groupname gp FXRecentFiles(FXApp* a,const FXString& gp,FXObject *tgt=NULL,FXSelector sel=0); /// Get application FXApp* getApp() const { return app; } /// Change number of files we're tracking void setMaxFiles(FXint mx){ maxfiles=mx; } /// Return the maximum number of files being tracked FXint getMaxFiles() const { return maxfiles; } /// Set group name void setGroupName(const FXString& name){ group=name; } /// Return group name FXString getGroupName() const { return group; } /// Change the target void setTarget(FXObject *t){ target=t; } /// Get the target FXObject *getTarget() const { return target; } /// Change the message void setSelector(FXSelector sel){ message=sel; } /// Return the message id FXSelector getSelector() const { return message; } /// Obtain the filename at index FXString getFile(FXint index) const; /// Change the filename at index void setFile(FXint index,const FXString& filename); /// Append a file void appendFile(const FXString& filename); /// Remove a file void removeFile(const FXString& filename); /// Clear the list of files void clear(); /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXRecentFiles(); }; } #endif fox1.6-1.6.57/include/FXRectangle.h000066400000000000000000000127501326741342000166000ustar00rootroot00000000000000/******************************************************************************** * * * R e c t a n g l e C l a s s * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRectangle.h,v 1.19 2006/01/22 17:58:08 fox Exp $ * ********************************************************************************/ #ifndef FXRECTANGLE_H #define FXRECTANGLE_H #ifndef FXPOINT_H #include "FXPoint.h" #endif namespace FX { /// Rectangle class FXAPI FXRectangle { public: FXshort x; FXshort y; FXshort w; FXshort h; public: /// Constructors FXRectangle(){ } FXRectangle(FXshort xx,FXshort yy,FXshort ww,FXshort hh):x(xx),y(yy),w(ww),h(hh){ } FXRectangle(const FXPoint& p,const FXSize& s):x(p.x),y(p.y),w(s.w),h(s.h){ } FXRectangle(const FXPoint& topleft,const FXPoint& bottomright):x(topleft.x),y(topleft.y),w(bottomright.x-topleft.x+1),h(bottomright.y-topleft.y+1){ } /// Test if empty bool empty() const { return w<=0 || h<=0; } /// Test if zero bool operator!() const { return x==0 && y==0 && w==0 && h==0; } /// Equality bool operator==(const FXRectangle& r) const { return x==r.x && y==r.y && w==r.w && h==r.h; } bool operator!=(const FXRectangle& r) const { return x!=r.x || y!=r.y || w!=r.w || h!=r.h; } /// Point in rectangle bool contains(const FXPoint& p) const { return x<=p.x && y<=p.y && p.x>(FXStream& store,FXRectangle& r); }; inline bool overlap(const FXRectangle& a,const FXRectangle& b){ return b.x>(FXStream& store,FXRectangle& r); } #endif fox1.6-1.6.57/include/FXRegion.h000066400000000000000000000074571326741342000161270ustar00rootroot00000000000000/******************************************************************************** * * * C l i p p i n g R e g i o n * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRegion.h,v 1.20 2006/01/22 17:58:08 fox Exp $ * ********************************************************************************/ #ifndef FXREGION_H #define FXREGION_H namespace FX { /// Region class FXAPI FXRegion { friend class FXDC; friend class FXDCWindow; friend class FXWindow; private: void *region; public: /// Construct new empty region FXRegion(); /// Construct new region copied from region r FXRegion(const FXRegion& r); /// Construct new region from rectangle rect FXRegion(const FXRectangle& rect); /// Construct rectangle region FXRegion(FXint x,FXint y,FXint w,FXint h); /// Construct polygon region FXRegion(const FXPoint* points,FXuint npoints,bool winding=false); /// Assign region r to this one FXRegion &operator=(const FXRegion& r); /// Return true if region is empty bool empty() const; /// Return true if region contains point bool contains(FXint x,FXint y) const; /// Return true if region contains rectangle bool contains(FXint x,FXint y,FXint w,FXint h) const; /// Return bounding box FXRectangle bounds() const; /// Offset region by dx,dy FXRegion& offset(FXint dx,FXint dy); /// Return true if region equal to this one bool operator==(const FXRegion& r) const; /// Return true if region not equal to this one bool operator!=(const FXRegion& r) const; /// Union region r with this one FXRegion& operator+=(const FXRegion& r); /// Intersect region r with this one FXRegion& operator*=(const FXRegion& r); /// Subtract region r from this one FXRegion& operator-=(const FXRegion& r); /// Xor region r with this one FXRegion& operator^=(const FXRegion& r); /// Union of this region and region r FXRegion operator+(const FXRegion& r) const; /// Intersection of this region and region r FXRegion operator*(const FXRegion& r) const; /// Subtract region r from this region FXRegion operator-(const FXRegion& r) const; /// Xor of this region and region r FXRegion operator^(const FXRegion& r) const; /// Reset region to empty void reset(); /// Destroy region ~FXRegion(); }; } #endif fox1.6-1.6.57/include/FXRegistry.h000066400000000000000000000111421326741342000164760ustar00rootroot00000000000000/******************************************************************************** * * * R e g i s t r y C l a s s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRegistry.h,v 1.31 2006/01/22 17:58:08 fox Exp $ * ********************************************************************************/ #ifndef FXREGISTRY_H #define FXREGISTRY_H #ifndef FXSETTINGS_H #include "FXSettings.h" #endif namespace FX { /** * The registry maintains a database of persistent settings for an application. * The settings database is organized in two groups of three layers each. The * system-wide settings group contains settings information pertaining to all * users on a system. The per-user settings group contains settings affecting * that user only. * Each settings group contains a desktop layer, which comprises the settings * which affect all FOX programs, a vendor layer which holds settings that * affect all applications from that vendor (e.g. a application-suite), and * an application layer which holds settings only for a single application. * The vendor-key and application-key determine which files these layers come * from, while the "Desktop" key is used for all FOX applications. * Settings in the system-wide group are overwritten by the per-user group, * and settings from the "Desktop" layer are overwritten by the vendor-layer; * vendor-layer settings are overwritten by the application-layer settings. * Only the per-user, per-application settings ever gets written; the layers * in the system-group only get written during installation and configuration * of the application. * The registry is read when FXApp::init() is called, and written back to the * system when FXApp::exit() is called. */ class FXAPI FXRegistry : public FXSettings { FXDECLARE(FXRegistry) protected: FXString applicationkey; // Application key FXString vendorkey; // Vendor key bool ascii; // ASCII file-based registry protected: bool readFromDir(const FXString& dirname,bool mark); #ifdef WIN32 bool readFromRegistry(void* hRootKey,bool mark); bool writeToRegistry(void* hRootKey); bool readFromRegistryGroup(void* org,const char* groupname,bool mark=false); bool writeToRegistryGroup(void* org,const char* groupname); #endif private: FXRegistry(const FXRegistry&); FXRegistry &operator=(const FXRegistry&); public: /** * Construct registry object; akey and vkey must be string constants. * Regular applications SHOULD set a vendor key! */ FXRegistry(const FXString& akey=FXString::null,const FXString& vkey=FXString::null); /// Read registry bool read(); /// Write registry bool write(); /// Return application key const FXString& getAppKey() const { return applicationkey; } /// Return vendor key const FXString& getVendorKey() const { return vendorkey; } /** * Set ASCII mode; under MS-Windows, this will switch the system to a * file-based registry system, instead of using the System Registry API. */ void setAsciiMode(bool asciiMode){ ascii=asciiMode; } /// Get ASCII mode bool getAsciiMode() const { return ascii; } }; } #endif fox1.6-1.6.57/include/FXReplaceDialog.h000066400000000000000000000114131326741342000173620ustar00rootroot00000000000000/******************************************************************************** * * * T e x t R e p l a c e D i a l o g * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXReplaceDialog.h,v 1.22 2006/01/22 17:58:08 fox Exp $ * ********************************************************************************/ #ifndef FXREPLACEDIALOG_H #define FXREPLACEDIALOG_H #ifndef FXDIALOGBOX_H #include "FXDialogBox.h" #endif namespace FX { class FXButton; class FXLabel; class FXTextField; class FXHorizontalFrame; /// Text replace dialog class FXAPI FXReplaceDialog : public FXDialogBox { FXDECLARE(FXReplaceDialog) protected: FXLabel *searchlabel; FXTextField *searchtext; FXHorizontalFrame *searchbox; FXLabel *replacelabel; FXTextField *replacetext; FXHorizontalFrame *replacebox; FXButton *accept; FXButton *cancel; FXButton *every; FXuint searchmode; FXuint current; protected: FXReplaceDialog(){} void appendHistory(const FXString& search,const FXString& replace,FXuint mode); private: FXReplaceDialog(const FXReplaceDialog&); FXReplaceDialog &operator=(const FXReplaceDialog&); public: long onCmdAll(FXObject*,FXSelector,void*); long onCmdNext(FXObject*,FXSelector,void*); long onUpdDir(FXObject*,FXSelector,void*); long onCmdDir(FXObject*,FXSelector,void*); long onUpdMode(FXObject*,FXSelector,void*); long onCmdMode(FXObject*,FXSelector,void*); long onSearchKey(FXObject*,FXSelector,void*); long onReplaceKey(FXObject*,FXSelector,void*); long onCmdSearchHist(FXObject*,FXSelector,void*); long onCmdReplaceHist(FXObject*,FXSelector,void*); long onCmdAccept(FXObject*,FXSelector,void*); public: enum{ ID_NEXT=FXDialogBox::ID_LAST, ID_PREV, ID_SEARCH_UP, ID_SEARCH_DN, ID_REPLACE_UP, ID_REPLACE_DN, ID_ALL, ID_DIR, ID_SEARCH_TEXT, ID_REPLACE_TEXT, ID_MODE, ID_LAST=ID_MODE+32 }; public: enum { DONE = 0, /// Cancel search SEARCH = 1, /// Search first occurrence REPLACE = 1, /// Replace first occurrence SEARCH_NEXT = 2, /// Search next occurrence REPLACE_NEXT = 2, /// Replace next occurrence REPLACE_ALL = 3 /// Replace all occurrences }; public: /// Construct search and replace dialog box FXReplaceDialog(FXWindow* owner,const FXString& caption,FXIcon* ic=NULL,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Set text or pattern to search for void setSearchText(const FXString& text); /// Return text or pattern the user has entered FXString getSearchText() const; /// Set replace text void setReplaceText(const FXString& text); /// Return replace text the user has entered FXString getReplaceText() const; /// Set search match mode void setSearchMode(FXuint mode){ searchmode=mode; } /// Return search mode the user has selected FXuint getSearchMode() const { return searchmode; } /// Run modal invocation of the dialog virtual FXuint execute(FXuint placement=PLACEMENT_CURSOR); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destructor virtual ~FXReplaceDialog(); }; } #endif fox1.6-1.6.57/include/FXRex.h000066400000000000000000000175101326741342000154310ustar00rootroot00000000000000/******************************************************************************** * * * R e g u l a r E x p r e s s i o n C l a s s * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRex.h,v 1.53 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXREX_H #define FXREX_H namespace FX { /// Regular expression error codes enum FXRexError { REGERR_OK, REGERR_EMPTY, /// Empty pattern REGERR_PAREN, /// Unmatched parenthesis REGERR_BRACK, /// Unmatched bracket REGERR_BRACE, /// Unmatched brace REGERR_RANGE, /// Bad character range REGERR_ESC, /// Bad escape sequence REGERR_COUNT, /// Bad counted repeat REGERR_NOATOM, /// No atom preceding repetition REGERR_REPEAT, /// Repeat following repeat REGERR_BACKREF, /// Bad backward reference REGERR_CLASS, /// Bad character class REGERR_COMPLEX, /// Expression too complex REGERR_MEMORY, /// Out of memory REGERR_TOKEN /// Illegal token }; /// Regular expression parse flags enum { REX_NORMAL = 0, /// Normal mode REX_CAPTURE = 1, /// Perform capturing parentheses REX_ICASE = 2, /// Case independent matching REX_NEWLINE = 4, /// Match-any operators match newline too REX_VERBATIM = 8, /// Disable interpretation of magic characters REX_SYNTAX = 16 /// Perform syntax check only }; /// Regular expression match flags enum { REX_FORWARD = 0, /// Match scanning forward from offset REX_BACKWARD = 32, /// Match scanning backward from offset REX_NOT_BOL = 64, /// Start of string is NOT begin of line REX_NOT_EOL = 128, /// End of string is NOT end of line REX_NOT_EMPTY = 256 /// Do not match empty }; /** * FXRex is a regular expression class implementing a NFA matcher. * It supports capturing parentheses, non-capturing parentheses, * positive or negative lookahead, backreferences, case-insensitive * matching, counted repetitions, lazy or greedy matches, and * PERL-like matching operators. * The subject string may be scanned forwards or backwards, and may * contain any of 256 possible character values. * * When parsing a regular expression pattern, the mode parameter is * the bitwise OR of a set of flags and affects the match algorithm. * Passing the flag REX_CAPTURE enables capturing parentheses * and back references. The flag REX_ICASE enables case-insensitive * matching. When the flag REX_NEWLINE is passed, newlines are treated * like normal characters; otherwise, newline is NOT matched * except when explicitly part of a character class. The flag * REX_VERBATIM disables all special character interpretation. * * When matching a compiled pattern, the mode parameter is the * bitwise OR of a set of flags that affects how the match is * performed. Passing the flag REX_BACKWARD causes the match * to proceed backwards through the subject string. Passing the * flags REX_NOT_BOL and/or REX_NOT_EOL causes the begin and * end of the subject string NOT to be considered a line start * or line end. The flag REX_NOT_EMPTY causes a match to fail if * the empty string was matched. */ class FXAPI FXRex { private: FXint *code; private: static const FXchar *const errors[]; static const FXint fallback[]; public: /// Construct empty regular expression object FXRex():code((FXint*)fallback){} /// Copy regular expression object FXRex(const FXRex& orig); /// Compile expression from pattern; if error is not NULL, error code is returned FXRex(const FXchar* pattern,FXint mode=REX_NORMAL,FXRexError* error=NULL); /// Compile expression from pattern; if error is not NULL, error code is returned FXRex(const FXString& pattern,FXint mode=REX_NORMAL,FXRexError* error=NULL); /// Assign another regular expression to this one FXRex& operator=(const FXRex& orig); /** * See if regular expression is empty; the regular expression * will be empty when it is unable to parse a pattern due to * a syntax error. */ bool empty() const { return (code==fallback); } /// Parse pattern, return error code if syntax error is found FXRexError parse(const FXchar* pattern,FXint mode=REX_NORMAL); /// Parse pattern, return error code if syntax error is found FXRexError parse(const FXString& pattern,FXint mode=REX_NORMAL); /** * Match a subject string of length len, returning TRUE if a match is found * and FALSE otherwise. The entire pattern is captured in beg[0] and end[0], * where beg[0] refers to the position of the first matched character and end[0] * refers to the position after the last matched character. * Sub expressions from capturing parenthesis i are returned in beg[i] and end[i]. */ bool match(const FXchar* string,FXint len,FXint* beg=NULL,FXint* end=NULL,FXint mode=REX_FORWARD,FXint npar=1,FXint fm=0,FXint to=2147483647) const; /// Search for match in a string bool match(const FXString& string,FXint* beg=NULL,FXint* end=NULL,FXint mode=REX_FORWARD,FXint npar=1,FXint fm=0,FXint to=2147483647) const; /** * After performing a regular expression match with capturing parentheses, * a substitution string is build from the replace string, where where "&" * is replaced by the entire matched pattern, and "\1" through "\9" are * replaced by captured expressions. The original source string and its * length, and the match arrays beg and end must be passed. */ static FXString substitute(const FXchar* string,FXint len,FXint* beg,FXint* end,const FXString& replace,FXint npar=1); /// Return substitution string static FXString substitute(const FXString& string,FXint* beg,FXint* end,const FXString& replace,FXint npar=1); /// Returns error code for given error static const FXchar* getError(FXRexError err){ return errors[err]; } /// Comparison operators bool operator==(const FXRex& rex) const; bool operator!=(const FXRex& rex) const; /// Saving and loading friend FXAPI FXStream& operator<<(FXStream& store,const FXRex& s); friend FXAPI FXStream& operator>>(FXStream& store,FXRex& s); /// Delete ~FXRex(); }; extern FXAPI FXStream& operator<<(FXStream& store,const FXRex& s); extern FXAPI FXStream& operator>>(FXStream& store,FXRex& s); } #endif fox1.6-1.6.57/include/FXRootWindow.h000066400000000000000000000062611326741342000170070ustar00rootroot00000000000000/******************************************************************************** * * * R o o t W i n d o w W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRootWindow.h,v 1.23 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXROOTWINDOW_H #define FXROOTWINDOW_H #ifndef FXCOMPOSITE_H #include "FXComposite.h" #endif namespace FX { /// Root window class FXAPI FXRootWindow : public FXComposite { FXDECLARE(FXRootWindow) protected: FXRootWindow(){} #ifdef WIN32 virtual FXID GetDC() const; virtual int ReleaseDC(FXID) const; #endif private: FXRootWindow(const FXRootWindow&); FXRootWindow &operator=(const FXRootWindow&); public: /// Construct root window FXRootWindow(FXApp* a,FXVisual *vis); /// Root window need not be created virtual void create(); /// Root window may not be detached virtual void detach(); /// Root window can not be destroyed virtual void destroy(); /// Perform layout virtual void layout(); /// Return width of the root window virtual FXint getDefaultWidth(); /// Return height of the root window virtual FXint getDefaultHeight(); /// No op virtual void recalc(); /// Root window can not be moved virtual void move(FXint x,FXint y); /// Root window can not be resized virtual void resize(FXint w,FXint h); /// Root window can not be positioned virtual void position(FXint x,FXint y,FXint w,FXint h); /// Root window can not get focus virtual void setFocus(); /// Root window can not loose virtual void killFocus(); /// Destructor virtual ~FXRootWindow(); }; } #endif fox1.6-1.6.57/include/FXRuler.h000066400000000000000000000272271326741342000157720ustar00rootroot00000000000000/******************************************************************************** * * * R u l e r W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRuler.h,v 1.36 2006/01/28 20:30:21 fox Exp $ * ********************************************************************************/ #ifndef FXRULER_H #define FXRULER_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// Ruler options enum { RULER_NORMAL = 0, /// Default appearance (default) RULER_HORIZONTAL = 0, /// Ruler is horizontal (default) RULER_VERTICAL = 0x00008000, /// Ruler is vertical RULER_TICKS_OFF = 0, /// Tick marks off (default) RULER_TICKS_TOP = 0x00010000, /// Ticks on the top (if horizontal) RULER_TICKS_BOTTOM = 0x00020000, /// Ticks on the bottom (if horizontal) RULER_TICKS_LEFT = RULER_TICKS_TOP, /// Ticks on the left (if vertical) RULER_TICKS_RIGHT = RULER_TICKS_BOTTOM, /// Ticks on the right (if vertical) RULER_TICKS_CENTER = RULER_TICKS_TOP|RULER_TICKS_BOTTOM, /// Tickmarks centered RULER_NUMBERS = 0x00040000, /// Show numbers RULER_ARROW = 0x00080000, /// Draw small arrow for cursor position RULER_MARKERS = 0x00100000, /// Draw markers for indentation settings RULER_METRIC = 0, /// Metric subdivision (default) RULER_ENGLISH = 0x00200000, /// English subdivision RULER_MARGIN_ADJUST = 0x00400000, /// Allow margin adjustment RULER_ALIGN_CENTER = 0, /// Center document horizontally RULER_ALIGN_LEFT = 0x00800000, /// Align document to the left RULER_ALIGN_RIGHT = 0x01000000, /// Align document to the right RULER_ALIGN_TOP = RULER_ALIGN_LEFT, /// Align document to the top RULER_ALIGN_BOTTOM = RULER_ALIGN_RIGHT, /// Align document to the bottom RULER_ALIGN_STRETCH = RULER_ALIGN_LEFT|RULER_ALIGN_RIGHT, /// Stretch document to fit horizontally RULER_ALIGN_NORMAL = RULER_ALIGN_CENTER /// Normally, document is centered both ways }; class FXFont; /** * The ruler widget is placed alongside a document to measure position * and size of entities within the document, such as margins, paragraph * indents, and tickmarks. * The ruler widget sends a SEL_CHANGED when the indentation or margins * are interactively changed by the user. * If the document size exceeds the available space, it is possible to * scroll the document using setPosition(). When the document size is * less than the available space, the alignment options can be used to * center, left-adjust, or right-adjust the document. * Finally, a special option exists to stretch the document to the * available space, that is to say, the document will always be fitten * with given left and right edges substracted from the available space. */ class FXAPI FXRuler : public FXFrame { FXDECLARE(FXRuler) protected: FXFont *font; // Font for numbers FXint documentSize; // Size of document FXint edgeSpacing; // Edge spacing around document FXint marginLower; // Lower margin FXint marginUpper; // Upper margin FXint indentFirst; // First line paragraph indent FXint indentLower; // Lower paragraph indent FXint indentUpper; // Upper paragraph indent FXdouble pixelPerTick; // Number of pixels per tick increment FXint numberTicks; // Tick increments between numbers FXint majorTicks; // Tick increments between major ticks FXint mediumTicks; // Tick increments between medium ticks FXint tinyTicks; // Tick increments between tiny ticks FXint arrowPos; // Arrow position FXColor textColor; // Color for numbers and ticks FXint shift; // Left edge of content FXint pos; // Scroll position FXint off; // Offset item was grabbed FXString tip; // Tooltip text FXString help; // Help text FXuchar mode; // Mode widget is in protected: FXRuler(); FXint picked(FXint x,FXint y); void drawLeftArrow(FXDCWindow& dc,FXint x,FXint y); void drawRightArrow(FXDCWindow& dc,FXint x,FXint y); void drawUpArrow(FXDCWindow& dc,FXint x,FXint y); void drawDownArrow(FXDCWindow& dc,FXint x,FXint y); void drawLeftMarker(FXDCWindow& dc,FXint x,FXint y); void drawRightMarker(FXDCWindow& dc,FXint x,FXint y); void drawUpMarker(FXDCWindow& dc,FXint x,FXint y); void drawDownMarker(FXDCWindow& dc,FXint x,FXint y); protected: enum{ MOUSE_NONE, // No mouse operation MOUSE_MARG_LOWER, // Drag lower margin MOUSE_MARG_UPPER, // Drag upper margin MOUSE_PARA_FIRST, // Drag first indent MOUSE_PARA_LOWER, // Drag lower indent MOUSE_PARA_UPPER // Drag upper indent }; private: FXRuler(const FXRuler&); FXRuler &operator=(const FXRuler&); public: long onPaint(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: enum{ ID_ARROW=FXFrame::ID_LAST, ID_LAST }; public: /// Construct label with given text and icon FXRuler(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=RULER_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Perform layout virtual void layout(); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Set the current position void setPosition(FXint pos,FXbool notify=FALSE); /// Return the current position FXint getPosition() const { return pos; } /// Change/return content size void setContentSize(FXint size,FXbool notify=FALSE); FXint getContentSize() const; /// Get lower edge of document FXint getDocumentLower() const; /// Get upper edge of document FXint getDocumentUpper() const; /// Change/return document size void setDocumentSize(FXint size,FXbool notify=FALSE); FXint getDocumentSize() const { return documentSize; } /// Change/return document edge spacing void setEdgeSpacing(FXint space,FXbool notify=FALSE); FXint getEdgeSpacing() const { return edgeSpacing; } /// Change/return lower document margin void setMarginLower(FXint mgn,FXbool notify=FALSE); FXint getMarginLower() const { return marginLower; } /// Change/return upper document margin void setMarginUpper(FXint mgn,FXbool notify=FALSE); FXint getMarginUpper() const { return marginUpper; } /// Change/return first line indent void setIndentFirst(FXint ind,FXbool notify=FALSE); FXint getIndentFirst() const { return indentFirst; } /// Change/return lower indent void setIndentLower(FXint ind,FXbool notify=FALSE); FXint getIndentLower() const { return indentLower; } /// Change/return upper indent void setIndentUpper(FXint ind,FXbool notify=FALSE); FXint getIndentUpper() const { return indentUpper; } /// Change/return document number placement void setNumberTicks(FXint ticks,FXbool notify=FALSE); FXint getNumberTicks() const { return numberTicks; } /// Change/return document major ticks void setMajorTicks(FXint ticks,FXbool notify=FALSE); FXint getMajorTicks() const { return majorTicks; } /// Change/return document medium ticks void setMediumTicks(FXint ticks,FXbool notify=FALSE); FXint getMediumTicks() const { return mediumTicks; } /// Change/return document tiny ticks void setTinyTicks(FXint ticks,FXbool notify=FALSE); FXint getTinyTicks() const { return tinyTicks; } /// Change/return pixel per tick spacing void setPixelPerTick(FXdouble space,FXbool notify=FALSE); FXdouble getPixelPerTick() const { return pixelPerTick; } /// Set the text font void setFont(FXFont *fnt,FXbool notify=FALSE); /// Get the text font FXFont* getFont() const { return font; } /// Change arrow value, relative to document position void setValue(FXint value); /// Return arrow value in document FXint getValue() const { return arrowPos; } /// Set ruler style void setRulerStyle(FXuint style); /// Get ruler style FXuint getRulerStyle() const; /// Set ruler alignment void setRulerAlignment(FXuint alignment,FXbool notify=FALSE); /// Get ruler alignment FXuint getRulerAlignment() const; /// Get the current text color FXColor getTextColor() const { return textColor; } /// Set the current text color void setTextColor(FXColor clr); /// Set the status line help text for the ruler void setHelpText(const FXString& text){ help=text; } /// Get the status line help text for the ruler const FXString& getHelpText() const { return help; } /// Set the tool tip message for the ruler void setTipText(const FXString& text){ tip=text; } /// Get the tool tip message for the ruler const FXString& getTipText() const { return tip; } /// Save label to a stream virtual void save(FXStream& store) const; /// Load label from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXRuler(); }; } #endif fox1.6-1.6.57/include/FXRulerView.h000066400000000000000000000210311326741342000166100ustar00rootroot00000000000000/******************************************************************************** * * * R u l e r V i e w W i d g e t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRulerView.h,v 1.15 2006/01/28 20:29:30 fox Exp $ * ********************************************************************************/ #ifndef FXRULERVIEW_H #define FXRULERVIEW_H #ifndef FXSCROLLAREA_H #include "FXScrollArea.h" #endif namespace FX { class FXRuler; class FXFrame; /** * The Ruler View provides viewing of a document with rulers. * It is intended to be subclassed in order to draw actual contents * and provide editing behavior for the document. * The ruler view itself simply manages the geometry of the document * being edited, and coordinates the movement of the ruler displays * as the document is being scrolled. */ class FXRulerView : public FXScrollArea { FXDECLARE(FXRulerView) protected: FXRuler *hruler; // Horizontal ruler FXRuler *vruler; // Vertical ruler FXFrame *filler; // Corner thingy FXColor docColor; // Color of document FXString tip; // Tooltip text FXString help; // Help text protected: FXRulerView(); virtual void moveContents(FXint x,FXint y); virtual void drawBackground(FXDCWindow& dc); virtual void drawContents(FXDCWindow& dc); private: FXRulerView(const FXRulerView&); FXRulerView &operator=(const FXRulerView&); public: long onPaint(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onDocChanged(FXObject*,FXSelector,void*); public: enum { ID_HRULER=FXScrollArea::ID_LAST, ID_VRULER, ID_LAST }; public: /// Construct a rulerview window FXRulerView(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Return viewport height virtual FXint getViewportHeight(); /// Return viewport width virtual FXint getViewportWidth(); /// Return content width virtual FXint getContentWidth(); /// Return content height virtual FXint getContentHeight(); /// Perform layout virtual void layout(); /// Return a pointer to the horizontal ruler FXRuler* horizontalRuler() const { return hruler; } /// Return a pointer to the vertical ruler FXRuler* verticalRuler() const { return vruler; } /// Get document position X FXint getDocumentX() const; /// Get document position Y FXint getDocumentY() const; /// Set document width void setDocumentWidth(FXint w,FXbool notify=FALSE); /// Get document width FXint getDocumentWidth() const; /// Set document height void setDocumentHeight(FXint h,FXbool notify=FALSE); /// Get document height FXint getDocumentHeight() const; /// Set the current document color void setDocumentColor(FXColor clr); /// Get the current document color FXColor getDocumentColor() const { return docColor; } /// Change edge spacing around document void setHEdgeSpacing(FXint es,FXbool notify=FALSE); void setVEdgeSpacing(FXint es,FXbool notify=FALSE); /// Return edge spacing FXint getHEdgeSpacing() const; FXint getVEdgeSpacing() const; /// Change horizontal lower margin void setHMarginLower(FXint marg,FXbool notify=FALSE); /// Change horizontal upper margin void setHMarginUpper(FXint marg,FXbool notify=FALSE); /// Get horizontal lower margin FXint getHMarginLower() const; /// Get horizontal upper margin FXint getHMarginUpper() const; /// Change vertical lower margin void setVMarginLower(FXint marg,FXbool notify=FALSE); /// Change vertical upper margin void setVMarginUpper(FXint marg,FXbool notify=FALSE); /// Get vertical lower margin FXint getVMarginLower() const; /// Get vertical upper margin FXint getVMarginUpper() const; /// Set horizontal alignment; the default is RULER_ALIGN_NORMAL void setHAlignment(FXuint align,FXbool notify=FALSE); /// Return horizontal alignment FXuint getHAlignment() const; /// Set vertical alignment; the default is RULER_ALIGN_NORMAL void setVAlignment(FXuint align,FXbool notify=FALSE); /// Return vertical alignment FXuint getVAlignment() const; /// Set X arrow position, relative to document position void setArrowPosX(FXint x); /// Set X arrow position, relative to document position void setArrowPosY(FXint y); /// Get X arrow position in document FXint getArrowPosX() const; /// Get Y arrow position in document FXint getArrowPosY() const; /// Set the horizontal ruler font void setHRulerFont(FXFont *fnt,FXbool notify=FALSE); /// Get the horizontal ruler font FXFont* getHRulerFont() const; /// Set the vertical ruler font void setVRulerFont(FXFont *fnt,FXbool notify=FALSE); /// Get the vertical ruler font FXFont* getVRulerFont() const; /// Change document number placement void setHNumberTicks(FXint ticks,FXbool notify=FALSE); void setVNumberTicks(FXint ticks,FXbool notify=FALSE); /// Return document number placement FXint getHNumberTicks() const; FXint getVNumberTicks() const; /// Change document major ticks void setHMajorTicks(FXint ticks,FXbool notify=FALSE); void setVMajorTicks(FXint ticks,FXbool notify=FALSE); /// Return document major ticks FXint getHMajorTicks() const; FXint getVMajorTicks() const; /// Change document medium ticks void setHMediumTicks(FXint ticks,FXbool notify=FALSE); void setVMediumTicks(FXint ticks,FXbool notify=FALSE); /// Return document medium ticks FXint getHMediumTicks() const; FXint getVMediumTicks() const; /// Change document tiny ticks void setHTinyTicks(FXint ticks,FXbool notify=FALSE); void setVTinyTicks(FXint ticks,FXbool notify=FALSE); /// Return document tiny ticks FXint getHTinyTicks() const; FXint getVTinyTicks() const; /// Change pixel per tick spacing void setHPixelPerTick(FXdouble space,FXbool notify=FALSE); void setVPixelPerTick(FXdouble space,FXbool notify=FALSE); /// Return pixel per tick spacing FXdouble getHPixelPerTick() const; FXdouble getVPixelPerTick() const; /// Set ruler style void setHRulerStyle(FXuint style); void setVRulerStyle(FXuint style); /// Get ruler style FXuint getHRulerStyle() const; FXuint getVRulerStyle() const; /// Set the status line help text for the ruler view void setHelpText(const FXString& text){ help=text; } /// Get the status line help text for the ruler view const FXString& getHelpText() const { return help; } /// Set the tool tip message for the ruler view void setTipText(const FXString& text){ tip=text; } /// Get the tool tip message for the ruler view const FXString& getTipText() const { return tip; } /// Save list to a stream virtual void save(FXStream& store) const; /// Load list from a stream virtual void load(FXStream& store); /// Destroy virtual ~FXRulerView(); }; } #endif fox1.6-1.6.57/include/FXScrollArea.h000066400000000000000000000144651326741342000167300ustar00rootroot00000000000000/******************************************************************************** * * * S c r o l l A r e a W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXScrollArea.h,v 1.29 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSCROLLAREA_H #define FXSCROLLAREA_H #ifndef FXCOMPOSITE_H #include "FXComposite.h" #endif namespace FX { /// Scrollbar options enum { SCROLLERS_NORMAL = 0, /// Show the scrollbars when needed HSCROLLER_ALWAYS = 0x00008000, /// Always show horizontal scrollers HSCROLLER_NEVER = 0x00010000, /// Never show horizontal scrollers VSCROLLER_ALWAYS = 0x00020000, /// Always show vertical scrollers VSCROLLER_NEVER = 0x00040000, /// Never show vertical scrollers HSCROLLING_ON = 0, /// Horizontal scrolling turned on (default) HSCROLLING_OFF = HSCROLLER_NEVER|HSCROLLER_ALWAYS, /// Horizontal scrolling turned off VSCROLLING_ON = 0, /// Vertical scrolling turned on (default) VSCROLLING_OFF = VSCROLLER_NEVER|VSCROLLER_ALWAYS, /// Vertical scrolling turned off SCROLLERS_TRACK = 0, /// Scrollers track continuously for smooth scrolling SCROLLERS_DONT_TRACK = 0x00080000 /// Scrollers don't track continuously }; class FXScrollBar; class FXScrollCorner; /** * The scroll area widget manages a content area and a viewport * area through which the content is viewed. When the content area * becomes larger than the viewport area, scrollbars are placed to * permit viewing of the entire content by scrolling the content. * Depending on the mode, scrollbars may be displayed on an as-needed * basis, always, or never. * Normally, the scroll area's size and the content's size are independent; * however, it is possible to disable scrolling in the horizontal * (vertical) direction. In this case, the content width (height) * will influence the width (height) of the scroll area widget. * For content which is time-consuming to repaint, continuous * scrolling may be turned off. */ class FXAPI FXScrollArea : public FXComposite { FXDECLARE(FXScrollArea) protected: FXScrollBar *horizontal; // Horizontal scroll bar FXScrollBar *vertical; // Vertical scroll bar FXScrollCorner *corner; // Scroll corner FXint viewport_w; // Viewport width FXint viewport_h; // Viewport height FXint pos_x; // X scroll position (pos_x<=0) FXint pos_y; // Y scroll position (pos_y<=0) protected: FXScrollArea(); FXbool startAutoScroll(FXEvent *event,FXbool onlywheninside=FALSE); void stopAutoScroll(); FXScrollArea(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h); virtual void moveContents(FXint x,FXint y); private: FXScrollArea(const FXScrollArea&); FXScrollArea &operator=(const FXScrollArea&); public: long onHMouseWheel(FXObject*,FXSelector,void*); long onVMouseWheel(FXObject*,FXSelector,void*); long onHScrollerChanged(FXObject*,FXSelector,void*); long onVScrollerChanged(FXObject*,FXSelector,void*); long onHScrollerDragged(FXObject*,FXSelector,void*); long onVScrollerDragged(FXObject*,FXSelector,void*); long onAutoScroll(FXObject*,FXSelector,void*); public: /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /// Return viewport height virtual FXint getViewportHeight(); /// Return viewport width virtual FXint getViewportWidth(); /// Return content width virtual FXint getContentWidth(); /// Return content height virtual FXint getContentHeight(); /// Change scroll style void setScrollStyle(FXuint style); /// Return scroll style FXuint getScrollStyle() const; /// Return TRUE if horizontally scrollable FXbool isHorizontalScrollable() const; /// Return TRUE if vertically scrollable FXbool isVerticalScrollable() const; /// Return a pointer to the horizontal scrollbar FXScrollBar* horizontalScrollBar() const { return horizontal; } /// Return a pointer to the vertical scrollbar FXScrollBar* verticalScrollBar() const { return vertical; } /// Return the current x-position FXint getXPosition() const { return pos_x; } /// Return the current y-position FXint getYPosition() const { return pos_y; } /// Set the current position void setPosition(FXint x,FXint y); /// Get the current position void getPosition(FXint& x,FXint& y) const { x=pos_x; y=pos_y; } /// Destructor virtual ~FXScrollArea(); }; } #endif fox1.6-1.6.57/include/FXScrollBar.h000066400000000000000000000201171326741342000165530ustar00rootroot00000000000000/******************************************************************************** * * * S c r o l l B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXScrollBar.h,v 1.15 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSCROLLBAR_H #define FXSCROLLBAR_H #ifndef FXWINDOW_H #include "FXWindow.h" #endif namespace FX { /// ScrollBar styles enum { SCROLLBAR_VERTICAL = 0, /// Vertically oriented SCROLLBAR_HORIZONTAL = 0x00020000, /// Horizontally oriented SCROLLBAR_WHEELJUMP = 0x00040000 /// Mouse wheel jumps instead of sliding smoothly }; /** * The scroll bar is used when a document has a larger content than may be made * visible. The range is the total size of the document, the page is the part * of the document which is visible. The size of the scrollbar thumb is adjusted * to give feedback of the relative sizes of each. * The scroll bar may be manipulated by the left mouse button (normal scrolling), by the * middle mouse button (same as the left mouse only the scroll position can jump to the * place where the click is made), or by the right mouse button (vernier- or fine-scrolling). * Holding down the control key while scrolling with the left or middle mouse button also * enables vernier-scrolling mode. The vernier-scrolling mode is very useful for accurate * positioning in large documents. * Finally, if the mouse sports a wheel, the scroll bar can be manipulated by means * of the mouse wheel as well. Holding down the Control-key during wheel motion * will cause the scrolling to go faster than normal. * While moving the scroll bar, a message of type SEL_CHANGED will be sent to the * target, and the message data will reflect the current position of type FXint. * At the end of the interaction, the scroll bar will send a message of type * SEL_COMMAND to notify the target of the final position. */ class FXAPI FXScrollBar : public FXWindow { FXDECLARE(FXScrollBar) protected: FXint range; // Scrollable range FXint page; // Page size FXint line; // Line size FXint pos; // Position FXint barsize; // Bar size FXint thumbsize; // Thumb size FXint thumbpos; // Thumb position FXColor hiliteColor; // Hightlight color FXColor shadowColor; // Shadow color FXColor borderColor; // Border color FXColor arrowColor; // Arrow color FXint dragpoint; // Point where grabbed FXuchar mode; // Current mode of control protected: FXScrollBar(); void drawButton(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXbool down); void drawLeftArrow(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXbool down); void drawRightArrow(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXbool down); void drawUpArrow(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXbool down); void drawDownArrow(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXbool down); protected: enum { MODE_NONE, MODE_INC, MODE_DEC, MODE_PAGE_INC, MODE_PAGE_DEC, MODE_DRAG, MODE_FINE_DRAG }; private: FXScrollBar(const FXScrollBar&); FXScrollBar &operator=(const FXScrollBar&); public: long onPaint(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMiddleBtnPress(FXObject*,FXSelector,void*); long onMiddleBtnRelease(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onTimeWheel(FXObject*,FXSelector,void*); long onAutoScroll(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetIntRange(FXObject*,FXSelector,void*); long onCmdGetIntRange(FXObject*,FXSelector,void*); public: enum{ ID_TIMEWHEEL=FXWindow::ID_LAST, ID_AUTOSCROLL, ID_LAST }; public: /// Construct scroll bar FXScrollBar(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=SCROLLBAR_VERTICAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /// Set content size range void setRange(FXint r); /// Return content size range FXint getRange() const { return range; } /// Set viewport page size void setPage(FXint p); /// Return page size FXint getPage() const { return page; } /// Set scoll increment for line void setLine(FXint l); /// Return line increment FXint getLine() const { return line; } /// Change scroll position void setPosition(FXint p); /// Return current scroll position FXint getPosition() const { return pos; } /// Change highlight color void setHiliteColor(FXColor clr); /// Return highlight color FXColor getHiliteColor() const { return hiliteColor; } /// Change the shadow color void setShadowColor(FXColor clr); /// Return the shadow color FXColor getShadowColor() const { return shadowColor; } /// Change the border color void setBorderColor(FXColor clr); /// Return the border color FXColor getBorderColor() const { return borderColor; } /// Change the arrow color void setArrowColor(FXColor clr); /// Return the arrow color FXColor getArrowColor() const { return arrowColor; } /// Change the scrollbar style void setScrollBarStyle(FXuint style); /// Return the scrollbar style FXuint getScrollBarStyle() const; /// Change the bar size void setBarSize(FXint size); /// Return the bar size FXint getBarSize() const { return barsize; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destructor virtual ~FXScrollBar(); }; /// Corner between scroll bars class FXAPI FXScrollCorner : public FXWindow { FXDECLARE(FXScrollCorner) protected: FXScrollCorner(); private: FXScrollCorner(const FXScrollCorner&); FXScrollCorner &operator=(const FXScrollCorner&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Constructor FXScrollCorner(FXComposite* p); /// Can not be enabled virtual void enable(); /// Can not be disabled virtual void disable(); }; } #endif fox1.6-1.6.57/include/FXScrollPane.h000066400000000000000000000067531326741342000167440ustar00rootroot00000000000000/******************************************************************************** * * * S c r o l l i n g M e n u P a n e W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXScrollPane.h,v 1.10 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSCROLLPANE_H #define FXSCROLLPANE_H #ifndef FXMENUPANE_H #include "FXMenuPane.h" #endif namespace FX { class FXArrowButton; /** * A Scroll Pane is a menu pane which provides scrolling of menu entries. * It is useful when menus are populated programmatically and it is not * known in advance how many entries will be added. */ class FXAPI FXScrollPane : public FXMenuPane { FXDECLARE(FXScrollPane) protected: FXArrowButton *dn; // Button to scroll down FXArrowButton *up; // Button to scroll up FXint visible; // Visible entries FXint top; // Top visible entry protected: FXScrollPane(); private: FXScrollPane(const FXScrollPane&); FXScrollPane &operator=(const FXScrollPane&); public: long onCmdIncrement(FXObject*,FXSelector,void*); long onCmdDecrement(FXObject*,FXSelector,void*); public: enum { ID_SCROLL_DN=FXMenuPane::ID_LAST, ID_SCROLL_UP, ID_LAST }; public: /// Construct menu pane FXScrollPane(FXWindow* owner,FXint nvis,FXuint opts=0); /// Return the default width of this window virtual FXint getDefaultWidth(); /// Return the default height of this window virtual FXint getDefaultHeight(); /// Show this window virtual void show(); /// Perform layout virtual void layout(); /// Return number of visible items FXint getNumVisible() const { return visible; } /// Change the number of visible items void setNumVisible(FXint nvis); /// Get index of top most menu item FXint getTopItem() const { return top; } /// Scroll item to top void setTopItem(FXint t); /// Destroy virtual ~FXScrollPane(); }; } #endif fox1.6-1.6.57/include/FXScrollWindow.h000066400000000000000000000071071326741342000173220ustar00rootroot00000000000000/******************************************************************************** * * * S c r o l l W i n d o w W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXScrollWindow.h,v 1.21 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSCROLLWINDOW_H #define FXSCROLLWINDOW_H #ifndef FXSCROLLAREA_H #include "FXScrollArea.h" #endif namespace FX { /** * The scroll window widget scrolls an arbitrary child window. * Use the scroll window when parts of the user interface itself * need to be scrolled, for example when applications need to run * on small screens. The scroll window observes some layout hints of * its content-window; it observes LAYOUT_FIX_WIDTH, LAYOUT_FIX_HEIGHT * at all times. The hints LAYOUT_FILL_X, LAYOUT_LEFT, LAYOUT_RIGHT, * LAYOUT_CENTER_X, as well as LAYOUT_FILL_Y, LAYOUT_TOP, LAYOUT_BOTTOM, * LAYOUT_CENTER_Y are however only interpreted if the content size * is smaller than the viewport size, because if the content size is * larger than the viewport size, then content must be scrolled. * Note that this means that the content window's position is not * necessarily equal to the scroll position of the scroll window! */ class FXAPI FXScrollWindow : public FXScrollArea { FXDECLARE(FXScrollWindow) protected: FXScrollWindow(){} virtual void moveContents(FXint x,FXint y); private: FXScrollWindow(const FXScrollWindow&); FXScrollWindow &operator=(const FXScrollWindow&); public: long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onFocusSelf(FXObject*,FXSelector,void*); public: /// Construct a scroll window FXScrollWindow(FXComposite* p,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Perform layout virtual void layout(); /// Return a pointer to the contents window FXWindow* contentWindow() const; /// Return the width of the contents virtual FXint getContentWidth(); /// Return the height of the contents virtual FXint getContentHeight(); }; } #endif fox1.6-1.6.57/include/FXSearchDialog.h000066400000000000000000000046731326741342000172260ustar00rootroot00000000000000/******************************************************************************** * * * T e x t S e a r c h D i a l o g * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSearchDialog.h,v 1.23 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSEARCHDIALOG_H #define FXSEARCHDIALOG_H #ifndef FXREPLACEDIALOG_H #include "FXReplaceDialog.h" #endif namespace FX { /// Text search dialog class FXAPI FXSearchDialog : public FXReplaceDialog { FXDECLARE(FXSearchDialog) protected: FXSearchDialog(){} private: FXSearchDialog(const FXSearchDialog&); FXSearchDialog &operator=(const FXSearchDialog&); public: /// Construct search dialog box FXSearchDialog(FXWindow* owner,const FXString& caption,FXIcon* ic=NULL,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Destructor virtual ~FXSearchDialog(); }; } #endif fox1.6-1.6.57/include/FXSeparator.h000066400000000000000000000103461326741342000166330ustar00rootroot00000000000000/******************************************************************************** * * * S e p a r a t o r W i d g e t s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSeparator.h,v 1.18 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSEPARATOR_H #define FXSEPARATOR_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// Separator Options enum { SEPARATOR_NONE = 0, /// Nothing visible SEPARATOR_GROOVE = 0x00008000, /// Etched-in looking groove SEPARATOR_RIDGE = 0x00010000, /// Embossed looking ridge SEPARATOR_LINE = 0x00020000 /// Simple line }; /** * A Separator widget is used to draw a horizontal or vertical divider between * groups of controls. It is purely decorative. The separator may be drawn * in various styles as determined by the SEPARATOR_NONE, SEPARATOR_GROOVE, * SEPARATOR_RIDGE, and SEPARATOR_LINE options. Since its derived from Frame, * it can also have the frame's border styles. */ class FXAPI FXSeparator : public FXFrame { FXDECLARE(FXSeparator) protected: FXSeparator(){} private: FXSeparator(const FXSeparator&); FXSeparator &operator=(const FXSeparator&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Constructor FXSeparator(FXComposite* p,FXuint opts=SEPARATOR_GROOVE|LAYOUT_FILL_X,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=0,FXint pr=0,FXint pt=0,FXint pb=0); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Change separator style void setSeparatorStyle(FXuint style); /// Get separator style FXuint getSeparatorStyle() const; }; /// Horizontal separator widget class FXAPI FXHorizontalSeparator : public FXSeparator { FXDECLARE(FXHorizontalSeparator) protected: FXHorizontalSeparator(){} private: FXHorizontalSeparator(const FXHorizontalSeparator&); FXHorizontalSeparator &operator=(const FXHorizontalSeparator&); public: /// Constructor FXHorizontalSeparator(FXComposite* p,FXuint opts=SEPARATOR_GROOVE|LAYOUT_FILL_X,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=1,FXint pr=1,FXint pt=0,FXint pb=0); }; /// Vertical separator widget class FXAPI FXVerticalSeparator : public FXSeparator { FXDECLARE(FXVerticalSeparator) protected: FXVerticalSeparator(){} private: FXVerticalSeparator(const FXVerticalSeparator&); FXVerticalSeparator &operator=(const FXVerticalSeparator&); public: /// Constructor FXVerticalSeparator(FXComposite* p,FXuint opts=SEPARATOR_GROOVE|LAYOUT_FILL_Y,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=0,FXint pr=0,FXint pt=1,FXint pb=1); }; } #endif fox1.6-1.6.57/include/FXSettings.h000066400000000000000000000142241326741342000164720ustar00rootroot00000000000000/******************************************************************************** * * * S e t t i n g s C l a s s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSettings.h,v 1.33 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSETTINGS_H #define FXSETTINGS_H #ifndef FXDICT_H #include "FXDict.h" #endif namespace FX { class FXStringDict; /** * The Settings class manages a key-value database. This is normally used as * part of Registry, but can also be used separately in applications that need * to maintain a key-value database in a file of their own. * String values can contain any character, and will be escaped when written * to the file. */ class FXAPI FXSettings : public FXDict { FXDECLARE(FXSettings) protected: bool modified; protected: virtual void *createData(const void*); virtual void deleteData(void*); FXchar* dequote(FXchar* text) const; FXchar* enquote(FXchar* result,const FXchar* text); FXStringDict* insert(const FXchar* ky){ return (FXStringDict*)FXDict::insert(ky,NULL); } FXStringDict* replace(const FXchar* ky,FXStringDict* section){ return (FXStringDict*)FXDict::replace(ky,section,true); } FXStringDict* remove(const FXchar* ky){ return (FXStringDict*)FXDict::remove(ky); } public: /// Construct settings database. FXSettings(); /// Construct copy of existing database. FXSettings(const FXSettings& orig); /// Assignment operator FXSettings &operator=(const FXSettings& orig); /// Parse a file containing a settings database. bool parseFile(const FXString& filename,bool mark); /// Unparse settings database into given file. bool unparseFile(const FXString& filename); /// Obtain the string dictionary for the given section FXStringDict* data(FXuint pos) const { return (FXStringDict*)FXDict::data(pos); } /// Find string dictionary for the given section; may be NULL FXStringDict* find(const FXchar *section) const { return (FXStringDict*)FXDict::find(section); } /// Read a formatted registry entry, using scanf-style format FXint readFormatEntry(const FXchar *section,const FXchar *key,const FXchar *fmt,...) FX_SCANF(4,5) ; /// Read a string registry entry; if no value is found, the default value def is returned const FXchar *readStringEntry(const FXchar *section,const FXchar *key,const FXchar *def=NULL); /// Read a integer registry entry; if no value is found, the default value def is returned FXint readIntEntry(const FXchar *section,const FXchar *key,FXint def=0); /// Read a unsigned integer registry entry; if no value is found, the default value def is returned FXuint readUnsignedEntry(const FXchar *section,const FXchar *key,FXuint def=0); /// Read a double-precision floating point registry entry; if no value is found, the default value def is returned FXdouble readRealEntry(const FXchar *section,const FXchar *key,FXdouble def=0.0); /// Read a color value registry entry; if no value is found, the default value def is returned FXColor readColorEntry(const FXchar *section,const FXchar *key,FXColor def=0); /// Read a boolean registry entry FXbool readBoolEntry(const FXchar *section,const FXchar *key,FXbool def=FALSE); /// Write a formatted registry entry, using printf-style format FXint writeFormatEntry(const FXchar *section,const FXchar *key,const FXchar *fmt,...) FX_PRINTF(4,5) ; /// Write a string registry entry bool writeStringEntry(const FXchar *section,const FXchar *key,const FXchar *val); /// Write a integer registry entry bool writeIntEntry(const FXchar *section,const FXchar *key,FXint val); /// Write a unsigned integer registry entry bool writeUnsignedEntry(const FXchar *section,const FXchar *key,FXuint val); /// Write a double-precision floating point registry entry bool writeRealEntry(const FXchar *section,const FXchar *key,FXdouble val); /// Write a color value entry bool writeColorEntry(const FXchar *section,const FXchar *key,FXColor val); /// Write a boolean value entry bool writeBoolEntry(const FXchar *section,const FXchar *key,FXbool val); /// Delete a registry entry bool deleteEntry(const FXchar *section,const FXchar *key); /// See if entry exists bool existingEntry(const FXchar *section,const FXchar *key); /// Delete section bool deleteSection(const FXchar *section); /// See if section exists bool existingSection(const FXchar *section); /// Clear all sections bool clear(); /// Mark as changed void setModified(bool mdfy=true){ modified=mdfy; } /// Is it modified bool isModified() const { return modified; } /// Cleanup virtual ~FXSettings(); }; } #endif fox1.6-1.6.57/include/FXShell.h000066400000000000000000000060621326741342000157420ustar00rootroot00000000000000/******************************************************************************** * * * S h e l l W i n d o w W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXShell.h,v 1.31 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSHELL_H #define FXSHELL_H #ifndef FXCOMPOSITE_H #include "FXComposite.h" #endif namespace FX { /** * The Shell widget is used as the base class for top level windows, i.e. * windows which are direct children of the root window. */ class FXAPI FXShell : public FXComposite { FXDECLARE(FXShell) protected: FXShell(){} FXShell(FXApp* a,FXuint opts,FXint x,FXint y,FXint w,FXint h); FXShell(FXWindow* own,FXuint opts,FXint x,FXint y,FXint w,FXint h); private: FXShell(const FXShell&); FXShell &operator=(const FXShell&); public: long onLayout(FXObject*,FXSelector,void*); long onConfigure(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onFocusNext(FXObject*,FXSelector,void*); long onFocusPrev(FXObject*,FXSelector,void*); public: enum { ID_LAYOUT=FXComposite::ID_LAST, ID_LAST }; public: /// Create server-side resources virtual void create(); /// Mark this window's layout as dirty virtual void recalc(); /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Destroy shell virtual ~FXShell(); }; } #endif fox1.6-1.6.57/include/FXShutter.h000066400000000000000000000133331326741342000163300ustar00rootroot00000000000000/******************************************************************************** * * * S h u t t e r C o n t a i n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Charles W. Warren. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXShutter.h,v 1.26 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSHUTTER_H #define FXSHUTTER_H #ifndef FXVERTICALFRAME_H #include "FXVerticalFrame.h" #endif namespace FX { class FXShutter; class FXButton; class FXScrollWindow; class FXShutterItem; /** * A Shutter Item is a panel which is embedded inside a Shutter Widget. * It can contain other user interface widgets which can be added under * the content widget. The content widget is itself embedded in a scroll * window to allow unlimited room for all the contents. */ class FXAPI FXShutterItem : public FXVerticalFrame { FXDECLARE(FXShutterItem) friend class FXShutter; protected: FXButton *button; FXScrollWindow *scrollWindow; FXVerticalFrame *content; protected: FXShutterItem(){} private: FXShutterItem(const FXShutterItem&); FXShutterItem &operator=(const FXShutterItem&); public: long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onCmdButton(FXObject*,FXSelector,void*); public: enum{ ID_SHUTTERITEM_BUTTON=FXVerticalFrame::ID_LAST, ID_LAST }; public: /// Constructor FXShutterItem(FXShutter *p,const FXString& text=FXString::null,FXIcon* icon=NULL,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_SPACING,FXint pr=DEFAULT_SPACING,FXint pt=DEFAULT_SPACING,FXint pb=DEFAULT_SPACING,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Return a pointer to the button for this item FXButton* getButton() const { return button; } /// Return a pointer to the contents for this item FXVerticalFrame* getContent() const { return content; } /// Set the status line help text for this item void setHelpText(const FXString& text); /// Get the status line help text for this item FXString getHelpText() const; /// Set the tool tip message for this item void setTipText(const FXString& text); /// Get the tool tip message for this item FXString getTipText() const; /// Destructor virtual ~FXShutterItem(); }; /** * The Shutter widget provides a set of foldable sub panels. Each subpanel * consists of a Shutter Item which contains a button and some contents. * A sub panel can be unfolded by pressing on that panel's button. */ class FXAPI FXShutter : public FXVerticalFrame { FXDECLARE(FXShutter) friend class FXShutterItem; protected: FXint current; // Item currently open FXint closing; // Item closing down FXint heightIncrement; // Height delta FXint closingHeight; // Closing items current height FXbool closingHadScrollbar; // Closing item had a scroll bar protected: FXShutter(){} private: FXShutter(const FXShutter&); FXShutter &operator=(const FXShutter&); public: long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onTimeout(FXObject*,FXSelector,void*); long onOpenItem(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdOpen(FXObject*,FXSelector,void*); long onUpdOpen(FXObject*,FXSelector,void*); public: enum{ ID_SHUTTER_TIMEOUT=FXVerticalFrame::ID_LAST, ID_OPEN_SHUTTERITEM, ID_OPEN_FIRST, ID_OPEN_LAST=ID_OPEN_FIRST+1000, ID_LAST }; public: /// Constructor FXShutter(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_SPACING,FXint pr=DEFAULT_SPACING,FXint pt=DEFAULT_SPACING,FXint pb=DEFAULT_SPACING,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Perform layout virtual void layout(); /// Set the currently displayed item (panel = 0, 1, 2, ..., npanels-1) virtual void setCurrent(FXint panel); /// Return the index of the currently displayed item FXint getCurrent() const { return current; } /// Destructor virtual ~FXShutter(); }; } #endif fox1.6-1.6.57/include/FXSize.h000066400000000000000000000107571326741342000156130ustar00rootroot00000000000000/******************************************************************************** * * * S i z e C l a s s * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSize.h,v 1.15 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSIZE_H #define FXSIZE_H namespace FX { /// Size class FXAPI FXSize { public: FXshort w; FXshort h; public: /// Constructors FXSize(){ } FXSize(const FXSize& s):w(s.w),h(s.h){ } FXSize(FXshort ww,FXshort hh):w(ww),h(hh){ } /// Test if empty bool empty() const { return w<=0 || h<=0; } /// Test if zero bool operator!() const { return w==0 && h==0; } /// Equality bool operator==(const FXSize& s) const { return w==s.w && h==s.h; } bool operator!=(const FXSize& s) const { return w!=s.w || h!=s.h; } /// Grow by amount FXSize& grow(FXshort margin); FXSize& grow(FXshort hormargin,FXshort vermargin); FXSize& grow(FXshort leftmargin,FXshort rightmargin,FXshort topmargin,FXshort bottommargin); /// Shrink by amount FXSize& shrink(FXshort margin); FXSize& shrink(FXshort hormargin,FXshort vermargin); FXSize& shrink(FXshort leftmargin,FXshort rightmargin,FXshort topmargin,FXshort bottommargin); /// Assignment FXSize& operator=(const FXSize& s){ w=s.w; h=s.h; return *this; } /// Set value from another size FXSize& set(const FXSize& s){ w=s.w; h=s.h; return *this; } /// Set value from components FXSize& set(FXshort ww,FXshort hh){ w=ww; h=hh; return *this; } /// Assignment operators FXSize& operator+=(const FXSize& s){ w+=s.w; h+=s.h; return *this; } FXSize& operator-=(const FXSize& s){ w-=s.w; h-=s.h; return *this; } FXSize& operator*=(FXshort c){ w*=c; h*=c; return *this; } FXSize& operator/=(FXshort c){ w/=c; h/=c; return *this; } /// Negation FXSize operator-(){ return FXSize(-w,-h); } /// Addition operators FXSize operator+(const FXSize& s) const { return FXSize(w+s.w,h+s.h); } FXSize operator-(const FXSize& s) const { return FXSize(w-s.w,h-s.h); } /// Scale operators friend inline FXSize operator*(const FXSize& s,FXshort c); friend inline FXSize operator*(FXshort c,const FXSize& s); friend inline FXSize operator/(const FXSize& s,FXshort c); friend inline FXSize operator/(FXshort c,const FXSize& s); /// Save object to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXSize& s); /// Load object from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXSize& s); }; inline FXSize operator*(const FXSize& s,FXshort c){ return FXSize(s.w*c,s.h*c); } inline FXSize operator*(FXshort c,const FXSize& s){ return FXSize(c*s.w,c*s.h); } inline FXSize operator/(const FXSize& s,FXshort c){ return FXSize(s.w/c,s.h/c); } inline FXSize operator/(FXshort c,const FXSize& s){ return FXSize(c/s.w,c/s.h); } extern FXAPI FXStream& operator<<(FXStream& store,const FXSize& s); extern FXAPI FXStream& operator>>(FXStream& store,FXSize& s); } #endif fox1.6-1.6.57/include/FXSlider.h000066400000000000000000000205141326741342000161130ustar00rootroot00000000000000/******************************************************************************** * * * S l i d e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSlider.h,v 1.44 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSLIDER_H #define FXSLIDER_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// Slider Control styles enum { SLIDER_HORIZONTAL = 0, /// Slider shown horizontally SLIDER_VERTICAL = 0x00008000, /// Slider shown vertically SLIDER_ARROW_UP = 0x00010000, /// Slider has arrow head pointing up SLIDER_ARROW_DOWN = 0x00020000, /// Slider has arrow head pointing down SLIDER_ARROW_LEFT = SLIDER_ARROW_UP, /// Slider has arrow head pointing left SLIDER_ARROW_RIGHT = SLIDER_ARROW_DOWN, /// Slider has arrow head pointing right SLIDER_INSIDE_BAR = 0x00040000, /// Slider is inside the slot rather than overhanging SLIDER_TICKS_TOP = 0x00080000, /// Ticks on the top of horizontal slider SLIDER_TICKS_BOTTOM = 0x00100000, /// Ticks on the bottom of horizontal slider SLIDER_TICKS_LEFT = SLIDER_TICKS_TOP, /// Ticks on the left of vertical slider SLIDER_TICKS_RIGHT = SLIDER_TICKS_BOTTOM, /// Ticks on the right of vertical slider SLIDER_NORMAL = SLIDER_HORIZONTAL }; /** * The slider widget is a valuator widget which provides simple linear value range. * Two visual appearances are supported:- the sunken look, which is enabled with * the SLIDER_INSIDE_BAR option and the regular look. The latter may have optional * arrows on the slider thumb. * While being moved, the slider sends a SEL_CHANGED message to its target; * at the end of the interaction, a SEL_COMMAND message is sent. * The message data represents the current slider value, of type FXint. */ class FXAPI FXSlider : public FXFrame { FXDECLARE(FXSlider) protected: FXint range[2]; // Reported data range FXint pos; // Reported data position FXint incr; // Increment when auto-sliding FXint delta; // Interval between ticks FXint headpos; // Head position FXint headsize; // Head size FXint slotsize; // Slot size FXColor slotColor; // Color of slot the head moves in FXint dragpoint; // Where the head is grabbed FXString help; // Help string FXString tip; // Tip string protected: FXSlider(); void drawSliderHead(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawHorzTicks(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawVertTicks(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); private: FXSlider(const FXSlider&); FXSlider &operator=(const FXSlider&); public: long onPaint(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMiddleBtnPress(FXObject*,FXSelector,void*); long onMiddleBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onAutoSlide(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetRealValue(FXObject*,FXSelector,void*); long onCmdGetRealValue(FXObject*,FXSelector,void*); long onCmdSetIntRange(FXObject*,FXSelector,void*); long onCmdGetIntRange(FXObject*,FXSelector,void*); long onCmdSetRealRange(FXObject*,FXSelector,void*); long onCmdGetRealRange(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: enum{ ID_AUTOSLIDE=FXFrame::ID_LAST, ID_LAST }; public: /// Construct a slider widget FXSlider(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=SLIDER_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=0,FXint pr=0,FXint pt=0,FXint pb=0); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Returns true because a slider can receive focus virtual bool canFocus() const; /// Perform layout virtual void layout(); /// Enable the slider virtual void enable(); /// Disable the slider virtual void disable(); /// Change slider value void setValue(FXint value,FXbool notify=FALSE); /// Return slider value FXint getValue() const { return pos; } /// Change the slider's range void setRange(FXint lo,FXint hi,FXbool notify=FALSE); /// Get the slider's current range void getRange(FXint& lo,FXint& hi) const { lo=range[0]; hi=range[1]; } /// Change the slider style FXuint getSliderStyle() const; /// Get the current slider style void setSliderStyle(FXuint style); /// Get the slider's head size FXint getHeadSize() const { return headsize; } /// Change the slider's head size void setHeadSize(FXint hs); /// Get the slider's current slot size FXint getSlotSize() const { return slotsize; } /// Change the slider's slot size void setSlotSize(FXint bs); /// Get the slider's auto-increment/decrement value FXint getIncrement() const { return incr; } /// Change the slider's auto-increment/decrement value void setIncrement(FXint inc); /// Change the delta between ticks void setTickDelta(FXint dist); /// Get delta between ticks FXint getTickDelta() const { return delta; } /// Change the color of the slot the slider head moves in void setSlotColor(FXColor clr); /// Get the current slot color FXColor getSlotColor() const { return slotColor; } /// Set the help text to be displayed on the status line void setHelpText(const FXString& text){ help=text; } /// Get the current help text const FXString& getHelpText() const { return help; } /// Set the tip text to be displayed in the tooltip void setTipText(const FXString& text){ tip=text; } /// Get the current tooltip text value const FXString& getTipText() const { return tip; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy the slider virtual ~FXSlider(); }; } #endif fox1.6-1.6.57/include/FXSocket.h000066400000000000000000000053471326741342000161300ustar00rootroot00000000000000/******************************************************************************** * * * S o c k e t C l a s s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSocket.h,v 1.6 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSOCKET_H #define FXSOCKET_H #ifndef FXIO_H #include "FXIO.h" #endif //////////////////////////// UNDER DEVELOPMENT //////////////////////////////// namespace FX { /** * Socket i/o device. */ class FXAPI FXSocket : public FXIO { private: FXSocket(const FXSocket&); FXSocket &operator=(const FXSocket&); public: /// Construct socket FXSocket(){ } /// Construct file and attach existing handle h FXSocket(FXInputHandle handle,FXuint mode); /// Open device with access mode and handle virtual bool open(FXInputHandle handle,FXuint mode); /// Read block of bytes, returning number of bytes read virtual FXival readBlock(void* data,FXival count); /// Write block of bytes, returning number of bytes written virtual FXival writeBlock(const void* data,FXival count); /// Close socket virtual bool close(); /// Destroy virtual ~FXSocket(); }; } #endif fox1.6-1.6.57/include/FXSphered.h000066400000000000000000000127421326741342000162670ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n S p h e r e C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSphered.h,v 1.17 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSPHERED_H #define FXSPHERED_H namespace FX { class FXRanged; /// Spherical bounds class FXAPI FXSphered { public: FXVec3d center; FXdouble radius; public: /// Default constructor FXSphered(){} /// Copy constructor FXSphered(const FXSphered& sphere):center(sphere.center),radius(sphere.radius){} /// Initialize from center and radius FXSphered(const FXVec3d& cen,FXdouble rad=0.0):center(cen),radius(rad){} /// Initialize from center and radius FXSphered(FXdouble x,FXdouble y,FXdouble z,FXdouble rad=0.0):center(x,y,z),radius(rad){} /// Initialize sphere to fully contain the given bounding box FXSphered(const FXRanged& bounds); /// Assignment FXSphered& operator=(const FXSphered& sphere){ center=sphere.center; radius=sphere.radius; return *this; } /// Set value from another sphere FXSphered& set(const FXSphered& sphere){ center=sphere.center; radius=sphere.radius; return *this; } /// Set value from center and radius FXSphered& set(const FXVec3d& cen,FXdouble rad){ center=cen; radius=rad; return *this; } /// Set value from center and radius FXSphered& set(FXdouble x,FXdouble y,FXdouble z,FXdouble rad){ center.set(x,y,z); radius=rad; return *this; } /// Comparison bool operator==(const FXSphered& s) const { return center==s.center && radius==s.radius;} bool operator!=(const FXSphered& s) const { return center!=s.center || radius!=s.radius;} /// Diameter of sphere FXdouble diameter() const { return radius*2.0; } /// Test if empty bool empty() const { return radius<0.0; } /// Test if sphere contains point x,y,z bool contains(FXdouble x,FXdouble y,FXdouble z) const; /// Test if sphere contains point p bool contains(const FXVec3d& p) const; /// Test if sphere contains another box bool contains(const FXRanged& box) const; /// Test if sphere contains another sphere bool contains(const FXSphered& sphere) const; /// Include point FXSphered& include(FXdouble x,FXdouble y,FXdouble z); /// Include point FXSphered& include(const FXVec3d& p); /// Expand radius to include point FXSphered& includeInRadius(FXdouble x,FXdouble y,FXdouble z); /// Expand radius to include point FXSphered& includeInRadius(const FXVec3d& p); /// Include given range into this one FXSphered& include(const FXRanged& box); /// Expand radius to include box FXSphered& includeInRadius(const FXRanged& box); /// Include given sphere into this one FXSphered& include(const FXSphered& sphere); /// Expand radius to include sphere FXSphered& includeInRadius(const FXSphered& sphere); /// Intersect sphere with normalized plane ax+by+cz+w; returns -1,0,+1 FXint intersect(const FXVec4d& plane) const; /// Intersect sphere with ray u-v bool intersect(const FXVec3d& u,const FXVec3d& v) const; /// Test if box overlaps with sphere friend FXAPI bool overlap(const FXRanged& a,const FXSphered& b); /// Test if sphere overlaps with box friend FXAPI bool overlap(const FXSphered& a,const FXRanged& b); /// Test if spheres overlap friend FXAPI bool overlap(const FXSphered& a,const FXSphered& b); /// Save object to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXSphered& sphere); /// Load object from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXSphered& sphere); }; extern FXAPI bool overlap(const FXRanged& a,const FXSphered& b); extern FXAPI bool overlap(const FXSphered& a,const FXRanged& b); extern FXAPI bool overlap(const FXSphered& a,const FXSphered& b); extern FXAPI FXStream& operator<<(FXStream& store,const FXSphered& sphere); extern FXAPI FXStream& operator>>(FXStream& store,FXSphered& sphere); } #endif fox1.6-1.6.57/include/FXSpheref.h000066400000000000000000000127421326741342000162710ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n S p h e r e C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSpheref.h,v 1.18 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSPHEREF_H #define FXSPHEREF_H namespace FX { class FXRangef; /// Spherical bounds class FXAPI FXSpheref { public: FXVec3f center; FXfloat radius; public: /// Default constructor FXSpheref(){} /// Copy constructor FXSpheref(const FXSpheref& sphere):center(sphere.center),radius(sphere.radius){} /// Initialize from center and radius FXSpheref(const FXVec3f& cen,FXfloat rad=0.0f):center(cen),radius(rad){} /// Initialize from center and radius FXSpheref(FXfloat x,FXfloat y,FXfloat z,FXfloat rad=0.0f):center(x,y,z),radius(rad){} /// Initialize sphere to fully contain the given bounding box FXSpheref(const FXRangef& bounds); /// Assignment FXSpheref& operator=(const FXSpheref& sphere){ center=sphere.center; radius=sphere.radius; return *this; } /// Set value from another sphere FXSpheref& set(const FXSpheref& sphere){ center=sphere.center; radius=sphere.radius; return *this; } /// Set value from center and radius FXSpheref& set(const FXVec3f& cen,FXfloat rad){ center=cen; radius=rad; return *this; } /// Set value from center and radius FXSpheref& set(FXfloat x,FXfloat y,FXfloat z,FXfloat rad){ center.set(x,y,z); radius=rad; return *this; } /// Comparison bool operator==(const FXSpheref& s) const { return center==s.center && radius==s.radius;} bool operator!=(const FXSpheref& s) const { return center!=s.center || radius!=s.radius;} /// Diameter of sphere FXfloat diameter() const { return radius*2.0f; } /// Test if empty bool empty() const { return radius<0.0f; } /// Test if sphere contains point x,y,z bool contains(FXfloat x,FXfloat y,FXfloat z) const; /// Test if sphere contains point p bool contains(const FXVec3f& p) const; /// Test if sphere properly contains another box bool contains(const FXRangef& box) const; /// Test if sphere properly contains another sphere bool contains(const FXSpheref& sphere) const; /// Include point FXSpheref& include(FXfloat x,FXfloat y,FXfloat z); /// Include point FXSpheref& include(const FXVec3f& p); /// Expand radius to include point FXSpheref& includeInRadius(FXfloat x,FXfloat y,FXfloat z); /// Expand radius to include point FXSpheref& includeInRadius(const FXVec3f& p); /// Include given range into this one FXSpheref& include(const FXRangef& box); /// Expand radius to include box FXSpheref& includeInRadius(const FXRangef& box); /// Include given sphere into this one FXSpheref& include(const FXSpheref& sphere); /// Expand radius to include sphere FXSpheref& includeInRadius(const FXSpheref& sphere); /// Intersect sphere with normalized plane ax+by+cz+w; returns -1,0,+1 FXint intersect(const FXVec4f& plane) const; /// Intersect sphere with ray u-v bool intersect(const FXVec3f& u,const FXVec3f& v) const; /// Test if box overlaps with sphere friend FXAPI bool overlap(const FXRangef& a,const FXSpheref& b); /// Test if sphere overlaps with box friend FXAPI bool overlap(const FXSpheref& a,const FXRangef& b); /// Test if spheres overlap friend FXAPI bool overlap(const FXSpheref& a,const FXSpheref& b); /// Save object to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXSpheref& sphere); /// Load object from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXSpheref& sphere); }; extern FXAPI bool overlap(const FXRangef& a,const FXSpheref& b); extern FXAPI bool overlap(const FXSpheref& a,const FXRangef& b); extern FXAPI bool overlap(const FXSpheref& a,const FXSpheref& b); extern FXAPI FXStream& operator<<(FXStream& store,const FXSpheref& sphere); extern FXAPI FXStream& operator>>(FXStream& store,FXSpheref& sphere); } #endif fox1.6-1.6.57/include/FXSpinner.h000066400000000000000000000163671326741342000163220ustar00rootroot00000000000000/******************************************************************************** * * * S p i n B u t t o n W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Lyle Johnson. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSpinner.h,v 1.46 2006/02/06 03:03:40 fox Exp $ * ********************************************************************************/ #ifndef FXSPINNER_H #define FXSPINNER_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { /// Spinner Options enum { SPIN_NORMAL = 0, /// Normal, non-cyclic SPIN_CYCLIC = 0x00020000, /// Cyclic spinner SPIN_NOTEXT = 0x00040000, /// No text visible SPIN_NOMAX = 0x00080000, /// Spin all the way up to infinity SPIN_NOMIN = 0x00100000 /// Spin all the way down to -infinity }; class FXTextField; class FXArrowButton; /// Spinner control class FXAPI FXSpinner : public FXPacker { FXDECLARE(FXSpinner) protected: FXTextField *textField; // Text field FXArrowButton *upButton; // The up button FXArrowButton *downButton; // The down button FXint range[2]; // Reported data range FXint incr; // Increment FXint pos; // Current position protected: FXSpinner(); private: FXSpinner(const FXSpinner&); FXSpinner& operator=(const FXSpinner&); public: long onUpdIncrement(FXObject*,FXSelector,void*); long onCmdIncrement(FXObject*,FXSelector,void*); long onUpdDecrement(FXObject*,FXSelector,void*); long onCmdDecrement(FXObject*,FXSelector,void*); long onCmdEntry(FXObject*,FXSelector,void*); long onChgEntry(FXObject*,FXSelector,void*); long onWheelEntry(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdSetIntRange(FXObject*,FXSelector,void*); long onCmdGetIntRange(FXObject*,FXSelector,void*); long onFocusSelf(FXObject*,FXSelector,void*); public: enum{ ID_INCREMENT=FXPacker::ID_LAST, ID_DECREMENT, ID_ENTRY, ID_LAST }; public: /// Construct a spinner FXSpinner(FXComposite *p,FXint cols,FXObject *tgt=NULL,FXSelector sel=0,FXuint opts=SPIN_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Perform layout virtual void layout(); /// Disable spinner virtual void disable(); /// Enable spinner virtual void enable(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Increment spinner void increment(FXbool notify=FALSE); /// Increment spinner by certain amount void incrementByAmount(FXint amount,FXbool notify=FALSE); /// Decrement spinner void decrement(FXbool notify=FALSE); /// Decrement spinner by certain amount void decrementByAmount(FXint amount, FXbool notify=FALSE); /// Return TRUE if in cyclic mode FXbool isCyclic() const; /// Set to cyclic mode, i.e. wrap around at maximum/minimum void setCyclic(FXbool cyclic); /// Return TRUE if text is visible FXbool isTextVisible() const; /// Set text visible flag void setTextVisible(FXbool shown); /// Change current value virtual void setValue(FXint value,FXbool notify=FALSE); /// Return current value FXint getValue() const { return pos; } /// Change the spinner's range void setRange(FXint lo,FXint hi,FXbool notify=FALSE); /// Get the spinner's current range void getRange(FXint& lo,FXint& hi) const { lo=range[0]; hi=range[1]; } /// Change spinner increment void setIncrement(FXint increment); /// Return spinner increment FXint getIncrement() const { return incr; } /// Set the text font void setFont(FXFont *fnt); /// Get the text font FXFont *getFont() const; /// Set the status line help text for this spinner void setHelpText(const FXString& text); /// Get the status line help text for this spinner const FXString& getHelpText() const; /// Set the tool tip message for this spinner void setTipText(const FXString& text); /// Get the tool tip message for this spinner const FXString& getTipText() const; /// Change spinner style void setSpinnerStyle(FXuint style); /// Return current spinner style FXuint getSpinnerStyle() const; /// Allow editing of the text field void setEditable(FXbool edit=TRUE); /// Return TRUE if text field is editable FXbool isEditable() const; /// Change color of the up arrow void setUpArrowColor(FXColor clr); /// Return color of the up arrow FXColor getUpArrowColor() const; /// Change color of the down arrow void setDownArrowColor(FXColor clr); /// Return color of the the down arrow FXColor getDownArrowColor() const; /// Change text color void setTextColor(FXColor clr); /// Return text color FXColor getTextColor() const; /// Change selected background color void setSelBackColor(FXColor clr); /// Return selected background color FXColor getSelBackColor() const; /// Change selected text color void setSelTextColor(FXColor clr); /// Return selected text color FXColor getSelTextColor() const; /// Changes the cursor color void setCursorColor(FXColor clr); /// Return the cursor color FXColor getCursorColor() const; /// Change width of text field in terms of number of columns * `m' void setNumColumns(FXint cols); /// Return number of columns FXint getNumColumns() const; /// Save spinner to a stream virtual void save(FXStream& store) const; /// Load spinner from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXSpinner(); }; } #endif fox1.6-1.6.57/include/FXSplashWindow.h000066400000000000000000000101101326741342000173020ustar00rootroot00000000000000/******************************************************************************** * * * S p l a s h W i n d o w * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSplashWindow.h,v 1.10 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSPLASHWINDOW_H #define FXSPLASHWINDOW_H #ifndef FXTOPWINDOW_H #include "FXTopWindow.h" #endif namespace FX { /// Splash Window options enum { SPLASH_SIMPLE = 0, /// Simple rectangular splash window SPLASH_SHAPED = 0x02000000, /// Shaped splash window SPLASH_OWNS_ICON = 0x04000000, /// Splash window will own the icon and destroy it SPLASH_DESTROY = 0x08000000 /// Splash window will destroy itself when timer expires }; /** * The Splash Window is a window typically shown during startup * of an application. It comprises a large icon, which is also * used as the shape of the window if SPLASH_SHAPED is passed; * with the SPLASH_SIMPLE option the window will be simply rectangular. */ class FXAPI FXSplashWindow : public FXTopWindow { FXDECLARE(FXSplashWindow) protected: FXIcon *icon; // Really big icon FXuint delay; // Delay before hiding protected: FXSplashWindow(); private: FXSplashWindow(const FXSplashWindow&); FXSplashWindow &operator=(const FXSplashWindow&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Construct splash window FXSplashWindow(FXApp* ap,FXIcon* ic,FXuint opts=SPLASH_SIMPLE,FXuint ms=5000); /// Construct splash window FXSplashWindow(FXWindow* ow,FXIcon* ic,FXuint opts=SPLASH_SIMPLE,FXuint ms=5000); /// Create virtual void create(); /// Detach virtual void detach(); /// Show splash window virtual void show(); /// Show splash window with a given placement virtual void show(FXuint placement); /// Hide splash window virtual void hide(); /// Return the default width of this window virtual FXint getDefaultWidth(); /// Return the default height of this window virtual FXint getDefaultHeight(); /// Set the icon for the splash window void setIcon(FXIcon* ic); /// Get the icon for this splash window FXIcon* getIcon() const { return icon; } /// Set or change delay void setDelay(FXuint ms); /// Return delay FXuint getDelay() const { return delay; } /// Save label to a stream virtual void save(FXStream& store) const; /// Load label from a stream virtual void load(FXStream& store); /// Destroy splash window virtual ~FXSplashWindow(); }; } #endif fox1.6-1.6.57/include/FXSplitter.h000066400000000000000000000131131326741342000164740ustar00rootroot00000000000000/******************************************************************************** * * * S p l i t t e r W i n d o w W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSplitter.h,v 1.29 2006/01/22 17:58:09 fox Exp $ * ********************************************************************************/ #ifndef FXSPLITTER_H #define FXSPLITTER_H #ifndef FXCOMPOSITE_H #include "FXComposite.h" #endif namespace FX { /// Splitter options enum { SPLITTER_HORIZONTAL = 0, /// Split horizontally SPLITTER_VERTICAL = 0x00008000, /// Split vertically SPLITTER_REVERSED = 0x00010000, /// Reverse-anchored SPLITTER_TRACKING = 0x00020000, /// Track continuous during split SPLITTER_NORMAL = SPLITTER_HORIZONTAL }; /** * Splitter window is used to interactively repartition * two or more subpanels. * Space may be subdivided horizontally (SPLITTER_HORIZONTAL, which * the default) or vertically (SPLITTER_VERTICAL option). * When the splitter is itself resized, the right-most (bottom-most) * child window will be resized unless the splitter window is reversed; * if the splitter is reversed, the left-most (top-most) child window * will be resized instead. * The splitter widget sends a SEL_CHANGED to its target * during the resizing of the panels; at the end of the resize interaction, * it sends a SEL_COMMAND to signify that the resize operation is complete. * Normally, children are resizable from 0 upwards; however, if the child * in a horizontally oriented splitter has LAYOUT_FILL_X in combination with * LAYOUT_FIX_WIDTH, it will not be made smaller than its default width, * except when the child is the last visible widget (or first when the option * SPLITTER_REVERSED has been passed to the splitter). * In a vertically oriented splitter, children with LAYOUT_FILL_Y and * LAYOUT_FIX_HEIGHT behave analogously. */ class FXAPI FXSplitter : public FXComposite { FXDECLARE(FXSplitter) private: FXWindow *window; // Window being resized FXint split; // Split value FXint offset; // Mouse offset FXint barsize; // Size of the splitter bar protected: FXSplitter(); void adjustHLayout(); void adjustVLayout(); void moveHSplit(FXint amount); void moveVSplit(FXint amount); void drawHSplit(FXint pos); void drawVSplit(FXint pos); FXWindow* findHSplit(FXint pos); FXWindow* findVSplit(FXint pos); private: FXSplitter(const FXSplitter&); FXSplitter& operator=(const FXSplitter&); public: long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onFocusNext(FXObject*,FXSelector,void*); long onFocusPrev(FXObject*,FXSelector,void*); long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusLeft(FXObject*,FXSelector,void*); long onFocusRight(FXObject*,FXSelector,void*); public: /// Construct new splitter widget FXSplitter(FXComposite* p,FXuint opts=SPLITTER_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Construct new splitter widget, which will notify target about size changes FXSplitter(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts=SPLITTER_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Get default width virtual FXint getDefaultWidth(); /// Get default height virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /// Return size of the panel at index FXint getSplit(FXint index) const; /// Change the size of panel at the given index void setSplit(FXint index,FXint size); /// Change splitter style void setSplitterStyle(FXuint style); /// Return current splitter style FXuint getSplitterStyle() const; /// Change splitter bar size void setBarSize(FXint bs); /// Return current bar size FXint getBarSize() const { return barsize; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy splitter virtual ~FXSplitter(); }; } #endif fox1.6-1.6.57/include/FXSpring.h000066400000000000000000000104461326741342000161360ustar00rootroot00000000000000/******************************************************************************** * * * S p r i n g C o n t a i n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSpring.h,v 1.8 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXSPRING_H #define FXSPRING_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { /** * The spring widgets, when properly embedded side by side in a horizontal * frame or vertical frame widget, behave like a set of connected springs * of various lengths (hence the name!). The parameters relw (or relh) * determines the length of the spring. The actual length is not really * important; the only thing that counts is the relative length of one * spring widget to that of another, although the length does determine * the default size. The special value zero may be given for relw (or relh) * to cause the spring to calculate its default width (height) normally, * just like the Packer base class does. * In a typical scenario, either the relative width or height is set to * zero, an the flag LAYOUT_FILL_X or LAYOUT_FILL_Y is passed. When * placed inside a horizontal frame, the LAYOUT_FILL_X together with * the relative widths of the springs will cause a fixed width-ratio * between the springs. * You also can mix normal controls and springs together in a horizontal * or vertical frames to provide arbitrary stretchable spacing between * widgets; in this case, the springs do not need to have any children. * Since the spring widget is derived from the packer layout manager, * it provides the same layout behavior as packer. */ class FXAPI FXSpring : public FXPacker { FXDECLARE(FXSpring) protected: FXint relWidth; // Relative width FXint relHeight; // Relative height protected: FXSpring(){} private: FXSpring(const FXSpring&); FXSpring &operator=(const FXSpring&); public: /// Construct packer layout manager FXSpring(FXComposite *p,FXuint opts=0,FXint relw=0,FXint relh=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_SPACING,FXint pr=DEFAULT_SPACING,FXint pt=DEFAULT_SPACING,FXint pb=DEFAULT_SPACING,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Change relative width void setRelativeWidth(FXint relw); /// Return relative width FXint getRelativeWidth() const { return relWidth; } /// Change relative height void setRelativeHeight(FXint relh); /// Return relative height FXint getRelativeHeight() const { return relHeight; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXStat.h000066400000000000000000000213201326741342000156000ustar00rootroot00000000000000/******************************************************************************** * * * F i l e S t a t i s t i c s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXStat.h,v 1.24 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXSTAT_H #define FXSTAT_H namespace FX { class FXFile; /// Statistics about a file or directory class FXAPI FXStat { friend class FXFile; private: FXuint modeFlags; /// Mode bits FXuint userNumber; /// User number FXuint groupNumber; /// Group number FXTime createTime; /// Create time FXTime accessTime; /// Access time FXTime modifyTime; /// Modify time FXlong fileSize; /// File size public: /// Get statistics of the file into the stat buffer info static bool statFile(const FXString& file,FXStat& info); /// Get statistice of the link into the stat buffer info static bool statLink(const FXString& file,FXStat& info); /// Get statistics of already open file into stat buffer info static bool stat(const FXFile& file,FXStat& info); /// Return the mode flags for this file FXuint mode() const { return modeFlags; } /// Return file size in bytes FXlong size() const { return fileSize; } /// Return user number FXuint user() const { return userNumber; } /// Return group number FXuint group() const { return groupNumber; } /// Return time when last modified FXTime modified() const { return modifyTime; } /// Return time when last accessed FXTime accessed() const { return accessTime; } /// Return time when file was created FXTime created() const { return createTime; } /// Return time anything was changed FXTime touched() const; /// Return true if it is a hidden file (Windows-only) bool isHidden() const; /// Return true if it is a regular file bool isFile() const; /// Return true if it is a link bool isLink() const; /// Return true if character device bool isCharacter() const; /// Return true if block device bool isBlock() const; /// Return true if socket device bool isSocket() const; /// Return true if fifo (pipe) device bool isFifo() const; /// Return true if input path is a directory bool isDirectory() const; /// Return true if file is readable bool isReadable() const; /// Return true if file is writable bool isWritable() const; /// Return true if file is executable bool isExecutable() const; /// Return true if owner has read-write-execute permissions bool isOwnerReadWriteExecute() const; /// Return true if owner has read permissions bool isOwnerReadable() const; /// Return true if owner has write permissions bool isOwnerWritable() const; /// Return true if owner has execute permissions bool isOwnerExecutable() const; /// Return true if group has read-write-execute permissions bool isGroupReadWriteExecute() const; /// Return true if group has read permissions bool isGroupReadable() const; /// Return true if group has write permissions bool isGroupWritable() const; /// Return true if group has execute permissions bool isGroupExecutable() const; /// Return true if others have read-write-execute permissions bool isOtherReadWriteExecute() const; /// Return true if others have read permissions bool isOtherReadable() const; /// Return true if others have write permissions bool isOtherWritable() const; /// Return true if others have execute permissions bool isOtherExecutable() const; /// Return true if the file sets the user id on execution bool isSetUid() const; /// Return true if the file sets the group id on execution bool isSetGid() const; /// Return true if the file has the sticky bit set bool isSetSticky() const; /// Return the mode flags for this file static FXuint mode(const FXString& file); /// Change the mode flags for this file static bool mode(const FXString& file,FXuint perm); /// Return true if file exists static bool exists(const FXString& file); /// Return file size in bytes static FXlong size(const FXString& file); /** * Return last modified time for this file, on filesystems * where this is supported. This is the time when any data * in the file was last modified. */ static FXTime modified(const FXString& file); /** * Return last accessed time for this file, on filesystems * where this is supported. */ static FXTime accessed(const FXString& file); /** * Return created time for this file, on filesystems * where this is supported. This is also the time when * ownership, permissions, links, and other meta-data may * have changed. */ static FXTime created(const FXString& file); /** * Return touched time for this file, on filesystems * where this is supported. This is the time when anything * at all, either contents or meta-data, about the file was * changed. */ static FXTime touched(const FXString& file); /// Return true if file is hidden static bool isHidden(const FXString& file); /// Return true if input path is a file name static bool isFile(const FXString& file); /// Return true if input path is a link static bool isLink(const FXString& file); /// Return true if input path is a directory static bool isDirectory(const FXString& file); /// Return true if file is readable static bool isReadable(const FXString& file); /// Return true if file is writable static bool isWritable(const FXString& file); /// Return true if file is executable static bool isExecutable(const FXString& file); /// Return true if owner has read-write-execute permissions static bool isOwnerReadWriteExecute(const FXString& file); /// Return true if owner has read permissions static bool isOwnerReadable(const FXString& file); /// Return true if owner has write permissions static bool isOwnerWritable(const FXString& file); /// Return true if owner has execute permissions static bool isOwnerExecutable(const FXString& file); /// Return true if group has read-write-execute permissions static bool isGroupReadWriteExecute(const FXString& file); /// Return true if group has read permissions static bool isGroupReadable(const FXString& file); /// Return true if group has write permissions static bool isGroupWritable(const FXString& file); /// Return true if group has execute permissions static bool isGroupExecutable(const FXString& file); /// Return true if others have read-write-execute permissions static bool isOtherReadWriteExecute(const FXString& file); /// Return true if others have read permissions static bool isOtherReadable(const FXString& file); /// Return true if others have write permissions static bool isOtherWritable(const FXString& file); /// Return true if others have execute permissions static bool isOtherExecutable(const FXString& file); /// Return true if the file sets the user id on execution static bool isSetUid(const FXString& file); /// Return true if the file sets the group id on execution static bool isSetGid(const FXString& file); /// Return true if the file has the sticky bit set static bool isSetSticky(const FXString& file); }; } #endif fox1.6-1.6.57/include/FXStatusBar.h000066400000000000000000000065031326741342000166030ustar00rootroot00000000000000/******************************************************************************** * * * S t a t u s B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXStatusBar.h,v 1.7 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXSTATUSBAR_H #define FXSTATUSBAR_H #ifndef FXHORIZONTALFRAME_H #include "FXHorizontalFrame.h" #endif namespace FX { /// StatusBar options enum { STATUSBAR_WITH_DRAGCORNER = 0x00020000 /// Causes the DragCorner to be shown }; class FXDragCorner; class FXStatusLine; /// Status bar class FXAPI FXStatusBar : public FXHorizontalFrame { FXDECLARE(FXStatusBar) protected: FXDragCorner *corner; FXStatusLine *status; protected: FXStatusBar(){} private: FXStatusBar(const FXStatusBar&); FXStatusBar& operator=(const FXStatusBar&); public: /// Construct status bar with or without a drag corner FXStatusBar(FXComposite* p,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=3,FXint pr=3,FXint pt=2,FXint pb=2,FXint hs=4,FXint vs=0); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /// Show or hide the drag corner void setCornerStyle(FXbool withcorner=TRUE); /// Return TRUE if drag corner shown FXbool getCornerStyle() const; /// Acess the status line widget FXStatusLine *getStatusLine() const { return status; } /// Access the drag corner widget FXDragCorner *getDragCorner() const { return corner; } /// Save status bar to a stream virtual void save(FXStream& store) const; /// Load status bar from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXStatusBar(); }; } #endif fox1.6-1.6.57/include/FXStatusLine.h000066400000000000000000000113361326741342000167660ustar00rootroot00000000000000/******************************************************************************** * * * S t a t u s L i n e W i d g e t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXStatusLine.h,v 1.8 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXSTATUSLINE_H #define FXSTATUSLINE_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /** * The status line normally shows its permanent message; when * moving the mouse over a Widget which has status-line help, the status line * temporarily replaces its normal message with the help information; the status * line obtains the help message by sending the Widget a ID_QUERY_HELP message * with type SEL_UPDATE. * If this query does not result in a new status string, the target of * the status line is tried via an ordinary SEL_UPDATE message. * If none of the above work then the status line will display the normal text, * i.e. the string set via setNormalText(). * If the message contains a newline (\n), then the part before the newline * will be displayed in the highlight color, while the part after the newline * is shown using the normal text color. */ class FXAPI FXStatusLine : public FXFrame { FXDECLARE(FXStatusLine) protected: FXString status; // Current status message FXString normal; // Normally displayed message FXFont *font; // Font FXColor textColor; // Status text color FXColor textHighlightColor; // Status text highlight color protected: FXStatusLine(); private: FXStatusLine(const FXStatusLine&); FXStatusLine& operator=(const FXStatusLine&); public: long onPaint(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); public: /// Constructor FXStatusLine(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Change the temporary status message void setText(const FXString& text); /// Return the temporary status message FXString getText() const { return status; } /// Change the permanent status message void setNormalText(const FXString& text); /// Return the permanent status message FXString getNormalText() const { return normal; } /// Change the font void setFont(FXFont* fnt); /// Return the current font FXFont* getFont() const { return font; } /// Return the text color FXColor getTextColor() const { return textColor; } /// Change the text color void setTextColor(FXColor clr); /// Return the highlight text color FXColor getTextHighlightColor() const { return textHighlightColor; } /// Change the highlight text color void setTextHighlightColor(FXColor clr); /// Save status line to stream virtual void save(FXStream& store) const; /// Load status line from stream virtual void load(FXStream& store); /// Destroy virtual ~FXStatusLine(); }; } #endif fox1.6-1.6.57/include/FXStream.h000066400000000000000000000244031326741342000161250ustar00rootroot00000000000000/******************************************************************************** * * * P e r s i s t e n t S t o r a g e S t r e a m C l a s s e s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXStream.h,v 1.42 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXSTREAM_H #define FXSTREAM_H namespace FX { /// Stream data flow direction enum FXStreamDirection { FXStreamDead=0, /// Unopened stream FXStreamSave=1, /// Saving stuff to stream FXStreamLoad=2 /// Loading stuff from stream }; /// Stream status codes enum FXStreamStatus { FXStreamOK=0, /// OK FXStreamEnd=1, /// Try read past end of stream FXStreamFull=2, /// Filled up stream buffer or disk full FXStreamNoWrite=3, /// Unable to open for write FXStreamNoRead=4, /// Unable to open for read FXStreamFormat=5, /// Stream format error FXStreamUnknown=6, /// Trying to read unknown class FXStreamAlloc=7, /// Alloc failed FXStreamFailure=8 /// General failure }; /// Stream seeking enum FXWhence { FXFromStart=0, /// Seek from start position FXFromCurrent=1, /// Seek from current position FXFromEnd=2 /// Seek from end position }; /** * A stream is a way to serialize data and objects into a byte stream. * Each item of data that is saved or loaded from the stream may be byte-swapped, * thus allowing little-endian machines to read data produced on big endian ones * and vice-versa. * Data is serialized exactly as-is. There are no tags or other markers * inserted into the stream; thus, the stream may be used to save or load arbitrary * binary data. * Objects derived from FXObjects may be serialized also; whenever a reference to an * object is serialized, a table is consulted to determine if the same object has * been encountered previously; if not, the object is added to the table and then * its contents are serialized. If the object has been encountered before, only a * reference to the object is serialized. * When loading back a serialized object, new instances are constructed using * the default constructor, and subsequently the object's contents are loaded. * A special container object may be passed in which is placed in the table * as if it had been encountered before; this will cause only references to this * object to be saved. The container object is typically the top-level document * object which manages all objects contained by it. Additional objects may be * added using addObject(); these will not be actually saved or loaded. */ class FXAPI FXStream { protected: FXHash hash; // Hash table const FXObject *parent; // Parent object FXuchar *begptr; // Begin of buffer FXuchar *endptr; // End of buffer FXuchar *wrptr; // Write pointer FXuchar *rdptr; // Read pointer FXlong pos; // Position FXStreamDirection dir; // Direction of current transfer FXStreamStatus code; // Status code FXuint seq; // Sequence number bool owns; // Stream owns buffer bool swap; // Swap bytes on readin protected: /** * Write at least count bytes from the buffer; * returns number of bytes available to be written. */ virtual FXuval writeBuffer(FXuval count); /** * Read at least count bytes into the buffer; * returns number of bytes available to be read. */ virtual FXuval readBuffer(FXuval count); public: /** * Construct stream with given container object. The container object * is an object that will itself not be saved to or loaded from the stream, * but which may be referenced by other objects. These references will be * properly saved and restored. */ FXStream(const FXObject* cont=NULL); /** * Open stream for reading (FXStreamLoad) or for writing (FXStreamSave). * An initial buffer size may be given, which must be at least 16 bytes. * If data is not NULL, it is expected to point to an external data buffer * of length size; otherwise stream will use an internally managed buffer. */ bool open(FXStreamDirection save_or_load,FXuval size=8192,FXuchar* data=NULL); /// Flush buffer virtual bool flush(); /// Close; return true if OK virtual bool close(); /// Get available buffer space FXuval getSpace() const; /// Set available buffer space void setSpace(FXuval sp); /// Get status code FXStreamStatus status() const { return code; } /// Return true if at end of file or error bool eof() const { return code!=FXStreamOK; } /// Set status code void setError(FXStreamStatus err); /// Obtain stream direction FXStreamDirection direction() const { return dir; } /// Get parent object const FXObject* container() const { return parent; } /// Get position FXlong position() const { return pos; } /// Move to position relative to head, tail, or current location virtual bool position(FXlong offset,FXWhence whence=FXFromStart); /** * Change swap bytes flag. */ void swapBytes(bool s){ swap=s; } /** * Get state of the swap bytes flag. */ bool swapBytes() const { return swap; } /** * Set stream to big endian mode if true. Byte swapping will * be enabled if the machine native byte order is not equal to * the desired byte order. */ void setBigEndian(bool big); /** * Return true if big endian mode. */ bool isBigEndian() const; /// Save single items to stream FXStream& operator<<(const FXuchar& v); FXStream& operator<<(const FXchar& v){ return *this << reinterpret_cast(v); } FXStream& operator<<(const FXushort& v); FXStream& operator<<(const FXshort& v){ return *this << reinterpret_cast(v); } FXStream& operator<<(const FXuint& v); FXStream& operator<<(const FXint& v){ return *this << reinterpret_cast(v); } FXStream& operator<<(const FXfloat& v){ return *this << reinterpret_cast(v); } FXStream& operator<<(const FXdouble& v); FXStream& operator<<(const FXlong& v){ return *this << reinterpret_cast(v); } FXStream& operator<<(const FXulong& v){ return *this << reinterpret_cast(v); } /// Save arrays of items to stream FXStream& save(const FXuchar* p,FXuval n); FXStream& save(const FXchar* p,FXuval n){ return save(reinterpret_cast(p),n); } FXStream& save(const FXushort* p,FXuval n); FXStream& save(const FXshort* p,FXuval n){ return save(reinterpret_cast(p),n); } FXStream& save(const FXuint* p,FXuval n); FXStream& save(const FXint* p,FXuval n){ return save(reinterpret_cast(p),n); } FXStream& save(const FXfloat* p,FXuval n){ return save(reinterpret_cast(p),n); } FXStream& save(const FXdouble* p,FXuval n); FXStream& save(const FXlong* p,FXuval n){ return save(reinterpret_cast(p),n); } FXStream& save(const FXulong* p,FXuval n){ return save(reinterpret_cast(p),n); } /// Load single items from stream FXStream& operator>>(FXuchar& v); FXStream& operator>>(FXchar& v){ return *this >> reinterpret_cast(v); } FXStream& operator>>(FXushort& v); FXStream& operator>>(FXshort& v){ return *this >> reinterpret_cast(v); } FXStream& operator>>(FXuint& v); FXStream& operator>>(FXint& v){ return *this >> reinterpret_cast(v); } FXStream& operator>>(FXfloat& v){ return *this >> reinterpret_cast(v); } FXStream& operator>>(FXdouble& v); FXStream& operator>>(FXlong& v){ return *this >> reinterpret_cast(v); } FXStream& operator>>(FXulong& v){ return *this >> reinterpret_cast(v); } /// Load arrays of items from stream FXStream& load(FXuchar* p,FXuval n); FXStream& load(FXchar* p,FXuval n){ return load(reinterpret_cast(p),n); } FXStream& load(FXushort* p,FXuval n); FXStream& load(FXshort* p,FXuval n){ return load(reinterpret_cast(p),n); } FXStream& load(FXuint* p,FXuval n); FXStream& load(FXint* p,FXuval n){ return load(reinterpret_cast(p),n); } FXStream& load(FXfloat* p,FXuval n){ return load(reinterpret_cast(p),n); } FXStream& load(FXdouble* p,FXuval n); FXStream& load(FXlong* p,FXuval n){ return load(reinterpret_cast(p),n); } FXStream& load(FXulong* p,FXuval n){ return load(reinterpret_cast(p),n); } /// Save object FXStream& saveObject(const FXObject* v); /// Load object FXStream& loadObject(FXObject*& v); /// Add object without saving or loading FXStream& addObject(const FXObject* v); /// Destructor virtual ~FXStream(); }; } #endif fox1.6-1.6.57/include/FXString.h000066400000000000000000000675501326741342000161520ustar00rootroot00000000000000/******************************************************************************** * * * S t r i n g O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXString.h,v 1.120 2006/02/20 03:32:12 fox Exp $ * ********************************************************************************/ #ifndef FXSTRING_H #define FXSTRING_H namespace FX { /** * FXString provides essential string manipulation capabilities. */ class FXAPI FXString { private: FXchar* str; public: static const FXchar null[]; static const FXchar hex[17]; static const FXchar HEX[17]; public: static const signed char utfBytes[256]; public: /// Create empty string FXString(); /// Copy construct FXString(const FXString& s); /// Construct and init from string FXString(const FXchar* s); /// Construct and init from wide character string FXString(const FXwchar* s); /// Construct and init from narrow character string FXString(const FXnchar* s); /// Construct and init with substring FXString(const FXchar* s,FXint n); /// Construct and init with wide character substring FXString(const FXwchar* s,FXint n); /// Construct and init with narrow character substring FXString(const FXnchar* s,FXint n); /// Construct and fill with constant FXString(FXchar c,FXint n); /// Length of text in bytes FXint length() const { return *(((FXint*)str)-1); } /// Change the length of the string to len void length(FXint len); /// Count number of utf8 characters FXint count() const; /// Count number of utf8 characters in subrange FXint count(FXint pos,FXint len) const; /// Return byte offset of utf8 character at index FXint offset(FXint indx) const; /// Return index of utf8 character at byte offset FXint index(FXint offs) const; /// Validate position to point to begin of utf8 character FXint validate(FXint p) const; /// Return extent of utf8 character at position FXint extent(FXint p) const { return utfBytes[(FXuchar)str[p]]; } /// Return start of next utf8 character FXint inc(FXint p) const; /// Return start of previous utf8 character FXint dec(FXint p) const; /// Get text contents const FXchar* text() const { return (const FXchar*)str; } /// See if string is empty bool empty() const { return (((FXint*)str)[-1]==0); } /// See if string is empty bool operator!() const { return (((FXint*)str)[-1]==0); } /// Return a non-const reference to the ith character FXchar& operator[](FXint i){ return str[i]; } /// Return a const reference to the ith character const FXchar& operator[](FXint i) const { return str[i]; } /// Return a non-const reference to the ith character FXchar& at(FXint i){ return str[i]; } /// Return a const reference to the ith character const FXchar& at(FXint i) const { return str[i]; } /// Return wide character starting at offset i FXwchar wc(FXint i) const; /// Assign a string to this FXString& operator=(const FXchar* s); /// Assign a wide character string to this FXString& operator=(const FXwchar* s); /// Assign a narrow character string to this FXString& operator=(const FXnchar* s); /// Assign another string to this FXString& operator=(const FXString& s); /// Convert to lower case FXString& lower(); /// Convert to upper case FXString& upper(); /// Return num partition(s) beginning at start from a string separated by delimiters delim. FXString section(FXchar delim,FXint start,FXint num=1) const; /// Return num partition(s) beginning at start from a string separated by set of delimiters from delim of size n FXString section(const FXchar* delim,FXint n,FXint start,FXint num) const; /// Return num partition(s) beginning at start from a string separated by set of delimiters from delim. FXString section(const FXchar* delim,FXint start,FXint num=1) const; /// Return num partition(s) beginning at start from a string separated by set of delimiters from delim. FXString section(const FXString& delim,FXint start,FXint num=1) const; /// Adopt string s, leaving s empty FXString& adopt(FXString& s); /// Assign character c to this string FXString& assign(FXchar c); /// Assign n characters c to this string FXString& assign(FXchar c,FXint n); /// Assign first n characters of string s to this string FXString& assign(const FXchar *s,FXint n); /// Assign first n characters of wide character string s to this string FXString& assign(const FXwchar *s,FXint n); /// Assign first n characters of narrow character string s to this string FXString& assign(const FXnchar *s,FXint n); /// Assign string s to this string FXString& assign(const FXchar* s); /// Assign wide character string s to this string FXString& assign(const FXwchar* s); /// Assign narrow character string s to this string FXString& assign(const FXnchar* s); /// Assign string s to this string FXString& assign(const FXString& s); /// Insert character at specified position FXString& insert(FXint pos,FXchar c); /// Insert n characters c at specified position FXString& insert(FXint pos,FXchar c,FXint n); /// Insert first n characters of string at specified position FXString& insert(FXint pos,const FXchar* s,FXint n); /// Insert first n characters of wide character string at specified position FXString& insert(FXint pos,const FXwchar* s,FXint n); /// Insert first n characters of narrow character string at specified position FXString& insert(FXint pos,const FXnchar* s,FXint n); /// Insert string at specified position FXString& insert(FXint pos,const FXchar* s); /// Insert wide character string at specified position FXString& insert(FXint pos,const FXwchar* s); /// Insert narrow character string at specified position FXString& insert(FXint pos,const FXnchar* s); /// Insert string at specified position FXString& insert(FXint pos,const FXString& s); /// Prepend string with input character FXString& prepend(FXchar c); /// Prepend string with n characters c FXString& prepend(FXchar c,FXint n); /// Prepend first n characters of string s FXString& prepend(const FXchar* s,FXint n); /// Prepend first n characters of wide character string s FXString& prepend(const FXwchar* s,FXint n); /// Prepend first n characters of narrow character string s FXString& prepend(const FXnchar* s,FXint n); /// Prepend string with string s FXString& prepend(const FXchar* s); /// Prepend string with wide character string FXString& prepend(const FXwchar* s); /// Prepend string with narrow character string FXString& prepend(const FXnchar* s); /// Prepend string with string s FXString& prepend(const FXString& s); /// Append character c to this string FXString& append(FXchar c); /// Append n characters c to this string FXString& append(FXchar c,FXint n); /// Append first n characters of string s to this string FXString& append(const FXchar* s,FXint n); /// Append first n characters of wide character string s to this string FXString& append(const FXwchar* s,FXint n); /// Append first n characters of narrow character string s to this string FXString& append(const FXnchar* s,FXint n); /// Append string s to this string FXString& append(const FXchar* s); /// Append wide character string s to this string FXString& append(const FXwchar* s); /// Append narrow character string s to this string FXString& append(const FXnchar* s); /// Append string s to this string FXString& append(const FXString& s); /// Replace a single character FXString& replace(FXint pos,FXchar c); /// Replace the m characters at pos with n characters c FXString& replace(FXint pos,FXint m,FXchar c,FXint n); /// Replaces the m characters at pos with first n characters of string s FXString& replace(FXint pos,FXint m,const FXchar* s,FXint n); /// Replaces the m characters at pos with first n characters of wide character string s FXString& replace(FXint pos,FXint m,const FXwchar* s,FXint n); /// Replaces the m characters at pos with first n characters of narrow character string s FXString& replace(FXint pos,FXint m,const FXnchar* s,FXint n); /// Replace the m characters at pos with string s FXString& replace(FXint pos,FXint m,const FXchar* s); /// Replace the m characters at pos with wide character string s FXString& replace(FXint pos,FXint m,const FXwchar* s); /// Replace the m characters at pos with narrow character string s FXString& replace(FXint pos,FXint m,const FXnchar* s); /// Replace the m characters at pos with string s FXString& replace(FXint pos,FXint m,const FXString& s); /// Move range of m characters from src position to dst position FXString& move(FXint dst,FXint src,FXint n); /// Remove one character FXString& erase(FXint pos); /// Remove substring FXString& erase(FXint pos,FXint n); /// Return number of occurrences of ch in string FXint contains(FXchar ch) const; /// Return number of occurrences of string sub in string FXint contains(const FXchar* sub,FXint n) const; /// Return number of occurrences of string sub in string FXint contains(const FXchar* sub) const; /// Return number of occurrences of string sub in string FXint contains(const FXString& sub) const; /// Substitute one character by another FXString& substitute(FXchar org,FXchar sub,bool all=true); /// Substitute one string by another FXString& substitute(const FXchar* org,FXint olen,const FXchar *rep,FXint rlen,bool all=true); /// Substitute one string by another FXString& substitute(const FXchar* org,const FXchar *rep,bool all=true); /// Substitute one string by another FXString& substitute(const FXString& org,const FXString& rep,bool all=true); /// Simplify whitespace in string FXString& simplify(); /// Remove leading and trailing whitespace FXString& trim(); /// Remove leading whitespace FXString& trimBegin(); /// Remove trailing whitespace FXString& trimEnd(); /// Truncate string at pos FXString& trunc(FXint pos); /// Clear FXString& clear(); /// Get left most part FXString left(FXint n) const; /// Get right most part FXString right(FXint n) const; /// Get some part in the middle FXString mid(FXint pos,FXint n) const; /** * Return all characters before the n-th occurrence of ch, * searching from the beginning of the string. If the character * is not found, return the entire string. If n<=0, return * the empty string. */ FXString before(FXchar ch,FXint n=1) const; /** * Return all characters before the n-th occurrence of ch, * searching from the end of the string. If the character * is not found, return the empty string. If n<=0, return * the entire string. */ FXString rbefore(FXchar ch,FXint n=1) const; /** * Return all characters after the nth occurrence of ch, * searching from the beginning of the string. If the character * is not found, return the empty string. If n<=0, return * the entire string. */ FXString after(FXchar ch,FXint n=1) const; /** * Return all characters after the nth occurrence of ch, * searching from the end of the string. If the character * is not found, return the entire string. If n<=0, return * the empty string. */ FXString rafter(FXchar ch,FXint n=1) const; /// Find a character, searching forward; return position or -1 FXint find(FXchar c,FXint pos=0) const; /// Find a character, searching backward; return position or -1 FXint rfind(FXchar c,FXint pos=2147483647) const; /// Find n-th occurrence of character, searching forward; return position or -1 FXint find(FXchar c,FXint pos,FXint n) const; /// Find n-th occurrence of character, searching backward; return position or -1 FXint rfind(FXchar c,FXint pos,FXint n) const; /// Find a substring of length n, searching forward; return position or -1 FXint find(const FXchar* substr,FXint n,FXint pos) const; /// Find a substring of length n, searching backward; return position or -1 FXint rfind(const FXchar* substr,FXint n,FXint pos) const; /// Find a substring, searching forward; return position or -1 FXint find(const FXchar* substr,FXint pos=0) const; /// Find a substring, searching backward; return position or -1 FXint rfind(const FXchar* substr,FXint pos=2147483647) const; /// Find a substring, searching forward; return position or -1 FXint find(const FXString& substr,FXint pos=0) const; /// Find a substring, searching backward; return position or -1 FXint rfind(const FXString& substr,FXint pos=2147483647) const; /// Find first character in the set of size n, starting from pos; return position or -1 FXint find_first_of(const FXchar* set,FXint n,FXint pos) const; /// Find first character in the set, starting from pos; return position or -1 FXint find_first_of(const FXchar* set,FXint pos=0) const; /// Find first character in the set, starting from pos; return position or -1 FXint find_first_of(const FXString& set,FXint pos=0) const; /// Find first character, starting from pos; return position or -1 FXint find_first_of(FXchar c,FXint pos=0) const; /// Find last character in the set of size n, starting from pos; return position or -1 FXint find_last_of(const FXchar* set,FXint n,FXint pos) const; /// Find last character in the set, starting from pos; return position or -1 FXint find_last_of(const FXchar* set,FXint pos=2147483647) const; /// Find last character in the set, starting from pos; return position or -1 FXint find_last_of(const FXString& set,FXint pos=2147483647) const; /// Find last character, starting from pos; return position or -1 FXint find_last_of(FXchar c,FXint pos=0) const; /// Find first character NOT in the set of size n, starting from pos; return position or -1 FXint find_first_not_of(const FXchar* set,FXint n,FXint pos) const; /// Find first character NOT in the set, starting from pos; return position or -1 FXint find_first_not_of(const FXchar* set,FXint pos=0) const; /// Find first character NOT in the set, starting from pos; return position or -1 FXint find_first_not_of(const FXString& set,FXint pos=0) const; /// Find first character NOT equal to c, starting from pos; return position or -1 FXint find_first_not_of(FXchar c,FXint pos=0) const; /// Find last character NOT in the set of size n, starting from pos; return position or -1 FXint find_last_not_of(const FXchar* set,FXint n,FXint pos) const; /// Find last character NOT in the set, starting from pos; return position or -1 FXint find_last_not_of(const FXchar* set,FXint pos=2147483647) const; /// Find last character NOT in the set, starting from pos; return position or -1 FXint find_last_not_of(const FXString& set,FXint pos=2147483647) const; /// Find last character NOT equal to c, starting from pos; return position or -1 FXint find_last_not_of(FXchar c,FXint pos=0) const; /// Format a string a-la printf FXString& format(const FXchar* fmt,...) FX_PRINTF(2,3) ; FXString& vformat(const FXchar* fmt,va_list args); /// Scan a string a-la scanf FXint scan(const FXchar* fmt,...) const FX_SCANF(2,3) ; FXint vscan(const FXchar* fmt,va_list args) const; /// Get hash value FXuint hash() const; /// Compare friend FXAPI FXint compare(const FXchar* s1,const FXchar* s2); friend FXAPI FXint compare(const FXchar* s1,const FXString& s2); friend FXAPI FXint compare(const FXString& s1,const FXchar* s2); friend FXAPI FXint compare(const FXString& s1,const FXString& s2); /// Compare up to n friend FXAPI FXint compare(const FXchar* s1,const FXchar* s2,FXint n); friend FXAPI FXint compare(const FXchar* s1,const FXString& s2,FXint n); friend FXAPI FXint compare(const FXString& s1,const FXchar* s2,FXint n); friend FXAPI FXint compare(const FXString& s1,const FXString& s2,FXint n); /// Compare case insensitive friend FXAPI FXint comparecase(const FXchar* s1,const FXchar* s2); friend FXAPI FXint comparecase(const FXchar* s1,const FXString& s2); friend FXAPI FXint comparecase(const FXString& s1,const FXchar* s2); friend FXAPI FXint comparecase(const FXString& s1,const FXString& s2); /// Compare case insensitive up to n friend FXAPI FXint comparecase(const FXchar* s1,const FXchar* s2,FXint n); friend FXAPI FXint comparecase(const FXchar* s1,const FXString& s2,FXint n); friend FXAPI FXint comparecase(const FXString& s1,const FXchar* s2,FXint n); friend FXAPI FXint comparecase(const FXString& s1,const FXString& s2,FXint n); /// Compare with numeric interpretation friend FXAPI FXint compareversion(const FXchar* s1,const FXchar* s2); friend FXAPI FXint compareversion(const FXchar* s1,const FXString& s2); friend FXAPI FXint compareversion(const FXString& s1,const FXchar* s2); friend FXAPI FXint compareversion(const FXString& s1,const FXString& s2); /// Comparison operators friend FXAPI bool operator==(const FXString& s1,const FXString& s2); friend FXAPI bool operator==(const FXString& s1,const FXchar* s2); friend FXAPI bool operator==(const FXchar* s1,const FXString& s2); friend FXAPI bool operator!=(const FXString& s1,const FXString& s2); friend FXAPI bool operator!=(const FXString& s1,const FXchar* s2); friend FXAPI bool operator!=(const FXchar* s1,const FXString& s2); friend FXAPI bool operator<(const FXString& s1,const FXString& s2); friend FXAPI bool operator<(const FXString& s1,const FXchar* s2); friend FXAPI bool operator<(const FXchar* s1,const FXString& s2); friend FXAPI bool operator<=(const FXString& s1,const FXString& s2); friend FXAPI bool operator<=(const FXString& s1,const FXchar* s2); friend FXAPI bool operator<=(const FXchar* s1,const FXString& s2); friend FXAPI bool operator>(const FXString& s1,const FXString& s2); friend FXAPI bool operator>(const FXString& s1,const FXchar* s2); friend FXAPI bool operator>(const FXchar* s1,const FXString& s2); friend FXAPI bool operator>=(const FXString& s1,const FXString& s2); friend FXAPI bool operator>=(const FXString& s1,const FXchar* s2); friend FXAPI bool operator>=(const FXchar* s1,const FXString& s2); /// Append operators FXString& operator+=(const FXString& s); FXString& operator+=(const FXchar* s); FXString& operator+=(const FXwchar* s); FXString& operator+=(const FXnchar* s); FXString& operator+=(FXchar c); /// Concatenate one FXString with another friend FXAPI FXString operator+(const FXString& s1,const FXString& s2); /// Concatenate FXString and a string friend FXAPI FXString operator+(const FXString& s1,const FXchar* s2); friend FXAPI FXString operator+(const FXString& s1,const FXwchar* s2); friend FXAPI FXString operator+(const FXString& s1,const FXnchar* s2); /// Concatenate string and FXString friend FXAPI FXString operator+(const FXchar* s1,const FXString& s2); friend FXAPI FXString operator+(const FXwchar* s1,const FXString& s2); friend FXAPI FXString operator+(const FXnchar* s1,const FXString& s2); /// Concatenate string and single character friend FXAPI FXString operator+(const FXString& s,FXchar c); friend FXAPI FXString operator+(FXchar c,const FXString& s); /// Saving to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXString& s); /// Load from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXString& s); /// Format a string a-la printf friend FXAPI FXString FXStringFormat(const FXchar* fmt,...) FX_PRINTF(1,2) ; friend FXAPI FXString FXStringVFormat(const FXchar* fmt,va_list args); /** * Convert integer number to a string, using the given number * base, which must be between 2 and 16. */ friend FXAPI FXString FXStringVal(FXint num,FXint base); friend FXAPI FXString FXStringVal(FXuint num,FXint base); /** * Convert long integer number to a string, using the given number * base, which must be between 2 and 16. */ friend FXAPI FXString FXStringVal(FXlong num,FXint base); friend FXAPI FXString FXStringVal(FXulong num,FXint base); /** * Convert real number to a string, using the given procision and * exponential notation mode, which may be FALSE (never), TRUE (always), or * MAYBE (when needed). */ friend FXAPI FXString FXStringVal(FXfloat num,FXint prec,FXint exp); friend FXAPI FXString FXStringVal(FXdouble num,FXint prec,FXint exp); /// Convert string to a integer number, assuming given number base friend FXAPI FXint FXIntVal(const FXString& s,FXint base); friend FXAPI FXuint FXUIntVal(const FXString& s,FXint base); /// Convert string to long integer number, assuming given number base friend FXAPI FXlong FXLongVal(const FXString& s,FXint base); friend FXAPI FXulong FXULongVal(const FXString& s,FXint base); /// Convert string into real number friend FXAPI FXfloat FXFloatVal(const FXString& s); friend FXAPI FXdouble FXDoubleVal(const FXString& s); /// Return utf8 from ascii containing unicode escapes friend FXAPI FXString fromAscii(const FXString& s); /// Return ascii containing unicode escapes from utf8 friend FXAPI FXString toAscii(const FXString& s); /// Escape special characters in a string friend FXAPI FXString escape(const FXString& s); /// Unescape special characters in a string friend FXAPI FXString unescape(const FXString& s); /// Return normalized string, i.e. reordering of diacritical marks friend FXAPI FXString normalize(const FXString& s); /// Return normalized decomposition of string friend FXAPI FXString decompose(const FXString& s,FXuint kind); /// Return normalized composition of string; this first performs normalized decomposition friend FXAPI FXString compose(const FXString& s,FXuint kind); /// Swap two strings friend inline void swap(FXString& a,FXString& b); /// Convert to and from dos friend FXAPI FXString& unixToDos(FXString& str); friend FXAPI FXString& dosToUnix(FXString& str); /// Delete ~FXString(); }; inline void swap(FXString& a,FXString& b){ FXchar *t=a.str; a.str=b.str; b.str=t; } extern FXAPI FXint compare(const FXchar* s1,const FXchar* s2); extern FXAPI FXint compare(const FXchar* s1,const FXString& s2); extern FXAPI FXint compare(const FXString& s1,const FXchar* s2); extern FXAPI FXint compare(const FXString& s1,const FXString& s2); extern FXAPI FXint compare(const FXchar* s1,const FXchar* s2,FXint n); extern FXAPI FXint compare(const FXchar* s1,const FXString& s2,FXint n); extern FXAPI FXint compare(const FXString& s1,const FXchar* s2,FXint n); extern FXAPI FXint compare(const FXString& s1,const FXString& s2,FXint n); extern FXAPI FXint comparecase(const FXchar* s1,const FXchar* s2); extern FXAPI FXint comparecase(const FXchar* s1,const FXString& s2); extern FXAPI FXint comparecase(const FXString& s1,const FXchar* s2); extern FXAPI FXint comparecase(const FXString& s1,const FXString& s2); extern FXAPI FXint comparecase(const FXchar* s1,const FXchar* s2,FXint n); extern FXAPI FXint comparecase(const FXchar* s1,const FXString& s2,FXint n); extern FXAPI FXint comparecase(const FXString& s1,const FXchar* s2,FXint n); extern FXAPI FXint comparecase(const FXString& s1,const FXString& s2,FXint n); extern FXAPI FXint compareversion(const FXchar* s1,const FXchar* s2); extern FXAPI FXint compareversion(const FXchar* s1,const FXString& s2); extern FXAPI FXint compareversion(const FXString& s1,const FXchar* s2); extern FXAPI FXint compareversion(const FXString& s1,const FXString& s2); extern FXAPI bool operator==(const FXString& s1,const FXString& s2); extern FXAPI bool operator==(const FXString& s1,const FXchar* s2); extern FXAPI bool operator==(const FXchar* s1,const FXString& s2); extern FXAPI bool operator!=(const FXString& s1,const FXString& s2); extern FXAPI bool operator!=(const FXString& s1,const FXchar* s2); extern FXAPI bool operator!=(const FXchar* s1,const FXString& s2); extern FXAPI bool operator<(const FXString& s1,const FXString& s2); extern FXAPI bool operator<(const FXString& s1,const FXchar* s2); extern FXAPI bool operator<(const FXchar* s1,const FXString& s2); extern FXAPI bool operator<=(const FXString& s1,const FXString& s2); extern FXAPI bool operator<=(const FXString& s1,const FXchar* s2); extern FXAPI bool operator<=(const FXchar* s1,const FXString& s2); extern FXAPI bool operator>(const FXString& s1,const FXString& s2); extern FXAPI bool operator>(const FXString& s1,const FXchar* s2); extern FXAPI bool operator>(const FXchar* s1,const FXString& s2); extern FXAPI bool operator>=(const FXString& s1,const FXString& s2); extern FXAPI bool operator>=(const FXString& s1,const FXchar* s2); extern FXAPI bool operator>=(const FXchar* s1,const FXString& s2); extern FXAPI FXString operator+(const FXString& s1,const FXString& s2); extern FXAPI FXString operator+(const FXString& s1,const FXchar* s2); extern FXAPI FXString operator+(const FXString& s1,const FXwchar* s2); extern FXAPI FXString operator+(const FXString& s1,const FXnchar* s2); extern FXAPI FXString operator+(const FXchar* s1,const FXString& s2); extern FXAPI FXString operator+(const FXwchar* s1,const FXString& s2); extern FXAPI FXString operator+(const FXnchar* s1,const FXString& s2); extern FXAPI FXString operator+(const FXString& s,FXchar c); extern FXAPI FXString operator+(FXchar c,const FXString& s); extern FXAPI FXStream& operator<<(FXStream& store,const FXString& s); extern FXAPI FXStream& operator>>(FXStream& store,FXString& s); extern FXAPI FXString FXStringFormat(const FXchar* fmt,...) FX_PRINTF(1,2) ; extern FXAPI FXString FXStringVFormat(const FXchar* fmt,va_list args); extern FXAPI FXString FXStringVal(FXint num,FXint base=10); extern FXAPI FXString FXStringVal(FXuint num,FXint base=10); extern FXAPI FXString FXStringVal(FXlong num,FXint base=10); extern FXAPI FXString FXStringVal(FXulong num,FXint base=10); extern FXAPI FXString FXStringVal(FXfloat num,FXint prec=6,FXint exp=MAYBE); extern FXAPI FXString FXStringVal(FXdouble num,FXint prec=6,FXint exp=MAYBE); extern FXAPI FXint FXIntVal(const FXString& s,FXint base=10); extern FXAPI FXuint FXUIntVal(const FXString& s,FXint base=10); extern FXAPI FXlong FXLongVal(const FXString& s,FXint base=10); extern FXAPI FXulong FXULongVal(const FXString& s,FXint base=10); extern FXAPI FXfloat FXFloatVal(const FXString& s); extern FXAPI FXdouble FXDoubleVal(const FXString& s); extern FXAPI FXString fromAscii(const FXString& s); extern FXAPI FXString toAscii(const FXString& s); extern FXAPI FXString escape(const FXString& s); extern FXAPI FXString unescape(const FXString& s); extern FXAPI FXString normalize(const FXString& s); extern FXAPI FXString decompose(const FXString& s,FXuint kind); extern FXAPI FXString compose(const FXString& s,FXuint kind); extern FXAPI FXString& unixToDos(FXString& str); extern FXAPI FXString& dosToUnix(FXString& str); } #endif fox1.6-1.6.57/include/FXStringDict.h000066400000000000000000000064731326741342000167530ustar00rootroot00000000000000/******************************************************************************** * * * S t r i n g D i c t i o n a r y C l a s s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXStringDict.h,v 1.16 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXSTRINGDICT_H #define FXSTRINGDICT_H #ifndef FXDICT_H #include "FXDict.h" #endif namespace FX { /** * String dictionary maps a character string to a character string. * The inserted strings are copied when they're inserted. */ class FXAPI FXStringDict : public FXDict { FXDECLARE(FXStringDict) protected: virtual void *createData(const void*); virtual void deleteData(void*); public: /// Construct a string dictionary FXStringDict(); /// Copy constructor FXStringDict(const FXStringDict& orig); /// Assignment operator FXStringDict &operator=(const FXStringDict& orig); /// Insert a new string indexed by key, with given mark flag const FXchar* insert(const FXchar* ky,const FXchar* str,bool mrk=false){ return (const FXchar*)FXDict::insert(ky,str,mrk); } /// Replace or insert a new string indexed by key, unless given mark is lower that the existing mark const FXchar* replace(const FXchar* ky,const FXchar* str,bool mrk=false){ return (const FXchar*)FXDict::replace(ky,str,mrk); } /// Remove entry indexed by key const FXchar* remove(const FXchar* ky){ return (const FXchar*)FXDict::remove(ky); } /// Return the entry indexed by key, or return NULL if the key does not exist const FXchar* find(const FXchar* ky) const { return (const FXchar*)FXDict::find(ky); } /// Return the string at position pos const FXchar* data(FXuint pos) const { return (const FXchar*)dict[pos].data; } /// Destructor virtual ~FXStringDict(); }; } #endif fox1.6-1.6.57/include/FXSwitcher.h000066400000000000000000000107461326741342000164670ustar00rootroot00000000000000/******************************************************************************** * * * S w i t c h C o n t a i n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSwitcher.h,v 1.17 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXSWITCHER_H #define FXSWITCHER_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { /// Switcher options enum { SWITCHER_HCOLLAPSE = 0x00020000, /// Collapse horizontally to width of current child SWITCHER_VCOLLAPSE = 0x00040000 /// Collapse vertically to height of current child }; /** * The Switcher layout manager automatically arranges its child * windows such that one of them is placed on top; all other * child windows are hidden. * Switcher provides a convenient method to conserve screen * real-estate by arranging several GUI panels to appear in the * same space, depending on context. * Switcher ignores all layout hints from its children:- all * children are stretched according to the switcher layout * managers own size. * When the SWITCHER_HCOLLAPSE or SWITCHER_VCOLLAPSE options * are used, Switcher's default size is based on the width or * height of the current child, instead of the maximum width * or height of all of the children. */ class FXAPI FXSwitcher : public FXPacker { FXDECLARE(FXSwitcher) protected: FXint current; protected: FXSwitcher(){} private: FXSwitcher(const FXSwitcher&); FXSwitcher& operator=(const FXSwitcher&); public: long onPaint(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdOpen(FXObject*,FXSelector,void*); long onUpdOpen(FXObject*,FXSelector,void*); public: enum { ID_OPEN_FIRST=FXPacker::ID_LAST, ID_OPEN_SECOND, ID_OPEN_THIRD, ID_OPEN_FOURTH, ID_OPEN_FIFTH, ID_OPEN_SIXTH, ID_OPEN_SEVENTH, ID_OPEN_EIGHTH, ID_OPEN_NINETH, ID_OPEN_TENTH, ID_OPEN_LAST=ID_OPEN_FIRST+100, ID_LAST }; public: /// Construct a switcher layout manager FXSwitcher(FXComposite *p,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_SPACING,FXint pr=DEFAULT_SPACING,FXint pt=DEFAULT_SPACING,FXint pb=DEFAULT_SPACING); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /// Bring the child window at index to the top void setCurrent(FXint index,FXbool notify=FALSE); /// Return the index of the child window currently on top FXint getCurrent() const { return current; } /// Set the switcher style flags void setSwitcherStyle(FXuint style); /// Get the switcher style flags FXuint getSwitcherStyle() const; /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXSystem.h000066400000000000000000000075571326741342000161710ustar00rootroot00000000000000/******************************************************************************** * * * M i s c e l l a n e o u s S y s t e m F u n c t i o n s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSystem.h,v 1.6 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXSYSTEM_H #define FXSYSTEM_H namespace FX { namespace FXSystem { /// Return current time FXTime FXAPI now(); /// Convert time value to date-string FXString FXAPI time(FXTime value); /** * Convert time value to date-string as per strftime. * Format characters supported by most systems are: * * %a %A %b %B %c %d %H %I %j %m %M %p %S %U %w %W %x %X %y %Y %Z %% * * Some systems support additional conversions. */ FXString FXAPI time(const FXchar *format,FXTime value); /// Get effective user id FXuint FXAPI user(); /// Get effective group id FXuint FXAPI group(); /// Return owner name from uid if available FXString FXAPI userName(FXuint uid); /// Return group name from gid if available FXString FXAPI groupName(FXuint gid); /// Get current effective user name FXString FXAPI currentUserName(); /// Get current effective group name FXString FXAPI currentGroupName(); /// Get permissions string FXString FXAPI modeString(FXuint mode); /// Return value of environment variable name FXString FXAPI getEnvironment(const FXString& name); /// Change value of environment variable name, return true if success bool FXAPI setEnvironment(const FXString& name,const FXString& value); /// Get the current working directory FXString FXAPI getCurrentDirectory(); /// Set the current working directory FXbool FXAPI setCurrentDirectory(const FXString& path); /// Return the current drive (for Win32 systems) FXString FXAPI getCurrentDrive(); /// Set the current drive (for Win32 systems) FXbool FXAPI setCurrentDrive(const FXString& prefix); /// Get executable path FXString FXAPI getExecPath(); /// Return the home directory for the current user FXString FXAPI getHomeDirectory(); /// Return the home directory for a given user FXString FXAPI getUserDirectory(const FXString& user); /// Return temporary directory FXString FXAPI getTempDirectory(); /** * Get DLL name for given base name; for example "png" * becomes "libpng.so" on Linux, and "png.dll" on Windows. */ FXString FXAPI dllName(const FXString& name); } } #endif fox1.6-1.6.57/include/FXTGAIcon.h000066400000000000000000000061731326741342000161220ustar00rootroot00000000000000/******************************************************************************** * * * T A R G A I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Janusz Ganczarski. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTGAIcon.h,v 1.18 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXTGAICON_H #define FXTGAICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// TARGA image format icon class FXAPI FXTGAIcon : public FXIcon { FXDECLARE(FXTGAIcon) protected: FXTGAIcon(){} private: FXTGAIcon(const FXTGAIcon&); FXTGAIcon &operator=(const FXTGAIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct icon from memory stream formatted in TARGA format FXTGAIcon(FXApp* a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in TARGA format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in TARGA format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXTGAIcon(); }; /** * Check if stream contains a TARGA, return TRUE if so. */ extern FXAPI bool fxcheckTGA(FXStream& store); /** * Load an TARGA file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadTGA(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an TARGA file to a stream. */ extern FXAPI bool fxsaveTGA(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXTGAImage.h000066400000000000000000000061441326741342000162520ustar00rootroot00000000000000/******************************************************************************** * * * T A R G A I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Janusz Ganczarski. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTGAImage.h,v 1.18 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXTGAIMAGE_H #define FXTGAIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// TARGA graphics file class FXAPI FXTGAImage : public FXImage { FXDECLARE(FXTGAImage) protected: FXTGAImage(){} private: FXTGAImage(const FXTGAImage&); FXTGAImage &operator=(const FXTGAImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct image from memory stream formatted in TARGA file FXTGAImage(FXApp* a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in TARGA file virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in TARGA format virtual bool loadPixels(FXStream& store); /// Destroy image virtual ~FXTGAImage(); }; /** * Check if stream contains a TARGA, return TRUE if so. */ extern FXAPI bool fxcheckTGA(FXStream& store); /** * Load an TARGA file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadTGA(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an TARGA file to a stream. */ extern FXAPI bool fxsaveTGA(FXStream& store,const FXColor *data,FXint width,FXint height); } #endif fox1.6-1.6.57/include/FXTIFIcon.h000066400000000000000000000066501326741342000161310ustar00rootroot00000000000000/******************************************************************************** * * * T I F F I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 Eric Gillet. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTIFIcon.h,v 1.22 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXTIFICON_H #define FXTIFICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// TIFF Icon class class FXAPI FXTIFIcon : public FXIcon { FXDECLARE(FXTIFIcon) protected: FXushort codec; protected: FXTIFIcon(){} private: FXTIFIcon(const FXTIFIcon&); FXTIFIcon &operator=(const FXTIFIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct an icon from memory stream formatted in TIFF format FXTIFIcon(FXApp *a,const void *pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// True if format is supported static const bool supported; /// Set codec to save with void setCodec(FXuint c){ codec=c; } /// Get codec setting FXuint getCodec() const { return codec; } /// Save pixels into stream in TIFF format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in TIFF format virtual bool loadPixels(FXStream& store); /// Destroy virtual ~FXTIFIcon(); }; /** * Check if stream contains a TIFF, return TRUE if so. */ extern FXAPI bool fxcheckTIF(FXStream& store); /** * Load an TIFF (Tagged Image File Format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadTIF(FXStream& store,FXColor*& data,FXint& width,FXint& height,FXushort& codec); /** * Save an TIFF (Tagged Image File Format) file to a stream. */ extern FXAPI bool fxsaveTIF(FXStream& store,const FXColor* data,FXint width,FXint height,FXushort codec); } #endif fox1.6-1.6.57/include/FXTIFImage.h000066400000000000000000000066311326741342000162620ustar00rootroot00000000000000/******************************************************************************** * * * T I F F I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 Eric Gillet. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTIFImage.h,v 1.23 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXTIFIMAGE_H #define FXTIFIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// TIFF Image class class FXAPI FXTIFImage : public FXImage { FXDECLARE(FXTIFImage) protected: FXushort codec; protected: FXTIFImage(){} private: FXTIFImage(const FXTIFImage&); FXTIFImage &operator=(const FXTIFImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct an image from memory stream formatted in TIFF format FXTIFImage(FXApp *a,const void *pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// True if format is supported static const bool supported; /// Set codec to save with void setCodec(FXuint c){ codec=c; } /// Get codec setting FXuint getCodec() const { return codec; } /// Load pixels into stream in TIFF format virtual bool loadPixels(FXStream& store); /// Save pixels from stream in TIFF format virtual bool savePixels(FXStream& store) const; /// Destroy virtual ~FXTIFImage(); }; /** * Check if stream contains a TIFF, return TRUE if so. */ extern FXAPI bool fxcheckTIF(FXStream& store); /** * Load an TIFF (Tagged Image File Format) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadTIF(FXStream& store,FXColor*& data,FXint& width,FXint& height,FXushort& codec); /** * Save an TIFF (Tagged Image File Format) file to a stream. */ extern FXAPI bool fxsaveTIF(FXStream& store,const FXColor* data,FXint width,FXint height,FXushort codec); } #endif fox1.6-1.6.57/include/FXTabBar.h000066400000000000000000000123501326741342000160230ustar00rootroot00000000000000/******************************************************************************** * * * T a b B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTabBar.h,v 1.15 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXTABBAR_H #define FXTABBAR_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { /// Tab Book options enum { TABBOOK_TOPTABS = 0, /// Tabs on top (default) TABBOOK_BOTTOMTABS = 0x00020000, /// Tabs on bottom TABBOOK_SIDEWAYS = 0x00040000, /// Tabs on left TABBOOK_LEFTTABS = TABBOOK_SIDEWAYS|TABBOOK_TOPTABS, /// Tabs on left TABBOOK_RIGHTTABS = TABBOOK_SIDEWAYS|TABBOOK_BOTTOMTABS, /// Tabs on right TABBOOK_NORMAL = TABBOOK_TOPTABS /// Normal tabs }; /** * The tab bar layout manager arranges tab items side by side, * and raises the active tab item above the neighboring tab items. * In a the horizontal arrangement, the tab bar can have the tab * items on the top or on the bottom. In the vertical arrangement, * the tabs can be on the left or on the right. * When one of the tab items is pressed, the tab bar's setCurrent() * is called with notify=TRUE. Thus causes the tab bar to send a * SEL_COMMAND message to its target. */ class FXAPI FXTabBar : public FXPacker { FXDECLARE(FXTabBar) protected: FXint current; // Current tab index FXint shift; // Shift amount protected: FXTabBar(){} private: FXTabBar(const FXTabBar&); FXTabBar& operator=(const FXTabBar&); public: long onPaint(FXObject*,FXSelector,void*); long onFocusNext(FXObject*,FXSelector,void*); long onFocusPrev(FXObject*,FXSelector,void*); long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusLeft(FXObject*,FXSelector,void*); long onFocusRight(FXObject*,FXSelector,void*); long onCmdOpenItem(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdOpen(FXObject*,FXSelector,void*); long onUpdOpen(FXObject*,FXSelector,void*); public: enum { ID_OPEN_ITEM=FXPacker::ID_LAST, /// Sent from one of the FXTabItems ID_OPEN_FIRST, /// Switch to panel ID_OPEN_FIRST+i ID_OPEN_SECOND, ID_OPEN_THIRD, ID_OPEN_FOURTH, ID_OPEN_FIFTH, ID_OPEN_SIXTH, ID_OPEN_SEVENTH, ID_OPEN_EIGHTH, ID_OPEN_NINETH, ID_OPEN_TENTH, ID_OPEN_LAST=ID_OPEN_FIRST+100, ID_LAST }; public: /// Construct a tab bar FXTabBar(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=TABBOOK_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_SPACING,FXint pr=DEFAULT_SPACING,FXint pt=DEFAULT_SPACING,FXint pb=DEFAULT_SPACING); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Perform layout virtual void layout(); /** * Change currently active tab item; this raises the active tab item * slightly above the neighboring tab items. If notify=TRUE then the * tab bar will also send a SEL_COMMAND message to its target. */ virtual void setCurrent(FXint panel,FXbool notify=FALSE); /// Return the currently active tab item FXint getCurrent() const { return current; } /// Return tab bar style FXuint getTabStyle() const; /// Change tab tab style void setTabStyle(FXuint style); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXTabBook.h000066400000000000000000000074111326741342000162130ustar00rootroot00000000000000/******************************************************************************** * * * T a b B o o k W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTabBook.h,v 1.10 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXTABBOOK_H #define FXTABBOOK_H #ifndef FXTABBAR_H #include "FXTabBar.h" #endif namespace FX { /** * The tab book layout manager arranges pairs of children; * the even numbered children (0,2,4,...) are usually tab items, * and are placed on the top. The odd numbered children are * usually layout managers, and are placed below; all the odd * numbered children are placed on top of each other, similar * to the switcher widget. When the user presses one of the * tab items, the tab item is raised above the neighboring tabs, * and the corresponding panel is raised to the top. * Thus, a tab book can be used to present many GUI controls * in a small space by placing several panels on top of each * other and using tab items to select the desired panel. * When one of the tab items is pressed, the tab book's setCurrent() * is called with notify=TRUE. Thus causes the tab book to send a * SEL_COMMAND message to its target. */ class FXAPI FXTabBook : public FXTabBar { FXDECLARE(FXTabBook) protected: FXTabBook(){} private: FXTabBook(const FXTabBook&); FXTabBook& operator=(const FXTabBook&); public: long onPaint(FXObject*,FXSelector,void*); long onFocusNext(FXObject*,FXSelector,void*); long onFocusPrev(FXObject*,FXSelector,void*); long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusLeft(FXObject*,FXSelector,void*); long onFocusRight(FXObject*,FXSelector,void*); long onCmdOpenItem(FXObject*,FXSelector,void*); public: /// Construct tab book FXTabBook(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=TABBOOK_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_SPACING,FXint pr=DEFAULT_SPACING,FXint pt=DEFAULT_SPACING,FXint pb=DEFAULT_SPACING); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); }; } #endif fox1.6-1.6.57/include/FXTabItem.h000066400000000000000000000100651326741342000162160ustar00rootroot00000000000000/******************************************************************************** * * * T a b I t e m W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTabItem.h,v 1.10 2006/01/22 17:58:10 fox Exp $ * ********************************************************************************/ #ifndef FXTABITEM_H #define FXTABITEM_H #ifndef FXLABEL_H #include "FXLabel.h" #endif namespace FX { /// Tab Item orientations which affect border enum { TAB_TOP = 0, // Top side tabs TAB_LEFT = 0x00800000, // Left side tabs TAB_RIGHT = 0x01000000, // Right side tabs TAB_BOTTOM = 0x01800000, // Bottom side tabs TAB_TOP_NORMAL = JUSTIFY_NORMAL|ICON_BEFORE_TEXT|TAB_TOP|FRAME_RAISED|FRAME_THICK, TAB_BOTTOM_NORMAL= JUSTIFY_NORMAL|ICON_BEFORE_TEXT|TAB_BOTTOM|FRAME_RAISED|FRAME_THICK, TAB_LEFT_NORMAL = JUSTIFY_LEFT|JUSTIFY_CENTER_Y|ICON_BEFORE_TEXT|TAB_LEFT|FRAME_RAISED|FRAME_THICK, TAB_RIGHT_NORMAL = JUSTIFY_LEFT|JUSTIFY_CENTER_Y|ICON_BEFORE_TEXT|TAB_RIGHT|FRAME_RAISED|FRAME_THICK }; class FXTabBar; /** * A tab item is placed in a tab bar or tab book. * When selected, the tab item sends a message to its * parent, and causes itself to become the active tab, * and raised slightly above the other tabs. * In the tab book, activating a tab item also causes * the corresponding panel to be raised to the top. */ class FXAPI FXTabItem : public FXLabel { FXDECLARE(FXTabItem) protected: FXTabItem(){} private: FXTabItem(const FXTabItem&); FXTabItem& operator=(const FXTabItem&); public: long onPaint(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); public: /// Construct a tab item FXTabItem(FXTabBar* p,const FXString& text,FXIcon* ic=0,FXuint opts=TAB_TOP_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Returns true because a tab item can receive focus virtual bool canFocus() const; /// Return current tab item orientation FXuint getTabOrientation() const; /// Change tab item orientation void setTabOrientation(FXuint style); }; } #endif fox1.6-1.6.57/include/FXTable.h000066400000000000000000001100321326741342000157130ustar00rootroot00000000000000/******************************************************************************** * * * T a b l e W i d g e t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTable.h,v 1.166.2.1 2006/06/07 15:51:04 fox Exp $ * ********************************************************************************/ #ifndef FXTABLE_H #define FXTABLE_H #ifndef FXSCROLLAREA_H #include "FXScrollArea.h" #endif namespace FX { class FXIcon; class FXFont; class FXTable; class FXHeader; class FXButton; /// Default cell margin enum { DEFAULT_MARGIN = 2 }; /// Table options enum { TABLE_COL_SIZABLE = 0x00100000, /// Columns are resizable TABLE_ROW_SIZABLE = 0x00200000, /// Rows are resizable TABLE_NO_COLSELECT = 0x00400000, /// Disallow column selections TABLE_NO_ROWSELECT = 0x00800000, /// Disallow row selections TABLE_READONLY = 0x01000000, /// Table is NOT editable TABLE_COL_RENUMBER = 0x02000000, /// Renumber columns TABLE_ROW_RENUMBER = 0x04000000 /// Renumber rows }; /// Position in table struct FXTablePos { FXint row; FXint col; }; /// Range of table cells struct FXTableRange { FXTablePos fm; FXTablePos to; }; /// Item in table class FXAPI FXTableItem : public FXObject { FXDECLARE(FXTableItem) friend class FXTable; protected: FXString label; FXIcon *icon; void *data; FXuint state; private: FXTableItem(const FXTableItem&); FXTableItem& operator=(const FXTableItem&); protected: FXTableItem():icon(NULL),data(NULL),state(0){} FXint textWidth(const FXTable* table) const; FXint textHeight(const FXTable* table) const; virtual void draw(const FXTable* table,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const; virtual void drawBorders(const FXTable* table,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const; virtual void drawContent(const FXTable* table,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const; virtual void drawPattern(const FXTable* table,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const; virtual void drawBackground(const FXTable* table,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const; public: enum{ SELECTED = 0x00000001, /// Selected FOCUS = 0x00000002, /// Focus DISABLED = 0x00000004, /// Disabled DRAGGABLE = 0x00000008, /// Draggable RESERVED1 = 0x00000010, /// Reserved RESERVED2 = 0x00000020, /// Reserved ICONOWNED = 0x00000040, /// Icon owned by table item RIGHT = 0x00002000, /// Align on right (default) LEFT = 0x00004000, /// Align on left CENTER_X = 0, /// Aling centered horizontally TOP = 0x00008000, /// Align on top BOTTOM = 0x00010000, /// Align on bottom CENTER_Y = 0, /// Aling centered vertically (default) BEFORE = 0x00020000, /// Icon before the text AFTER = 0x00040000, /// Icon after the text ABOVE = 0x00080000, /// Icon above the text BELOW = 0x00100000, /// Icon below the text LBORDER = 0x00200000, /// Draw left border RBORDER = 0x00400000, /// Draw right border TBORDER = 0x00800000, /// Draw top border BBORDER = 0x01000000 /// Draw bottom border }; public: /// Construct new table item FXTableItem(const FXString& text,FXIcon* ic=NULL,void* ptr=NULL):label(text),icon(ic),data(ptr),state(RIGHT|CENTER_Y){} /// Change item's text label virtual void setText(const FXString& txt); /// Return item's text label virtual FXString getText() const { return label; } /// Change item's icon, deleting the old icon if it was owned virtual void setIcon(FXIcon* icn,FXbool owned=FALSE); /// Return item's icon virtual FXIcon* getIcon() const { return icon; } /// Change item's user data void setData(void* ptr){ data=ptr; } /// Get item's user data void* getData() const { return data; } /// Make item draw as focused virtual void setFocus(FXbool focus); /// Return true if item has focus FXbool hasFocus() const { return (state&FOCUS)!=0; } /// Select item virtual void setSelected(FXbool selected); /// Return true if this item is selected FXbool isSelected() const { return (state&SELECTED)!=0; } /// Enable or disable item virtual void setEnabled(FXbool enabled); /// Return true if this item is enabled FXbool isEnabled() const { return (state&DISABLED)==0; } /// Make item draggable virtual void setDraggable(FXbool draggable); /// Return true if this item is draggable FXbool isDraggable() const { return (state&DRAGGABLE)!=0; } /// Change item content justification virtual void setJustify(FXuint justify=RIGHT|CENTER_Y); /// Return item content justification FXuint getJustify() const { return state&(RIGHT|LEFT|TOP|BOTTOM); } /// Change item icon position virtual void setIconPosition(FXuint mode); /// Return item icon position FXuint getIconPosition() const { return state&(BEFORE|AFTER|ABOVE|BELOW); } /// Change item borders virtual void setBorders(FXuint borders=0); /// Return item borders FXuint getBorders() const { return state&(LBORDER|RBORDER|TBORDER|BBORDER); } /// Change item background stipple virtual void setStipple(FXStipplePattern pattern); /// Return item background stipple FXStipplePattern getStipple() const; /// Create input control for editing this item virtual FXWindow *getControlFor(FXTable* table); /// Set value from input control virtual void setFromControl(FXWindow *control); /// Return width of item virtual FXint getWidth(const FXTable* table) const; /// Return height of item virtual FXint getHeight(const FXTable* table) const; /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy item and free icon if owned virtual ~FXTableItem(); }; /// Combobox Item class FXAPI FXComboTableItem : public FXTableItem { FXDECLARE(FXComboTableItem) protected: FXString selections; private: FXComboTableItem(const FXComboTableItem&); FXComboTableItem& operator=(const FXComboTableItem&); protected: FXComboTableItem(){} public: /// Construct new table item FXComboTableItem(const FXString& text,FXIcon* ic=NULL,void* ptr=NULL); /// Create input control for editing this item virtual FXWindow *getControlFor(FXTable* table); /// Set value from input control virtual void setFromControl(FXWindow *control); /// Set selections as newline-separated strings void setSelections(const FXString& strings); /// Return selections const FXString& getSelections() const { return selections; } }; /** * The Table widget displays a table of items, each with a text and optional * icon. A column Header control provide captions for each column, and a row * Header control provides captions for each row. Columns are resizable by * means of the column Header control if the TABLE_COL_SIZABLE option is passed. * Likewise, rows in the table are resizable if the TABLE_ROW_SIZABLE option is * specified. An entire row (column) can be selected by clicking on the a button * in the row (column) Header control. Passing TABLE_NO_COLSELECT disables column * selection, and passing TABLE_NO_ROWSELECT disables column selection. * When TABLE_COL_RENUMBER is specified, columns are automatically renumbered when * columns are added or removed. Similarly, TABLE_ROW_RENUMBER will cause row numbers * to be recalculated automatically when rows are added or removed. * To disable editing of cells in the table, the TABLE_READONLY can be specified. * Cells in the table may or may not have items in them. When populating a cell * for the first time, an item will be automatically created if necessary. Thus, * a cell in the table takes no space unless it has actual contents. * Moreover, a contiguous, rectangular region of cells in the table may refer to * one single item; in that case, the item will be stretched to cover all the * cells in the region, and no grid lines will be drawn interior to the spanning * item. * The Table widget issues SEL_SELECTED or SEL_DESELECTED when cells are selected * or deselected, respectively. The table position affected is passed along as the * 3rd parameter of these messages. * Whenever the current (focus) item is changed, a SEL_CHANGED message is sent with * the new table position as a parameter. * When items are added to the table, a SEL_INSERTED message is sent, with the table * range of the newly added cells as the parameter in the message. * When items are removed from the table, a SEL_DELETED message is sent prior to the * removal of the items, and the table range of the removed cells is passed as a parameter. * A SEL_REPLACED message is sent when the contents of a cell are changed, either through * editing or by other means; the parameter is the range of affected cells. This message * is sent prior to the change. * SEL_CLICKED, SEL_DOUBLECLICKED, and SEL_TRIPLECLICKED messages are sent when a cell * is clicked, double-clicked, or triple-clicked, respectively. * A SEL_COMMAND is sent when an enabled item is clicked inside the table. */ class FXAPI FXTable : public FXScrollArea { FXDECLARE(FXTable) protected: FXHeader *colHeader; // Column header FXHeader *rowHeader; // Row header FXButton *cornerButton; // Corner button FXTableItem **cells; // Cells FXWindow *editor; // Editor widget FXFont *font; // Font FXint nrows; // Number of rows FXint ncols; // Number of columns FXint visiblerows; // Visible rows FXint visiblecols; // Visible columns FXint margintop; // Margin top FXint marginbottom; // Margin bottom FXint marginleft; // Margin left FXint marginright; // Margin right FXColor textColor; // Normal text color FXColor baseColor; // Base color FXColor hiliteColor; // Highlight color FXColor shadowColor; // Shadow color FXColor borderColor; // Border color FXColor selbackColor; // Select background color FXColor seltextColor; // Select text color FXColor gridColor; // Grid line color FXColor stippleColor; // Stipple color FXColor cellBorderColor; // Cell border color FXint cellBorderWidth; // Cell border width FXColor cellBackColor[2][2]; // Row/Column even/odd background color FXint defColWidth; // Default column width [if uniform columns] FXint defRowHeight; // Default row height [if uniform rows] FXTablePos current; // Current position FXTablePos anchor; // Anchor position FXTableRange input; // Input cell FXTableRange selection; // Range of selected cells FXString clipped; // Clipped text FXbool hgrid; // Horizontal grid lines shown FXbool vgrid; // Vertical grid lines shown FXuchar mode; // Mode widget is in FXint grabx; // Grab point x FXint graby; // Grab point y FXint rowcol; // Row or column being resized FXString help; public: static FXDragType csvType; static const FXchar csvTypeName[]; protected: FXTable(); FXint startRow(FXint row,FXint col) const; FXint startCol(FXint row,FXint col) const; FXint endRow(FXint row,FXint col) const; FXint endCol(FXint row,FXint col) const; void spanningRange(FXint& sr,FXint& er,FXint& sc,FXint& ec,FXint anchrow,FXint anchcol,FXint currow,FXint curcol); virtual void moveContents(FXint x,FXint y); virtual void drawCell(FXDC& dc,FXint sr,FXint er,FXint sc,FXint ec); virtual void drawRange(FXDC& dc,FXint rlo,FXint rhi,FXint clo,FXint chi); virtual void drawHGrid(FXDC& dc,FXint rlo,FXint rhi,FXint clo,FXint chi); virtual void drawVGrid(FXDC& dc,FXint rlo,FXint rhi,FXint clo,FXint chi); virtual void drawContents(FXDC& dc,FXint x,FXint y,FXint w,FXint h); virtual FXTableItem* createItem(const FXString& text,FXIcon* icon,void* ptr); virtual FXWindow *getControlForItem(FXint r,FXint c); virtual void setItemFromControl(FXint r,FXint c,FXWindow *control); virtual void updateColumnNumbers(FXint lo,FXint hi); virtual void updateRowNumbers(FXint lo,FXint hi); protected: enum { MOUSE_NONE, MOUSE_SCROLL, MOUSE_DRAG, MOUSE_SELECT }; private: FXTable(const FXTable&); FXTable& operator=(const FXTable&); public: long onPaint(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onSelectionLost(FXObject*,FXSelector,void*); long onSelectionGained(FXObject*,FXSelector,void*); long onSelectionRequest(FXObject*,FXSelector,void* ptr); long onClipboardLost(FXObject*,FXSelector,void*); long onClipboardGained(FXObject*,FXSelector,void*); long onClipboardRequest(FXObject*,FXSelector,void*); long onAutoScroll(FXObject*,FXSelector,void*); long onCommand(FXObject*,FXSelector,void*); long onClicked(FXObject*,FXSelector,void*); long onDoubleClicked(FXObject*,FXSelector,void*); long onTripleClicked(FXObject*,FXSelector,void*); long onCmdToggleEditable(FXObject*,FXSelector,void*); long onUpdToggleEditable(FXObject*,FXSelector,void*); // Visual characteristics long onCmdHorzGrid(FXObject*,FXSelector,void*); long onUpdHorzGrid(FXObject*,FXSelector,void*); long onCmdVertGrid(FXObject*,FXSelector,void*); long onUpdVertGrid(FXObject*,FXSelector,void*); // Row/Column manipulations long onCmdDeleteColumn(FXObject*,FXSelector,void*); long onUpdDeleteColumn(FXObject*,FXSelector,void*); long onCmdDeleteRow(FXObject*,FXSelector,void*); long onUpdDeleteRow(FXObject*,FXSelector,void*); long onCmdInsertColumn(FXObject*,FXSelector,void*); long onUpdInsertColumn(FXObject*,FXSelector,void*); long onCmdInsertRow(FXObject*,FXSelector,void*); long onUpdInsertRow(FXObject*,FXSelector,void*); // Movement long onCmdMoveRight(FXObject*,FXSelector,void*); long onCmdMoveLeft(FXObject*,FXSelector,void*); long onCmdMoveUp(FXObject*,FXSelector,void*); long onCmdMoveDown(FXObject*,FXSelector,void*); long onCmdMoveHome(FXObject*,FXSelector,void*); long onCmdMoveEnd(FXObject*,FXSelector,void*); long onCmdMoveTop(FXObject*,FXSelector,void*); long onCmdMoveBottom(FXObject*,FXSelector,void*); long onCmdMovePageDown(FXObject*,FXSelector,void*); long onCmdMovePageUp(FXObject*,FXSelector,void*); // Mark and extend long onCmdMark(FXObject*,FXSelector,void*); long onCmdExtend(FXObject*,FXSelector,void*); // Changing Selection long onUpdSelectCell(FXObject*,FXSelector,void*); long onCmdSelectCell(FXObject*,FXSelector,void*); long onUpdSelectRow(FXObject*,FXSelector,void*); long onCmdSelectRow(FXObject*,FXSelector,void*); long onUpdSelectColumn(FXObject*,FXSelector,void*); long onCmdSelectColumn(FXObject*,FXSelector,void*); long onCmdSelectRowIndex(FXObject*,FXSelector,void*); long onCmdSelectColumnIndex(FXObject*,FXSelector,void*); long onUpdSelectAll(FXObject*,FXSelector,void*); long onCmdSelectAll(FXObject*,FXSelector,void*); long onUpdDeselectAll(FXObject*,FXSelector,void*); long onCmdDeselectAll(FXObject*,FXSelector,void*); // Manipulation Selection long onCmdCutSel(FXObject*,FXSelector,void*); long onCmdCopySel(FXObject*,FXSelector,void*); long onCmdDeleteSel(FXObject*,FXSelector,void*); long onCmdPasteSel(FXObject*,FXSelector,void*); long onUpdHaveSelection(FXObject*,FXSelector,void*); // Edit control long onCmdStartInput(FXObject*,FXSelector,void*); long onUpdStartInput(FXObject*,FXSelector,void*); long onCmdAcceptInput(FXObject*,FXSelector,void*); long onUpdAcceptInput(FXObject*,FXSelector,void*); long onCmdCancelInput(FXObject*,FXSelector,void*); public: enum { ID_HORZ_GRID=FXScrollArea::ID_LAST, ID_VERT_GRID, ID_TOGGLE_EDITABLE, ID_DELETE_COLUMN, ID_DELETE_ROW, ID_INSERT_COLUMN, ID_INSERT_ROW, ID_SELECT_COLUMN_INDEX, ID_SELECT_ROW_INDEX, ID_SELECT_COLUMN, ID_SELECT_ROW, ID_SELECT_CELL, ID_SELECT_ALL, ID_DESELECT_ALL, ID_MOVE_LEFT, ID_MOVE_RIGHT, ID_MOVE_UP, ID_MOVE_DOWN, ID_MOVE_HOME, ID_MOVE_END, ID_MOVE_TOP, ID_MOVE_BOTTOM, ID_MOVE_PAGEDOWN, ID_MOVE_PAGEUP, ID_START_INPUT, ID_CANCEL_INPUT, ID_ACCEPT_INPUT, ID_MARK, ID_EXTEND, ID_CUT_SEL, ID_COPY_SEL, ID_PASTE_SEL, ID_DELETE_SEL, ID_LAST }; public: /** * Construct a new table. * The table is initially empty, and reports a default size based on * the scroll areas's scrollbar placement policy. */ FXTable(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_MARGIN,FXint pr=DEFAULT_MARGIN,FXint pt=DEFAULT_MARGIN,FXint pb=DEFAULT_MARGIN); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Computes content width virtual FXint getContentWidth(); /// Computes content height virtual FXint getContentHeight(); /// Create the server-side resources virtual void create(); /// Detach the server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Mark this window's layout as dirty virtual void recalc(); /// Table widget can receive focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Notification that focus moved to new child virtual void changeFocus(FXWindow *child); /// Return button in the top/left corner FXButton* getCornerButton() const { return cornerButton; } /// Return column header control FXHeader* getColumnHeader() const { return colHeader; } /// Return row header control FXHeader* getRowHeader() const { return rowHeader; } /// Change visible rows void setVisibleRows(FXint nvrows); /// return number of visible rows FXint getVisibleRows() const { return visiblerows; } /// Change visible columns void setVisibleColumns(FXint nvcols); /// Return number of visible columns FXint getVisibleColumns() const { return visiblecols; } /// Return TRUE if table is editable FXbool isEditable() const; /// Set editable flag void setEditable(FXbool edit=TRUE); /// Show or hide horizontal grid void showHorzGrid(FXbool on=TRUE); /// Is horizontal grid shown FXbool isHorzGridShown() const { return hgrid; } /// Show or hide vertical grid void showVertGrid(FXbool on=TRUE); /// Is vertical grid shown FXbool isVertGridShown() const { return vgrid; } /// Get number of rows FXint getNumRows() const { return nrows; } /// Get number of columns FXint getNumColumns() const { return ncols; } /// Change top cell margin void setMarginTop(FXint pt); /// Return top cell margin FXint getMarginTop() const { return margintop; } /// Change bottom cell margin void setMarginBottom(FXint pb); /// Return bottom cell margin FXint getMarginBottom() const { return marginbottom; } /// Change left cell margin void setMarginLeft(FXint pl); /// Return left cell margin FXint getMarginLeft() const { return marginleft; } /// Change right cell margin void setMarginRight(FXint pr); /// Return right cell margin FXint getMarginRight() const { return marginright; } /** * Start input mode for the cell at the given position. * An input control is created which is used to edit the cell; * it is filled by the original item's contents if the cell contained * an item. You can enter input mode also by sending the table an * ID_START_INPUT message. */ virtual void startInput(FXint row,FXint col); /** * Cancel input mode. The input control is immediately deleted * and the cell will retain its old value. You can also cancel * input mode by sending the table an ID_CANCEL_INPUT message. */ virtual void cancelInput(); /** * End input mode and accept the new value from the control. * The item in the cell will be set to the value from the control, * and the control will be deleted. If TRUE is passed, a SEL_REPLACED * callback will be generated to signify to the target that this call * has a new value. You can also accept the input by sending the table * an ID_ACCEPT_INPUT message. */ virtual void acceptInput(FXbool notify=FALSE); /** * Determine column containing x. * Returns -1 if x left of first column, and ncols if x right of last column; * otherwise, returns column in table containing x. */ FXint colAtX(FXint x) const; /** * Determine row containing y. * Returns -1 if y above first row, and nrows if y below last row; * otherwise, returns row in table containing y. */ FXint rowAtY(FXint y) const; /// Return the item at the given index FXTableItem *getItem(FXint row,FXint col) const; /// Replace the item with a [possibly subclassed] item void setItem(FXint row,FXint col,FXTableItem* item,FXbool notify=FALSE); /// Set the table size to nr rows and nc columns; all existing items will be removed virtual void setTableSize(FXint nr,FXint nc,FXbool notify=FALSE); /// Insert new row virtual void insertRows(FXint row,FXint nr=1,FXbool notify=FALSE); /// Insert new column virtual void insertColumns(FXint col,FXint nc=1,FXbool notify=FALSE); /// Remove rows of cells virtual void removeRows(FXint row,FXint nr=1,FXbool notify=FALSE); /// Remove column of cells virtual void removeColumns(FXint col,FXint nc=1,FXbool notify=FALSE); /// Extract item from table virtual FXTableItem* extractItem(FXint row,FXint col,FXbool notify=FALSE); /// Clear single cell virtual void removeItem(FXint row,FXint col,FXbool notify=FALSE); /// Clear all cells in the given range virtual void removeRange(FXint startrow,FXint endrow,FXint startcol,FXint endcol,FXbool notify=FALSE); /// Remove all items from table virtual void clearItems(FXbool notify=FALSE); /// Scroll to make cell at r,c fully visible virtual void makePositionVisible(FXint r,FXint c); /// Return TRUE if item partially visible FXbool isItemVisible(FXint r,FXint c) const; /** * Change column header height mode to fixed or variable. * In variable height mode, the column header will size to * fit the contents in it. In fixed mode, the size is * explicitly set using setColumnHeaderHeight(). */ void setColumnHeaderMode(FXuint hint=LAYOUT_FIX_HEIGHT); /// Return column header height mode FXuint getColumnHeaderMode() const; /** * Change row header width mode to fixed or variable. * In variable width mode, the row header will size to * fit the contents in it. In fixed mode, the size is * explicitly set using setRowHeaderWidth(). */ void setRowHeaderMode(FXuint hint=LAYOUT_FIX_WIDTH); /// Return row header width mode FXuint getRowHeaderMode() const; /// Set column header font void setColumnHeaderFont(FXFont* fnt); /// Return column header font FXFont* getColumnHeaderFont() const; /// Set row header font void setRowHeaderFont(FXFont* fnt); /// Return row header font FXFont* getRowHeaderFont() const; /// Change column header height void setColumnHeaderHeight(FXint h); /// Return column header height FXint getColumnHeaderHeight() const; /// Change row header width void setRowHeaderWidth(FXint w); /// Return row header width FXint getRowHeaderWidth() const; /// Get X coordinate of column FXint getColumnX(FXint col) const; /// Get Y coordinate of row FXint getRowY(FXint row) const; /// Change column width virtual void setColumnWidth(FXint col,FXint cwidth); /// Get column width FXint getColumnWidth(FXint col) const; /// Change row height virtual void setRowHeight(FXint row,FXint rheight); /// Get row height FXint getRowHeight(FXint row) const; /// Change default column width void setDefColumnWidth(FXint cwidth); /// Get default column width FXint getDefColumnWidth() const { return defColWidth; } /// Change default row height void setDefRowHeight(FXint rheight); /// Get default row height FXint getDefRowHeight() const { return defRowHeight; } /// Return minimum row height FXint getMinRowHeight(FXint r) const; /// Return minimum column width FXint getMinColumnWidth(FXint c) const; /// Fit row heights to contents void fitRowsToContents(FXint row,FXint nr=1); /// Fit column widths to contents void fitColumnsToContents(FXint col,FXint nc=1); /// Change column header text void setColumnText(FXint index,const FXString& text); /// Return text of column header at index FXString getColumnText(FXint index) const; /// Change row header text void setRowText(FXint index,const FXString& text); /// Return text of row header at index FXString getRowText(FXint index) const; /// Change column header icon void setColumnIcon(FXint index,FXIcon* icon); /// Return icon of column header at index FXIcon* getColumnIcon(FXint index) const; /// Change row header icon void setRowIcon(FXint index,FXIcon* icon); /// Return icon of row header at index FXIcon* getRowIcon(FXint index) const; /// Change column header icon position, e.g. FXHeaderItem::BEFORE, etc. void setColumnIconPosition(FXint index,FXuint mode); /// Return icon position of column header at index FXuint getColumnIconPosition(FXint index) const; /// Change row header icon position, e.g. FXHeaderItem::BEFORE, etc. void setRowIconPosition(FXint index,FXuint mode); /// Return icon position of row header at index FXuint getRowIconPosition(FXint index) const; /// Change column header justify, e.g. FXHeaderItem::RIGHT, etc. void setColumnJustify(FXint index,FXuint justify); /// Return justify of column header at index FXuint getColumnJustify(FXint index) const; /// Change row header justify, e.g. FXHeaderItem::RIGHT, etc. void setRowJustify(FXint index,FXuint justify); /// Return justify of row header at index FXuint getRowJustify(FXint index) const; /// Modify cell text void setItemText(FXint r,FXint c,const FXString& text,FXbool notify=FALSE); /// Return cell text FXString getItemText(FXint r,FXint c) const; /// Modify cell icon, deleting the old icon if it was owned void setItemIcon(FXint r,FXint c,FXIcon* icon,FXbool owned=FALSE,FXbool notify=FALSE); /// Return cell icon FXIcon* getItemIcon(FXint r,FXint c) const; /// Modify cell user-data void setItemData(FXint r,FXint c,void* ptr); void* getItemData(FXint r,FXint c) const; /** * Extract cells from given range as text, each column separated by a string cs, * and each row separated by a string rs. */ void extractText(FXchar*& text,FXint& size,FXint startrow,FXint endrow,FXint startcol,FXint endcol,const FXchar* cs="\t",const FXchar* rs="\n") const; void extractText(FXString& text,FXint startrow,FXint endrow,FXint startcol,FXint endcol,const FXchar* cs="\t",const FXchar* rs="\n") const; /** * Overlay text over given cell range; the text is interpreted as * a number of columns separated by a character from the set cs, and * a number of rows separated by a character from the set rs. * Cells outside the given cell range are unaffected. */ void overlayText(FXint startrow,FXint endrow,FXint startcol,FXint endcol,const FXchar* text,FXint size,const FXchar* cs="\t,",const FXchar* rs="\n",FXbool notify=FALSE); void overlayText(FXint startrow,FXint endrow,FXint startcol,FXint endcol,const FXString& text,const FXchar* cs="\t,",const FXchar* rs="\n",FXbool notify=FALSE); /** * Determine the number of rows and columns in a block of text * where columns are separated by characters from the set cs, and rows * are separated by characters from the set rs. */ void countText(FXint& nr,FXint& nc,const FXchar* text,FXint size,const FXchar* cs="\t,",const FXchar* rs="\n") const; void countText(FXint& nr,FXint& nc,const FXString& text,const FXchar* cs="\t,",const FXchar* rs="\n") const; /// Return TRUE if its a spanning cell FXbool isItemSpanning(FXint r,FXint c) const; /// Repaint cells between grid lines sr,er and grid lines sc,ec void updateRange(FXint sr,FXint er,FXint sc,FXint ec) const; /// Repaint cell at r,c void updateItem(FXint r,FXint c) const; /// Enable item virtual FXbool enableItem(FXint r,FXint c); /// Disable item virtual FXbool disableItem(FXint r,FXint c); /// Is item enabled FXbool isItemEnabled(FXint r,FXint c) const; /** * Change item justification. Horizontal justification is controlled by passing * FXTableItem::RIGHT, FXTableItem::LEFT, or FXTableItem::CENTER_X. * Vertical justification is controlled by FXTableItem::TOP, FXTableItem::BOTTOM, * or FXTableItem::CENTER_Y. * The default is a combination of FXTableItem::RIGHT and FXTableItem::CENTER_Y. */ void setItemJustify(FXint r,FXint c,FXuint justify); /// Return item justification FXuint getItemJustify(FXint r,FXint c) const; /** * Change relative position of icon and text of item. * Passing FXTableItem::BEFORE or FXTableItem::AFTER places the icon * before or after the text, and passing FXTableItem::ABOVE or * FXTableItem::BELOW places it above or below the text, respectively. * The default is 0 which places the text on top of the icon. */ void setItemIconPosition(FXint r,FXint c,FXuint mode); /// Return relative icon and text position FXuint getItemIconPosition(FXint r,FXint c) const; /** * Change item borders style. Borders on each side of the item can be turned * controlled individually using FXTableItem::LBORDER, FXTableItem::RBORDER, * FXTableItem::TBORDER and FXTableItem::BBORDER. */ void setItemBorders(FXint r,FXint c,FXuint borders); /// Return item border style FXuint getItemBorders(FXint r,FXint c) const; /// Change item background stipple style void setItemStipple(FXint r,FXint c,FXStipplePattern pat); /// return item background stipple style FXStipplePattern getItemStipple(FXint r,FXint c) const; /// Change current item virtual void setCurrentItem(FXint r,FXint c,FXbool notify=FALSE); /// Get row number of current item FXint getCurrentRow() const { return current.row; } /// Get column number of current item FXint getCurrentColumn() const { return current.col; } /// Is item current FXbool isItemCurrent(FXint r,FXint c) const; /// Change anchor item void setAnchorItem(FXint r,FXint c); /// Get row number of anchor item FXint getAnchorRow() const { return anchor.row; } /// Get column number of anchor item FXint getAnchorColumn() const { return anchor.col; } /// Get selection start row; returns -1 if no selection FXint getSelStartRow() const { return selection.fm.row; } /// Get selection start column; returns -1 if no selection FXint getSelStartColumn() const { return selection.fm.col; } /// Get selection end row; returns -1 if no selection FXint getSelEndRow() const { return selection.to.row; } /// Get selection end column; returns -1 if no selection FXint getSelEndColumn() const { return selection.to.col; } /// Is cell selected FXbool isItemSelected(FXint r,FXint c) const; /// Is row of cells selected FXbool isRowSelected(FXint r) const; /// Is column selected FXbool isColumnSelected(FXint c) const; /// Is anything selected FXbool isAnythingSelected() const; /// Select a row virtual FXbool selectRow(FXint row,FXbool notify=FALSE); /// Select a column virtual FXbool selectColumn(FXint col,FXbool notify=FALSE); /// Select range virtual FXbool selectRange(FXint startrow,FXint endrow,FXint startcol,FXint endcol,FXbool notify=FALSE); /// Extend selection virtual FXbool extendSelection(FXint r,FXint c,FXbool notify=FALSE); /// Kill selection virtual FXbool killSelection(FXbool notify=FALSE); /// Change font void setFont(FXFont* fnt); /// Return current font FXFont* getFont() const { return font; } /// Obtain colors of various parts FXColor getTextColor() const { return textColor; } FXColor getBaseColor() const { return baseColor; } FXColor getHiliteColor() const { return hiliteColor; } FXColor getShadowColor() const { return shadowColor; } FXColor getBorderColor() const { return borderColor; } FXColor getSelBackColor() const { return selbackColor; } FXColor getSelTextColor() const { return seltextColor; } FXColor getGridColor() const { return gridColor; } FXColor getStippleColor() const { return stippleColor; } FXColor getCellBorderColor() const { return cellBorderColor; } /// Change colors of various parts void setTextColor(FXColor clr); void setBaseColor(FXColor clr); void setHiliteColor(FXColor clr); void setShadowColor(FXColor clr); void setBorderColor(FXColor clr); void setSelBackColor(FXColor clr); void setSelTextColor(FXColor clr); void setGridColor(FXColor clr); void setStippleColor(FXColor clr); void setCellBorderColor(FXColor clr); /// Change cell background color for even/odd rows/columns void setCellColor(FXint r,FXint c,FXColor clr); /// Obtain cell background color for even/odd rows/columns FXColor getCellColor(FXint r,FXint c) const; /// Change cell border width void setCellBorderWidth(FXint borderwidth); /// Return cell border width FXint getCellBorderWidth() const { return cellBorderWidth; } /// Change table style void setTableStyle(FXuint style); /// Return table style FXuint getTableStyle() const; /// Set column renumbering void setColumnRenumbering(FXbool flag); /// Get column renumbering FXbool getColumnRenumbering() const; /// Set row renumbering void setRowRenumbering(FXbool flag); /// Get row renumbering FXbool getRowRenumbering() const; /// Change help text void setHelpText(const FXString& text){ help=text; } const FXString& getHelpText() const { return help; } /// Serialize virtual void save(FXStream& store) const; virtual void load(FXStream& store); virtual ~FXTable(); }; } #endif fox1.6-1.6.57/include/FXText.h000066400000000000000000000760501326741342000156230ustar00rootroot00000000000000/******************************************************************************** * * * M u l t i - L i ne T e x t W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXText.h,v 1.166 2006/02/06 03:03:40 fox Exp $ * ********************************************************************************/ #ifndef FXTEXT_H #define FXTEXT_H #ifndef FXSCROLLAREA_H #include "FXScrollArea.h" #endif namespace FX { /// Text widget options enum { TEXT_READONLY = 0x00100000, /// Text is NOT editable TEXT_WORDWRAP = 0x00200000, /// Wrap at word breaks TEXT_OVERSTRIKE = 0x00400000, /// Overstrike mode TEXT_FIXEDWRAP = 0x00800000, /// Fixed wrap columns TEXT_NO_TABS = 0x01000000, /// Insert spaces for tabs TEXT_AUTOINDENT = 0x02000000, /// Autoindent TEXT_SHOWACTIVE = 0x04000000, /// Show active line TEXT_AUTOSCROLL = 0x08000000 /// Logging mode, keeping last line visible }; /// Selection modes enum FXTextSelectionMode { SELECT_CHARS, SELECT_WORDS, SELECT_LINES }; /// Highlight style entry struct FXHiliteStyle { FXColor normalForeColor; /// Normal text foreground color FXColor normalBackColor; /// Normal text background color FXColor selectForeColor; /// Selected text foreground color FXColor selectBackColor; /// Selected text background color FXColor hiliteForeColor; /// Highlight text foreground color FXColor hiliteBackColor; /// Highlight text background color FXColor activeBackColor; /// Active text background color FXuint style; /// Highlight text style }; /** * Text mutation callback data passed with the SEL_INSERTED, * SEL_REPLACED, and SEL_DELETED messages; both old and new * text is available on behalf of the undo system as well as * syntax highlighting. */ struct FXTextChange { FXint pos; /// Position in buffer FXint ndel; /// Number characters deleted at position FXint nins; /// Number characters inserted at position FXchar *ins; /// Text inserted at position FXchar *del; /// Text deleted at position }; /** * The text widget supports editing of multiple lines of text. * An optional style table can provide text coloring based on * the contents of an optional parallel style buffer, which is * maintained as text is edited. In a typical scenario, the * contents of the style buffer is either directly written when * the text is added to the widget, or is continually modified * by editing the text via syntax-based highlighting engine which * colors the text based on syntactical patterns. */ class FXAPI FXText : public FXScrollArea { FXDECLARE(FXText) protected: FXchar *buffer; // Text buffer being edited FXchar *sbuffer; // Text style buffer FXint *visrows; // Starts of rows in buffer FXint length; // Length of the actual text in the buffer FXint nvisrows; // Number of visible rows FXint nrows; // Total number of rows FXint gapstart; // Start of the insertion point (the gap) FXint gapend; // End of the insertion point+1 FXint toppos; // Start position of first visible row FXint keeppos; // Position to keep on top visible row FXint toprow; // Row number of first visible row FXint selstartpos; // Start of selection FXint selendpos; // End of selection FXint hilitestartpos; // Hightlight start position FXint hiliteendpos; // Hightlight end position FXint anchorpos; // Anchor position FXint cursorpos; // Cursor position FXint revertpos; // Position of cursor prior to dragging FXint cursorstart; // Cursor row start pos FXint cursorend; // Cursor row end pos FXint cursorrow; // Cursor row FXint cursorcol; // Cursor column indent (not character offset!) FXint prefcol; // Preferred cursor column FXint margintop; // Margins top FXint marginbottom; // Margin bottom FXint marginleft; // Margin left FXint marginright; // Margin right FXint wrapwidth; // Wrap width in pixels FXint wrapcolumns; // Wrap columns FXint tabwidth; // Tab width in pixels FXint tabcolumns; // Tab columns FXint barwidth; // Line number width FXint barcolumns; // Line number columns FXFont *font; // Text font FXColor textColor; // Normal text color FXColor selbackColor; // Select background color FXColor seltextColor; // Select text color FXColor hilitebackColor; // Highlight background color FXColor hilitetextColor; // Highlight text color FXColor activebackColor; // Background color for active line FXColor numberColor; // Line number color FXColor cursorColor; // Cursor color FXColor barColor; // Bar background color FXint textWidth; // Total width of all text FXint textHeight; // Total height of all text FXString searchstring; // String of last search FXuint searchflags; // Flags of last search const FXchar *delimiters; // Delimiters FXString clipped; // Clipped text FXint vrows; // Default visible rows FXint vcols; // Default visible columns FXString help; // Status line help FXString tip; // Tooltip const FXHiliteStyle *hilitestyles; // Style definitions FXuint matchtime; // Match time (ms) FXint grabx; // Grab point x FXint graby; // Grab point y FXuchar mode; // Mode widget is in FXbool modified; // User has modified text protected: FXText(); void calcVisRows(FXint s,FXint e); virtual void eraseCursorOverhang(); virtual void drawCursor(FXuint state); virtual FXuint style(FXint row,FXint beg,FXint end,FXint pos) const; virtual void drawBufferText(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXint pos,FXint n,FXuint style) const; virtual void fillBufferRect(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXuint style) const; virtual void drawTextRow(FXDCWindow& dc,FXint line,FXint left,FXint right) const; virtual void drawContents(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h) const; virtual void drawNumbers(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h) const; FXint posToLine(FXint pos,FXint ln) const; FXbool posVisible(FXint pos) const; void updateRange(FXint beg,FXint end) const; void movegap(FXint pos); void sizegap(FXint sz); void squeezegap(); FXint charWidth(FXwchar ch,FXint indent) const; FXint wrap(FXint start) const; FXint measureText(FXint start,FXint end,FXint& wmax,FXint& hmax) const; FXint lineWidth(FXint pos,FXint n) const; FXint getYOfPos(FXint pos) const; FXint getXOfPos(FXint pos) const; FXint changeBeg(FXint pos) const; FXint changeEnd(FXint pos) const; FXint indentFromPos(FXint start,FXint pos) const; FXint posFromIndent(FXint start,FXint indent) const; void mutation(FXint pos,FXint ncins,FXint ncdel,FXint nrins,FXint nrdel); virtual void replace(FXint pos,FXint m,const FXchar *text,FXint n,FXint style); void recompute(); FXint matchForward(FXint pos,FXint end,FXwchar l,FXwchar r,FXint level) const; FXint matchBackward(FXint pos,FXint beg,FXwchar l,FXwchar r,FXint level) const; FXint findMatching(FXint pos,FXint beg,FXint end,FXwchar ch,FXint level) const; void flashMatching(); void moveContents(FXint x,FXint y); protected: enum { STYLE_MASK = 0x00FF, // Mask color table STYLE_TEXT = 0x0100, // Draw some content STYLE_SELECTED = 0x0200, // Selected STYLE_CONTROL = 0x0400, // Control character STYLE_HILITE = 0x0800, // Highlighted STYLE_ACTIVE = 0x1000 // Active }; enum { MOUSE_NONE, // No mouse operation MOUSE_CHARS, // Selecting characters MOUSE_WORDS, // Selecting words MOUSE_LINES, // Selecting lines MOUSE_SCROLL, // Scrolling MOUSE_DRAG, // Dragging text MOUSE_TRYDRAG // Tentative drag }; public: enum { STYLE_UNDERLINE = 0x0001, /// Underline text STYLE_STRIKEOUT = 0x0002, /// Strike out text STYLE_BOLD = 0x0004 /// Bold text }; private: FXText(const FXText&); FXText& operator=(const FXText&); public: long onPaint(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMiddleBtnPress(FXObject*,FXSelector,void*); long onMiddleBtnRelease(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onBeginDrag(FXObject*,FXSelector,void*); long onEndDrag(FXObject*,FXSelector,void*); long onDragged(FXObject*,FXSelector,void*); long onDNDEnter(FXObject*,FXSelector,void*); long onDNDLeave(FXObject*,FXSelector,void*); long onDNDMotion(FXObject*,FXSelector,void*); long onDNDDrop(FXObject*,FXSelector,void*); long onDNDRequest(FXObject*,FXSelector,void*); long onSelectionLost(FXObject*,FXSelector,void*); long onSelectionGained(FXObject*,FXSelector,void*); long onSelectionRequest(FXObject*,FXSelector,void* ptr); long onClipboardLost(FXObject*,FXSelector,void*); long onClipboardGained(FXObject*,FXSelector,void*); long onClipboardRequest(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onBlink(FXObject*,FXSelector,void*); long onFlash(FXObject*,FXSelector,void*); long onAutoScroll(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); // Control commands long onCmdToggleEditable(FXObject*,FXSelector,void*); long onUpdToggleEditable(FXObject*,FXSelector,void*); long onCmdToggleOverstrike(FXObject*,FXSelector,void*); long onUpdToggleOverstrike(FXObject*,FXSelector,void*); long onCmdCursorRow(FXObject*,FXSelector,void*); long onUpdCursorRow(FXObject*,FXSelector,void*); long onCmdCursorColumn(FXObject*,FXSelector,void*); long onUpdCursorColumn(FXObject*,FXSelector,void*); long onUpdHaveSelection(FXObject*,FXSelector,void*); long onUpdSelectAll(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdSearch(FXObject*,FXSelector,void*); long onCmdReplace(FXObject*,FXSelector,void*); long onCmdSearchNext(FXObject*,FXSelector,void*); long onCmdSearchSel(FXObject*,FXSelector,void*); // Cursor movement long onCmdCursorTop(FXObject*,FXSelector,void*); long onCmdCursorBottom(FXObject*,FXSelector,void*); long onCmdCursorHome(FXObject*,FXSelector,void*); long onCmdCursorEnd(FXObject*,FXSelector,void*); long onCmdCursorRight(FXObject*,FXSelector,void*); long onCmdCursorLeft(FXObject*,FXSelector,void*); long onCmdCursorUp(FXObject*,FXSelector,void*); long onCmdCursorDown(FXObject*,FXSelector,void*); long onCmdCursorWordLeft(FXObject*,FXSelector,void*); long onCmdCursorWordRight(FXObject*,FXSelector,void*); long onCmdCursorWordStart(FXObject*,FXSelector,void*); long onCmdCursorWordEnd(FXObject*,FXSelector,void*); long onCmdCursorPageDown(FXObject*,FXSelector,void*); long onCmdCursorPageUp(FXObject*,FXSelector,void*); long onCmdCursorScreenTop(FXObject*,FXSelector,void*); long onCmdCursorScreenBottom(FXObject*,FXSelector,void*); long onCmdCursorScreenCenter(FXObject*,FXSelector,void*); long onCmdCursorParHome(FXObject*,FXSelector,void*); long onCmdCursorParEnd(FXObject*,FXSelector,void*); long onCmdBlockBeg(FXObject*,FXSelector,void*); long onCmdBlockEnd(FXObject*,FXSelector,void*); long onCmdGotoMatching(FXObject*,FXSelector,void*); long onCmdGotoSelected(FXObject*,FXSelector,void*); long onCmdGotoLine(FXObject*,FXSelector,void*); long onCmdScrollUp(FXObject*,FXSelector,void*); long onCmdScrollDown(FXObject*,FXSelector,void*); // Mark and extend long onCmdMark(FXObject*,FXSelector,void*); long onCmdExtend(FXObject*,FXSelector,void*); // Inserting long onCmdOverstString(FXObject*,FXSelector,void*); long onCmdInsertString(FXObject*,FXSelector,void*); long onCmdInsertNewline(FXObject*,FXSelector,void*); long onCmdInsertTab(FXObject*,FXSelector,void*); // Manipulation Selection long onCmdCutSel(FXObject*,FXSelector,void*); long onCmdCopySel(FXObject*,FXSelector,void*); long onCmdPasteSel(FXObject*,FXSelector,void*); long onCmdDeleteSel(FXObject*,FXSelector,void*); long onCmdChangeCase(FXObject*,FXSelector,void*); long onCmdShiftText(FXObject*,FXSelector,void*); long onCmdPasteMiddle(FXObject*,FXSelector,void*); // Changing Selection long onCmdSelectChar(FXObject*,FXSelector,void*); long onCmdSelectWord(FXObject*,FXSelector,void*); long onCmdSelectLine(FXObject*,FXSelector,void*); long onCmdSelectAll(FXObject*,FXSelector,void*); long onCmdSelectMatching(FXObject*,FXSelector,void*); long onCmdSelectBlock(FXObject*,FXSelector,void*); long onCmdDeselectAll(FXObject*,FXSelector,void*); // Deletion long onCmdBackspace(FXObject*,FXSelector,void*); long onCmdBackspaceWord(FXObject*,FXSelector,void*); long onCmdBackspaceBol(FXObject*,FXSelector,void*); long onCmdDelete(FXObject*,FXSelector,void*); long onCmdDeleteWord(FXObject*,FXSelector,void*); long onCmdDeleteEol(FXObject*,FXSelector,void*); long onCmdDeleteAll(FXObject*,FXSelector,void*); long onCmdDeleteLine(FXObject*,FXSelector,void*); public: static const FXchar textDelimiters[]; public: enum { ID_CURSOR_TOP=FXScrollArea::ID_LAST, ID_CURSOR_BOTTOM, ID_CURSOR_HOME, ID_CURSOR_END, ID_CURSOR_RIGHT, ID_CURSOR_LEFT, ID_CURSOR_UP, ID_CURSOR_DOWN, ID_CURSOR_WORD_LEFT, ID_CURSOR_WORD_RIGHT, ID_CURSOR_WORD_START, ID_CURSOR_WORD_END, ID_CURSOR_PAGEDOWN, ID_CURSOR_PAGEUP, ID_CURSOR_SCRNTOP, ID_CURSOR_SCRNBTM, ID_CURSOR_SCRNCTR, ID_CURSOR_PAR_HOME, ID_CURSOR_PAR_END, ID_SCROLL_UP, ID_SCROLL_DOWN, ID_MARK, ID_EXTEND, ID_OVERST_STRING, ID_INSERT_STRING, ID_INSERT_NEWLINE, ID_INSERT_TAB, ID_CUT_SEL, ID_COPY_SEL, ID_DELETE_SEL, ID_PASTE_SEL, ID_PASTE_MIDDLE, ID_SELECT_CHAR, ID_SELECT_WORD, ID_SELECT_LINE, ID_SELECT_ALL, ID_SELECT_MATCHING, ID_SELECT_BRACE, ID_SELECT_BRACK, ID_SELECT_PAREN, ID_SELECT_ANG, ID_DESELECT_ALL, ID_BACKSPACE, ID_BACKSPACE_WORD, ID_BACKSPACE_BOL, ID_DELETE, ID_DELETE_WORD, ID_DELETE_EOL, ID_DELETE_ALL, ID_DELETE_LINE, ID_TOGGLE_EDITABLE, ID_TOGGLE_OVERSTRIKE, ID_CURSOR_ROW, ID_CURSOR_COLUMN, ID_CLEAN_INDENT, ID_SHIFT_LEFT, ID_SHIFT_RIGHT, ID_SHIFT_TABLEFT, ID_SHIFT_TABRIGHT, ID_UPPER_CASE, ID_LOWER_CASE, ID_GOTO_MATCHING, ID_GOTO_SELECTED, ID_GOTO_LINE, ID_SEARCH_FORW_SEL, ID_SEARCH_BACK_SEL, ID_SEARCH_FORW, ID_SEARCH_BACK, ID_SEARCH, ID_REPLACE, ID_LEFT_BRACE, ID_LEFT_BRACK, ID_LEFT_PAREN, ID_LEFT_ANG, ID_RIGHT_BRACE, ID_RIGHT_BRACK, ID_RIGHT_PAREN, ID_RIGHT_ANG, ID_BLINK, ID_FLASH, ID_LAST }; public: /// Construct multi-line text widget FXText(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=3,FXint pr=3,FXint pt=2,FXint pb=2); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Enable the text widget virtual void enable(); /// Disable the text widget virtual void disable(); /// Need to recalculate size virtual void recalc(); /// Get default width virtual FXint getContentWidth(); /// Get default height virtual FXint getContentHeight(); /// Returns true because a text widget can receive focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Change top margin void setMarginTop(FXint pt); /// Return top margin FXint getMarginTop() const { return margintop; } /// Change bottom margin void setMarginBottom(FXint pb); /// Return bottom margin FXint getMarginBottom() const { return marginbottom; } /// Change left margin void setMarginLeft(FXint pl); /// Return left margin FXint getMarginLeft() const { return marginleft; } /// Change right margin void setMarginRight(FXint pr); /// Return right margin FXint getMarginRight() const { return marginright; } /// Return wrap columns FXint getWrapColumns() const { return wrapcolumns; } /// Set wrap columns void setWrapColumns(FXint cols); /// Return tab columns FXint getTabColumns() const { return tabcolumns; } /// Change tab columns void setTabColumns(FXint cols); /// Return number of columns used for line numbers FXint getBarColumns() const { return barcolumns; } /// Change number of columns used for line numbers void setBarColumns(FXint cols); /// Return TRUE if text was modified FXbool isModified() const { return modified; } /// Set modified flag void setModified(FXbool mod=TRUE){ modified=mod; } /// Set editable mode void setEditable(FXbool edit=TRUE); /// Return TRUE if text is editable FXbool isEditable() const; /// Set overstrike mode void setOverstrike(FXbool over=TRUE); /// Return TRUE if overstrike mode in effect FXbool isOverstrike() const; /// Set styled text mode void setStyled(FXbool styled=TRUE); /// Return TRUE if style buffer FXbool isStyled() const { return (sbuffer!=NULL); } /// Change delimiters of words void setDelimiters(const FXchar* delims=textDelimiters){ delimiters=delims; } /// Return word delimiters const FXchar* getDelimiters() const { return delimiters; } /// Change text font void setFont(FXFont* fnt); /// Return text font FXFont* getFont() const { return font; } /// Change text color void setTextColor(FXColor clr); /// Return text color FXColor getTextColor() const { return textColor; } /// Change selected background color void setSelBackColor(FXColor clr); /// Return selected background color FXColor getSelBackColor() const { return selbackColor; } /// Change selected text color void setSelTextColor(FXColor clr); /// Return selected text color FXColor getSelTextColor() const { return seltextColor; } /// Change highlighted text color void setHiliteTextColor(FXColor clr); /// Return highlighted text color FXColor getHiliteTextColor() const { return hilitetextColor; } /// Change highlighted background color void setHiliteBackColor(FXColor clr); /// Return highlighted background color FXColor getHiliteBackColor() const { return hilitebackColor; } /// Change active background color void setActiveBackColor(FXColor clr); /// Return active background color FXColor getActiveBackColor() const { return activebackColor; } /// Change cursor color void setCursorColor(FXColor clr); /// Return cursor color FXColor getCursorColor() const { return cursorColor; } /// Change line number color void setNumberColor(FXColor clr); /// Return line number color FXColor getNumberColor() const { return numberColor; } /// Change bar color void setBarColor(FXColor clr); /// Return bar color FXColor getBarColor() const { return barColor; } /// Set help text void setHelpText(const FXString& text){ help=text; } /// Return help text FXString getHelpText() const { return help; } /// Set the tool tip message for this text widget void setTipText(const FXString& text){ tip=text; } /// Get the tool tip message for this text widget FXString getTipText() const { return tip; } /// Get character at position in text buffer FXint getByte(FXint pos) const; /// Get wide character at position pos FXwchar getChar(FXint pos) const; /// Get length of wide character at position pos FXint getCharLen(FXint pos) const; /// Get style at position pos FXint getStyle(FXint pos) const; /// Extract n bytes of text from position pos void extractText(FXchar *text,FXint pos,FXint n) const; void extractText(FXString& text,FXint pos,FXint n) const; /// Extract n bytes of style info from position pos void extractStyle(FXString& text,FXint pos,FXint n) const; void extractStyle(FXchar *style,FXint pos,FXint n) const; /// Replace m bytes at pos by n characters virtual void replaceText(FXint pos,FXint m,const FXchar *text,FXint n,FXbool notify=FALSE); virtual void replaceText(FXint pos,FXint m,const FXString& text,FXbool notify=FALSE); /// Replace m bytes at pos by n characters virtual void replaceStyledText(FXint pos,FXint m,const FXchar *text,FXint n,FXint style=0,FXbool notify=FALSE); virtual void replaceStyledText(FXint pos,FXint m,const FXString& text,FXint style=0,FXbool notify=FALSE); /// Append n bytes of text at the end of the buffer virtual void appendText(const FXchar *text,FXint n,FXbool notify=FALSE); virtual void appendText(const FXString& text,FXbool notify=FALSE); /// Append n bytes of text at the end of the buffer virtual void appendStyledText(const FXchar *text,FXint n,FXint style=0,FXbool notify=FALSE); virtual void appendStyledText(const FXString& text,FXint style=0,FXbool notify=FALSE); /// Insert n bytes of text at position pos into the buffer virtual void insertText(FXint pos,const FXchar *text,FXint n,FXbool notify=FALSE); virtual void insertText(FXint pos,const FXString& text,FXbool notify=FALSE); /// Insert n bytes of text at position pos into the buffer virtual void insertStyledText(FXint pos,const FXchar *text,FXint n,FXint style=0,FXbool notify=FALSE); virtual void insertStyledText(FXint pos,const FXString& text,FXint style=0,FXbool notify=FALSE); /// Remove n bytes of text at position pos from the buffer virtual void removeText(FXint pos,FXint n,FXbool notify=FALSE); /// Change style of text range virtual void changeStyle(FXint pos,FXint n,FXint style); /// Change style of text range from style-array virtual void changeStyle(FXint pos,const FXchar* style,FXint n); virtual void changeStyle(FXint pos,const FXString& style); /// Change the text in the buffer to new text virtual void setText(const FXchar* text,FXint n,FXbool notify=FALSE); virtual void setText(const FXString& text,FXbool notify=FALSE); /// Change the text in the buffer to new text virtual void setStyledText(const FXchar* text,FXint n,FXint style=0,FXbool notify=FALSE); virtual void setStyledText(const FXString& text,FXint style=0,FXbool notify=FALSE); /// Retrieve text into buffer void getText(FXchar* text,FXint n) const; void getText(FXString& text) const; /// Return text in the widget FXString getText() const; /// Return length of buffer FXint getLength() const { return length; } /// Return number of rows in buffer FXint getNumRows() const { return nrows; } /// Shift block of lines from position start up to end by given amount FXint shiftText(FXint start,FXint end,FXint amount,FXbool notify=FALSE); /** * Search for string in text buffer, returning the extent of * the string in beg and end. The search starts from the given * starting position, scans forward (SEARCH_FORWARD) or backward * (SEARCH_BACKWARD), and wraps around if SEARCH_WRAP has been * specified. The search type is either a plain search (SEARCH_EXACT), * case insensitive search (SEARCH_IGNORECASE), or regular expression * search (SEARCH_REGEX). * For regular expression searches, capturing parentheses are used if * npar is greater than 1; in this case, the number of entries in the * beg[], end[] arrays must be npar also. If either beg or end or * both are NULL, internal arrays are used. * [This API is still subject to change!!] */ FXbool findText(const FXString& string,FXint* beg=NULL,FXint* end=NULL,FXint start=0,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP|SEARCH_EXACT,FXint npar=1); /// Return TRUE if position pos is selected FXbool isPosSelected(FXint pos) const; /// Return TRUE if position is fully visible FXbool isPosVisible(FXint pos) const; /// Return text position at given visible x,y coordinate FXint getPosAt(FXint x,FXint y) const; /// Count number of rows; start should be on a row start FXint countRows(FXint start,FXint end) const; /// Count number of columns; start should be on a row start FXint countCols(FXint start,FXint end) const; /// Count number of newlines FXint countLines(FXint start,FXint end) const; /// Return position of begin of line containing position pos FXint lineStart(FXint pos) const; /// Return position of end of line containing position pos FXint lineEnd(FXint pos) const; /// Return start of next line FXint nextLine(FXint pos,FXint nl=1) const; /// Return start of previous line FXint prevLine(FXint pos,FXint nl=1) const; /// Return row start FXint rowStart(FXint pos) const; /// Return row end FXint rowEnd(FXint pos) const; /// Return start of next row FXint nextRow(FXint pos,FXint nr=1) const; /// Return start of previous row FXint prevRow(FXint pos,FXint nr=1) const; /// Return end of previous word FXint leftWord(FXint pos) const; /// Return begin of next word FXint rightWord(FXint pos) const; /// Return begin of word FXint wordStart(FXint pos) const; /// Return end of word FXint wordEnd(FXint pos) const; /// Return validated utf8 character start position FXint validPos(FXint pos) const; /// Retreat to the previous valid utf8 character start FXint dec(FXint pos) const; /// Advance to the next valid utf8 character start FXint inc(FXint pos) const; /// Make line containing pos the top line void setTopLine(FXint pos); /// Return position of top line FXint getTopLine() const; /// Make line containing pos the bottom line void setBottomLine(FXint pos); /// Return the position of the bottom line FXint getBottomLine() const; /// Make line containing pos the center line void setCenterLine(FXint pos); /// Set the anchor position void setAnchorPos(FXint pos); /// Return the anchor position FXint getAnchorPos() const { return anchorpos; } /// Set the cursor position virtual void setCursorPos(FXint pos,FXbool notify=FALSE); /// Set cursor row void setCursorRow(FXint row,FXbool notify=FALSE); /// Return cursor row FXint getCursorRow() const { return cursorrow; } /// Set cursor column void setCursorColumn(FXint col,FXbool notify=FALSE); /// Return cursor row, i.e. indent position FXint getCursorColumn() const { return cursorcol; } /// Return the cursor position FXint getCursorPos() const { return cursorpos; } /// Return selstartpos FXint getSelStartPos() const { return selstartpos; } /// Return selendpos FXint getSelEndPos() const { return selendpos; } /// Select all text FXbool selectAll(FXbool notify=FALSE); /// Extend the selection from the anchor to the given position virtual FXbool extendSelection(FXint pos,FXTextSelectionMode select=SELECT_CHARS,FXbool notify=FALSE); /// Select len characters starting at given position pos FXbool setSelection(FXint pos,FXint len,FXbool notify=FALSE); /// Unselect the text virtual FXbool killSelection(FXbool notify=FALSE); /// Highlight len characters starting at given position pos FXbool setHighlight(FXint start,FXint len); /// Unhighlight the text FXbool killHighlight(); /// Scroll text to make the given position visible void makePositionVisible(FXint pos); /// Change text widget style void setTextStyle(FXuint style); /// Return text widget style FXuint getTextStyle() const; /// Change number of visible rows void setVisibleRows(FXint rows); /// Return number of visible rows FXint getVisibleRows() const { return vrows; } /// Change number of visible columns void setVisibleColumns(FXint cols); /// Return number of visible columns FXint getVisibleColumns() const { return vcols; } /** * Change brace and parenthesis match highlighting time, in ms. * A match highlight time of 0 disables brace matching. */ void setHiliteMatchTime(FXuint t){ matchtime=t; } /** * Return brace and parenthesis match highlighting time, in ms. */ FXuint getHiliteMatchTime() const { return matchtime; } /// Set highlight styles void setHiliteStyles(const FXHiliteStyle* styles); /// Get highlight styles const FXHiliteStyle* getHiliteStyles() const { return hilitestyles; } /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXText(); }; } #endif fox1.6-1.6.57/include/FXTextCodec.h000066400000000000000000000131041326741342000165500ustar00rootroot00000000000000/******************************************************************************** * * * U n i c o d e T e x t C o d e c * * * ********************************************************************************* * Copyright (C) 2002,2006 by L.Johnson & J.van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTextCodec.h,v 1.30 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTEXTCODEC_H #define FXTEXTCODEC_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { /** * Abstract base class for a stateless coder/decoder. */ class FXAPI FXTextCodec : public FXObject { FXDECLARE_ABSTRACT(FXTextCodec) public: /// Construct text codec FXTextCodec(){} /// Convert utf8 to single wide character static FXint utf2wc(FXwchar& wc,const FXchar* src,FXint nsrc); /// Convert utf16 to single wide character static FXint utf2wc(FXwchar& wc,const FXnchar* src,FXint nsrc); /// Convert utf32 to single wide character static FXint utf2wc(FXwchar& wc,const FXwchar* src,FXint nsrc); /// Convert single wide character to utf8 static FXint wc2utf(FXchar* dst,FXint ndst,FXwchar wc); /// Convert single wide character to utf16 static FXint wc2utf(FXnchar* dst,FXint ndst,FXwchar wc); /// Convert single wide character to utf32 static FXint wc2utf(FXwchar* dst,FXint ndst,FXwchar wc); /// Count utf8 bytes needed to convert multi-byte characters from src virtual FXint mb2utflen(const FXchar* src,FXint nsrc) const; /// Count utf8 bytes needed to convert multi-byte characters from src FXint mb2utflen(const FXString& src) const; /// Convert multi-byte characters from src to utf8 characters at dst virtual FXint mb2utf(FXchar* dst,FXint ndst,const FXchar* src,FXint nsrc) const; /// Convert multi-byte characters from src to utf8 characters at dst FXint mb2utf(FXchar* dst,FXint ndst,const FXchar* src) const; /// Convert multi-byte characters from src to utf8 characters at dst FXint mb2utf(FXchar* dst,FXint ndst,const FXString& src) const; /// Convert multi-byte characters from src to utf8 string FXString mb2utf(const FXchar* src,FXint nsrc) const; /// Convert multi-byte characters from src to utf8 string FXString mb2utf(const FXchar* src) const; /// Convert multi-byte string to utf8 string FXString mb2utf(const FXString& src) const; /// Convert multi-byte characters from src to single wide character virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; /// Count multi-byte characters characters needed to convert utf8 from src virtual FXint utf2mblen(const FXchar* src,FXint nsrc) const; /// Count multi-byte characters characters needed to convert utf8 from src virtual FXint utf2mblen(const FXString& src) const; /// Convert utf8 characters at src to multi-byte characters at dst virtual FXint utf2mb(FXchar* dst,FXint ndst,const FXchar* src,FXint nsrc) const; /// Convert utf8 characters at src to multi-byte characters at dst FXint utf2mb(FXchar* dst,FXint ndst,const FXchar* src) const; /// Convert utf8 characters at src to multi-byte characters at dst FXint utf2mb(FXchar* dst,FXint ndst,const FXString& src) const; /// Convert utf8 characters at src to multi-byte string FXString utf2mb(const FXchar* src,FXint nsrc) const; /// Convert utf8 characters at src to multi-byte string FXString utf2mb(const FXchar* src) const; /// Convert utf8 string to multi-byte string FXString utf2mb(const FXString& src) const; /// Convert single wide character to multi-byte characters at dst virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; /** * Return the Management Information Base (MIBenum) for the character set. */ virtual FXint mibEnum() const = 0; /** * Return name of the codec. */ virtual const FXchar* name() const = 0; /** * Return the IANA mime name for this codec; this is used for example * as "text/utf-8" in drag and drop protocols. */ virtual const FXchar* mimeName() const = 0; /** * Return NULL-terminated list of aliases for this codec. */ virtual const FXchar* const* aliases() const = 0; /// Destruct codec virtual ~FXTextCodec(){} }; } #endif fox1.6-1.6.57/include/FXTextField.h000066400000000000000000000322501326741342000165610ustar00rootroot00000000000000/******************************************************************************** * * * T e x t F i e l d W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTextField.h,v 1.62 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTEXTFIELD_H #define FXTEXTFIELD_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// Textfield styles enum { TEXTFIELD_PASSWD = 0x00080000, /// Password mode TEXTFIELD_INTEGER = 0x00100000, /// Integer mode TEXTFIELD_REAL = 0x00200000, /// Real mode TEXTFIELD_READONLY = 0x00400000, /// NOT editable TEXTFIELD_ENTER_ONLY = 0x00800000, /// Only callback when enter hit TEXTFIELD_LIMITED = 0x01000000, /// Limit entry to given number of columns TEXTFIELD_OVERSTRIKE = 0x02000000, /// Overstrike mode TEXTFIELD_AUTOGRAY = 0x04000000, /// Automatically gray out text field when not updated TEXTFIELD_AUTOHIDE = 0x08000000, /// Automatically hide text field when not updated TEXTFIELD_NORMAL = FRAME_SUNKEN|FRAME_THICK }; /** * A text field is a single-line text entry widget. * The text field widget supports clipboard for cut-and-paste * operations. * Text input may be constrained to a certain format; the built-in * capabilities support integer and real number entry constraints; * additional constraints on the input may be implemented by intercepting * the SEL_VERIFY message; a custom handler should examine the tentative * input string passed as type const FXchar* in the message data, and return * a value of "0" if the new input is accepted. * During text entry, the text field sends a SEL_CHANGED message to its target, * with the message data set to the current text value of type const FXchar*. * When the text is accepted by hitting ENTER, the SEL_COMMAND message is sent. * The text field also sends SEL_COMMAND when the focus moves to another control. * TEXTFIELD_ENTER_ONLY can be passed to suppress this feature. Typically, this * flag is used in dialogs that close when ENTER is hit in a text field. */ class FXAPI FXTextField : public FXFrame { FXDECLARE(FXTextField) protected: FXString contents; // Edited text const FXchar *delimiters; // Set of delimiters FXFont *font; // Text font FXColor textColor; // Text color FXColor selbackColor; // Selected background color FXColor seltextColor; // Selected text color FXColor cursorColor; // Color of the Cursor FXint cursor; // Cursor position FXint anchor; // Anchor position FXint columns; // Number of columns visible FXint shift; // Shift amount FXString clipped; // Clipped text FXString help; // Help string FXString tip; // Tooltip protected: FXTextField(); FXint index(FXint x) const; FXint coord(FXint i) const; void drawCursor(FXuint state); void drawTextRange(FXDCWindow& dc,FXint fm,FXint to); void drawTextFragment(FXDCWindow& dc,FXint x,FXint y,FXint fm,FXint to); void drawPWDTextFragment(FXDCWindow& dc,FXint x,FXint y,FXint fm,FXint to); FXint rightWord(FXint pos) const; FXint leftWord(FXint pos) const; FXint wordStart(FXint pos) const; FXint wordEnd(FXint pos) const; private: FXTextField(const FXTextField&); FXTextField& operator=(const FXTextField&); public: long onPaint(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMiddleBtnPress(FXObject*,FXSelector,void*); long onMiddleBtnRelease(FXObject*,FXSelector,void*); long onVerify(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onSelectionLost(FXObject*,FXSelector,void*); long onSelectionGained(FXObject*,FXSelector,void*); long onSelectionRequest(FXObject*,FXSelector,void* ptr); long onClipboardLost(FXObject*,FXSelector,void*); long onClipboardGained(FXObject*,FXSelector,void*); long onClipboardRequest(FXObject*,FXSelector,void*); long onFocusSelf(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onBlink(FXObject*,FXSelector,void*); long onAutoScroll(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdSetRealValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); long onCmdGetRealValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdCursorHome(FXObject*,FXSelector,void*); long onCmdCursorEnd(FXObject*,FXSelector,void*); long onCmdCursorRight(FXObject*,FXSelector,void*); long onCmdCursorLeft(FXObject*,FXSelector,void*); long onCmdCursorWordLeft(FXObject*,FXSelector,void*); long onCmdCursorWordRight(FXObject*,FXSelector,void*); long onCmdCursorWordStart(FXObject*,FXSelector,void*); long onCmdCursorWordEnd(FXObject*,FXSelector,void*); long onCmdMark(FXObject*,FXSelector,void*); long onCmdExtend(FXObject*,FXSelector,void*); long onCmdSelectAll(FXObject*,FXSelector,void*); long onCmdDeselectAll(FXObject*,FXSelector,void*); long onCmdCutSel(FXObject*,FXSelector,void*); long onCmdCopySel(FXObject*,FXSelector,void*); long onCmdPasteSel(FXObject*,FXSelector,void*); long onCmdPasteMiddle(FXObject*,FXSelector,void*); long onCmdDeleteSel(FXObject*,FXSelector,void*); long onCmdDeleteAll(FXObject*,FXSelector,void*); long onCmdOverstString(FXObject*,FXSelector,void*); long onCmdInsertString(FXObject*,FXSelector,void*); long onCmdBackspace(FXObject*,FXSelector,void*); long onCmdDelete(FXObject*,FXSelector,void*); long onCmdToggleEditable(FXObject*,FXSelector,void*); long onUpdToggleEditable(FXObject*,FXSelector,void*); long onCmdToggleOverstrike(FXObject*,FXSelector,void*); long onUpdToggleOverstrike(FXObject*,FXSelector,void*); long onUpdHaveSelection(FXObject*,FXSelector,void*); long onUpdSelectAll(FXObject*,FXSelector,void*); long onCmdSetHelp(FXObject*,FXSelector,void*); long onCmdGetHelp(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: /// Default text delimiters static const FXchar textDelimiters[]; public: enum{ ID_CURSOR_HOME=FXFrame::ID_LAST, ID_CURSOR_END, ID_CURSOR_RIGHT, ID_CURSOR_LEFT, ID_CURSOR_WORD_LEFT, ID_CURSOR_WORD_RIGHT, ID_CURSOR_WORD_START, ID_CURSOR_WORD_END, ID_MARK, ID_EXTEND, ID_SELECT_ALL, ID_DESELECT_ALL, ID_CUT_SEL, ID_COPY_SEL, ID_PASTE_SEL, ID_PASTE_MIDDLE, ID_DELETE_SEL, ID_DELETE_ALL, ID_OVERST_STRING, ID_INSERT_STRING, ID_BACKSPACE, ID_DELETE, ID_TOGGLE_EDITABLE, ID_TOGGLE_OVERSTRIKE, ID_BLINK, ID_LAST }; public: /// Construct text field wide enough to display ncols columns FXTextField(FXComposite* p,FXint ncols,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=TEXTFIELD_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Perform layout virtual void layout(); /// Enable text field virtual void enable(); /// Disable text field virtual void disable(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Yes, text field may receive focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Set editable mode void setEditable(FXbool edit=TRUE); /// Return TRUE if text field may be edited FXbool isEditable() const; /// Set overstrike mode void setOverstrike(FXbool over=TRUE); /// Return TRUE if overstrike mode in effect FXbool isOverstrike() const; /// Set cursor position void setCursorPos(FXint pos); /// Return cursor position FXint getCursorPos() const { return cursor; } /// Change anchor position void setAnchorPos(FXint pos); /// Return anchor position FXint getAnchorPos() const { return anchor; } /// Change the text and move cursor to end void setText(const FXString& text,FXbool notify=FALSE); /// Get the text for this label FXString getText() const { return contents; } /// Set the text font void setFont(FXFont* fnt); /// Get the text font FXFont* getFont() const { return font; } /// Change text color void setTextColor(FXColor clr); /// Return text color FXColor getTextColor() const { return textColor; } /// Change selected background color void setSelBackColor(FXColor clr); /// Return selected background color FXColor getSelBackColor() const { return selbackColor; } /// Change selected text color void setSelTextColor(FXColor clr); /// Return selected text color FXColor getSelTextColor() const { return seltextColor; } /// Changes the cursor color void setCursorColor(FXColor clr); /// Return the cursor color FXColor getCursorColor() const { return cursorColor; } /** * Change the default width of the text field in terms of a number * of columns times the width of the numeral '8'. */ void setNumColumns(FXint cols); /// Return number of columns FXint getNumColumns() const { return columns; } /** * Change text justification mode. The justify mode is a combination of * horizontal justification (JUSTIFY_LEFT, JUSTIFY_RIGHT, or JUSTIFY_CENTER_X), * and vertical justification (JUSTIFY_TOP, JUSTIFY_BOTTOM, JUSTIFY_CENTER_Y). * Note that JUSTIFY_CENTER_X can not be set from the constructor since by * default text fields are left-justified. */ void setJustify(FXuint mode); /// Return text justification mode FXuint getJustify() const; /// Change word delimiters void setDelimiters(const FXchar* delims=textDelimiters){ delimiters=delims; } /// Return word delimiters const FXchar* getDelimiters() const { return delimiters; } /// Set the status line help text for this label void setHelpText(const FXString& text){ help=text; } /// Get the status line help text for this label const FXString& getHelpText() const { return help; } /// Set the tool tip message for this text field void setTipText(const FXString& text){ tip=text; } /// Get the tool tip message for this text field const FXString& getTipText() const { return tip; } /// Change text style void setTextStyle(FXuint style); /// Return text style FXuint getTextStyle() const; /// Select all text FXbool selectAll(); /// Select len characters starting at given position pos FXbool setSelection(FXint pos,FXint len); /// Extend the selection from the anchor to the given position FXbool extendSelection(FXint pos); /// Unselect the text FXbool killSelection(); /// Return TRUE if position pos is selected FXbool isPosSelected(FXint pos) const; /// Return TRUE if position is fully visible FXbool isPosVisible(FXint pos) const; /// Scroll text to make the given position visible void makePositionVisible(FXint pos); /// Save text field to a stream virtual void save(FXStream& store) const; /// Load text field from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXTextField(); }; } #endif fox1.6-1.6.57/include/FXThread.h000066400000000000000000000205021326741342000160750ustar00rootroot00000000000000/******************************************************************************** * * * M u l i t h r e a d i n g S u p p o r t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXThread.h,v 1.40.2.2 2006/07/26 15:25:53 fox Exp $ * ********************************************************************************/ #ifndef FXTHREAD_H #define FXTHREAD_H namespace FX { // Thread ID type #ifndef WIN32 typedef unsigned long FXThreadID; #else typedef void* FXThreadID; #endif class FXCondition; /** * FXMutex provides a mutex which can be used to enforce critical * sections around updates of data shared by multiple threads. */ class FXAPI FXMutex { friend class FXCondition; private: FXuval data[24]; private: FXMutex(const FXMutex&); FXMutex &operator=(const FXMutex&); public: /// Initialize the mutex FXMutex(FXbool recursive=FALSE); /// Lock the mutex void lock(); /// Return TRUE if succeeded locking the mutex FXbool trylock(); /// Return TRUE if mutex is already locked FXbool locked(); /// Unlock mutex void unlock(); /// Delete the mutex ~FXMutex(); }; /** * An easy way to establish a correspondence between a C++ scope * and a critical section is to simply declare an FXMutexLock * at the beginning of the scope. * The mutex will be automatically released when the scope is * left (either by natural means or by means of an exception. */ class FXAPI FXMutexLock { private: FXMutex& mtx; private: FXMutexLock(); FXMutexLock(const FXMutexLock&); FXMutexLock& operator=(const FXMutexLock&); public: /// Construct & lock associated mutex FXMutexLock(FXMutex& m):mtx(m){ lock(); } /// Return reference to associated mutex FXMutex& mutex(){ return mtx; } /// Lock mutex void lock(){ mtx.lock(); } /// Return TRUE if succeeded locking the mutex FXbool trylock(){ return mtx.trylock(); } /// Return TRUE if mutex is already locked FXbool locked(){ return mtx.locked(); } /// Unlock mutex void unlock(){ mtx.unlock(); } /// Destroy and unlock associated mutex ~FXMutexLock(){ unlock(); } }; /** * A condition allows one or more threads to synchronize * to an event. When a thread calls wait, the associated * mutex is unlocked while the thread is blocked. When the * condition becomes signaled, the associated mutex is * locked and the thread(s) are reawakened. */ class FXAPI FXCondition { private: FXuval data[12]; private: FXCondition(const FXCondition&); FXCondition& operator=(const FXCondition&); public: /// Initialize the condition FXCondition(); /** * Wait until condition becomes signalled, using given mutex, * which must already have been locked prior to this call. */ void wait(FXMutex& mtx); /** * Wait until condition becomes signalled, using given mutex, * which must already have been locked prior to this call. * Returns TRUE if successful, FALSE if timeout occurred. * Note that the wait-time is specified in nanoseconds * since the Epoch (Jan 1, 1970). */ FXbool wait(FXMutex& mtx,FXlong nsec); /** * Wake or unblock a single blocked thread */ void signal(); /** * Wake or unblock all blocked threads */ void broadcast(); /// Delete the condition ~FXCondition(); }; /** * A semaphore allows for protection of a resource that can * be accessed by a fixed number of simultaneous threads. */ class FXAPI FXSemaphore { private: FXuval data[16]; private: FXSemaphore(const FXSemaphore&); FXSemaphore& operator=(const FXSemaphore&); public: /// Initialize semaphore with given count FXSemaphore(FXint initial=1); /// Decrement semaphore void wait(); /// Non-blocking semaphore decrement; return true if locked FXbool trywait(); /// Increment semaphore void post(); /// Delete semaphore ~FXSemaphore(); }; /** * FXThread provides system-independent support for threads. * Subclasses must implement the run() function do implement * the desired functionality of the thread. * The storage of the FXThread object is to be managed by the * calling thread, not by the thread itself. */ class FXAPI FXThread { private: volatile FXThreadID tid; private: FXThread(const FXThread&); FXThread &operator=(const FXThread&); #ifdef WIN32 static unsigned int CALLBACK execute(void*); #else static void* execute(void*); #endif protected: /** * All threads execute by deriving the run method of FXThread. * If an uncaught exception was thrown, this function returns -1. */ virtual FXint run() = 0; public: /// Initialize thread object. FXThread(); /** * Return handle of this thread object. * This handle is valid in the context of the thread which * called start(). */ FXThreadID id() const; /** * Return TRUE if this thread is running. */ FXbool running() const; /** * Start thread; the thread is started as attached. * The thread is given stacksize for its stack; a value of * zero for stacksize will give it the default stack size. */ FXbool start(unsigned long stacksize=0); /** * Suspend calling thread until thread is done. */ FXbool join(); /** * Suspend calling thread until thread is done, and set code to the * return value of run() or the argument passed into exit(). * If an exception happened in the thread, return -1. */ FXbool join(FXint& code); /** * Cancel the thread, stopping it immediately, running or not. * If the calling thread is this thread, nothing happens. * It is probably better to wait until it is finished, in case the * thread currently holds mutexes. */ FXbool cancel(); /** * Detach thread, so that a no join() is necessary to harvest the * resources of this thread. */ FXbool detach(); /** * Exit the calling thread. * No destructors are invoked for objects on thread's stack; * to invoke destructors, throw an exception instead. */ static void exit(FXint code=0); /** * Make the thread yield its time quantum. */ static void yield(); /** * Return time in nanoseconds since Epoch (Jan 1, 1970). */ static FXlong time(); /** * Make the calling thread sleep for a number of nanoseconds. */ static void sleep(FXlong nsec); /** * Wake at appointed time specified in nanoseconds since Epoch. */ static void wakeat(FXlong nsec); /** * Return pointer to the FXThread instance associated * with the calling thread; it returns NULL for the main * thread and all threads not created by FOX. */ static FXThread* self(); /** * Return thread id of calling thread. */ static FXThreadID current(); /** * Set thread priority. */ void priority(FXint prio); /** * Return thread priority. */ FXint priority(); /** * Destroy the thread immediately, running or not. * It is probably better to wait until it is finished, in case * the thread currently holds mutexes. */ virtual ~FXThread(); }; } #endif fox1.6-1.6.57/include/FXToggleButton.h000066400000000000000000000140411326741342000173040ustar00rootroot00000000000000/******************************************************************************** * * * T o g g l e B u t t o n W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToggleButton.h,v 1.30 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTOGGLEBUTTON_H #define FXTOGGLEBUTTON_H #ifndef FXLABEL_H #include "FXLabel.h" #endif namespace FX { /// Toggle button flags enum { TOGGLEBUTTON_AUTOGRAY = 0x00800000, /// Automatically gray out when not updated TOGGLEBUTTON_AUTOHIDE = 0x01000000, /// Automatically hide toggle button when not updated TOGGLEBUTTON_TOOLBAR = 0x02000000, /// Toolbar style toggle button [flat look] TOGGLEBUTTON_KEEPSTATE= 0x04000000, /// Draw button according to state TOGGLEBUTTON_NORMAL = FRAME_RAISED|FRAME_THICK|JUSTIFY_NORMAL|ICON_BEFORE_TEXT }; /** * The toggle button provides a two-state button, which toggles between the * on and the off state each time it is pressed. For each state, the toggle * button has a unique icon and text label. * When pressed, the button widget sends a SEL_COMMAND to its target, with the * message data set to the current state of the toggle button, of the type FXbool. */ class FXAPI FXToggleButton : public FXLabel { FXDECLARE(FXToggleButton) protected: FXString altlabel; FXIcon *alticon; FXHotKey althotkey; FXint althotoff; FXString alttip; FXString althelp; FXbool state; FXbool down; protected: FXToggleButton(); void press(FXbool dn); private: FXToggleButton(const FXToggleButton&); FXToggleButton& operator=(const FXToggleButton&); public: long onPaint(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onHotKeyPress(FXObject*,FXSelector,void*); long onHotKeyRelease(FXObject*,FXSelector,void*); long onCheck(FXObject*,FXSelector,void*); long onUncheck(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onCmdSetValue(FXObject*,FXSelector,void*); long onCmdSetIntValue(FXObject*,FXSelector,void*); long onCmdGetIntValue(FXObject*,FXSelector,void*); public: /// Construct toggle button with two text labels, and two icons, one for each state FXToggleButton(FXComposite* p,const FXString& text1,const FXString& text2,FXIcon* icon1=NULL,FXIcon* icon2=NULL,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=TOGGLEBUTTON_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Returns true because a toggle button can receive focus virtual bool canFocus() const; /// Get default width virtual FXint getDefaultWidth(); /// Get default height virtual FXint getDefaultHeight(); /// Change alternate text shown when toggled void setAltText(const FXString& text); /// Return alternate text FXString getAltText() const { return altlabel; } /// Change alternate icon shown when toggled void setAltIcon(FXIcon* ic); /// Return alternate icon FXIcon* getAltIcon() const { return alticon; } /// Change toggled state void setState(FXbool s=TRUE,FXbool notify=FALSE); /// return toggled state FXbool getState() const { return state; } /// Change alternate help text shown when toggled void setAltHelpText(const FXString& text); /// Return alternate help text FXString getAltHelpText() const { return althelp; } /// Change alternate tip text shown when toggled void setAltTipText(const FXString& text); /// Return alternate tip text FXString getAltTipText() const { return alttip; } /// Set the toggle button style flags void setToggleStyle(FXuint style); /// Get the toggle button style flags FXuint getToggleStyle() const; /// Save toggle button to a stream virtual void save(FXStream& store) const; /// Load toggle button from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXToggleButton(); }; } #endif fox1.6-1.6.57/include/FXToolBar.h000066400000000000000000000071361326741342000162400ustar00rootroot00000000000000/******************************************************************************** * * * T o o l B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToolBar.h,v 1.24 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTOOLBAR_H #define FXTOOLBAR_H #ifndef FXDOCKBAR_H #include "FXDockBar.h" #endif namespace FX { class FXDockSite; /** * A tool bar widget can be docked in a dock site; it automatically * adjusts its orientation based on the orientation of the dock site, * and adjusts the layout options accordingly. * See dock bar widget for more information on the docking behavior. */ class FXAPI FXToolBar : public FXDockBar { FXDECLARE(FXToolBar) protected: FXToolBar(){} private: FXToolBar(const FXToolBar&); FXToolBar &operator=(const FXToolBar&); public: long onCmdDockFlip(FXObject*,FXSelector,void*); long onUpdDockFlip(FXObject*,FXSelector,void*); public: /// Construct floatable toolbar, initially docked under parent p FXToolBar(FXComposite* p,FXComposite* q,FXuint opts=LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=3,FXint pr=3,FXint pt=2,FXint pb=2,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Construct a non-floatable toolbar FXToolBar(FXComposite* p,FXuint opts,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=2,FXint pr=3,FXint pt=3,FXint pb=2,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Dock and optionally flip orientation of toolbar virtual void dock(FXDockSite* docksite,FXWindow* before=NULL,FXbool notify=FALSE); /// Dock and optionally flip orientation of toolbar virtual void dock(FXDockSite* docksite,FXint localx,FXint localy,FXbool notify); /// Set docking side void setDockingSide(FXuint side=LAYOUT_SIDE_TOP); /// Return docking side FXuint getDockingSide() const; }; } #endif fox1.6-1.6.57/include/FXToolBarGrip.h000066400000000000000000000076531326741342000170660ustar00rootroot00000000000000/******************************************************************************** * * * T o o l B a r G r i p W i d g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToolBarGrip.h,v 1.20 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTOOLBARGRIP_H #define FXTOOLBARGRIP_H #ifndef FXDOCKHANDLER_H #include "FXDockHandler.h" #endif namespace FX { /// Tool Bar Grip styles enum { TOOLBARGRIP_SINGLE = 0, /// Single bar mode for movable toolbars TOOLBARGRIP_DOUBLE = 0x00008000 /// Double bar mode for dockable toolbars }; /** * A toolbar grip is used to move its container, a dock bar. * The grip draws either a single or double bar; it is customary * to use the single bar grip for toolbar-rearrangements only, * and use the double-bar when the toolbar needs to be floated * or docked. * The toolbar grip is automatically oriented properly by the * the toolbar widget, similar to the FXSeparator widget. * Holding the Control Key while dragging the grip will prevent * the toolbar from docking when it is near a dock site. */ class FXAPI FXToolBarGrip : public FXDockHandler { FXDECLARE(FXToolBarGrip) protected: FXColor activeColor; // Color when active protected: FXToolBarGrip(); private: FXToolBarGrip(const FXToolBarGrip&); FXToolBarGrip& operator=(const FXToolBarGrip&); public: long onPaint(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); public: /// Construct toolbar grip FXToolBarGrip(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=TOOLBARGRIP_SINGLE,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=0,FXint pr=0,FXint pt=0,FXint pb=0); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// The grip can not receive the focus virtual bool canFocus() const; /// Change toolbar grip to double void setDoubleBar(FXbool dbl=TRUE); /// Return TRUE if toolbar grip is displayed as a double bar FXbool isDoubleBar() const; /// Set the active color void setActiveColor(FXColor clr); /// Get the active color FXColor getActiveColor() const { return activeColor; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXToolBarShell.h000066400000000000000000000106311326741342000172220ustar00rootroot00000000000000/******************************************************************************** * * * T o o l B a r S h e l l W i d g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToolBarShell.h,v 1.8 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTOOLBARSHELL_H #define FXTOOLBARSHELL_H #ifndef FXTOPWINDOW_H #include "FXTopWindow.h" #endif namespace FX { /** * A Tool bar shell is a widget floating around over the Main Window. * It typically contains an undocked tool bar. */ class FXAPI FXToolBarShell : public FXTopWindow { FXDECLARE(FXToolBarShell) protected: FXColor baseColor; FXColor hiliteColor; FXColor shadowColor; FXColor borderColor; FXint border; protected: FXToolBarShell(){} void drawBorderRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawRidgeRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawGrooveRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawDoubleRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawDoubleSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); void drawFrame(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h); private: FXToolBarShell(const FXToolBarShell&); FXToolBarShell &operator=(const FXToolBarShell&); public: long onPaint(FXObject*,FXSelector,void*); public: /// Construct a toolbar shell FXToolBarShell(FXWindow* owner,FXuint opts=FRAME_RAISED|FRAME_THICK,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint hs=4,FXint vs=4); /// Create server-side resources virtual void create(); /// Perform layout virtual void layout(); /// Return the default width of this window virtual FXint getDefaultWidth(); /// Return the default height of this window virtual FXint getDefaultHeight(); /// Change frame style void setFrameStyle(FXuint style); /// Get current frame style FXuint getFrameStyle() const; /// Get border width FXint getBorderWidth() const { return border; } /// Change highlight color void setHiliteColor(FXColor clr); /// Get highlight color FXColor getHiliteColor() const { return hiliteColor; } /// Change shadow color void setShadowColor(FXColor clr); /// Get shadow color FXColor getShadowColor() const { return shadowColor; } /// Change border color void setBorderColor(FXColor clr); /// Get border color FXColor getBorderColor() const { return borderColor; } /// Change base gui color void setBaseColor(FXColor clr); /// Get base gui color FXColor getBaseColor() const { return baseColor; } /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXToolBarTab.h000066400000000000000000000121651326741342000166650ustar00rootroot00000000000000/******************************************************************************** * * * T o o l B a r T a b W i d g e t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToolBarTab.h,v 1.11 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTOOLBARTAB_H #define FXTOOLBARTAB_H #ifndef FXFRAME_H #include "FXFrame.h" #endif namespace FX { /// Tool Bar Tab styles enum { TOOLBARTAB_HORIZONTAL = 0, /// Default is for horizontal toolbar TOOLBARTAB_VERTICAL = 0x00008000 /// For vertical toolbar }; /** * A toolbar tab is used to collapse or uncollapse a sibling * widget. The sibling affected is the widget immediately following * the toolbar tab or, if the toolbar tab is the last widget in the list, * the widget immediately preceding the toolbar tab. */ class FXAPI FXToolBarTab : public FXFrame { FXDECLARE(FXToolBarTab) protected: FXColor activeColor; // Color when active FXString tip; // Tooltip FXbool collapsed; // Is collapsed flat FXbool down; // Button down protected: FXToolBarTab(); void drawUpArrow(FXDCWindow& dc); void drawDownArrow(FXDCWindow& dc); void drawRightArrow(FXDCWindow& dc); void drawLeftArrow(FXDCWindow& dc); void drawHSpeckles(FXDCWindow& dc,FXint x,FXint w); void drawVSpeckles(FXDCWindow& dc,FXint y,FXint h); private: FXToolBarTab(const FXToolBarTab&); FXToolBarTab& operator=(const FXToolBarTab&); public: long onPaint(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onCmdCollapse(FXObject*,FXSelector,void*); long onUpdCollapse(FXObject*,FXSelector,void*); long onCmdUncollapse(FXObject*,FXSelector,void*); long onUpdUncollapse(FXObject*,FXSelector,void*); long onCmdSetTip(FXObject*,FXSelector,void*); long onCmdGetTip(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: enum { ID_COLLAPSE=FXFrame::ID_LAST, ID_UNCOLLAPSE, ID_LAST }; public: /// Construct toolbar tab FXToolBarTab(FXComposite* p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_RAISED,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Toolbar tab can receive focus virtual bool canFocus() const; /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Enable the toolbar tab virtual void enable(); /// Disable the toolbar tab virtual void disable(); /// Collapse or uncollapse the toolbar void collapse(FXbool fold,FXbool notify=FALSE); /// Return true if the toolbar is collapsed FXbool isCollapsed() const { return collapsed; } /// Change the tab style void setTabStyle(FXuint style); /// Get current tab style FXuint getTabStyle() const; /// Get the active color FXColor getActiveColor() const { return activeColor; } /// Set the active color void setActiveColor(FXColor clr); /// Set the tool tip message for the toolbar tab void setTipText(const FXString& text){ tip=text; } /// Get the tool tip message for the toolbar tab const FXString& getTipText() const { return tip; } /// Save to a stream virtual void save(FXStream& store) const; /// Load from a stream virtual void load(FXStream& store); }; } #endif fox1.6-1.6.57/include/FXToolTip.h000066400000000000000000000104431326741342000162630ustar00rootroot00000000000000/******************************************************************************** * * * T o o l T i p W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToolTip.h,v 1.13 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTOOLTIP_H #define FXTOOLTIP_H #ifndef FXSHELL_H #include "FXShell.h" #endif namespace FX { class FXFont; /// Tooltip styles enum { TOOLTIP_PERMANENT = 0x00020000, /// Tooltip stays up indefinitely TOOLTIP_VARIABLE = 0x00040000, /// Tooltip stays up variable time, depending on the length of the string TOOLTIP_NORMAL = 0 /// Normal tooltip }; /// Hopefully Helpful Hint message class FXAPI FXToolTip : public FXShell { FXDECLARE(FXToolTip) protected: FXString label; // Text in the tip FXFont *font; // Font of the tip FXColor textColor; // Text color FXbool popped; // Is currently popped up protected: FXToolTip(); virtual bool doesOverrideRedirect() const; void place(FXint x,FXint y); void autoplace(); private: FXToolTip(const FXToolTip&); FXToolTip& operator=(const FXToolTip&); #ifdef WIN32 virtual const char* GetClass() const; #endif public: long onPaint(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onTipShow(FXObject*,FXSelector,void*); long onTipHide(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); public: enum { ID_TIP_SHOW=FXShell::ID_LAST, ID_TIP_HIDE, ID_LAST }; public: /// Construct a tool tip FXToolTip(FXApp* a,FXuint opts=TOOLTIP_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Display the tip virtual void show(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Set the text for this tip void setText(const FXString& text); /// Get the text for this tip FXString getText() const { return label; } /// Set the tip text font void setFont(FXFont *fnt); /// Get the tip text font FXFont* getFont() const { return font; } /// Get the current tip text color FXColor getTextColor() const { return textColor; } /// Set the current tip text color void setTextColor(FXColor clr); virtual bool doesSaveUnder() const; /// Save tip to a stream virtual void save(FXStream& store) const; /// Load tip from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXToolTip(); }; } #endif fox1.6-1.6.57/include/FXTopWindow.h000066400000000000000000000262141326741342000166260ustar00rootroot00000000000000/******************************************************************************** * * * T o p - L e v e l W i n d o w W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTopWindow.h,v 1.62 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTOPWINDOW_H #define FXTOPWINDOW_H #ifndef FXSHELL_H #include "FXShell.h" #endif namespace FX { /// Title and border decorations enum { DECOR_NONE = 0, /// Borderless window DECOR_TITLE = 0x00020000, /// Window title DECOR_MINIMIZE = 0x00040000, /// Minimize button DECOR_MAXIMIZE = 0x00080000, /// Maximize button DECOR_CLOSE = 0x00100000, /// Close button DECOR_BORDER = 0x00200000, /// Border DECOR_SHRINKABLE = 0x00400000, /// Window can become smaller DECOR_STRETCHABLE = 0x00800000, /// Window can become larger DECOR_RESIZE = DECOR_SHRINKABLE|DECOR_STRETCHABLE, /// Resize handles DECOR_MENU = 0x01000000, /// Window menu DECOR_ALL = (DECOR_TITLE|DECOR_MINIMIZE|DECOR_MAXIMIZE|DECOR_CLOSE|DECOR_BORDER|DECOR_SHRINKABLE|DECOR_STRETCHABLE|DECOR_MENU) }; /// Initial window placement enum { PLACEMENT_DEFAULT, /// Place it at the default size and location PLACEMENT_VISIBLE, /// Place window to be fully visible PLACEMENT_CURSOR, /// Place it under the cursor position PLACEMENT_OWNER, /// Place it centered on its owner PLACEMENT_SCREEN, /// Place it centered on the screen PLACEMENT_MAXIMIZED /// Place it maximized to the screen size }; class FXToolBar; class FXIcon; /** * Abstract base class for all top-level windows. * TopWindows are usually managed by a Window Manager under X11 and * therefore borders and window-menus and other decorations like resize- * handles are subject to the Window Manager's interpretation of the * decoration hints. * When a TopWindow is closed, it sends a SEL_CLOSE message to its * target. The target should return 0 in response to this message if * there is no objection to proceed with the closing of the window, and * return 1 otherwise. After the SEL_CLOSE message has been sent and * no objection was raised, the window will delete itself. * When the session is closed, the window will send a SEL_SESSION_NOTIFY * message to its target, allowing the application to write any unsaved * data to the disk. If the target returns 0, then the system will proceed * to close the session. Subsequently a SEL_SESSION_CLOSED will be received * which causes the window to be closed with prejudice by calling the * function close(FALSE). * When receiving a SEL_UPDATE, the target can update the title string * of the window, so that the title of the window reflects the name * of the document, for example. * For convenience, TopWindow provides the same layout behavior as * the Packer widget, as well as docking and undocking of toolbars. * TopWindows can be owned by other windows, or be free-floating. * Owned TopWindows will usually remain stacked on top of the owner * windows. The lifetime of an owned window should not exceed that of * the owner. */ class FXAPI FXTopWindow : public FXShell { FXDECLARE_ABSTRACT(FXTopWindow) protected: FXString title; // Window title FXIcon *icon; // Window icon (big) FXIcon *miniIcon; // Window icon (small) FXint padtop; // Top margin FXint padbottom; // Bottom margin FXint padleft; // Left margin FXint padright; // Right margin FXint hspacing; // Horizontal child spacing FXint vspacing; // Vertical child spacing protected: FXTopWindow(); void settitle(); void seticons(); void setdecorations(); FXTopWindow(FXApp* ap,const FXString& name,FXIcon *ic,FXIcon *mi,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs); FXTopWindow(FXWindow* ow,const FXString& name,FXIcon *ic,FXIcon *mi,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs); private: FXTopWindow(const FXTopWindow&); FXTopWindow& operator=(const FXTopWindow&); #ifdef WIN32 virtual const char* GetClass() const; #endif public: long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusLeft(FXObject*,FXSelector,void*); long onFocusRight(FXObject*,FXSelector,void*); long onSessionNotify(FXObject*,FXSelector,void*); long onSessionClosed(FXObject*,FXSelector,void*); long onCmdMaximize(FXObject*,FXSelector,void*); long onCmdMinimize(FXObject*,FXSelector,void*); long onCmdRestore(FXObject*,FXSelector,void*); long onCmdClose(FXObject*,FXSelector,void*); long onCmdSetStringValue(FXObject*,FXSelector,void*); long onCmdGetStringValue(FXObject*,FXSelector,void*); long onCmdSetIconValue(FXObject*,FXSelector,void*); long onCmdGetIconValue(FXObject*,FXSelector,void*); public: enum { ID_MAXIMIZE=FXShell::ID_LAST, /// Maximize the window ID_MINIMIZE, /// Minimize the window ID_RESTORE, /// Restore the window ID_CLOSE, /// Close the window ID_QUERY_DOCK, /// Toolbar asks to dock ID_LAST }; public: /// Create server-side resources virtual void create(); /// Detach the server-side resources for this window virtual void detach(); /// Destroy the server-side resources for this window virtual void destroy(); /// Perform layout virtual void layout(); /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Show this window virtual void show(); /// Hide this window virtual void hide(); /// Show this window with given placement virtual void show(FXuint placement); /// Position the window based on placement void place(FXuint placement); /// Return the default width of this window virtual FXint getDefaultWidth(); /// Return the default height of this window virtual FXint getDefaultHeight(); /// Obtain border sizes added to our window by the window manager FXbool getWMBorders(FXint& left,FXint& right,FXint& top,FXint& bottom); /// Raise this window to the top of the stacking order virtual void raise(); /// Move this window to the specified position in the parent's coordinates virtual void move(FXint x,FXint y); /// Resize this window to the specified width and height virtual void resize(FXint w,FXint h); /// Move and resize this window in the parent's coordinates virtual void position(FXint x,FXint y,FXint w,FXint h); /// Maximize window, return TRUE if maximized virtual FXbool maximize(FXbool notify=FALSE); /// Minimize or iconify window, return TRUE if minimized virtual FXbool minimize(FXbool notify=FALSE); /// Restore window to normal, return TRUE if restored virtual FXbool restore(FXbool notify=FALSE); /** * Close the window, return TRUE if actually closed. If notify=TRUE, the target * will receive a SEL_CLOSE message to determine if it is OK to close the window. * If the target ignores the SEL_CLOSE message or returns 0, the window will * be closed, and subsequently deleted. When the last main window has been * closed, the application will receive an ID_QUIT message and will be closed. */ virtual FXbool close(FXbool notify=FALSE); /// Return TRUE if maximized FXbool isMaximized() const; /// Return TRUE if minimized FXbool isMinimized() const; /// Change window title void setTitle(const FXString& name); /// Return window title FXString getTitle() const { return title; } /// Change top padding void setPadTop(FXint pt); /// Get top interior padding FXint getPadTop() const { return padtop; } /// Change bottom padding void setPadBottom(FXint pb); /// Get bottom interior padding FXint getPadBottom() const { return padbottom; } /// Change left padding void setPadLeft(FXint pl); /// Get left interior padding FXint getPadLeft() const { return padleft; } /// Change right padding void setPadRight(FXint pr); /// Get right interior padding FXint getPadRight() const { return padright; } /// Return horizontal spacing between children FXint getHSpacing() const { return hspacing; } /// Return vertical spacing between children FXint getVSpacing() const { return vspacing; } /// Change horizontal spacing between children void setHSpacing(FXint hs); /// Change vertical spacing between children void setVSpacing(FXint vs); /// Change packing hints for children void setPackingHints(FXuint ph); /// Return packing hints for children FXuint getPackingHints() const; /// Change title and border decorations void setDecorations(FXuint decorations); /// Return current title and border decorations FXuint getDecorations() const; /// Return window icon FXIcon* getIcon() const { return icon; } /// Change window icon void setIcon(FXIcon* ic); /// Return window mini (title) icon FXIcon* getMiniIcon() const { return miniIcon; } /// Change window mini (title) icon void setMiniIcon(FXIcon *ic); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destructor virtual ~FXTopWindow(); }; } #endif fox1.6-1.6.57/include/FXTranslator.h000066400000000000000000000062051326741342000170230ustar00rootroot00000000000000/******************************************************************************** * * * M e s s a g e T r a n s l a t o r * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTranslator.h,v 1.6 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTRANSLATOR_H #define FXTRANSLATOR_H #ifndef FXOBJECT_H #include "FXObject.h" #endif //////////////////////////// UNDER DEVELOPMENT //////////////////////////////// namespace FX { class FXApp; class FXTextCodec; /** * The translator class translates a message to another language. */ class FXAPI FXTranslator : public FXObject { FXDECLARE(FXTranslator) private: FXApp *app; // Back link to application object FXTextCodec *codec; // Text codec used for source text private: FXTranslator(const FXTranslator&); FXTranslator &operator=(const FXTranslator&); protected: FXTranslator():app((FXApp*)-1L){} public: /// Construct translator FXTranslator(FXApp* a); /// Get application FXApp* getApp() const { return app; } /// Translate a string virtual const FXchar* tr(const FXchar* context,const FXchar* message,const FXchar* hint=NULL) const; /// Change text codec used to decode the messages embedded in the source void setTextCodec(FXTextCodec *cdc){ codec=cdc; } /// Return text codec FXTextCodec *getTextCodec() const { return codec; } /// Save translator to a stream virtual void save(FXStream& store) const; /// Load translator from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXTranslator(); }; } #endif fox1.6-1.6.57/include/FXTreeList.h000066400000000000000000000531311326741342000164250ustar00rootroot00000000000000/******************************************************************************** * * * T r e e L i s t W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTreeList.h,v 1.101 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTREELIST_H #define FXTREELIST_H #ifndef FXSCROLLAREA_H #include "FXScrollArea.h" #endif namespace FX { class FXIcon; class FXFont; class FXTreeList; class FXDirList; /// Tree list styles enum { TREELIST_EXTENDEDSELECT = 0, /// Extended selection mode allows for drag-selection of ranges of items TREELIST_SINGLESELECT = 0x00100000, /// Single selection mode allows up to one item to be selected TREELIST_BROWSESELECT = 0x00200000, /// Browse selection mode enforces one single item to be selected at all times TREELIST_MULTIPLESELECT = 0x00300000, /// Multiple selection mode is used for selection of individual items TREELIST_AUTOSELECT = 0x00400000, /// Automatically select under cursor TREELIST_SHOWS_LINES = 0x00800000, /// Lines shown TREELIST_SHOWS_BOXES = 0x01000000, /// Boxes to expand shown TREELIST_ROOT_BOXES = 0x02000000, /// Display root boxes also TREELIST_NORMAL = TREELIST_EXTENDEDSELECT }; /// Tree list Item class FXAPI FXTreeItem : public FXObject { FXDECLARE(FXTreeItem) friend class FXTreeList; friend class FXDirList; protected: FXTreeItem *parent; // Parent item FXTreeItem *prev; // Previous item FXTreeItem *next; // Next item FXTreeItem *first; // First child item FXTreeItem *last; // Last child item FXString label; // Text of item FXIcon *openIcon; // Icon of item FXIcon *closedIcon; // Icon of item void *data; // Item user data pointer FXuint state; // Item state flags FXint x,y; private: FXTreeItem(const FXTreeItem&); FXTreeItem& operator=(const FXTreeItem&); protected: FXTreeItem():parent(NULL),prev(NULL),next(NULL),first(NULL),last(NULL),openIcon(NULL),closedIcon(NULL),data(NULL),state(0),x(0),y(0){} virtual void draw(const FXTreeList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const; virtual FXint hitItem(const FXTreeList* list,FXint x,FXint y) const; public: enum{ SELECTED = 1, /// Selected FOCUS = 2, /// Focus DISABLED = 4, /// Disabled OPENED = 8, /// Opened EXPANDED = 16, /// Expanded HASITEMS = 32, /// Has virtual subitems DRAGGABLE = 64, /// Draggable OPENICONOWNED = 128, /// Open icon owned by item CLOSEDICONOWNED = 256 /// Close icon owned by item }; public: /// Constructor FXTreeItem(const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL):parent(NULL),prev(NULL),next(NULL),first(NULL),last(NULL),label(text),openIcon(oi),closedIcon(ci),data(ptr),state(0),x(0),y(0){} /// Get parent item FXTreeItem* getParent() const { return parent; } /// Get next sibling item FXTreeItem* getNext() const { return next; } /// Get previous sibling item FXTreeItem* getPrev() const { return prev; } /// Get first child item FXTreeItem* getFirst() const { return first; } /// Get las child item FXTreeItem* getLast() const { return last; } /// Get item below this one in list FXTreeItem* getBelow() const; /// Get item above this one in list FXTreeItem* getAbove() const; /// Get number of children of item FXint getNumChildren() const; /// Change item label virtual void setText(const FXString& txt); /// Get item label const FXString& getText() const { return label; } /// Change open icon, deleting the old icon if it was owned virtual void setOpenIcon(FXIcon* icn,FXbool owned=FALSE); /// Get open icon FXIcon* getOpenIcon() const { return openIcon; } /// Change closed icon, deleting the old icon if it was owned virtual void setClosedIcon(FXIcon* icn,FXbool owned=FALSE); /// Get closed icon FXIcon* getClosedIcon() const { return closedIcon; } /// Change item user data void setData(void* ptr){ data=ptr; } /// Get item user data void* getData() const { return data; } /// Make item draw as focused virtual void setFocus(FXbool focus); /// Return true if item has focus FXbool hasFocus() const { return (state&FOCUS)!=0; } /// Select item virtual void setSelected(FXbool selected); /// Return true if this item is selected FXbool isSelected() const { return (state&SELECTED)!=0; } /// Make item show as open virtual void setOpened(FXbool opened); /// Return true if this item is open FXbool isOpened() const { return (state&OPENED)!=0; } /// Expand or collapse item virtual void setExpanded(FXbool expanded); /// Return true if this item is expanded into sub items FXbool isExpanded() const { return (state&EXPANDED)!=0; } /// Enable or disable item virtual void setEnabled(FXbool enabled); /// Return true if this item is enabled FXbool isEnabled() const { return (state&DISABLED)==0; } /// Make item draggable virtual void setDraggable(FXbool draggable); /// Return true if this item is draggable FXbool isDraggable() const { return (state&DRAGGABLE)!=0; } /// Return TRUE if subitems, real or imagined FXbool hasItems() const { return (state&HASITEMS)!=0; } /// Change has items flag void setHasItems(FXbool flag); /// Return true if descendent of parent item FXbool isChildOf(const FXTreeItem* item) const; /// Return true if ancestor of child item FXbool isParentOf(const FXTreeItem* item) const; /// Return width of item as drawn in list virtual FXint getWidth(const FXTreeList* list) const; /// Return height of item as drawn in list virtual FXint getHeight(const FXTreeList* list) const; /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); /// Destroy item and free icons if owned virtual ~FXTreeItem(); }; /// Tree item collate function typedef FXint (*FXTreeListSortFunc)(const FXTreeItem*,const FXTreeItem*); /** * A Tree List Widget organizes items in a hierarchical, tree-like fashion. * Subtrees can be collapsed or expanded by double-clicking on an item * or by clicking on the optional plus button in front of the item. * Each item may have a text and optional open-icon as well as a closed-icon. * The items may be connected by optional lines to show the hierarchical * relationship. * When an item's selected state changes, the treelist emits a SEL_SELECTED * or SEL_DESELECTED message. If an item is opened or closed, a message * of type SEL_OPENED or SEL_CLOSED is sent. When the subtree under an * item is expanded, a SEL_EXPANDED or SEL_COLLAPSED message is issued. * A change of the current item is signified by the SEL_CHANGED message. * In addition, the tree list sends SEL_COMMAND messages when the user * clicks on an item, and SEL_CLICKED, SEL_DOUBLECLICKED, and SEL_TRIPLECLICKED * when the user clicks once, twice, or thrice, respectively. * When items are added or removed, the tree list sends messages of the * type SEL_INSERTED or SEL_DELETED. * In each of these cases, a pointer to the item, if any, is passed in the * 3rd argument of the message. */ class FXAPI FXTreeList : public FXScrollArea { FXDECLARE(FXTreeList) protected: FXTreeItem *firstitem; // First root item FXTreeItem *lastitem; // Last root item FXTreeItem *anchoritem; // Selection anchor item FXTreeItem *currentitem; // Current item FXTreeItem *extentitem; // Selection extent FXTreeItem *cursoritem; // Item under cursor FXTreeItem *viewableitem; // Visible item FXFont *font; // Font FXTreeListSortFunc sortfunc; // Item sort function FXColor textColor; // Text color FXColor selbackColor; // Selected background color FXColor seltextColor; // Selected text color FXColor lineColor; // Line color FXint treeWidth; // Tree width FXint treeHeight; // Tree height FXint visible; // Number of visible items FXint indent; // Parent to child indentation FXint grabx; // Grab point x FXint graby; // Grab point y FXString lookup; // Lookup string FXString tip; FXString help; // Help string FXbool state; // State of item protected: FXTreeList(); virtual FXTreeItem* createItem(const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr); void sort(FXTreeItem*& f1,FXTreeItem*& t1,FXTreeItem*& f2,FXTreeItem*& t2,int n); void recompute(); private: FXTreeList(const FXTreeList&); FXTreeList& operator=(const FXTreeList&); public: long onPaint(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onTipTimer(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onAutoScroll(FXObject*,FXSelector,void*); long onClicked(FXObject*,FXSelector,void*); long onDoubleClicked(FXObject*,FXSelector,void*); long onTripleClicked(FXObject*,FXSelector,void*); long onCommand(FXObject*,FXSelector,void*); long onLookupTimer(FXObject*,FXSelector,void*); public: static FXint ascending(const FXTreeItem*,const FXTreeItem*); static FXint descending(const FXTreeItem*,const FXTreeItem*); static FXint ascendingCase(const FXTreeItem*,const FXTreeItem*); static FXint descendingCase(const FXTreeItem*,const FXTreeItem*); public: enum { ID_LOOKUPTIMER=FXScrollArea::ID_LAST, ID_LAST }; public: /// Construct a new, initially empty tree list FXTreeList(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=TREELIST_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Compute and return content width virtual FXint getContentWidth(); /// Return content height virtual FXint getContentHeight(); /// Recalculate layout virtual void recalc(); /// Tree list can receive focus virtual bool canFocus() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Return number of items FXint getNumItems() const; /// Return number of visible items FXint getNumVisible() const { return visible; } /// Change number of visible items void setNumVisible(FXint nvis); /// Return first root item FXTreeItem* getFirstItem() const { return firstitem; } /// Return last root item FXTreeItem* getLastItem() const { return lastitem; } /// Fill tree list by appending items from array of strings FXint fillItems(FXTreeItem* father,const FXchar** strings,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Fill tree list by appending items from newline separated strings FXint fillItems(FXTreeItem* father,const FXString& strings,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Insert [possibly subclassed] item under father before other item FXTreeItem* insertItem(FXTreeItem* other,FXTreeItem* father,FXTreeItem* item,FXbool notify=FALSE); /// Insert item with given text and optional icons, and user-data pointer under father before other item FXTreeItem* insertItem(FXTreeItem* other,FXTreeItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Append [possibly subclassed] item as last child of father FXTreeItem* appendItem(FXTreeItem* father,FXTreeItem* item,FXbool notify=FALSE); /// Append item with given text and optional icons, and user-data pointer as last child of father FXTreeItem* appendItem(FXTreeItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Prepend [possibly subclassed] item as first child of father FXTreeItem* prependItem(FXTreeItem* father,FXTreeItem* item,FXbool notify=FALSE); /// Prepend item with given text and optional icons, and user-data pointer as first child of father FXTreeItem* prependItem(FXTreeItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL,FXbool notify=FALSE); /// Move item under father before other item FXTreeItem *moveItem(FXTreeItem* other,FXTreeItem* father,FXTreeItem* item); /// Extract item FXTreeItem* extractItem(FXTreeItem* item,FXbool notify=FALSE); /// Remove item void removeItem(FXTreeItem* item,FXbool notify=FALSE); /// Remove items in range [fm, to] inclusively void removeItems(FXTreeItem* fm,FXTreeItem* to,FXbool notify=FALSE); /// Remove all items from list void clearItems(FXbool notify=FALSE); /// Return item width FXint getItemWidth(const FXTreeItem* item) const { return item->getWidth(this); } /// Return item height FXint getItemHeight(const FXTreeItem* item) const { return item->getHeight(this); } /// Get item at x,y, if any virtual FXTreeItem* getItemAt(FXint x,FXint y) const; /** * Search items by name, beginning from item start. If the start item * is NULL the search will start at the first, top-most item in the list. * Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control the search * direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. * The option SEARCH_IGNORECASE causes a case-insensitive match. Finally, * passing SEARCH_PREFIX causes searching for a prefix of the item name. * Return NULL if no matching item is found. */ FXTreeItem* findItem(const FXString& name,FXTreeItem* start=NULL,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /** * Search items by associated user data, beginning from item start. If the * start item is NULL the search will start at the first, top-most item * in the list. Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control * the search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. */ FXTreeItem* findItemByData(const void *ptr,FXTreeItem* start=NULL,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /// Scroll to make item visible virtual void makeItemVisible(FXTreeItem* item); /// Change item's text void setItemText(FXTreeItem* item,const FXString& text); /// Return item's text FXString getItemText(const FXTreeItem* item) const; /// Change item's open icon void setItemOpenIcon(FXTreeItem* item,FXIcon* icon,FXbool owned=FALSE); /// Return item's open icon, deleting the old icon if it was owned FXIcon* getItemOpenIcon(const FXTreeItem* item) const; /// Chance item's closed icon, deleting the old icon if it was owned void setItemClosedIcon(FXTreeItem* item,FXIcon* icon,FXbool owned=FALSE); /// Return item's closed icon FXIcon* getItemClosedIcon(const FXTreeItem* item) const; /// Change item user-data pointer void setItemData(FXTreeItem* item,void* ptr) const; /// Return item user-data pointer void* getItemData(const FXTreeItem* item) const; /// Return TRUE if item is selected FXbool isItemSelected(const FXTreeItem* item) const; /// Return TRUE if item is current FXbool isItemCurrent(const FXTreeItem* item) const; /// Return TRUE if item is visible FXbool isItemVisible(const FXTreeItem* item) const; /// Return TRUE if item opened FXbool isItemOpened(const FXTreeItem* item) const; /// Return TRUE if item expanded FXbool isItemExpanded(const FXTreeItem* item) const; /// Return TRUE if item is a leaf-item, i.e. has no children FXbool isItemLeaf(const FXTreeItem* item) const; /// Return TRUE if item is enabled FXbool isItemEnabled(const FXTreeItem* item) const; /// Return item hit code: 0 outside, 1 icon, 2 text, 3 box FXint hitItem(const FXTreeItem* item,FXint x,FXint y) const; /// Repaint item void updateItem(FXTreeItem* item) const; /// Enable item virtual FXbool enableItem(FXTreeItem* item); /// Disable item virtual FXbool disableItem(FXTreeItem* item); /// Select item virtual FXbool selectItem(FXTreeItem* item,FXbool notify=FALSE); /// Deselect item virtual FXbool deselectItem(FXTreeItem* item,FXbool notify=FALSE); /// Toggle item selection virtual FXbool toggleItem(FXTreeItem* item,FXbool notify=FALSE); /// Extend selection from anchor item to item virtual FXbool extendSelection(FXTreeItem* item,FXbool notify=FALSE); /// Deselect all items virtual FXbool killSelection(FXbool notify=FALSE); /// Open item virtual FXbool openItem(FXTreeItem* item,FXbool notify=FALSE); /// Close item virtual FXbool closeItem(FXTreeItem* item,FXbool notify=FALSE); /// Collapse tree virtual FXbool collapseTree(FXTreeItem* tree,FXbool notify=FALSE); /// Expand tree virtual FXbool expandTree(FXTreeItem* tree,FXbool notify=FALSE); /// Change current item virtual void setCurrentItem(FXTreeItem* item,FXbool notify=FALSE); /// Return current item, if any FXTreeItem* getCurrentItem() const { return currentitem; } /// Change anchor item void setAnchorItem(FXTreeItem* item); /// Return anchor item, if any FXTreeItem* getAnchorItem() const { return anchoritem; } /// Return item under cursor, if any FXTreeItem* getCursorItem() const { return cursoritem; } /// Sort all items recursively void sortItems(); /// Sort root items void sortRootItems(); /// Sort children of item void sortChildItems(FXTreeItem* item); /// Return sort function FXTreeListSortFunc getSortFunc() const { return sortfunc; } /// Change sort function void setSortFunc(FXTreeListSortFunc func){ sortfunc=func; } /// Change text font void setFont(FXFont* fnt); /// Return text font FXFont* getFont() const { return font; } /// Change parent-child indent amount void setIndent(FXint in); /// Return parent-child indent amount FXint getIndent() const { return indent; } /// Return normal text color FXColor getTextColor() const { return textColor; } /// Change normal text color void setTextColor(FXColor clr); /// Return selected text background FXColor getSelBackColor() const { return selbackColor; } /// Change selected text background void setSelBackColor(FXColor clr); /// Return selected text color FXColor getSelTextColor() const { return seltextColor; } /// Change selected text color void setSelTextColor(FXColor clr); /// Return line color FXColor getLineColor() const { return lineColor; } /// Change line color void setLineColor(FXColor clr); /// Return list style FXuint getListStyle() const; /// Change list style void setListStyle(FXuint style); /// Set the status line help text for this list void setHelpText(const FXString& text); /// Get the status line help text for this list const FXString& getHelpText() const { return help; } /// Save object to a stream virtual void save(FXStream& store) const; /// Load object from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXTreeList(); }; } #endif fox1.6-1.6.57/include/FXTreeListBox.h000066400000000000000000000227451326741342000171050ustar00rootroot00000000000000/******************************************************************************** * * * T r e e L i s t B o x W i d g e t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTreeListBox.h,v 1.41 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTREELISTBOX_H #define FXTREELISTBOX_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { /// Tree List Box styles enum { TREELISTBOX_NORMAL = 0 /// Normal style }; class FXButton; class FXMenuButton; class FXTreeList; class FXPopup; /** * The Tree List Box behaves very much like a List Box, except that * it supports a hierarchical, tree structured display of the items. * When an item is selected it issues a SEL_COMMAND message with the * pointer to the item. While manipulating the tree list, it may send * SEL_CHANGED messages to indicate which item the cursor is hovering over. */ class FXAPI FXTreeListBox : public FXPacker { FXDECLARE(FXTreeListBox) protected: FXButton *field; FXMenuButton *button; FXTreeList *tree; FXPopup *pane; protected: FXTreeListBox(){} private: FXTreeListBox(const FXTreeListBox&); FXTreeListBox& operator=(const FXTreeListBox&); public: long onFocusUp(FXObject*,FXSelector,void*); long onFocusDown(FXObject*,FXSelector,void*); long onFocusSelf(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onFieldButton(FXObject*,FXSelector,void*); long onTreeUpdate(FXObject*,FXSelector,void*); long onTreeChanged(FXObject*,FXSelector,void*); long onTreeClicked(FXObject*,FXSelector,void*); public: enum{ ID_TREE=FXPacker::ID_LAST, ID_FIELD, ID_LAST }; public: /// Construct tree list box FXTreeListBox(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=FRAME_SUNKEN|FRAME_THICK|TREELISTBOX_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Destroy server-side resources virtual void destroy(); /// Perform layout virtual void layout(); /// Enable widget virtual void enable(); /// Disable widget virtual void disable(); /// Return default with virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); /// Return number of items FXint getNumItems() const; /// Return number of visible items FXint getNumVisible() const; /// Set number of visible items to determine default height void setNumVisible(FXint nvis); /// Return first top-level item FXTreeItem* getFirstItem() const; /// Return last top-level item FXTreeItem* getLastItem() const; /// Fill tree list box by appending items from array of strings FXint fillItems(FXTreeItem* father,const FXchar** strings,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL); /// Fill tree list box by appending items from newline separated strings FXint fillItems(FXTreeItem* father,const FXString& strings,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL); /// Insert [possibly subclassed] item under father before other item FXTreeItem* insertItem(FXTreeItem* other,FXTreeItem* father,FXTreeItem* item); /// Insert item with given text and optional icons, and user-data pointer under father before other item FXTreeItem* insertItem(FXTreeItem* other,FXTreeItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL); /// Append [possibly subclassed] item as last child of father FXTreeItem* appendItem(FXTreeItem* father,FXTreeItem* item); /// Append item with given text and optional icons, and user-data pointer as last child of father FXTreeItem* appendItem(FXTreeItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL); /// Prepend [possibly subclassed] item as first child of father FXTreeItem* prependItem(FXTreeItem* father,FXTreeItem* item); /// Prepend item with given text and optional icons, and user-data pointer as first child of father FXTreeItem* prependItem(FXTreeItem* father,const FXString& text,FXIcon* oi=NULL,FXIcon* ci=NULL,void* ptr=NULL); /// Move item under father before other item FXTreeItem *moveItem(FXTreeItem* other,FXTreeItem* father,FXTreeItem* item); /// Extract item FXTreeItem* extractItem(FXTreeItem* item); /// Remove item void removeItem(FXTreeItem* item); /// Remove all items in range [fm...to] void removeItems(FXTreeItem* fm,FXTreeItem* to); /// Remove all items from list void clearItems(); /** * Search items by name, beginning from item start. If the * start item is NULL the search will start at the first, top-most item * in the list. Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control * the search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. * The option SEARCH_IGNORECASE causes a case-insensitive match. Finally, * passing SEARCH_PREFIX causes searching for a prefix of the item name. * Return NULL if no matching item is found. */ FXTreeItem* findItem(const FXString& text,FXTreeItem* start=NULL,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /** * Search items by associated user data, beginning from item start. If the * start item is NULL the search will start at the first, top-most item * in the list. Flags may be SEARCH_FORWARD or SEARCH_BACKWARD to control * the search direction; this can be combined with SEARCH_NOWRAP or SEARCH_WRAP * to control whether the search wraps at the start or end of the list. */ FXTreeItem* findItemByData(const void *ptr,FXTreeItem* start=NULL,FXuint flags=SEARCH_FORWARD|SEARCH_WRAP) const; /// Return TRUE if item is the current item FXbool isItemCurrent(const FXTreeItem* item) const; /// Return TRUE if item is leaf-item, i.e. has no children FXbool isItemLeaf(const FXTreeItem* item) const; /// Sort the toplevel items with the sort function void sortRootItems(); /// Sort all items recursively void sortItems(); /// Sort child items of item void sortChildItems(FXTreeItem* item); /// Change current item virtual void setCurrentItem(FXTreeItem* item,FXbool notify=FALSE); /// Return current item FXTreeItem* getCurrentItem() const; /// Change item label void setItemText(FXTreeItem* item,const FXString& text); /// Return item label FXString getItemText(const FXTreeItem* item) const; /// Change item's open icon, delete old one if it was owned void setItemOpenIcon(FXTreeItem* item,FXIcon* icon,FXbool owned=FALSE); /// Return item's open icon FXIcon* getItemOpenIcon(const FXTreeItem* item) const; /// Change item's closed icon, delete old one if it was owned void setItemClosedIcon(FXTreeItem* item,FXIcon* icon,FXbool owned=FALSE); /// Return item's closed icon FXIcon* getItemClosedIcon(const FXTreeItem* item) const; /// Change item's user data void setItemData(FXTreeItem* item,void* ptr) const; /// Return item's user data void* getItemData(const FXTreeItem* item) const; /// Return item sort function FXTreeListSortFunc getSortFunc() const; /// Change item sort function void setSortFunc(FXTreeListSortFunc func); /// Is the pane shown FXbool isPaneShown() const; /// Change font void setFont(FXFont* fnt); /// Return font FXFont* getFont() const; /// Return list style FXuint getListStyle() const; /// Change list style void setListStyle(FXuint style); /// Change help text void setHelpText(const FXString& txt); /// Return help text const FXString& getHelpText() const; /// Change tip text void setTipText(const FXString& txt); /// Return tip text const FXString& getTipText() const; /// Save object to a stream virtual void save(FXStream& store) const; /// Load object from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXTreeListBox(); }; } #endif fox1.6-1.6.57/include/FXTriStateButton.h000066400000000000000000000107631326741342000176310ustar00rootroot00000000000000/******************************************************************************** * * * T r i - S t a t e B u t t o n W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Charles Warren. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTriStateButton.h,v 1.6 2006/01/22 17:58:11 fox Exp $ * ********************************************************************************/ #ifndef FXTRISTATEBUTTON_H #define FXTRISTATEBUTTON_H #ifndef FXTOGGLEBUTTON_H #include "FXToggleButton.h" #endif namespace FX { /** * The tri-state button provides a three-state button, which toggles between the * on and the off state each time it is pressed; programmatically, it may also be * switched into the MAYBE state. The MAYBE state is useful to signify an unknown * state in the application data. * Like the toggle button, it sends a SEL_COMMAND to its target, with the * message data set to the current state of the toggle button, of the type FXbool. */ class FXAPI FXTriStateButton : public FXToggleButton { FXDECLARE(FXTriStateButton) protected: FXString maybelabel; FXIcon *maybeicon; FXString maybetip; FXString maybehelp; protected: FXTriStateButton(); private: FXTriStateButton(const FXTriStateButton&); FXTriStateButton& operator=(const FXTriStateButton&); public: long onPaint(FXObject*,FXSelector,void*); long onUnknown(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); public: /// Construct tri-state toggle button with three text labels, and three icons, one for each state FXTriStateButton(FXComposite* p,const FXString& text1,const FXString& text2,const FXString& text3,FXIcon* icon1=NULL,FXIcon* icon2=NULL,FXIcon* icon3=NULL,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=TOGGLEBUTTON_NORMAL,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_PAD,FXint pr=DEFAULT_PAD,FXint pt=DEFAULT_PAD,FXint pb=DEFAULT_PAD); /// Create server-side resources virtual void create(); /// Detach server-side resources virtual void detach(); /// Get default width virtual FXint getDefaultWidth(); /// Get default height virtual FXint getDefaultHeight(); /// Change maybe text shown when toggled void setMaybeText(const FXString& text); /// Return maybe text FXString getMaybeText() const { return maybelabel; } /// Change maybe icon shown when toggled void setMaybeIcon(FXIcon* ic); /// Return maybe icon FXIcon* getMaybeIcon() const { return maybeicon; } /// Change maybe help text shown when toggled void setMaybeHelpText(const FXString& text); /// Return maybe help text FXString getMaybeHelpText() const { return maybehelp; } /// Change maybe tip text shown when toggled void setMaybeTipText(const FXString& text); /// Return maybe tip text FXString getMaybeTipText() const { return maybetip; } /// Save toggle button to a stream virtual void save(FXStream& store) const; /// Load toggle button from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXTriStateButton(); }; } #endif fox1.6-1.6.57/include/FXURL.h000066400000000000000000000045061326741342000153360ustar00rootroot00000000000000/******************************************************************************** * * * U R L M a n i p u l a t i o n * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXURL.h,v 1.13 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXURL_H #define FXURL_H namespace FX { namespace FXURL { /// Return host name extern FXAPI FXString hostname(); /// Return URL of filename extern FXAPI FXString fileToURL(const FXString& file); /// Return filename from URL, empty if url is not a local file extern FXAPI FXString fileFromURL(const FXString& url); /// Decode url string extern FXAPI FXString decode(const FXString& url); /// Encode url string extern FXAPI FXString encode(const FXString& url); } } #endif fox1.6-1.6.57/include/FXUTF16Codec.h000066400000000000000000000071471326741342000164430ustar00rootroot00000000000000/******************************************************************************** * * * U T F - 1 6 T e x t C o d e c * * * ********************************************************************************* * Copyright (C) 2002,2006 by L.Johnson & J.van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXUTF16Codec.h,v 1.10 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXUTF16CODEC_H #define FXUTF16CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// Codec for UTF-16BE class FXAPI FXUTF16BECodec : public FXTextCodec { FXDECLARE(FXUTF16BECodec) public: FXUTF16BECodec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual FXint mibEnum() const; virtual const FXchar* const* aliases() const; virtual ~FXUTF16BECodec(){} }; /// Codec for UTF-16LE class FXAPI FXUTF16LECodec : public FXTextCodec { FXDECLARE(FXUTF16LECodec) public: FXUTF16LECodec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual FXint mibEnum() const; virtual const FXchar* const* aliases() const; virtual ~FXUTF16LECodec(){} }; /// Codec for UTF-16 class FXAPI FXUTF16Codec : public FXTextCodec { FXDECLARE(FXUTF16Codec) public: FXUTF16Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint mb2utflen(const FXchar* src,FXint nsrc) const; virtual FXint mb2utf(FXchar* dst,FXint ndst,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint utf2mblen(const FXchar* src,FXint nsrc) const; virtual FXint utf2mb(FXchar* dst,FXint ndst,const FXchar* src,FXint nsrc) const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual FXint mibEnum() const; virtual const FXchar* const* aliases() const; virtual ~FXUTF16Codec(){} }; } #endif fox1.6-1.6.57/include/FXUTF32Codec.h000066400000000000000000000071511326741342000164340ustar00rootroot00000000000000/******************************************************************************** * * * U T F - 3 2 T e x t C o d e c * * * ********************************************************************************* * Copyright (C) 2002,2006 by L.Johnson & J.van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXUTF32Codec.h,v 1.10 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXUTF32CODEC_H #define FXUTF32CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// Codec for UTF-32BE class FXAPI FXUTF32BECodec : public FXTextCodec { FXDECLARE(FXUTF32BECodec) public: FXUTF32BECodec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual FXint mibEnum() const; virtual const FXchar* const* aliases() const; virtual ~FXUTF32BECodec(){} }; /// Codec for UTF-32LE class FXAPI FXUTF32LECodec : public FXTextCodec { FXDECLARE(FXUTF32LECodec) public: FXUTF32LECodec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual FXint mibEnum() const; virtual const FXchar* const* aliases() const; virtual ~FXUTF32LECodec(){} }; /// Codec for UTF-32 class FXAPI FXUTF32Codec : public FXTextCodec { FXDECLARE(FXUTF32Codec) public: FXUTF32Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint mb2utflen(const FXchar* src,FXint nsrc) const; virtual FXint mb2utf(FXchar* dst,FXint ndst,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual FXint utf2mblen(const FXchar* src,FXint nsrc) const; virtual FXint utf2mb(FXchar* dst,FXint ndst,const FXchar* src,FXint nsrc) const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual FXint mibEnum() const; virtual const FXchar* const* aliases() const; virtual ~FXUTF32Codec(){} }; } #endif fox1.6-1.6.57/include/FXUTF8Codec.h000066400000000000000000000046041326741342000163570ustar00rootroot00000000000000/******************************************************************************** * * * U T F - 8 T e x t C o d e c * * * ********************************************************************************* * Copyright (C) 2002,2006 by L.Johnson & J.van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXUTF8Codec.h,v 1.13 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXUTF8CODEC_H #define FXUTF8CODEC_H #ifndef FXTEXTCODEC_H #include "FXTextCodec.h" #endif namespace FX { /// Codec for UTF-8 class FXAPI FXUTF8Codec : public FXTextCodec { public: FXUTF8Codec(){} virtual FXint mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const; virtual FXint wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const; virtual const FXchar* name() const; virtual const FXchar* mimeName() const; virtual FXint mibEnum() const; virtual const FXchar* const* aliases() const; virtual ~FXUTF8Codec(){} }; } #endif fox1.6-1.6.57/include/FXUndoList.h000066400000000000000000000237141326741342000164370ustar00rootroot00000000000000/******************************************************************************** * * * U n d o / R e d o - a b l e C o m m a n d * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXUndoList.h,v 1.38 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXUNDOLIST_H #define FXUNDOLIST_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { class FXUndoList; class FXCommandGroup; /** * Base class for undoable commands. Each undo records all the * information necessary to undo as well as redo a given operation. * Since commands are derived from FXObject, subclassed commands can * both send and receive messages (like ID_GETINTVALUE, for example). */ class FXAPI FXCommand : public FXObject { FXDECLARE_ABSTRACT(FXCommand) friend class FXUndoList; friend class FXCommandGroup; private: FXCommand *next; private: FXCommand(const FXCommand&); FXCommand &operator=(const FXCommand&); protected: FXCommand():next(NULL){} public: /** * Undo this command; this should save the * information for a subsequent redo. */ virtual void undo() = 0; /** * Redo this command; this should save the * information for a subsequent undo. */ virtual void redo() = 0; /** * Return the size of the information in the undo record. * The undo list may be trimmed to limit memory usage to * a certain limit. The value returned should include * the size of the command record itself as well as any * data linked from it. */ virtual FXuint size() const; /** * Name of the undo command to be shown on a button; * for example, "Undo Delete". */ virtual FXString undoName() const; /** * Name of the redo command to be shown on a button; * for example, "Redo Delete". */ virtual FXString redoName() const; /** * Return TRUE if this command can be merged with previous undo * commands. This is useful to combine e.g. multiple consecutive * single-character text changes into a single block change. * The default implementation returns FALSE. */ virtual bool canMerge() const; /** * Called by the undo system to try and merge the new incoming command * with this command; should return TRUE if merging was possible. * The default implementation returns FALSE. */ virtual bool mergeWith(FXCommand* command); /// Delete undo command virtual ~FXCommand(){} }; /** * Group of undoable commands. A group may comprise multiple * individual actions which together undo (or redo) a larger * operation. Even larger operations may be built by nesting * multiple undo groups. */ class FXAPI FXCommandGroup : public FXCommand { FXDECLARE(FXCommandGroup) friend class FXUndoList; private: FXCommand *undolist; FXCommand *redolist; FXCommandGroup *group; private: FXCommandGroup(const FXCommandGroup&); FXCommandGroup &operator=(const FXCommandGroup&); public: /// Construct initially empty undo command group FXCommandGroup():undolist(NULL),redolist(NULL),group(NULL){} /// Return TRUE if empty bool empty(){ return !undolist; } /// Undo whole command group virtual void undo(); /// Redo whole command group virtual void redo(); /// Return the size of the command group virtual FXuint size() const; /// Delete undo command and sub-commands virtual ~FXCommandGroup(); }; /** * The Undo List class manages a list of undoable commands. */ class FXAPI FXUndoList : public FXCommandGroup { FXDECLARE(FXUndoList) private: FXint undocount; // Number of undo records FXint redocount; // Number of redo records FXint marker; // Marker value FXuint space; // Space taken up by all the undo records bool working; // Currently busy with undo or redo private: FXUndoList(const FXUndoList&); FXUndoList &operator=(const FXUndoList&); public: long onCmdUndo(FXObject*,FXSelector,void*); long onUpdUndo(FXObject*,FXSelector,void*); long onCmdRedo(FXObject*,FXSelector,void*); long onUpdRedo(FXObject*,FXSelector,void*); long onCmdClear(FXObject*,FXSelector,void*); long onUpdClear(FXObject*,FXSelector,void*); long onCmdRevert(FXObject*,FXSelector,void*); long onUpdRevert(FXObject*,FXSelector,void*); long onCmdUndoAll(FXObject*,FXSelector,void*); long onCmdRedoAll(FXObject*,FXSelector,void*); long onUpdUndoCount(FXObject*,FXSelector,void*); long onUpdRedoCount(FXObject*,FXSelector,void*); public: enum{ ID_CLEAR=FXWindow::ID_LAST, ID_REVERT, ID_UNDO, ID_REDO, ID_UNDO_ALL, ID_REDO_ALL, ID_UNDO_COUNT, ID_REDO_COUNT, ID_LAST }; public: /** * Make new empty undo list, initially unmarked. */ FXUndoList(); /** * Cut the redo list. * This is automatically invoked when a new undo command is added. */ void cut(); /** * Add new command, executing it if desired. The new command will be merged * with the previous command if merge is TRUE and we're not at a marked position * and the commands are mergeable. Otherwise the new command will be appended * after the last undo command in the currently active undo group. * If the new command is successfully merged, it will be deleted. Furthermore, * all redo commands will be deleted since it is no longer possible to redo * from this point. */ void add(FXCommand* command,bool doit=false,bool merge=true); /** * Begin undo command sub-group. This begins a new group of commands that * are treated as a single command. Must eventually be followed by a * matching end() after recording the sub-commands. The new sub-group * will be appended to its parent group's undo list when end() is called. */ void begin(FXCommandGroup *command); /** * End undo command sub-group. If the sub-group is still empty, it will * be deleted; otherwise, the sub-group will be added as a new command * into parent group. * A matching begin() must have been called previously. */ void end(); /** * Abort the current command sub-group being compiled. All commands * already added to the sub-groups undo list will be discarded. * Intermediate command groups will be left intact. */ void abort(); /** * Undo last command. This will move the command to the redo list. */ virtual void undo(); /** * Redo next command. This will move the command back to the undo list. */ virtual void redo(); /// Undo all commands void undoAll(); /// Redo all commands void redoAll(); /// Revert to marked void revert(); /// Can we undo more commands bool canUndo() const; /// Can we redo more commands bool canRedo() const; /// Can revert to marked bool canRevert() const; /** * Return TRUE if currently inside undo or redo operation; this * is useful to avoid generating another undo command while inside * an undo operation. */ bool busy() const { return working; } /// Current top level undo command FXCommand* current() const { return undolist; } /** * Return name of the first undo command available; if no * undo command available this will return the empty string. */ virtual FXString undoName() const; /** * Return name of the first redo command available; if no * Redo command available this will return the empty string. */ virtual FXString redoName() const; /// Number of undo records FXint undoCount() const { return undocount; } /// Number of redo records FXint redoCount() const { return redocount; } /// Size of undo information virtual FXuint size() const; /** * Clear list, and unmark all states. * All undo and redo information will be destroyed. */ void clear(); /** * Trim undo list down to at most nc commands. * Call this periodically to prevent the undo-list from growing * beyond a certain number of records. */ void trimCount(FXint nc); /** * Trim undo list down to at most size sz. * Call this periodically to prevent the undo-list from growing * beyond a certain amount of memory. */ void trimSize(FXuint sz); /** * Mark the current state of the undo list, which is initially unmarked. * There can be only one active mark at any time. Call mark() at any * time when you know the document to be "clean"; for example when you * save the document to disk. */ void mark(); /** * Unmark all states in the undo list. */ void unmark(); /** * Check if the current state was marked, if the application has returned * to the previously marked state. */ bool marked() const; }; } #endif fox1.6-1.6.57/include/FXVec2d.h000066400000000000000000000172231326741342000156370ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n 2 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec2d.h,v 1.21 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXVEC2D_H #define FXVEC2D_H namespace FX { class FXMat3d; /// Double-precision 2-element vector class FXAPI FXVec2d { public: FXdouble x; FXdouble y; public: /// Default constructor FXVec2d(){} /// Initialize from another vector FXVec2d(const FXVec2d& v){x=v.x;y=v.y;} /// Initialize from array of floats FXVec2d(const FXdouble v[]){x=v[0];y=v[1];} /// Initialize from components FXVec2d(FXdouble xx,FXdouble yy){x=xx;y=yy;} /// Return a non-const reference to the ith element FXdouble& operator[](FXint i){return (&x)[i];} /// Return a const reference to the ith element const FXdouble& operator[](FXint i) const {return (&x)[i];} /// Assignment FXVec2d& operator=(const FXVec2d& v){x=v.x;y=v.y;return *this;} /// Assignment from array of floats FXVec2d& operator=(const FXdouble v[]){x=v[0];y=v[1];return *this;} /// Set value from another vector FXVec2d& set(const FXVec2d& v){x=v.x;y=v.y;return *this;} /// Set value from array of floats FXVec2d& set(const FXdouble v[]){x=v[0];y=v[1];return *this;} /// Set value from components FXVec2d& set(FXdouble xx,FXdouble yy){x=xx;y=yy;return *this;} /// Assigning operators FXVec2d& operator*=(FXdouble n){x*=n;y*=n;return *this;} FXVec2d& operator/=(FXdouble n){x/=n;y/=n;return *this;} FXVec2d& operator+=(const FXVec2d& v){x+=v.x;y+=v.y;return *this;} FXVec2d& operator-=(const FXVec2d& v){x-=v.x;y-=v.y;return *this;} /// Conversions operator FXdouble*(){return &x;} operator const FXdouble*() const {return &x;} /// Unary FXVec2d operator+() const { return *this; } FXVec2d operator-() const { return FXVec2d(-x,-y); } /// Vector and vector FXVec2d operator+(const FXVec2d& v) const { return FXVec2d(x+v.x,y+v.y); } FXVec2d operator-(const FXVec2d& v) const { return FXVec2d(x-v.x,y-v.y); } /// Vector and matrix FXVec2d operator*(const FXMat3d& m) const; /// Scaling friend inline FXVec2d operator*(const FXVec2d& a,FXdouble n); friend inline FXVec2d operator*(FXdouble n,const FXVec2d& a); friend inline FXVec2d operator/(const FXVec2d& a,FXdouble n); friend inline FXVec2d operator/(FXdouble n,const FXVec2d& a); /// Dot product FXdouble operator*(const FXVec2d& v) const { return x*v.x+y*v.y; } /// Test if zero bool operator!() const { return x==0.0 && y==0.0;} /// Equality tests bool operator==(const FXVec2d& v) const { return x==v.x && y==v.y; } bool operator!=(const FXVec2d& v) const { return x!=v.x || y!=v.y; } friend inline bool operator==(const FXVec2d& a,FXdouble n); friend inline bool operator!=(const FXVec2d& a,FXdouble n); friend inline bool operator==(FXdouble n,const FXVec2d& a); friend inline bool operator!=(FXdouble n,const FXVec2d& a); /// Inequality tests bool operator<(const FXVec2d& v) const { return x(const FXVec2d& v) const { return x>v.x && y>v.y; } bool operator>=(const FXVec2d& v) const { return x>=v.x && y>=v.y; } friend inline bool operator<(const FXVec2d& a,FXdouble n); friend inline bool operator<=(const FXVec2d& a,FXdouble n); friend inline bool operator>(const FXVec2d& a,FXdouble n); friend inline bool operator>=(const FXVec2d& a,FXdouble n); friend inline bool operator<(FXdouble n,const FXVec2d& a); friend inline bool operator<=(FXdouble n,const FXVec2d& a); friend inline bool operator>(FXdouble n,const FXVec2d& a); friend inline bool operator>=(FXdouble n,const FXVec2d& a); /// Length and square of length FXdouble length2() const { return x*x+y*y; } FXdouble length() const { return sqrt(length2()); } /// Clamp values of vector between limits FXVec2d& clamp(FXdouble lo,FXdouble hi){x=FXCLAMP(lo,x,hi);y=FXCLAMP(lo,y,hi);return *this;} /// Lowest or highest components friend inline FXVec2d lo(const FXVec2d& a,const FXVec2d& b); friend inline FXVec2d hi(const FXVec2d& a,const FXVec2d& b); /// Normalize vector friend FXAPI FXVec2d normalize(const FXVec2d& v); /// Save vector to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXVec2d& v); /// Load vector from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXVec2d& v); }; inline FXVec2d operator*(const FXVec2d& a,FXdouble n){return FXVec2d(a.x*n,a.y*n);} inline FXVec2d operator*(FXdouble n,const FXVec2d& a){return FXVec2d(n*a.x,n*a.y);} inline FXVec2d operator/(const FXVec2d& a,FXdouble n){return FXVec2d(a.x/n,a.y/n);} inline FXVec2d operator/(FXdouble n,const FXVec2d& a){return FXVec2d(n/a.x,n/a.y);} inline bool operator==(const FXVec2d& a,FXdouble n){return a.x==n && a.y==n;} inline bool operator!=(const FXVec2d& a,FXdouble n){return a.x!=n || a.y!=n;} inline bool operator==(FXdouble n,const FXVec2d& a){return n==a.x && n==a.y;} inline bool operator!=(FXdouble n,const FXVec2d& a){return n!=a.x || n!=a.y;} inline bool operator<(const FXVec2d& a,FXdouble n){return a.x(const FXVec2d& a,FXdouble n){return a.x>n && a.y>n;} inline bool operator>=(const FXVec2d& a,FXdouble n){return a.x>=n && a.y>=n;} inline bool operator<(FXdouble n,const FXVec2d& a){return n(FXdouble n,const FXVec2d& a){return n>a.x && n>a.y;} inline bool operator>=(FXdouble n,const FXVec2d& a){return n>=a.x && n>=a.y;} inline FXVec2d lo(const FXVec2d& a,const FXVec2d& b){return FXVec2d(FXMIN(a.x,b.x),FXMIN(a.y,b.y));} inline FXVec2d hi(const FXVec2d& a,const FXVec2d& b){return FXVec2d(FXMAX(a.x,b.x),FXMAX(a.y,b.y));} extern FXAPI FXVec2d normalize(const FXVec2d& v); extern FXAPI FXStream& operator<<(FXStream& store,const FXVec2d& v); extern FXAPI FXStream& operator>>(FXStream& store,FXVec2d& v); } #endif fox1.6-1.6.57/include/FXVec2f.h000066400000000000000000000171431326741342000156420ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n 2 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec2f.h,v 1.21 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXVEC2F_H #define FXVEC2F_H namespace FX { class FXMat3f; /// Single-precision 2-element vector class FXAPI FXVec2f { public: FXfloat x; FXfloat y; public: /// Default constructor FXVec2f(){} /// Initialize from another vector FXVec2f(const FXVec2f& v){x=v.x;y=v.y;} /// Initialize from array of floats FXVec2f(const FXfloat v[]){x=v[0];y=v[1];} /// Initialize from components FXVec2f(FXfloat xx,FXfloat yy){x=xx;y=yy;} /// Return a non-const reference to the ith element FXfloat& operator[](FXint i){return (&x)[i];} /// Return a const reference to the ith element const FXfloat& operator[](FXint i) const {return (&x)[i];} /// Assignment FXVec2f& operator=(const FXVec2f& v){x=v.x;y=v.y;return *this;} /// Assignment from array of floats FXVec2f& operator=(const FXfloat v[]){x=v[0];y=v[1];return *this;} /// Set value from another vector FXVec2f& set(const FXVec2f& v){x=v.x;y=v.y;return *this;} /// Set value from array of floats FXVec2f& set(const FXfloat v[]){x=v[0];y=v[1];return *this;} /// Set value from components FXVec2f& set(FXfloat xx,FXfloat yy){x=xx;y=yy;return *this;} /// Assigning operators FXVec2f& operator*=(FXfloat n){x*=n;y*=n;return *this;} FXVec2f& operator/=(FXfloat n){x/=n;y/=n;return *this;} FXVec2f& operator+=(const FXVec2f& v){x+=v.x;y+=v.y;return *this;} FXVec2f& operator-=(const FXVec2f& v){x-=v.x;y-=v.y;return *this;} /// Conversions operator FXfloat*(){return &x;} operator const FXfloat*() const {return &x;} /// Unary FXVec2f operator+() const { return *this; } FXVec2f operator-() const { return FXVec2f(-x,-y); } /// Vector and vector FXVec2f operator+(const FXVec2f& v) const { return FXVec2f(x+v.x,y+v.y); } FXVec2f operator-(const FXVec2f& v) const { return FXVec2f(x-v.x,y-v.y); } /// Vector and matrix FXVec2f operator*(const FXMat3f& m) const; /// Scaling friend inline FXVec2f operator*(const FXVec2f& a,FXfloat n); friend inline FXVec2f operator*(FXfloat n,const FXVec2f& a); friend inline FXVec2f operator/(const FXVec2f& a,FXfloat n); friend inline FXVec2f operator/(FXfloat n,const FXVec2f& a); /// Dot product FXfloat operator*(const FXVec2f& v) const { return x*v.x+y*v.y; } /// Test if zero bool operator!() const { return x==0.0f && y==0.0f; } /// Equality tests bool operator==(const FXVec2f& v) const { return x==v.x && y==v.y; } bool operator!=(const FXVec2f& v) const { return x!=v.x || y!=v.y; } friend inline bool operator==(const FXVec2f& a,FXfloat n); friend inline bool operator!=(const FXVec2f& a,FXfloat n); friend inline bool operator==(FXfloat n,const FXVec2f& a); friend inline bool operator!=(FXfloat n,const FXVec2f& a); /// Inequality tests bool operator<(const FXVec2f& v) const { return x(const FXVec2f& v) const { return x>v.x && y>v.y; } bool operator>=(const FXVec2f& v) const { return x>=v.x && y>=v.y; } friend inline bool operator<(const FXVec2f& a,FXfloat n); friend inline bool operator<=(const FXVec2f& a,FXfloat n); friend inline bool operator>(const FXVec2f& a,FXfloat n); friend inline bool operator>=(const FXVec2f& a,FXfloat n); friend inline bool operator<(FXfloat n,const FXVec2f& a); friend inline bool operator<=(FXfloat n,const FXVec2f& a); friend inline bool operator>(FXfloat n,const FXVec2f& a); friend inline bool operator>=(FXfloat n,const FXVec2f& a); /// Length and square of length FXfloat length2() const { return x*x+y*y; } FXfloat length() const { return sqrtf(length2()); } /// Clamp values of vector between limits FXVec2f& clamp(FXfloat lo,FXfloat hi){x=FXCLAMP(lo,x,hi);y=FXCLAMP(lo,y,hi);return *this;} /// Lowest or highest components friend inline FXVec2f lo(const FXVec2f& a,const FXVec2f& b); friend inline FXVec2f hi(const FXVec2f& a,const FXVec2f& b); /// Normalize vector friend FXAPI FXVec2f normalize(const FXVec2f& v); /// Save vector to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXVec2f& v); /// Load vector from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXVec2f& v); }; inline FXVec2f operator*(const FXVec2f& a,FXfloat n){return FXVec2f(a.x*n,a.y*n);} inline FXVec2f operator*(FXfloat n,const FXVec2f& a){return FXVec2f(n*a.x,n*a.y);} inline FXVec2f operator/(const FXVec2f& a,FXfloat n){return FXVec2f(a.x/n,a.y/n);} inline FXVec2f operator/(FXfloat n,const FXVec2f& a){return FXVec2f(n/a.x,n/a.y);} inline bool operator==(const FXVec2f& a,FXfloat n){return a.x==n && a.y==n;} inline bool operator!=(const FXVec2f& a,FXfloat n){return a.x!=n || a.y!=n;} inline bool operator==(FXfloat n,const FXVec2f& a){return n==a.x && n==a.y;} inline bool operator!=(FXfloat n,const FXVec2f& a){return n!=a.x || n!=a.y;} inline bool operator<(const FXVec2f& a,FXfloat n){return a.x(const FXVec2f& a,FXfloat n){return a.x>n && a.y>n;} inline bool operator>=(const FXVec2f& a,FXfloat n){return a.x>=n && a.y>=n;} inline bool operator<(FXfloat n,const FXVec2f& a){return n(FXfloat n,const FXVec2f& a){return n>a.x && n>a.y;} inline bool operator>=(FXfloat n,const FXVec2f& a){return n>=a.x && n>=a.y;} inline FXVec2f lo(const FXVec2f& a,const FXVec2f& b){return FXVec2f(FXMIN(a.x,b.x),FXMIN(a.y,b.y));} inline FXVec2f hi(const FXVec2f& a,const FXVec2f& b){return FXVec2f(FXMAX(a.x,b.x),FXMAX(a.y,b.y));} extern FXAPI FXVec2f normalize(const FXVec2f& v); extern FXAPI FXStream& operator<<(FXStream& store,const FXVec2f& v); extern FXAPI FXStream& operator>>(FXStream& store,FXVec2f& v); } #endif fox1.6-1.6.57/include/FXVec3d.h000066400000000000000000000217501326741342000156400ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n 3 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec3d.h,v 1.22 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXVEC3D_H #define FXVEC3D_H namespace FX { class FXMat3d; class FXMat4d; /// Double-precision 3-element vector class FXAPI FXVec3d { public: FXdouble x; FXdouble y; FXdouble z; public: /// Default constructor FXVec3d(){} /// Initialize from another vector FXVec3d(const FXVec3d& v){x=v.x;y=v.y;z=v.z;} /// Initialize from array of doubles FXVec3d(const FXdouble v[]){x=v[0];y=v[1];z=v[2];} /// Initialize with components FXVec3d(FXdouble xx,FXdouble yy,FXdouble zz=1.0){x=xx;y=yy;z=zz;} /// Initialize with color FXVec3d(FXColor color); /// Return a non-const reference to the ith element FXdouble& operator[](FXint i){return (&x)[i];} /// Return a const reference to the ith element const FXdouble& operator[](FXint i) const {return (&x)[i];} /// Assign color FXVec3d& operator=(FXColor color); /// Assignment FXVec3d& operator=(const FXVec3d& v){x=v.x;y=v.y;z=v.z;return *this;} /// Assignment from array of doubles FXVec3d& operator=(const FXdouble v[]){x=v[0];y=v[1];z=v[2];return *this;} /// Set value from another vector FXVec3d& set(const FXVec3d& v){x=v.x;y=v.y;z=v.z;return *this;} /// Set value from array of floats FXVec3d& set(const FXdouble v[]){x=v[0];y=v[1];z=v[2];return *this;} /// Set value from components FXVec3d& set(FXdouble xx,FXdouble yy,FXdouble zz){x=xx;y=yy;z=zz;return *this;} /// Assigning operators FXVec3d& operator*=(FXdouble n){x*=n;y*=n;z*=n;return *this;} FXVec3d& operator/=(FXdouble n){x/=n;y/=n;z/=n;return *this;} FXVec3d& operator+=(const FXVec3d& v){x+=v.x;y+=v.y;z+=v.z;return *this;} FXVec3d& operator-=(const FXVec3d& v){x-=v.x;y-=v.y;z-=v.z;return *this;} /// Conversions operator FXdouble*(){return &x;} operator const FXdouble*() const {return &x;} operator FXVec2d&(){return *reinterpret_cast(this);} operator const FXVec2d&() const {return *reinterpret_cast(this);} /// Convert to color operator FXColor() const; /// Unary FXVec3d operator+() const { return *this; } FXVec3d operator-() const { return FXVec3d(-x,-y,-z); } /// Vector and vector FXVec3d operator+(const FXVec3d& v) const { return FXVec3d(x+v.x,y+v.y,z+v.z); } FXVec3d operator-(const FXVec3d& v) const { return FXVec3d(x-v.x,y-v.y,z-v.z); } /// Vector and matrix FXVec3d operator*(const FXMat3d& m) const; FXVec3d operator*(const FXMat4d& m) const; /// Scaling friend inline FXVec3d operator*(const FXVec3d& a,FXdouble n); friend inline FXVec3d operator*(FXdouble n,const FXVec3d& a); friend inline FXVec3d operator/(const FXVec3d& a,FXdouble n); friend inline FXVec3d operator/(FXdouble n,const FXVec3d& a); /// Dot product FXdouble operator*(const FXVec3d& v) const { return x*v.x+y*v.y+z*v.z; } /// Cross product FXVec3d operator^(const FXVec3d& v) const { return FXVec3d(y*v.z-z*v.y, z*v.x-x*v.z, x*v.y-y*v.x); } /// Test if zero bool operator!() const { return x==0.0 && y==0.0 && z==0.0; } /// Equality tests bool operator==(const FXVec3d& v) const { return x==v.x && y==v.y && z==v.z; } bool operator!=(const FXVec3d& v) const { return x!=v.x || y!=v.y || z!=v.z; } friend inline bool operator==(const FXVec3d& a,FXdouble n); friend inline bool operator!=(const FXVec3d& a,FXdouble n); friend inline bool operator==(FXdouble n,const FXVec3d& a); friend inline bool operator!=(FXdouble n,const FXVec3d& a); /// Inequality tests bool operator<(const FXVec3d& v) const { return x(const FXVec3d& v) const { return x>v.x && y>v.y && z>v.z; } bool operator>=(const FXVec3d& v) const { return x>=v.x && y>=v.y && z>=v.z; } friend inline bool operator<(const FXVec3d& a,FXdouble n); friend inline bool operator<=(const FXVec3d& a,FXdouble n); friend inline bool operator>(const FXVec3d& a,FXdouble n); friend inline bool operator>=(const FXVec3d& a,FXdouble n); friend inline bool operator<(FXdouble n,const FXVec3d& a); friend inline bool operator<=(FXdouble n,const FXVec3d& a); friend inline bool operator>(FXdouble n,const FXVec3d& a); friend inline bool operator>=(FXdouble n,const FXVec3d& a); /// Length and square of length FXdouble length2() const { return x*x+y*y+z*z; } FXdouble length() const { return sqrt(length2()); } /// Clamp values of vector between limits FXVec3d& clamp(FXdouble lo,FXdouble hi){x=FXCLAMP(lo,x,hi);y=FXCLAMP(lo,y,hi);z=FXCLAMP(lo,z,hi);return *this;} /// Lowest or highest components friend inline FXVec3d lo(const FXVec3d& a,const FXVec3d& b); friend inline FXVec3d hi(const FXVec3d& a,const FXVec3d& b); /// Compute normal from three points a,b,c friend FXAPI FXVec3d normal(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c); /// Compute approximate normal from four points a,b,c,d friend FXAPI FXVec3d normal(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c,const FXVec3d& d); /// Normalize vector friend FXAPI FXVec3d normalize(const FXVec3d& v); /// Save vector to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXVec3d& v); /// Load vector from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXVec3d& v); }; inline FXVec3d operator*(const FXVec3d& a,FXdouble n){return FXVec3d(a.x*n,a.y*n,a.z*n);} inline FXVec3d operator*(FXdouble n,const FXVec3d& a){return FXVec3d(n*a.x,n*a.y,n*a.z);} inline FXVec3d operator/(const FXVec3d& a,FXdouble n){return FXVec3d(a.x/n,a.y/n,a.z/n);} inline FXVec3d operator/(FXdouble n,const FXVec3d& a){return FXVec3d(n/a.x,n/a.y,n/a.z);} inline bool operator==(const FXVec3d& a,FXdouble n){return a.x==n && a.y==n && a.z==n;} inline bool operator!=(const FXVec3d& a,FXdouble n){return a.x!=n || a.y!=n || a.z!=n;} inline bool operator==(FXdouble n,const FXVec3d& a){return n==a.x && n==a.y && n==a.z;} inline bool operator!=(FXdouble n,const FXVec3d& a){return n!=a.x || n!=a.y || n!=a.z;} inline bool operator<(const FXVec3d& a,FXdouble n){return a.x(const FXVec3d& a,FXdouble n){return a.x>n && a.y>n && a.z>n;} inline bool operator>=(const FXVec3d& a,FXdouble n){return a.x>=n && a.y>=n && a.z>=n;} inline bool operator<(FXdouble n,const FXVec3d& a){return n(FXdouble n,const FXVec3d& a){return n>a.x && n>a.y && n>a.z;} inline bool operator>=(FXdouble n,const FXVec3d& a){return n>=a.x && n>=a.y && n>=a.z;} inline FXVec3d lo(const FXVec3d& a,const FXVec3d& b){return FXVec3d(FXMIN(a.x,b.x),FXMIN(a.y,b.y),FXMIN(a.z,b.z));} inline FXVec3d hi(const FXVec3d& a,const FXVec3d& b){return FXVec3d(FXMAX(a.x,b.x),FXMAX(a.y,b.y),FXMAX(a.z,b.z));} extern FXAPI FXVec3d normal(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c); extern FXAPI FXVec3d normal(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c,const FXVec3d& d); extern FXAPI FXVec3d normalize(const FXVec3d& v); extern FXAPI FXStream& operator<<(FXStream& store,const FXVec3d& v); extern FXAPI FXStream& operator>>(FXStream& store,FXVec3d& v); } #endif fox1.6-1.6.57/include/FXVec3f.h000066400000000000000000000216641326741342000156460ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n 3 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec3f.h,v 1.26 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXVEC3F_H #define FXVEC3F_H namespace FX { class FXMat3f; class FXMat4f; /// Single-precision 3-element vector class FXAPI FXVec3f { public: FXfloat x; FXfloat y; FXfloat z; public: /// Default constructor FXVec3f(){} /// Initialize from another vector FXVec3f(const FXVec3f& v){x=v.x;y=v.y;z=v.z;} /// Initialize from array of floats FXVec3f(const FXfloat v[]){x=v[0];y=v[1];z=v[2];} /// Initialize from components FXVec3f(FXfloat xx,FXfloat yy,FXfloat zz=1.0f){x=xx;y=yy;z=zz;} /// Initialize with color FXVec3f(FXColor color); /// Return a non-const reference to the ith element FXfloat& operator[](FXint i){return (&x)[i];} /// Return a const reference to the ith element const FXfloat& operator[](FXint i) const {return (&x)[i];} /// Assign color FXVec3f& operator=(FXColor color); /// Assignment FXVec3f& operator=(const FXVec3f& v){x=v.x;y=v.y;z=v.z;return *this;} /// Assignment from array of floats FXVec3f& operator=(const FXfloat v[]){x=v[0];y=v[1];z=v[2];return *this;} /// Set value from another vector FXVec3f& set(const FXVec3f& v){x=v.x;y=v.y;z=v.z;return *this;} /// Set value from array of floats FXVec3f& set(const FXfloat v[]){x=v[0];y=v[1];z=v[2];return *this;} /// Set value from components FXVec3f& set(FXfloat xx,FXfloat yy,FXfloat zz){x=xx;y=yy;z=zz;return *this;} /// Assigning operators FXVec3f& operator*=(FXfloat n){x*=n;y*=n;z*=n;return *this;} FXVec3f& operator/=(FXfloat n){x/=n;y/=n;z/=n;return *this;} FXVec3f& operator+=(const FXVec3f& v){x+=v.x;y+=v.y;z+=v.z;return *this;} FXVec3f& operator-=(const FXVec3f& v){x-=v.x;y-=v.y;z-=v.z;return *this;} /// Conversions operator FXfloat*(){return &x;} operator const FXfloat*() const {return &x;} operator FXVec2f&(){return *reinterpret_cast(this);} operator const FXVec2f&() const {return *reinterpret_cast(this);} /// Convert to color operator FXColor() const; /// Unary FXVec3f operator+() const { return *this; } FXVec3f operator-() const { return FXVec3f(-x,-y,-z); } /// Vector and vector FXVec3f operator+(const FXVec3f& v) const { return FXVec3f(x+v.x,y+v.y,z+v.z); } FXVec3f operator-(const FXVec3f& v) const { return FXVec3f(x-v.x,y-v.y,z-v.z); } /// Vector and matrix FXVec3f operator*(const FXMat3f& m) const; FXVec3f operator*(const FXMat4f& m) const; /// Scaling friend inline FXVec3f operator*(const FXVec3f& a,FXfloat n); friend inline FXVec3f operator*(FXfloat n,const FXVec3f& a); friend inline FXVec3f operator/(const FXVec3f& a,FXfloat n); friend inline FXVec3f operator/(FXfloat n,const FXVec3f& a); /// Dot product FXfloat operator*(const FXVec3f& v) const { return x*v.x+y*v.y+z*v.z; } /// Cross product FXVec3f operator^(const FXVec3f& v) const { return FXVec3f(y*v.z-z*v.y, z*v.x-x*v.z, x*v.y-y*v.x); } /// Test if zero bool operator!() const { return x==0.0f && y==0.0f && z==0.0f; } /// Equality tests bool operator==(const FXVec3f& v) const { return x==v.x && y==v.y && z==v.z; } bool operator!=(const FXVec3f& v) const { return x!=v.x || y!=v.y || z!=v.z; } friend inline bool operator==(const FXVec3f& a,FXfloat n); friend inline bool operator!=(const FXVec3f& a,FXfloat n); friend inline bool operator==(FXfloat n,const FXVec3f& a); friend inline bool operator!=(FXfloat n,const FXVec3f& a); /// Inequality tests bool operator<(const FXVec3f& v) const { return x(const FXVec3f& v) const { return x>v.x && y>v.y && z>v.z; } bool operator>=(const FXVec3f& v) const { return x>=v.x && y>=v.y && z>=v.z; } friend inline bool operator<(const FXVec3f& a,FXfloat n); friend inline bool operator<=(const FXVec3f& a,FXfloat n); friend inline bool operator>(const FXVec3f& a,FXfloat n); friend inline bool operator>=(const FXVec3f& a,FXfloat n); friend inline bool operator<(FXfloat n,const FXVec3f& a); friend inline bool operator<=(FXfloat n,const FXVec3f& a); friend inline bool operator>(FXfloat n,const FXVec3f& a); friend inline bool operator>=(FXfloat n,const FXVec3f& a); /// Length and square of length FXfloat length2() const { return x*x+y*y+z*z; } FXfloat length() const { return sqrtf(length2()); } /// Clamp values of vector between limits FXVec3f& clamp(FXfloat lo,FXfloat hi){x=FXCLAMP(lo,x,hi);y=FXCLAMP(lo,y,hi);z=FXCLAMP(lo,z,hi);return *this;} /// Lowest or highest components friend inline FXVec3f lo(const FXVec3f& a,const FXVec3f& b); friend inline FXVec3f hi(const FXVec3f& a,const FXVec3f& b); /// Compute normal from three points a,b,c friend FXAPI FXVec3f normal(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c); /// Compute approximate normal from four points a,b,c,d friend FXAPI FXVec3f normal(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c,const FXVec3f& d); /// Normalize vector friend FXAPI FXVec3f normalize(const FXVec3f& v); /// Save vector to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXVec3f& v); /// Load vector from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXVec3f& v); }; inline FXVec3f operator*(const FXVec3f& a,FXfloat n){return FXVec3f(a.x*n,a.y*n,a.z*n);} inline FXVec3f operator*(FXfloat n,const FXVec3f& a){return FXVec3f(n*a.x,n*a.y,n*a.z);} inline FXVec3f operator/(const FXVec3f& a,FXfloat n){return FXVec3f(a.x/n,a.y/n,a.z/n);} inline FXVec3f operator/(FXfloat n,const FXVec3f& a){return FXVec3f(n/a.x,n/a.y,n/a.z);} inline bool operator==(const FXVec3f& a,FXfloat n){return a.x==n && a.y==n && a.z==n;} inline bool operator!=(const FXVec3f& a,FXfloat n){return a.x!=n || a.y!=n || a.z!=n;} inline bool operator==(FXfloat n,const FXVec3f& a){return n==a.x && n==a.y && n==a.z;} inline bool operator!=(FXfloat n,const FXVec3f& a){return n!=a.x || n!=a.y || n!=a.z;} inline bool operator<(const FXVec3f& a,FXfloat n){return a.x(const FXVec3f& a,FXfloat n){return a.x>n && a.y>n && a.z>n;} inline bool operator>=(const FXVec3f& a,FXfloat n){return a.x>=n && a.y>=n && a.z>=n;} inline bool operator<(FXfloat n,const FXVec3f& a){return n(FXfloat n,const FXVec3f& a){return n>a.x && n>a.y && n>a.z;} inline bool operator>=(FXfloat n,const FXVec3f& a){return n>=a.x && n>=a.y && n>=a.z;} inline FXVec3f lo(const FXVec3f& a,const FXVec3f& b){return FXVec3f(FXMIN(a.x,b.x),FXMIN(a.y,b.y),FXMIN(a.z,b.z));} inline FXVec3f hi(const FXVec3f& a,const FXVec3f& b){return FXVec3f(FXMAX(a.x,b.x),FXMAX(a.y,b.y),FXMAX(a.z,b.z));} extern FXAPI FXVec3f normal(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c); extern FXAPI FXVec3f normal(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c,const FXVec3f& d); extern FXAPI FXVec3f normalize(const FXVec3f& v); extern FXAPI FXStream& operator<<(FXStream& store,const FXVec3f& v); extern FXAPI FXStream& operator>>(FXStream& store,FXVec3f& v); } #endif fox1.6-1.6.57/include/FXVec4d.h000066400000000000000000000232351326741342000156410ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n 4 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec4d.h,v 1.27 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXVEC4D_H #define FXVEC4D_H namespace FX { class FXMat4d; /// Double-precision 4-element vector class FXAPI FXVec4d { public: FXdouble x; FXdouble y; FXdouble z; FXdouble w; public: /// Default constructor FXVec4d(){} /// Initialize from another vector FXVec4d(const FXVec4d& v){x=v.x;y=v.y;z=v.z;w=v.w;} /// Construct with 3-vector and optional scalar FXVec4d(const FXVec3d& v,FXdouble ww=1.0){x=v.x;y=v.y;z=v.z;w=ww;} /// Initialize from array of doubles FXVec4d(const FXdouble v[]){x=v[0];y=v[1];z=v[2];w=v[3];} /// Initialize with components FXVec4d(FXdouble xx,FXdouble yy,FXdouble zz,FXdouble ww=1.0){x=xx;y=yy;z=zz;w=ww;} /// Initialize with color FXVec4d(FXColor color); /// Return a non-const reference to the ith element FXdouble& operator[](FXint i){return (&x)[i];} /// Return a const reference to the ith element const FXdouble& operator[](FXint i) const {return (&x)[i];} /// Assign color FXVec4d& operator=(FXColor color); /// Assignment FXVec4d& operator=(const FXVec3d& v){x=v.x;y=v.y;z=v.z;w=1.0;return *this;} FXVec4d& operator=(const FXVec4d& v){x=v.x;y=v.y;z=v.z;w=v.w;return *this;} /// Assignment from array of doubles FXVec4d& operator=(const FXdouble v[]){x=v[0];y=v[1];z=v[2];w=v[3];return *this;} /// Set value from another vector FXVec4d& set(const FXVec4d& v){x=v.x;y=v.y;z=v.z;w=v.w;return *this;} /// Set value from array of floats FXVec4d& set(const FXdouble v[]){x=v[0];y=v[1];z=v[2];w=v[3];return *this;} /// Set value from components FXVec4d& set(FXdouble xx,FXdouble yy,FXdouble zz,FXdouble ww){x=xx;y=yy;z=zz;w=ww;return *this;} /// Assigning operators FXVec4d& operator*=(FXdouble n){x*=n;y*=n;z*=n;w*=n;return *this;} FXVec4d& operator/=(FXdouble n){x/=n;y/=n;z/=n;w/=n;return *this;} FXVec4d& operator+=(const FXVec4d& v){x+=v.x;y+=v.y;z+=v.z;w+=v.w;return *this;} FXVec4d& operator-=(const FXVec4d& v){x-=v.x;y-=v.y;z-=v.z;w-=v.w;return *this;} /// Conversion operator FXdouble*(){return &x;} operator const FXdouble*() const {return &x;} operator FXVec3d&(){return *reinterpret_cast(this);} operator const FXVec3d&() const {return *reinterpret_cast(this);} /// Convert to color operator FXColor() const; /// Unary FXVec4d operator+() const { return *this; } FXVec4d operator-() const { return FXVec4d(-x,-y,-z,-w); } /// Vector and vector FXVec4d operator+(const FXVec4d& v) const { return FXVec4d(x+v.x,y+v.y,z+v.z,w+v.w); } FXVec4d operator-(const FXVec4d& v) const { return FXVec4d(x-v.x,y-v.y,z-v.z,w-v.w); } /// Vector and matrix FXVec4d operator*(const FXMat4d& m) const; /// Scaling friend inline FXVec4d operator*(const FXVec4d& a,FXdouble n); friend inline FXVec4d operator*(FXdouble n,const FXVec4d& a); friend inline FXVec4d operator/(const FXVec4d& a,FXdouble n); friend inline FXVec4d operator/(FXdouble n,const FXVec4d& a); /// Dot product FXdouble operator*(const FXVec4d& v) const { return x*v.x+y*v.y+z*v.z+w*v.w; } /// Test if zero bool operator!() const {return x==0.0 && y==0.0 && z==0.0 && w==0.0; } /// Equality tests bool operator==(const FXVec4d& v) const { return x==v.x && y==v.y && z==v.z && w==v.w; } bool operator!=(const FXVec4d& v) const { return x!=v.x || y!=v.y || z!=v.z || w!=v.w; } friend inline bool operator==(const FXVec4d& a,FXdouble n); friend inline bool operator!=(const FXVec4d& a,FXdouble n); friend inline bool operator==(FXdouble n,const FXVec4d& a); friend inline bool operator!=(FXdouble n,const FXVec4d& a); /// Inequality tests bool operator<(const FXVec4d& v) const { return x(const FXVec4d& v) const { return x>v.x && y>v.y && z>v.z && w>v.w; } bool operator>=(const FXVec4d& v) const { return x>=v.x && y>=v.y && z>=v.z && w>=v.w; } friend inline bool operator<(const FXVec4d& a,FXdouble n); friend inline bool operator<=(const FXVec4d& a,FXdouble n); friend inline bool operator>(const FXVec4d& a,FXdouble n); friend inline bool operator>=(const FXVec4d& a,FXdouble n); friend inline bool operator<(FXdouble n,const FXVec4d& a); friend inline bool operator<=(FXdouble n,const FXVec4d& a); friend inline bool operator>(FXdouble n,const FXVec4d& a); friend inline bool operator>=(FXdouble n,const FXVec4d& a); /// Length and square of length FXdouble length2() const { return x*x+y*y+z*z+w*w; } FXdouble length() const { return sqrt(length2()); } /// Clamp values of vector between limits FXVec4d& clamp(FXdouble lo,FXdouble hi){x=FXCLAMP(lo,x,hi);y=FXCLAMP(lo,y,hi);z=FXCLAMP(lo,z,hi);w=FXCLAMP(lo,w,hi);return *this;} /// Lowest or highest components friend inline FXVec4d lo(const FXVec4d& a,const FXVec4d& b); friend inline FXVec4d hi(const FXVec4d& a,const FXVec4d& b); /// Compute normalized plane equation ax+by+cz+d=0 friend FXAPI FXVec4d plane(const FXVec4d& vec); friend FXAPI FXVec4d plane(const FXVec3d& vec,FXdouble dist); friend FXAPI FXVec4d plane(const FXVec3d& vec,const FXVec3d& p); friend FXAPI FXVec4d plane(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c); /// Signed distance normalized plane and point FXdouble distance(const FXVec3d& p) const; /// Return true if edge a-b crosses plane bool crosses(const FXVec3d& a,const FXVec3d& b) const; /// Normalize vector friend FXAPI FXVec4d normalize(const FXVec4d& v); /// Save to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXVec4d& v); /// Load from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXVec4d& v); }; inline FXVec4d operator*(const FXVec4d& a,FXdouble n){return FXVec4d(a.x*n,a.y*n,a.z*n,a.w*n);} inline FXVec4d operator*(FXdouble n,const FXVec4d& a){return FXVec4d(n*a.x,n*a.y,n*a.z,n*a.w);} inline FXVec4d operator/(const FXVec4d& a,FXdouble n){return FXVec4d(a.x/n,a.y/n,a.z/n,a.w/n);} inline FXVec4d operator/(FXdouble n,const FXVec4d& a){return FXVec4d(n/a.x,n/a.y,n/a.z,n/a.w);} inline bool operator==(const FXVec4d& a,FXdouble n){return a.x==n && a.y==n && a.z==n && a.w==n;} inline bool operator!=(const FXVec4d& a,FXdouble n){return a.x!=n || a.y!=n || a.z!=n || a.w!=n;} inline bool operator==(FXdouble n,const FXVec4d& a){return n==a.x && n==a.y && n==a.z && n==a.w;} inline bool operator!=(FXdouble n,const FXVec4d& a){return n!=a.x || n!=a.y || n!=a.z || n!=a.w;} inline bool operator<(const FXVec4d& a,FXdouble n){return a.x(const FXVec4d& a,FXdouble n){return a.x>n && a.y>n && a.z>n && a.w>n;} inline bool operator>=(const FXVec4d& a,FXdouble n){return a.x>=n && a.y>=n && a.z>=n && a.w>=n;} inline bool operator<(FXdouble n,const FXVec4d& a){return n(FXdouble n,const FXVec4d& a){return n>a.x && n>a.y && n>a.z && n>a.w;} inline bool operator>=(FXdouble n,const FXVec4d& a){return n>=a.x && n>=a.y && n>=a.z && n>=a.w;} inline FXVec4d lo(const FXVec4d& a,const FXVec4d& b){return FXVec4d(FXMIN(a.x,b.x),FXMIN(a.y,b.y),FXMIN(a.z,b.z),FXMIN(a.w,b.w));} inline FXVec4d hi(const FXVec4d& a,const FXVec4d& b){return FXVec4d(FXMAX(a.x,b.x),FXMAX(a.y,b.y),FXMAX(a.z,b.z),FXMAX(a.w,b.w));} extern FXAPI FXVec4d plane(const FXVec4d& vec); extern FXAPI FXVec4d plane(const FXVec3d& vec,FXdouble dist); extern FXAPI FXVec4d plane(const FXVec3d& vec,const FXVec3d& p); extern FXAPI FXVec4d plane(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c); extern FXAPI FXVec4d normalize(const FXVec4d& v); extern FXAPI FXStream& operator<<(FXStream& store,const FXVec4d& v); extern FXAPI FXStream& operator>>(FXStream& store,FXVec4d& v); } #endif fox1.6-1.6.57/include/FXVec4f.h000066400000000000000000000231411326741342000156370ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n 4 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec4f.h,v 1.32 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXVEC4F_H #define FXVEC4F_H namespace FX { class FXMat4f; /// Single-precision 4-element vector class FXAPI FXVec4f { public: FXfloat x; FXfloat y; FXfloat z; FXfloat w; public: /// Default constructor FXVec4f(){} /// Initialize from another vector FXVec4f(const FXVec4f& v){x=v.x;y=v.y;z=v.z;w=v.w;} /// Construct with 3-vector and optional scalar FXVec4f(const FXVec3f& v,FXfloat ww=1.0f){x=v.x;y=v.y;z=v.z;w=ww;} /// Construct from array of floats FXVec4f(const FXfloat v[]){x=v[0];y=v[1];z=v[2];w=v[3];} /// Construct from components FXVec4f(FXfloat xx,FXfloat yy,FXfloat zz,FXfloat ww=1.0f){x=xx;y=yy;z=zz;w=ww;} /// Construct from color FXVec4f(FXColor color); /// Return a non-const reference to the ith element FXfloat& operator[](FXint i){return (&x)[i];} /// Return a const reference to the ith element const FXfloat& operator[](FXint i) const {return (&x)[i];} /// Assign color FXVec4f& operator=(FXColor color); /// Assignment FXVec4f& operator=(const FXVec3f& v){x=v.x;y=v.y;z=v.z;w=1.0f;return *this;} FXVec4f& operator=(const FXVec4f& v){x=v.x;y=v.y;z=v.z;w=v.w;return *this;} /// Assignment from array of floats FXVec4f& operator=(const FXfloat v[]){x=v[0];y=v[1];z=v[2];w=v[3];return *this;} /// Set value from another vector FXVec4f& set(const FXVec4f& v){x=v.x;y=v.y;z=v.z;w=v.w;return *this;} /// Set value from array of floats FXVec4f& set(const FXfloat v[]){x=v[0];y=v[1];z=v[2];w=v[3];return *this;} /// Set value from components FXVec4f& set(FXfloat xx,FXfloat yy,FXfloat zz,FXfloat ww){x=xx;y=yy;z=zz;w=ww;return *this;} /// Assigning operators FXVec4f& operator*=(FXfloat n){x*=n;y*=n;z*=n;w*=n;return *this;} FXVec4f& operator/=(FXfloat n){x/=n;y/=n;z/=n;w/=n;return *this;} FXVec4f& operator+=(const FXVec4f& v){x+=v.x;y+=v.y;z+=v.z;w+=v.w;return *this;} FXVec4f& operator-=(const FXVec4f& v){x-=v.x;y-=v.y;z-=v.z;w-=v.w;return *this;} /// Conversion operator FXfloat*(){return &x;} operator const FXfloat*() const {return &x;} operator FXVec3f&(){return *reinterpret_cast(this);} operator const FXVec3f&() const {return *reinterpret_cast(this);} /// Convert to color operator FXColor() const; /// Unary FXVec4f operator+() const { return *this; } FXVec4f operator-() const { return FXVec4f(-x,-y,-z,-w); } /// Vector and vector FXVec4f operator+(const FXVec4f& v) const { return FXVec4f(x+v.x,y+v.y,z+v.z,w+v.w); } FXVec4f operator-(const FXVec4f& v) const { return FXVec4f(x-v.x,y-v.y,z-v.z,w-v.w); } /// Vector and matrix FXVec4f operator*(const FXMat4f& m) const; /// Scaling friend inline FXVec4f operator*(const FXVec4f& a,FXfloat n); friend inline FXVec4f operator*(FXfloat n,const FXVec4f& a); friend inline FXVec4f operator/(const FXVec4f& a,FXfloat n); friend inline FXVec4f operator/(FXfloat n,const FXVec4f& a); /// Dot product FXfloat operator*(const FXVec4f& v) const { return x*v.x+y*v.y+z*v.z+w*v.w; } /// Test if zero bool operator!() const { return x==0.0f && y==0.0f && z==0.0f && w==0.0f; } /// Equality tests bool operator==(const FXVec4f& v) const {return x==v.x && y==v.y && z==v.z && w==v.w; } bool operator!=(const FXVec4f& v) const {return x!=v.x || y!=v.y || z!=v.z || w!=v.w; } friend inline bool operator==(const FXVec4f& a,FXfloat n); friend inline bool operator!=(const FXVec4f& a,FXfloat n); friend inline bool operator==(FXfloat n,const FXVec4f& a); friend inline bool operator!=(FXfloat n,const FXVec4f& a); /// Inequality tests bool operator<(const FXVec4f& v) const { return x(const FXVec4f& v) const { return x>v.x && y>v.y && z>v.z && w>v.w; } bool operator>=(const FXVec4f& v) const { return x>=v.x && y>=v.y && z>=v.z && w>=v.w; } friend inline bool operator<(const FXVec4f& a,FXfloat n); friend inline bool operator<=(const FXVec4f& a,FXfloat n); friend inline bool operator>(const FXVec4f& a,FXfloat n); friend inline bool operator>=(const FXVec4f& a,FXfloat n); friend inline bool operator<(FXfloat n,const FXVec4f& a); friend inline bool operator<=(FXfloat n,const FXVec4f& a); friend inline bool operator>(FXfloat n,const FXVec4f& a); friend inline bool operator>=(FXfloat n,const FXVec4f& a); /// Length and square of length FXfloat length2() const { return x*x+y*y+z*z+w*w; } FXfloat length() const { return sqrtf(length2()); } /// Clamp values of vector between limits FXVec4f& clamp(FXfloat lo,FXfloat hi){x=FXCLAMP(lo,x,hi);y=FXCLAMP(lo,y,hi);z=FXCLAMP(lo,z,hi);w=FXCLAMP(lo,w,hi);return *this;} /// Lowest or highest components friend inline FXVec4f lo(const FXVec4f& a,const FXVec4f& b); friend inline FXVec4f hi(const FXVec4f& a,const FXVec4f& b); /// Compute normalized plane equation ax+by+cz+d=0 friend FXAPI FXVec4f plane(const FXVec4f& vec); friend FXAPI FXVec4f plane(const FXVec3f& vec,FXfloat dist); friend FXAPI FXVec4f plane(const FXVec3f& vec,const FXVec3f& p); friend FXAPI FXVec4f plane(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c); /// Signed distance normalized plane and point FXfloat distance(const FXVec3f& p) const; /// Return true if edge a-b crosses plane bool crosses(const FXVec3f& a,const FXVec3f& b) const; /// Normalize vector friend FXAPI FXVec4f normalize(const FXVec4f& v); /// Save to a stream friend FXAPI FXStream& operator<<(FXStream& store,const FXVec4f& v); /// Load from a stream friend FXAPI FXStream& operator>>(FXStream& store,FXVec4f& v); }; inline FXVec4f operator*(const FXVec4f& a,FXfloat n){return FXVec4f(a.x*n,a.y*n,a.z*n,a.w*n);} inline FXVec4f operator*(FXfloat n,const FXVec4f& a){return FXVec4f(n*a.x,n*a.y,n*a.z,n*a.w);} inline FXVec4f operator/(const FXVec4f& a,FXfloat n){return FXVec4f(a.x/n,a.y/n,a.z/n,a.w/n);} inline FXVec4f operator/(FXfloat n,const FXVec4f& a){return FXVec4f(n/a.x,n/a.y,n/a.z,n/a.w);} inline bool operator==(const FXVec4f& a,FXfloat n){return a.x==n && a.y==n && a.z==n && a.w==n;} inline bool operator!=(const FXVec4f& a,FXfloat n){return a.x!=n || a.y!=n || a.z!=n || a.w!=n;} inline bool operator==(FXfloat n,const FXVec4f& a){return n==a.x && n==a.y && n==a.z && n==a.w;} inline bool operator!=(FXfloat n,const FXVec4f& a){return n!=a.x || n!=a.y || n!=a.z || n!=a.w;} inline bool operator<(const FXVec4f& a,FXfloat n){return a.x(const FXVec4f& a,FXfloat n){return a.x>n && a.y>n && a.z>n && a.w>n;} inline bool operator>=(const FXVec4f& a,FXfloat n){return a.x>=n && a.y>=n && a.z>=n && a.w>=n;} inline bool operator<(FXfloat n,const FXVec4f& a){return n(FXfloat n,const FXVec4f& a){return n>a.x && n>a.y && n>a.z && n>a.w;} inline bool operator>=(FXfloat n,const FXVec4f& a){return n>=a.x && n>=a.y && n>=a.z && n>=a.w;} inline FXVec4f lo(const FXVec4f& a,const FXVec4f& b){return FXVec4f(FXMIN(a.x,b.x),FXMIN(a.y,b.y),FXMIN(a.z,b.z),FXMIN(a.w,b.w));} inline FXVec4f hi(const FXVec4f& a,const FXVec4f& b){return FXVec4f(FXMAX(a.x,b.x),FXMAX(a.y,b.y),FXMAX(a.z,b.z),FXMAX(a.w,b.w));} extern FXAPI FXVec4f plane(const FXVec4f& vec); extern FXAPI FXVec4f plane(const FXVec3f& vec,FXfloat dist); extern FXAPI FXVec4f plane(const FXVec3f& vec,const FXVec3f& p); extern FXAPI FXVec4f plane(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c); extern FXAPI FXVec4f normalize(const FXVec4f& v); extern FXAPI FXStream& operator<<(FXStream& store,const FXVec4f& v); extern FXAPI FXStream& operator>>(FXStream& store,FXVec4f& v); } #endif fox1.6-1.6.57/include/FXVerticalFrame.h000066400000000000000000000055221326741342000174170ustar00rootroot00000000000000/******************************************************************************** * * * V e r t i c a l C o n t a i n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVerticalFrame.h,v 1.15 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXVERTICALFRAME_H #define FXVERTICALFRAME_H #ifndef FXPACKER_H #include "FXPacker.h" #endif namespace FX { /** * Vertical frame layout manager widget is used to automatically * place child-windows vertically from top-to-bottom, or bottom-to-top, * depending on the child window's layout hints. */ class FXAPI FXVerticalFrame : public FXPacker { FXDECLARE(FXVerticalFrame) protected: FXVerticalFrame(){} private: FXVerticalFrame(const FXVerticalFrame&); FXVerticalFrame& operator=(const FXVerticalFrame&); public: /// Construct a vertical frame layout manager FXVerticalFrame(FXComposite *p,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=DEFAULT_SPACING,FXint pr=DEFAULT_SPACING,FXint pt=DEFAULT_SPACING,FXint pb=DEFAULT_SPACING,FXint hs=DEFAULT_SPACING,FXint vs=DEFAULT_SPACING); /// Perform layout virtual void layout(); /// Return default width virtual FXint getDefaultWidth(); /// Return default height virtual FXint getDefaultHeight(); }; } #endif fox1.6-1.6.57/include/FXVisual.h000066400000000000000000000150221326741342000161320ustar00rootroot00000000000000/******************************************************************************** * * * V i s u a l C l a s s * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVisual.h,v 1.41 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXVISUAL_H #define FXVISUAL_H #ifndef FXID_H #include "FXId.h" #endif namespace FX { /// Construction options for FXVisual class enum FXVisualOptions { VISUAL_DEFAULT = 0, /// Default visual VISUAL_MONOCHROME = 1, /// Must be monochrome visual VISUAL_BEST = 2, /// Best (deepest) visual VISUAL_INDEXCOLOR = 4, /// Palette visual VISUAL_GRAYSCALE = 8, /// Gray scale visual VISUAL_TRUECOLOR = 16, /// Must be true color visual VISUAL_OWNCOLORMAP = 32, /// Allocate private colormap VISUAL_DOUBLEBUFFER = 64, /// Double-buffered [FXGLVisual] VISUAL_STEREO = 128, /// Stereo [FXGLVisual] VISUAL_NOACCEL = 256, /// No hardware acceleration [for broken h/w] VISUAL_SWAP_COPY = 512 /// Buffer swap by copying [FXGLVisual] }; /// Visual type enum FXVisualType { VISUALTYPE_UNKNOWN, /// Undetermined visual type VISUALTYPE_MONO, /// Visual for drawing into 1-bpp surfaces VISUALTYPE_TRUE, /// True color VISUALTYPE_INDEX, /// Index [palette] color VISUALTYPE_GRAY /// Gray scale }; class FXApp; class FXWindow; class FXGLContext; class FXGLCanvas; class FXImage; class FXIcon; class FXBitmap; class FXDCWindow; /// Visual describes pixel format of a drawable class FXAPI FXVisual : public FXId { FXDECLARE(FXVisual) friend class FXApp; friend class FXWindow; friend class FXImage; friend class FXIcon; friend class FXBitmap; friend class FXDCWindow; friend class FXGLCanvas; friend class FXGLContext; protected: FXuint flags; // Visual flags FXuint hint; // Depth Hint FXuint depth; // Visual depth, significant bits/pixel FXuint numred; // Number of reds FXuint numgreen; // Number of greens FXuint numblue; // Number of blues FXuint numcolors; // Total number of colors FXuint maxcolors; // Maximum number of colors FXVisualType type; // Visual type void *info; // Opaque data void *visual; // Application visual/pixel format FXID colormap; // Color map, if any FXbool freemap; // We allocated the map #ifndef WIN32 protected: void *gc; // Drawing GC void *scrollgc; // Scrolling GC FXPixel rpix[16][256]; // Mapping from red -> pixel FXPixel gpix[16][256]; // Mapping from green -> pixel FXPixel bpix[16][256]; // Mapping from blue -> pixel FXPixel lut[256]; // Color lookup table protected: void* setupgc(FXbool); void setuptruecolor(); void setupdirectcolor(); void setuppseudocolor(); void setupstaticcolor(); void setupgrayscale(); void setupstaticgray(); void setuppixmapmono(); void setupcolormap(); #endif protected: FXVisual(); private: FXVisual(const FXVisual&); FXVisual &operator=(const FXVisual&); public: /// Construct default visual FXVisual(FXApp* a,FXuint flgs,FXuint d=32); /// Get visual type FXVisualType getType() const { return type; } /// Get visual info void* getInfo() const { return info; } /// Get visual or pixel format void* getVisual() const { return visual; } /// Create visual virtual void create(); /// Detach visual virtual void detach(); /// Destroy visual virtual void destroy(); /// Get flags (see FXVisualOptions) FXuint getFlags() const { return flags; } /// Get depth, i.e. number of significant bits in color representation FXuint getDepth() const { return depth; } /// Get number of colors FXuint getNumColors() const { return numcolors; } /// Get number of reds FXuint getNumRed() const { return numred; } /// Get number of greens FXuint getNumGreen() const { return numgreen; } /// Get number of blues FXuint getNumBlue() const { return numblue; } /// Get device pixel value for color FXPixel getPixel(FXColor clr); /// Get color value for device pixel value FXColor getColor(FXPixel pix); /// Set maximum number of colors to allocate void setMaxColors(FXuint maxcols); /// Get maximum number of colors FXuint getMaxColors() const { return maxcolors; } /// Save visual information to a stream virtual void save(FXStream& store) const; /// Load visual information from a stream virtual void load(FXStream& store); /// Destructor virtual ~FXVisual(); }; } #endif fox1.6-1.6.57/include/FXWindow.h000066400000000000000000000701301326741342000161370ustar00rootroot00000000000000/******************************************************************************** * * * W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXWindow.h,v 1.149 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXWINDOW_H #define FXWINDOW_H #ifndef FXDRAWABLE_H #include "FXDrawable.h" #endif namespace FX { /// Layout hints for child widgets enum { LAYOUT_NORMAL = 0, /// Default layout mode LAYOUT_SIDE_TOP = 0, /// Pack on top side (default) LAYOUT_SIDE_BOTTOM = 0x00000001, /// Pack on bottom side LAYOUT_SIDE_LEFT = 0x00000002, /// Pack on left side LAYOUT_SIDE_RIGHT = LAYOUT_SIDE_LEFT|LAYOUT_SIDE_BOTTOM, /// Pack on right side LAYOUT_FILL_COLUMN = 0x00000001, /// Matrix column is stretchable LAYOUT_FILL_ROW = 0x00000002, /// Matrix row is stretchable LAYOUT_LEFT = 0, /// Stick on left (default) LAYOUT_RIGHT = 0x00000004, /// Stick on right LAYOUT_CENTER_X = 0x00000008, /// Center horizontally LAYOUT_FIX_X = LAYOUT_RIGHT|LAYOUT_CENTER_X, /// X fixed LAYOUT_TOP = 0, /// Stick on top (default) LAYOUT_BOTTOM = 0x00000010, /// Stick on bottom LAYOUT_CENTER_Y = 0x00000020, /// Center vertically LAYOUT_FIX_Y = LAYOUT_BOTTOM|LAYOUT_CENTER_Y, /// Y fixed LAYOUT_DOCK_SAME = 0, /// Dock on same galley if it fits LAYOUT_DOCK_NEXT = 0x00000040, /// Dock on next galley LAYOUT_RESERVED_1 = 0x00000080, LAYOUT_FIX_WIDTH = 0x00000100, /// Width fixed LAYOUT_FIX_HEIGHT = 0x00000200, /// height fixed LAYOUT_MIN_WIDTH = 0, /// Minimum width is the default LAYOUT_MIN_HEIGHT = 0, /// Minimum height is the default LAYOUT_FILL_X = 0x00000400, /// Stretch or shrink horizontally LAYOUT_FILL_Y = 0x00000800, /// Stretch or shrink vertically LAYOUT_FILL = LAYOUT_FILL_X|LAYOUT_FILL_Y, /// Stretch or shrink in both directions LAYOUT_EXPLICIT = LAYOUT_FIX_X|LAYOUT_FIX_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT /// Explicit placement }; /// Frame border appearance styles (for subclasses) enum { FRAME_NONE = 0, /// Default is no frame FRAME_SUNKEN = 0x00001000, /// Sunken border FRAME_RAISED = 0x00002000, /// Raised border FRAME_THICK = 0x00004000, /// Thick border FRAME_GROOVE = FRAME_THICK, /// A groove or etched-in border FRAME_RIDGE = FRAME_THICK|FRAME_RAISED|FRAME_SUNKEN, /// A ridge or embossed border FRAME_LINE = FRAME_RAISED|FRAME_SUNKEN, /// Simple line border FRAME_NORMAL = FRAME_SUNKEN|FRAME_THICK /// Regular raised/thick border }; /// Packing style (for packers) enum { PACK_NORMAL = 0, /// Default is each its own size PACK_UNIFORM_HEIGHT = 0x00008000, /// Uniform height PACK_UNIFORM_WIDTH = 0x00010000 /// Uniform width }; class FXIcon; class FXBitmap; class FXCursor; class FXRegion; class FXComposite; class FXAccelTable; class FXComposeContext; /// Base class for all windows class FXAPI FXWindow : public FXDrawable { FXDECLARE(FXWindow) friend class FXApp; private: FXWindow *parent; // Parent Window FXWindow *owner; // Owner Window FXWindow *first; // First Child FXWindow *last; // Last Child FXWindow *next; // Next Sibling FXWindow *prev; // Previous Sibling FXWindow *focus; // Focus Child FXuint wk; // Window Key protected: FXComposeContext *composeContext; // Compose context FXCursor *defaultCursor; // Normal Cursor FXCursor *dragCursor; // Cursor during drag FXAccelTable *accelTable; // Accelerator table FXObject *target; // Target object FXSelector message; // Message ID FXint xpos; // Window X Position FXint ypos; // Window Y Position FXColor backColor; // Window background color FXString tag; // Help tag FXuint flags; // Window state flags FXuint options; // Window options public: static FXDragType octetType; // Raw octet stream static FXDragType deleteType; // Delete request static FXDragType textType; // Ascii text request static FXDragType utf8Type; // UTF-8 text request static FXDragType utf16Type; // UTF-16 text request static FXDragType colorType; // Color static FXDragType urilistType; // URI List static const FXDragType stringType; // Clipboard text type (pre-registered) static const FXDragType imageType; // Clipboard image type (pre-registered) protected: FXWindow(); FXWindow(FXApp* a,FXVisual *vis); FXWindow(FXApp* a,FXWindow* own,FXuint opts,FXint x,FXint y,FXint w,FXint h); static FXWindow* findDefault(FXWindow* window); static FXWindow* findInitial(FXWindow* window); virtual bool doesOverrideRedirect() const; protected: #ifdef WIN32 virtual FXID GetDC() const; virtual int ReleaseDC(FXID) const; virtual const char* GetClass() const; #else void addColormapWindows(); void remColormapWindows(); #endif private: FXWindow(const FXWindow&); FXWindow& operator=(const FXWindow&); protected: // Window state flags enum { FLAG_SHOWN = 0x00000001, // Is shown FLAG_ENABLED = 0x00000002, // Able to receive input FLAG_UPDATE = 0x00000004, // Is subject to GUI update FLAG_DROPTARGET = 0x00000008, // Drop target FLAG_FOCUSED = 0x00000010, // Has focus FLAG_DIRTY = 0x00000020, // Needs layout FLAG_RECALC = 0x00000040, // Needs recalculation FLAG_TIP = 0x00000080, // Show tip FLAG_HELP = 0x00000100, // Show help FLAG_DEFAULT = 0x00000200, // Default widget FLAG_INITIAL = 0x00000400, // Initial widget FLAG_SHELL = 0x00000800, // Shell window FLAG_ACTIVE = 0x00001000, // Window is active FLAG_PRESSED = 0x00002000, // Button has been pressed FLAG_KEY = 0x00004000, // Keyboard key pressed FLAG_CARET = 0x00008000, // Caret is on FLAG_CHANGED = 0x00010000, // Window data changed FLAG_LASSO = 0x00020000, // Lasso mode FLAG_TRYDRAG = 0x00040000, // Tentative drag mode FLAG_DODRAG = 0x00080000, // Doing drag mode FLAG_SCROLLINSIDE = 0x00100000, // Scroll only when inside FLAG_SCROLLING = 0x00200000, // Right mouse scrolling FLAG_OWNED = 0x00400000 }; public: // Message handlers long onPaint(FXObject*,FXSelector,void*); long onMap(FXObject*,FXSelector,void*); long onUnmap(FXObject*,FXSelector,void*); long onConfigure(FXObject*,FXSelector,void*); long onUpdate(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onMouseWheel(FXObject*,FXSelector,void*); long onEnter(FXObject*,FXSelector,void*); long onLeave(FXObject*,FXSelector,void*); long onLeftBtnPress(FXObject*,FXSelector,void*); long onLeftBtnRelease(FXObject*,FXSelector,void*); long onMiddleBtnPress(FXObject*,FXSelector,void*); long onMiddleBtnRelease(FXObject*,FXSelector,void*); long onRightBtnPress(FXObject*,FXSelector,void*); long onRightBtnRelease(FXObject*,FXSelector,void*); long onBeginDrag(FXObject*,FXSelector,void*); long onEndDrag(FXObject*,FXSelector,void*); long onDragged(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onUngrabbed(FXObject*,FXSelector,void*); long onDestroy(FXObject*,FXSelector,void*); long onFocusSelf(FXObject*,FXSelector,void*); long onFocusIn(FXObject*,FXSelector,void*); long onFocusOut(FXObject*,FXSelector,void*); long onSelectionLost(FXObject*,FXSelector,void*); long onSelectionGained(FXObject*,FXSelector,void*); long onSelectionRequest(FXObject*,FXSelector,void*); long onClipboardLost(FXObject*,FXSelector,void*); long onClipboardGained(FXObject*,FXSelector,void*); long onClipboardRequest(FXObject*,FXSelector,void*); long onDNDEnter(FXObject*,FXSelector,void*); long onDNDLeave(FXObject*,FXSelector,void*); long onDNDMotion(FXObject*,FXSelector,void*); long onDNDDrop(FXObject*,FXSelector,void*); long onDNDRequest(FXObject*,FXSelector,void*); long onQueryHelp(FXObject*,FXSelector,void*); long onQueryTip(FXObject*,FXSelector,void*); long onCmdShow(FXObject*,FXSelector,void*); long onCmdHide(FXObject*,FXSelector,void*); long onUpdToggleShown(FXObject*,FXSelector,void*); long onCmdToggleShown(FXObject*,FXSelector,void*); long onCmdRaise(FXObject*,FXSelector,void*); long onCmdLower(FXObject*,FXSelector,void*); long onCmdEnable(FXObject*,FXSelector,void*); long onCmdDisable(FXObject*,FXSelector,void*); long onUpdToggleEnabled(FXObject*,FXSelector,void*); long onCmdToggleEnabled(FXObject*,FXSelector,void*); long onCmdUpdate(FXObject*,FXSelector,void*); long onUpdYes(FXObject*,FXSelector,void*); long onCmdDelete(FXObject*,FXSelector,void*); public: // Message ID's common to most Windows enum { ID_NONE, ID_HIDE, // ID_HIDE+FALSE ID_SHOW, // ID_HIDE+TRUE ID_TOGGLESHOWN, ID_LOWER, ID_RAISE, ID_DELETE, ID_DISABLE, // ID_DISABLE+FALSE ID_ENABLE, // ID_DISABLE+TRUE ID_TOGGLEENABLED, ID_UNCHECK, // ID_UNCHECK+FALSE ID_CHECK, // ID_UNCHECK+TRUE ID_UNKNOWN, // ID_UNCHECK+MAYBE ID_UPDATE, ID_AUTOSCROLL, ID_TIPTIMER, ID_HSCROLLED, ID_VSCROLLED, ID_SETVALUE, ID_SETINTVALUE, ID_SETREALVALUE, ID_SETSTRINGVALUE, ID_SETICONVALUE, ID_SETINTRANGE, ID_SETREALRANGE, ID_GETINTVALUE, ID_GETREALVALUE, ID_GETSTRINGVALUE, ID_GETICONVALUE, ID_GETINTRANGE, ID_GETREALRANGE, ID_SETHELPSTRING, ID_GETHELPSTRING, ID_SETTIPSTRING, ID_GETTIPSTRING, ID_QUERY_MENU, ID_HOTKEY, ID_ACCEL, ID_UNPOST, ID_POST, ID_MDI_TILEHORIZONTAL, ID_MDI_TILEVERTICAL, ID_MDI_CASCADE, ID_MDI_MAXIMIZE, ID_MDI_MINIMIZE, ID_MDI_RESTORE, ID_MDI_CLOSE, ID_MDI_WINDOW, ID_MDI_MENUWINDOW, ID_MDI_MENUMINIMIZE, ID_MDI_MENURESTORE, ID_MDI_MENUCLOSE, ID_MDI_NEXT, ID_MDI_PREV, ID_LAST }; public: // Common DND type names static const FXchar octetTypeName[]; static const FXchar deleteTypeName[]; static const FXchar textTypeName[]; static const FXchar colorTypeName[]; static const FXchar urilistTypeName[]; static const FXchar utf8TypeName[]; static const FXchar utf16TypeName[]; public: /// Constructor FXWindow(FXComposite* p,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); /// Return a pointer to the parent window FXWindow* getParent() const { return parent; } /// Return a pointer to the owner window FXWindow* getOwner() const { return owner; } /// Return a pointer to the shell window FXWindow* getShell() const; /// Return a pointer to the root window FXWindow* getRoot() const; /// Return a pointer to the next (sibling) window, if any FXWindow* getNext() const { return next; } /// Return a pointer to the previous (sibling) window , if any FXWindow* getPrev() const { return prev; } /// Return a pointer to this window's first child window , if any FXWindow* getFirst() const { return first; } /// Return a pointer to this window's last child window, if any FXWindow* getLast() const { return last; } /// Return a pointer to the currently focused child window FXWindow* getFocus() const { return focus; } /// Change window key void setKey(FXuint k){ wk=k; } /// Return window key FXuint getKey() const { return wk; } /// Set the message target object for this window void setTarget(FXObject *t){ target=t; } /// Get the message target object for this window, if any FXObject* getTarget() const { return target; } /// Set the message identifier for this window void setSelector(FXSelector sel){ message=sel; } /// Get the message identifier for this window FXSelector getSelector() const { return message; } /// Get this window's x-coordinate, in the parent's coordinate system FXint getX() const { return xpos; } /// Get this window's y-coordinate, in the parent's coordinate system FXint getY() const { return ypos; } /// Return the default width of this window virtual FXint getDefaultWidth(); /// Return the default height of this window virtual FXint getDefaultHeight(); /// Return width for given height virtual FXint getWidthForHeight(FXint givenheight); /// Return height for given width virtual FXint getHeightForWidth(FXint givenwidth); /// Set this window's x-coordinate, in the parent's coordinate system void setX(FXint x); /// Set this window's y-coordinate, in the parent's coordinate system void setY(FXint y); /** * Set the window width; and flag the widget as being in need of * layout by its parent. This does not immediately update the server- * side representation of the widget. */ void setWidth(FXint w); /** * Set the window height; and flag the widget as being in need of * layout by its parent. This does not immediately update the server- * side representation of the widget. */ void setHeight(FXint h); /// Set layout hints for this window void setLayoutHints(FXuint lout); /// Get layout hints for this window FXuint getLayoutHints() const; /// Return a pointer to the accelerator table FXAccelTable* getAccelTable() const { return accelTable; } /// Set the accelerator table void setAccelTable(FXAccelTable* acceltable){ accelTable=acceltable; } /// Add a hot key void addHotKey(FXHotKey code); /// Remove a hot key void remHotKey(FXHotKey code); /// Change help tag for this widget void setHelpTag(const FXString& text){ tag=text; } /// Get the help tag for this widget const FXString& getHelpTag() const { return tag; } /// Return true if window is a shell window bool isShell() const; /// Return true if specified window is owned by this window bool isOwnerOf(const FXWindow* window) const; /// Return true if specified window is ancestor of this window bool isChildOf(const FXWindow* window) const; /// Return true if this window contains child in its subtree bool containsChild(const FXWindow* child) const; /// Return the child window at specified coordinates FXWindow* getChildAt(FXint x,FXint y) const; /// Return the number of child windows for this window FXint numChildren() const; /** * Return the index (starting from zero) of the specified child window, * or -1 if the window is not a child or NULL */ FXint indexOfChild(const FXWindow *window) const; /** * Return the child window at specified index, * or NULL if the index is negative or out of range */ FXWindow* childAtIndex(FXint index) const; /// Return the common ancestor of window a and window b static FXWindow* commonAncestor(FXWindow* a,FXWindow* b); /// Return TRUE if sibling a <= sibling b in list static bool before(const FXWindow *a,const FXWindow* b); /// Return TRUE if sibling a >= sibling b in list static bool after(const FXWindow *a,const FXWindow* b); /// Return compose context FXComposeContext* getComposeContext() const { return composeContext; } /// Create compose context void createComposeContext(); /// Destroy compose context void destroyComposeContext(); /// Set the default cursor for this window void setDefaultCursor(FXCursor* cur); /// Return the default cursor for this window FXCursor* getDefaultCursor() const { return defaultCursor; } /// Set the drag cursor for this window void setDragCursor(FXCursor* cur); /// Return the drag cursor for this window FXCursor* getDragCursor() const { return dragCursor; } /// Return the cursor position and mouse button-state FXint getCursorPosition(FXint& x,FXint& y,FXuint& buttons) const; /// Warp the cursor to the new position FXint setCursorPosition(FXint x,FXint y); /// Return true if this window is able to receive mouse and keyboard events bool isEnabled() const; /// Return true if the window is active bool isActive() const; /// Return true if this window is a control capable of receiving the focus virtual bool canFocus() const; /// Return true if this window has the focus bool hasFocus() const; /// Return true if this window is in focus chain bool inFocusChain() const; /// Move the focus to this window virtual void setFocus(); /// Remove the focus from this window virtual void killFocus(); /// Notification that focus moved to new child virtual void changeFocus(FXWindow *child); /** * This changes the default window which responds to the Return * key in a dialog. If enable is TRUE, this window becomes the default * window; when enable is FALSE, this window will be no longer the * default window. Finally, when enable is MAYBE, the default window * will revert to the initial default window. */ virtual void setDefault(FXbool enable=TRUE); /// Return true if this is the default window bool isDefault() const; /// Make this window the initial default window void setInitial(bool enable=true); /// Return true if this is the initial default window bool isInitial() const; /// Enable the window to receive mouse and keyboard events virtual void enable(); /// Disable the window from receiving mouse and keyboard events virtual void disable(); /// Create all of the server-side resources for this window virtual void create(); /// Attach foreign window handle to this window virtual void attach(FXID w); /// Detach the server-side resources for this window virtual void detach(); /// Destroy the server-side resources for this window virtual void destroy(); /// Set window shape by means of region virtual void setShape(const FXRegion& region); /// Set window shape by means of bitmap virtual void setShape(FXBitmap* bitmap); /// Set window shape by means of icon virtual void setShape(FXIcon* icon); /// Clear window shape virtual void clearShape(); /// Raise this window to the top of the stacking order virtual void raise(); /// Lower this window to the bottom of the stacking order virtual void lower(); /** * Move the window immediately, in the parent's coordinate system. * Update the server representation as well if the window is realized. * Perform layout of the children when necessary. */ virtual void move(FXint x,FXint y); /** * Resize the window to the specified width and height immediately, * updating the server representation as well, if the window was realized. * Perform layout of the children when necessary. */ virtual void resize(FXint w,FXint h); /** * Move and resize the window immediately, in the parent's coordinate system. * Update the server representation as well if the window is realized. * Perform layout of the children when necessary. */ virtual void position(FXint x,FXint y,FXint w,FXint h); /// Mark this window's layout as dirty for later layout virtual void recalc(); /// Perform layout immediately virtual void layout(); /// Generate a SEL_UPDATE message for the window and its children void forceRefresh(); /// Reparent this window under new father before other virtual void reparent(FXWindow* father,FXWindow *other=NULL); /// Scroll rectangle x,y,w,h by a shift of dx,dy void scroll(FXint x,FXint y,FXint w,FXint h,FXint dx,FXint dy) const; /// Mark the specified rectangle to be repainted later void update(FXint x,FXint y,FXint w,FXint h) const; /// Mark the entire window to be repainted later void update() const; /// Process any outstanding repaint messages immediately, for the given rectangle void repaint(FXint x,FXint y,FXint w,FXint h) const; /// Process any outstanding repaint messages immediately void repaint() const; /** * Grab the mouse to this window; future mouse events will be * reported to this window even while the cursor goes outside of this window */ void grab(); /// Release the mouse grab void ungrab(); /// Return true if the window has been grabbed bool grabbed() const; /// Grab keyboard device void grabKeyboard(); /// Ungrab keyboard device void ungrabKeyboard(); /// Return true if active grab is in effect bool grabbedKeyboard() const; /// Show this window virtual void show(); /// Hide this window virtual void hide(); /// Return true if the window is shown bool shown() const; /// Return true if the window is composite virtual bool isComposite() const; /// Return true if the window is under the cursor bool underCursor() const; /// Return true if this window owns the primary selection bool hasSelection() const; /// Try to acquire the primary selection, given a list of drag types bool acquireSelection(const FXDragType *types,FXuint numtypes); /// Release the primary selection bool releaseSelection(); /// Return true if this window owns the clipboard bool hasClipboard() const; /// Try to acquire the clipboard, given a list of drag types bool acquireClipboard(const FXDragType *types,FXuint numtypes); /// Release the clipboard bool releaseClipboard(); /// Enable this window to receive drops virtual void dropEnable(); /// Disable this window from receiving drops virtual void dropDisable(); /// Return true if this window is able to receive drops bool isDropEnabled() const; /// Return true if a drag operaion has been initiated from this window bool isDragging() const; /// Initiate a drag operation with a list of previously registered drag types bool beginDrag(const FXDragType *types,FXuint numtypes); /** * When dragging, inform the drop-target of the new position and * the drag action */ bool handleDrag(FXint x,FXint y,FXDragAction action=DRAG_COPY); /** * Terminate the drag operation with or without actually dropping the data * Returns the action performed by the target */ FXDragAction endDrag(bool drop=true); /// Return true if this window is the target of a drop bool isDropTarget() const; /** * When being dragged over, indicate that no further SEL_DND_MOTION messages * are required while the cursor is inside the given rectangle */ void setDragRectangle(FXint x,FXint y,FXint w,FXint h,bool wantupdates=true) const; /** * When being dragged over, indicate we want to receive SEL_DND_MOTION messages * every time the cursor moves */ void clearDragRectangle() const; /// When being dragged over, indicate acceptance or rejection of the dragged data void acceptDrop(FXDragAction action=DRAG_ACCEPT) const; /// The target accepted our drop FXDragAction didAccept() const; /** * Sent by the drop target in response to SEL_DND_DROP. The drag action * should be the same as the action the drop target reported to the drag * source in reponse to the SEL_DND_MOTION message. * This function notifies the drag source that its part of the drop transaction * is finished, and that it is free to release any resources involved in the * drag operation. * Calling dropFinished() is advisable in cases where the drop target needs * to perform complex processing on the data received from the drag source, * prior to returning from the SEL_DND_DROP message handler. */ void dropFinished(FXDragAction action=DRAG_REJECT) const; /// When being dragged over, inquire the drag types which are being offered bool inquireDNDTypes(FXDNDOrigin origin,FXDragType*& types,FXuint& numtypes) const; /// When being dragged over, return true if we are offered the given drag type bool offeredDNDType(FXDNDOrigin origin,FXDragType type) const; /// When being dragged over, return the drag action FXDragAction inquireDNDAction() const; /** * Set DND data; the array must be allocated with FXMALLOC and ownership is * transferred to the system */ bool setDNDData(FXDNDOrigin origin,FXDragType type,FXuchar* data,FXuint size) const; /** * Set DND data from string value. */ bool setDNDData(FXDNDOrigin origin,FXDragType type,const FXString& string) const; /** * Get DND data; the caller becomes the owner of the array and must free it * with FXFREE */ bool getDNDData(FXDNDOrigin origin,FXDragType type,FXuchar*& data,FXuint& size) const; /** * Get DND data into string value. */ bool getDNDData(FXDNDOrigin origin,FXDragType type,FXString& string) const; /// Return true if window logically contains the given point virtual bool contains(FXint parentx,FXint parenty) const; /// Translate coordinates from fromwindow's coordinate space to this window's coordinate space void translateCoordinatesFrom(FXint& tox,FXint& toy,const FXWindow* fromwindow,FXint fromx,FXint fromy) const; /// Translate coordinates from this window's coordinate space to towindow's coordinate space void translateCoordinatesTo(FXint& tox,FXint& toy,const FXWindow* towindow,FXint fromx,FXint fromy) const; /// Set window background color virtual void setBackColor(FXColor clr); /// Get background color FXColor getBackColor() const { return backColor; } virtual bool doesSaveUnder() const; /** * Translate message for localization; using the current FXTranslator, * an attempt is made to translate the given message into the current * language. An optional hint may be passed to break any ties in case * more than one tranlation is possible for the given message text. * In addition, the name of the widget is passed as context name so * that controls in a single dialog may be grouped together. */ virtual const FXchar* tr(const FXchar* message,const FXchar* hint=NULL) const; /// Save window to stream virtual void save(FXStream& store) const; /// Restore window from stream virtual void load(FXStream& store); /// Destroy window virtual ~FXWindow(); }; } #endif fox1.6-1.6.57/include/FXWizard.h000066400000000000000000000120411326741342000161250ustar00rootroot00000000000000/******************************************************************************** * * * W i z a r d W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXWizard.h,v 1.8 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXWIZARD_H #define FXWIZARD_H #ifndef FXDIALOGBOX_H #include "FXDialogBox.h" #endif namespace FX { class FXImage; class FXIcon; class FXImageFrame; class FXButton; class FXSwitcher; /** * A Wizard widget guides the user through a number of panels * in a predefined sequence; each step must be completed before * moving on to the next step. * For example, a Wizard may be used to install software components, * and ask various questions at each step in the installation. */ class FXAPI FXWizard : public FXDialogBox { FXDECLARE(FXWizard) protected: FXHorizontalFrame *buttons; // Button frame FXImageFrame *sidebar; // Sidebar comprising image FXButton *advance; // Advance to next stage FXButton *retreat; // Retreat to last stage FXButton *finish; // Finish panel FXButton *cancel; // Cancel button FXSwitcher *panels; // Sub panels FXIcon *finishicon; FXIcon *nexticon; FXIcon *backicon; protected: FXWizard(){} void construct(); private: FXWizard(const FXWizard&); FXWizard &operator=(const FXWizard&); public: long onUpdFinish(FXObject*,FXSelector,void*); long onCmdNext(FXObject*,FXSelector,void*); long onUpdNext(FXObject*,FXSelector,void*); long onCmdBack(FXObject*,FXSelector,void*); long onUpdBack(FXObject*,FXSelector,void*); public: enum { ID_NEXT=FXDialogBox::ID_LAST, ID_BACK, ID_LAST }; public: /// Construct free-floating Wizard FXWizard(FXApp* a,const FXString& name,FXImage *image,FXuint opts=DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=10,FXint pr=10,FXint pt=10,FXint pb=10,FXint hs=10,FXint vs=10); /// Construct Wizard which will always float over the owner window FXWizard(FXWindow* owner,const FXString& name,FXImage *image,FXuint opts=DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,FXint x=0,FXint y=0,FXint w=0,FXint h=0,FXint pl=10,FXint pr=10,FXint pt=10,FXint pb=10,FXint hs=10,FXint vs=10); /// Return a pointer to the button frame FXHorizontalFrame *buttonFrame() const { return buttons; } /// Return a pointer to the "Advance" button FXButton *advanceButton() const { return advance; } /// Return a pointer to the "Retreat" button FXButton *retreatButton() const { return retreat; } /// Return a pointer to the "Finish" button FXButton *finishButton() const { return finish; } /// Return a pointer to the "Cancel" button FXButton *cancelButton() const { return cancel; } /// Return the container used as parent for the subpanels FXSwitcher *getContainer() const { return panels; } /// Change the image being displayed void setImage(FXImage* img); /// Return the current image FXImage* getImage() const; /// Return number of panels FXint getNumPanels() const; /// Bring the child window at index to the top void setCurrentPanel(FXint index); /// Return the index of the child window currently on top FXint getCurrentPanel() const; /// Save to stream virtual void save(FXStream& store) const; /// Load from stream virtual void load(FXStream& store); // Destroy virtual ~FXWizard(); }; } #endif fox1.6-1.6.57/include/FXXBMIcon.h000066400000000000000000000077011326741342000161330ustar00rootroot00000000000000/******************************************************************************** * * * X B M I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXXBMIcon.h,v 1.11 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXXBMICON_H #define FXXBMICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// X Bitmap icon class FXAPI FXXBMIcon : public FXIcon { FXDECLARE(FXXBMIcon) protected: FXXBMIcon(){} private: FXXBMIcon(const FXXBMIcon&); FXXBMIcon &operator=(const FXXBMIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct icon from memory stream formatted in X Bitmap format FXXBMIcon(FXApp* a,const FXuchar *pixels=NULL,const FXuchar *mask=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in X Bitmap format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in X Bitmap format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXXBMIcon(); }; #ifndef FXLOADXBM #define FXLOADXBM /** * Check if stream contains a XBM, return TRUE if so. */ extern FXAPI bool fxcheckXBM(FXStream& store); /** * Load an XBM (X Bitmap) from pixel array and mask array. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadXBM(FXColor*& data,const FXuchar *pix,const FXuchar *msk,FXint width,FXint height); /** * Load an XBM (X Bitmap) file from a stream. * Upon successful return, the pixel array and size, and hot-spot are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadXBM(FXStream& store,FXColor*& data,FXint& width,FXint& height,FXint& hotx,FXint& hoty); /** * Save an XBM (X Bitmap) file to a stream; if the parameters hotx and hoty are set * to -1, no hotspot location is saved. */ extern FXAPI bool fxsaveXBM(FXStream& store,const FXColor *data,FXint width,FXint height,FXint hotx=-1,FXint hoty=-1); /** * Save a PostScript file to a stream; format the picture to the maximal * size that fits within the given margins of the indicated paper size. */ extern FXAPI bool fxsavePS(FXStream& store,const FXColor *data,FXint width,FXint height,FXint paperw=612,FXint paperh=792,FXint margin=35,bool color=true); #endif } #endif fox1.6-1.6.57/include/FXXBMImage.h000066400000000000000000000076621326741342000162730ustar00rootroot00000000000000/******************************************************************************** * * * X B M I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXXBMImage.h,v 1.12 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXXBMIMAGE_H #define FXXBMIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// X Bitmap image class FXAPI FXXBMImage : public FXImage { FXDECLARE(FXXBMImage) protected: FXXBMImage(){} private: FXXBMImage(const FXXBMImage&); FXXBMImage &operator=(const FXXBMImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct image from memory stream formatted in X Bitmap format FXXBMImage(FXApp* a,const FXuchar *pixels=NULL,const FXuchar *mask=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in X Bitmap format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in X Bitmap format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXXBMImage(); }; #ifndef FXLOADXBM #define FXLOADXBM /** * Check if stream contains a XBM, return TRUE if so. */ extern FXAPI bool fxcheckXBM(FXStream& store); /** * Load an XBM (X Bitmap) from pixel array and mask array. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadXBM(FXColor*& data,const FXuchar *pix,const FXuchar *msk,FXint width,FXint height); /** * Load an XBM (X Bitmap) file from a stream. * Upon successful return, the pixel array and size, and hot-spot are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadXBM(FXStream& store,FXColor*& data,FXint& width,FXint& height,FXint& hotx,FXint& hoty); /** * Save an XBM (X Bitmap) file to a stream; if the parameters hotx and hoty are set * to -1, no hotspot location is saved. */ extern FXAPI bool fxsaveXBM(FXStream& store,const FXColor *data,FXint width,FXint height,FXint hotx=-1,FXint hoty=-1); /** * Save a PostScript file to a stream; format the picture to the maximal * size that fits within the given margins of the indicated paper size. */ extern FXAPI bool fxsavePS(FXStream& store,const FXColor *data,FXint width,FXint height,FXint paperw=612,FXint paperh=792,FXint margin=35,bool color=true); #endif } #endif fox1.6-1.6.57/include/FXXPMIcon.h000066400000000000000000000067071326741342000161560ustar00rootroot00000000000000/******************************************************************************** * * * X P M I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXXPMIcon.h,v 1.22 2006/01/22 17:58:12 fox Exp $ * ********************************************************************************/ #ifndef FXXPMICON_H #define FXXPMICON_H #ifndef FXICON_H #include "FXIcon.h" #endif namespace FX { /// X Pixmap icon class FXAPI FXXPMIcon : public FXIcon { FXDECLARE(FXXPMIcon) protected: FXXPMIcon(){} private: FXXPMIcon(const FXXPMIcon&); FXXPMIcon &operator=(const FXXPMIcon&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct icon from compiled-in X Pixmap format FXXPMIcon(FXApp* a,const FXchar **pix=NULL,FXColor clr=FXRGB(192,192,192),FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in X Pixmap format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in X Pixmap format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXXPMIcon(); }; #ifndef FXLOADXPM #define FXLOADXPM /** * Check if stream contains a XPM, return TRUE if so. */ extern FXAPI bool fxcheckXPM(FXStream& store); /** * Load an XPM (X Pixmap) from array of strings. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadXPM(const FXchar **pix,FXColor*& data,FXint& width,FXint& height); /** * Load an XPM (X Pixmap) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadXPM(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an XPM (X Pixmap) file to a stream. */ extern FXAPI bool fxsaveXPM(FXStream& store,const FXColor *data,FXint width,FXint height,bool fast=true); #endif } #endif fox1.6-1.6.57/include/FXXPMImage.h000066400000000000000000000066701326741342000163070ustar00rootroot00000000000000/******************************************************************************** * * * X P M I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXXPMImage.h,v 1.21 2006/01/22 17:58:13 fox Exp $ * ********************************************************************************/ #ifndef FXXPMIMAGE_H #define FXXPMIMAGE_H #ifndef FXIMAGE_H #include "FXImage.h" #endif namespace FX { /// X Pixmap image class FXAPI FXXPMImage : public FXImage { FXDECLARE(FXXPMImage) protected: FXXPMImage(){} private: FXXPMImage(const FXXPMImage&); FXXPMImage &operator=(const FXXPMImage&); public: static const FXchar fileExt[]; static const FXchar mimeType[]; public: /// Construct image from compiled-in X Pixmap format FXXPMImage(FXApp* a,const FXchar **pix=NULL,FXuint opts=0,FXint w=1,FXint h=1); /// Save pixels into stream in X Pixmap format virtual bool savePixels(FXStream& store) const; /// Load pixels from stream in X Pixmap format virtual bool loadPixels(FXStream& store); /// Destroy icon virtual ~FXXPMImage(); }; #ifndef FXLOADXPM #define FXLOADXPM /** * Check if stream contains a XPM, return TRUE if so. */ extern FXAPI bool fxcheckXPM(FXStream& store); /** * Load an XPM (X Pixmap) from array of strings. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadXPM(const FXchar **pix,FXColor*& data,FXint& width,FXint& height); /** * Load an XPM (X Pixmap) file from a stream. * Upon successful return, the pixel array and size are returned. * If an error occurred, the pixel array is set to NULL. */ extern FXAPI bool fxloadXPM(FXStream& store,FXColor*& data,FXint& width,FXint& height); /** * Save an XPM (X Pixmap) file to a stream. */ extern FXAPI bool fxsaveXPM(FXStream& store,const FXColor *data,FXint width,FXint height,bool fast=true); #endif } #endif fox1.6-1.6.57/include/Makefile.am000066400000000000000000000105601326741342000163160ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in foxincludedir=$(includedir)/fox-1.6 CODECS = \ FX88591Codec.h \ FX88592Codec.h \ FX88593Codec.h \ FX88594Codec.h \ FX88595Codec.h \ FX88596Codec.h \ FX88597Codec.h \ FX88598Codec.h \ FX88599Codec.h \ FX885910Codec.h \ FX885911Codec.h \ FX885913Codec.h \ FX885914Codec.h \ FX885915Codec.h \ FX885916Codec.h \ FXCP437Codec.h \ FXCP850Codec.h \ FXCP852Codec.h \ FXCP855Codec.h \ FXCP856Codec.h \ FXCP857Codec.h \ FXCP860Codec.h \ FXCP861Codec.h \ FXCP862Codec.h \ FXCP863Codec.h \ FXCP864Codec.h \ FXCP865Codec.h \ FXCP866Codec.h \ FXCP869Codec.h \ FXCP874Codec.h \ FXCP1250Codec.h \ FXCP1251Codec.h \ FXCP1252Codec.h \ FXCP1253Codec.h \ FXCP1254Codec.h \ FXCP1255Codec.h \ FXCP1256Codec.h \ FXCP1257Codec.h \ FXCP1258Codec.h \ FXKOI8RCodec.h \ FXUTF8Codec.h \ FXUTF16Codec.h \ FXUTF32Codec.h foxinclude_HEADERS = \ $(CODECS) \ FX4Splitter.h \ FX7Segment.h \ FXAccelTable.h \ FXApp.h \ FXArray.h \ FXArrowButton.h \ FXBMPIcon.h \ FXBMPImage.h \ FXBitmap.h \ FXBitmapFrame.h \ FXBitmapView.h \ FXButton.h \ FXBZFileStream.h \ FXCURCursor.h \ FXCanvas.h \ FXCheckButton.h \ FXChoiceBox.h \ FXColorBar.h \ FXColorDialog.h \ FXColorList.h \ FXColorRing.h \ FXColorSelector.h \ FXColorWell.h \ FXColorWheel.h \ FXComboBox.h \ FXComposeContext.h \ FXComposite.h \ FXCursor.h \ FXDate.h \ FXDC.h \ FXDCPrint.h \ FXDCWindow.h \ FXDLL.h \ FXDataTarget.h \ FXDebugTarget.h \ FXDelegator.h \ FXDial.h \ FXDialogBox.h \ FXDict.h \ FXDir.h \ FXDirBox.h \ FXDirDialog.h \ FXDirList.h \ FXDirSelector.h \ FXDockBar.h \ FXDockHandler.h \ FXDockSite.h \ FXDockTitle.h \ FXDocument.h \ FXDragCorner.h \ FXDrawable.h \ FXDriveBox.h \ FXElement.h \ FXException.h \ FXExpression.h \ FXExtentd.h \ FXExtentf.h \ FXFile.h \ FXFileDialog.h \ FXFileDict.h \ FXFileList.h \ FXFileSelector.h \ FXFileStream.h \ FXFoldingList.h \ FXFont.h \ FXFontDialog.h \ FXFontSelector.h \ FXFrame.h \ FXGIFCursor.h \ FXGIFIcon.h \ FXGIFImage.h \ FXGLCanvas.h \ FXGLCone.h \ FXGLContext.h \ FXGLCube.h \ FXGLCylinder.h \ FXGLObject.h \ FXGLShape.h \ FXGLSphere.h \ FXGLTriangleMesh.h \ FXGLViewer.h \ FXGLVisual.h \ FXGroupBox.h \ FXGradientBar.h \ FXGUISignal.h \ FXGZFileStream.h \ FXHash.h \ FXHeader.h \ FXHorizontalFrame.h \ FXICOIcon.h \ FXICOImage.h \ FXIFFImage.h \ FXIFFIcon.h \ FXIO.h \ FXIcon.h \ FXIconDict.h \ FXIconList.h \ FXIconSource.h \ FXId.h \ FXImage.h \ FXImageFrame.h \ FXImageView.h \ FXInputDialog.h \ FXJPGIcon.h \ FXJPGImage.h \ FXKnob.h \ FXLabel.h \ FXList.h \ FXListBox.h \ FXMDIButton.h \ FXMDIChild.h \ FXMDIClient.h \ FXMainWindow.h \ FXMat3d.h \ FXMat4d.h \ FXMat3f.h \ FXMat4f.h \ FXMatrix.h \ FXMemoryStream.h \ FXMemMap.h \ FXMenuBar.h \ FXMenuButton.h \ FXMenuCaption.h \ FXMenuCascade.h \ FXMenuCheck.h \ FXMenuRadio.h \ FXMenuCommand.h \ FXMenuPane.h \ FXMenuSeparator.h \ FXMenuTitle.h \ FXMessageBox.h \ FXObject.h \ FXObjectList.h \ FXOptionMenu.h \ FXPCXIcon.h \ FXPCXImage.h \ FXPNGIcon.h \ FXPNGImage.h \ FXPPMIcon.h \ FXPPMImage.h \ FXPacker.h \ FXPath.h \ FXPicker.h \ FXPipe.h \ FXPoint.h \ FXPopup.h \ FXPrintDialog.h \ FXProgressBar.h \ FXProgressDialog.h \ FXQuatd.h \ FXQuatf.h \ FXRASIcon.h \ FXRASImage.h \ FXRGBIcon.h \ FXRGBImage.h \ FXRadioButton.h \ FXRangef.h \ FXRanged.h \ FXRealSlider.h \ FXRealSpinner.h \ FXRecentFiles.h \ FXRectangle.h \ FXRegion.h \ FXRegistry.h \ FXReplaceDialog.h \ FXRex.h \ FXRootWindow.h \ FXRuler.h \ FXRulerView.h \ FXScrollArea.h \ FXScrollBar.h \ FXScrollPane.h \ FXScrollWindow.h \ FXSearchDialog.h \ FXSeparator.h \ FXSettings.h \ FXShell.h \ FXShutter.h \ FXSize.h \ FXSlider.h \ FXSocket.h \ FXSpinner.h \ FXSpheref.h \ FXSphered.h \ FXSplashWindow.h \ FXSplitter.h \ FXSpring.h \ FXStat.h \ FXStatusBar.h \ FXStatusLine.h \ FXStream.h \ FXString.h \ FXStringDict.h \ FXSwitcher.h \ FXSystem.h \ FXTGAIcon.h \ FXTGAImage.h \ FXTIFIcon.h \ FXTIFImage.h \ FXTabBar.h \ FXTabBook.h \ FXTabItem.h \ FXTable.h \ FXText.h \ FXTextCodec.h \ FXTextField.h \ FXThread.h \ FXToggleButton.h \ FXToolBar.h \ FXToolBarGrip.h \ FXToolBarShell.h \ FXToolBarTab.h \ FXToolTip.h \ FXTopWindow.h \ FXTranslator.h \ FXTreeList.h \ FXTreeListBox.h \ FXTriStateButton.h \ FXUndoList.h \ FXURL.h \ FXVec2d.h \ FXVec2f.h \ FXVec3d.h \ FXVec3f.h \ FXVec4d.h \ FXVec4f.h \ FXVerticalFrame.h \ FXVisual.h \ FXWindow.h \ FXWizard.h \ FXXBMIcon.h \ FXXBMImage.h \ FXXPMIcon.h \ FXXPMImage.h \ fx.h \ fx3d.h \ fxascii.h \ fxdefs.h \ fxkeys.h \ fxunicode.h \ fxver.h \ xincs.h fox1.6-1.6.57/include/Makefile.in000066400000000000000000000512711326741342000163330ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = include ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(foxinclude_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = fxver.h CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(foxincludedir)" HEADERS = $(foxinclude_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/fxver.h.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ foxincludedir = $(includedir)/fox-1.6 CODECS = \ FX88591Codec.h \ FX88592Codec.h \ FX88593Codec.h \ FX88594Codec.h \ FX88595Codec.h \ FX88596Codec.h \ FX88597Codec.h \ FX88598Codec.h \ FX88599Codec.h \ FX885910Codec.h \ FX885911Codec.h \ FX885913Codec.h \ FX885914Codec.h \ FX885915Codec.h \ FX885916Codec.h \ FXCP437Codec.h \ FXCP850Codec.h \ FXCP852Codec.h \ FXCP855Codec.h \ FXCP856Codec.h \ FXCP857Codec.h \ FXCP860Codec.h \ FXCP861Codec.h \ FXCP862Codec.h \ FXCP863Codec.h \ FXCP864Codec.h \ FXCP865Codec.h \ FXCP866Codec.h \ FXCP869Codec.h \ FXCP874Codec.h \ FXCP1250Codec.h \ FXCP1251Codec.h \ FXCP1252Codec.h \ FXCP1253Codec.h \ FXCP1254Codec.h \ FXCP1255Codec.h \ FXCP1256Codec.h \ FXCP1257Codec.h \ FXCP1258Codec.h \ FXKOI8RCodec.h \ FXUTF8Codec.h \ FXUTF16Codec.h \ FXUTF32Codec.h foxinclude_HEADERS = \ $(CODECS) \ FX4Splitter.h \ FX7Segment.h \ FXAccelTable.h \ FXApp.h \ FXArray.h \ FXArrowButton.h \ FXBMPIcon.h \ FXBMPImage.h \ FXBitmap.h \ FXBitmapFrame.h \ FXBitmapView.h \ FXButton.h \ FXBZFileStream.h \ FXCURCursor.h \ FXCanvas.h \ FXCheckButton.h \ FXChoiceBox.h \ FXColorBar.h \ FXColorDialog.h \ FXColorList.h \ FXColorRing.h \ FXColorSelector.h \ FXColorWell.h \ FXColorWheel.h \ FXComboBox.h \ FXComposeContext.h \ FXComposite.h \ FXCursor.h \ FXDate.h \ FXDC.h \ FXDCPrint.h \ FXDCWindow.h \ FXDLL.h \ FXDataTarget.h \ FXDebugTarget.h \ FXDelegator.h \ FXDial.h \ FXDialogBox.h \ FXDict.h \ FXDir.h \ FXDirBox.h \ FXDirDialog.h \ FXDirList.h \ FXDirSelector.h \ FXDockBar.h \ FXDockHandler.h \ FXDockSite.h \ FXDockTitle.h \ FXDocument.h \ FXDragCorner.h \ FXDrawable.h \ FXDriveBox.h \ FXElement.h \ FXException.h \ FXExpression.h \ FXExtentd.h \ FXExtentf.h \ FXFile.h \ FXFileDialog.h \ FXFileDict.h \ FXFileList.h \ FXFileSelector.h \ FXFileStream.h \ FXFoldingList.h \ FXFont.h \ FXFontDialog.h \ FXFontSelector.h \ FXFrame.h \ FXGIFCursor.h \ FXGIFIcon.h \ FXGIFImage.h \ FXGLCanvas.h \ FXGLCone.h \ FXGLContext.h \ FXGLCube.h \ FXGLCylinder.h \ FXGLObject.h \ FXGLShape.h \ FXGLSphere.h \ FXGLTriangleMesh.h \ FXGLViewer.h \ FXGLVisual.h \ FXGroupBox.h \ FXGradientBar.h \ FXGUISignal.h \ FXGZFileStream.h \ FXHash.h \ FXHeader.h \ FXHorizontalFrame.h \ FXICOIcon.h \ FXICOImage.h \ FXIFFImage.h \ FXIFFIcon.h \ FXIO.h \ FXIcon.h \ FXIconDict.h \ FXIconList.h \ FXIconSource.h \ FXId.h \ FXImage.h \ FXImageFrame.h \ FXImageView.h \ FXInputDialog.h \ FXJPGIcon.h \ FXJPGImage.h \ FXKnob.h \ FXLabel.h \ FXList.h \ FXListBox.h \ FXMDIButton.h \ FXMDIChild.h \ FXMDIClient.h \ FXMainWindow.h \ FXMat3d.h \ FXMat4d.h \ FXMat3f.h \ FXMat4f.h \ FXMatrix.h \ FXMemoryStream.h \ FXMemMap.h \ FXMenuBar.h \ FXMenuButton.h \ FXMenuCaption.h \ FXMenuCascade.h \ FXMenuCheck.h \ FXMenuRadio.h \ FXMenuCommand.h \ FXMenuPane.h \ FXMenuSeparator.h \ FXMenuTitle.h \ FXMessageBox.h \ FXObject.h \ FXObjectList.h \ FXOptionMenu.h \ FXPCXIcon.h \ FXPCXImage.h \ FXPNGIcon.h \ FXPNGImage.h \ FXPPMIcon.h \ FXPPMImage.h \ FXPacker.h \ FXPath.h \ FXPicker.h \ FXPipe.h \ FXPoint.h \ FXPopup.h \ FXPrintDialog.h \ FXProgressBar.h \ FXProgressDialog.h \ FXQuatd.h \ FXQuatf.h \ FXRASIcon.h \ FXRASImage.h \ FXRGBIcon.h \ FXRGBImage.h \ FXRadioButton.h \ FXRangef.h \ FXRanged.h \ FXRealSlider.h \ FXRealSpinner.h \ FXRecentFiles.h \ FXRectangle.h \ FXRegion.h \ FXRegistry.h \ FXReplaceDialog.h \ FXRex.h \ FXRootWindow.h \ FXRuler.h \ FXRulerView.h \ FXScrollArea.h \ FXScrollBar.h \ FXScrollPane.h \ FXScrollWindow.h \ FXSearchDialog.h \ FXSeparator.h \ FXSettings.h \ FXShell.h \ FXShutter.h \ FXSize.h \ FXSlider.h \ FXSocket.h \ FXSpinner.h \ FXSpheref.h \ FXSphered.h \ FXSplashWindow.h \ FXSplitter.h \ FXSpring.h \ FXStat.h \ FXStatusBar.h \ FXStatusLine.h \ FXStream.h \ FXString.h \ FXStringDict.h \ FXSwitcher.h \ FXSystem.h \ FXTGAIcon.h \ FXTGAImage.h \ FXTIFIcon.h \ FXTIFImage.h \ FXTabBar.h \ FXTabBook.h \ FXTabItem.h \ FXTable.h \ FXText.h \ FXTextCodec.h \ FXTextField.h \ FXThread.h \ FXToggleButton.h \ FXToolBar.h \ FXToolBarGrip.h \ FXToolBarShell.h \ FXToolBarTab.h \ FXToolTip.h \ FXTopWindow.h \ FXTranslator.h \ FXTreeList.h \ FXTreeListBox.h \ FXTriStateButton.h \ FXUndoList.h \ FXURL.h \ FXVec2d.h \ FXVec2f.h \ FXVec3d.h \ FXVec3f.h \ FXVec4d.h \ FXVec4f.h \ FXVerticalFrame.h \ FXVisual.h \ FXWindow.h \ FXWizard.h \ FXXBMIcon.h \ FXXBMImage.h \ FXXPMIcon.h \ FXXPMImage.h \ fx.h \ fx3d.h \ fxascii.h \ fxdefs.h \ fxkeys.h \ fxunicode.h \ fxver.h \ xincs.h all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign include/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): fxver.h: $(top_builddir)/config.status $(srcdir)/fxver.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-foxincludeHEADERS: $(foxinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(foxinclude_HEADERS)'; test -n "$(foxincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(foxincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(foxincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(foxincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(foxincludedir)" || exit $$?; \ done uninstall-foxincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(foxinclude_HEADERS)'; test -n "$(foxincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(foxincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: for dir in "$(DESTDIR)$(foxincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-foxincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-foxincludeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-foxincludeHEADERS \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-foxincludeHEADERS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fox1.6-1.6.57/include/fx.h000066400000000000000000000150721326741342000150530ustar00rootroot00000000000000/******************************************************************************** * * * M a i n F O X I n c l u d e F i l e * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: fx.h,v 1.104 2006/01/22 17:58:13 fox Exp $ * ********************************************************************************/ #ifndef FX_H #define FX_H // Basic includes #include #include #include #include #include // FOX defines #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "fxunicode.h" // FOX classes #include "FXHash.h" #include "FXException.h" #include "FXThread.h" #include "FXStream.h" #include "FXIO.h" #include "FXFile.h" #include "FXPipe.h" #include "FXSocket.h" #include "FXFileStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObject.h" #include "FXDelegator.h" #include "FXDict.h" #include "FXPath.h" #include "FXSystem.h" #include "FXStat.h" #include "FXDir.h" #include "FXDate.h" #include "FXURL.h" #include "FXStringDict.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXObjectList.h" #include "FXAccelTable.h" #include "FXRecentFiles.h" #include "FXApp.h" #include "FXId.h" #include "FXVisual.h" #include "FXFont.h" #include "FXCursor.h" #include "FXGUISignal.h" #include "FXCURCursor.h" #include "FXGIFCursor.h" #include "FXDrawable.h" #include "FXBitmap.h" #include "FXImage.h" #include "FXIcon.h" #include "FXGIFImage.h" #include "FXIFFImage.h" #include "FXBMPImage.h" #include "FXICOImage.h" #include "FXXBMImage.h" #include "FXXPMImage.h" #include "FXPCXImage.h" #include "FXTGAImage.h" #include "FXRGBImage.h" #include "FXPPMImage.h" #include "FXRASImage.h" #include "FXGIFIcon.h" #include "FXIFFIcon.h" #include "FXBMPIcon.h" #include "FXICOIcon.h" #include "FXXBMIcon.h" #include "FXXPMIcon.h" #include "FXPCXIcon.h" #include "FXTGAIcon.h" #include "FXRGBIcon.h" #include "FXPPMIcon.h" #include "FXRASIcon.h" #include "FXRegion.h" #include "FXDC.h" #include "FXDCWindow.h" #include "FXDCPrint.h" #include "FXIconSource.h" #include "FXIconDict.h" #include "FXFileDict.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXSeparator.h" #include "FXLabel.h" #include "FX7Segment.h" #include "FXDial.h" #include "FXKnob.h" #include "FXColorBar.h" #include "FXColorRing.h" #include "FXColorWell.h" #include "FXColorWheel.h" #include "FXTextField.h" #include "FXButton.h" #include "FXPicker.h" #include "FXToggleButton.h" #include "FXTriStateButton.h" #include "FXCheckButton.h" #include "FXRadioButton.h" #include "FXArrowButton.h" #include "FXMenuButton.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXHorizontalFrame.h" #include "FXVerticalFrame.h" #include "FXSpring.h" #include "FXMatrix.h" #include "FXSpinner.h" #include "FXRealSpinner.h" #include "FXRootWindow.h" #include "FXCanvas.h" #include "FXGroupBox.h" #include "FXShell.h" #include "FXToolTip.h" #include "FXPopup.h" #include "FXTopWindow.h" #include "FXDialogBox.h" #include "FXMainWindow.h" #include "FXMenuPane.h" #include "FXScrollPane.h" #include "FXMenuCaption.h" #include "FXMenuSeparator.h" #include "FXMenuTitle.h" #include "FXMenuCascade.h" #include "FXMenuCommand.h" #include "FXMenuCheck.h" #include "FXMenuRadio.h" #include "FXMenuBar.h" #include "FXOptionMenu.h" #include "FXSwitcher.h" #include "FXTabBar.h" #include "FXTabBook.h" #include "FXTabItem.h" #include "FXScrollBar.h" #include "FXScrollArea.h" #include "FXScrollWindow.h" #include "FXList.h" #include "FXComboBox.h" #include "FXListBox.h" #include "FXTreeList.h" #include "FXTreeListBox.h" #include "FXFoldingList.h" #include "FXBitmapView.h" #include "FXBitmapFrame.h" #include "FXImageView.h" #include "FXImageFrame.h" #include "FXTable.h" #include "FXDragCorner.h" #include "FXStatusBar.h" #include "FXStatusLine.h" #include "FXChoiceBox.h" #include "FXMessageBox.h" #include "FXDirList.h" #include "FXSlider.h" #include "FXRealSlider.h" #include "FXSplitter.h" #include "FX4Splitter.h" #include "FXHeader.h" #include "FXShutter.h" #include "FXIconList.h" #include "FXFileList.h" #include "FXDirBox.h" #include "FXDriveBox.h" #include "FXDirSelector.h" #include "FXDirDialog.h" #include "FXFileSelector.h" #include "FXFileDialog.h" #include "FXColorSelector.h" #include "FXColorDialog.h" #include "FXFontSelector.h" #include "FXFontDialog.h" #include "FXUndoList.h" #include "FXRex.h" #include "FXText.h" #include "FXDataTarget.h" #include "FXProgressBar.h" #include "FXReplaceDialog.h" #include "FXRuler.h" #include "FXRulerView.h" #include "FXSearchDialog.h" #include "FXInputDialog.h" #include "FXProgressDialog.h" #include "FXWizard.h" #include "FXMDIButton.h" #include "FXMDIClient.h" #include "FXMDIChild.h" #include "FXDocument.h" #include "FXDockSite.h" #include "FXDockBar.h" #include "FXToolBar.h" #include "FXDockHandler.h" #include "FXDockTitle.h" #include "FXToolBarGrip.h" #include "FXToolBarShell.h" #include "FXToolBarTab.h" #include "FXPrintDialog.h" #include "FXDebugTarget.h" #include "FXSplashWindow.h" #ifndef FX_NO_GLOBAL_NAMESPACE using namespace FX; #endif #endif fox1.6-1.6.57/include/fx3d.h000066400000000000000000000055651326741342000153100ustar00rootroot00000000000000/******************************************************************************** * * * A d d i t i o n a l F O X I n c l u d e F i l e F o r 3 D * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: fx3d.h,v 1.22 2006/01/22 17:58:13 fox Exp $ * ********************************************************************************/ #ifndef FX3D_H #define FX3D_H // OpenGL includes #ifdef WIN32 #ifndef STRICT #define STRICT #endif #include #endif #ifdef HAVE_GL_H #include #endif #ifndef GLAPIENTRY #define GLAPIENTRY #endif #ifndef GLAPI #define GLAPI #endif #ifdef HAVE_GLU_H #include #endif // Additional FOX includes #include "FXVec2f.h" #include "FXVec2d.h" #include "FXVec3f.h" #include "FXVec3d.h" #include "FXVec4f.h" #include "FXVec4d.h" #include "FXQuatf.h" #include "FXQuatd.h" #include "FXMat3f.h" #include "FXMat3d.h" #include "FXMat4f.h" #include "FXMat4d.h" #include "FXRangef.h" #include "FXRanged.h" #include "FXSpheref.h" #include "FXSphered.h" #include "FXExtentf.h" #include "FXExtentd.h" #include "FXGLVisual.h" #include "FXGLContext.h" #include "FXGLCanvas.h" #include "FXGLViewer.h" #include "FXGLObject.h" #include "FXGLShape.h" #include "FXGLCone.h" #include "FXGLCube.h" #include "FXGLCylinder.h" #include "FXGLSphere.h" #include "FXGLTriangleMesh.h" #ifndef FX_NO_GLOBAL_NAMESPACE using namespace FX; #endif #endif fox1.6-1.6.57/include/fxascii.h000066400000000000000000000055611326741342000160660ustar00rootroot00000000000000/******************************************************************************** * * * A S C I I C h a r a c t e r I n f o * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: fxascii.h,v 1.3 2006/01/22 17:58:13 fox Exp $ * ********************************************************************************/ #ifndef FXASCII_H #define FXASCII_H namespace FX { namespace Ascii { /// Get numeric value of character (this includes hex value) extern FXAPI FXint digitValue(FXchar asc); /// Ascii-only common functions extern FXAPI bool hasCase(FXchar asc); extern FXAPI bool isUpper(FXchar asc); extern FXAPI bool isLower(FXchar asc); extern FXAPI bool isTitle(FXchar asc); extern FXAPI bool isAscii(FXchar asc); extern FXAPI bool isLetter(FXchar asc); extern FXAPI bool isDigit(FXchar asc); extern FXAPI bool isAlphaNumeric(FXchar asc); extern FXAPI bool isControl(FXchar asc); extern FXAPI bool isSpace(FXchar asc); extern FXAPI bool isBlank(FXchar asc); extern FXAPI bool isPunct(FXchar asc); extern FXAPI bool isGraph(FXchar asc); extern FXAPI bool isPrint(FXchar asc); extern FXAPI bool isHexDigit(FXchar asc); extern FXAPI bool isSymbol(FXchar asc); extern FXAPI bool isSep(FXchar asc); /// Case conversion extern FXAPI FXchar toUpper(FXchar asc); extern FXAPI FXchar toLower(FXchar asc); extern FXAPI FXchar toTitle(FXchar asc); } } #endif fox1.6-1.6.57/include/fxdefs.h000066400000000000000000000717711326741342000157250ustar00rootroot00000000000000/******************************************************************************** * * * FOX Definitions, Types, and Macros * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: fxdefs.h,v 1.178.2.2 2006/11/09 23:21:43 fox Exp $ * ********************************************************************************/ #ifndef FXDEFS_H #define FXDEFS_H /******************************** Definitions ********************************/ // Truth values #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef MAYBE #define MAYBE 2 #endif #ifndef NULL #define NULL 0 #endif /// Pi #ifndef PI #define PI 3.1415926535897932384626433833 #endif /// Euler constant #define EULER 2.7182818284590452353602874713 /// Multiplier for degrees to radians #define DTOR 0.0174532925199432957692369077 /// Multiplier for radians to degrees #define RTOD 57.295779513082320876798154814 // Path separator #ifdef WIN32 #define PATHSEP '\\' #define PATHSEPSTRING "\\" #define PATHLISTSEP ';' #define PATHLISTSEPSTRING ";" #define ISPATHSEP(c) ((c)=='/' || (c)=='\\') #else #define PATHSEP '/' #define PATHSEPSTRING "/" #define PATHLISTSEP ':' #define PATHLISTSEPSTRING ":" #define ISPATHSEP(c) ((c)=='/') #endif // End Of Line #ifdef WIN32 #define ENDLINE "\r\n" #else #define ENDLINE "\n" #endif // For Windows #ifdef _DEBUG #ifndef DEBUG #define DEBUG #endif #endif #ifdef _NDEBUG #ifndef NDEBUG #define NDEBUG #endif #endif // Shared library support #ifdef WIN32 #define FXLOCAL #define FXEXPORT __declspec(dllexport) #define FXIMPORT __declspec(dllimport) #else #if defined(__GNUC__) && (__GNUC__ >= 4) #define FXLOCAL __attribute__ ((visibility("hidden"))) #define FXEXPORT __attribute__ ((visibility("default"))) #define FXIMPORT #else #define FXLOCAL #define FXEXPORT #define FXIMPORT #endif #endif // Define FXAPI for DLL builds #ifdef FOXDLL #ifdef FOXDLL_EXPORTS #define FXAPI FXEXPORT #define FXTEMPLATE_EXTERN #else #define FXAPI FXIMPORT #define FXTEMPLATE_EXTERN extern #endif #else #define FXAPI #define FXTEMPLATE_EXTERN #endif // Callback #ifdef WIN32 #ifndef CALLBACK #define CALLBACK __stdcall #endif #endif // Checking printf and scanf format strings #if defined(_CC_GNU_) || defined(__GNUG__) || defined(__GNUC__) #define FX_PRINTF(fmt,arg) __attribute__((format(printf,fmt,arg))) #define FX_SCANF(fmt,arg) __attribute__((format(scanf,fmt,arg))) #else #define FX_PRINTF(fmt,arg) #define FX_SCANF(fmt,arg) #endif // Raw event type #ifndef WIN32 union _XEvent; #else struct tagMSG; #endif namespace FX { // FOX System Defined Selector Types enum FXSelType { SEL_NONE, SEL_KEYPRESS, /// Key pressed SEL_KEYRELEASE, /// Key released SEL_LEFTBUTTONPRESS, /// Left mouse button pressed SEL_LEFTBUTTONRELEASE, /// Left mouse button released SEL_MIDDLEBUTTONPRESS, /// Middle mouse button pressed SEL_MIDDLEBUTTONRELEASE, /// Middle mouse button released SEL_RIGHTBUTTONPRESS, /// Right mouse button pressed SEL_RIGHTBUTTONRELEASE, /// Right mouse button released SEL_MOTION, /// Mouse motion SEL_ENTER, /// Mouse entered window SEL_LEAVE, /// Mouse left window SEL_FOCUSIN, /// Focus into window SEL_FOCUSOUT, /// Focus out of window SEL_KEYMAP, SEL_UNGRABBED, /// Lost the grab (Windows) SEL_PAINT, /// Must repaint window SEL_CREATE, SEL_DESTROY, SEL_UNMAP, /// Window was hidden SEL_MAP, /// Window was shown SEL_CONFIGURE, /// Resize SEL_SELECTION_LOST, /// Widget lost selection SEL_SELECTION_GAINED, /// Widget gained selection SEL_SELECTION_REQUEST, /// Inquire selection data SEL_RAISED, /// Window to top of stack SEL_LOWERED, /// Window to bottom of stack SEL_CLOSE, /// Close window SEL_DELETE, /// Delete window SEL_MINIMIZE, /// Iconified SEL_RESTORE, /// No longer iconified or maximized SEL_MAXIMIZE, /// Maximized SEL_UPDATE, /// GUI update SEL_COMMAND, /// GUI command SEL_CLICKED, /// Clicked SEL_DOUBLECLICKED, /// Double-clicked SEL_TRIPLECLICKED, /// Triple-clicked SEL_MOUSEWHEEL, /// Mouse wheel SEL_CHANGED, /// GUI has changed SEL_VERIFY, /// Verify change SEL_DESELECTED, /// Deselected SEL_SELECTED, /// Selected SEL_INSERTED, /// Inserted SEL_REPLACED, /// Replaced SEL_DELETED, /// Deleted SEL_OPENED, /// Opened SEL_CLOSED, /// Closed SEL_EXPANDED, /// Expanded SEL_COLLAPSED, /// Collapsed SEL_BEGINDRAG, /// Start a drag SEL_ENDDRAG, /// End a drag SEL_DRAGGED, /// Dragged SEL_LASSOED, /// Lassoed SEL_TIMEOUT, /// Timeout occurred SEL_SIGNAL, /// Signal received SEL_CLIPBOARD_LOST, /// Widget lost clipboard SEL_CLIPBOARD_GAINED, /// Widget gained clipboard SEL_CLIPBOARD_REQUEST, /// Inquire clipboard data SEL_CHORE, /// Background chore SEL_FOCUS_SELF, /// Focus on widget itself SEL_FOCUS_RIGHT, /// Focus moved right SEL_FOCUS_LEFT, /// Focus moved left SEL_FOCUS_DOWN, /// Focus moved down SEL_FOCUS_UP, /// Focus moved up SEL_FOCUS_NEXT, /// Focus moved to next widget SEL_FOCUS_PREV, /// Focus moved to previous widget SEL_DND_ENTER, /// Drag action entering potential drop target SEL_DND_LEAVE, /// Drag action leaving potential drop target SEL_DND_DROP, /// Drop on drop target SEL_DND_MOTION, /// Drag position changed over potential drop target SEL_DND_REQUEST, /// Inquire drag and drop data SEL_IO_READ, /// Read activity on a pipe SEL_IO_WRITE, /// Write activity on a pipe SEL_IO_EXCEPT, /// Except activity on a pipe SEL_PICKED, /// Picked some location SEL_QUERY_TIP, /// Message inquiring about tooltip SEL_QUERY_HELP, /// Message inquiring about statusline help SEL_DOCKED, /// Toolbar docked SEL_FLOATED, /// Toolbar floated SEL_SESSION_NOTIFY, /// Session is about to close SEL_SESSION_CLOSED, /// Session is closed SEL_LAST }; /// FOX Keyboard and Button states enum { SHIFTMASK = 0x001, /// Shift key is down CAPSLOCKMASK = 0x002, /// Caps Lock key is down CONTROLMASK = 0x004, /// Ctrl key is down #ifdef __APPLE__ ALTMASK = 0x2000, /// Alt key is down METAMASK = 0x10, /// Meta key is down #else ALTMASK = 0x008, /// Alt key is down METAMASK = 0x040, /// Meta key is down #endif NUMLOCKMASK = 0x010, /// Num Lock key is down SCROLLLOCKMASK = 0x0E0, /// Scroll Lock key is down (seems to vary) LEFTBUTTONMASK = 0x100, /// Left mouse button is down MIDDLEBUTTONMASK = 0x200, /// Middle mouse button is down RIGHTBUTTONMASK = 0x400 /// Right mouse button is down }; /// FOX Mouse buttons enum { LEFTBUTTON = 1, MIDDLEBUTTON = 2, RIGHTBUTTON = 3 }; /// FOX window crossing modes enum { CROSSINGNORMAL, /// Normal crossing event CROSSINGGRAB, /// Crossing due to mouse grab CROSSINGUNGRAB /// Crossing due to mouse ungrab }; /// FOX window visibility modes enum { VISIBILITYTOTAL, VISIBILITYPARTIAL, VISIBILITYNONE }; /// Options for fxfilematch enum { FILEMATCH_FILE_NAME = 1, /// No wildcard can ever match `/' FILEMATCH_NOESCAPE = 2, /// Backslashes don't quote special chars FILEMATCH_PERIOD = 4, /// Leading `.' is matched only explicitly FILEMATCH_LEADING_DIR = 8, /// Ignore `/...' after a match FILEMATCH_CASEFOLD = 16 /// Compare without regard to case }; /// Drag and drop actions enum FXDragAction { DRAG_REJECT = 0, /// Reject all drop actions DRAG_ACCEPT = 1, /// Accept any drop action DRAG_COPY = 2, /// Copy DRAG_MOVE = 3, /// Move DRAG_LINK = 4, /// Link DRAG_PRIVATE = 5 /// Private }; /// Origin of data enum FXDNDOrigin { FROM_SELECTION = 0, /// Primary selection FROM_CLIPBOARD = 1, /// Clipboard FROM_DRAGNDROP = 2 /// Drag and drop source }; /// Exponent display enum FXExponent { EXP_NEVER=FALSE, /// Never use exponential notation EXP_ALWAYS=TRUE, /// Always use exponential notation EXP_AUTO=MAYBE /// Use exponential notation if needed }; /// Search modes for search/replace dialogs enum { SEARCH_FORWARD = 0, /// Search forward (default) SEARCH_BACKWARD = 1, /// Search backward SEARCH_NOWRAP = 0, /// Don't wrap (default) SEARCH_WRAP = 2, /// Wrap around to start SEARCH_EXACT = 0, /// Exact match (default) SEARCH_IGNORECASE = 4, /// Ignore case SEARCH_REGEX = 8, /// Regular expression match SEARCH_PREFIX = 16 /// Prefix of subject string }; /********************************* Typedefs **********************************/ // Forward declarations class FXObject; class FXStream; class FXString; // Streamable types; these are fixed size! typedef char FXchar; typedef unsigned char FXuchar; typedef FXuchar FXbool; typedef unsigned short FXushort; typedef short FXshort; typedef unsigned int FXuint; typedef int FXint; typedef float FXfloat; typedef double FXdouble; typedef FXObject *FXObjectPtr; #ifdef WIN32 typedef unsigned int FXwchar; #if defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED) typedef unsigned short FXnchar; #elif defined(__WATCOM_INT64__) typedef long char FXnchar; #else typedef wchar_t FXnchar; #endif #else typedef wchar_t FXwchar; typedef unsigned short FXnchar; #endif #if defined(__LP64__) || defined(_LP64) || (_MIPS_SZLONG == 64) || (__WORDSIZE == 64) typedef unsigned long FXulong; typedef long FXlong; #elif defined(_MSC_VER) || (defined(__BCPLUSPLUS__) && __BORLANDC__ > 0x500) || defined(__WATCOM_INT64__) typedef unsigned __int64 FXulong; typedef __int64 FXlong; #elif defined(__GNUG__) || defined(__GNUC__) || defined(__SUNPRO_CC) || defined(__MWERKS__) || defined(__SC__) || defined(_LONGLONG) typedef unsigned long long FXulong; typedef long long FXlong; #else #error "FXlong and FXulong not defined for this architecture!" #endif // Integral types large enough to hold value of a pointer #if defined(_MSC_VER) && defined(_WIN64) typedef __int64 FXival; typedef unsigned __int64 FXuval; #elif defined(__GNUC__) && defined(_WIN64) typedef long long FXival; typedef unsigned long long FXuval; #else typedef long FXival; typedef unsigned long FXuval; #endif // Handle to something in server #ifndef WIN32 typedef unsigned long FXID; #else typedef void* FXID; #endif // Time since January 1, 1970 (UTC) typedef long FXTime; // Pixel type (could be color index) typedef unsigned long FXPixel; // RGBA pixel value typedef FXuint FXColor; // Hot key typedef FXuint FXHotKey; // Drag type #ifndef WIN32 typedef FXID FXDragType; #else typedef FXushort FXDragType; #endif // Input source handle type #ifndef WIN32 typedef FXint FXInputHandle; #else typedef void* FXInputHandle; #endif // Raw event type #ifndef WIN32 typedef _XEvent FXRawEvent; #else typedef tagMSG FXRawEvent; #endif /********************************** Macros ***********************************/ /// Abolute value #define FXABS(val) (((val)>=0)?(val):-(val)) /// Return the maximum of a or b #define FXMAX(a,b) (((a)>(b))?(a):(b)) /// Return the minimum of a or b #define FXMIN(a,b) (((a)>(b))?(b):(a)) /// Return the minimum of x, y and z #define FXMIN3(x,y,z) ((x)<(y)?FXMIN(x,z):FXMIN(y,z)) /// Return the maximum of x, y and z #define FXMAX3(x,y,z) ((x)>(y)?FXMAX(x,z):FXMAX(y,z)) /// Return the minimum of x, y, z, and w #define FXMIN4(x,y,z,w) (FXMIN(FXMIN(x,y),FXMIN(z,w))) /// Return the maximum of of x, y, z, and w #define FXMAX4(x,y,z,w) (FXMAX(FXMAX(x,y),FXMAX(z,w))) /// Return minimum and maximum of a, b #define FXMINMAX(lo,hi,a,b) ((a)<(b)?((lo)=(a),(hi)=(b)):((lo)=(b),(hi)=(a))) /// Clamp value x to range [lo..hi] #define FXCLAMP(lo,x,hi) ((x)<(lo)?(lo):((x)>(hi)?(hi):(x))) /// Swap a pair of numbers #define FXSWAP(a,b,t) ((t)=(a),(a)=(b),(b)=(t)) /// Linear interpolation between a and b, where 0<=f<=1 #define FXLERP(a,b,f) ((a)+((b)-(a))*(f)) /// Offset of member in a structure #define STRUCTOFFSET(str,member) (((char *)(&(((str *)0)->member)))-((char *)0)) /// Number of elements in a static array #define ARRAYNUMBER(array) (sizeof(array)/sizeof(array[0])) /// Container class of a member class #define CONTAINER(ptr,str,mem) ((str*)(((char*)(ptr))-STRUCTOFFSET(str,mem))) /// Make int out of two shorts #define MKUINT(l,h) ((((FX::FXuint)(l))&0xffff) | (((FX::FXuint)(h))<<16)) /// Make selector from message type and message id #define FXSEL(type,id) ((((FX::FXuint)(id))&0xffff) | (((FX::FXuint)(type))<<16)) /// Get type from selector #define FXSELTYPE(s) ((FX::FXushort)(((s)>>16)&0xffff)) /// Get ID from selector #define FXSELID(s) ((FX::FXushort)((s)&0xffff)) /// Reverse bits in byte #define FXBITREVERSE(b) (((b&0x01)<<7)|((b&0x02)<<5)|((b&0x04)<<3)|((b&0x08)<<1)|((b&0x10)>>1)|((b&0x20)>>3)|((b&0x40)>>5)|((b&0x80)>>7)) /// Test if character c is at the start of a utf8 sequence #define FXISUTF(c) (((c)&0xC0)!=0x80) // Definitions for big-endian machines #if FOX_BIGENDIAN == 1 /// Make RGBA color #define FXRGBA(r,g,b,a) (((FX::FXuint)(FX::FXuchar)(r)<<24) | ((FX::FXuint)(FX::FXuchar)(g)<<16) | ((FX::FXuint)(FX::FXuchar)(b)<<8) | ((FX::FXuint)(FX::FXuchar)(a))) /// Make RGB color #define FXRGB(r,g,b) (((FX::FXuint)(FX::FXuchar)(r)<<24) | ((FX::FXuint)(FX::FXuchar)(g)<<16) | ((FX::FXuint)(FX::FXuchar)(b)<<8) | 0x000000ff) /// Get red value from RGBA color #define FXREDVAL(rgba) ((FX::FXuchar)(((rgba)>>24)&0xff)) /// Get green value from RGBA color #define FXGREENVAL(rgba) ((FX::FXuchar)(((rgba)>>16)&0xff)) /// Get blue value from RGBA color #define FXBLUEVAL(rgba) ((FX::FXuchar)(((rgba)>>8)&0xff)) /// Get alpha value from RGBA color #define FXALPHAVAL(rgba) ((FX::FXuchar)((rgba)&0xff)) /// Get component value of RGBA color #define FXRGBACOMPVAL(rgba,comp) ((FX::FXuchar)(((rgba)>>((3-(comp))<<3))&0xff)) #endif // Definitions for little-endian machines #if FOX_BIGENDIAN == 0 /// Make RGBA color #define FXRGBA(r,g,b,a) (((FX::FXuint)(FX::FXuchar)(r)) | ((FX::FXuint)(FX::FXuchar)(g)<<8) | ((FX::FXuint)(FX::FXuchar)(b)<<16) | ((FX::FXuint)(FX::FXuchar)(a)<<24)) /// Make RGB color #define FXRGB(r,g,b) (((FX::FXuint)(FX::FXuchar)(r)) | ((FX::FXuint)(FX::FXuchar)(g)<<8) | ((FX::FXuint)(FX::FXuchar)(b)<<16) | 0xff000000) /// Get red value from RGBA color #define FXREDVAL(rgba) ((FX::FXuchar)((rgba)&0xff)) /// Get green value from RGBA color #define FXGREENVAL(rgba) ((FX::FXuchar)(((rgba)>>8)&0xff)) /// Get blue value from RGBA color #define FXBLUEVAL(rgba) ((FX::FXuchar)(((rgba)>>16)&0xff)) /// Get alpha value from RGBA color #define FXALPHAVAL(rgba) ((FX::FXuchar)(((rgba)>>24)&0xff)) /// Get component value of RGBA color #define FXRGBACOMPVAL(rgba,comp) ((FX::FXuchar)(((rgba)>>((comp)<<3))&0xff)) #endif /** * FXASSERT() prints out a message when the expression fails, * and nothing otherwise. Unlike assert(), FXASSERT() will not * terminate the execution of the application. * When compiling your application for release, all assertions * are compiled out; thus there is no impact on execution speed. */ #ifndef NDEBUG #define FXASSERT(exp) ((exp)?((void)0):(void)FX::fxassert(#exp,__FILE__,__LINE__)) #else #define FXASSERT(exp) ((void)0) #endif /** * FXTRACE() allows you to trace the execution of your application * with increasing levels of detail the higher the trace level. * The trace level is determined by variable fxTraceLevel, which * may be set from the command line with "-tracelevel ". * When compiling your application for release, all trace statements * are compiled out, just like FXASSERT. * A statement like: FXTRACE((10,"The value of x=%d\n",x)) will * generate output only if fxTraceLevel is set to 11 or greater. * The default value fxTraceLevel=0 will block all trace outputs. * Note the double parentheses! */ #ifndef NDEBUG #define FXTRACE(arguments) FX::fxtrace arguments #else #define FXTRACE(arguments) ((void)0) #endif /** * Allocate a memory block of no elements of type and store a pointer * to it into the address pointed to by ptr. * Return FALSE if size!=0 and allocation fails, TRUE otherwise. * An allocation of a zero size block returns a NULL pointer. */ #define FXMALLOC(ptr,type,no) (FX::fxmalloc((void **)(ptr),sizeof(type)*(no))) /** * Allocate a zero-filled memory block no elements of type and store a pointer * to it into the address pointed to by ptr. * Return FALSE if size!=0 and allocation fails, TRUE otherwise. * An allocation of a zero size block returns a NULL pointer. */ #define FXCALLOC(ptr,type,no) (FX::fxcalloc((void **)(ptr),sizeof(type)*(no))) /** * Resize the memory block referred to by the pointer at the address ptr, to a * hold no elements of type. * Returns FALSE if size!=0 and reallocation fails, TRUE otherwise. * If reallocation fails, pointer is left to point to old block; a reallocation * to a zero size block has the effect of freeing it. * The ptr argument must be the address where the pointer to the allocated * block is to be stored. */ #define FXRESIZE(ptr,type,no) (FX::fxresize((void **)(ptr),sizeof(type)*(no))) /** * Allocate and initialize memory from another block. * Return FALSE if size!=0 and source!=NULL and allocation fails, TRUE otherwise. * An allocation of a zero size block returns a NULL pointer. * The ptr argument must be the address where the pointer to the allocated * block is to be stored. */ #define FXMEMDUP(ptr,src,type,no) (FX::fxmemdup((void **)(ptr),(const void*)(src),sizeof(type)*(no))) /** * Free a block of memory allocated with either FXMALLOC, FXCALLOC, FXRESIZE, or FXMEMDUP. * It is OK to call free a NULL pointer. The argument must be the address of the * pointer to the block to be released. The pointer is set to NULL to prevent * any further references to the block after releasing it. */ #define FXFREE(ptr) (FX::fxfree((void **)(ptr))) /** * These are some of the ISO C99 standard single-precision transcendental functions. * On LINUX, specify _GNU_SOURCE or _ISOC99_SOURCE to enable native implementation; * otherwise, these macros will be used. Apple OS-X implements fabsf(x), ceilf(x), * floorf(x), and fmodf(x,y). * Define FLOAT_MATH_FUNCTIONS if these functions are available in some other * library you're linking to. */ #ifdef __OpenBSD__ #define FLOAT_MATH_FUNCTIONS #endif #ifndef FLOAT_MATH_FUNCTIONS #ifndef __USE_ISOC99 #ifndef __APPLE__ #define fabsf(x) ((float)fabs((double)(x))) #define ceilf(x) ((float)ceil((double)(x))) #define floorf(x) ((float)floor((double)(x))) #define fmodf(x,y) ((float)fmod((double)(x),(double)(y))) #endif #define sqrtf(x) ((float)sqrt((double)(x))) #define sinf(x) ((float)sin((double)(x))) #define cosf(x) ((float)cos((double)(x))) #define tanf(x) ((float)tan((double)(x))) #define asinf(x) ((float)asin((double)(x))) #define acosf(x) ((float)acos((double)(x))) #define atanf(x) ((float)atan((double)(x))) #define atan2f(y,x) ((float)atan2((double)(y),(double)(x))) #define powf(x,y) ((float)pow((double)(x),(double)(y))) #define expf(x) ((float)exp((double)(x))) #define logf(x) ((float)log((double)(x))) #define log10f(x) ((float)log10((double)(x))) #endif #endif /********************************** Globals **********************************/ /// Simple, thread-safe, random number generator extern FXAPI FXuint fxrandom(FXuint& seed); /// Allocate memory extern FXAPI FXint fxmalloc(void** ptr,unsigned long size); /// Allocate cleaned memory extern FXAPI FXint fxcalloc(void** ptr,unsigned long size); /// Resize memory extern FXAPI FXint fxresize(void** ptr,unsigned long size); /// Duplicate memory extern FXAPI FXint fxmemdup(void** ptr,const void* src,unsigned long size); /// Free memory, resets ptr to NULL afterward extern FXAPI void fxfree(void** ptr); /// Error routine extern FXAPI void fxerror(const char* format,...) FX_PRINTF(1,2) ; /// Warning routine extern FXAPI void fxwarning(const char* format,...) FX_PRINTF(1,2) ; /// Log message to [typically] stderr extern FXAPI void fxmessage(const char* format,...) FX_PRINTF(1,2) ; /// Assert failed routine:- usually not called directly but called through FXASSERT extern FXAPI void fxassert(const char* expression,const char* filename,unsigned int lineno); /// Trace printout routine:- usually not called directly but called through FXTRACE extern FXAPI void fxtrace(unsigned int level,const char* format,...) FX_PRINTF(2,3) ; /// Sleep n microseconds extern FXAPI void fxsleep(unsigned int n); /// Match a file name with a pattern extern FXAPI bool fxfilematch(const char *pattern,const char *string,FXuint flags=(FILEMATCH_NOESCAPE|FILEMATCH_FILE_NAME)); /// Get highlight color extern FXAPI FXColor makeHiliteColor(FXColor clr); /// Get shadow color extern FXAPI FXColor makeShadowColor(FXColor clr); /// Get process id extern FXAPI FXint fxgetpid(); /// Convert string of length len to MSDOS; return new string and new length extern FXAPI bool fxtoDOS(FXchar*& string,FXint& len); /// Convert string of length len from MSDOS; return new string and new length extern FXAPI bool fxfromDOS(FXchar*& string,FXint& len); /// Duplicate string extern FXAPI FXchar *fxstrdup(const FXchar* str); /// Calculate a hash value from a string extern FXAPI FXuint fxstrhash(const FXchar* str); /// Get RGB value from color name extern FXAPI FXColor fxcolorfromname(const FXchar* colorname); /// Get name of (closest) color to RGB extern FXAPI FXchar* fxnamefromcolor(FXchar *colorname,FXColor color); /// Convert RGB to HSV extern FXAPI void fxrgb_to_hsv(FXfloat& h,FXfloat& s,FXfloat& v,FXfloat r,FXfloat g,FXfloat b); /// Convert HSV to RGB extern FXAPI void fxhsv_to_rgb(FXfloat& r,FXfloat& g,FXfloat& b,FXfloat h,FXfloat s,FXfloat v); /// Floating point number classification: 0=OK, +/-1=Inf, +/-2=NaN extern FXAPI FXint fxieeefloatclass(FXfloat number); extern FXAPI FXint fxieeedoubleclass(FXdouble number); /// Convert keysym to unicode character extern FXAPI FXwchar fxkeysym2ucs(FXwchar sym); /// Convert unicode character to keysym extern FXAPI FXwchar fxucs2keysym(FXwchar ucs); /// Parse geometry, a-la X11 geometry specification extern FXAPI FXint fxparsegeometry(const FXchar *string,FXint& x,FXint& y,FXint& w,FXint& h); /// True if executable with given path is a console application extern FXAPI FXbool fxisconsole(const FXchar *path); /// Version number that the library has been compiled with extern FXAPI const FXuchar fxversion[3]; /// Controls tracing level extern FXAPI unsigned int fxTraceLevel; /// Return wide character from utf8 string at ptr extern FXAPI FXwchar wc(const FXchar *ptr); /// Return wide character from utf16 string at ptr extern FXAPI FXwchar wc(const FXnchar *ptr); /// Return number of FXchar's of wide character at ptr extern FXAPI FXint wclen(const FXchar *ptr); /// Return number of FXnchar's of narrow character at ptr extern FXAPI FXint wclen(const FXnchar *ptr); /// Return start of utf8 character containing position extern FXAPI FXint wcvalidate(const FXchar* string,FXint pos); /// Return start of utf16 character containing position extern FXAPI FXint wcvalidate(const FXnchar *string,FXint pos); /// Advance to next utf8 character start extern FXAPI FXint wcinc(const FXchar* string,FXint pos); /// Advance to next utf16 character start extern FXAPI FXint wcinc(const FXnchar *string,FXint pos); /// Retreat to previous utf8 character start extern FXAPI FXint wcdec(const FXchar* string,FXint pos); /// Retreat to previous utf16 character start extern FXAPI FXint wcdec(const FXnchar *string,FXint pos); /// Length of utf8 representation of wide characters string str of length n extern FXAPI FXint utfslen(const FXwchar *str,FXint n); /// Length of utf8 representation of wide character string str extern FXAPI FXint utfslen(const FXwchar *str); /// Length of utf8 representation of narrow characters string str of length n extern FXAPI FXint utfslen(const FXnchar *str,FXint n); /// Length of utf8 representation of narrow characters string str extern FXAPI FXint utfslen(const FXnchar *str); /// Length of wide character representation of utf8 string str of length n extern FXAPI FXint wcslen(const FXchar *str,FXint n); /// Length of wide character representation of utf8 string str extern FXAPI FXint wcslen(const FXchar *str); /// Length of narrow character representation of utf8 string str of length n extern FXAPI FXint ncslen(const FXchar *str,FXint n); /// Length of narrow character representation of utf8 string str extern FXAPI FXint ncslen(const FXchar *str); /// Copy utf8 string of length n to wide character string dst extern FXAPI FXint utf2wcs(FXwchar *dst,const FXchar *src,FXint n); /// Copy utf8 string to wide character string dst extern FXAPI FXint utf2wcs(FXwchar *dst,const FXchar *src); /// Copy utf8 string of length n to narrow character string dst extern FXAPI FXint utf2ncs(FXnchar *dst,const FXchar *src,FXint n); /// Copy utf8 string to narrow character string dst extern FXAPI FXint utf2ncs(FXnchar *dst,const FXchar *src); /// Copy wide character substring of length n to dst extern FXAPI FXint wc2utfs(FXchar* dst,const FXwchar *src,FXint n); /// Copy wide character string to dst extern FXAPI FXint wc2utfs(FXchar* dst,const FXwchar *src); /// Copy narrow character substring of length n to dst extern FXAPI FXint nc2utfs(FXchar* dst,const FXnchar *src,FXint n); /// Copy narrow character string to dst extern FXAPI FXint nc2utfs(FXchar* dst,const FXnchar *src); } #endif fox1.6-1.6.57/include/fxkeys.h000066400000000000000000001724601326741342000157540ustar00rootroot00000000000000/******************************************************************************** * * * F O X K e y b o a r d S y m b o l D e f i n i t i o n s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: fxkeys.h,v 1.14 2006/03/07 05:30:46 fox Exp $ * ********************************************************************************/ #ifndef FXKEYS_H #define FXKEYS_H namespace FX { enum { // Void symbol KEY_VoidSymbol = 0, // Miscellaneous KEY_BackSpace = 0xFF08, KEY_Tab = 0xFF09, KEY_Linefeed = 0xFF0A, KEY_Clear = 0xFF0B, KEY_Return = 0xFF0D, KEY_Pause = 0xFF13, KEY_Scroll_Lock = 0xFF14, KEY_Sys_Req = 0xFF15, KEY_Escape = 0xFF1B, KEY_Delete = 0xFFFF, KEY_Multi_key = 0xFF20, // Japanese KEY_Kanji = 0xFF21, KEY_Muhenkan = 0xFF22, KEY_Henkan_Mode = 0xFF23, KEY_Henkan = 0xFF23, KEY_Romaji = 0xFF24, KEY_Hiragana = 0xFF25, KEY_Katakana = 0xFF26, KEY_Hiragana_Katakana = 0xFF27, KEY_Zenkaku = 0xFF28, KEY_Hankaku = 0xFF29, KEY_Zenkaku_Hankaku = 0xFF2A, KEY_Touroku = 0xFF2B, KEY_Massyo = 0xFF2C, KEY_Kana_Lock = 0xFF2D, KEY_Kana_Shift = 0xFF2E, KEY_Eisu_Shift = 0xFF2F, KEY_Eisu_toggle = 0xFF30, // Cursor KEY_Home = 0xFF50, KEY_Left = 0xFF51, KEY_Up = 0xFF52, KEY_Right = 0xFF53, KEY_Down = 0xFF54, KEY_Prior = 0xFF55, KEY_Page_Up = 0xFF55, KEY_Next = 0xFF56, KEY_Page_Down = 0xFF56, KEY_End = 0xFF57, KEY_Begin = 0xFF58, // Functions KEY_Select = 0xFF60, KEY_Print = 0xFF61, KEY_Execute = 0xFF62, KEY_Insert = 0xFF63, KEY_Undo = 0xFF65, KEY_Redo = 0xFF66, KEY_Menu = 0xFF67, KEY_Find = 0xFF68, KEY_Cancel = 0xFF69, KEY_Help = 0xFF6A, KEY_Break = 0xFF6B, KEY_Mode_switch = 0xFF7E, KEY_script_switch = 0xFF7E, KEY_Num_Lock = 0xFF7F, // Keypad KEY_KP_Space = 0xFF80, KEY_KP_Tab = 0xFF89, KEY_KP_Enter = 0xFF8D, KEY_KP_F1 = 0xFF91, KEY_KP_F2 = 0xFF92, KEY_KP_F3 = 0xFF93, KEY_KP_F4 = 0xFF94, KEY_KP_Home = 0xFF95, KEY_KP_Left = 0xFF96, KEY_KP_Up = 0xFF97, KEY_KP_Right = 0xFF98, KEY_KP_Down = 0xFF99, KEY_KP_Prior = 0xFF9A, KEY_KP_Page_Up = 0xFF9A, KEY_KP_Next = 0xFF9B, KEY_KP_Page_Down = 0xFF9B, KEY_KP_End = 0xFF9C, KEY_KP_Begin = 0xFF9D, KEY_KP_Insert = 0xFF9E, KEY_KP_Delete = 0xFF9F, KEY_KP_Equal = 0xFFBD, KEY_KP_Multiply = 0xFFAA, KEY_KP_Add = 0xFFAB, KEY_KP_Separator = 0xFFAC, KEY_KP_Subtract = 0xFFAD, KEY_KP_Decimal = 0xFFAE, KEY_KP_Divide = 0xFFAF, // Keypad numbers KEY_KP_0 = 0xFFB0, KEY_KP_1 = 0xFFB1, KEY_KP_2 = 0xFFB2, KEY_KP_3 = 0xFFB3, KEY_KP_4 = 0xFFB4, KEY_KP_5 = 0xFFB5, KEY_KP_6 = 0xFFB6, KEY_KP_7 = 0xFFB7, KEY_KP_8 = 0xFFB8, KEY_KP_9 = 0xFFB9, // Function keys KEY_F1 = 0xFFBE, KEY_F2 = 0xFFBF, KEY_F3 = 0xFFC0, KEY_F4 = 0xFFC1, KEY_F5 = 0xFFC2, KEY_F6 = 0xFFC3, KEY_F7 = 0xFFC4, KEY_F8 = 0xFFC5, KEY_F9 = 0xFFC6, KEY_F10 = 0xFFC7, KEY_F11 = 0xFFC8, KEY_L1 = 0xFFC8, KEY_F12 = 0xFFC9, KEY_L2 = 0xFFC9, KEY_F13 = 0xFFCA, KEY_L3 = 0xFFCA, KEY_F14 = 0xFFCB, KEY_L4 = 0xFFCB, KEY_F15 = 0xFFCC, KEY_L5 = 0xFFCC, KEY_F16 = 0xFFCD, KEY_L6 = 0xFFCD, KEY_F17 = 0xFFCE, KEY_L7 = 0xFFCE, KEY_F18 = 0xFFCF, KEY_L8 = 0xFFCF, KEY_F19 = 0xFFD0, KEY_L9 = 0xFFD0, KEY_F20 = 0xFFD1, KEY_L10 = 0xFFD1, KEY_F21 = 0xFFD2, KEY_R1 = 0xFFD2, KEY_F22 = 0xFFD3, KEY_R2 = 0xFFD3, KEY_F23 = 0xFFD4, KEY_R3 = 0xFFD4, KEY_F24 = 0xFFD5, KEY_R4 = 0xFFD5, KEY_F25 = 0xFFD6, KEY_R5 = 0xFFD6, KEY_F26 = 0xFFD7, KEY_R6 = 0xFFD7, KEY_F27 = 0xFFD8, KEY_R7 = 0xFFD8, KEY_F28 = 0xFFD9, KEY_R8 = 0xFFD9, KEY_F29 = 0xFFDA, KEY_R9 = 0xFFDA, KEY_F30 = 0xFFDB, KEY_R10 = 0xFFDB, KEY_F31 = 0xFFDC, KEY_R11 = 0xFFDC, KEY_F32 = 0xFFDD, KEY_R12 = 0xFFDD, KEY_F33 = 0xFFDE, KEY_R13 = 0xFFDE, KEY_F34 = 0xFFDF, KEY_R14 = 0xFFDF, KEY_F35 = 0xFFE0, KEY_R15 = 0xFFE0, // Modifiers KEY_Shift_L = 0xFFE1, KEY_Shift_R = 0xFFE2, KEY_Control_L = 0xFFE3, KEY_Control_R = 0xFFE4, KEY_Caps_Lock = 0xFFE5, KEY_Shift_Lock = 0xFFE6, KEY_Meta_L = 0xFFE7, KEY_Meta_R = 0xFFE8, KEY_Alt_L = 0xFFE9, KEY_Alt_R = 0xFFEA, KEY_Super_L = 0xFFEB, KEY_Super_R = 0xFFEC, KEY_Hyper_L = 0xFFED, KEY_Hyper_R = 0xFFEE, // ISO 9995 KEY_ISO_Lock = 0xFE01, KEY_ISO_Level2_Latch = 0xFE02, KEY_ISO_Level3_Shift = 0xFE03, KEY_ISO_Level3_Latch = 0xFE04, KEY_ISO_Level3_Lock = 0xFE05, KEY_ISO_Group_Shift = 0xFF7E, KEY_ISO_Group_Latch = 0xFE06, KEY_ISO_Group_Lock = 0xFE07, KEY_ISO_Next_Group = 0xFE08, KEY_ISO_Next_Group_Lock = 0xFE09, KEY_ISO_Prev_Group = 0xFE0A, KEY_ISO_Prev_Group_Lock = 0xFE0B, KEY_ISO_First_Group = 0xFE0C, KEY_ISO_First_Group_Lock = 0xFE0D, KEY_ISO_Last_Group = 0xFE0E, KEY_ISO_Last_Group_Lock = 0xFE0F, KEY_ISO_Left_Tab = 0xFE20, KEY_ISO_Move_Line_Up = 0xFE21, KEY_ISO_Move_Line_Down = 0xFE22, KEY_ISO_Partial_Line_Up = 0xFE23, KEY_ISO_Partial_Line_Down = 0xFE24, KEY_ISO_Partial_Space_Left = 0xFE25, KEY_ISO_Partial_Space_Right = 0xFE26, KEY_ISO_Set_Margin_Left = 0xFE27, KEY_ISO_Set_Margin_Right = 0xFE28, KEY_ISO_Release_Margin_Left = 0xFE29, KEY_ISO_Release_Margin_Right = 0xFE2A, KEY_ISO_Release_Both_Margins = 0xFE2B, KEY_ISO_Fast_Cursor_Left = 0xFE2C, KEY_ISO_Fast_Cursor_Right = 0xFE2D, KEY_ISO_Fast_Cursor_Up = 0xFE2E, KEY_ISO_Fast_Cursor_Down = 0xFE2F, KEY_ISO_Continuous_Underline = 0xFE30, KEY_ISO_Discontinuous_Underline = 0xFE31, KEY_ISO_Emphasize = 0xFE32, KEY_ISO_Center_Object = 0xFE33, KEY_ISO_Enter = 0xFE34, KEY_dead_grave = 0xFE50, KEY_dead_acute = 0xFE51, KEY_dead_circumflex = 0xFE52, KEY_dead_tilde = 0xFE53, KEY_dead_macron = 0xFE54, KEY_dead_breve = 0xFE55, KEY_dead_abovedot = 0xFE56, KEY_dead_diaeresis = 0xFE57, KEY_dead_abovering = 0xFE58, KEY_dead_doubleacute = 0xFE59, KEY_dead_caron = 0xFE5A, KEY_dead_cedilla = 0xFE5B, KEY_dead_ogonek = 0xFE5C, KEY_dead_iota = 0xFE5D, KEY_dead_voiced_sound = 0xFE5E, KEY_dead_semivoiced_sound = 0xFE5F, KEY_dead_belowdot = 0xFE60, KEY_First_Virtual_Screen = 0xFED0, KEY_Prev_Virtual_Screen = 0xFED1, KEY_Next_Virtual_Screen = 0xFED2, KEY_Last_Virtual_Screen = 0xFED4, KEY_Terminate_Server = 0xFED5, KEY_AccessX_Enable = 0xFE70, KEY_AccessX_Feedback_Enable = 0xFE71, KEY_RepeatKeys_Enable = 0xFE72, KEY_SlowKeys_Enable = 0xFE73, KEY_BounceKeys_Enable = 0xFE74, KEY_StickyKeys_Enable = 0xFE75, KEY_MouseKeys_Enable = 0xFE76, KEY_MouseKeys_Accel_Enable = 0xFE77, KEY_Overlay1_Enable = 0xFE78, KEY_Overlay2_Enable = 0xFE79, KEY_AudibleBell_Enable = 0xFE7A, KEY_Pointer_Left = 0xFEE0, KEY_Pointer_Right = 0xFEE1, KEY_Pointer_Up = 0xFEE2, KEY_Pointer_Down = 0xFEE3, KEY_Pointer_UpLeft = 0xFEE4, KEY_Pointer_UpRight = 0xFEE5, KEY_Pointer_DownLeft = 0xFEE6, KEY_Pointer_DownRight = 0xFEE7, KEY_Pointer_Button_Dflt = 0xFEE8, KEY_Pointer_Button1 = 0xFEE9, KEY_Pointer_Button2 = 0xFEEA, KEY_Pointer_Button3 = 0xFEEB, KEY_Pointer_Button4 = 0xFEEC, KEY_Pointer_Button5 = 0xFEED, KEY_Pointer_DblClick_Dflt = 0xFEEE, KEY_Pointer_DblClick1 = 0xFEEF, KEY_Pointer_DblClick2 = 0xFEF0, KEY_Pointer_DblClick3 = 0xFEF1, KEY_Pointer_DblClick4 = 0xFEF2, KEY_Pointer_DblClick5 = 0xFEF3, KEY_Pointer_Drag_Dflt = 0xFEF4, KEY_Pointer_Drag1 = 0xFEF5, KEY_Pointer_Drag2 = 0xFEF6, KEY_Pointer_Drag3 = 0xFEF7, KEY_Pointer_Drag4 = 0xFEF8, KEY_Pointer_Drag5 = 0xFEFD, KEY_Pointer_EnableKeys = 0xFEF9, KEY_Pointer_Accelerate = 0xFEFA, KEY_Pointer_DfltBtnNext = 0xFEFB, KEY_Pointer_DfltBtnPrev = 0xFEFC, // 3270 Terminal KEY_3270_Duplicate = 0xFD01, KEY_3270_FieldMark = 0xFD02, KEY_3270_Right2 = 0xFD03, KEY_3270_Left2 = 0xFD04, KEY_3270_BackTab = 0xFD05, KEY_3270_EraseEOF = 0xFD06, KEY_3270_EraseInput = 0xFD07, KEY_3270_Reset = 0xFD08, KEY_3270_Quit = 0xFD09, KEY_3270_PA1 = 0xFD0A, KEY_3270_PA2 = 0xFD0B, KEY_3270_PA3 = 0xFD0C, KEY_3270_Test = 0xFD0D, KEY_3270_Attn = 0xFD0E, KEY_3270_CursorBlink = 0xFD0F, KEY_3270_AltCursor = 0xFD10, KEY_3270_KeyClick = 0xFD11, KEY_3270_Jump = 0xFD12, KEY_3270_Ident = 0xFD13, KEY_3270_Rule = 0xFD14, KEY_3270_Copy = 0xFD15, KEY_3270_Play = 0xFD16, KEY_3270_Setup = 0xFD17, KEY_3270_Record = 0xFD18, KEY_3270_ChangeScreen = 0xFD19, KEY_3270_DeleteWord = 0xFD1A, KEY_3270_ExSelect = 0xFD1B, KEY_3270_CursorSelect = 0xFD1C, KEY_3270_PrintScreen = 0xFD1D, KEY_3270_Enter = 0xFD1E, // Latin 1 KEY_space = 0x0020, KEY_exclam = 0x0021, KEY_quotedbl = 0x0022, KEY_numbersign = 0x0023, KEY_dollar = 0x0024, KEY_percent = 0x0025, KEY_ampersand = 0x0026, KEY_apostrophe = 0x0027, KEY_quoteright = 0x0027, KEY_parenleft = 0x0028, KEY_parenright = 0x0029, KEY_asterisk = 0x002A, KEY_plus = 0x002B, KEY_comma = 0x002C, KEY_minus = 0x002D, KEY_period = 0x002E, KEY_slash = 0x002F, KEY_0 = 0x0030, KEY_1 = 0x0031, KEY_2 = 0x0032, KEY_3 = 0x0033, KEY_4 = 0x0034, KEY_5 = 0x0035, KEY_6 = 0x0036, KEY_7 = 0x0037, KEY_8 = 0x0038, KEY_9 = 0x0039, KEY_colon = 0x003A, KEY_semicolon = 0x003B, KEY_less = 0x003C, KEY_equal = 0x003D, KEY_greater = 0x003E, KEY_question = 0x003F, KEY_at = 0x0040, KEY_A = 0x0041, KEY_B = 0x0042, KEY_C = 0x0043, KEY_D = 0x0044, KEY_E = 0x0045, KEY_F = 0x0046, KEY_G = 0x0047, KEY_H = 0x0048, KEY_I = 0x0049, KEY_J = 0x004A, KEY_K = 0x004B, KEY_L = 0x004C, KEY_M = 0x004D, KEY_N = 0x004E, KEY_O = 0x004F, KEY_P = 0x0050, KEY_Q = 0x0051, KEY_R = 0x0052, KEY_S = 0x0053, KEY_T = 0x0054, KEY_U = 0x0055, KEY_V = 0x0056, KEY_W = 0x0057, KEY_X = 0x0058, KEY_Y = 0x0059, KEY_Z = 0x005A, KEY_bracketleft = 0x005B, KEY_backslash = 0x005C, KEY_bracketright = 0x005D, KEY_asciicircum = 0x005E, KEY_underscore = 0x005F, KEY_grave = 0x0060, KEY_quoteleft = 0x0060, KEY_a = 0x0061, KEY_b = 0x0062, KEY_c = 0x0063, KEY_d = 0x0064, KEY_e = 0x0065, KEY_f = 0x0066, KEY_g = 0x0067, KEY_h = 0x0068, KEY_i = 0x0069, KEY_j = 0x006A, KEY_k = 0x006B, KEY_l = 0x006C, KEY_m = 0x006D, KEY_n = 0x006E, KEY_o = 0x006F, KEY_p = 0x0070, KEY_q = 0x0071, KEY_r = 0x0072, KEY_s = 0x0073, KEY_t = 0x0074, KEY_u = 0x0075, KEY_v = 0x0076, KEY_w = 0x0077, KEY_x = 0x0078, KEY_y = 0x0079, KEY_z = 0x007A, KEY_braceleft = 0x007B, KEY_bar = 0x007C, KEY_braceright = 0x007D, KEY_asciitilde = 0x007E, KEY_nobreakspace = 0x00A0, KEY_exclamdown = 0x00A1, KEY_cent = 0x00A2, KEY_sterling = 0x00A3, KEY_currency = 0x00A4, KEY_yen = 0x00A5, KEY_brokenbar = 0x00A6, KEY_section = 0x00A7, KEY_diaeresis = 0x00A8, KEY_copyright = 0x00A9, KEY_ordfeminine = 0x00AA, KEY_guillemotleft = 0x00AB, KEY_notsign = 0x00AC, KEY_hyphen = 0x00AD, KEY_registered = 0x00AE, KEY_macron = 0x00AF, KEY_degree = 0x00B0, KEY_plusminus = 0x00B1, KEY_twosuperior = 0x00B2, KEY_threesuperior = 0x00B3, KEY_acute = 0x00B4, KEY_mu = 0x00B5, KEY_paragraph = 0x00B6, KEY_periodcentered = 0x00B7, KEY_cedilla = 0x00B8, KEY_onesuperior = 0x00B9, KEY_masculine = 0x00BA, KEY_guillemotright = 0x00BB, KEY_onequarter = 0x00BC, KEY_onehalf = 0x00BD, KEY_threequarters = 0x00BE, KEY_questiondown = 0x00BF, KEY_Agrave = 0x00C0, KEY_Aacute = 0x00C1, KEY_Acircumflex = 0x00C2, KEY_Atilde = 0x00C3, KEY_Adiaeresis = 0x00C4, KEY_Aring = 0x00C5, KEY_AE = 0x00C6, KEY_Ccedilla = 0x00C7, KEY_Egrave = 0x00C8, KEY_Eacute = 0x00C9, KEY_Ecircumflex = 0x00CA, KEY_Ediaeresis = 0x00CB, KEY_Igrave = 0x00CC, KEY_Iacute = 0x00CD, KEY_Icircumflex = 0x00CE, KEY_Idiaeresis = 0x00CF, KEY_ETH = 0x00D0, KEY_Eth = 0x00D0, KEY_Ntilde = 0x00D1, KEY_Ograve = 0x00D2, KEY_Oacute = 0x00D3, KEY_Ocircumflex = 0x00D4, KEY_Otilde = 0x00D5, KEY_Odiaeresis = 0x00D6, KEY_multiply = 0x00D7, KEY_Ooblique = 0x00D8, KEY_Ugrave = 0x00D9, KEY_Uacute = 0x00DA, KEY_Ucircumflex = 0x00DB, KEY_Udiaeresis = 0x00DC, KEY_Yacute = 0x00DD, KEY_THORN = 0x00DE, KEY_Thorn = 0x00DE, KEY_ssharp = 0x00DF, KEY_agrave = 0x00E0, KEY_aacute = 0x00E1, KEY_acircumflex = 0x00E2, KEY_atilde = 0x00E3, KEY_adiaeresis = 0x00E4, KEY_aring = 0x00E5, KEY_ae = 0x00E6, KEY_ccedilla = 0x00E7, KEY_egrave = 0x00E8, KEY_eacute = 0x00E9, KEY_ecircumflex = 0x00EA, KEY_ediaeresis = 0x00EB, KEY_igrave = 0x00EC, KEY_iacute = 0x00ED, KEY_icircumflex = 0x00EE, KEY_idiaeresis = 0x00EF, KEY_eth = 0x00F0, KEY_ntilde = 0x00F1, KEY_ograve = 0x00F2, KEY_oacute = 0x00F3, KEY_ocircumflex = 0x00F4, KEY_otilde = 0x00F5, KEY_odiaeresis = 0x00F6, KEY_division = 0x00F7, KEY_oslash = 0x00F8, KEY_ugrave = 0x00F9, KEY_uacute = 0x00FA, KEY_ucircumflex = 0x00FB, KEY_udiaeresis = 0x00FC, KEY_yacute = 0x00FD, KEY_thorn = 0x00FE, KEY_ydiaeresis = 0x00FF, // Latin 2 KEY_Aogonek = 0x01A1, KEY_breve = 0x01A2, KEY_Lstroke = 0x01A3, KEY_Lcaron = 0x01A5, KEY_Sacute = 0x01A6, KEY_Scaron = 0x01A9, KEY_Scedilla = 0x01AA, KEY_Tcaron = 0x01AB, KEY_Zacute = 0x01AC, KEY_Zcaron = 0x01AE, KEY_Zabovedot = 0x01AF, KEY_aogonek = 0x01B1, KEY_ogonek = 0x01B2, KEY_lstroke = 0x01B3, KEY_lcaron = 0x01B5, KEY_sacute = 0x01B6, KEY_caron = 0x01B7, KEY_scaron = 0x01B9, KEY_scedilla = 0x01BA, KEY_tcaron = 0x01BB, KEY_zacute = 0x01BC, KEY_doubleacute = 0x01BD, KEY_zcaron = 0x01BE, KEY_zabovedot = 0x01BF, KEY_Racute = 0x01C0, KEY_Abreve = 0x01C3, KEY_Lacute = 0x01C5, KEY_Cacute = 0x01C6, KEY_Ccaron = 0x01C8, KEY_Eogonek = 0x01CA, KEY_Ecaron = 0x01CC, KEY_Dcaron = 0x01CF, KEY_Dstroke = 0x01D0, KEY_Nacute = 0x01D1, KEY_Ncaron = 0x01D2, KEY_Odoubleacute = 0x01D5, KEY_Rcaron = 0x01D8, KEY_Uring = 0x01D9, KEY_Udoubleacute = 0x01DB, KEY_Tcedilla = 0x01DE, KEY_racute = 0x01E0, KEY_abreve = 0x01E3, KEY_lacute = 0x01E5, KEY_cacute = 0x01E6, KEY_ccaron = 0x01E8, KEY_eogonek = 0x01EA, KEY_ecaron = 0x01EC, KEY_dcaron = 0x01EF, KEY_dstroke = 0x01F0, KEY_nacute = 0x01F1, KEY_ncaron = 0x01F2, KEY_odoubleacute = 0x01F5, KEY_udoubleacute = 0x01FB, KEY_rcaron = 0x01F8, KEY_uring = 0x01F9, KEY_tcedilla = 0x01FE, KEY_abovedot = 0x01FF, // Latin 3 KEY_Hstroke = 0x02A1, KEY_Hcircumflex = 0x02A6, KEY_Iabovedot = 0x02A9, KEY_Gbreve = 0x02AB, KEY_Jcircumflex = 0x02AC, KEY_hstroke = 0x02B1, KEY_hcircumflex = 0x02B6, KEY_idotless = 0x02B9, KEY_gbreve = 0x02BB, KEY_jcircumflex = 0x02BC, KEY_Cabovedot = 0x02C5, KEY_Ccircumflex = 0x02C6, KEY_Gabovedot = 0x02D5, KEY_Gcircumflex = 0x02D8, KEY_Ubreve = 0x02DD, KEY_Scircumflex = 0x02DE, KEY_cabovedot = 0x02E5, KEY_ccircumflex = 0x02E6, KEY_gabovedot = 0x02F5, KEY_gcircumflex = 0x02F8, KEY_ubreve = 0x02FD, KEY_scircumflex = 0x02FE, // Latin 4 KEY_kra = 0x03A2, KEY_kappa = 0x03A2, KEY_Rcedilla = 0x03A3, KEY_Itilde = 0x03A5, KEY_Lcedilla = 0x03A6, KEY_Emacron = 0x03AA, KEY_Gcedilla = 0x03AB, KEY_Tslash = 0x03AC, KEY_rcedilla = 0x03B3, KEY_itilde = 0x03B5, KEY_lcedilla = 0x03B6, KEY_emacron = 0x03BA, KEY_gcedilla = 0x03BB, KEY_tslash = 0x03BC, KEY_ENG = 0x03BD, KEY_eng = 0x03BF, KEY_Amacron = 0x03C0, KEY_Iogonek = 0x03C7, KEY_Eabovedot = 0x03CC, KEY_Imacron = 0x03CF, KEY_Ncedilla = 0x03D1, KEY_Omacron = 0x03D2, KEY_Kcedilla = 0x03D3, KEY_Uogonek = 0x03D9, KEY_Utilde = 0x03DD, KEY_Umacron = 0x03DE, KEY_amacron = 0x03E0, KEY_iogonek = 0x03E7, KEY_eabovedot = 0x03EC, KEY_imacron = 0x03EF, KEY_ncedilla = 0x03F1, KEY_omacron = 0x03F2, KEY_kcedilla = 0x03F3, KEY_uogonek = 0x03F9, KEY_utilde = 0x03FD, KEY_umacron = 0x03FE, // Katakana KEY_overline = 0x047E, KEY_kana_fullstop = 0x04A1, KEY_kana_openingbracket = 0x04A2, KEY_kana_closingbracket = 0x04A3, KEY_kana_comma = 0x04A4, KEY_kana_conjunctive = 0x04A5, KEY_kana_middledot = 0x04A5, KEY_kana_WO = 0x04A6, KEY_kana_a = 0x04A7, KEY_kana_i = 0x04A8, KEY_kana_u = 0x04A9, KEY_kana_e = 0x04AA, KEY_kana_o = 0x04AB, KEY_kana_ya = 0x04AC, KEY_kana_yu = 0x04AD, KEY_kana_yo = 0x04AE, KEY_kana_tsu = 0x04AF, KEY_kana_tu = 0x04AF, KEY_prolongedsound = 0x04B0, KEY_kana_A = 0x04B1, KEY_kana_I = 0x04B2, KEY_kana_U = 0x04B3, KEY_kana_E = 0x04B4, KEY_kana_O = 0x04B5, KEY_kana_KA = 0x04B6, KEY_kana_KI = 0x04B7, KEY_kana_KU = 0x04B8, KEY_kana_KE = 0x04B9, KEY_kana_KO = 0x04BA, KEY_kana_SA = 0x04BB, KEY_kana_SHI = 0x04BC, KEY_kana_SU = 0x04BD, KEY_kana_SE = 0x04BE, KEY_kana_SO = 0x04BF, KEY_kana_TA = 0x04C0, KEY_kana_CHI = 0x04C1, KEY_kana_TI = 0x04C1, KEY_kana_TSU = 0x04C2, KEY_kana_TU = 0x04C2, KEY_kana_TE = 0x04C3, KEY_kana_TO = 0x04C4, KEY_kana_NA = 0x04C5, KEY_kana_NI = 0x04C6, KEY_kana_NU = 0x04C7, KEY_kana_NE = 0x04C8, KEY_kana_NO = 0x04C9, KEY_kana_HA = 0x04CA, KEY_kana_HI = 0x04CB, KEY_kana_FU = 0x04CC, KEY_kana_HU = 0x04CC, KEY_kana_HE = 0x04CD, KEY_kana_HO = 0x04CE, KEY_kana_MA = 0x04CF, KEY_kana_MI = 0x04D0, KEY_kana_MU = 0x04D1, KEY_kana_ME = 0x04D2, KEY_kana_MO = 0x04D3, KEY_kana_YA = 0x04D4, KEY_kana_YU = 0x04D5, KEY_kana_YO = 0x04D6, KEY_kana_RA = 0x04D7, KEY_kana_RI = 0x04D8, KEY_kana_RU = 0x04D9, KEY_kana_RE = 0x04DA, KEY_kana_RO = 0x04DB, KEY_kana_WA = 0x04DC, KEY_kana_N = 0x04DD, KEY_voicedsound = 0x04DE, KEY_semivoicedsound = 0x04DF, KEY_kana_switch = 0x0FF7, // Arabic KEY_Arabic_comma = 0x05AC, KEY_Arabic_semicolon = 0x05BB, KEY_Arabic_question_mark = 0x05BF, KEY_Arabic_hamza = 0x05C1, KEY_Arabic_maddaonalef = 0x05C2, KEY_Arabic_hamzaonalef = 0x05C3, KEY_Arabic_hamzaonwaw = 0x05C4, KEY_Arabic_hamzaunderalef = 0x05C5, KEY_Arabic_hamzaonyeh = 0x05C6, KEY_Arabic_alef = 0x05C7, KEY_Arabic_beh = 0x05C8, KEY_Arabic_tehmarbuta = 0x05C9, KEY_Arabic_teh = 0x05CA, KEY_Arabic_theh = 0x05CB, KEY_Arabic_jeem = 0x05CC, KEY_Arabic_hah = 0x05CD, KEY_Arabic_khah = 0x05CE, KEY_Arabic_dal = 0x05CF, KEY_Arabic_thal = 0x05D0, KEY_Arabic_ra = 0x05D1, KEY_Arabic_zain = 0x05D2, KEY_Arabic_seen = 0x05D3, KEY_Arabic_sheen = 0x05D4, KEY_Arabic_sad = 0x05D5, KEY_Arabic_dad = 0x05D6, KEY_Arabic_tah = 0x05D7, KEY_Arabic_zah = 0x05D8, KEY_Arabic_ain = 0x05D9, KEY_Arabic_ghain = 0x05DA, KEY_Arabic_tatweel = 0x05E0, KEY_Arabic_feh = 0x05E1, KEY_Arabic_qaf = 0x05E2, KEY_Arabic_kaf = 0x05E3, KEY_Arabic_lam = 0x05E4, KEY_Arabic_meem = 0x05E5, KEY_Arabic_noon = 0x05E6, KEY_Arabic_ha = 0x05E7, KEY_Arabic_heh = 0x05E7, KEY_Arabic_waw = 0x05E8, KEY_Arabic_alefmaksura = 0x05E9, KEY_Arabic_yeh = 0x05EA, KEY_Arabic_fathatan = 0x05EB, KEY_Arabic_dammatan = 0x05EC, KEY_Arabic_kasratan = 0x05ED, KEY_Arabic_fatha = 0x05EE, KEY_Arabic_damma = 0x05EF, KEY_Arabic_kasra = 0x05F0, KEY_Arabic_shadda = 0x05F1, KEY_Arabic_sukun = 0x05F2, KEY_Arabic_switch = 0xFF7E, // Cyrillic KEY_Serbian_dje = 0x06A1, KEY_Macedonia_gje = 0x06A2, KEY_Cyrillic_io = 0x06A3, KEY_Ukrainian_ie = 0x06A4, KEY_Ukranian_je = 0x06A4, KEY_Macedonia_dse = 0x06A5, KEY_Ukrainian_i = 0x06A6, KEY_Ukranian_i = 0x06A6, KEY_Ukrainian_yi = 0x06A7, KEY_Ukranian_yi = 0x06A7, KEY_Cyrillic_je = 0x06A8, KEY_Serbian_je = 0x06A8, KEY_Cyrillic_lje = 0x06A9, KEY_Serbian_lje = 0x06A9, KEY_Cyrillic_nje = 0x06AA, KEY_Serbian_nje = 0x06AA, KEY_Serbian_tshe = 0x06AB, KEY_Macedonia_kje = 0x06AC, KEY_Byelorussian_shortu = 0x06AE, KEY_Cyrillic_dzhe = 0x06AF, KEY_Serbian_dze = 0x06AF, KEY_numerosign = 0x06B0, KEY_Serbian_DJE = 0x06B1, KEY_Macedonia_GJE = 0x06B2, KEY_Cyrillic_IO = 0x06B3, KEY_Ukrainian_IE = 0x06B4, KEY_Ukranian_JE = 0x06B4, KEY_Macedonia_DSE = 0x06B5, KEY_Ukrainian_I = 0x06B6, KEY_Ukranian_I = 0x06B6, KEY_Ukrainian_YI = 0x06B7, KEY_Ukranian_YI = 0x06B7, KEY_Cyrillic_JE = 0x06B8, KEY_Serbian_JE = 0x06B8, KEY_Cyrillic_LJE = 0x06B9, KEY_Serbian_LJE = 0x06B9, KEY_Cyrillic_NJE = 0x06BA, KEY_Serbian_NJE = 0x06BA, KEY_Serbian_TSHE = 0x06BB, KEY_Macedonia_KJE = 0x06BC, KEY_Byelorussian_SHORTU = 0x06BE, KEY_Cyrillic_DZHE = 0x06BF, KEY_Serbian_DZE = 0x06BF, KEY_Cyrillic_yu = 0x06C0, KEY_Cyrillic_a = 0x06C1, KEY_Cyrillic_be = 0x06C2, KEY_Cyrillic_tse = 0x06C3, KEY_Cyrillic_de = 0x06C4, KEY_Cyrillic_ie = 0x06C5, KEY_Cyrillic_ef = 0x06C6, KEY_Cyrillic_ghe = 0x06C7, KEY_Cyrillic_ha = 0x06C8, KEY_Cyrillic_i = 0x06C9, KEY_Cyrillic_shorti = 0x06CA, KEY_Cyrillic_ka = 0x06CB, KEY_Cyrillic_el = 0x06CC, KEY_Cyrillic_em = 0x06CD, KEY_Cyrillic_en = 0x06CE, KEY_Cyrillic_o = 0x06CF, KEY_Cyrillic_pe = 0x06D0, KEY_Cyrillic_ya = 0x06D1, KEY_Cyrillic_er = 0x06D2, KEY_Cyrillic_es = 0x06D3, KEY_Cyrillic_te = 0x06D4, KEY_Cyrillic_u = 0x06D5, KEY_Cyrillic_zhe = 0x06D6, KEY_Cyrillic_ve = 0x06D7, KEY_Cyrillic_softsign = 0x06D8, KEY_Cyrillic_yeru = 0x06D9, KEY_Cyrillic_ze = 0x06DA, KEY_Cyrillic_sha = 0x06DB, KEY_Cyrillic_e = 0x06DC, KEY_Cyrillic_shcha = 0x06DD, KEY_Cyrillic_che = 0x06DE, KEY_Cyrillic_hardsign = 0x06DF, KEY_Cyrillic_YU = 0x06E0, KEY_Cyrillic_A = 0x06E1, KEY_Cyrillic_BE = 0x06E2, KEY_Cyrillic_TSE = 0x06E3, KEY_Cyrillic_DE = 0x06E4, KEY_Cyrillic_IE = 0x06E5, KEY_Cyrillic_EF = 0x06E6, KEY_Cyrillic_GHE = 0x06E7, KEY_Cyrillic_HA = 0x06E8, KEY_Cyrillic_I = 0x06E9, KEY_Cyrillic_SHORTI = 0x06EA, KEY_Cyrillic_KA = 0x06EB, KEY_Cyrillic_EL = 0x06EC, KEY_Cyrillic_EM = 0x06ED, KEY_Cyrillic_EN = 0x06EE, KEY_Cyrillic_O = 0x06EF, KEY_Cyrillic_PE = 0x06F0, KEY_Cyrillic_YA = 0x06F1, KEY_Cyrillic_ER = 0x06F2, KEY_Cyrillic_ES = 0x06F3, KEY_Cyrillic_TE = 0x06F4, KEY_Cyrillic_U = 0x06F5, KEY_Cyrillic_ZHE = 0x06F6, KEY_Cyrillic_VE = 0x06F7, KEY_Cyrillic_SOFTSIGN = 0x06F8, KEY_Cyrillic_YERU = 0x06F9, KEY_Cyrillic_ZE = 0x06FA, KEY_Cyrillic_SHA = 0x06FB, KEY_Cyrillic_E = 0x06FC, KEY_Cyrillic_SHCHA = 0x06FD, KEY_Cyrillic_CHE = 0x06FE, KEY_Cyrillic_HARDSIGN = 0x06FF, // Greek KEY_Greek_ALPHAaccent = 0x07A1, KEY_Greek_EPSILONaccent = 0x07A2, KEY_Greek_ETAaccent = 0x07A3, KEY_Greek_IOTAaccent = 0x07A4, KEY_Greek_IOTAdiaeresis = 0x07A5, KEY_Greek_OMICRONaccent = 0x07A7, KEY_Greek_UPSILONaccent = 0x07A8, KEY_Greek_UPSILONdieresis = 0x07A9, KEY_Greek_OMEGAaccent = 0x07AB, KEY_Greek_accentdieresis = 0x07AE, KEY_Greek_horizbar = 0x07AF, KEY_Greek_alphaaccent = 0x07B1, KEY_Greek_epsilonaccent = 0x07B2, KEY_Greek_etaaccent = 0x07B3, KEY_Greek_iotaaccent = 0x07B4, KEY_Greek_iotadieresis = 0x07B5, KEY_Greek_iotaaccentdieresis = 0x07B6, KEY_Greek_omicronaccent = 0x07B7, KEY_Greek_upsilonaccent = 0x07B8, KEY_Greek_upsilondieresis = 0x07B9, KEY_Greek_upsilonaccentdieresis = 0x07BA, KEY_Greek_omegaaccent = 0x07BB, KEY_Greek_ALPHA = 0x07C1, KEY_Greek_BETA = 0x07C2, KEY_Greek_GAMMA = 0x07C3, KEY_Greek_DELTA = 0x07C4, KEY_Greek_EPSILON = 0x07C5, KEY_Greek_ZETA = 0x07C6, KEY_Greek_ETA = 0x07C7, KEY_Greek_THETA = 0x07C8, KEY_Greek_IOTA = 0x07C9, KEY_Greek_KAPPA = 0x07CA, KEY_Greek_LAMDA = 0x07CB, KEY_Greek_LAMBDA = 0x07CB, KEY_Greek_MU = 0x07CC, KEY_Greek_NU = 0x07CD, KEY_Greek_XI = 0x07CE, KEY_Greek_OMICRON = 0x07CF, KEY_Greek_PI = 0x07D0, KEY_Greek_RHO = 0x07D1, KEY_Greek_SIGMA = 0x07D2, KEY_Greek_TAU = 0x07D4, KEY_Greek_UPSILON = 0x07D5, KEY_Greek_PHI = 0x07D6, KEY_Greek_CHI = 0x07D7, KEY_Greek_PSI = 0x07D8, KEY_Greek_OMEGA = 0x07D9, KEY_Greek_alpha = 0x07E1, KEY_Greek_beta = 0x07E2, KEY_Greek_gamma = 0x07E3, KEY_Greek_delta = 0x07E4, KEY_Greek_epsilon = 0x07E5, KEY_Greek_zeta = 0x07E6, KEY_Greek_eta = 0x07E7, KEY_Greek_theta = 0x07E8, KEY_Greek_iota = 0x07E9, KEY_Greek_kappa = 0x07EA, KEY_Greek_lamda = 0x07EB, KEY_Greek_lambda = 0x07EB, KEY_Greek_mu = 0x07EC, KEY_Greek_nu = 0x07ED, KEY_Greek_xi = 0x07EE, KEY_Greek_omicron = 0x07EF, KEY_Greek_pi = 0x07F0, KEY_Greek_rho = 0x07F1, KEY_Greek_sigma = 0x07F2, KEY_Greek_finalsmallsigma = 0x07F3, KEY_Greek_tau = 0x07F4, KEY_Greek_upsilon = 0x07F5, KEY_Greek_phi = 0x07F6, KEY_Greek_chi = 0x07F7, KEY_Greek_psi = 0x07F8, KEY_Greek_omega = 0x07F9, KEY_Greek_switch = 0xFF7E, // Technical KEY_leftradical = 0x08A1, KEY_topleftradical = 0x08A2, KEY_horizconnector = 0x08A3, KEY_topintegral = 0x08A4, KEY_botintegral = 0x08A5, KEY_vertconnector = 0x08A6, KEY_topleftsqbracket = 0x08A7, KEY_botleftsqbracket = 0x08A8, KEY_toprightsqbracket = 0x08A9, KEY_botrightsqbracket = 0x08AA, KEY_topleftparens = 0x08AB, KEY_botleftparens = 0x08AC, KEY_toprightparens = 0x08AD, KEY_botrightparens = 0x08AE, KEY_leftmiddlecurlybrace = 0x08AF, KEY_rightmiddlecurlybrace = 0x08B0, KEY_topleftsummation = 0x08B1, KEY_botleftsummation = 0x08B2, KEY_topvertsummationconnector = 0x08B3, KEY_botvertsummationconnector = 0x08B4, KEY_toprightsummation = 0x08B5, KEY_botrightsummation = 0x08B6, KEY_rightmiddlesummation = 0x08B7, KEY_lessthanequal = 0x08BC, KEY_notequal = 0x08BD, KEY_greaterthanequal = 0x08BE, KEY_integral = 0x08BF, KEY_therefore = 0x08C0, KEY_variation = 0x08C1, KEY_infinity = 0x08C2, KEY_nabla = 0x08C5, KEY_approximate = 0x08C8, KEY_similarequal = 0x08C9, KEY_ifonlyif = 0x08CD, KEY_implies = 0x08CE, KEY_identical = 0x08CF, KEY_radical = 0x08D6, KEY_includedin = 0x08DA, KEY_includes = 0x08DB, KEY_intersection = 0x08DC, KEY_union = 0x08DD, KEY_logicaland = 0x08DE, KEY_logicalor = 0x08DF, KEY_partialderivative = 0x08EF, KEY_function = 0x08F6, KEY_leftarrow = 0x08FB, KEY_uparrow = 0x08FC, KEY_rightarrow = 0x08FD, KEY_downarrow = 0x08FE, // Special KEY_blank = 0x09DF, KEY_soliddiamond = 0x09E0, KEY_checkerboard = 0x09E1, KEY_ht = 0x09E2, KEY_ff = 0x09E3, KEY_cr = 0x09E4, KEY_lf = 0x09E5, KEY_nl = 0x09E8, KEY_vt = 0x09E9, KEY_lowrightcorner = 0x09EA, KEY_uprightcorner = 0x09EB, KEY_upleftcorner = 0x09EC, KEY_lowleftcorner = 0x09ED, KEY_crossinglines = 0x09EE, KEY_horizlinescan1 = 0x09EF, KEY_horizlinescan3 = 0x09F0, KEY_horizlinescan5 = 0x09F1, KEY_horizlinescan7 = 0x09F2, KEY_horizlinescan9 = 0x09F3, KEY_leftt = 0x09F4, KEY_rightt = 0x09F5, KEY_bott = 0x09F6, KEY_topt = 0x09F7, KEY_vertbar = 0x09F8, // Publishing KEY_emspace = 0x0AA1, KEY_enspace = 0x0AA2, KEY_em3space = 0x0AA3, KEY_em4space = 0x0AA4, KEY_digitspace = 0x0AA5, KEY_punctspace = 0x0AA6, KEY_thinspace = 0x0AA7, KEY_hairspace = 0x0AA8, KEY_emdash = 0x0AA9, KEY_endash = 0x0AAA, KEY_signifblank = 0x0AAC, KEY_ellipsis = 0x0AAE, KEY_doubbaselinedot = 0x0AAF, KEY_onethird = 0x0AB0, KEY_twothirds = 0x0AB1, KEY_onefifth = 0x0AB2, KEY_twofifths = 0x0AB3, KEY_threefifths = 0x0AB4, KEY_fourfifths = 0x0AB5, KEY_onesixth = 0x0AB6, KEY_fivesixths = 0x0AB7, KEY_careof = 0x0AB8, KEY_figdash = 0x0ABB, KEY_leftanglebracket = 0x0ABC, KEY_decimalpoint = 0x0ABD, KEY_rightanglebracket = 0x0ABE, KEY_marker = 0x0ABF, KEY_oneeighth = 0x0AC3, KEY_threeeighths = 0x0AC4, KEY_fiveeighths = 0x0AC5, KEY_seveneighths = 0x0AC6, KEY_trademark = 0x0AC9, KEY_signaturemark = 0x0ACA, KEY_trademarkincircle = 0x0ACB, KEY_leftopentriangle = 0x0ACC, KEY_rightopentriangle = 0x0ACD, KEY_emopencircle = 0x0ACE, KEY_emopenrectangle = 0x0ACF, KEY_leftsinglequotemark = 0x0AD0, KEY_rightsinglequotemark = 0x0AD1, KEY_leftdoublequotemark = 0x0AD2, KEY_rightdoublequotemark = 0x0AD3, KEY_prescription = 0x0AD4, KEY_minutes = 0x0AD6, KEY_seconds = 0x0AD7, KEY_latincross = 0x0AD9, KEY_hexagram = 0x0ADA, KEY_filledrectbullet = 0x0ADB, KEY_filledlefttribullet = 0x0ADC, KEY_filledrighttribullet = 0x0ADD, KEY_emfilledcircle = 0x0ADE, KEY_emfilledrect = 0x0ADF, KEY_enopencircbullet = 0x0AE0, KEY_enopensquarebullet = 0x0AE1, KEY_openrectbullet = 0x0AE2, KEY_opentribulletup = 0x0AE3, KEY_opentribulletdown = 0x0AE4, KEY_openstar = 0x0AE5, KEY_enfilledcircbullet = 0x0AE6, KEY_enfilledsqbullet = 0x0AE7, KEY_filledtribulletup = 0x0AE8, KEY_filledtribulletdown = 0x0AE9, KEY_leftpointer = 0x0AEA, KEY_rightpointer = 0x0AEB, KEY_club = 0x0AEC, KEY_diamond = 0x0AED, KEY_heart = 0x0AEE, KEY_maltesecross = 0x0AF0, KEY_dagger = 0x0AF1, KEY_doubledagger = 0x0AF2, KEY_checkmark = 0x0AF3, KEY_ballotcross = 0x0AF4, KEY_musicalsharp = 0x0AF5, KEY_musicalflat = 0x0AF6, KEY_malesymbol = 0x0AF7, KEY_femalesymbol = 0x0AF8, KEY_telephone = 0x0AF9, KEY_telephonerecorder = 0x0AFA, KEY_phonographcopyright = 0x0AFB, KEY_caret = 0x0AFC, KEY_singlelowquotemark = 0x0AFD, KEY_doublelowquotemark = 0x0AFE, KEY_cursor = 0x0AFF, // APL KEY_leftcaret = 0x0BA3, KEY_rightcaret = 0x0BA6, KEY_downcaret = 0x0BA8, KEY_upcaret = 0x0BA9, KEY_overbar = 0x0BC0, KEY_downtack = 0x0BC2, KEY_upshoe = 0x0BC3, KEY_downstile = 0x0BC4, KEY_underbar = 0x0BC6, KEY_jot = 0x0BCA, KEY_quad = 0x0BCC, KEY_uptack = 0x0BCE, KEY_circle = 0x0BCF, KEY_upstile = 0x0BD3, KEY_downshoe = 0x0BD6, KEY_rightshoe = 0x0BD8, KEY_leftshoe = 0x0BDA, KEY_lefttack = 0x0BDC, KEY_righttack = 0x0BFC, // Hebrew KEY_hebrew_doublelowline = 0x0CDF, KEY_hebrew_aleph = 0x0CE0, KEY_hebrew_bet = 0x0CE1, KEY_hebrew_beth = 0x0CE1, KEY_hebrew_gimel = 0x0CE2, KEY_hebrew_gimmel = 0x0CE2, KEY_hebrew_dalet = 0x0CE3, KEY_hebrew_daleth = 0x0CE3, KEY_hebrew_he = 0x0CE4, KEY_hebrew_waw = 0x0CE5, KEY_hebrew_zain = 0x0CE6, KEY_hebrew_zayin = 0x0CE6, KEY_hebrew_chet = 0x0CE7, KEY_hebrew_het = 0x0CE7, KEY_hebrew_tet = 0x0CE8, KEY_hebrew_teth = 0x0CE8, KEY_hebrew_yod = 0x0CE9, KEY_hebrew_finalkaph = 0x0CEA, KEY_hebrew_kaph = 0x0CEB, KEY_hebrew_lamed = 0x0CEC, KEY_hebrew_finalmem = 0x0CED, KEY_hebrew_mem = 0x0CEE, KEY_hebrew_finalnun = 0x0CEF, KEY_hebrew_nun = 0x0CF0, KEY_hebrew_samech = 0x0CF1, KEY_hebrew_samekh = 0x0CF1, KEY_hebrew_ayin = 0x0CF2, KEY_hebrew_finalpe = 0x0CF3, KEY_hebrew_pe = 0x0CF4, KEY_hebrew_finalzade = 0x0CF5, KEY_hebrew_finalzadi = 0x0CF5, KEY_hebrew_zade = 0x0CF6, KEY_hebrew_zadi = 0x0CF6, KEY_hebrew_qoph = 0x0CF7, KEY_hebrew_kuf = 0x0CF7, KEY_hebrew_resh = 0x0CF8, KEY_hebrew_shin = 0x0CF9, KEY_hebrew_taw = 0x0CFA, KEY_hebrew_taf = 0x0CFA, KEY_Hebrew_switch = 0xFF7E, // Thai KEY_Thai_kokai = 0x0DA1, KEY_Thai_khokhai = 0x0DA2, KEY_Thai_khokhuat = 0x0DA3, KEY_Thai_khokhwai = 0x0DA4, KEY_Thai_khokhon = 0x0DA5, KEY_Thai_khorakhang = 0x0DA6, KEY_Thai_ngongu = 0x0DA7, KEY_Thai_chochan = 0x0DA8, KEY_Thai_choching = 0x0DA9, KEY_Thai_chochang = 0x0DAA, KEY_Thai_soso = 0x0DAB, KEY_Thai_chochoe = 0x0DAC, KEY_Thai_yoying = 0x0DAD, KEY_Thai_dochada = 0x0DAE, KEY_Thai_topatak = 0x0DAF, KEY_Thai_thothan = 0x0DB0, KEY_Thai_thonangmontho = 0x0DB1, KEY_Thai_thophuthao = 0x0DB2, KEY_Thai_nonen = 0x0DB3, KEY_Thai_dodek = 0x0DB4, KEY_Thai_totao = 0x0DB5, KEY_Thai_thothung = 0x0DB6, KEY_Thai_thothahan = 0x0DB7, KEY_Thai_thothong = 0x0DB8, KEY_Thai_nonu = 0x0DB9, KEY_Thai_bobaimai = 0x0DBA, KEY_Thai_popla = 0x0DBB, KEY_Thai_phophung = 0x0DBC, KEY_Thai_fofa = 0x0DBD, KEY_Thai_phophan = 0x0DBE, KEY_Thai_fofan = 0x0DBF, KEY_Thai_phosamphao = 0x0DC0, KEY_Thai_moma = 0x0DC1, KEY_Thai_yoyak = 0x0DC2, KEY_Thai_rorua = 0x0DC3, KEY_Thai_ru = 0x0DC4, KEY_Thai_loling = 0x0DC5, KEY_Thai_lu = 0x0DC6, KEY_Thai_wowaen = 0x0DC7, KEY_Thai_sosala = 0x0DC8, KEY_Thai_sorusi = 0x0DC9, KEY_Thai_sosua = 0x0DCA, KEY_Thai_hohip = 0x0DCB, KEY_Thai_lochula = 0x0DCC, KEY_Thai_oang = 0x0DCD, KEY_Thai_honokhuk = 0x0DCE, KEY_Thai_paiyannoi = 0x0DCF, KEY_Thai_saraa = 0x0DD0, KEY_Thai_maihanakat = 0x0DD1, KEY_Thai_saraaa = 0x0DD2, KEY_Thai_saraam = 0x0DD3, KEY_Thai_sarai = 0x0DD4, KEY_Thai_saraii = 0x0DD5, KEY_Thai_saraue = 0x0DD6, KEY_Thai_sarauee = 0x0DD7, KEY_Thai_sarau = 0x0DD8, KEY_Thai_sarauu = 0x0DD9, KEY_Thai_phinthu = 0x0DDA, KEY_Thai_maihanakat_maitho = 0x0DDE, KEY_Thai_baht = 0x0DDF, KEY_Thai_sarae = 0x0DE0, KEY_Thai_saraae = 0x0DE1, KEY_Thai_sarao = 0x0DE2, KEY_Thai_saraaimaimuan = 0x0DE3, KEY_Thai_saraaimaimalai = 0x0DE4, KEY_Thai_lakkhangyao = 0x0DE5, KEY_Thai_maiyamok = 0x0DE6, KEY_Thai_maitaikhu = 0x0DE7, KEY_Thai_maiek = 0x0DE8, KEY_Thai_maitho = 0x0DE9, KEY_Thai_maitri = 0x0DEA, KEY_Thai_maichattawa = 0x0DEB, KEY_Thai_thanthakhat = 0x0DEC, KEY_Thai_nikhahit = 0x0DED, KEY_Thai_leksun = 0x0DF0, KEY_Thai_leknung = 0x0DF1, KEY_Thai_leksong = 0x0DF2, KEY_Thai_leksam = 0x0DF3, KEY_Thai_leksi = 0x0DF4, KEY_Thai_lekha = 0x0DF5, KEY_Thai_lekhok = 0x0DF6, KEY_Thai_lekchet = 0x0DF7, KEY_Thai_lekpaet = 0x0DF8, KEY_Thai_lekkao = 0x0DF9, // Korean KEY_Hangul = 0xFF31, KEY_Hangul_Start = 0xFF32, KEY_Hangul_End = 0xFF33, KEY_Hangul_Hanja = 0xFF34, KEY_Hangul_Jamo = 0xFF35, KEY_Hangul_Romaja = 0xFF36, KEY_Hangul_Codeinput = 0xFF37, KEY_Hangul_Jeonja = 0xFF38, KEY_Hangul_Banja = 0xFF39, KEY_Hangul_PreHanja = 0xFF3A, KEY_Hangul_PostHanja = 0xFF3B, KEY_Hangul_SingleCandidate = 0xFF3C, KEY_Hangul_MultipleCandidate = 0xFF3D, KEY_Hangul_PreviousCandidate = 0xFF3E, KEY_Hangul_Special = 0xFF3F, KEY_Hangul_switch = 0xFF7E, KEY_Hangul_Kiyeog = 0x0EA1, KEY_Hangul_SsangKiyeog = 0x0EA2, KEY_Hangul_KiyeogSios = 0x0EA3, KEY_Hangul_Nieun = 0x0EA4, KEY_Hangul_NieunJieuj = 0x0EA5, KEY_Hangul_NieunHieuh = 0x0EA6, KEY_Hangul_Dikeud = 0x0EA7, KEY_Hangul_SsangDikeud = 0x0EA8, KEY_Hangul_Rieul = 0x0EA9, KEY_Hangul_RieulKiyeog = 0x0EAA, KEY_Hangul_RieulMieum = 0x0EAB, KEY_Hangul_RieulPieub = 0x0EAC, KEY_Hangul_RieulSios = 0x0EAD, KEY_Hangul_RieulTieut = 0x0EAE, KEY_Hangul_RieulPhieuf = 0x0EAF, KEY_Hangul_RieulHieuh = 0x0EB0, KEY_Hangul_Mieum = 0x0EB1, KEY_Hangul_Pieub = 0x0EB2, KEY_Hangul_SsangPieub = 0x0EB3, KEY_Hangul_PieubSios = 0x0EB4, KEY_Hangul_Sios = 0x0EB5, KEY_Hangul_SsangSios = 0x0EB6, KEY_Hangul_Ieung = 0x0EB7, KEY_Hangul_Jieuj = 0x0EB8, KEY_Hangul_SsangJieuj = 0x0EB9, KEY_Hangul_Cieuc = 0x0EBA, KEY_Hangul_Khieuq = 0x0EBB, KEY_Hangul_Tieut = 0x0EBC, KEY_Hangul_Phieuf = 0x0EBD, KEY_Hangul_Hieuh = 0x0EBE, KEY_Hangul_A = 0x0EBF, KEY_Hangul_AE = 0x0EC0, KEY_Hangul_YA = 0x0EC1, KEY_Hangul_YAE = 0x0EC2, KEY_Hangul_EO = 0x0EC3, KEY_Hangul_E = 0x0EC4, KEY_Hangul_YEO = 0x0EC5, KEY_Hangul_YE = 0x0EC6, KEY_Hangul_O = 0x0EC7, KEY_Hangul_WA = 0x0EC8, KEY_Hangul_WAE = 0x0EC9, KEY_Hangul_OE = 0x0ECA, KEY_Hangul_YO = 0x0ECB, KEY_Hangul_U = 0x0ECC, KEY_Hangul_WEO = 0x0ECD, KEY_Hangul_WE = 0x0ECE, KEY_Hangul_WI = 0x0ECF, KEY_Hangul_YU = 0x0ED0, KEY_Hangul_EU = 0x0ED1, KEY_Hangul_YI = 0x0ED2, KEY_Hangul_I = 0x0ED3, KEY_Hangul_J_Kiyeog = 0x0ED4, KEY_Hangul_J_SsangKiyeog = 0x0ED5, KEY_Hangul_J_KiyeogSios = 0x0ED6, KEY_Hangul_J_Nieun = 0x0ED7, KEY_Hangul_J_NieunJieuj = 0x0ED8, KEY_Hangul_J_NieunHieuh = 0x0ED9, KEY_Hangul_J_Dikeud = 0x0EDA, KEY_Hangul_J_Rieul = 0x0EDB, KEY_Hangul_J_RieulKiyeog = 0x0EDC, KEY_Hangul_J_RieulMieum = 0x0EDD, KEY_Hangul_J_RieulPieub = 0x0EDE, KEY_Hangul_J_RieulSios = 0x0EDF, KEY_Hangul_J_RieulTieut = 0x0EE0, KEY_Hangul_J_RieulPhieuf = 0x0EE1, KEY_Hangul_J_RieulHieuh = 0x0EE2, KEY_Hangul_J_Mieum = 0x0EE3, KEY_Hangul_J_Pieub = 0x0EE4, KEY_Hangul_J_PieubSios = 0x0EE5, KEY_Hangul_J_Sios = 0x0EE6, KEY_Hangul_J_SsangSios = 0x0EE7, KEY_Hangul_J_Ieung = 0x0EE8, KEY_Hangul_J_Jieuj = 0x0EE9, KEY_Hangul_J_Cieuc = 0x0EEA, KEY_Hangul_J_Khieuq = 0x0EEB, KEY_Hangul_J_Tieut = 0x0EEC, KEY_Hangul_J_Phieuf = 0x0EED, KEY_Hangul_J_Hieuh = 0x0EEE, KEY_Hangul_RieulYeorinHieuh = 0x0EEF, KEY_Hangul_SunkyeongeumMieum = 0x0EF0, KEY_Hangul_SunkyeongeumPieub = 0x0EF1, KEY_Hangul_PanSios = 0x0EF2, KEY_Hangul_KkogjiDalrinIeung = 0x0EF3, KEY_Hangul_SunkyeongeumPhieuf = 0x0EF4, KEY_Hangul_YeorinHieuh = 0x0EF5, KEY_Hangul_AraeA = 0x0EF6, KEY_Hangul_AraeAE = 0x0EF7, KEY_Hangul_J_PanSios = 0x0EF8, KEY_Hangul_J_KkogjiDalrinIeung = 0x0EF9, KEY_Hangul_J_YeorinHieuh = 0x0EFA, KEY_Korean_Won = 0x0EFF }; } #ifndef FX_NO_GLOBAL_NAMESPACE using namespace FX; #endif #endif fox1.6-1.6.57/include/fxunicode.h000066400000000000000000000325221326741342000164210ustar00rootroot00000000000000/******************************************************************************** * * * U N I C O D E C h a r a c t e r I n f o * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: fxunicode.h,v 1.3 2006/01/22 17:58:14 fox Exp $ * ********************************************************************************/ #ifndef FXUNICODE_H #define FXUNICODE_H namespace FX { /// General Category enum { CatNotAssigned = 0, /// Cn Other, Not Assigned (no characters in the file have this property) CatControl = 1, /// Cc Other, Control CatFormat = 2, /// Cf Other, Format CatSurrogate = 3, /// Cs Other, Surrogate CatOther = 4, /// Co Other, Private Use CatMarkNonSpacing = 5, /// Mn Mark, Nonspacing CatMarkSpacingCombining = 6, /// Mc Mark, Spacing Combining CatMarkEnclosing = 7, /// Me Mark, Enclosing CatSeparatorSpace = 8, /// Zs Separator, Space CatSeparatorLine = 9, /// Zl Separator, Line CatSeparatorParagraph = 10, /// Zp Separator, Paragraph CatLetterUpper = 11, /// Lu Letter, Uppercase CatLetterLower = 12, /// Ll Letter, Lowercase CatLetterTitle = 13, /// Lt Letter, Titlecase CatLetterModifier = 14, /// Lm Letter, Modifier CatLetterOther = 15, /// Lo Letter, Other CatNumberLetter = 16, /// Nl Number, Letter CatNumberDecimal = 17, /// Nd Number, Decimal Digit CatNumberOther = 18, /// No Number, Other CatPunctConnector = 19, /// Pc Punctuation, Connector CatPunctDash = 20, /// Pd Punctuation, Dash CatPunctOpen = 21, /// Ps Punctuation, Open CatPunctClose = 22, /// Pe Punctuation, Close CatPunctInitial = 23, /// Pi Punctuation, Initial quote (may behave like Ps or Pe depending on usage) CatPunctFinal = 24, /// Pf Punctuation, Final quote (may behave like Ps or Pe depending on usage) CatPunctOther = 25, /// Po Punctuation, Other CatSymbolMath = 26, /// Sm Symbol, Math CatSymbolCurrency = 27, /// Sc Symbol, Currency CatSymbolModifier = 28, /// Sk Symbol, Modifier CatSymbolOther = 29 /// So Symbol, Other }; /// Bidi types enum { DirL = 0, /// Left-to-Right DirLRE = 1, /// Left-to-Right Embedding DirLRO = 2, /// Left-to-Right Override DirR = 3, /// Right-to-Left DirAL = 4, /// Right-to-Left Arabic DirRLE = 5, /// Right-to-Left Embedding DirRLO = 6, /// Right-to-Left Override DirPDF = 7, /// Pop Directional Format DirEN = 8, /// European Number DirES = 9, /// European Number Separator DirET = 10, /// European Number Terminator DirAN = 11, /// Arabic Number DirCS = 12, /// Common Number Separator DirNSM = 13, /// Non-Spacing Mark DirBN = 14, /// Boundary Neutral DirB = 15, /// Paragraph Separator DirS = 16, /// Segment Separator DirWS = 17, /// Whitespace DirON = 18 /// Other Neutrals }; /// Arabic joining enum { NonJoining = 0, RightJoining = 1, DualJoining = 2, JoinCausing = 3 }; /// Combining class enum { CombBelowLeftAtt = 200, /// Below left attached CombBelowAtt = 202, /// Below attached CombBelowRightAtt = 204, /// Below right attached CombLeftAtt = 208, /// Left attached (reordrant around single base character) CombRightAtt = 210, /// Right attached CombAboveLeftAtt = 212, /// Above left attached CombAboveAtt = 214, /// Above attached CombAboveRightAtt = 216, /// Above right attached CombBelowLeft = 218, /// Below left CombBelow = 220, /// Below CombBelowRight = 222, /// Below right CombLeft = 224, /// Left (reordrant around single base character) CombRight = 226, /// Right CombAboveLeft = 228, /// Above left CombAbove = 230, /// Above CombAboveRight = 232, /// Above right CombDoubleBelow = 233, /// Double below CombDoubleAbove = 234, /// Double above CombIotaSub = 240 /// Below (iota subscript) }; /// Decompose types enum { DecNone = 0, /// Non-decomposable DecFont = 1, /// A font variant (e.g. a blackletter form) DecNoBreak = 2, /// A no-break version of a space or hyphen DecInitial = 3, /// An initial presentation form (Arabic) DecMedial = 4, /// A medial presentation form (Arabic) DecFinal = 5, /// A final presentation form (Arabic) DecIsolated = 6, /// An isolated presentation form (Arabic) DecCircle = 7, /// An encircled form DecSuper = 8, /// A superscript form DecSub = 9, /// A subscript form DecVertical = 10, /// A vertical layout presentation form DecWide = 11, /// A wide (or zenkaku) compatibility character DecNarrow = 12, /// A narrow (or hankaku) compatibility character DecSmall = 13, /// A small variant form (CNS compatibility) DecSquare = 14, /// A CJK squared font variant DecFraction = 15, /// A vulgar fraction form DecCompat = 16, /// Compatible DecCanonical = 17 /// Canonical (equivalent) }; /// Line break types enum { BreakUnknown = 0, /// XX Unknown BreakMandarory = 1, /// BK Mandatory Break BreakReturn = 2, /// CR Carriage Return BreakLineFeed = 3, /// LF Line Feed BreakCombMark = 4, /// CM Attached Characters and Combining Marks BreakNextLine = 5, /// NL Next Line BreakSurrogate = 6, /// SG Surrogates BreakWordJoiner = 7, /// WJ Word Joiner BreakZWSpace = 8, /// ZW Zero Width Space BreakGlue = 9, /// GL Non-breaking Glue BreakContingent = 10, /// CB Contingent Break Opportunity BreakSpace = 11, /// SP Space BreakBoth = 12, /// B2 Break Opportunity Before and After BreakAfter = 13, /// BA Break Opportunity After BreakBefore = 14, /// BB Break Opportunity Before BreakHyphen = 15, /// HY Hyphen BreakOpen = 16, /// OP Opening Punctuation BreakClose = 17, /// CL Closing Punctuation BreakQuote = 18, /// QU Ambiguous Quotation BreakExclaim = 19, /// EX Exclamation/Interrogation BreakInsep = 20, /// IN Inseparable BreakNonStart = 21, /// NS Non Starter BreakInfix = 22, /// IS Infix Separator (Numeric) BreakNumeric = 23, /// NU Numeric BreakPostfix = 24, /// PO Postfix (Numeric) BreakPrefix = 25, /// PR Prefix (Numeric) BreakSymbol = 26, /// SY Symbols Allowing Breaks BreakOrdinary = 27, /// AL Ordinary Alphabetic and Symbol Characters BreakIdeograph = 28, /// ID Ideographic BreakComplex = 29 /// SA Complex Context (South East Asian) }; /// Scripts enum { ScriptCommon = 0, /// Zyyy ScriptInherited = 1, /// Qaai ScriptLatin = 2, /// Latn European scripts ScriptGreek = 3, /// Grek ScriptCyrillic = 4, /// Cyrl (Cyrs) ScriptArmenian = 5, /// Armn ScriptGeorgian = 6, /// Geor (Geon, Geoa) ScriptRunic = 7, /// Runr ScriptOgham = 8, /// Ogam ScriptHebrew = 9, /// Hebr Middle eastern ScriptArabic = 10, /// Arab ScriptSyriac = 11, /// Syrc (Syrj, Syrn, Syre) ScriptThaana = 12, /// Thaa ScriptDevanagari = 13, /// Deva Indic ScriptBengali = 14, /// Beng ScriptGurmukhi = 15, /// Guru ScriptGujarati = 16, /// Gujr ScriptOriya = 17, /// Orya ScriptTamil = 18, /// Taml ScriptTelugu = 19, /// Telu ScriptKannada = 20, /// Knda ScriptMalayalam = 21, /// Mlym ScriptSinhala = 22, /// Sinh ScriptThai = 23, /// Thai ScriptLao = 24, /// Laoo ScriptTibetan = 25, /// Tibt ScriptMyanmar = 26, /// Mymr ScriptKhmer = 27, /// Khmr ScriptHan = 28, /// Hani Asian ScriptHiragana = 29, /// Hira ScriptKatakana = 30, /// Kana ScriptHangul = 31, /// Hang ScriptBopomofo = 32, /// Bopo ScriptYi = 33, /// Yiii ScriptEthiopic = 34, /// Ethi Misc ScriptCherokee = 35, /// Cher ScriptCanadianAboriginal = 36, /// Cans ScriptMongolian = 37, /// Mong ScriptGothic = 38, /// Goth ScriptTagalog = 39, /// Tglg ScriptHanunoo = 40, /// Hano ScriptBuhid = 41, /// Buhd ScriptTagbanwa = 42, /// Tagb ScriptLimbu = 43, /// Limb ScriptTaiLe = 44, /// Tale ScriptUgaritic = 45, /// Ugar ScriptOsmanya = 46, /// Osma ScriptCypriot = 47, /// Cprt ScriptShavian = 48, /// Shaw ScriptDeseret = 49, /// Dsrt ScriptKatakanaHiragana = 50 /// Hrkt }; /// Unicode versions of common character functions namespace Unicode { /// Character wide character category extern FXAPI FXuint charCategory(FXwchar ucs); /// Get character wide character direction extern FXAPI FXuint charDirection(FXwchar ucs); /// Get wide character decompose type extern FXAPI FXuint decomposeType(FXwchar ucs); /// Return number of wide characters in decomposition extern FXAPI FXuint charNumDecompose(FXwchar ucs); /// Return wide character decomposition extern FXAPI const FXwchar* charDecompose(FXwchar ucs); /// Return wide character composition from ucsa and ucsb extern FXAPI FXwchar charCompose(FXwchar ucsa,FXwchar ucsb); /// Get wide character joining extern FXAPI FXuint joiningType(FXwchar ucs); /// Get wide character symmetry extern FXAPI FXuint isSymmetric(FXwchar ucs); /// Get wide character combining type; zero means starter extern FXAPI FXuint charCombining(FXwchar ucs); /// Get numeric value of wide character (this includes hex value) extern FXAPI FXint digitValue(FXwchar ucs); /// Get linebreak type of wide character extern FXAPI FXuint lineBreakType(FXwchar ucs); /// Get mirror image of wide character or character itself extern FXAPI FXwchar mirrorImage(FXwchar ucs); /// Script type of wide character extern FXAPI FXuint scriptType(FXwchar ucs); /// Unicode flavor of common functions extern FXAPI bool hasCase(FXwchar ucs); extern FXAPI bool isUpper(FXwchar ucs); extern FXAPI bool isLower(FXwchar ucs); extern FXAPI bool isTitle(FXwchar ucs); extern FXAPI bool isAscii(FXwchar ucs); extern FXAPI bool isLetter(FXwchar ucs); extern FXAPI bool isDigit(FXwchar ucs); extern FXAPI bool isAlphaNumeric(FXwchar ucs); extern FXAPI bool isControl(FXwchar ucs); extern FXAPI bool isSpace(FXwchar ucs); extern FXAPI bool isBlank(FXwchar ucs); extern FXAPI bool isPunct(FXwchar ucs); extern FXAPI bool isGraph(FXwchar ucs); extern FXAPI bool isPrint(FXwchar ucs); extern FXAPI bool isHexDigit(FXwchar ucs); extern FXAPI bool isSymbol(FXwchar ucs); extern FXAPI bool isMark(FXwchar ucs); extern FXAPI bool isSep(FXwchar ucs); /// Case conversion extern FXAPI FXwchar toUpper(FXwchar ucs); extern FXAPI FXwchar toLower(FXwchar ucs); extern FXAPI FXwchar toTitle(FXwchar ucs); } } #endif fox1.6-1.6.57/include/fxver.h000066400000000000000000000003041326741342000155600ustar00rootroot00000000000000#ifndef FXVER_H #define FXVER_H // FOX version #define FOX_MAJOR 1 #define FOX_MINOR 6 #define FOX_LEVEL 57 // FOX byte order #ifndef FOX_BIGENDIAN #define FOX_BIGENDIAN 0 #endif #endif fox1.6-1.6.57/include/fxver.h.in000066400000000000000000000004051326741342000161670ustar00rootroot00000000000000#ifndef FXVER_H #define FXVER_H // FOX version #define FOX_MAJOR @FOX_MAJOR_VERSION@ #define FOX_MINOR @FOX_MINOR_VERSION@ #define FOX_LEVEL @FOX_PATCH_LEVEL@ // FOX byte order #ifndef FOX_BIGENDIAN #define FOX_BIGENDIAN @FOX_BYTEORDER@ #endif #endif fox1.6-1.6.57/include/xincs.h000066400000000000000000000227401326741342000155620ustar00rootroot00000000000000/******************************************************************************** * * * F O X P r i v a t e I n c l u d e F i l e s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: xincs.h,v 1.73 2006/01/22 17:58:14 fox Exp $ * ********************************************************************************/ #ifndef XINCS_H #define XINCS_H //////////////////// DO NOT INCLUDE THIS PRIVATE HEADER FILE ////////////////// // Thread safe #ifndef _POSIX_PTHREAD_SEMANTICS #define _POSIX_PTHREAD_SEMANTICS #endif // GNU extras if we can get them #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif // Use 64-bit files #ifndef WIN32 #ifndef _FILE_OFFSET_BITS #define _FILE_OFFSET_BITS 64 #endif #endif // Basic includes #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef WIN32 #include #include #include #ifdef HAVE_SYS_FILIO_H // Get FIONREAD on Solaris #include #endif #else #include // For _access() #if defined(_MSC_VER) || defined(__WATCOMC__) // Microsoft Visual C++ or Watcom C++ #include #define stat _stat #define lstat _stat #define getcwd _getcwd #define mkdir _mkdir #define access _access #define vsnprintf _vsnprintf #define execl _execl #define execlp _execlp #define execle _execle #define execv _execv #define execve _execve #define execvp _execvp #define strdup _strdup #define alloca _alloca #endif #ifdef __BORLANDC__ // Borland C++ Builder #include #if __BORLANDC__ <= 0x0530 // C++ Builder 3.0 #define vsnprintf(a, b, c, d) vsprintf(a, c, d) #endif #define lstat stat #endif #ifdef __MINGW32__ // GCC MingW32 #include #define vsnprintf _vsnprintf #endif #ifdef __SC__ // Digital Mars C++ Compiler #include #include // For _access() #define vsnprintf _vsnprintf #endif #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_SYS_WAIT_H #include #endif #ifdef TIME_WITH_SYS_TIME #include #include #else #ifdef HAVE_SYS_TIME_H #include #else #include #endif #endif #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SELECT_H #if (!defined(__MINGW32__)) && (!defined(hpux)) #include #endif #endif #ifdef HAVE_DIRENT_H #include #define NAMLEN(dirent) strlen((dirent)->d_name) #else #define dirent direct #define NAMLEN(dirent) (dirent)->d_namlen #ifdef HAVE_SYS_NDIR_H #include #endif #ifdef HAVE_SYS_DIR_H #include #endif #ifdef HAVE_NDIR_H #include #endif #endif #ifdef HAVE_XSHM_H #include #include #endif #ifdef HAVE_MMAP #include #endif // For thread-safe readdir_r, we sometimes need extra // space above and beyond the space for dirent itself #ifdef HAVE_DIRENT_H #ifndef WIN32 struct fxdirent : public dirent { char buffer[256]; }; #endif #endif // MS-Windows #ifdef WIN32 #ifndef STRICT #define STRICT #endif #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include #ifndef __CYGWIN__ #include #endif #include // For _TrackMouseEvent #include // X windows includes #else #include #define XRegisterIMInstantiateCallback broken_XRegisterIMInstantiateCallback #define XUnregisterIMInstantiateCallback broken_XUnregisterIMInstantiateCallback #define XSetIMValues broken_XSetIMValues #include #undef XRegisterIMInstantiateCallback #undef XUnregisterIMInstantiateCallback #undef XSetIMValues #include #include #include #include #include #ifdef HUMMINGBIRD #include #endif #ifdef HAVE_XSHM_H #include #endif #ifdef HAVE_XCURSOR_H #include #endif #ifdef HAVE_XFT_H #include #endif #ifdef HAVE_XSHAPE_H #include #endif #ifdef HAVE_XRANDR_H #include #endif #ifndef NO_XIM #ifndef XlibSpecificationRelease // Not defined until X11R5 #define NO_XIM #elif XlibSpecificationRelease < 6 // Need at least Xlib X11R6 #define NO_XIM #endif #endif #ifndef NO_XIM extern "C" Bool XRegisterIMInstantiateCallback(Display*,struct _XrmHashBucketRec*,char*,char*,XIMProc,XPointer); extern "C" Bool XUnregisterIMInstantiateCallback(Display*,struct _XrmHashBucketRec*,char*,char*,XIMProc,XPointer); extern "C" char *XSetIMValues(XIM,...); #endif #endif // OpenGL includes #ifdef HAVE_GL_H #ifndef SUN_OGL_NO_VERTEX_MACROS #define SUN_OGL_NO_VERTEX_MACROS #endif #ifndef HPOGL_SUPPRESS_FAST_API #define HPOGL_SUPPRESS_FAST_API #endif #include #ifndef WIN32 #include #endif #endif #ifndef GLAPIENTRY #define GLAPIENTRY #endif #ifndef GLAPI #define GLAPI #endif #ifdef HAVE_GLU_H #include #endif // Maximum path length #ifndef MAXPATHLEN #if defined(PATH_MAX) #define MAXPATHLEN PATH_MAX #elif defined(_MAX_PATH) #define MAXPATHLEN _MAX_PATH #elif defined(MAX_PATH) #define MAXPATHLEN MAX_PATH #else #define MAXPATHLEN 1024 #endif #endif // Modes for access(filename,mode) on Windows #ifdef WIN32 #ifndef R_OK #define R_OK 4 #endif #ifndef W_OK #define W_OK 2 #endif #ifndef X_OK #define X_OK 1 #endif #ifndef F_OK #define F_OK 0 #endif #endif // File open modes on Windows #ifdef WIN32 #if defined(_MSC_VER) #define O_APPEND _O_APPEND #define O_CREAT _O_CREAT #define O_EXCL _O_EXCL #define O_RDONLY _O_RDONLY #define O_RDWR _O_RDWR #define O_TRUNC _O_TRUNC #define O_WRONLY _O_WRONLY #define O_BINARY _O_BINARY #endif #endif // Some systems don't have it #ifndef SEEK_SET #define SEEK_SET 0 #endif #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif // Printer stuff #ifdef WIN32 #include #endif // Wheel support (OS >= W98, OS>=NT4.0) #ifdef WIN32 // Missing wheel message id's #ifndef SPI_GETWHEELSCROLLLINES #define SPI_GETWHEELSCROLLLINES 104 #endif #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL 0x020A #endif // GetSystemMetrics parameters missing in header files #ifndef SM_XVIRTUALSCREEN #define SM_XVIRTUALSCREEN 76 #endif #ifndef SM_YVIRTUALSCREEN #define SM_YVIRTUALSCREEN 77 #endif #ifndef SM_CXVIRTUALSCREEN #define SM_CXVIRTUALSCREEN 78 #endif #ifndef SM_CYVIRTUALSCREEN #define SM_CYVIRTUALSCREEN 79 #endif #ifndef SM_CMONITORS #define SM_CMONITORS 80 #endif #ifndef SM_SAMEDISPLAYFORMAT #define SM_SAMEDISPLAYFORMAT 81 #endif // Missing in CYGWIN #ifndef IMAGE_SUBSYSTEM_NATIVE_WINDOWS #define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 #endif #ifndef IMAGE_SUBSYSTEM_WINDOWS_CE_GUI #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 #endif #endif // IBM VisualAge for C++ 3.5 #if defined(__IBMCPP__) && defined(WIN32) #include #include // for _access() #define _mkdir(x) mkdir((char *)(x)) #define _vsnprintf(a, b, c, d) vsprintf(a, c, d) #define ICON_SMALL 0 #define ICON_BIG 1 #define bool int // This declarations come from Microsoft SDK #define TME_HOVER 0x00000001 #define TME_LEAVE 0x00000002 #define TME_QUERY 0x40000000 #define TME_CANCEL 0x80000000 #define HOVER_DEFAULT 0xFFFFFFFF #define WM_MOUSEHOVER 0x02A1 #define WM_MOUSELEAVE 0x02A3 typedef struct tagTRACKMOUSEEVENT { DWORD cbSize; DWORD dwFlags; HWND hwndTrack; DWORD dwHoverTime; } TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT; WINUSERAPI BOOL WINAPI TrackMouseEvent( IN OUT LPTRACKMOUSEEVENT lpEventTrack); #ifdef __GL_H__ #define GL_COLOR_LOGIC_OP 0x0BF2 #define GL_POLYGON_OFFSET_POINT 0x2A01 #define GL_POLYGON_OFFSET_LINE 0x2A02 WINGDIAPI void APIENTRY glPolygonOffset (GLfloat factor,GLfloat units); #endif #endif #endif fox1.6-1.6.57/index.html000066400000000000000000000011441326741342000146320ustar00rootroot00000000000000 The FOX GUI Library  

    The FOX GUI Library is found here.
    fox1.6-1.6.57/install-sh000077500000000000000000000345241326741342000146510ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2016-01-11.22; # 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. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # 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_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 is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else dstdir=`dirname "$dst"` 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-writable 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 oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && 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: "UTC0" # time-stamp-end: "; # UTC" # End: fox1.6-1.6.57/ltmain.sh000066400000000000000000011707711326741342000144730ustar00rootroot00000000000000#! /bin/sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2014-01-03.01 # libtool (GNU libtool) 2.4.6 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.6 package_revision=2.4.6 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2015-01-20.17; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # Copyright (C) 2004-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # This program is free software; you can 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. # As a special exception to the GNU General Public License, if you distribute # this file as part of a program or library that is built using GNU Libtool, # you may include this file under the same distribution terms that you use # for the rest of that program. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU # 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 . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! 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 # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! 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 ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1+=\\ \$func_quote_for_eval_result" }' else func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1=\$$1\\ \$func_quote_for_eval_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_for_eval ARG... # -------------------------- # Aesthetically quote ARGs to be evaled later. # This function returns two values: # i) func_quote_for_eval_result # double-quoted, suitable for a subsequent eval # ii) func_quote_for_eval_unquoted_result # has all characters that are still active within double # quotes backslashified. func_quote_for_eval () { $debug_cmd func_quote_for_eval_unquoted_result= func_quote_for_eval_result= while test 0 -lt $#; do case $1 in *[\\\`\"\$]*) _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; *) _G_unquoted_arg=$1 ;; esac if test -n "$func_quote_for_eval_unquoted_result"; then func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" else func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" fi case $_G_unquoted_arg in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_quoted_arg=\"$_G_unquoted_arg\" ;; *) _G_quoted_arg=$_G_unquoted_arg ;; esac if test -n "$func_quote_for_eval_result"; then func_append func_quote_for_eval_result " $_G_quoted_arg" else func_append func_quote_for_eval_result "$_G_quoted_arg" fi shift done } # func_quote_for_expand ARG # ------------------------- # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { $debug_cmd case $1 in *[\\\`\"]*) _G_arg=`$ECHO "$1" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; *) _G_arg=$1 ;; esac case $_G_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_arg=\"$_G_arg\" ;; esac func_quote_for_expand_result=$_G_arg } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_for_expand "$_G_cmd" eval "func_notquiet $func_quote_for_expand_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_for_expand "$_G_cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # Set a version string for this script. scriptversion=2014-01-07.03; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # Copyright (C) 2010-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # This program is free software: you can 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 . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# warranty; '. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # to the main code. A hook is just a named list of of function, that can # be run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of functions called by FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It is assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook funcions.n" ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do eval $_G_hook '"$@"' # store returned options list back into positional # parameters for next 'cmd' execution. eval _G_hook_result=\$${_G_hook}_result eval set dummy "$_G_hook_result"; shift done func_quote_for_eval ${1+"$@"} func_run_hooks_result=$func_quote_for_eval_result } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list in your hook function, remove any # options that you action, and then pass back the remaining unprocessed # options in '_result', escaped suitably for # 'eval'. Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # func_quote_for_eval ${1+"$@"} # my_options_prep_result=$func_quote_for_eval_result # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # # Note that for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # ;; # *) set dummy "$_G_opt" "$*"; shift; break ;; # esac # done # # func_quote_for_eval ${1+"$@"} # my_silent_option_result=$func_quote_for_eval_result # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # # func_quote_for_eval ${1+"$@"} # my_option_validation_result=$func_quote_for_eval_result # } # func_add_hook func_validate_options my_option_validation # # You'll alse need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd func_options_prep ${1+"$@"} eval func_parse_options \ ${func_options_prep_result+"$func_options_prep_result"} eval func_validate_options \ ${func_parse_options_result+"$func_parse_options_result"} eval func_run_hooks func_options \ ${func_validate_options_result+"$func_validate_options_result"} # save modified positional parameters for caller func_options_result=$func_run_hooks_result } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propogate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before # returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} # save modified positional parameters for caller func_options_prep_result=$func_run_hooks_result } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd func_parse_options_result= # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} # Adjust func_parse_options positional parameters to match eval set dummy "$func_run_hooks_result"; shift # Break out of the loop if we already parsed every option. test $# -gt 0 || break _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) test $# = 0 && func_missing_arg $_G_opt && break case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} func_parse_options_result=$func_quote_for_eval_result } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE # save modified positional parameters for caller func_validate_options_result=$func_run_hooks_result } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables after # splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} test "x$func_split_equals_lhs" = "x$1" \ && func_split_equals_rhs= }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /(C)/!b go :more /\./!{ N s|\n# | | b more } :go /^# Written by /,/# warranty; / { s|^# || s|^# *$|| s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| p } /^# Written by / { s|^# || p } /^warranty; /q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --mode=MODE use operation mode MODE --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname (GNU libtool) 2.4.6 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func__fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Pass back the list of options. func_quote_for_eval ${1+"$@"} libtool_options_prep_result=$func_quote_for_eval_result } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} libtool_parse_options_result=$func_quote_for_eval_result } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote_for_eval ${1+"$@"} libtool_validate_options_result=$func_quote_for_eval_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module=$wl-multi_module continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "'-no-install' is ignored for $host" func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -os2dllname) prev=os2dllname continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -stdlib=* select c++ std lib with clang -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_for_eval "$arg" arg=$func_quote_for_eval_result fi ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the '$prevarg' option requires an argument" if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname=$func_basename_result libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs=$tmp_deplibs fi if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs=$dlprefiles fi if test dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib=$searchdir/lib$name$search_ext if test -f "$lib"; then if test .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll=$l done if test "X$ll" = "X$old_library"; then # only static version available found=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir=$func_dirname_result dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test prog != "$linkmode" && test lib != "$linkmode"; then func_fatal_error "'$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib=$l done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. if test dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir=$ladir fi ;; esac func_basename "$lib" laname=$func_basename_result # Find the relevant object directory and library name. if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library '$lib' was moved." dir=$ladir absdir=$abs_ladir libdir=$abs_ladir else dir=$lt_sysroot$libdir absdir=$lt_sysroot$libdir fi test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir=$ladir absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else dir=$ladir/$objdir absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; then func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule=$dlpremoduletest break fi done if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test lib = "$linkmode" && test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result versuffix=-$major ;; esac eval soname=\"$soname_spec\" else soname=$realname fi # Make a new name for the extract_expsyms_cmds to use soroot=$soname func_basename "$soroot" soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; then add=$dir/$linklib case $host in *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library"; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add=$dir/$old_library fi elif test -n "$old_library"; then add=$dir/$old_library fi fi esac elif test no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name elif test yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test prog = "$linkmode"; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib"; then add=$inst_prefix_dir$libdir/$linklib else add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name fi if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test unsupported != "$hardcode_direct"; then test -n "$old_library" && linklib=$old_library compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system cannot link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test yes = "$module"; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of '$dir'" absdir=$dir fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names"; then for tmp in $deplibrary_names; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl"; then depdepl=$absdir/$objdir/$depdepl darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) path=-L$absdir/$objdir ;; esac else eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "'$deplib' seems to be moved" path=-L$absdir fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test link = "$pass"; then if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs=$newdependency_libs if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i= ;; esac if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs=$output func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test pass_all != "$deplibs_check_method"; then func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift IFS=$save_ifs test -n "$7" && \ func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major=$1 number_minor=$2 number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|qnx|sunos) current=$number_major revision=$number_minor age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_minor lt_irix_increment=no ;; esac ;; no) current=$1 revision=$2 age=$3 ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT '$current' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION '$revision' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE '$age' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE '$age' is greater than the current interface number '$current'" func_fatal_error "'$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring_prefix$major.$iface:$verstring done # Before this point, $major must not contain '.'. major=.$major versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=.$current.$age.$revision verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring:$iface.0 done # Make executables depend on our current version. func_append verstring ":$current.0" ;; qnx) major=.$current versuffix=.$current ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result versuffix=-$major ;; *) func_fatal_configuration "unknown library version type '$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring=0.0 ;; esac if test no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release= versuffix= major= newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test yes = "$allow_libtool_libs_with_static_runtimes"; then for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test none = "$deplibs_check_method"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test yes = "$droppeddeps"; then if test yes = "$module"; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test no = "$allow_undefined"; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath=$finalize_shlibpath test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname=$realname fi if test -z "$dlname"; then dlname=$soname fi lib=$output_objdir/$realname linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS=$save_ifs if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi ${skipped_export-false} && { func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi } libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs=$IFS; IFS='~' for cmd in $cmds; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs # Restore the uninstalled library and exit if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ func_warning "'-version-info' is ignored for objects" test -n "$release" && \ func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj=$output ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS } if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "'-version-info' is ignored for programs" test -n "$release" && \ func_warning "'-release' is ignored for programs" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " $wl-bind_at_load" func_append finalize_command " $wl-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath=$rpath rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath=$rpath if test -n "$libobjs" && test yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.$objext"; then func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status } if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test yes = "$no_install"; then # We don't need to create a wrapper script. link_command=$compile_var$compile_command$compile_rpath # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi case $hardcode_action,$fast_install in relink,*) # Fast installation is not supported link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath func_warning "this platform does not like uninstalled shared libraries" func_warning "'$output' will be relinked during installation" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource=$output_path/$objdir/lt-$output_name.c cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac if test -n "$addlibs"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; then if test -z "$install_libdir"; then break fi output=$output_objdir/${outputname}i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name=$func_basename_result func_resolve_sysroot "$deplib" eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic for arg do case $arg in -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir=$func_dirname_result if test . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif $rmforce; then continue fi rmfiles=$file case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.$objext" if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name"; then func_append rmfiles " $odir/lt-$noexename.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the $objdir's in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi test -z "$opt_mode" && { help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: fox1.6-1.6.57/missing000077500000000000000000000153311326741342000142370ustar00rootroot00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2016-01-11.22; # UTC # Copyright (C) 1996-2017 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fox1.6-1.6.57/pathfinder/000077500000000000000000000000001326741342000147615ustar00rootroot00000000000000fox1.6-1.6.57/pathfinder/CopyDialog.cpp000066400000000000000000000066371326741342000175330ustar00rootroot00000000000000/******************************************************************************** * * * F i l e C o p y D i a l o g * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: CopyDialog.cpp,v 1.4 2006/01/22 17:58:15 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fx.h" #include "CopyDialog.h" /* Notes: - Make this look better */ /********************************** Preferences ******************************/ FXIMPLEMENT(CopyDialog,FXDialogBox,NULL,0) // Create properties dialog CopyDialog::CopyDialog(FXWindow *owner,const FXString& name):FXDialogBox(owner,name,DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,0,0,0,0, 4,4,4,4, 4,4){ FXHorizontalFrame* buttons=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0, 0,0,0,0); new FXButton(buttons,tr("&Cancel"),NULL,this,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y,0,0,0,0,20,20); new FXButton(buttons,tr("&OK"),NULL,this,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXHorizontalSeparator(this,SEPARATOR_GROOVE|LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); FXMatrix *matrix=new FXMatrix(this,2,MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); new FXLabel(matrix,tr("&Old name:"),NULL,LAYOUT_FILL_X|JUSTIFY_LEFT); oldname=new FXTextField(matrix,50,NULL,0,TEXTFIELD_ENTER_ONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); oldname->setEditable(FALSE); new FXLabel(matrix,tr("&New name:"),NULL,LAYOUT_FILL_X|JUSTIFY_LEFT); newname=new FXTextField(matrix,50,this,FXDialogBox::ID_ACCEPT,TEXTFIELD_ENTER_ONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); } // Destroy CopyDialog::~CopyDialog(){ oldname=(FXTextField*)-1L; newname=(FXTextField*)-1L; } fox1.6-1.6.57/pathfinder/CopyDialog.h000066400000000000000000000050431326741342000171660ustar00rootroot00000000000000/******************************************************************************** * * * F i l e C o p y D i a l o g * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: CopyDialog.h,v 1.4 2006/01/22 17:58:15 fox Exp $ * ********************************************************************************/ #ifndef COPYDIALOG_H #define COPYDIALOG_H // Copy/Move/Link/Rename dialog class CopyDialog : public FXDialogBox { FXDECLARE(CopyDialog) protected: FXTextField *oldname; FXTextField *newname; private: CopyDialog(){} CopyDialog(const CopyDialog&); public: // Construct copy/move/link/rename dialog CopyDialog(FXWindow *owner,const FXString& name); // Get/set old name void setOldName(const FXString& nm){ oldname->setText(nm); } FXString getOldName() const { return oldname->getText(); } // Get/set new name void setNewName(const FXString& nm){ newname->setText(nm); } FXString getNewName() const { return newname->getText(); } // Destroy virtual ~CopyDialog(); }; #endif fox1.6-1.6.57/pathfinder/LICENSE000066400000000000000000000431241326741342000157720ustar00rootroot00000000000000 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. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. fox1.6-1.6.57/pathfinder/Makefile.am000066400000000000000000000024531326741342000170210ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp LDADD = $(top_builddir)/src/libFOX-1.6.la -lm bin_PROGRAMS = PathFinder man_MANS = PathFinder.1 ICONS = \ bigicons.bmp \ closepanel.gif \ clrbook.gif \ copy.bmp \ copyit.gif \ cut.bmp \ deleteit.bmp \ desktop.bmp \ details.bmp \ dirup.bmp \ enter.gif \ file_gif.gif \ foxbig.gif \ foxmini.gif \ goback.bmp \ goforw.bmp \ gotodir.bmp \ home.gif \ hosts.bmp \ iconpath.gif \ linkit.gif \ location.gif \ maphost.bmp \ mimetype.gif \ moveit.gif \ paste.bmp \ pattern_gif.gif \ properties.bmp \ quit_gif.gif \ renameit.gif \ rotateleft.gif \ rotateright.gif \ setbook.gif \ setdir.gif \ smallicons.bmp \ unmaphost.bmp \ work.gif PathFinder_SOURCES = \ icons.h \ icons.cpp \ CopyDialog.h \ CopyDialog.cpp \ PathFinder.cpp \ PathFinder.h \ Preferences.cpp \ Preferences.h \ PropertyDialog.cpp \ PropertyDialog.h \ LICENSE \ $(ICONS) PathFinder.cpp: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $^ icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $^ CLEANFILES = icons.h icons.cpp EXTRA_DIST = $(man_MANS) \ Makefile.bc \ Makefile.wc \ Makefile.dmc fox1.6-1.6.57/pathfinder/Makefile.bc000066400000000000000000000066641326741342000170200ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Copyright (C) 1997,2005 by Jeroen van der Zijp. All Rights Reserved. # ############################################################################## # $Id: Makefile.bc,v 1.23 2005/09/22 11:14:48 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # For use with Borland C++ Builder 3 or later CXX = bcc32 CXXFLAGS = -5 -O2 -w-par -w-csu -w-aus RM = del TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = bcc32 LDFLAGS = -laa INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = PathFinder.exe OBJECTS = \ PathFinder.obj \ PropertyDialog.obj \ Preferences.obj \ CopyDialog.obj \ icons.obj ICONS = \ bigicons.bmp \ closepanel.gif \ clrbook.gif \ copy.bmp \ copyit.gif \ cut.bmp \ deleteit.bmp \ desktop.bmp \ details.bmp \ dirup.bmp \ enter.gif \ file_gif.gif \ foxbig.gif \ foxmini.gif \ goback.bmp \ goforw.bmp \ gotodir.bmp \ home.gif \ hosts.bmp \ iconpath.gif \ linkit.gif \ location.gif \ maphost.bmp \ mimetype.gif \ moveit.gif \ paste.bmp \ pattern_gif.gif \ properties.bmp \ quit_gif.gif \ renameit.gif \ rotateleft.gif \ rotateright.gif \ setbook.gif \ setdir.gif \ smallicons.bmp \ unmaphost.bmp \ work.gif .cpp.obj: $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) pathfinder.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) PathFinder.obj: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $** icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $** clean: $(RM) *.obj $(RM) *.exe $(RM) *.tds $(RM) icons.cpp $(RM) icons.h fox1.6-1.6.57/pathfinder/Makefile.dmc000066400000000000000000000070411326741342000171650ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Contributed by: Andre Fornacon # ############################################################################## # $Id: Makefile.dmc,v 1.14.2.1 2006/08/08 23:17:35 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # Digital Mars C++ Compiler 8.x or later CXX = dmc CXXFLAGS = -mn -5 -a8 RM = del TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = link LDFLAGS = LIBS = advapi32.lib+shell32.lib+gdi32.lib+wsock32.lib INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = PathFinder.exe OBJECTS = \ PathFinder.obj \ PropertyDialog.obj \ Preferences.obj \ icons.obj ICONS_1 = \ bigicons.bmp \ bigpenguin.bmp \ closepanel.gif \ clrbook.gif \ copy.bmp \ copyit.gif \ cut.bmp \ deleteit.bmp \ desktop.bmp \ details.bmp \ dirup.bmp \ enter.gif \ file_gif.gif \ goback.bmp \ goforw.bmp \ gotodir.bmp \ ICONS_2 = \ home.gif \ hosts.bmp \ iconpath.gif \ linkit.gif \ location.gif \ maphost.bmp \ minipenguin.bmp \ moveit.gif \ paste.bmp \ pattern_gif.gif \ properties.bmp \ quit_gif.gif \ renameit.gif \ rotateleft.gif \ rotateright.gif \ setbook.gif \ smallicons.bmp \ unmaphost.bmp \ work.gif ICONS = $(ICONS_1) $(ICONS_2) .cpp.obj: $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) pathfinder.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) $(LIBS) PathFinder.obj: icons.h icons.cpp icons.h: $(ICONS) $(RM) $@ $(RESWRAP) -i -oa $@ $(ICONS_1) $(RESWRAP) -i -oa $@ $(ICONS_2) icons.cpp: $(ICONS) $(RM) $@ echo ^#include "icons.h" > $@ $(RESWRAP) -oa $@ $(ICONS_1) $(RESWRAP) -oa $@ $(ICONS_2) clean: $(RM) *.obj *.exe *.tds # icons.cpp icons.h fox1.6-1.6.57/pathfinder/Makefile.in000066400000000000000000000610061326741342000170310ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = PathFinder$(EXEEXT) subdir = pathfinder ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am__objects_1 = am_PathFinder_OBJECTS = icons.$(OBJEXT) CopyDialog.$(OBJEXT) \ PathFinder.$(OBJEXT) Preferences.$(OBJEXT) \ PropertyDialog.$(OBJEXT) $(am__objects_1) PathFinder_OBJECTS = $(am_PathFinder_OBJECTS) PathFinder_LDADD = $(LDADD) PathFinder_DEPENDENCIES = $(top_builddir)/src/libFOX-1.6.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(PathFinder_SOURCES) DIST_SOURCES = $(PathFinder_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp LDADD = $(top_builddir)/src/libFOX-1.6.la -lm man_MANS = PathFinder.1 ICONS = \ bigicons.bmp \ closepanel.gif \ clrbook.gif \ copy.bmp \ copyit.gif \ cut.bmp \ deleteit.bmp \ desktop.bmp \ details.bmp \ dirup.bmp \ enter.gif \ file_gif.gif \ foxbig.gif \ foxmini.gif \ goback.bmp \ goforw.bmp \ gotodir.bmp \ home.gif \ hosts.bmp \ iconpath.gif \ linkit.gif \ location.gif \ maphost.bmp \ mimetype.gif \ moveit.gif \ paste.bmp \ pattern_gif.gif \ properties.bmp \ quit_gif.gif \ renameit.gif \ rotateleft.gif \ rotateright.gif \ setbook.gif \ setdir.gif \ smallicons.bmp \ unmaphost.bmp \ work.gif PathFinder_SOURCES = \ icons.h \ icons.cpp \ CopyDialog.h \ CopyDialog.cpp \ PathFinder.cpp \ PathFinder.h \ Preferences.cpp \ Preferences.h \ PropertyDialog.cpp \ PropertyDialog.h \ LICENSE \ $(ICONS) CLEANFILES = icons.h icons.cpp EXTRA_DIST = $(man_MANS) \ Makefile.bc \ Makefile.wc \ Makefile.dmc all: all-am .SUFFIXES: .SUFFIXES: .gif .bmp .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign pathfinder/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign pathfinder/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list PathFinder$(EXEEXT): $(PathFinder_OBJECTS) $(PathFinder_DEPENDENCIES) $(EXTRA_PathFinder_DEPENDENCIES) @rm -f PathFinder$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(PathFinder_OBJECTS) $(PathFinder_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CopyDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PathFinder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Preferences.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PropertyDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icons.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 .PRECIOUS: Makefile PathFinder.cpp: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $^ icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $^ # 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: fox1.6-1.6.57/pathfinder/Makefile.wc000066400000000000000000000072121326741342000170330ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Copyright (C) 1997,2005 by Jeroen van der Zijp. All Rights Reserved. # ############################################################################## # $Id: Makefile.wc,v 1.9 2005/09/03 06:55:30 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # For use with OpenWatcom C++ v1.0 or later CXX = wpp386 CXXFLAGS = /w3 /e1 /zq /5r /ei /xs /xr /fp5 /otexan /zp=4 RM = del TOPDIR = .. DEFINES = -DFOX_BIGENDIAN=0 -DNDEBUG -D_WINDOWS -DWIN32 -DUNICODE -DHAVE_GL_H -DHAVE_GLU_H -DHAVE_VSSCANF #-DHAVE_PNG_H -DHAVE_JPEG_H -DHAVE_TIFF_H -DXMD_H LD = wcl386 LDFLAGS = -l=nt_win -x # -x = case sensitive INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib $(%WATCOM)\lib386\nt\comctl32.lib $(%WATCOM)\lib386\nt\wsock32.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = PathFinder.exe OBJECTS = PathFinder.obj OBJECTS += PropertyDialog.obj OBJECTS += Preferences.obj OBJECTS += CopyDialog.obj OBJECTS += icons.obj ICONS = ICONS += bigicons.bmp ICONS += closepanel.gif ICONS += clrbook.gif ICONS += copy.bmp ICONS += copyit.gif ICONS += cut.bmp ICONS += deleteit.bmp ICONS += desktop.bmp ICONS += details.bmp ICONS += dirup.bmp ICONS += enter.gif ICONS += file_gif.gif ICONS += goback.bmp ICONS += goforw.bmp ICONS += gotodir.bmp ICONS += home.gif ICONS += hosts.bmp ICONS += iconpath.gif ICONS += linkit.gif ICONS += location.gif ICONS += maphost.bmp ICONS += moveit.gif ICONS += paste.bmp ICONS += pattern_gif.gif ICONS += properties.bmp ICONS += quit_gif.gif ICONS += renameit.gif ICONS += rotateleft.gif ICONS += rotateright.gif ICONS += setbook.gif ICONS += smallicons.bmp ICONS += unmaphost.bmp ICONS += work.gif ICONS += foxbig.gif ICONS += foxmini.gif ICONS += mimetype.gif ICONS += setdir.gif .cpp.obj: .AUTODEPEND $(CXX) $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) pathfinder.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) PathFinder.obj: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $(ICONS) icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $(ICONS) clean: .SYMBOLIC $(RM) *.obj $(RM) *.exe $(RM) *.err $(RM) icons.cpp $(RM) icons.h fox1.6-1.6.57/pathfinder/PathFinder.1000066400000000000000000000012671326741342000170750ustar00rootroot00000000000000.TH PATHFINDER 1 "16 October 2001" .SH NAME PathFinder \- simple file manager .SH SYNOPSIS \fBPathFinder\fP [\fIstartdir\fP] .SH DESCRIPTION PathFinder features file mime-type bindings, customizable file- and directory icons, directory bookmarking, drag and drop (compatible with KDE and GNOME), and wildcard matching to reduce the number of visible files. It is probably the fastest file manager you've ever seen. .LP .SH AUTHOR This manpage was originally written by Bastian Kleineidam for the Debian distribution of the FOX Toolkit. The main author of FOX is Jeroen van der Zijp . For a list of contributors see /usr/share/doc/libfox0.99/AUTHORS. fox1.6-1.6.57/pathfinder/PathFinder.cpp000066400000000000000000002275101326741342000175200ustar00rootroot00000000000000/******************************************************************************** * * * T h e P a t h F i n d e r F i l e B r o w s e r * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: PathFinder.cpp,v 1.125 2006/01/22 17:58:15 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fx.h" #include "fxkeys.h" #include "PathFinder.h" #include "PropertyDialog.h" #include "Preferences.h" #include "CopyDialog.h" #include "icons.h" #include #include // Support for extra image formats #ifdef HAVE_PNG_H #include "FXPNGImage.h" #endif #ifdef HAVE_JPEG_H #include "FXJPGImage.h" #endif #ifdef HAVE_TIFF_H #include "FXTIFImage.h" #endif #include "FXICOImage.h" #include "FXTGAImage.h" #include "FXRGBImage.h" #include "FXPCXImage.h" /* Notes: - Copy / Paste /Cut doesn't seem to work - If you drag some files to a certain directory in the dir-list, hilight the directory so we're sure we are dropping it in the right directory... - Settings dialog like the one in TextEdit.... - Edit menu layout should change: Undo Redo separator Cut Copy Paste Delete separator Select DeSelect Invert Selection - Mount/Unmount functionality.... - A special bookmark button like home/work for /mnt/cdrom or/and just the /mnt directory - Selecting multiple files and clicking Open With only displays the first file ... not the whole range you've selected.... mayby we should show the first and the last file of the selection: (file1.htm ... file99.htm) - Change 'Delete Files' dynamically depending on the amount of files you've selected: so 1 file shows only Delete File.... same thing for the dialog that shows up.... - Time in statusbar as in TextEdit */ /*******************************************************************************/ // Map FXDEFMAP(PathFinderMain) PathFinderMainMap[]={ FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_MAINWINDOW,PathFinderMain::onUpdTitle), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_DIRECTORYLIST,PathFinderMain::onCmdDirectory), FXMAPFUNC(SEL_CLICKED,PathFinderMain::ID_FILELIST,PathFinderMain::onCmdFileClicked), FXMAPFUNC(SEL_DOUBLECLICKED,PathFinderMain::ID_FILELIST,PathFinderMain::onCmdFileDblClicked), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,PathFinderMain::ID_FILELIST,PathFinderMain::onFileListPopup), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_ABOUT,PathFinderMain::onCmdAbout), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_DIRBOX,PathFinderMain::onCmdDirTree), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_UPDIRECTORY,PathFinderMain::onCmdUpDirectory), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_CLEAR_LOCATION,PathFinderMain::onCmdClearLocation), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_GOTO_LOCATION,PathFinderMain::onCmdGotoLocation), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_UPDATE_FILES,PathFinderMain::onUpdFiles), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_STATUSLINE,PathFinderMain::onUpdStatusline), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_GO_WORK,PathFinderMain::onCmdWorkDirectory), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_GO_HOME,PathFinderMain::onCmdHomeDirectory), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_GO_RECENT,PathFinderMain::onCmdRecentDirectory), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_GO_BACKWARD,PathFinderMain::onCmdBackDirectory), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_GO_BACKWARD,PathFinderMain::onUpdBackDirectory), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_GO_FORWARD,PathFinderMain::onCmdForwardDirectory), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_GO_FORWARD,PathFinderMain::onUpdForwardDirectory), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_SAVE_SETTINGS,PathFinderMain::onCmdSaveSettings), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_NEW_PATHFINDER,PathFinderMain::onCmdNewPathFinder), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_PROPERTIES,PathFinderMain::onCmdProperties), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_PROPERTIES,PathFinderMain::onUpdProperties), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_BOOKMARK,PathFinderMain::onCmdBookmark), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_CLIPBOARD_CUT,PathFinderMain::onCmdClipboardCut), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_CLIPBOARD_CUT,PathFinderMain::onUpdSelected), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_CLIPBOARD_COPY,PathFinderMain::onCmdClipboardCopy), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_CLIPBOARD_COPY,PathFinderMain::onUpdSelected), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_CLIPBOARD_PASTE,PathFinderMain::onCmdClipboardPaste), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_NEW,PathFinderMain::onCmdNew), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_NEW,PathFinderMain::onUpdNew), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_COPY,PathFinderMain::onCmdCopy), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_COPY,PathFinderMain::onUpdSelected), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_MOVE,PathFinderMain::onCmdMove), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_MOVE,PathFinderMain::onUpdSelected), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_LINK,PathFinderMain::onCmdLink), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_LINK,PathFinderMain::onUpdSelected), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_RENAME,PathFinderMain::onCmdRename), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_RENAME,PathFinderMain::onUpdSelected), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_DELETE,PathFinderMain::onCmdDelete), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_DELETE,PathFinderMain::onUpdSelected), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_FILEFILTER,PathFinderMain::onCmdFilter), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_GOTO_DIR,PathFinderMain::onCmdGotoDir), FXMAPFUNCS(SEL_COMMAND,PathFinderMain::ID_RUSR,PathFinderMain::ID_SVTX,PathFinderMain::onCmdChmod), FXMAPFUNCS(SEL_UPDATE,PathFinderMain::ID_RUSR,PathFinderMain::ID_SVTX,PathFinderMain::onUpdChmod), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_OWNER,PathFinderMain::onUpdOwner), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_GROUP,PathFinderMain::onUpdGroup), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_FILE_CREATED,PathFinderMain::onUpdCreateTime), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_FILE_MODIFIED,PathFinderMain::onUpdModifyTime), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_FILE_ACCESSED,PathFinderMain::onUpdAccessTime), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_FILE_TYPE,PathFinderMain::onUpdFileType), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_FILE_LOCATION,PathFinderMain::onUpdFileLocation), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_FILE_SIZE,PathFinderMain::onUpdFileSize), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_FILE_DESC,PathFinderMain::onUpdFileDesc), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_OPEN,PathFinderMain::onUpdHaveItem), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_OPEN,PathFinderMain::onCmdOpen), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_OPEN_WITH,PathFinderMain::onUpdHaveItem), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_OPEN_WITH,PathFinderMain::onCmdOpenWith), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_OPEN_WITH_EDITOR,PathFinderMain::onUpdHaveItem), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_OPEN_WITH_EDITOR,PathFinderMain::onCmdOpenWithEditor), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_RUN,PathFinderMain::onCmdRun), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_TERMINAL,PathFinderMain::onCmdTerminal), FXMAPFUNC(SEL_SIGNAL,PathFinderMain::ID_HARVEST,PathFinderMain::onSigHarvest), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_CLOSE_PREVIEW,PathFinderMain::onCmdClosePreview), FXMAPFUNC(SEL_UPDATE,PathFinderMain::ID_CLOSE_PREVIEW,PathFinderMain::onUpdClosePreview), FXMAPFUNCS(SEL_COMMAND,PathFinderMain::ID_IMAGE_ROTATE_LEFT,PathFinderMain::ID_IMAGE_ROTATE_RIGHT,PathFinderMain::onCmdRotateImage), FXMAPFUNCS(SEL_UPDATE,PathFinderMain::ID_IMAGE_ROTATE_LEFT,PathFinderMain::ID_IMAGE_ROTATE_RIGHT,PathFinderMain::onUpdRotateImage), FXMAPFUNC(SEL_COMMAND,PathFinderMain::ID_PREFERENCES,PathFinderMain::onCmdPreferences), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,PathFinderMain::ID_IMAGE_PREVIEW,PathFinderMain::onClickedImagePreview) }; // Object implementation FXIMPLEMENT(PathFinderMain,FXMainWindow,PathFinderMainMap,ARRAYNUMBER(PathFinderMainMap)) /*******************************************************************************/ // Executable for another PathFinder FXchar* PathFinderMain::pathfindercommand; /*******************************************************************************/ // Make some windows PathFinderMain::PathFinderMain(FXApp* a):FXMainWindow(a,"PathFinder",NULL,NULL,DECOR_ALL,0,0,800,600,0,0),bookmarkeddirs(a,"Bookmarked Directories"){ // Make some icons foxbigicon=new FXGIFIcon(getApp(),foxbig); foxminiicon=new FXGIFIcon(getApp(),foxmini); cuticon=new FXBMPIcon(getApp(),cut,0,IMAGE_ALPHAGUESS); copyicon=new FXGIFIcon(getApp(),copyit); moveicon=new FXGIFIcon(getApp(),moveit); linkicon=new FXGIFIcon(getApp(),linkit); renameicon=new FXGIFIcon(getApp(),renameit); pasteicon=new FXBMPIcon(getApp(),paste,0,IMAGE_ALPHAGUESS); upicon=new FXBMPIcon(getApp(),dirup,0,IMAGE_ALPHAGUESS); homeicon=new FXGIFIcon(getApp(),home); backicon=new FXBMPIcon(getApp(),goback,0,IMAGE_ALPHAGUESS); forwicon=new FXBMPIcon(getApp(),goforw,0,IMAGE_ALPHAGUESS); bigiconsicon=new FXBMPIcon(getApp(),bigicons,0,IMAGE_ALPHAGUESS); miniiconsicon=new FXBMPIcon(getApp(),smallicons,0,IMAGE_ALPHAGUESS); detailsicon=new FXBMPIcon(getApp(),details,0,IMAGE_ALPHAGUESS); mapicon=new FXBMPIcon(getApp(),maphost,0,IMAGE_ALPHAGUESS); unmapicon=new FXBMPIcon(getApp(),unmaphost,0,IMAGE_ALPHAGUESS); propicon=new FXBMPIcon(getApp(),properties,0,IMAGE_ALPHAGUESS); deleteicon=new FXBMPIcon(getApp(),deleteit,0,IMAGE_ALPHAGUESS); setbookicon=new FXGIFIcon(getApp(),setbook); clrbookicon=new FXGIFIcon(getApp(),clrbook); workicon=new FXGIFIcon(getApp(),work); closeicon=new FXGIFIcon(getApp(),closepanel); locationicon=new FXGIFIcon(getApp(),location); entericon=new FXGIFIcon(getApp(),enter); rotatelefticon=new FXGIFIcon(getApp(),rotateleft); rotaterighticon=new FXGIFIcon(getApp(),rotateright); quiticon=new FXGIFIcon(getApp(),quit_gif); // Set application icons for Window Manager setIcon(foxbigicon); setMiniIcon(foxminiicon); // Make main window; set myself as the target setTarget(this); setSelector(ID_MAINWINDOW); // Site where to dock FXDockSite *docksite=new FXDockSite(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X); // Menu Bar dragshell1=new FXToolBarShell(this,FRAME_RAISED); FXMenuBar *menubar=new FXMenuBar(docksite,dragshell1,LAYOUT_DOCK_NEXT|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|FRAME_RAISED); new FXToolBarGrip(menubar,menubar,FXMenuBar::ID_TOOLBARGRIP,TOOLBARGRIP_DOUBLE); // Tool Bar dragshell2=new FXToolBarShell(this,FRAME_RAISED); toolbar=new FXToolBar(docksite,dragshell2,LAYOUT_DOCK_NEXT|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|FRAME_RAISED); new FXToolBarGrip(toolbar,toolbar,FXToolBar::ID_TOOLBARGRIP,TOOLBARGRIP_DOUBLE); // Location Bar dragshell3=new FXToolBarShell(this,FRAME_RAISED); locationbar=new FXToolBar(docksite,dragshell3,LAYOUT_DOCK_NEXT|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|FRAME_RAISED); new FXToolBarGrip(locationbar,locationbar,FXToolBar::ID_TOOLBARGRIP,TOOLBARGRIP_DOUBLE); // Properties panel property=new PropertyDialog(this); // Status bar statusbar=new FXStatusBar(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|FRAME_RAISED|STATUSBAR_WITH_DRAGCORNER); FXStatusLine *statusline=statusbar->getStatusLine(); statusline->setTarget(this); statusline->setSelector(ID_STATUSLINE); // Subtle plug for LINUX new FXButton(statusbar,"\tAbout PathFinder",foxminiicon,this,ID_ABOUT,LAYOUT_TOP|LAYOUT_RIGHT); // Pattern pattern=new FXComboBox(statusbar,25,this,ID_FILEFILTER,COMBOBOX_STATIC|LAYOUT_RIGHT|LAYOUT_FIX_WIDTH|FRAME_SUNKEN|FRAME_THICK, 0,0,200,0, 0,0,1,1); pattern->setNumVisible(4); // Caption before pattern new FXLabel(statusbar,"Pattern:",NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y); // Make file associations object; shared between FXFileList and FXDirList associations=new FXFileDict(getApp()); // Main window interior FXHorizontalFrame * splitterbox=new FXHorizontalFrame(this,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED,0,0,0,0, 2,2,2,2, 0,0); splitter=new FXSplitter(splitterbox,LAYOUT_SIDE_TOP|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_FILL_Y|SPLITTER_TRACKING); group1=new FXVerticalFrame(splitter,LAYOUT_FIX_WIDTH|LAYOUT_FILL_Y|FRAME_THICK|FRAME_SUNKEN, 0,0,180,0, 0,0,0,0,0,0); group2=new FXVerticalFrame(splitter,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_THICK|FRAME_SUNKEN, 0,0,0,0, 0,0,0,0,0,0); // Header above folders FXHorizontalFrame *header1=new FXHorizontalFrame(group1,LAYOUT_FILL_X|FRAME_RAISED|FRAME_THICK,0,0,0,0, 0,0,0,0, 0,0); new FXLabel(header1,"Folders",NULL,LAYOUT_FILL_X|JUSTIFY_LEFT); new FXButton(header1,"",closeicon,group1,FXWindow::ID_HIDE,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0, 0,0,0,0); // Folder List dirlist=new FXDirList(group1,this,ID_DIRECTORYLIST,LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_RIGHT|TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|TREELIST_BROWSESELECT|DIRLIST_NO_OWN_ASSOC); dirlist->setAssociations(associations); dirlist->dropEnable(); // Header above files FXHorizontalFrame *header2=new FXHorizontalFrame(group2,LAYOUT_FILL_X|FRAME_RAISED|FRAME_THICK,0,0,0,0, 0,0,0,0, 0,0); FXLabel* fileslabel=new FXLabel(header2,"Files in: ",NULL,LAYOUT_FILL_X|JUSTIFY_LEFT); fileslabel->setTarget(this); fileslabel->setSelector(ID_UPDATE_FILES); new FXButton(header2,"\tRotate left\tRotate image leftward 90 degrees.",rotatelefticon,this,ID_IMAGE_ROTATE_LEFT,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0,0,0,0,0); new FXButton(header2,"\tRotate right\tRotate image rightward 90 degrees.",rotaterighticon,this,ID_IMAGE_ROTATE_RIGHT,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0,0,0,0,0); new FXButton(header2,FXString::null,closeicon,this,ID_CLOSE_PREVIEW,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0, 0,0,0,0); // Switcher to either image or filelist switcher=new FXSwitcher(group2,LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 0,0,0,0); // File List filelist=new FXFileList(switcher,this,ID_FILELIST,LAYOUT_FILL_X|LAYOUT_FILL_Y|ICONLIST_BIG_ICONS|ICONLIST_AUTOSIZE|FILELIST_NO_OWN_ASSOC); filelist->setAssociations(associations); filelist->dropEnable(); // Image view imagepreview=new FXImageView(switcher,NULL,this,ID_IMAGE_PREVIEW,LAYOUT_FILL_X|LAYOUT_FILL_Y); imagepreview->enable(); // enable so we receive mouse messages // File menu pane filemenu=new FXMenuPane(this); new FXMenuTitle(menubar,"&File",NULL,filemenu); new FXMenuCommand(filemenu,"Open\t\tOpen selected file.",NULL,this,ID_OPEN); new FXMenuCommand(filemenu,"Open with...\t\tOpen selected file using program.",NULL,this,ID_OPEN_WITH); new FXMenuCommand(filemenu,"Open with editor\t\tOpen selected file in the editor.",NULL,this,ID_OPEN_WITH_EDITOR); new FXMenuSeparator(filemenu); new FXMenuCommand(filemenu,"&Run...\tCtrl-R\tRun a command.",NULL,this,ID_RUN); new FXMenuCommand(filemenu,"&Terminal...\tCtrl-T\tOpen Terminal.",NULL,this,ID_TERMINAL); new FXMenuSeparator(filemenu); new FXMenuCommand(filemenu,"Re&load\tCtl-L\tReload this directory.",NULL,filelist,FXFileList::ID_REFRESH); new FXMenuSeparator(filemenu); new FXMenuCommand(filemenu,"&New Directory...",NULL,this,ID_NEW); new FXMenuCommand(filemenu,"Delete\tDel\tDelete the selection.",deleteicon,this,ID_DELETE); new FXMenuSeparator(filemenu); new FXMenuCommand(filemenu,"New &PathFinder...\tCtrl-P\tStart another PathFinder.",foxminiicon,this,ID_NEW_PATHFINDER); new FXMenuCommand(filemenu,"&Quit\tCtl-Q\tQuit PathFinder",quiticon,this,ID_CLOSE); // Edit Menu Pane editmenu=new FXMenuPane(this); new FXMenuTitle(menubar,"&Edit",NULL,editmenu); new FXMenuCommand(editmenu,"Cu&t\tCtl-X\tCut to clipboard.",cuticon,this,ID_CLIPBOARD_CUT); new FXMenuCommand(editmenu,"&Copy\tCtl-C\tCopy to clipboard.",copyicon,this,ID_CLIPBOARD_COPY); new FXMenuCommand(editmenu,"&Paste\tCtl-V\tPaste from clipboard.",pasteicon,this,ID_CLIPBOARD_PASTE); new FXMenuSeparator(editmenu); new FXMenuCommand(editmenu,"&Select All\tCtl-A\tSelect all icons",NULL,filelist,FXFileList::ID_SELECT_ALL); new FXMenuCommand(editmenu,"&Deselect All\t\tDeselect all icons",NULL,filelist,FXFileList::ID_DESELECT_ALL); new FXMenuCommand(editmenu,"&Invert Selection\t\tInvert selection",NULL,filelist,FXFileList::ID_SELECT_INVERSE); // Go Menu Pane gomenu=new FXMenuPane(this); new FXMenuTitle(menubar,"&Go",NULL,gomenu); new FXMenuCommand(gomenu,"&Up\t\tChange up one level.",upicon,this,ID_UPDIRECTORY); new FXMenuCommand(gomenu,"&Back\tCtl-B\tChange to previous directory.",backicon,this,ID_GO_BACKWARD); new FXMenuCommand(gomenu,"&Forward\tCtl-F\tChange to next directory.",forwicon,this,ID_GO_FORWARD); new FXMenuCommand(gomenu,"&Home\tCtl-H\tChange to home directory.",homeicon,this,ID_GO_HOME); new FXMenuCommand(gomenu,"&Work\tCtl-W\tChange to current working directory.",workicon,this,ID_GO_WORK); new FXMenuCommand(gomenu,"&Goto...\tCtl-G\tGoto directory.",NULL,this,ID_GOTO_DIR); new FXMenuCommand(gomenu,"Bookmark...\t\tBookmark current directory.",setbookicon,this,ID_BOOKMARK); new FXMenuCommand(gomenu,"&Clear...\t\tClear bookmarks.",clrbookicon,&bookmarkeddirs,FXRecentFiles::ID_CLEAR); FXMenuSeparator* sep1=new FXMenuSeparator(gomenu); sep1->setTarget(&bookmarkeddirs); sep1->setSelector(FXRecentFiles::ID_ANYFILES); new FXMenuCommand(gomenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_1); new FXMenuCommand(gomenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_2); new FXMenuCommand(gomenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_3); new FXMenuCommand(gomenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_4); new FXMenuCommand(gomenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_5); new FXMenuCommand(gomenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_6); new FXMenuCommand(gomenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_7); new FXMenuCommand(gomenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_8); new FXMenuCommand(gomenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_9); new FXMenuCommand(gomenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_10); // Arrange menu arrangemenu=new FXMenuPane(this); new FXMenuTitle(menubar,"&Arrange",NULL,arrangemenu); new FXMenuRadio(arrangemenu,"&Details\t\tShow detail view.",filelist,FXFileList::ID_SHOW_DETAILS); new FXMenuRadio(arrangemenu,"&Small Icons\t\tShow small icons.",filelist,FXFileList::ID_SHOW_MINI_ICONS); new FXMenuRadio(arrangemenu,"&Big Icons\t\tShow big icons.",filelist,FXFileList::ID_SHOW_BIG_ICONS); new FXMenuSeparator(arrangemenu); new FXMenuRadio(arrangemenu,"&Rows\t\tView row-wise.",filelist,FXFileList::ID_ARRANGE_BY_ROWS); new FXMenuRadio(arrangemenu,"&Columns\t\tView column-wise.",filelist,FXFileList::ID_ARRANGE_BY_COLUMNS); // Sort menu sortmenu=new FXMenuPane(this); new FXMenuTitle(menubar,"&Sort",NULL,sortmenu); new FXMenuRadio(sortmenu,"&Name\t\tSort by file name.",filelist,FXFileList::ID_SORT_BY_NAME); new FXMenuRadio(sortmenu,"&Type\t\tSort by file type.",filelist,FXFileList::ID_SORT_BY_TYPE); new FXMenuRadio(sortmenu,"&Size\t\tSort by file size.",filelist,FXFileList::ID_SORT_BY_SIZE); new FXMenuRadio(sortmenu,"T&ime\t\tSort by modification time.",filelist,FXFileList::ID_SORT_BY_TIME); new FXMenuRadio(sortmenu,"&User\t\tSort by user name.",filelist,FXFileList::ID_SORT_BY_USER); new FXMenuRadio(sortmenu,"&Group\t\tSort by group name.",filelist,FXFileList::ID_SORT_BY_GROUP); new FXMenuCheck(sortmenu,"&Reverse\t\tReverse sort direction.",filelist,FXFileList::ID_SORT_REVERSE); new FXMenuCheck(sortmenu,"&Ignore case\t\tIgnore case of names.",filelist,FXFileList::ID_SORT_CASE); // Preferences menu prefmenu=new FXMenuPane(this); new FXMenuTitle(menubar,"&Options",NULL,prefmenu); new FXMenuCommand(prefmenu,"&Preferences...\t\tEdit Preferences.",NULL,this,ID_PREFERENCES); new FXMenuSeparator(prefmenu); new FXMenuCommand(prefmenu,"&Save Settings...\t\tSave current settings.",NULL,this,ID_SAVE_SETTINGS); // View Menu Pane viewmenu=new FXMenuPane(this); new FXMenuTitle(menubar,"&View",NULL,viewmenu); new FXMenuCheck(viewmenu,"Hidden &Directories\t\tShow hidden directories.",dirlist,FXDirList::ID_TOGGLE_HIDDEN); new FXMenuCheck(viewmenu,"Hidden &Files\t\tShow hidden files and directories.",filelist,FXFileList::ID_TOGGLE_HIDDEN); new FXMenuCheck(viewmenu,"&Preview Images\t\tShow thumbnail images.",filelist,FXFileList::ID_TOGGLE_IMAGES); new FXMenuSeparator(viewmenu); new FXMenuCheck(viewmenu,"Tree list\t\tShow or hide the tree list",group1,FXWindow::ID_TOGGLESHOWN); new FXMenuCheck(viewmenu,"Toolbar\t\tShow or hide tool bar",toolbar,FXWindow::ID_TOGGLESHOWN); new FXMenuCheck(viewmenu,"Location bar\t\tShow or hide location bar",locationbar,FXWindow::ID_TOGGLESHOWN); new FXMenuCheck(viewmenu,"Status bar\t\tShow or hide status bar",statusbar,FXWindow::ID_TOGGLESHOWN); // Help menu helpmenu=new FXMenuPane(this); new FXMenuTitle(menubar,"&Help",NULL,helpmenu,LAYOUT_RIGHT); new FXMenuCommand(helpmenu,"&About PathFinder...\t\tDisplay PathFinder About Panel.",NULL,this,ID_ABOUT,0); // Book Mark Menu bookmarkmenu=new FXMenuPane(this,POPUP_SHRINKWRAP); new FXMenuCommand(bookmarkmenu,"&Bookmark...\t\tBookmark current directory.",setbookicon,this,ID_BOOKMARK); new FXMenuCommand(bookmarkmenu,"&Clear...\t\tClear bookmarks.",clrbookicon,&bookmarkeddirs,FXRecentFiles::ID_CLEAR); FXMenuSeparator* sep2=new FXMenuSeparator(bookmarkmenu); sep2->setTarget(&bookmarkeddirs); sep2->setSelector(FXRecentFiles::ID_ANYFILES); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_1); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_2); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_3); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_4); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_5); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_6); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_7); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_8); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_9); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarkeddirs,FXRecentFiles::ID_FILE_10); // Spacer new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,2,0); // Directory box dirbox=new FXDirBox(toolbar,this,ID_DIRBOX,DIRBOX_NO_OWN_ASSOC|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FIX_WIDTH|LAYOUT_CENTER_Y,0,0,180,0, 0,0, 1,1); dirbox->setAssociations(associations); dirbox->setNumVisible(5); // Spacer new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,2,0); // Add some toolbar buttons new FXButton(toolbar,"\tUp\tChange up one level.",upicon,this,ID_UPDIRECTORY,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,"\tHome\tChange to home directory.",homeicon,this,ID_GO_HOME,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,"\tWork\tChange to current working directory.",workicon,this,ID_GO_WORK,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXMenuButton(toolbar,"\tBookmarks\tVisit bookmarked directories.",setbookicon,bookmarkmenu,BUTTON_TOOLBAR|MENUBUTTON_NOARROWS|MENUBUTTON_ATTACH_LEFT|FRAME_RAISED); new FXButton(toolbar,"\tBack\tChange to previous directory.",backicon,this,ID_GO_BACKWARD,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,"\tForward\tChange to next directory.",forwicon,this,ID_GO_FORWARD,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,4,0); new FXFrame(toolbar,FRAME_SUNKEN|LAYOUT_CENTER_Y|LAYOUT_FIX_HEIGHT|LAYOUT_FIX_WIDTH,0,0,2,22); new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,4,0); new FXButton(toolbar,"\tMount\tMount device.",mapicon,NULL,0,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,"\tUnmount\tUnmount device.",unmapicon,NULL,0,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,4,0); new FXFrame(toolbar,FRAME_SUNKEN|LAYOUT_CENTER_Y|LAYOUT_FIX_HEIGHT|LAYOUT_FIX_WIDTH,0,0,2,22); new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,4,0); // new FXButton(toolbar,"\tCut\tCut to clipboard.",cuticon,this,ID_CLIPBOARD_CUT,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // new FXButton(toolbar,"\tCopy\tCopy to clipboard.",copyicon,this,ID_CLIPBOARD_COPY,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // new FXButton(toolbar,"\tPaste\tPaste from clipboard.",pasteicon,this,ID_CLIPBOARD_PASTE,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,"\tCopy\tCopy to clipboard.",copyicon,this,ID_COPY,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,"\tMove\tMove file.",moveicon,this,ID_MOVE,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,"\tLink\tLink file.",linkicon,this,ID_LINK,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,"\tRename\tRename file.",renameicon,this,ID_RENAME,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,4,0); new FXFrame(toolbar,FRAME_SUNKEN|LAYOUT_CENTER_Y|LAYOUT_FIX_HEIGHT|LAYOUT_FIX_WIDTH,0,0,2,22); new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,4,0); new FXButton(toolbar,"\tProperties\tDisplay file properties.",propicon,this,ID_PROPERTIES,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,4,0); new FXFrame(toolbar,FRAME_SUNKEN|LAYOUT_CENTER_Y|LAYOUT_FIX_HEIGHT|LAYOUT_FIX_WIDTH,0,0,2,22); new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,4,0); // Switch display modes new FXButton(toolbar,"\tBig Icons\tShow big icons.",bigiconsicon,filelist,FXFileList::ID_SHOW_BIG_ICONS,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,"\tSmall Icons\tShow small icons.",miniiconsicon,filelist,FXFileList::ID_SHOW_MINI_ICONS,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); new FXButton(toolbar,"\tDetails\tShow detail view.",detailsicon,filelist,FXFileList::ID_SHOW_DETAILS,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Spacer new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,4,0); new FXFrame(toolbar,FRAME_SUNKEN|LAYOUT_CENTER_Y|LAYOUT_FIX_HEIGHT|LAYOUT_FIX_WIDTH,0,0,2,22); new FXFrame(toolbar,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH,0,0,4,0); // Delete button far away new FXButton(toolbar,"\tDelete\tDelete file.",deleteicon,this,ID_DELETE,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); // Location bar new FXLabel(locationbar,"&Location:",NULL,LAYOUT_CENTER_Y); new FXButton(locationbar,"\tClear Location bar\tClear Location bar.",locationicon,this,ID_CLEAR_LOCATION,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_CENTER_Y); address=new FXTextField(locationbar,10,this,ID_GOTO_LOCATION,TEXTFIELD_NORMAL|JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_CENTER_Y,0,0,0,0, 1,1,1,1); new FXButton(locationbar,"\tGo\tGo to location.",entericon,this,ID_GOTO_LOCATION,BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_CENTER_Y); // Install some accelerators getAccelTable()->addAccel(MKUINT(KEY_BackSpace,0),this,FXSEL(SEL_COMMAND,ID_UPDIRECTORY)); getAccelTable()->addAccel(MKUINT(KEY_Delete,0),this,FXSEL(SEL_COMMAND,ID_DELETE)); getAccelTable()->addAccel(MKUINT(KEY_F1,0),this,FXSEL(SEL_COMMAND,ID_ABOUT)); getAccelTable()->addAccel(MKUINT(KEY_Return,ALTMASK),this,FXSEL(SEL_COMMAND,ID_PROPERTIES)); // Make a tool tip new FXToolTip(getApp(),0); // Recent directories visiting=0; // Image previewing and blending preview=TRUE; blending=FALSE; // Bookmarked directories bookmarkeddirs.setTarget(this); bookmarkeddirs.setSelector(ID_GO_RECENT); // Set patterns setPatterns("All Files (*)"); setCurrentPattern(0); } // Clean up PathFinderMain::~PathFinderMain(){ delete dragshell1; delete dragshell2; delete dragshell3; delete imagepreview->getImage(); delete property; delete associations; delete filemenu; delete editmenu; delete viewmenu; delete gomenu; delete arrangemenu; delete sortmenu; delete prefmenu; delete helpmenu; delete bookmarkmenu; delete foxbigicon; delete foxminiicon; delete cuticon; delete copyicon; delete moveicon; delete linkicon; delete renameicon; delete pasteicon; delete upicon; delete homeicon; delete backicon; delete forwicon; delete bigiconsicon; delete miniiconsicon; delete detailsicon; delete mapicon; delete unmapicon; delete propicon; delete deleteicon; delete setbookicon; delete clrbookicon; delete workicon; delete closeicon; delete locationicon; delete entericon; delete rotatelefticon; delete rotaterighticon; delete quiticon; } /*******************************************************************************/ // Open long PathFinderMain::onCmdOpen(FXObject*,FXSelector,void*){ FXint index=filelist->getCurrentItem(); if(0<=index){ // If directory, open the directory if(filelist->isItemDirectory(index)){ FXString directory=filelist->getItemPathname(index); FXTRACE((100,"directory=%s\n",directory.text())); filelist->setDirectory(directory); dirlist->setDirectory(directory); dirbox->setDirectory(directory); address->setText(directory); visitDirectory(directory); } // If executable, execute it! else if(filelist->isItemExecutable(index)){ FXString executable=FXPath::enquote(filelist->getItemPathname(index)) + " &"; FXTRACE((100,"system(%s)\n",executable.text())); system(executable.text()); } // If regular file return as the selected file else if(filelist->isItemFile(index)){ FXFileAssoc *association=filelist->getItemAssoc(index); if(association){ if(association->command.text()){ FXString command=FXStringFormat(association->command.text(),FXPath::enquote(filelist->getItemPathname(index)).text()); FXTRACE((100,"system(%s)\n",command.text())); system(command.text()); } else{ FXMessageBox::information(this,MBOX_OK,"Unknown Command","No command defined for file: %s",filelist->getItemFilename(index).text()); } } else{ FXMessageBox::information(this,MBOX_OK,"Unknown File Type","No association has been set for file: %s",filelist->getItemFilename(index).text()); } } } return 1; } // Gray out if no item selected long PathFinderMain::onUpdHaveItem(FXObject* sender,FXSelector,void*){ sender->handle(this,filelist->getCurrentFile().empty()?FXSEL(SEL_COMMAND,ID_DISABLE):FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // File Item was double-clicked long PathFinderMain::onCmdFileDblClicked(FXObject*,FXSelector,void* ptr){ FXint index=(FXint)(FXival)ptr; if(0<=index){ // If directory, open the directory if(filelist->isItemDirectory(index)){ FXString directory=filelist->getItemPathname(index); FXTRACE((100,"directory=%s\n",directory.text())); filelist->setDirectory(directory); dirlist->setDirectory(directory); dirbox->setDirectory(directory); address->setText(directory); visitDirectory(directory); } // If executable, execute it! else if(filelist->isItemExecutable(index)){ FXString executable=FXPath::enquote(filelist->getItemPathname(index)) + " &"; FXTRACE((100,"system(%s)\n",executable.text())); system(executable.text()); } // If regular file return as the selected file else if(filelist->isItemFile(index)){ // Load image if preview mode on if(preview){ if(previewImage(filelist->getItemPathname(index))) return 1; } FXFileAssoc *association=filelist->getItemAssoc(index); if(association){ if(association->command.text()){ FXString command=FXStringFormat(association->command.text(),FXPath::enquote(filelist->getItemPathname(index)).text()); FXTRACE((100,"system(%s)\n",command.text())); system(command.text()); } else{ FXMessageBox::information(this,MBOX_OK,"Unknown Command","No command defined for file: %s",filelist->getItemFilename(index).text()); } } else{ FXMessageBox::information(this,MBOX_OK,"Unknown File Type","No association has been set for file: %s",filelist->getItemFilename(index).text()); } } } return 1; } // File Item was clicked long PathFinderMain::onCmdFileClicked(FXObject*,FXSelector,void*){ // FXchar path[MAXPATHLEN+1],name[MAXPATHLEN+1],dir[MAXPATHLEN+1],*p; // FXOldIconItem *item=(FXOldIconItem*)ptr; // name[0]=0; // strcpy(path,filelist->getDirectory()); // if(item){ // strcpy(name,filelist->getItemText(item)); // if((p=strchr(name,'\t'))) *p=0; // } // fxpathname(dir,path,name); // filename->setText(dir); return 1; } // Goto location entered into the text field; a relative path or // a path containing environment variable expansions is good too. long PathFinderMain::onCmdGotoLocation(FXObject*,FXSelector,void*){ FXString path=FXPath::absolute(getDirectory(),address->getText()); FXString dir=path; // Go up to the lowest directory which still exists while(!FXPath::isTopDirectory(dir) && !FXStat::isDirectory(dir)){ dir=FXPath::upLevel(dir); } // Move to this existing directory filelist->setDirectory(dir); dirlist->setDirectory(dir); dirbox->setDirectory(dir); address->setText(path); // Select tail end, was not good path if(dir.length()setSelection(dir.length()+1,path.length()-dir.length()-1); else address->setSelection(dir.length(),path.length()-dir.length()); } // Mark this directory visitDirectory(dir); // Close preview closePreview(); return 1; } // Clear location bar long PathFinderMain::onCmdClearLocation(FXObject*,FXSelector,void*){ address->setText(FXString::null); return 1; } // Popup menu for item in file list long PathFinderMain::onFileListPopup(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; if(event->moved) return 1; FXint index=filelist->getItemAt(event->win_x,event->win_y); FXMenuPane pane(this); // We clicked in the background if(index<0){ new FXMenuCommand(&pane,"&Up\t\tChange up one level.",upicon,this,ID_UPDIRECTORY); new FXMenuCommand(&pane,"&Back\t\tChange to previous directory.",backicon,this,ID_GO_BACKWARD); new FXMenuCommand(&pane,"&Forward\t\tChange to next directory.",forwicon,this,ID_GO_FORWARD); new FXMenuCommand(&pane,"&Home\t\tChange to home directory.",homeicon,this,ID_GO_HOME); new FXMenuCommand(&pane,"&Work\t\tChange to current working directory.",workicon,this,ID_GO_WORK); new FXMenuCommand(&pane,"Bookmark...\t\tBookmark this directory.",setbookicon,this,ID_BOOKMARK); new FXMenuSeparator(&pane); new FXMenuCascade(&pane,"Arrange",NULL,arrangemenu); new FXMenuSeparator(&pane); new FXMenuCascade(&pane,"Sort by",NULL,sortmenu); new FXMenuSeparator(&pane); new FXMenuCommand(&pane,"Reload\t\tReload this directory.",NULL,filelist,FXFileList::ID_REFRESH); } // We clicked on an item else{ new FXMenuCommand(&pane,"Open...",NULL,this,ID_OPEN); new FXMenuCommand(&pane,"Open with...",NULL,this,ID_OPEN_WITH); new FXMenuCommand(&pane,"Open with editor",NULL,this,ID_OPEN_WITH_EDITOR); new FXMenuSeparator(&pane); new FXMenuCommand(&pane,"Copy",copyicon,this,ID_COPY); new FXMenuCommand(&pane,"Move",moveicon,this,ID_MOVE); new FXMenuCommand(&pane,"Link",linkicon,this,ID_LINK); new FXMenuCommand(&pane,"Rename",renameicon,this,ID_RENAME); new FXMenuCommand(&pane,"Delete",deleteicon,this,ID_DELETE); new FXMenuSeparator(&pane); new FXMenuCommand(&pane,"Properties...",propicon,this,ID_PROPERTIES); } pane.create(); pane.popup(NULL,event->root_x,event->root_y); getApp()->runModalWhileShown(&pane); return 1; } // About long PathFinderMain::onCmdAbout(FXObject*,FXSelector,void*){ FXMessageBox about(this,"About PathFinder","PathFinder File Browser V1.0\n\nUsing the FOX C++ GUI Library (http://www.fox-tookit.org)\n\nCopyright (C) 1998,2003 Jeroen van der Zijp (jeroen@fox-toolkit.org)",foxbigicon,MBOX_OK|DECOR_TITLE|DECOR_BORDER); about.execute(); return 1; } // Change the directory from the FXDirList long PathFinderMain::onCmdDirectory(FXObject*,FXSelector,void* ptr){ FXTreeItem *item=(FXTreeItem*)ptr; FXString path=dirlist->getItemPathname(item); filelist->setDirectory(path); dirbox->setDirectory(path); address->setText(path); visitDirectory(path); closePreview(); return 1; } // Change the directory from the FXDirBox long PathFinderMain::onCmdDirTree(FXObject*,FXSelector,void*){ FXString path=dirbox->getDirectory(); dirlist->setDirectory(path); filelist->setDirectory(path); address->setText(path); visitDirectory(path); closePreview(); return 1; } // Move up one directory long PathFinderMain::onCmdUpDirectory(FXObject*,FXSelector,void*){ FXString path=FXPath::upLevel(filelist->getDirectory()); setDirectory(path); visitDirectory(path); closePreview(); return 1; } // Move to home directory long PathFinderMain::onCmdHomeDirectory(FXObject*,FXSelector,void*){ FXString path=FXSystem::getHomeDirectory(); setDirectory(path); visitDirectory(path); closePreview(); return 1; } // Move to work directory long PathFinderMain::onCmdWorkDirectory(FXObject*,FXSelector,void*){ FXString path=FXSystem::getCurrentDirectory(); setDirectory(path); visitDirectory(path); closePreview(); return 1; } // Bookmark this directory long PathFinderMain::onCmdBookmark(FXObject*,FXSelector,void*){ bookmarkeddirs.appendFile(filelist->getDirectory()); return 1; } // Move to recent directory long PathFinderMain::onCmdRecentDirectory(FXObject*,FXSelector,void* ptr){ FXString path((FXchar*)ptr); setDirectory(path); visitDirectory(path); closePreview(); return 1; } // Move to previous directory long PathFinderMain::onCmdBackDirectory(FXObject*,FXSelector,void*){ if(visiting<9 && !visiteddir[visiting+1].empty()){ setDirectory(visiteddir[++visiting]); closePreview(); } return 1; } // Update move to previous directory long PathFinderMain::onUpdBackDirectory(FXObject* sender,FXSelector,void*){ sender->handle(this,(visiting<9 && !visiteddir[visiting+1].empty())?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Move to next directory long PathFinderMain::onCmdForwardDirectory(FXObject*,FXSelector,void*){ if(0handle(this,(0getDirectory(); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE),(void*)&title); return 1; } // Update files heading long PathFinderMain::onUpdFiles(FXObject* sender,FXSelector,void*){ FXString string="Files in: " + filelist->getDirectory(); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE),(void*)&string); return 1; } // Update status line to show some info about the icon the cursor is over long PathFinderMain::onUpdStatusline(FXObject* sender,FXSelector,void*){ FXint index; index=filelist->getCursorItem(); if(0<=index){ FXString info; FXFileItem *item=(FXFileItem*)filelist->getItem(index); FXFileAssoc *assoc=item->getAssoc(); // What is this thing? if(item->isDirectory()) info="Directory: "; else if(item->isSymlink()) info="Symlink: "; else if(item->isSocket()) info="Socket: "; else if(item->isFifo()) info="Fifo: "; else if(item->isBlockdev()) info="BlockDev: "; else if(item->isChardev()) info="CharDev: "; else if(item->isExecutable()) info="Application: "; else info="File: "; // Add the name info+=filelist->getItemFilename(index); // Add size if its a file if(item->isFile()) info+=" ("+FXStringVal(item->getSize())+" bytes) "; // Add the extension if(assoc) info+=assoc->extension; // Set the status line sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&info); return 1; } return 0; } // Save settings to disk long PathFinderMain::onCmdSaveSettings(FXObject*,FXSelector,void*){ saveSettings(); getApp()->reg().write(); return 1; } // Spawn new PathFinder long PathFinderMain::onCmdNewPathFinder(FXObject*,FXSelector,void*){ FXString path=filelist->getDirectory(); saveSettings(); getApp()->reg().write(); FXString command=FXStringFormat("%s %s &",pathfindercommand,path.text()); system(command.text()); return 1; } // Pop up properties panel long PathFinderMain::onCmdProperties(FXObject*,FXSelector,void*){ property->show(PLACEMENT_OWNER); return 1; } // Update Pop up properties panel buttons long PathFinderMain::onUpdProperties(FXObject* sender,FXSelector,void*){ if(!property->shown()) sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } /*******************************************************************************/ long PathFinderMain::onCmdClipboardCut(FXObject*,FXSelector,void*){ return 1; } long PathFinderMain::onCmdClipboardCopy(FXObject*,FXSelector,void*){ return 1; } long PathFinderMain::onCmdClipboardPaste(FXObject*,FXSelector,void*){ return 1; } /*******************************************************************************/ // Create new directory long PathFinderMain::onCmdNew(FXObject*,FXSelector,void*){ FXDialogBox dialog(this,"Create New Directory",DECOR_TITLE|DECOR_BORDER); const FXchar suggestedname[]="DirectoryName"; FXVerticalFrame* content=new FXVerticalFrame(&dialog,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,10,10,10,10,10,10); new FXLabel(content,"Create new directory in: "+filelist->getDirectory(),NULL,LAYOUT_FILL_X|JUSTIFY_LEFT); FXTextField *text=new FXTextField(content,40,&dialog,FXDialogBox::ID_ACCEPT,TEXTFIELD_ENTER_ONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X); new FXHorizontalSeparator(content,SEPARATOR_GROOVE|LAYOUT_FILL_X); FXHorizontalFrame* buttons=new FXHorizontalFrame(content,LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0,0,0,0,0); new FXButton(buttons,"&OK",NULL,&dialog,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT); new FXButton(buttons,"&Cancel",NULL,&dialog,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT,0,0,0,0,20,20); dialog.create(); text->setText(suggestedname); text->setFocus(); text->setSelection(0,sizeof(suggestedname)); if(dialog.execute()){ FXString dirname=FXPath::absolute(filelist->getDirectory(),text->getText()); if(FXStat::exists(dirname)){ FXMessageBox::error(this,MBOX_OK,"Already Exists","File or directory %s already exists.\n",dirname.text()); } else if(!FXDir::create(dirname)){ FXMessageBox::error(this,MBOX_OK,"Cannot Create","Cannot create directory %s.\n",dirname.text()); } } return 1; } // Update create new directory long PathFinderMain::onUpdNew(FXObject* sender,FXSelector,void*){ FXString path=filelist->getDirectory(); if(FXStat::isWritable(path)) sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Copy file or directory long PathFinderMain::onCmdCopy(FXObject*,FXSelector,void*){ FXString *filenamelist=getFilenames(); if(filenamelist){ CopyDialog copydialog(this,"Copy File"); FXString newname; for(FXint i=0; !filenamelist[i].empty(); i++){ copydialog.setOldName(filenamelist[i]); copydialog.setNewName(FXPath::absolute(FXPath::directory(filenamelist[i]),"CopyOf"+FXPath::name(filenamelist[i]))); if(!copydialog.execute()) break; newname=copydialog.getNewName(); if(!FXFile::copyFiles(filenamelist[i],newname,FALSE)){ if(FXMessageBox::error(this,MBOX_YES_NO,"Error Copying File","Unable to copy file:\n\n%s to: %s\n\nContinue with operation?",filenamelist[i].text(),newname.text())==MBOX_CLICKED_NO) break; } } delete [] filenamelist; } return 1; } // Move file or directory long PathFinderMain::onCmdMove(FXObject*,FXSelector,void*){ FXString *filenamelist=getFilenames(); if(filenamelist){ CopyDialog copydialog(this,"Move File"); FXString newname; for(FXint i=0; !filenamelist[i].empty(); i++){ copydialog.setOldName(filenamelist[i]); copydialog.setNewName(filenamelist[i]); if(!copydialog.execute()) break; newname=copydialog.getNewName(); if(!FXFile::moveFiles(filenamelist[i],newname,FALSE)){ if(FXMessageBox::error(this,MBOX_YES_NO,"Error Moving File","Unable to move file:\n\n%s to: %s\n\nContinue with operation?",filenamelist[i].text(),newname.text())==MBOX_CLICKED_NO) break; } } delete [] filenamelist; } return 1; } // Link file long PathFinderMain::onCmdLink(FXObject*,FXSelector,void*){ FXString *filenamelist=getFilenames(); if(filenamelist){ CopyDialog copydialog(this,"Link File"); FXString newname; for(FXint i=0; !filenamelist[i].empty(); i++){ copydialog.setOldName(filenamelist[i]); copydialog.setNewName(FXPath::absolute(FXPath::directory(filenamelist[i]),"LinkTo"+FXPath::name(filenamelist[i]))); if(!copydialog.execute()) break; newname=copydialog.getNewName(); if(!FXFile::symlink(filenamelist[i],newname)){ if(FXMessageBox::error(this,MBOX_YES_NO,"Error Linking File","Unable to link file:\n\n%s to: %s\n\nContinue with operation?",filenamelist[i].text(),newname.text())==MBOX_CLICKED_NO) break; } } delete [] filenamelist; } return 1; } // Rename file or directory long PathFinderMain::onCmdRename(FXObject*,FXSelector,void*){ FXString *filenamelist=getFilenames(); if(filenamelist){ CopyDialog copydialog(this,"Rename File"); FXString newname; for(FXint i=0; !filenamelist[i].empty(); i++){ copydialog.setOldName(FXPath::name(filenamelist[i])); copydialog.setNewName(FXPath::name(filenamelist[i])); if(!copydialog.execute()) break; newname=copydialog.getNewName(); if(!FXFile::moveFiles(filenamelist[i],FXPath::absolute(FXPath::directory(filenamelist[i]),newname),FALSE)){ if(FXMessageBox::error(this,MBOX_YES_NO,"Error Renaming File","Unable to rename file:\n\n%s to: %s\n\nContinue with operation?",filenamelist[i].text(),newname.text())==MBOX_CLICKED_NO) break; } } delete [] filenamelist; } return 1; } // Delete file or directory long PathFinderMain::onCmdDelete(FXObject*,FXSelector,void*){ /* FXDialogBox deletedialog(this,"Delete File",DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE); FXString file; FXHorizontalFrame* buttons=new FXHorizontalFrame(&deletedialog,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0, 0,0,0,0); new FXButton(buttons,"&Cancel",NULL,&deletedialog,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y,0,0,0,0,20,20); new FXButton(buttons,"&OK",NULL,&deletedialog,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXHorizontalSeparator(&deletedialog,SEPARATOR_GROOVE|LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); FXMatrix *matrix=new FXMatrix(&deletedialog,2,MATRIX_BY_COLUMNS|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); new FXLabel(matrix,"Delete files:",NULL,LAYOUT_FILL_X|JUSTIFY_LEFT|LAYOUT_FILL_ROW); FXHorizontalFrame *frame=new FXHorizontalFrame(matrix,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); FXList *files=new FXList(frame,5,NULL,0,LAYOUT_FILL_X|LAYOUT_FILL_Y|LIST_MULTIPLESELECT|HSCROLLING_OFF); for(FXint i=0; igetNumItems(); i++){ if(filelist->isItemSelected(i)){ file=filelist->getItemFilename(i); if(file=="..") continue; files->selectItem(files->appendItem(file)); } } deletedialog.create(); deletedialog.execute(); */ FXuint answer=FXMessageBox::warning(this,MBOX_YES_NO,"Deleting files","Are you sure you want to delete these files?"); if(answer==MBOX_CLICKED_YES){ FXString filetoremove,file; for(FXint i=0; igetNumItems(); i++){ if(filelist->isItemSelected(i)){ file=filelist->getItemFilename(i); if(file=="..") continue; filetoremove=FXPath::absolute(filelist->getDirectory(),file); FXTRACE((100,"filetoremove=%s\n",filetoremove.text())); if(!FXFile::removeFiles(filetoremove,TRUE)){ if(MBOX_CLICKED_NO==FXMessageBox::error(this,MBOX_YES_NO,"Error Deleting File","Unable to delete file: %s\nContinue with operation?",filetoremove.text())){ break; } } } } } return 1; } // Enable sender when items have been selected long PathFinderMain::onUpdSelected(FXObject* sender,FXSelector,void*){ sender->handle(this,getNumFilenames()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } /*******************************************************************************/ // Get number of selected filenames, not including "." and ".." FXint PathFinderMain::getNumFilenames() const { register FXint num=0; register FXint i; if(filelist->getNumItems()){ for(i=0; igetNumItems(); i++){ if(filelist->isItemSelected(i) && filelist->getItemFilename(i)!=".." && filelist->getItemFilename(i)!=".") num++; } } return num; } // Return selected filenames, not including "." and ".." FXString* PathFinderMain::getFilenames() const { register FXint num=getNumFilenames(); register FXString *files=NULL; register FXint i,n; if(0getNumItems(); i++){ if(filelist->isItemSelected(i) && filelist->getItemFilename(i)!=".." && filelist->getItemFilename(i)!="."){ files[n++]=filelist->getItemPathname(i); } } files[n]=FXString::null; } return files; } /*******************************************************************************/ // Sort functions static const FXIconListSortFunc sortfuncs[]={ FXFileList::ascendingCase, FXFileList::descendingCase, FXFileList::ascending, FXFileList::descending, FXFileList::ascendingType, FXFileList::descendingType, FXFileList::ascendingSize, FXFileList::descendingSize, FXFileList::ascendingTime, FXFileList::descendingTime, FXFileList::ascendingUser, FXFileList::descendingUser, FXFileList::ascendingGroup, FXFileList::descendingGroup }; // Save settings void PathFinderMain::saveSettings(){ FXString path; FXString filter; FXuint iconview; FXuint hiddenfiles; FXuint thumbnails; FXuint hiddendirs; FXuint index; FXIconListSortFunc sortfunc; // Save pathfinder directory path=filelist->getDirectory(); getApp()->reg().writeStringEntry("PathFinder Settings","directory",path.text()); // Save file list mode iconview=filelist->getListStyle(); getApp()->reg().writeUnsignedEntry("PathFinder Settings","iconview",iconview); // Showing hidden files... hiddenfiles=filelist->showHiddenFiles(); getApp()->reg().writeUnsignedEntry("PathFinder Settings","hiddenfiles",hiddenfiles); // Showing hidden directories... hiddendirs=dirlist->showHiddenFiles(); getApp()->reg().writeUnsignedEntry("PathFinder Settings","hiddendirs",hiddendirs); // Showing thumbnails... thumbnails=filelist->showImages(); getApp()->reg().writeUnsignedEntry("PathFinder Settings","thumbnails",thumbnails); // Write new window size back to registry getApp()->reg().writeIntEntry("PathFinder Settings","x",getX()); getApp()->reg().writeIntEntry("PathFinder Settings","y",getY()); getApp()->reg().writeIntEntry("PathFinder Settings","width",getWidth()); getApp()->reg().writeIntEntry("PathFinder Settings","height",getHeight()); // Width of tree getApp()->reg().writeIntEntry("PathFinder Settings","dirwidth",splitter->getSplit(0)); // Filter filter=filelist->getPattern(); getApp()->reg().writeStringEntry("PathFinder Settings","filter",filter.text()); // Header sizes getApp()->reg().writeIntEntry("PathFinder Settings","nameheader",filelist->getHeaderSize(0)); getApp()->reg().writeIntEntry("PathFinder Settings","typeheader",filelist->getHeaderSize(1)); getApp()->reg().writeIntEntry("PathFinder Settings","sizeheader",filelist->getHeaderSize(2)); getApp()->reg().writeIntEntry("PathFinder Settings","dateheader",filelist->getHeaderSize(3)); getApp()->reg().writeIntEntry("PathFinder Settings","userheader",filelist->getHeaderSize(4)); getApp()->reg().writeIntEntry("PathFinder Settings","attrheader",filelist->getHeaderSize(5)); // Visited directories getApp()->reg().writeStringEntry("Visited Directories","0",visiteddir[0].text()); getApp()->reg().writeStringEntry("Visited Directories","1",visiteddir[1].text()); getApp()->reg().writeStringEntry("Visited Directories","2",visiteddir[2].text()); getApp()->reg().writeStringEntry("Visited Directories","3",visiteddir[3].text()); getApp()->reg().writeStringEntry("Visited Directories","4",visiteddir[4].text()); getApp()->reg().writeStringEntry("Visited Directories","5",visiteddir[5].text()); getApp()->reg().writeStringEntry("Visited Directories","6",visiteddir[6].text()); getApp()->reg().writeStringEntry("Visited Directories","7",visiteddir[7].text()); getApp()->reg().writeStringEntry("Visited Directories","8",visiteddir[8].text()); getApp()->reg().writeStringEntry("Visited Directories","9",visiteddir[9].text()); // Visiting getApp()->reg().writeIntEntry("Visited Directories","visiting",visiting); // Editor command getApp()->reg().writeStringEntry("PathFinder Settings","editor",editor.text()); // Terminal command getApp()->reg().writeStringEntry("PathFinder Settings","terminal",terminal.text()); // Program last ran getApp()->reg().writeStringEntry("PathFinder Settings","program",program.text()); // Preview getApp()->reg().writeIntEntry("PathFinder Settings","preview",preview); getApp()->reg().writeIntEntry("PathFinder Settings","blending",blending); // Toolbar, location bar, status bar shown getApp()->reg().writeIntEntry("PathFinder Settings","toolbar",toolbar->shown()); getApp()->reg().writeIntEntry("PathFinder Settings","locationbar",locationbar->shown()); getApp()->reg().writeIntEntry("PathFinder Settings","statusbar",statusbar->shown()); // File patterns getApp()->reg().writeIntEntry("PathFinder Settings","filepatternno",getCurrentPattern()); getApp()->reg().writeStringEntry("PathFinder Settings","filepatterns",getPatterns().text()); // Sort function sortfunc=filelist->getSortFunc(); for(index=ARRAYNUMBER(sortfuncs)-1; index; index--){ if(sortfuncs[index]==sortfunc) break; } getApp()->reg().writeIntEntry("PathFinder Settings","sorting",index); } // Load settings void PathFinderMain::loadSettings(){ FXString path; FXString filter; FXuint iconview; FXuint hiddenfiles; FXuint thumbnails; FXuint hiddendirs; FXuint sortfunc; FXint ww,hh,xx,yy,tbshown,lbshown,sbshown; // Read last path setting path=getApp()->reg().readStringEntry("PathFinder Settings","directory","~"); setDirectory(path); // Read icon view mode iconview=getApp()->reg().readUnsignedEntry("PathFinder Settings","iconview",ICONLIST_BIG_ICONS|ICONLIST_AUTOSIZE); filelist->setListStyle(iconview); // Showing hidden files... hiddenfiles=getApp()->reg().readUnsignedEntry("PathFinder Settings","hiddenfiles",FALSE); filelist->showHiddenFiles(hiddenfiles); // Showing thumbnails... thumbnails=getApp()->reg().readUnsignedEntry("PathFinder Settings","thumbnails",FALSE); filelist->showImages(thumbnails); // Showing hidden directories... hiddendirs=getApp()->reg().readUnsignedEntry("PathFinder Settings","hiddendirs",FALSE); dirlist->showHiddenFiles(hiddendirs); // Get size xx=getApp()->reg().readIntEntry("PathFinder Settings","x",100); yy=getApp()->reg().readIntEntry("PathFinder Settings","y",100); ww=getApp()->reg().readIntEntry("PathFinder Settings","width",800); hh=getApp()->reg().readIntEntry("PathFinder Settings","height",600); setX(xx); setY(yy); setWidth(ww); setHeight(hh); // Set tree width splitter->setSplit(0,getApp()->reg().readIntEntry("PathFinder Settings","dirwidth",100)); // Filter filter=getApp()->reg().readStringEntry("PathFinder Settings","filter","*"); filelist->setPattern(filter); // Header sizes filelist->setHeaderSize(0,getApp()->reg().readIntEntry("PathFinder Settings","nameheader",200)); filelist->setHeaderSize(1,getApp()->reg().readIntEntry("PathFinder Settings","typeheader",100)); filelist->setHeaderSize(2,getApp()->reg().readIntEntry("PathFinder Settings","sizeheader",60)); filelist->setHeaderSize(3,getApp()->reg().readIntEntry("PathFinder Settings","dateheader",150)); filelist->setHeaderSize(4,getApp()->reg().readIntEntry("PathFinder Settings","userheader",50)); filelist->setHeaderSize(5,getApp()->reg().readIntEntry("PathFinder Settings","attrheader",60)); // Visited directories visiteddir[0]=getApp()->reg().readStringEntry("Visited Directories","0",FXString::null); visiteddir[1]=getApp()->reg().readStringEntry("Visited Directories","1",FXString::null); visiteddir[2]=getApp()->reg().readStringEntry("Visited Directories","2",FXString::null); visiteddir[3]=getApp()->reg().readStringEntry("Visited Directories","3",FXString::null); visiteddir[4]=getApp()->reg().readStringEntry("Visited Directories","4",FXString::null); visiteddir[5]=getApp()->reg().readStringEntry("Visited Directories","5",FXString::null); visiteddir[6]=getApp()->reg().readStringEntry("Visited Directories","6",FXString::null); visiteddir[7]=getApp()->reg().readStringEntry("Visited Directories","7",FXString::null); visiteddir[8]=getApp()->reg().readStringEntry("Visited Directories","8",FXString::null); visiteddir[9]=getApp()->reg().readStringEntry("Visited Directories","9",FXString::null); // Visiting visiting=getApp()->reg().readIntEntry("Visited Directories","visiting",0); // Editor command editor=getApp()->reg().readStringEntry("PathFinder Settings","editor","adie"); // Terminal command terminal=getApp()->reg().readStringEntry("PathFinder Settings","terminal","xterm"); // Program last ran program=getApp()->reg().readStringEntry("PathFinder Settings","program","adie"); // Preview preview=getApp()->reg().readIntEntry("PathFinder Settings","preview",TRUE); blending=getApp()->reg().readIntEntry("PathFinder Settings","blending",FALSE); // Toolbar, location bar, status bar shown tbshown=getApp()->reg().readIntEntry("PathFinder Settings","toolbar",1); lbshown=getApp()->reg().readIntEntry("PathFinder Settings","locationbar",1); sbshown=getApp()->reg().readIntEntry("PathFinder Settings","statusbar",1); if(!tbshown) toolbar->hide(); if(!lbshown) locationbar->hide(); if(!sbshown) statusbar->hide(); // File patterns setPatterns(getApp()->reg().readStringEntry("PathFinder Settings","filepatterns","All Files (*)")); setCurrentPattern(getApp()->reg().readIntEntry("PathFinder Settings","filepatternno",0)); // Sort function sortfunc=getApp()->reg().readIntEntry("PathFinder Settings","sorting",0); if(sortfunc>=ARRAYNUMBER(sortfuncs)) sortfunc=0; filelist->setSortFunc(sortfuncs[sortfunc]); } // Close the window, saving settings FXbool PathFinderMain::close(FXbool notify){ saveSettings(); return FXMainWindow::close(notify); } // Switch to given directory void PathFinderMain::setDirectory(const FXString& dir){ FXString oldpath=getDirectory(); FXString newpath=FXPath::absolute(oldpath,dir); filelist->setDirectory(newpath); dirbox->setDirectory(newpath); dirlist->setDirectory(newpath); address->setText(newpath); } // Get current directory FXString PathFinderMain::getDirectory() const { return filelist->getDirectory(); } // Visit directory void PathFinderMain::visitDirectory(const FXString& dir){ FXint i; if(visiting==0){ for(i=9; i; i--) visiteddir[i]=visiteddir[i-1]; } else{ for(i=1; i+visiting-1<=9; i++) visiteddir[i]=visiteddir[i+visiting-1]; for( ; i<10; i++) visiteddir[i]=FXString::null; } visiteddir[0]=dir; visiting=0; } // Change patterns, each pattern separated by newline void PathFinderMain::setPatterns(const FXString& patterns){ FXString pat; FXint i; pattern->clearItems(); for(i=0; !(pat=patterns.section('\n',i)).empty(); i++){ pattern->appendItem(pat); } if(!pattern->getNumItems()) pattern->appendItem("All Files (*)"); setCurrentPattern(0); } // Return list of patterns FXString PathFinderMain::getPatterns() const { FXString pat; FXint i; for(i=0; igetNumItems(); i++){ if(!pat.empty()) pat+='\n'; pat+=pattern->getItemText(i); } return pat; } // Set current pattern void PathFinderMain::setCurrentPattern(FXint n){ n=FXCLAMP(0,n,pattern->getNumItems()-1); pattern->setCurrentItem(n); dirlist->setPattern(FXFileSelector::patternFromText(pattern->getItemText(n))); } // Return current pattern FXint PathFinderMain::getCurrentPattern() const { return pattern->getCurrentItem(); } // Make application void PathFinderMain::create(){ loadSettings(); FXMainWindow::create(); show(); } // Change the pattern long PathFinderMain::onCmdFilter(FXObject*,FXSelector,void* ptr){ filelist->setPattern(FXFileSelector::patternFromText((FXchar*)ptr)); return 1; } // Goto directory long PathFinderMain::onCmdGotoDir(FXObject*,FXSelector,void*){ FXBMPIcon icon(getApp(),gotodir,0,IMAGE_ALPHAGUESS); FXString dir=getDirectory(); if(FXInputDialog::getString(dir,this,"Goto Directory","&Goto directory:",&icon)){ setDirectory(dir); closePreview(); } return 1; } // Open with program long PathFinderMain::onCmdOpenWith(FXObject*,FXSelector,void*){ FXString cmd=getApp()->reg().readStringEntry("SETTINGS","command","adie"); FXString filename=filelist->getCurrentFile(); if(FXInputDialog::getString(cmd,this,"Open File With","Open " + FXPath::name(filename) + " with:")){ getApp()->reg().writeStringEntry("SETTINGS","command",cmd.text()); FXString command=cmd+" "+filename+" &"; system(command.text()); /* // Spawn child if(fork()==0){ // Close on exec of file descriptor //fcntl(fd,F_SETFD,TRUE); // Start command and pass it the filename execlp(cmd.text(),cmd.text(),filename.text(),NULL); // Just in case we failed to execute the command ::exit(0); } */ } return 1; } // Open this file with the editor long PathFinderMain::onCmdOpenWithEditor(FXObject*,FXSelector,void*){ FXString currentfile=filelist->getCurrentFile(); if(!currentfile.empty()){ FXString executable=editor+" "+FXPath::enquote(currentfile)+" &"; FXTRACE((100,"system(%s)\n",executable.text())); system(executable.text()); } return 1; } // Run program long PathFinderMain::onCmdRun(FXObject*,FXSelector,void*){ FXString newprogram=program; if(FXInputDialog::getString(newprogram,this,"Run Program","Run Program:")){ program=newprogram; FXString executeable="cd "+FXPath::enquote(getDirectory())+"; "+program+" &"; system(executeable.text()); } return 1; } // Run terminal long PathFinderMain::onCmdTerminal(FXObject*,FXSelector,void*){ FXString executable="cd "+FXPath::enquote(getDirectory())+"; "+terminal+" &"; system(executable.text()); return 1; } // Show preferences dialog long PathFinderMain::onCmdPreferences(FXObject*,FXSelector,void*){ Preferences preferences(this); preferences.setPatterns(getPatterns()); preferences.setEditor(editor); preferences.setTerminal(terminal); preferences.setPreview(preview); preferences.setBlend(blending); preferences.setIconPath(associations->getIconPath()); if(preferences.execute()){ setPatterns(preferences.getPatterns()); terminal=preferences.getTerminal(); editor=preferences.getEditor(); preview=preferences.getPreview(); blending=preferences.getBlend(); associations->setIconPath(preferences.getIconPath()); } return 1; } // Change mode long PathFinderMain::onCmdChmod(FXObject*,FXSelector sel,void*){ FXString filename=filelist->getCurrentFile(); FXuint mode=FXStat::mode(filename); #ifndef WIN32 switch(FXSELID(sel)) { case ID_RUSR: mode^=FXIO::OwnerRead; break; case ID_WUSR: mode^=FXIO::OwnerWrite; break; case ID_XUSR: mode^=FXIO::OwnerExec; break; case ID_RGRP: mode^=FXIO::GroupRead; break; case ID_WGRP: mode^=FXIO::GroupWrite; break; case ID_XGRP: mode^=FXIO::GroupExec; break; case ID_ROTH: mode^=FXIO::OtherRead; break; case ID_WOTH: mode^=FXIO::OtherWrite; break; case ID_XOTH: mode^=FXIO::OtherExec; break; case ID_SUID: mode^=FXIO::SetUser; break; case ID_SGID: mode^=FXIO::SetGroup; break; case ID_SVTX: mode^=FXIO::Sticky; break; } #endif if(!FXStat::mode(filename,mode)){ FXMessageBox::error(this,MBOX_OK,"Error Changing Permissions","Unable to change permissions on file: %s",filename.text()); } return 1; } // Update change mode long PathFinderMain::onUpdChmod(FXObject* sender,FXSelector sel,void*){ FXString filename=filelist->getCurrentFile(); FXuint mode=FXStat::mode(filename); FXuint test=0; switch(FXSELID(sel)) { case ID_RUSR: test=(mode&FXIO::OwnerRead); break; case ID_WUSR: test=(mode&FXIO::OwnerWrite); break; case ID_XUSR: test=(mode&FXIO::OwnerExec); break; case ID_RGRP: test=(mode&FXIO::GroupRead); break; case ID_WGRP: test=(mode&FXIO::GroupWrite); break; case ID_XGRP: test=(mode&FXIO::GroupExec); break; case ID_ROTH: test=(mode&FXIO::OtherRead); break; case ID_WOTH: test=(mode&FXIO::OtherWrite); break; case ID_XOTH: test=(mode&FXIO::OtherExec); break; case ID_SUID: test=(mode&FXIO::SetUser); break; case ID_SGID: test=(mode&FXIO::SetGroup); break; case ID_SVTX: test=(mode&FXIO::Sticky); break; } sender->handle(this,test ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Update owner long PathFinderMain::onUpdOwner(FXObject* sender,FXSelector,void*){ FXStat info; FXStat::statFile(filelist->getCurrentFile(),info); FXString owner=FXSystem::userName(info.user()); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&owner); return 1; } // Update group long PathFinderMain::onUpdGroup(FXObject* sender,FXSelector,void*){ FXStat info; FXStat::statFile(filelist->getCurrentFile(),info); FXString group=FXSystem::groupName(info.group()); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&group); return 1; } // Update create time long PathFinderMain::onUpdCreateTime(FXObject* sender,FXSelector,void*){ FXString time=FXSystem::time(FXStat::created(filelist->getCurrentFile())); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&time); return 1; } // Update modified time long PathFinderMain::onUpdModifyTime(FXObject* sender,FXSelector,void*){ FXString time=FXSystem::time(FXStat::modified(filelist->getCurrentFile())); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&time); return 1; } // Update access time long PathFinderMain::onUpdAccessTime(FXObject* sender,FXSelector,void*){ FXString time=FXSystem::time(FXStat::accessed(filelist->getCurrentFile())); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&time); return 1; } // Update file location long PathFinderMain::onUpdFileLocation(FXObject* sender,FXSelector,void*){ FXString location=filelist->getCurrentFile(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&location); return 1; } // Update file type long PathFinderMain::onUpdFileSize(FXObject* sender,FXSelector,void*){ FXString size=FXStringVal(FXStat::size(filelist->getCurrentFile())); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&size); return 1; } // Update file type long PathFinderMain::onUpdFileType(FXObject* sender,FXSelector,void*){ FXString filename=filelist->getCurrentFile(); FXFileAssoc *fileassoc=NULL; FXString type; if(FXStat::isDirectory(filename)){ fileassoc=associations->findDirBinding(filename.text()); type="Folder"; } else if(FXStat::isExecutable(filename)){ fileassoc=associations->findExecBinding(filename.text()); type="Application"; } else{ fileassoc=associations->findFileBinding(filename.text()); type="Document"; } if(fileassoc) type=fileassoc->extension; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&type); return 1; } // Update file type long PathFinderMain::onUpdFileDesc(FXObject* sender,FXSelector,void*){ FXString filename=filelist->getCurrentFile(); FXLabel *label=(FXLabel*)sender; FXFileAssoc *fileassoc=NULL; if(FXStat::isDirectory(filename)){ fileassoc=associations->findDirBinding(filename.text()); } else if(FXStat::isExecutable(filename)){ fileassoc=associations->findExecBinding(filename.text()); } else{ fileassoc=associations->findFileBinding(filename.text()); } label->setText(FXPath::name(filename)); if(fileassoc){ if(fileassoc->bigicon) fileassoc->bigicon->create(); label->setIcon(fileassoc->bigicon); } else{ label->setIcon(NULL); // FIXME need a default suggestion here } return 1; } long PathFinderMain::onCmdRotateImage(FXObject*,FXSelector sel,void*){ FXImage * image=imagepreview->getImage(); image->rotate((FXSELID(sel)==ID_IMAGE_ROTATE_LEFT)?90:-90); imagepreview->setImage(image); return 1; } long PathFinderMain::onUpdRotateImage(FXObject* sender,FXSelector,void*){ sender->handle(this,imagepreview->getImage()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Close image previous panel long PathFinderMain::onCmdClosePreview(FXObject*,FXSelector,void*){ closePreview(); return 1; } // Close image preview long PathFinderMain::onClickedImagePreview(FXObject*,FXSelector,void *ptr){ if(((FXEvent*)ptr)->click_count==2) closePreview(); return 1; } // Update close image previous panel long PathFinderMain::onUpdClosePreview(FXObject* sender,FXSelector,void*){ sender->handle(this,switcher->getCurrent()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Load image for preview FXbool PathFinderMain::previewImage(const FXString& filename){ FXString ext=FXPath::extension(filename); FXImage *img=NULL; FXImage *old=NULL; // Determine type of image if(comparecase(ext,"gif")==0){ img=new FXGIFImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } else if(comparecase(ext,"bmp")==0){ img=new FXBMPImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } else if(comparecase(ext,"xpm")==0){ img=new FXXPMImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } else if(comparecase(ext,"pcx")==0){ img=new FXPCXImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } else if(comparecase(ext,"ico")==0 || comparecase(ext,"cur")==0){ img=new FXICOImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } else if(comparecase(ext,"tga")==0){ img=new FXTGAImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } else if(comparecase(ext,"rgb")==0){ img=new FXRGBImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } else if(comparecase(ext,"pbm")==0 || comparecase(ext,"pgm")==0 || comparecase(ext,"pnm")==0 || comparecase(ext,"ppm")==0){ img=new FXPPMImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } else if(comparecase(ext,"xbm")==0){ img=new FXXBMImage(getApp(),NULL,NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } else if(comparecase(ext,"ppm")==0){ img=new FXPPMImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } else if(comparecase(ext,"iff")==0 || comparecase(ext,"lbm")==0){ img=new FXIFFImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } else if(comparecase(ext,"ras")==0){ img=new FXRASImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } #ifdef HAVE_PNG_H else if(comparecase(ext,"png")==0){ img=new FXPNGImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } #endif #ifdef HAVE_JPEG_H else if(comparecase(ext,"jpg")==0){ img=new FXJPGImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } #endif #ifdef HAVE_TIFF_H else if(comparecase(ext,"tif")==0 || comparecase(ext,"tiff")==0){ img=new FXTIFImage(getApp(),NULL,IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP); } #endif // Perhaps failed if(img){ FXFileStream stream; // Load image if(stream.open(filename,FXStreamLoad)){ getApp()->beginWaitCursor(); img->loadPixels(stream); stream.close(); // Blend over background if(blending){ img->blend(imagepreview->getBackColor()); } // Create image img->create(); // Set new image, deleting old old=imagepreview->getImage(); imagepreview->setImage(img); delete old; getApp()->endWaitCursor(); // Switch to preview switcher->setCurrent(1); return TRUE; } } return FALSE; } // Close preview void PathFinderMain::closePreview(){ delete imagepreview->getImage(); imagepreview->setImage(NULL); switcher->setCurrent(0); } // Harvest the zombies :-) long PathFinderMain::onSigHarvest(FXObject*,FXSelector,void*){ #ifndef WIN32 while(waitpid(-1,NULL,WNOHANG)>0); #endif return 1; } /*******************************************************************************/ // Start the whole thing int main(int argc,char *argv[]){ // Create application FXApp application("PathFinder",FXString::null); // Keep original launch name PathFinderMain::pathfindercommand=argv[0]; // Initialize application application.init(argc,argv); // Build GUI PathFinderMain* window=new PathFinderMain(&application); // On unix, we need to catch SIGCHLD to harvest zombie child processes. #ifndef WIN32 application.addSignal(SIGCHLD,window,PathFinderMain::ID_HARVEST,TRUE); #endif // Also catch interrupt so we can gracefully terminate application.addSignal(SIGINT,window,PathFinderMain::ID_CLOSE); // Create window application.create(); // If given, start in indicated directory if(argc==2) window->setDirectory(argv[1]); // Run the app now... return application.run(); } fox1.6-1.6.57/pathfinder/PathFinder.h000066400000000000000000000232341326741342000171620ustar00rootroot00000000000000/******************************************************************************** * * * T h e P a t h F i n d e r F i l e B r o w s e r * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: PathFinder.h,v 1.42 2006/01/22 17:58:15 fox Exp $ * ********************************************************************************/ #ifndef PATHFINDER_H #define PATHFINDER_H class PropertyDialog; class Preferences; // PathFinder Main Window class PathFinderMain : public FXMainWindow { FXDECLARE(PathFinderMain) protected: PropertyDialog *property; FXToolBarShell *dragshell1; // For floating menu bar FXToolBarShell *dragshell2; // For floating tool bar FXToolBarShell *dragshell3; // For floating location bar FXToolBar *toolbar; // Toolbar FXToolBar *locationbar; // Location bar FXStatusBar *statusbar; // Status bar FXMenuPane *filemenu; FXMenuPane *editmenu; FXMenuPane *viewmenu; FXMenuPane *gomenu; FXMenuPane *arrangemenu; FXMenuPane *sortmenu; FXMenuPane *prefmenu; FXMenuPane *helpmenu; FXMenuPane *bookmarkmenu; FXDirBox *dirbox; // Directory box FXSwitcher *switcher; // Switcher for preview FXSplitter *splitter; FXVerticalFrame *group1; FXVerticalFrame *group2; FXDirList *dirlist; // Directory tree FXFileList *filelist; // File list FXComboBox *pattern; // Filter pattern FXTextField *address; // Address field FXImageView *imagepreview; // Image preview panel FXRecentFiles bookmarkeddirs; // Bookmarked directories FXFileDict *associations; // File associations FXIcon *foxbigicon; // Icons FXIcon *foxminiicon; FXIcon *cuticon; FXIcon *copyicon; FXIcon *moveicon; FXIcon *linkicon; FXIcon *renameicon; FXIcon *pasteicon; FXIcon *upicon; FXIcon *homeicon; FXIcon *backicon; FXIcon *forwicon; FXIcon *bigiconsicon; FXIcon *miniiconsicon; FXIcon *detailsicon; FXIcon *mapicon; FXIcon *unmapicon; FXIcon *propicon; FXIcon *deleteicon; FXIcon *setbookicon; FXIcon *clrbookicon; FXIcon *workicon; FXIcon *closeicon; FXIcon *locationicon; FXIcon *entericon; FXIcon *rotatelefticon; FXIcon *rotaterighticon; FXIcon *quiticon; FXString editor; // Editor command FXString terminal; // Terminal command FXString program; // Last program FXString visiteddir[10]; // Visited directories FXint visiting; // Currently visited directory FXbool preview; // Preview mode FXbool blending; // Icon blending protected: PathFinderMain(){} FXint getNumFilenames() const; FXString* getFilenames() const; void visitDirectory(const FXString& dir); void setPatterns(const FXString& patterns); FXString getPatterns() const; void setCurrentPattern(FXint n); FXint getCurrentPattern() const; FXbool previewImage(const FXString& filename); void closePreview(); public: long onCmdAbout(FXObject*,FXSelector,void*); long onCmdClosePreview(FXObject*,FXSelector,void*); long onUpdClosePreview(FXObject*,FXSelector,void*); long onCmdDirTree(FXObject*,FXSelector,void*); long onCmdDirectory(FXObject*,FXSelector,void*); long onCmdFileClicked(FXObject*,FXSelector,void*); long onCmdFileDblClicked(FXObject*,FXSelector,void*); long onCmdGotoLocation(FXObject*,FXSelector,void*); long onCmdClearLocation(FXObject*,FXSelector,void*); long onCmdUpDirectory(FXObject*,FXSelector,void*); long onUpdTitle(FXObject*,FXSelector,void*); long onUpdFiles(FXObject*,FXSelector,void*); long onCmdHomeDirectory(FXObject*,FXSelector,void*); long onCmdWorkDirectory(FXObject*,FXSelector,void*); long onCmdRecentDirectory(FXObject*,FXSelector,void*); long onCmdSaveSettings(FXObject*,FXSelector,void*); long onCmdNewPathFinder(FXObject*,FXSelector,void*); long onFileListPopup(FXObject*,FXSelector,void*); long onUpdStatusline(FXObject*,FXSelector,void*); long onCmdProperties(FXObject*,FXSelector,void*); long onUpdProperties(FXObject*,FXSelector,void*); long onCmdBookmark(FXObject*,FXSelector,void*); long onCmdBackDirectory(FXObject*,FXSelector,void*); long onUpdBackDirectory(FXObject*,FXSelector,void*); long onCmdForwardDirectory(FXObject*,FXSelector,void*); long onUpdForwardDirectory(FXObject*,FXSelector,void*); long onCmdClipboardCut(FXObject*,FXSelector,void*); long onCmdClipboardCopy(FXObject*,FXSelector,void*); long onCmdClipboardPaste(FXObject*,FXSelector,void*); long onCmdNew(FXObject*,FXSelector,void*); long onUpdNew(FXObject*,FXSelector,void*); long onCmdCopy(FXObject*,FXSelector,void*); long onCmdMove(FXObject*,FXSelector,void*); long onCmdLink(FXObject*,FXSelector,void*); long onCmdRename(FXObject*,FXSelector,void*); long onCmdDelete(FXObject*,FXSelector,void*); long onUpdSelected(FXObject*,FXSelector,void*); long onCmdFilter(FXObject*,FXSelector,void*); long onCmdGotoDir(FXObject*,FXSelector,void*); long onCmdChmod(FXObject*,FXSelector,void*); long onUpdChmod(FXObject*,FXSelector,void*); long onUpdOwner(FXObject*,FXSelector,void*); long onUpdGroup(FXObject*,FXSelector,void*); long onUpdCreateTime(FXObject*,FXSelector,void*); long onUpdModifyTime(FXObject*,FXSelector,void*); long onUpdAccessTime(FXObject*,FXSelector,void*); long onUpdFileType(FXObject*,FXSelector,void*); long onUpdFileLocation(FXObject*,FXSelector,void*); long onUpdFileSize(FXObject*,FXSelector,void*); long onUpdFileDesc(FXObject*,FXSelector,void*); long onCmdOpen(FXObject*,FXSelector,void*); long onCmdOpenWith(FXObject*,FXSelector,void*); long onCmdOpenWithEditor(FXObject*,FXSelector,void*); long onUpdHaveItem(FXObject*,FXSelector,void*); long onCmdRun(FXObject*,FXSelector,void*); long onCmdTerminal(FXObject*,FXSelector,void*); long onSigHarvest(FXObject*,FXSelector,void*); long onClickedImagePreview(FXObject*,FXSelector,void*); long onCmdRotateImage(FXObject*,FXSelector,void*); long onUpdRotateImage(FXObject*,FXSelector,void*); long onCmdPreferences(FXObject*,FXSelector,void*); public: enum{ ID_ABOUT=FXMainWindow::ID_LAST, ID_FILEFILTER, ID_DIRECTORYLIST, ID_FILELIST, ID_DIRBOX, ID_UPDATE_FILES, ID_UPDIRECTORY, ID_MAINWINDOW, ID_GOTO_LOCATION, ID_CLEAR_LOCATION, ID_GO_WORK, ID_GO_HOME, ID_GO_BACKWARD, ID_GO_FORWARD, ID_GO_RECENT, ID_SAVE_SETTINGS, ID_NEW_PATHFINDER, ID_STATUSLINE, ID_PROPERTIES, ID_BOOKMARK, ID_DELETE, ID_CLIPBOARD_CUT, ID_CLIPBOARD_COPY, ID_CLIPBOARD_PASTE, ID_COPY, ID_MOVE, ID_LINK, ID_RENAME, ID_NEW, ID_GOTO_DIR, ID_OPEN, ID_OPEN_WITH, ID_OPEN_WITH_EDITOR, ID_RUN, ID_TERMINAL, ID_RUSR, // File modes ID_WUSR, ID_XUSR, ID_RGRP, ID_WGRP, ID_XGRP, ID_ROTH, ID_WOTH, ID_XOTH, ID_SUID, ID_SGID, ID_SVTX, ID_OWNER, // File ownership ID_GROUP, ID_FILE_CREATED, ID_FILE_ACCESSED, ID_FILE_MODIFIED, ID_FILE_TYPE, ID_FILE_LOCATION, ID_FILE_SIZE, ID_FILE_DESC, ID_CLOSE_PREVIEW, ID_IMAGE_PREVIEW, ID_IMAGE_ROTATE_LEFT, ID_IMAGE_ROTATE_RIGHT, ID_HARVEST, ID_PREFERENCES, ID_LAST }; public: static FXchar* pathfindercommand; public: // Construct window PathFinderMain(FXApp* a); // Create virtual void create(); // Closed window virtual FXbool close(FXbool notify=FALSE); // Switch current directory void setDirectory(const FXString& dir); // Return current directory FXString getDirectory() const; // Return file associations FXFileDict *getAssociations() const { return associations; } // Save settings void saveSettings(); // Load settings void loadSettings(); // Destroy virtual ~PathFinderMain(); }; #endif fox1.6-1.6.57/pathfinder/Preferences.cpp000066400000000000000000000352751326741342000177420ustar00rootroot00000000000000/******************************************************************************** * * * P r e f e r e n c e s D i a l o g * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Preferences.cpp,v 1.17 2006/01/22 17:58:15 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "PathFinder.h" #include "Preferences.h" #include "icons.h" /*******************************************************************************/ // Map FXDEFMAP(Preferences) PreferencesMap[]={ FXMAPFUNC(SEL_COMMAND,Preferences::ID_BROWSE_EDITOR,Preferences::onCmdBrowseEditor), FXMAPFUNC(SEL_COMMAND,Preferences::ID_BROWSE_TERMINAL,Preferences::onCmdBrowseTerminal), FXMAPFUNC(SEL_COMMAND,Preferences::ID_BROWSE_COMMAND,Preferences::onCmdBrowseCommand), FXMAPFUNC(SEL_COMMAND,Preferences::ID_COMMAND,Preferences::onCmdCommand), FXMAPFUNC(SEL_COMMAND,Preferences::ID_MIMETYPE,Preferences::onCmdMimeType), FXMAPFUNC(SEL_COMMAND,Preferences::ID_DESCRIPTION,Preferences::onCmdDescription), FXMAPFUNC(SEL_CHANGED,Preferences::ID_SELECT_EXTENSION,Preferences::onCmdSelectExtension), FXMAPFUNC(SEL_COMMAND,Preferences::ID_APPEND_EXTENSION,Preferences::onCmdAppendExtension), FXMAPFUNC(SEL_COMMAND,Preferences::ID_REMOVE_EXTENSION,Preferences::onCmdRemoveExtension), FXMAPFUNC(SEL_UPDATE,Preferences::ID_REMOVE_EXTENSION,Preferences::onUpdSelectExtension), FXMAPFUNCS(SEL_COMMAND,Preferences::ID_BROWSE_BIGICON,Preferences::ID_BROWSE_SMALLICONOPEN,Preferences::onCmdBrowseIcon), FXMAPFUNCS(SEL_UPDATE,Preferences::ID_BROWSE_BIGICON,Preferences::ID_BROWSE_SMALLICONOPEN,Preferences::onUpdSelectExtension), }; // Object implementation FXIMPLEMENT(Preferences,FXDialogBox,PreferencesMap,ARRAYNUMBER(PreferencesMap)) // Construct Preferences::Preferences(PathFinderMain *owner): FXDialogBox(owner,"PathFinder Preferences",DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,0,0,0,0, 0,0,0,0, 4,4){ FXVerticalFrame *vertical=new FXVerticalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y); FXHorizontalFrame *horizontal=new FXHorizontalFrame(vertical,LAYOUT_FILL_X|LAYOUT_FILL_Y); FXVerticalFrame *buttons=new FXVerticalFrame(horizontal,LAYOUT_LEFT|LAYOUT_FILL_Y|FRAME_SUNKEN|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT,0,0,0,0, 0,0,0,0, 0,0); FXSwitcher *switcher=new FXSwitcher(horizontal,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); // Icons pat=new FXGIFIcon(getApp(),pattern_gif); brw=new FXGIFIcon(getApp(),file_gif); icp=new FXGIFIcon(getApp(),iconpath); mim=new FXGIFIcon(getApp(),mimetype); dir=new FXGIFIcon(getApp(),setdir); /////////////////////////// Browser settings pane //////////////////////////// FXVerticalFrame* browserpane=new FXVerticalFrame(switcher,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0, 0,0); new FXLabel(browserpane,tr("PathFinder settings"),NULL,LAYOUT_LEFT); new FXHorizontalSeparator(browserpane,SEPARATOR_LINE|LAYOUT_FILL_X); FXMatrix *matrix2=new FXMatrix(browserpane,3,MATRIX_BY_COLUMNS|PACK_UNIFORM_HEIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,10,0, 6, 6); new FXLabel(matrix2,tr("Editor command:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X); editor=new FXTextField(matrix2,6,NULL,0,FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN,0,0,0,0, 2,2,2,2); new FXButton(matrix2,tr("\tBrowse..."),dir,this,ID_BROWSE_EDITOR,FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y); new FXLabel(matrix2,tr("Terminal command:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X); terminal=new FXTextField(matrix2,6,NULL,0,FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN,0,0,0,0, 2,2,2,2); new FXButton(matrix2,tr("\tBrowse..."),dir,this,ID_BROWSE_TERMINAL,FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y); new FXLabel(matrix2,tr("Preview images:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X); preview=new FXCheckButton(matrix2,FXString::null,NULL,0,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN,0,0,0,0, 0,0,0,0); new FXFrame(matrix2,0); new FXLabel(matrix2,tr("Image blending:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X); blending=new FXCheckButton(matrix2,FXString::null,NULL,0,LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN,0,0,0,0, 0,0,0,0); new FXFrame(matrix2,0); //// Browser settings button new FXButton(buttons,tr("Browser\tFile browser settings\tChange browser settings and other things."),brw,switcher,FXSwitcher::ID_OPEN_FIRST,FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y); /////////////////////// File pattern settings pane ////////////////////////// FXVerticalFrame* filepatpane=new FXVerticalFrame(switcher,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0, 0,0); new FXLabel(filepatpane,tr("Filename patterns"),NULL,LAYOUT_LEFT); new FXHorizontalSeparator(filepatpane,SEPARATOR_LINE|LAYOUT_FILL_X); FXVerticalFrame *sub3=new FXVerticalFrame(filepatpane,LAYOUT_FILL_Y|LAYOUT_FILL_X,0,0,0,0, 0,0,10,0, 0,0); new FXLabel(sub3,tr("Filename patterns, one per line:"),NULL,JUSTIFY_LEFT); FXVerticalFrame* textwell=new FXVerticalFrame(sub3,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, 0,0,0,0); pattern=new FXText(textwell,NULL,0,LAYOUT_FILL_X|LAYOUT_FILL_Y); //// File pattern settings button new FXButton(buttons,tr("Patterns\tFilename patterns\tChange wildcard patterns for filenames."),pat,switcher,FXSwitcher::ID_OPEN_SECOND,FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y); /////////////////////// Icon path settings pane ////////////////////////// FXVerticalFrame* iconpathpane=new FXVerticalFrame(switcher,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0, 0,0); new FXLabel(iconpathpane,tr("Icon search path"),NULL,LAYOUT_LEFT); new FXHorizontalSeparator(iconpathpane,SEPARATOR_LINE|LAYOUT_FILL_X); FXVerticalFrame *sub4=new FXVerticalFrame(iconpathpane,LAYOUT_FILL_Y|LAYOUT_FILL_X,0,0,0,0, 0,0,10,0, 0,0); new FXLabel(sub4,tr("Icon search folders, separated by '" PATHLISTSEPSTRING "', on one line:"),NULL,JUSTIFY_LEFT); FXVerticalFrame* textbox=new FXVerticalFrame(sub4,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, 0,0,0,0); icondirs=new FXText(textbox,NULL,0,TEXT_WORDWRAP|LAYOUT_FILL_X|LAYOUT_FILL_Y); //// File pattern settings button new FXButton(buttons,tr("Icon Path\tIcon search path\tChange folders searched for icons."),icp,switcher,FXSwitcher::ID_OPEN_THIRD,FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y); /////////////////////// Mime type settings pane ////////////////////////// FXPacker* mimetypepane=new FXPacker(switcher,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); new FXLabel(mimetypepane,tr("Mime Type Setup"),NULL,LAYOUT_LEFT|LAYOUT_SIDE_TOP); new FXHorizontalSeparator(mimetypepane,SEPARATOR_LINE|LAYOUT_FILL_X|LAYOUT_SIDE_TOP); // List of possible extensions of this file type FXGroupBox *extensiongroup=new FXGroupBox(mimetypepane,tr("File Extensions"),GROUPBOX_TITLE_LEFT|FRAME_GROOVE|LAYOUT_FILL_Y|LAYOUT_SIDE_LEFT); FXHorizontalFrame *filetypebuttons=new FXHorizontalFrame(extensiongroup,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0, 0,0,0,0); new FXButton(filetypebuttons,tr("Add..."),NULL,this,ID_APPEND_EXTENSION,FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_CENTER_X); new FXButton(filetypebuttons,tr("Remove"),NULL,this,ID_REMOVE_EXTENSION,FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_CENTER_X); FXVerticalFrame *extensionFrame=new FXVerticalFrame(extensiongroup,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, 0,0,0,0); extensions=new FXList(extensionFrame,this,ID_SELECT_EXTENSION,LIST_BROWSESELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y|HSCROLLER_NEVER); extensions->setSortFunc(FXList::ascendingCase); extensions->setNumVisible(4); // Various icons for this extension FXGroupBox *iconsgroup=new FXGroupBox(mimetypepane,tr("Icons"),GROUPBOX_TITLE_LEFT|FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_SIDE_TOP); FXMatrix *iconsmatrix=new FXMatrix(iconsgroup,8,MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH,0,0,0,0, 0,0,0,0); new FXLabel(iconsmatrix,tr("Big\nNormal"),NULL,JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); bigclosed=new FXButton(iconsmatrix,tr("\tChange icon"),NULL,this,ID_BROWSE_BIGICON,FRAME_RAISED|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,40, 1,1,1,1); new FXLabel(iconsmatrix,tr("Small\nNormal"),NULL,JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); smallclosed=new FXButton(iconsmatrix,tr("\tChange icon"),NULL,this,ID_BROWSE_SMALLICON,FRAME_RAISED|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,40, 1,1,1,1); new FXLabel(iconsmatrix,tr("Big\nOpen"),NULL,JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); bigopen=new FXButton(iconsmatrix,tr("\tChange icon"),NULL,this,ID_BROWSE_BIGICONOPEN,FRAME_RAISED|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,40, 1,1,1,1); new FXLabel(iconsmatrix,tr("Small\nOpen"),NULL,JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW); smallopen=new FXButton(iconsmatrix,tr("\tChange icon"),NULL,this,ID_BROWSE_SMALLICONOPEN,FRAME_RAISED|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,40,40, 1,1,1,1); // Description FXGroupBox *descgroup=new FXGroupBox(mimetypepane,tr("Description of extension"),GROUPBOX_TITLE_LEFT|FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_SIDE_TOP); description=new FXTextField(descgroup,30,this,ID_DESCRIPTION,LAYOUT_FILL_X|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK); // Mime type FXGroupBox *mimegroup=new FXGroupBox(mimetypepane,tr("Mime Types"),GROUPBOX_TITLE_LEFT|FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_SIDE_TOP); FXVerticalFrame *mimeFrame=new FXVerticalFrame(mimegroup,LAYOUT_SIDE_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, 0,0,0,0); mimetypes=new FXComboBox(mimeFrame,10,this,ID_MIMETYPE,COMBOBOX_NO_REPLACE|LAYOUT_FILL_X|LAYOUT_FILL_Y); mimetypes->setSortFunc(FXList::ascendingCase); mimetypes->setNumVisible(10); // Command FXGroupBox *commandgroup=new FXGroupBox(mimetypepane,tr("Command"),GROUPBOX_TITLE_LEFT|FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_SIDE_TOP); FXHorizontalFrame *commandset=new FXHorizontalFrame(commandgroup,LAYOUT_SIDE_TOP|LAYOUT_FILL_X); new FXButton(commandset,tr("\tBrowse..."),dir,this,ID_BROWSE_COMMAND,LAYOUT_RIGHT|LAYOUT_CENTER_Y|FRAME_RAISED|FRAME_THICK); command=new FXTextField(commandset,40,this,ID_COMMAND,LAYOUT_FILL_X|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK); runinterminal=new FXCheckButton(commandgroup,tr("Run in terminal"),NULL,0,ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT); changedirectory=new FXCheckButton(commandgroup,tr("Change directory"),NULL,0,ICON_BEFORE_TEXT|LAYOUT_SIDE_LEFT); runinterminal->disable(); changedirectory->disable(); //// Mime type settings button new FXButton(buttons,tr("Mime Types\tMime type setup\tChange mime types for files."),mim,switcher,FXSwitcher::ID_OPEN_FOURTH,FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y); // Bottom part new FXHorizontalSeparator(vertical,SEPARATOR_RIDGE|LAYOUT_FILL_X); FXHorizontalFrame *closebox=new FXHorizontalFrame(vertical,LAYOUT_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH); new FXButton(closebox,tr("&Accept"),NULL,this,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 20,20); new FXButton(closebox,tr("&Cancel"),NULL,this,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 20,20); } // Select command long Preferences::onCmdSelectExtension(FXObject*,FXSelector,void*){ return 1; } // Gray out things if no extension selected long Preferences::onUpdSelectExtension(FXObject* sender,FXSelector,void*){ sender->handle(this,(0<=extensions->getCurrentItem())?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Append new extension binding long Preferences::onCmdAppendExtension(FXObject*,FXSelector,void*){ return 1; } // Remove extension binding long Preferences::onCmdRemoveExtension(FXObject*,FXSelector,void*){ return 1; } // Change command long Preferences::onCmdCommand(FXObject*,FXSelector,void* ptr){ return 1; } // Change description long Preferences::onCmdDescription(FXObject*,FXSelector,void* ptr){ return 1; } // Change mime type long Preferences::onCmdMimeType(FXObject*,FXSelector,void* ptr){ return 1; } // Set icon path long Preferences::onCmdBrowseIcon(FXObject*,FXSelector sel,void*){ return 1; } // Select command long Preferences::onCmdBrowseCommand(FXObject*,FXSelector,void*){ return 1; } // Set browser editor long Preferences::onCmdBrowseEditor(FXObject*,FXSelector,void*){ FXString neweditor=editor->getText(); neweditor=FXFileDialog::getOpenFilename(this,tr("Editor Program"),neweditor); if(!neweditor.empty()) editor->setText(neweditor); return 1; } // Set terminal long Preferences::onCmdBrowseTerminal(FXObject*,FXSelector,void*){ FXString newterminal=terminal->getText(); newterminal=FXFileDialog::getOpenFilename(this,tr("Terminal Program"),newterminal); if(!newterminal.empty()) terminal->setText(newterminal); return 1; } // Clean up Preferences::~Preferences(){ delete pat; delete brw; delete icp; delete mim; delete dir; } fox1.6-1.6.57/pathfinder/Preferences.h000066400000000000000000000112341326741342000173740ustar00rootroot00000000000000/******************************************************************************** * * * P r e f e r e n c e s D i a l o g * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: Preferences.h,v 1.13 2006/01/22 17:58:15 fox Exp $ * ********************************************************************************/ #ifndef PREFERENCES_H #define PREFERENCES_H class PathFinderMain; // Preferences for PathFinder class Preferences : public FXDialogBox { FXDECLARE(Preferences) protected: FXText *pattern; FXTextField *editor; FXTextField *terminal; FXCheckButton *preview; FXCheckButton *blending; FXText *icondirs; FXList *extensions; FXComboBox *mimetypes; FXButton *bigopen; FXButton *bigclosed; FXButton *smallopen; FXButton *smallclosed; FXCheckButton *runinterminal; FXCheckButton *changedirectory; FXTextField *description; FXTextField *command; FXIcon *brw; FXIcon *pat; FXIcon *icp; FXIcon *mim; FXIcon *dir; private: Preferences(){} Preferences(const Preferences&); Preferences& operator=(const Preferences&); public: long onCmdBrowseEditor(FXObject*,FXSelector,void*); long onCmdBrowseTerminal(FXObject*,FXSelector,void*); long onCmdBrowseCommand(FXObject*,FXSelector,void*); long onCmdBrowseIcon(FXObject*,FXSelector,void*); long onCmdCommand(FXObject*,FXSelector,void*); long onCmdMimeType(FXObject*,FXSelector,void*); long onCmdDescription(FXObject*,FXSelector,void*); long onCmdAppendExtension(FXObject*,FXSelector,void*); long onCmdRemoveExtension(FXObject*,FXSelector,void*); long onCmdSelectExtension(FXObject*,FXSelector,void*); long onUpdSelectExtension(FXObject*,FXSelector,void*); public: enum{ ID_BROWSE_EDITOR=FXDialogBox::ID_LAST, ID_BROWSE_TERMINAL, ID_BROWSE_COMMAND, ID_COMMAND, ID_MIMETYPE, ID_DESCRIPTION, ID_BROWSE_BIGICON, ID_BROWSE_SMALLICON, ID_BROWSE_BIGICONOPEN, ID_BROWSE_SMALLICONOPEN, ID_SELECT_EXTENSION, ID_APPEND_EXTENSION, ID_REMOVE_EXTENSION }; public: // Create preferences dialog Preferences(PathFinderMain *owner); // Get/set filename patterns void setPatterns(const FXString& pat){ pattern->setText(pat); } FXString getPatterns() const { return pattern->getText(); } // Get/set text editor void setEditor(const FXString& edit){ editor->setText(edit); } FXString getEditor() const { return editor->getText(); } // Get/set terminal void setTerminal(const FXString& term){ terminal->setText(term); } FXString getTerminal() const { return terminal->getText(); } // Set image preview void setPreview(FXbool prev){ preview->setCheck(prev); } FXbool getPreview() const { return preview->getCheck(); } // Set image preview void setBlend(FXbool blend){ blending->setCheck(blend); } FXbool getBlend() const { return blending->getCheck(); } // Get/set icon path void setIconPath(const FXString& text){ icondirs->setText(text); } FXString getIconPath() const { return icondirs->getText(); } // Clean up virtual ~Preferences(); }; #endif fox1.6-1.6.57/pathfinder/PropertyDialog.cpp000066400000000000000000000217171326741342000204410ustar00rootroot00000000000000/******************************************************************************** * * * F i l e P r o p e r t i e s D i a l o g * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: PropertyDialog.cpp,v 1.24 2006/01/22 17:58:15 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fx.h" #include "PropertyDialog.h" #include "PathFinder.h" #include "icons.h" #include #include /* Notes: - Refer to RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type registry is at: ftp://ftp.iana.org/in-notes/iana/assignments/media-types/ */ /********************************** Preferences ******************************/ FXIMPLEMENT(PropertyDialog,FXDialogBox,NULL,0) // Create properties dialog PropertyDialog::PropertyDialog(FXWindow *owner): FXDialogBox(owner,"Properties",DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,0,0,0,0, 4,4,4,4, 4,4){ setTitle(tr("Properties")); // Close button FXHorizontalFrame *closebox=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH); new FXButton(closebox,tr("&OK"),NULL,this,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 20,20,5,5); new FXButton(closebox,tr("&Cancel"),NULL,this,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0, 20,20,5,5); // Separator new FXHorizontalSeparator(this,SEPARATOR_GROOVE|LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); FXTabBook* tabbook=new FXTabBook(this,NULL,0,LAYOUT_SIDE_TOP|TABBOOK_TOPTABS|LAYOUT_FILL_X|LAYOUT_FILL_Y); // ===== General Info ===== new FXTabItem(tabbook,tr("&General\tGeneral Information\tGeneral information about the item."),NULL,TAB_TOP|ICON_BEFORE_TEXT); FXVerticalFrame *generalFrame=new FXVerticalFrame(tabbook,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED|FRAME_THICK); FXGroupBox *namegroup=new FXGroupBox(generalFrame,tr("Description"),GROUPBOX_TITLE_LEFT|FRAME_GROOVE|LAYOUT_FILL_X); filename=new FXLabel(namegroup,FXString::null,NULL,LAYOUT_CENTER_Y|LAYOUT_SIDE_LEFT|ICON_BEFORE_TEXT|LAYOUT_FIX_HEIGHT,0,0,0,40); filename->setTarget(owner); filename->setSelector(PathFinderMain::ID_FILE_DESC); FXGroupBox *attrgroup=new FXGroupBox(generalFrame,tr("Attributes"),GROUPBOX_TITLE_LEFT|FRAME_GROOVE|LAYOUT_FILL_X); FXMatrix *attrmatrix=new FXMatrix(attrgroup,2,MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXLabel(attrmatrix,tr("Type:"),NULL,LAYOUT_RIGHT); filetype=new FXLabel(attrmatrix,FXString::null,NULL,LAYOUT_LEFT|LAYOUT_FILL_COLUMN); filetype->setTarget(owner); filetype->setSelector(PathFinderMain::ID_FILE_TYPE); new FXLabel(attrmatrix,tr("Location:"),NULL,LAYOUT_RIGHT); directory=new FXLabel(attrmatrix,FXString::null,NULL,LAYOUT_LEFT|LAYOUT_FILL_COLUMN); directory->setTarget(owner); directory->setSelector(PathFinderMain::ID_FILE_LOCATION); new FXLabel(attrmatrix,tr("Size:"),NULL,LAYOUT_RIGHT); filesize=new FXLabel(attrmatrix,FXString::null,NULL,LAYOUT_LEFT|LAYOUT_FILL_COLUMN); filesize->setTarget(owner); filesize->setSelector(PathFinderMain::ID_FILE_SIZE); FXGroupBox *timegroup=new FXGroupBox(generalFrame,tr("File Time"),GROUPBOX_TITLE_LEFT|FRAME_GROOVE|LAYOUT_FILL_X); FXMatrix *timematrix=new FXMatrix(timegroup,2,MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXLabel(timematrix,tr("Created:"),NULL,LAYOUT_RIGHT); createtime=new FXLabel(timematrix,FXString::null,NULL,LAYOUT_LEFT|LAYOUT_FILL_COLUMN); createtime->setTarget(owner); createtime->setSelector(PathFinderMain::ID_FILE_CREATED); new FXLabel(timematrix,tr("Modified:"),NULL,LAYOUT_RIGHT); modifytime=new FXLabel(timematrix,FXString::null,NULL,LAYOUT_LEFT|LAYOUT_FILL_COLUMN); modifytime->setTarget(owner); modifytime->setSelector(PathFinderMain::ID_FILE_MODIFIED); new FXLabel(timematrix,tr("Accessed:"),NULL,LAYOUT_RIGHT); accesstime=new FXLabel(timematrix,FXString::null,NULL,LAYOUT_LEFT|LAYOUT_FILL_COLUMN); accesstime->setTarget(owner); accesstime->setSelector(PathFinderMain::ID_FILE_ACCESSED); // ===== Permissions ===== new FXTabItem(tabbook,tr("&Permissions\tAccess Permissions\tAccess permissions for this item."),NULL,TAB_TOP|ICON_BEFORE_TEXT); FXVerticalFrame *permFrame=new FXVerticalFrame(tabbook,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED|FRAME_THICK); FXGroupBox *accessgroup=new FXGroupBox(permFrame,tr("Access Permissions"),GROUPBOX_TITLE_LEFT|FRAME_GROOVE|LAYOUT_FILL_X); FXMatrix *accessmatrix=new FXMatrix(accessgroup,6,MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXFrame(accessmatrix,LAYOUT_FILL_COLUMN); new FXLabel(accessmatrix,tr("Read"),NULL,LAYOUT_CENTER_X); new FXLabel(accessmatrix,tr("Write"),NULL,LAYOUT_CENTER_X); new FXLabel(accessmatrix,tr("Exec"),NULL,LAYOUT_CENTER_X); new FXFrame(accessmatrix,LAYOUT_FILL_COLUMN); new FXLabel(accessmatrix,tr("Special"),NULL,LAYOUT_CENTER_X); new FXLabel(accessmatrix,tr("&User"),NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_RUSR,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_WUSR,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_XUSR,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXLabel(accessmatrix,tr("Set UID"),NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_SUID,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXLabel(accessmatrix,tr("&Group"),NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_RGRP,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_WGRP,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_XGRP,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXLabel(accessmatrix,tr("Set GID"),NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_SGID,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXLabel(accessmatrix,tr("&Other"),NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_ROTH,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_WOTH,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_XOTH,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); new FXLabel(accessmatrix,tr("Sticky"),NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); new FXCheckButton(accessmatrix,FXString::null,owner,PathFinderMain::ID_SVTX,LAYOUT_CENTER_X|LAYOUT_CENTER_Y); FXGroupBox *ownergroup=new FXGroupBox(permFrame,tr("Ownership"),GROUPBOX_TITLE_LEFT|FRAME_GROOVE|LAYOUT_FILL_X); FXMatrix *ownermatrix=new FXMatrix(ownergroup,2,MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXLabel(ownermatrix,tr("O&wner"),NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); fileowner=new FXTextField(ownermatrix,20,owner,PathFinderMain::ID_OWNER,LAYOUT_FILL_X|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|FRAME_SUNKEN|FRAME_THICK); new FXLabel(ownermatrix,tr("Grou&p"),NULL,LAYOUT_RIGHT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); filegroup=new FXTextField(ownermatrix,20,owner,PathFinderMain::ID_GROUP,LAYOUT_FILL_X|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|FRAME_SUNKEN|FRAME_THICK); } // Destroy PropertyDialog::~PropertyDialog(){ } fox1.6-1.6.57/pathfinder/PropertyDialog.h000066400000000000000000000046201326741342000201000ustar00rootroot00000000000000/******************************************************************************** * * * F i l e P r o p e r t i e s D i a l o g * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: PropertyDialog.h,v 1.15 2006/01/22 17:58:15 fox Exp $ * ********************************************************************************/ #ifndef PROPERTYDIALOG_H #define PROPERTYDIALOG_H // Property dialog class PropertyDialog : public FXDialogBox { FXDECLARE(PropertyDialog) protected: FXLabel *filename; FXLabel *filetype; FXLabel *filesize; FXLabel *directory; FXLabel *createtime; FXLabel *modifytime; FXLabel *accesstime; FXTextField *fileowner; FXTextField *filegroup; private: PropertyDialog(){} PropertyDialog(const PropertyDialog&); public: PropertyDialog(FXWindow *owner); virtual ~PropertyDialog(); }; #endif fox1.6-1.6.57/pathfinder/bigicons.bmp000066400000000000000000000003061326741342000172550ustar00rootroot00000000000000BMĆF(€m m ÜŔ˛˙˙˙330!!330!!fox1.6-1.6.57/pathfinder/closepanel.gif000066400000000000000000000001011326741342000175650ustar00rootroot00000000000000GIF87a€˛ŔÜ, „Ź©Ë­\0šĘ0nu:°9ť•Mˇä)˛Şß ÇňQ;fox1.6-1.6.57/pathfinder/clrbook.gif000066400000000000000000000001661326741342000171060ustar00rootroot00000000000000GIF87aň˛ŔÜŃŠŠ˙˙€ Śh,Cş!,.Ą ŠĘ%îcÔiJ(zĄiÎ@jöÉoÜĚn@6îîžJ1 ‚Áš˘¸8&•%ĐÖ” ~*ŰÂpÝx# ;fox1.6-1.6.57/pathfinder/copy.bmp000066400000000000000000000003061326741342000164320ustar00rootroot00000000000000BMĆF(€m m ÜŔ˛˙˙˙333302"""0202"""0""202"""0""2#302"##""2"#0!333"!!"!fox1.6-1.6.57/pathfinder/copyit.gif000066400000000000000000000001371326741342000167600ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙˙˙˙Ë,8„Ź Á­„ě™8c°şW…MŇRĚŘ|‹8îđyíŔ+[3pĘë/ýČĄl °Č#&jF%¤Ç(;fox1.6-1.6.57/pathfinder/cut.bmp000066400000000000000000000003021326741342000162470ustar00rootroot00000000000000BMÂB(€m m ÜŔ˛ "   " "fox1.6-1.6.57/pathfinder/deleteit.bmp000066400000000000000000000001761326741342000172640ustar00rootroot00000000000000BM~>(@m m ÜŔ˛„ px80`Ŕ€Ŕ`<0xpfox1.6-1.6.57/pathfinder/desktop.bmp000066400000000000000000000003321326741342000171300ustar00rootroot00000000000000BMÚZ(€m m ÜŔ˛„†˙˙˙˙˙„†„ĆÇƆ„˙˙UUUUUUU S333335 V""&""%Re3&x‚Re32g‡rbVS2gvfbUUUUURR """  2   fox1.6-1.6.57/pathfinder/details.bmp000066400000000000000000000003021326741342000171010ustar00rootroot00000000000000BMÂB(€m m ÜŔ˛     """"""""fox1.6-1.6.57/pathfinder/dirup.bmp000066400000000000000000000003061326741342000166030ustar00rootroot00000000000000BMĆF(€m m ÜŔ˛˙˙˙˙˙######222222#!#212222#!####1222####212222########!fox1.6-1.6.57/pathfinder/enter.gif000066400000000000000000000001201326741342000165560ustar00rootroot00000000000000GIF87aˇ˙˙˙˙˙,)„Ź©Ëíb|AŘ 0´BCTRIç‰Ü:†ěŰm0JvćťL´÷ţQ;fox1.6-1.6.57/pathfinder/file_gif.gif000066400000000000000000000005061326741342000172150ustar00rootroot00000000000000GIF87a ă˛ŔÜť ëČס˙ܨ‡„Ŕ˙¨XŠ|¤¤€Ŕ€€€, ű„I«Ą ë­ŕ'ă8q¨'|d[şä‰fęĘÂŻ̵}ňůH‚ai)8 ;NďT”LŠ3ş™ÚbVl`xéżUÂU=^†DÉyfłî<›6MěWxzKW|s1UaW;^tI6Ťpp}1>Hs~śT‰™ˇšI‹¤¦"’+*«‡­łŻ± ©g1HÁÂĂÁĽFľł“Śr¶c}Ş\fÎÄÖŇE¶¨ŚłŮ˝­–dIŢÇ·}ăR¬ĎŰ+čÓ†ßĎ 5´ŘR Îźgď)¤ĺţYvĎ_04Ű.t›ACŕ>h 6T0°"&‰R–-›;fox1.6-1.6.57/pathfinder/foxbig.gif000066400000000000000000000003201326741342000167210ustar00rootroot00000000000000GIF87a Â˙˙˙ŽŽŽIIU$$$$U, ťşÜţ0ĘIk BuÄÔeŰ( Ť)•3L4[+'H2ꔇp˘”¨˘§¨›©®©«rŤž´®ŁT“ąş»Ľ ;fox1.6-1.6.57/pathfinder/foxmini.gif000066400000000000000000000001501326741342000171150ustar00rootroot00000000000000GIF87aÂ˙˙˙‡‡‡,5şÜţ0ľ €Ś®0DĄ^`ŽŠ·Ť*’Ö.ď •‹lľ¨ML— ‰RÁKQÂl: ;fox1.6-1.6.57/pathfinder/goback.bmp000066400000000000000000000003061326741342000167060ustar00rootroot00000000000000BMĆF(€m m ÜŔ˛ľľľ˙ !  !1 1 !31 31 !331 331 331 31 31 1 1  fox1.6-1.6.57/pathfinder/goforw.bmp000066400000000000000000000003061326741342000167630ustar00rootroot00000000000000BMĆF(€m m ÜŔ˛ľľľ˙ 1 331 33331 333331 3331 31  fox1.6-1.6.57/pathfinder/gotodir.bmp000066400000000000000000000011221326741342000171240ustar00rootroot00000000000000BMRR( m m ÜŔ˛€€€˙˙˙˙˙ŔŔŔ˙€€fffffffffffCCCCCCCCCCF44444444446CCCCCCCCCCF44444444446CCCCCCCCCCF44444444446PCCCCCCCCCCFU44444444446UPCCCCCCCCCCFUU44444444446UUUURCCCCCCCCCCFUUUUU44444444446UUUURCCCCCCCCCCFUU44444444446UP"""""""""""UDDDDDDP#CCCCA4444fox1.6-1.6.57/pathfinder/home.gif000066400000000000000000000001561326741342000164020ustar00rootroot00000000000000GIF87a²ŔÜ„˙˙˙˙˙,;şÜ®!(!cHjqÔśă„W1#YjMŞ®§űÂK0ĎçĄFŃŽî)'\i|5ŕqř‘žTj©;fox1.6-1.6.57/pathfinder/hosts.bmp000066400000000000000000000006061326741342000166230ustar00rootroot00000000000000BM††(m m ŢßŢĆÇĆsqsÜŔ˛Îa1˙a1śa1µ¶µcacZYZÎĎΔ–”Ą¦Ą„†„c˙11011˙˙ž˙aÎA„                        fox1.6-1.6.57/pathfinder/iconpath.gif000066400000000000000000000005641326741342000172620ustar00rootroot00000000000000GIF87a ă˛ŔÜźź˙˙˙˙˙ź˙˙đĎĎ`˙Ďź€€€€€ŔŔŔ˙˙00€€˙€, ţH޵3ëť`\©yb:fŞĘ¶]aßx~í»ä Ŕ pH,ú>"áŔ< ‰”4Ą $•©XtťĂ´: Ź ÔV!X´ŰŠF8I%ŁŐK¶{ߍ?Ë!dewHKo@^‰ O‚€giH]AЉrbŽW {@}ŠrQVeŹj’nˇˇ—€Ż€„ťź•}ŁcuT˛©pµ ®š¦›x˝ż—JĂJ§… ¬–ŁĄUË»eÎĐ —Éݸ˛ÔÚäâ LÜËcŐśIâđ’«ÜuÝ»¸¦ęň őÝęjDŤ˝ţŞSbM_Á2 ügOÝŔLEś¨đTŽŹ*lLČ  RŞ\É2Ą„‘˙XŇ ÓÁĚ›/%úÉsŁMž@ •;fox1.6-1.6.57/pathfinder/icons.cpp000066400000000000000000001265551326741342000166160ustar00rootroot00000000000000/* Generated by reswrap version 4.0.0 */ /* created by reswrap from file bigicons.bmp */ extern const unsigned char bigicons[]={ 0x42,0x4d,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x7f,0x00,0x00,0x00,0xff,0xff, 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0x33,0x33,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x21,0x00,0x00,0x00, 0x00,0x00,0x00,0x12,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x11,0x00,0x03,0x33, 0x33,0x30,0x00,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11, 0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x12, 0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x11, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00 }; /* created by reswrap from file closepanel.gif */ extern const unsigned char closepanel[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0x80,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x02,0x20,0x84, 0x8f,0xa9,0xcb,0xad,0x11,0x12,0x5c,0x30,0x9a,0xca,0x30,0x6e,0x75,0x3a,0xb0,0x39, 0x9d,0x95,0x4d,0xa1,0xe4,0x81,0x29,0xb2,0xaa,0xdf,0x0b,0xc7,0xf2,0x51,0x00,0x00, 0x3b }; /* created by reswrap from file clrbook.gif */ extern const unsigned char clrbook[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xf2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0xd1,0x8a,0x8a,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x80,0xa0, 0x8c,0x68,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x43,0x08,0xba,0x10,0x21,0x2c,0x2e,0x07,0xa5,0x0b,0x8a,0xca,0x25,0xee,0x63,0x83, 0xd4,0x69,0x4a,0x28,0x7a,0xa5,0x19,0x69,0xce,0x40,0x10,0x6a,0xf6,0xc9,0x6f,0xdc, 0xcc,0x6e,0x40,0x14,0x36,0xee,0xee,0x05,0x9e,0x4a,0x00,0x31,0x0d,0x82,0xc1,0x9a, 0xa2,0xb8,0x38,0x26,0x95,0x25,0xd0,0x13,0xd6,0x94,0x0c,0x7e,0x2a,0xdb,0xc2,0x70, 0xdd,0x78,0x23,0x09,0x00,0x3b }; /* created by reswrap from file copy.bmp */ extern const unsigned char copy[]={ 0x42,0x4d,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x00,0x00,0x00,0x00,0xff,0xff, 0xff,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x33,0x33,0x33,0x30,0x00,0x00, 0x00,0x32,0x22,0x22,0x22,0x30,0x00,0x00,0x00,0x32,0x11,0x11,0x12,0x30,0x11,0x11, 0x11,0x32,0x22,0x22,0x22,0x30,0x12,0x22,0x22,0x32,0x11,0x11,0x12,0x30,0x12,0x11, 0x11,0x32,0x22,0x22,0x22,0x30,0x12,0x22,0x22,0x32,0x11,0x23,0x33,0x30,0x12,0x11, 0x11,0x32,0x22,0x23,0x23,0x00,0x12,0x22,0x22,0x32,0x22,0x23,0x30,0x00,0x12,0x11, 0x21,0x33,0x33,0x33,0x00,0x00,0x12,0x22,0x21,0x21,0x00,0x00,0x00,0x00,0x12,0x22, 0x21,0x10,0x00,0x00,0x00,0x00,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00 }; /* created by reswrap from file copyit.gif */ extern const unsigned char copyit[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xcb,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x38,0x84,0x8f,0x09,0xc1,0xad,0x18,0x84,0x14,0xec,0x99,0x38, 0x63,0xb0,0xba,0x57,0x85,0x4d,0xd2,0x06,0x52,0xcc,0xd8,0x7c,0x8b,0x38,0x0e,0xee, 0xf0,0x79,0xed,0x1b,0xc0,0x2b,0x5b,0x33,0x70,0xca,0xeb,0x2f,0xfd,0xc8,0xa5,0x6c, 0xa0,0x1f,0xb0,0xc8,0x23,0x26,0x6a,0x46,0x25,0xa4,0xc7,0x28,0x00,0x00,0x3b }; /* created by reswrap from file cut.bmp */ extern const unsigned char cut[]={ 0x42,0x4d,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x00,0x00,0x00,0x00,0x7f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x02,0x00,0x22,0x00,0x00,0x00,0x00,0x20,0x02,0x02,0x00,0x20, 0x00,0x00,0x00,0x20,0x02,0x02,0x00,0x20,0x00,0x00,0x00,0x02,0x22,0x02,0x00,0x20, 0x00,0x00,0x00,0x00,0x02,0x02,0x22,0x00,0x00,0x00,0x00,0x00,0x02,0x12,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x01,0x10,0x00, 0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00, 0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00 }; /* created by reswrap from file deleteit.bmp */ extern const unsigned char deleteit[]={ 0x42,0x4d,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x40,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x02,0x00, 0x00,0x00,0x02,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x00,0x00,0x84,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x04,0x00,0x00,0x70,0x00,0x00,0x00,0x78,0x08, 0x00,0x00,0x38,0x10,0x00,0x00,0x1c,0x30,0x00,0x00,0x0e,0x60,0x00,0x00,0x07,0xc0, 0x00,0x00,0x03,0x80,0x00,0x00,0x07,0xc0,0x00,0x00,0x0e,0x60,0x00,0x00,0x3c,0x30, 0x00,0x00,0x78,0x18,0x00,0x00,0x70,0x04,0x00,0x00,0x00,0x00,0x00,0x00 }; /* created by reswrap from file desktop.bmp */ extern const unsigned char desktop[]={ 0x42,0x4d,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x09,0x00, 0x00,0x00,0x09,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x84,0x86,0x00,0x00,0x00,0x00, 0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0x00,0x00,0x84,0x86,0x84,0x00,0xc6,0xc7, 0xc6,0x00,0x00,0x86,0x84,0x00,0x00,0xff,0xff,0x00,0x55,0x55,0x55,0x55,0x55,0x55, 0x55,0x20,0x53,0x33,0x33,0x33,0x33,0x33,0x35,0x20,0x56,0x22,0x22,0x26,0x22,0x22, 0x25,0x52,0x05,0x65,0x33,0x26,0x78,0x88,0x82,0x52,0x05,0x65,0x33,0x32,0x67,0x87, 0x72,0x62,0x00,0x56,0x53,0x32,0x67,0x76,0x66,0x62,0x00,0x55,0x55,0x55,0x55,0x55, 0x52,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x22,0x22,0x22, 0x00,0x02,0x00,0x00,0x00,0x14,0x11,0x20,0x02,0x20,0x00,0x00,0x00,0x01,0x12,0x32, 0x20,0x00,0x00,0x00,0x00,0x01,0x12,0x20,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; /* created by reswrap from file details.bmp */ extern const unsigned char details[]={ 0x42,0x4d,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x00,0x00,0x00,0x00,0x7f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x01,0x11,0x10,0x11,0x10,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x01,0x11,0x10,0x11,0x10,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x01,0x11,0x10,0x11,0x10,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x01,0x11,0x10,0x11,0x10,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x01,0x11,0x10,0x11,0x10,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x11,0x10,0x11,0x10,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00 }; /* created by reswrap from file dirup.bmp */ extern const unsigned char dirup[]={ 0x42,0x4d,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0xff, 0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x13,0x23, 0x23,0x23,0x23,0x23,0x23,0x10,0x12,0x32,0x32,0x32,0x32,0x32,0x32,0x10,0x13,0x23, 0x21,0x11,0x11,0x13,0x23,0x10,0x12,0x32,0x31,0x32,0x32,0x32,0x32,0x10,0x13,0x23, 0x21,0x23,0x23,0x23,0x23,0x10,0x12,0x31,0x11,0x11,0x32,0x32,0x32,0x10,0x13,0x23, 0x11,0x13,0x23,0x23,0x23,0x10,0x12,0x32,0x31,0x32,0x32,0x32,0x32,0x10,0x13,0x23, 0x23,0x23,0x23,0x23,0x23,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x01,0x23, 0x23,0x21,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00 }; /* created by reswrap from file enter.gif */ extern const unsigned char enter[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0x00,0xff,0xff, 0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x29,0x84,0x8f,0xa9,0xcb,0xed,0x17,0x62,0x7c,0x41,0xd8,0xa0, 0x30,0xb4,0x42,0x43,0x0f,0x54,0x17,0x52,0x49,0x12,0xe7,0x89,0xdc,0x3a,0x86,0xec, 0xdb,0x6d,0x30,0x4a,0x76,0xe6,0x9d,0x4c,0x0f,0xb4,0xf7,0xfe,0x51,0x00,0x00,0x3b }; /* created by reswrap from file file_gif.gif */ extern const unsigned char file_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x20,0x00,0x20,0x00,0xe3,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x9d,0xa0,0xeb,0xc8,0xd7,0xa1,0xff,0xdc,0xa8,0x87,0x84,0xc0,0xff, 0xa8,0x58,0x8a,0x7c,0xa4,0x81,0x7f,0xa4,0x80,0x83,0xc0,0x80,0x80,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x04,0xfb,0x10,0x84,0x49,0xab,0xa5,0x20,0xeb, 0xad,0x83,0x18,0xe0,0x27,0x0e,0xe3,0x38,0x71,0xa8,0x27,0x7c,0x64,0x5b,0xba,0xe4, 0x89,0x66,0xea,0xca,0xc2,0xaf,0x19,0xcc,0xb5,0x7d,0x83,0x16,0x90,0x10,0x98,0xf2, 0xf9,0x48,0x82,0x00,0x61,0x69,0x29,0x38,0x0b,0x3b,0x4e,0xef,0x98,0x54,0x1a,0x94, 0x4c,0x8a,0x33,0xba,0x99,0xda,0x62,0x56,0x6c,0x60,0x78,0xe9,0x18,0xbf,0x55,0xc2, 0x55,0x3d,0x5e,0x12,0x86,0x44,0xc9,0x79,0x05,0x66,0xb3,0x07,0xee,0x3c,0x9b,0x36, 0x17,0x4d,0xec,0x57,0x78,0x7a,0x4b,0x57,0x7c,0x73,0x31,0x55,0x61,0x03,0x17,0x13, 0x57,0x3b,0x5e,0x74,0x49,0x36,0x8d,0x13,0x70,0x70,0x07,0x13,0x7d,0x31,0x08,0x3e, 0x14,0x48,0x73,0x98,0x90,0x7e,0x01,0x07,0x9c,0x54,0x89,0x99,0x02,0xa1,0x9a,0x49, 0x8b,0xa4,0xa6,0x22,0x92,0x2b,0x2a,0xab,0x87,0xad,0xb3,0xaf,0xb1,0xa0,0xa9,0x67, 0x31,0x48,0x15,0x07,0xc1,0xc2,0xc3,0xc1,0xbc,0x46,0xbe,0xb3,0x93,0x8c,0x15,0x72, 0xb6,0x63,0x7d,0xaa,0x1e,0x5c,0x66,0xce,0xc4,0xd6,0xd2,0x45,0xb6,0xa8,0x8c,0xb3, 0xd9,0xbd,0xad,0x96,0x64,0x49,0xde,0xc7,0xb7,0x7d,0x98,0xe3,0x52,0xac,0xcf,0xdb, 0x2b,0xe8,0xd3,0x86,0xdf,0xcf,0x09,0x35,0xb4,0xd8,0x52,0x0a,0xce,0x9f,0x67,0xef, 0x29,0xa4,0x07,0xe5,0xfe,0x59,0x13,0x76,0xcf,0x5f,0x30,0x34,0xdb,0x2e,0x74,0x9b, 0x41,0x43,0xe0,0x3e,0x68,0x0b,0x19,0x36,0x54,0x30,0xb0,0x22,0x26,0x89,0x52,0x96, 0x2d,0x9b,0x11,0x01,0x00,0x3b }; /* created by reswrap from file foxbig.gif */ extern const unsigned char foxbig[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x20,0x00,0x20,0x00,0xc2,0x00,0x00,0xff,0xff,0xff, 0x8e,0x8e,0x8e,0x00,0x00,0x00,0x49,0x49,0x55,0x24,0x24,0x00,0x24,0x24,0x55,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x03, 0x9d,0x08,0xba,0xdc,0xfe,0x30,0xca,0x49,0x6b,0x0d,0x42,0x04,0x90,0x75,0xc4,0x19, 0xd4,0x65,0xdb,0x28,0x0c,0x8d,0x29,0x3c,0x6a,0xa9,0x2e,0xea,0xda,0x10,0xdd,0xe6, 0x80,0xe1,0x68,0xdf,0xdd,0x14,0x4b,0x3d,0x8a,0x49,0x02,0xda,0xc1,0x42,0x0b,0x9c, 0xd1,0x51,0x4b,0x8d,0x18,0xc1,0xc8,0x8b,0x63,0x22,0x1c,0x65,0xd2,0x21,0x55,0xbb, 0xf5,0x69,0x7f,0x8a,0xa8,0x08,0x09,0x7d,0x2a,0x94,0x40,0x72,0x19,0x0b,0x28,0x74, 0xac,0x59,0xf6,0xc7,0xb4,0x5c,0x53,0x94,0x4d,0x96,0x9a,0xd7,0xc4,0x11,0xea,0x62, 0x6b,0x79,0x00,0x38,0x62,0x81,0x57,0x1e,0x7c,0x6a,0x87,0x61,0x24,0x73,0x7b,0x16, 0x91,0x92,0x1c,0x61,0x30,0x12,0x70,0x3e,0x95,0x33,0x4c,0x34,0x5b,0x2b,0x27,0x48, 0x32,0x9f,0x94,0x87,0x70,0xa2,0x94,0xa8,0xa2,0xa7,0xa8,0x9b,0xa9,0xae,0xa9,0xab, 0x72,0x8d,0x9e,0xb4,0xae,0xa3,0x54,0x93,0xb9,0xba,0xbb,0xbc,0x0c,0x09,0x00,0x3b }; /* created by reswrap from file foxmini.gif */ extern const unsigned char foxmini[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xff,0xff,0xff, 0x87,0x87,0x87,0x00,0x00,0x00,0x12,0x12,0x12,0x06,0x06,0x06,0x17,0x17,0x17,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x35,0x08,0xba,0xdc,0xfe,0x30,0xbe,0x20,0x80,0x08,0x8c,0xae,0x30,0x44,0xa5,0x5e, 0x88,0x01,0x60,0x03,0x8e,0x8a,0xb7,0x8d,0x2a,0x13,0x92,0x1e,0xd6,0x2e,0xef,0x09, 0x10,0x95,0x8b,0x06,0x6c,0xbe,0x14,0xa8,0x4d,0x4c,0x97,0x09,0x89,0x52,0xc1,0x4b, 0x51,0xc2,0x6c,0x3a,0x17,0x09,0x00,0x3b }; /* created by reswrap from file goback.bmp */ extern const unsigned char goback[]={ 0x42,0x4d,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe, 0xbe,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x21,0x20,0x00,0x00,0x00,0x00,0x00,0x02,0x11,0x20,0x00,0x00,0x00,0x00, 0x00,0x21,0x31,0x20,0x00,0x00,0x00,0x00,0x02,0x13,0x31,0x20,0x00,0x00,0x00,0x00, 0x21,0x33,0x31,0x20,0x00,0x00,0x00,0x02,0x13,0x33,0x31,0x20,0x00,0x00,0x00,0x21, 0x33,0x33,0x31,0x20,0x00,0x00,0x00,0x13,0x33,0x33,0x31,0x20,0x00,0x00,0x00,0x01, 0x33,0x33,0x31,0x20,0x00,0x00,0x00,0x00,0x13,0x33,0x31,0x20,0x00,0x00,0x00,0x00, 0x01,0x33,0x31,0x20,0x00,0x00,0x00,0x00,0x00,0x13,0x31,0x20,0x00,0x00,0x00,0x00, 0x00,0x01,0x31,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00,0x00,0x00 }; /* created by reswrap from file goforw.bmp */ extern const unsigned char goforw[]={ 0x42,0x4d,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x00,0x00,0x00,0x00,0xbe,0xbe, 0xbe,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x12,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x31,0x20,0x00,0x00,0x00,0x00,0x00,0x01,0x33,0x12,0x00,0x00,0x00,0x00,0x00, 0x01,0x33,0x31,0x20,0x00,0x00,0x00,0x00,0x01,0x33,0x33,0x12,0x00,0x00,0x00,0x00, 0x01,0x33,0x33,0x31,0x20,0x00,0x00,0x00,0x01,0x33,0x33,0x33,0x12,0x00,0x00,0x00, 0x01,0x33,0x33,0x31,0x20,0x00,0x00,0x00,0x01,0x33,0x33,0x12,0x00,0x00,0x00,0x00, 0x01,0x33,0x31,0x20,0x00,0x00,0x00,0x00,0x01,0x33,0x12,0x00,0x00,0x00,0x00,0x00, 0x01,0x31,0x20,0x00,0x00,0x00,0x00,0x00,0x01,0x12,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,0x20,0x00,0x00,0x00,0x00 }; /* created by reswrap from file gotodir.bmp */ extern const unsigned char gotodir[]={ 0x42,0x4d,0x52,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x07,0x00, 0x00,0x00,0x07,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x80,0x80,0x80,0x00,0xff,0xff, 0xff,0x00,0x00,0xff,0xff,0x00,0xc0,0xc0,0xc0,0x00,0x00,0x00,0xff,0x00,0x00,0x80, 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, 0x66,0x66,0x00,0x00,0x00,0x00,0x12,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43, 0x43,0x46,0x00,0x00,0x00,0x00,0x12,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34, 0x34,0x36,0x00,0x00,0x00,0x00,0x12,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43, 0x43,0x46,0x00,0x00,0x00,0x00,0x12,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34, 0x34,0x36,0x00,0x00,0x00,0x00,0x12,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43, 0x43,0x46,0x00,0x00,0x00,0x00,0x12,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34, 0x34,0x36,0x00,0x00,0x50,0x00,0x12,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43, 0x43,0x46,0x00,0x00,0x55,0x00,0x12,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34, 0x34,0x36,0x00,0x00,0x55,0x50,0x12,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43, 0x43,0x46,0x00,0x00,0x55,0x55,0x12,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34, 0x34,0x36,0x55,0x55,0x55,0x55,0x52,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43, 0x43,0x46,0x55,0x55,0x55,0x55,0x55,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34, 0x34,0x36,0x55,0x55,0x55,0x55,0x52,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43, 0x43,0x46,0x00,0x00,0x55,0x55,0x12,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34, 0x34,0x36,0x00,0x00,0x55,0x50,0x12,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, 0x22,0x22,0x00,0x00,0x55,0x00,0x14,0x44,0x44,0x44,0x44,0x44,0x44,0x11,0x11,0x11, 0x11,0x10,0x00,0x00,0x50,0x00,0x01,0x23,0x43,0x43,0x43,0x43,0x41,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x34,0x34,0x34,0x34,0x10,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00 }; /* created by reswrap from file home.gif */ extern const unsigned char home[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x84,0x00,0x00,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x3b,0x08,0xba,0xdc,0xae,0x21,0x28,0x21,0x1f,0x08,0x63,0x48,0x6a,0x71,0xd4,0x9c, 0xe3,0x11,0x84,0x57,0x31,0x23,0x59,0x6a,0x4d,0xaa,0xae,0xa7,0xfb,0xc2,0x4b,0x30, 0xcf,0xe7,0xa5,0x46,0xd1,0x8e,0xee,0x19,0x1b,0x29,0x27,0x5c,0x69,0x7c,0x35,0xe0, 0x71,0xf8,0x1b,0x06,0x91,0x10,0x9e,0x54,0x6a,0xa9,0x02,0x12,0x00,0x3b }; /* created by reswrap from file hosts.bmp */ extern const unsigned char hosts[]={ 0x42,0x4d,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x14,0x00, 0x00,0x00,0x14,0x00,0x00,0x00,0xde,0xdf,0xde,0x00,0xc6,0xc7,0xc6,0x00,0x73,0x71, 0x73,0x00,0xdc,0xc0,0xb2,0x00,0xce,0x61,0x31,0x00,0xff,0x61,0x31,0x00,0x9c,0x61, 0x31,0x00,0xb5,0xb6,0xb5,0x00,0x63,0x61,0x63,0x00,0x5a,0x59,0x5a,0x00,0xce,0xcf, 0xce,0x00,0x94,0x96,0x94,0x00,0xa5,0xa6,0xa5,0x00,0x84,0x86,0x84,0x00,0x63,0xff, 0x31,0x00,0x31,0x30,0x31,0x00,0x31,0xff,0xff,0x00,0x00,0x9e,0xff,0x00,0x00,0x61, 0xce,0x00,0x00,0x41,0x84,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x08,0x03,0x09,0x09,0x09,0x12,0x13,0x0f,0x0c,0x0c,0x0c,0x0c, 0x0c,0x0b,0x0b,0x0b,0x09,0x08,0x0c,0x00,0x00,0x10,0x11,0x00,0x01,0x0e,0x01,0x01, 0x01,0x02,0x02,0x02,0x09,0x09,0x03,0x03,0x03,0x00,0x0f,0x03,0x07,0x00,0x00,0x07, 0x0d,0x02,0x0d,0x0d,0x0d,0x09,0x03,0x03,0x03,0x07,0x0f,0x03,0x03,0x03,0x03,0x01, 0x0b,0x08,0x03,0x03,0x03,0x03,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x01,0x01,0x07, 0x0b,0x0b,0x0b,0x0b,0x08,0x03,0x00,0x0e,0x07,0x07,0x0b,0x0d,0x00,0x05,0x05,0x04, 0x06,0x06,0x06,0x0c,0x08,0x03,0x07,0x00,0x07,0x0d,0x02,0x08,0x00,0x04,0x05,0x04, 0x04,0x06,0x06,0x0c,0x08,0x09,0x03,0x03,0x0a,0x0b,0x08,0x03,0x00,0x05,0x05,0x04, 0x06,0x06,0x06,0x0c,0x08,0x09,0x00,0x01,0x01,0x07,0x07,0x0b,0x00,0x05,0x05,0x04, 0x06,0x06,0x06,0x0c,0x08,0x09,0x00,0x04,0x05,0x06,0x04,0x06,0x00,0x04,0x05,0x05, 0x04,0x06,0x06,0x0b,0x08,0x02,0x00,0x05,0x04,0x05,0x06,0x06,0x00,0x00,0x0a,0x0a, 0x0a,0x01,0x01,0x01,0x02,0x03,0x00,0x04,0x05,0x04,0x06,0x06,0x06,0x07,0x08,0x09, 0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x05,0x05,0x04,0x04,0x06,0x06,0x07,0x08,0x09, 0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x04,0x05,0x05,0x04,0x06,0x06,0x07,0x08,0x02, 0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x03, 0x03,0x03,0x03,0x03,0x03,0x03 }; /* created by reswrap from file iconpath.gif */ extern const unsigned char iconpath[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x20,0x00,0x20,0x00,0xe3,0x00,0x00,0xb2,0xc0,0xdc, 0x9f,0x9f,0x00,0xff,0xff,0xff,0xff,0xff,0x9f,0xff,0xff,0xf0,0xcf,0xcf,0x60,0xff, 0xcf,0x9f,0x80,0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0xc0,0xc0,0xc0,0x00,0xff, 0xff,0x30,0x30,0x00,0x00,0x80,0x80,0x00,0x00,0xff,0x00,0x00,0x80,0x2c,0x00,0x00, 0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x04,0xfe,0x10,0x48,0x10,0xaa,0xb5,0x33,0xeb, 0x9d,0x83,0x18,0x60,0x08,0x06,0x5c,0xa9,0x79,0x62,0x3a,0x90,0x66,0x19,0x10,0xaa, 0xca,0xb6,0x5d,0x61,0xdf,0x78,0x7e,0xed,0xbb,0xe4,0x09,0xc0,0xa0,0x70,0x48,0x2c, 0xfa,0x3e,0x22,0x83,0xe1,0xc0,0x3c,0x20,0x12,0x89,0x94,0x01,0x34,0xa5,0x0e,0x0a, 0x14,0x24,0x95,0xa9,0x58,0x74,0x9d,0x88,0xc3,0xb4,0x3a,0x20,0x8f,0x0b,0x0c,0xd4, 0x56,0x21,0x58,0xb4,0xdb,0x8a,0x46,0x38,0x49,0x25,0xa3,0xd5,0x4b,0xb6,0x7b,0xdf, 0x8d,0x3f,0xcb,0x21,0x64,0x65,0x77,0x48,0x4b,0x6f,0x40,0x5e,0x89,0x0a,0x4f,0x82, 0x80,0x67,0x69,0x48,0x07,0x5d,0x41,0x8a,0x89,0x72,0x62,0x8e,0x81,0x57,0x90,0x20, 0x07,0x7b,0x40,0x7d,0x8a,0x72,0x51,0x56,0x65,0x8f,0x6a,0x92,0x6e,0x02,0xa1,0xa1, 0x97,0x80,0xaf,0x80,0x84,0x9d,0x9f,0x95,0x7d,0xa3,0x63,0x75,0x54,0xb2,0x03,0xa9, 0x70,0xb5,0x0b,0xae,0x9a,0xa6,0x9b,0x78,0xbd,0xbf,0x97,0x4a,0xc3,0x4a,0xa7,0x85, 0x07,0x0d,0xac,0x96,0xa3,0xa5,0x55,0xcb,0xbb,0x65,0xce,0xd0,0x0d,0x97,0x08,0xc9, 0xdd,0xb8,0xb2,0xd4,0x08,0x08,0xda,0xe4,0xe2,0x0a,0x4c,0xdc,0xcb,0x63,0xd5,0x9c, 0x49,0x06,0xe2,0xf0,0x92,0xab,0x07,0x0e,0xdc,0x75,0xdd,0xbb,0xb8,0xa6,0xea,0xf2, 0x0b,0x0e,0xf5,0xdd,0xea,0x10,0x6a,0x44,0x8d,0x1a,0xbd,0x05,0xfe,0x00,0xaa,0x53, 0x62,0x4d,0x5f,0xc1,0x32,0x0f,0x1c,0x20,0xfc,0x67,0x4f,0xdd,0xc0,0x4c,0x18,0x1d, 0x45,0x9c,0xa8,0xf0,0x54,0x8e,0x8f,0x2a,0x1f,0x03,0x6c,0x4c,0xc8,0x20,0x07,0x03, 0x00,0x0c,0x52,0xaa,0x5c,0xc9,0x32,0xa5,0x84,0x91,0xff,0x58,0xd2,0xa0,0x01,0xd3, 0xc1,0xcc,0x9b,0x2f,0x25,0xfa,0xc3,0x89,0x73,0xa3,0x4d,0x9e,0x40,0x83,0x0a,0x95, 0x10,0x01,0x00,0x3b }; /* created by reswrap from file linkit.gif */ extern const unsigned char linkit[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x20,0x84,0x8f,0xa9,0xcb,0xed,0x0f,0x4f,0x98,0x33,0xd1,0x00, 0x82,0xd8,0xfb,0x6a,0x3e,0x09,0x1e,0x48,0x89,0x1f,0x59,0x82,0xd9,0x65,0x51,0xd1, 0x0b,0xc7,0xf2,0x8c,0x14,0x00,0x3b }; /* created by reswrap from file location.gif */ extern const unsigned char location[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xcb,0xcb,0xcb,0xb7,0xb7,0xb7,0x88,0x88,0x88,0xff,0xff,0xff,0x5a, 0x5a,0x5a,0x2d,0x2d,0x2d,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x3b,0x08,0xba,0xdc,0xfe,0x2d,0xc8,0x49,0x5d,0x10,0x23,0xeb,0x1c,0x22,0x29,0x05, 0x21,0x82,0x62,0xb7,0x04,0x06,0x58,0xa4,0xa0,0xe1,0x9a,0x40,0x70,0x1c,0x2a,0x38, 0xdf,0x26,0xa5,0x52,0xd5,0x54,0x17,0xbc,0x5c,0x60,0xb7,0x9b,0x9c,0x86,0x40,0x09, 0xc8,0x78,0x0c,0x32,0x9b,0x4e,0x88,0x74,0x4a,0xad,0x2e,0x12,0x00,0x3b }; /* created by reswrap from file maphost.bmp */ extern const unsigned char maphost[]={ 0x42,0x4d,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x06,0x00, 0x00,0x00,0x06,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x00,0x00,0x00,0x00,0xbd,0xcf, 0xd6,0x00,0x6b,0x8e,0xa5,0x00,0x00,0xff,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, 0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x01,0x23,0x33,0x33,0x33,0x33,0x31,0x00,0x01, 0x22,0x22,0x22,0x22,0x22,0x31,0x00,0x01,0x23,0x33,0x33,0x33,0x33,0x31,0x00,0x01, 0x22,0x22,0x22,0x22,0x22,0x31,0x10,0x01,0x23,0x33,0x33,0x33,0x55,0x31,0x01,0x01, 0x21,0x33,0x33,0x33,0x44,0x31,0x00,0x11,0x12,0x22,0x22,0x22,0x22,0x21,0x11,0x00, 0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x01, 0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; /* created by reswrap from file mimetype.gif */ extern const unsigned char mimetype[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x20,0x00,0x20,0x00,0xe7,0x00,0x00,0xff,0xef,0xdb, 0x8b,0x7d,0x6b,0x85,0x79,0x68,0x81,0x76,0x66,0x7b,0x71,0x63,0x76,0x6d,0x60,0x72, 0x6a,0x5d,0x6c,0x65,0x5a,0x67,0x61,0x57,0x63,0x5e,0x55,0x5c,0x59,0x53,0xc9,0xc9, 0xc9,0xc3,0xc3,0xc3,0xbb,0xbb,0xba,0xab,0xab,0xab,0x8d,0x8c,0x8c,0x7b,0x7b,0x7a, 0xfd,0xfd,0xfd,0xeb,0xeb,0xeb,0xd1,0xd1,0xd1,0xa5,0xa4,0xa3,0x2e,0x82,0x1a,0x24, 0x58,0x34,0xf4,0xf4,0xf4,0x75,0x75,0x75,0x8c,0xd6,0x80,0x63,0xc3,0x57,0x85,0x85, 0x85,0x62,0xa2,0x62,0x6e,0xb2,0x66,0x3b,0x82,0x43,0xe2,0xe2,0xe2,0x9a,0xca,0x86, 0x93,0x92,0x92,0xb4,0xb3,0xb2,0xdb,0xdb,0xdb,0x42,0xb2,0x32,0x6c,0xbf,0x5c,0x1c, 0x4e,0x12,0x50,0xbc,0x3c,0xad,0xaa,0xa5,0x8c,0x8b,0x81,0x42,0xa6,0x2a,0x20,0x50, 0x2f,0xb0,0xc1,0xb5,0x55,0xca,0x40,0x25,0x6a,0x14,0xdc,0xd9,0xd6,0xc5,0xc1,0xb4, 0xa9,0xa4,0x9e,0x2a,0x6e,0x16,0x32,0x8a,0x1a,0x54,0xc4,0x44,0x42,0x72,0x32,0x96, 0xde,0x85,0x32,0x9e,0x1e,0x22,0x56,0x18,0xec,0xe8,0xe3,0xe7,0xe3,0xdc,0xd2,0xce, 0xc8,0xc6,0xc3,0xbb,0xbb,0xb6,0xad,0x1d,0x56,0x0f,0x36,0x92,0x1e,0x2a,0x76,0x18, 0xaf,0xf5,0x9f,0x30,0x86,0x18,0x18,0x43,0x18,0x9a,0x96,0x90,0xe1,0xdc,0xd3,0xcf, 0xc9,0xc2,0xca,0xc6,0xbd,0xca,0xeb,0xc1,0x5f,0xc2,0x53,0x58,0x6c,0x53,0x9d,0x9b, 0x9a,0xb1,0xaf,0xad,0xa9,0xa6,0xa2,0xf3,0xed,0xe4,0xa4,0x9d,0x92,0x9b,0x94,0x89, 0xdc,0xd5,0xcb,0xcb,0xc2,0xb4,0x1a,0x46,0x0a,0x90,0x8e,0x8e,0xfb,0xf9,0xf5,0x9f, 0x99,0x8d,0xf6,0xf1,0xe9,0xd1,0xc8,0xba,0xc5,0xfc,0xbd,0xb9,0xb6,0xb1,0xa6,0xa1, 0x9a,0xa2,0x9a,0x8c,0xdb,0xd2,0xc2,0x52,0x79,0x5e,0xc0,0xf2,0xb5,0x76,0xca,0x6d, 0x88,0x87,0x86,0xd0,0xcb,0xc5,0xa7,0xa0,0x96,0x9e,0x94,0x83,0xdc,0xd0,0xbc,0x2d, 0x5f,0x3c,0x7b,0xde,0x69,0x28,0x71,0x16,0xec,0xe6,0xdc,0xa1,0x95,0x83,0x42,0xb6, 0x2a,0x2c,0x7e,0x18,0x23,0x56,0x32,0xf1,0xe9,0xdc,0xfa,0xf6,0xf1,0xee,0xe0,0xca, 0xe4,0xd4,0xbc,0x2a,0x66,0x41,0x22,0x5e,0x1c,0xf2,0xe8,0xd7,0xeb,0xdb,0xc3,0xbe, 0xba,0xb4,0xf1,0xe4,0xd2,0xf0,0xe2,0xcf,0xf8,0xf3,0xed,0xea,0xd9,0xbd,0xe6,0xd1, 0xb2,0xe1,0xdf,0xdc,0xb5,0xb2,0xac,0xe9,0xd6,0xbb,0xe8,0xd4,0xb4,0x3e,0x7b,0x4a, 0x35,0x70,0x4a,0xdf,0xd8,0xce,0xec,0xe2,0xd4,0xb8,0xeb,0xb1,0x6f,0xc4,0x60,0x36, 0x92,0x2a,0xe5,0xce,0xaa,0xc1,0xb8,0xa9,0xa0,0x92,0x7e,0x9f,0x91,0x7c,0x9f,0x8f, 0x79,0xe3,0xc8,0xa2,0xe2,0xc6,0x9e,0xef,0xe8,0xde,0xd6,0xd0,0xc5,0xb8,0xb3,0xa7, 0xc0,0xb4,0xa5,0xd9,0xcd,0xba,0xf7,0xf0,0xe6,0xe2,0xda,0xce,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x08,0xfe,0x00,0x01,0x08,0x1c,0x18,0x20,0x80, 0x80,0x01,0x04,0x08,0x14,0x30,0x70,0xe0,0x00,0x82,0x04,0x0a,0x14,0x0c,0x9c,0x48, 0xb1,0x62,0x80,0x05,0x18,0x33,0x62,0x64,0xd0,0xc0,0xc1,0x03,0x08,0x01,0x2a,0x8a, 0x9c,0x18,0x20,0x82,0xc9,0x93,0x28,0x25,0x4c,0xa0,0x50,0x70,0xe4,0xc8,0x00,0x15, 0x62,0xca,0xac,0x60,0xc1,0xe4,0x05,0x09,0x0c,0x30,0x2c,0x08,0xe9,0x72,0xa2,0x05, 0x0b,0x19,0x82,0x0a,0xd5,0xa0,0xe1,0xa7,0x49,0x09,0x25,0x37,0xf0,0xec,0x69,0x81, 0x43,0x86,0x0e,0x44,0xa3,0x46,0xa5,0x69,0xb2,0xe4,0x02,0xa5,0x3d,0x01,0x00,0xed, 0xf0,0xb3,0xab,0x05,0x0d,0x50,0x8b,0x7a,0x88,0x10,0xe0,0x43,0x84,0xab,0x4b,0x2b, 0x02,0x05,0xf1,0x93,0x81,0x5b,0xb7,0x5f,0xa1,0xfe,0xfc,0x10,0x80,0x81,0xc9,0x05, 0x21,0xd2,0xfa,0xcc,0x60,0xe1,0x81,0x03,0x11,0x0c,0x26,0x8c,0x18,0xb1,0xc0,0x02, 0x89,0xa2,0x16,0x76,0x16,0x5c,0xac,0x77,0xa0,0x85,0x12,0x26,0x36,0x34,0x58,0x30, 0x42,0xc2,0x85,0x9b,0x16,0x4e,0xd0,0x4c,0xfc,0xe1,0xc3,0x82,0x06,0x28,0x52,0x34, 0x16,0x68,0x41,0x45,0x87,0x15,0x2b,0x2a,0x5f,0x30,0xc9,0xc2,0x42,0x0b,0x9a,0x2e, 0x28,0x7f,0x78,0xb1,0x00,0x46,0x8c,0xd1,0x5a,0x65,0xcc,0xa0,0x51,0xc3,0xc2,0x07, 0x09,0x26,0x2d,0xd8,0xb8,0x81,0xc3,0x02,0x85,0x06,0x2f,0x72,0xe8,0xd8,0xc1,0xa3, 0x07,0x6e,0xad,0x3e,0x7e,0x00,0xb1,0xc0,0x60,0xc4,0x05,0x0b,0x41,0x34,0x08,0x19, 0x12,0x82,0x02,0x8a,0xe4,0x44,0x8a,0xfe,0x18,0x39,0xf2,0x5c,0xeb,0x4f,0x0a,0x22, 0x0a,0x23,0x49,0x22,0xc4,0x85,0x92,0x25,0x4c,0x9a,0x34,0x71,0xf2,0x04,0x4a,0x14, 0x29,0xe5,0x01,0x04,0x70,0x80,0xde,0xc2,0xfa,0xf6,0x53,0x50,0xd1,0x44,0x03,0x31, 0xc4,0x50,0x85,0x15,0x56,0x5c,0x81,0x45,0x7e,0x75,0x31,0x60,0x41,0x16,0xec,0xb9, 0x60,0x41,0x77,0x5a,0xec,0x10,0xc3,0x16,0x55,0x70,0x01,0xc5,0x15,0x5d,0x30,0xf8, 0x81,0x17,0x5f,0x80,0xd1,0x9e,0x05,0x61,0x50,0xa0,0x85,0x18,0x17,0x8e,0x91,0x21, 0x19,0x57,0x94,0xc1,0xe0,0x05,0x66,0x9c,0x71,0x03,0x1a,0xdc,0x99,0x28,0x46,0x11, 0x69,0x8c,0xf1,0x44,0x86,0x6a,0xb4,0xc8,0x60,0x04,0x16,0xac,0xc1,0x46,0x1b,0x0f, 0x6c,0x21,0x82,0x11,0x38,0xba,0xe1,0xc6,0x13,0x6f,0xc0,0xc1,0x62,0x1c,0x3f,0xca, 0x01,0xc4,0x1c,0x16,0x2c,0x81,0xc2,0x11,0x49,0xba,0x41,0x07,0x17,0x6f,0xd4,0xf1, 0xe4,0x8f,0xd7,0x19,0xd7,0x84,0x1d,0x51,0x6c,0xa1,0x23,0x1d,0x77,0xe0,0x91,0x47, 0x1d,0x7a,0x5c,0xb1,0x07,0x98,0x7c,0x30,0xd0,0xc7,0x89,0x66,0x32,0xd9,0x24,0x1c, 0x6c,0xfa,0xf1,0xc7,0x9b,0x59,0x95,0x74,0x01,0x20,0x81,0xc8,0x61,0x84,0x20,0x83, 0x64,0xc8,0x05,0x17,0x78,0xd6,0xa1,0xe7,0x1e,0x7c,0xf6,0x54,0x92,0x07,0x84,0x14, 0x62,0x88,0x05,0x51,0x0c,0x32,0xc8,0xa1,0x6a,0xa8,0xc1,0xe6,0x9e,0x87,0x1c,0xc2, 0x60,0x1e,0x4e,0xb4,0xf1,0xd3,0x13,0x88,0x94,0x51,0x47,0x1d,0x99,0x26,0xa2,0xc8, 0x22,0x9d,0x32,0xd2,0x08,0x83,0x4d,0x57,0x38,0xf2,0x08,0x24,0x50,0x3c,0x11,0x89, 0x24,0xa7,0xaa,0x91,0xc7,0x15,0x8b,0x4c,0x72,0x08,0x23,0xae,0xc2,0xea,0x06,0x25, 0x58,0x20,0x12,0x89,0x14,0x71,0xf8,0xa1,0x47,0x9b,0x7b,0x3a,0x01,0x6c,0xb0,0x7d, 0x3a,0xe1,0x46,0x1a,0x94,0x48,0x22,0x49,0x17,0xa7,0xea,0xe1,0x07,0xa3,0xad,0x36, 0xe2,0x2d,0x83,0x8c,0x85,0x2b,0x6e,0xb8,0x59,0x95,0x6b,0xee,0xb9,0xe8,0xa6,0xab, 0xee,0x40,0x01,0x01,0x00,0x3b }; /* created by reswrap from file moveit.gif */ extern const unsigned char moveit[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x7f,0x7f,0x65,0xb3,0xb3,0x8e,0x00,0x00,0x00,0xff,0xff,0xcb,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x41,0x08,0xba,0xdc,0x10,0x30,0x3a,0x16,0x84,0x15,0x70,0xaa,0x7a,0x6b,0xd0,0x5e, 0x98,0x39,0xdc,0x65,0x7d,0x24,0x06,0x59,0x43,0xeb,0x2e,0xe5,0x35,0x10,0x34,0xd1, 0x6e,0x2a,0x37,0xd7,0xf3,0xf0,0x98,0x2c,0x5b,0xcf,0x15,0x29,0xee,0x6a,0x34,0x9f, 0x63,0xe8,0xb2,0x4d,0x8e,0x48,0x65,0x83,0xd9,0x72,0x2e,0x91,0xbc,0xa7,0x6b,0x3b, 0x48,0x00,0x00,0x3b }; /* created by reswrap from file paste.bmp */ extern const unsigned char paste[]={ 0x42,0x4d,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x08,0x00, 0x00,0x00,0x08,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0xff, 0xff,0x00,0x00,0x7f,0x7f,0x00,0x7f,0x7f,0x7f,0x00,0xbf,0xbf,0xbf,0x00,0x7f,0x00, 0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x66,0x66,0x66,0x66,0x66,0x01,0x11,0x11,0x67,0x77,0x77,0x77,0x76,0x14,0x34, 0x34,0x67,0x11,0x11,0x11,0x76,0x13,0x43,0x43,0x67,0x77,0x77,0x77,0x76,0x14,0x34, 0x34,0x67,0x11,0x17,0x66,0x66,0x13,0x43,0x43,0x67,0x77,0x77,0x67,0x60,0x14,0x34, 0x34,0x67,0x77,0x77,0x66,0x00,0x13,0x43,0x43,0x66,0x66,0x66,0x61,0x00,0x14,0x34, 0x34,0x34,0x34,0x34,0x31,0x00,0x13,0x41,0x11,0x11,0x11,0x14,0x41,0x00,0x14,0x41, 0x55,0x55,0x55,0x14,0x31,0x00,0x13,0x43,0x12,0x11,0x21,0x43,0x41,0x00,0x01,0x11, 0x11,0x22,0x11,0x11,0x10,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00 }; /* created by reswrap from file pattern_gif.gif */ extern const unsigned char pattern_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x18,0x00,0x18,0x00,0xe3,0x00,0x00,0xb2,0xc0,0xdc, 0xaa,0xa8,0xc0,0xa3,0x90,0xa5,0xa7,0x9c,0xb2,0x95,0x60,0x6e,0x78,0x00,0x00,0x86, 0x30,0x37,0xae,0xb4,0xce,0x8d,0x48,0x52,0x9c,0x78,0x89,0x98,0x6c,0x7b,0x7b,0x0c, 0x0d,0x7f,0x18,0x1b,0x91,0x54,0x60,0x82,0x24,0x29,0xa6,0x9c,0xb2,0x2c,0x00,0x00, 0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x04,0x94,0x10,0xc8,0x49,0xab,0xbd,0x38,0xeb, 0xad,0x83,0x18,0xda,0x20,0x04,0x18,0x51,0x18,0x9a,0x51,0x10,0xe5,0x99,0xae,0xd4, 0x21,0x1c,0x80,0x89,0x02,0xa3,0xe4,0x49,0x2a,0x2b,0x1f,0x88,0x02,0x22,0x61,0x13, 0xd8,0x02,0x81,0x9e,0xa0,0x97,0x08,0x22,0x14,0x85,0xc2,0x82,0x21,0xa5,0x0a,0x0f, 0xc0,0x28,0x63,0x51,0xd8,0x46,0x15,0x92,0x46,0x74,0xec,0xb0,0x38,0xc6,0xd1,0x46, 0x05,0x5d,0x10,0x58,0x04,0xec,0x8a,0xb8,0x00,0x2d,0x94,0x2b,0x67,0x7a,0x5a,0x92, 0x5d,0x24,0x00,0x0f,0x54,0x0e,0x24,0x00,0x01,0x67,0x0c,0x0f,0x00,0x09,0x5c,0x08, 0x07,0x49,0x05,0x7f,0x12,0x02,0x0c,0x0c,0x6e,0x38,0x94,0x96,0x8a,0x0c,0x04,0x24, 0x3b,0x14,0x03,0x20,0x0d,0x6a,0xa0,0x15,0x20,0x1b,0x26,0x30,0x1c,0x17,0x93,0x95, 0xaa,0x18,0xa4,0xae,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xae,0x11,0x00,0x3b }; /* created by reswrap from file properties.bmp */ extern const unsigned char properties[]={ 0x42,0x4d,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x05,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x00,0x00,0x00,0x00,0x7f,0x00, 0x00,0x00,0xbd,0xcf,0xd6,0x00,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x00,0x14,0x44,0x44,0x44,0x44,0x41, 0x00,0x00,0x14,0x11,0x41,0x11,0x11,0x41,0x00,0x00,0x14,0x44,0x44,0x44,0x44,0x41, 0x00,0x00,0x14,0x11,0x41,0x11,0x11,0x41,0x00,0x00,0x14,0x44,0x44,0x44,0x44,0x41, 0x00,0x00,0x14,0x44,0x44,0x44,0x14,0x41,0x00,0x00,0x14,0x11,0x44,0x41,0x31,0x41, 0x00,0x00,0x14,0x13,0x14,0x13,0x13,0x11,0x10,0x22,0x14,0x41,0x31,0x31,0x31,0x33, 0x31,0x22,0x11,0x11,0x13,0x13,0x13,0x33,0x33,0x22,0x00,0x00,0x01,0x31,0x33,0x33, 0x33,0x22,0x00,0x00,0x00,0x13,0x33,0x33,0x31,0x22,0x00,0x00,0x00,0x01,0x11,0x11, 0x10,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; /* created by reswrap from file quit_gif.gif */ extern const unsigned char quit_gif[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xc2,0x00,0x00,0xb2,0xc0,0xdc, 0x04,0x02,0x04,0x2c,0x2e,0x2c,0x74,0x72,0x74,0x74,0x76,0x74,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x39,0x08,0xba,0xdc,0xae,0x21,0xbc,0x17,0xe7,0x92,0xa0,0xe6,0x27,0xaa,0x0f,0x42, 0x33,0x68,0x64,0x30,0x30,0xdd,0x99,0x61,0x63,0x78,0x61,0xeb,0xcb,0x68,0x31,0x04, 0x03,0xa9,0xad,0xb4,0x0c,0x41,0xbf,0x84,0x46,0xc7,0xb4,0x8b,0xb8,0x84,0x91,0x24, 0xc8,0x42,0x18,0x0a,0x54,0x96,0xa8,0xb4,0x91,0x00,0x00,0x3b }; /* created by reswrap from file renameit.gif */ extern const unsigned char renameit[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xcb,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x3c,0x84,0x8f,0x09,0xc1,0xad,0x18,0x84,0x14,0xec,0x99,0x38, 0x63,0xb0,0x98,0xd1,0xaa,0x68,0x52,0xf7,0x68,0xcd,0xd7,0x6c,0x17,0x35,0x52,0xc3, 0x3b,0x80,0x22,0x1b,0xc0,0x71,0xbc,0x4c,0x59,0xcc,0xf0,0xe9,0x7f,0x0b,0xaa,0x12, 0xb5,0x06,0x6c,0x08,0x11,0xbe,0x90,0x87,0x62,0x6f,0x59,0xb2,0x1d,0x4b,0xbf,0x46, 0x01,0x00,0x3b }; /* created by reswrap from file rotateleft.gif */ extern const unsigned char rotateleft[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xff,0xff,0xff,0x5d,0x60,0x69,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x3b,0x84,0x8f,0x69,0x11,0xcb,0xac,0x40,0x10,0x4c,0x58,0x0b, 0xd1,0xbc,0x1c,0x6b,0xfe,0x6c,0xc1,0x70,0x6c,0xd8,0x80,0x8a,0x65,0xd7,0x48,0xa7, 0x13,0x8e,0x2e,0x45,0x1a,0xc3,0x88,0xa2,0xb3,0xbc,0x50,0x89,0x58,0xdb,0x85,0x4e, 0xc1,0x59,0x87,0xa6,0x30,0x61,0x70,0x91,0x58,0x2e,0x62,0xcb,0x15,0xa1,0xd4,0x02, 0x00,0x3b }; /* created by reswrap from file rotateright.gif */ extern const unsigned char rotateright[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xff,0xff,0xff,0x5d,0x60,0x69,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x3b,0x84,0x8f,0xa9,0xc1,0x6c,0x8e,0x98,0x98,0x53,0x86,0x71, 0x02,0xdd,0xf4,0xe6,0xda,0x6c,0x1e,0xa0,0x09,0xd7,0x30,0x94,0x15,0x46,0xae,0xad, 0xc8,0x96,0x5e,0x43,0xc7,0x2e,0x80,0xa6,0xf9,0x73,0xf3,0x41,0x22,0xa3,0xf5,0x5e, 0x1c,0x13,0x0a,0xa8,0x5a,0xb1,0x16,0xb5,0xa5,0x02,0x97,0x73,0x3e,0xa7,0x86,0x02, 0x00,0x3b }; /* created by reswrap from file setbook.gif */ extern const unsigned char setbook[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xf2,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x80,0xa0,0x8c,0x68,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x03, 0x2e,0x08,0xba,0xdc,0xfe,0x30,0x4a,0x16,0xe6,0xaa,0x16,0x04,0x3c,0x83,0x10,0x1c, 0xe4,0x7d,0xa1,0x33,0x0a,0x43,0x49,0x8d,0x43,0xbb,0x99,0x4a,0xd0,0xb6,0x24,0x75, 0xcd,0x1f,0x78,0x51,0x74,0x1d,0x9b,0x23,0x8e,0x4a,0x41,0x78,0x65,0x1c,0x09,0x00, 0x3b }; /* created by reswrap from file setdir.gif */ extern const unsigned char setdir[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0x84,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0xcd,0x66,0x66,0x66,0xee,0xee,0x00,0xf7,0xf7,0xf7,0xf1,0xf1,0xf1,0xf4, 0xf4,0xf4,0xef,0xef,0xef,0xea,0xea,0xea,0xe5,0xe5,0xe5,0xcd,0xcd,0x00,0xe7,0xe7, 0xe7,0xe2,0xe2,0xe2,0xdd,0xdd,0xdd,0xd8,0xd8,0xd8,0xda,0xda,0xda,0xd5,0xd5,0xd5, 0xbb,0xbb,0xbb,0x3b,0x5b,0x70,0xc4,0xc4,0xc4,0xab,0xab,0xab,0x91,0x91,0x91,0x81, 0x81,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x05,0x57,0x20,0x20,0x8e,0x62,0x00,0x04,0xa8, 0x49,0x02,0x82,0x50,0xa6,0xa7,0x2a,0x0a,0xc3,0xd0,0xc2,0xef,0x48,0xd7,0x43,0x2a, 0xab,0x3b,0x9e,0x6b,0x05,0xe4,0x09,0x87,0xa7,0x99,0x71,0xd9,0x22,0x05,0x97,0xc2, 0x59,0x0b,0x6a,0x1c,0x0a,0x08,0x85,0x29,0xb4,0xc9,0x32,0x1c,0x10,0x09,0xad,0x50, 0x61,0x15,0x2c,0x18,0x0d,0x87,0x56,0xa0,0x20,0x3b,0x05,0x0f,0x08,0x24,0x22,0x69, 0xb9,0x57,0x2c,0xc1,0x84,0x52,0x61,0x23,0xf1,0x79,0x16,0x5c,0x80,0x6f,0x2b,0x21, 0x00,0x3b }; /* created by reswrap from file smallicons.bmp */ extern const unsigned char smallicons[]={ 0x42,0x4d,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x04,0x00, 0x00,0x00,0x04,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x7f,0x00,0x00,0x00,0xff,0xff, 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x10, 0x00,0x00,0x11,0x10,0x00,0x00,0x12,0x10,0x33,0x30,0x12,0x10,0x33,0x30,0x11,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x11,0x10,0x00,0x00,0x12,0x10, 0x33,0x30,0x12,0x10,0x33,0x30,0x11,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x10, 0x00,0x00,0x11,0x10,0x00,0x00,0x12,0x10,0x33,0x30,0x12,0x10,0x33,0x30,0x11,0x00, 0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00 }; /* created by reswrap from file unmaphost.bmp */ extern const unsigned char unmaphost[]={ 0x42,0x4d,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x28,0x00, 0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00, 0x00,0x00,0x80,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x03,0x00, 0x00,0x00,0x03,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x00,0x00,0x84,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x20,0x20,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x20,0x20,0x20,0x20,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x20,0x02,0x11,0x00,0x11,0x00,0x00,0x00, 0x00,0x00,0x01,0x11,0x10,0x02,0x02,0x02,0x02,0x02,0x00,0x11,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x11,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00 }; /* created by reswrap from file work.gif */ extern const unsigned char work[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xf1,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00, 0x10,0x00,0x00,0x02,0x28,0x84,0x8f,0xa9,0x10,0x1d,0x8b,0x9a,0x10,0x0e,0x1e,0x39, 0x9f,0x65,0x93,0x6e,0x16,0x64,0xda,0x12,0x0c,0x4e,0x46,0x9a,0x46,0x38,0x46,0xea, 0x95,0xb6,0x50,0x29,0xc7,0x1f,0xf3,0x7e,0xcd,0xcd,0xf7,0x4a,0x01,0x00,0x3b }; fox1.6-1.6.57/pathfinder/icons.h000066400000000000000000000062341326741342000162520ustar00rootroot00000000000000/* Generated by reswrap version 4.0.0 */ /* created by reswrap from file bigicons.bmp */ extern const unsigned char bigicons[]; /* created by reswrap from file closepanel.gif */ extern const unsigned char closepanel[]; /* created by reswrap from file clrbook.gif */ extern const unsigned char clrbook[]; /* created by reswrap from file copy.bmp */ extern const unsigned char copy[]; /* created by reswrap from file copyit.gif */ extern const unsigned char copyit[]; /* created by reswrap from file cut.bmp */ extern const unsigned char cut[]; /* created by reswrap from file deleteit.bmp */ extern const unsigned char deleteit[]; /* created by reswrap from file desktop.bmp */ extern const unsigned char desktop[]; /* created by reswrap from file details.bmp */ extern const unsigned char details[]; /* created by reswrap from file dirup.bmp */ extern const unsigned char dirup[]; /* created by reswrap from file enter.gif */ extern const unsigned char enter[]; /* created by reswrap from file file_gif.gif */ extern const unsigned char file_gif[]; /* created by reswrap from file foxbig.gif */ extern const unsigned char foxbig[]; /* created by reswrap from file foxmini.gif */ extern const unsigned char foxmini[]; /* created by reswrap from file goback.bmp */ extern const unsigned char goback[]; /* created by reswrap from file goforw.bmp */ extern const unsigned char goforw[]; /* created by reswrap from file gotodir.bmp */ extern const unsigned char gotodir[]; /* created by reswrap from file home.gif */ extern const unsigned char home[]; /* created by reswrap from file hosts.bmp */ extern const unsigned char hosts[]; /* created by reswrap from file iconpath.gif */ extern const unsigned char iconpath[]; /* created by reswrap from file linkit.gif */ extern const unsigned char linkit[]; /* created by reswrap from file location.gif */ extern const unsigned char location[]; /* created by reswrap from file maphost.bmp */ extern const unsigned char maphost[]; /* created by reswrap from file mimetype.gif */ extern const unsigned char mimetype[]; /* created by reswrap from file moveit.gif */ extern const unsigned char moveit[]; /* created by reswrap from file paste.bmp */ extern const unsigned char paste[]; /* created by reswrap from file pattern_gif.gif */ extern const unsigned char pattern_gif[]; /* created by reswrap from file properties.bmp */ extern const unsigned char properties[]; /* created by reswrap from file quit_gif.gif */ extern const unsigned char quit_gif[]; /* created by reswrap from file renameit.gif */ extern const unsigned char renameit[]; /* created by reswrap from file rotateleft.gif */ extern const unsigned char rotateleft[]; /* created by reswrap from file rotateright.gif */ extern const unsigned char rotateright[]; /* created by reswrap from file setbook.gif */ extern const unsigned char setbook[]; /* created by reswrap from file setdir.gif */ extern const unsigned char setdir[]; /* created by reswrap from file smallicons.bmp */ extern const unsigned char smallicons[]; /* created by reswrap from file unmaphost.bmp */ extern const unsigned char unmaphost[]; /* created by reswrap from file work.gif */ extern const unsigned char work[]; fox1.6-1.6.57/pathfinder/linkit.gif000066400000000000000000000001071326741342000167400ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙, „Ź©ËíO3Ń‚Řűj> H‰Y‚ŮeQŃ ÇňŚ;fox1.6-1.6.57/pathfinder/location.gif000066400000000000000000000001561326741342000172620ustar00rootroot00000000000000GIF87a²ŔÜËËË···˙˙˙ZZZ---,;şÜţ-ČI]#ë")!‚b·X¤ áš@p*8ß&ĄRŐTĽ\`·›ś†@ Čx 2›NtJ­.;fox1.6-1.6.57/pathfinder/maphost.bmp000066400000000000000000000003161326741342000171340ustar00rootroot00000000000000BMÎN(€m m ÜŔ˛˝ĎÖkŽĄ˙‚#33331"""""1#33331"""""1#333U1!333D1""""!fox1.6-1.6.57/pathfinder/mimetype.gif000066400000000000000000000025461326741342000173100ustar00rootroot00000000000000GIF87a ç˙ďŰ‹}k…yhvf{qcvm`rj]leZgaWc^U\YSÉÉÉĂĂĂ»»ş«««ŤŚŚ{{zýýýëëëŃŃŃĄ¤Ł.‚$X4ôôôuuuŚÖ€cĂW………b˘bn˛f;‚CâââšĘ†“’’´ł˛ŰŰŰB˛2lż\NPĽ<­ŞĄŚ‹B¦* P/°ÁµUĘ@%jÜŮÖĹÁ´©¤ž*n2ŠTÄDBr2–Ţ…2ž"VěčăçăÜŇÎČĆĂ»»¶­V6’*vŻőź0†Cš–áÜÓĎÉÂĘĆ˝ĘëÁ_ÂSXlSť›š±Ż­©¦˘óí䤝’›”‰ÜŐËË´F ŽŽűůőź™ŤöńéŃČşĹü˝ą¶±¦ˇš˘šŚŰŇÂRy^ŔňµvĘm‡†ĐËŧ –ž”ÜĐĽ-_<{Ţi(qěćܡ•B¶*,~#V2ńéÜúöńîŕĘäÔĽ*fA"^ňč×ëŰĂľş´ńäŇđâĎřóíęŮ˝ćѲáßܵ˛¬éÖ»čÔ´>{J5pJßŘÎěâÔ¸ë±oÄ`6’*ĺÎŞÁ¸© ’~ź‘|źŹyăȢâĆžďčŢÖĐŸł§Ŕ´ĄŮÍş÷đćâÚÎ, ţ €€0pŕ‚  śH±b€3bdĐŔÁ*Šś ‚É“(%L PpäČbʬ`Áä 0,ér˘ ‚ Ő á§I %7đěiC†DŁFĄi˛äĄ=íđł« P‹zŕC„«K+ń“[·_ˇţü€É!ŇúĚ`á &ڱŔ‰˘v\¬w …&64X0BÂ…›NĐLüáĂ‚(R4hAE‡+*_0ÉÂB š.(x±FŚŃZeĚ QĂ &-ظĂ…/rčŘÁŁn­>~±Ŕ`Ä A4‚ŠäDŠţ9ň\ëO " #I"Ä…’%Lš4qňJ)ĺp€ŢÂúöSPŃD1ÄP…V\E~u1`Aěą`AwZěĂUpĹ]0ř_€ŃžaP …Ž‘!W”ÁŕfśqÜ™(FiŚńD†j´Č`¬ÁFl!‚8şáĆoŔÁb?ĘÄ,ÂIşAoÔńäŹ×ׄQlˇ#wŕ‘Gz\±|0Đljf2Ů$lúńÇ›Y•t Ča„ dČxÖˇç|öT’„bQ 2ȡj¨Á枇Â`N´ńÓ”QG™&˘Č"ť2ŇMW8ň$P<‰$§Ş‘Ç‹Lr#®Âę%X ‰qřˇG›{:l°}:áF”H"I§ęᣭ6â-Ś…+n¸Y•kîąč¦«î@;fox1.6-1.6.57/pathfinder/moveit.gif000066400000000000000000000001641326741342000167540ustar00rootroot00000000000000GIF87a²ŔÜełłŽ˙˙Ë,AşÜ0:„pŞzkĐ^9Üe}$YCë.ĺ54Ńn*7×óđ,[Ď)îj4źcč˛MŽHeŮr.‘Ľ§k;H;fox1.6-1.6.57/pathfinder/paste.bmp000066400000000000000000000003261326741342000165760ustar00rootroot00000000000000BMÖV(€m m ÜŔ˛˙˙żżż˙˙˙fffffgwwwv44gvCCgwwwv44gffCCgwwg`44gwwfCCfffa444441AAAUUU1C!CA"fox1.6-1.6.57/pathfinder/pattern_gif.gif000066400000000000000000000003371326741342000177550ustar00rootroot00000000000000GIF87aă˛ŔÜŞ¨ŔŁĄ§ś˛•`nx†07®´ÎŤHRśx‰l{{ ‘T`‚$)¦ś˛,”ČI«˝8ë­Ú QšQĺ™®Ô!€‰ŁäI*+"aŘž —"…‚!Ą Ŕ(cQŘF’Ftě°8ĆŃF]X슸-”+gzZ’]$T$g  \I n8”–Š $; j  &0“•ޤ®±˛ł´µ¶·®;fox1.6-1.6.57/pathfinder/properties.bmp000066400000000000000000000003121326741342000176510ustar00rootroot00000000000000BMĘJ(€m m ÜŔ˛˝ĎÖ˙˙˙DDDDAAADDDDAAADDDDADDDADA1A"A11131"33"1333"331""fox1.6-1.6.57/pathfinder/quit_gif.gif000066400000000000000000000001541326741342000172570ustar00rootroot00000000000000GIF87a²ŔÜ,.,trttvt,9şÜ®!Ľç’ ć'ŞB3hd00Ý™acxaëËh1©­´ Aż„FÇ´‹¸„‘$ČB T–¨´‘;fox1.6-1.6.57/pathfinder/renameit.gif000066400000000000000000000001431326741342000172520ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙˙˙˙Ë,<„Ź Á­„ě™8c°ŃŞhR÷hÍ×l5RĂ;€"ŔqĽLYĚđé Şµlľ‡boY˛KżF;fox1.6-1.6.57/pathfinder/rotateleft.gif000066400000000000000000000001421326741342000176160ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙˙]`i,;„Źiˬ@LX ŃĽkţlÁplŘ€Še×H§Ž.E⳼P‰XŰ…NÁY‡¦0ap‘X.bˡÔ;fox1.6-1.6.57/pathfinder/rotateright.gif000066400000000000000000000001421326741342000200010ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙˙]`i,;„Ź©ÁlŽS†qÝôćÚl  ×0”F®­Č–^CÇ.€¦ůsóA"Łő^ ¨Z±µĄ—s>§†;fox1.6-1.6.57/pathfinder/setbook.gif000066400000000000000000000001411326741342000171120ustar00rootroot00000000000000GIF87aň˛ŔÜ˙€ Śh,.şÜţ0JćŞ<ä}ˇ3 CIŤC»™Jж$uÍxQt›#ŽJAxe ;fox1.6-1.6.57/pathfinder/setdir.gif000066400000000000000000000003221326741342000167370ustar00rootroot00000000000000GIF87a„˛ŔÜÍfffîî÷÷÷ńńńôôôďďďęęęĺĺĺÍÍçççâââÝÝÝŘŘŘÚÚÚŐŐŐ»»»;[pÄÄÄ«««‘‘‘,W Žb¨I‚P¦§* ĂĐÂďH×C*«;žkä ‡§™qŮ"—ÂY j …)´É2 ­Pa, ‡V  ;$"iąW,Á„Ra#ńy\€o+!;fox1.6-1.6.57/pathfinder/smallicons.bmp000066400000000000000000000003061326741342000176240ustar00rootroot00000000000000BMĆF(€m m ÜŔ˛˙˙˙303030303030fox1.6-1.6.57/pathfinder/unmaphost.bmp000066400000000000000000000003021326741342000174720ustar00rootroot00000000000000BMÂB(€m m ÜŔ˛„   fox1.6-1.6.57/pathfinder/work.gif000066400000000000000000000001171326741342000164310ustar00rootroot00000000000000GIF87ań˛ŔÜ€€€,(„Ź©‹š9źe“ndÚ NFšF8Fę•¶P)Çó~ÍÍ÷J;fox1.6-1.6.57/shutterbug/000077500000000000000000000000001326741342000150315ustar00rootroot00000000000000fox1.6-1.6.57/shutterbug/LICENSE000066400000000000000000000431241326741342000160420ustar00rootroot00000000000000 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. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. fox1.6-1.6.57/shutterbug/Makefile.am000066400000000000000000000015151326741342000170670ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp LDADD = $(top_builddir)/src/libFOX-1.6.la -lm bin_PROGRAMS = shutterbug man_MANS = shutterbug.1 ICONS = \ line_0.gif \ line_1.gif \ line_2.gif \ line_3.gif \ line_4.gif \ line_5.gif \ line_6.gif \ line_7.gif \ line_8.gif \ shutterbug.gif \ tinyshutterbug.gif shutterbug_SOURCES = \ icons.h \ icons.cpp \ ShutterBug.h \ ShutterBug.cpp \ Snapper.h \ Snapper.cpp \ LICENSE \ $(ICONS) ShutterBug.cpp: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $^ icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $^ CLEANFILES = icons.h icons.cpp EXTRA_DIST = \ $(man_MANS) \ Makefile.bc \ Makefile.wc \ Makefile.dmc fox1.6-1.6.57/shutterbug/Makefile.bc000066400000000000000000000055551326741342000170660ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Copyright (C) 1997,2005 by Jeroen van der Zijp. All Rights Reserved. # ############################################################################## # $Id: Makefile.bc,v 1.5.2.1 2006/08/08 23:26:39 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # For use with Borland C++ Builder 3 or later CXX = bcc32 CXXFLAGS = -5 -O2 -w-par -w-csu -w-aus RM = del TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = bcc32 LDFLAGS = -laa GLLIBS = opengl32.lib glu32.lib INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = shutterbug.exe OBJECTS = \ ShutterBug.obj \ Snapper.obj \ icons.obj ICONS = \ line_0.gif \ line_1.gif \ line_2.gif \ line_3.gif \ line_4.gif \ line_5.gif \ line_6.gif \ line_7.gif \ line_8.gif \ shutterbug.gif \ tinyshutterbug.gif .cpp.obj: $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) shutterbug.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) ShutterBug.obj: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $** icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $** clean: $(RM) *.obj $(RM) *.exe $(RM) *.tds $(RM) icons.cpp $(RM) icons.h fox1.6-1.6.57/shutterbug/Makefile.dmc000066400000000000000000000054101326741342000172330ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Copyright (C) 2006 by Jeroen van der Zijp. All Rights Reserved # ############################################################################## # $Id: Makefile.dmc,v 1.1.2.2 2006/08/09 01:55:08 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # Digital Mars C++ Compiler 8.x or later CXX = dmc CXXFLAGS = -mn -5 -a8 -Ae -Ar RM = del TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = link LDFLAGS = -noignorecase LIBS = c:\dm\lib\advapi32.lib c:\dm\lib\shell32.lib c:\dm\lib\gdi32.lib c:\dm\lib\wsock32.lib c:\dm\lib\winspool.lib GLLIBS = opengl32.lib glu32.lib INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = shutterbug.exe SOURCES = \ ShutterBug.cpp \ Snapper.cpp \ icons.cpp OBJECTS = \ ShutterBug.obj \ Snapper.obj \ icons.obj ICONS =\ line_0.gif \ line_1.gif \ line_2.gif \ line_3.gif \ line_4.gif \ line_5.gif \ line_6.gif \ line_7.gif \ line_8.gif \ shutterbug.gif \ tinyshutterbug.gif .cpp.obj: $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) shutterbug.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) $(LIBS) ShutterBug.obj: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o $@ $(ICONS) icons.cpp: $(ICONS) $(RESWRAP) -e -o $@ $(ICONS) clean: $(RM) *.obj *.exe *.tds *.map icons.cpp fox1.6-1.6.57/shutterbug/Makefile.in000066400000000000000000000575231326741342000171120ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = shutterbug$(EXEEXT) subdir = shutterbug ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am__objects_1 = am_shutterbug_OBJECTS = icons.$(OBJEXT) ShutterBug.$(OBJEXT) \ Snapper.$(OBJEXT) $(am__objects_1) shutterbug_OBJECTS = $(am_shutterbug_OBJECTS) shutterbug_LDADD = $(LDADD) shutterbug_DEPENDENCIES = $(top_builddir)/src/libFOX-1.6.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(shutterbug_SOURCES) DIST_SOURCES = $(shutterbug_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp LDADD = $(top_builddir)/src/libFOX-1.6.la -lm man_MANS = shutterbug.1 ICONS = \ line_0.gif \ line_1.gif \ line_2.gif \ line_3.gif \ line_4.gif \ line_5.gif \ line_6.gif \ line_7.gif \ line_8.gif \ shutterbug.gif \ tinyshutterbug.gif shutterbug_SOURCES = \ icons.h \ icons.cpp \ ShutterBug.h \ ShutterBug.cpp \ Snapper.h \ Snapper.cpp \ LICENSE \ $(ICONS) CLEANFILES = icons.h icons.cpp EXTRA_DIST = \ $(man_MANS) \ Makefile.bc \ Makefile.wc \ Makefile.dmc all: all-am .SUFFIXES: .SUFFIXES: .gif .bmp .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign shutterbug/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign shutterbug/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list shutterbug$(EXEEXT): $(shutterbug_OBJECTS) $(shutterbug_DEPENDENCIES) $(EXTRA_shutterbug_DEPENDENCIES) @rm -f shutterbug$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(shutterbug_OBJECTS) $(shutterbug_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShutterBug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Snapper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icons.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(MANS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-man uninstall-man1 .PRECIOUS: Makefile ShutterBug.cpp: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $^ icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $^ # 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: fox1.6-1.6.57/shutterbug/Makefile.wc000066400000000000000000000021061326741342000171000ustar00rootroot00000000000000# Makefile for ShutterBug with Watcom 1.4 CXX = wpp386 CXXFLAGS = /w3 /e1 /zq /5r /ei /xs /xr /fp5 /otexan /zp=4 RM = del TOPDIR = .. DEFINES = -DNDEBUG -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS LD = wcl386 LDFLAGS = -l=nt_win #GLLIBS = opengl32.lib glu32.lib INCDIRS = -I$(TOPDIR)\include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib & $(%WATCOM)\lib386\nt\comctl32.lib & $(%WATCOM)\lib386\nt\wsock32.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe PROGRAMS = shutterbug.exe OBJECTS = ShutterBug.obj Snapper.obj icons.obj ICONS = shutterbug.gif tinyshutterbug.gif & line_0.gif line_1.gif line_2.gif line_3.gif line_4.gif & line_5.gif line_6.gif line_7.gif line_8.gif .cpp.obj: .AUTODEPEND $(CXX) $(INCDIRS) $(CXXFLAGS) $(DEFINES) $*.cpp all: $(PROGRAMS) shutterbug.exe: $(OBJECTS) $(FOXLIB) $(LD) $(LDFLAGS) $(OBJECTS) $(FOXLIB) ShutterBug.obj: icons.h icons.cpp icons.h: $(ICONS) $(RESWRAP) -i -o icons.h $(ICONS) icons.cpp: $(ICONS) $(RESWRAP) -e -o icons.cpp $(ICONS) clean: .SYMBOLIC $(RM) *.obj $(RM) *.exe $(RM) *.err $(RM) icons.cpp $(RM) icons.h fox1.6-1.6.57/shutterbug/ShutterBug.cpp000066400000000000000000001062601326741342000176360ustar00rootroot00000000000000/******************************************************************************** * * * S h u t t e r B u g A p p l i c a t i o n * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: ShutterBug.cpp,v 1.49 2006/03/16 04:41:34 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "fxkeys.h" #include "FXPNGImage.h" #include "FXJPGImage.h" #include "FXTIFImage.h" #include "FXICOImage.h" #include "FXTGAImage.h" #include "FXRGBImage.h" #include "icons.h" #include "ShutterBug.h" #include "Snapper.h" /* Notes: - In fixed size mode you can just drag the snap rectangle around; it stays the same size. - Now remembers last selected filename and file type. - Add feature to cut shot to clipboard. */ #define FUDGE 10 // Corner fudge for diagonal dragging #define MINSIZE 8 // Minimum snap size #define VERSION_MAJOR 3 #define VERSION_MINOR 0 #define VERSION_PATCH 0 /*******************************************************************************/ // Map FXDEFMAP(ShutterBug) ShutterBugMap[]={ FXMAPFUNC(SEL_PAINT,0,ShutterBug::onPaint), FXMAPFUNC(SEL_MOTION,0,ShutterBug::onMotion), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,ShutterBug::onBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,ShutterBug::onBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,ShutterBug::onBtnPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,ShutterBug::onBtnRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,ShutterBug::onBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,ShutterBug::onBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,ShutterBug::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,ShutterBug::onKeyRelease), FXMAPFUNC(SEL_CLIPBOARD_LOST,0,ShutterBug::onClipboardLost), FXMAPFUNC(SEL_CLIPBOARD_REQUEST,0,ShutterBug::onClipboardRequest), FXMAPFUNC(SEL_TIMEOUT,ShutterBug::ID_SNAPSHOT,ShutterBug::onCmdSnap), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_SNAPSHOT,ShutterBug::onCmdSnap), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_SNAPSHOT_DELAYED,ShutterBug::onCmdSnapDelayed), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_SNAPSHOT_CLIPBOARD,ShutterBug::onCmdSnapClipboard), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_DELAY,ShutterBug::onCmdDelay), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_ABOUT,ShutterBug::onCmdAbout), FXMAPFUNC(SEL_UPDATE,ShutterBug::ID_TOGGLE_LASSO,ShutterBug::onUpdLasso), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_TOGGLE_LASSO,ShutterBug::onCmdLasso), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_QUIT,ShutterBug::onCmdQuit), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_COLOR,ShutterBug::onCmdLineColor), FXMAPFUNC(SEL_UPDATE,ShutterBug::ID_INSIDE,ShutterBug::onUpdLineInside), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_INSIDE,ShutterBug::onCmdLineInside), FXMAPFUNC(SEL_UPDATE,ShutterBug::ID_QUANTIZE,ShutterBug::onUpdQuantize), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_QUANTIZE,ShutterBug::onCmdQuantize), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_SET_COUNT,ShutterBug::onCmdSetCount), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_RESET_COUNT,ShutterBug::onCmdResetCount), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_RECORD_RATE,ShutterBug::onCmdRecordRate), FXMAPFUNC(SEL_TIMEOUT,ShutterBug::ID_RECORD_FRAME,ShutterBug::onCmdRecordFrame), FXMAPFUNC(SEL_COMMAND,ShutterBug::ID_RECORD_MOVIE,ShutterBug::onCmdRecordMovie), FXMAPFUNCS(SEL_LEFTBUTTONPRESS,ShutterBug::ID_SNAPPER_0,ShutterBug::ID_SNAPPER_3,ShutterBug::onPressSnapper), FXMAPFUNCS(SEL_LEFTBUTTONRELEASE,ShutterBug::ID_SNAPPER_0,ShutterBug::ID_SNAPPER_3,ShutterBug::onReleaseSnapper), FXMAPFUNCS(SEL_MIDDLEBUTTONPRESS,ShutterBug::ID_SNAPPER_0,ShutterBug::ID_SNAPPER_3,ShutterBug::onPressSnapper), FXMAPFUNCS(SEL_MIDDLEBUTTONRELEASE,ShutterBug::ID_SNAPPER_0,ShutterBug::ID_SNAPPER_3,ShutterBug::onReleaseSnapper), FXMAPFUNCS(SEL_RIGHTBUTTONPRESS,ShutterBug::ID_SNAPPER_0,ShutterBug::ID_SNAPPER_3,ShutterBug::onPressSnapper), FXMAPFUNCS(SEL_RIGHTBUTTONRELEASE,ShutterBug::ID_SNAPPER_0,ShutterBug::ID_SNAPPER_3,ShutterBug::onReleaseSnapper), FXMAPFUNCS(SEL_MOTION,ShutterBug::ID_SNAPPER_0,ShutterBug::ID_SNAPPER_3,ShutterBug::onMovedSnapper), FXMAPFUNCS(SEL_ENTER,ShutterBug::ID_SNAPPER_0,ShutterBug::ID_SNAPPER_3,ShutterBug::onEnterSnapper), FXMAPFUNCS(SEL_LEAVE,ShutterBug::ID_SNAPPER_0,ShutterBug::ID_SNAPPER_3,ShutterBug::onLeaveSnapper), FXMAPFUNCS(SEL_UPDATE,ShutterBug::ID_SIZE_SCREEN,ShutterBug::ID_SIZE_512X512,ShutterBug::onUpdSize), FXMAPFUNCS(SEL_COMMAND,ShutterBug::ID_SIZE_SCREEN,ShutterBug::ID_SIZE_512X512,ShutterBug::onCmdSize), FXMAPFUNCS(SEL_COMMAND,ShutterBug::ID_WEIGHT_0,ShutterBug::ID_WEIGHT_6,ShutterBug::onCmdLineWeight), }; // Implementation FXIMPLEMENT(ShutterBug,FXShell,ShutterBugMap,ARRAYNUMBER(ShutterBugMap)) // Pattern wildcards const FXchar patterns[]= "GIF Image (*.gif)" "\nBMP Image (*.bmp)" "\nXPM Image (*.xpm)" "\nPCX Image (*.pcx)" "\nRGB Image (*.rgb)" "\nXBM Image (*.xbm)" "\nTARGA Image (*.tga)" "\nPPM Image (*.ppm)" #ifdef HAVE_PNG_H "\nPNG Image (*.png)" #endif #ifdef HAVE_JPEG_H "\nJPEG Image (*.jpg)" #endif #ifdef HAVE_TIFF_H "\nTIFF Image (*.tif)" #endif "\nRAS Image (*.ras)" "\nPS Image (*.ps)" ; // Pattern numbers enum { TYPE_GIF ,TYPE_BMP ,TYPE_XPM ,TYPE_PCX ,TYPE_RGB ,TYPE_XBM ,TYPE_TGA ,TYPE_PPM #ifdef HAVE_PNG_H ,TYPE_PNG #endif #ifdef HAVE_JPEG_H ,TYPE_JPG #endif #ifdef HAVE_TIFF_H ,TYPE_TIF #endif ,TYPE_RAS ,TYPE_PS }; // Drag types FXDragType ShutterBug::dndTypes[7]={0,0,0,0,0,0,0}; /*******************************************************************************/ // ShutterBug main window ShutterBug::ShutterBug(FXApp* a):FXShell(a,0,0,0,0,0){ flags|=FLAG_ENABLED; rectangle.x=100; rectangle.y=100; rectangle.w=100; rectangle.h=100; filename="image.gif"; fileformat=TYPE_GIF; filecount=1; clipbuffer=NULL; clipwidth=0; clipheight=0; snapper[0]=new Snapper(getApp(),this,ID_SNAPPER_0); snapper[1]=new Snapper(getApp(),this,ID_SNAPPER_1); snapper[2]=new Snapper(getApp(),this,ID_SNAPPER_2); snapper[3]=new Snapper(getApp(),this,ID_SNAPPER_3); bigicon=new FXGIFIcon(getApp(),shutterbug); smallicon=new FXGIFIcon(getApp(),tinyshutterbug); weighticons[0]=new FXGIFIcon(getApp(),line_1); weighticons[1]=new FXGIFIcon(getApp(),line_2); weighticons[2]=new FXGIFIcon(getApp(),line_3); weighticons[3]=new FXGIFIcon(getApp(),line_4); weighticons[4]=new FXGIFIcon(getApp(),line_5); weighticons[5]=new FXGIFIcon(getApp(),line_6); weight=3; size=0; delay=3000; rate=1000; inside=FALSE; quantize=TRUE; spotx=0; spoty=0; mode=MODE_NONE; } // Snapper does override-redirect bool ShutterBug::doesOverrideRedirect() const { return true; } // Create and show window void ShutterBug::create(){ readRegistry(); FXShell::create(); dndTypes[0]=getApp()->registerDragType(FXBMPImage::mimeType); dndTypes[1]=getApp()->registerDragType(FXGIFImage::mimeType); dndTypes[2]=getApp()->registerDragType(FXXPMImage::mimeType); dndTypes[3]=getApp()->registerDragType(FXPPMImage::mimeType); dndTypes[4]=getApp()->registerDragType(FXJPGImage::mimeType); dndTypes[5]=getApp()->registerDragType(FXPNGImage::mimeType); dndTypes[6]=getApp()->registerDragType(FXTIFImage::mimeType); snapper[0]->create(); snapper[1]->create(); snapper[2]->create(); snapper[3]->create(); bigicon->create(); smallicon->create(); weighticons[0]->create(); weighticons[1]->create(); weighticons[2]->create(); weighticons[3]->create(); weighticons[4]->create(); weighticons[5]->create(); snapper[0]->setBackColor(color); snapper[1]->setBackColor(color); snapper[2]->setBackColor(color); snapper[3]->setBackColor(color); moveSnapRectangle(rectangle); showSnapRectangle(); setShape(bigicon); show(); } // Get default width FXint ShutterBug::getDefaultWidth(){ return bigicon->getWidth(); } // Get default height FXint ShutterBug::getDefaultHeight(){ return bigicon->getHeight(); } // Read registry void ShutterBug::readRegistry(){ filename=getApp()->reg().readStringEntry("SETTINGS","filename","image.gif"); fileformat=getApp()->reg().readIntEntry("SETTINGS","fileformat",TYPE_GIF); setX(getApp()->reg().readIntEntry("SETTINGS","x",50)); setY(getApp()->reg().readIntEntry("SETTINGS","y",50)); weight=getApp()->reg().readIntEntry("SETTINGS","weight",3); rectangle.x=getApp()->reg().readIntEntry("SETTINGS","snapx",50); rectangle.y=getApp()->reg().readIntEntry("SETTINGS","snapy",50); rectangle.w=getApp()->reg().readIntEntry("SETTINGS","snapw",50); rectangle.h=getApp()->reg().readIntEntry("SETTINGS","snaph",50); delay=getApp()->reg().readUnsignedEntry("SETTINGS","delay",3000); rate=getApp()->reg().readUnsignedEntry("SETTINGS","rate",1000); filecount=getApp()->reg().readIntEntry("SETTINGS","count",1); inside=getApp()->reg().readIntEntry("SETTINGS","inside",FALSE); color=getApp()->reg().readColorEntry("SETTINGS","color",FXRGB(255,128,128)); size=getApp()->reg().readIntEntry("SETTINGS","size",0); quantize=getApp()->reg().readIntEntry("SETTINGS","quantize",TRUE); if(size){ if(size<0){ rectangle.x=0; rectangle.y=0; rectangle.w=getRoot()->getWidth(); rectangle.h=getRoot()->getHeight(); } else{ rectangle.w=size; rectangle.h=size; } } } // Write registry void ShutterBug::writeRegistry(){ getApp()->reg().writeStringEntry("SETTINGS","filename",filename.text()); getApp()->reg().writeIntEntry("SETTINGS","fileformat",fileformat); getApp()->reg().writeIntEntry("SETTINGS","x",getX()); getApp()->reg().writeIntEntry("SETTINGS","y",getY()); getApp()->reg().writeIntEntry("SETTINGS","weight",weight); getApp()->reg().writeIntEntry("SETTINGS","snapx",rectangle.x); getApp()->reg().writeIntEntry("SETTINGS","snapy",rectangle.y); getApp()->reg().writeIntEntry("SETTINGS","snapw",rectangle.w); getApp()->reg().writeIntEntry("SETTINGS","snaph",rectangle.h); getApp()->reg().writeUnsignedEntry("SETTINGS","delay",delay); getApp()->reg().writeUnsignedEntry("SETTINGS","rate",rate); getApp()->reg().writeIntEntry("SETTINGS","count",filecount); getApp()->reg().writeIntEntry("SETTINGS","inside",inside); getApp()->reg().writeColorEntry("SETTINGS","color",color); getApp()->reg().writeIntEntry("SETTINGS","size",size); getApp()->reg().writeIntEntry("SETTINGS","quantize",quantize); } // Find out where window was grabbed FXuchar ShutterBug::where(FXint x,FXint y) const { FXuchar code=MODE_NONE; if(xsetDefaultCursor(getApp()->getDefaultCursor(DEF_DRAGH_CURSOR)); snapper[which]->setDragCursor(getApp()->getDefaultCursor(DEF_DRAGH_CURSOR)); break; case MODE_LEFT: case MODE_RIGHT: snapper[which]->setDefaultCursor(getApp()->getDefaultCursor(DEF_DRAGV_CURSOR)); snapper[which]->setDragCursor(getApp()->getDefaultCursor(DEF_DRAGV_CURSOR)); break; case MODE_TOPLEFT: case MODE_BOTTOMRIGHT: snapper[which]->setDefaultCursor(getApp()->getDefaultCursor(DEF_DRAGTL_CURSOR)); snapper[which]->setDragCursor(getApp()->getDefaultCursor(DEF_DRAGTL_CURSOR)); break; case MODE_TOPRIGHT: case MODE_BOTTOMLEFT: snapper[which]->setDefaultCursor(getApp()->getDefaultCursor(DEF_DRAGTR_CURSOR)); snapper[which]->setDragCursor(getApp()->getDefaultCursor(DEF_DRAGTR_CURSOR)); break; case MODE_WHOLERECT: snapper[which]->setDefaultCursor(getApp()->getDefaultCursor(DEF_MOVE_CURSOR)); snapper[which]->setDragCursor(getApp()->getDefaultCursor(DEF_MOVE_CURSOR)); break; default: snapper[which]->setDefaultCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); snapper[which]->setDragCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); break; } } // Handle repaint long ShutterBug::onPaint(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; FXDCWindow dc(this,event); dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); dc.setForeground(FXRGB(0,0,0)); dc.drawRectangle(0,0,width-1,height-1); dc.drawIcon(bigicon,0,0); return 1; } // Mouse motion long ShutterBug::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; if(flags&FLAG_PRESSED){ move(event->root_x-spotx,event->root_y-spoty); return 1; } return 0; } // Left button pressed long ShutterBug::onBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; grab(); spotx=event->win_x; spoty=event->win_y; flags|=FLAG_PRESSED; return 1; } // Left button released long ShutterBug::onBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; ungrab(); flags&=~FLAG_PRESSED; if(event->moved) return 1; FXMenuPane filemenu(this); new FXMenuCaption(&filemenu,"ShutterBug",smallicon); new FXMenuSeparator(&filemenu); new FXMenuCommand(&filemenu,tr("Snap..."),NULL,this,ID_SNAPSHOT); new FXMenuCommand(&filemenu,tr("Snap delayed..."),NULL,this,ID_SNAPSHOT_DELAYED); new FXMenuCommand(&filemenu,tr("Snap to clipboard..."),NULL,this,ID_SNAPSHOT_CLIPBOARD); new FXMenuCommand(&filemenu,tr("Record movie..."),NULL,this,ID_RECORD_MOVIE); new FXMenuCheck(&filemenu,tr("Show lasso"),this,ID_TOGGLE_LASSO); new FXMenuCheck(&filemenu,tr("Lines inside"),this,ID_INSIDE); new FXMenuCommand(&filemenu,tr("Color..."),NULL,this,ID_COLOR); FXMenuPane sizemenu(this); new FXMenuCascade(&filemenu,tr("Size"),NULL,&sizemenu); new FXMenuRadio(&sizemenu,"8x8",this,ID_SIZE_8X8); new FXMenuRadio(&sizemenu,"16x16",this,ID_SIZE_16X16); new FXMenuRadio(&sizemenu,"24x24",this,ID_SIZE_24X24); new FXMenuRadio(&sizemenu,"32x32",this,ID_SIZE_32X32); new FXMenuRadio(&sizemenu,"48x48",this,ID_SIZE_48X48); new FXMenuRadio(&sizemenu,"64x64",this,ID_SIZE_64X64); new FXMenuRadio(&sizemenu,"128x128",this,ID_SIZE_128X128); new FXMenuRadio(&sizemenu,"256x256",this,ID_SIZE_256X256); new FXMenuRadio(&sizemenu,"512x512",this,ID_SIZE_512X512); new FXMenuRadio(&sizemenu,tr("Screen"),this,ID_SIZE_SCREEN); new FXMenuRadio(&sizemenu,tr("Custom"),this,ID_SIZE_CUSTOM); FXMenuPane weightmenu(this); new FXMenuCascade(&filemenu,tr("Weight"),NULL,&weightmenu); new FXMenuCommand(&weightmenu,FXString::null,weighticons[0],this,ID_WEIGHT_1); new FXMenuCommand(&weightmenu,FXString::null,weighticons[1],this,ID_WEIGHT_2); new FXMenuCommand(&weightmenu,FXString::null,weighticons[2],this,ID_WEIGHT_3); new FXMenuCommand(&weightmenu,FXString::null,weighticons[3],this,ID_WEIGHT_4); new FXMenuCommand(&weightmenu,FXString::null,weighticons[4],this,ID_WEIGHT_5); new FXMenuCommand(&weightmenu,FXString::null,weighticons[5],this,ID_WEIGHT_6); FXMenuPane optionsmenu(this); new FXMenuCascade(&filemenu,tr("Options"),NULL,&optionsmenu); new FXMenuCommand(&optionsmenu,tr("Delay..."),NULL,this,ID_DELAY); new FXMenuCommand(&optionsmenu,tr("Set number..."),NULL,this,ID_SET_COUNT); new FXMenuCommand(&optionsmenu,tr("Reset number..."),NULL,this,ID_RESET_COUNT); new FXMenuCommand(&optionsmenu,tr("Record Rate..."),NULL,this,ID_RECORD_RATE); new FXMenuCheck(&optionsmenu,tr("Fast quantization"),this,ID_QUANTIZE); new FXMenuCommand(&filemenu,tr("About..."),NULL,this,ID_ABOUT); new FXMenuCommand(&filemenu,tr("Quit"),NULL,this,ID_QUIT); filemenu.create(); filemenu.popup(NULL,event->root_x,event->root_y); getApp()->runModalWhileShown(&filemenu); return 1; } // Keyboard press long ShutterBug::onKeyPress(FXObject*,FXSelector,void* ptr){ if(((FXEvent*)ptr)->code==KEY_q || ((FXEvent*)ptr)->code==KEY_Q){ FXTRACE((1,"quit\n")); writeRegistry(); getApp()->exit(); } return 1; } // Keyboard release long ShutterBug::onKeyRelease(FXObject*,FXSelector,void*){ return 1; } // Quit long ShutterBug::onCmdQuit(FXObject*,FXSelector,void*){ FXTRACE((1,"quit\n")); writeRegistry(); getApp()->exit(); return 1; } // Move snap rectangle void ShutterBug::moveSnapRectangle(const FXRectangle& r){ if(inside){ snapper[0]->position(r.x,r.y,weight,r.h); snapper[1]->position(r.x+r.w-weight,r.y,weight,r.h); snapper[2]->position(r.x,r.y,r.w,weight); snapper[3]->position(r.x,r.y+r.h-weight,r.w,weight); } else{ snapper[0]->position(r.x-weight,r.y-weight,weight,r.h+weight+weight); snapper[1]->position(r.x+r.w,r.y-weight,weight,r.h+weight+weight); snapper[2]->position(r.x-weight,r.y-weight,r.w+weight+weight,weight); snapper[3]->position(r.x-weight,r.y+r.h,r.w+weight+weight,weight); } snapper[0]->raise(); snapper[1]->raise(); snapper[2]->raise(); snapper[3]->raise(); } // Show snap rectangle void ShutterBug::showSnapRectangle(){ snapper[0]->show(); snapper[1]->show(); snapper[2]->show(); snapper[3]->show(); snapper[0]->raise(); snapper[1]->raise(); snapper[2]->raise(); snapper[3]->raise(); getApp()->flush(TRUE); } // Hide snap rectangle void ShutterBug::hideSnapRectangle(){ snapper[0]->hide(); snapper[1]->hide(); snapper[2]->hide(); snapper[3]->hide(); getApp()->flush(TRUE); } // Is snap rectangle shown FXbool ShutterBug::snapRectangleShown() const { return snapper[0]->shown(); } // Read pixels from root to image void ShutterBug::readPixels(FXImage* image,const FXRectangle& r){ FXDCWindow dc(image); dc.clipChildren(FALSE); dc.setFunction(BLT_SRC); dc.drawArea(getRoot(),r.x,r.y,r.w,r.h,0,0); } // Just snap a rectangle FXbool ShutterBug::grabRectangle(FXColor*& data,const FXRectangle& r){ data=NULL; if(1target==dndTypes[0] || event->target==dndTypes[1] || event->target==dndTypes[2] || event->target==dndTypes[3] || event->target==dndTypes[4] || event->target==dndTypes[5] || event->target==dndTypes[6]){ FXMemoryStream ms; // Open memory stream ms.open(FXStreamSave,NULL); // Render image to memory stream if(event->target==dndTypes[0]){ FXTRACE((1,"Request for bmpType\n")); fxsaveBMP(ms,clipbuffer,clipwidth,clipheight); } else if(event->target==dndTypes[1]){ FXTRACE((1,"Request for gifType\n")); fxsaveGIF(ms,clipbuffer,clipwidth,clipheight); } else if(event->target==dndTypes[2]){ FXTRACE((1,"Request for xpmType\n")); fxsaveXPM(ms,clipbuffer,clipwidth,clipheight); } else if(event->target==dndTypes[3]){ FXTRACE((1,"Request for ppmType\n")); fxsavePPM(ms,clipbuffer,clipwidth,clipheight); } else if(event->target==dndTypes[4]){ FXTRACE((1,"Request for jpgType\n")); fxsaveJPG(ms,clipbuffer,clipwidth,clipheight,75); } else if(event->target==dndTypes[5]){ FXTRACE((1,"Request for pngType\n")); fxsavePNG(ms,clipbuffer,clipwidth,clipheight); } else if(event->target==dndTypes[6]){ FXTRACE((1,"Request for tifType\n")); fxsaveTIF(ms,clipbuffer,clipwidth,clipheight,0); } #ifdef WIN32 // else if(event->target==imageType){ // FXTRACE((1,"Request for imageType\n")); // fxsaveBMP(ms,chart->getData(),chart->getWidth(),chart->getHeight()); // } #endif // Grab buffered image ms.takeBuffer(data,size); // Close memory stream ms.close(); // Set DND data setDNDData(FROM_CLIPBOARD,event->target,data,size); return 1; } } return 0; } // Snapshot to clipboard long ShutterBug::onCmdSnapClipboard(FXObject*,FXSelector,void*){ FXFREE(&clipbuffer); clipwidth=0; clipheight=0; if(acquireClipboard(dndTypes,ARRAYNUMBER(dndTypes))){ if(snapRectangle(clipbuffer,rectangle)){ clipwidth=rectangle.w; clipheight=rectangle.h; } } return 1; } // Snapshot after small delay long ShutterBug::onCmdSnapDelayed(FXObject*,FXSelector,void*){ getApp()->addTimeout(this,ID_SNAPSHOT,delay); return 1; } // Get frame number from filename static FXint frameFromFilename(const FXString& file){ FXint head=file.rfind(PATHSEP)+1; FXint tail=file.find('.',head); FXint frame=0; if(0addTimeout(this,ID_RECORD_FRAME,rate); } return 1; } // Record one frame long ShutterBug::onCmdRecordFrame(FXObject*,FXSelector,void*){ FXint curx,cury; FXuint state; FXColor *data=NULL; FXbool ok=FALSE; FXWindow *root=getRoot(); filename=filenameFromFrame(filename,filecount); FXTRACE((1,"Snap Frame: %s\n",filename.text())); if(grabRectangle(data,rectangle)){ ok=saveImage(filename,data,rectangle.w,rectangle.h); FXFREE(&data); } root->getCursorPosition(curx,cury,state); if(ok && root->getX()getWidth() && root->getY()getHeight()){ getApp()->addTimeout(this,ID_RECORD_FRAME,rate); filecount++; } else{ showSnapRectangle(); show(); } return 1; } // Set snapshot delay long ShutterBug::onCmdDelay(FXObject*,FXSelector,void*){ FXint time=(FXint)delay; if(FXInputDialog::getInteger(time,this,tr("Snap Shot Delay"),tr("Snapshot delay in milliseconds:"),NULL,100,10000)){ delay=(FXuint)time; } return 1; } // Set auto-recording rate long ShutterBug::onCmdRecordRate(FXObject*,FXSelector,void*){ FXint millisecs=(FXint)rate; if(FXInputDialog::getInteger(millisecs,this,tr("Record Rate"),tr("Record one frame every milliseconds:"),NULL,10,10000)){ rate=(FXuint)millisecs; } return 1; } // Set file count for auto-recording long ShutterBug::onCmdSetCount(FXObject*,FXSelector,void*){ FXint count=filecount; if(FXInputDialog::getInteger(count,this,tr("File number"),tr("File number to record next:"),NULL,1,1000000)){ filecount=count; } return 1; } // Reset auto-recording file count long ShutterBug::onCmdResetCount(FXObject*,FXSelector,void*){ filecount=1; return 1; } // Pressed on snapper long ShutterBug::onPressSnapper(FXObject*,FXSelector sel,void* ptr){ register FXint which=FXSELID(sel)-ID_SNAPPER_0; register FXEvent *event=(FXEvent*)ptr; if((event->state&CONTROLMASK) || (event->type!=SEL_LEFTBUTTONPRESS) || size){ mode=MODE_WHOLERECT; spotx=event->root_x-rectangle.x; spoty=event->root_y-rectangle.y; } else{ mode=where(event->root_x,event->root_y); if(mode&MODE_TOP) spoty=event->root_y-rectangle.y; else if(mode&MODE_BOTTOM) spoty=event->root_y-rectangle.y-rectangle.h; if(mode&MODE_LEFT) spotx=event->root_x-rectangle.x; else if(mode&MODE_RIGHT) spotx=event->root_x-rectangle.x-rectangle.w; } changeCursor(which,mode); snapper[0]->raise(); snapper[1]->raise(); snapper[2]->raise(); snapper[3]->raise(); raise(); return 1; } // Release on snapper long ShutterBug::onReleaseSnapper(FXObject*,FXSelector sel,void*){ register FXint which=FXSELID(sel)-ID_SNAPPER_0; mode=MODE_NONE; changeCursor(which,mode); return 1; } // Moved snapper long ShutterBug::onMovedSnapper(FXObject*,FXSelector sel,void* ptr){ register FXint which=FXSELID(sel)-ID_SNAPPER_0; register FXEvent *event=(FXEvent*)ptr; register FXuchar m; FXint t; FXTRACE((1,"%s::onMovedSnapper %d,%d\n",getClassName(),((FXEvent*)ptr)->win_x,((FXEvent*)ptr)->win_y)); if(mode!=MODE_NONE){ // Move whole rectangle if(mode&MODE_WHOLERECT){ rectangle.x=event->root_x-spotx; rectangle.y=event->root_y-spoty; } // Move corner of rectangle else{ // Vertical if(mode&MODE_TOP){ t=rectangle.y+rectangle.h-event->root_y+spoty; if(t>=MINSIZE){ rectangle.h=t; rectangle.y=event->root_y-spoty; } } else if(mode&MODE_BOTTOM){ t=event->root_y-spoty-rectangle.y; if(t>=MINSIZE){ rectangle.h=t; } } // Horizontal if(mode&MODE_LEFT){ t=rectangle.x+rectangle.w-event->root_x+spotx; if(t>=MINSIZE){ rectangle.w=t; rectangle.x=event->root_x-spotx; } } else if(mode&MODE_RIGHT){ t=event->root_x-spotx-rectangle.x; if(t>=MINSIZE){ rectangle.w=t; } } } // Update rectangle moveSnapRectangle(rectangle); m=mode; } else{ if((event->state&CONTROLMASK) || size) m=MODE_WHOLERECT; else m=where(event->root_x,event->root_y); } changeCursor(which,m); return 1; } // Entered snapper window long ShutterBug::onEnterSnapper(FXObject*,FXSelector sel,void* ptr){ register FXuchar m=MODE_WHOLERECT; if(!(((FXEvent*)ptr)->state&CONTROLMASK) && (0==size)){ m=where(((FXEvent*)ptr)->root_x,((FXEvent*)ptr)->root_y); } changeCursor(FXSELID(sel)-ID_SNAPPER_0,m); return 1; } // Left snapper window long ShutterBug::onLeaveSnapper(FXObject*,FXSelector,void*){ return 1; } // About box long ShutterBug::onCmdAbout(FXObject*,FXSelector,void*){ FXDialogBox about(this,tr("About ShutterBug"),DECOR_TITLE|DECOR_BORDER,0,0,0,0, 10,10,0,0, 0,0); new FXLabel(&about,FXString::null,bigicon,FRAME_GROOVE|LAYOUT_SIDE_LEFT|LAYOUT_CENTER_Y|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y); FXVerticalFrame* side=new FXVerticalFrame(&about,LAYOUT_SIDE_RIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 10,10,10,10, 0,0); new FXLabel(side,"ShutterBug",NULL,JUSTIFY_LEFT|ICON_BEFORE_TEXT|LAYOUT_FILL_X); new FXHorizontalSeparator(side,SEPARATOR_LINE|LAYOUT_FILL_X); new FXLabel(side,FXStringFormat(tr("\nFOX Screenshot Utility, version %d.%d.%d.\nShutterBug uses the FOX Toolkit version %d.%d.%d.\nCopyright (C) 2003,2005 Jeroen van der Zijp (jeroen@fox-toolkit.org).\n "),VERSION_MAJOR,VERSION_MINOR,VERSION_PATCH,FOX_MAJOR,FOX_MINOR,FOX_LEVEL),NULL,JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y); FXButton *button=new FXButton(side,tr("&OK"),NULL,&about,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT,0,0,0,0,32,32,2,2); button->setFocus(); about.execute(); return 1; } // Toggle lasso display long ShutterBug::onCmdLasso(FXObject*,FXSelector,void*){ if(snapRectangleShown()) hideSnapRectangle(); else showSnapRectangle(); return 1; } // Update toggle lasso long ShutterBug::onUpdLasso(FXObject* sender,FXSelector,void*){ sender->handle(this,snapRectangleShown()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Change size mode long ShutterBug::onCmdSize(FXObject*,FXSelector sel,void*){ size=FXSELID(sel)-ID_SIZE_CUSTOM; if(size){ if(size<0){ rectangle.x=0; rectangle.y=0; rectangle.w=getRoot()->getDefaultWidth(); rectangle.h=getRoot()->getDefaultHeight(); } else{ if(rectangle.x>getRoot()->getDefaultWidth()-size){ rectangle.x=getRoot()->getDefaultWidth()-size; } if(rectangle.y>getRoot()->getDefaultHeight()-size){ rectangle.y=getRoot()->getDefaultHeight()-size; } if(rectangle.x<0){ rectangle.x=0; } if(rectangle.y<0){ rectangle.y=0; } rectangle.w=size; rectangle.h=size; } FXTRACE((1,"x=%d y=%d w=%d h=%d\n",rectangle.x,rectangle.y,rectangle.w,rectangle.h)); moveSnapRectangle(rectangle); } return 1; } // Update change size mode long ShutterBug::onUpdSize(FXObject* sender,FXSelector sel,void*){ sender->handle(this,size==FXSELID(sel)-ID_SIZE_CUSTOM?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Change line weigth long ShutterBug::onCmdLineWeight(FXObject*,FXSelector sel,void*){ weight=FXSELID(sel)-ID_WEIGHT_0; moveSnapRectangle(rectangle); return 1; } // Change line color long ShutterBug::onCmdLineColor(FXObject*,FXSelector,void*){ FXColorDialog colordialog(this,tr("Line Color")); colordialog.setOpaqueOnly(TRUE); colordialog.setRGBA(color); if(colordialog.execute()){ color=colordialog.getRGBA(); snapper[0]->setBackColor(color); snapper[1]->setBackColor(color); snapper[2]->setBackColor(color); snapper[3]->setBackColor(color); } return 1; } // Lines inside area long ShutterBug::onCmdLineInside(FXObject*,FXSelector,void* ptr){ inside=(FXbool)(FXuval)ptr; moveSnapRectangle(rectangle); return 1; } // Update lines inside area long ShutterBug::onUpdLineInside(FXObject* sender,FXSelector,void*){ sender->handle(this,inside?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Quantization long ShutterBug::onCmdQuantize(FXObject*,FXSelector,void* ptr){ quantize=(FXbool)(FXuval)ptr; return 1; } // Update quantization long ShutterBug::onUpdQuantize(FXObject* sender,FXSelector,void*){ sender->handle(this,quantize?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Destroy main window ShutterBug::~ShutterBug(){ getApp()->removeTimeout(this,ID_RECORD_FRAME); getApp()->removeTimeout(this,ID_SNAPSHOT); FXFREE(&clipbuffer); delete snapper[0]; delete snapper[1]; delete snapper[2]; delete snapper[3]; delete bigicon; delete smallicon; delete weighticons[0]; delete weighticons[1]; delete weighticons[2]; delete weighticons[3]; delete weighticons[4]; delete weighticons[5]; } /*******************************************************************************/ // Start the whole thing int main(int argc,char *argv[]){ // Make application FXApp application("ShutterBug",FXString::null); // Open display application.init(argc,argv); // Main window new ShutterBug(&application); // Create app application.create(); // Run return application.run(); } fox1.6-1.6.57/shutterbug/ShutterBug.h000066400000000000000000000164671326741342000173140ustar00rootroot00000000000000/******************************************************************************** * * * S h u t t e r B u g A p p l i c a t i o n * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: ShutterBug.h,v 1.25 2006/01/22 17:58:15 fox Exp $ * ********************************************************************************/ #ifndef SHUTTERBUG_H #define SHUTTERBUG_H /*******************************************************************************/ class Snapper; // Mini application object class ShutterBug : public FXShell { FXDECLARE(ShutterBug) protected: FXString filename; // Filename last used FXint fileformat; // File format last chosen FXint filecount; // File count for numbered files FXColor *clipbuffer; // Clipped image buffer FXint clipwidth; // Clipped image width FXint clipheight; // Clipped image height Snapper *snapper[4]; // Sides of area FXIcon *bigicon; // Big application icon FXIcon *smallicon; // Small application icon FXIcon *weighticons[6]; // Line weight icons FXRectangle rectangle; // Rectangle to snap FXColor color; // Color of the snapshot lines FXint weight; // Weight of the snapshot lines FXint size; // Fixed size if not 0 FXuint delay; // Timer delay in ms FXuint rate; // Record rate in ms per frame FXbool inside; // Lines are inside FXbool quantize; // Quantization mode FXint spotx; // Grab-spot of mouse on rectangle FXint spoty; FXuchar mode; // Dragging mode protected: static FXDragType dndTypes[7]; // DND Types protected: ShutterBug(){} FXuchar where(FXint x,FXint y) const; void changeCursor(FXint which,FXuchar drag); void showSnapRectangle(); void hideSnapRectangle(); FXbool snapRectangleShown() const; void moveSnapRectangle(const FXRectangle& r); FXbool saveImage(const FXString& file,FXColor* data,FXint w,FXint h); FXbool snapRectangle(FXColor*& data,const FXRectangle& r); FXbool grabRectangle(FXColor*& data,const FXRectangle& r); void readPixels(FXImage* image,const FXRectangle& rectangle); virtual bool doesOverrideRedirect() const; protected: enum { MODE_NONE = 0, MODE_TOP = 1, MODE_BOTTOM = 2, MODE_LEFT = 4, MODE_RIGHT = 8, MODE_TOPLEFT = (MODE_TOP|MODE_LEFT), MODE_TOPRIGHT = (MODE_TOP|MODE_RIGHT), MODE_BOTTOMLEFT = (MODE_BOTTOM|MODE_LEFT), MODE_BOTTOMRIGHT = (MODE_BOTTOM|MODE_RIGHT), MODE_WHOLERECT = 16 }; private: ShutterBug(const ShutterBug&); ShutterBug &operator=(const ShutterBug&); public: long onPaint(FXObject*,FXSelector,void*); long onMotion(FXObject*,FXSelector,void*); long onBtnPress(FXObject*,FXSelector,void*); long onBtnRelease(FXObject*,FXSelector,void*); long onKeyPress(FXObject*,FXSelector,void*); long onKeyRelease(FXObject*,FXSelector,void*); long onPressSnapper(FXObject*,FXSelector,void*); long onReleaseSnapper(FXObject*,FXSelector,void*); long onMovedSnapper(FXObject*,FXSelector,void*); long onEnterSnapper(FXObject*,FXSelector,void*); long onLeaveSnapper(FXObject*,FXSelector,void*); long onCmdSnap(FXObject*,FXSelector,void*); long onCmdSnapDelayed(FXObject*,FXSelector,void*); long onCmdSnapClipboard(FXObject*,FXSelector,void*); long onCmdDelay(FXObject*,FXSelector,void*); long onCmdAbout(FXObject*,FXSelector,void*); long onCmdLasso(FXObject*,FXSelector,void*); long onUpdLasso(FXObject*,FXSelector,void*); long onCmdSize(FXObject*,FXSelector,void*); long onUpdSize(FXObject*,FXSelector,void*); long onCmdQuit(FXObject*,FXSelector,void*); long onCmdLineWeight(FXObject*,FXSelector,void*); long onCmdLineColor(FXObject*,FXSelector,void*); long onCmdLineInside(FXObject*,FXSelector,void*); long onUpdLineInside(FXObject*,FXSelector,void*); long onClipboardLost(FXObject*,FXSelector,void*); long onClipboardRequest(FXObject*,FXSelector,void*); long onCmdQuantize(FXObject*,FXSelector,void*); long onUpdQuantize(FXObject*,FXSelector,void*); long onCmdSetCount(FXObject*,FXSelector,void*); long onCmdResetCount(FXObject*,FXSelector,void*); long onCmdRecordRate(FXObject*,FXSelector,void*); long onCmdRecordFrame(FXObject*,FXSelector,void*); long onCmdRecordMovie(FXObject*,FXSelector,void*); public: enum { ID_SNAPSHOT=FXMainWindow::ID_LAST, ID_SNAPSHOT_DELAYED, ID_SNAPSHOT_CLIPBOARD, ID_RECORD_FRAME, ID_RECORD_MOVIE, ID_ABOUT, ID_TOGGLE_LASSO, ID_SNAPPER_0, ID_SNAPPER_1, ID_SNAPPER_2, ID_SNAPPER_3, ID_SIZE_SCREEN, ID_SIZE_CUSTOM, ID_SIZE_8X8=ID_SIZE_CUSTOM+8, ID_SIZE_16X16=ID_SIZE_CUSTOM+16, ID_SIZE_24X24=ID_SIZE_CUSTOM+24, ID_SIZE_32X32=ID_SIZE_CUSTOM+32, ID_SIZE_48X48=ID_SIZE_CUSTOM+48, ID_SIZE_64X64=ID_SIZE_CUSTOM+64, ID_SIZE_128X128=ID_SIZE_CUSTOM+128, ID_SIZE_256X256=ID_SIZE_CUSTOM+256, ID_SIZE_512X512=ID_SIZE_CUSTOM+512, ID_WEIGHT_0, ID_WEIGHT_1, ID_WEIGHT_2, ID_WEIGHT_3, ID_WEIGHT_4, ID_WEIGHT_5, ID_WEIGHT_6, ID_COLOR, ID_DELAY, ID_INSIDE, ID_QUANTIZE, ID_SET_COUNT, ID_RESET_COUNT, ID_RECORD_RATE, ID_QUIT, ID_LAST }; public: /// Construct calculator dialog ShutterBug(FXApp* a); /// Create virtual void create(); /// Return the default width of this window virtual FXint getDefaultWidth(); /// Return the default height of this window virtual FXint getDefaultHeight(); /// Read/write registry void readRegistry(); void writeRegistry(); /// Destroy calculator virtual ~ShutterBug(); }; #endif fox1.6-1.6.57/shutterbug/Snapper.cpp000066400000000000000000000052411326741342000171470ustar00rootroot00000000000000/******************************************************************************** * * * S n a p p e r W i d g e t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: Snapper.cpp,v 1.6 2006/01/22 17:58:15 fox Exp $ * ********************************************************************************/ #include "fx.h" #include "Snapper.h" /* Notes: */ /*******************************************************************************/ // Object implementation FXIMPLEMENT(Snapper,FXShell,NULL,0) // Deserialization Snapper::Snapper(){ flags|=FLAG_ENABLED; } // Create a toplevel window Snapper::Snapper(FXApp* a,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXShell(a,opts,x,y,w,h){ backColor=FXRGB(255,128,128); flags|=FLAG_ENABLED; target=tgt; message=sel; } // Get default width FXint Snapper::getDefaultWidth(){ return 1; } // Get default height FXint Snapper::getDefaultHeight(){ return 1; } // Snapper does override-redirect bool Snapper::doesOverrideRedirect() const { return true; } // Snapper does save-unders bool Snapper::doesSaveUnder() const { return false; } fox1.6-1.6.57/shutterbug/Snapper.h000066400000000000000000000045121326741342000166140ustar00rootroot00000000000000/******************************************************************************** * * * S n a p p e r W i d g e t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: Snapper.h,v 1.5 2006/01/22 17:58:16 fox Exp $ * ********************************************************************************/ #ifndef SNAPPER_H #define SNAPPER_H // Red snapper class Snapper : public FXShell { FXDECLARE(Snapper) protected: Snapper(); virtual bool doesOverrideRedirect() const; private: Snapper(const Snapper&); Snapper& operator=(const Snapper&); public: Snapper(FXApp* a,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); virtual FXint getDefaultWidth(); virtual FXint getDefaultHeight(); virtual bool doesSaveUnder() const; }; #endif fox1.6-1.6.57/shutterbug/icons.cpp000066400000000000000000000163211326741342000166530ustar00rootroot00000000000000/* Generated by reswrap version 4.0.0 */ /* created by reswrap from file line_0.gif */ extern const unsigned char line_0[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x40,0x00,0x08,0x00,0x80,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x40,0x00,0x08,0x00,0x00,0x02,0x14,0x84, 0x8f,0xa9,0xcb,0xed,0x0f,0xa3,0x9c,0xb4,0xda,0x8b,0xb3,0xde,0xbc,0xfb,0x0f,0x86, 0xe2,0x48,0x15,0x00,0x3b }; /* created by reswrap from file line_1.gif */ extern const unsigned char line_1[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x40,0x00,0x08,0x00,0xf0,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x40,0x00,0x08,0x00,0x00,0x02,0x1c,0x84, 0x8f,0xa9,0xcb,0xed,0x0f,0xa3,0x9c,0xb4,0xda,0x6b,0x82,0xde,0xbc,0xfb,0x0f,0x86, 0x62,0x88,0x95,0xe6,0x89,0xa6,0xea,0xca,0xb6,0x4f,0x01,0x00,0x3b }; /* created by reswrap from file line_2.gif */ extern const unsigned char line_2[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x40,0x00,0x08,0x00,0xf0,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x40,0x00,0x08,0x00,0x00,0x02,0x1e,0x84, 0x8f,0xa9,0xcb,0xed,0x0f,0xa3,0x9c,0xb4,0xda,0x8b,0xb3,0x3e,0xa1,0xfb,0x0f,0x86, 0xe2,0x48,0x96,0xe6,0x89,0xa6,0xea,0xb8,0xb5,0xee,0x0b,0x1f,0x05,0x00,0x3b }; /* created by reswrap from file line_3.gif */ extern const unsigned char line_3[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x40,0x00,0x08,0x00,0xf0,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x40,0x00,0x08,0x00,0x00,0x02,0x1f,0x84, 0x8f,0xa9,0xcb,0xed,0x0f,0xa3,0x9c,0x2c,0xd8,0x8b,0xb3,0xde,0xbc,0xfb,0x0f,0x86, 0xe2,0x48,0x96,0xe6,0x69,0x51,0xea,0xca,0xb6,0xee,0x0b,0xc7,0x50,0x01,0x00,0x3b }; /* created by reswrap from file line_4.gif */ extern const unsigned char line_4[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x40,0x00,0x08,0x00,0xf0,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x40,0x00,0x08,0x00,0x00,0x02,0x1f,0x84, 0x8f,0xa9,0xcb,0xed,0x0f,0xa3,0x9c,0x2c,0xd8,0x8b,0xb3,0xde,0xbc,0xfb,0x0f,0x86, 0xe2,0x48,0x96,0xe6,0x89,0xa6,0xea,0x45,0xb5,0xee,0x0b,0xc7,0x6d,0x01,0x00,0x3b }; /* created by reswrap from file line_5.gif */ extern const unsigned char line_5[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x40,0x00,0x08,0x00,0xf0,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x40,0x00,0x08,0x00,0x00,0x02,0x1e,0x84, 0x8f,0xa9,0xcb,0xed,0x1d,0xa2,0x9c,0xb4,0xda,0x8b,0xb3,0xde,0xbc,0xfb,0x0f,0x86, 0xe2,0x48,0x96,0xe6,0x39,0x3e,0xea,0xca,0xb6,0xee,0x0b,0xab,0x05,0x00,0x3b }; /* created by reswrap from file line_6.gif */ extern const unsigned char line_6[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x40,0x00,0x08,0x00,0xf0,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x40,0x00,0x08,0x00,0x00,0x02,0x1d,0x84, 0x8f,0xa9,0xcb,0xed,0x1d,0xa2,0x9c,0xb4,0xda,0x8b,0xb3,0xde,0xbc,0xfb,0x0f,0x86, 0xe2,0x48,0x96,0xe6,0x89,0xa6,0x6a,0xf5,0xb4,0xee,0xfb,0x16,0x00,0x3b }; /* created by reswrap from file line_7.gif */ extern const unsigned char line_7[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x40,0x00,0x08,0x00,0xf0,0x00,0x00,0xb2,0xc0,0xdc, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x40,0x00,0x08,0x00,0x00,0x02,0x1b,0x84, 0x8f,0xa9,0xcb,0xed,0x1d,0xa2,0x9c,0xb4,0xda,0x8b,0xb3,0xde,0xbc,0xfb,0x0f,0x86, 0xe2,0x48,0x96,0xe6,0x89,0xa6,0xea,0xca,0x72,0x05,0x00,0x3b }; /* created by reswrap from file line_8.gif */ extern const unsigned char line_8[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x40,0x00,0x08,0x00,0xf0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x40,0x00,0x08,0x00,0x00,0x02,0x14,0x84, 0x8f,0xa9,0xcb,0xed,0x0f,0xa3,0x9c,0xb4,0xda,0x8b,0xb3,0xde,0xbc,0xfb,0x0f,0x86, 0xe2,0x48,0x15,0x00,0x3b }; /* created by reswrap from file shutterbug.gif */ extern const unsigned char shutterbug[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x20,0x00,0x20,0x00,0xe3,0x00,0x00,0x00,0xcd,0xcd, 0xcc,0xcc,0xcc,0x00,0x00,0x00,0x30,0x30,0x30,0xff,0x7d,0x1d,0xff,0x00,0x00,0xff, 0xa5,0x00,0xff,0xff,0x00,0xca,0x29,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x04,0xf1,0x10,0xc8,0x09,0x82,0xa5,0x58,0xda, 0x90,0x7b,0x15,0x20,0xe7,0x05,0xa0,0x20,0x7a,0xd4,0x66,0x76,0xe4,0x86,0x56,0xee, 0xd4,0x6e,0xea,0x09,0x5f,0x72,0xb9,0x6e,0x43,0x3f,0x08,0xbe,0x81,0x8b,0x54,0xb2, 0xd1,0x4c,0xc0,0x01,0x61,0xc9,0x64,0xfa,0x66,0xb8,0x8c,0x45,0xb9,0x2c,0x58,0xaf, 0xbd,0x82,0x33,0xca,0xea,0x19,0xb2,0x57,0x6b,0xf0,0x4a,0xe8,0x9d,0xa2,0x01,0xea, 0x38,0xbc,0xb6,0x2e,0x85,0x1f,0x51,0x9a,0x20,0xf6,0x85,0xeb,0xf7,0xc2,0x73,0xa5, 0x51,0x62,0x07,0x79,0x81,0x7a,0x41,0x67,0x7e,0x82,0x87,0x75,0x4f,0x32,0x86,0x88, 0x81,0x3e,0x07,0x07,0x66,0x15,0x80,0x77,0x3a,0x96,0x02,0x77,0x8f,0x91,0x70,0x69, 0x05,0x96,0x88,0x63,0x49,0x84,0x1f,0x98,0x8d,0x8e,0x41,0x8a,0x69,0x08,0xa6,0x82, 0xa8,0x92,0xaa,0xac,0xa7,0x03,0x90,0x92,0x93,0xab,0x7f,0xa7,0x6c,0x3d,0xb4,0x70, 0xb6,0x7f,0x60,0xbf,0x94,0x89,0xb5,0x7d,0xb7,0x6d,0xc3,0xba,0x8a,0x8b,0x08,0xc6, 0xc2,0xba,0x77,0x08,0x7b,0x46,0x03,0xcc,0xb7,0xb1,0xcc,0x9c,0x7c,0x7d,0xd4,0xd6, 0x87,0xd5,0xc4,0x5c,0x30,0xdc,0xd5,0xe4,0xe5,0xd1,0xe1,0x32,0x35,0x3e,0xe6,0xdf, 0x66,0x26,0x31,0x1a,0x3a,0x1c,0x3c,0xae,0x66,0x17,0x44,0x21,0x29,0xf0,0x71,0x34, 0x16,0xda,0x37,0x36,0xa4,0xf8,0x0b,0x18,0x6f,0xdf,0x0b,0x7c,0x04,0x73,0xe4,0x7b, 0x91,0x2e,0xa1,0x3e,0x87,0x0c,0x23,0xa2,0x88,0x00,0x00,0x3b }; /* created by reswrap from file tinyshutterbug.gif */ extern const unsigned char tinyshutterbug[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x10,0x00,0xa5,0x00,0x00,0xff,0xff,0xff, 0xbf,0xbf,0xbf,0x7f,0x7f,0x7f,0x8b,0x8b,0x8b,0x97,0x76,0x5e,0x97,0x56,0x26,0x8b, 0x4a,0x1a,0x97,0x97,0x97,0xcb,0xcb,0xcb,0x97,0x80,0x57,0xff,0x1f,0x07,0xff,0x00, 0x00,0x63,0x24,0x24,0xff,0x3e,0x0e,0xcb,0x4a,0x1a,0x97,0x37,0x1f,0x30,0x30,0x30, 0x97,0x18,0x18,0x63,0x63,0x63,0xcb,0x2b,0x13,0x7f,0x00,0x00,0xff,0xff,0x00,0x57, 0x18,0x18,0xe4,0x14,0x29,0x97,0x97,0x18,0x7d,0x2c,0x41,0xcb,0x0c,0x0c,0xd7,0x1e, 0x3e,0x56,0x2e,0x38,0x8a,0x61,0x6c,0xa3,0x2a,0x4a,0xf1,0x0a,0x14,0xca,0x29,0x53, 0x57,0x57,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x00,0x00, 0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x06,0x8d,0x40,0x80,0x30,0x20,0x10,0x1a,0x89, 0xc6,0xa1,0x20,0x00,0x28,0x0e,0x99,0x02,0xe7,0x71,0x40,0x28,0x18,0x0a,0x85,0xc3, 0x20,0x29,0x44,0x24,0x0a,0x8a,0xc5,0x82,0xc1,0x68,0x38,0x0e,0x49,0x84,0xe3,0x01, 0x89,0x88,0xc9,0x62,0x87,0x24,0xc0,0x24,0x84,0xdd,0xe2,0xfc,0x02,0x02,0x41,0x23, 0x26,0x62,0x14,0x82,0x82,0x62,0x11,0x10,0x15,0x10,0x00,0x03,0x83,0x7a,0x0b,0x11, 0x11,0x16,0x7c,0x89,0x07,0x17,0x8d,0x7a,0x86,0x18,0x89,0x00,0x19,0x0b,0x1a,0x10, 0x1a,0x6f,0x0c,0x9d,0x87,0x12,0x42,0x07,0x1b,0x9e,0xa0,0x63,0xa2,0x0b,0x1c,0x10, 0x5b,0x42,0x1d,0x1e,0x1f,0x8d,0x1f,0x17,0x19,0x08,0x00,0x4c,0x5d,0x19,0x1e,0x20, 0xbf,0x20,0x19,0x1d,0x5c,0x44,0x45,0x03,0x07,0xc8,0x21,0xba,0x51,0xc4,0x4b,0x49, 0xcc,0x5c,0xd1,0xd2,0x00,0x41,0x00,0x3b }; fox1.6-1.6.57/shutterbug/icons.h000066400000000000000000000017361326741342000163240ustar00rootroot00000000000000/* Generated by reswrap version 4.0.0 */ /* created by reswrap from file line_0.gif */ extern const unsigned char line_0[]; /* created by reswrap from file line_1.gif */ extern const unsigned char line_1[]; /* created by reswrap from file line_2.gif */ extern const unsigned char line_2[]; /* created by reswrap from file line_3.gif */ extern const unsigned char line_3[]; /* created by reswrap from file line_4.gif */ extern const unsigned char line_4[]; /* created by reswrap from file line_5.gif */ extern const unsigned char line_5[]; /* created by reswrap from file line_6.gif */ extern const unsigned char line_6[]; /* created by reswrap from file line_7.gif */ extern const unsigned char line_7[]; /* created by reswrap from file line_8.gif */ extern const unsigned char line_8[]; /* created by reswrap from file shutterbug.gif */ extern const unsigned char shutterbug[]; /* created by reswrap from file tinyshutterbug.gif */ extern const unsigned char tinyshutterbug[]; fox1.6-1.6.57/shutterbug/line_0.gif000066400000000000000000000000651326741342000166670ustar00rootroot00000000000000GIF87a@€˛ŔÜ,@„Ź©ËíŁś´Ú‹łŢĽű†âH;fox1.6-1.6.57/shutterbug/line_1.gif000066400000000000000000000000751326741342000166710ustar00rootroot00000000000000GIF87a@đ˛ŔÜ,@„Ź©ËíŁś´Úk‚ŢĽű†b•扦ęʶO;fox1.6-1.6.57/shutterbug/line_2.gif000066400000000000000000000000771326741342000166740ustar00rootroot00000000000000GIF87a@đ˛ŔÜ,@„Ź©ËíŁś´Ú‹ł>ˇű†âH–扦긵î ;fox1.6-1.6.57/shutterbug/line_3.gif000066400000000000000000000001001326741342000166600ustar00rootroot00000000000000GIF87a@đ˛ŔÜ,@„Ź©ËíŁś,Ř‹łŢĽű†âH–ćiQęʶî ÇP;fox1.6-1.6.57/shutterbug/line_4.gif000066400000000000000000000001001326741342000166610ustar00rootroot00000000000000GIF87a@đ˛ŔÜ,@„Ź©ËíŁś,Ř‹łŢĽű†âH–扦ęEµî Çm;fox1.6-1.6.57/shutterbug/line_5.gif000066400000000000000000000000771326741342000166770ustar00rootroot00000000000000GIF87a@đ˛ŔÜ,@„Ź©Ëí˘ś´Ú‹łŢĽű†âH–ć9>ęĘ¶î «;fox1.6-1.6.57/shutterbug/line_6.gif000066400000000000000000000000761326741342000166770ustar00rootroot00000000000000GIF87a@đ˛ŔÜ,@„Ź©Ëí˘ś´Ú‹łŢĽű†âH–扦jő´îű;fox1.6-1.6.57/shutterbug/line_7.gif000066400000000000000000000000741326741342000166760ustar00rootroot00000000000000GIF87a@đ˛ŔÜ,@„Ź©Ëí˘ś´Ú‹łŢĽű†âH–扦ęĘr;fox1.6-1.6.57/shutterbug/line_8.gif000066400000000000000000000000651326741342000166770ustar00rootroot00000000000000GIF87a@đ,@„Ź©ËíŁś´Ú‹łŢĽű†âH;fox1.6-1.6.57/shutterbug/shutterbug.1000066400000000000000000000050301326741342000173050ustar00rootroot00000000000000.TH CALCULATOR 1 "18 January 2004" .SH NAME shutterbug \- screen snapshot application .SH SYNOPSIS \fBshutterbug\fP .SH DESCRIPTION .LP Shutterbug is a simple screen snapshot application inspired by SGI Snapshot. The user interface of Shutterbug consists of a single, unobstrusive icon. All functions in Shutterbug are invoked by right-clicking on this icon, which will bring up a popup menu. A red rectangle identifies the area of the screen being captured. .SH IDENTIFYING THE SCREEN AREA The screen capture area is identified by a red rectangle. The capture area can be moved around by right-mouse dragging, or by holding the shift- or control key during left-mouse dragging. The size of the rectangle can be changed by dragging on one of the four sides or on the corners. The capture area can also be set to a predefined, fixed size. In that case the rectangle can not be resized, but only dragged to a specific position. .SH INVOKING COMMANDS To invoke the menu, right-click on the Shutterbug application icon. .TP .I Snap This command snaps a screen shot and brings up the file panel to save the image to file. .TP .I Show Lasso This command hides the red lasso identifying the capture area. .TP .I Size Brings up a submenu with a number of predefined capture area sizes. Selecting .I Custom will enable arbitrary capture area selection. .TP .I Weight This submenu can be used to change the line width of the capture area lasso rectangle. .TP .I Lines inside Causes the lines to be inside, rather than outside the capture area rectangle. This can be more accurate for small images. .TP .I Color Brings up the Color Dialog to change the color of the lasso rectangle. The default color is red. .TP .I About Pops up the About Dialog which gives the version number and other information about Shutterbug. .TP .I Quit Terminates the program. .SH SUPPORTED IMAGE FORMATS Shutterbug supports the following image formats: .I GIF CompuServe Graphics Interchange Format, version 89a. .BR .I BMP Microsoft Bitmap Format. .BR .I XPM X Pixmap Format. .BR .I XBM X Bitmap Format (black and white). .BR .I PCX PC PaintBrush format. .BR .I TGA Targa Image format. .BR .I PPM Portable Pixmap Format. .BR .I PNG Portable Network Graphics Format (if compiled in). .BR .I JPG Joint Photographics Experts Group JPEG Format (if compiled in). .BR .I TIFF Tagged Image File Format (if compiled in). .BR .I SUN Raster Image Format. .BR .I PostScript Adobe PostScipt format. .BR .SH AUTHOR This man page was written by Jeroen van der Zijp . fox1.6-1.6.57/shutterbug/shutterbug.gif000066400000000000000000000004741326741342000177210ustar00rootroot00000000000000GIF87a ăÍÍĚĚĚ000˙}˙˙Ą˙˙Ę)S, ńČ ‚ĄXÚ{ ç  zÔfvä†VîÔnę _rąnC?ľ‹T˛ŃLŔaÉdúf¸ŚEą,XŻ˝‚3Ęę˛WkđJ蝢ę8Ľ¶.…Qš ö…ë÷ÂsĄQbyzAg~‚‡uO2†>f€w:–wŹ‘pi–cI„ŤŽAŠi¦‚¨’ެ§’“«§l=´p¶`ż”‰µ}·mĂşŠ‹ĆÂşw{FĚ·±Ěś|}ÔÖ‡ŐÄ\0ÜŐäĺŃá25>ćßf&1:<®fD!)đq4Ú76¤ř oß |sä{‘.ˇ>‡ #˘;fox1.6-1.6.57/shutterbug/tinyshutterbug.gif000066400000000000000000000005501326741342000206200ustar00rootroot00000000000000GIF87aĄ˙˙˙żżż‹‹‹—v^—V&‹J———ËËË—€W˙˙c$$˙>ËJ—7000—cccË+˙˙Wä)——},AË ×>V.8ŠalŁ*Jń Ę)SWWW,Ť@€0 ‰Ćˇ (™çq@( …Ă )D$ ŠĹ‚Áh8I„ă‰Éb‡$Ŕ$„ÝâüA#&b‚‚bz |‰Ťz†‰ o ť‡Bž c˘ [BŤL] ż \DEČ!şQÄKIĚ\ŃŇA;fox1.6-1.6.57/src/000077500000000000000000000000001326741342000134245ustar00rootroot00000000000000fox1.6-1.6.57/src/FX4Splitter.cpp000066400000000000000000000445171326741342000162730ustar00rootroot00000000000000/******************************************************************************** * * * F o u r - W a y S p l i t t e r * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FX4Splitter.cpp,v 1.52 2006/02/20 03:32:13 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FX4Splitter.h" /* Notes: - 4Splitter always splits into four partitions. - 4Splitter determines pane sizes by split fraction, i.e. if 4Splitter resizes, each sub pane gets proportionally resized also. - Should we send SEL_CHANGED and SEL_COMMAND also when splitter arrangement was changed programmatically? - Slightly complex code which takes care of expanding subsets of panels judiciously added 2/8/2006. */ // Splitter styles #define FOURSPLITTER_MASK FOURSPLITTER_TRACKING // Modes #define NOWHERE 0 #define ONVERTICAL 1 #define ONHORIZONTAL 2 #define ONCENTER (ONVERTICAL|ONHORIZONTAL) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FX4Splitter) FX4SplitterMap[]={ FXMAPFUNC(SEL_MOTION,0,FX4Splitter::onMotion), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FX4Splitter::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FX4Splitter::onLeftBtnRelease), FXMAPFUNC(SEL_FOCUS_UP,0,FX4Splitter::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FX4Splitter::onFocusDown), FXMAPFUNC(SEL_FOCUS_LEFT,0,FX4Splitter::onFocusLeft), FXMAPFUNC(SEL_FOCUS_RIGHT,0,FX4Splitter::onFocusRight), FXMAPFUNCS(SEL_UPDATE,FX4Splitter::ID_EXPAND_NONE,FX4Splitter::ID_EXPAND_ALL,FX4Splitter::onUpdExpand), FXMAPFUNCS(SEL_COMMAND,FX4Splitter::ID_EXPAND_NONE,FX4Splitter::ID_EXPAND_ALL,FX4Splitter::onCmdExpand), }; // Object implementation FXIMPLEMENT(FX4Splitter,FXComposite,FX4SplitterMap,ARRAYNUMBER(FX4SplitterMap)) // Make a splitter FX4Splitter::FX4Splitter(){ flags|=FLAG_ENABLED|FLAG_SHOWN; splitx=0; splity=0; barsize=4; fhor=5000; fver=5000; offx=0; offy=0; mode=NOWHERE; } // Make a splitter; it has no interior padding, and no borders FX4Splitter::FX4Splitter(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h):FXComposite(p,opts,x,y,w,h){ defaultCursor=getApp()->getDefaultCursor(DEF_ARROW_CURSOR); dragCursor=defaultCursor; flags|=FLAG_ENABLED|FLAG_SHOWN; splitx=0; splity=0; barsize=4; fhor=5000; fver=5000; offx=0; offy=0; mode=NOWHERE; } // Make a splitter; it has no interior padding, and no borders FX4Splitter::FX4Splitter(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h):FXComposite(p,opts,x,y,w,h){ defaultCursor=getApp()->getDefaultCursor(DEF_ARROW_CURSOR); dragCursor=defaultCursor; flags|=FLAG_ENABLED|FLAG_SHOWN; target=tgt; message=sel; splitx=0; splity=0; barsize=4; fhor=5000; fver=5000; offx=0; offy=0; mode=NOWHERE; } // Get top left child FXWindow *FX4Splitter::getTopLeft() const { return getFirst(); } // Get top right child FXWindow *FX4Splitter::getTopRight() const { if(!getTopLeft()) return NULL; return getTopLeft()->getNext(); } // Get bottom left child FXWindow *FX4Splitter::getBottomLeft() const { if(!getTopRight()) return NULL; return getTopRight()->getNext(); } // Get bottom right child FXWindow *FX4Splitter::getBottomRight() const { if(!getBottomLeft()) return NULL; return getBottomLeft()->getNext(); } // Get default width FXint FX4Splitter::getDefaultWidth(){ FXWindow *tl=getTopLeft(); FXWindow *tr=getTopRight(); FXWindow *bl=getBottomLeft(); FXWindow *br=getBottomRight(); FXint tlw=0,blw=0,trw=0,brw=0,set=0; if(tl && tl->shown()){ tlw=tl->getDefaultWidth(); set|=ExpandTopLeft; } if(tr && tr->shown()){ trw=tr->getDefaultWidth(); set|=ExpandTopRight; } if(bl && bl->shown()){ blw=bl->getDefaultWidth(); set|=ExpandBottomLeft; } if(br && br->shown()){ brw=br->getDefaultWidth(); set|=ExpandBottomRight; } switch(set){ case ExpandTopLeft: return tlw; case ExpandTopRight: return trw; case ExpandBottomRight: return brw; case ExpandBottomLeft: return blw; case ExpandTopLeft|ExpandTopRight: return trw+tlw+barsize; case ExpandBottomLeft|ExpandBottomRight: return brw+blw+barsize; case ExpandBottomLeft|ExpandTopLeft: return FXMAX(tlw,blw); case ExpandBottomLeft|ExpandTopRight: return FXMAX(blw,trw); case ExpandBottomRight|ExpandTopLeft: return FXMAX(brw,tlw); case ExpandBottomRight|ExpandTopRight: return FXMAX(brw,trw); case ExpandBottomLeft|ExpandTopLeft|ExpandTopRight: return FXMAX(trw+tlw+barsize,blw); case ExpandBottomRight|ExpandTopLeft|ExpandTopRight: return FXMAX(trw+tlw+barsize,brw); case ExpandTopLeft|ExpandBottomLeft|ExpandBottomRight: return FXMAX(brw+blw+barsize,tlw); case ExpandTopRight|ExpandBottomLeft|ExpandBottomRight: return FXMAX(brw+blw+barsize,trw); case ExpandTopLeft|ExpandBottomLeft|ExpandTopRight|ExpandBottomRight: return barsize+FXMAX(tlw,blw)+FXMAX(trw,brw); } return 0; } // Get default height FXint FX4Splitter::getDefaultHeight(){ FXWindow *tl=getTopLeft(); FXWindow *tr=getTopRight(); FXWindow *bl=getBottomLeft(); FXWindow *br=getBottomRight(); FXint tlh=0,blh=0,trh=0,brh=0,set=0; if(tl && tl->shown()){ tlh=tl->getDefaultHeight(); set|=ExpandTopLeft; } if(tr && tr->shown()){ trh=tr->getDefaultHeight(); set|=ExpandTopRight; } if(bl && bl->shown()){ blh=bl->getDefaultHeight(); set|=ExpandBottomLeft; } if(br && br->shown()){ brh=br->getDefaultHeight(); set|=ExpandBottomRight; } switch(set){ case ExpandTopLeft: return tlh; case ExpandTopRight: return trh; case ExpandBottomRight: return brh; case ExpandBottomLeft: return blh; case ExpandTopLeft|ExpandTopRight: return FXMAX(tlh,trh); case ExpandBottomLeft|ExpandBottomRight: return FXMAX(blh,brh); case ExpandBottomLeft|ExpandTopLeft: return blh+tlh+barsize; case ExpandBottomLeft|ExpandTopRight: return blh+trh+barsize; case ExpandBottomRight|ExpandTopLeft: return brh+tlh+barsize; case ExpandBottomRight|ExpandTopRight: return brh+trh+barsize; case ExpandBottomLeft|ExpandTopLeft|ExpandTopRight: return FXMAX(tlh,trh)+blh+barsize; case ExpandBottomRight|ExpandTopLeft|ExpandTopRight: return FXMAX(tlh,trh)+brh+barsize; case ExpandTopLeft|ExpandBottomLeft|ExpandBottomRight: return FXMAX(blh,brh)+tlh+barsize; case ExpandTopRight|ExpandBottomLeft|ExpandBottomRight: return FXMAX(blh,brh)+trh+barsize; case ExpandTopLeft|ExpandBottomLeft|ExpandTopRight|ExpandBottomRight: return barsize+FXMAX(tlh,trh)+FXMAX(blh,brh); } return 0; } // Recompute layout void FX4Splitter::layout(){ FXWindow *tl=getTopLeft(); FXWindow *tr=getTopRight(); FXWindow *bl=getBottomLeft(); FXWindow *br=getBottomRight(); FXuint set=getExpanded(); FXint tsx,bsx,osy; FXASSERT(0<=fhor && fhor<=10000); FXASSERT(0<=fver && fver<=10000); // Proposed split location splitx=(fhor*(width-barsize))/10000; splity=(fver*(height-barsize))/10000; tsx=bsx=splitx; osy=splity; switch(set){ case ExpandTopLeft: tsx=bsx=width; osy=height; break; case ExpandTopRight: tsx=bsx=-barsize; osy=height; break; case ExpandBottomRight: tsx=bsx=-barsize; osy=-barsize; break; case ExpandBottomLeft: tsx=bsx=width; osy=-barsize; break; case ExpandTopLeft|ExpandTopRight: tsx=bsx=splitx; osy=height; break; case ExpandBottomLeft|ExpandBottomRight: tsx=bsx=splitx; osy=-barsize; break; case ExpandBottomLeft|ExpandTopLeft: tsx=bsx=width; osy=splity; break; case ExpandBottomLeft|ExpandTopRight: tsx=-barsize; bsx=width; osy=splity; break; case ExpandBottomRight|ExpandTopLeft: tsx=width; bsx=-barsize; osy=splity; break; case ExpandBottomRight|ExpandTopRight: tsx=bsx=-barsize; osy=splity; break; case ExpandBottomLeft|ExpandTopLeft|ExpandTopRight: tsx=splitx; bsx=width; osy=splity; break; case ExpandBottomRight|ExpandTopLeft|ExpandTopRight: tsx=splitx; bsx=-barsize; osy=splity; break; case ExpandTopLeft|ExpandBottomLeft|ExpandBottomRight: tsx=width; bsx=splitx; osy=splity; break; case ExpandTopRight|ExpandBottomLeft|ExpandBottomRight: tsx=-barsize; bsx=splitx; osy=splity; break; case ExpandTopLeft|ExpandBottomLeft|ExpandTopRight|ExpandBottomRight: tsx=bsx=splitx; osy=splity; break; } // Arrange the kids if(tl) tl->position(0,0,tsx,osy); if(tr) tr->position(tsx+barsize,0,width-tsx-barsize,osy); if(bl) bl->position(0,osy+barsize,bsx,height-osy-barsize); if(br) br->position(bsx+barsize,osy+barsize,width-bsx-barsize,height-osy-barsize); // Layout ok now flags&=~FLAG_DIRTY; } // Determine split mode FXuchar FX4Splitter::getMode(FXint x,FXint y){ register FXuchar mm=ONCENTER; if(x=splitx+barsize) mm&=~ONVERTICAL; if(y>=splity+barsize) mm&=~ONHORIZONTAL; return mm; } // Move the split intelligently void FX4Splitter::moveSplit(FXint x,FXint y){ if(x<0) x=0; if(y<0) y=0; if(x>width-barsize) x=width-barsize; if(y>height-barsize) y=height-barsize; splitx=x; splity=y; } // Draw the horizontal split void FX4Splitter::drawSplit(FXint x,FXint y,FXuint m){ FXDCWindow dc(this); dc.clipChildren(FALSE); dc.setFunction(BLT_NOT_DST); if(m&ONVERTICAL){ dc.fillRectangle(x,0,barsize,height); } if(m&ONHORIZONTAL){ dc.fillRectangle(0,y,width,barsize); } } // Adjust layout void FX4Splitter::adjustLayout(){ fhor=(width>barsize) ? (10000*splitx+(width-barsize-1))/(width-barsize) : 0; fver=(height>barsize) ? (10000*splity+(height-barsize-1))/(height-barsize) : 0; recalc(); } // Button being pressed long FX4Splitter::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; mode=getMode(ev->win_x,ev->win_y); if(mode){ offx=ev->win_x-splitx; offy=ev->win_y-splity; if(!(options&FOURSPLITTER_TRACKING)){ drawSplit(splitx,splity,mode); } flags&=~FLAG_UPDATE; } return 1; } return 0; } // Button being released long FX4Splitter::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXuint f=flags; FXuint m=mode; if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; flags&=~FLAG_CHANGED; mode=NOWHERE; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(m){ if(!(options&FOURSPLITTER_TRACKING)){ drawSplit(splitx,splity,m); adjustLayout(); if(f&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } if(f&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),NULL); } } return 1; } return 0; } // Button being released long FX4Splitter::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; FXint oldsplitx=splitx; FXint oldsplity=splity; switch(mode){ case ONCENTER: moveSplit(ev->win_x-offx,ev->win_y-offy); break; case ONVERTICAL: moveSplit(ev->win_x-offx,splity); break; case ONHORIZONTAL: moveSplit(splitx,ev->win_y-offy); break; default: switch(getMode(ev->win_x,ev->win_y)){ case ONCENTER: setDefaultCursor(getApp()->getDefaultCursor(DEF_XSPLIT_CURSOR)); setDragCursor(getApp()->getDefaultCursor(DEF_XSPLIT_CURSOR)); break; case ONVERTICAL: setDefaultCursor(getApp()->getDefaultCursor(DEF_HSPLIT_CURSOR)); setDragCursor(getApp()->getDefaultCursor(DEF_HSPLIT_CURSOR)); break; case ONHORIZONTAL: setDefaultCursor(getApp()->getDefaultCursor(DEF_VSPLIT_CURSOR)); setDragCursor(getApp()->getDefaultCursor(DEF_VSPLIT_CURSOR)); break; default: setDefaultCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); setDragCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); break; } return 1; } if((oldsplitx!=splitx) || (oldsplity!=splity)){ flags|=FLAG_CHANGED; if(!(options&FOURSPLITTER_TRACKING)){ drawSplit(oldsplitx,oldsplity,mode); drawSplit(splitx,splity,mode); } else{ adjustLayout(); if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } return 1; } // Focus moved up long FX4Splitter::onFocusUp(FXObject*,FXSelector,void* ptr){ FXWindow *child=NULL; if(getFocus()){ if(getFocus()==getBottomLeft()) child=getTopLeft(); else if(getFocus()==getBottomRight()) child=getTopRight(); } else{ child=getLast(); } if(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_UP,0),ptr)) return 1; } } return 0; } // Focus moved down long FX4Splitter::onFocusDown(FXObject*,FXSelector,void* ptr){ FXWindow *child=NULL; if(getFocus()){ if(getFocus()==getTopLeft()) child=getBottomLeft(); else if(getFocus()==getTopRight()) child=getBottomRight(); } else{ child=getFirst(); } if(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_DOWN,0),ptr)) return 1; } } return 0; } // Focus moved to left long FX4Splitter::onFocusLeft(FXObject*,FXSelector,void* ptr){ FXWindow *child=NULL; if(getFocus()){ if(getFocus()==getTopRight()) child=getTopLeft(); else if(getFocus()==getBottomRight()) child=getBottomLeft(); } else{ child=getLast(); } if(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_LEFT,0),ptr)) return 1; } } return 0; } // Focus moved to right long FX4Splitter::onFocusRight(FXObject*,FXSelector,void* ptr){ FXWindow *child=NULL; if(getFocus()){ if(getFocus()==getTopLeft()) child=getTopRight(); else if(getFocus()==getBottomLeft()) child=getBottomRight(); } else{ child=getFirst(); } if(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_RIGHT,0),ptr)) return 1; } } return 0; } // Show the pane(s) long FX4Splitter::onCmdExpand(FXObject*,FXSelector sel,void*){ FXuint ex=FXSELID(sel)-ID_EXPAND_NONE; setExpanded(ex); return 1; } // Update show pane long FX4Splitter::onUpdExpand(FXObject* sender,FXSelector sel,void*){ register FXuint ex=FXSELID(sel)-ID_EXPAND_NONE; sender->handle(this,(getExpanded()==ex)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Change horizontal split [fraction*10000] void FX4Splitter::setHSplit(FXint s){ if(s<0) s=0; if(s>10000) s=10000; if(s!=fhor){ fhor=s; recalc(); } } // Change vertical split [fraction*10000] void FX4Splitter::setVSplit(FXint s){ if(s<0) s=0; if(s>10000) s=10000; if(s!=fver){ fver=s; recalc(); } } // Save object to stream void FX4Splitter::save(FXStream& store) const { FXComposite::save(store); store << barsize; store << fhor; store << fver; } // Load object from stream void FX4Splitter::load(FXStream& store){ FXComposite::load(store); store >> barsize; store >> fhor; store >> fver; } // Return splitter style FXuint FX4Splitter::getSplitterStyle() const { return (options&FOURSPLITTER_MASK); } // Change mode void FX4Splitter::setSplitterStyle(FXuint style){ options=(options&~FOURSPLITTER_MASK) | (style&FOURSPLITTER_MASK); } // Expand one or all of the four panes void FX4Splitter::setExpanded(FXuint set){ FXWindow *tl=getTopLeft(); FXWindow *tr=getTopRight(); FXWindow *bl=getBottomLeft(); FXWindow *br=getBottomRight(); if(tl){ if(set&ExpandTopLeft) tl->show(); else tl->hide(); } if(tr){ if(set&ExpandTopRight) tr->show(); else tr->hide(); } if(bl){ if(set&ExpandBottomLeft) bl->show(); else bl->hide(); } if(br){ if(set&ExpandBottomRight) br->show(); else br->hide(); } recalc(); } // Get set of expanded children FXuint FX4Splitter::getExpanded() const { FXWindow *tl=getTopLeft(); FXWindow *tr=getTopRight(); FXWindow *bl=getBottomLeft(); FXWindow *br=getBottomRight(); FXuint set=0; if(tl && tl->shown()) set|=ExpandTopLeft; if(tr && tr->shown()) set|=ExpandTopRight; if(bl && bl->shown()) set|=ExpandBottomLeft; if(br && br->shown()) set|=ExpandBottomRight; return set; } // Change bar size void FX4Splitter::setBarSize(FXint bs){ if(bs<1) bs=1; if(bs!=barsize){ barsize=bs; recalc(); } } } fox1.6-1.6.57/src/FX7Segment.cpp000066400000000000000000000375141326741342000160710ustar00rootroot00000000000000/******************************************************************************** * * * 7 - S e g m e n t D i s p l a y W i d g e t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FX7Segment.cpp,v 1.19.2.1 2007/08/11 00:50:32 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFrame.h" #include "FX7Segment.h" /* Notes: - Emulate old LED or LCD Display. - Segment numbering: 01 ----- 02 | | 04 ++ | 08 | ++ ----- 10 | | 20 ++ 100 | | ++ ----- o 80 40 - Still to add: decimal point, a few more letters. - Perhaps some control over cell spacing. */ #define JUSTIFY_MASK (JUSTIFY_HZ_APART|JUSTIFY_VT_APART) #define SEVENSEGMENT_MASK (SEVENSEGMENT_NORMAL|SEVENSEGMENT_SHADOW) using namespace FX; /*******************************************************************************/ namespace FX { const FXuint segm[]={ 0x0000, // 20 SPACE 0x0000, // 21 ! 0x0000, // 22 " 0x0000, // 23 # 0x0000, // 24 $ 0x0000, // 25 % 0x0000, // 26 & 0x0000, // 27 ' 0x0053, // 28 ( 0x0065, // 29 ) 0x0000, // 2A * 0x0000, // 2B + 0x0080, // 2C , 0x0008, // 2D - 0x0080, // 2E . 0x0000, // 2F / 0x0077, // 30 0 0x0024, // 31 1 0x005d, // 32 2 0x006d, // 33 3 0x002e, // 34 4 0x006b, // 35 5 0x007b, // 36 6 0x0025, // 37 7 0x007f, // 38 8 0x006f, // 39 9 0x0100, // 3A : 0x0100, // 3B ; 0x0000, // 3C < 0x0048, // 3D = 0x0000, // 3E > 0x0000, // 3F ? 0x0000, // 40 @ 0x003F, // 41 A 0x007A, // 42 B 0x0058, // 43 C 0x007C, // 44 D 0x005B, // 45 E 0x001B, // 46 F 0x0073, // 47 G 0x003A, // 48 H 0x0024, // 49 I 0x0064, // 4A J 0x001A, // 4B K 0x0052, // 4C L 0x0037, // 4D M 0x0038, // 4E N 0x0078, // 4F O 0x001F, // 50 P 0x002F, // 51 Q 0x0018, // 52 R 0x006B, // 53 S 0x005A, // 54 T 0x0070, // 55 U 0x0076, // 56 V 0x0076, // 57 W 0x0049, // 58 X 0x006E, // 59 Y 0x005d, // 5A Z 0x0053, // 5B [ 0x0000, // 5C 0x0065, // 5D ] 0x0000, // 5E ^ 0x0040, // 5F _ 0x0000, // 60 ` 0x003F, // 61 a 0x007A, // 62 b 0x0058, // 63 c 0x007C, // 64 d 0x005b, // 65 e 0x001B, // 66 f 0x0073, // 67 g 0x003A, // 68 h 0x0024, // 69 i 0x0064, // 6A j 0x001A, // 6B k 0x0052, // 6C l 0x0037, // 6D m 0x0038, // 6E n 0x0078, // 6F o 0x001F, // 70 p 0x002F, // 71 q 0x0018, // 72 r 0x006B, // 73 s 0x005A, // 74 t 0x0070, // 75 u 0x0076, // 76 v 0x0076, // 77 w 0x0049, // 78 x 0x006E, // 79 y 0x005d, // 7A z 0x0053, // 7B { 0x0024, // 7C | 0x0065, // 7D } 0x0001, // 7E ~ }; // map FXDEFMAP(FX7Segment) FX7SegmentMap[]={ FXMAPFUNC(SEL_PAINT,0,FX7Segment::onPaint), FXMAPFUNC(SEL_QUERY_TIP,0,FX7Segment::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FX7Segment::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FX7Segment::ID_SETVALUE,FX7Segment::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FX7Segment::ID_SETINTVALUE,FX7Segment::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FX7Segment::ID_SETREALVALUE,FX7Segment::onCmdSetRealValue), FXMAPFUNC(SEL_COMMAND,FX7Segment::ID_SETSTRINGVALUE,FX7Segment::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FX7Segment::ID_GETINTVALUE,FX7Segment::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FX7Segment::ID_GETREALVALUE,FX7Segment::onCmdGetRealValue), FXMAPFUNC(SEL_COMMAND,FX7Segment::ID_GETSTRINGVALUE,FX7Segment::onCmdGetStringValue), FXMAPFUNC(SEL_COMMAND,FX7Segment::ID_SETHELPSTRING,FX7Segment::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FX7Segment::ID_GETHELPSTRING,FX7Segment::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FX7Segment::ID_SETTIPSTRING,FX7Segment::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FX7Segment::ID_GETTIPSTRING,FX7Segment::onCmdGetTip), }; FXIMPLEMENT(FX7Segment,FXFrame,FX7SegmentMap,ARRAYNUMBER(FX7SegmentMap)) // For serialization FX7Segment::FX7Segment(){ flags|=FLAG_ENABLED; textColor=0; thickness=3; cellwidth=12; cellheight=18; } // Construct 7 segment display FX7Segment::FX7Segment(FXComposite* p,const FXString& text,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb):FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb),label(text){ flags|=FLAG_ENABLED; textColor=getApp()->getForeColor(); thickness=3; cellwidth=12; cellheight=18; } // Get default width FXint FX7Segment::getDefaultWidth(){ register FXint w=(cellwidth+2)*label.length(); if(label.length()) w-=2; return padleft+padright+(border<<1)+w; } // Get default height FXint FX7Segment::getDefaultHeight(){ return padtop+padbottom+(border<<1)+cellheight; } // Update value from a message long FX7Segment::onCmdSetValue(FXObject*,FXSelector,void *ptr){ setText((const FXchar*)ptr); return 1; } // Get value as int long FX7Segment::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=FXIntVal(label); return 1; } // Set value from int long FX7Segment::onCmdSetIntValue(FXObject*,FXSelector,void *ptr){ setText(FXStringVal(*((FXint*)ptr))); return 1; } // Get value as double long FX7Segment::onCmdGetRealValue(FXObject*,FXSelector,void* ptr){ *((FXdouble*)ptr)=FXDoubleVal(label); return 1; } // Set value from double long FX7Segment::onCmdSetRealValue(FXObject*,FXSelector,void* ptr){ setText(FXStringVal(*((FXdouble*)ptr))); return 1; } // Get value as string long FX7Segment::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=label; return 1; } // Set value from string long FX7Segment::onCmdSetStringValue(FXObject*,FXSelector,void *ptr){ setText(*((FXString*)ptr)); return 1; } // Set help using a message long FX7Segment::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FX7Segment::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FX7Segment::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FX7Segment::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FX7Segment::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FX7Segment::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // draw/redraw object long FX7Segment::onPaint(FXObject*,FXSelector,void *ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint tx,ty,tw,ch,cw; FXDCWindow dc(this,event); // Draw frame drawFrame(dc,0,0,width,height); // Draw background dc.setForeground(backColor); dc.fillRectangle(border,border,width-(border<<1),height-(border<<1)); // Non empty if(label.length()){ cw=cellwidth; ch=cellheight; tw=label.length()*(cw+2); if(label.length()) tw-=2; // Justify in x if((options&JUSTIFY_LEFT) && (options&JUSTIFY_RIGHT)){ // FIXME not good yet tx=border+padleft; tw=width-padleft-padright-(border<<1); cw=tw/label.length(); } else if(options&JUSTIFY_LEFT){ tx=border+padleft; } else if(options&JUSTIFY_RIGHT){ tx=width-padright-border-tw; } else{ tx=border+padleft+(width-padleft-padright-(border<<1)-tw)/2; } // Justify in y if((options&JUSTIFY_TOP) && (options&JUSTIFY_BOTTOM)){ ty=border+padtop; ch=height-padbottom-padtop-(border<<1); } else if(options&JUSTIFY_TOP){ ty=border+padtop; } else if(options&JUSTIFY_BOTTOM){ ty=height-padbottom-border-ch; } else{ ty=border+padtop+(height-padbottom-padtop-(border<<1)-ch)/2; } // Draw cells with shadow if(options&SEVENSEGMENT_SHADOW){ dc.setForeground(shadowColor); drawCells(dc,tx+1,ty+1,cw,ch); } // Draw cells normally dc.setForeground(textColor); drawCells(dc,tx,ty,cw,ch); } return 1; } // Draw cells void FX7Segment::drawCells(FXDCWindow &dc,FXint x,FXint y,FXint cw,FXint ch){ register FXint c,t; for(c=0; c>1)-(thickness>>1)-1; points[3].x=x; points[3].y=y+(h>>1); dc.fillPolygon(points,4); } if(segments&0x04){ // Upper right points[0].x=x+w; points[0].y=y; points[1].x=x+w; points[1].y=y+(h>>1); points[2].x=x+w-thickness; points[2].y=y+(h>>1)-(thickness>>1)-1; points[3].x=x+w-thickness; points[3].y=y+thickness; dc.fillPolygon(points,4); } if(segments&0x10){ // Lower left points[0].x=x; points[0].y=y+(h>>1); points[1].x=x+thickness; points[1].y=y+(h>>1)-(thickness>>1)+thickness; points[2].x=x+thickness; points[2].y=y+h-thickness-1; points[3].x=x; points[3].y=y+h-1; dc.fillPolygon(points,4); } if(segments&0x20){ // Lower right points[0].x=x+w; points[0].y=y+(h>>1); points[1].x=x+w; points[1].y=y+h-1; points[2].x=x+w-thickness; points[2].y=y+h-thickness-1; points[3].x=x+w-thickness; points[3].y=y+(h>>1)-(thickness>>1)+thickness; dc.fillPolygon(points,4); } if(segments&0x01){ // Top points[0].x=x+1; points[0].y=y; points[1].x=x+w-1; points[1].y=y; points[2].x=x+w-thickness-1; points[2].y=y+thickness; points[3].x=x+thickness+1; points[3].y=y+thickness; dc.fillPolygon(points,4); } if(segments&0x40){ // Bottom points[0].x=x; points[0].y=y+h; points[1].x=x+w; points[1].y=y+h; points[2].x=x+w-thickness; points[2].y=y+h-thickness; points[3].x=x+thickness; points[3].y=y+h-thickness; dc.fillPolygon(points,4); } if(segments&0x08){ // Middle points[0].x=x+1; points[0].y=y+(h>>1); points[1].x=x+thickness; points[1].y=y+(h>>1)-(thickness>>1); points[2].x=x+w-thickness; points[2].y=y+(h>>1)-(thickness>>1); points[3].x=x+w-1; points[3].y=y+(h>>1); points[4].x=x+w-thickness-2; points[4].y=y+(h>>1)-(thickness>>1)+thickness; points[5].x=x+thickness+1; points[5].y=y+(h>>1)-(thickness>>1)+thickness; dc.fillPolygon(points,6); } if(segments&128){ // Decimal } if(segments&256){ // Colon dc.fillRectangle(x+(w>>1)-(thickness>>1)-1,y+(h>>1)-(thickness>>1)-thickness-1,thickness,thickness); dc.fillRectangle(x+(w>>1)-(thickness>>1)-1,y+(h>>1)-(thickness>>1)+thickness+1,thickness,thickness); } } // Change text void FX7Segment::setText(const FXString& text){ if(label!=text){ if(label.length()!=text.length()) recalc(); label=text; update(); } } // Set text color void FX7Segment::setTextColor(FXColor clr){ if(textColor!=clr){ textColor=clr; update(); } } // Get/set cell width void FX7Segment::setCellWidth(FXint w){ if(cellwidth!=w){ cellwidth=w; recalc(); update(); } } // Get/set cell height void FX7Segment::setCellHeight(FXint h){ if(cellheight!=h){ cellheight=h; recalc(); update(); } } // set segment thickness void FX7Segment::setThickness(FXint t){ if(t<1) t=1; if(!(t&1)) t|=1; if(thickness!=t){ thickness=t; recalc(); update(); } } // Change 7 segment style void FX7Segment::set7SegmentStyle(FXuint style){ FXuint opts=(options&~SEVENSEGMENT_MASK) | (style&SEVENSEGMENT_MASK); if(options!=opts){ options=opts; update(); } } // Get 7 segment FXuint FX7Segment::get7SegmentStyle() const { return (options&SEVENSEGMENT_MASK); } // Set text justify style void FX7Segment::setJustify(FXuint style){ FXuint opts=(options&~JUSTIFY_MASK) | (style&JUSTIFY_MASK); if(options!=opts){ options=opts; update(); } } // Get text justify style FXuint FX7Segment::getJustify() const { return (options&JUSTIFY_MASK); } // Save object to stream void FX7Segment::save(FXStream &store) const { FXFrame::save(store); store << label; store << textColor; store << thickness; store << cellwidth; store << cellheight; store << tip; store << help; } // Load object from stream void FX7Segment::load(FXStream &store) { FXFrame::load(store); store >> label; store >> textColor; store >> thickness; store >> cellwidth; store >> cellheight; store >> tip; store >> help; } } fox1.6-1.6.57/src/FX885910Codec.cpp000066400000000000000000000144031326741342000161040ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX885910Codec.h" namespace FX { FXIMPLEMENT(FX885910Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-10.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 260, 274, 290, 298, 296, 310, 167, 315, 272, 352, 358, 381, 173, 362, 330, 176, 261, 275, 291, 299, 297, 311, 183, 316, 273, 353, 359, 382, 8213, 363, 331, 256, 193, 194, 195, 196, 197, 198, 302, 268, 201, 280, 203, 278, 205, 206, 207, 208, 325, 332, 211, 212, 213, 214, 360, 216, 370, 218, 219, 220, 221, 222, 223, 257, 225, 226, 227, 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, 238, 239, 240, 326, 333, 243, 244, 245, 246, 361, 248, 371, 250, 251, 252, 253, 254, 312, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 24, 24, 24, 24, 24, 24, 24, 87, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, }; static const unsigned short reverse_block[151]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 191, 207, 223, 239, 255, 271, 285, 301, 314, 328, 344, 358, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 373, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, }; static const unsigned char reverse_data[389]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 26, 26, 26, 26, 26, 167, 26, 26, 26, 26, 26, 173, 26, 26, 176, 26, 26, 26, 26, 26, 26, 183, 26, 26, 26, 26, 26, 26, 26, 26, 193, 194, 195, 196, 197, 198, 26, 26, 201, 26, 203, 26, 205, 206, 207, 208, 26, 26, 211, 212, 213, 214, 26, 216, 26, 218, 219, 220, 221, 222, 223, 26, 225, 226, 227, 228, 229, 230, 26, 26, 233, 26, 235, 26, 237, 238, 239, 240, 26, 26, 243, 244, 245, 246, 26, 248, 26, 250, 251, 252, 253, 254, 26, 192, 224, 26, 26, 161, 177, 26, 26, 26, 26, 26, 26, 200, 232, 26, 26, 169, 185, 162, 178, 26, 26, 204, 236, 202, 234, 26, 26, 26, 26, 26, 26, 163, 179, 26, 26, 26, 26, 165, 181, 164, 180, 26, 26, 199, 231, 26, 26, 26, 26, 26, 26, 166, 182, 255, 26, 26, 168, 184, 26, 26, 26, 26, 26, 209, 241, 26, 26, 26, 175, 191, 210, 242, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 170, 186, 26, 26, 26, 26, 171, 187, 215, 247, 174, 190, 26, 26, 26, 26, 217, 249, 26, 26, 26, 26, 26, 26, 26, 26, 26, 172, 188, 26, 26, 26, 26, 26, 189, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FX885910Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX885910Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX885910Codec::mibEnum() const { return 13; } const FXchar* FX885910Codec::name() const { return "ISO-8859-10"; } const FXchar* FX885910Codec::mimeName() const { return "ISO-8859-10"; } const FXchar* const* FX885910Codec::aliases() const { static const FXchar *const list[]={"iso8859-10","ISO-8859-10","ISO_8859-10","latin6","iso-ir-157","csISOLatin6","l6",NULL}; return list; } } fox1.6-1.6.57/src/FX885911Codec.cpp000066400000000000000000000124541326741342000161110ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX885911Codec.h" namespace FX { FXIMPLEMENT(FX885911Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-11.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 3585, 3586, 3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 65533, 65533, 65533, 65533, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 65533, 65533, 65533, 65533, }; static const unsigned char reverse_plane[17]={ 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, }; static const unsigned char reverse_pages[68]={ 0, 11, 11, 43, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, }; static const unsigned short reverse_block[107]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 176, 192, 208, 224, 240, 256, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, }; static const unsigned char reverse_data[272]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 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, 26, 26, 26, 26, 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, 26, 26, 26, 26, }; FXint FX885911Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX885911Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX885911Codec::mibEnum() const { return 2259; } const FXchar* FX885911Codec::name() const { return "ISO-8859-11"; } const FXchar* FX885911Codec::mimeName() const { return "ISO-8859-11"; } const FXchar* const* FX885911Codec::aliases() const { static const FXchar *const list[]={"iso8859-11","ISO-8859-11","ISO_8859-11",NULL}; return list; } } fox1.6-1.6.57/src/FX885913Codec.cpp000066400000000000000000000143411326741342000161100ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX885913Codec.h" namespace FX { FXIMPLEMENT(FX885913Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-13.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 8221, 162, 163, 164, 8222, 166, 167, 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, 178, 179, 8220, 181, 182, 183, 248, 185, 343, 187, 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, 371, 322, 347, 363, 252, 380, 382, 8217, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 24, 24, 24, 24, 24, 24, 24, 87, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, }; static const unsigned short reverse_block[151]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 191, 204, 220, 233, 249, 263, 277, 293, 308, 322, 338, 352, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 374, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, }; static const unsigned char reverse_data[390]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 162, 163, 164, 26, 166, 167, 26, 169, 26, 171, 172, 173, 174, 26, 176, 177, 178, 179, 26, 181, 182, 183, 26, 185, 26, 187, 188, 189, 190, 26, 26, 26, 26, 196, 197, 175, 26, 26, 201, 26, 26, 26, 26, 26, 26, 211, 26, 213, 214, 215, 168, 26, 26, 26, 220, 26, 26, 223, 26, 26, 26, 26, 228, 229, 191, 26, 26, 233, 26, 26, 26, 26, 26, 26, 243, 26, 245, 246, 247, 184, 26, 26, 26, 252, 26, 26, 26, 194, 226, 26, 26, 192, 224, 195, 227, 26, 26, 26, 26, 200, 232, 26, 26, 199, 231, 26, 26, 203, 235, 198, 230, 26, 26, 26, 26, 26, 26, 204, 236, 26, 26, 26, 26, 26, 26, 206, 238, 26, 26, 193, 225, 26, 26, 26, 26, 26, 26, 205, 237, 26, 26, 26, 207, 239, 26, 26, 26, 217, 249, 209, 241, 210, 242, 26, 26, 26, 26, 26, 212, 244, 26, 26, 26, 26, 26, 26, 170, 186, 26, 26, 218, 250, 26, 26, 26, 26, 208, 240, 26, 26, 26, 26, 26, 26, 26, 26, 219, 251, 26, 26, 26, 26, 216, 248, 26, 26, 26, 26, 26, 202, 234, 221, 253, 222, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 26, 26, 180, 161, 165, 26, }; FXint FX885913Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX885913Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX885913Codec::mibEnum() const { return 109; } const FXchar* FX885913Codec::name() const { return "ISO-8859-13"; } const FXchar* FX885913Codec::mimeName() const { return "ISO-8859-13"; } const FXchar* const* FX885913Codec::aliases() const { static const FXchar *const list[]={"iso8859-13","ISO-8859-13","ISO_8859-13",NULL}; return list; } } fox1.6-1.6.57/src/FX885914Codec.cpp000066400000000000000000000142611326741342000161120ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX885914Codec.h" namespace FX { FXIMPLEMENT(FX885914Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-14.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 7682, 7683, 163, 266, 267, 7690, 167, 7808, 169, 7810, 7691, 7922, 173, 174, 376, 7710, 7711, 288, 289, 7744, 7745, 182, 7766, 7809, 7767, 7811, 7776, 7923, 7812, 7813, 7777, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 372, 209, 210, 211, 212, 213, 214, 7786, 216, 217, 218, 219, 220, 221, 374, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 373, 241, 242, 243, 244, 245, 246, 7787, 248, 249, 250, 251, 252, 253, 375, 255, }; static const unsigned char reverse_plane[17]={ 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, }; static const unsigned char reverse_pages[72]={ 0, 24, 24, 24, 24, 24, 24, 56, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, }; static const unsigned short reverse_block[120]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 175, 191, 207, 223, 239, 255, 267, 283, 267, 267, 267, 267, 295, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 309, 321, 267, 267, 337, 347, 363, 267, 379, 267, 267, 267, 267, 267, 267, 393, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, }; static const unsigned char reverse_data[409]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 26, 163, 26, 26, 26, 167, 26, 169, 26, 26, 26, 173, 174, 26, 26, 26, 26, 26, 26, 182, 26, 26, 26, 26, 26, 26, 26, 26, 26, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 26, 209, 210, 211, 212, 213, 214, 26, 216, 217, 218, 219, 220, 221, 26, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 26, 241, 242, 243, 244, 245, 246, 26, 248, 249, 250, 251, 252, 253, 26, 255, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 164, 165, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 178, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 208, 240, 222, 254, 175, 26, 26, 26, 26, 26, 26, 26, 161, 162, 26, 26, 26, 26, 26, 26, 166, 171, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 176, 177, 180, 181, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 183, 185, 26, 26, 26, 26, 26, 26, 26, 26, 187, 191, 26, 26, 26, 26, 26, 26, 26, 26, 215, 247, 26, 26, 26, 26, 168, 184, 170, 186, 189, 190, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 172, 188, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FX885914Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX885914Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX885914Codec::mibEnum() const { return 110; } const FXchar* FX885914Codec::name() const { return "ISO-8859-14"; } const FXchar* FX885914Codec::mimeName() const { return "ISO-8859-14"; } const FXchar* const* FX885914Codec::aliases() const { static const FXchar *const list[]={"iso8859-14","ISO-8859-14","ISO_8859-14",NULL}; return list; } } fox1.6-1.6.57/src/FX885915Codec.cpp000066400000000000000000000134731326741342000161170ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX885915Codec.h" namespace FX { FXIMPLEMENT(FX885915Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-15.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 8364, 165, 352, 167, 353, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 381, 181, 182, 183, 382, 185, 186, 187, 338, 339, 376, 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, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 24, 24, 24, 24, 24, 24, 24, 78, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, }; static const unsigned short reverse_block[142]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 256, 256, 256, 256, 270, 286, 294, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 309, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, }; static const unsigned char reverse_data[325]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 165, 26, 167, 26, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 26, 181, 182, 183, 26, 185, 186, 187, 26, 26, 26, 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, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 188, 189, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 166, 168, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 190, 26, 26, 26, 26, 180, 184, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 164, 26, 26, 26, }; FXint FX885915Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX885915Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX885915Codec::mibEnum() const { return 111; } const FXchar* FX885915Codec::name() const { return "ISO-8859-15"; } const FXchar* FX885915Codec::mimeName() const { return "ISO-8859-15"; } const FXchar* const* FX885915Codec::aliases() const { static const FXchar *const list[]={"iso8859-15","ISO-8859-15","ISO_8859-15","Latin-9","latin9",NULL}; return list; } } fox1.6-1.6.57/src/FX885916Codec.cpp000066400000000000000000000145771326741342000161260ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX885916Codec.h" namespace FX { FXIMPLEMENT(FX885916Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-16.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 260, 261, 321, 8364, 8222, 352, 167, 353, 169, 536, 171, 377, 173, 378, 379, 176, 177, 268, 322, 381, 8221, 182, 183, 382, 269, 537, 187, 338, 339, 376, 380, 192, 193, 194, 258, 196, 262, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 272, 323, 210, 211, 212, 336, 214, 346, 368, 217, 218, 219, 220, 280, 538, 223, 224, 225, 226, 259, 228, 263, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 273, 324, 242, 243, 244, 337, 246, 347, 369, 249, 250, 251, 252, 281, 539, 255, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 34, 34, 34, 34, 34, 34, 34, 97, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, }; static const unsigned short reverse_block[161]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 272, 282, 282, 297, 313, 329, 345, 282, 282, 282, 282, 282, 282, 282, 282, 282, 360, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 372, 282, 282, 282, 282, 282, 282, 282, 282, 387, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, }; static const unsigned char reverse_data[403]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 26, 26, 26, 26, 26, 167, 26, 169, 26, 171, 26, 173, 26, 26, 176, 177, 26, 26, 26, 26, 182, 183, 26, 26, 26, 187, 26, 26, 26, 26, 192, 193, 194, 26, 196, 26, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 26, 26, 210, 211, 212, 26, 214, 26, 26, 217, 218, 219, 220, 26, 26, 223, 224, 225, 226, 26, 228, 26, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 26, 26, 242, 243, 244, 26, 246, 26, 26, 249, 250, 251, 252, 26, 26, 255, 26, 26, 195, 227, 161, 162, 197, 229, 26, 26, 26, 26, 178, 185, 26, 26, 208, 240, 26, 26, 26, 26, 26, 26, 221, 253, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 163, 179, 209, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 213, 245, 188, 189, 26, 26, 26, 26, 26, 26, 215, 247, 26, 26, 26, 26, 166, 168, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 216, 248, 26, 26, 26, 26, 26, 26, 190, 172, 174, 175, 191, 180, 184, 26, 26, 26, 26, 26, 26, 26, 26, 170, 186, 222, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 181, 165, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 164, 26, 26, 26, }; FXint FX885916Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX885916Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX885916Codec::mibEnum() const { return 112; } const FXchar* FX885916Codec::name() const { return "ISO-8859-16"; } const FXchar* FX885916Codec::mimeName() const { return "ISO-8859-16"; } const FXchar* const* FX885916Codec::aliases() const { static const FXchar *const list[]={"iso8859-16","ISO-8859-16","ISO_8859-16","latin10","iso-ir-226","l10",NULL}; return list; } } fox1.6-1.6.57/src/FX88591Codec.cpp000066400000000000000000000122601326741342000160230ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX88591Codec.h" namespace FX { FXIMPLEMENT(FX88591Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-1.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, }; static const unsigned char reverse_plane[17]={ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static const unsigned char reverse_pages[65]={ 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, }; static const unsigned short reverse_block[80]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, }; static const unsigned char reverse_data[272]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FX88591Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX88591Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX88591Codec::mibEnum() const { return 4; } const FXchar* FX88591Codec::name() const { return "ISO-8859-1"; } const FXchar* FX88591Codec::mimeName() const { return "ISO-8859-1"; } const FXchar* const* FX88591Codec::aliases() const { static const FXchar *const list[]={"iso8859-1","ISO-8859-1","ISO_8859-1","latin1","CP819","iso-ir-100","IBM819","l1","csISOLatin1",NULL}; return list; } } fox1.6-1.6.57/src/FX88592Codec.cpp000066400000000000000000000137711326741342000160340ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX88592Codec.h" namespace FX { FXIMPLEMENT(FX88592Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/24/2005 from: 8859-2.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 260, 728, 321, 164, 317, 346, 167, 168, 352, 350, 356, 377, 173, 381, 379, 176, 261, 731, 322, 180, 318, 347, 711, 184, 353, 351, 357, 378, 733, 382, 380, 340, 193, 194, 258, 196, 313, 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, 345, 367, 250, 369, 252, 253, 355, 729, }; static const unsigned char reverse_plane[17]={ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static const unsigned char reverse_pages[65]={ 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, }; static const unsigned short reverse_block[110]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 191, 206, 222, 237, 251, 267, 279, 286, 301, 317, 333, 349, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 364, 372, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, }; static const unsigned char reverse_data[388]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 26, 26, 164, 26, 26, 167, 168, 26, 26, 26, 26, 173, 26, 26, 176, 26, 26, 26, 180, 26, 26, 26, 184, 26, 26, 26, 26, 26, 26, 26, 193, 194, 26, 196, 26, 26, 199, 26, 201, 26, 203, 26, 205, 206, 26, 26, 26, 211, 212, 26, 214, 215, 26, 26, 218, 26, 220, 221, 26, 223, 26, 225, 226, 26, 228, 26, 26, 231, 26, 233, 26, 235, 26, 237, 238, 26, 26, 26, 243, 244, 26, 246, 247, 26, 26, 250, 26, 252, 253, 26, 26, 195, 227, 161, 177, 198, 230, 26, 26, 26, 26, 200, 232, 207, 239, 208, 240, 26, 26, 26, 26, 26, 26, 202, 234, 204, 236, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 197, 229, 26, 26, 165, 181, 26, 163, 179, 209, 241, 26, 26, 210, 242, 26, 26, 26, 26, 26, 26, 26, 213, 245, 26, 26, 192, 224, 26, 26, 216, 248, 166, 182, 26, 26, 170, 186, 169, 185, 222, 254, 171, 187, 26, 26, 26, 26, 26, 26, 26, 26, 217, 249, 219, 251, 26, 26, 26, 26, 26, 26, 26, 172, 188, 175, 191, 174, 190, 26, 26, 26, 26, 26, 26, 26, 183, 26, 26, 26, 26, 26, 26, 26, 26, 162, 255, 26, 178, 26, 189, 26, 26, }; FXint FX88592Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX88592Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX88592Codec::mibEnum() const { return 5; } const FXchar* FX88592Codec::name() const { return "ISO-8859-2"; } const FXchar* FX88592Codec::mimeName() const { return "ISO-8859-2"; } const FXchar* const* FX88592Codec::aliases() const { static const FXchar *const list[]={"iso8859-2","ISO-8859-2","ISO_8859-2","latin2","iso-ir-101","l2","csISOLatin2",NULL}; return list; } } fox1.6-1.6.57/src/FX88593Codec.cpp000066400000000000000000000135731326741342000160350ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX88593Codec.h" namespace FX { FXIMPLEMENT(FX88593Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-3.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 294, 728, 163, 164, 65533, 292, 167, 168, 304, 350, 286, 308, 173, 65533, 379, 176, 295, 178, 179, 180, 181, 293, 183, 184, 305, 351, 287, 309, 189, 65533, 380, 192, 193, 194, 65533, 196, 266, 264, 199, 200, 201, 202, 203, 204, 205, 206, 207, 65533, 209, 210, 211, 212, 288, 214, 215, 284, 217, 218, 219, 220, 364, 348, 223, 224, 225, 226, 65533, 228, 267, 265, 231, 232, 233, 234, 235, 236, 237, 238, 239, 65533, 241, 242, 243, 244, 289, 246, 247, 285, 249, 250, 251, 252, 365, 349, 729, }; static const unsigned char reverse_plane[17]={ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static const unsigned char reverse_pages[65]={ 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, }; static const unsigned short reverse_block[110]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 253, 265, 281, 297, 303, 307, 323, 337, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 350, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, }; static const unsigned char reverse_data[366]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 26, 163, 164, 26, 26, 167, 168, 26, 26, 26, 26, 173, 26, 26, 176, 26, 178, 179, 180, 181, 26, 183, 184, 26, 26, 26, 26, 189, 26, 26, 192, 193, 194, 26, 196, 26, 26, 199, 200, 201, 202, 203, 204, 205, 206, 207, 26, 209, 210, 211, 212, 26, 214, 215, 26, 217, 218, 219, 220, 26, 26, 223, 224, 225, 226, 26, 228, 26, 26, 231, 232, 233, 234, 235, 236, 237, 238, 239, 26, 241, 242, 243, 244, 26, 246, 247, 26, 249, 250, 251, 252, 26, 26, 26, 26, 26, 26, 26, 26, 198, 230, 197, 229, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 216, 248, 171, 187, 213, 245, 26, 26, 166, 182, 161, 177, 26, 26, 26, 26, 26, 26, 26, 26, 169, 185, 26, 26, 172, 188, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 222, 254, 170, 186, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 221, 253, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 175, 191, 26, 26, 26, 26, 26, 26, 26, 26, 162, 255, 26, 26, 26, 26, 26, 26, }; FXint FX88593Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX88593Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX88593Codec::mibEnum() const { return 6; } const FXchar* FX88593Codec::name() const { return "ISO-8859-3"; } const FXchar* FX88593Codec::mimeName() const { return "ISO-8859-3"; } const FXchar* const* FX88593Codec::aliases() const { static const FXchar *const list[]={"iso8859-3","ISO-8859-3","ISO_8859-3","latin3","iso-ir-109","l3","csISOLatin3",NULL}; return list; } } fox1.6-1.6.57/src/FX88594Codec.cpp000066400000000000000000000141321326741342000160260ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX88594Codec.h" namespace FX { FXIMPLEMENT(FX88594Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-4.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 260, 312, 342, 164, 296, 315, 167, 168, 352, 274, 290, 358, 173, 381, 175, 176, 261, 731, 343, 180, 297, 316, 711, 184, 353, 275, 291, 359, 330, 382, 331, 256, 193, 194, 195, 196, 197, 198, 302, 268, 201, 280, 203, 278, 205, 206, 298, 272, 325, 332, 310, 212, 213, 214, 215, 216, 370, 218, 219, 220, 360, 362, 223, 257, 225, 226, 227, 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, 238, 299, 273, 326, 333, 311, 244, 245, 246, 247, 248, 371, 250, 251, 252, 361, 363, 729, }; static const unsigned char reverse_plane[17]={ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static const unsigned char reverse_pages[65]={ 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, }; static const unsigned short reverse_block[110]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 191, 206, 222, 237, 253, 269, 283, 299, 312, 326, 342, 356, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 380, 388, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, }; static const unsigned char reverse_data[404]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 26, 26, 164, 26, 26, 167, 168, 26, 26, 26, 26, 173, 26, 175, 176, 26, 26, 26, 180, 26, 26, 26, 184, 26, 26, 26, 26, 26, 26, 26, 193, 194, 195, 196, 197, 198, 26, 26, 201, 26, 203, 26, 205, 206, 26, 26, 26, 26, 212, 213, 214, 215, 216, 26, 218, 219, 220, 26, 26, 223, 26, 225, 226, 227, 228, 229, 230, 26, 26, 233, 26, 235, 26, 237, 238, 26, 26, 26, 26, 244, 245, 246, 247, 248, 26, 250, 251, 252, 26, 26, 26, 192, 224, 26, 26, 161, 177, 26, 26, 26, 26, 26, 26, 200, 232, 26, 26, 208, 240, 170, 186, 26, 26, 204, 236, 202, 234, 26, 26, 26, 26, 26, 26, 171, 187, 26, 26, 26, 26, 165, 181, 207, 239, 26, 26, 199, 231, 26, 26, 26, 26, 26, 26, 211, 243, 162, 26, 26, 166, 182, 26, 26, 26, 26, 26, 209, 241, 26, 26, 26, 189, 191, 210, 242, 26, 26, 26, 26, 26, 26, 163, 179, 26, 26, 26, 26, 26, 26, 26, 26, 169, 185, 26, 26, 26, 26, 172, 188, 221, 253, 222, 254, 26, 26, 26, 26, 217, 249, 26, 26, 26, 26, 26, 26, 26, 26, 26, 174, 190, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 183, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 26, 178, 26, 26, 26, 26, }; FXint FX88594Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX88594Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX88594Codec::mibEnum() const { return 7; } const FXchar* FX88594Codec::name() const { return "ISO-8859-4"; } const FXchar* FX88594Codec::mimeName() const { return "ISO-8859-4"; } const FXchar* const* FX88594Codec::aliases() const { static const FXchar *const list[]={"iso8859-4","ISO-8859-4","ISO_8859-4","latin4","iso-ir-110","l4","csISOLatin4",NULL}; return list; } } fox1.6-1.6.57/src/FX88595Codec.cpp000066400000000000000000000136011326741342000160270ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX88595Codec.h" namespace FX { FXIMPLEMENT(FX88595Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-5.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 173, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 8470, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 167, 1118, 1119, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 64, 70, 70, 70, 70, 70, 70, 117,70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, }; static const unsigned short reverse_block[181]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 189, 205, 221, 237, 253, 269, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 285, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, }; static const unsigned char reverse_data[301]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 26, 26, 26, 26, 26, 253, 26, 26, 26, 26, 26, 173, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 26, 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, 26, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 26, 254, 255, 26, 26, 26, 26, 26, 26, 240, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FX88595Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX88595Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX88595Codec::mibEnum() const { return 8; } const FXchar* FX88595Codec::name() const { return "ISO-8859-5"; } const FXchar* FX88595Codec::mimeName() const { return "ISO-8859-5"; } const FXchar* const* FX88595Codec::aliases() const { static const FXchar *const list[]={"iso8859-5","ISO-8859-5","ISO_8859-5","cyrillic","iso-ir-144","csISOLatinCyrillic",NULL}; return list; } } fox1.6-1.6.57/src/FX88596Codec.cpp000066400000000000000000000127721326741342000160400ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX88596Codec.h" namespace FX { FXIMPLEMENT(FX88596Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-6.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 65533, 65533, 65533, 164, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 1548, 173, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 1563, 65533, 65533, 65533, 1567, 65533, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 65533, 65533, 65533, 65533, 65533, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, }; static const unsigned char reverse_plane[17]={ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; static const unsigned char reverse_pages[66]={ 0, 32, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, }; static const unsigned short reverse_block[134]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 178, 191, 207, 223, 239, 255, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, }; static const unsigned char reverse_data[271]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 26, 26, 164, 26, 26, 26, 26, 26, 26, 26, 26, 173, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 172, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 187, 26, 26, 26, 191, 26, 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, 26, 26, 26, 26, 26, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FX88596Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX88596Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX88596Codec::mibEnum() const { return 9; } const FXchar* FX88596Codec::name() const { return "ISO-8859-6"; } const FXchar* FX88596Codec::mimeName() const { return "ISO-8859-6"; } const FXchar* const* FX88596Codec::aliases() const { static const FXchar *const list[]={"iso8859-6","ISO-8859-6","ISO_8859-6","arabic","iso-ir-127","ECMA-114","ASMO-708","csISOLatinArabic",NULL}; return list; } } fox1.6-1.6.57/src/FX88597Codec.cpp000066400000000000000000000137631326741342000160420ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX88597Codec.h" namespace FX { FXIMPLEMENT(FX88597Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-7.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 8216, 8217, 163, 8364, 8367, 166, 167, 168, 169, 890, 171, 172, 173, 65533, 8213, 176, 177, 178, 179, 900, 901, 902, 183, 904, 905, 906, 187, 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 65533, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 65533, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 61, 61, 61, 61, 61, 61, 61, 124,61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, }; static const unsigned short reverse_block[188]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 196, 208, 224, 240, 256, 272, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 287, 190, 190, 190, 190, 190, 190, 190, 190, 297, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, }; static const unsigned char reverse_data[313]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 26, 163, 26, 26, 166, 167, 168, 169, 26, 171, 172, 173, 26, 26, 176, 177, 178, 179, 26, 26, 26, 183, 26, 26, 26, 187, 26, 189, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 170, 26, 26, 26, 26, 26, 180, 181, 182, 26, 184, 185, 186, 26, 188, 26, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 26, 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, 26, 26, 26, 26, 26, 175, 26, 26, 161, 162, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 164, 26, 26, 165, }; FXint FX88597Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX88597Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX88597Codec::mibEnum() const { return 10; } const FXchar* FX88597Codec::name() const { return "ISO-8859-7"; } const FXchar* FX88597Codec::mimeName() const { return "ISO-8859-7"; } const FXchar* const* FX88597Codec::aliases() const { static const FXchar *const list[]={"iso8859-7","ISO-8859-7","ISO_8859-7","greek","iso-ir-126","greek8","ELOT_928","ECMA-118",NULL}; return list; } } fox1.6-1.6.57/src/FX88598Codec.cpp000066400000000000000000000135721326741342000160410ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX88598Codec.h" namespace FX { FXIMPLEMENT(FX88598Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-8.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 65533, 162, 163, 164, 165, 166, 167, 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, 188, 189, 190, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 8215, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 65533, 65533, 8206, 8207, 65533, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 35, 66, 66, 66, 66, 66, 66, 130,66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, }; static const unsigned short reverse_block[194]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 191, 200, 191, 209, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 225, 241, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 252, 268, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, }; static const unsigned char reverse_data[284]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 162, 163, 164, 165, 166, 167, 168, 169, 26, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 26, 187, 188, 189, 190, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 170, 26, 26, 26, 26, 26, 26, 26, 26, 186, 26, 26, 26, 26, 26, 26, 26, 26, 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, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 253, 254, 26, 26, 26, 26, 26, 26, 26, 223, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FX88598Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX88598Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX88598Codec::mibEnum() const { return 11; } const FXchar* FX88598Codec::name() const { return "ISO-8859-8"; } const FXchar* FX88598Codec::mimeName() const { return "ISO-8859-8"; } const FXchar* const* FX88598Codec::aliases() const { static const FXchar *const list[]={"iso8859-8","ISO-8859-8","ISO_8859-8","hebrew","iso-ir-138","csISOLatinHebrew",NULL}; return list; } } fox1.6-1.6.57/src/FX88599Codec.cpp000066400000000000000000000124731326741342000160410ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FX88599Codec.h" namespace FX { FXIMPLEMENT(FX88599Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: 8859-9.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 286, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 304, 350, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 287, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 305, 351, 255, }; static const unsigned char reverse_plane[17]={ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; static const unsigned char reverse_pages[65]={ 0, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, }; static const unsigned short reverse_block[86]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 258, 256, 274, 256, 276, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, }; static const unsigned char reverse_data[292]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 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, 26, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 26, 26, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 26, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 26, 26, 255, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 208, 240, 221, 253, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 222, 254, }; FXint FX88599Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FX88599Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FX88599Codec::mibEnum() const { return 12; } const FXchar* FX88599Codec::name() const { return "ISO-8859-9"; } const FXchar* FX88599Codec::mimeName() const { return "ISO-8859-9"; } const FXchar* const* FX88599Codec::aliases() const { static const FXchar *const list[]={"iso8859-9","ISO-8859-9","ISO_8859-9","latin5","iso-ir-148","l5","csISOLatin5",NULL}; return list; } } fox1.6-1.6.57/src/FXAccelTable.cpp000066400000000000000000000352041326741342000163510ustar00rootroot00000000000000/******************************************************************************** * * * A c c e l e r a t o r T a b l e C l a s s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXAccelTable.cpp,v 1.51.2.1 2007/03/07 14:30:27 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "fxascii.h" #include "fxunicode.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObject.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXAccelTable.h" #include "fxpriv.h" /* Notes: - We also dropped the "fx" since we now have namespaces to keep stuff out of each other's hair. - Turned parseAccel() cum suis to simple global functions. The rules for friend declarations have change in GCC 4.1 so declaring them as friends is no longer possible. - We need to deal with X11 unicode keysyms (with 0x01000000 flag) in some way. */ #define EMPTYSLOT 0xfffffffe // Previously used, now empty slot #define UNUSEDSLOT 0xffffffff // Unsused slot marker using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXAccelTable) FXAccelTableMap[]={ FXMAPFUNC(SEL_KEYPRESS,0,FXAccelTable::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXAccelTable::onKeyRelease), }; // Object implementation FXIMPLEMENT(FXAccelTable,FXObject,FXAccelTableMap,ARRAYNUMBER(FXAccelTableMap)) // Make empty accelerator table FXAccelTable::FXAccelTable(){ FXTRACE((100,"%p->FXAccelTable::FXAccelTable\n",this)); FXMALLOC(&key,FXAccelKey,1); key[0].code=UNUSEDSLOT; key[0].target=NULL; key[0].messagedn=0; key[0].messageup=0; max=0; num=0; } // Resize hash table, and rehash old stuff into it void FXAccelTable::resize(FXuint m){ register FXuint p,i,c; FXAccelKey *newkey; FXMALLOC(&newkey,FXAccelKey,m+1); for(i=0; i<=m; i++){ newkey[i].code=UNUSEDSLOT; newkey[i].target=NULL; newkey[i].messagedn=0; newkey[i].messageup=0; } for(i=0; i<=max; i++){ if((c=key[i].code)>=EMPTYSLOT) continue; p=(c*13)&m; while(newkey[p].code!=UNUSEDSLOT) p=(p+1)&m; newkey[p]=key[i]; } FXFREE(&key); key=newkey; max=m; } // Add (or replace) accelerator void FXAccelTable::addAccel(FXHotKey hotkey,FXObject* target,FXSelector seldn,FXSelector selup){ if(hotkey){ FXTRACE((150,"%p->FXAccelTable::addAccel: code=%04x state=%04x\n",this,(FXushort)hotkey,(FXushort)(hotkey>>16))); register FXuint p=(hotkey*13)&max; register FXuint c; FXASSERT(hotkey!=UNUSEDSLOT); FXASSERT(hotkey!=EMPTYSLOT); while((c=key[p].code)!=UNUSEDSLOT){ // Check if in table already if(c==hotkey) goto x; p=(p+1)&max; } ++num; if(max<(num<<1)) resize((max<<1)+1); FXASSERT(num<=max); p=(hotkey*13)&max; // Locate first unused or empty slot while((c=key[p].code)FXAccelTable::removeAccel: code=%04x state=%04x\n",this,(FXushort)hotkey,(FXushort)(hotkey>>16))); register FXuint p=(hotkey*13)&max; register FXuint c; FXASSERT(hotkey!=UNUSEDSLOT); FXASSERT(hotkey!=EMPTYSLOT); while((c=key[p].code)!=hotkey){ if(c==UNUSEDSLOT) return; p=(p+1)&max; } if(key[(p+1)&max].code==UNUSEDSLOT){// Last in chain key[p].code=UNUSEDSLOT; } else{ // Middle of chain key[p].code=EMPTYSLOT; } key[p].target=NULL; key[p].messagedn=0; key[p].messageup=0; if(max>=(num<<2)) resize(max>>1); --num; FXASSERT(num<=max); } } // See if accelerator exists bool FXAccelTable::hasAccel(FXHotKey hotkey) const { if(hotkey){ register FXuint p=(hotkey*13)&max; register FXuint c; FXASSERT(hotkey!=UNUSEDSLOT); FXASSERT(hotkey!=EMPTYSLOT); while((c=key[p].code)!=hotkey){ if(c==UNUSEDSLOT) return false; p=(p+1)&max; } return true; } return false; } // Return target object of the given accelerator FXObject* FXAccelTable::targetOfAccel(FXHotKey hotkey) const { if(hotkey){ register FXuint p=(hotkey*13)&max; register FXuint c; FXASSERT(hotkey!=UNUSEDSLOT); FXASSERT(hotkey!=EMPTYSLOT); while((c=key[p].code)!=hotkey){ if(c==UNUSEDSLOT) return NULL; p=(p+1)&max; } return key[p].target; } return NULL; } // Keyboard press; forward to accelerator target long FXAccelTable::onKeyPress(FXObject* sender,FXSelector,void* ptr){ FXTRACE((200,"%p->FXAccelTable::onKeyPress keysym=0x%04x state=%04x\n",this,((FXEvent*)ptr)->code,((FXEvent*)ptr)->state)); register FXEvent* event=(FXEvent*)ptr; register FXuint code=MKUINT(event->code,event->state&(SHIFTMASK|CONTROLMASK|ALTMASK|METAMASK)); register FXuint p=(code*13)&max; register FXuint c; FXASSERT(code!=UNUSEDSLOT); FXASSERT(code!=EMPTYSLOT); while((c=key[p].code)!=code){ if(c==UNUSEDSLOT) return 0; p=(p+1)&max; } if(key[p].target && key[p].messagedn){ key[p].target->tryHandle(sender,key[p].messagedn,ptr); } return 1; } // Keyboard release; forward to accelerator target long FXAccelTable::onKeyRelease(FXObject* sender,FXSelector,void* ptr){ FXTRACE((200,"%p->FXAccelTable::onKeyRelease keysym=0x%04x state=%04x\n",this,((FXEvent*)ptr)->code,((FXEvent*)ptr)->state)); register FXEvent* event=(FXEvent*)ptr; register FXuint code=MKUINT(event->code,event->state&(SHIFTMASK|CONTROLMASK|ALTMASK|METAMASK)); register FXuint p=(code*13)&max; register FXuint c; FXASSERT(code!=UNUSEDSLOT); FXASSERT(code!=EMPTYSLOT); while((c=key[p].code)!=code){ if(c==UNUSEDSLOT) return 0; p=(p+1)&max; } if(key[p].target && key[p].messageup){ key[p].target->tryHandle(sender,key[p].messageup,ptr); } return 1; } // Unparse hot key back into a string FXString unparseAccel(FXHotKey key){ FXuint mods=(key&0xffff0000)>>16; FXuint code=(key&0xffff); FXchar buffer[64]; FXString s; // Handle modifier keys if(mods&CONTROLMASK) s+="Ctrl+"; if(mods&ALTMASK) s+="Alt+"; if(mods&SHIFTMASK) s+="Shift+"; if(mods&METAMASK) s+="Meta+"; // Handle some special keys switch(code){ case KEY_Home: s+="Home"; break; case KEY_End: s+="End"; break; case KEY_Page_Up: s+="PgUp"; break; case KEY_Page_Down: s+="PgDn"; break; case KEY_Left: s+="Left"; break; case KEY_Right: s+="Right"; break; case KEY_Up: s+="Up"; break; case KEY_Down: s+="Down"; break; case KEY_Insert: s+="Ins"; break; case KEY_Delete: s+="Del"; break; case KEY_Escape: s+="Esc"; break; case KEY_Tab: s+="Tab"; break; case KEY_Return: s+="Return"; break; case KEY_BackSpace: s+="Back"; break; case KEY_space: s+="Space"; break; case KEY_F1: case KEY_F2: case KEY_F3: case KEY_F4: case KEY_F5: case KEY_F6: case KEY_F7: case KEY_F8: case KEY_F9: case KEY_F10: case KEY_F11: case KEY_F12: case KEY_F13: case KEY_F14: case KEY_F15: case KEY_F16: case KEY_F17: case KEY_F18: case KEY_F19: case KEY_F20: case KEY_F21: case KEY_F22: case KEY_F23: case KEY_F24: case KEY_F25: case KEY_F26: case KEY_F27: case KEY_F28: case KEY_F29: case KEY_F30: case KEY_F31: case KEY_F32: case KEY_F33: case KEY_F34: case KEY_F35: sprintf(buffer,"F%d",code-KEY_F1+1); s+=buffer; break; default: if(Ascii::isPrint(code)){ if(mods&SHIFTMASK) s+=Ascii::toUpper(code); else s+=Ascii::toLower(code); } else{ sprintf(buffer,"#%04x",code); s+=buffer; } break; } return s; } // Parse accelerator from menu FXHotKey parseAccel(const FXString& string){ register FXuint code=0,mods=0; register FXint pos=0; // Parse leading space while(pos> max; store >> num; FXRESIZE(&key,FXAccelKey,max+1); for(i=0; i<=max; i++){ store >> key[i].code; store >> key[i].target; store >> key[i].messagedn; store >> key[i].messageup; } } // Destroy table FXAccelTable::~FXAccelTable(){ FXTRACE((100,"%p->FXAccelTable::~FXAccelTable\n",this)); FXFREE(&key); key=(FXAccelKey*)-1L; } } fox1.6-1.6.57/src/FXApp.cpp000066400000000000000000005400051326741342000151120ustar00rootroot00000000000000/******************************************************************************** * * * A p p l i c a t i o n O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * Major Contributions for Windows NT by Lyle Johnson * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXApp.cpp,v 1.617.2.8 2008/05/08 12:54:16 fox Exp $ * ********************************************************************************/ #ifdef WIN32 #if _WIN32_WINNT < 0x0400 #define _WIN32_WINNT 0x0400 #endif #endif #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "fxascii.h" #include "fxpriv.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObject.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXId.h" #include "FXDC.h" #include "FXDCWindow.h" #include "FXVisual.h" #include "FXCursor.h" #include "FXFont.h" #include "FXDrawable.h" #include "FXBitmap.h" #include "FXImage.h" #include "FXIcon.h" #include "FXGIFIcon.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXString.h" #include "FXLabel.h" #include "FXButton.h" #include "FXComposite.h" #include "FXRootWindow.h" #include "FXShell.h" #include "FXTopWindow.h" #include "FXPopup.h" #include "FXMenuPane.h" #include "FXDialogBox.h" #include "FXMessageBox.h" #include "FXTranslator.h" #include "FXComposeContext.h" /* Notes: - Should not be able to DND drop into some windows while modal window is up. - Refresh() now forces total GUI updating; flush() updates display only. - Sender is the FXApp, but in case of DND ops, we might have a special stand-in object as the sender (e.g. so we can send it messages). - Application should have a target to be notified of certain app-wide events, such as activation of [a window of] the application etc. - Need way to specify visual on command line (X11). - Need to be able to run event loop w/o display connection (just I/O, and timers). - Need to be able to ``detach'' from GUI more cleanly. - FXApp::exit() should be called by AFTER returning from FXApp::run(); also, FXApp::exit() should not call the global exit():- just because we're done doing GUI things does not mean we're done with the program! - When timer, signal, I/O, chore callback fires, need to go once round the event loop, because these callbacks may set a flag to break out of the event loop. This is done by letting getNextEvent() return FALSE if it returns with NO event [The alternative would be to dispatch these events via dispatchEvent() which is currently a bit difficult]. - Event logging (journalling) and playback. We need some basic capabilities for journalling and playback of user-inputs [basically, mouse and keyboard events]. How exactly this is going to work is not entirely clear, but there are a couple of issues: - Mapping window ID's to something we can save on the file. FXWindow now generates a window-key which can identify each window by means of a kind of Dewey Decimal system. - Which events need logging? Of course, mouse buttons, motion, and keyboard, but how about enter/leave? The real mouse may be moving around too while playing back! - And what should be recorded. - Plus, some difficulty with event dispatch on Windows. - Pre- and post-dispatch hooks. In the pre-dispatch hook, the event is presented to some user-defined function (or maybe message handler) and can be inspected prior to dispatch. Returning a TRUE or FALSE from the pre-dispatch hook function will cause the actual dispatch to be blocked or not. Thus, the predispatch hook can act as an event filter, and events which are passed are dispatched normally. The post-dispatch hook is presented with the event AFTER it was dispatched. Either we present the event to the post-dispatch hook only when it was actually handled somewhere in the GUI, or we always present it and pass a flag that says whether it has been handled by some widget or not. The chief purpose of a post-dispatch hook is for event logging purposes. - Make sure keyboard gets dispatched to modal window [dialog or popup or whatever]. - FXInvocation into a class to its dtor will be called [just in case someone tries to throw an exception]. Having a dtor allows clean up without using a try-catch construct. - Modal modes for FXInvocation: - Non-modal for unconstrained model loops, like e.g. toplevel loop. - Modal for window, typically a dialog but generally modal for any window and its inferiors. Clicking outside the modal window will cause a beep. - Application modal, i.e. always beep no matter which window. This is useful for complete blocking of user-events while still performing layouts and repaints and so on. - Popup modal. Very similar to Modal for a window, except when clicking outside the popup stack is closed instead of issuing a beep. */ // Just in case #define bzero(ptr,size) memset(ptr,0,size) // Regular define #define SELECT(n,r,w,e,t) select(n,r,w,e,t) // FIX for HPUX #ifdef _HPUX_SOURCE #ifndef _XPG4_EXTENDED // HPUX 9.07 #undef SELECT #define SELECT(n,r,w,e,t) select(n,(int*)(r),(int*)(w),(int*)(e),t) #endif #endif // FIX for AIX 3.x #ifndef _XOPEN_SOURCE_EXTENDED #if defined(_POWER) || defined(_IBMR2) #undef SELECT #define SELECT(n,r,w,e,t) select(n,(void*)(r),(void*)(w),(void*)(e),t) extern "C" int gettimeofday(struct timeval *tv, struct timezone *tz); #endif #endif // Default maximum number of colors to allocate #define MAXCOLORS 125 // Largest number of signals on this system #define MAXSIGNALS 64 using namespace FX; /*******************************************************************************/ namespace FX { // Horizontal splitter cursor #include "hsplit.xbm" #include "hsplit_mask.xbm" // Vertical splitter cursor #include "vsplit.xbm" #include "vsplit_mask.xbm" // Cross splitter cursor #include "xsplit.xbm" #include "xsplit_mask.xbm" // Color swatch drag-and-drop cursor #include "swatch.xbm" #include "swatch_mask.xbm" // NO DROP drag-and-drop cursor #include "dontdrop.xbm" #include "dontdrop_mask.xbm" // Upper or lower side MDI resize cursor #include "resizetop.xbm" #include "resizetop_mask.xbm" // Right MDI resize cursor #include "resizetopright.xbm" #include "resizetopright_mask.xbm" // Left MDI resize cursor #include "resizetopleft.xbm" #include "resizetopleft_mask.xbm" // Left or right side MDI resize cursor #include "resizeleft.xbm" #include "resizeleft_mask.xbm" // Move cursor #include "drag.xbm" #include "drag_mask.xbm" // Drag and drop COPY #include "dndcopy.xbm" #include "dndcopy_mask.xbm" // Drag and drop LINK #include "dndlink.xbm" #include "dndlink_mask.xbm" // Drag and drop MOVE #include "dndmove.xbm" #include "dndmove_mask.xbm" // Crosshair #include "crosshair.xbm" #include "crosshair_mask.xbm" // NE,NW,SE,SW corner cursors #include "ne.xbm" #include "ne_mask.xbm" #include "nw.xbm" #include "nw_mask.xbm" #include "se.xbm" #include "se_mask.xbm" #include "sw.xbm" #include "sw_mask.xbm" // Help arrow #include "helparrow.xbm" #include "helparrow_mask.xbm" // Rotate cursor #include "rotate.xbm" #include "rotate_mask.xbm" // Hand cursor #include "hand.xbm" #include "hand_mask.xbm" /*******************************************************************************/ // Callback Record struct FXCBSpec { FXObject *target; // Receiver object FXSelector message; // Message sent to receiver }; // Timer record struct FXTimer { FXTimer *next; // Next timeout in list FXObject *target; // Receiver object void *data; // User data FXSelector message; // Message sent to receiver FXlong due; // When timer is due (ns) }; // Signal record struct FXSignal { FXObject *target; // Receiver object FXSelector message; // Message sent to receiver FXbool handlerset; // Handler was already set FXbool notified; // Signal has fired }; // Idle record struct FXChore { FXChore *next; // Next chore in list FXObject *target; // Receiver object void *data; // User data FXSelector message; // Message sent to receiver }; // Input record struct FXInput { FXCBSpec read; // Callback spec for read FXCBSpec write; // Callback spec for write FXCBSpec excpt; // Callback spec for except }; // A repaint event record struct FXRepaint { FXRepaint *next; // Next repaint in list FXID window; // Window ID of the dirty window FXRectangle rect; // Dirty rectangle FXint hint; // Hint for compositing FXbool synth; // Synthetic expose event or real one? }; // Recursive Event Loop Invocation struct FXInvocation { FXInvocation **invocation; // Pointer to variable holding pointer to current invocation FXInvocation *upper; // Invocation above this one FXWindow *window; // Modal window (if any) FXModality modality; // Modality mode FXint code; // Return code FXbool done; // True if breaking out // Enter modal loop FXInvocation(FXInvocation** inv,FXModality mode,FXWindow* win):invocation(inv),upper(*inv),window(win),modality(mode),code(0),done(FALSE){ *invocation=this; } // Exit modal loop ~FXInvocation(){ *invocation=upper; } }; /*******************************************************************************/ // Application object FXApp* FXApp::app=NULL; // Copyright notice const FXuchar FXApp::copyright[]="Copyright (C) 1997,2005 Jeroen van der Zijp. All Rights Reserved."; #ifndef WIN32 // 17 stipple patterns which match up exactly with the 4x4 dither kernel static const unsigned char stipple_patterns[17][8]={ {0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00}, // 0 (white) {0x00,0x00,0x00,0x88, 0x00,0x00,0x00,0x88}, {0x00,0x22,0x00,0x88, 0x00,0x22,0x00,0x88}, {0x00,0x22,0x00,0xaa, 0x00,0x22,0x00,0xaa}, {0x00,0xaa,0x00,0xaa, 0x00,0xaa,0x00,0xaa}, {0x00,0xaa,0x44,0xaa, 0x00,0xaa,0x44,0xaa}, {0x11,0xaa,0x44,0xaa, 0x11,0xaa,0x44,0xaa}, {0x11,0xaa,0x55,0xaa, 0x11,0xaa,0x55,0xaa}, {0x55,0xaa,0x55,0xaa, 0x55,0xaa,0x55,0xaa}, // 8 (50% grey) {0x55,0xaa,0x55,0xee, 0x55,0xaa,0x55,0xee}, {0x55,0xbb,0x55,0xee, 0x55,0xbb,0x55,0xee}, {0x55,0xbb,0x55,0xff, 0x55,0xbb,0x55,0xff}, {0x55,0xff,0x55,0xff, 0x55,0xff,0x55,0xff}, {0x55,0xff,0xdd,0xff, 0x55,0xff,0xdd,0xff}, {0x77,0xff,0xdd,0xff, 0x77,0xff,0xdd,0xff}, {0x77,0xff,0xff,0xff, 0x77,0xff,0xff,0xff}, {0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff} // 16 (black) }; // Standard-issue cross hatch pattern static const unsigned char cross_bits[] = { 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0xff, 0xff, 0xff, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0xff, 0xff, 0xff, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0xff, 0xff, 0xff, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0xff, 0xff, 0xff, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20 }; // Standard-issue diagonal cross hatch pattern static const unsigned char crossdiag_bits[] = { 0x22, 0x22, 0x14, 0x14, 0x08, 0x08, 0x14, 0x14, 0x22, 0x22, 0x41, 0x41, 0x80, 0x80, 0x41, 0x41, 0x22, 0x22, 0x14, 0x14, 0x08, 0x08, 0x14, 0x14, 0x22, 0x22, 0x41, 0x41, 0x80, 0x80, 0x41, 0x41 }; // Standard-issue diagonal hatch pattern static const unsigned char diag_bits[] = { 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x80, 0x80, 0x40, 0x40 }; // Standard-issue horizontal hatch pattern static const unsigned char hor_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // Standard-issue reverse diagonal hatch pattern static const unsigned char revdiag_bits[] = { 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x01, 0x01 }; // Standard-issue vertical hatch pattern static const unsigned char ver_bits[] = { 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20, 0x08, 0x82, 0x20 }; #else // 17 stipple patterns which match up exactly with the 4x4 dither kernel // Note that each scan line must be word-aligned so we pad to the right // with zeroes. static const BYTE stipple_patterns[17][16]={ {0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00, 0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00}, // 0 (white) {0xff,0x00,0xff,0x00,0xff,0x00,0x77,0x00, 0xff,0x00,0xff,0x00,0xff,0x00,0x77,0x00}, {0xff,0x00,0xdd,0x00,0xff,0x00,0x77,0x00, 0xff,0x00,0xdd,0x00,0xff,0x00,0x77,0x00}, {0xff,0x00,0xdd,0x00,0xff,0x00,0x55,0x00, 0xff,0x00,0xdd,0x00,0xff,0x00,0x55,0x00}, {0xff,0x00,0x55,0x00,0xff,0x00,0x55,0x00, 0xff,0x00,0x55,0x00,0xff,0x00,0x55,0x00}, {0xff,0x00,0x55,0x00,0xbb,0x00,0x55,0x00, 0xff,0x00,0x55,0x00,0xbb,0x00,0x55,0x00}, {0xee,0x00,0x55,0x00,0xbb,0x00,0x55,0x00, 0xee,0x00,0x55,0x00,0xbb,0x00,0x55,0x00}, {0xee,0x00,0x55,0x00,0xaa,0x00,0x55,0x00, 0xee,0x00,0x55,0x00,0xaa,0x00,0x55,0x00}, {0xaa,0x00,0x55,0x00,0xaa,0x00,0x55,0x00, 0xaa,0x00,0x55,0x00,0xaa,0x00,0x55,0x00}, // 8 (50% grey) {0xaa,0x00,0x55,0x00,0xaa,0x00,0x11,0x00, 0xaa,0x00,0x55,0x00,0xaa,0x00,0x11,0x00}, {0xaa,0x00,0x44,0x00,0xaa,0x00,0x11,0x00, 0xaa,0x00,0x44,0x00,0xaa,0x00,0x11,0x00}, {0xaa,0x00,0x44,0x00,0xaa,0x00,0x00,0x00, 0xaa,0x00,0x44,0x00,0xaa,0x00,0x00,0x00}, {0xaa,0x00,0x00,0x00,0xaa,0x00,0x00,0x00, 0xaa,0x00,0x00,0x00,0xaa,0x00,0x00,0x00}, {0xaa,0x00,0x00,0x00,0x22,0x00,0x00,0x00, 0xaa,0x00,0x00,0x00,0x22,0x00,0x00,0x00}, {0x88,0x00,0x00,0x00,0x22,0x00,0x00,0x00, 0x88,0x00,0x00,0x00,0x22,0x00,0x00,0x00}, {0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} // 16 (black) }; #endif /*******************************************************************************/ // Map FXDEFMAP(FXApp) FXAppMap[]={ FXMAPFUNC(SEL_TIMEOUT,FXApp::ID_HOVER,FXApp::onCmdHover), FXMAPFUNC(SEL_TIMEOUT,FXApp::ID_QUIT,FXApp::onCmdQuit), FXMAPFUNC(SEL_SIGNAL,FXApp::ID_QUIT,FXApp::onCmdQuit), FXMAPFUNC(SEL_CHORE,FXApp::ID_QUIT,FXApp::onCmdQuit), FXMAPFUNC(SEL_IO_READ,FXApp::ID_QUIT,FXApp::onCmdQuit), FXMAPFUNC(SEL_IO_WRITE,FXApp::ID_QUIT,FXApp::onCmdQuit), FXMAPFUNC(SEL_IO_EXCEPT,FXApp::ID_QUIT,FXApp::onCmdQuit), FXMAPFUNC(SEL_COMMAND,FXApp::ID_QUIT,FXApp::onCmdQuit), FXMAPFUNC(SEL_COMMAND,FXApp::ID_DUMP,FXApp::onCmdDump), }; // Implementation FXIMPLEMENT(FXApp,FXObject,FXAppMap,ARRAYNUMBER(FXAppMap)) /*******************************************************************************/ // Initialize application object FXApp::FXApp(const FXString& name,const FXString& vendor):registry(name,vendor){ // Initialize private platform independent data display=NULL; // Display connection dpy=":0.0"; // Initial display guess activeWindow=NULL; // Active toplevel window cursorWindow=NULL; // Window under the cursor mouseGrabWindow=NULL; // Window which grabbed mouse keyboardGrabWindow=NULL; // Window which grabbed keyboard keyWindow=NULL; // Window in which keyboard key was pressed selectionWindow=NULL; // Window which has the selection clipboardWindow=NULL; // Window which has the clipboard dragWindow=NULL; // Drop target window dropWindow=NULL; // Drag source window refresher=NULL; // GUI refresher pointer refresherstop=NULL; // GUI refresher end pointer popupWindow=NULL; // No popup windows timers=NULL; // No timers present chores=NULL; // No chores present repaints=NULL; // No outstanding repaints timerrecs=NULL; // No timer records chorerecs=NULL; // No chore records repaintrecs=NULL; // No repaint records invocation=NULL; // Modal loop invocation FXCALLOC(&inputs,FXInput,8); // Input file descriptors ninputs=8; // Number of these maxinput=-1; // Maximum input number signals=NULL; // Signals array nsignals=0; // Number of signal handlers set inputmethod=""; // Input method name inputstyle="root"; // Input method style maxcolors=MAXCOLORS; // Maximum number of colors to allocate ddeData=NULL; // Data exchange array ddeSize=0; // Data exchange array size appArgc=0; // Number of program arguments appArgv=NULL; // Program arguments waitCount=0; // Cursor wait count windowCount=0; // Number of windows initialized=false; // Not yet initialized // Clear event structure event.type=0; event.time=0; event.win_x=0; event.win_y=0; event.root_x=0; event.root_y=0; event.state=0; event.code=0; event.last_x=0; event.last_y=0; event.click_x=0; event.click_y=0; event.rootclick_x=0; event.rootclick_y=0; event.click_time=0; event.click_button=0; event.click_count=0; event.moved=0; event.rect.x=0; event.rect.y=0; event.rect.w=0; event.rect.h=0; event.synthetic=0; event.target=0; // Clear sticky mod state stickyMods=0; // Monochrome visual monoVisual=new FXVisual(this,VISUAL_MONOCHROME); // Default visual defaultVisual=new FXVisual(this,VISUAL_DEFAULT); // Make some cursors cursor[DEF_ARROW_CURSOR]=new FXCursor(this,CURSOR_ARROW); cursor[DEF_RARROW_CURSOR]=new FXCursor(this,CURSOR_RARROW); cursor[DEF_TEXT_CURSOR]=new FXCursor(this,CURSOR_IBEAM); // Cursors for splitter cursor[DEF_HSPLIT_CURSOR]=new FXCursor(this,hsplit_bits,hsplit_mask_bits,hsplit_width,hsplit_height,hsplit_x_hot,hsplit_y_hot); cursor[DEF_VSPLIT_CURSOR]=new FXCursor(this,vsplit_bits,vsplit_mask_bits,vsplit_width,vsplit_height,vsplit_x_hot,vsplit_y_hot); cursor[DEF_XSPLIT_CURSOR]=new FXCursor(this,xsplit_bits,xsplit_mask_bits,xsplit_width,xsplit_height,xsplit_x_hot,xsplit_y_hot); // Color swatch cursor[DEF_SWATCH_CURSOR]=new FXCursor(this,swatch_bits,swatch_mask_bits,swatch_width,swatch_height,swatch_x_hot,swatch_y_hot); // Move cursor[DEF_MOVE_CURSOR]=new FXCursor(this,drag_bits,drag_mask_bits,drag_width,drag_height,drag_x_hot,drag_y_hot); // Dragging edges/corners cursor[DEF_DRAGH_CURSOR]=new FXCursor(this,resizetop_bits,resizetop_mask_bits,resizetop_width,resizetop_height,resizetop_x_hot,resizetop_y_hot); cursor[DEF_DRAGV_CURSOR]=new FXCursor(this,resizeleft_bits,resizeleft_mask_bits,resizeleft_width,resizeleft_height,resizeleft_x_hot,resizeleft_y_hot); cursor[DEF_DRAGTR_CURSOR]=new FXCursor(this,resizetopright_bits,resizetopright_mask_bits,resizetopright_width,resizetopright_height,resizetopright_x_hot,resizetopright_y_hot); cursor[DEF_DRAGTL_CURSOR]=new FXCursor(this,resizetopleft_bits,resizetopleft_mask_bits,resizetopleft_width,resizetopleft_height,resizetopleft_x_hot,resizetopleft_y_hot); // DND actions cursor[DEF_DNDSTOP_CURSOR]=new FXCursor(this,dontdrop_bits,dontdrop_mask_bits,dontdrop_width,dontdrop_height,dontdrop_x_hot,dontdrop_y_hot); cursor[DEF_DNDCOPY_CURSOR]=new FXCursor(this,dndcopy_bits,dndcopy_mask_bits,dndcopy_width,dndcopy_height,dndcopy_x_hot,dndcopy_y_hot); cursor[DEF_DNDMOVE_CURSOR]=new FXCursor(this,dndmove_bits,dndmove_mask_bits,dndmove_width,dndmove_height,dndmove_x_hot,dndmove_y_hot); cursor[DEF_DNDLINK_CURSOR]=new FXCursor(this,dndlink_bits,dndlink_mask_bits,dndlink_width,dndlink_height,dndlink_x_hot,dndlink_y_hot); // Crosshairs cursor[DEF_CROSSHAIR_CURSOR]=new FXCursor(this,crosshair_bits,crosshair_mask_bits,crosshair_width,crosshair_height,crosshair_x_hot,crosshair_y_hot); // NE,NW,SE,SW corners cursor[DEF_CORNERNE_CURSOR]=new FXCursor(this,ne_bits,ne_mask_bits,ne_width,ne_height,ne_x_hot,ne_y_hot); cursor[DEF_CORNERNW_CURSOR]=new FXCursor(this,nw_bits,nw_mask_bits,nw_width,nw_height,nw_x_hot,nw_y_hot); cursor[DEF_CORNERSE_CURSOR]=new FXCursor(this,se_bits,se_mask_bits,se_width,se_height,se_x_hot,se_y_hot); cursor[DEF_CORNERSW_CURSOR]=new FXCursor(this,sw_bits,sw_mask_bits,sw_width,sw_height,sw_x_hot,sw_y_hot); // Help arrow cursor cursor[DEF_HELP_CURSOR]=new FXCursor(this,helparrow_bits,helparrow_mask_bits,helparrow_width,helparrow_height,helparrow_x_hot,helparrow_y_hot); // Hand cursor cursor[DEF_HAND_CURSOR]=new FXCursor(this,hand_bits,hand_mask_bits,hand_width,hand_height,hand_x_hot,hand_y_hot); // Rotate cursor[DEF_ROTATE_CURSOR]=new FXCursor(this,rotate_bits,rotate_mask_bits,rotate_width,rotate_height,rotate_x_hot,rotate_y_hot); // Wait cursor cursor[DEF_WAIT_CURSOR]=new FXCursor(this,CURSOR_WATCH); // Set current wait cursor waitCursor=cursor[DEF_WAIT_CURSOR]; // Root window root=new FXRootWindow(this,defaultVisual); // X Window specific inits #ifndef WIN32 wmDeleteWindow=0; // Window Manager stuff wmQuitApp=0; wmProtocols=0; wmMotifHints=0; wmTakeFocus=0; wmState=0; wmNetState=0; wmNetIconName=0; wmNetWindowName=0; wmNetSupported=0; // Extended Window Manager stuff wmNetWindowType=0; wmNetHMaximized=0; wmNetVMaximized=0; wmNetMoveResize=0; wmNetPing=0; wmWindowRole=0; // Window Role wmClientLeader=0; // Client leader wmClientId=0; // Session management id embedAtom=0; // XEMBED support embedInfoAtom=0; // XEMBED info support timestampAtom=0; // Server time // DDE ddeTargets=0; // Data exchange to get list of types ddeAtom=0; // Data exchange atom ddeDelete=0; // Data exchange delete request ddeTypeList=NULL; // Data types list available ddeNumTypes=0; // Number of data types ddeAction=DRAG_REJECT; // Drag and drop action requested ansAction=DRAG_REJECT; // Drag and drop action suggested // CLIPBOARD xcbSelection=0; // Clipboard selection atom xcbTypeList=NULL; // List of clipboard types xcbNumTypes=0; // How many types clipped // SELECTION xselTypeList=NULL; // List of primary selection types xselNumTypes=0; // How many types in list // XDND xdndTypeList=NULL; // List of XDND types xdndNumTypes=0; // How many types in list xdndProxy=0; // XDND proxy atom xdndAware=0; // XDND awareness atom xdndEnter=0; // XDND Message types xdndLeave=0; xdndPosition=0; xdndStatus=0; xdndDrop=0; xdndFinished=0; xdndSelection=0; xdndActionCopy=0; // XDND Move action xdndActionMove=0; // XDND Copy action xdndActionLink=0; // XDND Link action xdndActionPrivate=0; // XDND Private action xdndTypes=0; xdndSource=0; // XDND drag source window xdndTarget=0; // XDND drop target window xdndProxyTarget=0; // XDND window to set messages to xdndStatusPending=FALSE; // XDND waiting for status feedback xdndStatusReceived=FALSE; // XDND received at least one status xdndWantUpdates=TRUE; // XDND target always wants new positions xdndFinishSent=FALSE; // XDND finish sent xdndRect.x=0; // XDND motion rectangle xdndRect.y=0; xdndRect.w=0; xdndRect.h=0; xrreventbase=0; // XRR support FXCALLOC(&r_fds,fd_set,1); // Read File Descriptor set FXCALLOC(&w_fds,fd_set,1); // Write File Descriptor set FXCALLOC(&e_fds,fd_set,1); // Except File Descriptor set xim=NULL; // Input method stuff // Miscellaneous stuff shmi=TRUE; shmp=TRUE; synchronize=FALSE; // MS-Windows specific inits #else // DDE ddeTargets=0; // Data exchange to get list of types ddeAtom=0; // Data exchange atom ddeDelete=0; // Data exchange delete request ddeTypeList=NULL; // Data types list available ddeNumTypes=0; // Number of data types ddeAction=DRAG_REJECT; // Drag and drop action requested ansAction=DRAG_REJECT; // Drag and drop action suggested // SELECTION xselTypeList=NULL; // List of primary selection types xselNumTypes=0; // How many types in list // XDND xdndFinishPending=FALSE; // XDND waiting for drop-confirmation xdndAware=0; // XDND awareness atom xdndTypes=NULL; xdndSource=0; // XDND drag source window xdndTarget=0; // XDND drop target window xdndStatusPending=FALSE; // XDND waiting for status feedback xdndStatusReceived=FALSE; // XDND received at least one status xdndFinishSent=FALSE; // XDND finish sent xdndRect.x=0; // XDND motion rectangle xdndRect.y=0; xdndRect.w=0; xdndRect.h=0; FXCALLOC(&handles,void*,ninputs); // Same size as inputs array #endif // Other settings typingSpeed=1000; clickSpeed=400; scrollSpeed=80; scrollDelay=600; blinkSpeed=500; animSpeed=10; menuPause=400; tooltipPause=800; tooltipTime=3000; dragDelta=6; wheelLines=10; scrollBarSize=15; // Make font #ifdef HAVE_XFT_H normalFont=new FXFont(this,"Sans,90"); #else normalFont=new FXFont(this,"helvetica,90"); // normalFont=new FXFont(this,"helvetica,90,,,,iso10646-1"); #endif // We delete the stock font stockFont=normalFont; // Default translator translator=new FXTranslator(this); // Init colors borderColor=FXRGB(0,0,0); baseColor=FXRGB(212,208,200); hiliteColor=makeHiliteColor(baseColor); shadowColor=makeShadowColor(baseColor); backColor=FXRGB(255,255,255); foreColor=FXRGB(0,0,0); selforeColor=FXRGB(255,255,255); selbackColor=FXRGB(10,36,106); tipforeColor=FXRGB(0,0,0); tipbackColor=FXRGB(255,255,225); selMenuTextColor=FXRGB(255,255,255); selMenuBackColor=FXRGB(10,36,106); // Pointer to FXApp app=this; } /*******************************************************************************/ // Find window from id FXWindow* FXApp::findWindowWithId(FXID xid) const { return (FXWindow*)hash.find((void*)xid); } // Find window from root x,y, starting from given window FXWindow* FXApp::findWindowAt(FXint rx,FXint ry,FXID window) const { if(initialized){ #ifndef WIN32 Window rootwin=XDefaultRootWindow((Display*)display); Window child; int wx,wy; if(!window) window=rootwin; while(1){ if(!XTranslateCoordinates((Display*)display,rootwin,window,rx,ry,&wx,&wy,&child)) return NULL; if(child==None) break; window=child; } #else POINT point; point.x=rx; point.y=ry; window=WindowFromPoint(point); // FIXME this finds only enabled/visible windows #endif return findWindowWithId(window); } return NULL; } // Return window at the end of the focus chain FXWindow *FXApp::getFocusWindow() const { FXWindow *result=getActiveWindow(); if(result){ while(result->getFocus()){ result=result->getFocus(); } } return result; } /*******************************************************************************/ #ifndef WIN32 // Perhaps should do something else... static int xerrorhandler(Display* dpy,XErrorEvent* eev){ char buf[256]; // A BadWindow due to X_SendEvent is likely due to XDND if(eev->error_code==BadWindow && eev->request_code==25) return 0; // WM_TAKE_FOCUS causes sporadic errors for X_SetInputFocus if(eev->request_code==42) return 0; // Get error codes XGetErrorText(dpy,eev->error_code,buf,sizeof(buf)); // Print out meaningful warning fxwarning("X Error: code %d major %d minor %d: %s.\n",eev->error_code,eev->request_code,eev->minor_code,buf); return 1; } // Fatal error (e.g. lost connection) static int xfatalerrorhandler(Display*){ fxerror("X Fatal error.\n"); return 1; } // Extended Window Manager types static const FXchar *wmNetTypeNames[]={ "_NET_WM_WINDOW_TYPE_DESKTOP", "_NET_WM_WINDOW_TYPE_DOCK", "_NET_WM_WINDOW_TYPE_TOOLBAR", "_NET_WM_WINDOW_TYPE_MENU", "_NET_WM_WINDOW_TYPE_UTILITY", "_NET_WM_WINDOW_TYPE_SPLASH", "_NET_WM_WINDOW_TYPE_DIALOG", "_NET_WM_WINDOW_TYPE_NORMAL" }; // Extended Window Manager states static const FXchar *wmNetStateNames[]={ "_NET_WM_STATE_MODAL", "_NET_WM_STATE_STICKY", "_NET_WM_STATE_MAXIMIZED_VERT", "_NET_WM_STATE_MAXIMIZED_HORZ", "_NET_WM_STATE_SHADED", "_NET_WM_STATE_SKIP_TASKBAR", "_NET_WM_STATE_SKIP_PAGER", "_NET_WM_STATE_HIDDEN", "_NET_WM_STATE_FULLSCREEN", "_NET_WM_STATE_ABOVE", "_NET_WM_STATE_BELOW", "_NET_WM_STATE_DEMANDS_ATTENTION" }; // Input method was created; unregister the callback, and initialize it void FXApp::imcreatecallback(void*,FXApp* a,void*){ #ifndef NO_XIM XIMCallback ximcallback; fxwarning("Warning: input method server restarted.\n"); XUnregisterIMInstantiateCallback((Display*)app->getDisplay(),NULL,NULL,NULL,(XIMProc)imcreatecallback,(XPointer)a); a->xim=XOpenIM((Display*)app->display,NULL,NULL,NULL); if(a->xim){ ximcallback.callback=(XIMProc)imdestroycallback; ximcallback.client_data=(XPointer)a; XSetIMValues((XIM)a->xim,XNDestroyCallback,&ximcallback,NULL); } #endif } // Input method was deleted; set callback to recreate it when the IM restarts. void FXApp::imdestroycallback(void*,FXApp* a,void*){ #ifndef NO_XIM fxwarning("Warning: input method server terminated.\n"); XRegisterIMInstantiateCallback((Display*)a->getDisplay(),NULL,NULL,NULL,(XIMProc)imcreatecallback,(XPointer)a); a->xim=NULL; #endif } #else // Trick to find module handle of FOX library static HINSTANCE GetOwnModuleHandle(){ MEMORY_BASIC_INFORMATION mbi; VirtualQuery((const void*)GetOwnModuleHandle,&mbi,sizeof(mbi)); return (HINSTANCE)mbi.AllocationBase; } #endif /*******************************************************************************/ // Open the display bool FXApp::openDisplay(const FXchar* dpyname){ if(!initialized){ // What's going on FXTRACE((100,"%s::openDisplay: opening display.\n",getClassName())); #ifndef WIN32 // Set error handler XSetErrorHandler(xerrorhandler); // Set fatal handler XSetIOErrorHandler(xfatalerrorhandler); // Revert to default if(!dpyname) dpyname=dpy; // Open display display=XOpenDisplay(dpyname); if(!display) return false; // For debugging if(synchronize) XSynchronize((Display*)display,TRUE); // Setup locales and input method if given if(XSupportsLocale()){ FXchar mods[100]=""; if(inputmethod[0]){ strcpy(mods,"@im="); strcat(mods,inputmethod); } if(!XSetLocaleModifiers(mods)){ if(!XSetLocaleModifiers("")){ fxwarning("Cannot set locale modifiers.\n"); } } } #ifdef HAVE_XSHM_H // Displaying remotely turns it off for sure if(!(dpyname[0]==':' && Ascii::isDigit(dpyname[1]))){ shmi=FALSE; shmp=FALSE; } // Its potentially on, see if local display groks it if(shmi || shmp){ int maj,min,dum; Bool pm; shmi=FALSE; shmp=FALSE; if(XQueryExtension((Display*)display,"MIT-SHM",&dum,&dum,&dum)){ if(XShmQueryVersion((Display*)display,&maj,&min,&pm)){ shmp=pm && (XShmPixmapFormat((Display*)display)==ZPixmap); shmi=TRUE; } } } #else // Don't have it! shmi=FALSE; shmp=FALSE; #endif // Report the result FXTRACE((100,"X Shared Images = %d\n",shmi)); FXTRACE((100,"X Shared Pixmaps = %d\n",shmp)); // Initialize Xft and fontconfig #ifdef HAVE_XFT_H if(!XftInit(NULL)) return false; if(XftGetVersion()next){ if(t->target==tgt && t->message==sel){ *tt=t->next; goto a; } } if(timerrecs){ t=timerrecs; timerrecs=t->next; } else{ t=new FXTimer; } a:t->data=ptr; t->target=tgt; t->due=FXThread::time()+nsec; t->message=sel; for(tt=&timers; *tt && ((*tt)->due < t->due); tt=&(*tt)->next); t->next=*tt; *tt=t; } // Remove timeout identified by tgt and sel from the list void FXApp::removeTimeout(FXObject* tgt,FXSelector sel){ register FXTimer *t,**tt; for(tt=&timers; (t=*tt)!=NULL; tt=&t->next){ if(t->target==tgt && t->message==sel){ *tt=t->next; t->next=timerrecs; timerrecs=t; break; } } } // Check if timeout identified by tgt and sel has been set bool FXApp::hasTimeout(FXObject* tgt,FXSelector sel) const { for(register FXTimer *t=timers; t; t=t->next){ if(t->target==tgt && t->message==sel) return true; } return false; } // Return, in ms, the time remaining until the given timer fires. FXuint FXApp::remainingTimeout(FXObject *tgt,FXSelector sel){ register FXuint remaining=4294967295U; for(register FXTimer *t=timers; t; t=t->next){ if(t->target==tgt && t->message==sel){ register FXlong now=FXThread::time(); remaining=0; if(nowdue){ remaining=(FXuint)((t->due-now)/1000000L); } break; } } return remaining; } // Handle any outstanding timers void FXApp::handleTimeouts(){ register FXlong now=FXThread::time(); register FXTimer* t; while(timers){ if(now < timers->due) break; t=timers; timers=t->next; if(t->target && t->target->tryHandle(this,FXSEL(SEL_TIMEOUT,t->message),t->data)) refresh(); t->next=timerrecs; timerrecs=t; } } /*******************************************************************************/ // Signal handler; note this is a single write operation // which can not be interrupted by another handler! void FXApp::signalhandler(int sig){ app->signals[sig].notified=TRUE; } // This signal handler is potentially dangerous as it dispatches // the message to the target right here in the handler; you probably // want to use this one only in ``desperate'' situations. void FXApp::immediatesignalhandler(int sig){ if(app->signals[sig].target) app->signals[sig].target->handle(app,FXSEL(SEL_SIGNAL,app->signals[sig].message),(void*)(FXival)sig); } // Add a signal message void FXApp::addSignal(FXint sig,FXObject* tgt,FXSelector sel,FXbool immediate,FXuint flags){ void (*handler)(int); if(sig<0 || MAXSIGNALSnext){ if(c->target==tgt && c->message==sel){ *cc=c->next; result=c->data; goto a; } } if(chorerecs){ c=chorerecs; chorerecs=c->next; } else{ c=new FXChore; } a:c->data=ptr; c->target=tgt; c->message=sel; for(cc=&chores; *cc; cc=&(*cc)->next); c->next=NULL; *cc=c; return result; } // Remove chore identified by tgt and sel from the list void* FXApp::removeChore(FXObject* tgt,FXSelector sel){ register void* result=NULL; register FXChore *c,**cc; for(cc=&chores; (c=*cc)!=NULL; cc=&c->next){ if(c->target==tgt && c->message==sel){ *cc=c->next; result=c->data; c->next=chorerecs; chorerecs=c; break; } } return result; } // Check if chore identified by tgt and sel has been set bool FXApp::hasChore(FXObject* tgt,FXSelector sel) const { for(register FXChore *c=chores; c; c=c->next){ if(c->target==tgt && c->message==sel) return true; } return false; } /*******************************************************************************/ // Add input bool FXApp::addInput(FXInputHandle fd,FXuint mode,FXObject *tgt,FXSelector sel){ if(mode==INPUT_NONE) return false; #ifndef WIN32 if(fd<0 || fd>=FD_SETSIZE) return false; if(fd>=ninputs){ // Grow table of callbacks FXRESIZE(&inputs,FXInput,fd+1); memset(&inputs[ninputs],0,sizeof(FXInput)*(fd+1-ninputs)); ninputs=fd+1; } FXASSERT(inputs); FXASSERT(fdmaxinput) maxinput=fd; #else register FXint in; if(fd==INVALID_HANDLE_VALUE || fd==NULL) return false; for(in=0; in<=maxinput; in++){ // See if existing handle if(handles[in]==fd) goto r; // If existing handle, just replace callbacks } if(maxinput+1>=MAXIMUM_WAIT_OBJECTS) return false; if(maxinput+1>=ninputs){ // Grow table of callbacks FXRESIZE(&inputs,FXInput,ninputs+1); memset(&inputs[ninputs],0,sizeof(FXInput)); FXRESIZE(&handles,void*,ninputs+1); ninputs=ninputs+1; } in=++maxinput; // One more handle handles[in]=fd; r:FXASSERT(inmaxinput) return false; if(mode&INPUT_READ){ inputs[fd].read.target=NULL; inputs[fd].read.message=0; FD_CLR(fd,(fd_set*)r_fds); } if(mode&INPUT_WRITE){ inputs[fd].write.target=NULL; inputs[fd].write.message=0; FD_CLR(fd,(fd_set*)w_fds); } if(mode&INPUT_EXCEPT){ inputs[fd].excpt.target=NULL; inputs[fd].excpt.message=0; FD_CLR(fd,(fd_set*)e_fds); } if(fd==maxinput){ while(fd>=0 && !FD_ISSET(fd,(fd_set*)r_fds) && !FD_ISSET(fd,(fd_set*)w_fds) && !FD_ISSET(fd,(fd_set*)e_fds)){ --fd; } maxinput=fd; } #else register FXint in; if(fd==INVALID_HANDLE_VALUE || fd==NULL) return false; for(in=0; in<=maxinput; in++){ // See if existing handle if(handles[in]==fd) goto r; } return FALSE; // Handle didn't exist, so nothing to remove r:if(mode&INPUT_READ){ inputs[in].read.target=NULL; inputs[in].read.message=0; } if(mode&INPUT_WRITE){ inputs[in].write.target=NULL; inputs[in].write.message=0; } if(mode&INPUT_EXCEPT){ inputs[in].excpt.target=NULL; inputs[in].excpt.message=0; } if(!inputs[in].read.target && !inputs[in].write.target && !inputs[in].excpt.target){ // Removed them all handles[in]=handles[maxinput]; // Compact handle table inputs[in]=inputs[maxinput]; maxinput--; } #endif return true; } /*******************************************************************************/ // Generate SEL_LEAVE void FXApp::leaveWindow(FXWindow *window,FXWindow *ancestor){ if(window && window->getParent() && window!=ancestor){ event.type=SEL_LEAVE; window->translateCoordinatesFrom(event.win_x,event.win_y,root,event.root_x,event.root_y); if(window->handle(this,FXSEL(SEL_LEAVE,0),&event)) refresh(); cursorWindow=window->getParent(); leaveWindow(window->getParent(),ancestor); } } // Generate SEL_ENTER void FXApp::enterWindow(FXWindow *window,FXWindow *ancestor){ if(window && window->getParent() && window!=ancestor){ enterWindow(window->getParent(),ancestor); event.type=SEL_ENTER; window->translateCoordinatesFrom(event.win_x,event.win_y,root,event.root_x,event.root_y); cursorWindow=window; if(window->handle(this,FXSEL(SEL_ENTER,0),&event)) refresh(); } } /*******************************************************************************/ #ifndef WIN32 // Smart rectangle compositing algorithm void FXApp::addRepaint(FXID win,FXint x,FXint y,FXint w,FXint h,FXbool synth){ register FXint px,py,pw,ph,hint,area; register FXRepaint *r,**pr; hint=w*h; w+=x; h+=y; do{ // Find overlap with outstanding rectangles for(r=repaints,pr=&repaints; r; pr=&r->next,r=r->next){ if(r->window==win){ // Tentatively conglomerate rectangles px=FXMIN(x,r->rect.x); py=FXMIN(y,r->rect.y); pw=FXMAX(w,r->rect.w); ph=FXMAX(h,r->rect.h); area=(pw-px)*(ph-py); // New area MUCH bigger than sum; forget about it if(area > (hint+r->hint)*2) continue; // Take old paintrect out of the list *pr=r->next; r->next=repaintrecs; repaintrecs=r; // New rectangle synth|=r->synth; // Synthethic is preserved! hint=area; x=px; y=py; w=pw; h=ph; break; } } } while(r); // Get rectangle, recycled if possible if(repaintrecs){ r=repaintrecs; repaintrecs=r->next; } else{ r=new FXRepaint; } // Fill it r->window=win; r->rect.x=x; r->rect.y=y; r->rect.w=w; r->rect.h=h; r->hint=hint; r->synth=synth; r->next=NULL; *pr=r; } // Remove repaints by dispatching them void FXApp::removeRepaints(FXID win,FXint x,FXint y,FXint w,FXint h){ FXRepaint *r,**rr; XEvent ev; w+=x; h+=y; // Flush the buffer and wait till the X server catches up; // resulting events, if any, are buffered in the client. XSync((Display*)display,FALSE); // Fish out the expose events and compound them while(XCheckMaskEvent((Display*)display,ExposureMask,&ev)){ if(ev.xany.type==NoExpose) continue; addRepaint(ev.xexpose.window,ev.xexpose.x,ev.xexpose.y,ev.xexpose.width,ev.xexpose.height,0); } // Then process events pertaining to window win and overlapping // with the given rectangle; other events are left in the queue. rr=&repaints; while((r=*rr)!=NULL){ if(!win || (win==r->window && xrect.w && yrect.h && r->rect.xrect.ynext; ev.xany.type=Expose; ev.xexpose.window=r->window; ev.xexpose.x=r->rect.x; ev.xexpose.y=r->rect.y; ev.xexpose.width=r->rect.w-r->rect.x; ev.xexpose.height=r->rect.h-r->rect.y; r->next=repaintrecs; repaintrecs=r; dispatchEvent(ev); continue; } rr=&r->next; } // Flush the buffer again XFlush((Display*)display); } // Scroll repaint rectangles; some slight trickyness here:- the // rectangles don't just move, they stretch in the scroll direction // This means the original dirty area will remain part of the area to // be painted. void FXApp::scrollRepaints(FXID win,FXint dx,FXint dy){ register FXRepaint *r; for(r=repaints; r; r=r->next){ if(r->window==win){ if(dx>0) r->rect.w+=dx; else r->rect.x+=dx; if(dy>0) r->rect.h+=dy; else r->rect.y+=dy; } } } #endif /*******************************************************************************/ #ifndef WIN32 // Get an event bool FXApp::getNextEvent(FXRawEvent& ev,bool blocking){ XEvent e; // Set to no-op just in case ev.xany.type=0; // Handle all past due timers if(timers) handleTimeouts(); // Check non-immediate signals that may have fired if(nsignals){ for(FXint sig=0; sigtryHandle(this,FXSEL(SEL_SIGNAL,signals[sig].message),(void*)(FXival)sig)){ refresh(); return false; } } } } // Are there no events already queued up? if(!initialized || !XEventsQueued((Display*)display,QueuedAfterFlush)){ struct timeval delta; fd_set readfds; fd_set writefds; fd_set exceptfds; int maxfds; int nfds; // Prepare fd's to check maxfds=maxinput; readfds=*((fd_set*)r_fds); writefds=*((fd_set*)w_fds); exceptfds=*((fd_set*)e_fds); // Add connection to display if its open if(initialized){ FD_SET(ConnectionNumber((Display*)display),&readfds); if(ConnectionNumber((Display*)display)>maxfds) maxfds=ConnectionNumber((Display*)display); } delta.tv_usec=0; delta.tv_sec=0; // Do a quick poll for any ready events or inputs nfds=SELECT(maxfds+1,&readfds,&writefds,&exceptfds,&delta); // Nothing to do, so perform idle processing if(nfds==0){ // Release the expose events if(repaints){ register FXRepaint *r=repaints; ev.xany.type=Expose; ev.xexpose.window=r->window; ev.xexpose.send_event=r->synth; ev.xexpose.x=r->rect.x; ev.xexpose.y=r->rect.y; ev.xexpose.width=r->rect.w-r->rect.x; ev.xexpose.height=r->rect.h-r->rect.y; repaints=r->next; r->next=repaintrecs; repaintrecs=r; return true; } // Do our chores :-) if(chores){ register FXChore *c=chores; chores=c->next; if(c->target && c->target->tryHandle(this,FXSEL(SEL_CHORE,c->message),c->data)) refresh(); c->next=chorerecs; chorerecs=c; } // GUI updating:- walk the whole widget tree. if(refresher){ refresher->handle(this,FXSEL(SEL_UPDATE,0),NULL); if(refresher->getFirst()){ refresher=refresher->getFirst(); } else{ while(refresher->getParent()){ if(refresher->getNext()){refresher=refresher->getNext();break;} refresher=refresher->getParent(); } } FXASSERT(refresher); if(refresher!=refresherstop) return false; refresher=refresherstop=NULL; } // There are more chores to do if(chores) return false; // We're not blocking if(!blocking) return false; // Now, block till timeout, i/o, or event maxfds=maxinput; readfds=*((fd_set*)r_fds); writefds=*((fd_set*)w_fds); exceptfds=*((fd_set*)e_fds); // Add connection to display if its open if(initialized){ FD_SET(ConnectionNumber((Display*)display),&readfds); if(ConnectionNumber((Display*)display)>maxfds) maxfds=ConnectionNumber((Display*)display); } // If there are timers, we block only for a little while. if(timers){ // All that testing above may have taken some time... FXlong interval=timers->due-FXThread::time(); // Some timers are already due; do them right away! if(interval<=0) return false; // Compute how long to wait delta.tv_usec=(interval/1000)%1000000; delta.tv_sec=interval/1000000000; // Exit critical section appMutex.unlock(); // Block till timer or event or interrupt nfds=SELECT(maxfds+1,&readfds,&writefds,&exceptfds,&delta); // Enter critical section appMutex.lock(); } // If no timers, we block till event or interrupt else{ // Exit critical section appMutex.unlock(); // Block until something happens nfds=SELECT(maxfds+1,&readfds,&writefds,&exceptfds,NULL); // Enter critical section appMutex.lock(); } } // Timed out or interrupted if(nfds<=0){ if(nfds<0 && errno!=EAGAIN && errno!=EINTR){fxerror("Application terminated: interrupt or lost connection errno=%d\n",errno);} return false; } // Any other file descriptors set? if(0<=maxinput){ // Examine I/O file descriptors for(FXInputHandle fff=0; fff<=maxinput; fff++){ // Copy the record as the callbacks may try to change things FXInput in=inputs[fff]; // Skip the display connection, which is treated differently if(initialized && (fff==ConnectionNumber((Display*)display))) continue; // Check file descriptors if(FD_ISSET(fff,&readfds)){ if(in.read.target && in.read.target->tryHandle(this,FXSEL(SEL_IO_READ,in.read.message),(void*)(FXival)fff)) refresh(); } if(FD_ISSET(fff,&writefds)){ if(in.write.target && in.write.target->tryHandle(this,FXSEL(SEL_IO_WRITE,in.write.message),(void*)(FXival)fff)) refresh(); } if(FD_ISSET(fff,&exceptfds)){ if(in.excpt.target && in.excpt.target->tryHandle(this,FXSEL(SEL_IO_EXCEPT,in.excpt.message),(void*)(FXival)fff)) refresh(); } } } // If there is no event, we're done if(!initialized || !FD_ISSET(ConnectionNumber((Display*)display),&readfds) || !XEventsQueued((Display*)display,QueuedAfterReading)) return false; } // Get an event XNextEvent((Display*)display,&ev); // Filter event through input method context, if any if(xim && XFilterEvent(&ev,None)) return false; // Save expose events for later... if(ev.xany.type==Expose || ev.xany.type==GraphicsExpose){ addRepaint((FXID)ev.xexpose.window,ev.xexpose.x,ev.xexpose.y,ev.xexpose.width,ev.xexpose.height,0); return false; } // Compress motion events if(ev.xany.type==MotionNotify){ while(XPending((Display*)display)){ XPeekEvent((Display*)display,&e); if((e.xany.type!=MotionNotify) || (ev.xmotion.window!=e.xmotion.window) || (ev.xmotion.state != e.xmotion.state)) break; XNextEvent((Display*)display,&ev); } } // Compress wheel events else if((ev.xany.type==ButtonPress) && (ev.xbutton.button==Button4 || ev.xbutton.button==Button5)){ FXint ticks=1; while(XPending((Display*)display)){ XPeekEvent((Display*)display,&e); if((e.xany.type!=ButtonPress && e.xany.type!=ButtonRelease) || (ev.xany.window!=e.xany.window) || (ev.xbutton.button != e.xbutton.button)) break; ticks+=(e.xany.type==ButtonPress); XNextEvent((Display*)display,&ev); } ev.xbutton.subwindow=(Window)ticks; // Stick it here for later } // Compress configure events else if(ev.xany.type==ConfigureNotify){ while(XCheckTypedWindowEvent((Display*)display,ev.xconfigure.window,ConfigureNotify,&e)){ ev.xconfigure.width=e.xconfigure.width; ev.xconfigure.height=e.xconfigure.height; if(e.xconfigure.send_event){ ev.xconfigure.x=e.xconfigure.x; ev.xconfigure.y=e.xconfigure.y; } } } // Regular event return true; } /*******************************************************************************/ // Peek for event bool FXApp::peekEvent(){ if(initialized){ struct timeval delta; fd_set readfds; fd_set writefds; fd_set exceptfds; int maxfds; int nfds; // Outstanding repaints if(repaints) return true; // Still need GUI update if(refresher) return true; // Outstanding chores if(chores) return true; // Timers are due? if(timers){ if(timers->due <= FXThread::time()) return true; } // Events queued up in client already (Shouldn't this not be QueuedAlready?) if(XEventsQueued((Display*)display,QueuedAfterFlush)) return true; // Prepare fd's to watch FD_ZERO(&readfds); FD_ZERO(&writefds); FD_ZERO(&exceptfds); FD_SET(ConnectionNumber((Display*)display),&readfds); // Add other inputs... maxfds=ConnectionNumber((Display*)display); delta.tv_usec=0; delta.tv_sec=0; // Do a quick poll for any ready events nfds=SELECT(maxfds+1,&readfds,&writefds,&exceptfds,&delta); // Interrupt if(nfds<0 && errno!=EAGAIN && errno!=EINTR){ fxerror("Application terminated: interrupt or lost connection errno=%d\n",errno); } // I/O activity if((nfds>0) && FD_ISSET(ConnectionNumber((Display*)display),&readfds)){ if(XEventsQueued((Display*)display,QueuedAfterReading)) return true; } } return false; } /*******************************************************************************/ // Translate key code to utf8 text FXString translateKeyEvent(FXRawEvent& event){ char buffer[40]; KeySym sym; FXwchar w; XLookupString(&event.xkey,buffer,sizeof(buffer),&sym,NULL); w=fxkeysym2ucs(sym); return FXString(&w,1); } // Get keysym; interprets the modifiers! static FXuint keysym(FXRawEvent& event){ KeySym sym=KEY_VoidSymbol; char buffer[40]; XLookupString(&event.xkey,buffer,sizeof(buffer),&sym,NULL); return sym; } /* // Translate key code to utf8 text FXString translateKeyEvent(XEvent& event,XIC xic){ char buffer[40]; KeySym sym; Status s; int n; FXString result; FXwchar w=0; #ifndef NO_XIM if(xic){ n=XmbLookupString((XIC)xic,&event.xkey,buffer,sizeof(buffer),&sym,&s); if(s!=XLookupChars && s!=XLookupBoth) n=0; // FIXME decode buffer based on XLocaleOfIM(XIMOfIC((XIC)xic)) buffer[n]=0; FXTRACE((100,"XLocaleOfIM=%s\n",XLocaleOfIM(XIMOfIC((XIC)xic)))); result.assign(buffer,n); } else{ #endif n=XLookupString(&event.xkey,buffer,sizeof(buffer),&sym,NULL); w=fxkeysym2ucs(sym); result.assign(&w,1); #ifndef NO_XIM } #endif return result; } */ // Dispatch event to widget bool FXApp::dispatchEvent(FXRawEvent& ev){ FXWindow *window,*ancestor; FXint tmp_x,tmp_y; Atom answer; XEvent se; Window tmp; // Get window window=findWindowWithId(ev.xany.window); // Was one of our windows, so dispatch if(window){ switch(ev.xany.type){ // Repaint event case GraphicsExpose: case Expose: event.type=SEL_PAINT; event.rect.x=ev.xexpose.x; event.rect.y=ev.xexpose.y; event.rect.w=ev.xexpose.width; event.rect.h=ev.xexpose.height; event.synthetic=ev.xexpose.send_event; window->handle(this,FXSEL(SEL_PAINT,0),&event); case NoExpose: return true; // Keymap Notify case KeymapNotify: //memcpy(keystate,ev.xkeymap.key_vector,32); return true; // Keyboard case KeyPress: case KeyRelease: event.type=SEL_KEYPRESS+ev.xkey.type-KeyPress; event.time=ev.xkey.time; event.win_x=ev.xkey.x; event.win_y=ev.xkey.y; event.root_x=ev.xkey.x_root; event.root_y=ev.xkey.y_root; // Translate to keysym; must interpret modifiers! event.code=keysym(ev); // XModifierKeymap *XGetModifierMapping((Display*)display); // Translate to string on KeyPress if(ev.xkey.type==KeyPress){ // FXTRACE((1,"getFocusWindow()=%s\n",getFocusWindow()?getFocusWindow()->getClassName():"nil")); if(getFocusWindow() && getFocusWindow()->getComposeContext()) event.text=getFocusWindow()->getComposeContext()->translateEvent(ev); else event.text=translateKeyEvent(ev); } // Clear string on KeyRelease else{ event.text.clear(); } // Mouse buttons and modifiers but no wheel buttons event.state=ev.xkey.state&~(Button4Mask|Button5Mask); // Fix modifier state if(ev.xkey.type==KeyPress){ if(event.code==KEY_Shift_L) event.state|=SHIFTMASK; else if(event.code==KEY_Shift_R) event.state|=SHIFTMASK; else if(event.code==KEY_Control_L) event.state|=CONTROLMASK; else if(event.code==KEY_Control_R) event.state|=CONTROLMASK; else if(event.code==KEY_F13) event.state|=METAMASK; // Key between Ctrl and Alt (on most keyboards) else if(event.code==KEY_Alt_L) event.state|=ALTMASK; else if(event.code==KEY_Alt_R) event.state|=ALTMASK; // FIXME do we need ALTGR flag instead/in addition? else if(event.code==KEY_Num_Lock) event.state|=NUMLOCKMASK; else if(event.code==KEY_Caps_Lock) event.state|=CAPSLOCKMASK; else if(event.code==KEY_Scroll_Lock) event.state|=SCROLLLOCKMASK; else if(event.code==KEY_Super_L) event.state|=METAMASK; else if(event.code==KEY_Super_R) event.state|=METAMASK; else{ stickyMods=event.state&(SHIFTMASK|CONTROLMASK|METAMASK|ALTMASK); } } else{ if(event.code==KEY_Shift_L) event.state&=~SHIFTMASK; else if(event.code==KEY_Shift_R) event.state&=~SHIFTMASK; else if(event.code==KEY_Control_L) event.state&=~CONTROLMASK; else if(event.code==KEY_Control_R) event.state&=~CONTROLMASK; else if(event.code==KEY_F13) event.state&=~METAMASK; // Key between Ctrl and Alt (on most keyboards) else if(event.code==KEY_Alt_L) event.state&=~ALTMASK; else if(event.code==KEY_Alt_R) event.state&=~ALTMASK; // FIXME do we need ALTGR flag instead/in addition? else if(event.code==KEY_Num_Lock) event.state&=~NUMLOCKMASK; else if(event.code==KEY_Caps_Lock) event.state&=~CAPSLOCKMASK; else if(event.code==KEY_Scroll_Lock) event.state&=~SCROLLLOCKMASK; else if(event.code==KEY_Super_L) event.state&=~METAMASK; else if(event.code==KEY_Super_R) event.state&=~METAMASK; else{ event.state|=stickyMods; stickyMods=0; } } FXTRACE((100,"%s code=%04x state=%04x stickyMods=%04x text=\"%s\"\n",(event.type==SEL_KEYPRESS)?"SEL_KEYPRESS":"SEL_KEYRELEASE",event.code,event.state,stickyMods,event.text.text())); // Keyboard grabbed by specific window if(keyboardGrabWindow){ if(keyboardGrabWindow->handle(this,FXSEL(event.type,0),&event)) refresh(); return true; } // // Try popup window // if(popupWindow){ // if(popupWindow->handle(this,FXSEL(event.type,0),&event)) refresh(); // return TRUE; // } // Remember window for later if(ev.xkey.type==KeyPress) keyWindow=activeWindow; // Dispatch to key window if(keyWindow){ // FIXME doesSaveUnder test should go away // Dispatch if not in a modal loop or in a modal loop for a window containing the focus window if(!invocation || invocation->modality==MODAL_FOR_NONE || (invocation->window && invocation->window->isOwnerOf(keyWindow)) || keyWindow->getShell()->doesSaveUnder()){ if(keyWindow->handle(this,FXSEL(event.type,0),&event)) refresh(); return TRUE; } // Beep if outside modal if(ev.xany.type==KeyPress) beep(); } return true; // Motion case MotionNotify: event.type=SEL_MOTION; event.time=ev.xmotion.time; event.win_x=ev.xmotion.x; event.win_y=ev.xmotion.y; event.root_x=ev.xmotion.x_root; event.root_y=ev.xmotion.y_root; event.code=0; // Mouse buttons and modifiers but no wheel buttons event.state=(ev.xmotion.state&~(Button4Mask|Button5Mask)) | stickyMods; // Moved more that delta if((FXABS(event.root_x-event.rootclick_x)>=dragDelta) || (FXABS(event.root_y-event.rootclick_y)>=dragDelta)) event.moved=1; // Dispatch to grab window if(mouseGrabWindow){ window->translateCoordinatesTo(event.win_x,event.win_y,mouseGrabWindow,event.win_x,event.win_y); if(mouseGrabWindow->handle(this,FXSEL(SEL_MOTION,0),&event)) refresh(); } // FIXME doesSaveUnder test should go away // Dispatch if inside model window else if(!invocation || invocation->modality==MODAL_FOR_NONE || (invocation->window && invocation->window->isOwnerOf(window)) || window->getShell()->doesSaveUnder()){ if(window->handle(this,FXSEL(SEL_MOTION,0),&event)) refresh(); } // Remember last mouse event.last_x=event.win_x; event.last_y=event.win_y; return true; // Button case ButtonPress: case ButtonRelease: event.time=ev.xbutton.time; event.win_x=ev.xbutton.x; event.win_y=ev.xbutton.y; event.root_x=ev.xbutton.x_root; event.root_y=ev.xbutton.y_root; // Mouse buttons and modifiers but no wheel buttons event.state=(ev.xmotion.state&~(Button4Mask|Button5Mask)) | stickyMods; // Mouse Wheel if(ev.xbutton.button==Button4 || ev.xbutton.button==Button5){ event.type=SEL_MOUSEWHEEL; event.code=((ev.xbutton.button==Button4)?120:-120)*ev.xbutton.subwindow; // Dispatch to grab window if(mouseGrabWindow){ window->translateCoordinatesTo(event.win_x,event.win_y,mouseGrabWindow,event.win_x,event.win_y); if(mouseGrabWindow->handle(this,FXSEL(SEL_MOUSEWHEEL,0),&event)) refresh(); return true; } // Dispatch to window under cursor // FIXME doesSaveUnder test should go away while(window && (!invocation || invocation->modality==MODAL_FOR_NONE || (invocation->window && invocation->window->isOwnerOf(window)) || window->getShell()->doesSaveUnder())){ if(window->handle(this,FXSEL(SEL_MOUSEWHEEL,0),&event)){ refresh(); break; } window=window->getParent(); } return true; } // Mouse Button event.code=ev.xbutton.button; if(ev.xbutton.type==ButtonPress){ // Mouse button press if(ev.xbutton.button==Button1){ event.type=SEL_LEFTBUTTONPRESS; event.state|=LEFTBUTTONMASK; } if(ev.xbutton.button==Button2){ event.type=SEL_MIDDLEBUTTONPRESS; event.state|=MIDDLEBUTTONMASK; } if(ev.xbutton.button==Button3){ event.type=SEL_RIGHTBUTTONPRESS; event.state|=RIGHTBUTTONMASK; } if(!event.moved && (event.time-event.click_timetranslateCoordinatesTo(event.win_x,event.win_y,mouseGrabWindow,event.win_x,event.win_y); if(mouseGrabWindow->handle(this,FXSEL(event.type,0),&event)) refresh(); } // Dispatch if inside model window // FIXME doesSaveUnder test should go away else if(!invocation || invocation->modality==MODAL_FOR_NONE || (invocation->window && invocation->window->isOwnerOf(window)) || window->getShell()->doesSaveUnder()){ if(window->handle(this,FXSEL(event.type,0),&event)) refresh(); } // Beep if outside modal window else{ if(ev.xany.type==ButtonPress) beep(); } // Remember last mouse event.last_x=event.win_x; event.last_y=event.win_y; return true; // Crossing case EnterNotify: event.time=ev.xcrossing.time; if(cursorWindow!=window){ if(ev.xcrossing.mode==NotifyGrab || ev.xcrossing.mode==NotifyUngrab || (ev.xcrossing.mode==NotifyNormal && ev.xcrossing.detail!=NotifyInferior)){ ancestor=FXWindow::commonAncestor(window,cursorWindow); event.root_x=ev.xcrossing.x_root; event.root_y=ev.xcrossing.y_root; event.code=ev.xcrossing.mode; leaveWindow(cursorWindow,ancestor); enterWindow(window,ancestor); } } return true; // Crossing case LeaveNotify: event.time=ev.xcrossing.time; if(cursorWindow==window){ if(ev.xcrossing.mode==NotifyGrab || ev.xcrossing.mode==NotifyUngrab || (ev.xcrossing.mode==NotifyNormal && ev.xcrossing.detail!=NotifyInferior)){ event.root_x=ev.xcrossing.x_root; event.root_y=ev.xcrossing.y_root; event.code=ev.xcrossing.mode; FXASSERT(cursorWindow==window); leaveWindow(window,window->getParent()); } } return true; // Focus change on shell window case FocusIn: case FocusOut: window=window->getShell(); if(ev.xfocus.type==FocusOut && activeWindow==window){ event.type=SEL_FOCUSOUT; if(window->handle(this,FXSEL(SEL_FOCUSOUT,0),&event)) refresh(); activeWindow=NULL; } if(ev.xfocus.type==FocusIn && activeWindow!=window){ event.type=SEL_FOCUSIN; if(window->handle(this,FXSEL(SEL_FOCUSIN,0),&event)) refresh(); activeWindow=window; } return true; // Map case MapNotify: event.type=SEL_MAP; if(window->handle(this,FXSEL(SEL_MAP,0),&event)) refresh(); return true; // Unmap case UnmapNotify: event.type=SEL_UNMAP; if(window->handle(this,FXSEL(SEL_UNMAP,0),&event)) refresh(); return true; // Create case CreateNotify: event.type=SEL_CREATE; if(window->handle(this,FXSEL(SEL_CREATE,0),&event)) refresh(); return true; // Destroy case DestroyNotify: event.type=SEL_DESTROY; if(window->handle(this,FXSEL(SEL_DESTROY,0),&event)) refresh(); return true; // Configure case ConfigureNotify: event.type=SEL_CONFIGURE; // According to the ICCCM, if its synthetic, the coordinates are relative // to root window; otherwise, they're relative to the parent; so we use // the old coordinates if its not a synthetic configure notify if(window->getShell()==window && !ev.xconfigure.send_event){ ev.xconfigure.x=window->getX(); ev.xconfigure.y=window->getY(); } event.rect.x=ev.xconfigure.x; event.rect.y=ev.xconfigure.y; event.rect.w=ev.xconfigure.width; event.rect.h=ev.xconfigure.height; event.synthetic=ev.xconfigure.send_event; if(window->handle(this,FXSEL(SEL_CONFIGURE,0),&event)) refresh(); return true; // Circulate case CirculateNotify: event.type=SEL_RAISED+(ev.xcirculate.place&1); if(window->handle(this,FXSEL(event.type,0),&event)) refresh(); return true; // Selection Clear case SelectionClear: if(ev.xselectionclear.selection==XA_PRIMARY){ // We lost the primary selection if the new selection owner is different from selectionWindow if(selectionWindow && selectionWindow->id()!=XGetSelectionOwner((Display*)display,XA_PRIMARY)){ event.type=SEL_SELECTION_LOST; event.time=ev.xselectionclear.time; if(selectionWindow->handle(this,FXSEL(SEL_SELECTION_LOST,0),&event)) refresh(); selectionWindow=NULL; } FXFREE(&xselTypeList); xselNumTypes=0; } else if(ev.xselectionclear.selection==xcbSelection){ // We lost the clipboard selection if the new clipboard owner is different from clipboardWindow if(clipboardWindow && clipboardWindow->id()!=XGetSelectionOwner((Display*)display,xcbSelection)){ event.time=ev.xselectionclear.time; event.type=SEL_CLIPBOARD_LOST; if(clipboardWindow->handle(this,FXSEL(SEL_CLIPBOARD_LOST,0),&event)) refresh(); clipboardWindow=NULL; } FXFREE(&xcbTypeList); xcbNumTypes=0; } return true; // Selection Request case SelectionRequest: answer=None; FXTRACE((100,"Request selection (%ld) from requestor=%ld\n",ev.xselectionrequest.selection,ev.xselectionrequest.requestor)); if(ev.xselectionrequest.selection==XA_PRIMARY){ if(selectionWindow){ if(ev.xselectionrequest.target==ddeTargets){ // Request for TYPES FXTRACE((100,"Window %ld being requested by window %ld for SELECTION TYPES; sending %d types\n",ev.xselectionrequest.owner,ev.xselectionrequest.requestor,xselNumTypes)); answer=fxsendtypes((Display*)display,ev.xselectionrequest.requestor,ev.xselectionrequest.property,xselTypeList,xselNumTypes); } else{ // Request for DATA event.type=SEL_SELECTION_REQUEST; event.time=ev.xselectionrequest.time; event.target=ev.xselectionrequest.target; ddeData=NULL; ddeSize=0; selectionWindow->handle(this,FXSEL(SEL_SELECTION_REQUEST,0),&event); FXTRACE((100,"Window %ld being requested by window %ld for SELECTION DATA of type %ld; sending %d bytes\n",ev.xselectionrequest.owner,ev.xselectionrequest.requestor,ev.xselectionrequest.target,ddeSize)); answer=fxsenddata((Display*)display,ev.xselectionrequest.requestor,ev.xselectionrequest.property,ev.xselectionrequest.target,ddeData,ddeSize); FXFREE(&ddeData); ddeData=NULL; ddeSize=0; } } } else if(ev.xselectionrequest.selection==xcbSelection){ if(clipboardWindow){ if(ev.xselectionrequest.target==ddeTargets){ // Request for TYPES FXTRACE((100,"Window %ld being requested by window %ld for CLIPBOARD TYPES; sending %d types\n",ev.xselectionrequest.owner,ev.xselectionrequest.requestor,xcbNumTypes)); answer=fxsendtypes((Display*)display,ev.xselectionrequest.requestor,ev.xselectionrequest.property,xcbTypeList,xcbNumTypes); } else{ // Request for DATA event.type=SEL_CLIPBOARD_REQUEST; event.time=ev.xselectionrequest.time; event.target=ev.xselectionrequest.target; ddeData=NULL; ddeSize=0; clipboardWindow->handle(this,FXSEL(SEL_CLIPBOARD_REQUEST,0),&event); FXTRACE((100,"Window %ld being requested by window %ld for CLIPBOARD DATA of type %ld; sending %d bytes\n",ev.xselectionrequest.owner,ev.xselectionrequest.requestor,ev.xselectionrequest.target,ddeSize)); answer=fxsenddata((Display*)display,ev.xselectionrequest.requestor,ev.xselectionrequest.property,ev.xselectionrequest.target,ddeData,ddeSize); FXFREE(&ddeData); ddeData=NULL; ddeSize=0; } } } else if(ev.xselectionrequest.selection==xdndSelection){ if(dragWindow){ if(ev.xselectionrequest.target==ddeTargets){ // Request for TYPES FXTRACE((100,"Window %ld being requested by window %ld for XDND TYPES; sending %d types\n",ev.xselectionrequest.owner,ev.xselectionrequest.requestor,xdndNumTypes)); answer=fxsendtypes((Display*)display,ev.xselectionrequest.requestor,ev.xselectionrequest.property,xdndTypeList,xdndNumTypes); } else{ // Request for DATA event.type=SEL_DND_REQUEST; event.time=ev.xselectionrequest.time; event.target=ev.xselectionrequest.target; ddeData=NULL; ddeSize=0; dragWindow->handle(this,FXSEL(SEL_DND_REQUEST,0),&event); FXTRACE((100,"Window %ld being requested by window %ld for XDND DATA of type %ld; sending %d bytes\n",ev.xselectionrequest.owner,ev.xselectionrequest.requestor,ev.xselectionrequest.target,ddeSize)); answer=fxsenddata((Display*)display,ev.xselectionrequest.requestor,ev.xselectionrequest.property,ev.xselectionrequest.target,ddeData,ddeSize); FXFREE(&ddeData); ddeData=NULL; ddeSize=0; } } } FXTRACE((100,"Sending back response to requestor=%ld\n",ev.xselectionrequest.requestor)); fxsendreply((Display*)display,ev.xselectionrequest.requestor,ev.xselectionrequest.selection,answer,ev.xselectionrequest.target,ev.xselectionrequest.time); return true; // Selection Notify case SelectionNotify: return true; // Client message case ClientMessage: // WM_PROTOCOLS if(ev.xclient.message_type==wmProtocols){ if((FXID)ev.xclient.data.l[0]==wmDeleteWindow){ // WM_DELETE_WINDOW event.type=SEL_CLOSE; if(!invocation || invocation->modality==MODAL_FOR_NONE || (invocation->window && invocation->window->isOwnerOf(window))){ if(window->handle(this,FXSEL(SEL_CLOSE,0),&event)) refresh(); } else{ beep(); } } else if((FXID)ev.xclient.data.l[0]==wmQuitApp){ // WM_QUIT_APP event.type=SEL_CLOSE; if(!invocation || invocation->modality==MODAL_FOR_NONE || (invocation->window && invocation->window->isOwnerOf(window))){ if(window->handle(this,FXSEL(SEL_CLOSE,0),&event)) refresh(); } else{ beep(); } } else if((FXID)ev.xclient.data.l[0]==wmTakeFocus){ // WM_TAKE_FOCUS if(invocation && invocation->window && invocation->window->id()) ev.xclient.window=invocation->window->id(); // Assign focus to innermost modal dialog, even when trying to focus // on another window; these other windows are dead to inputs anyway. // XSetInputFocus causes a spurious BadMatch error; we ignore this in xerrorhandler XSetInputFocus((Display*)display,ev.xclient.window,RevertToParent,ev.xclient.data.l[1]); } else if((FXID)ev.xclient.data.l[0]==wmNetPing){ // NET_WM_PING FXTRACE((100,"NET_WM_PING %ld\n",ev.xclient.data.l[1])); se.xclient.type=ClientMessage; se.xclient.display=(Display*)display; // This lets a window manager know that se.xclient.message_type=wmProtocols; // we're still alive after having received se.xclient.format=32; // a WM_DELETE_WINDOW message se.xclient.window=XDefaultRootWindow((Display*)display); se.xclient.data.l[0]=ev.xclient.data.l[0]; se.xclient.data.l[1]=ev.xclient.data.l[1]; se.xclient.data.l[2]=ev.xclient.data.l[2]; se.xclient.data.l[3]=0; se.xclient.data.l[4]=0; XSendEvent((Display*)display,se.xclient.window,False,SubstructureRedirectMask|SubstructureNotifyMask,&se); } } // XDND Enter from source else if(ev.xclient.message_type==xdndEnter){ FXint ver=(ev.xclient.data.l[1]>>24)&255; FXTRACE((100,"DNDEnter from remote window %ld (ver %d)\n",ev.xclient.data.l[0],ver)); if(ver>XDND_PROTOCOL_VERSION) return true; xdndSource=ev.xclient.data.l[0]; // Now we're talking to this guy if(ddeTypeList){FXFREE(&ddeTypeList);ddeNumTypes=0;} if(ev.xclient.data.l[1]&1){ fxrecvtypes((Display*)display,xdndSource,xdndTypes,ddeTypeList,ddeNumTypes,FALSE); } else{ FXMALLOC(&ddeTypeList,FXDragType,3); ddeNumTypes=0; if(ev.xclient.data.l[2]){ddeTypeList[0]=ev.xclient.data.l[2];ddeNumTypes++;} if(ev.xclient.data.l[3]){ddeTypeList[1]=ev.xclient.data.l[3];ddeNumTypes++;} if(ev.xclient.data.l[4]){ddeTypeList[2]=ev.xclient.data.l[4];ddeNumTypes++;} } } // XDND Leave from source else if(ev.xclient.message_type==xdndLeave){ FXTRACE((100,"DNDLeave from remote window %ld\n",ev.xclient.data.l[0])); if(xdndSource!=(FXID)ev.xclient.data.l[0]) return true; // We're not talking to this guy if(dropWindow){ event.type=SEL_DND_LEAVE; if(dropWindow->handle(this,FXSEL(SEL_DND_LEAVE,0),&event)) refresh(); dropWindow=NULL; } if(ddeTypeList){FXFREE(&ddeTypeList);ddeNumTypes=0;} xdndSource=0; } // XDND Position from source else if(ev.xclient.message_type==xdndPosition){ FXTRACE((100,"DNDPosition from remote window %ld\n",ev.xclient.data.l[0])); if(xdndSource!=(FXID)ev.xclient.data.l[0]) return true; // We're not talking to this guy event.time=ev.xclient.data.l[3]; event.root_x=((FXuint)ev.xclient.data.l[2])>>16; event.root_y=((FXuint)ev.xclient.data.l[2])&0xffff; // Search from target window down; there may be another window // (like e.g. the dragged shape window) right under the cursor. // Note this is the target window, not the proxy target.... window=findWindowAt(event.root_x,event.root_y,ev.xclient.window); if((FXID)ev.xclient.data.l[4]==xdndActionCopy) ddeAction=DRAG_COPY; else if((FXID)ev.xclient.data.l[4]==xdndActionMove) ddeAction=DRAG_MOVE; else if((FXID)ev.xclient.data.l[4]==xdndActionLink) ddeAction=DRAG_LINK; else if((FXID)ev.xclient.data.l[4]==xdndActionPrivate) ddeAction=DRAG_PRIVATE; else ddeAction=DRAG_COPY; ansAction=DRAG_REJECT; xdndWantUpdates=TRUE; xdndRect.x=event.root_x; xdndRect.y=event.root_y; xdndRect.w=1; xdndRect.h=1; if(window!=dropWindow){ if(dropWindow){ event.type=SEL_DND_LEAVE; if(dropWindow->handle(this,FXSEL(SEL_DND_LEAVE,0),&event)) refresh(); } dropWindow=NULL; if(window && window->isDropEnabled()){ dropWindow=window; event.type=SEL_DND_ENTER; if(dropWindow->handle(this,FXSEL(SEL_DND_ENTER,0),&event)) refresh(); } } if(dropWindow){ event.type=SEL_DND_MOTION; XTranslateCoordinates((Display*)display,XDefaultRootWindow((Display*)display),dropWindow->id(),event.root_x,event.root_y,&event.win_x,&event.win_y,&tmp); if(dropWindow->handle(this,FXSEL(SEL_DND_MOTION,0),&event)) refresh(); event.last_x=event.win_x; event.last_y=event.win_y; } se.xclient.type=ClientMessage; se.xclient.display=(Display*)display; se.xclient.message_type=xdndStatus; se.xclient.format=32; se.xclient.window=xdndSource; se.xclient.data.l[0]=ev.xclient.window; // Proxy Target window se.xclient.data.l[1]=0; if(ansAction!=DRAG_REJECT) se.xclient.data.l[1]|=1; // Target accepted if(xdndWantUpdates) se.xclient.data.l[1]|=2; // Target wants continuous position updates se.xclient.data.l[2]=MKUINT(xdndRect.y,xdndRect.x); se.xclient.data.l[3]=MKUINT(xdndRect.h,xdndRect.w); if(ansAction==DRAG_COPY) se.xclient.data.l[4]=xdndActionCopy; // Drag and Drop Action accepted else if(ansAction==DRAG_MOVE) se.xclient.data.l[4]=xdndActionMove; else if(ansAction==DRAG_LINK) se.xclient.data.l[4]=xdndActionLink; else if(ansAction==DRAG_PRIVATE) se.xclient.data.l[4]=xdndActionPrivate; else se.xclient.data.l[4]=None; XSendEvent((Display*)display,xdndSource,True,NoEventMask,&se); } // XDND Drop from source else if(ev.xclient.message_type==xdndDrop){ FXTRACE((100,"DNDDrop from remote window %ld\n",ev.xclient.data.l[0])); if(xdndSource!=(FXID)ev.xclient.data.l[0]) return true; // We're not talking to this guy xdndFinishSent=FALSE; event.type=SEL_DND_DROP; event.time=ev.xclient.data.l[2]; if(!dropWindow || !dropWindow->handle(this,FXSEL(SEL_DND_DROP,0),&event)) ansAction=DRAG_REJECT; if(!xdndFinishSent){ se.xclient.type=ClientMessage; se.xclient.display=(Display*)display; se.xclient.message_type=xdndFinished; se.xclient.format=32; se.xclient.window=xdndSource; se.xclient.data.l[0]=ev.xclient.window; // Proxy Target window se.xclient.data.l[1]=(ansAction==DRAG_REJECT)?0:1; // Bit #0 means accepted if(ansAction==DRAG_COPY) se.xclient.data.l[2]=xdndActionCopy; else if(ansAction==DRAG_MOVE) se.xclient.data.l[2]=xdndActionMove; else if(ansAction==DRAG_LINK) se.xclient.data.l[2]=xdndActionLink; else if(ansAction==DRAG_PRIVATE) se.xclient.data.l[2]=xdndActionPrivate; else se.xclient.data.l[2]=None; se.xclient.data.l[3]=0; se.xclient.data.l[4]=0; XSendEvent((Display*)display,xdndSource,True,NoEventMask,&se); } if(ddeTypeList){FXFREE(&ddeTypeList);ddeNumTypes=0;} dropWindow=NULL; xdndSource=0; refresh(); } // XDND Status from target else if(ev.xclient.message_type==xdndStatus){ // We ignore ev.xclient.data.l[0], because some other // toolkits, e.g. Qt, do not place the proper value there; // the proper value is xdndTarget, NOT xdndProxyTarget or None //if(xdndTarget!=(FXID)ev.xclient.data.l[0]) return true; // We're not talking to this guy ansAction=DRAG_REJECT; if(ev.xclient.data.l[1]&1){ if((FXID)ev.xclient.data.l[4]==xdndActionCopy) ansAction=DRAG_COPY; else if((FXID)ev.xclient.data.l[4]==xdndActionMove) ansAction=DRAG_MOVE; else if((FXID)ev.xclient.data.l[4]==xdndActionLink) ansAction=DRAG_LINK; else if((FXID)ev.xclient.data.l[4]==xdndActionPrivate) ansAction=DRAG_PRIVATE; } xdndWantUpdates=ev.xclient.data.l[1]&2; xdndRect.x=((FXuint)ev.xclient.data.l[2])>>16; xdndRect.y=((FXuint)ev.xclient.data.l[2])&0xffff; xdndRect.w=((FXuint)ev.xclient.data.l[3])>>16; xdndRect.h=((FXuint)ev.xclient.data.l[3])&0xffff; xdndStatusReceived=TRUE; xdndStatusPending=FALSE; FXTRACE((100,"DNDStatus from remote window %ld action=%d rect=%d,%d,%d,%d updates=%d\n",ev.xclient.data.l[0],ansAction,xdndRect.x,xdndRect.y,xdndRect.w,xdndRect.h,xdndWantUpdates)); } return true; // Property change case PropertyNotify: FXTRACE((200,"PropertyNotify %ld\n",ev.xproperty.atom)); event.time=ev.xproperty.time; // Update window position after minimize/maximize/restore whatever if(ev.xproperty.atom==wmState || ev.xproperty.atom==wmNetState){ //FXTRACE((100,"Window wmState Change window=%ld atom=%ld state=%d\n",ev.xproperty.window,ev.xproperty.atom,ev.xproperty.state)); event.type=SEL_CONFIGURE; XTranslateCoordinates((Display*)display,ev.xproperty.window,XDefaultRootWindow((Display*)display),0,0,&tmp_x,&tmp_y,&tmp); event.rect.x=tmp_x; event.rect.y=tmp_y; event.rect.w=window->getWidth(); event.rect.h=window->getHeight(); event.synthetic=ev.xproperty.send_event; if(window->handle(this,FXSEL(SEL_CONFIGURE,0),&event)) refresh(); } return true; // Keyboard mapping case MappingNotify: FXTRACE((100,"MappingNotify\n")); if(ev.xmapping.request!=MappingPointer) XRefreshKeyboardMapping(&ev.xmapping); return true; // Other events default: #ifdef HAVE_XRANDR_H if(ev.type==xrreventbase+RRScreenChangeNotify){ XRRUpdateConfiguration(&ev); root->setWidth(root->getDefaultWidth()); root->setHeight(root->getDefaultHeight()); //int screen=XRRRootToScreen((Display*)display,ev.xany.window); FXTRACE((100,"RRScreenChangeNotify w=%d h=%d\n",DisplayWidth((Display*)display,DefaultScreen((Display*)display)),DisplayHeight((Display*)display,DefaultScreen((Display*)display)))); // FIXME This should be a SEL_CONFIGURE for the root window, eventually } #endif return true; } } return false; } #else // Get an event bool FXApp::getNextEvent(FXRawEvent& msg,bool blocking){ register FXint allinputs; register DWORD signaled; // Set to no-op just in case msg.message=0; // Handle all past due timers if(timers) handleTimeouts(); // Check non-immediate signals that may have fired if(nsignals){ for(register FXint sig=0; sigtryHandle(this,FXSEL(SEL_SIGNAL,signals[sig].message),(void*)(FXival)sig)){ refresh(); return false; } } } } // Peek for messages; this marks the message queue as unsignalled, i.e. // MsgWaitForMultipleObjects would block even if there are unhandled events; // the fix is to call MsgWaitForMultipleObjects only AFTER having ascertained // that there are NO unhandled events queued up. if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) return true; // Poll to see if any waitable objects are signalled allinputs=maxinput+1; signaled=MsgWaitForMultipleObjects(allinputs,handles,FALSE,0,QS_ALLINPUT); // No objects were signalled, so perform background tasks now if(signaled==WAIT_TIMEOUT){ // Do our chores :-) if(chores){ register FXChore *c=chores; chores=c->next; if(c->target && c->target->tryHandle(this,FXSEL(SEL_CHORE,c->message),c->data)) refresh(); c->next=chorerecs; chorerecs=c; } // GUI updating:- walk the whole widget tree. if(refresher){ refresher->handle(this,FXSEL(SEL_UPDATE,0),NULL); if(refresher->getFirst()){ refresher=refresher->getFirst(); } else{ while(refresher->getParent()){ if(refresher->getNext()){refresher=refresher->getNext();break;} refresher=refresher->getParent(); } } FXASSERT(refresher); if(refresher!=refresherstop) return false; refresher=refresherstop=NULL; } // There are more chores to do if(chores) return false; // No updates or chores pending, so return at this point if not blocking if(!blocking) return false; // One more call to PeekMessage here because the preceding idle // processing may have caused some more messages to be posted to // our message queue:- a call to MsgWaitForMultipleObjects when // there are events already in the queue would NOT immediately fall // through but block until the next event comes in. if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) return true; // If there are timers, block only a little time allinputs=maxinput+1; if(timers){ // All that testing above may have taken some time... FXlong interval=timers->due-FXThread::time(); // Some timers are already due; do them right away! if(interval<=0) return false; DWORD delta=(DWORD)(interval/1000000); // Exit critical section appMutex.unlock(); // Now we will block... signaled=MsgWaitForMultipleObjects(allinputs,handles,FALSE,delta,QS_ALLINPUT); // Enter critical section appMutex.lock(); } // No timers, so block indefinitely else{ // Exit critical section appMutex.unlock(); // Now we will block... signaled=MsgWaitForMultipleObjects(allinputs,handles,FALSE,INFINITE,QS_ALLINPUT); // Enter critical section appMutex.lock(); } } // Timed out, so do timeouts if(signaled==WAIT_TIMEOUT) return false; // Signallable object was signalled if(WAIT_OBJECT_0<=signaled && signaledtryHandle(this,FXSEL(SEL_IO_READ,in.read.message),(void*)(FXival)fff)) refresh(); if(in.write.target && in.write.target->tryHandle(this,FXSEL(SEL_IO_WRITE,in.write.message),(void*)(FXival)fff)) refresh(); if(in.excpt.target && in.excpt.target->tryHandle(this,FXSEL(SEL_IO_EXCEPT,in.excpt.message),(void*)(FXival)fff)) refresh(); } } } // Got message from the GUI? if(signaled!=WAIT_OBJECT_0+allinputs) return false; // Get the event; this used to be GetMessage(&msg,NULL,0,0), // but for some reason, this occasionally blocks even though we // have tried to make sure an event was indeed available. // The new code will always fall through, with an event if there // is one, or without one if despite our efforts above there wasn't. // Thanks to Hodju Petri for this suggestion. return PeekMessage(&msg,NULL,0,0,PM_REMOVE)!=0; } // Peek for event bool FXApp::peekEvent(){ if(initialized){ MSG msg; // Still need GUI update if(refresher) return true; // Outstanding chores if(chores) return true; // Timers are due? if(timers){ if(timers->due <= FXThread::time()) return true; } // Other events due? return PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)!=0; } return false; } // Dispatch event to widget bool FXApp::dispatchEvent(FXRawEvent& msg){ DispatchMessage(&msg); // FIXME should return TRUE only when handled in FOX return true; } #endif /*******************************************************************************/ // Flush pending repaints void FXApp::flush(bool sync){ if(initialized){ #ifndef WIN32 if(sync) XSync((Display*)display,false); else XFlush((Display*)display); #else GdiFlush(); #endif } } // Force GUI refresh of every widget in this application void FXApp::forceRefresh(){ getRootWindow()->forceRefresh(); } // Schedule a future refresh; if we were in the middle of // one, we continue with the current cycle until we wrap // around to the current widget about to be updated. void FXApp::refresh(){ if(!refresher) refresher=root; refresherstop=refresher; } // Paint all windows marked for repainting void FXApp::repaint(){ if(initialized){ #ifndef WIN32 removeRepaints(0,0,0,0,0); #else for(FXWindow *top=getRootWindow()->getFirst(); top; top=top->getNext()){ RedrawWindow((HWND)top->id(),NULL,NULL,RDW_ERASENOW|RDW_UPDATENOW|RDW_ALLCHILDREN); } #endif } } // Run application FXint FXApp::run(){ FXInvocation inv(&invocation,MODAL_FOR_NONE,NULL); FXTRACE((100,"Start run\n")); while(!inv.done){ runOneEvent(); } FXTRACE((100,"End run\n")); return inv.code; } // Run till some flag becomes non-zero FXint FXApp::runUntil(FXuint& condition){ FXInvocation inv(&invocation,MODAL_FOR_NONE,NULL); FXTRACE((100,"Start runUntil\n")); while(!inv.done && condition==0){ runOneEvent(); } FXTRACE((100,"End runUntil\n")); return condition; } // Run event loop while events are available FXint FXApp::runWhileEvents(){ FXInvocation inv(&invocation,MODAL_FOR_NONE,NULL); FXTRACE((100,"Start runWhileEvents\n")); while(!inv.done && runOneEvent(FALSE)); FXTRACE((100,"End runWhileEvents\n")); return !inv.done; } // Run event loop while events are available FXint FXApp::runModalWhileEvents(FXWindow* window){ FXInvocation inv(&invocation,MODAL_FOR_WINDOW,window); FXTRACE((100,"Start runModalWhileEvents\n")); while(!inv.done && runOneEvent(FALSE)); FXTRACE((100,"End runModalWhileEvents\n")); return !inv.done; } // Perform one event dispatch bool FXApp::runOneEvent(bool blocking){ FXRawEvent ev; if(getNextEvent(ev,blocking)){ dispatchEvent(ev); return true; } return false; } // Run modal event loop, blocking events to all windows, until stopModal is called. FXint FXApp::runModal(){ FXInvocation inv(&invocation,MODAL_FOR_WINDOW,NULL); FXTRACE((100,"Start runModal\n")); while(!inv.done){ runOneEvent(); } FXTRACE((100,"End runModal\n")); return inv.code; } // Run modal for window FXint FXApp::runModalFor(FXWindow* window){ FXInvocation inv(&invocation,MODAL_FOR_WINDOW,window); FXTRACE((100,"Start runModalFor\n")); while(!inv.done){ runOneEvent(); } FXTRACE((100,"End runModalFor\n")); return inv.code; } // Run modal while window is shown, or until stopModal is called FXint FXApp::runModalWhileShown(FXWindow* window){ FXInvocation inv(&invocation,MODAL_FOR_WINDOW,window); FXTRACE((100,"Start runModalWhileShown\n")); while(!inv.done && window->shown()){ runOneEvent(); } FXTRACE((100,"End runModalWhileShown\n")); return inv.code; } // Run popup menu FXint FXApp::runPopup(FXWindow* window){ FXInvocation inv(&invocation,MODAL_FOR_POPUP,window); FXTRACE((100,"Start runPopup\n")); while(!inv.done && window->shown()){ runOneEvent(); } FXTRACE((100,"End runPopup\n")); return inv.code; } // Test if the window is involved in a modal invocation bool FXApp::isModal(FXWindow *window) const { register FXInvocation* inv; for(inv=invocation; inv; inv=inv->upper){ if(inv->window==window && inv->modality!=MODAL_FOR_NONE) return true; } return false; } // Return current modal window, if any FXWindow* FXApp::getModalWindow() const { return invocation ? invocation->window : NULL; } // Return mode of current modal loop FXModality FXApp::getModality() const { return invocation ? invocation->modality : MODAL_FOR_NONE; } // Break out of topmost event loop, closing all nested loops also void FXApp::stop(FXint value){ register FXInvocation* inv; for(inv=invocation; inv; inv=inv->upper){ inv->done=TRUE; inv->code=0; if(inv->upper==NULL){ inv->code=value; return; } } } // Break out of modal loop matching window, and all deeper ones void FXApp::stopModal(FXWindow* window,FXint value){ register FXInvocation* inv; if(isModal(window)){ for(inv=invocation; inv; inv=inv->upper){ inv->done=TRUE; inv->code=0; if(inv->window==window && inv->modality!=MODAL_FOR_NONE){ inv->code=value; return; } } } } // Break out of innermost modal loop, and all deeper non-modal ones void FXApp::stopModal(FXint value){ register FXInvocation* inv; for(inv=invocation; inv; inv=inv->upper){ inv->done=TRUE; inv->code=0; if(inv->modality!=MODAL_FOR_NONE){ inv->code=value; return; } } } // Obtain system color and translate to FXColor #ifdef WIN32 static FXColor getSystemColor(FXuint which){ DWORD dwColor=GetSysColor(which); return FXRGB(GetRValue(dwColor),GetGValue(dwColor),GetBValue(dwColor)); } #endif // Obtain system font and translate to FXFontDesc #ifdef WIN32 static void getSystemFont(FXFontDesc& fontdesc){ NONCLIENTMETRICS ncm; ncm.cbSize=sizeof(NONCLIENTMETRICS); SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(NONCLIENTMETRICS),&ncm,0); #ifdef UNICODE nc2utfs(fontdesc.face,ncm.lfMenuFont.lfFaceName); #else strncpy(fontdesc.face,ncm.lfMenuFont.lfFaceName,sizeof(fontdesc.face)); #endif fontdesc.face[sizeof(fontdesc.face)-1]='\0'; HDC hDC=CreateCompatibleDC(NULL); fontdesc.size=-10*MulDiv(ncm.lfMenuFont.lfHeight,72,GetDeviceCaps(hDC,LOGPIXELSY)); DeleteDC(hDC); fontdesc.weight=ncm.lfMenuFont.lfWeight/10; fontdesc.slant=ncm.lfMenuFont.lfItalic?FXFont::Italic:FXFont::Straight; fontdesc.encoding=FONTENCODING_DEFAULT; fontdesc.setwidth=0; fontdesc.flags=0; } #endif // Initialize application void FXApp::init(int& argc,char** argv,bool connect){ const FXchar *fontspec=NULL; const FXchar *style=NULL; const FXchar *d=NULL; FXuint maxcols=0; FXint i,j; // Verify implementation invariants FXASSERT(sizeof(FXuchar)==1); FXASSERT(sizeof(FXbool)==1); FXASSERT(sizeof(FXchar)==1); FXASSERT(sizeof(FXushort)==2); FXASSERT(sizeof(FXshort)==2); FXASSERT(sizeof(FXuint)==4); FXASSERT(sizeof(FXnchar)==2); FXASSERT(sizeof(FXwchar)==4); FXASSERT(sizeof(FXint)==4); FXASSERT(sizeof(FXulong)==8); FXASSERT(sizeof(FXlong)==8); FXASSERT(sizeof(FXfloat)==4); FXASSERT(sizeof(FXdouble)==8); FXASSERT(sizeof(FXival)==sizeof(void*)); FXASSERT(sizeof(FXuval)==sizeof(void*)); #ifdef WIN32 FXASSERT(sizeof(HWND)==sizeof(FXID)); #else FXASSERT(sizeof(Window)==sizeof(FXID)); #endif // Check arguments if(argc<1 || argv==NULL || argv[0]==NULL){ fxerror("%s::init: bad arguments.\n",getClassName()); } // Initialize locale; follow locale settings except // for numerical stuff where we need it to behave normally; // we no longer care about LC_CTYPE since we have our own. setlocale(LC_ALL,""); setlocale(LC_NUMERIC,"C"); // Try locate display #ifndef WIN32 if((d=getenv("DISPLAY"))!=NULL) dpy=d; #endif //fxisconsole(argv[0]); // Parse out FOX args i=j=1; while(j=argc){ fxwarning("%s:init: missing argument for -display.\n",getClassName()); ::exit(1); } dpy=argv[j++]; continue; } // Set input method if(strcmp(argv[j],"-im")==0){ if(++j>=argc){ fxwarning("%s:init: missing argument for -im.\n",getClassName()); ::exit(1); } inputmethod=argv[j++]; continue; } // Input style if(strcmp(argv[j],"-is")==0){ if(++j>=argc){ fxwarning("%s:init: missing argument for -is.\n",getClassName()); ::exit(1); } style=argv[j++]; continue; } #endif // Set trace level if(strcmp(argv[j],"-tracelevel")==0){ if(++j>=argc){ fxwarning("%s:init: missing argument for -tracelevel.\n",getClassName()); ::exit(1); } fxTraceLevel=strtol(argv[j++],NULL,10); continue; } // Set maximum number of colors if(strcmp(argv[j],"-maxcolors")==0){ if(++j>=argc){ fxwarning("%s:init: missing argument for -maxcolors.\n",getClassName()); ::exit(1); } maxcols=strtol(argv[j++],NULL,10); if(maxcols<2 || maxcols>256){ fxwarning("%s::init: expected value between 2 and 256.\n",getClassName()); ::exit(1); } continue; } // Copy program arguments argv[i++]=argv[j++]; } // Adjust argment count argv[i]=NULL; argc=i; // Remember arguments appArgv=argv; appArgc=argc; // Log message FXTRACE((100,"%s::init\n",getClassName())); // Read the registry registry.read(); #ifdef WIN32 // Get font face and metrics FXFontDesc fontdesc; getSystemFont(fontdesc); normalFont->setFontDesc(fontdesc); // Read colors from system baseColor=getSystemColor(COLOR_3DFACE); hiliteColor=getSystemColor(COLOR_3DHILIGHT); shadowColor=getSystemColor(COLOR_3DSHADOW); backColor=getSystemColor(COLOR_WINDOW); borderColor=getSystemColor(COLOR_WINDOWFRAME); foreColor=getSystemColor(COLOR_BTNTEXT); selforeColor=getSystemColor(COLOR_HIGHLIGHTTEXT); selbackColor=getSystemColor(COLOR_HIGHLIGHT); tipforeColor=getSystemColor(COLOR_INFOTEXT); tipbackColor=getSystemColor(COLOR_INFOBK); // Windows XP or later OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*)&osvi); // Flat looking menus // if((osvi.dwMajorVersion>5) || (osvi.dwMajorVersion==5 && osvi.dwMinorVersion>=1)){ // FIXME // selMenuTextColor=getSystemColor(COLOR_HIGHLIGHT); // selMenuBackColor=getSystemColor(COLOR_MENUHILIGHT); // //selMenuBackColor=getSystemColor(COLOR_MENUTEXT); // Menu text // //selMenuBackColor=getSystemColor(COLOR_MENU); // Menu background // } // else{ selMenuTextColor=getSystemColor(COLOR_HIGHLIGHTTEXT); selMenuBackColor=getSystemColor(COLOR_HIGHLIGHT); // } // Get wheel lines SystemParametersInfo(SPI_GETWHEELSCROLLLINES,0,&wheelLines,0); #endif // Parse font and change default font if set fontspec=registry.readStringEntry("SETTINGS","normalfont",NULL); if(fontspec){ normalFont->setFont(fontspec); } // Change some settings typingSpeed=registry.readUnsignedEntry("SETTINGS","typingspeed",typingSpeed); clickSpeed=registry.readUnsignedEntry("SETTINGS","clickspeed",clickSpeed); scrollSpeed=registry.readUnsignedEntry("SETTINGS","scrollspeed",scrollSpeed); scrollDelay=registry.readUnsignedEntry("SETTINGS","scrolldelay",scrollDelay); blinkSpeed=registry.readUnsignedEntry("SETTINGS","blinkspeed",blinkSpeed); animSpeed=registry.readUnsignedEntry("SETTINGS","animspeed",animSpeed); menuPause=registry.readUnsignedEntry("SETTINGS","menupause",menuPause); tooltipPause=registry.readUnsignedEntry("SETTINGS","tippause",tooltipPause); tooltipTime=registry.readUnsignedEntry("SETTINGS","tiptime",tooltipTime); dragDelta=registry.readIntEntry("SETTINGS","dragdelta",dragDelta); wheelLines=registry.readIntEntry("SETTINGS","wheellines",wheelLines); scrollBarSize=registry.readIntEntry("SETTINGS","scrollbarsize",scrollBarSize); // Colors; defaults are those values determined previously borderColor=registry.readColorEntry("SETTINGS","bordercolor",borderColor); baseColor=registry.readColorEntry("SETTINGS","basecolor",baseColor); hiliteColor=registry.readColorEntry("SETTINGS","hilitecolor",hiliteColor); shadowColor=registry.readColorEntry("SETTINGS","shadowcolor",shadowColor); backColor=registry.readColorEntry("SETTINGS","backcolor",backColor); foreColor=registry.readColorEntry("SETTINGS","forecolor",foreColor); selforeColor=registry.readColorEntry("SETTINGS","selforecolor",selforeColor); selbackColor=registry.readColorEntry("SETTINGS","selbackcolor",selbackColor); tipforeColor=registry.readColorEntry("SETTINGS","tipforecolor",tipforeColor); tipbackColor=registry.readColorEntry("SETTINGS","tipbackcolor",tipbackColor); selMenuTextColor=registry.readColorEntry("SETTINGS","selmenutextcolor",selforeColor); selMenuBackColor=registry.readColorEntry("SETTINGS","selmenubackcolor",selbackColor); // Maximum number of colors to allocate maxcolors=registry.readUnsignedEntry("SETTINGS","maxcolors",maxcolors); // Command line takes precedence if(maxcols) maxcolors=maxcols; // Read input method style if not set from command line inputstyle=registry.readStringEntry("SETTINGS","inputstyle",inputstyle); // Command line takes precedence if(style) inputstyle=style; // Set maximum number of colors in default visual to be nice to legacy // Motif applications which don't handle color allocation gracefully. getRootWindow()->getVisual()->setMaxColors(maxcolors); // Open display; this also applies any system-defined settings. // We only override settings if NOT set from our own registry, since // it is possible that we don't open the display until later, so we // can't simply overwrite system-defined settings after opening the // display here. if(connect){ if(!openDisplay(dpy)){ fxwarning("%s::openDisplay: unable to open display %s\n",getClassName(),dpy); ::exit(1); } } } // Exit application, but not the process void FXApp::exit(FXint code){ FXTRACE((100,"%s::exit\n",getClassName())); // Write the registry registry.write(); // Exit the program stop(code); } // Create application's windows void FXApp::create(){ FXTRACE((100,"%s::create\n",getClassName())); // Create visuals monoVisual->create(); defaultVisual->create(); // Create default font normalFont->create(); stockFont->create(); // Create wait cursor waitCursor->create(); // Create stock cursors cursor[DEF_ARROW_CURSOR]->create(); cursor[DEF_RARROW_CURSOR]->create(); cursor[DEF_TEXT_CURSOR]->create(); cursor[DEF_HSPLIT_CURSOR]->create(); cursor[DEF_VSPLIT_CURSOR]->create(); cursor[DEF_XSPLIT_CURSOR]->create(); cursor[DEF_SWATCH_CURSOR]->create(); cursor[DEF_MOVE_CURSOR]->create(); cursor[DEF_DRAGH_CURSOR]->create(); cursor[DEF_DRAGV_CURSOR]->create(); cursor[DEF_DRAGTL_CURSOR]->create(); cursor[DEF_DRAGTR_CURSOR]->create(); cursor[DEF_DNDSTOP_CURSOR]->create(); cursor[DEF_DNDCOPY_CURSOR]->create(); cursor[DEF_DNDMOVE_CURSOR]->create(); cursor[DEF_DNDLINK_CURSOR]->create(); cursor[DEF_CROSSHAIR_CURSOR]->create(); cursor[DEF_CORNERNE_CURSOR]->create(); cursor[DEF_CORNERNW_CURSOR]->create(); cursor[DEF_CORNERSE_CURSOR]->create(); cursor[DEF_CORNERSW_CURSOR]->create(); cursor[DEF_HELP_CURSOR]->create(); cursor[DEF_HAND_CURSOR]->create(); cursor[DEF_ROTATE_CURSOR]->create(); cursor[DEF_WAIT_CURSOR]->create(); // Create all windows root->create(); } // Detach application's windows void FXApp::detach(){ FXTRACE((100,"%s::detach\n",getClassName())); root->detach(); // Detach default font normalFont->detach(); stockFont->detach(); // Detach wait cursor waitCursor->detach(); // Detach stock cursors cursor[DEF_ARROW_CURSOR]->detach(); cursor[DEF_RARROW_CURSOR]->detach(); cursor[DEF_TEXT_CURSOR]->detach(); cursor[DEF_HSPLIT_CURSOR]->detach(); cursor[DEF_VSPLIT_CURSOR]->detach(); cursor[DEF_XSPLIT_CURSOR]->detach(); cursor[DEF_SWATCH_CURSOR]->detach(); cursor[DEF_MOVE_CURSOR]->detach(); cursor[DEF_DRAGH_CURSOR]->detach(); cursor[DEF_DRAGV_CURSOR]->detach(); cursor[DEF_DRAGTL_CURSOR]->detach(); cursor[DEF_DRAGTR_CURSOR]->detach(); cursor[DEF_DNDSTOP_CURSOR]->detach(); cursor[DEF_DNDCOPY_CURSOR]->detach(); cursor[DEF_DNDMOVE_CURSOR]->detach(); cursor[DEF_DNDLINK_CURSOR]->detach(); cursor[DEF_CROSSHAIR_CURSOR]->detach(); cursor[DEF_CORNERNE_CURSOR]->detach(); cursor[DEF_CORNERNW_CURSOR]->detach(); cursor[DEF_CORNERSE_CURSOR]->detach(); cursor[DEF_CORNERSW_CURSOR]->detach(); cursor[DEF_HELP_CURSOR]->detach(); cursor[DEF_HAND_CURSOR]->detach(); cursor[DEF_ROTATE_CURSOR]->detach(); cursor[DEF_WAIT_CURSOR]->detach(); // Detach visuals monoVisual->detach(); defaultVisual->detach(); } // Destroy application's windows void FXApp::destroy(){ FXTRACE((100,"%s::destroy\n",getClassName())); root->destroy(); // Destroy default font normalFont->destroy(); stockFont->destroy(); // Destroy wait cursor waitCursor->destroy(); // Destroy stock cursors cursor[DEF_ARROW_CURSOR]->destroy(); cursor[DEF_RARROW_CURSOR]->destroy(); cursor[DEF_TEXT_CURSOR]->destroy(); cursor[DEF_HSPLIT_CURSOR]->destroy(); cursor[DEF_VSPLIT_CURSOR]->destroy(); cursor[DEF_XSPLIT_CURSOR]->destroy(); cursor[DEF_SWATCH_CURSOR]->destroy(); cursor[DEF_MOVE_CURSOR]->destroy(); cursor[DEF_DRAGH_CURSOR]->destroy(); cursor[DEF_DRAGV_CURSOR]->destroy(); cursor[DEF_DRAGTL_CURSOR]->destroy(); cursor[DEF_DRAGTR_CURSOR]->destroy(); cursor[DEF_DNDSTOP_CURSOR]->destroy(); cursor[DEF_DNDCOPY_CURSOR]->destroy(); cursor[DEF_DNDMOVE_CURSOR]->destroy(); cursor[DEF_DNDLINK_CURSOR]->destroy(); cursor[DEF_CROSSHAIR_CURSOR]->destroy(); cursor[DEF_CORNERNE_CURSOR]->destroy(); cursor[DEF_CORNERNW_CURSOR]->destroy(); cursor[DEF_CORNERSE_CURSOR]->destroy(); cursor[DEF_CORNERSW_CURSOR]->destroy(); cursor[DEF_HELP_CURSOR]->destroy(); cursor[DEF_HAND_CURSOR]->destroy(); cursor[DEF_ROTATE_CURSOR]->destroy(); cursor[DEF_WAIT_CURSOR]->destroy(); // Destroy visuals monoVisual->destroy(); defaultVisual->destroy(); } // Generates SEL_LEAVE event when cursor is not inside ancestor of // cursorWindow anymore. Note that cursor may still be phyisally inside // the borders of the cursorWindow's shell but is considered outside if // another window obscures it. This mechanism replaces the dysfunctional // and unreliable TrackMouseEvent method. long FXApp::onCmdHover(FXObject*,FXSelector,void*){ FXint x,y; FXuint buttons; FXWindow *window; if(!mouseGrabWindow && cursorWindow && cursorWindow!=root){ root->getCursorPosition(x,y,buttons); if((window=findWindowAt(x,y))==NULL || !window->getShell()->containsChild(cursorWindow)){ event.type=SEL_LEAVE; event.root_x=x; event.root_y=y; leaveWindow(cursorWindow,root); return 0; } } addTimeout(this,ID_HOVER,200); return 0; } #ifdef WIN32 // This window procedure is a static member function of class FXApp. // Its sole purpose is to forward the message info on to FXApp::dispatchEvent(). FXival CALLBACK FXApp::wndproc(FXID hwnd,FXuint iMsg,FXuval wParam,FXival lParam){ return app->dispatchEvent(hwnd,iMsg,wParam,lParam); } #ifndef WM_SYNCPAINT #define WM_SYNCPAINT 0x0088 #endif // Translate to string on KeyPress FXString translateKeyEvent(FXuint,FXuval wParam,FXival lParam){ FXnchar buffer[20]; BYTE keystate[256]; int n; GetKeyboardState(keystate); n=ToUnicodeEx(wParam,HIWORD(lParam)&(KF_EXTENDED|KF_UP|0xFF),keystate,buffer,20,0,GetKeyboardLayout(0)); if(n<=0) n=0; return FXString(buffer,n); } // Message dispatching FXival FXApp::dispatchEvent(FXID hwnd,FXuint iMsg,FXuval wParam,FXival lParam){ FXWindow *window,*ancestor,*win; static HWND lastmovehwnd=0; static LPARAM lastmovelParam=0; POINT ptRoot, pt; DWORD dwpts; PAINTSTRUCT ps; FXuint state; HANDLE hMap; HANDLE answer; if(!IsWindow((HWND)hwnd)) return DefWindowProc((HWND)hwnd,iMsg,wParam,lParam); // Get window window=findWindowWithId(hwnd); if(window==0 && iMsg!=WM_CREATE) return DefWindowProc((HWND)hwnd,iMsg,wParam,lParam); // Translate Win32 message to FOX message type switch(iMsg){ // Repaint event case WM_PAINT: event.type=SEL_PAINT; event.synthetic=1; // FIXME when is it non-synthetic? BeginPaint((HWND)hwnd,&ps); event.rect.x=(FXshort)ps.rcPaint.left; event.rect.y=(FXshort)ps.rcPaint.top; event.rect.w=(FXshort)(ps.rcPaint.right-ps.rcPaint.left); event.rect.h=(FXshort)(ps.rcPaint.bottom-ps.rcPaint.top); window->handle(this,FXSEL(SEL_PAINT,0),&event); EndPaint((HWND)hwnd,&ps); return 0; /* case WM_IME_STARTCOMPOSITION: if(activeWindow){ activeWindow->handle(this, MKUINT(0,SEL_IME_START), NULL); } return def_window_proc((HWND)hwnd,iMsg,wParam,lParam); case WM_IME_ENDCOMPOSITION: if(activeWindow){ activeWindow->handle(this, MKUINT(0,SEL_IME_END), NULL); } return def_window_proc((HWND)hwnd,iMsg,wParam,lParam); case WM_IME_COMPOSITION: if((lParam & GCS_RESULTSTR) && activeWindow){ // Limit the input to 2K characters. 2K should be enough for anyone :-) wchar_t wstr[2048]; HIMC himc = ImmGetContext((HWND)window->id()); int len = ImmGetCompositionStringW(himc, GCS_RESULTSTR, NULL, 0); if(len > sizeof(wstr) - sizeof(wstr[0])){ len = sizeof(wstr) - sizeof(wstr[0]); } ImmGetCompositionStringW(himc, GCS_RESULTSTR, wstr, len); ImmReleaseContext((HWND)window->id(), himc); // The length is given in bytes for some reason. wstr[len/sizeof(wstr[0])] = 0; char str[6 * sizeof(wstr) / sizeof(wstr[0])]; int mblen = wcstombs( str, wstr, sizeof(str) ); str[mblen] = 0; activeWindow->handle(this,MKUINT(0,SEL_IME_TEXT),str); } return def_window_proc((HWND)hwnd,iMsg,wParam,lParam); */ // Keyboard case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: FXTRACE((100,"%s virtkey=%c [0x%04x] hi=0x%04x rc=%d\n",iMsg==WM_KEYDOWN?"WM_KEYDOWN":iMsg==WM_KEYUP?"WM_KEYUP":iMsg==WM_SYSKEYDOWN?"WM_SYSKEYDOWN":"WM_SYSKEYUP",wParam,wParam,HIWORD(lParam),LOWORD(lParam))); event.type=((iMsg==WM_KEYUP)||(iMsg==WM_SYSKEYUP)) ? SEL_KEYRELEASE : SEL_KEYPRESS; event.time=GetMessageTime(); dwpts=GetMessagePos(); event.root_x=pt.x=((int)(short)LOWORD(dwpts)); event.root_y=pt.y=((int)(short)HIWORD(dwpts)); ScreenToClient((HWND)hwnd,&pt); event.win_x=pt.x; event.win_y=pt.y; event.state=fxmodifierkeys(); // Translate to keysym event.code=wkbMapKeyCode(iMsg,wParam,lParam);// FIXME not all codes match with those of X11 // Translate to string on KeyPress if(event.type==SEL_KEYPRESS){ event.text=translateKeyEvent(iMsg,wParam,lParam); } // Clear string on KeyRelease else{ event.text.clear(); } /* Alt key seems to repeat. */ // Fix modifier state if(event.type==SEL_KEYPRESS){ if(event.code==KEY_Shift_L) event.state|=SHIFTMASK; else if(event.code==KEY_Shift_R) event.state|=SHIFTMASK; else if(event.code==KEY_Control_L) event.state|=CONTROLMASK; else if(event.code==KEY_Control_R) event.state|=CONTROLMASK; else if(event.code==KEY_F13) event.state|=METAMASK; // Key between Ctrl and Alt (on most keyboards) else if(event.code==KEY_Alt_L) event.state|=ALTMASK; else if(event.code==KEY_Alt_R) event.state|=ALTMASK; // FIXME do we need ALTGR flag instead/in addition? else if(event.code==KEY_Num_Lock) event.state|=NUMLOCKMASK; else if(event.code==KEY_Caps_Lock) event.state|=CAPSLOCKMASK; else if(event.code==KEY_Scroll_Lock) event.state|=SCROLLLOCKMASK; else if(event.code==KEY_Super_L) event.state|=METAMASK; else if(event.code==KEY_Super_R) event.state|=METAMASK; else{ stickyMods=event.state&(SHIFTMASK|CONTROLMASK|METAMASK|ALTMASK); } } else{ if(event.code==KEY_Shift_L) event.state&=~SHIFTMASK; else if(event.code==KEY_Shift_R) event.state&=~SHIFTMASK; else if(event.code==KEY_Control_L) event.state&=~CONTROLMASK; else if(event.code==KEY_Control_R) event.state&=~CONTROLMASK; else if(event.code==KEY_F13) event.state&=~METAMASK; // Key between Ctrl and Alt (on most keyboards) else if(event.code==KEY_Alt_L) event.state&=~ALTMASK; else if(event.code==KEY_Alt_R) event.state&=~ALTMASK; // FIXME do we need ALTGR flag instead/in addition? else if(event.code==KEY_Num_Lock) event.state&=~NUMLOCKMASK; else if(event.code==KEY_Caps_Lock) event.state&=~CAPSLOCKMASK; else if(event.code==KEY_Scroll_Lock) event.state&=~SCROLLLOCKMASK; else if(event.code==KEY_Super_L) event.state&=~METAMASK; else if(event.code==KEY_Super_R) event.state&=~METAMASK; else{ event.state|=stickyMods; stickyMods=0; } } FXTRACE((100,"%s code=%04x state=%04x stickyMods=%04x text=\"%s\"\n",(event.type==SEL_KEYPRESS)?"SEL_KEYPRESS":"SEL_KEYRELEASE",event.code,event.state,stickyMods,event.text.text())); // Keyboard grabbed by specific window if(keyboardGrabWindow){ if(keyboardGrabWindow->handle(this,FXSEL(event.type,0),&event)) refresh(); return 0; } // Remember window for later if(event.type==SEL_KEYPRESS) keyWindow=activeWindow; // Dispatch to key window if(keyWindow){ // FIXME doesSaveUnder test should go away // Dispatch if not in a modal loop or in a modal loop for a window containing the focus window if(!invocation || invocation->modality==MODAL_FOR_NONE || (invocation->window && invocation->window->isOwnerOf(keyWindow)) || keyWindow->getShell()->doesSaveUnder()){ if(keyWindow->handle(this,FXSEL(event.type,0),&event)) refresh(); return 0; } // Beep if outside modal if(event.type==SEL_KEYPRESS) beep(); } return 0; // The grab might be broken; in FOX, we ignore this!! case WM_CANCELMODE: //FXTRACE((100,"WM_CANCELMODE\n")); return 0; // Capture changed case WM_CAPTURECHANGED: //FXTRACE((100,"WM_CAPTURECHANGED\n")); return 0; // Motion case WM_MOUSEMOVE: event.time=GetMessageTime(); pt.x=ptRoot.x=(int)((short)LOWORD(lParam)); pt.y=ptRoot.y=(int)((short)HIWORD(lParam)); ClientToScreen((HWND)hwnd,&ptRoot); event.root_x=ptRoot.x; event.root_y=ptRoot.y; event.state=fxmodifierkeys(); //FXTRACE((100,"WM_MOUSEMOVE hwnd=%d x=%d y=%d \n",hwnd,event.root_x,event.root_y)); // Reset hover timer addTimeout(this,ID_HOVER,200); // Set moved flag if((FXABS(event.root_x-event.rootclick_x)>=dragDelta) || (FXABS(event.root_y-event.rootclick_y)>=dragDelta)) event.moved=1; // Was grabbed if(mouseGrabWindow){ // Translate to grab window's coordinate system root->translateCoordinatesTo(event.win_x,event.win_y,mouseGrabWindow,event.root_x,event.root_y); // Moved out of/into rectangle of grabbed window if(0<=event.win_x && event.win_xgetWidth() && 0<=event.win_y && event.win_ygetHeight()){ window=mouseGrabWindow; } else{ window=mouseGrabWindow->getParent(); } } // Switched windows if(cursorWindow!=window){ ancestor=FXWindow::commonAncestor(window,cursorWindow); event.code=CROSSINGNORMAL; leaveWindow(cursorWindow,ancestor); enterWindow(window,ancestor); refresh(); } // Suppress spurious `tickling' motion events if(hwnd==lastmovehwnd && lParam==lastmovelParam) return 0; // Was still grabbed, but possibly new grab window! if(mouseGrabWindow){ // Translate to grab window's coordinate system root->translateCoordinatesTo(event.win_x,event.win_y,mouseGrabWindow,event.root_x,event.root_y); // Set event data event.type=SEL_MOTION; event.code=0; // Dispatch to grab-window if(mouseGrabWindow->handle(this,FXSEL(SEL_MOTION,0),&event)) refresh(); } // FIXME Does window still exist? // Was not grabbed else if(!invocation || invocation->modality==MODAL_FOR_NONE || (invocation->window && invocation->window->isOwnerOf(window)) || window->getShell()->doesSaveUnder()){ // FIXME doesSaveUnder test should go away // Set event data event.type=SEL_MOTION; event.code=0; event.win_x=pt.x; event.win_y=pt.y; // Dispatch to window under cursor if(window->handle(this,FXSEL(SEL_MOTION,0),&event)) refresh(); } // Update most recent mouse position event.last_x=pt.x; event.last_y=pt.y; // Remember this for tickling test lastmovehwnd=(HWND)hwnd; lastmovelParam=lParam; return 0; // Button case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: event.time=GetMessageTime(); event.win_x=pt.x=(int)((short)LOWORD(lParam)); event.win_y=pt.y=(int)((short)HIWORD(lParam)); ClientToScreen((HWND)hwnd,&pt); event.root_x=pt.x; event.root_y=pt.y; event.state=fxmodifierkeys(); // Get the state of the modifier keys and mouse buttons if(iMsg==WM_LBUTTONDOWN || iMsg==WM_MBUTTONDOWN || iMsg==WM_RBUTTONDOWN){ if(iMsg==WM_LBUTTONDOWN){ event.type=SEL_LEFTBUTTONPRESS; event.code=LEFTBUTTON; } if(iMsg==WM_MBUTTONDOWN){ event.type=SEL_MIDDLEBUTTONPRESS; event.code=MIDDLEBUTTON; } if(iMsg==WM_RBUTTONDOWN){ event.type=SEL_RIGHTBUTTONPRESS; event.code=RIGHTBUTTON; } if(!event.moved && (event.time-event.click_timetranslateCoordinatesTo(event.win_x,event.win_y,mouseGrabWindow,event.win_x,event.win_y); if(mouseGrabWindow->handle(this,FXSEL(event.type,0),&event)) refresh(); } // FIXME doesSaveUnder test should go away else if(!invocation || invocation->modality==MODAL_FOR_NONE || (invocation->window && invocation->window->isOwnerOf(window)) || window->getShell()->doesSaveUnder()){ if(window->handle(this,FXSEL(event.type,0),&event)) refresh(); } else if(iMsg==WM_LBUTTONDOWN || iMsg==WM_MBUTTONDOWN || iMsg==WM_RBUTTONDOWN){ beep(); } event.last_x=event.win_x; event.last_y=event.win_y; return 0; // Mouse wheel case WM_MOUSEWHEEL: event.type=SEL_MOUSEWHEEL; event.time=GetMessageTime(); event.root_x=pt.x=(int)((short)LOWORD(lParam)); event.root_y=pt.y=(int)((short)HIWORD(lParam)); event.code=(int)((short)HIWORD(wParam)); event.state=fxmodifierkeys(); // Get the state of the modifier keys and mouse buttons window=findWindowAt(event.root_x,event.root_y); if(window){ ScreenToClient((HWND)window->id(),&pt); event.win_x=pt.x; event.win_y=pt.y; if(mouseGrabWindow){ window->translateCoordinatesTo(event.win_x,event.win_y,mouseGrabWindow,event.win_x,event.win_y); if(mouseGrabWindow->handle(this,FXSEL(SEL_MOUSEWHEEL,0),&event)) refresh(); } else{ // FIXME doesSaveUnder test should go away while(window && (!invocation || invocation->modality==MODAL_FOR_NONE || (invocation->window && invocation->window->isOwnerOf(window)) || window->getShell()->doesSaveUnder())){ if(window->handle(this,FXSEL(SEL_MOUSEWHEEL,0),&event)){ refresh(); break; } window=window->getParent(); } } } return 0; // Focus case WM_SETFOCUS: SendMessage((HWND)window,WM_NCACTIVATE,1,123456); // Suggestion from: Frank De prins case WM_KILLFOCUS: window=window->getShell(); if(iMsg==WM_KILLFOCUS && activeWindow==window){ event.type=SEL_FOCUSOUT; if(window->handle(this,FXSEL(SEL_FOCUSOUT,0),&event)) refresh(); activeWindow=NULL; } if(iMsg==WM_SETFOCUS && activeWindow!=window){ event.type=SEL_FOCUSIN; if(window->handle(this,FXSEL(SEL_FOCUSIN,0),&event)) refresh(); activeWindow=window; } return 0; // Map or Unmap case WM_SHOWWINDOW: if(wParam){ event.type=SEL_MAP; if(window->handle(this,FXSEL(SEL_MAP,0),&event)) refresh(); } else{ event.type=SEL_UNMAP; if(window->handle(this,FXSEL(SEL_UNMAP,0),&event)) refresh(); } return DefWindowProc((HWND)hwnd,iMsg,wParam,lParam); // Create case WM_CREATE: event.type=SEL_CREATE; window=(FXWindow*)(((LPCREATESTRUCT)lParam)->lpCreateParams); hash.insert((void*)hwnd,window); if(window->handle(this,FXSEL(SEL_CREATE,0),&event)) refresh(); return 0; // Close case WM_CLOSE: ////// Semantics: SEL_CLOSE is a suggestion that the window be closed; ////// SEL_DESTROY is a notify that destruction has already taken place. ////// Thus, a toplevel window gets a close, and MAY decide not to be closed; ////// If it thinks its OK to close, it gets a SEL_DESTROY also. event.type=SEL_CLOSE; if(!invocation || invocation->modality==MODAL_FOR_NONE || (invocation->window && invocation->window->isOwnerOf(window))){ if(window->handle(this,FXSEL(SEL_CLOSE,0),&event)) refresh(); } else{ beep(); } return 0; // Destroy case WM_DESTROY: event.type=SEL_DESTROY; if(window->handle(this,FXSEL(SEL_DESTROY,0),&event)) refresh(); return 0; // Configure (size) case WM_SIZE: if(wParam==SIZE_MINIMIZED) return 0; event.type=SEL_CONFIGURE; event.rect.x=window->getX(); event.rect.y=window->getY(); event.rect.w=LOWORD(lParam); event.rect.h=HIWORD(lParam); if(window->handle(this,FXSEL(SEL_CONFIGURE,0),&event)) refresh(); return 0; // Configure (move) case WM_MOVE: event.type=SEL_CONFIGURE; event.rect.x=(short)LOWORD(lParam); event.rect.y=(short)HIWORD(lParam); event.rect.w=window->getWidth(); event.rect.h=window->getHeight(); if(window->handle(this,FXSEL(SEL_CONFIGURE,0),&event)) refresh(); return 0; // Configure position and size case WM_WINDOWPOSCHANGED: return DefWindowProc((HWND)hwnd,iMsg,wParam,lParam); // Lost clipboard ownership case WM_DESTROYCLIPBOARD: if(clipboardWindow){ event.time=GetMessageTime(); event.type=SEL_CLIPBOARD_LOST; if(clipboardWindow->handle(this,FXSEL(SEL_CLIPBOARD_LOST,0),&event)) refresh(); clipboardWindow=NULL; } return 0; // Safeguard it in the clipboard case WM_RENDERALLFORMATS: if(clipboardWindow){ OpenClipboard((HWND)hwnd); EmptyClipboard(); UINT iFormat=0; while((iFormat=EnumClipboardFormats(iFormat))!=0){ event.type=SEL_CLIPBOARD_REQUEST; event.time=GetMessageTime(); event.target=iFormat; if(clipboardWindow->handle(this,FXSEL(SEL_CLIPBOARD_REQUEST,0),&event)) refresh(); FXTRACE((100,"Window %d being requested for CLIPBOARD DATA of type %d\n",hwnd,wParam)); } CloseClipboard(); } return 0; // We're asked to provide certain format to the clipboard case WM_RENDERFORMAT: if(clipboardWindow){ event.type=SEL_CLIPBOARD_REQUEST; event.time=GetMessageTime(); event.target=wParam; clipboardWindow->handle(this,FXSEL(SEL_CLIPBOARD_REQUEST,0),&event); FXTRACE((100,"Window %d being requested for CLIPBOARD DATA of type %d\n",hwnd,wParam)); } return 0; // Change the cursor based on the window case WM_SETCURSOR: if(waitCount){ SetCursor((HCURSOR)waitCursor->id()); // Show wait cursor return 0; } if(!mouseGrabWindow && window->getDefaultCursor() && (LOWORD(lParam)==HTCLIENT)){ SetCursor((HCURSOR)window->getDefaultCursor()->id()); // Show default cursor return 0; } return DefWindowProc((HWND)hwnd,iMsg,wParam,lParam); case WM_PALETTECHANGED: // Suggested by Boris Kogan if((HWND)wParam==hwnd) break; case WM_QUERYNEWPALETTE: if(window->getVisual()->colormap){ HDC hdc=GetDC((HWND)hwnd); HPALETTE paletteold=SelectPalette(hdc,(HPALETTE)window->getVisual()->colormap,FALSE); UINT nchanged=RealizePalette(hdc); if(nchanged) InvalidateRect((HWND)hwnd,NULL,TRUE); SelectPalette(hdc,paletteold,TRUE); ReleaseDC((HWND)hwnd,hdc); return nchanged; } return 0; case WM_QUERYENDSESSION: // Session will end if this app thinks its OK event.type=SEL_SESSION_NOTIFY; return !window->handle(this,FXSEL(SEL_SESSION_NOTIFY,0),&event); // Return 1 if OK to terminate case WM_ENDSESSION: // Session will now end for sure event.type=SEL_SESSION_CLOSED; if(wParam) window->handle(this,FXSEL(SEL_SESSION_CLOSED,0),&event); return 0; case WM_STYLECHANGING: case WM_SIZING: case WM_MOVING: case WM_ERASEBKGND: // Do nothing, erasing background causes flashing return 0; case WM_ACTIVATE: //FXTRACE((100,"WM_ACTIVATE %d\n",LOWORD(wParam))); if(window->isMemberOf(FXMETACLASS(FXTopWindow)) && activeWindow && activeWindow!=window){ // Suggestion from: Frank De prins SendMessage((HWND)activeWindow->id(),WM_NCACTIVATE,0,123456); } return DefWindowProc((HWND)hwnd,iMsg,wParam,lParam); case WM_GETMINMAXINFO: if(window->id() && window->shown() &&window->isMemberOf(FXMETACLASS(FXTopWindow))){ RECT rect; //FXTRACE((100,"WM_GETMINMAXINFO ptMaxSize=%d,%d ptMinTrackSize=%d,%d ptMaxTrackSize=%d,%d\n",((MINMAXINFO*)lParam)->ptMaxSize.x,((MINMAXINFO*)lParam)->ptMaxSize.y,((MINMAXINFO*)lParam)->ptMinTrackSize.x,((MINMAXINFO*)lParam)->ptMinTrackSize.y,((MINMAXINFO*)lParam)->ptMaxTrackSize.x,((MINMAXINFO*)lParam)->ptMaxTrackSize.y)); if(!(((FXTopWindow*)window)->getDecorations()&DECOR_SHRINKABLE)){ if(!(((FXTopWindow*)window)->getDecorations()&DECOR_STRETCHABLE)){ // Cannot change at all SetRect(&rect,0,0,window->getWidth(),window->getHeight()); AdjustWindowRectEx(&rect,GetWindowLong((HWND)hwnd,GWL_STYLE),false,GetWindowLong((HWND)hwnd,GWL_EXSTYLE)); ((MINMAXINFO*)lParam)->ptMinTrackSize.x=((MINMAXINFO*)lParam)->ptMaxTrackSize.x=rect.right-rect.left; ((MINMAXINFO*)lParam)->ptMinTrackSize.y=((MINMAXINFO*)lParam)->ptMaxTrackSize.y=rect.bottom-rect.top; } else{ // Cannot get smaller than default SetRect(&rect,0,0,window->getDefaultWidth(),window->getDefaultHeight()); AdjustWindowRectEx(&rect,GetWindowLong((HWND)hwnd,GWL_STYLE),false,GetWindowLong((HWND)hwnd,GWL_EXSTYLE)); ((MINMAXINFO*)lParam)->ptMinTrackSize.x=rect.right-rect.left; ((MINMAXINFO*)lParam)->ptMinTrackSize.y=rect.bottom-rect.top; } } else if(!(((FXTopWindow*)window)->getDecorations()&DECOR_STRETCHABLE)){ // Cannot get larger than default SetRect(&rect,0,0,window->getDefaultWidth(),window->getDefaultHeight()); AdjustWindowRectEx(&rect,GetWindowLong((HWND)hwnd,GWL_STYLE),false,GetWindowLong((HWND)hwnd,GWL_EXSTYLE)); ((MINMAXINFO*)lParam)->ptMaxTrackSize.x=rect.right-rect.left; ((MINMAXINFO*)lParam)->ptMaxTrackSize.y=rect.bottom-rect.top; } //FXTRACE((100,"width=%d height=%d\n",window->getWidth(),window->getHeight())); //FXTRACE((100,"WM_GETMINMAXINFO ptMaxSize=%d,%d ptMinTrackSize=%d,%d ptMaxTrackSize=%d,%d\n",((MINMAXINFO*)lParam)->ptMaxSize.x,((MINMAXINFO*)lParam)->ptMaxSize.y,((MINMAXINFO*)lParam)->ptMinTrackSize.x,((MINMAXINFO*)lParam)->ptMinTrackSize.y,((MINMAXINFO*)lParam)->ptMaxTrackSize.x,((MINMAXINFO*)lParam)->ptMaxTrackSize.y)); } return 0; case WM_INITMENU: // Patch from Robin Wilson case WM_SYSCOMMAND: // This pops down the menupane when clicking in non-client area for(win=getRootWindow()->getFirst(); win; win=win->getNext()){ // FIXME don't we already know popupWindow? if(win->shown() && win->isMemberOf(FXMETACLASS(FXMenuPane)) && window->containsChild(win->getOwner())) window->killFocus(); } return DefWindowProc((HWND)hwnd,iMsg,wParam,lParam); case WM_ENTERMENULOOP: case WM_MENUCHAR: case WM_MENUSELECT: case WM_EXITMENULOOP: case WM_DISPLAYCHANGE: // added by msh 2/DEC/99 case WM_TIMER: // added by msh 2/DEC/99 case WM_ENTERIDLE: // 24/NOV/99 md case WM_NCCREATE: case WM_NCDESTROY: case WM_ENTERSIZEMOVE: case WM_EXITSIZEMOVE: case WM_PARENTNOTIFY: case WM_SETTEXT: case WM_GETTEXT: case WM_QUERYOPEN: case WM_ENABLE: case WM_MOUSEACTIVATE: case WM_CHILDACTIVATE: case WM_SYNCPAINT: case WM_NCPAINT: case WM_NCHITTEST: case WM_NCMOUSEMOVE: case WM_NCCALCSIZE: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: case WM_WINDOWPOSCHANGING: // Leave whatever placement is suggested case WM_STYLECHANGED: case WM_MOUSELEAVE: // We no longer use TrackMouseEvent it is not reliable return DefWindowProc((HWND)hwnd,iMsg,wParam,lParam); case WM_NCACTIVATE: // Suggestion from: Frank De prins if(lParam!=123456) wParam=1; return DefWindowProc((HWND)hwnd,iMsg,wParam,lParam); case WM_ACTIVATEAPP: // Suggestion from: Frank De prins SendMessage((HWND)hwnd,WM_NCACTIVATE,wParam,123456); return DefWindowProc((HWND)hwnd,iMsg,wParam,lParam); case WM_DROPFILES: //char ListFileName[MAX_PATH]; //HDROP DropData=(HDROP)WParam; //DragQueryFile(DropData,0,ListFileName,sizeof(ListFileName)-1); //DragFinish(DropData); break; case WM_DND_ENTER: FXTRACE((100,"DNDEnter from remote window %d\n",lParam)); xdndSource=(FXID)lParam; if(ddeTypeList){FXFREE(&ddeTypeList);ddeNumTypes=0;} hMap=OpenFileMapping(FILE_MAP_READ,FALSE,TEXT("XdndTypeList")); if(hMap){ FXDragType *dragtypes=(FXDragType*)MapViewOfFile(hMap,FILE_MAP_READ,0,0,0); if(dragtypes){ if(FXMALLOC(&ddeTypeList,FXDragType,dragtypes[0])){ memcpy(ddeTypeList,&dragtypes[1],dragtypes[0]*sizeof(FXDragType)); ddeNumTypes=dragtypes[0]; } UnmapViewOfFile(dragtypes); } CloseHandle(hMap); } return 0; case WM_DND_LEAVE: FXTRACE((100,"DNDLeave from remote window %d\n",lParam)); if(xdndSource!=(FXID)lParam) return 0; if(dropWindow){ event.type=SEL_DND_LEAVE; if(dropWindow->handle(this,FXSEL(SEL_DND_LEAVE,0),&event)) refresh(); dropWindow=NULL; } if(ddeTypeList){FXFREE(&ddeTypeList);ddeNumTypes=0;} xdndSource=0; return 0; case WM_DND_DROP: FXTRACE((100,"DNDDrop from remote window %d\n",lParam)); if(xdndSource!=(FXID)lParam) return 0; xdndFinishSent=false; event.type=SEL_DND_DROP; event.time=GetMessageTime(); if(!dropWindow || !dropWindow->handle(this,FXSEL(SEL_DND_DROP,0),&event)) ansAction=DRAG_REJECT; if(!xdndFinishSent){ PostMessage((HWND)xdndSource,WM_DND_FINISH_REJECT+ansAction,0,(LPARAM)hwnd); } if(ddeTypeList){FXFREE(&ddeTypeList);ddeNumTypes=0;} dropWindow=NULL; xdndSource=0; refresh(); return 0; case WM_DND_POSITION_REJECT: case WM_DND_POSITION_COPY: case WM_DND_POSITION_MOVE: case WM_DND_POSITION_LINK: case WM_DND_POSITION_PRIVATE: FXTRACE((100,"DNDPosition from remote window %d\n",lParam)); if(xdndSource!=(FXID)lParam) return 0; event.time=GetMessageTime(); event.root_x=(int)((short)LOWORD(wParam)); event.root_y=(int)((short)HIWORD(wParam)); win=findWindowAt(event.root_x,event.root_y); ddeAction=(FXDragAction)(iMsg-WM_DND_POSITION_REJECT); // Action encoded in message ansAction=DRAG_REJECT; xdndRect.x=event.root_x; xdndRect.y=event.root_y; xdndRect.w=1; xdndRect.h=1; if(win!=dropWindow){ if(dropWindow){ event.type=SEL_DND_LEAVE; if(dropWindow->handle(this,FXSEL(SEL_DND_LEAVE,0),&event)) refresh(); } dropWindow=NULL; if(win && win->isDropEnabled()){ dropWindow=win; event.type=SEL_DND_ENTER; if(dropWindow->handle(this,FXSEL(SEL_DND_ENTER,0),&event)) refresh(); } } if(dropWindow){ pt.x=event.root_x; pt.y=event.root_y; ScreenToClient((HWND)dropWindow->id(),&pt); event.win_x=pt.x; event.win_y=pt.y; event.type=SEL_DND_MOTION; if(dropWindow->handle(this,FXSEL(SEL_DND_MOTION,0),&event)) refresh(); event.last_x=event.win_x; event.last_y=event.win_y; } FXTRACE((100,"accepting %d\n",ansAction)); PostMessage((HWND)xdndSource,WM_DND_STATUS_REJECT+ansAction,MAKELONG(xdndRect.x,xdndRect.y),MAKELONG(xdndRect.w,xdndRect.h)); return 0; case WM_DND_STATUS_REJECT: case WM_DND_STATUS_COPY: case WM_DND_STATUS_MOVE: case WM_DND_STATUS_LINK: case WM_DND_STATUS_PRIVATE: ansAction=(FXDragAction)(iMsg-WM_DND_STATUS_REJECT); xdndRect.x=(int)((short)LOWORD(wParam)); xdndRect.y=(int)((short)HIWORD(wParam)); xdndRect.w=(int)((short)LOWORD(lParam)); xdndRect.h=(int)((short)HIWORD(lParam)); xdndStatusReceived=TRUE; xdndStatusPending=FALSE; FXTRACE((100,"DNDStatus from remote window action=%d rect x=%d y=%d w=%d h=%d\n",ansAction,xdndRect.x,xdndRect.y,xdndRect.w,xdndRect.h)); return 0; case WM_DND_REQUEST: answer=0; if(dragWindow){ event.type=SEL_DND_REQUEST; event.time=GetMessageTime(); event.target=(FXDragType)wParam; ddeData=NULL; ddeSize=0; dragWindow->handle(this,FXSEL(SEL_DND_REQUEST,0),&event); FXTRACE((100,"Window %d being requested by window %d for XDND DATA of type %d; sending %d bytes\n",hwnd,lParam,wParam,ddeSize)); answer=fxsenddata((HWND)lParam,ddeData,ddeSize); FXFREE(&ddeData); ddeData=NULL; ddeSize=0; } FXTRACE((100,"sending handle %d from window %d to %d\n",answer,hwnd,lParam)); PostMessage((HWND)lParam,WM_DND_REPLY,(WPARAM)answer,(LPARAM)hwnd); return 0; } return DefWindowProc((HWND)hwnd,iMsg,wParam,lParam); } #endif // Handle quit long FXApp::onCmdQuit(FXObject*,FXSelector,void*){ exit(0); return 1; } // Register DND type FXDragType FXApp::registerDragType(const FXString& name) const { if(initialized){ #ifndef WIN32 return (FXDragType)XInternAtom((Display*)display,name.text(),0); #else return RegisterClipboardFormatA(name.text()); #endif } return 0; } // Get name of registered drag type FXString FXApp::getDragTypeName(FXDragType type) const { if(initialized){ #ifndef WIN32 FXchar *name=XGetAtomName((Display*)display,type); FXString dragtypename(name); XFree(name); return dragtypename; #else if(0xC000<=type && type<=0xFFFF){ FXchar buffer[256]; GetClipboardFormatNameA(type,buffer,sizeof(buffer)); return buffer; } return "WIN32_DEFAULT_TYPE"; #endif } return FXString::null; } /*******************************************************************************/ // Return key state bool FXApp::getKeyState(FXuint keysym) const { #ifdef WIN32 return GetKeyState(keysym)!=0; #else KeyCode keycode=XKeysymToKeycode((Display*)display,keysym); char keys[32]; if(keycode==NoSymbol) return false; XQueryKeymap((Display*)display,keys); return (keys[keycode>>3]>>(keycode&7))&1; #endif } // Beep void FXApp::beep(){ if(initialized){ FXTRACE((100,"Beep\n")); #ifndef WIN32 XBell((Display*)display,0); #else MessageBeep(0); #endif } } // Dump widgets long FXApp::onCmdDump(FXObject*,FXSelector,void*){ dumpWidgets(); return 1; } // Dump widget information void FXApp::dumpWidgets() const { register FXWindow *w=getRootWindow(); register FXObject *t; register FXint lev=0; register FXchar s; while(w){ t=w->getTarget(); s=w->shown()?'+':'-'; if(t){ fxmessage("%*c%s (%p): wk=%d id=%lu target=%s (%p) sel=%d x=%d y=%d w=%d h=%d\n",lev*2,s,w->getClassName(),w,w->getKey(),w->id(),t->getClassName(),t,w->getSelector(),w->getX(),w->getY(),w->getWidth(),w->getHeight()); } else{ fxmessage("%*c%s (%p): wk=%d id=%lu x=%d y=%d w=%d h=%d\n",lev*2,s,w->getClassName(),w,w->getKey(),w->id(),w->getX(),w->getY(),w->getWidth(),w->getHeight()); } if(w->getFirst()){ w=w->getFirst(); lev++; continue; } while(!w->getNext() && w->getParent()){ w=w->getParent(); lev--; if(lev==1) fxmessage("\n"); } w=w->getNext(); } } // Change default visual void FXApp::setDefaultVisual(FXVisual* vis){ if(!vis){ fxerror("%s::setDefaultVisual: NULL visual.\n",getClassName()); } defaultVisual=vis; } // Change normal font void FXApp::setNormalFont(FXFont* font){ if(!font){ fxerror("%s::setNormalFont: NULL font.\n",getClassName()); } normalFont=font; } // Set root Window void FXApp::setRootWindow(FXRootWindow* rt){ if(!rt){ fxerror("%s::setRootWindow: NULL root window.\n",getClassName()); } if(root->getFirst()){ fxerror("%s::setRootWindow: already have windows.\n",getClassName()); } if(rt->getVisual()!=root->getVisual()){ fxerror("%s::setRootWindow: has different visual.\n",getClassName()); } root=rt; } // Begin of wait-cursor block; wait-cursor blocks may be nested. void FXApp::beginWaitCursor(){ if(initialized){ if(waitCount==0){ if(!waitCursor->id()){ fxerror("%s::beginWaitCursor: wait cursor not created yet.\n",getClassName()); } #ifndef WIN32 register FXWindow* child; FXASSERT(display); child=getRootWindow()->getFirst(); while(child){ if(child->id()){ XDefineCursor((Display*)display,child->id(),waitCursor->id()); if(child->getFirst()){child=child->getFirst();continue;} } while(!child->getNext()&&child->getParent()){child=child->getParent();} child=child->getNext(); } XFlush((Display*)display); #else SetCursor((HCURSOR)waitCursor->id()); #endif } waitCount++; } } // End of wait-cursor block void FXApp::endWaitCursor(){ if(initialized){ if(waitCount==0) return; waitCount--; if(waitCount==0){ if(!waitCursor->id()){ fxerror("%s::endWaitCursor: wait cursor not created yet.\n",getClassName()); } #ifndef WIN32 register FXWindow* child; child=getRootWindow()->getFirst(); while(child){ if(child->id()){ XDefineCursor((Display*)display,child->id(),child->getDefaultCursor()->id()); if(child->getFirst()){child=child->getFirst();continue;} } while(!child->getNext()&&child->getParent()){child=child->getParent();} child=child->getNext(); } XFlush((Display*)display); #else if(cursorWindow){ SetCursor((HCURSOR)cursorWindow->getDefaultCursor()->id()); } #endif } } } // Change to a new wait cursor void FXApp::setWaitCursor(FXCursor *cur){ if(initialized){ if(cur==NULL){ fxerror("%s::setWaitCursor: NULL wait cursor.\n",getClassName()); } if(waitCursor!=cur){ waitCursor=cur; if(waitCount){ if(!waitCursor->id()){ fxerror("%s::setWaitCursor: wait cursor not created yet.\n",getClassName()); } #ifndef WIN32 register FXWindow* child; child=getRootWindow()->getFirst(); while(child){ if(child->id()){ XDefineCursor((Display*)display,child->id(),waitCursor->id()); if(child->getFirst()){child=child->getFirst();continue;} } while(!child->getNext()&&child->getParent()){child=child->getParent();} child=child->getNext(); } XFlush((Display*)display); #else SetCursor((HCURSOR)waitCursor->id()); #endif } } } } // Change default cursor void FXApp::setDefaultCursor(FXDefaultCursor which,FXCursor* cur){ if(!cur){ fxerror("%s::setDefaultCursor: NULL default cursor.\n",getClassName()); } cursor[which]=cur; } // Change message translator void FXApp::setTranslator(FXTranslator* trans){ translator=trans; } // Write a window and its children into the stream store FXbool FXApp::writeWindow(FXStream& store,FXWindow *window){ if(store.direction()!=FXStreamSave){ fxerror("%s::writeWidget: wrong stream direction.\n",getClassName()); } if(!window){ fxerror("%s::writeWidget: NULL window argument.\n",getClassName()); } store.addObject(this); store.addObject(root); store.addObject(monoVisual); store.addObject(defaultVisual); store.addObject(normalFont); store.addObject(stockFont); store.addObject(waitCursor); store.addObject(cursor[DEF_ARROW_CURSOR]); store.addObject(cursor[DEF_RARROW_CURSOR]); store.addObject(cursor[DEF_TEXT_CURSOR]); store.addObject(cursor[DEF_HSPLIT_CURSOR]); store.addObject(cursor[DEF_VSPLIT_CURSOR]); store.addObject(cursor[DEF_XSPLIT_CURSOR]); store.addObject(cursor[DEF_SWATCH_CURSOR]); store.addObject(cursor[DEF_MOVE_CURSOR]); store.addObject(cursor[DEF_DRAGH_CURSOR]); store.addObject(cursor[DEF_DRAGV_CURSOR]); store.addObject(cursor[DEF_DRAGTL_CURSOR]); store.addObject(cursor[DEF_DRAGTR_CURSOR]); store.addObject(cursor[DEF_DNDSTOP_CURSOR]); store.addObject(cursor[DEF_DNDCOPY_CURSOR]); store.addObject(cursor[DEF_DNDMOVE_CURSOR]); store.addObject(cursor[DEF_DNDLINK_CURSOR]); store.addObject(cursor[DEF_CROSSHAIR_CURSOR]); store.addObject(cursor[DEF_CORNERNE_CURSOR]); store.addObject(cursor[DEF_CORNERNW_CURSOR]); store.addObject(cursor[DEF_CORNERSE_CURSOR]); store.addObject(cursor[DEF_CORNERSW_CURSOR]); store.addObject(cursor[DEF_HELP_CURSOR]); store.addObject(cursor[DEF_HAND_CURSOR]); store.addObject(cursor[DEF_ROTATE_CURSOR]); store.addObject(cursor[DEF_WAIT_CURSOR]); // FXTRACE((1,"FXApp::writeWindow pos=%ld\n",store.position())); store << window; // FXTRACE((1,"FXApp::writeWindow pos=%ld\n",store.position())); return TRUE; } // Read a window and its children from the stream store FXbool FXApp::readWindow(FXStream& store,FXWindow*& window,FXWindow* father,FXWindow* owner){ if(store.direction()!=FXStreamLoad){ fxerror("%s::readWidget: wrong stream direction.\n",getClassName()); } if(!father){ fxerror("%s::readWidget: NULL father argument.\n",getClassName()); } if(!owner){ fxerror("%s::readWidget: NULL owner argument.\n",getClassName()); } store.addObject(this); store.addObject(root); store.addObject(monoVisual); store.addObject(defaultVisual); store.addObject(normalFont); store.addObject(stockFont); store.addObject(waitCursor); store.addObject(cursor[DEF_ARROW_CURSOR]); store.addObject(cursor[DEF_RARROW_CURSOR]); store.addObject(cursor[DEF_TEXT_CURSOR]); store.addObject(cursor[DEF_HSPLIT_CURSOR]); store.addObject(cursor[DEF_VSPLIT_CURSOR]); store.addObject(cursor[DEF_XSPLIT_CURSOR]); store.addObject(cursor[DEF_SWATCH_CURSOR]); store.addObject(cursor[DEF_MOVE_CURSOR]); store.addObject(cursor[DEF_DRAGH_CURSOR]); store.addObject(cursor[DEF_DRAGV_CURSOR]); store.addObject(cursor[DEF_DRAGTL_CURSOR]); store.addObject(cursor[DEF_DRAGTR_CURSOR]); store.addObject(cursor[DEF_DNDSTOP_CURSOR]); store.addObject(cursor[DEF_DNDCOPY_CURSOR]); store.addObject(cursor[DEF_DNDMOVE_CURSOR]); store.addObject(cursor[DEF_DNDLINK_CURSOR]); store.addObject(cursor[DEF_CROSSHAIR_CURSOR]); store.addObject(cursor[DEF_CORNERNE_CURSOR]); store.addObject(cursor[DEF_CORNERNW_CURSOR]); store.addObject(cursor[DEF_CORNERSE_CURSOR]); store.addObject(cursor[DEF_CORNERSW_CURSOR]); store.addObject(cursor[DEF_HELP_CURSOR]); store.addObject(cursor[DEF_HAND_CURSOR]); store.addObject(cursor[DEF_ROTATE_CURSOR]); store.addObject(cursor[DEF_WAIT_CURSOR]); // FXTRACE((1,"FXApp::readWindow pos=%ld\n",store.position())); store >> window; // FXTRACE((1,"FXApp::readWindow pos=%ld\n",store.position())); window->parent=father; window->owner=owner; window->prev=father->last; window->next=NULL; if(father->last){ father->last->next=window; } else{ father->first=window; } father->last=window; return TRUE; } // Save to stream void FXApp::save(FXStream& store) const { FXObject::save(store); store << clickSpeed; store << animSpeed; store << scrollSpeed; store << blinkSpeed; store << menuPause; store << tooltipPause; store << tooltipTime; store << dragDelta; store << borderColor; store << baseColor; store << hiliteColor; store << shadowColor; store << backColor; store << foreColor; store << selforeColor; store << selbackColor; store << tipforeColor; store << tipbackColor; store << selMenuTextColor; store << selMenuBackColor; } // Load from stream void FXApp::load(FXStream& store){ FXObject::load(store); store >> clickSpeed; store >> animSpeed; store >> scrollSpeed; store >> blinkSpeed; store >> menuPause; store >> tooltipPause; store >> tooltipTime; store >> dragDelta; store >> borderColor; store >> baseColor; store >> hiliteColor; store >> shadowColor; store >> backColor; store >> foreColor; store >> selforeColor; store >> selbackColor; store >> tipforeColor; store >> tipbackColor; store >> selMenuTextColor; store >> selMenuBackColor; } // Change typing speed void FXApp::setTypingSpeed(FXuint speed){ typingSpeed=speed; registry.writeUnsignedEntry("SETTINGS","typingspeed",typingSpeed); } // Change double-click speed void FXApp::setClickSpeed(FXuint speed){ clickSpeed=speed; registry.writeUnsignedEntry("SETTINGS","clickspeed",clickSpeed); } // Change scroll speed void FXApp::setScrollSpeed(FXuint speed){ scrollSpeed=speed; registry.writeUnsignedEntry("SETTINGS","scrollspeed",scrollSpeed); } // Change scroll delay void FXApp::setScrollDelay(FXuint delay){ scrollDelay=delay; registry.writeUnsignedEntry("SETTINGS","scrolldelay",scrollDelay); } // Change cursor blink speed void FXApp::setBlinkSpeed(FXuint speed){ blinkSpeed=speed; registry.writeUnsignedEntry("SETTINGS","blinkspeed",blinkSpeed); } // Change animation speed void FXApp::setAnimSpeed(FXuint speed){ animSpeed=speed; registry.writeUnsignedEntry("SETTINGS","animspeed",animSpeed); } // Change menu popup delay void FXApp::setMenuPause(FXuint pause){ menuPause=pause; registry.writeUnsignedEntry("SETTINGS","menupause",menuPause); } // Change tooltip popup pause void FXApp::setTooltipPause(FXuint pause){ tooltipPause=pause; registry.writeUnsignedEntry("SETTINGS","tippause",tooltipPause); } // Change tooltip visibility time void FXApp::setTooltipTime(FXuint time){ tooltipTime=time; registry.writeUnsignedEntry("SETTINGS","tiptime",tooltipTime); } // Change drag delta void FXApp::setDragDelta(FXint delta){ dragDelta=delta; registry.writeIntEntry("SETTINGS","dragdelta",dragDelta); } // Change mouse wheel lines void FXApp::setWheelLines(FXint lines){ wheelLines=lines; registry.writeIntEntry("SETTINGS","wheellines",wheelLines); } // Change scroll bar size void FXApp::setScrollBarSize(FXint size){ scrollBarSize=size; registry.writeIntEntry("SETTINGS","scrollbarsize",scrollBarSize); } // Change border color void FXApp::setBorderColor(FXColor color){ borderColor=color; registry.writeColorEntry("SETTINGS","bordercolor",borderColor); } // Change base color void FXApp::setBaseColor(FXColor color){ baseColor=color; registry.writeColorEntry("SETTINGS","basecolor",baseColor); } // Change highlight color void FXApp::setHiliteColor(FXColor color){ hiliteColor=color; registry.writeColorEntry("SETTINGS","hilitecolor",hiliteColor); } // Change shadow color void FXApp::setShadowColor(FXColor color){ shadowColor=color; registry.writeColorEntry("SETTINGS","shadowcolor",shadowColor); } // Change background color void FXApp::setBackColor(FXColor color){ backColor=color; registry.writeColorEntry("SETTINGS","backcolor",backColor); } // Change foreground color void FXApp::setForeColor(FXColor color){ foreColor=color; registry.writeColorEntry("SETTINGS","forecolor",foreColor); } // Change selected foreground color void FXApp::setSelforeColor(FXColor color){ selforeColor=color; registry.writeColorEntry("SETTINGS","selforecolor",selforeColor); } // Change selected background color void FXApp::setSelbackColor(FXColor color){ selbackColor=color; registry.writeColorEntry("SETTINGS","selbackcolor",selbackColor); } // Change tip foreground color void FXApp::setTipforeColor(FXColor color){ tipforeColor=color; registry.writeColorEntry("SETTINGS","tipforecolor",tipforeColor); } // Change tip background color void FXApp::setTipbackColor(FXColor color){ tipbackColor=color; registry.writeColorEntry("SETTINGS","tipbackcolor",tipbackColor); } // Change selected menu text color void FXApp::setSelMenuTextColor(FXColor color){ selMenuTextColor=color; registry.writeColorEntry("SETTINGS","selmenutextcolor",selMenuTextColor); } // Change selected menu back color void FXApp::setSelMenuBackColor(FXColor color){ selMenuBackColor=color; registry.writeColorEntry("SETTINGS","selmenubackcolor",selMenuBackColor); } // Virtual destructor FXApp::~FXApp(){ register FXRepaint *r; register FXTimer *t; register FXChore *c; // Delete root window & its children delete root; // Delete visuals delete defaultVisual; delete monoVisual; // Delete stock font only delete stockFont; // Delete cursors delete cursor[DEF_ARROW_CURSOR]; delete cursor[DEF_RARROW_CURSOR]; delete cursor[DEF_TEXT_CURSOR]; delete cursor[DEF_HSPLIT_CURSOR]; delete cursor[DEF_VSPLIT_CURSOR]; delete cursor[DEF_XSPLIT_CURSOR]; delete cursor[DEF_SWATCH_CURSOR]; delete cursor[DEF_MOVE_CURSOR]; delete cursor[DEF_DRAGH_CURSOR]; delete cursor[DEF_DRAGV_CURSOR]; delete cursor[DEF_DRAGTR_CURSOR]; delete cursor[DEF_DRAGTL_CURSOR]; delete cursor[DEF_DNDSTOP_CURSOR]; delete cursor[DEF_DNDCOPY_CURSOR]; delete cursor[DEF_DNDMOVE_CURSOR]; delete cursor[DEF_DNDLINK_CURSOR]; delete cursor[DEF_CROSSHAIR_CURSOR]; delete cursor[DEF_CORNERNE_CURSOR]; delete cursor[DEF_CORNERNW_CURSOR]; delete cursor[DEF_CORNERSE_CURSOR]; delete cursor[DEF_CORNERSW_CURSOR]; delete cursor[DEF_HELP_CURSOR]; delete cursor[DEF_HAND_CURSOR]; delete cursor[DEF_ROTATE_CURSOR]; delete cursor[DEF_WAIT_CURSOR]; // Delete translator delete translator; // Free inputs FXFREE(&inputs); #ifndef WIN32 FXFREE(&r_fds); FXFREE(&w_fds); FXFREE(&e_fds); #else FXFREE(&handles); #endif // Free signals list FXFREE(&signals); nsignals=0; // Free left-over dde data FXFREE(&ddeData); ddeSize=0; // Free left-over selection type data #ifndef WIN32 FXFREE(&xselTypeList); FXFREE(&xcbTypeList); FXFREE(&xdndTypeList); FXFREE(&ddeTypeList); #else FXFREE(&xselTypeList); FXFREE(&ddeTypeList); #endif // Remove outstanding repaints while(repaints){ r=repaints; repaints=repaints->next; delete r; } // Free recycled repaint records while(repaintrecs){ r=repaintrecs; repaintrecs=repaintrecs->next; delete r; } // Kill outstanding timers while(timers){ t=timers; timers=timers->next; delete t; } // Free recycled timer records while(timerrecs){ t=timerrecs; timerrecs=timerrecs->next; delete t; } // Kill outstanding chores while(chores){ c=chores; chores=chores->next; delete c; } // Free recycled chore records while(chorerecs){ c=chorerecs; chorerecs=chorerecs->next; delete c; } // Close display closeDisplay(); // Thrash dangling pointers root=(FXRootWindow*)-1L; defaultVisual=(FXVisual*)-1L; monoVisual=(FXVisual*)-1L; normalFont=(FXFont*)-1L; stockFont=(FXFont*)-1L; waitCursor=(FXCursor*)-1L; // Zap cursors cursor[DEF_ARROW_CURSOR]=(FXCursor*)-1L; cursor[DEF_RARROW_CURSOR]=(FXCursor*)-1L; cursor[DEF_TEXT_CURSOR]=(FXCursor*)-1L; cursor[DEF_HSPLIT_CURSOR]=(FXCursor*)-1L; cursor[DEF_VSPLIT_CURSOR]=(FXCursor*)-1L; cursor[DEF_XSPLIT_CURSOR]=(FXCursor*)-1L; cursor[DEF_SWATCH_CURSOR]=(FXCursor*)-1L; cursor[DEF_MOVE_CURSOR]=(FXCursor*)-1L; cursor[DEF_DRAGH_CURSOR]=(FXCursor*)-1L; cursor[DEF_DRAGV_CURSOR]=(FXCursor*)-1L; cursor[DEF_DRAGTL_CURSOR]=(FXCursor*)-1L; cursor[DEF_DRAGTR_CURSOR]=(FXCursor*)-1L; cursor[DEF_DNDSTOP_CURSOR]=(FXCursor*)-1L; cursor[DEF_DNDCOPY_CURSOR]=(FXCursor*)-1L; cursor[DEF_DNDMOVE_CURSOR]=(FXCursor*)-1L; cursor[DEF_DNDLINK_CURSOR]=(FXCursor*)-1L; cursor[DEF_CROSSHAIR_CURSOR]=(FXCursor*)-1L; cursor[DEF_CORNERNE_CURSOR]=(FXCursor*)-1L; cursor[DEF_CORNERNW_CURSOR]=(FXCursor*)-1L; cursor[DEF_CORNERSE_CURSOR]=(FXCursor*)-1L; cursor[DEF_CORNERSW_CURSOR]=(FXCursor*)-1L; cursor[DEF_HELP_CURSOR]=(FXCursor*)-1L; cursor[DEF_HAND_CURSOR]=(FXCursor*)-1L; cursor[DEF_ROTATE_CURSOR]=(FXCursor*)-1L; cursor[DEF_WAIT_CURSOR]=(FXCursor*)-1L; // Do this last app=NULL; } } fox1.6-1.6.57/src/FXArrowButton.cpp000066400000000000000000000404531326741342000166620ustar00rootroot00000000000000/******************************************************************************** * * * A r r o w B u t t o n O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXArrowButton.cpp,v 1.50 2006/01/22 17:58:17 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXArrowButton.h" /* Notes: - Automatic mode works by simply hovering cursor over arrow button; it is used for scrolling menus. - Possible interactions between auto mode and manual pressing.. */ // Justification #define JUSTIFY_MASK (JUSTIFY_HZ_APART|JUSTIFY_VT_APART) // Arrow styles #define ARROW_MASK (ARROW_UP|ARROW_DOWN|ARROW_LEFT|ARROW_RIGHT|ARROW_AUTO|ARROW_REPEAT|ARROW_AUTOGRAY|ARROW_AUTOHIDE|ARROW_TOOLBAR) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXArrowButton) FXArrowButtonMap[]={ FXMAPFUNC(SEL_PAINT,0,FXArrowButton::onPaint), FXMAPFUNC(SEL_UPDATE,0,FXArrowButton::onUpdate), FXMAPFUNC(SEL_ENTER,0,FXArrowButton::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXArrowButton::onLeave), FXMAPFUNC(SEL_TIMEOUT,FXArrowButton::ID_AUTO,FXArrowButton::onAuto), FXMAPFUNC(SEL_TIMEOUT,FXArrowButton::ID_REPEAT,FXArrowButton::onRepeat), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXArrowButton::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXArrowButton::onLeftBtnRelease), FXMAPFUNC(SEL_QUERY_TIP,0,FXArrowButton::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXArrowButton::onQueryHelp), FXMAPFUNC(SEL_UNGRABBED,0,FXArrowButton::onUngrabbed), FXMAPFUNC(SEL_KEYPRESS,0,FXArrowButton::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXArrowButton::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXArrowButton::ID_HOTKEY,FXArrowButton::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXArrowButton::ID_HOTKEY,FXArrowButton::onHotKeyRelease), FXMAPFUNC(SEL_COMMAND,FXArrowButton::ID_SETHELPSTRING,FXArrowButton::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXArrowButton::ID_GETHELPSTRING,FXArrowButton::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXArrowButton::ID_SETTIPSTRING,FXArrowButton::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXArrowButton::ID_GETTIPSTRING,FXArrowButton::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXArrowButton,FXFrame,FXArrowButtonMap,ARRAYNUMBER(FXArrowButtonMap)) // For deserialization FXArrowButton::FXArrowButton(){ flags|=FLAG_ENABLED; arrowColor=0; arrowSize=9; state=FALSE; fired=FALSE; } // Make a text button FXArrowButton::FXArrowButton(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_ENABLED; target=tgt; message=sel; arrowColor=getApp()->getForeColor(); arrowSize=9; state=FALSE; fired=FALSE; } // Get default size FXint FXArrowButton::getDefaultWidth(){ return padleft+padright+arrowSize+(border<<1); } FXint FXArrowButton::getDefaultHeight(){ return padtop+padbottom+arrowSize+(border<<1); } // Enable the window void FXArrowButton::enable(){ if(!(flags&FLAG_ENABLED)){ FXFrame::enable(); update(); } } // Disable the window void FXArrowButton::disable(){ if(flags&FLAG_ENABLED){ FXFrame::disable(); update(); } } // Set button state void FXArrowButton::setState(FXbool s){ if(state!=s){ state=s; update(); } } // If window can have focus bool FXArrowButton::canFocus() const { return true; } // Implement auto-hide or auto-gray modes long FXArrowButton::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ if(!FXFrame::onUpdate(sender,sel,ptr)){ if(options&ARROW_AUTOHIDE){if(shown()){hide();recalc();}} if(options&ARROW_AUTOGRAY){disable();} } return 1; } // Press automatically long FXArrowButton::onAuto(FXObject*,FXSelector,void*){ setState(TRUE); getApp()->addTimeout(this,ID_REPEAT,getApp()->getScrollSpeed()); flags&=~FLAG_UPDATE; fired=FALSE; return 1; } // Entered button long FXArrowButton::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onEnter(sender,sel,ptr); if(isEnabled()){ if(flags&FLAG_PRESSED){ setState(TRUE); } else if(options&ARROW_AUTO){ if(options&ARROW_REPEAT) getApp()->addTimeout(this,ID_AUTO,getApp()->getScrollDelay()); } if(options&ARROW_TOOLBAR) update(); } return 1; } // Left button long FXArrowButton::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onLeave(sender,sel,ptr); if(isEnabled()){ if(flags&FLAG_PRESSED){ setState(FALSE); } else if(options&ARROW_AUTO){ setState(FALSE); if(options&ARROW_REPEAT) getApp()->removeTimeout(this,ID_AUTO); flags|=FLAG_UPDATE; fired=FALSE; } if(options&ARROW_TOOLBAR) update(); } return 1; } // Pressed mouse button long FXArrowButton::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; setState(TRUE); getApp()->removeTimeout(this,ID_AUTO); if(options&ARROW_REPEAT) getApp()->addTimeout(this,ID_REPEAT,getApp()->getScrollDelay()); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; fired=FALSE; return 1; } return 0; } // Released mouse button long FXArrowButton::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXbool click=(!fired && state); if(isEnabled() && (flags&FLAG_PRESSED)){ ungrab(); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; fired=FALSE; getApp()->removeTimeout(this,ID_REPEAT); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; setState(FALSE); if(click && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)1); return 1; } return 0; } // Lost the grab for some reason long FXArrowButton::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onUngrabbed(sender,sel,ptr); setState(FALSE); getApp()->removeTimeout(this,ID_REPEAT); flags&=~FLAG_PRESSED; flags|=FLAG_UPDATE; fired=FALSE; return 1; } // Repeat a click automatically long FXArrowButton::onRepeat(FXObject*,FXSelector,void*){ getApp()->addTimeout(this,ID_REPEAT,getApp()->getScrollSpeed()); if(state && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)1); fired=TRUE; return 1; } // Key Press long FXArrowButton::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ setState(TRUE); getApp()->removeTimeout(this,ID_AUTO); if(options&ARROW_REPEAT) getApp()->addTimeout(this,ID_REPEAT,getApp()->getScrollDelay()); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; fired=FALSE; return 1; } } return 0; } // Key Release long FXArrowButton::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXbool click=(!fired && state); if(isEnabled() && (flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ setState(FALSE); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; fired=FALSE; getApp()->removeTimeout(this,ID_REPEAT); if(click && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)1); return 1; } } return 0; } // Hot key combination pressed long FXArrowButton::onHotKeyPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled() && !(flags&FLAG_PRESSED)){ setState(TRUE); getApp()->removeTimeout(this,ID_AUTO); if(options&ARROW_REPEAT) getApp()->addTimeout(this,ID_REPEAT,getApp()->getScrollDelay()); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; fired=FALSE; } return 1; } // Hot key combination released long FXArrowButton::onHotKeyRelease(FXObject*,FXSelector,void*){ FXbool click=(!fired && state); if(isEnabled() && (flags&FLAG_PRESSED)){ setState(FALSE); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; fired=FALSE; getApp()->removeTimeout(this,ID_REPEAT); if(click && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)1); } return 1; } // Set help using a message long FXArrowButton::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXArrowButton::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXArrowButton::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXArrowButton::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXArrowButton::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXArrowButton::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Handle repaint long FXArrowButton::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXPoint points[3]; FXint xx,yy,ww,hh,q; // With borders if(options&(FRAME_RAISED|FRAME_SUNKEN)){ // Toolbar style if(options&ARROW_TOOLBAR){ // Enabled and cursor inside, and up if(isEnabled() && underCursor() && !state){ dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } // Enabled and cursor inside and down else if(isEnabled() && state){ dc.setForeground(hiliteColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height); else drawSunkenRectangle(dc,0,0,width,height); } // Disabled or unchecked or not under cursor else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } } // Normal style else{ // Draw sunken if enabled and pressed if(isEnabled() && state){ dc.setForeground(hiliteColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height); else drawSunkenRectangle(dc,0,0,width,height); } // Draw in up state if disabled or up else{ dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } } } // No borders else{ if(isEnabled() && state){ dc.setForeground(hiliteColor); dc.fillRectangle(0,0,width,height); } else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } } // Compute size of the arrows.... ww=width-padleft-padright-(border<<1); hh=height-padtop-padbottom-(border<<1); if(options&(ARROW_UP|ARROW_DOWN)){ q=ww|1; if(q>(hh<<1)) q=(hh<<1)-1; ww=q; hh=q>>1; } else{ q=hh|1; if(q>(ww<<1)) q=(ww<<1)-1; ww=q>>1; hh=q; } if(options&JUSTIFY_LEFT) xx=padleft+border; else if(options&JUSTIFY_RIGHT) xx=width-ww-padright-border; else xx=(width-ww)/2; if(options&JUSTIFY_TOP) yy=padtop+border; else if(options&JUSTIFY_BOTTOM) yy=height-hh-padbottom-border; else yy=(height-hh)/2; if(state){ ++xx; ++yy; } if(isEnabled()) dc.setForeground(arrowColor); else dc.setForeground(shadowColor); // NB Size of arrow should stretch if(options&ARROW_UP){ points[0].x=xx+(ww>>1); points[0].y=yy-1; points[1].x=xx; points[1].y=yy+hh; points[2].x=xx+ww; points[2].y=yy+hh; dc.fillPolygon(points,3); } else if(options&ARROW_DOWN){ points[0].x=xx+1; points[0].y=yy; points[1].x=xx+ww-1; points[1].y=yy; points[2].x=xx+(ww>>1); points[2].y=yy+hh; dc.fillPolygon(points,3); } else if(options&ARROW_LEFT){ points[0].x=xx+ww; points[0].y=yy; points[1].x=xx+ww; points[1].y=yy+hh-1; points[2].x=xx; points[2].y=yy+(hh>>1); dc.fillPolygon(points,3); } else if(options&ARROW_RIGHT){ points[0].x=xx; points[0].y=yy; points[1].x=xx; points[1].y=yy+hh-1; points[2].x=xx+ww; points[2].y=yy+(hh>>1); dc.fillPolygon(points,3); } return 1; } // Set arrow style void FXArrowButton::setArrowStyle(FXuint style){ FXuint opts=(options&~ARROW_MASK) | (style&ARROW_MASK); if(options!=opts){ options=opts; update(); } } // Get arrow style FXuint FXArrowButton::getArrowStyle() const { return (options&ARROW_MASK); } // Set default arrow size void FXArrowButton::setArrowSize(FXint size){ if(size!=arrowSize){ arrowSize=size; recalc(); } } // Set text color void FXArrowButton::setArrowColor(FXColor clr){ if(clr!=arrowColor){ arrowColor=clr; update(); } } // Set text justify style void FXArrowButton::setJustify(FXuint style){ FXuint opts=(options&~JUSTIFY_MASK) | (style&JUSTIFY_MASK); if(options!=opts){ options=opts; update(); } } // Get text justify style FXuint FXArrowButton::getJustify() const { return (options&JUSTIFY_MASK); } // Save object to stream void FXArrowButton::save(FXStream& store) const { FXFrame::save(store); store << arrowColor; store << arrowSize; } // Load object from stream void FXArrowButton::load(FXStream& store){ FXFrame::load(store); store >> arrowColor; store >> arrowSize; } // Kill the timer FXArrowButton::~FXArrowButton(){ getApp()->removeTimeout(this,ID_AUTO); getApp()->removeTimeout(this,ID_REPEAT); } } fox1.6-1.6.57/src/FXBMPIcon.cpp000066400000000000000000000070351326741342000156220ustar00rootroot00000000000000/******************************************************************************** * * * B M P I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBMPIcon.cpp,v 1.36 2006/01/22 17:58:17 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObject.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXIcon.h" #include "FXBMPIcon.h" /* Notes: - BMP does not support alpha in the file format. - You can also let the system guess a transparancy color based on the corners. - If that doesn't work, you can force a specific transparency color. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXBMPIcon::fileExt[]="bmp"; // Suggested mime type const FXchar FXBMPIcon::mimeType[]="image/x-bmp"; // Object implementation FXIMPLEMENT(FXBMPIcon,FXIcon,NULL,0) // Initialize nicely FXBMPIcon::FXBMPIcon(FXApp* a,const void *pix,FXColor clr,FXuint opts,FXint w,FXint h):FXIcon(a,NULL,clr,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save object to stream bool FXBMPIcon::savePixels(FXStream& store) const { if(fxsaveBMP(store,data,width,height)){ return true; } return false; } // Load object from stream bool FXBMPIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadBMP(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXBMPIcon::~FXBMPIcon(){ } } fox1.6-1.6.57/src/FXBMPImage.cpp000066400000000000000000000064011326741342000157500ustar00rootroot00000000000000/******************************************************************************** * * * B M P I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBMPImage.cpp,v 1.35 2006/01/22 17:58:18 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXBMPImage.h" /* Notes: - Only free image if owned! */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXBMPImage::fileExt[]="bmp"; // Suggested mime type const FXchar FXBMPImage::mimeType[]="image/x-bmp"; // Object implementation FXIMPLEMENT(FXBMPImage,FXImage,NULL,0) // Initialize FXBMPImage::FXBMPImage(FXApp* a,const void *pix,FXuint opts,FXint w,FXint h):FXImage(a,NULL,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save pixel data only bool FXBMPImage::savePixels(FXStream& store) const { if(fxsaveBMP(store,data,width,height)){ return true; } return false; } // Load pixel data only bool FXBMPImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadBMP(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXBMPImage::~FXBMPImage(){ } } fox1.6-1.6.57/src/FXBZFileStream.cpp000066400000000000000000000142351326741342000166620ustar00rootroot00000000000000/******************************************************************************** * * * B Z F i l e S t r e a m C l a s s e s * * * ********************************************************************************* * Copyright (C) 1999,2006 by Lyle Johnson. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBZFileStream.cpp,v 1.5.2.2 2007/09/28 16:42:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXObject.h" #include "FXFile.h" #include "FXBZFileStream.h" #ifdef HAVE_BZ2LIB_H #include /* Notes: - Very basic compressed file I/O only. - Updated for new stream classes 2003/07/08. - Updated for use with FXFile 2005/09/03. */ #define BLOCKSIZE100K 1 // Block size x 100,000 bytes #define VERBOSITY 0 // For tracing in bzip library #define WORKFACTOR 0 // See bzip2 documentation #define BUFFERSIZE 8192 // Size of the buffer /*******************************************************************************/ namespace FX { // Used during compression struct BZBlock { bz_stream stream; char buffer[BUFFERSIZE]; }; // Initialize file stream FXBZFileStream::FXBZFileStream(const FXObject* cont):FXFileStream(cont),bz(NULL),ac(0){ } // Save to a file FXuval FXBZFileStream::writeBuffer(FXuval){ register FXival m,n; int bzerror; if(dir!=FXStreamSave){fxerror("FXBZFileStream::writeBuffer: wrong stream direction.\n");} FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); while(rdptrstream.next_in=(char*)rdptr; bz->stream.avail_in=wrptr-rdptr; bz->stream.next_out=bz->buffer; bz->stream.avail_out=BUFFERSIZE; bzerror=BZ2_bzCompress(&bz->stream,ac); // if(bzerror!=BZ_OK) break; if(bzerror<0) break; // break on error condition m=bz->stream.next_out-bz->buffer; n=file.writeBlock(bz->buffer,m); if(nstream.next_in; if(bzerror==BZ_STREAM_END) break; // break from FINISH if(ac==BZ_FLUSH && bzerror==BZ_RUN_OK) break; // break from FLUSH } if(rdptrbuffer,BUFFERSIZE); // if(n<=0) break; // bz->stream.next_in=bz->buffer; // bz->stream.avail_in=n; if(bz->stream.avail_in<=0){ // get more input if buffer is empty n=file.readBlock(bz->buffer,BUFFERSIZE); if(n<0) break; bz->stream.next_in=bz->buffer; bz->stream.avail_in=n; } bz->stream.next_out=(char*)wrptr; bz->stream.avail_out=endptr-wrptr; bzerror=BZ2_bzDecompress(&bz->stream); // if(bzerror!=BZ_OK) break; if(bzerror<0) break; // break on error condition wrptr=(FXuchar*)bz->stream.next_out; if(bzerror==BZ_STREAM_END) break; } return wrptr-rdptr; } // Try open file stream bool FXBZFileStream::open(const FXString& filename,FXStreamDirection save_or_load,FXuval size){ if(FXFileStream::open(filename,save_or_load,size)){ if(FXCALLOC(&bz,BZBlock,1)){ int bzerror; bz->stream.next_in=NULL; bz->stream.avail_in=0; bz->stream.next_out=NULL; bz->stream.avail_out=0; ac=BZ_RUN; if(save_or_load==FXStreamLoad){ bzerror=BZ2_bzDecompressInit(&bz->stream,VERBOSITY,0); if(bzerror==BZ_OK) return true; code=FXStreamNoRead; } else{ bzerror=BZ2_bzCompressInit(&bz->stream,BLOCKSIZE100K,VERBOSITY,WORKFACTOR); if(bzerror==BZ_OK) return true; code=FXStreamNoWrite; } FXFREE(&bz); } FXFileStream::close(); } return false; } // Flush buffer bool FXBZFileStream::flush(){ bool status; int action=ac; if(ac!=BZ_FINISH) ac=BZ_FLUSH; status=FXStream::flush(); ac=action; return status; } // Close file stream bool FXBZFileStream::close(){ if(dir){ if(dir==FXStreamLoad){ FXFileStream::close(); BZ2_bzDecompressEnd(&bz->stream); } else{ ac=BZ_FINISH; FXFileStream::close(); BZ2_bzCompressEnd(&bz->stream); } FXFREE(&bz); return true; } return false; } // Destructor FXBZFileStream::~FXBZFileStream(){ close(); } } #endif fox1.6-1.6.57/src/FXBitmap.cpp000066400000000000000000000620701326741342000156070ustar00rootroot00000000000000/******************************************************************************** * * * B i t m a p O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBitmap.cpp,v 1.89.2.1 2006/08/01 18:04:26 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXVisual.h" #include "FXBitmap.h" #include "FXVisual.h" #include "FXDCWindow.h" #include "FXException.h" /* Note: - Try eliminate temp copy:- slap pixels into XImage directly, if possible... - Perhaps enforce system-native padding necessary for the above. - Our bitmap data is 01234567, i.e. LS-BIT first; byte order ditto. - Issue: should FXBitmap return the DC for drawing onto the X-Server resident pixmap, or the client-side image bits? My idea is it should be the latter: - Allows even richer set of drawing primitives, as everything is drawn in software. - Very useful to generate off-screen renderings, e.g. during printing. - Allows for building and running true-color drawing programs on low-end graphics hardware. - The only drawback I can see is it will be a fairly large implementation effort... - The scale, mirror, rotate and crop API's have been contributed by Marc Cartright, . - The XBM format maps 1 to black instead of white; perhaps this should be reversed. */ #define DISPLAY(app) ((Display*)((app)->display)) // Changable bitmap options #define BITMAP_MASK (BITMAP_KEEP|BITMAP_SHMI|BITMAP_SHMP) using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXBitmap,FXDrawable,NULL,0) // For deserialization FXBitmap::FXBitmap(){ data=NULL; bytewidth=0; options=0; } // Initialize FXBitmap::FXBitmap(FXApp* a,const void *pix,FXuint opts,FXint w,FXint h):FXDrawable(a,w,h){ FXTRACE((100,"FXBitmap::FXBitmap %p\n",this)); FXASSERT((opts&~(BITMAP_OWNED|BITMAP_MASK))==0); visual=getApp()->getMonoVisual(); data=(FXuchar*)pix; bytewidth=(width+7)>>3; options=opts; if(!data && (options&BITMAP_OWNED)){ if(!FXCALLOC(&data,FXuchar,height*bytewidth)){ throw FXMemoryException("unable to construct bitmap"); } } } // Create bitmap void FXBitmap::create(){ if(!xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::create %p\n",getClassName(),this)); #ifndef WIN32 // Initialize visual visual->create(); // Make pixmap xid=XCreatePixmap(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),FXMAX(width,1),FXMAX(height,1),1); #else // Initialize visual visual->create(); // Create uninitialized shape bitmap xid=CreateBitmap(FXMAX(width,1),FXMAX(height,1),1,1,NULL); #endif // Were we successful? if(!xid){ throw FXImageException("unable to create bitmap"); } // Render pixels render(); // If we're not keeping the pixel buffer, release it if(!(options&BITMAP_KEEP)) release(); } } } // Release the client-side buffer, free it if it was owned. void FXBitmap::release(){ if(options&BITMAP_OWNED){ options&=~BITMAP_OWNED; FXFREE(&data); } data=NULL; } // Detach bitmap void FXBitmap::detach(){ visual->detach(); if(xid){ FXTRACE((100,"%s::detach %p\n",getClassName(),this)); xid=0; } } // Destroy bitmap void FXBitmap::destroy(){ if(xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::destroy %p\n",getClassName(),this)); #ifndef WIN32 // Delete pixmap XFreePixmap(DISPLAY(getApp()),xid); #else // Delete bitmap DeleteObject(xid); #endif } xid=0; } } #ifndef WIN32 // Find shift amount static inline FXuint findshift(unsigned long mask){ register FXuint sh=0; while(!(mask&(1<width)); FXTRACE((150,"bm height = %d\n",xim->height)); FXTRACE((150,"bm format = %s\n",xim->format==XYBitmap?"XYBitmap":xim->format==XYPixmap?"XYPixmap":"ZPixmap")); FXTRACE((150,"bm byte_order = %s\n",(xim->byte_order==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150,"bm bitmap_unit = %d\n",xim->bitmap_unit)); FXTRACE((150,"bm bitmap_bit_order = %s\n",(xim->bitmap_bit_order==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150,"bm bitmap_pad = %d\n",xim->bitmap_pad)); FXTRACE((150,"bm bitmap_unit = %d\n",xim->bitmap_unit)); FXTRACE((150,"bm depth = %d\n",xim->depth)); FXTRACE((150,"bm bytes_per_line = %d\n",xim->bytes_per_line)); FXTRACE((150,"bm bits_per_pixel = %d\n",xim->bits_per_pixel)); // Grab pixels from image for(y=0; y>3)]|=1<<(x&7); } } // Destroy image XDestroyImage(xim); } } } // Render into pixmap void FXBitmap::render(){ if(xid){ register XImage *xim=NULL; register Visual *vis; register int size; register FXuchar *pix; register int i; XGCValues values; GC gc; FXTRACE((100,"%s::render bitmap %p\n",getClassName(),this)); // Fill with pixels if there is data if(data && 0visual; xim=XCreateImage(DISPLAY(getApp()),vis,1,XYBitmap,0,NULL,width,height,8,(width+7)>>3); if(!xim){ throw FXImageException("unable to render bitmap"); } // Try create temp pixel store if(!FXMALLOC(&xim->data,char,xim->bytes_per_line*height)){ throw FXMemoryException("unable to render bitmap"); } FXTRACE((150,"bm width = %d\n",xim->width)); FXTRACE((150,"bm height = %d\n",xim->height)); FXTRACE((150,"bm format = %s\n",xim->format==XYBitmap?"XYBitmap":xim->format==XYPixmap?"XYPixmap":"ZPixmap")); FXTRACE((150,"bm byte_order = %s\n",(xim->byte_order==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150,"bm bitmap_unit = %d\n",xim->bitmap_unit)); FXTRACE((150,"bm bitmap_bit_order = %s\n",(xim->bitmap_bit_order==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150,"bm bitmap_pad = %d\n",xim->bitmap_pad)); FXTRACE((150,"bm bitmap_unit = %d\n",xim->bitmap_unit)); FXTRACE((150,"bm depth = %d\n",xim->depth)); FXTRACE((150,"bm bytes_per_line = %d\n",xim->bytes_per_line)); FXTRACE((150,"bm bits_per_pixel = %d\n",xim->bits_per_pixel)); // Render bits into server-formatted bitmap size=xim->bytes_per_line*height; pix=(FXuchar*)xim->data; // Most significant bit first if(xim->bitmap_bit_order==MSBFirst){ for(i=0; idata); XDestroyImage(xim); XFreeGC(DISPLAY(getApp()),gc); } } } #else struct BITMAPINFO256 { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[256]; }; // Restore client-side pixel buffer from bitmap void FXBitmap::restore(){ if(xid){ register FXint x,y,bytes_per_line; register FXuchar *p,*q; FXuchar *pixels; FXTRACE((100,"%s::restore image %p\n",getClassName(),this)); // Check for legal size if(width<1 || height<1){ fxerror("%s::restore: illegal image size %dx%d.\n",getClassName(),width,height); } // Make array for data if needed if(!data){ if(!FXCALLOC(&data,FXuchar,height*bytewidth)){ throw FXMemoryException("unable to restore image"); } options|=BITMAP_OWNED; } // Got local buffer to receive into if(data){ // Bytes per line, rounded to nearest DWORD bytes_per_line=((width+31)&~31)>>3; // Set up the bitmap info BITMAPINFO256 bmi; bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth=width; bmi.bmiHeader.biHeight=-height; // Negative heights means upside down! bmi.bmiHeader.biPlanes=1; bmi.bmiHeader.biBitCount=1; bmi.bmiHeader.biCompression=BI_RGB; bmi.bmiHeader.biSizeImage=0; bmi.bmiHeader.biXPelsPerMeter=0; bmi.bmiHeader.biYPelsPerMeter=0; bmi.bmiHeader.biClrUsed=0; bmi.bmiHeader.biClrImportant=0; bmi.bmiColors[0].rgbBlue=0; bmi.bmiColors[0].rgbGreen=0; bmi.bmiColors[0].rgbRed=0; bmi.bmiColors[0].rgbReserved=0; bmi.bmiColors[1].rgbBlue=255; bmi.bmiColors[1].rgbGreen=255; bmi.bmiColors[1].rgbRed=255; bmi.bmiColors[1].rgbReserved=0; // DIB format pads to multiples of 4 bytes... if(!FXMALLOC(&pixels,FXuchar,height*bytes_per_line)){ throw FXImageException("unable to restore image"); } // Make device context HDC hdcmem=::CreateCompatibleDC(NULL); if(!GetDIBits(hdcmem,(HBITMAP)xid,0,height,pixels,(BITMAPINFO*)&bmi,DIB_RGB_COLORS)){ throw FXImageException("unable to restore image"); } // Fill our own data from pixels for(y=0,p=pixels,q=data; y>3; // Set up the bitmap info BITMAPINFO256 bmi; bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth=width; bmi.bmiHeader.biHeight=-height; // Negative heights means upside down! bmi.bmiHeader.biPlanes=1; bmi.bmiHeader.biBitCount=1; bmi.bmiHeader.biCompression=0; bmi.bmiHeader.biSizeImage=0; bmi.bmiHeader.biXPelsPerMeter=0; bmi.bmiHeader.biYPelsPerMeter=0; bmi.bmiHeader.biClrUsed=0; bmi.bmiHeader.biClrImportant=0; bmi.bmiColors[0].rgbBlue=0; bmi.bmiColors[0].rgbGreen=0; bmi.bmiColors[0].rgbRed=0; bmi.bmiColors[0].rgbReserved=0; bmi.bmiColors[1].rgbBlue=255; bmi.bmiColors[1].rgbGreen=255; bmi.bmiColors[1].rgbRed=255; bmi.bmiColors[1].rgbReserved=0; // Fill temp array if(!FXCALLOC(&pixels,FXuchar,height*bytes_per_line)){ throw FXMemoryException("unable to render bitmap"); } // Fill pixels from our own data for(y=0,p=pixels,q=data; y>3; if(xid){ #ifndef WIN32 // Free old pixmap XFreePixmap(DISPLAY(getApp()),xid); // Make new pixmap xid=XCreatePixmap(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),w,h,1); if(!xid){ throw FXImageException("unable to resize bitmap"); } #else // Delete old bitmap DeleteObject(xid); // Create a bitmap compatible with current display xid=CreateBitmap(w,h,1,1,NULL); if(!xid){ throw FXImageException("unable to resize bitmap"); } #endif } // Resize data array; only do the work if the new // array is a different size as measured in bytes! if(data){ if(!(options&BITMAP_OWNED)){ // Need to own array if(!FXMALLOC(&data,FXColor,h*bw)){ throw FXMemoryException("unable to resize bitmap"); } options|=BITMAP_OWNED; } else if(h*bw!=height*bytewidth){ if(!FXRESIZE(&data,FXColor,h*bw)){ throw FXMemoryException("unable to resize bitmap"); } } } // Remember new size bytewidth=bw; width=w; height=h; } // Fill bitmap with uniform value void FXBitmap::fill(FXbool color){ if(data){ memset(data,-color,height*bytewidth); } } // Rescale pixels to the specified width and height; just nearest // neighbor; there ain't no such thing as anti-aliasing in bitmaps! void FXBitmap::scale(FXint w,FXint h){ if(w<1) w=1; if(h<1) h=1; FXTRACE((100,"%s::scale(%d,%d)\n",getClassName(),w,h)); if(w!=width || h!=height){ if(data){ register FXuchar *q,*p,bits; register FXint xs=(width<<16)/w; register FXint ys=(height<<16)/h; register FXint bw=bytewidth; register FXint i,j,x,y,xx; FXuchar *interim; // Copy to old buffer if(!FXMEMDUP(&interim,data,FXuchar,height*bytewidth)){ throw FXMemoryException("unable to scale bitmap"); } // Resize the pixmap and target buffer resize(w,h); // Scale the bitmap i=0; y=ys>>1; p=data; do{ j=0; x=xs>>1; q=interim+(y>>16)*bw; bits=0; do{ xx=x>>16; bits|=((q[xx>>3]>>(xx&7))&1)<<(j&7); if((j&7)==7){ *p++=bits; bits=0; } x+=xs; } while(++j1){ // Mirror vertically paa=data; pbb=data+bytewidth*(height-1); do{ pa=paa; paa+=bytewidth; pb=pbb; pbb-=bytewidth; do{ t=*pa; *pa++=*pb; *pb++=t; } while(pa1){ // Mirror horizontally paa=data; pbb=data+bytewidth*height; do{ pa=paa; pb=line+bytewidth; do{ *--pb=*paa++; // Gnarly! } while(line> sb; *pa++=FXBITREVERSE(t); } while(pa1 && height>1){ if(data){ register FXuchar *p,*q,bits; register FXint bw=bytewidth; register FXint i,j,x; FXuchar *olddata; if(!FXMEMDUP(&olddata,data,FXuchar,bytewidth*height)){ throw FXMemoryException("unable to rotate bitmap"); } switch(degrees){ case 90: resize(height,width); i=height-1; p=data; do{ j=0; q=olddata+(i>>3); bits=0; do{ bits|=((q[0]>>(i&7))&1)<<(j&7); if((j&7)==7){ *p++=bits; bits=0; } q+=bw; } while(++j=0); break; case 180: // FIXME works but not as fast as it could be i=height-1; p=data; q=olddata+(height-1)*bw; do{ j=0; bits=0; x=width-1; do{ bits|=((q[x>>3]>>(x&7))&1)<<(j&7); if((j&7)==7){ *p++=bits; bits=0; } x--; } while(++j=0); break; case 270: resize(height,width); i=0; p=data; do{ j=0; q=olddata+(i>>3)+(width-1)*bw; bits=0; do{ bits|=((q[0]>>(i&7))&1)<<(j&7); if((j&7)==7){ *p++=bits; bits=0; } q-=bw; } while(++j=width || y>=height || x+w<=0 || y+h<=0){ fxerror("%s::crop: bad arguments.\n",getClassName()); } FXTRACE((100,"%s::crop(%d,%d,%d,%d)\n",getClassName(),x,y,w,h)); if(data){ register FXuchar *pnn,*poo,*yyy,*pn,*po,*xx; register FXint oldbw=bytewidth; register FXint newbw=(w+7)>>3; register FXint cpybw; register FXint ow=width; register FXint oh=height; register FXint nw=w; register FXint nh=h; register FXint cw; register FXint ch; register FXint sh; register FXuint t; FXuchar *olddata; if(!FXMALLOC(&olddata,FXuchar,oh*bytewidth+1)){ throw FXMemoryException("unable to crop bitmap"); } memcpy(olddata,data,oh*bytewidth); resize(w,h); pnn=data; yyy=data+newbw*nh; do{ *pnn++=-color; // 1 -> 0xff, 0 -> 0xff } while(pnn= 0 pnn=data; poo=olddata+oldbw*y; ch=FXMIN(oh,y+nh)-y; } pnn+=(-x)>>3; sh=8-((-x)&7); FXASSERT(cw>0); FXASSERT(ch>0); yyy=pnn+newbw*ch; cpybw=((cw-x+7)>>3)-((-x)>>3); //FXTRACE((100,"ow=%d oh=%d nw=%d nh=%d cw=%d ch=%d sh=%d cpybw=%d\n",ow,oh,nw,nh,cw,ch,sh,cpybw)); do{ pn=pnn; po=poo; xx=pnn+cpybw; t=(-color)&0xff; do{ t|=(*po++)<<8; *pn++=t>>sh; t>>=8; } while(pn= 0 cw=FXMIN(ow,x+nw)-x; if(y<0){ // y < 0 pnn=data-newbw*y; poo=olddata; ch=FXMIN(oh,y+nh); } else{ // y >= 0 pnn=data; poo=olddata+oldbw*y; ch=FXMIN(oh,y+nh)-y; } poo+=x>>3; sh=x&7; FXASSERT(cw>0); FXASSERT(ch>0); yyy=pnn+newbw*ch; cpybw=(cw+7)>>3; do{ pn=pnn; po=poo; xx=pnn+cpybw; do{ t=*po++; t|=*po<<8; *pn++=t>>sh; } while(pn> options; store >> haspixels; if(haspixels) loadPixels(store); } // Clean up FXBitmap::~FXBitmap(){ FXTRACE((100,"FXBitmap::~FXBitmap %p\n",this)); destroy(); if(options&BITMAP_OWNED){FXFREE(&data);} data=(FXuchar*)-1L; } } fox1.6-1.6.57/src/FXBitmapFrame.cpp000066400000000000000000000132011326741342000165520ustar00rootroot00000000000000/******************************************************************************** * * * I m a g e F r a m e W i d g e t * * * ********************************************************************************* * Copyright (C) 2001,2006 by H. J. Daniel III. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBitmapFrame.cpp,v 1.9 2006/01/22 17:58:18 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXBitmap.h" #include "FXBitmapFrame.h" /* Notes: - Hacked around so as to support padding also. - Fixed layout to center image if frame is larger. - Fixed serialization also. - Now supports various justification modes */ #define JUSTIFY_MASK (JUSTIFY_HZ_APART|JUSTIFY_VT_APART) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXBitmapFrame) FXBitmapFrameMap[]={ FXMAPFUNC(SEL_PAINT,0,FXBitmapFrame::onPaint), }; // Object implementation FXIMPLEMENT(FXBitmapFrame,FXFrame,FXBitmapFrameMap,ARRAYNUMBER(FXBitmapFrameMap)) // Deserialization FXBitmapFrame::FXBitmapFrame(){ bitmap=NULL; onColor=0; offColor=0; } // Construct it FXBitmapFrame::FXBitmapFrame(FXComposite* p,FXBitmap *bmp,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ bitmap=bmp; onColor=FXRGB(0,0,0); offColor=backColor; } // Create it all void FXBitmapFrame::create(){ FXFrame::create(); if(bitmap) bitmap->create(); } // Get default width FXint FXBitmapFrame::getDefaultWidth(){ register FXint w=0; if(bitmap) w=bitmap->getWidth(); return w+padleft+padright+(border<<1); } // Get default height FXint FXBitmapFrame::getDefaultHeight(){ register FXint h=0; if(bitmap) h=bitmap->getHeight(); return h+padtop+padbottom+(border<<1); } // Draw the image long FXBitmapFrame::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXint imgx,imgy,imgw,imgh; dc.setForeground(backColor); if(bitmap){ imgw=bitmap->getWidth(); imgh=bitmap->getHeight(); if(options&JUSTIFY_LEFT) imgx=padleft+border; else if(options&JUSTIFY_RIGHT) imgx=width-padright-border-imgw; else imgx=border+padleft+(width-padleft-padright-(border<<1)-imgw)/2; if(options&JUSTIFY_TOP) imgy=padtop+border; else if(options&JUSTIFY_BOTTOM) imgy=height-padbottom-border-imgh; else imgy=border+padtop+(height-padbottom-padtop-(border<<1)-imgh)/2; dc.fillRectangle(border,border,imgx-border,height-(border<<1)); dc.fillRectangle(imgx+imgw,border,width-border-imgx-imgw,height-(border<<1)); dc.fillRectangle(imgx,border,imgw,imgy-border); dc.fillRectangle(imgx,imgy+imgh,imgw,height-border-imgy-imgh); dc.setForeground(onColor); dc.setBackground(offColor); dc.drawBitmap(bitmap,imgx,imgy); } else{ dc.fillRectangle(border,border,width-(border<<1),height-(border<<1)); } drawFrame(dc,0,0,width,height); return 1; } // Change image void FXBitmapFrame::setBitmap(FXBitmap* bmp){ bitmap=bmp; recalc(); update(); } // Set on color void FXBitmapFrame::setOnColor(FXColor clr){ if(clr!=onColor){ onColor=clr; update(); } } // Set off color void FXBitmapFrame::setOffColor(FXColor clr){ if(clr!=offColor){ offColor=clr; update(); } } // Set text justify style void FXBitmapFrame::setJustify(FXuint style){ FXuint opts=(options&~JUSTIFY_MASK) | (style&JUSTIFY_MASK); if(options!=opts){ options=opts; update(); } } // Get text justify style FXuint FXBitmapFrame::getJustify() const { return (options&JUSTIFY_MASK); } // Save data void FXBitmapFrame::save(FXStream& store) const { FXFrame::save(store); store << bitmap; } // Load data void FXBitmapFrame::load(FXStream& store){ FXFrame::load(store); store >> bitmap; } // Destructor FXBitmapFrame::~FXBitmapFrame(){ bitmap=(FXBitmap*)-1L; } } fox1.6-1.6.57/src/FXBitmapView.cpp000066400000000000000000000167251326741342000164500ustar00rootroot00000000000000/******************************************************************************** * * * B i t m a p V i e w W i d g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXBitmapView.cpp,v 1.16 2006/01/22 17:58:18 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXThread.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXBitmap.h" #include "FXIcon.h" #include "FXComposite.h" #include "FXCanvas.h" #include "FXButton.h" #include "FXScrollBar.h" #include "FXBitmapView.h" /* Notes: - Should implement DND drags/drops, cut/paste - Right-mouse scroll. */ #define MOUSE_NONE 0 // None in effect #define MOUSE_SCROLL 1 // Scrolling mode using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXBitmapView) FXBitmapViewMap[]={ FXMAPFUNC(SEL_PAINT,0,FXBitmapView::onPaint), FXMAPFUNC(SEL_MOTION,0,FXBitmapView::onMotion), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXBitmapView::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXBitmapView::onRightBtnRelease), }; // Object implementation FXIMPLEMENT(FXBitmapView,FXScrollArea,FXBitmapViewMap,ARRAYNUMBER(FXBitmapViewMap)) // Deserialization FXBitmapView::FXBitmapView(){ flags|=FLAG_ENABLED; bitmap=NULL; onColor=0; offColor=0; grabx=0; graby=0; } // Construct and init FXBitmapView::FXBitmapView(FXComposite* p,FXBitmap* bmp,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXScrollArea(p,opts,x,y,w,h){ flags|=FLAG_ENABLED; target=tgt; message=sel; bitmap=bmp; onColor=FXRGB(0,0,0); offColor=backColor; grabx=0; graby=0; } // Create window void FXBitmapView::create(){ FXScrollArea::create(); if(bitmap) bitmap->create(); } // Detach window void FXBitmapView::detach(){ FXScrollArea::detach(); if(bitmap) bitmap->detach(); } // Can have focus bool FXBitmapView::canFocus() const { return true; } // Determine content width of scroll area FXint FXBitmapView::getContentWidth(){ return bitmap ? bitmap->getWidth() : 1; } // Determine content height of scroll area FXint FXBitmapView::getContentHeight(){ return bitmap ? bitmap->getHeight() : 1; } // Recalculate layout void FXBitmapView::layout(){ // Layout scroll bars and viewport FXScrollArea::layout(); update(); flags&=~FLAG_DIRTY; } // Draw visible part of bitmap long FXBitmapView::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXDCWindow dc(this,event); FXint xx,yy,ww,hh; FXint xl,xr,yt,yb; if(bitmap){ ww=bitmap->getWidth(); hh=bitmap->getHeight(); xx=pos_x; yy=pos_y; if(wwviewport_w) xr=viewport_w; if(yt<0) yt=0; if(yb>viewport_h) yb=viewport_h; dc.fillRectangle(0,0,xr,yt); dc.fillRectangle(0,yt,xl,viewport_h-yt); dc.fillRectangle(xr,0,viewport_w-xr,yb); dc.fillRectangle(xl,yb,viewport_w-xl,viewport_h-yb); } else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } return 1; } // Pressed right button long FXBitmapView::onRightBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; flags|=FLAG_PRESSED|FLAG_SCROLLING; grabx=ev->win_x-pos_x; graby=ev->win_y-pos_y; return 1; } return 0; } // Released right button long FXBitmapView::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); flags&=~(FLAG_PRESSED|FLAG_SCROLLING); flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // Handle real or simulated mouse motion long FXBitmapView::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; if(flags&FLAG_SCROLLING){ setPosition(ev->win_x-grabx,ev->win_y-graby); return 1; } return 0; } // Change bitmap void FXBitmapView::setBitmap(FXBitmap* bmp){ bitmap=bmp; recalc(); update(); } // Set on color void FXBitmapView::setOnColor(FXColor clr){ if(clr!=onColor){ onColor=clr; update(); } } // Set off color void FXBitmapView::setOffColor(FXColor clr){ if(clr!=offColor){ offColor=clr; update(); } } // Set the current alignment. void FXBitmapView::setAlignment(FXuint mode){ FXuint opts=(options&~(BITMAPVIEW_LEFT|BITMAPVIEW_RIGHT|BITMAPVIEW_TOP|BITMAPVIEW_BOTTOM)) | (mode&(BITMAPVIEW_LEFT|BITMAPVIEW_RIGHT|BITMAPVIEW_TOP|BITMAPVIEW_BOTTOM)); if(options!=opts){ options=opts; update(); } } // Get the current alignment. FXuint FXBitmapView::getAlignment() const { return (options&(BITMAPVIEW_LEFT|BITMAPVIEW_RIGHT|BITMAPVIEW_TOP|BITMAPVIEW_BOTTOM)); } // Save object to stream void FXBitmapView::save(FXStream& store) const { FXScrollArea::save(store); store << bitmap; } // Load object from stream void FXBitmapView::load(FXStream& store){ FXScrollArea::load(store); store >> bitmap; } // Destroy FXBitmapView::~FXBitmapView(){ bitmap=(FXBitmap*)-1L; } } fox1.6-1.6.57/src/FXButton.cpp000066400000000000000000000355731326741342000156560ustar00rootroot00000000000000/******************************************************************************** * * * B u t t o n O b j e c t s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXButton.cpp,v 1.67 2006/01/22 17:58:18 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXIcon.h" #include "FXShell.h" #include "FXButton.h" /* Notes: - Use flags for button instead of a whole integer - Add ``flat'' toolbar style also - Need check-style also (stay in when pressed, pop out when unpressed). - Who owns the icon(s)? - Arrow buttons should auto-repeat with a timer of some kind - "&Label\tTooltip\tHelptext\thttp://server/application/helponitem.html" - CheckButton should send SEL_COMMAND. - Default button mode:- should somehow get focus. - Add button multiple-click translations elsewhere - Button should be able to behave like a check (radio) button. - Need to draw ``around'' the icon etc. So it doesn't flash to background. */ // Button styles #define BUTTON_MASK (BUTTON_AUTOGRAY|BUTTON_AUTOHIDE|BUTTON_TOOLBAR|BUTTON_DEFAULT|BUTTON_INITIAL) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXButton) FXButtonMap[]={ FXMAPFUNC(SEL_PAINT,0,FXButton::onPaint), FXMAPFUNC(SEL_UPDATE,0,FXButton::onUpdate), FXMAPFUNC(SEL_ENTER,0,FXButton::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXButton::onLeave), FXMAPFUNC(SEL_FOCUSIN,0,FXButton::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXButton::onFocusOut), FXMAPFUNC(SEL_UNGRABBED,0,FXButton::onUngrabbed), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXButton::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXButton::onLeftBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXButton::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXButton::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXWindow::ID_HOTKEY,FXButton::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXWindow::ID_HOTKEY,FXButton::onHotKeyRelease), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_CHECK,FXButton::onCheck), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNCHECK,FXButton::onUncheck), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXButton::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETINTVALUE,FXButton::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETINTVALUE,FXButton::onCmdGetIntValue), }; // Object implementation FXIMPLEMENT(FXButton,FXLabel,FXButtonMap,ARRAYNUMBER(FXButtonMap)) // Deserialization FXButton::FXButton(){ state=STATE_UP; } // Construct and init FXButton::FXButton(FXComposite* p,const FXString& text,FXIcon* ic,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXLabel(p,text,ic,opts,x,y,w,h,pl,pr,pt,pb){ target=tgt; message=sel; state=STATE_UP; if(options&BUTTON_INITIAL){ setInitial(TRUE); setDefault(TRUE); } } // If window can have focus bool FXButton::canFocus() const { return true; } // Set focus to this widget void FXButton::setFocus(){ FXLabel::setFocus(); if(options&BUTTON_DEFAULT) setDefault(TRUE); update(); } // Kill focus to this widget void FXButton::killFocus(){ FXLabel::killFocus(); if(options&BUTTON_DEFAULT) setDefault(MAYBE); update(); } // Make widget drawn as default void FXButton::setDefault(FXbool enable){ FXLabel::setDefault(enable); update(); } // Set button state void FXButton::setState(FXuint s){ if(state!=s){ state=s; update(); } } // Update value from a message long FXButton::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setState((FXuint)(FXuval)ptr); return 1; } // Update value from a message long FXButton::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setState(*((FXint*)ptr)); return 1; } // Obtain value from text field long FXButton::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getState(); return 1; } // Check the menu button long FXButton::onCheck(FXObject*,FXSelector,void*){ setState(STATE_ENGAGED); return 1; } // Check the menu button long FXButton::onUncheck(FXObject*,FXSelector,void*){ setState(STATE_UP); return 1; } // Implement auto-hide or auto-gray modes long FXButton::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ if(!FXLabel::onUpdate(sender,sel,ptr)){ if(options&BUTTON_AUTOHIDE){if(shown()){hide();recalc();}} if(options&BUTTON_AUTOGRAY){disable();} } return 1; } // Gained focus long FXButton::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusIn(sender,sel,ptr); update(); return 1; } // Lost focus long FXButton::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusOut(sender,sel,ptr); update(); return 1; } // Entered button long FXButton::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onEnter(sender,sel,ptr); if(isEnabled()){ if((flags&FLAG_PRESSED) && (state!=STATE_ENGAGED)) setState(STATE_DOWN); if(options&BUTTON_TOOLBAR) update(); } return 1; } // Left button long FXButton::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onLeave(sender,sel,ptr); if(isEnabled()){ if((flags&FLAG_PRESSED) && (state!=STATE_ENGAGED)) setState(STATE_UP); if(options&BUTTON_TOOLBAR) update(); } return 1; } // Pressed mouse button long FXButton::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; if(state!=STATE_ENGAGED) setState(STATE_DOWN); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; return 1; } return 0; } // Released mouse button long FXButton::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXbool click=(state==STATE_DOWN); if(isEnabled() && (flags&FLAG_PRESSED)){ ungrab(); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(state!=STATE_ENGAGED) setState(STATE_UP); if(click && target){ target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)1); } return 1; } return 0; } // Lost the grab for some reason long FXButton::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onUngrabbed(sender,sel,ptr); if(state!=STATE_ENGAGED) setState(STATE_UP); flags&=~FLAG_PRESSED; flags|=FLAG_UPDATE; return 1; } // Key Press long FXButton::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if((event->code==KEY_space || event->code==KEY_KP_Space) || (isDefault() && (event->code==KEY_Return || event->code==KEY_KP_Enter))){ if(state!=STATE_ENGAGED) setState(STATE_DOWN); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; return 1; } } return 0; } // Key Release long FXButton::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXbool click=(state==STATE_DOWN); if(isEnabled() && (flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if((event->code==KEY_space || event->code==KEY_KP_Space) || (isDefault() && (event->code==KEY_Return || event->code==KEY_KP_Enter))){ if(state!=STATE_ENGAGED) setState(STATE_UP); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; if(click && target){ target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)1); } return 1; } } return 0; } // Hot key combination pressed long FXButton::onHotKeyPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled() && !(flags&FLAG_PRESSED)){ if(state!=STATE_ENGAGED) setState(STATE_DOWN); flags&=~FLAG_UPDATE; flags|=FLAG_PRESSED; } return 1; } // Hot key combination released long FXButton::onHotKeyRelease(FXObject*,FXSelector,void*){ FXuint click=(state==STATE_DOWN); if(isEnabled() && (flags&FLAG_PRESSED)){ if(state!=STATE_ENGAGED) setState(STATE_UP); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; if(click && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)1); } return 1; } // Handle repaint long FXButton::onPaint(FXObject*,FXSelector,void* ptr){ FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy; FXEvent *ev=(FXEvent*)ptr; // Start drawing FXDCWindow dc(this,ev); // Got a border at all? if(options&(FRAME_RAISED|FRAME_SUNKEN)){ // Toolbar style if(options&BUTTON_TOOLBAR){ // Enabled and cursor inside, and up if(isEnabled() && underCursor() && (state==STATE_UP)){ dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } // Enabled and cursor inside and down else if(isEnabled() && underCursor() && (state==STATE_DOWN)){ dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height); else drawSunkenRectangle(dc,0,0,width,height); } // Enabled and checked else if(isEnabled() && (state==STATE_ENGAGED)){ dc.setForeground(hiliteColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height); else drawSunkenRectangle(dc,0,0,width,height); } // Disabled or unchecked or not under cursor else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } } // Normal style else{ // Default if(isDefault()){ // Draw in up state if disabled or up if(!isEnabled() || (state==STATE_UP)){ dc.setForeground(backColor); dc.fillRectangle(border+1,border+1,width-border*2-1,height-border*2-1); if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,1,1,width-1,height-1); else drawRaisedRectangle(dc,1,1,width-1,height-1); } // Draw sunken if enabled and either checked or pressed else{ if(state==STATE_ENGAGED) dc.setForeground(hiliteColor); else dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2-1,height-border*2-1); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width-1,height-1); else drawSunkenRectangle(dc,0,0,width-1,height-1); } // Black default border drawBorderRectangle(dc,0,0,width,height); } // Non-Default else{ // Draw in up state if disabled or up if(!isEnabled() || (state==STATE_UP)){ dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } // Draw sunken if enabled and either checked or pressed else{ if(state==STATE_ENGAGED) dc.setForeground(hiliteColor); else dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height); else drawSunkenRectangle(dc,0,0,width,height); } } } } // No borders else{ if(isEnabled() && (state==STATE_ENGAGED)){ dc.setForeground(hiliteColor); dc.fillRectangle(0,0,width,height); } else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } } // Place text & icon if(!label.empty()){ tw=labelWidth(label); th=labelHeight(label); } if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); } just_x(tx,ix,tw,iw); just_y(ty,iy,th,ih); // Shift a bit when pressed if(state && (options&(FRAME_RAISED|FRAME_SUNKEN))){ ++tx; ++ty; ++ix; ++iy; } // Draw enabled state if(isEnabled()){ if(icon){ dc.drawIcon(icon,ix,iy); } if(!label.empty()){ dc.setFont(font); dc.setForeground(textColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } if(hasFocus()){ dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2); } } // Draw grayed-out state else{ if(icon){ dc.drawIconSunken(icon,ix,iy); } if(!label.empty()){ dc.setFont(font); dc.setForeground(hiliteColor); drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } } return 1; } // Set button style void FXButton::setButtonStyle(FXuint style){ FXuint opts=(options&~BUTTON_MASK) | (style&BUTTON_MASK); if(options!=opts){ options=opts; update(); } } // Get button style FXuint FXButton::getButtonStyle() const { return (options&BUTTON_MASK); } } fox1.6-1.6.57/src/FXCP1250Codec.cpp000066400000000000000000000151661326741342000161470ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP1250Codec.h" namespace FX { FXIMPLEMENT(FXCP1250Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP1250.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 8364, 65533, 8218, 65533, 8222, 8230, 8224, 8225, 65533, 8240, 352, 8249, 346, 356, 381, 377, 65533, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 65533, 8482, 353, 8250, 347, 357, 382, 378, 160, 711, 728, 321, 164, 260, 166, 167, 168, 169, 350, 171, 172, 173, 174, 379, 176, 177, 731, 322, 180, 181, 182, 183, 184, 261, 351, 187, 317, 733, 318, 380, 340, 193, 194, 258, 196, 313, 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, 345, 367, 250, 369, 252, 253, 355, 729, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 46, 46, 46, 46, 46, 46, 46, 109,46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, }; static const unsigned short reverse_block[173]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 175, 190, 206, 221, 235, 251, 128, 263, 278, 294, 310, 326, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 341, 349, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 363, 379, 395, 128, 128, 128, 128, 128, 128, 406, 128, 128, 128, 128, 128, 128, 128, 420, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[436]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 160, 26, 26, 26, 164, 26, 166, 167, 168, 169, 26, 171, 172, 173, 174, 26, 176, 177, 26, 26, 180, 181, 182, 183, 184, 26, 26, 187, 26, 26, 26, 26, 193, 194, 26, 196, 26, 26, 199, 26, 201, 26, 203, 26, 205, 206, 26, 26, 26, 211, 212, 26, 214, 215, 26, 26, 218, 26, 220, 221, 26, 223, 26, 225, 226, 26, 228, 26, 26, 231, 26, 233, 26, 235, 26, 237, 238, 26, 26, 26, 243, 244, 26, 246, 247, 26, 26, 250, 26, 252, 253, 26, 26, 195, 227, 165, 185, 198, 230, 26, 26, 26, 26, 200, 232, 207, 239, 208, 240, 26, 26, 26, 26, 26, 26, 202, 234, 204, 236, 26, 26, 26, 26, 26, 26, 26, 26, 26, 197, 229, 26, 26, 188, 190, 26, 163, 179, 209, 241, 26, 26, 210, 242, 26, 26, 26, 26, 26, 26, 26, 213, 245, 26, 26, 192, 224, 26, 26, 216, 248, 140, 156, 26, 26, 170, 186, 138, 154, 222, 254, 141, 157, 26, 26, 26, 26, 26, 26, 26, 26, 217, 249, 219, 251, 26, 26, 26, 26, 26, 26, 26, 143, 159, 175, 191, 142, 158, 26, 26, 26, 26, 26, 26, 26, 161, 26, 26, 26, 26, 26, 26, 26, 26, 162, 255, 26, 178, 26, 189, 26, 26, 26, 150, 151, 26, 26, 26, 145, 146, 130, 26, 147, 148, 132, 26, 134, 135, 149, 26, 26, 26, 133, 26, 26, 26, 26, 26, 26, 26, 26, 26, 137, 26, 26, 26, 26, 26, 26, 26, 26, 139, 155, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 128, 26, 26, 26, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP1250Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP1250Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP1250Codec::mibEnum() const { return 2250; } const FXchar* FXCP1250Codec::name() const { return "windows-1250"; } const FXchar* FXCP1250Codec::mimeName() const { return "windows-1250"; } const FXchar* const* FXCP1250Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp1250","windows-1250","cp1250","latin2",NULL}; return list; } } fox1.6-1.6.57/src/FXCP1251Codec.cpp000066400000000000000000000145621326741342000161470ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP1251Codec.h" namespace FX { FXIMPLEMENT(FXCP1251Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP1251.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1026, 1027, 8218, 1107, 8222, 8230, 8224, 8225, 8364, 8240, 1033, 8249, 1034, 1036, 1035, 1039, 1106, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 65533, 8482, 1113, 8250, 1114, 1116, 1115, 1119, 160, 1038, 1118, 1032, 164, 1168, 166, 167, 1025, 169, 1028, 171, 172, 173, 174, 1031, 176, 177, 1030, 1110, 1169, 181, 182, 183, 1105, 8470, 1108, 187, 1112, 1029, 1109, 1111, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 64, 74, 74, 74, 74, 74, 74, 137,74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, }; static const unsigned short reverse_block[201]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 175, 191, 207, 223, 239, 255, 128, 128, 128, 271, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 284, 300, 316, 128, 128, 128, 128, 128, 128, 327, 128, 128, 128, 128, 128, 128, 340, 354, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[370]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 160, 26, 26, 26, 164, 26, 166, 167, 26, 169, 26, 171, 172, 173, 174, 26, 176, 177, 26, 26, 26, 181, 182, 183, 26, 26, 26, 187, 26, 26, 26, 26, 168, 128, 129, 170, 189, 178, 175, 163, 138, 140, 142, 141, 26, 161, 143, 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, 26, 184, 144, 131, 186, 190, 179, 191, 188, 154, 156, 158, 157, 26, 162, 159, 165, 180, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 150, 151, 26, 26, 26, 145, 146, 130, 26, 147, 148, 132, 26, 134, 135, 149, 26, 26, 26, 133, 26, 26, 26, 26, 26, 26, 26, 26, 26, 137, 26, 26, 26, 26, 26, 26, 26, 26, 139, 155, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 136, 26, 26, 26, 26, 26, 26, 185, 26, 26, 26, 26, 26, 26, 26, 26, 26, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP1251Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP1251Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP1251Codec::mibEnum() const { return 2251; } const FXchar* FXCP1251Codec::name() const { return "windows-1251"; } const FXchar* FXCP1251Codec::mimeName() const { return "windows-1251"; } const FXchar* const* FXCP1251Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp1251","windows-1251","cp1251",NULL}; return list; } } fox1.6-1.6.57/src/FXCP1252Codec.cpp000066400000000000000000000144511326741342000161450ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP1252Codec.h" namespace FX { FXIMPLEMENT(FXCP1252Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP1252.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 8364, 65533, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 352, 8249, 338, 65533, 381, 65533, 65533, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 65533, 382, 376, 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, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 46, 46, 46, 46, 46, 46, 46, 109,46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, }; static const unsigned short reverse_block[173]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 176, 192, 208, 224, 128, 128, 128, 128, 128, 240, 256, 264, 128, 279, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 289, 296, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 309, 325, 341, 128, 128, 128, 128, 128, 128, 352, 128, 128, 128, 128, 128, 128, 128, 366, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[382]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 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, 26, 26, 140, 156, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 138, 154, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 159, 26, 26, 26, 26, 142, 158, 26, 26, 131, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 136, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 152, 26, 26, 26, 150, 151, 26, 26, 26, 145, 146, 130, 26, 147, 148, 132, 26, 134, 135, 149, 26, 26, 26, 133, 26, 26, 26, 26, 26, 26, 26, 26, 26, 137, 26, 26, 26, 26, 26, 26, 26, 26, 139, 155, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 128, 26, 26, 26, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP1252Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP1252Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP1252Codec::mibEnum() const { return 2252; } const FXchar* FXCP1252Codec::name() const { return "windows-1252"; } const FXchar* FXCP1252Codec::mimeName() const { return "windows-1252"; } const FXchar* const* FXCP1252Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp1252","windows-1252","cp1252",NULL}; return list; } } fox1.6-1.6.57/src/FXCP1253Codec.cpp000066400000000000000000000141711326741342000161450ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP1253Codec.h" namespace FX { FXIMPLEMENT(FXCP1253Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP1253.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 8364, 65533, 8218, 402, 8222, 8230, 8224, 8225, 65533, 8240, 65533, 8249, 65533, 65533, 65533, 65533, 65533, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 65533, 8482, 65533, 8250, 65533, 65533, 65533, 65533, 160, 901, 902, 163, 164, 165, 166, 167, 168, 169, 65533, 171, 172, 173, 174, 8213, 176, 177, 178, 179, 900, 181, 182, 183, 904, 905, 906, 187, 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 65533, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 65533, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 61, 61, 61, 61, 61, 61, 61, 124,61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, }; static const unsigned short reverse_block[188]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 174, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 186, 202, 218, 234, 250, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 265, 281, 297, 128, 128, 128, 128, 128, 128, 308, 128, 128, 128, 128, 128, 128, 128, 322, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[338]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 160, 26, 26, 163, 164, 165, 166, 167, 168, 169, 26, 171, 172, 173, 174, 26, 176, 177, 178, 179, 26, 181, 182, 183, 26, 26, 26, 187, 26, 189, 26, 26, 131, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 180, 161, 162, 26, 184, 185, 186, 26, 188, 26, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 26, 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, 26, 26, 26, 150, 151, 175, 26, 26, 145, 146, 130, 26, 147, 148, 132, 26, 134, 135, 149, 26, 26, 26, 133, 26, 26, 26, 26, 26, 26, 26, 26, 26, 137, 26, 26, 26, 26, 26, 26, 26, 26, 139, 155, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 128, 26, 26, 26, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP1253Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP1253Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP1253Codec::mibEnum() const { return 2253; } const FXchar* FXCP1253Codec::name() const { return "windows-1253"; } const FXchar* FXCP1253Codec::mimeName() const { return "windows-1253"; } const FXchar* const* FXCP1253Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp1253","windows-1253","cp1253",NULL}; return list; } } fox1.6-1.6.57/src/FXCP1254Codec.cpp000066400000000000000000000147341326741342000161530ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP1254Codec.h" namespace FX { FXIMPLEMENT(FXCP1254Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP1254.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 8364, 65533, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 352, 8249, 338, 65533, 65533, 65533, 65533, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 65533, 65533, 376, 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, 286, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 304, 350, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 287, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 305, 351, 255, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 46, 46, 46, 46, 46, 46, 46, 109,46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, }; static const unsigned short reverse_block[173]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 176, 192, 208, 224, 128, 240, 128, 256, 128, 270, 286, 294, 128, 308, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 318, 325, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 338, 354, 370, 128, 128, 128, 128, 128, 128, 381, 128, 128, 128, 128, 128, 128, 128, 395, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[411]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 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, 26, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 26, 26, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 26, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 26, 26, 255, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 208, 240, 221, 253, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 140, 156, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 222, 254, 138, 154, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 159, 26, 26, 26, 26, 26, 26, 26, 131, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 136, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 152, 26, 26, 26, 150, 151, 26, 26, 26, 145, 146, 130, 26, 147, 148, 132, 26, 134, 135, 149, 26, 26, 26, 133, 26, 26, 26, 26, 26, 26, 26, 26, 26, 137, 26, 26, 26, 26, 26, 26, 26, 26, 139, 155, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 128, 26, 26, 26, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP1254Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP1254Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP1254Codec::mibEnum() const { return 2254; } const FXchar* FXCP1254Codec::name() const { return "windows-1254"; } const FXchar* FXCP1254Codec::mimeName() const { return "windows-1254"; } const FXchar* const* FXCP1254Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp1254","windows-1254","cp1254",NULL}; return list; } } fox1.6-1.6.57/src/FXCP1255Codec.cpp000066400000000000000000000150301326741342000161420ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP1255Codec.h" namespace FX { FXIMPLEMENT(FXCP1255Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP1255.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 8364, 65533, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 65533, 8249, 65533, 65533, 65533, 65533, 65533, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 65533, 8250, 65533, 65533, 65533, 65533, 160, 161, 162, 163, 8362, 165, 166, 167, 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, 188, 189, 190, 191, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 65533, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1520, 1521, 1522, 1523, 1524, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 65533, 65533, 8206, 8207, 65533, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 46, 78, 78, 78, 78, 78, 78, 142,78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, }; static const unsigned short reverse_block[206]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 128, 176, 128, 185, 128, 128, 128, 128, 128, 128, 128, 128, 128, 199, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 209, 216, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 232, 248, 264, 280, 296, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 301, 317, 333, 349, 128, 128, 128, 128, 128, 128, 360, 128, 128, 128, 128, 128, 128, 128, 374, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[390]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 160, 161, 162, 163, 26, 165, 166, 167, 168, 169, 26, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 26, 187, 188, 189, 190, 191, 26, 26, 26, 26, 26, 26, 26, 170, 26, 26, 26, 26, 26, 26, 26, 26, 186, 26, 26, 26, 26, 26, 26, 26, 26, 131, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 136, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 152, 26, 26, 26, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 26, 203, 204, 205, 206, 207, 208, 209, 210, 211, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 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, 26, 26, 26, 26, 26, 212, 213, 214, 215, 216, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 253, 254, 26, 26, 26, 150, 151, 26, 26, 26, 145, 146, 130, 26, 147, 148, 132, 26, 134, 135, 149, 26, 26, 26, 133, 26, 26, 26, 26, 26, 26, 26, 26, 26, 137, 26, 26, 26, 26, 26, 26, 26, 26, 139, 155, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 164, 26, 128, 26, 26, 26, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP1255Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP1255Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP1255Codec::mibEnum() const { return 2255; } const FXchar* FXCP1255Codec::name() const { return "windows-1255"; } const FXchar* FXCP1255Codec::mimeName() const { return "windows-1255"; } const FXchar* const* FXCP1255Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp1255","windows-1255","cp1255",NULL}; return list; } } fox1.6-1.6.57/src/FXCP1256Codec.cpp000066400000000000000000000164601326741342000161530ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP1256Codec.h" namespace FX { FXIMPLEMENT(FXCP1256Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP1256.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 8364, 1662, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 1657, 8249, 338, 1670, 1688, 1672, 1711, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 1705, 8482, 1681, 8250, 339, 8204, 8205, 1722, 160, 1548, 162, 163, 164, 165, 166, 167, 168, 169, 1726, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 1563, 187, 188, 189, 190, 1567, 1729, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 215, 1591, 1592, 1593, 1594, 1600, 1601, 1602, 1603, 224, 1604, 226, 1605, 1606, 1607, 1608, 231, 232, 233, 234, 235, 1609, 1610, 238, 239, 1611, 1612, 1613, 1614, 244, 1615, 1616, 247, 1617, 249, 1618, 251, 252, 8206, 8207, 1746, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 45, 91, 91, 91, 91, 91, 91, 155,91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, }; static const unsigned short reverse_block[219]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 128, 175, 191, 207, 128, 128, 128, 128, 128, 221, 128, 128, 128, 235, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 245, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 252, 265, 281, 297, 313, 329, 128, 336, 351, 366, 375, 391, 406, 420, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 424, 440, 456, 472, 128, 128, 128, 128, 128, 128, 483, 128, 128, 128, 128, 128, 128, 128, 497, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[513]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 160, 26, 162, 163, 164, 165, 166, 167, 168, 169, 26, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 26, 187, 188, 189, 190, 26, 26, 26, 26, 26, 26, 26, 215, 26, 26, 26, 26, 26, 26, 26, 26, 224, 26, 226, 26, 26, 26, 26, 231, 232, 233, 234, 235, 26, 26, 238, 239, 26, 26, 26, 26, 244, 26, 26, 247, 26, 249, 26, 251, 252, 26, 26, 26, 140, 156, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 131, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 136, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 161, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 186, 26, 26, 26, 191, 26, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 26, 26, 26, 26, 26, 220, 221, 222, 223, 225, 227, 228, 229, 230, 236, 237, 240, 241, 242, 243, 245, 246, 248, 250, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 138, 26, 26, 26, 26, 129, 26, 26, 26, 26, 26, 26, 141, 26, 143, 26, 26, 26, 26, 26, 26, 26, 154, 26, 26, 26, 26, 26, 26, 142, 26, 26, 26, 26, 26, 26, 26, 26, 26, 152, 26, 26, 26, 26, 26, 144, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 159, 26, 26, 26, 170, 26, 192, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 157, 158, 253, 254, 26, 26, 26, 150, 151, 26, 26, 26, 145, 146, 130, 26, 147, 148, 132, 26, 134, 135, 149, 26, 26, 26, 133, 26, 26, 26, 26, 26, 26, 26, 26, 26, 137, 26, 26, 26, 26, 26, 26, 26, 26, 139, 155, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 128, 26, 26, 26, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP1256Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP1256Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP1256Codec::mibEnum() const { return 2256; } const FXchar* FXCP1256Codec::name() const { return "windows-1256"; } const FXchar* FXCP1256Codec::mimeName() const { return "windows-1256"; } const FXchar* const* FXCP1256Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp1256","windows-1256","cp1256",NULL}; return list; } } fox1.6-1.6.57/src/FXCP1257Codec.cpp000066400000000000000000000153001326741342000161440ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP1257Codec.h" namespace FX { FXIMPLEMENT(FXCP1257Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP1257.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 8364, 65533, 8218, 65533, 8222, 8230, 8224, 8225, 65533, 8240, 65533, 8249, 65533, 168, 711, 184, 65533, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 65533, 8482, 65533, 8250, 65533, 175, 731, 65533, 160, 65533, 162, 163, 164, 65533, 166, 167, 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, 178, 179, 180, 181, 182, 183, 248, 185, 343, 187, 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, 371, 322, 347, 363, 252, 380, 382, 729, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 46, 46, 46, 46, 46, 46, 46, 109,46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, }; static const unsigned short reverse_block[173]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 175, 188, 204, 217, 233, 247, 261, 277, 292, 306, 322, 336, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 351, 359, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 372, 388, 404, 128, 128, 128, 128, 128, 128, 415, 128, 128, 128, 128, 128, 128, 128, 429, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[445]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 160, 26, 162, 163, 164, 26, 166, 167, 141, 169, 26, 171, 172, 173, 174, 157, 176, 177, 178, 179, 180, 181, 182, 183, 143, 185, 26, 187, 188, 189, 190, 26, 26, 26, 26, 196, 197, 175, 26, 26, 201, 26, 26, 26, 26, 26, 26, 211, 26, 213, 214, 215, 168, 26, 26, 26, 220, 26, 26, 223, 26, 26, 26, 26, 228, 229, 191, 26, 26, 233, 26, 26, 26, 26, 26, 26, 243, 26, 245, 246, 247, 184, 26, 26, 26, 252, 26, 26, 26, 194, 226, 26, 26, 192, 224, 195, 227, 26, 26, 26, 26, 200, 232, 26, 26, 199, 231, 26, 26, 203, 235, 198, 230, 26, 26, 26, 26, 26, 26, 204, 236, 26, 26, 26, 26, 26, 26, 206, 238, 26, 26, 193, 225, 26, 26, 26, 26, 26, 26, 205, 237, 26, 26, 26, 207, 239, 26, 26, 26, 217, 249, 209, 241, 210, 242, 26, 26, 26, 26, 26, 212, 244, 26, 26, 26, 26, 26, 26, 170, 186, 26, 26, 218, 250, 26, 26, 26, 26, 208, 240, 26, 26, 26, 26, 26, 26, 26, 26, 219, 251, 26, 26, 26, 26, 216, 248, 26, 26, 26, 26, 26, 202, 234, 221, 253, 222, 254, 26, 26, 26, 26, 26, 26, 26, 142, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 26, 158, 26, 26, 26, 26, 150, 151, 26, 26, 26, 145, 146, 130, 26, 147, 148, 132, 26, 134, 135, 149, 26, 26, 26, 133, 26, 26, 26, 26, 26, 26, 26, 26, 26, 137, 26, 26, 26, 26, 26, 26, 26, 26, 139, 155, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 128, 26, 26, 26, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP1257Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP1257Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP1257Codec::mibEnum() const { return 2257; } const FXchar* FXCP1257Codec::name() const { return "windows-1257"; } const FXchar* FXCP1257Codec::mimeName() const { return "windows-1257"; } const FXchar* const* FXCP1257Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp1257","windows-1257","cp1257","microsoft-cp1257",NULL}; return list; } } fox1.6-1.6.57/src/FXCP1258Codec.cpp000066400000000000000000000154111326741342000161500ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP1258Codec.h" namespace FX { FXIMPLEMENT(FXCP1258Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP1258.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 8364, 65533, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 65533, 8249, 338, 65533, 65533, 65533, 65533, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 65533, 8250, 339, 65533, 65533, 376, 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, 258, 196, 197, 198, 199, 200, 201, 202, 203, 768, 205, 206, 207, 272, 209, 777, 211, 212, 416, 214, 215, 216, 217, 218, 219, 220, 431, 771, 223, 224, 225, 226, 259, 228, 229, 230, 231, 232, 233, 234, 235, 769, 237, 238, 239, 273, 241, 803, 243, 244, 417, 246, 247, 248, 249, 250, 251, 252, 432, 8363, 255, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 51, 51, 51, 51, 51, 51, 51, 114,51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, }; static const unsigned short reverse_block[178]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 176, 192, 208, 224, 240, 256, 128, 128, 128, 270, 128, 278, 128, 292, 308, 324, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 334, 341, 128, 128, 357, 128, 370, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 383, 399, 415, 128, 128, 128, 128, 128, 128, 426, 128, 128, 128, 128, 128, 128, 128, 440, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[456]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 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, 26, 196, 197, 198, 199, 200, 201, 202, 203, 26, 205, 206, 207, 26, 209, 26, 211, 212, 26, 214, 215, 216, 217, 218, 219, 220, 26, 26, 223, 224, 225, 226, 26, 228, 229, 230, 231, 232, 233, 234, 235, 26, 237, 238, 239, 26, 241, 26, 243, 244, 26, 246, 247, 248, 249, 250, 251, 252, 26, 26, 255, 26, 26, 195, 227, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 208, 240, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 140, 156, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 159, 26, 26, 26, 26, 26, 26, 26, 131, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 213, 245, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 221, 253, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 136, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 152, 26, 26, 26, 204, 236, 26, 222, 26, 26, 26, 26, 26, 210, 26, 26, 26, 26, 26, 26, 242, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 150, 151, 26, 26, 26, 145, 146, 130, 26, 147, 148, 132, 26, 134, 135, 149, 26, 26, 26, 133, 26, 26, 26, 26, 26, 26, 26, 26, 26, 137, 26, 26, 26, 26, 26, 26, 26, 26, 139, 155, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 128, 26, 26, 26, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP1258Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP1258Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP1258Codec::mibEnum() const { return 2258; } const FXchar* FXCP1258Codec::name() const { return "windows-1258"; } const FXchar* FXCP1258Codec::mimeName() const { return "windows-1258"; } const FXchar* const* FXCP1258Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp1258","windows-1258","cp1258",NULL}; return list; } } fox1.6-1.6.57/src/FXCP437Codec.cpp000066400000000000000000000171461326741342000160750ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP437Codec.h" namespace FX { FXIMPLEMENT(FXCP437Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP437.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 239, 238, 236, 196, 197, 201, 230, 198, 244, 246, 242, 251, 249, 255, 214, 220, 162, 163, 165, 8359, 402, 225, 237, 243, 250, 241, 209, 170, 186, 191, 8976, 172, 189, 188, 161, 171, 187, 9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, 9484, 9608, 9604, 9612, 9616, 9600, 945, 223, 915, 960, 931, 963, 181, 964, 934, 920, 937, 948, 8734, 966, 949, 8745, 8801, 177, 8805, 8804, 8992, 8993, 247, 8776, 176, 8729, 183, 8730, 8319, 178, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 61, 61, 61, 61, 61, 61, 61, 118,169,61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, }; static const unsigned short reverse_block[233]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 176, 191, 207, 223, 128, 128, 128, 128, 128, 128, 128, 128, 128, 239, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 252, 265, 280, 296, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 303, 128, 128, 319, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 327, 342, 128, 352, 128, 367, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 383, 399, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 415, 431, 444, 457, 128, 473, 489, 128, 505, 521, 537, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[553]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 173, 155, 156, 26, 157, 26, 26, 26, 26, 166, 174, 170, 26, 26, 26, 248, 241, 253, 26, 26, 230, 26, 250, 26, 26, 167, 175, 172, 171, 26, 168, 26, 26, 26, 26, 142, 143, 146, 128, 26, 144, 26, 26, 26, 26, 26, 26, 165, 26, 26, 26, 26, 153, 26, 26, 26, 26, 26, 154, 26, 26, 225, 133, 160, 131, 26, 132, 134, 145, 135, 138, 130, 136, 137, 141, 161, 140, 139, 26, 164, 149, 162, 147, 26, 148, 246, 26, 151, 163, 150, 129, 26, 26, 152, 26, 26, 159, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 226, 26, 26, 26, 26, 233, 26, 26, 26, 26, 26, 26, 26, 228, 26, 26, 232, 26, 26, 234, 26, 26, 26, 26, 26, 26, 224, 26, 26, 235, 238, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 227, 26, 26, 229, 231, 26, 237, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 252, 26, 26, 26, 26, 26, 26, 26, 158, 26, 26, 26, 26, 26, 26, 26, 26, 26, 249, 251, 26, 26, 26, 236, 26, 26, 26, 26, 26, 26, 26, 26, 26, 239, 26, 26, 26, 26, 26, 26, 26, 26, 247, 26, 26, 26, 26, 26, 26, 26, 240, 26, 26, 243, 242, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 169, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 244, 245, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 213, 214, 201, 184, 183, 187, 212, 211, 200, 190, 189, 188, 198, 199, 204, 181, 182, 185, 209, 210, 203, 207, 208, 202, 216, 215, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 221, 26, 26, 26, 222, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP437Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP437Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP437Codec::mibEnum() const { return 2011; } const FXchar* FXCP437Codec::name() const { return "IBM437"; } const FXchar* FXCP437Codec::mimeName() const { return "IBM437"; } const FXchar* const* FXCP437Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp437","IBM437","cp437","csPC8CodePage437",NULL}; return list; } } fox1.6-1.6.57/src/FXCP850Codec.cpp000066400000000000000000000152061326741342000160670ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP850Codec.h" namespace FX { FXIMPLEMENT(FXCP850Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP850.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 239, 238, 236, 196, 197, 201, 230, 198, 244, 246, 242, 251, 249, 255, 214, 220, 248, 163, 216, 215, 402, 225, 237, 243, 250, 241, 209, 170, 186, 191, 174, 172, 189, 188, 161, 171, 187, 9617, 9618, 9619, 9474, 9508, 193, 194, 192, 169, 9571, 9553, 9559, 9565, 162, 165, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 227, 195, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 164, 240, 208, 202, 203, 200, 305, 205, 206, 207, 9496, 9484, 9608, 9604, 166, 204, 9600, 211, 223, 212, 210, 245, 213, 181, 254, 222, 218, 219, 217, 253, 221, 175, 180, 173, 177, 8215, 190, 182, 167, 247, 184, 176, 168, 183, 185, 179, 178, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 26, 26, 26, 26, 26, 26, 26, 89, 137,26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; static const unsigned short reverse_block[201]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 176, 192, 208, 224, 128, 128, 128, 240, 128, 128, 128, 128, 128, 254, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 263, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 279, 295, 308, 321, 128, 337, 353, 128, 369, 384, 400, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[416]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 173, 189, 156, 207, 190, 221, 245, 249, 184, 166, 174, 170, 240, 169, 238, 248, 241, 253, 252, 239, 230, 244, 250, 247, 251, 167, 175, 172, 171, 243, 168, 183, 181, 182, 199, 142, 143, 146, 128, 212, 144, 210, 211, 222, 214, 215, 216, 209, 165, 227, 224, 226, 229, 153, 158, 157, 235, 233, 234, 154, 237, 232, 225, 133, 160, 131, 198, 132, 134, 145, 135, 138, 130, 136, 137, 141, 161, 140, 139, 208, 164, 149, 162, 147, 228, 148, 246, 155, 151, 163, 150, 129, 236, 231, 152, 26, 213, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 159, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 242, 26, 26, 26, 26, 26, 26, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 26, 26, 201, 26, 26, 187, 26, 26, 200, 26, 26, 188, 26, 26, 204, 26, 26, 185, 26, 26, 203, 26, 26, 202, 26, 26, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 26, 26, 26, 26, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP850Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP850Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP850Codec::mibEnum() const { return 2009; } const FXchar* FXCP850Codec::name() const { return "IBM850"; } const FXchar* FXCP850Codec::mimeName() const { return "IBM850"; } const FXchar* const* FXCP850Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp850","IBM850","cp850","850","csPC850Multilingual",NULL}; return list; } } fox1.6-1.6.57/src/FXCP852Codec.cpp000066400000000000000000000156711326741342000160770ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP852Codec.h" namespace FX { FXIMPLEMENT(FXCP852Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP852.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 199, 252, 233, 226, 228, 367, 263, 231, 322, 235, 336, 337, 238, 377, 196, 262, 201, 313, 314, 244, 246, 317, 318, 346, 347, 214, 220, 356, 357, 321, 215, 269, 225, 237, 243, 250, 260, 261, 381, 382, 280, 281, 172, 378, 268, 351, 171, 187, 9617, 9618, 9619, 9474, 9508, 193, 194, 282, 350, 9571, 9553, 9559, 9565, 379, 380, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 258, 259, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 164, 273, 272, 270, 203, 271, 327, 205, 206, 283, 9496, 9484, 9608, 9604, 354, 366, 9600, 211, 223, 212, 323, 324, 328, 352, 353, 340, 218, 341, 368, 253, 221, 355, 180, 173, 733, 731, 711, 728, 167, 247, 184, 176, 168, 729, 369, 344, 345, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 46, 46, 46, 46, 46, 46, 46, 46, 94, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, }; static const unsigned short reverse_block[158]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 175, 190, 206, 221, 235, 251, 128, 263, 278, 294, 310, 326, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 341, 349, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 365, 381, 394, 407, 128, 423, 439, 128, 455, 470, 486, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[502]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 26, 26, 26, 207, 26, 26, 245, 249, 26, 26, 174, 170, 240, 26, 26, 248, 26, 26, 26, 239, 26, 26, 26, 247, 26, 26, 175, 26, 26, 26, 26, 181, 182, 26, 142, 26, 26, 128, 26, 144, 26, 211, 26, 214, 215, 26, 26, 26, 224, 226, 26, 153, 158, 26, 26, 233, 26, 154, 237, 26, 225, 26, 160, 131, 26, 132, 26, 26, 135, 26, 130, 26, 137, 26, 161, 140, 26, 26, 26, 162, 147, 26, 148, 246, 26, 26, 163, 26, 129, 236, 26, 26, 198, 199, 164, 165, 143, 134, 26, 26, 26, 26, 172, 159, 210, 212, 209, 208, 26, 26, 26, 26, 26, 26, 168, 169, 183, 216, 26, 26, 26, 26, 26, 26, 26, 26, 26, 145, 146, 26, 26, 149, 150, 26, 157, 136, 227, 228, 26, 26, 213, 229, 26, 26, 26, 26, 26, 26, 26, 138, 139, 26, 26, 232, 234, 26, 26, 252, 253, 151, 152, 26, 26, 184, 173, 230, 231, 221, 238, 155, 156, 26, 26, 26, 26, 26, 26, 26, 26, 222, 133, 235, 251, 26, 26, 26, 26, 26, 26, 26, 141, 171, 189, 190, 166, 167, 26, 26, 26, 26, 26, 26, 26, 243, 26, 26, 26, 26, 26, 26, 26, 26, 244, 250, 26, 242, 26, 241, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 26, 26, 201, 26, 26, 187, 26, 26, 200, 26, 26, 188, 26, 26, 204, 26, 26, 185, 26, 26, 203, 26, 26, 202, 26, 26, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 26, 26, 26, 26, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP852Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP852Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP852Codec::mibEnum() const { return 2010; } const FXchar* FXCP852Codec::name() const { return "IBM852"; } const FXchar* FXCP852Codec::mimeName() const { return "IBM852"; } const FXchar* const* FXCP852Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp852","IBM852","cp852","852","csPCp852","microsoft-cp852",NULL}; return list; } } fox1.6-1.6.57/src/FXCP855Codec.cpp000066400000000000000000000154641326741342000161020ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP855Codec.h" namespace FX { FXIMPLEMENT(FXCP855Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP855.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1106, 1026, 1107, 1027, 1105, 1025, 1108, 1028, 1109, 1029, 1110, 1030, 1111, 1031, 1112, 1032, 1113, 1033, 1114, 1034, 1115, 1035, 1116, 1036, 1118, 1038, 1119, 1039, 1102, 1070, 1098, 1066, 1072, 1040, 1073, 1041, 1094, 1062, 1076, 1044, 1077, 1045, 1092, 1060, 1075, 1043, 171, 187, 9617, 9618, 9619, 9474, 9508, 1093, 1061, 1080, 1048, 9571, 9553, 9559, 9565, 1081, 1049, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 1082, 1050, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 164, 1083, 1051, 1084, 1052, 1085, 1053, 1086, 1054, 1087, 9496, 9484, 9608, 9604, 1055, 1103, 9600, 1071, 1088, 1056, 1089, 1057, 1090, 1058, 1091, 1059, 1078, 1046, 1074, 1042, 1100, 1068, 8470, 173, 1099, 1067, 1079, 1047, 1096, 1064, 1101, 1069, 1097, 1065, 1095, 1063, 167, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 64, 70, 70, 70, 70, 70, 70, 117,165,70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, }; static const unsigned short reverse_block[229]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 158, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 173, 189, 205, 221, 237, 253, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 269, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 285, 301, 314, 327, 128, 343, 359, 128, 375, 390, 406, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[422]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 26, 26, 26, 207, 26, 26, 253, 26, 26, 26, 174, 26, 240, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 175, 26, 26, 26, 26, 133, 129, 131, 135, 137, 139, 141, 143, 145, 147, 149, 151, 26, 153, 155, 161, 163, 236, 173, 167, 169, 234, 244, 184, 190, 199, 209, 211, 213, 215, 221, 226, 228, 230, 232, 171, 182, 165, 252, 246, 250, 159, 242, 238, 248, 157, 224, 160, 162, 235, 172, 166, 168, 233, 243, 183, 189, 198, 208, 210, 212, 214, 216, 225, 227, 229, 231, 170, 181, 164, 251, 245, 249, 158, 241, 237, 247, 156, 222, 26, 132, 128, 130, 134, 136, 138, 140, 142, 144, 146, 148, 150, 26, 152, 154, 26, 26, 26, 26, 26, 26, 239, 26, 26, 26, 26, 26, 26, 26, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 26, 26, 201, 26, 26, 187, 26, 26, 200, 26, 26, 188, 26, 26, 204, 26, 26, 185, 26, 26, 203, 26, 26, 202, 26, 26, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 26, 26, 26, 26, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP855Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP855Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP855Codec::mibEnum() const { return 2046; } const FXchar* FXCP855Codec::name() const { return "IBM855"; } const FXchar* FXCP855Codec::mimeName() const { return "IBM855"; } const FXchar* const* FXCP855Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp855","IBM855","cp855","855","csIBM855",NULL}; return list; } } fox1.6-1.6.57/src/FXCP856Codec.cpp000066400000000000000000000152511326741342000160750ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP856Codec.h" namespace FX { FXIMPLEMENT(FXCP856Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP856.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 65533, 163, 65533, 215, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 174, 172, 189, 188, 65533, 171, 187, 9617, 9618, 9619, 9474, 9508, 65533, 65533, 65533, 169, 9571, 9553, 9559, 9565, 162, 165, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 65533, 65533, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 164, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 9496, 9484, 9608, 9604, 166, 65533, 9600, 65533, 65533, 65533, 65533, 65533, 65533, 181, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 175, 180, 173, 177, 8215, 190, 182, 167, 247, 184, 176, 168, 183, 185, 179, 178, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 35, 66, 66, 66, 66, 66, 66, 129,177,66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, }; static const unsigned short reverse_block[241]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 128, 175, 128, 184, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 200, 216, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 227, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 243, 259, 272, 285, 128, 301, 317, 128, 333, 348, 364, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[380]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 26, 189, 156, 207, 190, 221, 245, 249, 184, 26, 174, 170, 240, 169, 238, 248, 241, 253, 252, 239, 230, 244, 250, 247, 251, 26, 175, 172, 171, 243, 26, 26, 26, 26, 26, 26, 26, 158, 26, 26, 26, 26, 26, 26, 26, 26, 246, 26, 26, 26, 26, 26, 26, 26, 26, 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, 26, 26, 26, 26, 26, 26, 26, 242, 26, 26, 26, 26, 26, 26, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 26, 26, 201, 26, 26, 187, 26, 26, 200, 26, 26, 188, 26, 26, 204, 26, 26, 185, 26, 26, 203, 26, 26, 202, 26, 26, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 26, 26, 26, 26, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP856Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP856Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP856Codec::mibEnum() const { return 5; } const FXchar* FXCP856Codec::name() const { return "IBM856"; } const FXchar* FXCP856Codec::mimeName() const { return "IBM856"; } const FXchar* const* FXCP856Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp856","IBM856","cp856","856","csIBM856","microsoft-cp856",NULL}; return list; } } fox1.6-1.6.57/src/FXCP857Codec.cpp000066400000000000000000000144121326741342000160740ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP857Codec.h" namespace FX { FXIMPLEMENT(FXCP857Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP857.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 239, 238, 305, 196, 197, 201, 230, 198, 244, 246, 242, 251, 249, 304, 214, 220, 248, 163, 216, 350, 351, 225, 237, 243, 250, 241, 209, 286, 287, 191, 174, 172, 189, 188, 161, 171, 187, 9617, 9618, 9619, 9474, 9508, 193, 194, 192, 169, 9571, 9553, 9559, 9565, 162, 165, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 227, 195, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 164, 186, 170, 202, 203, 200, 65533, 205, 206, 207, 9496, 9484, 9608, 9604, 166, 204, 9600, 211, 223, 212, 210, 245, 213, 181, 65533, 215, 218, 219, 217, 236, 255, 175, 180, 173, 177, 65533, 190, 182, 167, 247, 184, 176, 168, 183, 185, 179, 178, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 22, 22, 22, 22, 22, 22, 22, 22, 70, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, }; static const unsigned short reverse_block[134]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 176, 192, 208, 224, 128, 240, 128, 256, 128, 258, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 274, 290, 303, 316, 128, 332, 348, 128, 364, 379, 395, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[411]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 173, 189, 156, 207, 190, 221, 245, 249, 184, 209, 174, 170, 240, 169, 238, 248, 241, 253, 252, 239, 230, 244, 250, 247, 251, 208, 175, 172, 171, 243, 168, 183, 181, 182, 199, 142, 143, 146, 128, 212, 144, 210, 211, 222, 214, 215, 216, 26, 165, 227, 224, 226, 229, 153, 232, 157, 235, 233, 234, 154, 26, 26, 225, 133, 160, 131, 198, 132, 134, 145, 135, 138, 130, 136, 137, 236, 161, 140, 139, 26, 164, 149, 162, 147, 228, 148, 246, 155, 151, 163, 150, 129, 26, 26, 237, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 166, 167, 152, 141, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 158, 159, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 26, 26, 201, 26, 26, 187, 26, 26, 200, 26, 26, 188, 26, 26, 204, 26, 26, 185, 26, 26, 203, 26, 26, 202, 26, 26, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 26, 26, 26, 26, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP857Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP857Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP857Codec::mibEnum() const { return 2047; } const FXchar* FXCP857Codec::name() const { return "IBM857"; } const FXchar* FXCP857Codec::mimeName() const { return "IBM857"; } const FXchar* const* FXCP857Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp857","IBM857","cp857","857","csIBM857",NULL}; return list; } } fox1.6-1.6.57/src/FXCP860Codec.cpp000066400000000000000000000166321326741342000160740ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP860Codec.h" namespace FX { FXIMPLEMENT(FXCP860Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP860.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 199, 252, 233, 226, 227, 224, 193, 231, 234, 202, 232, 205, 212, 236, 195, 194, 201, 192, 200, 244, 245, 242, 218, 249, 204, 213, 220, 162, 163, 217, 8359, 211, 225, 237, 243, 250, 241, 209, 170, 186, 191, 210, 172, 189, 188, 161, 171, 187, 9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, 9484, 9608, 9604, 9612, 9616, 9600, 945, 223, 915, 960, 931, 963, 181, 964, 934, 920, 937, 948, 8734, 966, 949, 8745, 8801, 177, 8805, 8804, 8992, 8993, 247, 8776, 176, 8729, 183, 8730, 8319, 178, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 61, 61, 61, 61, 61, 61, 61, 118,169,61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, }; static const unsigned short reverse_block[233]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 176, 191, 207, 222, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 235, 248, 263, 279, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 286, 128, 128, 302, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 310, 325, 128, 335, 128, 350, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 366, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 382, 398, 411, 424, 128, 440, 456, 128, 472, 488, 504, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[520]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 173, 155, 156, 26, 26, 26, 26, 26, 26, 166, 174, 170, 26, 26, 26, 248, 241, 253, 26, 26, 230, 26, 250, 26, 26, 167, 175, 172, 171, 26, 168, 145, 134, 143, 142, 26, 26, 26, 128, 146, 144, 137, 26, 152, 139, 26, 26, 165, 169, 159, 140, 153, 26, 26, 26, 157, 150, 26, 154, 26, 26, 225, 133, 160, 131, 132, 26, 26, 26, 135, 138, 130, 136, 26, 141, 161, 26, 26, 164, 149, 162, 147, 148, 26, 246, 26, 151, 163, 26, 129, 26, 26, 26, 226, 26, 26, 26, 26, 233, 26, 26, 26, 26, 26, 26, 26, 228, 26, 26, 232, 26, 26, 234, 26, 26, 26, 26, 26, 26, 224, 26, 26, 235, 238, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 227, 26, 26, 229, 231, 26, 237, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 252, 26, 26, 26, 26, 26, 26, 26, 158, 26, 26, 26, 26, 26, 26, 26, 26, 26, 249, 251, 26, 26, 26, 236, 26, 26, 26, 26, 26, 26, 26, 26, 26, 239, 26, 26, 26, 26, 26, 26, 26, 26, 247, 26, 26, 26, 26, 26, 26, 26, 240, 26, 26, 243, 242, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 244, 245, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 213, 214, 201, 184, 183, 187, 212, 211, 200, 190, 189, 188, 198, 199, 204, 181, 182, 185, 209, 210, 203, 207, 208, 202, 216, 215, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 221, 26, 26, 26, 222, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP860Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP860Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP860Codec::mibEnum() const { return 2048; } const FXchar* FXCP860Codec::name() const { return "IBM860"; } const FXchar* FXCP860Codec::mimeName() const { return "IBM860"; } const FXchar* const* FXCP860Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp860","IBM860","cp860","860","csIBM860",NULL}; return list; } } fox1.6-1.6.57/src/FXCP861Codec.cpp000066400000000000000000000171541326741342000160750ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP861Codec.h" namespace FX { FXIMPLEMENT(FXCP861Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP861.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 208, 240, 222, 196, 197, 201, 230, 198, 244, 246, 254, 251, 221, 253, 214, 220, 248, 163, 216, 8359, 402, 225, 237, 243, 250, 193, 205, 211, 218, 191, 8976, 172, 189, 188, 161, 171, 187, 9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, 9484, 9608, 9604, 9612, 9616, 9600, 945, 223, 915, 960, 931, 963, 181, 964, 934, 920, 937, 948, 8734, 966, 949, 8745, 8801, 177, 8805, 8804, 8992, 8993, 247, 8776, 176, 8729, 183, 8730, 8319, 178, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 61, 61, 61, 61, 61, 61, 61, 118,169,61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, }; static const unsigned short reverse_block[233]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 176, 192, 208, 224, 128, 128, 128, 128, 128, 128, 128, 128, 128, 239, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 252, 265, 280, 296, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 303, 128, 128, 319, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 327, 342, 128, 352, 128, 367, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 383, 399, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 415, 431, 444, 457, 128, 473, 489, 128, 505, 521, 537, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[553]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 173, 26, 156, 26, 26, 26, 26, 26, 26, 26, 174, 170, 26, 26, 26, 248, 241, 253, 26, 26, 230, 26, 250, 26, 26, 26, 175, 172, 171, 26, 168, 26, 164, 26, 26, 142, 143, 146, 128, 26, 144, 26, 26, 26, 165, 26, 26, 139, 26, 26, 166, 26, 26, 153, 26, 157, 26, 167, 26, 154, 151, 141, 225, 133, 160, 131, 26, 132, 134, 145, 135, 138, 130, 136, 137, 26, 161, 26, 26, 140, 26, 26, 162, 147, 26, 148, 246, 155, 26, 163, 150, 129, 152, 149, 26, 26, 159, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 226, 26, 26, 26, 26, 233, 26, 26, 26, 26, 26, 26, 26, 228, 26, 26, 232, 26, 26, 234, 26, 26, 26, 26, 26, 26, 224, 26, 26, 235, 238, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 227, 26, 26, 229, 231, 26, 237, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 252, 26, 26, 26, 26, 26, 26, 26, 158, 26, 26, 26, 26, 26, 26, 26, 26, 26, 249, 251, 26, 26, 26, 236, 26, 26, 26, 26, 26, 26, 26, 26, 26, 239, 26, 26, 26, 26, 26, 26, 26, 26, 247, 26, 26, 26, 26, 26, 26, 26, 240, 26, 26, 243, 242, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 169, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 244, 245, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 213, 214, 201, 184, 183, 187, 212, 211, 200, 190, 189, 188, 198, 199, 204, 181, 182, 185, 209, 210, 203, 207, 208, 202, 216, 215, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 221, 26, 26, 26, 222, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP861Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP861Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP861Codec::mibEnum() const { return 2049; } const FXchar* FXCP861Codec::name() const { return "IBM861"; } const FXchar* FXCP861Codec::mimeName() const { return "IBM861"; } const FXchar* const* FXCP861Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp861","IBM861","cp861","861","cp-is","csIBM861",NULL}; return list; } } fox1.6-1.6.57/src/FXCP862Codec.cpp000066400000000000000000000175711326741342000161010ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP862Codec.h" namespace FX { FXIMPLEMENT(FXCP862Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP862.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 162, 163, 165, 8359, 402, 225, 237, 243, 250, 241, 209, 170, 186, 191, 8976, 172, 189, 188, 161, 171, 187, 9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, 9484, 9608, 9604, 9612, 9616, 9600, 945, 223, 915, 960, 931, 963, 181, 964, 934, 920, 937, 948, 8734, 966, 949, 8745, 8801, 177, 8805, 8804, 8992, 8993, 247, 8776, 176, 8729, 183, 8730, 8319, 178, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 61, 92, 92, 92, 92, 92, 92, 149,200,92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, }; static const unsigned short reverse_block[264]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 128, 176, 192, 207, 128, 128, 128, 128, 128, 128, 128, 128, 128, 221, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 234, 247, 262, 278, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 294, 310, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 321, 128, 128, 337, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 345, 360, 128, 370, 128, 385, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 401, 417, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 433, 449, 462, 475, 128, 491, 507, 128, 523, 539, 555, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[571]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 173, 155, 156, 26, 157, 26, 26, 26, 26, 166, 174, 170, 26, 26, 26, 248, 241, 253, 26, 26, 230, 26, 250, 26, 26, 167, 175, 172, 171, 26, 168, 26, 165, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 225, 26, 160, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 161, 26, 26, 164, 26, 162, 26, 26, 26, 246, 26, 26, 163, 26, 26, 26, 26, 26, 159, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 226, 26, 26, 26, 26, 233, 26, 26, 26, 26, 26, 26, 26, 228, 26, 26, 232, 26, 26, 234, 26, 26, 26, 26, 26, 26, 224, 26, 26, 235, 238, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 227, 26, 26, 229, 231, 26, 237, 26, 26, 26, 26, 26, 26, 26, 26, 26, 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, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 252, 26, 26, 26, 26, 26, 26, 26, 158, 26, 26, 26, 26, 26, 26, 26, 26, 26, 249, 251, 26, 26, 26, 236, 26, 26, 26, 26, 26, 26, 26, 26, 26, 239, 26, 26, 26, 26, 26, 26, 26, 26, 247, 26, 26, 26, 26, 26, 26, 26, 240, 26, 26, 243, 242, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 169, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 244, 245, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 213, 214, 201, 184, 183, 187, 212, 211, 200, 190, 189, 188, 198, 199, 204, 181, 182, 185, 209, 210, 203, 207, 208, 202, 216, 215, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 221, 26, 26, 26, 222, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP862Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP862Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP862Codec::mibEnum() const { return 2013; } const FXchar* FXCP862Codec::name() const { return "IBM862"; } const FXchar* FXCP862Codec::mimeName() const { return "IBM862"; } const FXchar* const* FXCP862Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp862","IBM862","cp862","862","csPC862LatinHebrew",NULL}; return list; } } fox1.6-1.6.57/src/FXCP863Codec.cpp000066400000000000000000000172031326741342000160720ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP863Codec.h" namespace FX { FXIMPLEMENT(FXCP863Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP863.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 199, 252, 233, 226, 194, 224, 182, 231, 234, 235, 232, 239, 238, 8215, 192, 167, 201, 200, 202, 244, 203, 207, 251, 249, 164, 212, 220, 162, 163, 217, 219, 402, 166, 180, 243, 250, 168, 184, 179, 175, 206, 8976, 172, 189, 188, 190, 171, 187, 9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, 9484, 9608, 9604, 9612, 9616, 9600, 945, 223, 915, 960, 931, 963, 181, 964, 934, 920, 937, 948, 8734, 966, 949, 8745, 8801, 177, 8805, 8804, 8992, 8993, 247, 8776, 176, 8729, 183, 8730, 8319, 178, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 61, 61, 61, 61, 61, 61, 61, 124,175,61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, }; static const unsigned short reverse_block[239]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 176, 192, 208, 224, 128, 128, 128, 128, 128, 128, 128, 128, 128, 238, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 251, 264, 279, 295, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 304, 128, 128, 128, 128, 128, 312, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 328, 343, 128, 353, 128, 368, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 384, 400, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 416, 432, 445, 458, 128, 474, 490, 128, 506, 522, 538, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[554]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 26, 155, 156, 152, 26, 160, 143, 164, 26, 26, 174, 170, 26, 26, 167, 248, 241, 253, 166, 161, 230, 134, 250, 165, 26, 26, 175, 172, 171, 173, 26, 142, 26, 132, 26, 26, 26, 26, 128, 145, 144, 146, 148, 26, 26, 168, 149, 26, 26, 26, 26, 153, 26, 26, 26, 26, 157, 26, 158, 154, 26, 26, 225, 133, 26, 131, 26, 26, 26, 26, 135, 138, 130, 136, 137, 26, 26, 140, 139, 26, 26, 26, 162, 147, 26, 26, 246, 26, 151, 163, 150, 129, 26, 26, 26, 159, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 226, 26, 26, 26, 26, 233, 26, 26, 26, 26, 26, 26, 26, 228, 26, 26, 232, 26, 26, 234, 26, 26, 26, 26, 26, 26, 224, 26, 26, 235, 238, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 227, 26, 26, 229, 231, 26, 237, 26, 26, 26, 26, 26, 26, 26, 26, 26, 141, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 252, 26, 26, 26, 26, 26, 26, 26, 26, 26, 249, 251, 26, 26, 26, 236, 26, 26, 26, 26, 26, 26, 26, 26, 26, 239, 26, 26, 26, 26, 26, 26, 26, 26, 247, 26, 26, 26, 26, 26, 26, 26, 240, 26, 26, 243, 242, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 169, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 244, 245, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 213, 214, 201, 184, 183, 187, 212, 211, 200, 190, 189, 188, 198, 199, 204, 181, 182, 185, 209, 210, 203, 207, 208, 202, 216, 215, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 221, 26, 26, 26, 222, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP863Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP863Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP863Codec::mibEnum() const { return 2050; } const FXchar* FXCP863Codec::name() const { return "IBM863"; } const FXchar* FXCP863Codec::mimeName() const { return "IBM863"; } const FXchar* const* FXCP863Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp863","IBM863","cp863","863","csIBM863",NULL}; return list; } } fox1.6-1.6.57/src/FXCP864Codec.cpp000066400000000000000000000177351326741342000161050ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP864Codec.h" namespace FX { FXIMPLEMENT(FXCP864Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP864.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 1642, 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, 176, 183, 8729, 8730, 9618, 9472, 9474, 9532, 9508, 9516, 9500, 9524, 9488, 9484, 9492, 9496, 946, 8734, 966, 177, 189, 188, 8776, 171, 187, 65271, 65272, 65533, 65533, 65275, 65276, 65533, 160, 173, 65154, 163, 164, 65156, 65533, 65533, 65166, 65167, 65173, 65177, 1548, 65181, 65185, 65189, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 65233, 1563, 65201, 65205, 65209, 1567, 162, 65152, 65153, 65155, 65157, 65226, 65163, 65165, 65169, 65171, 65175, 65179, 65183, 65187, 65191, 65193, 65195, 65197, 65199, 65203, 65207, 65211, 65215, 65217, 65221, 65227, 65231, 166, 172, 247, 215, 65225, 1600, 65235, 65239, 65243, 65247, 65251, 65255, 65259, 65261, 65263, 65267, 65213, 65228, 65230, 65229, 65249, 65149, 1617, 65253, 65257, 65260, 65264, 65266, 65232, 65237, 65269, 65270, 65245, 65241, 65265, 9632, 65533, }; static const unsigned char reverse_plane[17]={ 0, 64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64, }; static const unsigned char reverse_pages[128]={ 0, 61, 100,100,100,100,100,100,131,179,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,100,206, 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,100,100,100,100,100,100,100,100,100,100,100,100, }; static const unsigned short reverse_block[270]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 128, 174, 128, 183, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 197, 207, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 214, 227, 128, 128, 243, 258, 274, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 285, 128, 128, 300, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 316, 332, 345, 358, 128, 128, 128, 128, 128, 372, 388, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 391, 407, 423, 439, 455, 471, 487, 503, 519, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[535]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 26, 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, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 160, 26, 192, 163, 164, 26, 219, 26, 26, 26, 26, 151, 220, 161, 26, 26, 128, 147, 26, 26, 26, 26, 26, 129, 26, 26, 26, 152, 149, 148, 26, 26, 26, 26, 26, 26, 26, 222, 26, 26, 26, 26, 26, 26, 26, 26, 221, 26, 26, 26, 26, 26, 26, 26, 26, 144, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 146, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 172, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 187, 26, 26, 26, 191, 224, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 241, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 37, 26, 26, 26, 26, 26, 26, 26, 26, 26, 130, 131, 26, 26, 26, 145, 26, 26, 26, 26, 26, 26, 26, 26, 150, 26, 26, 26, 26, 26, 26, 26, 133, 26, 134, 26, 26, 26, 26, 26, 26, 26, 26, 26, 141, 26, 26, 26, 140, 26, 26, 26, 142, 26, 26, 26, 143, 26, 26, 26, 138, 26, 26, 26, 26, 136, 26, 26, 26, 26, 26, 26, 26, 137, 26, 26, 26, 26, 139, 26, 26, 26, 26, 26, 26, 26, 135, 26, 26, 26, 132, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 240, 26, 26, 193, 194, 162, 195, 165, 196, 26, 26, 26, 26, 26, 198, 26, 199, 168, 169, 26, 200, 26, 201, 26, 170, 26, 202, 26, 171, 26, 203, 26, 173, 26, 204, 26, 174, 26, 205, 26, 175, 26, 206, 26, 207, 26, 208, 26, 209, 26, 210, 26, 188, 26, 211, 26, 189, 26, 212, 26, 190, 26, 213, 26, 235, 26, 214, 26, 215, 26, 26, 26, 216, 26, 26, 26, 223, 197, 217, 236, 238, 237, 218, 247, 186, 26, 225, 26, 248, 26, 226, 26, 252, 26, 227, 26, 251, 26, 228, 26, 239, 26, 229, 26, 242, 26, 230, 26, 243, 26, 231, 244, 232, 26, 233, 245, 253, 246, 234, 26, 249, 250, 153, 154, 26, 26, 157, 158, 26, 26, 26, }; FXint FXCP864Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP864Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP864Codec::mibEnum() const { return 2051; } const FXchar* FXCP864Codec::name() const { return "IBM864"; } const FXchar* FXCP864Codec::mimeName() const { return "IBM864"; } const FXchar* const* FXCP864Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp864","IBM864","cp864","csIBM864",NULL}; return list; } } fox1.6-1.6.57/src/FXCP865Codec.cpp000066400000000000000000000171441326741342000161000ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP865Codec.h" namespace FX { FXIMPLEMENT(FXCP865Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP865.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 239, 238, 236, 196, 197, 201, 230, 198, 244, 246, 242, 251, 249, 255, 214, 220, 248, 163, 216, 8359, 402, 225, 237, 243, 250, 241, 209, 170, 186, 191, 8976, 172, 189, 188, 161, 171, 164, 9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, 9484, 9608, 9604, 9612, 9616, 9600, 945, 223, 915, 960, 931, 963, 181, 964, 934, 920, 937, 948, 8734, 966, 949, 8745, 8801, 177, 8805, 8804, 8992, 8993, 247, 8776, 176, 8729, 183, 8730, 8319, 178, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 61, 61, 61, 61, 61, 61, 61, 118,169,61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, }; static const unsigned short reverse_block[233]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 176, 191, 207, 223, 128, 128, 128, 128, 128, 128, 128, 128, 128, 239, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 252, 265, 280, 296, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 303, 128, 128, 319, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 327, 342, 128, 352, 128, 367, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 383, 399, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 415, 431, 444, 457, 128, 473, 489, 128, 505, 521, 537, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[553]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 173, 26, 156, 175, 26, 26, 26, 26, 26, 166, 174, 170, 26, 26, 26, 248, 241, 253, 26, 26, 230, 26, 250, 26, 26, 167, 26, 172, 171, 26, 168, 26, 26, 26, 26, 142, 143, 146, 128, 26, 144, 26, 26, 26, 26, 26, 26, 165, 26, 26, 26, 26, 153, 26, 157, 26, 26, 26, 154, 26, 26, 225, 133, 160, 131, 26, 132, 134, 145, 135, 138, 130, 136, 137, 141, 161, 140, 139, 26, 164, 149, 162, 147, 26, 148, 246, 155, 151, 163, 150, 129, 26, 26, 152, 26, 26, 159, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 226, 26, 26, 26, 26, 233, 26, 26, 26, 26, 26, 26, 26, 228, 26, 26, 232, 26, 26, 234, 26, 26, 26, 26, 26, 26, 224, 26, 26, 235, 238, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 227, 26, 26, 229, 231, 26, 237, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 252, 26, 26, 26, 26, 26, 26, 26, 158, 26, 26, 26, 26, 26, 26, 26, 26, 26, 249, 251, 26, 26, 26, 236, 26, 26, 26, 26, 26, 26, 26, 26, 26, 239, 26, 26, 26, 26, 26, 26, 26, 26, 247, 26, 26, 26, 26, 26, 26, 26, 240, 26, 26, 243, 242, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 169, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 244, 245, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 213, 214, 201, 184, 183, 187, 212, 211, 200, 190, 189, 188, 198, 199, 204, 181, 182, 185, 209, 210, 203, 207, 208, 202, 216, 215, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 221, 26, 26, 26, 222, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP865Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP865Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP865Codec::mibEnum() const { return 2052; } const FXchar* FXCP865Codec::name() const { return "IBM865"; } const FXchar* FXCP865Codec::mimeName() const { return "IBM865"; } const FXchar* const* FXCP865Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp865","IBM865","cp865","865","csIBM865",NULL}; return list; } } fox1.6-1.6.57/src/FXCP866Codec.cpp000066400000000000000000000155561326741342000161060ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP866Codec.h" namespace FX { FXIMPLEMENT(FXCP866Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP866.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, 9484, 9608, 9604, 9612, 9616, 9600, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1025, 1105, 1028, 1108, 1031, 1111, 1038, 1118, 176, 8729, 183, 8730, 8470, 164, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 64, 70, 70, 70, 70, 70, 70, 117,165,70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, }; static const unsigned short reverse_block[229]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 175, 191, 207, 223, 239, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 270, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 277, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 293, 309, 322, 335, 128, 351, 367, 128, 383, 399, 415, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[431]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 26, 26, 26, 253, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 248, 26, 26, 26, 26, 26, 26, 250, 26, 26, 26, 26, 26, 26, 26, 26, 240, 26, 26, 242, 26, 26, 244, 26, 26, 26, 26, 26, 26, 246, 26, 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, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 26, 241, 26, 26, 243, 26, 26, 245, 26, 26, 26, 26, 26, 26, 247, 26, 26, 26, 26, 26, 26, 252, 26, 26, 26, 26, 26, 26, 26, 26, 26, 249, 251, 26, 26, 26, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 213, 214, 201, 184, 183, 187, 212, 211, 200, 190, 189, 188, 198, 199, 204, 181, 182, 185, 209, 210, 203, 207, 208, 202, 216, 215, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 221, 26, 26, 26, 222, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP866Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP866Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP866Codec::mibEnum() const { return 2086; } const FXchar* FXCP866Codec::name() const { return "IBM866"; } const FXchar* FXCP866Codec::mimeName() const { return "IBM866"; } const FXchar* const* FXCP866Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp866","IBM866","cp866","866","csIBM866",NULL}; return list; } } fox1.6-1.6.57/src/FXCP869Codec.cpp000066400000000000000000000154021326741342000160770ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP869Codec.h" namespace FX { FXIMPLEMENT(FXCP869Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP869.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 65533, 65533, 65533, 65533, 65533, 65533, 902, 65533, 183, 172, 166, 8216, 8217, 904, 8213, 905, 906, 938, 908, 65533, 65533, 910, 939, 169, 911, 178, 179, 940, 163, 941, 942, 943, 970, 912, 972, 973, 913, 914, 915, 916, 917, 918, 919, 189, 920, 921, 171, 187, 9617, 9618, 9619, 9474, 9508, 922, 923, 924, 925, 9571, 9553, 9559, 9565, 926, 927, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 928, 929, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 931, 932, 933, 934, 935, 936, 937, 945, 946, 947, 9496, 9484, 9608, 9604, 948, 949, 9600, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 963, 962, 964, 900, 173, 177, 965, 966, 967, 167, 968, 901, 176, 168, 969, 971, 944, 974, 9632, 160, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 61, 61, 61, 61, 61, 61, 61, 124,172,61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, }; static const unsigned short reverse_block[236]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 174, 190, 206, 222, 238, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 253, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 269, 285, 298, 311, 128, 327, 343, 128, 359, 374, 390, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[406]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 255, 26, 26, 156, 26, 26, 138, 245, 249, 151, 26, 174, 137, 240, 26, 26, 248, 241, 153, 154, 26, 26, 26, 136, 26, 26, 26, 175, 26, 171, 26, 26, 26, 26, 239, 247, 134, 26, 141, 143, 144, 26, 146, 26, 149, 152, 161, 164, 165, 166, 167, 168, 169, 170, 172, 173, 181, 182, 183, 184, 189, 190, 198, 199, 26, 207, 208, 209, 210, 211, 212, 213, 145, 150, 155, 157, 158, 159, 252, 214, 215, 216, 221, 222, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 237, 236, 238, 242, 243, 244, 246, 250, 160, 251, 162, 163, 253, 26, 26, 26, 26, 26, 142, 26, 26, 139, 140, 26, 26, 26, 26, 26, 26, 196, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 218, 26, 26, 26, 191, 26, 26, 26, 192, 26, 26, 26, 217, 26, 26, 26, 195, 26, 26, 26, 26, 180, 26, 26, 26, 26, 26, 26, 26, 194, 26, 26, 26, 26, 193, 26, 26, 26, 26, 26, 26, 26, 197, 26, 26, 26, 205, 186, 26, 26, 201, 26, 26, 187, 26, 26, 200, 26, 26, 188, 26, 26, 204, 26, 26, 185, 26, 26, 203, 26, 26, 202, 26, 26, 206, 26, 26, 26, 223, 26, 26, 26, 220, 26, 26, 26, 219, 26, 26, 26, 26, 26, 26, 26, 176, 177, 178, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 254, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXCP869Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP869Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP869Codec::mibEnum() const { return 2054; } const FXchar* FXCP869Codec::name() const { return "IBM869"; } const FXchar* FXCP869Codec::mimeName() const { return "IBM869"; } const FXchar* const* FXCP869Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp869","IBM869","cp869","869","cp-gr","csIBM869",NULL}; return list; } } fox1.6-1.6.57/src/FXCP874Codec.cpp000066400000000000000000000133541326741342000160770ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXCP874Codec.h" namespace FX { FXIMPLEMENT(FXCP874Codec,FXTextCodec,NULL,0) //// Created by codec tool on 03/25/2005 from: CP874.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 8364, 65533, 65533, 65533, 65533, 8230, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 65533, 160, 3585, 3586, 3587, 3588, 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 65533, 65533, 65533, 65533, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 65533, 65533, 65533, 65533, }; static const unsigned char reverse_plane[17]={ 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, }; static const unsigned char reverse_pages[73]={ 0, 11, 11, 43, 11, 11, 11, 11, 106,11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, }; static const unsigned short reverse_block[170]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 159, 175, 191, 207, 223, 239, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 252, 266, 128, 128, 128, 128, 128, 128, 128, 273, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[289]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 160, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 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, 26, 26, 26, 26, 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, 26, 26, 26, 26, 150, 151, 26, 26, 26, 145, 146, 26, 26, 147, 148, 26, 26, 149, 26, 26, 26, 133, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 128, 26, 26, 26, }; FXint FXCP874Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXCP874Codec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXCP874Codec::mibEnum() const { return 5; } const FXchar* FXCP874Codec::name() const { return "IBM874"; } const FXchar* FXCP874Codec::mimeName() const { return "IBM874"; } const FXchar* const* FXCP874Codec::aliases() const { static const FXchar *const list[]={"microsoft-cp874","IBM874","cp874","874",NULL}; return list; } } fox1.6-1.6.57/src/FXCURCursor.cpp000066400000000000000000000063631326741342000162250ustar00rootroot00000000000000/******************************************************************************** * * * C U R C u r s o r O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Sander Jansen. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXCURCursor.cpp,v 1.25 2006/01/22 17:58:18 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXCURCursor.h" /* Notes: - Tossed old code now that FXCursor has an RGBA representation. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXCURCursor::fileExt[]="cur"; // Object implementation FXIMPLEMENT(FXCURCursor,FXCursor,NULL,0) // Constructor FXCURCursor::FXCURCursor(FXApp* a,const void *pix):FXCursor(a,NULL,0,0,0,0){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); fxloadICO(ms,data,width,height,hotx,hoty); options|=CURSOR_OWNED; ms.close(); } } // Save pixel data only, in CUR format bool FXCURCursor::savePixels(FXStream& store) const { if(fxsaveICO(store,data,width,height,hotx,hoty)){ return true; } return false; } // Load cursor mask and image bool FXCURCursor::loadPixels(FXStream & store){ if(options&CURSOR_OWNED){FXFREE(&data);} if(fxloadICO(store,data,width,height,hotx,hoty)){ options|=CURSOR_OWNED; return true; } return false; } // Destroy FXCURCursor::~FXCURCursor(){ } } fox1.6-1.6.57/src/FXCanvas.cpp000066400000000000000000000060201326741342000155770ustar00rootroot00000000000000/******************************************************************************** * * * C a n v a s W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXCanvas.cpp,v 1.35 2006/01/22 17:58:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXCanvas.h" using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXCanvas) FXCanvasMap[]={ FXMAPFUNC(SEL_PAINT,0,FXCanvas::onPaint) }; // Object implementation FXIMPLEMENT(FXCanvas,FXWindow,FXCanvasMap,ARRAYNUMBER(FXCanvasMap)) // For serialization FXCanvas::FXCanvas(){ flags|=FLAG_ENABLED|FLAG_SHOWN; } // Make a canvas FXCanvas::FXCanvas(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXWindow(p,opts,x,y,w,h){ flags|=FLAG_ENABLED|FLAG_SHOWN; backColor=getApp()->getBackColor(); target=tgt; message=sel; } // It can be focused on bool FXCanvas::canFocus() const { return true; } // Canvas is an object drawn by another long FXCanvas::onPaint(FXObject*,FXSelector,void* ptr){ return target && target->handle(this,FXSEL(SEL_PAINT,message),ptr); } } fox1.6-1.6.57/src/FXCheckButton.cpp000066400000000000000000000330151326741342000166010ustar00rootroot00000000000000/******************************************************************************** * * * C h e c k B u t t o n O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXCheckButton.cpp,v 1.58 2006/01/22 17:58:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXCheckButton.h" /* Notes: - Works as intended. */ #define CHECKBUTTON_MASK (CHECKBUTTON_AUTOGRAY|CHECKBUTTON_AUTOHIDE|CHECKBUTTON_PLUS) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXCheckButton) FXCheckButtonMap[]={ FXMAPFUNC(SEL_PAINT,0,FXCheckButton::onPaint), FXMAPFUNC(SEL_UPDATE,0,FXCheckButton::onUpdate), FXMAPFUNC(SEL_ENTER,0,FXCheckButton::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXCheckButton::onLeave), FXMAPFUNC(SEL_FOCUSIN,0,FXCheckButton::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXCheckButton::onFocusOut), FXMAPFUNC(SEL_UNGRABBED,0,FXCheckButton::onUngrabbed), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXCheckButton::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXCheckButton::onLeftBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXCheckButton::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXCheckButton::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXWindow::ID_HOTKEY,FXCheckButton::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXWindow::ID_HOTKEY,FXCheckButton::onHotKeyRelease), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_CHECK,FXCheckButton::onCheck), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNCHECK,FXCheckButton::onUncheck), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNKNOWN,FXCheckButton::onUnknown), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXCheckButton::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETINTVALUE,FXCheckButton::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETINTVALUE,FXCheckButton::onCmdGetIntValue), }; // Object implementation FXIMPLEMENT(FXCheckButton,FXLabel,FXCheckButtonMap,ARRAYNUMBER(FXCheckButtonMap)) // Deserialization FXCheckButton::FXCheckButton(){ checkColor=0; boxColor=0; check=FALSE; oldcheck=FALSE; } // Make a check button FXCheckButton::FXCheckButton(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXLabel(p,text,NULL,opts,x,y,w,h,pl,pr,pt,pb){ checkColor=getApp()->getForeColor(); boxColor=getApp()->getBackColor(); target=tgt; message=sel; check=FALSE; oldcheck=FALSE; } // If window can have focus bool FXCheckButton::canFocus() const { return true; } // Get default width FXint FXCheckButton::getDefaultWidth(){ FXint tw=0,s=0,w; if(!label.empty()){ tw=labelWidth(label); s=4; } if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w=FXMAX(tw,13); else w=tw+13+s; return padleft+padright+w+(border<<1); } // Get default height FXint FXCheckButton::getDefaultHeight(){ FXint th=0,h; if(!label.empty()){ th=labelHeight(label); } if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h=FXMAX(th,13); else h=th+13; return padtop+padbottom+h+(border<<1); } // Check button void FXCheckButton::setCheck(FXbool state,FXbool notify){ if(check!=state){ check=state; update(); if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)check);} } } // Change state to checked long FXCheckButton::onCheck(FXObject*,FXSelector,void*){ setCheck(TRUE); return 1; } // Change state to unchecked long FXCheckButton::onUncheck(FXObject*,FXSelector,void*){ setCheck(FALSE); return 1; } // Change state to indeterminate long FXCheckButton::onUnknown(FXObject*,FXSelector,void*){ setCheck(MAYBE); return 1; } // Update value from a message long FXCheckButton::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCheck((FXbool)(FXuval)ptr); return 1; } // Update value from a message long FXCheckButton::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setCheck((FXbool)*((FXint*)ptr)); return 1; } // Obtain value from text field long FXCheckButton::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getCheck(); return 1; } // Implement auto-hide or auto-gray modes long FXCheckButton::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ if(!FXLabel::onUpdate(sender,sel,ptr)){ if(options&CHECKBUTTON_AUTOHIDE){if(shown()){hide();recalc();}} if(options&CHECKBUTTON_AUTOGRAY){disable();} } return 1; } // Gained focus long FXCheckButton::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusIn(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Lost focus long FXCheckButton::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusOut(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Entered button long FXCheckButton::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onEnter(sender,sel,ptr); if(isEnabled() && (flags&FLAG_PRESSED)) setCheck(!oldcheck); return 1; } // Left button long FXCheckButton::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onLeave(sender,sel,ptr); if(isEnabled() && (flags&FLAG_PRESSED)) setCheck(oldcheck); return 1; } // Pressed mouse button long FXCheckButton::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; oldcheck=check; setCheck(!oldcheck); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; return 1; } return 0; } // Released mouse button long FXCheckButton::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled() && (flags&FLAG_PRESSED)){ ungrab(); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(check!=oldcheck && target){ target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)check); } return 1; } return 0; } // The widget lost the grab for some reason long FXCheckButton::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onUngrabbed(sender,sel,ptr); setCheck(oldcheck); flags&=~FLAG_PRESSED; flags|=FLAG_UPDATE; return 1; } // Key Press long FXCheckButton::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ oldcheck=check; setCheck(!oldcheck); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; return 1; } } return 0; } // Key Release long FXCheckButton::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && (flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; if(check!=oldcheck && target){ target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)check); } return 1; } } return 0; } // Hot key combination pressed long FXCheckButton::onHotKeyPress(FXObject*,FXSelector,void* ptr){ handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ oldcheck=check; setCheck(!oldcheck); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; } return 1; } // Hot key combination released long FXCheckButton::onHotKeyRelease(FXObject*,FXSelector,void*){ if(isEnabled() && (flags&FLAG_PRESSED)){ flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; if(check!=oldcheck && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)check); } return 1; } // Handle repaint long FXCheckButton::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXint tw=0,th=0,tx,ty,ix,iy; FXDCWindow dc(this,ev); // Figure text size if(!label.empty()){ tw=labelWidth(label); th=labelHeight(label); } // Placement just_x(tx,ix,tw,13); just_y(ty,iy,th,13); // Widget background dc.setForeground(backColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); // Check background if(check==MAYBE || !isEnabled()) dc.setForeground(baseColor); else dc.setForeground(boxColor); dc.fillRectangle(ix+2,iy+2,9,9); // Check border if(options&CHECKBUTTON_PLUS){ dc.setForeground(textColor); dc.drawRectangle(ix+2,iy+2,8,8); } else{ dc.setForeground(shadowColor); dc.fillRectangle(ix,iy,12,1); dc.fillRectangle(ix,iy,1,12); dc.setForeground(borderColor); dc.fillRectangle(ix+1,iy+1,10,1); dc.fillRectangle(ix+1,iy+1,1,10); dc.setForeground(hiliteColor); dc.fillRectangle(ix,iy+12,13,1); dc.fillRectangle(ix+12,iy,1,13); dc.setForeground(baseColor); dc.fillRectangle(ix+1,iy+11,11,1); dc.fillRectangle(ix+11,iy+1,1,11); } // Check color if(check==MAYBE || !isEnabled()) dc.setForeground(shadowColor); else dc.setForeground(checkColor); // Show as + if(options&CHECKBUTTON_PLUS){ if(check!=TRUE){ dc.fillRectangle(ix+6,iy+4,1,5); } dc.fillRectangle(ix+4,iy+6,5,1); } // Show as v else{ if(check!=FALSE){ FXSegment seg[6]; #ifndef WIN32 seg[0].x1=3+ix; seg[0].y1=5+iy; seg[0].x2=5+ix; seg[0].y2=7+iy; seg[1].x1=3+ix; seg[1].y1=6+iy; seg[1].x2=5+ix; seg[1].y2=8+iy; seg[2].x1=3+ix; seg[2].y1=7+iy; seg[2].x2=5+ix; seg[2].y2=9+iy; seg[3].x1=5+ix; seg[3].y1=7+iy; seg[3].x2=9+ix; seg[3].y2=3+iy; seg[4].x1=5+ix; seg[4].y1=8+iy; seg[4].x2=9+ix; seg[4].y2=4+iy; seg[5].x1=5+ix; seg[5].y1=9+iy; seg[5].x2=9+ix; seg[5].y2=5+iy; #else seg[0].x1=3+ix; seg[0].y1=5+iy; seg[0].x2=5+ix; seg[0].y2=7+iy; seg[1].x1=3+ix; seg[1].y1=6+iy; seg[1].x2=5+ix; seg[1].y2=8+iy; seg[2].x1=3+ix; seg[2].y1=7+iy; seg[2].x2=5+ix; seg[2].y2=9+iy; seg[3].x1=5+ix; seg[3].y1=7+iy; seg[3].x2=10+ix; seg[3].y2=2+iy; seg[4].x1=5+ix; seg[4].y1=8+iy; seg[4].x2=10+ix; seg[4].y2=3+iy; seg[5].x1=5+ix; seg[5].y1=9+iy; seg[5].x2=10+ix; seg[5].y2=4+iy; #endif dc.drawLineSegments(seg,6); } } // Text if(!label.empty()){ dc.setFont(font); if(isEnabled()){ dc.setForeground(textColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); if(hasFocus()){ dc.drawFocusRectangle(tx-1,ty-1,tw+2,th+2); } } else{ dc.setForeground(hiliteColor); drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } } // Frame drawFrame(dc,0,0,width,height); return 1; } // Set check color void FXCheckButton::setCheckColor(FXColor clr){ if(clr!=checkColor){ checkColor=clr; update(); } } // Set box color void FXCheckButton::setBoxColor(FXColor clr){ if(clr!=boxColor){ boxColor=clr; update(); } } // Change check button style void FXCheckButton::setCheckButtonStyle(FXuint style){ FXuint opts=(options&~CHECKBUTTON_MASK) | (style&CHECKBUTTON_MASK); if(options!=opts){ options=opts; update(); } } // Return current check button style FXuint FXCheckButton::getCheckButtonStyle() const { return (options&CHECKBUTTON_MASK); } // Save object to stream void FXCheckButton::save(FXStream& store) const { FXLabel::save(store); store << checkColor; store << boxColor; } // Load object from stream void FXCheckButton::load(FXStream& store){ FXLabel::load(store); store >> checkColor; store >> boxColor; } } fox1.6-1.6.57/src/FXChoiceBox.cpp000066400000000000000000000200171326741342000162310ustar00rootroot00000000000000/******************************************************************************** * * * C h o i c e B o x * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXChoiceBox.cpp,v 1.14 2006/01/22 17:58:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObjectList.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXIcon.h" #include "FXSeparator.h" #include "FXLabel.h" #include "FXButton.h" #include "FXHorizontalFrame.h" #include "FXVerticalFrame.h" #include "FXScrollBar.h" #include "FXList.h" #include "FXChoiceBox.h" #include "icons.h" /* Notes: - Maybe allow setting initial value which selected. - Maybe have multiple choice capability. - Maybe have list of icons for each list item. */ // Padding for message box buttons #define HORZ_PAD 30 #define VERT_PAD 2 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXChoiceBox) FXChoiceBoxMap[]={ FXMAPFUNC(SEL_COMMAND,FXChoiceBox::ID_CANCEL,FXChoiceBox::onCmdCancel), FXMAPFUNC(SEL_COMMAND,FXChoiceBox::ID_ACCEPT,FXChoiceBox::onCmdClicked), FXMAPFUNC(SEL_DOUBLECLICKED,FXChoiceBox::ID_CLICKED,FXChoiceBox::onCmdClicked), }; // Object implementation FXIMPLEMENT(FXChoiceBox,FXDialogBox,FXChoiceBoxMap,ARRAYNUMBER(FXChoiceBoxMap)) // Construct choice box with given caption, icon, message text, and with choices from array of strings FXChoiceBox::FXChoiceBox(FXWindow* owner,const FXString& caption,const FXString& text,FXIcon* icon,const FXchar** choices,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(owner,caption,opts|DECOR_TITLE|DECOR_BORDER,x,y,w,h,10,10,10,10, 10,10){ register FXint n; initialize(text,icon); n=list->fillItems(choices); list->setNumVisible(FXMIN(n,5)); } // Construct choice box with given caption, icon, message text, and with choices from newline separated strings FXChoiceBox::FXChoiceBox(FXWindow* owner,const FXString& caption,const FXString& text,FXIcon* icon,const FXString& choices,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(owner,caption,opts|DECOR_TITLE|DECOR_BORDER,x,y,w,h,10,10,10,10, 10,10){ register FXint n; initialize(text,icon); n=list->fillItems(choices); list->setNumVisible(FXMIN(n,5)); } // Construct free floating choice box with given caption, icon, message text, and with choices from array of strings FXChoiceBox::FXChoiceBox(FXApp* a,const FXString& caption,const FXString& text,FXIcon* icon,const FXchar** choices,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(a,caption,opts|DECOR_TITLE|DECOR_BORDER,x,y,w,h,10,10,10,10, 10,10){ register FXint n; initialize(text,icon); n=list->fillItems(choices); list->setNumVisible(FXMIN(n,5)); } // Construct free floating choice box with given caption, icon, message text, and with choices from newline separated strings FXChoiceBox::FXChoiceBox(FXApp* a,const FXString& caption,const FXString& text,FXIcon* icon,const FXString& choices,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(a,caption,opts|DECOR_TITLE|DECOR_BORDER,x,y,w,h,10,10,10,10, 10,10){ register FXint n; initialize(text,icon); n=list->fillItems(choices); list->setNumVisible(FXMIN(n,5)); } // Build contents void FXChoiceBox::initialize(const FXString& text,FXIcon* icon){ FXHorizontalFrame* buttons=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0,0,0,0,0); new FXButton(buttons,tr("&OK"),NULL,this,ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXButton(buttons,tr("&Cancel"),NULL,this,ID_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXHorizontalSeparator(this,SEPARATOR_GROOVE|LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); FXHorizontalFrame* toppart=new FXHorizontalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X,0,0,0,0, 0,0,0,0, 10,10); new FXLabel(toppart,FXString::null,icon,ICON_BEFORE_TEXT|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|LAYOUT_FILL_Y|LAYOUT_FILL_X); new FXLabel(toppart,text,NULL,JUSTIFY_LEFT|ICON_BEFORE_TEXT|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X); FXHorizontalFrame* midpart=new FXHorizontalFrame(this,FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0, 10,10); list=new FXList(midpart,this,ID_CLICKED,LIST_BROWSESELECT|LAYOUT_FILL_Y|LAYOUT_FILL_X|HSCROLLING_OFF); } // Close dialog when double-clicked in list or hit accept long FXChoiceBox::onCmdClicked(FXObject*,FXSelector,void*){ getApp()->stopModal(this,list->getCurrentItem()); hide(); return 1; } // Close dialog with a cancel long FXChoiceBox::onCmdCancel(FXObject*,FXSelector,void*){ getApp()->stopModal(this,-1); hide(); return 1; } // Save object to stream void FXChoiceBox::save(FXStream& store) const { FXDialogBox::save(store); store << list; } // Load object from stream void FXChoiceBox::load(FXStream& store){ FXDialogBox::load(store); store >> list; } // Destroy choice box FXChoiceBox::~FXChoiceBox(){ list=(FXList*)-1L; } /*******************************************************************************/ // Show a modal choice dialog FXint FXChoiceBox::ask(FXWindow* owner,FXuint opts,const FXString& caption,const FXString& text,FXIcon* icon,const FXchar** choices){ FXChoiceBox box(owner,caption,text,icon,choices,opts); return box.execute(PLACEMENT_OWNER); } // Show a modal choice dialog FXint FXChoiceBox::ask(FXWindow* owner,FXuint opts,const FXString& caption,const FXString& text,FXIcon* icon,const FXString& choices){ FXChoiceBox box(owner,caption,text,icon,choices,opts); return box.execute(PLACEMENT_OWNER); } // Show a modal choice dialog, in free floating window FXint FXChoiceBox::ask(FXApp* app,FXuint opts,const FXString& caption,const FXString& text,FXIcon* icon,const FXchar** choices){ FXChoiceBox box(app,caption,text,icon,choices,opts); return box.execute(PLACEMENT_SCREEN); } // Show a modal choice dialog, in free floating window FXint FXChoiceBox::ask(FXApp* app,FXuint opts,const FXString& caption,const FXString& text,FXIcon* icon,const FXString& choices){ FXChoiceBox box(app,caption,text,icon,choices,opts); return box.execute(PLACEMENT_SCREEN); } } fox1.6-1.6.57/src/FXColorBar.cpp000066400000000000000000000260311326741342000160730ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorBar.cpp,v 1.31 2006/01/22 17:58:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXColorBar.h" /* Notes: */ #define BAR_WIDTH 30 #define BAR_MASK (COLORBAR_HORIZONTAL|COLORBAR_VERTICAL) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXColorBar) FXColorBarMap[]={ FXMAPFUNC(SEL_PAINT,0,FXColorBar::onPaint), FXMAPFUNC(SEL_MOTION,0,FXColorBar::onMotion), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXColorBar::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXColorBar::onLeftBtnRelease), FXMAPFUNC(SEL_QUERY_TIP,0,FXColorBar::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXColorBar::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXColorBar::ID_SETHELPSTRING,FXColorBar::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXColorBar::ID_GETHELPSTRING,FXColorBar::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXColorBar::ID_SETTIPSTRING,FXColorBar::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXColorBar::ID_GETTIPSTRING,FXColorBar::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXColorBar,FXFrame,FXColorBarMap,ARRAYNUMBER(FXColorBarMap)) // Init FXColorBar::FXColorBar(){ flags|=FLAG_ENABLED; hsv[0]=0.0f; hsv[1]=0.0f; hsv[2]=1.0f; } // Make a color bar FXColorBar::FXColorBar(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_ENABLED; target=tgt; message=sel; bar=new FXImage(getApp(),NULL,IMAGE_DITHER|IMAGE_KEEP|IMAGE_OWNED|IMAGE_SHMI|IMAGE_SHMP,1,1); hsv[0]=0.0f; hsv[1]=0.0f; hsv[2]=1.0f; } // Create window void FXColorBar::create(){ FXFrame::create(); updatebar(); bar->create(); } // Detach window void FXColorBar::detach(){ FXFrame::detach(); bar->detach(); } // Resize the bar void FXColorBar::layout(){ register FXint ww,hh; ww=width-padleft-padright-(border<<1)-4; hh=height-padtop-padbottom-(border<<1)-4; if(ww<1) ww=1; if(hh<1) hh=1; if(bar->getWidth()!=ww || bar->getHeight()!=hh){ bar->resize(ww,hh); updatebar(); bar->render(); } flags&=~FLAG_DIRTY; } // Recompute the bar image void FXColorBar::updatebar(){ register FXint x,y,w,h; register FXColor clr; FXfloat r,g,b,d; w=bar->getWidth(); h=bar->getHeight(); if(options&COLORBAR_VERTICAL){ if(1setPixel(x,y,clr); } } } else{ if(1setPixel(x,y,clr); } } } } // Get default width FXint FXColorBar::getDefaultWidth(){ FXint w=(options&COLORBAR_VERTICAL)?BAR_WIDTH:1; return w+4+padleft+padright+(border<<1); } // Get default height FXint FXColorBar::getDefaultHeight(){ FXint h=(options&COLORBAR_VERTICAL)?1:BAR_WIDTH; return h+4+padtop+padbottom+(border<<1); } // Set help using a message long FXColorBar::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXColorBar::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXColorBar::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXColorBar::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXColorBar::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXColorBar::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Handle repaint long FXColorBar::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); dc.setForeground(backColor); dc.fillRectangle(border,border,padleft,height-(border<<1)); dc.fillRectangle(width-padright-border,border,padright,height-(border<<1)); dc.fillRectangle(border+padleft,border,width-padleft-padright-(border<<1),padtop); dc.fillRectangle(border+padleft,height-padbottom-border,width-padleft-padright-(border<<1),padbottom); dc.drawImage(bar,padleft+border+2,padtop+border+2); drawDoubleSunkenRectangle(dc,padleft+border,padtop+border,width-padright-padleft-(border<<1),height-padbottom-padtop-(border<<1)); drawFrame(dc,0,0,width,height); if(options&COLORBAR_VERTICAL) drawDoubleRaisedRectangle(dc,border+padleft+2,border+padtop+2+(FXint)((1.0-hsv[2])*(bar->getHeight()-4)),bar->getWidth(),4); else drawDoubleRaisedRectangle(dc,border+padleft+2+(FXint)(hsv[2]*(bar->getWidth()-4)),border+padtop+2,4,bar->getHeight()); return 1; } // Moving long FXColorBar::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint xx,yy,ww,hh,travel,p; FXfloat v=hsv[2]; if(flags&FLAG_PRESSED){ xx=border+padleft+2; yy=border+padtop+2; ww=bar->getWidth(); hh=bar->getHeight(); if(options&COLORBAR_VERTICAL){ travel=hh-4; p=yy+hh-event->win_y-2; } else{ travel=ww-4; p=event->win_x-xx-2; } if(p<0) p=0; if(p>travel) p=travel; if(0tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)hsv); } flags|=FLAG_CHANGED; return 1; } return 0; } // Move spot to change hue, saturation long FXColorBar::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint xx,yy,ww,hh,travel,p; FXfloat v=hsv[2]; flags&=~FLAG_TIP; if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; xx=border+padleft+2; yy=border+padtop+2; ww=bar->getWidth(); hh=bar->getHeight(); if(options&COLORBAR_VERTICAL){ travel=hh-4; p=yy+hh-event->win_y-2; } else{ travel=ww-4; p=event->win_x-xx-2; } if(p<0) p=0; if(p>travel) p=travel; if(0tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)hsv); } flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; } return 1; } // End spot movement mode long FXColorBar::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXuint changed=(flags&FLAG_CHANGED); if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(changed && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)hsv); return 1; } return 1; } // Change hue void FXColorBar::setHue(FXfloat h){ h=FXCLAMP(0.0f,h,360.0f); if(h!=hsv[0]){ hsv[0]=h; updatebar(); bar->render(); update(padleft+border+2,padtop+border+2,width-padleft-padright-(border<<1)-4,height-padtop-padbottom-(border<<1)-4); } } // Change saturation void FXColorBar::setSat(FXfloat s){ s=FXCLAMP(0.0f,s,1.0f); if(s!=hsv[1]){ hsv[1]=s; updatebar(); bar->render(); update(padleft+border+2,padtop+border+2,width-padleft-padright-(border<<1)-4,height-padtop-padbottom-(border<<1)-4); } } // Change saturation void FXColorBar::setVal(FXfloat v){ v=FXCLAMP(0.0f,v,1.0f); if(v!=hsv[2]){ hsv[2]=v; update(padleft+border+2,padtop+border+2,width-padleft-padright-(border<<1)-4,height-padtop-padbottom-(border<<1)-4); } } // Set color bar options void FXColorBar::setBarStyle(FXuint style){ FXuint opts=(options&~BAR_MASK) | (style&BAR_MASK); if(options!=opts){ options=opts; recalc(); update(); } } // Get color bar options FXuint FXColorBar::getBarStyle() const { return (options&BAR_MASK); } // Save data void FXColorBar::save(FXStream& store) const { FXFrame::save(store); store << bar; store << hsv[0]; store << hsv[1]; store << hsv[2]; store << tip; store << help; } // Load data void FXColorBar::load(FXStream& store){ FXFrame::load(store); store >> bar; store >> hsv[0]; store >> hsv[1]; store >> hsv[2]; store >> tip; store >> help; } // Destroy FXColorBar::~FXColorBar(){ delete bar; bar=(FXImage*)-1L; } } fox1.6-1.6.57/src/FXColorDialog.cpp000066400000000000000000000112631326741342000165670ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r D i a l o g * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorDialog.cpp,v 1.32 2006/01/22 17:58:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXButton.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXShell.h" #include "FXTopWindow.h" #include "FXDialogBox.h" #include "FXColorSelector.h" #include "FXColorDialog.h" /* Notes: - Need shared instance of this dialog to pop up when double-clicking on a color well. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXColorDialog) FXColorDialogMap[]={ FXMAPFUNC(SEL_CHANGED,FXColorDialog::ID_COLORSELECTOR,FXColorDialog::onChgColor), FXMAPFUNC(SEL_COMMAND,FXColorDialog::ID_COLORSELECTOR,FXColorDialog::onCmdColor), }; // Object implementation FXIMPLEMENT(FXColorDialog,FXDialogBox,FXColorDialogMap,ARRAYNUMBER(FXColorDialogMap)) // Separator item FXColorDialog::FXColorDialog(FXWindow* owner,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(owner,name,opts|DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE|DECOR_CLOSE,x,y,w,h,0,0,0,0,4,4){ colorbox=new FXColorSelector(this,this,ID_COLORSELECTOR,LAYOUT_FILL_X|LAYOUT_FILL_Y); colorbox->acceptButton()->setTarget(this); colorbox->acceptButton()->setSelector(FXDialogBox::ID_ACCEPT); colorbox->cancelButton()->setTarget(this); colorbox->cancelButton()->setSelector(FXDialogBox::ID_CANCEL); } // Change RGBA color void FXColorDialog::setRGBA(FXColor clr){ colorbox->setRGBA(clr); } // Retrieve RGBA color FXColor FXColorDialog::getRGBA() const { return colorbox->getRGBA(); } // Forward ColorSelector color change to target [a color well] long FXColorDialog::onChgColor(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_CHANGED,message),ptr); } // Forward ColorSelector color command to target [a color well] long FXColorDialog::onCmdColor(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); } // Return true if only opaque colors allowed FXbool FXColorDialog::isOpaqueOnly() const { return colorbox->isOpaqueOnly(); } // Change opaque only mode void FXColorDialog::setOpaqueOnly(FXbool forceopaque){ colorbox->setOpaqueOnly(forceopaque); } // Save data void FXColorDialog::save(FXStream& store) const { FXDialogBox::save(store); store << colorbox; } // Load data void FXColorDialog::load(FXStream& store){ FXDialogBox::load(store); store >> colorbox; } // Cleanup FXColorDialog::~FXColorDialog(){ colorbox=(FXColorSelector*)-1L; } } fox1.6-1.6.57/src/FXColorList.cpp000066400000000000000000000156421326741342000163100ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r L i s t W i d g e t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorList.cpp,v 1.4 2006/01/22 17:58:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXObjectList.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXScrollBar.h" #include "FXColorList.h" /* Notes: */ #define ICON_SPACING 4 // Spacing between icon and label #define SIDE_SPACING 6 // Left or right spacing between items #define LINE_SPACING 4 // Line spacing between items #define SWATCH_WIDTH 24 // Swatch size #define SWATCH_HEIGHT 12 using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXColorItem,FXListItem,NULL,0) // Draw item void FXColorItem::draw(const FXList* list,FXDC& dc,FXint xx,FXint yy,FXint ww,FXint hh){ register FXFont *font=list->getFont(); register FXint th=0; if(!label.empty()) th=font->getFontHeight(); if(isSelected()) dc.setForeground(list->getSelBackColor()); else dc.setForeground(list->getBackColor()); dc.fillRectangle(xx,yy,ww,hh); if(hasFocus()){ dc.drawFocusRectangle(xx+1,yy+1,ww-2,hh-2); } xx+=SIDE_SPACING/2; dc.setForeground(color); dc.fillRectangle(xx,yy+(hh-SWATCH_HEIGHT)/2,SWATCH_WIDTH,SWATCH_HEIGHT); dc.setForeground(FXRGB(0,0,0)); dc.drawRectangle(xx,yy+(hh-SWATCH_HEIGHT)/2,SWATCH_WIDTH,SWATCH_HEIGHT); xx+=ICON_SPACING+SWATCH_WIDTH; if(!label.empty()){ dc.setFont(font); if(!isEnabled()) dc.setForeground(makeShadowColor(list->getBackColor())); else if(isSelected()) dc.setForeground(list->getSelTextColor()); else dc.setForeground(list->getTextColor()); dc.drawText(xx,yy+(hh-th)/2+font->getFontAscent(),label); } } // See if item got hit, and where: 0 is outside, 1 is icon, 2 is text FXint FXColorItem::hitItem(const FXList* list,FXint xx,FXint yy) const { register FXint tw=0,th=0,ix,iy,tx,ty,h; register FXFont *font=list->getFont(); if(!label.empty()){ tw=4+font->getTextWidth(label); th=4+font->getFontHeight(); } h=LINE_SPACING+FXMAX(th,SWATCH_HEIGHT); ix=SIDE_SPACING/2; tx=SIDE_SPACING/2+SWATCH_WIDTH+ICON_SPACING; iy=(h-SWATCH_HEIGHT)/2; ty=(h-th)/2; // In icon? if(ix<=xx && iy<=yy && xxgetFont(); register FXint w=SWATCH_WIDTH; if(!label.empty()) w+=ICON_SPACING+font->getTextWidth(label); return SIDE_SPACING+w; } // Get height of item FXint FXColorItem::getHeight(const FXList* list) const { register FXFont *font=list->getFont(); register FXint h=0; if(!label.empty()) h=font->getFontHeight(); return LINE_SPACING+FXMAX(h,SWATCH_HEIGHT); } /*******************************************************************************/ // Object implementation FXIMPLEMENT(FXColorList,FXList,NULL,0) // List FXColorList::FXColorList(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h):FXList(p,tgt,sel,opts,x,y,w,h){ } // Create custom item FXListItem *FXColorList::createItem(const FXString& text,FXIcon*,void* ptr){ return new FXColorItem(text,FXRGB(0,0,0),ptr); } // Fill list by appending color items from array of strings and array of colors FXint FXColorList::fillItems(const FXchar** strings,FXColor *colors,void* ptr,FXbool notify){ register FXint n=0; if(strings){ while(strings[n]){ appendItem(strings[n],colors[n],ptr,notify); n++; } } return n; } // Insert item at index with given text, color, and user-data pointer FXint FXColorList::insertItem(FXint index,const FXString& text,FXColor color,void* ptr,FXbool notify){ FXint pos=FXList::insertItem(index,text,NULL,ptr,notify); setItemColor(pos,color); return pos; } // Append new item with given text, color, and user-data pointer FXint FXColorList::appendItem(const FXString& text,FXColor color,void* ptr,FXbool notify){ FXint pos=FXList::appendItem(text,NULL,ptr,notify); setItemColor(pos,color); return pos; } // Prepend new item with given text, color, and user-data pointer FXint FXColorList::prependItem(const FXString& text,FXColor color,void* ptr,FXbool notify){ FXint pos=FXList::prependItem(text,NULL,ptr,notify); setItemColor(pos,color); return pos; } // Change item color void FXColorList::setItemColor(FXint index,FXColor color){ if(index<0 || items.no()<=index){ fxerror("%s::setItemData: index out of range.\n",getClassName()); } ((FXColorItem*)items[index])->setColor(color); } // Return item color FXColor FXColorList::getItemColor(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemData: index out of range.\n",getClassName()); } return ((FXColorItem*)items[index])->getColor(); } } fox1.6-1.6.57/src/FXColorNames.cpp000066400000000000000000001173231326741342000164370ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r N a m e F u n c t i o n s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorNames.cpp,v 1.28 2006/01/22 17:58:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "fxascii.h" #include "fxpriv.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" using namespace FX; /*******************************************************************************/ namespace FX { // Massive color database const FXNamedColor fxcolornames[]={ {"AliceBlue", FXRGBA(240,248,255,255)}, {"AntiqueWhite", FXRGBA(250,235,215,255)}, {"AntiqueWhite1", FXRGBA(255,239,219,255)}, {"AntiqueWhite2", FXRGBA(238,223,204,255)}, {"AntiqueWhite3", FXRGBA(205,192,176,255)}, {"AntiqueWhite4", FXRGBA(139,131,120,255)}, //{"Aqua", FXRGBA( 0,255,255,255)}, {"Aquamarine", FXRGBA(127,255,212,255)}, {"Aquamarine1", FXRGBA(127,255,212,255)}, {"Aquamarine2", FXRGBA(118,238,198,255)}, {"Aquamarine3", FXRGBA(102,205,170,255)}, {"Aquamarine4", FXRGBA( 69,139,116,255)}, {"Azure", FXRGBA(240,255,255,255)}, {"Azure1", FXRGBA(240,255,255,255)}, {"Azure2", FXRGBA(224,238,238,255)}, {"Azure3", FXRGBA(193,205,205,255)}, {"Azure4", FXRGBA(131,139,139,255)}, {"Banana", FXRGBA(227,207, 87,255)}, {"Beige", FXRGBA(245,245,220,255)}, {"Bisque", FXRGBA(255,228,196,255)}, {"Bisque1", FXRGBA(255,228,196,255)}, {"Bisque2", FXRGBA(238,213,183,255)}, {"Bisque3", FXRGBA(205,183,158,255)}, {"Bisque4", FXRGBA(139,125,107,255)}, {"Black", FXRGBA( 0, 0, 0,255)}, {"BlanchedAlmond", FXRGBA(255,235,205,255)}, {"Blue", FXRGBA( 0, 0,255,255)}, {"Blue1", FXRGBA( 0, 0,255,255)}, {"Blue2", FXRGBA( 0, 0,238,255)}, {"Blue3", FXRGBA( 0, 0,205,255)}, {"Blue4", FXRGBA( 0, 0,139,255)}, {"BlueViolet", FXRGBA(138, 43,226,255)}, {"Brick", FXRGBA(156,102, 31,255)}, {"Brown", FXRGBA(165, 42, 42,255)}, {"Brown1", FXRGBA(255, 64, 64,255)}, {"Brown2", FXRGBA(238, 59, 59,255)}, {"Brown3", FXRGBA(205, 51, 51,255)}, {"Brown4", FXRGBA(139, 35, 35,255)}, {"Burlywood", FXRGBA(222,184,135,255)}, {"Burlywood1", FXRGBA(255,211,155,255)}, {"Burlywood2", FXRGBA(238,197,145,255)}, {"Burlywood3", FXRGBA(205,170,125,255)}, {"Burlywood4", FXRGBA(139,115, 85,255)}, {"BurnedSienna", FXRGBA(138, 54, 15,255)}, {"BurnedUmber", FXRGBA(138, 51, 36,255)}, {"CadetBlue", FXRGBA( 95,158,160,255)}, {"CadetBlue1", FXRGBA(152,245,255,255)}, {"CadetBlue2", FXRGBA(142,229,238,255)}, {"CadetBlue3", FXRGBA(122,197,205,255)}, {"CadetBlue4", FXRGBA( 83,134,139,255)}, {"CadmiumOrange", FXRGBA(255, 97, 3,255)}, {"CadmiumRed", FXRGBA(227, 23, 13,255)}, {"CadmiumYellow", FXRGBA(255,153, 18,255)}, {"Carrot", FXRGBA(237,145, 33,255)}, {"Chartreuse", FXRGBA(127,255, 0,255)}, {"Chartreuse1", FXRGBA(127,255, 0,255)}, {"Chartreuse2", FXRGBA(118,238, 0,255)}, {"Chartreuse3", FXRGBA(102,205, 0,255)}, {"Chartreuse4", FXRGBA( 69,139, 0,255)}, {"Chocolate", FXRGBA(210,105, 30,255)}, {"Chocolate1", FXRGBA(255,127, 36,255)}, {"Chocolate2", FXRGBA(238,118, 33,255)}, {"Chocolate3", FXRGBA(205,102, 29,255)}, {"Chocolate4", FXRGBA(139, 69, 19,255)}, {"Cobalt", FXRGBA( 61, 89,171,255)}, {"CobaltGreen", FXRGBA( 61,145, 64,255)}, {"ColdGrey", FXRGBA(128,138,135,255)}, {"Coral", FXRGBA(255,127, 80,255)}, {"Coral1", FXRGBA(255,114, 86,255)}, {"Coral2", FXRGBA(238,106, 80,255)}, {"Coral3", FXRGBA(205, 91, 69,255)}, {"Coral4", FXRGBA(139, 62, 47,255)}, {"CornflowerBlue", FXRGBA(100,149,237,255)}, {"Cornsilk", FXRGBA(255,248,220,255)}, {"Cornsilk1", FXRGBA(255,248,220,255)}, {"Cornsilk2", FXRGBA(238,232,205,255)}, {"Cornsilk3", FXRGBA(205,200,177,255)}, {"Cornsilk4", FXRGBA(139,136,120,255)}, {"Crimson", FXRGBA(220, 20, 60,255)}, {"Cyan", FXRGBA( 0,255,255,255)}, {"Cyan1", FXRGBA( 0,255,255,255)}, {"Cyan2", FXRGBA( 0,238,238,255)}, {"Cyan3", FXRGBA( 0,205,205,255)}, {"Cyan4", FXRGBA( 0,139,139,255)}, {"DarkBlue", FXRGBA( 0, 0,139,255)}, {"DarkCyan", FXRGBA( 0,139,139,255)}, {"DarkGoldenrod", FXRGBA(184,134, 11,255)}, {"DarkGoldenrod1", FXRGBA(255,185, 15,255)}, {"DarkGoldenrod2", FXRGBA(238,173, 14,255)}, {"DarkGoldenrod3", FXRGBA(205,149, 12,255)}, {"DarkGoldenrod4", FXRGBA(139,101, 8,255)}, {"DarkGray", FXRGBA(169,169,169,255)}, {"DarkGreen", FXRGBA( 0,100, 0,255)}, {"DarkGrey", FXRGBA(169,169,169,255)}, {"DarkKhaki", FXRGBA(189,183,107,255)}, {"DarkMagenta", FXRGBA(139, 0,139,255)}, {"DarkOliveGreen", FXRGBA( 85,107, 47,255)}, {"DarkOliveGreen1", FXRGBA(202,255,112,255)}, {"DarkOliveGreen2", FXRGBA(188,238,104,255)}, {"DarkOliveGreen3", FXRGBA(162,205, 90,255)}, {"DarkOliveGreen4", FXRGBA(110,139, 61,255)}, {"DarkOrange", FXRGBA(255,140, 0,255)}, {"DarkOrange1", FXRGBA(255,127, 0,255)}, {"DarkOrange2", FXRGBA(238,118, 0,255)}, {"DarkOrange3", FXRGBA(205,102, 0,255)}, {"DarkOrange4", FXRGBA(139, 69, 0,255)}, {"DarkOrchid", FXRGBA(153, 50,204,255)}, {"DarkOrchid1", FXRGBA(191, 62,255,255)}, {"DarkOrchid2", FXRGBA(178, 58,238,255)}, {"DarkOrchid3", FXRGBA(154, 50,205,255)}, {"DarkOrchid4", FXRGBA(104, 34,139,255)}, {"DarkRed", FXRGBA(139, 0, 0,255)}, {"DarkSalmon", FXRGBA(233,150,122,255)}, {"DarkSeaGreen", FXRGBA(143,188,143,255)}, {"DarkSeaGreen1", FXRGBA(193,255,193,255)}, {"DarkSeaGreen2", FXRGBA(180,238,180,255)}, {"DarkSeaGreen3", FXRGBA(155,205,155,255)}, {"DarkSeaGreen4", FXRGBA(105,139,105,255)}, {"DarkSlateBlue", FXRGBA( 72, 61,139,255)}, {"DarkSlateGray", FXRGBA( 47, 79, 79,255)}, {"DarkSlateGray1", FXRGBA(151,255,255,255)}, {"DarkSlateGray2", FXRGBA(141,238,238,255)}, {"DarkSlateGray3", FXRGBA(121,205,205,255)}, {"DarkSlateGray4", FXRGBA( 82,139,139,255)}, {"DarkSlateGrey", FXRGBA( 47, 79, 79,255)}, {"DarkTurquoise", FXRGBA( 0,206,209,255)}, {"DarkViolet", FXRGBA(148, 0,211,255)}, {"DeepPink", FXRGBA(255, 20,147,255)}, {"DeepPink1", FXRGBA(255, 20,147,255)}, {"DeepPink2", FXRGBA(238, 18,137,255)}, {"DeepPink3", FXRGBA(205, 16,118,255)}, {"DeepPink4", FXRGBA(139, 10, 80,255)}, {"DeepSkyBlue", FXRGBA( 0,191,255,255)}, {"DeepSkyBlue1", FXRGBA( 0,191,255,255)}, {"DeepSkyBlue2", FXRGBA( 0,178,238,255)}, {"DeepSkyBlue3", FXRGBA( 0,154,205,255)}, {"DeepSkyBlue4", FXRGBA( 0,104,139,255)}, {"DimGray", FXRGBA(105,105,105,255)}, {"DimGrey", FXRGBA(105,105,105,255)}, {"DodgerBlue", FXRGBA( 30,144,255,255)}, {"DodgerBlue1", FXRGBA( 30,144,255,255)}, {"DodgerBlue2", FXRGBA( 28,134,238,255)}, {"DodgerBlue3", FXRGBA( 24,116,205,255)}, {"DodgerBlue4", FXRGBA( 16, 78,139,255)}, {"Eggshell", FXRGBA(252,230,201,255)}, {"EmeraldGreen", FXRGBA( 0,201, 87,255)}, {"Firebrick", FXRGBA(178, 34, 34,255)}, {"Firebrick1", FXRGBA(255, 48, 48,255)}, {"Firebrick2", FXRGBA(238, 44, 44,255)}, {"Firebrick3", FXRGBA(205, 38, 38,255)}, {"Firebrick4", FXRGBA(139, 26, 26,255)}, {"FloralWhite", FXRGBA(255,250,240,255)}, {"ForestGreen", FXRGBA( 34,139, 34,255)}, //{"Fuchsia", FXRGBA(255, 0,255,255)}, {"Gainsboro", FXRGBA(220,220,220,255)}, {"GhostWhite", FXRGBA(248,248,255,255)}, {"Gold", FXRGBA(255,215, 0,255)}, {"Gold1", FXRGBA(255,215, 0,255)}, {"Gold2", FXRGBA(238,201, 0,255)}, {"Gold3", FXRGBA(205,173, 0,255)}, {"Gold4", FXRGBA(139,117, 0,255)}, {"Goldenrod", FXRGBA(218,165, 32,255)}, {"Goldenrod1", FXRGBA(255,193, 37,255)}, {"Goldenrod2", FXRGBA(238,180, 34,255)}, {"Goldenrod3", FXRGBA(205,155, 29,255)}, {"Goldenrod4", FXRGBA(139,105, 20,255)}, {"Gray", FXRGBA(190,190,190,255)}, {"Gray0", FXRGBA( 0, 0, 0,255)}, {"Gray1", FXRGBA( 3, 3, 3,255)}, {"Gray10", FXRGBA( 26, 26, 26,255)}, {"Gray100", FXRGBA(255,255,255,255)}, {"Gray11", FXRGBA( 28, 28, 28,255)}, {"Gray12", FXRGBA( 31, 31, 31,255)}, {"Gray13", FXRGBA( 33, 33, 33,255)}, {"Gray14", FXRGBA( 36, 36, 36,255)}, {"Gray15", FXRGBA( 38, 38, 38,255)}, {"Gray16", FXRGBA( 41, 41, 41,255)}, {"Gray17", FXRGBA( 43, 43, 43,255)}, {"Gray18", FXRGBA( 46, 46, 46,255)}, {"Gray19", FXRGBA( 48, 48, 48,255)}, {"Gray2", FXRGBA( 5, 5, 5,255)}, {"Gray20", FXRGBA( 51, 51, 51,255)}, {"Gray21", FXRGBA( 54, 54, 54,255)}, {"Gray22", FXRGBA( 56, 56, 56,255)}, {"Gray23", FXRGBA( 59, 59, 59,255)}, {"Gray24", FXRGBA( 61, 61, 61,255)}, {"Gray25", FXRGBA( 64, 64, 64,255)}, {"Gray26", FXRGBA( 66, 66, 66,255)}, {"Gray27", FXRGBA( 69, 69, 69,255)}, {"Gray28", FXRGBA( 71, 71, 71,255)}, {"Gray29", FXRGBA( 74, 74, 74,255)}, {"Gray3", FXRGBA( 8, 8, 8,255)}, {"Gray30", FXRGBA( 77, 77, 77,255)}, {"Gray31", FXRGBA( 79, 79, 79,255)}, {"Gray32", FXRGBA( 82, 82, 82,255)}, {"Gray33", FXRGBA( 84, 84, 84,255)}, {"Gray34", FXRGBA( 87, 87, 87,255)}, {"Gray35", FXRGBA( 89, 89, 89,255)}, {"Gray36", FXRGBA( 92, 92, 92,255)}, {"Gray37", FXRGBA( 94, 94, 94,255)}, {"Gray38", FXRGBA( 97, 97, 97,255)}, {"Gray39", FXRGBA( 99, 99, 99,255)}, {"Gray4", FXRGBA( 10, 10, 10,255)}, {"Gray40", FXRGBA(102,102,102,255)}, {"Gray41", FXRGBA(105,105,105,255)}, {"Gray42", FXRGBA(107,107,107,255)}, {"Gray43", FXRGBA(110,110,110,255)}, {"Gray44", FXRGBA(112,112,112,255)}, {"Gray45", FXRGBA(115,115,115,255)}, {"Gray46", FXRGBA(117,117,117,255)}, {"Gray47", FXRGBA(120,120,120,255)}, {"Gray48", FXRGBA(122,122,122,255)}, {"Gray49", FXRGBA(125,125,125,255)}, {"Gray5", FXRGBA( 13, 13, 13,255)}, {"Gray50", FXRGBA(127,127,127,255)}, {"Gray51", FXRGBA(130,130,130,255)}, {"Gray52", FXRGBA(133,133,133,255)}, {"Gray53", FXRGBA(135,135,135,255)}, {"Gray54", FXRGBA(138,138,138,255)}, {"Gray55", FXRGBA(140,140,140,255)}, {"Gray56", FXRGBA(143,143,143,255)}, {"Gray57", FXRGBA(145,145,145,255)}, {"Gray58", FXRGBA(148,148,148,255)}, {"Gray59", FXRGBA(150,150,150,255)}, {"Gray6", FXRGBA( 15, 15, 15,255)}, {"Gray60", FXRGBA(153,153,153,255)}, {"Gray61", FXRGBA(156,156,156,255)}, {"Gray62", FXRGBA(158,158,158,255)}, {"Gray63", FXRGBA(161,161,161,255)}, {"Gray64", FXRGBA(163,163,163,255)}, {"Gray65", FXRGBA(166,166,166,255)}, {"Gray66", FXRGBA(168,168,168,255)}, {"Gray67", FXRGBA(171,171,171,255)}, {"Gray68", FXRGBA(173,173,173,255)}, {"Gray69", FXRGBA(176,176,176,255)}, {"Gray7", FXRGBA( 18, 18, 18,255)}, {"Gray70", FXRGBA(179,179,179,255)}, {"Gray71", FXRGBA(181,181,181,255)}, {"Gray72", FXRGBA(184,184,184,255)}, {"Gray73", FXRGBA(186,186,186,255)}, {"Gray74", FXRGBA(189,189,189,255)}, {"Gray75", FXRGBA(191,191,191,255)}, {"Gray76", FXRGBA(194,194,194,255)}, {"Gray77", FXRGBA(196,196,196,255)}, {"Gray78", FXRGBA(199,199,199,255)}, {"Gray79", FXRGBA(201,201,201,255)}, {"Gray8", FXRGBA( 20, 20, 20,255)}, {"Gray80", FXRGBA(204,204,204,255)}, {"Gray81", FXRGBA(207,207,207,255)}, {"Gray82", FXRGBA(209,209,209,255)}, {"Gray83", FXRGBA(212,212,212,255)}, {"Gray84", FXRGBA(214,214,214,255)}, {"Gray85", FXRGBA(217,217,217,255)}, {"Gray86", FXRGBA(219,219,219,255)}, {"Gray87", FXRGBA(222,222,222,255)}, {"Gray88", FXRGBA(224,224,224,255)}, {"Gray89", FXRGBA(227,227,227,255)}, {"Gray9", FXRGBA( 23, 23, 23,255)}, {"Gray90", FXRGBA(229,229,229,255)}, {"Gray91", FXRGBA(232,232,232,255)}, {"Gray92", FXRGBA(235,235,235,255)}, {"Gray93", FXRGBA(237,237,237,255)}, {"Gray94", FXRGBA(240,240,240,255)}, {"Gray95", FXRGBA(242,242,242,255)}, {"Gray96", FXRGBA(245,245,245,255)}, {"Gray97", FXRGBA(247,247,247,255)}, {"Gray98", FXRGBA(250,250,250,255)}, {"Gray99", FXRGBA(252,252,252,255)}, {"Green", FXRGBA( 0,255, 0,255)}, {"Green1", FXRGBA( 0,255, 0,255)}, {"Green2", FXRGBA( 0,238, 0,255)}, {"Green3", FXRGBA( 0,205, 0,255)}, {"Green4", FXRGBA( 0,139, 0,255)}, {"GreenYellow", FXRGBA(173,255, 47,255)}, {"Grey", FXRGBA(190,190,190,255)}, {"Grey0", FXRGBA( 0, 0, 0,255)}, {"Grey1", FXRGBA( 3, 3, 3,255)}, {"Grey10", FXRGBA( 26, 26, 26,255)}, {"Grey100", FXRGBA(255,255,255,255)}, {"Grey11", FXRGBA( 28, 28, 28,255)}, {"Grey12", FXRGBA( 31, 31, 31,255)}, {"Grey13", FXRGBA( 33, 33, 33,255)}, {"Grey14", FXRGBA( 36, 36, 36,255)}, {"Grey15", FXRGBA( 38, 38, 38,255)}, {"Grey16", FXRGBA( 41, 41, 41,255)}, {"Grey17", FXRGBA( 43, 43, 43,255)}, {"Grey18", FXRGBA( 46, 46, 46,255)}, {"Grey19", FXRGBA( 48, 48, 48,255)}, {"Grey2", FXRGBA( 5, 5, 5,255)}, {"Grey20", FXRGBA( 51, 51, 51,255)}, {"Grey21", FXRGBA( 54, 54, 54,255)}, {"Grey22", FXRGBA( 56, 56, 56,255)}, {"Grey23", FXRGBA( 59, 59, 59,255)}, {"Grey24", FXRGBA( 61, 61, 61,255)}, {"Grey25", FXRGBA( 64, 64, 64,255)}, {"Grey26", FXRGBA( 66, 66, 66,255)}, {"Grey27", FXRGBA( 69, 69, 69,255)}, {"Grey28", FXRGBA( 71, 71, 71,255)}, {"Grey29", FXRGBA( 74, 74, 74,255)}, {"Grey3", FXRGBA( 8, 8, 8,255)}, {"Grey30", FXRGBA( 77, 77, 77,255)}, {"Grey31", FXRGBA( 79, 79, 79,255)}, {"Grey32", FXRGBA( 82, 82, 82,255)}, {"Grey33", FXRGBA( 84, 84, 84,255)}, {"Grey34", FXRGBA( 87, 87, 87,255)}, {"Grey35", FXRGBA( 89, 89, 89,255)}, {"Grey36", FXRGBA( 92, 92, 92,255)}, {"Grey37", FXRGBA( 94, 94, 94,255)}, {"Grey38", FXRGBA( 97, 97, 97,255)}, {"Grey39", FXRGBA( 99, 99, 99,255)}, {"Grey4", FXRGBA( 10, 10, 10,255)}, {"Grey40", FXRGBA(102,102,102,255)}, {"Grey41", FXRGBA(105,105,105,255)}, {"Grey42", FXRGBA(107,107,107,255)}, {"Grey43", FXRGBA(110,110,110,255)}, {"Grey44", FXRGBA(112,112,112,255)}, {"Grey45", FXRGBA(115,115,115,255)}, {"Grey46", FXRGBA(117,117,117,255)}, {"Grey47", FXRGBA(120,120,120,255)}, {"Grey48", FXRGBA(122,122,122,255)}, {"Grey49", FXRGBA(125,125,125,255)}, {"Grey5", FXRGBA( 13, 13, 13,255)}, {"Grey50", FXRGBA(127,127,127,255)}, {"Grey51", FXRGBA(130,130,130,255)}, {"Grey52", FXRGBA(133,133,133,255)}, {"Grey53", FXRGBA(135,135,135,255)}, {"Grey54", FXRGBA(138,138,138,255)}, {"Grey55", FXRGBA(140,140,140,255)}, {"Grey56", FXRGBA(143,143,143,255)}, {"Grey57", FXRGBA(145,145,145,255)}, {"Grey58", FXRGBA(148,148,148,255)}, {"Grey59", FXRGBA(150,150,150,255)}, {"Grey6", FXRGBA( 15, 15, 15,255)}, {"Grey60", FXRGBA(153,153,153,255)}, {"Grey61", FXRGBA(156,156,156,255)}, {"Grey62", FXRGBA(158,158,158,255)}, {"Grey63", FXRGBA(161,161,161,255)}, {"Grey64", FXRGBA(163,163,163,255)}, {"Grey65", FXRGBA(166,166,166,255)}, {"Grey66", FXRGBA(168,168,168,255)}, {"Grey67", FXRGBA(171,171,171,255)}, {"Grey68", FXRGBA(173,173,173,255)}, {"Grey69", FXRGBA(176,176,176,255)}, {"Grey7", FXRGBA( 18, 18, 18,255)}, {"Grey70", FXRGBA(179,179,179,255)}, {"Grey71", FXRGBA(181,181,181,255)}, {"Grey72", FXRGBA(184,184,184,255)}, {"Grey73", FXRGBA(186,186,186,255)}, {"Grey74", FXRGBA(189,189,189,255)}, {"Grey75", FXRGBA(191,191,191,255)}, {"Grey76", FXRGBA(194,194,194,255)}, {"Grey77", FXRGBA(196,196,196,255)}, {"Grey78", FXRGBA(199,199,199,255)}, {"Grey79", FXRGBA(201,201,201,255)}, {"Grey8", FXRGBA( 20, 20, 20,255)}, {"Grey80", FXRGBA(204,204,204,255)}, {"Grey81", FXRGBA(207,207,207,255)}, {"Grey82", FXRGBA(209,209,209,255)}, {"Grey83", FXRGBA(212,212,212,255)}, {"Grey84", FXRGBA(214,214,214,255)}, {"Grey85", FXRGBA(217,217,217,255)}, {"Grey86", FXRGBA(219,219,219,255)}, {"Grey87", FXRGBA(222,222,222,255)}, {"Grey88", FXRGBA(224,224,224,255)}, {"Grey89", FXRGBA(227,227,227,255)}, {"Grey9", FXRGBA( 23, 23, 23,255)}, {"Grey90", FXRGBA(229,229,229,255)}, {"Grey91", FXRGBA(232,232,232,255)}, {"Grey92", FXRGBA(235,235,235,255)}, {"Grey93", FXRGBA(237,237,237,255)}, {"Grey94", FXRGBA(240,240,240,255)}, {"Grey95", FXRGBA(242,242,242,255)}, {"Grey96", FXRGBA(245,245,245,255)}, {"Grey97", FXRGBA(247,247,247,255)}, {"Grey98", FXRGBA(250,250,250,255)}, {"Grey99", FXRGBA(252,252,252,255)}, {"Honeydew", FXRGBA(240,255,240,255)}, {"Honeydew1", FXRGBA(240,255,240,255)}, {"Honeydew2", FXRGBA(224,238,224,255)}, {"Honeydew3", FXRGBA(193,205,193,255)}, {"Honeydew4", FXRGBA(131,139,131,255)}, {"HotPink", FXRGBA(255,105,180,255)}, {"HotPink1", FXRGBA(255,110,180,255)}, {"HotPink2", FXRGBA(238,106,167,255)}, {"HotPink3", FXRGBA(205, 96,144,255)}, {"HotPink4", FXRGBA(139, 58, 98,255)}, {"IndianRed", FXRGBA(205, 92, 92,255)}, {"IndianRed1", FXRGBA(255,106,106,255)}, {"IndianRed2", FXRGBA(238, 99, 99,255)}, {"IndianRed3", FXRGBA(205, 85, 85,255)}, {"IndianRed4", FXRGBA(139, 58, 58,255)}, {"Indigo", FXRGBA( 75, 0,130,255)}, {"Ivory", FXRGBA(255,255,240,255)}, {"Ivory1", FXRGBA(255,255,240,255)}, {"Ivory2", FXRGBA(238,238,224,255)}, {"Ivory3", FXRGBA(205,205,193,255)}, {"Ivory4", FXRGBA(139,139,131,255)}, {"Khaki", FXRGBA(240,230,140,255)}, {"Khaki1", FXRGBA(255,246,143,255)}, {"Khaki2", FXRGBA(238,230,133,255)}, {"Khaki3", FXRGBA(205,198,115,255)}, {"Khaki4", FXRGBA(139,134, 78,255)}, {"Lavender", FXRGBA(230,230,250,255)}, {"LavenderBlush", FXRGBA(255,240,245,255)}, {"LavenderBlush1", FXRGBA(255,240,245,255)}, {"LavenderBlush2", FXRGBA(238,224,229,255)}, {"LavenderBlush3", FXRGBA(205,193,197,255)}, {"LavenderBlush4", FXRGBA(139,131,134,255)}, {"LawnGreen", FXRGBA(124,252, 0,255)}, {"LemonChiffon", FXRGBA(255,250,205,255)}, {"LemonChiffon1", FXRGBA(255,250,205,255)}, {"LemonChiffon2", FXRGBA(238,233,191,255)}, {"LemonChiffon3", FXRGBA(205,201,165,255)}, {"LemonChiffon4", FXRGBA(139,137,112,255)}, {"LightBlue", FXRGBA(173,216,230,255)}, {"LightBlue1", FXRGBA(191,239,255,255)}, {"LightBlue2", FXRGBA(178,223,238,255)}, {"LightBlue3", FXRGBA(154,192,205,255)}, {"LightBlue4", FXRGBA(104,131,139,255)}, {"LightCoral", FXRGBA(240,128,128,255)}, {"LightCyan", FXRGBA(224,255,255,255)}, {"LightCyan1", FXRGBA(224,255,255,255)}, {"LightCyan2", FXRGBA(209,238,238,255)}, {"LightCyan3", FXRGBA(180,205,205,255)}, {"LightCyan4", FXRGBA(122,139,139,255)}, {"LightGoldenrod", FXRGBA(238,221,130,255)}, {"LightGoldenrod1", FXRGBA(255,236,139,255)}, {"LightGoldenrod2", FXRGBA(238,220,130,255)}, {"LightGoldenrod3", FXRGBA(205,190,112,255)}, {"LightGoldenrod4", FXRGBA(139,129, 76,255)}, {"LightGoldenrodYellow", FXRGBA(250,250,210,255)}, {"LightGray", FXRGBA(211,211,211,255)}, {"LightGreen", FXRGBA(144,238,144,255)}, {"LightGrey", FXRGBA(211,211,211,255)}, {"LightPink", FXRGBA(255,182,193,255)}, {"LightPink1", FXRGBA(255,174,185,255)}, {"LightPink2", FXRGBA(238,162,173,255)}, {"LightPink3", FXRGBA(205,140,149,255)}, {"LightPink4", FXRGBA(139, 95,101,255)}, {"LightSalmon", FXRGBA(255,160,122,255)}, {"LightSalmon1", FXRGBA(255,160,122,255)}, {"LightSalmon2", FXRGBA(238,149,114,255)}, {"LightSalmon3", FXRGBA(205,129, 98,255)}, {"LightSalmon4", FXRGBA(139, 87, 66,255)}, {"LightSeaGreen", FXRGBA( 32,178,170,255)}, {"LightSkyBlue", FXRGBA(135,206,250,255)}, {"LightSkyBlue1", FXRGBA(176,226,255,255)}, {"LightSkyBlue2", FXRGBA(164,211,238,255)}, {"LightSkyBlue3", FXRGBA(141,182,205,255)}, {"LightSkyBlue4", FXRGBA( 96,123,139,255)}, {"LightSlateBlue", FXRGBA(132,112,255,255)}, {"LightSlateGray", FXRGBA(119,136,153,255)}, {"LightSlateGrey", FXRGBA(119,136,153,255)}, {"LightSteelBlue", FXRGBA(176,196,222,255)}, {"LightSteelBlue1", FXRGBA(202,225,255,255)}, {"LightSteelBlue2", FXRGBA(188,210,238,255)}, {"LightSteelBlue3", FXRGBA(162,181,205,255)}, {"LightSteelBlue4", FXRGBA(110,123,139,255)}, {"LightYellow", FXRGBA(255,255,224,255)}, {"LightYellow1", FXRGBA(255,255,224,255)}, {"LightYellow2", FXRGBA(238,238,209,255)}, {"LightYellow3", FXRGBA(205,205,180,255)}, {"LightYellow4", FXRGBA(139,139,122,255)}, //{"Lime", FXRGBA( 0,255, 0,255)}, {"LimeGreen", FXRGBA( 50,205, 50,255)}, {"Linen", FXRGBA(250,240,230,255)}, {"Magenta", FXRGBA(255, 0,255,255)}, {"Magenta1", FXRGBA(255, 0,255,255)}, {"Magenta2", FXRGBA(238, 0,238,255)}, {"Magenta3", FXRGBA(205, 0,205,255)}, {"Magenta4", FXRGBA(139, 0,139,255)}, {"Maroon", FXRGBA(176, 48, 96,255)}, {"Maroon1", FXRGBA(255, 52,179,255)}, {"Maroon2", FXRGBA(238, 48,167,255)}, {"Maroon3", FXRGBA(205, 41,144,255)}, {"Maroon4", FXRGBA(139, 28, 98,255)}, {"MediumAquamarine", FXRGBA(102,205,170,255)}, {"MediumBlue", FXRGBA( 0, 0,205,255)}, {"MediumOrchid", FXRGBA(186, 85,211,255)}, {"MediumOrchid1", FXRGBA(224,102,255,255)}, {"MediumOrchid2", FXRGBA(209, 95,238,255)}, {"MediumOrchid3", FXRGBA(180, 82,205,255)}, {"MediumOrchid4", FXRGBA(122, 55,139,255)}, {"MediumPurple", FXRGBA(147,112,219,255)}, {"MediumPurple1", FXRGBA(171,130,255,255)}, {"MediumPurple2", FXRGBA(159,121,238,255)}, {"MediumPurple3", FXRGBA(137,104,205,255)}, {"MediumPurple4", FXRGBA( 93, 71,139,255)}, {"MediumSeaGreen", FXRGBA( 60,179,113,255)}, {"MediumSlateBlue", FXRGBA(123,104,238,255)}, {"MediumSpringGreen", FXRGBA( 0,250,154,255)}, {"MediumTurquoise", FXRGBA( 72,209,204,255)}, {"MediumVioletRed", FXRGBA(199, 21,133,255)}, {"MidnightBlue", FXRGBA( 25, 25,112,255)}, {"MintCream", FXRGBA(245,255,250,255)}, {"MistyRose", FXRGBA(255,228,225,255)}, {"MistyRose1", FXRGBA(255,228,225,255)}, {"MistyRose2", FXRGBA(238,213,210,255)}, {"MistyRose3", FXRGBA(205,183,181,255)}, {"MistyRose4", FXRGBA(139,125,123,255)}, {"Moccasin", FXRGBA(255,228,181,255)}, {"NavajoWhite", FXRGBA(255,222,173,255)}, {"NavajoWhite1", FXRGBA(255,222,173,255)}, {"NavajoWhite2", FXRGBA(238,207,161,255)}, {"NavajoWhite3", FXRGBA(205,179,139,255)}, {"NavajoWhite4", FXRGBA(139,121, 94,255)}, {"Navy", FXRGBA( 0, 0,128,255)}, {"NavyBlue", FXRGBA( 0, 0,128,255)}, {"None", FXRGBA( 0, 0, 0, 0)}, // Transparent {"OldLace", FXRGBA(253,245,230,255)}, {"Olive", FXRGBA(128,128, 0,255)}, {"OliveDrab", FXRGBA(107,142, 35,255)}, {"OliveDrab1", FXRGBA(192,255, 62,255)}, {"OliveDrab2", FXRGBA(179,238, 58,255)}, {"OliveDrab3", FXRGBA(154,205, 50,255)}, {"OliveDrab4", FXRGBA(105,139, 34,255)}, {"Orange", FXRGBA(255,165, 0,255)}, {"Orange1", FXRGBA(255,165, 0,255)}, {"Orange2", FXRGBA(238,154, 0,255)}, {"Orange3", FXRGBA(205,133, 0,255)}, {"Orange4", FXRGBA(139, 90, 0,255)}, {"OrangeRed", FXRGBA(255, 69, 0,255)}, {"OrangeRed1", FXRGBA(255, 69, 0,255)}, {"OrangeRed2", FXRGBA(238, 64, 0,255)}, {"OrangeRed3", FXRGBA(205, 55, 0,255)}, {"OrangeRed4", FXRGBA(139, 37, 0,255)}, {"Orchid", FXRGBA(218,112,214,255)}, {"Orchid1", FXRGBA(255,131,250,255)}, {"Orchid2", FXRGBA(238,122,233,255)}, {"Orchid3", FXRGBA(205,105,201,255)}, {"Orchid4", FXRGBA(139, 71,137,255)}, {"PaleGoldenrod", FXRGBA(238,232,170,255)}, {"PaleGreen", FXRGBA(152,251,152,255)}, {"PaleGreen1", FXRGBA(154,255,154,255)}, {"PaleGreen2", FXRGBA(144,238,144,255)}, {"PaleGreen3", FXRGBA(124,205,124,255)}, {"PaleGreen4", FXRGBA( 84,139, 84,255)}, {"PaleTurquoise", FXRGBA(175,238,238,255)}, {"PaleTurquoise1", FXRGBA(187,255,255,255)}, {"PaleTurquoise2", FXRGBA(174,238,238,255)}, {"PaleTurquoise3", FXRGBA(150,205,205,255)}, {"PaleTurquoise4", FXRGBA(102,139,139,255)}, {"PaleVioletRed", FXRGBA(219,112,147,255)}, {"PaleVioletRed1", FXRGBA(255,130,171,255)}, {"PaleVioletRed2", FXRGBA(238,121,159,255)}, {"PaleVioletRed3", FXRGBA(205,104,137,255)}, {"PaleVioletRed4", FXRGBA(139, 71, 93,255)}, {"PapayaWhip", FXRGBA(255,239,213,255)}, {"PeachPuff", FXRGBA(255,218,185,255)}, {"PeachPuff1", FXRGBA(255,218,185,255)}, {"PeachPuff2", FXRGBA(238,203,173,255)}, {"PeachPuff3", FXRGBA(205,175,149,255)}, {"PeachPuff4", FXRGBA(139,119,101,255)}, {"Peru", FXRGBA(205,133, 63,255)}, {"Pink", FXRGBA(255,192,203,255)}, {"Pink1", FXRGBA(255,181,197,255)}, {"Pink2", FXRGBA(238,169,184,255)}, {"Pink3", FXRGBA(205,145,158,255)}, {"Pink4", FXRGBA(139, 99,108,255)}, {"Plum", FXRGBA(221,160,221,255)}, {"Plum1", FXRGBA(255,187,255,255)}, {"Plum2", FXRGBA(238,174,238,255)}, {"Plum3", FXRGBA(205,150,205,255)}, {"Plum4", FXRGBA(139,102,139,255)}, {"PowderBlue", FXRGBA(176,224,230,255)}, {"Purple", FXRGBA(160, 32,240,255)}, {"Purple1", FXRGBA(155, 48,255,255)}, {"Purple2", FXRGBA(145, 44,238,255)}, {"Purple3", FXRGBA(125, 38,205,255)}, {"Purple4", FXRGBA( 85, 26,139,255)}, {"Raspberry", FXRGBA(135, 38, 87,255)}, {"Red", FXRGBA(255, 0, 0,255)}, {"Red1", FXRGBA(255, 0, 0,255)}, {"Red2", FXRGBA(238, 0, 0,255)}, {"Red3", FXRGBA(205, 0, 0,255)}, {"Red4", FXRGBA(139, 0, 0,255)}, {"RosyBrown", FXRGBA(188,143,143,255)}, {"RosyBrown1", FXRGBA(255,193,193,255)}, {"RosyBrown2", FXRGBA(238,180,180,255)}, {"RosyBrown3", FXRGBA(205,155,155,255)}, {"RosyBrown4", FXRGBA(139,105,105,255)}, {"RoyalBlue", FXRGBA( 65,105,225,255)}, {"RoyalBlue1", FXRGBA( 72,118,255,255)}, {"RoyalBlue2", FXRGBA( 67,110,238,255)}, {"RoyalBlue3", FXRGBA( 58, 95,205,255)}, {"RoyalBlue4", FXRGBA( 39, 64,139,255)}, {"SaddleBrown", FXRGBA(139, 69, 19,255)}, {"Salmon", FXRGBA(250,128,114,255)}, {"Salmon1", FXRGBA(255,140,105,255)}, {"Salmon2", FXRGBA(238,130, 98,255)}, {"Salmon3", FXRGBA(205,112, 84,255)}, {"Salmon4", FXRGBA(139, 76, 57,255)}, {"SandyBrown", FXRGBA(244,164, 96,255)}, {"SeaGreen", FXRGBA( 46,139, 87,255)}, {"SeaGreen1", FXRGBA( 84,255,159,255)}, {"SeaGreen2", FXRGBA( 78,238,148,255)}, {"SeaGreen3", FXRGBA( 67,205,128,255)}, {"SeaGreen4", FXRGBA( 46,139, 87,255)}, {"Seashell", FXRGBA(255,245,238,255)}, {"Seashell1", FXRGBA(255,245,238,255)}, {"Seashell2", FXRGBA(238,229,222,255)}, {"Seashell3", FXRGBA(205,197,191,255)}, {"Seashell4", FXRGBA(139,134,130,255)}, {"Sepia", FXRGBA( 94, 38, 18,255)}, {"Sienna", FXRGBA(160, 82, 45,255)}, {"Sienna1", FXRGBA(255,130, 71,255)}, {"Sienna2", FXRGBA(238,121, 66,255)}, {"Sienna3", FXRGBA(205,104, 57,255)}, {"Sienna4", FXRGBA(139, 71, 38,255)}, {"Silver", FXRGBA(192,192,192,255)}, {"SkyBlue", FXRGBA(135,206,235,255)}, {"SkyBlue1", FXRGBA(135,206,255,255)}, {"SkyBlue2", FXRGBA(126,192,238,255)}, {"SkyBlue3", FXRGBA(108,166,205,255)}, {"SkyBlue4", FXRGBA( 74,112,139,255)}, {"SlateBlue", FXRGBA(106, 90,205,255)}, {"SlateBlue1", FXRGBA(131,111,255,255)}, {"SlateBlue2", FXRGBA(122,103,238,255)}, {"SlateBlue3", FXRGBA(105, 89,205,255)}, {"SlateBlue4", FXRGBA( 71, 60,139,255)}, {"SlateGray", FXRGBA(112,128,144,255)}, {"SlateGray1", FXRGBA(198,226,255,255)}, {"SlateGray2", FXRGBA(185,211,238,255)}, {"SlateGray3", FXRGBA(159,182,205,255)}, {"SlateGray4", FXRGBA(108,123,139,255)}, {"SlateGrey", FXRGBA(112,128,144,255)}, {"Snow", FXRGBA(255,250,250,255)}, {"Snow1", FXRGBA(255,250,250,255)}, {"Snow2", FXRGBA(238,233,233,255)}, {"Snow3", FXRGBA(205,201,201,255)}, {"Snow4", FXRGBA(139,137,137,255)}, {"SpringGreen", FXRGBA( 0,255,127,255)}, {"SpringGreen1", FXRGBA( 0,255,127,255)}, {"SpringGreen2", FXRGBA( 0,238,118,255)}, {"SpringGreen3", FXRGBA( 0,205,102,255)}, {"SpringGreen4", FXRGBA( 0,139, 69,255)}, {"SteelBlue", FXRGBA( 70,130,180,255)}, {"SteelBlue1", FXRGBA( 99,184,255,255)}, {"SteelBlue2", FXRGBA( 92,172,238,255)}, {"SteelBlue3", FXRGBA( 79,148,205,255)}, {"SteelBlue4", FXRGBA( 54,100,139,255)}, {"Tan", FXRGBA(210,180,140,255)}, {"Tan1", FXRGBA(255,165, 79,255)}, {"Tan2", FXRGBA(238,154, 73,255)}, {"Tan3", FXRGBA(205,133, 63,255)}, {"Tan4", FXRGBA(139, 90, 43,255)}, {"Teal", FXRGBA( 0,128,128,255)}, {"Thistle", FXRGBA(216,191,216,255)}, {"Thistle1", FXRGBA(255,225,255,255)}, {"Thistle2", FXRGBA(238,210,238,255)}, {"Thistle3", FXRGBA(205,181,205,255)}, {"Thistle4", FXRGBA(139,123,139,255)}, {"Tomato", FXRGBA(255, 99, 71,255)}, {"Tomato1", FXRGBA(255, 99, 71,255)}, {"Tomato2", FXRGBA(238, 92, 66,255)}, {"Tomato3", FXRGBA(205, 79, 57,255)}, {"Tomato4", FXRGBA(139, 54, 38,255)}, {"Turquoise", FXRGBA( 64,224,208,255)}, {"Turquoise1", FXRGBA( 0,245,255,255)}, {"Turquoise2", FXRGBA( 0,229,238,255)}, {"Turquoise3", FXRGBA( 0,197,205,255)}, {"Turquoise4", FXRGBA( 0,134,139,255)}, {"Ultramarine", FXRGBA( 0, 42,143,255)}, {"Violet", FXRGBA(238,130,238,255)}, {"VioletRed", FXRGBA(208, 32,144,255)}, {"VioletRed1", FXRGBA(255, 62,150,255)}, {"VioletRed2", FXRGBA(238, 58,140,255)}, {"VioletRed3", FXRGBA(205, 50,120,255)}, {"VioletRed4", FXRGBA(139, 34, 82,255)}, {"WarmGrey", FXRGBA(128,128,105,255)}, {"Wheat", FXRGBA(245,222,179,255)}, {"Wheat1", FXRGBA(255,231,186,255)}, {"Wheat2", FXRGBA(238,216,174,255)}, {"Wheat3", FXRGBA(205,186,150,255)}, {"Wheat4", FXRGBA(139,126,102,255)}, {"White", FXRGBA(255,255,255,255)}, {"WhiteSmoke", FXRGBA(245,245,245,255)}, {"Yellow", FXRGBA(255,255, 0,255)}, {"Yellow1", FXRGBA(255,255, 0,255)}, {"Yellow2", FXRGBA(238,238, 0,255)}, {"Yellow3", FXRGBA(205,205, 0,255)}, {"Yellow4", FXRGBA(139,139, 0,255)}, {"YellowGreen", FXRGBA(154,205, 50,255)}, }; // Number of color names const FXuint fxnumcolornames=ARRAYNUMBER(fxcolornames); // Get RGB value from color name FXColor fxcolorfromname(const FXchar* colorname){ FXchar name[100],c,*tail=name; FXint l,h,m,eq,r,g,b,a; if(colorname){ while((c=*colorname++)!='\0' && tail<&name[99]){ if(!Ascii::isSpace(c)) *tail++=c; } *tail='\0'; if(name[0]=='#'){ switch(tail-name-1){ case 3: sscanf(name+1,"%01x%01x%01x",&r,&g,&b); return FXRGB((r*17),(g*17),(b*17)); case 4: sscanf(name+1,"%01x%01x%01x%01x",&r,&g,&b,&a); return FXRGBA((r*17),(g*17),(b*17),(a*17)); case 6: sscanf(name+1,"%02x%02x%02x",&r,&g,&b); return FXRGB(r,g,b); case 8: sscanf(name+1,"%02x%02x%02x%02x",&r,&g,&b,&a); return FXRGBA(r,g,b,a); case 9: sscanf(name+1,"%03x%03x%03x",&r,&g,&b); return FXRGB((r/16),(g/16),(b/16)); case 12: sscanf(name+1,"%04x%04x%04x",&r,&g,&b); return FXRGB((r/257),(g/257),(b/257)); case 16: sscanf(name+1,"%04x%04x%04x%04x",&r,&g,&b,&a); return FXRGBA((r/257),(g/257),(b/257),(a/257)); } } else{ l=0; h=ARRAYNUMBER(fxcolornames)-1; do{ m=(h+l)>>1; eq=comparecase(name,fxcolornames[m].name); if(eq==0) return fxcolornames[m].color; if(eq<0) h=m-1; else l=m+1; } while(h>=l); } } return FXRGBA(0,0,0,0); } // Get color name from RGBA FXchar* fxnamefromcolor(FXchar* colorname,FXColor color){ register FXuint i; if(!colorname){fxerror("fxnamefromcolor: NULL colorname argument.\n");} if(color && FXALPHAVAL(color)<255){ sprintf(colorname,"#%02x%02x%02x%02x",FXREDVAL(color),FXGREENVAL(color),FXBLUEVAL(color),FXALPHAVAL(color)); } else{ for(i=0; icreate(); } // Detach window void FXColorRing::detach(){ FXFrame::detach(); dial->detach(); } // Get default width FXint FXColorRing::getDefaultWidth(){ return RINGDIAMETER+padleft+padright+(border<<1); } // Get default height FXint FXColorRing::getDefaultHeight(){ return RINGDIAMETER+padtop+padbottom+(border<<1); } // Resize the dial void FXColorRing::layout(){ register FXint ww=width-padleft-padright-(border<<1); register FXint hh=height-padtop-padbottom-(border<<1); register FXint ss; // Enforce minimum triangle size ringinner=FXMIN(ww,hh)/2-ringwidth; if(ringinner<=MINTRIANGLE) ringinner=MINTRIANGLE; ringouter=ringinner+ringwidth; // Size is odd so center falls on whole pixel ss=ringouter+ringouter+1; // New dial location in widget dialx=border+padleft+(ww-ss)/2; dialy=border+padtop+(hh-ss)/2; // Do work if size changed or marked dirty if((dial->getWidth()!=ss) || (flags&FLAG_DIRTY)){ // Size has changed, resize the off-screen image if(dial->getWidth()!=ss) dial->resize(ss,ss); // Update ring image updatering(); // Rerender to server dial->render(); update(); } // Update hue ball position hueToXY(huex,huey,hsv[0]); // Update saturation and value ball position satValToXY(satvalx,satvaly,hsv[1],hsv[2]); flags&=~FLAG_DIRTY; } // Recompute the dial image void FXColorRing::updatering(){ register FXfloat invdet,a,s,v; register FXint o2,i2,r2,rx,ry,x,y; FXfloat r,g,b; // Hue angle in radians a=(hsv[0]-180.0f)*DTOR; // Calculate triangle points clrx=(FXint)(ringinner*cosf(a)+0.5f); clry=(FXint)(ringinner*sinf(a)+0.5f); blkx=(FXint)(ringinner*cosf(a+2.0f*PI/3.0f)+0.5f); blky=(FXint)(ringinner*sinf(a+2.0f*PI/3.0f)+0.5f); whtx=(FXint)(ringinner*cosf(a-2.0f*PI/3.0f)+0.5f); whty=(FXint)(ringinner*sinf(a-2.0f*PI/3.0f)+0.5f); // To test for ring o2=ringouter*ringouter; i2=ringinner*ringinner; // Determinant is OK because of MINTRIANGLE constraint invdet=1.0f/((whty-clry)*(whtx-blkx)+(clrx-whtx)*(whty-blky)); // Loop over pixels for(y=0; ygetHeight(); y++){ ry=y-ringouter; for(x=0; xgetWidth(); x++){ rx=x-ringouter; // Inside outer ring if((r2=(rx*rx+ry*ry))<=o2){ // Outside inner ring if(i2<=r2){ // Compute color fxhsv_to_rgb(r,g,b,atan2f(ry,rx)*RTOD+180.0f,1.0f,1.0f); dial->setPixel(x,y,FXRGB(255.0f*r,255.0f*g,255.0f*b)); continue; } // Inside triangle if(0<=(clry-blky)*(rx-clrx)-(clrx-blkx)*(ry-clry) && 0<=(whty-clry)*(rx-whtx)-(whtx-clrx)*(ry-whty) && 0<=(blky-whty)*(rx-blkx)-(blkx-whtx)*(ry-blky)){ // Compute saturation and value in triangle v=((whty-clry)*(rx-blkx)+(clrx-whtx)*(ry-blky)) * invdet; s=((whty-blky)*(rx-blkx)+(blkx-whtx)*(ry-blky)) * invdet; // Compute color fxhsv_to_rgb(r,g,b,hsv[0],s,v); dial->setPixel(x,y,FXRGB(255.0f*r,255.0f*g,255.0f*b)); continue; } } // Just set background dial->setPixel(x,y,backColor); } } } // Test if inside hue ring FXbool FXColorRing::inHueRing(FXint x,FXint y) const { register FXint rx=x-dialx-ringouter; register FXint ry=y-dialy-ringouter; return ringinner*ringinner<=rx*rx+ry*ry; } // Compute hue from position on ring x, y FXfloat FXColorRing::hueFromXY(FXint x,FXint y) const { return atan2f(y-dialy-ringouter,x-dialx-ringouter)*RTOD+180.0f; } // Compute position on ring from hue void FXColorRing::hueToXY(FXint& x,FXint& y,FXfloat hue) const { register FXfloat a=(hue-180.0f)*DTOR; register FXfloat r=ringouter-ringwidth*0.5f; x=dialx+ringouter+(FXint)(r*cosf(a)+0.5f); y=dialy+ringouter+(FXint)(r*sinf(a)+0.5f); } // Test if inside saturation/value triangle FXbool FXColorRing::inTriangle(FXint x,FXint y) const { register FXint rx=x-dialx-ringouter; register FXint ry=y-dialy-ringouter; return 0<=(clry-blky)*(rx-clrx)-(clrx-blkx)*(ry-clry) && 0<=(whty-clry)*(rx-whtx)-(whtx-clrx)*(ry-whty) && 0<=(blky-whty)*(rx-blkx)-(blkx-whtx)*(ry-blky); } // Compute x,y location from saturation and value void FXColorRing::satValToXY(FXint& x,FXint& y,FXfloat s,FXfloat v) const { register FXfloat px=whtx+(clrx-whtx)*s; register FXfloat py=whty+(clry-whty)*s; x=dialx+ringouter+blkx+(FXint)((px-blkx)*v+0.5f); y=dialy+ringouter+blky+(FXint)((py-blky)*v+0.5f); } // Compute saturation and value given x, y in triangle and hue void FXColorRing::satValFromXY(FXfloat& s,FXfloat& v,FXint x,FXint y) const { register FXint rx=x-dialx-ringouter; register FXint ry=y-dialy-ringouter; register FXfloat ss,vv; // Outside triangle on blk-clr side if((clry-blky)*(rx-clrx)-(clrx-blkx)*(ry-clry)<0){ ss=1.0f; vv=(FXfloat)((clrx-blkx)*(rx-blkx)+(clry-blky)*(ry-blky)) / (FXfloat)((clrx-blkx)*(clrx-blkx)+(clry-blky)*(clry-blky)); } // Outside triangle on wht-clr side else if((whty-clry)*(rx-whtx)-(whtx-clrx)*(ry-whty)<0){ vv=1.0f; ss=(FXfloat)((clrx-whtx)*(rx-whtx)+(clry-whty)*(ry-whty)) / (FXfloat)((clrx-whtx)*(clrx-whtx)+(clry-whty)*(clry-whty)); } // Outside triangle on blk-wht side else if((blky-whty)*(rx-blkx)-(blkx-whtx)*(ry-blky)<0){ ss=0.0f; vv=(FXfloat)((whtx-blkx)*(rx-blkx)+(whty-blky)*(ry-blky)) / (FXfloat)((whtx-blkx)*(whtx-blkx)+(whty-blky)*(whty-blky)); } // Inside the triangle; this is a bit nasty... else{ vv=(FXfloat)((whty-clry)*(rx-blkx)+(clrx-whtx)*(ry-blky)) / (FXfloat)((whty-clry)*(whtx-blkx)+(clrx-whtx)*(whty-blky)); // Take care of degenerate case at B if(vv<=0.0f){ vv=0.0f; ss=0.0f; } // Generic case else{ if(vv>=1.0f) vv=1.0f; // Don't divide by zero if(clry==whty){ ss=(FXfloat) (rx-blkx-vv*(whtx-blkx)) / (vv*(clrx-whtx)); } else{ ss=(FXfloat) (ry-blky-vv*(whty-blky)) / (vv*(clry-whty)); } } } // Clamp to range s=FXCLAMP(0.0f,ss,1.0f); v=FXCLAMP(0.0f,vv,1.0f); } // Set help using a message long FXColorRing::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXColorRing::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXColorRing::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXColorRing::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXColorRing::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXColorRing::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Handle repaint long FXColorRing::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXDCWindow dc(this,event); // Fill around sides dc.setForeground(backColor); dc.fillRectangle(border,border,dialx-border,height-(border<<1)); dc.fillRectangle(dialx+dial->getWidth(),border,width-border-dialx-dial->getWidth(),height-(border<<1)); dc.fillRectangle(dialx,border,dial->getWidth(),dialy-border); dc.fillRectangle(dialx,dialy+dial->getHeight(),dial->getWidth(),height-border-dialy-dial->getHeight()); // Draw dial dc.drawImage(dial,dialx,dialy); dc.setForeground(borderColor); dc.drawArc(dialx+1,dialy,ringouter+ringouter,ringouter+ringouter,90*64,45*64); dc.drawArc(dialx,dialy+1,ringouter+ringouter,ringouter+ringouter,135*64,45*64); dc.setForeground(baseColor); dc.drawArc(dialx-1,dialy,ringouter+ringouter,ringouter+ringouter,270*64,45*64); dc.drawArc(dialx,dialy-1,ringouter+ringouter,ringouter+ringouter,315*64,45*64); dc.setForeground(shadowColor); dc.drawArc(dialx,dialy,ringouter+ringouter,ringouter+ringouter,45*64,180*64); dc.drawArc(dialx+ringwidth,dialy+ringwidth,ringinner+ringinner,ringinner+ringinner,225*64,180*64); dc.setForeground(hiliteColor); dc.drawArc(dialx,dialy,ringouter+ringouter,ringouter+ringouter,225*64,180*64); dc.drawArc(dialx+ringwidth,dialy+ringwidth,ringinner+ringinner,ringinner+ringinner,45*64,180*64); // Draw spots dc.setForeground(FXRGB(255,255,255)); dc.fillArc(satvalx-3,satvaly-3,7,7,0,360*64); dc.fillArc(huex-3,huey-3,7,7,0,360*64); dc.setForeground(FXRGB(0,0,0)); dc.fillArc(satvalx-2,satvaly-2,5,5,0,360*64); dc.fillArc(huex-2,huey-2,5,5,0,360*64); drawFrame(dc,0,0,width,height); return 1; } // Determine if special case applies FXbool FXColorRing::inCorner(FXint x,FXint y) const { register FXint rx=x-dialx-ringouter; register FXint ry=y-dialy-ringouter; return (ringouter*ringouter<=rx*rx+ry*ry) && (0.99999f<=hsv[1] && 0.99999f<=hsv[2]); } // Moving long FXColorRing::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXfloat s,v; flags&=~FLAG_TIP; if(mode!=MOUSE_NONE){ if((mode==MOUSE_HUE) || inCorner(event->win_x,event->win_y)){ // Changing hue setHue(hueFromXY(event->win_x,event->win_y)); } else{ // Changing saturation and value satValFromXY(s,v,event->win_x,event->win_y); setHueSatVal(hsv[0],s,v); } flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)hsv); return 1; } return 0; } // Move spot to change hue, saturation long FXColorRing::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXfloat s,v; flags&=~FLAG_TIP; if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; if(inHueRing(event->win_x,event->win_y)){ setHue(hueFromXY(event->win_x,event->win_y)); mode=MOUSE_HUE; } else if(inTriangle(event->win_x,event->win_y)){ satValFromXY(s,v,event->win_x,event->win_y); setHueSatVal(hsv[0],s,v); mode=MOUSE_SATVAL; } flags|=FLAG_CHANGED; flags&=~FLAG_UPDATE; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)hsv); } return 1; } // End spot movement mode long FXColorRing::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXuint changed=(flags&FLAG_CHANGED); if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; flags&=~FLAG_CHANGED; mode=MOUSE_NONE; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(changed && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)hsv); return 1; } return 1; } // Rotate hue by means of dial long FXColorRing::onMouseWheel(FXObject*,FXSelector,void* ptr){ FXfloat amount=((FXEvent*)ptr)->code/12.0f; if(isEnabled()){ if(((FXEvent*)ptr)->state&CONTROLMASK) amount/=10.0f; setHue(fmodf(hsv[0]+amount+360.0f,360.0f)); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)hsv); return 1; } return 0; } // Change hue void FXColorRing::setHue(FXfloat h){ h=FXCLAMP(0.0f,h,360.0f); if(hsv[0]!=h){ hsv[0]=h; update(huex-4,huey-4,9,9); hueToXY(huex,huey,hsv[0]); update(huex-4,huey-4,9,9); recalc(); } } // Change saturation void FXColorRing::setSat(FXfloat s){ s=FXCLAMP(0.0f,s,1.0f); if(hsv[1]!=s){ hsv[1]=s; update(satvalx-4,satvaly-4,9,9); satValToXY(satvalx,satvaly,hsv[1],hsv[2]); update(satvalx-4,satvaly-4,9,9); } } // Change saturation void FXColorRing::setVal(FXfloat v){ v=FXCLAMP(0.0f,v,1.0f); if(hsv[2]!=v){ hsv[2]=v; update(satvalx-4,satvaly-4,9,9); satValToXY(satvalx,satvaly,hsv[1],hsv[2]); update(satvalx-4,satvaly-4,9,9); } } // Set hue, saturation, value void FXColorRing::setHueSatVal(FXfloat h,FXfloat s,FXfloat v){ // Clamp h=FXCLAMP(0.0f,h,360.0f); s=FXCLAMP(0.0f,s,1.0f); v=FXCLAMP(0.0f,v,1.0f); // Changed after clamping? if(hsv[0]!=h || hsv[1]!=s || hsv[2]!=v){ // Cheap case: just move the ball if(hsv[1]!=s || hsv[2]!=v){ hsv[1]=s; hsv[2]=v; update(satvalx-4,satvaly-4,9,9); satValToXY(satvalx,satvaly,hsv[1],hsv[2]); update(satvalx-4,satvaly-4,9,9); } // Expensive case: recalculate dial if(hsv[0]!=h){ hsv[0]=h; recalc(); } } } // Change width of hue ring void FXColorRing::setRingWidth(FXint rw){ if(rw<4) rw=4; if(ringwidth!=rw){ ringwidth=rw; recalc(); } } // Save data void FXColorRing::save(FXStream& store) const { FXFrame::save(store); store << dial; store << hsv[0]; store << hsv[1]; store << hsv[2]; store << ringwidth; store << tip; store << help; } // Load data void FXColorRing::load(FXStream& store){ FXFrame::load(store); store >> dial; store >> hsv[0]; store >> hsv[1]; store >> hsv[2]; store >> ringwidth; store >> tip; store >> help; } // Destroy FXColorRing::~FXColorRing(){ delete dial; dial=(FXImage*)-1L; } } fox1.6-1.6.57/src/FXColorSelector.cpp000066400000000000000000001150121326741342000171450ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r S e l e c t o r * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorSelector.cpp,v 1.74.2.1 2009/01/16 01:20:37 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "fxpriv.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObject.h" #include "FXObjectList.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXFont.h" #include "FXDCWindow.h" #include "FXIcon.h" #include "FXGIFIcon.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXSeparator.h" #include "FXLabel.h" #include "FXColorBar.h" #include "FXColorWell.h" #include "FXColorWheel.h" #include "FXColorRing.h" #include "FXColorList.h" #include "FXTextField.h" #include "FXButton.h" #include "FXPicker.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXTabItem.h" #include "FXTabBook.h" #include "FXHorizontalFrame.h" #include "FXVerticalFrame.h" #include "FXMatrix.h" #include "FXShell.h" #include "FXScrollBar.h" #include "FXSlider.h" #include "FXList.h" #include "FXColorSelector.h" #include "icons.h" /* Notes: - Custom colors in the twentyfour wells are saved to registry for next time you run the program. - HSV Model: green yellow o-----o / \ / white \ cyan o o o red \ / \ / o-----o blue magenta - Perhaps this panel should send color change messages to active colorwell widget? - Still need a way to pick a color from the screen:- look at WindowMaker. */ using namespace FX; /*******************************************************************************/ namespace FX { /*******************************************************************************/ // Map FXDEFMAP(FXColorSelector) FXColorSelectorMap[]={ FXMAPFUNC(SEL_UPDATE,FXColorSelector::ID_ALPHA_TEXT,FXColorSelector::onUpdAlphaText), FXMAPFUNC(SEL_COMMAND,FXColorSelector::ID_ALPHA_TEXT,FXColorSelector::onCmdAlphaText), FXMAPFUNC(SEL_UPDATE,FXColorSelector::ID_ALPHA_LABEL,FXColorSelector::onUpdAlphaLabel), FXMAPFUNC(SEL_UPDATE,FXColorSelector::ID_ALPHA_SLIDER,FXColorSelector::onUpdAlphaSlider), FXMAPFUNC(SEL_CHANGED,FXColorSelector::ID_ALPHA_SLIDER,FXColorSelector::onCmdAlphaSlider), FXMAPFUNC(SEL_COMMAND,FXColorSelector::ID_ALPHA_SLIDER,FXColorSelector::onCmdAlphaSlider), FXMAPFUNCS(SEL_UPDATE,FXColorSelector::ID_RGB_RED_TEXT,FXColorSelector::ID_RGB_BLUE_TEXT,FXColorSelector::onUpdRGBText), FXMAPFUNCS(SEL_UPDATE,FXColorSelector::ID_HSV_HUE_TEXT,FXColorSelector::ID_HSV_VALUE_TEXT,FXColorSelector::onUpdHSVText), FXMAPFUNCS(SEL_UPDATE,FXColorSelector::ID_CMY_CYAN_TEXT,FXColorSelector::ID_CMY_YELLOW_TEXT,FXColorSelector::onUpdCMYText), FXMAPFUNCS(SEL_COMMAND,FXColorSelector::ID_RGB_RED_TEXT,FXColorSelector::ID_RGB_BLUE_TEXT,FXColorSelector::onCmdRGBText), FXMAPFUNCS(SEL_COMMAND,FXColorSelector::ID_HSV_HUE_TEXT,FXColorSelector::ID_HSV_VALUE_TEXT,FXColorSelector::onCmdHSVText), FXMAPFUNCS(SEL_COMMAND,FXColorSelector::ID_CMY_CYAN_TEXT,FXColorSelector::ID_CMY_YELLOW_TEXT,FXColorSelector::onCmdCMYText), FXMAPFUNCS(SEL_UPDATE,FXColorSelector::ID_RGB_RED_SLIDER,FXColorSelector::ID_RGB_BLUE_SLIDER,FXColorSelector::onUpdRGBSlider), FXMAPFUNCS(SEL_UPDATE,FXColorSelector::ID_HSV_HUE_SLIDER,FXColorSelector::ID_HSV_VALUE_SLIDER,FXColorSelector::onUpdHSVSlider), FXMAPFUNCS(SEL_UPDATE,FXColorSelector::ID_CMY_CYAN_SLIDER,FXColorSelector::ID_CMY_YELLOW_SLIDER,FXColorSelector::onUpdCMYSlider), FXMAPFUNCS(SEL_CHANGED,FXColorSelector::ID_RGB_RED_SLIDER,FXColorSelector::ID_RGB_BLUE_SLIDER,FXColorSelector::onCmdRGBSlider), FXMAPFUNCS(SEL_COMMAND,FXColorSelector::ID_RGB_RED_SLIDER,FXColorSelector::ID_RGB_BLUE_SLIDER,FXColorSelector::onCmdRGBSlider), FXMAPFUNCS(SEL_CHANGED,FXColorSelector::ID_HSV_HUE_SLIDER,FXColorSelector::ID_HSV_VALUE_SLIDER,FXColorSelector::onCmdHSVSlider), FXMAPFUNCS(SEL_COMMAND,FXColorSelector::ID_HSV_HUE_SLIDER,FXColorSelector::ID_HSV_VALUE_SLIDER,FXColorSelector::onCmdHSVSlider), FXMAPFUNCS(SEL_CHANGED,FXColorSelector::ID_CMY_CYAN_SLIDER,FXColorSelector::ID_CMY_YELLOW_SLIDER,FXColorSelector::onCmdCMYSlider), FXMAPFUNCS(SEL_COMMAND,FXColorSelector::ID_CMY_CYAN_SLIDER,FXColorSelector::ID_CMY_YELLOW_SLIDER,FXColorSelector::onCmdCMYSlider), FXMAPFUNC(SEL_COMMAND,FXColorSelector::ID_WELL_CHANGED,FXColorSelector::onCmdWell), FXMAPFUNC(SEL_CHANGED,FXColorSelector::ID_WELL_CHANGED,FXColorSelector::onChgWell), FXMAPFUNCS(SEL_COMMAND,FXColorSelector::ID_CUSTOM_FIRST,FXColorSelector::ID_CUSTOM_LAST,FXColorSelector::onCmdCustomWell), FXMAPFUNCS(SEL_CHANGED,FXColorSelector::ID_CUSTOM_FIRST,FXColorSelector::ID_CUSTOM_LAST,FXColorSelector::onChgCustomWell), FXMAPFUNC(SEL_COMMAND,FXColorSelector::ID_COLOR_LIST,FXColorSelector::onCmdList), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXColorSelector::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXColorSelector::ID_ACTIVEPANE,FXColorSelector::onCmdActivePane), FXMAPFUNC(SEL_UPDATE,FXColorSelector::ID_DIAL_WHEEL,FXColorSelector::onUpdWheel), FXMAPFUNC(SEL_COMMAND,FXColorSelector::ID_DIAL_WHEEL,FXColorSelector::onCmdWheel), FXMAPFUNC(SEL_CHANGED,FXColorSelector::ID_DIAL_WHEEL,FXColorSelector::onCmdWheel), FXMAPFUNC(SEL_COMMAND,FXColorSelector::ID_COLORPICK,FXColorSelector::onCmdColorPick), }; // Object implementation FXIMPLEMENT(FXColorSelector,FXPacker,FXColorSelectorMap,ARRAYNUMBER(FXColorSelectorMap)) // Well names const FXchar* FXColorSelector::wellname[24]={ "wella","wellb","wellc","welld", "welle","wellf","wellg","wellh", "welli","wellj","wellk","welll", "wellm","welln","wello","wellp", "wellq","wellr","wells","wellt", "wellu","wellv","wellw","wellx" }; /*******************************************************************************/ // Separator item FXColorSelector::FXColorSelector(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXPacker(p,opts,x,y,w,h){ FXLabel *label; target=tgt; message=sel; // Buttons FXHorizontalFrame *buttons=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH); accept=new FXButton(buttons,tr("&Accept"),NULL,NULL,0,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT,0,0,0,0,20,20); cancel=new FXButton(buttons,tr("&Cancel"),NULL,NULL,0,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT,0,0,0,0,20,20); // Separator new FXHorizontalSeparator(this,SEPARATOR_RIDGE|LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); // Icons eyedropicon=new FXGIFIcon(getApp(),eyedrop); dialmodeicon=new FXGIFIcon(getApp(),dialmode); rgbmodeicon=new FXGIFIcon(getApp(),rgbmode); hsvmodeicon=new FXGIFIcon(getApp(),hsvmode); cmymodeicon=new FXGIFIcon(getApp(),cmymode); txtmodeicon=new FXGIFIcon(getApp(),listmode); // Wells with custom colors FXHorizontalFrame *colors=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X, 0,0,0,0, 0,0,0,0, 0,0); colorwells[0]=new FXColorWell(colors,FXRGBA(255,255,255,255),this,ID_CUSTOM_FIRST+0,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[1]=new FXColorWell(colors,FXRGBA( 0, 0, 0,255),this,ID_CUSTOM_FIRST+1,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[2]=new FXColorWell(colors,FXRGBA(255, 0, 0,255),this,ID_CUSTOM_FIRST+2,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[3]=new FXColorWell(colors,FXRGBA( 0,255, 0,255),this,ID_CUSTOM_FIRST+3,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[4]=new FXColorWell(colors,FXRGBA( 0, 0,255,255),this,ID_CUSTOM_FIRST+4,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[5]=new FXColorWell(colors,FXRGBA( 0, 0,255,255),this,ID_CUSTOM_FIRST+5,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[6]=new FXColorWell(colors,FXRGBA(255,255, 0,255),this,ID_CUSTOM_FIRST+6,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[7]=new FXColorWell(colors,FXRGBA( 0,255,255,255),this,ID_CUSTOM_FIRST+7,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[8]=new FXColorWell(colors,FXRGBA(255, 0,255,255),this,ID_CUSTOM_FIRST+8,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[9]=new FXColorWell(colors,FXRGBA(128, 0, 0,255),this,ID_CUSTOM_FIRST+9,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[10]=new FXColorWell(colors,FXRGBA( 0,128, 0,255),this,ID_CUSTOM_FIRST+10,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[11]=new FXColorWell(colors,FXRGBA( 0, 0,128,255),this,ID_CUSTOM_FIRST+11,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[12]=new FXColorWell(colors,FXRGBA(128,128, 0,255),this,ID_CUSTOM_FIRST+12,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[13]=new FXColorWell(colors,FXRGBA(128, 0,128,255),this,ID_CUSTOM_FIRST+13,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[14]=new FXColorWell(colors,FXRGBA( 0,128,128,255),this,ID_CUSTOM_FIRST+14,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[15]=new FXColorWell(colors,FXRGBA( 0,128,128,255),this,ID_CUSTOM_FIRST+15,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[16]=new FXColorWell(colors,FXRGBA(255, 0,255,255),this,ID_CUSTOM_FIRST+16,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[17]=new FXColorWell(colors,FXRGBA(128, 0, 0,255),this,ID_CUSTOM_FIRST+17,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[18]=new FXColorWell(colors,FXRGBA( 0,128, 0,255),this,ID_CUSTOM_FIRST+18,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[19]=new FXColorWell(colors,FXRGBA( 0, 0,128,255),this,ID_CUSTOM_FIRST+19,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[20]=new FXColorWell(colors,FXRGBA(128,128, 0,255),this,ID_CUSTOM_FIRST+20,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[21]=new FXColorWell(colors,FXRGBA(128, 0,128,255),this,ID_CUSTOM_FIRST+21,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[22]=new FXColorWell(colors,FXRGBA( 0,128,128,255),this,ID_CUSTOM_FIRST+22,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); colorwells[23]=new FXColorWell(colors,FXRGBA( 0,128,128,255),this,ID_CUSTOM_FIRST+23,COLORWELL_SOURCEONLY|LAYOUT_CENTER_Y|LAYOUT_CENTER_X, 0,0,0,0 ,0,0,0,0); // Main part FXHorizontalFrame *main=new FXHorizontalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y); FXVerticalFrame *wellframe=new FXVerticalFrame(main,LAYOUT_FILL_Y,0,0,0,0, 0,0,10,0,0,2); // Color sucker new FXPicker(wellframe,tr("\tPick color"),eyedropicon,this,ID_COLORPICK,JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_X|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,0,0,56,32,0,0,0,0); // Main color well well=new FXColorWell(wellframe,FXRGBA(255,255,255,255),this,ID_WELL_CHANGED,COLORWELL_SOURCEONLY|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH, 0,0,64,0 ,0,0,0,0); // Tab book with switchable panels panels=new FXTabBook(main,this,ID_ACTIVEPANE,TABBOOK_TOPTABS|LAYOUT_FILL_Y|LAYOUT_FILL_X); // HSV Dial Mode new FXTabItem(panels,tr("\tHue, Saturation, Value"),dialmodeicon,TAB_TOP_NORMAL,0,0,0,0, 6,6,0,0); // Color wheel FXHorizontalFrame *dialblock=new FXHorizontalFrame(panels,FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_Y|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,0,0,0,0,15,15,5,5, 5,8); wheel=new FXColorRing(dialblock,this,ID_DIAL_WHEEL,LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,0,0,120,120,1,1,1,1); //new FXColorWheel(dialblock,NULL,0,LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,0,0,130,130,1,1,1,1); // RGB Mode new FXTabItem(panels,tr("\tRed, Green, Blue"),rgbmodeicon,TAB_TOP_NORMAL,0,0,0,0, 6,6,0,0); // RGB Sliders FXMatrix *rgbblock=new FXMatrix(panels,3,FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_Y|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,0,0,0,0,10,10,10,10, 5,8); // Red new FXLabel(rgbblock,tr("&Red:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); rgbatext[0]=new FXTextField(rgbblock,5,this,FXColorSelector::ID_RGB_RED_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); rgbaslider[0]=new FXSlider(rgbblock,this,FXColorSelector::ID_RGB_RED_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); // Green slider new FXLabel(rgbblock,tr("&Green:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); rgbatext[1]=new FXTextField(rgbblock,5,this,FXColorSelector::ID_RGB_GREEN_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); rgbaslider[1]=new FXSlider(rgbblock,this,FXColorSelector::ID_RGB_GREEN_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); // Blue slider new FXLabel(rgbblock,tr("&Blue:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); rgbatext[2]=new FXTextField(rgbblock,5,this,FXColorSelector::ID_RGB_BLUE_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); rgbaslider[2]=new FXSlider(rgbblock,this,FXColorSelector::ID_RGB_BLUE_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); // Alpha slider label=new FXLabel(rgbblock,tr("&Alpha:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); rgbatext[3]=new FXTextField(rgbblock,5,this,FXColorSelector::ID_ALPHA_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); rgbaslider[3]=new FXSlider(rgbblock,this,FXColorSelector::ID_ALPHA_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); label->setTarget(this); label->setSelector(ID_ALPHA_LABEL); // Set ranges and increment rgbaslider[0]->setRange(0,255); rgbaslider[1]->setRange(0,255); rgbaslider[2]->setRange(0,255); rgbaslider[3]->setRange(0,255); // HSV Mode new FXTabItem(panels,tr("\tHue, Saturation, Value"),hsvmodeicon,TAB_TOP_NORMAL,0,0,0,0, 6,6,0,0); // RGB Sliders FXMatrix *hsvblock=new FXMatrix(panels,3,FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_Y|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,0,0,0,0,10,10,10,10, 5,8); // Hue Slider new FXLabel(hsvblock,tr("Hue:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); hsvatext[0]=new FXTextField(hsvblock,5,this,FXColorSelector::ID_HSV_HUE_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); hsvaslider[0]=new FXSlider(hsvblock,this,FXColorSelector::ID_HSV_HUE_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); // Saturation slider new FXLabel(hsvblock,tr("Saturation:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); hsvatext[1]=new FXTextField(hsvblock,5,this,FXColorSelector::ID_HSV_SATURATION_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); hsvaslider[1]=new FXSlider(hsvblock,this,FXColorSelector::ID_HSV_SATURATION_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); // Value slider new FXLabel(hsvblock,tr("Value:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); hsvatext[2]=new FXTextField(hsvblock,5,this,FXColorSelector::ID_HSV_VALUE_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); hsvaslider[2]=new FXSlider(hsvblock,this,FXColorSelector::ID_HSV_VALUE_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); // Alpha slider label=new FXLabel(hsvblock,tr("Alpha:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); hsvatext[3]=new FXTextField(hsvblock,5,this,FXColorSelector::ID_ALPHA_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); hsvaslider[3]=new FXSlider(hsvblock,this,FXColorSelector::ID_ALPHA_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); label->setTarget(this); label->setSelector(ID_ALPHA_LABEL); // Set ranges and increment hsvaslider[0]->setRange(0,360); hsvaslider[1]->setRange(0,1000); hsvaslider[2]->setRange(0,1000); hsvaslider[3]->setRange(0,255); // CMY Mode new FXTabItem(panels,tr("\tCyan, Magenta, Yellow"),cmymodeicon,TAB_TOP_NORMAL,0,0,0,0, 6,6,0,0); // RGB Sliders FXMatrix *cmyblock=new FXMatrix(panels,3,FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_Y|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT|MATRIX_BY_COLUMNS,0,0,0,0,10,10,10,10, 5,8); // Cyan Slider new FXLabel(cmyblock,tr("Cyan:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); cmytext[0]=new FXTextField(cmyblock,5,this,FXColorSelector::ID_CMY_CYAN_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); cmyslider[0]=new FXSlider(cmyblock,this,FXColorSelector::ID_CMY_CYAN_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); // Magenta slider new FXLabel(cmyblock,tr("Magenta:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); cmytext[1]=new FXTextField(cmyblock,5,this,FXColorSelector::ID_CMY_MAGENTA_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); cmyslider[1]=new FXSlider(cmyblock,this,FXColorSelector::ID_CMY_MAGENTA_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); // Yellow slider new FXLabel(cmyblock,tr("Yellow:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); cmytext[2]=new FXTextField(cmyblock,5,this,FXColorSelector::ID_CMY_YELLOW_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); cmyslider[2]=new FXSlider(cmyblock,this,FXColorSelector::ID_CMY_YELLOW_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); // Alpha slider label=new FXLabel(cmyblock,tr("Alpha:"),NULL,LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|LAYOUT_RIGHT); cmytext[3]=new FXTextField(cmyblock,5,this,FXColorSelector::ID_ALPHA_TEXT,JUSTIFY_RIGHT|LAYOUT_FILL_ROW|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, DEFAULT_PAD,DEFAULT_PAD,0,0); cmyslider[3]=new FXSlider(cmyblock,this,FXColorSelector::ID_ALPHA_SLIDER,LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|SLIDER_HORIZONTAL|SLIDER_INSIDE_BAR,0,0,0,15); label->setTarget(this); label->setSelector(ID_ALPHA_LABEL); // Set ranges and increment cmyslider[0]->setRange(0,255); cmyslider[1]->setRange(0,255); cmyslider[2]->setRange(0,255); cmyslider[3]->setRange(0,255); // Named Color Mode new FXTabItem(panels,tr("\tBy Name"),txtmodeicon,TAB_TOP_NORMAL,0,0,0,0, 6,6,0,0); // Name list FXHorizontalFrame *outer=new FXHorizontalFrame(panels,FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_Y|LAYOUT_FILL_X); FXHorizontalFrame *frame=new FXHorizontalFrame(outer,LAYOUT_FILL_Y|LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, 0,0,0,0); list=new FXColorList(frame,this,ID_COLOR_LIST,LAYOUT_FILL_Y|LAYOUT_FILL_X|LIST_BROWSESELECT); list->setNumVisible(6); // Add color names for(FXuint i=0; iappendItem(tr(fxcolornames[i].name),fxcolornames[i].color); } // Init RGBA rgba[0]=0.0; rgba[1]=0.0; rgba[2]=0.0; rgba[3]=1.0; // Init HSVA hsva[0]=360.0; hsva[1]=0.0; hsva[2]=0.0; hsva[3]=1.0; // Reflect color in well updateWell(); // Initial focus on accept button accept->setFocus(); } // Init the panel void FXColorSelector::create(){ FXPacker::create(); // Get custom well colors from defaults database colorwells[0]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[0],FXRGBA(255,255,255,255))); colorwells[1]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[1],FXRGBA( 0, 0, 0,255))); colorwells[2]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[2],FXRGBA(255, 0, 0,255))); colorwells[3]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[3],FXRGBA( 0,255, 0,255))); colorwells[4]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[4],FXRGBA( 0, 0,255,255))); colorwells[5]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[5],FXRGBA( 0, 0,255,255))); colorwells[6]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[6],FXRGBA(255,255, 0,255))); colorwells[7]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[7],FXRGBA( 0,255,255,255))); colorwells[8]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[8],FXRGBA(255, 0,255,255))); colorwells[9]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[9],FXRGBA(128, 0, 0,255))); colorwells[10]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[10],FXRGBA( 0,128, 0,255))); colorwells[11]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[11],FXRGBA( 0, 0,128,255))); colorwells[12]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[12],FXRGBA(128,128, 0,255))); colorwells[13]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[13],FXRGBA(128, 0,128,255))); colorwells[14]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[14],FXRGBA( 0,128,128,255))); colorwells[15]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[15],FXRGBA( 0,128,128,255))); colorwells[16]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[16],FXRGBA(255, 0,255,255))); colorwells[17]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[17],FXRGBA(128, 0, 0,255))); colorwells[18]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[18],FXRGBA( 0,128, 0,255))); colorwells[19]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[19],FXRGBA( 0, 0,128,255))); colorwells[20]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[20],FXRGBA(128,128, 0,255))); colorwells[21]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[21],FXRGBA(128, 0,128,255))); colorwells[22]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[22],FXRGBA( 0,128,128,255))); colorwells[23]->setRGBA(getApp()->reg().readColorEntry("SETTINGS",wellname[23],FXRGBA( 0,128,128,255))); // Switch to correct pane panels->setCurrent(getApp()->reg().readIntEntry("SETTINGS","activecolorpane",0)); } /*******************************************************************************/ // ALPHA // Update well from Alpha slider long FXColorSelector::onCmdAlphaSlider(FXObject* sender,FXSelector sel,void*){ FXint value; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&value); hsva[3]=rgba[3]=0.003921568627f*value; updateWell(); if(target) target->tryHandle(this,FXSEL(FXSELTYPE(sel),message),(void*)(FXuval)well->getRGBA()); return 1; } // Update well from Alpha text fields long FXColorSelector::onCmdAlphaText(FXObject* sender,FXSelector,void*){ FXdouble value; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETREALVALUE),(void*)&value); hsva[3]=rgba[3]=0.003921568627f*(FXfloat)value; updateWell(); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)well->getRGBA()); return 1; } // Update Alpha text fields long FXColorSelector::onUpdAlphaText(FXObject* sender,FXSelector,void*){ if(isOpaqueOnly()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_HIDE),NULL); } else{ FXString value=FXStringVal(255.0*rgba[3],1,FALSE); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&value); sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); } return 1; } // Update Alpha sliders long FXColorSelector::onUpdAlphaSlider(FXObject* sender,FXSelector,void*){ if(isOpaqueOnly()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_HIDE),NULL); } else{ FXint value=(FXint)(255.0*rgba[3]); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&value); sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); } return 1; } // Update Alpha Labels long FXColorSelector::onUpdAlphaLabel(FXObject* sender,FXSelector,void*){ sender->handle(this,isOpaqueOnly()?FXSEL(SEL_COMMAND,ID_HIDE):FXSEL(SEL_COMMAND,ID_SHOW),NULL); return 1; } /*******************************************************************************/ // Wheel // Update well from wheel long FXColorSelector::onCmdWheel(FXObject*,FXSelector sel,void*){ hsva[0]=wheel->getHue(); hsva[1]=wheel->getSat(); hsva[2]=wheel->getVal(); fxhsv_to_rgb(rgba[0],rgba[1],rgba[2],hsva[0],hsva[1],hsva[2]); updateWell(); if(target) target->tryHandle(this,FXSEL(FXSELTYPE(sel),message),(void*)(FXuval)well->getRGBA()); return 1; } // Update wheel long FXColorSelector::onUpdWheel(FXObject*,FXSelector,void*){ wheel->setHue(hsva[0]); wheel->setSat(hsva[1]); wheel->setVal(hsva[2]); return 1; } /*******************************************************************************/ // RGB // Update well from RGB slider long FXColorSelector::onCmdRGBSlider(FXObject*,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_RGB_RED_SLIDER; rgba[which]=0.003921568627f*rgbaslider[which]->getValue(); fxrgb_to_hsv(hsva[0],hsva[1],hsva[2],rgba[0],rgba[1],rgba[2]); updateWell(); if(target) target->tryHandle(this,FXSEL(FXSELTYPE(sel),message),(void*)(FXuval)well->getRGBA()); return 1; } // Update well from RGB text fields long FXColorSelector::onCmdRGBText(FXObject*,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_RGB_RED_TEXT; rgba[which]=0.003921568627f*FXFloatVal(rgbatext[which]->getText()); fxrgb_to_hsv(hsva[0],hsva[1],hsva[2],rgba[0],rgba[1],rgba[2]); updateWell(); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)well->getRGBA()); return 1; } // Update RGB text fields long FXColorSelector::onUpdRGBText(FXObject*,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_RGB_RED_TEXT; rgbatext[which]->setText(FXStringVal(255.0f*rgba[which],1,FALSE)); return 1; } // Update RGB sliders long FXColorSelector::onUpdRGBSlider(FXObject*,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_RGB_RED_SLIDER; rgbaslider[which]->setValue((FXint)(255.0f*rgba[which])); return 1; } /*******************************************************************************/ // HSV // Update well from HSV sliders long FXColorSelector::onCmdHSVSlider(FXObject*,FXSelector sel,void*){ const FXfloat factor[3]={1.0f,0.001f,0.001f}; FXint which=FXSELID(sel)-ID_HSV_HUE_SLIDER; hsva[which]=factor[which]*hsvaslider[which]->getValue(); fxhsv_to_rgb(rgba[0],rgba[1],rgba[2],hsva[0],hsva[1],hsva[2]); updateWell(); if(target) target->tryHandle(this,FXSEL(FXSELTYPE(sel),message),(void*)(FXuval)well->getRGBA()); return 1; } // Update well from HSV text fields long FXColorSelector::onCmdHSVText(FXObject*,FXSelector sel,void*){ const FXfloat factor[3]={1.0f,0.01f,0.01f}; FXint which=FXSELID(sel)-ID_HSV_HUE_TEXT; hsva[which]=factor[which]*FXFloatVal(hsvatext[which]->getText()); fxhsv_to_rgb(rgba[0],rgba[1],rgba[2],hsva[0],hsva[1],hsva[2]); updateWell(); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)well->getRGBA()); return 1; } // Update HSV text fields long FXColorSelector::onUpdHSVText(FXObject*,FXSelector sel,void*){ const FXfloat factor[3]={1.0f,100.0f,100.0f}; FXint which=FXSELID(sel)-ID_HSV_HUE_TEXT; hsvatext[which]->setText(FXStringVal(hsva[which]*factor[which],1,FALSE)); return 1; } // Update HSV sliders long FXColorSelector::onUpdHSVSlider(FXObject*,FXSelector sel,void*){ const FXfloat factor[3]={1.0f,1000.0f,1000.0f}; FXint which=FXSELID(sel)-ID_HSV_HUE_SLIDER; hsvaslider[which]->setValue((FXint)(hsva[which]*factor[which])); return 1; } /*******************************************************************************/ // CMY long FXColorSelector::onCmdCMYSlider(FXObject*,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_CMY_CYAN_SLIDER; FXfloat val=0.003921568627f*cmyslider[which]->getValue(); rgba[which]=1.0f-val; fxrgb_to_hsv(hsva[0],hsva[1],hsva[2],rgba[0],rgba[1],rgba[2]); hsva[3]=rgba[3]; updateWell(); if(target) target->tryHandle(this,FXSEL(FXSELTYPE(sel),message),(void*)(FXuval)well->getRGBA()); return 1; } long FXColorSelector::onCmdCMYText(FXObject*,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_CMY_CYAN_TEXT; FXfloat val=0.003921568627f*FXFloatVal(cmytext[which]->getText()); rgba[which]=1.0f-val; fxrgb_to_hsv(hsva[0],hsva[1],hsva[2],rgba[0],rgba[1],rgba[2]); hsva[3]=rgba[3]; updateWell(); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)well->getRGBA()); return 1; } long FXColorSelector::onUpdCMYText(FXObject*,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_CMY_CYAN_TEXT; FXfloat val=255.0f-255.0f*rgba[which]; cmytext[which]->setText(FXStringVal(val,1,FALSE)); return 1; } long FXColorSelector::onUpdCMYSlider(FXObject*,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_CMY_CYAN_SLIDER; FXint val=(FXint)(255.0f-255.0f*rgba[which]); cmyslider[which]->setValue(val); return 1; } /*******************************************************************************/ // Color picker long FXColorSelector::onCmdColorPick(FXObject*,FXSelector,void* ptr){ FXPoint *point=(FXPoint*)ptr; FXDCWindow dc(getRoot()); setRGBA(dc.readPixel(point->x,point->y)); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)well->getRGBA()); return 1; } /*******************************************************************************/ // Dropped color in main well long FXColorSelector::onChgWell(FXObject*,FXSelector,void* ptr){ FXColor color=(FXColor)(FXuval)ptr; if(isOpaqueOnly()) color|=FXRGBA(0,0,0,255); rgba[0]=0.003921568627f*FXREDVAL(color); rgba[1]=0.003921568627f*FXGREENVAL(color); rgba[2]=0.003921568627f*FXBLUEVAL(color); rgba[3]=0.003921568627f*FXALPHAVAL(color); fxrgb_to_hsv(hsva[0],hsva[1],hsva[2],rgba[0],rgba[1],rgba[2]); hsva[3]=rgba[3]; return 1; } // Command from main well long FXColorSelector::onCmdWell(FXObject*,FXSelector,void*){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)well->getRGBA()); return 1; } // Update main well void FXColorSelector::updateWell(){ well->setRGBA(FXRGBA((int)(rgba[0]*255.0),(int)(rgba[1]*255.0),(int)(rgba[2]*255.0),(int)(rgba[3]*255.0))); } /*******************************************************************************/ // Clicked on color in list long FXColorSelector::onCmdList(FXObject*,FXSelector,void* ptr){ FXint index=(FXint)(FXuval)ptr; FXColor clr=fxcolornames[index].color; if(isOpaqueOnly()) clr|=FXRGBA(0,0,0,255); rgba[0]=0.003921568627f*FXREDVAL(clr); rgba[1]=0.003921568627f*FXGREENVAL(clr); rgba[2]=0.003921568627f*FXBLUEVAL(clr); rgba[3]=0.003921568627f*FXALPHAVAL(clr); fxrgb_to_hsv(hsva[0],hsva[1],hsva[2],rgba[0],rgba[1],rgba[2]); hsva[3]=rgba[3]; updateWell(); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)well->getRGBA()); return 1; } /*******************************************************************************/ // Custom well changed long FXColorSelector::onChgCustomWell(FXObject*,FXSelector sel,void* ptr){ FXColor color=(FXColor)(FXuval)ptr; FXuint which=FXSELID(sel)-ID_CUSTOM_FIRST; FXASSERT(which<24); getApp()->reg().writeColorEntry("SETTINGS",wellname[which],color); return 1; } // Custom well clicked long FXColorSelector::onCmdCustomWell(FXObject*,FXSelector,void* ptr){ FXColor color=(FXColor)(FXuval)ptr; if(isOpaqueOnly()) color|=FXRGBA(0,0,0,255); setRGBA(color); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)well->getRGBA()); return 1; } // Switching active pane long FXColorSelector::onCmdActivePane(FXObject*,FXSelector,void* ptr){ getApp()->reg().writeIntEntry("SETTINGS","activecolorpane",(FXint)(FXival)ptr); return 1; } /*******************************************************************************/ // Set color long FXColorSelector::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setRGBA((FXColor)(FXuval)ptr); return 1; } // Change RGBA color void FXColorSelector::setRGBA(FXColor clr){ if(clr!=well->getRGBA()){ rgba[0]=0.003921568627f*FXREDVAL(clr); rgba[1]=0.003921568627f*FXGREENVAL(clr); rgba[2]=0.003921568627f*FXBLUEVAL(clr); rgba[3]=0.003921568627f*FXALPHAVAL(clr); fxrgb_to_hsv(hsva[0],hsva[1],hsva[2],rgba[0],rgba[1],rgba[2]); hsva[3]=rgba[3]; well->setRGBA(clr); } } // Retrieve RGBA color FXColor FXColorSelector::getRGBA() const { return well->getRGBA(); } // Return true if only opaque colors allowed FXbool FXColorSelector::isOpaqueOnly() const { return well->isOpaqueOnly(); } // Change opaque only mode void FXColorSelector::setOpaqueOnly(FXbool opaque){ if(opaque){ well->setOpaqueOnly(TRUE); setRGBA(well->getRGBA() | FXRGBA(0,0,0,255)); } else{ well->setOpaqueOnly(FALSE); } } /*******************************************************************************/ // Save data void FXColorSelector::save(FXStream& store) const { FXPacker::save(store); store << panels; store << well; store << list; store << accept; store << cancel; store << dialmodeicon; store << rgbmodeicon; store << hsvmodeicon; store << cmymodeicon; store << txtmodeicon; store << wheel; store << rgbaslider[0] << rgbaslider[1] << rgbaslider[2] << rgbaslider[3]; store << hsvaslider[0] << hsvaslider[1] << hsvaslider[2] << hsvaslider[3]; store << cmyslider[0] << cmyslider[1] << cmyslider[2] << cmyslider[3]; store << rgbatext[0] << rgbatext[1] << rgbatext[2] << rgbatext[3]; store << hsvatext[0] << hsvatext[1] << hsvatext[2] << hsvatext[3]; store << cmytext[0] << cmytext[1] << cmytext[2] << cmytext[3]; store << colorwells[0] << colorwells[1] << colorwells[2] << colorwells[3]; store << colorwells[4] << colorwells[5] << colorwells[6] << colorwells[7]; store << colorwells[8] << colorwells[9] << colorwells[10] << colorwells[11]; store << colorwells[12] << colorwells[13] << colorwells[14] << colorwells[15]; store << colorwells[16] << colorwells[17] << colorwells[18] << colorwells[19]; store << colorwells[20] << colorwells[21] << colorwells[22] << colorwells[23]; store.save(rgba,4); store.save(hsva,4); } // Load data void FXColorSelector::load(FXStream& store){ FXPacker::load(store); store >> panels; store >> well; store >> list; store >> accept; store >> cancel; store >> dialmodeicon; store >> rgbmodeicon; store >> hsvmodeicon; store >> cmymodeicon; store >> txtmodeicon; store >> wheel; store >> rgbaslider[0] >> rgbaslider[1] >> rgbaslider[2] >> rgbaslider[3]; store >> hsvaslider[0] >> hsvaslider[1] >> hsvaslider[2] >> hsvaslider[3]; store >> cmyslider[0] >> cmyslider[1] >> cmyslider[2] >> cmyslider[3]; store >> rgbatext[0] >> rgbatext[1] >> rgbatext[2] >> rgbatext[3]; store >> hsvatext[0] >> hsvatext[1] >> hsvatext[2] >> hsvatext[3]; store >> cmytext[0] >> cmytext[1] >> cmytext[2] >> cmytext[3]; store >> colorwells[0] >> colorwells[1] >> colorwells[2] >> colorwells[3]; store >> colorwells[4] >> colorwells[5] >> colorwells[6] >> colorwells[7]; store >> colorwells[8] >> colorwells[9] >> colorwells[10] >> colorwells[11]; store >> colorwells[12] >> colorwells[13] >> colorwells[14] >> colorwells[15]; store >> colorwells[16] >> colorwells[17] >> colorwells[18] >> colorwells[19]; store >> colorwells[20] >> colorwells[21] >> colorwells[22] >> colorwells[23]; store.load(rgba,4); store.load(hsva,4); } // Cleanup; icons must be explicitly deleted FXColorSelector::~FXColorSelector(){ delete eyedropicon; delete dialmodeicon; delete rgbmodeicon; delete hsvmodeicon; delete cmymodeicon; delete txtmodeicon; wheel=(FXColorRing*)-1L; eyedropicon=(FXIcon*)-1L; dialmodeicon=(FXIcon*)-1L; rgbmodeicon=(FXIcon*)-1L; hsvmodeicon=(FXIcon*)-1L; cmymodeicon=(FXIcon*)-1L; txtmodeicon=(FXIcon*)-1L; panels=(FXTabBook*)-1L; well=(FXColorWell*)-1L; accept=(FXButton*)-1L; cancel=(FXButton*)-1L; } } fox1.6-1.6.57/src/FXColorWell.cpp000066400000000000000000000577451326741342000163120ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r W e l l C l a s s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorWell.cpp,v 1.68 2006/01/22 17:58:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObject.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXLabel.h" #include "FXColorWell.h" #include "FXColorDialog.h" /* Notes: - Is there any reason why one wouldn't ^C ^V on the clipboard colors same as text? Maybe ^A should claim selection? - Single-click should send SEL_COMMAND to target. - Perhaps change of color should send SEL_CHANGED. - Do not start drag operation unless moving a little bit. - Drive from keyboard. - Yes, you can now drag a color into a text widget, or drag the name of a color into the well, as well as pasting a color into a text widget or vice versa! - KDE/Qt has color drag and drop wrong:- should multiply by 257, not 255, so get full range of [0 - 65535]. */ #define WELLSIZE 12 // Minimum well size #define FOCUSBORDER 3 // Focus border using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXColorWell) FXColorWellMap[]={ FXMAPFUNC(SEL_PAINT,0,FXColorWell::onPaint), FXMAPFUNC(SEL_MOTION,0,FXColorWell::onMotion), FXMAPFUNC(SEL_DRAGGED,0,FXColorWell::onDragged), FXMAPFUNC(SEL_DND_MOTION,0,FXColorWell::onDNDMotion), FXMAPFUNC(SEL_DND_ENTER,0,FXColorWell::onDNDEnter), FXMAPFUNC(SEL_DND_LEAVE,0,FXColorWell::onDNDLeave), FXMAPFUNC(SEL_DND_DROP,0,FXColorWell::onDNDDrop), FXMAPFUNC(SEL_DND_REQUEST,0,FXColorWell::onDNDRequest), FXMAPFUNC(SEL_FOCUSIN,0,FXColorWell::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXColorWell::onFocusOut), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXColorWell::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXColorWell::onLeftBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXColorWell::onMiddleBtnPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXColorWell::onMiddleBtnRelease), FXMAPFUNC(SEL_CLICKED,0,FXColorWell::onClicked), FXMAPFUNC(SEL_DOUBLECLICKED,0,FXColorWell::onDoubleClicked), FXMAPFUNC(SEL_KEYPRESS,0,FXColorWell::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXColorWell::onKeyRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXColorWell::onUngrabbed), FXMAPFUNC(SEL_BEGINDRAG,0,FXColorWell::onBeginDrag), FXMAPFUNC(SEL_ENDDRAG,0,FXColorWell::onEndDrag), FXMAPFUNC(SEL_SELECTION_LOST,0,FXColorWell::onSelectionLost), FXMAPFUNC(SEL_SELECTION_GAINED,0,FXColorWell::onSelectionGained), FXMAPFUNC(SEL_SELECTION_REQUEST,0,FXColorWell::onSelectionRequest), FXMAPFUNC(SEL_QUERY_TIP,0,FXColorWell::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXColorWell::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXColorWell::ID_SETVALUE,FXColorWell::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXColorWell::ID_SETINTVALUE,FXColorWell::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXColorWell::ID_GETINTVALUE,FXColorWell::onCmdGetIntValue), FXMAPFUNC(SEL_CHANGED,FXColorWell::ID_COLORDIALOG,FXColorWell::onChgColorWell), FXMAPFUNC(SEL_COMMAND,FXColorWell::ID_COLORDIALOG,FXColorWell::onCmdColorWell), FXMAPFUNC(SEL_COMMAND,FXColorWell::ID_SETHELPSTRING,FXColorWell::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXColorWell::ID_GETHELPSTRING,FXColorWell::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXColorWell::ID_SETTIPSTRING,FXColorWell::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXColorWell::ID_GETTIPSTRING,FXColorWell::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXColorWell,FXFrame,FXColorWellMap,ARRAYNUMBER(FXColorWellMap)) /*******************************************************************************/ // Init FXColorWell::FXColorWell(){ flags|=FLAG_ENABLED|FLAG_DROPTARGET; rgba=0; wellColor[0]=0; wellColor[1]=0; } // Make a color well FXColorWell::FXColorWell(FXComposite* p,FXColor clr,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_ENABLED|FLAG_DROPTARGET; target=tgt; message=sel; rgba=clr; wellColor[0]=rgbaoverwhite(rgba); wellColor[1]=rgbaoverblack(rgba); } // Create window void FXColorWell::create(){ FXFrame::create(); if(!colorType){ colorType=getApp()->registerDragType(colorTypeName); } if(!textType){ textType=getApp()->registerDragType(textTypeName); } if(!utf8Type){ utf8Type=getApp()->registerDragType(utf8TypeName); } } // Detach window void FXColorWell::detach(){ FXFrame::detach(); colorType=0; textType=0; } // If window can have focus bool FXColorWell::canFocus() const { return true; } // Into focus chain void FXColorWell::setFocus(){ FXFrame::setFocus(); setDefault(TRUE); } // Out of focus chain void FXColorWell::killFocus(){ FXFrame::killFocus(); setDefault(MAYBE); } // Compute color over black FXColor FXColorWell::rgbaoverblack(FXColor clr){ FXint r,g,b,mul=FXALPHAVAL(clr); r=(FXREDVAL(clr)*mul+127)/255; g=(FXGREENVAL(clr)*mul+127)/255; b=(FXBLUEVAL(clr)*mul+127)/255; return FXRGB(r,g,b); } // Compute color over white FXColor FXColorWell::rgbaoverwhite(FXColor clr){ FXint r,g,b,mul=FXALPHAVAL(clr),lum=(255-mul); r=(lum*255+FXREDVAL(clr)*mul+127)/255; g=(lum*255+FXGREENVAL(clr)*mul+127)/255; b=(lum*255+FXBLUEVAL(clr)*mul+127)/255; return FXRGB(r,g,b); } // Get default size FXint FXColorWell::getDefaultWidth(){ return WELLSIZE+FOCUSBORDER+padleft+padright+4; } FXint FXColorWell::getDefaultHeight(){ return WELLSIZE+FOCUSBORDER+padtop+padbottom+4; } // Handle repaint long FXColorWell::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXPoint points[3]; dc.setForeground(backColor); dc.fillRectangle(0,0,width,padtop+FOCUSBORDER); dc.fillRectangle(0,padtop+FOCUSBORDER,padleft+FOCUSBORDER,height-padtop-padbottom-(FOCUSBORDER<<1)); dc.fillRectangle(width-padright-FOCUSBORDER,padtop+FOCUSBORDER,padright+FOCUSBORDER,height-padtop-padbottom-(FOCUSBORDER<<1)); dc.fillRectangle(0,height-padbottom-FOCUSBORDER,width,padbottom+FOCUSBORDER); if(hasSelection()){ dc.setForeground(borderColor); dc.drawRectangle(padleft+1,padtop+1,width-padright-padleft-3,height-padbottom-padtop-3); } dc.setForeground(wellColor[0]); points[0].x=points[1].x=padleft+FOCUSBORDER+2; points[2].x=width-padright-FOCUSBORDER-2; points[0].y=points[2].y=padtop+FOCUSBORDER+2; points[1].y=height-padbottom-FOCUSBORDER-2; dc.fillPolygon(points,3); dc.setForeground(wellColor[1]); points[0].x=padleft+FOCUSBORDER+2; points[1].x=points[2].x=width-padright-FOCUSBORDER-2; points[0].y=points[1].y=height-padbottom-FOCUSBORDER-2; points[2].y=padtop+FOCUSBORDER+2; dc.fillPolygon(points,3); drawDoubleSunkenRectangle(dc,padleft+FOCUSBORDER,padtop+FOCUSBORDER,width-padright-padleft-(FOCUSBORDER<<1),height-padbottom-padtop-(FOCUSBORDER<<1)); if(hasFocus()){ dc.drawFocusRectangle(padleft,padtop,width-padright-padleft,height-padbottom-padtop); } return 1; } // Gained focus long FXColorWell::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onFocusIn(sender,sel,ptr); update(); return 1; } // Lost focus long FXColorWell::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onFocusOut(sender,sel,ptr); update(); return 1; } // Dragging something over well; save old color and block GUI updates long FXColorWell::onDNDEnter(FXObject* sender,FXSelector sel,void* ptr){ if(FXFrame::onDNDEnter(sender,sel,ptr)) return 1; flags&=~FLAG_UPDATE; return 1; } // Dragged out of well, so restore old color and reenable GUI updates long FXColorWell::onDNDLeave(FXObject* sender,FXSelector sel,void* ptr){ if(FXFrame::onDNDLeave(sender,sel,ptr)) return 1; flags|=FLAG_UPDATE; return 1; } // Handle drag-and-drop motion long FXColorWell::onDNDMotion(FXObject* sender,FXSelector sel,void* ptr){ // Handle base class first if(FXFrame::onDNDMotion(sender,sel,ptr)) return 1; // No more messages while inside setDragRectangle(0,0,width,height,FALSE); // Is it a color being dropped? if(offeredDNDType(FROM_DRAGNDROP,colorType)){ acceptDrop(DRAG_ACCEPT); return 1; } // Is it a name of a color being dropped? if(offeredDNDType(FROM_DRAGNDROP,textType)){ acceptDrop(DRAG_ACCEPT); return 1; } return 0; } // Handle drag-and-drop drop long FXColorWell::onDNDDrop(FXObject* sender,FXSelector sel,void* ptr){ FXuchar *pointer; FXuint length; FXColor color; // Enable updating flags|=FLAG_UPDATE; // Try handling it in base class first if(FXFrame::onDNDDrop(sender,sel,ptr)) return 1; // Try and obtain the color first if(getDNDData(FROM_DRAGNDROP,colorType,pointer,length)){ color=FXRGBA((((FXushort*)pointer)[0]+128)/257,(((FXushort*)pointer)[1]+128)/257,(((FXushort*)pointer)[2]+128)/257,(((FXushort*)pointer)[3]+128)/257); FXFREE(&pointer); setRGBA(color,TRUE); return 1; } // Maybe its the name of a color if(getDNDData(FROM_DRAGNDROP,textType,pointer,length)){ FXRESIZE(&pointer,FXuchar,length+1); pointer[length]='\0'; color=fxcolorfromname((const FXchar*)pointer); FXFREE(&pointer); // Accept the drop only if it was a valid color name if(color!=FXRGBA(0,0,0,0)){ setRGBA(color,TRUE); return 1; } } return 0; } // Service requested DND data long FXColorWell::onDNDRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXushort *clr; FXchar *str; // Try handling it in base class first if(FXFrame::onDNDRequest(sender,sel,ptr)) return 1; // Requested as a color if(event->target==colorType){ FXMALLOC(&clr,FXushort,4); clr[0]=257*FXREDVAL(rgba); clr[1]=257*FXGREENVAL(rgba); clr[2]=257*FXBLUEVAL(rgba); clr[3]=257*FXALPHAVAL(rgba); setDNDData(FROM_DRAGNDROP,colorType,(FXuchar*)clr,sizeof(FXushort)*4); return 1; } // Requested as a color name if(event->target==textType){ FXMALLOC(&str,FXchar,50); fxnamefromcolor(str,rgba); setDNDData(FROM_DRAGNDROP,textType,(FXuchar*)str,strlen(str)); return 1; } return 0; } // We now really do have the selection; repaint the text field long FXColorWell::onSelectionGained(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onSelectionGained(sender,sel,ptr); update(); return 1; } // We lost the selection somehow; repaint the text field long FXColorWell::onSelectionLost(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onSelectionLost(sender,sel,ptr); update(); return 1; } // Somebody wants our selection long FXColorWell::onSelectionRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; // Try handling it in base class first if(FXFrame::onSelectionRequest(sender,sel,ptr)) return 1; // Requested as a color if(event->target==colorType){ FXushort *color; FXMALLOC(&color,FXushort,4); color[0]=257*FXREDVAL(rgba); color[1]=257*FXGREENVAL(rgba); color[2]=257*FXBLUEVAL(rgba); color[3]=257*FXALPHAVAL(rgba); setDNDData(FROM_SELECTION,colorType,(FXuchar*)color,sizeof(FXushort)*4); return 1; } // Requested as a color name if(event->target==stringType || event->target==textType){ FXchar *data; FXCALLOC(&data,FXchar,50); fxnamefromcolor(data,rgba); #ifndef WIN32 setDNDData(FROM_SELECTION,event->target,(FXuchar*)data,strlen(data)); #else setDNDData(FROM_SELECTION,event->target,(FXuchar*)data,strlen(data)+1); #endif return 1; } return 0; } // Start a drag operation long FXColorWell::onBeginDrag(FXObject* sender,FXSelector sel,void* ptr){ FXDragType types[2]; if(FXFrame::onBeginDrag(sender,sel,ptr)) return 1; types[0]=colorType; types[1]=textType; beginDrag(types,2); setDragCursor(getApp()->getDefaultCursor(DEF_SWATCH_CURSOR)); return 1; } // End drag operation long FXColorWell::onEndDrag(FXObject* sender,FXSelector sel,void* ptr){ if(FXFrame::onEndDrag(sender,sel,ptr)) return 1; endDrag(didAccept()==DRAG_COPY); setDragCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); return 1; } // Dragged stuff around long FXColorWell::onDragged(FXObject* sender,FXSelector sel,void* ptr){ if(FXFrame::onDragged(sender,sel,ptr)) return 1; handleDrag(((FXEvent*)ptr)->root_x,((FXEvent*)ptr)->root_y,DRAG_COPY); if(didAccept()==DRAG_COPY){ setDragCursor(getApp()->getDefaultCursor(DEF_SWATCH_CURSOR)); } else{ setDragCursor(getApp()->getDefaultCursor(DEF_DNDSTOP_CURSOR)); } return 1; } // Moving long FXColorWell::onMotion(FXObject*,FXSelector,void* ptr){ if(flags&FLAG_DODRAG){ handle(this,FXSEL(SEL_DRAGGED,0),ptr); return 1; } if((flags&FLAG_TRYDRAG) && ((FXEvent*)ptr)->moved){ if(handle(this,FXSEL(SEL_BEGINDRAG,0),ptr)) flags|=FLAG_DODRAG; flags&=~FLAG_TRYDRAG; return 1; } return 0; } // Drag start long FXColorWell::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; if(event->click_count==1){ flags&=~FLAG_UPDATE; flags|=FLAG_TRYDRAG; } } return 1; } // Drop long FXColorWell::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXuint flgs=flags; if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; flags&=~(FLAG_TRYDRAG|FLAG_DODRAG); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(flgs&FLAG_DODRAG){handle(this,FXSEL(SEL_ENDDRAG,0),ptr);} if(event->click_count==1){ handle(this,FXSEL(SEL_CLICKED,0),(void*)(FXuval)rgba); if(!event->moved && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)rgba); } else if(event->click_count==2){ handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)(FXuval)rgba); } return 1; } return 1; } // Pressed middle button to paste long FXColorWell::onMiddleBtnPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONPRESS,message),ptr)) return 1; return 1; } return 0; } // Released middle button causes paste of selection long FXColorWell::onMiddleBtnRelease(FXObject*,FXSelector,void* ptr){ FXuchar *pointer; FXuint length; FXColor color; if(isEnabled()){ ungrab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONRELEASE,message),ptr)) return 1; if(getDNDData(FROM_SELECTION,colorType,pointer,length)){ color=FXRGBA((((FXushort*)pointer)[0]+128)/257,(((FXushort*)pointer)[1]+128)/257,(((FXushort*)pointer)[2]+128)/257,(((FXushort*)pointer)[3]+128)/257); FXFREE(&color); setRGBA(color,TRUE); return 1; } if(getDNDData(FROM_SELECTION,stringType,pointer,length)){ FXRESIZE(&pointer,FXuchar,length+1); pointer[length]='\0'; color=fxcolorfromname((const FXchar*)pointer); FXFREE(&pointer); setRGBA(color,TRUE); return 1; } } return 0; } // Key Press long FXColorWell::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; switch(event->code){ case KEY_space: case KEY_KP_Enter: case KEY_Return: flags&=~FLAG_UPDATE; return 1; } } return 0; } // Key Release long FXColorWell::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_space: handle(this,FXSEL(SEL_CLICKED,0),(void*)(FXuval)rgba); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)rgba); return 1; case KEY_KP_Enter: case KEY_Return: handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)(FXuval)rgba); return 1; } } return 0; } // Clicked in the well long FXColorWell::onClicked(FXObject*,FXSelector,void*){ FXDragType types[3]; if(target && target->tryHandle(this,FXSEL(SEL_CLICKED,message),(void*)(FXuval)rgba)) return 1; if(!hasSelection()){ types[0]=stringType; types[1]=colorType; types[2]=textType; acquireSelection(types,3); } return 1; } // Double clicked in well; normally pops the color dialog // except when COLORWELL_SOURCEONLY is passed in which case // editing by the dialog is not allowed (used for wells inside the // color dialog itself for example). // The well follows the editing via the dialog; when the dialog // is closed by cancelling it it will revert to the old color long FXColorWell::onDoubleClicked(FXObject*,FXSelector,void*){ if(target && target->tryHandle(this,FXSEL(SEL_DOUBLECLICKED,message),(void*)(FXuval)rgba)) return 1; if(options&COLORWELL_SOURCEONLY) return 1; FXColorDialog colordialog(this,tr("Color Dialog")); FXColor oldcolor=getRGBA(); colordialog.setTarget(this); colordialog.setSelector(ID_COLORDIALOG); colordialog.setRGBA(oldcolor); colordialog.setOpaqueOnly(isOpaqueOnly()); if(!colordialog.execute()){ setRGBA(oldcolor,TRUE); } return 1; } // The widget lost the grab for some reason long FXColorWell::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onUngrabbed(sender,sel,ptr); flags&=~(FLAG_TRYDRAG|FLAG_DODRAG); flags|=FLAG_UPDATE; endDrag(FALSE); return 1; } // Change from another Color Well long FXColorWell::onChgColorWell(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_UPDATE; setRGBA((FXColor)(FXuval)ptr); if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXuval)rgba); return 1; } // Command from another Color Well long FXColorWell::onCmdColorWell(FXObject*,FXSelector,void* ptr){ flags|=FLAG_UPDATE; setRGBA((FXColor)(FXuval)ptr); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)rgba); return 1; } // Set help using a message long FXColorWell::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXColorWell::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXColorWell::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXColorWell::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXColorWell::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXColorWell::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Change RGBA color void FXColorWell::setRGBA(FXColor clr,FXbool notify){ if(options&COLORWELL_OPAQUEONLY) clr|=FXRGBA(0,0,0,255); if(clr!=rgba){ rgba=clr; wellColor[0]=rgbaoverwhite(rgba); wellColor[1]=rgbaoverblack(rgba); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)rgba); } } // Set color long FXColorWell::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setRGBA((FXColor)(FXuval)ptr); return 1; } // Update well from a message long FXColorWell::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setRGBA(*((FXColor*)ptr)); return 1; } // Obtain value from well long FXColorWell::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXColor*)ptr)=getRGBA(); return 1; } // Return true if only opaque colors allowed FXbool FXColorWell::isOpaqueOnly() const { return (options&COLORWELL_OPAQUEONLY)!=0; } // Change opaque only mode void FXColorWell::setOpaqueOnly(FXbool opaque){ if(opaque){ options|=COLORWELL_OPAQUEONLY; setRGBA(rgba); } else{ options&=~COLORWELL_OPAQUEONLY; } } // Save data void FXColorWell::save(FXStream& store) const { FXFrame::save(store); store << wellColor[0] << wellColor[1]; store << rgba; store << tip; store << help; } // Load data void FXColorWell::load(FXStream& store){ FXFrame::load(store); store >> wellColor[0] >> wellColor[1]; store >> rgba; store >> tip; store >> help; } // Destroy FXColorWell::~FXColorWell(){ } // { // FXEvent *ev=(FXEvent*)ptr; // XEvent se; // FXint tox,toy; // Window tmp; // Window www=getWindowAt(ev->root_x,ev->root_y); // // XTranslateCoordinates(getDisplay(),XDefaultRootWindow(getDisplay()),www,ev->root_x,ev->root_y,&tox,&toy,&tmp); // // se.xbutton.type=ButtonPress; // se.xbutton.serial=0; // se.xbutton.send_event=1; // se.xbutton.display=getDisplay(); // se.xbutton.window=www; // se.xbutton.root=XDefaultRootWindow(getDisplay()); // se.xbutton.subwindow=None; // se.xbutton.time=ev->time; // se.xbutton.x=tox; // se.xbutton.y=toy; // se.xbutton.x_root=ev->root_x; // se.xbutton.y_root=ev->root_y; // se.xbutton.state=0; // se.xbutton.button=2; // se.xbutton.same_screen=TRUE; // fprintf(stderr,"SendEvent to window %d\n",se.xbutton.window); // XSendEvent(getDisplay(),se.xbutton.window,True,NoEventMask,&se); // // se.xbutton.type=ButtonRelease; // se.xbutton.serial=0; // se.xbutton.send_event=1; // se.xbutton.display=getDisplay(); // se.xbutton.window=www; // se.xbutton.root=XDefaultRootWindow(getDisplay()); // se.xbutton.subwindow=None; // se.xbutton.time=ev->time+1; // se.xbutton.x=tox; // se.xbutton.y=toy; // se.xbutton.x_root=ev->root_x; // se.xbutton.y_root=ev->root_y; // se.xbutton.state=Button2Mask; // se.xbutton.button=2; // se.xbutton.same_screen=TRUE; // fprintf(stderr,"SendEvent to window %d\n",se.xbutton.window); // XSendEvent(getDisplay(),se.xbutton.window,True,NoEventMask,&se); // } } fox1.6-1.6.57/src/FXColorWheel.cpp000066400000000000000000000277141326741342000164440ustar00rootroot00000000000000/******************************************************************************** * * * C o l o r W h e e l W i d g e t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXColorWheel.cpp,v 1.49 2006/01/22 17:58:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXImage.h" #include "FXColorWheel.h" /* Notes: - We assume the dial is round. */ #define WHEELDIAMETER 60 // Default Wheel diameter using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXColorWheel) FXColorWheelMap[]={ FXMAPFUNC(SEL_PAINT,0,FXColorWheel::onPaint), FXMAPFUNC(SEL_MOTION,0,FXColorWheel::onMotion), FXMAPFUNC(SEL_MOUSEWHEEL,0,FXColorWheel::onMouseWheel), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXColorWheel::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXColorWheel::onLeftBtnRelease), FXMAPFUNC(SEL_QUERY_TIP,0,FXColorWheel::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXColorWheel::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXColorWheel::ID_SETHELPSTRING,FXColorWheel::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXColorWheel::ID_GETHELPSTRING,FXColorWheel::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXColorWheel::ID_SETTIPSTRING,FXColorWheel::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXColorWheel::ID_GETTIPSTRING,FXColorWheel::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXColorWheel,FXFrame,FXColorWheelMap,ARRAYNUMBER(FXColorWheelMap)) // Make a color wheel FXColorWheel::FXColorWheel(){ flags|=FLAG_ENABLED; hsv[0]=0.0f; hsv[1]=0.0f; hsv[2]=1.0f; dialx=0; dialy=0; spotx=0; spoty=0; } // Make a color wheel FXColorWheel::FXColorWheel(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_ENABLED; target=tgt; message=sel; dial=new FXImage(getApp(),NULL,IMAGE_DITHER|IMAGE_KEEP|IMAGE_OWNED|IMAGE_SHMI|IMAGE_SHMP,WHEELDIAMETER,WHEELDIAMETER); hsv[0]=0.0f; hsv[1]=0.0f; hsv[2]=1.0f; dialx=0; dialy=0; spotx=WHEELDIAMETER/2; spoty=WHEELDIAMETER/2; } // Create window void FXColorWheel::create(){ FXFrame::create(); updatedial(); dial->create(); } // Detach window void FXColorWheel::detach(){ FXFrame::detach(); dial->detach(); } // Get default width FXint FXColorWheel::getDefaultWidth(){ return WHEELDIAMETER+padleft+padright+(border<<1); } // Get default height FXint FXColorWheel::getDefaultHeight(){ return WHEELDIAMETER+padtop+padbottom+(border<<1); } // Resize the dial void FXColorWheel::layout(){ register FXint ww,hh,ss; ww=width-padleft-padright-(border<<1); hh=height-padtop-padbottom-(border<<1); ss=FXMAX(3,FXMIN(ww,hh)); dialx=border+padleft+(ww-ss)/2; dialy=border+padtop+(hh-ss)/2; if((dial->getWidth()!=ss) || (flags&FLAG_DIRTY)){ if(dial->getWidth()!=ss) dial->resize(ss,ss); updatedial(); dial->render(); } hstoxy(spotx,spoty,hsv[0],hsv[1]); flags&=~FLAG_DIRTY; } // Compute x,y location from hue and saturation FXbool FXColorWheel::hstoxy(FXint& x,FXint& y,FXfloat h,FXfloat s) const { register FXfloat r=dial->getWidth()*0.5f; register FXfloat a=(h-180.0f)*DTOR; x=(FXint)(s*r*cosf(a)+r+0.5f); y=(FXint)(s*r*sinf(a)+r+0.5f); return TRUE; } // Compute hue and saturation from x,y, return FALSE if outside of dial FXbool FXColorWheel::xytohs(FXfloat& h,FXfloat& s,FXint x,FXint y) const { register FXfloat r=dial->getWidth()*0.5f; register FXfloat rx=x-r; register FXfloat ry=y-r; register FXfloat v=sqrtf(rx*rx+ry*ry); h=0.0f; s=0.0f; if(0.0fgetHeight(); y++){ for(register FXint x=0; xgetWidth(); x++){ if(xytohs(h,s,x,y)){ fxhsv_to_rgb(r,g,b,h,s,hsv[2]); dial->setPixel(x,y,FXRGB(255.0f*r,255.0f*g,255.0f*b)); } else{ dial->setPixel(x,y,backColor); } } } } // Move the spot void FXColorWheel::movespot(FXint x,FXint y){ if(spotx!=x || spoty!=y){ update(dialx+spotx-4,dialy+spoty-4,9,9); xytohs(hsv[0],hsv[1],x,y); hstoxy(spotx,spoty,hsv[0],hsv[1]); update(dialx+spotx-4,dialy+spoty-4,9,9); } } // Set help using a message long FXColorWheel::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXColorWheel::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXColorWheel::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXColorWheel::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXColorWheel::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXColorWheel::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Handle repaint long FXColorWheel::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXDCWindow dc(this,event); FXint d=dial->getWidth(); dc.setForeground(backColor); dc.fillRectangle(border,border,dialx-border,height-(border<<1)); dc.fillRectangle(dialx+dial->getWidth(),border,width-border-dialx-dial->getWidth(),height-(border<<1)); dc.fillRectangle(dialx,border,dial->getWidth(),dialy-border); dc.fillRectangle(dialx,dialy+dial->getHeight(),dial->getWidth(),height-border-dialy-dial->getHeight()); dc.drawImage(dial,dialx,dialy); dc.setForeground(borderColor); dc.drawArc(dialx+1,dialy,d,d,90*64,45*64); dc.drawArc(dialx,dialy+1,d,d,135*64,45*64); dc.setForeground(baseColor); dc.drawArc(dialx-1,dialy,d,d,270*64,45*64); dc.drawArc(dialx,dialy-1,d,d,315*64,45*64); dc.setForeground(shadowColor); dc.drawArc(dialx,dialy,d,d,45*64,180*64); dc.setForeground(hiliteColor); dc.drawArc(dialx,dialy,d,d,225*64,180*64); dc.setForeground(FXRGB(255,255,255)); dc.fillArc(dialx+spotx-3,dialy+spoty-3,7,7,0,360*64); dc.setForeground(FXRGB(0,0,0)); dc.fillArc(dialx+spotx-2,dialy+spoty-2,5,5,0,360*64); drawFrame(dc,0,0,width,height); return 1; } // Moving long FXColorWheel::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(flags&FLAG_PRESSED){ movespot(event->win_x-dialx,event->win_y-dialy); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)hsv); return 1; } return 0; } // Move spot to change hue, saturation long FXColorWheel::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; movespot(event->win_x-dialx,event->win_y-dialy); flags|=FLAG_CHANGED; flags&=~FLAG_UPDATE; flags|=FLAG_PRESSED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)hsv); } return 1; } // End spot movement mode long FXColorWheel::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXuint changed=(flags&FLAG_CHANGED); if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(changed && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)hsv); return 1; } return 1; } // Rotate hue by means of dial long FXColorWheel::onMouseWheel(FXObject*,FXSelector,void* ptr){ FXfloat amount=((FXEvent*)ptr)->code/12.0f; if(isEnabled()){ if(((FXEvent*)ptr)->state&CONTROLMASK) amount*=0.1f; setHue(fmodf(hsv[0]+amount+360.0f,360.0f)); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)hsv); return 1; } return 0; } // Change hue void FXColorWheel::setHue(FXfloat h){ h=FXCLAMP(0.0f,h,360.0f); if(h!=hsv[0]){ hsv[0]=h; update(dialx+spotx-4,dialy+spoty-4,9,9); hstoxy(spotx,spoty,hsv[0],hsv[1]); update(dialx+spotx-4,dialy+spoty-4,9,9); } } // Change saturation void FXColorWheel::setSat(FXfloat s){ s=FXCLAMP(0.0f,s,1.0f); if(s!=hsv[1]){ hsv[1]=s; update(dialx+spotx-4,dialy+spoty-4,9,9); hstoxy(spotx,spoty,hsv[0],hsv[1]); update(dialx+spotx-4,dialy+spoty-4,9,9); } } // Change saturation void FXColorWheel::setVal(FXfloat v){ v=FXCLAMP(0.0f,v,1.0f); if(v!=hsv[2]){ hsv[2]=v; recalc(); } } // Set hue, saturation, value void FXColorWheel::setHueSatVal(FXfloat h,FXfloat s,FXfloat v){ // Clamp h=FXCLAMP(0.0f,h,360.0f); s=FXCLAMP(0.0f,s,1.0f); v=FXCLAMP(0.0f,v,1.0f); // Changed after clamping? if(hsv[0]!=h || hsv[1]!=s || hsv[2]!=v){ // Cheap case: just move the ball if(hsv[0]!=h || hsv[1]!=s){ hsv[0]=h; hsv[1]=s; update(dialx+spotx-4,dialy+spoty-4,9,9); hstoxy(spotx,spoty,hsv[0],hsv[1]); update(dialx+spotx-4,dialy+spoty-4,9,9); } // Expensive case: recalculate dial if(hsv[2]!=v){ hsv[2]=v; recalc(); } } } // Save data void FXColorWheel::save(FXStream& store) const { FXFrame::save(store); store << dial; store << hsv[0]; store << hsv[1]; store << hsv[2]; store << tip; store << help; } // Load data void FXColorWheel::load(FXStream& store){ FXFrame::load(store); store >> dial; store >> hsv[0]; store >> hsv[1]; store >> hsv[2]; store >> tip; store >> help; } // Destroy FXColorWheel::~FXColorWheel(){ delete dial; dial=(FXImage*)-1L; } } fox1.6-1.6.57/src/FXComboBox.cpp000066400000000000000000000463371326741342000161130ustar00rootroot00000000000000/******************************************************************************** * * * C o m b o B o x O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXComboBox.cpp,v 1.66.2.2 2007/06/07 20:17:57 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObjectList.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXDC.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXTextField.h" #include "FXButton.h" #include "FXMenuButton.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXShell.h" #include "FXPopup.h" #include "FXScrollBar.h" #include "FXScrollArea.h" #include "FXList.h" #include "FXComboBox.h" /* Notes: - Handling typed text: a) Pass string to target only. b) Pass string to target & add to list [begin, after/before current, or end]. c) Pass string to target & replace current item's label. - FXComboBox is a text field which may be filled from an FXList. - FXComboBox is a text field which in turn may fill an FXList also. - In most other respects, it behaves like a FXTextField. - Need to catch up/down arrow keys. - Combobox turns OFF GUI Updating while being manipulated. - Need some way to size the FXList automatically to the number of items. - If you leave the list then getCurrentItem() returns the last item under cursor which is not the same item shown in FXComboBox. - FXComboBox::getItem() and FXComboBox::getItemText() are the same; this should probably change. - No reaction to up and down arrow while disabled. */ #define COMBOBOX_INS_MASK (COMBOBOX_REPLACE|COMBOBOX_INSERT_BEFORE|COMBOBOX_INSERT_AFTER|COMBOBOX_INSERT_FIRST|COMBOBOX_INSERT_LAST) #define COMBOBOX_MASK (COMBOBOX_STATIC|COMBOBOX_INS_MASK) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXComboBox) FXComboBoxMap[]={ FXMAPFUNC(SEL_FOCUS_UP,0,FXComboBox::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXComboBox::onFocusDown), FXMAPFUNC(SEL_FOCUS_SELF,0,FXComboBox::onFocusSelf), FXMAPFUNC(SEL_UPDATE,FXComboBox::ID_TEXT,FXComboBox::onUpdFmText), FXMAPFUNC(SEL_CLICKED,FXComboBox::ID_LIST,FXComboBox::onListClicked), FXMAPFUNC(SEL_COMMAND,FXComboBox::ID_LIST,FXComboBox::onListClicked), FXMAPFUNC(SEL_LEFTBUTTONPRESS,FXComboBox::ID_TEXT,FXComboBox::onTextButton), FXMAPFUNC(SEL_MOUSEWHEEL,FXComboBox::ID_TEXT,FXComboBox::onMouseWheel), FXMAPFUNC(SEL_CHANGED,FXComboBox::ID_TEXT,FXComboBox::onTextChanged), FXMAPFUNC(SEL_COMMAND,FXComboBox::ID_TEXT,FXComboBox::onTextCommand), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXComboBox::onFwdToText), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETINTVALUE,FXComboBox::onFwdToText), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETREALVALUE,FXComboBox::onFwdToText), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE,FXComboBox::onFwdToText), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETINTVALUE,FXComboBox::onFwdToText), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETREALVALUE,FXComboBox::onFwdToText), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETSTRINGVALUE,FXComboBox::onFwdToText), }; // Object implementation FXIMPLEMENT(FXComboBox,FXPacker,FXComboBoxMap,ARRAYNUMBER(FXComboBoxMap)) // Combo box FXComboBox::FXComboBox(FXComposite *p,FXint cols,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXPacker(p,opts,x,y,w,h, 0,0,0,0, 0,0){ flags|=FLAG_ENABLED; target=tgt; message=sel; field=new FXTextField(this,cols,this,FXComboBox::ID_TEXT,0, 0,0,0,0, pl,pr,pt,pb); if(options&COMBOBOX_STATIC) field->setEditable(FALSE); pane=new FXPopup(this,FRAME_LINE); list=new FXList(pane,this,FXComboBox::ID_LIST,LIST_BROWSESELECT|LIST_AUTOSELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y|SCROLLERS_TRACK|HSCROLLER_NEVER); if(options&COMBOBOX_STATIC) list->setScrollStyle(SCROLLERS_TRACK|HSCROLLING_OFF); button=new FXMenuButton(this,FXString::null,NULL,pane,FRAME_RAISED|FRAME_THICK|MENUBUTTON_DOWN|MENUBUTTON_ATTACH_RIGHT, 0,0,0,0, 0,0,0,0); button->setXOffset(border); button->setYOffset(border); flags&=~FLAG_UPDATE; // Never GUI update } // Create window void FXComboBox::create(){ FXPacker::create(); pane->create(); } // Detach window void FXComboBox::detach(){ FXPacker::detach(); pane->detach(); } // Destroy window void FXComboBox::destroy(){ pane->destroy(); FXPacker::destroy(); } // Enable the window void FXComboBox::enable(){ if(!isEnabled()){ FXPacker::enable(); field->enable(); button->enable(); } } // Disable the window void FXComboBox::disable(){ if(isEnabled()){ FXPacker::disable(); field->disable(); button->disable(); } } // Get default width FXint FXComboBox::getDefaultWidth(){ FXint ww,pw; ww=field->getDefaultWidth()+button->getDefaultWidth()+(border<<1); pw=pane->getDefaultWidth(); return FXMAX(ww,pw); } // Get default height FXint FXComboBox::getDefaultHeight(){ FXint th,bh; th=field->getDefaultHeight(); bh=button->getDefaultHeight(); return FXMAX(th,bh)+(border<<1); } // Recalculate layout void FXComboBox::layout(){ FXint buttonWidth,textWidth,itemHeight; itemHeight=height-(border<<1); buttonWidth=button->getDefaultWidth(); textWidth=width-buttonWidth-(border<<1); field->position(border,border,textWidth,itemHeight); button->position(border+textWidth,border,buttonWidth,itemHeight); pane->resize(width,pane->getDefaultHeight()); flags&=~FLAG_DIRTY; } // Forward GUI update of text field to target; but only if pane is not popped long FXComboBox::onUpdFmText(FXObject*,FXSelector,void*){ return target && !isPaneShown() && target->tryHandle(this,FXSEL(SEL_UPDATE,message),NULL); } // Command handled in the text field long FXComboBox::onFwdToText(FXObject* sender,FXSelector sel,void* ptr){ return field->handle(sender,sel,ptr); } // Forward clicked message from list to target long FXComboBox::onListClicked(FXObject*,FXSelector sel,void* ptr){ button->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(FXSELTYPE(sel)==SEL_COMMAND){ field->setText(list->getItemText((FXint)(FXival)ptr)); if(!(options&COMBOBOX_STATIC)) field->selectAll(); // Select if editable if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)getText().text()); } return 1; } // Pressed left button in text field long FXComboBox::onTextButton(FXObject*,FXSelector,void*){ if(options&COMBOBOX_STATIC){ button->handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); // Post the list return 1; } return 0; } // Text has changed long FXComboBox::onTextChanged(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_CHANGED,message),ptr); } // Text has changed long FXComboBox::onTextCommand(FXObject*,FXSelector,void* ptr){ FXint index=list->getCurrentItem(); if(!(options&COMBOBOX_STATIC)){ switch(options&COMBOBOX_INS_MASK){ case COMBOBOX_REPLACE: if(0<=index) setItem(index,(FXchar*)ptr,getItemData(index)); break; case COMBOBOX_INSERT_BEFORE: if(0<=index) insertItem(index,(FXchar*)ptr); break; case COMBOBOX_INSERT_AFTER: if(0<=index) insertItem(index+1,(FXchar*)ptr); break; case COMBOBOX_INSERT_FIRST: insertItem(0,(FXchar*)ptr); break; case COMBOBOX_INSERT_LAST: appendItem((FXchar*)ptr); break; } } return target && target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); } // Bounce focus to the text field long FXComboBox::onFocusSelf(FXObject* sender,FXSelector,void* ptr){ return field->handle(sender,FXSEL(SEL_FOCUS_SELF,0),ptr); } // Select upper item long FXComboBox::onFocusUp(FXObject*,FXSelector,void*){ if(isEnabled()){ FXint index=getCurrentItem(); if(index<0) index=getNumItems()-1; else if(0code<0){ if(index<0) index=0; else if(indexcode>0){ if(index<0) index=getNumItems()-1; else if(0isEditable(); } // Set widget is editable or not void FXComboBox::setEditable(FXbool edit){ field->setEditable(edit); } // Set text void FXComboBox::setText(const FXString& text){ field->setText(text); } // Obtain text FXString FXComboBox::getText() const { return field->getText(); } // Set number of text columns void FXComboBox::setNumColumns(FXint cols){ field->setNumColumns(cols); } // Get number of text columns FXint FXComboBox::getNumColumns() const { return field->getNumColumns(); } // Get number of items FXint FXComboBox::getNumItems() const { return list->getNumItems(); } // Get number of visible items FXint FXComboBox::getNumVisible() const { return list->getNumVisible(); } // Set number of visible items void FXComboBox::setNumVisible(FXint nvis){ list->setNumVisible(nvis); } // Is item current FXbool FXComboBox::isItemCurrent(FXint index) const { return list->isItemCurrent(index); } // Change current item void FXComboBox::setCurrentItem(FXint index,FXbool notify){ FXint current=list->getCurrentItem(); if(current!=index){ list->setCurrentItem(index); list->makeItemVisible(index); if(0<=index){ setText(list->getItemText(index)); } else{ setText(FXString::null); } if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)getText().text());} } } // Get current item FXint FXComboBox::getCurrentItem() const { return list->getCurrentItem(); } // Retrieve item FXString FXComboBox::getItem(FXint index) const { return list->getItem(index)->getText(); } // Replace text of item at index FXint FXComboBox::setItem(FXint index,const FXString& text,void* ptr){ if(index<0 || list->getNumItems()<=index){ fxerror("%s::setItem: index out of range.\n",getClassName()); } list->setItem(index,text,NULL,ptr); if(isItemCurrent(index)){ field->setText(text); } recalc(); return index; } // Fill list by appending items from array of strings FXint FXComboBox::fillItems(const FXchar** strings){ register FXint numberofitems=list->getNumItems(); register FXint n=list->fillItems(strings); if(numberofitems<=list->getCurrentItem()){ field->setText(list->getItemText(list->getCurrentItem())); } recalc(); return n; } // Fill list by appending items from newline separated strings FXint FXComboBox::fillItems(const FXString& strings){ register FXint numberofitems=list->getNumItems(); register FXint n=list->fillItems(strings); if(numberofitems<=list->getCurrentItem()){ field->setText(list->getItemText(list->getCurrentItem())); } recalc(); return n; } // Insert item at index FXint FXComboBox::insertItem(FXint index,const FXString& text,void* ptr){ if(index<0 || list->getNumItems()insertItem(index,text,NULL,ptr); if(isItemCurrent(index)){ field->setText(text); } recalc(); return index; } // Append item FXint FXComboBox::appendItem(const FXString& text,void* ptr){ FXint index=list->appendItem(text,NULL,ptr); if(isItemCurrent(getNumItems()-1)){ field->setText(text); } recalc(); return index; } // Prepend item FXint FXComboBox::prependItem(const FXString& text,void* ptr){ FXint index=list->prependItem(text,NULL,ptr); if(isItemCurrent(0)){ field->setText(text); } recalc(); return index; } // Move item from oldindex to newindex FXint FXComboBox::moveItem(FXint newindex,FXint oldindex){ if(newindex<0 || list->getNumItems()<=newindex || oldindex<0 || list->getNumItems()<=oldindex){ fxerror("%s::moveItem: index out of range.\n",getClassName()); } FXint current=list->getCurrentItem(); list->moveItem(newindex,oldindex); if(current!=list->getCurrentItem()){ current=list->getCurrentItem(); if(0<=current){ field->setText(list->getItemText(current)); } else{ field->setText(" "); } } recalc(); return newindex; } // Remove given item void FXComboBox::removeItem(FXint index){ FXint current=list->getCurrentItem(); list->removeItem(index); if(index==current){ current=list->getCurrentItem(); if(0<=current){ field->setText(list->getItemText(current)); } else{ field->setText(FXString::null); } } recalc(); } // Remove all items void FXComboBox::clearItems(){ field->setText(FXString::null); list->clearItems(); recalc(); } // Get item by name FXint FXComboBox::findItem(const FXString& text,FXint start,FXuint flgs) const { return list->findItem(text,start,flgs); } // Get item by data FXint FXComboBox::findItemByData(const void *ptr,FXint start,FXuint flgs) const { return list->findItemByData(ptr,start,flgs); } // Set item text void FXComboBox::setItemText(FXint index,const FXString& txt){ if(isItemCurrent(index)) setText(txt); list->setItemText(index,txt); recalc(); } // Get item text FXString FXComboBox::getItemText(FXint index) const { return list->getItemText(index); } // Set item data void FXComboBox::setItemData(FXint index,void* ptr) const { list->setItemData(index,ptr); } // Get item data void* FXComboBox::getItemData(FXint index) const { return list->getItemData(index); } // Is the pane shown FXbool FXComboBox::isPaneShown() const { return pane->shown(); } // Set font void FXComboBox::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } field->setFont(fnt); list->setFont(fnt); recalc(); } // Obtain font FXFont* FXComboBox::getFont() const { return field->getFont(); } // Change combobox style void FXComboBox::setComboStyle(FXuint mode){ FXuint opts=(options&~COMBOBOX_MASK)|(mode&COMBOBOX_MASK); if(opts!=options){ options=opts; if(options&COMBOBOX_STATIC){ field->setEditable(FALSE); // Non-editable list->setScrollStyle(SCROLLERS_TRACK|HSCROLLING_OFF); // No scrolling } else{ field->setEditable(TRUE); // Editable list->setScrollStyle(SCROLLERS_TRACK|HSCROLLER_NEVER); // Scrollable, but no scrollbar } recalc(); } } // Get combobox style FXuint FXComboBox::getComboStyle() const { return (options&COMBOBOX_MASK); } // Set text justify style void FXComboBox::setJustify(FXuint style){ field->setJustify(style); } // Get text justify style FXuint FXComboBox::getJustify() const { return field->getJustify(); } // Set window background color void FXComboBox::setBackColor(FXColor clr){ field->setBackColor(clr); list->setBackColor(clr); } // Get background color FXColor FXComboBox::getBackColor() const { return field->getBackColor(); } // Set text color void FXComboBox::setTextColor(FXColor clr){ field->setTextColor(clr); list->setTextColor(clr); } // Return text color FXColor FXComboBox::getTextColor() const { return field->getTextColor(); } // Set select background color void FXComboBox::setSelBackColor(FXColor clr){ field->setSelBackColor(clr); list->setSelBackColor(clr); } // Return selected background color FXColor FXComboBox::getSelBackColor() const { return field->getSelBackColor(); } // Set selected text color void FXComboBox::setSelTextColor(FXColor clr){ field->setSelTextColor(clr); list->setSelTextColor(clr); } // Return selected text color FXColor FXComboBox::getSelTextColor() const { return field->getSelTextColor(); } // Sort items using current sort function void FXComboBox::sortItems(){ list->sortItems(); } // Return sort function FXListSortFunc FXComboBox::getSortFunc() const { return list->getSortFunc(); } // Change sort function void FXComboBox::setSortFunc(FXListSortFunc func){ list->setSortFunc(func); } // Set help text void FXComboBox::setHelpText(const FXString& txt){ field->setHelpText(txt); } // Get help text const FXString& FXComboBox::getHelpText() const { return field->getHelpText(); } // Set tip text void FXComboBox::setTipText(const FXString& txt){ field->setTipText(txt); } // Get tip text const FXString& FXComboBox::getTipText() const { return field->getTipText(); } // Save object to stream void FXComboBox::save(FXStream& store) const { FXPacker::save(store); store << field; store << button; store << list; store << pane; } // Load object from stream void FXComboBox::load(FXStream& store){ FXPacker::load(store); store >> field; store >> button; store >> list; store >> pane; } // Delete it FXComboBox::~FXComboBox(){ delete pane; pane=(FXPopup*)-1L; field=(FXTextField*)-1L; button=(FXMenuButton*)-1L; list=(FXList*)-1L; } } fox1.6-1.6.57/src/FXComposeContext.cpp000066400000000000000000000355501326741342000173500ustar00rootroot00000000000000/******************************************************************************** * * * C o m p o s e - C o n t e x t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXComposeContext.cpp,v 1.12 2006/01/22 17:58:21 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXWindow.h" #include "FXComposeContext.h" #include "FXException.h" /* Notes: - In Asian languages, a text entry widget that's being edited may have an input method editor. During the composition process, the system needs to keep track of the state of the composition until it is committed as an input to the widget. This class represents that state. - Each text entry widget may have a compositon context, while it has the focus. - The composition context is deleted when the focus is moved to another widget away from the entry widget. */ #define DISPLAY(app) ((Display*)((app)->display)) using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXComposeContext,FXId,NULL,0) #ifdef WIN32 ////////////////////////// MS-Windows /////////////////////////// // Deserialization FXComposeContext::FXComposeContext():window(NULL),message(0){ FXTRACE((1,"FXComposeContext::FXComposeContext %p\n",this)); } // Create input context FXComposeContext::FXComposeContext(FXApp* a,FXWindow* win,FXSelector sel):FXId(a),window(win),message(sel){ FXTRACE((1,"FXComposeContext::FXComposeContext %p\n",this)); } // Realize the input context void FXComposeContext::create(){ if(!xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::create %p\n",getClassName(),this)); /////// } } } // Unrealize the input context void FXComposeContext::destroy(){ if(xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::destroy %p\n",getClassName(),this)); /////// } } } // Set focus to it void FXComposeContext::focusIn(){ if(xid){ /////// } } // Kill focus to it void FXComposeContext::focusOut(){ if(xid){ /////// } } // Set the spot void FXComposeContext::setSpot(FXint x,FXint y){ if(xid){ /////// } } // Set the area void FXComposeContext::setArea(FXint x,FXint y,FXint w,FXint h){ if(xid){ /////// } } // Translate key event FXString FXComposeContext::translateEvent(FXRawEvent& event){ FXString result; if(xid){ /////// } return result; } // Delete input context FXComposeContext::~FXComposeContext(){ FXTRACE((1,"FXComposeContext::~FXComposeContext %p\n",this)); } #else ////////////////////////////// X-Windows /////////////////////////////// // Deserialization FXComposeContext::FXComposeContext():window(NULL),message(0){ FXTRACE((1,"FXComposeContext::FXComposeContext %p\n",this)); } // Create input context FXComposeContext::FXComposeContext(FXApp* a,FXWindow* win,FXSelector sel):FXId(a),window(win),message(sel){ FXTRACE((1,"FXComposeContext::FXComposeContext %p\n",this)); } /* // Determine list of input styles XIMStyles *ximstyles=NULL; XGetIMValues((XIM)xim,XNQueryInputStyle,&ximstyles,NULL); if(ximstyles){ FXuint s; // Try preferred input style for(s=0; scount_styles; s++){ if(ximstyles->supported_styles[s]==inputstyle) goto match; } // Try root input style inputstyle=XIMPreeditNothing|XIMStatusNothing; for(s=0; scount_styles; s++){ if(ximstyles->supported_styles[s]==inputstyle) goto match; } // Try none style inputstyle=XIMPreeditNone|XIMStatusNone; for(s=0; scount_styles; s++){ if(ximstyles->supported_styles[s]==inputstyle) goto match; } // No style at all inputstyle=0; // Free list match:XFree(ximstyles); */ /* bool isIMRunning(Display *display){ const FXchar *p=XSetLocaleModifiers(NULL); if(p){ FXTRACE((1,"XSetLocaleModifiers=%s\n",p)); FXString server("@server="); server.append(p+4); // skip "@im=" FXint pos=server.find('@',1); if(0isInitialized()){ FXTRACE((100,"%s::create %p\n",getClassName(),this)); #ifndef NO_XIM XIMCallback statusStartStruct; XIMCallback statusDoneStruct; XIMCallback statusDrawStruct; XIMCallback editStartStruct; XIMCallback editDoneStruct; XIMCallback editDrawStruct; XIMCallback editCaretStruct; XVaNestedList editAttr; XVaNestedList statusAttr; XIMStyles *ximstyles=NULL; XRectangle rect; XPoint spot; FXuint style,s; // Check if input methods are available if(!getApp()->hasInputMethod()){ fxerror("FXComposeContext: no input methods\n"); } // We must have a window if(!window || !window->id()){ fxerror("FXComposeContext: illegal window parameter\n"); } // Get input style if(comparecase(getApp()->inputstyle,"onthespot")==0) style=XIMPreeditCallbacks|XIMStatusNothing; else if(comparecase(getApp()->inputstyle,"overthespot")==0) style=XIMPreeditPosition|XIMStatusNothing; else if(comparecase(getApp()->inputstyle,"offthespot")==0) style=XIMPreeditArea|XIMStatusArea; else if(comparecase(getApp()->inputstyle,"root")==0) style=XIMPreeditNothing|XIMStatusNothing; else style=XIMPreeditNone|XIMStatusNone; // Determine list of input styles XGetIMValues((XIM)getApp()->xim,XNQueryInputStyle,&ximstyles,NULL); if(ximstyles){ // Try preferred input style for(s=0; scount_styles; s++){ if(ximstyles->supported_styles[s]==style) goto m; } // Try root input style style=XIMPreeditNothing|XIMStatusNothing; for(s=0; scount_styles; s++){ if(ximstyles->supported_styles[s]==style) goto m; } // Try none style style=XIMPreeditNone|XIMStatusNone; for(s=0; scount_styles; s++){ if(ximstyles->supported_styles[s]==style) goto m; } // Pick first if(ximstyles->count_styles){ style=ximstyles->supported_styles[0]; } // Free list m: XFree(ximstyles); } // On the spot method if(style&XIMPreeditCallbacks){ editStartStruct.client_data=(XPointer)this; editStartStruct.callback=(XIMProc)editStartCallback; editDoneStruct.client_data=(XPointer)this; editDoneStruct.callback=(XIMProc)editDoneCallback; editDrawStruct.client_data=(XPointer)this; editDrawStruct.callback=(XIMProc)editDrawCallback; editCaretStruct.client_data=(XPointer)this; editCaretStruct.callback=(XIMProc)editCaretCallback; editAttr=XVaCreateNestedList(0,XNPreeditStartCallback,&editStartStruct,XNPreeditDrawCallback,&editDrawStruct,XNPreeditDoneCallback,&editDoneStruct,XNPreeditCaretCallback,&editCaretStruct,NULL); // Have status callbacks if(style&XIMStatusCallbacks){ FXTRACE((1,"On the Spot/Status\n")); statusStartStruct.client_data=(XPointer)this; statusStartStruct.callback=(XIMProc)statusStartCallback; statusDoneStruct.client_data=(XPointer)this; statusDoneStruct.callback=(XIMProc)statusDoneCallback; statusDrawStruct.client_data=(XPointer)this; statusDrawStruct.callback=(XIMProc)statusDrawCallback; statusAttr=XVaCreateNestedList(0,XNStatusStartCallback,&statusStartStruct,XNStatusDoneCallback,&statusDoneStruct,XNStatusDrawCallback,&statusDrawStruct,NULL); xid=(FXID)XCreateIC((XIM)getApp()->xim,XNInputStyle,XIMPreeditCallbacks|XIMStatusCallbacks,XNClientWindow,window->id(),XNPreeditAttributes,editAttr,XNStatusAttributes,statusAttr,NULL); XFree(statusAttr); } // No status callbacks else{ FXTRACE((1,"On the Spot\n")); xid=(FXID)XCreateIC((XIM)getApp()->xim,XNInputStyle,XIMPreeditCallbacks|XIMStatusNothing,XNClientWindow,window->id(),XNPreeditAttributes,editAttr,NULL); } XFree(editAttr); } // Off the spot method else if(style&XIMPreeditArea){ FXTRACE((1,"Off the Spot\n")); rect.x=0; rect.y=0; rect.width=window->getWidth(); rect.height=window->getHeight(); editAttr=XVaCreateNestedList(0,XNArea,&rect,NULL); xid=(FXID)XCreateIC((XIM)getApp()->xim,XNInputStyle,XIMPreeditArea|XIMStatusArea,XNClientWindow,window->id(),XNPreeditAttributes,editAttr,NULL); XFree(editAttr); } // Over the spot method else if(style&XIMPreeditPosition){ FXTRACE((1,"Over the Spot\n")); spot.x=1; spot.y=1; editAttr=XVaCreateNestedList(0,XNSpotLocation,&spot,NULL); xid=(FXID)XCreateIC((XIM)getApp()->xim,XNInputStyle,XIMPreeditPosition|XIMStatusNothing,XNClientWindow,window->id(),XNPreeditAttributes,editAttr,NULL); XFree(editAttr); } // Root method else{ FXTRACE((1,"Root\n")); xid=(FXID)XCreateIC((XIM)getApp()->xim,XNInputStyle,XIMPreeditNothing|XIMStatusNothing,XNClientWindow,window->id(),NULL); } // Reset context if(xid){ //long filterevents=0; //XGetICValues((XIC)xid,XNFilterEvents,&filterevents,NULL); //XSelectInput((Display*)getApp()->getDisplay(),window->id(),BASIC_EVENT_MASK|ENABLED_EVENT_MASK|filterevents); XmbResetIC((XIC)xid); } #endif } } } // Unrealize the input context void FXComposeContext::destroy(){ if(xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::destroy %p\n",getClassName(),this)); #ifndef NO_XIM XDestroyIC((XIC)xid); #endif } } } // Set focus to it void FXComposeContext::focusIn(){ #ifndef NO_XIM if(xid){ XSetICFocus((XIC)xid); } #endif } // Kill focus to it void FXComposeContext::focusOut(){ #ifndef NO_XIM if(xid){ XUnsetICFocus((XIC)xid); } #endif } // Set the spot void FXComposeContext::setSpot(FXint x,FXint y){ #ifndef NO_XIM if(xid){ XVaNestedList editAttr; XPoint spot; spot.x=x; spot.y=y; editAttr=XVaCreateNestedList(0,XNSpotLocation,&spot,NULL); XSetICValues((XIC)xid,XNPreeditAttributes,editAttr,NULL); XFree(editAttr); } #endif } // Set the area void FXComposeContext::setArea(FXint x,FXint y,FXint w,FXint h){ #ifndef NO_XIM if(xid){ XVaNestedList editAttr; XRectangle rect; rect.x=x; rect.y=y; rect.width=w; rect.height=h; editAttr=XVaCreateNestedList(0,XNArea,&rect,NULL); XSetICValues((XIC)xid,XNPreeditAttributes,editAttr,NULL); XFree(editAttr); } #endif } // Translate key event FXString FXComposeContext::translateEvent(FXRawEvent& event){ FXString result; #ifndef NO_XIM if(xid){ char buffer[40]; KeySym sym; Status s; int n; n=XmbLookupString((XIC)xid,&event.xkey,buffer,sizeof(buffer),&sym,&s); if(s!=XLookupChars && s!=XLookupBoth) n=0; // FIXME decode buffer based on XLocaleOfIM(XIMOfIC((XIC)xid)) buffer[n]=0; FXTRACE((100,"XLocaleOfIM=%s\n",XLocaleOfIM(XIMOfIC((XIC)xid)))); result.assign(buffer,n); } #endif return result; } int FXComposeContext::editStartCallback(void*,FXComposeContext* cc,void*){ FXTRACE((1,"editStartCallback\n")); return -1; // No length limit } void FXComposeContext::editDoneCallback(void*,FXComposeContext* cc,void*){ FXTRACE((1,"editDoneCallback\n")); } void FXComposeContext::editDrawCallback(void*,FXComposeContext* cc,void* ptr){ #ifndef NO_XIM XIMPreeditDrawCallbackStruct *drawstruct=(XIMPreeditDrawCallbackStruct*)ptr; XIMText *ximtext=drawstruct->text; FXTRACE((1,"editDrawCallback caret=%d first=%d len=%d\n",drawstruct->caret,drawstruct->chg_first,drawstruct->chg_length)); #endif } void FXComposeContext::editCaretCallback(void*,FXComposeContext* cc,void* ptr){ #ifndef NO_XIM XIMPreeditCaretCallbackStruct *caretstruct=(XIMPreeditCaretCallbackStruct*)ptr; FXTRACE((1,"editCaretCallback position=%d direction=%d style=%d\n",caretstruct->position,caretstruct->direction,caretstruct->style)); #endif } void FXComposeContext::statusStartCallback(void*,FXComposeContext* cc,void*){ FXTRACE((1,"statusStartCallback\n")); } void FXComposeContext::statusDoneCallback(void*,FXComposeContext* cc,void*){ FXTRACE((1,"statusDoneCallback\n")); } void FXComposeContext::statusDrawCallback(void*,FXComposeContext* cc,void* ptr){ #ifndef NO_XIM XIMStatusDrawCallbackStruct* drawstruct=(XIMStatusDrawCallbackStruct*)ptr; FXTRACE((1,"statusDrawCallback\n")); #endif } // Delete input context FXComposeContext::~FXComposeContext(){ FXTRACE((1,"FXComposeContext::~FXComposeContext %p\n",this)); destroy(); window=(FXWindow*)-1L; } #endif ///////////////////////////////////////////////////////////////////////// } fox1.6-1.6.57/src/FXComposite.cpp000066400000000000000000000217551326741342000163420ustar00rootroot00000000000000/******************************************************************************** * * * C o m p o s i t e W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXComposite.cpp,v 1.54.2.2 2007/04/29 14:31:43 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXComposite.h" /* Notes: - Rather a slim class. - Focus should be assigned to a window via SEL_FOCUSELF message. Composite widgets won't have focus so SEL_FOCUSELF should return 0 and do nothing. - Maybe add flag to exempt a widget from maxChildWidth() and/or maxChildHeight() so that things like separators can stay small when everything else gets as big as the biggest child. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXComposite) FXCompositeMap[]={ FXMAPFUNC(SEL_KEYPRESS,0,FXComposite::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXComposite::onKeyRelease), FXMAPFUNC(SEL_FOCUS_NEXT,0,FXComposite::onFocusNext), FXMAPFUNC(SEL_FOCUS_PREV,0,FXComposite::onFocusPrev), FXMAPFUNC(SEL_FOCUS_UP,0,FXComposite::onFocusPrev), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXComposite::onFocusNext), FXMAPFUNC(SEL_FOCUS_LEFT,0,FXComposite::onFocusPrev), FXMAPFUNC(SEL_FOCUS_RIGHT,0,FXComposite::onFocusNext), FXMAPFUNC(SEL_COMMAND,FXComposite::ID_UPDATE,FXComposite::onCmdUpdate), }; // Object implementation FXIMPLEMENT(FXComposite,FXWindow,FXCompositeMap,ARRAYNUMBER(FXCompositeMap)) // Only used for Root Window FXComposite::FXComposite(FXApp* a,FXVisual *vis):FXWindow(a,vis){ } // Only used for Shell Window FXComposite::FXComposite(FXApp* a,FXWindow* own,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXWindow(a,own,opts,x,y,w,h){ } // Create empty composite window FXComposite::FXComposite(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXWindow(p,opts,x,y,w,h){ } // Is widget a composite bool FXComposite::isComposite() const { return true; } // Create window void FXComposite::create(){ FXWindow::create(); for(FXWindow *c=getFirst(); c; c=c->getNext()) c->create(); } // Detach window void FXComposite::detach(){ for(FXWindow *c=getFirst(); c; c=c->getNext()) c->detach(); FXWindow::detach(); } // Destroy window void FXComposite::destroy(){ for(FXWindow *c=getFirst(); c; c=c->getNext()) c->destroy(); FXWindow::destroy(); } // Get width FXint FXComposite::getDefaultWidth(){ register FXWindow *child; FXint t,w=0; for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ t=child->getX()+child->getWidth(); if(wgetNext()){ if(child->shown()){ t=child->getY()+child->getHeight(); if(hgetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) t=child->getWidth(); else t=child->getDefaultWidth(); if(mgetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) t=child->getHeight(); else t=child->getDefaultHeight(); if(mgetNext()){ if(child->shown()){ child->position(child->getX(),child->getY(),child->getWidth(),child->getHeight()); } } flags&=~FLAG_DIRTY; } // Update all subwindows long FXComposite::onCmdUpdate(FXObject* sender,FXSelector,void* ptr){ register FXWindow *child; update(); for(child=getFirst(); child; child=child->getNext()){ if(child->shown()) child->handle(sender,FXSEL(SEL_COMMAND,ID_UPDATE),ptr); } return 1; } // Focus moved to next long FXComposite::onFocusNext(FXObject*,FXSelector sel,void* ptr){ FXWindow *child; if(getFocus()) child=getFocus()->getNext(); else child=getFirst(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,sel,ptr)) return 1; } child=child->getNext(); } return 0; } // Focus moved to previous long FXComposite::onFocusPrev(FXObject*,FXSelector sel,void* ptr){ FXWindow *child; if(getFocus()) child=getFocus()->getPrev(); else child=getLast(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,sel,ptr)) return 1; } child=child->getPrev(); } return 0; } // Keyboard press long FXComposite::onKeyPress(FXObject* sender,FXSelector sel,void* ptr){ register FXEvent* event=(FXEvent*)ptr; FXTRACE((200,"%p->%s::onKeyPress keysym=0x%04x state=%04x\n",this,getClassName(),((FXEvent*)ptr)->code,((FXEvent*)ptr)->state)); // Bounce to focus widget if(getFocus() && getFocus()->handle(sender,sel,ptr)) return 1; // Try target first if(isEnabled() && target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; // Check the accelerators if(getAccelTable() && getAccelTable()->handle(this,sel,ptr)) return 1; // Otherwise, perform the default keyboard processing switch(MKUINT(event->code,event->state&(SHIFTMASK|CONTROLMASK|ALTMASK|METAMASK))){ case KEY_Tab: case KEY_Next: return handle(this,FXSEL(SEL_FOCUS_NEXT,0),ptr); case KEY_Prior: case KEY_ISO_Left_Tab: case MKUINT(KEY_ISO_Left_Tab,SHIFTMASK): case MKUINT(KEY_Tab,SHIFTMASK): return handle(this,FXSEL(SEL_FOCUS_PREV,0),ptr); case KEY_Up: case KEY_KP_Up: return handle(this,FXSEL(SEL_FOCUS_UP,0),ptr); case KEY_Down: case KEY_KP_Down: return handle(this,FXSEL(SEL_FOCUS_DOWN,0),ptr); case KEY_Left: case KEY_KP_Left: return handle(this,FXSEL(SEL_FOCUS_LEFT,0),ptr); case KEY_Right: case KEY_KP_Right: return handle(this,FXSEL(SEL_FOCUS_RIGHT,0),ptr); } return 0; } // Keyboard release long FXComposite::onKeyRelease(FXObject* sender,FXSelector sel,void* ptr){ FXTRACE((200,"%p->%s::onKeyRelease keysym=0x%04x state=%04x\n",this,getClassName(),((FXEvent*)ptr)->code,((FXEvent*)ptr)->state)); // Bounce to focus widget if(getFocus() && getFocus()->handle(sender,sel,ptr)) return 1; // Try target first if(isEnabled() && target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; // Check the accelerators if(getAccelTable() && getAccelTable()->handle(this,sel,ptr)) return 1; return 0; } // Dispose of all the children FXComposite::~FXComposite(){ while(getFirst()){ delete getFirst(); } } } fox1.6-1.6.57/src/FXCursor.cpp000066400000000000000000000343401326741342000156470ustar00rootroot00000000000000/******************************************************************************** * * * C u r s o r - O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXCursor.cpp,v 1.62.2.1 2006/06/09 00:50:16 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXVisual.h" #include "FXCursor.h" #include "FXException.h" /* Notes: - Cursor size should be less than or equal to 32x32; limitation in Windows! - Need standard glyph for "invisible" cursor. - Keep hotx and hoty INSIDE the cursor glyph!! - Thanks Niall Douglas for the changes for alpha-blended cursors. */ #define DISPLAY(app) ((Display*)((app)->display)) #define DARKCOLOR(r,g,b) (((r)+(g)+(b))<382) #define CURSOR_MASK (255) using namespace FX; /*******************************************************************************/ namespace FX { extern bool fxloadXBM(FXColor*& data,const FXuchar *pixels,const FXuchar *mask,FXint width,FXint height); // Standard colors const FXColor white=FXRGBA(255,255,255,255); const FXColor black=FXRGBA(0,0,0,255); // Object implementation FXIMPLEMENT(FXCursor,FXId,NULL,0) // Deserialization FXCursor::FXCursor(){ data=NULL; width=0; height=0; hotx=0; hoty=0; options=CURSOR_ARROW; } // Make stock cursor FXCursor::FXCursor(FXApp* a,FXStockCursor curid):FXId(a){ FXTRACE((100,"FXCursor::FXCursor %p\n",this)); data=NULL; width=0; height=0; hotx=0; hoty=0; options=curid; } // Make cursor from source and mask FXCursor::FXCursor(FXApp* a,const FXuchar* src,const FXuchar* msk,FXint w,FXint h,FXint hx,FXint hy):FXId(a){ FXTRACE((100,"FXCursor::FXCursor %p\n",this)); fxloadXBM(data,src,msk,w,h); width=w; height=h; hotx=FXCLAMP(0,hx,width-1); hoty=FXCLAMP(0,hy,height-1); options=CURSOR_OWNED; } // Make cursor from FXColor pixels FXCursor::FXCursor(FXApp* a,const FXColor *pix,FXint w,FXint h,FXint hx,FXint hy):FXId(a){ FXTRACE((100,"FXCursor::FXCursor %p\n",this)); data=(FXColor*)pix; width=w; height=h; hotx=FXCLAMP(0,hx,width-1); hoty=FXCLAMP(0,hy,height-1); options=0; } // Return TRUE if color cursor bool FXCursor::isColor() const { register FXint i; if(data){ for(i=width*height-1; 0<=i; i--){ if(data[i]!=black && data[i]!=white && FXALPHAVAL(data[i])!=0) return true; } } return false; } #ifdef WIN32 static bool supportsColorCursors(){ // Try calling GetVersionEx using the OSVERSIONINFOEX structure. // If that fails, try using the OSVERSIONINFO structure. #if defined (__WATCOMC__) || (__DMC__) OSVERSIONINFO osvi={sizeof(OSVERSIONINFO)}; #else OSVERSIONINFOEX osvi={sizeof(OSVERSIONINFOEX)}; #endif if(!GetVersionEx((OSVERSIONINFO*)&osvi)){ // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO. osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); if(!GetVersionEx((OSVERSIONINFO*)&osvi)){ return false; // should not happen } } if(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT){ if(osvi.dwMajorVersion==5 && osvi.dwMinorVersion>=0 || osvi.dwMajorVersion>5){ return true; } } return false; } #endif // Create cursor void FXCursor::create(){ if(!xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::create %p\n",getClassName(),this)); #ifndef WIN32 // X11 // Mapping to standard X11 cursors const FXuint stock[]={XC_left_ptr,XC_left_ptr,XC_right_ptr,XC_xterm,XC_watch,XC_crosshair,XC_sb_h_double_arrow,XC_sb_v_double_arrow,XC_fleur}; // Building stock cursor if(options&CURSOR_MASK){ FXTRACE((100,"%s::create: stock cursor\n",getClassName())); xid=XCreateFontCursor(DISPLAY(getApp()),stock[options&CURSOR_MASK]); } // Building custom cursor else{ // Should have data if(!data){ fxerror("%s::create: cursor needs pixel data.\n",getClassName()); } // Let's hope it's the correct size! if(width>32 || height>32){ fxerror("%s::create: cursor exceeds maximum size of 32x32 pixels\n",getClassName()); } // We have support for color cursors and its a color cursor #ifdef HAVE_XCURSOR_H if(isColor() && XcursorSupportsARGB(DISPLAY(getApp()))){ register FXuchar *src,*dst,*end; XcursorImage *image; FXTRACE((100,"%s::create: custom color %dx%d cursor\n",getClassName(),width,height)); image=XcursorImageCreate(width,height); image->xhot=hotx; image->yhot=hoty; dst=(FXuchar*)image->pixels; src=(FXuchar*)data; end=src+width*height*4; do{ #ifndef __APPLE__ dst[0]=src[2]; // B dst[1]=src[1]; // G dst[2]=src[0]; // R dst[3]=src[3]; // A #else // A bug in Apple's X11 implementation has alpha on // the wrong end and BGR wrong way round dst[0]=src[3]; // A dst[3]=src[2]; // B dst[2]=src[1]; // G dst[1]=src[0]; // R #endif dst+=4; src+=4; } while(src=128){ maskbits[dstoffset+(i>>3)]|=(1<<(i&7)); if(DARKCOLOR(((FXuchar*)(data+srcoffset+i))[0],((FXuchar*)(data+srcoffset+i))[1],((FXuchar*)(data+srcoffset+i))[2])) shapebits[dstoffset+(i>>3)]|=(1<<(i&7)); } } srcoffset+=width; dstoffset+=dstbytes; } srcpix=XCreateBitmapFromData(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),(char*)shapebits,width,height); if(!srcpix){ throw FXImageException("unable to create cursor"); } mskpix=XCreateBitmapFromData(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),(char*)maskbits,width,height); if(!mskpix){ throw FXImageException("unable to create cursor"); } xid=XCreatePixmapCursor(DISPLAY(getApp()),srcpix,mskpix,&color[0],&color[1],hotx,hoty); XFreePixmap(DISPLAY(getApp()),srcpix); XFreePixmap(DISPLAY(getApp()),mskpix); #ifdef HAVE_XCURSOR_H } #endif } #else // WIN32 // Mapping to standard WIN32 cursors const LPCTSTR stock[]={IDC_ARROW,IDC_ARROW,IDC_ARROW,IDC_IBEAM,IDC_WAIT,IDC_CROSS,IDC_SIZENS,IDC_SIZEWE,IDC_SIZEALL}; // Building stock cursor if(options&CURSOR_MASK){ FXTRACE((100,"%s::create: stock cursor\n",getClassName())); xid=LoadCursor(NULL,stock[options&CURSOR_MASK]); } // Building custom cursor else{ // Should have data if(!data){ fxerror("%s::create: cursor needs pixel data.\n",getClassName()); } // Let's hope it's the correct size! if(width>32 || height>32){ fxerror("%s::create: cursor exceeds maximum size of 32x32 pixels\n",getClassName()); } FXASSERT(GetSystemMetrics(SM_CXCURSOR)==32); FXASSERT(GetSystemMetrics(SM_CYCURSOR)==32); // We have support for color cursors and its a color cursor if(isColor() && supportsColorCursors()){ const BITMAPV4HEADER bi={sizeof(BITMAPV4HEADER),32,-32,1,32,BI_BITFIELDS,0,0,0,0,0,0x00FF0000,0x0000FF00,0x000000FF,0xFF000000,0,{{0,0,0},{0,0,0},{0,0,0}},0,0,0}; HBITMAP img,mask; ICONINFO ii; FXTRACE((100,"%s::create: custom color %dx%d cursor\n",getClassName(),width,height)); // Make a DIB void *imgdata=0; HDC hdc=GetDC(NULL); img=CreateDIBSection(hdc,(BITMAPINFO*)&bi,DIB_RGB_COLORS,&imgdata,NULL,0); ReleaseDC(NULL,hdc); if(!img){ throw FXImageException("unable to create cursor"); } // Fill in data FXuint *imgptr=(FXuint*)imgdata; FXColor *srcimgptr=data; for(int y=0; y=128){ tmpand[dstoffset+(i>>3)]&=~(128>>(i&7)); if(!DARKCOLOR(((FXuchar*)(data+srcoffset+i))[0],((FXuchar*)(data+srcoffset+i))[1],((FXuchar*)(data+srcoffset+i))[2])){ tmpxor[dstoffset+(i>>3)]|=(128>>(i&7)); } } } srcoffset+=width; dstoffset+=4; } xid=CreateCursor((HINSTANCE)(getApp()->display),hotx,hoty,32,32,tmpand,tmpxor); } } #endif // Were we successful? if(!xid){ throw FXImageException("unable to create cursor"); } // Release pixel buffer if(!(options&CURSOR_KEEP)) release(); } } } // Detach cursor void FXCursor::detach(){ if(xid){ FXTRACE((100,"%s::detach %p\n",getClassName(),this)); xid=0; } } // Release pixels buffer if it was owned void FXCursor::release(){ if(options&CURSOR_OWNED){ options&=~CURSOR_OWNED; FXFREE(&data); } data=NULL; } // Destroy cursor void FXCursor::destroy(){ if(xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::destroy %p\n",getClassName(),this)); #ifndef WIN32 // Delete cursor XFreeCursor(DISPLAY(getApp()),xid); #else // Delete cursor DestroyCursor((HCURSOR)xid); #endif } xid=0; } } // Save pixel data only bool FXCursor::savePixels(FXStream& store) const { FXuint size=width*height; store.save(data,size); return true; } // Load pixel data only bool FXCursor::loadPixels(FXStream& store){ FXuint size=width*height; if(options&CURSOR_OWNED){FXFREE(&data);} if(!FXMALLOC(&data,FXColor,size)) return false; store.load(data,size); options|=CURSOR_OWNED; return true; } // Save cursor to stream void FXCursor::save(FXStream& store) const { FXuchar haspixels=(data!=NULL); FXId::save(store); store << width << height << hotx << hoty; store << options; store << haspixels; if(haspixels) savePixels(store); } // Load cursor from stream void FXCursor::load(FXStream& store){ FXuchar haspixels; FXId::load(store); store >> width >> height >> hotx >> hoty; store >> options; store >> haspixels; if(haspixels) loadPixels(store); } // Clean up FXCursor::~FXCursor(){ FXTRACE((100,"FXCursor::~FXCursor %p\n",this)); destroy(); if(options&CURSOR_OWNED){FXFREE(&data);} data=(FXColor *)-1L; } } fox1.6-1.6.57/src/FXDC.cpp000066400000000000000000000261421326741342000146610ustar00rootroot00000000000000/******************************************************************************** * * * D e v i c e C o n t e x t B a s e C l a s s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDC.cpp,v 1.38 2006/01/22 17:58:21 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXVisual.h" #include "FXRegion.h" #include "FXDC.h" /* Notes: - Major Contributions for Windows NT by Lyle Johnson. - This is not an abstract base class; rather, its a NULL-implementation, i.e. drawing commands to FXDC will go to into the bit bucket. - All functions in the DC are virtuals. - A DC is associated with a certain drawing surface, using: FXDC::begin(FXDrawable* drawable) and disassociated with: FXDC::end() - While associated with a certain surface, no other association may be made until after the association is broken. - One possible exception to the above rule COULD be made: repeated locks on the same surface might be OK; the surface should only be unlocked when an equal number of unlocks takes place [[[]][]]. - One DC object is created for all windows of the same depth and other attributes. - We like the OpenGL model of write-only, i.e. we [typically] don't read back any info from the DC. [Except stuff like device characteristics]. - We envision the following flavors of DC's: 1) A NULL context, in which all output goes to /dev/null 2) A Window context, in which output goes to a on- or off-screen window or pixmap. 3) A printer context, in which output is rendered e.g. as PostScript. - Implementations of DC's for specific target devices may cache various things such as patterns, stipples, colors, etc, so as to optimize performance. - Since DC's may be shared between windows, you should leave the DC in the same state as you found it before releasing it. - You acquire a DC by asking the drawable surface on which you want to draw for a DC. You receive a subclass of FXDC, and have no knowledge of device specific details, except as revealed by the basic FXDC API's. - After you're through with drawing, you should release the DC. - Motto: Nobody knows about any other DC that FXDC!!! The other ones are implementations, not directly accessible by any but a few select FOX implementation files. - In FOX, a FXDC is NOT a wrapper class:- we do NOT assume the O.S. provides its own DC abstraction:- hence all those virtuals. This also means it is possible to make your own, simply by subclassing FXDC! */ using namespace FX; /*******************************************************************************/ namespace FX { // Initialize nicely FXDC::FXDC(FXApp* a):app(a){ ctx=NULL; font=NULL; pattern=STIPPLE_NONE; stipple=NULL; tile=NULL; mask=NULL; clip.x=0; clip.y=0; clip.w=32767; clip.h=32767; fg=0; bg=1; width=0; cap=CAP_BUTT; join=JOIN_MITER; style=LINE_SOLID; fill=FILL_SOLID; rule=RULE_EVEN_ODD; rop=BLT_SRC; dashpat[0]=4; dashpat[1]=4; dashlen=2; dashoff=0; tx=0; ty=0; cx=0; cy=0; } // Read back pixel FXColor FXDC::readPixel(FXint,FXint){ return FXRGBA(0,0,0,0); } // Draw a point in the current pen color void FXDC::drawPoint(FXint,FXint){ } // Draw points in the current pen color. // Each point's position is relative to the drawable's origin (as usual). void FXDC::drawPoints(const FXPoint*,FXuint){ } // Draw points in the current pen color. The first point's position is // relative to the drawable's origin, but each subsequent point's position // is relative to the previous point's position; each FXPoint defines // the relative coordinates. Think LOGO. void FXDC::drawPointsRel(const FXPoint*,FXuint){ } // Draw a line void FXDC::drawLine(FXint,FXint,FXint,FXint){ } // Draw multiple lines. All points are drawn connected. // Each point is specified relative to Drawable's origin. void FXDC::drawLines(const FXPoint*,FXuint){ } // Draw multiple lines. All points are drawn connected. // First point's coordinate is relative to drawable's origin, but // subsequent points' coordinates are relative to previous point. void FXDC::drawLinesRel(const FXPoint*,FXuint){ } // Draw unconnected line segments void FXDC::drawLineSegments(const FXSegment*,FXuint){ } // Draw unfilled rectangle void FXDC::drawRectangle(FXint,FXint,FXint,FXint){ } // Draw unfilled rectangles void FXDC::drawRectangles(const FXRectangle*,FXuint){ } // Draw unfilled rounded rectangle void FXDC::drawRoundRectangle(FXint,FXint,FXint,FXint,FXint,FXint){ } // Draw arc void FXDC::drawArc(FXint,FXint,FXint,FXint,FXint,FXint){ } // Draw arcs void FXDC::drawArcs(const FXArc*,FXuint){ } // Draw ellipse void FXDC::drawEllipse(FXint,FXint,FXint,FXint){ } // Filled rectangle void FXDC::fillRectangle(FXint,FXint,FXint,FXint){ } // Filled rectangles void FXDC::fillRectangles(const FXRectangle*,FXuint){ } // Filled rounded rectangle void FXDC::fillRoundRectangle(FXint,FXint,FXint,FXint,FXint,FXint){ } // Fill chord void FXDC::fillChord(FXint,FXint,FXint,FXint,FXint,FXint){ } // Fill chords void FXDC::fillChords(const FXArc*,FXuint){ } // Fill arc void FXDC::fillArc(FXint,FXint,FXint,FXint,FXint,FXint){ } // Fill arcs void FXDC::fillArcs(const FXArc*,FXuint){ } // Fill ellipse void FXDC::fillEllipse(FXint,FXint,FXint,FXint){ } // Filled simple polygon void FXDC::fillPolygon(const FXPoint*,FXuint){ } // Fill concave polygon void FXDC::fillConcavePolygon(const FXPoint*,FXuint){ } // Fill complex (self-intersecting) polygon void FXDC::fillComplexPolygon(const FXPoint*,FXuint){ } // Filled simple polygon with relative points void FXDC::fillPolygonRel(const FXPoint*,FXuint){ } // Fill concave polygon void FXDC::fillConcavePolygonRel(const FXPoint*,FXuint){ } // Fill complex (self-intersecting) polygon void FXDC::fillComplexPolygonRel(const FXPoint*,FXuint){ } // Draw string with base line starting at x, y void FXDC::drawText(FXint,FXint,const FXchar*,FXuint){ } // Draw string with base line starting at x, y void FXDC::drawText(FXint,FXint,const FXString&){ } // Draw text starting at x, y over filled background void FXDC::drawImageText(FXint,FXint,const FXchar*,FXuint){ } // Draw text starting at x, y over filled background void FXDC::drawImageText(FXint,FXint,const FXString&){ } // Draw area from source void FXDC::drawArea(const FXDrawable*,FXint,FXint,FXint,FXint,FXint,FXint){ } // Draw area stretched area from source void FXDC::drawArea(const FXDrawable*,FXint,FXint,FXint,FXint,FXint,FXint,FXint,FXint){ } // Draw image void FXDC::drawImage(const FXImage*,FXint,FXint){ } // Draw bitmap void FXDC::drawBitmap(const FXBitmap*,FXint,FXint){ } // Draw icon void FXDC::drawIcon(const FXIcon*,FXint,FXint){ } // Draw icon shaded void FXDC::drawIconShaded(const FXIcon*,FXint,FXint){ } // Draw icon sunken void FXDC::drawIconSunken(const FXIcon*,FXint,FXint){ } // Draw hashed box void FXDC::drawHashBox(FXint,FXint,FXint,FXint,FXint){ } // Draw focus rectangle void FXDC::drawFocusRectangle(FXint,FXint,FXint,FXint){ } // Set foreground drawing color (brush) void FXDC::setForeground(FXColor clr){ fg=clr; } // Set background drawing color (brush) void FXDC::setBackground(FXColor clr){ bg=clr; } // Set dash pattern void FXDC::setDashes(FXuint dashoffset,const FXchar *dashpattern,FXuint dashlength){ register FXuint len,i; for(i=len=0; igetNormalFont(); psout=NULL; // FIXME use ctx for this mediawidth=0.0; mediaheight=0.0; mediabb.xmin=0.0; mediabb.xmax=0.0; mediabb.ymin=0.0; mediabb.ymax=0.0; docbb.xmin=0.0; docbb.xmax=0.0; docbb.ymin=0.0; docbb.ymax=0.0; pagebb.xmin=0.0; pagebb.xmax=0.0; pagebb.ymin=0.0; pagebb.ymax=0.0; pagecount=0; nchars=0; } // Destruct FXDCPrint::~FXDCPrint(){ } // Output hex number void FXDCPrint::outhex(FXuint hex){ if(!psout){ fxerror("FXDCPrint: no output device has been selected.\n"); } fprintf((FILE*)psout,"%02x",hex); if(++nchars>35){fputc('\n',(FILE*)psout);nchars=0;} } // Output formatted stuff void FXDCPrint::outf(const char* format,...){ va_list arguments; if(!psout){ fxerror("FXDCPrint: no output device has been selected.\n"); } va_start(arguments,format); vfprintf((FILE*)psout,format,arguments); va_end(arguments); } // Extends bounding box with point x,y void FXDCPrint::bbox(FXfloat x,FXfloat y){ if(x(pxmax-pxmin); FXfloat pyrange=static_cast(pymax-pymin); FXfloat mxmin,mxmax,mymin,mymax,mxrange,myrange; if(flags&PRINT_LANDSCAPE){ mxmin=static_cast(mediabb.ymin); mxmax=static_cast(mediabb.ymax); //mymin=static_cast(mediawidth-mediabb.xmax); //mymax=static_cast(mediawidth-mediabb.xmin); mymin=static_cast(mediabb.xmin); mymax=static_cast(mediabb.xmax); mxrange=mxmax-mxmin; myrange=mymax-mymin; //xo=xi; //yo=mediawidth-yi; } else{ mxmin=static_cast(mediabb.xmin); mxmax=static_cast(mediabb.xmax); mymin=static_cast(mediabb.ymin); mymax=static_cast(mediabb.ymax); mxrange=mxmax-mxmin; myrange=mymax-mymin; } if (pyrange/pxrange<=myrange/mxrange) { // short/wide xo=mxmin+((xi-pxmin)/pxrange)*mxrange; yo=mymin+.5f*(myrange-pyrange*(mxrange/pxrange))+(pyrange-yi)*(mxrange/pxrange); } else {// tall/thin xo=mxmin+.5f*(mxrange-pxrange*(myrange/pyrange))+xi*(myrange/pyrange); yo=mymin+((pyrange-yi)/pyrange)*myrange; } } // Generate print job prolog FXbool FXDCPrint::beginPrint(FXPrinter& job){ int numpages; Yr=792; //480 // This is essentially the height of the page(used so that the upper left hand corner is the origin) Xr=0; // Print to file if(job.flags&PRINT_DEST_FILE){ psout=fopen(job.name.text(),"w"); if(!psout) return FALSE; } // Print to printer else{ char buffer[1000]; const FXchar* printercmd=getApp()->reg().readStringEntry("PRINTER","command","lpr -P%s -#%d"); sprintf(buffer,printercmd,job.name.text(),job.numcopies); #ifdef WIN32 #ifndef _WINDOWS #ifdef __CYGWIN__ psout=popen(buffer,"w"); #else psout=_popen(buffer,"w"); // _popen() available for console apps only! #endif #else psout=0; #endif #else psout=popen(buffer,"w"); #endif if(!psout) return FALSE; } // Copy flags flags=job.flags; // This determines transformations mediawidth=(FXfloat)job.mediawidth; mediaheight=(FXfloat)job.mediaheight; // Set media bb; this determines transformation mediabb.xmin=(FXfloat)job.leftmargin; mediabb.xmax=(FXfloat)(job.mediawidth-job.rightmargin); mediabb.ymin=(FXfloat)job.bottommargin; mediabb.ymax=(FXfloat)(job.mediaheight-job.topmargin); // Initialize page and document bb from media bb pagebb=mediabb; docbb=mediabb; // Begin header outf("%%!PS-Adobe-3.0\n"); outf("%%%%Title: Print Job\n"); outf("%%%%Creator: FOX GUI Toolkit Application\n"); // Bounding box if(flags&PRINT_NOBOUNDS){ docbb.xmin= 1000000.0; docbb.xmax=-1000000.0; docbb.ymin= 1000000.0; docbb.ymax=-1000000.0; outf("%%%%BoundingBox: (atend)\n"); } else{ docbb.xmin=(FXfloat)job.leftmargin; docbb.xmax=(FXfloat)(job.mediawidth-job.rightmargin); docbb.ymin=(FXfloat)job.bottommargin; docbb.ymax=(FXfloat)(job.mediaheight-job.topmargin); outf("%%%%BoundingBox: %d %d %d %d\n",(int)docbb.xmin,(int)docbb.ymin,(int)docbb.xmax,(int)docbb.ymax); } setContentRange((int)docbb.xmin, (int)docbb.ymin, (int)docbb.xmax, (int)docbb.ymax); // Calculate number of pages numpages=0; if(flags&PRINT_PAGES_ODD){ numpages=1+(job.topage-job.frompage)/2; } else if(flags&PRINT_PAGES_EVEN){ numpages=1+(job.topage-job.frompage)/2; } else if(flags&PRINT_PAGES_RANGE){ numpages=1+job.topage-job.frompage; } // How many pages are coming if(numpages==0){ outf("%%%%Pages: (atend)\n"); } else{ outf("%%%%Pages: %d\n",numpages); } outf("%%%%DocumentFonts:\n"); outf("%%%%EndComments\n"); // Procedure definitions outf("%%%%BeginProlog\n\n\n"); // Various definitions outf("%% h w x y drawRect\n"); outf("/drawRect {\n\tnewpath moveto dup 0 rlineto exch dup 0 exch\n\trlineto exch neg 0 rlineto neg 0 exch rlineto\n\tclosepath stroke\n} def\n"); outf("%% h w x y fillRect\n"); outf("/fillRect {\n\tnewpath moveto dup 0 rlineto exch dup 0 exch\n\trlineto exch neg 0 rlineto neg 0 exch rlineto\n\tclosepath fill stroke\n} def\n"); outf("%% x y a b drawLine\n"); outf("/drawLine {\n\tnewpath moveto lineto stroke\n} def\n"); outf("%% x y ..... npoints drawLines\n"); outf("/drawLines {\n\t3 1 roll newpath moveto {lineto} repeat stroke\n} def\n"); outf("%% x y a b ..... nsegments drawSegmt\n"); outf("/drawSegmt {\n\tnewpath {\n\t\tmoveto lineto\n\t} repeat stroke\n} def\n"); outf("%% x y drawPoint\n"); outf("/drawPoint {\n\ttranslate 1 1 scale 8 8 1 [ 8 0 0 8 0 0 ] {<0000>} image\n} def\n"); outf("%% centerx centery startAngle endAngle radiusX radiusY drawArc\n"); outf("/drawArc {\n\tgsave dup 3 1 roll div dup 1 scale 6 -1 roll\n\texch div 5 1 roll 3 -2 roll arc stroke grestore\n} def\n"); outf("%% (string) x y height drawText\n"); outf("/drawText {\n\tgsave findfont exch scalefont setfont moveto\n\tshow grestore\n} def\n"); // Image operator outf("/bwproc\n"); outf(" { rgbproc\n"); outf(" dup length 3 idiv string 0 3 0\n"); outf(" 5 -1 roll\n"); outf(" { add 2 1 roll 1 sub dup 0 eq\n"); outf(" { pop 3 idiv 3 -1 roll dup 4 -1 roll dup\n"); outf(" 3 1 roll 5 -1 roll put 1 add 3 0 }\n"); outf(" { 2 1 roll } ifelse\n"); outf(" } forall\n"); outf(" pop pop pop\n"); outf("} def\n"); outf("systemdict /colorimage known not\n"); outf(" { /colorimage\n"); outf(" { pop pop /rgbproc exch def\n"); outf(" { bwproc } image\n"); outf(" } def\n"); outf("} if\n"); // For 3D outf("%% Color - r g b C\n"); outf("/C { setrgbcolor } bind def\n"); outf("%% Point - x y r g b P\n"); outf("/P { C newpath 0.5 0.0 360.0 arc closepath fill } bind def\n"); outf("%% Flat Shaded Line - x2 y2 x1 y1 r g b L\n"); outf("/L { C newpath moveto lineto stroke } bind def\n"); outf("%% Smooth-shaded line - x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 SL\n"); outf("/SL {\n"); outf(" /b1 exch def\n"); outf(" /g1 exch def\n"); outf(" /r1 exch def\n"); outf(" /y1 exch def\n"); outf(" /x1 exch def\n"); outf(" /b2 exch def\n"); outf(" /g2 exch def\n"); outf(" /r2 exch def\n"); outf(" /y2 exch def\n"); outf(" /x2 exch def\n"); outf("\n"); outf(" b2 b1 sub abs 0.01 gt\n"); outf(" g2 g1 sub abs 0.005 gt\n"); outf(" r2 r1 sub abs 0.008 gt\n"); outf(" or or {\n"); outf(" /bm b1 b2 add 0.5 mul def\n"); outf(" /gm g1 g2 add 0.5 mul def\n"); outf(" /rm r1 r2 add 0.5 mul def\n"); outf(" /ym y1 y2 add 0.5 mul def\n"); outf(" /xm x1 x2 add 0.5 mul def\n"); outf("\n"); outf(" x1 y1 r1 g1 b1 xm ym rm gm bm SL\n"); outf(" xm ym rm gm bm x2 y2 r2 g2 b2 SL\n"); outf(" } {\n"); outf(" x1 y1 x2 y2 r1 g1 b1 L\n"); outf(" } ifelse\n"); outf("} bind def\n"); outf("%% Flat-shaded triangle - x3 y3 x2 y2 x1 y1 r g b T\n"); outf("/T { C newpath moveto lineto lineto closepath fill } bind def\n"); outf("%% Smooth-shaded triangle - x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST\n"); outf("/ST {\n"); outf(" /b1 exch def\n"); outf(" /g1 exch def\n"); outf(" /r1 exch def\n"); outf(" /y1 exch def\n"); outf(" /x1 exch def\n"); outf(" /b2 exch def\n"); outf(" /g2 exch def\n"); outf(" /r2 exch def\n"); outf(" /y2 exch def\n"); outf(" /x2 exch def\n"); outf(" /b3 exch def\n"); outf(" /g3 exch def\n"); outf(" /r3 exch def\n"); outf(" /y3 exch def\n"); outf(" /x3 exch def\n"); outf("\n"); outf(" b2 b1 sub abs 0.05 gt\n"); outf(" g2 g1 sub abs 0.017 gt\n"); outf(" r2 r1 sub abs 0.032 gt\n"); outf(" b3 b1 sub abs 0.05 gt\n"); outf(" g3 g1 sub abs 0.017 gt\n"); outf(" r3 r1 sub abs 0.032 gt\n"); outf(" b2 b3 sub abs 0.05 gt\n"); outf(" g2 g3 sub abs 0.017 gt\n"); outf(" r2 r3 sub abs 0.032 gt\n"); outf(" or or or or or or or or {\n"); outf(" /b12 b1 b2 add 0.5 mul def\n"); outf(" /g12 g1 g2 add 0.5 mul def\n"); outf(" /r12 r1 r2 add 0.5 mul def\n"); outf(" /y12 y1 y2 add 0.5 mul def\n"); outf(" /x12 x1 x2 add 0.5 mul def\n"); outf("\n"); outf(" /b13 b1 b3 add 0.5 mul def\n"); outf(" /g13 g1 g3 add 0.5 mul def\n"); outf(" /r13 r1 r3 add 0.5 mul def\n"); outf(" /y13 y1 y3 add 0.5 mul def\n"); outf(" /x13 x1 x3 add 0.5 mul def\n"); outf("\n"); outf(" /b32 b3 b2 add 0.5 mul def\n"); outf(" /g32 g3 g2 add 0.5 mul def\n"); outf(" /r32 r3 r2 add 0.5 mul def\n"); outf(" /y32 y3 y2 add 0.5 mul def\n"); outf(" /x32 x3 x2 add 0.5 mul def\n"); outf("\n"); outf(" x1 y1 r1 g1 b1 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13\n"); outf(" x2 y2 r2 g2 b2 x12 y12 r12 g12 b12 x32 y32 r32 g32 b32\n"); outf(" x3 y3 r3 g3 b3 x32 y32 r32 g32 b32 x13 y13 r13 g13 b13\n"); outf(" x32 y32 r32 g32 b32 x12 y12 r12 g12 b12 x13 y13 r13 g13 b13\n"); outf(" ST ST ST ST\n"); outf(" } {\n"); outf(" x1 y1 x2 y2 x3 y3 r1 g1 b1 T\n"); outf(" } ifelse\n"); outf("} bind def\n"); // End of prologue outf("%%%%EndProlog\n"); // Document setup outf("%%%%BeginSetup\n"); outf("/#copies %d def\n",job.numcopies); outf("%%%%EndSetup\n"); // Keep track of #pages pagecount=0; return TRUE; } // Generate print job epilog FXbool FXDCPrint::endPrint(){ outf("%%%%Trailer\n"); // We now know the bounding box if(flags&PRINT_NOBOUNDS){ if(docbb.xmingetFontDesc(fontdesc); outf("gsave /%s findfont\n",font->getName().text()); outf("%d scalefont\n",font->getSize()/10); outf("setfont\n"); outf("newpath\n%g %g moveto\n(",xx,yy); for(FXuint i=0; i(pxmax-pxmin); //FXfloat pyrange=static_cast(pymax-pymin); //FXfloat mxmin,mxmax,mymin,mymax,mxrange,myrange; /* if(flags&PRINT_LANDSCAPE){ mxmin=static_cast(mediabb.ymin); mxmax=static_cast(mediabb.ymax); //mymin=static_cast(mediawidth-mediabb.xmax); //mymax=static_cast(mediawidth-mediabb.xmin); mymin=static_cast(mediabb.xmin); mymax=static_cast(mediabb.xmax); mxrange=mxmax-mxmin; myrange=mymax-mymin; } else{ mxmin=static_cast(mediabb.xmin); mxmax=static_cast(mediabb.xmax); mymin=static_cast(mediabb.ymin); mymax=static_cast(mediabb.ymax); mxrange=mxmax-mxmin; myrange=mymax-mymin; } */ FXfloat fsize=0.1f*font->getSize(); // Hack... // Account for dpi and scale up or down with graph... // Perhaps override screen resolution via registry // FXint screenres=getApp()->reg().readUnsignedEntry("SETTINGS","screenres",100); // Validate /* if(screenres<50) screenres=50; if(screenres>200) screenres=200; if(pyrange/pxrange<=myrange/mxrange){ // short/wide fsize *= (mxrange/pxrange)*(screenres/72.f); } else{// tall/thin fsize *= (myrange/pyrange)*(screenres/72.f); } */ FXString fname=font->getName(); if(fname=="times"){ fname="Times"; } else if(fname=="helvetica"){ fname="Helvetica"; } else if(fname=="courier"){ fname="Courier"; } else{ fname="Courier"; } if(font->getWeight()==FXFont::Bold){ if(font->getSlant()==FXFont::Italic){ fname+="-BoldItalic"; } else if(font->getSlant()==FXFont::Oblique){ fname+="-BoldOblique"; } else { fname+="-Bold"; } } else{ if(font->getSlant()==FXFont::Italic){ fname+="-Italic"; } else if(font->getSlant()==FXFont::Oblique){ fname+="-Oblique"; } } if(fname=="Times"){ fname+="-Roman"; } outf("(%s) %g %g %d /%s drawText\n",string,xx,yy,(int)fsize,fname.text()); } // Draw string with base line starting at x, y void FXDCPrint::drawText(FXint x,FXint y,const FXString& string){ drawText(x,y,string.text(),string.length()); } // Draw string with base line starting at x, y over filled background void FXDCPrint::drawImageText(FXint,FXint,const FXchar*,FXuint){ } // Draw string with base line starting at x, y over filled background void FXDCPrint::drawImageText(FXint x,FXint y,const FXString& string){ drawImageText(x,y,string.text(),string.length()); } // Draw area from source void FXDCPrint::drawArea(const FXDrawable*,FXint,FXint,FXint,FXint,FXint,FXint){ } // Draw area stretched area from source void FXDCPrint::drawArea(const FXDrawable*,FXint,FXint,FXint,FXint,FXint,FXint,FXint,FXint){ } // Draw image // Contibuted by dwalz@cs.uni-magdeburg.de void FXDCPrint::drawImage(const FXImage *img,FXint dx,FXint dy){ FXuint opts=img->getOptions(); if(opts&IMAGE_OWNED){ FXint ww = img->getWidth(); FXint hh = img->getHeight(); FXuchar *buffer = (FXuchar*)img->getData(); outf("/picstr %d string def\n",ww*3); outf("%d %d translate\n",dx,hh-dy); outf("%d %d scale\n",ww,-hh); outf("%d %d %d\n",ww,hh,8); outf("[%d 0 0 -%d 0 %d]\n",ww,hh,hh); outf("{currentfile picstr readhexstring pop}\n"); outf("false %d\n",3); outf("colorimage\n"); int end=ww*hh; for(int i=0; i FXint FXSetup::DoNTPrint(FXPrinter& printInfo){ PDEVMODE pDevMode = NULL; LONG lDevModeSize; HANDLE hDevMode = NULL; HDC pDC = NULL; DOCINFO docInfo; FXString msg = FXString("License setup wizard was unable to print,\nto printer:")+FXString(printInfo.name); FXint xOrigin; FXint yOrigin; FXint xSize; FXint ySize; lDevModeSize = DocumentProperties(NULL,NULL,printInfo.name,NULL,NULL,0); if(lDevModeSize > 0){ hDevMode = GlobalAlloc(GHND,lDevModeSize); pDevMode = (PDEVMODE)GlobalLock(hDevMode); DocumentProperties(NULL,NULL,printInfo.name,pDevMode,NULL,DM_OUT_BUFFER); } pDC = CreateDC("WINSPOOL",printInfo.name,NULL,pDevMode); if(pDC){ xOrigin = GetDeviceCaps(pDC,PHYSICALOFFSETX); yOrigin = GetDeviceCaps(pDC,PHYSICALOFFSETY); xSize = GetDeviceCaps(pDC,HORZRES); ySize = GetDeviceCaps(pDC,VERTRES); docInfo.cbSize = sizeof(DOCINFO); docInfo.lpszDocName = printInfo.name; docInfo.lpszOutput = NULL; docInfo.lpszDatatype = NULL; docInfo.fwType = 0; if(StartDoc(pDC,&docInfo)){ if(StartPage(pDC)){ FXint yPos = yOrigin+200; FXint x1Pos = xOrigin+50; FXint x2Pos = xOrigin+600; FXint n; TextOut(pDC,x1Pos,yPos,"Customer Information:",strlen("Customer Information:")); yPos = yPos+50; for(n=0; n < sizeof(machineInfo)/sizeof(char*);n++){ TextOut(pDC,x1Pos,yPos,machineInfo[n],strlen(machineInfo[n])); TextOut(pDC,x2Pos,yPos,lockID[n].text(),lockID[n].length()); yPos = yPos+50; } yPos = yPos+50; for(n=0; n < sizeof(CustomerInfo)/sizeof(char*);n++){ TextOut(pDC,x1Pos,yPos,CustomerInfo[n],strlen(CustomerInfo[n])); TextOut(pDC,x2Pos,yPos,fieldTexts[n].text(),fieldTexts[n].length()); yPos = yPos+50; } if(EndPage(pDC)){ if(EndDoc(pDC)){ GlobalFree((PDEVMODE)pDevMode); GlobalFree((HANDLE)hDevMode); DeleteDC(pDC); return 1; } } } else{ GlobalFree((PDEVMODE)pDevMode); GlobalFree((HANDLE)hDevMode); DeleteDC(pDC); FXMessageBox::error(this,MBOX_OK,"Print Error",msg.text()); return 0; } } else{ GlobalFree((PDEVMODE)pDevMode); GlobalFree((HANDLE)hDevMode); FXMessageBox::error(this,MBOX_OK,"Print Error",msg.text()); return 0; } } else{ GlobalFree((PDEVMODE)pDevMode); GlobalFree((HANDLE)hDevMode); FXMessageBox::error(this,MBOX_OK,"Print Error",msg.text()); return 0; } return 1; } */ } fox1.6-1.6.57/src/FXDCWindow.cpp000066400000000000000000002705041326741342000160540ustar00rootroot00000000000000/******************************************************************************** * * * D e v i c e C o n t e x t F o r W i n d o w s a n d I m a g e s * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDCWindow.cpp,v 1.163.2.3 2007/02/23 21:22:31 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXObject.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXId.h" #include "FXVisual.h" #include "FXFont.h" #include "FXCursor.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXBitmap.h" #include "FXIcon.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXComposite.h" #include "FXRootWindow.h" #include "FXShell.h" #include "FXRegion.h" #include "FXDC.h" #include "FXDCWindow.h" /* Notes: - Associate a DC with a surface before you begin using it: long SomeWidget::onPaint(FXObject*,FXSelector,void* ptr){ FXDCWindow dc(this,ptr); dc.drawLine(...); ... jadajadajada ... return 1; } The association is automatically broken when you go out of scope; the destructor of the FXDCWindow does this for you. - Optimizations: only perform style/attribute changes just before an actual drawing command takes place:- X-Windows apparently already does this; MS-Windows also? - We assume the following initial state: BLIT Function: BLT_SRC Foreground: black (0) Background: white (1) Line Width: 0 (meaning thinnest/fastest, no guaranteed pixelation) Cap Style: CAP_BUTT Join Style: JOIN_MITER Line Style: LINE_SOLID Fill Style: FILL_SOLID Fill Rule: RULE_EVEN_ODD Font: None Other Paremeters: To Be Determined - Under X-Windows, end() will restore the GC to the state above; flags keeps track of which changes have been made to minimize the necessary updating. - Under X, graphics_exposures should be OFF:- at least some SGI IRIX machines have broken implementations of graphics_exposures. - Try suggestions from "Kevin Radke" below: Sorry about the huge delay with this code. Work has been horribly busy and I wasn't able to dig up the CD with the original code. However, if I remember correctly (and this code snippet I found was from that test), I changed from using cosmetic pens to use geometric pens and specifying a line join style of PS_JOIN_BEVEL. I.E. LOGBRUSH logBrush; logBrush.lbStyle = BS_SOLID; logBrush.lbColor = RGB(red, green, blue); logBrush.lbHatch = HS_CROSS; // Not used // NYI Only solid lines are valid on Windows 95. style is ignored return ExtCreatePen (PS_GEOMETRIC | PS_JOIN_BEVEL | style, width, &logBrush, 0, NULL); this returns an HPEN. I remember this being significantly slower than cosmetic pens (under NT4) and at the time that I scrapped the code, and dealt with the drawing differences between X and Win32 at a higher level. This won't work on Win95/Win98 (without using paths), and after a closer look at the docs here it makes more sense to specify PS_ENDCAP_SQUARE to draw the last pixel instead of the line join style. I remember experimenting with both, so the code I found may have been in intermediate (unworking) version. In any case, it isn't too hard to experiment to see which has the required behavior. I've unfortunately been away from FOX work for a few months or I'd try it myself. - Device caps for DirectX: http://www.molybdenium.de/devicecaps/e_index.html */ #define DISPLAY(app) ((Display*)((app)->display)) using namespace FX; namespace FX { /******************************************************************************** * X-Windows * ********************************************************************************/ #ifndef WIN32 // Construct for expose event painting FXDCWindow::FXDCWindow(FXDrawable* drawable,FXEvent* event):FXDC(drawable->getApp()){ #ifdef HAVE_XFT_H xftDraw=NULL; #endif begin(drawable); rect.x=clip.x=event->rect.x; rect.y=clip.y=event->rect.y; rect.w=clip.w=event->rect.w; rect.h=clip.h=event->rect.h; XSetClipRectangles(DISPLAY(getApp()),(GC)ctx,0,0,(XRectangle*)&clip,1,Unsorted); #ifdef HAVE_XFT_H XftDrawSetClipRectangles((XftDraw*)xftDraw,0,0,(XRectangle*)&clip,1); #endif flags|=GCClipMask; } // Construct for normal painting FXDCWindow::FXDCWindow(FXDrawable* drawable):FXDC(drawable->getApp()){ #ifdef HAVE_XFT_H xftDraw=NULL; #endif begin(drawable); } // Destruct FXDCWindow::~FXDCWindow(){ end(); } // Begin locks in a drawable surface void FXDCWindow::begin(FXDrawable *drawable){ if(!drawable){ fxerror("FXDCWindow::begin: NULL drawable.\n"); } if(!drawable->id()){ fxerror("FXDCWindow::begin: drawable not created yet.\n"); } surface=drawable; visual=drawable->getVisual(); rect.x=clip.x=0; rect.y=clip.y=0; rect.w=clip.w=drawable->getWidth(); rect.h=clip.h=drawable->getHeight(); devfg=~0; devbg=0; ctx=visual->gc; flags=0; #ifdef HAVE_XFT_H xftDraw=(void*)XftDrawCreate(DISPLAY(drawable->getApp()),(Drawable)surface->id(),(Visual*)visual->visual,(Colormap)visual->colormap); #endif } // End unlock the drawable surface; restore it void FXDCWindow::end(){ if(flags){ XGCValues gcv; if(flags&GCFunction) gcv.function=BLT_SRC; if(flags&GCForeground) gcv.foreground=BlackPixel(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))); if(flags&GCBackground) gcv.background=WhitePixel(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))); if(flags&GCLineWidth) gcv.line_width=0; if(flags&GCCapStyle) gcv.cap_style=CAP_BUTT; if(flags&GCJoinStyle) gcv.join_style=JOIN_MITER; if(flags&GCLineStyle) gcv.line_style=LINE_SOLID; if(flags&GCFillStyle) gcv.fill_style=FILL_SOLID; if(flags&GCStipple) gcv.stipple=getApp()->stipples[STIPPLE_WHITE]; // Needed for IRIX6.4 bug workaround! if(flags&GCFillRule) gcv.fill_rule=RULE_EVEN_ODD; #ifndef HAVE_XFT_H if(flags&GCFont) gcv.font=getApp()->getNormalFont()->id(); #endif if(flags&GCClipMask) gcv.clip_mask=None; if(flags&GCClipXOrigin) gcv.clip_x_origin=0; if(flags&GCClipYOrigin) gcv.clip_y_origin=0; if(flags&GCDashOffset) gcv.dash_offset=0; if(flags&GCDashList) gcv.dashes=4; if(flags&GCTileStipXOrigin) gcv.ts_x_origin=0; if(flags&GCTileStipYOrigin) gcv.ts_y_origin=0; if(flags&GCGraphicsExposures) gcv.graphics_exposures=True; if(flags&GCSubwindowMode) gcv.subwindow_mode=ClipByChildren; XChangeGC(DISPLAY(getApp()),(GC)ctx,flags,&gcv); flags=0; } surface=NULL; #ifdef HAVE_XFT_H if(xftDraw){ XftDrawDestroy((XftDraw*)xftDraw); xftDraw=NULL; } #endif } // Read back pixel FXColor FXDCWindow::readPixel(FXint x,FXint y){ FXColor color=FXRGBA(0,0,0,0); if(!surface){ fxerror("FXDCWindow::readPixel: DC not connected to drawable.\n"); } if(0<=x && 0<=y && xgetWidth() && ygetHeight()){ XImage* xim=XGetImage(DISPLAY(getApp()),surface->id(),x,y,1,1,AllPlanes,ZPixmap); if(xim && xim->data){ color=visual->getColor(XGetPixel(xim,0,0)); XDestroyImage(xim); } } return color; } // Draw point void FXDCWindow::drawPoint(FXint x,FXint y){ if(!surface){ fxerror("FXDCWindow::drawPoint: DC not connected to drawable.\n"); } XDrawPoint(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y); } // Draw points void FXDCWindow::drawPoints(const FXPoint* points,FXuint npoints){ if(!surface){ fxerror("FXDCWindow::drawPoints: DC not connected to drawable.\n"); } XDrawPoints(DISPLAY(getApp()),surface->id(),(GC)ctx,(XPoint*)points,npoints,CoordModeOrigin); } // Draw points relative void FXDCWindow::drawPointsRel(const FXPoint* points,FXuint npoints){ if(!surface){ fxerror("FXDCWindow::drawPointsRel: DC not connected to drawable.\n"); } XDrawPoints(DISPLAY(getApp()),surface->id(),(GC)ctx,(XPoint*)points,npoints,CoordModePrevious); } // Draw line void FXDCWindow::drawLine(FXint x1,FXint y1,FXint x2,FXint y2){ if(!surface){ fxerror("FXDCWindow::drawLine: DC not connected to drawable.\n"); } XDrawLine(DISPLAY(getApp()),surface->id(),(GC)ctx,x1,y1,x2,y2); } // Draw lines void FXDCWindow::drawLines(const FXPoint* points,FXuint npoints){ if(!surface){ fxerror("FXDCWindow::drawLines: DC not connected to drawable.\n"); } XDrawLines(DISPLAY(getApp()),surface->id(),(GC)ctx,(XPoint*)points,npoints,CoordModeOrigin); } // Draw lines relative void FXDCWindow::drawLinesRel(const FXPoint* points,FXuint npoints){ if(!surface){ fxerror("FXDCWindow::drawLinesRel: DC not connected to drawable.\n"); } XDrawLines(DISPLAY(getApp()),surface->id(),(GC)ctx,(XPoint*)points,npoints,CoordModePrevious); } // Draw line segments void FXDCWindow::drawLineSegments(const FXSegment* segments,FXuint nsegments){ if(!surface){ fxerror("FXDCWindow::drawLineSegments: DC not connected to drawable.\n"); } XDrawSegments(DISPLAY(getApp()),surface->id(),(GC)ctx,(XSegment*)segments,nsegments); } // Draw rectangle void FXDCWindow::drawRectangle(FXint x,FXint y,FXint w,FXint h){ if(!surface){ fxerror("FXDCWindow::drawRectangle: DC not connected to drawable.\n"); } XDrawRectangle(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y,w,h); } // Draw rectangles void FXDCWindow::drawRectangles(const FXRectangle* rectangles,FXuint nrectangles){ if(!surface){ fxerror("FXDCWindow::drawRectangles: DC not connected to drawable.\n"); } XDrawRectangles(DISPLAY(getApp()),surface->id(),(GC)ctx,(XRectangle*)rectangles,nrectangles); } // Draw round rectangle void FXDCWindow::drawRoundRectangle(FXint x,FXint y,FXint w,FXint h,FXint ew,FXint eh){ XArc arcs[4]; XSegment segs[4]; XGCValues gcv; if(!surface){ fxerror("FXDCWindow::drawRoundRectangle: DC not connected to drawable.\n"); } if(ew+ew>w) ew=w>>1; if(eh+eh>h) eh=h>>1; arcs[0].x=arcs[2].x=x; arcs[0].y=arcs[1].y=y; arcs[1].x=arcs[3].x=x+w-(ew<<1); arcs[2].y=arcs[3].y=y+h-(eh<<1); arcs[0].width=arcs[1].width=arcs[2].width=arcs[3].width=ew<<1; arcs[0].height=arcs[1].height=arcs[2].height=arcs[3].height=eh<<1; arcs[0].angle1=5760; arcs[0].angle2=5760; arcs[1].angle1=0; arcs[1].angle2=5760; arcs[2].angle1=11520; arcs[2].angle2=5760; arcs[3].angle1=17280; arcs[3].angle2=5760; segs[0].x1=segs[1].x1=x+ew; segs[0].x2=segs[1].x2=x+w-ew; segs[0].y1=segs[0].y2=y; segs[1].y1=segs[1].y2=y+h; segs[2].x1=segs[2].x2=x; segs[3].x1=segs[3].x2=x+w; segs[2].y1=segs[3].y1=y+eh; segs[2].y2=segs[3].y2=y+h-eh; gcv.cap_style=CapButt; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCCapStyle,&gcv); XDrawArcs(DISPLAY(getApp()),surface->id(),(GC)ctx,arcs,4); XDrawSegments(DISPLAY(getApp()),surface->id(),(GC)ctx,segs,4); gcv.cap_style=cap; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCCapStyle,&gcv); } // Draw arc void FXDCWindow::drawArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2){ if(!surface){ fxerror("FXDCWindow::drawArc: DC not connected to drawable.\n"); } XDrawArc(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y,w,h,ang1,ang2); } // Draw arcs void FXDCWindow::drawArcs(const FXArc* arcs,FXuint narcs){ if(!surface){ fxerror("FXDCWindow::drawArcs: DC not connected to drawable.\n"); } XDrawArcs(DISPLAY(getApp()),surface->id(),(GC)ctx,(XArc*)arcs,narcs); } // Draw ellipse void FXDCWindow::drawEllipse(FXint x,FXint y,FXint w,FXint h){ if(!surface){ fxerror("FXDCWindow::drawEllipse: DC not connected to drawable.\n"); } XDrawArc(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y,w,h,0,23040); } // Fill rectangle void FXDCWindow::fillRectangle(FXint x,FXint y,FXint w,FXint h){ if(!surface){ fxerror("FXDCWindow::fillRectangle: DC not connected to drawable.\n"); } XFillRectangle(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y,w,h); } // Fill rectangles void FXDCWindow::fillRectangles(const FXRectangle* rectangles,FXuint nrectangles){ if(!surface){ fxerror("FXDCWindow::fillRectangles: DC not connected to drawable.\n"); } XFillRectangles(DISPLAY(getApp()),surface->id(),(GC)ctx,(XRectangle*)rectangles,nrectangles); } // Fill rounded rectangle void FXDCWindow::fillRoundRectangle(FXint x,FXint y,FXint w,FXint h,FXint ew,FXint eh){ XArc arcs[4]; XRectangle recs[3]; if(!surface){ fxerror("FXDCWindow::fillRoundRectangle: DC not connected to drawable.\n"); } if(ew+ew>w) ew=w>>1; if(eh+eh>h) eh=h>>1; arcs[0].x=arcs[2].x=x; arcs[0].y=arcs[1].y=y; arcs[1].x=arcs[3].x=x+w-(ew<<1); arcs[2].y=arcs[3].y=y+h-(eh<<1); arcs[0].width=arcs[1].width=arcs[2].width=arcs[3].width=ew<<1; arcs[0].height=arcs[1].height=arcs[2].height=arcs[3].height=eh<<1; arcs[0].angle1=5760; arcs[0].angle2=5760; arcs[1].angle1=0; arcs[1].angle2=5760; arcs[2].angle1=11520; arcs[2].angle2=5760; arcs[3].angle1=17280; arcs[3].angle2=5760; recs[0].x=recs[2].x=x+ew; recs[0].width=recs[2].width=w-(ew<<1); recs[0].height=recs[2].height=eh; recs[0].y=y; recs[2].y=y+h-eh; recs[1].x=x; recs[1].y=y+eh; recs[1].width=w; recs[1].height=h-(eh<<1); XFillArcs(DISPLAY(getApp()),surface->id(),(GC)ctx,arcs,4); XFillRectangles(DISPLAY(getApp()),surface->id(),(GC)ctx,recs,3); } // Fill chord void FXDCWindow::fillChord(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2){ if(!surface){ fxerror("FXDCWindow::fillChord: DC not connected to drawable.\n"); } XSetArcMode(DISPLAY(getApp()),(GC)ctx,ArcChord); XFillArc(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y,w,h,ang1,ang2); XSetArcMode(DISPLAY(getApp()),(GC)ctx,ArcPieSlice); } // Fill chords void FXDCWindow::fillChords(const FXArc* chords,FXuint nchords){ if(!surface){ fxerror("FXDCWindow::fillChords: DC not connected to drawable.\n"); } XSetArcMode(DISPLAY(getApp()),(GC)ctx,ArcChord); XFillArcs(DISPLAY(getApp()),surface->id(),(GC)ctx,(XArc*)chords,nchords); XSetArcMode(DISPLAY(getApp()),(GC)ctx,ArcPieSlice); } // Fill arc void FXDCWindow::fillArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2){ if(!surface){ fxerror("FXDCWindow::fillArc: DC not connected to drawable.\n"); } XFillArc(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y,w,h,ang1,ang2); } // Fill arcs void FXDCWindow::fillArcs(const FXArc* arcs,FXuint narcs){ if(!surface){ fxerror("FXDCWindow::fillArcs: DC not connected to drawable.\n"); } XFillArcs(DISPLAY(getApp()),surface->id(),(GC)ctx,(XArc*)arcs,narcs); } // Fill ellipse void FXDCWindow::fillEllipse(FXint x,FXint y,FXint w,FXint h){ if(!surface){ fxerror("FXDCWindow::fillEllipse: DC not connected to drawable.\n"); } XFillArc(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y,w,h,0,23040); } // Fill polygon void FXDCWindow::fillPolygon(const FXPoint* points,FXuint npoints){ if(!surface){ fxerror("FXDCWindow::fillArcs: DC not connected to drawable.\n"); } XFillPolygon(DISPLAY(getApp()),surface->id(),(GC)ctx,(XPoint*)points,npoints,Convex,CoordModeOrigin); } // Fill concave polygon void FXDCWindow::fillConcavePolygon(const FXPoint* points,FXuint npoints){ if(!surface){ fxerror("FXDCWindow::fillConcavePolygon: DC not connected to drawable.\n"); } XFillPolygon(DISPLAY(getApp()),surface->id(),(GC)ctx,(XPoint*)points,npoints,Nonconvex,CoordModeOrigin); } // Fill complex polygon void FXDCWindow::fillComplexPolygon(const FXPoint* points,FXuint npoints){ if(!surface){ fxerror("FXDCWindow::fillComplexPolygon: DC not connected to drawable.\n"); } XFillPolygon(DISPLAY(getApp()),surface->id(),(GC)ctx,(XPoint*)points,npoints,Complex,CoordModeOrigin); } // Fill polygon relative void FXDCWindow::fillPolygonRel(const FXPoint* points,FXuint npoints){ if(!surface){ fxerror("FXDCWindow::fillPolygonRel: DC not connected to drawable.\n"); } XFillPolygon(DISPLAY(getApp()),surface->id(),(GC)ctx,(XPoint*)points,npoints,Convex,CoordModePrevious); } // Fill concave polygon relative void FXDCWindow::fillConcavePolygonRel(const FXPoint* points,FXuint npoints){ if(!surface){ fxerror("FXDCWindow::fillConcavePolygonRel: DC not connected to drawable.\n"); } XFillPolygon(DISPLAY(getApp()),surface->id(),(GC)ctx,(XPoint*)points,npoints,Nonconvex,CoordModePrevious); } // Fill complex polygon relative void FXDCWindow::fillComplexPolygonRel(const FXPoint* points,FXuint npoints){ if(!surface){ fxerror("FXDCWindow::fillComplexPolygonRel: DC not connected to drawable.\n"); } XFillPolygon(DISPLAY(getApp()),surface->id(),(GC)ctx,(XPoint*)points,npoints,Complex,CoordModePrevious); } // Set text font void FXDCWindow::setFont(FXFont *fnt){ if(!surface){ fxerror("FXDCWindow::setFont: DC not connected to drawable.\n"); } if(!fnt || !fnt->id()){ fxerror("FXDCWindow::setFont: illegal or NULL font specified.\n"); } #ifndef HAVE_XFT_H XSetFont(DISPLAY(getApp()),(GC)ctx,fnt->id()); flags|=GCFont; #endif font=fnt; } /* We eventually want subclassable fonts. FXDCWindow knows about surface, but does not know about font type. Thus, drawText() here should vector to new API's in FXFont. New API gets FXDC* (or FXDC&) so that it can obtain colors, &c. Thus, all knowledge of font-technology is kept inside FXFont. Knowledge of FXDCWindow surface is kept inside FXDCWindow. But FXDC may have some responsibility for layout of characters. Of course, certain font types can only draw on certain DC types... void FXDCWindow::drawText(FXint x,FXint y,const FXchar* string,FXuint length){ if(!surface){ fxerror("FXDCWindow::drawText: DC not connected to drawable.\n"); } if(!font){ fxerror("FXDCWindow::drawText: no font selected.\n"); } font->drawText(this,x,y,string,length); } */ #define FS ((XFontStruct*)(font->font)) static FXint utf2db(XChar2b *dst,const FXchar *src,FXint n){ register FXint len,p; register FXwchar w; for(p=len=0; p>8); dst[len].byte2=(w&255); } return len; } // Draw string with base line starting at x, y void FXDCWindow::drawText(FXint x,FXint y,const FXchar* string,FXuint length){ if(!surface){ fxerror("FXDCWindow::drawText: DC not connected to drawable.\n"); } if(!font){ fxerror("FXDCWindow::drawText: no font selected.\n"); } #ifdef HAVE_XFT_H XftColor color; color.pixel=devfg; color.color.red=FXREDVAL(fg)*257; color.color.green=FXGREENVAL(fg)*257; color.color.blue=FXBLUEVAL(fg)*257; color.color.alpha=FXALPHAVAL(fg)*257; XftDrawStringUtf8((XftDraw*)xftDraw,&color,(XftFont*)font->font,x,y,(const FcChar8*)string,length); #else register FXint count,escapement,defwidth,ww,size,i; register FXdouble ang,ux,uy; register FXuchar r,c; XChar2b sbuffer[4096]; count=utf2db(sbuffer,string,FXMIN(length,4096)); if(font->getAngle()){ ang=font->getAngle()*0.00027270769562411399179; defwidth=FS->min_bounds.width; ux=cos(ang); uy=sin(ang); if(FS->per_char){ r=FS->default_char>>8; c=FS->default_char&255; size=(FS->max_char_or_byte2-FS->min_char_or_byte2+1); if(FS->min_char_or_byte2<=c && c<=FS->max_char_or_byte2 && FS->min_byte1<=r && r<=FS->max_byte1){ defwidth=FS->per_char[(r-FS->min_byte1)*size+(c-FS->min_char_or_byte2)].width; } for(i=escapement=0; iid(),(GC)ctx,(FXint)(x+escapement*ux),(FXint)(y-escapement*uy),&sbuffer[i],1); r=sbuffer[i].byte1; c=sbuffer[i].byte2; escapement+=defwidth; if(FS->min_char_or_byte2<=c && c<=FS->max_char_or_byte2 && FS->min_byte1<=r && r<=FS->max_byte1){ if((ww=FS->per_char[(r-FS->min_byte1)*size+(c-FS->min_char_or_byte2)].width)!=0) escapement+=ww-defwidth; } } } else{ for(i=escapement=0; iid(),(GC)ctx,(FXint)(x+escapement*ux),(FXint)(y-escapement*uy),&sbuffer[i],1); escapement+=defwidth; } } } else{ XDrawString16(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y,sbuffer,count); } #endif } // Draw text starting at x, y over filled background void FXDCWindow::drawImageText(FXint x,FXint y,const FXchar* string,FXuint length){ if(!surface){ fxerror("FXDCWindow::drawImageText: DC not connected to drawable.\n"); } if(!font){ fxerror("FXDCWindow::drawImageText: no font selected.\n"); } #ifdef HAVE_XFT_H XGlyphInfo extents; XftColor fgcolor,bgcolor; fgcolor.pixel=devfg; fgcolor.color.red=FXREDVAL(fg)*257; fgcolor.color.green=FXGREENVAL(fg)*257; fgcolor.color.blue=FXBLUEVAL(fg)*257; fgcolor.color.alpha=FXALPHAVAL(fg)*257; bgcolor.pixel=devbg; bgcolor.color.red=FXREDVAL(bg)*257; bgcolor.color.green=FXGREENVAL(bg)*257; bgcolor.color.blue=FXBLUEVAL(bg)*257; bgcolor.color.alpha=FXALPHAVAL(bg)*257; // Area to blank XftTextExtents8(DISPLAY(getApp()),(XftFont*)font->font,(const FcChar8*)string,length,&extents); // Erase around text [FIXME wrong location] XftDrawRect((XftDraw*)xftDraw,&bgcolor,x,y-font->getFontAscent(),extents.width,extents.height); // XftDrawRect((XftDraw*)xftDraw,&bgcolor,x+cache->xoff,y-xftfs->ascent,cache->x2off-cache->xoff,xftfs->ascent+xftfs->descent); //XftDrawRect((XftDraw*)xftDraw,&bgcolor,x+cache->xoff,y-((XftFont*)font->font)->ascent,cache->x2off-cache->xoff,((XftFont*)font->font)->ascent+((XftFont*)font->font)->descent); XftDrawStringUtf8((XftDraw*)xftDraw,&fgcolor,(XftFont*)font->font,x,y,(const FcChar8*)string,length); #else register FXint count,escapement,defwidth,ww,size,i; register FXdouble ang,ux,uy; register FXuchar r,c; XChar2b sbuffer[4096]; count=utf2db(sbuffer,string,FXMIN(length,4096)); if(font->getAngle()){ ang=font->getAngle()*0.00027270769562411399179; defwidth=FS->min_bounds.width; ux=cos(ang); uy=sin(ang); if(FS->per_char){ r=FS->default_char>>8; c=FS->default_char&255; size=(FS->max_char_or_byte2-FS->min_char_or_byte2+1); if(FS->min_char_or_byte2<=c && c<=FS->max_char_or_byte2 && FS->min_byte1<=r && r<=FS->max_byte1){ defwidth=FS->per_char[(r-FS->min_byte1)*size+(c-FS->min_char_or_byte2)].width; } for(i=escapement=0; iid(),(GC)ctx,(FXint)(x+escapement*ux),(FXint)(y-escapement*uy),&sbuffer[i],1); r=sbuffer[i].byte1; c=sbuffer[i].byte2; escapement+=defwidth; if(FS->min_char_or_byte2<=c && c<=FS->max_char_or_byte2 && FS->min_byte1<=r && r<=FS->max_byte1){ if((ww=FS->per_char[(r-FS->min_byte1)*size+(c-FS->min_char_or_byte2)].width)!=0) escapement+=ww-defwidth; } } } else{ for(i=escapement=0; iid(),(GC)ctx,(FXint)(x+escapement*ux),(FXint)(y-escapement*uy),&sbuffer[i],1); escapement+=defwidth; } } } else{ XDrawImageString16(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y,sbuffer,count); } #endif } #undef FS // Draw string with base line starting at x, y void FXDCWindow::drawText(FXint x,FXint y,const FXString& string){ drawText(x,y,string.text(),string.length()); } // Draw text starting at x, y over filled background void FXDCWindow::drawImageText(FXint x,FXint y,const FXString& string){ drawImageText(x,y,string.text(),string.length()); } // Draw area void FXDCWindow::drawArea(const FXDrawable* source,FXint sx,FXint sy,FXint sw,FXint sh,FXint dx,FXint dy){ if(!surface){ fxerror("FXDCWindow::drawArea: DC not connected to drawable.\n"); } if(!source || !source->id()){ fxerror("FXDCWindow::drawArea: illegal source specified.\n"); } XCopyArea(DISPLAY(getApp()),source->id(),surface->id(),(GC)ctx,sx,sy,sw,sh,dx,dy); } // Draw area stretched area from source; FIXME this works but it's like molasses! void FXDCWindow::drawArea(const FXDrawable* source,FXint sx,FXint sy,FXint sw,FXint sh,FXint dx,FXint dy,FXint dw,FXint dh){ register FXint i,j,x,y,xs,ys; if(!surface){ fxerror("FXDCWindow::drawArea: DC not connected to drawable.\n"); } if(!source || !source->id()){ fxerror("FXDCWindow::drawArea: illegal source specified.\n"); } xs=(sw<<16)/dw; ys=(sh<<16)/dh; i=0; y=ys>>1; do{ j=0; x=xs>>1; do{ XCopyArea(DISPLAY(getApp()),source->id(),surface->id(),(GC)ctx,sx+(x>>16),sy+(y>>16),1,1,dx+j,dy+i); x+=xs; } while(++jid()){ fxerror("FXDCWindow::drawImage: illegal image specified.\n"); } XCopyArea(DISPLAY(getApp()),image->id(),surface->id(),(GC)ctx,0,0,image->width,image->height,dx,dy); } // Draw bitmap void FXDCWindow::drawBitmap(const FXBitmap* bitmap,FXint dx,FXint dy) { if(!surface) fxerror("FXDCWindow::drawBitmap: DC not connected to drawable.\n"); if(!bitmap || !bitmap->id()) fxerror("FXDCWindow::drawBitmap: illegal bitmap specified.\n"); XCopyPlane(DISPLAY(getApp()),bitmap->id(),surface->id(),(GC)ctx,0,0,bitmap->width,bitmap->height,dx,dy,1); } // Draw a vanilla icon void FXDCWindow::drawIcon(const FXIcon* icon,FXint dx,FXint dy){ if(!surface){ fxerror("FXDCWindow::drawIcon: DC not connected to drawable.\n"); } if(!icon || !icon->id() || !icon->shape){ fxerror("FXDCWindow::drawIcon: illegal icon specified.\n"); } FXRectangle d=clip*FXRectangle(dx,dy,icon->width,icon->height); if(d.w>0 && d.h>0){ if(icon->getOptions()&IMAGE_OPAQUE){ XCopyArea(DISPLAY(getApp()),icon->id(),surface->id(),(GC)ctx,d.x-dx,d.y-dy,d.w,d.h,d.x,d.y); } else{ XGCValues gcv; gcv.clip_mask=icon->shape; gcv.clip_x_origin=dx; gcv.clip_y_origin=dy; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCClipMask|GCClipXOrigin|GCClipYOrigin,&gcv); XCopyArea(DISPLAY(getApp()),icon->id(),surface->id(),(GC)ctx,d.x-dx,d.y-dy,d.w,d.h,d.x,d.y); XSetClipRectangles(DISPLAY(getApp()),(GC)ctx,0,0,(XRectangle*)&clip,1,Unsorted); // Restore old clip rectangle flags|=GCClipMask; } } } // Draw a shaded icon, like when it is selected void FXDCWindow::drawIconShaded(const FXIcon* icon,FXint dx,FXint dy){ if(!surface){ fxerror("FXDCWindow::drawIconShaded: DC not connected to drawable.\n"); } if(!icon || !icon->id() || !icon->shape){ fxerror("FXDCWindow::drawIconShaded: illegal icon specified.\n"); } FXRectangle d=clip*FXRectangle(dx,dy,icon->width,icon->height); if(d.w>0 && d.h>0){ XGCValues gcv; gcv.clip_mask=icon->shape; gcv.clip_x_origin=dx; gcv.clip_y_origin=dy; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCClipMask|GCClipXOrigin|GCClipYOrigin,&gcv); XCopyArea(DISPLAY(getApp()),icon->id(),surface->id(),(GC)ctx,d.x-dx,d.y-dy,d.w,d.h,d.x,d.y); gcv.function=BLT_SRC; gcv.stipple=getApp()->stipples[STIPPLE_GRAY]; gcv.fill_style=FILL_STIPPLED; gcv.ts_x_origin=dx; gcv.ts_y_origin=dy; gcv.foreground=visual->getPixel(getApp()->getSelbackColor()); XChangeGC(DISPLAY(getApp()),(GC)ctx,GCForeground|GCFunction|GCTileStipXOrigin|GCTileStipYOrigin|GCStipple|GCFillStyle,&gcv); XFillRectangle(DISPLAY(getApp()),surface->id(),(GC)ctx,d.x,d.y,d.w,d.h); gcv.function=rop; gcv.fill_style=fill; gcv.ts_x_origin=tx; gcv.ts_y_origin=ty; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCTileStipXOrigin|GCTileStipYOrigin|GCFunction|GCFillStyle,&gcv); // Restore old raster op function and fill style XSetClipRectangles(DISPLAY(getApp()),(GC)ctx,0,0,(XRectangle*)&clip,1,Unsorted); // Restore old clip rectangle flags|=GCClipMask; } } // This draws a sunken icon void FXDCWindow::drawIconSunken(const FXIcon* icon,FXint dx,FXint dy){ if(!surface){ fxerror("FXDCWindow::drawIconSunken: DC not connected to drawable.\n"); } if(!icon || !icon->id() || !icon->etch){ fxerror("FXDCWindow::drawIconSunken: illegal icon specified.\n"); } XGCValues gcv; FXColor base=getApp()->getBaseColor(); FXColor clr=FXRGB((85*FXREDVAL(base))/100,(85*FXGREENVAL(base))/100,(85*FXBLUEVAL(base))/100); // Erase to black gcv.background=0; gcv.foreground=0xffffffff; gcv.function=BLT_NOT_SRC_AND_DST; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCForeground|GCBackground|GCFunction,&gcv); XCopyPlane(DISPLAY(getApp()),icon->etch,surface->id(),(GC)ctx,0,0,icon->width,icon->height,dx+1,dy+1,1); // Paint highlight part gcv.function=BLT_SRC_OR_DST; gcv.foreground=visual->getPixel(getApp()->getHiliteColor()); XChangeGC(DISPLAY(getApp()),(GC)ctx,GCForeground|GCFunction,&gcv); XCopyPlane(DISPLAY(getApp()),icon->etch,surface->id(),(GC)ctx,0,0,icon->width,icon->height,dx+1,dy+1,1); // Erase to black gcv.foreground=0xffffffff; gcv.function=BLT_NOT_SRC_AND_DST; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCForeground|GCFunction,&gcv); XCopyPlane(DISPLAY(getApp()),icon->etch,surface->id(),(GC)ctx,0,0,icon->width,icon->height,dx,dy,1); // Paint shadow part gcv.function=BLT_SRC_OR_DST; gcv.foreground=visual->getPixel(clr); XChangeGC(DISPLAY(getApp()),(GC)ctx,GCForeground|GCFunction,&gcv); XCopyPlane(DISPLAY(getApp()),icon->etch,surface->id(),(GC)ctx,0,0,icon->width,icon->height,dx,dy,1); // Restore stuff gcv.foreground=devfg; gcv.background=devbg; gcv.function=rop; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCForeground|GCBackground|GCFunction,&gcv); } // Draw hash box void FXDCWindow::drawHashBox(FXint x,FXint y,FXint w,FXint h,FXint b){ XGCValues gcv; if(!surface){ fxerror("FXDCWindow::drawHashBox: DC not connected to drawable.\n"); } gcv.stipple=getApp()->stipples[STIPPLE_GRAY]; gcv.fill_style=FILL_STIPPLED; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCStipple|GCFillStyle,&gcv); XFillRectangle(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y,w-b,b); XFillRectangle(DISPLAY(getApp()),surface->id(),(GC)ctx,x+w-b,y,b,h-b); XFillRectangle(DISPLAY(getApp()),surface->id(),(GC)ctx,x+b,y+h-b,w-b,b); XFillRectangle(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y+b,b,h-b); gcv.stipple=getApp()->stipples[STIPPLE_WHITE]; // Needed for IRIX6.4 bug workaround! gcv.fill_style=fill; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCStipple|GCFillStyle,&gcv); } // Draw focus rectangle void FXDCWindow::drawFocusRectangle(FXint x,FXint y,FXint w,FXint h){ XGCValues gcv; if(!surface){ fxerror("FXDCWindow::drawFocusRectangle: DC not connected to drawable.\n"); } gcv.stipple=getApp()->stipples[STIPPLE_GRAY]; gcv.fill_style=FILL_STIPPLED; gcv.background=0; gcv.foreground=0xffffffff; // Maybe should use FILL_OPAQUESTIPPLED and current fg/bg color and BLT_SRC gcv.function=BLT_SRC_XOR_DST; // This would be more flexible gcv.ts_x_origin=x; gcv.ts_y_origin=y; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCTileStipXOrigin|GCTileStipYOrigin|GCForeground|GCBackground|GCFunction|GCStipple|GCFillStyle,&gcv); XFillRectangle(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y,w-1,1); XFillRectangle(DISPLAY(getApp()),surface->id(),(GC)ctx,x+w-1,y,1,h-1); XFillRectangle(DISPLAY(getApp()),surface->id(),(GC)ctx,x+1,y+h-1,w-1,1); XFillRectangle(DISPLAY(getApp()),surface->id(),(GC)ctx,x,y+1,1,h-1); gcv.stipple=getApp()->stipples[STIPPLE_WHITE]; // Needed for IRIX6.4 bug workaround! gcv.fill_style=fill; gcv.background=devbg; gcv.foreground=devfg; gcv.function=rop; gcv.ts_x_origin=tx; gcv.ts_y_origin=ty; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCTileStipXOrigin|GCTileStipYOrigin|GCForeground|GCBackground|GCFunction|GCStipple|GCFillStyle,&gcv); } // Set foreground color void FXDCWindow::setForeground(FXColor clr){ if(!surface){ fxerror("FXDCWindow::setForeground: DC not connected to drawable.\n"); } devfg=visual->getPixel(clr); XSetForeground(DISPLAY(getApp()),(GC)ctx,devfg); flags|=GCForeground; fg=clr; } // Set background color void FXDCWindow::setBackground(FXColor clr){ if(!surface){ fxerror("FXDCWindow::setBackground: DC not connected to drawable.\n"); } devbg=visual->getPixel(clr); XSetBackground(DISPLAY(getApp()),(GC)ctx,devbg); flags|=GCBackground; bg=clr; } // Set dashes void FXDCWindow::setDashes(FXuint dashoffset,const FXchar *dashpattern,FXuint dashlength){ register FXuint len,i; if(!surface){ fxerror("FXDCWindow::setDashes: DC not connected to drawable.\n"); } for(i=len=0; iid()){ fxerror("FXDCWindow::setTile: illegal image specified.\n"); } gcv.tile=image->id(); gcv.ts_x_origin=dx; gcv.ts_y_origin=dy; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCTileStipXOrigin|GCTileStipYOrigin|GCTile,&gcv); if(dx) flags|=GCTileStipXOrigin; if(dy) flags|=GCTileStipYOrigin; tile=image; tx=dx; ty=dy; } // Set stipple bitmap void FXDCWindow::setStipple(FXBitmap* bitmap,FXint dx,FXint dy){ XGCValues gcv; if(!surface){ fxerror("FXDCWindow::setStipple: DC not connected to drawable.\n"); } if(!bitmap || !bitmap->id()){ fxerror("FXDCWindow::setStipple: illegal image specified.\n"); } gcv.stipple=bitmap->id(); gcv.ts_x_origin=dx; gcv.ts_y_origin=dy; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCTileStipXOrigin|GCTileStipYOrigin|GCStipple,&gcv); if(dx) flags|=GCTileStipXOrigin; if(dy) flags|=GCTileStipYOrigin; flags|=GCStipple; stipple=bitmap; pattern=STIPPLE_NONE; tx=dx; ty=dy; } // Set stipple pattern void FXDCWindow::setStipple(FXStipplePattern pat,FXint dx,FXint dy){ XGCValues gcv; if(!surface){ fxerror("FXDCWindow::setStipple: DC not connected to drawable.\n"); } if(pat>STIPPLE_CROSSDIAG) pat=STIPPLE_CROSSDIAG; FXASSERT(getApp()->stipples[pat]); gcv.stipple=getApp()->stipples[pat]; gcv.ts_x_origin=dx; gcv.ts_y_origin=dy; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCTileStipXOrigin|GCTileStipYOrigin|GCStipple,&gcv); if(dx) flags|=GCTileStipXOrigin; if(dy) flags|=GCTileStipYOrigin; stipple=NULL; pattern=pat; flags|=GCStipple; tx=dx; ty=dy; } // Set clip region void FXDCWindow::setClipRegion(const FXRegion& region){ if(!surface){ fxerror("FXDCWindow::setClipRegion: DC not connected to drawable.\n"); } XSetRegion(DISPLAY(getApp()),(GC)ctx,(Region)region.region);///// Should intersect region and rect?? #ifdef HAVE_XFT_H XftDrawSetClip((XftDraw*)xftDraw,(Region)region.region); #endif flags|=GCClipMask; } // Set clip rectangle void FXDCWindow::setClipRectangle(FXint x,FXint y,FXint w,FXint h){ if(!surface){ fxerror("FXDCWindow::setClipRectangle: DC not connected to drawable.\n"); } clip.x=FXMAX(x,rect.x); clip.y=FXMAX(y,rect.y); clip.w=FXMIN(x+w,rect.x+rect.w)-clip.x; clip.h=FXMIN(y+h,rect.y+rect.h)-clip.y; if(clip.w<=0) clip.w=0; if(clip.h<=0) clip.h=0; XSetClipRectangles(DISPLAY(getApp()),(GC)ctx,0,0,(XRectangle*)&clip,1,Unsorted); #ifdef HAVE_XFT_H XftDrawSetClipRectangles((XftDraw*)xftDraw,0,0,(XRectangle*)&clip,1); #endif flags|=GCClipMask; } // Set clip rectangle void FXDCWindow::setClipRectangle(const FXRectangle& rectangle){ if(!surface){ fxerror("FXDCWindow::setClipRectangle: DC not connected to drawable.\n"); } clip.x=FXMAX(rectangle.x,rect.x); clip.y=FXMAX(rectangle.y,rect.y); clip.w=FXMIN(rectangle.x+rectangle.w,rect.x+rect.w)-clip.x; clip.h=FXMIN(rectangle.y+rectangle.h,rect.y+rect.h)-clip.y; if(clip.w<=0) clip.w=0; if(clip.h<=0) clip.h=0; XSetClipRectangles(DISPLAY(getApp()),(GC)ctx,0,0,(XRectangle*)&clip,1,Unsorted); #ifdef HAVE_XFT_H XftDrawSetClipRectangles((XftDraw*)xftDraw,0,0,(XRectangle*)&clip,1); #endif flags|=GCClipMask; } // Clear clip rectangle void FXDCWindow::clearClipRectangle(){ if(!surface){ fxerror("FXDCWindow::clearClipRectangle: DC not connected to drawable.\n"); } clip=rect; XSetClipRectangles(DISPLAY(getApp()),(GC)ctx,0,0,(XRectangle*)&clip,1,Unsorted); #ifdef HAVE_XFT_H XftDrawSetClipRectangles((XftDraw*)xftDraw,0,0,(XRectangle*)&clip,1); #endif flags|=GCClipMask; } // Set clip mask void FXDCWindow::setClipMask(FXBitmap* bitmap,FXint dx,FXint dy){ XGCValues gcv; if(!surface){ fxerror("FXDCWindow::setClipMask: DC not connected to drawable.\n"); } if(!bitmap || !bitmap->id()){ fxerror("FXDCWindow::setClipMask: illegal mask specified.\n"); } gcv.clip_mask=bitmap->id(); gcv.clip_x_origin=dx; gcv.clip_y_origin=dy; XChangeGC(DISPLAY(getApp()),(GC)ctx,GCClipMask|GCClipXOrigin|GCClipYOrigin,&gcv); if(dx) flags|=GCClipXOrigin; if(dy) flags|=GCClipYOrigin; flags|=GCClipMask; mask=bitmap; cx=dx; cy=dy; } // Clear clip mask void FXDCWindow::clearClipMask(){ if(!surface){ fxerror("FXDCWindow::clearClipMask: DC not connected to drawable.\n"); } clip=rect; XSetClipRectangles(DISPLAY(getApp()),(GC)ctx,0,0,(XRectangle*)&clip,1,Unsorted); flags|=GCClipMask; mask=NULL; cx=0; cy=0; } // Set clip child windows void FXDCWindow::clipChildren(FXbool yes){ if(!surface){ fxerror("FXDCWindow::clipChildren: window has not yet been created.\n"); } if(yes){ XSetSubwindowMode(DISPLAY(getApp()),(GC)ctx,ClipByChildren); #ifdef HAVE_XFT_H XftDrawSetSubwindowMode((XftDraw*)xftDraw,ClipByChildren); #endif flags&=~GCSubwindowMode; } else{ XSetSubwindowMode(DISPLAY(getApp()),(GC)ctx,IncludeInferiors); #ifdef HAVE_XFT_H XftDrawSetSubwindowMode((XftDraw*)xftDraw,IncludeInferiors); #endif flags|=GCSubwindowMode; } } /******************************************************************************** * MS-Windows * ********************************************************************************/ #else // This one is not defined in the Cygwin header files #ifndef PS_JOIN_MASK #define PS_JOIN_MASK 0x0000F000 #endif // Construct for expose event painting FXDCWindow::FXDCWindow(FXDrawable* drawable,FXEvent* event):FXDC(drawable->getApp()){ oldpalette=NULL; oldbrush=NULL; oldpen=NULL; needsNewBrush=FALSE; needsNewPen=FALSE; needsPath=FALSE; needsClipReset=FALSE; begin(drawable); rect.x=clip.x=event->rect.x; rect.y=clip.y=event->rect.y; rect.w=clip.w=event->rect.w; rect.h=clip.h=event->rect.h; HRGN hrgn=CreateRectRgn(clip.x,clip.y,clip.x+clip.w,clip.y+clip.h); SelectClipRgn((HDC)ctx,hrgn); DeleteObject(hrgn); } // Construct for normal painting FXDCWindow::FXDCWindow(FXDrawable* drawable):FXDC(drawable->getApp()){ oldpalette=NULL; oldbrush=NULL; oldpen=NULL; needsNewBrush=FALSE; needsNewPen=FALSE; needsPath=FALSE; needsClipReset=FALSE; begin(drawable); } // Destruct FXDCWindow::~FXDCWindow(){ end(); } // Begin locks in a drawable surface void FXDCWindow::begin(FXDrawable *drawable){ if(!drawable){ fxerror("FXDCWindow::begin: NULL drawable.\n"); } if(!drawable->id()){ fxerror("FXDCWindow::begin: drawable not created yet.\n"); } surface=drawable;// Careful:- surface->id() can be HWND or HBITMAP depending on drawable visual=drawable->getVisual(); ctx=drawable->GetDC(); rect.x=clip.x=0; rect.y=clip.y=0; rect.w=clip.w=drawable->getWidth(); rect.h=clip.h=drawable->getHeight(); // Select and realize palette, if necessary if(visual->colormap){ oldpalette=::SelectPalette((HDC)ctx,(HPALETTE)visual->colormap,false); ::RealizePalette((HDC)ctx); } devfg=~0; devbg=0; // Create our default pen (black, solid, one pixel wide) LOGBRUSH lb; lb.lbStyle=BS_SOLID; lb.lbColor=PALETTERGB(0,0,0); lb.lbHatch=0; oldpen=::SelectObject((HDC)ctx,ExtCreatePen(PS_GEOMETRIC|PS_SOLID|PS_ENDCAP_FLAT|PS_JOIN_MITER,1,&lb,0,NULL)); // Create our default brush (solid white, for fills) lb.lbStyle=BS_SOLID; lb.lbColor=PALETTERGB(255,255,255); lb.lbHatch=0; oldbrush=SelectObject((HDC)ctx,CreateBrushIndirect(&lb)); // Text alignment ::SetTextAlign((HDC)ctx,TA_BASELINE|TA_LEFT); // Polygon fill mode ::SetPolyFillMode((HDC)ctx,ALTERNATE); // Reset flags needsNewBrush=FALSE; needsNewPen=FALSE; needsPath=FALSE; needsClipReset=FALSE; } // End unlocks the drawable surface void FXDCWindow::end(){ if(ctx){ ::DeleteObject(::SelectObject((HDC)ctx,oldpen)); ::DeleteObject(::SelectObject((HDC)ctx,oldbrush)); if(visual->colormap){ SelectPalette((HDC)ctx,(HPALETTE)oldpalette,false); } surface->ReleaseDC((HDC)ctx); if(needsClipReset){ DWORD dwFlags=GetWindowLong((HWND)surface->id(),GWL_STYLE); SetWindowLong((HWND)surface->id(),GWL_STYLE,dwFlags|WS_CLIPCHILDREN); } ctx=NULL; } surface=NULL; } // Read back pixel FXColor FXDCWindow::readPixel(FXint x,FXint y){ FXColor color=FXRGBA(0,0,0,0); if(!surface){ fxerror("FXDCWindow::readPixel: DC not connected to drawable.\n"); } if(0<=x && 0<=y && xgetWidth() && ygetHeight()){ COLORREF clr=GetPixel((HDC)ctx,x,y); color=FXRGB(GetRValue(clr),GetGValue(clr),GetBValue(clr)); } return color; } // Draw pixel in current foreground color void FXDCWindow::drawPoint(FXint x,FXint y){ if(!surface){ fxerror("FXDCWindow::drawPoint: DC not connected to drawable.\n"); } ::SetPixel((HDC)ctx,x,y,devfg); } // Draw points void FXDCWindow::drawPoints(const FXPoint* points,FXuint npoints){ register FXuint i; if(!surface){ fxerror("FXDCWindow::drawPoints: DC not connected to drawable.\n"); } for(i=0; iw) ew=w>>1; if(eh+eh>h) eh=h>>1; ::RoundRect((HDC)ctx,x,y,x+w+1,y+h+1,ew,eh); ::SelectObject((HDC)ctx,hbrush); } // Draw arc; angles in degrees*64, ang2 relative to ang1 // If angle is negative flip the start and end; also, if ang2 is zero, // don't draw anything at all (patch: Sander Jansen ). void FXDCWindow::drawArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2){ register FXbool reversed=(ang2<0); if(!surface){ fxerror("FXDCWindow::drawArc: DC not connected to drawable.\n"); } if(ang2==0) return; if(needsNewPen) updatePen(); ang2+=ang1; w+=1; h+=1; int xStart=int(x+0.5*w+w*cos(ang1*PI/(180.0*64.0))); int yStart=int(y+0.5*h-h*sin(ang1*PI/(180.0*64.0))); int xEnd=int(x+0.5*w+w*cos(ang2*PI/(180.0*64.0))); int yEnd=int(y+0.5*h-h*sin(ang2*PI/(180.0*64.0))); if(needsPath){ ::BeginPath((HDC)ctx); } if(reversed) ::Arc((HDC)ctx,x,y,x+w,y+h,xEnd,yEnd,xStart,yStart); else ::Arc((HDC)ctx,x,y,x+w,y+h,xStart,yStart,xEnd,yEnd); if(needsPath){ ::EndPath((HDC)ctx); ::StrokePath((HDC)ctx); } } // Draw arcs void FXDCWindow::drawArcs(const FXArc* arcs,FXuint narcs){ register FXuint i; if(!surface){ fxerror("FXDCWindow::drawArcs: DC not connected to drawable.\n"); } for(i=0; i>1),y+(h>>1),x+(w>>1),y+(h>>1)); if(needsPath){ ::EndPath((HDC)ctx); ::StrokePath((HDC)ctx); } } // Fill using currently selected ROP code void FXDCWindow::fillRectangle(FXint x,FXint y,FXint w,FXint h){ if(!surface){ fxerror("FXDCWindow::fillRectangle: DC not connected to drawable.\n"); } if(needsNewBrush) updateBrush(); HPEN hpen=(HPEN)::SelectObject((HDC)ctx,GetStockObject(NULL_PEN)); ::Rectangle((HDC)ctx,x,y,x+w+1,y+h+1); ::SelectObject((HDC)ctx,hpen); } // Fill using currently selected ROP code void FXDCWindow::fillRectangles(const FXRectangle* rectangles,FXuint nrectangles){ register FXuint i; if(!surface){ fxerror("FXDCWindow::fillRectangles: DC not connected to drawable.\n"); } if(needsNewBrush) updateBrush(); HPEN hpen=(HPEN)::SelectObject((HDC)ctx,GetStockObject(NULL_PEN)); for(i=0; iw) ew=w>>1; if(eh+eh>h) eh=h>>1; ::RoundRect((HDC)ctx,x,y,x+w+1,y+h+1,ew,eh); ::SelectObject((HDC)ctx,hpen); } // Fill chord void FXDCWindow::fillChord(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2){ register FXbool reversed=(ang2<0); if(!surface){ fxerror("FXDCWindow::fillChord: DC not connected to drawable.\n"); } if(ang2==0) return; if(needsNewBrush) updateBrush(); ang2+=ang1; w+=1; h+=1; int xStart=int(x+0.5*w+w*cos(ang1*PI/(180.0*64.0))); int yStart=int(y+0.5*h-h*sin(ang1*PI/(180.0*64.0))); int xEnd=int(x+0.5*w+w*cos(ang2*PI/(180.0*64.0))); int yEnd=int(y+0.5*h-h*sin(ang2*PI/(180.0*64.0))); HPEN hpen=(HPEN)::SelectObject((HDC)ctx,GetStockObject(NULL_PEN)); if(reversed) ::Chord((HDC)ctx,x,y,x+w,y+h,xEnd,yEnd,xStart,yStart); else ::Chord((HDC)ctx,x,y,x+w,y+h,xStart,yStart,xEnd,yEnd); ::SelectObject((HDC)ctx,hpen); } // Fill chords void FXDCWindow::fillChords(const FXArc* chords,FXuint nchords){ register FXuint i; if(!surface){ fxerror("FXDCWindow::fillChords: DC not connected to drawable.\n"); } for(i=0; i). void FXDCWindow::fillArc(FXint x,FXint y,FXint w,FXint h,FXint ang1,FXint ang2){ register FXbool reversed=(ang2<0); if(!surface){ fxerror("FXDCWindow::fillArc: DC not connected to drawable.\n"); } if(ang2==0) return; if(needsNewBrush) updateBrush(); ang2+=ang1; w+=1; h+=1; int xStart=int(x+0.5*w+w*cos(ang1*PI/(180.0*64.0))); int yStart=int(y+0.5*h-h*sin(ang1*PI/(180.0*64.0))); int xEnd=int(x+0.5*w+w*cos(ang2*PI/(180.0*64.0))); int yEnd=int(y+0.5*h-h*sin(ang2*PI/(180.0*64.0))); HPEN hpen=(HPEN)::SelectObject((HDC)ctx,GetStockObject(NULL_PEN)); if(reversed) ::Pie((HDC)ctx,x,y,x+w,y+h,xEnd,yEnd,xStart,yStart); else ::Pie((HDC)ctx,x,y,x+w,y+h,xStart,yStart,xEnd,yEnd); ::SelectObject((HDC)ctx,hpen); } //Ellipse((HDC)ctx,x,y,x+w,y+h); // Fill arcs void FXDCWindow::fillArcs(const FXArc* arcs,FXuint narcs){ register FXuint i; if(!surface){ fxerror("FXDCWindow::fillArcs: DC not connected to drawable.\n"); } for(i=0; i>1),y+(h>>1),x+(w>>1),y+(h>>1)); ::SelectObject((HDC)ctx,hpen); } // Filled simple polygon void FXDCWindow::fillPolygon(const FXPoint* points,FXuint npoints){ register FXuint i; POINT pts[1360]; // Worst case limit according to MSDN if(!surface){ fxerror("FXDCWindow::fillPolygon: DC not connected to drawable.\n"); } if(npoints>=1360){ fxerror("FXDCWindow::fillPolygon: too many points.\n"); } if(needsNewBrush) updateBrush(); HPEN hpen=(HPEN)::SelectObject((HDC)ctx,GetStockObject(NULL_PEN)); for(i=0; i=1360){ fxerror("FXDCWindow::fillConcavePolygon: too many points.\n"); } if(needsNewBrush) updateBrush(); HPEN hpen=(HPEN)::SelectObject((HDC)ctx,GetStockObject(NULL_PEN)); for(i=0; i=1360){ fxerror("FXDCWindow::fillComplexPolygon: too many points.\n"); } if(needsNewBrush) updateBrush(); HPEN hpen=(HPEN)::SelectObject((HDC)ctx,GetStockObject(NULL_PEN)); for(i=0; i=1360){ fxerror("FXDCWindow::fillPolygonRel: too many points.\n"); } if(needsNewBrush) updateBrush(); HPEN hpen=(HPEN)::SelectObject((HDC)ctx,GetStockObject(NULL_PEN)); for(i=0; i=1360){ fxerror("FXDCWindow::fillConcavePolygonRel: too many points.\n"); } if(needsNewBrush) updateBrush(); HPEN hpen=(HPEN)::SelectObject((HDC)ctx,GetStockObject(NULL_PEN)); for(i=0; i=1360){ fxerror("FXDCWindow::fillComplexPolygonRel: too many points.\n"); } if(needsNewBrush) updateBrush(); HPEN hpen=(HPEN)::SelectObject((HDC)ctx,GetStockObject(NULL_PEN)); for(i=0; iid()){ fxerror("FXDCWindow::setFont: illegal or NULL font specified.\n"); } ::SelectObject((HDC)ctx,fnt->id()); font=fnt; } // Draw string with base line starting at x, y void FXDCWindow::drawText(FXint x,FXint y,const FXchar* string,FXuint length){ if(!surface){ fxerror("FXDCWindow::drawText: DC not connected to drawable.\n"); } if(!font){ fxerror("FXDCWindow::drawText: no font selected.\n"); } FXnchar sbuffer[4096]; FXint count=utf2ncs(sbuffer,string,FXMIN(length,4096)); FXASSERT(count<=length); FXint bkmode=::SetBkMode((HDC)ctx,TRANSPARENT); ::TextOutW((HDC)ctx,x,y,sbuffer,count); ::SetBkMode((HDC)ctx,bkmode); } // Draw text starting at x, y over filled background void FXDCWindow::drawImageText(FXint x,FXint y,const FXchar* string,FXuint length){ if(!surface){ fxerror("FXDCWindow::drawImageText: DC not connected to drawable.\n"); } if(!font){ fxerror("FXDCWindow::drawImageText: no font selected.\n"); } FXnchar sbuffer[4096]; FXint count=utf2ncs(sbuffer,string,FXMIN(length,4096)); FXASSERT(count<=length); FXint bkmode=::SetBkMode((HDC)ctx,OPAQUE); ::TextOutW((HDC)ctx,x,y,sbuffer,count); // RECT r; // r.left=clip.x; r.top=clip.y; r.right=clip.x+clip.w; r.bottom=clip.y+clip.h; // ExtTextOutW((HDC)ctx,x,y,ETO_OPAQUE|ETO_CLIPPED,&r,sbuffer,count,NULL); ::SetBkMode((HDC)ctx,bkmode); } // Draw string with base line starting at x, y void FXDCWindow::drawText(FXint x,FXint y,const FXString& string){ drawText(x,y,string.text(),string.length()); } // Draw text starting at x, y over filled background void FXDCWindow::drawImageText(FXint x,FXint y,const FXString& string){ drawImageText(x,y,string.text(),string.length()); } // Draw area from source // Some of these ROP codes do not have names; the full list can be found in the MSDN docs // at Platform SDK/Reference/Appendixes/Win32 Appendixes/Raster Operation Codes/Ternary Raster Operations void FXDCWindow::drawArea(const FXDrawable* source,FXint sx,FXint sy,FXint sw,FXint sh,FXint dx,FXint dy){ if(!surface){ fxerror("FXDCWindow::drawArea: DC not connected to drawable.\n"); } if(!source || !source->id()){ fxerror("FXDCWindow::drawArea: illegal source specified.\n"); } HDC shdc=(HDC)source->GetDC(); switch(rop){ case BLT_CLR: // D := 0 ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,BLACKNESS); break; case BLT_SRC_AND_DST: // D := S & D ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,SRCAND); break; case BLT_SRC_AND_NOT_DST: // D := S & ~D ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,SRCERASE); break; case BLT_SRC: // D := S ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,SRCCOPY); break; case BLT_NOT_SRC_AND_DST: // D := ~S & D ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,0x220326); break; case BLT_DST: // D := D break; case BLT_SRC_XOR_DST: // D := S ^ D ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,SRCINVERT); break; case BLT_SRC_OR_DST: // D := S | D ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,SRCPAINT); break; case BLT_NOT_SRC_AND_NOT_DST: // D := ~S & ~D == D := ~(S | D) ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,NOTSRCERASE); break; case BLT_NOT_SRC_XOR_DST: // D := ~S ^ D ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,0x990066); // Not sure about this one break; case BLT_NOT_DST: // D := ~D ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,DSTINVERT); break; case BLT_SRC_OR_NOT_DST: // D := S | ~D ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,0xDD0228); break; case BLT_NOT_SRC: // D := ~S ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,NOTSRCCOPY); break; case BLT_NOT_SRC_OR_DST: // D := ~S | D ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,MERGEPAINT); break; case BLT_NOT_SRC_OR_NOT_DST: // D := ~S | ~D == ~(S & D) ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,0x7700E6); break; case BLT_SET: // D := 1 ::BitBlt((HDC)ctx,dx,dy,sw,sh,shdc,sx,sy,WHITENESS); break; } source->ReleaseDC(shdc); } // Draw area stretched area from source void FXDCWindow::drawArea(const FXDrawable* source,FXint sx,FXint sy,FXint sw,FXint sh,FXint dx,FXint dy,FXint dw,FXint dh){ if(!surface){ fxerror("FXDCWindow::drawArea: DC not connected to drawable.\n"); } if(!source || !source->id()){ fxerror("FXDCWindow::drawArea: illegal source specified.\n"); } HDC shdc=(HDC)source->GetDC(); switch(rop){ case BLT_CLR: // D := 0 ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,BLACKNESS); break; case BLT_SRC_AND_DST: // D := S & D ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,SRCAND); break; case BLT_SRC_AND_NOT_DST: // D := S & ~D ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,SRCERASE); break; case BLT_SRC: // D := S ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,SRCCOPY); break; case BLT_NOT_SRC_AND_DST: // D := ~S & D ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,0x220326); break; case BLT_DST: // D := D break; case BLT_SRC_XOR_DST: // D := S ^ D ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,SRCINVERT); break; case BLT_SRC_OR_DST: // D := S | D ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,SRCPAINT); break; case BLT_NOT_SRC_AND_NOT_DST: // D := ~S & ~D == D := ~(S | D) ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,NOTSRCERASE); break; case BLT_NOT_SRC_XOR_DST: // D := ~S ^ D ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,0x990066); // Not sure about this one break; case BLT_NOT_DST: // D := ~D ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,DSTINVERT); break; case BLT_SRC_OR_NOT_DST: // D := S | ~D ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,0xDD0228); break; case BLT_NOT_SRC: // D := ~S ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,NOTSRCCOPY); break; case BLT_NOT_SRC_OR_DST: // D := ~S | D ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,MERGEPAINT); break; case BLT_NOT_SRC_OR_NOT_DST: // D := ~S | ~D == ~(S & D) ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,0x7700E6); break; case BLT_SET: // D := 1 ::StretchBlt((HDC)ctx,dx,dy,dw,dh,shdc,sx,sy,sw,sh,WHITENESS); break; } source->ReleaseDC(shdc); } // Draw image void FXDCWindow::drawImage(const FXImage* image,FXint dx,FXint dy){ if(!surface){ fxerror("FXDCWindow::drawImage: DC not connected to drawable.\n"); } if(!image || !image->id()){ fxerror("FXDCWindow::drawImage: illegal image specified.\n"); } HDC dcMem=(HDC)image->GetDC(); switch(rop){ case BLT_CLR: // D := 0 ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,BLACKNESS); break; case BLT_SRC_AND_DST: // D := S & D ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,SRCAND); break; case BLT_SRC_AND_NOT_DST: // D := S & ~D ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,SRCERASE); break; case BLT_SRC: // D := S ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,SRCCOPY); break; case BLT_NOT_SRC_AND_DST: // D := ~S & D ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,0x220326); break; case BLT_DST: // D := D break; case BLT_SRC_XOR_DST: // D := S ^ D ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,SRCINVERT); break; case BLT_SRC_OR_DST: // D := S | D ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,SRCPAINT); break; case BLT_NOT_SRC_AND_NOT_DST: // D := ~S & ~D == D := ~(S | D) ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,NOTSRCERASE); break; case BLT_NOT_SRC_XOR_DST: // D := ~S ^ D ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,0x990066); // Not sure about this one break; case BLT_NOT_DST: // D := ~D ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,DSTINVERT); break; case BLT_SRC_OR_NOT_DST: // D := S | ~D ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,0xDD0228); break; case BLT_NOT_SRC: // D := ~S ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,NOTSRCCOPY); break; case BLT_NOT_SRC_OR_DST: // D := ~S | D ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,MERGEPAINT); break; case BLT_NOT_SRC_OR_NOT_DST: // D := ~S | ~D == ~(S & D) ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,0x7700E6); break; case BLT_SET: // D := 1 ::BitBlt((HDC)ctx,dx,dy,image->width,image->height,dcMem,0,0,WHITENESS); break; } image->ReleaseDC(dcMem); } // Draw bitmap void FXDCWindow::drawBitmap(const FXBitmap* bitmap,FXint dx,FXint dy) { if(!surface) fxerror("FXDCWindow::drawBitmap: DC not connected to drawable.\n"); if(!bitmap || !bitmap->id()) fxerror("FXDCWindow::drawBitmap: illegal bitmap specified.\n"); HDC dcMem=(HDC)bitmap->GetDC(); switch(rop){ case BLT_CLR: // D := 0 ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,BLACKNESS); break; case BLT_SRC_AND_DST: // D := S & D ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,SRCAND); break; case BLT_SRC_AND_NOT_DST: // D := S & ~D ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,SRCERASE); break; case BLT_SRC: // D := S ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,SRCCOPY); break; case BLT_NOT_SRC_AND_DST: // D := ~S & D ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,0x220326); break; case BLT_DST: // D := D break; case BLT_SRC_XOR_DST: // D := S ^ D ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,SRCINVERT); break; case BLT_SRC_OR_DST: // D := S | D ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,SRCPAINT); break; case BLT_NOT_SRC_AND_NOT_DST: // D := ~S & ~D == D := ~(S | D) ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,NOTSRCERASE); break; case BLT_NOT_SRC_XOR_DST: // D := ~S ^ D ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,0x990066); // Not sure about this one break; case BLT_NOT_DST: // D := ~D ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,DSTINVERT); break; case BLT_SRC_OR_NOT_DST: // D := S | ~D ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,0xDD0228); break; case BLT_NOT_SRC: // D := ~S ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,NOTSRCCOPY); break; case BLT_NOT_SRC_OR_DST: // D := ~S | D ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,MERGEPAINT); break; case BLT_NOT_SRC_OR_NOT_DST: // D := ~S | ~D == ~(S & D) ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,0x7700E6); break; case BLT_SET: // D := 1 ::BitBlt((HDC)ctx,dx,dy,bitmap->width,bitmap->height,dcMem,0,0,WHITENESS); break; } bitmap->ReleaseDC(dcMem); } // Draw icon void FXDCWindow::drawIcon(const FXIcon* icon,FXint dx,FXint dy){ if(!surface){ fxerror("FXDCWindow::drawIcon: DC not connected to drawable.\n"); } if(!icon || !icon->id() || !icon->shape){ fxerror("FXDCWindow::drawIcon: illegal icon specified.\n"); } HDC hdcsrc=(HDC)icon->GetDC(); if(icon->getOptions()&IMAGE_OPAQUE){ ::BitBlt((HDC)ctx,dx,dy,icon->getWidth(),icon->getHeight(),hdcsrc,0,0,SRCCOPY); } else{ HDC hdcmsk=::CreateCompatibleDC((HDC)ctx); HBITMAP holdbmp=(HBITMAP)::SelectObject(hdcmsk,(HBITMAP)icon->shape); COLORREF coldback=::SetBkColor((HDC)ctx,RGB(255,255,255)); COLORREF coldtext=::SetTextColor((HDC)ctx,RGB(0,0,0)); ::BitBlt((HDC)ctx,dx,dy,icon->getWidth(),icon->getHeight(),hdcmsk,0,0,SRCAND); ::BitBlt((HDC)ctx,dx,dy,icon->getWidth(),icon->getHeight(),hdcsrc,0,0,SRCPAINT); ::SelectObject(hdcmsk,holdbmp); ::DeleteDC(hdcmsk); ::SetBkColor((HDC)ctx,coldback); ::SetTextColor((HDC)ctx,coldtext); } icon->ReleaseDC(hdcsrc); } // This may be done faster, I suspect; but I'm tired of looking at this now; // at least it's correct as it stands.. void FXDCWindow::drawIconShaded(const FXIcon* icon,FXint dx,FXint dy){ if(!surface){ fxerror("FXDCWindow::drawIconShaded: DC not connected to drawable.\n"); } if(!icon || !icon->id() || !icon->shape){ fxerror("FXDCWindow::drawIconShaded: illegal icon specified.\n"); } FXColor selbackColor=getApp()->getSelbackColor(); HDC hdcsrc=(HDC)icon->GetDC(); HDC hdcmsk=::CreateCompatibleDC((HDC)ctx); // Set shape mask HBITMAP holdbmp=(HBITMAP)::SelectObject(hdcmsk,(HBITMAP)icon->shape); // Set colors COLORREF coldback=::SetBkColor((HDC)ctx,RGB(255,255,255)); COLORREF coldtext=::SetTextColor((HDC)ctx,RGB(0,0,0)); // Paint icon ::BitBlt((HDC)ctx,dx,dy,icon->getWidth(),icon->getHeight(),hdcmsk,0,0,SRCAND); ::BitBlt((HDC)ctx,dx,dy,icon->getWidth(),icon->getHeight(),hdcsrc,0,0,SRCPAINT); // Select brush HBRUSH hbrush=::CreatePatternBrush((HBITMAP)getApp()->stipples[STIPPLE_GRAY]); HBRUSH holdbrush=(HBRUSH)::SelectObject((HDC)ctx,hbrush); ::SetBrushOrgEx((HDC)ctx,dx,dy,NULL); // Make black where pattern is 0 and shape is 0 [DPSoa] ::BitBlt((HDC)ctx,dx,dy,icon->getWidth(),icon->getHeight(),hdcmsk,0,0,0x00A803A9); // Set colors ::SetTextColor((HDC)ctx,RGB(FXREDVAL(selbackColor),FXGREENVAL(selbackColor),FXBLUEVAL(selbackColor))); ::SetBkColor((HDC)ctx,RGB(0,0,0)); // Make selbackcolor where pattern is 0 and shape is 0 [DPSoo] ::BitBlt((HDC)ctx,dx,dy,icon->getWidth(),icon->getHeight(),hdcmsk,0,0,0x00FE02A9); // Resetore ctx ::SelectObject(hdcmsk,holdbmp); ::DeleteDC(hdcmsk); ::SelectObject((HDC)ctx,holdbrush); ::DeleteObject(hbrush); ::SetBkColor((HDC)ctx,coldback); ::SetTextColor((HDC)ctx,coldtext); ::SetBrushOrgEx((HDC)ctx,tx,ty,NULL); icon->ReleaseDC(hdcsrc); } // Draw a sunken or etched-in icon. void FXDCWindow::drawIconSunken(const FXIcon* icon,FXint dx,FXint dy){ if(!surface){ fxerror("FXDCWindow::drawIconSunken: DC not connected to drawable.\n"); } if(!icon || !icon->id() || !icon->shape){ fxerror("FXDCWindow::drawIconSunken: illegal icon specified.\n"); } FXColor shadowColor=getApp()->getShadowColor(); FXColor hiliteColor=getApp()->getHiliteColor(); HDC hdcsrc=(HDC)icon->GetDC(); HDC hdcmono=::CreateCompatibleDC((HDC)ctx); // Set etch mask HBITMAP holdbmp=(HBITMAP)::SelectObject(hdcmono,(HBITMAP)icon->etch); // Set colors COLORREF coldback=::SetBkColor((HDC)ctx,RGB(255,255,255)); COLORREF coldtext=::SetTextColor((HDC)ctx,RGB(0,0,0)); // While brush colors apply to the pattern HBRUSH hbrhilite=::CreateSolidBrush(RGB(FXREDVAL(hiliteColor),FXGREENVAL(hiliteColor),FXBLUEVAL(hiliteColor))); HBRUSH holdbrush=(HBRUSH)::SelectObject((HDC)ctx,hbrhilite); // BitBlt the black bits in the monochrome bitmap into highlight colors // in the destination DC (offset a bit). This BitBlt(), and the next one, // use an unnamed raster op (0xB8074a) whose effect is D := ((D ^ P) & S) ^ P. // Or at least I think it is ;) The code = PSDPxax, so that's correct JVZ ::BitBlt((HDC)ctx,dx+1,dy+1,icon->getWidth(),icon->getHeight(),hdcmono,0,0,0xB8074A); HBRUSH hbrshadow=::CreateSolidBrush(RGB(FXREDVAL(shadowColor),FXGREENVAL(shadowColor),FXBLUEVAL(shadowColor))); ::SelectObject((HDC)ctx,hbrshadow); // Now BitBlt the black bits in the monochrome bitmap into the // shadow color on the destination DC. ::BitBlt((HDC)ctx,dx,dy,icon->getWidth(),icon->getHeight(),hdcmono,0,0,0xB8074A); // Resetore ctx ::SelectObject(hdcmono,holdbmp); ::DeleteDC(hdcmono); ::SelectObject((HDC)ctx,holdbrush); ::DeleteObject(hbrhilite); ::DeleteObject(hbrshadow); ::SetBkColor((HDC)ctx,coldback); ::SetTextColor((HDC)ctx,coldtext); icon->ReleaseDC(hdcsrc); } // Draw hash box void FXDCWindow::drawHashBox(FXint x,FXint y,FXint w,FXint h,FXint b){ if(!surface){ fxerror("FXDCWindow::drawHashBox: DC not connected to drawable.\n"); } HBRUSH hbrush=::CreatePatternBrush((HBITMAP)getApp()->stipples[STIPPLE_GRAY]); HBRUSH holdbrush=(HBRUSH)::SelectObject((HDC)ctx,hbrush); COLORREF coldback=::SetBkColor((HDC)ctx,RGB(255,255,255)); COLORREF coldtext=::SetTextColor((HDC)ctx,RGB(0,0,0)); ::PatBlt((HDC)ctx,x,y,w-b,b,PATINVERT); ::PatBlt((HDC)ctx,x+w-b,y,b,h-b,PATINVERT); ::PatBlt((HDC)ctx,x+b,y+h-b,w-b,b,PATINVERT); ::PatBlt((HDC)ctx,x,y+b,b,h-b,PATINVERT); ::SelectObject((HDC)ctx,holdbrush); ::DeleteObject(hbrush); ::SetBkColor((HDC)ctx,coldback); ::SetTextColor((HDC)ctx,coldtext); } // Draw focus rectangle void FXDCWindow::drawFocusRectangle(FXint x,FXint y,FXint w,FXint h){ if(!surface){ fxerror("FXDCWindow::drawFocusRectangle: DC not connected to drawable.\n"); } HBRUSH hbrush=::CreatePatternBrush((HBITMAP)getApp()->stipples[STIPPLE_GRAY]); HBRUSH holdbrush=(HBRUSH)::SelectObject((HDC)ctx,hbrush); COLORREF coldback=::SetBkColor((HDC)ctx,RGB(255,255,255)); COLORREF coldtext=::SetTextColor((HDC)ctx,RGB(0,0,0)); ::SetBrushOrgEx((HDC)ctx,x,y,NULL); ::PatBlt((HDC)ctx,x,y,w-1,1,PATINVERT); ::PatBlt((HDC)ctx,x+w-1,y,1,h-1,PATINVERT); ::PatBlt((HDC)ctx,x+1,y+h-1,w-1,1,PATINVERT); ::PatBlt((HDC)ctx,x,y+1,1,h-1,PATINVERT); ::SelectObject((HDC)ctx,holdbrush); ::DeleteObject(hbrush); ::SetBkColor((HDC)ctx,coldback); ::SetTextColor((HDC)ctx,coldtext); ::SetBrushOrgEx((HDC)ctx,tx,ty,NULL); } static DWORD FXStipplePattern2Hatch(FXStipplePattern pat){ switch(pat){ case STIPPLE_HORZ: return HS_HORIZONTAL; case STIPPLE_VERT: return HS_VERTICAL; case STIPPLE_CROSS: return HS_CROSS; case STIPPLE_DIAG: return HS_BDIAGONAL; case STIPPLE_REVDIAG: return HS_FDIAGONAL; case STIPPLE_CROSSDIAG: return HS_DIAGCROSS; default: return HS_CROSS; } } void FXDCWindow::updatePen(){ DWORD dashes[32]; DWORD penstyle,i; LOGBRUSH lb; // Setup brush of this pen switch(fill){ case FILL_SOLID: lb.lbStyle=BS_SOLID; lb.lbColor=devfg; lb.lbHatch=0; break; case FILL_TILED: lb.lbStyle=BS_SOLID; lb.lbColor=devfg; lb.lbHatch=0; break; case FILL_STIPPLED: if(stipple){ lb.lbStyle=BS_PATTERN; lb.lbColor=devfg; lb.lbHatch=(FXuval)stipple->id(); // This should be a HBITMAP } else if(pattern>=STIPPLE_0 && pattern<=STIPPLE_16){ lb.lbStyle=BS_PATTERN; lb.lbColor=devfg; lb.lbHatch=(FXuval)getApp()->stipples[pattern]; } else{ lb.lbStyle=BS_HATCHED; lb.lbColor=devfg; lb.lbHatch=FXStipplePattern2Hatch(pattern); } break; case FILL_OPAQUESTIPPLED: if(stipple){ lb.lbStyle=BS_PATTERN; lb.lbColor=devfg; lb.lbHatch=(FXuval)stipple->id(); // This should be a HBITMAP } else if(pattern>=STIPPLE_0 && pattern<=STIPPLE_16){ lb.lbStyle=BS_PATTERN; lb.lbColor=devfg; lb.lbHatch=(FXuval)getApp()->stipples[pattern]; } else{ lb.lbStyle=BS_HATCHED; lb.lbColor=devfg; lb.lbHatch=FXStipplePattern2Hatch(pattern); } break; } penstyle=0; // Cap style if(cap==CAP_ROUND) penstyle|=PS_JOIN_ROUND; else if(cap==CAP_PROJECTING) penstyle|=PS_ENDCAP_SQUARE; else penstyle|=PS_ENDCAP_FLAT; // Join style if(join==JOIN_MITER) penstyle|=PS_JOIN_MITER; else if(join==JOIN_ROUND) penstyle|=PS_JOIN_ROUND; else penstyle|=PS_JOIN_BEVEL; // Kind of pen //if(width<=1 && fill==FILL_SOLID) // penstyle|=PS_COSMETIC; //else penstyle|=PS_GEOMETRIC; // Line style if(style==LINE_SOLID){ penstyle|=PS_SOLID; ::DeleteObject(::SelectObject((HDC)ctx,::ExtCreatePen(penstyle,width,&lb,0,NULL))); } else if(dashoff==0 && dashlen==2 && dashpat[0]==1 && dashpat[1]==1){ penstyle|=PS_DOT; ::DeleteObject(::SelectObject((HDC)ctx,::ExtCreatePen(penstyle,width,&lb,0,NULL))); } else if(dashoff==0 && dashlen==2 && dashpat[0]==3 && dashpat[1]==1){ penstyle|=PS_DASH; ::DeleteObject(::SelectObject((HDC)ctx,::ExtCreatePen(penstyle,width,&lb,0,NULL))); } else if(dashoff==0 && dashlen==4 && dashpat[0]==3 && dashpat[1]==1 && dashpat[2]==1 && dashpat[3]==1){ penstyle|=PS_DASHDOT; ::DeleteObject(::SelectObject((HDC)ctx,::ExtCreatePen(penstyle,width,&lb,0,NULL))); } else if(dashoff==0 && dashlen==6 && dashpat[0]==3 && dashpat[1]==1 && dashpat[2]==1 && dashpat[3]==1 && dashpat[4]==1 && dashpat[5]==1){ penstyle|=PS_DASHDOTDOT; ::DeleteObject(::SelectObject((HDC)ctx,::ExtCreatePen(penstyle,width,&lb,0,NULL))); } else{ penstyle|=PS_USERSTYLE; for(i=0; i1); needsNewPen=FALSE; } void FXDCWindow::updateBrush(){ LOGBRUSH lb; switch(fill){ case FILL_SOLID: lb.lbStyle=BS_SOLID; lb.lbColor=devfg; lb.lbHatch=0; ::DeleteObject(::SelectObject((HDC)ctx,::CreateBrushIndirect(&lb))); break; case FILL_TILED: if(tile){ ::DeleteObject(::SelectObject((HDC)ctx,::CreatePatternBrush((HBITMAP)tile->id()))); } else{ lb.lbStyle=BS_SOLID; lb.lbColor=devfg; lb.lbHatch=0; ::DeleteObject(::SelectObject((HDC)ctx,::CreateBrushIndirect(&lb))); } break; case FILL_STIPPLED: if(stipple){ lb.lbStyle=BS_PATTERN; lb.lbColor=devfg; lb.lbHatch=(FXuval)stipple->id(); // This should be a HBITMAP } else if(pattern>=STIPPLE_0 && pattern<=STIPPLE_16){ lb.lbStyle=BS_PATTERN; lb.lbColor=devfg; lb.lbHatch=(FXuval)getApp()->stipples[pattern]; } else{ lb.lbStyle=BS_HATCHED; lb.lbColor=devfg; lb.lbHatch=FXStipplePattern2Hatch(pattern); } ::DeleteObject(::SelectObject((HDC)ctx,::CreateBrushIndirect(&lb))); break; case FILL_OPAQUESTIPPLED: if(stipple){ lb.lbStyle=BS_PATTERN; lb.lbColor=devfg; lb.lbHatch=(FXuval)stipple->id(); // This should be a HBITMAP } else if(pattern>=STIPPLE_0 && pattern<=STIPPLE_16){ lb.lbStyle=BS_PATTERN; lb.lbColor=devfg; lb.lbHatch=(FXuval)getApp()->stipples[pattern]; } else{ lb.lbStyle=BS_HATCHED; lb.lbColor=devfg; lb.lbHatch=FXStipplePattern2Hatch(pattern); } ::DeleteObject(::SelectObject((HDC)ctx,::CreateBrushIndirect(&lb))); break; } if(fill==FILL_STIPPLED){ ::SetBkMode((HDC)ctx,TRANSPARENT); // Alas, only works for BS_HATCHED... } else{ ::SetBkMode((HDC)ctx,OPAQUE); } if(fill!=FILL_SOLID){ ::SetBrushOrgEx((HDC)ctx,tx,ty,NULL); } needsNewBrush=FALSE; } // Set foreground color void FXDCWindow::setForeground(FXColor clr){ if(!surface){ fxerror("FXDCWindow::setForeground: DC not connected to drawable.\n"); } devfg=visual->getPixel(clr); needsNewPen=TRUE; needsNewBrush=TRUE; ::SetTextColor((HDC)ctx,devfg); fg=clr; } // Set background color void FXDCWindow::setBackground(FXColor clr){ if(!surface){ fxerror("FXDCWindow::setBackground: DC not connected to drawable.\n"); } devbg=visual->getPixel(clr); ::SetBkColor((HDC)ctx,devbg); bg=clr; } // Set dash pattern (for the LINE_ONOFF_DASH line style) void FXDCWindow::setDashes(FXuint dashoffset,const FXchar *dashpattern,FXuint dashlength){ register FXuint len,i; if(!surface){ fxerror("FXDCWindow::setDashes: DC not connected to drawable.\n"); } for(i=len=0; i // The new clip rectangle should be the intersect of the region // boundary rectangle and the paint rectangle. // Another patch from Ivan Markov to delete // the region which must be disposed off explicitly. void FXDCWindow::setClipRegion(const FXRegion& region){ if(!surface){ fxerror("FXDCWindow::setClipRegion: DC not connected to drawable.\n"); } FXRectangle rectangle=region.bounds(); clip.x=FXMAX(rectangle.x,rect.x); clip.y=FXMAX(rectangle.y,rect.y); clip.w=FXMIN(rectangle.x+rectangle.w,rect.x+rect.w)-clip.x; clip.h=FXMIN(rectangle.y+rectangle.h,rect.y+rect.h)-clip.y; if(clip.w<=0) clip.w=0; if(clip.h<=0) clip.h=0; HRGN hrgn=::CreateRectRgn(clip.x,clip.y,clip.x+clip.w,clip.y+clip.h); ::CombineRgn(hrgn,hrgn,(HRGN)region.region,RGN_AND); ::SelectClipRgn((HDC)ctx,hrgn); ::DeleteObject(hrgn); } // Set clip rectangle void FXDCWindow::setClipRectangle(FXint x,FXint y,FXint w,FXint h){ if(!surface){ fxerror("FXDCWindow::setClipRectangle: DC not connected to drawable.\n"); } clip.x=FXMAX(x,rect.x); clip.y=FXMAX(y,rect.y); clip.w=FXMIN(x+w,rect.x+rect.w)-clip.x; clip.h=FXMIN(y+h,rect.y+rect.h)-clip.y; if(clip.w<=0) clip.w=0; if(clip.h<=0) clip.h=0; HRGN hrgn=::CreateRectRgn(clip.x,clip.y,clip.x+clip.w,clip.y+clip.h); ::SelectClipRgn((HDC)ctx,hrgn); ::DeleteObject(hrgn); } // Set clip rectangle void FXDCWindow::setClipRectangle(const FXRectangle& rectangle){ if(!surface){ fxerror("FXDCWindow::setClipRectangle: DC not connected to drawable.\n"); } clip.x=FXMAX(rectangle.x,rect.x); clip.y=FXMAX(rectangle.y,rect.y); clip.w=FXMIN(rectangle.x+rectangle.w,rect.x+rect.w)-clip.x; clip.h=FXMIN(rectangle.y+rectangle.h,rect.y+rect.h)-clip.y; if(clip.w<=0) clip.w=0; if(clip.h<=0) clip.h=0; HRGN hrgn=::CreateRectRgn(clip.x,clip.y,clip.x+clip.w,clip.y+clip.h); ::SelectClipRgn((HDC)ctx,hrgn); ::DeleteObject(hrgn); } // Clear clip rectangle void FXDCWindow::clearClipRectangle(){ if(!surface){ fxerror("FXDCWindow::clearClipRectangle: DC not connected to drawable.\n"); } clip=rect; HRGN hrgn=::CreateRectRgn(clip.x,clip.y,clip.x+clip.w,clip.y+clip.h); ::SelectClipRgn((HDC)ctx,hrgn); ::DeleteObject(hrgn); } // Set clip mask void FXDCWindow::setClipMask(FXBitmap* bitmap,FXint dx,FXint dy){ if(!surface){ fxerror("FXDCWindow::setClipMask: DC not connected to drawable.\n"); } FXASSERT(FALSE); mask=bitmap; cx=dx; cy=dy; } // Clear clip mask void FXDCWindow::clearClipMask(){ if(!surface){ fxerror("FXDCWindow::clearClipMask: DC not connected to drawable.\n"); } FXASSERT(FALSE); mask=NULL; cx=0; cy=0; } // Window will clip against child windows void FXDCWindow::clipChildren(FXbool yes){ if(!surface){ fxerror("FXDCWindow::clipChildren: window has not yet been created.\n"); } DWORD dwFlags=::GetWindowLong((HWND)surface->id(),GWL_STYLE); HPEN hPen; HBRUSH hBrush; HFONT hFont; COLORREF textcolor; COLORREF backcolor; FXint fillmode; if(yes){ if(!(dwFlags&WS_CLIPCHILDREN)){ if((HWND)surface->id()!=GetDesktopWindow()){ hPen=(HPEN)SelectObject((HDC)ctx,::GetStockObject(NULL_PEN)); hBrush=(HBRUSH)::SelectObject((HDC)ctx,::GetStockObject(NULL_BRUSH)); hFont=(HFONT)::SelectObject((HDC)ctx,::GetStockObject(SYSTEM_FONT)); textcolor=::GetTextColor((HDC)ctx); backcolor=::GetBkColor((HDC)ctx); fillmode=::GetPolyFillMode((HDC)ctx); ::ReleaseDC((HWND)surface->id(),(HDC)ctx); ::SetWindowLong((HWND)surface->id(),GWL_STYLE,dwFlags|WS_CLIPCHILDREN); ctx=::GetDC((HWND)surface->id()); ::SelectObject((HDC)ctx,hFont); ::SelectObject((HDC)ctx,hPen); ::SelectObject((HDC)ctx,hBrush); if(visual->colormap){ ::SelectPalette((HDC)ctx,(HPALETTE)visual->colormap,false); ::RealizePalette((HDC)ctx); } ::SetTextAlign((HDC)ctx,TA_BASELINE|TA_LEFT); ::SetTextColor((HDC)ctx,textcolor); ::SetBkColor((HDC)ctx,backcolor); ::SetPolyFillMode((HDC)ctx,fillmode); needsClipReset=false; } } } else{ if(dwFlags&WS_CLIPCHILDREN){ if((HWND)surface->id()!=GetDesktopWindow()){ hPen=(HPEN)::SelectObject((HDC)ctx,::GetStockObject(NULL_PEN)); hBrush=(HBRUSH)::SelectObject((HDC)ctx,::GetStockObject(NULL_BRUSH)); hFont=(HFONT)::SelectObject((HDC)ctx,::GetStockObject(SYSTEM_FONT)); textcolor=::GetTextColor((HDC)ctx); backcolor=::GetBkColor((HDC)ctx); fillmode=::GetPolyFillMode((HDC)ctx); ::ReleaseDC((HWND)surface->id(),(HDC)ctx); ::SetWindowLong((HWND)surface->id(),GWL_STYLE,dwFlags&~WS_CLIPCHILDREN); ctx=::GetDC((HWND)surface->id()); ::SelectObject((HDC)ctx,hFont); ::SelectObject((HDC)ctx,hPen); ::SelectObject((HDC)ctx,hBrush); if(visual->colormap){ ::SelectPalette((HDC)ctx,(HPALETTE)visual->colormap,false); ::RealizePalette((HDC)ctx); } ::SetTextAlign((HDC)ctx,TA_BASELINE|TA_LEFT); ::SetTextColor((HDC)ctx,textcolor); ::SetBkColor((HDC)ctx,backcolor); ::SetPolyFillMode((HDC)ctx,fillmode); needsClipReset=true; } } } } #endif } fox1.6-1.6.57/src/FXDLL.cpp000066400000000000000000000122771326741342000150120ustar00rootroot00000000000000/******************************************************************************** * * * D y n a m i c L i n k L i b r a r y S u p p o r t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDLL.cpp,v 1.21 2006/03/01 02:13:21 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXDLL.h" #ifndef WIN32 #ifdef HAVE_SHL_LOAD #include // HP-UX #else #include // POSIX #endif #endif /* Notes: - Make sure it works on other unices. */ #ifndef RTLD_GLOBAL #define RTLD_GLOBAL 0 // Does not exist on DEC #endif #ifdef HAVE_SHL_LOAD #ifndef DYNAMIC_PATH // HP-UX #define DYNAMIC_PATH 0 #endif #ifndef BIND_RESTRICTED #define BIND_RESTRICTED 0 #endif #endif using namespace FX; /*******************************************************************************/ namespace FX { // Open DLL and return dllhandle to it void* fxdllOpen(const FXchar *dllname){ if(dllname){ #ifndef WIN32 #ifdef HAVE_SHL_LOAD // HP-UX return shl_load(dllname,BIND_IMMEDIATE|BIND_NONFATAL|DYNAMIC_PATH,0L); #else #ifdef DL_LAZY // OpenBSD return dlopen(dllname,DL_LAZY); #else // POSIX return dlopen(dllname,RTLD_NOW|RTLD_GLOBAL); #endif #endif #else // WIN32 // Order of loading with LoadLibrary (or LoadLibraryEx with no // LOAD_WITH_ALTERED_SEARCH_PATH flag): // // 1. Directory from which the application was loaded. // 2. Current directory. // 3. System directory, as determined by GetSystemDirectory(). // 4. 16-bit system directory. // 5. Windows directory, as determined by GetWindowsDirectory(). // 6. Directories in the $PATH. // // With flag LOAD_WITH_ALTERED_SEARCH_PATH: // // 1. Directory specified by the filename path. // 2. Current directory. // 3. System directory. // 4. 16-bit system directory. // 5. Windows directory. // 6. Directories in the $PATH. // // We switched to the latter so sub-modules needed by a DLL are // plucked from the same place as dllname (thanks to Rafael de // Pelegrini Soares" ). //return LoadLibrary(dllname); return LoadLibraryExA(dllname,NULL,LOAD_WITH_ALTERED_SEARCH_PATH); #endif } return NULL; } // Close DLL of given dllhandle void fxdllClose(void* dllhandle){ if(dllhandle){ #ifndef WIN32 #ifdef HAVE_SHL_LOAD // HP-UX shl_unload((shl_t)dllhandle); #else // POSIX dlclose(dllhandle); #endif #else // WIN32 FreeLibrary((HMODULE)dllhandle); #endif } } // Return address of the given symbol in library dllhandle void* fxdllSymbol(void* dllhandle,const FXchar* dllsymbol){ if(dllhandle && dllsymbol){ #ifndef WIN32 #ifdef HAVE_SHL_LOAD // HP-UX void* address=NULL; if(shl_findsym((shl_t*)&dllhandle,dllsymbol,TYPE_UNDEFINED,&address)==0) return address; #else // POSIX return dlsym(dllhandle,dllsymbol); #endif #else // WIN32 return (void*)GetProcAddress((HMODULE)dllhandle,dllsymbol); #endif } return NULL; } // Return the string error message when loading dll's. // Suggested by Rafael de Pelegrini Soares FXString fxdllError(){ #ifndef WIN32 #ifdef HAVE_SHL_LOAD // HP-UX return FXString::null; #else // POSIX return dlerror(); #endif #else // WIN32 DWORD dw=GetLastError(); FXchar buffer[512]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,dw,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)buffer,sizeof(buffer),NULL); return buffer; #endif } } fox1.6-1.6.57/src/FXDataTarget.cpp000066400000000000000000000216571326741342000164210ustar00rootroot00000000000000/******************************************************************************** * * * D a t a T a r g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDataTarget.cpp,v 1.36 2006/01/22 17:58:22 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXWindow.h" #include "FXDataTarget.h" /* Notes: - DataTarget connects GUI to basic values such as flags (FXbool), integral or real numbers, and strings (FXString). - Values in the application program may get updated from the GUI, and vice-versa GUI gets updated when the program has changed a value as well. - Would be nice to set value from message ID also... - When the sender of onCmdValue does not understand the ID_GETXXXXVALUE message, the data target keeps the same value as before. - Catch SEL_CHANGED when we have expunged this from FXTextField. - DT_VOID, i.e. unconnected FXDataTarget maybe it should grey out corresponding widgets. - Need to add ID_GETLONGVALUE/ID_SETLONGVALUE message handlers some day. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXDataTarget) FXDataTargetMap[]={ FXMAPFUNC(SEL_COMMAND,FXDataTarget::ID_VALUE,FXDataTarget::onCmdValue), FXMAPFUNC(SEL_CHANGED,FXDataTarget::ID_VALUE,FXDataTarget::onCmdValue), FXMAPFUNC(SEL_UPDATE,FXDataTarget::ID_VALUE,FXDataTarget::onUpdValue), FXMAPFUNCS(SEL_COMMAND,FXDataTarget::ID_OPTION-10001,FXDataTarget::ID_OPTION+10000,FXDataTarget::onCmdOption), FXMAPFUNCS(SEL_UPDATE,FXDataTarget::ID_OPTION-10001,FXDataTarget::ID_OPTION+10000,FXDataTarget::onUpdOption), }; // Object implementation FXIMPLEMENT(FXDataTarget,FXObject,FXDataTargetMap,ARRAYNUMBER(FXDataTargetMap)) // Value changed from widget long FXDataTarget::onCmdValue(FXObject* sender,FXSelector sel,void*){ FXdouble d; FXint i; switch(type){ case DT_CHAR: i=*((FXchar*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_GETINTVALUE),(void*)&i); *((FXchar*)data)=i; break; case DT_UCHAR: i=*((FXuchar*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_GETINTVALUE),(void*)&i); *((FXuchar*)data)=i; break; case DT_SHORT: i=*((FXshort*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_GETINTVALUE),(void*)&i); *((FXshort*)data)=i; break; case DT_USHORT: i=*((FXushort*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_GETINTVALUE),(void*)&i); *((FXushort*)data)=i; break; case DT_INT: sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_GETINTVALUE),data); break; case DT_UINT: sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_GETINTVALUE),data); break; case DT_LONG: i=(FXint) *((FXlong*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_GETINTVALUE),(void*)&i); *((FXlong*)data)=i; break; case DT_ULONG: i=(FXint) *((FXulong*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_GETINTVALUE),(void*)&i); *((FXulong*)data)=i; break; case DT_FLOAT: d=*((FXfloat*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_GETREALVALUE),(void*)&d); *((FXfloat*)data)=(FXfloat)d; break; case DT_DOUBLE: sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_GETREALVALUE),data); break; case DT_STRING: sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_GETSTRINGVALUE),data); break; } if(target){ target->handle(this,FXSEL(FXSELTYPE(sel),message),data); } return 1; } // Widget changed from value long FXDataTarget::onUpdValue(FXObject* sender,FXSelector,void*){ FXdouble d; FXint i; switch(type){ case DT_CHAR: i=*((FXchar*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),(void*)&i); break; case DT_UCHAR: i=*((FXuchar*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),(void*)&i); break; case DT_SHORT: i=*((FXshort*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),(void*)&i); break; case DT_USHORT: i=*((FXushort*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),(void*)&i); break; case DT_INT: sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),data); break; case DT_UINT: sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),data); break; case DT_LONG: i=(FXint) *((FXlong*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),(void*)&i); break; case DT_ULONG: i=(FXint) *((FXulong*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),(void*)&i); break; case DT_FLOAT: d=*((FXfloat*)data); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETREALVALUE),(void*)&d); break; case DT_DOUBLE: sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETREALVALUE),data); break; case DT_STRING: sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE),data); break; } return 1; } // Value set from message id long FXDataTarget::onCmdOption(FXObject*,FXSelector sel,void*){ FXint num=((FXint)FXSELID(sel))-ID_OPTION; switch(type){ case DT_CHAR: *((FXchar*)data)=num; break; case DT_UCHAR: *((FXuchar*)data)=num; break; case DT_SHORT: *((FXshort*)data)=num; break; case DT_USHORT: *((FXushort*)data)=num; break; case DT_INT: *((FXint*)data)=num; break; case DT_UINT: *((FXuint*)data)=num; break; case DT_LONG: *((FXlong*)data)=num; break; case DT_ULONG: *((FXulong*)data)=num; break; case DT_FLOAT: *((FXfloat*)data)=(FXfloat)num; break; case DT_DOUBLE: *((FXdouble*)data)=num; break; } if(target){ target->handle(this,FXSEL(FXSELTYPE(sel),message),data); } return 1; } // Check widget whose message id matches long FXDataTarget::onUpdOption(FXObject* sender,FXSelector sel,void*){ FXint num=((FXint)FXSELID(sel))-ID_OPTION; FXint i=0; switch(type){ case DT_CHAR: i=*((FXchar*)data); break; case DT_UCHAR: i=*((FXuchar*)data); break; case DT_SHORT: i=*((FXshort*)data); break; case DT_USHORT: i=*((FXushort*)data); break; case DT_INT: i=*((FXint*)data); break; case DT_UINT: i=*((FXuint*)data); break; case DT_LONG: i=(FXint) *((FXlong*)data); break; case DT_ULONG: i=(FXint) *((FXulong*)data); break; case DT_FLOAT: i=(FXint) *((FXfloat*)data); break; case DT_DOUBLE: i=(FXint) *((FXdouble*)data); break; } if(i==num){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_CHECK),NULL); } else{ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_UNCHECK),NULL); } return 1; } /// Destroy FXDataTarget::~FXDataTarget(){ target=(FXObject*)-1L; data=(void*)-1L; } } fox1.6-1.6.57/src/FXDate.cpp000066400000000000000000000143031326741342000152440ustar00rootroot00000000000000/******************************************************************************** * * * D a t e C l a s s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDate.cpp,v 1.11 2006/02/03 00:44:32 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXDate.h" /* Notes: - Henry F. Fliegel and Thomas C. Van Flandern, "A Machine Algorithm for Processing Calendar Dates". CACM, Vol. 11, No. 10, October 1968, pp 657. */ using namespace FX; /*******************************************************************************/ namespace FX { // Short month names const FXchar FXDate::shortMonthName[12][4]={ "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" }; // Long month names const FXchar FXDate::longMonthName[12][10]={ "January","February","March","April","May","June","July","August","September","October","November","December" }; // Short week day name const FXchar FXDate::shortWeekDay[7][4]={ "Sun","Mon","Tue","Wed","Thu","Fri","Sat" }; // Long week day name const FXchar FXDate::longWeekDay[7][10]={ "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" }; // Number of days in nomimal month static const FXuchar monthDays[13]={ 0,31,28,31,30,31,30,31,31,30,31,30,31 }; // Convert gregorian date to julian day number void FXDate::greg2jul(FXuint& jd,FXint y,FXint m,FXint d){ if(m<1 || m>12 || d<1 || d>31){ fxerror("FXDate:: bad argument\n"); } jd=(1461*(y+4800+(m-14)/12))/4+(367*(m-2-12*((m-14)/12)))/12-(3*((y+4900+(m-14)/12)/100))/4+d-32075; } // Convert julian day number to gregorian date void FXDate::jul2greg(FXuint jd,FXint& y,FXint& m,FXint& d){ register FXint l,n,i,j; l=jd+68569; n=(4*l)/146097; l=l-(146097*n+3)/4; i=(4000*(l+1))/1461001; l=l-(1461*i)/4+31; j=(80*l)/2447; d=l-(2447*j)/80; l=j/11; m=j+2-(12*l); y=100*(n-49)+i+l; } // Initialize with year, month, and day FXDate::FXDate(FXint y,FXint m,FXint d){ greg2jul(julian,y,m,d); } // Set to year, month, and day void FXDate::setDate(FXint y,FXint m,FXint d){ greg2jul(julian,y,m,d); } // Get year, month, and day void FXDate::getDate(FXint& y,FXint& m,FXint& d) const { jul2greg(julian,y,m,d); } // is value a leap year? bool FXDate::leapYear(FXint y){ return ((y%4==0) && (y%100!=0)) || (y%400==0); } // Return day of the month FXint FXDate::day() const { FXint d,m,y; jul2greg(julian,y,m,d); return d; } // Return month FXint FXDate::month() const { FXint d,m,y; jul2greg(julian,y,m,d); return m; } // Return year FXint FXDate::year() const { FXint d,m,y; jul2greg(julian,y,m,d); return y; } // Return day of the week, starting with sunday FXint FXDate::dayOfWeek() const { // return (((julian+1)%7)+6)%7; // Monday is day 0 of week return (julian+1)%7; // Sunday is day 0 of week } // number of days in the months FXint FXDate::daysInMonth() const { FXint y,m,d; jul2greg(julian,y,m,d); if(m==2 && leapYear(y)) return 29; return monthDays[m]; } // Return day of year FXint FXDate::dayOfYear() const { FXint y,m,d; FXuint jd; jul2greg(julian,y,m,d); greg2jul(jd,y,1,1); return julian-jd+1; } // Return true if leap year bool FXDate::leapYear() const { FXint d,m,y; jul2greg(julian,y,m,d); return leapYear(y); } // Return current local date FXDate FXDate::localDate(){ FXDate date; #ifndef WIN32 #if defined(FOX_THREAD_SAFE) && !defined(__FreeBSD__) && !defined(__OpenBSD__) struct tm result,*t; time_t ltime; time(<ime); t=localtime_r(<ime,&result); #else struct tm *t; time_t ltime; time(<ime); t=localtime(<ime); #endif greg2jul(date.julian,t->tm_year+1900,t->tm_mon+1,t->tm_mday); #else SYSTEMTIME t; GetLocalTime(&t); greg2jul(date.julian,t.wYear,t.wMonth,t.wDay); #endif return date; } // Return current UTC (Zulu) date FXDate FXDate::zuluDate(){ FXDate date; #ifndef WIN32 #if defined(FOX_THREAD_SAFE) && !defined(__FreeBSD__) && !defined(__OpenBSD__) struct tm result,*t; time_t ltime; time(<ime); t=gmtime_r(<ime,&result); #else struct tm *t; time_t ltime; time(<ime); t=gmtime(<ime); #endif greg2jul(date.julian,t->tm_year+1900,t->tm_mon+1,t->tm_mday); #else SYSTEMTIME t; GetSystemTime(&t); greg2jul(date.julian,t.wYear,t.wMonth,t.wDay); #endif return date; } // save to store FXStream& operator<<(FXStream& store,const FXDate& d){ store << d.julian; return store; } // load from store FXStream& operator>>(FXStream& store,FXDate& d){ store >> d.julian; return store; } } fox1.6-1.6.57/src/FXDebugTarget.cpp000066400000000000000000000113271326741342000165670ustar00rootroot00000000000000/******************************************************************************** * * * D e b u g - T a r g e t O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDebugTarget.cpp,v 1.33 2006/01/22 17:58:22 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXDebugTarget.h" /* Notes: - The point of this object is simply to accept all messages, and print out where they came from, which type they were, etc. - So purely for debugging purposes. */ using namespace FX; /*******************************************************************************/ namespace FX { // Table of message type names const char *const FXDebugTarget::messageTypeName[]={ "SEL_NONE", "SEL_KEYPRESS", "SEL_KEYRELEASE", "SEL_LEFTBUTTONPRESS", "SEL_LEFTBUTTONRELEASE", "SEL_MIDDLEBUTTONPRESS", "SEL_MIDDLEBUTTONRELEASE", "SEL_RIGHTBUTTONPRESS", "SEL_RIGHTBUTTONRELEASE", "SEL_MOTION", "SEL_ENTER", "SEL_LEAVE", "SEL_FOCUSIN", "SEL_FOCUSOUT", "SEL_KEYMAP", "SEL_UNGRABBED", "SEL_PAINT", "SEL_CREATE", "SEL_DESTROY", "SEL_UNMAP", "SEL_MAP", "SEL_CONFIGURE", "SEL_SELECTION_LOST", "SEL_SELECTION_GAINED", "SEL_SELECTION_REQUEST", "SEL_RAISED", "SEL_LOWERED", "SEL_CLOSE", "SEL_DELETE", "SEL_MINIMIZE", "SEL_RESTORE", "SEL_MAXIMIZE", "SEL_UPDATE", "SEL_COMMAND", "SEL_CLICKED", "SEL_DOUBLECLICKED", "SEL_TRIPLECLICKED", "SEL_MOUSEWHEEL", "SEL_CHANGED", "SEL_VERIFY", "SEL_DESELECTED", "SEL_SELECTED", "SEL_INSERTED", "SEL_REPLACED", "SEL_DELETED", "SEL_OPENED", "SEL_CLOSED", "SEL_EXPANDED", "SEL_COLLAPSED", "SEL_BEGINDRAG", "SEL_ENDDRAG", "SEL_DRAGGED", "SEL_LASSOED", "SEL_TIMEOUT", "SEL_SIGNAL", "SEL_CLIPBOARD_LOST", "SEL_CLIPBOARD_GAINED", "SEL_CLIPBOARD_REQUEST", "SEL_CHORE", "SEL_FOCUS_SELF", "SEL_FOCUS_RIGHT", "SEL_FOCUS_LEFT", "SEL_FOCUS_DOWN", "SEL_FOCUS_UP", "SEL_FOCUS_NEXT", "SEL_FOCUS_PREV", "SEL_DND_ENTER", "SEL_DND_LEAVE", "SEL_DND_DROP", "SEL_DND_MOTION", "SEL_DND_REQUEST", "SEL_IO_READ", "SEL_IO_WRITE", "SEL_IO_EXCEPT", "SEL_PICKED", "SEL_QUERY_TIP", "SEL_QUERY_HELP", "SEL_DOCKED", "SEL_FLOATED", "SEL_SESSION_NOTIFY", "SEL_SESSION_CLOSED" }; // Map FXDEFMAP(FXDebugTarget) FXDebugTargetMap[]={ FXMAPTYPES(SEL_KEYPRESS,SEL_LAST,FXDebugTarget::onMessage), }; // Object implementation FXIMPLEMENT(FXDebugTarget,FXObject,FXDebugTargetMap,ARRAYNUMBER(FXDebugTargetMap)) // Init FXDebugTarget::FXDebugTarget(){ lastsender=NULL; lastsel=0; count=0; } // Got one long FXDebugTarget::onMessage(FXObject* sender,FXSelector sel,void* ptr){ FXuint type=FXSELTYPE(sel); FXuint msid=FXSELID(sel); FXASSERT(ARRAYNUMBER(messageTypeName)==SEL_LAST); if(sender!=lastsender || sel!=lastsel){ fxmessage("\nTYPE:%-23s ID:%-5d SENDER: %-15s PTR: 0x%08p #%-4d",typegetClassName():"NULL",ptr,1); lastsender=sender; lastsel=sel; count=1; } else{ count++; fxmessage("\b\b\b\b%-4d",count); } return 0; } } fox1.6-1.6.57/src/FXDelegator.cpp000066400000000000000000000051351326741342000163000ustar00rootroot00000000000000/******************************************************************************** * * * D e l e g a t o r T a r g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDelegator.cpp,v 1.15 2006/01/22 17:58:22 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXDelegator.h" /* Notes: - A delegator forwards messages to another target. - A delegator does not itself understand any message; it is mainly used to provide a single point at which the actual object receiving the messages from the controls can be switched around to another. */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXDelegator,FXObject,NULL,0) // Delegate message to another target long FXDelegator::onDefault(FXObject* sender,FXSelector sel,void* ptr){ return delegate && delegate->handle(sender,sel,ptr); } } fox1.6-1.6.57/src/FXDial.cpp000066400000000000000000000521731326741342000152470ustar00rootroot00000000000000/******************************************************************************** * * * D i a l W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDial.cpp,v 1.50.2.1 2007/09/22 04:28:37 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXDial.h" /* Notes: - Contributed by: Guoqing Tian. - Position decoupled from angle. - Add some API's. - Properly handle cyclic/non cyclic stuff. - Callbacks should report position in the void* ptr. - Keep notchangle>=0, as % of negative numbers is implementation defined. - Not yet happy with keyboard/wheel mode valuator. - Visual cue for focus:- please no ugly border! */ #define DIALWIDTH 12 #define DIALDIAMETER 40 #define NUMSIDECOLORS 16 #define DIAL_MASK (DIAL_HORIZONTAL|DIAL_CYCLIC|DIAL_HAS_NOTCH) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXDial) FXDialMap[]={ FXMAPFUNC(SEL_PAINT,0,FXDial::onPaint), FXMAPFUNC(SEL_MOTION,0,FXDial::onMotion), FXMAPFUNC(SEL_MOUSEWHEEL,0,FXDial::onMouseWheel), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXDial::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXDial::onLeftBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXDial::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXDial::onKeyRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXDial::onUngrabbed), FXMAPFUNC(SEL_QUERY_TIP,0,FXDial::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXDial::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXDial::ID_SETVALUE,FXDial::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXDial::ID_SETINTVALUE,FXDial::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXDial::ID_SETREALVALUE,FXDial::onCmdSetRealValue), FXMAPFUNC(SEL_COMMAND,FXDial::ID_GETINTVALUE,FXDial::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXDial::ID_GETREALVALUE,FXDial::onCmdGetRealValue), FXMAPFUNC(SEL_COMMAND,FXDial::ID_SETINTRANGE,FXDial::onCmdSetIntRange), FXMAPFUNC(SEL_COMMAND,FXDial::ID_GETINTRANGE,FXDial::onCmdGetIntRange), FXMAPFUNC(SEL_COMMAND,FXDial::ID_SETREALRANGE,FXDial::onCmdSetRealRange), FXMAPFUNC(SEL_COMMAND,FXDial::ID_GETREALRANGE,FXDial::onCmdGetRealRange), FXMAPFUNC(SEL_COMMAND,FXDial::ID_SETHELPSTRING,FXDial::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXDial::ID_GETHELPSTRING,FXDial::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXDial::ID_SETTIPSTRING,FXDial::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXDial::ID_GETTIPSTRING,FXDial::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXDial,FXFrame,FXDialMap,ARRAYNUMBER(FXDialMap)) FXDial::FXDial(){ flags|=FLAG_ENABLED; range[0]=0; range[1]=0; notchangle=0; notchspacing=0; notchoffset=0; notchColor=0; dragpoint=0; dragpos=0; incr=0; pos=0; } // Make a window FXDial::FXDial(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_ENABLED; target=tgt; message=sel; range[0]=0; range[1]=359; notchangle=0; notchspacing=90; notchoffset=0; notchColor=FXRGB(255,128,0); dragpoint=0; dragpos=0; incr=360; pos=0; } // Get minimum width FXint FXDial::getDefaultWidth(){ register FXint w=(options&DIAL_HORIZONTAL)?DIALDIAMETER:DIALWIDTH; return w+padleft+padright+(border<<1); } // Get minimum height FXint FXDial::getDefaultHeight(){ register FXint h=(options&DIAL_HORIZONTAL)?DIALWIDTH:DIALDIAMETER; return h+padtop+padbottom+(border<<1); } // Returns true because a dial can receive focus bool FXDial::canFocus() const { return true; } // Set help using a message long FXDial::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXDial::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXDial::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXDial::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXDial::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXDial::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Update value from a message long FXDial::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setValue((FXint)(FXival)ptr); return 1; } // Update value from a message long FXDial::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setValue(*((FXint*)ptr)); return 1; } // Update value from a message long FXDial::onCmdSetRealValue(FXObject*,FXSelector,void* ptr){ setValue((FXint)*((FXdouble*)ptr)); return 1; } // Obtain value from text field long FXDial::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr) = getValue(); return 1; } // Obtain value from text field long FXDial::onCmdGetRealValue(FXObject*,FXSelector,void* ptr){ *((FXdouble*)ptr) = (FXdouble)getValue(); return 1; } // Update range from a message long FXDial::onCmdSetIntRange(FXObject*,FXSelector,void* ptr){ setRange(((FXint*)ptr)[0],((FXint*)ptr)[1]); return 1; } // Get range with a message long FXDial::onCmdGetIntRange(FXObject*,FXSelector,void* ptr){ getRange(((FXint*)ptr)[0],((FXint*)ptr)[1]); return 1; } // Update range from a message long FXDial::onCmdSetRealRange(FXObject*,FXSelector,void* ptr){ setRange((FXint) ((FXdouble*)ptr)[0],(FXint) ((FXdouble*)ptr)[1]); return 1; } // Get range with a message long FXDial::onCmdGetRealRange(FXObject*,FXSelector,void* ptr){ ((FXdouble*)ptr)[0]=(FXdouble)range[0]; ((FXdouble*)ptr)[1]=(FXdouble)range[1]; return 1; } // Pressed LEFT button long FXDial::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; if(options&DIAL_HORIZONTAL) dragpoint=event->win_x; else dragpoint=event->win_y; dragpos=pos; flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; return 1; } return 0; } // Released LEFT button long FXDial::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXuint changed=(flags&FLAG_CHANGED); if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(changed && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); return 1; } return 0; } // The widget lost the grab for some reason long FXDial::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onUngrabbed(sender,sel,ptr); flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; return 1; } // Moving long FXDial::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXint travel,size,delta,newpos,tmp; if(flags&FLAG_PRESSED){ if(options&DIAL_HORIZONTAL){ size=width-(border<<1); travel=event->win_x-dragpoint; } else{ size=height-(border<<1); travel=dragpoint-event->win_y; } if(size<100) size=100; if(travel){ delta=(incr*travel)/(2*size); if(options&DIAL_CYCLIC){ tmp=dragpos+delta-range[0]; while(tmp<0) tmp+=(range[1]-range[0]+1); newpos=range[0]+tmp%(range[1]-range[0]+1); } else{ if(dragpos+deltarange[1]) newpos=range[1]; else newpos=dragpos+delta; } if(pos!=newpos){ pos=newpos; FXASSERT(range[0]<=pos && pos<=range[1]); notchangle=(notchoffset+(3600*(pos-range[0]))/incr)%3600; update(border+padleft+1,border+padtop+1,width-(border<<1)-padleft-padright-2,height-(border<<1)-padtop-padbottom-2); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); return 1; } } } return 0; } // Mouse wheel (Thanks to "Lyle Johnson" ) long FXDial::onMouseWheel(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXint delta,newpos,tmp,mod; // Determine the change in dial units; this probably still needs // tweaking. The formula below adjusts the dial position by 1/36 // of a revolution for each "hop" of the mousewheel. delta=(event->code*incr)/4320; // Determine new dial position if(options&DIAL_CYCLIC){ mod=range[1]-range[0]+1; tmp=pos+delta-range[0]; while(tmp<0) tmp+=mod; newpos=range[0]+tmp%mod; // FIXME small problem if range[1]-range[0]+1 is UINT_MAX } else{ if(pos+deltarange[1]) newpos=range[1]; else newpos=pos+delta; } if(pos!=newpos){ pos=newpos; FXASSERT(range[0]<=pos && pos<=range[1]); notchangle=(notchoffset+(3600*(pos-range[0]))/incr)%3600; update(border+padleft+1,border+padtop+1,width-(border<<1)-padleft-padright-2,height-(border<<1)-padtop-padbottom-2); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } return 1; } // Keyboard press long FXDial::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; switch(event->code){ case KEY_Left: case KEY_KP_Left: if(options&DIAL_HORIZONTAL) goto dec; break; case KEY_Right: case KEY_KP_Right: if(options&DIAL_HORIZONTAL) goto inc; break; case KEY_Up: case KEY_KP_Up: if(!(options&DIAL_HORIZONTAL)) goto inc; break; case KEY_Down: case KEY_KP_Down: if(!(options&DIAL_HORIZONTAL)) goto dec; break; case KEY_plus: case KEY_KP_Add: inc: setValue(pos+1,TRUE); return 1; case KEY_minus: case KEY_KP_Subtract: dec: setValue(pos-1,TRUE); return 1; } } return 0; } // Keyboard release long FXDial::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Left: case KEY_KP_Left: case KEY_Right: case KEY_KP_Right: if(options&DIAL_HORIZONTAL) return 1; break; case KEY_Up: case KEY_KP_Up: case KEY_Down: case KEY_KP_Down: if(!(options&DIAL_HORIZONTAL)) return 1; break; case KEY_plus: case KEY_KP_Add: case KEY_KP_Subtract: case KEY_minus: return 1; } } return 0; } // Handle repaint long FXDial::onPaint(FXObject*,FXSelector,void* ptr){ const FXdouble fac=0.5*PI/((FXdouble)(NUMSIDECOLORS-1)); FXEvent *event=(FXEvent*)ptr; FXint i,size,u,d,lu,ld,t,r,fm,to,off,ang; FXuint rmax,gmax,bmax,red,green,blue; FXint lt,rt,tp,bm; FXdouble mid,tmp; FXDCWindow dc(this,event); // Paint background dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); off=(notchangle+3600)%notchspacing; fm=off/notchspacing; to=(off+1800-notchspacing+1)/notchspacing; // Rectangle of dial lt=border+padleft+1; rt=width-border-padright-2; tp=border+padtop+1; bm=height-border-padbottom-2; // Colors for sides rmax=(126*FXREDVAL(backColor))/100; gmax=(126*FXGREENVAL(backColor))/100; bmax=(126*FXBLUEVAL(backColor))/100; rmax=FXMIN(rmax,255); gmax=FXMIN(gmax,255); bmax=FXMIN(bmax,255); // Horizontal dial if(options&DIAL_HORIZONTAL){ size=rt-lt; r=size/2-1; mid=0.5*(lt+rt); for(i=fm; i<=to; i++){ ang=i*notchspacing+off; t=(FXint)(mid-r*cos(0.1*DTOR*ang)); if((options&DIAL_HAS_NOTCH) && (ang+3600)%3600==notchangle){ dc.setForeground(hiliteColor); dc.drawLine(t-1,tp,t-1,bm); dc.setForeground(notchColor); dc.drawLine(t,tp,t,bm); dc.drawLine(t+1,tp,t+1,bm); dc.setForeground(borderColor); dc.drawLine(t+2,tp,t+2,bm); } else{ if(ang<200){ dc.setForeground(shadowColor); dc.drawLine(t,tp,t,bm); dc.setForeground(borderColor); dc.drawLine(t+1,tp,t+1,bm); } else if(ang<300){ dc.setForeground(borderColor); dc.drawLine(t,tp,t,bm); } else if(ang<600){ dc.setForeground(hiliteColor); dc.drawLine(t,tp,t,bm); dc.setForeground(borderColor); dc.drawLine(t+1,tp,t+1,bm); } else if(ang<1200){ dc.setForeground(hiliteColor); dc.drawLine(t-1,tp,t-1,bm); dc.drawLine(t,tp,t,bm); dc.setForeground(borderColor); dc.drawLine(t+1,tp,t+1,bm); } else if(ang<1500){ dc.setForeground(hiliteColor); dc.drawLine(t,tp,t,bm); dc.setForeground(borderColor); dc.drawLine(t+1,tp,t+1,bm); } else if(ang<1600){ dc.setForeground(borderColor); dc.drawLine(t,tp,t,bm); } else{ dc.setForeground(shadowColor); dc.drawLine(t,tp,t,bm); dc.setForeground(borderColor); dc.drawLine(t-1,tp,t-1,bm); } } } dc.drawLine(lt,tp,lt,bm); dc.drawLine(rt,tp,rt,bm); lu=lt; ld=rt; for(i=0; ihi){ fxerror("%s::setRange: trying to set negative range.\n",getClassName()); } if(range[0]!=lo || range[1]!=hi){ range[0]=lo; range[1]=hi; setValue(pos,notify); } } // Set dial value void FXDial::setValue(FXint p,FXbool notify){ register FXint n; if(prange[1]) p=range[1]; n=(notchoffset+(3600*(p-range[0]))/incr)%3600; if(n!=notchangle){ notchangle=n; update(); } if(p!=pos){ pos=p; if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos);} } } // Change increment, i.e. the amount of pos change per revolution void FXDial::setRevolutionIncrement(FXint i){ incr=FXMAX(1,i); notchangle=(notchoffset+(3600*(pos-range[0]))/incr)%3600; update(); } // Change notch spacing void FXDial::setNotchSpacing(FXint spacing){ if(spacing<1) spacing=1; if(spacing>3600) spacing=3600; while(3600%spacing) spacing--; // Should be a divisor of 3600 if(notchspacing!=spacing){ notchspacing=spacing; update(); } } // Change notch offset void FXDial::setNotchOffset(FXint offset){ if(offset>3600) offset=3600; if(offset<-3600) offset=-3600; offset=(offset+3600)%3600; if(offset!=notchoffset){ notchoffset=offset; notchangle=(notchoffset+(3600*(pos-range[0]))/incr)%3600; update(); } } // Get dial options FXuint FXDial::getDialStyle() const { return (options&DIAL_MASK); } // Set dial options void FXDial::setDialStyle(FXuint style){ FXuint opts=(options&~DIAL_MASK) | (style&DIAL_MASK); if(options!=opts){ options=opts; recalc(); } } // Save object to stream void FXDial::save(FXStream& store) const { FXFrame::save(store); store << range[0] << range[1]; store << notchColor; store << notchangle; store << notchspacing; store << notchoffset; store << incr; store << pos; store << help; store << tip; } // Load object from stream void FXDial::load(FXStream& store){ FXFrame::load(store); store >> range[0] >> range[1]; store >> notchColor; store >> notchangle; store >> notchspacing; store >> notchoffset; store >> incr; store >> pos; store >> help; store >> tip; } // Change the Center Notch color void FXDial::setNotchColor(FXColor clr){ if(clr!=notchColor){ notchColor=clr; update(); } } // Change help text void FXDial::setHelpText(const FXString& text){ help=text; } // Change tip text void FXDial::setTipText(const FXString& text){ tip=text; } } fox1.6-1.6.57/src/FXDialogBox.cpp000066400000000000000000000125371326741342000162460ustar00rootroot00000000000000/******************************************************************************** * * * D i a l o g B o x O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDialogBox.cpp,v 1.36 2006/01/22 17:58:22 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "fxkeys.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDialogBox.h" /* To do: - Iconified/normal - Unmap when main window unmapped - Transient For stuff - Place so that cursor over dialog - Hitting ESC will cancel out of the dialog - Hitting RETURN will localize the default button, and then send it a RETURN; Note that the default button is initially assigned, but whichever button has the focus will be the default button; default-ness moves between buttons. - We now have timeouts and chores as alternative ways to cancel the dialog. This reduces the amount of code needed to flash little popup dialogs on the screen to just a call to app->addTimeout() or app->addChore(). */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXDialogBox) FXDialogBoxMap[]={ FXMAPFUNC(SEL_KEYPRESS,0,FXDialogBox::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXDialogBox::onKeyRelease), FXMAPFUNC(SEL_CLOSE,0,FXDialogBox::onCmdCancel), FXMAPFUNC(SEL_COMMAND,FXDialogBox::ID_ACCEPT,FXDialogBox::onCmdAccept), FXMAPFUNC(SEL_CHORE,FXDialogBox::ID_CANCEL,FXDialogBox::onCmdCancel), FXMAPFUNC(SEL_TIMEOUT,FXDialogBox::ID_CANCEL,FXDialogBox::onCmdCancel), FXMAPFUNC(SEL_COMMAND,FXDialogBox::ID_CANCEL,FXDialogBox::onCmdCancel), }; // Object implementation FXIMPLEMENT(FXDialogBox,FXTopWindow,FXDialogBoxMap,ARRAYNUMBER(FXDialogBoxMap)) // Contruct free floating dialog FXDialogBox::FXDialogBox(FXApp* a,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXTopWindow(a,name,NULL,NULL,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ } // Contruct dialog which will stay on top of owner FXDialogBox::FXDialogBox(FXWindow* owner,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXTopWindow(owner,name,NULL,NULL,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ } // Close dialog with an accept long FXDialogBox::onCmdAccept(FXObject*,FXSelector,void*){ getApp()->stopModal(this,TRUE); hide(); return 1; } // Close dialog with a cancel long FXDialogBox::onCmdCancel(FXObject*,FXSelector,void*){ getApp()->stopModal(this,FALSE); hide(); return 1; } // Keyboard press; handle escape to close the dialog long FXDialogBox::onKeyPress(FXObject* sender,FXSelector sel,void* ptr){ if(FXTopWindow::onKeyPress(sender,sel,ptr)) return 1; if(((FXEvent*)ptr)->code==KEY_Escape){ handle(this,FXSEL(SEL_COMMAND,ID_CANCEL),NULL); return 1; } return 0; } // Keyboard release; handle escape to close the dialog long FXDialogBox::onKeyRelease(FXObject* sender,FXSelector sel,void* ptr){ if(FXTopWindow::onKeyRelease(sender,sel,ptr)) return 1; if(((FXEvent*)ptr)->code==KEY_Escape){ return 1; } return 0; } // Execute dialog box modally; after creating the dialog and // showing it on the screen, we call getApp()->refresh() to // incur a GUI update pass over all the widgets; without an // explicit call, the GUI update would only be scheduled after // the message handler invoking this function would return. FXuint FXDialogBox::execute(FXuint placement){ create(); show(placement); getApp()->refresh(); return getApp()->runModalFor(this); } } fox1.6-1.6.57/src/FXDict.cpp000066400000000000000000000252471326741342000152630ustar00rootroot00000000000000/******************************************************************************** * * * D i c t i o n a r y C l a s s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDict.cpp,v 1.33 2006/01/22 17:58:22 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXDict.h" /* Notes: - The hash algorithm should yield a number in the range [0...FXDict::EMPTY) We need FXDict::EMPTY and FXDict::UNUSED for flag purposes. - Since the algorithm doubles the table size when exceeding MAX_LOAD, it would be prudent to keep MIN_LOAD less than .5*MAX_LOAD; otherwise, the algorithm might hip-hop between halving and doubling, which would be quite expensive!! - Not many people seem to know that hash tables don't have to be prime numbers; in fact, a table size of 2**n and odd probe distance are very easy to arrange, and this works just as well! - We store the hash key, so that 99.999% of the time we can compare hash numbers; only when hash numbers match do we need to compare keys. Thus, with a good hash function, the number of calls to strcmp() should be roughly the same as the number of successful lookups. - The hash table should NEVER get full, or stuff will loop forever!! */ #define DEF_HASH_SIZE 4 // Initial table size (MUST be power of 2) #define MAX_LOAD 80 // Maximum hash table load factor (%) #define MIN_LOAD 10 // Minimum hash table load factor (%) #define HASH1(x,n) (((unsigned int)(x))%(n)) // Probe Position [0..n-1] #define HASH2(x,n) (1|(((unsigned int)(x)*17)%((n)-1))) // Probe Distance [1..n-2] using namespace FX; /*******************************************************************************/ namespace FX { // Hash function for string FXint FXDict::hash(const FXchar* str){ register const FXuchar *s=(const FXuchar*)str; register FXint h=0; register FXint c; while((c=*s++)!='\0'){ h = ((h << 5) + h) ^ c; } return h&0x7fffffff; } // Object implementation FXIMPLEMENT(FXDict,FXObject,NULL,0) // Construct empty dictionary FXDict::FXDict(){ register FXint i; FXMALLOC(&dict,FXDictEntry,DEF_HASH_SIZE); for(i=0; i>2)>m) n>>=1; // Shrink until n/4 <= m while((n>>1)>1)); FXASSERT(DEF_HASH_SIZE<=n); if(n!=total){ FXTRACE((200,"FXDict::size: %p: resizing from %d to %d\n",this,total,n)); FXASSERT(m<=n); FXCALLOC(&k,FXDictEntry,n); for(i=0; i=(MAX_LOAD*total)) size(number); FXASSERT(number=(MAX_LOAD*total)) size(number); FXASSERT(number= 0){ if(0<=dict[pos].hash) break; } FXASSERT(pos<0 || 0<=dict[pos].hash); return pos; } // Remove all void FXDict::clear(){ register FXint i; for(i=0; i=0){ dict[i].hash=-1; free(dict[i].key); deleteData(dict[i].data); } } number=0; } // Destroy table FXDict::~FXDict(){ clear(); FXFREE(&dict); dict=(FXDictEntry*)-1L; } } fox1.6-1.6.57/src/FXDir.cpp000066400000000000000000000627021326741342000151130ustar00rootroot00000000000000/******************************************************************************** * * * D i r e c t o r y E n u m e r a t o r * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDir.cpp,v 1.39 2006/01/22 17:58:22 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXStat.h" #include "FXFile.h" #include "FXPath.h" #include "FXDir.h" /* Notes: - This class implements a way to list the files in a directory. - We just want to wrap directory iteration, nothing fancy. - Maybe add positioning for seek and tell type functions. */ using namespace FX; /*******************************************************************************/ namespace FX { #ifdef WIN32 struct SPACE { HANDLE handle; FXuint first; WIN32_FIND_DATA result; }; #else struct SPACE { DIR* handle; struct dirent* dp; struct fxdirent result; }; #endif // Construct directory enumerator FXDir::FXDir(){ // If this fails on your machine, determine what sizeof(SPACE) is // on your machine and mail it to: jeroen@fox-toolkit.org! //FXTRACE((150,"sizeof(SPACE)=%ld\n",sizeof(SPACE))); FXASSERT(sizeof(SPACE)<=sizeof(space)); #ifdef WIN32 ((SPACE*)space)->handle=INVALID_HANDLE_VALUE; #else ((SPACE*)space)->handle=NULL; #endif } // Construct directory enumerator FXDir::FXDir(const FXString& path){ // If this fails on your machine, determine what sizeof(SPACE) is // on your machine and mail it to: jeroen@fox-toolkit.org! //FXTRACE((150,"sizeof(SPACE)=%ld\n",sizeof(SPACE))); FXASSERT(sizeof(SPACE)<=sizeof(space)); #ifdef WIN32 ((SPACE*)space)->handle=INVALID_HANDLE_VALUE; #else ((SPACE*)space)->handle=NULL; #endif open(path); } // Open directory to path, return true if ok. bool FXDir::open(const FXString& path){ if(!path.empty()){ #ifdef WIN32 #ifdef UNICODE FXnchar buffer[1024]; utf2ncs(buffer,path.text(),path.length()+1); wcsncat(buffer,TEXT("\\*"),sizeof(buffer)); #else FXchar buffer[1024]; strncpy(buffer,path.text(),sizeof(buffer)); strncat(buffer,"\\*",sizeof(buffer)); #endif ((SPACE*)space)->handle=FindFirstFile(buffer,&((SPACE*)space)->result); if(((SPACE*)space)->handle!=INVALID_HANDLE_VALUE){ ((SPACE*)space)->first=TRUE; return true; } #else ((SPACE*)space)->handle=opendir(path.text()); if(((SPACE*)space)->handle!=NULL){ return true; } #endif } return false; } // Returns true if the directory is open bool FXDir::isOpen() const { #ifdef WIN32 return (((SPACE*)space)->handle!=INVALID_HANDLE_VALUE); #else return (((SPACE*)space)->handle!=NULL); #endif } // Get next file name bool FXDir::next(){ if(isOpen()){ #ifdef WIN32 if(((SPACE*)space)->first || FindNextFile(((SPACE*)space)->handle,&((SPACE*)space)->result)){ ((SPACE*)space)->first=false; return true; } #else #if defined(FOX_THREAD_SAFE) && !defined(__FreeBSD__) && !defined(__OpenBSD__) if(!readdir_r(((SPACE*)space)->handle,&((SPACE*)space)->result,&((SPACE*)space)->dp) && ((SPACE*)space)->dp){ return true; } #else if((((SPACE*)space)->dp=readdir(((SPACE*)space)->handle))!=NULL){ return true; } #endif #endif } return false; } // Return current file name FXString FXDir::name() const { if(isOpen()){ #ifdef WIN32 return ((SPACE*)space)->result.cFileName; #else return ((SPACE*)space)->dp->d_name; #endif } return FXString::null; } // Close directory void FXDir::close(){ if(isOpen()){ #ifdef WIN32 FindClose(((SPACE*)space)->handle); ((SPACE*)space)->handle=INVALID_HANDLE_VALUE; #else closedir(((SPACE*)space)->handle); ((SPACE*)space)->handle=NULL; #endif } } // Create new directory bool FXDir::create(const FXString& path,FXuint mode){ if(!path.empty()){ #ifdef WIN32 #ifdef UNICODE FXnchar buffer[1024]; utf2ncs(buffer,path.text(),path.length()+1); return CreateDirectoryW(buffer,NULL)!=0; #else return CreateDirectoryA(path.text(),NULL)!=0; #endif #else return ::mkdir(path.text(),mode)==0; #endif } return false; } // Remove directory bool FXDir::remove(const FXString& path){ if(!path.empty()){ #ifdef WIN32 #ifdef UNICODE FXnchar buffer[1024]; utf2ncs(buffer,path.text(),path.length()+1); return RemoveDirectoryW(buffer)!=0; #else return RemoveDirectoryA(path.text())!=0; #endif #else return ::rmdir(path.text())==0; #endif } return false; } // Rename directory bool FXDir::rename(const FXString& srcpath,const FXString& dstpath){ if(srcpath!=dstpath){ #ifdef WIN32 #ifdef UNICODE FXnchar oldname[1024],newname[1024]; utf2ncs(oldname,srcpath.text(),srcpath.length()+1); utf2ncs(newname,dstpath.text(),dstpath.length()+1); return ::MoveFileW(oldname,newname)!=0; #else return ::MoveFileA(srcpath.text(),dstpath.text())!=0; #endif #else return ::rename(srcpath.text(),dstpath.text())==0; #endif } return false; } // List all the files in directory FXint FXDir::listFiles(FXString*& filelist,const FXString& path,const FXString& pattern,FXuint flags){ FXDir dir(path); // Initialize to empty filelist=NULL; // Get directory stream pointer if(dir.isOpen()){ FXuint mode=FILEMATCH_FILE_NAME|FILEMATCH_NOESCAPE; FXString *newlist; FXint size=0; FXint count=0; FXString pathname; FXString name; FXStat data; // Folding case if(flags&CaseFold) mode|=FILEMATCH_CASEFOLD; // Loop over directory entries while(dir.next()){ // Get name name=dir.name(); // Build full pathname pathname=path; if(!ISPATHSEP(pathname[pathname.length()-1])) pathname+=PATHSEPSTRING; pathname+=name; // Get info on file if(!FXStat::statFile(pathname,data)) continue; #ifdef WIN32 // Filter out files; a bit tricky... if(!data.isDirectory() && ((flags&NoFiles) || (data.isHidden() && !(flags&HiddenFiles)) || (!(flags&AllFiles) && !FXPath::match(pattern,name,mode)))) continue; // Filter out directories; even more tricky! if(data.isDirectory() && ((flags&NoDirs) || (data.isHidden() && !(flags&HiddenDirs)) || (name[0]=='.' && (name[1]==0 || (name[1]=='.' && name[2]==0 && (flags&NoParent)))) || (!(flags&AllDirs) && !FXPath::match(pattern,name,mode)))) continue; #else // Filter out files; a bit tricky... if(!data.isDirectory() && ((flags&NoFiles) || (name[0]=='.' && !(flags&HiddenFiles)) || (!(flags&AllFiles) && !FXPath::match(pattern,name,mode)))) continue; // Filter out directories; even more tricky! if(data.isDirectory() && ((flags&NoDirs) || (name[0]=='.' && (name[1]==0 || (name[1]=='.' && name[2]==0 && (flags&NoParent)) || (name[1]!='.' && !(flags&HiddenDirs)))) || (!(flags&AllDirs) && !FXPath::match(pattern,name,mode)))) continue; #endif // Grow list if(count+1>=size){ size=size?(size<<1):256; newlist=new FXString [size]; for(int i=0; i>=1,letter[0]++){ if(mask&1) list[count++]=letter; } filelist[count++]=PATHSEPSTRING PATHSEPSTRING; // UNC for file shares return count; } */ /* // A UNC name was given of the form "\\" or "\\server" if(ISPATHSEP(path[0]) && ISPATHSEP(path[1]) && path.find(PATHSEP,2)<0){ NETRESOURCE host; // Fill in host.dwScope=RESOURCE_GLOBALNET; host.dwType=RESOURCETYPE_DISK; host.dwDisplayType=RESOURCEDISPLAYTYPE_GENERIC; host.dwUsage=RESOURCEUSAGE_CONTAINER; host.lpLocalName=NULL; host.lpRemoteName=(char*)path.text(); host.lpComment=NULL; host.lpProvider=NULL; // Open network enumeration if(WNetOpenEnum((path[2]?RESOURCE_GLOBALNET:RESOURCE_CONTEXT),RESOURCETYPE_DISK,0,(path[2]?&host:NULL),&hEnum)==NO_ERROR){ NETRESOURCE resource[16384/sizeof(NETRESOURCE)]; FXTRACE((1,"Enumerating=%s\n",path.text())); while(1){ nCount=-1; // Read as many as will fit nSize=sizeof(resource); if(WNetEnumResource(hEnum,&nCount,resource,&nSize)!=NO_ERROR) break; for(i=0; i=size){ size=size?(size<<1):256; newlist=new FXString[size]; for(j=0; j=size){ size=size?(size<<1):256; newlist=new FXString[size]; for(int f=0; f>=1,name[0]++){ // Skip unavailable drives if(!(mask&1)) continue; // Find it, and take it out from the old list if found for(pp=po; (item=*pp)!=NULL; pp=&item->link){ if(comparecase(item->label,name)==0){ *pp=item->link; item->link=NULL; po=pp; goto fnd; } } // Not found; prepend before list item=(FXDirItem*)appendItem(NULL,name,open_folder,closed_folder,NULL,TRUE); // Next gets hung after this one fnd:*pn=item; pn=&item->link; // Its a folder item->state=FXDirItem::FOLDER|FXDirItem::HASITEMS; // Assume no associations fileassoc=NULL; drivetype=GetDriveType(name.text()); switch(drivetype){ case DRIVE_REMOVABLE: if(name[0]=='A' || name[0]=='B'){ openicon=floppyicon; closedicon=floppyicon; } else{ openicon=zipdiskicon; closedicon=zipdiskicon; } break; case DRIVE_REMOTE: openicon=networkicon; closedicon=networkicon; break; case DRIVE_CDROM: openicon=cdromicon; closedicon=cdromicon; break; case DRIVE_RAMDISK: openicon=open_folder; closedicon=closed_folder; break; case DRIVE_FIXED: openicon=harddiskicon; closedicon=harddiskicon; break; case DRIVE_UNKNOWN: case DRIVE_NO_ROOT_DIR: default: openicon=open_folder; closedicon=closed_folder; break; } if(associations) fileassoc=associations->findDirBinding(name.text()); // If association is found, use it if(fileassoc){ if(fileassoc->miniicon) closedicon=fileassoc->miniicon; if(fileassoc->miniiconopen) openicon=fileassoc->miniiconopen; } // Update item information item->openIcon=openicon; item->closedIcon=closedicon; item->size=0L; item->assoc=fileassoc; item->date=0; // Create item if(id()) item->create(); } // FIXME what about network neighborhood? // Wipe items remaining in list:- they have disappeared!! for(item=oldlist; item; item=link){ link=item->link; removeItem(item,TRUE); } // Remember new list list=newlist; } void fxenumWNetContainerResource(NETRESOURCE* netResource,FXObjectListOf& netResourceList,DWORD openEnumScope){ // Comments are mine, unless indicated otherwise. - Daniël Hörchner // // Passing the value RESOURCE_GLOBALNET for openEnumScope will make this // function search recursively through the network shares for disk resources. // Passing the value RESOURCE_CONTEXT will make this function list the servers // in the network neighbourhood. DWORD retVal; HANDLE handle; // WNetEnumResource() reports containers as being disk resources if // WNetOpenEnum() is called with RESOURCETYPE_DISK. This does not happen if // it's called with RESOURCETYPE_ANY. // BTW RESOURCETYPE_DISK does not guarantee that only disk resources are // reported (I also get a printer container in the list). if((retVal=WNetOpenEnum(openEnumScope,RESOURCETYPE_DISK,0,netResource,&handle))!=NO_ERROR){ // we get here also if access was denied to enumerate the container FXTRACE((1,"ERROR: WNetOpenEnum() (%d)\n", retVal)); return; } NETRESOURCE *netResources; DWORD netResourcesSize=16*1024; // 16 kB is a good size, according to MSDN if ((netResources=(NETRESOURCE *)malloc(netResourcesSize))==NULL){ FXTRACE((1,"ERROR: Not enough memory for NETRESOURCE structures\n")); WNetCloseEnum(handle); return; } do{ DWORD nEntries=(DWORD)-1; retVal=WNetEnumResource(handle,&nEntries,netResources,&netResourcesSize); // netResourcesSize is not modified if the buffer is large enough if(retVal==ERROR_MORE_DATA){ // MSDN info is not correct; ERROR_MORE_DATA means the buffer was too // small for a _single_ entry // netResourcesSize (now) contains required size if((netResources=(NETRESOURCE *)realloc(netResources,netResourcesSize))==NULL){ FXTRACE((1,"ERROR: Reallocation for NETRESOURCE structures failed\n")); WNetCloseEnum(handle); return; } nEntries=(DWORD)-1; retVal=WNetEnumResource(handle,&nEntries,netResources,&netResourcesSize); } if(retVal!=NO_ERROR && retVal!=ERROR_NO_MORE_ITEMS){ char *str; switch (retVal){ case ERROR_MORE_DATA: str="more data"; break; // shouldn't happen case ERROR_INVALID_HANDLE: str="invalid handle"; break; case ERROR_NO_NETWORK: str="no network"; break; case ERROR_EXTENDED_ERROR: str="extended error"; break; default: str="unknown"; } FXTRACE((1,"ERROR: Network enum error: %s (%d)\n",str,retVal)); free(netResources); WNetCloseEnum(handle); return; } for(DWORD n=0; n < nEntries; n++){ bool isContainer=FALSE; // if RESOURCE_CONTEXT was passed to WNetOpenEnum(), dwScope will be // RESOURCE_GLOBALNET if(netResources[n].dwScope==RESOURCE_GLOBALNET && (netResources[n].dwUsage&RESOURCEUSAGE_CONTAINER)){ isContainer=TRUE; // If RESOURCE_CONTEXT was passed to WNetOpenEnum(), the first entry is // a "self reference". For example, starting from the network root one // can find a container entry with lpComment "Entire Network" // (lpRemoteName and lpLocalName are NULL for me). This container // contains an entry with the same properties. In order to avoid getting // into an infinite loop, we must handle this case. // However, trying to enumerate normal containers while RESOURCE_CONTEXT // was used causes WNetOpenEnum() to return ERROR_INVALID_PARAMETER. if(netResources[n].lpRemoteName){ netResourceList.append(new FXStringObject(((FXString)netResources[n].lpRemoteName)+PATHSEP)); if(openEnumScope!=RESOURCE_CONTEXT){ fxenumWNetContainerResource(&netResources[n],netResourceList,openEnumScope); } } } // Using the variable isContainer is necessary if WNetOpenEnum() is // called with RESOURCETYPE_DISK. See above. if(netResources[n].dwType==RESOURCETYPE_DISK && !isContainer){ netResourceList.append(new FXStringObject(((FXString)netResources[n].lpRemoteName)+PATHSEP)); } } } while(retVal!=ERROR_NO_MORE_ITEMS); free(netResources); WNetCloseEnum(handle); // it makes no sense to check for NO_ERROR } // Folding case if(flags&LIST_CASEFOLD) matchmode|=FILEMATCH_CASEFOLD; if(FXFile::isShareServer(path)){ pathname=path; // pathname must not have an ending back slash or else // fxenumWNetContainerResource() (WNetOpenEnum()) will fail if(ISPATHSEP(pathname[pathname.length()-1])) pathname.trunc(pathname.length()-1); NETRESOURCE netResource; memset(&netResource,0,sizeof(NETRESOURCE)); netResource.lpRemoteName=(char *)pathname.text(); FXObjectListOf netResourceList; // a share server can only provide shares, which are similar to directories if(!(flags&LIST_NO_DIRS)) fxenumWNetContainerResource(&netResource,netResourceList,RESOURCE_GLOBALNET); for(int n=0; n < netResourceList.no(); n++){ // Get name name=*netResourceList[n]; if(ISPATHSEP(name[name.length()-1])) name.trunc(name.length()-1); name=FXFile::name(name); // Filter out directories if(!(flags&LIST_ALL_DIRS) && !match(pattern,name,matchmode)) continue; // Grow list if(count+1>=size){ size=size?(size<<1):256; newlist=new FXString[size]; for(int f=0; f=size){ size=size?(size<<1):256; newlist=new FXString[size]; for(int f=0; fcreate(); cdromicon->create(); harddiskicon->create(); netdriveicon->create(); floppyicon->create(); nethoodicon->create(); zipdiskicon->create(); } // Detach disconnects the icons void FXDirBox::detach(){ foldericon->detach(); cdromicon->detach(); harddiskicon->detach(); netdriveicon->detach(); floppyicon->detach(); nethoodicon->detach(); zipdiskicon->detach(); FXTreeListBox::detach(); } // Destroy zaps the icons void FXDirBox::destroy(){ foldericon->destroy(); cdromicon->destroy(); harddiskicon->destroy(); netdriveicon->destroy(); floppyicon->destroy(); nethoodicon->destroy(); zipdiskicon->destroy(); FXTreeListBox::destroy(); } // Set the current item's text from the message long FXDirBox::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setDirectory((char*)ptr); return 1; } // Change value long FXDirBox::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setDirectory(*((FXString*)ptr)); return 1; } // Obtain value long FXDirBox::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getDirectory(); return 1; } // Return item path FXString FXDirBox::getItemPathname(FXTreeItem *item) const { FXString string; if(item){ while(item->getParent()){ string.prepend(getItemText(item)); item=item->getParent(); if(item->getParent()) string.prepend(PATHSEPSTRING); } string.prepend(getItemText(item)); } return string; } #ifndef WIN32 // UNIX flavor // Return the item from the absolute pathname FXTreeItem* FXDirBox::getPathnameItem(const FXString& path){ register FXFileAssoc *fileassoc; register FXTreeItem *item; register FXIcon *icon; register FXint beg=0; register FXint end=0; // Remove old items first clearItems(); // Parse past root if(ISPATHSEP(path[0])) end++; // Absolute path? if(begfindDirBinding("/"); if(fileassoc && fileassoc->miniicon) icon=fileassoc->miniicon; } // Create item if(id()) icon->create(); // Add root item=appendItem(NULL,"/",icon,icon); // Add the rest while(endfindDirBinding(path.left(end).text()); if(fileassoc && fileassoc->miniicon) icon=fileassoc->miniicon; } // Add next item under last item=appendItem(item,path.mid(beg,end-beg),icon,icon); // Create item if(id()) icon->create(); // Skip over path separator if(endfindDirBinding(drivename); if(fileassoc && fileassoc->miniicon) icon=fileassoc->miniicon; } // Create item if(id()) icon->create(); // Add another root item it=appendItem(NULL,drivename,icon,icon); // Rest of path under this root if(comparecase(path,drivename,end)==0) item=it; } drivemask>>=1; } /* // Network neighborhood icon=nethoodicon; // Maybe override from associations if(associations){ fileassoc=associations->findDirBinding("\\\\"); if(fileassoc && fileassoc->miniicon) icon=fileassoc->miniicon; } // Create item if(id()) icon->create(); // Add netword neighborhood item it=appendItem(NULL,"\\\\",icon,icon); // Rest of path under this root maybe if(comparecase(path,"\\\\",end)==0) item=it; */ // Got root? if(item){ // Add the rest while(endfindDirBinding(path.left(end).text()); if(fileassoc && fileassoc->miniicon) icon=fileassoc->miniicon; } // Create item if(id()) icon->create(); // Add next item under last item=appendItem(item,path.mid(beg,end-beg),icon,icon); // Skip over path separator if(endhandle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); // Unpost the list if(ptr){ field->setText(tree->getItemText((FXTreeItem*)ptr)); field->setIcon(tree->getItemClosedIcon((FXTreeItem*)ptr)); removeItem(((FXTreeItem*)ptr)->getFirst()); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)string.text()); } return 1; } // Forward changed message from list to target long FXDirBox::onTreeChanged(FXObject*,FXSelector,void* ptr){ FXString string=getItemPathname((FXTreeItem*)ptr); if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)string.text()); return 1; } // Set directory void FXDirBox::setDirectory(const FXString& pathname){ setCurrentItem(getPathnameItem(FXPath::absolute(pathname))); } // Return current directory FXString FXDirBox::getDirectory() const { return getItemPathname(getCurrentItem()); } // Change associations table; force regeneration of the items // in the tree list so all the new bindings take effect void FXDirBox::setAssociations(FXFileDict* assocs){ if(associations!=assocs){ associations=assocs; setDirectory(getDirectory()); } } // Save object to stream void FXDirBox::save(FXStream& store) const { FXTreeListBox::save(store); store << associations; store << foldericon; store << cdromicon; store << harddiskicon; store << netdriveicon; store << floppyicon; store << nethoodicon; store << zipdiskicon; } // Load object from stream void FXDirBox::load(FXStream& store){ FXTreeListBox::load(store); store >> associations; store >> foldericon; store >> cdromicon; store >> harddiskicon; store >> netdriveicon; store >> floppyicon; store >> nethoodicon; store >> zipdiskicon; } // Delete it FXDirBox::~FXDirBox(){ clearItems(); if(!(options&DIRBOX_NO_OWN_ASSOC)) delete associations; delete foldericon; delete cdromicon; delete harddiskicon; delete netdriveicon; delete floppyicon; delete nethoodicon; delete zipdiskicon; associations=(FXFileDict*)-1L; foldericon=(FXIcon*)-1L; cdromicon=(FXIcon*)-1L; harddiskicon=(FXIcon*)-1L; netdriveicon=(FXIcon*)-1L; floppyicon=(FXIcon*)-1L; nethoodicon=(FXIcon*)-1L; zipdiskicon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXDirDialog.cpp000066400000000000000000000134701326741342000162310ustar00rootroot00000000000000/******************************************************************************** * * * D i r e c t o r y S e l e c t i o n D i a l o g * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDirDialog.cpp,v 1.27 2006/01/22 17:58:22 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXStat.h" #include "FXFile.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXRecentFiles.h" #include "FXId.h" #include "FXFont.h" #include "FXDrawable.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXButton.h" #include "FXComposite.h" #include "FXTreeList.h" #include "FXDirList.h" #include "FXPacker.h" #include "FXShell.h" #include "FXTopWindow.h" #include "FXDialogBox.h" #include "FXDirSelector.h" #include "FXDirDialog.h" /* To do: */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXDirDialog,FXDialogBox,NULL,0) // Construct directory dialog box FXDirDialog::FXDirDialog(FXWindow* owner,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(owner,name,opts|DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE|DECOR_CLOSE,x,y,w,h,0,0,0,0,4,4){ initdialog(); } // Construct directory dialog box FXDirDialog::FXDirDialog(FXApp* a,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(a,name,opts|DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE|DECOR_CLOSE,x,y,w,h,0,0,0,0,4,4){ initdialog(); } // Initialize dialog and load settings void FXDirDialog::initdialog(){ dirbox=new FXDirSelector(this,NULL,0,LAYOUT_FILL_X|LAYOUT_FILL_Y); dirbox->acceptButton()->setTarget(this); dirbox->acceptButton()->setSelector(FXDialogBox::ID_ACCEPT); dirbox->cancelButton()->setTarget(this); dirbox->cancelButton()->setSelector(FXDialogBox::ID_CANCEL); setWidth(getApp()->reg().readIntEntry("Directory Dialog","width",getWidth())); setHeight(getApp()->reg().readIntEntry("Directory Dialog","height",getHeight())); } // Hide window and save settings void FXDirDialog::hide(){ FXDialogBox::hide(); getApp()->reg().writeIntEntry("Directory Dialog","width",getWidth()); getApp()->reg().writeIntEntry("Directory Dialog","height",getHeight()); } // Set directory void FXDirDialog::setDirectory(const FXString& path){ dirbox->setDirectory(path); } // Get directory FXString FXDirDialog::getDirectory() const { return dirbox->getDirectory(); } // Return TRUE if showing files as well as directories FXbool FXDirDialog::showFiles() const { return dirbox->showFiles(); } // Show or hide normal files void FXDirDialog::showFiles(FXbool showing){ dirbox->showFiles(showing); } // Return TRUE if showing hidden files FXbool FXDirDialog::showHiddenFiles() const { return dirbox->showHiddenFiles(); } // Show or hide hidden files void FXDirDialog::showHiddenFiles(FXbool showing){ dirbox->showHiddenFiles(showing); } // Change wildcard matching mode void FXDirDialog::setMatchMode(FXuint mode){ dirbox->setMatchMode(mode); } // Return wildcard matching mode FXuint FXDirDialog::getMatchMode() const { return dirbox->getMatchMode(); } // Change Directory List style void FXDirDialog::setDirBoxStyle(FXuint style){ dirbox->setDirBoxStyle(style); } // Return Directory List style FXuint FXDirDialog::getDirBoxStyle() const { return dirbox->getDirBoxStyle(); } // Save data void FXDirDialog::save(FXStream& store) const { FXDialogBox::save(store); store << dirbox; } // Load data void FXDirDialog::load(FXStream& store){ FXDialogBox::load(store); store >> dirbox; } // Cleanup FXDirDialog::~FXDirDialog(){ dirbox=(FXDirSelector*)-1L; } // Open existing directory name FXString FXDirDialog::getOpenDirectory(FXWindow* owner,const FXString& caption,const FXString& path){ FXDirDialog dirdialog(owner,caption); FXString dirname; dirdialog.setDirectory(path); if(dirdialog.execute()){ dirname=dirdialog.getDirectory(); if(FXStat::isDirectory(dirname)) return dirname; } return FXString::null; } } fox1.6-1.6.57/src/FXDirList.cpp000066400000000000000000001106231326741342000157430ustar00rootroot00000000000000/******************************************************************************** * * * D i r e c t o r y L i s t O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDirList.cpp,v 1.160.2.3 2006/11/22 15:40:27 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXPath.h" #include "FXStat.h" #include "FXFile.h" #include "FXDir.h" #include "FXURL.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXFont.h" #include "FXIcon.h" #include "FXBMPIcon.h" #include "FXGIFIcon.h" #include "FXScrollBar.h" #include "FXDirList.h" #include "FXFileDict.h" #ifdef WIN32 #include #endif #include "icons.h" /* Notes: - One can never create items in constructor:- createItem() may be overloaded! - Instead of FXTreeItems, callbacks should pass pointer to directory? - Clipboard of a filenames. - Should do drag and drop and such. - Clipboard, DND, etc. support. - We should NOT assume the root's name is just '/'. It could be C:\ etc. - Try read icons from /.dir.gif and /.opendir.gif! - Special icon for root. - We should generate SEL_INSERTED, SEL_DELETED, SEL_REPLACED, SEL_CHANGED messages as the FXDirList updates itself from the file system. - Under MS-Windows, always pass FILEMATCH_NOESCAPE setting match mode! - Every once in a while, even if checking doesn't reveal a change, refresh the entire list anyway! */ #define REFRESHINTERVAL 1000 // Interval between refreshes #define REFRESHFREQUENCY 30 // File systems not supporting mod-time, refresh every nth time using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXDirItem,FXTreeItem,NULL,0) // Map FXDEFMAP(FXDirList) FXDirListMap[]={ FXMAPFUNC(SEL_DRAGGED,0,FXDirList::onDragged), FXMAPFUNC(SEL_TIMEOUT,FXDirList::ID_REFRESHTIMER,FXDirList::onRefreshTimer), FXMAPFUNC(SEL_DND_ENTER,0,FXDirList::onDNDEnter), FXMAPFUNC(SEL_DND_LEAVE,0,FXDirList::onDNDLeave), FXMAPFUNC(SEL_DND_DROP,0,FXDirList::onDNDDrop), FXMAPFUNC(SEL_DND_MOTION,0,FXDirList::onDNDMotion), FXMAPFUNC(SEL_DND_REQUEST,0,FXDirList::onDNDRequest), FXMAPFUNC(SEL_BEGINDRAG,0,FXDirList::onBeginDrag), FXMAPFUNC(SEL_ENDDRAG,0,FXDirList::onEndDrag), FXMAPFUNC(SEL_UPDATE,FXDirList::ID_SHOW_HIDDEN,FXDirList::onUpdShowHidden), FXMAPFUNC(SEL_UPDATE,FXDirList::ID_HIDE_HIDDEN,FXDirList::onUpdHideHidden), FXMAPFUNC(SEL_UPDATE,FXDirList::ID_TOGGLE_HIDDEN,FXDirList::onUpdToggleHidden), FXMAPFUNC(SEL_UPDATE,FXDirList::ID_SHOW_FILES,FXDirList::onUpdShowFiles), FXMAPFUNC(SEL_UPDATE,FXDirList::ID_HIDE_FILES,FXDirList::onUpdHideFiles), FXMAPFUNC(SEL_UPDATE,FXDirList::ID_TOGGLE_FILES,FXDirList::onUpdToggleFiles), FXMAPFUNC(SEL_UPDATE,FXDirList::ID_SET_PATTERN,FXDirList::onUpdSetPattern), FXMAPFUNC(SEL_UPDATE,FXDirList::ID_SORT_REVERSE,FXDirList::onUpdSortReverse), FXMAPFUNC(SEL_UPDATE,FXDirList::ID_SORT_CASE,FXDirList::onUpdSortCase), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXDirList::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE,FXDirList::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETSTRINGVALUE,FXDirList::onCmdGetStringValue), FXMAPFUNC(SEL_COMMAND,FXDirList::ID_SHOW_HIDDEN,FXDirList::onCmdShowHidden), FXMAPFUNC(SEL_COMMAND,FXDirList::ID_HIDE_HIDDEN,FXDirList::onCmdHideHidden), FXMAPFUNC(SEL_COMMAND,FXDirList::ID_TOGGLE_HIDDEN,FXDirList::onCmdToggleHidden), FXMAPFUNC(SEL_COMMAND,FXDirList::ID_SHOW_FILES,FXDirList::onCmdShowFiles), FXMAPFUNC(SEL_COMMAND,FXDirList::ID_HIDE_FILES,FXDirList::onCmdHideFiles), FXMAPFUNC(SEL_COMMAND,FXDirList::ID_TOGGLE_FILES,FXDirList::onCmdToggleFiles), FXMAPFUNC(SEL_COMMAND,FXDirList::ID_SET_PATTERN,FXDirList::onCmdSetPattern), FXMAPFUNC(SEL_COMMAND,FXDirList::ID_SORT_REVERSE,FXDirList::onCmdSortReverse), FXMAPFUNC(SEL_COMMAND,FXDirList::ID_SORT_CASE,FXDirList::onCmdSortCase), FXMAPFUNC(SEL_COMMAND,FXDirList::ID_REFRESH,FXDirList::onCmdRefresh), }; // Object implementation FXIMPLEMENT(FXDirList,FXTreeList,FXDirListMap,ARRAYNUMBER(FXDirListMap)) // For serialization FXDirList::FXDirList(){ dropEnable(); sortfunc=ascendingCase; associations=NULL; list=NULL; matchmode=0; counter=0; dropaction=DRAG_MOVE; open_folder=NULL; closed_folder=NULL; mini_doc=NULL; mini_app=NULL; cdromicon=NULL; harddiskicon=NULL; networkicon=NULL; floppyicon=NULL; zipdiskicon=NULL; } // Directory List Widget FXDirList::FXDirList(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXTreeList(p,tgt,sel,opts,x,y,w,h),pattern("*"){ dropEnable(); open_folder=new FXGIFIcon(getApp(),minifolderopen); closed_folder=new FXGIFIcon(getApp(),minifolder); mini_doc=new FXGIFIcon(getApp(),minidoc); mini_app=new FXGIFIcon(getApp(),miniapp); cdromicon=new FXGIFIcon(getApp(),minicdrom); harddiskicon=new FXGIFIcon(getApp(),miniharddisk); networkicon=new FXGIFIcon(getApp(),mininetdrive); floppyicon=new FXGIFIcon(getApp(),minifloppy); zipdiskicon=new FXGIFIcon(getApp(),minizipdrive); #ifdef WIN32 matchmode=FILEMATCH_FILE_NAME|FILEMATCH_NOESCAPE|FILEMATCH_CASEFOLD; #else matchmode=FILEMATCH_FILE_NAME|FILEMATCH_NOESCAPE; #endif associations=NULL; if(!(options&DIRLIST_NO_OWN_ASSOC)) associations=new FXFileDict(getApp()); list=NULL; sortfunc=ascendingCase; dropaction=DRAG_MOVE; counter=0; } // Create X window void FXDirList::create(){ if(!id()) getApp()->addTimeout(this,ID_REFRESHTIMER,REFRESHINTERVAL); FXTreeList::create(); if(!deleteType){deleteType=getApp()->registerDragType(deleteTypeName);} if(!urilistType){urilistType=getApp()->registerDragType(urilistTypeName);} open_folder->create(); closed_folder->create(); mini_doc->create(); mini_app->create(); cdromicon->create(); harddiskicon->create(); networkicon->create(); floppyicon->create(); zipdiskicon->create(); scan(FALSE); } // Detach disconnects the icons void FXDirList::detach(){ if(id()) getApp()->removeTimeout(this,ID_REFRESHTIMER); FXTreeList::detach(); open_folder->detach(); closed_folder->detach(); mini_doc->detach(); mini_app->detach(); cdromicon->detach(); harddiskicon->detach(); networkicon->detach(); floppyicon->detach(); zipdiskicon->detach(); deleteType=0; urilistType=0; } // Destroy zaps the icons void FXDirList::destroy(){ if(id()) getApp()->removeTimeout(this,ID_REFRESHTIMER); FXTreeList::destroy(); open_folder->destroy(); closed_folder->destroy(); mini_doc->destroy(); mini_app->destroy(); } // Create item FXTreeItem* FXDirList::createItem(const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr){ return (FXTreeItem*) new FXDirItem(text,oi,ci,ptr); } // Sort ascending order, keeping directories first FXint FXDirList::ascending(const FXTreeItem* pa,const FXTreeItem* pb){ register const FXDirItem *a=(FXDirItem*)pa; register const FXDirItem *b=(FXDirItem*)pb; register FXint diff=(FXint)b->isDirectory() - (FXint)a->isDirectory(); return diff ? diff : compare(a->label,b->label); } // Sort descending order, keeping directories first FXint FXDirList::descending(const FXTreeItem* pa,const FXTreeItem* pb){ register const FXDirItem *a=(FXDirItem*)pa; register const FXDirItem *b=(FXDirItem*)pb; register FXint diff=(FXint)b->isDirectory() - (FXint)a->isDirectory(); return diff ? diff : compare(b->label,a->label); } // Sort ascending order, case insensitive, keeping directories first FXint FXDirList::ascendingCase(const FXTreeItem* pa,const FXTreeItem* pb){ register const FXDirItem *a=(FXDirItem*)pa; register const FXDirItem *b=(FXDirItem*)pb; register FXint diff=(FXint)b->isDirectory() - (FXint)a->isDirectory(); return diff ? diff : comparecase(a->label,b->label); } // Sort descending order, case insensitive, keeping directories first FXint FXDirList::descendingCase(const FXTreeItem* pa,const FXTreeItem* pb){ register const FXDirItem *a=(FXDirItem*)pa; register const FXDirItem *b=(FXDirItem*)pb; register FXint diff=(FXint)b->isDirectory() - (FXint)a->isDirectory(); return diff ? diff : comparecase(b->label,a->label); } /*******************************************************************************/ // Handle drag-and-drop enter long FXDirList::onDNDEnter(FXObject* sender,FXSelector sel,void* ptr){ FXTreeList::onDNDEnter(sender,sel,ptr); return 1; } // Handle drag-and-drop leave long FXDirList::onDNDLeave(FXObject* sender,FXSelector sel,void* ptr){ stopAutoScroll(); FXTreeList::onDNDLeave(sender,sel,ptr); return 1; } // Handle drag-and-drop motion long FXDirList::onDNDMotion(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXTreeItem *item; // Start autoscrolling if(startAutoScroll(event,FALSE)) return 1; // Give base class a shot if(FXTreeList::onDNDMotion(sender,sel,ptr)) return 1; // Dropping list of filenames if(offeredDNDType(FROM_DRAGNDROP,urilistType)){ // Locate drop place item=getItemAt(event->win_x,event->win_y); // We can drop in a directory if(item && isItemDirectory(item)){ // Get drop directory dropdirectory=getItemPathname(item); // What is being done (move,copy,link) dropaction=inquireDNDAction(); // See if this is writable if(FXStat::isWritable(dropdirectory)){ FXTRACE((100,"accepting drop on %s\n",dropdirectory.text())); acceptDrop(DRAG_ACCEPT); } } return 1; } return 0; } // Handle drag-and-drop drop long FXDirList::onDNDDrop(FXObject* sender,FXSelector sel,void* ptr){ FXString dropfiles,filesrc,filedst,url; FXint beg,end; // Stop scrolling stopAutoScroll(); // Perhaps target wants to deal with it if(FXTreeList::onDNDDrop(sender,sel,ptr)) return 1; // Get uri-list of files being dropped if(getDNDData(FROM_DRAGNDROP,urilistType,dropfiles)){ // Tell drag source we got it dropFinished(DRAG_ACCEPT); // Loop over urls for(beg=0; begbeep(); } else if(dropaction==DRAG_COPY){ FXTRACE((100,"Copying file: %s to %s\n",filesrc.text(),filedst.text())); if(!FXFile::copyFiles(filesrc,filedst)) getApp()->beep(); } else if(dropaction==DRAG_LINK){ FXTRACE((100,"Linking file: %s to %s\n",filesrc.text(),filedst.text())); if(!FXFile::symlink(filesrc,filedst)) getApp()->beep(); } } return 1; } return 0; } // Somebody wants our dragged data long FXDirList::onDNDRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; // Perhaps the target wants to supply its own data if(FXTreeList::onDNDRequest(sender,sel,ptr)) return 1; // Return list of filenames as a uri-list if(event->target==urilistType){ setDNDData(FROM_DRAGNDROP,event->target,dragfiles); return 1; } // Delete selected files if(event->target==deleteType){ FXTRACE((100,"Delete files not yet implemented\n")); return 1; } return 0; } // Start a drag operation long FXDirList::onBeginDrag(FXObject* sender,FXSelector sel,void* ptr){ register FXTreeItem *item; if(FXTreeList::onBeginDrag(sender,sel,ptr)) return 1; if(beginDrag(&urilistType,1)){ dragfiles=FXString::null; item=firstitem; while(item){ if(item->isSelected()){ if(!dragfiles.empty()) dragfiles+="\r\n"; dragfiles+=FXURL::encode(FXURL::fileToURL(getItemPathname(item))); } if(item->first){ item=item->first; } else{ while(!item->next && item->parent) item=item->parent; item=item->next; } } return 1; } return 0; } // End drag operation long FXDirList::onEndDrag(FXObject* sender,FXSelector sel,void* ptr){ if(FXTreeList::onEndDrag(sender,sel,ptr)) return 1; endDrag((didAccept()!=DRAG_REJECT)); setDragCursor(getDefaultCursor()); return 1; } // Dragged stuff around long FXDirList::onDragged(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXDragAction action; if(FXTreeList::onDragged(sender,sel,ptr)) return 1; action=DRAG_MOVE; if(event->state&CONTROLMASK) action=DRAG_COPY; if(event->state&SHIFTMASK) action=DRAG_MOVE; if(event->state&ALTMASK) action=DRAG_LINK; handleDrag(event->root_x,event->root_y,action); if(didAccept()!=DRAG_REJECT){ if(action==DRAG_MOVE) setDragCursor(getApp()->getDefaultCursor(DEF_DNDMOVE_CURSOR)); else if(action==DRAG_LINK) setDragCursor(getApp()->getDefaultCursor(DEF_DNDLINK_CURSOR)); else setDragCursor(getApp()->getDefaultCursor(DEF_DNDCOPY_CURSOR)); } else{ setDragCursor(getApp()->getDefaultCursor(DEF_DNDSTOP_CURSOR)); } return 1; } /*******************************************************************************/ // Open up the path down to the given string long FXDirList::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCurrentFile((const FXchar*)ptr); return 1; } // Open up the path down to the given string long FXDirList::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setCurrentFile(*((FXString*)ptr)); return 1; } // Obtain value of the current item long FXDirList::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getCurrentFile(); return 1; } // Toggle hidden files long FXDirList::onCmdToggleHidden(FXObject*,FXSelector,void*){ showHiddenFiles(!showHiddenFiles()); return 1; } // Update toggle hidden files widget long FXDirList::onUpdToggleHidden(FXObject* sender,FXSelector,void*){ sender->handle(this,showHiddenFiles()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Show hidden files long FXDirList::onCmdShowHidden(FXObject*,FXSelector,void*){ showHiddenFiles(TRUE); return 1; } // Update show hidden files widget long FXDirList::onUpdShowHidden(FXObject* sender,FXSelector,void*){ sender->handle(this,showHiddenFiles()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Hide hidden files long FXDirList::onCmdHideHidden(FXObject*,FXSelector,void*){ showHiddenFiles(FALSE); return 1; } // Update hide hidden files widget long FXDirList::onUpdHideHidden(FXObject* sender,FXSelector,void*){ sender->handle(this,showHiddenFiles()?FXSEL(SEL_COMMAND,ID_UNCHECK):FXSEL(SEL_COMMAND,ID_CHECK),NULL); return 1; } // Toggle files display long FXDirList::onCmdToggleFiles(FXObject*,FXSelector,void*){ showFiles(!showFiles()); return 1; } // Update toggle files widget long FXDirList::onUpdToggleFiles(FXObject* sender,FXSelector,void*){ sender->handle(this,showFiles()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Show files long FXDirList::onCmdShowFiles(FXObject*,FXSelector,void*){ showFiles(TRUE); return 1; } // Update show files widget long FXDirList::onUpdShowFiles(FXObject* sender,FXSelector,void*){ sender->handle(this,showFiles()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Hide files long FXDirList::onCmdHideFiles(FXObject*,FXSelector,void*){ showFiles(FALSE); return 1; } // Update hide files widget long FXDirList::onUpdHideFiles(FXObject* sender,FXSelector,void*){ sender->handle(this,showFiles()?FXSEL(SEL_COMMAND,ID_UNCHECK):FXSEL(SEL_COMMAND,ID_CHECK),NULL); return 1; } // Change pattern long FXDirList::onCmdSetPattern(FXObject*,FXSelector,void* ptr){ setPattern((const char*)ptr); return 1; } // Update pattern long FXDirList::onUpdSetPattern(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETVALUE),(void*)pattern.text()); return 1; } // Reverse sort order long FXDirList::onCmdSortReverse(FXObject*,FXSelector,void*){ if(sortfunc==ascending) sortfunc=descending; else if(sortfunc==descending) sortfunc=ascending; else if(sortfunc==ascendingCase) sortfunc=descendingCase; else if(sortfunc==descendingCase) sortfunc=ascendingCase; scan(TRUE); return 1; } // Update sender long FXDirList::onUpdSortReverse(FXObject* sender,FXSelector,void* ptr){ sender->handle(this,(sortfunc==descending || sortfunc==descendingCase) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),ptr); return 1; } // Toggle case sensitivity long FXDirList::onCmdSortCase(FXObject*,FXSelector,void*){ if(sortfunc==ascending) sortfunc=ascendingCase; else if(sortfunc==descending) sortfunc=descendingCase; else if(sortfunc==ascendingCase) sortfunc=ascending; else if(sortfunc==descendingCase) sortfunc=descending; scan(TRUE); return 1; } // Check if case sensitive long FXDirList::onUpdSortCase(FXObject* sender,FXSelector,void* ptr){ sender->handle(this,(sortfunc==ascendingCase || sortfunc==descendingCase) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),ptr); return 1; } // Expand tree FXbool FXDirList::expandTree(FXTreeItem* tree,FXbool notify){ if(FXTreeList::expandTree(tree,notify)){ if(isItemDirectory(tree)){ listChildItems((FXDirItem*)tree); sortChildItems(tree); } return TRUE; } return FALSE; } // Collapse tree FXbool FXDirList::collapseTree(FXTreeItem* tree,FXbool notify){ if(FXTreeList::collapseTree(tree,notify)){ if(isItemDirectory(tree)){ // As a memory saving feature, all knowledge below this item // is deleted; we'll just recreate it when its reexpanded! //removeItems(item->first,item->last); //recalc(); } return TRUE; } return FALSE; } // Refresh; don't update if user is interacting with the list long FXDirList::onRefreshTimer(FXObject*,FXSelector,void*){ if(flags&FLAG_UPDATE){ scan(FALSE); counter=(counter+1)%REFRESHFREQUENCY; } getApp()->addTimeout(this,ID_REFRESHTIMER,REFRESHINTERVAL); return 0; } // Force an immediate update of the list long FXDirList::onCmdRefresh(FXObject*,FXSelector,void*){ scan(TRUE); return 1; } // Scan items to see if listing is necessary void FXDirList::scan(FXbool force){ FXString pathname; FXDirItem *item; FXStat info; // Do root first time if(!firstitem || force){ listRootItems(); sortRootItems(); } // Check all items item=(FXDirItem*)firstitem; while(item){ // Is expanded directory? if(item->isDirectory() && item->isExpanded()){ // Get the full path of the item pathname=getItemPathname(item); // Stat this directory; should not fail as parent has been scanned already FXStat::statFile(pathname,info); // Get the mod date of the item FXTime newdate=info.touched(); // Forced, date was changed, or failed to get proper date and counter expired if(force || (item->date!=newdate) || (counter==0)){ // And do the refresh listChildItems(item); sortChildItems(item); // Remember when we did this item->date=newdate; } // Go deeper if(item->first){ item=(FXDirItem*)item->first; continue; } } // Go up while(!item->next && item->parent){ item=(FXDirItem*)item->parent; } // Go to next item=(FXDirItem*)item->next; } } #ifndef WIN32 // UNIX flavor // List root directories void FXDirList::listRootItems(){ FXDirItem *item=(FXDirItem*)firstitem; FXIcon *openicon; FXIcon *closedicon; FXFileAssoc *fileassoc; // First time, make root node if(!item) item=list=(FXDirItem*)appendItem(NULL,PATHSEPSTRING,harddiskicon,harddiskicon,NULL,TRUE); // Root is a directory, has items under it, and is searchable item->state|=FXDirItem::FOLDER|FXDirItem::HASITEMS; item->state&=~(FXDirItem::CHARDEV|FXDirItem::BLOCKDEV|FXDirItem::FIFO|FXDirItem::SOCK|FXDirItem::SYMLINK|FXDirItem::EXECUTABLE); // Determine associations, icons and type fileassoc=NULL; openicon=harddiskicon; closedicon=harddiskicon; if(associations) fileassoc=associations->findDirBinding(PATHSEPSTRING); // If association is found, use it if(fileassoc){ if(fileassoc->miniicon) closedicon=fileassoc->miniicon; if(fileassoc->miniiconopen) openicon=fileassoc->miniiconopen; } // Update item information item->openIcon=openicon; item->closedIcon=closedicon; item->size=0L; item->assoc=fileassoc; item->date=0; // Create item if(id()) item->create(); // Need to layout recalc(); } #else // Windows flavor // List root directories void FXDirList::listRootItems(){ FXDirItem *oldlist,*newlist,**po,**pp,**pn,*item,*link; FXIcon *openicon; FXIcon *closedicon; FXFileAssoc *fileassoc; FXString name; DWORD mask; UINT drivetype; // Build new insert-order list oldlist=list; newlist=NULL; // Assemble lists po=&oldlist; pn=&newlist; // Loop over drive letters for(mask=GetLogicalDrives(),name="A:\\"; mask; mask>>=1,name[0]++){ // Skip unavailable drives if(!(mask&1)) continue; // Find it, and take it out from the old list if found for(pp=po; (item=*pp)!=NULL; pp=&item->link){ if(comparecase(item->label,name)==0){ *pp=item->link; item->link=NULL; po=pp; goto fnd; } } // Not found; prepend before list item=(FXDirItem*)appendItem(NULL,name,open_folder,closed_folder,NULL,TRUE); // Next gets hung after this one fnd:*pn=item; pn=&item->link; // Its a folder item->state=FXDirItem::FOLDER|FXDirItem::HASITEMS; // Assume no associations fileassoc=NULL; drivetype=GetDriveTypeA(name.text()); switch(drivetype){ case DRIVE_REMOVABLE: if(name[0]=='A' || name[0]=='B'){ openicon=floppyicon; closedicon=floppyicon; } else{ openicon=zipdiskicon; closedicon=zipdiskicon; } break; case DRIVE_REMOTE: openicon=networkicon; closedicon=networkicon; break; case DRIVE_CDROM: openicon=cdromicon; closedicon=cdromicon; break; case DRIVE_RAMDISK: openicon=open_folder; closedicon=closed_folder; break; case DRIVE_FIXED: openicon=harddiskicon; closedicon=harddiskicon; break; case DRIVE_UNKNOWN: case DRIVE_NO_ROOT_DIR: default: openicon=open_folder; closedicon=closed_folder; break; } if(associations) fileassoc=associations->findDirBinding(name.text()); // If association is found, use it if(fileassoc){ if(fileassoc->miniicon) closedicon=fileassoc->miniicon; if(fileassoc->miniiconopen) openicon=fileassoc->miniiconopen; } // Update item information item->openIcon=openicon; item->closedIcon=closedicon; item->size=0L; item->assoc=fileassoc; item->date=0; // Create item if(id()) item->create(); } // Wipe items remaining in list:- they have disappeared!! for(item=oldlist; item; item=link){ link=item->link; removeItem(item,TRUE); } // Remember new list list=newlist; } #endif /*******************************************************************************/ // List child items void FXDirList::listChildItems(FXDirItem *par){ FXDirItem *oldlist,*newlist,**po,**pp,**pn,*item,*link; FXIcon *openicon; FXIcon *closedicon; FXFileAssoc *fileassoc; FXString pathname; FXString directory; FXString name; FXStat info; FXint islink; FXDir dir; // Path to parent node directory=getItemPathname(par); // Build new insert-order list oldlist=par->list; newlist=NULL; // Assemble lists po=&oldlist; pn=&newlist; // Assume not a link islink=FALSE; // Managed to open directory if(dir.open(directory)){ // Process directory entries while(dir.next()){ // Get name of entry name=dir.name(); // A dot special file? if(name[0]=='.' && (name[1]==0 || (name[1]=='.' && name[2]==0))) continue; // Hidden file or directory normally not shown if(name[0]=='.' && !(options&DIRLIST_SHOWHIDDEN)) continue; // Build full pathname of entry pathname=directory; if(!ISPATHSEP(pathname[pathname.length()-1])) pathname+=PATHSEPSTRING; pathname+=name; #ifndef WIN32 // Get file/link info if(!FXStat::statLink(pathname,info)) continue; // If its a link, get the info on file itself islink=info.isLink(); if(islink && !FXStat::statFile(pathname,info)) continue; #else // Get file/link info if(!FXStat::statFile(pathname,info)) continue; // Hidden file or directory normally not shown if(info.isHidden() && !(options&DIRLIST_SHOWHIDDEN)) continue; #endif // If it is not a directory, and not showing files and matching pattern skip it if(!info.isDirectory() && !((options&DIRLIST_SHOWFILES) && FXPath::match(pattern,name,matchmode))) continue; // Find it, and take it out from the old list if found for(pp=po; (item=*pp)!=NULL; pp=&item->link){ if(compare(item->label,name)==0){ *pp=item->link; item->link=NULL; po=pp; goto fnd; } } // Not found; prepend before list item=(FXDirItem*)appendItem(par,name,open_folder,closed_folder,NULL,TRUE); // Next gets hung after this one fnd: *pn=item; pn=&item->link; // Item flags if(info.isExecutable()){item->state|=FXDirItem::EXECUTABLE;}else{item->state&=~FXDirItem::EXECUTABLE;} if(info.isDirectory()){item->state|=FXDirItem::FOLDER;item->state&=~FXDirItem::EXECUTABLE;}else{item->state&=~(FXDirItem::FOLDER|FXDirItem::HASITEMS);} if(info.isCharacter()){item->state|=FXDirItem::CHARDEV;item->state&=~FXDirItem::EXECUTABLE;}else{item->state&=~FXDirItem::CHARDEV;} if(info.isBlock()){item->state|=FXDirItem::BLOCKDEV;item->state&=~FXDirItem::EXECUTABLE;}else{item->state&=~FXDirItem::BLOCKDEV;} if(info.isFifo()){item->state|=FXDirItem::FIFO;item->state&=~FXDirItem::EXECUTABLE;}else{item->state&=~FXDirItem::FIFO;} if(info.isSocket()){item->state|=FXDirItem::SOCK;item->state&=~FXDirItem::EXECUTABLE;}else{item->state&=~FXDirItem::SOCK;} if(islink){item->state|=FXDirItem::SYMLINK;}else{item->state&=~FXDirItem::SYMLINK;} // We can drag items only if we can drop them to item->setDraggable(TRUE); // Assume no associations fileassoc=NULL; // Determine icons and type if(item->isDirectory()){ openicon=open_folder; closedicon=closed_folder; if(associations) fileassoc=associations->findDirBinding(pathname.text()); } else if(item->isExecutable()){ openicon=mini_app; closedicon=mini_app; if(associations) fileassoc=associations->findExecBinding(pathname.text()); } else{ openicon=mini_doc; closedicon=mini_doc; if(associations) fileassoc=associations->findFileBinding(pathname.text()); } // If association is found, use it if(fileassoc){ if(fileassoc->miniicon) closedicon=fileassoc->miniicon; if(fileassoc->miniiconopen) openicon=fileassoc->miniiconopen; } // Update item information item->openIcon=openicon; item->closedIcon=closedicon; item->size=info.size(); item->assoc=fileassoc; item->date=info.modified(); // Create item if(id()) item->create(); } // Close it dir.close(); } // Wipe items remaining in list:- they have disappeared!! for(item=oldlist; item; item=link){ link=item->link; removeItem(item,TRUE); } // Now we know for sure whether we really have subitems or not if(par->first) par->state|=FXDirItem::HASITEMS; else par->state&=~FXDirItem::HASITEMS; // Remember new list par->list=newlist; // Need to layout recalc(); } /*******************************************************************************/ // Is directory FXbool FXDirList::isItemDirectory(const FXTreeItem* item) const { return item && (item->state&FXDirItem::FOLDER); } // Is file FXbool FXDirList::isItemFile(const FXTreeItem* item) const { return item && !(item->state&(FXDirItem::FOLDER|FXDirItem::CHARDEV|FXDirItem::BLOCKDEV|FXDirItem::FIFO|FXDirItem::SOCK)); } // Is executable FXbool FXDirList::isItemExecutable(const FXTreeItem* item) const { return item && (item->state&FXDirItem::EXECUTABLE); } // Return absolute pathname of item FXString FXDirList::getItemPathname(const FXTreeItem* item) const { FXString pathname; if(item){ while(1){ pathname.prepend(item->getText()); item=item->parent; if(!item) break; if(item->parent) pathname.prepend(PATHSEP); } } return pathname; } // Return the item from the absolute pathname FXTreeItem* FXDirList::getPathnameItem(const FXString& path){ register FXTreeItem *item,*it; register FXint beg=0,end=0; FXString name; if(!path.empty()){ #ifndef WIN32 if(ISPATHSEP(path[0])) end++; #else if(ISPATHSEP(path[0])){ end++; if(ISPATHSEP(path[1])) end++; } else if(Ascii::isLetter((FXuchar)path[0]) && path[1]==':'){ end+=2; if(ISPATHSEP(path[2])) end++; } #endif if(begnext){ #ifndef WIN32 if(compare(name,it->getText())==0) goto x; #else if(comparecase(name,it->getText())==0) goto x; #endif } listRootItems(); sortRootItems(); for(it=firstitem; it; it=it->next){ #ifndef WIN32 if(compare(name,it->getText())==0) goto x; #else if(comparecase(name,it->getText())==0) goto x; #endif } return NULL; x: item=it; FXASSERT(item); while(endfirst; it; it=it->next){ #ifndef WIN32 if(compare(name,it->getText())==0) goto y; #else if(comparecase(name,it->getText())==0) goto y; #endif } listChildItems((FXDirItem*)item); sortChildItems(item); for(it=item->first; it; it=it->next){ #ifndef WIN32 if(compare(name,it->getText())==0) goto y; #else if(comparecase(name,it->getText())==0) goto y; #endif } return item; y: item=it; FXASSERT(item); if(endstate&FXDirItem::FOLDER) return getItemPathname(item); item=item->parent; } return ""; } // Set current (dir/file) name path void FXDirList::setCurrentFile(const FXString& pathname,FXbool notify){ FXTRACE((100,"%s::setCurrentFile(%s)\n",getClassName(),pathname.text())); if(!pathname.empty()){ FXString path=FXPath::absolute(getItemPathname(currentitem),pathname); while(!FXPath::isTopDirectory(path) && !FXStat::exists(path)){ path=FXPath::upLevel(path); } FXTreeItem *item=getPathnameItem(path); makeItemVisible(item); setAnchorItem(item); setCurrentItem(item,notify); if(item){ selectItem(item); } } } // Get current (dir/file) name path FXString FXDirList::getCurrentFile() const { return getItemPathname(currentitem); } // Get list style FXbool FXDirList::showFiles() const { return (options&DIRLIST_SHOWFILES)!=0; } // Change list style void FXDirList::showFiles(FXbool showing){ FXuint opts=options; if(showing) opts|=DIRLIST_SHOWFILES; else opts&=~DIRLIST_SHOWFILES; if(options!=opts){ options=opts; scan(TRUE); } } // Return TRUE if showing hidden files FXbool FXDirList::showHiddenFiles() const { return (options&DIRLIST_SHOWHIDDEN)!=0; } // Change show hidden files mode void FXDirList::showHiddenFiles(FXbool showing){ FXuint opts=options; if(showing) opts|=DIRLIST_SHOWHIDDEN; else opts&=~DIRLIST_SHOWHIDDEN; if(opts!=options){ options=opts; scan(TRUE); } } // Change associations table; force a rescan so as to // update the bindings in each item to the new associations void FXDirList::setAssociations(FXFileDict* assocs){ if(associations!=assocs){ associations=assocs; scan(TRUE); } } // Set the pattern to filter void FXDirList::setPattern(const FXString& ptrn){ if(ptrn.empty()) return; if(pattern!=ptrn){ pattern=ptrn; scan(TRUE); } } // Change file match mode void FXDirList::setMatchMode(FXuint mode){ if(matchmode!=mode){ matchmode=mode; scan(TRUE); } } // Save data void FXDirList::save(FXStream& store) const { FXTreeList::save(store); store << associations; store << pattern; store << matchmode; store << closed_folder; store << open_folder; store << mini_doc; store << mini_app; } // Load data void FXDirList::load(FXStream& store){ FXTreeList::load(store); store >> associations; store >> pattern; store >> matchmode; store >> closed_folder; store >> open_folder; store >> mini_doc; store >> mini_app; } // Cleanup FXDirList::~FXDirList(){ clearItems(); getApp()->removeTimeout(this,ID_REFRESHTIMER); if(!(options&DIRLIST_NO_OWN_ASSOC)) delete associations; delete closed_folder; delete open_folder; delete mini_doc; delete mini_app; delete cdromicon; delete harddiskicon; delete networkicon; delete floppyicon; delete zipdiskicon; associations=(FXFileDict*)-1L; closed_folder=(FXGIFIcon*)-1L; open_folder=(FXGIFIcon*)-1L; mini_doc=(FXGIFIcon*)-1L; mini_app=(FXGIFIcon*)-1L; cdromicon=(FXIcon*)-1L; harddiskicon=(FXIcon*)-1L; networkicon=(FXIcon*)-1L; floppyicon=(FXIcon*)-1L; zipdiskicon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXDirSelector.cpp000066400000000000000000000426031326741342000166120ustar00rootroot00000000000000/******************************************************************************** * * * D i r e c t o r y S e l e c t i o n W i d g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDirSelector.cpp,v 1.51 2006/01/22 17:58:23 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSystem.h" #include "FXPath.h" #include "FXStat.h" #include "FXFile.h" #include "FXDir.h" #include "FXObjectList.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXRecentFiles.h" #include "FXApp.h" #include "FXFont.h" #include "FXGIFIcon.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXButton.h" #include "FXMenuButton.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXShell.h" #include "FXPopup.h" #include "FXMenuPane.h" #include "FXScrollBar.h" #include "FXTextField.h" #include "FXScrollArea.h" #include "FXTreeList.h" #include "FXTreeListBox.h" #include "FXVerticalFrame.h" #include "FXHorizontalFrame.h" #include "FXDirList.h" #include "FXList.h" #include "FXListBox.h" #include "FXDirSelector.h" #include "FXMenuCaption.h" #include "FXMenuCommand.h" #include "FXMenuCascade.h" #include "FXMenuRadio.h" #include "FXMenuCheck.h" #include "FXMenuSeparator.h" #include "FXTopWindow.h" #include "FXDialogBox.h" #include "FXInputDialog.h" #include "FXSeparator.h" #include "FXMessageBox.h" #include "icons.h" /* Notes: - Need a button to quickly hop to home directory. - Need a button to hop to current working directory. - Keep list of recently visited places. - Need button to hide/show hidden directories. */ #define DIRSTYLEMASK (TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|TREELIST_ROOT_BOXES) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXDirSelector) FXDirSelectorMap[]={ FXMAPFUNC(SEL_COMMAND,FXDirSelector::ID_DIRNAME,FXDirSelector::onCmdName), FXMAPFUNC(SEL_OPENED,FXDirSelector::ID_DIRLIST,FXDirSelector::onCmdOpened), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,FXDirSelector::ID_DIRLIST,FXDirSelector::onPopupMenu), FXMAPFUNC(SEL_COMMAND,FXDirSelector::ID_HOME,FXDirSelector::onCmdHome), FXMAPFUNC(SEL_COMMAND,FXDirSelector::ID_WORK,FXDirSelector::onCmdWork), FXMAPFUNC(SEL_COMMAND,FXDirSelector::ID_DIRECTORY_UP,FXDirSelector::onCmdDirectoryUp), FXMAPFUNC(SEL_COMMAND,FXDirSelector::ID_VISIT,FXDirSelector::onCmdVisit), FXMAPFUNC(SEL_COMMAND,FXDirSelector::ID_BOOKMARK,FXDirSelector::onCmdBookmark), FXMAPFUNC(SEL_COMMAND,FXDirSelector::ID_NEW,FXDirSelector::onCmdNew), FXMAPFUNC(SEL_UPDATE,FXDirSelector::ID_NEW,FXDirSelector::onUpdNew), FXMAPFUNC(SEL_UPDATE,FXDirSelector::ID_DELETE,FXDirSelector::onUpdSelected), FXMAPFUNC(SEL_COMMAND,FXDirSelector::ID_DELETE,FXDirSelector::onCmdDelete), FXMAPFUNC(SEL_UPDATE,FXDirSelector::ID_MOVE,FXDirSelector::onUpdSelected), FXMAPFUNC(SEL_COMMAND,FXDirSelector::ID_MOVE,FXDirSelector::onCmdMove), FXMAPFUNC(SEL_UPDATE,FXDirSelector::ID_COPY,FXDirSelector::onUpdSelected), FXMAPFUNC(SEL_COMMAND,FXDirSelector::ID_COPY,FXDirSelector::onCmdCopy), FXMAPFUNC(SEL_UPDATE,FXDirSelector::ID_LINK,FXDirSelector::onUpdSelected), FXMAPFUNC(SEL_COMMAND,FXDirSelector::ID_LINK,FXDirSelector::onCmdLink), }; // Implementation FXIMPLEMENT(FXDirSelector,FXPacker,FXDirSelectorMap,ARRAYNUMBER(FXDirSelectorMap)) // Make directory selector widget FXDirSelector::FXDirSelector(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h):FXPacker(p,opts,x,y,w,h),mrufiles(p->getApp(),"Visited Directories"){ FXString currentdirectory=FXSystem::getCurrentDirectory(); FXAccelTable *table=getShell()->getAccelTable(); target=tgt; message=sel; FXHorizontalFrame *buttons=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH); accept=new FXButton(buttons,tr("&OK"),NULL,NULL,0,BUTTON_INITIAL|BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0,20,20); cancel=new FXButton(buttons,tr("&Cancel"),NULL,NULL,0,BUTTON_DEFAULT|LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK,0,0,0,0,20,20); FXHorizontalFrame *field=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); new FXLabel(field,tr("&Directory:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y); dirname=new FXTextField(field,25,this,ID_DIRNAME,LAYOUT_FILL_X|LAYOUT_CENTER_Y|FRAME_SUNKEN|FRAME_THICK); FXHorizontalFrame *frame=new FXHorizontalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0,0,0,0,0); dirbox=new FXDirList(frame,this,ID_DIRLIST,LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|TREELIST_BROWSESELECT); updiricon=new FXGIFIcon(getApp(),dirupicon); homeicon=new FXGIFIcon(getApp(),gotohome); workicon=new FXGIFIcon(getApp(),gotowork); markicon=new FXGIFIcon(getApp(),bookset); clearicon=new FXGIFIcon(getApp(),bookclr); newicon=new FXGIFIcon(getApp(),foldernew); deleteicon=new FXGIFIcon(getApp(),filedelete); moveicon=new FXGIFIcon(getApp(),filemove); copyicon=new FXGIFIcon(getApp(),filecopy); linkicon=new FXGIFIcon(getApp(),filelink); mrufiles.setTarget(this); mrufiles.setSelector(ID_VISIT); if(table){ table->addAccel(MKUINT(KEY_BackSpace,0),this,FXSEL(SEL_COMMAND,ID_DIRECTORY_UP)); table->addAccel(MKUINT(KEY_h,CONTROLMASK),this,FXSEL(SEL_COMMAND,ID_HOME)); table->addAccel(MKUINT(KEY_w,CONTROLMASK),this,FXSEL(SEL_COMMAND,ID_WORK)); } dirbox->setDirectory(currentdirectory); dirname->setText(currentdirectory); dirbox->setFocus(); } // Set directory void FXDirSelector::setDirectory(const FXString& path){ dirname->setText(path); dirbox->setDirectory(path); } // Return directory FXString FXDirSelector::getDirectory() const { return dirname->getText(); } // Return TRUE if showing files as well as directories FXbool FXDirSelector::showFiles() const { return dirbox->showFiles(); } // Show or hide normal files void FXDirSelector::showFiles(FXbool showing){ dirbox->showFiles(showing); } // Return TRUE if showing hidden files FXbool FXDirSelector::showHiddenFiles() const { return dirbox->showHiddenFiles(); } // Show or hide hidden files void FXDirSelector::showHiddenFiles(FXbool showing){ dirbox->showHiddenFiles(showing); } // Change wildcard matching mode void FXDirSelector::setMatchMode(FXuint mode){ dirbox->setMatchMode(mode); } // Return wildcard matching mode FXuint FXDirSelector::getMatchMode() const { return dirbox->getMatchMode(); } // Change directory list style void FXDirSelector::setDirBoxStyle(FXuint style){ dirbox->setListStyle((dirbox->getListStyle()&~DIRSTYLEMASK) | (style&DIRSTYLEMASK)); } // Return directory list style FXuint FXDirSelector::getDirBoxStyle() const { return dirbox->getListStyle()&DIRSTYLEMASK; } // Typed in new directory name, open path in the tree long FXDirSelector::onCmdName(FXObject*,FXSelector,void*){ dirbox->setDirectory(dirname->getText()); return 1; } // Opened an item, making it the current one long FXDirSelector::onCmdOpened(FXObject*,FXSelector,void* ptr){ const FXTreeItem* item=(const FXTreeItem*)ptr; dirname->setText(dirbox->getItemPathname(item)); return 1; } // Back to home directory long FXDirSelector::onCmdHome(FXObject*,FXSelector,void*){ setDirectory(FXSystem::getHomeDirectory()); return 1; } // Back to current working directory long FXDirSelector::onCmdWork(FXObject*,FXSelector,void*){ setDirectory(FXSystem::getCurrentDirectory()); return 1; } // User clicked up directory button long FXDirSelector::onCmdDirectoryUp(FXObject*,FXSelector,void*){ setDirectory(FXPath::upLevel(getDirectory())); return 1; } // Move to recent directory long FXDirSelector::onCmdVisit(FXObject*,FXSelector,void* ptr){ setDirectory((FXchar*)ptr); return 1; } // Bookmark this directory long FXDirSelector::onCmdBookmark(FXObject*,FXSelector,void*){ mrufiles.appendFile(dirbox->getDirectory()); return 1; } // Create new directory long FXDirSelector::onCmdNew(FXObject*,FXSelector,void*){ FXGIFIcon newdirectoryicon(getApp(),bigfolder); FXString dir=dirbox->getDirectory(); FXString name="DirectoryName"; if(FXInputDialog::getString(name,this,tr("Create New Directory"),"Create new directory in: "+dir,&newdirectoryicon)){ FXString dirname=FXPath::absolute(dir,name); if(FXStat::exists(dirname)){ FXMessageBox::error(this,MBOX_OK,tr("Already Exists"),"File or directory %s already exists.\n",dirname.text()); return 1; } if(!FXDir::create(dirname)){ FXMessageBox::error(this,MBOX_OK,tr("Cannot Create"),"Cannot create directory %s.\n",dirname.text()); return 1; } setDirectory(dirname); } return 1; } // Update create new directory long FXDirSelector::onUpdNew(FXObject* sender,FXSelector,void*){ FXString dir=dirbox->getDirectory(); sender->handle(this,FXStat::isWritable(dir)?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Copy file or directory long FXDirSelector::onCmdCopy(FXObject*,FXSelector,void*){ FXString oldname=dirbox->getCurrentFile(); FXString newname=FXPath::directory(oldname)+PATHSEPSTRING "CopyOf"+FXPath::name(oldname); FXInputDialog inputdialog(this,tr("Copy File"),"Copy file from location:\n\n"+oldname+"\n\nto location:",NULL,INPUTDIALOG_STRING,0,0,0,0); inputdialog.setText(newname); inputdialog.setNumColumns(60); if(inputdialog.execute()){ newname=inputdialog.getText(); if(!FXFile::copyFiles(oldname,newname,FALSE)){ FXMessageBox::error(this,MBOX_OK,tr("Error Copying File"),"Unable to copy file:\n\n%s to: %s.",oldname.text(),newname.text()); } } return 1; } // Move file or directory long FXDirSelector::onCmdMove(FXObject*,FXSelector,void*){ FXString oldname=dirbox->getCurrentFile(); FXString newname=oldname; FXInputDialog inputdialog(this,tr("Move File"),"Move file from location:\n\n"+oldname+"\n\nto location:",NULL,INPUTDIALOG_STRING,0,0,0,0); inputdialog.setText(newname); inputdialog.setNumColumns(60); if(inputdialog.execute()){ newname=inputdialog.getText(); if(!FXFile::moveFiles(oldname,newname,FALSE)){ FXMessageBox::error(this,MBOX_OK,tr("Error Moving File"),"Unable to move file:\n\n%s to: %s.",oldname.text(),newname.text()); } } return 1; } // Link file or directory long FXDirSelector::onCmdLink(FXObject*,FXSelector,void*){ FXString oldname=dirbox->getCurrentFile(); FXString newname=FXPath::directory(oldname)+PATHSEPSTRING "LinkTo"+FXPath::name(oldname); FXInputDialog inputdialog(this,tr("Link File"),"Link file from location:\n\n"+oldname+"\n\nto location:",NULL,INPUTDIALOG_STRING,0,0,0,0); inputdialog.setText(newname); inputdialog.setNumColumns(60); if(inputdialog.execute()){ newname=inputdialog.getText(); if(!FXFile::symlink(oldname,newname)){ FXMessageBox::error(this,MBOX_YES_NO,tr("Error Linking File"),"Unable to link file:\n\n%s to: %s.",oldname.text(),newname.text()); } } return 1; } // Delete file or directory long FXDirSelector::onCmdDelete(FXObject*,FXSelector,void*){ FXString fullname=dirbox->getCurrentFile(); if(MBOX_CLICKED_YES==FXMessageBox::warning(this,MBOX_YES_NO,tr("Deleting file"),"Are you sure you want to delete the file:\n\n%s",fullname.text())){ if(!FXFile::removeFiles(fullname,TRUE)){ FXMessageBox::error(this,MBOX_YES_NO,tr("Error Deleting File"),"Unable to delete file:\n\n%s.",fullname.text()); } } return 1; } // Sensitize when files are selected long FXDirSelector::onUpdSelected(FXObject* sender,FXSelector,void*){ sender->handle(this,dirbox->getCurrentItem()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Popup menu for item in file list long FXDirSelector::onPopupMenu(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; if(event->moved) return 1; FXMenuPane filemenu(this); new FXMenuCommand(&filemenu,tr("Up one level"),updiricon,this,ID_DIRECTORY_UP); new FXMenuCommand(&filemenu,tr("Home directory"),homeicon,this,ID_HOME); new FXMenuCommand(&filemenu,tr("Work directory"),workicon,this,ID_WORK); new FXMenuSeparator(&filemenu); FXMenuPane sortmenu(this); new FXMenuCascade(&filemenu,tr("Sorting"),NULL,&sortmenu); new FXMenuCheck(&sortmenu,tr("Reverse"),dirbox,FXDirList::ID_SORT_REVERSE); new FXMenuCheck(&sortmenu,tr("Ignore case"),dirbox,FXDirList::ID_SORT_CASE); new FXMenuCheck(&sortmenu,tr("Hidden files"),dirbox,FXDirList::ID_TOGGLE_HIDDEN); FXMenuPane bookmenu(this); new FXMenuCascade(&filemenu,tr("Bookmarks"),NULL,&bookmenu); new FXMenuCommand(&bookmenu,tr("Set bookmark"),markicon,this,ID_BOOKMARK); new FXMenuCommand(&bookmenu,tr("Clear bookmarks"),clearicon,&mrufiles,FXRecentFiles::ID_CLEAR); FXMenuSeparator* sep1=new FXMenuSeparator(&bookmenu); sep1->setTarget(&mrufiles); sep1->setSelector(FXRecentFiles::ID_ANYFILES); new FXMenuCommand(&bookmenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_1); new FXMenuCommand(&bookmenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_2); new FXMenuCommand(&bookmenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_3); new FXMenuCommand(&bookmenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_4); new FXMenuCommand(&bookmenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_5); new FXMenuCommand(&bookmenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_6); new FXMenuCommand(&bookmenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_7); new FXMenuCommand(&bookmenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_8); new FXMenuCommand(&bookmenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_9); new FXMenuCommand(&bookmenu,FXString::null,NULL,&mrufiles,FXRecentFiles::ID_FILE_10); new FXMenuSeparator(&filemenu); new FXMenuCommand(&filemenu,tr("New directory..."),newicon,this,ID_NEW); new FXMenuCommand(&filemenu,tr("Copy..."),copyicon,this,ID_COPY); new FXMenuCommand(&filemenu,tr("Move..."),moveicon,this,ID_MOVE); new FXMenuCommand(&filemenu,tr("Link..."),linkicon,this,ID_LINK); new FXMenuCommand(&filemenu,tr("Delete..."),deleteicon,this,ID_DELETE); filemenu.create(); filemenu.popup(NULL,event->root_x,event->root_y); getApp()->runModalWhileShown(&filemenu); return 1; } // Save data void FXDirSelector::save(FXStream& store) const { FXPacker::save(store); store << dirbox; store << dirname; store << accept; store << cancel; store << updiricon; store << homeicon; store << workicon; store << markicon; store << clearicon; store << newicon; store << deleteicon; store << moveicon; store << copyicon; store << linkicon; } // Load data void FXDirSelector::load(FXStream& store){ FXPacker::load(store); store >> dirbox; store >> dirname; store >> accept; store >> cancel; store >> updiricon; store >> homeicon; store >> workicon; store >> markicon; store >> clearicon; store >> newicon; store >> deleteicon; store >> moveicon; store >> copyicon; store >> linkicon; } // Clean up FXDirSelector::~FXDirSelector(){ FXAccelTable *table=getShell()->getAccelTable(); if(table){ table->removeAccel(MKUINT(KEY_BackSpace,0)); table->removeAccel(MKUINT(KEY_h,CONTROLMASK)); table->removeAccel(MKUINT(KEY_w,CONTROLMASK)); } delete updiricon; delete homeicon; delete workicon; delete markicon; delete clearicon; delete newicon; delete deleteicon; delete moveicon; delete copyicon; delete linkicon; dirbox=(FXDirList*)-1L; dirname=(FXTextField*)-1L; accept=(FXButton*)-1L; cancel=(FXButton*)-1L; updiricon=(FXIcon*)-1L; homeicon=(FXIcon*)-1L; workicon=(FXIcon*)-1L; markicon=(FXIcon*)-1L; clearicon=(FXIcon*)-1L; newicon=(FXIcon*)-1L; deleteicon=(FXIcon*)-1L; moveicon=(FXIcon*)-1L; copyicon=(FXIcon*)-1L; linkicon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXDockBar.cpp000066400000000000000000000544351326741342000157060ustar00rootroot00000000000000/******************************************************************************** * * * D o c k S i t e W i d g e t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDockBar.cpp,v 1.37.2.1 2006/05/10 13:18:13 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXGIFIcon.h" #include "FXDCWindow.h" #include "FXDrawable.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXPopup.h" #include "FXMenuPane.h" #include "FXMenuCaption.h" #include "FXMenuCommand.h" #include "FXMenuCascade.h" #include "FXMenuSeparator.h" #include "FXMenuRadio.h" #include "FXMenuCheck.h" #include "FXShell.h" #include "FXSeparator.h" #include "FXTopWindow.h" #include "FXDockBar.h" #include "FXDockSite.h" #include "FXToolBarGrip.h" #include "FXToolBarShell.h" #include "icons.h" /* Notes: Jeroen's Theory of Docking Because if I don't write this down, no one will *ever* figure this out! We assume here we're docking a horizontally oriented bar inside a horizontally oriented dock. Vertical orientation works, of course, completely analoguous. Docking a floating bar. When dragging a floating bar, we call findDockNear() to determine which dock site this bar could dock into. This dock site is a sibling of the current widget remembered in the drydock variable. The routine findDockNear() invokes insideDock() to determine if a docking could take place or not. Not all dock sites are available for docking. Some dock bars have a preferred orientation and can not be docked everywhere. To this end, the dock bar maintains a member variable allowed which contains the set of sides that the bar is allowed to dock at. When findDockNear() returns a non-NULL value, a potential dock site has been found; a timer is set to dock at this site if the cursor hovers near its current position:- we don't dock immediately, since the user may be just moving the bar across a potential dock site on his way to another place on the screen. When the dragging ends, or when the timer expires, the bar is docked at the dock site. Subsequent dragging will simply move the bar inside the dock site, and just rearrange the dock site. Floating a docked bar. When moving a docked bar, dragging it simply rearranges the order of the bars inside the dock, until such time that the bar is substantially moved away from the dock site, as determined by insideDock(). Then the dock bar is reparented under the toolbar shell and subsequent movement will simply move the floaring bar. The function insideDock() determines if a proposed position is to be considered docked or non-docked. This is determined differently, based on whether the bar is currently docked or not: 1 If the bar is docked, we consider the proposed bar position undocked when the upper edge is FUDGE pixels above the dock site, or when the lower edge is FUDGE pixels below the dock site. 2 Alternatively, if the bar is floating, we consider the bar position docked when the upper or lower edge of the bar is within PROXIMITY inside the dock site. 3 In addition to 1 and 2, we also require that the horizontal alignment of the dock bar and dock site are within a certain TOLERANCE. This is determined differently depending on whether the bar is wider than the site or not: a If the bar is wider, we want the dock site within -TOLERANCE to bar width + TOLERANCE relative to the bar. b If the dock site is wider, we want the bar to be within -TOLERANCE to docksite width + TOLERANCE relative to the site. c A minor wrinkle is that if the bar is stretched (LAYOUT_FILL_X), we don't use the current width of the bar in the above calculations, but the default width instead; this is because a subsequent undocking, which would shrink-wrap around the dock bar, leaves a smaller widget and this may then immediately redock again. 4 If the above tests indicate that the bar is docked, insideDock() returns true. When undocking a bar, the arrangement inside the dock site needs to stay the same for the remaining bars [if any]. Thus, we call undockToolBar() to inform the dock site that one of its bars will be removed. Depending on its own internal layout algorithm, the dock site will then be able to adjust the options of the remaining bars so that they stay in place. When docking a bar, we need to figure out where the new bar goes. To that end, dockToolBar() informs the dock site to determine where the new bar goes and adjust the layout options of the other dock bars accordingly. If the dock bar is moved, the dock site is informed by moveToolBar() which lets the dock site then rearrange the layouts according to the new bar position. */ #define FUDGE 30 // Vertical distance beyond which bar pulls out #define PROXIMITY 10 // Vertical proximity below which bar is sucked int dock #define TOLERANCE 30 // Horizontal alignment tolerance beyond which bar pulls out // Docking side #define LAYOUT_SIDE_MASK (LAYOUT_SIDE_LEFT|LAYOUT_SIDE_RIGHT|LAYOUT_SIDE_TOP|LAYOUT_SIDE_BOTTOM) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXDockBar) FXDockBarMap[]={ FXMAPFUNC(SEL_FOCUS_PREV,0,FXDockBar::onFocusLeft), FXMAPFUNC(SEL_FOCUS_NEXT,0,FXDockBar::onFocusRight), FXMAPFUNC(SEL_UPDATE,FXDockBar::ID_DOCK_FLOAT,FXDockBar::onUpdUndock), FXMAPFUNC(SEL_UPDATE,FXDockBar::ID_DOCK_TOP,FXDockBar::onUpdDockTop), FXMAPFUNC(SEL_UPDATE,FXDockBar::ID_DOCK_BOTTOM,FXDockBar::onUpdDockBottom), FXMAPFUNC(SEL_UPDATE,FXDockBar::ID_DOCK_LEFT,FXDockBar::onUpdDockLeft), FXMAPFUNC(SEL_UPDATE,FXDockBar::ID_DOCK_RIGHT,FXDockBar::onUpdDockRight), FXMAPFUNC(SEL_UPDATE,FXDockBar::ID_DOCK_FLIP,FXDockBar::onUpdDockFlip), FXMAPFUNC(SEL_COMMAND,FXDockBar::ID_DOCK_FLOAT,FXDockBar::onCmdUndock), FXMAPFUNC(SEL_COMMAND,FXDockBar::ID_DOCK_TOP,FXDockBar::onCmdDockTop), FXMAPFUNC(SEL_COMMAND,FXDockBar::ID_DOCK_BOTTOM,FXDockBar::onCmdDockBottom), FXMAPFUNC(SEL_COMMAND,FXDockBar::ID_DOCK_LEFT,FXDockBar::onCmdDockLeft), FXMAPFUNC(SEL_COMMAND,FXDockBar::ID_DOCK_RIGHT,FXDockBar::onCmdDockRight), FXMAPFUNC(SEL_BEGINDRAG,FXDockBar::ID_TOOLBARGRIP,FXDockBar::onBeginDragGrip), FXMAPFUNC(SEL_ENDDRAG,FXDockBar::ID_TOOLBARGRIP,FXDockBar::onEndDragGrip), FXMAPFUNC(SEL_DRAGGED,FXDockBar::ID_TOOLBARGRIP,FXDockBar::onDraggedGrip), FXMAPFUNC(SEL_TIMEOUT,FXDockBar::ID_TIMER,FXDockBar::onDockTimer), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,FXDockBar::ID_TOOLBARGRIP,FXDockBar::onPopupMenu), }; // Object implementation FXIMPLEMENT(FXDockBar,FXPacker,FXDockBarMap,ARRAYNUMBER(FXDockBarMap)) // Deserialization FXDockBar::FXDockBar():drydock(NULL),wetdock(NULL){ flags|=FLAG_ENABLED; gripx=0; gripy=0; allowed=ALLOW_EVERYWHERE; } // Make a dockable and, possibly, floatable toolbar FXDockBar::FXDockBar(FXComposite* p,FXComposite* q,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXPacker(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs),drydock(p),wetdock(q){ flags|=FLAG_ENABLED; gripx=0; gripy=0; allowed=ALLOW_EVERYWHERE; } // Make a non-floatable toolbar FXDockBar::FXDockBar(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXPacker(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs),drydock(NULL),wetdock(NULL){ flags|=FLAG_ENABLED; gripx=0; gripy=0; allowed=ALLOW_EVERYWHERE; } // Return true if toolbar is docked FXbool FXDockBar::isDocked() const { return (getParent()!=wetdock); } // Set parent when docked, if it was docked it will remain docked void FXDockBar::setDryDock(FXComposite* dry){ if(dry && dry->id() && getParent()==drydock){ reparent(dry,NULL); } drydock=dry; } // Set parent when floating void FXDockBar::setWetDock(FXComposite* wet){ if(wet && wet->id() && getParent()==wetdock){ reparent(wet,NULL); } wetdock=wet; } // Dock the bar before other window void FXDockBar::dock(FXDockSite* docksite,FXWindow* before,FXbool notify){ if(docksite && getParent()!=docksite){ setDryDock(docksite); reparent(docksite,before); wetdock->hide(); docksite->dockToolBar(this,before); if(notify && target){target->tryHandle(this,FXSEL(SEL_DOCKED,message),docksite);} } } // Dock the bar near position in dock site void FXDockBar::dock(FXDockSite* docksite,FXint localx,FXint localy,FXbool notify){ if(docksite && getParent()!=docksite){ setDryDock(docksite); reparent(docksite,NULL); wetdock->hide(); docksite->dockToolBar(this,localx,localy); if(notify && target){target->tryHandle(this,FXSEL(SEL_DOCKED,message),docksite);} } } // Undock the bar void FXDockBar::undock(FXint rootx,FXint rooty,FXbool notify){ FXDockSite* docksite=dynamic_cast(getParent()); if(wetdock && isDocked()){ if(docksite) docksite->undockToolBar(this); reparent(wetdock); wetdock->position(rootx,rooty,wetdock->getDefaultWidth(),wetdock->getDefaultHeight()); wetdock->show(); if(notify && target){target->tryHandle(this,FXSEL(SEL_FLOATED,message),docksite);} } } // Search siblings of drydock for first dock opportunity FXDockSite* FXDockBar::findDockAtSide(FXuint side){ register FXDockSite* docksite; register FXWindow *child; if(drydock){ child=drydock->getParent()->getFirst(); while(child){ docksite=dynamic_cast(child); if(docksite && docksite->shown() && side==(docksite->getLayoutHints()&LAYOUT_SIDE_MASK)) return docksite; child=child->getNext(); } } return NULL; } // Test if bar is inside docksite FXbool FXDockBar::insideDock(FXDockSite* docksite,FXint barx,FXint bary){ if(docksite){ // Bar size register FXint barw=getWidth(); register FXint barh=getHeight(); // Vertically oriented dock if(docksite->getLayoutHints()&LAYOUT_SIDE_LEFT){ // If docked, undock when left or right edge pulls out beyond FUDGE pixels from dock; when floating, dock when left or right edge moves within PROXIMITY of dock if(((getParent()==docksite) && (docksite->getX()-FUDGE<=barx && barx+barwgetX()+docksite->getWidth()+FUDGE)) || ((getParent()!=docksite) && ((docksite->getX()-PROXIMITY<=barx && barxgetX()+docksite->getWidth()+PROXIMITY) || (docksite->getX()-PROXIMITY<=barx+barw && barx+barw<=docksite->getX()+docksite->getWidth()+PROXIMITY)))){ // If filled, fudge the height if(getLayoutHints()&LAYOUT_FILL_Y) barh=getDefaultHeight(); // Test if either bar or dock "sticks out" too much to dock if(barh>docksite->getHeight()){ if(bary-TOLERANCE<=docksite->getY() && docksite->getY()+docksite->getHeight()<=bary+barh+TOLERANCE) return TRUE; } else{ if(docksite->getY()-TOLERANCE<=bary && bary+barh<=docksite->getY()+docksite->getHeight()+TOLERANCE) return TRUE; } } } // Horizontally oriented dock else{ // If docked, undock when upper or lower edge pulls out beyond FUDGE pixels from dock; when floating, dock when upper or lower edge moves within PROXIMITY of dock if(((getParent()==docksite) && (docksite->getY()-FUDGE<=bary && bary+barh<=docksite->getY()+docksite->getHeight()+FUDGE)) || ((getParent()!=docksite) && ((docksite->getY()-PROXIMITY<=bary && bary<=docksite->getY()+docksite->getHeight()+PROXIMITY) || (docksite->getY()-PROXIMITY<=bary+barh && bary+barh<=docksite->getY()+docksite->getHeight()+PROXIMITY)))){ // If filled, fudge the width if(getLayoutHints()&LAYOUT_FILL_X) barw=getDefaultWidth(); // Test if either bar or dock "sticks out" too much to dock if(barw>docksite->getWidth()){ if(barx-TOLERANCE<=docksite->getX() && docksite->getX()+docksite->getWidth()<=barx+barw+TOLERANCE) return TRUE; } else{ if(docksite->getX()-TOLERANCE<=barx && barx+barw<=docksite->getX()+docksite->getWidth()+TOLERANCE) return TRUE; } } } } return FALSE; } // Search siblings of drydock for dock opportunity near given coordinates FXDockSite* FXDockBar::findDockNear(FXint rootx,FXint rooty){ register FXDockSite *docksite; register FXWindow *child; FXint barx,bary; if(drydock){ // Translate without pain; assumes position of the top window is correct for(child=drydock->getParent(),barx=rootx,bary=rooty; child!=getRoot(); child=child->getParent()){ barx-=child->getX(); bary-=child->getY(); } // drydock->getParent()->translateCoordinatesFrom(barx,bary,getRoot(),rootx,rooty); // Localize dock site child=drydock->getParent()->getFirst(); while(child){ docksite=dynamic_cast(child); if(docksite && docksite->shown() && insideDock(docksite,barx,bary)){ if(docksite->getLayoutHints()&LAYOUT_SIDE_LEFT){ if(docksite->getLayoutHints()&LAYOUT_SIDE_BOTTOM){ // Right if(allowed&ALLOW_RIGHT) return docksite; } else{ // Left if(allowed&ALLOW_LEFT) return docksite; } } else{ if(docksite->getLayoutHints()&LAYOUT_SIDE_BOTTOM){ // Bottom if(allowed&ALLOW_BOTTOM) return docksite; } else{ // Top if(allowed&ALLOW_TOP) return docksite; } } } child=child->getNext(); } } return NULL; } // Undock long FXDockBar::onCmdUndock(FXObject*,FXSelector,void*){ FXint rootx,rooty; translateCoordinatesTo(rootx,rooty,getRoot(),8,8); undock(rootx,rooty,TRUE); return 1; } // Check if undocked long FXDockBar::onUpdUndock(FXObject* sender,FXSelector,void*){ sender->handle(this,(wetdock && wetdock!=getParent())?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Redock on top long FXDockBar::onCmdDockTop(FXObject*,FXSelector,void*){ // FXDockSite *docksite=findDockAtSide(LAYOUT_SIDE_TOP); // if(docksite){ // dock(docksite,0,docksite->getHeight()-20,TRUE); // } dock(findDockAtSide(LAYOUT_SIDE_TOP),NULL,TRUE); return 1; } // Check if docked at top long FXDockBar::onUpdDockTop(FXObject* sender,FXSelector,void*){ FXDockSite* docksite=findDockAtSide(LAYOUT_SIDE_TOP); sender->handle(this,(docksite && docksite!=getParent())?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Redock on bottom long FXDockBar::onCmdDockBottom(FXObject*,FXSelector,void*){ dock(findDockAtSide(LAYOUT_SIDE_BOTTOM),NULL,TRUE); return 1; } // Check if docked at bottom long FXDockBar::onUpdDockBottom(FXObject* sender,FXSelector,void*){ FXDockSite* docksite=findDockAtSide(LAYOUT_SIDE_BOTTOM); sender->handle(this,(docksite && docksite!=getParent())?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Redock on left long FXDockBar::onCmdDockLeft(FXObject*,FXSelector,void*){ dock(findDockAtSide(LAYOUT_SIDE_LEFT),NULL,TRUE); return 1; } // Check if docked at left long FXDockBar::onUpdDockLeft(FXObject* sender,FXSelector,void*){ FXDockSite* docksite=findDockAtSide(LAYOUT_SIDE_LEFT); sender->handle(this,(docksite && docksite!=getParent())?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Redock on right long FXDockBar::onCmdDockRight(FXObject*,FXSelector,void*){ dock(findDockAtSide(LAYOUT_SIDE_RIGHT),NULL,TRUE); return 1; } // Check if docked at right long FXDockBar::onUpdDockRight(FXObject* sender,FXSelector,void*){ FXDockSite* docksite=findDockAtSide(LAYOUT_SIDE_RIGHT); sender->handle(this,(docksite && docksite!=getParent())?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Check for flip long FXDockBar::onUpdDockFlip(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Right clicked on bar long FXDockBar::onPopupMenu(FXObject*,FXSelector,void* ptr){ FXEvent* event=static_cast(ptr); if(event->moved) return 1; FXMenuPane dockmenu(this); FXGIFIcon dockflipicon(getApp(),dockflip); FXGIFIcon docktopicon(getApp(),docktop,FXRGB(255,255,255),IMAGE_ALPHACOLOR); FXGIFIcon dockbottomicon(getApp(),dockbottom,FXRGB(255,255,255),IMAGE_ALPHACOLOR); FXGIFIcon docklefticon(getApp(),dockleft,FXRGB(255,255,255),IMAGE_ALPHACOLOR); FXGIFIcon dockrighticon(getApp(),dockright,FXRGB(255,255,255),IMAGE_ALPHACOLOR); FXGIFIcon dockfreeicon(getApp(),dockfree,FXRGB(255,255,255),IMAGE_ALPHACOLOR); new FXMenuCaption(&dockmenu,tr("Docking")); new FXMenuSeparator(&dockmenu); new FXMenuCommand(&dockmenu,tr("Top"),&docktopicon,this,ID_DOCK_TOP); new FXMenuCommand(&dockmenu,tr("Bottom"),&dockbottomicon,this,ID_DOCK_BOTTOM); new FXMenuCommand(&dockmenu,tr("Left"),&docklefticon,this,ID_DOCK_LEFT); new FXMenuCommand(&dockmenu,tr("Right"),&dockrighticon,this,ID_DOCK_RIGHT); new FXMenuCommand(&dockmenu,tr("Float"),&dockfreeicon,this,ID_DOCK_FLOAT); new FXMenuCommand(&dockmenu,tr("Flip"),&dockflipicon,this,ID_DOCK_FLIP); dockmenu.create(); dockmenu.popup(NULL,event->root_x,event->root_y); // FIXME funny problem: menu doesn't update until move despite call to refresh here // getApp()->refresh(); dockmenu.forceRefresh(); getApp()->runModalWhileShown(&dockmenu); return 1; } // Tool bar grip drag started; the grip widget can be at any level under this dock bar long FXDockBar::onBeginDragGrip(FXObject* sender,FXSelector,void* ptr){ FXWindow *grip=static_cast(sender); FXEvent* event=static_cast(ptr); if(dynamic_cast(drydock)){ for(gripx=event->click_x,gripy=event->click_y; grip && grip!=this; grip=grip->getParent()){ gripx+=grip->getX(); gripy+=grip->getY(); } raise(); return 1; } return 0; } // Tool bar grip drag ended long FXDockBar::onEndDragGrip(FXObject*,FXSelector,void* ptr){ FXToolBarShell *toolbarshell=dynamic_cast(getParent()); FXEvent* event=static_cast(ptr); FXDockSite *toolbardock; FXint rootx,rooty,localx,localy; getApp()->removeTimeout(this,ID_TIMER); if(toolbarshell){ if(!(event->state&CONTROLMASK)){ rootx=event->root_x-gripx; rooty=event->root_y-gripy; toolbardock=findDockNear(rootx,rooty); if(toolbardock){ translateCoordinatesTo(localx,localy,toolbardock,0,0); dock(toolbardock,localx,localy,TRUE); } } } return 1; } // Hovered near dock site:- dock it! long FXDockBar::onDockTimer(FXObject*,FXSelector,void* ptr){ FXDockSite *toolbardock=static_cast(ptr); FXint localx,localy; translateCoordinatesTo(localx,localy,toolbardock,0,0); dock(toolbardock,localx,localy,TRUE); return 1; } // Tool bar grip dragged long FXDockBar::onDraggedGrip(FXObject*,FXSelector,void* ptr){ FXToolBarShell *toolbarshell=dynamic_cast(getParent()); FXDockSite *toolbardock=dynamic_cast(getParent()); FXEvent* event=static_cast(ptr); FXint rootx,rooty,dockx,docky; // Root position rootx=event->root_x-gripx; rooty=event->root_y-gripy; // Stop dock timer getApp()->removeTimeout(this,ID_TIMER); // We are docked if(toolbardock){ // Get mouse position relative to dock site toolbardock->translateCoordinatesFrom(dockx,docky,getRoot(),rootx,rooty); // Move the bar around in dock site toolbardock->moveToolBar(this,dockx,docky); // Test if we pulled too far to stay inside if(!insideDock(toolbardock,dockx+toolbardock->getX(),docky+toolbardock->getY())){ undock(rootx,rooty,TRUE); } } // We are floating else if(toolbarshell){ // We're near a dock, if we hover around we'll dock there if(!(event->state&CONTROLMASK)){ toolbardock=findDockNear(rootx,rooty); if(toolbardock) getApp()->addTimeout(this,ID_TIMER,300,toolbardock); } // Move around freely wetdock->move(rootx,rooty); } return 1; } // Save data void FXDockBar::save(FXStream& store) const { FXPacker::save(store); store << drydock; store << wetdock; store << allowed; } // Load data void FXDockBar::load(FXStream& store){ FXPacker::load(store); store >> drydock; store >> wetdock; store >> allowed; } // Destroy FXDockBar::~FXDockBar(){ getApp()->removeTimeout(this,ID_TIMER); drydock=(FXComposite*)-1L; wetdock=(FXComposite*)-1L; } } fox1.6-1.6.57/src/FXDockHandler.cpp000066400000000000000000000232431326741342000165500ustar00rootroot00000000000000/******************************************************************************** * * * D o c k H a n d l e r W i d g e t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDockHandler.cpp,v 1.8 2006/01/22 17:58:23 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDockHandler.h" /* Notes: - On MS-Windows, this works just fine, without fanfare. - On X11, some quaintness in the X-Server causes havoc if reparent() is called on a window while it was grabbed. - Not to be deterred, we implement here the following workaround: 1) We create a temporary dummy window, just 1x1 pixels in size, in the upper left corner of the screen [yes, that was not a dead pixel after all!]. 2) We add this to the hash table, so now events from the "true" window as well those from the dummy window are dispatched to the toolbar grip. 3) We temporarily replace the xid of the true window with the dummy one, then invoke grab() to grab the mouse, then restore the original xid. 4) Now you can wave your mouse around and dock or undock toolbars. 5) When we're done, we replace the xid again with the dummy window, call ungrab(), then restore the original xid again. 6) Then, delete the dummy window. - The only downside of this method is that the win_x and win_y member data in FXEvent is unreliable; fortunately, the standard toolbar docking algorithms do not use these members. - Of course, we'd rather not have to do all this; so don't hesitate to inform us if you have a better way! */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXDockHandler) FXDockHandlerMap[]={ FXMAPFUNC(SEL_MOTION,0,FXDockHandler::onMotion), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXDockHandler::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXDockHandler::onLeftBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXDockHandler::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXDockHandler::onKeyRelease), FXMAPFUNC(SEL_QUERY_TIP,0,FXDockHandler::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXDockHandler::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXDockHandler::ID_SETHELPSTRING,FXDockHandler::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXDockHandler::ID_GETHELPSTRING,FXDockHandler::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXDockHandler::ID_SETTIPSTRING,FXDockHandler::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXDockHandler::ID_GETTIPSTRING,FXDockHandler::onCmdGetTip), }; // Object implementation FXIMPLEMENT_ABSTRACT(FXDockHandler,FXFrame,FXDockHandlerMap,ARRAYNUMBER(FXDockHandlerMap)) // Deserialization FXDockHandler::FXDockHandler(){ flags|=FLAG_ENABLED|FLAG_SHOWN; xxx=0; } // Construct and init FXDockHandler::FXDockHandler(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_SHOWN|FLAG_ENABLED; dragCursor=getApp()->getDefaultCursor(DEF_MOVE_CURSOR); target=tgt; message=sel; xxx=0; } // Can have focus bool FXDockHandler::canFocus() const { return true; } // Moved long FXDockHandler::onMotion(FXObject*,FXSelector,void* ptr){ if(flags&FLAG_DODRAG){ handle(this,FXSEL(SEL_DRAGGED,0),ptr); return 1; } if((flags&FLAG_TRYDRAG) && ((FXEvent*)ptr)->moved){ if(handle(this,FXSEL(SEL_BEGINDRAG,0),ptr)) flags|=FLAG_DODRAG; flags&=~FLAG_TRYDRAG; return 1; } return 0; } // Pressed LEFT button long FXDockHandler::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ flags=(flags&~(FLAG_UPDATE|FLAG_DODRAG))|FLAG_TRYDRAG; #ifndef WIN32 Display *display=(Display*)getApp()->getDisplay(); const unsigned long mask=CWBackPixmap|CWWinGravity|CWBitGravity|CWBorderPixel|CWOverrideRedirect|CWSaveUnder|CWEventMask|CWDontPropagate|CWColormap|CWCursor; XSetWindowAttributes wattr; FXID tempxid=xid; wattr.background_pixmap=None; wattr.background_pixel=0; wattr.border_pixmap=None; wattr.border_pixel=0; wattr.bit_gravity=ForgetGravity; wattr.win_gravity=NorthWestGravity; wattr.backing_store=NotUseful; wattr.backing_planes=0; wattr.backing_pixel=0; wattr.save_under=FALSE; wattr.event_mask=ButtonPressMask|ButtonReleaseMask|PointerMotionMask|KeyPressMask|KeyReleaseMask | FocusChangeMask|StructureNotifyMask | StructureNotifyMask|ExposureMask|PropertyChangeMask|EnterWindowMask|LeaveWindowMask; wattr.do_not_propagate_mask=KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask|PointerMotionMask|ButtonMotionMask; wattr.override_redirect=TRUE; wattr.colormap=DefaultColormap(display,DefaultScreen(display)); wattr.cursor=None; xxx=XCreateWindow(display,RootWindow(display,DefaultScreen(display)),0,0,1,1,0,DefaultDepth(display,DefaultScreen(display)),InputOutput,DefaultVisual(display,DefaultScreen(display)),mask,&wattr); getApp()->hash.insert((void*)xxx,this); XMapWindow(display,xxx); xid=xxx; grab(); xid=tempxid; #else grab(); #endif update(); } return 1; } // Released LEFT button long FXDockHandler::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_ENDDRAG,0),ptr);} flags=(flags&~(FLAG_TRYDRAG|FLAG_DODRAG))|FLAG_UPDATE; #ifndef WIN32 Display *display=(Display*)getApp()->getDisplay(); FXID tempxid=xid; xid=xxx; ungrab(); xid=tempxid; getApp()->hash.remove((void*)xxx); XDestroyWindow(display,xxx); xxx=0; #else ungrab(); #endif update(); } return 1; } // Key Press long FXDockHandler::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=static_cast(ptr); if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(event->code==KEY_Control_L || event->code==KEY_Control_R){ if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; } } return 0; } // Key Release long FXDockHandler::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=static_cast(ptr); if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if(event->code==KEY_Control_L || event->code==KEY_Control_R){ if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; } } return 0; } // We were asked about tip text long FXDockHandler::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXFrame::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXDockHandler::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXFrame::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Set tip using a message long FXDockHandler::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXDockHandler::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // Set help using a message long FXDockHandler::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXDockHandler::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Save data void FXDockHandler::save(FXStream& store) const { FXFrame::save(store); store << tip; store << help; } // Load data void FXDockHandler::load(FXStream& store){ FXFrame::load(store); store >> tip; store >> help; } } fox1.6-1.6.57/src/FXDockSite.cpp000066400000000000000000000743231326741342000161040ustar00rootroot00000000000000/******************************************************************************** * * * D o c k S i t e W i d g e t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDockSite.cpp,v 1.76 2006/01/22 17:58:23 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXPacker.h" #include "FXDockBar.h" #include "FXDockSite.h" /* Notes: - Use "Box-Car" algorithm when sliding horizontally (vertically). - Vertical arrangement is very tricky; we don't insert in between galleys when dragging since its not so easy to use; but this remains a possibility for future expansion. - We can STILL do wrapping of individual toolbars inside the toolbar dock; normally we compute the width the standard way, but if this does not fit the available space and its the first widget on the galley, we can call getHeightForWidth() and thereby wrap the item in on the galley. Thus we have both wrapping of the toobars as well as wrapping inside the toolbar. - FIXME we should look at LAYOUT_DOCK_NEXT before shown() because if you hide a bar, we want to keep stuff in the same place. - Another nice addition would be to constrain docking from adding extra galleys, except when unavoidable. */ #define FUDGE 20 // Amount to move down/up before jumping into next galley using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXDockSite) FXDockSiteMap[]={ FXMAPFUNC(SEL_FOCUS_PREV,0,FXDockSite::onFocusLeft), FXMAPFUNC(SEL_FOCUS_NEXT,0,FXDockSite::onFocusRight), }; // Object implementation FXIMPLEMENT(FXDockSite,FXPacker,FXDockSiteMap,ARRAYNUMBER(FXDockSiteMap)) // Make a dock site FXDockSite::FXDockSite(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXPacker(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ } // Change wrap option void FXDockSite::wrapGalleys(FXbool wrap){ if(wrap && wrapGalleys()){ options&=~DOCKSITE_NO_WRAP; recalc(); } else if(!wrap && !wrapGalleys()){ options|=DOCKSITE_NO_WRAP; recalc(); } } // Get wrap option FXbool FXDockSite::wrapGalleys() const { return (options&DOCKSITE_NO_WRAP)==0; } // Compute minimum width based on child layout hints FXint FXDockSite::getDefaultWidth(){ register FXint total=0,galw=0,any=0,w; register FXWindow *child; register FXuint hints; // Vertically oriented if(options&LAYOUT_SIDE_LEFT){ for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); w=(hints&LAYOUT_FIX_WIDTH)?child->getWidth():child->getDefaultWidth(); if(any && (hints&LAYOUT_DOCK_NEXT)){ total+=galw+hspacing; galw=w; } else{ if(w>galw) galw=w; } any=1; } } total+=galw; } // Horizontally oriented else{ for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); w=(hints&LAYOUT_FIX_WIDTH)?child->getWidth():child->getDefaultWidth(); if(any && (hints&LAYOUT_DOCK_NEXT)){ if(galw>total) total=galw; galw=w; } else{ if(galw) galw+=hspacing; galw+=w; } any=1; } } if(galw>total) total=galw; } return padleft+padright+total+(border<<1); } // Compute minimum height based on child layout hints FXint FXDockSite::getDefaultHeight(){ register FXint total=0,galh=0,any=0,h; register FXWindow *child; register FXuint hints; // Vertically oriented if(options&LAYOUT_SIDE_LEFT){ for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); h=(hints&LAYOUT_FIX_HEIGHT)?child->getHeight():child->getDefaultHeight(); if(any && (hints&LAYOUT_DOCK_NEXT)){ if(galh>total) total=galh; galh=h; } else{ if(galh) galh+=vspacing; galh+=h; } any=1; } } if(galh>total) total=galh; } // Horizontally oriented else{ for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); h=(hints&LAYOUT_FIX_HEIGHT)?child->getHeight():child->getDefaultHeight(); if(any && (hints&LAYOUT_DOCK_NEXT)){ total+=galh+vspacing; galh=h; } else{ if(h>galh) galh=h; } any=1; } } total+=galh; } return padtop+padbottom+total+(border<<1); } // Return width for given height (vertical orientation) FXint FXDockSite::getWidthForHeight(FXint givenheight){ register FXint space,total,galh,galw,any,w,h; register FXWindow *child; register FXuint hints; total=galh=galw=any=0; space=givenheight-padtop-padbottom-(border<<1); for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); w=(hints&LAYOUT_FIX_WIDTH)?child->getWidth():child->getDefaultWidth(); h=(hints&LAYOUT_FIX_HEIGHT)?child->getHeight():child->getDefaultHeight(); if(any && ((hints&LAYOUT_DOCK_NEXT) || ((galh+h>space) && wrapGalleys()))){ total+=galw+hspacing; galw=w; galh=h+vspacing; } else{ galh+=h+vspacing; if(w>galw) galw=w; } any=1; } } total+=galw; return padleft+padright+total+(border<<1); } // Return height for given width (horizontal orientation) FXint FXDockSite::getHeightForWidth(FXint givenwidth){ register FXint space,total,galh,galw,any,w,h; register FXWindow *child; register FXuint hints; total=galh=galw=any=0; space=givenwidth-padleft-padright-(border<<1); for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); w=(hints&LAYOUT_FIX_WIDTH)?child->getWidth():child->getDefaultWidth(); h=(hints&LAYOUT_FIX_HEIGHT)?child->getHeight():child->getDefaultHeight(); if(any && ((hints&LAYOUT_DOCK_NEXT) || ((galw+w>space) && wrapGalleys()))){ total+=galh+vspacing; galw=w+hspacing; galh=h; } else{ galw+=w+hspacing; if(h>galh) galh=h; } any=1; } } total+=galh; return padtop+padbottom+total+(border<<1); } // Determine vertical galley size FXint FXDockSite::galleyWidth(FXWindow *begin,FXWindow*& end,FXint space,FXint& require,FXint& expand) const { register FXint galley,any,w,h; register FXWindow *child; register FXuint hints; require=expand=galley=any=0; for(child=end=begin; child; end=child,child=child->getNext()){ if(child->shown()){ // Get size hints=child->getLayoutHints(); w=(hints&LAYOUT_FIX_WIDTH)?child->getWidth():child->getDefaultWidth(); h=(hints&LAYOUT_FIX_HEIGHT)?child->getHeight():child->getDefaultHeight(); // Break for new galley? if(any && ((hints&LAYOUT_DOCK_NEXT) || ((require+h>space) && wrapGalleys()))) break; // Expanding widgets if(hints&LAYOUT_FILL_Y) expand+=h; // Figure galley size require+=h+vspacing; if(w>galley) galley=w; any=1; } } require-=vspacing; return galley; } // Determine horizontal galley size FXint FXDockSite::galleyHeight(FXWindow *begin,FXWindow*& end,FXint space,FXint& require,FXint& expand) const { register FXint galley,any,w,h; register FXWindow *child; register FXuint hints; require=expand=galley=any=0; for(child=end=begin; child; end=child,child=child->getNext()){ if(child->shown()){ // Get size hints=child->getLayoutHints(); w=(hints&LAYOUT_FIX_WIDTH)?child->getWidth():child->getDefaultWidth(); h=(hints&LAYOUT_FIX_HEIGHT)?child->getHeight():child->getDefaultHeight(); // Break for new galley? if(any && ((hints&LAYOUT_DOCK_NEXT) || ((require+w>space) && wrapGalleys()))) break; // Expanding widgets if(hints&LAYOUT_FILL_X) expand+=w; // Figure galley size require+=w+hspacing; if(h>galley) galley=h; any=1; } } require-=hspacing; return galley; } // Recalculate layout void FXDockSite::layout(){ FXint expand,remain,require,left,right,top,bottom,galx,galy,galw,galh,e,t,x,y,w,h; FXWindow *begin,*end,*child; FXuint hints; // Vertically oriented if(options&LAYOUT_SIDE_LEFT){ // Galley height left=border+padleft; right=width-padright-border; // Loop over galleys for(begin=getFirst(); begin; begin=end->getNext()){ // Space available top=border+padtop; bottom=height-padbottom-border; // Galley width galw=galleyWidth(begin,end,bottom-top,require,expand); // Remaining space remain=bottom-top-require; if(expand) require=bottom-top; // Start next galley galx=left; left+=galw+hspacing; // Placement of widgets on galley for(child=begin,e=0; child; child=child->getNext()){ if(child->shown()){ // Get size hints=child->getLayoutHints(); w=(hints&LAYOUT_FIX_WIDTH)?child->getWidth():child->getDefaultWidth(); h=(hints&LAYOUT_FIX_HEIGHT)?child->getHeight():child->getDefaultHeight(); // X-filled if(hints&LAYOUT_FILL_X) w=galw; // Y-filled if(hints&LAYOUT_FILL_Y){ t=h*remain; e+=t%expand; h+=t/expand+e/expand; e%=expand; } require-=h; // Determine child x-position x=child->getX(); if(xgalx+galw) x=galx+galw-w; // Determine child y-position y=child->getY(); if(y+h>bottom-require) y=bottom-require-h; if(yposition(x,y,w,h); } if(child==end) break; } } } // Horizontally oriented else{ // Galley height top=border+padtop; bottom=height-padbottom-border; // Loop over galleys for(begin=getFirst(); begin; begin=end->getNext()){ // Space available left=border+padleft; right=width-padright-border; // Galley height galh=galleyHeight(begin,end,right-left,require,expand); // Remaining space remain=right-left-require; if(expand) require=right-left; // Start next galley galy=top; top+=galh+vspacing; // Placement of widgets on galley for(child=begin,e=0; child; child=child->getNext()){ if(child->shown()){ // Get size hints=child->getLayoutHints(); w=(hints&LAYOUT_FIX_WIDTH)?child->getWidth():child->getDefaultWidth(); h=(hints&LAYOUT_FIX_HEIGHT)?child->getHeight():child->getDefaultHeight(); // Y-filled if(hints&LAYOUT_FILL_Y) h=galh; // X-filled if(hints&LAYOUT_FILL_X){ t=w*remain; e+=t%expand; w+=t/expand+e/expand; e%=expand; } require-=w; // Determine child y-position y=child->getY(); if(ygaly+galh) y=galy+galh-h; // Determine child x-position x=child->getX(); if(x+w>right-require) x=right-require-w; if(xposition(x,y,w,h); } if(child==end) break; } } } flags&=~FLAG_DIRTY; } // Move bar vertically void FXDockSite::moveVerBar(FXWindow* bar,FXWindow *begin,FXWindow* end,FXint bx,FXint by){ FXint minpos,maxpos,pos; FXWindow *child,*other; // Pushing up if(bygetY()){ // Figure minimum position for(child=begin,minpos=border+padtop; child; child=child->getNext()){ if(child->shown()){ minpos+=child->getHeight()+vspacing; } if(child==bar) break; } // Move bars in box-car fashion for(child=bar,pos=by+bar->getHeight()+vspacing,other=NULL; child; child=child->getPrev()){ if(child->shown()){ minpos=minpos-child->getHeight()-vspacing; pos=pos-child->getHeight()-vspacing; if(child->getY()<=pos) break; if(bygetY()) other=child; child->move((child==bar)?bx:child->getX(),FXMAX(pos,minpos)); } if(child==begin) break; } // Hop bar over other if top of bar is above of top of other if(other && other!=bar){ // Hopping over first on galley:- transfer flag over to new first if((other==begin) && (other->getLayoutHints()&LAYOUT_DOCK_NEXT)){ other->setLayoutHints(other->getLayoutHints()&~LAYOUT_DOCK_NEXT); bar->setLayoutHints(bar->getLayoutHints()|LAYOUT_DOCK_NEXT); } // And rearrange order of children bar->move(bar->getX(),other->getY()); other->move(other->getX(),bar->getY()+bar->getHeight()+vspacing); bar->reparent(this,other); } } // Pushing down else if(by>bar->getY()){ // Figure maximum position for(child=end,maxpos=height-padbottom-border; child; child=child->getPrev()){ if(child->shown()){ maxpos-=child->getHeight()+vspacing; } if(child==bar) break; } // Move bars in box-car fashion for(child=bar,pos=by,other=NULL; child; child=child->getNext()){ if(child->shown()){ if(pos<=child->getY()) break; if(by+bar->getHeight()>child->getY()+child->getHeight()) other=child; child->move((child==bar)?bx:child->getX(),FXMIN(pos,maxpos)); maxpos=maxpos+child->getHeight()+vspacing; pos=pos+child->getHeight()+vspacing; } if(child==end) break; } // Hop bar over other if bottom of bar is below of bottom of other if(other && other!=bar){ // First on galley hopped over to the right:- transfer flag to new first if((bar==begin) && (bar->getLayoutHints()&LAYOUT_DOCK_NEXT)){ bar->setLayoutHints(bar->getLayoutHints()&~LAYOUT_DOCK_NEXT); other->setLayoutHints(other->getLayoutHints()|LAYOUT_DOCK_NEXT); } // And rearrange order of children bar->move(bar->getX(),other->getY()+other->getHeight()-bar->getHeight()); other->move(other->getX(),bar->getY()-other->getHeight()-vspacing); bar->reparent(this,other->getNext()); } } // Move horizontally else{ bar->move(bx,bar->getY()); } } // Move bar horizontally void FXDockSite::moveHorBar(FXWindow* bar,FXWindow *begin,FXWindow* end,FXint bx,FXint by){ FXint minpos,maxpos,pos; FXWindow *child,*other; // Pushing left if(bxgetX()){ // Figure minimum position for(child=begin,minpos=border+padleft; child; child=child->getNext()){ if(child->shown()){ minpos+=child->getWidth()+hspacing; } if(child==bar) break; } // Move bars in box-car fashion for(child=bar,pos=bx+bar->getWidth()+hspacing,other=NULL; child; child=child->getPrev()){ if(child->shown()){ minpos=minpos-child->getWidth()-hspacing; pos=pos-child->getWidth()-hspacing; if(child->getX()<=pos) break; if(bxgetX()) other=child; child->move(FXMAX(pos,minpos),(child==bar)?by:child->getY()); } if(child==begin) break; } // Hop bar over other if left of bar is leftward of left of other if(other && other!=bar){ // Hopping over first on galley:- transfer flag over to new first if((other==begin) && (other->getLayoutHints()&LAYOUT_DOCK_NEXT)){ other->setLayoutHints(other->getLayoutHints()&~LAYOUT_DOCK_NEXT); bar->setLayoutHints(bar->getLayoutHints()|LAYOUT_DOCK_NEXT); } // And rearrange order of children bar->move(other->getX(),bar->getY()); other->move(bar->getX()+bar->getWidth()+hspacing,other->getY()); bar->reparent(this,other); } } // Pushing right else if(bx>bar->getX()){ // Figure maximum position for(child=end,maxpos=width-padright-border; child; child=child->getPrev()){ if(child->shown()){ maxpos-=child->getWidth()+hspacing; } if(child==bar) break; } // Move bars in box-car fashion for(child=bar,pos=bx,other=NULL; child; child=child->getNext()){ if(child->shown()){ if(pos<=child->getX()) break; if(bx+bar->getWidth()>child->getX()+child->getWidth()) other=child; child->move(FXMIN(pos,maxpos),(child==bar)?by:child->getY()); maxpos=maxpos+child->getWidth()+hspacing; pos=pos+child->getWidth()+hspacing; } if(child==end) break; } // Hop bar over other if right of bar is rightward of right of other if(other && other!=bar){ // First on galley hopped over to the right:- transfer flag to new first if((bar==begin) && (bar->getLayoutHints()&LAYOUT_DOCK_NEXT)){ bar->setLayoutHints(bar->getLayoutHints()&~LAYOUT_DOCK_NEXT); other->setLayoutHints(other->getLayoutHints()|LAYOUT_DOCK_NEXT); } // And rearrange order of children bar->move(other->getX()+other->getWidth()-bar->getWidth(),bar->getY()); other->move(bar->getX()-other->getWidth()-hspacing,other->getY()); bar->reparent(this,other->getNext()); } } // Move vertically else{ bar->move(bar->getX(),by); } } // Move dock bar, changing its options to suit position void FXDockSite::moveToolBar(FXDockBar* bar,FXint barx,FXint bary){ FXint left,right,top,bottom,galx,galy,galw,galh,dockx,docky,barw,barh,expand,require,w,h; FXWindow *begin,*end,*cur,*curend,*nxt,*nxtend,*prv,*prvend; // We insist this bar hangs under this dock site if(bar && bar->getParent()==this){ // Proposed location dockx=barx; docky=bary; // Bar size barw=bar->getWidth(); barh=bar->getHeight(); // Interior top=border+padtop; bottom=height-padbottom-border; left=border+padleft; right=width-padright-border; // Vertically oriented if(options&LAYOUT_SIDE_LEFT){ // Determine galley sizes galx=left; galw=0; for(begin=getFirst(),cur=prv=nxt=curend=prvend=nxtend=NULL; begin; begin=end->getNext()){ w=galleyWidth(begin,end,bottom-top,require,expand); if(!after(end,bar)){ if(left<=barx && barxgalx+galw) dockx=galx+galw-barw; // Move bar vertically; this may change the galley start and end! moveVerBar(bar,cur,curend,dockx,docky); // Moving bar right, unless we're about to pull it out of the dock if(barx+barw>=galx+galw+FUDGE && (!bar->getWetDock() || barx+barwgetNext()->setLayoutHints(cur->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); nxt->setLayoutHints(nxt->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->setLayoutHints(bar->getLayoutHints()&~LAYOUT_DOCK_NEXT); bar->reparent(this,nxtend->getNext()); } else{ // Hang below last if(cur==bar && bar!=curend) cur->getNext()->setLayoutHints(cur->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); else cur->setLayoutHints(cur->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->setLayoutHints(bar->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->reparent(this,NULL); } } // Moving bar left, unless we're about to pull it out of the dock else if(barxgetWetDock() || barx>padleft+border)){ if(prv){ // Hang at end of previous galley if(cur==bar && bar!=curend) cur->getNext()->setLayoutHints(cur->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); prv->setLayoutHints(prv->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->setLayoutHints(bar->getLayoutHints()&~LAYOUT_DOCK_NEXT); bar->reparent(this,prvend->getNext()); } else{ // Hand above first if(cur==bar && bar!=curend) cur->getNext()->setLayoutHints(cur->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); else cur->setLayoutHints(cur->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->setLayoutHints(bar->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->reparent(this,getFirst()); } } } // Horizontally oriented else{ // Determine galley sizes galy=top; galh=0; for(begin=getFirst(),cur=prv=nxt=curend=prvend=nxtend=NULL; begin; begin=end->getNext()){ h=galleyHeight(begin,end,right-left,require,expand); if(!after(end,bar)){ if(top<=bary && barygaly+galh) docky=galy+galh-barh; // Move bar horizontally; this may change the galley start and end! moveHorBar(bar,cur,curend,dockx,docky); // Moving bar down, unless we're about to pull it out of the dock if(bary+barh>=galy+galh+FUDGE && (!bar->getWetDock() || bary+barhgetNext()->setLayoutHints(cur->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); nxt->setLayoutHints(nxt->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->setLayoutHints(bar->getLayoutHints()&~LAYOUT_DOCK_NEXT); bar->reparent(this,nxtend->getNext()); } else{ // Hang below last if(cur==bar && bar!=curend) cur->getNext()->setLayoutHints(cur->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); else cur->setLayoutHints(cur->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->setLayoutHints(bar->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->reparent(this,NULL); } } // Moving bar up, unless we're about to pull it out of the dock else if(barygetWetDock() || bary>border+padtop)){ if(prv){ // Hang at end of previous galley if(cur==bar && bar!=curend) cur->getNext()->setLayoutHints(cur->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); prv->setLayoutHints(prv->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->setLayoutHints(bar->getLayoutHints()&~LAYOUT_DOCK_NEXT); bar->reparent(this,prvend->getNext()); } else{ // Hand above first if(cur==bar && bar!=curend) cur->getNext()->setLayoutHints(cur->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); else cur->setLayoutHints(cur->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->setLayoutHints(bar->getLayoutHints()|LAYOUT_DOCK_NEXT); bar->reparent(this,getFirst()); } } } } } // Fix layouts for undocking given bar void FXDockSite::undockToolBar(FXDockBar* bar){ FXint space,expand,require; FXWindow *begin,*end; // We insist this bar hangs under this dock site if(bar && bar->getParent()==this){ // Vertically oriented if(options&LAYOUT_SIDE_LEFT){ // Space space=height-padbottom-padtop-border-border; // Determine galley sizes for(begin=getFirst(); begin; begin=end->getNext()){ galleyWidth(begin,end,space,require,expand); if(before(begin,bar) && before(bar,end)) break; } // Adjust layout options if(begin==bar && bar!=end) begin->getNext()->setLayoutHints(begin->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); else begin->setLayoutHints(begin->getLayoutHints()|LAYOUT_DOCK_NEXT); } // Horizontally oriented else{ // Space space=width-padright-padleft-border-border; // Determine galley sizes for(begin=getFirst(); begin; begin=end->getNext()){ galleyHeight(begin,end,space,require,expand); if(before(begin,bar) && before(bar,end)) break; } // Adjust layout options if(begin==bar && bar!=end) begin->getNext()->setLayoutHints(begin->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); else begin->setLayoutHints(begin->getLayoutHints()|LAYOUT_DOCK_NEXT); } // Fix bar's layout hints too bar->setLayoutHints(bar->getLayoutHints()&~LAYOUT_DOCK_NEXT); } } // Fix layouts for docking given bar at given position void FXDockSite::dockToolBar(FXDockBar* bar,FXWindow* before){ // We insist this bar hangs under this dock site if(bar && bar->getParent()==this){ // New galley for bar bar->setLayoutHints(bar->getLayoutHints()|LAYOUT_DOCK_NEXT); if(before) before->setLayoutHints(bar->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); } } // Fix layouts for docking given bar at given position void FXDockSite::dockToolBar(FXDockBar* bar,FXint barx,FXint bary){ FXint left,right,top,bottom,barw,barh,expand,require,cx,cy,w,h; FXWindow *begin,*end,*child; // We insist this bar hangs under this dock site if(bar && bar->getParent()==this){ // Interior top=border+padtop; left=border+padleft; bottom=height-padbottom-border; right=width-padright-border; // Bar size barw=bar->getWidth(); barh=bar->getHeight(); // Vertically oriented if(options&LAYOUT_SIDE_LEFT){ cx=barx+barw/2; // Tentatively bar->reparent(this,getFirst()); bar->setLayoutHints(bar->getLayoutHints()|LAYOUT_DOCK_NEXT); if(bar->getNext()){ // Start galley on next bar->getNext()->setLayoutHints(bar->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); // Right of the left edge if(left<=cx){ // Determine galley for(begin=bar->getNext(); begin; begin=end->getNext()){ w=galleyWidth(begin,end,bottom-top,require,expand); if(left<=cx && cxgetNext() && (!child->shown() || bary>=child->getY()); child=child->getNext()); // At the front if((child==begin) && (child->getLayoutHints()&LAYOUT_DOCK_NEXT)){ child->setLayoutHints(child->getLayoutHints()&~LAYOUT_DOCK_NEXT); } else{ bar->setLayoutHints(bar->getLayoutHints()&~LAYOUT_DOCK_NEXT); } // hang in front bar->reparent(this,child); goto ver; } left+=w+hspacing; } // Link at the bottom bar->reparent(this,NULL); } } // Move horizontally ver: bar->move(FXCLAMP(left,barx,right),bary); } // Horizontally oriented else{ cy=bary+barh/2; // Tentatively bar->reparent(this,getFirst()); bar->setLayoutHints(bar->getLayoutHints()|LAYOUT_DOCK_NEXT); if(bar->getNext()){ // Start galley on next bar->getNext()->setLayoutHints(bar->getNext()->getLayoutHints()|LAYOUT_DOCK_NEXT); // Below top edge if(top<=cy){ // Determine galley for(begin=bar->getNext(); begin; begin=end->getNext()){ h=galleyHeight(begin,end,right-left,require,expand); if(top<=cy && cygetNext() && (!child->shown() || barx>=child->getX()); child=child->getNext()); // At the front if((child==begin) && (child->getLayoutHints()&LAYOUT_DOCK_NEXT)){ child->setLayoutHints(child->getLayoutHints()&~LAYOUT_DOCK_NEXT); } else{ bar->setLayoutHints(bar->getLayoutHints()&~LAYOUT_DOCK_NEXT); } // hang in front bar->reparent(this,child); goto hor; } top+=h+vspacing; } // Link at the bottom bar->reparent(this,NULL); } } // Move horizontally hor: bar->move(barx,FXCLAMP(top,bary,bottom)); } } } } fox1.6-1.6.57/src/FXDockTitle.cpp000066400000000000000000000145421326741342000162560ustar00rootroot00000000000000/******************************************************************************** * * * D o c k T i t l e W i d g e t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDockTitle.cpp,v 1.6 2006/01/22 17:58:23 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXFont.h" #include "FXDCWindow.h" #include "FXDockTitle.h" /* Notes: */ #define JUSTIFY_MASK (JUSTIFY_HZ_APART|JUSTIFY_VT_APART) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXDockTitle) FXDockTitleMap[]={ FXMAPFUNC(SEL_PAINT,0,FXDockTitle::onPaint), FXMAPFUNC(SEL_COMMAND,FXDockTitle::ID_SETVALUE,FXDockTitle::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXDockTitle::ID_SETSTRINGVALUE,FXDockTitle::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXDockTitle::ID_GETSTRINGVALUE,FXDockTitle::onCmdGetStringValue), }; // Object implementation FXIMPLEMENT(FXDockTitle,FXDockHandler,FXDockTitleMap,ARRAYNUMBER(FXDockTitleMap)) // Deserialization FXDockTitle::FXDockTitle(){ font=(FXFont*)-1L; captionColor=0; } // Construct and init FXDockTitle::FXDockTitle(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXDockHandler(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb),caption(text){ font=getApp()->getNormalFont(); captionColor=getApp()->getSelforeColor(); backColor=getApp()->getSelbackColor(); } // Create window void FXDockTitle::create(){ FXFrame::create(); font->create(); } // Detach window void FXDockTitle::detach(){ FXFrame::detach(); font->detach(); } // Get default width FXint FXDockTitle::getDefaultWidth(){ register FXint w=0; if(!caption.empty()) w=font->getTextWidth(caption.text(),caption.length()); return padleft+padright+(border<<1)+w; } // Get default height FXint FXDockTitle::getDefaultHeight(){ register FXint h=0; if(!caption.empty()) h=font->getFontHeight(); return padtop+padbottom+(border<<1)+h; } // Handle repaint long FXDockTitle::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent* event=static_cast(ptr); FXDCWindow dc(this,event); FXint tw,th,tx,ty; dc.setForeground(backColor); dc.fillRectangle(border,border,width-(border<<1),height-(border<<1)); if(!caption.empty()){ dc.setFont(font); tw=font->getTextWidth(caption.text(),caption.length()); th=font->getFontHeight(); if(options&JUSTIFY_LEFT) tx=padleft+border; else if(options&JUSTIFY_RIGHT) tx=width-padright-border-tw; else tx=border+padleft+(width-padleft-padright-(border<<1)-tw)/2; if(options&JUSTIFY_TOP) ty=border+padtop; else if(options&JUSTIFY_BOTTOM) ty=height-padbottom-border-th; else ty=border+padtop+(height-padbottom-padtop-(border<<1)-th)/2; dc.setForeground(captionColor); dc.drawText(tx,ty+font->getFontAscent(),caption); } drawFrame(dc,0,0,width,height); return 1; } // Update value from a message long FXDockTitle::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCaption((const FXchar*)ptr); return 1; } // Update value from a message long FXDockTitle::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setCaption(*((FXString*)ptr)); return 1; } // Obtain value from text field long FXDockTitle::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getCaption(); return 1; } // Change caption void FXDockTitle::setCaption(const FXString& text){ if(caption!=text){ caption=text; recalc(); update(); } } // Change the font void FXDockTitle::setFont(FXFont *fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Set caption color void FXDockTitle::setCaptionColor(FXColor clr){ if(clr!=captionColor){ captionColor=clr; update(); } } // Set text justify style void FXDockTitle::setJustify(FXuint style){ FXuint opts=(options&~JUSTIFY_MASK) | (style&JUSTIFY_MASK); if(options!=opts){ options=opts; update(); } } // Get text justify style FXuint FXDockTitle::getJustify() const { return (options&JUSTIFY_MASK); } // Save data void FXDockTitle::save(FXStream& store) const { FXDockHandler::save(store); store << caption; store << font; store << captionColor; } // Load data void FXDockTitle::load(FXStream& store){ FXDockHandler::load(store); store >> caption; store >> font; store >> captionColor; } // Destroy FXDockTitle::~FXDockTitle(){ font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXDocument.cpp000066400000000000000000000175231326741342000161540ustar00rootroot00000000000000/******************************************************************************** * * * D o c u m e n t O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDocument.cpp,v 1.24 2006/01/22 17:58:24 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXPath.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXCursor.h" #include "FXFrame.h" #include "FXRootWindow.h" #include "FXShell.h" #include "FXDocument.h" /* Notes: - How to use: 1) You construct a FXDocument class, e.g. when your app loads a file. 2) FXDocument constructs one or more FXMDIChild widgets, and makes itself the target of the each of them so that it will be notified when the FXMDIChild minimizes, maximizes, or gets closed etc. 3) MenuCommands, Buttons and what have you which need to send messages to FXDocument will do so through delegation via FXMDIClient, and FXMDIChild. Thus, the only places pointing to a specific FXDocument are FXMDIChild windows, and their sub-widgets (such as for example the FXGLViewer). 4) When the user interacts with one of the FXMDIChild's controls, data in the FXDocument is changed. If any other FXMDIChild windows are used this same data, they may need to be updated. FXDocument can do this through message ``broadcast'' from the FXMDIClient to its list FXMDIChild windows: mdiclient->forallWindows(sender,sel,ptr) sends a message to ALL FXMDIChild windows under mdiclient. Also: mdiclient->forallDocWindows(document,sender,sel,ptr) sends a message to all FXMDIChild windows whose target is document. A new message, understood by ALL FXWindows, has been added if you want to simply force a repaint; so in order to just repaint everything: long MyDocument::onCmdChangedSomething(FXObject* sender, FXSelector sel,void* ptr){ forallWindows(sender,FXSEL(SEL_COMMAND,ID_UPDATE),ptr); return 1; } 5) Thus, - There is only ONE place that keeps track of all the FXMDIChild windows pertaining to a certain document. Your application may want to cycle through the FXMDIChild list itself; this can be done by: mdichild = mdiclient->getMDIChildFirst(); mdichild = mdichild->getMDINext(); and so on. The FXMDIChild windows are linked into a doubly-linked list. - After a change, FXMDIChild window contents may be updated by a simple message broadcast to all FXMDIChild windows; in many cases, the original FXMDIChild with which the user interacted should be skipped. This can be accomplished by simply passing the same sender which sent the change to the FXDocument back to the broadcast message, so if a message is received by the FXMDIChild it could simply test if it itself was the originator. - Applications which don't ``buy into'' this whole multi-document business but still want to have multiple viewer windows won't have to bother with FXDocuments at all! Just create FXMDIChild widgets and make them send the messages to the right place... 6) FXMainWindow and FXMDIChild can ask their target to supply the title to be displayed in the titlebar; this is done through GUI Updating. 7) New FXMDIChildren should be created by FXDocument; when an FXMDIChild is closed, the FXDocument should be asked first; if its the last window, FXDocument should prompt to save the data if modified. After data has been saved, the FXDocument returns 1 in the SEL_CLOSE handler which causes the FXMDIChild to delete itself. 8) A message ID_CLOSE_DOCUMENT to FXDocument (via FXMDIClient and FXMDIChild) checks if document needs to be saved; once saved, the document can delete all child windows. It could do this via: mdiclient->forallDocWindows(this,this,FXSEL(SEL_COMMAND,FXWindow::ID_DELETE),NULL); forAllfirst sends a SEL_CLOSEALL to each document; if this returns 1, FXMDIClient proceeds to send ID_MDI_CLOSE to each FXMDIChild belonging to the same document. Each FXMDIChild will then ask the FXDocument whether its OK to close this FXMDIChild; since the FXDocument was already saved in response to the SEL_CLOSEALL, the FXDocument is no longer dirty and the answer will be OK to close for all of them [except perhaps in unusual circumstances]. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXDocument) FXDocumentMap[]={ FXMAPFUNC(SEL_UPDATE,FXDocument::ID_TITLE,FXDocument::onUpdTitle), FXMAPFUNC(SEL_UPDATE,FXDocument::ID_FILENAME,FXDocument::onUpdFilename), }; // Object implementation FXIMPLEMENT(FXDocument,FXObject,FXDocumentMap,ARRAYNUMBER(FXDocumentMap)) // Construct FXDocument::FXDocument(){ modified=FALSE; } // Change title void FXDocument::setTitle(const FXString& name){ title=name; } // Set file name, and the title also void FXDocument::setFilename(const FXString& path){ filename=FXPath::absolute(path); title=FXPath::title(filename); } // Update document title long FXDocument::onUpdTitle(FXObject* sender,FXSelector,void*){ FXString string=title; if(modified) string+="*"; sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE),(void*)&string); return 1; } // Update document filename long FXDocument::onUpdFilename(FXObject* sender,FXSelector,void*){ FXString string=filename; if(modified) string+="*"; sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE),(void*)&string); return 1; } // Save object to stream void FXDocument::save(FXStream& store) const { FXObject::save(store); } // Load object from stream void FXDocument::load(FXStream& store){ FXObject::load(store); } // Destruct FXDocument::~FXDocument(){ } } fox1.6-1.6.57/src/FXDragCorner.cpp000066400000000000000000000170521326741342000164210ustar00rootroot00000000000000/******************************************************************************** * * * D r a g C o r n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDragCorner.cpp,v 1.34.2.1 2006/05/18 15:27:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXDragCorner.h" #define CORNERSIZE 17 #define DISPLAY(app) ((Display*)((app)->getDisplay())) /* Notes: - Need to grab server while dragging? - Need to use extended window manager hints so that minimum/maximum size and so on are properly observed. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXDragCorner) FXDragCornerMap[]={ FXMAPFUNC(SEL_PAINT,0,FXDragCorner::onPaint), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXDragCorner::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXDragCorner::onLeftBtnRelease), FXMAPFUNC(SEL_MOTION,0,FXDragCorner::onMotion), }; // Object implementation FXIMPLEMENT(FXDragCorner,FXWindow,FXDragCornerMap,ARRAYNUMBER(FXDragCornerMap)) // Deserialization FXDragCorner::FXDragCorner(){ flags|=FLAG_ENABLED|FLAG_SHOWN; hiliteColor=0; shadowColor=0; oldw=0; oldh=0; xoff=0; yoff=0; ewmh=0; } // Construct and init FXDragCorner::FXDragCorner(FXComposite* p): FXWindow(p,LAYOUT_RIGHT|LAYOUT_BOTTOM){ flags|=FLAG_ENABLED|FLAG_SHOWN; defaultCursor=getApp()->getDefaultCursor(DEF_DRAGBR_CURSOR); dragCursor=getApp()->getDefaultCursor(DEF_DRAGBR_CURSOR); backColor=getApp()->getBaseColor(); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); oldw=0; oldh=0; xoff=0; yoff=0; ewmh=0; } // Get default width FXint FXDragCorner::getDefaultWidth(){ return CORNERSIZE; } // Get default height FXint FXDragCorner::getDefaultHeight(){ return CORNERSIZE; } // Create drag corner void FXDragCorner::create(){ FXWindow::create(); #ifndef WIN32 unsigned long n,i; Atom type,*list; int format; if(XGetWindowProperty(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),getApp()->wmNetSupported,0,2048,False,XA_ATOM,&type,&format,&n,&i,(unsigned char**)&list)==Success && list){ for(i=0; iwmNetMoveResize){ ewmh=1; break; } } XFree(list); } #endif } // Slightly different from Frame border long FXDragCorner::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); dc.setForeground(backColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); dc.setForeground(shadowColor); dc.drawLine(width-2,height-1,width,height-3); dc.drawLine(width-8,height-1,width,height-9); dc.drawLine(width-14,height-1,width,height-15); dc.setForeground(hiliteColor); dc.drawLine(width-5,height-1,width,height-6); dc.drawLine(width-11,height-1,width,height-12); dc.drawLine(width-17,height-1,width,height-18); return 1; } // Pressed LEFT button long FXDragCorner::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; #ifndef WIN32 if(ewmh){ XClientMessageEvent ev; ev.type=ClientMessage; ev.display=DISPLAY(getApp()); ev.window=getShell()->id(); ev.message_type=getApp()->wmNetMoveResize; ev.format=32; ev.data.l[0]=event->root_x; ev.data.l[1]=event->root_y; ev.data.l[2]=4; // Bottom right ev.data.l[3]=LEFTBUTTON; ev.data.l[4]=0; XSendEvent(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),False,(SubstructureRedirectMask|SubstructureNotifyMask),(XEvent*)&ev); ungrab(); return 1; } #endif FXDCWindow dc(getRoot()); FXint xx,yy,wx,wy; grab(); xoff=width-event->win_x; yoff=height-event->win_y; translateCoordinatesTo(wx,wy,getShell(),event->win_x,event->win_y); oldw=wx+xoff; oldh=wy+yoff; dc.clipChildren(FALSE); dc.setFunction(BLT_SRC_XOR_DST); dc.setForeground(FXRGB(255,255,255)); getShell()->translateCoordinatesTo(xx,yy,getRoot(),0,0); dc.drawRectangle(xx,yy,oldw,oldh); flags|=FLAG_PRESSED; return 1; } // Released LEFT button long FXDragCorner::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; if(flags&FLAG_PRESSED){ FXDCWindow dc(getRoot()); FXint xx,yy,wx,wy; ungrab(); getShell()->translateCoordinatesTo(xx,yy,getRoot(),0,0); translateCoordinatesTo(wx,wy,getShell(),event->win_x,event->win_y); dc.clipChildren(FALSE); dc.setFunction(BLT_SRC_XOR_DST); dc.setForeground(FXRGB(255,255,255)); dc.drawRectangle(xx,yy,oldw,oldh); getShell()->resize(wx+xoff,wy+yoff); flags&=~FLAG_PRESSED; } return 1; } // Moved long FXDragCorner::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; if(flags&FLAG_PRESSED){ FXDCWindow dc(getRoot()); FXint xx,yy,wx,wy; getShell()->translateCoordinatesTo(xx,yy,getRoot(),0,0); translateCoordinatesTo(wx,wy,getShell(),event->win_x,event->win_y); dc.clipChildren(FALSE); dc.setFunction(BLT_SRC_XOR_DST); dc.setForeground(FXRGB(255,255,255)); dc.drawRectangle(xx,yy,oldw,oldh); oldw=wx+xoff; oldh=wy+yoff; dc.drawRectangle(xx,yy,oldw,oldh); return 1; } return 0; } // Set highlight color void FXDragCorner::setHiliteColor(FXColor clr){ if(hiliteColor!=clr){ hiliteColor=clr; update(); } } // Set shadow color void FXDragCorner::setShadowColor(FXColor clr){ if(shadowColor!=clr){ shadowColor=clr; update(); } } // Save data void FXDragCorner::save(FXStream& store) const { FXWindow::save(store); store << hiliteColor; store << shadowColor; } // Load data void FXDragCorner::load(FXStream& store){ FXWindow::load(store); store >> hiliteColor; store >> shadowColor; } } fox1.6-1.6.57/src/FXDrawable.cpp000066400000000000000000000065711326741342000161200ustar00rootroot00000000000000/******************************************************************************** * * * D r a w a b l e A r e a * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDrawable.cpp,v 1.26 2006/01/22 17:58:24 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXVisual.h" #include "FXDrawable.h" /* Notes: - Abstract drawable surface. */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT_ABSTRACT(FXDrawable,FXId,NULL,0) // For deserialization FXDrawable::FXDrawable(){ visual=(FXVisual*)-1L; width=1; height=1; } // Initialize nicely FXDrawable::FXDrawable(FXApp* a,FXint w,FXint h):FXId(a){ visual=NULL; width=FXMAX(w,1); height=FXMAX(h,1); } // Change visual void FXDrawable::setVisual(FXVisual* vis){ if(!vis){ fxerror("%s::setVisual: NULL visual\n",getClassName()); } if(xid){ fxerror("%s::setVisual: visual should be set before calling create()\n",getClassName()); } visual=vis; } // Resize drawable to the specified width and height void FXDrawable::resize(FXint w,FXint h){ width=FXMAX(w,1); height=FXMAX(h,1); } // Save data void FXDrawable::save(FXStream& store) const { FXId::save(store); store << visual; store << width; store << height; } // Load data void FXDrawable::load(FXStream& store){ FXId::load(store); store >> visual; store >> width; store >> height; } // Clean up FXDrawable::~FXDrawable(){ visual=(FXVisual*)-1L; xid=0; } } fox1.6-1.6.57/src/FXDriveBox.cpp000066400000000000000000000234201326741342000161110ustar00rootroot00000000000000/******************************************************************************** * * * D r i v e B o x O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXDriveBox.cpp,v 1.35 2006/01/22 17:58:25 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXId.h" #include "FXPath.h" #include "FXSystem.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXIcon.h" #include "FXGIFIcon.h" #include "FXBMPIcon.h" #include "FXFont.h" #include "FXDC.h" #include "FXWindow.h" #include "FXComposite.h" #include "FXShell.h" #include "FXTopWindow.h" #include "FXDialogBox.h" #include "FXMessageBox.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXTextField.h" #include "FXButton.h" #include "FXMenuButton.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXShell.h" #include "FXPopup.h" #include "FXScrollBar.h" #include "FXScrollArea.h" #include "FXList.h" #include "FXListBox.h" #include "FXDriveBox.h" #include "FXFileDict.h" #include "icons.h" /* Notes: - When setting path, it adds all directories from the top down to the lowest directory. - It also adds common places in the file system. - Add API's to set current path [from root down to whereever] - Add code to read path of selected item - Add some better icons */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXDriveBox) FXDriveBoxMap[]={ FXMAPFUNC(SEL_CHANGED,FXDriveBox::ID_LIST,FXDriveBox::onListChanged), FXMAPFUNC(SEL_CLICKED,FXDriveBox::ID_LIST,FXDriveBox::onListClicked), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXDriveBox::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE,FXDriveBox::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETSTRINGVALUE,FXDriveBox::onCmdGetStringValue), }; // Implementation FXIMPLEMENT(FXDriveBox,FXListBox,FXDriveBoxMap,ARRAYNUMBER(FXDriveBoxMap)) // Directory box FXDriveBox::FXDriveBox(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXListBox(p,tgt,sel,opts,x,y,w,h, pl,pr,pt,pb){ associations=NULL; if(!(options&DRIVEBOX_NO_OWN_ASSOC)) associations=new FXFileDict(getApp()); foldericon=new FXGIFIcon(getApp(),minifolder); cdromicon=new FXGIFIcon(getApp(),minicdrom); harddiskicon=new FXGIFIcon(getApp(),miniharddisk); netdriveicon=new FXGIFIcon(getApp(),mininetdrive); floppyicon=new FXGIFIcon(getApp(),minifloppy); nethoodicon=new FXGIFIcon(getApp(),mininethood); zipdiskicon=new FXGIFIcon(getApp(),minizipdrive); setDrive(FXSystem::getCurrentDrive()); } // Create void FXDriveBox::create(){ FXListBox::create(); foldericon->create(); cdromicon->create(); harddiskicon->create(); netdriveicon->create(); floppyicon->create(); nethoodicon->create(); zipdiskicon->create(); } // Detach disconnects the icons void FXDriveBox::detach(){ FXListBox::detach(); foldericon->detach(); cdromicon->detach(); harddiskicon->detach(); netdriveicon->detach(); floppyicon->detach(); nethoodicon->detach(); zipdiskicon->detach(); } // Destroy zaps the icons void FXDriveBox::destroy(){ FXListBox::destroy(); foldericon->destroy(); cdromicon->destroy(); harddiskicon->destroy(); netdriveicon->destroy(); floppyicon->destroy(); nethoodicon->destroy(); zipdiskicon->destroy(); } // Set the current item's text from the message long FXDriveBox::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setDrive((char*)ptr); return 1; } // Change value long FXDriveBox::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setDrive(*((FXString*)ptr)); return 1; } // Obtain value long FXDriveBox::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getDrive(); return 1; } #ifndef WIN32 // UNIX flavor // Fill list with names of available drives void FXDriveBox::listDrives(){ register FXFileAssoc *fileassoc; register FXIcon *icon; // Remove old items first clearItems(); // Determine associations, icons and type icon=foldericon; if(associations){ fileassoc=associations->findDirBinding("/"); if(fileassoc && fileassoc->miniicon) icon=fileassoc->miniicon; } // Create icon if(id()) icon->create(); // Add item appendItem("/",icon); } #else // Windows flavor // Fill list with names of available drives void FXDriveBox::listDrives(){ register FXFileAssoc *fileassoc; register FXIcon *icon; FXchar drivename[10]; FXuint drivemask; // Remove old drives clearItems(); // Add all drives drivemask=GetLogicalDrives(); drivename[1]=':'; drivename[2]=PATHSEP; drivename[3]='\0'; // Loop over drive letters for(drivename[0]='A'; drivename[0]<='Z'; drivename[0]++){ if(drivemask&1){ // Default icon based on hardware type switch(GetDriveTypeA(drivename)){ case DRIVE_REMOVABLE: icon=(drivename[0]<='B') ? floppyicon : zipdiskicon; break; case DRIVE_FIXED: icon=harddiskicon; break; case DRIVE_REMOTE: icon=netdriveicon; break; case DRIVE_CDROM: icon=cdromicon; break; case DRIVE_RAMDISK: icon=harddiskicon; break; case DRIVE_UNKNOWN: icon=foldericon; break; case DRIVE_NO_ROOT_DIR: icon=foldericon; break; default: icon=foldericon; break; } // Maybe override from associations if(associations){ fileassoc=associations->findDirBinding(drivename); if(fileassoc && fileassoc->miniicon) icon=fileassoc->miniicon; } // Create item if(id()) icon->create(); // Add another item appendItem(drivename,icon); } drivemask>>=1; } } #endif // Forward clicked message from list to target long FXDriveBox::onListClicked(FXObject*,FXSelector,void* ptr){ button->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); // Unpost the list if(0<=((FXint)(FXival)ptr)){ field->setText(getItemText((FXival)ptr)); field->setIcon(getItemIcon((FXival)ptr)); if(target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)getItemText((FXival)ptr).text());} } return 1; } // List has changed long FXDriveBox::onListChanged(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)getItemText((FXival)ptr).text()); } // Set directory FXbool FXDriveBox::setDrive(const FXString& drive){ listDrives(); setCurrentItem(findItem(FXPath::drive(FXPath::absolute(drive)))); return TRUE; } // Return current drive FXString FXDriveBox::getDrive() const { return getItemText(getCurrentItem()); } // Change associations table; force regeneration of the items // in the tree list so all the new bindings take effect void FXDriveBox::setAssociations(FXFileDict* assocs){ if(associations!=assocs){ associations=assocs; listDrives(); } } // Save object to stream void FXDriveBox::save(FXStream& store) const { FXListBox::save(store); store << associations; store << foldericon; store << cdromicon; store << harddiskicon; store << netdriveicon; store << floppyicon; store << nethoodicon; store << zipdiskicon; } // Load object from stream void FXDriveBox::load(FXStream& store){ FXListBox::load(store); store >> associations; store >> foldericon; store >> cdromicon; store >> harddiskicon; store >> netdriveicon; store >> floppyicon; store >> nethoodicon; store >> zipdiskicon; } // Delete it FXDriveBox::~FXDriveBox(){ clearItems(); if(!(options&DRIVEBOX_NO_OWN_ASSOC)) delete associations; delete foldericon; delete cdromicon; delete harddiskicon; delete netdriveicon; delete floppyicon; delete nethoodicon; delete zipdiskicon; associations=(FXFileDict*)-1L; foldericon=(FXIcon*)-1L; cdromicon=(FXIcon*)-1L; harddiskicon=(FXIcon*)-1L; netdriveicon=(FXIcon*)-1L; floppyicon=(FXIcon*)-1L; nethoodicon=(FXIcon*)-1L; zipdiskicon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXException.cpp000066400000000000000000000053601326741342000163300ustar00rootroot00000000000000/******************************************************************************** * * * E x c e p t i o n T y p e s * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXException.cpp,v 1.13 2006/01/22 17:58:25 fox Exp $ * ********************************************************************************/ #include "fxver.h" #include "fxdefs.h" #include "FXException.h" using namespace FX; namespace FX { // Generic unspecified exception const FXchar FXException::exceptionName[]="unknown"; // Error occured const FXchar FXErrorException::exceptionName[]="error"; // Index out of range const FXchar FXRangeException::exceptionName[]="out of range"; // Invalid pointer argument const FXchar FXPointerException::exceptionName[]="invalid pointer"; // Some resource exhausted const FXchar FXResourceException::exceptionName[]="resource exhausted"; // Out of memory const FXchar FXMemoryException::exceptionName[]="out of memory"; // Window exception const FXchar FXWindowException::exceptionName[]="window exception"; // Image, cursor, bitmap exception const FXchar FXImageException::exceptionName[]="image exception"; // Font exception const FXchar FXFontException::exceptionName[]="font exception"; } fox1.6-1.6.57/src/FXExpression.cpp000066400000000000000000000640771326741342000165430ustar00rootroot00000000000000/******************************************************************************** * * * E x p r e s s i o n E v a l u a t o r * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXExpression.cpp,v 1.30.2.1 2006/07/24 15:33:14 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "fxunicode.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXExpression.h" /* Notes: - Old as night, but recently rediscovered ;-). - Better treatment of identifiers needed [user-supplied names]. - Maintain stack-depth during compile phase for possible limit check. */ #define MAXSTACKDEPTH 128 using namespace FX; /*******************************************************************************/ namespace { // Tokens enum { TK_EOF = 0, TK_INT = 1, TK_INT_HEX = 2, TK_INT_BIN = 3, TK_INT_OCT = 4, TK_REAL = 5, TK_PLUS = 6, TK_MINUS = 7, TK_TIMES = 8, TK_DIVIDE = 9, TK_MODULO = 10, TK_POWER = 11, TK_LPAR = 12, TK_RPAR = 13, TK_LESS = 14, TK_GREATER = 15, TK_LESSEQ = 16, TK_GREATEREQ = 17, TK_EQUAL = 18, TK_NOTEQUAL = 19, TK_AND = 20, TK_OR = 21, TK_XOR = 22, TK_NOT = 23, TK_SHIFTLEFT = 24, TK_SHIFTRIGHT = 25, TK_COMMA = 26, TK_PI = 27, TK_EULER = 28, TK_RAN = 29, TK_ERROR = 30, TK_ABS = 108848, TK_ACOS = 3592862, TK_ACOSH = 118564406, TK_ASIN = 3610325, TK_ASINH = 119140637, TK_ATAN = 3615258, TK_ATANH = 119303474, TK_CEIL = 3523203, TK_COS = 107103, TK_COSH = 3534423, TK_EXP = 114029, TK_FLOOR = 122360152, TK_LOG = 114052, TK_LOG10 = 124204261, TK_SIN = 124308, TK_SINH = 4102268, TK_SQRT = 4076772, TK_TAN = 123227, TK_TANH = 4066515, TK_MAX = 121748, TK_MIN = 121482, TK_POW = 119176, TK_ATAN2 = 119303528 }; // Opcodes enum { OP_END, OP_NUM, OP_VAR, OP_PI, OP_EULER, OP_RAND, OP_NOT, OP_NEG, OP_MUL, OP_DIV, OP_MOD, OP_ADD, OP_SUB, OP_AND, OP_OR, OP_XOR, OP_SHL, OP_SHR, OP_LT, OP_GT, OP_LE, OP_GE, OP_EQ, OP_NE, OP_ABS, OP_ACOS, OP_ACOSH, OP_ASIN, OP_ASINH, OP_ATAN, OP_ATANH, OP_CEIL, OP_COS, OP_COSH, OP_EXP, OP_FLOOR, OP_LOG, OP_LOG10, OP_SIN, OP_SINH, OP_SQRT, OP_TAN, OP_TANH, OP_MAX, OP_MIN, OP_POW, OP_ATAN2 }; // Compile class struct FXCompile { const FXchar *head; const FXchar *tail; const FXchar *vars; FXuchar *code; FXuchar *pc; FXuint token; FXExpressionError compile(); FXExpressionError expression(); FXExpressionError compexp(); FXExpressionError shiftexp(); FXExpressionError addexp(); FXExpressionError mulexp(); FXExpressionError powexp(); FXExpressionError primary(); FXExpressionError element(); FXint lookup(const FXchar *list); void opcode(FXuchar op); void operand(FXint n); void operand(FXdouble num); void gettok(); }; /*******************************************************************************/ #ifndef NDEBUG // Dump program void dump(FXuchar *prog){ FXint op; fxmessage("\n"); fxmessage("Program:\n"); fxmessage("%-10p SIZE %d\n",prog,*((FXint*)prog)); prog+=4; while(1){ fxmessage("%-10p ",prog); op=*prog++; switch(op){ case OP_END: fxmessage("OP_END\n"); goto x; case OP_NUM: fxmessage("OP_NUM %.10g\n",*((FXdouble*)prog)); prog+=8; break; case OP_VAR: fxmessage("OP_VAR %d\n",*prog); prog++; break; case OP_PI: fxmessage("OP_PI\n"); break; case OP_EULER: fxmessage("OP_EULER\n"); break; case OP_RAND: fxmessage("OP_RAND\n"); break; case OP_NOT: fxmessage("OP_NOT\n"); break; case OP_NEG: fxmessage("OP_NEG\n"); break; case OP_SIN: fxmessage("OP_SIN\n"); break; case OP_COS: fxmessage("OP_COS\n"); break; case OP_TAN: fxmessage("OP_TAN\n"); break; case OP_ASIN: fxmessage("OP_ASIN\n"); break; case OP_ACOS: fxmessage("OP_ACOS\n"); break; case OP_ATAN: fxmessage("OP_ATAN\n"); break; case OP_SINH: fxmessage("OP_SINH\n"); break; case OP_COSH: fxmessage("OP_COSH\n"); break; case OP_TANH: fxmessage("OP_TANH\n"); break; case OP_ASINH: fxmessage("OP_ASINH\n"); break; case OP_ACOSH: fxmessage("OP_ACOSH\n"); break; case OP_ATANH: fxmessage("OP_ATANH\n"); break; case OP_SQRT: fxmessage("OP_SQRT\n"); break; case OP_ABS: fxmessage("OP_ABS\n"); break; case OP_CEIL: fxmessage("OP_CEIL\n"); break; case OP_FLOOR: fxmessage("OP_FLOOR\n"); break; case OP_EXP: fxmessage("OP_EXP\n"); break; case OP_LOG: fxmessage("OP_LOG\n"); break; case OP_LOG10: fxmessage("OP_LOG10\n"); break; case OP_MUL: fxmessage("OP_MUL\n"); break; case OP_DIV: fxmessage("OP_DIV\n"); break; case OP_MOD: fxmessage("OP_MOD\n"); break; case OP_ADD: fxmessage("OP_ADD\n"); break; case OP_SUB: fxmessage("OP_SUB\n"); break; case OP_AND: fxmessage("OP_AND\n"); break; case OP_OR: fxmessage("OP_OR\n"); break; case OP_XOR: fxmessage("OP_XOR\n"); break; case OP_LT: fxmessage("OP_LT\n"); break; case OP_GT: fxmessage("OP_GT\n"); break; case OP_LE: fxmessage("OP_LE\n"); break; case OP_GE: fxmessage("OP_GE\n"); break; case OP_EQ: fxmessage("OP_EQ\n"); break; case OP_NE: fxmessage("OP_NE\n"); break; case OP_POW: fxmessage("OP_POW\n"); break; case OP_MAX: fxmessage("OP_MAX\n"); break; case OP_MIN: fxmessage("OP_MIN\n"); break; case OP_ATAN2: fxmessage("OP_ATAN2\n"); break; default: fxmessage("OP_%d: error\n",op); goto x; } } x:fxmessage("end\n"); } #endif /*******************************************************************************/ // Compile expression FXExpressionError FXCompile::compile(){ FXExpressionError err; if(token==TK_EOF) return EXPRERR_EMPTY; err=expression(); if(err!=EXPRERR_OK) return err; if(token!=TK_EOF) return EXPRERR_TOKEN; opcode(OP_END); return EXPRERR_OK; } // Expression FXExpressionError FXCompile::expression(){ FXExpressionError err=compexp(); if(err!=EXPRERR_OK) return err; while(TK_AND<=token && token<=TK_XOR){ FXuint t=token; gettok(); err=compexp(); if(err!=EXPRERR_OK) return err; if(t==TK_AND) opcode(OP_AND); else if(t==TK_OR) opcode(OP_OR); else opcode(OP_XOR); } return EXPRERR_OK; } // Compare expression FXExpressionError FXCompile::compexp(){ FXExpressionError err=shiftexp(); if(err!=EXPRERR_OK) return err; if(TK_LESS<=token && token<=TK_NOTEQUAL){ FXuint t=token; gettok(); err=shiftexp(); if(err!=EXPRERR_OK) return err; if(t==TK_LESS) opcode(OP_LT); else if(t==TK_LESSEQ) opcode(OP_LE); else if(t==TK_GREATER) opcode(OP_GT); else if(t==TK_GREATEREQ) opcode(OP_GE); else if(t==TK_EQUAL) opcode(OP_EQ); else opcode(OP_NE); } return EXPRERR_OK; } // Shift expression FXExpressionError FXCompile::shiftexp(){ FXExpressionError err=addexp(); if(err!=EXPRERR_OK) return err; while(TK_SHIFTLEFT<=token && token<=TK_SHIFTRIGHT){ FXuint t=token; gettok(); err=mulexp(); if(err!=EXPRERR_OK) return err; if(t==TK_SHIFTLEFT) opcode(OP_SHL); else opcode(OP_SHR); } return EXPRERR_OK; } // Add expression FXExpressionError FXCompile::addexp(){ FXExpressionError err=mulexp(); if(err!=EXPRERR_OK) return err; while(TK_PLUS<=token && token<=TK_MINUS){ FXuint t=token; gettok(); err=mulexp(); if(err!=EXPRERR_OK) return err; if(t==TK_MINUS) opcode(OP_SUB); else opcode(OP_ADD); } return EXPRERR_OK; } // Mul expression FXExpressionError FXCompile::mulexp(){ FXExpressionError err=powexp(); if(err!=EXPRERR_OK) return err; while(TK_TIMES<=token && token<=TK_MODULO){ FXuint t=token; gettok(); err=powexp(); if(err!=EXPRERR_OK) return err; if(t==TK_TIMES) opcode(OP_MUL); else if(t==TK_DIVIDE) opcode(OP_DIV); else opcode(OP_MOD); } return EXPRERR_OK; } // Power expression FXExpressionError FXCompile::powexp(){ FXExpressionError err=primary(); if(err!=EXPRERR_OK) return err; if(token==TK_POWER){ gettok(); err=powexp(); if(err!=EXPRERR_OK) return err; opcode(OP_POW); } return EXPRERR_OK; } // Primary FXExpressionError FXCompile::primary(){ FXExpressionError err; if(token==TK_PLUS || token==TK_MINUS || token==TK_NOT){ FXuint t=token; gettok(); err=primary(); if(err!=EXPRERR_OK) return err; if(t==TK_MINUS) opcode(OP_NEG); else if(t==TK_NOT) opcode(OP_NOT); } else{ err=element(); if(err!=EXPRERR_OK) return err; } return EXPRERR_OK; } // Element FXExpressionError FXCompile::element(){ FXExpressionError err; FXdouble num; FXuchar op; FXint v; switch(token){ case TK_LPAR: gettok(); err=expression(); if(err!=EXPRERR_OK) return err; if(token!=TK_RPAR) return EXPRERR_PAREN; break; case TK_INT_HEX: num=(FXdouble)strtol(head+2,NULL,16); opcode(OP_NUM); operand(num); break; case TK_INT_BIN: num=(FXdouble)strtol(head+2,NULL,2); opcode(OP_NUM); operand(num); break; case TK_INT_OCT: num=(FXdouble)strtol(head+1,NULL,8); opcode(OP_NUM); operand(num); break; case TK_INT: num=(FXdouble)strtol(head,NULL,10); opcode(OP_NUM); operand(num); break; case TK_REAL: num=strtod(head,NULL); opcode(OP_NUM); operand(num); break; case TK_PI: opcode(OP_PI); break; case TK_EULER: opcode(OP_EULER); break; case TK_RAN: opcode(OP_RAND); break; case TK_MAX: op=OP_MAX; goto dyad; case TK_MIN: op=OP_MIN; goto dyad; case TK_POW: op=OP_POW; goto dyad; case TK_ATAN2: op=OP_ATAN2; dyad: gettok(); if(token!=TK_LPAR) return EXPRERR_PAREN; gettok(); err=expression(); if(err!=EXPRERR_OK) return err; if(token!=TK_COMMA) return EXPRERR_COMMA; gettok(); err=expression(); if(err!=EXPRERR_OK) return err; if(token!=TK_RPAR) return EXPRERR_PAREN; opcode(op); break; case TK_ABS: op=OP_ABS; goto mono; case TK_ACOS: op=OP_ACOS; goto mono; case TK_ACOSH: op=OP_ACOS; goto mono; case TK_ASIN: op=OP_ASIN; goto mono; case TK_ASINH: op=OP_ASINH; goto mono; case TK_ATAN: op=OP_ATAN; goto mono; case TK_ATANH: op=OP_ATANH; goto mono; case TK_CEIL: op=OP_CEIL; goto mono; case TK_COS: op=OP_COS; goto mono; case TK_COSH: op=OP_COSH; goto mono; case TK_EXP: op=OP_EXP; goto mono; case TK_FLOOR: op=OP_FLOOR; goto mono; case TK_LOG: op=OP_LOG; goto mono; case TK_LOG10: op=OP_LOG10; goto mono; case TK_SIN: op=OP_SIN; goto mono; case TK_SINH: op=OP_SINH; goto mono; case TK_SQRT: op=OP_SQRT; goto mono; case TK_TAN: op=OP_TAN; goto mono; case TK_TANH: op=OP_TANH; mono: gettok(); if(token!=TK_LPAR) return EXPRERR_PAREN; gettok(); err=expression(); if(err!=EXPRERR_OK) return err; if(token!=TK_RPAR) return EXPRERR_PAREN; opcode(op); break; default: v=lookup(vars); if(v<0) return EXPRERR_IDENT; opcode(OP_VAR); opcode(v); break; case TK_EOF: case TK_TIMES: case TK_DIVIDE: case TK_MODULO: case TK_POWER: case TK_RPAR: case TK_LESS: case TK_GREATER: case TK_LESSEQ: case TK_GREATEREQ: case TK_EQUAL: case TK_NOTEQUAL: case TK_AND: case TK_OR: case TK_XOR: case TK_SHIFTLEFT: case TK_SHIFTRIGHT: case TK_COMMA: case TK_ERROR: return EXPRERR_TOKEN; } gettok(); return EXPRERR_OK; } // Lookup current token in list FXint FXCompile::lookup(const FXchar *list){ if(list){ FXint which=0; while(*list){ const FXchar *q; for(q=head; q': token=TK_GREATER; tail++; if(*tail=='='){ token=TK_GREATEREQ; tail++; } else if(*tail=='>'){ token=TK_SHIFTRIGHT; tail++; } return; case '|': token=TK_OR; tail++; return; case '&': token=TK_AND; tail++; return; case '^': token=TK_XOR; tail++; return; case '~': token=TK_NOT; tail++; return; case '-': token=TK_MINUS; tail++; return; case '+': token=TK_PLUS; tail++; return; case '*': token=TK_TIMES; tail++; if(*tail=='*'){ token=TK_POWER; tail++; } return; case '/': token=TK_DIVIDE; tail++; return; case '%': token=TK_MODULO; tail++; return; case '!': token=TK_ERROR; tail++; if(*tail=='='){ token=TK_NOTEQUAL; tail++; } return; case '(': token=TK_LPAR; tail++; return; case ')': token=TK_RPAR; tail++; return; case ',': token=TK_COMMA; tail++; return; case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': token=TK_INT; if(c=='0'){ tail++; if(*tail=='x' || *tail=='X'){ tail++; if(!Ascii::isHexDigit(*tail)){ token=TK_ERROR; return; } tail++; while(Ascii::isHexDigit(*tail)) tail++; token=TK_INT_HEX; return; } if(*tail=='b' || *tail=='B'){ tail++; if(*tail!='0' && *tail!='1'){ token=TK_ERROR; return; } tail++; while(*tail=='0' || *tail=='1') tail++; token=TK_INT_BIN; return; } if('0'<=*tail && *tail<='7'){ tail++; while('0'<=*tail && *tail<='7') tail++; if('7'<=*tail && *tail<='9'){ token=TK_ERROR; return; } token=TK_INT_OCT; return; } } while(Ascii::isDigit(*tail)) tail++; if(*tail=='.'){ token=TK_REAL; tail++; while(Ascii::isDigit(*tail)) tail++; } if(*tail=='e' || *tail=='E'){ token=TK_REAL; tail++; if(*tail=='-' || *tail=='+') tail++; if(!Ascii::isDigit(*tail)){ token=TK_ERROR; return; } tail++; while(Ascii::isDigit(*tail)) tail++; } return; case 'e': if(Ascii::isAlphaNumeric(tail[1])) goto ident; token=TK_EULER; tail+=1; return; case 'p': if(tail[1]!='i') goto ident; if(Ascii::isAlphaNumeric(tail[2])) goto ident; token=TK_PI; tail+=2; return; case 'r': if(tail[1]!='a') goto ident; if(tail[2]!='n') goto ident; if(Ascii::isAlphaNumeric(tail[3])) goto ident; token=TK_RAN; tail+=3; return; default: ident: token=TK_ERROR; if(Ascii::isLetter(*tail)){ token=*tail++; while(Ascii::isAlphaNumeric(*tail)){ token=((token<<5)+token)^*tail++; } } return; } } token=TK_EOF; } // Emit opcode void FXCompile::opcode(FXuchar op){ if(code){ pc[0]=op; } pc++; } // Emit integer operand void FXCompile::operand(FXint n){ if(code){ #if defined(__i386__) || defined(__x86_64__) || defined(WIN32) ((FXint*)pc)[0]=n; #else pc[0]=((const FXuchar*)&n)[0]; pc[1]=((const FXuchar*)&n)[1]; pc[2]=((const FXuchar*)&n)[2]; pc[3]=((const FXuchar*)&n)[3]; #endif } pc+=4; } // Emit double operand void FXCompile::operand(FXdouble n){ if(code){ #if defined(__i386__) || defined(__x86_64__) || defined(WIN32) ((FXdouble*)pc)[0]=n; #else pc[0]=((const FXuchar*)&n)[0]; pc[1]=((const FXuchar*)&n)[1]; pc[2]=((const FXuchar*)&n)[2]; pc[3]=((const FXuchar*)&n)[3]; pc[4]=((const FXuchar*)&n)[4]; pc[5]=((const FXuchar*)&n)[5]; pc[6]=((const FXuchar*)&n)[6]; pc[7]=((const FXuchar*)&n)[7]; #endif } pc+=8; } } /*******************************************************************************/ namespace FX { #if FOX_BIGENDIAN == 1 const FXuchar FXExpression::initial[]={0,0,0,14,OP_NUM,0,0,0,0,0,0,0,0,OP_END}; #endif #if FOX_BIGENDIAN == 0 const FXuchar FXExpression::initial[]={14,0,0,0,OP_NUM,0,0,0,0,0,0,0,0,OP_END}; #endif // Table of error messages const FXchar *const FXExpression::errors[]={ "OK", "Empty expression", "Out of memory", "Unmatched parenthesis", "Illegal token", "Expected comma", "Unknown identifier" }; // Construct empty expression object FXExpression::FXExpression():code((FXuchar*)initial){ } // Copy regex object FXExpression::FXExpression(const FXExpression& orig):code((FXuchar*)initial){ if(orig.code!=initial){ FXMEMDUP(&code,orig.code,FXuchar,*((FXint*)orig.code)); } } // Compile expression from pattern; fail if error FXExpression::FXExpression(const FXchar* expression,const FXchar* variables,FXExpressionError* error):code((FXuchar*)initial){ FXExpressionError err=parse(expression,variables); if(error){ *error=err; } } // Compile expression from pattern; fail if error FXExpression::FXExpression(const FXString& expression,const FXString& variables,FXExpressionError* error):code((FXuchar*)initial){ FXExpressionError err=parse(expression.text(),variables.text()); if(error){ *error=err; } } // Assignment FXExpression& FXExpression::operator=(const FXExpression& orig){ if(code!=orig.code){ if(code!=initial) FXFREE(&code); code=(FXuchar*)initial; if(orig.code!=initial){ FXMEMDUP(&code,orig.code,FXuchar,*((FXint*)orig.code)); } } return *this; } // Parse expression, return error code if syntax error is found FXExpressionError FXExpression::parse(const FXchar* expression,const FXchar* variables){ FXExpressionError err=EXPRERR_EMPTY; FXint size=0; FXCompile cs; // Free old code, if any if(code!=initial) FXFREE(&code); code=(FXuchar*)initial; // If not empty, parse expression if(expression){ // Fill in compile data cs.tail=expression; cs.vars=variables; cs.code=NULL; cs.pc=NULL; cs.token=TK_EOF; // Get first token cs.gettok(); // Emit unknown size cs.operand(0); // Parse to check syntax and determine size err=cs.compile(); // Was OK? if(err==EXPRERR_OK){ // Allocate new code size=cs.pc-cs.code; if(!FXMALLOC(&code,FXuchar,size)){ code=(FXuchar*)initial; return EXPRERR_MEMORY; } // Fill in compile data cs.tail=expression; cs.code=code; cs.pc=code; cs.token=TK_EOF; // Get first token cs.gettok(); // Emit code size cs.operand(size); // Generate program err=cs.compile(); // Dump for debugging #ifndef NDEBUG if(fxTraceLevel>100) dump(code); #endif } } return err; } // Parse expression, return error code if syntax error is found FXExpressionError FXExpression::parse(const FXString& expression,const FXString& variables){ return parse(expression.text(),variables.text()); } // Evaluate expression FXdouble FXExpression::evaluate(const FXdouble *args){ FXdouble stack[MAXSTACKDEPTH]; register const FXuchar *pc=code+4; register FXdouble *sp=stack-1; while(1){ switch(*pc++){ case OP_END: return *sp; #if defined(__i386__) || defined(__x86_64__) || defined(WIN32) case OP_NUM: *++sp=*((FXdouble*)pc); pc+=8; break; #else case OP_NUM: ++sp; ((FXuchar*)sp)[0]=*pc++; ((FXuchar*)sp)[1]=*pc++; ((FXuchar*)sp)[2]=*pc++; ((FXuchar*)sp)[3]=*pc++; ((FXuchar*)sp)[4]=*pc++; ((FXuchar*)sp)[5]=*pc++; ((FXuchar*)sp)[6]=*pc++; ((FXuchar*)sp)[7]=*pc++; break; #endif case OP_VAR: *++sp=args[*pc++]; break; case OP_PI: *++sp=3.1415926535897932384626433833; break; case OP_EULER: *++sp=2.7182818284590452353602874713; break; #ifndef WIN32 case OP_RAND: *++sp=drand48(); break; #else case OP_RAND: *++sp=(FXdouble)rand()/(FXdouble)RAND_MAX; break; #endif case OP_NOT: *sp=(FXdouble)(~((FXint)*sp)); break; case OP_NEG: *sp=-*sp; break; case OP_SIN: *sp=sin(*sp); break; case OP_COS: *sp=cos(*sp); break; case OP_TAN: *sp=tan(*sp); break; case OP_ASIN: *sp=asin(*sp); break; case OP_ACOS: *sp=acos(*sp); break; case OP_ATAN: *sp=atan(*sp); break; case OP_SINH: *sp=sinh(*sp); break; case OP_COSH: *sp=cosh(*sp); break; case OP_TANH: *sp=tanh(*sp); break; #ifndef WIN32 case OP_ASINH: *sp=asinh(*sp); break; case OP_ACOSH: *sp=acosh(*sp); break; case OP_ATANH: *sp=atanh(*sp); break; #else case OP_ASINH: *sp=log(*sp + sqrt(*sp * *sp + 1.0)); break; case OP_ACOSH: *sp=log(*sp + sqrt(*sp * *sp - 1.0)); break; case OP_ATANH: *sp=0.5 * log((1.0 + *sp)/(1.0 - *sp)); break; #endif case OP_SQRT: *sp=sqrt(*sp); break; case OP_ABS: *sp=fabs(*sp); break; case OP_CEIL: *sp=ceil(*sp); break; case OP_FLOOR: *sp=floor(*sp); break; case OP_EXP: *sp=exp(*sp); break; case OP_LOG: *sp=log(*sp); break; case OP_LOG10: *sp=log10(*sp); break; case OP_MUL: *(sp-1)=*(sp-1) * *sp; --sp; break; case OP_DIV: *(sp-1)=*(sp-1) / *sp; --sp; break; case OP_MOD: *(sp-1)=fmod(*(sp-1),*sp); --sp; break; case OP_ADD: *(sp-1)=*(sp-1) + *sp; --sp; break; case OP_SUB: *(sp-1)=*(sp-1) - *sp; --sp; break; case OP_AND: *(sp-1)=(FXdouble)(((FXint)*(sp-1)) & ((FXint)*sp)); --sp; break; case OP_OR: *(sp-1)=(FXdouble)(((FXint)*(sp-1)) | ((FXint)*sp)); --sp; break; case OP_XOR: *(sp-1)=(FXdouble)(((FXint)*(sp-1)) ^ ((FXint)*sp)); --sp; break; case OP_SHL: *(sp-1)=(FXdouble)(((FXint)*(sp-1)) << ((FXint)*sp)); --sp; break; case OP_SHR: *(sp-1)=(FXdouble)(((FXint)*(sp-1)) >> ((FXint)*sp)); --sp; break; case OP_LT: *(sp-1)=(FXdouble)(*(sp-1) < *sp); --sp; break; case OP_GT: *(sp-1)=(FXdouble)(*(sp-1) > *sp); --sp; break; case OP_LE: *(sp-1)=(FXdouble)(*(sp-1) <= *sp); --sp; break; case OP_GE: *(sp-1)=(FXdouble)(*(sp-1) >= *sp); --sp; break; case OP_EQ: *(sp-1)=(FXdouble)(*(sp-1) == *sp); --sp; break; case OP_NE: *(sp-1)=(FXdouble)(*(sp-1) != *sp); --sp; break; case OP_POW: *(sp-1)=pow(*(sp-1),*sp); --sp; break; case OP_MAX: *(sp-1)=FXMAX(*(sp-1),*sp); --sp; break; case OP_MIN: *(sp-1)=FXMIN(*(sp-1),*sp); --sp; break; case OP_ATAN2: *(sp-1)=atan2(*(sp-1),*sp); --sp; break; } } return 0.0; } // Clean up FXExpression::~FXExpression(){ if(code!=initial) FXFREE(&code); } } fox1.6-1.6.57/src/FXExtentd.cpp000066400000000000000000000115561326741342000160110ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n E x t e n t C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXExtentd.cpp,v 1.3 2006/01/22 17:58:25 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXVec2d.h" #include "FXExtentd.h" /* Notes: */ using namespace FX; /************************** E x t e n t C l a s s *************************/ namespace FX { // Longest side FXdouble FXExtentd::longest() const { register FXdouble x=upper.x-lower.x; register FXdouble y=upper.y-lower.y; return FXMAX(x,y); } // Shortest side FXdouble FXExtentd::shortest() const { register FXdouble x=upper.x-lower.x; register FXdouble y=upper.y-lower.y; return FXMIN(x,y); } // Length of diagonal FXdouble FXExtentd::diameter() const { register FXdouble x=upper.x-lower.x; register FXdouble y=upper.y-lower.y; return sqrt(x*x+y*y); } // Get radius of box FXdouble FXExtentd::radius() const { return diameter()*0.5; } // Get diagonal of box FXVec2d FXExtentd::diagonal() const { return upper-lower; } // Get center of box FXVec2d FXExtentd::center() const { return 0.5*(upper+lower); } // Test if empty bool FXExtentd::empty() const { return upper.xupper.x) upper.x=x; if(yupper.y) upper.y=y; return *this; } // Include point into range FXExtentd& FXExtentd::include(const FXVec2d& v){ return include(v.x,v.y); } // Include given box into box's range FXExtentd& FXExtentd::include(const FXExtentd& ext){ if(ext.lower.xupper.x) upper.x=ext.upper.x; if(ext.lower.yupper.y) upper.y=ext.upper.y; return *this; } // Test if overlap bool overlap(const FXExtentd& a,const FXExtentd& b){ return a.upper.x>=b.lower.x && a.lower.x<=b.upper.x && a.upper.y>=b.lower.y && a.lower.y<=b.upper.y; } // Union of two boxes FXExtentd unite(const FXExtentd& a,const FXExtentd& b){ return FXExtentd(lo(a.lower,b.lower),hi(a.upper,b.upper)); } // Intersection of two boxes FXExtentd intersect(const FXExtentd& a,const FXExtentd& b){ return FXExtentd(hi(a.lower,b.lower),lo(a.upper,b.upper)); } // Saving FXStream& operator<<(FXStream& store,const FXExtentd& ext){ store << ext.lower.x << ext.upper.x; store << ext.lower.y << ext.upper.y; return store; } // Loading FXStream& operator>>(FXStream& store,FXExtentd& ext){ store >> ext.lower.x >> ext.upper.x; store >> ext.lower.y >> ext.upper.y; return store; } } fox1.6-1.6.57/src/FXExtentf.cpp000066400000000000000000000115431326741342000160070ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n E x t e n t C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXExtentf.cpp,v 1.3 2006/01/22 17:58:25 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXVec2f.h" #include "FXExtentf.h" /* Notes: */ using namespace FX; /************************** E x t e n t C l a s s *************************/ namespace FX { // Longest side FXfloat FXExtentf::longest() const { register FXfloat x=upper.x-lower.x; register FXfloat y=upper.y-lower.y; return FXMAX(x,y); } // Shortest side FXfloat FXExtentf::shortest() const { register FXfloat x=upper.x-lower.x; register FXfloat y=upper.y-lower.y; return FXMIN(x,y); } // Length of diagonal FXfloat FXExtentf::diameter() const { register FXfloat x=upper.x-lower.x; register FXfloat y=upper.y-lower.y; return sqrtf(x*x+y*y); } // Get radius of box FXfloat FXExtentf::radius() const { return diameter()*0.5f; } // Get diagonal of box FXVec2f FXExtentf::diagonal() const { return upper-lower; } // Get center of box FXVec2f FXExtentf::center() const { return 0.5f*(upper+lower); } // Test if empty bool FXExtentf::empty() const { return upper.xupper.x) upper.x=x; if(yupper.y) upper.y=y; return *this; } // Include point into range FXExtentf& FXExtentf::include(const FXVec2f& v){ return include(v.x,v.y); } // Include given box into box's range FXExtentf& FXExtentf::include(const FXExtentf& ext){ if(ext.lower.xupper.x) upper.x=ext.upper.x; if(ext.lower.yupper.y) upper.y=ext.upper.y; return *this; } // Test if overlap bool overlap(const FXExtentf& a,const FXExtentf& b){ return a.upper.x>=b.lower.x && a.lower.x<=b.upper.x && a.upper.y>=b.lower.y && a.lower.y<=b.upper.y; } // Union of two boxes FXExtentf unite(const FXExtentf& a,const FXExtentf& b){ return FXExtentf(lo(a.lower,b.lower),hi(a.upper,b.upper)); } // Intersection of two boxes FXExtentf intersect(const FXExtentf& a,const FXExtentf& b){ return FXExtentf(hi(a.lower,b.lower),lo(a.upper,b.upper)); } // Saving FXStream& operator<<(FXStream& store,const FXExtentf& ext){ store << ext.lower.x << ext.upper.x; store << ext.lower.y << ext.upper.y; return store; } // Loading FXStream& operator>>(FXStream& store,FXExtentf& ext){ store >> ext.lower.x >> ext.upper.x; store >> ext.lower.y >> ext.upper.y; return store; } } fox1.6-1.6.57/src/FXFile.cpp000066400000000000000000000472221326741342000152540ustar00rootroot00000000000000/******************************************************************************** * * * F i l e C l a s s * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFile.cpp,v 1.249.2.2 2006/11/07 15:58:52 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXPath.h" #include "FXIO.h" #include "FXStat.h" #include "FXFile.h" #include "FXPipe.h" #include "FXDir.h" /* Notes: - Implemented many functions in terms of FXFile and FXDir so we won't have to worry about unicode stuff. - Perhaps we should assume FXString contains string encoded in the locale of the system [which in case of Windows would mean it contains UTF-16]? Because it isn't between 8-bit or 16-bit, but also about utf-8 v.s. other encodings.. - This should be in FXSystem; FXSystem needs to determine the locale, then determine the codec needed for that locale, and then use this codec for encoding our strings to that locale. */ #ifdef WIN32 #define BadHandle INVALID_HANDLE_VALUE #else #define BadHandle -1 #endif #ifdef WIN32 #ifndef INVALID_SET_FILE_POINTER #define INVALID_SET_FILE_POINTER ((DWORD)-1) #endif #endif using namespace FX; /*******************************************************************************/ namespace FX { // Construct file and attach existing handle h FXFile::FXFile(FXInputHandle handle,FXuint mode){ FXIO::open(handle,mode); } // Construct and open a file FXFile::FXFile(const FXString& file,FXuint mode,FXuint perm){ open(file,mode,perm); } // Open file bool FXFile::open(const FXString& file,FXuint mode,FXuint perm){ if(!file.empty() && !isOpen()){ #ifdef WIN32 DWORD flags=GENERIC_READ; DWORD creation=OPEN_EXISTING; // Basic access mode switch(mode&(ReadOnly|WriteOnly)){ case ReadOnly: flags=GENERIC_READ; break; case WriteOnly: flags=GENERIC_WRITE; break; case ReadWrite: flags=GENERIC_READ|GENERIC_WRITE; break; } // Creation and truncation mode switch(mode&(Create|Truncate|Exclusive)){ case Create: creation=OPEN_ALWAYS; break; case Truncate: creation=TRUNCATE_EXISTING; break; case Create|Truncate: creation=CREATE_ALWAYS; break; case Create|Truncate|Exclusive: creation=CREATE_NEW; break; } // Non-blocking mode if(mode&NonBlocking){ // FIXME } #ifdef UNICODE FXnchar unifile[1024]; utf2ncs(unifile,file.text(),file.length()+1); device=::CreateFileW(unifile,flags,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,creation,FILE_ATTRIBUTE_NORMAL,NULL); #else device=::CreateFileA(file.text(),flags,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,creation,FILE_ATTRIBUTE_NORMAL,NULL); #endif access=mode; // Appending if(mode&Append) ::SetFilePointer(device,0,NULL,FILE_END); return (device!=BadHandle); #else FXuint bits=perm&0777; FXuint flags=0; // Basic access mode switch(mode&(ReadOnly|WriteOnly)){ case ReadOnly: flags=O_RDONLY; break; case WriteOnly: flags=O_WRONLY; break; case ReadWrite: flags=O_RDWR; break; } // O_LARGEFILE // Appending and truncation if(mode&Append) flags|=O_APPEND; if(mode&Truncate) flags|=O_TRUNC; // Non-blocking mode if(mode&NonBlocking) flags|=O_NONBLOCK; // Creation mode if(mode&Create){ flags|=O_CREAT; if(mode&Exclusive) flags|=O_EXCL; } // Permission bits if(perm&FXIO::SetUser) bits|=S_ISUID; if(perm&FXIO::SetGroup) bits|=S_ISGID; if(perm&FXIO::Sticky) bits|=S_ISVTX; // Do it device=::open(file.text(),flags,bits); access=mode; return (device!=BadHandle); #endif } return false; } // Open device with access mode and handle bool FXFile::open(FXInputHandle handle,FXuint mode){ return FXIO::open(handle,mode); } // Get position FXlong FXFile::position() const { if(isOpen()){ #ifdef WIN32 LARGE_INTEGER pos; pos.QuadPart=0; pos.LowPart=::SetFilePointer(device,0,&pos.HighPart,FILE_CURRENT); if(pos.LowPart==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR) pos.QuadPart=-1; return pos.QuadPart; #else return ::lseek(device,0,SEEK_CUR); #endif } return -1; } // Move to position FXlong FXFile::position(FXlong offset,FXuint from){ if(isOpen()){ #ifdef WIN32 LARGE_INTEGER pos; pos.QuadPart=offset; pos.LowPart=::SetFilePointer(device,pos.LowPart,&pos.HighPart,from); if(pos.LowPart==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR) pos.QuadPart=-1; return pos.QuadPart; #else return ::lseek(device,offset,from); #endif } return -1; } // Read block FXival FXFile::readBlock(void* data,FXival count){ FXival nread=-1; if(isOpen()){ #ifdef WIN32 DWORD nr; if(::ReadFile(device,data,(DWORD)count,&nr,NULL)!=0){ nread=(FXival)nr; } #else do{ nread=::read(device,data,count); } while(nread<0 && errno==EINTR); #endif } return nread; } // Write block FXival FXFile::writeBlock(const void* data,FXival count){ FXival nwritten=-1; if(isOpen()){ #ifdef WIN32 DWORD nw; if(::WriteFile(device,data,(DWORD)count,&nw,NULL)!=0){ nwritten=(FXival)nw; } #else do{ nwritten=::write(device,data,count); } while(nwritten<0 && errno==EINTR); #endif } return nwritten; } // Truncate file FXlong FXFile::truncate(FXlong size){ if(isOpen()){ #ifdef WIN32 LARGE_INTEGER oldpos,newpos; oldpos.QuadPart=0; newpos.QuadPart=size; oldpos.LowPart=::SetFilePointer(device,0,&oldpos.HighPart,FILE_CURRENT); newpos.LowPart=::SetFilePointer(device,newpos.LowPart,&newpos.HighPart,FILE_BEGIN); if((newpos.LowPart==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR) || ::SetEndOfFile(device)==0) newpos.QuadPart=-1; ::SetFilePointer(device,oldpos.LowPart,&oldpos.HighPart,FILE_BEGIN); return newpos.QuadPart; #else if(::ftruncate(device,size)==0) return size; #endif } return -1; } // Flush to disk bool FXFile::flush(){ if(isOpen()){ #ifdef WIN32 return ::FlushFileBuffers(device)!=0; #else return ::fsync(device)==0; #endif } return false; } // Test if we're at the end bool FXFile::eof(){ if(isOpen()){ register FXlong pos=position(); return 0<=pos && size()<=pos; } return true; } // Return file size FXlong FXFile::size(){ if(isOpen()){ #ifdef WIN32 ULARGE_INTEGER result; result.LowPart=::GetFileSize(device,&result.HighPart); return result.QuadPart; #else struct stat data; if(::fstat(device,&data)==0) return data.st_size; #endif } return -1; } // Close file bool FXFile::close(){ if(isOpen()){ FXInputHandle dev=device; device=BadHandle; #ifdef WIN32 return ::CloseHandle(dev)!=0; #else return ::close(dev)==0; #endif } return false; } // Create new (empty) file bool FXFile::create(const FXString& file,FXuint perm){ if(!file.empty()){ #ifdef WIN32 #ifdef UNICODE FXnchar buffer[1024]; utf2ncs(buffer,file.text(),file.length()+1); FXInputHandle h=::CreateFileW(buffer,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); #else FXInputHandle h=::CreateFileA(file.text(),GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); #endif if(h!=BadHandle){ ::CloseHandle(h); return true; } #else FXInputHandle h=::open(file.text(),O_CREAT|O_WRONLY|O_TRUNC|O_EXCL,perm); if(h!=BadHandle){ ::close(h); return true; } #endif } return false; } // Remove a file bool FXFile::remove(const FXString& file){ if(!file.empty()){ #ifdef WIN32 #ifdef UNICODE FXnchar buffer[1024]; utf2ncs(buffer,file.text(),file.length()+1); return ::DeleteFileW(buffer)!=0; #else return ::DeleteFileA(file.text())!=0; #endif #else return ::unlink(file.text())==0; #endif } return false; } // Rename file bool FXFile::rename(const FXString& srcfile,const FXString& dstfile){ if(srcfile!=dstfile){ #ifdef WIN32 #ifdef UNICODE FXnchar oldname[1024],newname[1024]; utf2ncs(oldname,srcfile.text(),srcfile.length()+1); utf2ncs(newname,dstfile.text(),dstfile.length()+1); return ::MoveFileExW(oldname,newname,MOVEFILE_REPLACE_EXISTING)!=0; #else return ::MoveFileExA(srcfile.text(),dstfile.text(),MOVEFILE_REPLACE_EXISTING)!=0; #endif #else return ::rename(srcfile.text(),dstfile.text())==0; #endif } return false; } #ifdef WIN32 typedef BOOL (WINAPI *FunctionCreateHardLink)(const TCHAR*,const TCHAR*,LPSECURITY_ATTRIBUTES); static BOOL WINAPI HelpCreateHardLink(const TCHAR*,const TCHAR*,LPSECURITY_ATTRIBUTES); static FunctionCreateHardLink MyCreateHardLink=HelpCreateHardLink; // The first time its called, we're setting the function pointer, so // subsequent calls will experience no additional overhead whatsoever! static BOOL WINAPI HelpCreateHardLink(const TCHAR* newname,const TCHAR* oldname,LPSECURITY_ATTRIBUTES sa){ #ifdef UNICODE HMODULE hkernel=LoadLibraryW(L"Kernel32"); if(hkernel){ MyCreateHardLink=(FunctionCreateHardLink)::GetProcAddress(hkernel,"CreateHardLinkW"); ::FreeLibrary(hkernel); return MyCreateHardLink(newname,oldname,sa); } #else HMODULE hkernel=LoadLibraryA("Kernel32"); if(hkernel){ MyCreateHardLink=(FunctionCreateHardLink)::GetProcAddress(hkernel,"CreateHardLinkA"); ::FreeLibrary(hkernel); return MyCreateHardLink(newname,oldname,sa); } #endif return 0; } #endif // Link file bool FXFile::link(const FXString& oldfile,const FXString& newfile){ if(newfile!=oldfile){ #ifdef WIN32 #ifdef UNICODE FXnchar oldname[1024],newname[1024]; utf2ncs(oldname,oldfile.text(),oldfile.length()+1); utf2ncs(newname,newfile.text(),newfile.length()+1); return MyCreateHardLink(newname,oldname,NULL)!=0; #else return MyCreateHardLink(newfile.text(),oldfile.text(),NULL)!=0; #endif #else return ::link(oldfile.text(),newfile.text())==0; #endif } return false; } // Read symbolic link FXString FXFile::symlink(const FXString& file){ if(!file.empty()){ #ifndef WIN32 FXchar lnk[MAXPATHLEN+1]; FXint len=::readlink(file.text(),lnk,MAXPATHLEN); if(0<=len){ return FXString(lnk,len); } #endif } return FXString::null; } // Symbolic Link file bool FXFile::symlink(const FXString& oldfile,const FXString& newfile){ if(newfile!=oldfile){ #ifndef WIN32 return ::symlink(oldfile.text(),newfile.text())==0; #endif } return false; } // Return true if files are identical bool FXFile::identical(const FXString& file1,const FXString& file2){ if(file1!=file2){ #ifdef WIN32 BY_HANDLE_FILE_INFORMATION info1,info2; HANDLE hFile1,hFile2; bool same=false; #ifdef UNICODE FXnchar name1[1024],name2[1024]; utf2ncs(name1,file1.text(),file1.length()+1); utf2ncs(name2,file2.text(),file2.length()+1); hFile1=::CreateFile(name1,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile1!=INVALID_HANDLE_VALUE){ hFile2=::CreateFile(name2,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile2!=INVALID_HANDLE_VALUE){ if(::GetFileInformationByHandle(hFile1,&info1) && ::GetFileInformationByHandle(hFile2,&info2)){ same=(info1.nFileIndexLow==info2.nFileIndexLow && info1.nFileIndexHigh==info2.nFileIndexHigh && info1.dwVolumeSerialNumber==info2.dwVolumeSerialNumber); } ::CloseHandle(hFile2); } ::CloseHandle(hFile1); } return same; #else hFile1=::CreateFile(file1.text(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile1!=INVALID_HANDLE_VALUE){ hFile2=::CreateFile(file2.text(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile2!=INVALID_HANDLE_VALUE){ if(::GetFileInformationByHandle(hFile1,&info1) && ::GetFileInformationByHandle(hFile2,&info2)){ same=(info1.nFileIndexLow==info2.nFileIndexLow && info1.nFileIndexHigh==info2.nFileIndexHigh && info1.dwVolumeSerialNumber==info2.dwVolumeSerialNumber); } ::CloseHandle(hFile2); } ::CloseHandle(hFile1); } return same; #endif #else struct stat stat1,stat2; return !::lstat(file1.text(),&stat1) && !::lstat(file2.text(),&stat2) && stat1.st_ino==stat2.st_ino && stat1.st_dev==stat2.st_dev; #endif } return true; } // Copy srcfile to dstfile, overwriting dstfile if allowed bool FXFile::copy(const FXString& srcfile,const FXString& dstfile,bool overwrite){ if(srcfile!=dstfile){ FXuchar buffer[4096]; FXival nwritten,nread; FXStat stat; FXFile src(srcfile,FXIO::Reading); if(src.isOpen()){ if(FXStat::stat(src,stat)){ FXFile dst(dstfile,overwrite?FXIO::Writing:FXIO::Writing|FXIO::Exclusive,stat.mode()); if(dst.isOpen()){ while(1){ nread=src.readBlock(buffer,sizeof(buffer)); if(nread<0) return false; if(nread==0) break; nwritten=dst.writeBlock(buffer,nread); if(nwritten<0) return false; } return true; } } } } return false; } // Concatenate srcfile1 and srcfile2 to dstfile, overwriting dstfile if allowed bool FXFile::concat(const FXString& srcfile1,const FXString& srcfile2,const FXString& dstfile,bool overwrite){ FXuchar buffer[4096]; FXival nwritten,nread; if(srcfile1!=dstfile && srcfile2!=dstfile){ FXFile src1(srcfile1,FXIO::Reading); if(src1.isOpen()){ FXFile src2(srcfile2,FXIO::Reading); if(src2.isOpen()){ FXFile dst(dstfile,overwrite?FXIO::Writing:FXIO::Writing|FXIO::Exclusive); if(dst.isOpen()){ while(1){ nread=src1.readBlock(buffer,sizeof(buffer)); if(nread<0) return false; if(nread==0) break; nwritten=dst.writeBlock(buffer,nread); if(nwritten<0) return false; } while(1){ nread=src2.readBlock(buffer,sizeof(buffer)); if(nread<0) return false; if(nread==0) break; nwritten=dst.writeBlock(buffer,nread); if(nwritten<0) return false; } return true; } } } } return false; } // Recursively copy files or directories from srcfile to dstfile, overwriting dstfile if allowed bool FXFile::copyFiles(const FXString& srcfile,const FXString& dstfile,bool overwrite){ if(srcfile!=dstfile){ FXString name,linkname; FXStat srcstat; FXStat dststat; FXTRACE((100,"FXFile::copyFiles(%s,%s)\n",srcfile.text(),dstfile.text())); if(FXStat::statLink(srcfile,srcstat)){ // Destination is a directory? if(FXStat::statLink(dstfile,dststat)){ if(!dststat.isDirectory()){ if(!overwrite) return false; //FXTRACE((100,"FXFile::remove(%s)\n",dstfile.text())); if(!FXFile::remove(dstfile)) return false; } } // Source is a directory if(srcstat.isDirectory()){ // Make destination directory if needed if(!dststat.isDirectory()){ //FXTRACE((100,"FXDir::create(%s)\n",dstfile.text())); // Make directory if(!FXDir::create(dstfile,srcstat.mode()|FXIO::OwnerWrite)) return false; } // Open source directory FXDir dir(srcfile); // Copy source directory while(dir.next()){ // Next name name=dir.name(); // Skip '.' and '..' if(name[0]=='.' && (name[1]=='\0' || (name[1]=='.' && name[2]=='\0'))) continue; // Recurse if(!FXFile::copyFiles(srcfile+PATHSEP+name,dstfile+PATHSEP+name,overwrite)) return false; } // OK return true; } // Source is a file if(srcstat.isFile()){ //FXTRACE((100,"FXFile::copyFile(%s,%s)\n",srcfile.text(),dstfile.text())); // Simply copy if(!FXFile::copy(srcfile,dstfile,overwrite)) return false; // OK return true; } // Source is symbolic link: make a new one if(srcstat.isLink()){ linkname=FXFile::symlink(srcfile); //FXTRACE((100,"symlink(%s,%s)\n",srcfile.text(),dstfile.text())); // New symlink to whatever old one referred to if(!FXFile::symlink(srcfile,dstfile)) return false; // OK return true; } // Source is fifo: make a new one if(srcstat.isFifo()){ //FXTRACE((100,"FXPipe::create(%s)\n",dstfile.text())); // Make named pipe if(!FXPipe::create(dstfile,srcstat.mode())) return false; // OK return true; } /* // Source is device: make a new one if(S_ISBLK(status1.st_mode) || S_ISCHR(status1.st_mode) || S_ISSOCK(status1.st_mode)){ FXTRACE((100,"mknod(%s)\n",newfile.text())); return ::mknod(newfile.text(),status1.st_mode,status1.st_rdev)==0; } */ } } return false; } // Recursively copy or move files or directories from srcfile to dstfile, overwriting dstfile if allowed bool FXFile::moveFiles(const FXString& srcfile,const FXString& dstfile,bool overwrite){ if(srcfile!=dstfile){ if(FXStat::exists(srcfile)){ if(FXStat::exists(dstfile)){ if(!overwrite) return false; if(!FXFile::removeFiles(dstfile,true)) return false; } if(FXDir::rename(srcfile,dstfile)) return true; if(FXFile::copyFiles(srcfile,dstfile,overwrite)){ return FXFile::removeFiles(srcfile,true); } } } return false; } // Remove file or directory, recursively if allowed bool FXFile::removeFiles(const FXString& path,bool recursive){ FXStat stat; FXTRACE((100,"removeFiles(%s)\n",path.text())); if(FXStat::statLink(path,stat)){ if(stat.isDirectory()){ if(recursive){ FXDir dir(path); FXString name; while(dir.next()){ name=dir.name(); if(name[0]=='.' && (name[1]=='\0' || (name[1]=='.' && name[2]=='\0'))) continue; if(!FXFile::removeFiles(path+PATHSEP+name,true)) return false; } } return FXDir::remove(path); } return FXFile::remove(path); } return false; } // Destroy FXFile::~FXFile(){ close(); } } fox1.6-1.6.57/src/FXFileDialog.cpp000066400000000000000000000252161326741342000163730ustar00rootroot00000000000000/******************************************************************************** * * * F i l e S e l e c t i o n D i a l o g * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFileDialog.cpp,v 1.51 2006/01/23 06:03:16 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXPath.h" #include "FXStat.h" #include "FXFile.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXWindow.h" #include "FXRecentFiles.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXButton.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXShell.h" #include "FXTopWindow.h" #include "FXDialogBox.h" #include "FXFileSelector.h" #include "FXFileDialog.h" /* Notes: - Wraps the FXFileSelector file selection mega widget. */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXFileDialog,FXDialogBox,NULL,0) // Construct file fialog box FXFileDialog::FXFileDialog(FXWindow* owner,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(owner,name,opts|DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE|DECOR_CLOSE,x,y,w,h,0,0,0,0,4,4){ initdialog(); } // Construct free-floating file dialog box FXFileDialog::FXFileDialog(FXApp* a,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(a,name,opts|DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE|DECOR_CLOSE,x,y,w,h,0,0,0,0,4,4){ initdialog(); } // Initialize dialog and load settings void FXFileDialog::initdialog(){ filebox=new FXFileSelector(this,NULL,0,LAYOUT_FILL_X|LAYOUT_FILL_Y); filebox->acceptButton()->setTarget(this); filebox->acceptButton()->setSelector(FXDialogBox::ID_ACCEPT); filebox->cancelButton()->setTarget(this); filebox->cancelButton()->setSelector(FXDialogBox::ID_CANCEL); setWidth(getApp()->reg().readIntEntry("File Dialog","width",getWidth())); setHeight(getApp()->reg().readIntEntry("File Dialog","height",getHeight())); setFileBoxStyle(getApp()->reg().readUnsignedEntry("File Dialog","style",getFileBoxStyle())); showHiddenFiles(getApp()->reg().readUnsignedEntry("File Dialog","showhidden",showHiddenFiles())); } // Hide window and save settings void FXFileDialog::hide(){ FXDialogBox::hide(); getApp()->reg().writeIntEntry("File Dialog","width",getWidth()); getApp()->reg().writeIntEntry("File Dialog","height",getHeight()); getApp()->reg().writeUnsignedEntry("File Dialog","style",getFileBoxStyle()); getApp()->reg().writeUnsignedEntry("File Dialog","showhidden",showHiddenFiles()); } // Set file name void FXFileDialog::setFilename(const FXString& path){ filebox->setFilename(path); } // Get filename, if any FXString FXFileDialog::getFilename() const { return filebox->getFilename(); } // Return empty-string terminated list of selected file names, FXString* FXFileDialog::getFilenames() const { return filebox->getFilenames(); } // Set pattern void FXFileDialog::setPattern(const FXString& ptrn){ filebox->setPattern(ptrn); } // Get pattern FXString FXFileDialog::getPattern() const { return filebox->getPattern(); } // Change patterns, each pattern separated by newline void FXFileDialog::setPatternList(const FXString& patterns){ filebox->setPatternList(patterns); } // Return list of patterns FXString FXFileDialog::getPatternList() const { return filebox->getPatternList(); } // Set directory void FXFileDialog::setDirectory(const FXString& path){ filebox->setDirectory(path); } // Get directory FXString FXFileDialog::getDirectory() const { return filebox->getDirectory(); } // Set current file pattern from the list void FXFileDialog::setCurrentPattern(FXint n){ filebox->setCurrentPattern(n); } // Return current pattern FXint FXFileDialog::getCurrentPattern() const { return filebox->getCurrentPattern(); } FXString FXFileDialog::getPatternText(FXint patno) const { return filebox->getPatternText(patno); } void FXFileDialog::setPatternText(FXint patno,const FXString& text){ filebox->setPatternText(patno,text); } // Return number of patterns FXint FXFileDialog::getNumPatterns() const { return filebox->getNumPatterns(); } // Allow pattern entry void FXFileDialog::allowPatternEntry(FXbool allow){ filebox->allowPatternEntry(allow); } // Return TRUE if pattern entry is allowed FXbool FXFileDialog::allowPatternEntry() const { return filebox->allowPatternEntry(); } // Change space for item void FXFileDialog::setItemSpace(FXint s){ filebox->setItemSpace(s); } // Get space for item FXint FXFileDialog::getItemSpace() const { return filebox->getItemSpace(); } // Change File List style void FXFileDialog::setFileBoxStyle(FXuint style){ filebox->setFileBoxStyle(style); } // Return File List style FXuint FXFileDialog::getFileBoxStyle() const { return filebox->getFileBoxStyle(); } // Change file selection mode void FXFileDialog::setSelectMode(FXuint mode){ filebox->setSelectMode(mode); } // Return file selection mode FXuint FXFileDialog::getSelectMode() const { return filebox->getSelectMode(); } // Change wildcard matching mode void FXFileDialog::setMatchMode(FXuint mode){ filebox->setMatchMode(mode); } // Return wildcard matching mode FXuint FXFileDialog::getMatchMode() const { return filebox->getMatchMode(); } // Return TRUE if showing hidden files FXbool FXFileDialog::showHiddenFiles() const { return filebox->showHiddenFiles(); } // Show or hide hidden files void FXFileDialog::showHiddenFiles(FXbool showing){ filebox->showHiddenFiles(showing); } // Return TRUE if image preview on FXbool FXFileDialog::showImages() const { return filebox->showImages(); } // Show or hide preview images void FXFileDialog::showImages(FXbool showing){ filebox->showImages(showing); } // Return images preview size FXint FXFileDialog::getImageSize() const { return filebox->getImageSize(); } // Change images preview size void FXFileDialog::setImageSize(FXint size){ filebox->setImageSize(size); } // Show readonly button void FXFileDialog::showReadOnly(FXbool show){ filebox->showReadOnly(show); } // Return TRUE if readonly is shown FXbool FXFileDialog::shownReadOnly() const { return filebox->shownReadOnly(); } // Set initial state of readonly button void FXFileDialog::setReadOnly(FXbool state){ filebox->setReadOnly(state); } // Get readonly state FXbool FXFileDialog::getReadOnly() const { return filebox->getReadOnly(); } // Allow or disallow navigation void FXFileDialog::allowNavigation(FXbool navigable){ filebox->allowNavigation(navigable); } // Is navigation allowed? FXbool FXFileDialog::allowNavigation() const{ return filebox->allowNavigation(); } // Save data void FXFileDialog::save(FXStream& store) const { FXDialogBox::save(store); store << filebox; } // Load data void FXFileDialog::load(FXStream& store){ FXDialogBox::load(store); store >> filebox; } // Cleanup FXFileDialog::~FXFileDialog(){ filebox=(FXFileSelector*)-1L; } // Open existing filename FXString FXFileDialog::getOpenFilename(FXWindow* owner,const FXString& caption,const FXString& path,const FXString& patterns,FXint initial){ FXFileDialog opendialog(owner,caption); FXString filename; opendialog.setSelectMode(SELECTFILE_EXISTING); opendialog.setFilename(path); opendialog.setPatternList(patterns); opendialog.setCurrentPattern(initial); if(opendialog.execute()){ filename=opendialog.getFilename(); if(FXStat::isFile(filename)) return filename; } return FXString::null; } // Save to filename FXString FXFileDialog::getSaveFilename(FXWindow* owner,const FXString& caption,const FXString& path,const FXString& patterns,FXint initial){ FXFileDialog savedialog(owner,caption); savedialog.setSelectMode(SELECTFILE_ANY); savedialog.setFilename(path); savedialog.setPatternList(patterns); savedialog.setCurrentPattern(initial); if(savedialog.execute()){ return savedialog.getFilename(); } return FXString::null; } // Open multiple existing files FXString* FXFileDialog::getOpenFilenames(FXWindow* owner,const FXString& caption,const FXString& path,const FXString& patterns,FXint initial){ FXFileDialog opendialog(owner,caption); opendialog.setSelectMode(SELECTFILE_MULTIPLE); opendialog.setFilename(path); opendialog.setPatternList(patterns); opendialog.setCurrentPattern(initial); if(opendialog.execute()){ return opendialog.getFilenames(); } return NULL; } // Open existing directory name FXString FXFileDialog::getOpenDirectory(FXWindow* owner,const FXString& caption,const FXString& path){ FXFileDialog dirdialog(owner,caption); FXString dirname; dirdialog.setSelectMode(SELECTFILE_DIRECTORY); dirdialog.setFilename(path); if(dirdialog.execute()){ dirname=dirdialog.getFilename(); if(FXStat::isDirectory(dirname)) return dirname; } return FXString::null; } } fox1.6-1.6.57/src/FXFileDict.cpp000066400000000000000000000311341326741342000160530ustar00rootroot00000000000000/******************************************************************************** * * * F i l e - A s s o c i a t i o n T a b l e * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFileDict.cpp,v 1.67.2.2 2008/03/28 12:26:53 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXFile.h" #include "FXFileStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXIcon.h" #include "FXIconDict.h" #include "FXFileDict.h" /* Notes: - FXFileDict needs additional fields, e.g. a print command. - The associate member function should be virtual so we can overload it. - FXFileDict is solely responsible for determining mime-type, and duplicate code in FXDirList and FXFileList is eliminated. - We will use two different techniques: - For directories, we will match "/usr/people/jeroen", then try "/people/jeroen", and finally, try "/jeroen" to determine directory bindings (Note we pass a "/" in front so we won't match a file binding when looking for directories. This means we can in many cases keep the same icon bindings even if some directory tree of a project is moved around in the file system. - For files, we will try to match the whole name, then try the extensions. - We will try to match "defaultdirbinding" to determine directory type, and "defaultfilebinding" for a file, and "defaultexecbinding", for an executable to allow bindings to be set for broad categories. - We should look into using the mime-database and content-based file type detection [I'm not a big fan of this, but it may sometimes be necessary]. - Refer to RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type registry is at: ftp://ftp.iana.org/in-notes/iana/assignments/media-types/ - We should at least organize things so that enough info is passed in so we can read a fragment of the content and do it (so that means the full pathname, and perhaps some flags). - The registry format has been extended; it now is: command string ';' extension string ';' bigicon [ ':' bigiconopen ] ';' miniicon [ ':' miniiconopen ] ';' mimetype [ ';' flags ... ] - An empty binding like: ext="" Can be used to override a global binding with an empty one, i.e. it is as if no binding exists; you will get the default or fallback in this case. - Obtaining icons for files, folders, executable, etc. under Windows: 1) Get icon sizes: w = GetSystemMetrics(SM_CXSMICON); h = GetSystemMetrics(SM_CYSMICON); 2) Default icons for folder: // Get key RegOpenKeyEx(HKEY_CLASSES_ROOT,"folder\\DefaultIcon",0,KEY_READ,&key); // To get data RegQueryValueEx(key,subKey,0,0,(LPBYTE)buf,&bufsz); // Obtain HICON extract it result=ExtractIconEx(filename,iconindex,arrayofbigicons,arrayofsmallicons,nicons); 3) Default icon(s) for file: // Extract from shell32.dll ExtractIconEx("shell32.dll",0,NULL,&smallicon,1); 4) Default exe icon(s): // Extract from shell32.dll ExtractIconExA("shell32.dll",2,NULL,&smallicon,1); 5) Other executables: // Extract from executable: ExtractIconEx("absolutepathofexe",indexoflast,NULL,&smallicon,1); 6) Documents: // Key on ".bmp" (extension with . in front) RegOpenKeyEx(HKEY_CLASSES_ROOT,".bmp",0,KEY_READ,&key); // Obtain value using: RegQueryValueEx(key,subKey,0,0,(LPBYTE)buf,&bufsz); // Key on file type and look for default icon: RegOpenKeyEx(HKEY_CLASSES_ROOT,"PaintPicture\\DefaultIcon",0,KEY_READ,&keyoficon); // Obtain value using: RegQueryValueEx(key,subKey,0,0,(LPBYTE)buf,&bufsz); // String contains program pathname, and icon index. Use: ExtractIconEx("absolutepathofprogram",index,NULL,&smallicon,1); */ #define COMMANDLEN 256 #define EXTENSIONLEN 128 #define MIMETYPELEN 64 #define ICONNAMELEN 256 using namespace FX; /*******************************************************************************/ namespace FX { // These registry keys are used for default bindings. const FXchar FXFileDict::defaultExecBinding[]="defaultexecbinding"; const FXchar FXFileDict::defaultDirBinding[]="defaultdirbinding"; const FXchar FXFileDict::defaultFileBinding[]="defaultfilebinding"; // Object implementation FXIMPLEMENT(FXFileDict,FXDict,NULL,0) // Construct an file-extension association table FXFileDict::FXFileDict(FXApp* app):settings(&app->reg()){ FXTRACE((100,"FXFileDict::FXFileDict\n")); icons=new FXIconDict(app,settings->readStringEntry("SETTINGS","iconpath",FXIconDict::defaultIconPath)); } // Construct an file-extension association table, and alternative settings database FXFileDict::FXFileDict(FXApp* app,FXSettings* db):settings(db){ FXTRACE((100,"FXFileDict::FXFileDict\n")); icons=new FXIconDict(app,settings->readStringEntry("SETTINGS","iconpath",FXIconDict::defaultIconPath)); } // Create new association from extension void *FXFileDict::createData(const void* ptr){ register const FXchar *p=(const FXchar*)ptr; register FXchar *q; FXchar command[COMMANDLEN]; FXchar extension[EXTENSIONLEN]; FXchar mimetype[MIMETYPELEN]; FXchar bigname[ICONNAMELEN]; FXchar bignameopen[ICONNAMELEN]; FXchar mininame[ICONNAMELEN]; FXchar mininameopen[ICONNAMELEN]; const FXchar *extra; FXuint flags=0; FXFileAssoc *fileassoc; FXTRACE((300,"FXFileDict: adding association: %s\n",(FXchar*)ptr)); // Make association record fileassoc=new FXFileAssoc; // Parse command for(q=command; *p && *p!=';' && qcommand=command; fileassoc->extension=extension; fileassoc->bigicon=NULL; fileassoc->miniicon=NULL; fileassoc->bigiconopen=NULL; fileassoc->miniiconopen=NULL; fileassoc->mimetype=mimetype; fileassoc->dragtype=0; fileassoc->flags=flags; // Insert icons into icon dictionary if(bigname[0]){ fileassoc->bigicon=fileassoc->bigiconopen=getIconDict()->insert(bigname); } if(mininame[0]){ fileassoc->miniicon=fileassoc->miniiconopen=getIconDict()->insert(mininame); } // Add open icons also; we will fall back on the regular icons in needed if(bignameopen[0]){ fileassoc->bigiconopen=getIconDict()->insert(bignameopen); } if(mininameopen[0]){ fileassoc->miniiconopen=getIconDict()->insert(mininameopen); } // Return the binding return fileassoc; } // Delete association void FXFileDict::deleteData(void* ptr){ delete ((FXFileAssoc*)ptr); } // Set icon search path void FXFileDict::setIconPath(const FXString& path){ // Replace iconpath setting in registry getSettings()->writeStringEntry("SETTINGS","iconpath",path.text()); // Change it in icon dictionary getIconDict()->setIconPath(path); } // Return current icon search path const FXString& FXFileDict::getIconPath() const { return getIconDict()->getIconPath(); } // Replace or add file association FXFileAssoc* FXFileDict::replace(const FXchar* ext,const FXchar* str){ if(ext && ext[0]){ getSettings()->writeStringEntry("FILETYPES",ext,str); return (FXFileAssoc*)FXDict::replace(ext,str); } return NULL; } // Remove file association FXFileAssoc* FXFileDict::remove(const FXchar* ext){ if(ext && ext[0]){ getSettings()->deleteEntry("FILETYPES",ext); return (FXFileAssoc*)FXDict::remove(ext); } return NULL; } // Find file association FXFileAssoc* FXFileDict::find(const FXchar* ext){ register FXFileAssoc* record=NULL; register const FXchar* binding; FXTRACE((300,"FXFileDict: trying key: %s\n",ext)); if(ext && ext[0]){ record=(FXFileAssoc*)FXDict::find(ext); if(!record){ binding=getSettings()->readStringEntry("FILETYPES",ext,NULL); if(binding){ record=(FXFileAssoc*)FXDict::insert(ext,binding); } } } return record; } // Find file association from registry FXFileAssoc* FXFileDict::findFileBinding(const FXchar* pathname){ register const FXchar *filename=pathname; register const FXchar *p=pathname; register FXFileAssoc* record; FXTRACE((300,"FXFileDict: searching file binding for: %s\n",pathname)); while(*p){ if(ISPATHSEP(*p)){ filename=p+1; } p++; } record=find(filename); if(record) return record; filename=strchr(filename,'.'); while(filename){ record=find(filename+1); if(record) return record; filename=strchr(filename+1,'.'); } return find(defaultFileBinding); } // Find directory association from registry FXFileAssoc* FXFileDict::findDirBinding(const FXchar* pathname){ register const FXchar* path=pathname; register FXFileAssoc* record; FXTRACE((300,"FXFileDict: searching dir binding for: %s\n",pathname)); while(*path){ record=find(path); if(record) return record; path++; while(*path && !ISPATHSEP(*path)) path++; } return find(defaultDirBinding); } // Find executable association from registry FXFileAssoc* FXFileDict::findExecBinding(const FXchar*){ FXTRACE((300,"FXFileDict: searching exec binding\n")); return find(defaultExecBinding); } // Save data void FXFileDict::save(FXStream& store) const { FXDict::save(store); store << settings; store << icons; } // Load data void FXFileDict::load(FXStream& store){ FXDict::load(store); store >> settings; store >> icons; } // Destructor FXFileDict::~FXFileDict(){ FXTRACE((100,"FXFileDict::~FXFileDict\n")); delete icons; settings=(FXSettings*)-1L; icons=(FXIconDict*)-1L; clear(); } } fox1.6-1.6.57/src/FXFileList.cpp000066400000000000000000001316721326741342000161130ustar00rootroot00000000000000/******************************************************************************** * * * F i l e L i s t O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFileList.cpp,v 1.211.2.2 2006/11/22 15:40:27 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "fxascii.h" #include "fxunicode.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXObjectList.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSystem.h" #include "FXPath.h" #include "FXStat.h" #include "FXFile.h" #include "FXURL.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXFont.h" #include "FXIcon.h" #include "FXGIFIcon.h" #include "FXScrollBar.h" #include "FXIconSource.h" #include "FXIconDict.h" #include "FXShell.h" #include "FXPopup.h" #include "FXMenuPane.h" #include "FXMenuCaption.h" #include "FXMenuCommand.h" #include "FXMenuCascade.h" #include "FXMenuRadio.h" #include "FXMenuCheck.h" #include "FXMenuSeparator.h" #include "FXFileDict.h" #include "FXHeader.h" #include "FXIconList.h" #include "FXFileList.h" #include "FXDir.h" #include "icons.h" /* Notes: - Share icons with other widgets; upgrade icons to some nicer ones. - Should some of these icons move to FXFileDict? - Clipboard of filenames. - Clipboard, DND, etc. support. - When being dragged over, if hovering over a directory item for some time we need to open it. - We should generate SEL_INSERTED, SEL_DELETED, SEL_REPLACED, SEL_CHANGED messages as the FXFileList updates itself from the file system. - The solution currently used to determine whether or not to blend the icon isn't so great; this class shouldn't have to know about FXPNGIcon. - Should blending also happen in FXIconDict? Or more general solution. - If you land in a large directory with images, things are a tad slow; need to speed this up some how. - Since '\0' is no longer special in FXString, perhaps we can replace the function of '\t' with '\0'. This would be significantly more efficient. */ #define REFRESHINTERVAL 1000 // Interval between refreshes #define REFRESHFREQUENCY 30 // File systems not supporting mod-time, refresh every nth time #define HASH1(x,n) (((unsigned int)(x)*13)%(n)) // Probe Position [0..n-1] #define HASH2(x,n) (1|(((unsigned int)(x)*17)%((n)-1))) // Probe Distance [1..n-2] #ifndef TIMEFORMAT #define TIMEFORMAT "%m/%d/%Y %H:%M:%S" #endif using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXFileItem,FXIconItem,NULL,0) // Map FXDEFMAP(FXFileList) FXFileListMap[]={ FXMAPFUNC(SEL_DRAGGED,0,FXFileList::onDragged), FXMAPFUNC(SEL_DND_ENTER,0,FXFileList::onDNDEnter), FXMAPFUNC(SEL_DND_LEAVE,0,FXFileList::onDNDLeave), FXMAPFUNC(SEL_DND_DROP,0,FXFileList::onDNDDrop), FXMAPFUNC(SEL_DND_MOTION,0,FXFileList::onDNDMotion), FXMAPFUNC(SEL_DND_REQUEST,0,FXFileList::onDNDRequest), FXMAPFUNC(SEL_BEGINDRAG,0,FXFileList::onBeginDrag), FXMAPFUNC(SEL_ENDDRAG,0,FXFileList::onEndDrag), FXMAPFUNC(SEL_TIMEOUT,FXFileList::ID_OPENTIMER,FXFileList::onOpenTimer), FXMAPFUNC(SEL_TIMEOUT,FXFileList::ID_REFRESHTIMER,FXFileList::onRefreshTimer), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_DIRECTORY_UP,FXFileList::onUpdDirectoryUp), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_SORT_BY_NAME,FXFileList::onUpdSortByName), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_SORT_BY_TYPE,FXFileList::onUpdSortByType), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_SORT_BY_SIZE,FXFileList::onUpdSortBySize), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_SORT_BY_TIME,FXFileList::onUpdSortByTime), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_SORT_BY_USER,FXFileList::onUpdSortByUser), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_SORT_BY_GROUP,FXFileList::onUpdSortByGroup), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_SORT_REVERSE,FXFileList::onUpdSortReverse), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_SORT_CASE,FXFileList::onUpdSortCase), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_SET_PATTERN,FXFileList::onUpdSetPattern), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_SET_DIRECTORY,FXFileList::onUpdSetDirectory), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_SHOW_HIDDEN,FXFileList::onUpdShowHidden), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_HIDE_HIDDEN,FXFileList::onUpdHideHidden), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_TOGGLE_HIDDEN,FXFileList::onUpdToggleHidden), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_TOGGLE_IMAGES,FXFileList::onUpdToggleImages), FXMAPFUNC(SEL_UPDATE,FXFileList::ID_HEADER_CHANGE,FXFileList::onUpdHeader), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_DIRECTORY_UP,FXFileList::onCmdDirectoryUp), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SORT_BY_NAME,FXFileList::onCmdSortByName), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SORT_BY_TYPE,FXFileList::onCmdSortByType), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SORT_BY_SIZE,FXFileList::onCmdSortBySize), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SORT_BY_TIME,FXFileList::onCmdSortByTime), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SORT_BY_USER,FXFileList::onCmdSortByUser), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SORT_BY_GROUP,FXFileList::onCmdSortByGroup), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SORT_REVERSE,FXFileList::onCmdSortReverse), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SORT_CASE,FXFileList::onCmdSortCase), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SET_PATTERN,FXFileList::onCmdSetPattern), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SET_DIRECTORY,FXFileList::onCmdSetDirectory), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SETVALUE,FXFileList::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SETSTRINGVALUE,FXFileList::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_GETSTRINGVALUE,FXFileList::onCmdGetStringValue), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_SHOW_HIDDEN,FXFileList::onCmdShowHidden), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_HIDE_HIDDEN,FXFileList::onCmdHideHidden), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_TOGGLE_HIDDEN,FXFileList::onCmdToggleHidden), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_TOGGLE_IMAGES,FXFileList::onCmdToggleImages), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_HEADER_CHANGE,FXFileList::onCmdHeader), FXMAPFUNC(SEL_COMMAND,FXFileList::ID_REFRESH,FXFileList::onCmdRefresh), }; // Object implementation FXIMPLEMENT(FXFileList,FXIconList,FXFileListMap,ARRAYNUMBER(FXFileListMap)) // For serialization FXFileList::FXFileList(){ dropEnable(); #ifdef WIN32 matchmode=FILEMATCH_FILE_NAME|FILEMATCH_NOESCAPE|FILEMATCH_CASEFOLD; sortfunc=ascendingCase; #else matchmode=FILEMATCH_FILE_NAME|FILEMATCH_NOESCAPE; sortfunc=ascending; #endif associations=NULL; list=NULL; dropaction=DRAG_MOVE; timestamp=0; imagesize=32; counter=0; }; // File List FXFileList::FXFileList(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXIconList(p,tgt,sel,opts,x,y,w,h),directory(PATHSEPSTRING),orgdirectory(PATHSEPSTRING),pattern("*"){ dropEnable(); associations=NULL; appendHeader(tr("Name"),NULL,200); appendHeader(tr("Type"),NULL,100); appendHeader(tr("Size"),NULL,60); appendHeader(tr("Modified Date"),NULL,150); appendHeader(tr("User"),NULL,50); appendHeader(tr("Group"),NULL,50); appendHeader(tr("Attributes"),NULL,100); #ifndef WIN32 appendHeader(tr("Link"),NULL,200); #endif big_folder=new FXGIFIcon(getApp(),bigfolder); mini_folder=new FXGIFIcon(getApp(),minifolder); big_doc=new FXGIFIcon(getApp(),bigdoc); mini_doc=new FXGIFIcon(getApp(),minidoc); big_app=new FXGIFIcon(getApp(),bigapp); mini_app=new FXGIFIcon(getApp(),miniapp); #ifdef WIN32 matchmode=FILEMATCH_FILE_NAME|FILEMATCH_NOESCAPE|FILEMATCH_CASEFOLD; sortfunc=ascendingCase; #else matchmode=FILEMATCH_FILE_NAME|FILEMATCH_NOESCAPE; sortfunc=ascending; #endif if(!(options&FILELIST_NO_OWN_ASSOC)) associations=new FXFileDict(getApp()); list=NULL; dropaction=DRAG_MOVE; timestamp=0; imagesize=32; counter=0; } // Starts the timer void FXFileList::create(){ if(!id()) getApp()->addTimeout(this,ID_REFRESHTIMER,REFRESHINTERVAL); FXIconList::create(); if(!deleteType){deleteType=getApp()->registerDragType(deleteTypeName);} if(!urilistType){urilistType=getApp()->registerDragType(urilistTypeName);} big_folder->create(); mini_folder->create(); big_doc->create(); mini_doc->create(); big_app->create(); mini_app->create(); scan(FALSE); } // Detach disconnects the icons void FXFileList::detach(){ if(id()) getApp()->removeTimeout(this,ID_REFRESHTIMER); if(id()) getApp()->removeTimeout(this,ID_OPENTIMER); FXIconList::detach(); big_folder->detach(); mini_folder->detach(); big_doc->detach(); mini_doc->detach(); big_app->detach(); mini_app->detach(); deleteType=0; urilistType=0; } // Destroy zaps the icons void FXFileList::destroy(){ if(id()) getApp()->removeTimeout(this,ID_REFRESHTIMER); if(id()) getApp()->removeTimeout(this,ID_OPENTIMER); FXIconList::destroy(); big_folder->destroy(); mini_folder->destroy(); big_doc->destroy(); mini_doc->destroy(); big_app->destroy(); mini_app->destroy(); } /*******************************************************************************/ // Open up folder when howvering long over a folder long FXFileList::onOpenTimer(FXObject*,FXSelector,void*){ FXint xx,yy,index; FXuint buttons; getCursorPosition(xx,yy,buttons); index=getItemAt(xx,yy); if(0<=index && isItemDirectory(index)){ dropdirectory=getItemPathname(index); setDirectory(dropdirectory); getApp()->addTimeout(this,ID_OPENTIMER,700); } return 1; } // Handle drag-and-drop enter, remember current directory long FXFileList::onDNDEnter(FXObject* sender,FXSelector sel,void* ptr){ FXIconList::onDNDEnter(sender,sel,ptr); orgdirectory=getDirectory(); return 1; } // Handle drag-and-drop leave, restore current directory prior to drag long FXFileList::onDNDLeave(FXObject* sender,FXSelector sel,void* ptr){ FXIconList::onDNDLeave(sender,sel,ptr); getApp()->removeTimeout(this,ID_OPENTIMER); stopAutoScroll(); setDirectory(orgdirectory); return 1; } // Handle drag-and-drop motion long FXFileList::onDNDMotion(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXint index=-1; // Cancel open up timer getApp()->removeTimeout(this,ID_OPENTIMER); // Start autoscrolling if(startAutoScroll(event,FALSE)) return 1; // Give base class a shot if(FXIconList::onDNDMotion(sender,sel,ptr)) return 1; // Dropping list of filenames if(offeredDNDType(FROM_DRAGNDROP,urilistType)){ // Drop in the background dropdirectory=getDirectory(); // What is being done (move,copy,link) dropaction=inquireDNDAction(); // We will open up a folder if we can hover over it for a while index=getItemAt(event->win_x,event->win_y); if(0<=index && isItemDirectory(index)){ // Set open up timer getApp()->addTimeout(this,ID_OPENTIMER,700); // Directory where to drop, or directory to open up dropdirectory=getItemPathname(index); } // See if dropdirectory is writable if(FXStat::isWritable(dropdirectory)){ FXTRACE((100,"accepting drop on %s\n",dropdirectory.text())); acceptDrop(DRAG_ACCEPT); } return 1; } return 0; } // Handle drag-and-drop drop long FXFileList::onDNDDrop(FXObject* sender,FXSelector sel,void* ptr){ FXString dropfiles,filesrc,filedst,url; FXint beg,end; // Cancel open up timer getApp()->removeTimeout(this,ID_OPENTIMER); // Stop scrolling stopAutoScroll(); // Restore original directory setDirectory(orgdirectory); // Perhaps target wants to deal with it if(FXIconList::onDNDDrop(sender,sel,ptr)) return 1; // Get uri-list of files being dropped if(getDNDData(FROM_DRAGNDROP,urilistType,dropfiles)){ // Tell drag source we got it dropFinished(DRAG_ACCEPT); // Loop over urls for(beg=0; begbeep(); } else if(dropaction==DRAG_COPY){ FXTRACE((100,"Copying file: %s to %s\n",filesrc.text(),filedst.text())); if(!FXFile::copyFiles(filesrc,filedst)) getApp()->beep(); } else if(dropaction==DRAG_LINK){ FXTRACE((100,"Linking file: %s to %s\n",filesrc.text(),filedst.text())); if(!FXFile::symlink(filesrc,filedst)) getApp()->beep(); } } return 1; } return 0; } // Somebody wants our dragged data long FXFileList::onDNDRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; // Perhaps the target wants to supply its own data if(FXIconList::onDNDRequest(sender,sel,ptr)) return 1; // Return list of filenames as a uri-list if(event->target==urilistType){ setDNDData(FROM_DRAGNDROP,event->target,dragfiles); return 1; } // Delete selected files if(event->target==deleteType){ FXTRACE((100,"Delete files not yet implemented\n")); return 1; } return 0; } // Start a drag operation long FXFileList::onBeginDrag(FXObject* sender,FXSelector sel,void* ptr){ register FXint i; if(FXIconList::onBeginDrag(sender,sel,ptr)) return 1; if(beginDrag(&urilistType,1)){ dragfiles=FXString::null; for(i=0; istate&CONTROLMASK) action=DRAG_COPY; if(event->state&SHIFTMASK) action=DRAG_MOVE; if(event->state&ALTMASK) action=DRAG_LINK; handleDrag(event->root_x,event->root_y,action); if(didAccept()!=DRAG_REJECT){ if(action==DRAG_MOVE) setDragCursor(getApp()->getDefaultCursor(DEF_DNDMOVE_CURSOR)); else if(action==DRAG_LINK) setDragCursor(getApp()->getDefaultCursor(DEF_DNDLINK_CURSOR)); else setDragCursor(getApp()->getDefaultCursor(DEF_DNDCOPY_CURSOR)); } else{ setDragCursor(getApp()->getDefaultCursor(DEF_DNDSTOP_CURSOR)); } return 1; } /*******************************************************************************/ // Set value from a message long FXFileList::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCurrentFile((const FXchar*)ptr); return 1; } // Set current directory from dir part of filename long FXFileList::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setCurrentFile(*((FXString*)ptr)); return 1; } // Get current file name (NULL if no current file) long FXFileList::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getCurrentFile(); return 1; } // Toggle hidden files display long FXFileList::onCmdToggleHidden(FXObject*,FXSelector,void*){ showHiddenFiles(!showHiddenFiles()); return 1; } // Update toggle hidden files widget long FXFileList::onUpdToggleHidden(FXObject* sender,FXSelector,void*){ sender->handle(this,showHiddenFiles()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Show hidden files long FXFileList::onCmdShowHidden(FXObject*,FXSelector,void*){ showHiddenFiles(TRUE); return 1; } // Update show hidden files widget long FXFileList::onUpdShowHidden(FXObject* sender,FXSelector,void*){ sender->handle(this,showHiddenFiles()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Hide hidden files long FXFileList::onCmdHideHidden(FXObject*,FXSelector,void*){ showHiddenFiles(FALSE); return 1; } // Update hide hidden files widget long FXFileList::onUpdHideHidden(FXObject* sender,FXSelector,void*){ sender->handle(this,showHiddenFiles()?FXSEL(SEL_COMMAND,ID_UNCHECK):FXSEL(SEL_COMMAND,ID_CHECK),NULL); return 1; } // Toggle image preview long FXFileList::onCmdToggleImages(FXObject*,FXSelector,void*){ showImages(!showImages()); return 1; } // Update image preview long FXFileList::onUpdToggleImages(FXObject* sender,FXSelector,void*){ sender->handle(this,showImages()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Move up one level long FXFileList::onCmdDirectoryUp(FXObject*,FXSelector,void*){ setDirectory(FXPath::upLevel(directory)); return 1; } // Determine if we can still go up more long FXFileList::onUpdDirectoryUp(FXObject* sender,FXSelector,void*){ sender->handle(this,FXPath::isTopDirectory(directory)?FXSEL(SEL_COMMAND,ID_DISABLE):FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // Change pattern long FXFileList::onCmdSetPattern(FXObject*,FXSelector,void* ptr){ setPattern((const char*)ptr); return 1; } // Update pattern long FXFileList::onUpdSetPattern(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETVALUE),(void*)pattern.text()); return 1; } // Change directory long FXFileList::onCmdSetDirectory(FXObject*,FXSelector,void* ptr){ setDirectory((const char*)ptr); return 1; } // Update directory long FXFileList::onUpdSetDirectory(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETVALUE),(void*)directory.text()); return 1; } // Sort by name long FXFileList::onCmdSortByName(FXObject*,FXSelector,void*){ if(sortfunc==ascending) sortfunc=descending; else if(sortfunc==ascendingCase) sortfunc=descendingCase; else if(sortfunc==descending) sortfunc=ascending; else sortfunc=ascendingCase; scan(TRUE); return 1; } // Update sender long FXFileList::onUpdSortByName(FXObject* sender,FXSelector,void*){ sender->handle(this,(sortfunc==ascending || sortfunc==descending || sortfunc==ascendingCase || sortfunc==descendingCase) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Sort by type long FXFileList::onCmdSortByType(FXObject*,FXSelector,void*){ sortfunc=(sortfunc==ascendingType) ? descendingType : ascendingType; scan(TRUE); return 1; } // Update sender long FXFileList::onUpdSortByType(FXObject* sender,FXSelector,void*){ sender->handle(this,(sortfunc==ascendingType || sortfunc==descendingType) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Sort by size long FXFileList::onCmdSortBySize(FXObject*,FXSelector,void*){ sortfunc=(sortfunc==ascendingSize) ? descendingSize : ascendingSize; scan(TRUE); return 1; } // Update sender long FXFileList::onUpdSortBySize(FXObject* sender,FXSelector,void*){ sender->handle(this,(sortfunc==ascendingSize || sortfunc==descendingSize) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Sort by time long FXFileList::onCmdSortByTime(FXObject*,FXSelector,void*){ sortfunc=(sortfunc==ascendingTime) ? descendingTime : ascendingTime; scan(TRUE); return 1; } // Update sender long FXFileList::onUpdSortByTime(FXObject* sender,FXSelector,void*){ sender->handle(this,(sortfunc==ascendingTime || sortfunc==descendingTime) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Sort by user long FXFileList::onCmdSortByUser(FXObject*,FXSelector,void*){ sortfunc=(sortfunc==ascendingUser) ? descendingUser : ascendingUser; scan(TRUE); return 1; } // Update sender long FXFileList::onUpdSortByUser(FXObject* sender,FXSelector,void*){ sender->handle(this,(sortfunc==ascendingUser || sortfunc==descendingUser) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Sort by group long FXFileList::onCmdSortByGroup(FXObject*,FXSelector,void*){ sortfunc=(sortfunc==ascendingGroup) ? descendingGroup : ascendingGroup; scan(TRUE); return 1; } // Update sender long FXFileList::onUpdSortByGroup(FXObject* sender,FXSelector,void*){ sender->handle(this,(sortfunc==ascendingGroup || sortfunc==descendingGroup) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Reverse sort order long FXFileList::onCmdSortReverse(FXObject*,FXSelector,void*){ if(sortfunc==ascending) sortfunc=descending; else if(sortfunc==descending) sortfunc=ascending; else if(sortfunc==ascendingCase) sortfunc=descendingCase; else if(sortfunc==descendingCase) sortfunc=ascendingCase; else if(sortfunc==ascendingType) sortfunc=descendingType; else if(sortfunc==descendingType) sortfunc=ascendingType; else if(sortfunc==ascendingSize) sortfunc=descendingSize; else if(sortfunc==descendingSize) sortfunc=ascendingSize; else if(sortfunc==ascendingTime) sortfunc=descendingTime; else if(sortfunc==descendingTime) sortfunc=ascendingTime; else if(sortfunc==ascendingUser) sortfunc=descendingUser; else if(sortfunc==descendingUser) sortfunc=ascendingUser; else if(sortfunc==ascendingGroup) sortfunc=descendingGroup; else if(sortfunc==descendingGroup) sortfunc=ascendingGroup; scan(TRUE); return 1; } // Update sender long FXFileList::onUpdSortReverse(FXObject* sender,FXSelector,void*){ FXSelector selector=FXSEL(SEL_COMMAND,ID_UNCHECK); if(sortfunc==descending) selector=FXSEL(SEL_COMMAND,ID_CHECK); else if(sortfunc==descendingCase) selector=FXSEL(SEL_COMMAND,ID_CHECK); else if(sortfunc==descendingType) selector=FXSEL(SEL_COMMAND,ID_CHECK); else if(sortfunc==descendingSize) selector=FXSEL(SEL_COMMAND,ID_CHECK); else if(sortfunc==descendingTime) selector=FXSEL(SEL_COMMAND,ID_CHECK); else if(sortfunc==descendingUser) selector=FXSEL(SEL_COMMAND,ID_CHECK); else if(sortfunc==descendingGroup) selector=FXSEL(SEL_COMMAND,ID_CHECK); sender->handle(this,selector,NULL); return 1; } // Toggle case sensitivity long FXFileList::onCmdSortCase(FXObject*,FXSelector,void*){ if(sortfunc==ascending) sortfunc=ascendingCase; else if(sortfunc==ascendingCase) sortfunc=ascending; else if(sortfunc==descending) sortfunc=descendingCase; else if(sortfunc==descendingCase) sortfunc=descending; scan(TRUE); return 1; } // Check if case sensitive long FXFileList::onUpdSortCase(FXObject* sender,FXSelector,void*){ sender->handle(this,(sortfunc==ascendingCase || sortfunc==descendingCase) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); sender->handle(this,(sortfunc==ascendingCase || sortfunc==ascending || sortfunc==descendingCase || sortfunc==descending) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Clicked header button long FXFileList::onCmdHeader(FXObject*,FXSelector,void* ptr){ if(((FXuint)(FXuval)ptr)<6) handle(this,FXSEL(SEL_COMMAND,(ID_SORT_BY_NAME+(FXuint)(FXuval)ptr)),NULL); return 1; } // Clicked header button long FXFileList::onUpdHeader(FXObject*,FXSelector,void*){ header->setArrowDir(0,(sortfunc==ascending || sortfunc==ascendingCase) ? FALSE : (sortfunc==descending || sortfunc==descendingCase) ? TRUE : MAYBE); // Name header->setArrowDir(1,(sortfunc==ascendingType) ? FALSE : (sortfunc==descendingType) ? TRUE : MAYBE); // Type header->setArrowDir(2,(sortfunc==ascendingSize) ? FALSE : (sortfunc==descendingSize) ? TRUE : MAYBE); // Size header->setArrowDir(3,(sortfunc==ascendingTime) ? FALSE : (sortfunc==descendingTime) ? TRUE : MAYBE); // Date header->setArrowDir(4,(sortfunc==ascendingUser) ? FALSE : (sortfunc==descendingUser) ? TRUE : MAYBE); // User header->setArrowDir(5,(sortfunc==ascendingGroup) ? FALSE : (sortfunc==descendingGroup)? TRUE : MAYBE); // Group return 1; } // Compare file names FXint FXFileList::ascending(const FXIconItem* a,const FXIconItem* b){ register FXint diff=static_cast(b)->isDirectory() - static_cast(a)->isDirectory(); if(diff==0){ return compareSection(a->label.text(),b->label.text(),0); } return diff; } // Compare file names, case insensitive FXint FXFileList::ascendingCase(const FXIconItem* a,const FXIconItem* b){ register FXint diff=static_cast(b)->isDirectory() - static_cast(a)->isDirectory(); if(diff==0){ return compareSectionCase(a->label.text(),b->label.text(),0); } return diff; } // Compare file types FXint FXFileList::ascendingType(const FXIconItem* a,const FXIconItem* b){ register FXint diff=static_cast(b)->isDirectory() - static_cast(a)->isDirectory(); if(diff==0){ diff=compareSection(a->label.text(),b->label.text(),1); if(diff==0){ return compareSectionCase(a->label.text(),b->label.text(),0); } } return diff; } // Compare file size FXint FXFileList::ascendingSize(const FXIconItem* a,const FXIconItem* b){ register FXint diff=static_cast(b)->isDirectory() - static_cast(a)->isDirectory(); if(diff==0){ if(static_cast(a)->size > static_cast(b)->size) return 1; if(static_cast(a)->size < static_cast(b)->size) return -1; return compareSectionCase(a->label.text(),b->label.text(),0); } return diff; } // Compare file time FXint FXFileList::ascendingTime(const FXIconItem* a,const FXIconItem* b){ register FXint diff=(FXint)((FXFileItem*)b)->isDirectory() - (FXint)((FXFileItem*)a)->isDirectory(); if(diff==0){ if(static_cast(a)->date > static_cast(b)->date) return 1; if(static_cast(a)->date < static_cast(b)->date) return -1; return compareSectionCase(a->label.text(),b->label.text(),0); } return diff; } // Compare file user FXint FXFileList::ascendingUser(const FXIconItem* a,const FXIconItem* b){ register FXint diff=static_cast(b)->isDirectory() - static_cast(a)->isDirectory(); if(diff==0){ diff=compareSection(a->label.text(),b->label.text(),4); if(diff==0){ return compareSectionCase(a->label.text(),b->label.text(),0); } } return diff; } // Compare file group FXint FXFileList::ascendingGroup(const FXIconItem* a,const FXIconItem* b){ register FXint diff=static_cast(b)->isDirectory() - static_cast(a)->isDirectory(); if(diff==0){ diff=compareSection(a->label.text(),b->label.text(),5); if(diff==0){ return compareSectionCase(a->label.text(),b->label.text(),0); } } return diff; } // Reversed compare file name, case insensitive FXint FXFileList::descendingCase(const FXIconItem* a,const FXIconItem* b){ return -FXFileList::ascendingCase(a,b); } // Reversed compare file name FXint FXFileList::descending(const FXIconItem* a,const FXIconItem* b){ return -FXFileList::ascending(a,b); } // Reversed compare file type FXint FXFileList::descendingType(const FXIconItem* a,const FXIconItem* b){ return -FXFileList::ascendingType(a,b); } // Reversed compare file size FXint FXFileList::descendingSize(const FXIconItem* a,const FXIconItem* b){ return -FXFileList::ascendingSize(a,b); } // Reversed compare file time FXint FXFileList::descendingTime(const FXIconItem* a,const FXIconItem* b){ return -FXFileList::ascendingTime(a,b); } // Reversed compare file user FXint FXFileList::descendingUser(const FXIconItem* a,const FXIconItem* b){ return -FXFileList::ascendingUser(a,b); } // Reversed compare file group FXint FXFileList::descendingGroup(const FXIconItem* a,const FXIconItem* b){ return -FXFileList::ascendingGroup(a,b); } //HANDLE FindFirstChangeNotification( //  LPCTSTR lpPathName,    // directory name //  BOOL bWatchSubtree,    // monitoring option //  DWORD dwNotifyFilter   // filter conditions //); // //The HANDLE can be passed to FXApp::addInput(), and you'll be notified //for all events as specified in dwNotifyFilter. // Refresh; don't update if user is interacting with the list long FXFileList::onRefreshTimer(FXObject*,FXSelector,void*){ if(flags&FLAG_UPDATE){ counter=(counter+1)%REFRESHFREQUENCY; scan(FALSE); } getApp()->addTimeout(this,ID_REFRESHTIMER,REFRESHINTERVAL); return 0; } // Force an immediate update of the list long FXFileList::onCmdRefresh(FXObject*,FXSelector,void*){ scan(TRUE); return 1; } // Scan items to see if listing is necessary void FXFileList::scan(FXbool force){ FXStat info; // Stat the current directory if(FXStat::statFile(directory,info)){ // New date of directory FXTime newdate=info.touched(); // Forced, date was changed, or failed to get proper date and counter expired if(force || (timestamp!=newdate) || (counter==0)){ // And do the refresh listItems(force); sortItems(); // Remember when we did this timestamp=newdate; } } // Move to higher directory else{ setDirectory(FXPath::upLevel(directory)); } } // Set current filename void FXFileList::setCurrentFile(const FXString& pathname,FXbool notify){ FXTRACE((100,"%s::setCurrentFile(%s)\n",getClassName(),pathname.text())); if(!pathname.empty()){ setDirectory(FXPath::directory(pathname)); FXint index=findItem(FXPath::name(pathname)); makeItemVisible(index); setAnchorItem(index); setCurrentItem(index,notify); if(0<=index){ selectItem(index); } } } // Get pathname to current file, if any FXString FXFileList::getCurrentFile() const { if(current<0) return FXString::null; return getItemPathname(current); } // Set directory being displayed void FXFileList::setDirectory(const FXString& pathname){ if(!pathname.empty()){ FXTRACE((100,"%s::setDirectory(%s)\n",getClassName(),pathname.text())); FXString path=FXPath::absolute(directory,pathname); while(!FXPath::isTopDirectory(path) && !(FXPath::isShare(path) || FXStat::isDirectory(path))){ path=FXPath::upLevel(path); } if(directory!=path){ directory=path; clearItems(); counter=0; list=NULL; scan(TRUE); } } } // Set the pattern to filter void FXFileList::setPattern(const FXString& ptrn){ if(ptrn.empty()) return; if(pattern!=ptrn){ pattern=ptrn; scan(TRUE); } } // Change file match mode void FXFileList::setMatchMode(FXuint mode){ if(matchmode!=mode){ matchmode=mode; scan(TRUE); } } // Return TRUE if showing hidden files FXbool FXFileList::showHiddenFiles() const { return (options&FILELIST_SHOWHIDDEN)!=0; } // Change show hidden files mode void FXFileList::showHiddenFiles(FXbool shown){ FXuint opts=shown ? (options|FILELIST_SHOWHIDDEN) : (options&~FILELIST_SHOWHIDDEN); if(opts!=options){ options=opts; scan(TRUE); } } // Return TRUE if displaying image FXbool FXFileList::showImages() const { return (options&FILELIST_SHOWIMAGES)!=0; } // Change show image display mode void FXFileList::showImages(FXbool shown){ FXuint opts=shown ? (options|FILELIST_SHOWIMAGES) : (options&~FILELIST_SHOWIMAGES); if(opts!=options){ options=opts; scan(TRUE); } } // Change images preview size void FXFileList::setImageSize(FXint size){ if(size!=imagesize){ imagesize=size; scan(TRUE); } } // Return TRUE if showing directories only FXbool FXFileList::showOnlyDirectories() const { return (options&FILELIST_SHOWDIRS)!=0; } // Change show directories only mode void FXFileList::showOnlyDirectories(FXbool shown){ FXuint opts=shown ? (options|FILELIST_SHOWDIRS) : (options&~FILELIST_SHOWDIRS); if(opts!=options){ options=opts; scan(TRUE); } } // Return TRUE if showing files only FXbool FXFileList::showOnlyFiles() const { return (options&FILELIST_SHOWFILES)!=0; } // Show files only void FXFileList::showOnlyFiles(FXbool shown){ FXuint opts=shown ? (options|FILELIST_SHOWFILES) : (options&~FILELIST_SHOWFILES); if(opts!=options){ options=opts; scan(TRUE); } } // Return TRUE if showing parent directories FXbool FXFileList::showParents() const { return (options&FILELIST_NO_PARENT)==0; } // Show parent directories void FXFileList::showParents(FXbool shown) { FXuint opts=shown ? (options&~FILELIST_NO_PARENT) : (options|FILELIST_NO_PARENT); if(opts!=options){ options=opts; scan(TRUE); } } // Compare till '\t' or '\0' static FXbool fileequal(const FXString& a,const FXString& b){ register const FXuchar *p1=(const FXuchar *)a.text(); register const FXuchar *p2=(const FXuchar *)b.text(); register FXint c1,c2; do{ c1=*p1++; c2=*p2++; } while(c1!='\0' && c1!='\t' && c1==c2); return (c1=='\0' || c1=='\t') && (c2=='\0' || c2=='\t'); } // Create custom item FXIconItem *FXFileList::createItem(const FXString& text,FXIcon *big,FXIcon* mini,void* ptr){ return new FXFileItem(text,big,mini,ptr); } // List directory void FXFileList::listItems(FXbool force){ FXFileItem *oldlist=list; // Old insert-order list FXFileItem *newlist=NULL; // New insert-order list FXFileItem **po=&oldlist; // Head of old list FXFileItem **pn=&newlist; // Head of new list FXFileItem *curitem=NULL; FXFileItem *item,*link,**pp; FXIconSource *source; FXIcon *icon; FXString pathname; FXString extension; FXString name; FXString grpid; FXString usrid; FXString atts; FXString mod; FXString linkname; FXbool islink; FXbool istop; FXStat info; FXDir dir; // Remember current item if(0<=current){ curitem=(FXFileItem*)items[current]; } // Start inserting items.clear(); // Are we at the top directory? istop=FXPath::isTopDirectory(directory); // Assume not a link islink=FALSE; // Get directory stream pointer if(dir.open(directory)){ // Loop over directory entries while(dir.next()){ // Get file name name=dir.name(); // Hidden files of the form ".xxx" are normally not shown, but ".." is so we can // navigate up as well as down. However, at the root level we can't go up any // further so we show "." but not ".."; this allows us to explicitly select "/." // as a directory when we're in directory selection mode. if(name[0]=='.'){ if(name[1]==0){ if((options&FILELIST_NO_PARENT) || !istop) continue; } else if(name[1]=='.' && name[2]==0){ if((options&FILELIST_NO_PARENT) || istop) continue; } else{ if(!(options&FILELIST_SHOWHIDDEN)) continue; } } // Build full pathname pathname=directory; if(!ISPATHSEP(pathname[pathname.length()-1])) pathname+=PATHSEPSTRING; pathname+=name; #ifdef WIN32 // Get file/link info if(!FXStat::statFile(pathname,info)) continue; // Hidden file or directory normally not shown if(info.isHidden() && !(options&FILELIST_SHOWHIDDEN)) continue; #else // Get file/link info if(!FXStat::statLink(pathname,info)) continue; // If its a link, get the info on file itself islink=info.isLink(); if(islink && !FXStat::statFile(pathname,info)) continue; #endif // If it is a file and we want only directories or doesn't match, skip it if(!info.isDirectory() && ((options&FILELIST_SHOWDIRS) || !FXPath::match(pattern,name,matchmode))) continue; // If it is a directory and we want only files, skip it if(info.isDirectory() && (options&FILELIST_SHOWFILES)) continue; // Find it, and take it out from the old list if found for(pp=po; (item=*pp)!=NULL; pp=&item->link){ if(fileequal(item->label,name)){ *pp=item->link; item->link=NULL; po=pp; goto fnd; } } // Make new item if we have to item=(FXFileItem*)createItem(FXString::null,NULL,NULL,NULL); // Add to insert-order list fnd: *pn=item; pn=&item->link; // Append if(item==curitem) current=items.no(); items.append(item); // Update only if something changed if(force || item->label.empty() || item->date!=info.modified() || item->size!=info.size()){ // Obtain user name usrid=FXSystem::userName(info.user()); // Obtain group name grpid=FXSystem::groupName(info.group()); // Permissions atts=FXSystem::modeString(info.mode()); // Mod time mod=FXSystem::time(info.modified()); // Link if(islink) linkname=FXFile::symlink(pathname); else linkname=FXString::null; // Update flags if(info.isExecutable()){item->state|=FXFileItem::EXECUTABLE;}else{item->state&=~FXFileItem::EXECUTABLE;} if(info.isDirectory()){item->state|=FXFileItem::FOLDER;item->state&=~FXFileItem::EXECUTABLE;}else{item->state&=~FXFileItem::FOLDER;} if(info.isCharacter()){item->state|=FXFileItem::CHARDEV;item->state&=~FXFileItem::EXECUTABLE;}else{item->state&=~FXFileItem::CHARDEV;} if(info.isBlock()){item->state|=FXFileItem::BLOCKDEV;item->state&=~FXFileItem::EXECUTABLE;}else{item->state&=~FXFileItem::BLOCKDEV;} if(info.isFifo()){item->state|=FXFileItem::FIFO;item->state&=~FXFileItem::EXECUTABLE;}else{item->state&=~FXFileItem::FIFO;} if(info.isSocket()){item->state|=FXFileItem::SOCK;item->state&=~FXFileItem::EXECUTABLE;}else{item->state&=~FXFileItem::SOCK;} if(islink){item->state|=FXFileItem::SYMLINK;}else{item->state&=~FXFileItem::SYMLINK;} // We can drag items item->setDraggable(TRUE); // File size item->size=info.size(); // File access time item->date=info.modified(); // No associations item->assoc=NULL; // Determine icons and type if(item->isDirectory()){ extension="File Folder"; item->setBigIcon(big_folder); item->setMiniIcon(mini_folder); if(associations) item->assoc=associations->findDirBinding(pathname.text()); } else if(item->isExecutable()){ extension="Application"; item->setBigIcon(big_app); item->setMiniIcon(mini_app); if(associations) item->assoc=associations->findExecBinding(pathname.text()); } else{ extension=FXPath::extension(pathname).upper(); if(!extension.empty()) extension+=" File"; item->setBigIcon(big_doc); item->setMiniIcon(mini_doc); if(associations) item->assoc=associations->findFileBinding(pathname.text()); } // If association is found, use it if(item->assoc){ extension=item->assoc->extension; if(item->assoc->bigicon) item->setBigIcon(item->assoc->bigicon); if(item->assoc->miniicon) item->setMiniIcon(item->assoc->miniicon); } // Attempt to load thumbnail if(associations && (options&FILELIST_SHOWIMAGES)){ source=associations->getIconDict()->getIconSource(); icon=source->loadScaledIconFile(pathname,imagesize); if(icon) item->setBigIcon(icon,TRUE); } // Update item information #ifndef WIN32 #if defined(__LP64__) || defined(_LP64) || (_MIPS_SZLONG == 64) || (__WORDSIZE == 64) item->label.format("%s\t%s\t%ld\t%s\t%s\t%s\t%s\t%s",name.text(),extension.text(),item->size,mod.text(),usrid.text(),grpid.text(),atts.text(),linkname.text()); #else item->label.format("%s\t%s\t%lld\t%s\t%s\t%s\t%s\t%s",name.text(),extension.text(),item->size,mod.text(),usrid.text(),grpid.text(),atts.text(),linkname.text()); #endif #else item->label.format("%s\t%s\t%I64u\t%s\t%s\t%s\t%s",name.text(),extension.text(),item->size,mod.text(),usrid.text(),grpid.text(),atts.text()); #endif // Create item if(id()) item->create(); } } dir.close(); } // Wipe items remaining in list:- they have disappeared!! for(item=oldlist; item; item=link){ link=item->link; delete item; } // Validate if(current>=items.no()) current=-1; if(anchor>=items.no()) anchor=-1; if(extent>=items.no()) extent=-1; // Remember new list list=newlist; // Gotta recalc size of content recalc(); } /*******************************************************************************/ // Is directory FXbool FXFileList::isItemDirectory(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::isItemDirectory: index out of range.\n",getClassName()); } return ((FXFileItem*)items[index])->isDirectory(); } // Is share FXbool FXFileList::isItemShare(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::isItemShare: index out of range.\n",getClassName()); } return ((FXFileItem*)items[index])->isShare(); } // Is file FXbool FXFileList::isItemFile(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::isItemFile: index out of range.\n",getClassName()); } return ((FXFileItem*)items[index])->isFile(); } // Is executable FXbool FXFileList::isItemExecutable(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::isItemExecutable: index out of range.\n",getClassName()); } return ((FXFileItem*)items[index])->isExecutable(); } // Get file name from item FXString FXFileList::getItemFilename(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemFilename: index out of range.\n",getClassName()); } return items[index]->label.section('\t',0); } // Get full pathname to item FXString FXFileList::getItemPathname(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemPathname: index out of range.\n",getClassName()); } return FXPath::absolute(directory,items[index]->label.section('\t',0)); } // Get associations (if any) from the file FXFileAssoc* FXFileList::getItemAssoc(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemAssoc: index out of range.\n",getClassName()); } return ((FXFileItem*)items[index])->getAssoc(); } // Change associations table; force a rescan so as to // update the bindings in each item to the new associations void FXFileList::setAssociations(FXFileDict* assocs){ if(associations!=assocs){ associations=assocs; scan(TRUE); } } // Save data void FXFileList::save(FXStream& store) const { FXIconList::save(store); store << directory; store << associations; store << pattern; store << matchmode; store << big_folder; store << mini_folder; store << big_doc; store << mini_doc; store << big_app; store << mini_app; } // Load data void FXFileList::load(FXStream& store){ FXIconList::load(store); store >> directory; store >> associations; store >> pattern; store >> matchmode; store >> big_folder; store >> mini_folder; store >> big_doc; store >> mini_doc; store >> big_app; store >> mini_app; } // Cleanup FXFileList::~FXFileList(){ getApp()->removeTimeout(this,ID_REFRESHTIMER); getApp()->removeTimeout(this,ID_OPENTIMER); if(!(options&FILELIST_NO_OWN_ASSOC)) delete associations; delete big_folder; delete mini_folder; delete big_doc; delete mini_doc; delete big_app; delete mini_app; associations=(FXFileDict*)-1L; list=(FXFileItem*)-1L; big_folder=(FXIcon*)-1L; mini_folder=(FXIcon*)-1L; big_doc=(FXIcon*)-1L; mini_doc=(FXIcon*)-1L; big_app=(FXIcon*)-1L; mini_app=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXFileSelector.cpp000066400000000000000000001270341326741342000167550ustar00rootroot00000000000000/******************************************************************************** * * * F i l e S e l e c t i o n W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFileSelector.cpp,v 1.196 2006/01/23 15:51:05 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXObjectList.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXPath.h" #include "FXSystem.h" #include "FXStat.h" #include "FXFile.h" #include "FXDir.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXFont.h" #include "FXGIFIcon.h" #include "FXRecentFiles.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXTextField.h" #include "FXButton.h" #include "FXToggleButton.h" #include "FXCheckButton.h" #include "FXMenuButton.h" #include "FXPacker.h" #include "FXHorizontalFrame.h" #include "FXVerticalFrame.h" #include "FXMatrix.h" #include "FXShell.h" #include "FXPopup.h" #include "FXMenuPane.h" #include "FXScrollBar.h" #include "FXScrollArea.h" #include "FXList.h" #include "FXTreeList.h" #include "FXComboBox.h" #include "FXTreeListBox.h" #include "FXDirBox.h" #include "FXHeader.h" #include "FXIconList.h" #include "FXFileList.h" #include "FXFileSelector.h" #include "FXMenuCaption.h" #include "FXMenuCommand.h" #include "FXMenuCascade.h" #include "FXMenuRadio.h" #include "FXMenuCheck.h" #include "FXMenuSeparator.h" #include "FXTopWindow.h" #include "FXDialogBox.h" #include "FXInputDialog.h" #include "FXSeparator.h" #include "FXMessageBox.h" #include "icons.h" /* Notes: - Getting a file name according to what we want: - Any filename for saving (but with existing dir part) - An existing file for loading - An existing directory - Multiple filenames. - Get network drives to work. - Change filter specification; below sets two filters: "Source Files (*.cpp,*.cc,*.C)\nHeader files (*.h,*.H)" Instead of ',' you should also be able to use '|' in the above. - Multi-file mode needs to allow for manual entry in the text field. - Got nifty handling when entering path in text field: 1) If its a directory you typed, switch to the directory. 2) If the directory part of the file name exists: if SELECTFILE_ANY mode, then we're done. if SELECTFILE_EXISTING mode AND file exists, we're done. if SELECTFILE_MULTIPLE mode AND all files exist, we're done. 3) Else use the fragment of the directory which still exists, and switch to that directory; leave the incorrect tail-end in the text field to be edited further - In directory mode, only way to return is by accept. - Switching directories zaps text field value, but not in SELECTFILE_ANY mode, because when saving a file you may want to give the same name even if directory changes. - When changing filter, maybe update the extension (if not more than one extension given). - Perhaps ".." should be excluded from SELECTFILE_MULTIPLE_ALL selections. - Drag corner would be nice. - When copying, moving, deleting, linking multiple files, build the list of selected files first, to take care of FXFileList possibly updating before operation is finished. */ #define FILELISTMASK (ICONLIST_EXTENDEDSELECT|ICONLIST_SINGLESELECT|ICONLIST_BROWSESELECT|ICONLIST_MULTIPLESELECT) #define FILESTYLEMASK (ICONLIST_DETAILED|ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS|ICONLIST_ROWS|ICONLIST_COLUMNS|ICONLIST_AUTOSIZE) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXFileSelector) FXFileSelectorMap[]={ FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_ACCEPT,FXFileSelector::onCmdAccept), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_FILEFILTER,FXFileSelector::onCmdFilter), FXMAPFUNC(SEL_DOUBLECLICKED,FXFileSelector::ID_FILELIST,FXFileSelector::onCmdItemDblClicked), FXMAPFUNC(SEL_SELECTED,FXFileSelector::ID_FILELIST,FXFileSelector::onCmdItemSelected), FXMAPFUNC(SEL_DESELECTED,FXFileSelector::ID_FILELIST,FXFileSelector::onCmdItemDeselected), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,FXFileSelector::ID_FILELIST,FXFileSelector::onPopupMenu), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_DIRECTORY_UP,FXFileSelector::onCmdDirectoryUp), FXMAPFUNC(SEL_UPDATE,FXFileSelector::ID_DIRECTORY_UP,FXFileSelector::onUpdDirectoryUp), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_DIRTREE,FXFileSelector::onCmdDirTree), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_HOME,FXFileSelector::onCmdHome), FXMAPFUNC(SEL_UPDATE,FXFileSelector::ID_HOME,FXFileSelector::onUpdNavigable), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_WORK,FXFileSelector::onCmdWork), FXMAPFUNC(SEL_UPDATE,FXFileSelector::ID_WORK,FXFileSelector::onUpdNavigable), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_VISIT,FXFileSelector::onCmdVisit), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_BOOKMARK,FXFileSelector::onCmdBookmark), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_NEW,FXFileSelector::onCmdNew), FXMAPFUNC(SEL_UPDATE,FXFileSelector::ID_NEW,FXFileSelector::onUpdNew), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_DELETE,FXFileSelector::onCmdDelete), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_MOVE,FXFileSelector::onCmdMove), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_COPY,FXFileSelector::onCmdCopy), FXMAPFUNC(SEL_COMMAND,FXFileSelector::ID_LINK,FXFileSelector::onCmdLink), FXMAPFUNC(SEL_UPDATE,FXFileSelector::ID_COPY,FXFileSelector::onUpdSelected), FXMAPFUNC(SEL_UPDATE,FXFileSelector::ID_MOVE,FXFileSelector::onUpdSelected), FXMAPFUNC(SEL_UPDATE,FXFileSelector::ID_LINK,FXFileSelector::onUpdSelected), FXMAPFUNC(SEL_UPDATE,FXFileSelector::ID_DELETE,FXFileSelector::onUpdSelected), FXMAPFUNC(SEL_UPDATE,FXFileSelector::ID_BOOKMENU,FXFileSelector::onUpdNavigable), FXMAPFUNCS(SEL_COMMAND,FXFileSelector::ID_NORMAL_SIZE,FXFileSelector::ID_GIANT_SIZE,FXFileSelector::onCmdImageSize), FXMAPFUNCS(SEL_UPDATE,FXFileSelector::ID_NORMAL_SIZE,FXFileSelector::ID_GIANT_SIZE,FXFileSelector::onUpdImageSize), }; // Implementation FXIMPLEMENT(FXFileSelector,FXPacker,FXFileSelectorMap,ARRAYNUMBER(FXFileSelectorMap)) // Default pattern static const FXchar allfiles[]="All Files (*)"; /*******************************************************************************/ // Separator item FXFileSelector::FXFileSelector(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h):FXPacker(p,opts,x,y,w,h),bookmarks(p->getApp(),"Visited Directories"){ FXAccelTable *table=getShell()->getAccelTable(); target=tgt; message=sel; navbuttons=new FXHorizontalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X,0,0,0,0, DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING, 0,0); entryblock=new FXMatrix(this,3,MATRIX_BY_COLUMNS|LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); new FXLabel(entryblock,tr("&File Name:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y); filename=new FXTextField(entryblock,25,this,ID_ACCEPT,TEXTFIELD_ENTER_ONLY|LAYOUT_FILL_COLUMN|LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK); new FXButton(entryblock,tr("&OK"),NULL,this,ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X,0,0,0,0,20,20); accept=new FXButton(navbuttons,FXString::null,NULL,NULL,0,LAYOUT_FIX_X|LAYOUT_FIX_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,0,0,0,0, 0,0,0,0); new FXLabel(entryblock,tr("File F&ilter:"),NULL,JUSTIFY_LEFT|LAYOUT_CENTER_Y); FXHorizontalFrame *filterframe=new FXHorizontalFrame(entryblock,LAYOUT_FILL_COLUMN|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); filefilter=new FXComboBox(filterframe,10,this,ID_FILEFILTER,COMBOBOX_STATIC|LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK); filefilter->setNumVisible(4); readonly=new FXCheckButton(filterframe,tr("Read Only"),NULL,0,ICON_BEFORE_TEXT|JUSTIFY_LEFT|LAYOUT_CENTER_Y); cancel=new FXButton(entryblock,tr("&Cancel"),NULL,NULL,0,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X,0,0,0,0,20,20); fileboxframe=new FXHorizontalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0,0,0,0,0); filebox=new FXFileList(fileboxframe,this,ID_FILELIST,ICONLIST_MINI_ICONS|ICONLIST_BROWSESELECT|ICONLIST_AUTOSIZE|LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXLabel(navbuttons,tr("Directory:"),NULL,LAYOUT_CENTER_Y); updiricon=new FXGIFIcon(getApp(),dirupicon); listicon=new FXGIFIcon(getApp(),showsmallicons); iconsicon=new FXGIFIcon(getApp(),showbigicons); detailicon=new FXGIFIcon(getApp(),showdetails); homeicon=new FXGIFIcon(getApp(),gotohome); workicon=new FXGIFIcon(getApp(),gotowork); shownicon=new FXGIFIcon(getApp(),fileshown); hiddenicon=new FXGIFIcon(getApp(),filehidden); markicon=new FXGIFIcon(getApp(),bookset); clearicon=new FXGIFIcon(getApp(),bookclr); newicon=new FXGIFIcon(getApp(),foldernew); deleteicon=new FXGIFIcon(getApp(),filedelete); moveicon=new FXGIFIcon(getApp(),filemove); copyicon=new FXGIFIcon(getApp(),filecopy); linkicon=new FXGIFIcon(getApp(),filelink); dirbox=new FXDirBox(navbuttons,this,ID_DIRTREE,DIRBOX_NO_OWN_ASSOC|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_CENTER_Y,0,0,0,0,1,1,1,1); dirbox->setNumVisible(5); dirbox->setAssociations(filebox->getAssociations()); bookmarkmenu=new FXMenuPane(this,POPUP_SHRINKWRAP); new FXMenuCommand(bookmarkmenu,tr("&Set bookmark\t\tBookmark current directory."),markicon,this,ID_BOOKMARK); new FXMenuCommand(bookmarkmenu,tr("&Clear bookmarks\t\tClear bookmarks."),clearicon,&bookmarks,FXRecentFiles::ID_CLEAR); FXMenuSeparator* sep1=new FXMenuSeparator(bookmarkmenu); sep1->setTarget(&bookmarks); sep1->setSelector(FXRecentFiles::ID_ANYFILES); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_1); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_2); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_3); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_4); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_5); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_6); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_7); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_8); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_9); new FXMenuCommand(bookmarkmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_10); new FXFrame(navbuttons,LAYOUT_FIX_WIDTH,0,0,4,1); new FXButton(navbuttons,tr("\tGo up one directory\tMove up to higher directory."),updiricon,this,ID_DIRECTORY_UP,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0, 3,3,3,3); new FXButton(navbuttons,tr("\tGo to home directory\tBack to home directory."),homeicon,this,ID_HOME,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0, 3,3,3,3); new FXButton(navbuttons,tr("\tGo to work directory\tBack to working directory."),workicon,this,ID_WORK,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0, 3,3,3,3); FXMenuButton *bookmenu=new FXMenuButton(navbuttons,tr("\tBookmarks\tVisit bookmarked directories."),markicon,bookmarkmenu,MENUBUTTON_NOARROWS|MENUBUTTON_ATTACH_LEFT|MENUBUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0, 3,3,3,3); bookmenu->setTarget(this); bookmenu->setSelector(ID_BOOKMENU); new FXButton(navbuttons,tr("\tCreate new directory\tCreate new directory."),newicon,this,ID_NEW,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0, 3,3,3,3); new FXButton(navbuttons,tr("\tShow list\tDisplay directory with small icons."),listicon,filebox,FXFileList::ID_SHOW_MINI_ICONS,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0, 3,3,3,3); new FXButton(navbuttons,tr("\tShow icons\tDisplay directory with big icons."),iconsicon,filebox,FXFileList::ID_SHOW_BIG_ICONS,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0, 3,3,3,3); new FXButton(navbuttons,tr("\tShow details\tDisplay detailed directory listing."),detailicon,filebox,FXFileList::ID_SHOW_DETAILS,BUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0, 3,3,3,3); new FXToggleButton(navbuttons,tr("\tShow hidden files\tShow hidden files and directories."),tr("\tHide Hidden Files\tHide hidden files and directories."),hiddenicon,shownicon,filebox,FXFileList::ID_TOGGLE_HIDDEN,TOGGLEBUTTON_TOOLBAR|FRAME_RAISED,0,0,0,0, 3,3,3,3); bookmarks.setTarget(this); bookmarks.setSelector(ID_VISIT); readonly->hide(); if(table){ table->addAccel(MKUINT(KEY_BackSpace,0),this,FXSEL(SEL_COMMAND,ID_DIRECTORY_UP)); table->addAccel(MKUINT(KEY_Delete,0),this,FXSEL(SEL_COMMAND,ID_DELETE)); table->addAccel(MKUINT(KEY_h,CONTROLMASK),this,FXSEL(SEL_COMMAND,ID_HOME)); table->addAccel(MKUINT(KEY_w,CONTROLMASK),this,FXSEL(SEL_COMMAND,ID_WORK)); table->addAccel(MKUINT(KEY_n,CONTROLMASK),this,FXSEL(SEL_COMMAND,ID_NEW)); table->addAccel(MKUINT(KEY_a,CONTROLMASK),filebox,FXSEL(SEL_COMMAND,FXFileList::ID_SELECT_ALL)); table->addAccel(MKUINT(KEY_b,CONTROLMASK),filebox,FXSEL(SEL_COMMAND,FXFileList::ID_SHOW_BIG_ICONS)); table->addAccel(MKUINT(KEY_s,CONTROLMASK),filebox,FXSEL(SEL_COMMAND,FXFileList::ID_SHOW_MINI_ICONS)); table->addAccel(MKUINT(KEY_l,CONTROLMASK),filebox,FXSEL(SEL_COMMAND,FXFileList::ID_SHOW_DETAILS)); } setSelectMode(SELECTFILE_ANY); // For backward compatibility, this HAS to be the default! setPatternList(allfiles); setDirectory(FXSystem::getCurrentDirectory()); filebox->setFocus(); accept->hide(); navigable=TRUE; } // Change in items which are selected long FXFileSelector::onCmdItemSelected(FXObject*,FXSelector,void* ptr){ register FXint index=(FXint)(FXival)ptr; register FXint i; FXString text,file; if(selectmode==SELECTFILE_MULTIPLE){ for(i=0; igetNumItems(); i++){ if(filebox->isItemSelected(i) && !filebox->isItemDirectory(i)){ if(!text.empty()) text+=' '; text+="\""+filebox->getItemFilename(i)+"\""; } } filename->setText(text); } else if(selectmode==SELECTFILE_MULTIPLE_ALL){ for(i=0; igetNumItems(); i++){ if(filebox->isItemSelected(i) && filebox->getItemFilename(i)!=".." && filebox->getItemFilename(i)!="."){ if(!text.empty()) text+=' '; text+="\""+filebox->getItemFilename(i)+"\""; } } filename->setText(text); } else if(selectmode==SELECTFILE_DIRECTORY){ if(filebox->isItemDirectory(index)){ text=filebox->getItemFilename(index); filename->setText(text); } } else{ if(!filebox->isItemDirectory(index)){ text=filebox->getItemFilename(index); filename->setText(text); } } return 1; } // Change in items which are selected long FXFileSelector::onCmdItemDeselected(FXObject*,FXSelector,void*){ register FXint i; FXString text,file; if(selectmode==SELECTFILE_MULTIPLE){ for(i=0; igetNumItems(); i++){ if(filebox->isItemSelected(i) && !filebox->isItemDirectory(i)){ if(!text.empty()) text+=' '; text+="\""+filebox->getItemFilename(i)+"\""; } } filename->setText(text); } else if(selectmode==SELECTFILE_MULTIPLE_ALL){ for(i=0; igetNumItems(); i++){ if(filebox->isItemSelected(i) && filebox->getItemFilename(i)!=".." && filebox->getItemFilename(i)!="."){ if(!text.empty()) text+=' '; text+="\""+filebox->getItemFilename(i)+"\""; } } filename->setText(text); } return 1; } // Double-clicked item in file list long FXFileSelector::onCmdItemDblClicked(FXObject*,FXSelector,void* ptr){ FXSelector sel=accept->getSelector(); FXObject *tgt=accept->getTarget(); FXint index=(FXint)(FXival)ptr; if(0<=index){ // If directory, open the directory if(filebox->isItemShare(index) || filebox->isItemDirectory(index)){ if(allowNavigation()) setDirectory(filebox->getItemPathname(index)); return 1; } // Only return if we wanted a file if(selectmode!=SELECTFILE_DIRECTORY){ if(tgt) tgt->handle(accept,FXSEL(SEL_COMMAND,sel),(void*)(FXuval)1); } } return 1; } // Hit the accept button or enter in text field long FXFileSelector::onCmdAccept(FXObject*,FXSelector,void*){ FXSelector sel=accept->getSelector(); FXObject *tgt=accept->getTarget(); // Get (first) filename or directory FXString path=getFilename(); // Only do something if a selection was made if(!path.empty()){ // Is directory? if(FXStat::isDirectory(path)){ // In directory mode:- we got our answer! if(selectmode==SELECTFILE_DIRECTORY || selectmode==SELECTFILE_MULTIPLE_ALL){ if(tgt) tgt->handle(accept,FXSEL(SEL_COMMAND,sel),(void*)(FXuval)1); return 1; } // No navigation allowed if(!allowNavigation()){ filename->setText(FXPath::relative(getDirectory(),path)); filename->selectAll(); getApp()->beep(); return 1; } // Hop over to that directory dirbox->setDirectory(path); filebox->setDirectory(path); filename->setText(FXString::null); return 1; } // Get directory part of path FXString dir=FXPath::directory(path); // In file mode, directory part of path should exist if(FXStat::isDirectory(dir)){ // In any mode, existing directory part is good enough if(selectmode==SELECTFILE_ANY){ if(tgt) tgt->handle(accept,FXSEL(SEL_COMMAND,sel),(void*)(FXuval)1); return 1; } // Otherwise, the whole filename must exist and be a file if(FXStat::exists(path)){ if(tgt) tgt->handle(accept,FXSEL(SEL_COMMAND,sel),(void*)(FXuval)1); return 1; } } // No navigation allowed if(!allowNavigation()){ filename->setText(FXPath::relative(getDirectory(),path)); filename->selectAll(); getApp()->beep(); return 1; } // Go up to the lowest directory which still exists while(!FXPath::isTopDirectory(dir) && !FXStat::isDirectory(dir)){ dir=FXPath::upLevel(dir); } // Switch as far as we could go dirbox->setDirectory(dir); filebox->setDirectory(dir); // Put the tail end back for further editing FXASSERT(dir.length()<=path.length()); if(ISPATHSEP(path[dir.length()])) path.erase(0,dir.length()+1); else path.erase(0,dir.length()); // Replace text box with new stuff filename->setText(path); filename->selectAll(); } // Beep getApp()->beep(); return 1; } // User clicked up directory button long FXFileSelector::onCmdDirectoryUp(FXObject*,FXSelector,void*){ if(allowNavigation()) setDirectory(FXPath::upLevel(filebox->getDirectory())); return 1; } // Can we still go up long FXFileSelector::onUpdDirectoryUp(FXObject* sender,FXSelector,void*){ sender->handle(this,allowNavigation() && !FXPath::isTopDirectory(getDirectory()) ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Can we navigate long FXFileSelector::onUpdNavigable(FXObject* sender,FXSelector,void*){ sender->handle(this,allowNavigation() ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Back to home directory long FXFileSelector::onCmdHome(FXObject*,FXSelector,void*){ if(allowNavigation()) setDirectory(FXSystem::getHomeDirectory()); return 1; } // Back to current working directory long FXFileSelector::onCmdWork(FXObject*,FXSelector,void*){ if(allowNavigation()) setDirectory(FXSystem::getCurrentDirectory()); return 1; } // Move to recent directory long FXFileSelector::onCmdVisit(FXObject*,FXSelector,void* ptr){ if(allowNavigation()) setDirectory((FXchar*)ptr); return 1; } // Bookmark this directory long FXFileSelector::onCmdBookmark(FXObject*,FXSelector,void*){ bookmarks.appendFile(getDirectory()); return 1; } // Switched directories using directory tree long FXFileSelector::onCmdDirTree(FXObject*,FXSelector,void* ptr){ if(allowNavigation()){ filebox->setDirectory((FXchar*)ptr); if(selectmode==SELECTFILE_DIRECTORY) filename->setText(FXString::null); } else{ dirbox->setDirectory(getDirectory()); } return 1; } // Create new directory long FXFileSelector::onCmdNew(FXObject*,FXSelector,void*){ FXString dir=filebox->getDirectory(); FXString name="DirectoryName"; FXGIFIcon newdirectoryicon(getApp(),bigfolder); if(FXInputDialog::getString(name,this,tr("Create New Directory"),tr("Create new directory with name: "),&newdirectoryicon)){ FXString dirname=FXPath::absolute(dir,name); if(FXStat::exists(dirname)){ FXMessageBox::error(this,MBOX_OK,tr("Already Exists"),tr("File or directory %s already exists.\n"),dirname.text()); return 1; } if(!FXDir::create(dirname)){ FXMessageBox::error(this,MBOX_OK,tr("Cannot Create"),tr("Cannot create directory %s.\n"),dirname.text()); return 1; } setDirectory(dirname); } return 1; } // Update create new directory long FXFileSelector::onUpdNew(FXObject* sender,FXSelector,void*){ sender->handle(this,allowNavigation() && FXStat::isWritable(getDirectory())?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Selected files and directories FXString *FXFileSelector::getSelectedFiles() const { register FXString *files=NULL; register FXint i,n; for(i=n=0; igetNumItems(); i++){ if(filebox->isItemSelected(i) && filebox->getItemFilename(i)!=".." && filebox->getItemFilename(i)!="."){ n++; } } if(n){ files=new FXString [n+1]; for(i=n=0; igetNumItems(); i++){ if(filebox->isItemSelected(i) && filebox->getItemFilename(i)!=".." && filebox->getItemFilename(i)!="."){ files[n++]=filebox->getItemPathname(i); } } files[n]=FXString::null; } return files; } // Selected files only FXString *FXFileSelector::getSelectedFilesOnly() const { register FXString *files=NULL; register FXint i,n; for(i=n=0; igetNumItems(); i++){ if(filebox->isItemSelected(i) && !filebox->isItemDirectory(i)){ n++; } } if(n){ files=new FXString [n+1]; for(i=n=0; igetNumItems(); i++){ if(filebox->isItemSelected(i) && !filebox->isItemDirectory(i)){ files[n++]=filebox->getItemPathname(i); } } files[n]=FXString::null; } return files; } // Copy file or directory long FXFileSelector::onCmdCopy(FXObject*,FXSelector,void*){ FXString *filenamelist=getSelectedFiles(); FXString copymessage; if(filenamelist){ for(FXint i=0; !filenamelist[i].empty(); i++){ copymessage.format(tr("Copy file from location:\n\n%s\n\nto location: "),filenamelist[i].text()); FXInputDialog inputdialog(this,tr("Copy File"),copymessage,NULL,INPUTDIALOG_STRING,0,0,0,0); inputdialog.setText(FXPath::absolute(FXPath::directory(filenamelist[i]),"CopyOf"+FXPath::name(filenamelist[i]))); inputdialog.setNumColumns(60); if(inputdialog.execute()){ FXString newname=inputdialog.getText(); if(!FXFile::copyFiles(filenamelist[i],newname,FALSE)){ if(FXMessageBox::error(this,MBOX_YES_NO,tr("Error Copying File"),tr("Unable to copy file:\n\n%s to: %s\n\nContinue with operation?"),filenamelist[i].text(),newname.text())==MBOX_CLICKED_NO) break; } } } delete [] filenamelist; } return 1; } // Move file or directory long FXFileSelector::onCmdMove(FXObject*,FXSelector,void*){ FXString *filenamelist=getSelectedFiles(); FXString movemessage; if(filenamelist){ for(FXint i=0; !filenamelist[i].empty(); i++){ movemessage.format(tr("Move file from location:\n\n%s\n\nto location: "),filenamelist[i].text()); FXInputDialog inputdialog(this,tr("Move File"),movemessage,NULL,INPUTDIALOG_STRING,0,0,0,0); inputdialog.setText(filenamelist[i]); inputdialog.setNumColumns(60); if(inputdialog.execute()){ FXString newname=inputdialog.getText(); if(!FXFile::moveFiles(filenamelist[i],newname,FALSE)){ if(FXMessageBox::error(this,MBOX_YES_NO,tr("Error Moving File"),tr("Unable to move file:\n\n%s to: %s\n\nContinue with operation?"),filenamelist[i].text(),newname.text())==MBOX_CLICKED_NO) break; } } } delete [] filenamelist; } return 1; } // Link file or directory long FXFileSelector::onCmdLink(FXObject*,FXSelector,void*){ FXString *filenamelist=getSelectedFiles(); FXString linkmessage; if(filenamelist){ for(FXint i=0; !filenamelist[i].empty(); i++){ linkmessage.format(tr("Link file from location:\n\n%s\n\nto location: "),filenamelist[i].text()); FXInputDialog inputdialog(this,tr("Link File"),linkmessage,NULL,INPUTDIALOG_STRING,0,0,0,0); inputdialog.setText(FXPath::absolute(FXPath::directory(filenamelist[i]),"LinkTo"+FXPath::name(filenamelist[i]))); inputdialog.setNumColumns(60); if(inputdialog.execute()){ FXString newname=inputdialog.getText(); if(!FXFile::symlink(filenamelist[i],newname)){ if(FXMessageBox::error(this,MBOX_YES_NO,tr("Error Linking File"),tr("Unable to link file:\n\n%s to: %s\n\nContinue with operation?"),filenamelist[i].text(),newname.text())==MBOX_CLICKED_NO) break; } } } delete [] filenamelist; } return 1; } // Delete file or directory long FXFileSelector::onCmdDelete(FXObject*,FXSelector,void*){ FXString *filenamelist=getSelectedFiles(); FXuint answer; if(filenamelist){ for(FXint i=0; !filenamelist[i].empty(); i++){ answer=FXMessageBox::warning(this,MBOX_YES_NO_CANCEL,tr("Deleting files"),tr("Are you sure you want to delete the file:\n\n%s"),filenamelist[i].text()); if(answer==MBOX_CLICKED_CANCEL) break; if(answer==MBOX_CLICKED_NO) continue; if(!FXFile::removeFiles(filenamelist[i],TRUE)){ if(FXMessageBox::error(this,MBOX_YES_NO,tr("Error Deleting File"),tr("Unable to delete file:\n\n%s\n\nContinue with operation?"),filenamelist[i].text())==MBOX_CLICKED_NO) break; } } delete [] filenamelist; } return 1; } // Sensitize when files are selected long FXFileSelector::onUpdSelected(FXObject* sender,FXSelector,void*){ for(FXint i=0; igetNumItems(); i++){ if(filebox->isItemSelected(i)){ sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } } sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Change image size long FXFileSelector::onCmdImageSize(FXObject*,FXSelector sel,void*){ switch(FXSELID(sel)){ case ID_NORMAL_SIZE: setImageSize(32); break; case ID_MEDIUM_SIZE: setImageSize(48); break; case ID_GIANT_SIZE: setImageSize(64); break; } return 1; } // Update image size long FXFileSelector::onUpdImageSize(FXObject* sender,FXSelector sel,void*){ FXbool check=FALSE; switch(FXSELID(sel)){ case ID_NORMAL_SIZE: check=(getImageSize()==32); break; case ID_MEDIUM_SIZE: check=(getImageSize()==48); break; case ID_GIANT_SIZE: check=(getImageSize()==64); break; } sender->handle(this,check?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Popup menu for item in file list long FXFileSelector::onPopupMenu(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; if(event->moved) return 1; FXMenuPane filemenu(this); new FXMenuCommand(&filemenu,tr("Up one level"),updiricon,this,ID_DIRECTORY_UP); new FXMenuCommand(&filemenu,tr("Home directory"),homeicon,this,ID_HOME); new FXMenuCommand(&filemenu,tr("Work directory"),workicon,this,ID_WORK); new FXMenuCommand(&filemenu,tr("Select all"),NULL,filebox,FXFileList::ID_SELECT_ALL); new FXMenuSeparator(&filemenu); FXMenuPane sortmenu(this); new FXMenuCascade(&filemenu,tr("Sort by"),NULL,&sortmenu); new FXMenuRadio(&sortmenu,tr("Name"),filebox,FXFileList::ID_SORT_BY_NAME); new FXMenuRadio(&sortmenu,tr("Type"),filebox,FXFileList::ID_SORT_BY_TYPE); new FXMenuRadio(&sortmenu,tr("Size"),filebox,FXFileList::ID_SORT_BY_SIZE); new FXMenuRadio(&sortmenu,tr("Time"),filebox,FXFileList::ID_SORT_BY_TIME); new FXMenuRadio(&sortmenu,tr("User"),filebox,FXFileList::ID_SORT_BY_USER); new FXMenuRadio(&sortmenu,tr("Group"),filebox,FXFileList::ID_SORT_BY_GROUP); new FXMenuSeparator(&sortmenu); new FXMenuCheck(&sortmenu,tr("Reverse"),filebox,FXFileList::ID_SORT_REVERSE); new FXMenuCheck(&sortmenu,tr("Ignore case"),filebox,FXFileList::ID_SORT_CASE); FXMenuPane viewmenu(this); new FXMenuCascade(&filemenu,tr("View"),NULL,&viewmenu); new FXMenuRadio(&viewmenu,tr("Small icons"),filebox,FXFileList::ID_SHOW_MINI_ICONS); new FXMenuRadio(&viewmenu,tr("Big icons"),filebox,FXFileList::ID_SHOW_BIG_ICONS); new FXMenuRadio(&viewmenu,tr("Details"),filebox,FXFileList::ID_SHOW_DETAILS); new FXMenuSeparator(&viewmenu); new FXMenuRadio(&viewmenu,tr("Rows"),filebox,FXFileList::ID_ARRANGE_BY_ROWS); new FXMenuRadio(&viewmenu,tr("Columns"),filebox,FXFileList::ID_ARRANGE_BY_COLUMNS); new FXMenuSeparator(&viewmenu); new FXMenuCheck(&viewmenu,tr("Hidden files"),filebox,FXFileList::ID_TOGGLE_HIDDEN); new FXMenuCheck(&viewmenu,tr("Preview images"),filebox,FXFileList::ID_TOGGLE_IMAGES); new FXMenuSeparator(&viewmenu); new FXMenuRadio(&viewmenu,tr("Normal images"),this,ID_NORMAL_SIZE); new FXMenuRadio(&viewmenu,tr("Medium images"),this,ID_MEDIUM_SIZE); new FXMenuRadio(&viewmenu,tr("Giant images"),this,ID_GIANT_SIZE); FXMenuPane bookmenu(this); FXMenuCascade* bookcasc=new FXMenuCascade(&filemenu,tr("Bookmarks"),NULL,&bookmenu); bookcasc->setTarget(this); bookcasc->setSelector(ID_BOOKMENU); new FXMenuCommand(&bookmenu,tr("Set bookmark"),markicon,this,ID_BOOKMARK); new FXMenuCommand(&bookmenu,tr("Clear bookmarks"),clearicon,&bookmarks,FXRecentFiles::ID_CLEAR); FXMenuSeparator* sep1=new FXMenuSeparator(&bookmenu); sep1->setTarget(&bookmarks); sep1->setSelector(FXRecentFiles::ID_ANYFILES); new FXMenuCommand(&bookmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_1); new FXMenuCommand(&bookmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_2); new FXMenuCommand(&bookmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_3); new FXMenuCommand(&bookmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_4); new FXMenuCommand(&bookmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_5); new FXMenuCommand(&bookmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_6); new FXMenuCommand(&bookmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_7); new FXMenuCommand(&bookmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_8); new FXMenuCommand(&bookmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_9); new FXMenuCommand(&bookmenu,FXString::null,NULL,&bookmarks,FXRecentFiles::ID_FILE_10); new FXMenuSeparator(&filemenu); new FXMenuCommand(&filemenu,tr("New directory..."),newicon,this,ID_NEW); new FXMenuCommand(&filemenu,tr("Copy..."),copyicon,this,ID_COPY); new FXMenuCommand(&filemenu,tr("Move..."),moveicon,this,ID_MOVE); new FXMenuCommand(&filemenu,tr("Link..."),linkicon,this,ID_LINK); new FXMenuCommand(&filemenu,tr("Delete..."),deleteicon,this,ID_DELETE); filemenu.create(); filemenu.popup(NULL,event->root_x,event->root_y); getApp()->runModalWhileShown(&filemenu); return 1; } // Strip pattern from text if present FXString FXFileSelector::patternFromText(const FXString& pattern){ FXint beg,end; end=pattern.rfind(')'); // Search from the end so we can allow ( ) in the pattern name itself beg=pattern.rfind('(',end-1); if(0<=beg && begsetPattern(pat); if(selectmode==SELECTFILE_ANY){ FXString ext=extensionFromPattern(pat); if(!ext.empty()){ FXString name=FXPath::stripExtension(filename->getText()); if(!name.empty()) filename->setText(name+"."+ext); } } return 1; } // Set directory void FXFileSelector::setDirectory(const FXString& path){ FXString abspath=FXPath::absolute(path); FXTRACE((100,"path=%s abspath: %s\n",path.text(),abspath.text())); filebox->setDirectory(abspath); dirbox->setDirectory(abspath); if(selectmode!=SELECTFILE_ANY){ filename->setText(FXString::null); } } // Get directory FXString FXFileSelector::getDirectory() const { return filebox->getDirectory(); } // Set file name void FXFileSelector::setFilename(const FXString& path){ FXString fullname(FXPath::absolute(path)); FXString name(FXPath::name(fullname)); filebox->setCurrentFile(fullname); dirbox->setDirectory(filebox->getDirectory()); filename->setText(name); } // Get complete path + filename FXString FXFileSelector::getFilename() const { register FXint i; if(selectmode==SELECTFILE_MULTIPLE_ALL){ for(i=0; igetNumItems(); i++){ if(filebox->isItemSelected(i) && filebox->getItemFilename(i)!=".." && filebox->getItemFilename(i)!="."){ return FXPath::absolute(filebox->getDirectory(),filebox->getItemFilename(i)); } } } else if(selectmode==SELECTFILE_MULTIPLE){ for(i=0; igetNumItems(); i++){ if(filebox->isItemSelected(i) && !filebox->isItemDirectory(i)){ return FXPath::absolute(filebox->getDirectory(),filebox->getItemFilename(i)); } } } else{ if(!filename->getText().empty()){ //return FXPath::absolute(filebox->getDirectory(),filename->getText()); return FXPath::absolute(filebox->getDirectory(),FXPath::expand(filename->getText())); // FIXME don't always want to expand! } } return FXString::null; } // Return empty-string terminated list of selected file names, or NULL FXString* FXFileSelector::getFilenames() const { register FXString *files; if(selectmode==SELECTFILE_MULTIPLE_ALL){ files=getSelectedFiles(); } else{ files=getSelectedFilesOnly(); } return files; } // Change patterns, each pattern separated by newline void FXFileSelector::setPatternList(const FXString& patterns){ FXint count; filefilter->clearItems(); count=filefilter->fillItems(patterns); if(count==0) filefilter->appendItem(allfiles); filefilter->setNumVisible(FXMIN(count,12)); setCurrentPattern(0); } // Return list of patterns FXString FXFileSelector::getPatternList() const { FXString pat; for(FXint i=0; igetNumItems(); i++){ if(!pat.empty()) pat+='\n'; pat+=filefilter->getItemText(i); } return pat; } // Set current filter pattern void FXFileSelector::setPattern(const FXString& ptrn){ filefilter->setText(ptrn); filebox->setPattern(ptrn); } // Get current filter pattern FXString FXFileSelector::getPattern() const { return filebox->getPattern(); } // Set current file pattern from the list void FXFileSelector::setCurrentPattern(FXint patno){ if(patno<0 || patno>=filefilter->getNumItems()){ fxerror("%s::setCurrentPattern: index out of range.\n",getClassName()); } filefilter->setCurrentItem(patno); filebox->setPattern(patternFromText(filefilter->getItemText(patno))); } // Return current pattern FXint FXFileSelector::getCurrentPattern() const { return filefilter->getCurrentItem(); } // Change pattern for pattern number patno void FXFileSelector::setPatternText(FXint patno,const FXString& text){ if(patno<0 || patno>=filefilter->getNumItems()){ fxerror("%s::setPatternText: index out of range.\n",getClassName()); } filefilter->setItemText(patno,text); if(patno==filefilter->getCurrentItem()){ setPattern(patternFromText(text)); } } // Return pattern text of pattern patno FXString FXFileSelector::getPatternText(FXint patno) const { if(patno<0 || patno>=filefilter->getNumItems()){ fxerror("%s::getPatternText: index out of range.\n",getClassName()); } return filefilter->getItemText(patno); } // Return number of patterns FXint FXFileSelector::getNumPatterns() const { return filefilter->getNumItems(); } // Allow pattern entry void FXFileSelector::allowPatternEntry(FXbool allow){ filefilter->setComboStyle(allow?COMBOBOX_NORMAL:COMBOBOX_STATIC); } // Return TRUE if pattern entry is allowed FXbool FXFileSelector::allowPatternEntry() const { return (filefilter->getComboStyle()!=COMBOBOX_STATIC); } // Change space for item void FXFileSelector::setItemSpace(FXint s){ filebox->setItemSpace(s); } // Get space for item FXint FXFileSelector::getItemSpace() const { return filebox->getItemSpace(); } // Change File List style void FXFileSelector::setFileBoxStyle(FXuint style){ filebox->setListStyle((filebox->getListStyle()&~FILESTYLEMASK) | (style&FILESTYLEMASK)); } // Return File List style FXuint FXFileSelector::getFileBoxStyle() const { return filebox->getListStyle()&FILESTYLEMASK; } // Change file selection mode void FXFileSelector::setSelectMode(FXuint mode){ switch(mode){ case SELECTFILE_EXISTING: filebox->showOnlyDirectories(FALSE); filebox->setListStyle((filebox->getListStyle()&~FILELISTMASK)|ICONLIST_BROWSESELECT); break; case SELECTFILE_MULTIPLE: case SELECTFILE_MULTIPLE_ALL: filebox->showOnlyDirectories(FALSE); filebox->setListStyle((filebox->getListStyle()&~FILELISTMASK)|ICONLIST_EXTENDEDSELECT); break; case SELECTFILE_DIRECTORY: filebox->showOnlyDirectories(TRUE); filebox->setListStyle((filebox->getListStyle()&~FILELISTMASK)|ICONLIST_BROWSESELECT); break; default: filebox->showOnlyDirectories(FALSE); filebox->setListStyle((filebox->getListStyle()&~FILELISTMASK)|ICONLIST_BROWSESELECT); break; } selectmode=mode; } // Change wildcard matching mode void FXFileSelector::setMatchMode(FXuint mode){ filebox->setMatchMode(mode); } // Return wildcard matching mode FXuint FXFileSelector::getMatchMode() const { return filebox->getMatchMode(); } // Return TRUE if showing hidden files FXbool FXFileSelector::showHiddenFiles() const { return filebox->showHiddenFiles(); } // Show or hide hidden files void FXFileSelector::showHiddenFiles(FXbool showing){ filebox->showHiddenFiles(showing); } // Return TRUE if image preview on FXbool FXFileSelector::showImages() const { return filebox->showImages(); } // Show or hide preview images void FXFileSelector::showImages(FXbool showing){ filebox->showImages(showing); } // Return images preview size FXint FXFileSelector::getImageSize() const { return filebox->getImageSize(); } // Change images preview size void FXFileSelector::setImageSize(FXint size){ filebox->setImageSize(size); } // Show readonly button void FXFileSelector::showReadOnly(FXbool show){ show ? readonly->show() : readonly->hide(); } // Return TRUE if readonly is shown FXbool FXFileSelector::shownReadOnly() const { return readonly->shown(); } // Set initial state of readonly button void FXFileSelector::setReadOnly(FXbool state){ readonly->setCheck(state); } // Get readonly state FXbool FXFileSelector::getReadOnly() const { return readonly->getCheck(); } // Save data void FXFileSelector::save(FXStream& store) const { FXPacker::save(store); store << filebox; store << filename; store << filefilter; store << bookmarkmenu; store << readonly; store << dirbox; store << accept; store << cancel; store << updiricon; store << listicon; store << detailicon; store << iconsicon; store << homeicon; store << workicon; store << shownicon; store << hiddenicon; store << markicon; store << clearicon; store << newicon; store << deleteicon; store << moveicon; store << copyicon; store << linkicon; store << selectmode; store << navigable; } // Load data void FXFileSelector::load(FXStream& store){ FXPacker::load(store); store >> filebox; store >> filename; store >> filefilter; store >> bookmarkmenu; store >> readonly; store >> dirbox; store >> accept; store >> cancel; store >> updiricon; store >> listicon; store >> detailicon; store >> iconsicon; store >> homeicon; store >> workicon; store >> shownicon; store >> hiddenicon; store >> markicon; store >> clearicon; store >> newicon; store >> deleteicon; store >> moveicon; store >> copyicon; store >> linkicon; store >> selectmode; store >> navigable; } // Cleanup; icons must be explicitly deleted FXFileSelector::~FXFileSelector(){ FXAccelTable *table=getShell()->getAccelTable(); if(table){ table->removeAccel(MKUINT(KEY_BackSpace,0)); table->removeAccel(MKUINT(KEY_Delete,0)); table->removeAccel(MKUINT(KEY_h,CONTROLMASK)); table->removeAccel(MKUINT(KEY_w,CONTROLMASK)); table->removeAccel(MKUINT(KEY_n,CONTROLMASK)); table->removeAccel(MKUINT(KEY_a,CONTROLMASK)); table->removeAccel(MKUINT(KEY_b,CONTROLMASK)); table->removeAccel(MKUINT(KEY_s,CONTROLMASK)); table->removeAccel(MKUINT(KEY_l,CONTROLMASK)); } delete bookmarkmenu; delete updiricon; delete listicon; delete detailicon; delete iconsicon; delete homeicon; delete workicon; delete shownicon; delete hiddenicon; delete markicon; delete clearicon; delete newicon; delete deleteicon; delete moveicon; delete copyicon; delete linkicon; filebox=(FXFileList*)-1L; filename=(FXTextField*)-1L; filefilter=(FXComboBox*)-1L; bookmarkmenu=(FXMenuPane*)-1L; readonly=(FXCheckButton*)-1L; dirbox=(FXDirBox*)-1L; accept=(FXButton*)-1L; cancel=(FXButton*)-1L; updiricon=(FXIcon*)-1L; listicon=(FXIcon*)-1L; detailicon=(FXIcon*)-1L; iconsicon=(FXIcon*)-1L; homeicon=(FXIcon*)-1L; workicon=(FXIcon*)-1L; shownicon=(FXIcon*)-1L; hiddenicon=(FXIcon*)-1L; markicon=(FXIcon*)-1L; clearicon=(FXIcon*)-1L; newicon=(FXIcon*)-1L; deleteicon=(FXIcon*)-1L; moveicon=(FXIcon*)-1L; copyicon=(FXIcon*)-1L; linkicon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXFileStream.cpp000066400000000000000000000122151326741342000164220ustar00rootroot00000000000000/******************************************************************************** * * * F i l e S t r e a m C l a s s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFileStream.cpp,v 1.26 2006/01/22 17:58:26 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXString.h" #include "FXStream.h" #include "FXObject.h" #include "FXFile.h" #include "FXFileStream.h" /* Notes: - Future verions will use native system calls under WIN32. */ using namespace FX; /*******************************************************************************/ namespace FX { // Initialize file stream FXFileStream::FXFileStream(const FXObject* cont):FXStream(cont){ } // Write at least count bytes from the buffer FXuval FXFileStream::writeBuffer(FXuval){ register FXival m,n; if(dir!=FXStreamSave){fxerror("FXFileStream::writeBuffer: wrong stream direction.\n");} FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); m=wrptr-rdptr; n=file.writeBlock(rdptr,m); if(0getHeader(); register FXIcon *icon=(state&OPENED)?openIcon:closedIcon; register FXFont *font=list->getFont(); register FXint th=0,tw=0,ih=0,iw=0,yt,xb,beg,end,hi,drw,space,used,dw,xx; if(header->getNumItems()==0) return; xx=x+SIDE_SPACING/2; if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); dc.setClipRectangle(header->getItemOffset(0),y,header->getItemSize(0),h); dc.drawIcon(icon,xx,y+(h-ih)/2); dc.clearClipRectangle(); xx+=ICON_SPACING+iw; } if(!label.empty()){ th=font->getFontHeight(); dw=font->getTextWidth("...",3); xb=header->getItemOffset(0)+header->getItemSize(0); if(xb>xx) xb=xx; yt=y+(h-th-4)/2; if(isSelected()){ dc.setForeground(list->getSelBackColor()); dc.fillRectangle(xb,y,header->getTotalSize()-xb,h); } if(hasFocus()){ dc.drawFocusRectangle(xb+1,y+1,header->getTotalSize()-xb-2,h-2); } if(!isEnabled()) dc.setForeground(makeShadowColor(list->getBackColor())); else if(isSelected()) dc.setForeground(list->getSelTextColor()); else dc.setForeground(list->getTextColor()); used=xx-header->getItemOffset(0); for(hi=beg=0; beggetNumItems(); hi++,beg=end+1){ space=header->getItemSize(hi)-used; for(end=beg; endbeg){ drw=end-beg; tw=font->getTextWidth(&label[beg],drw); if(tw>space-4){ while((tw=font->getTextWidth(&label[beg],drw))+dw>space-4 && drw>1) drw=label.dec(drw); dc.setClipRectangle(xx,y,space,h); dc.drawText(xx+2,yt+font->getFontAscent()+2,&label[beg],drw); dc.drawText(xx+tw+2,yt+font->getFontAscent()+2,"...",3); dc.clearClipRectangle(); } else{ dc.drawText(xx+2,yt+font->getFontAscent()+2,&label[beg],drw); } } xx+=space; used=0; } } } // See if item got hit, and where:- 1 is icon, 2 is text FXint FXFoldingItem::hitItem(const FXFoldingList* list,FXint x,FXint y) const { register FXint oiw=0,ciw=0,oih=0,cih=0,tw=0,th=0,iw,ih,ix,iy,tx,ty,h; register FXFont *font=list->getFont(); if(openIcon){ oiw=openIcon->getWidth(); oih=openIcon->getHeight(); } if(closedIcon){ ciw=closedIcon->getWidth(); cih=closedIcon->getHeight(); } if(!label.empty()){ if(!list->getHeader()->getNumItems()) tw=4+font->getTextWidth(label.text(),label.length()); else tw=4+list->getHeader()->getDefaultWidth(); th=4+font->getFontHeight(); } iw=FXMAX(oiw,ciw); ih=FXMAX(oih,cih); h=FXMAX(th,ih); ix=SIDE_SPACING/2; tx=SIDE_SPACING/2; if(iw) tx+=iw+ICON_SPACING; iy=(h-ih)/2; ty=(h-th)/2; // In icon? if(ix<=x && iy<=y && xcreate(); if(closedIcon) closedIcon->create(); } // Destroy icon void FXFoldingItem::destroy(){ if((state&OPENICONOWNED) && openIcon) openIcon->destroy(); if((state&CLOSEDICONOWNED) && closedIcon) closedIcon->destroy(); } // Detach from icon resource void FXFoldingItem::detach(){ if(openIcon) openIcon->detach(); if(closedIcon) closedIcon->detach(); } // Get number of child items FXint FXFoldingItem::getNumChildren() const { register FXFoldingItem *item=first; register FXint n=0; while(item){item=item->next;n++;} return n; } // Get item (logically) below this one FXFoldingItem* FXFoldingItem::getBelow() const { register FXFoldingItem* item=(FXFoldingItem*)this; if(first) return first; while(!item->next && item->parent) item=item->parent; return item->next; } // Get item (logically) above this one FXFoldingItem* FXFoldingItem::getAbove() const { register FXFoldingItem* item=prev; if(!item) return parent; while(item->last) item=item->last; return item; } // Return true if child of parent item FXbool FXFoldingItem::isChildOf(const FXFoldingItem* item) const { register const FXFoldingItem* child=this; while(child){ child=child->parent; if(child==item) return TRUE; } return FALSE; } // Return true if parent of child item FXbool FXFoldingItem::isParentOf(const FXFoldingItem* item) const { register const FXFoldingItem* child=item; while(child){ child=child->parent; if(child==this) return TRUE; } return FALSE; } // Get item width FXint FXFoldingItem::getWidth(const FXFoldingList*) const { return SIDE_SPACING; } // Get item height FXint FXFoldingItem::getHeight(const FXFoldingList* list) const { register FXint th=0,oih=0,cih=0; if(openIcon) oih=openIcon->getHeight(); if(closedIcon) cih=closedIcon->getHeight(); if(!label.empty()) th=4+list->getFont()->getFontHeight(); return FXMAX3(th,oih,cih); } // Save data void FXFoldingItem::save(FXStream& store) const { FXObject::save(store); store << prev; store << next; store << parent; store << first; store << last; store << label; store << openIcon; store << closedIcon; store << state; } // Load data void FXFoldingItem::load(FXStream& store){ FXObject::load(store); store >> prev; store >> next; store >> parent; store >> first; store >> last; store >> label; store >> openIcon; store >> closedIcon; store >> state; } // Delete icons if owned FXFoldingItem::~FXFoldingItem(){ if(state&OPENICONOWNED) delete openIcon; if(state&CLOSEDICONOWNED) delete closedIcon; parent=(FXFoldingItem*)-1L; prev=(FXFoldingItem*)-1L; next=(FXFoldingItem*)-1L; first=(FXFoldingItem*)-1L; last=(FXFoldingItem*)-1L; openIcon=(FXIcon*)-1L; closedIcon=(FXIcon*)-1L; } /*******************************************************************************/ // Map FXDEFMAP(FXFoldingList) FXFoldingListMap[]={ FXMAPFUNC(SEL_PAINT,0,FXFoldingList::onPaint), FXMAPFUNC(SEL_MOTION,0,FXFoldingList::onMotion), FXMAPFUNC(SEL_TIMEOUT,FXWindow::ID_AUTOSCROLL,FXFoldingList::onAutoScroll), FXMAPFUNC(SEL_TIMEOUT,FXFoldingList::ID_TIPTIMER,FXFoldingList::onTipTimer), FXMAPFUNC(SEL_TIMEOUT,FXFoldingList::ID_LOOKUPTIMER,FXFoldingList::onLookupTimer), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXFoldingList::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXFoldingList::onLeftBtnRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXFoldingList::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXFoldingList::onRightBtnRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXFoldingList::onUngrabbed), FXMAPFUNC(SEL_KEYPRESS,0,FXFoldingList::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXFoldingList::onKeyRelease), FXMAPFUNC(SEL_ENTER,0,FXFoldingList::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXFoldingList::onLeave), FXMAPFUNC(SEL_FOCUSIN,0,FXFoldingList::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXFoldingList::onFocusOut), FXMAPFUNC(SEL_QUERY_TIP,0,FXFoldingList::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXFoldingList::onQueryHelp), FXMAPFUNC(SEL_CLICKED,0,FXFoldingList::onClicked), FXMAPFUNC(SEL_DOUBLECLICKED,0,FXFoldingList::onDoubleClicked), FXMAPFUNC(SEL_TRIPLECLICKED,0,FXFoldingList::onTripleClicked), FXMAPFUNC(SEL_COMMAND,0,FXFoldingList::onCommand), FXMAPFUNC(SEL_CHANGED,FXFoldingList::ID_HEADER_CHANGE,FXFoldingList::onHeaderChanged), }; // Object implementation FXIMPLEMENT(FXFoldingList,FXScrollArea,FXFoldingListMap,ARRAYNUMBER(FXFoldingListMap)) /*******************************************************************************/ // Tree List FXFoldingList::FXFoldingList(){ flags|=FLAG_ENABLED; header=(FXHeader*)-1L; firstitem=NULL; lastitem=NULL; anchoritem=NULL; currentitem=NULL; extentitem=NULL; cursoritem=NULL; viewableitem=NULL; font=(FXFont*)-1L; sortfunc=NULL; textColor=0; selbackColor=0; seltextColor=0; lineColor=0; treeWidth=0; treeHeight=0; visible=0; indent=DEFAULT_INDENT; grabx=0; graby=0; state=FALSE; } // Tree List FXFoldingList::FXFoldingList(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXScrollArea(p,opts,x,y,w,h){ flags|=FLAG_ENABLED; header=new FXHeader(this,this,FXFoldingList::ID_HEADER_CHANGE,HEADER_TRACKING|HEADER_BUTTON|HEADER_RESIZE|FRAME_RAISED|FRAME_THICK); target=tgt; message=sel; firstitem=NULL; lastitem=NULL; anchoritem=NULL; currentitem=NULL; extentitem=NULL; cursoritem=NULL; viewableitem=NULL; font=getApp()->getNormalFont(); sortfunc=NULL; textColor=getApp()->getForeColor(); selbackColor=getApp()->getSelbackColor(); seltextColor=getApp()->getSelforeColor(); lineColor=getApp()->getShadowColor(); treeWidth=0; treeHeight=0; visible=0; indent=DEFAULT_INDENT; grabx=0; graby=0; state=FALSE; } // Create window void FXFoldingList::create(){ register FXFoldingItem *item=firstitem; FXScrollArea::create(); while(item){ item->create(); if(item->first){item=item->first;continue;} while(!item->next && item->parent){item=item->parent;} item=item->next; } font->create(); } // Detach window void FXFoldingList::detach(){ register FXFoldingItem *item=firstitem; FXScrollArea::detach(); while(item){ item->detach(); if(item->first){item=item->first;continue;} while(!item->next && item->parent){item=item->parent;} item=item->next; } font->detach(); } // Can have focus bool FXFoldingList::canFocus() const { return true; } // Into focus chain void FXFoldingList::setFocus(){ FXScrollArea::setFocus(); setDefault(TRUE); } // Out of focus chain void FXFoldingList::killFocus(){ FXScrollArea::killFocus(); setDefault(MAYBE); } // Get default width FXint FXFoldingList::getDefaultWidth(){ return FXScrollArea::getDefaultWidth(); } // Get default height FXint FXFoldingList::getDefaultHeight(){ if(visible) return visible*(4+font->getFontHeight())+header->getDefaultHeight(); return FXScrollArea::getDefaultHeight(); } // Propagate size change void FXFoldingList::recalc(){ FXScrollArea::recalc(); flags|=FLAG_RECALC; cursoritem=NULL; } // Move content void FXFoldingList::moveContents(FXint x,FXint y){ FXint dx=x-pos_x; FXint dy=y-pos_y; pos_x=x; pos_y=y; header->setPosition(x); scroll(0,header->getHeight(),viewport_w,viewport_h,dx,dy); } // List is multiple of nitems void FXFoldingList::setNumVisible(FXint nvis){ if(nvis<0) nvis=0; if(visible!=nvis){ visible=nvis; recalc(); } } // Get number of toplevel items FXint FXFoldingList::getNumItems() const { register FXFoldingItem *item=firstitem; register FXint n=0; while(item){ item=item->next; n++; } return n; } // Recompute interior void FXFoldingList::recompute(){ register FXFoldingItem* item; register FXint x,y,h; x=y=0; treeWidth=0; treeHeight=0; item=firstitem; if(options&FOLDINGLIST_ROOT_BOXES) x+=(4+indent); while(item){ item->x=x; item->y=y; h=item->getHeight(this); y+=h; if(item->first && ((options&FOLDINGLIST_AUTOSELECT) || item->isExpanded())){ x+=(indent+h/2); item=item->first; continue; } while(!item->next && item->parent){ item=item->parent; x-=(indent+item->getHeight(this)/2); } item=item->next; } treeWidth=header->getDefaultWidth(); treeHeight=header->getDefaultHeight()+y; flags&=~FLAG_RECALC; } // Determine content width of tree list FXint FXFoldingList::getContentWidth(){ if(flags&FLAG_RECALC) recompute(); return treeWidth; } // Determine content height of tree list FXint FXFoldingList::getContentHeight(){ if(flags&FLAG_RECALC) recompute(); return treeHeight; } // Recalculate layout void FXFoldingList::layout(){ // Calculate contents FXScrollArea::layout(); // Place header control header->position(0,0,viewport_w,header->getDefaultHeight()); // Set line size based on item size if(firstitem){ vertical->setLine(firstitem->getHeight(this)); horizontal->setLine(firstitem->getWidth(this)/10); } // We were supposed to make this item viewable if(viewableitem){ makeItemVisible(viewableitem); } // Force repaint update(); // No more dirty flags&=~FLAG_DIRTY; } // Header changed but content size didn't long FXFoldingList::onHeaderChanged(FXObject*,FXSelector,void*){ // flags&=~FLAG_RECALC; return 1; } // Set headers from array of strings void FXFoldingList::setHeaders(const FXchar** strings,FXint size){ header->clearItems(); header->fillItems(strings,NULL,size); } // Set headers from newline separated strings void FXFoldingList::setHeaders(const FXString& strings,FXint size){ header->clearItems(); header->fillItems(strings,NULL,size); } // Append header caption void FXFoldingList::appendHeader(const FXString& text,FXIcon *icon,FXint size){ header->appendItem(text,icon,size); } // Remove header caption void FXFoldingList::removeHeader(FXint index){ if(index<0 || header->getNumItems()<=index){ fxerror("%s::removeHeader: index out of range.\n",getClassName()); } header->removeItem(index); } // Change header caption void FXFoldingList::setHeaderText(FXint index,const FXString& text){ if(index<0 || header->getNumItems()<=index){ fxerror("%s::setHeaderText: index out of range.\n",getClassName()); } header->setItemText(index,text); } // Get header caption FXString FXFoldingList::getHeaderText(FXint index) const { if(index<0 || header->getNumItems()<=index){ fxerror("%s::getHeaderText: index out of range.\n",getClassName()); } return header->getItemText(index); } // Change header icon void FXFoldingList::setHeaderIcon(FXint index,FXIcon *icon){ if(index<0 || header->getNumItems()<=index){ fxerror("%s::setHeaderIcon: index out of range.\n",getClassName()); } header->setItemIcon(index,icon); } // Get header icon FXIcon* FXFoldingList::getHeaderIcon(FXint index) const { if(index<0 || header->getNumItems()<=index){ fxerror("%s::getHeaderIcon: index out of range.\n",getClassName()); } return header->getItemIcon(index); } // Change header size void FXFoldingList::setHeaderSize(FXint index,FXint size){ if(index<0 || header->getNumItems()<=index){ fxerror("%s::setHeaderSize: index out of range.\n",getClassName()); } header->setItemSize(index,size); } // Get header size FXint FXFoldingList::getHeaderSize(FXint index) const { if(index<0 || header->getNumItems()<=index){ fxerror("%s::getHeaderSize: index out of range.\n",getClassName()); } return header->getItemSize(index); } // Return number of headers FXint FXFoldingList::getNumHeaders() const { return header->getNumItems(); } // Set item text void FXFoldingList::setItemText(FXFoldingItem* item,const FXString& text){ if(item==NULL){ fxerror("%s::setItemText: item is NULL.\n",getClassName()); } if(item->getText()!=text){ item->setText(text); recalc(); } } // Get item text FXString FXFoldingList::getItemText(const FXFoldingItem* item) const { if(item==NULL){ fxerror("%s::getItemText: item is NULL.\n",getClassName()); } return item->getText(); } // Set item open icon void FXFoldingList::setItemOpenIcon(FXFoldingItem* item,FXIcon* icon,FXbool owned){ if(item==NULL){ fxerror("%s::setItemOpenIcon: item is NULL.\n",getClassName()); } if(item->getOpenIcon()!=icon) recalc(); item->setOpenIcon(icon,owned); } // Get item open icon FXIcon* FXFoldingList::getItemOpenIcon(const FXFoldingItem* item) const { if(item==NULL){ fxerror("%s::getItemOpenIcon: item is NULL.\n",getClassName()); } return item->getOpenIcon(); } // Set item closed icon void FXFoldingList::setItemClosedIcon(FXFoldingItem* item,FXIcon* icon,FXbool owned){ if(item==NULL){ fxerror("%s::setItemClosedIcon: item is NULL.\n",getClassName()); } if(item->getClosedIcon()!=icon) recalc(); item->setClosedIcon(icon,owned); } // Get item closed icon FXIcon* FXFoldingList::getItemClosedIcon(const FXFoldingItem* item) const { if(item==NULL){ fxerror("%s::getItemClosedIcon: item is NULL.\n",getClassName()); } return item->getClosedIcon(); } // Set item data void FXFoldingList::setItemData(FXFoldingItem* item,void* ptr) const { if(item==NULL){ fxerror("%s::setItemData: item is NULL.\n",getClassName()); } item->setData(ptr); } // Get item data void* FXFoldingList::getItemData(const FXFoldingItem* item) const { if(item==NULL){ fxerror("%s::getItemData: item is NULL.\n",getClassName()); } return item->getData(); } // True if item is selected FXbool FXFoldingList::isItemSelected(const FXFoldingItem* item) const { if(!item){ fxerror("%s::isItemSelected: item is NULL.\n",getClassName()); } return item->isSelected(); } // True if item is current FXbool FXFoldingList::isItemCurrent(const FXFoldingItem* item) const { if(!item){ fxerror("%s::isItemCurrent: item is NULL.\n",getClassName()); } return currentitem==item; } // Check if item is expanded FXbool FXFoldingList::isItemExpanded(const FXFoldingItem* item) const { if(!item){ fxerror("%s::isItemExpanded: item is NULL.\n",getClassName()); } return (options&FOLDINGLIST_AUTOSELECT) || item->isExpanded(); } // Is item a leaf item FXbool FXFoldingList::isItemLeaf(const FXFoldingItem* item) const { if(!item){ fxerror("%s::isItemLeaf: item is NULL.\n",getClassName()); } return item->first==NULL; } // Check if item is enabled FXbool FXFoldingList::isItemEnabled(const FXFoldingItem* item) const { if(!item){ fxerror("%s::isItemEnabled: item is NULL.\n",getClassName()); } return item->isEnabled(); } // Check item is open FXbool FXFoldingList::isItemOpened(const FXFoldingItem* item) const { if(!item){ fxerror("%s::isItemOpen: item is NULL.\n",getClassName()); } return item->isOpened(); } // True if item (partially) visible FXbool FXFoldingList::isItemVisible(const FXFoldingItem* item) const { if(!item){ fxerror("%s::isItemVisible: item is NULL.\n",getClassName()); } return 0getHeight()+item->y+item->getHeight(this) && pos_y+header->getHeight()+item->ygetHeight(); register FXFoldingItem *par; register FXint y,h; if(item){ // Remember for later viewableitem=item; // Expand parents of this node if(!(options&FOLDINGLIST_AUTOSELECT)){ for(par=item->parent; par; par=par->parent){ expandTree(par); } } // Now we adjust the scrolled position to fit everything if(xid){ // Force layout if dirty if(flags&FLAG_RECALC) layout(); y=pos_y; h=item->getHeight(this); if(viewport_h<=y+item->y+h+hh) y=viewport_h-item->y-h-hh; if(y+item->y<=0) y=-item->y; // Scroll into view setPosition(pos_x,y); // Done it viewableitem=NULL; } } } // Get item at position x,y FXFoldingItem* FXFoldingList::getItemAt(FXint,FXint y) const { register FXint hh=header->getHeight(); register FXFoldingItem* item=firstitem; register FXint ix,iy,ih; ix=pos_x; iy=pos_y+hh; if(options&FOLDINGLIST_ROOT_BOXES) ix+=(4+indent); while(item && iy<=y){ ih=item->getHeight(this); if(yfirst && ((options&FOLDINGLIST_AUTOSELECT) || item->isExpanded())){ ix+=(indent+ih/2); item=item->first; continue; } while(!item->next && item->parent){ item=item->parent; ix-=(indent+item->getHeight(this)/2); } item=item->next; } return NULL; } // Did we hit the item, and which part of it did we hit (0=outside, 1=icon, 2=text, 3=box) FXint FXFoldingList::hitItem(const FXFoldingItem* item,FXint x,FXint y) const { register FXint hh=header->getHeight(); register FXint ix,iy,ih,xh,yh,hit=0; if(item){ x-=pos_x; y-=pos_y; ix=item->x; iy=item->y+hh; ih=item->getHeight(this); if(iy<=y && yhasItems() || item->getFirst())){ xh=ix-indent+(SIDE_SPACING/2); yh=iy+ih/2; if(xh-HALFBOX_SIZE-BOX_FUDGE<=x && x<=xh+HALFBOX_SIZE+BOX_FUDGE && yh-HALFBOX_SIZE-BOX_FUDGE<=y && y<=yh+HALFBOX_SIZE+BOX_FUDGE) return 3; } hit=item->hitItem(this,x-ix,y-iy); } } return hit; } // Repaint void FXFoldingList::updateItem(FXFoldingItem* item){ if(item) update(0,pos_y+item->y+header->getHeight(),width,item->getHeight(this)); } // Enable one item FXbool FXFoldingList::enableItem(FXFoldingItem* item){ if(!item){ fxerror("%s::enableItem: item is NULL.\n",getClassName()); } if(!item->isEnabled()){ item->setEnabled(TRUE); updateItem(item); return TRUE; } return FALSE; } // Disable one item FXbool FXFoldingList::disableItem(FXFoldingItem* item){ if(!item){ fxerror("%s::disableItem: item is NULL.\n",getClassName()); } if(item->isEnabled()){ item->setEnabled(FALSE); updateItem(item); return TRUE; } return FALSE; } // Select one item FXbool FXFoldingList::selectItem(FXFoldingItem* item,FXbool notify){ if(!item){ fxerror("%s::selectItem: NULL argument.\n",getClassName()); } if(!item->isSelected()){ switch(options&SELECT_MASK){ case FOLDINGLIST_SINGLESELECT: case FOLDINGLIST_BROWSESELECT: killSelection(notify); case FOLDINGLIST_EXTENDEDSELECT: case FOLDINGLIST_MULTIPLESELECT: item->setSelected(TRUE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)item);} break; } return TRUE; } return FALSE; } // Deselect one item FXbool FXFoldingList::deselectItem(FXFoldingItem* item,FXbool notify){ if(!item){ fxerror("%s::deselectItem: item is NULL.\n",getClassName()); } if(item->isSelected()){ switch(options&SELECT_MASK){ case FOLDINGLIST_EXTENDEDSELECT: case FOLDINGLIST_MULTIPLESELECT: case FOLDINGLIST_SINGLESELECT: item->setSelected(FALSE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)item);} break; } return TRUE; } return FALSE; } // toggle one item FXbool FXFoldingList::toggleItem(FXFoldingItem* item,FXbool notify){ if(!item){ fxerror("%s::toggleItem: item is NULL.\n",getClassName()); } switch(options&SELECT_MASK){ case FOLDINGLIST_BROWSESELECT: if(!item->isSelected()){ killSelection(notify); item->setSelected(TRUE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)item);} } break; case FOLDINGLIST_SINGLESELECT: if(!item->isSelected()){ killSelection(notify); item->setSelected(TRUE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)item);} } else{ item->setSelected(FALSE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)item);} } break; case FOLDINGLIST_EXTENDEDSELECT: case FOLDINGLIST_MULTIPLESELECT: if(!item->isSelected()){ item->setSelected(TRUE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)item);} } else{ item->setSelected(FALSE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)item);} } break; } return TRUE; } // Extend selection FXbool FXFoldingList::extendSelection(FXFoldingItem* item,FXbool notify){ register FXFoldingItem *it,*i1,*i2,*i3; register FXbool changes=FALSE; if(item && anchoritem && extentitem){ it=firstitem; i1=i2=i3=NULL; // Find segments while(it){ if(it==item){i1=i2;i2=i3;i3=it;} if(it==anchoritem){i1=i2;i2=i3;i3=it;} if(it==extentitem){i1=i2;i2=i3;i3=it;} it=it->getBelow(); } FXASSERT(i1 && i2 && i3); // First segment it=i1; while(it!=i2){ // item = extent - anchor // item = anchor - extent if(i1==item){ if(!it->isSelected()){ it->setSelected(TRUE); updateItem(it); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)it);} } } // extent = anchor - item // extent = item - anchor else if(i1==extentitem){ if(it->isSelected()){ it->setSelected(FALSE); updateItem(it); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)it);} } } it=it->getBelow(); } // Second segment it=i2; while(it!=i3){ it=it->getBelow(); // extent - anchor = item // anchor - extent = item if(i3==item){ if(!it->isSelected()){ it->setSelected(TRUE); updateItem(it); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)it);} } } // item - anchor = extent // anchor - item = extent else if(i3==extentitem){ if(it->isSelected()){ it->setSelected(FALSE); updateItem(it); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)it);} } } } extentitem=item; } return changes; } // Kill selection FXbool FXFoldingList::killSelection(FXbool notify){ register FXFoldingItem *item=firstitem; register FXbool changes=FALSE; while(item){ if(item->isSelected()){ item->setSelected(FALSE); updateItem(item); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)item);} } item=item->getBelow(); } return changes; } // Open item FXbool FXFoldingList::openItem(FXFoldingItem* item,FXbool notify){ if(item==NULL){ fxerror("%s::openItem: item is NULL.\n",getClassName()); } if(!item->isOpened()){ item->setOpened(TRUE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_OPENED,message),(void*)item);} return TRUE; } return FALSE; } // Close item FXbool FXFoldingList::closeItem(FXFoldingItem* item,FXbool notify){ if(item==NULL){ fxerror("%s::closeItem: item is NULL.\n",getClassName()); } if(item->isOpened()){ item->setOpened(FALSE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_CLOSED,message),(void*)item);} return TRUE; } return FALSE; } // Collapse all subtrees under item FXbool FXFoldingList::collapseTree(FXFoldingItem* tree,FXbool notify){ if(tree==NULL){ fxerror("%s::collapseTree: tree is NULL.\n",getClassName()); } if(tree->isExpanded()){ tree->setExpanded(FALSE); if(!(options&FOLDINGLIST_AUTOSELECT)){ // In autoselect, already shown as expanded! if(tree->first){ recalc(); } else{ updateItem(tree); } } if(notify && target){target->tryHandle(this,FXSEL(SEL_COLLAPSED,message),(void*)tree);} return TRUE; } return FALSE; } // Expand subtree under item FXbool FXFoldingList::expandTree(FXFoldingItem* tree,FXbool notify){ if(tree==NULL){ fxerror("%s::expandTree: tree is NULL.\n",getClassName()); } if(!tree->isExpanded()){ tree->setExpanded(TRUE); if(!(options&FOLDINGLIST_AUTOSELECT)){ // In autoselect, already shown as expanded! if(tree->first){ recalc(); } else{ updateItem(tree); } } if(notify && target){target->tryHandle(this,FXSEL(SEL_EXPANDED,message),(void*)tree);} return TRUE; } return FALSE; } // Start motion timer while in this window long FXFoldingList::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onEnter(sender,sel,ptr); getApp()->addTimeout(this,ID_TIPTIMER,getApp()->getMenuPause()); cursoritem=NULL; return 1; } // Stop motion timer when leaving window long FXFoldingList::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onLeave(sender,sel,ptr); getApp()->removeTimeout(this,ID_TIPTIMER); cursoritem=NULL; return 1; } // We timed out, i.e. the user didn't move for a while long FXFoldingList::onTipTimer(FXObject*,FXSelector,void*){ FXTRACE((200,"%s::onTipTimer %p\n",getClassName(),this)); flags|=FLAG_TIP; return 1; } // We were asked about tip text long FXFoldingList::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !(options&FOLDINGLIST_AUTOSELECT)){ // No tip when autoselect! FXint x,y; FXuint buttons; getCursorPosition(x,y,buttons); FXFoldingItem *item=getItemAt(x,y); if(item){ FXString string=item->getText().section('\t',0); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&string); return 1; } } return 0; } // We were asked about status text long FXFoldingList::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Gained focus long FXFoldingList::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onFocusIn(sender,sel,ptr); if(currentitem){ currentitem->setFocus(TRUE); updateItem(currentitem); } return 1; } // Lost focus long FXFoldingList::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onFocusOut(sender,sel,ptr); if(currentitem){ currentitem->setFocus(FALSE); updateItem(currentitem); } return 1; } // Draw item list long FXFoldingList::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXFoldingItem* item=firstitem; FXFoldingItem* p; FXint yh,xh,x,y,w,h,xp,hh; FXDCWindow dc(this,event); dc.setFont(font); if(header->getNumItems()==0){ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); return 1; } x=pos_x; y=pos_y+header->getHeight(); if(options&FOLDINGLIST_ROOT_BOXES) x+=(4+indent); while(item && yrect.y+event->rect.h){ w=item->getWidth(this); h=item->getHeight(this); if(event->rect.y<=y+h){ // Draw item dc.setForeground(backColor); dc.fillRectangle(0,y,width,h); item->draw(this,dc,x,y,w,h); // Show other paraphernalia such as dotted lines and expand-boxes if((options&(FOLDINGLIST_SHOWS_LINES|FOLDINGLIST_SHOWS_BOXES)) && (item->parent || (options&FOLDINGLIST_ROOT_BOXES))){ dc.setClipRectangle(header->getX(),y,header->getItemSize(0),h); hh=h/2; yh=y+hh; xh=x-indent+(SIDE_SPACING/2); dc.setForeground(lineColor); dc.setStipple(STIPPLE_GRAY,pos_x&1,pos_y&1); if(options&FOLDINGLIST_SHOWS_LINES){ // Connect items with lines p=item->parent; xp=xh; dc.setFillStyle(FILL_STIPPLED); while(p){ xp-=(indent+p->getHeight(this)/2); if(p->next) dc.fillRectangle(xp,y,1,h); p=p->parent; } if((options&FOLDINGLIST_SHOWS_BOXES) && (item->hasItems() || item->getFirst())){ if(item->prev || item->parent) dc.fillRectangle(xh,y,1,yh-y-HALFBOX_SIZE); if(item->next) dc.fillRectangle(xh,yh+HALFBOX_SIZE,1,y+h-yh-HALFBOX_SIZE); } else{ if(item->prev || item->parent) dc.fillRectangle(xh,y,1,hh); if( item->next) dc.fillRectangle(xh,yh,1,h); dc.fillRectangle(xh,yh,x+(SIDE_SPACING/2)-2-xh,1); } dc.setFillStyle(FILL_SOLID); } // Boxes before items for expand/collapse of item if((options&FOLDINGLIST_SHOWS_BOXES) && (item->hasItems() || item->getFirst())){ dc.setFillStyle(FILL_STIPPLED); dc.fillRectangle(xh+4,yh,(SIDE_SPACING/2)-2,1); dc.setFillStyle(FILL_SOLID); dc.drawRectangle(xh-HALFBOX_SIZE,yh-HALFBOX_SIZE,HALFBOX_SIZE+HALFBOX_SIZE,HALFBOX_SIZE+HALFBOX_SIZE); dc.setForeground(textColor); dc.fillRectangle(xh-HALFBOX_SIZE+2,yh,HALFBOX_SIZE+HALFBOX_SIZE-3,1); if(!(options&FOLDINGLIST_AUTOSELECT) && !item->isExpanded()){ dc.fillRectangle(xh,yh-HALFBOX_SIZE+2,1,HALFBOX_SIZE+HALFBOX_SIZE-3); } } dc.clearClipRectangle(); } } y+=h; // Move on to the next item if(item->first && ((options&FOLDINGLIST_AUTOSELECT) || item->isExpanded())){ x+=(indent+h/2); item=item->first; continue; } while(!item->next && item->parent){ item=item->parent; x-=(indent+item->getHeight(this)/2); } item=item->next; } if(yrect.y+event->rect.h){ dc.setForeground(backColor); dc.fillRectangle(event->rect.x,y,event->rect.w,event->rect.y+event->rect.h-y); } return 1; } // Zero out lookup string long FXFoldingList::onLookupTimer(FXObject*,FXSelector,void*){ lookup=FXString::null; return 1; } // Key Press long FXFoldingList::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXFoldingItem *item=currentitem; FXFoldingItem *succ; FXint page; flags&=~FLAG_TIP; if(!isEnabled()) return 0; if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(item==NULL) item=firstitem; switch(event->code){ case KEY_Control_L: case KEY_Control_R: case KEY_Shift_L: case KEY_Shift_R: case KEY_Alt_L: case KEY_Alt_R: if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; case KEY_Page_Up: case KEY_KP_Page_Up: for(succ=item,page=verticalScrollBar()->getPage(); succ && 0getHeight(this); if(succ->prev){ succ=succ->prev; while(succ->last && ((options&FOLDINGLIST_AUTOSELECT) || succ->isExpanded())) succ=succ->last; } else if(succ->parent){ succ=succ->parent; } } goto hop; case KEY_Page_Down: case KEY_KP_Page_Down: for(succ=item,page=verticalScrollBar()->getPage(); succ && 0getHeight(this); if(succ->first && ((options&FOLDINGLIST_AUTOSELECT) || succ->isExpanded())){ succ=succ->first; } else{ while(!succ->next && succ->parent) succ=succ->parent; succ=succ->next; } } goto hop; case KEY_Up: // Move up case KEY_KP_Up: if(item){ if(item->prev){ item=item->prev; while(item->first && ((options&FOLDINGLIST_AUTOSELECT) || item->isExpanded())) item=item->last; } else if(item->parent){ item=item->parent; } } goto hop; case KEY_Down: // Move down case KEY_KP_Down: if(item){ if(item->first && ((options&FOLDINGLIST_AUTOSELECT) || item->isExpanded())){ item=item->first; } else{ while(!item->next && item->parent) item=item->parent; item=item->next; } } goto hop; case KEY_Right: // Move right/down and open subtree case KEY_KP_Right: if(item){ if(!(options&FOLDINGLIST_AUTOSELECT) && !item->isExpanded() && (item->hasItems() || item->getFirst())){ expandTree(item,TRUE); } else if(item->first){ item=item->first; } else{ while(!item->next && item->parent) item=item->parent; item=item->next; } } goto hop; case KEY_Left: // Move left/up and close subtree case KEY_KP_Left: if(item){ if(!(options&FOLDINGLIST_AUTOSELECT) && item->isExpanded() && (item->hasItems() || item->getFirst())){ collapseTree(item,TRUE); } else if(item->parent){ item=item->parent; } else if(item->prev){ item=item->prev; } } goto hop; case KEY_Home: // Move to first case KEY_KP_Home: item=firstitem; goto hop; case KEY_End: // Move to last case KEY_KP_End: item=lastitem; while(item){ if(item->last && ((options&FOLDINGLIST_AUTOSELECT) || item->isExpanded())){ item=item->last; } else if(item->next){ item=item->next; } else{ break; } } hop: lookup=FXString::null; if(item){ setCurrentItem(item,TRUE); makeItemVisible(item); if((options&SELECT_MASK)==FOLDINGLIST_EXTENDEDSELECT){ if(item->isEnabled()){ if(event->state&SHIFTMASK){ if(anchoritem){ selectItem(anchoritem,TRUE); extendSelection(item,TRUE); } else{ selectItem(item,TRUE); setAnchorItem(item); } } else if(!(event->state&CONTROLMASK)){ killSelection(TRUE); selectItem(item,TRUE); setAnchorItem(item); } } } } handle(this,FXSEL(SEL_CLICKED,0),(void*)currentitem); if(currentitem && currentitem->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)currentitem); } return 1; case KEY_space: case KEY_KP_Space: lookup=FXString::null; if(item && item->isEnabled()){ switch(options&SELECT_MASK){ case FOLDINGLIST_EXTENDEDSELECT: if(event->state&SHIFTMASK){ if(anchoritem){ selectItem(anchoritem,TRUE); extendSelection(item,TRUE); } else{ selectItem(item,TRUE); } } else if(event->state&CONTROLMASK){ toggleItem(item,TRUE); } else{ killSelection(TRUE); selectItem(item,TRUE); } break; case FOLDINGLIST_MULTIPLESELECT: case FOLDINGLIST_SINGLESELECT: toggleItem(item,TRUE); break; } setAnchorItem(item); } handle(this,FXSEL(SEL_CLICKED,0),(void*)currentitem); if(currentitem && currentitem->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)currentitem); } return 1; case KEY_Return: case KEY_KP_Enter: lookup=FXString::null; handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)currentitem); if(currentitem && currentitem->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)currentitem); } return 1; default: if((FXuchar)event->text[0]<' ') return 0; if(event->state&(CONTROLMASK|ALTMASK)) return 0; if(!Ascii::isPrint(event->text[0])) return 0; lookup.append(event->text); getApp()->addTimeout(this,ID_LOOKUPTIMER,getApp()->getTypingSpeed()); item=findItem(lookup,currentitem,SEARCH_FORWARD|SEARCH_WRAP|SEARCH_PREFIX); if(item){ setCurrentItem(item,TRUE); makeItemVisible(item); if((options&SELECT_MASK)==FOLDINGLIST_EXTENDEDSELECT){ if(item->isEnabled()){ killSelection(TRUE); selectItem(item,TRUE); } } setAnchorItem(item); } handle(this,FXSEL(SEL_CLICKED,0),(void*)currentitem); if(currentitem && currentitem->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)currentitem); } return 1; } return 0; } // Key Release long FXFoldingList::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(!isEnabled()) return 0; if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Shift_L: case KEY_Shift_R: case KEY_Control_L: case KEY_Control_R: case KEY_Alt_L: case KEY_Alt_R: if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; } return 0; } // Scroll timer long FXFoldingList::onAutoScroll(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXFoldingItem *item; FXint xx,yy; // Scroll the content FXScrollArea::onAutoScroll(sender,sel,ptr); // Drag and drop mode if(flags&FLAG_DODRAG){ handle(this,FXSEL(SEL_DRAGGED,0),ptr); return 1; } // In autoselect mode, stop scrolling when mouse outside window if((flags&FLAG_PRESSED) || (options&FOLDINGLIST_AUTOSELECT)){ // Validated position xx=event->win_x; if(xx<0) xx=0; else if(xx>=viewport_w) xx=viewport_w-1; yy=event->win_y; if(yy<0) yy=0; else if(yy>=viewport_h) yy=viewport_h-1; // Find item item=getItemAt(xx,yy); // Got item and different from last time if(item && item!=currentitem){ // Make it the current item setCurrentItem(item,TRUE); // Extend the selection if((options&SELECT_MASK)==FOLDINGLIST_EXTENDEDSELECT){ state=FALSE; extendSelection(item,TRUE); } } return 1; } return 0; } // Mouse motion long FXFoldingList::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXFoldingItem *oldcursoritem=cursoritem; FXuint flg=flags; FXFoldingItem *item; // Kill the tip flags&=~FLAG_TIP; // Kill the tip timer getApp()->removeTimeout(this,ID_TIPTIMER); // Right mouse scrolling if(flags&FLAG_SCROLLING){ setPosition(event->win_x-grabx,event->win_y-graby); return 1; } // Drag and drop mode if(flags&FLAG_DODRAG){ if(startAutoScroll(event,TRUE)) return 1; handle(this,FXSEL(SEL_DRAGGED,0),ptr); return 1; } // Tentative drag and drop if((flags&FLAG_TRYDRAG) && event->moved){ flags&=~FLAG_TRYDRAG; if(handle(this,FXSEL(SEL_BEGINDRAG,0),ptr)){ flags|=FLAG_DODRAG; } return 1; } // Normal operation if((flags&FLAG_PRESSED) || (options&FOLDINGLIST_AUTOSELECT)){ // Start auto scrolling? if(startAutoScroll(event,FALSE)) return 1; // Find item item=getItemAt(event->win_x,event->win_y); // Got an item different from before if(item && item!=currentitem){ // Make it the current item setCurrentItem(item,TRUE); // Extend the selection if((options&SELECT_MASK)==FOLDINGLIST_EXTENDEDSELECT){ state=FALSE; extendSelection(item,TRUE); } } return 1; } // Reset tip timer if nothing's going on getApp()->addTimeout(this,ID_TIPTIMER,getApp()->getMenuPause()); // Get item we're over cursoritem=getItemAt(event->win_x,event->win_y); // Force GUI update only when needed return (cursoritem!=oldcursoritem)||(flg&FLAG_TIP); } // Pressed a button long FXFoldingList::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXFoldingItem *item; FXint code; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); flags&=~FLAG_UPDATE; // First chance callback if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; // Not autoselect mode if(options&FOLDINGLIST_AUTOSELECT) return 1; // Locate item item=getItemAt(event->win_x,event->win_y); // No item if(item==NULL){ if((options&SELECT_MASK)==FOLDINGLIST_EXTENDEDSELECT){ if(!(event->state&(SHIFTMASK|CONTROLMASK))){ killSelection(TRUE); } } return 1; } // Find out where hit code=hitItem(item,event->win_x,event->win_y); // Maybe clicked on box if(code==3){ if(isItemExpanded(item)) collapseTree(item,TRUE); else expandTree(item,TRUE); return 1; } // Change current item setCurrentItem(item,TRUE); // Change item selection state=item->isSelected(); switch(options&SELECT_MASK){ case FOLDINGLIST_EXTENDEDSELECT: if(event->state&SHIFTMASK){ if(anchoritem){ if(anchoritem->isEnabled()) selectItem(anchoritem,TRUE); extendSelection(item,TRUE); } else{ if(item->isEnabled()) selectItem(item,TRUE); setAnchorItem(item); } } else if(event->state&CONTROLMASK){ if(item->isEnabled() && !state) selectItem(item,TRUE); setAnchorItem(item); } else{ if(item->isEnabled() && !state){ killSelection(TRUE); selectItem(item,TRUE); } setAnchorItem(item); } break; case FOLDINGLIST_MULTIPLESELECT: case FOLDINGLIST_SINGLESELECT: if(item->isEnabled() && !state) selectItem(item,TRUE); break; } // Start drag if actually pressed text or icon only if(code && item->isSelected() && item->isDraggable()){ flags|=FLAG_TRYDRAG; } flags|=FLAG_PRESSED; return 1; } return 0; } // Released button long FXFoldingList::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXuint flg=flags; if(isEnabled()){ ungrab(); stopAutoScroll(); flags|=FLAG_UPDATE; flags&=~(FLAG_PRESSED|FLAG_TRYDRAG|FLAG_DODRAG); // First chance callback if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; // No activity if(!(flg&FLAG_PRESSED) && !(options&FOLDINGLIST_AUTOSELECT)) return 1; // Was dragging if(flg&FLAG_DODRAG){ handle(this,FXSEL(SEL_ENDDRAG,0),ptr); return 1; } // Select only enabled item switch(options&SELECT_MASK){ case FOLDINGLIST_EXTENDEDSELECT: if(currentitem && currentitem->isEnabled()){ if(event->state&CONTROLMASK){ if(state) deselectItem(currentitem,TRUE); } else if(!(event->state&SHIFTMASK)){ if(state){ killSelection(TRUE); selectItem(currentitem,TRUE); } } } break; case FOLDINGLIST_MULTIPLESELECT: case FOLDINGLIST_SINGLESELECT: if(currentitem && currentitem->isEnabled()){ if(state) deselectItem(currentitem,TRUE); } break; } // Scroll to make item visibke makeItemVisible(currentitem); // Update anchor setAnchorItem(currentitem); // Generate clicked callbacks if(event->click_count==1){ handle(this,FXSEL(SEL_CLICKED,0),(void*)currentitem); } else if(event->click_count==2){ handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)currentitem); } else if(event->click_count==3){ handle(this,FXSEL(SEL_TRIPLECLICKED,0),(void*)currentitem); } // Command callback only when clicked on item if(currentitem && currentitem->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)currentitem); } return 1; } return 0; } // Pressed right button long FXFoldingList::onRightBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); flags&=~FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; flags|=FLAG_SCROLLING; grabx=event->win_x-pos_x; graby=event->win_y-pos_y; return 1; } return 0; } // Released right button long FXFoldingList::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); flags&=~FLAG_SCROLLING; flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // The widget lost the grab for some reason long FXFoldingList::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onUngrabbed(sender,sel,ptr); flags&=~(FLAG_DODRAG|FLAG_TRYDRAG|FLAG_PRESSED|FLAG_CHANGED|FLAG_SCROLLING); flags|=FLAG_UPDATE; stopAutoScroll(); return 1; } // Command message long FXFoldingList::onCommand(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); } // Clicked in list long FXFoldingList::onClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_CLICKED,message),ptr); } // Double clicked in list; ptr may or may not point to an item long FXFoldingList::onDoubleClicked(FXObject*,FXSelector,void* ptr){ // Double click anywhere in the widget if(target && target->tryHandle(this,FXSEL(SEL_DOUBLECLICKED,message),ptr)) return 1; // Double click on an item if(ptr){ if(isItemExpanded((FXFoldingItem*)ptr)) collapseTree((FXFoldingItem*)ptr,TRUE); else expandTree((FXFoldingItem*)ptr,TRUE); } return 0; } // Triple clicked in list; ptr may or may not point to an item long FXFoldingList::onTripleClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_TRIPLECLICKED,message),ptr); } // Compare sectioned strings FXint FXFoldingList::compareSection(const FXchar *p,const FXchar* q,FXint s){ register FXint c1,c2,x; for(x=s; x && *p; x-=(*p++=='\t')); for(x=s; x && *q; x-=(*q++=='\t')); do{ c1=FXuchar(*p++); c2=FXuchar(*q++); } while('\t'getText().text(),b->getText().text(),0); } // Sort items in descending order FXint FXFoldingList::descending(const FXFoldingItem* a,const FXFoldingItem* b){ return compareSection(b->getText().text(),a->getText().text(),0); } // Sort ascending order, case insensitive FXint FXFoldingList::ascendingCase(const FXFoldingItem* a,const FXFoldingItem* b){ return compareSectionCase(a->getText().text(),b->getText().text(),0); } // Sort descending order, case insensitive FXint FXFoldingList::descendingCase(const FXFoldingItem* a,const FXFoldingItem* b){ return compareSectionCase(b->getText().text(),a->getText().text(),0); } // Sort items void FXFoldingList::sort(FXFoldingItem*& f1,FXFoldingItem*& t1,FXFoldingItem*& f2,FXFoldingItem*& t2,int n){ FXFoldingItem *ff1,*tt1,*ff2,*tt2,*q; FXint m; if(f2==NULL){ f1=NULL; t1=NULL; return; } if(n>1){ m=n/2; n=n-m; sort(ff1,tt1,f2,t2,n); // 1 or more sort(ff2,tt2,f2,t2,m); // 0 or more FXASSERT(ff1); if(ff2 && sortfunc(ff1,ff2)>0){ f1=ff2; ff2->prev=NULL; ff2=ff2->next; } else{ f1=ff1; ff1->prev=NULL; ff1=ff1->next; } t1=f1; t1->next=NULL; while(ff1 || ff2){ if(ff1==NULL){ t1->next=ff2; ff2->prev=t1; t1=tt2; break; } if(ff2==NULL){ t1->next=ff1; ff1->prev=t1; t1=tt1; break; } if(sortfunc(ff1,ff2)>0){ t1->next=ff2; ff2->prev=t1; t1=ff2; ff2=ff2->next; } else{ t1->next=ff1; ff1->prev=t1; t1=ff1; ff1=ff1->next; } t1->next=NULL; } return; } FXASSERT(f2); f1=f2; t1=f2; f2=f2->next; while(f2){ f2->prev=NULL; if(sortfunc(f2,t1)>0){ t1->next=f2; f2->prev=t1; t1=f2; f2=f2->next; continue; } if(sortfunc(f1,f2)>0){ q=f2; f2=f2->next; q->next=f1; f1->prev=q; f1=q; continue; } break; } FXASSERT(f1); FXASSERT(t1); f1->prev=NULL; t1->next=NULL; } // Sort the items based on the sort function void FXFoldingList::sortRootItems(){ if(sortfunc){ FXFoldingItem* f=firstitem; FXFoldingItem* l=lastitem; sort(firstitem,lastitem,f,l,getNumItems()); recalc(); } } // Sort child items void FXFoldingList::sortChildItems(FXFoldingItem* item){ if(sortfunc){ FXFoldingItem* f=item->first; FXFoldingItem* l=item->last; sort(item->first,item->last,f,l,item->getNumChildren()); if(item->isExpanded()) recalc(); // No need to recalc if it ain't visible! } } // Sort all items recursively void FXFoldingList::sortItems(){ register FXFoldingItem *item; if(sortfunc){ sortRootItems(); item=firstitem; while(item){ sortChildItems(item); if(item->first){item=item->first;continue;} while(!item->next && item->parent){item=item->parent;} item=item->next; } } } // Set current item void FXFoldingList::setCurrentItem(FXFoldingItem* item,FXbool notify){ if(item!=currentitem){ // Deactivate old item if(currentitem){ // No visible change if it doen't have the focus if(hasFocus()){ currentitem->setFocus(FALSE); updateItem(currentitem); } // Close old item closeItem(currentitem,notify); } currentitem=item; // Activate new item if(currentitem){ // No visible change if it doen't have the focus if(hasFocus()){ currentitem->setFocus(TRUE); updateItem(currentitem); } // Open new item openItem(currentitem,notify); } // Notify item change if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)currentitem);} } // Select if browse mode if((options&SELECT_MASK)==FOLDINGLIST_BROWSESELECT && currentitem && currentitem->isEnabled()){ selectItem(currentitem,notify); } } // Set anchor item void FXFoldingList::setAnchorItem(FXFoldingItem* item){ anchoritem=item; extentitem=item; } // Create item FXFoldingItem* FXFoldingList::createItem(const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr){ return new FXFoldingItem(text,oi,ci,ptr); } // Insert item under father before other item FXFoldingItem* FXFoldingList::insertItem(FXFoldingItem* other,FXFoldingItem* father,FXFoldingItem* item,FXbool notify){ register FXFoldingItem* olditem=currentitem; // Verify correctness of arguments if(!item){ fxerror("%s::insertItem: NULL item argument.\n",getClassName()); } if(other && other->parent!=father){ fxerror("%s::insertItem: bad argument.\n",getClassName()); } // Hang item into the list if(father){ if(other){ item->next=other; item->prev=other->prev; other->prev=item; } else{ item->next=NULL; item->prev=father->last; father->last=item; } if(item->prev) item->prev->next=item; else father->first=item; } else{ if(other){ item->next=other; item->prev=other->prev; other->prev=item; } else{ item->next=NULL; item->prev=lastitem; lastitem=item; } if(item->prev) item->prev->next=item; else firstitem=item; } // Fill in the rest item->parent=father; item->first=NULL; item->last=NULL; item->x=0; item->y=0; // Make current if just added if(!currentitem && item==lastitem) currentitem=item; // Notify item has been inserted if(notify && target){target->tryHandle(this,FXSEL(SEL_INSERTED,message),(void*)item);} // Current item may have changed if(olditem!=currentitem){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)currentitem);} } // Was new item if(currentitem==item){ if(hasFocus()){ currentitem->setFocus(TRUE); } if((options&SELECT_MASK)==FOLDINGLIST_BROWSESELECT && currentitem->isEnabled()){ selectItem(currentitem,notify); } } // Redo layout recalc(); return item; } // Insert item under father before other item FXFoldingItem* FXFoldingList::insertItem(FXFoldingItem* other,FXFoldingItem* father,const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr,FXbool notify){ return insertItem(other,father,createItem(text,oi,ci,ptr),notify); } // Append item under father FXFoldingItem* FXFoldingList::appendItem(FXFoldingItem* father,FXFoldingItem* item,FXbool notify){ return insertItem(NULL,father,item,notify); } // Append item under father FXFoldingItem* FXFoldingList::appendItem(FXFoldingItem* father,const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr,FXbool notify){ return insertItem(NULL,father,createItem(text,oi,ci,ptr),notify); } // Prepend item under father FXFoldingItem* FXFoldingList::prependItem(FXFoldingItem* father,FXFoldingItem* item,FXbool notify){ return insertItem(father?father->first:firstitem,father,item,notify); } // Prepend item under father FXFoldingItem* FXFoldingList::prependItem(FXFoldingItem* father,const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr,FXbool notify){ return insertItem(father?father->first:firstitem,father,createItem(text,oi,ci,ptr),notify); } // Fill list by appending items from array of strings FXint FXFoldingList::fillItems(FXFoldingItem* father,const FXchar** strings,FXIcon* oi,FXIcon* ci,void* ptr,FXbool notify){ register FXint n=0; if(strings){ while(strings[n]){ appendItem(father,strings[n++],oi,ci,ptr,notify); } } return n; } // Fill list by appending items from newline separated strings FXint FXFoldingList::fillItems(FXFoldingItem* father,const FXString& strings,FXIcon* oi,FXIcon* ci,void* ptr,FXbool notify){ register FXint n=0; FXString text; while(!(text=strings.section('\n',n)).empty()){ appendItem(father,text,oi,ci,ptr,notify); n++; } return n; } // Move item under father before other item FXFoldingItem *FXFoldingList::moveItem(FXFoldingItem* other,FXFoldingItem* father,FXFoldingItem* item){ // Verify arguments if(!item){ fxerror("%s::moveItem: NULL item argument.\n",getClassName()); } if(other && other->parent!=father){ fxerror("%s::moveItem: bad argument.\n",getClassName()); } // Can't move in front of itself if(item!=other){ // Unlink from current spot if(item->prev) item->prev->next=item->next; else if(item->parent) item->parent->first=item->next; else firstitem=item->next; if(item->next) item->next->prev=item->prev; else if(item->parent) item->parent->last=item->prev; else lastitem=item->prev; // Hang item into the list if(father){ if(other){ item->next=other; item->prev=other->prev; other->prev=item; } else{ item->next=NULL; item->prev=father->last; father->last=item; } if(item->prev) item->prev->next=item; else father->first=item; } else{ if(other){ item->next=other; item->prev=other->prev; other->prev=item; } else{ item->next=NULL; item->prev=lastitem; lastitem=item; } if(item->prev) item->prev->next=item; else firstitem=item; } // Fill in the rest item->parent=father; // Redo layout recalc(); } return item; } // Extract node from list FXFoldingItem* FXFoldingList::extractItem(FXFoldingItem* item,FXbool notify){ register FXFoldingItem *olditem=currentitem; register FXFoldingItem *result=item; register FXFoldingItem *prv; register FXFoldingItem *nxt; register FXFoldingItem *par; if(item){ // Remember hookups nxt=result->next; prv=result->prev; par=result->parent; // Unlink item from tree if(prv) prv->next=nxt; else if(par) par->first=nxt; else firstitem=nxt; if(nxt) nxt->prev=prv; else if(par) par->last=prv; else lastitem=prv; // Is now unhooked result->parent=NULL; result->next=NULL; result->prev=NULL; // Successor value if(prv) par=prv; if(nxt) par=nxt; // Visit all children while(item){ // Adjust pointers if(anchoritem==item) anchoritem=par; if(currentitem==item) currentitem=par; if(extentitem==item) extentitem=par; if(viewableitem==item) viewableitem=par; // Next item if(item->first){ item=item->first; continue; } while(!item->next && item->parent){ item=item->parent; } item=item->next; } // Current item has changed if(olditem!=currentitem){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)currentitem);} } // Extracted current item if(currentitem && currentitem!=olditem){ if(hasFocus()){ currentitem->setFocus(TRUE); } if((options&SELECT_MASK)==FOLDINGLIST_BROWSESELECT && currentitem->isEnabled()){ selectItem(currentitem,notify); } } // Redo layout recalc(); } return result; } // Remove all siblings from [fm,to] void FXFoldingList::removeItems(FXFoldingItem* fm,FXFoldingItem* to,FXbool notify){ register FXFoldingItem *olditem=currentitem; register FXFoldingItem *prv; register FXFoldingItem *nxt; register FXFoldingItem *par; if(fm && to){ if(fm->parent!=to->parent){ fxerror("%s::removeItems: arguments have different parent.\n",getClassName()); } // Delete items while(1){ // Scan till end while(to->last) to=to->last; do{ // Notify item will be deleted if(notify && target){target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)to);} // Remember hookups nxt=to->next; prv=to->prev; par=to->parent; // Adjust pointers; suggested by Alan Ott if(anchoritem==to){ anchoritem=par; if(prv) anchoritem=prv; if(nxt) anchoritem=nxt; } if(extentitem==to){ extentitem=par; if(prv) extentitem=prv; if(nxt) extentitem=nxt; } if(currentitem==to){ currentitem=par; if(prv) currentitem=prv; if(nxt) currentitem=nxt; } if(viewableitem==to){ viewableitem=par; if(prv) viewableitem=prv; if(nxt) viewableitem=nxt; } // Remove item from list if(prv) prv->next=nxt; else if(par) par->first=nxt; else firstitem=nxt; if(nxt) nxt->prev=prv; else if(par) par->last=prv; else lastitem=prv; // Delete it delete to; // Was last one? if(to==fm) goto x; to=par; } while(!prv); to=prv; } // Current item has changed x: if(olditem!=currentitem){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)currentitem);} } // Deleted current item if(currentitem && currentitem!=olditem){ if(hasFocus()){ currentitem->setFocus(TRUE); } if((options&SELECT_MASK)==FOLDINGLIST_BROWSESELECT && currentitem->isEnabled()){ selectItem(currentitem,notify); } } // Redo layout recalc(); } } // Remove node from list void FXFoldingList::removeItem(FXFoldingItem* item,FXbool notify){ removeItems(item,item,notify); } // Remove all items void FXFoldingList::clearItems(FXbool notify){ removeItems(firstitem,lastitem,notify); } typedef FXint (*FXCompareFunc)(const FXString&,const FXString &,FXint); // Get item by name FXFoldingItem* FXFoldingList::findItem(const FXString& text,FXFoldingItem* start,FXuint flgs) const { register FXCompareFunc comparefunc; register FXFoldingItem *item; register FXint len; if(firstitem){ comparefunc=(flgs&SEARCH_IGNORECASE) ? (FXCompareFunc)comparecase : (FXCompareFunc)compare; len=(flgs&SEARCH_PREFIX)?text.length():2147483647; if(flgs&SEARCH_BACKWARD){ item=start; while(item!=NULL){ if((*comparefunc)(item->getText(),text,len)==0) return item; item=item->getAbove(); } if(start && !(flgs&SEARCH_WRAP)) return NULL; for(item=lastitem; item->getLast(); item=item->getLast()); while(item!=start){ if((*comparefunc)(item->getText(),text,len)==0) return item; item=item->getAbove(); } } else{ item=start; while(item!=NULL){ if((*comparefunc)(item->getText(),text,len)==0) return item; item=item->getBelow(); } if(start && !(flgs&SEARCH_WRAP)) return NULL; item=firstitem; while(item!=start){ if((*comparefunc)(item->getText(),text,len)==0) return item; item=item->getBelow(); } } } return NULL; } // Get item by data FXFoldingItem* FXFoldingList::findItemByData(const void *ptr,FXFoldingItem* start,FXuint flgs) const { register FXFoldingItem *item; if(firstitem){ if(flgs&SEARCH_BACKWARD){ item=start; while(item!=NULL){ if(item->getData()==ptr) return item; item=item->getAbove(); } if(start && !(flgs&SEARCH_WRAP)) return NULL; for(item=lastitem; item->getLast(); item=item->getLast()); while(item!=start){ if(item->getData()==ptr) return item; item=item->getAbove(); } } else{ item=start; while(item!=NULL){ if(item->getData()==ptr) return item; item=item->getBelow(); } if(start && !(flgs&SEARCH_WRAP)) return NULL; item=firstitem; while(item!=start){ if(item->getData()==ptr) return item; item=item->getBelow(); } } } return NULL; } // Change the font void FXFoldingList::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Change help text void FXFoldingList::setHelpText(const FXString& text){ help=text; } // Set text color void FXFoldingList::setTextColor(FXColor clr){ if(clr!=textColor){ textColor=clr; update(); } } // Set select background color void FXFoldingList::setSelBackColor(FXColor clr){ if(clr!=selbackColor){ selbackColor=clr; update(); } } // Set selected text color void FXFoldingList::setSelTextColor(FXColor clr){ if(clr!=seltextColor){ seltextColor=clr; update(); } } // Set line color void FXFoldingList::setLineColor(FXColor clr){ if(clr!=lineColor){ lineColor=clr; update(); } } // Set parent to child indent amount void FXFoldingList::setIndent(FXint in){ if(indent!=in){ indent=in; recalc(); } } // Change list style void FXFoldingList::setListStyle(FXuint style){ FXuint opts=(options&~FOLDINGLIST_MASK) | (style&FOLDINGLIST_MASK); if(options!=opts){ options=opts; recalc(); } } // Get list style FXuint FXFoldingList::getListStyle() const { return (options&FOLDINGLIST_MASK); } // Save data void FXFoldingList::save(FXStream& store) const { FXScrollArea::save(store); store << header; store << firstitem; store << lastitem; store << anchoritem; store << currentitem; store << extentitem; store << font; store << textColor; store << selbackColor; store << seltextColor; store << lineColor; store << treeWidth; store << treeHeight; store << visible; store << indent; store << help; } // Load data void FXFoldingList::load(FXStream& store){ FXScrollArea::load(store); store >> header; store >> firstitem; store >> lastitem; store >> anchoritem; store >> currentitem; store >> extentitem; store >> font; store >> textColor; store >> selbackColor; store >> seltextColor; store >> lineColor; store >> treeWidth; store >> treeHeight; store >> visible; store >> indent; store >> help; } // Cleanup FXFoldingList::~FXFoldingList(){ getApp()->removeTimeout(this,ID_TIPTIMER); getApp()->removeTimeout(this,ID_LOOKUPTIMER); clearItems(FALSE); header=(FXHeader*)-1L; firstitem=(FXFoldingItem*)-1L; lastitem=(FXFoldingItem*)-1L; anchoritem=(FXFoldingItem*)-1L; currentitem=(FXFoldingItem*)-1L; extentitem=(FXFoldingItem*)-1L; font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXFont.cpp000066400000000000000000002651461326741342000153120ustar00rootroot00000000000000/******************************************************************************** * * * F o n t O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFont.cpp,v 1.184.2.5 2009/02/07 05:42:01 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxpriv.h" #include "fxascii.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegion.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXDC.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXException.h" /* #include "FXTextCodec.h" #include "FX88591Codec.h" #include "FX88592Codec.h" #include "FX88593Codec.h" #include "FX88594Codec.h" #include "FX88595Codec.h" #include "FX88596Codec.h" #include "FX88597Codec.h" #include "FX88598Codec.h" #include "FX88599Codec.h" #include "FX885910Codec.h" #include "FX885911Codec.h" #include "FX885913Codec.h" #include "FX885914Codec.h" #include "FX885915Codec.h" #include "FX885916Codec.h" #include "FXTextCodec.h" #include "FXUTF16Codec.h" FXCP1253Codec.h FXCP437Codec.h FXCP860Codec.h FXCP866Codec.h FXUTF32Codec.h FXCP1254Codec.h FXCP850Codec.h FXCP861Codec.h FXCP869Codec.h FXUTF8Codec.h FXCP1255Codec.h FXCP852Codec.h FXCP862Codec.h FXCP874Codec.h FXCP1250Codec.h FXCP1256Codec.h FXCP855Codec.h FXCP863Codec.h FXKOI8RCodec.h FXCP1251Codec.h FXCP1257Codec.h FXCP856Codec.h FXCP864Codec.h FXCP1252Codec.h FXCP1258Codec.h FXCP857Codec.h FXCP865Codec.h FXUTF16Codec.h */ /* Notes: - Interpretation of the hints: 0 No preference for pitch FXFont::Fixed If specified, match for fixed pitch fonts are strongly preferred FXFont::Variable If specified, match for variable pitch font strongly preferred 0 No hints given FXFont::Decorative Ye Olde Fonte FXFont::Modern Monospace fonts such as courier and so on FXFont::Roman Serif font such as times FXFont::Script Cursive font/script FXFont::Swiss Sans serif font such as swiss, helvetica, arial FXFont::System Raster based fonts, typically monospaced FXFont::X11 Force X11 raw font specification FXFont::Scalable Strong emphasis on scalable fonts; under Windows, this means TrueType fonts are desired FXFont::Polymorphic Strong emphasis on polymorphic fonts; under Windows, this means TrueType fonts desired also - FONTENCODING_DEFAULT means we prefer the fonts for the current locale; currently, this is hardwired to iso8859-1 until we have some means of determining the preferred encoding from the locale. - FXFont::Italic is a cursive typeface for some fonts; FXFont::Oblique is the same basic font written at an angle; for many fonts, FXFont::Italic and FXFont::Oblique means pretty much the same thing. When matching, FXFont::Italic and FXFont::Oblique are considered closer to each other than FXFont::Straight. - A weight value of 0 indicates preference for non-bold font. - XFontStruct.ascent+XFontStruct.descent is the height of the font, as far as line spacing goes. XFontStruct.max_bounds.ascent+XFontStruct.max_bounds.descent is larger, as some characters can apparently extend beyond ascent or descent!! - Registry section FONTSUBSTITUTIONS can be used to map typeface names to platform specific typeface names: [FONTSUBSTITUTIONS] arial = helvetica swiss = helvetica This allows you to change fonts in programs with hard-wired fonts. - Text txfm matrix [a b c d] premultiplies. - Should we perhaps build our own tables of font metrics? This might make things simpler for the advanced stuff, and be conceivably a lot faster under MS-Windows [no need to SelectObject() all the time just to get some info; also, this could be useful in case the drawing surface is not a window]. - FOR THE MOMENT we're creating a dummy DC to keep the font locked into the GDI for MUCH quicker access to text metrics. Soon however we want to just build our own font metrics tables and determine the metrics entirely with client-side code. This will [predictably] be the fastest possible method as it will not involve context switches... - Matching algorithm slightly favors bitmapped fonts over scalable ones [as the latter may not be optimized easthetically; also, the matching algorithm should not weight resolution as much. - UNICODE means registry and encoding are set to iso10646-1 - More human-readable font strings (e.g. registry): family [foundry],size,weight,slant,setwidth,encoding,hints For example: times [urw],120,bold,i,normal,iso8859-1,0 Note that the size is in decipoints! - Get encoding from locale (see X11). */ /*******************************************************************************/ using namespace FX; namespace FX { const FXint LEAD_OFFSET=0xD800-(0x10000>>10); // Absolute value static inline FXint fxabs(FXint a){ return a<0?-a:a; } #if defined(WIN32) /////////////////////////////// WIN32 //////////////////////// // Character set encoding static BYTE FXFontEncoding2CharSet(FXuint encoding){ switch(encoding){ case FONTENCODING_DEFAULT: return DEFAULT_CHARSET; case FONTENCODING_TURKISH: return TURKISH_CHARSET; case FONTENCODING_BALTIC: return BALTIC_CHARSET; case FONTENCODING_CYRILLIC: return RUSSIAN_CHARSET; case FONTENCODING_ARABIC: return ARABIC_CHARSET; case FONTENCODING_GREEK: return GREEK_CHARSET; case FONTENCODING_HEBREW: return HEBREW_CHARSET; case FONTENCODING_THAI: return THAI_CHARSET; case FONTENCODING_EASTEUROPE: return EASTEUROPE_CHARSET; case FONTENCODING_USASCII: return ANSI_CHARSET; // case FONTENCODING_UNICODE: return ANSI_CHARSET; } return DEFAULT_CHARSET; } // Character set encoding static FXuint CharSet2FXFontEncoding(BYTE lfCharSet){ switch(lfCharSet){ case ANSI_CHARSET: return FONTENCODING_USASCII; case ARABIC_CHARSET: return FONTENCODING_ARABIC; case BALTIC_CHARSET: return FONTENCODING_BALTIC; case CHINESEBIG5_CHARSET: return FONTENCODING_DEFAULT; case DEFAULT_CHARSET: return FONTENCODING_DEFAULT; case EASTEUROPE_CHARSET: return FONTENCODING_EASTEUROPE; case GB2312_CHARSET: return FONTENCODING_DEFAULT; case GREEK_CHARSET: return FONTENCODING_GREEK; #if !defined (__WATCOMC__) case HANGUL_CHARSET: return FONTENCODING_DEFAULT; #endif case HEBREW_CHARSET: return FONTENCODING_HEBREW; case MAC_CHARSET: return FONTENCODING_DEFAULT; case OEM_CHARSET: return FONTENCODING_DEFAULT; case SYMBOL_CHARSET: return FONTENCODING_DEFAULT; case RUSSIAN_CHARSET: return FONTENCODING_CYRILLIC; case SHIFTJIS_CHARSET: return FONTENCODING_DEFAULT; case THAI_CHARSET: return FONTENCODING_THAI; case TURKISH_CHARSET: return FONTENCODING_TURKISH; } return FONTENCODING_DEFAULT; } void* FXFont::match(const FXString& wantfamily,const FXString& wantforge,FXuint wantsize,FXuint wantweight,FXuint wantslant,FXuint wantsetwidth,FXuint wantencoding,FXuint wanthints,FXint res){ FXTRACE((150,"wantfamily=%s wantforge=%s wantsize=%d wantweight=%d wantslant=%d wantsetwidth=%d wantencoding=%d wanthints=%d res=%d\n",wantfamily.text(),wantforge.text(),wantsize,wantweight,wantslant,wantsetwidth,wantencoding,wanthints,res)); TEXTMETRIC *font; LOGFONT lf; FXchar buffer[256]; // Hang on to this for text metrics functions dc=CreateCompatibleDC(NULL); // Now fill in the fields lf.lfHeight=-MulDiv(wantsize,GetDeviceCaps((HDC)dc,LOGPIXELSY),720); lf.lfWidth=0; if(wanthints&FXFont::Rotatable){ lf.lfEscapement=(angle*10)/64; lf.lfOrientation=(angle*10)/64; } else{ lf.lfEscapement=0; lf.lfOrientation=0; } lf.lfWeight=wantweight*10; if((wantslant==FXFont::Italic) || (wantslant==FXFont::Oblique)) lf.lfItalic=TRUE; else lf.lfItalic=FALSE; lf.lfUnderline=FALSE; lf.lfStrikeOut=FALSE; // Character set encoding lf.lfCharSet=FXFontEncoding2CharSet(wantencoding); // Other hints lf.lfOutPrecision=OUT_DEFAULT_PRECIS; if(wanthints&FXFont::System) lf.lfOutPrecision=OUT_RASTER_PRECIS; if(wanthints&FXFont::Scalable) lf.lfOutPrecision=OUT_TT_PRECIS; if(wanthints&FXFont::Polymorphic) lf.lfOutPrecision=OUT_TT_PRECIS; // Clip precision lf.lfClipPrecision=CLIP_DEFAULT_PRECIS; // Quality lf.lfQuality=DEFAULT_QUALITY; // Pitch and Family lf.lfPitchAndFamily=0; // Pitch if(wanthints&FXFont::Fixed) lf.lfPitchAndFamily|=FIXED_PITCH; else if(wanthints&FXFont::Variable) lf.lfPitchAndFamily|=VARIABLE_PITCH; else lf.lfPitchAndFamily|=DEFAULT_PITCH; // Family if(wanthints&FXFont::Decorative) lf.lfPitchAndFamily|=FF_DECORATIVE; else if(wanthints&FXFont::Modern) lf.lfPitchAndFamily|=FF_MODERN; else if(wanthints&FXFont::Roman) lf.lfPitchAndFamily|=FF_ROMAN; else if(wanthints&FXFont::Script) lf.lfPitchAndFamily|=FF_SCRIPT; else if(wanthints&FXFont::Swiss) lf.lfPitchAndFamily|=FF_SWISS; else lf.lfPitchAndFamily|=FF_DONTCARE; // Font substitution #ifdef UNICODE utf2ncs(lf.lfFaceName,wantfamily.text(),wantfamily.length()+1); #else strncpy(lf.lfFaceName,wantfamily.text(),sizeof(lf.lfFaceName)); #endif // Here we go! xid=CreateFontIndirect(&lf); // Uh-oh, we failed if(!xid) return NULL; // Obtain text metrics if(!FXCALLOC(&font,TEXTMETRIC,1)) return NULL; SelectObject((HDC)dc,xid); GetTextMetrics((HDC)dc,(TEXTMETRIC*)font); // Get actual face name GetTextFaceA((HDC)dc,sizeof(buffer),buffer); actualName=buffer; actualSize=MulDiv(((TEXTMETRIC*)font)->tmHeight,720,GetDeviceCaps((HDC)dc,LOGPIXELSY)); // FIXME no cigar yet? actualWeight=((TEXTMETRIC*)font)->tmWeight/10; actualSlant=((TEXTMETRIC*)font)->tmItalic?FXFont::Italic:FXFont::Straight; actualSetwidth=0; actualEncoding=CharSet2FXFontEncoding(((TEXTMETRIC*)font)->tmCharSet); // Return it return font; } // Yuk. Need to get some data into the callback function. struct FXFontStore { HDC hdc; FXFontDesc *fonts; FXuint numfonts; FXuint size; FXFontDesc desc; }; // Callback function for EnumFontFamiliesEx() static int CALLBACK EnumFontFamExProc(const LOGFONTA *lf,const TEXTMETRICA *lptm,DWORD FontType,LPARAM lParam){ register FXFontStore *pFontStore=(FXFontStore*)lParam; FXASSERT(lf); FXASSERT(lptm); FXASSERT(pFontStore); // Get pitch FXuint flags=0; if(lf->lfPitchAndFamily&FIXED_PITCH) flags|=FXFont::Fixed; if(lf->lfPitchAndFamily&VARIABLE_PITCH) flags|=FXFont::Variable; // Get hints if(lf->lfPitchAndFamily&FF_DONTCARE) flags|=0; if(lf->lfPitchAndFamily&FF_MODERN) flags|=FXFont::Modern; if(lf->lfPitchAndFamily&FF_ROMAN) flags|=FXFont::Roman; if(lf->lfPitchAndFamily&FF_SCRIPT) flags|=FXFont::Script; if(lf->lfPitchAndFamily&FF_DECORATIVE) flags|=FXFont::Decorative; if(lf->lfPitchAndFamily&FF_SWISS) flags|=FXFont::Swiss; // Skip if no match FXuint h=pFontStore->desc.flags; if((h&FXFont::Fixed) && !(flags&FXFont::Fixed)) return 1; if((h&FXFont::Variable) && !(flags&FXFont::Variable)) return 1; // Get weight (also guess from the name) FXuint weight=lf->lfWeight/10; if(strstr(lf->lfFaceName,"Bold")!=NULL) weight=FXFont::Bold; if(strstr(lf->lfFaceName,"Black")!=NULL) weight=FXFont::Black; if(strstr(lf->lfFaceName,"Demi")!=NULL) weight=FXFont::DemiBold; if(strstr(lf->lfFaceName,"Light")!=NULL) weight=FXFont::Light; if(strstr(lf->lfFaceName,"Medium")!=NULL) weight=FXFont::Medium; // Skip if weight doesn't match FXuint wt=pFontStore->desc.weight; if((wt!=0) && (wt!=weight)) return 1; // Get slant FXuint slant=FXFont::Straight; if(lf->lfItalic==TRUE) slant=FXFont::Italic; if(strstr(lf->lfFaceName,"Italic")!=NULL) slant=FXFont::Italic; if(strstr(lf->lfFaceName,"Roman")!=NULL) slant=FXFont::Straight; // Skip if no match FXuint sl=pFontStore->desc.slant; if((sl!=0) && (sl!=slant)) return 1; // Get set width (also guess from the name) FXuint setwidth=0; if(strstr(lf->lfFaceName,"Cond")!=NULL) setwidth=FXFont::Condensed; if(strstr(lf->lfFaceName,"Narrow")!=NULL) setwidth=FXFont::Condensed; if(strstr(lf->lfFaceName,"Ext Cond")!=NULL) setwidth=FXFont::ExtraCondensed; // Skip if no match FXuint sw=pFontStore->desc.setwidth; if((sw!=0) && (sw!=setwidth)) return 1; // Get encoding FXuint encoding=CharSet2FXFontEncoding(lf->lfCharSet); // Skip if no match FXuint en=pFontStore->desc.encoding; if((en!=FONTENCODING_DEFAULT) && (en!=encoding)) return 1; // Is it scalable? if(FontType==TRUETYPE_FONTTYPE){ flags|=FXFont::Scalable; } // Is it polymorphic? if(FontType==TRUETYPE_FONTTYPE){ flags|=FXFont::Polymorphic; } // Initial allocation of storage? if(pFontStore->numfonts==0){ FXMALLOC(&pFontStore->fonts,FXFontDesc,50); if(pFontStore->fonts==0) return 0; pFontStore->size=50; } // Grow the array if needed if(pFontStore->numfonts>=pFontStore->size){ FXRESIZE(&pFontStore->fonts,FXFontDesc,pFontStore->size+50); if(pFontStore->fonts==0) return 0; pFontStore->size+=50; } FXFontDesc *fonts=pFontStore->fonts; FXuint numfonts=pFontStore->numfonts; strncpy(fonts[numfonts].face,lf->lfFaceName,116); if(lf->lfHeight<0){ fonts[numfonts].size=-MulDiv(lf->lfHeight,720,GetDeviceCaps(pFontStore->hdc,LOGPIXELSY)); } else{ fonts[numfonts].size=MulDiv(lf->lfHeight,720,GetDeviceCaps(pFontStore->hdc,LOGPIXELSY)); } fonts[numfonts].weight=weight; fonts[numfonts].slant=slant; fonts[numfonts].encoding=encoding; fonts[numfonts].setwidth=setwidth; fonts[numfonts].flags=flags; pFontStore->fonts=fonts; pFontStore->numfonts++; // Must return 1 to continue enumerating fonts return 1; } #elif defined(HAVE_XFT_H) /////////////////////// XFT /////////////////////////// // Access to display #define DISPLAY(app) ((Display*)((app)->display)) // From FOX weight to fontconfig weight static FXint weight2FcWeight(FXint weight){ switch(weight){ case FXFont::Thin: return FC_WEIGHT_THIN; case FXFont::ExtraLight:return FC_WEIGHT_EXTRALIGHT; case FXFont::Light: return FC_WEIGHT_LIGHT; case FXFont::Normal: return FC_WEIGHT_NORMAL; case FXFont::Medium: return FC_WEIGHT_MEDIUM; case FXFont::DemiBold: return FC_WEIGHT_DEMIBOLD; case FXFont::Bold: return FC_WEIGHT_BOLD; case FXFont::ExtraBold: return FC_WEIGHT_EXTRABOLD; case FXFont::Black: return FC_WEIGHT_BLACK; } return FC_WEIGHT_NORMAL; } // From fontconfig weight to FOX weight static FXint fcWeight2Weight(FXint fcWeight){ switch(fcWeight){ case FC_WEIGHT_THIN: return FXFont::Thin; case FC_WEIGHT_EXTRALIGHT:return FXFont::ExtraLight; case FC_WEIGHT_LIGHT: return FXFont::Light; case FC_WEIGHT_NORMAL: return FXFont::Normal; case FC_WEIGHT_MEDIUM: return FXFont::Medium; case FC_WEIGHT_DEMIBOLD: return FXFont::DemiBold; case FC_WEIGHT_BOLD: return FXFont::Bold; case FC_WEIGHT_EXTRABOLD: return FXFont::ExtraBold; case FC_WEIGHT_BLACK: return FXFont::Black; } return FXFont::Normal; } // From FOX setwidth to fontconfig setwidth static FXint setWidth2FcSetWidth(FXint setwidth){ switch(setwidth){ case FXFont::UltraCondensed:return FC_WIDTH_ULTRACONDENSED; case FXFont::ExtraCondensed:return FC_WIDTH_EXTRACONDENSED; case FXFont::Condensed: return FC_WIDTH_CONDENSED; case FXFont::SemiCondensed: return FC_WIDTH_SEMICONDENSED; case FXFont::NonExpanded: return FC_WIDTH_NORMAL; case FXFont::SemiExpanded: return FC_WIDTH_SEMIEXPANDED; case FXFont::Expanded: return FC_WIDTH_EXPANDED; case FXFont::ExtraExpanded: return FC_WIDTH_EXTRAEXPANDED; case FXFont::UltraExpanded: return FC_WIDTH_ULTRAEXPANDED; } return FC_WIDTH_NORMAL; } // From fontconfig setwidth to FOX setwidth static FXint fcSetWidth2SetWidth(FXint fcSetWidth){ switch(fcSetWidth){ case FC_WIDTH_ULTRACONDENSED:return FXFont::UltraCondensed; case FC_WIDTH_EXTRACONDENSED:return FXFont::ExtraCondensed; case FC_WIDTH_CONDENSED: return FXFont::Condensed; case FC_WIDTH_SEMICONDENSED: return FXFont::SemiCondensed; case FC_WIDTH_NORMAL: return FXFont::NonExpanded; case FC_WIDTH_SEMIEXPANDED: return FXFont::SemiExpanded; case FC_WIDTH_EXPANDED: return FXFont::Expanded; case FC_WIDTH_EXTRAEXPANDED: return FXFont::ExtraExpanded; case FC_WIDTH_ULTRAEXPANDED: return FXFont::UltraExpanded; } return FXFont::NonExpanded; } // From FOX slant to fontconfig slant static FXint slant2FcSlant(FXint slant){ switch(slant){ case FXFont::Straight: return FC_SLANT_ROMAN; case FXFont::Italic: return FC_SLANT_ITALIC; case FXFont::Oblique: return FC_SLANT_OBLIQUE; case FXFont::ReverseItalic: return FC_SLANT_ITALIC; // No equivalent FC value case FXFont::ReverseOblique: return FC_SLANT_OBLIQUE; // No equivalent FC value } return FC_SLANT_ROMAN; } // From fontconfig slant to FOX slant static FXint fcSlant2Slant(FXint fcSlant){ switch(fcSlant){ case FC_SLANT_ROMAN: return FXFont::Straight; case FC_SLANT_ITALIC: return FXFont::Italic; case FC_SLANT_OBLIQUE:return FXFont::Oblique; } return FXFont::Straight; } // Try find matching font void* FXFont::match(const FXString& wantfamily,const FXString& wantforge,FXuint wantsize,FXuint wantweight,FXuint wantslant,FXuint wantsetwidth,FXuint wantencoding,FXuint wanthints,FXint res){ int pp,sw,wt,sl; double a,s,c,sz; FcPattern *pattern,*p; FcChar8 *fam,*fdy; FcCharSet *charset; XftFont *font; FcResult result; FcBool sc; FcMatrix matrix; FXTRACE((150,"wantfamily=%s wantforge=%s wantsize=%d wantweight=%d wantslant=%d wantsetwidth=%d wantencoding=%d wanthints=%d res=%d\n",wantfamily.text(),wantforge.text(),wantsize,wantweight,wantslant,wantsetwidth,wantencoding,wanthints,res)); // Create pattern object pattern=FcPatternCreate(); // Set family if(!wantfamily.empty()){ FcPatternAddString(pattern,FC_FAMILY,(const FcChar8*)wantfamily.text()); } // Set foundry if(!wantforge.empty()){ FcPatternAddString(pattern,FC_FOUNDRY,(const FcChar8*)wantforge.text()); } // Set pixel size, based on given screen res and desired point size if(wantsize!=0){ FcPatternAddDouble(pattern,FC_PIXEL_SIZE,(res*wantsize)/720.0); } // Set font weight if(wantweight!=0){ FcPatternAddInteger(pattern,FC_WEIGHT,weight2FcWeight(wantweight)); } // Set slant if(wantslant!=0){ FcPatternAddInteger(pattern,FC_SLANT,slant2FcSlant(wantslant)); } // Set setwidth if(wantsetwidth!=0){ FcPatternAddInteger(pattern,FC_WIDTH,setWidth2FcSetWidth(wantsetwidth)); } // Set encoding if(wantencoding!=FONTENCODING_DEFAULT){ // FIXME // FcCharSet* charSet=FcCharSetCreate(); // encoding2FcCharSet((void*)charSet, (FXFontEncoding)encoding); // FcPatternAddCharSet(pattern, FC_CHARSET, charSet); // FcCharSetDestroy(charSet); } // Set pitch if(wanthints&FXFont::Fixed){ FcPatternAddInteger(pattern,FC_SPACING,FC_MONO); } else if(wanthints&FXFont::Variable){ FcPatternAddInteger(pattern,FC_SPACING,FC_PROPORTIONAL); } // Scalable font hint; also set if we want rotation if(wanthints&(FXFont::Scalable|FXFont::Rotatable)){ FcPatternAddBool(pattern,FC_SCALABLE,TRUE); } // Always set matrix if rotatable if(wanthints&FXFont::Rotatable){ a=0.00027270769562411399179*angle; c=cos(a); s=sin(a); matrix.xx=c; matrix.xy=-s; matrix.yx=s; matrix.yy=c; FcPatternAddMatrix(pattern,FC_MATRIX,&matrix); } // Pattern substitutions FcConfigSubstitute(0,pattern,FcMatchPattern); FcDefaultSubstitute(pattern); // Find pattern matching a font p=FcFontMatch(0,pattern,&result); if(!p) return NULL; // Get name and foundry if(FcPatternGetString(p,FC_FAMILY,0,&fam)==FcResultMatch){ actualName=(const FXchar*)fam; if(FcPatternGetString(p,FC_FOUNDRY,0,&fdy)==FcResultMatch){ actualName.append(" ["); actualName.append((const FXchar*)fdy); actualName.append("]"); } } // Get setwidth if(FcPatternGetInteger(p,FC_WIDTH,0,&sw)==FcResultMatch){ actualSetwidth=fcSetWidth2SetWidth(sw); } // Get weight if(FcPatternGetInteger(p,FC_WEIGHT,0,&wt)==FcResultMatch){ actualWeight=fcWeight2Weight(wt); } // Get slant if(FcPatternGetInteger(p,FC_SLANT,0,&sl)==FcResultMatch){ actualSlant=fcSlant2Slant(sl); } // Get pitch if(FcPatternGetInteger(p,FC_SPACING,0,&pp)==FcResultMatch){ flags&=~(FXFont::Fixed|FXFont::Variable); // if(pp==FC_MONO || pp==FC_DUAL || pp==FC_CHARCELL) flags|=FXFont::Fixed; if(pp==FC_MONO || pp==FC_CHARCELL) flags|=FXFont::Fixed; else if(pp==FC_PROPORTIONAL) flags|=FXFont::Variable; } // Get scalable flag if(FcPatternGetBool(p,FC_SCALABLE,0,&sc)==FcResultMatch){ flags=sc?(flags|FXFont::Scalable):(flags&~FXFont::Scalable); } // Get pixel size and work it back to deci-points using given screen res if(FcPatternGetDouble(p,FC_PIXEL_SIZE,0,&sz)==FcResultMatch){ actualSize=(int)((720.0*sz)/res); } // Get charset if(FcPatternGetCharSet(p,FC_CHARSET,0,&charset)==FcResultMatch){ // FIXME } // Get the encoding actualEncoding=FONTENCODING_UNICODE; // Open font font=XftFontOpenPattern(DISPLAY(getApp()),p); xid=(FXID)font; // Destroy pattern FcPatternDestroy(pattern); return font; } #else ///////////////////////////////// XLFD //////////////////////////////////// #define SGN(x) ((x)<0.0?"~":"") #define DISPLAY(app) ((Display*)((app)->display)) // Convert text to font weight static FXuint xlfdWeight(const FXchar* text){ register FXchar c1=Ascii::toLower(text[0]); register FXchar c2=Ascii::toLower(text[1]); if(c1=='l' && c2=='i') return FXFont::Light; if(c1=='o' && c2=='u') return FXFont::Light; if(c1=='s' && c2=='h') return FXFont::Light; if(c1=='n' && c2=='o') return FXFont::Normal; if(c1=='r' && c2=='e') return FXFont::Normal; if(c1=='m' && c2=='e') return FXFont::Medium; if(c1=='d' && c2=='e') return FXFont::DemiBold; if(c1=='s' && c2=='e') return FXFont::DemiBold; if(c1=='b' && c2=='o') return FXFont::Bold; if(c1=='b' && c2=='l') return FXFont::Black; return 0; } // Convert text to slant static FXuint xlfdSlant(const FXchar* text){ register FXchar c1=Ascii::toLower(text[0]); register FXchar c2=Ascii::toLower(text[1]); if(c1=='i') return FXFont::Italic; if(c1=='o') return FXFont::Oblique; if(c1=='r' && c2=='i') return FXFont::ReverseItalic; if(c1=='r' && c2=='o') return FXFont::ReverseOblique; if(c1=='r') return FXFont::Straight; return 0; } // Convert text to setwidth static FXuint xlfdSetwidth(const FXchar* text){ if(text[0]=='m') return FXFont::NonExpanded; if(text[0]=='w') return FXFont::ExtraExpanded; if(text[0]=='r') return FXFont::NonExpanded; if(text[0]=='c') return FXFont::Condensed; if(text[0]=='n'){ if(text[1]=='a') return FXFont::Condensed; if(text[1]=='o') return FXFont::NonExpanded; return 0; } if(text[0]=='e' && text[1]=='x' && text[2]=='p') return FXFont::Expanded; if(text[0]=='e' && text[1]=='x' && text[2]=='t' && text[3]=='r' && text[4]=='a'){ if(text[5]=='c') return FXFont::ExtraCondensed; if(text[5]=='e') return FXFont::ExtraExpanded; return 0; } if(text[0]=='u' && text[1]=='l' && text[2]=='t' && text[3]=='r' && text[4]=='a'){ if(text[5]=='c') return FXFont::UltraCondensed; if(text[5]=='e') return FXFont::UltraExpanded; return 0; } if((text[0]=='s' || text[0]=='d') && text[1]=='e' && text[2]=='m' && text[3]=='i'){ if(text[5]=='c') return FXFont::SemiCondensed; if(text[5]=='e') return FXFont::SemiExpanded; return 0; } return 0; } // Convert pitch to flags static FXuint xlfdPitch(const FXchar* text){ register FXchar c=Ascii::toLower(text[0]); if(c=='p') return FXFont::Variable; if(c=='m' || c=='c') return FXFont::Fixed; return 0; } // Convert fields to scalable flag static FXuint xlfdScalable(const FXchar *pixelsize,const FXchar *pointsize,const FXchar* average){ if(pixelsize[0]=='[' && pointsize[0]=='[' && average[0]=='0') return FXFont::Scalable; if(pixelsize[0]=='0' && pointsize[0]=='0' && average[0]=='0') return FXFont::Scalable; return 0; } // Convert fields to rotatable flag static FXuint xlfdRotatable(const FXchar *pixelsize,const FXchar *pointsize){ if(pixelsize[0]=='[' && pointsize[0]=='[') return FXFont::Rotatable; return 0; } // Convert fields to rotatable flag static FXuint xlfdPolymorph(const FXchar *weight,const FXchar* slant,const FXchar *setwidth,const FXchar* addstyle){ if(weight[0]=='0' || slant[0]=='0' || setwidth[0]=='0' || addstyle[0]=='0') return FXFont::Polymorphic; return 0; } // Determine encoding; these codes should tie into the codec list in some way static FXuint xlfdEncoding(const FXchar* text){ if((text[0]=='i' || text[0]=='I') && (text[1]=='s' || text[1]=='S') && (text[2]=='o' || text[2]=='O')){ if(text[3]=='8' && text[4]=='8' && text[5]=='5' && text[6]=='9' && text[7]=='-'){ return FONTENCODING_ISO_8859_1+atoi(text+8)-1; // iso8859-XX } if(text[3]=='1' && text[4]=='0' &&text[5]=='6' && text[6]=='4' && text[7]=='6' && text[8]=='-' && text[9]=='1'){ return FONTENCODING_UNICODE; // iso10646-1 } return FONTENCODING_DEFAULT; } if((text[0]=='k' || text[0]=='K') && (text[1]=='o' || text[1]=='O') && (text[2]=='i' || text[2]=='I') && text[3]=='8'){ if(text[4]=='r' || text[4]=='R'){ return FONTENCODING_KOI8_R; // koi8r } if(text[4]=='u' || text[4]=='U'){ // koi8u return FONTENCODING_KOI8_U; } return FONTENCODING_KOI8; } if((text[0]=='m' || text[0]=='M') && (text[1]=='i' || text[1]=='I') && (text[2]=='c' || text[2]=='C') && (text[3]=='r' || text[3]=='R') && (text[4]=='o' || text[4]=='O') && (text[5]=='s' || text[5]=='S') && (text[6]=='o' || text[6]=='O') && (text[7]=='f' || text[7]=='F') && (text[8]=='t' || text[8]=='T') && text[9]=='-'){ if((text[10]=='c' || text[10]=='C') && (text[11]=='p' || text[11]=='P')){ return atoi(text+12); // microsoft-cpXXXX } return FONTENCODING_DEFAULT; } if((text[0]=='j' || text[0]=='J') && (text[1]=='i' || text[1]=='I') && (text[2]=='s' || text[2]=='S') && (text[3]=='x' || text[3]=='X')){ return FONTENCODING_DEFAULT; // jisx.XXXX.YYYY-Z FIXME } if((text[0]=='b' || text[0]=='B') && (text[1]=='i' || text[1]=='I') && (text[2]=='g' || text[2]=='G') && text[3]=='5'){ return FONTENCODING_DEFAULT; // big5XXX FIXME } if((text[0]=='k' || text[0]=='K') && (text[1]=='s' || text[1]=='S') && (text[2]=='c' || text[2]=='C')){ return FONTENCODING_DEFAULT; // kscXXX FIXME } if((text[0]=='g' || text[0]=='G') && (text[1]=='b' || text[1]=='B')){ return FONTENCODING_DEFAULT; // gbXXXX FIXME } return FONTENCODING_DEFAULT; } // Split XLFD into pieces static int xlfdSplit(char *fld[],char* font){ fld[0]=fld[2]=fld[3]=fld[4]=fld[5]=fld[6]=fld[7]=fld[8]=fld[9]=fld[10]=fld[11]=fld[12]=""; fld[1]=font; if(*font++=='-'){ fld[0]=font; for(int f=1; f<=12; f++){ while(*font && *font!='-') font++; if(*font=='-') *font++='\0'; fld[f]=font; } } return 1; } // Return font name from a font possibly containing wildcards static FXString xlfdFont(Display *dpy,const FXString& font){ char **fontnames; int nfontnames; FXString fontname(font); if((fontnames=XListFonts(dpy,font.text(),1,&nfontnames))!=NULL){ fontname=fontnames[0]; XFreeFontNames(fontnames); } return fontname; } // Try find matching font void* FXFont::match(const FXString& wantfamily,const FXString& wantforge,FXuint wantsize,FXuint wantweight,FXuint wantslant,FXuint wantsetwidth,FXuint wantencoding,FXuint wanthints,FXint res){ FXuint encoding,weight,slant,setwidth,pitch,scalable,rotatable,polymorph,xres,yres,points,size; FXint bencoding,bweight,bslant,bsetwidth,bpitch,bscalable,brotatable,bpolymorph,bsize,bxres,byres; FXint dencoding,dweight,dslant,dsetwidth,dpitch,dscalable,drotatable,dpolymorph,dsize; FXchar candidate[256],xlfd[256]; FXchar *field[13]; FXchar **fontnames; FXint nfontnames,b,f; FXdouble c,s,a; XFontStruct *font; FXTRACE((150,"wantfamily=%s wantforge=%s wantsize=%d wantweight=%d wantslant=%d wantsetwidth=%d wantencoding=%d wanthints=%d res=%d\n",wantfamily.text(),wantforge.text(),wantsize,wantweight,wantslant,wantsetwidth,wantencoding,wanthints,res)); // Get fonts matching the pattern sprintf(candidate,"-%s-%s-*-*-*-*-*-%s-*-*-*-*-*-*",wantforge.empty()?"*":wantforge.text(),wantfamily.empty()?"*":wantfamily.text(),(hints&FXFont::Rotatable)?"[1 0 0 1]":"*"); fontnames=XListFonts(DISPLAY(getApp()),candidate,65535,&nfontnames); if(fontnames && 0fid); ((XFontStruct*)font)->fid=XLoadFont(DISPLAY(getApp()),xlfd); } } // Simple case for horizontally drawn fonts else{ font=XLoadQueryFont(DISPLAY(getApp()),xlfd); } /* if(font){ for(b=0; b<((XFontStruct*)font)->n_properties; b++){ if(((XFontStruct*)font)->properties[b].name==XA_FONT){ char *fn=XGetAtomName(DISPLAY(getApp()),((XFontStruct*)font)->properties[b].card32); strncpy(candidate,fn,sizeof(candidate)); FXTRACE((100,"FONT = %s\n",candidate)); xlfdSplit(field,candidate); XFree(fn); FXTRACE((100,"mat = %s\n",field[6])); } else{ FXTRACE((100,"%d (%s) = %d\n",((XFontStruct*)font)->properties[b].name,XGetAtomName(DISPLAY(getApp()),((XFontStruct*)font)->properties[b].name),((XFontStruct*)font)->properties[b].card32)); } } } */ return font; } } return NULL; } #endif ////////////////////////////////////////////////////////////////////////// /*******************************************************************************/ // Object implementation FXIMPLEMENT(FXFont,FXId,NULL,0) // Deserialization FXFont::FXFont(){ wantedSize=0; actualSize=0; wantedWeight=0; actualWeight=0; wantedSlant=0; actualSlant=0; wantedSetwidth=0; actualSetwidth=0; wantedEncoding=0; actualEncoding=0; hints=0; flags=0; angle=0; font=NULL; #ifdef WIN32 dc=NULL; #endif } // Construct font from given font description FXFont::FXFont(FXApp* a,const FXString& string):FXId(a){ FXTRACE((100,"FXFont::FXFont %p\n",this)); wantedSize=0; actualSize=0; wantedWeight=0; actualWeight=0; wantedSlant=0; actualSlant=0; wantedSetwidth=0; actualSetwidth=0; wantedEncoding=0; actualEncoding=0; hints=0; flags=0; angle=0; font=NULL; #ifdef WIN32 dc=NULL; #endif setFont(string); } // Construct a font with given family name, size in points(pixels), weight, slant, character set encoding, setwidth, and hints FXFont::FXFont(FXApp* a,const FXString& face,FXuint size,FXuint weight,FXuint slant,FXuint encoding,FXuint setwidth,FXuint h):FXId(a),wantedName(face){ FXTRACE((100,"FXFont::FXFont %p\n",this)); wantedSize=10*size; wantedWeight=weight; wantedSlant=slant; wantedSetwidth=setwidth; wantedEncoding=encoding; actualSize=0; actualWeight=0; actualSlant=0; actualSetwidth=0; actualEncoding=0; hints=(h&~FXFont::X11); // System-independent method flags=0; angle=0; font=NULL; #ifdef WIN32 dc=NULL; #endif } // Construct font from font description FXFont::FXFont(FXApp* a,const FXFontDesc& fontdesc):FXId(a),wantedName(fontdesc.face){ FXTRACE((100,"FXFont::FXFont %p\n",this)); wantedSize=fontdesc.size; wantedWeight=fontdesc.weight; wantedSlant=fontdesc.slant; wantedSetwidth=fontdesc.setwidth; wantedEncoding=fontdesc.encoding; actualSize=0; actualWeight=0; actualSlant=0; actualSetwidth=0; actualEncoding=0; hints=fontdesc.flags; flags=0; angle=0; font=NULL; #ifdef WIN32 dc=NULL; #endif } // Return family part of name FXString FXFont::getFamily() const { return wantedName.before('[').trimEnd(); } // Return foundry part of name FXString FXFont::getFoundry() const { return wantedName.section("[]",1); } /*******************************************************************************/ // Create font void FXFont::create(){ if(!xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::create %p\n",getClassName(),this)); #if defined(WIN32) ///// WIN32 ///// FXString family=getFamily(); FXTRACE((150,"%s::create: win32 font\n",getClassName())); // Try to match with specified family and foundry if(!family.empty()){ family=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS",family.text(),family.text()); font=match(family,FXString::null,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,100); } // Uh-oh, we failed if(!xid){ throw FXFontException("unable to create font"); } #elif defined(HAVE_XFT_H) ///// XFT ///// FXString family=getFamily(); FXString foundry=getFoundry(); FXint res; // Override screen resolution via registry res=getApp()->reg().readUnsignedEntry("SETTINGS","screenres",100); FXTRACE((150,"%s::create: xft font\n",getClassName())); // Try to match with specified family and foundry if(!family.empty()){ family=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS",family.text(),family.text()); if(!foundry.empty()){ foundry=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS",foundry.text(),foundry.text()); font=match(family,foundry,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); } if(!font){ font=match(family,FXString::null,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); } } // Uh-oh, we failed if(!xid){ throw FXFontException("unable to create font"); } #else ///// XLFD ///// FXString family=getFamily(); FXString foundry=getFoundry(); FXint res; // Override screen resolution via registry res=getApp()->reg().readUnsignedEntry("SETTINGS","screenres",100); FXTRACE((150,"%s::create: xlfd font\n",getClassName())); // X11 font specification if(hints&FXFont::X11){ // Resolve font name actualName=xlfdFont(DISPLAY(getApp()),wantedName); // Try load the font font=XLoadQueryFont(DISPLAY(getApp()),actualName.text()); } // Platform independent specification if(!font){ // First we try to match with specified family and foundry if(!family.empty()){ family=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS",family.text(),family.text()); if(!foundry.empty()){ foundry=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS",foundry.text(),foundry.text()); font=match(family,foundry,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); } if(!font){ font=match(family,FXString::null,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); } } // Try based on hints if(!font){ // Try swiss if we want swiss or indicated no preference if((hints&(FXFont::Swiss|FXFont::System)) || !(hints&(FXFont::Decorative|FXFont::Modern|FXFont::Roman|FXFont::Script|FXFont::Swiss|FXFont::System))){ family=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS","helvetica","helvetica"); font=match(family,FXString::null,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); if(!font){ family=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS","lucida","lucida"); font=match(family,FXString::null,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); } } // Try roman else if(hints&FXFont::Roman){ family=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS","times","times"); font=match(family,FXString::null,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); if(!font){ family=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS","charter","charter"); font=match(family,FXString::null,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); } } // Try modern else if(hints&FXFont::Modern){ family=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS","courier","courier"); font=match(family,FXString::null,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); if(!font){ family=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS","lucidatypewriter","lucidatypewriter"); font=match(family,FXString::null,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); } } // Try decorative else if(hints&FXFont::Decorative){ family=getApp()->reg().readStringEntry("FONTSUBSTITUTIONS","gothic","gothic"); font=match(family,FXString::null,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); } // Try anything if(!font){ font=match(FXString::null,FXString::null,wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding,hints,res); } } } // If we still don't have a font yet, use fixed font if(!font){ // Resolve font name actualName="fixed"; // Try load the font font=XLoadQueryFont(DISPLAY(getApp()),actualName.text()); } // Remember font id if(font){ xid=((XFontStruct*)font)->fid; } // Uh-oh, we failed if(!xid){ throw FXFontException("unable to create font"); } #endif // What was really matched FXTRACE((100,"wantedName=%s wantedSize=%d wantedWeight=%d wantedSlant=%d wantedSetwidth=%d wantedEncoding=%d\n",wantedName.text(),wantedSize,wantedWeight,wantedSlant,wantedSetwidth,wantedEncoding)); FXTRACE((100,"actualName=%s actualSize=%d actualWeight=%d actualSlant=%d actualSetwidth=%d actualEncoding=%d\n",actualName.text(),actualSize,actualWeight,actualSlant,actualSetwidth,actualEncoding)); } } } // Detach font void FXFont::detach(){ if(xid){ FXTRACE((100,"%s::detach %p\n",getClassName(),this)); #if defined(WIN32) ///// WIN32 ///// // Free font metrics FXFREE(&font); #elif defined(HAVE_XFT_H) ///// XFT ///// XftFontClose(DISPLAY(getApp()),(XftFont*)font); #else ///// XLFD ///// XFreeFont(DISPLAY(getApp()),(XFontStruct*)font); #endif // Forget all about actual font actualName=FXString::null; actualSize=0; actualWeight=0; actualSlant=0; actualSetwidth=0; actualEncoding=0; font=NULL; xid=0; } } // Destroy font void FXFont::destroy(){ if(xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::destroy %p\n",getClassName(),this)); #if defined(WIN32) ///// WIN32 ///// // Necessary to prevent resource leak SelectObject((HDC)dc,GetStockObject(SYSTEM_FONT)); // Delete font DeleteObject((HFONT)xid); // Delete dummy DC DeleteDC((HDC)dc); // Free font metrics FXFREE(&font); #elif defined(HAVE_XFT_H) ///// XFT ///// // Free font XftFontClose(DISPLAY(getApp()),(XftFont*)font); #else ///// XLFD ///// // Free font XFreeFont(DISPLAY(getApp()),(XFontStruct*)font); #endif } // Forget all about actual font actualName=FXString::null; actualSize=0; actualWeight=0; actualSlant=0; actualSetwidth=0; actualEncoding=0; font=NULL; xid=0; } } /*******************************************************************************/ // Set to new angle, in degrees*64 relative to positive x axis void FXFont::setAngle(FXint ang){ if(xid){ fxerror("%s::setAngle: font has already been created.\n",getClassName()); } angle=(ang+34560)%23040-11520; if(angle!=ang){ angle=ang; } } /* WINGDIAPI DWORD WINAPI GetGlyphIndices( HDC hdc, // handle to DC LPCTSTR lpstr, // string to convert int c, // number of characters in string LPWORD pgi, // array of glyph indices DWORD fl // glyph options ); Parameters hdc [in] Handle to the device context. lpstr [in] Pointer to the string to be converted. c [in] Number of characters in pgi. pgi [out] Array of glyph indices corresponding to the characters in the string. fl [in] Specifies how glyphs should be handled if they are not supported. This parameter can be the following value. Value Meaning GGI_MARK_NONEXISTING_GLYPHS Marks unsupported glyphs with the hexadecimal value 0xffff. */ // Does font have given character glyph? FXbool FXFont::hasChar(FXwchar ch) const { if(font){ #if defined(WIN32) ///// WIN32 ///// // FIXME may want to use GetGlyphIndices() return ((TEXTMETRIC*)font)->tmFirstChar<=ch && ch<=((TEXTMETRIC*)font)->tmLastChar; #elif defined(HAVE_XFT_H) ///// XFT ///// return XftCharExists(DISPLAY(getApp()),(XftFont*)font,ch); #else ///// XLFD ///// register const XFontStruct *fs=(XFontStruct*)font; register const XCharStruct *cm; register FXuchar row=ch>>8; register FXuchar col=ch&255; if(fs->min_char_or_byte2<=col && col<=fs->max_char_or_byte2 && fs->min_byte1<=row && row<=fs->max_byte1){ if(!fs->per_char) return TRUE; cm=fs->per_char+((row-fs->min_byte1)*(fs->max_char_or_byte2-fs->min_char_or_byte2+1))+(col-fs->min_char_or_byte2); if(cm->width || cm->ascent || cm->descent || cm->rbearing || cm->lbearing) return TRUE; } #endif } return FALSE; } // Get first character glyph in font FXwchar FXFont::getMinChar() const { if(font){ #if defined(WIN32) ///// WIN32 ///// return ((TEXTMETRIC*)font)->tmFirstChar; #elif defined(HAVE_XFT_H) ///// XFT ///// return 0; // FIXME #else ///// XLFD ///// return (((XFontStruct*)font)->min_byte1<<8)|((XFontStruct*)font)->min_char_or_byte2; #endif } return 0; } // Get last character glyph in font FXwchar FXFont::getMaxChar() const { if(font){ #if defined(WIN32) ///// WIN32 ///// return ((TEXTMETRIC*)font)->tmLastChar; #elif defined(HAVE_XFT_H) ///// XFT ///// return 0x10ffff; // FIXME #else ///// XLFD ///// return (((XFontStruct*)font)->max_byte1<<8)|((XFontStruct*)font)->max_char_or_byte2; #endif } return 0; } // Get font leading [that is lead-ing as in Pb!] FXint FXFont::getFontLeading() const { if(font){ #if defined(WIN32) ///// WIN32 ///// return ((TEXTMETRIC*)font)->tmExternalLeading; #elif defined(HAVE_XFT_H) ///// XFT ///// return 0; // FIXME #else ///// XLFD ///// return ((XFontStruct*)font)->ascent+((XFontStruct*)font)->descent-((XFontStruct*)font)->max_bounds.ascent-((XFontStruct*)font)->max_bounds.descent; #endif } return 0; } // Get font line spacing [height+leading] FXint FXFont::getFontSpacing() const { if(font){ #if defined(WIN32) ///// WIN32 ///// return ((TEXTMETRIC*)font)->tmHeight; // Includes font point size plus internal leading #elif defined(HAVE_XFT_H) ///// XFT ///// return ((XftFont*)font)->ascent+((XftFont*)font)->descent; #else ///// XLFD ///// return ((XFontStruct*)font)->ascent+((XFontStruct*)font)->descent; #endif } return 1; } // Left bearing FXint FXFont::leftBearing(FXwchar ch) const { if(font){ #if defined(WIN32) ///// WIN32 ///// return 0; // FIXME #elif defined(HAVE_XFT_H) ///// XFT ///// return 0; // FIXME #else ///// XLFD ///// register const XFontStruct *fs=(XFontStruct*)font; if(fs->per_char){ register FXuchar row=ch>>8; register FXuchar col=ch&255; if(fs->min_char_or_byte2<=col && col<=fs->max_char_or_byte2 && fs->min_byte1<=row && row<=fs->max_byte1){ register const XCharStruct *cm=fs->per_char+((row-fs->min_byte1)*(fs->max_char_or_byte2-fs->min_char_or_byte2+1))+(col-fs->min_char_or_byte2); if(cm->width || cm->ascent || cm->descent) return cm->lbearing; } return fs->per_char[((fs->default_char>>8)-fs->min_byte1)*(fs->max_char_or_byte2-fs->min_char_or_byte2+1)+((fs->default_char&255)-fs->min_char_or_byte2)].lbearing; } return fs->min_bounds.lbearing; #endif } return 0; } // Right bearing FXint FXFont::rightBearing(FXwchar ch) const { if(font){ #if defined(WIN32) ///// WIN32 ///// return 0; // FIXME #elif defined(HAVE_XFT_H) ///// XFT ///// return 0; // FIXME #else ///// XLFD ///// register const XFontStruct *fs=(XFontStruct*)font; if(fs->per_char){ register FXuchar row=ch>>8; register FXuchar col=ch&255; if(fs->min_char_or_byte2<=col && col<=fs->max_char_or_byte2 && fs->min_byte1<=row && row<=fs->max_byte1){ register const XCharStruct *cm=fs->per_char+((row-fs->min_byte1)*(fs->max_char_or_byte2-fs->min_char_or_byte2+1))+(col-fs->min_char_or_byte2); if(cm->width || cm->ascent || cm->descent) return cm->rbearing; } return fs->per_char[((fs->default_char>>8)-fs->min_byte1)*(fs->max_char_or_byte2-fs->min_char_or_byte2+1)+((fs->default_char&255)-fs->min_char_or_byte2)].rbearing; } return fs->min_bounds.rbearing; #endif } return 0; } // Is it a mono space font FXbool FXFont::isFontMono() const { if(font){ #if defined(WIN32) ///// WIN32 ///// return !(((TEXTMETRIC*)font)->tmPitchAndFamily&TMPF_FIXED_PITCH); #elif defined(HAVE_XFT_H) ///// XFT ///// XGlyphInfo i_extents,m_extents; XftTextExtents8(DISPLAY(getApp()),(XftFont*)font,(const FcChar8*)"i",1,&i_extents); // FIXME better than before but no cigar yet XftTextExtents8(DISPLAY(getApp()),(XftFont*)font,(const FcChar8*)"M",1,&m_extents); return i_extents.xOff==m_extents.xOff; #else ///// XLFD ///// return ((XFontStruct*)font)->min_bounds.width == ((XFontStruct*)font)->max_bounds.width; #endif } return TRUE; } // Get font width FXint FXFont::getFontWidth() const { if(font){ #if defined(WIN32) ///// WIN32 ///// return ((TEXTMETRIC*)font)->tmMaxCharWidth; #elif defined(HAVE_XFT_H) ///// XFT ///// return ((XftFont*)font)->max_advance_width; #else ///// XLFD ///// return ((XFontStruct*)font)->max_bounds.width; #endif } return 1; } // Get font height FXint FXFont::getFontHeight() const { if(font){ #if defined(WIN32) ///// WIN32 ///// return ((TEXTMETRIC*)font)->tmHeight; #elif defined(HAVE_XFT_H) ///// XFT ///// return ((XftFont*)font)->ascent+((XftFont*)font)->descent; #else ///// XLFD ///// return ((XFontStruct*)font)->ascent+((XFontStruct*)font)->descent; #endif } return 1; } // Get font ascent FXint FXFont::getFontAscent() const { if(font){ #if defined(WIN32) ///// WIN32 ///// return ((TEXTMETRIC*)font)->tmAscent; #elif defined(HAVE_XFT_H) ///// XFT ///// return ((XftFont*)font)->ascent; #else ///// XLFD ///// return ((XFontStruct*)font)->ascent; #endif } return 1; } // Get font descent FXint FXFont::getFontDescent() const { if(font){ #if defined(WIN32) ///// WIN32 ///// return ((TEXTMETRIC*)font)->tmDescent; #elif defined(HAVE_XFT_H) ///// XFT ///// return ((XftFont*)font)->descent; #else ///// XLFD ///// return ((XFontStruct*)font)->descent; #endif } return 0; } // Calculate width of single wide character in this font FXint FXFont::getCharWidth(const FXwchar ch) const { if(font){ #if defined(WIN32) ///// WIN32 ///// FXnchar sbuffer[2]; SIZE size; sbuffer[0]=ch; if(0xFFFF>10)+LEAD_OFFSET; sbuffer[1]=(ch&0x3FF)+0xDC00; GetTextExtentPoint32W((HDC)dc,sbuffer,2,&size); return size.cx; } GetTextExtentPoint32W((HDC)dc,sbuffer,1,&size); return size.cx; #elif defined(HAVE_XFT_H) ///// XFT ///// XGlyphInfo extents; XftTextExtents32(DISPLAY(getApp()),(XftFont*)font,(const FcChar32*)&ch,1,&extents); return extents.xOff; #else ///// XLFD ///// register const XFontStruct *fs=(XFontStruct*)font; register FXint width,size; register FXuchar r,c; if(fs->per_char){ r=ch>>8; c=ch&255; size=(fs->max_char_or_byte2-fs->min_char_or_byte2+1); if(fs->min_char_or_byte2<=c && c<=fs->max_char_or_byte2 && fs->min_byte1<=r && r<=fs->max_byte1){ width=fs->per_char[(r-fs->min_byte1)*size+(c-fs->min_char_or_byte2)].width; if(width) return width; } r=fs->default_char>>8; c=fs->default_char&255; if(fs->min_char_or_byte2<=c && c<=fs->max_char_or_byte2 && fs->min_byte1<=r && r<=fs->max_byte1){ return fs->per_char[(r-fs->min_byte1)*size+(c-fs->min_char_or_byte2)].width; } } return fs->min_bounds.width; #endif } return 1; } // Text width FXint FXFont::getTextWidth(const FXchar *string,FXuint length) const { if(!string && length){ fxerror("%s::getTextWidth: NULL string argument\n",getClassName()); } if(font){ #if defined(WIN32) ///// WIN32 ///// FXnchar sbuffer[4096]; FXASSERT(dc!=NULL); FXint count=utf2ncs(sbuffer,string,FXMIN(length,4096)); FXASSERT(count<=length); SIZE size; GetTextExtentPoint32W((HDC)dc,sbuffer,count,&size); return size.cx; #elif defined(HAVE_XFT_H) ///// XFT ///// XGlyphInfo extents; // This returns rotated metrics; FOX likes to work with unrotated metrics, so if angle // is not 0, we calculate the unrotated baseline; note however that the calculation is // not 100% pixel exact when the angle is not a multiple of 90 degrees. XftTextExtentsUtf8(DISPLAY(getApp()),(XftFont*)font,(const FcChar8*)string,length,&extents); if(angle){ return (FXint)(0.5+sqrt(extents.xOff*extents.xOff+extents.yOff*extents.yOff)); } return extents.xOff; #else ///// XLFD ///// register const XFontStruct *fs=(XFontStruct*)font; register FXint defwidth=fs->min_bounds.width; register FXint width=0,ww; register FXuint p=0; register FXuint s; register FXuchar r; register FXuchar c; register FXwchar w; if(fs->per_char){ r=fs->default_char>>8; c=fs->default_char&255; s=(fs->max_char_or_byte2-fs->min_char_or_byte2+1); if(fs->min_char_or_byte2<=c && c<=fs->max_char_or_byte2 && fs->min_byte1<=r && r<=fs->max_byte1){ defwidth=fs->per_char[(r-fs->min_byte1)*s+(c-fs->min_char_or_byte2)].width; } while(p>8; c=w&255; if(fs->min_char_or_byte2<=c && c<=fs->max_char_or_byte2 && fs->min_byte1<=r && r<=fs->max_byte1){ if((ww=fs->per_char[(r-fs->min_byte1)*s+(c-fs->min_char_or_byte2)].width)!=0){ width+=ww; continue; } } width+=defwidth; } } else{ while(ptmHeight; #elif defined(HAVE_XFT_H) ///// XFT ///// // XGlyphInfo extents; // XftTextExtents8(DISPLAY(getApp()),(XftFont*)font,(const FcChar8*)text,n,&extents); // return extents.height; // TODO: Is this correct? // Patch from ivan.markov@wizcom.bg return ((XftFont*)font)->ascent+((XftFont*)font)->descent; #else ///// XLFD ///// // XCharStruct chst; int dir,asc,desc; // XTextExtents((XFontStruct*)font,string,length,&dir,&asc,&desc,&chst); // return asc+desc; return ((XFontStruct*)font)->ascent+((XFontStruct*)font)->descent; #endif } return 1; } // Text height FXint FXFont::getTextHeight(const FXString& string) const { return getTextHeight(string.text(),string.length()); } /* static FX88591Codec codec_8859_1; static FX88592Codec codec_8859_2; static FX88593Codec codec_8859_3; static FX88594Codec codec_8859_4; static FX88595Codec codec_8859_5; static FX88596Codec codec_8859_6; static FX88597Codec codec_8859_7; static FX88598Codec codec_8859_8; static FX88599Codec codec_8859_9; static FX885910Codec codec_8859_10; static FX885911Codec codec_8859_11; static FX885913Codec codec_8859_13; static FX885914Codec codec_8859_14; static FX885915Codec codec_8859_15; static FX885916Codec codec_8859_16; FXchar sbuffer[4096]; switch(actualEncoding){ case FONTENCODING_ISO_8859_1: count=codec_8859_1.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_2: count=codec_8859_2.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_3: count=codec_8859_3.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_4: count=codec_8859_4.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_5: count=codec_8859_5.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_6: count=codec_8859_6.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_7: count=codec_8859_7.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_8: count=codec_8859_8.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_9: count=codec_8859_9.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_10: count=codec_8859_10.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_11: count=codec_8859_11.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_13: count=codec_8859_13.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_14: count=codec_8859_14.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_15: count=codec_8859_15.utf2mb(sbuffer,4096,string,length); break; case FONTENCODING_ISO_8859_16: count=codec_8859_16.utf2mb(sbuffer,4096,string,length); break; default: count=0; break; } XDrawString(DISPLAY(getApp()),((FXDCWindow*)dc)->surface->id(),(GC)((FXDCWindow*)dc)->ctx,x,y,sbuffer,count); */ /* /// Draw text starting at x,y virtual void drawText(FXDC* dc,FXint x,FXint y,const FXString& string) const; /// Draw text starting at x,y virtual void drawText(FXDC* dc,FXint x,FXint y,const FXchar* string,FXuint length) const; /// Draw text starting at x,y over filled background virtual void drawImageText(FXDC* dc,FXint x,FXint y,const FXString& string) const; /// Draw text starting at x,y over filled background virtual void drawImageText(FXDC* dc,FXint x,FXint y,const FXchar* string,FXuint length) const; #if defined(WIN32) ///// WIN32 ///// // Draw text starting at x,y void FXFont::drawText(FXDC* dc,FXint x,FXint y,const FXchar* string,FXuint length) const { FXnchar sbuffer[4096]; FXint iBkMode=SetBkMode((HDC)dc->ctx,TRANSPARENT); FXint count=utf2ncs(sbuffer,string,FXMIN(length,4096)); FXASSERT(count<=length); TextOutW((HDC)dc->ctx,x,y,sbuffer,count); SetBkMode((HDC)dc->ctx,iBkMode); } #elif defined(HAVE_XFT_H) ///// XFT ///// // Draw text starting at x,y void FXFont::drawText(FXDC* dc,FXint x,FXint y,const FXchar* string,FXuint length) const { XftColor color; color.pixel=((FXDCWindow*)dc)->devfg; color.color.red=FXREDVAL(((FXDCWindow*)dc)->fg)*257; color.color.green=FXGREENVAL(((FXDCWindow*)dc)->fg)*257; color.color.blue=FXBLUEVAL(((FXDCWindow*)dc)->fg)*257; color.color.alpha=FXALPHAVAL(((FXDCWindow*)dc)->fg)*257; XftDrawStringUtf8((XftDraw*)((FXDCWindow*)dc)->xftDraw,&color,(XftFont*)((FXDCWindow*)dc)->font->font,x,y,(const FcChar8*)string,length); } #else ///// XLFD ///// static FXint utf2db(XChar2b *dst,const FXchar *src,FXint n){ register FXint len,p; register FXwchar w; for(p=len=0; p>8); dst[len].byte2=(w&255); } return len; } // Draw text starting at x,y void FXFont::drawText(FXDC* dc,FXint x,FXint y,const FXchar* string,FXuint length) const { register const XFontStruct *fs=(XFontStruct*)font; register FXint count,escapement,defwidth,ww,size,i; register FXdouble ang,ux,uy; register FXuchar r,c; XChar2b sbuffer[4096]; count=utf2db(sbuffer,string,FXMIN(length,4096)); FXASSERT(count<=length); if(angle){ ang=angle*0.00027270769562411399179; defwidth=fs->min_bounds.width; ux=cos(ang); uy=sin(ang); if(fs->per_char){ r=fs->default_char>>8; c=fs->default_char&255; size=(fs->max_char_or_byte2-fs->min_char_or_byte2+1); if(fs->min_char_or_byte2<=c && c<=fs->max_char_or_byte2 && fs->min_byte1<=r && r<=fs->max_byte1){ defwidth=fs->per_char[(r-fs->min_byte1)*size+(c-fs->min_char_or_byte2)].width; } for(i=escapement=0; isurface->id(),(GC)((FXDCWindow*)dc)->ctx,(FXint)(x+escapement*ux),(FXint)(y-escapement*uy),&sbuffer[i],1); r=sbuffer[i].byte1; c=sbuffer[i].byte2; escapement+=defwidth; if(fs->min_char_or_byte2<=c && c<=fs->max_char_or_byte2 && fs->min_byte1<=r && r<=fs->max_byte1){ if((ww=fs->per_char[(r-fs->min_byte1)*size+(c-fs->min_char_or_byte2)].width)!=0) escapement+=ww-defwidth; } } } else{ for(i=escapement=0; isurface->id(),(GC)((FXDCWindow*)dc)->ctx,(FXint)(x+escapement*ux),(FXint)(y-escapement*uy),&sbuffer[i],1); escapement+=defwidth; } } } else{ XDrawString16(DISPLAY(getApp()),((FXDCWindow*)dc)->surface->id(),(GC)((FXDCWindow*)dc)->ctx,x,y,sbuffer,count); } } #endif // Draw text starting at x,y void FXFont::drawText(FXDC* dc,FXint x,FXint y,const FXString& string) const { drawText(dc,x,y,string.text(),string.length()); } // Draw text starting at x,y over filled background void FXFont::drawImageText(FXDC* dc,FXint x,FXint y,const FXchar* string,FXuint length) const { // ... } // Draw text starting at x,y over filled background void FXFont::drawImageText(FXDC* dc,FXint x,FXint y,const FXString& string) const { drawImageText(dc,x,y,string.text(),string.length()); } */ /*******************************************************************************/ // Function to sort by name, weight, slant, and size static int comparefont(const void *a,const void *b){ register FXFontDesc *fa=(FXFontDesc*)a; register FXFontDesc *fb=(FXFontDesc*)b; register FXint cmp=strcmp(fa->face,fb->face); return cmp ? cmp : (fa->weight!=fb->weight) ? fa->weight-fb->weight : (fa->slant!=fb->slant) ? fa->slant-fb->slant : fa->size-fb->size; } #if defined(WIN32) /////// MS-Windows /////// // List all fonts matching hints FXbool FXFont::listFonts(FXFontDesc*& fonts,FXuint& numfonts,const FXString& face,FXuint wt,FXuint sl,FXuint sw,FXuint en,FXuint h){ register FXuint i,j; // Initialize return values fonts=NULL; numfonts=0; // This data gets passed into the callback function FXFontStore fontStore; HDC hdc=GetDC(GetDesktopWindow()); SaveDC(hdc); fontStore.hdc=hdc; fontStore.fonts=fonts; fontStore.numfonts=numfonts; fontStore.desc.weight=wt; fontStore.desc.slant=sl; fontStore.desc.setwidth=sw; fontStore.desc.encoding=en; fontStore.desc.flags=h; // Fill in the appropriate fields of the LOGFONT structure. Note that // EnumFontFamiliesEx() only examines the lfCharSet, lfFaceName and // lpPitchAndFamily fields of this struct. LOGFONTA lf; lf.lfHeight=0; lf.lfWidth=0; lf.lfEscapement=0; lf.lfOrientation=0; lf.lfWeight=0; lf.lfItalic=0; lf.lfUnderline=0; lf.lfStrikeOut=0; lf.lfCharSet=FXFontEncoding2CharSet(en); lf.lfOutPrecision=0; lf.lfClipPrecision=0; lf.lfQuality=0; lf.lfPitchAndFamily=0; // Should be MONO_FONT for Hebrew and Arabic? FXASSERT(face.length()reg().readUnsignedEntry("SETTINGS","screenres",100); // Build object set objset=FcObjectSetBuild(FC_FAMILY,FC_FOUNDRY,FC_SPACING,FC_SCALABLE,FC_WIDTH,FC_WEIGHT,FC_SLANT,FC_PIXEL_SIZE,NULL); if(objset){ // Create pattern object pattern=FcPatternCreate(); if(pattern){ // Set family if(!family.empty()){ FcPatternAddString(pattern,FC_FAMILY,(const FcChar8*)family.text()); } // Set foundry if(!foundry.empty()){ FcPatternAddString(pattern,FC_FOUNDRY,(const FcChar8*)foundry.text()); } // If we set this we get no fonts // if(h&FXFont::Rotatable){ // const FcMatrix matrix={1.0,0.0,0.0,1.0}; // FcPatternAddMatrix(pattern,FC_MATRIX,&matrix); // } // List fonts matching pattern fontset=FcFontList(0,pattern,objset); if(fontset && 0nfont){ // Allocate return array if(FXMALLOC(&fonts,FXFontDesc,fontset->nfont)){ // Collect the info now... for(i=0; infont; i++){ p=fontset->fonts[i]; // Get full face name fullname[0]=0; if(FcPatternGetString(p,FC_FAMILY,0,&fam)==FcResultMatch){ strcpy(fullname,(const char*)fam); if(FcPatternGetString(p,FC_FOUNDRY,0,&fdy)==FcResultMatch){ strcat(fullname," ["); strcat(fullname,(const char*)fdy); strcat(fullname,"]"); } } // Get setwidth setwidth=0; if(FcPatternGetInteger(p,FC_WIDTH,0,&setwidth)==FcResultMatch){ setwidth=fcSetWidth2SetWidth(setwidth); } // Get weight weight=0; if(FcPatternGetInteger(p,FC_WEIGHT,0,&weight)==FcResultMatch){ weight=fcWeight2Weight(weight); } // Get slant slant=0; if(FcPatternGetInteger(p,FC_SLANT,0,&slant)==FcResultMatch){ slant=fcSlant2Slant(slant); } // Get pitch pitch=FXFont::Variable; if(FcPatternGetInteger(p,FC_SPACING,0,&pitch)==FcResultMatch){ // if(pitch==FC_MONO || pitch==FC_DUAL || pitch==FC_CHARCELL) pitch=FXFont::Fixed; if(pitch==FC_MONO || pitch==FC_CHARCELL) pitch=FXFont::Fixed; } // Pixel size works for both bitmap and scalable fonts size=0; if(FcPatternGetDouble(p,FC_PIXEL_SIZE,0,&points)==FcResultMatch){ size=(int)((720.0*points)/res); } // Get scalable flag scalable=0; if(FcPatternGetBool(p,FC_SCALABLE,0,&scale)==FcResultMatch){ if(scale) scalable=FXFont::Scalable; } // Get charset if(FcPatternGetCharSet(p,FC_CHARSET,0,&charset)==FcResultMatch){ // FIXME } // Get the encoding encoding=FONTENCODING_UNICODE; FXTRACE((160,"wt=%2d sl=%d sw=%3d en=%5d sz=%3d sc=%4x pi=%d name=%s\n",weight,slant,setwidth,encoding,size,scalable,pitch,fullname)); // Skip if pitch does not match if((h&FXFont::Fixed) && (pitch!=FXFont::Fixed)) continue; if((h&FXFont::Variable) && (pitch!=FXFont::Variable)) continue; // Skip if weight does not match if((wt!=0) && (wt!=weight)) continue; // Skip if slant does not match if((sl!=0) && (sl!=slant)) continue; // Skip if setwidth does not match if((sw!=0) && (sw!=setwidth)) continue; // Want scalable if((h&FXFont::Scalable) && (scalable!=FXFont::Scalable)) continue; // If NULL face name, just list one of each face if(family.empty()){ for(j=numfonts-1; j>=0; j--){ if(strcmp(fullname,fonts[j].face)==0) goto next; } } // Add this font strncpy(fonts[numfonts].face,fullname,116); fonts[numfonts].size=size; fonts[numfonts].weight=weight; fonts[numfonts].slant=slant; fonts[numfonts].encoding=encoding; fonts[numfonts].setwidth=setwidth; fonts[numfonts].flags=pitch|scalable; numfonts++; // Next font next: continue; } // Realloc to shrink the block FXRESIZE(&fonts,FXFontDesc,numfonts); // Sort them by name, weight, slant, and size respectively ::qsort(fonts,numfonts,sizeof(FXFontDesc),comparefont); } FcFontSetDestroy(fontset); } FcPatternDestroy(pattern); } FcObjectSetDestroy(objset); } return (0reg().readUnsignedEntry("SETTINGS","screenres",100); // Get family part of name family=face.before('[').trimEnd(); // Get foundry part of name foundry=face.section("[]",1); FXTRACE((150,"FXFont::listFonts: family=\"%s\" foundry=\"%s\" weight=%d slant=%d setwidth=%d encoding=%d hints=%x\n",family.text(),foundry.text(),wt,sl,sw,en,h)); // Match RAW X11 if(h&FXFont::X11){ sprintf(candidate,"%s",face.empty()?"*":face.text()); } // Match XLFD else{ sprintf(candidate,"-%s-%s-*-*-*-*-*-%s-*-*-*-*-*-*",foundry.empty() ? "*" : foundry.text(),family.empty() ? "*" : family.text(),(h&FXFont::Rotatable) ? "[1 0 0 1]" : "*"); } // Get fonts matching the pattern fontnames=XListFonts(DISPLAY(FXApp::instance()),candidate,65535,&nfontnames); if(fontnames && 0=0; j--){ if(strcmp(fullname,fonts[j].face)==0) goto next; } } // Add this font strncpy(fonts[numfonts].face,fullname,116); fonts[numfonts].size=size; fonts[numfonts].weight=weight; fonts[numfonts].slant=slant; fonts[numfonts].encoding=encoding; fonts[numfonts].setwidth=setwidth; fonts[numfonts].flags=pitch|scalable|polymorph|rotatable; numfonts++; // Next font next: continue; } // Free the list XFreeFontNames(fontnames); // Realloc to shrink the block FXRESIZE(&fonts,FXFontDesc,numfonts); // Sort them by name, weight, slant, and size respectively ::qsort(fonts,numfonts,sizeof(FXFontDesc),comparefont); } return (0> wantedName; store >> wantedSize; store >> wantedWeight; store >> wantedSlant; store >> wantedSetwidth; store >> wantedEncoding; store >> angle; store >> hints; store >> angle; } // Clean up FXFont::~FXFont(){ FXTRACE((100,"FXFont::~FXFont %p\n",this)); destroy(); } } fox1.6-1.6.57/src/FXFontDialog.cpp000066400000000000000000000073141326741342000164210ustar00rootroot00000000000000/******************************************************************************** * * * F o n t S e l e c t i o n D i a l o g * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFontDialog.cpp,v 1.23 2006/01/22 17:58:27 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXFont.h" #include "FXDrawable.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXButton.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXShell.h" #include "FXTopWindow.h" #include "FXDialogBox.h" #include "FXFontSelector.h" #include "FXFontDialog.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXFontDialog,FXDialogBox,NULL,0) // Separator item FXFontDialog::FXFontDialog(FXWindow* owner,const FXString& name,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(owner,name,opts|DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,x,y,w,h,0,0,0,0,4,4){ fontbox=new FXFontSelector(this,NULL,0,LAYOUT_FILL_X|LAYOUT_FILL_Y); fontbox->acceptButton()->setTarget(this); fontbox->acceptButton()->setSelector(FXDialogBox::ID_ACCEPT); fontbox->cancelButton()->setTarget(this); fontbox->cancelButton()->setSelector(FXDialogBox::ID_CANCEL); } // Save data void FXFontDialog::save(FXStream& store) const { FXDialogBox::save(store); store << fontbox; } // Load data void FXFontDialog::load(FXStream& store){ FXDialogBox::load(store); store >> fontbox; } // Change the selected font void FXFontDialog::setFontSelection(const FXFontDesc& fontdesc){ fontbox->setFontSelection(fontdesc); } // Return the selected font void FXFontDialog::getFontSelection(FXFontDesc& fontdesc) const { fontbox->getFontSelection(fontdesc); } // Cleanup FXFontDialog::~FXFontDialog(){ fontbox=(FXFontSelector*)-1L; } } fox1.6-1.6.57/src/FXFontSelector.cpp000066400000000000000000000600461326741342000170030ustar00rootroot00000000000000/******************************************************************************** * * * F o n t S e l e c t i o n B o x * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFontSelector.cpp,v 1.55 2006/01/22 17:58:27 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXObjectList.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXId.h" #include "FXFont.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXIcon.h" #include "FXGIFIcon.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXTextField.h" #include "FXButton.h" #include "FXCheckButton.h" #include "FXMenuButton.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXVerticalFrame.h" #include "FXHorizontalFrame.h" #include "FXMatrix.h" #include "FXCanvas.h" #include "FXShell.h" #include "FXScrollBar.h" #include "FXScrollArea.h" #include "FXScrollWindow.h" #include "FXList.h" #include "FXComboBox.h" #include "FXFontSelector.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXFontSelector) FXFontSelectorMap[]={ FXMAPFUNC(SEL_COMMAND,FXFontSelector::ID_FAMILY,FXFontSelector::onCmdFamily), FXMAPFUNC(SEL_COMMAND,FXFontSelector::ID_WEIGHT,FXFontSelector::onCmdWeight), FXMAPFUNC(SEL_COMMAND,FXFontSelector::ID_SIZE,FXFontSelector::onCmdSize), FXMAPFUNC(SEL_COMMAND,FXFontSelector::ID_SIZE_TEXT,FXFontSelector::onCmdSizeText), FXMAPFUNC(SEL_COMMAND,FXFontSelector::ID_STYLE,FXFontSelector::onCmdStyle), FXMAPFUNC(SEL_COMMAND,FXFontSelector::ID_STYLE_TEXT,FXFontSelector::onCmdStyleText), FXMAPFUNC(SEL_COMMAND,FXFontSelector::ID_CHARSET,FXFontSelector::onCmdCharset), FXMAPFUNC(SEL_UPDATE,FXFontSelector::ID_CHARSET,FXFontSelector::onUpdCharset), FXMAPFUNC(SEL_COMMAND,FXFontSelector::ID_SETWIDTH,FXFontSelector::onCmdSetWidth), FXMAPFUNC(SEL_UPDATE,FXFontSelector::ID_SETWIDTH,FXFontSelector::onUpdSetWidth), FXMAPFUNC(SEL_COMMAND,FXFontSelector::ID_PITCH,FXFontSelector::onCmdPitch), FXMAPFUNC(SEL_UPDATE,FXFontSelector::ID_PITCH,FXFontSelector::onUpdPitch), FXMAPFUNC(SEL_UPDATE,FXFontSelector::ID_SCALABLE,FXFontSelector::onUpdScalable), FXMAPFUNC(SEL_COMMAND,FXFontSelector::ID_SCALABLE,FXFontSelector::onCmdScalable), FXMAPFUNC(SEL_UPDATE,FXFontSelector::ID_ALLFONTS,FXFontSelector::onUpdAllFonts), FXMAPFUNC(SEL_COMMAND,FXFontSelector::ID_ALLFONTS,FXFontSelector::onCmdAllFonts), }; // Implementation FXIMPLEMENT(FXFontSelector,FXPacker,FXFontSelectorMap,ARRAYNUMBER(FXFontSelectorMap)) /*******************************************************************************/ // Separator item FXFontSelector::FXFontSelector(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXPacker(p,opts,x,y,w,h){ target=tgt; message=sel; // Bottom side FXHorizontalFrame *buttons=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); accept=new FXButton(buttons,tr("&Accept"),NULL,NULL,0,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT,0,0,0,0,20,20); cancel=new FXButton(buttons,tr("&Cancel"),NULL,NULL,0,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT,0,0,0,0,20,20); // Left side FXMatrix *controls=new FXMatrix(this,3,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT,0,0,0,160, DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING, DEFAULT_SPACING,0); // Font families, to be filled later new FXLabel(controls,tr("&Family:"),NULL,JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); family=new FXTextField(controls,10,NULL,0,TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); FXHorizontalFrame *familyframe=new FXHorizontalFrame(controls,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,0,0,0,0, 0,0,0,0); familylist=new FXList(familyframe,this,ID_FAMILY,LIST_BROWSESELECT|LAYOUT_FILL_Y|LAYOUT_FILL_X|HSCROLLER_NEVER|VSCROLLER_ALWAYS); // Initial focus on list familylist->setFocus(); // Font weights new FXLabel(controls,tr("&Weight:"),NULL,JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); weight=new FXTextField(controls,4,NULL,0,TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); FXHorizontalFrame *weightframe=new FXHorizontalFrame(controls,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN,0,0,0,0, 0,0,0,0); weightlist=new FXList(weightframe,this,ID_WEIGHT,LIST_BROWSESELECT|LAYOUT_FILL_Y|LAYOUT_FILL_X|HSCROLLER_NEVER|VSCROLLER_ALWAYS); // Font styles new FXLabel(controls,tr("&Style:"),NULL,JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); style=new FXTextField(controls,6,NULL,0,TEXTFIELD_READONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); FXHorizontalFrame *styleframe=new FXHorizontalFrame(controls,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN,0,0,0,0, 0,0,0,0); stylelist=new FXList(styleframe,this,ID_STYLE,LIST_BROWSESELECT|LAYOUT_FILL_Y|LAYOUT_FILL_X|HSCROLLER_NEVER|VSCROLLER_ALWAYS); // Font sizes, to be filled later new FXLabel(controls,tr("Si&ze:"),NULL,JUSTIFY_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); size=new FXTextField(controls,2,this,ID_SIZE_TEXT,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); FXHorizontalFrame *sizeframe=new FXHorizontalFrame(controls,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW|LAYOUT_FILL_COLUMN,0,0,0,0, 0,0,0,0); sizelist=new FXList(sizeframe,this,ID_SIZE,LIST_BROWSESELECT|LAYOUT_FILL_Y|LAYOUT_FILL_X|HSCROLLER_NEVER|VSCROLLER_ALWAYS); FXMatrix *attributes=new FXMatrix(this,2,LAYOUT_SIDE_TOP|LAYOUT_FILL_X,0,0,0,0, DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING, DEFAULT_SPACING,0); // Character set choice new FXLabel(attributes,tr("Character Set:"),NULL,LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); charset=new FXComboBox(attributes,8,this,ID_CHARSET,COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); charset->setNumVisible(10); charset->appendItem(tr("Any"),(void*)0); charset->appendItem(tr("West European"),(void*)FONTENCODING_WESTEUROPE); charset->appendItem(tr("East European"),(void*)FONTENCODING_EASTEUROPE); charset->appendItem(tr("South European"),(void*)FONTENCODING_SOUTHEUROPE); charset->appendItem(tr("North European"),(void*)FONTENCODING_NORTHEUROPE); charset->appendItem(tr("Cyrillic"),(void*)FONTENCODING_CYRILLIC); charset->appendItem(tr("Arabic"),(void*)FONTENCODING_ARABIC); charset->appendItem(tr("Greek"),(void*)FONTENCODING_GREEK); charset->appendItem(tr("Hebrew"),(void*)FONTENCODING_HEBREW); charset->appendItem(tr("Turkish"),(void*)FONTENCODING_TURKISH); charset->appendItem(tr("Nordic"),(void*)FONTENCODING_NORDIC); charset->appendItem(tr("Thai"),(void*)FONTENCODING_THAI); charset->appendItem(tr("Baltic"),(void*)FONTENCODING_BALTIC); charset->appendItem(tr("Celtic"),(void*)FONTENCODING_CELTIC); charset->appendItem(tr("Russian"),(void*)FONTENCODING_KOI8); charset->appendItem(tr("Central European (cp1250)"),(void*)FONTENCODING_CP1250); charset->appendItem(tr("Russian (cp1251)"),(void*)FONTENCODING_CP1251); charset->appendItem(tr("Latin1 (cp1252)"),(void*)FONTENCODING_CP1252); charset->appendItem(tr("Greek (cp1253)"),(void*)FONTENCODING_CP1253); charset->appendItem(tr("Turkish (cp1254)"),(void*)FONTENCODING_CP1254); charset->appendItem(tr("Hebrew (cp1255)"),(void*)FONTENCODING_CP1255); charset->appendItem(tr("Arabic (cp1256)"),(void*)FONTENCODING_CP1256); charset->appendItem(tr("Baltic (cp1257)"),(void*)FONTENCODING_CP1257); charset->appendItem(tr("Vietnam (cp1258)"),(void*)FONTENCODING_CP1258); charset->appendItem(tr("Thai (cp874)"),(void*)FONTENCODING_CP874); charset->appendItem(tr("UNICODE"),(void*)FONTENCODING_UNICODE); charset->setCurrentItem(0); // Set width new FXLabel(attributes,tr("Set Width:"),NULL,LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); setwidth=new FXComboBox(attributes,9,this,ID_SETWIDTH,COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); setwidth->setNumVisible(10); setwidth->appendItem(tr("Any"),(void*)0); setwidth->appendItem(tr("Ultra condensed"),(void*)FXFont::UltraCondensed); setwidth->appendItem(tr("Extra condensed"),(void*)FXFont::ExtraCondensed); setwidth->appendItem(tr("Condensed"),(void*)FXFont::Condensed); setwidth->appendItem(tr("Semi condensed"),(void*)FXFont::SemiCondensed); setwidth->appendItem(tr("Normal"),(void*)FXFont::NonExpanded); setwidth->appendItem(tr("Semi expanded"),(void*)FXFont::SemiExpanded); setwidth->appendItem(tr("Expanded"),(void*)FXFont::Expanded); setwidth->appendItem(tr("Extra expanded"),(void*)FXFont::ExtraExpanded); setwidth->appendItem(tr("Ultra expanded"),(void*)FXFont::UltraExpanded); setwidth->setCurrentItem(0); // Pitch new FXLabel(attributes,tr("Pitch:"),NULL,LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); pitch=new FXComboBox(attributes,5,this,ID_PITCH,COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); pitch->setNumVisible(3); pitch->appendItem(tr("Any"),(void*)0); pitch->appendItem(tr("Fixed"),(void*)FXFont::Fixed); pitch->appendItem(tr("Variable"),(void*)FXFont::Variable); pitch->setCurrentItem(0); // Check for scalable new FXFrame(attributes,FRAME_NONE|LAYOUT_FILL_COLUMN); scalable=new FXCheckButton(attributes,tr("Scalable:"),this,ID_SCALABLE,JUSTIFY_NORMAL|TEXT_BEFORE_ICON|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); // Check for all (X11) fonts #ifndef WIN32 new FXFrame(attributes,FRAME_NONE|LAYOUT_FILL_COLUMN); allfonts=new FXCheckButton(attributes,tr("All Fonts:"),this,ID_ALLFONTS,JUSTIFY_NORMAL|TEXT_BEFORE_ICON|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN); #else allfonts=NULL; #endif // Preview FXVerticalFrame *bottom=new FXVerticalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING,DEFAULT_SPACING, 0,0); new FXLabel(bottom,tr("Preview:"),NULL,JUSTIFY_LEFT|LAYOUT_FILL_X); FXHorizontalFrame *box=new FXHorizontalFrame(bottom,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0,0,0,0, 0,0,0,0, 0,0); FXScrollWindow *scroll=new FXScrollWindow(box,LAYOUT_FILL_X|LAYOUT_FILL_Y); preview=new FXLabel(scroll,"ABCDEFGHIJKLMNOPQRSTUVWXYZ\nabcdefghijklmnopqrstuvwxyz\n0123456789",NULL,JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y); preview->setBackColor(getApp()->getBackColor()); strncpy(selected.face,"helvetica",sizeof(selected.face)); selected.size=90; selected.weight=FXFont::Bold; selected.slant=0; selected.encoding=FONTENCODING_USASCII; selected.setwidth=0; selected.flags=0; previewfont=NULL; } // List the fonts when created void FXFontSelector::create(){ FXPacker::create(); listFontFaces(); listWeights(); listSlants(); listFontSizes(); } // Fill the list with face names void FXFontSelector::listFontFaces(){ FXFontDesc *fonts; FXuint numfonts,f; FXint selindex=-1; familylist->clearItems(); family->setText(""); if(FXFont::listFonts(fonts,numfonts,FXString::null,0,0,selected.setwidth,selected.encoding,selected.flags)){ FXASSERT(0appendItem(fonts[f].face,NULL,(void*)(FXuval)fonts[f].flags); if(strcmp(selected.face,fonts[f].face)==0) selindex=f; } if(selindex==-1) selindex=0; if(0getNumItems()){ familylist->setCurrentItem(selindex); familylist->makeItemVisible(selindex); family->setText(familylist->getItemText(selindex)); strncpy(selected.face,familylist->getItemText(selindex).text(),sizeof(selected.face)); } FXFREE(&fonts); } } // Fill the list with font weights void FXFontSelector::listWeights(){ FXFontDesc *fonts; FXuint numfonts,f,ww,lastww; const FXchar *wgt; FXint selindex=-1; weightlist->clearItems(); weight->setText(""); if(FXFont::listFonts(fonts,numfonts,selected.face,0,0,selected.setwidth,selected.encoding,selected.flags)){ FXASSERT(0appendItem(tr(wgt),NULL,(void*)(FXuval)ww); // Remember if this was the current selection if(selected.weight==ww) selindex=weightlist->getNumItems()-1; lastww=ww; } } if(selindex==-1) selindex=0; if(0getNumItems()){ weightlist->setCurrentItem(selindex); weightlist->makeItemVisible(selindex); weight->setText(weightlist->getItemText(selindex)); selected.weight=(FXuint)(FXuval)weightlist->getItemData(selindex); } FXFREE(&fonts); } } // Fill the list with font slants void FXFontSelector::listSlants(){ FXFontDesc *fonts; FXuint numfonts,f,s,lasts; const FXchar *slt; FXint selindex=-1; stylelist->clearItems(); style->setText(""); if(FXFont::listFonts(fonts,numfonts,selected.face,selected.weight,0,selected.setwidth,selected.encoding,selected.flags)){ FXASSERT(0appendItem(tr(slt),NULL,(void*)(FXuval)s); // Remember if this was the current selection if(selected.slant == s) selindex=stylelist->getNumItems()-1; lasts=s; } } if(selindex==-1) selindex=0; if(0getNumItems()){ stylelist->setCurrentItem(selindex); stylelist->makeItemVisible(selindex); style->setText(stylelist->getItemText(selindex)); selected.slant=(FXuint)(FXuval)stylelist->getItemData(selindex); } FXFREE(&fonts); } } // Fill the list with font sizes void FXFontSelector::listFontSizes(){ const FXuint sizeint[]={60,80,90,100,110,120,140,160,200,240,300,360,420,480,640}; FXFontDesc *fonts; FXuint numfonts,f,s,lasts; FXint selindex=-1; sizelist->clearItems(); size->setText(""); FXString string; if(FXFont::listFonts(fonts,numfonts,selected.face,selected.weight,selected.slant,selected.setwidth,selected.encoding,selected.flags)){ FXASSERT(0appendItem(string,NULL,(void*)(FXuval)s); if(selected.size == s) selindex=sizelist->getNumItems()-1; lasts=s; } } else{ for(f=0; fappendItem(string,NULL,(void*)(FXuval)s); if(selected.size == s) selindex=sizelist->getNumItems()-1; lasts=s; } } } if(selindex==-1) selindex=0; if(0getNumItems()){ sizelist->setCurrentItem(selindex); sizelist->makeItemVisible(selindex); size->setText(sizelist->getItemText(selindex)); selected.size=(FXuint)(FXuval)sizelist->getItemData(selindex); } FXFREE(&fonts); } } // Preview void FXFontSelector::previewFont(){ FXFont *old; // Save old font old=previewfont; // Get new font previewfont=new FXFont(getApp(),selected); // Realize new font previewfont->create(); // Set new font preview->setFont(previewfont); // Delete old font delete old; } // Selected font family long FXFontSelector::onCmdFamily(FXObject*,FXSelector,void* ptr){ strncpy(selected.face,familylist->getItemText((FXint)(FXival)ptr).text(),sizeof(selected.face)); family->setText(selected.face); listWeights(); listSlants(); listFontSizes(); previewFont(); return 1; } // Changed weight setting long FXFontSelector::onCmdWeight(FXObject*,FXSelector,void* ptr){ selected.weight=(FXuint)(FXuval)weightlist->getItemData((FXint)(FXival)ptr); weight->setText(weightlist->getItemText((FXint)(FXival)ptr)); listSlants(); listFontSizes(); previewFont(); return 1; } // User clicked up directory button long FXFontSelector::onCmdSize(FXObject*,FXSelector,void* ptr){ selected.size=(FXuint)(FXuval)sizelist->getItemData((FXint)(FXival)ptr); size->setText(sizelist->getItemText((FXint)(FXival)ptr)); previewFont(); return 1; } // User clicked up directory button long FXFontSelector::onCmdSizeText(FXObject*,FXSelector,void*){ selected.size=(FXuint)(10.0*FXFloatVal(size->getText())); if(selected.size<60) selected.size=60; if(selected.size>2400) selected.size=2400; previewFont(); return 1; } // User clicked up directory button long FXFontSelector::onCmdStyle(FXObject*,FXSelector,void* ptr){ selected.slant=(FXuint)(FXuval)stylelist->getItemData((FXint)(FXival)ptr); style->setText(stylelist->getItemText((FXint)(FXival)ptr)); listFontSizes(); previewFont(); return 1; } // Style type in long FXFontSelector::onCmdStyleText(FXObject*,FXSelector,void*){ return 1; } // Character set long FXFontSelector::onCmdCharset(FXObject*,FXSelector,void*){ FXint index=charset->getCurrentItem(); FXuint enc=(FXuint)(FXuval)charset->getItemData(index); selected.encoding=(FXFontEncoding)enc; listFontFaces(); listWeights(); listSlants(); listFontSizes(); previewFont(); return 1; } // Update character set long FXFontSelector::onUpdCharset(FXObject*,FXSelector,void*){ charset->setCurrentItem(charset->findItemByData((void*)(FXuval)selected.encoding)); return 1; } // Changed set width long FXFontSelector::onCmdSetWidth(FXObject*,FXSelector,void*){ FXint index=setwidth->getCurrentItem(); selected.setwidth=(FXuint)(FXuval)setwidth->getItemData(index); listFontFaces(); listWeights(); listSlants(); listFontSizes(); previewFont(); return 1; } // Update set width long FXFontSelector::onUpdSetWidth(FXObject*,FXSelector,void*){ setwidth->setCurrentItem(setwidth->findItemByData((void*)(FXuval)selected.setwidth)); return 1; } // Changed pitch long FXFontSelector::onCmdPitch(FXObject*,FXSelector,void*){ FXint index=pitch->getCurrentItem(); selected.flags&=~(FXFont::Fixed|FXFont::Variable); selected.flags|=(FXuint)(FXuval)pitch->getItemData(index); listFontFaces(); listWeights(); listSlants(); listFontSizes(); previewFont(); return 1; } // Update pitch long FXFontSelector::onUpdPitch(FXObject*,FXSelector,void*){ pitch->setCurrentItem((selected.flags&FXFont::Fixed) ? 1 : (selected.flags&FXFont::Variable) ? 2 : 0); return 1; } // Scalable toggle long FXFontSelector::onCmdScalable(FXObject*,FXSelector,void* ptr){ if(ptr) selected.flags|=FXFont::Scalable; else selected.flags&=~FXFont::Scalable; listFontFaces(); listWeights(); listSlants(); listFontSizes(); previewFont(); return 1; } // Update scalable toggle long FXFontSelector::onUpdScalable(FXObject*,FXSelector,void*){ scalable->setCheck((selected.flags&FXFont::Scalable)!=0); return 1; } // All fonts toggle long FXFontSelector::onCmdAllFonts(FXObject*,FXSelector,void* ptr){ if(ptr) selected.flags|=FXFont::X11; else selected.flags&=~FXFont::X11; listFontFaces(); listWeights(); listSlants(); listFontSizes(); previewFont(); return 1; } // Update all fonts toggle long FXFontSelector::onUpdAllFonts(FXObject*,FXSelector,void*){ allfonts->setCheck((selected.flags&FXFont::X11)!=0); return 1; } // Change font selection void FXFontSelector::setFontSelection(const FXFontDesc& fontdesc){ selected=fontdesc; // Validate these numbers if(selected.encoding>FONTENCODING_UNICODE){ selected.encoding=FONTENCODING_UNICODE; } if(selected.slant>FXFont::ReverseOblique){ selected.slant=FXFont::ReverseOblique; } if(selected.weight>FXFont::Black){ selected.weight=FXFont::Black; } if(selected.setwidth>FXFont::UltraExpanded){ selected.setwidth=FXFont::UltraExpanded; } if(selected.size>10000){ selected.size=10000; } // Under Windows, this should be OFF selected.flags&=~FXFont::X11; // Relist fonts listFontFaces(); listWeights(); listSlants(); listFontSizes(); // Update preview previewFont(); } // Change font selection void FXFontSelector::getFontSelection(FXFontDesc& fontdesc) const { fontdesc=selected; } // Save data void FXFontSelector::save(FXStream& store) const { FXPacker::save(store); store << family; store << familylist; store << weight; store << weightlist; store << style; store << stylelist; store << size; store << sizelist; store << charset; store << setwidth; store << pitch; store << scalable; store << allfonts; store << accept; store << cancel; store << preview; store << previewfont; } // Load data void FXFontSelector::load(FXStream& store){ FXPacker::load(store); store >> family; store >> familylist; store >> weight; store >> weightlist; store >> style; store >> stylelist; store >> size; store >> sizelist; store >> charset; store >> setwidth; store >> pitch; store >> scalable; store >> allfonts; store >> accept; store >> cancel; store >> preview; store >> previewfont; } // Cleanup FXFontSelector::~FXFontSelector(){ delete previewfont; family=(FXTextField*)-1L; familylist=(FXList*)-1L; weight=(FXTextField*)-1L; weightlist=(FXList*)-1L; style=(FXTextField*)-1L; stylelist=(FXList*)-1L; size=(FXTextField*)-1L; sizelist=(FXList*)-1L; charset=(FXComboBox*)-1L; setwidth=(FXComboBox*)-1L; pitch=(FXComboBox*)-1L; scalable=(FXCheckButton*)-1L; allfonts=(FXCheckButton*)-1L; preview=(FXLabel*)-1L; previewfont=(FXFont*)-1L; accept=(FXButton*)-1L; cancel=(FXButton*)-1L; } } fox1.6-1.6.57/src/FXFrame.cpp000066400000000000000000000226661326741342000154340ustar00rootroot00000000000000/******************************************************************************** * * * F r a m e W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXFrame.cpp,v 1.37 2006/01/22 17:58:27 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFrame.h" /* Notes: - This really should become the base class for everything that has a border. */ // Frame styles #define FRAME_MASK (FRAME_SUNKEN|FRAME_RAISED|FRAME_THICK) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXFrame) FXFrameMap[]={ FXMAPFUNC(SEL_PAINT,0,FXFrame::onPaint), }; // Object implementation FXIMPLEMENT(FXFrame,FXWindow,FXFrameMap,ARRAYNUMBER(FXFrameMap)) // Deserialization FXFrame::FXFrame(){ flags|=FLAG_SHOWN; baseColor=0; hiliteColor=0; shadowColor=0; borderColor=0; border=0; } // Create child frame window FXFrame::FXFrame(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXWindow(p,opts,x,y,w,h){ flags|=FLAG_SHOWN; backColor=getApp()->getBaseColor(); baseColor=getApp()->getBaseColor(); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); borderColor=getApp()->getBorderColor(); padtop=pt; padbottom=pb; padleft=pl; padright=pr; border=(options&FRAME_THICK)?2:(options&(FRAME_SUNKEN|FRAME_RAISED))?1:0; } // Get default width FXint FXFrame::getDefaultWidth(){ return padleft+padright+(border<<1); } // Get default height FXint FXFrame::getDefaultHeight(){ return padtop+padbottom+(border<<1); } void FXFrame::drawBorderRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(borderColor); dc.drawRectangle(x,y,w-1,h-1); } void FXFrame::drawRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ if(0(ptr); FXDCWindow dc(this,event); dc.setForeground(backColor); dc.fillRectangle(border,border,width-(border<<1),height-(border<<1)); drawFrame(dc,0,0,width,height); return 1; } // Change frame border style void FXFrame::setFrameStyle(FXuint style){ FXuint opts=(options&~FRAME_MASK) | (style&FRAME_MASK); if(options!=opts){ FXint b=(opts&FRAME_THICK) ? 2 : (opts&(FRAME_SUNKEN|FRAME_RAISED)) ? 1 : 0; options=opts; if(border!=b){ border=b; recalc(); } update(); } } // Get frame style FXuint FXFrame::getFrameStyle() const { return (options&FRAME_MASK); } // Set base color void FXFrame::setBaseColor(FXColor clr){ if(clr!=baseColor){ baseColor=clr; update(); } } // Set highlight color void FXFrame::setHiliteColor(FXColor clr){ if(clr!=hiliteColor){ hiliteColor=clr; update(); } } // Set shadow color void FXFrame::setShadowColor(FXColor clr){ if(clr!=shadowColor){ shadowColor=clr; update(); } } // Set border color void FXFrame::setBorderColor(FXColor clr){ if(clr!=borderColor){ borderColor=clr; update(); } } // Change top padding void FXFrame::setPadTop(FXint pt){ if(padtop!=pt){ padtop=pt; recalc(); update(); } } // Change bottom padding void FXFrame::setPadBottom(FXint pb){ if(padbottom!=pb){ padbottom=pb; recalc(); update(); } } // Change left padding void FXFrame::setPadLeft(FXint pl){ if(padleft!=pl){ padleft=pl; recalc(); update(); } } // Change right padding void FXFrame::setPadRight(FXint pr){ if(padright!=pr){ padright=pr; recalc(); update(); } } // Save data void FXFrame::save(FXStream& store) const { FXWindow::save(store); store << baseColor; store << hiliteColor; store << shadowColor; store << borderColor; store << padtop; store << padbottom; store << padleft; store << padright; store << border; } // Load data void FXFrame::load(FXStream& store){ FXWindow::load(store); store >> baseColor; store >> hiliteColor; store >> shadowColor; store >> borderColor; store >> padtop; store >> padbottom; store >> padleft; store >> padright; store >> border; } } fox1.6-1.6.57/src/FXGIFCursor.cpp000066400000000000000000000067631326741342000162050ustar00rootroot00000000000000/******************************************************************************** * * * G I F C u r s o r O b j e c t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Daniel Gehriger. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGIFCursor.cpp,v 1.33 2006/01/22 17:58:27 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXGIFCursor.h" /* Notes: - Tossed old code now that FXCursor has an RGBA representation. - Now uses actual alpha color from the GIF file. - Need function to force alpha channel based on transparent color. - Optionally let system guess a transparancy color based on the corners. - If that doesn't work, you can force a specific transparency color. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXGIFCursor::fileExt[]="gif"; // Object implementation FXIMPLEMENT(FXGIFCursor,FXCursor,NULL,0) // Constructor FXGIFCursor::FXGIFCursor(FXApp* a,const void *pix,FXint hx,FXint hy):FXCursor(a,NULL,0,0,0,0){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); fxloadGIF(ms,data,width,height); hotx=FXCLAMP(0,hx,width-1); hoty=FXCLAMP(0,hy,height-1); options|=CURSOR_OWNED; ms.close(); } } // Save object to stream bool FXGIFCursor::savePixels(FXStream& store) const { if(fxsaveGIF(store,data,width,height)){ return true; } return false; } // Load object from stream bool FXGIFCursor::loadPixels(FXStream& store){ if(options&CURSOR_OWNED){FXFREE(&data);} if(fxloadGIF(store,data,width,height)){ options|=CURSOR_OWNED; return true; } return false; } } fox1.6-1.6.57/src/FXGIFIcon.cpp000066400000000000000000000067721326741342000156200ustar00rootroot00000000000000/******************************************************************************** * * * G I F I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGIFIcon.cpp,v 1.32 2006/01/22 17:58:27 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXGIFIcon.h" /* Notes: - Best is to use the actual alpha color from the GIF file. - Next, one can try the background color from the GIF file. - You can also let the system guess a transparancy color based on the corners. - If that doesn't work, you can force a specific transparency color. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXGIFIcon::fileExt[]="gif"; // Suggested mime type const FXchar FXGIFIcon::mimeType[]="image/gif"; // Object implementation FXIMPLEMENT(FXGIFIcon,FXIcon,NULL,0) // Initialize nicely FXGIFIcon::FXGIFIcon(FXApp* a,const void *pix,FXColor clr,FXuint opts,FXint w,FXint h):FXIcon(a,NULL,clr,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save object to stream bool FXGIFIcon::savePixels(FXStream& store) const { if(fxsaveGIF(store,data,width,height)){ return true; } return false; } // Load object from stream bool FXGIFIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadGIF(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXGIFIcon::~FXGIFIcon(){ } } fox1.6-1.6.57/src/FXGIFImage.cpp000066400000000000000000000063051326741342000157420ustar00rootroot00000000000000/******************************************************************************** * * * G I F I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGIFImage.cpp,v 1.35 2006/01/22 17:58:27 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXGIFImage.h" /* Notes: - Only free image if owned! */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXGIFImage::fileExt[]="gif"; // Suggested mime type const FXchar FXGIFImage::mimeType[]="image/gif"; // Object implementation FXIMPLEMENT(FXGIFImage,FXImage,NULL,0) // Initialize FXGIFImage::FXGIFImage(FXApp* a,const void *pix,FXuint opts,FXint w,FXint h):FXImage(a,NULL,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save object to stream bool FXGIFImage::savePixels(FXStream& store) const { if(fxsaveGIF(store,data,width,height)){ return true; } return false; } // Load object from stream bool FXGIFImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadGIF(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXGIFImage::~FXGIFImage(){ } } fox1.6-1.6.57/src/FXGLCanvas.cpp000066400000000000000000000212071326741342000160260ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L C a n v a s O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLCanvas.cpp,v 1.61 2006/01/22 17:58:27 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXException.h" #include "FXVisual.h" #include "FXGLVisual.h" #include "FXCursor.h" #include "FXGLContext.h" #include "FXGLCanvas.h" /* Notes: - Since this only adds SetPixelFormat, perhaps not a bad idea to contemplate moving this call to SetPixelFormat somewhere else [candidates are FXGLVisual, FXWindow, or FXGLContext]. - We may opt to have GLContext be created just prior to the first use. */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXGLCanvas,FXCanvas,NULL,0) // For serialization FXGLCanvas::FXGLCanvas(){ flags|=FLAG_ENABLED|FLAG_SHOWN; sgnext=this; sgprev=this; ctx=0; } // Make a canvas FXGLCanvas::FXGLCanvas(FXComposite* p,FXGLVisual *vis,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXCanvas(p,tgt,sel,opts,x,y,w,h){ flags|=FLAG_ENABLED|FLAG_SHOWN; visual=vis; sgnext=this; sgprev=this; ctx=0; } // Make a canvas sharing display lists FXGLCanvas::FXGLCanvas(FXComposite* p,FXGLVisual *vis,FXGLCanvas* sharegroup,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXCanvas(p,tgt,sel,opts,x,y,w,h){ flags|=FLAG_ENABLED|FLAG_SHOWN; visual=vis; if(sharegroup){ sgnext=sharegroup; sgprev=sharegroup->sgprev; sharegroup->sgprev=this; sgprev->sgnext=this; } else{ sgnext=this; sgprev=this; } ctx=0; } #ifdef WIN32 const char* FXGLCanvas::GetClass() const { return "FXGLCanvas"; } #endif // Return TRUE if it is sharing display lists FXbool FXGLCanvas::isShared() const { return sgnext!=this; } // Create X window (GL CANVAS) void FXGLCanvas::create(){ FXWindow::create(); #ifdef HAVE_GL_H if(!ctx){ void *sharedctx=NULL; // Must have GL info available if(!visual->getInfo()){ throw FXWindowException("unable to create GL window."); } // Sharing display lists with other context if(sgnext!=this){ // Find another member of the group which is already created, and get its context FXGLCanvas *canvas=sgnext; while(canvas!=this){ sharedctx=canvas->ctx; if(sharedctx) break; canvas=canvas->sgnext; } // The visuals have to match, the book says... if(sgnext->getVisual()!=canvas->getVisual()){ throw FXWindowException("unable to create GL window."); } } #ifndef WIN32 // Make context ctx=glXCreateContext((Display*)getApp()->getDisplay(),(XVisualInfo*)visual->getInfo(),(GLXContext)sharedctx,TRUE); if(!ctx){ throw FXWindowException("unable to create GL window."); } #else // Make that the pixel format of the device context HDC hdc=::GetDC((HWND)xid); if(!SetPixelFormat(hdc,(FXint)(FXival)visual->getVisual(),(PIXELFORMATDESCRIPTOR*)visual->getInfo())){ throw FXWindowException("unable to create GL window."); } // Make context ctx=(void*)wglCreateContext(hdc); if(!ctx){ throw FXWindowException("unable to create GL window."); } // I hope I didn't get this backward; the new context obviously has no // display lists yet, but the old one may have, as it has already been around // for a while. If you see this fail and can't explain why, then that might // be what's going on. Report this to jeroen@fox-toolkit.org if(sharedctx && !wglShareLists((HGLRC)sharedctx,(HGLRC)ctx)){ throw FXWindowException("unable to create GL window."); } ::ReleaseDC((HWND)xid,hdc); #endif } #endif } // Detach the GL Canvas void FXGLCanvas::detach(){ #ifdef HAVE_GL_H if(ctx){ // Will this leak memory? ctx=0; } #endif FXWindow::detach(); } // Destroy the GL Canvas void FXGLCanvas::destroy(){ #ifdef HAVE_GL_H if(ctx){ #ifndef WIN32 glXDestroyContext((Display*)getApp()->getDisplay(),(GLXContext)ctx); #else wglDeleteContext((HGLRC)ctx); #endif ctx=0; } #endif FXWindow::destroy(); } // Make the rendering context of GL Canvas current FXbool FXGLCanvas::makeCurrent(){ #ifdef HAVE_GL_H if(ctx){ #ifndef WIN32 return glXMakeCurrent((Display*)getApp()->getDisplay(),xid,(GLXContext)ctx); #else HDC hdc=::GetDC((HWND)xid); if(visual->colormap){ SelectPalette(hdc,(HPALETTE)visual->colormap,FALSE); RealizePalette(hdc); } BOOL bStatus=wglMakeCurrent(hdc,(HGLRC)ctx); return bStatus; #endif } #endif return FALSE; } // Make the rendering context of GL Canvas current FXbool FXGLCanvas::makeNonCurrent(){ #ifdef HAVE_GL_H if(ctx){ #ifndef WIN32 return glXMakeCurrent((Display*)getApp()->getDisplay(),None,(GLXContext)NULL); #else // According to "Steve Granja" , // ::ReleaseDC is still necessary even for owned DC's. // So release it here to prevent resource leak. ::ReleaseDC((HWND)xid,wglGetCurrentDC()); BOOL bStatus=wglMakeCurrent(NULL,NULL); return bStatus; #endif } #endif return FALSE; } // Return current context, if any void* FXGLCanvas::getCurrentContext(){ #ifdef HAVE_GL_H #ifndef WIN32 return (void*)glXGetCurrentContext(); #else return (void*)wglGetCurrentContext(); #endif #else return NULL; #endif } // Return TRUE if this window's context is current FXbool FXGLCanvas::isCurrent() const { #ifdef HAVE_GL_H if(ctx){ #ifndef WIN32 return (glXGetCurrentContext() == (GLXContext)ctx); #else return (wglGetCurrentContext() == (HGLRC)ctx); #endif } #endif return FALSE; } // Used by GL to swap the buffers in double buffer mode, or flush a single buffer void FXGLCanvas::swapBuffers(){ #ifdef HAVE_GL_H #ifndef WIN32 glXSwapBuffers((Display*)getApp()->getDisplay(),xid); #else // SwapBuffers(wglGetCurrentDC()); // wglSwapLayerBuffers(wglGetCurrentDC(),WGL_SWAP_MAIN_PLANE); HDC hdc=wglGetCurrentDC(); if(wglSwapLayerBuffers(hdc,WGL_SWAP_MAIN_PLANE)==FALSE){ SwapBuffers(hdc); } #endif #endif } // Save object to stream void FXGLCanvas::save(FXStream& store) const { FXWindow::save(store); store << sgnext; store << sgprev; } // Load object from stream void FXGLCanvas::load(FXStream& store){ FXWindow::load(store); store >> sgnext; store >> sgprev; } // Close and release any resources FXGLCanvas::~FXGLCanvas(){ sgnext->sgprev=sgprev; sgprev->sgnext=sgnext; sgnext=(FXGLCanvas*)-1L; sgprev=(FXGLCanvas*)-1L; #ifdef HAVE_GL_H if(ctx){ #ifndef WIN32 glXDestroyContext((Display*)getApp()->getDisplay(),(GLXContext)ctx); #else wglDeleteContext((HGLRC)ctx); #endif } #endif } } fox1.6-1.6.57/src/FXGLCone.cpp000066400000000000000000000120171326741342000154760ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L C o n e O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * Contributed by: Angel-Ventura Mendo Gomez * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLCone.cpp,v 1.28 2006/01/22 17:58:28 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXQuatf.h" #include "FXMat4f.h" #include "FXRangef.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXGLViewer.h" #include "FXGLCone.h" // GLU versions prior to 1.1 have GLUquadric #if !defined(GLU_VERSION_1_1) && !defined(GLU_VERSION_1_2) && !defined(GLU_VERSION_1_3) #define GLUquadricObj GLUquadric #endif // Cone fidelity #define FXGLCONE_SLICES_NUMBER 20 #define FXGLCONE_STACKS_NUMBER 20 #define FXGLCONE_LOOPS 4 using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXGLCone,FXGLShape,NULL,0) // Create cone FXGLCone::FXGLCone():height(1.0f),radius(1.0f){ FXTRACE((100,"FXGLCone::FXGLCone\n")); range.lower.x=-radius; range.upper.x=radius; range.lower.y=0.0f; range.upper.y=height; range.lower.z=-radius; range.upper.z=radius; } // Create cone FXGLCone::FXGLCone(FXfloat x,FXfloat y,FXfloat z,FXfloat h,FXfloat r): FXGLShape(x,y,z,SHADING_SMOOTH|STYLE_SURFACE),height(h),radius(r){ FXTRACE((100,"FXGLCone::FXGLCone\n")); range.lower.x=-radius; range.upper.x=radius; range.lower.y=0.0f; range.upper.y=height; range.lower.z=-radius; range.upper.z=radius; } // Create cone FXGLCone::FXGLCone(FXfloat x,FXfloat y,FXfloat z,FXfloat h, FXfloat r,const FXMaterial& mtl): FXGLShape(x,y,z,SHADING_SMOOTH|STYLE_SURFACE,mtl,mtl),height(h),radius(r){ FXTRACE((100,"FXGLCone::FXGLCone\n")); range.lower.x=-radius; range.upper.x=radius; range.lower.y=0.0f; range.upper.y=height; range.lower.z=-radius; range.upper.z=radius; } // Copy constructor FXGLCone::FXGLCone(const FXGLCone& orig):FXGLShape(orig){ FXTRACE((100,"FXGLCone::FXGLCone\n")); height=orig.height; radius=orig.radius; } // Draw void FXGLCone::drawshape(FXGLViewer*){ #ifdef HAVE_GL_H GLUquadricObj* quad=gluNewQuadric(); gluQuadricDrawStyle(quad,(GLenum)GLU_FILL); /* gluQuadricNormals(quad,(GLenum)GLU_SMOOTH); gluQuadricOrientation(quad,(GLenum)GLU_OUTSIDE); */ glPushMatrix(); glRotatef(-90.0f,1.0f,0.0f,0.0f); gluCylinder(quad,radius,0,height,FXGLCONE_SLICES_NUMBER,FXGLCONE_STACKS_NUMBER); gluQuadricOrientation(quad,(GLenum)GLU_INSIDE); gluDisk(quad,0,radius,FXGLCONE_SLICES_NUMBER,FXGLCONE_LOOPS); gluDeleteQuadric(quad); glPopMatrix(); #endif } // Copy this object FXGLObject* FXGLCone::copy(){ return new FXGLCone(*this); } // Save object to stream void FXGLCone::save(FXStream& store) const { FXGLShape::save(store); store << height << radius; } // Load object from stream void FXGLCone::load(FXStream& store){ FXGLShape::load(store); store >> height >> radius; } // Destroy FXGLCone::~FXGLCone(){ FXTRACE((100,"FXGLCone::~FXGLCone\n")); } } fox1.6-1.6.57/src/FXGLContext.cpp000066400000000000000000000253361326741342000162460ustar00rootroot00000000000000/******************************************************************************** * * * G L C o n t e x t C l a s s * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLContext.cpp,v 1.38 2006/01/22 17:58:28 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXVisual.h" #include "FXGLVisual.h" #include "FXDrawable.h" #include "FXGLContext.h" /* Notes: - GL Context can be shared between GL canvas widgets. - OpenGL documentation says that windows can share GL contexts as long as the visuals are the same; so we keep a reference to the GLVisual in the context so as to compare it to the visual of the window when the GL context is being locked on the window. - Display lists can be shared between different types of GL contexts; the display list has to be kept in the same place for each of the contexts that want to share it. - It may be not a bad idea to delay the creation of the context until we call begin(). This might be much more elegant, as we then already know which surface to use, and we won't have to create a temporary dummy window. - The mental model of FXGLContext is that of FXDCWindow, except that FXGLContext lives long, while FXDCWindow gets created/destroyed on an as-needed basis. - There should be NO NEED to derive FXGLContext from FXObject; right now we do, for serialization, but I think that we shouldn't; because the stuff in here contains info which makes little sense to serialize.... - Should GL context make sure GLVisual has been create()-ed already? */ //#define DISPLAY(app) ((Display*)((app)->display)) using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXGLContext,FXId,NULL,0) // Make a GL context FXGLContext::FXGLContext(FXApp* a,FXGLVisual *vis): FXId(a),visual(vis),surface(NULL),ctx(NULL){ FXTRACE((100,"FXGLContext::FXGLContext %p\n",this)); sgnext=sgprev=this; } // Make a GL context sharing a display list with another FXGLContext::FXGLContext(FXApp* a,FXGLVisual *vis,FXGLContext *shared): FXId(a),visual(vis),surface(NULL),ctx(NULL){ FXTRACE((100,"FXGLContext::FXGLContext %p\n",this)); sgnext=shared; sgprev=shared->sgprev; shared->sgprev=this; sgprev->sgnext=this; } // Return TRUE if it is sharing display lists FXbool FXGLContext::isShared() const { return sgnext!=this; } // Create GL context void FXGLContext::create(){ ///visual->create(); // Should we call this here? #ifdef HAVE_GL_H register FXGLContext *context; register void *sharedctx=NULL; if(!xid){ if(getApp()->isInitialized()){ FXTRACE((100,"FXGLContext::create %p\n",this)); // The visual should be OpenGL capable if(!visual->getInfo()){ fxerror("FXGLContext::create(): visual unsuitable for OpenGL.\n"); } // Find another member of the group which is already created, and get its context if(sgnext!=this){ context=sgnext; while(context!=this){ sharedctx=context->ctx; if(sharedctx) break; context=context->sgnext; } } #ifndef WIN32 // Make context ctx=glXCreateContext((Display*)getApp()->getDisplay(),(XVisualInfo*)visual->getInfo(),(GLXContext)sharedctx,TRUE); if(!ctx){ fxerror("FXGLContext::create(): glXCreateContext() failed.\n"); } xid=1; #else // Conceptually, the bitplane organization should be enough to create a context; // but on Windows, there is no concept like a visual, and hence we need to make // a dummy window, set its pixel format, and then create the GL context; // afterwards, the window is no longer needed and will be deleted. // Yes, I'm painfully aware that this sucks, but we intend to keep the // logical model clean come hell or high water.... HWND wnd=CreateWindow(TEXT("FXPopup"),NULL,WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_POPUP,0,0,2,2,GetDesktopWindow(),0,(HINSTANCE)(getApp()->display),this); if(!wnd){ fxerror("FXGLContext::create(): CreateWindow() failed.\n"); } // Get the window's device context HDC hdc=GetDC((HWND)wnd); // Set the pixel format if(!SetPixelFormat(hdc,(FXint)(FXival)visual->getVisual(),(PIXELFORMATDESCRIPTOR*)visual->getInfo())){ fxerror("FXGLContext::create(): SetPixelFormat() failed.\n"); } // Make the GL context ctx=(void*)wglCreateContext(hdc); if(!ctx){ fxerror("FXGLContext::create(): wglCreateContext() failed.\n"); } // I hope I didn't get this backward; the new context obviously has no // display lists yet, but the old one may have, as it has already been around // for a while. If you see this fail and can't explain why, then that might // be what's going on. Report this to jeroen@fox-toolkit.org if(sharedctx && !wglShareLists((HGLRC)sharedctx,(HGLRC)ctx)){ fxerror("FXGLContext::create(): wglShareLists() failed.\n"); } // Release window's device context ReleaseDC(wnd,hdc); // Destroy the temporary window DestroyWindow(wnd); xid=(void*)1; #endif } } #endif } // Detach the GL context void FXGLContext::detach(){ #ifdef HAVE_GL_H if(xid){ FXTRACE((100,"FXGLContext::detach %p\n",this)); xid=0; } #endif } // Destroy the GL context void FXGLContext::destroy(){ #ifdef HAVE_GL_H if(xid){ if(getApp()->isInitialized()){ FXTRACE((100,"FXGLContext::destroy %p\n",this)); #ifndef WIN32 glXDestroyContext((Display*)getApp()->getDisplay(),(GLXContext)ctx); #else wglDeleteContext((HGLRC)ctx); #endif } ctx=NULL; xid=0; } #endif } // Make the rendering context of drawable current FXbool FXGLContext::begin(FXDrawable *drawable){ #ifdef HAVE_GL_H if(!drawable){ fxerror("FXGLContext::begin: NULL drawable.\n"); } if(!drawable->id()){ fxerror("FXGLContext::begin: drawable not created yet.\n"); } if(visual!=drawable->getVisual()){ fxerror("FXGLContext::begin: visuals do not match.\n"); } if(xid){ #ifndef WIN32 if(glXMakeCurrent((Display*)getApp()->getDisplay(),drawable->id(),(GLXContext)ctx)){ surface=drawable; return TRUE; } #else //HDC hdc=drawable->GetDC(); // Obtain DC in a way appropriate for the drawable! HDC hdc=::GetDC((HWND)drawable->id()); // FIXME:- it should probably be the line above, but need to check about ReleaseDC first! if(visual->colormap){ SelectPalette(hdc,(HPALETTE)visual->colormap,FALSE); RealizePalette(hdc); } if(wglMakeCurrent(hdc,(HGLRC)ctx)){ surface=drawable; return TRUE; } #endif } #endif return FALSE; } // Make the rendering context of drawable non-current FXbool FXGLContext::end(){ FXbool bRet=FALSE; #ifdef HAVE_GL_H if(xid){ #ifndef WIN32 bRet=glXMakeCurrent((Display*)getApp()->getDisplay(),None,(GLXContext)NULL); #else if(surface){ // According to "Steve Granja" , // ::ReleaseDC is still necessary even for owned DC's. // So release it here to prevent resource leak. ::ReleaseDC((HWND)surface->id(),wglGetCurrentDC()); } bRet=wglMakeCurrent(NULL,NULL); #endif surface=NULL; } #endif return bRet; } // Used by GL to swap the buffers in double buffer mode, or flush a single buffer void FXGLContext::swapBuffers(){ #ifdef HAVE_GL_H if(!surface){ fxerror("FXGLContext::swapBuffers: not connected to drawable.\n"); } #ifndef WIN32 glXSwapBuffers((Display*)getApp()->getDisplay(),surface->id()); #else // SwapBuffers(wglGetCurrentDC()); // wglSwapLayerBuffers(wglGetCurrentDC(),WGL_SWAP_MAIN_PLANE); HDC hdc=wglGetCurrentDC(); if(wglSwapLayerBuffers(hdc,WGL_SWAP_MAIN_PLANE)==FALSE){ SwapBuffers(hdc); } #endif #endif } // This function only available on Mesa void FXGLContext::swapSubBuffers(FXint,FXint,FXint,FXint){ // FIXME: Put the swap hack back!! // FIXME: bool bUseSwapHack = ! strncmp("Mesa", glGetString(GL_RENDERER), 4); // FIXME: how to get proc address by name, since we don't know which shared lib we're going to get! // #ifdef HAVE_GL_H // #ifdef HAVE_MESA // #ifdef GLX_MESA_copy_sub_buffer // glXCopySubBufferMESA(getApp()->display,xid,x,height-y-h-1,w,h); // #else // glXSwapBuffers(getApp()->display,xid); // #endif // #endif // #endif } // Save object to stream void FXGLContext::save(FXStream& store) const { FXId::save(store); store << visual; store << sgnext; store << sgprev; } // Load object from stream void FXGLContext::load(FXStream& store){ FXId::load(store); store >> visual; store >> sgnext; store >> sgprev; } // Close and release any resources FXGLContext::~FXGLContext(){ FXTRACE((100,"FXGLContext::~FXGLContext %p\n",this)); destroy(); sgnext->sgprev=sgprev; sgprev->sgnext=sgnext; visual=(FXGLVisual*)-1L; surface=(FXDrawable*)-1L; sgnext=(FXGLContext*)-1L; sgprev=(FXGLContext*)-1L; ctx=(void*)-1L; } } fox1.6-1.6.57/src/FXGLCube.cpp000066400000000000000000000135221326741342000154720ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L C u b e O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * Contributed by: Angel-Ventura Mendo Gomez * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLCube.cpp,v 1.28 2006/01/22 17:58:28 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXQuatf.h" #include "FXMat4f.h" #include "FXRangef.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXGLViewer.h" #include "FXGLCube.h" using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXGLCube,FXGLShape,NULL,0) // Create cube FXGLCube::FXGLCube():width(1.0f),height(1.0f),depth(1.0f){ FXTRACE((100,"FXGLCube::FXGLCube\n")); range.lower.x=-0.5f*width; range.upper.x=0.5f*width; range.lower.y=-0.5f*height; range.upper.y=0.5f*height; range.lower.z=-0.5f*depth; range.upper.z=0.5f*depth; } // Create cube FXGLCube::FXGLCube(FXfloat x,FXfloat y,FXfloat z,FXfloat w,FXfloat h,FXfloat d): FXGLShape(x,y,z,SHADING_SMOOTH|STYLE_SURFACE),width(w),height(h),depth(d){ FXTRACE((100,"FXGLCube::FXGLCube\n")); range.lower.x=-0.5f*width; range.upper.x=0.5f*width; range.lower.y=-0.5f*height; range.upper.y=0.5f*height; range.lower.z=-0.5f*depth; range.upper.z=0.5f*depth; } // Create initialized line FXGLCube::FXGLCube(FXfloat x,FXfloat y,FXfloat z,FXfloat w,FXfloat h,FXfloat d,const FXMaterial& mtl): FXGLShape(x,y,z,SHADING_SMOOTH|STYLE_SURFACE,mtl,mtl),width(w),height(h),depth(d){ FXTRACE((100,"FXGLCube::FXGLCube\n")); range.lower.x=-0.5f*width; range.upper.x=0.5f*width; range.lower.y=-0.5f*height; range.upper.y=0.5f*height; range.lower.z=-0.5f*depth; range.upper.z=0.5f*depth; } // Copy constructor FXGLCube::FXGLCube(const FXGLCube& orig):FXGLShape(orig){ FXTRACE((100,"FXGLCube::FXGLCube\n")); width=orig.width; height=orig.height; depth=orig.depth; } // Draw void FXGLCube::drawshape(FXGLViewer*){ #ifdef HAVE_GL_H FXfloat xmin =-0.5f*width; FXfloat xmax = 0.5f*width; FXfloat ymin =-0.5f*height; FXfloat ymax = 0.5f*height; FXfloat zmin =-0.5f*depth; FXfloat zmax = 0.5f*depth; glBegin(GL_TRIANGLE_STRIP); glNormal3f(0.0f,0.0f,-1.0f); glVertex3f(xmin, ymin, zmin); glVertex3f(xmin, ymax, zmin); glVertex3f(xmax, ymin, zmin); glVertex3f(xmax, ymax, zmin); glEnd(); glBegin(GL_TRIANGLE_STRIP); glNormal3f(1.0f,0.0f,0.0f); glVertex3f(xmax, ymin, zmin); glVertex3f(xmax, ymax, zmin); glVertex3f(xmax, ymin, zmax); glVertex3f(xmax, ymax, zmax); glEnd(); glBegin(GL_TRIANGLE_STRIP); glNormal3f(0.0f,0.0f,1.0f); glVertex3f(xmax, ymin, zmax); glVertex3f(xmax, ymax, zmax); glVertex3f(xmin, ymin, zmax); glVertex3f(xmin, ymax, zmax); glEnd(); glBegin(GL_TRIANGLE_STRIP); glNormal3f(-1.0f,0.0f,0.0f); glVertex3f(xmin, ymin, zmax); glVertex3f(xmin, ymax, zmax); glVertex3f(xmin, ymin, zmin); glVertex3f(xmin, ymax, zmin); glEnd(); glBegin(GL_TRIANGLE_STRIP); glNormal3f(0.0f,1.0f,0.0f); glVertex3f(xmin, ymax, zmin); glVertex3f(xmin, ymax, zmax); glVertex3f(xmax, ymax, zmin); glVertex3f(xmax, ymax, zmax); glEnd(); glBegin(GL_TRIANGLE_STRIP); glNormal3f(0.0f,-1.0f,0.0f); glVertex3f(xmin, ymin, zmax); glVertex3f(xmin, ymin, zmin); glVertex3f(xmax, ymin, zmax); glVertex3f(xmax, ymin, zmin); glEnd(); #endif } // Copy this object FXGLObject* FXGLCube::copy(){ return new FXGLCube(*this); } // Save object to stream void FXGLCube::save(FXStream& store) const { FXGLShape::save(store); store << width << height << depth; } // Load object from stream void FXGLCube::load(FXStream& store){ FXGLShape::load(store); store >> width >> height >> depth; } // Destroy FXGLCube::~FXGLCube(){ FXTRACE((100,"FXGLCube::~FXGLCube\n")); } } fox1.6-1.6.57/src/FXGLCylinder.cpp000066400000000000000000000125271326741342000163710ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L C y l i n d e r O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * Contributed by: Angel-Ventura Mendo Gomez * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLCylinder.cpp,v 1.27 2006/01/22 17:58:28 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXQuatf.h" #include "FXMat4f.h" #include "FXRangef.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXGLViewer.h" #include "FXGLCylinder.h" // GLU versions prior to 1.1 have GLUquadric #if !defined(GLU_VERSION_1_1) && !defined(GLU_VERSION_1_2) && !defined(GLU_VERSION_1_3) #define GLUquadricObj GLUquadric #endif // Cylinder fidelity #define FXGLCYLINDER_SLICES_NUMBER 20 #define FXGLCYLINDER_STACKS_NUMBER 20 #define FXGLCYLINDER_LOOPS 4 using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXGLCylinder,FXGLShape,NULL,0) // Create cylinder FXGLCylinder::FXGLCylinder():height(1.0f),radius(1.0f){ FXTRACE((100,"FXGLCylinder::FXGLCylinder\n")); range.lower.x=-radius; range.upper.x=radius; range.lower.y=0.0f; range.upper.y=height; range.lower.z=-radius; range.upper.z=radius; } // Create initialized cylinder FXGLCylinder::FXGLCylinder(FXfloat x,FXfloat y,FXfloat z,FXfloat h,FXfloat r): FXGLShape(x,y,z,SHADING_SMOOTH|STYLE_SURFACE),height(h),radius(r){ FXTRACE((100,"FXGLCylinder::FXGLCylinder\n")); range.lower.x=-radius; range.upper.x=radius; range.lower.y=0.0f; range.upper.y=height; range.lower.z=-radius; range.upper.z=radius; } // Create initialized cylinder FXGLCylinder::FXGLCylinder(FXfloat x,FXfloat y,FXfloat z,FXfloat h,FXfloat r,const FXMaterial& mtl): FXGLShape(x,y,z,SHADING_SMOOTH|STYLE_SURFACE,mtl,mtl),height(h),radius(r){ FXTRACE((100,"FXGLCylinder::FXGLCylinder\n")); range.lower.x=-radius; range.upper.x=radius; range.lower.y=0.0f; range.upper.y=height; range.lower.z=-radius; range.upper.z=radius; } // Copy constructor FXGLCylinder::FXGLCylinder(const FXGLCylinder& orig):FXGLShape(orig){ FXTRACE((100,"FXGLCylinder::FXGLCylinder\n")); height=orig.height; radius=orig.radius; } // Draw void FXGLCylinder::drawshape(FXGLViewer*){ #ifdef HAVE_GL_H GLUquadricObj* quad=gluNewQuadric(); gluQuadricDrawStyle(quad,(GLenum)GLU_FILL); /* gluQuadricNormals(quad,GLU_SMOOTH); gluQuadricOrientation(quad,GLU_OUTSIDE); */ glPushMatrix(); glRotatef(-90.0f,1.0f,0.0f,0.0f); gluCylinder(quad,radius,radius,height,FXGLCYLINDER_SLICES_NUMBER,FXGLCYLINDER_STACKS_NUMBER); gluQuadricOrientation(quad,(GLenum)GLU_INSIDE); gluDisk(quad,0,radius,FXGLCYLINDER_SLICES_NUMBER,FXGLCYLINDER_LOOPS); glTranslatef(0.0f,0.0f,height); gluQuadricOrientation(quad,(GLenum)GLU_OUTSIDE); gluDisk(quad,0,radius,FXGLCYLINDER_SLICES_NUMBER,FXGLCYLINDER_LOOPS); glPopMatrix(); gluDeleteQuadric(quad); #endif } // Copy this object FXGLObject* FXGLCylinder::copy(){ return new FXGLCylinder(*this); } // Save object to stream void FXGLCylinder::save(FXStream& store) const { FXGLShape::save(store); store << height << radius; } // Load object from stream void FXGLCylinder::load(FXStream& store){ FXGLShape::load(store); store >> height >> radius; } // Destroy FXGLCylinder::~FXGLCylinder(){ FXTRACE((100,"FXGLCylinder::~FXGLCylinder\n")); } } fox1.6-1.6.57/src/FXGLObject.cpp000066400000000000000000000176101326741342000160240ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLObject.cpp,v 1.37.2.3 2006/07/28 00:56:30 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXQuatf.h" #include "FXMat4f.h" #include "FXRangef.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXGLViewer.h" #include "FXGLObject.h" #include "FXGLVisual.h" #include "FXFont.h" // GLU versions prior to 1.1 have GLUquadric #if !defined(GLU_VERSION_1_1) && !defined(GLU_VERSION_1_2) && !defined(GLU_VERSION_1_3) #define GLUquadricObj GLUquadric #endif /* Notes: - Leaf objects don't push any names! - Group objects should do focus traversal. */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXGLObject,FXObject,NULL,0) // Get bounding box void FXGLObject::bounds(FXRangef& box){ box.upper.x=box.lower.x=0.0f; box.upper.y=box.lower.y=0.0f; box.upper.z=box.lower.z=0.0f; } // Draw the GL scene void FXGLObject::draw(FXGLViewer*){ } // Hit objects void FXGLObject::hit(FXGLViewer* viewer){ draw(viewer); } // Copy FXGLObject* FXGLObject::copy(){ return new FXGLObject(*this); } // Identify object by its path FXGLObject* FXGLObject::identify(FXuint*){ return this; } // Return true if it can be dragged FXbool FXGLObject::canDrag() const { return FALSE; } // Return true if OK to delete object FXbool FXGLObject::canDelete() const { return FALSE; } // Drag the object FXbool FXGLObject::drag(FXGLViewer*,FXint,FXint,FXint,FXint){ return FALSE; } /*******************************************************************************/ // Object implementation FXIMPLEMENT(FXGLGroup,FXGLObject,NULL,0) // Get bounding box void FXGLGroup::bounds(FXRangef& box){ register FXint i; FXRangef b; box.lower.x=box.lower.y=box.lower.z=0.0f; box.upper.x=box.upper.y=box.upper.z=0.0f; if(0bounds(b); box.include(b); } } } // Draw void FXGLGroup::draw(FXGLViewer* viewer){ for(FXint i=0; idraw(viewer); } // Draw for hit void FXGLGroup::hit(FXGLViewer* viewer){ #ifdef HAVE_GL_H glPushName(0xffffffff); for(FXint i=0; ihit(viewer); } glPopName(); #endif } // Copy FXGLObject* FXGLGroup::copy(){ return new FXGLGroup(*this); } // Identify object by its path FXGLObject* FXGLGroup::identify(FXuint* path){ FXASSERT(path); FXASSERT((FXint)path[0]identify(path+1); } // Return true if it can be dragged FXbool FXGLGroup::canDrag() const { return TRUE; } // Drag group object FXbool FXGLGroup::drag(FXGLViewer* viewer,FXint fx,FXint fy,FXint tx,FXint ty){ for(FXint i=0; idrag(viewer,fx,fy,tx,ty); } return TRUE; } // Save object to stream void FXGLGroup::save(FXStream& store) const { FXGLObject::save(store); list.save(store); } // Load object from stream void FXGLGroup::load(FXStream& store){ FXGLObject::load(store); list.load(store); } // Delete members of the group FXGLGroup::~FXGLGroup(){ for(FXint i=0; i> pos; } /*******************************************************************************/ // Object implementation FXIMPLEMENT(FXGLLine,FXGLObject,NULL,0) // Create line FXGLLine::FXGLLine():fm(-0.5f,0.0f,0.0f),to(0.5f,0.0f,0.0f){ } // Copy constructor FXGLLine::FXGLLine(const FXGLLine& orig):FXGLObject(orig),fm(orig.fm),to(orig.to){ } // Create inittialized line FXGLLine::FXGLLine(FXfloat fx,FXfloat fy,FXfloat fz,FXfloat tx,FXfloat ty,FXfloat tz):fm(fx,fy,fz),to(tx,ty,tz){ } // Get bounding box void FXGLLine::bounds(FXRangef& box){ FXMINMAX(box.lower.x,box.upper.x,fm.pos.x,to.pos.x); FXMINMAX(box.lower.y,box.upper.y,fm.pos.y,to.pos.y); FXMINMAX(box.lower.z,box.upper.z,fm.pos.z,to.pos.z); } // Draw void FXGLLine::draw(FXGLViewer*){ #ifdef HAVE_GL_H glColor3f(1.0,0.0,0.0); glPointSize(HANDLE_SIZE); glBegin(GL_LINES); glVertex3fv(fm.pos); glVertex3fv(to.pos); glEnd(); #endif } // Draw for hit void FXGLLine::hit(FXGLViewer* ){ #ifdef HAVE_GL_H glBegin(GL_LINES); glVertex3fv(fm.pos); glVertex3fv(to.pos); glEnd(); #endif } // Copy FXGLObject* FXGLLine::copy(){ return new FXGLLine(*this); } // Save object to stream void FXGLLine::save(FXStream& store) const { FXGLObject::save(store); fm.save(store); to.save(store); } // Load object from stream void FXGLLine::load(FXStream& store){ FXGLObject::load(store); fm.load(store); to.load(store); } } fox1.6-1.6.57/src/FXGLShape.cpp000066400000000000000000000435451326741342000156640ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L S h a p e O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * Contributed by: Angel-Ventura Mendo Gomez * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLShape.cpp,v 1.42 2006/01/22 17:58:28 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXQuatf.h" #include "FXMat4f.h" #include "FXRangef.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXGLViewer.h" #include "FXGLShape.h" #define FACTOR 0.5f #define BIAS 0.002f using namespace FX; /*******************************************************************************/ namespace FX { // Drop FXDEFMAP(FXGLShape) FXGLShapeMap[]={ FXMAPFUNC(SEL_DND_DROP,0,FXGLShape::onDNDDrop), FXMAPFUNC(SEL_DND_MOTION,0,FXGLShape::onDNDMotion), FXMAPFUNC(SEL_QUERY_TIP,0,FXGLShape::onQueryTip), FXMAPFUNC(SEL_COMMAND,FXGLShape::ID_SHADEOFF,FXGLShape::onCmdShadeOff), FXMAPFUNC(SEL_COMMAND,FXGLShape::ID_SHADEON,FXGLShape::onCmdShadeOn), FXMAPFUNC(SEL_COMMAND,FXGLShape::ID_SHADESMOOTH,FXGLShape::onCmdShadeSmooth), FXMAPFUNC(SEL_UPDATE,FXGLShape::ID_SHADEOFF,FXGLShape::onUpdShadeOff), FXMAPFUNC(SEL_UPDATE,FXGLShape::ID_SHADEON,FXGLShape::onUpdShadeOn), FXMAPFUNC(SEL_UPDATE,FXGLShape::ID_SHADESMOOTH,FXGLShape::onUpdShadeSmooth), FXMAPFUNC(SEL_COMMAND,FXGLShape::ID_FRONT_MATERIAL,FXGLShape::onCmdFrontMaterial), FXMAPFUNC(SEL_UPDATE,FXGLShape::ID_FRONT_MATERIAL,FXGLShape::onUpdFrontMaterial), FXMAPFUNC(SEL_COMMAND,FXGLShape::ID_BACK_MATERIAL,FXGLShape::onCmdBackMaterial), FXMAPFUNC(SEL_UPDATE,FXGLShape::ID_BACK_MATERIAL,FXGLShape::onUpdBackMaterial), FXMAPFUNCS(SEL_COMMAND,FXGLShape::ID_STYLE_POINTS,FXGLShape::ID_STYLE_BOUNDINGBOX,FXGLShape::onCmdDrawingStyle), FXMAPFUNCS(SEL_UPDATE,FXGLShape::ID_STYLE_POINTS,FXGLShape::ID_STYLE_BOUNDINGBOX,FXGLShape::onUpdDrawingStyle) }; // Object implementation FXIMPLEMENT_ABSTRACT(FXGLShape,FXGLObject,FXGLShapeMap,ARRAYNUMBER(FXGLShapeMap)) // Serialization FXGLShape::FXGLShape(){ position.x=0.0f; position.y=0.0f; position.z=0.0f; material[0].ambient=FXVec4f(0.2f,0.2f,0.2f,1.0f); material[0].diffuse=FXVec4f(0.8f,0.8f,0.8f,1.0f); material[0].specular=FXVec4f(1.0f,1.0f,1.0f,1.0f); material[0].emission=FXVec4f(0.0f,0.0f,0.0f,1.0f); material[0].shininess=30.0f; material[1].ambient=FXVec4f(0.2f,0.2f,0.2f,1.0f); material[1].diffuse=FXVec4f(0.8f,0.8f,0.8f,1.0f); material[1].specular=FXVec4f(1.0f,1.0f,1.0f,1.0f); material[1].emission=FXVec4f(0.0f,0.0f,0.0f,1.0f); material[1].shininess=30.0; range.lower.x=-1.0f; range.lower.y=-1.0f; range.lower.z=-1.0f; range.upper.x= 1.0f; range.upper.y= 1.0f; range.upper.z= 1.0f; options=SHADING_SMOOTH|STYLE_SURFACE; } // Create initialized shape FXGLShape::FXGLShape(FXfloat x,FXfloat y,FXfloat z,FXuint opts){ position.x=x; position.y=y; position.z=z; material[0].ambient=FXVec4f(0.2f,0.2f,0.2f,1.0f); material[0].diffuse=FXVec4f(0.8f,0.8f,0.8f,1.0f); material[0].specular=FXVec4f(1.0f,1.0f,1.0f,1.0f); material[0].emission=FXVec4f(0.0f,0.0f,0.0f,1.0f); material[0].shininess=30.0f; material[1].ambient=FXVec4f(0.2f,0.2f,0.2f,1.0f); material[1].diffuse=FXVec4f(0.8f,0.8f,0.8f,1.0f); material[1].specular=FXVec4f(1.0f,1.0f,1.0f,1.0f); material[1].emission=FXVec4f(0.0f,0.0f,0.0f,1.0f); material[1].shininess=30.0f; range.lower.x=-1.0f; range.lower.y=-1.0f; range.lower.z=-1.0f; range.upper.x= 1.0f; range.upper.y= 1.0f; range.upper.z= 1.0f; options=opts; } // Create initialized shape FXGLShape::FXGLShape(FXfloat x,FXfloat y,FXfloat z,FXuint opts,const FXMaterial& front,const FXMaterial& back){ position.x=x; position.y=y; position.z=z; material[0]=front; material[1]=back; range.lower.x=-1.0f; range.lower.y=-1.0f; range.lower.z=-1.0f; range.upper.x= 1.0f; range.upper.y= 1.0f; range.upper.z= 1.0f; options=opts; } // Copy constructor FXGLShape::FXGLShape(const FXGLShape& orig):FXGLObject(orig){ position=orig.position; material[0]=orig.material[0]; material[1]=orig.material[1]; range=orig.range; options=orig.options; tip=orig.tip; } // Copy this object FXGLObject* FXGLShape::copy(){ return new FXGLShape(*this); } // Return true if it can be dragged FXbool FXGLShape::canDrag() const { return TRUE; } // Object may be deleted FXbool FXGLShape::canDelete() const { return TRUE; } // Handle drag-and-drop drop long FXGLShape::onDNDDrop(FXObject* sender,FXSelector,void*){ FXushort *clr; FXuint len; FXVec4f color; if(((FXWindow*)sender)->getDNDData(FROM_DRAGNDROP,FXWindow::colorType,(FXuchar*&)clr,len)){ color[0]=clr[0]/65535.0f; color[1]=clr[1]/65535.0f; color[2]=clr[2]/65535.0f; color[3]=clr[3]/65535.0f; FXFREE(&clr); material[0].ambient=color; material[0].diffuse=color; material[1].ambient=color; material[1].diffuse=color; return 1; } return 0; } // Cursor got dragged over here. long FXGLShape::onDNDMotion(FXObject*,FXSelector,void*){ return 1; } // We were asked about tip text long FXGLShape::onQueryTip(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE),(void*)&tip); return 1; } // Shading off long FXGLShape::onCmdShadeOff(FXObject*,FXSelector,void*){ options&=~(SHADING_SMOOTH|SHADING_FLAT); return 1; } // Shading on [flat] long FXGLShape::onCmdShadeOn(FXObject*,FXSelector,void*){ options&=~SHADING_SMOOTH; options|=SHADING_FLAT; return 1; } // Shading on [smoooooooooth] long FXGLShape::onCmdShadeSmooth(FXObject*,FXSelector,void*){ options&=~SHADING_FLAT; options|=SHADING_SMOOTH; return 1; } // Update shading off button long FXGLShape::onUpdShadeOff(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL); sender->handle(this,(options&(SHADING_FLAT|SHADING_SMOOTH))?FXSEL(SEL_COMMAND,FXWindow::ID_UNCHECK):FXSEL(SEL_COMMAND,FXWindow::ID_CHECK),NULL); return 1; } // Update shading on button long FXGLShape::onUpdShadeOn(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL); sender->handle(this,(options&SHADING_FLAT)?FXSEL(SEL_COMMAND,FXWindow::ID_CHECK):FXSEL(SEL_COMMAND,FXWindow::ID_UNCHECK),NULL); return 1; } // Update shading smooth button long FXGLShape::onUpdShadeSmooth(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL); sender->handle(this,(options&SHADING_SMOOTH)?FXSEL(SEL_COMMAND,FXWindow::ID_CHECK):FXSEL(SEL_COMMAND,FXWindow::ID_UNCHECK),NULL); return 1; } // Drag shape around FXbool FXGLShape::drag(FXGLViewer* viewer,FXint fx,FXint fy,FXint tx,FXint ty){ FXfloat zz=viewer->worldToEyeZ(position); FXVec3f wf=viewer->eyeToWorld(viewer->screenToEye(fx,fy,zz)); FXVec3f wt=viewer->eyeToWorld(viewer->screenToEye(tx,ty,zz)); position+=wt-wf; return TRUE; } // Draw void FXGLShape::draw(FXGLViewer* viewer){ #ifdef HAVE_GL_H // Save attributes and matrix // glPushAttrib(GL_ENABLE_BIT|GL_CURRENT_BIT|GL_LIGHTING_BIT|GL_POINT_BIT|GL_LINE_BIT|GL_POLYGON_BIT); // glPushAttrib(GL_ENABLE_BIT|GL_CURRENT_BIT|GL_LIGHTING_BIT|GL_POINT_BIT|GL_LINE_BIT); glPushAttrib(GL_CURRENT_BIT|GL_LIGHTING_BIT|GL_POINT_BIT|GL_LINE_BIT); glPushMatrix(); // Object position glTranslatef(position[0],position[1],position[2]); // Draw full object if(!viewer->doesTurbo()){ // Shading if(options&(SHADING_SMOOTH|SHADING_FLAT)){ glEnable(GL_LIGHTING); if(options&SHADING_SMOOTH){ glEnable(GL_AUTO_NORMAL); glShadeModel(GL_SMOOTH); } else{ glDisable(GL_AUTO_NORMAL); glShadeModel(GL_FLAT); } } else{ glDisable(GL_LIGHTING); } // Material if(options&SURFACE_DUALSIDED){ glMaterialfv(GL_FRONT,GL_AMBIENT,material[0].ambient); glMaterialfv(GL_FRONT,GL_DIFFUSE,material[0].diffuse); glMaterialfv(GL_FRONT,GL_SPECULAR,material[0].specular); glMaterialfv(GL_FRONT,GL_EMISSION,material[0].emission); glMaterialf(GL_FRONT,GL_SHININESS,material[0].shininess); glMaterialfv(GL_BACK,GL_AMBIENT,material[1].ambient); glMaterialfv(GL_BACK,GL_DIFFUSE,material[1].diffuse); glMaterialfv(GL_BACK,GL_SPECULAR,material[1].specular); glMaterialfv(GL_BACK,GL_EMISSION,material[1].emission); glMaterialf(GL_BACK,GL_SHININESS,material[1].shininess); } else{ glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,material[0].ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,material[0].diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,material[0].specular); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,material[0].emission); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,material[0].shininess); } // Surface if(options&STYLE_SURFACE){ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); if(options&FACECULLING_ON) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); drawshape(viewer); } // Wire frame if(options&STYLE_WIREFRAME){ glDisable(GL_LIGHTING); glShadeModel(GL_FLAT); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); if(options&STYLE_SURFACE){ // Wires over surface #if GL_EXT_polygon_offset glEnable(GL_POLYGON_OFFSET_EXT); #ifdef GL_VERSION_1_2 glPolygonOffset(FACTOR, BIAS); #else glPolygonOffsetEXT(FACTOR, BIAS); #endif drawshape(viewer); glDisable(GL_POLYGON_OFFSET_EXT); #elif GLU_VERSION_1_1 glEnable(GL_POLYGON_OFFSET_LINE); glPolygonOffset(FACTOR, BIAS); drawshape(viewer); glDisable(GL_POLYGON_OFFSET_LINE); #endif } else{ // Wires by themselves glDisable(GL_CULL_FACE); drawshape(viewer); } } // Points if(options&STYLE_POINTS){ glDisable(GL_LIGHTING); glShadeModel(GL_FLAT); glPolygonMode(GL_FRONT_AND_BACK,GL_POINT); if(options&STYLE_SURFACE){ // Points over surface #if GL_EXT_polygon_offset glEnable(GL_POLYGON_OFFSET_EXT); #ifdef GL_VERSION_1_2 glPolygonOffset(FACTOR, BIAS); #else glPolygonOffsetEXT(FACTOR, BIAS); #endif drawshape(viewer); glDisable(GL_POLYGON_OFFSET_EXT); #elif GLU_VERSION_1_1 glEnable(GL_POLYGON_OFFSET_POINT); glPolygonOffset(FACTOR, BIAS); drawshape(viewer); glDisable(GL_POLYGON_OFFSET_POINT); #endif } else{ glDisable(GL_CULL_FACE); drawshape(viewer); } } } // Box // if((options&STYLE_BOUNDBOX) || selected){ // glDisable(GL_LIGHTING); // glShadeModel(GL_FLAT); // if(selected){ // glColor3f(0.0,1.0,0.0); // drawbox(); // glPointSize(4.0); // drawhandles(); // } // else{ // glColor3f(0.7f,0.7f,0.7f); // drawbox(); // } // } // Restore attributes and matrix glPopMatrix(); glPopAttrib(); #endif } // Draw for hit void FXGLShape::hit(FXGLViewer* viewer){ draw(viewer); } // Get bounding box void FXGLShape::bounds(FXRangef& box){ box.lower.x=position.x+range.lower.x; box.upper.x=position.x+range.upper.x; box.lower.y=position.y+range.lower.y; box.upper.y=position.y+range.upper.y; box.lower.z=position.z+range.lower.z; box.upper.z=position.z+range.upper.z; } // Draw a box void FXGLShape::drawbox(){ #ifdef HAVE_GL_H glBegin(GL_LINE_LOOP); glVertex3f(range.upper.x, range.lower.y, range.lower.z); glVertex3f(range.upper.x, range.lower.y, range.upper.z); glVertex3f(range.lower.x, range.lower.y, range.upper.z); glVertex3f(range.lower.x, range.upper.y, range.upper.z); glVertex3f(range.upper.x, range.upper.y, range.upper.z); glVertex3f(range.upper.x, range.upper.y, range.lower.z); glVertex3f(range.lower.x, range.upper.y, range.lower.z); glVertex3f(range.lower.x, range.lower.y, range.lower.z); glEnd(); glBegin(GL_LINES); glVertex3f(range.lower.x, range.lower.y, range.lower.z); glVertex3f(range.lower.x, range.lower.y, range.upper.z); glVertex3f(range.lower.x, range.upper.y, range.lower.z); glVertex3f(range.lower.x, range.upper.y, range.upper.z); glVertex3f(range.upper.x, range.lower.y, range.lower.z); glVertex3f(range.upper.x, range.upper.y, range.lower.z); glVertex3f(range.upper.x, range.lower.y, range.upper.z); glVertex3f(range.upper.x, range.upper.y, range.upper.z); glEnd(); #endif } // Draw handles void FXGLShape::drawhandles(){ #ifdef HAVE_GL_H glBegin(GL_POINTS); glVertex3f(range.lower.x, range.lower.y, range.lower.z); glVertex3f(range.lower.x, range.lower.y, range.upper.z); glVertex3f(range.lower.x, range.upper.y, range.lower.z); glVertex3f(range.lower.x, range.upper.y, range.upper.z); glVertex3f(range.upper.x, range.lower.y, range.lower.z); glVertex3f(range.upper.x, range.lower.y, range.upper.z); glVertex3f(range.upper.x, range.upper.y, range.lower.z); glVertex3f(range.upper.x, range.upper.y, range.upper.z); glEnd(); #endif } // Command from material editor long FXGLShape::onCmdFrontMaterial(FXObject*,FXSelector,void *ptr){ setMaterial(0,*((FXMaterial*)ptr)); return 1; } // Update material editor long FXGLShape::onUpdFrontMaterial(FXObject *sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETVALUE),(void*)&material[0]); return 1; } // Command from material editor long FXGLShape::onCmdBackMaterial(FXObject*,FXSelector,void *ptr){ setMaterial(1,*((FXMaterial*)ptr)); return 1; } // Update material editor long FXGLShape::onUpdBackMaterial(FXObject *sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETVALUE),(void*)&material[1]); return 1; } // Change material of side of surface void FXGLShape::setMaterial(FXint side,const FXMaterial& mtl){ material[side]=mtl; } // Obtain material of surface void FXGLShape::getMaterial(FXint side,FXMaterial& mtl) const { mtl=material[side]; } // Drawing style toggles long FXGLShape::onCmdDrawingStyle(FXObject*,FXSelector sel,void*){ switch(FXSELID(sel)){ case ID_STYLE_SURFACE: options^=STYLE_SURFACE; break; case ID_STYLE_POINTS: options^=STYLE_POINTS; break; case ID_STYLE_WIREFRAME: options^=STYLE_WIREFRAME; break; case ID_STYLE_BOUNDINGBOX: options^=STYLE_BOUNDBOX; break; } return 1; } // Update drawing style toggles long FXGLShape::onUpdDrawingStyle(FXObject *sender,FXSelector sel,void*){ FXSelector msg=FXSEL(SEL_COMMAND,FXWindow::ID_UNCHECK); switch(FXSELID(sel)){ case ID_STYLE_SURFACE: if(options&STYLE_SURFACE) msg=FXSEL(SEL_COMMAND,FXWindow::ID_CHECK); break; case ID_STYLE_POINTS: if(options&STYLE_POINTS) msg=FXSEL(SEL_COMMAND,FXWindow::ID_CHECK); break; case ID_STYLE_WIREFRAME: if(options&STYLE_WIREFRAME) msg=FXSEL(SEL_COMMAND,FXWindow::ID_CHECK); break; case ID_STYLE_BOUNDINGBOX: if(options&STYLE_BOUNDBOX) msg=FXSEL(SEL_COMMAND,FXWindow::ID_CHECK); break; } sender->handle(this,msg,NULL); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE),NULL); return 1; } // Save object to stream void FXGLShape::save(FXStream& store) const { FXGLObject::save(store); store << position; store << material[0].ambient; store << material[0].diffuse; store << material[0].specular; store << material[0].emission; store << material[0].shininess; store << material[1].ambient; store << material[1].diffuse; store << material[1].specular; store << material[1].emission; store << material[1].shininess; store << range; store << options; store << tip; } // Load object from stream void FXGLShape::load(FXStream& store){ FXGLObject::load(store); store >> position; store >> material[0].ambient; store >> material[0].diffuse; store >> material[0].specular; store >> material[0].emission; store >> material[0].shininess; store >> material[1].ambient; store >> material[1].diffuse; store >> material[1].specular; store >> material[1].emission; store >> material[1].shininess; store >> range; store >> options; store >> tip; } } fox1.6-1.6.57/src/FXGLSphere.cpp000066400000000000000000000120521326741342000160370ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L S p h e r e O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * Contributed by: Angel-Ventura Mendo Gomez * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLSphere.cpp,v 1.26 2006/01/22 17:58:28 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXQuatf.h" #include "FXMat4f.h" #include "FXRangef.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXGLViewer.h" #include "FXGLSphere.h" // GLU versions prior to 1.1 have GLUquadric #if !defined(GLU_VERSION_1_1) && !defined(GLU_VERSION_1_2) && !defined(GLU_VERSION_1_3) #define GLUquadricObj GLUquadric #endif // Sphere fidelity #define SPHERE_SLICES 20 #define SPHERE_STACKS 20 using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXGLSphere,FXGLShape,NULL,0) // Create sphere FXGLSphere::FXGLSphere(void):radius(0.5f),slices(SPHERE_SLICES),stacks(SPHERE_STACKS){ FXTRACE((100,"FXGLSphere::FXGLSphere\n")); range.lower.x=-radius; range.upper.x=radius; range.lower.y=-radius; range.upper.y=radius; range.lower.z=-radius; range.upper.z=radius; } // Create initialized sphere FXGLSphere::FXGLSphere(FXfloat x,FXfloat y,FXfloat z,FXfloat r): FXGLShape(x,y,z,SHADING_SMOOTH|STYLE_SURFACE),radius(r),slices(SPHERE_SLICES),stacks(SPHERE_STACKS){ FXTRACE((100,"FXGLSphere::FXGLSphere\n")); range.lower.x=-radius; range.upper.x=radius; range.lower.y=-radius; range.upper.y=radius; range.lower.z=-radius; range.upper.z=radius; } // Create initialized sphere FXGLSphere::FXGLSphere(FXfloat x,FXfloat y,FXfloat z,FXfloat r,const FXMaterial& mtl): FXGLShape(x,y,z,SHADING_SMOOTH|STYLE_SURFACE,mtl,mtl),radius(r),slices(SPHERE_SLICES),stacks(SPHERE_STACKS){ FXTRACE((100,"FXGLSphere::FXGLSphere\n")); range.lower.x=-radius; range.upper.x=radius; range.lower.y=-radius; range.upper.y=radius; range.lower.z=-radius; range.upper.z=radius; } // Copy constructor FXGLSphere::FXGLSphere(const FXGLSphere& orig):FXGLShape(orig){ FXTRACE((100,"FXGLSphere::FXGLSphere\n")); radius=orig.radius; slices=orig.slices; stacks=orig.stacks; } // Draw void FXGLSphere::drawshape(FXGLViewer*){ #ifdef HAVE_GL_H GLUquadricObj* quad=gluNewQuadric(); gluQuadricDrawStyle(quad,(GLenum)GLU_FILL); /* if (shading==FXGLShape::ID_SHADESMOOTH){ gluQuadricNormals(quad,(GLenum)GLU_SMOOTH); gluQuadricOrientation(quad,(GLenum)GLU_OUTSIDE); } */ gluSphere(quad,radius,slices,stacks); gluDeleteQuadric(quad); #endif } // Copy this object FXGLObject* FXGLSphere::copy(){ return new FXGLSphere(*this); } // Save object to stream void FXGLSphere::save(FXStream& store) const { FXGLShape::save(store); store << radius; store << slices; store << stacks; } // Load object from stream void FXGLSphere::load(FXStream& store){ FXGLShape::load(store); store >> radius; store >> slices; store >> stacks; } // Destroy FXGLSphere::~FXGLSphere(){ FXTRACE((100,"FXGLSphere::~FXGLSphere\n")); } } fox1.6-1.6.57/src/FXGLTriangleMesh.cpp000066400000000000000000000222741326741342000172020ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L T r i a n g l e M e s h O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * Contributed by: Angel-Ventura Mendo Gomez * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLTriangleMesh.cpp,v 1.30 2006/01/22 17:58:28 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXQuatf.h" #include "FXMat4f.h" #include "FXRangef.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXGLViewer.h" #include "FXGLTriangleMesh.h" /* Notes: - This is actually not a mesh at all but an just a bunch of individual triangles. - To do: make this into a true mesh with shared vertices, so we can actually see some speedup from using the vertex- array primitives. - Once we have a true mesh, revisit generatenormals() and make it spit out smooth normals based on mesh connectivity. */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXGLTriangleMesh,FXGLShape,NULL,0) // Create cube FXGLTriangleMesh::FXGLTriangleMesh(): vertexBuffer(NULL),colorBuffer(NULL),normalBuffer(NULL),textureBuffer(NULL),vertexNumber(0){ FXTRACE((100,"FXGLTriangleMesh::FXGLTriangleMesh\n")); range.lower.x=range.upper.x=0.0f; range.lower.y=range.upper.y=0.0f; range.lower.z=range.upper.z=0.0f; } // Create initialized tmesh FXGLTriangleMesh::FXGLTriangleMesh(FXfloat x,FXfloat y,FXfloat z,FXint nv,FXfloat *v,FXfloat *n,FXfloat *c,FXfloat *t): FXGLShape(x,y,z,SHADING_SMOOTH|STYLE_SURFACE), vertexBuffer(v),colorBuffer(c),normalBuffer(n),textureBuffer(t),vertexNumber(nv){ FXTRACE((100,"FXGLTriangleMesh::FXGLTriangleMesh\n")); if(!normalBuffer){ generatenormals(); } recomputerange(); } // Create initialized tmesh FXGLTriangleMesh::FXGLTriangleMesh(FXfloat x,FXfloat y,FXfloat z,FXint nv,FXfloat *v,FXfloat *n,FXfloat *c,FXfloat *t,const FXMaterial& mtl): FXGLShape(x,y,z,SHADING_SMOOTH|STYLE_SURFACE,mtl,mtl), vertexBuffer(v),colorBuffer(c),normalBuffer(n),textureBuffer(t),vertexNumber(nv){ FXTRACE((100,"FXGLTriangleMesh::FXGLTriangleMesh\n")); if(!normalBuffer){ generatenormals(); } recomputerange(); } // Copy constructor FXGLTriangleMesh::FXGLTriangleMesh(const FXGLTriangleMesh& orig):FXGLShape(orig){ FXTRACE((100,"FXGLTriangleMesh::FXGLTriangleMesh\n")); FXMEMDUP(&vertexBuffer,orig.vertexBuffer,FXfloat,3*orig.vertexNumber); FXMEMDUP(&colorBuffer,orig.colorBuffer,FXfloat,4*orig.vertexNumber); FXMEMDUP(&normalBuffer,orig.normalBuffer,FXfloat,3*orig.vertexNumber); FXMEMDUP(&textureBuffer,orig.textureBuffer,FXfloat,2*orig.vertexNumber); vertexNumber=orig.vertexNumber; } // Change vertex buffer means recompute range void FXGLTriangleMesh::setVertexBuffer(FXfloat *vertices){ vertexBuffer=vertices; recomputerange(); } // Recompute range void FXGLTriangleMesh::recomputerange(){ register FXint i,n; register FXfloat t; range.lower.x=range.upper.x=0.0f; range.lower.y=range.upper.y=0.0f; range.lower.z=range.upper.z=0.0f; if(vertexBuffer && vertexNumber>0){ range.lower.x=range.upper.x=vertexBuffer[0]; range.lower.y=range.upper.y=vertexBuffer[0]; range.lower.z=range.upper.z=vertexBuffer[0]; for(i=0,n=0; nrange.upper.x) range.upper.x=t; t=vertexBuffer[i++]; if(trange.upper.y) range.upper.y=t; t=vertexBuffer[i++]; if(trange.upper.z) range.upper.z=t; } } } // Draw void FXGLTriangleMesh::drawshape(FXGLViewer*){ if(!vertexBuffer || vertexNumber<=0) return; #ifdef HAVE_GL_H #if !defined(GL_VERSION_1_1) && !defined(GL_VERSION_1_2) register FXint i; // Yes we know this is not efficient but hell, OpenGL 1.0 is old... glBegin(GL_TRIANGLES); for(i=0; i> vertexNumber; store >> hadvertices >> hadcolors >> hadnormals >> hadtextures; if(hadvertices){ FXMALLOC(&vertexBuffer,FXfloat,3*vertexNumber); store.load(vertexBuffer,3*vertexNumber); } if(hadcolors){ FXMALLOC(&colorBuffer,FXfloat,4*vertexNumber); store.load(colorBuffer,4*vertexNumber); } if(hadnormals){ FXMALLOC(&normalBuffer,FXfloat,3*vertexNumber); store.load(normalBuffer,3*vertexNumber); } if(hadtextures){ FXMALLOC(&textureBuffer,FXfloat,2*vertexNumber); store.load(textureBuffer,2*vertexNumber); } } // Zap object FXGLTriangleMesh::~FXGLTriangleMesh(){ FXTRACE((100,"FXGLTriangleMesh::~FXGLTriangleMesh\n")); FXFREE(&vertexBuffer); FXFREE(&colorBuffer); FXFREE(&normalBuffer); FXFREE(&textureBuffer); } } fox1.6-1.6.57/src/FXGLViewer.cpp000066400000000000000000002673201326741342000160640ustar00rootroot00000000000000/******************************************************************************** * * * O p e n G L V i e w e r * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLViewer.cpp,v 1.156.2.1 2006/08/02 01:31:08 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXQuatf.h" #include "FXMat4f.h" #include "FXRangef.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXVisual.h" #include "FXGLVisual.h" #include "FXDC.h" #include "FXDCWindow.h" #include "FXDCPrint.h" #include "FXMessageBox.h" #include "FXToolTip.h" #include "FXCursor.h" #include "FXGLContext.h" #include "FXGLViewer.h" #include "FXGLObject.h" #include "FXPrintDialog.h" #include "jitter.h" /* To Do: - Initialize GL to fastest of everything for drawing lines. - Group object needs current element. - use app->getDragDelta() for motion tolerance. - Default op to noop mode; all returns 0 in noop mode. - GLuint unfortunately not always big enough to store a pointer... - The selection seems to get lost with multiple viewers into. the same scene. If you select a cube in one view, then select another cube in another view, both seem to get selected. Can we push the "selection" member from the view to the scene object? - Instead of select/deselect, do focus gain/lost type deal. - Add methods for inquire of pick-ray. - Fix FXGLGroup to identify child or itself.. - Need some way of updating ALL viewers. - Need a document/view type concept? - Load/Save need to save more... - Build mini display lists for offset/surface drawing. - Pass clicked/double-clicked/triple-clicked messages to object. - Distinguish between current object and selected ones. only one is current, but many may be selected. - When object(s) deleted, need to fix up selection... - GLViewer should source some messages to its target for important events. - Zoom-lasso feature. - Basic mouse actions: State Event Modifiers Where State Meaning -------------------------------------------------------------------------------------------- HOVERING Left -- outside PICKING Pick an object if no move PICKING Motion -- -- ROTATING Rotate camera about target point HOVERING Left -- inside object DRAGGING Drag object HOVERING Left Shift -- LASSOSELECT Select HOVERING Left Control -- LASSOSELECT Toggle selection HOVERING Left Right -- ZOOMING Zoom in HOVERING Left Right + Shift -- TRUCKING Trucking camera HOVERING Middle -- -- ZOOMING Zoom in/out HOVERING Middle Shift -- TRUCKING Trucking camera HOVERING Right -- -- POSTING Post popup menu if no move POSTING Motion -- -- TRANSLATING Translate camera HOVERING Right Shift -- GYRATING Rotate object about camera HOVERING Right Control -- FOVING Change field of view HOVERING Right Left -- ZOOMING Zoom in HOVERING Right Left +Shift -- TRUCKING Trucking camera FIXME FIXME FIXME FIXME FIXME FIXME FIXME Should remove "selection" member. FXGLViewer should have no knowledge of any GL object besides scene. Should delegate all messages it does not understand to "target" and not to current object. Picking, selection should pass list of records in callback; this list should NOT contain zmin, zmax, but just, for each record: number of names, and the names. List is ended by 0 (no names) record. The list should be sorted based on zmin, zmax, with first record in list being the one closest to the eye. Should add FXGLLight objects, which can be added to FXGLGroups. Should add subclass of FXGLGroup which pushes/pops attributes. Note that we will keep the camera state in the FXGLViewer widget, i.e. won't have camera objects. FIXME FIXME FIXME FIXME FIXME FIXME FIXME - Need 3 dials to rotate about model (not screen) axes. - Zoom centered on point at which you started the zoom operation. */ // Size of pick buffer #define MAX_PICKBUF 1024 // Maximum length of selection path #define MAX_SELPATH 64 // Rotation tolerance #define EPS 1.0E-2 // Pick tolerance #define PICK_TOL 3 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXGLViewer) FXGLViewerMap[]={ FXMAPFUNC(SEL_PAINT,0,FXGLViewer::onPaint), FXMAPFUNC(SEL_MOTION,0,FXGLViewer::onMotion), FXMAPFUNC(SEL_MOUSEWHEEL,0,FXGLViewer::onMouseWheel), FXMAPFUNC(SEL_TIMEOUT,FXGLViewer::ID_TIPTIMER,FXGLViewer::onTipTimer), FXMAPFUNC(SEL_DND_ENTER,0,FXGLViewer::onDNDEnter), FXMAPFUNC(SEL_DND_LEAVE,0,FXGLViewer::onDNDLeave), FXMAPFUNC(SEL_DND_DROP,0,FXGLViewer::onDNDDrop), FXMAPFUNC(SEL_DND_MOTION,0,FXGLViewer::onDNDMotion), FXMAPFUNC(SEL_ENTER,0,FXGLViewer::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXGLViewer::onLeave), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXGLViewer::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXGLViewer::onLeftBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXGLViewer::onMiddleBtnPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXGLViewer::onMiddleBtnRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXGLViewer::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXGLViewer::onRightBtnRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXGLViewer::onUngrabbed), FXMAPFUNC(SEL_KEYPRESS,0,FXGLViewer::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXGLViewer::onKeyRelease), FXMAPFUNC(SEL_FOCUSIN,0,FXGLViewer::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXGLViewer::onFocusOut), FXMAPFUNC(SEL_CHANGED,0,FXGLViewer::onChanged), FXMAPFUNC(SEL_CLICKED,0,FXGLViewer::onClicked), FXMAPFUNC(SEL_DOUBLECLICKED,0,FXGLViewer::onDoubleClicked), FXMAPFUNC(SEL_TRIPLECLICKED,0,FXGLViewer::onTripleClicked), FXMAPFUNC(SEL_LASSOED,0,FXGLViewer::onLassoed), FXMAPFUNC(SEL_SELECTED,0,FXGLViewer::onSelected), FXMAPFUNC(SEL_DESELECTED,0,FXGLViewer::onDeselected), FXMAPFUNC(SEL_INSERTED,0,FXGLViewer::onInserted), FXMAPFUNC(SEL_DELETED,0,FXGLViewer::onDeleted), FXMAPFUNC(SEL_PICKED,0,FXGLViewer::onPick), FXMAPFUNC(SEL_CLIPBOARD_LOST,0,FXGLViewer::onClipboardLost), FXMAPFUNC(SEL_CLIPBOARD_GAINED,0,FXGLViewer::onClipboardGained), FXMAPFUNC(SEL_CLIPBOARD_REQUEST,0,FXGLViewer::onClipboardRequest), FXMAPFUNC(SEL_QUERY_TIP,0,FXGLViewer::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXGLViewer::onQueryHelp), FXMAPFUNCS(SEL_UPDATE,FXGLViewer::ID_DIAL_X,FXGLViewer::ID_DIAL_Z,FXGLViewer::onUpdXYZDial), FXMAPFUNCS(SEL_CHANGED,FXGLViewer::ID_DIAL_X,FXGLViewer::ID_DIAL_Z,FXGLViewer::onCmdXYZDial), FXMAPFUNCS(SEL_COMMAND,FXGLViewer::ID_DIAL_X,FXGLViewer::ID_DIAL_Z,FXGLViewer::onCmdXYZDial), FXMAPFUNCS(SEL_UPDATE,FXGLViewer::ID_ROLL,FXGLViewer::ID_YAW,FXGLViewer::onUpdRollPitchYaw), FXMAPFUNCS(SEL_COMMAND,FXGLViewer::ID_ROLL,FXGLViewer::ID_YAW,FXGLViewer::onCmdRollPitchYaw), FXMAPFUNCS(SEL_CHANGED,FXGLViewer::ID_ROLL,FXGLViewer::ID_YAW,FXGLViewer::onCmdRollPitchYaw), FXMAPFUNCS(SEL_UPDATE,FXGLViewer::ID_SCALE_X,FXGLViewer::ID_SCALE_Z,FXGLViewer::onUpdXYZScale), FXMAPFUNCS(SEL_COMMAND,FXGLViewer::ID_SCALE_X,FXGLViewer::ID_SCALE_Z,FXGLViewer::onCmdXYZScale), FXMAPFUNCS(SEL_CHANGED,FXGLViewer::ID_SCALE_X,FXGLViewer::ID_SCALE_Z,FXGLViewer::onCmdXYZScale), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_PERSPECTIVE,FXGLViewer::onUpdPerspective), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_PERSPECTIVE,FXGLViewer::onCmdPerspective), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_PARALLEL,FXGLViewer::onUpdParallel), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_PARALLEL,FXGLViewer::onCmdParallel), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_FRONT,FXGLViewer::onUpdFront), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_FRONT,FXGLViewer::onCmdFront), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_BACK,FXGLViewer::onUpdBack), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_BACK,FXGLViewer::onCmdBack), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_LEFT,FXGLViewer::onUpdLeft), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_LEFT,FXGLViewer::onCmdLeft), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_RIGHT,FXGLViewer::onUpdRight), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_RIGHT,FXGLViewer::onCmdRight), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_TOP,FXGLViewer::onUpdTop), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_TOP,FXGLViewer::onCmdTop), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_BOTTOM,FXGLViewer::onUpdBottom), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_BOTTOM,FXGLViewer::onCmdBottom), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_RESETVIEW,FXWindow::onUpdYes), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_RESETVIEW,FXGLViewer::onCmdResetView), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_FITVIEW,FXWindow::onUpdYes), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_FITVIEW,FXGLViewer::onCmdFitView), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_CUT_SEL,FXGLViewer::onUpdDeleteSel), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_CUT_SEL,FXGLViewer::onCmdCutSel), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_COPY_SEL,FXGLViewer::onUpdCurrent), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_COPY_SEL,FXGLViewer::onCmdCopySel), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_PASTE_SEL,FXGLViewer::onUpdYes), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_PASTE_SEL,FXGLViewer::onCmdPasteSel), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_DELETE_SEL,FXGLViewer::onUpdDeleteSel), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_DELETE_SEL,FXGLViewer::onCmdDeleteSel), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_BACK_COLOR,FXGLViewer::onUpdBackColor), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_BACK_COLOR,FXGLViewer::onCmdBackColor), FXMAPFUNC(SEL_CHANGED,FXGLViewer::ID_BACK_COLOR,FXGLViewer::onCmdBackColor), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_AMBIENT_COLOR,FXGLViewer::onUpdAmbientColor), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_AMBIENT_COLOR,FXGLViewer::onCmdAmbientColor), FXMAPFUNC(SEL_CHANGED,FXGLViewer::ID_AMBIENT_COLOR,FXGLViewer::onCmdAmbientColor), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_LIGHTING,FXGLViewer::onUpdLighting), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_LIGHTING,FXGLViewer::onCmdLighting), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_FOG,FXGLViewer::onUpdFog), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_DITHER,FXGLViewer::onUpdDither), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_LIGHT_AMBIENT,FXGLViewer::onUpdLightAmbient), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_LIGHT_AMBIENT,FXGLViewer::onCmdLightAmbient), FXMAPFUNC(SEL_CHANGED,FXGLViewer::ID_LIGHT_AMBIENT,FXGLViewer::onCmdLightAmbient), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_LIGHT_DIFFUSE,FXGLViewer::onUpdLightDiffuse), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_LIGHT_DIFFUSE,FXGLViewer::onCmdLightDiffuse), FXMAPFUNC(SEL_CHANGED,FXGLViewer::ID_LIGHT_DIFFUSE,FXGLViewer::onCmdLightDiffuse), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_LIGHT_SPECULAR,FXGLViewer::onUpdLightSpecular), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_LIGHT_SPECULAR,FXGLViewer::onCmdLightSpecular), FXMAPFUNC(SEL_CHANGED,FXGLViewer::ID_LIGHT_SPECULAR,FXGLViewer::onCmdLightSpecular), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_TURBO,FXGLViewer::onUpdTurbo), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_TURBO,FXGLViewer::onCmdTurbo), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_PRINT_IMAGE,FXGLViewer::onUpdYes), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_PRINT_VECTOR,FXGLViewer::onUpdYes), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_LASSO_ZOOM,FXGLViewer::onUpdYes), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_LASSO_ZOOM,FXGLViewer::onCmdLassoZoom), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_LASSO_SELECT,FXGLViewer::onUpdYes), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_LASSO_SELECT,FXGLViewer::onCmdLassoSelect), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_FOG,FXGLViewer::onCmdFog), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_DITHER,FXGLViewer::onCmdDither), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_FOV,FXGLViewer::onUpdFov), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_FOV,FXGLViewer::onCmdFov), FXMAPFUNC(SEL_CHANGED,FXGLViewer::ID_FOV,FXGLViewer::onCmdFov), FXMAPFUNC(SEL_UPDATE,FXGLViewer::ID_ZOOM,FXGLViewer::onUpdZoom), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_ZOOM,FXGLViewer::onCmdZoom), FXMAPFUNC(SEL_CHANGED,FXGLViewer::ID_ZOOM,FXGLViewer::onCmdZoom), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_PRINT_IMAGE,FXGLViewer::onCmdPrintImage), FXMAPFUNC(SEL_COMMAND,FXGLViewer::ID_PRINT_VECTOR,FXGLViewer::onCmdPrintVector), FXMAPFUNCS(SEL_UPDATE,FXGLViewer::ID_TOP_COLOR,FXGLViewer::ID_BOTTOM_COLOR,FXGLViewer::onUpdGradientBackColor), FXMAPFUNCS(SEL_COMMAND,FXGLViewer::ID_TOP_COLOR,FXGLViewer::ID_BOTTOM_COLOR,FXGLViewer::onCmdGradientBackColor), FXMAPFUNCS(SEL_CHANGED,FXGLViewer::ID_TOP_COLOR,FXGLViewer::ID_BOTTOM_COLOR,FXGLViewer::onCmdGradientBackColor), }; // Object implementation FXIMPLEMENT(FXGLViewer,FXGLCanvas,FXGLViewerMap,ARRAYNUMBER(FXGLViewerMap)) /*******************************************************************************/ // Drag type names for generic object const FXchar FXGLViewer::objectTypeName[]="application/x-globject"; // Drag type for generic object FXDragType FXGLViewer::objectType=0; /*******************************************************************************/ // For deserialization FXGLViewer::FXGLViewer(){ flags|=FLAG_ENABLED|FLAG_DROPTARGET; dial[0]=0; dial[1]=0; dial[2]=0; dropped=NULL; selection=NULL; zsortfunc=NULL; doesturbo=FALSE; mode=HOVERING; } // Construct GL viewer widget with private display list FXGLViewer::FXGLViewer(FXComposite* p,FXGLVisual *vis,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXGLCanvas(p,vis,NULL,tgt,sel,opts,x,y,w,h){ initialize(); } // Construct GL viewer widget with shared display list FXGLViewer::FXGLViewer(FXComposite* p,FXGLVisual *vis,FXGLViewer* sharegroup,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXGLCanvas(p,vis,sharegroup,tgt,sel,opts,x,y,w,h){ initialize(); } // Common initialization for constructor void FXGLViewer::initialize(){ flags|=FLAG_ENABLED|FLAG_DROPTARGET; defaultCursor=getApp()->getDefaultCursor(DEF_CROSSHAIR_CURSOR); dragCursor=getApp()->getDefaultCursor(DEF_CROSSHAIR_CURSOR); projection=PERSPECTIVE; // Projection zoom=1.0; // Zoom factor fov=30.0; // Field of view (1 to 90) wvt.left=-1.0; // Init world box wvt.right=1.0; wvt.top=1.0; wvt.bottom=-1.0; wvt.hither=0.1; wvt.yon=1.0; wvt.w=100; // Viewport width wvt.h=100; // Viewport height diameter=2.0; // Size of model distance=7.464116; // Distance of PRP to target rotation.x=0.0f; // Orientation rotation.y=0.0f; rotation.z=0.0f; rotation.w=1.0f; center.x=0.0f; // Model center center.y=0.0f; center.z=0.0f; scale.x=1.0f; // Model scaling scale.y=1.0f; scale.z=1.0f; updateProjection(); // Initial projection updateTransform(); // Set transformation maxhits=512; // Maximum hit buffer size background[0][0]=0.5f; // Top background background[0][1]=0.5f; background[0][2]=1.0f; background[0][3]=1.0f; background[1][0]=1.0f; // Bottom background background[1][1]=1.0f; background[1][2]=1.0f; background[1][3]=1.0f; ambient[0]=0.2f; // Scene ambient ambient[1]=0.2f; ambient[2]=0.2f; ambient[3]=1.0f; light.ambient[0]=0.0f; // Light ambient light.ambient[1]=0.0f; light.ambient[2]=0.0f; light.ambient[3]=1.0f; light.diffuse[0]=1.0f; // Light diffuse light.diffuse[1]=1.0f; light.diffuse[2]=1.0f; light.diffuse[3]=1.0f; light.specular[0]=0.0f; // Light specular light.specular[1]=0.0f; light.specular[2]=0.0f; light.specular[3]=1.0f; light.position[0]=-2.0f; // Light position light.position[1]= 2.0f; light.position[2]= 5.0f; light.position[3]= 0.0f; light.direction[0]= 0.0f; // Light direction light.direction[1]= 0.0f; light.direction[2]=-1.0f; light.exponent=0.0f; // Light spot exponent light.cutoff=180.0f; // Light spot cutoff light.c_attn=1.0f; // Light constant attenuation light.l_attn=0.0f; // Light linear attenuation light.q_attn=0.0f; // Light quadratic attenuation material.ambient[0]=0.2f; // Material ambient reflectivity material.ambient[1]=0.2f; material.ambient[2]=0.2f; material.ambient[3]=1.0f; material.diffuse[0]=0.8f; // Material diffuse reflectivity material.diffuse[1]=0.8f; material.diffuse[2]=0.8f; material.diffuse[3]=1.0f; material.specular[0]=1.0f; // Material specular reflectivity material.specular[1]=1.0f; material.specular[2]=1.0f; material.specular[3]=1.0f; material.emission[0]=0.0f; // Material emissivity material.emission[1]=0.0f; material.emission[2]=0.0f; material.emission[3]=1.0f; material.shininess=30.0f; // Material shininess dial[0]=0; // Old dial position dial[1]=0; // Old dial position dial[2]=0; // Old dial position dropped=NULL; // Nobody being dropped on selection=NULL; // No initial selection zsortfunc=NULL; // Routine to sort feedback buffer scene=NULL; // Scene to look at doesturbo=FALSE; // In interaction turbomode=FALSE; // Turbo mode mode=HOVERING; // Mouse operation } // Create window void FXGLViewer::create(){ FXRangef r(-1.0f,1.0f,-1.0f,1.0f,-1.0f,1.0f); // We would like to have this be true #ifdef HAVE_GL_H FXASSERT(sizeof(FXuint)==sizeof(GLuint)); #endif // Create Window FXGLCanvas::create(); // Set up OpenGL environment glsetup(); // Register drag type for color if(!colorType){colorType=getApp()->registerDragType(colorTypeName);} if(!objectType){objectType=getApp()->registerDragType(objectTypeName);} // If have scene already, get correct bounds if(scene) scene->bounds(r); // Set initial viewing volume setBounds(r); } // Detach window void FXGLViewer::detach(){ FXGLCanvas::detach(); colorType=0; objectType=0; } /********************* V i e w i n g S e t u p ***************************/ // Set up GL context void FXGLViewer::glsetup(){ #ifdef HAVE_GL_H // Make GL context current if(makeCurrent()){ // Initialize GL context glRenderMode(GL_RENDER); // Fast hints glHint(GL_POLYGON_SMOOTH_HINT,GL_FASTEST); glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_FASTEST); glHint(GL_FOG_HINT,GL_FASTEST); glHint(GL_LINE_SMOOTH_HINT,GL_FASTEST); glHint(GL_POINT_SMOOTH_HINT,GL_FASTEST); // Z-buffer test on glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glDepthRange(0.0,1.0); glClearDepth(1.0); glClearColor(background[0][0],background[0][1],background[0][2],background[0][3]); // No face culling glDisable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CCW); // Two sided lighting glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,TRUE); glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient); // Preferred blend over background glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); // Light on glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0,GL_AMBIENT,light.ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,light.diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,light.specular); glLightfv(GL_LIGHT0,GL_POSITION,light.position); glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,light.direction); glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,light.exponent); glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,light.cutoff); glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,light.c_attn); glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,light.l_attn); glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,light.q_attn); // Viewer is close glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,TRUE); // Material colors glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,material.ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,material.diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,material.specular); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,material.emission); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,material.shininess); // Vertex colors change both diffuse and ambient glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); glDisable(GL_COLOR_MATERIAL); // Simplest and fastest drawing is default glShadeModel(GL_FLAT); glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); glDisable(GL_POINT_SMOOTH); glDisable(GL_COLOR_MATERIAL); // Lighting glDisable(GL_LIGHTING); // No normalization of normals (it's broken on some machines anyway) glDisable(GL_NORMALIZE); // Dithering if needed glDisable(GL_DITHER); makeNonCurrent(); } #endif } // Render all the graphics into a world box void FXGLViewer::drawWorld(FXViewport& wv){ #ifdef HAVE_GL_H // Set viewport glViewport(0,0,wv.w,wv.h); // Reset important stuff glShadeModel(GL_SMOOTH); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glDisable(GL_LIGHTING); glDisable(GL_ALPHA_TEST); glDisable(GL_BLEND); glDisable(GL_DITHER); glDisable(GL_FOG); glDisable(GL_LOGIC_OP); glDisable(GL_POLYGON_SMOOTH); glDisable(GL_POLYGON_STIPPLE); glDisable(GL_STENCIL_TEST); glDisable(GL_CULL_FACE); glDisable(GL_COLOR_MATERIAL); // Reset matrices glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Clear to solid background glClearDepth(1.0); glClearColor(background[0][0],background[0][1],background[0][2],background[0][3]); if(background[0]==background[1]){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); } // Clear to gradient background else{ glClear(GL_DEPTH_BUFFER_BIT); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); glBegin(GL_TRIANGLE_STRIP); glColor4fv(background[1]); glVertex3f(-1.0f,-1.0f,0.0f); glVertex3f( 1.0f,-1.0f,0.0f); glColor4fv(background[0]); glVertex3f(-1.0f, 1.0f,0.0f); glVertex3f( 1.0f, 1.0f,0.0f); glEnd(); } // Depth test on by default glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); // Switch to projection matrix glMatrixMode(GL_PROJECTION); glLoadIdentity(); switch(projection){ case PARALLEL: glOrtho(wv.left,wv.right,wv.bottom,wv.top,wv.hither,wv.yon); break; case PERSPECTIVE: glFrustum(wv.left,wv.right,wv.bottom,wv.top,wv.hither,wv.yon); break; } // Switch to model matrix glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Set light parameters glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0,GL_AMBIENT,light.ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,light.diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,light.specular); glLightfv(GL_LIGHT0,GL_POSITION,light.position); glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,light.direction); glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,light.exponent); glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,light.cutoff); glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,light.c_attn); glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,light.l_attn); glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,light.q_attn); // Default material colors glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,material.ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,material.diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,material.specular); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,material.emission); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,material.shininess); // Color commands change both glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); // Global ambient light glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient); // Enable fog if(options&VIEWER_FOG){ glEnable(GL_FOG); glFogfv(GL_FOG_COLOR,background[0]); // Disappear into the background //glFogf(GL_FOG_DENSITY,1.0f); glFogf(GL_FOG_START,(GLfloat)(distance-diameter)); // Range tight around model position glFogf(GL_FOG_END,(GLfloat)(distance+diameter)); // Far place same as clip plane:- clipped stuff is in the mist! glFogi(GL_FOG_MODE,GL_LINEAR); // Simple linear depth cueing } // Dithering if(options&VIEWER_DITHER){ glEnable(GL_DITHER); } // Enable lighting if(options&VIEWER_LIGHTING){ glEnable(GL_LIGHTING); } // Set model matrix glLoadMatrixf(transform); // Draw what's visible if(scene) scene->draw(this); #endif } // Render with anti-aliasing void FXGLViewer::drawAnti(FXViewport& wv){ #ifdef HAVE_GL_H FXViewport jt=wv; FXdouble d=0.5*worldpx; register FXuint i; glClearAccum(0.0f,0.0f,0.0f,0.0f); glClear(GL_ACCUM_BUFFER_BIT); for(i=0; ihit(this); glPopName(); nhits=glRenderMode(GL_RENDER); mh<<=1; } while(nhits<0); makeNonCurrent(); if(!nhits) FXFREE(&hits); return nhits; } #endif return 0; } // Process picks FXGLObject* FXGLViewer::processHits(FXuint *pickbuffer,FXint nhits){ FXuint d1,d2,i,n,zmin,zmax,sel=0; if(0<=nhits){ for(i=0,zmin=zmax=4294967295U; nhits>0; i+=n+3,nhits--){ n=pickbuffer[i]; d1=pickbuffer[1+i]; d2=pickbuffer[2+i]; if(d1identify(&pickbuffer[4+sel]); } return NULL; } // Build NULL-terminated list of ALL picked objects overlapping rectangle FXGLObject** FXGLViewer::select(FXint x,FXint y,FXint w,FXint h){ FXGLObject *obj,**objects=NULL; FXint nhits,i,j; FXuint *hits; if(scene && maxhits){ if(selectHits(hits,nhits,x,y,w,h)){ // FIXME leak FXMALLOC(&objects,FXGLObject*,nhits+1); for(i=j=0; nhits>0; i+=hits[i]+3,nhits--){ if((obj=scene->identify(&hits[4+i]))!=NULL) objects[j++]=obj; } objects[j]=NULL; FXFREE(&hits); } } return objects; } // Lasso objects FXGLObject** FXGLViewer::lasso(FXint x1,FXint y1,FXint x2,FXint y2){ FXint xlo,xhi,ylo,yhi; FXMINMAX(xlo,xhi,x1,x2); FXMINMAX(ylo,yhi,y1,y2); return select(xlo,ylo,xhi-xlo+1,yhi-ylo+1); } // Pick ONE object at x,y FXGLObject* FXGLViewer::pick(FXint x,FXint y){ FXGLObject *obj=NULL; FXuint *hits; FXint nhits; if(scene && maxhits){ if(selectHits(hits,nhits,x-PICK_TOL,y-PICK_TOL,PICK_TOL*2,PICK_TOL*2)){ // FIXME leak obj=processHits(hits,nhits); FXFREE(&hits); } } return obj; } // Repaint the GL window long FXGLViewer::onPaint(FXObject*,FXSelector,void*){ #ifdef HAVE_GL_H FXGLVisual *vis=(FXGLVisual*)getVisual(); FXASSERT(xid); if(makeCurrent()){ drawWorld(wvt); if(vis->isDoubleBuffer()) swapBuffers(); makeNonCurrent(); } #endif return 1; } // Handle configure notify void FXGLViewer::layout(){ wvt.w=width; wvt.h=height; updateProjection(); flags&=~FLAG_DIRTY; } // Start motion timer while in this window long FXGLViewer::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXGLCanvas::onEnter(sender,sel,ptr); if(isEnabled()){ getApp()->addTimeout(this,ID_TIPTIMER,getApp()->getMenuPause()); } return 1; } // Stop motion timer when leaving window long FXGLViewer::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXGLCanvas::onLeave(sender,sel,ptr); if(isEnabled()){ getApp()->removeTimeout(this,ID_TIPTIMER); } return 1; } // Gained focus long FXGLViewer::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXGLCanvas::onFocusIn(sender,sel,ptr); if(selection && selection->handle(this,FXSEL(SEL_FOCUSIN,0),ptr)){ update(); } return 1; } // Lost focus long FXGLViewer::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXGLCanvas::onFocusOut(sender,sel,ptr); if(selection && selection->handle(this,FXSEL(SEL_FOCUSOUT,0),ptr)){ update(); } return 1; } // Change scene void FXGLViewer::setScene(FXGLObject* sc){ scene=sc; update(); } // Change field of view void FXGLViewer::setFieldOfView(FXdouble fv){ FXdouble tn; fov=FXCLAMP(2.0,fv,90.0); tn=tan(0.5*DTOR*fov); FXASSERT(tn>0.0); distance=diameter/tn; FXASSERT(distance>0.0); updateProjection(); updateTransform(); update(); } // Change eye distance void FXGLViewer::setDistance(FXdouble d){ if(d114.0*diameter) d=114.0*diameter; if(d!=distance){ distance=d; FXASSERT(distance>0.0); fov=2.0*RTOD*atan2(diameter,distance); updateProjection(); updateTransform(); update(); } } // Change zoom factor void FXGLViewer::setZoom(FXdouble zm){ if(zm<1.0E-30) zm=1.0E-30; if(zm!=zoom){ zoom=zm; updateProjection(); update(); } } // Change scale factors void FXGLViewer::setScale(FXVec3f s){ if(s.x<0.000001f) s.x=0.000001f; if(s.y<0.000001f) s.y=0.000001f; if(s.z<0.000001f) s.z=0.000001f; if(scale!=s){ scale=s; updateTransform(); update(); } } // Change orientation to new quaternion void FXGLViewer::setOrientation(FXQuatf rot){ if(rot!=rotation){ rotation=rot; rotation.adjust(); updateTransform(); update(); } } // Change world projection void FXGLViewer::updateProjection(){ FXdouble hither_fac,r,aspect; // Should be non-0 size viewport if(wvt.w>0 && wvt.h>0){ // Aspect ratio of viewer aspect = (FXdouble)wvt.h / (FXdouble)wvt.w; // Get world box r=0.5*diameter/zoom; if(wvt.w<=wvt.h){ wvt.left=-r; wvt.right=r; wvt.bottom=-r*aspect; wvt.top=r*aspect; } else{ wvt.left=-r/aspect; wvt.right=r/aspect; wvt.bottom=-r; wvt.top=r; } FXASSERT(distance>0.0); FXASSERT(diameter>0.0); // A more intelligent method for setting the // clip planes might be interesting... wvt.yon=distance+diameter; wvt.hither=0.1*wvt.yon; //wvt.hither=distance-diameter; // if(wvt.hitherworld backmapping ax=wvt.left; ay=wvt.top-worldpx; // Report factors FXTRACE((100,"worldpx=%g modelpx=%g\n",worldpx,modelpx)); // Correction for perspective if(projection==PERSPECTIVE){ FXASSERT(distance>0.0); hither_fac=wvt.hither/distance; wvt.left*=hither_fac; wvt.right*=hither_fac; wvt.top*=hither_fac; wvt.bottom*=hither_fac; } } } // Change transformation matrix void FXGLViewer::updateTransform(){ transform.eye(); transform.trans(0.0f,0.0f,(FXfloat)-distance); transform.rot(rotation); transform.scale(scale); transform.trans(-center); itransform=transform.invert(); // FXTRACE((150,"itrans=%11.8f %11.8f %11.8f %11.8f\n",itransform[0][0],itransform[0][1],itransform[0][2],itransform[0][3])); // FXTRACE((150," %11.8f %11.8f %11.8f %11.8f\n",itransform[1][0],itransform[1][1],itransform[1][2],itransform[1][3])); // FXTRACE((150," %11.8f %11.8f %11.8f %11.8f\n",itransform[2][0],itransform[2][1],itransform[2][2],itransform[2][3])); // FXTRACE((150," %11.8f %11.8f %11.8f %11.8f\n",itransform[3][0],itransform[3][1],itransform[3][2],itransform[3][3])); // FXTRACE((150,"\n")); // FXTRACE((150," trans=%11.8f %11.8f %11.8f %11.8f\n",transform[0][0],transform[0][1],transform[0][2],transform[0][3])); // FXTRACE((150," %11.8f %11.8f %11.8f %11.8f\n",transform[1][0],transform[1][1],transform[1][2],transform[1][3])); // FXTRACE((150," %11.8f %11.8f %11.8f %11.8f\n",transform[2][0],transform[2][1],transform[2][2],transform[2][3])); // FXTRACE((150," %11.8f %11.8f %11.8f %11.8f\n",transform[3][0],transform[3][1],transform[3][2],transform[3][3])); // FXTRACE((150,"\n")); // FXHMat check=itransform*transform; // FXTRACE((150," check=%11.8f %11.8f %11.8f %11.8f\n",check[0][0],check[0][1],check[0][2],check[0][3])); // FXTRACE((150," %11.8f %11.8f %11.8f %11.8f\n",check[1][0],check[1][1],check[1][2],check[1][3])); // FXTRACE((150," %11.8f %11.8f %11.8f %11.8f\n",check[2][0],check[2][1],check[2][2],check[2][3])); // FXTRACE((150," %11.8f %11.8f %11.8f %11.8f\n",check[3][0],check[3][1],check[3][2],check[3][3])); // FXTRACE((150,"\n")); } // Set model bounding box FXbool FXGLViewer::setBounds(const FXRangef& r){ // FXTRACE((100,"xlo=%g xhi=%g ylo=%g yhi=%g zlo=%g zhi=%g\n",r.lower.x,r.upper.x,r.lower.y,r.upper.y,r.lower.z,r.upper.z)); // Model center center=r.center(); // Model size diameter=r.longest(); // Fix zero size model if(diameter<1.0E-30) diameter=1.0; // Set equal scaling initially scale=FXVec3f(1.0f,1.0f,1.0f); // Reset distance (and thus field of view) setDistance(1.1*diameter); return TRUE; } // Fit view to new bounds FXbool FXGLViewer::fitToBounds(const FXRangef& box){ FXRangef r(FLT_MAX,-FLT_MAX,FLT_MAX,-FLT_MAX,FLT_MAX,-FLT_MAX); FXMat4f m; // Get rotation of model m.eye(); m.rot(rotation); m.trans(-box.center()); // Transform box for(int i=0; i<8; i++){ r.include(box.corner(i)*m); } setBounds(r); return TRUE; } // Obtain viewport void FXGLViewer::getViewport(FXViewport& v) const { v=wvt; } // Set material void FXGLViewer::setMaterial(const FXMaterial &mtl){ material=mtl; update(); } // Get material void FXGLViewer::getMaterial(FXMaterial &mtl) const { mtl=material; } // Get screen point from eye coordinate void FXGLViewer::eyeToScreen(FXint& sx,FXint& sy,FXVec3f e){ register double xp,yp; if(projection==PERSPECTIVE){ if(e.z==0.0f){ fxerror("%s::eyeToScreen: cannot transform point.\n",getClassName()); } xp=-distance*e.x/e.z; yp=-distance*e.y/e.z; } else{ xp=e.x; yp=e.y; } sx=(int)((xp-ax)/worldpx); sy=(int)((ay-yp)/worldpx); } // Convert screen point to eye coords FXVec3f FXGLViewer::screenToEye(FXint sx,FXint sy,FXfloat eyez){ register float xp,yp; FXVec3f e; xp=(float)(worldpx*sx+ax); yp=(float)(ay-worldpx*sy); if(projection==PERSPECTIVE){ FXASSERT(distance>0.0); e.x=(FXfloat)(-eyez*xp/distance); e.y=(FXfloat)(-eyez*yp/distance); e.z=eyez; } else{ e.x=xp; e.y=yp; e.z=eyez; } return e; } // Convert screen to eye, on projection plane FXVec3f FXGLViewer::screenToTarget(FXint sx,FXint sy){ return FXVec3f((FXfloat)(worldpx*sx+ax), (FXfloat)(ay-worldpx*sy), (FXfloat)-distance); } // Convert world to eye coords FXVec3f FXGLViewer::worldToEye(FXVec3f w){ return w*transform; } // Get eye Z-coordinate of world point FXfloat FXGLViewer::worldToEyeZ(FXVec3f w){ return w.x*transform[0][2]+w.y*transform[1][2]+w.z*transform[2][2]+transform[3][2]; } // Convert eye to world coords FXVec3f FXGLViewer::eyeToWorld(FXVec3f e){ return e*itransform; } // Get world vector FXVec3f FXGLViewer::worldVector(FXint fx,FXint fy,FXint tx,FXint ty){ FXVec3f wfm,wto,vec; wfm=screenToTarget(fx,fy); wto=screenToTarget(tx,ty); vec=wto*itransform-wfm*itransform; return vec; } // Get a bore vector FXbool FXGLViewer::getBoreVector(FXint sx,FXint sy,FXVec3f& point,FXVec3f& dir){ FXVec3f p=eyeToWorld(screenToEye(sx,sy,(FXfloat)(diameter-distance))); if(PARALLEL==projection) point=eyeToWorld(screenToEye(sx,sy,0.0f)); else point=eyeToWorld(FXVec3f(0.0f,0.0f,0.0f)); dir=normalize(p-point); return TRUE; } // Get eye viewing direction (non-normalized) FXVec3f FXGLViewer::getEyeVector() const { return FXVec3f(-itransform[2][0],-itransform[2][1],-itransform[2][2]); } // Get eye position FXVec3f FXGLViewer::getEyePosition() const{ return FXVec3f(itransform[3][0],itransform[3][1],itransform[3][2]); } // Change model center void FXGLViewer::setCenter(FXVec3f cntr){ if(center!=cntr){ center=cntr; updateTransform(); update(); } } // Translate in world void FXGLViewer::translate(FXVec3f vec){ center+=vec; updateTransform(); update(); } // Change selection void FXGLViewer::setSelection(FXGLObject* sel){ if(selection!=sel){ selection=sel; update(); } } // Change help text void FXGLViewer::setHelpText(const FXString& text){ help=text; } // Change tip text void FXGLViewer::setTipText(const FXString& text){ tip=text; } // Translate point into unit-sphere coordinate FXVec3f FXGLViewer::spherePoint(FXint px,FXint py){ FXfloat d,t,screenmin; FXVec3f v; if(wvt.w>wvt.h) screenmin=(FXfloat)wvt.h; else screenmin=(FXfloat)wvt.w; v.x=2.0f*(px-0.5f*wvt.w)/screenmin; v.y=2.0f*(0.5f*wvt.h-py)/screenmin; d=v.x*v.x+v.y*v.y; if(d<0.75){ v.z=sqrtf(1.0-d); } else if(d<3.0f){ d=1.7320508008f-sqrtf(d); t=1.0f-d*d; if(t<0.0f) t=0.0f; v.z=1.0f-sqrtf(t); } else{ v.z=0.0f; } return normalize(v); } // Turn camera; simpler now that arc() is changed FXQuatf FXGLViewer::turn(FXint fx,FXint fy,FXint tx,FXint ty){ return FXQuatf(spherePoint(fx,fy),spherePoint(tx,ty)); } // Draw non-destructive lasso box; drawing twice will erase it again void FXGLViewer::drawLasso(FXint x0,FXint y0,FXint x1,FXint y1){ #ifdef HAVE_GL_H FXGLVisual *vis=(FXGLVisual*)getVisual(); // With OpenGL, first change back to 1:1 projection mode if(makeCurrent()){ // Save state glPushAttrib(GL_COLOR_BUFFER_BIT|GL_ENABLE_BIT|GL_DEPTH_BUFFER_BIT|GL_LINE_BIT); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glPushMatrix(); // Fix xform glLoadIdentity(); glOrtho(0.0,width-1.0,0.0,height-1.0,0.0,1.0); // Draw in front buffer, so we see it w/o blowing // away the drawing by calling swapBuffers. if(vis->isDoubleBuffer()) glDrawBuffer(GL_FRONT); // Fancy stuff off glLineWidth(1.0); glDisable(GL_DEPTH_TEST); glDisable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING); glShadeModel(GL_FLAT); glDepthMask(FALSE); glDisable(GL_DITHER); // Windows #ifdef WIN32 #ifndef _ALPHA_ // MS-Windows has logic ops, and they seem to work:- at least // with the unaccelerated software rendering they seem to... glEnable(GL_COLOR_LOGIC_OP); glLogicOp(GL_INVERT); #else // ALPHA CPU's don't have logic ops; or at least they're broken :-( glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); glEnable(GL_BLEND); #endif // UNIX #else #if !defined(GL_VERSION_1_1) || !defined(GL_VERSION_1_2) // If you don't have OpenGL 1.1 or better, blending // to invert the lasso is your only choice... glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ZERO); glEnable(GL_BLEND); #else // You have OpenGL 1.1 or better, but chances are it // still doesn't work, because you may have an incomplete // implementation [DEC], or perhaps broken hardware. // If it works for you, uncomment the lines below, // and comment the ones above... glEnable(GL_COLOR_LOGIC_OP); glLogicOp(GL_INVERT); #endif #endif glBegin(GL_LINE_LOOP); glColor4ub(255,255,255,255); glVertex2i(x0,wvt.h-y0-1); glVertex2i(x0,wvt.h-y1-1); glVertex2i(x1,wvt.h-y1-1); glVertex2i(x1,wvt.h-y0-1); glEnd(); glFinish(); // Moved back here because of driver issues // Restore to old state glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glPopAttrib(); makeNonCurrent(); } #endif } /************************* Mouse Actions in Viewer ***************************/ // Current object changed long FXGLViewer::onChanged(FXObject*,FXSelector,void* ptr){ setSelection((FXGLObject*)ptr); if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),ptr); return 1; } // Message that indicates where user picked long FXGLViewer::onPick(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_PICKED,message),ptr); } // Clicked in widget long FXGLViewer::onClicked(FXObject*,FXSelector,void* ptr){ if(target){ if(target->tryHandle(this,FXSEL(SEL_CLICKED,message),ptr)) return 1; if(ptr && target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr)) return 1; } return 1; } // Double clicked in widget; ptr may or may not point to an object long FXGLViewer::onDoubleClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_DOUBLECLICKED,message),ptr); } // Triple clicked in widget; ptr may or may not point to an object long FXGLViewer::onTripleClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_TRIPLECLICKED,message),ptr); } // Lassoed object(s) long FXGLViewer::onLassoed(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXGLObject **objlist; // Notify target of lasso if(target && target->tryHandle(this,FXSEL(SEL_LASSOED,message),ptr)) return 1; // Grab all objects in lasso objlist=lasso(event->click_x,event->click_y,event->win_x,event->win_y); // Add selection mode if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_SELECTED,0),(void*)objlist); } // Toggle selection mode else if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_DESELECTED,0),(void*)objlist); } // Free list FXFREE(&objlist); return 1; } // Selected object(s) long FXGLViewer::onSelected(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_SELECTED,message),ptr); } // Deselected object(s) long FXGLViewer::onDeselected(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_DESELECTED,message),ptr); } // Inserted object(s) long FXGLViewer::onInserted(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_INSERTED,message),ptr); } // Deleted object(s) long FXGLViewer::onDeleted(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_DELETED,message),ptr); } // Change operation void FXGLViewer::setOp(FXuint o){ if(mode!=o){ switch(o){ case HOVERING: setDragCursor(getDefaultCursor()); FXTRACE((100,"HOVERING\n")); if(doesturbo) update(); doesturbo=FALSE; break; case PICKING: FXTRACE((100,"PICKING\n")); setDragCursor(getDefaultCursor()); break; case ROTATING: FXTRACE((100,"ROTATING\n")); doesturbo=turbomode; setDragCursor(getApp()->getDefaultCursor(DEF_ROTATE_CURSOR)); break; case POSTING: FXTRACE((100,"POSTING\n")); setDragCursor(getDefaultCursor()); break; case TRANSLATING: FXTRACE((100,"TRANSLATING\n")); doesturbo=turbomode; setDragCursor(getApp()->getDefaultCursor(DEF_MOVE_CURSOR)); break; case ZOOMING: FXTRACE((100,"ZOOMING\n")); doesturbo=turbomode; setDragCursor(getApp()->getDefaultCursor(DEF_DRAGH_CURSOR)); break; case FOVING: FXTRACE((100,"FOVING\n")); doesturbo=turbomode; setDragCursor(getApp()->getDefaultCursor(DEF_DRAGH_CURSOR)); break; case DRAGGING: FXTRACE((100,"DRAGGING\n")); doesturbo=turbomode; setDragCursor(getApp()->getDefaultCursor(DEF_MOVE_CURSOR)); break; case TRUCKING: FXTRACE((100,"TRUCKING\n")); doesturbo=turbomode; setDragCursor(getApp()->getDefaultCursor(DEF_DRAGH_CURSOR)); break; case GYRATING: FXTRACE((100,"GYRATING\n")); doesturbo=turbomode; setDragCursor(getApp()->getDefaultCursor(DEF_ROTATE_CURSOR)); break; case DO_LASSOSELECT: if(mode==LASSOSELECT) return; FXTRACE((100,"LASSOSELECT\n")); setDefaultCursor(getApp()->getDefaultCursor(DEF_CORNERNW_CURSOR)); /// FIXME grab break; case LASSOSELECT: FXTRACE((100,"LASSOSELECT\n")); setDefaultCursor(getDragCursor()); setDragCursor(getApp()->getDefaultCursor(DEF_CORNERNW_CURSOR)); break; case DO_LASSOZOOM: if(mode==LASSOZOOM) return; FXTRACE((100,"LASSOZOOM\n")); setDefaultCursor(getApp()->getDefaultCursor(DEF_CORNERNW_CURSOR)); /// FIXME grab break; case LASSOZOOM: FXTRACE((100,"LASSOZOOM\n")); setDefaultCursor(getDragCursor()); setDragCursor(getApp()->getDefaultCursor(DEF_CORNERNW_CURSOR)); break; } mode=o; } } // Perform the usual mouse manipulation long FXGLViewer::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; FXTRACE((100,"onLeftBtnPress Mask=%08x\n",event->state)); handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); flags&=~FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; if(event->state&RIGHTBUTTONMASK){ if(event->state&SHIFTMASK) setOp(TRUCKING); else setOp(ZOOMING); } else if(event->state&MIDDLEBUTTONMASK){ setOp(ROTATING); } else if(mode==DO_LASSOZOOM){ if(0<=event->click_x && 0<=event->click_y && event->click_xclick_yclick_x,event->click_y,event->win_x,event->win_y); setOp(LASSOZOOM); } else{ getApp()->beep(); } } else if(mode==DO_LASSOSELECT){ if(0<=event->click_x && 0<=event->click_y && event->click_xclick_yclick_x,event->click_y,event->win_x,event->win_y); setOp(LASSOSELECT); } else{ getApp()->beep(); } } else if(event->state&(SHIFTMASK|CONTROLMASK)){ setOp(PICKING); } else if(selection && selection->canDrag() && selection==pick(event->click_x,event->click_y)){ setOp(DRAGGING); } else{ setOp(PICKING); } } return 1; } // Left mouse button released long FXGLViewer::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXGLObject *objects[2]; FXint new_x,new_y,cx,cy,xl,xh,yl,yh; FXVec3f vec; FXTRACE((100,"onLeftBtnRelease Mask=%08x\n",event->state)); if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(event->state&RIGHTBUTTONMASK){ if(event->state&SHIFTMASK){ setOp(GYRATING); } else if(event->state&CONTROLMASK){ setOp(FOVING); } else{ setOp(TRANSLATING); } grab(); } else if(event->state&MIDDLEBUTTONMASK){ if(event->state&SHIFTMASK){ setOp(TRUCKING); } else{ setOp(ZOOMING); } grab(); } else if(mode==LASSOZOOM){ new_x=FXCLAMP(0,event->win_x,(width-1)); new_y=FXCLAMP(0,event->win_y,(height-1)); drawLasso(event->click_x,event->click_y,new_x,new_y); xl=FXMIN(new_x,event->click_x); xh=FXMAX(new_x,event->click_x); yl=FXMIN(new_y,event->click_y); yh=FXMAX(new_y,event->click_y); if(xh>xl && yh>yl){ cx=(getWidth()-(xl+xh))/2; cy=(getHeight()-(yl+yh))/2; vec=worldVector(0,0,cx,cy); translate(-vec); setZoom(zoom*getWidth()/(xh-xl)); } setOp(HOVERING); } else if(mode==LASSOSELECT){ // FIXME interpret control and shift for selection changes new_x=FXCLAMP(0,event->win_x,(width-1)); new_y=FXCLAMP(0,event->win_y,(height-1)); drawLasso(event->click_x,event->click_y,new_x,new_y); handle(this,FXSEL(SEL_LASSOED,0),ptr); setOp(HOVERING); } else if(mode==PICKING){ // FIXME interpret control and shift for selection changes setOp(HOVERING); if(!handle(this,FXSEL(SEL_PICKED,0),ptr)){ objects[0]=pick(event->click_x,event->click_y); objects[1]=NULL; handle(this,FXSEL(SEL_CHANGED,0),(void*)objects[0]); // FIXME want multiple objects handle(this,FXSEL(SEL_SELECTED,0),(void*)objects); } } else if(mode==DRAGGING){ if(target) target->tryHandle(this,FXSEL(SEL_DRAGGED,message),selection); setOp(HOVERING); } else{ setOp(HOVERING); } if(event->click_count==1){ handle(this,FXSEL(SEL_CLICKED,0),(void*)selection); } else if(event->click_count==2){ handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)selection); } else if(event->click_count==3){ handle(this,FXSEL(SEL_TRIPLECLICKED,0),(void*)selection); } } return 1; } // Pressed middle mouse button long FXGLViewer::onMiddleBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; FXTRACE((100,"onMiddleBtnPress Mask=%08x\n",event->state)); handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); flags&=~FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONPRESS,message),ptr)) return 1; if(event->state&SHIFTMASK){ setOp(TRUCKING); } else{ setOp(ZOOMING); } } return 1; } // Released middle mouse button long FXGLViewer::onMiddleBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXTRACE((100,"onMiddleBtnRelease Mask=%08x\n",event->state)); if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONRELEASE,message),ptr)) return 1; if(event->state&LEFTBUTTONMASK){ setOp(ROTATING); grab(); } else if(event->state&RIGHTBUTTONMASK){ if(event->state&SHIFTMASK){ setOp(GYRATING); } else if(event->state&CONTROLMASK){ setOp(FOVING); } else{ setOp(TRANSLATING); } grab(); } else{ setOp(HOVERING); } } return 1; } // Pressed right button long FXGLViewer::onRightBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; FXTRACE((100,"onRightBtnPress Mask=%08x\n",event->state)); handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); flags&=~FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; if(event->state&LEFTBUTTONMASK){ if(event->state&SHIFTMASK){ setOp(TRUCKING); } else{ setOp(ZOOMING); } } else if(event->state&MIDDLEBUTTONMASK){ if(event->state&SHIFTMASK){ setOp(GYRATING); } else if(event->state&CONTROLMASK){ setOp(FOVING); } else{ setOp(TRANSLATING); } } else{ if(event->state&SHIFTMASK){ setOp(GYRATING); } else if(event->state&CONTROLMASK){ setOp(FOVING); } else{ setOp(POSTING); } } } return 1; } // Microsoft Visual C++: Disable compiler warnings for empty "if" // statements below in FXGLViewer::onRightBtnRelease() #ifdef _MSC_VER #pragma warning( disable : 4390 ) #endif // Released right button long FXGLViewer::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXGLObject *hit; FXTRACE((100,"onRightBtnRelease Mask=%08x\n",event->state)); if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; if(event->state&LEFTBUTTONMASK){ setOp(ROTATING); grab(); } else if(event->state&MIDDLEBUTTONMASK){ if(event->state&SHIFTMASK){ setOp(TRUCKING); } else{ setOp(ZOOMING); } grab(); } else{ if(mode==POSTING){ setOp(HOVERING); hit=pick(event->click_x,event->click_y); if(hit && hit->handle(this,FXSEL(SEL_COMMAND,ID_QUERY_MENU),ptr)) ; else if(target && target->tryHandle(this,FXSEL(SEL_COMMAND,ID_QUERY_MENU),ptr)) ; } setOp(HOVERING); } } return 1; } // Mouse moved long FXGLViewer::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint new_x,new_y,old_x,old_y; long changed=(flags&FLAG_TIP)!=0; FXdouble delta; FXfloat tmp; FXVec3f vec; FXQuatf q; flags&=~FLAG_TIP; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_MOTION,message),ptr)) return 1; getApp()->removeTimeout(this,ID_TIPTIMER); switch(mode){ case HOVERING: // Reset the timer each time we moved the cursor getApp()->addTimeout(this,ID_TIPTIMER,getApp()->getMenuPause()); break; case PICKING: // Picking if(!event->moved){ // Keep picking mode for now break; } if(event->state&(SHIFTMASK|CONTROLMASK)){ // Lasso mode if modifier held down drawLasso(event->click_x,event->click_y,event->win_x,event->win_y); setOp(LASSOSELECT); break; } setOp(ROTATING); // Go into rotation mode case ROTATING: // Rotating camera around target q=turn(event->last_x,event->last_y,event->win_x,event->win_y) * getOrientation(); setOrientation(q); changed=1; break; case POSTING: // Posting right-mouse menu; if moving more than delta, we go to translate mode if(!event->moved) break; setOp(TRANSLATING); case TRANSLATING: // Translating camera vec=worldVector(event->last_x,event->last_y,event->win_x,event->win_y); translate(-vec); changed=1; break; case ZOOMING: // Zooming camera delta=0.005*(event->win_y-event->last_y); setZoom(getZoom()*pow(2.0,delta)); changed=1; break; case FOVING: // Change FOV setFieldOfView(getFieldOfView()+90.0*(event->win_y-event->last_y)/(double)wvt.h); changed=1; break; case DRAGGING: // Dragging a shape if(selection && selection->drag(this,event->last_x,event->last_y,event->win_x,event->win_y)){ //// Perhaps callback here for the target to be notified of the new object position update(); } changed=1; break; case TRUCKING: // Trucking camera forward or backward tmp=(FXfloat)(worldpx*(event->win_y-event->last_y)); vec=normalize(getEyeVector()); translate(tmp*vec); changed=1; break; case GYRATING: // Rotating camera around eye { FXMat4f mm; FXQuatf qq; qq=turn(event->win_x,event->win_y,event->last_x,event->last_y); mm.eye(); mm.trans(0.0f,0.0f,(FXfloat)-distance); // FIXME This aint it yet... mm.rot(qq); mm.trans(0.0f,0.0f,(FXfloat)distance); center=center*mm; q=qq * getOrientation(); setOrientation(q); update(); changed=1; } break; case LASSOSELECT: // Dragging a lasso case LASSOZOOM: old_x=FXCLAMP(0,event->last_x,(width-1)); old_y=FXCLAMP(0,event->last_y,(height-1)); new_x=FXCLAMP(0,event->win_x,(width-1)); new_y=FXCLAMP(0,event->win_y,(height-1)); drawLasso(event->click_x,event->click_y,old_x,old_y); drawLasso(event->click_x,event->click_y,new_x,new_y); if(new_x>event->click_x){ if(new_y>event->click_y) setDragCursor(getApp()->getDefaultCursor(DEF_CORNERSE_CURSOR)); else setDragCursor(getApp()->getDefaultCursor(DEF_CORNERNE_CURSOR)); } else{ if(new_y>event->click_y) setDragCursor(getApp()->getDefaultCursor(DEF_CORNERSW_CURSOR)); else setDragCursor(getApp()->getDefaultCursor(DEF_CORNERNW_CURSOR)); } changed=1; break; } } return changed; } // Mouse wheel long FXGLViewer::onMouseWheel(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_MOUSEWHEEL,message),ptr)) return 1; setZoom(getZoom()*pow(2.0,-0.1*event->code/120.0)); return 1; } return 0; } // Handle keyboard press/release long FXGLViewer::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; switch(event->code){ case KEY_Shift_L: case KEY_Shift_R: // We do not switch modes unless something was going on already if(mode!=HOVERING){ if((event->state&MIDDLEBUTTONMASK) || ((event->state&LEFTBUTTONMASK) && (event->state&RIGHTBUTTONMASK))){ setOp(TRUCKING); } else if(event->state&RIGHTBUTTONMASK){ setOp(GYRATING); } } return 1; case KEY_Control_L: case KEY_Control_R: // We do not switch modes unless something was going on already if(mode!=HOVERING){ if(event->state&RIGHTBUTTONMASK){ setOp(FOVING); } } return 1; } } return 0; } // Key release long FXGLViewer::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Shift_L: case KEY_Shift_R: // We do not switch modes unless something was going on already if(mode!=HOVERING){ if((event->state&MIDDLEBUTTONMASK) || ((event->state&LEFTBUTTONMASK) && (event->state&RIGHTBUTTONMASK))){ setOp(ZOOMING); } else if(event->state&RIGHTBUTTONMASK){ setOp(TRANSLATING); } } return 1; case KEY_Control_L: case KEY_Control_R: // We do not switch modes unless something was going on already if(mode!=HOVERING){ if(event->state&RIGHTBUTTONMASK){ setOp(TRANSLATING); } } return 1; } } return 0; } // The widget lost the grab for some reason long FXGLViewer::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXGLCanvas::onUngrabbed(sender,sel,ptr); flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; setOp(HOVERING); doesturbo=FALSE; return 1; } // We timed out, i.e. the user didn't move for a while long FXGLViewer::onTipTimer(FXObject*,FXSelector,void*){ FXTRACE((250,"%s::onTipTimer %p\n",getClassName(),this)); flags|=FLAG_TIP; return 1; } // We were asked about status text long FXGLViewer::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // We were asked about tip text long FXGLViewer::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if(flags&FLAG_TIP){ FXint x,y; FXuint state; getCursorPosition(x,y,state); FXGLObject *hit=pick(x,y); if(hit && hit->handle(sender,sel,ptr)) return 1; if(!tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } } return 0; } /***************************** Switch Projection *****************************/ // Switch to perspective mode long FXGLViewer::onCmdPerspective(FXObject*,FXSelector,void*){ setProjection(PERSPECTIVE); return 1; } // Update sender long FXGLViewer::onUpdPerspective(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,(projection==PERSPECTIVE)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Switch to parallel mode long FXGLViewer::onCmdParallel(FXObject*,FXSelector,void*){ setProjection(PARALLEL); return 1; } // Update sender long FXGLViewer::onUpdParallel(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,(projection==PARALLEL)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } /***************************** Switch Viewpoints *****************************/ // View front long FXGLViewer::onCmdFront(FXObject*,FXSelector,void*){ rotation=FXQuatf(0.0f,0.0f,0.0f,1.0f); updateTransform(); update(); return 1; } // Update sender long FXGLViewer::onUpdFront(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,(EPS>fabs(rotation[0]) && EPS>fabs(rotation[1]) && EPS>fabs(rotation[2]) && EPS>fabs(rotation[3]-1.0)) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // View back long FXGLViewer::onCmdBack(FXObject*,FXSelector,void*){ rotation=FXQuatf(0.0f,-1.0f,0.0f,0.0f); updateTransform(); update(); return 1; } // Update sender long FXGLViewer::onUpdBack(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,(EPS>fabs(rotation[0]) && EPS>fabs(rotation[1]+1.0) && EPS>fabs(rotation[2]) && EPS>fabs(rotation[3])) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // View left long FXGLViewer::onCmdLeft(FXObject*,FXSelector,void*){ rotation=FXQuatf(0.0f,0.7071067811865f,0.0f,0.7071067811865f); updateTransform(); update(); return 1; } // Update sender long FXGLViewer::onUpdLeft(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,(EPS>fabs(rotation[0]) && EPS>fabs(rotation[1]-0.7071067811865) && EPS>fabs(rotation[2]) && EPS>fabs(rotation[3]-0.7071067811865)) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // View right long FXGLViewer::onCmdRight(FXObject*,FXSelector,void*){ rotation=FXQuatf(0.0f,-0.7071067811865f,0.0f,0.7071067811865f); updateTransform(); update(); return 1; } // Update sender long FXGLViewer::onUpdRight(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,(EPS>fabs(rotation[0]) && EPS>fabs(rotation[1]+0.7071067811865) && EPS>fabs(rotation[2]) && EPS>fabs(rotation[3]-0.7071067811865)) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // View top long FXGLViewer::onCmdTop(FXObject*,FXSelector,void*){ rotation=FXQuatf(0.7071067811865f,0.0f,0.0f,0.7071067811865f); updateTransform(); update(); return 1; } // Update sender long FXGLViewer::onUpdTop(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,(EPS>fabs(rotation[0]-0.7071067811865) && EPS>fabs(rotation[1]) && EPS>fabs(rotation[2]) && EPS>fabs(rotation[3]-0.7071067811865)) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // View bottom long FXGLViewer::onCmdBottom(FXObject*,FXSelector,void*){ rotation=FXQuatf(-0.7071067811865f,0.0f,0.0f,0.7071067811865f); updateTransform(); update(); return 1; } // Update sender long FXGLViewer::onUpdBottom(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,(EPS>fabs(rotation[0]+0.7071067811865) && EPS>fabs(rotation[1]) && EPS>fabs(rotation[2]) && EPS>fabs(rotation[3]-0.7071067811865)) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Reset view long FXGLViewer::onCmdResetView(FXObject*,FXSelector,void*){ FXRangef r(-1.0f,1.0f,-1.0f,1.0f,-1.0f,1.0f); rotation=FXQuatf(0.0f,0.0f,0.0f,1.0f); zoom=1.0; scale=FXVec3f(1.0f,1.0f,1.0f); if(scene) scene->bounds(r); setBounds(r); updateProjection(); updateTransform(); update(); return 1; } // Fit view long FXGLViewer::onCmdFitView(FXObject*,FXSelector,void*){ FXRangef r(-1.0f,1.0f,-1.0f,1.0f,-1.0f,1.0f); if(scene) scene->bounds(r); setBounds(r); update(); return 1; } // Update zoom long FXGLViewer::onUpdZoom(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETREALVALUE),(void*)&zoom); return 1; } // Change zoom long FXGLViewer::onCmdZoom(FXObject* sender,FXSelector sel,void*){ FXdouble z=zoom; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETREALVALUE),(void*)&z); doesturbo=(FXSELTYPE(sel)==SEL_CHANGED)?turbomode:FALSE; setZoom(z); return 1; } // Update field of view long FXGLViewer::onUpdFov(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETREALVALUE),(void*)&fov); return 1; } // Change field of view long FXGLViewer::onCmdFov(FXObject* sender,FXSelector sel,void*){ FXdouble f=fov; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETREALVALUE),(void*)&f); doesturbo=(FXSELTYPE(sel)==SEL_CHANGED)?turbomode:FALSE; setFieldOfView(f); return 1; } // Scale model long FXGLViewer::onCmdXYZScale(FXObject* sender,FXSelector sel,void*){ FXVec3f s=scale; FXdouble value; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETREALVALUE),&value); s[FXSELID(sel)-ID_SCALE_X]=(FXfloat)value; doesturbo=(FXSELTYPE(sel)==SEL_CHANGED)?turbomode:FALSE; setScale(s); return 1; } // Update scale value long FXGLViewer::onUpdXYZScale(FXObject* sender,FXSelector sel,void*){ FXdouble value=scale[FXSELID(sel)-ID_SCALE_X]; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETREALVALUE),(void*)&value); return 1; } // Rotate camera about model by means of dials long FXGLViewer::onCmdXYZDial(FXObject*,FXSelector sel,void* ptr){ const FXVec3f xaxis(1.0f,0.0f,0.0f); const FXVec3f yaxis(0.0f,1.0f,0.0f); const FXVec3f zaxis(0.0f,0.0f,1.0f); FXint dialnew=(FXint)(FXival)ptr; FXfloat ang; FXQuatf q; if(FXSELTYPE(sel)==SEL_CHANGED){ doesturbo=turbomode; FXASSERT(ID_DIAL_X<=FXSELID(sel) && FXSELID(sel)<=ID_DIAL_Z); switch(FXSELID(sel)){ case ID_DIAL_X: ang=(FXfloat)(DTOR*(dialnew-dial[0])); q.setAxisAngle(xaxis,-ang); dial[0]=dialnew; break; case ID_DIAL_Y: ang=(FXfloat)(DTOR*(dialnew-dial[1])); q.setAxisAngle(yaxis, ang); dial[1]=dialnew; break; case ID_DIAL_Z: ang=(FXfloat)(DTOR*(dialnew-dial[2])); q.setAxisAngle(zaxis, ang); dial[2]=dialnew; break; } setOrientation(q*getOrientation()); } else if(doesturbo){ doesturbo=FALSE; update(); } return 1; } // Update dial value long FXGLViewer::onUpdXYZDial(FXObject* sender,FXSelector sel,void*){ FXASSERT(ID_DIAL_X<=FXSELID(sel) && FXSELID(sel)<=ID_DIAL_Z); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&dial[FXSELID(sel)-ID_DIAL_X]); return 1; } // Update roll pitch yaw long FXGLViewer::onCmdRollPitchYaw(FXObject* sender,FXSelector sel,void*){ FXASSERT(ID_ROLL<=FXSELID(sel) && FXSELID(sel)<=ID_YAW); FXfloat rpy[3]; FXdouble ang; rotation.getRollPitchYaw(rpy[0],rpy[1],rpy[2]); sender->handle(this,FXSEL(SEL_COMMAND,ID_GETREALVALUE),(void*)&ang); rpy[FXSELID(sel)-ID_ROLL]=(FXfloat)(DTOR*ang); doesturbo=(FXSELTYPE(sel)==SEL_CHANGED)?turbomode:FALSE; setOrientation(FXQuatf(rpy[0],rpy[1],rpy[2])); update(); return 1; } // Update roll pitch yaw long FXGLViewer::onUpdRollPitchYaw(FXObject* sender,FXSelector sel,void*){ FXASSERT(ID_ROLL<=FXSELID(sel) && FXSELID(sel)<=ID_YAW); FXfloat rpy[3]; rotation.getRollPitchYaw(rpy[0],rpy[1],rpy[2]); FXdouble ang=RTOD*rpy[FXSELID(sel)-ID_ROLL]; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETREALVALUE),(void*)&ang); return 1; } /****************************** Printing Support *****************************/ // Read back pixels // Derived from code contributed by FXbool FXGLViewer::readPixels(FXColor*& buffer,FXint x,FXint y,FXint w,FXint h){ #ifdef HAVE_GL_H if(1<=w && 1<=h){ GLint swapbytes,lsbfirst,rowlength,skiprows,skippixels,alignment,oldbuf; register FXColor *p,*q,*pp,*qq,t; // Try allocate buffer if(FXMALLOC(&buffer,FXColor,w*h)){ // Make context current makeCurrent(); // Save old pixel formats glGetIntegerv(GL_PACK_SWAP_BYTES,&swapbytes); glGetIntegerv(GL_PACK_LSB_FIRST,&lsbfirst); glGetIntegerv(GL_PACK_ROW_LENGTH,&rowlength); glGetIntegerv(GL_PACK_SKIP_ROWS,&skiprows); glGetIntegerv(GL_PACK_SKIP_PIXELS,&skippixels); glGetIntegerv(GL_PACK_ALIGNMENT,&alignment); glGetIntegerv(GL_READ_BUFFER,&oldbuf); // Set pixel readback formats glPixelStorei(GL_PACK_SWAP_BYTES,GL_FALSE); glPixelStorei(GL_PACK_LSB_FIRST,GL_FALSE); glPixelStorei(GL_PACK_ROW_LENGTH,0); glPixelStorei(GL_PACK_SKIP_ROWS,0); glPixelStorei(GL_PACK_SKIP_PIXELS,0); glPixelStorei(GL_PACK_ALIGNMENT,1); // Read from the right buffer glReadBuffer((GLenum)GL_FRONT); // Read the pixels glReadPixels(x,y,w,h,GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)buffer); // Flip image upside down pp=buffer; qq=buffer+(h-1)*w; do{ p=pp; pp+=w; q=qq; qq-=w; do{ FXSWAP(*p,*q,t); p++; q++; } while(pflush(TRUE); // Then try grab the pixels if(readPixels(buffer,0,0,width,height)){ // FXFileStream outfile; // if(outfile.open("testje.bmp",FXStreamSave)){ // fxsaveBMP(outfile,buffer,width,height); // outfile.close(); // } // Open print dialog FXPrintDialog dlg(this,tr("Print Scene")); // Run dialog if(dlg.execute()){ FXPrinter printer; // Get the printer dlg.getPrinter(printer); // Printer device context FXDCPrint pdc(getApp()); // Try open printer if(!pdc.beginPrint(printer)){ FXMessageBox::error(this,MBOX_OK,tr("Printer Error"),tr("Unable to print.")); return 1; } // Page header pdc.beginPage(1); // This is very ad-hoc; please don't look pdc.outf("/picstr %d string def\n",width*3); pdc.outf("%d %d translate\n",50,50); pdc.outf("%d %d scale\n",width,height); pdc.outf("%d %d %d\n",width,height,8); pdc.outf("[%d 0 0 -%d 0 %d]\n",width,height,height); pdc.outf("{currentfile picstr readhexstring pop}\n"); pdc.outf("false %d\n",3); pdc.outf("colorimage\n"); for(int i=0; iflush(TRUE); // Page header pdc.beginPage(1); // Read feedback if(readFeedback(buffer,used,size,0,0,width,height)){ if(zsortfunc) (*zsortfunc)(buffer,used,size); // FIXME:- may throw exception drawFeedback(pdc,buffer,used); } // Page trailer pdc.endPage(); pdc.endPrint(); } return 1; } // Zoom into lasso rectangle long FXGLViewer::onCmdLassoZoom(FXObject*,FXSelector,void*){ setOp(DO_LASSOZOOM); return 1; } // Select objects in lasso rectangle long FXGLViewer::onCmdLassoSelect(FXObject*,FXSelector,void*){ setOp(DO_LASSOSELECT); return 1; } /***************************** Selection Support *****************************/ // We now really do have the selection long FXGLViewer::onClipboardGained(FXObject* sender,FXSelector sel,void* ptr){ FXGLCanvas::onClipboardGained(sender,sel,ptr); return 1; } // We lost the selection somehow long FXGLViewer::onClipboardLost(FXObject* sender,FXSelector sel,void* ptr){ FXGLCanvas::onClipboardLost(sender,sel,ptr); return 1; } // Somebody wants our selection long FXGLViewer::onClipboardRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; // FXuchar *data; FXuint len; // Try handling it in base class first if(FXGLCanvas::onClipboardRequest(sender,sel,ptr)) return 1; // Requested data from clipboard if(event->target==objectType){ FXTRACE((100,"requested objectType\n")); // FXMemoryStream stream; // stream.open(NULL,0,FXStreamSave); // stream.takeBuffer(data,len); // stream.close(); // setDNDData(FROM_CLIPBOARD,objectType,data,len); return 1; } return 0; } // Cut selected object long FXGLViewer::onCmdCutSel(FXObject*,FXSelector,void*){ // Serialize object into temp buffer // Delete object, tell target it was deleted //fxwarning("%s::onCmdCutSel: unimplemented.\n",getClassName()); return 1; } // Copy selected object long FXGLViewer::onCmdCopySel(FXObject*,FXSelector,void*){ // Serialize object into buffer //fxwarning("%s::onCmdCopySel: unimplemented.\n",getClassName()); return 1; } // Paste object long FXGLViewer::onCmdPasteSel(FXObject*,FXSelector,void*){ // Ask clipboard for object data [What type?] // Deserialize data [type?] // Tell target about the data? //fxwarning("%s::onCmdPasteSel: unimplemented.\n",getClassName()); return 1; } // Delete selected object long FXGLViewer::onCmdDeleteSel(FXObject*,FXSelector,void*){ FXGLObject *obj[2]; obj[0]=selection; obj[1]=NULL; if(obj[0] && obj[0]->canDelete()){ handle(this,FXSEL(SEL_CHANGED,0),NULL); handle(this,FXSEL(SEL_DELETED,0),(void*)obj); //delete obj[0]; } else{ getApp()->beep(); } return 1; } // Update delete object long FXGLViewer::onUpdDeleteSel(FXObject* sender,FXSelector,void*){ if(selection && selection->canDelete()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } return 0; } // Update for current object long FXGLViewer::onUpdCurrent(FXObject* sender,FXSelector,void*){ if(selection){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } return 0; } // Set background color long FXGLViewer::onCmdBackColor(FXObject*,FXSelector sel,void* ptr){ FXColor color=(FXColor)(FXuval)ptr; background[0]=background[1]=color; if(FXSELTYPE(sel)==SEL_COMMAND || !turbomode){ update(); } return 1; } // Update background color long FXGLViewer::onUpdBackColor(FXObject* sender,FXSelector,void*){ FXColor clr=background[0]; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETVALUE),(void*)(FXuval)clr); return 1; } // Set gradient background color long FXGLViewer::onCmdGradientBackColor(FXObject*,FXSelector sel,void* ptr){ FXColor color=(FXColor)(FXuval)ptr; background[FXSELID(sel)-ID_TOP_COLOR]=color; if(FXSELTYPE(sel)==SEL_COMMAND || !turbomode){ update(); } return 1; } // Update gradient background color long FXGLViewer::onUpdGradientBackColor(FXObject* sender,FXSelector sel,void*){ FXColor clr=background[FXSELID(sel)-ID_TOP_COLOR]; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETVALUE),(void*)(FXuval)clr); return 1; } // Set ambient light color long FXGLViewer::onCmdAmbientColor(FXObject*,FXSelector sel,void* ptr){ FXColor color=(FXColor)(FXuval)ptr; ambient=color; if(FXSELTYPE(sel)==SEL_COMMAND || !turbomode){ update(); } return 1; } // Update ambient light color long FXGLViewer::onUpdAmbientColor(FXObject* sender,FXSelector,void*){ FXColor clr=ambient; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETVALUE),(void*)(FXuval)clr); return 1; } // Set ambient light color long FXGLViewer::onCmdLightAmbient(FXObject*,FXSelector sel,void* ptr){ FXColor color=(FXColor)(FXuval)ptr; light.ambient=color; if(FXSELTYPE(sel)==SEL_COMMAND || !turbomode){ update(); } return 1; } // Update ambient light color long FXGLViewer::onUpdLightAmbient(FXObject* sender,FXSelector,void*){ FXColor clr=light.ambient; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETVALUE),(void*)(FXuval)clr); return 1; } // Set diffuse light color long FXGLViewer::onCmdLightDiffuse(FXObject*,FXSelector sel,void* ptr){ FXColor color=(FXColor)(FXuval)ptr; light.diffuse=color; if(FXSELTYPE(sel)==SEL_COMMAND || !turbomode){ update(); } return 1; } // Update diffuse light color long FXGLViewer::onUpdLightDiffuse(FXObject* sender,FXSelector,void*){ FXColor clr=light.diffuse; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETVALUE),(void*)(FXuval)clr); return 1; } // Set specular light color long FXGLViewer::onCmdLightSpecular(FXObject*,FXSelector sel,void* ptr){ FXColor color=(FXColor)(FXuval)ptr; light.specular=color; if(FXSELTYPE(sel)==SEL_COMMAND || !turbomode){ update(); } return 1; } // Update specular light color long FXGLViewer::onUpdLightSpecular(FXObject* sender,FXSelector,void*){ FXColor clr=light.specular; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETVALUE),(void*)(FXuval)clr); return 1; } // Toggle Turbo Mode long FXGLViewer::onCmdTurbo(FXObject*,FXSelector,void*){ setTurboMode(!getTurboMode()); return 1; } // Update Turbo Mode long FXGLViewer::onUpdTurbo(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,getTurboMode() ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Toggle lighting long FXGLViewer::onCmdLighting(FXObject*,FXSelector,void*){ options^=VIEWER_LIGHTING; update(); return 1; } // Update lighting long FXGLViewer::onUpdLighting(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,(options&VIEWER_LIGHTING) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Toggle fog long FXGLViewer::onCmdFog(FXObject*,FXSelector,void*){ options^=VIEWER_FOG; update(); return 1; } // Update fog long FXGLViewer::onUpdFog(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,(options&VIEWER_FOG) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Toggle dithering long FXGLViewer::onCmdDither(FXObject*,FXSelector,void*){ options^=VIEWER_DITHER; update(); return 1; } // Update dithering long FXGLViewer::onUpdDither(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,(options&VIEWER_DITHER) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } /******************************* Drag and Drop *******************************/ // Handle drag-and-drop enter long FXGLViewer::onDNDEnter(FXObject* sender,FXSelector sel,void* ptr){ if(FXGLCanvas::onDNDEnter(sender,sel,ptr)) return 1; dropped=NULL; return 1; } // Handle drag-and-drop leave long FXGLViewer::onDNDLeave(FXObject* sender,FXSelector sel,void* ptr){ if(FXGLCanvas::onDNDLeave(sender,sel,ptr)) return 1; dropped=NULL; return 1; } // Handle drag-and-drop motion long FXGLViewer::onDNDMotion(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; // Handled elsewhere if(FXGLCanvas::onDNDMotion(sender,sel,ptr)) return 1; // Dropped on some object if((dropped=pick(event->win_x,event->win_y))!=NULL){ // Object agrees with drop type if(dropped->handle(this,sel,ptr)){ acceptDrop(DRAG_COPY); return 1; } // Forget about the whole thing dropped=NULL; return 0; } // Dropped in viewer background; hope its a color if(offeredDNDType(FROM_DRAGNDROP,colorType)){ acceptDrop(DRAG_COPY); return 1; } // Won't accept drop, dont know what it is return 0; } // Handle drag-and-drop drop long FXGLViewer::onDNDDrop(FXObject* sender,FXSelector sel,void* ptr){ FXushort *clr; FXuint len; // Try base class first if(FXGLCanvas::onDNDDrop(sender,sel,ptr)) return 1; // Dropped on object? if(dropped){ // Object handled drop; so probably want to repaint if(dropped->handle(this,sel,ptr)){ update(); return 1; } // We're done return 0; } // Dropped on viewer if(getDNDData(FROM_DRAGNDROP,FXGLViewer::colorType,(FXuchar*&)clr,len)){ setBackgroundColor(FXVec4f(clr[0]/65535.0f,clr[1]/65535.0f,clr[2]/65535.0f,1.0f)); FXFREE(&clr); update(); return 1; } return 0; } // Change projection void FXGLViewer::setProjection(FXuint proj){ projection=proj; updateProjection(); update(); } // Set background void FXGLViewer::setBackgroundColor(const FXVec4f& clr,FXbool bottom){ if(bottom==MAYBE){ background[0]=background[1]=clr; } else{ background[bottom]=clr; } update(); } // Set ambient color void FXGLViewer::setAmbientColor(const FXVec4f& clr){ ambient=clr; update(); } // Delegate all other messages to the GL Object long FXGLViewer::onDefault(FXObject* sender,FXSelector sel,void* ptr){ return selection && selection->handle(sender,sel,ptr); } // Change turbo mode void FXGLViewer::setTurboMode(FXbool turbo){ if(!turbo) doesturbo=FALSE; turbomode=turbo; } // Return light settings void FXGLViewer::getLight(FXLight& lite) const { lite=light; } // Change light settings void FXGLViewer::setLight(const FXLight& lite) { light=lite; update(); } // Save object to stream void FXGLViewer::save(FXStream& store) const { FXGLCanvas::save(store); store << wvt.w; store << wvt.h; store << wvt.left; store << wvt.right; store << wvt.bottom; store << wvt.top; store << wvt.hither; store << wvt.yon; store << transform; store << itransform; store << projection; store << rotation; store << fov; store << zoom; store << center; store << scale; store << worldpx; store << modelpx; store << maxhits; store << diameter; store << distance; store << background[0]; store << background[1]; store << ambient; store << turbomode; store << help; } // Load object from stream void FXGLViewer::load(FXStream& store){ FXGLCanvas::load(store); store >> wvt.w; store >> wvt.h; store >> wvt.left; store >> wvt.right; store >> wvt.bottom; store >> wvt.top; store >> wvt.hither; store >> wvt.yon; store >> transform; store >> itransform; store >> projection; store >> rotation; store >> fov; store >> zoom; store >> center; store >> scale; store >> worldpx; store >> modelpx; store >> maxhits; store >> diameter; store >> distance; store >> background[0]; store >> background[1]; store >> ambient; store >> turbomode; store >> help; } // Close and release any resources FXGLViewer::~FXGLViewer(){ getApp()->removeTimeout(this,ID_TIPTIMER); dropped=(FXGLObject*)-1L; selection=(FXGLObject*)-1L; scene=(FXGLObject*)-1L; } } fox1.6-1.6.57/src/FXGLVisual.cpp000066400000000000000000001122401326741342000160540ustar00rootroot00000000000000/******************************************************************************** * * * V i s u a l C l a s s * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGLVisual.cpp,v 1.69.2.2 2007/02/22 15:45:56 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXFont.h" #include "FXGLVisual.h" /* Notes: - FXGLVisual builds a visual/pixelformat suitable for GL drawing. - Selection of visual/pixelformat is based on a best match to a given set of hints, according to some heuristics: 1) Prefer color depth close to asked ones; really like to get a bit MORE color, rather than LESS, however. 2) If we wanted Z-buffer, it is STRONGLY preferred; If there's a choice, we prefer more color depth over more Z-depth; if we already have more colors than requested, we prefer to meet requested Z depth. 3) If we wanted double buffer, we strongly prefer it over color and Z depth, but HAVING a Z-buffer is still more important. 4) If we wanted alpha buffer, it is preferred, but Z-buffering and double buffering are considered more important. If there's a choice, we prefer to receive a few MORE bits of alpha buffer than we asked for, rather than LESS. 5) If we wanted stereo, we prefer it, but almost everything except the color-, alpha-, and Z-depths are more important. - Some further tuning may be desired, but I think this should satisfy most cases.... - Note that as long as OpenGL is in any way supported, you should ALWAYS be able to get at least some visual/pixelformat you can draw on. - As far as hardware acceleration goes, H/W acceleration should be enabled, possibly at the expense of color-, alpha-, and Z-depth; but NEVER at the expense of presence or absence of a requested feature. We only drop FEATURES which are requested if there is neither hardware nor software support. For example, we may trade in some Z-depth, but not the entire Z-buffer, to get a hardware accelerated visual/pixelformat. - SGI Infinite Reality may have up to 12 bits for red, green, blue each! */ #define DISPLAY(app) ((Display*)((app)->display)) using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXGLVisual,FXVisual,NULL,0) // Deserialization FXGLVisual::FXGLVisual(){ } // Construct FXGLVisual::FXGLVisual(FXApp* a,FXuint flgs):FXVisual(a,flgs){ FXTRACE((100,"FXGLVisual::FXGLVisual %p\n",this)); redSize=8; greenSize=8; blueSize=8; alphaSize=0; depthSize=24; stencilSize=0; accumRedSize=0; accumGreenSize=0; accumBlueSize=0; accumAlphaSize=0; } /*******************************************************************************/ #ifdef WIN32 // System colors to match against static FXuchar defSysClr[20][3] = { { 0, 0, 0 }, { 0x80,0, 0 }, { 0, 0x80,0 }, { 0x80,0x80,0 }, { 0, 0, 0x80 }, { 0x80,0, 0x80 }, { 0, 0x80,0x80 }, { 0xC0,0xC0,0xC0 }, { 192, 220, 192 }, { 166, 202, 240 }, { 255, 251, 240 }, { 160, 160, 164 }, { 0x80,0x80,0x80 }, { 0xFF,0, 0 }, { 0, 0xFF,0 }, { 0xFF,0xFF,0 }, { 0, 0, 0xFF }, { 0xFF,0, 0xFF }, { 0, 0xFF,0xFF }, { 0xFF,0xFF,0xFF } }; static int defaultOverride[13] = { 0, 3, 24, 27, 64, 67, 88, 173, 181, 236, 247, 164, 91 }; // Make palette static HPALETTE makeOpenGLPalette(PIXELFORMATDESCRIPTOR* info){ int n,i,j,rr,gg,bb; int rmax,gmax,bmax; LOGPALETTE *pal; HPALETTE hPalette; // Size of palette array n=1<<((PIXELFORMATDESCRIPTOR*)info)->cColorBits; // Allocate palette array FXMALLOC(&pal,char,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*n); pal->palVersion = 0x300; pal->palNumEntries = n; // Maximum values each color rmax=(1 << info->cRedBits)-1; gmax=(1 << info->cGreenBits)-1; bmax=(1 << info->cBlueBits)-1; // Build palette for(rr=0; rr<=rmax; rr++){ for(gg=0; gg<=gmax; gg++){ for(bb=0; bb<=bmax; bb++){ i = (rr << info->cRedShift) | (gg << info->cGreenShift) | (bb << info->cBlueShift); pal->palPalEntry[i].peRed = (255*rr)/rmax; pal->palPalEntry[i].peGreen = (255*gg)/gmax; pal->palPalEntry[i].peBlue = (255*bb)/bmax; pal->palPalEntry[i].peFlags = PC_NOCOLLAPSE; } } } // For 8-bit palette if((info->cColorBits==8) && (info->cRedBits==3) && (info->cRedShift==0) && (info->cGreenBits==3) && (info->cGreenShift==3) && (info->cBlueBits==2) && (info->cBlueShift==6)){ for(j=1; j<=12; j++){ pal->palPalEntry[defaultOverride[j]].peRed=defSysClr[j][0]; pal->palPalEntry[defaultOverride[j]].peGreen=defSysClr[j][1]; pal->palPalEntry[defaultOverride[j]].peBlue=defSysClr[j][1]; pal->palPalEntry[defaultOverride[j]].peFlags=0; } } // Make palette hPalette=CreatePalette(pal); // Free palette array FXFREE(&pal); return hPalette; } #endif /*******************************************************************************/ // Test if OpenGL is possible FXbool FXGLVisual::supported(FXApp* application,int& major,int& minor){ major=minor=0; if(application->isInitialized()){ #ifdef HAVE_GL_H #ifndef WIN32 if(!glXQueryExtension(DISPLAY(application),NULL,NULL)) return FALSE; if(!glXQueryVersion(DISPLAY(application),&major,&minor)) return FALSE; #if GL_VERSION_1_5 if(minor>5) minor=5; #elif GL_VERSION_1_4 if(minor>4) minor=4; #elif GL_VERSION_1_3 if(minor>3) minor=3; #elif GL_VERSION_1_2 if(minor>2) minor=2; #elif GL_VERSION_1_1 if(minor>1) minor=1; #else if(minor>0) minor=0; #endif return TRUE; #else major=1; #if GL_VERSION_1_4 minor=4; #elif GL_VERSION_1_3 minor=3; #elif GL_VERSION_1_2 minor=2; #elif GL_VERSION_1_1 minor=1; #else minor=0; #endif return TRUE; #endif #endif } return FALSE; } #ifndef WIN32 // UNIX // Initialize void FXGLVisual::create(){ #ifdef HAVE_GL_H if(!xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::create %p\n",getClassName(),this)); int major,minor; int gdblbuf,gllevel,glstereo,glstencil,gldepth,glrgba; int glred,glgreen,glblue,glalpha; int glaccred,glaccgreen,glaccblue,glaccalpha; int glsupport; int bestvis,dmatch,bestmatch; int dred,dgreen,dblue,ddepth,dalpha,dstencil; int daccred,daccgreen,daccblue,daccalpha; XVisualInfo vitemplate; XVisualInfo *vi; int nvi,i; // OpenGL is available if we're talking to an OpenGL-capable X-Server if(!glXQueryExtension(DISPLAY(getApp()),NULL,NULL)){ fxerror("%s::create: requested OpenGL extension not available.\n",getClassName()); } // Try get OpenGL version info if(!glXQueryVersion(DISPLAY(getApp()),&major,&minor)){ fxerror("%s::create: Unable to obtain OpenGL version numbers.\n",getClassName()); } /* #if defined(GLX_VERSION_1_3) const char *glxexts=""; glxexts=glXQueryExtensionsString(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))); GLXFBConfig *fbconfigs; int nfbconfigs,value; fbconfigs=glXGetFBConfigs(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp())),&nfbconfigs); FXTRACE((1,"nfbconfigs: %d\n",nfbconfigs)); for(int i=0; i0){ if(glalpha<1) dmatch+=100000; } // Wanted Z-buffer if(depthSize>0){ if(gldepth<1) dmatch+=10000000; else dmatch+=ddepth; } else{ if(gldepth>0) dmatch+=10000000; } // Double buffering also quite strongly preferred if(flags&VISUAL_DOUBLEBUFFER){ if(!gdblbuf) dmatch+=1000000; } else{ if(gdblbuf) dmatch+=1000000; } // Stencil buffers desired if(stencilSize>0){ if(glstencil<1) dmatch+=10000; else dmatch+=dstencil; } else{ if(glstencil>0) dmatch+=1; } // Stereo not so important if(flags&VISUAL_STEREO){ if(!glstereo) dmatch+=10000; } else{ if(glstereo) dmatch+=10000; } // Trace FXTRACE((150,"Visual 0x%02x (%d) match value = %d\n",(FXuint)vi[i].visualid,i,dmatch)); FXTRACE((150," red size = %d\n",glred)); FXTRACE((150," green size = %d\n",glgreen)); FXTRACE((150," blue size = %d\n",glblue)); FXTRACE((150," alpha size = %d\n",glalpha)); FXTRACE((150," depth size = %d\n",gldepth)); FXTRACE((150," double buf = %d\n",gdblbuf)); FXTRACE((150," stencil = %d\n",glstencil)); FXTRACE((150," acc red = %d\n",glaccred)); FXTRACE((150," acc green = %d\n",glaccgreen)); FXTRACE((150," acc blue = %d\n",glaccblue)); FXTRACE((150," acc alpha = %d\n",glaccalpha)); FXTRACE((150," stereo = %d\n",glstereo)); // May the best visual win if(dmatch<=bestmatch){ // All other things being equal, we prefer default visual! if(dmatchisInitialized()){ FXTRACE((100,"%s::create %p\n",getClassName(),this)); PIXELFORMATDESCRIPTOR pfd; HDC hdc; int gdblbuf,glstereo,gldepth,glaccel; int glred,glgreen,glblue,glalpha,glstencil; int glaccred,glaccgreen,glaccblue,glaccalpha; int glindex,glswapcopy,glcomposition; int bestvis,dmatch,bestmatch; int dred,dgreen,dblue,ddepth,dalpha,dstencil; int daccred,daccgreen,daccblue,daccalpha; int chosen,nvi,i; // Get some window handle hdc=GetDC(GetDesktopWindow()); // Get number of supported pixel formats pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion=1; nvi=DescribePixelFormat(hdc,1,sizeof(PIXELFORMATDESCRIPTOR),&pfd); if(nvi==0){ fxerror("%s::create: no OpenGL visual available.\n",getClassName()); } // Try to find the best bestvis=-1; bestmatch=1000000000; for(i=1; i<=nvi; i++) { // Get info about this visual DescribePixelFormat(hdc,i,sizeof(PIXELFORMATDESCRIPTOR),&pfd); // Make sure this visual is valid chosen=ChoosePixelFormat(hdc,&pfd); if(chosen!=i) continue; // Draw to window is required if(!(pfd.dwFlags&PFD_DRAW_TO_WINDOW)) continue; // OpenGL support is required if(!(pfd.dwFlags&PFD_SUPPORT_OPENGL)) continue; // RGBA support is required if(pfd.iPixelType!=PFD_TYPE_RGBA) continue; // Skip accelerated formats if VISUAL_NOACCEL specified if((flags&VISUAL_NOACCEL) && !(pfd.dwFlags&PFD_GENERIC_FORMAT)) continue; // Is this a hardware-accelerated visual? glaccel=(pfd.dwFlags&PFD_GENERIC_FORMAT)==0; // Must have single/double buffer as requested gdblbuf=(pfd.dwFlags&PFD_DOUBLEBUFFER)!=0; // Stereo support as requested glstereo=(pfd.dwFlags&PFD_STEREO)!=0; // Must have RGB as requested glindex=(pfd.iPixelType&PFD_TYPE_COLORINDEX)!=0; // copy swap buffer glswapcopy=(pfd.dwFlags&PFD_SWAP_COPY)!=0; #ifndef PFD_SUPPORT_COMPOSITION #define PFD_SUPPORT_COMPOSITION 0x00008000 #endif // Windows Vista and Windows 7 composition support glcomposition=(pfd.dwFlags&PFD_SUPPORT_COMPOSITION)!=0; // Get planes glred=pfd.cRedBits; glgreen=pfd.cGreenBits; glblue=pfd.cBlueBits; glalpha=pfd.cAlphaBits; gldepth=pfd.cDepthBits; glstencil=pfd.cStencilBits; glaccred=pfd.cAccumRedBits; glaccgreen=pfd.cAccumGreenBits; glaccblue=pfd.cAccumBlueBits; glaccalpha=pfd.cAccumAlphaBits; // We prefer to get a few MORE bits in RGBA than we asked for dred = glred-redSize; if(dred<0) dred *= -100; dgreen = glgreen-greenSize; if(dgreen<0) dgreen *= -100; dblue = glblue-blueSize; if(dblue<0) dblue *= -100; dalpha = glalpha-alphaSize; if(dalpha<0) dalpha *= -100; // Prefer better Z than asked, but colors more important ddepth = gldepth-depthSize; if(ddepth<0) ddepth *= -10; // We care about colors and Z depth more than stencil depth dstencil = glstencil-stencilSize; if(dstencil<0) dstencil *= -1; // Accumulation buffers daccred=glaccred-accumRedSize; if(daccred<0) daccred *= -1; daccgreen=glaccgreen-accumGreenSize; if(daccgreen<0) daccgreen *= -1; daccblue=glaccblue-accumBlueSize; if(daccblue<0) daccblue *= -1; daccalpha=glaccalpha-accumAlphaSize; if(daccalpha<0) daccalpha *= -1; // Want the best colors, of course dmatch=dred+dgreen+dblue+dalpha; // Accumulation buffers dmatch+=daccred+daccgreen+daccblue+daccalpha; // Hardware accelerated a plus if(!glaccel){ dmatch+=10000; } // Extra penalty for no alpha if we asked for alpha, but no // penalty at all if there is alpha and we didn't ask for it. if(alphaSize>0){ if(glalpha<1) dmatch+=100000; } // Wanted Z-buffer if(depthSize>0){ if(gldepth<1) dmatch+=100000000; else dmatch+=ddepth; } else{ if(gldepth>0) dmatch+=100000000; } // Double buffering also quite strongly preferred if(flags&VISUAL_DOUBLEBUFFER){ if(!gdblbuf) dmatch+=10000000; } else{ if(gdblbuf) dmatch+=10000000; } // Color index mode only if requested if(flags&VISUAL_INDEXCOLOR){ if(!glindex) dmatch+=10000000; } else{ if(glindex) dmatch+=10000000; } // Stencil buffers desired if(stencilSize>0){ if(glstencil<1) dmatch+=10000; else dmatch+=dstencil; } else{ if(glstencil>0) dmatch+=1; } // Stereo not so important if(flags&VISUAL_STEREO){ if(!glstereo) dmatch+=100000; } else{ if(glstereo) dmatch+=100000; } // Swap copies also important if(flags&VISUAL_SWAP_COPY){ if(!glswapcopy) dmatch+=10000000; } // Composition Support would be nice to have if(!glcomposition) dmatch+=100; // Trace FXTRACE((150,"Pixel Format (%d) match value = %d\n",i,dmatch)); FXTRACE((150," red size = %d\n",glred)); FXTRACE((150," green size = %d\n",glgreen)); FXTRACE((150," blue size = %d\n",glblue)); FXTRACE((150," alpha size = %d\n",glalpha)); FXTRACE((150," depth size = %d\n",gldepth)); FXTRACE((150," double buf = %d\n",gdblbuf)); FXTRACE((150," stencil = %d\n",glstencil)); FXTRACE((150," acc red = %d\n",glaccred)); FXTRACE((150," acc green = %d\n",glaccgreen)); FXTRACE((150," acc blue = %d\n",glaccblue)); FXTRACE((150," acc alpha = %d\n",glaccalpha)); FXTRACE((150," stereo = %d\n",glstereo)); FXTRACE((150," accelerated = %d\n",glaccel)); // May the best visual win if(dmatch<=bestmatch){ bestmatch=dmatch; bestvis=i; } } // Still no luck if(bestvis<0){ fxerror("%s::create: no OpenGL visual available.\n",getClassName()); } // Report best visual FXTRACE((150,"Best Pixel Format (%d) match value = %d\n",bestvis,bestmatch)); // Get the true h/w capabilities visual=(void*)(FXival)bestvis; FXMALLOC(&info,PIXELFORMATDESCRIPTOR,1); ((PIXELFORMATDESCRIPTOR*)info)->nSize=sizeof(PIXELFORMATDESCRIPTOR); ((PIXELFORMATDESCRIPTOR*)info)->nVersion=1; DescribePixelFormat(hdc,bestvis,sizeof(PIXELFORMATDESCRIPTOR),(PIXELFORMATDESCRIPTOR*)info); // Make a palette for it if needed if(((PIXELFORMATDESCRIPTOR*)info)->dwFlags&PFD_NEED_PALETTE){ colormap=makeOpenGLPalette((PIXELFORMATDESCRIPTOR*)info); freemap=TRUE; } // Done with that window ReleaseDC(GetDesktopWindow(),hdc); xid=(void*)1; // Report what we got if tracing enabled FXTRACE((150," redSize: %d\n",getActualRedSize())); FXTRACE((150," greenSize: %d\n",getActualGreenSize())); FXTRACE((150," blueSize: %d\n",getActualBlueSize())); FXTRACE((150," alphaSize: %d\n",getActualAlphaSize())); FXTRACE((150," depthSize: %d\n",getActualDepthSize())); FXTRACE((150," stencilSize: %d\n",getActualStencilSize())); FXTRACE((150," accumRedSize: %d\n",getActualAccumRedSize())); FXTRACE((150," accumGreenSize: %d\n",getActualAccumGreenSize())); FXTRACE((150," accumBlueSize: %d\n",getActualAccumBlueSize())); FXTRACE((150," accumAlphaSize: %d\n",getActualAccumAlphaSize())); FXTRACE((150," doubleBuffer: %d\n",isDoubleBuffer())); FXTRACE((150," stereo: %d\n",isStereo())); FXTRACE((150," accelerated: %d\n",isAccelerated())); } } #endif } #endif // Detach visual void FXGLVisual::detach(){ #ifdef HAVE_GL_H if(xid){ FXTRACE((100,"%s::detach %p\n",getClassName(),this)); colormap=0; freemap=FALSE; xid=0; } #endif } // Destroy visual void FXGLVisual::destroy(){ #ifdef HAVE_GL_H if(xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::destroy %p\n",getClassName(),this)); #ifndef WIN32 if(freemap){XFreeColormap(DISPLAY(getApp()),colormap);} // Should we free? XFreeGC(DISPLAY(getApp()),(GC)gc); XFreeGC(DISPLAY(getApp()),(GC)scrollgc); #else if(colormap){DeleteObject(colormap);} #endif colormap=0; freemap=FALSE; } // Free info on the 3D layout if(info) FXFREE(&info); xid=0; } #endif } // Get actual red size FXint FXGLVisual::getActualRedSize() const { if(!info){ fxerror("%s::getActualRedSize: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_RED_SIZE,&s); #else s=((PIXELFORMATDESCRIPTOR*)info)->cRedBits; #endif return s; #else return 0; #endif } // Get actual green size FXint FXGLVisual::getActualGreenSize() const { if(!info){ fxerror("%s::getActualGreenSize: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_GREEN_SIZE,&s); #else s=((PIXELFORMATDESCRIPTOR*)info)->cGreenBits; #endif return s; #else return 0; #endif } // Get actual blue size FXint FXGLVisual::getActualBlueSize() const { if(!info){ fxerror("%s::getActualBlueSize: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_BLUE_SIZE,&s); #else s=((PIXELFORMATDESCRIPTOR*)info)->cBlueBits; #endif return s; #else return 0; #endif } // Get actual alpha size FXint FXGLVisual::getActualAlphaSize() const { if(!info){ fxerror("%s::getActualAlphaSize: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_ALPHA_SIZE,&s); #else s=((PIXELFORMATDESCRIPTOR*)info)->cAlphaBits; #endif return s; #else return 0; #endif } // Get actual depth size FXint FXGLVisual::getActualDepthSize() const { if(!info){ fxerror("%s::getActualDepthSize: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_DEPTH_SIZE,&s); #else s=((PIXELFORMATDESCRIPTOR*)info)->cDepthBits; #endif return s; #else return 0; #endif } // Get actual stencil size FXint FXGLVisual::getActualStencilSize() const { if(!info){ fxerror("%s::getActualStencilSize: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_STENCIL_SIZE,&s); #else s=((PIXELFORMATDESCRIPTOR*)info)->cStencilBits; #endif return s; #else return 0; #endif } // Get actual accum red size FXint FXGLVisual::getActualAccumRedSize() const { if(!info){ fxerror("%s::getActualAccumRedSize: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_ACCUM_RED_SIZE,&s); #else s=((PIXELFORMATDESCRIPTOR*)info)->cAccumRedBits; #endif return s; #else return 0; #endif } // Get actual accum green size FXint FXGLVisual::getActualAccumGreenSize() const { if(!info){ fxerror("%s::getActualAccumGreenSize: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_ACCUM_GREEN_SIZE,&s); #else s=((PIXELFORMATDESCRIPTOR*)info)->cAccumGreenBits; #endif return s; #else return 0; #endif } // Get actual accum blue size FXint FXGLVisual::getActualAccumBlueSize() const { if(!info){ fxerror("%s::getActualAccumBlueSize: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_ACCUM_BLUE_SIZE,&s); #else s=((PIXELFORMATDESCRIPTOR*)info)->cAccumBlueBits; #endif return s; #else return 0; #endif } // Get actual accum alpha size FXint FXGLVisual::getActualAccumAlphaSize() const { if(!info){ fxerror("%s::getActualAccumAlphaSize: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_ACCUM_ALPHA_SIZE,&s); #else s=((PIXELFORMATDESCRIPTOR*)info)->cAccumAlphaBits; #endif return s; #else return 0; #endif } // Is it double buffer FXbool FXGLVisual::isDoubleBuffer() const { if(!info){ fxerror("%s::isDoubleBuffer: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_DOUBLEBUFFER,&s); #else s=(((PIXELFORMATDESCRIPTOR*)info)->dwFlags&PFD_DOUBLEBUFFER)!=0; #endif return s; #else return FALSE; #endif } // Is it stereo FXbool FXGLVisual::isStereo() const { if(!info){ fxerror("%s::isStereo: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H FXint s; #ifndef WIN32 glXGetConfig(DISPLAY(getApp()),(XVisualInfo*)info,GLX_STEREO,&s); #else s=(((PIXELFORMATDESCRIPTOR*)info)->dwFlags&PFD_STEREO)!=0; #endif return s; #else return FALSE; #endif } // Is it hardware-accelerated? FXbool FXGLVisual::isAccelerated() const { if(!info){ fxerror("%s::isHardwareAccelerated: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H #ifndef WIN32 return TRUE; #else return (((PIXELFORMATDESCRIPTOR*)info)->dwFlags&PFD_GENERIC_FORMAT)==0; #endif #else return FALSE; #endif } // Does it swap by copying instead of flipping buffers FXbool FXGLVisual::isBufferSwapCopy() const { if(!info){ fxerror("%s::isBufferSwapCopy: visual not yet initialized.\n",getClassName()); } #ifdef HAVE_GL_H #ifndef WIN32 return FALSE; #else return (((PIXELFORMATDESCRIPTOR*)info)->dwFlags&PFD_SWAP_COPY)!=0; #endif #else return FALSE; #endif } // Save to stream void FXGLVisual::save(FXStream& store) const { FXVisual::save(store); store << redSize; store << greenSize; store << blueSize; store << alphaSize; store << depthSize; store << stencilSize; store << accumRedSize; store << accumGreenSize; store << accumBlueSize; store << accumAlphaSize; } // Load from stream void FXGLVisual::load(FXStream& store){ FXVisual::load(store); store >> redSize; store >> greenSize; store >> blueSize; store >> alphaSize; store >> depthSize; store >> stencilSize; store >> accumRedSize; store >> accumGreenSize; store >> accumBlueSize; store >> accumAlphaSize; } // Destroy FXGLVisual::~FXGLVisual(){ FXTRACE((100,"FXGLVisual::~FXGLVisual %p\n",this)); destroy(); if(info) FXFREE(&info); } /*******************************************************************************/ #if defined(HAVE_XFT_H) && defined(HAVE_GL_H) // Xft version static void glXUseXftFont(XftFont* font,int first,int count,int listBase){ GLint swapbytes,lsbfirst,rowlength,skiprows,skippixels,alignment,list; GLfloat x0,y0,dx,dy; FT_Face face; FT_Error err; FXint i,size,x,y; FXuchar *glyph; // Save the current packing mode for bitmaps glGetIntegerv(GL_UNPACK_SWAP_BYTES,&swapbytes); glGetIntegerv(GL_UNPACK_LSB_FIRST,&lsbfirst); glGetIntegerv(GL_UNPACK_ROW_LENGTH,&rowlength); glGetIntegerv(GL_UNPACK_SKIP_ROWS,&skiprows); glGetIntegerv(GL_UNPACK_SKIP_PIXELS,&skippixels); glGetIntegerv(GL_UNPACK_ALIGNMENT,&alignment); // Set desired packing modes glPixelStorei(GL_UNPACK_SWAP_BYTES,GL_FALSE); glPixelStorei(GL_UNPACK_LSB_FIRST,GL_FALSE); glPixelStorei(GL_UNPACK_ROW_LENGTH,0); glPixelStorei(GL_UNPACK_SKIP_ROWS,0); glPixelStorei(GL_UNPACK_SKIP_PIXELS,0); glPixelStorei(GL_UNPACK_ALIGNMENT,1); // Get face info face=XftLockFace(font); // Render font glyphs; use FreeType to render to bitmap for(i=first; iglyph,FT_RENDER_MODE_MONO); if(err){ fxwarning("glXUseXftFont: unable to render glyph.\n"); return; } // Pitch may be negative, its the stride between rows size=FXABS(face->glyph->bitmap.pitch) * face->glyph->bitmap.rows; // Glyph coordinates; note info in freetype is 6-bit fixed point x0=-(face->glyph->metrics.horiBearingX>>6); y0=(face->glyph->metrics.height-face->glyph->metrics.horiBearingY)>>6; dx=face->glyph->metrics.horiAdvance>>6; dy=0; // Allocate glyph data FXMALLOC(&glyph,FXuchar,size); // Copy into OpenGL bitmap format; note OpenGL upside down for(y=0; yglyph->bitmap.rows; y++){ for(x=0; xglyph->bitmap.pitch; x++){ glyph[y*face->glyph->bitmap.pitch+x]=face->glyph->bitmap.buffer[(face->glyph->bitmap.rows-y-1)*face->glyph->bitmap.pitch+x]; } } // Put bitmap into display list glNewList(list,GL_COMPILE); glBitmap(FXABS(face->glyph->bitmap.pitch)<<3,face->glyph->bitmap.rows,x0,y0,dx,dy,glyph); glEndList(); // Free glyph data FXFREE(&glyph); } // Restore packing modes glPixelStorei(GL_UNPACK_SWAP_BYTES,swapbytes); glPixelStorei(GL_UNPACK_LSB_FIRST,lsbfirst); glPixelStorei(GL_UNPACK_ROW_LENGTH,rowlength); glPixelStorei(GL_UNPACK_SKIP_ROWS,skiprows); glPixelStorei(GL_UNPACK_SKIP_PIXELS,skippixels); glPixelStorei(GL_UNPACK_ALIGNMENT,alignment); // Unlock face XftUnlockFace(font); } #endif // Create a display list of bitmaps from font glyphs in a font void glUseFXFont(FXFont* font,int first,int count,int list){ if(!font || !font->id()){ fxerror("glUseFXFont: invalid font.\n"); } FXTRACE((100,"glUseFXFont: first=%d count=%d list=%d\n",first,count,list)); #ifdef HAVE_GL_H #ifndef WIN32 #ifdef HAVE_XFT_H // Using XFT glXUseXftFont((XftFont*)font->id(),first,count,list); #else // Using XLFD glXUseXFont((Font)font->id(),first,count,list); #endif #else HDC hdc=wglGetCurrentDC(); HFONT oldfont=(HFONT)SelectObject(hdc,(HFONT)font->id()); // Replace wglUseFontBitmaps() with wglUseFontBitmapsW() // Change glCallLists() parameter: // len=utf2ncs(sbuffer,text.text(),text.length()); // glCallLists(len,GL_UNSIGNED_SHORT,(GLushort*)sbuffer); // Figure out better values for "first" and "count". FXbool result=wglUseFontBitmaps(hdc,first,count,list); SelectObject(hdc,oldfont); #endif #endif } } fox1.6-1.6.57/src/FXGUISignal.cpp000066400000000000000000000112421326741342000161500ustar00rootroot00000000000000/******************************************************************************** * * * S i g n a l G U I T h r e a d * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGUISignal.cpp,v 1.5.2.1 2006/08/13 15:15:35 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXException.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #ifndef WIN32 #include #include #ifdef __CYGWIN__ #include /* For FIONREAD */ #endif #else #include #endif #include "FXGUISignal.h" /* Notes: - On UNIX, pipe will be closed on exec of child process; we don't want to get parent/child pipes crossed. - On Windows, its a manual reset event object. - This class is inspired by Daniel Gehriger's original FXExThreadEvent. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXGUISignal) FXGUISignalMap[]={ FXMAPFUNC(SEL_IO_READ,FXGUISignal::ID_IO_READ,FXGUISignal::onSignal) }; // Object implementation FXIMPLEMENT(FXGUISignal,FXObject,FXGUISignalMap,ARRAYNUMBER(FXGUISignalMap)); // Initialize FXGUISignal::FXGUISignal():app((FXApp*)-1L),target(NULL),data(NULL),message(0){ #ifndef WIN32 fd[0]=fd[1]=-1; #else event=NULL; #endif } // Add handler to application FXGUISignal::FXGUISignal(FXApp* a,FXObject* tgt,FXSelector sel,void* ptr):app(a),target(tgt),data(ptr),message(sel){ #ifndef WIN32 int res=pipe(fd); if(res!=0){ throw FXResourceException("unable to create pipe."); } // Change both ends of the pipe to close on exec since // we don't want to cross pipes with the child process. fcntl(fd[0],F_SETFD,FD_CLOEXEC); fcntl(fd[1],F_SETFD,FD_CLOEXEC); app->addInput(fd[0],INPUT_READ,this,ID_IO_READ); #else // Create event object for waking up GUI; its manual reset type // event because if the main user interface thread is awake already // we want it to go through the event loop once again before blocking. event=CreateEvent(NULL,TRUE,FALSE,NULL); if(event==NULL){ throw FXResourceException("unable to create event."); } app->addInput(event,INPUT_READ,this,ID_IO_READ); #endif } // Called by worker thread to wake GUI thread void FXGUISignal::signal(){ #ifndef WIN32 size_t n=0; if(0<=ioctl(fd[0],FIONREAD,(char*)&n) && n==0){ write(fd[1],"!",1); } #else SetEvent(event); #endif } // Fire signal message to target long FXGUISignal::onSignal(FXObject*,FXSelector,void*){ #ifndef WIN32 FXuchar stuff[1]; read(fd[0],stuff,1); #else ResetEvent(event); #endif return target && target->handle(this,FXSEL(SEL_IO_READ,message),data); } // Remove handler from application FXGUISignal::~FXGUISignal(){ #ifndef WIN32 app->removeInput(fd[0],INPUT_READ); close(fd[0]); close(fd[1]); #else app->removeInput(event,INPUT_READ); CloseHandle(event); #endif app=(FXApp*)-1L; target=(FXObject*)-1L; data=(void*)-1L; } } fox1.6-1.6.57/src/FXGZFileStream.cpp000066400000000000000000000133741326741342000166720ustar00rootroot00000000000000/******************************************************************************** * * * G Z F i l e S t r e a m C l a s s e s * * * ********************************************************************************* * Copyright (C) 2002,2006 by Sander Jansen. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGZFileStream.cpp,v 1.5.2.2 2007/09/28 16:42:20 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXObject.h" #include "FXFile.h" #include "FXGZFileStream.h" #ifdef HAVE_ZLIB_H #include "zlib.h" /* Notes: - Very basic compressed file I/O only. - Updated for new stream classes 2003/07/08. - Updated for FXFile 2005/09/03. */ #define BUFFERSIZE 8192 /*******************************************************************************/ namespace FX { // Used during compression struct ZBlock { z_stream stream; Bytef buffer[BUFFERSIZE]; }; // Initialize file stream FXGZFileStream::FXGZFileStream(const FXObject* cont):FXFileStream(cont),z(NULL),f(0){ } // Save to a file FXuval FXGZFileStream::writeBuffer(FXuval){ register FXival m,n; int zerror; if(dir!=FXStreamSave){fxerror("FXGZFileStream::writeBuffer: wrong stream direction.\n");} FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); while(rdptrstream.next_in=(Bytef*)rdptr; z->stream.avail_in=wrptr-rdptr; z->stream.next_out=z->buffer; z->stream.avail_out=BUFFERSIZE; zerror=deflate(&z->stream,f); // if(zerror!=Z_OK) break; if(zerror<0) break; // break on error condition m=z->stream.next_out-z->buffer; n=file.writeBlock(z->buffer,m); if(nstream.next_in; if(zerror==Z_STREAM_END) break; // break from FINISH/FLUSH } if(rdptrbuffer,BUFFERSIZE); // if(n<=0) break; // z->stream.next_in=z->buffer; // z->stream.avail_in=n; if(z->stream.avail_in<=0){ // Get more input if buffer is empty n=file.readBlock(z->buffer,BUFFERSIZE); if(n<0) break; z->stream.next_in=z->buffer; z->stream.avail_in=n; } z->stream.next_out=(Bytef*)wrptr; z->stream.avail_out=endptr-wrptr; zerror=inflate(&z->stream,Z_NO_FLUSH); // if(zerror!=Z_OK) break; if(zerror<0) break; // break on error condition wrptr=(FXuchar*)z->stream.next_out; if(zerror==Z_STREAM_END) break; } return wrptr-rdptr; } // Try open file stream bool FXGZFileStream::open(const FXString& filename,FXStreamDirection save_or_load,FXuval size){ if(FXFileStream::open(filename,save_or_load,size)){ if(FXCALLOC(&z,ZBlock,1)){ int zerror; z->stream.next_in=NULL; z->stream.avail_in=0; z->stream.next_out=NULL; z->stream.avail_out=0; f=Z_NO_FLUSH; if(save_or_load==FXStreamLoad){ zerror=inflateInit(&z->stream); if(zerror==Z_OK) return true; code=FXStreamNoRead; } else{ zerror=deflateInit(&z->stream,Z_DEFAULT_COMPRESSION); if(zerror==Z_OK) return true; code=FXStreamNoWrite; } FXFREE(&z); } FXFileStream::close(); } return false; } // Flush buffer bool FXGZFileStream::flush(){ bool status; int flush=f; if(f!=Z_FINISH) f=Z_SYNC_FLUSH; status=FXStream::flush(); f=flush; return status; } // Close file stream bool FXGZFileStream::close(){ if(dir){ if(dir==FXStreamLoad){ FXFileStream::close(); inflateEnd(&z->stream); } else{ f=Z_FINISH; FXFileStream::close(); deflateEnd(&z->stream); } FXFREE(&z); return true; } return false; } // Destructor FXGZFileStream::~FXGZFileStream(){ close(); } } #endif fox1.6-1.6.57/src/FXGradientBar.cpp000066400000000000000000001302221326741342000165500ustar00rootroot00000000000000/******************************************************************************** * * * G r a d i e n t B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGradientBar.cpp,v 1.71.2.1 2006/08/01 18:04:42 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXGradientBar.h" #include "FXColorDialog.h" #include "FXPopup.h" #include "FXMenuPane.h" #include "FXMenuCommand.h" /* Notes: - Shoot for compatibility with GIMP, to the extent feasible; format is: "GIMP Gradient" number_of_segments left middle right r0 g0 b0 a0 r1 g1 b1 a1 type coloring left middle right r0 g0 b0 a0 r1 g1 b1 a1 type coloring Where type is: 0 = linear 1 = curved 2 = sine 3 = sphere increasing 4 = sphere decreasing and coloring is: 0 = RGB 1 = counter clockwise hue, sat, value 2 = clockwise hue, sat, value FXGradientBar will not implement coloring #1 and #2. - Need ability to change alpha for all pivots (not the colors!). - Set/get all segmemts API. - Drop left of pivot changes left color, right changes right color, and on changes both. - Pass -1 if many segments are affected; otherwise pass affected segment index only. */ #define CONTROL_SIZE 9 #define BAR_WIDTH 64 #define BAR_HEIGHT 16 #define TAB_SIZE 9 #define TAB_DIST 5 #define TOP_PAD 3 #define BOTTOM_PAD 3 #define SIDE_PAD 6 #define TAB_PROXIMITY 20 #define ARROW_WIDTH 12 #define ARROW_HEIGHT 6 #define PICK_EXTRA 3 #define INT(x) ((int)((x)+0.5)) #define BLEND(ch,bg,alpha) (((bg)*(255-(alpha))+(ch)*(alpha))/255) #define EPSILON 1.0E-10 #define GRADIENTBAR_MASK (GRADIENTBAR_HORIZONTAL|GRADIENTBAR_VERTICAL|GRADIENTBAR_NO_CONTROLS|GRADIENTBAR_CONTROLS_TOP|GRADIENTBAR_CONTROLS_BOTTOM|GRADIENTBAR_CONTROLS_LEFT|GRADIENTBAR_CONTROLS_RIGHT) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXGradientBar) FXGradientBarMap[]={ FXMAPFUNC(SEL_PAINT,0,FXGradientBar::onPaint), FXMAPFUNC(SEL_MOTION,0,FXGradientBar::onMotion), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXGradientBar::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXGradientBar::onLeftBtnRelease), FXMAPFUNC(SEL_DND_ENTER,0,FXGradientBar::onDNDEnter), FXMAPFUNC(SEL_DND_LEAVE,0,FXGradientBar::onDNDLeave), FXMAPFUNC(SEL_DND_DROP,0,FXGradientBar::onDNDDrop), FXMAPFUNC(SEL_DND_MOTION,0,FXGradientBar::onDNDMotion), FXMAPFUNC(SEL_QUERY_TIP,0,FXGradientBar::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXGradientBar::onQueryHelp), FXMAPFUNC(SEL_UPDATE,FXGradientBar::ID_RECENTER,FXGradientBar::onUpdRecenter), FXMAPFUNC(SEL_COMMAND,FXGradientBar::ID_RECENTER,FXGradientBar::onCmdRecenter), FXMAPFUNC(SEL_UPDATE,FXGradientBar::ID_SPLIT,FXGradientBar::onUpdSplit), FXMAPFUNC(SEL_COMMAND,FXGradientBar::ID_SPLIT,FXGradientBar::onCmdSplit), FXMAPFUNC(SEL_UPDATE,FXGradientBar::ID_MERGE,FXGradientBar::onUpdMerge), FXMAPFUNC(SEL_COMMAND,FXGradientBar::ID_MERGE,FXGradientBar::onCmdMerge), FXMAPFUNC(SEL_UPDATE,FXGradientBar::ID_UNIFORM,FXGradientBar::onUpdUniform), FXMAPFUNC(SEL_COMMAND,FXGradientBar::ID_UNIFORM,FXGradientBar::onCmdUniform), FXMAPFUNCS(SEL_COMMAND,FXGradientBar::ID_BLEND_LINEAR,FXGradientBar::ID_BLEND_DECREASING,FXGradientBar::onCmdBlending), FXMAPFUNCS(SEL_UPDATE,FXGradientBar::ID_BLEND_LINEAR,FXGradientBar::ID_BLEND_DECREASING,FXGradientBar::onUpdBlending), FXMAPFUNCS(SEL_UPDATE,FXGradientBar::ID_LOWER_COLOR,FXGradientBar::ID_UPPER_COLOR,FXGradientBar::onUpdSegColor), FXMAPFUNCS(SEL_CHANGED,FXGradientBar::ID_LOWER_COLOR,FXGradientBar::ID_UPPER_COLOR,FXGradientBar::onCmdSegColor), FXMAPFUNCS(SEL_COMMAND,FXGradientBar::ID_LOWER_COLOR,FXGradientBar::ID_UPPER_COLOR,FXGradientBar::onCmdSegColor), FXMAPFUNC(SEL_COMMAND,FXGradientBar::ID_SETHELPSTRING,FXGradientBar::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXGradientBar::ID_GETHELPSTRING,FXGradientBar::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXGradientBar::ID_SETTIPSTRING,FXGradientBar::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXGradientBar::ID_GETTIPSTRING,FXGradientBar::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXGradientBar,FXFrame,FXGradientBarMap,ARRAYNUMBER(FXGradientBarMap)) // For serialization FXGradientBar::FXGradientBar(){ flags|=FLAG_ENABLED|FLAG_DROPTARGET; sellower=-1; selupper=-1; dropped=-1; current=-1; anchor=-1; grip=GRIP_NONE; where=GRIP_NONE; offset=0; } // Construct gradient editor FXGradientBar::FXGradientBar(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_ENABLED|FLAG_DROPTARGET; target=tgt; message=sel; backColor=getApp()->getHiliteColor(); selectColor=FXRGB((92*FXREDVAL(backColor))/100,(92*FXGREENVAL(backColor))/100,(92*FXBLUEVAL(backColor))/100); bar=new FXImage(getApp(),NULL,IMAGE_DITHER|IMAGE_KEEP|IMAGE_OWNED|IMAGE_SHMI|IMAGE_SHMP,2,2); nsegs=3; FXMALLOC(&seg,FXGradient,nsegs); seg[0].lower=0.0; seg[0].middle=0.2; seg[0].upper=0.4; seg[0].lowerColor=FXRGBA(255,0,0,255); seg[0].upperColor=FXRGBA(0,255,0,255); seg[0].blend=GRADIENT_BLEND_LINEAR; seg[1].lower=0.4; seg[1].middle=0.5; seg[1].upper=0.6; seg[1].lowerColor=FXRGBA(0,0,0,0); seg[1].upperColor=FXRGBA(255,255,0,255); seg[1].blend=GRADIENT_BLEND_LINEAR; seg[2].lower=0.6; seg[2].middle=0.8; seg[2].upper=1.0; seg[2].lowerColor=FXRGBA(0,0,0,0); seg[2].upperColor=FXRGBA(255,0,0,255); seg[2].blend=GRADIENT_BLEND_LINEAR; sellower=-1; selupper=-1; dropped=-1; current=-1; anchor=-1; grip=GRIP_NONE; where=GRIP_NONE; offset=0; } // Create window void FXGradientBar::create(){ FXFrame::create(); if(!colorType){colorType=getApp()->registerDragType(colorTypeName);} updatebar(); bar->create(); } // Get default width FXint FXGradientBar::getDefaultWidth(){ register FXint w=BAR_WIDTH; if(options&GRADIENTBAR_VERTICAL){ w=BAR_HEIGHT; if(options&GRADIENTBAR_CONTROLS_LEFT) w+=CONTROL_SIZE+1; if(options&GRADIENTBAR_CONTROLS_RIGHT) w+=CONTROL_SIZE+1; } return w+4+padleft+padright+(border<<1); } // Get default height FXint FXGradientBar::getDefaultHeight(){ register FXint h=BAR_WIDTH; if(!(options&GRADIENTBAR_VERTICAL)){ h=BAR_HEIGHT; if(options&GRADIENTBAR_CONTROLS_TOP) h+=CONTROL_SIZE+1; if(options&GRADIENTBAR_CONTROLS_BOTTOM) h+=CONTROL_SIZE+1; } return h+4+padtop+padbottom+(border<<1); } // Resize the bar void FXGradientBar::layout(){ register FXint ww,hh; ww=width-padleft-padright-(border<<1)-4; hh=height-padtop-padbottom-(border<<1)-4; if(options&GRADIENTBAR_VERTICAL){ if(options&GRADIENTBAR_CONTROLS_LEFT) ww-=CONTROL_SIZE+1; if(options&GRADIENTBAR_CONTROLS_RIGHT) ww-=CONTROL_SIZE+1; } else{ if(options&GRADIENTBAR_CONTROLS_TOP) hh-=CONTROL_SIZE+1; if(options&GRADIENTBAR_CONTROLS_BOTTOM) hh-=CONTROL_SIZE+1; } if(ww<2) ww=2; if(hh<2) hh=2; if((bar->getWidth()!=ww) || (bar->getHeight()!=hh) || (flags&FLAG_DIRTY)){ if((bar->getWidth()!=ww) || (bar->getHeight()!=hh)){ bar->resize(ww,hh); } updatebar(); bar->render(); update(); } flags&=~FLAG_DIRTY; } typedef FXdouble (*BLENDFUNC)(FXdouble,FXdouble); // Linear blend FXdouble FXGradientBar::blendlinear(FXdouble middle,FXdouble pos){ register FXdouble factor; if(pos<=middle){ factor=(middle0.0); // Loop over segments for(s=0; sgetWidth(); register FXint barh=bar->getHeight(); register FXint x,y,r,g,b,a; register FXColor clr; FXColor *ramp=NULL; // Vertical if(options&GRADIENTBAR_VERTICAL){ // Allocate ramp FXMALLOC(&ramp,FXColor,barh); // Fill with gradient gradient(ramp,barh); // Fill image for(y=0; ysetPixel(x,barh-y-1,clr); } clr=FXRGB(BLEND(r,0,a), BLEND(g,0,a), BLEND(b,0,a)); for(x=barw/2; xsetPixel(x,barh-y-1,clr); } } } // Horizontal else{ // Allocate ramp FXMALLOC(&ramp,FXColor,barw); // Fill with gradient gradient(ramp,barw); // Fill image for(x=0; xsetPixel(x,y,clr); } clr=FXRGB(BLEND(r,0,a), BLEND(g,0,a), BLEND(b,0,a)); for(y=barh/2; ysetPixel(x,y,clr); } } } // Free ramp FXFREE(&ramp); } // Draw up arrow void FXGradientBar::drawUpArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr){ FXPoint arrow[3]; arrow[0].x=x; arrow[0].y=y; arrow[1].x=x-CONTROL_SIZE/2; arrow[1].y=y+CONTROL_SIZE; arrow[2].x=x+CONTROL_SIZE/2; arrow[2].y=y+CONTROL_SIZE; dc.setForeground(clr); dc.fillPolygon(arrow,3); dc.setForeground(FXRGB(0,0,0)); dc.drawLine(x,y,x+CONTROL_SIZE/2,y+CONTROL_SIZE); dc.drawLine(x-CONTROL_SIZE/2,y+CONTROL_SIZE,x+CONTROL_SIZE/2,y+CONTROL_SIZE); dc.drawLine(x,y,x-CONTROL_SIZE/2,y+CONTROL_SIZE); } // Draw down arrow void FXGradientBar::drawDnArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr){ FXPoint arrow[3]; arrow[0].x=x-CONTROL_SIZE/2; arrow[0].y=y; arrow[1].x=x+CONTROL_SIZE/2; arrow[1].y=y; arrow[2].x=x; arrow[2].y=y+CONTROL_SIZE; dc.setForeground(clr); dc.fillPolygon(arrow,3); dc.setForeground(FXRGB(0,0,0)); dc.drawLine(x-CONTROL_SIZE/2,y,x+CONTROL_SIZE/2,y); dc.drawLine(x,y+CONTROL_SIZE,x-CONTROL_SIZE/2,y); dc.drawLine(x,y+CONTROL_SIZE,x+CONTROL_SIZE/2,y); } // Draw right arrow void FXGradientBar::drawRtArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr){ FXPoint arrow[3]; arrow[0].x=x; arrow[0].y=y-CONTROL_SIZE/2; arrow[1].x=x; arrow[1].y=y+CONTROL_SIZE/2; arrow[2].x=x+CONTROL_SIZE; arrow[2].y=y; dc.setForeground(clr); dc.fillPolygon(arrow,3); dc.setForeground(FXRGB(0,0,0)); dc.drawLine(x+CONTROL_SIZE,y,x,y-CONTROL_SIZE/2); dc.drawLine(x+CONTROL_SIZE,y,x,y+CONTROL_SIZE/2); dc.drawLine(x,y-CONTROL_SIZE/2,x,y+CONTROL_SIZE/2); } // Draw left arrow void FXGradientBar::drawLtArrow(FXDCWindow& dc,FXint x,FXint y,FXColor clr){ FXPoint arrow[3]; arrow[0].x=x+CONTROL_SIZE; arrow[0].y=y-CONTROL_SIZE/2; arrow[1].x=x+CONTROL_SIZE; arrow[1].y=y+CONTROL_SIZE/2; arrow[2].x=x; arrow[2].y=y; dc.setForeground(clr); dc.fillPolygon(arrow,3); dc.setForeground(FXRGB(0,0,0)); dc.drawLine(x,y,x+CONTROL_SIZE,y-CONTROL_SIZE/2); dc.drawLine(x,y,x+CONTROL_SIZE,y+CONTROL_SIZE/2); dc.drawLine(x+CONTROL_SIZE,y-CONTROL_SIZE/2,x+CONTROL_SIZE,y+CONTROL_SIZE/2); } // Draw top arrows void FXGradientBar::drawTopArrows(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ register FXdouble len=seg[nsegs-1].upper-seg[0].lower; register FXint s,l,m,r; FXASSERT(len>0.0); for(s=0; s0.0); for(s=0; s0.0); for(s=0; s0.0); for(s=0; sgetWidth(); // Right controls if(options&GRADIENTBAR_CONTROLS_RIGHT){ drawRightArrows(dc,barx,bary,CONTROL_SIZE+1,barh); } } // Horizontal gradient else{ // Top controls if(options&GRADIENTBAR_CONTROLS_TOP){ drawTopArrows(dc,barx,bary,barw,CONTROL_SIZE+1); bary+=CONTROL_SIZE+1; } // Draw the bar itself dc.drawImage(bar,barx,bary); bary+=bar->getHeight(); // Bottom controls if(options&GRADIENTBAR_CONTROLS_BOTTOM){ drawBottomArrows(dc,barx,bary,barw,CONTROL_SIZE+1); } } return 1; } // Replace the current gradient segments void FXGradientBar::setGradients(const FXGradient *segments,FXint nsegments){ if(!segments || nsegments<1){ fxerror("FXGradientBar::setGradients: bad argument."); } if(nsegments!=nsegs){ FXRESIZE(&seg,FXGradient,nsegments); nsegs=nsegments; if(selupper>=nsegs) selupper=nsegs-1; if(sellower>=nsegs) sellower=nsegs-1; if(current>=nsegs) current=nsegs-1; if(anchor>=nsegs) anchor=nsegs-1; } memcpy(seg,segments,sizeof(FXGradient)*nsegments); recalc(); } // Return the gradient segments void FXGradientBar::getGradients(FXGradient*& segments,FXint& nsegments) const { nsegments=0; if(FXMALLOC(&segments,FXGradient,nsegs)){ memcpy(segments,seg,sizeof(FXGradient)*nsegs); nsegments=nsegs; } } // Select segment FXbool FXGradientBar::selectSegments(FXint fm,FXint to,FXbool notify){ if(fm>to || fm<0 || to>=nsegs){ fxerror("FXGradientBar::selectSegments: argument out of range."); } if(sellower!=fm || selupper!=to){ sellower=fm; selupper=to; update(); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),NULL);} return TRUE; } return FALSE; } // Deselect all segments FXbool FXGradientBar::deselectSegments(FXbool notify){ if(0<=sellower && 0<=selupper){ sellower=selupper=-1; update(); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),NULL);} return TRUE; } return FALSE; } // Is segment selected FXbool FXGradientBar::isSegmentSelected(FXint s) const { if(s<0 || s>=nsegs){ fxerror("FXGradientBar::isSegmentSelected: argument out of range."); } return sellower<=s && s<=selupper; } // Set current item void FXGradientBar::setCurrentSegment(FXint index,FXbool notify){ if(index<-1 || nsegs<=index){ fxerror("%s::setCurrentSegment: index out of range.\n",getClassName()); } if(index!=current){ current=index; if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)current);} } } // Change anchor segment void FXGradientBar::setAnchorSegment(FXint index){ if(index<-1 || nsegs<=index){ fxerror("%s::setAnchorSegment: index out of range.\n",getClassName()); } anchor=index; } // Move lower point of segment void FXGradientBar::moveSegmentLower(FXint sg,FXdouble val,FXbool notify){ if(0tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)sg);} } } } // Move middle point of segment void FXGradientBar::moveSegmentMiddle(FXint sg,FXdouble val,FXbool notify){ if(0<=sg && sgtryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)sg);} } } } // Move upper point of segment void FXGradientBar::moveSegmentUpper(FXint sg,FXdouble val,FXbool notify){ if(0<=sg && sgtryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)sg);} } } } // Move segments void FXGradientBar::moveSegments(FXint sglo,FXint sghi,FXdouble val,FXbool notify){ register FXdouble delta, below,above,room; register FXint i; if(0<=sglo && sghiseg[nsegs-1].upper) val=seg[nsegs-1].upper-room; } else{ if(val+above>seg[sghi+1].middle) val=seg[sghi+1].middle-above; } delta=val-seg[sglo].middle; if(delta!=0.0){ for(i=sglo; i<=sghi; i++){ if(0tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)-1);} } } } // Split segment at the midpoint void FXGradientBar::splitSegments(FXint sglo,FXint sghi,FXbool notify){ register FXint n=sghi-sglo+1; register FXint i,j; if(0<=sglo && sghitryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)-1);} } } // Merge segments void FXGradientBar::mergeSegments(FXint sglo,FXint sghi,FXbool notify){ register FXint n=sghi-sglo; if(0<=sglo && sghi=nsegs) selupper=nsegs-1; if(sellower>=nsegs) sellower=nsegs-1; if(current>=nsegs) current=nsegs-1; if(anchor>=nsegs) anchor=nsegs-1; recalc(); if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)-1);} } } // Make segments uniformly distributed void FXGradientBar::uniformSegments(FXint sglo,FXint sghi,FXbool notify){ register FXdouble m,d,a; register FXint s; if(0<=sglo && sghitryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)-1);} } } // Change blend curve of segment void FXGradientBar::blendSegments(FXint sglo,FXint sghi,FXuint blend,FXbool notify){ register FXint s; if(0<=sglo && sghitryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)-1);} } } // Determine which segment got hit FXint FXGradientBar::getSegment(FXint x,FXint y) const { register FXdouble shi=seg[nsegs-1].upper; register FXdouble slo=seg[0].lower; register FXdouble len=shi-slo; register FXdouble del; register FXint lo,hi,v,s; FXASSERT(len>0.0); if(options&GRADIENTBAR_VERTICAL){ if(yheight-border-padbottom-2) return 0; v=height-border-padbottom-y-3; del=bar->getHeight()-1; } else{ if(xwidth-border-padright-2) return nsegs-1; v=x-border-padleft-2; del=bar->getWidth()-1; } for(s=0; s0.0); if(options&GRADIENTBAR_VERTICAL){ v=height-border-padbottom-y-3; del=bar->getHeight()-1; } else{ v=x-border-padleft-2; del=bar->getWidth()-1; } lo=(FXint)(0.5+(del*(seg[sg].lower-slo))/len); hi=(FXint)(0.5+(del*(seg[sg].upper-slo))/len); if((lo-CONTROL_SIZE/2-PICK_EXTRA)<=v && v<=(hi+CONTROL_SIZE/2+PICK_EXTRA)){ if(v<=(lo+CONTROL_SIZE/2+PICK_EXTRA)) return GRIP_LOWER; if((hi-CONTROL_SIZE/2-PICK_EXTRA)<=v) return GRIP_UPPER; md=(FXint)(0.5+(del*(seg[sg].middle-slo))/len); if(v<(md-CONTROL_SIZE/2-PICK_EXTRA)) return GRIP_SEG_LOWER; if(v>(md+CONTROL_SIZE/2+PICK_EXTRA)) return GRIP_SEG_UPPER; return GRIP_MIDDLE; } } return GRIP_NONE; } // Get value given position x,y FXdouble FXGradientBar::getValue(FXint x,FXint y) const { register FXdouble slo=seg[0].lower; register FXdouble shi=seg[nsegs-1].upper; register FXdouble val; if(options&GRADIENTBAR_VERTICAL) val=slo+(height-padbottom-border-3-y)*(shi-slo)/(bar->getHeight()-1); else val=slo+(x-padleft-border-2)*(shi-slo)/(bar->getWidth()-1); return FXCLAMP(slo,val,shi); } // Get position of lower edge of segment FXint FXGradientBar::getSegmentLowerPos(FXint sg) const { register FXdouble shi=seg[nsegs-1].upper; register FXdouble slo=seg[0].lower; register FXdouble len=shi-slo; register FXint pos; FXASSERT(0<=sg && sggetHeight()-1)*(seg[sg].lower-slo))/len); } else{ pos=padleft+border+2+(FXint)(0.5+((bar->getWidth()-1)*(seg[sg].lower-slo))/len); } return pos; } // Get position of upper edge of segment FXint FXGradientBar::getSegmentUpperPos(FXint sg) const { register FXdouble shi=seg[nsegs-1].upper; register FXdouble slo=seg[0].lower; register FXdouble len=shi-slo; register FXint pos; FXASSERT(0<=sg && sggetHeight()-1)*(seg[sg].upper-slo))/len); } else{ pos=padleft+border+2+(FXint)(0.5+((bar->getWidth()-1)*(seg[sg].upper-slo))/len); } return pos; } // Get position of middle of segment FXint FXGradientBar::getSegmentMiddlePos(FXint sg) const { register FXdouble shi=seg[nsegs-1].upper; register FXdouble slo=seg[0].lower; register FXdouble len=shi-slo; register FXint pos; FXASSERT(0<=sg && sggetHeight()-1)*(seg[sg].middle-slo))/len); } else{ pos=padleft+border+2+(FXint)(0.5+((bar->getWidth()-1)*(seg[sg].middle-slo))/len); } return pos; } // Mouse moved long FXGradientBar::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXdouble value; FXint g,s; if(options&GRADIENTBAR_VERTICAL){ value=getValue(event->win_x,event->win_y+offset); } else{ value=getValue(event->win_x+offset,event->win_y); } switch(grip){ case GRIP_LOWER: if(0win_x,event->win_y); if(0<=s){ g=getGrip(s,event->win_x,event->win_y); if((g==GRIP_MIDDLE) || (g==GRIP_LOWER && 0getDefaultCursor(DEF_DRAGH_CURSOR)); } else{ setDefaultCursor(getApp()->getDefaultCursor(DEF_DRAGV_CURSOR)); } return 1; } } setDefaultCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); return 1; } return 0; } // Pressed button long FXGradientBar::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; setCurrentSegment(getSegment(event->win_x,event->win_y),TRUE); if(0<=current){ grip=getGrip(current,event->win_x,event->win_y); if(grip==GRIP_SEG_LOWER || grip==GRIP_SEG_UPPER){ if((0<=anchor) && (event->state&SHIFTMASK)){ selectSegments(FXMIN(current,anchor),FXMAX(current,anchor),TRUE); } else if(!isSegmentSelected(current)){ selectSegments(current,current,TRUE); setAnchorSegment(current); } offset=getSegmentMiddlePos(sellower); } else{ deselectSegments(TRUE); if(grip==GRIP_LOWER){ offset=getSegmentLowerPos(current); } else if(grip==GRIP_MIDDLE){ offset=getSegmentMiddlePos(current); } else if(grip==GRIP_UPPER){ offset=getSegmentUpperPos(current); } } if(grip!=GRIP_NONE){ if(options&GRADIENTBAR_VERTICAL){ setDragCursor(getApp()->getDefaultCursor(DEF_DRAGH_CURSOR)); offset=offset-event->win_y; } else{ setDragCursor(getApp()->getDefaultCursor(DEF_DRAGV_CURSOR)); offset=offset-event->win_x; } } flags&=~FLAG_UPDATE; } else{ deselectSegments(TRUE); } return 1; } return 0; } // Released button long FXGradientBar::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint g=grip; if(isEnabled()){ ungrab(); flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; grip=GRIP_NONE; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if((0<=current) && (g==GRIP_SEG_LOWER || g==GRIP_SEG_UPPER) && !(event->state&SHIFTMASK) && !event->moved){ selectSegments(current,current,TRUE); } setAnchorSegment(current); setDragCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); return 1; } return 0; } // Handle drag-and-drop enter long FXGradientBar::onDNDEnter(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onDNDEnter(sender,sel,ptr); dropped=-1; return 1; } // Handle drag-and-drop leave long FXGradientBar::onDNDLeave(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onDNDLeave(sender,sel,ptr); dropped=-1; return 1; } // Handle drag-and-drop motion long FXGradientBar::onDNDMotion(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; // Handle base class first if(FXFrame::onDNDMotion(sender,sel,ptr)) return 1; // Is it a color being dropped? if(offeredDNDType(FROM_DRAGNDROP,colorType)){ dropped=getSegment(event->win_x,event->win_y); if(0<=dropped){ where=getGrip(dropped,event->win_x,event->win_y); if(where!=GRIP_NONE){ acceptDrop(DRAG_COPY); } } return 1; } return 0; } // Handle drag-and-drop drop long FXGradientBar::onDNDDrop(FXObject* sender,FXSelector sel,void* ptr){ FXushort *clr; FXuint len; FXColor color; // Try handling it in base class first if(FXFrame::onDNDDrop(sender,sel,ptr)) return 1; // Try handle here if(0<=dropped){ if(getDNDData(FROM_DRAGNDROP,colorType,(FXuchar*&)clr,len)){ color=FXRGBA((clr[0]+128)/257,(clr[1]+128)/257,(clr[2]+128)/257,(clr[3]+128)/257); FXFREE(&clr); if(where!=GRIP_NONE){ if(where<=GRIP_SEG_LOWER){ setSegmentLowerColor(dropped,color,TRUE); if(where==GRIP_LOWER && 0=GRIP_SEG_UPPER){ setSegmentUpperColor(dropped,color,TRUE); if(where==GRIP_UPPER && droppedhandle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&seg[current].lowerColor); } else if(FXSELID(sel)==ID_UPPER_COLOR){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&seg[current].upperColor); } } return 1; } // Change upper or lower color of current segment long FXGradientBar::onCmdSegColor(FXObject* sender,FXSelector sel,void*){ FXColor color; if(0<=current){ if(FXSELID(sel)==ID_LOWER_COLOR){ sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&color); setSegmentLowerColor(current,color,TRUE); } else if(FXSELID(sel)==ID_UPPER_COLOR){ sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&color); setSegmentUpperColor(current,color,TRUE); } } return 1; } // Update recenter midpoint long FXGradientBar::onUpdRecenter(FXObject* sender,FXSelector,void*){ sender->handle(this,(0<=current)?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Recenter midpoint long FXGradientBar::onCmdRecenter(FXObject*,FXSelector,void*){ if(0<=current){ moveSegmentMiddle(current,0.5*(seg[current].lower+seg[current].upper),TRUE); } return 1; } // Update split segment long FXGradientBar::onUpdSplit(FXObject* sender,FXSelector,void*){ sender->handle(this,(0<=sellower && 0<=selupper)?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Split segment long FXGradientBar::onCmdSplit(FXObject*,FXSelector,void*){ if(0<=sellower && 0<=selupper){ splitSegments(sellower,selupper,TRUE); selectSegments(sellower,selupper+selupper-sellower+1,TRUE); } return 1; } // Update merge segments long FXGradientBar::onUpdMerge(FXObject* sender,FXSelector,void*){ sender->handle(this,(0<=sellower && 0<=selupper && sellowerhandle(this,(0<=sellower && 0<=selupper)?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Make selected segments uniform long FXGradientBar::onCmdUniform(FXObject*,FXSelector,void*){ if(0<=sellower && 0<=selupper) uniformSegments(sellower,selupper,TRUE); return 1; } // Update blending long FXGradientBar::onUpdBlending(FXObject* sender,FXSelector sel,void*){ FXuint blend=FXSELID(sel)-ID_BLEND_LINEAR; if(0<=sellower && 0<=selupper){ sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); for(FXint s=sellower; s<=selupper; s++){ if(seg[s].blend!=blend){ sender->handle(this,FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } } sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); } else{ sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); } return 1; } // Change blending long FXGradientBar::onCmdBlending(FXObject*,FXSelector sel,void*){ FXuint blend=FXSELID(sel)-ID_BLEND_LINEAR; if(0<=sellower && 0<=selupper){ blendSegments(sellower,selupper,blend,TRUE); } return 1; } // Set help using a message long FXGradientBar::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXGradientBar::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXGradientBar::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXGradientBar::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXGradientBar::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXGradientBar::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Get blend cuve of segment FXuint FXGradientBar::getSegmentBlend(FXint s) const { if(s<0 || s>=nsegs){ fxerror("FXGradientBar::getSegmentBlend: argument out of range."); } return seg[s].blend; } // Set colors of a segment void FXGradientBar::setSegmentLowerColor(FXint s,FXColor clr,FXbool notify){ if(s<0 || s>=nsegs){ fxerror("FXGradientBar::setSegmentLowerColor: argument out of range."); } if(seg[s].lowerColor!=clr){ seg[s].lowerColor=clr; recalc(); if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)s);} } } // Set colors of a segment void FXGradientBar::setSegmentUpperColor(FXint s,FXColor clr,FXbool notify){ if(s<0 || s>=nsegs){ fxerror("FXGradientBar::setSegmentUpperColor: argument out of range."); } if(seg[s].upperColor!=clr){ seg[s].upperColor=clr; recalc(); if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)s);} } } // Get colors of a segment FXColor FXGradientBar::getSegmentLowerColor(FXint s) const { if(s<0 || s>=nsegs){ fxerror("FXGradientBar::getSegmentLowerColor: argument out of range."); } return seg[s].lowerColor; } // Get colors of a segment FXColor FXGradientBar::getSegmentUpperColor(FXint s) const { if(s<0 || s>=nsegs){ fxerror("FXGradientBar::getSegmentUpperColor: argument out of range."); } return seg[s].upperColor; } // Get lower value of segment sg FXdouble FXGradientBar::getSegmentLower(FXint sg) const { if(sg<0 || sg>=nsegs){ fxerror("FXGradientBar::getSegmentLower: argument out of range."); } return seg[sg].lower; } // Get middle value of segment sg FXdouble FXGradientBar::getSegmentMiddle(FXint sg) const { if(sg<0 || sg>=nsegs){ fxerror("FXGradientBar::getSegmentMiddle: argument out of range."); } return seg[sg].middle; } // Get upper value of segment sg FXdouble FXGradientBar::getSegmentUpper(FXint sg) const { if(sg<0 || sg>=nsegs){ fxerror("FXGradientBar::getSegmentUpper: argument out of range."); } return seg[sg].upper; } // Set color bar options void FXGradientBar::setBarStyle(FXuint style){ FXuint opts=(options&~GRADIENTBAR_MASK) | (style&GRADIENTBAR_MASK); if(options!=opts){ options=opts; recalc(); update(); } } // Get color bar options FXuint FXGradientBar::getBarStyle() const { return (options&GRADIENTBAR_MASK); } // Set base color void FXGradientBar::setSelectColor(FXColor clr){ if(clr!=selectColor){ selectColor=clr; update(); } } // Save data void FXGradientBar::save(FXStream& store) const { FXFrame::save(store); store << bar; store << tip; store << help; store << selectColor; } // Load data void FXGradientBar::load(FXStream& store){ FXFrame::load(store); store >> bar; store >> tip; store >> help; store >> selectColor; } // Zap it FXGradientBar::~FXGradientBar(){ delete bar; FXFREE(&seg); bar=(FXImage*)-1L; seg=(FXGradient*)-1L; } } fox1.6-1.6.57/src/FXGroupBox.cpp000066400000000000000000000177211326741342000161430ustar00rootroot00000000000000/******************************************************************************** * * * G r o u p B o x W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXGroupBox.cpp,v 1.38 2006/01/22 17:58:30 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDC.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXLabel.h" #include "FXGroupBox.h" /* Notes: - Radio behaviour of groupbox has been dropped; groupbox is now purely a decorative layout manager. */ #define FRAME_MASK (FRAME_SUNKEN|FRAME_RAISED|FRAME_THICK) #define GROUPBOX_TITLE_MASK (GROUPBOX_TITLE_LEFT|GROUPBOX_TITLE_CENTER|GROUPBOX_TITLE_RIGHT) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXGroupBox) FXGroupBoxMap[]={ FXMAPFUNC(SEL_PAINT,0,FXGroupBox::onPaint), FXMAPFUNC(SEL_COMMAND,FXGroupBox::ID_SETVALUE,FXGroupBox::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXGroupBox::ID_SETSTRINGVALUE,FXGroupBox::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXGroupBox::ID_GETSTRINGVALUE,FXGroupBox::onCmdGetStringValue), }; // Object implementation FXIMPLEMENT(FXGroupBox,FXPacker,FXGroupBoxMap,ARRAYNUMBER(FXGroupBoxMap)) // Deserialization FXGroupBox::FXGroupBox(){ flags|=FLAG_ENABLED; font=(FXFont*)-1L; textColor=0; } // Make a groupbox FXGroupBox::FXGroupBox(FXComposite* p,const FXString& text,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXPacker(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs),label(text){ flags|=FLAG_ENABLED; font=getApp()->getNormalFont(); textColor=getApp()->getForeColor(); } // Create window void FXGroupBox::create(){ FXPacker::create(); font->create(); } // Detach window void FXGroupBox::detach(){ FXPacker::detach(); font->detach(); } // Enable the window void FXGroupBox::enable(){ if(!(flags&FLAG_ENABLED)){ FXPacker::enable(); update(); } } // Disable the window void FXGroupBox::disable(){ if(flags&FLAG_ENABLED){ FXPacker::disable(); update(); } } // Change the font void FXGroupBox::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Get default width FXint FXGroupBox::getDefaultWidth(){ FXint cw=FXPacker::getDefaultWidth(); if(!label.empty()){ FXint tw=font->getTextWidth(label)+16; return FXMAX(cw,tw); } return cw; } // Get default height FXint FXGroupBox::getDefaultHeight(){ FXint ch=FXPacker::getDefaultHeight(); if(!label.empty()){ return ch+font->getFontHeight()+4-border; // Have text instead of border } return ch; } // Recompute layout void FXGroupBox::layout(){ FXint tmp=padtop; if(!label.empty()){ padtop=padtop+font->getFontHeight()+4-border; // Have text instead of border } FXPacker::layout(); flags&=~FLAG_DIRTY; padtop=tmp; } // Update value from a message long FXGroupBox::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setText((const FXchar*)ptr); return 1; } // Update value from a message long FXGroupBox::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setText(*((FXString*)ptr)); return 1; } // Obtain value from text field long FXGroupBox::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getText(); return 1; } // Handle repaint long FXGroupBox::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXDCWindow dc(this,event); FXint tw,th,yy,xx; xx=0; yy=0; // Paint background dc.setForeground(backColor); dc.fillRectangle(event->rect.x,event->rect.y,event->rect.w,event->rect.h); // Draw label if there is one if(!label.empty()){ yy=2+font->getFontAscent()/2; } // We should really just draw what's exposed! switch(options&FRAME_MASK) { case FRAME_LINE: drawBorderRectangle(dc,0,yy,width,height-yy); break; case FRAME_SUNKEN: drawSunkenRectangle(dc,0,yy,width,height-yy); break; case FRAME_RAISED: drawRaisedRectangle(dc,0,yy,width,height-yy); break; case FRAME_GROOVE: drawGrooveRectangle(dc,0,yy,width,height-yy); break; case FRAME_RIDGE: drawRidgeRectangle(dc,0,yy,width,height-yy); break; case FRAME_SUNKEN|FRAME_THICK: drawDoubleSunkenRectangle(dc,0,yy,width,height-yy); break; case FRAME_RAISED|FRAME_THICK: drawDoubleRaisedRectangle(dc,0,yy,width,height-yy); break; } // Draw label if(!label.empty()){ tw=font->getTextWidth(label); th=font->getFontHeight()+4; if(options&GROUPBOX_TITLE_RIGHT) xx=width-tw-12; else if(options&GROUPBOX_TITLE_CENTER) xx=(width-tw)/2-4; else xx=4; if(xx<4) xx=4; if(tw+16>width) tw=width-16; if(0getFontAscent(),label); } else{ dc.setForeground(hiliteColor); dc.drawText(xx+5,3+font->getFontAscent(),label); dc.setForeground(shadowColor); dc.drawText(xx+4,2+font->getFontAscent(),label); } } } return 1; } // Get group box style FXuint FXGroupBox::getGroupBoxStyle() const { return (options&GROUPBOX_TITLE_MASK); } // Set group box style void FXGroupBox::setGroupBoxStyle(FXuint style){ FXuint opts=(options&~GROUPBOX_TITLE_MASK) | (style&GROUPBOX_TITLE_MASK); if(options!=opts){ options=opts; recalc(); update(); } } // Change text void FXGroupBox::setText(const FXString& text){ if(label!=text){ label=text; recalc(); update(); } } // Set text color void FXGroupBox::setTextColor(FXColor clr){ if(textColor!=clr){ textColor=clr; update(); } } // Save object to stream void FXGroupBox::save(FXStream& store) const { FXPacker::save(store); store << label; store << font; store << textColor; } // Load object from stream void FXGroupBox::load(FXStream& store){ FXPacker::load(store); store >> label; store >> font; store >> textColor; } } fox1.6-1.6.57/src/FXHash.cpp000066400000000000000000000135621326741342000152600ustar00rootroot00000000000000/******************************************************************************** * * * H a s h T a b l e C l a s s * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXHash.cpp,v 1.25 2006/01/22 17:58:31 fox Exp $ * ********************************************************************************/ #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" /* Notes: - The members used and free keep track of the number of slots in the table which are used and which are free. - When an item is inserted, used is incremented if the item isn't in the table yet, and free is decremented if a free slot is used; if an empty slot is used, free stays the same. If the table exceeds the load factor, its size is doubled. - When an item is removed, used is decremented but free stays the same because the slot remains marked as empty instead of free; when the number of used items drops below some minimum, the table's size is halved. - If the table is resized, the empty slots all become free slots since the empty holes are not copied into the table; only used items will be rehashed into the new table. */ #define HASH1(x,m) (((FXuint)((FXuval)(x)^(((FXuval)(x))>>13)))&((m)-1)) #define HASH2(x,m) (((FXuint)((FXuval)(x)^(((FXuval)(x))>>17)|1))&((m)-1)) using namespace FX; /*******************************************************************************/ namespace FX { // Make empty table FXHash::FXHash(){ FXMALLOC(&table,FXEntry,2); table[0].key=NULL; table[0].value=NULL; table[1].key=NULL; table[1].value=NULL; total=2; used=0; free=2; } // Resize hash table, and rehash old stuff into it void FXHash::size(FXuint m){ register void *key,*value; register FXuint q,x,i; FXEntry *newtable; FXCALLOC(&newtable,FXEntry,m); for(i=0; i>2)) size(total>>1); return val; } x:return NULL; } // Return true if association in table void* FXHash::find(void* key) const { register FXuint q,x; if(key){ q=HASH1(key,total); x=HASH2(key,total); while(table[q].key!=key){ if(table[q].key==NULL) goto x; q=(q+x)&(total-1); } return table[q].value; } x:return NULL; } // Clear hash table void FXHash::clear(){ FXRESIZE(&table,FXEntry,2); table[0].key=NULL; table[0].value=NULL; table[1].key=NULL; table[1].value=NULL; total=2; used=0; free=2; } // Destroy table FXHash::~FXHash(){ FXFREE(&table); table=(FXEntry*)-1L; } } fox1.6-1.6.57/src/FXHeader.cpp000066400000000000000000001035761326741342000155720ustar00rootroot00000000000000/******************************************************************************** * * * H e a d e r O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXHeader.cpp,v 1.103.2.4 2006/11/21 19:01:53 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXObjectList.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXHeader.h" /* Notes: - Perhaps, some way to drive via keyboard? - Allow some header items to be stretchable. - Add minimum, maximum size constraints to items. - Should up/down arrows go sideways when vertically oriented? - Perhaps perform drawing of border in item also. - Like for FXScrollArea, pos is always <=0 when scrolled. - Maybe handy feature to initialize size to default item width if initial size = 0. - Maybe allow attach from right instead of only from left; perhaps also attach both (or none). */ #define FUDGE 4 #define ICON_SPACING 4 #define HEADER_MASK (HEADER_BUTTON|HEADER_TRACKING|HEADER_VERTICAL|HEADER_RESIZE) using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXHeaderItem,FXObject,NULL,0) // Draw item void FXHeaderItem::draw(const FXHeader* header,FXDC& dc,FXint x,FXint y,FXint w,FXint h){ register FXint tx,ty,tw,th,ix,iy,iw,ih,s,ml,mr,mt,mb,beg,end,t,xx,yy,bb,aa,ax,ay; register FXFont *font=header->getFont(); // Get border width and padding bb=header->getBorderWidth(); ml=header->getPadLeft()+bb; mr=header->getPadRight()+bb; mt=header->getPadTop()+bb; mb=header->getPadBottom()+bb; // Shrink by margins x+=ml; w-=ml+mr; y+=mt; h-=mt+mb; // Initial clip rectangle dc.setClipRectangle(x,y,w,h); // Text width and height tw=th=iw=ih=beg=s=0; do{ end=beg; while(endgetTextWidth(&label[beg],end-beg))>tw) tw=t; th+=font->getFontHeight(); beg=end+1; } while(endgetWidth(); ih=icon->getHeight(); } // Icon-text spacing if(iw && tw) s=ICON_SPACING; // Draw arrows if(state&(ARROW_UP|ARROW_DOWN)){ aa=(font->getFontHeight()-5)|1; ay=y+(h-aa)/2; ax=x+w-aa-2; if(state&ARROW_UP){ dc.setForeground(header->getHiliteColor()); dc.drawLine(ax+aa/2,ay,ax+aa-1,ay+aa); dc.drawLine(ax,ay+aa,ax+aa,ay+aa); dc.setForeground(header->getShadowColor()); dc.drawLine(ax+aa/2,ay,ax,ay+aa); } else{ dc.setForeground(header->getHiliteColor()); dc.drawLine(ax+aa/2,ay+aa,ax+aa-1,ay); dc.setForeground(header->getShadowColor()); dc.drawLine(ax+aa/2,ay+aa,ax,ay); dc.drawLine(ax,ay,ax+aa,ay); } w-=aa+4; dc.setClipRectangle(x,y,w,h); } // Fix x coordinate if(state&LEFT){ if(state&BEFORE){ ix=x; tx=ix+iw+s; } else if(state&AFTER){ tx=x; ix=tx+tw+s; } else{ ix=x; tx=x; } } else if(state&RIGHT){ if(state&BEFORE){ tx=x+w-tw; ix=tx-iw-s; } else if(state&AFTER){ ix=x+w-iw; tx=ix-tw-s; } else{ ix=x+w-iw; tx=x+w-tw; } } else{ if(state&BEFORE){ ix=x+(w-tw-iw-s)/2; tx=ix+iw+s; } else if(state&AFTER){ tx=x+(w-tw-iw-s)/2; ix=tx+tw+s; } else{ ix=x+(w-iw)/2; tx=x+(w-tw)/2; } } // Fix y coordinate if(state&TOP){ if(state&ABOVE){ iy=y; ty=iy+ih; } else if(state&BELOW){ ty=y; iy=ty+th; } else{ iy=y; ty=y; } } else if(state&BOTTOM){ if(state&ABOVE){ ty=y+h-th; iy=ty-ih; } else if(state&BELOW){ iy=y+h-ih; ty=iy-th; } else{ iy=y+h-ih; ty=y+h-th; } } else{ if(state&ABOVE){ iy=y+(h-th-ih)/2; ty=iy+ih; } else if(state&BELOW){ ty=y+(h-th-ih)/2; iy=ty+th; } else{ iy=y+(h-ih)/2; ty=y+(h-th)/2; } } // Offset a bit when pressed if(state&PRESSED){ tx++; ty++; ix++; iy++; } // Paint icon if(icon){ dc.drawIcon(icon,ix,iy); } // Text color dc.setForeground(header->getTextColor()); // Draw text yy=ty+font->getFontAscent(); beg=0; do{ end=beg; while(endgetTextWidth(&label[beg],end-beg); else xx=tx+(tw-font->getTextWidth(&label[beg],end-beg))/2; dc.drawText(xx,yy,&label[beg],end-beg); yy+=font->getFontHeight(); beg=end+1; } while(endcreate(); } // No op, we don't own icon void FXHeaderItem::destroy(){ /*if(icon) icon->destroy();*/ } // Detach from icon resource void FXHeaderItem::detach(){ if(icon) icon->detach(); } // Change sort direction void FXHeaderItem::setArrowDir(FXbool dir){ state&=~(ARROW_UP|ARROW_DOWN); if(dir==TRUE) state|=ARROW_UP; else if(dir==FALSE) state|=ARROW_DOWN; } // Change sort direction FXbool FXHeaderItem::getArrowDir() const { return (state&ARROW_UP) ? TRUE : (state&ARROW_DOWN) ? FALSE : MAYBE; } // Change justify mode void FXHeaderItem::setJustify(FXuint justify){ state=(state&~(RIGHT|LEFT|TOP|BOTTOM)) | (justify&(RIGHT|LEFT|TOP|BOTTOM)); } // Change icon positioning void FXHeaderItem::setIconPosition(FXuint mode){ state=(state&~(BEFORE|AFTER|ABOVE|BELOW)) | (mode&(BEFORE|AFTER|ABOVE|BELOW)); } // Set button state void FXHeaderItem::setPressed(FXbool pressed){ if(pressed) state|=PRESSED; else state&=~PRESSED; } // Get width of item FXint FXHeaderItem::getWidth(const FXHeader* header) const { register FXint ml=header->getPadLeft()+header->getBorderWidth(); register FXint mr=header->getPadRight()+header->getBorderWidth(); register FXFont *font=header->getFont(); register FXint beg,end,tw,iw,s,t,w; tw=iw=beg=s=0; if(icon) iw=icon->getWidth(); do{ end=beg; while(endgetTextWidth(&label[beg],end-beg))>tw) tw=t; beg=end+1; } while(endgetPadTop()+header->getBorderWidth(); register FXint mb=header->getPadBottom()+header->getBorderWidth(); register FXFont *font=header->getFont(); register FXint beg,end,th,ih,h; th=ih=beg=0; if(icon) ih=icon->getHeight(); do{ end=beg; while(endgetFontHeight(); beg=end+1; } while(end> label; store >> icon; store >> size; store >> pos; store >> state; } /*******************************************************************************/ // Map FXDEFMAP(FXHeader) FXHeaderMap[]={ FXMAPFUNC(SEL_PAINT,0,FXHeader::onPaint), FXMAPFUNC(SEL_MOTION,0,FXHeader::onMotion), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXHeader::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXHeader::onLeftBtnRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXHeader::onUngrabbed), FXMAPFUNC(SEL_TIMEOUT,FXHeader::ID_TIPTIMER,FXHeader::onTipTimer), FXMAPFUNC(SEL_QUERY_TIP,0,FXHeader::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXHeader::onQueryHelp), }; // Object implementation FXIMPLEMENT(FXHeader,FXFrame,FXHeaderMap,ARRAYNUMBER(FXHeaderMap)) // Make a Header FXHeader::FXHeader(){ flags|=FLAG_ENABLED|FLAG_SHOWN; textColor=0; font=NULL; pos=0; active=-1; activepos=0; activesize=0; offset=0; } // Make a Header FXHeader::FXHeader(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_ENABLED|FLAG_SHOWN; target=tgt; message=sel; textColor=getApp()->getForeColor(); font=getApp()->getNormalFont(); pos=0; active=-1; activepos=0; activesize=0; offset=0; } // Create window void FXHeader::create(){ register FXint i; FXFrame::create(); for(i=0; icreate();} font->create(); } // Detach window void FXHeader::detach(){ register FXint i; FXFrame::detach(); for(i=0; idetach();} font->detach(); } // Get default width FXint FXHeader::getDefaultWidth(){ register FXint i,t,w=0; if(options&HEADER_VERTICAL){ for(i=0; igetWidth(this))>w) w=t; } } else{ for(i=0; igetSize(); } } return w; } // Get default height FXint FXHeader::getDefaultHeight(){ register FXint i,t,h=0; if(options&HEADER_VERTICAL){ for(i=0; igetSize(); } } else{ for(i=0; igetHeight(this))>h) h=t; } } return h; } // Return total size FXint FXHeader::getTotalSize() const { return items.no() ? items[items.no()-1]->getPos()+items[items.no()-1]->getSize()-items[0]->getPos() : 0; } // Create custom item FXHeaderItem *FXHeader::createItem(const FXString& text,FXIcon* icon,FXint size,void* ptr){ return new FXHeaderItem(text,icon,size,ptr); } // Retrieve item FXHeaderItem *FXHeader::getItem(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItem: index out of range.\n",getClassName()); } return items[index]; } // Replace item with another FXint FXHeader::setItem(FXint index,FXHeaderItem* item,FXbool notify){ // Must have item if(!item){ fxerror("%s::setItem: item is NULL.\n",getClassName()); } // Must be in range if(index<0 || items.no()<=index){ fxerror("%s::setItem: index out of range.\n",getClassName()); } // Notify item will be replaced if(notify && target){target->tryHandle(this,FXSEL(SEL_REPLACED,message),(void*)(FXival)index);} // Copy the size over item->setSize(items[index]->getSize()); item->setPos(items[index]->getPos()); // Delete old delete items[index]; // Add new items[index]=item; // Redo layout recalc(); return index; } // Replace item with another FXint FXHeader::setItem(FXint index,const FXString& text,FXIcon *icon,FXint size,void* ptr,FXbool notify){ return setItem(index,createItem(text,icon,FXMAX(size,0),ptr),notify); } // Insert item FXint FXHeader::insertItem(FXint index,FXHeaderItem* item,FXbool notify){ register FXint i,d; // Must have item if(!item){ fxerror("%s::insertItem: item is NULL.\n",getClassName()); } // Must be in range if(index<0 || items.no()setPos((0getPos()+items[index-1]->getSize():0); // Move over remaining items for(i=index,d=item->getSize(); isetPos(items[i]->getPos()+d); // Add item to list items.insert(index,item); // Notify item has been inserted if(notify && target){target->tryHandle(this,FXSEL(SEL_INSERTED,message),(void*)(FXival)index);} // Redo layout recalc(); return index; } // Insert item FXint FXHeader::insertItem(FXint index,const FXString& text,FXIcon *icon,FXint size,void* ptr,FXbool notify){ return insertItem(index,createItem(text,icon,FXMAX(size,0),ptr),notify); } // Append item FXint FXHeader::appendItem(FXHeaderItem* item,FXbool notify){ return insertItem(items.no(),item,notify); } // Append item FXint FXHeader::appendItem(const FXString& text,FXIcon *icon,FXint size,void* ptr,FXbool notify){ return insertItem(items.no(),createItem(text,icon,FXMAX(size,0),ptr),notify); } // Prepend item FXint FXHeader::prependItem(FXHeaderItem* item,FXbool notify){ return insertItem(0,item,notify); } // Prepend item FXint FXHeader::prependItem(const FXString& text,FXIcon *icon,FXint size,void* ptr,FXbool notify){ return insertItem(0,createItem(text,icon,FXMAX(size,0),ptr),notify); } // Fill list by appending items from array of strings FXint FXHeader::fillItems(const FXchar** strings,FXIcon *icon,FXint size,void* ptr,FXbool notify){ register FXint n=0; if(strings){ while(strings[n]){ appendItem(strings[n++],icon,size,ptr,notify); } } return n; } // Fill list by appending items from newline separated strings FXint FXHeader::fillItems(const FXString& strings,FXIcon *icon,FXint size,void* ptr,FXbool notify){ register FXint n=0; FXString text; while(!(text=strings.section('\n',n)).empty()){ appendItem(text,icon,size,ptr,notify); n++; } return n; } // Extract node from list FXHeaderItem* FXHeader::extractItem(FXint index,FXbool notify){ register FXHeaderItem *result; register FXint i,d; // Must be in range if(index<0 || items.no()<=index){ fxerror("%s::extractItem: index out of range.\n",getClassName()); } // Notify item will be deleted if(notify && target){target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)(FXival)index);} // Adjust remaining columns for(i=index+1,d=items[index]->getSize(); isetPos(items[i]->getPos()-d); // Delete item result=items[index]; // Remove item from list items.erase(index); // Redo layout recalc(); // Return item return result; } // Remove node from list void FXHeader::removeItem(FXint index,FXbool notify){ register FXint i,d; // Must be in range if(index<0 || items.no()<=index){ fxerror("%s::removeItem: index out of range.\n",getClassName()); } // Notify item will be deleted if(notify && target){target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)(FXival)index);} // Adjust remaining columns for(i=index+1,d=items[index]->getSize(); isetPos(items[i]->getPos()-d); // Delete item delete items[index]; // Remove item from list items.erase(index); // Redo layout recalc(); } // Remove all items void FXHeader::clearItems(FXbool notify){ // Delete items for(FXint index=items.no()-1; 0<=index; index--){ if(notify && target){target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)(FXival)index);} delete items[index]; } // Free array items.clear(); // Redo layout recalc(); } // Change item's text void FXHeader::setItemText(FXint index,const FXString& text){ if(index<0 || items.no()<=index){ fxerror("%s::setItemText: index out of range.\n",getClassName()); } if(items[index]->getText()!=text){ items[index]->setText(text); recalc(); } } // Get item's text FXString FXHeader::getItemText(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemText: index out of range.\n",getClassName()); } return items[index]->getText(); } // Change item's icon void FXHeader::setItemIcon(FXint index,FXIcon* icon){ if(index<0 || items.no()<=index){ fxerror("%s::setItemIcon: index out of range.\n",getClassName()); } if(items[index]->getIcon()!=icon){ items[index]->setIcon(icon); recalc(); } } // Get item's icon FXIcon* FXHeader::getItemIcon(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemIcon: index out of range.\n",getClassName()); } return items[index]->getIcon(); } // Change item's size void FXHeader::setItemSize(FXint index,FXint size){ register FXint i,d; if(index<0 || items.no()<=index){ fxerror("%s::setItemSize: index out of range.\n",getClassName()); } if(size<0) size=0; d=size-items[index]->getSize(); if(d!=0){ items[index]->setSize(size); for(i=index+1; isetPos(items[i]->getPos()+d); recalc(); } } // Get item's size FXint FXHeader::getItemSize(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemSize: index out of range.\n",getClassName()); } return items[index]->getSize(); } // Get item's offset FXint FXHeader::getItemOffset(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemOffset: index out of range.\n",getClassName()); } return pos+items[index]->getPos(); } // Get index of item at offset FXint FXHeader::getItemAt(FXint coord) const { register FXint h=items.no()-1,l=0,m; coord=coord-pos; if(l<=h){ if(coordgetPos()) return -1; if(coord>=items[h]->getPos()+items[h]->getSize()) return items.no(); do{ m=(h+l)>>1; if(coordgetPos()) h=m-1; else if(coord>=items[m]->getPos()+items[m]->getSize()) l=m+1; else break; } while(h>=l); return m; } return coord<0 ? -1 : 0; } // Set item data void FXHeader::setItemData(FXint index,void* ptr){ if(index<0 || items.no()<=index){ fxerror("%s::setItemData: index out of range.\n",getClassName()); } items[index]->setData(ptr); } // Get item data void* FXHeader::getItemData(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemData: index out of range.\n",getClassName()); } return items[index]->getData(); } // Change sort direction void FXHeader::setArrowDir(FXint index,FXbool dir){ if(index<0 || items.no()<=index){ fxerror("%s::setArrowDir: index out of range.\n",getClassName()); } if(items[index]->getArrowDir()!=dir){ items[index]->setArrowDir(dir); updateItem(index); } } // Return sort direction FXbool FXHeader::getArrowDir(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getArrowDir: index out of range.\n",getClassName()); } return items[index]->getArrowDir(); } // Change item justification void FXHeader::setItemJustify(FXint index,FXuint justify){ if(index<0 || items.no()<=index){ fxerror("%s::setItemJustify: index out of range.\n",getClassName()); } if(items[index]->getJustify()!=justify){ items[index]->setJustify(justify); updateItem(index); } } // Return item justification FXuint FXHeader::getItemJustify(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemJustify: index out of range.\n",getClassName()); } return items[index]->getJustify(); } // Change relative position of icon and text of item void FXHeader::setItemIconPosition(FXint index,FXuint mode){ if(index<0 || items.no()<=index){ fxerror("%s::setItemIconPosition: index out of range.\n",getClassName()); } if(items[index]->getIconPosition()!=mode){ items[index]->setIconPosition(mode); recalc(); } } // Return relative icon and text position FXuint FXHeader::getItemIconPosition(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemIconPosition: index out of range.\n",getClassName()); } return items[index]->getIconPosition(); } // Changed button item's pressed state void FXHeader::setItemPressed(FXint index,FXbool pressed){ if(index<0 || items.no()<=index){ fxerror("%s::setItemPressed: index out of range.\n",getClassName()); } if(pressed!=items[index]->isPressed()){ items[index]->setPressed(pressed); updateItem(index); } } // Return TRUE if button item is pressed in FXbool FXHeader::isItemPressed(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::isItemPressed: index out of range.\n",getClassName()); } return items[index]->isPressed(); } // Scroll to make given item visible void FXHeader::makeItemVisible(FXint index){ register FXint newpos,ioffset,isize,space; if(xid){ newpos=pos; if(0<=index && indexgetPos(); isize=items[index]->getSize(); newpos=pos; if(newpos+ioffset+isize>=space) newpos=space-ioffset-isize; if(newpos+ioffset<=0) newpos=-ioffset; } setPosition(newpos); } } // Repaint cell at index void FXHeader::updateItem(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::updateItem: index out of range.\n",getClassName()); } if(options&HEADER_VERTICAL) update(0,pos+items[index]->getPos(),width,items[index]->getSize()); else update(pos+items[index]->getPos(),0,items[index]->getSize(),height); } // Do layout void FXHeader::layout(){ // Force repaint update(); // No more dirty flags&=~FLAG_DIRTY; } // Handle repaint long FXHeader::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); register FXint x,y,w,h,i,ilo,ihi; // Set font dc.setFont(font); // Paint background dc.setForeground(backColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); // Vertical if(options&HEADER_VERTICAL){ // Determine affected items ilo=getItemAt(ev->rect.y); ihi=getItemAt(ev->rect.y+ev->rect.h); // Fragment below first item if(ilo<0){ y=pos; if(0getPos(); } if(0=items.no()){ y=pos; if(0getPos()+items[items.no()-1]->getSize(); } if(ygetPos(); h=items[i]->getSize(); if(items[i]->isPressed()){ if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,y,width,h); else if(options&FRAME_RAISED) drawSunkenRectangle(dc,0,y,width,h); } else{ if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,y,width,h); else if(options&FRAME_RAISED) drawRaisedRectangle(dc,0,y,width,h); } items[i]->draw(this,dc,0,y,width,h); } } // Horizontal else{ // Determine affected items ilo=getItemAt(ev->rect.x); ihi=getItemAt(ev->rect.x+ev->rect.w); // Fragment below first item if(ilo<0){ x=pos; if(0getPos(); } if(0=items.no()){ x=pos; if(0getPos()+items[items.no()-1]->getSize(); } if(xgetPos(); w=items[i]->getSize(); if(items[i]->isPressed()){ if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,x,0,w,height); else if(options&FRAME_RAISED) drawSunkenRectangle(dc,x,0,w,height); } else{ if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,x,0,w,height); else if(options&FRAME_RAISED) drawRaisedRectangle(dc,x,0,w,height); } items[i]->draw(this,dc,x,0,w,height); } } return 1; } // We were asked about tip text long FXHeader::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if(flags&FLAG_TIP){ FXint index,cx,cy; FXuint btns; getCursorPosition(cx,cy,btns); index=getItemAt((options&HEADER_VERTICAL)?cy:cx); if(0<=index && indexgetText(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&string); return 1; } } return 0; } // We were asked about status text long FXHeader::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // We timed out, i.e. the user didn't move for a while long FXHeader::onTipTimer(FXObject*,FXSelector,void*){ FXTRACE((250,"%s::onTipTimer %p\n",getClassName(),this)); flags|=FLAG_TIP; return 1; } // Button being pressed long FXHeader::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint coord; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); // First change callback if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; // Where clicked coord=(options&HEADER_VERTICAL)?event->win_y:event->win_x; active=getItemAt(coord); if(0<=active && activegetPos()+items[active]->getSize()-FUDGEgetPos(); activesize=items[active]->getSize(); offset=coord-activepos-activesize; setDragCursor((options&HEADER_VERTICAL)?getApp()->getDefaultCursor(DEF_VSPLIT_CURSOR):getApp()->getDefaultCursor(DEF_HSPLIT_CURSOR)); flags|=FLAG_PRESSED|FLAG_TRYDRAG; } else if((options&HEADER_RESIZE) && (0getPos()+items[active-1]->getSize()+FUDGE)){ active--; activepos=pos+items[active]->getPos(); activesize=items[active]->getSize(); offset=coord-activepos-activesize; setDragCursor((options&HEADER_VERTICAL)?getApp()->getDefaultCursor(DEF_VSPLIT_CURSOR):getApp()->getDefaultCursor(DEF_HSPLIT_CURSOR)); flags|=FLAG_PRESSED|FLAG_TRYDRAG; } else if((options&HEADER_BUTTON) && (activegetPos(); activesize=items[active]->getSize(); setItemPressed(active,TRUE); flags|=FLAG_PRESSED; } } flags&=~FLAG_UPDATE; return 1; } return 0; } // Button being released long FXHeader::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXuint flg=flags; if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; flags&=~(FLAG_PRESSED|FLAG_DODRAG|FLAG_TRYDRAG); // First chance callback if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; // Set cursor back setDragCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); // Clicked on split if(flg&FLAG_TRYDRAG){ if(target) target->tryHandle(this,FXSEL(SEL_CLICKED,message),(void*)(FXival)active); return 1; } // Dragged split if(flg&FLAG_DODRAG){ if(!(options&HEADER_TRACKING)){ drawSplit(activepos+activesize); setItemSize(active,activesize); if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)active); } return 1; } // Pressed button if(flg&FLAG_PRESSED){ if(items[active]->isPressed()){ setItemPressed(active,FALSE); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)active); } return 1; } } return 0; } // Button being moved long FXHeader::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint oldsplit,newsplit,index; FXuint flg=flags; // Kill the tip flags&=~FLAG_TIP; // Kill the tip timer getApp()->removeTimeout(this,ID_TIPTIMER); // Tentatively dragging split if(flags&FLAG_TRYDRAG){ if(!(options&HEADER_TRACKING)) drawSplit(activepos+activesize); flags&=~FLAG_TRYDRAG; flags|=FLAG_DODRAG; return 1; } // Dragging split if(flags&FLAG_DODRAG){ oldsplit=activepos+activesize; if(options&HEADER_VERTICAL) activesize=event->win_y-offset-activepos; else activesize=event->win_x-offset-activepos; if(activesize<0) activesize=0; newsplit=activepos+activesize; if(newsplit!=oldsplit){ if(!(options&HEADER_TRACKING)){ drawSplit(oldsplit); drawSplit(newsplit); } else{ setItemSize(active,activesize); if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)active); } } return 1; } // Had the button pressed if(flags&FLAG_PRESSED){ if(options&HEADER_VERTICAL){ if(activepos<=event->win_y && event->win_ywin_x && event->win_xwin_x && event->win_xwin_y && event->win_ywin_y-FUDGE); if(0<=index && indexgetPos()+items[index]->getSize()-FUDGEwin_y){ setDefaultCursor(getApp()->getDefaultCursor(DEF_VSPLIT_CURSOR)); } else{ setDefaultCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); } } else{ index=getItemAt(event->win_x-FUDGE); if(0<=index && indexgetPos()+items[index]->getSize()-FUDGEwin_x){ setDefaultCursor(getApp()->getDefaultCursor(DEF_HSPLIT_CURSOR)); } else{ setDefaultCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); } } } // Reset tip timer if nothing's going on getApp()->addTimeout(this,ID_TIPTIMER,getApp()->getMenuPause()); // Force GUI update only when needed return (flg&FLAG_TIP); } // The widget lost the grab for some reason long FXHeader::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onUngrabbed(sender,sel,ptr); flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; return 1; } // Draw the split void FXHeader::drawSplit(FXint p){ FXDCWindow dc(getParent()); FXint px,py; translateCoordinatesTo(px,py,getParent(),p,p); dc.clipChildren(FALSE); dc.setFunction(BLT_NOT_DST); if(options&HEADER_VERTICAL){ dc.fillRectangle(0,py,getParent()->getWidth(),2); } else{ dc.fillRectangle(px,0,2,getParent()->getHeight()); } } // Set position, scrolling contents void FXHeader::setPosition(FXint p){ if(pos!=p){ if(options&HEADER_VERTICAL) scroll(0,0,width,height,0,p-pos); else scroll(0,0,width,height,p-pos,0); pos=p; } } // Change the font void FXHeader::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Set text color void FXHeader::setTextColor(FXColor clr){ if(textColor!=clr){ textColor=clr; update(); } } // Header style change void FXHeader::setHeaderStyle(FXuint style){ FXuint opts=(options&~HEADER_MASK) | (style&HEADER_MASK); if(options!=opts){ options=opts; recalc(); update(); } } // Get header style FXuint FXHeader::getHeaderStyle() const { return (options&HEADER_MASK); } // Change help text void FXHeader::setHelpText(const FXString& text){ help=text; } // Save object to stream void FXHeader::save(FXStream& store) const { FXFrame::save(store); items.save(store); store << textColor; store << font; store << help; store << pos; } // Load object from stream void FXHeader::load(FXStream& store){ FXFrame::load(store); items.load(store); store >> textColor; store >> font; store >> help; store >> pos; } // Clean up FXHeader::~FXHeader(){ getApp()->removeTimeout(this,ID_TIPTIMER); clearItems(); font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXHorizontalFrame.cpp000066400000000000000000000204451326741342000174770ustar00rootroot00000000000000/******************************************************************************** * * * H o r i z o n t a l C o n t a i n e r O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXHorizontalFrame.cpp,v 1.28 2006/01/22 17:58:31 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXHorizontalFrame.h" /* Notes: - Filled items shrink as well as stretch. - Stretch is proportional to default size; this way, at default size, it is exactly correct. - Tabbing order takes widget layout into account */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXHorizontalFrame) FXHorizontalFrameMap[]={ FXMAPFUNC(SEL_FOCUS_PREV,0,FXHorizontalFrame::onFocusLeft), FXMAPFUNC(SEL_FOCUS_NEXT,0,FXHorizontalFrame::onFocusRight), }; // Object implementation FXIMPLEMENT(FXHorizontalFrame,FXPacker,FXHorizontalFrameMap,ARRAYNUMBER(FXHorizontalFrameMap)) // Make a horizontal one FXHorizontalFrame::FXHorizontalFrame(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXPacker(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ } // Compute minimum width based on child layout hints FXint FXHorizontalFrame::getDefaultWidth(){ register FXint w,wcum,wmax,mw; register FXWindow* child; register FXuint hints; wcum=wmax=mw=0; if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth(); for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if((hints&LAYOUT_RIGHT)&&(hints&LAYOUT_CENTER_X)){ // LAYOUT_FIX_X w=child->getX()+w; if(w>wmax) wmax=w; } else{ if(wcum) wcum+=hspacing; wcum+=w; } } } wcum+=padleft+padright+(border<<1); return FXMAX(wcum,wmax); } // Compute minimum height based on child layout hints FXint FXHorizontalFrame::getDefaultHeight(){ register FXint h,hmax,hcum,mh; register FXWindow* child; register FXuint hints; hmax=hcum=mh=0; if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight(); for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if((hints&LAYOUT_BOTTOM)&&(hints&LAYOUT_CENTER_Y)){ // LAYOUT_FIX_Y h=child->getY()+h; if(h>hmax) hmax=h; } else{ if(h>hcum) hcum=h; } } } hcum+=padtop+padbottom+(border<<1); return FXMAX(hcum,hmax); } // Recalculate layout void FXHorizontalFrame::layout(){ register FXint left,right,top,bottom,remain,extra_space,total_space,t,x,y,w,h; register FXWindow* child; register FXint sumexpand=0; register FXint numexpand=0; register FXint mw=0; register FXint mh=0; register FXint e=0; register FXuint hints; // Placement rectangle; right/bottom non-inclusive left=border+padleft; right=width-border-padright; top=border+padtop; bottom=height-border-padbottom; remain=right-left; // Get maximum child size if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth(); if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight(); // Find number of paddable children and total width for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(!((hints&LAYOUT_RIGHT)&&(hints&LAYOUT_CENTER_X))){ // LAYOUT_FIX_X if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); FXASSERT(w>=0); if((hints&LAYOUT_CENTER_X) || ((hints&LAYOUT_FILL_X) && !(hints&LAYOUT_FIX_WIDTH))){ sumexpand+=w; numexpand+=1; } else{ remain-=w; } remain-=hspacing; } } } // Child spacing correction remain+=hspacing; // Do the layout for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); // Determine child height if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else if(hints&LAYOUT_FILL_Y) h=bottom-top; else h=child->getDefaultHeight(); // Determine child y-position if((hints&LAYOUT_BOTTOM)&&(hints&LAYOUT_CENTER_Y)) y=child->getY(); else if(hints&LAYOUT_CENTER_Y) y=top+(bottom-top-h)/2; else if(hints&LAYOUT_BOTTOM) y=bottom-h; else y=top; // Layout child in X x=child->getX(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if(!((hints&LAYOUT_RIGHT)&&(hints&LAYOUT_CENTER_X))){ // LAYOUT_FIX_X extra_space=0; total_space=0; if((hints&LAYOUT_FILL_X) && !(hints&LAYOUT_FIX_WIDTH)){ if(sumexpand>0){ // Divide space proportionally to width t=w*remain; FXASSERT(sumexpand>0); w=t/sumexpand; e+=t%sumexpand; if(e>=sumexpand){w++;e-=sumexpand;} } else{ // Divide the space equally FXASSERT(numexpand>0); w=remain/numexpand; e+=remain%numexpand; if(e>=numexpand){w++;e-=numexpand;} } } else if(hints&LAYOUT_CENTER_X){ if(sumexpand>0){ // Divide space proportionally to width t=w*remain; FXASSERT(sumexpand>0); total_space=t/sumexpand-w; e+=t%sumexpand; if(e>=sumexpand){total_space++;e-=sumexpand;} } else{ // Divide the space equally FXASSERT(numexpand>0); total_space=remain/numexpand-w; e+=remain%numexpand; if(e>=numexpand){total_space++;e-=numexpand;} } extra_space=total_space/2; } if(hints&LAYOUT_RIGHT){ x=right-w-extra_space; right=right-w-hspacing-total_space; } else{ x=left+extra_space; left=left+w+hspacing+total_space; } } child->position(x,y,w,h); } } flags&=~FLAG_DIRTY; } } fox1.6-1.6.57/src/FXICOIcon.cpp000066400000000000000000000063471326741342000156230ustar00rootroot00000000000000/******************************************************************************** * * * I C O I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Janusz Ganczarski. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXICOIcon.cpp,v 1.27 2006/01/22 17:58:31 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXMemoryStream.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXICOIcon.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXICOIcon::fileExt[]="ico"; // Suggested mime type const FXchar FXICOIcon::mimeType[]="image/ico"; // Object implementation FXIMPLEMENT(FXICOIcon,FXIcon,NULL,0) // Initialize nicely FXICOIcon::FXICOIcon(FXApp* a,const void *pix,FXColor clr,FXuint opts,FXint w,FXint h):FXIcon(a,NULL,clr,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save object to stream bool FXICOIcon::savePixels(FXStream& store) const { if(fxsaveICO(store,data,width,height,0,0)){ return true; } return false; } // Load object from stream bool FXICOIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h,hotx,hoty; if(fxloadICO(store,pixels,w,h,hotx,hoty)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXICOIcon::~FXICOIcon(){ } } fox1.6-1.6.57/src/FXICOImage.cpp000066400000000000000000000062421326741342000157470ustar00rootroot00000000000000/******************************************************************************** * * * I C O I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Janusz Ganczarski. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXICOImage.cpp,v 1.28 2006/01/22 17:58:31 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXICOImage.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXICOImage::fileExt[]="ico"; // Suggested mime type const FXchar FXICOImage::mimeType[]="image/ico"; // Object implementation FXIMPLEMENT(FXICOImage,FXImage,NULL,0) // Initialize FXICOImage::FXICOImage(FXApp* a,const void *pix,FXuint opts,FXint w,FXint h):FXImage(a,NULL,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save pixel data only bool FXICOImage::savePixels(FXStream& store) const { if(fxsaveICO(store,data,width,height,0,0)){ return true; } return false; } // Load pixel data only bool FXICOImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h,hotx,hoty; if(fxloadICO(store,pixels,w,h,hotx,hoty)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXICOImage::~FXICOImage(){ } } fox1.6-1.6.57/src/FXIFFIcon.cpp000066400000000000000000000062421326741342000156070ustar00rootroot00000000000000/******************************************************************************** * * * I F F I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIFFIcon.cpp,v 1.12 2006/01/22 17:58:31 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXIFFIcon.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXIFFIcon::fileExt[]="iff"; // Suggested mime type const FXchar FXIFFIcon::mimeType[]="image/x-iff"; // Object implementation FXIMPLEMENT(FXIFFIcon,FXIcon,NULL,0) // Initialize nicely FXIFFIcon::FXIFFIcon(FXApp* a,const void *pix,FXColor clr,FXuint opts,FXint w,FXint h):FXIcon(a,NULL,clr,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save object to stream bool FXIFFIcon::savePixels(FXStream&) const { return false; } // Load object from stream bool FXIFFIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadIFF(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXIFFIcon::~FXIFFIcon(){ } } fox1.6-1.6.57/src/FXIFFImage.cpp000066400000000000000000000061421326741342000157400ustar00rootroot00000000000000/******************************************************************************** * * * I F F I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIFFImage.cpp,v 1.12 2006/01/22 17:58:31 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXIFFImage.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXIFFImage::fileExt[]="iff"; // Suggested mime type const FXchar FXIFFImage::mimeType[]="image/x-iff"; // Object implementation FXIMPLEMENT(FXIFFImage,FXImage,NULL,0) // Initialize FXIFFImage::FXIFFImage(FXApp* a,const void *pix,FXuint opts,FXint w,FXint h):FXImage(a,NULL,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save object to stream bool FXIFFImage::savePixels(FXStream&) const { return false; } // Load object from stream bool FXIFFImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadIFF(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXIFFImage::~FXIFFImage(){ } } fox1.6-1.6.57/src/FXIO.cpp000066400000000000000000000067721326741342000147110ustar00rootroot00000000000000/******************************************************************************** * * * I / O D e v i c e C l a s s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIO.cpp,v 1.6 2006/01/22 17:58:31 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "FXHash.h" #include "FXStream.h" //#include "FXString.h" //#include "FXPath.h" #include "FXIO.h" //#include "FXStat.h" //#include "FXDir.h" /* Notes: - An abstract class for low-level IO. */ #ifdef WIN32 #define BadHandle INVALID_HANDLE_VALUE #else #define BadHandle -1 #endif using namespace FX; /*******************************************************************************/ namespace FX { // Construct FXIO::FXIO():device(BadHandle),access(NoAccess){ } // Open file bool FXIO::open(FXInputHandle handle,FXuint mode){ device=handle; access=mode; return true; } // Return true if open bool FXIO::isOpen() const { return device!=BadHandle; } // Attach existing file handle void FXIO::attach(FXInputHandle handle,FXuint mode){ close(); device=handle; access=mode; } // Detach existing file handle void FXIO::detach(){ device=BadHandle; access=NoAccess; } // Get position FXlong FXIO::position() const { return -1; } // Move to position FXlong FXIO::position(FXlong,FXuint){ return -1; } // Read block FXival FXIO::readBlock(void*,FXival){ return 0; } // Write block FXival FXIO::writeBlock(const void*,FXival count){ return count; } // Truncate file FXlong FXIO::truncate(FXlong){ return -1; } // Synchronize disk with cached data bool FXIO::flush(){ return false; } // Test if we're at the end bool FXIO::eof(){ return true; } // Return file size FXlong FXIO::size(){ return 0; } // Close file bool FXIO::close(){ device=BadHandle; return true; } // Destroy FXIO::~FXIO(){ close(); } } fox1.6-1.6.57/src/FXIcon.cpp000066400000000000000000000500371326741342000152630ustar00rootroot00000000000000/******************************************************************************** * * * I c o n - O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIcon.cpp,v 1.71.2.1 2007/02/23 21:22:32 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXVisual.h" #include "FXIcon.h" /* Notes: - Debug the render function between different hosts. - Option to guess alpha color from corners. - The shape pixmap [X11] actually contains TWO shapes:- the shape mask (transparency) as well as the etch mask (gray out&transparency). We do this because most icons are 16x16 or so, and we can fit two of them side-by-side in the space of one:- because the bitmaps are typically padded to a width of 32 anyway :-) Either way, the overhead for the header will be smaller. - When we make FXImage always to have an alpha channel, add method to set alpha channel to transparent when color is equal to alpha-color. This simplifies the shape/etch mask procedure. */ #define DARKCOLOR(r,g,b) (((r)+(g)+(b))display)) using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXIcon,FXImage,NULL,0) // Initialize nicely FXIcon::FXIcon(FXApp* a,const FXColor *pix,FXColor clr,FXuint opts,FXint w,FXint h): FXImage(a,pix,opts,w,h){ FXTRACE((100,"FXIcon::FXIcon %p\n",this)); shape=0; etch=0; transp=clr; } // Guess alpha color based on corners; the initial guess is standard GUI color FXColor FXIcon::guesstransp(){ register FXColor guess=FXRGB(192,192,192); register FXint best,t; FXColor color[4]; if(data && 0best){ guess=color[0]; best=t; } if((t=((color[1]==color[2])+(color[1]==color[3])+(color[1]==color[0])))>best){ guess=color[1]; best=t; } if((t=((color[2]==color[3])+(color[2]==color[0])+(color[2]==color[1])))>best){ guess=color[2]; best=t; } if((t=((color[3]==color[0])+(color[3]==color[1])+(color[3]==color[2])))>best){ guess=color[3]; } } return guess; } // Determine threshold for etch mask static FXshort guessthresh(const FXColor *data,FXint width,FXint height){ register FXint med=(width*height)>>1; register FXint cum,i,j; register FXshort guess; FXint frequency[766]; memset(frequency,0,sizeof(frequency)); for(i=0; i=med) break; } for(j=765,cum=0; j>0; --j){ if((cum+=frequency[j])>=med) break; } guess=((i+j+1)>>1)+1; // Fanglin Zhu: raise threshold by one in case of single-color image return guess; } // Create icon void FXIcon::create(){ if(!xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::create %p\n",getClassName(),this)); #ifndef WIN32 // Initialize visual visual->create(); // Get depth (should use visual!!) int dd=visual->getDepth(); // Make image pixmap xid=XCreatePixmap(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),FXMAX(width,1),FXMAX(height,1),dd); if(!xid){ fxerror("%s::create: unable to create icon.\n",getClassName()); } // Make shape pixmap shape=XCreatePixmap(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),FXMAX(width,1),FXMAX(height,1),1); if(!shape){ fxerror("%s::create: unable to create icon.\n",getClassName()); } // Make etch pixmap etch=XCreatePixmap(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),FXMAX(width,1),FXMAX(height,1),1); if(!etch){ fxerror("%s::create: unable to create icon.\n",getClassName()); } #else // Initialize visual visual->create(); // Create a memory DC compatible with current display HDC hdc=::GetDC(GetDesktopWindow()); xid=::CreateCompatibleBitmap(hdc,FXMAX(width,1),FXMAX(height,1)); ::ReleaseDC(GetDesktopWindow(),hdc); if(!xid){ fxerror("%s::create: unable to create image.\n",getClassName()); } // Make shape bitmap shape=::CreateBitmap(FXMAX(width,1),FXMAX(height,1),1,1,NULL); if(!shape){ fxerror("%s::create: unable to create icon.\n",getClassName()); } // Make etch bitmap etch=::CreateBitmap(FXMAX(width,1),FXMAX(height,1),1,1,NULL); if(!etch){ fxerror("%s::create: unable to create icon.\n",getClassName()); } #endif // Render pixels render(); // If we're not keeping the pixel buffer, release it if(!(options&IMAGE_KEEP)) release(); } } } // Detach icon void FXIcon::detach(){ visual->detach(); if(xid){ FXTRACE((100,"%s::detach %p\n",getClassName(),this)); shape=0; etch=0; xid=0; } } // Destroy icon void FXIcon::destroy(){ if(xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::destroy %p\n",getClassName(),this)); #ifndef WIN32 // Delete shape, etch, and image pixmaps XFreePixmap(DISPLAY(getApp()),shape); XFreePixmap(DISPLAY(getApp()),etch); XFreePixmap(DISPLAY(getApp()),xid); #else // Delete shape, etch, and image bitmaps ::DeleteObject(shape); ::DeleteObject(etch); ::DeleteObject(xid); #endif } shape=0; etch=0; xid=0; } } #ifndef WIN32 // Render icon X Windows void FXIcon::render(){ if(xid){ register Visual *vis; register XImage *xim=NULL; register bool shmi=false; register FXColor *img; register FXint x,y; register FXshort thresh; // Local variable in 1.6 XGCValues values; GC gc; #ifdef HAVE_XSHM_H XShmSegmentInfo shminfo; #endif FXTRACE((100,"%s::render shape %p\n",getClassName(),this)); // Render the image pixels FXImage::render(); // Fill with pixels if there is data if(data && 0visual; // Turn it on iff both supported and desired #ifdef HAVE_XSHM_H if(options&IMAGE_SHMI) shmi=getApp()->shmi; #endif // First try XShm #ifdef HAVE_XSHM_H if(shmi){ xim=XShmCreateImage(DISPLAY(getApp()),vis,1,ZPixmap,NULL,&shminfo,width,height); if(!xim){ shmi=0; } if(shmi){ shminfo.shmid=shmget(IPC_PRIVATE,xim->bytes_per_line*xim->height,IPC_CREAT|0777); if(shminfo.shmid==-1){ xim->data=NULL; XDestroyImage(xim); xim=NULL; shmi=0; } if(shmi){ shminfo.shmaddr=xim->data=(char*)shmat(shminfo.shmid,0,0); shminfo.readOnly=false; XShmAttach(DISPLAY(getApp()),&shminfo); FXTRACE((150,"Bitmap XSHM attached at memory=%p (%d bytes)\n",xim->data,xim->bytes_per_line*xim->height)); } } } #endif // Try the old fashioned way if(!shmi){ // Try create image xim=XCreateImage(DISPLAY(getApp()),vis,1,ZPixmap,0,NULL,width,height,32,0); if(!xim){ fxerror("%s::render: unable to render icon.\n",getClassName()); } // Try create temp pixel store if(!FXMALLOC(&xim->data,char,xim->bytes_per_line*height)){ fxerror("%s::render: unable to allocate memory.\n",getClassName()); } } // Make GC values.foreground=0xffffffff; values.background=0xffffffff; gc=XCreateGC(DISPLAY(getApp()),shape,GCForeground|GCBackground,&values); // Should have succeeded FXASSERT(xim); FXTRACE((150,"bm width = %d\n",xim->width)); FXTRACE((150,"bm height = %d\n",xim->height)); FXTRACE((150,"bm format = %s\n",xim->format==XYBitmap?"XYBitmap":xim->format==XYPixmap?"XYPixmap":"ZPixmap")); FXTRACE((150,"bm byte_order = %s\n",(xim->byte_order==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150,"bm bitmap_unit = %d\n",xim->bitmap_unit)); FXTRACE((150,"bm bitmap_bit_order = %s\n",(xim->bitmap_bit_order==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150,"bm bitmap_pad = %d\n",xim->bitmap_pad)); FXTRACE((150,"bm bitmap_unit = %d\n",xim->bitmap_unit)); FXTRACE((150,"bm depth = %d\n",xim->depth)); FXTRACE((150,"bm bytes_per_line = %d\n",xim->bytes_per_line)); FXTRACE((150,"bm bits_per_pixel = %d\n",xim->bits_per_pixel)); // Fill shape mask if(options&IMAGE_OPAQUE){ // Opaque image FXTRACE((150,"Shape rectangle\n")); memset(xim->data,0xff,xim->bytes_per_line*height); } else if(options&(IMAGE_ALPHACOLOR|IMAGE_ALPHAGUESS)){ // Transparent color FXTRACE((150,"Shape from alpha-color\n")); img=data; for(y=0; ydata,xim->bytes_per_line*xim->height)); XShmDetach(DISPLAY(getApp()),&shminfo); xim->data=NULL; XDestroyImage(xim); shmdt(shminfo.shmaddr); shmctl(shminfo.shmid,IPC_RMID,0); } #endif if(!shmi){ FXFREE(&xim->data); XDestroyImage(xim); } XFreeGC(DISPLAY(getApp()),gc); } } } #else struct BITMAPINFO2 { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[2]; }; // Render Icon MS-Windows void FXIcon::render(){ if(xid){ register FXint bytes_per_line,x,y; register FXuchar *msk,*ets; register FXColor *img; FXuchar *maskdata; FXuchar *etchdata; register FXshort thresh; // Local variable in 1.6 BITMAPINFO2 bmi; HDC hdcmsk; FXTRACE((100,"%s::render %p\n",getClassName(),this)); // Render the image (color) pixels as usual FXImage::render(); // Fill with pixels if there is data if(data && 0>3; FXCALLOC(&maskdata,FXuchar,height*bytes_per_line); FXCALLOC(&etchdata,FXuchar,height*bytes_per_line); msk=maskdata+height*bytes_per_line; ets=etchdata+height*bytes_per_line; if(options&IMAGE_OPAQUE){ // Opaque image img=data; for(y=0; y>3]|=0x80>>(x&7); } } img+=width; } } else if(options&(IMAGE_ALPHACOLOR|IMAGE_ALPHAGUESS)){ // Transparent color img=data; for(y=0; y>3]|=0x80>>(x&7); } if(img[x]==transp){ msk[x>>3]|=0x80>>(x&7); ets[x>>3]|=0x80>>(x&7); } } img+=width; } } else{ // Transparency channel img=data; for(y=0; y>3]|=0x80>>(x&7); } if(((FXuchar*)(img+x))[3]==0){ msk[x>>3]|=0x80>>(x&7); ets[x>>3]|=0x80>>(x&7); } } img+=width; } } // The MSDN documentation for SetDIBits() states that "the device context // identified by the (first) parameter is used only if the DIB_PAL_COLORS // constant is set for the (last) parameter". This may be true, but under // Win95 you must pass in a non-NULL hdc for the first parameter; otherwise // this call to SetDIBits() will fail (in contrast, it works fine under // Windows NT if you pass in a NULL hdc). hdcmsk=::CreateCompatibleDC(NULL); // Set mask data if(!::SetDIBits(hdcmsk,(HBITMAP)shape,0,height,maskdata,(BITMAPINFO*)&bmi,DIB_RGB_COLORS)){ fxerror("%s::render: unable to render pixels\n",getClassName()); } // Set etch data if(!::SetDIBits(hdcmsk,(HBITMAP)etch,0,height,etchdata,(BITMAPINFO*)&bmi,DIB_RGB_COLORS)){ fxerror("%s::render: unable to render pixels\n",getClassName()); } FXFREE(&maskdata); FXFREE(&etchdata); ::GdiFlush(); // We AND the image with the mask, then we can do faster and more // flicker-free icon painting later using the `black source' method HBITMAP hmsk=(HBITMAP)::SelectObject(hdcmsk,(HBITMAP)shape); HDC hdcmem=::CreateCompatibleDC(NULL); HBITMAP hbmp=(HBITMAP)::SelectObject(hdcmem,(HBITMAP)xid); ::SetBkColor(hdcmem,RGB(0,0,0)); // 1 -> black ::SetTextColor(hdcmem,RGB(255,255,255)); // 0 -> white ::BitBlt(hdcmem,0,0,width,height,hdcmsk,0,0,SRCAND); ::SelectObject(hdcmem,hbmp); ::SelectObject(hdcmsk,hmsk); ::DeleteDC(hdcmem); ::DeleteDC(hdcmsk); } } } #endif // Resize pixmap to the specified width and height; the contents become undefined void FXIcon::resize(FXint w,FXint h){ if(w<1) w=1; if(h<1) h=1; FXTRACE((100,"%s::resize(%d,%d) %p\n",getClassName(),w,h,this)); if(width!=w || height!=h){ // Resize device dependent pixmap if(xid){ #ifndef WIN32 // Get depth (should use visual!!) int dd=visual->getDepth(); // Free old pixmaps XFreePixmap(DISPLAY(getApp()),xid); XFreePixmap(DISPLAY(getApp()),etch); XFreePixmap(DISPLAY(getApp()),shape); // Make new pixmap xid=XCreatePixmap(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),w,h,dd); if(!xid){ fxerror("%s::resize: unable to resize image.\n",getClassName()); } // Make shape pixmap shape=XCreatePixmap(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),w,h,1); if(!shape){ fxerror("%s::create: unable to create icon.\n",getClassName()); } // Make etch pixmap etch=XCreatePixmap(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),w,h,1); if(!etch){ fxerror("%s::create: unable to create icon.\n",getClassName()); } #else // Delete old bitmaps ::DeleteObject(xid); ::DeleteObject(shape); ::DeleteObject(etch); // Create a bitmap compatible with current display HDC hdc=::GetDC(GetDesktopWindow()); xid=::CreateCompatibleBitmap(hdc,w,h); ::ReleaseDC(GetDesktopWindow(),hdc); if(!xid){ fxerror("%s::resize: unable to resize image.\n",getClassName()); } // Make shape bitmap shape=::CreateBitmap(w,h,1,1,NULL); if(!shape){ fxerror("%s::create: unable to create icon.\n",getClassName()); } // Make etch bitmap etch=::CreateBitmap(w,h,1,1,NULL); if(!etch){ fxerror("%s::create: unable to create icon.\n",getClassName()); } #endif } } // Resize data array if(data){ if(!(options&IMAGE_OWNED)){ // Need to own array FXMALLOC(&data,FXColor,w*h); options|=IMAGE_OWNED; } else if(w*h!=width*height){ FXRESIZE(&data,FXColor,w*h); } } // Remember new size width=w; height=h; } // Clean up FXIcon::~FXIcon(){ FXTRACE((100,"FXIcon::~FXIcon %p\n",this)); destroy(); } } fox1.6-1.6.57/src/FXIconDict.cpp000066400000000000000000000074651326741342000160760ustar00rootroot00000000000000/******************************************************************************** * * * I c o n D i c t i o n a r y * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIconDict.cpp,v 1.12 2006/01/22 17:58:31 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXFile.h" #include "FXStream.h" #include "FXFileStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXPath.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXIcon.h" #include "FXIconDict.h" #include "FXIconSource.h" /* Notes: - This class loads an icon from a collection found off the icon search path. - FXIconDict owns the icons being loaded; other classes like FXFileDict and FXFileList merely reference them. */ // You can override the default icon locations to search for your // particular platform by specifying -DDEFAULTICONPATH="path" on // the command line. #ifndef DEFAULTICONPATH #define DEFAULTICONPATH "~/.foxicons:/usr/local/share/icons:/usr/share/icons" #endif using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXIconDict,FXDict,NULL,0) // Default icon path const FXchar FXIconDict::defaultIconPath[]=DEFAULTICONPATH; // Build icon table FXIconDict::FXIconDict(FXApp* app,const FXString& p):path(p){ FXTRACE((100,"FXIconDict::FXIconDict\n")); source=new FXIconSource(app); } // Search for the icon name along the search path, and try to load it void *FXIconDict::createData(const void* ptr){ return source->loadIconFile(FXPath::search(path,(const char*)ptr)); } // Delete the icon void FXIconDict::deleteData(void* ptr){ delete ((FXIcon*)ptr); } // Save data void FXIconDict::save(FXStream& store) const { FXDict::save(store); store << source; store << path; } // Load data void FXIconDict::load(FXStream& store){ FXDict::load(store); store >> source; store >> path; } // Destructor FXIconDict::~FXIconDict(){ FXTRACE((100,"FXIconDict::~FXIconDict\n")); delete source; source=(FXIconSource*)-1L; clear(); } } fox1.6-1.6.57/src/FXIconList.cpp000066400000000000000000002412061326741342000161170ustar00rootroot00000000000000/******************************************************************************** * * * I c o n L i s t O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIconList.cpp,v 1.197.2.5 2006/08/02 01:31:09 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "fxascii.h" #include "fxunicode.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXObjectList.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXImage.h" #include "FXIcon.h" #include "FXButton.h" #include "FXScrollBar.h" #include "FXScrollArea.h" #include "FXHeader.h" #include "FXIconList.h" /* To do: - In detail-mode, some items should be left, some right, and some centered in the field. - Typing first few letters of an item should make that item current. - Maybe need item-by-name access? - Return key simulates double click. - Need method to set header columns. - Sortfunc's will be hard to serialize, and hard to write w/o secretly #including the FXTreeItem header! - Rapid key actions are wrongly interpreted as double clicks - Upgrade later to accomodate heterogeneous item sizes (this means a more complex layout algorithm, and likely also explicit x,y recorded in each item). - In all list widgets, get rid of this complex marking business. - Should adding/removing items send SEL_INSERTED and SEL_DELETED callbacks. - Need to add support for arbitrary icon sizes same as FXTreeList already has; layout needs to be such that each column is as wide as widest item in that column only (and not as wide as the widest item in the list). - It may be convenient to have ways to move items around. - Need insertSorted() API to add item in the right place based on current sort function. - Changing icon should NOT cause recalc() when size does not change. - When XDND, autoscrolling happens a bit too fast because we get timers from motion as well as dnd-motion events; probably, it should not autoscroll when dragging icons. - Perhaps drawDetails() should ignore x coordinate and just look at getItemOffest() from the header instead. - Perhaps the ICONLIST_AUTOSIZE mode should be set with a separate API so that the visual stuff changed setListStyle(). - Since '\0' is no longer special in FXString, perhaps we can replace the function of '\t' with '\0'. This would be significantly more efficient. */ #define SIDE_SPACING 4 // Left or right spacing between items #define DETAIL_TEXT_SPACING 2 // Spacing between text and icon in detail icon mode #define MINI_TEXT_SPACING 2 // Spacing between text and icon in mini icon mode #define BIG_LINE_SPACING 6 // Line spacing in big icon mode #define BIG_TEXT_SPACING 2 // Spacing between text and icon in big icon mode #define ITEM_SPACE 128 // Default space for item #define SELECT_MASK (ICONLIST_EXTENDEDSELECT|ICONLIST_SINGLESELECT|ICONLIST_BROWSESELECT|ICONLIST_MULTIPLESELECT) #define ICONLIST_MASK (SELECT_MASK|ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS|ICONLIST_COLUMNS|ICONLIST_AUTOSIZE) using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXIconItem,FXObject,NULL,0) // Draw item void FXIconItem::draw(const FXIconList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const { register FXuint options=list->getListStyle(); if(options&ICONLIST_BIG_ICONS) drawBigIcon(list,dc,x,y,w,h); else if(options&ICONLIST_MINI_ICONS) drawMiniIcon(list,dc,x,y,w,h); else drawDetails(list,dc,x,y,w,h); } // Draw big icon void FXIconItem::drawBigIcon(const FXIconList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const { register FXint len,dw,s,space,xt,yt,xi,yi; register FXFont *font=list->getFont(); register FXint iw=0,ih=0,tw=0,th=0,ss=0; space=w-SIDE_SPACING; if(!label.empty()){ for(len=0; lengetTextWidth(label.text(),len); th=4+font->getFontHeight(); yt=y+h-th-BIG_LINE_SPACING/2; dw=0; if(tw>space){ dw=font->getTextWidth("...",3); s=space-dw; while((tw=4+font->getTextWidth(label.text(),len))>s && len>1) len=label.dec(len); if(tw>s) dw=0; } if(tw<=space){ // FIXME as below in drawDetails xt=x+(w-tw-dw)/2; if(isSelected()){ dc.setForeground(list->getSelBackColor()); dc.fillRectangle(xt,yt,tw+dw,th); } if(!isEnabled()) dc.setForeground(makeShadowColor(list->getBackColor())); else if(isSelected()) dc.setForeground(list->getSelTextColor()); else dc.setForeground(list->getTextColor()); dc.drawText(xt+2,yt+font->getFontAscent()+2,label.text(),len); if(dw) dc.drawText(xt+tw-2,yt+font->getFontAscent()+2,"...",3); if(hasFocus()){ dc.drawFocusRectangle(xt+1,yt+1,tw+dw-2,th-2); } } ss=BIG_TEXT_SPACING; // Space between text and icon only added if we have both icon and text } if(bigIcon){ iw=bigIcon->getWidth(); ih=bigIcon->getHeight(); xi=x+(w-iw)/2; yi=y+BIG_LINE_SPACING/2+(h-th-BIG_LINE_SPACING-ss-ih)/2; if(isSelected()){ dc.drawIconShaded(bigIcon,xi,yi); } else{ dc.drawIcon(bigIcon,xi,yi); } } } // Draw mini icon void FXIconItem::drawMiniIcon(const FXIconList* list,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const { register FXFont *font=list->getFont(); register FXint iw=0,ih=0,tw=0,th=0; register FXint len,dw,s,space; x+=SIDE_SPACING/2; space=w-SIDE_SPACING; if(miniIcon){ iw=miniIcon->getWidth(); ih=miniIcon->getHeight(); if(isSelected()){ dc.drawIconShaded(miniIcon,x,y+(h-ih)/2); } else{ dc.drawIcon(miniIcon,x,y+(h-ih)/2); } x+=iw+MINI_TEXT_SPACING; space-=iw+MINI_TEXT_SPACING; } if(!label.empty()){ for(len=0; lengetTextWidth(label.text(),len); th=4+font->getFontHeight(); dw=font->getTextWidth("...",3); y+=(h-th)/2; dw=0; if(tw>space){ // FIXME as below in drawDetails dw=font->getTextWidth("...",3); s=space-dw; while((tw=4+font->getTextWidth(label.text(),len))>s && len>1) len=label.dec(len); if(tw>s) dw=0; } if(tw<=space){ if(isSelected()){ dc.setForeground(list->getSelBackColor()); dc.fillRectangle(x,y,tw+dw,th); } if(!isEnabled()) dc.setForeground(makeShadowColor(list->getBackColor())); else if(isSelected()) dc.setForeground(list->getSelTextColor()); else dc.setForeground(list->getTextColor()); dc.drawText(x+2,y+font->getFontAscent()+2,label.text(),len); if(dw) dc.drawText(x+tw-2,y+font->getFontAscent()+2,"...",3); if(hasFocus()){ dc.drawFocusRectangle(x+1,y+1,tw+dw-2,th-2); } } } } // Draw detail void FXIconItem::drawDetails(const FXIconList* list,FXDC& dc,FXint x,FXint y,FXint,FXint h) const { register FXHeader *header=list->getHeader(); register FXFont *font=list->getFont(); register FXint iw=0,ih=0,tw=0,th=0,yt,beg,end,hi,drw,space,used,dw,xx; if(header->getNumItems()==0) return; if(isSelected()){ dc.setForeground(list->getSelBackColor()); dc.fillRectangle(x,y,header->getTotalSize(),h); } if(hasFocus()){ dc.drawFocusRectangle(x+1,y+1,header->getTotalSize()-2,h-2); } xx=x+SIDE_SPACING/2; if(miniIcon){ iw=miniIcon->getWidth(); ih=miniIcon->getHeight(); dc.setClipRectangle(x,y,header->getItemSize(0),h); dc.drawIcon(miniIcon,xx,y+(h-ih)/2); dc.clearClipRectangle(); xx+=iw+DETAIL_TEXT_SPACING; } if(!label.empty()){ th=font->getFontHeight(); dw=font->getTextWidth("...",3); yt=y+(h-th-4)/2; if(!isEnabled()) dc.setForeground(makeShadowColor(list->getBackColor())); else if(isSelected()) dc.setForeground(list->getSelTextColor()); else dc.setForeground(list->getTextColor()); used=iw+DETAIL_TEXT_SPACING+SIDE_SPACING/2; for(hi=beg=0; beggetNumItems(); hi++,beg=end+1){ space=header->getItemSize(hi)-used; for(end=beg; endbeg){ drw=end-beg; tw=font->getTextWidth(&label[beg],drw); if(tw>space-4){ while((tw=font->getTextWidth(&label[beg],drw))+dw>space-4 && drw>1) drw=label.dec(drw); dc.setClipRectangle(xx,y,space,h); dc.drawText(xx+2,yt+font->getFontAscent()+2,&label[beg],drw); dc.drawText(xx+tw+2,yt+font->getFontAscent()+2,"...",3); dc.clearClipRectangle(); } else{ dc.drawText(xx+2,yt+font->getFontAscent()+2,&label[beg],drw); } } xx+=space; used=0; } } } // See if item got hit and where: 0 is outside, 1 is icon, 2 is text FXint FXIconItem::hitItem(const FXIconList* list,FXint rx,FXint ry,FXint rw,FXint rh) const { register FXint iw=0,tw=0,ih=0,th=0,ss=0,ix,iy,tx,ty,w,h,sp,tlen; register FXuint options=list->getListStyle(); register FXFont *font=list->getFont(); for(tlen=0; tlengetItemSpace(); h=list->getItemHeight(); sp=w-SIDE_SPACING; if(!label.empty()){ tw=4+font->getTextWidth(label.text(),tlen); th=4+font->getFontHeight(); if(tw>sp) tw=sp; if(bigIcon) ss=BIG_TEXT_SPACING; } if(bigIcon){ iw=bigIcon->getWidth(); ih=bigIcon->getHeight(); } ty=h-th-BIG_LINE_SPACING/2; iy=BIG_LINE_SPACING/2+(h-th-BIG_LINE_SPACING-ss-ih)/2; ix=(w-iw)/2; tx=(w-tw)/2; } else if(options&ICONLIST_MINI_ICONS){ sp=list->getItemSpace()-SIDE_SPACING; ix=SIDE_SPACING/2; tx=SIDE_SPACING/2; if(miniIcon){ iw=miniIcon->getWidth(); ih=miniIcon->getHeight(); tx+=iw+MINI_TEXT_SPACING; sp=sp-iw-MINI_TEXT_SPACING; } if(!label.empty()){ tw=4+font->getTextWidth(label.text(),tlen); th=4+font->getFontHeight(); if(tw>sp) tw=sp; } h=list->getItemHeight(); iy=(h-ih)/2; ty=(h-th)/2; } else{ ix=SIDE_SPACING/2; tx=SIDE_SPACING/2; if(miniIcon){ iw=miniIcon->getWidth(); ih=miniIcon->getHeight(); tx+=iw+DETAIL_TEXT_SPACING; } if(!label.empty()){ tw=10000000; th=4+font->getFontHeight(); } h=list->getItemHeight(); iy=(h-ih)/2; ty=(h-th)/2; } // In icon? if(ix<=rx+rw && iy<=ry+rh && rxcreate(); if(miniIcon) miniIcon->create(); } // Destroy icon void FXIconItem::destroy(){ if((state&BIGICONOWNED) && bigIcon) bigIcon->destroy(); if((state&MINIICONOWNED) && miniIcon) miniIcon->destroy(); } // Detach from icon resource void FXIconItem::detach(){ if(bigIcon) bigIcon->detach(); if(miniIcon) miniIcon->detach(); } // Get item width FXint FXIconItem::getWidth(const FXIconList* list) const { register FXuint options=list->getListStyle(); register FXFont *font=list->getFont(); register FXint iw=0,tw=0,w=0,tlen; for(tlen=0; tlengetWidth(); if(!label.empty()) tw=4+font->getTextWidth(label.text(),tlen); w=SIDE_SPACING+FXMAX(tw,iw); } else if(options&ICONLIST_MINI_ICONS){ if(miniIcon) iw=miniIcon->getWidth(); if(!label.empty()) tw=4+font->getTextWidth(label.text(),tlen); if(iw && tw) iw+=MINI_TEXT_SPACING; w=SIDE_SPACING+iw+tw; } else{ w=SIDE_SPACING; } return w; } // Get item height FXint FXIconItem::getHeight(const FXIconList* list) const { register FXuint options=list->getListStyle(); register FXint ih=0,th=0,h=0; if(options&ICONLIST_BIG_ICONS){ if(bigIcon) ih=bigIcon->getHeight(); if(!label.empty()) th=4+list->getFont()->getFontHeight(); if(ih && th) ih+=BIG_TEXT_SPACING; h=BIG_LINE_SPACING+ih+th; } else if(options&ICONLIST_MINI_ICONS){ if(miniIcon) ih=miniIcon->getHeight(); if(!label.empty()) th=4+list->getFont()->getFontHeight(); h=FXMAX(ih,th); } else{ if(miniIcon) ih=miniIcon->getHeight(); if(!label.empty()) th=4+list->getFont()->getFontHeight(); h=FXMAX(ih,th); } return h; } // Save data void FXIconItem::save(FXStream& store) const { FXObject::save(store); store << label; store << bigIcon; store << miniIcon; store << state; } // Load data void FXIconItem::load(FXStream& store){ FXObject::load(store); store >> label; store >> bigIcon; store >> miniIcon; store >> state; } // Delete icons if owned FXIconItem::~FXIconItem(){ if(state&BIGICONOWNED) delete bigIcon; if(state&MINIICONOWNED) delete miniIcon; bigIcon=(FXIcon*)-1L; miniIcon=(FXIcon*)-1L; } /*******************************************************************************/ // Map FXDEFMAP(FXIconList) FXIconListMap[]={ FXMAPFUNC(SEL_PAINT,0,FXIconList::onPaint), FXMAPFUNC(SEL_MOTION,0,FXIconList::onMotion), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXIconList::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXIconList::onLeftBtnRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXIconList::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXIconList::onRightBtnRelease), FXMAPFUNC(SEL_TIMEOUT,FXWindow::ID_AUTOSCROLL,FXIconList::onAutoScroll), FXMAPFUNC(SEL_TIMEOUT,FXIconList::ID_TIPTIMER,FXIconList::onTipTimer), FXMAPFUNC(SEL_TIMEOUT,FXIconList::ID_LOOKUPTIMER,FXIconList::onLookupTimer), FXMAPFUNC(SEL_UNGRABBED,0,FXIconList::onUngrabbed), FXMAPFUNC(SEL_KEYPRESS,0,FXIconList::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXIconList::onKeyRelease), FXMAPFUNC(SEL_ENTER,0,FXIconList::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXIconList::onLeave), FXMAPFUNC(SEL_FOCUSIN,0,FXIconList::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXIconList::onFocusOut), FXMAPFUNC(SEL_CLICKED,0,FXIconList::onClicked), FXMAPFUNC(SEL_DOUBLECLICKED,0,FXIconList::onDoubleClicked), FXMAPFUNC(SEL_TRIPLECLICKED,0,FXIconList::onTripleClicked), FXMAPFUNC(SEL_COMMAND,0,FXIconList::onCommand), FXMAPFUNC(SEL_QUERY_TIP,0,FXIconList::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXIconList::onQueryHelp), FXMAPFUNC(SEL_CHANGED,FXIconList::ID_HEADER_CHANGE,FXIconList::onHeaderChanged), FXMAPFUNC(SEL_CLICKED,FXIconList::ID_HEADER_CHANGE,FXIconList::onHeaderResize), FXMAPFUNC(SEL_UPDATE,FXIconList::ID_SHOW_DETAILS,FXIconList::onUpdShowDetails), FXMAPFUNC(SEL_UPDATE,FXIconList::ID_SHOW_MINI_ICONS,FXIconList::onUpdShowMiniIcons), FXMAPFUNC(SEL_UPDATE,FXIconList::ID_SHOW_BIG_ICONS,FXIconList::onUpdShowBigIcons), FXMAPFUNC(SEL_UPDATE,FXIconList::ID_ARRANGE_BY_ROWS,FXIconList::onUpdArrangeByRows), FXMAPFUNC(SEL_UPDATE,FXIconList::ID_ARRANGE_BY_COLUMNS,FXIconList::onUpdArrangeByColumns), FXMAPFUNC(SEL_COMMAND,FXIconList::ID_SHOW_DETAILS,FXIconList::onCmdShowDetails), FXMAPFUNC(SEL_COMMAND,FXIconList::ID_SHOW_MINI_ICONS,FXIconList::onCmdShowMiniIcons), FXMAPFUNC(SEL_COMMAND,FXIconList::ID_SHOW_BIG_ICONS,FXIconList::onCmdShowBigIcons), FXMAPFUNC(SEL_COMMAND,FXIconList::ID_ARRANGE_BY_ROWS,FXIconList::onCmdArrangeByRows), FXMAPFUNC(SEL_COMMAND,FXIconList::ID_ARRANGE_BY_COLUMNS,FXIconList::onCmdArrangeByColumns), FXMAPFUNC(SEL_COMMAND,FXIconList::ID_SELECT_ALL,FXIconList::onCmdSelectAll), FXMAPFUNC(SEL_COMMAND,FXIconList::ID_DESELECT_ALL,FXIconList::onCmdDeselectAll), FXMAPFUNC(SEL_COMMAND,FXIconList::ID_SELECT_INVERSE,FXIconList::onCmdSelectInverse), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXIconList::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETINTVALUE,FXIconList::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETINTVALUE,FXIconList::onCmdGetIntValue), }; // Object implementation FXIMPLEMENT(FXIconList,FXScrollArea,FXIconListMap,ARRAYNUMBER(FXIconListMap)) /*******************************************************************************/ // Serialization FXIconList::FXIconList(){ flags|=FLAG_ENABLED; header=(FXHeader*)-1L; nrows=1; ncols=1; anchor=-1; current=-1; extent=-1; cursor=-1; viewable=-1; font=(FXFont*)-1L; sortfunc=NULL; textColor=0; selbackColor=0; seltextColor=0; itemSpace=ITEM_SPACE; itemWidth=1; itemHeight=1; anchorx=0; anchory=0; currentx=0; currenty=0; grabx=0; graby=0; state=FALSE; } // Icon List FXIconList::FXIconList(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXScrollArea(p,opts,x,y,w,h){ flags|=FLAG_ENABLED; header=new FXHeader(this,this,FXIconList::ID_HEADER_CHANGE,HEADER_TRACKING|HEADER_BUTTON|HEADER_RESIZE|FRAME_RAISED|FRAME_THICK); target=tgt; message=sel; nrows=1; ncols=1; anchor=-1; current=-1; extent=-1; cursor=-1; viewable=-1; font=getApp()->getNormalFont(); sortfunc=NULL; textColor=getApp()->getForeColor(); selbackColor=getApp()->getSelbackColor(); seltextColor=getApp()->getSelforeColor(); itemSpace=ITEM_SPACE; itemWidth=1; itemHeight=1; anchorx=0; anchory=0; currentx=0; currenty=0; grabx=0; graby=0; state=FALSE; } // Create window void FXIconList::create(){ register FXint i; FXScrollArea::create(); for(i=0; icreate();} font->create(); } // Detach window void FXIconList::detach(){ register FXint i; FXScrollArea::detach(); for(i=0; idetach();} font->detach(); } // If window can have focus bool FXIconList::canFocus() const { return true; } // Into focus chain void FXIconList::setFocus(){ FXScrollArea::setFocus(); setDefault(TRUE); } // Out of focus chain void FXIconList::killFocus(){ FXScrollArea::killFocus(); setDefault(MAYBE); } // Move content void FXIconList::moveContents(FXint x,FXint y){ FXint dx=x-pos_x; FXint dy=y-pos_y; FXint top=0; pos_x=x; pos_y=y; if(!(options&(ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS))){ top=header->getDefaultHeight(); header->setPosition(x); } scroll(0,top,viewport_w,viewport_h,dx,dy); } // Propagate size change void FXIconList::recalc(){ FXScrollArea::recalc(); flags|=FLAG_RECALC; cursor=-1; } // Recompute interior void FXIconList::recompute(){ register FXint w,h,i; itemWidth=1; itemHeight=1; // Measure the items for(i=0; igetWidth(this); h=items[i]->getHeight(this); if(w>itemWidth) itemWidth=w; if(h>itemHeight) itemHeight=h; } // Automatically size item spacing if(options&ICONLIST_AUTOSIZE) itemSpace=FXMAX(itemWidth,1); // Adjust for detail mode if(!(options&(ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS))) itemWidth=header->getDefaultWidth(); // Get number of rows or columns getrowscols(nrows,ncols,width,height); //FXTRACE((100,"%s::recompute: itemWidth=%d itemHeight=%d nrows=%d ncols=%d\n",getClassName(),itemWidth,itemHeight,nrows,ncols)); // Done flags&=~FLAG_RECALC; } // Determine number of columns and number of rows void FXIconList::getrowscols(FXint& nr,FXint& nc,FXint w,FXint h) const { if(options&(ICONLIST_BIG_ICONS|ICONLIST_MINI_ICONS)){ if(options&ICONLIST_COLUMNS){ nc=w/itemSpace; if(nc<1) nc=1; nr=(items.no()+nc-1)/nc; if(nr*itemHeight > h){ nc=(w-vertical->getDefaultWidth())/itemSpace; if(nc<1) nc=1; nr=(items.no()+nc-1)/nc; } if(nr<1) nr=1; } else{ nr=h/itemHeight; if(nr<1) nr=1; nc=(items.no()+nr-1)/nr; if(nc*itemSpace > w){ nr=(h-horizontal->getDefaultHeight())/itemHeight; if(nr<1) nr=1; nc=(items.no()+nr-1)/nr; } if(nc<1) nc=1; } } else{ nr=items.no(); nc=1; } } // Size of a possible column caption FXint FXIconList::getViewportHeight(){ return (options&(ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS)) ? height : height-header->getDefaultHeight(); } // Determine content width of icon list FXint FXIconList::getContentWidth(){ if(flags&FLAG_RECALC) recompute(); if(options&(ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS)) return ncols*itemSpace; return header->getDefaultWidth(); } // Determine content height of icon list FXint FXIconList::getContentHeight(){ if(flags&FLAG_RECALC) recompute(); return nrows*itemHeight; } // Recalculate layout void FXIconList::layout(){ // Update scroll bars FXScrollArea::layout(); // In detail mode if(!(options&(ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS))){ header->position(0,0,viewport_w,header->getDefaultHeight()); header->show(); } else{ header->hide(); } // Set line size vertical->setLine(itemHeight); horizontal->setLine(itemSpace); // We were supposed to make this item viewable if(0<=viewable){ makeItemVisible(viewable); } // Force repaint update(); flags&=~FLAG_DIRTY; } // Changed size:- this is a bit tricky, because // we don't want to re-measure the items, but the content // size has changed because the number of rows/columns has... void FXIconList::resize(FXint w,FXint h){ FXint nr=nrows; FXint nc=ncols; if(w!=width || h!=height){ getrowscols(nrows,ncols,w,h); if(nr!=nrows || nc!=ncols) update(); } //FXTRACE((100,"%s::resize: nrows=%d ncols=%d\n",getClassName(),nrows,ncols)); FXScrollArea::resize(w,h); } // Changed size and/or pos:- this is a bit tricky, because // we don't want to re-measure the items, but the content // size has changed because the number of rows/columns has... void FXIconList::position(FXint x,FXint y,FXint w,FXint h){ FXint nr=nrows; FXint nc=ncols; if(w!=width || h!=height){ getrowscols(nrows,ncols,w,h); if(nr!=nrows || nc!=ncols) update(); } //FXTRACE((100,"%s::position: nrows=%d ncols=%d\n",getClassName(),nrows,ncols)); FXScrollArea::position(x,y,w,h); } // Header subdivision has changed:- this is a bit tricky, // we want to update the content size w/o re-measuring the items... long FXIconList::onHeaderChanged(FXObject*,FXSelector,void*){ flags&=~FLAG_RECALC; return 1; } // Header subdivision resize has been requested; // we want to set the width of the header column // to that of the widest item. long FXIconList::onHeaderResize(FXObject*,FXSelector,void* ptr){ register FXint hi=(FXint)(FXival)ptr; register FXint i,iw,tw,w,nw=0; FXString text; // For detailed icon list if(!(options&(ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS))){ for(i=0; iminiIcon){ iw=items[i]->miniIcon->getWidth(); w+=iw+DETAIL_TEXT_SPACING+SIDE_SPACING/2; } } // Measure section of text text=items[i]->label.section('\t',hi); if(!text.empty()){ tw=font->getTextWidth(text.text(),text.length()); w+=tw+SIDE_SPACING+2; } // Keep the max if(w>nw) nw=w; } // Set new header width if(nw>0 && nw!=header->getItemSize(hi)){ header->setItemSize(hi,nw); flags&=~FLAG_RECALC; } } return 1; } // Set headers from array of strings void FXIconList::setHeaders(const FXchar** strings,FXint size){ header->clearItems(); header->fillItems(strings,NULL,size); } // Set headers from newline separated strings void FXIconList::setHeaders(const FXString& strings,FXint size){ header->clearItems(); header->fillItems(strings,NULL,size); } // Append header caption void FXIconList::appendHeader(const FXString& text,FXIcon *icon,FXint size){ header->appendItem(text,icon,size); } // Remove header caption void FXIconList::removeHeader(FXint index){ if(index<0 || header->getNumItems()<=index){ fxerror("%s::removeHeader: index out of range.\n",getClassName()); } header->removeItem(index); } // Change header caption void FXIconList::setHeaderText(FXint index,const FXString& text){ if(index<0 || header->getNumItems()<=index){ fxerror("%s::setHeaderText: index out of range.\n",getClassName()); } header->setItemText(index,text); } // Get header caption FXString FXIconList::getHeaderText(FXint index) const { if(index<0 || header->getNumItems()<=index){ fxerror("%s::getHeaderText: index out of range.\n",getClassName()); } return header->getItemText(index); } // Change header icon void FXIconList::setHeaderIcon(FXint index,FXIcon *icon){ if(index<0 || header->getNumItems()<=index){ fxerror("%s::setHeaderIcon: index out of range.\n",getClassName()); } header->setItemIcon(index,icon); } // Get header icon FXIcon* FXIconList::getHeaderIcon(FXint index) const { if(index<0 || header->getNumItems()<=index){ fxerror("%s::getHeaderIcon: index out of range.\n",getClassName()); } return header->getItemIcon(index); } // Change header size void FXIconList::setHeaderSize(FXint index,FXint size){ if(index<0 || header->getNumItems()<=index){ fxerror("%s::setHeaderSize: index out of range.\n",getClassName()); } header->setItemSize(index,size); } // Get header size FXint FXIconList::getHeaderSize(FXint index) const { if(index<0 || header->getNumItems()<=index){ fxerror("%s::getHeaderSize: index out of range.\n",getClassName()); } return header->getItemSize(index); } // Return number of headers FXint FXIconList::getNumHeaders() const { return header->getNumItems(); } // Change item text void FXIconList::setItemText(FXint index,const FXString& text){ if(index<0 || items.no()<=index){ fxerror("%s::setItemText: index out of range.\n",getClassName()); } if(items[index]->getText()!=text){ items[index]->setText(text); recalc(); } } // Get item text FXString FXIconList::getItemText(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemText: index out of range.\n",getClassName()); } return items[index]->getText(); } // Set item icon void FXIconList::setItemBigIcon(FXint index,FXIcon* icon,FXbool owned){ if(index<0 || items.no()<=index){ fxerror("%s::setItemBigIcon: index out of range.\n",getClassName()); } if(items[index]->getBigIcon()!=icon) recalc(); items[index]->setBigIcon(icon,owned); } // Get item icon FXIcon* FXIconList::getItemBigIcon(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemBigIcon: index out of range.\n",getClassName()); } return items[index]->getBigIcon(); } // Set item icon void FXIconList::setItemMiniIcon(FXint index,FXIcon* icon,FXbool owned){ if(index<0 || items.no()<=index){ fxerror("%s::setItemMiniIcon: index out of range.\n",getClassName()); } if(items[index]->getMiniIcon()!=icon) recalc(); items[index]->setMiniIcon(icon,owned); } // Get item icon FXIcon* FXIconList::getItemMiniIcon(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemMiniIcon: index out of range.\n",getClassName()); } return items[index]->getMiniIcon(); } // Set item data void FXIconList::setItemData(FXint index,void* ptr){ if(index<0 || items.no()<=index){ fxerror("%s::setItemData: index out of range.\n",getClassName()); } items[index]->setData(ptr); } // Get item data void* FXIconList::getItemData(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemData: index out of range.\n",getClassName()); } return items[index]->getData(); } // True if item is selected FXbool FXIconList::isItemSelected(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::isItemSelected: index out of range.\n",getClassName()); } return items[index]->isSelected(); } // True if item is current FXbool FXIconList::isItemCurrent(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::isItemCurrent: index out of range.\n",getClassName()); } return index==current; } // True if item is enabled FXbool FXIconList::isItemEnabled(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::isItemEnabled: index out of range.\n",getClassName()); } return items[index]->isEnabled(); } // True if item (partially) visible FXbool FXIconList::isItemVisible(FXint index) const { register FXbool vis=FALSE; register FXint x,y,hh; if(index<0 || items.no()<=index){ fxerror("%s::isItemVisible: index out of range.\n",getClassName()); } if(options&(ICONLIST_BIG_ICONS|ICONLIST_MINI_ICONS)){ if(options&ICONLIST_COLUMNS){ FXASSERT(ncols>0); x=pos_x+itemSpace*(index%ncols); y=pos_y+itemHeight*(index/ncols); } else{ FXASSERT(nrows>0); x=pos_x+itemSpace*(index/nrows); y=pos_y+itemHeight*(index%nrows); } if(0getDefaultHeight(); y=pos_y+hh+index*itemHeight; if(hh0); x=itemSpace*(index%ncols); y=itemHeight*(index/ncols); } else{ FXASSERT(nrows>0); x=itemSpace*(index/nrows); y=itemHeight*(index%nrows); } if(px+x+itemSpace >= viewport_w) px=viewport_w-x-itemSpace; if(px+x <= 0) px=-x; if(py+y+itemHeight >= viewport_h) py=viewport_h-y-itemHeight; if(py+y <= 0) py=-y; } // Showing list view else{ hh=header->getDefaultHeight(); y=hh+index*itemHeight; if(py+y+itemHeight >= viewport_h+hh) py=hh+viewport_h-y-itemHeight; if(py+y <= hh) py=hh-y; } // Scroll into view setPosition(px,py); // Done it viewable=-1; } } } // Get item at position x,y FXint FXIconList::getItemAt(FXint x,FXint y) const { register FXint ix,iy; register FXint r,c,index; y-=pos_y; x-=pos_x; if(options&(ICONLIST_BIG_ICONS|ICONLIST_MINI_ICONS)){ c=x/itemSpace; r=y/itemHeight; if(c<0 || c>=ncols || r<0 || r>=nrows) return -1; index=(options&ICONLIST_COLUMNS) ? ncols*r+c : nrows*c+r; if(index<0 || index>=items.no()) return -1; ix=itemSpace*c; iy=itemHeight*r; if(items[index]->hitItem(this,x-ix,y-iy)==0) return -1; } else{ y-=header->getDefaultHeight(); c=0; index=y/itemHeight; if(index<0 || index>=items.no()) return -1; } return index; } // Compare strings up to n static FXint comp(const FXString& s1,const FXString& s2,FXint n){ register const FXuchar *p1=(const FXuchar *)s1.text(); register const FXuchar *p2=(const FXuchar *)s2.text(); register FXint c1,c2; if(0getText(),text,len)==0) return index; } if(!(flgs&SEARCH_WRAP)) return -1; for(index=items.no()-1; startgetText(),text,len)==0) return index; } } else{ if(start<0) start=0; for(index=start; indexgetText(),text,len)==0) return index; } if(!(flgs&SEARCH_WRAP)) return -1; for(index=0; indexgetText(),text,len)==0) return index; } } } return -1; } // Get item by data FXint FXIconList::findItemByData(const void *ptr,FXint start,FXuint flgs) const { register FXint index; if(0getData()==ptr) return index; } if(!(flgs&SEARCH_WRAP)) return -1; for(index=items.no()-1; startgetData()==ptr) return index; } } else{ if(start<0) start=0; for(index=start; indexgetData()==ptr) return index; } if(!(flgs&SEARCH_WRAP)) return -1; for(index=0; indexgetData()==ptr) return index; } } } return -1; } // Did we hit the item, and which part of it did we hit FXint FXIconList::hitItem(FXint index,FXint x,FXint y,FXint ww,FXint hh) const { FXint ix,iy,r,c,hit=0; if(0<=index && indexgetDefaultHeight(); if(options&(ICONLIST_BIG_ICONS|ICONLIST_MINI_ICONS)){ if(options&ICONLIST_COLUMNS){ r=index/ncols; c=index%ncols; } else{ c=index/nrows; r=index%nrows; } } else{ r=index; c=0; } ix=itemSpace*c; iy=itemHeight*r; hit=items[index]->hitItem(this,x-ix,y-iy,ww,hh); } return hit; } // Repaint void FXIconList::updateItem(FXint index) const { if(xid && 0<=index && index0); update(pos_x+itemSpace*(index%ncols),pos_y+itemHeight*(index/ncols),itemSpace,itemHeight); } else{ FXASSERT(nrows>0); update(pos_x+itemSpace*(index/nrows),pos_y+itemHeight*(index%nrows),itemSpace,itemHeight); } } else{ update(0,pos_y+header->getDefaultHeight()+index*itemHeight,width,itemHeight); } } } // Enable one item FXbool FXIconList::enableItem(FXint index){ if(index<0 || items.no()<=index){ fxerror("%s::enableItem: index out of range.\n",getClassName()); } if(!items[index]->isEnabled()){ items[index]->setEnabled(TRUE); updateItem(index); return TRUE; } return FALSE; } // Disable one item FXbool FXIconList::disableItem(FXint index){ if(index<0 || items.no()<=index){ fxerror("%s::disableItem: index out of range.\n",getClassName()); } if(items[index]->isEnabled()){ items[index]->setEnabled(FALSE); updateItem(index); return TRUE; } return FALSE; } // Select one item FXbool FXIconList::selectItem(FXint index,FXbool notify){ if(index<0 || items.no()<=index){ fxerror("%s::selectItem: index out of range.\n",getClassName()); } if(!items[index]->isSelected()){ switch(options&SELECT_MASK){ case ICONLIST_SINGLESELECT: case ICONLIST_BROWSESELECT: killSelection(notify); case ICONLIST_EXTENDEDSELECT: case ICONLIST_MULTIPLESELECT: items[index]->setSelected(TRUE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)index);} break; } return TRUE; } return FALSE; } // Deselect one item FXbool FXIconList::deselectItem(FXint index,FXbool notify){ if(index<0 || items.no()<=index){ fxerror("%s::deselectItem: index out of range.\n",getClassName()); } if(items[index]->isSelected()){ switch(options&SELECT_MASK){ case ICONLIST_EXTENDEDSELECT: case ICONLIST_MULTIPLESELECT: case ICONLIST_SINGLESELECT: items[index]->setSelected(FALSE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)index);} break; } return TRUE; } return FALSE; } // Toggle one item FXbool FXIconList::toggleItem(FXint index,FXbool notify){ if(index<0 || items.no()<=index){ fxerror("%s::toggleItem: index out of range.\n",getClassName()); } switch(options&SELECT_MASK){ case ICONLIST_BROWSESELECT: if(!items[index]->isSelected()){ killSelection(notify); items[index]->setSelected(TRUE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)index);} } break; case ICONLIST_SINGLESELECT: if(!items[index]->isSelected()){ killSelection(notify); items[index]->setSelected(TRUE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)index);} } else{ items[index]->setSelected(FALSE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)index);} } break; case ICONLIST_EXTENDEDSELECT: case ICONLIST_MULTIPLESELECT: if(!items[index]->isSelected()){ items[index]->setSelected(TRUE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)index);} } else{ items[index]->setSelected(FALSE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)index);} } break; } return TRUE; } // Select items in rectangle FXbool FXIconList::selectInRectangle(FXint x,FXint y,FXint w,FXint h,FXbool notify){ register FXint r,c,index; register FXbool changed=FALSE; if(options&(ICONLIST_BIG_ICONS|ICONLIST_MINI_ICONS)){ for(r=0; risSelected()){ items[i]->setSelected(TRUE); updateItem(i); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)i);} } } // extent===anchor---item // extent===item-----anchor else if(i1==extent){ if(items[i]->isSelected()){ items[i]->setSelected(FALSE); updateItem(i); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)i);} } } } // Second segment for(i=i2+1; i<=i3; i++){ // extent---anchor===item // anchor---extent===item if(i3==index){ if(!items[i]->isSelected()){ items[i]->setSelected(TRUE); updateItem(i); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)i);} } } // item-----anchor===extent // anchor---item=====extent else if(i3==extent){ if(items[i]->isSelected()){ items[i]->setSelected(FALSE); updateItem(i); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)i);} } } } extent=index; } return changes; } // Kill selection FXbool FXIconList::killSelection(FXbool notify){ register FXbool changes=FALSE; register FXint i; for(i=0; iisSelected()){ items[i]->setSelected(FALSE); updateItem(i); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)i);} } } return changes; } // Lasso changed, so select/unselect items based on difference between new and old lasso box void FXIconList::lassoChanged(FXint ox,FXint oy,FXint ow,FXint oh,FXint nx,FXint ny,FXint nw,FXint nh,FXbool notify){ register FXint r,c; FXint ohit,nhit,index; if(options&(ICONLIST_BIG_ICONS|ICONLIST_MINI_ICONS)){ for(r=0; raddTimeout(this,ID_TIPTIMER,getApp()->getMenuPause()); cursor=-1; return 1; } // Stop motion timer when leaving window long FXIconList::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onLeave(sender,sel,ptr); getApp()->removeTimeout(this,ID_TIPTIMER); cursor=-1; return 1; } // We timed out, i.e. the user didn't move for a while long FXIconList::onTipTimer(FXObject*,FXSelector,void*){ FXTRACE((250,"%s::onTipTimer %p\n",getClassName(),this)); flags|=FLAG_TIP; return 1; } // We were asked about tip text long FXIconList::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && (0<=cursor)){ FXString string=items[cursor]->getText().section('\t',0); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&string); return 1; } return 0; } // We were asked about status text long FXIconList::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Gained focus long FXIconList::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onFocusIn(sender,sel,ptr); if(0<=current){ FXASSERT(currentsetFocus(TRUE); updateItem(current); } return 1; } // Lost focus long FXIconList::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onFocusOut(sender,sel,ptr); if(0<=current){ FXASSERT(currentsetFocus(FALSE); updateItem(current); } return 1; } // Draw item list long FXIconList::onPaint(FXObject*,FXSelector,void* ptr){ register FXint rlo,rhi,clo,chi,yy,xx; register FXint x,y,r,c,index; FXEvent* event=(FXEvent*)ptr; FXDCWindow dc(this,event); // Set font dc.setFont(font); // Icon mode if(options&(ICONLIST_BIG_ICONS|ICONLIST_MINI_ICONS)){ // Exposed rows rlo=(event->rect.y-pos_y)/itemHeight; rhi=(event->rect.y+event->rect.h-pos_y)/itemHeight; if(rlo<0) rlo=0; if(rhi>=nrows) rhi=nrows-1; // Exposed columns clo=(event->rect.x-pos_x)/itemSpace; chi=(event->rect.x+event->rect.w-pos_x)/itemSpace; if(clo<0) clo=0; if(chi>=ncols) chi=ncols-1; // Big Icons if(options&ICONLIST_BIG_ICONS){ for(r=rlo; r<=rhi; r++){ y=pos_y+r*itemHeight; for(c=clo; c<=chi; c++){ x=pos_x+c*itemSpace; index=(options&ICONLIST_COLUMNS) ? ncols*r+c : nrows*c+r; dc.setForeground(backColor); dc.fillRectangle(x,y,itemSpace,itemHeight); if(indexdraw(this,dc,x,y,itemSpace,itemHeight); } } } } // Mini icons else{ for(r=rlo; r<=rhi; r++){ y=pos_y+r*itemHeight; for(c=clo; c<=chi; c++){ x=pos_x+c*itemSpace; index=(options&ICONLIST_COLUMNS) ? ncols*r+c : nrows*c+r; dc.setForeground(backColor); dc.fillRectangle(x,y,itemSpace,itemHeight); if(indexdraw(this,dc,x,y,itemSpace,itemHeight); } } } } // Repaint left-over background yy=(rhi+1)*itemHeight; if(yyrect.y+event->rect.h){ dc.setForeground(backColor); dc.fillRectangle(event->rect.x,yy,event->rect.w,event->rect.y+event->rect.h-yy); } xx=(chi+1)*itemSpace; if(xxrect.x+event->rect.w){ dc.setForeground(backColor); dc.fillRectangle(xx,event->rect.y,event->rect.x+event->rect.w-xx,event->rect.h); } } // Detail mode else{ // Exposed rows rlo=(event->rect.y-pos_y-header->getDefaultHeight())/itemHeight; rhi=(event->rect.y+event->rect.h-pos_y-header->getDefaultHeight())/itemHeight; if(rlo<0) rlo=0; if(rhi>=items.no()) rhi=items.no()-1; // Repaint the items y=pos_y+rlo*itemHeight+header->getDefaultHeight(); for(index=rlo; index<=rhi; index++,y+=itemHeight){ dc.setForeground(backColor); dc.fillRectangle(0,y,width,itemHeight); items[index]->draw(this,dc,pos_x,y,width,itemHeight); } // Repaint left-over background if(yrect.y+event->rect.h){ dc.setForeground(backColor); dc.fillRectangle(event->rect.x,y,event->rect.w,event->rect.y+event->rect.h-y); } } return 1; } // Draw Lasso rectangle void FXIconList::drawLasso(FXint x0,FXint y0,FXint x1,FXint y1){ FXDCWindow dc(this); dc.setFunction(BLT_NOT_DST); x0+=pos_x; x1+=pos_x; y0+=pos_y; y1+=pos_y; dc.drawLine(x0,y0,x1,y0); dc.drawLine(x1,y0,x1,y1); dc.drawLine(x1,y1,x0,y1); dc.drawLine(x0,y1,x0,y0); } // Arrange by rows long FXIconList::onCmdArrangeByRows(FXObject*,FXSelector,void*){ options&=~ICONLIST_COLUMNS; recalc(); return 1; } // Update sender long FXIconList::onUpdArrangeByRows(FXObject* sender,FXSelector,void*){ sender->handle(this,(options&ICONLIST_COLUMNS)?FXSEL(SEL_COMMAND,ID_UNCHECK):FXSEL(SEL_COMMAND,ID_CHECK),NULL); sender->handle(this,(options&(ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS))?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Arrange by columns long FXIconList::onCmdArrangeByColumns(FXObject*,FXSelector,void*){ options|=ICONLIST_COLUMNS; recalc(); return 1; } // Update sender long FXIconList::onUpdArrangeByColumns(FXObject* sender,FXSelector,void*){ sender->handle(this,(options&ICONLIST_COLUMNS)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); sender->handle(this,(options&(ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS))?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Show detailed list long FXIconList::onCmdShowDetails(FXObject*,FXSelector,void*){ options&=~ICONLIST_MINI_ICONS; options&=~ICONLIST_BIG_ICONS; recalc(); return 1; } // Update sender long FXIconList::onUpdShowDetails(FXObject* sender,FXSelector,void*){ sender->handle(this,(options&(ICONLIST_MINI_ICONS|ICONLIST_BIG_ICONS))?FXSEL(SEL_COMMAND,ID_UNCHECK):FXSEL(SEL_COMMAND,ID_CHECK),NULL); return 1; } // Show big icons long FXIconList::onCmdShowBigIcons(FXObject*,FXSelector,void*){ options&=~ICONLIST_MINI_ICONS; options|=ICONLIST_BIG_ICONS; recalc(); return 1; } // Update sender long FXIconList::onUpdShowBigIcons(FXObject* sender,FXSelector,void*){ sender->handle(this,(options&ICONLIST_BIG_ICONS)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Show small icons long FXIconList::onCmdShowMiniIcons(FXObject*,FXSelector,void*){ options|=ICONLIST_MINI_ICONS; options&=~ICONLIST_BIG_ICONS; recalc(); return 1; } // Update sender long FXIconList::onUpdShowMiniIcons(FXObject* sender,FXSelector,void*){ sender->handle(this,(options&ICONLIST_MINI_ICONS)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Select all items long FXIconList::onCmdSelectAll(FXObject*,FXSelector,void*){ for(int i=0; igetText().text(),b->getText().text(),0); } // Sort items in descending order FXint FXIconList::descending(const FXIconItem* a,const FXIconItem* b){ return compareSection(b->getText().text(),a->getText().text(),0); } // Sort items in ascending order, case insensitive FXint FXIconList::ascendingCase(const FXIconItem* a,const FXIconItem* b){ return compareSectionCase(a->getText().text(),b->getText().text(),0); } // Sort items in descending order, case insensitive FXint FXIconList::descendingCase(const FXIconItem* a,const FXIconItem* b){ return compareSectionCase(b->getText().text(),a->getText().text(),0); } // Sort the items based on the sort function void FXIconList::sortItems(){ register FXIconItem *v,*c=0; register FXbool exch=FALSE; register FXint i,j,h; if(sortfunc){ if(0<=current){ c=items[current]; } for(h=1; h<=items.no()/9; h=3*h+1); for(; h>0; h/=3){ for(i=h+1;i<=items.no();i++){ v=items[i-1]; j=i; while(j>h && sortfunc(items[j-h-1],v)>0){ items[j-1]=items[j-h-1]; exch=TRUE; j-=h; } items[j-1]=v; } } if(0<=current){ for(i=0; isetFocus(FALSE); updateItem(current); } } current=index; // Activate new item if(0<=current){ // No visible change if it doen't have the focus if(hasFocus()){ items[current]->setFocus(TRUE); updateItem(current); } } // Notify item change if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)current);} } // In browse selection mode, select item if((options&SELECT_MASK)==ICONLIST_BROWSESELECT && 0<=current && items[current]->isEnabled()){ selectItem(current,notify); } } // Set anchor item void FXIconList::setAnchorItem(FXint index){ if(index<-1 || items.no()<=index){ fxerror("%s::setAnchorItem: index out of range.\n",getClassName()); } anchor=index; extent=index; } // Zero out lookup string long FXIconList::onLookupTimer(FXObject*,FXSelector,void*){ lookup=FXString::null; return 1; } // Key Press long FXIconList::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint index=current; flags&=~FLAG_TIP; if(!isEnabled()) return 0; if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; switch(event->code){ case KEY_Control_L: case KEY_Control_R: case KEY_Shift_L: case KEY_Shift_R: case KEY_Alt_L: case KEY_Alt_R: if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; case KEY_Page_Up: case KEY_KP_Page_Up: lookup=FXString::null; setPosition(pos_x,pos_y+verticalScrollBar()->getPage()); return 1; case KEY_Page_Down: case KEY_KP_Page_Down: lookup=FXString::null; setPosition(pos_x,pos_y-verticalScrollBar()->getPage()); return 1; case KEY_Right: case KEY_KP_Right: if(!(options&(ICONLIST_BIG_ICONS|ICONLIST_MINI_ICONS))){ setPosition(pos_x-10,pos_y); return 1; } if(options&ICONLIST_COLUMNS) index+=1; else index+=nrows; goto hop; case KEY_Left: case KEY_KP_Left: if(!(options&(ICONLIST_BIG_ICONS|ICONLIST_MINI_ICONS))){ setPosition(pos_x+10,pos_y); return 1; } if(options&ICONLIST_COLUMNS) index-=1; else index-=nrows; goto hop; case KEY_Up: case KEY_KP_Up: if(options&ICONLIST_COLUMNS) index-=ncols; else index-=1; goto hop; case KEY_Down: case KEY_KP_Down: if(options&ICONLIST_COLUMNS) index+=ncols; else index+=1; goto hop; case KEY_Home: case KEY_KP_Home: index=0; goto hop; case KEY_End: case KEY_KP_End: index=items.no()-1; hop: lookup=FXString::null; if(0<=index && indexisEnabled()){ if((options&SELECT_MASK)==ICONLIST_EXTENDEDSELECT){ if(event->state&SHIFTMASK){ if(0<=anchor){ selectItem(anchor,TRUE); extendSelection(index,TRUE); } else{ selectItem(index,TRUE); } } else if(!(event->state&CONTROLMASK)){ killSelection(TRUE); selectItem(index,TRUE); setAnchorItem(index); } } } } handle(this,FXSEL(SEL_CLICKED,0),(void*)(FXival)current); if(0<=current && items[current]->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)(FXival)current); } return 1; case KEY_space: case KEY_KP_Space: lookup=FXString::null; if(0<=current && items[current]->isEnabled()){ switch(options&SELECT_MASK){ case ICONLIST_EXTENDEDSELECT: if(event->state&SHIFTMASK){ if(0<=anchor){ selectItem(anchor,TRUE); extendSelection(current,TRUE); } else{ selectItem(current,TRUE); } } else if(event->state&CONTROLMASK){ toggleItem(current,TRUE); } else{ killSelection(TRUE); selectItem(current,TRUE); } break; case ICONLIST_MULTIPLESELECT: case ICONLIST_SINGLESELECT: toggleItem(current,TRUE); break; } setAnchorItem(current); } handle(this,FXSEL(SEL_CLICKED,0),(void*)(FXival)current); if(0<=current && items[current]->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)(FXival)current); } return 1; case KEY_Return: case KEY_KP_Enter: lookup=FXString::null; handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)(FXival)current); if(0<=current && items[current]->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)(FXival)current); } return 1; default: if((FXuchar)event->text[0]<' ') return 0; if(event->state&(CONTROLMASK|ALTMASK)) return 0; if(!Ascii::isPrint(event->text[0])) return 0; lookup.append(event->text); getApp()->addTimeout(this,ID_LOOKUPTIMER,getApp()->getTypingSpeed()); index=findItem(lookup,current,SEARCH_FORWARD|SEARCH_WRAP|SEARCH_PREFIX); if(0<=index){ setCurrentItem(index,TRUE); makeItemVisible(index); if(items[index]->isEnabled()){ if((options&SELECT_MASK)==ICONLIST_EXTENDEDSELECT){ killSelection(TRUE); selectItem(index,TRUE); } setAnchorItem(index); } } handle(this,FXSEL(SEL_CLICKED,0),(void*)(FXival)current); if(0<=current && items[current]->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)(FXival)current); } return 1; } return 0; } // Key Release long FXIconList::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(!isEnabled()) return 0; if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Shift_L: case KEY_Shift_R: case KEY_Control_L: case KEY_Control_R: case KEY_Alt_L: case KEY_Alt_R: if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; } return 0; } // Autoscrolling timer long FXIconList::onAutoScroll(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint olx,orx,oty,oby,nlx,nrx,nty,nby; // Lasso mode if(flags&FLAG_LASSO){ // Hide the lasso before scrolling drawLasso(anchorx,anchory,currentx,currenty); // Scroll the content FXScrollArea::onAutoScroll(sender,sel,ptr); // Select items in lasso FXMINMAX(olx,orx,anchorx,currentx); FXMINMAX(oty,oby,anchory,currenty); currentx=event->win_x-pos_x; currenty=event->win_y-pos_y; FXMINMAX(nlx,nrx,anchorx,currentx); FXMINMAX(nty,nby,anchory,currenty); lassoChanged(pos_x+olx,pos_y+oty,orx-olx+1,oby-oty+1,pos_x+nlx,pos_y+nty,nrx-nlx+1,nby-nty+1,TRUE); // Force repaint on this window repaint(); // Show lasso again drawLasso(anchorx,anchory,currentx,currenty); return 1; } // Scroll the content FXScrollArea::onAutoScroll(sender,sel,ptr); // Content scrolled, so perhaps something else under cursor if(flags&FLAG_DODRAG){ handle(this,FXSEL(SEL_DRAGGED,0),ptr); return 1; } return 0; } // Mouse moved long FXIconList::onMotion(FXObject*,FXSelector,void* ptr){ FXint olx,orx,oty,oby,nlx,nrx,nty,nby; FXEvent* event=(FXEvent*)ptr; FXint oldcursor=cursor; FXuint flg=flags; // Kill the tip flags&=~FLAG_TIP; // Kill the tip timer getApp()->removeTimeout(this,ID_TIPTIMER); // Right mouse scrolling if(flags&FLAG_SCROLLING){ setPosition(event->win_x-grabx,event->win_y-graby); return 1; } // Lasso selection mode if(flags&FLAG_LASSO){ if(startAutoScroll(event,FALSE)) return 1; // Hide lasso drawLasso(anchorx,anchory,currentx,currenty); // Select items in lasso FXMINMAX(olx,orx,anchorx,currentx); FXMINMAX(oty,oby,anchory,currenty); currentx=event->win_x-pos_x; currenty=event->win_y-pos_y; FXMINMAX(nlx,nrx,anchorx,currentx); FXMINMAX(nty,nby,anchory,currenty); lassoChanged(pos_x+olx,pos_y+oty,orx-olx+1,oby-oty+1,pos_x+nlx,pos_y+nty,nrx-nlx+1,nby-nty+1,TRUE); // Force repaint on this window repaint(); // Show lasso again drawLasso(anchorx,anchory,currentx,currenty); return 1; } // Drag and drop mode if(flags&FLAG_DODRAG){ if(startAutoScroll(event,TRUE)) return 1; handle(this,FXSEL(SEL_DRAGGED,0),ptr); return 1; } // Tentative drag and drop if(flags&FLAG_TRYDRAG){ if(event->moved){ flags&=~FLAG_TRYDRAG; if(handle(this,FXSEL(SEL_BEGINDRAG,0),ptr)){ flags|=FLAG_DODRAG; } } return 1; } // Reset tip timer if nothing's going on getApp()->addTimeout(this,ID_TIPTIMER,getApp()->getMenuPause()); // Get item we're over cursor=getItemAt(event->win_x,event->win_y); // Force GUI update only when needed return (cursor!=oldcursor)||(flg&FLAG_TIP); } // Pressed a button long FXIconList::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint index,code; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); flags&=~FLAG_UPDATE; // First change callback if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; // Locate item index=getItemAt(event->win_x,event->win_y); // No item if(index<0){ // Start lasso if((options&SELECT_MASK)==ICONLIST_EXTENDEDSELECT){ // Kill selection if(!(event->state&(SHIFTMASK|CONTROLMASK))){ killSelection(TRUE); } anchorx=currentx=event->win_x-pos_x; anchory=currenty=event->win_y-pos_y; drawLasso(anchorx,anchory,currentx,currenty); flags|=FLAG_LASSO; } return 1; } // Find out where hit code=hitItem(index,event->win_x,event->win_y); // Change current item setCurrentItem(index,TRUE); // Change item selection state=items[index]->isSelected(); switch(options&SELECT_MASK){ case ICONLIST_EXTENDEDSELECT: if(event->state&SHIFTMASK){ if(0<=anchor){ if(items[anchor]->isEnabled()) selectItem(anchor,TRUE); extendSelection(index,TRUE); } else{ if(items[index]->isEnabled()) selectItem(index,TRUE); setAnchorItem(index); } } else if(event->state&CONTROLMASK){ if(items[index]->isEnabled() && !state) selectItem(index,TRUE); setAnchorItem(index); } else{ if(items[index]->isEnabled() && !state){ killSelection(TRUE); selectItem(index,TRUE); } setAnchorItem(index); } break; case ICONLIST_MULTIPLESELECT: case ICONLIST_SINGLESELECT: if(items[index]->isEnabled() && !state) selectItem(index,TRUE); break; } // Are we dragging? if(code && items[index]->isSelected() && items[index]->isDraggable()){ flags|=FLAG_TRYDRAG; } flags|=FLAG_PRESSED; return 1; } return 0; } // Released button long FXIconList::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXuint flg=flags; if(isEnabled()){ ungrab(); stopAutoScroll(); flags|=FLAG_UPDATE; flags&=~(FLAG_PRESSED|FLAG_TRYDRAG|FLAG_LASSO|FLAG_DODRAG); // First chance callback if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; // Was lassoing if(flg&FLAG_LASSO){ drawLasso(anchorx,anchory,currentx,currenty); return 1; } // Was dragging if(flg&FLAG_DODRAG){ handle(this,FXSEL(SEL_ENDDRAG,0),ptr); return 1; } // Must have pressed if(flg&FLAG_PRESSED){ // Selection change switch(options&SELECT_MASK){ case ICONLIST_EXTENDEDSELECT: if(0<=current && items[current]->isEnabled()){ if(event->state&CONTROLMASK){ if(state) deselectItem(current,TRUE); } else if(!(event->state&SHIFTMASK)){ if(state){ killSelection(TRUE); selectItem(current,TRUE); } } } break; case ICONLIST_MULTIPLESELECT: case ICONLIST_SINGLESELECT: if(0<=current && items[current]->isEnabled()){ if(state) deselectItem(current,TRUE); } break; } // Scroll to make item visibke makeItemVisible(current); // Update anchor setAnchorItem(current); // Generate clicked callbacks if(event->click_count==1){ handle(this,FXSEL(SEL_CLICKED,0),(void*)(FXival)current); } else if(event->click_count==2){ handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)(FXival)current); } else if(event->click_count==3){ handle(this,FXSEL(SEL_TRIPLECLICKED,0),(void*)(FXival)current); } // Command callback only when clicked on item if(0<=current && items[current]->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)(FXival)current); } } return 1; } return 0; } // Pressed right button long FXIconList::onRightBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); flags&=~FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; flags|=FLAG_SCROLLING; grabx=event->win_x-pos_x; graby=event->win_y-pos_y; return 1; } return 0; } // Released right button long FXIconList::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); flags&=~FLAG_SCROLLING; flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // The widget lost the grab for some reason long FXIconList::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onUngrabbed(sender,sel,ptr); flags&=~(FLAG_DODRAG|FLAG_LASSO|FLAG_TRYDRAG|FLAG_PRESSED|FLAG_CHANGED|FLAG_SCROLLING); flags|=FLAG_UPDATE; stopAutoScroll(); return 1; } // Command message long FXIconList::onCommand(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); } // Clicked in list long FXIconList::onClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_CLICKED,message),ptr); } // Double Clicked in list; ptr may or may not point to an item long FXIconList::onDoubleClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_DOUBLECLICKED,message),ptr); } // Triple Clicked in list; ptr may or may not point to an item long FXIconList::onTripleClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_TRIPLECLICKED,message),ptr); } // Create custom item FXIconItem *FXIconList::createItem(const FXString& text,FXIcon *big,FXIcon* mini,void* ptr){ return new FXIconItem(text,big,mini,ptr); } // Retrieve item FXIconItem *FXIconList::getItem(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItem: index out of range.\n",getClassName()); } return items[index]; } // Replace item with another FXint FXIconList::setItem(FXint index,FXIconItem* item,FXbool notify){ // Must have item if(!item){ fxerror("%s::setItem: item is NULL.\n",getClassName()); } // Must be in range if(index<0 || items.no()<=index){ fxerror("%s::setItem: index out of range.\n",getClassName()); } // Notify item will be replaced if(notify && target){target->tryHandle(this,FXSEL(SEL_REPLACED,message),(void*)(FXival)index);} // Copy the state over item->state=items[index]->state; // Delete old delete items[index]; // Add new items[index]=item; // Redo layout recalc(); return index; } // Replace item with another FXint FXIconList::setItem(FXint index,const FXString& text,FXIcon *big,FXIcon* mini,void* ptr,FXbool notify){ return setItem(index,createItem(text,big,mini,ptr),notify); } // Insert item FXint FXIconList::insertItem(FXint index,FXIconItem* item,FXbool notify){ register FXint old=current; // Must have item if(!item){ fxerror("%s::insertItem: item is NULL.\n",getClassName()); } // Must be in range if(index<0 || items.no()=index) anchor++; if(extent>=index) extent++; if(current>=index) current++; if(viewable>=index) viewable++; if(current<0 && items.no()==1) current=0; // Notify item has been inserted if(notify && target){target->tryHandle(this,FXSEL(SEL_INSERTED,message),(void*)(FXival)index);} // Current item may have changed if(old!=current){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)current);} } // Was new item if(0<=current && current==index){ if(hasFocus()){ items[current]->setFocus(TRUE); } if((options&SELECT_MASK)==ICONLIST_BROWSESELECT && items[current]->isEnabled()){ selectItem(current,notify); } } // Redo layout recalc(); return index; } // Insert item FXint FXIconList::insertItem(FXint index,const FXString& text,FXIcon *big,FXIcon* mini,void* ptr,FXbool notify){ return insertItem(index,createItem(text,big,mini,ptr),notify); } // Append item FXint FXIconList::appendItem(FXIconItem* item,FXbool notify){ return insertItem(items.no(),item,notify); } // Append item FXint FXIconList::appendItem(const FXString& text,FXIcon *big,FXIcon* mini,void* ptr,FXbool notify){ return insertItem(items.no(),createItem(text,big,mini,ptr),notify); } // Prepend item FXint FXIconList::prependItem(FXIconItem* item,FXbool notify){ return insertItem(0,item,notify); } // Prepend item FXint FXIconList::prependItem(const FXString& text,FXIcon *big,FXIcon* mini,void* ptr,FXbool notify){ return insertItem(0,createItem(text,big,mini,ptr),notify); } // Fill list by appending items from array of strings FXint FXIconList::fillItems(const FXchar** strings,FXIcon *big,FXIcon* mini,void* ptr,FXbool notify){ register FXint n=0; if(strings){ while(strings[n]){ appendItem(strings[n++],big,mini,ptr,notify); } } return n; } // Fill list by appending items from newline separated strings FXint FXIconList::fillItems(const FXString& strings,FXIcon *big,FXIcon* mini,void* ptr,FXbool notify){ register FXint n=0; FXString text; while(!(text=strings.section('\n',n)).empty()){ appendItem(text,big,mini,ptr,notify); n++; } return n; } // Move item from oldindex to newindex FXint FXIconList::moveItem(FXint newindex,FXint oldindex,FXbool notify){ register FXint old=current; register FXIconItem *item; // Must be in range if(newindex<0 || oldindex<0 || items.no()<=newindex || items.no()<=oldindex){ fxerror("%s::moveItem: index out of range.\n",getClassName()); } // Did it change? if(oldindex!=newindex){ // Move item item=items[oldindex]; items.erase(oldindex); items.insert(newindex,item); // Move item down if(newindextryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)current);} } // Redo layout recalc(); } return newindex; } // Extract node from list FXIconItem* FXIconList::extractItem(FXint index,FXbool notify){ register FXIconItem *result; register FXint old=current; // Must be in range if(index<0 || items.no()<=index){ fxerror("%s::extractItem: index out of range.\n",getClassName()); } // Notify item will be deleted if(notify && target){target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)(FXival)index);} // Extract item result=items[index]; // Remove from list items.erase(index); // Adjust indices if(anchor>index || anchor>=items.no()) anchor--; if(extent>index || extent>=items.no()) extent--; if(current>index || current>=items.no()) current--; if(viewable>index || viewable>=items.no()) viewable--; // Current item has changed if(index<=old){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)current);} } // Deleted current item if(0<=current && index==old){ if(hasFocus()){ items[current]->setFocus(TRUE); } if((options&SELECT_MASK)==ICONLIST_BROWSESELECT && items[current]->isEnabled()){ selectItem(current,notify); } } // Redo layout recalc(); // Return item return result; } // Remove node from list void FXIconList::removeItem(FXint index,FXbool notify){ register FXint old=current; // Must be in range if(index<0 || items.no()<=index){ fxerror("%s::removeItem: index out of range.\n",getClassName()); } // Notify item will be deleted if(notify && target){target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)(FXival)index);} // Delete item delete items[index]; // Remove from list items.erase(index); // Adjust indices if(anchor>index || anchor>=items.no()) anchor--; if(extent>index || extent>=items.no()) extent--; if(current>index || current>=items.no()) current--; if(viewable>index || viewable>=items.no()) viewable--; // Current item has changed if(index<=old){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)current);} } // Deleted current item if(0<=current && index==old){ if(hasFocus()){ items[current]->setFocus(TRUE); } if((options&SELECT_MASK)==ICONLIST_BROWSESELECT && items[current]->isEnabled()){ selectItem(current,notify); } } // Redo layout recalc(); } // Remove all items void FXIconList::clearItems(FXbool notify){ register FXint old=current; // Delete items for(FXint index=items.no()-1; 0<=index; index--){ if(notify && target){target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)(FXival)index);} delete items[index]; } // Free array items.clear(); // Adjust indices current=-1; anchor=-1; extent=-1; viewable=-1; // Current item has changed if(old!=-1){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)-1);} } // Redo layout recalc(); } // Change the font void FXIconList::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Set text color void FXIconList::setTextColor(FXColor clr){ if(clr!=textColor){ textColor=clr; update(); } } // Set select background color void FXIconList::setSelBackColor(FXColor clr){ if(clr!=selbackColor){ selbackColor=clr; update(); } } // Set selected text color void FXIconList::setSelTextColor(FXColor clr){ if(clr!=seltextColor){ seltextColor=clr; update(); } } // Set text width void FXIconList::setItemSpace(FXint s){ if(s<1) s=1; if(itemSpace!=s){ itemSpace=s; recalc(); } } // Change list style void FXIconList::setListStyle(FXuint style){ FXuint opts=(options&~ICONLIST_MASK) | (style&ICONLIST_MASK); if(options!=opts){ options=opts; recalc(); } } // Get list style FXuint FXIconList::getListStyle() const { return (options&ICONLIST_MASK); } // Change help text void FXIconList::setHelpText(const FXString& text){ help=text; } // Save data void FXIconList::save(FXStream& store) const { FXScrollArea::save(store); store << header; items.save(store); store << nrows; store << ncols; store << anchor; store << current; store << extent; store << font; store << textColor; store << selbackColor; store << seltextColor; store << itemSpace; store << itemWidth; store << itemHeight; store << help; } // Load data void FXIconList::load(FXStream& store){ FXScrollArea::load(store); store >> header; items.load(store); store >> nrows; store >> ncols; store >> anchor; store >> current; store >> extent; store >> font; store >> textColor; store >> selbackColor; store >> seltextColor; store >> itemSpace; store >> itemWidth; store >> itemHeight; store >> help; } // Cleanup FXIconList::~FXIconList(){ getApp()->removeTimeout(this,ID_TIPTIMER); getApp()->removeTimeout(this,ID_LOOKUPTIMER); clearItems(FALSE); header=(FXHeader*)-1L; font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXIconSource.cpp000066400000000000000000000261261326741342000164460ustar00rootroot00000000000000/******************************************************************************** * * * I c o n S o u r c e * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXIconSource.cpp,v 1.20.2.2 2008/01/25 14:00:32 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXFile.h" #include "FXFileStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXPath.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXIcon.h" #include "FXImage.h" #include "FXIconSource.h" // Built-in icon formats #include "FXBMPIcon.h" #include "FXGIFIcon.h" #include "FXICOIcon.h" #include "FXIFFIcon.h" #include "FXPCXIcon.h" #include "FXPPMIcon.h" #include "FXRASIcon.h" #include "FXRGBIcon.h" #include "FXTGAIcon.h" #include "FXXBMIcon.h" #include "FXXPMIcon.h" // Built-in image formats #include "FXBMPImage.h" #include "FXGIFImage.h" #include "FXICOImage.h" #include "FXIFFImage.h" #include "FXPCXImage.h" #include "FXPPMImage.h" #include "FXRASImage.h" #include "FXRGBImage.h" #include "FXTGAImage.h" #include "FXXBMImage.h" #include "FXXPMImage.h" // Formats requiring external libraries #ifndef CORE_IMAGE_FORMATS #ifdef HAVE_JPEG_H #include "FXJPGIcon.h" #include "FXJPGImage.h" #endif #ifdef HAVE_PNG_H #include "FXPNGIcon.h" #include "FXPNGImage.h" #endif #ifdef HAVE_TIFF_H #include "FXTIFIcon.h" #include "FXTIFImage.h" #endif #endif /* Notes: - Either load an icon from a file, or load from already open stream. - Future versions will take advantage of the new fxcheckXXX() functions to predicates to determine from the data itself what the type is; currently this is quite unreliable due to more extensive analysis needed of the image file format recognition. */ using namespace FX; /*******************************************************************************/ namespace FX { FXIMPLEMENT(FXIconSource,FXObject,NULL,0) // Initialize icon source FXIconSource::FXIconSource(FXApp* a):app(a){ FXTRACE((100,"FXIconSource::FXIconSource\n")); } // Scale image or icon to size FXImage* FXIconSource::scaleToSize(FXImage *image,FXint size,FXint qual) const { if(image){ if((image->getWidth()>size) || (image->getHeight()>size)){ if(image->getWidth()>image->getHeight()){ image->scale(size,(size*image->getHeight())/image->getWidth(),qual); } else{ image->scale((size*image->getWidth())/image->getHeight(),size,qual); } } } return image; } // Load from file FXIcon *FXIconSource::loadIconFile(const FXString& filename,const FXString& type) const { FXIcon *icon=NULL; FXTRACE((150,"FXIconSource loadIcon(%s)\n",filename.text())); if(!filename.empty()){ FXFileStream store; if(store.open(filename,FXStreamLoad,65536)){ if(type.empty()){ icon=loadIconStream(store,FXPath::extension(filename)); } else{ icon=loadIconStream(store,type); } store.close(); } } return icon; } // Load from data array FXIcon *FXIconSource::loadIconData(const void *pixels,const FXString& type) const { FXIcon *icon=NULL; if(pixels){ FXMemoryStream store; store.open(FXStreamLoad,(FXuchar*)pixels); icon=loadIconStream(store,type); store.close(); } return icon; } // Load from already open stream FXIcon *FXIconSource::loadIconStream(FXStream& store,const FXString& type) const { FXIcon *icon=NULL; if(comparecase(FXBMPIcon::fileExt,type)==0){ icon=new FXBMPIcon(app); } else if(comparecase(FXGIFIcon::fileExt,type)==0){ icon=new FXGIFIcon(app); } else if(comparecase(FXICOIcon::fileExt,type)==0 || comparecase("cur",type)==0){ icon=new FXICOIcon(app); } else if(comparecase(FXIFFIcon::fileExt,type)==0 || comparecase("lbm",type)==0){ icon=new FXIFFIcon(app); } else if(comparecase(FXPCXIcon::fileExt,type)==0){ icon=new FXPCXIcon(app); } else if(comparecase(FXPPMIcon::fileExt,type)==0 || comparecase("pbm",type)==0 || comparecase("pgm",type)==0 || comparecase("pnm",type)==0){ icon=new FXPPMIcon(app); } else if(comparecase(FXRASIcon::fileExt,type)==0){ icon=new FXRASIcon(app); } else if(comparecase(FXRGBIcon::fileExt,type)==0){ icon=new FXRGBIcon(app); } else if(comparecase(FXTGAIcon::fileExt,type)==0){ icon=new FXTGAIcon(app); } else if(comparecase(FXXBMIcon::fileExt,type)==0){ icon=new FXXBMIcon(app); } else if(comparecase(FXXPMIcon::fileExt,type)==0){ icon=new FXXPMIcon(app); } #ifndef CORE_IMAGE_FORMATS #ifdef HAVE_JPEG_H else if(comparecase(FXJPGIcon::fileExt,type)==0 || comparecase("jpeg",type)==0){ icon=new FXJPGIcon(app); } #endif #ifdef HAVE_PNG_H else if(comparecase(FXPNGIcon::fileExt,type)==0){ icon=new FXPNGIcon(app); } #endif #ifdef HAVE_TIFF_H else if(comparecase(FXTIFIcon::fileExt,type)==0 || comparecase("tiff",type)==0){ icon=new FXTIFIcon(app); } #endif #endif if(icon){ if(icon->loadPixels(store)) return icon; delete icon; } return NULL; } // Load from file FXImage *FXIconSource::loadImageFile(const FXString& filename,const FXString& type) const { FXImage *image=NULL; FXTRACE((150,"FXIconSource loadImage(%s)\n",filename.text())); if(!filename.empty()){ FXFileStream store; if(store.open(filename,FXStreamLoad,65536)){ if(type.empty()){ image=loadImageStream(store,FXPath::extension(filename)); } else{ image=loadImageStream(store,type); } store.close(); } } return image; } // Load from data array FXImage *FXIconSource::loadImageData(const void *pixels,const FXString& type) const { FXImage *image=NULL; if(pixels){ FXMemoryStream store; store.open(FXStreamLoad,(FXuchar*)pixels); image=loadImageStream(store,type); store.close(); } return image; } // Load from already open stream FXImage *FXIconSource::loadImageStream(FXStream& store,const FXString& type) const { FXImage *image=NULL; if(comparecase(FXBMPImage::fileExt,type)==0){ image=new FXBMPImage(app); } else if(comparecase(FXGIFImage::fileExt,type)==0){ image=new FXGIFImage(app); } else if(comparecase(FXICOImage::fileExt,type)==0 || comparecase("cur",type)==0){ image=new FXICOImage(app); } else if(comparecase(FXIFFImage::fileExt,type)==0 || comparecase("lbm",type)==0){ image=new FXIFFImage(app); } else if(comparecase(FXPCXImage::fileExt,type)==0){ image=new FXPCXImage(app); } else if(comparecase(FXPPMImage::fileExt,type)==0 || comparecase("pbm",type)==0 || comparecase("pgm",type)==0 || comparecase("pnm",type)==0){ image=new FXPPMImage(app); } else if(comparecase(FXRASImage::fileExt,type)==0){ image=new FXRASImage(app); } else if(comparecase(FXRGBImage::fileExt,type)==0){ image=new FXRGBImage(app); } else if(comparecase(FXTGAImage::fileExt,type)==0){ image=new FXTGAImage(app); } else if(comparecase(FXXBMImage::fileExt,type)==0){ image=new FXXBMImage(app); } else if(comparecase(FXXPMImage::fileExt,type)==0){ image=new FXXPMImage(app); } #ifndef CORE_IMAGE_FORMATS #ifdef HAVE_JPEG_H else if(comparecase(FXJPGImage::fileExt,type)==0 || comparecase("jpeg",type)==0){ image=new FXJPGImage(app); } #endif #ifdef HAVE_PNG_H else if(comparecase(FXPNGImage::fileExt,type)==0){ image=new FXPNGImage(app); } #endif #ifdef HAVE_TIFF_H else if(comparecase(FXTIFImage::fileExt,type)==0 || comparecase("tiff",type)==0){ image=new FXTIFImage(app); } #endif #endif if(image){ if(image->loadPixels(store)) return image; delete image; } return NULL; } // Load icon and scale it such that its dimensions does not exceed given size FXIcon *FXIconSource::loadScaledIconFile(const FXString& filename,FXint size,FXint qual,const FXString& type) const { return (FXIcon*)scaleToSize(loadIconFile(filename,type),size,qual); } // Load from data array FXIcon *FXIconSource::loadScaledIconData(const void *pixels,FXint size,FXint qual,const FXString& type) const { return (FXIcon*)scaleToSize(loadIconData(pixels,type),size,qual); } // Load icon and scale it such that its dimensions does not exceed given size FXIcon *FXIconSource::loadScaledIconStream(FXStream& store,FXint size,FXint qual,const FXString& type) const { return (FXIcon*)scaleToSize(loadIconStream(store,type),size,qual); } // Load image and scale it such that its dimensions does not exceed given size FXImage *FXIconSource::loadScaledImageFile(const FXString& filename,FXint size,FXint qual,const FXString& type) const { return scaleToSize(loadImageFile(filename,type),size,qual); } // Load from data array FXImage *FXIconSource::loadScaledImageData(const void *pixels,FXint size,FXint qual,const FXString& type) const { return (FXImage*)scaleToSize(loadImageData(pixels,type),size,qual); } // Load image and scale it such that its dimensions does not exceed given size FXImage *FXIconSource::loadScaledImageStream(FXStream& store,FXint size,FXint qual,const FXString& type) const { return scaleToSize(loadImageStream(store,type),size,qual); } // Save to stream void FXIconSource::save(FXStream& store) const { FXObject::save(store); store << app; } // Load from stream void FXIconSource::load(FXStream& store){ FXObject::load(store); store >> app; } // Delete FXIconSource::~FXIconSource(){ FXTRACE((100,"FXIconSource::~FXIconSource\n")); app=(FXApp*)-1L; } } fox1.6-1.6.57/src/FXId.cpp000066400000000000000000000053701326741342000147270ustar00rootroot00000000000000/******************************************************************************** * * * X - O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXId.cpp,v 1.24 2006/01/22 17:58:32 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXException.h" using namespace FX; enum { MAGIC = 0x464f5831 }; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT_ABSTRACT(FXId,FXObject,NULL,0) // Save data void FXId::save(FXStream& store) const { FXuint version=MAGIC; FXObject::save(store); store << version; store << app; } // Load data void FXId::load(FXStream& store){ FXuint version; FXObject::load(store); store >> version; if(version!=MAGIC){ store.setError(FXStreamFormat); throw FXResourceException("expected to match MAGIC tag"); } store >> app; } } fox1.6-1.6.57/src/FXImage.cpp000066400000000000000000002015521326741342000154150ustar00rootroot00000000000000/******************************************************************************** * * * I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXImage.cpp,v 1.148.2.1 2006/04/14 01:21:00 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXVisual.h" #include "FXImage.h" #include "FXDCWindow.h" #include "FXException.h" /* Notes: - FXImage::create() renders rgb[a] data into X/GDI resident, device dependent pixmap. - Need to be able to re-render subpart of image. - We should implement shared pixmaps. - If IMAGE_KEEP, repeated rendering is usually desired; should we hang on to XImage, and the shared memory segment in that case? How about shared pixmaps... - Slight change in interpretation of IMAGE_OWNED flag:- if passed, the FXImage will own client-side pixel buffer, otherwise it will not; if no pixel-buffer has been passed and IMAGE_OWNED *is* passed, a pixel buffer will be allocated [and cleared to zero]. No pixel buffer will be allocated if neither IMAGE_OWNED nor pixels are passed. - When using shared image/pixmaps, if IMAGE_KEEP is set, hang on to pixel buffer. - We need to speed up 16/15 bpp true color. - We need dither tables with 3bit and 2bit rounding for 5,6,5/5,5,5 modes - We need dither tables with 5bit, 6bit rounding for 3,3,2 mode. - We need to split true color from direct color, because direct color has random mapping, true has not. - Just because I always forget: StaticGray 0 GrayScale 1 StaticColor 2 PseudoColor 3 TrueColor 4 DirectColor 5 - The smooth scaling algorithm is based on the idea of keeping track which pixels of the source are contributing to each pixel in the destination. The smallest fraction of a pixel of interest is 1/(w*w'), where w is the old width, and w' is the new one. Consider scaling from 3->7 pixels, with 1/(w*w') being 1/21: Source Pixel 2 --------------+ Source Pixel is 7/21 units wide Source Pixel 1 --------+ | Source Pixel 0 -+ | | | | | v v v Original: 000000011111112222222 Scaled: 000111222333444555666 ^ ^ ^ ^ ^ ^ ^ | | | | | | | Dest Pixel 0 -+ | | | | | | Dest Pixel 1 ----+ | | | | | Dest Pixel 2 -------+ | | | | Dest Pixel 3 ----------+ | | | Dest Pixel 4 -------------+ | | Dest Pixel 5 ----------------+ | Dest Pixel 6 -------------------+ Dest Pixel is 3/21 units wide As can be seen from the picture above, destination pixel 2 is comprised of 1/3 times source pixel 0, and 2/3 times source pixel 1. Splitting into the individual fragments yields 9 fragments total: Fragment 0 1 2 3 4 5 6 7 8 ======================================== Original: 000 000 0 11 111 11 2 222 222 Scaled: 000 111 2 22 333 44 4 555 666 Note no fragment can be smaller than one unit, or 1/(w*w'). The algorithm iterates over fragments; and for each fragment, it adds the source pixel multiplied by the length of the fragment. It repeats until enough fragments have been collected to make one output pixel: fin = w'; The fractions fin and fout have fout = w; been multiplied by w*w' in = 0; out = 0; acc = 0; while out < w' do if fin < fout then acc = acc + fin*source[in]; Add fin units of source pixel fout = fout - fin; fin = outw; in = in + 1; else acc = acc + fout*source[in]; Add fout (the remaining unfilled fraction) of source pixel dest[out] = acc / w; Output one pixel acc = 0; fin = fin - fout; fout = inw; out = out + 1; end if end while Remember, you saw it here first!!!! - When compositing, out-of-image data behaves as if clear (0,0,0,0) - Absence of data behaves as if clear - Operations work on subrectangle of an image - Images and regions are at least 1x1 pixels - Operations of the form a = a op b, or a = op a. - Fast blend (0..255) colors: blue = (ALPHA * (sb - db) >> 8) + db; green = (ALPHA * (sg - dg) >> 8) + dg; red = (ALPHA * (sr - dr) >> 8) + dr; - Fast division by 255: r=(i+(i>>8)+1)>>8); - Rotate using 3 shear operations: { cos(phi) -sin(phi) } { 1 -tan(phi/2) } { 1 0 } { 1 -tan(phi/2) } { } = { } x { } x { } { sin(phi) cos(phi) } { 0 1 } { sin(phi) 1 } { 0 1 } */ #define DISPLAY(app) ((Display*)((app)->display)) // Changable image options #define IMAGE_MASK (IMAGE_KEEP|IMAGE_NEAREST|IMAGE_OPAQUE|IMAGE_ALPHACOLOR|IMAGE_SHMI|IMAGE_SHMP|IMAGE_ALPHAGUESS) // Maximum size of the colormap; for high-end graphics systems // you may want to define HIGHENDGRAPHICS to allow for large colormaps #ifdef HIGHENDGRAPHICS #define MAX_MAPSIZE 4096 #else #define MAX_MAPSIZE 256 #endif using namespace FX; /*******************************************************************************/ namespace FX { // RGB Ordering code enum { RGB = 7, // RGB 111 > | R G B BGR = 0, // BGR 000 --+-------- RBG = 6, // RBG 110 R | x 4 2 GBR = 1, // GBR 001 G | x 1 BRG = 4, // BRG 100 B | x GRB = 3 // GRB 011 }; // Object implementation FXIMPLEMENT(FXImage,FXDrawable,NULL,0) // For deserialization FXImage::FXImage(){ data=NULL; options=0; } // Initialize FXImage::FXImage(FXApp* a,const FXColor *pix,FXuint opts,FXint w,FXint h):FXDrawable(a,w,h){ FXTRACE((100,"FXImage::FXImage %p\n",this)); FXASSERT((opts&~(IMAGE_OWNED|IMAGE_MASK))==0); visual=getApp()->getDefaultVisual(); data=(FXColor*)pix; options=opts; if(!data && (options&IMAGE_OWNED)){ // This is confusing use of IMAGE_OWNED if(!FXCALLOC(&data,FXColor,width*height)){ throw FXMemoryException("unable to construct image"); } } } // Create image void FXImage::create(){ if(!xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::create %p\n",getClassName(),this)); #ifndef WIN32 // Initialize visual visual->create(); // Get depth (should use visual!!) int dd=visual->getDepth(); // Make pixmap xid=XCreatePixmap(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),FXMAX(width,1),FXMAX(height,1),dd); #else // Initialize visual visual->create(); // Create a bitmap compatible with current display HDC hdc=::GetDC(GetDesktopWindow()); xid=CreateCompatibleBitmap(hdc,FXMAX(width,1),FXMAX(height,1)); ::ReleaseDC(GetDesktopWindow(),hdc); #endif // Were we successful? if(!xid){ throw FXImageException("unable to create image"); } // Render pixels render(); // Release pixel buffer if(!(options&IMAGE_KEEP)) release(); } } } // Release the client-side buffer, free it if it was owned. void FXImage::release(){ if(options&IMAGE_OWNED){ options&=~IMAGE_OWNED; FXFREE(&data); } data=NULL; } // Detach image void FXImage::detach(){ visual->detach(); if(xid){ FXTRACE((100,"%s::detach %p\n",getClassName(),this)); xid=0; } } // Destroy image void FXImage::destroy(){ if(xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::destroy %p\n",getClassName(),this)); #ifndef WIN32 XFreePixmap(DISPLAY(getApp()),xid); #else DeleteObject(xid); #endif } xid=0; } } // Scan the image and return false if fully opaque bool FXImage::hasAlpha() const { if(data){ register FXint i=width*height-1; do{ if(((const FXuchar*)(data+i))[3]<255) return true; } while(--i>=0); } return false; } #ifndef WIN32 // Find shift amount static inline FXuint findshift(unsigned long mask){ register FXuint sh=0; while(!(mask&(1UL<visual; dd=visual->getDepth(); // Just in case you're on a high-end system FXASSERT(vis->map_entries<=MAX_MAPSIZE); // Make array for data if needed if(!data){ size=width*height; if(!FXMALLOC(&data,FXColor,size)){ throw FXMemoryException("unable to restore image"); } options|=IMAGE_OWNED; } // Got local buffer to receive into if(data){ // Turn it on iff both supported and desired #ifdef HAVE_XSHM_H if(options&IMAGE_SHMI) shmi=getApp()->shmi; #endif // First try XShm #ifdef HAVE_XSHM_H if(shmi){ xim=XShmCreateImage(DISPLAY(getApp()),vis,dd,(dd==1)?XYPixmap:ZPixmap,NULL,&shminfo,width,height); if(!xim){ shmi=0; } if(shmi){ shminfo.shmid=shmget(IPC_PRIVATE,xim->bytes_per_line*xim->height,IPC_CREAT|0777); if(shminfo.shmid==-1){ xim->data=NULL; XDestroyImage(xim); xim=NULL; shmi=0; } if(shmi){ shminfo.shmaddr=xim->data=(char*)shmat(shminfo.shmid,0,0); shminfo.readOnly=false; XShmAttach(DISPLAY(getApp()),&shminfo); FXTRACE((150,"RGBPixmap XSHM attached at memory=%p (%d bytes)\n",xim->data,xim->bytes_per_line*xim->height)); XShmGetImage(DISPLAY(getApp()),xid,xim,0,0,AllPlanes); XSync(DISPLAY(getApp()),False); } } } #endif // Try the old fashioned way if(!shmi){ xim=XGetImage(DISPLAY(getApp()),xid,0,0,width,height,AllPlanes,ZPixmap); if(!xim){ throw FXImageException("unable to restore image"); } } // Should have succeeded FXASSERT(xim); FXTRACE((150,"im width = %d\n",xim->width)); FXTRACE((150,"im height = %d\n",xim->height)); FXTRACE((150,"im format = %s\n",xim->format==XYBitmap?"XYBitmap":xim->format==XYPixmap?"XYPixmap":"ZPixmap")); FXTRACE((150,"im byte_order = %s\n",(xim->byte_order==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150,"im bitmap_unit = %d\n",xim->bitmap_unit)); FXTRACE((150,"im bitmap_bit_order = %s\n",(xim->bitmap_bit_order==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150,"im bitmap_pad = %d\n",xim->bitmap_pad)); FXTRACE((150,"im bitmap_unit = %d\n",xim->bitmap_unit)); FXTRACE((150,"im depth = %d\n",xim->depth)); FXTRACE((150,"im bytes_per_line = %d\n",xim->bytes_per_line)); FXTRACE((150,"im bits_per_pixel = %d\n",xim->bits_per_pixel)); { XColor colors[MAX_MAPSIZE]; // Get masks redmask=vis->red_mask; greenmask=vis->green_mask; bluemask=vis->blue_mask; // Read back the colormap and convert to more usable form if(vis->c_class!=TrueColor && vis->c_class!=DirectColor){ for(i=0 ; imap_entries; i++){ colors[i].pixel=i; colors[i].flags=DoRed|DoGreen|DoBlue; } } else{ red=green=blue=0; red1=lowbit(redmask); green1=lowbit(greenmask); blue1=lowbit(bluemask); for(i=0; imap_entries; i++){ colors[i].pixel=red|green|blue; colors[i].flags=DoRed|DoGreen|DoBlue; if(redcolormap,colors,vis->map_entries); for(i=0; imap_entries; i++){ rtab[i]=colors[i].red >> 8; gtab[i]=colors[i].green >> 8; btab[i]=colors[i].blue >> 8; } } // Now we convert the pixels back to color switch(xim->bits_per_pixel){ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: for(y=0,img=(FXuchar*)data; yc_class==TrueColor || vis->c_class==DirectColor); redshift=findshift(redmask); greenshift=findshift(greenmask); blueshift=findshift(bluemask); for(y=0,img=(FXuchar*)data; y>redshift; g=(pixel&greenmask)>>greenshift; b=(pixel&bluemask)>>blueshift; img[0]=rtab[r]; img[1]=gtab[g]; img[2]=btab[b]; img[3]=255; img+=4; } } break; } // Destroy image #ifdef HAVE_XSHM_H if(shmi){ FXTRACE((150,"RGBPixmap XSHM detached at memory=%p (%d bytes)\n",xim->data,xim->bytes_per_line*xim->height)); XShmDetach(DISPLAY(getApp()),&shminfo); XDestroyImage(xim); shmdt(shminfo.shmaddr); shmctl(shminfo.shmid,IPC_RMID,0); } #endif // Destroy image if(!shmi){ XDestroyImage(xim); } } } } #else // Restore client-side pixel buffer from image void FXImage::restore(){ if(xid){ register FXint size,bytes_per_line,skip,x,y; register FXuchar *pix,*img; FXuchar *pixels; BITMAPINFO bmi; HDC hdcmem; FXTRACE((100,"%s::restore image %p\n",getClassName(),this)); // Check for legal size if(width<1 || height<1){ fxerror("%s::restore: illegal image size %dx%d.\n",getClassName(),width,height); } // Make array for data if needed if(!data){ size=width*height; if(!FXMALLOC(&data,FXColor,size)){ throw FXMemoryException("unable to restore image"); } options|=IMAGE_OWNED; } // Got local buffer to receive into if(data){ // Set up the bitmap info bytes_per_line=(width*3+3)/4*4; skip=bytes_per_line-width*3; bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth=width; bmi.bmiHeader.biHeight=-height; // Negative heights means upside down! bmi.bmiHeader.biPlanes=1; bmi.bmiHeader.biBitCount=24; bmi.bmiHeader.biCompression=BI_RGB; bmi.bmiHeader.biSizeImage=0; bmi.bmiHeader.biXPelsPerMeter=0; bmi.bmiHeader.biYPelsPerMeter=0; bmi.bmiHeader.biClrUsed=0; bmi.bmiHeader.biClrImportant=0; // DIB format pads to multiples of 4 bytes... // if(!FXMALLOC(&pixels,FXuchar,bytes_per_line*height)){ throw FXImageException("unable to restore image"); } pixels=(FXuchar*)VirtualAlloc(0,bytes_per_line*height,MEM_COMMIT,PAGE_READWRITE); if(!pixels){ throw FXMemoryException("unable to restore image"); } // Make device context hdcmem=::CreateCompatibleDC(NULL); if(!GetDIBits(hdcmem,(HBITMAP)xid,0,height,pixels,&bmi,DIB_RGB_COLORS)){ throw FXImageException("unable to restore image"); } // Stuff it into our own data structure for(y=0,img=(FXuchar*)data,pix=pixels; yrpix[1][img[0]] | visual->gpix[1][img[1]] | visual->bpix[1][img[2]]); img+=4; } while(++xrpix[d][img[0]] | visual->gpix[d][img[1]] | visual->bpix[d][img[2]]); img+=4; } while(++xbytes_per_line-(width*3); register FXuchar *pix=(FXuchar*)((XImage*)xim)->data; register FXPixel val; register FXint w,h; if(((XImage*)xim)->byte_order==MSBFirst){ // MSB FXTRACE((150,"True MSB 24bpp render\n")); h=height-1; do{ w=width-1; do{ val=visual->rpix[1][img[0]] | visual->gpix[1][img[1]] | visual->bpix[1][img[2]]; pix[0]=(FXuchar)(val>>16); pix[1]=(FXuchar)(val>>8); pix[2]=(FXuchar)val; img+=4; pix+=3; } while(--w>=0); pix+=jmp; } while(--h>=0); } else{ // LSB FXTRACE((150,"True LSB 24bpp render\n")); h=height-1; do{ w=width-1; do{ val=visual->rpix[1][img[0]] | visual->gpix[1][img[1]] | visual->bpix[1][img[2]]; pix[0]=(FXuchar)val; pix[1]=(FXuchar)(val>>8); pix[2]=(FXuchar)(val>>16); img+=4; pix+=3; } while(--w>=0); pix+=jmp; } while(--h>=0); } } // True 32 bit color void FXImage::render_true_32(void *xim,FXuchar *img){ register FXuchar *pix=(FXuchar*)((XImage*)xim)->data; register FXuint jmp=((XImage*)xim)->bytes_per_line-(width<<2); register FXPixel val; register FXint w,h; // Byte order matches if(((XImage*)xim)->byte_order == FOX_BIGENDIAN){ FXTRACE((150,"True MSB/LSB 32bpp render\n")); h=height-1; do{ w=width-1; do{ *((FXuint*)pix)=visual->rpix[1][img[0]] | visual->gpix[1][img[1]] | visual->bpix[1][img[2]]; img+=4; pix+=4; } while(--w>=0); pix+=jmp; } while(--h>=0); } // MSB Byte order else if(((XImage*)xim)->byte_order==MSBFirst){ FXTRACE((150,"True MSB 32bpp render\n")); h=height-1; do{ w=width-1; do{ val=visual->rpix[1][img[0]] | visual->gpix[1][img[1]] | visual->bpix[1][img[2]]; pix[0]=(FXuchar)(val>>24); pix[1]=(FXuchar)(val>>16); pix[2]=(FXuchar)(val>>8); pix[3]=(FXuchar)val; img+=4; pix+=4; } while(--w>=0); pix+=jmp; } while(--h>=0); } // LSB Byte order else{ FXTRACE((150,"True LSB 32bpp render\n")); h=height-1; do{ w=width-1; do{ val=visual->rpix[1][img[0]] | visual->gpix[1][img[1]] | visual->bpix[1][img[2]]; pix[0]=(FXuchar)val; pix[1]=(FXuchar)(val>>8); pix[2]=(FXuchar)(val>>16); pix[3]=(FXuchar)(val>>24); img+=4; pix+=4; } while(--w>=0); pix+=jmp; } while(--h>=0); } } // True 16 bit color void FXImage::render_true_16_fast(void *xim,FXuchar *img){ register FXuint jmp=((XImage*)xim)->bytes_per_line-(width<<1); register FXuchar *pix=(FXuchar*)((XImage*)xim)->data; register FXPixel val; register FXint w,h; // Byte order matches if(((XImage*)xim)->byte_order == FOX_BIGENDIAN){ FXTRACE((150,"True MSB/LSB 16bpp 5,6,5/5,5,5 render nearest\n")); h=height-1; do{ w=width-1; do{ *((FXushort*)pix)=visual->rpix[1][img[0]] | visual->gpix[1][img[1]] | visual->bpix[1][img[2]]; img+=4; pix+=2; } while(--w>=0); pix+=jmp; } while(--h>=0); } // MSB Byte order else if(((XImage*)xim)->byte_order==MSBFirst){ FXTRACE((150,"True MSB 16bpp 5,6,5/5,5,5 render nearest\n")); h=height-1; do{ w=width-1; do{ val=visual->rpix[1][img[0]] | visual->gpix[1][img[1]] | visual->bpix[1][img[2]]; pix[0]=(FXuchar)(val>>8); pix[1]=(FXuchar)val; img+=4; pix+=2; } while(--w>=0); pix+=jmp; } while(--h>=0); } // LSB Byte order else{ FXTRACE((150,"True LSB 16bpp 5,6,5/5,5,5 render nearest\n")); h=height-1; do{ w=width-1; do{ val=visual->rpix[1][img[0]] | visual->gpix[1][img[1]] | visual->bpix[1][img[2]]; pix[0]=(FXuchar)val; pix[1]=(FXuchar)(val>>8); img+=4; pix+=2; } while(--w>=0); pix+=jmp; } while(--h>=0); } } // True 16 bit color, dithered void FXImage::render_true_16_dither(void *xim,FXuchar *img){ register FXuint jmp=((XImage*)xim)->bytes_per_line-(width<<1); register FXuchar *pix=(FXuchar*)((XImage*)xim)->data; register FXPixel val; register FXint w,h,d; // Byte order matches if(((XImage*)xim)->byte_order == FOX_BIGENDIAN){ FXTRACE((150,"True MSB/LSB 16bpp 5,6,5/5,5,5 render dither\n")); h=height-1; do{ w=width-1; do{ d=((h&3)<<2)|(w&3); *((FXushort*)pix)=visual->rpix[d][img[0]] | visual->gpix[d][img[1]] | visual->bpix[d][img[2]]; img+=4; pix+=2; } while(--w>=0); pix+=jmp; } while(--h>=0); } // MSB Byte order else if(((XImage*)xim)->byte_order==MSBFirst){ FXTRACE((150,"True MSB 16bpp 5,6,5/5,5,5 render dither\n")); h=height-1; do{ w=width-1; do{ d=((h&3)<<2)|(w&3); val=visual->rpix[d][img[0]] | visual->gpix[d][img[1]] | visual->bpix[d][img[2]]; pix[0]=(FXuchar)(val>>8); pix[1]=(FXuchar)val; img+=4; pix+=2; } while(--w>=0); pix+=jmp; } while(--h>=0); } // LSB Byte order else{ FXTRACE((150,"True LSB 16bpp 5,6,5/5,5,5 render dither\n")); h=height-1; do{ w=width-1; do{ d=((h&3)<<2)|(w&3); val=visual->rpix[d][img[0]] | visual->gpix[d][img[1]] | visual->bpix[d][img[2]]; pix[0]=(FXuchar)val; pix[1]=(FXuchar)(val>>8); img+=4; pix+=2; } while(--w>=0); pix+=jmp; } while(--h>=0); } } // True 8 bit color void FXImage::render_true_8_fast(void *xim,FXuchar *img){ register FXuint jmp=((XImage*)xim)->bytes_per_line-width; register FXuchar *pix=(FXuchar*)((XImage*)xim)->data; register FXint w,h; FXTRACE((150,"True MSB/LSB 8bpp render nearest\n")); h=height-1; do{ w=width-1; do{ *pix=visual->rpix[1][img[0]] | visual->gpix[1][img[1]] | visual->bpix[1][img[2]]; img+=4; pix++; } while(--w>=0); pix+=jmp; } while(--h>=0); } // True 8 bit color, dithered void FXImage::render_true_8_dither(void *xim,FXuchar *img){ register FXuint jmp=((XImage*)xim)->bytes_per_line-width; register FXuchar *pix=(FXuchar*)((XImage*)xim)->data; register FXint w,h,d; FXTRACE((150,"True MSB/LSB 8bpp render dither\n")); h=height-1; do{ w=width-1; do{ d=((h&3)<<2)|(w&3); *pix=visual->rpix[d][img[0]] | visual->gpix[d][img[1]] | visual->bpix[d][img[2]]; img+=4; pix++; } while(--w>=0); pix+=jmp; } while(--h>=0); } // Render 4 bit index color mode void FXImage::render_index_4_fast(void *xim,FXuchar *img){ register FXuchar *pix=(FXuchar*)((XImage*)xim)->data; register FXuint jmp=((XImage*)xim)->bytes_per_line-width; register FXuint val,half; register FXint w,h; if(((XImage*)xim)->byte_order==MSBFirst){ // MSB FXTRACE((150,"Index MSB 4bpp render nearest\n")); h=height-1; do{ w=width-1; half=0; do{ val=visual->lut[visual->rpix[1][img[0]]+visual->gpix[1][img[1]]+visual->bpix[1][img[2]]]; if(half) *pix++|=val; else *pix=val<<4; half^=1; img+=4; } while(--w>=0); pix+=jmp; } while(--h>=0); } else{ // LSB FXTRACE((150,"Index LSB 4bpp render nearest\n")); h=height-1; do{ w=width-1; half=0; do{ val=visual->lut[visual->rpix[1][img[0]]+visual->gpix[1][img[1]]+visual->bpix[1][img[2]]]; if(half) *pix++|=val<<4; else *pix=val; half^=1; img+=4; } while(--w>=0); pix+=jmp; } while(--h>=0); } } // Render 4 bit index color mode void FXImage::render_index_4_dither(void *xim,FXuchar *img){ register FXuchar *pix=(FXuchar*)((XImage*)xim)->data; register FXuint jmp=((XImage*)xim)->bytes_per_line-width; register FXuint val,half,d; register FXint w,h; if(((XImage*)xim)->byte_order==MSBFirst){ // MSB FXTRACE((150,"Index MSB 4bpp render dither\n")); h=height-1; do{ w=width-1; half=0; do{ d=((h&3)<<2)|(w&3); val=visual->lut[visual->rpix[d][img[0]]+visual->gpix[d][img[1]]+visual->bpix[d][img[2]]]; if(half) *pix++|=val; else *pix=val<<4; half^=1; img+=4; } while(--w>=0); pix+=jmp; } while(--h>=0); } else{ // LSB FXTRACE((150,"Index LSB 4bpp render dither\n")); h=height-1; do{ w=width-1; half=0; do{ d=((h&3)<<2)|(w&3); val=visual->lut[visual->rpix[d][img[0]]+visual->gpix[d][img[1]]+visual->bpix[d][img[2]]]; if(half) *pix++|=val<<4; else *pix=val; half^=1; img+=4; } while(--w>=0); pix+=jmp; } while(--h>=0); } } // Render 8 bit index color mode void FXImage::render_index_8_fast(void *xim,FXuchar *img){ register FXuint jmp=((XImage*)xim)->bytes_per_line-width; register FXuchar *pix=(FXuchar*)((XImage*)xim)->data; register FXint w,h; FXTRACE((150,"Index MSB/LSB 8bpp render nearest\n")); h=height-1; do{ w=width-1; do{ *pix=visual->lut[visual->rpix[1][img[0]]+visual->gpix[1][img[1]]+visual->bpix[1][img[2]]]; img+=4; pix++; } while(--w>=0); pix+=jmp; } while(--h>=0); } // Render 8 bit index color mode void FXImage::render_index_8_dither(void *xim,FXuchar *img){ register FXuint jmp=((XImage*)xim)->bytes_per_line-width; register FXuchar *pix=(FXuchar*)((XImage*)xim)->data; register FXint w,h,d; FXTRACE((150,"Index MSB/LSB 8bpp render dither\n")); h=height-1; do{ w=width-1; do{ d=((h&3)<<2)|(w&3); *pix=visual->lut[visual->rpix[d][img[0]]+visual->gpix[d][img[1]]+visual->bpix[d][img[2]]]; img+=4; pix++; } while(--w>=0); pix+=jmp; } while(--h>=0); } // Render generic N bit index color mode void FXImage::render_index_N_fast(void *xim,FXuchar *img){ register FXint x,y; FXTRACE((150,"Index MSB/LSB N bpp render nearest\n")); y=0; do{ x=0; do{ XPutPixel(((XImage*)xim),x,y,visual->lut[visual->rpix[1][img[0]]+visual->gpix[1][img[1]]+visual->bpix[1][img[2]]]); img+=4; } while(++xlut[visual->rpix[d][img[0]]+visual->gpix[d][img[1]]+visual->bpix[d][img[2]]]); img+=4; } while(++xdata; register FXuint jmp=((XImage*)xim)->bytes_per_line-width; register FXint w,h; FXTRACE((150,"Gray MSB/LSB 8bpp render nearest\n")); h=height-1; do{ w=width-1; do{ *pix=visual->gpix[1][(77*img[0]+151*img[1]+29*img[2])>>8]; img+=4; pix++; } while(--w>=0); pix+=jmp; } while(--h>=0); } // Render 8 bit gray mode void FXImage::render_gray_8_dither(void *xim,FXuchar *img){ register FXuchar *pix=(FXuchar*)((XImage*)xim)->data; register FXuint jmp=((XImage*)xim)->bytes_per_line-width; register FXint w,h; FXTRACE((150,"Gray MSB/LSB 8bpp render dither\n")); h=height-1; do{ w=width-1; do{ *pix=visual->gpix[((h&3)<<2)|(w&3)][(77*img[0]+151*img[1]+29*img[2])>>8]; img+=4; pix++; } while(--w>=0); pix+=jmp; } while(--h>=0); } // Render generic N bit gray mode void FXImage::render_gray_N_fast(void *xim,FXuchar *img){ register FXint x,y; FXTRACE((150,"Gray MSB/LSB N bpp render nearest\n")); y=0; do{ x=0; do{ XPutPixel(((XImage*)xim),x,y,visual->gpix[1][(77*img[0]+151*img[1]+29*img[2])>>8]); img+=4; } while(++xgpix[((y&3)<<2)|(x&3)][(77*img[0]+151*img[1]+29*img[2])>>8]); img+=4; } while(++xgpix[1][(77*img[0]+151*img[1]+29*img[2])>>8]); img+=4; } while(++xgpix[((y&3)<<2)|(x&3)][(77*img[0]+151*img[1]+29*img[2])>>8]); img+=4; } while(++xvisual; dd=visual->getDepth(); // Turn it on iff both supported and desired #ifdef HAVE_XSHM_H if(options&IMAGE_SHMI) shmi=getApp()->shmi; #endif // First try XShm #ifdef HAVE_XSHM_H if(shmi){ xim=XShmCreateImage(DISPLAY(getApp()),vis,dd,(dd==1)?XYPixmap:ZPixmap,NULL,&shminfo,width,height); if(!xim){ shmi=0; } if(shmi){ shminfo.shmid=shmget(IPC_PRIVATE,xim->bytes_per_line*xim->height,IPC_CREAT|0777); if(shminfo.shmid==-1){ xim->data=NULL; XDestroyImage(xim); xim=NULL; shmi=0; } if(shmi){ shminfo.shmaddr=xim->data=(char*)shmat(shminfo.shmid,0,0); shminfo.readOnly=false; XShmAttach(DISPLAY(getApp()),&shminfo); FXTRACE((150,"RGBPixmap XSHM attached at memory=%p (%d bytes)\n",xim->data,xim->bytes_per_line*xim->height)); } } } #endif // Try the old fashioned way if(!shmi){ xim=XCreateImage(DISPLAY(getApp()),vis,dd,(dd==1)?XYPixmap:ZPixmap,0,NULL,width,height,32,0); if(!xim){ throw FXImageException("unable to render image"); } // Try create temp pixel store if(!FXMALLOC(&xim->data,char,xim->bytes_per_line*height)){ throw FXMemoryException("unable to render image"); } } // Should have succeeded FXASSERT(xim); FXTRACE((150,"im width = %d\n",xim->width)); FXTRACE((150,"im height = %d\n",xim->height)); FXTRACE((150,"im format = %s\n",xim->format==XYBitmap?"XYBitmap":xim->format==XYPixmap?"XYPixmap":"ZPixmap")); FXTRACE((150,"im byte_order = %s\n",(xim->byte_order==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150,"im bitmap_unit = %d\n",xim->bitmap_unit)); FXTRACE((150,"im bitmap_bit_order = %s\n",(xim->bitmap_bit_order==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150,"im bitmap_pad = %d\n",xim->bitmap_pad)); FXTRACE((150,"im bitmap_unit = %d\n",xim->bitmap_unit)); FXTRACE((150,"im depth = %d\n",xim->depth)); FXTRACE((150,"im bytes_per_line = %d\n",xim->bytes_per_line)); FXTRACE((150,"im bits_per_pixel = %d\n",xim->bits_per_pixel)); // Determine what to do switch(visual->getType()){ case VISUALTYPE_TRUE: switch(xim->bits_per_pixel){ case 32: render_true_32(xim,(FXuchar*)data); break; case 24: render_true_24(xim,(FXuchar*)data); break; case 15: case 16: if(options&IMAGE_NEAREST) render_true_16_fast(xim,(FXuchar*)data); else render_true_16_dither(xim,(FXuchar*)data); break; case 8: if(options&IMAGE_NEAREST) render_true_8_fast(xim,(FXuchar*)data); else render_true_8_dither(xim,(FXuchar*)data); break; default: if(options&IMAGE_NEAREST) render_true_N_fast(xim,(FXuchar*)data); else render_true_N_dither(xim,(FXuchar*)data); break; } break; case VISUALTYPE_GRAY: switch(xim->bits_per_pixel){ case 1: if(options&IMAGE_NEAREST) render_mono_1_fast(xim,(FXuchar*)data); else render_mono_1_dither(xim,(FXuchar*)data); break; case 8: if(options&IMAGE_NEAREST) render_gray_8_fast(xim,(FXuchar*)data); else render_gray_8_dither(xim,(FXuchar*)data); break; default: if(options&IMAGE_NEAREST) render_gray_N_fast(xim,(FXuchar*)data); else render_gray_N_dither(xim,(FXuchar*)data); break; } break; case VISUALTYPE_INDEX: switch(xim->bits_per_pixel){ case 4: if(options&IMAGE_NEAREST) render_index_4_fast(xim,(FXuchar*)data); else render_index_4_dither(xim,(FXuchar*)data); break; case 8: if(options&IMAGE_NEAREST) render_index_8_fast(xim,(FXuchar*)data); else render_index_8_dither(xim,(FXuchar*)data); break; default: if(options&IMAGE_NEAREST) render_index_N_fast(xim,(FXuchar*)data); else render_index_N_dither(xim,(FXuchar*)data); break; } break; case VISUALTYPE_MONO: if(options&IMAGE_NEAREST) render_mono_1_fast(xim,(FXuchar*)data); else render_mono_1_dither(xim,(FXuchar*)data); case VISUALTYPE_UNKNOWN: break; } // Transfer image with shared memory #ifdef HAVE_XSHM_H if(shmi){ XShmPutImage(DISPLAY(getApp()),xid,gc,xim,0,0,0,0,width,height,False); XSync(DISPLAY(getApp()),False); FXTRACE((150,"RGBPixmap XSHM detached at memory=%p (%d bytes)\n",xim->data,xim->bytes_per_line*xim->height)); XShmDetach(DISPLAY(getApp()),&shminfo); xim->data=NULL; XDestroyImage(xim); shmdt(shminfo.shmaddr); shmctl(shminfo.shmid,IPC_RMID,0); } #endif // Transfer the image old way if(!shmi){ XPutImage(DISPLAY(getApp()),xid,gc,xim,0,0,0,0,width,height); FXFREE(&xim->data); XDestroyImage(xim); } XFreeGC(DISPLAY(getApp()),gc); } } } #else void FXImage::render(){ if(xid){ register FXint bytes_per_line,skip,h,w; register FXuchar *src,*dst; BITMAPINFO bmi; FXuchar *pixels; HDC hdcmem; FXTRACE((100,"%s::render %p\n",getClassName(),this)); // Fill with pixels if there is data if(data && 0>8))>>8; // tmp=FXGREENVAL(fg)*s+FXGREENVAL(bg)*t+127; g=(tmp+(tmp>>8))>>8; // tmp=FXBLUEVAL(fg)*s+FXBLUEVAL(bg)*t+127; b=(tmp+(tmp>>8))>>8; // return FXRGB(r,g,b); // } /* s=pix[3]; t=s^0xff; w=pix[0]*s+r*t; pix[0]=(w+(w>>8))>>8; w=pix[1]*s+g*t; pix[1]=(w+(w>>8))>>8; w=pix[2]*s+b*t; pix[2]=(w+(w>>8))>>8; s=pix[3]; */ // Fill image with color void FXImage::fill(FXColor color){ if(data){ register FXColor *pix=data; register FXColor *end=pix+height*width; do{ *pix++=color; }while(pix>8))>>8; w=pix[1]*s+g; pix[1]=(w+(w>>8))>>8; w=pix[2]*s+b; pix[2]=(w+(w>>8))>>8; w=pix[3]*s+a; pix[3]=(w+(w>>8))>>8; pix+=4; } while(pix>8)+128)>>8); w=(pix[1]-g)*s; pix[1]=g+((w+(w>>8)+128)>>8); w=(pix[2]-b)*s; pix[2]=b+((w+(w>>8)+128)>>8); pix+=4; } while(pixgetDepth(); XFreePixmap(DISPLAY(getApp()),xid); xid=XCreatePixmap(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),w,h,dd); if(!xid){ throw FXImageException("unable to resize image"); } #else DeleteObject(xid); HDC hdc=::GetDC(GetDesktopWindow()); xid=CreateCompatibleBitmap(hdc,w,h); ::ReleaseDC(GetDesktopWindow(),hdc); if(!xid){ throw FXImageException("unable to resize image"); } #endif } } // Resize data array if(data){ if(!(options&IMAGE_OWNED)){ // Need to own array if(!FXMALLOC(&data,FXColor,w*h)){ throw FXMemoryException("unable to resize image"); } options|=IMAGE_OWNED; } else if(w*h!=width*height){ if(!FXRESIZE(&data,FXColor,w*h)){ throw FXMemoryException("unable to resize image"); } } } // Remember new size width=w; height=h; } static void hscalergba(FXuchar *dst,const FXuchar* src,FXint dw,FXint dh,FXint sw,FXint ){ register FXint fin,fout,ar,ag,ab,aa; register FXint ss=4*sw; register FXint ds=4*dw; register FXuchar *end=dst+ds*dh; register FXuchar *d; register const FXuchar *s; do{ s=src; src+=ss; d=dst; dst+=ds; fin=dw; fout=sw; ar=ag=ab=aa=0; while(1){ if(fin=dst) break; } } } while(dst=dd) break; } } } while(dst>1; p=dst; do{ j=0; x=xs>>1; q=src+(y>>16)*sw; do{ p[j]=q[x>>16]; x+=xs; } while(++j 1024x1024 440025862 1024x1024 -> 16x16 25313450 Nearest neighbor: 16x16 -> 1024x1024 15717582 1024x1024 -> 16x16 32508 extern FXlong fxgetticks(); static FXlong __starttick__,__endtick__; __starttick__=fxgetticks(); __endtick__ =fxgetticks(); fprintf(stderr,"ticks=%lld\n",__endtick__-__starttick__); */ // Resize drawable to the specified width and height void FXImage::scale(FXint w,FXint h,FXint quality){ if(w<1) w=1; if(h<1) h=1; FXTRACE((100,"%s::scale(%d,%d)\n",getClassName(),w,h)); if(w!=width || h!=height){ if(data){ register FXint ow=width; register FXint oh=height; FXColor *interim; switch(quality){ case 0: // Copy to old buffer if(!FXMEMDUP(&interim,data,FXColor,ow*oh)){ throw FXMemoryException("unable to scale image"); } // Resize the pixmap and target buffer resize(w,h); // Fast nearest neighbor scale scalenearest(data,interim,w,h,ow,oh); // Free old buffer FXFREE(&interim); break; default: // Allocate interim buffer if(!FXMALLOC(&interim,FXColor,w*oh)){ throw FXMemoryException("unable to scale image"); } // Scale horizontally first, placing result into interim buffer if(w==ow){ memcpy((FXuchar*)interim,(FXuchar*)data,w*oh*4); } else{ hscalergba((FXuchar*)interim,(FXuchar*)data,w,oh,ow,oh); } // Resize the pixmap and target buffer resize(w,h); // Scale vertically from the interim buffer into target buffer if(h==oh){ memcpy((FXuchar*)data,(FXuchar*)interim,w*h*4); } else{ vscalergba((FXuchar*)data,(FXuchar*)interim,w,h,w,oh); } // Free interim buffer FXFREE(&interim); break; } render(); } else{ resize(w,h); } } } // Mirror image horizontally and/or vertically void FXImage::mirror(bool horizontal,bool vertical){ FXTRACE((100,"%s::mirror(%d,%d)\n",getClassName(),horizontal,vertical)); if(horizontal || vertical){ if(data){ register FXColor *paa,*pa,*pbb,*pb,t; if(vertical && height>1){ // Mirror vertically paa=data; pbb=data+width*(height-1); do{ pa=paa; paa+=width; pb=pbb; pbb-=width; do{ t=*pa; *pa++=*pb; *pb++=t; } while(pa1){ // Mirror horizontally paa=data; pbb=data+width*height; do{ pa=paa; paa+=width; pb=paa; do{ t=*--pb; *pb=*pa; *pa++=t; } while(pa0){ y=height-1; d=-1; } else { shear=-shear; y=0; d=1; } pp=in; ppp=pp+height*dp; qq=out; do{ p=pp; pp+=dp; q=qq; qq+=dq; z=(y*shear-1)/(height-1); y+=d; s=z&255; k=q+(z>>8)*4; while(q>8; q[1]=((g-p[1])*s+(p[1]<<8)+127)>>8; q[2]=((b-p[2])*s+(p[2]<<8)+127)>>8; q[3]=((a-p[3])*s+(p[3]<<8)+127)>>8; q+=4; p+=4; while(p>8; q[1]=((p[1-4]-p[1])*s+(p[1]<<8)+127)>>8; q[2]=((p[2-4]-p[2])*s+(p[2]<<8)+127)>>8; q[3]=((p[3-4]-p[3])*s+(p[3]<<8)+127)>>8; q+=4; p+=4; } q[0]=((p[0-4]-r)*s+(r<<8)+127)>>8; q[1]=((p[1-4]-g)*s+(g<<8)+127)>>8; q[2]=((p[2-4]-b)*s+(b<<8)+127)>>8; q[3]=((p[3-4]-a)*s+(a<<8)+127)>>8; q+=4; while(q0){ x=width-1; d=-1; } else { shear=-shear; x=0; d=1; } pp=in+dp*oheight; ppp=pp+dp; qq=out+dp*nheight; do{ p=pp-dp*oheight; q=qq-dp*nheight; z=(x*shear-1)/(width-1); x+=d; s=z&255; k=q+(z>>8)*dp; while(q>8; q[1]=((g-p[1])*s+(p[1]<<8)+127)>>8; q[2]=((b-p[2])*s+(p[2]<<8)+127)>>8; q[3]=((a-p[3])*s+(p[3]<<8)+127)>>8; q+=dp; p+=dp; while(p>8; q[1]=((p[1-dp]-p[1])*s+(p[1]<<8)+127)>>8; q[2]=((p[2-dp]-p[2])*s+(p[2]<<8)+127)>>8; q[3]=((p[3-dp]-p[3])*s+(p[3]<<8)+127)>>8; q+=dp; p+=dp; } q[0]=((p[0-dp]-r)*s+(r<<8)+127)>>8; q[1]=((p[1-dp]-g)*s+(g<<8)+127)>>8; q[2]=((p[2-dp]-b)*s+(b<<8)+127)>>8; q[3]=((p[3-dp]-a)*s+(a<<8)+127)>>8; q+=dp; while(q1 && height>1){ if(data){ register FXColor *paa,*pbb,*end,*pa,*pb; register FXint size=width*height; FXColor *olddata; if(!FXMEMDUP(&olddata,data,FXColor,size)){ throw FXMemoryException("unable to rotate image"); } switch(degrees){ case 90: resize(height,width); paa=data; pbb=olddata+(height-1); end=data+size; do{ pa=paa; paa+=width; pb=pbb; pbb-=1; do{ *pa=*pb; pa+=1; pb+=height; } while(pa=width || y>=height || x+w<=0 || y+h<=0){ fxerror("%s::crop: bad arguments.\n",getClassName()); } FXTRACE((100,"%s::crop(%d,%d,%d,%d)\n",getClassName(),x,y,w,h)); if(data){ register FXColor *pnn,*poo,*yyy,*pn,*po,*xx; register FXint ow=width; register FXint oh=height; register FXint nw=w; register FXint nh=h; register FXint cw; register FXint ch; FXColor *olddata; if(!FXMEMDUP(&olddata,data,FXColor,width*height)){ throw FXMemoryException("unable to crop image"); } resize(nw,nh); pnn=data; yyy=data+nw*nh; do{ *pnn++=color; } while(pnn0); FXASSERT(ch>0); yyy=pnn+nw*ch; do{ pn=pnn; po=poo; xx=pnn+cw; do{ *pn++=*po++; } while(pn>8); FXint oldw=width; FXTRACE((100,"%s::xshear(%d)\n",getClassName(),shear)); if(data){ FXColor *olddata; if(!FXMEMDUP(&olddata,data,FXColor,width*height)){ throw FXMemoryException("unable to xshear image"); } resize(neww,height); shearx((FXuchar*)data,(FXuchar*)olddata,neww,oldw,height,shear,clr); FXFREE(&olddata); render(); } else{ resize(neww,height); } } // Shear image vertically void FXImage::yshear(FXint shear,FXColor clr){ FXint newh=height+((FXABS(shear)+255)>>8); FXint oldh=height; FXTRACE((100,"%s::yshear(%d)\n",getClassName(),shear)); if(data){ FXColor *olddata; if(!FXMEMDUP(&olddata,data,FXColor,width*height)){ throw FXMemoryException("unable to yshear image"); } resize(width,newh); sheary((FXuchar*)data,(FXuchar*)olddata,width,newh,oldh,shear,clr); FXFREE(&olddata); render(); } else{ resize(width,newh); } } /* // Fill with diagonal gradient RGB static void dgradientrgba(FXuchar *dst,FXint w,FXint h,FXint r1,FXint g1,FXint b1,FXint a1,FXint r2,FXint g2,FXint b2,FXint a2){ register FXint rr,gg,bb,aa,drx,dgx,dbx,dax,dry,dgy,dby,day,x,y; register FXuchar *ptr=dst; FXuchar xtable[4][2048]; FXuchar ytable[4][2048]; FXASSERT(w>0 && h>0); FXASSERT(w<2048 && h<2048); drx=dry=((r2-r1)<<16); dgx=dgy=((g2-g1)<<16); dbx=dby=((b2-b1)<<16); dax=day=((a2-a1)<<16); rr=(r1<<16)+32768; gg=(g1<<16)+32768; bb=(b1<<16)+32768; aa=(a1<<16)+32768; drx/=(w-1)*2; dgx/=(w-1)*2; dbx/=(w-1)*2; dax/=(w-1)*2; x=w; do{ --x; xtable[0][x]=rr>>16; rr+=drx; xtable[1][x]=gg>>16; gg+=dgx; xtable[2][x]=bb>>16; bb+=dbx; xtable[3][x]=aa>>16; aa+=dax; } while(x); rr=32768; gg=32768; bb=32768; aa=32768; dry/=(h-1)*2; dgy/=(h-1)*2; dby/=(h-1)*2; day/=(h-1)*2; y=h; do{ --y; ytable[0][y]=rr>>16; rr+=dry; ytable[1][y]=gg>>16; gg+=dgy; ytable[2][y]=bb>>16; bb+=dby; ytable[3][y]=aa>>16; aa+=day; } while(y); y=h; do{ --y; x=w; do{ --x; ptr[0]=xtable[0][x]+ytable[0][y]; ptr[1]=xtable[1][x]+ytable[1][y]; ptr[2]=xtable[2][x]+ytable[2][y]; ptr[3]=xtable[3][x]+ytable[3][y]; ptr+=4; } while(x); } while(y); } */ // Fill horizontal gradient void FXImage::hgradient(FXColor left,FXColor right){ register FXint rr,gg,bb,aa,dr,dg,db,da,r1,g1,b1,a1,r2,g2,b2,a2,x; register FXuchar *ptr=(FXuchar*)data; register FXuchar *prv=(FXuchar*)data; if(ptr && width>1 && height>1){ r1=FXREDVAL(left); r2=FXREDVAL(right); rr=(r1<<16)+32768; dr=((r2-r1)<<16)/(width-1); g1=FXGREENVAL(left); g2=FXGREENVAL(right); gg=(g1<<16)+32768; dg=((g2-g1)<<16)/(width-1); b1=FXBLUEVAL(left); b2=FXBLUEVAL(right); bb=(b1<<16)+32768; db=((b2-b1)<<16)/(width-1); a1=FXALPHAVAL(left); a2=FXALPHAVAL(right); aa=(a1<<16)+32768; da=((a2-a1)<<16)/(width-1); x=width; do{ ptr[0]=rr>>16; rr+=dr; ptr[1]=gg>>16; gg+=dg; ptr[2]=bb>>16; bb+=db; ptr[3]=aa>>16; aa+=da; ptr+=4; } while(--x); x=width*(height-1); do{ ptr[0]=prv[0]; ptr[1]=prv[1]; ptr[2]=prv[2]; ptr[3]=prv[3]; ptr+=4; prv+=4; } while(--x); } } // Fill vertical gradient void FXImage::vgradient(FXColor top,FXColor bottom){ register FXint rr,gg,bb,aa,dr,dg,db,da,r1,g1,b1,a1,r2,g2,b2,a2,x,y; register FXuchar *ptr=(FXuchar*)data; if(ptr && width>1 && height>1){ r1=FXREDVAL(top); r2=FXREDVAL(bottom); rr=(r1<<16)+32768; dr=((r2-r1)<<16)/(height-1); g1=FXGREENVAL(top); g2=FXGREENVAL(bottom); gg=(g1<<16)+32768; dg=((g2-g1)<<16)/(height-1); b1=FXBLUEVAL(top); b2=FXBLUEVAL(bottom); bb=(b1<<16)+32768; db=((b2-b1)<<16)/(height-1); a1=FXALPHAVAL(top); a2=FXALPHAVAL(bottom); aa=(a1<<16)+32768; da=((a2-a1)<<16)/(height-1); y=height; do{ r1=rr>>16; rr+=dr; g1=gg>>16; gg+=dg; b1=bb>>16; bb+=db; a1=aa>>16; aa+=da; x=width; do{ ptr[0]=r1; ptr[1]=g1; ptr[2]=b1; ptr[3]=a1; ptr+=4; } while(--x); } while(--y); } } // Fill with gradient void FXImage::gradient(FXColor topleft,FXColor topright,FXColor bottomleft,FXColor bottomright){ register FXint rl,gl,bl,al,rr,gr,br,ar,drl,dgl,dbl,dal,drr,dgr,dbr,dar,r,g,b,a,dr,dg,db,da,x,y; register FXint rtl,gtl,btl,atl,rtr,gtr,btr,atr,rbl,gbl,bbl,abl,rbr,gbr,bbr,abr; register FXuchar *ptr=(FXuchar*)data; if(ptr && width>1 && height>1){ rtl=FXREDVAL(topleft); rbl=FXREDVAL(bottomleft); rl=(rtl<<16)+32768; drl=((rbl-rtl)<<16)/(height-1); gtl=FXGREENVAL(topleft); gbl=FXGREENVAL(bottomleft); gl=(gtl<<16)+32768; dgl=((gbl-gtl)<<16)/(height-1); btl=FXBLUEVAL(topleft); bbl=FXBLUEVAL(bottomleft); bl=(btl<<16)+32768; dbl=((bbl-btl)<<16)/(height-1); rtr=FXREDVAL(topright); rbr=FXREDVAL(bottomright); rr=(rtr<<16)+32768; drr=((rbr-rtr)<<16)/(height-1); gtr=FXGREENVAL(topright); gbr=FXGREENVAL(bottomright); gr=(gtr<<16)+32768; dgr=((gbr-gtr)<<16)/(height-1); btr=FXBLUEVAL(topright); bbr=FXBLUEVAL(bottomright); br=(btr<<16)+32768; dbr=((bbr-btr)<<16)/(height-1); atl=FXALPHAVAL(topleft); abl=FXALPHAVAL(bottomleft); al=(atl<<16)+32768; dal=((abl-atl)<<16)/(height-1); atr=FXALPHAVAL(topright); abr=FXALPHAVAL(bottomright); ar=(atr<<16)+32768; dar=((abr-atr)<<16)/(height-1); y=height; do{ r=rl; dr=(rr-rl)/(width-1); g=gl; dg=(gr-gl)/(width-1); b=bl; db=(br-bl)/(width-1); a=al; da=(ar-al)/(width-1); x=width; do{ ptr[0]=r>>16; r+=dr; ptr[1]=g>>16; g+=dg; ptr[2]=b>>16; b+=db; ptr[3]=a>>16; a+=da; ptr+=4; } while(--x); rl+=drl; gl+=dgl; bl+=dbl; al+=dal; rr+=drr; gr+=dgr; br+=dbr; ar+=dar; } while(--y); } } #ifdef WIN32 // Return the device context; the image already selected into it FXID FXImage::GetDC() const { HDC hdc=::CreateCompatibleDC(NULL); SelectObject(hdc,(HBITMAP)xid); return hdc; } // Release it (no-op) int FXImage::ReleaseDC(FXID hdc) const { return ::DeleteDC((HDC)hdc); } #endif // Attach pixel buffer to image, and assume ownership of it if IMAGE_OWNED is passed void FXImage::setData(FXColor *pix,FXuint opts){ // Free old data if(options&IMAGE_OWNED){ FXFREE(&data); } // Only own pixel buffer if one was passed if(pix && (opts&IMAGE_OWNED)){ options|=IMAGE_OWNED; } else{ options&=~IMAGE_OWNED; } // Set the pointer data=pix; } // Populate the image with new pixel data void FXImage::setData(FXColor *pix,FXuint opts,FXint w,FXint h){ // Free old data if(options&IMAGE_OWNED){ FXFREE(&data); } // Resize pixmap resize(w,h); // Only own pixel buffer if one was passed if(pix && (opts&IMAGE_OWNED)){ options|=IMAGE_OWNED; } else{ options&=~IMAGE_OWNED; } // Set the pointer data=pix; } // Change options void FXImage::setOptions(FXuint opts){ options=(options&~IMAGE_MASK) | (opts&IMAGE_MASK); } // Save pixel data only bool FXImage::savePixels(FXStream& store) const { FXuint size=width*height; store.save(data,size); return true; } // Load pixel data only bool FXImage::loadPixels(FXStream& store){ FXuint size=width*height; if(options&IMAGE_OWNED){FXFREE(&data);} if(!FXMALLOC(&data,FXColor,size)) return false; store.load(data,size); options|=IMAGE_OWNED; return true; } // Save data void FXImage::save(FXStream& store) const { FXuchar haspixels=(data!=NULL); FXDrawable::save(store); store << options; store << haspixels; if(haspixels) savePixels(store); } // Load data void FXImage::load(FXStream& store){ FXuchar haspixels; FXDrawable::load(store); store >> options; store >> haspixels; if(haspixels) loadPixels(store); } // Clean up FXImage::~FXImage(){ FXTRACE((100,"FXImage::~FXImage %p\n",this)); destroy(); if(options&IMAGE_OWNED){FXFREE(&data);} data=(FXColor*)-1L; } } fox1.6-1.6.57/src/FXImageFrame.cpp000066400000000000000000000123201326741342000163610ustar00rootroot00000000000000/******************************************************************************** * * * I m a g e F r a m e W i d g e t * * * ********************************************************************************* * Copyright (C) 2001,2006 by H. J. Daniel III. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXImageFrame.cpp,v 1.14 2006/01/22 17:58:32 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXImage.h" #include "FXImageFrame.h" /* Notes: - Hacked around so as to support padding also. - Fixed layout to center image if frame is larger. - Fixed serialization also. - Now supports various justification modes */ #define JUSTIFY_MASK (JUSTIFY_HZ_APART|JUSTIFY_VT_APART) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXImageFrame) FXImageFrameMap[]={ FXMAPFUNC(SEL_PAINT,0,FXImageFrame::onPaint), }; // Object implementation FXIMPLEMENT(FXImageFrame,FXFrame,FXImageFrameMap,ARRAYNUMBER(FXImageFrameMap)) // Deserialization FXImageFrame::FXImageFrame(){ image=NULL; } // Construct it FXImageFrame::FXImageFrame(FXComposite* p,FXImage *img,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ image=img; } // Create it all void FXImageFrame::create(){ FXFrame::create(); if(image) image->create(); } // Get default width FXint FXImageFrame::getDefaultWidth(){ register FXint w=0; if(image) w=image->getWidth(); return w+padleft+padright+(border<<1); } // Get default height FXint FXImageFrame::getDefaultHeight(){ register FXint h=0; if(image) h=image->getHeight(); return h+padtop+padbottom+(border<<1); } // Draw the image long FXImageFrame::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXint imgx,imgy,imgw,imgh; dc.setForeground(backColor); if(image){ imgw=image->getWidth(); imgh=image->getHeight(); if(options&JUSTIFY_LEFT) imgx=padleft+border; else if(options&JUSTIFY_RIGHT) imgx=width-padright-border-imgw; else imgx=border+padleft+(width-padleft-padright-(border<<1)-imgw)/2; if(options&JUSTIFY_TOP) imgy=padtop+border; else if(options&JUSTIFY_BOTTOM) imgy=height-padbottom-border-imgh; else imgy=border+padtop+(height-padbottom-padtop-(border<<1)-imgh)/2; dc.fillRectangle(border,border,imgx-border,height-(border<<1)); dc.fillRectangle(imgx+imgw,border,width-border-imgx-imgw,height-(border<<1)); dc.fillRectangle(imgx,border,imgw,imgy-border); dc.fillRectangle(imgx,imgy+imgh,imgw,height-border-imgy-imgh); dc.drawImage(image,imgx,imgy); } else{ dc.fillRectangle(border,border,width-(border<<1),height-(border<<1)); } drawFrame(dc,0,0,width,height); return 1; } // Change image void FXImageFrame::setImage(FXImage* img){ image=img; recalc(); update(); } // Set text justify style void FXImageFrame::setJustify(FXuint style){ FXuint opts=(options&~JUSTIFY_MASK) | (style&JUSTIFY_MASK); if(options!=opts){ options=opts; update(); } } // Get text justify style FXuint FXImageFrame::getJustify() const { return (options&JUSTIFY_MASK); } // Save data void FXImageFrame::save(FXStream& store) const { FXFrame::save(store); store << image; } // Load data void FXImageFrame::load(FXStream& store){ FXFrame::load(store); store >> image; } // Destructor FXImageFrame::~FXImageFrame(){ image=(FXImage*)-1L; } } fox1.6-1.6.57/src/FXImageView.cpp000066400000000000000000000157641326741342000162600ustar00rootroot00000000000000/******************************************************************************** * * * I m a g e V i e w W i d g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXImageView.cpp,v 1.38 2006/01/22 17:58:32 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXImage.h" #include "FXIcon.h" #include "FXComposite.h" #include "FXCanvas.h" #include "FXButton.h" #include "FXScrollBar.h" #include "FXImageView.h" /* Notes: - Should implement DND drags/drops, cut/paste - Right-mouse scroll. */ #define MOUSE_NONE 0 // None in effect #define MOUSE_SCROLL 1 // Scrolling mode using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXImageView) FXImageViewMap[]={ FXMAPFUNC(SEL_PAINT,0,FXImageView::onPaint), FXMAPFUNC(SEL_MOTION,0,FXImageView::onMotion), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXImageView::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXImageView::onRightBtnRelease), }; // Object implementation FXIMPLEMENT(FXImageView,FXScrollArea,FXImageViewMap,ARRAYNUMBER(FXImageViewMap)) // Deserialization FXImageView::FXImageView(){ flags|=FLAG_ENABLED; image=NULL; grabx=0; graby=0; } // Construct and init FXImageView::FXImageView(FXComposite* p,FXImage* img,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXScrollArea(p,opts,x,y,w,h){ flags|=FLAG_ENABLED; target=tgt; message=sel; image=img; } // Create window void FXImageView::create(){ FXScrollArea::create(); if(image) image->create(); } // Detach window void FXImageView::detach(){ FXScrollArea::detach(); if(image) image->detach(); } // Can have focus bool FXImageView::canFocus() const { return true; } // Determine content width of scroll area FXint FXImageView::getContentWidth(){ return image ? image->getWidth() : 1; } // Determine content height of scroll area FXint FXImageView::getContentHeight(){ return image ? image->getHeight() : 1; } // Recalculate layout void FXImageView::layout(){ // Layout scroll bars and viewport FXScrollArea::layout(); update(); flags&=~FLAG_DIRTY; } // Draw visible part of image long FXImageView::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXDCWindow dc(this,event); FXint xx,yy,ww,hh; FXint xl,xr,yt,yb; if(image){ ww=image->getWidth(); hh=image->getHeight(); xx=pos_x; yy=pos_y; if(wwviewport_w) xr=viewport_w; if(yt<0) yt=0; if(yb>viewport_h) yb=viewport_h; dc.fillRectangle(0,0,xr,yt); dc.fillRectangle(0,yt,xl,viewport_h-yt); dc.fillRectangle(xr,0,viewport_w-xr,yb); dc.fillRectangle(xl,yb,viewport_w-xl,viewport_h-yb); } else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } return 1; } // Pressed right button long FXImageView::onRightBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; flags|=FLAG_PRESSED|FLAG_SCROLLING; grabx=ev->win_x-pos_x; graby=ev->win_y-pos_y; return 1; } return 0; } // Released right button long FXImageView::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); flags&=~(FLAG_PRESSED|FLAG_SCROLLING); flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // Handle real or simulated mouse motion long FXImageView::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; if(flags&FLAG_SCROLLING){ setPosition(ev->win_x-grabx,ev->win_y-graby); return 1; } return 0; } // Change image void FXImageView::setImage(FXImage* img){ image=img; recalc(); update(); } // Set the current alignment. void FXImageView::setAlignment(FXuint mode){ FXuint opts=(options&~(IMAGEVIEW_LEFT|IMAGEVIEW_RIGHT|IMAGEVIEW_TOP|IMAGEVIEW_BOTTOM)) | (mode&(IMAGEVIEW_LEFT|IMAGEVIEW_RIGHT|IMAGEVIEW_TOP|IMAGEVIEW_BOTTOM)); if(options!=opts){ options=opts; update(); } } // Get the current alignment. FXuint FXImageView::getAlignment() const { return (options&(IMAGEVIEW_LEFT|IMAGEVIEW_RIGHT|IMAGEVIEW_TOP|IMAGEVIEW_BOTTOM)); } // Save object to stream void FXImageView::save(FXStream& store) const { FXScrollArea::save(store); store << image; } // Load object from stream void FXImageView::load(FXStream& store){ FXScrollArea::load(store); store >> image; } // Destroy FXImageView::~FXImageView(){ image=(FXImage*)-1L; } } fox1.6-1.6.57/src/FXInputDialog.cpp000066400000000000000000000217351326741342000166150ustar00rootroot00000000000000/******************************************************************************** * * * I n p u t D i a l o g B o x * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXInputDialog.cpp,v 1.34 2006/01/22 17:58:32 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXSeparator.h" #include "FXLabel.h" #include "FXButton.h" #include "FXTextField.h" #include "FXPacker.h" #include "FXHorizontalFrame.h" #include "FXVerticalFrame.h" #include "FXInputDialog.h" /* Notes: - This is a useful little class which we should probably have created sooner; I just didn't think of it until now. */ // Padding for buttons #define HORZ_PAD 20 #define VERT_PAD 2 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXInputDialog) FXInputDialogMap[]={ FXMAPFUNC(SEL_COMMAND,FXDialogBox::ID_ACCEPT,FXInputDialog::onCmdAccept), }; // Object implementation FXIMPLEMENT(FXInputDialog,FXDialogBox,FXInputDialogMap,ARRAYNUMBER(FXInputDialogMap)) // Create input dialog box FXInputDialog::FXInputDialog(FXWindow* owner,const FXString& caption,const FXString& label,FXIcon* icon,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(owner,caption,opts|DECOR_TITLE|DECOR_BORDER,x,y,w,h,10,10,10,10, 10,10){ initialize(label,icon); } // Create free floating input dialog box FXInputDialog::FXInputDialog(FXApp* app,const FXString& caption,const FXString& label,FXIcon* icon,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(app,caption,opts|DECOR_TITLE|DECOR_BORDER,x,y,w,h,10,10,10,10, 10,10){ initialize(label,icon); } // Build contents void FXInputDialog::initialize(const FXString& label,FXIcon* icon){ FXuint textopts=TEXTFIELD_ENTER_ONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X; FXHorizontalFrame* buttons=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0,0,0,0,0); new FXButton(buttons,tr("&OK"),NULL,this,ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXButton(buttons,tr("&Cancel"),NULL,this,ID_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXHorizontalSeparator(this,SEPARATOR_GROOVE|LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); FXHorizontalFrame* toppart=new FXHorizontalFrame(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_CENTER_Y,0,0,0,0, 0,0,0,0, 10,10); new FXLabel(toppart,FXString::null,icon,ICON_BEFORE_TEXT|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|LAYOUT_FILL_Y|LAYOUT_FILL_X); FXVerticalFrame* entry=new FXVerticalFrame(toppart,LAYOUT_FILL_X|LAYOUT_CENTER_Y,0,0,0,0, 0,0,0,0); new FXLabel(entry,label,NULL,JUSTIFY_LEFT|ICON_BEFORE_TEXT|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X); if(options&INPUTDIALOG_PASSWORD) textopts|=TEXTFIELD_PASSWD; if(options&INPUTDIALOG_INTEGER) textopts|=TEXTFIELD_INTEGER|JUSTIFY_RIGHT; if(options&INPUTDIALOG_REAL) textopts|=TEXTFIELD_REAL|JUSTIFY_RIGHT; input=new FXTextField(entry,20,this,ID_ACCEPT,textopts,0,0,0,0, 8,8,4,4); limlo=1.0; limhi=0.0; } // Get input string FXString FXInputDialog::getText() const { return input->getText(); } // Set input string void FXInputDialog::setText(const FXString& text){ input->setText(text); } // Change number of visible columns of text void FXInputDialog::setNumColumns(FXint num){ input->setNumColumns(num); } // Return number of visible columns of text FXint FXInputDialog::getNumColumns() const { return input->getNumColumns(); } // We have to do this so as to force the initial text to be seleced FXuint FXInputDialog::execute(FXuint placement){ create(); input->setFocus(); input->selectAll(); show(placement); return getApp()->runModalFor(this); } // Close dialog with an accept, after an validation of the number long FXInputDialog::onCmdAccept(FXObject* sender,FXSelector sel,void* ptr){ if(options&INPUTDIALOG_INTEGER){ FXint iresult; if((sscanf(input->getText().text(),"%d",&iresult)!=1) || (limlo<=limhi && (iresultsetFocus(); input->selectAll(); getApp()->beep(); return 1; } } else if(options&INPUTDIALOG_REAL){ FXdouble dresult; if((sscanf(input->getText().text(),"%lf",&dresult)!=1) || (limlo<=limhi && (dresultsetFocus(); input->selectAll(); getApp()->beep(); return 1; } } FXDialogBox::onCmdAccept(sender,sel,ptr); return 1; } /*******************************************************************************/ // Obtain a string FXbool FXInputDialog::getString(FXString& result,FXWindow* owner,const FXString& caption,const FXString& label,FXIcon* icon){ FXInputDialog inputdialog(owner,caption,label,icon,INPUTDIALOG_STRING,0,0,0,0); inputdialog.setText(result); if(inputdialog.execute()){ result=inputdialog.getText(); return TRUE; } return FALSE; } // Obtain a string, in free floating window FXbool FXInputDialog::getString(FXString& result,FXApp* app,const FXString& caption,const FXString& label,FXIcon* icon){ FXInputDialog inputdialog(app,caption,label,icon,INPUTDIALOG_STRING,0,0,0,0); inputdialog.setText(result); if(inputdialog.execute()){ result=inputdialog.getText(); return TRUE; } return FALSE; } // Obtain an integer FXbool FXInputDialog::getInteger(FXint& result,FXWindow* owner,const FXString& caption,const FXString& label,FXIcon* icon,FXint lo,FXint hi){ FXInputDialog inputdialog(owner,caption,label,icon,INPUTDIALOG_INTEGER,0,0,0,0); inputdialog.setLimits(lo,hi); inputdialog.setText(FXStringVal(FXCLAMP(lo,result,hi))); if(inputdialog.execute()){ result=FXIntVal(inputdialog.getText()); return TRUE; } return FALSE; } // Obtain an integer, in free floating window FXbool FXInputDialog::getInteger(FXint& result,FXApp* app,const FXString& caption,const FXString& label,FXIcon* icon,FXint lo,FXint hi){ FXInputDialog inputdialog(app,caption,label,icon,INPUTDIALOG_INTEGER,0,0,0,0); inputdialog.setLimits(lo,hi); inputdialog.setText(FXStringVal(FXCLAMP(lo,result,hi))); if(inputdialog.execute()){ result=FXIntVal(inputdialog.getText()); return TRUE; } return FALSE; } // Obtain a real FXbool FXInputDialog::getReal(FXdouble& result,FXWindow* owner,const FXString& caption,const FXString& label,FXIcon* icon,FXdouble lo,FXdouble hi){ FXInputDialog inputdialog(owner,caption,label,icon,INPUTDIALOG_REAL,0,0,0,0); inputdialog.setLimits(lo,hi); inputdialog.setText(FXStringVal(FXCLAMP(lo,result,hi),10)); if(inputdialog.execute()){ result=FXDoubleVal(inputdialog.getText()); return TRUE; } return FALSE; } // Obtain a real, in free floating window FXbool FXInputDialog::getReal(FXdouble& result,FXApp* app,const FXString& caption,const FXString& label,FXIcon* icon,FXdouble lo,FXdouble hi){ FXInputDialog inputdialog(app,caption,label,icon,INPUTDIALOG_REAL,0,0,0,0); inputdialog.setLimits(lo,hi); inputdialog.setText(FXStringVal(FXCLAMP(lo,result,hi),10)); if(inputdialog.execute()){ result=FXDoubleVal(inputdialog.getText()); return TRUE; } return FALSE; } } fox1.6-1.6.57/src/FXJPGIcon.cpp000066400000000000000000000065521326741342000156270ustar00rootroot00000000000000/******************************************************************************** * * * J P E G I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2000,2006 by David Tyree. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXJPGIcon.cpp,v 1.28 2006/01/24 13:53:11 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXJPGIcon.h" /* Notes: - Requires JPEG library. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXJPGIcon::fileExt[]="jpg"; // Suggested mime type const FXchar FXJPGIcon::mimeType[]="image/jpeg"; // Object implementation FXIMPLEMENT(FXJPGIcon,FXIcon,NULL,0) #ifdef HAVE_JPEG_H const bool FXJPGIcon::supported=true; #else const bool FXJPGIcon::supported=false; #endif // Initialize FXJPGIcon::FXJPGIcon(FXApp* a,const void *pix,FXColor clr,FXuint opts,FXint w,FXint h,FXint q):FXIcon(a,NULL,clr,opts,w,h),quality(q){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save pixels only bool FXJPGIcon::savePixels(FXStream& store) const { if(fxsaveJPG(store,data,width,height,quality)){ return true; } return false; } // Load pixels only bool FXJPGIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadJPG(store,pixels,w,h,quality)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXJPGIcon::~FXJPGIcon(){ } } fox1.6-1.6.57/src/FXJPGImage.cpp000066400000000000000000000064651326741342000157640ustar00rootroot00000000000000/******************************************************************************** * * * J P E G I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2000,2006 by David Tyree. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXJPGImage.cpp,v 1.30 2006/01/24 13:53:11 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXJPGImage.h" /* Notes: - Requires JPEG library. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXJPGImage::fileExt[]="jpg"; // Suggested mime type const FXchar FXJPGImage::mimeType[]="image/jpeg"; // Object implementation FXIMPLEMENT(FXJPGImage,FXImage,NULL,0) #ifdef HAVE_JPEG_H const bool FXJPGImage::supported=true; #else const bool FXJPGImage::supported=false; #endif // Initialize FXJPGImage::FXJPGImage(FXApp* a,const void *pix,FXuint opts,FXint w,FXint h,FXint q):FXImage(a,NULL,opts,w,h),quality(q){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save the pixels only bool FXJPGImage::savePixels(FXStream& store) const { if(fxsaveJPG(store,data,width,height,quality)){ return true; } return false; } // Load pixels only bool FXJPGImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadJPG(store,pixels,w,h,quality)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXJPGImage::~FXJPGImage(){ } } fox1.6-1.6.57/src/FXKOI8RCodec.cpp000066400000000000000000000157121326741342000161660ustar00rootroot00000000000000#include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXTextCodec.h" #include "FXKOI8RCodec.h" namespace FX { FXIMPLEMENT(FXKOI8RCodec,FXTextCodec,NULL,0) //// Created by codec tool on 03/24/2005 from: KOI8-R.TXT //// static const unsigned short forward_data[256]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, 9532, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 8992, 9632, 8729, 8730, 8776, 8804, 8805, 160, 8993, 176, 178, 183, 247, 9552, 9553, 9554, 1105, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 1025, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 169, 1102, 1072, 1073, 1094, 1076, 1077, 1092, 1075, 1093, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1103, 1088, 1089, 1090, 1091, 1078, 1074, 1100, 1099, 1079, 1096, 1101, 1097, 1095, 1098, 1070, 1040, 1041, 1062, 1044, 1045, 1060, 1043, 1061, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1071, 1056, 1057, 1058, 1059, 1046, 1042, 1068, 1067, 1047, 1064, 1069, 1065, 1063, 1066, }; static const unsigned char reverse_plane[17]={ 0, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; static const unsigned char reverse_pages[74]={ 0, 64, 70, 70, 70, 70, 70, 70, 101,152,70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, }; static const unsigned short reverse_block[216]={ 0, 16, 32, 48, 64, 80, 96, 112, 128, 128, 144, 160, 128, 128, 128, 169, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 184, 200, 216, 232, 248, 264, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 271, 128, 128, 282, 128, 294, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 310, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 326, 342, 355, 368, 128, 384, 400, 128, 416, 432, 448, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; static const unsigned char reverse_data[464]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 154, 26, 26, 26, 26, 26, 26, 26, 26, 191, 26, 26, 26, 26, 26, 26, 156, 26, 157, 26, 26, 26, 26, 158, 26, 26, 26, 26, 26, 26, 26, 26, 159, 26, 26, 26, 26, 26, 26, 26, 26, 179, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 225, 226, 247, 231, 228, 229, 246, 250, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 244, 245, 230, 232, 227, 254, 251, 253, 255, 249, 248, 252, 224, 241, 193, 194, 215, 199, 196, 197, 214, 218, 201, 202, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 198, 200, 195, 222, 219, 221, 223, 217, 216, 220, 192, 209, 26, 163, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 149, 150, 26, 26, 26, 26, 26, 26, 26, 26, 151, 26, 26, 26, 26, 26, 26, 26, 152, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 147, 155, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 128, 26, 129, 26, 26, 26, 26, 26, 26, 26, 26, 26, 130, 26, 26, 26, 131, 26, 26, 26, 132, 26, 26, 26, 133, 26, 26, 26, 134, 26, 26, 26, 26, 135, 26, 26, 26, 26, 26, 26, 26, 136, 26, 26, 26, 26, 137, 26, 26, 26, 26, 26, 26, 26, 138, 26, 26, 26, 160, 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 26, 26, 26, 139, 26, 26, 26, 140, 26, 26, 26, 141, 26, 26, 26, 142, 26, 26, 26, 143, 144, 145, 146, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 148, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, }; FXint FXKOI8RCodec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { if(nsrc<1) return -1; wc=forward_data[(FXuchar)src[0]]; return 1; } FXint FXKOI8RCodec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { if(ndst<1) return -1; dst[0]=reverse_data[reverse_block[reverse_pages[reverse_plane[wc>>16]+((wc>>10)&63)]+((wc>>4)&63)]+(wc&15)]; return 1; } FXint FXKOI8RCodec::mibEnum() const { return 2084; } const FXchar* FXKOI8RCodec::name() const { return "KOI8-R"; } const FXchar* FXKOI8RCodec::mimeName() const { return "KOI8-R"; } const FXchar* const* FXKOI8RCodec::aliases() const { static const FXchar *list[]={"koi8-r","KOI8-R",NULL}; return list; } } fox1.6-1.6.57/src/FXKnob.cpp000066400000000000000000000470701326741342000152670ustar00rootroot00000000000000/******************************************************************************** * * * K n o b W i d g e t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Leandro Nini. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXKnob.cpp,v 1.15 2006/01/22 17:58:32 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXKnob.h" /* Notes: - Contributed by: "Leandro Nini" - Some minor tweaks by Jeroen: - Added notify parameter to setValue [all valuators have this now as of 7/05]. - setValue() should clamp input, not reject when out of range; all other valuators do this, and its more predictable if FXKnob would do this as well:- allowing sliders to be replaced by FXKnob with no change to application code. - Removed duplicate member data [FXFrame already has shadowColor etc.]. - Added getter/setter for indicator needle color. - Fixed drawing such that knob is centered in area left over after accounting for padding, even if padding not equal on all sides. - Changed trucation to rounding in floating point conversion. - Some of the other valuators should probably also have similar keyboard bindings. - Cyclic mode like dial has would be nice since we may want to turn something 360 degrees. - Maybe a value-jump-if-clicked can be replaced by a relative movement; for example, if you grab a slider head it doesn't jump-move but stays relative to the initial mouse position. This allows for accurate positioning. Likewise, we could do the circular equivalent here [but keep the jump-if-clicked more for middle-mouse]. - Need to have triangular arrow. - Need to have ability to set starting/ending angle, plus full 360 degree mode. - Need to have optional knob; with just tick-marks and needle, the control can function as a nice vu-meter. - Incidentally, find my old source code for vu-meter drawing and use it here.... - Plus, swept triangle thingy! */ #define KNOBSIZE 30 #define KNOB_MASK (KNOB_NEEDLE|KNOB_DOT|KNOB_TICKS|KNOB_INDICATOR) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXKnob) FXKnobMap[]={ FXMAPFUNC(SEL_PAINT,0,FXKnob::onPaint), FXMAPFUNC(SEL_MOTION,0,FXKnob::onMotion), FXMAPFUNC(SEL_MOUSEWHEEL,0,FXKnob::onMouseWheel), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXKnob::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXKnob::onLeftBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXKnob::onMiddleBtnPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXKnob::onMiddleBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXKnob::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXKnob::onKeyRelease), FXMAPFUNC(SEL_FOCUSIN,0,FXKnob::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXKnob::onFocusOut), FXMAPFUNC(SEL_UNGRABBED,0,FXKnob::onUngrabbed), FXMAPFUNC(SEL_QUERY_TIP,0,FXKnob::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXKnob::onQueryHelp), FXMAPFUNC(SEL_TIMEOUT,FXKnob::ID_AUTOSLIDE,FXKnob::onAutoSlide), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_SETVALUE,FXKnob::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_SETINTVALUE,FXKnob::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_SETREALVALUE,FXKnob::onCmdSetRealValue), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_GETINTVALUE,FXKnob::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_GETREALVALUE,FXKnob::onCmdGetRealValue), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_SETINTRANGE,FXKnob::onCmdSetIntRange), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_GETINTRANGE,FXKnob::onCmdGetIntRange), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_SETREALRANGE,FXKnob::onCmdSetRealRange), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_GETREALRANGE,FXKnob::onCmdGetRealRange), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_SETHELPSTRING,FXKnob::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_GETHELPSTRING,FXKnob::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_SETTIPSTRING,FXKnob::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXKnob::ID_GETTIPSTRING,FXKnob::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXKnob,FXFrame,FXKnobMap,ARRAYNUMBER(FXKnobMap)) // Make a knob FXKnob::FXKnob(){ flags|=FLAG_ENABLED; range[0]=0; range[1]=0; limits[0]=0.0; limits[1]=0.0; lineColor=0; incr=0; pos=0; delta=0; } // Make a knob FXKnob::FXKnob(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_ENABLED; lineColor=getApp()->getForeColor(); target=tgt; message=sel; range[0]=0; range[1]=100; limits[0]=-1.0/3.0; limits[1]=4.0/3.0; incr=1; pos=0; delta=10; } // Knob can have focus bool FXKnob::canFocus() const { return true; } // Enable the knob void FXKnob::enable(){ if(!(flags&FLAG_ENABLED)){ FXFrame::enable(); update(); } } // Disable the knob void FXKnob::disable(){ if(flags&FLAG_ENABLED){ FXFrame::disable(); update(); } } // Get default size FXint FXKnob::getDefaultWidth(){ register FXint w=KNOBSIZE; if(options&KNOB_TICKS) w+=4; return w+padleft+padright+(border<<1); } FXint FXKnob::getDefaultHeight(){ register FXint h=KNOBSIZE; if(options&KNOB_TICKS) h+=4; return h+padtop+padbottom+(border<<1); } // Layout changed void FXKnob::layout(){ setValue(pos); flags&=~FLAG_DIRTY; } // Gained focus long FXKnob::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onFocusIn(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Lost focus long FXKnob::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onFocusOut(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Set help using a message long FXKnob::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXKnob::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXKnob::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXKnob::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXKnob::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXKnob::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Update value from a message long FXKnob::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setValue((FXint)(FXival)ptr); return 1; } // Update value from a message long FXKnob::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setValue(*((FXint*)ptr)); return 1; } // Update value from a message long FXKnob::onCmdSetRealValue(FXObject*,FXSelector,void* ptr){ setValue((FXint)*((FXdouble*)ptr)); return 1; } // Obtain value from text field long FXKnob::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getValue(); return 1; } // Obtain value with a message long FXKnob::onCmdGetRealValue(FXObject*,FXSelector,void* ptr){ *((FXdouble*)ptr)=(FXdouble)getValue(); return 1; } // Update range from a message long FXKnob::onCmdSetIntRange(FXObject*,FXSelector,void* ptr){ setRange(((FXint*)ptr)[0],((FXint*)ptr)[1]); return 1; } // Get range with a message long FXKnob::onCmdGetIntRange(FXObject*,FXSelector,void* ptr){ ((FXint*)ptr)[0]=range[0]; ((FXint*)ptr)[1]=range[1]; return 1; } // Update range from a message long FXKnob::onCmdSetRealRange(FXObject*,FXSelector,void* ptr){ setRange((FXint)((FXdouble*)ptr)[0],(FXint)((FXdouble*)ptr)[1]); return 1; } // Get range with a message long FXKnob::onCmdGetRealRange(FXObject*,FXSelector,void* ptr){ ((FXdouble*)ptr)[0]=(FXdouble)range[0]; ((FXdouble*)ptr)[1]=(FXdouble)range[1]; return 1; } // Pressed LEFT button long FXKnob::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint p,tol; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; if(isEnabled()){ grab(); getApp()->removeTimeout(this,ID_AUTOSLIDE); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; p=calcValue(event->win_x,event->win_y); tol=(range[1]-range[0])/10; if(p>pos+tol){ p=pos+incr; getApp()->addTimeout(this,ID_AUTOSLIDE,getApp()->getScrollDelay(),(void*)(FXival)incr); } else if(paddTimeout(this,ID_AUTOSLIDE,getApp()->getScrollDelay(),(void*)(FXival)-incr); } else{ flags|=FLAG_PRESSED; } if(p!=pos){ setValue(p); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } return 1; } return 0; } // Released Left button long FXKnob::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ register FXuint flgs=flags; if(isEnabled()){ ungrab(); setValue(pos); flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; getApp()->removeTimeout(this,ID_AUTOSLIDE); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(flgs&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } return 1; } return 0; } // Moving long FXKnob::onMotion(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint p; if(!isEnabled()) return 0; if(flags&FLAG_PRESSED){ p=calcValue(event->win_x,event->win_y); if(pos!=p){ setValue(p); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } return 1; } return 0; } // Pressed middle button long FXKnob::onMiddleBtnPress(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint p; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; flags|=FLAG_PRESSED; p=calcValue(event->win_x,event->win_y); if(p!=pos){ setValue(p); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } return 1; } return 0; } // Released middle button long FXKnob::onMiddleBtnRelease(FXObject*,FXSelector,void* ptr){ register FXuint flgs=flags; if(isEnabled()){ ungrab(); getApp()->removeTimeout(this,ID_AUTOSLIDE); flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; setValue(pos); // Hop to exact position if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONRELEASE,message),ptr)) return 1; if(flgs&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } return 1; } return 0; } // Mouse wheel long FXKnob::onMouseWheel(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint p=pos+(event->code*incr)/120; setValue(p,TRUE); return 1; } // The widget lost the grab for some reason long FXKnob::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onUngrabbed(sender,sel,ptr); getApp()->removeTimeout(this,ID_AUTOSLIDE); flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; return 1; } // Automatically move knob while holding down mouse long FXKnob::onAutoSlide(FXObject*,FXSelector,void* ptr){ register FXint inc=(FXint)(FXival)ptr; register FXint p=pos+inc; if(p<=range[0]){ p=range[0]; } else if(p>=range[1]){ p=range[1]; } else{ getApp()->addTimeout(this,ID_AUTOSLIDE,getApp()->getScrollSpeed(),(void*)(FXival)inc); } if(p!=pos){ setValue(p); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); return 1; } return 0; } // Keyboard press long FXKnob::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; switch(event->code){ case KEY_Up: case KEY_KP_Up: setValue(pos+incr,TRUE); return 1; case KEY_Down: case KEY_KP_Down: setValue(pos-incr,TRUE); return 1; } } return 0; } // Keyboard release long FXKnob::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Up: case KEY_KP_Up: case KEY_Down: case KEY_KP_Down: return 1; } } return 0; } // Handle repaint long FXKnob::onPaint(FXObject*,FXSelector,void* ptr){ FXDCWindow dc(this,(FXEvent*)ptr); FXint xx,yy,ww,hh,cx,cy,rr,px,py,lw; // Draw frame drawFrame(dc,0,0,width,height); // Draw background dc.setForeground(backColor); dc.fillRectangle(border,border,width-(border<<1),height-(border<<1)); // Compute available space for knob ww=width-(border<<1)-padleft-padright; hh=height-(border<<1)-padtop-padbottom; cx=border+padleft+(ww>>1); cy=border+padtop+(hh>>1); // Make sure the knob is round rr=FXMIN(ww,hh)/2; if(hasFocus()){ dc.drawFocusRectangle(cx-rr,cy-rr,rr+rr,rr+rr); } if(options&KNOB_TICKS) rr-=3; // Knob border width lw=rr/6; rr-=lw; xx=cx-rr; yy=cy-rr; FXASSERT(range[0]<=pos && pos<=range[1]); FXdouble p=(((double)(pos-range[0])/(double)(range[1]-range[0]))*(limits[1]-limits[0])+limits[0])*PI; // Draw knob dc.setLineWidth(lw); if(!(options&KNOB_INDICATOR)){ dc.setForeground(hiliteColor); dc.drawArc(xx,yy,rr+rr,rr+rr,45*64,180*64); dc.setForeground(shadowColor); dc.drawArc(xx,yy,rr+rr,rr+rr,225*64,180*64); } // Draw indicator dc.setForeground(lineColor); if(!(options&KNOB_DOT)){ px=(FXint)(-cos(p)*rr+0.5)+cx; py=(FXint)(-sin(p)*rr+0.5)+cy; dc.drawLine(cx,cy,px,py); } else{ px=(FXint)(-cos(p)*(rr-lw*2)+0.5)+cx; py=(FXint)(-sin(p)*(rr-lw*2)+0.5)+cy; dc.fillEllipse(px-lw,py-lw,lw*2,lw*2); } // Draw ticks if(options&KNOB_TICKS){ rr+=4; p=PI*limits[0]; FXint numTicks=(range[1]-range[0])/delta; FXdouble d=(limits[1]-limits[0])/numTicks; numTicks++; FXASSERT(numTicks<1024); // FIXME this needs to be done differently FXPoint points[1024]; for(FXint i=0; ihi){ fxerror("%s::setRange: trying to set negative range.\n",getClassName()); } if(range[0]!=lo || range[1]!=hi){ range[0]=lo; range[1]=hi; setValue(pos,notify); } } // Set knob limits void FXKnob::setLimits(FXint start,FXint end,FXbool notify){ if(start>end || start<0 || end>360){ fxerror("%s::setLimits: invalid values.\n",getClassName()); } if(limits[0]!=start || limits[1]!=end){ limits[0]=((FXdouble)start/PI*DTOR)-0.5; limits[1]=((FXdouble)end/PI*DTOR)-0.5; setValue(pos,notify); } } // Set knob limits void FXKnob::getLimits(FXint& start,FXint& end){ start=(FXint)((limits[0]+0.5)*PI*RTOD+0.5); end=(FXint)((limits[1]+0.5)*PI*RTOD+0.5); } // Set position void FXKnob::setValue(FXint p,FXbool notify){ if(prange[1]) p=range[1]; if(p!=pos){ pos=p; update(border,border,width-(border<<1),height-(border<<1)); if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos);} } } // Get knob style FXuint FXKnob::getKnobStyle() const { return (options&KNOB_MASK); } // Set knob style void FXKnob::setKnobStyle(FXuint style){ register FXuint opts=(options&~KNOB_MASK) | (style&KNOB_MASK); if(options!=opts){ options=opts; update(); } } // Change the delta between ticks void FXKnob::setTickDelta(FXint dist){ if(delta!=dist){ delta=dist; update(); } } // Calculate value from position relative to center FXint FXKnob::calcValue(FXint x,FXint y){ register FXint cx=(width+padleft-padright)>>1; register FXint cy=(height+padtop-padbottom)>>1; register FXdouble angle=atan2((FXdouble)(cy-y),(FXdouble)(x-cx))/PI; if(angle<-0.5) angle+=2.0; angle=(1.0-angle-limits[0])/(limits[1]-limits[0]); return (FXint)(angle*(range[1]-range[0])+0.5)+range[0]; } // Change the indicator needle color void FXKnob::setLineColor(FXColor clr){ if(clr!=lineColor){ lineColor=clr; update(); } } // Save object to stream void FXKnob::save(FXStream& store) const { FXFrame::save(store); store << range[0] << range[1]; store << limits[0] << limits[1]; store << lineColor; store << pos; store << incr; store << delta; store << help; store << tip; } // Load object from stream void FXKnob::load(FXStream& store){ FXFrame::load(store); store >> range[0] >> range[1]; store >> limits[0] >> limits[1]; store >> lineColor; store >> pos; store >> incr; store >> delta; store >> help; store >> tip; } // On delete, remove the timer FXKnob::~FXKnob(){ getApp()->removeTimeout(this,ID_AUTOSLIDE); } } fox1.6-1.6.57/src/FXLabel.cpp000066400000000000000000000356241326741342000154170ustar00rootroot00000000000000/******************************************************************************** * * * L a b e l W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXLabel.cpp,v 1.59.2.1 2006/12/11 15:57:26 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXAccelTable.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXLabel.h" /* Notes: - When changing icon/font/etc, we should only recalc and update when it's different. - When text changes, do we delete the hot key, or parse it from the new label? - It makes sense for certain ``passive'' widgets such as labels to have onUpdate; for example, to show/hide/whatever based on changing data structures. */ #define JUSTIFY_MASK (JUSTIFY_HZ_APART|JUSTIFY_VT_APART) #define ICON_TEXT_MASK (ICON_AFTER_TEXT|ICON_BEFORE_TEXT|ICON_ABOVE_TEXT|ICON_BELOW_TEXT) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXLabel) FXLabelMap[]={ FXMAPFUNC(SEL_PAINT,0,FXLabel::onPaint), FXMAPFUNC(SEL_QUERY_TIP,0,FXLabel::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXLabel::onQueryHelp), FXMAPFUNC(SEL_KEYPRESS,FXLabel::ID_HOTKEY,FXLabel::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXLabel::ID_HOTKEY,FXLabel::onHotKeyRelease), FXMAPFUNC(SEL_COMMAND,FXLabel::ID_SETVALUE,FXLabel::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXLabel::ID_SETSTRINGVALUE,FXLabel::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXLabel::ID_GETSTRINGVALUE,FXLabel::onCmdGetStringValue), FXMAPFUNC(SEL_COMMAND,FXLabel::ID_SETICONVALUE,FXLabel::onCmdSetIconValue), FXMAPFUNC(SEL_COMMAND,FXLabel::ID_GETICONVALUE,FXLabel::onCmdGetIconValue), FXMAPFUNC(SEL_COMMAND,FXLabel::ID_SETHELPSTRING,FXLabel::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXLabel::ID_GETHELPSTRING,FXLabel::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXLabel::ID_SETTIPSTRING,FXLabel::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXLabel::ID_GETTIPSTRING,FXLabel::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXLabel,FXFrame,FXLabelMap,ARRAYNUMBER(FXLabelMap)) // Deserialization FXLabel::FXLabel(){ flags|=FLAG_ENABLED; icon=(FXIcon*)-1L; font=(FXFont*)-1L; hotkey=0; hotoff=0; textColor=0; } // Make a label FXLabel::FXLabel(FXComposite* p,const FXString& text,FXIcon* ic,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ FXString string=text.section('\t',0); flags|=FLAG_ENABLED; label=stripHotKey(string); tip=text.section('\t',1); help=text.section('\t',2); icon=ic; font=getApp()->getNormalFont(); textColor=getApp()->getForeColor(); hotkey=parseHotKey(string); hotoff=findHotKey(string); addHotKey(hotkey); } // Create window void FXLabel::create(){ FXFrame::create(); font->create(); if(icon) icon->create(); } // Detach window void FXLabel::detach(){ FXFrame::detach(); font->detach(); if(icon) icon->detach(); } // Enable the window void FXLabel::enable(){ if(!(flags&FLAG_ENABLED)){ FXFrame::enable(); update(); } } // Disable the window void FXLabel::disable(){ if(flags&FLAG_ENABLED){ FXFrame::disable(); update(); } } // Get height of multi-line label FXint FXLabel::labelHeight(const FXString& text) const { register FXint beg,end; register FXint th=0; beg=0; do{ end=beg; while(endgetFontHeight(); beg=end+1; } while(endgetTextWidth(&text[beg],end-beg))>tw) tw=w; beg=end+1; } while(endgetFontAscent(); beg=0; do{ end=beg; while(endgetTextWidth(&text[beg],end-beg); else xx=tx+(tw-font->getTextWidth(&text[beg],end-beg))/2; dc.drawText(xx,yy,&text[beg],end-beg); if(beg<=hot && hotgetTextWidth(&text[beg],hot-beg),yy+1,font->getTextWidth(&text[hot],wclen(&text[hot])),1); } yy+=font->getFontHeight(); beg=end+1; } while(endgetWidth(); } if(iw && tw) s=4; if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w=FXMAX(tw,iw); else w=tw+iw+s; return w+padleft+padright+(border<<1); } // Get default height FXint FXLabel::getDefaultHeight(){ FXint th=0,ih=0,h; if(!label.empty()){ th=labelHeight(label); } if(icon){ ih=icon->getHeight(); } if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h=FXMAX(th,ih); else h=th+ih; return h+padtop+padbottom+(border<<1); } // Update value from a message long FXLabel::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setText((const FXchar*)ptr); return 1; } // Update value from a message long FXLabel::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setText(*((FXString*)ptr)); return 1; } // Obtain value from text field long FXLabel::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getText(); return 1; } // Update icon from a message long FXLabel::onCmdSetIconValue(FXObject*,FXSelector,void* ptr){ setIcon(*((FXIcon**)ptr)); return 1; } // Obtain icon from text field long FXLabel::onCmdGetIconValue(FXObject*,FXSelector,void* ptr){ *((FXIcon**)ptr)=getIcon(); return 1; } // Handle repaint long FXLabel::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy; dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(!label.empty()){ tw=labelWidth(label); th=labelHeight(label); } if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); } just_x(tx,ix,tw,iw); just_y(ty,iy,th,ih); if(icon){ if(isEnabled()) dc.drawIcon(icon,ix,iy); else dc.drawIconSunken(icon,ix,iy); } if(!label.empty()){ dc.setFont(font); if(isEnabled()){ dc.setForeground(textColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } else{ dc.setForeground(hiliteColor); drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } } drawFrame(dc,0,0,width,height); return 1; } // Move the focus to the next focusable child following the // Label widget. Thus, placing a label with accelerator in front // of e.g. a TextField gives a convenient method for getting to it. long FXLabel::onHotKeyPress(FXObject*,FXSelector,void* ptr){ FXWindow *child=getNext(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_NEXT,0),ptr)) return 1; } child=child->getNext(); } return 1; } // Nothing much happens here... long FXLabel::onHotKeyRelease(FXObject*,FXSelector,void*){ return 1; } // Set help using a message long FXLabel::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXLabel::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXLabel::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXLabel::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXLabel::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXLabel::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Change text void FXLabel::setText(const FXString& text){ FXString string=stripHotKey(text); FXHotKey hkey=parseHotKey(text); FXint hoff=findHotKey(text); if(label!=string || hkey!=hotkey || hotoff!=hoff){ label.adopt(string); remHotKey(hotkey); hotkey=hkey; hotoff=hoff; addHotKey(hotkey); recalc(); update(); } } // Change icon void FXLabel::setIcon(FXIcon* ic){ if(icon!=ic){ icon=ic; recalc(); update(); } } // Change the font void FXLabel::setFont(FXFont *fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Set text color void FXLabel::setTextColor(FXColor clr){ if(clr!=textColor){ textColor=clr; update(); } } // Set text justify style void FXLabel::setJustify(FXuint style){ FXuint opts=(options&~JUSTIFY_MASK) | (style&JUSTIFY_MASK); if(options!=opts){ options=opts; update(); } } // Get text justify style FXuint FXLabel::getJustify() const { return (options&JUSTIFY_MASK); } // Set icon positioning void FXLabel::setIconPosition(FXuint mode){ FXuint opts=(options&~ICON_TEXT_MASK) | (mode&ICON_TEXT_MASK); if(options!=opts){ options=opts; recalc(); update(); } } // Get icon positioning FXuint FXLabel::getIconPosition() const { return (options&ICON_TEXT_MASK); } // Save object to stream void FXLabel::save(FXStream& store) const { FXFrame::save(store); store << label; store << icon; store << font; store << hotkey; store << hotoff; store << textColor; store << tip; store << help; } // Load object from stream void FXLabel::load(FXStream& store){ FXFrame::load(store); store >> label; store >> icon; store >> font; store >> hotkey; store >> hotoff; store >> textColor; store >> tip; store >> help; } // Destroy label FXLabel::~FXLabel(){ remHotKey(hotkey); icon=(FXIcon*)-1L; font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXList.cpp000066400000000000000000001500231326741342000153020ustar00rootroot00000000000000/******************************************************************************** * * * L i s t O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXList.cpp,v 1.159.2.3 2006/07/28 00:56:31 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXObjectList.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXScrollBar.h" #include "FXList.h" /* Notes: - Draw stuff differently when disabled. - Move active item by means of focus navigation, or first letters typed. - PageUp/PageDn should also change currentitem. - Should issue callbacks from keyboard also. - Need distinguish various callbacks better: - Selection changes (all selected/unselected items or just changes???) - Changes of currentitem - Clicks on currentitem - Return key simulates double click. - Autoselect mode selects whatever is under the cursor, and gives callback on mouse release. - Sortfunc's will be hard to serialize, and hard to write w/o secretly #including the FXListItem header! - Should replace hard-wired SIDE_SPACING etc by flexible padding; we'll do this when FXScrollArea gets derived from FXFrame, so we'll have internal padding, and inter-item padding. - When in single/browse mode, current item always the one that's selected - It may be convenient to have ways to move items around. - Need insertSorted() API to add item in the right place based on current sort function. - Need to add support for justification (similar to FXTableItem). Perhaps multi-line labels too while we're at it. - Sort API should change; it should become: sortItems(FXListSortFunc func=FXList::ascending) this way we will not need to keep track of sort func! - Should generate SEL_COMMAND, even if outside of item; this way, a single handler can determine item selection(s) or deselection(s). - As with FXIconList, it probably shouldn't autoscroll when draggin icons. - Even/odd background colors would be nice, but may look funny when not all items are same size. - Item justification and icon/text relationships would be nice, too. */ #define ICON_SPACING 4 // Spacing between icon and label #define SIDE_SPACING 6 // Left or right spacing between items #define LINE_SPACING 4 // Line spacing between items #define SELECT_MASK (LIST_SINGLESELECT|LIST_BROWSESELECT) #define LIST_MASK (SELECT_MASK|LIST_AUTOSELECT) using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXListItem,FXObject,NULL,0) // Draw item void FXListItem::draw(const FXList* list,FXDC& dc,FXint xx,FXint yy,FXint ww,FXint hh){ register FXFont *font=list->getFont(); register FXint ih=0,th=0; if(icon) ih=icon->getHeight(); if(!label.empty()) th=font->getFontHeight(); if(isSelected()) dc.setForeground(list->getSelBackColor()); else dc.setForeground(list->getBackColor()); // FIXME maybe paint background in onPaint? dc.fillRectangle(xx,yy,ww,hh); if(hasFocus()){ dc.drawFocusRectangle(xx+1,yy+1,ww-2,hh-2); } xx+=SIDE_SPACING/2; if(icon){ dc.drawIcon(icon,xx,yy+(hh-ih)/2); xx+=ICON_SPACING+icon->getWidth(); } if(!label.empty()){ dc.setFont(font); if(!isEnabled()) dc.setForeground(makeShadowColor(list->getBackColor())); else if(isSelected()) dc.setForeground(list->getSelTextColor()); else dc.setForeground(list->getTextColor()); dc.drawText(xx,yy+(hh-th)/2+font->getFontAscent(),label); } } // See if item got hit, and where: 0 is outside, 1 is icon, 2 is text FXint FXListItem::hitItem(const FXList* list,FXint xx,FXint yy) const { register FXint iw=0,ih=0,tw=0,th=0,ix,iy,tx,ty,h; register FXFont *font=list->getFont(); if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); } if(!label.empty()){ tw=4+font->getTextWidth(label.text(),label.length()); th=4+font->getFontHeight(); } h=LINE_SPACING+FXMAX(th,ih); ix=SIDE_SPACING/2; tx=SIDE_SPACING/2; if(iw) tx+=iw+ICON_SPACING; iy=(h-ih)/2; ty=(h-th)/2; // In icon? if(ix<=xx && iy<=yy && xxcreate(); } // Destroy icon void FXListItem::destroy(){ if((state&ICONOWNED) && icon) icon->destroy(); } // Detach from icon resource void FXListItem::detach(){ if(icon) icon->detach(); } // Get width of item FXint FXListItem::getWidth(const FXList* list) const { register FXFont *font=list->getFont(); register FXint w=0; if(icon){ w=icon->getWidth(); } if(!label.empty()){ if(w) w+=ICON_SPACING; w+=font->getTextWidth(label.text(),label.length()); } return SIDE_SPACING+w; } // Get height of item FXint FXListItem::getHeight(const FXList* list) const { register FXFont *font=list->getFont(); register FXint th=0,ih=0; if(icon){ ih=icon->getHeight(); } if(!label.empty()){ th=font->getFontHeight(); } return LINE_SPACING+FXMAX(th,ih); } // Save data void FXListItem::save(FXStream& store) const { FXObject::save(store); store << label; store << icon; store << state; } // Load data void FXListItem::load(FXStream& store){ FXObject::load(store); store >> label; store >> icon; store >> state; } // Delete icon if owned FXListItem::~FXListItem(){ if(state&ICONOWNED) delete icon; icon=(FXIcon*)-1L; } /*******************************************************************************/ // Map FXDEFMAP(FXList) FXListMap[]={ FXMAPFUNC(SEL_PAINT,0,FXList::onPaint), FXMAPFUNC(SEL_ENTER,0,FXList::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXList::onLeave), FXMAPFUNC(SEL_MOTION,0,FXList::onMotion), FXMAPFUNC(SEL_TIMEOUT,FXWindow::ID_AUTOSCROLL,FXList::onAutoScroll), FXMAPFUNC(SEL_TIMEOUT,FXList::ID_TIPTIMER,FXList::onTipTimer), FXMAPFUNC(SEL_TIMEOUT,FXList::ID_LOOKUPTIMER,FXList::onLookupTimer), FXMAPFUNC(SEL_UNGRABBED,0,FXList::onUngrabbed), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXList::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXList::onLeftBtnRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXList::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXList::onRightBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXList::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXList::onKeyRelease), FXMAPFUNC(SEL_FOCUSIN,0,FXList::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXList::onFocusOut), FXMAPFUNC(SEL_CLICKED,0,FXList::onClicked), FXMAPFUNC(SEL_DOUBLECLICKED,0,FXList::onDoubleClicked), FXMAPFUNC(SEL_TRIPLECLICKED,0,FXList::onTripleClicked), FXMAPFUNC(SEL_COMMAND,0,FXList::onCommand), FXMAPFUNC(SEL_QUERY_TIP,0,FXList::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXList::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXList::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETINTVALUE,FXList::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETINTVALUE,FXList::onCmdGetIntValue), }; // Object implementation FXIMPLEMENT(FXList,FXScrollArea,FXListMap,ARRAYNUMBER(FXListMap)) // List FXList::FXList(){ flags|=FLAG_ENABLED; anchor=-1; current=-1; extent=-1; cursor=-1; viewable=-1; font=(FXFont*)-1L; textColor=0; selbackColor=0; seltextColor=0; listWidth=0; listHeight=0; visible=0; sortfunc=NULL; grabx=0; graby=0; state=FALSE; } // List FXList::FXList(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXScrollArea(p,opts,x,y,w,h){ flags|=FLAG_ENABLED; target=tgt; message=sel; anchor=-1; current=-1; extent=-1; cursor=-1; viewable=-1; font=getApp()->getNormalFont(); textColor=getApp()->getForeColor(); selbackColor=getApp()->getSelbackColor(); seltextColor=getApp()->getSelforeColor(); listWidth=0; listHeight=0; visible=0; sortfunc=NULL; grabx=0; graby=0; state=FALSE; } // Create window void FXList::create(){ register FXint i; FXScrollArea::create(); for(i=0; icreate();} font->create(); } // Detach window void FXList::detach(){ register FXint i; FXScrollArea::detach(); for(i=0; idetach();} font->detach(); } // Can have focus bool FXList::canFocus() const { return true; } // Into focus chain void FXList::setFocus(){ FXScrollArea::setFocus(); setDefault(TRUE); } // Out of focus chain void FXList::killFocus(){ FXScrollArea::killFocus(); setDefault(MAYBE); } // Get default width FXint FXList::getDefaultWidth(){ return FXScrollArea::getDefaultWidth(); } // Get default height FXint FXList::getDefaultHeight(){ if(visible) return visible*(LINE_SPACING+font->getFontHeight()); return FXScrollArea::getDefaultHeight(); } // Propagate size change void FXList::recalc(){ FXScrollArea::recalc(); flags|=FLAG_RECALC; cursor=-1; } // List is multiple of nitems void FXList::setNumVisible(FXint nvis){ if(nvis<0) nvis=0; if(visible!=nvis){ visible=nvis; recalc(); } } // Recompute interior void FXList::recompute(){ register FXint x,y,w,h,i; x=0; y=0; listWidth=0; listHeight=0; for(i=0; ix=x; items[i]->y=y; w=items[i]->getWidth(this); h=items[i]->getHeight(this); if(w>listWidth) listWidth=w; y+=h; } listHeight=y; flags&=~FLAG_RECALC; } // Determine content width of list FXint FXList::getContentWidth(){ if(flags&FLAG_RECALC) recompute(); return listWidth; } // Determine content height of list FXint FXList::getContentHeight(){ if(flags&FLAG_RECALC) recompute(); return listHeight; } // Recalculate layout determines item locations and sizes void FXList::layout(){ // Calculate contents FXScrollArea::layout(); // Determine line size for scroll bars if(0setLine(items[0]->getHeight(this)); horizontal->setLine(items[0]->getWidth(this)/10); } update(); // We were supposed to make this item viewable if(0<=viewable){ makeItemVisible(viewable); } // No more dirty flags&=~FLAG_DIRTY; } // Change item text void FXList::setItemText(FXint index,const FXString& text){ if(index<0 || items.no()<=index){ fxerror("%s::setItemText: index out of range.\n",getClassName()); } if(items[index]->getText()!=text){ items[index]->setText(text); recalc(); } } // Get item text FXString FXList::getItemText(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemText: index out of range.\n",getClassName()); } return items[index]->getText(); } // Set item icon void FXList::setItemIcon(FXint index,FXIcon* icon,FXbool owned){ if(index<0 || items.no()<=index){ fxerror("%s::setItemIcon: index out of range.\n",getClassName()); } if(items[index]->getIcon()!=icon) recalc(); items[index]->setIcon(icon,owned); } // Get item icon FXIcon* FXList::getItemIcon(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemIcon: index out of range.\n",getClassName()); } return items[index]->getIcon(); } // Set item data void FXList::setItemData(FXint index,void* ptr){ if(index<0 || items.no()<=index){ fxerror("%s::setItemData: index out of range.\n",getClassName()); } items[index]->setData(ptr); } // Get item data void* FXList::getItemData(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemData: index out of range.\n",getClassName()); } return items[index]->getData(); } // True if item is selected FXbool FXList::isItemSelected(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::isItemSelected: index out of range.\n",getClassName()); } return items[index]->isSelected(); } // True if item is current FXbool FXList::isItemCurrent(FXint index) const { return (0<=index) && (index==current); } // True if item is enabled FXbool FXList::isItemEnabled(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::isItemEnabled: index out of range.\n",getClassName()); } return items[index]->isEnabled(); } // True if item (partially) visible FXbool FXList::isItemVisible(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::isItemVisible: index out of range.\n",getClassName()); } return (0 < (pos_y+items[index]->y+items[index]->getHeight(this))) && ((pos_y+items[index]->y) < viewport_h); } // Make item fully visible void FXList::makeItemVisible(FXint index){ register FXint y,h; if(0<=index && indexgetHeight(this); if(viewport_h<=y+items[index]->y+h) y=viewport_h-items[index]->y-h; if(y+items[index]->y<=0) y=-items[index]->y; // Scroll into view setPosition(pos_x,y); // Done it viewable=-1; } } } // Return item width FXint FXList::getItemWidth(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemWidth: index out of range.\n",getClassName()); } return items[index]->getWidth(this); } // Return item height FXint FXList::getItemHeight(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItemHeight: index out of range.\n",getClassName()); } return items[index]->getHeight(this); } // Get item at position x,y FXint FXList::getItemAt(FXint,FXint y) const { register FXint index; y-=pos_y; for(index=0; indexy<=y && yy+items[index]->getHeight(this)){ return index; } } return -1; } // Did we hit the item, and which part of it did we hit (0=outside, 1=icon, 2=text) FXint FXList::hitItem(FXint index,FXint x,FXint y) const { FXint ix,iy,hit=0; if(0<=index && indexx; iy=items[index]->y; hit=items[index]->hitItem(this,x-ix,y-iy); } return hit; } // Repaint void FXList::updateItem(FXint index) const { if(0<=index && indexy,viewport_w,items[index]->getHeight(this)); } } // Enable one item FXbool FXList::enableItem(FXint index){ if(index<0 || items.no()<=index){ fxerror("%s::enableItem: index out of range.\n",getClassName()); } if(!items[index]->isEnabled()){ items[index]->setEnabled(TRUE); updateItem(index); return TRUE; } return FALSE; } // Disable one item FXbool FXList::disableItem(FXint index){ if(index<0 || items.no()<=index){ fxerror("%s::disableItem: index out of range.\n",getClassName()); } if(items[index]->isEnabled()){ items[index]->setEnabled(FALSE); updateItem(index); return TRUE; } return FALSE; } // Select one item FXbool FXList::selectItem(FXint index,FXbool notify){ if(index<0 || items.no()<=index){ fxerror("%s::selectItem: index out of range.\n",getClassName()); } if(!items[index]->isSelected()){ switch(options&SELECT_MASK){ case LIST_SINGLESELECT: case LIST_BROWSESELECT: killSelection(notify); case LIST_EXTENDEDSELECT: case LIST_MULTIPLESELECT: items[index]->setSelected(TRUE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)index);} break; } return TRUE; } return FALSE; } // Deselect one item FXbool FXList::deselectItem(FXint index,FXbool notify){ if(index<0 || items.no()<=index){ fxerror("%s::deselectItem: index out of range.\n",getClassName()); } if(items[index]->isSelected()){ switch(options&SELECT_MASK){ case LIST_EXTENDEDSELECT: case LIST_MULTIPLESELECT: case LIST_SINGLESELECT: items[index]->setSelected(FALSE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)index);} break; } return TRUE; } return FALSE; } // Toggle one item FXbool FXList::toggleItem(FXint index,FXbool notify){ if(index<0 || items.no()<=index){ fxerror("%s::toggleItem: index out of range.\n",getClassName()); } switch(options&SELECT_MASK){ case LIST_BROWSESELECT: if(!items[index]->isSelected()){ killSelection(notify); items[index]->setSelected(TRUE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)index);} } break; case LIST_SINGLESELECT: if(!items[index]->isSelected()){ killSelection(notify); items[index]->setSelected(TRUE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)index);} } else{ items[index]->setSelected(FALSE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)index);} } break; case LIST_EXTENDEDSELECT: case LIST_MULTIPLESELECT: if(!items[index]->isSelected()){ items[index]->setSelected(TRUE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)index);} } else{ items[index]->setSelected(FALSE); updateItem(index); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)index);} } break; } return TRUE; } // Extend selection FXbool FXList::extendSelection(FXint index,FXbool notify){ register FXbool changes=FALSE; FXint i1,i2,i3,i; if(0<=index && 0<=anchor && 0<=extent){ // Find segments i1=index; if(anchorisSelected()){ items[i]->setSelected(TRUE); updateItem(i); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)i);} } } // extent===anchor---item // extent===item-----anchor else if(i1==extent){ if(items[i]->isSelected()){ items[i]->setSelected(FALSE); updateItem(i); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)i);} } } } // Second segment for(i=i2+1; i<=i3; i++){ // extent---anchor===item // anchor---extent===item if(i3==index){ if(!items[i]->isSelected()){ items[i]->setSelected(TRUE); updateItem(i); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)(FXival)i);} } } // item-----anchor===extent // anchor---item=====extent else if(i3==extent){ if(items[i]->isSelected()){ items[i]->setSelected(FALSE); updateItem(i); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)i);} } } } extent=index; } return changes; } // Kill selection FXbool FXList::killSelection(FXbool notify){ register FXbool changes=FALSE; register FXint i; for(i=0; iisSelected()){ items[i]->setSelected(FALSE); updateItem(i); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)(FXival)i);} } } return changes; } // Update value from a message long FXList::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCurrentItem((FXint)(FXival)ptr); return 1; } // Obtain value from list long FXList::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getCurrentItem(); return 1; } // Update value from a message long FXList::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setCurrentItem(*((FXint*)ptr)); return 1; } // Enter window long FXList::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onEnter(sender,sel,ptr); getApp()->addTimeout(this,ID_TIPTIMER,getApp()->getMenuPause()); cursor=-1; return 1; } // Leave window long FXList::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onLeave(sender,sel,ptr); getApp()->removeTimeout(this,ID_TIPTIMER); cursor=-1; return 1; } // Gained focus long FXList::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onFocusIn(sender,sel,ptr); if(0<=current){ FXASSERT(currentsetFocus(TRUE); updateItem(current); } return 1; } // We timed out, i.e. the user didn't move for a while long FXList::onTipTimer(FXObject*,FXSelector,void*){ flags|=FLAG_TIP; return 1; } // We were asked about tip text long FXList::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !(options&LIST_AUTOSELECT) && (0<=cursor)){ // No tip when autoselect! FXString string=items[cursor]->getText(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&string); return 1; } return 0; } // We were asked about status text long FXList::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Lost focus long FXList::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onFocusOut(sender,sel,ptr); if(0<=current){ FXASSERT(currentsetFocus(FALSE); updateItem(current); } return 1; } // Draw item list long FXList::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXDCWindow dc(this,event); FXint i,y,h; // Paint items y=pos_y; for(i=0; igetHeight(this); if(event->rect.y<=y+h && yrect.y+event->rect.h){ items[i]->draw(this,dc,pos_x,y,FXMAX(listWidth,viewport_w),h); } y+=h; } // Paint blank area below items if(yrect.y+event->rect.h){ dc.setForeground(backColor); dc.fillRectangle(event->rect.x,y,event->rect.w,event->rect.y+event->rect.h-y); } return 1; } // Zero out lookup string long FXList::onLookupTimer(FXObject*,FXSelector,void*){ lookup=FXString::null; return 1; } // Key Press long FXList::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint index=current; flags&=~FLAG_TIP; if(!isEnabled()) return 0; if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; switch(event->code){ case KEY_Control_L: case KEY_Control_R: case KEY_Shift_L: case KEY_Shift_R: case KEY_Alt_L: case KEY_Alt_R: if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; case KEY_Page_Up: case KEY_KP_Page_Up: lookup=FXString::null; setPosition(pos_x,pos_y+verticalScrollBar()->getPage()); return 1; case KEY_Page_Down: case KEY_KP_Page_Down: lookup=FXString::null; setPosition(pos_x,pos_y-verticalScrollBar()->getPage()); return 1; case KEY_Up: case KEY_KP_Up: index-=1; goto hop; case KEY_Down: case KEY_KP_Down: index+=1; goto hop; case KEY_Home: case KEY_KP_Home: index=0; goto hop; case KEY_End: case KEY_KP_End: index=items.no()-1; hop: lookup=FXString::null; if(0<=index && indexisEnabled()){ if((options&SELECT_MASK)==LIST_EXTENDEDSELECT){ if(event->state&SHIFTMASK){ if(0<=anchor){ selectItem(anchor,TRUE); extendSelection(index,TRUE); } else{ selectItem(index,TRUE); setAnchorItem(index); } } else if(!(event->state&CONTROLMASK)){ killSelection(TRUE); selectItem(index,TRUE); setAnchorItem(index); } } } } handle(this,FXSEL(SEL_CLICKED,0),(void*)(FXival)current); if(0<=current && items[current]->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)(FXival)current); } return 1; case KEY_space: case KEY_KP_Space: lookup=FXString::null; if(0<=current && items[current]->isEnabled()){ switch(options&SELECT_MASK){ case LIST_EXTENDEDSELECT: if(event->state&SHIFTMASK){ if(0<=anchor){ selectItem(anchor,TRUE); extendSelection(current,TRUE); } else{ selectItem(current,TRUE); } } else if(event->state&CONTROLMASK){ toggleItem(current,TRUE); } else{ killSelection(TRUE); selectItem(current,TRUE); } break; case LIST_MULTIPLESELECT: case LIST_SINGLESELECT: toggleItem(current,TRUE); break; } setAnchorItem(current); } handle(this,FXSEL(SEL_CLICKED,0),(void*)(FXival)current); if(0<=current && items[current]->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)(FXival)(FXival)current); } return 1; case KEY_Return: case KEY_KP_Enter: lookup=FXString::null; handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)(FXival)current); if(0<=current && items[current]->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)(FXival)current); } return 1; default: if((FXuchar)event->text[0]<' ') return 0; if(event->state&(CONTROLMASK|ALTMASK)) return 0; if(!Ascii::isPrint(event->text[0])) return 0; lookup.append(event->text); getApp()->addTimeout(this,ID_LOOKUPTIMER,getApp()->getTypingSpeed()); index=findItem(lookup,current,SEARCH_FORWARD|SEARCH_WRAP|SEARCH_PREFIX); if(0<=index){ setCurrentItem(index,TRUE); makeItemVisible(index); if((options&SELECT_MASK)==LIST_EXTENDEDSELECT){ if(items[index]->isEnabled()){ killSelection(TRUE); selectItem(index,TRUE); } } setAnchorItem(index); } handle(this,FXSEL(SEL_CLICKED,0),(void*)(FXival)current); if(0<=current && items[current]->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)(FXival)current); } return 1; } return 0; } // Key Release long FXList::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(!isEnabled()) return 0; if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Shift_L: case KEY_Shift_R: case KEY_Control_L: case KEY_Control_R: case KEY_Alt_L: case KEY_Alt_R: if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; } return 0; } // Automatic scroll long FXList::onAutoScroll(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint index; // Scroll the window FXScrollArea::onAutoScroll(sender,sel,ptr); // Drag and drop mode if(flags&FLAG_DODRAG){ handle(this,FXSEL(SEL_DRAGGED,0),ptr); return 1; } // In autoselect mode, stop scrolling when mouse outside window if((flags&FLAG_PRESSED) || (options&LIST_AUTOSELECT)){ // Validated position FXint xx=event->win_x; if(xx<0) xx=0; else if(xx>=viewport_w) xx=viewport_w-1; FXint yy=event->win_y; if(yy<0) yy=0; else if(yy>=viewport_h) yy=viewport_h-1; // Find item index=getItemAt(xx,yy); // Got item and different from last time if(0<=index && index!=current){ // Make it the current item setCurrentItem(index,TRUE); // Extend the selection if((options&SELECT_MASK)==LIST_EXTENDEDSELECT){ state=FALSE; extendSelection(index,TRUE); } } return 1; } return 0; } // Mouse moved long FXList::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint oldcursor=cursor; FXuint flg=flags; // Kill the tip flags&=~FLAG_TIP; // Kill the tip timer getApp()->removeTimeout(this,ID_TIPTIMER); // Right mouse scrolling if(flags&FLAG_SCROLLING){ setPosition(event->win_x-grabx,event->win_y-graby); return 1; } // Drag and drop mode if(flags&FLAG_DODRAG){ if(startAutoScroll(event,TRUE)) return 1; handle(this,FXSEL(SEL_DRAGGED,0),ptr); return 1; } // Tentative drag and drop if((flags&FLAG_TRYDRAG) && event->moved){ flags&=~FLAG_TRYDRAG; if(handle(this,FXSEL(SEL_BEGINDRAG,0),ptr)){ flags|=FLAG_DODRAG; } return 1; } // Normal operation if((flags&FLAG_PRESSED) || (options&LIST_AUTOSELECT)){ // Start auto scrolling? if(startAutoScroll(event,FALSE)) return 1; // Find item FXint index=getItemAt(event->win_x,event->win_y); // Got an item different from before if(0<=index && index!=current){ // Make it the current item setCurrentItem(index,TRUE); // Extend the selection if((options&SELECT_MASK)==LIST_EXTENDEDSELECT){ state=FALSE; extendSelection(index,TRUE); } return 1; } } // Reset tip timer if nothing's going on getApp()->addTimeout(this,ID_TIPTIMER,getApp()->getMenuPause()); // Get item we're over cursor=getItemAt(event->win_x,event->win_y); // Force GUI update only when needed return (cursor!=oldcursor)||(flg&FLAG_TIP); } // Pressed a button long FXList::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint index,code; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); flags&=~FLAG_UPDATE; // First change callback if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; // Autoselect mode if(options&LIST_AUTOSELECT) return 1; // Locate item index=getItemAt(event->win_x,event->win_y); // No item if(index<0){ if((options&SELECT_MASK)==LIST_EXTENDEDSELECT){ if(!(event->state&(SHIFTMASK|CONTROLMASK))){ killSelection(TRUE); } } return 1; } // Find out where hit code=hitItem(index,event->win_x,event->win_y); // Change current item setCurrentItem(index,TRUE); // Change item selection state=items[index]->isSelected(); switch(options&SELECT_MASK){ case LIST_EXTENDEDSELECT: if(event->state&SHIFTMASK){ if(0<=anchor){ if(items[anchor]->isEnabled()) selectItem(anchor,TRUE); extendSelection(index,TRUE); } else{ if(items[index]->isEnabled()) selectItem(index,TRUE); setAnchorItem(index); } } else if(event->state&CONTROLMASK){ if(items[index]->isEnabled() && !state) selectItem(index,TRUE); setAnchorItem(index); } else{ if(items[index]->isEnabled() && !state){ killSelection(TRUE); selectItem(index,TRUE); } setAnchorItem(index); } break; case LIST_MULTIPLESELECT: case LIST_SINGLESELECT: if(items[index]->isEnabled() && !state) selectItem(index,TRUE); break; } // Start drag if actually pressed text or icon only if(code && items[index]->isSelected() && items[index]->isDraggable()){ flags|=FLAG_TRYDRAG; } flags|=FLAG_PRESSED; return 1; } return 0; } // Released button long FXList::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXuint flg=flags; if(isEnabled()){ ungrab(); stopAutoScroll(); flags|=FLAG_UPDATE; flags&=~(FLAG_PRESSED|FLAG_TRYDRAG|FLAG_DODRAG); // First chance callback if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; // No activity if(!(flg&FLAG_PRESSED) && !(options&LIST_AUTOSELECT)) return 1; // Was dragging if(flg&FLAG_DODRAG){ handle(this,FXSEL(SEL_ENDDRAG,0),ptr); return 1; } // Selection change switch(options&SELECT_MASK){ case LIST_EXTENDEDSELECT: if(0<=current && items[current]->isEnabled()){ if(event->state&CONTROLMASK){ if(state) deselectItem(current,TRUE); } else if(!(event->state&SHIFTMASK)){ if(state){ killSelection(TRUE); selectItem(current,TRUE); } } } break; case LIST_MULTIPLESELECT: case LIST_SINGLESELECT: if(0<=current && items[current]->isEnabled()){ if(state) deselectItem(current,TRUE); } break; } // Scroll to make item visibke makeItemVisible(current); // Update anchor setAnchorItem(current); // Generate clicked callbacks if(event->click_count==1){ handle(this,FXSEL(SEL_CLICKED,0),(void*)(FXival)current); } else if(event->click_count==2){ handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)(FXival)current); } else if(event->click_count==3){ handle(this,FXSEL(SEL_TRIPLECLICKED,0),(void*)(FXival)current); } // Command callback only when clicked on item if(0<=current && items[current]->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)(FXival)current); } return 1; } return 0; } // Pressed right button long FXList::onRightBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); flags&=~FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; flags|=FLAG_SCROLLING; grabx=event->win_x-pos_x; graby=event->win_y-pos_y; return 1; } return 0; } // Released right button long FXList::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); flags&=~FLAG_SCROLLING; flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // The widget lost the grab for some reason long FXList::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onUngrabbed(sender,sel,ptr); flags&=~(FLAG_DODRAG|FLAG_TRYDRAG|FLAG_PRESSED|FLAG_CHANGED|FLAG_SCROLLING); flags|=FLAG_UPDATE; stopAutoScroll(); return 1; } // Command message long FXList::onCommand(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); } // Clicked in list long FXList::onClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_CLICKED,message),ptr); } // Double clicked in list; ptr may or may not point to an item long FXList::onDoubleClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_DOUBLECLICKED,message),ptr); } // Triple clicked in list; ptr may or may not point to an item long FXList::onTripleClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_TRIPLECLICKED,message),ptr); } // Sort items in ascending order FXint FXList::ascending(const FXListItem* a,const FXListItem* b){ return compare(a->getText(),b->getText()); } // Sort items in descending order FXint FXList::descending(const FXListItem* a,const FXListItem* b){ return compare(b->getText(),a->getText()); } // Sort ascending order, case insensitive FXint FXList::ascendingCase(const FXListItem* a,const FXListItem* b){ return comparecase(a->getText(),b->getText()); } // Sort descending order, case insensitive FXint FXList::descendingCase(const FXListItem* a,const FXListItem* b){ return comparecase(b->getText(),a->getText()); } // Sort the items based on the sort function. void FXList::sortItems(){ register FXListItem *v,*c=0; register FXbool exch=FALSE; register FXint i,j,h; if(sortfunc){ if(0<=current){ c=items[current]; } for(h=1; h<=items.no()/9; h=3*h+1); for(; h>0; h/=3){ for(i=h+1;i<=items.no();i++){ v=items[i-1]; j=i; while(j>h && sortfunc(items[j-h-1],v)>0){ items[j-1]=items[j-h-1]; exch=TRUE; j-=h; } items[j-1]=v; } } if(0<=current){ for(i=0; isetFocus(FALSE); updateItem(current); } } current=index; // Activate new item if(0<=current){ // No visible change if it doen't have the focus if(hasFocus()){ items[current]->setFocus(TRUE); updateItem(current); } } // Notify item change if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)current);} } // In browse select mode, select this item if((options&SELECT_MASK)==LIST_BROWSESELECT && 0<=current && items[current]->isEnabled()){ selectItem(current,notify); } } // Set anchor item void FXList::setAnchorItem(FXint index){ if(index<-1 || items.no()<=index){ fxerror("%s::setAnchorItem: index out of range.\n",getClassName()); } anchor=index; extent=index; } // Create custom item FXListItem *FXList::createItem(const FXString& text,FXIcon* icon,void* ptr){ return new FXListItem(text,icon,ptr); } // Retrieve item FXListItem *FXList::getItem(FXint index) const { if(index<0 || items.no()<=index){ fxerror("%s::getItem: index out of range.\n",getClassName()); } return items[index]; } // Replace item with another FXint FXList::setItem(FXint index,FXListItem* item,FXbool notify){ // Must have item if(!item){ fxerror("%s::setItem: item is NULL.\n",getClassName()); } // Must be in range if(index<0 || items.no()<=index){ fxerror("%s::setItem: index out of range.\n",getClassName()); } // Notify item will be replaced if(notify && target){target->tryHandle(this,FXSEL(SEL_REPLACED,message),(void*)(FXival)index);} // Copy the state over item->state=items[index]->state; // Delete old delete items[index]; // Add new items[index]=item; // Redo layout recalc(); return index; } // Replace item with another FXint FXList::setItem(FXint index,const FXString& text,FXIcon *icon,void* ptr,FXbool notify){ return setItem(index,createItem(text,icon,ptr),notify); } // Insert item FXint FXList::insertItem(FXint index,FXListItem* item,FXbool notify){ register FXint old=current; // Must have item if(!item){ fxerror("%s::insertItem: item is NULL.\n",getClassName()); } // Must be in range if(index<0 || items.no()=index) anchor++; if(extent>=index) extent++; if(current>=index) current++; if(viewable>=index) viewable++; if(current<0 && items.no()==1) current=0; // Notify item has been inserted if(notify && target){target->tryHandle(this,FXSEL(SEL_INSERTED,message),(void*)(FXival)index);} // Current item may have changed if(old!=current){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)current);} } // Was new item if(0<=current && current==index){ if(hasFocus()){ items[current]->setFocus(TRUE); } if((options&SELECT_MASK)==LIST_BROWSESELECT && items[current]->isEnabled()){ selectItem(current,notify); } } // Redo layout recalc(); return index; } // Insert item FXint FXList::insertItem(FXint index,const FXString& text,FXIcon *icon,void* ptr,FXbool notify){ return insertItem(index,createItem(text,icon,ptr),notify); } // Append item FXint FXList::appendItem(FXListItem* item,FXbool notify){ return insertItem(items.no(),item,notify); } // Append item FXint FXList::appendItem(const FXString& text,FXIcon *icon,void* ptr,FXbool notify){ return insertItem(items.no(),createItem(text,icon,ptr),notify); } // Prepend item FXint FXList::prependItem(FXListItem* item,FXbool notify){ return insertItem(0,item,notify); } // Prepend item FXint FXList::prependItem(const FXString& text,FXIcon *icon,void* ptr,FXbool notify){ return insertItem(0,createItem(text,icon,ptr),notify); } // Fill list by appending items from array of strings FXint FXList::fillItems(const FXchar** strings,FXIcon *icon,void* ptr,FXbool notify){ register FXint n=0; if(strings){ while(strings[n]){ appendItem(strings[n++],icon,ptr,notify); } } return n; } // Fill list by appending items from newline separated strings FXint FXList::fillItems(const FXString& strings,FXIcon *icon,void* ptr,FXbool notify){ register FXint n=0; FXString text; while(!(text=strings.section('\n',n)).empty()){ appendItem(text,icon,ptr,notify); n++; } return n; } // Move item from oldindex to newindex FXint FXList::moveItem(FXint newindex,FXint oldindex,FXbool notify){ register FXint old=current; register FXListItem *item; // Must be in range if(newindex<0 || oldindex<0 || items.no()<=newindex || items.no()<=oldindex){ fxerror("%s::moveItem: index out of range.\n",getClassName()); } // Did it change? if(oldindex!=newindex){ // Move item item=items[oldindex]; items.erase(oldindex); items.insert(newindex,item); // Move item down if(newindextryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)current);} } // Redo layout recalc(); } return newindex; } // Extract node from list FXListItem* FXList::extractItem(FXint index,FXbool notify){ register FXListItem *result; register FXint old=current; // Must be in range if(index<0 || items.no()<=index){ fxerror("%s::extractItem: index out of range.\n",getClassName()); } // Notify item will be deleted if(notify && target){target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)(FXival)index);} // Extract item result=items[index]; // Remove item from list items.erase(index); // Adjust indices if(anchor>index || anchor>=items.no()) anchor--; if(extent>index || extent>=items.no()) extent--; if(current>index || current>=items.no()) current--; if(viewable>index || viewable>=items.no()) viewable--; // Current item has changed if(index<=old){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)current);} } // Deleted current item if(0<=current && index==old){ if(hasFocus()){ items[current]->setFocus(TRUE); } if((options&SELECT_MASK)==LIST_BROWSESELECT && items[current]->isEnabled()){ selectItem(current,notify); } } // Redo layout recalc(); // Return the item return result; } // Remove node from list void FXList::removeItem(FXint index,FXbool notify){ register FXint old=current; // Must be in range if(index<0 || items.no()<=index){ fxerror("%s::removeItem: index out of range.\n",getClassName()); } // Notify item will be deleted if(notify && target){target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)(FXival)index);} // Delete item delete items[index]; // Remove item from list items.erase(index); // Adjust indices if(anchor>index || anchor>=items.no()) anchor--; if(extent>index || extent>=items.no()) extent--; if(current>index || current>=items.no()) current--; if(viewable>index || viewable>=items.no()) viewable--; // Current item has changed if(index<=old){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)current);} } // Deleted current item if(0<=current && index==old){ if(hasFocus()){ items[current]->setFocus(TRUE); } if((options&SELECT_MASK)==LIST_BROWSESELECT && items[current]->isEnabled()){ selectItem(current,notify); } } // Redo layout recalc(); } // Remove all items void FXList::clearItems(FXbool notify){ register FXint old=current; // Delete items for(FXint index=items.no()-1; 0<=index; index--){ if(notify && target){target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)(FXival)index);} delete items[index]; } // Free array items.clear(); // Adjust indices current=-1; anchor=-1; extent=-1; viewable=-1; // Current item has changed if(old!=-1){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)-1);} } // Redo layout recalc(); } typedef FXint (*FXCompareFunc)(const FXString&,const FXString&,FXint); // Get item by name FXint FXList::findItem(const FXString& text,FXint start,FXuint flgs) const { register FXCompareFunc comparefunc; register FXint index,len; if(0getText(),text,len)==0) return index; } if(!(flgs&SEARCH_WRAP)) return -1; for(index=items.no()-1; startgetText(),text,len)==0) return index; } } else{ if(start<0) start=0; for(index=start; indexgetText(),text,len)==0) return index; } if(!(flgs&SEARCH_WRAP)) return -1; for(index=0; indexgetText(),text,len)==0) return index; } } } return -1; } // Get item by data FXint FXList::findItemByData(const void *ptr,FXint start,FXuint flgs) const { register FXint index; if(0getData()==ptr) return index; } if(!(flgs&SEARCH_WRAP)) return -1; for(index=items.no()-1; startgetData()==ptr) return index; } } else{ if(start<0) start=0; for(index=start; indexgetData()==ptr) return index; } if(!(flgs&SEARCH_WRAP)) return -1; for(index=0; indexgetData()==ptr) return index; } } } return -1; } // Change the font void FXList::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Set text color void FXList::setTextColor(FXColor clr){ if(textColor!=clr){ textColor=clr; update(); } } // Set select background color void FXList::setSelBackColor(FXColor clr){ if(selbackColor!=clr){ selbackColor=clr; update(); } } // Set selected text color void FXList::setSelTextColor(FXColor clr){ if(seltextColor!=clr){ seltextColor=clr; update(); } } // Change list style void FXList::setListStyle(FXuint style){ options=(options&~LIST_MASK) | (style&LIST_MASK); } // Get list style FXuint FXList::getListStyle() const { return (options&LIST_MASK); } // Change help text void FXList::setHelpText(const FXString& text){ help=text; } // Save data void FXList::save(FXStream& store) const { FXScrollArea::save(store); items.save(store); store << anchor; store << current; store << extent; store << textColor; store << selbackColor; store << seltextColor; store << listWidth; store << listHeight; store << visible; store << font; store << help; } // Load data void FXList::load(FXStream& store){ FXScrollArea::load(store); items.load(store); store >> anchor; store >> current; store >> extent; store >> textColor; store >> selbackColor; store >> seltextColor; store >> listWidth; store >> listHeight; store >> visible; store >> font; store >> help; } // Clean up FXList::~FXList(){ getApp()->removeTimeout(this,ID_TIPTIMER); getApp()->removeTimeout(this,ID_LOOKUPTIMER); clearItems(FALSE); font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXListBox.cpp000066400000000000000000000416701326741342000157620ustar00rootroot00000000000000/******************************************************************************** * * * L i s t B o x O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXListBox.cpp,v 1.63.2.2 2007/06/07 20:17:57 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObjectList.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXFont.h" #include "FXDC.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXTextField.h" #include "FXButton.h" #include "FXMenuButton.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXShell.h" #include "FXPopup.h" #include "FXScrollBar.h" #include "FXScrollArea.h" #include "FXList.h" #include "FXListBox.h" /* Notes: - Need to catch up/down arrow keys. - Listbox turns OFF GUI Updating while being manipulated. - No reaction to up and down arrow while disabled. */ #define LISTBOX_MASK (0) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXListBox) FXListBoxMap[]={ FXMAPFUNC(SEL_FOCUS_SELF,0,FXListBox::onFocusSelf), FXMAPFUNC(SEL_FOCUS_UP,0,FXListBox::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXListBox::onFocusDown), FXMAPFUNC(SEL_UPDATE,FXListBox::ID_LIST,FXListBox::onListUpdate), FXMAPFUNC(SEL_CLICKED,FXListBox::ID_LIST,FXListBox::onListClicked), FXMAPFUNC(SEL_COMMAND,FXListBox::ID_LIST,FXListBox::onListClicked), FXMAPFUNC(SEL_CHANGED,FXListBox::ID_LIST,FXListBox::onListChanged), FXMAPFUNC(SEL_LEFTBUTTONPRESS,FXListBox::ID_FIELD,FXListBox::onFieldButton), FXMAPFUNC(SEL_MOUSEWHEEL,FXListBox::ID_FIELD,FXListBox::onMouseWheel), FXMAPFUNC(SEL_COMMAND,FXListBox::ID_SETVALUE,FXListBox::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXListBox::ID_SETINTVALUE,FXListBox::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXListBox::ID_GETINTVALUE,FXListBox::onCmdGetIntValue), }; // Object implementation FXIMPLEMENT(FXListBox,FXPacker,FXListBoxMap,ARRAYNUMBER(FXListBoxMap)) // List box FXListBox::FXListBox(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXPacker(p,opts,x,y,w,h, 0,0,0,0, 0,0){ flags|=FLAG_ENABLED; target=tgt; message=sel; field=new FXButton(this," ",NULL,this,FXListBox::ID_FIELD,ICON_BEFORE_TEXT|JUSTIFY_LEFT, 0,0,0,0, pl,pr,pt,pb); field->setBackColor(getApp()->getBackColor()); pane=new FXPopup(this,FRAME_LINE); list=new FXList(pane,this,FXListBox::ID_LIST,LIST_BROWSESELECT|LIST_AUTOSELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y|SCROLLERS_TRACK|HSCROLLING_OFF); button=new FXMenuButton(this,FXString::null,NULL,pane,FRAME_RAISED|FRAME_THICK|MENUBUTTON_DOWN|MENUBUTTON_ATTACH_RIGHT, 0,0,0,0, 0,0,0,0); button->setXOffset(border); button->setYOffset(border); flags&=~FLAG_UPDATE; // Never GUI update } // Create window void FXListBox::create(){ FXPacker::create(); pane->create(); } // Detach window void FXListBox::detach(){ FXPacker::detach(); pane->detach(); } // Destroy window void FXListBox::destroy(){ pane->destroy(); FXPacker::destroy(); } // Enable the window void FXListBox::enable(){ if(!isEnabled()){ FXPacker::enable(); field->setBackColor(getApp()->getBackColor()); field->enable(); button->enable(); } } // Disable the window void FXListBox::disable(){ if(isEnabled()){ FXPacker::disable(); field->setBackColor(getApp()->getBaseColor()); field->disable(); button->disable(); } } // Get default width FXint FXListBox::getDefaultWidth(){ FXint ww,pw; ww=field->getDefaultWidth()+button->getDefaultWidth()+(border<<1); pw=pane->getDefaultWidth(); return FXMAX(ww,pw); } // Get default height FXint FXListBox::getDefaultHeight(){ FXint th,bh; th=field->getDefaultHeight(); bh=button->getDefaultHeight(); return FXMAX(th,bh)+(border<<1); } // Recalculate layout void FXListBox::layout(){ FXint buttonWidth,fieldWidth,itemHeight; itemHeight=height-(border<<1); buttonWidth=button->getDefaultWidth(); fieldWidth=width-buttonWidth-(border<<1); field->position(border,border,fieldWidth,itemHeight); button->position(border+fieldWidth,border,buttonWidth,itemHeight); pane->resize(width,pane->getDefaultHeight()); flags&=~FLAG_DIRTY; } // Update value from a message long FXListBox::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCurrentItem((FXint)(FXival)ptr); return 1; } // Obtain value from list long FXListBox::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getCurrentItem(); return 1; } // Update value from a message long FXListBox::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setCurrentItem(*((FXint*)ptr)); return 1; } // Forward GUI update of list to target; but only if pane is not popped long FXListBox::onListUpdate(FXObject*,FXSelector,void*){ return target && !isPaneShown() && target->tryHandle(this,FXSEL(SEL_UPDATE,message),NULL); } // Item in list widget changed long FXListBox::onListChanged(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_CHANGED,message),ptr); } // Forward clicked message from list to target long FXListBox::onListClicked(FXObject*,FXSelector sel,void* ptr){ button->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(FXSELTYPE(sel)==SEL_COMMAND){ field->setText(getItemText((FXint)(FXival)ptr)); field->setIcon(getItemIcon((FXint)(FXival)ptr)); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); } return 1; } // Pressed left button in text field long FXListBox::onFieldButton(FXObject*,FXSelector,void*){ button->handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); // Post the list return 1; } // Bounce focus to the field long FXListBox::onFocusSelf(FXObject* sender,FXSelector,void* ptr){ return field->handle(sender,FXSEL(SEL_FOCUS_SELF,0),ptr); } // Select upper item long FXListBox::onFocusUp(FXObject*,FXSelector,void*){ if(isEnabled()){ FXint index=getCurrentItem(); if(index<0) index=getNumItems()-1; else if(0code<0){ if(index<0) index=0; else if(indexcode>0){ if(index<0) index=getNumItems()-1; else if(0getNumItems(); } // Get number of visible items FXint FXListBox::getNumVisible() const { return list->getNumVisible(); } // Set number of visible items void FXListBox::setNumVisible(FXint nvis){ list->setNumVisible(nvis); } // Is item current FXbool FXListBox::isItemCurrent(FXint index) const { return list->isItemCurrent(index); } // Change current item void FXListBox::setCurrentItem(FXint index,FXbool notify){ FXint current=list->getCurrentItem(); if(current!=index){ list->setCurrentItem(index); list->makeItemVisible(index); if(0<=index){ field->setIcon(list->getItemIcon(index)); field->setText(list->getItemText(index)); } else{ field->setIcon(NULL); field->setText(" "); } if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)index);} } } // Get current item FXint FXListBox::getCurrentItem() const { return list->getCurrentItem(); } // Retrieve item FXString FXListBox::getItem(FXint index) const { return list->getItem(index)->getText(); } // Replace text of item at index FXint FXListBox::setItem(FXint index,const FXString& text,FXIcon* icon,void* ptr){ if(index<0 || list->getNumItems()<=index){ fxerror("%s::setItem: index out of range.\n",getClassName()); } list->setItem(index,text,icon,ptr); if(isItemCurrent(index)){ field->setIcon(icon); field->setText(text); } recalc(); return index; } // Fill list by appending items from array of strings FXint FXListBox::fillItems(const FXchar** strings,FXIcon* icon,void* ptr){ register FXint numberofitems=list->getNumItems(); register FXint n=list->fillItems(strings,icon,ptr); if(numberofitems<=list->getCurrentItem()){ field->setIcon(list->getItemIcon(list->getCurrentItem())); field->setText(list->getItemText(list->getCurrentItem())); } recalc(); return n; } // Fill list by appending items from newline separated strings FXint FXListBox::fillItems(const FXString& strings,FXIcon* icon,void* ptr){ register FXint numberofitems=list->getNumItems(); register FXint n=list->fillItems(strings,icon,ptr); if(numberofitems<=list->getCurrentItem()){ field->setIcon(list->getItemIcon(list->getCurrentItem())); field->setText(list->getItemText(list->getCurrentItem())); } recalc(); return n; } // Insert item at index FXint FXListBox::insertItem(FXint index,const FXString& text,FXIcon* icon,void* ptr){ if(index<0 || list->getNumItems()insertItem(index,text,icon,ptr); if(isItemCurrent(index)){ field->setIcon(icon); field->setText(text); } recalc(); return index; } // Append item FXint FXListBox::appendItem(const FXString& text,FXIcon* icon,void* ptr){ list->appendItem(text,icon,ptr); if(isItemCurrent(getNumItems()-1)){ field->setIcon(icon); field->setText(text); } recalc(); return getNumItems()-1; } // Prepend item FXint FXListBox::prependItem(const FXString& text,FXIcon* icon,void* ptr){ list->prependItem(text,icon,ptr); if(isItemCurrent(0)){ field->setIcon(icon); field->setText(text); } recalc(); return 0; } // Move item from oldindex to newindex FXint FXListBox::moveItem(FXint newindex,FXint oldindex){ FXint current=list->getCurrentItem(); list->moveItem(newindex,oldindex); if(current!=list->getCurrentItem()){ current=list->getCurrentItem(); if(0<=current){ field->setIcon(list->getItemIcon(current)); field->setText(list->getItemText(current)); } else{ field->setIcon(NULL); field->setText(" "); } } recalc(); return newindex; } // Extract item from list FXListItem* FXListBox::extractItem(FXint index){ register FXint current=list->getCurrentItem(); register FXListItem *result=list->extractItem(index); if(index==current){ current=list->getCurrentItem(); if(0<=current){ field->setIcon(list->getItemIcon(current)); field->setText(list->getItemText(current)); } else{ field->setIcon(NULL); field->setText(" "); } } recalc(); return result; } // Remove given item void FXListBox::removeItem(FXint index){ register FXint current=list->getCurrentItem(); list->removeItem(index); if(index==current){ current=list->getCurrentItem(); if(0<=current){ field->setIcon(list->getItemIcon(current)); field->setText(list->getItemText(current)); } else{ field->setIcon(NULL); field->setText(" "); } } recalc(); } // Remove all items void FXListBox::clearItems(){ list->clearItems(); field->setIcon(NULL); field->setText(" "); recalc(); } // Get item by name FXint FXListBox::findItem(const FXString& text,FXint start,FXuint flgs) const { return list->findItem(text,start,flgs); } // Get item by data FXint FXListBox::findItemByData(const void *ptr,FXint start,FXuint flgs) const { return list->findItemByData(ptr,start,flgs); } // Set item text void FXListBox::setItemText(FXint index,const FXString& txt){ if(isItemCurrent(index)) field->setText(txt); list->setItemText(index,txt); recalc(); } // Get item text FXString FXListBox::getItemText(FXint index) const { return list->getItemText(index); } // Set item icon void FXListBox::setItemIcon(FXint index,FXIcon* icon,FXbool owned){ if(isItemCurrent(index)) field->setIcon(icon); list->setItemIcon(index,icon,owned); recalc(); } // Get item icon FXIcon* FXListBox::getItemIcon(FXint index) const { return list->getItemIcon(index); } // Set item data void FXListBox::setItemData(FXint index,void* ptr) const { list->setItemData(index,ptr); } // Get item data void* FXListBox::getItemData(FXint index) const { return list->getItemData(index); } // Is the pane shown FXbool FXListBox::isPaneShown() const { return pane->shown(); } // Set font void FXListBox::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } field->setFont(fnt); list->setFont(fnt); recalc(); } // Obtain font FXFont* FXListBox::getFont() const { return field->getFont(); } // Set window background color void FXListBox::setBackColor(FXColor clr){ field->setBackColor(clr); list->setBackColor(clr); } // Get background color FXColor FXListBox::getBackColor() const { return field->getBackColor(); } // Set text color void FXListBox::setTextColor(FXColor clr){ field->setTextColor(clr); list->setTextColor(clr); } // Return text color FXColor FXListBox::getTextColor() const { return field->getTextColor(); } // Set select background color void FXListBox::setSelBackColor(FXColor clr){ list->setSelBackColor(clr); } // Return selected background color FXColor FXListBox::getSelBackColor() const { return list->getSelBackColor(); } // Set selected text color void FXListBox::setSelTextColor(FXColor clr){ list->setSelTextColor(clr); } // Return selected text color FXColor FXListBox::getSelTextColor() const { return list->getSelTextColor(); } // Sort items using current sort function void FXListBox::sortItems(){ list->sortItems(); } // Return sort function FXListSortFunc FXListBox::getSortFunc() const { return list->getSortFunc(); } // Change sort function void FXListBox::setSortFunc(FXListSortFunc func){ list->setSortFunc(func); } // Set help text void FXListBox::setHelpText(const FXString& txt){ field->setHelpText(txt); } // Get help text const FXString& FXListBox::getHelpText() const { return field->getHelpText(); } // Set tip text void FXListBox::setTipText(const FXString& txt){ field->setTipText(txt); } // Get tip text const FXString& FXListBox::getTipText() const { return field->getTipText(); } // Save object to stream void FXListBox::save(FXStream& store) const { FXPacker::save(store); store << field; store << button; store << list; store << pane; } // Load object from stream void FXListBox::load(FXStream& store){ FXPacker::load(store); store >> field; store >> button; store >> list; store >> pane; } // Delete it FXListBox::~FXListBox(){ delete pane; pane=(FXPopup*)-1L; field=(FXButton*)-1L; button=(FXMenuButton*)-1L; list=(FXList*)-1L; } } fox1.6-1.6.57/src/FXMDIButton.cpp000066400000000000000000000323031326741342000161740ustar00rootroot00000000000000/******************************************************************************** * * * M u l t i p l e D o c u m e n t B u t t o n * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMDIButton.cpp,v 1.28 2006/01/22 17:58:33 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXGIFIcon.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXButton.h" #include "FXMenuButton.h" #include "FXComposite.h" #include "FXShell.h" #include "FXPopup.h" #include "FXMenuPane.h" #include "FXMenuCaption.h" #include "FXMenuCommand.h" #include "FXScrollBar.h" #include "FXScrollArea.h" #include "FXMDIButton.h" #include "FXMDIChild.h" #include "FXMDIClient.h" #include "icons.h" #define MENUBUTTONWINDOW_WIDTH 16 #define MENUBUTTONWINDOW_HEIGHT 14 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMDIDeleteButton) FXMDIDeleteButtonMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMDIDeleteButton::onPaint), }; // Object implementation FXIMPLEMENT(FXMDIDeleteButton,FXButton,FXMDIDeleteButtonMap,ARRAYNUMBER(FXMDIDeleteButtonMap)) // Make delete button FXMDIDeleteButton::FXMDIDeleteButton(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXButton(p,"\tClose\tClose Window.",NULL,tgt,sel,opts,x,y,w,h,3,3,2,2){ } FXint FXMDIDeleteButton::getDefaultWidth(){ return padleft+padright+8+(border<<1); } FXint FXMDIDeleteButton::getDefaultHeight(){ return padtop+padbottom+8+(border<<1); } // Handle repaint long FXMDIDeleteButton::onPaint(FXObject*,FXSelector,void* ptr){ FXDCWindow dc(this,(FXEvent*)ptr); FXint xx,yy; dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(options&(FRAME_RAISED|FRAME_SUNKEN)){ if(state==STATE_UP){ if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } else{ if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width-1,height-1); else drawSunkenRectangle(dc,0,0,width,height); } } xx=(width-8)/2; yy=(height-8)/2; if(state){ ++xx; ++yy; } if(isEnabled()) dc.setForeground(textColor); else dc.setForeground(shadowColor); #ifndef WIN32 dc.drawLine(xx, yy, xx+8,yy+8); dc.drawLine(xx+1,yy, xx+8,yy+7); dc.drawLine(xx, yy+1,xx+7,yy+8); dc.drawLine(xx+8,yy, xx, yy+8); dc.drawLine(xx+8,yy+1,xx+1,yy+8); dc.drawLine(xx+7,yy, xx, yy+7); #else dc.drawLine(xx, yy, xx+9,yy+9); dc.drawLine(xx+1,yy, xx+9,yy+8); dc.drawLine(xx, yy+1,xx+8,yy+9); dc.drawLine(xx, yy+8,xx+9,yy-1); dc.drawLine(xx+1,yy+8,xx+9, yy); dc.drawLine(xx, yy+7,xx+8,yy-1); #endif return 1; } /*******************************************************************************/ // Map FXDEFMAP(FXMDIRestoreButton) FXMDIRestoreButtonMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMDIRestoreButton::onPaint), }; // Object implementation FXIMPLEMENT(FXMDIRestoreButton,FXButton,FXMDIRestoreButtonMap,ARRAYNUMBER(FXMDIRestoreButtonMap)) // Make restore button FXMDIRestoreButton::FXMDIRestoreButton(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXButton(p,"\tRestore\tRestore Window.",NULL,tgt,sel,opts,x,y,w,h,3,3,2,2){ } FXint FXMDIRestoreButton::getDefaultWidth(){ return padleft+padright+8+(border<<1); } FXint FXMDIRestoreButton::getDefaultHeight(){ return padtop+padbottom+8+(border<<1); } // Handle repaint long FXMDIRestoreButton::onPaint(FXObject*,FXSelector,void* ptr){ FXDCWindow dc(this,(FXEvent*)ptr); FXint xx,yy; dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(options&(FRAME_RAISED|FRAME_SUNKEN)){ if(state==STATE_UP){ if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } else{ if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width-1,height-1); else drawSunkenRectangle(dc,0,0,width,height); } } xx=(width-8)/2; yy=(height-8)/2; if(state){ ++xx; ++yy; } if(isEnabled()) dc.setForeground(textColor); else dc.setForeground(shadowColor); dc.fillRectangle(xx+3,yy,6,2); dc.drawRectangle(xx+3,yy,6,5); dc.setForeground(backColor); dc.fillRectangle(xx,yy+3,6,5); if(isEnabled()) dc.setForeground(textColor); else dc.setForeground(shadowColor); dc.fillRectangle(xx,yy+3,6,2); dc.drawRectangle(xx,yy+3,6,5); return 1; } /*******************************************************************************/ // Map FXDEFMAP(FXMDIMaximizeButton) FXMDIMaximizeButtonMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMDIMaximizeButton::onPaint), }; // Object implementation FXIMPLEMENT(FXMDIMaximizeButton,FXButton,FXMDIMaximizeButtonMap,ARRAYNUMBER(FXMDIMaximizeButtonMap)) // Make maximize button FXMDIMaximizeButton::FXMDIMaximizeButton(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXButton(p,"\tMaximize\tMaximize Window.",NULL,tgt,sel,opts,x,y,w,h,3,3,2,2){ } FXint FXMDIMaximizeButton::getDefaultWidth(){ return padleft+padright+8+(border<<1); } FXint FXMDIMaximizeButton::getDefaultHeight(){ return padtop+padbottom+8+(border<<1); } // Handle repaint long FXMDIMaximizeButton::onPaint(FXObject*,FXSelector,void* ptr){ FXDCWindow dc(this,(FXEvent*)ptr); FXint xx,yy; dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(options&(FRAME_RAISED|FRAME_SUNKEN)){ if(state==STATE_UP){ if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } else{ if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width-1,height-1); else drawSunkenRectangle(dc,0,0,width,height); } } xx=(width-8)/2; yy=(height-8)/2; if(state){ ++xx; ++yy; } if(isEnabled()) dc.setForeground(textColor); else dc.setForeground(shadowColor); dc.fillRectangle(xx,yy,8,2); dc.drawRectangle(xx,yy,8,8); return 1; } /*******************************************************************************/ // Map FXDEFMAP(FXMDIMinimizeButton) FXMDIMinimizeButtonMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMDIMinimizeButton::onPaint), }; // Object implementation FXIMPLEMENT(FXMDIMinimizeButton,FXButton,FXMDIMinimizeButtonMap,ARRAYNUMBER(FXMDIMinimizeButtonMap)) // Make minimize button FXMDIMinimizeButton::FXMDIMinimizeButton(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXButton(p,"\tMinimize\tMinimize Window.",NULL,tgt,sel,opts,x,y,w,h,3,3,2,2){ } FXint FXMDIMinimizeButton::getDefaultWidth(){ return padleft+padright+8+(border<<1); } FXint FXMDIMinimizeButton::getDefaultHeight(){ return padtop+padbottom+8+(border<<1); } // Handle repaint long FXMDIMinimizeButton::onPaint(FXObject*,FXSelector,void* ptr){ FXDCWindow dc(this,(FXEvent*)ptr); FXint xx,yy; dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(options&(FRAME_RAISED|FRAME_SUNKEN)){ if(state==STATE_UP){ if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } else{ if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width-1,height-1); else drawSunkenRectangle(dc,0,0,width,height); } } xx=(width-8)/2; yy=(height-8)/2; if(state){ ++xx; ++yy; } if(isEnabled()) dc.setForeground(textColor); else dc.setForeground(shadowColor); dc.fillRectangle(xx,yy+6,8,2); return 1; } /*******************************************************************************/ // Map FXDEFMAP(FXMDIWindowButton) FXMDIWindowButtonMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMDIWindowButton::onPaint), }; // Object implementation FXIMPLEMENT(FXMDIWindowButton,FXMenuButton,FXMDIWindowButtonMap,ARRAYNUMBER(FXMDIWindowButtonMap)) // Make window button FXMDIWindowButton::FXMDIWindowButton(FXComposite* p,FXPopup* pup,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXMenuButton(p,FXString::null,NULL,pup,opts,x,y,w,h,0,0,0,0){ tip="Menu"; target=tgt; message=sel; } FXint FXMDIWindowButton::getDefaultWidth(){ FXint w=icon?icon->getWidth():MENUBUTTONWINDOW_WIDTH; return padleft+padright+(border<<1)+w; } FXint FXMDIWindowButton::getDefaultHeight(){ FXint h=icon?icon->getHeight():MENUBUTTONWINDOW_HEIGHT; return padtop+padbottom+(border<<1)+h; } // Handle repaint long FXMDIWindowButton::onPaint(FXObject*,FXSelector,void* ptr){ FXDCWindow dc(this,(FXEvent*)ptr); FXint ix,iy,iw,ih; dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); drawFrame(dc,0,0,width,height); if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); } else{ iw=MENUBUTTONWINDOW_WIDTH; ih=MENUBUTTONWINDOW_HEIGHT; } ix=(width-iw)/2; iy=(height-ih)/2; if(icon){ dc.drawIcon(icon,ix,iy); } else{ dc.setForeground(shadowColor); dc.drawLine(ix,iy,MENUBUTTONWINDOW_WIDTH-1,iy); dc.drawLine(ix,iy,ix,MENUBUTTONWINDOW_HEIGHT-1); dc.drawLine(ix,iy+MENUBUTTONWINDOW_HEIGHT-2,ix+MENUBUTTONWINDOW_WIDTH-2,iy+MENUBUTTONWINDOW_HEIGHT-2); dc.drawLine(ix+1,iy+4,ix+MENUBUTTONWINDOW_WIDTH-2,iy+4); dc.drawLine(ix+MENUBUTTONWINDOW_WIDTH-2,iy,ix+MENUBUTTONWINDOW_WIDTH-2,iy+MENUBUTTONWINDOW_HEIGHT-2); dc.setForeground(baseColor); dc.drawLine(ix+1,iy+1,MENUBUTTONWINDOW_WIDTH-3,iy+1); dc.drawLine(ix+1,iy+1,ix+1,MENUBUTTONWINDOW_HEIGHT-3); dc.setForeground(textColor); dc.drawLine(ix,iy+MENUBUTTONWINDOW_HEIGHT-1,ix+MENUBUTTONWINDOW_WIDTH,iy+MENUBUTTONWINDOW_HEIGHT-1); dc.drawLine(ix+MENUBUTTONWINDOW_WIDTH-1,iy,ix+MENUBUTTONWINDOW_WIDTH-1,iy+MENUBUTTONWINDOW_HEIGHT-1); dc.drawLine(ix+2,iy+2,ix+MENUBUTTONWINDOW_WIDTH-2,iy+2); dc.drawLine(ix+2,iy+3,ix+MENUBUTTONWINDOW_WIDTH-2,iy+3); dc.setForeground(hiliteColor); dc.fillRectangle(ix+2,iy+5,MENUBUTTONWINDOW_WIDTH-4,MENUBUTTONWINDOW_HEIGHT-7); dc.drawPoint(ix+MENUBUTTONWINDOW_WIDTH-4,iy+3); dc.drawPoint(ix+MENUBUTTONWINDOW_WIDTH-6,iy+3); dc.drawPoint(ix+MENUBUTTONWINDOW_WIDTH-8,iy+3); } return 1; } /*******************************************************************************/ // Object implementation FXIMPLEMENT(FXMDIMenu,FXMenuPane,NULL,0) // Convenience constructor FXMDIMenu::FXMDIMenu(FXWindow *owner,FXObject* tgt):FXMenuPane(owner){ closeicon=new FXGIFIcon(getApp(),winclose); maximizeicon=new FXGIFIcon(getApp(),winmaximize); minimizeicon=new FXGIFIcon(getApp(),winminimize); restoreicon=new FXGIFIcon(getApp(),winrestore); new FXMenuCommand(this,"&Next\t\tNext window.",NULL,tgt,FXWindow::ID_MDI_NEXT,0); new FXMenuCommand(this,"&Previous\t\tPrevious window.",NULL,tgt,FXWindow::ID_MDI_PREV,0); new FXMenuCommand(this,"&Restore\t\tRestore window.",restoreicon,tgt,FXWindow::ID_MDI_RESTORE,0); new FXMenuCommand(this,"&Minimize\t\tMinimize window.",minimizeicon,tgt,FXWindow::ID_MDI_MINIMIZE,0); new FXMenuCommand(this,"&Maximize\t\tMaximize window.",maximizeicon,tgt,FXWindow::ID_MDI_MAXIMIZE,0); new FXMenuCommand(this,"&Close\t\tClose window.",closeicon,tgt,FXWindow::ID_MDI_CLOSE,0); } // Clean up FXMDIMenu::~FXMDIMenu(){ delete closeicon; delete maximizeicon; delete minimizeicon; delete restoreicon; closeicon=(FXIcon*)-1L; maximizeicon=(FXIcon*)-1L; minimizeicon=(FXIcon*)-1L; restoreicon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXMDIChild.cpp000066400000000000000000001047731326741342000157570ustar00rootroot00000000000000/******************************************************************************** * * * M u l t i p l e D o c u m e n t C h i l d W i n d o w * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMDIChild.cpp,v 1.96.2.3 2007/04/10 21:05:07 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXGIFIcon.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXButton.h" #include "FXMenuButton.h" #include "FXComposite.h" #include "FXShell.h" #include "FXPopup.h" #include "FXMenuPane.h" #include "FXScrollBar.h" #include "FXScrollArea.h" #include "FXMDIButton.h" #include "FXMDIChild.h" #include "FXMDIClient.h" /* Notes: - Stacking order changes should be performed by MDIClient! - Need options for MDI child decorations (close btn, window menu, min btn, max btn, title etc). - Iconified version should be fixed size, showing as much of title as feasible (tail with ...'s) - Initial icon placement on the bottom of the MDIClient somehow... - Close v.s. delete messages are not consistent. */ #define BORDERWIDTH 4 // MDI Child border width #define HANDLESIZE 20 // Resize handle length #define MINWIDTH 80 // Minimum width #define MINHEIGHT 30 // Minimum height #define TITLESPACE 120 // Width of title when minimized using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMDIChild) FXMDIChildMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMDIChild::onPaint), FXMAPFUNC(SEL_MOTION,0,FXMDIChild::onMotion), FXMAPFUNC(SEL_FOCUSIN,0,FXMDIChild::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXMDIChild::onFocusOut), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXMDIChild::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXMDIChild::onLeftBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXMDIChild::onMiddleBtnPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXMDIChild::onMiddleBtnRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXMDIChild::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXMDIChild::onRightBtnRelease), FXMAPFUNC(SEL_CLOSE,0,FXMDIChild::onCmdClose), FXMAPFUNC(SEL_SELECTED,0,FXMDIChild::onSelected), FXMAPFUNC(SEL_DESELECTED,0,FXMDIChild::onDeselected), FXMAPFUNC(SEL_FOCUS_SELF,0,FXMDIChild::onFocusSelf), FXMAPFUNC(SEL_UPDATE,FXMDIChild::ID_MDI_CLOSE,FXMDIChild::onUpdClose), FXMAPFUNC(SEL_UPDATE,FXMDIChild::ID_MDI_MAXIMIZE,FXMDIChild::onUpdMaximize), FXMAPFUNC(SEL_UPDATE,FXMDIChild::ID_MDI_MINIMIZE,FXMDIChild::onUpdMinimize), FXMAPFUNC(SEL_UPDATE,FXMDIChild::ID_MDI_RESTORE,FXMDIChild::onUpdRestore), FXMAPFUNC(SEL_UPDATE,FXMDIChild::ID_MDI_WINDOW,FXMDIChild::onUpdWindow), FXMAPFUNC(SEL_UPDATE,FXMDIChild::ID_MDI_MENUCLOSE,FXMDIChild::onUpdMenuClose), FXMAPFUNC(SEL_UPDATE,FXMDIChild::ID_MDI_MENUMINIMIZE,FXMDIChild::onUpdMenuMinimize), FXMAPFUNC(SEL_UPDATE,FXMDIChild::ID_MDI_MENURESTORE,FXMDIChild::onUpdMenuRestore), FXMAPFUNC(SEL_UPDATE,FXMDIChild::ID_MDI_MENUWINDOW,FXMDIChild::onUpdMenuWindow), FXMAPFUNC(SEL_COMMAND,FXMDIChild::ID_MDI_CLOSE,FXMDIChild::onCmdClose), FXMAPFUNC(SEL_COMMAND,FXMDIChild::ID_MDI_MAXIMIZE,FXMDIChild::onCmdMaximize), FXMAPFUNC(SEL_COMMAND,FXMDIChild::ID_MDI_MINIMIZE,FXMDIChild::onCmdMinimize), FXMAPFUNC(SEL_COMMAND,FXMDIChild::ID_MDI_RESTORE,FXMDIChild::onCmdRestore), FXMAPFUNC(SEL_COMMAND,FXMDIChild::ID_MDI_MENUCLOSE,FXMDIChild::onCmdClose), FXMAPFUNC(SEL_COMMAND,FXMDIChild::ID_MDI_MENUMINIMIZE,FXMDIChild::onCmdMinimize), FXMAPFUNC(SEL_COMMAND,FXMDIChild::ID_MDI_MENURESTORE,FXMDIChild::onCmdRestore), FXMAPFUNC(SEL_COMMAND,FXMDIChild::ID_SETSTRINGVALUE,FXMDIChild::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXMDIChild::ID_GETSTRINGVALUE,FXMDIChild::onCmdGetStringValue), FXMAPFUNC(SEL_COMMAND,FXMDIChild::ID_SETICONVALUE,FXMDIChild::onCmdSetIconValue), FXMAPFUNC(SEL_COMMAND,FXMDIChild::ID_GETICONVALUE,FXMDIChild::onCmdGetIconValue), }; // Object implementation FXIMPLEMENT(FXMDIChild,FXComposite,FXMDIChildMap,ARRAYNUMBER(FXMDIChildMap)) // Serialization FXMDIChild::FXMDIChild(){ flags|=FLAG_ENABLED|FLAG_SHOWN; windowbtn=(FXMenuButton*)-1L; minimizebtn=(FXButton*)-1L; restorebtn=(FXButton*)-1L; maximizebtn=(FXButton*)-1L; deletebtn=(FXButton*)-1L; font=(FXFont*)-1L; baseColor=0; hiliteColor=0; shadowColor=0; borderColor=0; titleColor=0; titleBackColor=0; iconPosX=0; iconPosY=0; iconWidth=0; iconHeight=0; normalPosX=0; normalPosY=0; normalWidth=0; normalHeight=0; spotx=0; spoty=0; xoff=0; yoff=0; newx=0; newy=0; neww=0; newh=0; mode=DRAG_NONE; } // Create MDI Child Window FXMDIChild::FXMDIChild(FXMDIClient* p,const FXString& name,FXIcon* ic,FXPopup* pup,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXComposite(p,opts,x,y,w,h),title(name){ flags|=FLAG_ENABLED|FLAG_SHOWN; windowbtn=new FXMDIWindowButton(this,pup,this,FXWindow::ID_MDI_WINDOW); minimizebtn=new FXMDIMinimizeButton(this,this,FXWindow::ID_MDI_MINIMIZE,FRAME_RAISED); restorebtn=new FXMDIRestoreButton(this,this,FXWindow::ID_MDI_RESTORE,FRAME_RAISED); maximizebtn=new FXMDIMaximizeButton(this,this,FXWindow::ID_MDI_MAXIMIZE,FRAME_RAISED); deletebtn=new FXMDIDeleteButton(this,this,FXWindow::ID_MDI_CLOSE,FRAME_RAISED); windowbtn->setIcon(ic); baseColor=getApp()->getBaseColor(); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); borderColor=getApp()->getBorderColor(); titleColor=getApp()->getSelforeColor(); titleBackColor=getApp()->getSelbackColor(); font=getApp()->getNormalFont(); iconPosX=xpos; iconPosY=ypos; iconWidth=width; iconHeight=height; normalPosX=xpos; normalPosY=ypos; normalWidth=width; normalHeight=height; if(options&(MDI_MAXIMIZED|MDI_MINIMIZED)){ normalWidth=p->getWidth()*2/3; normalHeight=p->getHeight()*2/3; if(normalWidth<8) normalWidth=200; if(normalHeight<8) normalHeight=160; } spotx=0; spoty=0; xoff=0; yoff=0; newx=0; newy=0; neww=0; newh=0; mode=DRAG_NONE; } // Create window void FXMDIChild::create(){ FXComposite::create(); font->create(); recalc(); } // Detach window void FXMDIChild::detach(){ FXComposite::detach(); font->detach(); } // Get content window (if any!) FXWindow *FXMDIChild::contentWindow() const { return deletebtn->getNext(); } // Get width FXint FXMDIChild::getDefaultWidth(){ FXint mw,bw; mw=windowbtn->getDefaultWidth(); bw=deletebtn->getDefaultWidth(); return TITLESPACE+mw+3*bw+(BORDERWIDTH<<1)+2+4+4+6+2; } // Get height FXint FXMDIChild::getDefaultHeight(){ FXint fh,mh,bh; fh=font->getFontHeight(); mh=windowbtn->getDefaultHeight(); bh=deletebtn->getDefaultHeight(); return FXMAX3(fh,mh,bh)+(BORDERWIDTH<<1)+2; } // Just tell server where the windows are! void FXMDIChild::layout(){ FXWindow *contents=contentWindow(); FXint th,fh,mw,mh,bw,bh,by,bx; fh=font->getFontHeight(); mw=windowbtn->getDefaultWidth(); mh=windowbtn->getDefaultHeight(); bw=deletebtn->getDefaultWidth(); bh=deletebtn->getDefaultHeight(); th=FXMAX3(fh,mh,bh)+2; bx=width-BORDERWIDTH-bw-2; by=BORDERWIDTH+(th-bh)/2; windowbtn->position(BORDERWIDTH+2,BORDERWIDTH+(th-mh)/2,mw,mh); if(options&MDI_MAXIMIZED){ deletebtn->hide(); maximizebtn->hide(); minimizebtn->hide(); restorebtn->hide(); if(contents){ contents->position(0,0,width,height); contents->raise(); contents->show(); } } else if(options&MDI_MINIMIZED){ deletebtn->position(bx,by,bw,bh); bx-=bw+3; maximizebtn->position(bx,by,bw,bh); bx-=bw+3; restorebtn->position(bx,by,bw,bh); deletebtn->show(); maximizebtn->show(); minimizebtn->hide(); restorebtn->show(); if(contents){ contents->hide(); } } else{ deletebtn->position(bx,by,bw,bh); bx-=bw+3; maximizebtn->position(bx,by,bw,bh); bx-=bw+3; minimizebtn->position(bx,by,bw,bh); deletebtn->show(); maximizebtn->show(); minimizebtn->show(); restorebtn->hide(); if(contents){ contents->position(BORDERWIDTH+2,BORDERWIDTH+2+th,width-(BORDERWIDTH<<1)-4,height-th-(BORDERWIDTH<<1)-4); contents->show(); } } flags&=~FLAG_DIRTY; } // Maximize window FXbool FXMDIChild::maximize(FXbool notify){ if(!(options&MDI_MAXIMIZED)){ if(options&MDI_MINIMIZED){ iconPosX=xpos; iconPosY=ypos; iconWidth=width; iconHeight=height; } else{ normalPosX=xpos; normalPosY=ypos; normalWidth=width; normalHeight=height; } xpos=0; ypos=0; width=getParent()->getWidth(); height=getParent()->getHeight(); options|=MDI_MAXIMIZED; options&=~MDI_MINIMIZED; recalc(); if(notify && target){target->tryHandle(this,FXSEL(SEL_MAXIMIZE,message),NULL);} } return TRUE; } // Minimize window FXbool FXMDIChild::minimize(FXbool notify){ if(!(options&MDI_MINIMIZED)){ if(!(options&MDI_MAXIMIZED)){ normalPosX=xpos; normalPosY=ypos; normalWidth=width; normalHeight=height; } xpos=iconPosX; ypos=iconPosY; width=getDefaultWidth(); height=getDefaultHeight(); options|=MDI_MINIMIZED; options&=~MDI_MAXIMIZED; recalc(); if(notify && target){target->tryHandle(this,FXSEL(SEL_MINIMIZE,message),NULL);} } return TRUE; } // Restore window FXbool FXMDIChild::restore(FXbool notify){ if(options&(MDI_MINIMIZED|MDI_MAXIMIZED)){ if(options&MDI_MINIMIZED){ iconPosX=xpos; iconPosY=ypos; iconWidth=width; iconHeight=height; } xpos=normalPosX; ypos=normalPosY; width=normalWidth; height=normalHeight; options&=~(MDI_MINIMIZED|MDI_MAXIMIZED); recalc(); if(notify && target){target->tryHandle(this,FXSEL(SEL_RESTORE,message),NULL);} } return TRUE; } // Close MDI window, return TRUE if actually closed FXbool FXMDIChild::close(FXbool notify){ FXMDIClient *client=(FXMDIClient*)getParent(); FXMDIChild *alternative; // See if OK to close if(!notify || !target || !target->tryHandle(this,FXSEL(SEL_CLOSE,message),NULL)){ // Target will receive no further messages from us setTarget(NULL); setSelector(0); // Try find another window to activate alternative=(FXMDIChild*)(getNext()?getNext():getPrev()); // First make sure we're inactive client->setActiveChild(alternative,notify); // Self destruct delete this; // Was closed return TRUE; } return FALSE; } // Is it maximized? FXbool FXMDIChild::isMaximized() const { return (options&MDI_MAXIMIZED)!=0; } // Is it minimized FXbool FXMDIChild::isMinimized() const { return (options&MDI_MINIMIZED)!=0; } // Move this window to the specified position in the parent's coordinates void FXMDIChild::move(FXint x,FXint y){ FXComposite::move(x,y); if(!(options&(MDI_MAXIMIZED|MDI_MINIMIZED))){ normalPosX=x; normalPosY=y; } else if(options&MDI_MINIMIZED){ iconPosX=x; iconPosY=y; } } // Resize this window to the specified width and height void FXMDIChild::resize(FXint w,FXint h){ FXComposite::resize(w,h); if(!(options&(MDI_MAXIMIZED|MDI_MINIMIZED))){ normalWidth=w; normalHeight=h; } else if(options&MDI_MINIMIZED){ iconWidth=w; iconHeight=h; } } // Move and resize this window in the parent's coordinates void FXMDIChild::position(FXint x,FXint y,FXint w,FXint h){ FXComposite::position(x,y,w,h); if(!(options&(MDI_MAXIMIZED|MDI_MINIMIZED))){ normalPosX=x; normalPosY=y; normalWidth=w; normalHeight=h; } else if(options&MDI_MINIMIZED){ iconPosX=x; iconPosY=y; iconWidth=w; iconHeight=h; } } // Into focus chain void FXMDIChild::setFocus(){ FXMDIClient *client=(FXMDIClient*)getParent(); client->setActiveChild(this,TRUE); FXComposite::setFocus(); } // If window can have focus bool FXMDIChild::canFocus() const { return true; } // Change cursor based on location over window void FXMDIChild::changeCursor(FXint x,FXint y){ switch(where(x,y)){ case DRAG_TOP: case DRAG_BOTTOM: setDefaultCursor(getApp()->getDefaultCursor(DEF_DRAGH_CURSOR)); setDragCursor(getApp()->getDefaultCursor(DEF_DRAGH_CURSOR)); break; case DRAG_LEFT: case DRAG_RIGHT: setDefaultCursor(getApp()->getDefaultCursor(DEF_DRAGV_CURSOR)); setDragCursor(getApp()->getDefaultCursor(DEF_DRAGV_CURSOR)); break; case DRAG_TOPLEFT: case DRAG_BOTTOMRIGHT: setDefaultCursor(getApp()->getDefaultCursor(DEF_DRAGTL_CURSOR)); setDragCursor(getApp()->getDefaultCursor(DEF_DRAGTL_CURSOR)); break; case DRAG_TOPRIGHT: case DRAG_BOTTOMLEFT: setDefaultCursor(getApp()->getDefaultCursor(DEF_DRAGTR_CURSOR)); setDragCursor(getApp()->getDefaultCursor(DEF_DRAGTR_CURSOR)); break; default: setDefaultCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); setDragCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); break; } } // Revert cursor to normal one void FXMDIChild::revertCursor(){ setDefaultCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); setDragCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); } // Draw rubberband box void FXMDIChild::drawRubberBox(FXint x,FXint y,FXint w,FXint h){ if(BORDERWIDTH*2getBackColor()); //dc.drawHashBox(xx,yy,w,h,BORDERWIDTH); dc.setLineWidth(BORDERWIDTH); dc.drawRectangle(x+BORDERWIDTH/2,y+BORDERWIDTH/2,w-BORDERWIDTH,h-BORDERWIDTH); } } // Draw animation morphing from old to new rectangle void FXMDIChild::animateRectangles(FXint ox,FXint oy,FXint ow,FXint oh,FXint nx,FXint ny,FXint nw,FXint nh){ FXlong pause=getApp()->getAnimSpeed()*1000000L; if(xid && pause){ FXDCWindow dc(getParent()); FXint bx,by,bw,bh,s,t; dc.clipChildren(false); dc.setFunction(BLT_SRC_XOR_DST); dc.setForeground(getParent()->getBackColor()); FXuint step=500; for(s=0,t=10000; s<=10000; s+=step,t-=step){ bx=(nx*s+ox*t)/10000; by=(ny*s+oy*t)/10000; bw=(nw*s+ow*t)/10000; bh=(nh*s+oh*t)/10000; if(BORDERWIDTH*2flush(true); FXThread::sleep(pause); dc.drawHashBox(bx,by,bw,bh,BORDERWIDTH); getApp()->flush(true); } } } } // Handle repaint long FXMDIChild::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXint xx,yy,th,titlespace,letters,dots,dotspace; FXint fh,mh,bh,bw,mw; // If box is shown, hide it temporarily if(mode&DRAG_INVERTED) drawRubberBox(newx,newy,neww,newh); { FXDCWindow dc(this,ev); // Draw MDIChild background dc.setForeground(baseColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); // Only draw stuff when not maximized if(!(options&MDI_MAXIMIZED)){ // Compute sizes fh=font->getFontHeight(); mw=windowbtn->getDefaultWidth(); mh=windowbtn->getDefaultHeight(); bw=deletebtn->getDefaultWidth(); bh=deletebtn->getDefaultHeight(); th=FXMAX3(fh,mh,bh)+2; // Draw outer border dc.setForeground(baseColor); dc.fillRectangle(0,0,width-1,1); dc.fillRectangle(0,0,1,height-2); dc.setForeground(hiliteColor); dc.fillRectangle(1,1,width-2,1); dc.fillRectangle(1,1,1,height-2); dc.setForeground(shadowColor); dc.fillRectangle(1,height-2,width-1,1); dc.fillRectangle(width-2,1,1,height-2); dc.setForeground(borderColor); dc.fillRectangle(0,height-1,width,1); dc.fillRectangle(width-1,0,1,height); // Draw title background dc.setForeground(isActive() ? (hasFocus() ? titleBackColor : shadowColor) : backColor); dc.fillRectangle(BORDERWIDTH,BORDERWIDTH,width-BORDERWIDTH*2,th); // Draw title if(!title.empty()){ xx=BORDERWIDTH+mw+2+4; yy=BORDERWIDTH+font->getFontAscent()+(th-fh)/2; // Compute space for title titlespace=width-mw-3*bw-(BORDERWIDTH<<1)-2-4-4-6-2; dots=0; letters=title.length(); // Title too large for space if(font->getTextWidth(title.text(),letters)>titlespace){ dotspace=titlespace-font->getTextWidth("...",3); while(letters>0 && font->getTextWidth(title.text(),letters)>dotspace) letters--; dots=3; if(letters==0){ letters=1; dots=0; } } // Draw as much of the title as possible dc.setForeground(isActive() ? titleColor : borderColor); dc.setFont(font); dc.drawText(xx,yy,title.text(),letters); dc.drawText(xx+font->getTextWidth(title.text(),letters),yy,"...",dots); } // Draw inner border if(!(options&MDI_MINIMIZED)){ dc.setForeground(shadowColor); dc.fillRectangle(BORDERWIDTH,BORDERWIDTH+th,width-BORDERWIDTH*2-1,1); dc.fillRectangle(BORDERWIDTH,BORDERWIDTH+th,1,height-th-BORDERWIDTH*2-1); dc.setForeground(borderColor); dc.fillRectangle(BORDERWIDTH+1,BORDERWIDTH+th+1,width-BORDERWIDTH*2-3,1); dc.fillRectangle(BORDERWIDTH+1,BORDERWIDTH+th+1,1,height-th-BORDERWIDTH*2-3); dc.setForeground(hiliteColor); dc.fillRectangle(BORDERWIDTH,height-BORDERWIDTH-1,width-BORDERWIDTH*2,1); dc.fillRectangle(width-BORDERWIDTH-1,BORDERWIDTH+th,1,height-th-BORDERWIDTH*2); dc.setForeground(baseColor); dc.fillRectangle(BORDERWIDTH+1,height-BORDERWIDTH-2,width-BORDERWIDTH*2-2,1); dc.fillRectangle(width-BORDERWIDTH-2,BORDERWIDTH+th+1,1,height-th-BORDERWIDTH*2-2); } } } // Redraw the box over freshly painted window if(mode&DRAG_INVERTED) drawRubberBox(newx,newy,neww,newh); return 1; } // Find out where window was grabbed FXuchar FXMDIChild::where(FXint x,FXint y){ FXuchar code=DRAG_NONE; FXint fh,mh,bh,th; fh=font->getFontHeight(); mh=windowbtn->getDefaultHeight(); bh=deletebtn->getDefaultHeight(); th=FXMAX3(fh,mh,bh)+2; if(!isMinimized() && xhandle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); return 1; // if(contentWindow() && contentWindow()->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; // setFocus(); // return 1; ///// FIXME See ScrollWindow ///// // FXWindow *child=contentWindow(); // return child && child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); } // Gained focus long FXMDIChild::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXint fh,mh,bh,th; FXComposite::onFocusIn(sender,sel,ptr); fh=font->getFontHeight(); mh=windowbtn->getDefaultHeight(); bh=deletebtn->getDefaultHeight(); th=FXMAX3(fh,mh,bh)+2; windowbtn->setBackColor(isActive() ? titleBackColor : backColor); update(BORDERWIDTH,BORDERWIDTH,width-(BORDERWIDTH<<1),th); return 1; } // Lost focus long FXMDIChild::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXint fh,mh,bh,th; FXComposite::onFocusOut(sender,sel,ptr); fh=font->getFontHeight(); mh=windowbtn->getDefaultHeight(); bh=deletebtn->getDefaultHeight(); th=FXMAX3(fh,mh,bh)+2; windowbtn->setBackColor(isActive() ? shadowColor : backColor); update(BORDERWIDTH,BORDERWIDTH,width-(BORDERWIDTH<<1),th); return 1; } // Pressed LEFT button long FXMDIChild::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; if(event->click_count==1){ mode=where(event->win_x,event->win_y); if(mode!=DRAG_NONE){ if(mode&(DRAG_TOP|DRAG_TITLE)) spoty=event->win_y; else if(mode&DRAG_BOTTOM) spoty=event->win_y-height; if(mode&(DRAG_LEFT|DRAG_TITLE)) spotx=event->win_x; else if(mode&DRAG_RIGHT) spotx=event->win_x-width; xoff=event->win_x+xpos-event->root_x; yoff=event->win_y+ypos-event->root_y; newx=xpos; newy=ypos; neww=width; newh=height; if(!(options&MDI_TRACKING)){ if(!(mode&DRAG_TITLE)){ drawRubberBox(newx,newy,neww,newh); mode|=DRAG_INVERTED; } } } } return 1; } return 0; } // Released LEFT button long FXMDIChild::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; if(isEnabled()){ ungrab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(event->click_count==1){ if(mode!=DRAG_NONE){ if(!(options&MDI_TRACKING)){ if(mode&DRAG_INVERTED) drawRubberBox(newx,newy,neww,newh); position(newx,newy,neww,newh); } mode=DRAG_NONE; recalc(); } } else if(event->click_count==2){ if(options&MDI_MINIMIZED){ animateRectangles(xpos,ypos,width,height,normalPosX,normalPosY,normalWidth,normalHeight); restore(TRUE); } else if(options&MDI_MAXIMIZED){ animateRectangles(xpos,ypos,width,height,normalPosX,normalPosY,normalWidth,normalHeight); restore(TRUE); } else{ animateRectangles(xpos,ypos,width,height,0,0,getParent()->getWidth(),getParent()->getHeight()); maximize(TRUE); } } return 1; } return 0; } // Moved long FXMDIChild::onMotion(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint tmp,mousex,mousey; register FXint oldx,oldy,oldw,oldh; if(mode!=DRAG_NONE){ // Mouse in FXMDIClient's coordinates mousex=event->root_x+xoff; mousey=event->root_y+yoff; // Keep inside FXMDIClient if(mousex<0) mousex=0; if(mousey<0) mousey=0; if(mousex>=getParent()->getWidth()) mousex=getParent()->getWidth()-1; if(mousey>=getParent()->getHeight()) mousey=getParent()->getHeight()-1; // Remember old box oldx=newx; oldy=newy; oldw=neww; oldh=newh; // Dragging title if(mode&DRAG_TITLE){ if(!event->moved) return 1; newy=mousey-spoty; newx=mousex-spotx; setDragCursor(getApp()->getDefaultCursor(DEF_MOVE_CURSOR)); } // Dragging sides else{ // Vertical if(mode&DRAG_TOP){ tmp=newh+newy-mousey+spoty; if(tmp>=MINHEIGHT){ newh=tmp; newy=mousey-spoty; } } else if(mode&DRAG_BOTTOM){ tmp=mousey-spoty-newy; if(tmp>=MINHEIGHT){ newh=tmp; } } // Horizontal if(mode&DRAG_LEFT){ tmp=neww+newx-mousex+spotx; if(tmp>=MINWIDTH){ neww=tmp; newx=mousex-spotx; } } else if(mode&DRAG_RIGHT){ tmp=mousex-spotx-newx; if(tmp>=MINWIDTH){ neww=tmp; } } } // Move box if(!(options&MDI_TRACKING)){ if(mode&DRAG_INVERTED) drawRubberBox(oldx,oldy,oldw,oldh); drawRubberBox(newx,newy,neww,newh); mode|=DRAG_INVERTED; } else{ position(newx,newy,neww,newh); } return 1; } // Othersize just change cursor based on location changeCursor(event->win_x,event->win_y); return 0; } // Pressed MIDDLE button long FXMDIChild::onMiddleBtnPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONPRESS,message),ptr)) return 1; return 1; } return 0; } // Released MIDDLE button long FXMDIChild::onMiddleBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // Pressed RIGHT button long FXMDIChild::onRightBtnPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; lower(); return 1; } return 0; } // Released RIGHT button long FXMDIChild::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // Update value from a message long FXMDIChild::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setTitle(*((FXString*)ptr)); return 1; } // Obtain value from text field long FXMDIChild::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTitle(); return 1; } // Update icon from a message long FXMDIChild::onCmdSetIconValue(FXObject*,FXSelector,void* ptr){ setIcon(*((FXIcon**)ptr)); return 1; } // Obtain icon from text field long FXMDIChild::onCmdGetIconValue(FXObject*,FXSelector,void* ptr){ *((FXIcon**)ptr)=getIcon(); return 1; } // Window was selected long FXMDIChild::onSelected(FXObject*,FXSelector,void* ptr){ // FIXME if(!(flags&FLAG_ACTIVE)){ if(target) target->tryHandle(this,FXSEL(SEL_SELECTED,message),ptr); windowbtn->setBackColor(hasFocus() ? titleBackColor : shadowColor); flags|=FLAG_ACTIVE; recalc(); update(); } return 1; } // Window was deselected long FXMDIChild::onDeselected(FXObject*,FXSelector,void* ptr){ // FIXME if(flags&FLAG_ACTIVE){ if(target) target->tryHandle(this,FXSEL(SEL_DESELECTED,message),ptr); windowbtn->setBackColor(backColor); flags&=~FLAG_ACTIVE; recalc(); update(); } return 1; } /*******************************************************************************/ // Restore window command long FXMDIChild::onCmdRestore(FXObject*,FXSelector,void*){ animateRectangles(xpos,ypos,width,height,normalPosX,normalPosY,normalWidth,normalHeight); restore(TRUE); return 1; } // Update restore command long FXMDIChild::onUpdRestore(FXObject* sender,FXSelector,void*){ sender->handle(this,isMinimized()||isMaximized()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Update MDI restore button on menu bar long FXMDIChild::onUpdMenuRestore(FXObject* sender,FXSelector,void*){ if(isMaximized()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); } else{ sender->handle(this,FXSEL(SEL_COMMAND,ID_HIDE),NULL); } return 1; } // Maximize window command long FXMDIChild::onCmdMaximize(FXObject*,FXSelector,void*){ animateRectangles(xpos,ypos,width,height,0,0,getParent()->getWidth(),getParent()->getHeight()); maximize(TRUE); return 1; } // Update maximized command long FXMDIChild::onUpdMaximize(FXObject* sender,FXSelector,void*){ sender->handle(this,isMaximized()?FXSEL(SEL_COMMAND,ID_DISABLE):FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // Minimize window command long FXMDIChild::onCmdMinimize(FXObject*,FXSelector,void*){ animateRectangles(xpos,ypos,width,height,iconPosX,iconPosY,getDefaultWidth(),getDefaultHeight()); minimize(TRUE); return 1; } // Update minimized command long FXMDIChild::onUpdMinimize(FXObject* sender,FXSelector,void*){ sender->handle(this,isMinimized()?FXSEL(SEL_COMMAND,ID_DISABLE):FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // Update MDI minimized button on menu bar long FXMDIChild::onUpdMenuMinimize(FXObject* sender,FXSelector,void*){ if(isMaximized()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); } else{ sender->handle(this,FXSEL(SEL_COMMAND,ID_HIDE),NULL); } return 1; } // Close window after asking FXMDIChild's target; returns 1 if closed long FXMDIChild::onCmdClose(FXObject*,FXSelector,void*){ return close(TRUE); } // Update close command long FXMDIChild::onUpdClose(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // Update MDI close button on menu bar long FXMDIChild::onUpdMenuClose(FXObject* sender,FXSelector,void*){ if(isMaximized()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); } else{ sender->handle(this,FXSEL(SEL_COMMAND,ID_HIDE),NULL); } return 1; } // Update window menu button long FXMDIChild::onUpdWindow(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // Update MDI window menu button on menu bar long FXMDIChild::onUpdMenuWindow(FXObject* sender,FXSelector,void*){ FXIcon *icon=getIcon(); if(isMaximized()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETICONVALUE),(void*)&icon); } else{ sender->handle(this,FXSEL(SEL_COMMAND,ID_HIDE),NULL); } return 1; } // Set base color void FXMDIChild::setBaseColor(FXColor clr){ if(baseColor!=clr){ baseColor=clr; update(); } } // Set highlight color void FXMDIChild::setHiliteColor(FXColor clr){ if(hiliteColor!=clr){ hiliteColor=clr; update(); } } // Set shadow color void FXMDIChild::setShadowColor(FXColor clr){ if(shadowColor!=clr){ shadowColor=clr; update(); } } // Set border color void FXMDIChild::setBorderColor(FXColor clr){ if(borderColor!=clr){ borderColor=clr; update(); } } // Set title color void FXMDIChild::setTitleColor(FXColor clr){ if(titleColor!=clr){ titleColor=clr; update(); } } // Set title color void FXMDIChild::setTitleBackColor(FXColor clr){ if(titleBackColor!=clr){ titleBackColor=clr; update(); } } // Set new window title void FXMDIChild::setTitle(const FXString& name){ if(title!=name){ title=name; update(); } } // Delegate all unhandled messages to content window or MDI child's target, // except for those messages with ID's which belong to the MDI child itself. long FXMDIChild::onDefault(FXObject* sender,FXSelector sel,void* ptr){ if(FXMDIChild::ID_LAST<=FXSELID(sel)){ if(contentWindow() && contentWindow()->tryHandle(sender,sel,ptr)) return 1; return target && target->tryHandle(sender,sel,ptr); } return 0; } // Get icon used for the menu button FXIcon *FXMDIChild::getIcon() const { return windowbtn->getIcon(); } // Change icon used for window menu button void FXMDIChild::setIcon(FXIcon* ic){ windowbtn->setIcon(ic); } // Obtain window menu FXPopup* FXMDIChild::getMenu() const { return windowbtn->getMenu(); } // Change window menu void FXMDIChild::setMenu(FXPopup* menu){ windowbtn->setMenu(menu); } // Change the font void FXMDIChild::setFont(FXFont *fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Set tracking instead of just outline void FXMDIChild::setTracking(FXbool tracking){ if(tracking) options|=MDI_TRACKING; else options&=~MDI_TRACKING; } // Return true if tracking FXbool FXMDIChild::getTracking() const { return (options&MDI_TRACKING)!=0; } // Save object to stream void FXMDIChild::save(FXStream& store) const { FXComposite::save(store); store << title; store << windowbtn; store << minimizebtn; store << restorebtn; store << maximizebtn; store << deletebtn; store << font; store << baseColor; store << hiliteColor; store << shadowColor; store << borderColor; store << titleColor; store << titleBackColor; store << iconPosX; store << iconPosY; store << iconWidth; store << iconHeight; store << normalPosX; store << normalPosY; store << normalWidth; store << normalHeight; } // Load object from stream void FXMDIChild::load(FXStream& store){ FXComposite::load(store); store >> title; store >> windowbtn; store >> minimizebtn; store >> restorebtn; store >> maximizebtn; store >> deletebtn; store >> font; store >> baseColor; store >> hiliteColor; store >> shadowColor; store >> borderColor; store >> titleColor; store >> titleBackColor; store >> iconPosX; store >> iconPosY; store >> iconWidth; store >> iconHeight; store >> normalPosX; store >> normalPosY; store >> normalWidth; store >> normalHeight; } // Destruct thrashes the pointers FXMDIChild::~FXMDIChild(){ if(((FXMDIClient*)getParent())->active==this) ((FXMDIClient*)getParent())->active=NULL; windowbtn=(FXMenuButton*)-1L; minimizebtn=(FXButton*)-1L; restorebtn=(FXButton*)-1L; maximizebtn=(FXButton*)-1L; deletebtn=(FXButton*)-1L; font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXMDIClient.cpp000066400000000000000000000501531326741342000161420ustar00rootroot00000000000000/******************************************************************************** * * * M u l t i p l e D o c u m e n t C l i e n t W i n d o w * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMDIClient.cpp,v 1.62.2.2 2007/10/25 15:08:51 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObjectList.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXIcon.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXButton.h" #include "FXMenuButton.h" #include "FXComposite.h" #include "FXShell.h" #include "FXPopup.h" #include "FXMenuPane.h" #include "FXMDIButton.h" #include "FXPacker.h" #include "FXHorizontalFrame.h" #include "FXToolBar.h" #include "FXMenuBar.h" #include "FXMDIChild.h" #include "FXMDIClient.h" #include "FXDialogBox.h" #include "FXVerticalFrame.h" #include "FXList.h" /* Notes: - This brings up the question of the cascade design. Do you want the windows to be cascaded/tiled in the order that they were created, or do you want them to be cascaded in some sort of focus order, with the one that had the focus to be on top, keeping its focus. In the test app, if you click within any of the child windows, it pops to the top with the focus, with the exception of "TEST3", which has a button. If this button is clicked, that window dos not pop to the top when it gets the focus. Seems like it should... - Minor problems with mdi. When a window is maximized and then deleted, the next window that is created is created in "normal" mode. When any adjustment is made to the size of the new window, it pops to "almost" maximized mode. (The child frame is visible, but as large as possible). Seems like the child windows should be created maximized if the mdi is in maximized mode. Also, if there are two windows and one gets maximized and then deleted, the second window pops to "almost" maximixed mode. - We make MDIClient get a first crack at the messages, so that the MDIChild can not shadow any messages really directed at the MDIClient. - Need ``arrange icons'' feature. - When switching active MDIChild windows, we pass the old to the new and vice versa; this allows the MDIChild's target to determine if we switched windows only, or if we switched between one document and another at the same time */ #define HORZ_PAD 12 #define VERT_PAD 2 #define CASCADE_XOFF 24 #define CASCADE_YOFF 24 #define CLIENT_MIN_WIDTH 16 #define CLIENT_MIN_HEIGHT 16 using namespace FX; /*******************************************************************************/ namespace FX { FXDEFMAP(FXMDIClient) FXMDIClientMap[]={ FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_NEXT,FXMDIClient::onUpdActivateNext), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_PREV,FXMDIClient::onUpdActivatePrev), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_TILEHORIZONTAL,FXMDIClient::onUpdTileHorizontal), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_TILEVERTICAL,FXMDIClient::onUpdTileVertical), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_CASCADE,FXMDIClient::onUpdCascade), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_CLOSE,FXMDIClient::onUpdClose), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_MINIMIZE,FXMDIClient::onUpdMinimize), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_RESTORE,FXMDIClient::onUpdRestore), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_MAXIMIZE,FXMDIClient::onUpdMaximize), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_MENURESTORE,FXMDIClient::onUpdMenuRestore), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_MENUCLOSE,FXMDIClient::onUpdMenuClose), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_MENUMINIMIZE,FXMDIClient::onUpdMenuMinimize), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_MDI_MENUWINDOW,FXMDIClient::onUpdMenuWindow), FXMAPFUNC(SEL_UPDATE,FXMDIClient::ID_MDI_ANY,FXMDIClient::onUpdAnyWindows), FXMAPFUNCS(SEL_UPDATE,FXMDIClient::ID_MDI_1,FXMDIClient::ID_MDI_10,FXMDIClient::onUpdWindowSelect), FXMAPFUNCS(SEL_UPDATE,FXMDIClient::ID_MDI_OVER_1,FXMDIClient::ID_MDI_OVER_10,FXMDIClient::onUpdOthersWindows), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_MDI_NEXT,FXMDIClient::onCmdActivateNext), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_MDI_PREV,FXMDIClient::onCmdActivatePrev), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_MDI_TILEHORIZONTAL,FXMDIClient::onCmdTileHorizontal), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_MDI_TILEVERTICAL,FXMDIClient::onCmdTileVertical), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_MDI_CASCADE,FXMDIClient::onCmdCascade), FXMAPFUNCS(SEL_COMMAND,FXMDIClient::ID_MDI_1,FXMDIClient::ID_MDI_10,FXMDIClient::onCmdWindowSelect), FXMAPFUNCS(SEL_COMMAND,FXMDIClient::ID_MDI_OVER_1,FXMDIClient::ID_MDI_OVER_10,FXMDIClient::onCmdOthersWindows), }; // Object implementation FXIMPLEMENT(FXMDIClient,FXComposite,FXMDIClientMap,ARRAYNUMBER(FXMDIClientMap)) // Construct and init FXMDIClient::FXMDIClient(){ flags|=FLAG_SHOWN; active=NULL; cascadex=CASCADE_XOFF; cascadey=CASCADE_YOFF; } // Construct and init FXMDIClient::FXMDIClient(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXComposite(p,opts,x,y,w,h){ flags|=FLAG_SHOWN; backColor=getApp()->getShadowColor(); active=NULL; cascadex=CASCADE_XOFF; cascadey=CASCADE_YOFF; } // Get width FXint FXMDIClient::getDefaultWidth(){ return CLIENT_MIN_WIDTH; } // Get height FXint FXMDIClient::getDefaultHeight(){ return CLIENT_MIN_HEIGHT; } // Recalculate layout void FXMDIClient::layout(){ register FXMDIChild* child; register FXint xx,yy,ww,hh; // Place children for(child=(FXMDIChild*)getFirst(); child; child=(FXMDIChild*)child->getNext()){ if(child->shown()){ if(child->isMaximized()){ xx=0; yy=0; ww=width; hh=height; } else if(child->isMinimized()){ xx=child->getX(); yy=child->getY(); ww=child->getDefaultWidth(); hh=child->getDefaultHeight(); } else{ xx=child->getX(); yy=child->getY(); ww=child->getWidth(); hh=child->getHeight(); } child->position(xx,yy,ww,hh); } } // Raise active child if(active && active->shown()) active->raise(); // No more dirty flags&=~FLAG_DIRTY; } // Cascade windows void FXMDIClient::cascade(FXbool notify){ register FXMDIChild* child; FXint childx,childy,childw,childh; childx=5; childy=5; childw=(2*width)/3; childh=(2*height)/3; for(child=(FXMDIChild*)getFirst(); child; child=(FXMDIChild*)child->getNext()){ if(child==active) continue; if(child->shown() && !child->isMinimized()){ child->restore(notify); child->position(childx,childy,childw,childh); child->raise(); childx+=cascadex; childy+=cascadey; if(childx+child->getWidth()>width){ childx=5; childy=5; } if(childy+child->getHeight()>height){ childy=5; } } } if(active && active->shown() && !active->isMinimized()){ active->restore(notify); active->position(childx,childy,childw,childh); active->raise(); } } // Layout horizontally void FXMDIClient::horizontal(FXbool notify){ register FXMDIChild* child; register FXint n,nr,nc,hroom,vroom,r,c; for(n=0,child=(FXMDIChild*)getFirst(); child; child=(FXMDIChild*)child->getNext()){ if(child->shown() && !child->isMinimized()) n++; } nr=n; nc=1; if(n>3){ nc=(int)sqrt((double)n); nr=(n+nc-1)/nc; } hroom=0; vroom=0; if(nc>0) hroom=width/nc; if(nr>0) vroom=height/nr; for(child=(FXMDIChild*)getFirst(),n=0; child; child=(FXMDIChild*)child->getNext()){ if(child->shown() && !child->isMinimized()){ r=n/nc; c=n%nc; child->restore(notify); child->position(c*hroom,r*vroom,hroom,vroom); n++; } } if(active && active->shown()) active->raise(); } // Layout vertically void FXMDIClient::vertical(FXbool notify){ register FXMDIChild* child; register FXint n,nr,nc,hroom,vroom,r,c; for(n=0,child=(FXMDIChild*)getFirst(); child; child=(FXMDIChild*)child->getNext()){ if(child->shown() && !child->isMinimized()) n++; } nc=n; nr=1; if(n>3){ nr=(int)sqrt((double)n); nc=(n+nr-1)/nr; } hroom=0; vroom=0; if(nc>0) hroom=width/nc; if(nr>0) vroom=height/nr; for(child=(FXMDIChild*)getFirst(),n=0; child; child=(FXMDIChild*)child->getNext()){ if(child->shown() && !child->isMinimized()){ r=n/nc; c=n%nc; child->restore(notify); child->position(c*hroom,r*vroom,hroom,vroom); n++; } } if(active && active->shown()) active->raise(); } // User clicks on one of the window menus long FXMDIClient::onCmdWindowSelect(FXObject*,FXSelector sel,void*){ setActiveChild((FXMDIChild*)childAtIndex(FXSELID(sel)-ID_MDI_1),TRUE); return 1; } // Update handler for window menus long FXMDIClient::onUpdWindowSelect(FXObject *sender,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_MDI_1; FXMDIChild *child=(FXMDIChild*)childAtIndex(which); if(child){ FXString string; if(which<9) string.format("&%d %s",which+1,child->getTitle().text()); else string.format("1&0 %s",child->getTitle().text()); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE),(void*)&string); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SHOW),NULL); if(child==active) sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_UNCHECK),NULL); } else{ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_HIDE),NULL); } return 1; } // Show a menu of other MDI child windows long FXMDIClient::onCmdOthersWindows(FXObject*,FXSelector,void*){ FXDialogBox choose(this,tr("Select Window"),DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,0,0,300,200,10,10,10,10, 10,10); FXHorizontalFrame* buttons=new FXHorizontalFrame(&choose,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT,0,0,0,0,0,0,0,0); new FXButton(buttons,tr("&OK"),NULL,&choose,FXDialogBox::ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXButton(buttons,tr("&Cancel"),NULL,&choose,FXDialogBox::ID_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); FXVerticalFrame* mdilistframe=new FXVerticalFrame(&choose,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,0,0,0,0,0,0); FXList* mdilist=new FXList(mdilistframe,NULL,0,LIST_BROWSESELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y); mdilist->setNumVisible(10); for(FXMDIChild *child=(FXMDIChild*)getFirst(); child; child=(FXMDIChild*)child->getNext()){ mdilist->appendItem(child->getTitle(),child->getIcon(),child); if(child==active) mdilist->setCurrentItem(mdilist->getNumItems()-1); } if(choose.execute(PLACEMENT_OWNER)){ FXASSERT(mdilist->getCurrentItem()>=0); setActiveChild((FXMDIChild*)mdilist->getItemData(mdilist->getCurrentItem())); } return 1; } // Update button to show menu of other MDI child windows when more than N windows long FXMDIClient::onUpdOthersWindows(FXObject *sender,FXSelector sel,void*){ sender->handle(this,((FXSELID(sel)-ID_MDI_OVER_1)handle(this,getFirst()?FXSEL(SEL_COMMAND,ID_SHOW):FXSEL(SEL_COMMAND,ID_HIDE),NULL); return 1; } // Update restore; gray if no active long FXMDIClient::onUpdRestore(FXObject* sender,FXSelector sel,void* ptr){ if(active) return active->handle(sender,sel,ptr); sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Update maximized; gray if no active long FXMDIClient::onUpdMaximize(FXObject* sender,FXSelector sel,void* ptr){ if(active) return active->handle(sender,sel,ptr); sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Update minimized long FXMDIClient::onUpdMinimize(FXObject* sender,FXSelector sel,void* ptr){ if(active) return active->handle(sender,sel,ptr); sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Update close active child long FXMDIClient::onUpdClose(FXObject* sender,FXSelector sel,void* ptr){ if(active) return active->handle(sender,sel,ptr); sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Update menu's restore button long FXMDIClient::onUpdMenuWindow(FXObject* sender,FXSelector sel,void* ptr){ if(active) return active->handle(sender,sel,ptr); sender->handle(this,FXSEL(SEL_COMMAND,ID_HIDE),NULL); return 1; } // Update menu's restore button long FXMDIClient::onUpdMenuRestore(FXObject* sender,FXSelector sel,void* ptr){ if(active) return active->handle(sender,sel,ptr); sender->handle(this,FXSEL(SEL_COMMAND,ID_HIDE),NULL); return 1; } // Update menu's minimized button long FXMDIClient::onUpdMenuMinimize(FXObject* sender,FXSelector sel,void* ptr){ if(active) return active->handle(sender,sel,ptr); sender->handle(this,FXSEL(SEL_COMMAND,ID_HIDE),NULL); return 1; } // Update menu's close button long FXMDIClient::onUpdMenuClose(FXObject* sender,FXSelector sel,void* ptr){ if(active) return active->handle(sender,sel,ptr); sender->handle(this,FXSEL(SEL_COMMAND,ID_HIDE),NULL); return 1; } // Set the active child FXbool FXMDIClient::setActiveChild(FXMDIChild* child,FXbool notify){ FXbool wasmax=FALSE; if(active!=child){ if(active){ // Was it maximized? wasmax=active->isMaximized(); // Deactivate old MDIChild active->handle(this,FXSEL(SEL_DESELECTED,0),(void*)child); // FIXME should call member function // Restore to normal size if it was maximized if(wasmax) active->restore(notify); } if(child){ // Activate new MDIChild child->handle(this,FXSEL(SEL_SELECTED,0),(void*)active); // FIXME should call member function // Maximize because the old MDIChild was maximized if(wasmax) child->maximize(notify); // Raise it child->raise(); } active=child; // Need layout recalc(); // GUI update will be needed getApp()->refresh(); // Notify target if(notify && target){ target->tryHandle(this,FXSEL(SEL_CHANGED,message),child); } return TRUE; } return FALSE; } // Tile horizontally (actually, prefer wider windows) long FXMDIClient::onCmdTileHorizontal(FXObject*,FXSelector,void*){ horizontal(TRUE); return 1; } // Update tile horizontally long FXMDIClient::onUpdTileHorizontal(FXObject* sender,FXSelector,void*){ sender->handle(this,getFirst()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Tile vertically (actually, prefer taller windows) long FXMDIClient::onCmdTileVertical(FXObject*,FXSelector,void*){ vertical(TRUE); return 1; } // Update tile vertically long FXMDIClient::onUpdTileVertical(FXObject* sender,FXSelector,void*){ sender->handle(this,getFirst()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Cascade windows long FXMDIClient::onCmdCascade(FXObject*,FXSelector,void*){ cascade(TRUE); return 1; } // Update cascade long FXMDIClient::onUpdCascade(FXObject* sender,FXSelector,void*){ sender->handle(this,getFirst()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Pass message to all MDI windows; the crufty loop is because // it is possible for the child receiving the message to be deleted long FXMDIClient::forallWindows(FXObject* sender,FXSelector sel,void* ptr){ register FXWindow *child,*nextchild; for(child=getFirst(); child; child=nextchild){ nextchild=child->getNext(); if(!child->handle(sender,sel,ptr)) return 0; } return 1; } // Pass message to all different documents; here the complication // is that the whole group of child windows sharing the same // document may be deleted; also, we want to send only ONE of the // document-sharing children a message. long FXMDIClient::forallDocuments(FXObject* sender,FXSelector sel,void* ptr){ register FXWindow *child,*nextchild,*ch; for(child=getFirst(); child; child=nextchild){ nextchild=child->getNext(); x: if(nextchild && nextchild->getTarget()){ for(ch=child; ch; ch=ch->getPrev()){ if(ch->getTarget()==nextchild->getTarget()){ nextchild=nextchild->getNext(); goto x; } } } if(!child->handle(sender,sel,ptr)) return 0; } return 1; } // Pass message to all MDI windows whose target is document; // note that the child may be deleted as a result of the message. long FXMDIClient::forallDocWindows(FXObject* document,FXObject* sender,FXSelector sel,void* ptr){ register FXWindow *child,*nextchild; for(child=getFirst(); child; child=nextchild){ nextchild=child->getNext(); if(child->getTarget()==document){ if(!child->handle(sender,sel,ptr)) return 0; } } return 1; } // Activate next child long FXMDIClient::onCmdActivateNext(FXObject*,FXSelector,void*){ if(active && active->getNext()) setActiveChild((FXMDIChild*)active->getNext(),TRUE); return 1; } // Activate next child long FXMDIClient::onUpdActivateNext(FXObject* sender,FXSelector,void*){ sender->handle(this,(active && active->getNext())?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Activate previous child long FXMDIClient::onCmdActivatePrev(FXObject*,FXSelector,void*){ if(active && active->getPrev()) setActiveChild((FXMDIChild*)active->getPrev(),TRUE); return 1; } // Activate previous child long FXMDIClient::onUpdActivatePrev(FXObject* sender,FXSelector,void*){ sender->handle(this,(active && active->getPrev())?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Delegate all other messages to active child; we can't block any // messages here as some are meant fot the FXMDIChild and some for // the FXMDIChild's content or target. long FXMDIClient::onDefault(FXObject* sender,FXSelector sel,void* ptr){ return active && active->handle(sender,sel,ptr); } // Save object to stream void FXMDIClient::save(FXStream& store) const { FXComposite::save(store); store << active; store << cascadex; store << cascadey; } // Load object from stream void FXMDIClient::load(FXStream& store){ FXComposite::load(store); store >> active; store >> cascadex; store >> cascadey; } // Destruct thrashes object FXMDIClient::~FXMDIClient(){ active=(FXMDIChild*)-1L; } } fox1.6-1.6.57/src/FXMainWindow.cpp000066400000000000000000000063451326741342000164520ustar00rootroot00000000000000/******************************************************************************** * * * M a i n W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMainWindow.cpp,v 1.31 2006/01/22 17:58:35 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXThread.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXCursor.h" #include "FXRootWindow.h" #include "FXMainWindow.h" /* Notes: - allow resize option.. - Iconified/normal. - Want unlimited number of main windows. - Don't call X11/WIN32 unless xid and application is initialized. */ #define DISPLAY(app) ((Display*)((app)->display)) using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXMainWindow,FXTopWindow,NULL,0) // Make main window FXMainWindow::FXMainWindow(FXApp* a,const FXString& name,FXIcon *ic,FXIcon *mi,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXTopWindow(a,name,ic,mi,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ } // Create server-side resources void FXMainWindow::create(){ FXTopWindow::create(); if(xid){ if(getApp()->isInitialized()){ #ifndef WIN32 // Set the WM_COMMAND hint on non-owned toplevel windows XSetCommand(DISPLAY(getApp()),xid,(char**)getApp()->getArgv(),getApp()->getArgc()); #endif } } } // Destroy FXMainWindow::~FXMainWindow(){ } } fox1.6-1.6.57/src/FXMat3d.cpp000066400000000000000000000267031326741342000153460ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n 3 x 3 M a t r i x * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMat3d.cpp,v 1.12 2006/01/22 17:58:35 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXVec2d.h" #include "FXVec3d.h" #include "FXVec4d.h" #include "FXQuatd.h" #include "FXMat3d.h" /* Notes: - Transformations pre-multiply. - Goal is same effect as OpenGL. */ #define DET2(a00,a01, \ a10,a11) ((a00)*(a11)-(a10)*(a01)) #define DET3(a00,a01,a02, \ a10,a11,a12, \ a20,a21,a22) ((a00)*DET2(a11,a12,a21,a22) - \ (a10)*DET2(a01,a02,a21,a22) + \ (a20)*DET2(a01,a02,a11,a12)) using namespace FX; /*******************************************************************************/ namespace FX { // Initialize matrix from another matrix FXMat3d::FXMat3d(const FXMat3d& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; } // Initialize matrix from scalar FXMat3d::FXMat3d(FXdouble w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; } // Initialize matrix from components FXMat3d::FXMat3d(FXdouble a00,FXdouble a01,FXdouble a02, FXdouble a10,FXdouble a11,FXdouble a12, FXdouble a20,FXdouble a21,FXdouble a22){ m[0][0]=a00; m[0][1]=a01; m[0][2]=a02; m[1][0]=a10; m[1][1]=a11; m[1][2]=a12; m[2][0]=a20; m[2][1]=a21; m[2][2]=a22; } // Initialize matrix from three vectors FXMat3d::FXMat3d(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c){ m[0]=a; m[1]=b; m[2]=c; } // Initialize matrix from quaternion FXMat3d::FXMat3d(const FXQuatd& quat){ quat.getAxes(m[0],m[1],m[2]); } // Assignment operator FXMat3d& FXMat3d::operator=(const FXMat3d& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; return *this; } // Set matrix to constant FXMat3d& FXMat3d::operator=(FXdouble w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; return *this; } // Set value from another matrix FXMat3d& FXMat3d::set(const FXMat3d& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; return *this; } // Construct from scalar number FXMat3d& FXMat3d::set(FXdouble w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; return *this; } // Construct from components FXMat3d& FXMat3d::set(FXdouble a00,FXdouble a01,FXdouble a02, FXdouble a10,FXdouble a11,FXdouble a12, FXdouble a20,FXdouble a21,FXdouble a22){ m[0][0]=a00; m[0][1]=a01; m[0][2]=a02; m[1][0]=a10; m[1][1]=a11; m[1][2]=a12; m[2][0]=a20; m[2][1]=a21; m[2][2]=a22; return *this; } // Construct matrix from three vectors FXMat3d& FXMat3d::set(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c){ m[0]=a; m[1]=b; m[2]=c; return *this; } // Construct rotation matrix from quaternion FXMat3d& FXMat3d::set(const FXQuatd& quat){ quat.getAxes(m[0],m[1],m[2]); return *this; } // Add matrices FXMat3d& FXMat3d::operator+=(const FXMat3d& w){ m[0][0]+=w[0][0]; m[0][1]+=w[0][1]; m[0][2]+=w[0][2]; m[1][0]+=w[1][0]; m[1][1]+=w[1][1]; m[1][2]+=w[1][2]; m[2][0]+=w[2][0]; m[2][1]+=w[2][1]; m[2][2]+=w[2][2]; return *this; } // Substract matrices FXMat3d& FXMat3d::operator-=(const FXMat3d& w){ m[0][0]-=w[0][0]; m[0][1]-=w[0][1]; m[0][2]-=w[0][2]; m[1][0]-=w[1][0]; m[1][1]-=w[1][1]; m[1][2]-=w[1][2]; m[2][0]-=w[2][0]; m[2][1]-=w[2][1]; m[2][2]-=w[2][2]; return *this; } // Multiply matrix by scalar FXMat3d& FXMat3d::operator*=(FXdouble w){ m[0][0]*=w; m[0][1]*=w; m[0][2]*=w; m[1][0]*=w; m[1][1]*=w; m[1][2]*=w; m[2][0]*=w; m[2][1]*=w; m[2][2]*=w; return *this; } // Multiply matrix by matrix FXMat3d& FXMat3d::operator*=(const FXMat3d& w){ register FXdouble x,y,z; x=m[0][0]; y=m[0][1]; z=m[0][2]; m[0][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; m[0][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; m[0][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; x=m[1][0]; y=m[1][1]; z=m[1][2]; m[1][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; m[1][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; m[1][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; x=m[2][0]; y=m[2][1]; z=m[2][2]; m[2][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; m[2][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; m[2][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; return *this; } // Divide matric by scalar FXMat3d& FXMat3d::operator/=(FXdouble w){ m[0][0]/=w; m[0][1]/=w; m[0][2]/=w; m[1][0]/=w; m[1][1]/=w; m[1][2]/=w; m[2][0]/=w; m[2][1]/=w; m[2][2]/=w; return *this; } // Unary minus FXMat3d FXMat3d::operator-() const { return FXMat3d(-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]); } // Add matrices FXMat3d FXMat3d::operator+(const FXMat3d& w) const { return FXMat3d(m[0][0]+w[0][0],m[0][1]+w[0][1],m[0][2]+w[0][2], m[1][0]+w[1][0],m[1][1]+w[1][1],m[1][2]+w[1][2], m[2][0]+w[2][0],m[2][1]+w[2][1],m[2][2]+w[2][2]); } // Substract matrices FXMat3d FXMat3d::operator-(const FXMat3d& w) const { return FXMat3d(m[0][0]-w[0][0],m[0][1]-w[0][1],m[0][2]-w[0][2], m[1][0]-w[1][0],m[1][1]-w[1][1],m[1][2]-w[1][2], m[2][0]-w[2][0],m[2][1]-w[2][1],m[2][2]-w[2][2]); } // Multiply matrices FXMat3d FXMat3d::operator*(const FXMat3d& w) const { register FXdouble x,y,z; FXMat3d r; x=m[0][0]; y=m[0][1]; z=m[0][2]; r[0][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; r[0][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; r[0][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; x=m[1][0]; y=m[1][1]; z=m[1][2]; r[1][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; r[1][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; r[1][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; x=m[2][0]; y=m[2][1]; z=m[2][2]; r[2][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; r[2][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; r[2][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; return r; } // Multiply scalar by matrix FXMat3d operator*(FXdouble x,const FXMat3d& m){ return FXMat3d(x*m[0][0],x*m[0][1],x*m[0][2], x*m[1][0],x*m[1][1],x*m[1][2], x*m[2][0],x*m[2][1],x*m[2][2]); } // Multiply matrix by scalar FXMat3d operator*(const FXMat3d& m,FXdouble x){ return FXMat3d(m[0][0]*x,m[0][1]*x,m[0][2]*x, m[1][0]*x,m[1][1]*x,m[1][2]*x, m[2][0]*x,m[2][1]*x,m[2][2]*x); } // Divide scalar by matrix FXMat3d operator/(FXdouble x,const FXMat3d& m){ return FXMat3d(x/m[0][0],x/m[0][1],x/m[0][2], x/m[1][0],x/m[1][1],x/m[1][2], x/m[2][0],x/m[2][1],x/m[2][2]); } // Divide matrix by scalar FXMat3d operator/(const FXMat3d& m,FXdouble x){ return FXMat3d(m[0][0]/x,m[0][1]/x,m[0][2]/x, m[1][0]/x,m[1][1]/x,m[1][2]/x, m[2][0]/x,m[2][1]/x,m[2][2]/x); } // Matrix times vector FXVec3d FXMat3d::operator*(const FXVec3d& v) const { register FXdouble x=v.x,y=v.y,z=v.z; return FXVec3d(x*m[0][0]+y*m[0][1]+z*m[0][2], x*m[1][0]+y*m[1][1]+z*m[1][2], x*m[2][0]+y*m[2][1]+z*m[2][2]); } // Matrix times vector FXVec2d FXMat3d::operator*(const FXVec2d& v) const { register FXdouble x=v.x,y=v.y; FXASSERT(m[0][2]==0.0 && m[1][2]==0.0 && m[2][2]==1.0); return FXVec2d(x*m[0][0]+y*m[0][1]+m[0][2], x*m[1][0]+y*m[1][1]+m[1][2]); } // Make unit matrix FXMat3d& FXMat3d::eye(){ m[0][0]=1.0; m[0][1]=0.0; m[0][2]=0.0; m[1][0]=0.0; m[1][1]=1.0; m[1][2]=0.0; m[2][0]=0.0; m[2][1]=0.0; m[2][2]=1.0; return *this; } // Rotate by cosine, sine FXMat3d& FXMat3d::rot(FXdouble c,FXdouble s){ register FXdouble u,v; FXASSERT(-1.00001>(FXStream& store,FXMat3d& m){ store >> m[0] >> m[1] >> m[2]; return store; } } fox1.6-1.6.57/src/FXMat3f.cpp000066400000000000000000000266651326741342000153570ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n 3 x 3 M a t r i x * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMat3f.cpp,v 1.13.2.1 2007/06/27 19:15:49 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXQuatf.h" #include "FXMat3f.h" /* Notes: - Transformations pre-multiply. - Goal is same effect as OpenGL. */ #define DET2(a00,a01, \ a10,a11) ((a00)*(a11)-(a10)*(a01)) #define DET3(a00,a01,a02, \ a10,a11,a12, \ a20,a21,a22) ((a00)*DET2(a11,a12,a21,a22) - \ (a10)*DET2(a01,a02,a21,a22) + \ (a20)*DET2(a01,a02,a11,a12)) using namespace FX; /*******************************************************************************/ namespace FX { // Initialize matrix from another matrix FXMat3f::FXMat3f(const FXMat3f& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; } // Initialize matrix from scalar FXMat3f::FXMat3f(FXfloat w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; } // Initialize matrix from components FXMat3f::FXMat3f(FXfloat a00,FXfloat a01,FXfloat a02, FXfloat a10,FXfloat a11,FXfloat a12, FXfloat a20,FXfloat a21,FXfloat a22){ m[0][0]=a00; m[0][1]=a01; m[0][2]=a02; m[1][0]=a10; m[1][1]=a11; m[1][2]=a12; m[2][0]=a20; m[2][1]=a21; m[2][2]=a22; } // Initialize matrix from three vectors FXMat3f::FXMat3f(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c){ m[0]=a; m[1]=b; m[2]=c; } // Initialize matrix from quaternion FXMat3f::FXMat3f(const FXQuatf& quat){ quat.getAxes(m[0],m[1],m[2]); } // Assignment operator FXMat3f& FXMat3f::operator=(const FXMat3f& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; return *this; } // Set matrix to constant FXMat3f& FXMat3f::operator=(FXfloat w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; return *this; } // Set value from another matrix FXMat3f& FXMat3f::set(const FXMat3f& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; return *this; } // Construct from scalar number FXMat3f& FXMat3f::set(FXfloat w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; return *this; } // Construct from components FXMat3f& FXMat3f::set(FXfloat a00,FXfloat a01,FXfloat a02, FXfloat a10,FXfloat a11,FXfloat a12, FXfloat a20,FXfloat a21,FXfloat a22){ m[0][0]=a00; m[0][1]=a01; m[0][2]=a02; m[1][0]=a10; m[1][1]=a11; m[1][2]=a12; m[2][0]=a20; m[2][1]=a21; m[2][2]=a22; return *this; } // Construct matrix from three vectors FXMat3f& FXMat3f::set(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c){ m[0]=a; m[1]=b; m[2]=c; return *this; } // Construct rotation matrix from quaternion FXMat3f& FXMat3f::set(const FXQuatf& quat){ quat.getAxes(m[0],m[1],m[2]); return *this; } // Add matrices FXMat3f& FXMat3f::operator+=(const FXMat3f& w){ m[0][0]+=w[0][0]; m[0][1]+=w[0][1]; m[0][2]+=w[0][2]; m[1][0]+=w[1][0]; m[1][1]+=w[1][1]; m[1][2]+=w[1][2]; m[2][0]+=w[2][0]; m[2][1]+=w[2][1]; m[2][2]+=w[2][2]; return *this; } // Substract matrices FXMat3f& FXMat3f::operator-=(const FXMat3f& w){ m[0][0]-=w[0][0]; m[0][1]-=w[0][1]; m[0][2]-=w[0][2]; m[1][0]-=w[1][0]; m[1][1]-=w[1][1]; m[1][2]-=w[1][2]; m[2][0]-=w[2][0]; m[2][1]-=w[2][1]; m[2][2]-=w[2][2]; return *this; } // Multiply matrix by scalar FXMat3f& FXMat3f::operator*=(FXfloat w){ m[0][0]*=w; m[0][1]*=w; m[0][2]*=w; m[1][0]*=w; m[1][1]*=w; m[1][2]*=w; m[2][0]*=w; m[2][1]*=w; m[2][2]*=w; return *this; } // Multiply matrix by matrix FXMat3f& FXMat3f::operator*=(const FXMat3f& w){ register FXfloat x,y,z; x=m[0][0]; y=m[0][1]; z=m[0][2]; m[0][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; m[0][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; m[0][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; x=m[1][0]; y=m[1][1]; z=m[1][2]; m[1][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; m[1][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; m[1][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; x=m[2][0]; y=m[2][1]; z=m[2][2]; m[2][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; m[2][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; m[2][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; return *this; } // Divide matric by scalar FXMat3f& FXMat3f::operator/=(FXfloat w){ m[0][0]/=w; m[0][1]/=w; m[0][2]/=w; m[1][0]/=w; m[1][1]/=w; m[1][2]/=w; m[2][0]/=w; m[2][1]/=w; m[2][2]/=w; return *this; } // Negate matrix FXMat3f FXMat3f::operator-() const { return FXMat3f(-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]); } // Add matrices FXMat3f FXMat3f::operator+(const FXMat3f& w) const { return FXMat3f(m[0][0]+w[0][0],m[0][1]+w[0][1],m[0][2]+w[0][2], m[1][0]+w[1][0],m[1][1]+w[1][1],m[1][2]+w[1][2], m[2][0]+w[2][0],m[2][1]+w[2][1],m[2][2]+w[2][2]); } // Substract matrices FXMat3f FXMat3f::operator-(const FXMat3f& w) const { return FXMat3f(m[0][0]-w[0][0],m[0][1]-w[0][1],m[0][2]-w[0][2], m[1][0]-w[1][0],m[1][1]-w[1][1],m[1][2]-w[1][2], m[2][0]-w[2][0],m[2][1]-w[2][1],m[2][2]-w[2][2]); } // Multiply matrices FXMat3f FXMat3f::operator*(const FXMat3f& w) const { register FXfloat x,y,z; FXMat3f r; x=m[0][0]; y=m[0][1]; z=m[0][2]; r[0][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; r[0][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; r[0][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; x=m[1][0]; y=m[1][1]; z=m[1][2]; r[1][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; r[1][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; r[1][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; x=m[2][0]; y=m[2][1]; z=m[2][2]; r[2][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]; r[2][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]; r[2][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]; return r; } // Multiply scalar by matrix FXMat3f operator*(FXfloat x,const FXMat3f& m){ return FXMat3f(x*m[0][0],x*m[0][1],x*m[0][2], x*m[1][0],x*m[1][1],x*m[1][2], x*m[2][0],x*m[2][1],x*m[2][2]); } // Multiply matrix by scalar FXMat3f operator*(const FXMat3f& m,FXfloat x){ return FXMat3f(m[0][0]*x,m[0][1]*x,m[0][2]*x, m[1][0]*x,m[1][1]*x,m[1][2]*x, m[2][0]*x,m[2][1]*x,m[2][2]*x); } // Divide scalar by matrix FXMat3f operator/(FXfloat x,const FXMat3f& m){ return FXMat3f(x/m[0][0],x/m[0][1],x/m[0][2], x/m[1][0],x/m[1][1],x/m[1][2], x/m[2][0],x/m[2][1],x/m[2][2]); } // Divide matrix by scalar FXMat3f operator/(const FXMat3f& m,FXfloat x){ return FXMat3f(m[0][0]/x,m[0][1]/x,m[0][2]/x, m[1][0]/x,m[1][1]/x,m[1][2]/x, m[2][0]/x,m[2][1]/x,m[2][2]/x); } // Matrix times vector FXVec3f FXMat3f::operator*(const FXVec3f& v) const { register FXfloat x=v.x,y=v.y,z=v.z; return FXVec3f(x*m[0][0]+y*m[0][1]+z*m[0][2], x*m[1][0]+y*m[1][1]+z*m[1][2], x*m[2][0]+y*m[2][1]+z*m[2][2]); } // Matrix times vector FXVec2f FXMat3f::operator*(const FXVec2f& v) const { register FXfloat x=v.x,y=v.y; FXASSERT(m[0][2]==0.0f && m[1][2]==0.0f && m[2][2]==1.0f); return FXVec2f(x*m[0][0]+y*m[0][1]+m[0][2], x*m[1][0]+y*m[1][1]+m[1][2]); } // Make unit matrix FXMat3f& FXMat3f::eye(){ m[0][0]=1.0f; m[0][1]=0.0f; m[0][2]=0.0f; m[1][0]=0.0f; m[1][1]=1.0f; m[1][2]=0.0f; m[2][0]=0.0f; m[2][1]=0.0f; m[2][2]=1.0f; return *this; } // Rotate by cosine, sine FXMat3f& FXMat3f::rot(FXfloat c,FXfloat s){ register FXfloat u,v; FXASSERT(-1.00001f>(FXStream& store,FXMat3f& m){ store >> m[0] >> m[1] >> m[2]; return store; } } fox1.6-1.6.57/src/FXMat4d.cpp000066400000000000000000000547331326741342000153530ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n 4 x 4 M a t r i x * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMat4d.cpp,v 1.17 2006/01/22 17:58:35 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXVec2d.h" #include "FXVec3d.h" #include "FXVec4d.h" #include "FXQuatd.h" #include "FXMat3d.h" #include "FXMat4d.h" /* Notes: - Transformations pre-multiply. - Goal is same effect as OpenGL. */ #define DET2(a00,a01, \ a10,a11) ((a00)*(a11)-(a10)*(a01)) #define DET3(a00,a01,a02, \ a10,a11,a12, \ a20,a21,a22) ((a00)*DET2(a11,a12,a21,a22) - \ (a10)*DET2(a01,a02,a21,a22) + \ (a20)*DET2(a01,a02,a11,a12)) #define DET4(a00,a01,a02,a03, \ a10,a11,a12,a13, \ a20,a21,a22,a23, \ a30,a31,a32,a33) ((a00)*DET3(a11,a12,a13,a21,a22,a23,a31,a32,a33) - \ (a10)*DET3(a01,a02,a03,a21,a22,a23,a31,a32,a33) + \ (a20)*DET3(a01,a02,a03,a11,a12,a13,a31,a32,a33) - \ (a30)*DET3(a01,a02,a03,a11,a12,a13,a21,a22,a23)) using namespace FX; /*******************************************************************************/ namespace FX { // Build matrix from constant FXMat4d::FXMat4d(FXdouble w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[0][3]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[1][3]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; m[2][3]=w; m[3][0]=w; m[3][1]=w; m[3][2]=w; m[3][3]=w; } // Build matrix from scalars FXMat4d::FXMat4d(FXdouble a00,FXdouble a01,FXdouble a02,FXdouble a03, FXdouble a10,FXdouble a11,FXdouble a12,FXdouble a13, FXdouble a20,FXdouble a21,FXdouble a22,FXdouble a23, FXdouble a30,FXdouble a31,FXdouble a32,FXdouble a33){ m[0][0]=a00; m[0][1]=a01; m[0][2]=a02; m[0][3]=a03; m[1][0]=a10; m[1][1]=a11; m[1][2]=a12; m[1][3]=a13; m[2][0]=a20; m[2][1]=a21; m[2][2]=a22; m[2][3]=a23; m[3][0]=a30; m[3][1]=a31; m[3][2]=a32; m[3][3]=a33; } // Build matrix from four vectors FXMat4d::FXMat4d(const FXVec4d& a,const FXVec4d& b,const FXVec4d& c,const FXVec4d& d){ m[0][0]=a[0]; m[0][1]=a[1]; m[0][2]=a[2]; m[0][3]=a[3]; m[1][0]=b[0]; m[1][1]=b[1]; m[1][2]=b[2]; m[1][3]=b[3]; m[2][0]=c[0]; m[2][1]=c[1]; m[2][2]=c[2]; m[2][3]=c[3]; m[3][0]=d[0]; m[3][1]=d[1]; m[3][2]=d[2]; m[3][3]=d[3]; } // Copy constructor FXMat4d::FXMat4d(const FXMat4d& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; m[3]=other[3]; } // Assignment operator FXMat4d& FXMat4d::operator=(const FXMat4d& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; m[3]=other[3]; return *this; } // Set matrix to constant FXMat4d& FXMat4d::operator=(FXdouble w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[0][3]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[1][3]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; m[2][3]=w; m[3][0]=w; m[3][1]=w; m[3][2]=w; m[3][3]=w; return *this; } // Set value from another matrix FXMat4d& FXMat4d::set(const FXMat4d& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; m[3]=other[3]; return *this; } // Construct from scalar number FXMat4d& FXMat4d::set(FXdouble w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[0][3]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[1][3]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; m[2][3]=w; m[3][0]=w; m[3][1]=w; m[3][2]=w; m[3][3]=w; return *this; } // Construct from components FXMat4d& FXMat4d::set(FXdouble a00,FXdouble a01,FXdouble a02,FXdouble a03, FXdouble a10,FXdouble a11,FXdouble a12,FXdouble a13, FXdouble a20,FXdouble a21,FXdouble a22,FXdouble a23, FXdouble a30,FXdouble a31,FXdouble a32,FXdouble a33){ m[0][0]=a00; m[0][1]=a01; m[0][2]=a02; m[0][3]=a03; m[1][0]=a10; m[1][1]=a11; m[1][2]=a12; m[1][3]=a13; m[2][0]=a20; m[2][1]=a21; m[2][2]=a22; m[2][3]=a23; m[3][0]=a30; m[3][1]=a31; m[3][2]=a32; m[3][3]=a33; return *this; } // Construct matrix from three vectors FXMat4d& FXMat4d::set(const FXVec4d& a,const FXVec4d& b,const FXVec4d& c,const FXVec4d& d){ m[0][0]=a[0]; m[0][1]=a[1]; m[0][2]=a[2]; m[0][3]=a[3]; m[1][0]=b[0]; m[1][1]=b[1]; m[1][2]=b[2]; m[1][3]=b[3]; m[2][0]=c[0]; m[2][1]=c[1]; m[2][2]=c[2]; m[2][3]=c[3]; m[3][0]=d[0]; m[3][1]=d[1]; m[3][2]=d[2]; m[3][3]=d[3]; return *this; } // Add matrices FXMat4d& FXMat4d::operator+=(const FXMat4d& w){ m[0][0]+=w[0][0]; m[0][1]+=w[0][1]; m[0][2]+=w[0][2]; m[0][3]+=w[0][3]; m[1][0]+=w[1][0]; m[1][1]+=w[1][1]; m[1][2]+=w[1][2]; m[1][3]+=w[1][3]; m[2][0]+=w[2][0]; m[2][1]+=w[2][1]; m[2][2]+=w[2][2]; m[2][3]+=w[2][3]; m[3][0]+=w[3][0]; m[3][1]+=w[3][1]; m[3][2]+=w[3][2]; m[3][3]+=w[3][3]; return *this; } // Substract matrices FXMat4d& FXMat4d::operator-=(const FXMat4d& w){ m[0][0]-=w[0][0]; m[0][1]-=w[0][1]; m[0][2]-=w[0][2]; m[0][3]-=w[0][3]; m[1][0]-=w[1][0]; m[1][1]-=w[1][1]; m[1][2]-=w[1][2]; m[1][3]-=w[1][3]; m[2][0]-=w[2][0]; m[2][1]-=w[2][1]; m[2][2]-=w[2][2]; m[2][3]-=w[2][3]; m[3][0]-=w[3][0]; m[3][1]-=w[3][1]; m[3][2]-=w[3][2]; m[3][3]-=w[3][3]; return *this; } // Multiply matrix by scalar FXMat4d& FXMat4d::operator*=(FXdouble w){ m[0][0]*=w; m[0][1]*=w; m[0][2]*=w; m[0][3]*=w; m[1][0]*=w; m[1][1]*=w; m[1][2]*=w; m[2][3]*=w; m[2][0]*=w; m[2][1]*=w; m[2][2]*=w; m[3][3]*=w; m[3][0]*=w; m[3][1]*=w; m[3][2]*=w; m[3][3]*=w; return *this; } // Multiply matrix by matrix FXMat4d& FXMat4d::operator*=(const FXMat4d& w){ register FXdouble x,y,z,h; x=m[0][0]; y=m[0][1]; z=m[0][2]; h=m[0][3]; m[0][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; m[0][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; m[0][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; m[0][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[1][0]; y=m[1][1]; z=m[1][2]; h=m[1][3]; m[1][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; m[1][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; m[1][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; m[1][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[2][0]; y=m[2][1]; z=m[2][2]; h=m[2][3]; m[2][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; m[2][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; m[2][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; m[2][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[3][0]; y=m[3][1]; z=m[3][2]; h=m[3][3]; m[3][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; m[3][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; m[3][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; m[3][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; return *this; } // Divide matric by scalar FXMat4d& FXMat4d::operator/=(FXdouble w){ m[0][0]/=w; m[0][1]/=w; m[0][2]/=w; m[0][3]/=w; m[1][0]/=w; m[1][1]/=w; m[1][2]/=w; m[1][3]/=w; m[2][0]/=w; m[2][1]/=w; m[2][2]/=w; m[2][3]/=w; m[3][0]/=w; m[3][1]/=w; m[3][2]/=w; m[3][3]/=w; return *this; } // Unary minus FXMat4d FXMat4d::operator-() const { return FXMat4d(-m[0][0],-m[0][1],-m[0][2],-m[0][3], -m[1][0],-m[1][1],-m[1][2],-m[1][3], -m[2][0],-m[2][1],-m[2][2],-m[2][3], -m[3][0],-m[3][1],-m[3][2],-m[3][3]); } // Add matrices FXMat4d FXMat4d::operator+(const FXMat4d& w) const { return FXMat4d(m[0][0]+w[0][0],m[0][1]+w[0][1],m[0][2]+w[0][2],m[0][3]+w[0][3], m[1][0]+w[1][0],m[1][1]+w[1][1],m[1][2]+w[1][2],m[1][3]+w[1][3], m[2][0]+w[2][0],m[2][1]+w[2][1],m[2][2]+w[2][2],m[2][3]+w[2][3], m[3][0]+w[3][0],m[3][1]+w[3][1],m[3][2]+w[3][2],m[3][3]+w[3][3]); } // Substract matrices FXMat4d FXMat4d::operator-(const FXMat4d& w) const { return FXMat4d(m[0][0]-w[0][0],m[0][1]-w[0][1],m[0][2]-w[0][2],m[0][3]-w[0][3], m[1][0]-w[1][0],m[1][1]-w[1][1],m[1][2]-w[1][2],m[1][3]-w[1][3], m[2][0]-w[2][0],m[2][1]-w[2][1],m[2][2]-w[2][2],m[2][3]-w[2][3], m[3][0]-w[3][0],m[3][1]-w[3][1],m[3][2]-w[3][2],m[3][3]-w[3][3]); } // Multiply matrices FXMat4d FXMat4d::operator*(const FXMat4d& w) const { register FXdouble x,y,z,h; FXMat4d r; x=m[0][0]; y=m[0][1]; z=m[0][2]; h=m[0][3]; r[0][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; r[0][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; r[0][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; r[0][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[1][0]; y=m[1][1]; z=m[1][2]; h=m[1][3]; r[1][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; r[1][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; r[1][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; r[1][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[2][0]; y=m[2][1]; z=m[2][2]; h=m[2][3]; r[2][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; r[2][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; r[2][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; r[2][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[3][0]; y=m[3][1]; z=m[3][2]; h=m[3][3]; r[3][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; r[3][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; r[3][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; r[3][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; return r; } // Multiply scalar by matrix FXMat4d operator*(FXdouble x,const FXMat4d& a){ return FXMat4d(x*a[0][0],x*a[0][1],x*a[0][2],a[0][3], x*a[1][0],x*a[1][1],x*a[1][2],a[1][3], x*a[2][0],x*a[2][1],x*a[2][2],a[2][3], x*a[3][0],x*a[3][1],x*a[3][2],a[3][3]); } // Multiply matrix by scalar FXMat4d operator*(const FXMat4d& a,FXdouble x){ return FXMat4d(a[0][0]*x,a[0][1]*x,a[0][2]*x,a[0][3], a[1][0]*x,a[1][1]*x,a[1][2]*x,a[1][3], a[2][0]*x,a[2][1]*x,a[2][2]*x,a[2][3], a[3][0]*x,a[3][1]*x,a[3][2]*x,a[3][3]); } // Divide scalar by matrix FXMat4d operator/(FXdouble x,const FXMat4d& a){ return FXMat4d(x/a[0][0],x/a[0][1],x/a[0][2],a[0][3], x/a[1][0],x/a[1][1],x/a[1][2],a[1][3], x/a[2][0],x/a[2][1],x/a[2][2],a[2][3], x/a[3][0],x/a[3][1],x/a[3][2],a[3][3]); } // Divide matrix by scalar FXMat4d operator/(const FXMat4d& a,FXdouble x){ return FXMat4d(a[0][0]/x,a[0][1]/x,a[0][2]/x,a[0][3], a[1][0]/x,a[1][1]/x,a[1][2]/x,a[1][3], a[2][0]/x,a[2][1]/x,a[2][2]/x,a[2][3], a[3][0]/x,a[3][1]/x,a[3][2]/x,a[3][3]); } // Matrix times vector FXVec4d FXMat4d::operator*(const FXVec4d& v) const { register FXdouble x=v.x,y=v.y,z=v.z,w=v.w; return FXVec4d(x*m[0][0]+y*m[0][1]+z*m[0][2]+w*m[0][3], x*m[1][0]+y*m[1][1]+z*m[1][2]+w*m[1][3], x*m[2][0]+y*m[2][1]+z*m[2][2]+w*m[2][3], x*m[3][0]+y*m[3][1]+z*m[3][2]+w*m[3][3]); } // Matrix times vector FXVec3d FXMat4d::operator*(const FXVec3d& v) const { register FXdouble x=v.x,y=v.y,z=v.z; FXASSERT(m[0][3]==0.0 && m[1][3]==0.0 && m[2][3]==0.0 && m[3][3]==1.0); return FXVec3d(x*m[0][0]+y*m[0][1]+z*m[0][2]+m[0][3], x*m[1][0]+y*m[1][1]+z*m[1][2]+m[1][3], x*m[2][0]+y*m[2][1]+z*m[2][2]+m[2][3]); } // Make unit matrix FXMat4d& FXMat4d::eye(){ m[0][0]=1.0; m[0][1]=0.0; m[0][2]=0.0; m[0][3]=0.0; m[1][0]=0.0; m[1][1]=1.0; m[1][2]=0.0; m[1][3]=0.0; m[2][0]=0.0; m[2][1]=0.0; m[2][2]=1.0; m[2][3]=0.0; m[3][0]=0.0; m[3][1]=0.0; m[3][2]=0.0; m[3][3]=1.0; return *this; } // Orthographic projection FXMat4d& FXMat4d::ortho(FXdouble left,FXdouble right,FXdouble bottom,FXdouble top,FXdouble hither,FXdouble yon){ register FXdouble x,y,z,tx,ty,tz,rl,tb,yh,r0,r1,r2,r3; rl=right-left; tb=top-bottom; yh=yon-hither; FXASSERT(rl && tb && yh); // Throw exception in future x= 2.0/rl; y= 2.0/tb; z=-2.0/yh; tx=-(right+left)/rl; ty=-(top+bottom)/tb; tz=-(yon+hither)/yh; r0=m[0][0]; r1=m[1][0]; r2=m[2][0]; r3=m[3][0]; m[0][0]=x*r0; m[1][0]=y*r1; m[2][0]=z*r2; m[3][0]=tx*r0+ty*r1+tz*r2+r3; r0=m[0][1]; r1=m[1][1]; r2=m[2][1]; r3=m[3][1]; m[0][1]=x*r0; m[1][1]=y*r1; m[2][1]=z*r2; m[3][1]=tx*r0+ty*r1+tz*r2+r3; r0=m[0][2]; r1=m[1][2]; r2=m[2][2]; r3=m[3][2]; m[0][2]=x*r0; m[1][2]=y*r1; m[2][2]=z*r2; m[3][2]=tx*r0+ty*r1+tz*r2+r3; r0=m[0][3]; r1=m[1][3]; r2=m[2][3]; r3=m[3][3]; m[0][3]=x*r0; m[1][3]=y*r1; m[2][3]=z*r2; m[3][3]=tx*r0+ty*r1+tz*r2+r3; return *this; } // Perspective projection FXMat4d& FXMat4d::frustum(FXdouble left,FXdouble right,FXdouble bottom,FXdouble top,FXdouble hither,FXdouble yon){ register FXdouble x,y,a,b,c,d,rl,tb,yh,r0,r1,r2,r3; FXASSERT(0.0fabs(pvv)){ pvi=j; pvv=x[j][i]; } } FXASSERT(pvv != 0.0); // Should not be singular if(pvi!=i){ // Swap rows i and pvi FXSWAP(r[i][0],r[pvi][0],t); FXSWAP(r[i][1],r[pvi][1],t); FXSWAP(r[i][2],r[pvi][2],t); FXSWAP(r[i][3],r[pvi][3],t); FXSWAP(x[i][0],x[pvi][0],t); FXSWAP(x[i][1],x[pvi][1],t); FXSWAP(x[i][2],x[pvi][2],t); FXSWAP(x[i][3],x[pvi][3],t); } x[i][0]/=pvv; x[i][1]/=pvv; x[i][2]/=pvv; x[i][3]/=pvv; r[i][0]/=pvv; r[i][1]/=pvv; r[i][2]/=pvv; r[i][3]/=pvv; for(j=0; j<4; j++){ // Eliminate column i if(j!=i){ t=x[j][i]; x[j][0]-=x[i][0]*t; x[j][1]-=x[i][1]*t; x[j][2]-=x[i][2]*t; x[j][3]-=x[i][3]*t; r[j][0]-=r[i][0]*t; r[j][1]-=r[i][1]*t; r[j][2]-=r[i][2]*t; r[j][3]-=r[i][3]*t; } } } return r; } // Look at FXMat4d& FXMat4d::look(const FXVec3d& eye,const FXVec3d& cntr,const FXVec3d& vup){ register FXdouble x0,x1,x2,tx,ty,tz; FXVec3d rz,rx,ry; rz=normalize(eye-cntr); rx=normalize(vup^rz); ry=normalize(rz^rx); tx= -eye[0]*rx[0]-eye[1]*rx[1]-eye[2]*rx[2]; ty= -eye[0]*ry[0]-eye[1]*ry[1]-eye[2]*ry[2]; tz= -eye[0]*rz[0]-eye[1]*rz[1]-eye[2]*rz[2]; x0=m[0][0]; x1=m[0][1]; x2=m[0][2]; m[0][0]=rx[0]*x0+rx[1]*x1+rx[2]*x2+tx*m[0][3]; m[0][1]=ry[0]*x0+ry[1]*x1+ry[2]*x2+ty*m[0][3]; m[0][2]=rz[0]*x0+rz[1]*x1+rz[2]*x2+tz*m[0][3]; x0=m[1][0]; x1=m[1][1]; x2=m[1][2]; m[1][0]=rx[0]*x0+rx[1]*x1+rx[2]*x2+tx*m[1][3]; m[1][1]=ry[0]*x0+ry[1]*x1+ry[2]*x2+ty*m[1][3]; m[1][2]=rz[0]*x0+rz[1]*x1+rz[2]*x2+tz*m[1][3]; x0=m[2][0]; x1=m[2][1]; x2=m[2][2]; m[2][0]=rx[0]*x0+rx[1]*x1+rx[2]*x2+tx*m[2][3]; m[2][1]=ry[0]*x0+ry[1]*x1+ry[2]*x2+ty*m[2][3]; m[2][2]=rz[0]*x0+rz[1]*x1+rz[2]*x2+tz*m[2][3]; x0=m[3][0]; x1=m[3][1]; x2=m[3][2]; m[3][0]=rx[0]*x0+rx[1]*x1+rx[2]*x2+tx*m[3][3]; m[3][1]=ry[0]*x0+ry[1]*x1+ry[2]*x2+ty*m[3][3]; m[3][2]=rz[0]*x0+rz[1]*x1+rz[2]*x2+tz*m[3][3]; return *this; } // Save to archive FXStream& operator<<(FXStream& store,const FXMat4d& m){ store << m[0] << m[1] << m[2] << m[3]; return store; } // Load from archive FXStream& operator>>(FXStream& store,FXMat4d& m){ store >> m[0] >> m[1] >> m[2] >> m[3]; return store; } } fox1.6-1.6.57/src/FXMat4f.cpp000066400000000000000000000547101326741342000153500ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n 4 x 4 M a t r i x * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMat4f.cpp,v 1.16 2006/01/22 17:58:35 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXQuatf.h" #include "FXMat3f.h" #include "FXMat4f.h" /* Notes: - Transformations pre-multiply. - Goal is same effect as OpenGL. */ #define DET2(a00,a01, \ a10,a11) ((a00)*(a11)-(a10)*(a01)) #define DET3(a00,a01,a02, \ a10,a11,a12, \ a20,a21,a22) ((a00)*DET2(a11,a12,a21,a22) - \ (a10)*DET2(a01,a02,a21,a22) + \ (a20)*DET2(a01,a02,a11,a12)) #define DET4(a00,a01,a02,a03, \ a10,a11,a12,a13, \ a20,a21,a22,a23, \ a30,a31,a32,a33) ((a00)*DET3(a11,a12,a13,a21,a22,a23,a31,a32,a33) - \ (a10)*DET3(a01,a02,a03,a21,a22,a23,a31,a32,a33) + \ (a20)*DET3(a01,a02,a03,a11,a12,a13,a31,a32,a33) - \ (a30)*DET3(a01,a02,a03,a11,a12,a13,a21,a22,a23)) using namespace FX; /*******************************************************************************/ namespace FX { // Build matrix from constant FXMat4f::FXMat4f(FXfloat w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[0][3]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[1][3]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; m[2][3]=w; m[3][0]=w; m[3][1]=w; m[3][2]=w; m[3][3]=w; } // Build matrix from scalars FXMat4f::FXMat4f(FXfloat a00,FXfloat a01,FXfloat a02,FXfloat a03, FXfloat a10,FXfloat a11,FXfloat a12,FXfloat a13, FXfloat a20,FXfloat a21,FXfloat a22,FXfloat a23, FXfloat a30,FXfloat a31,FXfloat a32,FXfloat a33){ m[0][0]=a00; m[0][1]=a01; m[0][2]=a02; m[0][3]=a03; m[1][0]=a10; m[1][1]=a11; m[1][2]=a12; m[1][3]=a13; m[2][0]=a20; m[2][1]=a21; m[2][2]=a22; m[2][3]=a23; m[3][0]=a30; m[3][1]=a31; m[3][2]=a32; m[3][3]=a33; } // Build matrix from four vectors FXMat4f::FXMat4f(const FXVec4f& a,const FXVec4f& b,const FXVec4f& c,const FXVec4f& d){ m[0][0]=a[0]; m[0][1]=a[1]; m[0][2]=a[2]; m[0][3]=a[3]; m[1][0]=b[0]; m[1][1]=b[1]; m[1][2]=b[2]; m[1][3]=b[3]; m[2][0]=c[0]; m[2][1]=c[1]; m[2][2]=c[2]; m[2][3]=c[3]; m[3][0]=d[0]; m[3][1]=d[1]; m[3][2]=d[2]; m[3][3]=d[3]; } // Copy constructor FXMat4f::FXMat4f(const FXMat4f& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; m[3]=other[3]; } // Assignment operator FXMat4f& FXMat4f::operator=(const FXMat4f& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; m[3]=other[3]; return *this; } // Set matrix to constant FXMat4f& FXMat4f::operator=(FXfloat w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[0][3]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[1][3]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; m[2][3]=w; m[3][0]=w; m[3][1]=w; m[3][2]=w; m[3][3]=w; return *this; } // Set value from another matrix FXMat4f& FXMat4f::set(const FXMat4f& other){ m[0]=other[0]; m[1]=other[1]; m[2]=other[2]; m[3]=other[3]; return *this; } // Construct from scalar number FXMat4f& FXMat4f::set(FXfloat w){ m[0][0]=w; m[0][1]=w; m[0][2]=w; m[0][3]=w; m[1][0]=w; m[1][1]=w; m[1][2]=w; m[1][3]=w; m[2][0]=w; m[2][1]=w; m[2][2]=w; m[2][3]=w; m[3][0]=w; m[3][1]=w; m[3][2]=w; m[3][3]=w; return *this; } // Construct from components FXMat4f& FXMat4f::set(FXfloat a00,FXfloat a01,FXfloat a02,FXfloat a03, FXfloat a10,FXfloat a11,FXfloat a12,FXfloat a13, FXfloat a20,FXfloat a21,FXfloat a22,FXfloat a23, FXfloat a30,FXfloat a31,FXfloat a32,FXfloat a33){ m[0][0]=a00; m[0][1]=a01; m[0][2]=a02; m[0][3]=a03; m[1][0]=a10; m[1][1]=a11; m[1][2]=a12; m[1][3]=a13; m[2][0]=a20; m[2][1]=a21; m[2][2]=a22; m[2][3]=a23; m[3][0]=a30; m[3][1]=a31; m[3][2]=a32; m[3][3]=a33; return *this; } // Construct matrix from three vectors FXMat4f& FXMat4f::set(const FXVec4f& a,const FXVec4f& b,const FXVec4f& c,const FXVec4f& d){ m[0][0]=a[0]; m[0][1]=a[1]; m[0][2]=a[2]; m[0][3]=a[3]; m[1][0]=b[0]; m[1][1]=b[1]; m[1][2]=b[2]; m[1][3]=b[3]; m[2][0]=c[0]; m[2][1]=c[1]; m[2][2]=c[2]; m[2][3]=c[3]; m[3][0]=d[0]; m[3][1]=d[1]; m[3][2]=d[2]; m[3][3]=d[3]; return *this; } // Add matrices FXMat4f& FXMat4f::operator+=(const FXMat4f& w){ m[0][0]+=w[0][0]; m[0][1]+=w[0][1]; m[0][2]+=w[0][2]; m[0][3]+=w[0][3]; m[1][0]+=w[1][0]; m[1][1]+=w[1][1]; m[1][2]+=w[1][2]; m[1][3]+=w[1][3]; m[2][0]+=w[2][0]; m[2][1]+=w[2][1]; m[2][2]+=w[2][2]; m[2][3]+=w[2][3]; m[3][0]+=w[3][0]; m[3][1]+=w[3][1]; m[3][2]+=w[3][2]; m[3][3]+=w[3][3]; return *this; } // Substract matrices FXMat4f& FXMat4f::operator-=(const FXMat4f& w){ m[0][0]-=w[0][0]; m[0][1]-=w[0][1]; m[0][2]-=w[0][2]; m[0][3]-=w[0][3]; m[1][0]-=w[1][0]; m[1][1]-=w[1][1]; m[1][2]-=w[1][2]; m[1][3]-=w[1][3]; m[2][0]-=w[2][0]; m[2][1]-=w[2][1]; m[2][2]-=w[2][2]; m[2][3]-=w[2][3]; m[3][0]-=w[3][0]; m[3][1]-=w[3][1]; m[3][2]-=w[3][2]; m[3][3]-=w[3][3]; return *this; } // Multiply matrix by scalar FXMat4f& FXMat4f::operator*=(FXfloat w){ m[0][0]*=w; m[0][1]*=w; m[0][2]*=w; m[0][3]*=w; m[1][0]*=w; m[1][1]*=w; m[1][2]*=w; m[2][3]*=w; m[2][0]*=w; m[2][1]*=w; m[2][2]*=w; m[3][3]*=w; m[3][0]*=w; m[3][1]*=w; m[3][2]*=w; m[3][3]*=w; return *this; } // Multiply matrix by matrix FXMat4f& FXMat4f::operator*=(const FXMat4f& w){ register FXfloat x,y,z,h; x=m[0][0]; y=m[0][1]; z=m[0][2]; h=m[0][3]; m[0][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; m[0][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; m[0][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; m[0][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[1][0]; y=m[1][1]; z=m[1][2]; h=m[1][3]; m[1][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; m[1][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; m[1][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; m[1][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[2][0]; y=m[2][1]; z=m[2][2]; h=m[2][3]; m[2][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; m[2][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; m[2][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; m[2][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[3][0]; y=m[3][1]; z=m[3][2]; h=m[3][3]; m[3][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; m[3][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; m[3][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; m[3][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; return *this; } // Divide matric by scalar FXMat4f& FXMat4f::operator/=(FXfloat w){ m[0][0]/=w; m[0][1]/=w; m[0][2]/=w; m[0][3]/=w; m[1][0]/=w; m[1][1]/=w; m[1][2]/=w; m[1][3]/=w; m[2][0]/=w; m[2][1]/=w; m[2][2]/=w; m[2][3]/=w; m[3][0]/=w; m[3][1]/=w; m[3][2]/=w; m[3][3]/=w; return *this; } // Unary minus FXMat4f FXMat4f::operator-() const { return FXMat4f(-m[0][0],-m[0][1],-m[0][2],-m[0][3], -m[1][0],-m[1][1],-m[1][2],-m[1][3], -m[2][0],-m[2][1],-m[2][2],-m[2][3], -m[3][0],-m[3][1],-m[3][2],-m[3][3]); } // Add matrices FXMat4f FXMat4f::operator+(const FXMat4f& w) const { return FXMat4f(m[0][0]+w[0][0],m[0][1]+w[0][1],m[0][2]+w[0][2],m[0][3]+w[0][3], m[1][0]+w[1][0],m[1][1]+w[1][1],m[1][2]+w[1][2],m[1][3]+w[1][3], m[2][0]+w[2][0],m[2][1]+w[2][1],m[2][2]+w[2][2],m[2][3]+w[2][3], m[3][0]+w[3][0],m[3][1]+w[3][1],m[3][2]+w[3][2],m[3][3]+w[3][3]); } // Substract matrices FXMat4f FXMat4f::operator-(const FXMat4f& w) const { return FXMat4f(m[0][0]-w[0][0],m[0][1]-w[0][1],m[0][2]-w[0][2],m[0][3]-w[0][3], m[1][0]-w[1][0],m[1][1]-w[1][1],m[1][2]-w[1][2],m[1][3]-w[1][3], m[2][0]-w[2][0],m[2][1]-w[2][1],m[2][2]-w[2][2],m[2][3]-w[2][3], m[3][0]-w[3][0],m[3][1]-w[3][1],m[3][2]-w[3][2],m[3][3]-w[3][3]); } // Composite matrices FXMat4f FXMat4f::operator*(const FXMat4f& w) const { register FXfloat x,y,z,h; FXMat4f r; x=m[0][0]; y=m[0][1]; z=m[0][2]; h=m[0][3]; r[0][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; r[0][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; r[0][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; r[0][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[1][0]; y=m[1][1]; z=m[1][2]; h=m[1][3]; r[1][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; r[1][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; r[1][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; r[1][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[2][0]; y=m[2][1]; z=m[2][2]; h=m[2][3]; r[2][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; r[2][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; r[2][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; r[2][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; x=m[3][0]; y=m[3][1]; z=m[3][2]; h=m[3][3]; r[3][0]=x*w[0][0]+y*w[1][0]+z*w[2][0]+h*w[3][0]; r[3][1]=x*w[0][1]+y*w[1][1]+z*w[2][1]+h*w[3][1]; r[3][2]=x*w[0][2]+y*w[1][2]+z*w[2][2]+h*w[3][2]; r[3][3]=x*w[0][3]+y*w[1][3]+z*w[2][3]+h*w[3][3]; return r; } // Multiply scalar by matrix FXMat4f operator*(FXfloat x,const FXMat4f& a){ return FXMat4f(x*a[0][0],x*a[0][1],x*a[0][2],a[0][3], x*a[1][0],x*a[1][1],x*a[1][2],a[1][3], x*a[2][0],x*a[2][1],x*a[2][2],a[2][3], x*a[3][0],x*a[3][1],x*a[3][2],a[3][3]); } // Multiply matrix by scalar FXMat4f operator*(const FXMat4f& a,FXfloat x){ return FXMat4f(a[0][0]*x,a[0][1]*x,a[0][2]*x,a[0][3], a[1][0]*x,a[1][1]*x,a[1][2]*x,a[1][3], a[2][0]*x,a[2][1]*x,a[2][2]*x,a[2][3], a[3][0]*x,a[3][1]*x,a[3][2]*x,a[3][3]); } // Divide scalar by matrix FXMat4f operator/(FXfloat x,const FXMat4f& a){ return FXMat4f(x/a[0][0],x/a[0][1],x/a[0][2],a[0][3], x/a[1][0],x/a[1][1],x/a[1][2],a[1][3], x/a[2][0],x/a[2][1],x/a[2][2],a[2][3], x/a[3][0],x/a[3][1],x/a[3][2],a[3][3]); } // Divide matrix by scalar FXMat4f operator/(const FXMat4f& a,FXfloat x){ return FXMat4f(a[0][0]/x,a[0][1]/x,a[0][2]/x,a[0][3], a[1][0]/x,a[1][1]/x,a[1][2]/x,a[1][3], a[2][0]/x,a[2][1]/x,a[2][2]/x,a[2][3], a[3][0]/x,a[3][1]/x,a[3][2]/x,a[3][3]); } // Matrix times vector FXVec4f FXMat4f::operator*(const FXVec4f& v) const { register FXfloat x=v.x,y=v.y,z=v.z,w=v.w; return FXVec4f(x*m[0][0]+y*m[0][1]+z*m[0][2]+w*m[0][3], x*m[1][0]+y*m[1][1]+z*m[1][2]+w*m[1][3], x*m[2][0]+y*m[2][1]+z*m[2][2]+w*m[2][3], x*m[3][0]+y*m[3][1]+z*m[3][2]+w*m[3][3]); } // Matrix times vector FXVec3f FXMat4f::operator*(const FXVec3f& v) const { register FXfloat x=v.x,y=v.y,z=v.z; FXASSERT(m[0][3]==0.0f && m[1][3]==0.0f && m[2][3]==0.0f && m[3][3]==1.0f); return FXVec3f(x*m[0][0]+y*m[0][1]+z*m[0][2]+m[0][3], x*m[1][0]+y*m[1][1]+z*m[1][2]+m[1][3], x*m[2][0]+y*m[2][1]+z*m[2][2]+m[2][3]); } // Make unit matrix FXMat4f& FXMat4f::eye(){ m[0][0]=1.0f; m[0][1]=0.0f; m[0][2]=0.0f; m[0][3]=0.0f; m[1][0]=0.0f; m[1][1]=1.0f; m[1][2]=0.0f; m[1][3]=0.0f; m[2][0]=0.0f; m[2][1]=0.0f; m[2][2]=1.0f; m[2][3]=0.0f; m[3][0]=0.0f; m[3][1]=0.0f; m[3][2]=0.0f; m[3][3]=1.0f; return *this; } // Orthographic projection FXMat4f& FXMat4f::ortho(FXfloat left,FXfloat right,FXfloat bottom,FXfloat top,FXfloat hither,FXfloat yon){ register FXfloat x,y,z,tx,ty,tz,rl,tb,yh,r0,r1,r2,r3; rl=right-left; tb=top-bottom; yh=yon-hither; FXASSERT(rl && tb && yh); // Throw exception in future x= 2.0f/rl; y= 2.0f/tb; z=-2.0f/yh; tx=-(right+left)/rl; ty=-(top+bottom)/tb; tz=-(yon+hither)/yh; r0=m[0][0]; r1=m[1][0]; r2=m[2][0]; r3=m[3][0]; m[0][0]=x*r0; m[1][0]=y*r1; m[2][0]=z*r2; m[3][0]=tx*r0+ty*r1+tz*r2+r3; r0=m[0][1]; r1=m[1][1]; r2=m[2][1]; r3=m[3][1]; m[0][1]=x*r0; m[1][1]=y*r1; m[2][1]=z*r2; m[3][1]=tx*r0+ty*r1+tz*r2+r3; r0=m[0][2]; r1=m[1][2]; r2=m[2][2]; r3=m[3][2]; m[0][2]=x*r0; m[1][2]=y*r1; m[2][2]=z*r2; m[3][2]=tx*r0+ty*r1+tz*r2+r3; r0=m[0][3]; r1=m[1][3]; r2=m[2][3]; r3=m[3][3]; m[0][3]=x*r0; m[1][3]=y*r1; m[2][3]=z*r2; m[3][3]=tx*r0+ty*r1+tz*r2+r3; return *this; } // Perspective projection FXMat4f& FXMat4f::frustum(FXfloat left,FXfloat right,FXfloat bottom,FXfloat top,FXfloat hither,FXfloat yon){ register FXfloat x,y,a,b,c,d,rl,tb,yh,r0,r1,r2,r3; FXASSERT(0.0ffabsf(pvv)){ pvi=j; pvv=x[j][i]; } } FXASSERT(pvv != 0.0f); // Should not be singular if(pvi!=i){ // Swap rows i and pvi FXSWAP(r[i][0],r[pvi][0],t); FXSWAP(r[i][1],r[pvi][1],t); FXSWAP(r[i][2],r[pvi][2],t); FXSWAP(r[i][3],r[pvi][3],t); FXSWAP(x[i][0],x[pvi][0],t); FXSWAP(x[i][1],x[pvi][1],t); FXSWAP(x[i][2],x[pvi][2],t); FXSWAP(x[i][3],x[pvi][3],t); } x[i][0]/=pvv; x[i][1]/=pvv; x[i][2]/=pvv; x[i][3]/=pvv; r[i][0]/=pvv; r[i][1]/=pvv; r[i][2]/=pvv; r[i][3]/=pvv; for(j=0; j<4; j++){ // Eliminate column i if(j!=i){ t=x[j][i]; x[j][0]-=x[i][0]*t; x[j][1]-=x[i][1]*t; x[j][2]-=x[i][2]*t; x[j][3]-=x[i][3]*t; r[j][0]-=r[i][0]*t; r[j][1]-=r[i][1]*t; r[j][2]-=r[i][2]*t; r[j][3]-=r[i][3]*t; } } } return r; } // Look at FXMat4f& FXMat4f::look(const FXVec3f& eye,const FXVec3f& cntr,const FXVec3f& vup){ register FXfloat x0,x1,x2,tx,ty,tz; FXVec3f rz,rx,ry; rz=normalize(eye-cntr); rx=normalize(vup^rz); ry=normalize(rz^rx); tx= -eye[0]*rx[0]-eye[1]*rx[1]-eye[2]*rx[2]; ty= -eye[0]*ry[0]-eye[1]*ry[1]-eye[2]*ry[2]; tz= -eye[0]*rz[0]-eye[1]*rz[1]-eye[2]*rz[2]; x0=m[0][0]; x1=m[0][1]; x2=m[0][2]; m[0][0]=rx[0]*x0+rx[1]*x1+rx[2]*x2+tx*m[0][3]; m[0][1]=ry[0]*x0+ry[1]*x1+ry[2]*x2+ty*m[0][3]; m[0][2]=rz[0]*x0+rz[1]*x1+rz[2]*x2+tz*m[0][3]; x0=m[1][0]; x1=m[1][1]; x2=m[1][2]; m[1][0]=rx[0]*x0+rx[1]*x1+rx[2]*x2+tx*m[1][3]; m[1][1]=ry[0]*x0+ry[1]*x1+ry[2]*x2+ty*m[1][3]; m[1][2]=rz[0]*x0+rz[1]*x1+rz[2]*x2+tz*m[1][3]; x0=m[2][0]; x1=m[2][1]; x2=m[2][2]; m[2][0]=rx[0]*x0+rx[1]*x1+rx[2]*x2+tx*m[2][3]; m[2][1]=ry[0]*x0+ry[1]*x1+ry[2]*x2+ty*m[2][3]; m[2][2]=rz[0]*x0+rz[1]*x1+rz[2]*x2+tz*m[2][3]; x0=m[3][0]; x1=m[3][1]; x2=m[3][2]; m[3][0]=rx[0]*x0+rx[1]*x1+rx[2]*x2+tx*m[3][3]; m[3][1]=ry[0]*x0+ry[1]*x1+ry[2]*x2+ty*m[3][3]; m[3][2]=rz[0]*x0+rz[1]*x1+rz[2]*x2+tz*m[3][3]; return *this; } // Save to archive FXStream& operator<<(FXStream& store,const FXMat4f& m){ store << m[0] << m[1] << m[2] << m[3]; return store; } // Load from archive FXStream& operator>>(FXStream& store,FXMat4f& m){ store >> m[0] >> m[1] >> m[2] >> m[3]; return store; } } fox1.6-1.6.57/src/FXMatrix.cpp000066400000000000000000000357621326741342000156470ustar00rootroot00000000000000/******************************************************************************** * * * M a t r i x C o n t a i n e r O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMatrix.cpp,v 1.35 2006/01/22 17:58:35 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXMatrix.h" /* Notes: - Need to observe FILL vs CENTER options. - Filled items should shrink as well as stretch. - Stretch should be proportional. - Center mode, non-stretch should be observed. - Row/Column stretchable iff all elements in row/column have row/column stretch hint. - Row/Column may be 0 pixels wide - We should probably change layout so hidden children do not affect numbering (but if all children in a row/column are hidden, make the whole row disappear!). - Navigating around - Packing order: MATRIX_BY_ROWS: [1] [4] [7] [2] [5] [8] [3] [6] [9] MATRIX_BY_COLUMNS: [1] [2] [3] [4] [5] [6] [7] [8] [9] - Possible solution for spanning rows/columns: have a table containing mapping from FXWindow* to (nr,nc) span. Consult table during layout. All children not listed are 1x1, special API add/remove items to the table. Each layout, any item in the table for which there is no corresponding child is removed. Advantage: no need to add any special info into FXWindow. Also, no need for any special API to add item into matrix. */ #define MAXNUM 512 // Maximum number of columns/rows using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMatrix) FXMatrixMap[]={ FXMAPFUNC(SEL_FOCUS_UP,0,FXMatrix::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXMatrix::onFocusDown), FXMAPFUNC(SEL_FOCUS_LEFT,0,FXMatrix::onFocusLeft), FXMAPFUNC(SEL_FOCUS_RIGHT,0,FXMatrix::onFocusRight), }; // Object implementation FXIMPLEMENT(FXMatrix,FXPacker,FXMatrixMap,ARRAYNUMBER(FXMatrixMap)) // Make a vertical one FXMatrix::FXMatrix(FXComposite* p,FXint n,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXPacker(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ num=FXCLAMP(1,n,MAXNUM); } // Find child at given row, column FXWindow* FXMatrix::childAtRowCol(FXint r,FXint c) const { if(options&MATRIX_BY_COLUMNS){ return (0<=c && cshown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_UP,0),ptr)) return 1; } } } else{ child=getLast(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_UP,0),ptr)) return 1; } child=child->getPrev(); } } return 0; } // Focus moved down long FXMatrix::onFocusDown(FXObject*,FXSelector,void* ptr){ register FXWindow *child; register FXint r,c; if(getFocus()){ r=rowOfChild(getFocus()); c=colOfChild(getFocus()); while((child=childAtRowCol(++r,c))!=NULL){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_DOWN,0),ptr)) return 1; } } } else{ child=getFirst(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_DOWN,0),ptr)) return 1; } child=child->getNext(); } } return 0; } // Focus moved to left long FXMatrix::onFocusLeft(FXObject*,FXSelector,void* ptr){ register FXWindow *child; register FXint r,c; if(getFocus()){ r=rowOfChild(getFocus()); c=colOfChild(getFocus()); while((child=childAtRowCol(r,--c))!=NULL){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_LEFT,0),ptr)) return 1; } } } else{ child=getLast(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_LEFT,0),ptr)) return 1; } child=child->getPrev(); } } return 0; } // Focus moved to right long FXMatrix::onFocusRight(FXObject*,FXSelector,void* ptr){ register FXWindow *child; register FXint r,c; if(getFocus()){ r=rowOfChild(getFocus()); c=colOfChild(getFocus()); while((child=childAtRowCol(r,++c))!=NULL){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_RIGHT,0),ptr)) return 1; } } } else{ child=getFirst(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_RIGHT,0),ptr)) return 1; } child=child->getNext(); } } return 0; } // Set number of rows (if possible) void FXMatrix::setNumRows(FXint nr){ if(nr<1 || nr>=MAXNUM){ fxerror("%s::setNumRows: bad number of rows specified.\n",getClassName()); } if(!(options&MATRIX_BY_COLUMNS) && num!=nr){ num=nr; recalc(); } } // Get number of rows FXint FXMatrix::getNumRows() const { return (num && (options&MATRIX_BY_COLUMNS)) ? (numChildren()+num-1)/num : num; } // Set number of columns (if possible) void FXMatrix::setNumColumns(FXint nc){ if(nc<1 || nc>=MAXNUM){ fxerror("%s::setNumColumns: bad number of columns specified.\n",getClassName()); } if((options&MATRIX_BY_COLUMNS) && num!=nc){ num=nc; recalc(); } } // Get number of columns FXint FXMatrix::getNumColumns() const { return (num && !(options&MATRIX_BY_COLUMNS)) ? (numChildren()+num-1)/num : num; } // Compute minimum width based on child layout hints FXint FXMatrix::getDefaultWidth(){ register FXint c,n,w,nzcol=0,wmax=0,mw=0; register FXWindow *child; register FXuint hints; FXint colw[MAXNUM]; for(c=0; cgetNext(),n++){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); c=(options&MATRIX_BY_COLUMNS)?n%num:n/num; FXASSERT(ccolw[c]){ if(colw[c]==0) nzcol++; // Count non-zero columns wmax+=w-colw[c]; colw[c]=w; } } } if(nzcol>1) wmax+=(nzcol-1)*hspacing; return padleft+padright+wmax+(border<<1); } // Compute minimum height based on child layout hints FXint FXMatrix::getDefaultHeight(){ register FXint r,n,h,nzrow=0,hmax=0,mh=0; register FXWindow *child; register FXuint hints; FXint rowh[MAXNUM]; for(r=0; rgetNext(),n++){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); r=(options&MATRIX_BY_COLUMNS)?n/num:n%num; FXASSERT(rrowh[r]){ if(rowh[r]==0) nzrow++; // Count non-zero rows hmax+=h-rowh[r]; rowh[r]=h; } } } if(nzrow>1) hmax+=(nzrow-1)*vspacing; return padtop+padbottom+hmax+(border<<1); } // Recalculate layout void FXMatrix::layout(){ FXint ncol,nrow,nzcol,nzrow,r,c,x,y,w,h,n,e,t; FXint rowh[MAXNUM],colw[MAXNUM]; FXbool srow[MAXNUM],scol[MAXNUM]; FXint left,right,top,bottom,cw,rh; FXint mw=0,mh=0; FXint hremain,vremain; FXint hsumexpand,hnumexpand; FXint vsumexpand,vnumexpand; FXWindow *child; FXuint hints; // Placement rectangle; right/bottom non-inclusive left=border+padleft; right=width-border-padright; top=border+padtop; bottom=height-border-padbottom; hremain=right-left; vremain=bottom-top; // Non-zero rows/columns nzrow=0; nzcol=0; // Clear column/row sizes for(n=0; ngetNext(),n++){ if(child->shown()){ hints=child->getLayoutHints(); if(options&MATRIX_BY_COLUMNS){r=n/num;c=n%num;}else{r=n%num;c=n/num;} FXASSERT(rgetWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); FXASSERT(w>=0); FXASSERT(h>=0); if(w>colw[c]){ if(colw[c]==0) nzcol++; colw[c]=w; } if(h>rowh[r]){ if(rowh[r]==0) nzrow++; rowh[r]=h; } if(!(hints&LAYOUT_FILL_COLUMN)) scol[c]=0; if(!(hints&LAYOUT_FILL_ROW)) srow[r]=0; } } // Get number of rows and columns if(options&MATRIX_BY_COLUMNS){ ncol=num; nrow=(n+num-1)/num; } else{ ncol=(n+num-1)/num; nrow=num; } // Find stretch in columns for(c=hsumexpand=hnumexpand=0; c1) hremain-=(nzcol-1)*hspacing; if(nzrow>1) vremain-=(nzrow-1)*vspacing; // Disburse space horizontally for(c=e=0,x=border+padleft; c0){ // Divide proportionally t=w*hremain; w=t/hsumexpand; e+=t%hsumexpand; if(e>=hsumexpand){w++;e-=hsumexpand;} } else{ // Divide equally FXASSERT(hnumexpand>0); w=hremain/hnumexpand; e+=hremain%hnumexpand; if(e>=hnumexpand){w++;e-=hnumexpand;} } } x+=w+hspacing; } } colw[ncol]=x; // Disburse space vertically for(r=e=0,y=border+padtop; r0){ // Divide proportionally t=h*vremain; h=t/vsumexpand; e+=t%vsumexpand; if(e>=vsumexpand){h++;e-=vsumexpand;} } else{ // Divide equally FXASSERT(vnumexpand>0); h=vremain/vnumexpand; e+=vremain%vnumexpand; if(e>=vnumexpand){h++;e-=vnumexpand;} } } y+=h+vspacing; } } rowh[nrow]=y; // Do the layout for(child=getFirst(),n=0; child; child=child->getNext(),n++){ if(child->shown()){ hints=child->getLayoutHints(); if(options&MATRIX_BY_COLUMNS){r=n/num;c=n%num;}else{r=n%num;c=n/num;} cw=colw[c+1]-colw[c]-hspacing; rh=rowh[r+1]-rowh[r]-vspacing; if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(hints&LAYOUT_FILL_X) w=cw; else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if(hints&LAYOUT_CENTER_X) x=colw[c]+(cw-w)/2; else if(hints&LAYOUT_RIGHT) x=colw[c]+cw-w; else x=colw[c]; if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(hints&LAYOUT_FILL_Y) h=rh; else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if(hints&LAYOUT_CENTER_Y) y=rowh[r]+(rh-h)/2; else if(hints&LAYOUT_BOTTOM) y=rowh[r]+rh-h; else y=rowh[r]; child->position(x,y,w,h); } } flags&=~FLAG_DIRTY; } // Change matrix style void FXMatrix::setMatrixStyle(FXuint style){ FXuint opts=(options&~MATRIX_BY_COLUMNS) | (style&MATRIX_BY_COLUMNS); if(opts!=options){ options=opts; recalc(); update(); } } // Return matrix style FXuint FXMatrix::getMatrixStyle() const { return options&MATRIX_BY_COLUMNS; } } fox1.6-1.6.57/src/FXMemMap.cpp000066400000000000000000000140031326741342000155400ustar00rootroot00000000000000/******************************************************************************** * * * M e m o r y M a p p e d F i l e * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMemMap.cpp,v 1.21 2006/01/22 17:58:35 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxdefs.h" #include "FXString.h" #include "FXMemMap.h" /* Notes: - A memory mapped region of a file, or anonymous memory map. - Maybe use long sz = sysconf(_SC_PAGESIZE); - msync(). - Need to bring in line with FXIO esp. with interpretation of options and so on. */ using namespace FX; /*******************************************************************************/ namespace FX { // Create new map object FXMemMap::FXMemMap():mapbase(NULL),maplength(-1),mapoffset(0){ #ifndef WIN32 handle=-1; file=-1; #else handle=INVALID_HANDLE_VALUE; file=INVALID_HANDLE_VALUE; #endif } // Map file void *FXMemMap::mapFile(const FXString& filename,long off,long len,FXuint access,FXuint share){ #ifndef WIN32 #ifdef HAVE_MMAP struct stat info; FXint prot,flags; // Set access flags flags=0; if(access&READ){ flags=O_RDONLY; } if(access&WRITE){ flags=O_RDWR|O_CREAT; } if(access&TRUNC){ flags|=O_TRUNC; } // Open file file=open(filename.text(),flags,0666); if(file!=-1){ // If length was not passed, obtain the length if(fstat(file,&info)==0){ // Map whole file if(len==-1) len=info.st_size-off; // Trying to map region larger than the file if(info.st_sizeendptr){ if(!owns){ setError(FXStreamFull); return false; } setSpace(offset); if(begptr+offset>endptr) return false; } wrptr=begptr+offset; } else{ if(begptr+offset>endptr){ setError(FXStreamEnd); return false; } rdptr=begptr+offset; } pos=offset; return true; } return false; } } fox1.6-1.6.57/src/FXMenuBar.cpp000066400000000000000000000167051326741342000157300ustar00rootroot00000000000000/******************************************************************************** * * * M e n u B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuBar.cpp,v 1.26 2006/01/22 17:58:35 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXButton.h" #include "FXMenuBar.h" /* Notes: - Hittin Alt- key only should attract focus to the first item in the menubar. - If width of menu gets too small, expand the height to make it multiple rows. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMenuBar) FXMenuBarMap[]={ FXMAPFUNC(SEL_ENTER,0,FXMenuBar::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXMenuBar::onLeave), FXMAPFUNC(SEL_MOTION,0,FXMenuBar::onMotion), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXMenuBar::onButtonPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXMenuBar::onButtonRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXMenuBar::onButtonPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXMenuBar::onButtonRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXMenuBar::onButtonPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXMenuBar::onButtonRelease), FXMAPFUNC(SEL_FOCUS_RIGHT,0,FXMenuBar::onFocusRight), FXMAPFUNC(SEL_FOCUS_LEFT,0,FXMenuBar::onFocusLeft), FXMAPFUNC(SEL_FOCUS_NEXT,0,FXMenuBar::onDefault), FXMAPFUNC(SEL_FOCUS_PREV,0,FXMenuBar::onDefault), FXMAPFUNC(SEL_FOCUS_UP,0,FXMenuBar::onDefault), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXMenuBar::onDefault), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNPOST,FXMenuBar::onCmdUnpost), }; // Object implementation FXIMPLEMENT(FXMenuBar,FXToolBar,FXMenuBarMap,ARRAYNUMBER(FXMenuBarMap)) // Make a floatable menubar FXMenuBar::FXMenuBar(FXComposite* p,FXComposite* q,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXToolBar(p,q,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ flags|=FLAG_ENABLED; dragCursor=getApp()->getDefaultCursor(DEF_RARROW_CURSOR); } // Make a non-floatable menubar FXMenuBar::FXMenuBar(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXToolBar(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ flags|=FLAG_ENABLED; dragCursor=getApp()->getDefaultCursor(DEF_RARROW_CURSOR); } // Focus moved to right long FXMenuBar::onFocusRight(FXObject*,FXSelector,void* ptr){ FXWindow *child; if(getFocus()){ child=getFocus()->getNext(); while(child){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; child=child->getNext(); } child=getFirst(); while(child){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; child=child->getNext(); } } return 0; } // Focus moved to left long FXMenuBar::onFocusLeft(FXObject*,FXSelector,void* ptr){ FXWindow *child; if(getFocus()){ child=getFocus()->getPrev(); while(child){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; child=child->getPrev(); } child=getLast(); while(child){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; child=child->getPrev(); } } return 0; } // Enter:- when inside the popup, all is normal! long FXMenuBar::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* ev=(FXEvent*)ptr; FXint px, py; FXToolBar::onEnter(sender,sel,ptr); if(!getFocus() || !getFocus()->isActive()) return 1; if(((FXEvent*)ptr)->code==CROSSINGNORMAL){ translateCoordinatesTo(px,py,getParent(),ev->win_x,ev->win_y); if(contains(px,py) && grabbed()) ungrab(); //if(grabbed()) ungrab(); } return 1; } // Leave:- when outside the popup, a click will hide the popup! long FXMenuBar::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* ev=(FXEvent*)ptr; FXint px,py; FXToolBar::onLeave(sender,sel,ptr); if(!getFocus() || !getFocus()->isActive()) return 1; if(((FXEvent*)ptr)->code==CROSSINGNORMAL){ translateCoordinatesTo(px,py,getParent(),ev->win_x,ev->win_y); if(!contains(px,py) && !grabbed()) grab(); //#ifndef WIN32 // if(!grabbed()) grab(); //#endif } return 1; } // We're considered inside the menu bar when either // in the bar or in any active menus bool FXMenuBar::contains(FXint parentx,FXint parenty) const { FXint x,y; if(FXComposite::contains(parentx,parenty)) return true; if(getFocus()){ getParent()->translateCoordinatesTo(x,y,this,parentx,parenty); if(getFocus()->contains(x,y)) return true; } return false; } // Moved while outside // We need to do this because the definition of ``inside'' means // that we're inside even though possibly we're not in THIS window!!! long FXMenuBar::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; FXint px,py; if(!getFocus() || !getFocus()->isActive()) return 0; translateCoordinatesTo(px,py,getParent(),ev->win_x,ev->win_y); if(contains(px,py)){ if(grabbed()) ungrab(); } else{ if(!grabbed()) grab(); } return 0; } // Button pressed long FXMenuBar::onButtonPress(FXObject*,FXSelector,void*){ FXTRACE((200,"%s::onButtonPress %p\n",getClassName(),this)); handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); return 1; } // Button released long FXMenuBar::onButtonRelease(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; FXTRACE((200,"%s::onButtonRelease %p\n",getClassName(),this)); if(ev->moved){ handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); } return 1; } // Unpost the menu long FXMenuBar::onCmdUnpost(FXObject*,FXSelector,void*){ FXTRACE((200,"%s::onCmdUnpost %p\n",getClassName(),this)); if(getFocus()) getFocus()->killFocus(); //killFocus(); return 1; } } fox1.6-1.6.57/src/FXMenuButton.cpp000066400000000000000000000477111326741342000165000ustar00rootroot00000000000000/******************************************************************************** * * * M e n u B u t t o n O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuButton.cpp,v 1.50 2006/01/22 17:58:35 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXMenuButton.h" #include "FXMenuPane.h" #include "FXMenuBar.h" /* Notes: - You can turn off arrows. - You can pop the pane right,left,up,or down. - For each of the above, you can align the pane four ways; for the case of popping it down: MENUBUTTON_ATTACH_LEFT: MENUBUTTON_ATTACH_RIGHT: +------+ +------+ |Button| |Button| +------+---+ +---+------+ | Pane | | Pane | +----------+ +----------+ MENUBUTTON_ATTACH_CENTER: MENUBUTTON_ATTACH_BOTH: +------+ +----------+ |Button| | Button | +-+------+-+ +----------+ | Pane | | Pane | +----------+ +----------+ - The width (height) of the pane is taken into account by getDefaultWidth() (getDefaultHeight()), so that the button will stretch to fit the pane. - You can specify horizontal or vertical offset to position the pane away from the button a bit. - Should it grab first before doing the POST? - GUI update disabled while menu is popped up. */ #define MENUBUTTONARROW_WIDTH 11 #define MENUBUTTONARROW_HEIGHT 5 #define MENUBUTTON_MASK (MENUBUTTON_AUTOGRAY|MENUBUTTON_AUTOHIDE|MENUBUTTON_TOOLBAR|MENUBUTTON_NOARROWS) #define POPUP_MASK (MENUBUTTON_UP|MENUBUTTON_LEFT) #define ATTACH_MASK (MENUBUTTON_ATTACH_RIGHT|MENUBUTTON_ATTACH_CENTER) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMenuButton) FXMenuButtonMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMenuButton::onPaint), FXMAPFUNC(SEL_UPDATE,0,FXMenuButton::onUpdate), FXMAPFUNC(SEL_ENTER,0,FXMenuButton::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXMenuButton::onLeave), FXMAPFUNC(SEL_MOTION,0,FXMenuButton::onMotion), FXMAPFUNC(SEL_FOCUSIN,0,FXMenuButton::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXMenuButton::onFocusOut), FXMAPFUNC(SEL_UNGRABBED,0,FXMenuButton::onUngrabbed), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXMenuButton::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXMenuButton::onLeftBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXMenuButton::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXMenuButton::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXWindow::ID_HOTKEY,FXMenuButton::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXWindow::ID_HOTKEY,FXMenuButton::onHotKeyRelease), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_POST,FXMenuButton::onCmdPost), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNPOST,FXMenuButton::onCmdUnpost), }; // Object implementation FXIMPLEMENT(FXMenuButton,FXLabel,FXMenuButtonMap,ARRAYNUMBER(FXMenuButtonMap)) // Deserialization FXMenuButton::FXMenuButton(){ pane=(FXPopup*)-1L; offsetx=0; offsety=0; state=FALSE; } // Make a check button FXMenuButton::FXMenuButton(FXComposite* p,const FXString& text,FXIcon* ic,FXPopup* pup,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXLabel(p,text,ic,opts,x,y,w,h,pl,pr,pt,pb){ pane=pup; offsetx=0; offsety=0; state=FALSE; } // Create window void FXMenuButton::create(){ FXLabel::create(); if(pane) pane->create(); } // Detach window void FXMenuButton::detach(){ FXLabel::detach(); if(pane) pane->detach(); } // If window can have focus bool FXMenuButton::canFocus() const { return true; } // Get default width FXint FXMenuButton::getDefaultWidth(){ FXint tw=0,iw=0,s=0,w,pw; if(!label.empty()){ tw=labelWidth(label); s=4; } if(!(options&MENUBUTTON_NOARROWS)){ if(options&MENUBUTTON_LEFT) iw=MENUBUTTONARROW_HEIGHT; else iw=MENUBUTTONARROW_WIDTH; } if(icon) iw=icon->getWidth(); if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w=FXMAX(tw,iw); else w=tw+iw+s; w=padleft+padright+(border<<1)+w; if(!(options&MENUBUTTON_LEFT) && (options&MENUBUTTON_ATTACH_RIGHT) && (options&MENUBUTTON_ATTACH_CENTER)){ if(pane){ pw=pane->getDefaultWidth(); if(pw>w) w=pw; } } return w; } // Get default height FXint FXMenuButton::getDefaultHeight(){ FXint th=0,ih=0,h,ph; if(!label.empty()){ th=labelHeight(label); } if(!(options&MENUBUTTON_NOARROWS)){ if(options&MENUBUTTON_LEFT) ih=MENUBUTTONARROW_WIDTH; else ih=MENUBUTTONARROW_HEIGHT; } if(icon) ih=icon->getHeight(); if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h=FXMAX(th,ih); else h=th+ih; h=padtop+padbottom+(border<<1)+h; if((options&MENUBUTTON_LEFT) && (options&MENUBUTTON_ATTACH_BOTTOM)&&(options&MENUBUTTON_ATTACH_CENTER)){ if(pane){ ph=pane->getDefaultHeight(); if(ph>h) h=ph; } } return h; } // Implement auto-hide or auto-gray modes long FXMenuButton::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ if(!FXLabel::onUpdate(sender,sel,ptr)){ if(options&MENUBUTTON_AUTOHIDE){if(shown()){hide();recalc();}} if(options&MENUBUTTON_AUTOGRAY){disable();} } return 1; } // Gained focus long FXMenuButton::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusIn(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Lost focus long FXMenuButton::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusOut(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Inside the button long FXMenuButton::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onEnter(sender,sel,ptr); if(isEnabled()){ if(options&MENUBUTTON_TOOLBAR) update(); } return 1; } // Outside the button long FXMenuButton::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onLeave(sender,sel,ptr); if(isEnabled()){ if(options&MENUBUTTON_TOOLBAR) update(); } return 1; } // Pressed left button long FXMenuButton::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; if(state) handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); else handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); return 1; } return 0; } // Released left button long FXMenuButton::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(ev->moved){ handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); } return 1; } return 0; } // If we moved over the pane, we'll ungrab again, or re-grab // when outside of the plane long FXMenuButton::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; if(state){ if(pane){ if(pane->contains(ev->root_x,ev->root_y)){ if(grabbed()) ungrab(); } else{ if(!grabbed()) grab(); } return 1; } } return 0; } // The widget lost the grab for some reason long FXMenuButton::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onUngrabbed(sender,sel,ptr); handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); return 1; } // Keyboard press; forward to menu pane, or handle it here long FXMenuButton::onKeyPress(FXObject*,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(pane && pane->shown() && pane->handle(pane,sel,ptr)) return 1; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ if(state) handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); else handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); return 1; } } return 0; } // Keyboard release; forward to menu pane, or handle here long FXMenuButton::onKeyRelease(FXObject*,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(pane && pane->shown() && pane->handle(pane,sel,ptr)) return 1; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ return 1; } } return 0; } // Hot key combination pressed long FXMenuButton::onHotKeyPress(FXObject*,FXSelector,void* ptr){ FXTRACE((200,"%s::onHotKeyPress %p\n",getClassName(),this)); flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ if(state) handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); else handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); } return 1; } // Hot key combination released long FXMenuButton::onHotKeyRelease(FXObject*,FXSelector,void*){ FXTRACE((200,"%s::onHotKeyRelease %p\n",getClassName(),this)); return 1; } // Post the menu long FXMenuButton::onCmdPost(FXObject*,FXSelector,void*){ if(!state){ if(pane){ FXint x,y,w,h; translateCoordinatesTo(x,y,getRoot(),0,0); w=pane->getShrinkWrap() ? pane->getDefaultWidth() : pane->getWidth(); h=pane->getShrinkWrap() ? pane->getDefaultHeight() : pane->getHeight(); if((options&MENUBUTTON_LEFT)&&(options&MENUBUTTON_UP)){ // Right if((options&MENUBUTTON_ATTACH_BOTTOM)&&(options&MENUBUTTON_ATTACH_CENTER)){ h=height; } else if(options&MENUBUTTON_ATTACH_CENTER){ y=y+(height-h)/2; } else if(options&MENUBUTTON_ATTACH_BOTTOM){ y=y+height-h; } x=x+offsetx+width; y=y+offsety; } else if(options&MENUBUTTON_LEFT){ // Left if((options&MENUBUTTON_ATTACH_BOTTOM)&&(options&MENUBUTTON_ATTACH_CENTER)){ h=height; } else if(options&MENUBUTTON_ATTACH_CENTER){ y=y+(height-h)/2; } else if(options&MENUBUTTON_ATTACH_BOTTOM){ y=y+height-h; } x=x-offsetx-w; y=y+offsety; } else if(options&MENUBUTTON_UP){ // Up if((options&MENUBUTTON_ATTACH_RIGHT)&&(options&MENUBUTTON_ATTACH_CENTER)){ w=width; } else if(options&MENUBUTTON_ATTACH_CENTER){ x=x+(width-w)/2; } else if(options&MENUBUTTON_ATTACH_RIGHT){ x=x+width-w; } x=x+offsetx; y=y-offsety-h; } else{ // Down if((options&MENUBUTTON_ATTACH_RIGHT)&&(options&MENUBUTTON_ATTACH_CENTER)){ w=width; } else if(options&MENUBUTTON_ATTACH_CENTER){ x=x+(width-w)/2; } else if(options&MENUBUTTON_ATTACH_RIGHT){ x=x+width-w; } x=x+offsetx; y=y+offsety+height; } pane->popup(this,x,y,w,h); if(!grabbed()) grab(); } flags&=~FLAG_UPDATE; state=TRUE; update(); } return 1; } // Unpost the menu long FXMenuButton::onCmdUnpost(FXObject*,FXSelector,void*){ if(state){ if(pane){ pane->popdown(); if(grabbed()) ungrab(); } flags|=FLAG_UPDATE; state=FALSE; update(); } return 1; } // Handle repaint long FXMenuButton::onPaint(FXObject*,FXSelector,void* ptr){ FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy; FXEvent *ev=(FXEvent*)ptr; FXPoint points[3]; FXDCWindow dc(this,ev); // Got a border at all? if(options&(FRAME_RAISED|FRAME_SUNKEN)){ // Toolbar style if(options&MENUBUTTON_TOOLBAR){ // Enabled and cursor inside, and not popped up if(isEnabled() && underCursor() && !state){ dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } // Enabled and popped up else if(isEnabled() && state){ dc.setForeground(hiliteColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height); else drawSunkenRectangle(dc,0,0,width,height); } // Disabled or unchecked or not under cursor else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } } // Normal style else{ // Draw in up state if disabled or up if(!isEnabled() || !state){ dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } // Draw sunken if enabled and either checked or pressed else{ dc.setForeground(hiliteColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height); else drawSunkenRectangle(dc,0,0,width,height); } } } // No borders else{ if(isEnabled() && state){ dc.setForeground(hiliteColor); dc.fillRectangle(0,0,width,height); } else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } } // Position text & icon if(!label.empty()){ tw=labelWidth(label); th=labelHeight(label); } // Icon? if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); } // Arrows? else if(!(options&MENUBUTTON_NOARROWS)){ if(options&MENUBUTTON_LEFT){ ih=MENUBUTTONARROW_WIDTH; iw=MENUBUTTONARROW_HEIGHT; } else{ iw=MENUBUTTONARROW_WIDTH; ih=MENUBUTTONARROW_HEIGHT; } } // Keep some room for the arrow! just_x(tx,ix,tw,iw); just_y(ty,iy,th,ih); // Move a bit when pressed if(state){ ++tx; ++ty; ++ix; ++iy; } // Draw icon if(icon){ if(isEnabled()) dc.drawIcon(icon,ix,iy); else dc.drawIconSunken(icon,ix,iy); } // Draw arrows else if(!(options&MENUBUTTON_NOARROWS)){ // Right arrow if((options&MENUBUTTON_RIGHT)==MENUBUTTON_RIGHT){ if(isEnabled()) dc.setForeground(textColor); else dc.setForeground(shadowColor); points[0].x=ix; points[0].y=iy; points[1].x=ix; points[1].y=iy+MENUBUTTONARROW_WIDTH-1; points[2].x=ix+MENUBUTTONARROW_HEIGHT; points[2].y=(FXshort)(iy+(MENUBUTTONARROW_WIDTH>>1)); dc.fillPolygon(points,3); } // Left arrow else if(options&MENUBUTTON_LEFT){ if(isEnabled()) dc.setForeground(textColor); else dc.setForeground(shadowColor); points[0].x=ix+MENUBUTTONARROW_HEIGHT; points[0].y=iy; points[1].x=ix+MENUBUTTONARROW_HEIGHT; points[1].y=iy+MENUBUTTONARROW_WIDTH-1; points[2].x=ix; points[2].y=(FXshort)(iy+(MENUBUTTONARROW_WIDTH>>1)); dc.fillPolygon(points,3); } // Up arrow else if(options&MENUBUTTON_UP){ if(isEnabled()) dc.setForeground(textColor); else dc.setForeground(shadowColor); points[0].x=(FXshort)(ix+(MENUBUTTONARROW_WIDTH>>1)); points[0].y=iy-1; points[1].x=ix; points[1].y=iy+MENUBUTTONARROW_HEIGHT; points[2].x=ix+MENUBUTTONARROW_WIDTH; points[2].y=iy+MENUBUTTONARROW_HEIGHT; dc.fillPolygon(points,3); } // Down arrow else{ if(isEnabled()) dc.setForeground(textColor); else dc.setForeground(shadowColor); points[0].x=ix+1; points[0].y=iy; points[2].x=ix+MENUBUTTONARROW_WIDTH-1; points[2].y=iy; points[1].x=(FXshort)(ix+(MENUBUTTONARROW_WIDTH>>1)); points[1].y=iy+MENUBUTTONARROW_HEIGHT; dc.fillPolygon(points,3); } } // Draw text if(!label.empty()){ dc.setFont(font); if(isEnabled()){ dc.setForeground(textColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } else{ dc.setForeground(hiliteColor); drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } } // Draw focus if(hasFocus()){ if(isEnabled()){ dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2); } } return 1; } // Out of focus chain void FXMenuButton::killFocus(){ FXLabel::killFocus(); handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); } // Logically inside pane bool FXMenuButton::contains(FXint parentx,FXint parenty) const { if(pane && pane->shown() && pane->contains(parentx,parenty)) return true; return false; } // Change the popup menu void FXMenuButton::setMenu(FXPopup *pup){ if(pup!=pane){ pane=pup; recalc(); } } // Set icon positioning void FXMenuButton::setButtonStyle(FXuint style){ FXuint opts=(options&~MENUBUTTON_MASK) | (style&MENUBUTTON_MASK); if(options!=opts){ options=opts; update(); } } // Get icon positioning FXuint FXMenuButton::getButtonStyle() const { return (options&MENUBUTTON_MASK); } // Set menu button popup style void FXMenuButton::setPopupStyle(FXuint style){ FXuint opts=(options&~POPUP_MASK) | (style&POPUP_MASK); if(options!=opts){ options=opts; update(); } } // Get menu button popup style FXuint FXMenuButton::getPopupStyle() const { return (options&POPUP_MASK); } // Change pane attachment void FXMenuButton::setAttachment(FXuint att){ FXuint opts=(options&~ATTACH_MASK) | (att&ATTACH_MASK); if(options!=opts){ options=opts; update(); } } // Get pane attachment FXuint FXMenuButton::getAttachment() const { return (options&ATTACH_MASK); } // Save object to stream void FXMenuButton::save(FXStream& store) const { FXLabel::save(store); store << pane; store << offsetx; store << offsety; } // Load object from stream void FXMenuButton::load(FXStream& store){ FXLabel::load(store); store >> pane; store >> offsetx; store >> offsety; } // Delete it FXMenuButton::~FXMenuButton(){ pane=(FXPopup*)-1L; } } fox1.6-1.6.57/src/FXMenuCaption.cpp000066400000000000000000000257061326741342000166220ustar00rootroot00000000000000/******************************************************************************** * * * M e n u C a p t i o n W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuCaption.cpp,v 1.53.2.1 2006/12/11 15:57:26 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXMenuCaption.h" /* Notes: - Accelerators. - Help text from constructor is third part; second part should be accelerator key combination. - When menu label changes, hotkey might have to be adjusted. - Fix it so menu stays up when after Alt-F, you press Alt-E. - FXMenuCascade should send ID_POST/ID_UNPOST to self. - Look into SEL_FOCUS_SELF some more:- menus should not get focus, or at least, return the focus to the original widget. - Want to support arbitrary large icons. */ #define LEADSPACE 22 #define TRAILSPACE 16 #define MENU_MASK (MENU_AUTOGRAY|MENU_AUTOHIDE) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMenuCaption) FXMenuCaptionMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMenuCaption::onPaint), FXMAPFUNC(SEL_UPDATE,0,FXMenuCaption::onUpdate), FXMAPFUNC(SEL_QUERY_TIP,0,FXMenuCaption::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXMenuCaption::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXMenuCaption::ID_SETSTRINGVALUE,FXMenuCaption::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXMenuCaption::ID_GETSTRINGVALUE,FXMenuCaption::onCmdGetStringValue), FXMAPFUNC(SEL_COMMAND,FXMenuCaption::ID_SETICONVALUE,FXMenuCaption::onCmdSetIconValue), FXMAPFUNC(SEL_COMMAND,FXMenuCaption::ID_GETICONVALUE,FXMenuCaption::onCmdGetIconValue), FXMAPFUNC(SEL_COMMAND,FXMenuCaption::ID_SETHELPSTRING,FXMenuCaption::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXMenuCaption::ID_GETHELPSTRING,FXMenuCaption::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXMenuCaption::ID_SETTIPSTRING,FXMenuCaption::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXMenuCaption::ID_GETTIPSTRING,FXMenuCaption::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXMenuCaption,FXWindow,FXMenuCaptionMap,ARRAYNUMBER(FXMenuCaptionMap)) // Deserialization FXMenuCaption::FXMenuCaption(){ flags|=FLAG_SHOWN; } // Menu entry FXMenuCaption::FXMenuCaption(FXComposite* p,const FXString& text,FXIcon* ic,FXuint opts): FXWindow(p,opts,0,0,0,0){ FXString string=text.section('\t',0); flags|=FLAG_SHOWN; label=stripHotKey(string); help=text.section('\t',2); icon=ic; font=getApp()->getNormalFont(); hotkey=parseHotKey(string); hotoff=findHotKey(string); addHotKey(hotkey); textColor=getApp()->getForeColor(); seltextColor=getApp()->getSelMenuTextColor(); selbackColor=getApp()->getSelMenuBackColor(); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); } // Create Window void FXMenuCaption::create(){ FXWindow::create(); font->create(); if(icon) icon->create(); } // Detach Window void FXMenuCaption::detach(){ FXWindow::detach(); font->detach(); if(icon) icon->detach(); } // Enable the menu entry void FXMenuCaption::enable(){ if(!(flags&FLAG_ENABLED)){ FXWindow::enable(); update(); } } // Disable the menu entry void FXMenuCaption::disable(){ if(flags&FLAG_ENABLED){ FXWindow::disable(); update(); } } // Get default width FXint FXMenuCaption::getDefaultWidth(){ FXint tw,iw; tw=iw=0; if(!label.empty()) tw=font->getTextWidth(label.text(),label.length()); if(icon) iw=icon->getWidth()+5; return FXMAX(iw,LEADSPACE)+tw+TRAILSPACE; } // Get default height FXint FXMenuCaption::getDefaultHeight(){ FXint th,ih; th=ih=0; if(!label.empty()) th=font->getFontHeight()+5; if(icon) ih=icon->getHeight()+5; return FXMAX(th,ih); } // Set tip using a message long FXMenuCaption::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXMenuCaption::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXMenuCaption::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // Set help using a message long FXMenuCaption::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXMenuCaption::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // We were asked about status text long FXMenuCaption::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Implement auto-hide or auto-gray modes long FXMenuCaption::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ if(!FXWindow::onUpdate(sender,sel,ptr)){ if(options&MENU_AUTOHIDE){if(shown()){hide();recalc();}} if(options&MENU_AUTOGRAY){disable();} } return 1; } // Handle repaint long FXMenuCaption::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXint xx,yy; dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); xx=LEADSPACE; if(icon){ dc.drawIcon(icon,3,(height-icon->getHeight())/2); if(icon->getWidth()+5>xx) xx=icon->getWidth()+5; } if(!label.empty()){ dc.setFont(font); dc.setForeground(textColor); yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.drawText(xx,yy,label); if(0<=hotoff){ dc.fillRectangle(xx+1+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } return 1; } // Update value from a message long FXMenuCaption::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setText(*((FXString*)ptr)); return 1; } // Obtain value from text field long FXMenuCaption::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getText(); return 1; } // Update icon from a message long FXMenuCaption::onCmdSetIconValue(FXObject*,FXSelector,void* ptr){ setIcon(*((FXIcon**)ptr)); return 1; } // Obtain icon from text field long FXMenuCaption::onCmdGetIconValue(FXObject*,FXSelector,void* ptr){ *((FXIcon**)ptr)=getIcon(); return 1; } // Change help text void FXMenuCaption::setHelpText(const FXString& text){ help=text; } // Change text, and scan this text to replace accelerators void FXMenuCaption::setText(const FXString& text){ FXString string=stripHotKey(text); FXHotKey hkey=parseHotKey(text); FXint hoff=findHotKey(text); if(label!=string || hkey!=hotkey || hotoff!=hoff){ label.adopt(string); remHotKey(hotkey); hotkey=hkey; hotoff=hoff; addHotKey(hotkey); recalc(); update(); } } // Change icon void FXMenuCaption::setIcon(FXIcon* ic){ if(icon!=ic){ icon=ic; recalc(); update(); } } // Change font void FXMenuCaption::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Set menu caption style void FXMenuCaption::setMenuStyle(FXuint style){ FXuint opts=(options&~MENU_MASK) | (style&MENU_MASK); if(options!=opts){ options=opts; recalc(); update(); } } // Get menu caption style FXuint FXMenuCaption::getMenuStyle() const { return (options&MENU_MASK); } // Set text color void FXMenuCaption::setTextColor(FXColor clr){ if(clr!=textColor){ textColor=clr; update(); } } // Set select background color void FXMenuCaption::setSelBackColor(FXColor clr){ if(clr!=selbackColor){ selbackColor=clr; update(); } } // Set selected text color void FXMenuCaption::setSelTextColor(FXColor clr){ if(clr!=seltextColor){ seltextColor=clr; update(); } } // Set highlight color void FXMenuCaption::setHiliteColor(FXColor clr){ if(clr!=hiliteColor){ hiliteColor=clr; update(); } } // Set shadow color void FXMenuCaption::setShadowColor(FXColor clr){ if(clr!=shadowColor){ shadowColor=clr; update(); } } // Save object to stream void FXMenuCaption::save(FXStream& store) const { FXWindow::save(store); store << label; store << help; store << tip; store << icon; store << font; store << hotoff; store << hotkey; store << textColor; store << selbackColor; store << seltextColor; store << hiliteColor; store << shadowColor; } // Load object from stream void FXMenuCaption::load(FXStream& store){ FXWindow::load(store); store >> label; store >> help; store >> tip; store >> icon; store >> font; store >> hotoff; store >> hotkey; store >> textColor; store >> selbackColor; store >> seltextColor; store >> hiliteColor; store >> shadowColor; } // Zap it FXMenuCaption::~FXMenuCaption(){ remHotKey(hotkey); font=(FXFont*)-1L; icon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXMenuCascade.cpp000066400000000000000000000276741326741342000165560ustar00rootroot00000000000000/******************************************************************************** * * * M e n u C a s c a d e W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuCascade.cpp,v 1.55 2006/01/22 17:58:35 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXMenuPane.h" #include "FXMenuCascade.h" /* Notes: - Accelerators. - Help text from constructor is third part; second part should be accelerator key combination. - When menu label changes, hotkey might have to be adjusted. - Fix it so menu stays up when after Alt-F, you press Alt-E. - MenuItems should be derived from FXLabel. - FXMenuCascade should send ID_POST/IDUNPOST to self. - Look into SEL_FOCUS_SELF some more... */ #define LEADSPACE 22 #define TRAILSPACE 16 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMenuCascade) FXMenuCascadeMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMenuCascade::onPaint), FXMAPFUNC(SEL_ENTER,0,FXMenuCascade::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXMenuCascade::onLeave), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXMenuCascade::onButtonPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXMenuCascade::onButtonRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXMenuCascade::onButtonPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXMenuCascade::onButtonRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXMenuCascade::onButtonPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXMenuCascade::onButtonRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXMenuCascade::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXMenuCascade::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXMenuCascade::ID_HOTKEY,FXMenuCascade::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXMenuCascade::ID_HOTKEY,FXMenuCascade::onHotKeyRelease), FXMAPFUNC(SEL_TIMEOUT,FXMenuCascade::ID_MENUTIMER,FXMenuCascade::onCmdPost), FXMAPFUNC(SEL_COMMAND,FXMenuCascade::ID_POST,FXMenuCascade::onCmdPost), FXMAPFUNC(SEL_COMMAND,FXMenuCascade::ID_UNPOST,FXMenuCascade::onCmdUnpost), }; // Object implementation FXIMPLEMENT(FXMenuCascade,FXMenuCaption,FXMenuCascadeMap,ARRAYNUMBER(FXMenuCascadeMap)) // Make cascade menu button FXMenuCascade::FXMenuCascade(){ flags|=FLAG_ENABLED; pane=NULL; } // Make cascade menu button FXMenuCascade::FXMenuCascade(FXComposite* p,const FXString& text,FXIcon* ic,FXPopup* pup,FXuint opts): FXMenuCaption(p,text,ic,opts){ defaultCursor=getApp()->getDefaultCursor(DEF_RARROW_CURSOR); flags|=FLAG_ENABLED; pane=pup; } // Create window void FXMenuCascade::create(){ FXMenuCaption::create(); if(pane) pane->create(); } // Detach X window void FXMenuCascade::detach(){ getApp()->removeTimeout(this,ID_MENUTIMER); FXMenuCaption::detach(); if(pane) pane->detach(); } // Destroy window void FXMenuCascade::destroy(){ getApp()->removeTimeout(this,ID_MENUTIMER); FXMenuCaption::destroy(); } // If window can have focus bool FXMenuCascade::canFocus() const { return true; } // Pressed button long FXMenuCascade::onButtonPress(FXObject*,FXSelector,void*){ if(!isEnabled()) return 0; handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); return 1; } // Released button long FXMenuCascade::onButtonRelease(FXObject*,FXSelector,void* ptr){ if(!isEnabled()) return 0; if(((FXEvent*)ptr)->moved){ getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); } return 1; } // Keyboard press; forward to submenu pane long FXMenuCascade::onKeyPress(FXObject*,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(!isEnabled()) return 0; FXTRACE((200,"%s::onKeyPress %p keysym=0x%04x state=%04x\n",getClassName(),this,event->code,event->state)); if(pane && pane->shown() && pane->handle(pane,sel,ptr)) return 1; switch(event->code){ case KEY_Right: if(pane && !pane->shown()){ FXint x,y; getApp()->removeTimeout(this,ID_MENUTIMER); translateCoordinatesTo(x,y,getRoot(),width,0); pane->popup(((FXMenuPane*)getParent())->getGrabOwner(),x,y); return 1; } break; case KEY_Left: if(pane && pane->shown()){ getApp()->removeTimeout(this,ID_MENUTIMER); pane->popdown(); return 1; } break; case KEY_KP_Enter: case KEY_Return: case KEY_space: case KEY_KP_Space: handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); return 1; } return 0; } // Keyboard release; forward to submenu pane long FXMenuCascade::onKeyRelease(FXObject*,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(!isEnabled()) return 0; FXTRACE((200,"%s::onKeyRelease %p keysym=0x%04x state=%04x\n",getClassName(),this,event->code,event->state)); if(pane && pane->shown() && pane->handle(pane,sel,ptr)) return 1; switch(event->code){ case KEY_Right: case KEY_Left: return 1; case KEY_KP_Enter: case KEY_Return: case KEY_space: case KEY_KP_Space: return 1; } return 0; } // Hot key combination pressed long FXMenuCascade::onHotKeyPress(FXObject*,FXSelector,void* ptr){ FXTRACE((200,"%s::onHotKeyPress %p\n",getClassName(),this)); handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); } return 1; } // Hot key combination released long FXMenuCascade::onHotKeyRelease(FXObject*,FXSelector,void*){ FXTRACE((200,"%s::onHotKeyRelease %p\n",getClassName(),this)); return 1; } // Post the menu long FXMenuCascade::onCmdPost(FXObject*,FXSelector,void*){ FXint x,y; getApp()->removeTimeout(this,ID_MENUTIMER); if(pane && !pane->shown()){ translateCoordinatesTo(x,y,getRoot(),width,0); pane->popup(((FXMenuPane*)getParent())->getGrabOwner(),x,y); } return 1; } // Unpost the menu long FXMenuCascade::onCmdUnpost(FXObject*,FXSelector,void*){ getApp()->removeTimeout(this,ID_MENUTIMER); if(pane && pane->shown()){ pane->popdown(); } return 1; } // Into focus chain void FXMenuCascade::setFocus(){ FXMenuCaption::setFocus(); flags|=FLAG_ACTIVE; flags&=~FLAG_UPDATE; update(); } // Out of focus chain; hide submenu if it was up void FXMenuCascade::killFocus(){ FXMenuCaption::killFocus(); handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); flags&=~FLAG_ACTIVE; flags|=FLAG_UPDATE; update(); } // Enter; set timer for delayed popup long FXMenuCascade::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXMenuCaption::onEnter(sender,sel,ptr); if(isEnabled() && canFocus()){ getApp()->addTimeout(this,ID_MENUTIMER,getApp()->getMenuPause()); setFocus(); } return 1; } // Leave long FXMenuCascade::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXMenuCaption::onLeave(sender,sel,ptr); getApp()->removeTimeout(this,ID_MENUTIMER); return 1; } // Handle repaint long FXMenuCascade::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXint xx,yy; xx=LEADSPACE; // Grayed out if(!isEnabled()){ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(icon){ dc.drawIconSunken(icon,3,(height-icon->getHeight())/2); if(icon->getWidth()+5>xx) xx=icon->getWidth()+5; } if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(hiliteColor); dc.drawText(xx+1,yy+1,label); dc.setForeground(shadowColor); dc.drawText(xx,yy,label); if(0<=hotoff){ dc.fillRectangle(xx+1+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } yy=(height-8)/2; dc.setForeground(shadowColor); drawTriangle(dc,width-TRAILSPACE+4,yy,width-TRAILSPACE+4+6,yy+8); } // Active else if(isActive()){ dc.setForeground(selbackColor); dc.fillRectangle(0,0,width,height); if(icon){ dc.drawIcon(icon,3,(height-icon->getHeight())/2); if(icon->getWidth()+5>xx) xx=icon->getWidth()+5; } if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(isEnabled() ? seltextColor : shadowColor); dc.drawText(xx,yy,label); if(0<=hotoff){ dc.fillRectangle(xx+1+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } yy=(height-8)/2; dc.setForeground(seltextColor); drawTriangle(dc,width-TRAILSPACE+4,yy,width-TRAILSPACE+4+6,yy+8); } // Normal else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(icon){ dc.drawIcon(icon,3,(height-icon->getHeight())/2); if(icon->getWidth()+5>xx) xx=icon->getWidth()+5; } if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(textColor); dc.drawText(xx,yy,label); if(0<=hotoff){ dc.fillRectangle(xx+1+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } yy=(height-8)/2; dc.setForeground(textColor); drawTriangle(dc,width-TRAILSPACE+4,yy,width-TRAILSPACE+4+6,yy+8); } return 1; } // Draw triangle void FXMenuCascade::drawTriangle(FXDCWindow& dc,FXint l,FXint t,FXint,FXint b){ FXPoint points[3]; int m=(t+b)/2; points[0].x=l; points[0].y=t; points[1].x=l; points[1].y=b; points[2].x=l+(b-t)/2; points[2].y=m; dc.fillPolygon(points,3); } // Test if logically inside bool FXMenuCascade::contains(FXint parentx,FXint parenty) const { FXint x,y; if(FXMenuCaption::contains(parentx,parenty)) return true; if(getMenu() && getMenu()->shown()){ getParent()->translateCoordinatesTo(x,y,getRoot(),parentx,parenty); if(getMenu()->contains(x,y)) return true; } return false; } // Save object to stream void FXMenuCascade::save(FXStream& store) const { FXMenuCaption::save(store); store << pane; } // Load object from stream void FXMenuCascade::load(FXStream& store){ FXMenuCaption::load(store); store >> pane; } // Delete it FXMenuCascade::~FXMenuCascade(){ getApp()->removeTimeout(this,ID_MENUTIMER); pane=(FXMenuPane*)-1L; } } fox1.6-1.6.57/src/FXMenuCheck.cpp000066400000000000000000000267001326741342000162350ustar00rootroot00000000000000/******************************************************************************** * * * M e n u C h e c k W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuCheck.cpp,v 1.30 2006/01/22 17:58:36 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXMenuCommand.h" #include "FXMenuCheck.h" /* Notes: - FXMenuCheck should flip state when invoked, and send new state along in ptr in callback. */ #define LEADSPACE 22 #define TRAILSPACE 16 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMenuCheck) FXMenuCheckMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMenuCheck::onPaint), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXMenuCheck::onButtonPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXMenuCheck::onButtonRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXMenuCheck::onButtonPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXMenuCheck::onButtonRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXMenuCheck::onButtonPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXMenuCheck::onButtonRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXMenuCheck::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXMenuCheck::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXWindow::ID_HOTKEY,FXMenuCheck::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXWindow::ID_HOTKEY,FXMenuCheck::onHotKeyRelease), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_CHECK,FXMenuCheck::onCheck), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNCHECK,FXMenuCheck::onUncheck), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNKNOWN,FXMenuCheck::onUnknown), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXMenuCheck::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETINTVALUE,FXMenuCheck::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETINTVALUE,FXMenuCheck::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_ACCEL,FXMenuCheck::onCmdAccel), }; // Object implementation FXIMPLEMENT(FXMenuCheck,FXMenuCommand,FXMenuCheckMap,ARRAYNUMBER(FXMenuCheckMap)) // Command menu item FXMenuCheck::FXMenuCheck(){ boxColor=0; check=FALSE; } // Command menu item FXMenuCheck::FXMenuCheck(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts): FXMenuCommand(p,text,NULL,tgt,sel,opts){ boxColor=getApp()->getBackColor(); check=FALSE; } // Get default width FXint FXMenuCheck::getDefaultWidth(){ FXint tw,aw; tw=aw=0; if(!label.empty()) tw=font->getTextWidth(label.text(),label.length()); if(!accel.empty()) aw=font->getTextWidth(accel.text(),accel.length()); if(aw && tw) aw+=5; return LEADSPACE+tw+aw+TRAILSPACE; } // Get default height FXint FXMenuCheck::getDefaultHeight(){ FXint th=0; if(!label.empty() || !accel.empty()) th=font->getFontHeight()+5; return FXMAX(th,20); } // Check button void FXMenuCheck::setCheck(FXbool s){ if(check!=s){ check=s; update(); } } // Change state to checked long FXMenuCheck::onCheck(FXObject*,FXSelector,void*){ setCheck(TRUE); return 1; } // Change state to unchecked long FXMenuCheck::onUncheck(FXObject*,FXSelector,void*){ setCheck(FALSE); return 1; } // Change state to indeterminate long FXMenuCheck::onUnknown(FXObject*,FXSelector,void*){ setCheck(MAYBE); return 1; } // Update value from a message long FXMenuCheck::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCheck((FXbool)(FXuval)ptr); return 1; } // Update value from a message long FXMenuCheck::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setCheck((FXbool)*((FXint*)ptr)); return 1; } // Obtain value from text field long FXMenuCheck::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getCheck(); return 1; } // Pressed button long FXMenuCheck::onButtonPress(FXObject*,FXSelector,void*){ if(!isEnabled()) return 0; return 1; } // Released button long FXMenuCheck::onButtonRelease(FXObject*,FXSelector,void*){ FXbool active=isActive(); if(!isEnabled()) return 0; getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(active){ setCheck(!check); if(target){ target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)check); } } return 1; } // Keyboard press long FXMenuCheck::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && !(flags&FLAG_PRESSED)){ FXTRACE((200,"%s::onKeyPress %p keysym=0x%04x state=%04x\n",getClassName(),this,event->code,event->state)); if(event->code==KEY_space || event->code==KEY_KP_Space || event->code==KEY_Return || event->code==KEY_KP_Enter){ flags|=FLAG_PRESSED; return 1; } } return 0; } // Keyboard release long FXMenuCheck::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && (flags&FLAG_PRESSED)){ FXTRACE((200,"%s::onKeyRelease %p keysym=0x%04x state=%04x\n",getClassName(),this,event->code,event->state)); if(event->code==KEY_space || event->code==KEY_KP_Space || event->code==KEY_Return || event->code==KEY_KP_Enter){ flags&=~FLAG_PRESSED; setCheck(!check); getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)check); return 1; } } return 0; } // Hot key combination pressed long FXMenuCheck::onHotKeyPress(FXObject*,FXSelector,void* ptr){ FXTRACE((200,"%s::onHotKeyPress %p\n",getClassName(),this)); handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled() && !(flags&FLAG_PRESSED)){ flags|=FLAG_PRESSED; } return 1; } // Hot key combination released long FXMenuCheck::onHotKeyRelease(FXObject*,FXSelector,void*){ FXTRACE((200,"%s::onHotKeyRelease %p\n",getClassName(),this)); if(isEnabled() && (flags&FLAG_PRESSED)){ flags&=~FLAG_PRESSED; setCheck(!check); getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)check); } return 1; } // Accelerator activated long FXMenuCheck::onCmdAccel(FXObject*,FXSelector,void*){ if(isEnabled()){ setCheck(!check); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)check); return 1; } return 0; } // Handle repaint long FXMenuCheck::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXint xx,yy; xx=LEADSPACE; // Grayed out if(!isEnabled()){ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(hiliteColor); dc.drawText(xx+1,yy+1,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel)+1,yy+1,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff)+1,yy+2,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); dc.setForeground(shadowColor); dc.drawText(xx,yy,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel),yy,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } // Active else if(isActive()){ dc.setForeground(selbackColor); dc.fillRectangle(0,0,width,height); if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(isEnabled() ? seltextColor : shadowColor); dc.drawText(xx,yy,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel),yy,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } // Normal else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(textColor); dc.drawText(xx,yy,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel),yy,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } // Draw the box xx=5; yy=(height-9)/2; if(!isEnabled()) dc.setForeground(backColor); else dc.setForeground(boxColor); dc.fillRectangle(xx+1,yy+1,8,8); dc.setForeground(shadowColor); dc.drawRectangle(xx,yy,9,9); // Draw the check if(check!=FALSE){ FXSegment seg[6]; seg[0].x1=2+xx; seg[0].y1=4+yy; seg[0].x2=4+xx; seg[0].y2=6+yy; seg[1].x1=2+xx; seg[1].y1=5+yy; seg[1].x2=4+xx; seg[1].y2=7+yy; seg[2].x1=2+xx; seg[2].y1=6+yy; seg[2].x2=4+xx; seg[2].y2=8+yy; seg[3].x1=4+xx; seg[3].y1=6+yy; seg[3].x2=8+xx; seg[3].y2=2+yy; seg[4].x1=4+xx; seg[4].y1=7+yy; seg[4].x2=8+xx; seg[4].y2=3+yy; seg[5].x1=4+xx; seg[5].y1=8+yy; seg[5].x2=8+xx; seg[5].y2=4+yy; if(isEnabled()){ if(check==MAYBE) dc.setForeground(shadowColor); else dc.setForeground(textColor); } else{ dc.setForeground(shadowColor); } dc.drawLineSegments(seg,6); } return 1; } // Set box color void FXMenuCheck::setBoxColor(FXColor clr){ if(clr!=boxColor){ boxColor=clr; update(); } } // Save object to stream void FXMenuCheck::save(FXStream& store) const { FXMenuCommand::save(store); store << check; store << boxColor; } // Load object from stream void FXMenuCheck::load(FXStream& store){ FXMenuCommand::load(store); store >> check; store >> boxColor; } } fox1.6-1.6.57/src/FXMenuCommand.cpp000066400000000000000000000273411326741342000166000ustar00rootroot00000000000000/******************************************************************************** * * * M e n u C o m m a n d W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuCommand.cpp,v 1.72 2006/01/22 17:58:36 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXMenuCommand.h" /* Notes: - Help text from constructor is third part; second part should be accelerator key combination. - When menu label changes, hotkey might have to be adjusted. - Fix it so menu stays up when after Alt-F, you press Alt-E. - MenuItems should be derived from FXLabel. - FXMenuCascade should send ID_POST/IDUNPOST to self. - Look into SEL_FOCUS_SELF some more... - We handle left, middle, right mouse buttons exactly the same; this permits popup menus posted by any mouse button. - MenuCommand should flip state when invoked, and send new state along in ptr in callback. */ #define LEADSPACE 22 #define TRAILSPACE 16 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMenuCommand) FXMenuCommandMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMenuCommand::onPaint), FXMAPFUNC(SEL_ENTER,0,FXMenuCommand::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXMenuCommand::onLeave), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXMenuCommand::onButtonPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXMenuCommand::onButtonRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXMenuCommand::onButtonPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXMenuCommand::onButtonRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXMenuCommand::onButtonPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXMenuCommand::onButtonRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXMenuCommand::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXMenuCommand::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXWindow::ID_HOTKEY,FXMenuCommand::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXWindow::ID_HOTKEY,FXMenuCommand::onHotKeyRelease), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_ACCEL,FXMenuCommand::onCmdAccel), }; // Object implementation FXIMPLEMENT(FXMenuCommand,FXMenuCaption,FXMenuCommandMap,ARRAYNUMBER(FXMenuCommandMap)) // Command menu item FXMenuCommand::FXMenuCommand(){ flags|=FLAG_ENABLED; acckey=0; } // Command menu item FXMenuCommand::FXMenuCommand(FXComposite* p,const FXString& text,FXIcon* ic,FXObject* tgt,FXSelector sel,FXuint opts): FXMenuCaption(p,text,ic,opts){ FXAccelTable *table; FXWindow *own; flags|=FLAG_ENABLED; defaultCursor=getApp()->getDefaultCursor(DEF_RARROW_CURSOR); target=tgt; message=sel; accel=text.section('\t',1); acckey=parseAccel(accel); if(acckey){ own=getShell()->getOwner(); if(own){ table=own->getAccelTable(); if(table){ table->addAccel(acckey,this,FXSEL(SEL_COMMAND,ID_ACCEL)); } } } } // Get default width FXint FXMenuCommand::getDefaultWidth(){ FXint tw,aw,iw; tw=aw=iw=0; if(!label.empty()) tw=font->getTextWidth(label.text(),label.length()); if(!accel.empty()) aw=font->getTextWidth(accel.text(),accel.length()); if(aw && tw) aw+=5; if(icon) iw=icon->getWidth()+5; return FXMAX(iw,LEADSPACE)+tw+aw+TRAILSPACE; } // Get default height FXint FXMenuCommand::getDefaultHeight(){ FXint th,ih; th=ih=0; if(!label.empty() || !accel.empty()) th=font->getFontHeight()+5; if(icon) ih=icon->getHeight()+5; return FXMAX(th,ih); } // If window can have focus bool FXMenuCommand::canFocus() const { return true; } // Enter long FXMenuCommand::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXMenuCaption::onEnter(sender,sel,ptr); if(isEnabled() && canFocus()) setFocus(); return 1; } // Leave long FXMenuCommand::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXMenuCaption::onLeave(sender,sel,ptr); if(isEnabled() && canFocus()) killFocus(); return 1; } // Pressed button long FXMenuCommand::onButtonPress(FXObject*,FXSelector,void*){ if(!isEnabled()) return 0; return 1; } // Released button long FXMenuCommand::onButtonRelease(FXObject*,FXSelector,void*){ FXbool active=isActive(); if(!isEnabled()) return 0; getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(active && target){ target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)1); } return 1; } // Keyboard press long FXMenuCommand::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && !(flags&FLAG_PRESSED)){ FXTRACE((200,"%s::onKeyPress %p keysym=0x%04x state=%04x\n",getClassName(),this,event->code,event->state)); if(event->code==KEY_space || event->code==KEY_KP_Space || event->code==KEY_Return || event->code==KEY_KP_Enter){ flags|=FLAG_PRESSED; return 1; } } return 0; } // Keyboard release long FXMenuCommand::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && (flags&FLAG_PRESSED)){ FXTRACE((200,"%s::onKeyRelease %p keysym=0x%04x state=%04x\n",getClassName(),this,event->code,event->state)); if(event->code==KEY_space || event->code==KEY_KP_Space || event->code==KEY_Return || event->code==KEY_KP_Enter){ flags&=~FLAG_PRESSED; getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)1); return 1; } } return 0; } // Hot key combination pressed long FXMenuCommand::onHotKeyPress(FXObject*,FXSelector,void* ptr){ FXTRACE((200,"%s::onHotKeyPress %p\n",getClassName(),this)); handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled() && !(flags&FLAG_PRESSED)){ flags|=FLAG_PRESSED; } return 1; } // Hot key combination released long FXMenuCommand::onHotKeyRelease(FXObject*,FXSelector,void*){ FXTRACE((200,"%s::onHotKeyRelease %p\n",getClassName(),this)); if(isEnabled() && (flags&FLAG_PRESSED)){ flags&=~FLAG_PRESSED; getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)1); } return 1; } // Accelerator activated long FXMenuCommand::onCmdAccel(FXObject*,FXSelector,void*){ if(isEnabled()){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)1); return 1; } return 0; } // Into focus chain void FXMenuCommand::setFocus(){ FXMenuCaption::setFocus(); flags|=FLAG_ACTIVE; flags&=~FLAG_UPDATE; update(); } // Out of focus chain void FXMenuCommand::killFocus(){ FXMenuCaption::killFocus(); flags&=~FLAG_ACTIVE; flags|=FLAG_UPDATE; update(); } // Handle repaint long FXMenuCommand::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXint xx,yy; xx=LEADSPACE; // Grayed out if(!isEnabled()){ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(icon){ dc.drawIconSunken(icon,3,(height-icon->getHeight())/2); if(icon->getWidth()+5>xx) xx=icon->getWidth()+5; } if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(hiliteColor); dc.drawText(xx+1,yy+1,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel)+1,yy+1,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff)+1,yy+2,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); dc.setForeground(shadowColor); dc.drawText(xx,yy,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel),yy,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } // Active else if(isActive()){ dc.setForeground(selbackColor); dc.fillRectangle(0,0,width,height); if(icon){ dc.drawIcon(icon,3,(height-icon->getHeight())/2); if(icon->getWidth()+5>xx) xx=icon->getWidth()+5; } if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(isEnabled() ? seltextColor : shadowColor); dc.drawText(xx,yy,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel),yy,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } // Normal else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(icon){ dc.drawIcon(icon,3,(height-icon->getHeight())/2); if(icon->getWidth()+5>xx) xx=icon->getWidth()+5; } if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(textColor); dc.drawText(xx,yy,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel),yy,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } return 1; } // Change accelerator text; note this just changes the text! // This is because the accelerator's target may be different from // the MenuCommands and we don't want to blow it away. void FXMenuCommand::setAccelText(const FXString& text){ if(accel!=text){ accel=text; recalc(); update(); } } // Save object to stream void FXMenuCommand::save(FXStream& store) const { FXMenuCaption::save(store); store << accel; store << acckey; } // Load object from stream void FXMenuCommand::load(FXStream& store){ FXMenuCaption::load(store); store >> accel; store >> acckey; } // Need to uninstall accelerator FXMenuCommand::~FXMenuCommand(){ FXAccelTable *table; FXWindow *own; if(acckey){ own=getShell()->getOwner(); if(own){ table=own->getAccelTable(); if(table){ table->removeAccel(acckey); } } } } } fox1.6-1.6.57/src/FXMenuPane.cpp000066400000000000000000000061021326741342000160750ustar00rootroot00000000000000/******************************************************************************** * * * M e n u P a n e W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuPane.cpp,v 1.23 2006/01/22 17:58:36 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXMenuPane.h" /* Notes: - Should FXPopup still exist? */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXMenuPane,FXPopup,NULL,0) // Build empty one FXMenuPane::FXMenuPane(FXWindow* owner,FXuint opts): FXPopup(owner,opts|FRAME_RAISED|FRAME_THICK){ accelTable=new FXAccelTable; } // Cursor is considered inside when it's in this window, or in any subwindow // that's open; we'll find the latter through the cascade menu, by asking it for // it's popup window. bool FXMenuPane::contains(FXint parentx,FXint parenty) const { FXint x,y; if(FXPopup::contains(parentx,parenty)) return true; if(getFocus()){ getParent()->translateCoordinatesTo(x,y,this,parentx,parenty); if(getFocus()->contains(x,y)) return true; } return false; } } fox1.6-1.6.57/src/FXMenuRadio.cpp000066400000000000000000000263551326741342000162640ustar00rootroot00000000000000/******************************************************************************** * * * M e n u R a d i o W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuRadio.cpp,v 1.33 2006/01/22 17:58:36 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXMenuCommand.h" #include "FXMenuRadio.h" /* Notes: - FXMenuRadio should set state when invoked, and send new state along in ptr in callback. */ #define LEADSPACE 22 #define TRAILSPACE 16 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMenuRadio) FXMenuRadioMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMenuRadio::onPaint), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXMenuRadio::onButtonPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXMenuRadio::onButtonRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXMenuRadio::onButtonPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXMenuRadio::onButtonRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXMenuRadio::onButtonPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXMenuRadio::onButtonRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXMenuRadio::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXMenuRadio::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXWindow::ID_HOTKEY,FXMenuRadio::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXWindow::ID_HOTKEY,FXMenuRadio::onHotKeyRelease), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_CHECK,FXMenuRadio::onCheck), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNCHECK,FXMenuRadio::onUncheck), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNKNOWN,FXMenuRadio::onUnknown), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXMenuRadio::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETINTVALUE,FXMenuRadio::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETINTVALUE,FXMenuRadio::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_ACCEL,FXMenuRadio::onCmdAccel), }; // Object implementation FXIMPLEMENT(FXMenuRadio,FXMenuCommand,FXMenuRadioMap,ARRAYNUMBER(FXMenuRadioMap)) // Command menu item FXMenuRadio::FXMenuRadio(){ radioColor=0; check=FALSE; } // Command menu item FXMenuRadio::FXMenuRadio(FXComposite* p,const FXString& text,FXObject* tgt,FXSelector sel,FXuint opts): FXMenuCommand(p,text,NULL,tgt,sel,opts){ radioColor=getApp()->getBackColor(); check=FALSE; } // Get default width FXint FXMenuRadio::getDefaultWidth(){ FXint tw,aw; tw=aw=0; if(!label.empty()) tw=font->getTextWidth(label.text(),label.length()); if(!accel.empty()) aw=font->getTextWidth(accel.text(),accel.length()); if(aw && tw) aw+=5; return LEADSPACE+tw+aw+TRAILSPACE; } // Get default height FXint FXMenuRadio::getDefaultHeight(){ FXint th=0; if(!label.empty() || !accel.empty()) th=font->getFontHeight()+5; return FXMAX(th,20); } // Check button void FXMenuRadio::setCheck(FXbool s){ if(check!=s){ check=s; update(); } } // Change state to checked long FXMenuRadio::onCheck(FXObject*,FXSelector,void*){ setCheck(TRUE); return 1; } // Change state to unchecked long FXMenuRadio::onUncheck(FXObject*,FXSelector,void*){ setCheck(FALSE); return 1; } // Change state to indeterminate long FXMenuRadio::onUnknown(FXObject*,FXSelector,void*){ setCheck(MAYBE); return 1; } // Update value from a message long FXMenuRadio::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCheck((FXbool)(FXuval)ptr); return 1; } // Update value from a message long FXMenuRadio::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setCheck((FXbool)*((FXint*)ptr)); return 1; } // Obtain value from text field long FXMenuRadio::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getCheck(); return 1; } // Pressed button long FXMenuRadio::onButtonPress(FXObject*,FXSelector,void*){ if(!isEnabled()) return 0; return 1; } // Released button long FXMenuRadio::onButtonRelease(FXObject*,FXSelector,void*){ FXbool active=isActive(); if(!isEnabled()) return 0; getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(active){ setCheck(TRUE); if(target){ target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)TRUE); } } return 1; } // Keyboard press long FXMenuRadio::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && !(flags&FLAG_PRESSED)){ FXTRACE((200,"%s::onKeyPress %p keysym=0x%04x state=%04x\n",getClassName(),this,event->code,event->state)); if(event->code==KEY_space || event->code==KEY_KP_Space || event->code==KEY_Return || event->code==KEY_KP_Enter){ flags|=FLAG_PRESSED; return 1; } } return 0; } // Keyboard release long FXMenuRadio::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && (flags&FLAG_PRESSED)){ FXTRACE((200,"%s::onKeyRelease %p keysym=0x%04x state=%04x\n",getClassName(),this,event->code,event->state)); if(event->code==KEY_space || event->code==KEY_KP_Space || event->code==KEY_Return || event->code==KEY_KP_Enter){ flags&=~FLAG_PRESSED; setCheck(TRUE); getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)TRUE); return 1; } } return 0; } // Hot key combination pressed long FXMenuRadio::onHotKeyPress(FXObject*,FXSelector,void* ptr){ FXTRACE((200,"%s::onHotKeyPress %p\n",getClassName(),this)); handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled() && !(flags&FLAG_PRESSED)){ flags|=FLAG_PRESSED; } return 1; } // Hot key combination released long FXMenuRadio::onHotKeyRelease(FXObject*,FXSelector,void*){ FXTRACE((200,"%s::onHotKeyRelease %p\n",getClassName(),this)); if(isEnabled() && (flags&FLAG_PRESSED)){ flags&=~FLAG_PRESSED; setCheck(TRUE); getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)TRUE); } return 1; } // Accelerator activated long FXMenuRadio::onCmdAccel(FXObject*,FXSelector,void*){ if(isEnabled()){ setCheck(TRUE); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)TRUE); return 1; } return 0; } // Handle repaint long FXMenuRadio::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXint xx,yy; xx=LEADSPACE; // Grayed out if(!isEnabled()){ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(hiliteColor); dc.drawText(xx+1,yy+1,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel)+1,yy+1,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff)+1,yy+2,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); dc.setForeground(shadowColor); dc.drawText(xx,yy,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel),yy,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } // Active else if(isActive()){ dc.setForeground(selbackColor); dc.fillRectangle(0,0,width,height); if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(isEnabled() ? seltextColor : shadowColor); dc.drawText(xx,yy,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel),yy,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } // Normal else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(!label.empty()){ yy=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setFont(font); dc.setForeground(textColor); dc.drawText(xx,yy,label); if(!accel.empty()) dc.drawText(width-TRAILSPACE-font->getTextWidth(accel),yy,accel); if(0<=hotoff) dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } // Draw the radio xx=5; yy=(height-9)/2; if(!isEnabled()) dc.setForeground(backColor); else dc.setForeground(radioColor); dc.fillArc(xx,yy,9,9,0,360*64); dc.setForeground(shadowColor); dc.drawArc(xx,yy,9,9,0,360*64); // Draw the bullit if(check!=FALSE){ FXRectangle recs[3]; recs[0].x=xx+4; recs[0].y=yy+3; recs[0].w=2; recs[0].h=1; recs[1].x=xx+3; recs[1].y=yy+4; recs[1].w=4; recs[1].h=2; recs[2].x=xx+4; recs[2].y=yy+6; recs[2].w=2; recs[2].h=1; if(isEnabled()){ if(check==MAYBE) dc.setForeground(shadowColor); else dc.setForeground(textColor); } else{ dc.setForeground(shadowColor); } dc.fillRectangles(recs,3); } return 1; } // Set radio color void FXMenuRadio::setRadioColor(FXColor clr){ if(radioColor!=clr){ radioColor=clr; update(); } } // Save object to stream void FXMenuRadio::save(FXStream& store) const { FXMenuCommand::save(store); store << check; store << radioColor; } // Load object from stream void FXMenuRadio::load(FXStream& store){ FXMenuCommand::load(store); store >> check; store >> radioColor; } } fox1.6-1.6.57/src/FXMenuSeparator.cpp000066400000000000000000000106731326741342000171620ustar00rootroot00000000000000/******************************************************************************** * * * M e n u S e p a r a t o r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuSeparator.cpp,v 1.31 2006/01/22 17:58:36 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXMenuSeparator.h" /* Notes: - Accelerators. - Help text from constructor is third part; second part should be accelerator key combination. - When menu label changes, hotkey might have to be adjusted. - Fix it so menu stays up when after Alt-F, you press Alt-E. - MenuItems should be derived from FXLabel. - FXMenuCascade should send ID_POST/IDUNPOST to self. */ #define LEADSPACE 22 #define TRAILSPACE 16 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMenuSeparator) FXMenuSeparatorMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMenuSeparator::onPaint), }; // Object implementation FXIMPLEMENT(FXMenuSeparator,FXWindow,FXMenuSeparatorMap,ARRAYNUMBER(FXMenuSeparatorMap)) // Deserialization FXMenuSeparator::FXMenuSeparator(){ flags|=FLAG_SHOWN; } // Separator item FXMenuSeparator::FXMenuSeparator(FXComposite* p,FXuint opts): FXWindow(p,opts,0,0,0,0){ flags|=FLAG_SHOWN; defaultCursor=getApp()->getDefaultCursor(DEF_RARROW_CURSOR); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); } // Handle repaint long FXMenuSeparator::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); dc.setForeground(backColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); dc.setForeground(shadowColor); //dc.drawLine(1,0,width-1,0); dc.fillRectangle(1,0,width,1); dc.setForeground(hiliteColor); //dc.drawLine(1,1,width-1,1); dc.fillRectangle(1,1,width,1); return 1; } // Get default size FXint FXMenuSeparator::getDefaultWidth(){ return LEADSPACE+TRAILSPACE; } FXint FXMenuSeparator::getDefaultHeight(){ return 2; } // Set highlight color void FXMenuSeparator::setHiliteColor(FXColor clr){ if(clr!=hiliteColor){ hiliteColor=clr; update(); } } // Set shadow color void FXMenuSeparator::setShadowColor(FXColor clr){ if(clr!=shadowColor){ shadowColor=clr; update(); } } // Save object to stream void FXMenuSeparator::save(FXStream& store) const { FXWindow::save(store); store << hiliteColor; store << shadowColor; } // Load object from stream void FXMenuSeparator::load(FXStream& store){ FXWindow::load(store); store >> hiliteColor; store >> shadowColor; } } fox1.6-1.6.57/src/FXMenuTitle.cpp000066400000000000000000000317761326741342000163120ustar00rootroot00000000000000/******************************************************************************** * * * M e n u T i t l e W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMenuTitle.cpp,v 1.52 2006/01/22 17:58:36 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXMenuPane.h" #include "FXMenuTitle.h" /* Notes: - Help text from constructor is third part; second part should be accelerator key combination. - When menu label changes, hotkey might have to be adjusted. - Fix it so menu stays up when after Alt-F, you press Alt-E. - Menu items should be derived from FXLabel. - Look into SEL_FOCUS_SELF some more... - GUI update disabled while menu is popped up. - Menu shows besides Menu Title if menubar is vertical. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMenuTitle) FXMenuTitleMap[]={ FXMAPFUNC(SEL_PAINT,0,FXMenuTitle::onPaint), FXMAPFUNC(SEL_ENTER,0,FXMenuTitle::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXMenuTitle::onLeave), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXMenuTitle::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXMenuTitle::onLeftBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXMenuTitle::onDefault), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXMenuTitle::onDefault), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXMenuTitle::onDefault), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXMenuTitle::onDefault), FXMAPFUNC(SEL_KEYPRESS,0,FXMenuTitle::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXMenuTitle::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXWindow::ID_HOTKEY,FXMenuTitle::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXWindow::ID_HOTKEY,FXMenuTitle::onHotKeyRelease), FXMAPFUNC(SEL_FOCUS_UP,0,FXMenuTitle::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXMenuTitle::onFocusDown), FXMAPFUNC(SEL_FOCUSIN,0,FXMenuTitle::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXMenuTitle::onFocusOut), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_POST,FXMenuTitle::onCmdPost), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNPOST,FXMenuTitle::onCmdUnpost), }; // Object implementation FXIMPLEMENT(FXMenuTitle,FXMenuCaption,FXMenuTitleMap,ARRAYNUMBER(FXMenuTitleMap)) // Make a menu title button FXMenuTitle::FXMenuTitle(FXComposite* p,const FXString& text,FXIcon* ic,FXPopup* pup,FXuint opts): FXMenuCaption(p,text,ic,opts){ flags|=FLAG_ENABLED; textColor=getApp()->getForeColor(); seltextColor=getApp()->getForeColor(); selbackColor=getApp()->getBaseColor(); pane=pup; } // Create window void FXMenuTitle::create(){ FXMenuCaption::create(); if(pane) pane->create(); } // Create window void FXMenuTitle::detach(){ FXMenuCaption::detach(); if(pane) pane->detach(); } // If window can have focus bool FXMenuTitle::canFocus() const { return true; } // Get default width FXint FXMenuTitle::getDefaultWidth(){ FXint tw,iw; tw=iw=0; if(!label.empty()) tw=font->getTextWidth(label.text(),label.length()); if(icon) iw=icon->getWidth(); if(iw && tw) iw+=5; return tw+iw+12; } // Get default height FXint FXMenuTitle::getDefaultHeight(){ FXint th,ih; th=ih=0; if(!label.empty()) th=font->getFontHeight(); if(icon) ih=icon->getHeight(); return FXMAX(th,ih)+4; } // Gained focus long FXMenuTitle::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXMenuCaption::onFocusIn(sender,sel,ptr); update(); return 1; } // Lost focus long FXMenuTitle::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXMenuCaption::onFocusOut(sender,sel,ptr); update(); return 1; } // Enter long FXMenuTitle::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXMenuCaption::onEnter(sender,sel,ptr); if(!isEnabled()) return 1; if(canFocus() && getParent()->getFocus()) setFocus(); update(); return 1; } // Leave long FXMenuTitle::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXMenuCaption::onLeave(sender,sel,ptr); if(!isEnabled()) return 1; update(); return 1; } // When pressed, perform ungrab, then process normally long FXMenuTitle::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; if(flags&FLAG_ACTIVE){ handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); } return 1; } return 0; } // Released left button long FXMenuTitle::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(event->moved){ handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),ptr); } return 1; } return 0; } // Keyboard press; forward to menu pane long FXMenuTitle::onKeyPress(FXObject*,FXSelector sel,void* ptr){ if(isEnabled()){ FXTRACE((200,"%s::onKeyPress %p keysym=0x%04x state=%04x\n",getClassName(),this,((FXEvent*)ptr)->code,((FXEvent*)ptr)->state)); if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(pane && pane->shown() && pane->handle(pane,sel,ptr)) return 1; } return 0; } // Keyboard release; forward to menu pane long FXMenuTitle::onKeyRelease(FXObject*,FXSelector sel,void* ptr){ if(isEnabled()){ FXTRACE((200,"%s::onKeyRelease %p keysym=0x%04x state=%04x\n",getClassName(),this,((FXEvent*)ptr)->code,((FXEvent*)ptr)->state)); if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if(pane && pane->shown() && pane->handle(pane,sel,ptr)) return 1; } return 0; } // Hot key combination pressed long FXMenuTitle::onHotKeyPress(FXObject*,FXSelector,void* ptr){ FXTRACE((200,"%s::onHotKeyPress %p\n",getClassName(),this)); handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); return 1; } // Hot key combination released long FXMenuTitle::onHotKeyRelease(FXObject*,FXSelector,void*){ FXTRACE((200,"%s::onHotKeyRelease %p\n",getClassName(),this)); if(isEnabled()){ if(flags&FLAG_ACTIVE){ handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); } } return 1; } // Post the menu long FXMenuTitle::onCmdPost(FXObject*,FXSelector,void*){ FXint x,y,side; if(pane && !pane->shown()){ translateCoordinatesTo(x,y,getRoot(),0,0); side=getParent()->getLayoutHints(); if(side&LAYOUT_SIDE_LEFT){ // Vertical y-=1; if(side&LAYOUT_SIDE_BOTTOM){ // On right x-=pane->getDefaultWidth(); } else{ // On left x+=width; } } else{ // Horizontal x-=1; if(side&LAYOUT_SIDE_BOTTOM){ // On bottom y-=pane->getDefaultHeight(); } else{ // On top y+=height; } } pane->popup(getParent(),x,y); if(!getParent()->grabbed()) getParent()->grab(); } flags&=~FLAG_UPDATE; flags|=FLAG_ACTIVE; update(); return 1; } // Unpost the menu long FXMenuTitle::onCmdUnpost(FXObject*,FXSelector,void*){ if(pane && pane->shown()){ pane->popdown(); if(getParent()->grabbed()) getParent()->ungrab(); } flags|=FLAG_UPDATE; flags&=~FLAG_ACTIVE; update(); return 1; } // Focus moved down long FXMenuTitle::onFocusDown(FXObject*,FXSelector,void*){ if(pane && !pane->shown()){ handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); return 1; } return 0; } // Focus moved up long FXMenuTitle::onFocusUp(FXObject*,FXSelector,void*){ if(pane && pane->shown()){ handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); return 1; } return 0; } // Into focus chain void FXMenuTitle::setFocus(){ FXWindow *menuitem=getParent()->getFocus(); FXbool active=menuitem && menuitem->isActive(); FXMenuCaption::setFocus(); if(active) handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); } // Out of focus chain void FXMenuTitle::killFocus(){ FXMenuCaption::killFocus(); handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); } // Change the popup menu void FXMenuTitle::setMenu(FXPopup *pup){ if(pup!=pane){ pane=pup; recalc(); } } // Handle repaint long FXMenuTitle::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXint xx,yy; dc.setFont(font); xx=6; yy=0; if(isEnabled()){ if(isActive()){ dc.setForeground(selbackColor); dc.fillRectangle(1,1,width-2,height-2); //drawSunkenRectangle(dc,0,0,width,height); dc.setForeground(shadowColor); dc.fillRectangle(0,0,width,1); dc.fillRectangle(0,0,1,height); dc.setForeground(hiliteColor); dc.fillRectangle(0,height-1,width,1); dc.fillRectangle(width-1,0,1,height); xx++; yy++; } else if(underCursor()){ dc.setForeground(backColor); dc.fillRectangle(1,1,width-2,height-2); //drawRaisedRectangle(dc,0,0,width,height); dc.setForeground(shadowColor); dc.fillRectangle(0,height-1,width,1); dc.fillRectangle(width-1,0,1,height); dc.setForeground(hiliteColor); dc.fillRectangle(0,0,width,1); dc.fillRectangle(0,0,1,height); } else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } if(icon){ dc.drawIcon(icon,xx,yy+(height-icon->getHeight())/2); xx+=5+icon->getWidth(); } if(!label.empty()){ yy+=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setForeground(isActive() ? seltextColor : textColor); dc.drawText(xx,yy,label); if(0<=hotoff){ dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } } else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); if(icon){ dc.drawIconSunken(icon,xx,yy+(height-icon->getHeight())/2); xx+=5+icon->getWidth(); } if(!label.empty()){ yy+=font->getFontAscent()+(height-font->getFontHeight())/2; dc.setForeground(hiliteColor); dc.drawText(xx+1,yy+1,label); if(0<=hotoff){ dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } dc.setForeground(shadowColor); dc.drawText(xx,yy,label); if(0<=hotoff){ dc.fillRectangle(xx+font->getTextWidth(&label[0],hotoff),yy+1,font->getTextWidth(&label[hotoff],wclen(&label[hotoff])),1); } } } return 1; } // Test if logically inside bool FXMenuTitle::contains(FXint parentx,FXint parenty) const { FXint x,y; if(FXMenuCaption::contains(parentx,parenty)) return true; if(getMenu() && getMenu()->shown()){ getParent()->translateCoordinatesTo(x,y,getRoot(),parentx,parenty); if(getMenu()->contains(x,y)) return true; } return false; } // Save object to stream void FXMenuTitle::save(FXStream& store) const { FXMenuCaption::save(store); store << pane; } // Load object from stream void FXMenuTitle::load(FXStream& store){ FXMenuCaption::load(store); store >> pane; } // Delete it FXMenuTitle::~FXMenuTitle(){ pane=(FXMenuPane*)-1L; } } fox1.6-1.6.57/src/FXMessageBox.cpp000066400000000000000000000311561326741342000164310ustar00rootroot00000000000000/******************************************************************************** * * * M e s s a g e B o x e s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXMessageBox.cpp,v 1.40 2006/01/22 17:58:36 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXIcon.h" #include "FXGIFIcon.h" #include "FXSeparator.h" #include "FXLabel.h" #include "FXButton.h" #include "FXHorizontalFrame.h" #include "FXVerticalFrame.h" #include "FXMessageBox.h" #include "icons.h" /* Notes: - Want justify modes for the message box so the label can be aligned different ways. - Added MBOX_SAVE_CANCEL_DONTSAVE dialog from Sander. */ // Padding for message box buttons #define HORZ_PAD 30 #define VERT_PAD 2 #define MBOX_BUTTON_MASK (MBOX_OK|MBOX_OK_CANCEL|MBOX_YES_NO|MBOX_YES_NO_CANCEL|MBOX_QUIT_CANCEL|MBOX_QUIT_SAVE_CANCEL|MBOX_SAVE_CANCEL_DONTSAVE) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXMessageBox) FXMessageBoxMap[]={ FXMAPFUNC(SEL_COMMAND,FXMessageBox::ID_CANCEL,FXMessageBox::onCmdCancel), FXMAPFUNCS(SEL_COMMAND,FXMessageBox::ID_CLICKED_YES,FXMessageBox::ID_CLICKED_SKIPALL,FXMessageBox::onCmdClicked), }; // Object implementation FXIMPLEMENT(FXMessageBox,FXDialogBox,FXMessageBoxMap,ARRAYNUMBER(FXMessageBoxMap)) // Construct message box with given caption, icon, and message text FXMessageBox::FXMessageBox(FXWindow* owner,const FXString& caption,const FXString& text,FXIcon* ic,FXuint opts,FXint x,FXint y): FXDialogBox(owner,caption,opts|DECOR_TITLE|DECOR_BORDER,x,y,0,0, 0,0,0,0, 4,4){ initialize(text,ic,opts&MBOX_BUTTON_MASK); } // Construct free floating message box with given caption, icon, and message text FXMessageBox::FXMessageBox(FXApp* a,const FXString& caption,const FXString& text,FXIcon* ic,FXuint opts,FXint x,FXint y): FXDialogBox(a,caption,opts|DECOR_TITLE|DECOR_BORDER,x,y,0,0, 0,0,0,0, 4,4){ initialize(text,ic,opts&MBOX_BUTTON_MASK); } // Build contents void FXMessageBox::initialize(const FXString& text,FXIcon* ic,FXuint whichbuttons){ FXButton *initial; FXVerticalFrame* content=new FXVerticalFrame(this,LAYOUT_FILL_X|LAYOUT_FILL_Y); FXHorizontalFrame* info=new FXHorizontalFrame(content,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,10,10,10,10); new FXLabel(info,FXString::null,ic,ICON_BEFORE_TEXT|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXLabel(info,text,NULL,JUSTIFY_LEFT|ICON_BEFORE_TEXT|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y); new FXHorizontalSeparator(content,SEPARATOR_GROOVE|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X); FXHorizontalFrame* buttons=new FXHorizontalFrame(content,LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0,10,10,5,5); if(whichbuttons==MBOX_OK){ initial=new FXButton(buttons,tr("&OK"),NULL,this,ID_CLICKED_OK,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); initial->setFocus(); } else if(whichbuttons==MBOX_OK_CANCEL){ initial=new FXButton(buttons,tr("&OK"),NULL,this,ID_CLICKED_OK,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXButton(buttons,tr("&Cancel"),NULL,this,ID_CLICKED_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); initial->setFocus(); } else if(whichbuttons==MBOX_YES_NO){ initial=new FXButton(buttons,tr("&Yes"),NULL,this,ID_CLICKED_YES,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXButton(buttons,tr("&No"),NULL,this,ID_CLICKED_NO,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); initial->setFocus(); } else if(whichbuttons==MBOX_YES_NO_CANCEL){ initial=new FXButton(buttons,tr("&Yes"),NULL,this,ID_CLICKED_YES,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXButton(buttons,tr("&No"),NULL,this,ID_CLICKED_NO,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXButton(buttons,tr("&Cancel"),NULL,this,ID_CLICKED_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); initial->setFocus(); } else if(whichbuttons==MBOX_QUIT_CANCEL){ initial=new FXButton(buttons,tr("&Quit"),NULL,this,ID_CLICKED_QUIT,BUTTON_INITIAL|BUTTON_DEFAULT|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXButton(buttons,tr("&Cancel"),NULL,this,ID_CLICKED_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); initial->setFocus(); } else if(whichbuttons==MBOX_QUIT_SAVE_CANCEL){ new FXButton(buttons,tr("&Quit"),NULL,this,ID_CLICKED_QUIT,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); initial=new FXButton(buttons,tr("&Save"),NULL,this,ID_CLICKED_SAVE,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXButton(buttons,tr("&Cancel"),NULL,this,ID_CLICKED_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); initial->setFocus(); } else if(whichbuttons==MBOX_SKIP_SKIPALL_CANCEL){ initial=new FXButton(buttons,tr("&Skip"),NULL,this,ID_CLICKED_SKIP,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXButton(buttons,tr("Skip &All"),NULL,this,ID_CLICKED_SKIPALL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXButton(buttons,tr("&Cancel"),NULL,this,ID_CLICKED_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); initial->setFocus(); } else if (whichbuttons==MBOX_SAVE_CANCEL_DONTSAVE){ buttons->setPackingHints(PACK_NORMAL); new FXButton(buttons,tr("&Don't Save"),NULL,this,ID_CLICKED_NO,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_CENTER_X,0,0,0,0,15,15,VERT_PAD,VERT_PAD); FXHorizontalFrame *buttons3=new FXHorizontalFrame(buttons,LAYOUT_RIGHT|PACK_UNIFORM_WIDTH,0,0,0,0,0,0,0,0); new FXButton(buttons3,tr("&Cancel"),NULL,this,ID_CLICKED_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT,0,0,0,0,15,15,VERT_PAD,VERT_PAD); initial=new FXButton(buttons3,tr("&Save"),NULL,this,ID_CLICKED_SAVE,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_TOP|LAYOUT_LEFT,0,0,0,0,15,15,VERT_PAD,VERT_PAD); initial->setFocus(); } } // Close dialog with a cancel long FXMessageBox::onCmdClicked(FXObject*,FXSelector sel,void*){ getApp()->stopModal(this,MBOX_CLICKED_YES+(FXSELID(sel)-ID_CLICKED_YES)); hide(); return 1; } // Close dialog with a cancel long FXMessageBox::onCmdCancel(FXObject* sender,FXSelector,void* ptr){ return FXMessageBox::onCmdClicked(sender,FXSEL(SEL_COMMAND,ID_CLICKED_CANCEL),ptr); } /*******************************************************************************/ // Show a modal error message FXuint FXMessageBox::error(FXWindow* owner,FXuint opts,const char* caption,const char* message,...){ FXGIFIcon icon(owner->getApp(),erroricon); va_list arguments; va_start(arguments,message); FXMessageBox box(owner,caption,FXStringVFormat(message,arguments),&icon,opts|DECOR_TITLE|DECOR_BORDER); va_end(arguments); return box.execute(PLACEMENT_OWNER); } // Show a modal error message, in free floating window FXuint FXMessageBox::error(FXApp* app,FXuint opts,const char* caption,const char* message,...){ FXGIFIcon icon(app,erroricon); va_list arguments; va_start(arguments,message); FXMessageBox box(app,caption,FXStringVFormat(message,arguments),&icon,opts|DECOR_TITLE|DECOR_BORDER); va_end(arguments); return box.execute(PLACEMENT_SCREEN); } // Show a modal warning message FXuint FXMessageBox::warning(FXWindow* owner,FXuint opts,const char* caption,const char* message,...){ FXGIFIcon icon(owner->getApp(),warningicon); va_list arguments; va_start(arguments,message); FXMessageBox box(owner,caption,FXStringVFormat(message,arguments),&icon,opts|DECOR_TITLE|DECOR_BORDER); va_end(arguments); return box.execute(PLACEMENT_OWNER); } // Show a modal warning message, in free floating window FXuint FXMessageBox::warning(FXApp* app,FXuint opts,const char* caption,const char* message,...){ FXGIFIcon icon(app,warningicon); va_list arguments; va_start(arguments,message); FXMessageBox box(app,caption,FXStringVFormat(message,arguments),&icon,opts|DECOR_TITLE|DECOR_BORDER); va_end(arguments); return box.execute(PLACEMENT_SCREEN); } // Show a modal question dialog FXuint FXMessageBox::question(FXWindow* owner,FXuint opts,const char* caption,const char* message,...){ FXGIFIcon icon(owner->getApp(),questionicon); va_list arguments; va_start(arguments,message); FXMessageBox box(owner,caption,FXStringVFormat(message,arguments),&icon,opts|DECOR_TITLE|DECOR_BORDER); va_end(arguments); return box.execute(PLACEMENT_OWNER); } // Show a modal question dialog, in free floating window FXuint FXMessageBox::question(FXApp* app,FXuint opts,const char* caption,const char* message,...){ FXGIFIcon icon(app,questionicon); va_list arguments; va_start(arguments,message); FXMessageBox box(app,caption,FXStringVFormat(message,arguments),&icon,opts|DECOR_TITLE|DECOR_BORDER); va_end(arguments); return box.execute(PLACEMENT_SCREEN); } // Show a modal information dialog FXuint FXMessageBox::information(FXWindow* owner,FXuint opts,const char* caption,const char* message,...){ FXGIFIcon icon(owner->getApp(),infoicon); va_list arguments; va_start(arguments,message); FXMessageBox box(owner,caption,FXStringVFormat(message,arguments),&icon,opts|DECOR_TITLE|DECOR_BORDER); va_end(arguments); return box.execute(PLACEMENT_OWNER); } // Show a modal information dialog, in free floating window FXuint FXMessageBox::information(FXApp* app,FXuint opts,const char* caption,const char* message,...){ FXGIFIcon icon(app,infoicon); va_list arguments; va_start(arguments,message); FXMessageBox box(app,caption,FXStringVFormat(message,arguments),&icon,opts|DECOR_TITLE|DECOR_BORDER); va_end(arguments); return box.execute(PLACEMENT_SCREEN); } } fox1.6-1.6.57/src/FXObject.cpp000066400000000000000000000207401326741342000155770ustar00rootroot00000000000000/******************************************************************************** * * * T o p l e v el O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXObject.cpp,v 1.42 2006/01/22 17:58:36 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXException.h" /* Notes: - We need a table of all metaclasses, as we should be able to create any type of object during deserialization. - For MacOS/X support, we moved fxmalloc() and co. here; the reason is that when FOX is loaded as a DLL into FXRuby, these symbols need to be resolvable in order for the DLL startup code to run properly for the meta class initializers; afterward everything's OK. */ #define EMPTYSLOT ((FXMetaClass*)-1L) using namespace FX; /*******************************************************************************/ namespace FX { // Allocate memory FXint fxmalloc(void** ptr,unsigned long size){ *ptr=NULL; if(size!=0){ if((*ptr=malloc(size))==NULL) return FALSE; } return TRUE; } // Allocate cleaned memory FXint fxcalloc(void** ptr,unsigned long size){ *ptr=NULL; if(size!=0){ if((*ptr=calloc(size,1))==NULL) return FALSE; } return TRUE; } // Resize memory FXint fxresize(void** ptr,unsigned long size){ register void *p=NULL; if(size!=0){ if((p=realloc(*ptr,size))==NULL) return FALSE; } else{ if(*ptr) free(*ptr); } *ptr=p; return TRUE; } // Allocate and initialize memory FXint fxmemdup(void** ptr,const void* src,unsigned long size){ *ptr=NULL; if(size!=0 && src!=NULL){ if((*ptr=malloc(size))==NULL) return FALSE; memcpy(*ptr,src,size); } return TRUE; } // String duplicate FXchar *fxstrdup(const FXchar* str){ register FXchar *copy; if(str!=NULL && (copy=(FXchar*)malloc(strlen(str)+1))!=NULL){ strcpy(copy,str); return copy; } return NULL; } // Free memory, resets ptr to NULL afterward void fxfree(void** ptr){ if(*ptr){ free(*ptr); *ptr=NULL; } } /************************* FXMetaClass Implementation ************************/ // Hash table of metaclasses const FXMetaClass** FXMetaClass::metaClassTable=NULL; FXuint FXMetaClass::nmetaClassTable=0; FXuint FXMetaClass::nmetaClasses=0; // Hash function for string static inline FXuint hashstring(const FXchar* str){ register const FXuchar *s=(const FXuchar*)str; register FXuint h=0; register FXuint c; while((c=*s++)!='\0'){ h = ((h << 5) + h) ^ c; } return h; } // Constructor adds metaclass to the table FXMetaClass::FXMetaClass(const FXchar* name,FXObject *(fac)(),const FXMetaClass* base,const void* ass,FXuint nass,FXuint assz): className(name),manufacture(fac),baseClass(base),assoc(ass),nassocs(nass),assocsz(assz){ register FXuint p,x,m; // Adding one ++nmetaClasses; // Table is almost full? if(nmetaClassTable < (nmetaClasses<<1)){ resize(nmetaClassTable?nmetaClassTable<<1:1); } // Should always be maintained FXASSERT(nmetaClassTable>=nmetaClasses); // Find hash slot p=hashstring(className); x=(p<<1)|1; m=nmetaClassTable-1; while(1){ p=(p+x)&m; if(metaClassTable[p]==0) break; } // Place in table metaClassTable[p]=this; } // Find the FXMetaClass belonging to class name const FXMetaClass* FXMetaClass::getMetaClassFromName(const FXchar* name){ if(nmetaClassTable){ register FXuint p,x,m; p=hashstring(name); x=(p<<1)|1; m=nmetaClassTable-1; while(1){ p=(p+x)&m; if(metaClassTable[p]==0) break; if(metaClassTable[p]!=EMPTYSLOT && strcmp(metaClassTable[p]->className,name)==0){ return metaClassTable[p]; } } } return NULL; } // Test if subclass bool FXMetaClass::isSubClassOf(const FXMetaClass* metaclass) const { register const FXMetaClass* cls; for(cls=this; cls; cls=cls->baseClass){ if(cls==metaclass) return true; } return false; } // Create an object instance FXObject* FXMetaClass::makeInstance() const { return (*manufacture)(); } // Find function const void* FXMetaClass::search(FXSelector key) const { register const FXObject::FXMapEntry* lst=(const FXObject::FXMapEntry*)assoc; register FXuint n=nassocs; while(n--){ if(lst->keylo<=key && key<=lst->keyhi) return lst; lst=(const FXObject::FXMapEntry*) (((const FXchar*)lst)+assocsz); } return NULL; } // Destructor removes metaclass from the table FXMetaClass::~FXMetaClass(){ register FXuint p,x,m; // Find hash slot p=hashstring(className); x=(p<<1)|1; m=nmetaClassTable-1; while(1){ p=(p+x)&m; if(metaClassTable[p]==this) break; } // Remove from table metaClassTable[p]=EMPTYSLOT; // Table is empty? --nmetaClasses; // Table is almost empty? if(nmetaClassTable >= (nmetaClasses<<1)){ resize(nmetaClassTable>>1); } // Should always be maintained FXASSERT(nmetaClassTable>=nmetaClasses); } // Resize global hash table void FXMetaClass::resize(FXuint n){ const FXMetaClass **newtable,*ptr; register FXuint p,x,i,m; FXCALLOC(&newtable,FXMetaClass*,n); for(i=0; iclassName); x=(p<<1)|1; m=n-1; while(1){ p=(p+x)&m; if(newtable[p]==NULL) break; } newtable[p]=ptr; } } FXFREE(&metaClassTable); metaClassTable=newtable; nmetaClassTable=n; } /*************************** FXObject Implementation *************************/ // Have to do this one `by hand' as it has no base class const FXMetaClass FXObject::metaClass("FXObject",FXObject::manufacture,NULL,NULL,0,0); // Build an object FXObject* FXObject::manufacture(){return new FXObject;} // Get class name of object const FXchar* FXObject::getClassName() const { return getMetaClass()->getClassName(); } // Check if object belongs to a class bool FXObject::isMemberOf(const FXMetaClass* metaclass) const { return getMetaClass()->isSubClassOf(metaclass); } // Try handle message safely; we catch only resource exceptions, things like // running out of memory, window handles, system resources; others are ignored. long FXObject::tryHandle(FXObject* sender,FXSelector sel,void* ptr){ try { return handle(sender,sel,ptr); } catch(const FXResourceException&) { return 0; } } // Save to stream void FXObject::save(FXStream&) const { } // Load from stream void FXObject::load(FXStream&){ } // Unhandled function long FXObject::onDefault(FXObject*,FXSelector,void*){ return 0; } // Handle message long FXObject::handle(FXObject* sender,FXSelector sel,void* ptr){ return onDefault(sender,sel,ptr); } // This really messes the object up; note that it is intentional, // as further references to a destructed object should not happen. FXObject::~FXObject(){*((void**)this)=(void*)-1L;} } fox1.6-1.6.57/src/FXObjectList.cpp000066400000000000000000000242751326741342000164420ustar00rootroot00000000000000/******************************************************************************** * * * O b j e c t L i s t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXObjectList.cpp,v 1.39 2006/02/07 01:17:26 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXStream.h" #include "FXObjectList.h" /* Notes: - FXObjectList now stores only the number of items in the list, and stores it in front of the list. The benefit is that an empty list is now only as big as a pointer; also, initialization is faster. - We need to be a little bit careful accessing the number field, it is located in front of the array; since a pointer may be larger than an int, there may be some unused space in between the first data value and the number field. - When growing the array, newly allocated data are zeroed out. */ // Size rounded up to nearest multiple of ROUNDVAL #define ROUNDVAL 16 // Round up to nearest ROUNDVAL #define ROUNDUP(n) (((n)+ROUNDVAL-1)&-ROUNDVAL) // Empty list #define EMPTY ((FXObject**)(emptylist+1)) using namespace FX; /*******************************************************************************/ namespace FX { // Empty object list static const FXObject* emptylist[2]={0,0}; // Change number of items in list void FXObjectList::no(FXint num){ register FXint old=*((FXint*)(ptr-1)); if(old!=num){ if(0old){memset(ptr+old,0,(num-old)*sizeof(FXObject*));} *((FXint*)(ptr-1))=num; } else if(ptr!=EMPTY){ free(ptr-1); ptr=EMPTY; } } } // Default constructor FXObjectList::FXObjectList():ptr(EMPTY){ } // Copy constructor FXObjectList::FXObjectList(const FXObjectList& orig):ptr(EMPTY){ register FXint num=orig.no(); if(0=num){ ptr[num]=object; } else{ memmove(&ptr[pos+1],&ptr[pos],(num-pos)*sizeof(FXObject*)); ptr[pos]=object; } return *this; } // Insert n objects at specified position FXObjectList& FXObjectList::insert(FXint pos,FXObject** objects,FXint n){ if(0=num){ memcpy(&ptr[num],objects,n*sizeof(FXObject*)); } else{ memmove(&ptr[pos+n],&ptr[pos],(num-pos)*sizeof(FXObject*)); memcpy(&ptr[pos],objects,n*sizeof(FXObject*)); } } return *this; } // Insert objects at specified position FXObjectList& FXObjectList::insert(FXint pos,FXObjectList& objects){ insert(pos,objects.ptr,objects.no()); return *this; } // Prepend an object FXObjectList& FXObjectList::prepend(FXObject* object){ register FXint num=no(); no(num+1); memmove(&ptr[1],ptr,num*sizeof(FXObject*)); ptr[0]=object; return *this; } // Prepend n objects FXObjectList& FXObjectList::prepend(FXObject** objects,FXint n){ if(0=num){ no(num+1); ptr[num]=object; } else{ ptr[pos]=object; } return *this; } // Replaces the m objects at pos with n objects FXObjectList& FXObjectList::replace(FXint pos,FXint m,FXObject** objects,FXint n){ register FXint num=no(); if(pos+m<=0){ if(0num){m=num-pos;} if(mn){ memmove(&ptr[pos+n],&ptr[pos+m],(num-pos-m)*sizeof(FXObject*)); no(num-m+n); } if(00){ if(pos<0){n+=pos;pos=0;} if(pos+n>num){n=num-pos;} memmove(&ptr[pos],&ptr[pos+n],(num-n-pos)*sizeof(FXObject*)); no(num-n); } } return *this; } // Remove element p FXObjectList& FXObjectList::remove(const FXObject* object){ register FXint num=no(); register FXint pos; for(pos=0; pos=num) p=num-1; while(0<=p){ if(ptr[p]==object){ return p; } --p; } return -1; } // Clear the list FXObjectList& FXObjectList::clear(){ no(0); return *this; } // Save to stream; children may be NULL void FXObjectList::save(FXStream& store) const { FXint num=no(); store << num; for(FXint i=0; i> num; no(num); for(FXint i=0; i> ptr[i]; } } // Free up nicely FXObjectList::~FXObjectList(){ no(0); } } fox1.6-1.6.57/src/FXOptionMenu.cpp000066400000000000000000000516551326741342000164770ustar00rootroot00000000000000/******************************************************************************** * * * O p t i o n M e n u * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXOptionMenu.cpp,v 1.68 2006/02/06 02:04:28 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXLabel.h" #include "FXPopup.h" #include "FXButton.h" #include "FXMenuButton.h" #include "FXToolTip.h" #include "FXOptionMenu.h" /* Notes: - Need API to inquire whether an FXOption is selected or not. - Should it grab first before POST? - FXOptionMenu should send the message, SEL_CHANGED when changing, SEL_COMMAND at the end, and SEL_UPDATE during gui update. - FXOptionMenu should understand ID_SETINTVALUE and ID_GETINTVALUE so you may substitute FXOptionMenu for a slider or dial. - Perhaps support arrow keys to select by means of keyboard. - Right-click to cycle through options (as suggested by Stephane Ancelot ) would be nice. - Hotkey's don't work in FXOption. - Zecchini Mauro donated code to add FXDataTarget get/set connectivity here also. - Do we need API's other than those based on current item as an index? */ #define MENUGLYPH_WIDTH 10 #define MENUGLYPH_HEIGHT 5 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXOption) FXOptionMap[]={ FXMAPFUNC(SEL_PAINT,0,FXOption::onPaint), FXMAPFUNC(SEL_ENTER,0,FXOption::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXOption::onLeave), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXOption::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXOption::onLeftBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXOption::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXOption::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXWindow::ID_HOTKEY,FXOption::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXWindow::ID_HOTKEY,FXOption::onHotKeyRelease), }; // Object implementation FXIMPLEMENT(FXOption,FXLabel,FXOptionMap,ARRAYNUMBER(FXOptionMap)) // For serialization FXOption::FXOption(){ seltextColor=0; selbackColor=0; } // Make option menu entry FXOption::FXOption(FXComposite* p,const FXString& text,FXIcon* ic,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXLabel(p,text,ic,opts,x,y,w,h,pl,pr,pt,pb){ target=tgt; message=sel; seltextColor=getApp()->getSelMenuTextColor(); selbackColor=getApp()->getSelMenuBackColor(); defaultCursor=getApp()->getDefaultCursor(DEF_RARROW_CURSOR); } // If window can have focus bool FXOption::canFocus() const { return true; } // Get default width FXint FXOption::getDefaultWidth(){ FXint tw=0,iw=MENUGLYPH_WIDTH,s=0,w; if(!label.empty()){ tw=labelWidth(label); } if(icon){ iw=icon->getWidth(); } if(iw && tw) s=4; if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w=FXMAX(tw,iw); else w=tw+iw+s; return padleft+padright+(border<<1)+w; } // Get default height FXint FXOption::getDefaultHeight(){ FXint th=0,ih=MENUGLYPH_HEIGHT,h; if(!label.empty()){ th=labelHeight(label); } if(icon){ ih=icon->getHeight(); } if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h=FXMAX(th,ih); else h=th+ih; return padtop+padbottom+(border<<1)+h; } // Handle repaint long FXOption::onPaint(FXObject*,FXSelector,void* ptr){ FXint tw=0,th=0,iw=MENUGLYPH_WIDTH,ih=MENUGLYPH_HEIGHT,tx,ty,ix,iy; FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); if(!label.empty()){ tw=labelWidth(label); th=labelHeight(label); } if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); } just_x(tx,ix,tw,iw); just_y(ty,iy,th,ih); dc.setForeground(isActive() ? selbackColor : backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(icon){ dc.drawIcon(icon,ix,iy); } else if(isActive()){ drawDoubleRaisedRectangle(dc,ix,iy,MENUGLYPH_WIDTH,MENUGLYPH_HEIGHT); } if(!label.empty()){ dc.setFont(font); if(isEnabled()){ dc.setForeground(isActive() ? seltextColor : textColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } else{ dc.setForeground(hiliteColor); drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } } drawFrame(dc,0,0,width,height); return 1; } // Enter long FXOption::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onEnter(sender,sel,ptr); if(isEnabled() && canFocus()) setFocus(); return 1; } // Leave long FXOption::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onLeave(sender,sel,ptr); if(isEnabled() && canFocus()) killFocus(); return 1; } // Pressed left button; always unposts menu long FXOption::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),this); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); return 1; } return 0; } // Released left button; unpost menu if cursor has moved long FXOption::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(((FXEvent*)ptr)->moved){ getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),this); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); } return 1; } return 0; } // Keyboard press; forward to menu pane long FXOption::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ return 1; } } return 0; } // Keyboard release; forward to menu pane long FXOption::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),this); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); return 1; } } return 0; } // Hot key combination pressed long FXOption::onHotKeyPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); FXTRACE((100,"FXOption::onHotKeyPress\n")); return 1; } // Hot key combination released long FXOption::onHotKeyRelease(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; FXTRACE((100,"FXOption::onHotKeyRelease\n")); if(isEnabled()){ getParent()->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),this); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); } return 1; } // Into focus chain void FXOption::setFocus(){ FXLabel::setFocus(); flags|=FLAG_ACTIVE; flags&=~FLAG_UPDATE; update(); } // Out of focus chain void FXOption::killFocus(){ FXLabel::killFocus(); flags&=~FLAG_ACTIVE; flags|=FLAG_UPDATE; update(); } // Set select background color void FXOption::setSelBackColor(FXColor clr){ if(clr!=selbackColor){ selbackColor=clr; update(); } } // Set selected text color void FXOption::setSelTextColor(FXColor clr){ if(clr!=seltextColor){ seltextColor=clr; update(); } } // Delete FXOption::~FXOption(){ } /*******************************************************************************/ // Map FXDEFMAP(FXOptionMenu) FXOptionMenuMap[]={ FXMAPFUNC(SEL_PAINT,0,FXOptionMenu::onPaint), FXMAPFUNC(SEL_MOUSEWHEEL,0,FXOptionMenu::onMouseWheel), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXOptionMenu::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXOptionMenu::onLeftBtnRelease), FXMAPFUNC(SEL_FOCUSIN,0,FXOptionMenu::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXOptionMenu::onFocusOut), FXMAPFUNC(SEL_MOTION,0,FXOptionMenu::onMotion), FXMAPFUNC(SEL_KEYPRESS,0,FXOptionMenu::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXOptionMenu::onKeyRelease), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_POST,FXOptionMenu::onCmdPost), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNPOST,FXOptionMenu::onCmdUnpost), FXMAPFUNC(SEL_QUERY_TIP,0,FXOptionMenu::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXOptionMenu::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXOptionMenu::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETINTVALUE,FXOptionMenu::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETINTVALUE,FXOptionMenu::onCmdGetIntValue), }; // Object implementation FXIMPLEMENT(FXOptionMenu,FXLabel,FXOptionMenuMap,ARRAYNUMBER(FXOptionMenuMap)) // Make a option menu button FXOptionMenu::FXOptionMenu(FXComposite* p,FXPopup* pup,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXLabel(p,FXString::null,NULL,opts,x,y,w,h,pl,pr,pt,pb){ dragCursor=getApp()->getDefaultCursor(DEF_RARROW_CURSOR); pane=pup; current=NULL; if(pane){ current=dynamic_cast(pane->getFirst()); if(current){ label=current->getText(); icon=current->getIcon(); } } } // Create window void FXOptionMenu::create(){ FXLabel::create(); if(pane) pane->create(); } // Detach window void FXOptionMenu::detach(){ FXLabel::detach(); if(pane) pane->detach(); } // Destroy window void FXOptionMenu::destroy(){ FXLabel::destroy(); } // Get default width FXint FXOptionMenu::getDefaultWidth(){ FXint w=0; if(pane){ w=pane->getDefaultWidth(); } return (border<<1)+w; } // Get default height FXint FXOptionMenu::getDefaultHeight(){ FXint h=0; if(pane && pane->getFirst()){ h=pane->getFirst()->getDefaultHeight(); } return (border<<1)+h; } // Gained focus long FXOptionMenu::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusIn(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Lost focus long FXOptionMenu::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusOut(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Handle repaint long FXOptionMenu::onPaint(FXObject*,FXSelector,void* ptr){ FXint tw=0,th=0,iw=MENUGLYPH_WIDTH,ih=MENUGLYPH_HEIGHT,tx,ty,ix,iy; FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); drawFrame(dc,0,0,width,height); // Draw background dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); // Position text & icon if(!label.empty()){ tw=labelWidth(label); th=labelHeight(label); } if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); } just_x(tx,ix,tw,iw); just_y(ty,iy,th,ih); // Draw enabled state if(isEnabled()){ if(icon){ dc.drawIcon(icon,ix,iy); } else{ drawDoubleRaisedRectangle(dc,ix,iy,MENUGLYPH_WIDTH,MENUGLYPH_HEIGHT); } if(!label.empty()){ dc.setFont(font); dc.setForeground(textColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } if(hasFocus()){ dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2); } } // Draw grayed-out state else{ if(icon){ dc.drawIconSunken(icon,ix,iy); } else{ drawDoubleRaisedRectangle(dc,ix,iy,MENUGLYPH_WIDTH,MENUGLYPH_HEIGHT); } if(!label.empty()){ dc.setFont(font); dc.setForeground(hiliteColor); drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } } return 1; } // Keyboard press; forward to menu pane long FXOptionMenu::onKeyPress(FXObject*,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(pane && pane->shown() && pane->handle(pane,sel,ptr)) return 1; switch(event->code){ case KEY_space: case KEY_KP_Space: return 1; } } return 0; } // Keyboard release; forward to menu pane long FXOptionMenu::onKeyRelease(FXObject*,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if(pane && pane->shown() && pane->handle(pane,sel,ptr)) return 1; switch(event->code){ case KEY_space: case KEY_KP_Space: if(pane){ if(pane->shown()){ handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); } } return 1; } } return 0; } // Pressed left button long FXOptionMenu::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; if(pane){ if(pane->shown()){ handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); } } return 1; } return 0; } // Released left button long FXOptionMenu::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(ev->moved && pane){ handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); } return 1; } return 0; } // If we moved over the pane, we'll ungrab again, or re-grab // when outside of the plane long FXOptionMenu::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; if(pane && pane->shown()){ if(pane->contains(ev->root_x,ev->root_y)){ if(grabbed()) ungrab(); } else{ if(!grabbed()) grab(); } return 1; } return 0; } // Use wheel to change option; suggested by Jon Sargeant long FXOptionMenu::onMouseWheel(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; if(isEnabled()){ if(ev->code>0) setCurrentNo((getCurrentNo()-1+getNumOptions())%getNumOptions(),TRUE); else setCurrentNo((getCurrentNo()+1)%getNumOptions(),TRUE); return 1; } return 0; } // Post the menu long FXOptionMenu::onCmdPost(FXObject*,FXSelector,void*){ if(pane && !pane->shown()){ FXint x,y; if(!current) current=dynamic_cast(pane->getFirst()); if(!current) return 1; translateCoordinatesTo(x,y,getRoot(),0,0); pane->position(x,y,width,pane->getDefaultHeight()); y+=2-current->getY(); pane->popup(this,x,y,width,pane->getDefaultHeight()); current->setFocus(); if(!grabbed()) grab(); flags&=~FLAG_UPDATE; } return 1; } // Unpost the menu // Sender was the original option that sent the message long FXOptionMenu::onCmdUnpost(FXObject*,FXSelector,void* ptr){ if(pane && pane->shown()){ pane->popdown(); if(grabbed()) ungrab(); flags|=FLAG_UPDATE; if(ptr){ setCurrent((FXOption*)ptr,TRUE); } } return 1; } // Update value from a message long FXOptionMenu::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCurrentNo((FXint)(FXival)ptr); return 1; } // Update value from a message long FXOptionMenu::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setCurrentNo(*((FXint*)ptr)); return 1; } // Obtain value from text field long FXOptionMenu::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getCurrentNo(); return 1; } // Layout void FXOptionMenu::layout(){ FXLabel::layout(); if(!current && pane && pane->getFirst()){ setCurrent(dynamic_cast(pane->getFirst())); } flags&=~FLAG_DIRTY; } // Logically inside pane bool FXOptionMenu::contains(FXint parentx,FXint parenty) const { if(pane && pane->shown() && pane->contains(parentx,parenty)) return true; return false; } // Out of focus chain void FXOptionMenu::killFocus(){ FXLabel::killFocus(); handle(current,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); } // If window can have focus bool FXOptionMenu::canFocus() const { return true; } // Set current selection void FXOptionMenu::setCurrent(FXOption *win,FXbool notify){ if(current!=win){ current=win; if(win){ setText(current->getText()); setIcon(current->getIcon()); setTextColor(current->getTextColor()); } else{ setText(FXString::null); setIcon(NULL); } if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)getCurrentNo());} } } // Set current option void FXOptionMenu::setCurrentNo(FXint no,FXbool notify){ register FXOption *win=NULL; if(pane) win=dynamic_cast(pane->childAtIndex(no)); setCurrent(win,notify); } // Get current option FXint FXOptionMenu::getCurrentNo() const { return pane ? pane->indexOfChild(current) : -1; } // Get the number of options in this menu FXint FXOptionMenu::getNumOptions() const { return pane ? pane->numChildren() : 0; } // Change popup void FXOptionMenu::setMenu(FXPopup *pup){ register FXOption *win; if(pup!=pane){ pane=pup; if(pane){ win=dynamic_cast(pane->getFirst()); if(win){ setText(win->getText()); setIcon(win->getIcon()); setTextColor(win->getTextColor()); } current=win; } recalc(); } } // The current option's tip is returned, unless there is no tip, // in which case the option menu's tip is returned long FXOptionMenu::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if(flags&FLAG_TIP){ if(current){ FXString optiontip=current->getTipText(); if(!optiontip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&optiontip); return 1; } } if(!tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } } return 0; } // The current option's help is returned, unless there is no help, // in which case the option menu's help is returned long FXOptionMenu::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if(flags&FLAG_HELP){ if(current){ FXString optionhelp=current->getHelpText(); if(!optionhelp.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&optionhelp); return 1; } } if(!help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } } return 0; } // True if popped up FXbool FXOptionMenu::isPopped() const { return pane && pane->shown(); } // Save object to stream void FXOptionMenu::save(FXStream& store) const { FXLabel::save(store); store << pane; store << current; } // Load object from stream void FXOptionMenu::load(FXStream& store){ FXLabel::load(store); store >> pane; store >> current; } // Delete it FXOptionMenu::~FXOptionMenu(){ pane=(FXPopup*)-1L; current=(FXOption*)-1L; } } fox1.6-1.6.57/src/FXPCXIcon.cpp000066400000000000000000000067571326741342000156500ustar00rootroot00000000000000/******************************************************************************** * * * P C X I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Janusz Ganczarski. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPCXIcon.cpp,v 1.27 2006/01/22 17:58:36 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXIcon.h" #include "FXPCXIcon.h" /* Notes: - PCX does not support alpha in the file format. - You can also let the system guess a transparancy color based on the corners. - If that doesn't work, you can force a specific transparency color. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXPCXIcon::fileExt[]="pcx"; // Suggested mime type const FXchar FXPCXIcon::mimeType[]="image/x-pcx"; // Object implementation FXIMPLEMENT(FXPCXIcon,FXIcon,NULL,0) // Initialize nicely FXPCXIcon::FXPCXIcon(FXApp* a,const void *pix,FXColor clr,FXuint opts,FXint w,FXint h):FXIcon(a,NULL,clr,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save object to stream bool FXPCXIcon::savePixels(FXStream& store) const { if(fxsavePCX(store,data,width,height)){ return true; } return false; } // Load object from stream bool FXPCXIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadPCX(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXPCXIcon::~FXPCXIcon(){ } } fox1.6-1.6.57/src/FXPCXImage.cpp000066400000000000000000000064101326741342000157640ustar00rootroot00000000000000/******************************************************************************** * * * P C X I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Janusz Ganczarski. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPCXImage.cpp,v 1.26 2006/01/22 17:58:36 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXPCXImage.h" /* Notes: - Use corner color as transparency color, unless override. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXPCXImage::fileExt[]="pcx"; // Suggested mime type const FXchar FXPCXImage::mimeType[]="image/x-pcx"; // Object implementation FXIMPLEMENT(FXPCXImage,FXImage,NULL,0) // Initialize FXPCXImage::FXPCXImage(FXApp* a,const void *pix,FXuint opts,FXint w,FXint h):FXImage(a,NULL,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save pixel data only bool FXPCXImage::savePixels(FXStream& store) const { if(fxsavePCX(store,data,width,height)){ return true; } return false; } // Load pixel data only bool FXPCXImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadPCX(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXPCXImage::~FXPCXImage(){ } } fox1.6-1.6.57/src/FXPNGIcon.cpp000066400000000000000000000065151326741342000156320ustar00rootroot00000000000000/******************************************************************************** * * * P N G I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPNGIcon.cpp,v 1.37 2006/01/22 17:58:36 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXPNGIcon.h" /* Notes: - FXPNGIcon has an alpha channel */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXPNGIcon::fileExt[]="png"; // Suggested mime type const FXchar FXPNGIcon::mimeType[]="image/png"; // Object implementation FXIMPLEMENT(FXPNGIcon,FXIcon,NULL,0) #ifdef HAVE_PNG_H const bool FXPNGIcon::supported=true; #else const bool FXPNGIcon::supported=false; #endif // Initialize FXPNGIcon::FXPNGIcon(FXApp* a,const void *pix,FXColor clr,FXuint opts,FXint w,FXint h):FXIcon(a,NULL,clr,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save pixels only bool FXPNGIcon::savePixels(FXStream& store) const { if(fxsavePNG(store,data,width,height)){ return true; } return false; } // Load pixels only bool FXPNGIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadPNG(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXPNGIcon::~FXPNGIcon(){ } } fox1.6-1.6.57/src/FXPNGImage.cpp000066400000000000000000000064331326741342000157630ustar00rootroot00000000000000/******************************************************************************** * * * P N G I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPNGImage.cpp,v 1.38 2006/01/22 17:58:37 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXPNGImage.h" /* Notes: - FXPNGImage has an alpha channel. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXPNGImage::fileExt[]="png"; // Suggested mime type const FXchar FXPNGImage::mimeType[]="image/png"; // Object implementation FXIMPLEMENT(FXPNGImage,FXImage,NULL,0) #ifdef HAVE_PNG_H const bool FXPNGImage::supported=true; #else const bool FXPNGImage::supported=false; #endif // Initialize FXPNGImage::FXPNGImage(FXApp* a,const void *pix,FXuint opts,FXint w,FXint h):FXImage(a,NULL,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save the pixels only bool FXPNGImage::savePixels(FXStream& store) const { if(fxsavePNG(store,data,width,height)){ return true; } return false; } // Load pixels only bool FXPNGImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadPNG(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXPNGImage::~FXPNGImage(){ } } fox1.6-1.6.57/src/FXPPMIcon.cpp000066400000000000000000000066211326741342000156400ustar00rootroot00000000000000/******************************************************************************** * * * P P M I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPPMIcon.cpp,v 1.14 2006/01/22 17:58:37 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObject.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXIcon.h" #include "FXPPMIcon.h" /* Notes: - PPM does not support alpha in the file format. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXPPMIcon::fileExt[]="ppm"; // Suggested mime type const FXchar FXPPMIcon::mimeType[]="image/x-portable-pixmap"; // Object implementation FXIMPLEMENT(FXPPMIcon,FXIcon,NULL,0) // Initialize nicely FXPPMIcon::FXPPMIcon(FXApp* a,const void *pix,FXColor clr,FXuint opts,FXint w,FXint h):FXIcon(a,NULL,clr,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save object to stream bool FXPPMIcon::savePixels(FXStream& store) const { if(fxsavePPM(store,data,width,height)){ return true; } return false; } // Load object from stream bool FXPPMIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadPPM(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXPPMIcon::~FXPPMIcon(){ } } fox1.6-1.6.57/src/FXPPMImage.cpp000066400000000000000000000064421326741342000157730ustar00rootroot00000000000000/******************************************************************************** * * * P P M I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPPMImage.cpp,v 1.14 2006/01/22 17:58:37 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXPPMImage.h" /* Notes: - PPM does not support alpha in the file format. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXPPMImage::fileExt[]="ppm"; // Suggested mime type const FXchar FXPPMImage::mimeType[]="image/x-portable-pixmap"; // Object implementation FXIMPLEMENT(FXPPMImage,FXImage,NULL,0) // Initialize FXPPMImage::FXPPMImage(FXApp* a,const void *pix,FXuint opts,FXint w,FXint h):FXImage(a,NULL,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save pixel data only bool FXPPMImage::savePixels(FXStream& store) const { if(fxsavePPM(store,data,width,height)){ return true; } return false; } // Load pixel data only bool FXPPMImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadPPM(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXPPMImage::~FXPPMImage(){ } } fox1.6-1.6.57/src/FXPacker.cpp000066400000000000000000000436561326741342000156110ustar00rootroot00000000000000/******************************************************************************** * * * P a c k e r C o n t a i n e r O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPacker.cpp,v 1.46 2006/01/22 17:58:37 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXPacker.h" /* To do: - Now observes LAYOUT_FIX_X and LAYOUT_FIX_Y hints. - LAYOUT_FIX_WIDTH and LAYOUT_FIX_HEIGHT take precedence over PACK_UNIFORM_WIDTH and PACK_UNIFORM_HEIGHT! - Tabbing order takes widget layout into account */ // Side layout modes #define LAYOUT_SIDE_MASK (LAYOUT_SIDE_LEFT|LAYOUT_SIDE_RIGHT|LAYOUT_SIDE_TOP|LAYOUT_SIDE_BOTTOM) // Layout modes #define LAYOUT_MASK (LAYOUT_SIDE_MASK|LAYOUT_RIGHT|LAYOUT_CENTER_X|LAYOUT_BOTTOM|LAYOUT_CENTER_Y|LAYOUT_FIX_X|LAYOUT_FIX_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y) // Frame styles #define FRAME_MASK (FRAME_SUNKEN|FRAME_RAISED|FRAME_THICK) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXPacker) FXPackerMap[]={ FXMAPFUNC(SEL_PAINT,0,FXPacker::onPaint), FXMAPFUNC(SEL_FOCUS_UP,0,FXPacker::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXPacker::onFocusDown), FXMAPFUNC(SEL_FOCUS_LEFT,0,FXPacker::onFocusLeft), FXMAPFUNC(SEL_FOCUS_RIGHT,0,FXPacker::onFocusRight), }; // Object implementation FXIMPLEMENT(FXPacker,FXComposite,FXPackerMap,ARRAYNUMBER(FXPackerMap)) // Deserialization FXPacker::FXPacker(){ flags|=FLAG_SHOWN; } // Create child frame window FXPacker::FXPacker(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXComposite(p,opts,x,y,w,h){ flags|=FLAG_SHOWN; baseColor=getApp()->getBaseColor(); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); borderColor=getApp()->getBorderColor(); padtop=pt; padbottom=pb; padleft=pl; padright=pr; hspacing=hs; vspacing=vs; border=(options&FRAME_THICK)?2:(options&(FRAME_SUNKEN|FRAME_RAISED))?1:0; } void FXPacker::drawBorderRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(borderColor); dc.drawRectangle(x,y,w-1,h-1); } void FXPacker::drawRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ if(0rect.x,ev->rect.y,ev->rect.w,ev->rect.h); drawFrame(dc,0,0,width,height); return 1; } // Change frame border style void FXPacker::setFrameStyle(FXuint style){ options=(options&~FRAME_MASK) | (style&FRAME_MASK); border=(options&FRAME_THICK) ? 2 : (options&(FRAME_SUNKEN|FRAME_RAISED)) ? 1 : 0; recalc(); update(); } // Get frame style FXuint FXPacker::getFrameStyle() const { return (options&FRAME_MASK); } // Change packing hints void FXPacker::setPackingHints(FXuint ph){ FXuint opts=(options&~(PACK_UNIFORM_HEIGHT|PACK_UNIFORM_WIDTH)) | (ph&(PACK_UNIFORM_HEIGHT|PACK_UNIFORM_WIDTH)); if(opts!=options){ options=opts; recalc(); update(); } } // Get packing hints FXuint FXPacker::getPackingHints() const { return (options&(PACK_UNIFORM_HEIGHT|PACK_UNIFORM_WIDTH)); } // Set base color void FXPacker::setBaseColor(FXColor clr){ if(baseColor!=clr){ baseColor=clr; update(); } } // Set highlight color void FXPacker::setHiliteColor(FXColor clr){ if(hiliteColor!=clr){ hiliteColor=clr; update(); } } // Set shadow color void FXPacker::setShadowColor(FXColor clr){ if(shadowColor!=clr){ shadowColor=clr; update(); } } // Set border color void FXPacker::setBorderColor(FXColor clr){ if(borderColor!=clr){ borderColor=clr; update(); } } // Change top padding void FXPacker::setPadTop(FXint pt){ if(padtop!=pt){ padtop=pt; recalc(); update(); } } // Change bottom padding void FXPacker::setPadBottom(FXint pb){ if(padbottom!=pb){ padbottom=pb; recalc(); update(); } } // Change left padding void FXPacker::setPadLeft(FXint pl){ if(padleft!=pl){ padleft=pl; recalc(); update(); } } // Change right padding void FXPacker::setPadRight(FXint pr){ if(padright!=pr){ padright=pr; recalc(); update(); } } // Change horizontal spacing void FXPacker::setHSpacing(FXint hs){ if(hspacing!=hs){ hspacing=hs; recalc(); update(); } } // Change vertical spacing void FXPacker::setVSpacing(FXint vs){ if(vspacing!=vs){ vspacing=vs; recalc(); update(); } } // Focus moved up long FXPacker::onFocusUp(FXObject*,FXSelector,void* ptr){ FXWindow *child,*c; FXint cury,childy; if(getFocus()){ cury=getFocus()->getY(); while(1){ child=NULL; childy=-10000000; for(c=getFirst(); c; c=c->getNext()){ if(c->shown() && c->getY()getY()){ childy=c->getY(); child=c; } } if(!child) return 0; if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_UP,0),ptr)) return 1; cury=childy; } } else{ child=getLast(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_UP,0),ptr)) return 1; } child=child->getPrev(); } } return 0; } // Focus moved down long FXPacker::onFocusDown(FXObject*,FXSelector,void* ptr){ FXWindow *child,*c; FXint cury,childy; if(getFocus()){ cury=getFocus()->getY(); while(1){ child=NULL; childy=10000000; for(c=getFirst(); c; c=c->getNext()){ if(c->shown() && curygetY() && c->getY()getY(); child=c; } } if(!child) return 0; if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_DOWN,0),ptr)) return 1; cury=childy; } } else{ child=getFirst(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_DOWN,0),ptr)) return 1; } child=child->getNext(); } } return 0; } // Focus moved to left long FXPacker::onFocusLeft(FXObject*,FXSelector,void* ptr){ FXWindow *child,*c; FXint curx,childx; if(getFocus()){ curx=getFocus()->getX(); while(1){ child=NULL; childx=-10000000; for(c=getFirst(); c; c=c->getNext()){ if(c->shown() && c->getX()getX()){ childx=c->getX(); child=c; } } if(!child) return 0; if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_LEFT,0),ptr)) return 1; curx=childx; } } else{ child=getLast(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_LEFT,0),ptr)) return 1; } child=child->getPrev(); } } return 0; } // Focus moved to right long FXPacker::onFocusRight(FXObject*,FXSelector,void* ptr){ FXWindow *child,*c; FXint curx,childx; if(getFocus()){ curx=getFocus()->getX(); while(1){ child=NULL; childx=10000000; for(c=getFirst(); c; c=c->getNext()){ if(c->shown() && curxgetX() && c->getX()getX(); child=c; } } if(!child) return 0; if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_RIGHT,0),ptr)) return 1; curx=childx; } } else{ child=getFirst(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_RIGHT,0),ptr)) return 1; } child=child->getNext(); } } return 0; } // Compute minimum width based on child layout hints FXint FXPacker::getDefaultWidth(){ register FXint w,wcum,wmax,mw; register FXWindow* child; register FXuint hints; wmax=wcum=mw=0; if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth(); for(child=getLast(); child; child=child->getPrev()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if((hints&LAYOUT_RIGHT)&&(hints&LAYOUT_CENTER_X)){ // Fixed X w=child->getX()+w; if(w>wmax) wmax=w; } else if(hints&LAYOUT_SIDE_LEFT){ // Left or right if(child->getNext()) wcum+=hspacing; wcum+=w; } else{ if(w>wcum) wcum=w; } } } wcum+=padleft+padright+(border<<1); return FXMAX(wcum,wmax); } // Compute minimum height based on child layout hints FXint FXPacker::getDefaultHeight(){ register FXint h,hcum,hmax,mh; register FXWindow* child; register FXuint hints; hmax=hcum=mh=0; if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight(); for(child=getLast(); child; child=child->getPrev()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if((hints&LAYOUT_BOTTOM)&&(hints&LAYOUT_CENTER_Y)){ // Fixed Y h=child->getY()+h; if(h>hmax) hmax=h; } else if(!(hints&LAYOUT_SIDE_LEFT)){ // Top or bottom if(child->getNext()) hcum+=vspacing; hcum+=h; } else{ if(h>hcum) hcum=h; } } } hcum+=padtop+padbottom+(border<<1); return FXMAX(hcum,hmax); } // Recalculate layout void FXPacker::layout(){ register FXint left,right,top,bottom,x,y,w,h; register FXint mw=0,mh=0; register FXWindow* child; register FXuint hints; // Placement rectangle; right/bottom non-inclusive left=border+padleft; right=width-border-padright; top=border+padtop; bottom=height-border-padbottom; // Get maximum child size if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth(); if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight(); // Pack them in the cavity for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); x=child->getX(); y=child->getY(); // Height if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else if(hints&LAYOUT_FILL_Y) h=bottom-top; else h=child->getDefaultHeight(); // Width if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else if(hints&LAYOUT_FILL_X) w=right-left; else w=child->getDefaultWidth(); // Vertical if(hints&LAYOUT_SIDE_LEFT){ // Y if(!((hints&LAYOUT_BOTTOM)&&(hints&LAYOUT_CENTER_Y))){ if(hints&LAYOUT_CENTER_Y) y=top+(bottom-top-h)/2; else if(hints&LAYOUT_BOTTOM) y=bottom-h; else y=top; } // X if(!((hints&LAYOUT_RIGHT)&&(hints&LAYOUT_CENTER_X))){ if(hints&LAYOUT_CENTER_X) x=left+(right-left-w)/2; else if(hints&LAYOUT_SIDE_BOTTOM){ x=right-w; right-=(w+hspacing); } else{ x=left; left+=(w+hspacing); } } } // Horizontal else{ // X if(!((hints&LAYOUT_RIGHT)&&(hints&LAYOUT_CENTER_X))){ if(hints&LAYOUT_CENTER_X) x=left+(right-left-w)/2; else if(hints&LAYOUT_RIGHT) x=right-w; else x=left; } // Y if(!((hints&LAYOUT_BOTTOM)&&(hints&LAYOUT_CENTER_Y))){ if(hints&LAYOUT_CENTER_Y) y=top+(bottom-top-h)/2; else if(hints&LAYOUT_SIDE_BOTTOM){ y=bottom-h; bottom-=(h+vspacing); } else{ y=top; top+=(h+vspacing); } } } child->position(x,y,w,h); } } flags&=~FLAG_DIRTY; } // Save object to stream void FXPacker::save(FXStream& store) const { FXComposite::save(store); store << baseColor; store << hiliteColor; store << shadowColor; store << borderColor; store << padtop << padbottom << padleft << padright; store << hspacing << vspacing; store << border; } // Load object from stream void FXPacker::load(FXStream& store){ FXComposite::load(store); store >> baseColor; store >> hiliteColor; store >> shadowColor; store >> borderColor; store >> padtop >> padbottom >> padleft >> padright; store >> hspacing >> vspacing; store >> border; } } fox1.6-1.6.57/src/FXPath.cpp000066400000000000000000000656741326741342000153040ustar00rootroot00000000000000/******************************************************************************** * * * P a t h N a m e M a n i p u l a t i o n * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPath.cpp,v 1.20.2.5 2008/03/10 22:06:33 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXPath.h" #include "FXSystem.h" #include "FXStat.h" #include "FXFile.h" #include "FXDir.h" #ifdef WIN32 #include #endif /* Notes: - These functions manipulate pathnames. - Windows 95 and NT: - 1 to 255 character name. - Complete path for a file or project name cannot exceed 259 characters, including the separators. - May not begin or end with a space. - May not begin with a $ - May contain 1 or more file extensions (eg. MyFile.Ext1.Ext2.Ext3.Txt). - Legal characters in the range of 32 - 255 but not ?"/\<>*|: - Filenames may be mixed case. - Filename comparisons are case insensitive (eg. ThIs.TXT = this.txt). - MS-DOS and Windows 3.1: - 1 to 11 characters in the 8.3 naming convention. - Legal characters are A-Z, 0-9, Double Byte Character Set (DBCS) characters (128 - 255), and _^$~!#%&-{}@'() - May not contain spaces, 0 - 31, and "/\[]:;|=, - Must not begin with $ - Uppercase only filename. - Perhaps use GetEnvironmentVariable instead of getenv? - Perhaps also taking into account certain environment variables in the contraction function? - Deal with Windows paths "\\?\" long pathname convention. */ using namespace FX; /*******************************************************************************/ namespace FX { // Return root of given path; this is just "/" or "" if not absolute FXString FXPath::root(const FXString& file){ #ifndef WIN32 if(ISPATHSEP(file[0])){ return PATHSEPSTRING; } #else if(ISPATHSEP(file[0])){ if(ISPATHSEP(file[1])) return PATHSEPSTRING PATHSEPSTRING; // UNC return FXSystem::getCurrentDrive()+PATHSEPSTRING; } if(Ascii::isLetter(file[0]) && file[1]==':'){ if(ISPATHSEP(file[2])) return file.left(3); return file.left(2)+PATHSEPSTRING; } #endif return FXString::null; } // Return directory part of pathname, assuming full pathname. // Note that directory("/bla/bla/") is "/bla/bla" and NOT "/bla". // However, directory("/bla/bla") is "/bla" as we expect! FXString FXPath::directory(const FXString& file){ if(!file.empty()){ FXString result=file; FXint p=0,q=0,s; #ifdef WIN32 if(ISPATHSEP(result[q])){ // UNC result[p++]=PATHSEP; q++; if(ISPATHSEP(result[q])){ result[p++]=PATHSEP; while(ISPATHSEP(result[q])) q++; } } else if(Ascii::isLetter(result[q]) && result[q+1]==':'){ result[p++]=result[q++]; result[p++]=':'; q++; if(ISPATHSEP(result[q])){ result[p++]=PATHSEP; while(ISPATHSEP(result[q])) q++; } } #else if(ISPATHSEP(result[q])){ result[p++]=PATHSEP; while(ISPATHSEP(result[q])) q++; } #endif s=p; while(result[q]){ if(ISPATHSEP(result[q])){ result[s=p++]=PATHSEP; while(ISPATHSEP(result[q])) q++; continue; } result[p++]=result[q++]; } return result.trunc(s); } return FXString::null; } // Return name and extension part of pathname. // Note that name("/bla/bla/") is "" and NOT "bla". // However, name("/bla/bla") is "bla" as we expect! FXString FXPath::name(const FXString& file){ register FXint f,n; if(!file.empty()){ n=0; #ifdef WIN32 if(Ascii::isLetter(file[0]) && file[1]==':') n=2; #endif f=n; while(file[n]){ if(ISPATHSEP(file[n])) f=n+1; n++; } return FXString(file.text()+f,n-f); } return FXString::null; } // Return file title, i.e. document name only: // // /path/aa -> aa // /path/aa.bb -> aa // /path/aa.bb.cc -> aa.bb // /path/.aa -> .aa FXString FXPath::title(const FXString& file){ register FXint f,e,b,i; if(!file.empty()){ i=0; #ifdef WIN32 if(Ascii::isLetter(file[0]) && file[1]==':') i=2; #endif f=i; while(file[i]){ if(ISPATHSEP(file[i])) f=i+1; i++; } b=f; if(file[b]=='.') b++; // Leading '.' e=i; while(b "" // /path/aa.bb -> bb // /path/aa.bb.cc -> cc // /path/.aa -> "" FXString FXPath::extension(const FXString& file){ register FXint f,e,i,n; if(!file.empty()){ n=0; #ifdef WIN32 if(Ascii::isLetter(file[0]) && file[1]==':') n=2; #endif f=n; while(file[n]){ if(ISPATHSEP(file[n])) f=n+1; n++; } if(file[f]=='.') f++; // Leading '.' e=i=n; while(f /path/aa // /path/aa.bb -> /path/aa // /path/aa.bb.cc -> /path/aa.bb // /path/.aa -> /path/.aa FXString FXPath::stripExtension(const FXString& file){ if(!file.empty()){ FXString result=file; FXint p=0,q=0,s,e; #ifdef WIN32 if(ISPATHSEP(result[q])){ // UNC result[p++]=PATHSEP; q++; if(ISPATHSEP(result[q])){ result[p++]=PATHSEP; while(ISPATHSEP(result[q])) q++; } } else if(Ascii::isLetter(result[q]) && result[q+1]==':'){ result[p++]=result[q++]; result[p++]=':'; q++; if(ISPATHSEP(result[q])){ result[p++]=PATHSEP; while(ISPATHSEP(result[q])) q++; } } #else if(ISPATHSEP(result[q])){ result[p++]=PATHSEP; while(ISPATHSEP(result[q])) q++; } #endif s=p; while(result[q]){ if(ISPATHSEP(result[q])){ result[p++]=PATHSEP; s=p; while(ISPATHSEP(result[q])) q++; continue; } result[p++]=result[q++]; } if(result[s]=='.') s++; // Leading '.' e=p; while(s /aa/cc // /aa/bb/../cc/ -> /aa/cc/ // /aa/bb/../.. -> / // ../../bb -> ../../bb // ../../bb/ -> ../../bb/ // /../ -> / // ./aa/bb/../../ -> ./ // a/.. -> . // a/../ -> ./ // ./a -> ./a // /////./././ -> / // c:/../ -> c:/ // c:a/.. -> c: // /. -> / FXString FXPath::simplify(const FXString& file){ if(!file.empty()){ FXString result=file; register FXint p=0; register FXint q=0; register FXint s; #ifdef WIN32 if(ISPATHSEP(result[q])){ // UNC result[p++]=PATHSEP; q++; if(ISPATHSEP(result[q])){ result[p++]=PATHSEP; while(ISPATHSEP(result[q])) q++; } } else if(Ascii::isLetter(result[q]) && result[q+1]==':'){ result[p++]=result[q++]; result[p++]=':'; q++; if(ISPATHSEP(result[q])){ result[p++]=PATHSEP; while(ISPATHSEP(result[q])) q++; } } #else if(ISPATHSEP(result[q])){ result[p++]=PATHSEP; while(ISPATHSEP(result[q])) q++; } #endif s=p; while(result[q]){ while(result[q] && !ISPATHSEP(result[q])){ result[p++]=result[q++]; } if(ISPATHSEP(result[q])){ result[p++]=PATHSEP; while(ISPATHSEP(result[q])) q++; } if(2<=p && ISPATHSEP(result[p-2]) && result[p-1]=='.'){ // Case "xxx/." p--; if(s': case '|': case '`': // Command substitution case '^': // Special in sh case '*': // Wildcard characters case '+': case '?': case '[': case ']': case '\t': // White space case '\n': case '\v': case ' ': force=true; // Force quotes q++; continue; case '#': // Comments case '~': // Username substitution if(p==1) force=true; // Force quotes if at beginning default: // Normal character q++; continue; } } if(force) q+=e+2; // Each escape adds two, quoting adds two more if(result.length()': // Redirection case '|': // Command separators case '&': // Command separators case ':': // Drive letter separator case '*': // Wildcard case '?': // Wildcard case '\\': // Path separator case '/': // Alternate path separator q+=2; // Room for escape code continue; case ' ': // White space case '\t': case '\v': force=true; default: // Normal characters q++; continue; } } if(force) q+=2; // Surround by quotes as well if(result.length()': // Redirection case '|': // Command separators case '&': // Command separators case ':': // Drive letter separator case '*': // Wildcard case '?': // Wildcard case '\\': // Path separator case '/': // Alternate path separator result[q++]='^'; result[q++]=c; continue; case ' ': // White space case '\t': case '\v': default: // Normal characters result[q++]=c; continue; } } if(force) result[q++]='\"'; } FXASSERT(result.length()==q); } return result; } // Decode filename to get original again FXString FXPath::dequote(const FXString& file){ FXString result(file); if(0) FXString FXPath::unique(const FXString& file){ if(!FXStat::exists(file)) return file; FXString ext=FXPath::extension(file); FXString path=FXPath::stripExtension(file); // Use the new API (Jeroen) FXString filename; register FXint count=0; if(!ext.empty()) ext.prepend('.'); // Only add period when non-empty extension while(count<1000){ filename.format("%s%i%s",path.text(),count,ext.text()); if(!FXStat::exists(filename)) return filename; // Return result here (Jeroen) count++; } return FXString::null; } // Search pathlist for file FXString FXPath::search(const FXString& pathlist,const FXString& file){ if(!file.empty()){ FXString path; FXint beg,end; #ifndef WIN32 if(ISPATHSEP(file[0])){ if(FXStat::exists(file)) return file; return FXString::null; } #else if(ISPATHSEP(file[0])){ if(ISPATHSEP(file[1])){ if(FXStat::exists(file)) return file; // UNC return FXString::null; } path=FXSystem::getCurrentDrive()+file; if(FXStat::exists(path)) return path; return FXString::null; } if(Ascii::isLetter(file[0]) && file[1]==':'){ if(FXStat::exists(file)) return file; return FXString::null; } #endif for(beg=0; pathlist[beg]; beg=end){ while(pathlist[beg]==PATHLISTSEP) beg++; for(end=beg; pathlist[end] && pathlist[end]!=PATHLISTSEP; end++); if(beg==end) break; path=FXPath::absolute(FXPath::expand(pathlist.mid(beg,end-beg)),file); if(FXStat::exists(path)) return path; } } return FXString::null; } } fox1.6-1.6.57/src/FXPicker.cpp000066400000000000000000000106621326741342000156100ustar00rootroot00000000000000/******************************************************************************** * * * P i c k e r B u t t o n * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPicker.cpp,v 1.21.2.2 2008/09/22 20:53:57 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXIcon.h" #include "FXPicker.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXPicker) FXPickerMap[]={ FXMAPFUNC(SEL_MOTION,0,FXPicker::onMotion), FXMAPFUNC(SEL_ENTER,0,FXPicker::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXPicker::onLeave), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXPicker::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXPicker::onLeftBtnRelease), }; // Object implementation FXIMPLEMENT(FXPicker,FXButton,FXPickerMap,ARRAYNUMBER(FXPickerMap)) // Construct and init FXPicker::FXPicker(FXComposite* p,const FXString& text,FXIcon* ic,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXButton(p,text,ic,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){ dragCursor=getApp()->getDefaultCursor(DEF_CROSSHAIR_CURSOR); } // Entered button long FXPicker::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onEnter(sender,sel,ptr); if(isEnabled() && (options&BUTTON_TOOLBAR)) update(); return 1; } // Left button long FXPicker::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onLeave(sender,sel,ptr); if(isEnabled() && (options&BUTTON_TOOLBAR)) update(); return 1; } // Mouse moved long FXPicker::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(state==STATE_DOWN){ FXPoint point(event->root_x,event->root_y); if(target){ target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)&point); } return 1; } return 0; } // Pressed mouse button long FXPicker::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; if(isEnabled()){ if(state==STATE_UP){ grab(); setState(STATE_DOWN); flags&=~FLAG_UPDATE; } else{ setState(STATE_UP); } return 1; } return 0; } // Released mouse button long FXPicker::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(state==STATE_UP){ ungrab(); flags|=FLAG_UPDATE; FXPoint point(event->root_x,event->root_y); if(target){ target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)&point); } } return 1; } return 0; } } fox1.6-1.6.57/src/FXPipe.cpp000066400000000000000000000073641326741342000152750ustar00rootroot00000000000000/******************************************************************************** * * * P i p e C l a s s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPipe.cpp,v 1.7.2.1 2006/11/07 15:58:53 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXPath.h" #include "FXIO.h" #include "FXPipe.h" /* Notes: - Obviously this will get fleshed out some more... */ #ifdef WIN32 #define BadHandle INVALID_HANDLE_VALUE #else #define BadHandle -1 #endif using namespace FX; /*******************************************************************************/ namespace FX { // Construct file and attach existing handle h FXPipe::FXPipe(FXInputHandle handle,FXuint mode){ FXIO::open(handle,mode); } // Open device with access mode and handle bool FXPipe::open(FXInputHandle handle,FXuint mode){ return FXIO::open(handle,mode); } // Read block FXival FXPipe::readBlock(void* data,FXival count){ FXival nread=-1; if(isOpen()){ #ifdef WIN32 DWORD nr; if(::ReadFile(device,data,(DWORD)count,&nr,NULL)!=0){ nread=(FXival)nr; } #else do{ nread=::read(device,data,count); } while(nread<0 && errno==EINTR); #endif } return nread; } // Write block FXival FXPipe::writeBlock(const void* data,FXival count){ FXival nwritten=-1; if(isOpen()){ #ifdef WIN32 DWORD nw; if(::WriteFile(device,data,(DWORD)count,&nw,NULL)!=0){ nwritten=(FXival)nw; } #else do{ nwritten=::write(device,data,count); } while(nwritten<0 && errno==EINTR); #endif } return nwritten; } // Close file bool FXPipe::close(){ if(isOpen()){ FXInputHandle dev=device; device=BadHandle; #ifdef WIN32 return ::CloseHandle(dev)!=0; #else return ::close(dev)==0; #endif } return false; } // Create new (empty) file bool FXPipe::create(const FXString& file,FXuint perm){ if(!file.empty()){ #ifndef WIN32 return ::mkfifo(file.text(),perm)==0; #endif } return false; } // Destroy FXPipe::~FXPipe(){ close(); } } fox1.6-1.6.57/src/FXPoint.cpp000066400000000000000000000045651326741342000154710ustar00rootroot00000000000000/******************************************************************************** * * * P o i n t C l a s s * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPoint.cpp,v 1.12 2006/01/22 17:58:37 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxpriv.h" #include "FXHash.h" #include "FXStream.h" #include "FXSize.h" #include "FXPoint.h" using namespace FX; /*******************************************************************************/ namespace FX { // Save object to a stream FXStream& operator<<(FXStream& store,const FXPoint& p){ store << p.x << p.y; return store; } // Load object from a stream FXStream& operator>>(FXStream& store,FXPoint& p){ store >> p.x >> p.y; return store; } } fox1.6-1.6.57/src/FXPopup.cpp000066400000000000000000000605611326741342000155010ustar00rootroot00000000000000/******************************************************************************** * * * P o p u p W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPopup.cpp,v 1.91.2.4 2007/03/08 01:51:52 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxpriv.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXPopup.h" /* Notes: - FXPopup now supports stretchable children; this is useful when popups are displayed & forced to other size than default, e.g. for a ComboBox! - LAYOUT_FIX_xxx takes precedence over PACK_UNIFORM_xxx!! - Perhaps the grab owner could be equal to the owner? - Perhaps popup should resize when recalc() has been called! - Need to implement Mikael Aronssen's suggestion to make it easier to run FXPopup in a modal loop. This shouls also return a code, just like FXDialogBox does. Thus it becomes very straighforward to run a popup menu just to get a single choice value back. - Do not assume root window is at (0,0); multi-monitor machines may have secondary monitor anywhere relative to primary display. */ // Frame styles #define FRAME_MASK (FRAME_SUNKEN|FRAME_RAISED|FRAME_THICK) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXPopup) FXPopupMap[]={ FXMAPFUNC(SEL_PAINT,0,FXPopup::onPaint), FXMAPFUNC(SEL_ENTER,0,FXPopup::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXPopup::onLeave), FXMAPFUNC(SEL_MOTION,0,FXPopup::onMotion), FXMAPFUNC(SEL_MAP,0,FXPopup::onMap), FXMAPFUNC(SEL_FOCUS_NEXT,0,FXPopup::onDefault), FXMAPFUNC(SEL_FOCUS_PREV,0,FXPopup::onDefault), FXMAPFUNC(SEL_FOCUS_UP,0,FXPopup::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXPopup::onFocusDown), FXMAPFUNC(SEL_FOCUS_LEFT,0,FXPopup::onFocusLeft), FXMAPFUNC(SEL_FOCUS_RIGHT,0,FXPopup::onFocusRight), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXPopup::onButtonPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXPopup::onButtonRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXPopup::onButtonPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXPopup::onButtonRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXPopup::onButtonPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXPopup::onButtonRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXPopup::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXPopup::onKeyRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXPopup::onUngrabbed), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNPOST,FXPopup::onCmdUnpost), FXMAPFUNCS(SEL_COMMAND,FXPopup::ID_CHOICE,FXPopup::ID_CHOICE+999,FXPopup::onCmdChoice), }; // Object implementation FXIMPLEMENT(FXPopup,FXShell,FXPopupMap,ARRAYNUMBER(FXPopupMap)) // Deserialization FXPopup::FXPopup():prevActive(NULL),nextActive(NULL){ } // Transient window used for popups FXPopup::FXPopup(FXWindow* owner,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXShell(owner,opts,x,y,w,h),prevActive(NULL),nextActive(NULL){ defaultCursor=getApp()->getDefaultCursor(DEF_RARROW_CURSOR); dragCursor=getApp()->getDefaultCursor(DEF_RARROW_CURSOR); flags|=FLAG_ENABLED; grabowner=NULL; baseColor=getApp()->getBaseColor(); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); borderColor=getApp()->getBorderColor(); border=(options&FRAME_THICK)?2:(options&(FRAME_SUNKEN|FRAME_RAISED))?1:0; } // Popups do override-redirect bool FXPopup::doesOverrideRedirect() const { return true; } // Popups do save-unders bool FXPopup::doesSaveUnder() const { return true; } #ifdef WIN32 const char* FXPopup::GetClass() const { return "FXPopup"; } #endif // Setting focus causes keyboard grab, because all keyboard // events need to be reported to the active popup. void FXPopup::setFocus(){ FXShell::setFocus(); //grabKeyboard(); } // Killing the focus should revert the keyboard grab to the // previously active popup, or release the keyboard grab void FXPopup::killFocus(){ FXShell::killFocus(); //if(prevActive){ // prevActive->setFocus(); // } //else{ // ungrabKeyboard(); // } } // Get owner; if it has none, it's owned by itself FXWindow* FXPopup::getGrabOwner() const { return grabowner ? grabowner : (FXWindow*)this; } // Get width FXint FXPopup::getDefaultWidth(){ register FXWindow* child; register FXint w,wmax,wcum; register FXuint hints; wmax=wcum=0; for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else w=child->getDefaultWidth(); if(wmaxgetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=wmax; else w=child->getDefaultWidth(); wcum+=w; } } if(!(options&POPUP_HORIZONTAL)) wcum=wmax; return wcum+(border<<1); } // Get height FXint FXPopup::getDefaultHeight(){ register FXWindow* child; register FXint h,hmax,hcum; register FXuint hints; hmax=hcum=0; for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else h=child->getDefaultHeight(); if(hmaxgetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=hmax; else h=child->getDefaultHeight(); hcum+=h; } } if(options&POPUP_HORIZONTAL) hcum=hmax; return hcum+(border<<1); } // Recalculate layout void FXPopup::layout(){ register FXWindow *child; register FXint w,h,x,y,remain,t; register FXuint hints; register FXint sumexpand=0; register FXint numexpand=0; register FXint mw=0; register FXint mh=0; register FXint e=0; // Horizontal if(options&POPUP_HORIZONTAL){ // Get maximum size if uniform packed if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth(); // Space available remain=width-(border<<1); // Find number of paddable children and total space remaining for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); FXASSERT(w>=0); if((hints&LAYOUT_FILL_X) && !(hints&LAYOUT_FIX_WIDTH)){ sumexpand+=w; numexpand++; } else{ remain-=w; } } } // Do the layout for(child=getFirst(),x=border; child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if((hints&LAYOUT_FILL_X) && !(hints&LAYOUT_FIX_WIDTH)){ if(sumexpand>0){ t=w*remain; FXASSERT(sumexpand>0); w=t/sumexpand; e+=t%sumexpand; if(e>=sumexpand){w++;e-=sumexpand;} } else{ FXASSERT(numexpand>0); w=remain/numexpand; e+=remain%numexpand; if(e>=numexpand){w++;e-=numexpand;} } } child->position(x,border,w,height-(border<<1)); x+=w; } } } // Vertical else{ // Get maximum size if uniform packed if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight(); // Space available remain=height-(border<<1); // Find number of paddable children and total space remaining for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); FXASSERT(h>=0); if((hints&LAYOUT_FILL_Y) && !(hints&LAYOUT_FIX_HEIGHT)){ sumexpand+=h; numexpand++; } else{ remain-=h; } } } // Do the layout for(child=getFirst(),y=border; child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if((hints&LAYOUT_FILL_Y) && !(hints&LAYOUT_FIX_HEIGHT)){ if(sumexpand>0){ t=h*remain; FXASSERT(sumexpand>0); h=t/sumexpand; e+=t%sumexpand; if(e>=sumexpand){h++;e-=sumexpand;} } else{ FXASSERT(numexpand>0); h=remain/numexpand; e+=remain%numexpand; if(e>=numexpand){h++;e-=numexpand;} } } child->position(border,y,width-(border<<1),h); y+=h; } } } flags&=~FLAG_DIRTY; } void FXPopup::drawBorderRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(borderColor); dc.drawRectangle(x,y,w-1,h-1); } void FXPopup::drawRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(shadowColor); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); dc.setForeground(hiliteColor); dc.fillRectangle(x,y,w,1); dc.fillRectangle(x,y,1,h); } void FXPopup::drawSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(shadowColor); dc.fillRectangle(x,y,w,1); dc.fillRectangle(x,y,1,h); dc.setForeground(hiliteColor); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); } void FXPopup::drawRidgeRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(hiliteColor); dc.fillRectangle(x,y,w,1); dc.fillRectangle(x,y,1,h); dc.fillRectangle(x+1,y+h-2,w-2,1); dc.fillRectangle(x+w-2,y+1,1,h-2); dc.setForeground(shadowColor); dc.fillRectangle(x+1,y+1,w-3,1); dc.fillRectangle(x+1,y+1,1,h-3); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); } void FXPopup::drawGrooveRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(shadowColor); dc.fillRectangle(x,y,w,1); dc.fillRectangle(x,y,1,h); dc.fillRectangle(x+1,y+h-2,w-2,1); dc.fillRectangle(x+w-2,y+1,1,h-2); dc.setForeground(hiliteColor); dc.fillRectangle(x+1,y+1,w-2,1); dc.fillRectangle(x+1,y+1,1,h-2); dc.fillRectangle(x+1,y+h-1,w,1); dc.fillRectangle(x+w-1,y+1,1,h); } void FXPopup::drawDoubleRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(baseColor); dc.fillRectangle(x,y,w-1,1); dc.fillRectangle(x,y,1,h-1); dc.setForeground(hiliteColor); dc.fillRectangle(x+1,y+1,w-2,1); dc.fillRectangle(x+1,y+1,1,h-2); dc.setForeground(shadowColor); dc.fillRectangle(x+1,y+h-2,w-2,1); dc.fillRectangle(x+w-2,y+1,1,h-1); dc.setForeground(borderColor); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); } void FXPopup::drawDoubleSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(shadowColor); dc.fillRectangle(x,y,w-1,1); dc.fillRectangle(x,y,1,h-1); dc.setForeground(borderColor); dc.fillRectangle(x+1,y+1,w-3,1); dc.fillRectangle(x+1,y+1,1,h-3); dc.setForeground(hiliteColor); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); dc.setForeground(baseColor); dc.fillRectangle(x+1,y+h-2,w-2,1); dc.fillRectangle(x+w-2,y+1,1,h-2); } // Draw border void FXPopup::drawFrame(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ switch(options&FRAME_MASK){ case FRAME_LINE: drawBorderRectangle(dc,x,y,w,h); break; case FRAME_SUNKEN: drawSunkenRectangle(dc,x,y,w,h); break; case FRAME_RAISED: drawRaisedRectangle(dc,x,y,w,h); break; case FRAME_GROOVE: drawGrooveRectangle(dc,x,y,w,h); break; case FRAME_RIDGE: drawRidgeRectangle(dc,x,y,w,h); break; case FRAME_SUNKEN|FRAME_THICK: drawDoubleSunkenRectangle(dc,x,y,w,h); break; case FRAME_RAISED|FRAME_THICK: drawDoubleRaisedRectangle(dc,x,y,w,h); break; } } // Handle repaint long FXPopup::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); dc.setForeground(backColor); dc.fillRectangle(border,border,width-(border<<1),height-(border<<1)); drawFrame(dc,0,0,width,height); return 1; } // Moving focus up long FXPopup::onFocusUp(FXObject* sender,FXSelector sel,void* ptr){ if(!(options&POPUP_HORIZONTAL)) return FXPopup::onFocusPrev(sender,sel,ptr); return 0; } // Moving focus down long FXPopup::onFocusDown(FXObject* sender,FXSelector sel,void* ptr){ if(!(options&POPUP_HORIZONTAL)) return FXPopup::onFocusNext(sender,sel,ptr); return 0; } // Moving focus left long FXPopup::onFocusLeft(FXObject* sender,FXSelector sel,void* ptr){ if(options&POPUP_HORIZONTAL) return FXPopup::onFocusPrev(sender,sel,ptr); return 0; } // Moving focus right long FXPopup::onFocusRight(FXObject* sender,FXSelector sel,void* ptr){ if(options&POPUP_HORIZONTAL) return FXPopup::onFocusNext(sender,sel,ptr); return 0; } // Focus moved down; wrap back to begin if at end long FXPopup::onFocusNext(FXObject*,FXSelector,void* ptr){ FXWindow *child; if(getFocus()){ child=getFocus()->getNext(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; } child=child->getNext(); } } child=getFirst(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; } child=child->getNext(); } return 0; } // Focus moved up; wrap back to end if at begin long FXPopup::onFocusPrev(FXObject*,FXSelector,void* ptr){ FXWindow *child; if(getFocus()){ child=getFocus()->getPrev(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; } child=child->getPrev(); } } child=getLast(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; } child=child->getPrev(); } return 0; } // Moved into the popup:- tell the target long FXPopup::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint px, py; FXShell::onEnter(sender,sel,ptr); // if(event->code==CROSSINGNORMAL){ //if(((FXEvent*)ptr)->code!=CROSSINGGRAB){ translateCoordinatesTo(px,py,getParent(),event->win_x,event->win_y); // Patch from Michael Nold if(contains(px,py) && getGrabOwner()->grabbed()) getGrabOwner()->ungrab(); // } return 1; } // Moved outside the popup:- tell the target long FXPopup::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint px,py; FXShell::onLeave(sender,sel,ptr); // if(event->code==CROSSINGNORMAL){ //if(((FXEvent*)ptr)->code!=CROSSINGGRAB){ translateCoordinatesTo(px,py,getParent(),event->win_x,event->win_y); // Patch from Michael Nold if(!contains(px,py) && shown() && !getGrabOwner()->grabbed() && getGrabOwner()->shown()) getGrabOwner()->grab(); // } return 1; } // Moved (while outside the popup):- tell the target long FXPopup::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; FXint xx,yy; if(contains(ev->root_x,ev->root_y)){ if(getGrabOwner()->grabbed()) getGrabOwner()->ungrab(); } else{ getGrabOwner()->getParent()->translateCoordinatesFrom(xx,yy,getRoot(),ev->root_x,ev->root_y); if(!getGrabOwner()->contains(xx,yy)){ if(!getGrabOwner()->grabbed() && getGrabOwner()->shown()) getGrabOwner()->grab(); } } return 1; } // Window may have appeared under the cursor, so ungrab if it was grabbed long FXPopup::onMap(FXObject* sender,FXSelector sel,void* ptr){ FXint x,y; FXuint buttons; FXShell::onMap(sender,sel,ptr); getCursorPosition(x,y,buttons); if(0<=x && 0<=y && xgrabbed()) getGrabOwner()->ungrab(); } return 1; } // Pressed button outside popup long FXPopup::onButtonPress(FXObject*,FXSelector,void*){ FXTRACE((200,"%s::onButtonPress %p\n",getClassName(),this)); handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); //popdown(0); return 1; } // Released button outside popup long FXPopup::onButtonRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXTRACE((200,"%s::onButtonRelease %p\n",getClassName(),this)); if(event->moved){handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL);} //popdown(0); return 1; } // The widget lost the grab for some reason; unpost the menu long FXPopup::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXShell::onUngrabbed(sender,sel,ptr); handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); return 1; } // Key press; escape cancels popup long FXPopup::onKeyPress(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; // if(event->code==KEY_Escape || event->code==KEY_Cancel || event->code==KEY_Alt_L || event->code==KEY_Alt_R){ if(event->code==KEY_Escape || event->code==KEY_Cancel){ handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); return 1; } return FXShell::onKeyPress(sender,sel,ptr); } // Key release; escape cancels popup long FXPopup::onKeyRelease(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(event->code==KEY_Escape || event->code==KEY_Cancel){ handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); return 1; } return FXShell::onKeyRelease(sender,sel,ptr); } // Unpost menu in case it was its own owner; otherwise // tell the owner to do so. long FXPopup::onCmdUnpost(FXObject*,FXSelector,void* ptr){ FXTRACE((150,"%s::onCmdUnpost %p\n",getClassName(),this)); if(grabowner){ grabowner->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),ptr); } else{ popdown(); if(grabbed()) ungrab(); } return 1; } // Show popup and add to popup stack void FXPopup::show(){ if(!(flags&FLAG_SHOWN)){ FXShell::show(); prevActive=getApp()->popupWindow; if(prevActive) prevActive->nextActive=this; getApp()->popupWindow=this; setFocus(); } } // Hide popup and remove from popup stack void FXPopup::hide(){ if(flags&FLAG_SHOWN){ FXShell::hide(); if(getApp()->popupWindow==this) getApp()->popupWindow=prevActive; if(prevActive) prevActive->nextActive=nextActive; if(nextActive) nextActive->prevActive=prevActive; nextActive=NULL; prevActive=NULL; killFocus(); } // Focus back to popup under this one, iff this was top one } // Popup the menu at some location void FXPopup::popup(FXWindow* grabto,FXint x,FXint y,FXint w,FXint h){ FXint rx,ry,rw,rh; #ifndef WIN32 rx=getRoot()->getX(); ry=getRoot()->getY(); rw=getRoot()->getWidth(); rh=getRoot()->getHeight(); #else RECT rect; MYMONITORINFO minfo; HANDLE monitor; rect.left=x; rect.right=x+w; rect.top=y; rect.bottom=y+h; // Get monitor info if we have this API monitor=fxMonitorFromRect(&rect,MONITOR_DEFAULTTOPRIMARY); if(monitor){ memset(&minfo,0,sizeof(minfo)); minfo.cbSize=sizeof(minfo); fxGetMonitorInfo(monitor,&minfo); rx=minfo.rcWork.left; ry=minfo.rcWork.top; rw=minfo.rcWork.right-minfo.rcWork.left; rh=minfo.rcWork.bottom-minfo.rcWork.top; } // Otherwise use the work-area else{ SystemParametersInfo(SPI_GETWORKAREA,sizeof(RECT),&rect,0); rx=rect.left; ry=rect.top; rw=rect.right-rect.left; rh=rect.bottom-rect.top; } #endif FXTRACE((150,"%s::popup %p\n",getClassName(),this)); grabowner=grabto; if((options&POPUP_SHRINKWRAP) || w<=1) w=getDefaultWidth(); if((options&POPUP_SHRINKWRAP) || h<=1) h=getDefaultHeight(); if(x+w>rx+rw) x=rx+rw-w; if(y+h>ry+rh) y=ry+rh-h; if(xflush(true); } /* // Popup the menu and grab to the given owner FXint FXPopup::popup(FXint x,FXint y,FXint w,FXint h){ FXint rw,rh; create(); if((options&POPUP_SHRINKWRAP) || w<=1) w=getDefaultWidth(); if((options&POPUP_SHRINKWRAP) || h<=1) h=getDefaultHeight(); rw=getRoot()->getWidth(); rh=getRoot()->getHeight(); if(x+w>rw) x=rw-w; if(y+h>rh) y=rh-h; if(x<0) x=0; if(y<0) y=0; position(x,y,w,h); show(); raise(); return getApp()->runPopup(this); } // Pop down the menu void FXPopup::popdown(FXint value){ getApp()->stopModal(this,value); hide(); } */ // Close popup long FXPopup::onCmdChoice(FXObject*,FXSelector,void*){ //popdown(SELID(sel)-ID_CHOICE); return 1; } // Set base color void FXPopup::setBaseColor(FXColor clr){ if(baseColor!=clr){ baseColor=clr; update(); } } // Set highlight color void FXPopup::setHiliteColor(FXColor clr){ if(hiliteColor!=clr){ hiliteColor=clr; update(); } } // Set shadow color void FXPopup::setShadowColor(FXColor clr){ if(shadowColor!=clr){ shadowColor=clr; update(); } } // Set border color void FXPopup::setBorderColor(FXColor clr){ if(borderColor!=clr){ borderColor=clr; update(); } } // Get popup orientation FXuint FXPopup::getOrientation() const { return (options&POPUP_HORIZONTAL); } // Set popup orientation void FXPopup::setOrientation(FXuint orient){ FXuint opts=(options&~POPUP_HORIZONTAL) | (orient&POPUP_HORIZONTAL); if(options!=opts){ options=opts; recalc(); } } // Return shrinkwrap mode FXbool FXPopup::getShrinkWrap() const { return (options&POPUP_SHRINKWRAP)!=0; } // Change shrinkwrap mode void FXPopup::setShrinkWrap(FXbool sw){ options=sw ? (options|POPUP_SHRINKWRAP) : (options&~POPUP_SHRINKWRAP); } // Change frame border style void FXPopup::setFrameStyle(FXuint style){ FXuint opts=(options&~FRAME_MASK) | (style&FRAME_MASK); if(options!=opts){ FXint b=(opts&FRAME_THICK) ? 2 : (opts&(FRAME_SUNKEN|FRAME_RAISED)) ? 1 : 0; options=opts; if(border!=b){ border=b; recalc(); } update(); } } // Get frame style FXuint FXPopup::getFrameStyle() const { return (options&FRAME_MASK); } // Unlink popup from active popup stack FXPopup::~FXPopup(){ if(getApp()->popupWindow==this) getApp()->popupWindow=prevActive; if(prevActive) prevActive->nextActive=nextActive; if(nextActive) nextActive->prevActive=prevActive; prevActive=(FXPopup*)-1L; nextActive=(FXPopup*)-1L; grabowner=(FXWindow*)-1L; } } fox1.6-1.6.57/src/FXPrintDialog.cpp000066400000000000000000001126441326741342000166120ustar00rootroot00000000000000/******************************************************************************** * * * P r i n t J o b D i a l o g * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXPrintDialog.cpp,v 1.54 2006/01/22 17:58:37 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "fxascii.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXStat.h" #include "FXFile.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObjectList.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCPrint.h" #include "FXGIFIcon.h" #include "FXRecentFiles.h" #include "FXFrame.h" #include "FXSeparator.h" #include "FXLabel.h" #include "FXTextField.h" #include "FXButton.h" #include "FXRadioButton.h" #include "FXPacker.h" #include "FXHorizontalFrame.h" #include "FXVerticalFrame.h" #include "FXMatrix.h" #include "FXSpinner.h" #include "FXGroupBox.h" #include "FXDialogBox.h" #include "FXScrollArea.h" #include "FXList.h" #include "FXListBox.h" #include "FXComboBox.h" #include "FXMessageBox.h" #include "FXInputDialog.h" #include "FXFileDialog.h" #include "FXPrintDialog.h" #ifdef HAVE_CUPS_H #include #include #endif #include "icons.h" /* Notes: - Registry paper data base is of the form: [PAPER] 0 = "[US Letter] 612 792 72 72 72 72" 1 = "[US Legal] 612 1008 72 72 72 72" 2 = "[A3] 841.88976 1190.5512 80 80 80 80" 3 = "[A4] 595.27559 841.88976 80 80 80 80" 4 = "[A5] 420.94488 595.27559 80 80 80 80" 5 = "[B4] 730 1034 60 60 60 60" 6 = "[B5] 500 710 80 80 80 80" 7 = "[B5 Japan] 517 730 80 80 80 80" 8 = "[Half Letter] 612 397 72 72 72 72" 9 = "[Executive] 523 758 72 72 72 72" 10 = "[Tabloid/Ledger] 794 1227 72 72 72 72" 11 = "[Monarch] 280 542 10 10 10 10" 12 = "[SuperB] 843 1227 80 80 80 80" 13 = "[Envelope Commercial] 298 686 5 5 5 5" 14 = "[Envelope Monarch] 280 542 5 5 5 5" 15 = "[Envelope DL] 312 625 5 5 5 5" 16 = "[Envelope C5] 460 650 5 5 5 5" 17 = "[Euro Postcard] 298 420 5 5 5 5" The paper media are described in terms of points, i.e. 1/72 of an inch. The description comprises name, stock width, height, and left, right, top, bottom margins. - Inputs print job: Destination Printer, or file (browse to file) Orientation Paper size [A4(210x297mm) B5, Letter(8.5x11in), Legal, Executive, ?... Print all pages, or range of pages [first/last] Page collate order [first page first, last page first, even/odd] Number of copies Color/gray/blackwhite Custom paper dimensions Standard paper dimensions: Page size Print area Top/Bottom Sides Letter 8.5 x 11 in 8.2 x 10.6 in 0.25 in 0.25 in A4 210 x 297 mm 200 x 287 mm 5 mm 5 mm Legal 8.5 x 14 in 8.2 x 13.6 in 0.2 in 0.15 in #10 Envelope 4.13 x 9.5 in 3.8 x 9.2 in 0.16 in 0.14 in 104.8 x 241.3 mm 96.5 x 233.7 mm 4.1 mm 3.6 mm Known paper sizes: PAPERSIZE X" Y" X cm Y cm ----------------------------------------------------- 11x17 11" 17" 27.94 43.18 a0 33.0556" 46.7778" 83.9611 118.816 a10 1.02778" 1.45833" 2.61056 3.70417 a1 23.3889" 33.0556" 59.4078 83.9611 a2 16.5278" 23.3889" 41.9806 59.4078 a3 11.6944" 16.5278" 29.7039 41.9806 a4 8.26389" 11.6944" 20.9903 29.7039 a5 5.84722" 8.26389" 14.8519 20.9903 a6 4.125" 5.84722" 10.4775 14.8519 a7 2.91667" 4.125" 7.40833 10.4775 a8 2.05556" 2.91667" 5.22111 7.40833 a9 1.45833" 2.05556" 3.70417 5.22111 archA 9" 12" 22.86 30.48 archB 12" 18" 30.48 45.72 archC 18" 24" 45.72 60.96 archD 24" 36" 60.96 91.44 archE 36" 48" 91.44 121.92 b0 39.3889" 55.6667" 100.048 141.393 b1 27.8333" 39.3889" 70.6967 100.048 b2 19.6944" 27.8333" 50.0239 70.6967 b3 13.9167" 19.6944" 35.3483 50.0239 b4 9.84722" 13.9167" 25.0119 35.3483 b5 6.95833" 9.84722" 17.6742 25.0119 flsa 8.5" 13" 21.59 33.02 flse 8.5" 13" 21.59 33.02 halfletter 5.5" 8.5" 13.97 21.59 ledger 17" 11" 43.18 27.94 legal 8.5" 14" 21.59 35.56 letter 8.5" 11" 21.59 27.94 note 7.5" 10" 19.05 25.4 Paper Keywords and paper size in points ======================================= Letter 612x792 LetterSmall 612x792 Tabloid 792x1224 Ledger 1224x792 Legal 612x1008 Statement 396x612 Executive 540x720 A0 2384x3371 A1 1685x2384 A2 1190x1684 A3 842x1190 A4 595x842 A4Small 595x842 A5 420x595 B4 729x1032 B5 516x729 Envelope ???x??? Folio 612x936 Quarto 610x780 10x14 720x1008 */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXPrintDialog) FXPrintDialogMap[]={ FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_TO_PRINTER,FXPrintDialog::onCmdToPrinter), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_TO_PRINTER,FXPrintDialog::onUpdToPrinter), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_TO_FILE,FXPrintDialog::onCmdToFile), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_TO_FILE,FXPrintDialog::onUpdToFile), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_BROWSE_FILE,FXPrintDialog::onCmdBrowse), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_BROWSE_FILE,FXPrintDialog::onUpdBrowse), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_PROPERTIES,FXPrintDialog::onCmdProps), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_PROPERTIES,FXPrintDialog::onUpdProps), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_PORTRAIT,FXPrintDialog::onCmdPortrait), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_PORTRAIT,FXPrintDialog::onUpdPortrait), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_LANDSCAPE,FXPrintDialog::onCmdLandscape), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_LANDSCAPE,FXPrintDialog::onUpdLandscape), FXMAPFUNCS(SEL_COMMAND,FXPrintDialog::ID_PAGES_ALL,FXPrintDialog::ID_PAGES_RANGE,FXPrintDialog::onCmdPages), FXMAPFUNCS(SEL_UPDATE,FXPrintDialog::ID_PAGES_ALL,FXPrintDialog::ID_PAGES_RANGE,FXPrintDialog::onUpdPages), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_COLOR_PRINTER,FXPrintDialog::onCmdColor), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_COLOR_PRINTER,FXPrintDialog::onUpdColor), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_GRAY_PRINTER,FXPrintDialog::onCmdGray), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_GRAY_PRINTER,FXPrintDialog::onUpdGray), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_NUM_COPIES,FXPrintDialog::onCmdNumCopies), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_NUM_COPIES,FXPrintDialog::onUpdNumCopies), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_PAGES_FIRST,FXPrintDialog::onCmdFirstPage), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_PAGES_FIRST,FXPrintDialog::onUpdFirstPage), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_PAGES_LAST,FXPrintDialog::onCmdLastPage), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_PAGES_LAST,FXPrintDialog::onUpdLastPage), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_COLLATE_NORMAL,FXPrintDialog::onCmdCollateNormal), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_COLLATE_NORMAL,FXPrintDialog::onUpdCollateNormal), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_COLLATE_REVERSED,FXPrintDialog::onCmdCollateReversed), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_COLLATE_REVERSED,FXPrintDialog::onUpdCollateReversed), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_MEDIA,FXPrintDialog::onCmdMedia), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_MEDIA,FXPrintDialog::onUpdMedia), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_PRINTER_NAME,FXPrintDialog::onCmdPrinterName), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_PRINTER_NAME,FXPrintDialog::onUpdPrinterName), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_FILE_NAME,FXPrintDialog::onCmdFileName), FXMAPFUNC(SEL_UPDATE,FXPrintDialog::ID_FILE_NAME,FXPrintDialog::onUpdFileName), FXMAPFUNC(SEL_COMMAND,FXPrintDialog::ID_ACCEPT,FXPrintDialog::onCmdAccept), }; // Object implementation FXIMPLEMENT(FXPrintDialog,FXDialogBox,FXPrintDialogMap,ARRAYNUMBER(FXPrintDialogMap)) // Separator item FXPrintDialog::FXPrintDialog(FXWindow* owner,const FXString& caption,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(owner,caption,opts|DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,x,y,w,h,0,0,0,0,4,4){ FXchar key[20],name[100]; //const FXchar *paper; FXVerticalFrame *contents=new FXVerticalFrame(this,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,10,10,10,10, 10,10); // Close and cancel buttons FXHorizontalFrame* buttons=new FXHorizontalFrame(contents,LAYOUT_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH,0,0,0,0,0,0,0,0); new FXButton(buttons,tr("&Print"),NULL,this,ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_RIGHT,0,0,0,0,20,20); new FXButton(buttons,tr("&Cancel"),NULL,this,ID_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_RIGHT,0,0,0,0,20,20); #ifdef HAVE_CUPS_H FXLabel *label=new FXLabel(buttons,tr("Using CUPS"),NULL,LAYOUT_CENTER_Y|LAYOUT_LEFT,0,0,0,0,0,0); label->setTextColor(label->getShadowColor()); #endif // Print destination FXGroupBox *dest=new FXGroupBox(contents,tr("Print Destination"),GROUPBOX_TITLE_LEFT|FRAME_RIDGE|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_FILL_Y,0,0,0,0, 10,10,5,5, 10,5); sendtoprinter=new FXRadioButton(dest,tr("Pr&inter:"),this,ID_TO_PRINTER,LAYOUT_SIDE_TOP|ICON_BEFORE_TEXT); FXHorizontalFrame* printdest=new FXHorizontalFrame(dest,LAYOUT_SIDE_TOP|LAYOUT_FILL_X,0,0,0,0, 0,0,0,0, 10,10); printername=new FXComboBox(printdest,25,this,ID_PRINTER_NAME,COMBOBOX_NORMAL|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_FILL_X); printername->setNumVisible(4); new FXButton(printdest,tr("Properties..."),NULL,this,ID_PROPERTIES,FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_RIGHT|LAYOUT_FIX_WIDTH,0,0,100,0, 10,10); new FXFrame(dest,LAYOUT_SIDE_TOP|LAYOUT_FIX_HEIGHT,0,0,0,10); sendtofile=new FXRadioButton(dest,tr("&File:"),this,ID_TO_FILE,LAYOUT_SIDE_TOP|ICON_BEFORE_TEXT); FXHorizontalFrame* filedest=new FXHorizontalFrame(dest,LAYOUT_SIDE_TOP|LAYOUT_FILL_X,0,0,0,0, 0,0,0,0, 10,10); filename=new FXTextField(filedest,25,this,ID_FILE_NAME,FRAME_THICK|FRAME_SUNKEN|LAYOUT_CENTER_Y|LAYOUT_FILL_X); new FXButton(filedest,tr("&Browse..."),NULL,this,ID_BROWSE_FILE,FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_RIGHT|LAYOUT_FIX_WIDTH,0,0,100,0, 10,10); FXHorizontalFrame* bottom=new FXHorizontalFrame(contents,LAYOUT_BOTTOM|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,0,0,0,0); // Left FXVerticalFrame *left=new FXVerticalFrame(bottom,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,0,0,0,0, 10,10); // Pages FXGroupBox *pages=new FXGroupBox(left,tr("Pages"),GROUPBOX_TITLE_LEFT|FRAME_RIDGE|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_FILL_Y,0,0,0,0, 10,10,5,5); printall=new FXRadioButton(pages,tr("Print &All"),this,ID_PAGES_ALL,LAYOUT_SIDE_TOP|ICON_BEFORE_TEXT); printeven=new FXRadioButton(pages,tr("&Even Pages"),this,ID_PAGES_EVEN,LAYOUT_SIDE_TOP|ICON_BEFORE_TEXT); printodd=new FXRadioButton(pages,tr("&Odd Pages"),this,ID_PAGES_ODD,LAYOUT_SIDE_TOP|ICON_BEFORE_TEXT); printrange=new FXRadioButton(pages,tr("Print &Range:"),this,ID_PAGES_RANGE,LAYOUT_SIDE_TOP|ICON_BEFORE_TEXT); FXMatrix *pagerange=new FXMatrix(pages,2,MATRIX_BY_ROWS|LAYOUT_FILL_X|LAYOUT_SIDE_TOP,0,0,0,0, 20,0,0,0); new FXLabel(pagerange,tr("From:"),NULL,LAYOUT_CENTER_Y|LAYOUT_RIGHT|JUSTIFY_RIGHT); new FXLabel(pagerange,tr("To:"),NULL,LAYOUT_CENTER_Y|LAYOUT_RIGHT|JUSTIFY_RIGHT); firstpage=new FXSpinner(pagerange,4,this,ID_PAGES_FIRST,FRAME_THICK|FRAME_SUNKEN|LAYOUT_RIGHT); lastpage=new FXSpinner(pagerange,4,this,ID_PAGES_LAST,FRAME_THICK|FRAME_SUNKEN|LAYOUT_RIGHT); firstpage->setRange(1,10000000); lastpage->setRange(1,10000000); FXGroupBox *colors=new FXGroupBox(left,tr("Colors"),GROUPBOX_TITLE_LEFT|FRAME_RIDGE|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_FILL_Y,0,0,0,0, 10,10,5,5); printincolor=new FXRadioButton(colors,tr("Print in Color"),this,ID_COLOR_PRINTER,LAYOUT_SIDE_TOP|ICON_BEFORE_TEXT); printinblacknwhite=new FXRadioButton(colors,tr("Print in Black and White"),this,ID_GRAY_PRINTER,LAYOUT_SIDE_TOP|ICON_BEFORE_TEXT); // Right FXVerticalFrame *right=new FXVerticalFrame(bottom,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,0,0,0,0, 10,10); // Make some icons landscapeIcon=new FXGIFIcon(getApp(),landscape); portraitIcon=new FXGIFIcon(getApp(),portrait); // Layout FXGroupBox *copies=new FXGroupBox(right,tr("Copies"),GROUPBOX_TITLE_LEFT|FRAME_RIDGE|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_FILL_Y,0,0,0,0, 10,10,5,5); new FXLabel(copies,tr("Number of copies to print:"),NULL,LAYOUT_CENTER_Y|LAYOUT_RIGHT|JUSTIFY_RIGHT|LAYOUT_SIDE_LEFT); numberofcopies=new FXSpinner(copies,4,this,ID_NUM_COPIES,FRAME_THICK|FRAME_SUNKEN|LAYOUT_CENTER_Y|LAYOUT_SIDE_LEFT); numberofcopies->setRange(1,1000); // Collate FXGroupBox *collate=new FXGroupBox(right,tr("Collate Order"),GROUPBOX_TITLE_LEFT|FRAME_RIDGE|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_FILL_Y,0,0,0,0, 10,10,5,5); firstpagefirst=new FXRadioButton(collate,tr("First Page First"),this,ID_COLLATE_NORMAL,LAYOUT_SIDE_TOP|ICON_BEFORE_TEXT); lastpagefirst=new FXRadioButton(collate,tr("Last Page First"),this,ID_COLLATE_REVERSED,LAYOUT_SIDE_TOP|ICON_BEFORE_TEXT); // Layout FXGroupBox *orientation=new FXGroupBox(right,tr("Layout"),GROUPBOX_TITLE_LEFT|FRAME_RIDGE|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_FILL_Y,0,0,0,0, 10,10,5,5); new FXLabel(orientation,FXString::null,portraitIcon,LAYOUT_SIDE_LEFT|LAYOUT_CENTER_Y|LAYOUT_RIGHT|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|LAYOUT_CENTER_Y); orientportrait=new FXRadioButton(orientation,tr("Portrait"),this,ID_PORTRAIT,LAYOUT_SIDE_LEFT|ICON_BEFORE_TEXT|JUSTIFY_CENTER_Y|LAYOUT_CENTER_Y); orientlanscape=new FXRadioButton(orientation,tr("Landscape"),this,ID_LANDSCAPE,LAYOUT_SIDE_RIGHT|ICON_BEFORE_TEXT|JUSTIFY_CENTER_Y|LAYOUT_CENTER_Y); new FXLabel(orientation,FXString::null,landscapeIcon,LAYOUT_SIDE_RIGHT|LAYOUT_CENTER_Y|LAYOUT_RIGHT|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|LAYOUT_CENTER_Y); // Paper FXGroupBox *paperdims=new FXGroupBox(right,tr("Paper Size"),GROUPBOX_TITLE_LEFT|FRAME_RIDGE|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_FILL_Y,0,0,0,0, 10,10,5,5); media=new FXListBox(paperdims,this,ID_MEDIA,FRAME_SUNKEN|FRAME_THICK|LISTBOX_NORMAL|LAYOUT_FILL_X|LAYOUT_SIDE_TOP); media->setNumVisible(6); // Fill up with some defaults sendtoprinter->setCheck(TRUE); printall->setCheck(TRUE); firstpagefirst->setCheck(TRUE); printinblacknwhite->setCheck(TRUE); orientportrait->setCheck(TRUE); // Initial focus on printer name printername->setFocus(); // Make sure we have at least a couple if(!getApp()->reg().readStringEntry("PAPER","0",NULL)){ getApp()->reg().writeStringEntry("PAPER","0","[US Letter] 612 792 72 72 72 72"); getApp()->reg().writeStringEntry("PAPER","1","[US Legal] 612 1008 72 72 72 72"); getApp()->reg().writeStringEntry("PAPER","2","[A4] 595.27559 841.88976 80 80 80 80"); getApp()->reg().writeStringEntry("PAPER","3","[A3] 841.88976 1190.5512 80 80 80 80"); } // List paper sizes for(int i=0; ; i++){ sprintf(key,"%d",i); if(getApp()->reg().readFormatEntry("PAPER",key,"[%[^]]] %*f %*f %*f %*f %*f %*f",name)!=1) break; media->appendItem(name); } // These things are always reset printer.firstpage=1; printer.lastpage=1; printer.currentpage=1; printer.frompage=1; printer.topage=1; printer.numcopies=1; // The rest initialized from registry printer.mediasize=1; printer.mediawidth=612.0; printer.mediaheight=792.0; printer.leftmargin=72.0; printer.rightmargin=72.0; printer.topmargin=72.0; printer.bottommargin=72.0; // Get media printer.mediasize=getApp()->reg().readIntEntry("PRINTER","media",0); // Obtain size sprintf(key,"%d",printer.mediasize); // Parse size getApp()->reg().readFormatEntry("PAPER",key,"[%[^]]] %lf %lf %lf %lf %lf %lf",name,&printer.mediawidth,&printer.mediaheight,&printer.leftmargin,&printer.rightmargin,&printer.topmargin,&printer.bottommargin); FXTRACE((100,"Media=\"%s\" w=%g h=%g lm=%g rm=%g tm=%g bm=%g\n",name,printer.mediawidth,printer.mediaheight,printer.leftmargin,printer.rightmargin,printer.topmargin,printer.bottommargin)); // Initial flags printer.flags=0; // Landscape or portrait if(getApp()->reg().readIntEntry("PRINTER","landscape",FALSE)) printer.flags|=PRINT_LANDSCAPE; else printer.flags&=~PRINT_LANDSCAPE; // Print to file or printer if(getApp()->reg().readIntEntry("PRINTER","printtofile",FALSE)) printer.flags|=PRINT_DEST_FILE; else printer.flags&=~PRINT_DEST_FILE; // Color prints if(getApp()->reg().readIntEntry("PRINTER","color",FALSE)) printer.flags|=PRINT_COLOR; else printer.flags&=~PRINT_COLOR; // Initial name if(printer.flags&PRINT_DEST_FILE) printer.name=getApp()->reg().readStringEntry("PRINTER","file","output.ps"); else printer.name=getApp()->reg().readStringEntry("PRINTER","printer",""); } // Build a list of printers void FXPrintDialog::create(){ FXDialogBox::create(); #ifndef WIN32 #ifdef HAVE_CUPS_H // Use CUPS to determine list of printers cups_dest_t *dests; int num_dests; // Obtain list of destinations num_dests=cupsGetDests(&dests); // Fill list of printers for(int d=0; dappendItem(dests[d].name); if(printer.name==dests[d].name) printername->setCurrentItem(d); } #else char name[1000]; FILE *pc; char buf[1000]; int i; // Open printcap file, found as per registry setting // You may have change this setting for your particular system pc=fopen(getApp()->reg().readStringEntry("SETTINGS","printcap","/etc/printcap"),"r"); // Cannot open the printcap file if(!pc) return; name[0]=0; // Parse printcap one line at a time while(fgets(buf,1000,pc)){ // Extra info if printcap has been generated by Printtool if(strncmp(buf,"##PRINTTOOL3##",14)==0){ if(sscanf(buf,"%*s %*s %*s %*s %*s %*s %s",name)!=1) name[0]=0; continue; } // Blank line if(buf[0]=='#' || Ascii::isSpace(buf[0])){ continue; } // Snarf printer name (we read until the ':' or the '|' which separates aliases) for(i=0; i<1000 && buf[i]!=0 && buf[i]!=':' && buf[i]!='|'; i++); buf[i]=0; // Append human-readable info, if any if(name[0]){ strcat(buf," ("); strcat(buf,name); strcat(buf,")"); } // Add printer name if(strlen(buf)) printername->appendItem(buf); name[0]=0; //if(printer.name==dests[d].name) printername->setCurrentItem(d); } // Close the file fclose(pc); #endif #else // What operating system are we running? OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx(&osvi); FXuint p; // Determine list of printers on Windows NT if(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT){ DWORD dwFlags=PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS; DWORD dwBytesNeeded,dwNumPrinters; EnumPrinters(dwFlags,NULL,4,NULL,0,&dwBytesNeeded,&dwNumPrinters); PRINTER_INFO_4 *prtinfo; if(FXMALLOC(&prtinfo,BYTE,dwBytesNeeded)){ if(EnumPrinters(dwFlags,NULL,4,(LPBYTE)prtinfo,dwBytesNeeded,&dwBytesNeeded,&dwNumPrinters)){ for(p=0; pappendItem(prtinfo[p].pPrinterName); if(printer.name==prtinfo[p].pPrinterName) printername->setCurrentItem(p); } } FXFREE(&prtinfo); } } // Determine list of printers on Windows 9x else if(osvi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS){ DWORD dwFlags=PRINTER_ENUM_LOCAL; DWORD dwBytesNeeded,dwNumPrinters; EnumPrinters(dwFlags,NULL,5,NULL,0,&dwBytesNeeded,&dwNumPrinters); PRINTER_INFO_5 *prtinfo; if(FXMALLOC(&prtinfo,BYTE,dwBytesNeeded)){ if(EnumPrinters(dwFlags,NULL,5,(LPBYTE)prtinfo,dwBytesNeeded,&dwBytesNeeded,&dwNumPrinters)){ for(p=0; pappendItem(prtinfo[p].pPrinterName); if(printer.name==prtinfo[p].pPrinterName) printername->setCurrentItem(p); } } FXFREE(&prtinfo); } } #endif } // Send to printer long FXPrintDialog::onCmdToPrinter(FXObject*,FXSelector,void*){ getApp()->reg().writeIntEntry("PRINTER","printtofile",FALSE); printer.name=printername->getText(); printer.flags&=~PRINT_DEST_FILE; FXTRACE((100,"Print to printer: %s\n",printer.name.text())); // #ifdef HAVE_CUPS_H // int num_dests; // cups_dest_t *dests; // num_dests=cupsGetDests(&dests); // FXTRACE((1,"num_dests=%d\n",num_dests)); // for(int i=0; ijcl_begin=%d\n",ppd->jcl_begin)); // FXTRACE((1,"ppd->jcl_ps=%d\n",ppd->jcl_ps)); // FXTRACE((1,"ppd->jcl_end=%d\n",ppd->jcl_end)); // FXTRACE((1,"ppd->num_fonts=%d\n",ppd->num_fonts)); // for(int f=0; fnum_fonts; f++) FXTRACE((1,"ppd->fonts[%d]=%s\n",f,ppd->fonts[f])); // FXTRACE((1,"ppd->manufacturer=%s\n",ppd->manufacturer)); // FXTRACE((1,"ppd->modelname=%s\n",ppd->modelname)); // FXTRACE((1,"ppd->nickname=%s\n",ppd->nickname)); // FXTRACE((1,"ppd->shortnickname=%s\n",ppd->shortnickname)); // FXTRACE((1,"ppd->ttrasterizer=%s\n",ppd->ttrasterizer)); // FXTRACE((1,"ppd->product=%s\n",ppd->product)); // FXTRACE((1,"ppd->patches=%s\n",ppd->patches)); // FXTRACE((1,"ppd->lang_version=%s\n",ppd->lang_version)); // FXTRACE((1,"ppd->lang_encoding=%s\n",ppd->lang_encoding)); // FXTRACE((1,"ppd->landscape=%d\n",ppd->landscape)); // FXTRACE((1,"ppd->language_level=%d\n",ppd->language_level)); // FXTRACE((1,"ppd->model_number=%d\n",ppd->model_number)); // FXTRACE((1,"ppd->manual_copies=%d\n",ppd->manual_copies)); // FXTRACE((1,"ppd->throughput=%d\n",ppd->throughput)); // FXTRACE((1,"ppd->variable_sizes=%d\n",ppd->variable_sizes)); // FXTRACE((1,"ppd->num_sizes=%d\n",ppd->num_sizes)); // for(int s=0; snum_sizes; s++){ // ppd_size_t *sz=&ppd->sizes[s]; // FXTRACE((1,"sz->marked=%d\n",sz->marked)); // FXTRACE((1,"sz->name=%s\n",sz->name)); // FXTRACE((1,"sz->width=%f\n",sz->width)); // FXTRACE((1,"sz->length=%f\n",sz->length)); // FXTRACE((1,"sz->top=%f\n",sz->top)); // FXTRACE((1,"sz->bottom=%f\n",sz->bottom)); // FXTRACE((1,"sz->left=%f\n",sz->left)); // FXTRACE((1,"sz->right=%f\n",sz->right)); // } // ppdClose(ppd); // } // } // } // const char *defdest; // defdest=cupsGetDefault(); // FXTRACE((1,"default destination=%s\n",defdest)); // #endif return 1; } // Update send to printer long FXPrintDialog::onUpdToPrinter(FXObject* sender,FXSelector,void*){ sender->handle(this,(printer.flags&PRINT_DEST_FILE)?FXSEL(SEL_COMMAND,ID_UNCHECK):FXSEL(SEL_COMMAND,ID_CHECK),NULL); return 1; } // Send to file long FXPrintDialog::onCmdToFile(FXObject*,FXSelector,void*){ getApp()->reg().writeIntEntry("PRINTER","printtofile",TRUE); printer.name=filename->getText(); printer.flags|=PRINT_DEST_FILE; FXTRACE((100,"Print to file: %s\n",printer.name.text())); return 1; } // Update send to file long FXPrintDialog::onUpdToFile(FXObject* sender,FXSelector,void*){ sender->handle(this,(printer.flags&PRINT_DEST_FILE)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Close dialog with an accept long FXPrintDialog::onCmdAccept(FXObject* sender,FXSelector sel,void* ptr){ if(printer.flags&PRINT_DEST_FILE){ if(FXStat::exists(printer.name)){ FXuint answer=FXMessageBox::question(this,MBOX_YES_NO_CANCEL,tr("Overwrite file?"),tr("Overwrite existing file %s?"),printer.name.text()); if(answer==MBOX_CLICKED_CANCEL) return 1; if(answer==MBOX_CLICKED_NO){ return FXDialogBox::onCmdCancel(sender,sel,ptr); } } } return FXDialogBox::onCmdAccept(sender,sel,ptr); } // Browse output file long FXPrintDialog::onCmdBrowse(FXObject*,FXSelector,void*){ FXString name=getApp()->reg().readStringEntry("PRINTER","file","output.ps"); name=FXFileDialog::getSaveFilename(this,tr("Select Output File"),name,tr("All Files (*)\nPostscript Files (*.ps,*.eps)"),0); if(name.empty()) return 1; getApp()->reg().writeStringEntry("PRINTER","file",name.text()); if(printer.flags&PRINT_DEST_FILE){ printer.name=name; FXTRACE((100,"Print to file: %s\n",printer.name.text())); } return 1; } // Update browse output file long FXPrintDialog::onUpdBrowse(FXObject* sender,FXSelector,void*){ sender->handle(this,(printer.flags&PRINT_DEST_FILE)?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Printer properties panel long FXPrintDialog::onCmdProps(FXObject*,FXSelector,void*){ // FIXME this needs a dialog to add/remove printers #ifndef WIN32 FXString command="lpr -P%s -#%d"; if(FXInputDialog::getString(command,this,tr("Printer Command"),"Specify the printer command, for example:\n\n \"lpr -P%s -#%d\" or \"lp -d%s -n%d\"\n\nThis will print \"%d\" copies to printer \"%s\".")){ getApp()->reg().writeStringEntry("PRINTER","command",command.text()); } #else #endif return 1; } // Update printer properties panel long FXPrintDialog::onUpdProps(FXObject* sender,FXSelector,void*){ sender->handle(this,(printer.flags&PRINT_DEST_FILE)?FXSEL(SEL_COMMAND,ID_DISABLE):FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // File name long FXPrintDialog::onCmdFileName(FXObject*,FXSelector,void*){ FXString name=filename->getText(); getApp()->reg().writeStringEntry("PRINTER","file",name.text()); if(printer.flags&PRINT_DEST_FILE){ printer.name=name; FXTRACE((100,"Print to file: %s\n",printer.name.text())); } return 1; } // Update File name long FXPrintDialog::onUpdFileName(FXObject* sender,FXSelector,void*){ FXString name; if(printer.flags&PRINT_DEST_FILE){ name=printer.name; sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); } else{ name=getApp()->reg().readStringEntry("PRINTER","file","output.ps"); sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); } sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&name); return 1; } // Printer name long FXPrintDialog::onCmdPrinterName(FXObject*,FXSelector,void*){ FXString name=printername->getText(); getApp()->reg().writeStringEntry("PRINTER","printer",name.text()); if(!(printer.flags&PRINT_DEST_FILE)){ printer.name=name; FXTRACE((100,"Print to printer: %s\n",printer.name.text())); // // // If using CUPS, we list the available media types for this printer // #ifndef WIN32 // #ifdef HAVE_CUPS_H // const char* ppd_file; // ppd_file_t* ppd; // ppd_file=cupsGetPPD(printer.name.text()); // if(!ppd_file) return 1; // ppd=ppdOpenFile(ppd_file); // if(!ppd) return 1; // media->clearItems(); // FXTRACE((100,"num_sizes=%d\n",ppd->num_sizes)); // for(int s=0; snum_sizes; s++){ // FXTRACE((100,"ppd->sizes[%d].name=%s\n",s,ppd->sizes[s].name)); // media->appendItem(ppd->sizes[s].name); // } // ppdClose(ppd); // #endif // #endif } return 1; } // Update Printer name long FXPrintDialog::onUpdPrinterName(FXObject* sender,FXSelector,void*){ FXString name; if(printer.flags&PRINT_DEST_FILE){ name=getApp()->reg().readStringEntry("PRINTER","printer",""); sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); } else{ name=printer.name; sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); } sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&name); return 1; } // Portrait long FXPrintDialog::onCmdPortrait(FXObject*,FXSelector,void*){ getApp()->reg().writeIntEntry("PRINTER","landscape",FALSE); printer.flags&=~PRINT_LANDSCAPE; return 1; } // Update portrait long FXPrintDialog::onUpdPortrait(FXObject* sender,FXSelector,void*){ sender->handle(this,(printer.flags&PRINT_LANDSCAPE)?FXSEL(SEL_COMMAND,ID_UNCHECK):FXSEL(SEL_COMMAND,ID_CHECK),NULL); return 1; } // Landscape long FXPrintDialog::onCmdLandscape(FXObject*,FXSelector,void*){ getApp()->reg().writeIntEntry("PRINTER","landscape",TRUE); printer.flags|=PRINT_LANDSCAPE; return 1; } // Update landscape long FXPrintDialog::onUpdLandscape(FXObject* sender,FXSelector,void*){ sender->handle(this,(printer.flags&PRINT_LANDSCAPE)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Pages long FXPrintDialog::onCmdPages(FXObject*,FXSelector sel,void*){ FXuint sid=FXSELID(sel); switch(sid){ case ID_PAGES_ALL: printer.flags&=~(PRINT_PAGES_EVEN|PRINT_PAGES_ODD|PRINT_PAGES_RANGE); printer.frompage=printer.firstpage; printer.topage=printer.lastpage; break; case ID_PAGES_EVEN: printer.flags|=PRINT_PAGES_EVEN; printer.flags&=~(PRINT_PAGES_ODD|PRINT_PAGES_RANGE); printer.frompage=(printer.firstpage+1)&~1; // Get even printer.topage=printer.lastpage&~1; break; case ID_PAGES_ODD: printer.flags|=PRINT_PAGES_ODD; printer.flags&=~(PRINT_PAGES_EVEN|PRINT_PAGES_RANGE); printer.frompage=printer.firstpage|1; // Get odd? printer.topage=(printer.lastpage-1)|1; break; case ID_PAGES_RANGE: printer.flags|=PRINT_PAGES_RANGE; printer.flags&=~(PRINT_PAGES_EVEN|PRINT_PAGES_ODD); printer.frompage=printer.firstpage; printer.topage=printer.lastpage; break; } if(printer.frompage>printer.lastpage) printer.frompage=printer.lastpage; if(printer.frompageprinter.lastpage) printer.topage=printer.lastpage; if(printer.topagehandle(this,FXSEL(SEL_COMMAND,ch),NULL); return 1; } // Color long FXPrintDialog::onCmdColor(FXObject*,FXSelector,void*){ getApp()->reg().writeIntEntry("PRINTER","color",TRUE); printer.flags|=PRINT_COLOR; return 1; } // Update color long FXPrintDialog::onUpdColor(FXObject* sender,FXSelector,void*){ sender->handle(this,(printer.flags&PRINT_COLOR)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Gray long FXPrintDialog::onCmdGray(FXObject*,FXSelector,void*){ getApp()->reg().writeIntEntry("PRINTER","color",FALSE); printer.flags&=~PRINT_COLOR; return 1; } // Update gray long FXPrintDialog::onUpdGray(FXObject* sender,FXSelector,void*){ sender->handle(this,(printer.flags&PRINT_COLOR)?FXSEL(SEL_COMMAND,ID_UNCHECK):FXSEL(SEL_COMMAND,ID_CHECK),NULL); return 1; } // Number of copies long FXPrintDialog::onCmdNumCopies(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&printer.numcopies); return 1; } // Update number of copies long FXPrintDialog::onUpdNumCopies(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&printer.numcopies); return 1; } // First page long FXPrintDialog::onCmdFirstPage(FXObject* sender,FXSelector,void*){ FXint pg; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&pg); FXASSERT(pg>0); if((FXuint)pgprinter.lastpage) pg=printer.lastpage; printer.frompage=pg; return 1; } // Update first page long FXPrintDialog::onUpdFirstPage(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&printer.frompage); sender->handle(this,(printer.flags&PRINT_PAGES_RANGE)?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Last page long FXPrintDialog::onCmdLastPage(FXObject* sender,FXSelector,void*){ FXint pg; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&pg); FXASSERT(pg>0); if((FXuint)pgprinter.lastpage) pg=printer.lastpage; printer.topage=pg; return 1; } // Update last page long FXPrintDialog::onUpdLastPage(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&printer.topage); sender->handle(this,(printer.flags&PRINT_PAGES_RANGE)?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Collate Normal long FXPrintDialog::onCmdCollateNormal(FXObject*,FXSelector,void*){ printer.flags&=~PRINT_COLLATE_REVERSED; return 1; } // Update Collate Normal long FXPrintDialog::onUpdCollateNormal(FXObject* sender,FXSelector,void*){ sender->handle(this,(printer.flags&PRINT_COLLATE_REVERSED)?FXSEL(SEL_COMMAND,ID_UNCHECK):FXSEL(SEL_COMMAND,ID_CHECK),NULL); return 1; } // Collate Reversed long FXPrintDialog::onCmdCollateReversed(FXObject*,FXSelector,void*){ printer.flags|=PRINT_COLLATE_REVERSED; return 1; } // Update Collate Reversed long FXPrintDialog::onUpdCollateReversed(FXObject* sender,FXSelector,void*){ sender->handle(this,(printer.flags&PRINT_COLLATE_REVERSED)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Standard paper dimensions long FXPrintDialog::onCmdMedia(FXObject*,FXSelector,void*){ FXchar key[20],name[100]; printer.mediasize=media->getCurrentItem(); getApp()->reg().writeIntEntry("PRINTER","media",printer.mediasize); sprintf(key,"%d",printer.mediasize); getApp()->reg().readFormatEntry("PAPER",key,"[%[^]]] %lf %lf %lf %lf %lf %lf",name,&printer.mediawidth,&printer.mediaheight,&printer.leftmargin,&printer.rightmargin,&printer.topmargin,&printer.bottommargin); FXTRACE((100,"Media=\"%s\" w=%g h=%g lm=%g rm=%g tm=%g bm=%g\n",name,printer.mediawidth,printer.mediaheight,printer.leftmargin,printer.rightmargin,printer.topmargin,printer.bottommargin)); return 1; } // Update Standard paper dimensions long FXPrintDialog::onUpdMedia(FXObject*,FXSelector,void*){ if((FXint)printer.mediasize<=media->getNumItems()) media->setCurrentItem(printer.mediasize); return 1; } // Set printer to print to void FXPrintDialog::setPrinter(const FXPrinter& pr){ printer=pr; } // Obtain printer to print to void FXPrintDialog::getPrinter(FXPrinter& pr){ pr=printer; } // Save data void FXPrintDialog::save(FXStream& store) const { FXDialogBox::save(store); } // Load data void FXPrintDialog::load(FXStream& store){ FXDialogBox::load(store); } // Cleanup FXPrintDialog::~FXPrintDialog(){ delete landscapeIcon; delete portraitIcon; landscapeIcon=(FXIcon*)-1L; portraitIcon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXProgressBar.cpp000066400000000000000000000340611326741342000166230ustar00rootroot00000000000000/******************************************************************************** * * * P r o g r e s s B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXProgressBar.cpp,v 1.47 2006/01/22 17:58:37 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXProgressBar.h" /* Notes: - Reduced flicker by not drawing background at all. - Reduced flicker by setting clip rectangle to only redraw interior. - Progress bar has a target, as it can send update messages. */ #define PROGRESSBAR_MASK (PROGRESSBAR_PERCENTAGE|PROGRESSBAR_VERTICAL|PROGRESSBAR_DIAL) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXProgressBar) FXProgressBarMap[]={ FXMAPFUNC(SEL_PAINT,0,FXProgressBar::onPaint), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETVALUE,FXProgressBar::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SETINTVALUE,FXProgressBar::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_GETINTVALUE,FXProgressBar::onCmdGetIntValue), }; // Object implementation FXIMPLEMENT(FXProgressBar,FXFrame,FXProgressBarMap,ARRAYNUMBER(FXProgressBarMap)) // Make progress bar FXProgressBar::FXProgressBar(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ target=tgt; message=sel; progress=0; total=100; if(opts&PROGRESSBAR_DIAL){ textNumColor=FXRGB(255,255,255); barBGColor=FXRGB(0,0,0); barBGColor=getApp()->getBackColor(); textNumColor=FXRGB(0,0,255); barsize=60; } else{ barBGColor=getApp()->getBackColor(); textNumColor=FXRGB(0,0,255); barsize=5; } font=getApp()->getNormalFont(); barColor=FXRGB(0,0,255); textAltColor=FXRGB(255,255,255); backColor=barBGColor; } // Get minimum width FXint FXProgressBar::getDefaultWidth(){ FXint w=1,t; if((options&PROGRESSBAR_VERTICAL) || (options&PROGRESSBAR_DIAL)){ w=barsize; if(options&PROGRESSBAR_PERCENTAGE){ t=font->getTextWidth("100%",4); if(wgetFontHeight(); if(hcreate(); } // Detach window void FXProgressBar::detach(){ FXFrame::detach(); font->detach(); } // Update progress value from a message long FXProgressBar::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setProgress((FXuint)(FXival)ptr); return 1; } // Set value long FXProgressBar::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setProgress(*((FXint*)ptr)); return 1; } // Get value long FXProgressBar::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getProgress(); return 1; } // Draw only the interior, i.e. the part that changes void FXProgressBar::drawInterior(FXDCWindow& dc){ FXint percent,barlength,barfilled,tx,ty,tw,th,n,d; FXchar numtext[5]; if(options&PROGRESSBAR_DIAL){ // If total is 0, it's 100% barfilled=23040; percent=100; if(total!=0){ barfilled=(FXuint) (((double)progress * (double)23040) / (double)total); percent=(FXuint) (((double)progress * 100.0) / (double)total); } tw=width-(border<<1)-padleft-padright; th=height-(border<<1)-padtop-padbottom; d=FXMIN(tw,th)-1; tx=border+padleft+((tw-d)/2); ty=border+padtop+((th-d)/2); if(barfilled!=23040){ dc.setForeground(barBGColor); dc.fillArc(tx,ty,d,d,5760,23040-barfilled); } if(barfilled!=0){ dc.setForeground(barColor); dc.fillArc(tx,ty,d,d,5760,-barfilled); } // Draw outside circle dc.setForeground(borderColor); dc.drawArc(tx+1,ty,d,d,90*64,45*64); dc.drawArc(tx,ty+1,d,d,135*64,45*64); dc.setForeground(baseColor); dc.drawArc(tx-1,ty,d,d,270*64,45*64); dc.drawArc(tx,ty-1,d,d,315*64,45*64); dc.setForeground(shadowColor); dc.drawArc(tx,ty,d,d,45*64,180*64); dc.setForeground(hiliteColor); dc.drawArc(tx,ty,d,d,225*64,180*64); // Draw text if(options&PROGRESSBAR_PERCENTAGE){ dc.setFont(font); tw=font->getTextWidth("100%",4); if(tw>(10*d)/16) return; th=font->getFontHeight(); if(th>d/2) return; sprintf(numtext,"%d%%",percent); n=strlen(numtext); tw=font->getTextWidth(numtext,n); th=font->getFontHeight(); tx=tx+d/2-tw/2; ty=ty+d/2+font->getFontAscent()+5; //dc.setForeground(textNumColor); #ifdef HAVE_XFT_H dc.setForeground(barBGColor); // Code for XFT until XFT can use BLT_SRC_XOR_DST dc.drawText(tx-1,ty,numtext,n); dc.drawText(tx+1,ty,numtext,n); dc.drawText(tx,ty-1,numtext,n); dc.drawText(tx,ty+1,numtext,n); dc.setForeground(textNumColor); dc.drawText(tx,ty,numtext,n); #else dc.setForeground(FXRGB(255,255,255)); // Original code dc.setFunction(BLT_SRC_XOR_DST); dc.drawText(tx,ty,numtext,n); #endif } } // Vertical bar else if(options&PROGRESSBAR_VERTICAL){ // If total is 0, it's 100% barlength=height-border-border; barfilled=barlength; percent=100; if(total!=0){ barfilled=(FXuint) (((double)progress * (double)barlength) / (double)total); percent=(FXuint) (((double)progress * 100.0) / (double)total); } // Draw completed bar if(0getTextWidth(numtext,n); th=font->getFontHeight(); ty=(height-th)/2+font->getFontAscent(); tx=(width-tw)/2; if(height-border-barfilled>ty){ // In upper side dc.setForeground(textNumColor); dc.setClipRectangle(border,border,width-(border<<1),height-(border<<1)); dc.drawText(tx,ty,numtext,n); } else if(ty-th>height-border-barfilled){ // In lower side dc.setForeground(textAltColor); dc.setClipRectangle(border,border,width-(border<<1),height-(border<<1)); dc.drawText(tx,ty,numtext,n); } else{ // In between! dc.setForeground(textAltColor); dc.setClipRectangle(border,height-border-barfilled,width-(border<<1),barfilled); dc.drawText(tx,ty,numtext,n); dc.setForeground(textNumColor); dc.setClipRectangle(border,border,width-(border<<1),barlength-barfilled); dc.drawText(tx,ty,numtext,n); dc.clearClipRectangle(); } } } // Horizontal bar else{ // If total is 0, it's 100% barlength=width-border-border; barfilled=barlength; percent=100; if(total!=0){ barfilled=(FXuint) (((double)progress * (double)barlength) / (double)total); percent=(FXuint) (((double)progress * 100.0) / (double)total); } // Draw completed bar if(0getTextWidth(numtext,n); th=font->getFontHeight(); ty=(height-th)/2+font->getFontAscent(); tx=(width-tw)/2; if(border+barfilled<=tx){ // In right side dc.setForeground(textNumColor); dc.setClipRectangle(border,border,width-(border<<1),height-(border<<1)); dc.drawText(tx,ty,numtext,n); } else if(tx+tw<=border+barfilled){ // In left side dc.setForeground(textAltColor); dc.setClipRectangle(border,border,width-(border<<1),height-(border<<1)); dc.drawText(tx,ty,numtext,n); } else{ // In between! dc.setForeground(textAltColor); dc.setClipRectangle(border,border,barfilled,height); dc.drawText(tx,ty,numtext,n); dc.setForeground(textNumColor); dc.setClipRectangle(border+barfilled,border,barlength-barfilled,height); dc.drawText(tx,ty,numtext,n); dc.clearClipRectangle(); } } } } // Draw the progress bar long FXProgressBar::onPaint(FXObject*,FXSelector,void *ptr){ FXEvent *event=(FXEvent*)ptr; FXDCWindow dc(this,event); // Draw borders if any drawFrame(dc,0,0,width,height); // Background dc.setForeground(getBaseColor()); dc.fillRectangle(border,border,width-(border<<1),height-(border<<1)); // Interior drawInterior(dc); return 1; } // Set amount of progress made void FXProgressBar::setProgress(FXuint value){ if(value>total) value=total; if(value!=progress){ progress=value; if(xid){ FXDCWindow dc(this); drawInterior(dc); } getApp()->flush(); } } // Increment amount of progress void FXProgressBar::increment(FXuint value){ setProgress(progress+value); } // Set total amount to completion void FXProgressBar::setTotal(FXuint value){ if(value!=total){ total=value; if(xid){ FXDCWindow dc(this); drawInterior(dc); } getApp()->flush(); } } // Change bar color void FXProgressBar::setBarColor(FXColor clr){ if(barColor!=clr){ barColor=clr; update(border,border,width-(border<<1),height-(border<<1)); } } // Change bar background color void FXProgressBar::setBarBGColor(FXColor clr){ if(barBGColor!=clr){ barBGColor=clr; update(border,border,width-(border<<1),height-(border<<1)); } } // Change text foreground color void FXProgressBar::setTextColor(FXColor clr){ if(textNumColor!=clr){ textNumColor=clr; update(); } } // Change alternate text color void FXProgressBar::setTextAltColor(FXColor clr){ if(textAltColor!=clr){ textAltColor=clr; update(); } } // Hide percentage display void FXProgressBar::hideNumber(){ if(options&PROGRESSBAR_PERCENTAGE){ options&=~PROGRESSBAR_PERCENTAGE; recalc(); update(); } } // Show percentage display void FXProgressBar::showNumber(){ if(!(options&PROGRESSBAR_PERCENTAGE)){ options|=PROGRESSBAR_PERCENTAGE; recalc(); update(); } } void FXProgressBar::setBarSize(FXint size){ if(size<1){ fxerror("%s::setBarSize: zero or negative barsize specified.\n",getClassName()); } if(barsize!=size){ barsize=size; recalc(); update(); } } // Change the font void FXProgressBar::setFont(FXFont *fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Change style of the bar widget void FXProgressBar::setBarStyle(FXuint style){ FXuint opts=(options&~PROGRESSBAR_MASK) | (style&PROGRESSBAR_MASK); if(options!=opts){ options=opts; recalc(); } } // Get style of the bar widget FXuint FXProgressBar::getBarStyle() const { return (options&PROGRESSBAR_MASK); } // Save object to stream void FXProgressBar::save(FXStream& store) const { FXFrame::save(store); store << progress; store << total; store << barsize; store << font; store << barBGColor; store << barColor; store << textNumColor; store << textAltColor; } // Load object from stream void FXProgressBar::load(FXStream& store){ FXFrame::load(store); store >> progress; store >> total; store >> barsize; store >> font; store >> barBGColor; store >> barColor; store >> textNumColor; store >> textAltColor; } // Destroy FXProgressBar::~FXProgressBar(){ font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXProgressDialog.cpp000066400000000000000000000151061326741342000173150ustar00rootroot00000000000000/******************************************************************************** * * * P r o g r e s s D i a l o g B o x * * * ********************************************************************************* * Copyright (C) 2001,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXProgressDialog.cpp,v 1.26 2006/01/22 17:58:37 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXGIFIcon.h" #include "FXFrame.h" #include "FXSeparator.h" #include "FXLabel.h" #include "FXButton.h" #include "FXProgressBar.h" #include "FXPacker.h" #include "FXHorizontalFrame.h" #include "FXVerticalFrame.h" #include "FXProgressDialog.h" /* Notes: - */ // Padding for buttons #define HORZ_PAD 20 #define VERT_PAD 2 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXProgressDialog) FXProgressDialogMap[]={ FXMAPFUNC(SEL_COMMAND,FXProgressDialog::ID_CANCEL,FXProgressDialog::onCmdCancel), FXMAPFUNC(SEL_COMMAND,FXProgressDialog::ID_SETVALUE,FXProgressDialog::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXProgressDialog::ID_SETINTVALUE,FXProgressDialog::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXProgressDialog::ID_GETINTVALUE,FXProgressDialog::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXProgressDialog::ID_GETSTRINGVALUE,FXProgressDialog::onCmdGetStringValue), FXMAPFUNC(SEL_COMMAND,FXProgressDialog::ID_SETSTRINGVALUE,FXProgressDialog::onCmdSetStringValue), }; // Object implementation FXIMPLEMENT(FXProgressDialog,FXDialogBox,FXProgressDialogMap,ARRAYNUMBER(FXProgressDialogMap)) // Serialization FXProgressDialog::FXProgressDialog(){ cancelled=FALSE; } // Create progress dialog box FXProgressDialog::FXProgressDialog(FXWindow* owner,const FXString& caption,const FXString& label,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(owner,caption,opts,x,y,FXMAX(w,300),h,10,10,10,10, 10,10){ cancel=new FXButton(this,tr("&Cancel"),NULL,this,ID_CANCEL,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_SIDE_BOTTOM|LAYOUT_CENTER_X,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); separator=new FXHorizontalSeparator(this,SEPARATOR_GROOVE|LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); FXHorizontalFrame* toppart=new FXHorizontalFrame(this,LAYOUT_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0, 10,10); progress=new FXProgressBar(toppart,NULL,0,PROGRESSBAR_PERCENTAGE|PROGRESSBAR_DIAL|LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT,0,0,64,64,0,0,0,0); message=new FXLabel(toppart,label,NULL,JUSTIFY_LEFT|ICON_BEFORE_TEXT|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X|LAYOUT_CENTER_Y); cancel->setFocus(); if(!(opts&PROGRESSDIALOG_CANCEL)){ cancel->hide(); separator->hide(); } cancelled=FALSE; } // Close dialog, cancelling operation in progress long FXProgressDialog::onCmdCancel(FXObject* sender,FXSelector sel,void* ptr){ FXDialogBox::onCmdCancel(sender,sel,ptr); setCancelled(TRUE); return 1; } // Change dial value long FXProgressDialog::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setProgress((FXuint)(FXival)ptr); return 1; } // Change dial value long FXProgressDialog::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setProgress(*((FXint*)ptr)); return 1; } // Get dial value long FXProgressDialog::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getProgress(); return 1; } // Change message label long FXProgressDialog::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setMessage(*((FXString*)ptr)); return 1; } // Get message label long FXProgressDialog::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getMessage(); return 1; } // Change the progress message; force it to be displayed immediately void FXProgressDialog::setMessage(const FXString& msg){ message->setText(msg); message->repaint(); getApp()->flush(); } // Get progress message FXString FXProgressDialog::getMessage() const { return message->getText(); } // Change style of the progress bar widget void FXProgressDialog::setBarStyle(FXuint style){ progress->setBarStyle(style); } // Get style of the progress bar widget FXuint FXProgressDialog::getBarStyle() const { return progress->getBarStyle(); } // Change the amount of progress void FXProgressDialog::setProgress(FXuint value){ progress->setProgress(value); } // Get current progress FXuint FXProgressDialog::getProgress() const { return progress->getProgress(); } // Set total amount of progress void FXProgressDialog::setTotal(FXuint value){ progress->setTotal(value); } // Return total amount of progrss FXuint FXProgressDialog::getTotal() const { return progress->getTotal(); } // Increment progress by given amount void FXProgressDialog::increment(FXuint value){ progress->increment(value); } // Destroy it FXProgressDialog::~FXProgressDialog(){ progress=(FXProgressBar*)-1L; message=(FXLabel*)-1L; } } fox1.6-1.6.57/src/FXQuatd.cpp000066400000000000000000000366361326741342000154620ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n Q u a t e r n i o n * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXQuatd.cpp,v 1.28 2006/01/22 17:58:37 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXVec2d.h" #include "FXVec3d.h" #include "FXVec4d.h" #include "FXQuatd.h" #include "FXMat3d.h" using namespace FX; /*******************************************************************************/ namespace FX { // Construct from angle and axis FXQuatd::FXQuatd(const FXVec3d& axis,FXdouble phi){ setAxisAngle(axis,phi); } // Construct from roll, pitch, yaw FXQuatd::FXQuatd(FXdouble roll,FXdouble pitch,FXdouble yaw){ setRollPitchYaw(roll,pitch,yaw); } // Construct quaternion from two unit vectors FXQuatd::FXQuatd(const FXVec3d& fr,const FXVec3d& to){ arc(fr,to); } // Construct quaternion from axes FXQuatd::FXQuatd(const FXVec3d& ex,const FXVec3d& ey,const FXVec3d& ez){ setAxes(ex,ey,ez); } // Construct quaternion from 3x3 matrix FXQuatd::FXQuatd(const FXMat3d& mat){ setAxes(mat[0],mat[1],mat[2]); } // Adjust quaternion length FXQuatd& FXQuatd::adjust(){ register FXdouble t=x*x+y*y+z*z+w*w; register FXdouble f; if(t>0.0){ f=1.0/sqrt(t); x*=f; y*=f; z*=f; w*=f; } return *this; } // Set axis and angle void FXQuatd::setAxisAngle(const FXVec3d& axis,FXdouble phi){ register FXdouble a=0.5*phi; register FXdouble s=sin(a)/axis.length(); x=axis.x*s; y=axis.y*s; z=axis.z*s; w=cos(a); } // Obtain axis and angle // Remeber that: q = sin(A/2)*(x*i+y*j+z*k)+cos(A/2) // for unit quaternion |q| == 1 void FXQuatd::getAxisAngle(FXVec3d& axis,FXdouble& phi) const { register FXdouble n=sqrt(x*x+y*y+z*z); if(n>0.0){ axis.x=x/n; axis.y=y/n; axis.z=z/n; phi=2.0*acos(w); } else{ axis.x=1.0; axis.y=0.0; axis.z=0.0; phi=0.0; } } // Set quaternion from roll (x), pitch (y), yaw (z) void FXQuatd::setRollPitchYaw(FXdouble roll,FXdouble pitch,FXdouble yaw){ register FXdouble sr,cr,sp,cp,sy,cy; register FXdouble rr=0.5*roll; register FXdouble pp=0.5*pitch; register FXdouble yy=0.5*yaw; sr=sin(rr); cr=cos(rr); sp=sin(pp); cp=cos(pp); sy=sin(yy); cy=cos(yy); x=sr*cp*cy-cr*sp*sy; y=cr*sp*cy+sr*cp*sy; z=cr*cp*sy-sr*sp*cy; w=cr*cp*cy+sr*sp*sy; } // Set quaternion from yaw (z), pitch (y), roll (x) void FXQuatd::setYawPitchRoll(FXdouble yaw,FXdouble pitch,FXdouble roll){ register FXdouble sr,cr,sp,cp,sy,cy; register FXdouble rr=0.5*roll; register FXdouble pp=0.5*pitch; register FXdouble yy=0.5*yaw; sr=sin(rr); cr=cos(rr); sp=sin(pp); cp=cos(pp); sy=sin(yy); cy=cos(yy); x=sr*cp*cy+cr*sp*sy; y=cr*sp*cy-sr*cp*sy; z=cr*cp*sy+sr*sp*cy; w=cr*cp*cy-sr*sp*sy; } // Set quaternion from roll (x), yaw (z), pitch (y) void FXQuatd::setRollYawPitch(FXdouble roll,FXdouble yaw,FXdouble pitch){ register FXdouble sr,cr,sp,cp,sy,cy; register FXdouble rr=0.5*roll; register FXdouble pp=0.5*pitch; register FXdouble yy=0.5*yaw; sr=sin(rr); cr=cos(rr); sp=sin(pp); cp=cos(pp); sy=sin(yy); cy=cos(yy); x=cp*cy*sr+sp*sy*cr; y=sp*cy*cr+cp*sy*sr; z=cp*sy*cr-sp*cy*sr; w=cp*cy*cr-sp*sy*sr; } // Set quaternion from pitch (y), roll (x),yaw (z) void FXQuatd::setPitchRollYaw(FXdouble pitch,FXdouble roll,FXdouble yaw){ register FXdouble sr,cr,sp,cp,sy,cy; register FXdouble rr=0.5*roll; register FXdouble pp=0.5*pitch; register FXdouble yy=0.5*yaw; sr=sin(rr); cr=cos(rr); sp=sin(pp); cp=cos(pp); sy=sin(yy); cy=cos(yy); x=cy*sr*cp-sy*cr*sp; y=cy*cr*sp+sy*sr*cp; z=cy*sr*sp+sy*cr*cp; w=cy*cr*cp-sy*sr*sp; } // Set quaternion from pitch (y), yaw (z), roll (x) void FXQuatd::setPitchYawRoll(FXdouble pitch,FXdouble yaw,FXdouble roll){ register FXdouble sr,cr,sp,cp,sy,cy; register FXdouble rr=0.5*roll; register FXdouble pp=0.5*pitch; register FXdouble yy=0.5*yaw; sr=sin(rr); cr=cos(rr); sp=sin(pp); cp=cos(pp); sy=sin(yy); cy=cos(yy); x=sr*cy*cp-cr*sy*sp; y=cr*cy*sp-sr*sy*cp; z=sr*cy*sp+cr*sy*cp; w=cr*cy*cp+sr*sy*sp; } // Set quaternion from yaw (z), roll (x), pitch (y) void FXQuatd::setYawRollPitch(FXdouble yaw,FXdouble roll,FXdouble pitch){ register FXdouble sr,cr,sp,cp,sy,cy; register FXdouble rr=0.5*roll; register FXdouble pp=0.5*pitch; register FXdouble yy=0.5*yaw; sr=sin(rr); cr=cos(rr); sp=sin(pp); cp=cos(pp); sy=sin(yy); cy=cos(yy); x=cp*sr*cy+sp*cr*sy; y=sp*cr*cy-cp*sr*sy; z=cp*cr*sy-sp*sr*cy; w=cp*cr*cy+sp*sr*sy; } // Obtain roll, pitch, yaw // Math is from "3D Game Engine Design" by David Eberly pp 19-20. // However, instead of testing asin(Sy) against -PI/2 and PI/2, I // test Sy against -1 and 1; this is numerically more stable, as // asin doesn't like arguments outside [-1,1]. void FXQuatd::getRollPitchYaw(FXdouble& roll,FXdouble& pitch,FXdouble& yaw) const { register FXdouble s=-2.0f*(x*z-w*y); if(s<1.0){ if(-1.00.0){ scale=sqrt(1.0+trace); w=0.5*scale; scale=0.5/scale; x=(ey.z-ez.y)*scale; y=(ez.x-ex.z)*scale; z=(ex.y-ey.x)*scale; } else if(ex.x>ey.y && ex.x>ez.z){ scale=2.0*sqrt(1.0+ex.x-ey.y-ez.z); x=0.25*scale; y=(ex.y+ey.x)/scale; z=(ex.z+ez.x)/scale; w=(ey.z-ez.y)/scale; } else if(ey.y>ez.z){ scale=2.0*sqrt(1.0+ey.y-ex.x-ez.z); y=0.25*scale; x=(ex.y+ey.x)/scale; z=(ey.z+ez.y)/scale; w=(ez.x-ex.z)/scale; } else{ scale=2.0*sqrt(1.0+ez.z-ex.x-ey.y); z=0.25*scale; x=(ex.z+ez.x)/scale; y=(ey.z+ez.y)/scale; w=(ex.y-ey.x)/scale; } } // Get quaternion axes void FXQuatd::getAxes(FXVec3d& ex,FXVec3d& ey,FXVec3d& ez) const { register FXdouble tx=2.0*x; register FXdouble ty=2.0*y; register FXdouble tz=2.0*z; register FXdouble twx=tx*w; register FXdouble twy=ty*w; register FXdouble twz=tz*w; register FXdouble txx=tx*x; register FXdouble txy=ty*x; register FXdouble txz=tz*x; register FXdouble tyy=ty*y; register FXdouble tyz=tz*y; register FXdouble tzz=tz*z; ex.x=1.0-tyy-tzz; ex.y=txy+twz; ex.z=txz-twy; ey.x=txy-twz; ey.y=1.0-txx-tzz; ey.z=tyz+twx; ez.x=txz+twy; ez.y=tyz-twx; ez.z=1.0-txx-tyy; } // Obtain local x axis FXVec3d FXQuatd::getXAxis() const { register FXdouble ty=2.0*y; register FXdouble tz=2.0*z; return FXVec3d(1.0-ty*y-tz*z,ty*x+tz*w,tz*x-ty*w); } // Obtain local y axis FXVec3d FXQuatd::getYAxis() const { register FXdouble tx=2.0*x; register FXdouble tz=2.0*z; return FXVec3d(tx*y-tz*w,1.0-tx*x-tz*z,tz*y+tx*w); } // Obtain local z axis FXVec3d FXQuatd::getZAxis() const { register FXdouble tx=2.0*x; register FXdouble ty=2.0*y; return FXVec3d(tx*z+ty*w,ty*z-tx*w,1.0-tx*x-ty*y); } // Exponentiate unit quaternion // Given q = theta*(x*i+y*j+z*k), where length of (x,y,z) is 1, // then exp(q) = sin(theta)*(x*i+y*j+z*k)+cos(theta). FXQuatd FXQuatd::exp() const { register FXdouble theta=sqrt(x*x+y*y+z*z); register FXdouble scale; FXQuatd result(x,y,z,cos(theta)); if(theta>0.000001){ scale=sin(theta)/theta; result.x*=scale; result.y*=scale; result.z*=scale; } return result; } // Take logarithm of unit quaternion // Given q = sin(theta)*(x*i+y*j+z*k)+cos(theta), length of (x,y,z) is 1, // then log(q) = theta*(x*i+y*j+z*k). FXQuatd FXQuatd::log() const { register FXdouble scale=sqrt(x*x+y*y+z*z); register FXdouble theta=atan2(scale,w); FXQuatd result(x,y,z,0.0); if(scale>0.0){ scale=theta/scale; result.x*=scale; result.y*=scale; result.z*=scale; } return result; } // Invert quaternion FXQuatd FXQuatd::invert() const { register FXdouble n=x*x+y*y+z*z+w*w; return FXQuatd(-x/n,-y/n,-z/n,w/n); } // Invert unit quaternion FXQuatd FXQuatd::unitinvert() const { return FXQuatd(-x,-y,-z,w); } // Conjugate quaternion FXQuatd FXQuatd::conj() const { return FXQuatd(-x,-y,-z,w); } // Construct quaternion from arc a->b on unit sphere. // // Explanation: a quaternion which rotates by angle theta about unit axis a // is specified as: // // q = (a * sin(theta/2), cos(theta/2)). // // Assuming is f and t are unit length, we have: // // sin(theta) = | f x t | // // and // // cos(theta) = f . t // // Using sin(2 * x) = 2 * sin(x) * cos(x), we get: // // a * sin(theta/2) = (f x t) * sin(theta/2) / (2 * sin(theta/2) * cos(theta/2)) // // = (f x t) / (2 * cos(theta/2)) // // Using cos^2(x)=(1 + cos(2 * x)) / 2, we get: // // 4 * cos^2(theta/2) = 2 + 2 * cos(theta) // // = 2 + 2 * (f . t) // Ergo: // // 2 * cos(theta/2) = sqrt(2 + 2 * (f . t)) // FXQuatd& FXQuatd::arc(const FXVec3d& f,const FXVec3d& t){ register FXdouble dot=f.x*t.x+f.y*t.y+f.z*t.z,div; if(dot> 0.999999){ // Unit quaternion x= 0.0; y= 0.0; z= 0.0; w= 1.0; } else if(dot<-0.999999){ // 180 quaternion if(fabs(f.z)0.0f){ f=1.0f/sqrtf(t); x*=f; y*=f; z*=f; w*=f; } return *this; } // Set axis and angle void FXQuatf::setAxisAngle(const FXVec3f& axis,FXfloat phi){ register FXfloat a=0.5f*phi; register FXfloat s=sinf(a)/axis.length(); x=axis.x*s; y=axis.y*s; z=axis.z*s; w=cosf(a); } // Obtain axis and angle // Remeber that: q = sin(A/2)*(x*i+y*j+z*k)+cos(A/2) // for unit quaternion |q| == 1 void FXQuatf::getAxisAngle(FXVec3f& axis,FXfloat& phi) const { register FXfloat n=sqrtf(x*x+y*y+z*z); if(n>0.0f){ axis.x=x/n; axis.y=y/n; axis.z=z/n; phi=2.0f*acosf(w); } else{ axis.x=1.0f; axis.y=0.0f; axis.z=0.0f; phi=0.0f; } } // Set quaternion from roll (x), pitch (y), yaw (z) void FXQuatf::setRollPitchYaw(FXfloat roll,FXfloat pitch,FXfloat yaw){ register FXfloat sr,cr,sp,cp,sy,cy; register FXfloat rr=0.5f*roll; register FXfloat pp=0.5f*pitch; register FXfloat yy=0.5f*yaw; sr=sinf(rr); cr=cosf(rr); sp=sinf(pp); cp=cosf(pp); sy=sinf(yy); cy=cosf(yy); x=sr*cp*cy-cr*sp*sy; y=cr*sp*cy+sr*cp*sy; z=cr*cp*sy-sr*sp*cy; w=cr*cp*cy+sr*sp*sy; } // Set quaternion from yaw (z), pitch (y), roll (x) void FXQuatf::setYawPitchRoll(FXfloat yaw,FXfloat pitch,FXfloat roll){ register FXfloat sr,cr,sp,cp,sy,cy; register FXfloat rr=0.5f*roll; register FXfloat pp=0.5f*pitch; register FXfloat yy=0.5f*yaw; sr=sinf(rr); cr=cosf(rr); sp=sinf(pp); cp=cosf(pp); sy=sinf(yy); cy=cosf(yy); x=sr*cp*cy+cr*sp*sy; y=cr*sp*cy-sr*cp*sy; z=cr*cp*sy+sr*sp*cy; w=cr*cp*cy-sr*sp*sy; } // Set quaternion from roll (x), yaw (z), pitch (y) void FXQuatf::setRollYawPitch(FXfloat roll,FXfloat yaw,FXfloat pitch){ register FXfloat sr,cr,sp,cp,sy,cy; register FXfloat rr=0.5f*roll; register FXfloat pp=0.5f*pitch; register FXfloat yy=0.5f*yaw; sr=sinf(rr); cr=cosf(rr); sp=sinf(pp); cp=cosf(pp); sy=sinf(yy); cy=cosf(yy); x=cp*cy*sr+sp*sy*cr; y=sp*cy*cr+cp*sy*sr; z=cp*sy*cr-sp*cy*sr; w=cp*cy*cr-sp*sy*sr; } // Set quaternion from pitch (y), roll (x),yaw (z) void FXQuatf::setPitchRollYaw(FXfloat pitch,FXfloat roll,FXfloat yaw){ register FXfloat sr,cr,sp,cp,sy,cy; register FXfloat rr=0.5f*roll; register FXfloat pp=0.5f*pitch; register FXfloat yy=0.5f*yaw; sr=sinf(rr); cr=cosf(rr); sp=sinf(pp); cp=cosf(pp); sy=sinf(yy); cy=cosf(yy); x=cy*sr*cp-sy*cr*sp; y=cy*cr*sp+sy*sr*cp; z=cy*sr*sp+sy*cr*cp; w=cy*cr*cp-sy*sr*sp; } // Set quaternion from pitch (y), yaw (z), roll (x) void FXQuatf::setPitchYawRoll(FXfloat pitch,FXfloat yaw,FXfloat roll){ register FXfloat sr,cr,sp,cp,sy,cy; register FXfloat rr=0.5f*roll; register FXfloat pp=0.5f*pitch; register FXfloat yy=0.5f*yaw; sr=sinf(rr); cr=cosf(rr); sp=sinf(pp); cp=cosf(pp); sy=sinf(yy); cy=cosf(yy); x=sr*cy*cp-cr*sy*sp; y=cr*cy*sp-sr*sy*cp; z=sr*cy*sp+cr*sy*cp; w=cr*cy*cp+sr*sy*sp; } // Set quaternion from yaw (z), roll (x), pitch (y) void FXQuatf::setYawRollPitch(FXfloat yaw,FXfloat roll,FXfloat pitch){ register FXfloat sr,cr,sp,cp,sy,cy; register FXfloat rr=0.5f*roll; register FXfloat pp=0.5f*pitch; register FXfloat yy=0.5f*yaw; sr=sinf(rr); cr=cosf(rr); sp=sinf(pp); cp=cosf(pp); sy=sinf(yy); cy=cosf(yy); x=cp*sr*cy+sp*cr*sy; y=sp*cr*cy-cp*sr*sy; z=cp*cr*sy-sp*sr*cy; w=cp*cr*cy+sp*sr*sy; } // Obtain roll, pitch, yaw // Math is from "3D Game Engine Design" by David Eberly pp 19-20. // However, instead of testing asin(Sy) against -PI/2 and PI/2, I // test Sy against -1 and 1; this is numerically more stable, as // asin doesn't like arguments outside [-1,1]. void FXQuatf::getRollPitchYaw(FXfloat& roll,FXfloat& pitch,FXfloat& yaw) const { register FXfloat s=-2.0f*(x*z-w*y); if(s<1.0f){ if(-1.0f0.0f){ scale=sqrtf(1.0f+trace); w=0.5f*scale; scale=0.5f/scale; x=(ey.z-ez.y)*scale; y=(ez.x-ex.z)*scale; z=(ex.y-ey.x)*scale; } else if(ex.x>ey.y && ex.x>ez.z){ scale=2.0f*sqrtf(1.0f+ex.x-ey.y-ez.z); x=0.25f*scale; y=(ex.y+ey.x)/scale; z=(ex.z+ez.x)/scale; w=(ey.z-ez.y)/scale; } else if(ey.y>ez.z){ scale=2.0f*sqrtf(1.0f+ey.y-ex.x-ez.z); y=0.25f*scale; x=(ex.y+ey.x)/scale; z=(ey.z+ez.y)/scale; w=(ez.x-ex.z)/scale; } else{ scale=2.0f*sqrtf(1.0f+ez.z-ex.x-ey.y); z=0.25f*scale; x=(ex.z+ez.x)/scale; y=(ey.z+ez.y)/scale; w=(ex.y-ey.x)/scale; } } // Get quaternion axes void FXQuatf::getAxes(FXVec3f& ex,FXVec3f& ey,FXVec3f& ez) const { register FXfloat tx=2.0f*x; register FXfloat ty=2.0f*y; register FXfloat tz=2.0f*z; register FXfloat twx=tx*w; register FXfloat twy=ty*w; register FXfloat twz=tz*w; register FXfloat txx=tx*x; register FXfloat txy=ty*x; register FXfloat txz=tz*x; register FXfloat tyy=ty*y; register FXfloat tyz=tz*y; register FXfloat tzz=tz*z; ex.x=1.0f-tyy-tzz; ex.y=txy+twz; ex.z=txz-twy; ey.x=txy-twz; ey.y=1.0f-txx-tzz; ey.z=tyz+twx; ez.x=txz+twy; ez.y=tyz-twx; ez.z=1.0f-txx-tyy; } // Obtain local x axis FXVec3f FXQuatf::getXAxis() const { register FXfloat ty=2.0f*y; register FXfloat tz=2.0f*z; return FXVec3f(1.0f-ty*y-tz*z,ty*x+tz*w,tz*x-ty*w); } // Obtain local y axis FXVec3f FXQuatf::getYAxis() const { register FXfloat tx=2.0f*x; register FXfloat tz=2.0f*z; return FXVec3f(tx*y-tz*w,1.0f-tx*x-tz*z,tz*y+tx*w); } // Obtain local z axis FXVec3f FXQuatf::getZAxis() const { register FXfloat tx=2.0f*x; register FXfloat ty=2.0f*y; return FXVec3f(tx*z+ty*w,ty*z-tx*w,1.0f-tx*x-ty*y); } // Exponentiate unit quaternion // Given q = theta*(x*i+y*j+z*k), where length of (x,y,z) is 1, // then exp(q) = sin(theta)*(x*i+y*j+z*k)+cos(theta). FXQuatf FXQuatf::exp() const { register FXfloat theta=sqrtf(x*x+y*y+z*z); register FXfloat scale; FXQuatf result(x,y,z,cosf(theta)); if(theta>0.000001f){ scale=sinf(theta)/theta; result.x*=scale; result.y*=scale; result.z*=scale; } return result; } // Take logarithm of unit quaternion // Given q = sin(theta)*(x*i+y*j+z*k)+cos(theta), length of (x,y,z) is 1, // then log(q) = theta*(x*i+y*j+z*k). FXQuatf FXQuatf::log() const { register FXfloat scale=sqrtf(x*x+y*y+z*z); register FXfloat theta=atan2f(scale,w); FXQuatf result(x,y,z,0.0f); if(scale>0.0f){ scale=theta/scale; result.x*=scale; result.y*=scale; result.z*=scale; } return result; } // Invert quaternion FXQuatf FXQuatf::invert() const { register FXfloat n=x*x+y*y+z*z+w*w; return FXQuatf(-x/n,-y/n,-z/n,w/n); } // Invert unit quaternion FXQuatf FXQuatf::unitinvert() const { return FXQuatf(-x,-y,-z,w); } // Conjugate quaternion FXQuatf FXQuatf::conj() const { return FXQuatf(-x,-y,-z,w); } // Construct quaternion from arc a->b on unit sphere. // // Explanation: a quaternion which rotates by angle theta about unit axis a // is specified as: // // q = (a * sin(theta/2), cos(theta/2)). // // Assuming is f and t are unit length, we have: // // sin(theta) = | f x t | // // and // // cos(theta) = f . t // // Using sin(2 * x) = 2 * sin(x) * cos(x), we get: // // a * sin(theta/2) = (f x t) * sin(theta/2) / (2 * sin(theta/2) * cos(theta/2)) // // = (f x t) / (2 * cos(theta/2)) // // Using cos^2(x)=(1 + cos(2 * x)) / 2, we get: // // 4 * cos^2(theta/2) = 2 + 2 * cos(theta) // // = 2 + 2 * (f . t) // Ergo: // // 2 * cos(theta/2) = sqrt(2 + 2 * (f . t)) // FXQuatf& FXQuatf::arc(const FXVec3f& f,const FXVec3f& t){ register FXfloat dot=f.x*t.x+f.y*t.y+f.z*t.z,div; if(dot> 0.999999f){ // Unit quaternion x= 0.0f; y= 0.0f; z= 0.0f; w= 1.0f; } else if(dot<-0.999999f){ // 180 quaternion if(fabsf(f.z)getForeColor(); diskColor=getApp()->getBackColor(); target=tgt; message=sel; check=FALSE; oldcheck=FALSE; } // If window can have focus bool FXRadioButton::canFocus() const { return true; } // Get default width FXint FXRadioButton::getDefaultWidth(){ FXint tw=0,s=0,w; if(!label.empty()){ tw=labelWidth(label); s=4; } if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w=FXMAX(tw,13); else w=tw+13+s; return padleft+padright+w+(border<<1); } // Get default height FXint FXRadioButton::getDefaultHeight(){ FXint th=0,h; if(!label.empty()){ th=labelHeight(label); } if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h=FXMAX(th,13); else h=th+13; return padtop+padbottom+h+(border<<1); } // Check button void FXRadioButton::setCheck(FXbool s,FXbool notify){ if(check!=s){ check=s; update(); if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)check);} } } // Change state to checked long FXRadioButton::onCheck(FXObject*,FXSelector,void*){ setCheck(TRUE); return 1; } // Change state to unchecked long FXRadioButton::onUncheck(FXObject*,FXSelector,void*){ setCheck(FALSE); return 1; } // Change state to indeterminate long FXRadioButton::onUnknown(FXObject*,FXSelector,void*){ setCheck(MAYBE); return 1; } // Update value from a message long FXRadioButton::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCheck((FXbool)(FXuval)ptr); return 1; } // Update value from a message long FXRadioButton::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setCheck((FXbool)*((FXint*)ptr)); return 1; } // Obtain value from text field long FXRadioButton::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getCheck(); return 1; } // Implement auto-hide or auto-gray modes long FXRadioButton::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ if(!FXLabel::onUpdate(sender,sel,ptr)){ if(options&RADIOBUTTON_AUTOHIDE){if(shown()){hide();recalc();}} if(options&RADIOBUTTON_AUTOGRAY){disable();} } return 1; } // Gained focus long FXRadioButton::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusIn(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Lost focus long FXRadioButton::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusOut(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Entered button long FXRadioButton::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onEnter(sender,sel,ptr); if(isEnabled() && (flags&FLAG_PRESSED)) setCheck(TRUE); return 1; } // Left button long FXRadioButton::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onLeave(sender,sel,ptr); if(isEnabled() && (flags&FLAG_PRESSED)) setCheck(oldcheck); return 1; } // Pressed mouse button long FXRadioButton::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; oldcheck=check; setCheck(TRUE); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; return 1; } return 0; } // Released mouse button long FXRadioButton::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled() && (flags&FLAG_PRESSED)){ ungrab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; if(check!=oldcheck && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)TRUE); return 1; } return 0; } // Lost the grab for some reason long FXRadioButton::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onUngrabbed(sender,sel,ptr); setCheck(oldcheck); flags&=~FLAG_PRESSED; flags|=FLAG_UPDATE; return 1; } // Key Press long FXRadioButton::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ oldcheck=check; setCheck(TRUE); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; return 1; } } return 0; } // Key Release long FXRadioButton::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && (flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; if(check!=oldcheck && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)TRUE); return 1; } } return 0; } // Hot key combination pressed long FXRadioButton::onHotKeyPress(FXObject*,FXSelector,void* ptr){ handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ oldcheck=check; setCheck(TRUE); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; } return 1; } // Hot key combination released long FXRadioButton::onHotKeyRelease(FXObject*,FXSelector,void*){ flags&=~FLAG_TIP; if(isEnabled() && (flags&FLAG_PRESSED)){ flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; if(check!=oldcheck && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)TRUE); } return 1; } // Handle repaint long FXRadioButton::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXint tw=0,th=0,tx,ty,ix,iy; FXRectangle recs[6]; FXDCWindow dc(this,ev); dc.setForeground(backColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); if(!label.empty()){ tw=labelWidth(label); th=labelHeight(label); } just_x(tx,ix,tw,13); just_y(ty,iy,th,13); /* 012345678901 0 SSSS 0 1 SSBBBBSS 1 2 SBB BBW 2 3 SB BB OW 3 4 SB BBBB OW 4 5 SB BBBBBB OW 5 6 SB BBBBBB OW 6 7 SB BBBB OW 7 8 SB BB OW 8 9 SBO OOW 9 0 WWOOOOWW 0 1 WWWW 1 012345678901 */ // Inside recs[0].x=ix+4; recs[0].y=iy+2; recs[0].w=4; recs[0].h=1; recs[1].x=ix+3; recs[1].y=iy+3; recs[1].w=6; recs[1].h=1; recs[2].x=ix+2; recs[2].y=iy+4; recs[2].w=8; recs[2].h=4; recs[3].x=ix+3; recs[3].y=iy+8; recs[3].w=6; recs[3].h=1; recs[4].x=ix+4; recs[4].y=iy+9; recs[4].w=4; recs[4].h=1; if(!isEnabled()) // fix by Daniel Gehriger (gehriger@linkcad.com) dc.setForeground(baseColor); else dc.setForeground(diskColor); dc.fillRectangles(recs,5); // Top left outside recs[0].x=ix+4; recs[0].y=iy+0; recs[0].w=4; recs[0].h=1; recs[1].x=ix+2; recs[1].y=iy+1; recs[1].w=2; recs[1].h=1; recs[2].x=ix+8; recs[2].y=iy+1; recs[2].w=2; recs[2].h=1; recs[3].x=ix+1; recs[3].y=iy+2; recs[3].w=1; recs[3].h=2; recs[4].x=ix+0; recs[4].y=iy+4; recs[4].w=1; recs[4].h=4; recs[5].x=ix+1; recs[5].y=iy+8; recs[5].w=1; recs[5].h=2; dc.setForeground(shadowColor); dc.fillRectangles(recs,6); // Top left inside recs[0].x=ix+4; recs[0].y=iy+1; recs[0].w=4; recs[0].h=1; recs[1].x=ix+2; recs[1].y=iy+2; recs[1].w=2; recs[1].h=1; recs[2].x=ix+8; recs[2].y=iy+2; recs[2].w=2; recs[2].h=1; recs[3].x=ix+2; recs[3].y=iy+3; recs[3].w=1; recs[3].h=1; recs[4].x=ix+1; recs[4].y=iy+4; recs[4].w=1; recs[4].h=4; recs[5].x=ix+2; recs[5].y=iy+8; recs[5].w=1; recs[5].h=2; dc.setForeground(borderColor); dc.fillRectangles(recs,6); // Bottom right outside recs[0].x=ix+10;recs[0].y=iy+2; recs[0].w=1; recs[0].h=2; recs[1].x=ix+11;recs[1].y=iy+4; recs[1].w=1; recs[1].h=4; recs[2].x=ix+10;recs[2].y=iy+8; recs[2].w=1; recs[2].h=2; recs[3].x=ix+8; recs[3].y=iy+10;recs[3].w=2; recs[3].h=1; recs[4].x=ix+2; recs[4].y=iy+10;recs[4].w=2; recs[4].h=1; recs[5].x=ix+4; recs[5].y=iy+11;recs[5].w=4; recs[5].h=1; dc.setForeground(hiliteColor); dc.fillRectangles(recs,6); // Bottom right inside recs[0].x=ix+9; recs[0].y=iy+3; recs[0].w=1; recs[0].h=1; recs[1].x=ix+10;recs[1].y=iy+4; recs[1].w=1; recs[1].h=4; recs[2].x=ix+9; recs[2].y=iy+8; recs[2].w=1; recs[2].h=1; recs[3].x=ix+8; recs[3].y=iy+9; recs[3].w=2; recs[3].h=1; recs[4].x=ix+3; recs[4].y=iy+9; recs[4].w=1; recs[4].h=1; recs[5].x=ix+4; recs[5].y=iy+10;recs[5].w=4; recs[5].h=1; dc.setForeground(baseColor); dc.fillRectangles(recs,6); // Ball inside if(check!=FALSE){ recs[0].x=ix+5; recs[0].y=iy+4; recs[0].w=2; recs[0].h=1; recs[1].x=ix+4; recs[1].y=iy+5; recs[1].w=4; recs[1].h=2; recs[2].x=ix+5; recs[2].y=iy+7; recs[2].w=2; recs[2].h=1; if(isEnabled()) dc.setForeground(radioColor); else dc.setForeground(shadowColor); dc.fillRectangles(recs,3); } // Label if(!label.empty()){ dc.setFont(font); if(isEnabled()){ dc.setForeground(textColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); if(hasFocus()){ dc.drawFocusRectangle(tx-1,ty-1,tw+2,th+2); } } else{ dc.setForeground(hiliteColor); drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } } drawFrame(dc,0,0,width,height); return 1; } // Set radio color void FXRadioButton::setRadioColor(FXColor clr){ if(radioColor!=clr){ radioColor=clr; update(); } } // Set disk color void FXRadioButton::setDiskColor(FXColor clr){ if(clr!=diskColor){ diskColor=clr; update(); } } // Change radio button style void FXRadioButton::setRadioButtonStyle(FXuint style){ FXuint opts=(options&~RADIOBUTTON_MASK) | (style&RADIOBUTTON_MASK); if(options!=opts){ options=opts; update(); } } // Return current radio button style FXuint FXRadioButton::getRadioButtonStyle() const { return (options&RADIOBUTTON_MASK); } // Save object to stream void FXRadioButton::save(FXStream& store) const { FXLabel::save(store); store << radioColor; store << diskColor; } // Load object from stream void FXRadioButton::load(FXStream& store){ FXLabel::load(store); store >> radioColor; store >> diskColor; } } fox1.6-1.6.57/src/FXRanged.cpp000066400000000000000000000205331326741342000155710ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n R a n g e C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRanged.cpp,v 1.15 2006/01/22 17:58:38 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXVec2d.h" #include "FXVec3d.h" #include "FXVec4d.h" #include "FXSphered.h" #include "FXRanged.h" /* Notes: - Serializes in the same order old FXRange. */ using namespace FX; /************************** R a n g e C l a s s *************************/ namespace FX { // Initialize from bounding sphere FXRanged::FXRanged(const FXSphered& sphere): lower(sphere.center.x-sphere.radius,sphere.center.y-sphere.radius,sphere.center.z-sphere.radius), upper(sphere.center.x+sphere.radius,sphere.center.y+sphere.radius,sphere.center.z+sphere.radius){ } // Longest side FXdouble FXRanged::longest() const { register FXdouble x=upper.x-lower.x; register FXdouble y=upper.y-lower.y; register FXdouble z=upper.z-lower.z; return FXMAX3(x,y,z); } // Shortest side FXdouble FXRanged::shortest() const { register FXdouble x=upper.x-lower.x; register FXdouble y=upper.y-lower.y; register FXdouble z=upper.z-lower.z; return FXMIN3(x,y,z); } // Length of diagonal FXdouble FXRanged::diameter() const { register FXdouble x=upper.x-lower.x; register FXdouble y=upper.y-lower.y; register FXdouble z=upper.z-lower.z; return sqrt(x*x+y*y+z*z); } // Get radius of box FXdouble FXRanged::radius() const { return diameter()*0.5; } // Get diagonal of box FXVec3d FXRanged::diagonal() const { return upper-lower; } // Get center of box FXVec3d FXRanged::center() const { return 0.5*(upper+lower); } // Test if empty bool FXRanged::empty() const { return upper.xupper.x) upper.x=x; if(yupper.y) upper.y=y; if(zupper.z) upper.z=z; return *this; } // Include point into range FXRanged& FXRanged::include(const FXVec3d& v){ return include(v.x,v.y,v.z); } // Include given box into box's range FXRanged& FXRanged::include(const FXRanged& box){ if(box.lower.xupper.x) upper.x=box.upper.x; if(box.lower.yupper.y) upper.y=box.upper.y; if(box.lower.zupper.z) upper.z=box.upper.z; return *this; } // Include given sphere into this box FXRanged& FXRanged::include(const FXSphered& sphere){ FXVec3d lo(sphere.center.x-sphere.radius,sphere.center.y-sphere.radius,sphere.center.z-sphere.radius); FXVec3d hi(sphere.center.x+sphere.radius,sphere.center.y+sphere.radius,sphere.center.z+sphere.radius); if(lo.xupper.x) upper.x=hi.x; if(lo.yupper.y) upper.y=hi.y; if(lo.zupper.z) upper.z=hi.z; return *this; } // Test if overlap bool overlap(const FXRanged& a,const FXRanged& b){ return a.upper.x>=b.lower.x && a.lower.x<=b.upper.x && a.upper.y>=b.lower.y && a.lower.y<=b.upper.y && a.upper.z>=b.lower.z && a.lower.z<=b.upper.z; } // Union of two boxes FXRanged unite(const FXRanged& a,const FXRanged& b){ return FXRanged(lo(a.lower,b.lower),hi(a.upper,b.upper)); } // Intersection of two boxes FXRanged intersect(const FXRanged& a,const FXRanged& b){ return FXRanged(hi(a.lower,b.lower),lo(a.upper,b.upper)); } // Intersect box with normalized plane ax+by+cz+w; returns -1,0,+1 FXint FXRanged::intersect(const FXVec4d& plane) const { FXVec3d lo; FXVec3d hi; // Diagonal if(plane.x>0.0){ lo.x=lower.x; hi.x=upper.x; } else{ lo.x=upper.x; hi.x=lower.x; } if(plane.y>0.0){ lo.y=lower.y; hi.y=upper.y; } else{ lo.y=upper.y; hi.y=lower.y; } if(plane.z>0.0){ lo.z=lower.z; hi.z=upper.z; } else{ lo.z=upper.z; hi.z=lower.z; } // Lower point on positive side of plane if(plane.x*lo.x+plane.y*lo.y+plane.z*lo.z+plane.w>=0.0) return 1; // Upper point on negative side of plane if(plane.x*hi.x+plane.y*hi.y+plane.z*hi.z+plane.w<=0.0) return -1; // Overlap return 0; } // Intersect box with ray u-v bool FXRanged::intersect(const FXVec3d& u,const FXVec3d& v){ register FXdouble d,ni,fi,t; register FXdouble f= DBL_MAX; register FXdouble n=-DBL_MAX; d = v.x-u.x; if(d==0.0){ if((upper.xfi) FXSWAP(ni,fi,t); if(ni>n) n=ni; if(fif) return false; } d = v.y-u.y; if(d==0.0){ if((upper.yfi) FXSWAP(ni,fi,t); if(ni>n) n=ni; if(fif) return false; } d = v.z-u.z; if(d==0.0){ if((upper.zfi) FXSWAP(ni,fi,t); if(ni>n) n=ni; if(fif) return false; } return true; } // Saving FXStream& operator<<(FXStream& store,const FXRanged& bounds){ store << bounds.lower.x << bounds.upper.x; store << bounds.lower.y << bounds.upper.y; store << bounds.lower.z << bounds.upper.z; return store; } // Loading FXStream& operator>>(FXStream& store,FXRanged& bounds){ store >> bounds.lower.x >> bounds.upper.x; store >> bounds.lower.y >> bounds.upper.y; store >> bounds.lower.z >> bounds.upper.z; return store; } } fox1.6-1.6.57/src/FXRangef.cpp000066400000000000000000000205201326741342000155670ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n R a n g e C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRangef.cpp,v 1.14 2006/01/22 17:58:38 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXSpheref.h" #include "FXRangef.h" /* Notes: - Serializes in the same order old FXRange. */ using namespace FX; /************************** R a n g e C l a s s *************************/ namespace FX { // Initialize from bounding sphere FXRangef::FXRangef(const FXSpheref& sphere): lower(sphere.center.x-sphere.radius,sphere.center.y-sphere.radius,sphere.center.z-sphere.radius), upper(sphere.center.x+sphere.radius,sphere.center.y+sphere.radius,sphere.center.z+sphere.radius){ } // Longest side FXfloat FXRangef::longest() const { register FXfloat x=upper.x-lower.x; register FXfloat y=upper.y-lower.y; register FXfloat z=upper.z-lower.z; return FXMAX3(x,y,z); } // Shortest side FXfloat FXRangef::shortest() const { register FXfloat x=upper.x-lower.x; register FXfloat y=upper.y-lower.y; register FXfloat z=upper.z-lower.z; return FXMIN3(x,y,z); } // Length of diagonal FXfloat FXRangef::diameter() const { register FXfloat x=upper.x-lower.x; register FXfloat y=upper.y-lower.y; register FXfloat z=upper.z-lower.z; return sqrtf(x*x+y*y+z*z); } // Get radius of box FXfloat FXRangef::radius() const { return diameter()*0.5f; } // Get diagonal of box FXVec3f FXRangef::diagonal() const { return upper-lower; } // Get center of box FXVec3f FXRangef::center() const { return 0.5f*(upper+lower); } // Test if empty bool FXRangef::empty() const { return upper.xupper.x) upper.x=x; if(yupper.y) upper.y=y; if(zupper.z) upper.z=z; return *this; } // Include point into range FXRangef& FXRangef::include(const FXVec3f& v){ return include(v.x,v.y,v.z); } // Include given box into box's range FXRangef& FXRangef::include(const FXRangef& box){ if(box.lower.xupper.x) upper.x=box.upper.x; if(box.lower.yupper.y) upper.y=box.upper.y; if(box.lower.zupper.z) upper.z=box.upper.z; return *this; } // Include given sphere into this box FXRangef& FXRangef::include(const FXSpheref& sphere){ FXVec3f lo(sphere.center.x-sphere.radius,sphere.center.y-sphere.radius,sphere.center.z-sphere.radius); FXVec3f hi(sphere.center.x+sphere.radius,sphere.center.y+sphere.radius,sphere.center.z+sphere.radius); if(lo.xupper.x) upper.x=hi.x; if(lo.yupper.y) upper.y=hi.y; if(lo.zupper.z) upper.z=hi.z; return *this; } // Test if overlap bool overlap(const FXRangef& a,const FXRangef& b){ return a.upper.x>=b.lower.x && a.lower.x<=b.upper.x && a.upper.y>=b.lower.y && a.lower.y<=b.upper.y && a.upper.z>=b.lower.z && a.lower.z<=b.upper.z; } // Union of two boxes FXRangef unite(const FXRangef& a,const FXRangef& b){ return FXRangef(lo(a.lower,b.lower),hi(a.upper,b.upper)); } // Intersection of two boxes FXRangef intersect(const FXRangef& a,const FXRangef& b){ return FXRangef(hi(a.lower,b.lower),lo(a.upper,b.upper)); } // Intersect box with normalized plane ax+by+cz+w; returns -1,0,+1 FXint FXRangef::intersect(const FXVec4f& plane) const { FXVec3f lo; FXVec3f hi; // Diagonal if(plane.x>0.0f){ lo.x=lower.x; hi.x=upper.x; } else{ lo.x=upper.x; hi.x=lower.x; } if(plane.y>0.0f){ lo.y=lower.y; hi.y=upper.y; } else{ lo.y=upper.y; hi.y=lower.y; } if(plane.z>0.0f){ lo.z=lower.z; hi.z=upper.z; } else{ lo.z=upper.z; hi.z=lower.z; } // Lower point on positive side of plane if(plane.x*lo.x+plane.y*lo.y+plane.z*lo.z+plane.w>=0.0f) return 1; // Upper point on negative side of plane if(plane.x*hi.x+plane.y*hi.y+plane.z*hi.z+plane.w<=0.0f) return -1; // Overlap return 0; } // Intersect box with ray u-v bool FXRangef::intersect(const FXVec3f& u,const FXVec3f& v){ register FXfloat d,ni,fi,t; register FXfloat f= FLT_MAX; register FXfloat n=-FLT_MAX; d = v.x-u.x; if(d==0.0f){ if((upper.xfi) FXSWAP(ni,fi,t); if(ni>n) n=ni; if(fif) return false; } d = v.y-u.y; if(d==0.0f){ if((upper.yfi) FXSWAP(ni,fi,t); if(ni>n) n=ni; if(fif) return false; } d = v.z-u.z; if(d==0.0f){ if((upper.zfi) FXSWAP(ni,fi,t); if(ni>n) n=ni; if(fif) return false; } return true; } // Saving FXStream& operator<<(FXStream& store,const FXRangef& bounds){ store << bounds.lower.x << bounds.upper.x; store << bounds.lower.y << bounds.upper.y; store << bounds.lower.z << bounds.upper.z; return store; } // Loading FXStream& operator>>(FXStream& store,FXRangef& bounds){ store >> bounds.lower.x >> bounds.upper.x; store >> bounds.lower.y >> bounds.upper.y; store >> bounds.lower.z >> bounds.upper.z; return store; } } fox1.6-1.6.57/src/FXRealSlider.cpp000066400000000000000000000726411326741342000164260ustar00rootroot00000000000000/******************************************************************************** * * * R e a l S l i d e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRealSlider.cpp,v 1.20.2.2 2007/08/09 00:37:06 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXRealSlider.h" /* Notes: - Maybe add bindings for arrow keys for value changes. - Bug: slider head can only assume discrete pixel positions, and thus odd-ball floating point numbers result. Would be nice if the head movements would result in "nice" numbers, with a subdivision smaller than a whole pixel. - Yes, this *does* have a lot in common with FXSlider and its probably a good idea to give FXRealSlider and FXSlider a common base class at some point. */ #define TICKSIZE 4 // Length of ticks #define OVERHANG 4 // Default amount of overhang #define MINOVERHANG 3 // Minimal amount of overhang #define HEADINSIDEBAR 20 // Default for inside bar head size #define HEADOVERHANGING 9 // Default for overhanging head size #define REALSLIDER_MASK (REALSLIDER_VERTICAL|REALSLIDER_ARROW_UP|REALSLIDER_ARROW_DOWN|REALSLIDER_INSIDE_BAR|REALSLIDER_TICKS_TOP|REALSLIDER_TICKS_BOTTOM) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXRealSlider) FXRealSliderMap[]={ FXMAPFUNC(SEL_PAINT,0,FXRealSlider::onPaint), FXMAPFUNC(SEL_MOTION,0,FXRealSlider::onMotion), FXMAPFUNC(SEL_MOUSEWHEEL,0,FXRealSlider::onMouseWheel), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXRealSlider::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXRealSlider::onLeftBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXRealSlider::onMiddleBtnPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXRealSlider::onMiddleBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXRealSlider::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXRealSlider::onKeyRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXRealSlider::onUngrabbed), FXMAPFUNC(SEL_QUERY_TIP,0,FXRealSlider::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXRealSlider::onQueryHelp), FXMAPFUNC(SEL_TIMEOUT,FXRealSlider::ID_AUTOSLIDE,FXRealSlider::onAutoSlide), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_SETVALUE,FXRealSlider::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_SETINTVALUE,FXRealSlider::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_SETREALVALUE,FXRealSlider::onCmdSetRealValue), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_GETINTVALUE,FXRealSlider::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_GETREALVALUE,FXRealSlider::onCmdGetRealValue), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_SETINTRANGE,FXRealSlider::onCmdSetIntRange), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_GETINTRANGE,FXRealSlider::onCmdGetIntRange), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_SETREALRANGE,FXRealSlider::onCmdSetRealRange), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_GETREALRANGE,FXRealSlider::onCmdGetRealRange), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_SETHELPSTRING,FXRealSlider::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_GETHELPSTRING,FXRealSlider::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_SETTIPSTRING,FXRealSlider::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXRealSlider::ID_GETTIPSTRING,FXRealSlider::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXRealSlider,FXFrame,FXRealSliderMap,ARRAYNUMBER(FXRealSliderMap)) // Make a slider FXRealSlider::FXRealSlider(){ flags|=FLAG_ENABLED; range[0]=0.0; range[1]=0.0; pos=0.0; incr=0.01; delta=0.0; headpos=0; headsize=0; slotsize=0; slotColor=0; dragpoint=0; } // Make a slider FXRealSlider::FXRealSlider(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb):FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_ENABLED; baseColor=getApp()->getBaseColor(); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); borderColor=getApp()->getBorderColor(); slotColor=getApp()->getBackColor(); target=tgt; message=sel; range[0]=0.0; range[1]=1.0; pos=0.5; incr=0.01; delta=0.0; headpos=0; headsize=(options&REALSLIDER_INSIDE_BAR)?HEADINSIDEBAR:HEADOVERHANGING; slotsize=5; dragpoint=0; } // Enable the window void FXRealSlider::enable(){ if(!(flags&FLAG_ENABLED)){ FXFrame::enable(); update(); } } // Disable the window void FXRealSlider::disable(){ if(flags&FLAG_ENABLED){ FXFrame::disable(); update(); } } // Get default size FXint FXRealSlider::getDefaultWidth(){ FXint w; if(options&REALSLIDER_VERTICAL){ if(options&REALSLIDER_INSIDE_BAR) w=4+headsize/2; else if(options&(REALSLIDER_ARROW_LEFT|REALSLIDER_ARROW_RIGHT)) w=slotsize+MINOVERHANG*2+headsize/2; else w=slotsize+MINOVERHANG*2; if(options&REALSLIDER_TICKS_LEFT) w+=TICKSIZE; if(options&REALSLIDER_TICKS_RIGHT) w+=TICKSIZE; } else{ w=headsize+4; } return w+padleft+padright+(border<<1); } FXint FXRealSlider::getDefaultHeight(){ FXint h; if(options&REALSLIDER_VERTICAL){ h=headsize+4; } else{ if(options&REALSLIDER_INSIDE_BAR) h=4+headsize/2; else if(options&(REALSLIDER_ARROW_UP|REALSLIDER_ARROW_DOWN)) h=slotsize+2*MINOVERHANG+headsize/2; else h=slotsize+MINOVERHANG*2; if(options&REALSLIDER_TICKS_TOP) h+=TICKSIZE; if(options&REALSLIDER_TICKS_BOTTOM) h+=TICKSIZE; } return h+padtop+padbottom+(border<<1); } // Returns true because a slider can receive focus bool FXRealSlider::canFocus() const { return true; } // Layout changed; even though the position is still // the same, the head may have to be moved. void FXRealSlider::layout(){ setValue(pos); flags&=~FLAG_DIRTY; } // Set help using a message long FXRealSlider::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXRealSlider::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXRealSlider::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXRealSlider::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXRealSlider::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXRealSlider::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Update value from a message long FXRealSlider::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setValue((FXdouble)(FXival)ptr); return 1; } // Update value from a message long FXRealSlider::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setValue((FXdouble)*((FXint*)ptr)); return 1; } // Update value from a message long FXRealSlider::onCmdSetRealValue(FXObject*,FXSelector,void* ptr){ setValue(*((FXdouble*)ptr)); return 1; } // Obtain value from text field long FXRealSlider::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=(FXint)getValue(); return 1; } // Obtain value with a message long FXRealSlider::onCmdGetRealValue(FXObject*,FXSelector,void* ptr){ *((FXdouble*)ptr)=getValue(); return 1; } // Update range from a message long FXRealSlider::onCmdSetIntRange(FXObject*,FXSelector,void* ptr){ setRange((FXdouble)((FXint*)ptr)[0],(FXdouble)((FXint*)ptr)[1]); return 1; } // Get range with a message long FXRealSlider::onCmdGetIntRange(FXObject*,FXSelector,void* ptr){ ((FXint*)ptr)[0]=(FXint)range[0]; ((FXint*)ptr)[1]=(FXint)range[1]; return 1; } // Update range from a message long FXRealSlider::onCmdSetRealRange(FXObject*,FXSelector,void* ptr){ setRange(((FXdouble*)ptr)[0],((FXdouble*)ptr)[1]); return 1; } // Get range with a message long FXRealSlider::onCmdGetRealRange(FXObject*,FXSelector,void* ptr){ ((FXdouble*)ptr)[0]=range[0]; ((FXdouble*)ptr)[1]=range[1]; return 1; } // Pressed LEFT button long FXRealSlider::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXdouble p=pos; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); getApp()->removeTimeout(this,ID_AUTOSLIDE); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; if(options&REALSLIDER_VERTICAL){ if(event->win_yaddTimeout(this,ID_AUTOSLIDE,getApp()->getScrollDelay(),(void*)(FXival)1); p=pos+incr; } else if(event->win_y>(headpos+headsize)){ getApp()->addTimeout(this,ID_AUTOSLIDE,getApp()->getScrollDelay(),(void*)(FXival)-1); p=pos-incr; } else{ dragpoint=event->win_y-headpos; flags|=FLAG_PRESSED; } } else{ if(event->win_xaddTimeout(this,ID_AUTOSLIDE,getApp()->getScrollDelay(),(void*)(FXival)-1); p=pos-incr; } else if(event->win_x>(headpos+headsize)){ getApp()->addTimeout(this,ID_AUTOSLIDE,getApp()->getScrollDelay(),(void*)(FXival)1); p=pos+incr; } else{ dragpoint=event->win_x-headpos; flags|=FLAG_PRESSED; } } if(prange[1]) p=range[1]; if(p!=pos){ setValue(p); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)&pos); } return 1; } return 0; } // Released Left button long FXRealSlider::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ register FXuint flgs=flags; if(isEnabled()){ ungrab(); getApp()->removeTimeout(this,ID_AUTOSLIDE); setValue(pos); // Hop to exact position flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(flgs&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)&pos); } return 1; } return 0; } // Moving long FXRealSlider::onMotion(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint xx,yy,ww,hh,lo,hi,h,travel; register FXdouble p; if(!isEnabled()) return 0; if(flags&FLAG_PRESSED){ yy=border+padtop+2; xx=border+padleft+2; hh=height-(border<<1)-padtop-padbottom-4; ww=width-(border<<1)-padleft-padright-4; if(options&REALSLIDER_VERTICAL){ h=event->win_y-dragpoint; travel=hh-headsize; if(hyy+travel) h=yy+travel; if(h!=headpos){ FXMINMAX(lo,hi,headpos,h); headpos=h; update(border,lo-1,width-(border<<1),hi+headsize+2-lo); } if(travel>0) p=range[0]+((range[1]-range[0])*(yy+travel-h))/travel; else p=range[0]; } else{ h=event->win_x-dragpoint; travel=ww-headsize; if(hxx+travel) h=xx+travel; if(h!=headpos){ FXMINMAX(lo,hi,headpos,h); headpos=h; update(lo-1,border,hi+headsize+2-lo,height-(border<<1)); } if(travel>0) p=range[0]+((range[1]-range[0])*(h-xx))/travel; else p=range[0]; } if(prange[1]) p=range[1]; if(pos!=p){ pos=p; flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)&pos); } return 1; } return 0; } // Pressed middle or right long FXRealSlider::onMiddleBtnPress(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint xx,yy,ww,hh,lo,hi,h,travel; register FXdouble p; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONPRESS,message),ptr)) return 1; dragpoint=headsize/2; yy=border+padtop+2; xx=border+padleft+2; hh=height-(border<<1)-padtop-padbottom-4; ww=width-(border<<1)-padleft-padright-4; flags&=~FLAG_UPDATE; flags|=FLAG_PRESSED; if(options&REALSLIDER_VERTICAL){ h=event->win_y-dragpoint; travel=hh-headsize; if(hyy+travel) h=yy+travel; if(h!=headpos){ FXMINMAX(lo,hi,headpos,h); headpos=h; update(border,lo-1,width-(border<<1),hi+headsize+2-lo); } if(travel>0) p=range[0]+((range[1]-range[0])*(yy+travel-h))/travel; else p=range[0]; } else{ h=event->win_x-dragpoint; travel=ww-headsize; if(hxx+travel) h=xx+travel; if(h!=headpos){ FXMINMAX(lo,hi,headpos,h); headpos=h; update(lo-1,border,hi+headsize+2-lo,height-(border<<1)); } if(travel>0) p=range[0]+((range[1]-range[0])*(h-xx))/travel; else p=range[0]; } if(prange[1]) p=range[1]; if(p!=pos){ pos=p; flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)&pos); } return 1; } return 0; } // Released middle button long FXRealSlider::onMiddleBtnRelease(FXObject*,FXSelector,void* ptr){ register FXuint flgs=flags; if(isEnabled()){ ungrab(); getApp()->removeTimeout(this,ID_AUTOSLIDE); flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; setValue(pos); // Hop to exact position if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONRELEASE,message),ptr)) return 1; if(flgs&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)&pos); } return 1; } return 0; } // Mouse wheel long FXRealSlider::onMouseWheel(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXdouble p=pos+incr*(event->code/120); if(prange[1]) p=range[1]; if(pos!=p){ setValue(p); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)&pos); } return 1; } // Keyboard press long FXRealSlider::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; switch(event->code){ case KEY_Left: case KEY_KP_Left: if(!(options&REALSLIDER_VERTICAL)) goto dec; break; case KEY_Right: case KEY_KP_Right: if(!(options&REALSLIDER_VERTICAL)) goto inc; break; case KEY_Up: case KEY_KP_Up: if(options&REALSLIDER_VERTICAL) goto inc; break; case KEY_Down: case KEY_KP_Down: if(options&REALSLIDER_VERTICAL) goto dec; break; case KEY_plus: case KEY_KP_Add: inc: setValue(pos+incr,true); return 1; case KEY_minus: case KEY_KP_Subtract: dec: setValue(pos-incr,true); return 1; } } return 0; } // Keyboard release long FXRealSlider::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Left: case KEY_KP_Left: case KEY_Right: case KEY_KP_Right: if(!(options&REALSLIDER_VERTICAL)) return 1; break; case KEY_Up: case KEY_KP_Up: case KEY_Down: case KEY_KP_Down: if(options&REALSLIDER_VERTICAL) return 1; break; case KEY_plus: case KEY_KP_Add: case KEY_KP_Subtract: case KEY_minus: return 1; } } return 0; } // The widget lost the grab for some reason long FXRealSlider::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onUngrabbed(sender,sel,ptr); getApp()->removeTimeout(this,ID_AUTOSLIDE); flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; return 1; } // Automatically move slider while holding down mouse long FXRealSlider::onAutoSlide(FXObject*,FXSelector,void* ptr){ register FXint dir=(FXint)(FXival)ptr; register FXdouble p=pos+incr*dir; if(p<=range[0]){ p=range[0]; } else if(p>=range[1]){ p=range[1]; } else{ getApp()->addTimeout(this,ID_AUTOSLIDE,getApp()->getScrollSpeed(),(void*)(FXival)dir); } if(p!=pos){ setValue(p); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)&pos); return 1; } return 0; } // Draw horizontal ticks void FXRealSlider::drawHorzTicks(FXDCWindow& dc,FXint,FXint y,FXint,FXint){ register FXdouble interval=range[1]-range[0]; register FXint travel,offset,p; register FXdouble v,d; if(0.0>1); if(options&REALSLIDER_ARROW_LEFT){ dc.setForeground(hiliteColor); dc.drawLine(x+m,y,x+w-1,y); dc.drawLine(x,y+m,x+m,y); dc.setForeground(shadowColor); dc.drawLine(x+1,y+h-m-1,x+m+1,y+h-1); dc.drawLine(x+m,y+h-2,x+w-1,y+h-2); dc.drawLine(x+w-2,y+1,x+w-2,y+h-1); dc.setForeground(borderColor); dc.drawLine(x,y+h-m-1,x+m,y+h-1); dc.drawLine(x+w-1,y+h-1,x+w-1,y); dc.fillRectangle(x+m,y+h-1,w-m,1); } else if(options&REALSLIDER_ARROW_RIGHT){ dc.setForeground(hiliteColor); dc.drawLine(x,y,x+w-m-1,y); dc.drawLine(x,y+1,x,y+h-1); dc.drawLine(x+w-1,y+m,x+w-m-1,y); #ifndef WIN32 dc.setForeground(shadowColor); dc.drawLine(x+w-2,y+h-m-1,x+w-m-2,y+h-1); dc.drawLine(x+1,y+h-2,x+w-m-1,y+h-2); dc.setForeground(borderColor); dc.drawLine(x+w-1,y+h-m-1,x+w-m-1,y+h-1); dc.drawLine(x,y+h-1,x+w-m-1,y+h-1); #else dc.setForeground(shadowColor); dc.drawLine(x+w-1,y+h-m-2,x+w-m-2,y+h-1); dc.drawLine(x+1,y+h-2,x+w-m-1,y+h-2); dc.setForeground(borderColor); dc.drawLine(x+w,y+h-m-2,x+w-m-1,y+h-1); dc.drawLine(x,y+h-1,x+w-m-1,y+h-1); #endif } else if(options&REALSLIDER_INSIDE_BAR){ drawDoubleRaisedRectangle(dc,x,y,w,h); dc.setForeground(shadowColor); dc.drawLine(x+1,y+m-1,x+w-2,y+m-1); dc.setForeground(hiliteColor); dc.drawLine(x+1,y+m,x+w-2,y+m); } else{ drawDoubleRaisedRectangle(dc,x,y,w,h); } } else{ m=(w>>1); if(options&REALSLIDER_ARROW_UP){ dc.setForeground(hiliteColor); dc.drawLine(x,y+m,x+m,y); dc.drawLine(x,y+m,x,y+h-1); dc.setForeground(shadowColor); dc.drawLine(x+w-1,y+m+1,x+w-m-1,y+1); dc.drawLine(x+w-2,y+m+1,x+w-2,y+h-1); dc.drawLine(x+1,y+h-2,x+w-2,y+h-2); dc.setForeground(borderColor); dc.drawLine(x+w-1,y+m,x+w-m-1,y); dc.drawLine(x+w-1,y+m,x+w-1,y+h-1); dc.fillRectangle(x,y+h-1,w,1); } else if(options&REALSLIDER_ARROW_DOWN){ dc.setForeground(hiliteColor); dc.drawLine(x,y,x+w-1,y); dc.drawLine(x,y+1,x,y+h-m-1); dc.drawLine(x,y+h-m-1,x+m,y+h-1); dc.setForeground(shadowColor); dc.drawLine(x+w-2,y+1,x+w-2,y+h-m-1); dc.drawLine(x+w-1,y+h-m-2,x+w-m-1,y+h-2); dc.setForeground(borderColor); dc.drawLine(x+w-1,y+h-m-1,x+w-m-1,y+h-1); dc.fillRectangle(x+w-1,y,1,h-m); } else if(options&REALSLIDER_INSIDE_BAR){ drawDoubleRaisedRectangle(dc,x,y,w,h); dc.setForeground(shadowColor); dc.drawLine(x+m-1,y+1,x+m-1,y+h-2); dc.setForeground(hiliteColor); dc.drawLine(x+m,y+1,x+m,y+h-1); } else{ drawDoubleRaisedRectangle(dc,x,y,w,h); } } } // Handle repaint long FXRealSlider::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXint tx,ty,hhs=headsize/2; FXint xx,yy,ww,hh; FXDCWindow dc(this,event); // Repaint background dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); // Repaint border drawFrame(dc,0,0,width,height); // Slot placement xx=border+padleft; yy=border+padtop; ww=width-(border<<1)-padleft-padright; hh=height-(border<<1)-padtop-padbottom; FXASSERT(range[0]<=pos && pos<=range[1]); // Draw the slot if(options&REALSLIDER_VERTICAL){ // Adjust slot placement for tickmarks if(options&REALSLIDER_TICKS_LEFT){ xx+=TICKSIZE; ww-=TICKSIZE; } if(options&REALSLIDER_TICKS_RIGHT){ ww-=TICKSIZE; } // Draw slider if(options&REALSLIDER_INSIDE_BAR){ drawDoubleSunkenRectangle(dc,xx,yy,ww,hh); dc.setStipple(STIPPLE_GRAY); dc.setForeground(slotColor); dc.setBackground(baseColor); dc.setFillStyle(FILL_OPAQUESTIPPLED); dc.fillRectangle(xx+2,yy+2,ww-4,hh-4); dc.setFillStyle(FILL_SOLID); if(options&REALSLIDER_TICKS_LEFT) drawVertTicks(dc,border+padleft,yy,ww,hh); if(options&REALSLIDER_TICKS_RIGHT) drawVertTicks(dc,width-padright-border-TICKSIZE,yy,ww,hh); if(isEnabled()) drawSliderHead(dc,xx+2,headpos,ww-4,headsize); } else{ if(options&REALSLIDER_ARROW_LEFT) tx=xx+hhs+(ww-slotsize-hhs)/2; else if(options&REALSLIDER_ARROW_RIGHT) tx=xx+(ww-slotsize-hhs)/2; else tx=xx+(ww-slotsize)/2; drawDoubleSunkenRectangle(dc,tx,yy,slotsize,hh); dc.setForeground(slotColor); dc.fillRectangle(tx+2,yy+2,slotsize-4,hh-4); if(options&REALSLIDER_TICKS_LEFT) drawVertTicks(dc,border+padleft,yy,ww,hh); if(options&REALSLIDER_TICKS_RIGHT) drawVertTicks(dc,width-padright-border-TICKSIZE,yy,ww,hh); if(isEnabled()) drawSliderHead(dc,xx,headpos,ww,headsize); } } else{ // Adjust slot placement for tickmarks if(options&REALSLIDER_TICKS_TOP){ yy+=TICKSIZE; hh-=TICKSIZE; } if(options&REALSLIDER_TICKS_BOTTOM){ hh-=TICKSIZE; } // Draw slider if(options&REALSLIDER_INSIDE_BAR){ drawDoubleSunkenRectangle(dc,xx,yy,ww,hh); dc.setForeground(slotColor); dc.setStipple(STIPPLE_GRAY); dc.setForeground(slotColor); dc.setBackground(baseColor); dc.setFillStyle(FILL_OPAQUESTIPPLED); dc.fillRectangle(xx+2,yy+2,ww-4,hh-4); dc.setFillStyle(FILL_SOLID); if(options&REALSLIDER_TICKS_TOP) drawHorzTicks(dc,xx,border+padtop,ww,hh); if(options&REALSLIDER_TICKS_BOTTOM) drawHorzTicks(dc,xx,height-border-padbottom-TICKSIZE,ww,hh); if(isEnabled()) drawSliderHead(dc,headpos,yy+2,headsize,hh-4); } else{ if(options&REALSLIDER_ARROW_UP) ty=yy+hhs+(hh-slotsize-hhs)/2; else if(options&REALSLIDER_ARROW_DOWN) ty=yy+(hh-slotsize-hhs)/2; else ty=yy+(hh-slotsize)/2; drawDoubleSunkenRectangle(dc,xx,ty,ww,slotsize); dc.setForeground(slotColor); dc.fillRectangle(xx+2,ty+2,ww-4,slotsize-4); if(options&REALSLIDER_TICKS_TOP) drawHorzTicks(dc,xx,border+padtop,ww,hh); if(options&REALSLIDER_TICKS_BOTTOM) drawHorzTicks(dc,xx,height-border-padbottom-TICKSIZE,ww,hh); if(isEnabled()) drawSliderHead(dc,headpos,yy,headsize,hh); } } return 1; } // Set slider range; this also revalidates the position, // and possibly moves the head [even if the position was still OK, // the head might still have to be moved to the exact position]. void FXRealSlider::setRange(FXdouble lo,FXdouble hi,FXbool notify){ if(lo>hi){ fxerror("%s::setRange: trying to set negative range.\n",getClassName()); } if(range[0]!=lo || range[1]!=hi){ range[0]=lo; range[1]=hi; setValue(pos,notify); } } // Set position; this should always cause the head to reflect // the exact [discrete] value representing pos, even if several // head positions may represent the same position! // Also, the minimal amount is repainted, as one sometimes as very // large/wide sliders. void FXRealSlider::setValue(FXdouble p,FXbool notify){ register FXdouble interval=range[1]-range[0]; register FXint travel,lo,hi,h; if(prange[1]) p=range[1]; if(options&REALSLIDER_VERTICAL){ travel=height-(border<<1)-padtop-padbottom-headsize-4; h=height-border-padbottom-2-headsize; if(0tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)&pos);} } } // Get slider options FXuint FXRealSlider::getSliderStyle() const { return (options&REALSLIDER_MASK); } // Set slider options void FXRealSlider::setSliderStyle(FXuint style){ FXuint opts=(options&~REALSLIDER_MASK) | (style&REALSLIDER_MASK); if(options!=opts){ headsize=(opts&REALSLIDER_INSIDE_BAR)?HEADINSIDEBAR:HEADOVERHANGING; options=opts; recalc(); update(); } } // Set head size void FXRealSlider::setHeadSize(FXint hs){ if(headsize!=hs){ headsize=hs; recalc(); update(); } } // Set slot size void FXRealSlider::setSlotSize(FXint bs){ if(slotsize!=bs){ slotsize=bs; recalc(); update(); } } // Set increment void FXRealSlider::setIncrement(FXdouble inc){ incr=inc; } // Set slot color void FXRealSlider::setSlotColor(FXColor clr){ if(slotColor!=clr){ slotColor=clr; update(); } } // Change the delta between ticks void FXRealSlider::setTickDelta(FXdouble dist){ if(dist<0.0) dist=0.0; if(delta!=dist){ delta=dist; if(options&(REALSLIDER_TICKS_TOP|REALSLIDER_TICKS_BOTTOM)){ recalc(); } } } // Save object to stream void FXRealSlider::save(FXStream& store) const { FXFrame::save(store); store << range[0] << range[1]; store << pos; store << incr; store << delta; store << slotColor; store << headsize; store << slotsize; store << help; store << tip; } // Load object from stream void FXRealSlider::load(FXStream& store){ FXFrame::load(store); store >> range[0] >> range[1]; store >> pos; store >> incr; store >> delta; store >> slotColor; store >> headsize; store >> slotsize; store >> help; store >> tip; } // Delete FXRealSlider::~FXRealSlider(){ getApp()->removeTimeout(this,ID_AUTOSLIDE); } } fox1.6-1.6.57/src/FXRealSpinner.cpp000066400000000000000000000450561326741342000166220ustar00rootroot00000000000000/******************************************************************************** * * * R e a l - V a l u e d S p i n n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Bill Baxter. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRealSpinner.cpp,v 1.38.2.1 2006/03/31 21:25:59 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXLabel.h" #include "FXTextField.h" #include "FXArrowButton.h" #include "FXRealSpinner.h" /* Notes: - Based on Lyle's FXSpinner. - Changed to use arrow buttons because getting nice operation with the dial was impossible. - Wheel mouse offers incrementation/decrementation in nice multiples of increment, makes it very quick to get a value. */ #define BUTTONWIDTH 14 #define REALSPINNER_MASK (REALSPIN_CYCLIC|REALSPIN_NOTEXT|REALSPIN_NOMAX|REALSPIN_NOMIN|REALSPIN_LOG) using namespace FX; /*******************************************************************************/ namespace FX { // Message map FXDEFMAP(FXRealSpinner) FXRealSpinnerMap[]={ FXMAPFUNC(SEL_KEYPRESS,0,FXRealSpinner::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXRealSpinner::onKeyRelease), FXMAPFUNC(SEL_FOCUS_SELF,0,FXRealSpinner::onFocusSelf), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_ENTRY,FXRealSpinner::onCmdEntry), FXMAPFUNC(SEL_CHANGED,FXRealSpinner::ID_ENTRY,FXRealSpinner::onChgEntry), FXMAPFUNC(SEL_MOUSEWHEEL,FXRealSpinner::ID_ENTRY,FXRealSpinner::onWheelEntry), FXMAPFUNC(SEL_UPDATE,FXRealSpinner::ID_INCREMENT,FXRealSpinner::onUpdIncrement), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_INCREMENT,FXRealSpinner::onCmdIncrement), FXMAPFUNC(SEL_UPDATE,FXRealSpinner::ID_DECREMENT,FXRealSpinner::onUpdDecrement), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_DECREMENT,FXRealSpinner::onCmdDecrement), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_SETVALUE,FXRealSpinner::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_SETINTVALUE,FXRealSpinner::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_GETINTVALUE,FXRealSpinner::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_SETINTRANGE,FXRealSpinner::onCmdSetIntRange), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_GETINTRANGE,FXRealSpinner::onCmdGetIntRange), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_SETREALVALUE,FXRealSpinner::onCmdSetRealValue), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_GETREALVALUE,FXRealSpinner::onCmdGetRealValue), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_SETREALRANGE,FXRealSpinner::onCmdSetRealRange), FXMAPFUNC(SEL_COMMAND,FXRealSpinner::ID_GETREALRANGE,FXRealSpinner::onCmdGetRealRange), }; // Object implementation FXIMPLEMENT(FXRealSpinner,FXPacker,FXRealSpinnerMap,ARRAYNUMBER(FXRealSpinnerMap)) // Construct spinner out of two buttons and a text field FXRealSpinner::FXRealSpinner(){ flags|=FLAG_ENABLED; textField=(FXTextField*)-1L; upButton=(FXArrowButton*)-1L; downButton=(FXArrowButton*)-1L; range[0]=-DBL_MAX; range[1]= DBL_MAX; incr=1.0; gran=0.0; pos=0.0; } // Construct spinner out of dial and a text field FXRealSpinner::FXRealSpinner(FXComposite *p,FXint cols,FXObject *tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXPacker(p,opts,x,y,w,h,0,0,0,0,0,0){ flags|=FLAG_ENABLED; target=tgt; message=sel; textField=new FXTextField(this,cols,this,ID_ENTRY,TEXTFIELD_REAL|JUSTIFY_RIGHT,0,0,0,0,pl,pr,pt,pb); upButton=new FXArrowButton(this,this,FXRealSpinner::ID_INCREMENT,FRAME_RAISED|FRAME_THICK|ARROW_UP|ARROW_REPEAT, 0,0,0,0, 0,0,0,0); downButton=new FXArrowButton(this,this,FXRealSpinner::ID_DECREMENT,FRAME_RAISED|FRAME_THICK|ARROW_DOWN|ARROW_REPEAT, 0,0,0,0, 0,0,0,0); range[0]=(options&REALSPIN_NOMIN) ? -DBL_MAX : 0.0; range[1]=(options&REALSPIN_NOMAX) ? DBL_MAX : 100.0; textField->setText("0"); incr=1.0; gran=0.0; pos=0.0; } // Get default width FXint FXRealSpinner::getDefaultWidth(){ FXint tw=0; if(!(options&REALSPIN_NOTEXT)) tw=textField->getDefaultWidth(); return tw+BUTTONWIDTH+(border<<1); } // Get default height FXint FXRealSpinner::getDefaultHeight(){ return textField->getDefaultHeight()+(border<<1); } // Enable the widget void FXRealSpinner::enable(){ if(!(flags&FLAG_ENABLED)){ FXPacker::enable(); textField->enable(); upButton->enable(); downButton->enable(); } } // Disable the widget void FXRealSpinner::disable(){ if(flags&FLAG_ENABLED){ FXPacker::disable(); textField->disable(); upButton->disable(); downButton->disable(); } } // Recompute layout void FXRealSpinner::layout(){ FXint buttonWidth,buttonHeight,textWidth,textHeight; textHeight=height-2*border; buttonHeight=textHeight>>1; // Only the dial:- place dial to take up the whole space! if(options&REALSPIN_NOTEXT){ buttonWidth=width-2*border; upButton->position(border,border,buttonWidth,buttonHeight); downButton->position(border,height-buttonHeight-border,buttonWidth,buttonHeight); } // Dial plus the text; dial is default width, text stretches to fill the rest else{ buttonWidth=BUTTONWIDTH; textWidth=width-buttonWidth-2*border; textField->position(border,border,textWidth,textHeight); upButton->position(border+textWidth,border,buttonWidth,buttonHeight); downButton->position(border+textWidth,height-buttonHeight-border,buttonWidth,buttonHeight); } flags&=~FLAG_DIRTY; } // Respond to increment message long FXRealSpinner::onUpdIncrement(FXObject* sender,FXSelector,void*){ if(isEnabled() && ((options&REALSPIN_CYCLIC) || (poshandle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Respond to increment message long FXRealSpinner::onCmdIncrement(FXObject*,FXSelector,void*){ if(isEnabled() && isEditable()){ increment(TRUE); return 1; } return 0; } // Disable decrement if at low end already long FXRealSpinner::onUpdDecrement(FXObject* sender,FXSelector,void*){ if(isEnabled() && ((options&REALSPIN_CYCLIC) || (range[0]handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Respond to decrement message long FXRealSpinner::onCmdDecrement(FXObject*,FXSelector,void*){ if(isEnabled() && isEditable()){ decrement(TRUE); return 1; } return 0; } // Rolling mouse wheel in text field behaves as if inside dial long FXRealSpinner::onWheelEntry(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && isEditable()){ if(((FXEvent*)ptr)->code>0){ if(event->state&CONTROLMASK) incrementByAmount(incr*10.0,TRUE); else increment(TRUE); } else{ if(event->state&CONTROLMASK) decrementByAmount(incr*10.0,TRUE); else decrement(TRUE); } return 1; } return 0; } // Text field changed long FXRealSpinner::onChgEntry(FXObject*,FXSelector,void*){ register FXdouble value=FXDoubleVal(textField->getText()); if(valuerange[1]) value=range[1]; if(value!=pos){ pos=value; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)&pos); } return 1; } // Text field command long FXRealSpinner::onCmdEntry(FXObject*,FXSelector,void*){ textField->setText(FXStringVal(pos)); // Put back adjusted value if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)&pos); return 1; } // Keyboard press long FXRealSpinner::onKeyPress(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; switch(event->code){ case KEY_Up: case KEY_KP_Up: if(isEditable()){ increment(TRUE); } else{ getApp()->beep(); } return 1; case KEY_Down: case KEY_KP_Down: if(isEditable()){ decrement(TRUE); } else{ getApp()->beep(); } return 1; default: return textField->handle(sender,sel,ptr); } } return 0; } // Keyboard release long FXRealSpinner::onKeyRelease(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Up: case KEY_KP_Up: case KEY_Down: case KEY_KP_Down: return 1; default: return textField->handle(sender,sel,ptr); } } return 0; } // Force focus on the text field long FXRealSpinner::onFocusSelf(FXObject* sender,FXSelector,void* ptr){ return textField->tryHandle(sender,FXSEL(SEL_FOCUS_SELF,0),ptr); } // Update value from a message long FXRealSpinner::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setValue((FXdouble)(FXival)ptr); return 1; } // Update value from a message long FXRealSpinner::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setValue((FXdouble) *((FXint*)ptr)); return 1; } // Obtain value from spinner long FXRealSpinner::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=(FXint)getValue(); return 1; } // Update range from a message long FXRealSpinner::onCmdSetIntRange(FXObject*,FXSelector,void* ptr){ setRange((FXdouble)((FXint*)ptr)[0],(FXdouble)((FXint*)ptr)[1]); return 1; } // Get range with a message long FXRealSpinner::onCmdGetIntRange(FXObject*,FXSelector,void* ptr){ ((FXint*)ptr)[0]=(FXint)range[0]; ((FXint*)ptr)[1]=(FXint)range[1]; return 1; } // Update value from a message long FXRealSpinner::onCmdSetRealValue(FXObject*,FXSelector,void* ptr){ setValue(*((FXdouble*)ptr)); return 1; } // Obtain value from spinner long FXRealSpinner::onCmdGetRealValue(FXObject*,FXSelector,void* ptr){ *((FXdouble*)ptr)=getValue(); return 1; } // Update range from a message long FXRealSpinner::onCmdSetRealRange(FXObject*,FXSelector,void* ptr){ setRange(((FXdouble*)ptr)[0],((FXdouble*)ptr)[1]); return 1; } // Get range with a message long FXRealSpinner::onCmdGetRealRange(FXObject*,FXSelector,void* ptr){ ((FXdouble*)ptr)[0]=range[0]; ((FXdouble*)ptr)[1]=range[1]; return 1; } // Increment spinner void FXRealSpinner::increment(FXbool notify){ incrementByAmount(incr,notify); } #if defined(WIN32) || defined(__sgi) || defined(__sun) || defined(__alpha) double round(double x){ return (x >= 0) ? floor(x+0.5) : ceil(x-0.5); } #endif // Increment spinner by certain amount void FXRealSpinner::incrementByAmount(FXdouble amount,FXbool notify){ if(range[0]hi){ fxerror("%s::setRange: trying to set negative range.\n",getClassName()); } if(range[0]!=lo || range[1]!=hi){ range[0]=lo; range[1]=hi; setValue(pos,notify); } } // Set new value void FXRealSpinner::setValue(FXdouble value,FXbool notify){ if(valuerange[1]) value=range[1]; if(pos!=value){ textField->setText(FXStringVal(value)); pos=value; if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)&pos);} } } // Change value increment void FXRealSpinner::setIncrement(FXdouble inc){ if(inc<=0.0){ fxerror("%s::setIncrement: negative or zero increment specified.\n",getClassName()); } incr=inc; } // Change spinner granularity void FXRealSpinner::setGranularity(FXdouble gr){ if(gr<0.0){ fxerror("%s::setGranularity: negative granularity specified.\n",getClassName()); } gran=gr; } // True if text supposed to be visible FXbool FXRealSpinner::isTextVisible() const { return textField->shown(); } // Change text visibility void FXRealSpinner::setTextVisible(FXbool shown){ FXuint opts=shown?(options&~REALSPIN_NOTEXT):(options|REALSPIN_NOTEXT); if(options!=opts){ options=opts; recalc(); } } // Set the font used in the text field| void FXRealSpinner::setFont(FXFont *fnt){ textField->setFont(fnt); } // Return the font used in the text field FXFont *FXRealSpinner::getFont() const { return textField->getFont(); } // Set help text void FXRealSpinner::setHelpText(const FXString& text){ textField->setHelpText(text); upButton->setHelpText(text); downButton->setHelpText(text); } // Get help text const FXString& FXRealSpinner::getHelpText() const { return textField->getHelpText(); } // Set tip text void FXRealSpinner::setTipText(const FXString& text){ textField->setTipText(text); upButton->setTipText(text); downButton->setTipText(text); } // Get tip text const FXString& FXRealSpinner::getTipText() const { return textField->getTipText(); } // Change spinner style void FXRealSpinner::setSpinnerStyle(FXuint style){ FXuint opts=(options&~REALSPINNER_MASK) | (style&REALSPINNER_MASK); if(options!=opts){ if(opts&REALSPIN_NOMIN) range[0]=-DBL_MAX; if(opts&REALSPIN_NOMAX) range[1]=DBL_MAX; options=opts; recalc(); } } // Get spinner style FXuint FXRealSpinner::getSpinnerStyle() const { return (options&REALSPINNER_MASK); } // Allow editing of the text field void FXRealSpinner::setEditable(FXbool edit){ textField->setEditable(edit); } // Return TRUE if text field is editable FXbool FXRealSpinner::isEditable() const { return textField->isEditable(); } // Change color of the up arrow void FXRealSpinner::setUpArrowColor(FXColor clr){ upButton->setArrowColor(clr); } // Return color of the up arrow FXColor FXRealSpinner::getUpArrowColor() const { return upButton->getArrowColor(); } // Change color of the down arrow void FXRealSpinner::setDownArrowColor(FXColor clr){ downButton->setArrowColor(clr); } // Return color of the the down arrow FXColor FXRealSpinner::getDownArrowColor() const { return downButton->getArrowColor(); } // Change text color void FXRealSpinner::setTextColor(FXColor clr){ textField->setTextColor(clr); } // Return text color FXColor FXRealSpinner::getTextColor() const { return textField->getTextColor(); } // Change selected background color void FXRealSpinner::setSelBackColor(FXColor clr){ textField->setSelBackColor(clr); } // Return selected background color FXColor FXRealSpinner::getSelBackColor() const { return textField->getSelBackColor(); } // Change selected text color void FXRealSpinner::setSelTextColor(FXColor clr){ textField->setSelTextColor(clr); } // Return selected text color FXColor FXRealSpinner::getSelTextColor() const { return textField->getSelTextColor(); } // Changes the cursor color void FXRealSpinner::setCursorColor(FXColor clr){ textField->setCursorColor(clr); } // Return the cursor color FXColor FXRealSpinner::getCursorColor() const { return textField->getCursorColor(); } // Change number of columns void FXRealSpinner::setNumColumns(FXint ncols){ textField->setNumColumns(ncols); } // Return number of columns FXint FXRealSpinner::getNumColumns() const { return textField->getNumColumns(); } // Save object to stream void FXRealSpinner::save(FXStream& store) const { FXPacker::save(store); store << textField; store << upButton; store << downButton; store << range[0] << range[1]; store << incr; store << gran; store << pos; } // Load object from stream void FXRealSpinner::load(FXStream& store){ FXPacker::load(store); store >> textField; store >> upButton; store >> downButton; store >> range[0] >> range[1]; store >> incr; store >> gran; store >> pos; } // Destruct spinner:- trash it! FXRealSpinner::~FXRealSpinner(){ textField=(FXTextField*)-1L; upButton=(FXArrowButton*)-1L; downButton=(FXArrowButton*)-1L; } } fox1.6-1.6.57/src/FXRecentFiles.cpp000066400000000000000000000160771326741342000166040ustar00rootroot00000000000000/******************************************************************************** * * * R e c e n t F i l e s L i s t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRecentFiles.cpp,v 1.36 2006/01/22 17:58:39 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXWindow.h" #include "FXRecentFiles.h" /* Notes: - Use the auto-hide or auto-gray feature to hide menus which are connected to the FXRecentFiles class. - Default constructor should probably be deprecated in applications. */ using namespace FX; /*******************************************************************************/ namespace FX { // Message map FXDEFMAP(FXRecentFiles) FXRecentFilesMap[] = { FXMAPFUNC(SEL_UPDATE,FXRecentFiles::ID_ANYFILES,FXRecentFiles::onUpdAnyFiles), FXMAPFUNC(SEL_UPDATE,FXRecentFiles::ID_CLEAR,FXRecentFiles::onUpdAnyFiles), FXMAPFUNC(SEL_COMMAND,FXRecentFiles::ID_CLEAR,FXRecentFiles::onCmdClear), FXMAPFUNCS(SEL_COMMAND,FXRecentFiles::ID_FILE_1,FXRecentFiles::ID_FILE_10,FXRecentFiles::onCmdFile), FXMAPFUNCS(SEL_UPDATE,FXRecentFiles::ID_FILE_1,FXRecentFiles::ID_FILE_10,FXRecentFiles::onUpdFile), }; // Class implementation FXIMPLEMENT(FXRecentFiles,FXObject,FXRecentFilesMap,ARRAYNUMBER(FXRecentFilesMap)) // Serialization FXRecentFiles::FXRecentFiles():app(FXApp::instance()),target(NULL),message(0),group("Recent Files"),maxfiles(10){ } // Make new Recent Files group with default group FXRecentFiles::FXRecentFiles(FXApp* a):app(a),target(NULL),message(0),group("Recent Files"),maxfiles(10){ } // Make new Recent Files group FXRecentFiles::FXRecentFiles(FXApp* a,const FXString& gp,FXObject *tgt,FXSelector sel):app(a),target(tgt),message(sel),group(gp),maxfiles(10){ } // Obtain the filename at index FXString FXRecentFiles::getFile(FXint index) const { FXchar key[20]; sprintf(key,"FILE%d",index); return app->reg().readStringEntry(group.text(),key,FXString::null); } // Change the filename at index void FXRecentFiles::setFile(FXint index,const FXString& filename){ FXchar key[20]; sprintf(key,"FILE%d",index); app->reg().writeStringEntry(group.text(),key,filename.text()); } // Append a file; its added to the top of the list, and everything else // is moved down the list one notch; the last one is dropped from the list. void FXRecentFiles::appendFile(const FXString& filename){ FXString newname=filename; FXString oldname; FXchar key[20]; FXint i=1,j=1; do{ do{ sprintf(key,"FILE%d",j++); oldname=app->reg().readStringEntry(group.text(),key,NULL); } while(oldname==filename); sprintf(key,"FILE%d",i++); app->reg().writeStringEntry(group.text(),key,newname.text()); newname=oldname; } while(!oldname.empty() && i<=maxfiles); } // Remove a file void FXRecentFiles::removeFile(const FXString& filename){ FXchar key[20]; FXString name; FXint i=1,j=1; do{ sprintf(key,"FILE%d",i++); name=app->reg().readStringEntry(group.text(),key,NULL); app->reg().deleteEntry(group.text(),key); if(name.empty()) break; if(name!=filename){ sprintf(key,"FILE%d",j++); app->reg().writeStringEntry(group.text(),key,name.text()); } } while(i<=maxfiles); } // Remove all files from the list void FXRecentFiles::clear(){ app->reg().deleteSection(group.text()); } // Clear the files list long FXRecentFiles::onCmdClear(FXObject*,FXSelector,void*){ clear(); return 1; } // User clicks on one of the file names long FXRecentFiles::onCmdFile(FXObject*,FXSelector sel,void*){ const FXchar *filename; FXchar key[20]; if(target){ sprintf(key,"FILE%d",(FXSELID(sel)-ID_FILE_1+1)); filename=app->reg().readStringEntry(group.text(),key,NULL); if(filename){ target->handle(this,FXSEL(SEL_COMMAND,message),(void*)filename); } } return 1; } // Update handler for same long FXRecentFiles::onUpdFile(FXObject *sender,FXSelector sel,void*){ FXint which=FXSELID(sel)-ID_FILE_1+1; const FXchar *filename; FXString string; FXchar key[20]; sprintf(key,"FILE%d",which); filename=app->reg().readStringEntry(group.text(),key,NULL); if(filename){ FXString string; if(which<10) string.format("&%d %s",which,filename); else string.format("1&0 %s",filename); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETSTRINGVALUE),(void*)&string); sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SHOW),NULL); } else{ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_HIDE),NULL); } return 1; } // Show or hide depending on whether there are any files long FXRecentFiles::onUpdAnyFiles(FXObject *sender,FXSelector,void*){ if(app->reg().readStringEntry(group.text(),"FILE1",NULL)) sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SHOW),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_HIDE),NULL); return 1; } // Save data void FXRecentFiles::save(FXStream& store) const { FXObject::save(store); store << app; store << target; store << message; store << group; store << maxfiles; } // Load data void FXRecentFiles::load(FXStream& store){ FXObject::load(store); store >> app; store >> target; store >> message; store >> group; store >> maxfiles; } // Destructor FXRecentFiles::~FXRecentFiles(){ target=(FXObject*)-1L; } } fox1.6-1.6.57/src/FXRectangle.cpp000066400000000000000000000115411326741342000162740ustar00rootroot00000000000000/******************************************************************************** * * * R e c t a n g l e C l a s s * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRectangle.cpp,v 1.16 2006/01/22 17:58:39 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxpriv.h" #include "FXHash.h" #include "FXStream.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" using namespace FX; /*******************************************************************************/ namespace FX { // Fast inlines static inline FXshort _max(FXshort a,FXshort b){ return a>b?a:b; } static inline FXshort _min(FXshort a,FXshort b){ return a>(FXStream& store,FXRectangle& r){ store >> r.x >> r.y >> r.w >> r.h; return store; } } fox1.6-1.6.57/src/FXRegion.cpp000066400000000000000000000210711326741342000156120ustar00rootroot00000000000000/******************************************************************************** * * * C l i p p i n g R e g i o n * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRegion.cpp,v 1.31 2006/01/22 17:58:39 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegion.h" /* Notes: - Add some more ways to create regions */ using namespace FX; /*******************************************************************************/ namespace FX { // Construct new empty region FXRegion::FXRegion(){ #ifndef WIN32 region=XCreateRegion(); #else region=(void*)CreateRectRgn(0,0,0,0); #endif } // Construct rectangle region FXRegion::FXRegion(FXint x,FXint y,FXint w,FXint h){ #ifndef WIN32 XRectangle r; r.x=x; r.y=y; r.width=w; r.height=h; region=XCreateRegion(); XUnionRectWithRegion(&r,(Region)region,(Region)region); #else region=(void*)CreateRectRgn(x,y,x+w,y+h); #endif } // Construct new region from rectangle rect FXRegion::FXRegion(const FXRectangle& rect){ #ifndef WIN32 region=XCreateRegion(); XUnionRectWithRegion((XRectangle*)&rect,(Region)region,(Region)region); #else region=(void*)CreateRectRgn(rect.x,rect.y,rect.x+rect.w,rect.y+rect.h); #endif } // Construct polygon region FXRegion::FXRegion(const FXPoint* points,FXuint npoints,bool winding){ #ifndef WIN32 region=XPolygonRegion((XPoint*)points,npoints,winding?WindingRule:EvenOddRule); #else register FXuint i; POINT pts[1024]; for(i=0; i. bool FXRegion::contains(FXint x,FXint y,FXint w,FXint h) const { #ifndef WIN32 return XRectInRegion((Region)region,x,y,w,h); #else RECT rect; rect.left = x; rect.top = y; rect.right = x + w; rect.bottom = y + h; return region && RectInRegion((HRGN)region,&rect); #endif } // Return bounding box FXRectangle FXRegion::bounds() const { FXRectangle result; #ifndef WIN32 XClipBox((Region)region,(XRectangle*)&result); #else RECT rect; GetRgnBox((HRGN)region,&rect); result.x=(FXshort)rect.left; result.y=(FXshort)rect.top; result.w=(FXshort)(rect.right-rect.left); result.h=(FXshort)(rect.bottom-rect.top); #endif return result; } // Offset region by dx,dy FXRegion& FXRegion::offset(FXint dx,FXint dy){ #ifndef WIN32 XOffsetRegion((Region)region,dx,dy); #else OffsetRgn((HRGN)region,dx,dy); #endif return *this; } // Return TRUE if region equal to this one bool FXRegion::operator==(const FXRegion& r) const { #ifndef WIN32 return XEqualRegion((Region)region,(Region)r.region); #else return EqualRgn((HRGN)region,(HRGN)r.region)!=0; #endif } // Return TRUE if region not equal to this one bool FXRegion::operator!=(const FXRegion& r) const { #ifndef WIN32 return !XEqualRegion((Region)region,(Region)r.region); #else return EqualRgn((HRGN)region,(HRGN)r.region)==0; #endif } // Union region r with this one FXRegion& FXRegion::operator+=(const FXRegion& r){ #ifndef WIN32 Region res=XCreateRegion(); XUnionRegion((Region)region,(Region)r.region,res); XDestroyRegion((Region)region); region=res; #else CombineRgn((HRGN)region,(HRGN)region,(HRGN)r.region,RGN_OR); #endif return *this; } // Intersect region r with this one FXRegion& FXRegion::operator*=(const FXRegion& r){ #ifndef WIN32 Region res=XCreateRegion(); XIntersectRegion((Region)region,(Region)r.region,res); XDestroyRegion((Region)region); region=res; #else CombineRgn((HRGN)region,(HRGN)region,(HRGN)r.region,RGN_AND); #endif return *this; } // Substract region r from this one FXRegion& FXRegion::operator-=(const FXRegion& r){ #ifndef WIN32 Region res=XCreateRegion(); XSubtractRegion((Region)region,(Region)r.region,res); XDestroyRegion((Region)region); region=res; #else CombineRgn((HRGN)region,(HRGN)region,(HRGN)r.region,RGN_DIFF); #endif return *this; } // Xor region r with this one FXRegion& FXRegion::operator^=(const FXRegion& r){ #ifndef WIN32 Region res=XCreateRegion(); XXorRegion((Region)region,(Region)r.region,res); XDestroyRegion((Region)region); region=res; #else CombineRgn((HRGN)region,(HRGN)region,(HRGN)r.region,RGN_XOR); #endif return *this; } // Union region r with this one FXRegion FXRegion::operator+(const FXRegion& r) const { FXRegion res; #ifndef WIN32 XUnionRegion((Region)region,(Region)r.region,(Region)res.region); #else CombineRgn((HRGN)res.region,(HRGN)region,(HRGN)r.region,RGN_OR); #endif return res; } // Intersect region r with this one FXRegion FXRegion::operator*(const FXRegion& r) const { FXRegion res; #ifndef WIN32 XIntersectRegion((Region)region,(Region)r.region,(Region)res.region); #else CombineRgn((HRGN)res.region,(HRGN)region,(HRGN)r.region,RGN_AND); #endif return res; } // Subtract region r from this one FXRegion FXRegion::operator-(const FXRegion& r) const { FXRegion res; #ifndef WIN32 XSubtractRegion((Region)region,(Region)r.region,(Region)res.region); #else CombineRgn((HRGN)res.region,(HRGN)region,(HRGN)r.region,RGN_DIFF); #endif return res; } // Xor region r with this one FXRegion FXRegion::operator^(const FXRegion& r) const { FXRegion res; #ifndef WIN32 XXorRegion((Region)region,(Region)r.region,(Region)res.region); #else CombineRgn((HRGN)res.region,(HRGN)region,(HRGN)r.region,RGN_XOR); #endif return res; } // Reset region to empty void FXRegion::reset(){ #ifndef WIN32 XDestroyRegion((Region)region); region=XCreateRegion(); #else DeleteObject((HRGN)region); region=(void*)CreateRectRgn(0,0,0,0); #endif } // Destroy region FXRegion::~FXRegion(){ #ifndef WIN32 XDestroyRegion((Region)region); #else DeleteObject((HRGN)region); #endif } } fox1.6-1.6.57/src/FXRegistry.cpp000066400000000000000000000433301326741342000162010ustar00rootroot00000000000000/******************************************************************************** * * * R e g i s t r y C l a s s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRegistry.cpp,v 1.61 2006/01/22 17:58:39 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXString.h" #include "FXSystem.h" #include "FXPath.h" #include "FXStat.h" #include "FXFile.h" #include "FXDir.h" #include "FXStringDict.h" #include "FXRegistry.h" /* Notes: - Default directories for registry files where search for the FOX settings database is tried: 1 $FOXDIR 2 /etc/foxrc /usr/lib/foxrc /usr/local/lib/foxrc 3 $PATH/foxrc 4 ~/.foxrc - The latter one is writable, and also the one that overrides all other values. - Search $PATH for registry directory [$PATH/VendorKey/AppKey] or [$PATH/AppKey] - Compile-time #define for registry directories [for global settings]. - Registry is organized as follows: DESKTOP Registry file common to all FOX applications, from all vendors Vendor/Vendor Registry file common to all applications from Vendor Vendor/Application Registry file for Application from Vendor Application Registry file for Application, if no Vendor specified Rationale: 1) When installing an application, simply copy ``seed'' registry files in the appropriate places; having a subdirectory Vendor prevents clobbering other people's registry files, even if their application has the same name. 2) System-wide registry files are, as a matter of principle, read-only. 3) System registry files are loaded first, then per-user registry files are loaded on top of that. 4) Registry files loaded later will take precedence over those loaded earlier; i.e. key/value pairs in a later file will override a key/value pair with the same key loaded earlier. 5) The exception to the rule is that a key/value pair will not be overridden if the value of the key has changed since loading it. In other words, changes will persist. 6) An application reads files in the order of system: (DESKTOP, Vendor/Vendor, Vendor/App), then user: (DESKTOP, Vendor/Vendor, Vendor/App). 7) All changed entries are written to the per-user directory. An application starts by reading the registry files, runs for a while, then at the end writes the settings back out to the per-user registry files. It will ONLY write those entries which (a) have been changed, or (b) were previously read from the same per-user registry files. - Need ability to read/write DESKTOP, Vendor/Vendor, Vendor/Application registry, for both user as well as system-wide settings. This is primarily important for installation programs. */ #define MAXNAME 200 #define MAXVALUE 2000 #ifndef REGISTRYPATH #ifndef WIN32 #define REGISTRYPATH "/etc:/usr/lib:/usr/local/lib" #else #define REGISTRYPATH "\\WINDOWS\\foxrc" #endif #endif #define DESKTOP "Desktop" using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXRegistry,FXSettings,NULL,0) // Make registry object FXRegistry::FXRegistry(const FXString& akey,const FXString& vkey):applicationkey(akey),vendorkey(vkey){ #ifndef WIN32 ascii=true; #else ascii=false; #endif } // Read registry bool FXRegistry::read(){ FXString dirname; register bool ok=false; #ifdef WIN32 // Either file based or system registry for WIN32 if(ascii){ FXTRACE((100,"Reading from file based settings database.\n")); // Try get location from FOXDIR environment variable dirname=getenv("FOXDIR"); if(!dirname.empty()){ FXTRACE((100,"Found registry %s in $FOXDIR.\n",dirname.text())); ok=readFromDir(dirname,false); } // Try search along REGISTRYPATH if not specified explicitly if(!ok){ dirname=FXPath::search(REGISTRYPATH,"foxrc"); if(!dirname.empty()){ FXTRACE((100,"Found registry %s in REGISTRYPATH.\n",dirname.text())); ok=readFromDir(dirname,false); } } // Try search along PATH if still not found if(!ok){ dirname=FXPath::search(FXSystem::getExecPath(),"foxrc"); if(!dirname.empty()){ FXTRACE((100,"Found registry %s in $PATH.\n",dirname.text())); ok=readFromDir(dirname,false); } } // Get path to per-user settings directory dirname=FXSystem::getEnvironment("USERPROFILE")+PATHSEPSTRING "foxrc"; // Then read per-user settings; overriding system-wide ones if(readFromDir(dirname,true)) ok=true; } else{ FXTRACE((100,"Reading from registry HKEY_LOCAL_MACHINE.\n")); // Load system-wide resources first if(readFromRegistry(HKEY_LOCAL_MACHINE,false)) ok=true; FXTRACE((100,"Reading from registry HKEY_CURRENT_USER.\n")); // Now any modified resources for current user if(readFromRegistry(HKEY_CURRENT_USER,true)) ok=true; } #else // File based registry for UNIX // Try get location from FOXDIR environment variable dirname=getenv("FOXDIR"); if(!dirname.empty()){ FXTRACE((100,"Found registry %s in $FOXDIR.\n",dirname.text())); ok=readFromDir(dirname,false); } // Try search along REGISTRYPATH if not specified explicitly if(!ok){ dirname=FXPath::search(REGISTRYPATH,"foxrc"); if(!dirname.empty()){ FXTRACE((100,"Found registry %s in REGISTRYPATH.\n",dirname.text())); ok=readFromDir(dirname,false); } } // Try search along PATH if still not found if(!ok){ dirname=FXPath::search(FXSystem::getExecPath(),"foxrc"); if(!dirname.empty()){ FXTRACE((100,"Found registry %s in $PATH.\n",dirname.text())); ok=readFromDir(dirname,false); } } // Get path to per-user settings directory dirname=FXSystem::getHomeDirectory()+PATHSEPSTRING ".foxrc"; // Then read per-user settings; overriding system-wide ones if(readFromDir(dirname,true)) ok=true; #endif return ok; } // Try read registry from directory bool FXRegistry::readFromDir(const FXString& dirname,bool mark){ bool ok=false; // Directory is empty? if(!dirname.empty()){ // First try to load desktop registry #ifndef WIN32 if(parseFile(dirname+PATHSEPSTRING DESKTOP,false)) ok=true; #else if(parseFile(dirname+PATHSEPSTRING DESKTOP ".ini",false)) ok=true; #endif // Have vendor key if(!vendorkey.empty()){ #ifndef WIN32 if(parseFile(dirname+PATHSEPSTRING+vendorkey+PATHSEPSTRING+vendorkey,false)) ok=true; #else if(parseFile(dirname+PATHSEPSTRING+vendorkey+PATHSEPSTRING+vendorkey+".ini",false)) ok=true; #endif // Have application key if(!applicationkey.empty()){ #ifndef WIN32 if(parseFile(dirname+PATHSEPSTRING+vendorkey+PATHSEPSTRING+applicationkey,mark)) ok=true; #else if(parseFile(dirname+PATHSEPSTRING+vendorkey+PATHSEPSTRING+applicationkey+".ini",mark)) ok=true; #endif } } // No vendor key else{ // Have application key if(!applicationkey.empty()){ #ifndef WIN32 if(parseFile(dirname+PATHSEPSTRING+applicationkey,mark)) ok=true; #else if(parseFile(dirname+PATHSEPSTRING+applicationkey+".ini",mark)) ok=true; #endif } } } return ok; } #ifdef WIN32 // Read from Windows Registry bool FXRegistry::readFromRegistry(void* hRootKey,bool mark){ HKEY hSoftKey,hOrgKey; bool ok=false; // Open Software registry section if(RegOpenKeyExA((HKEY)hRootKey,"Software",0,KEY_READ,&hSoftKey)==ERROR_SUCCESS){ // Read Software\Desktop if(readFromRegistryGroup(hSoftKey,DESKTOP)) ok=true; // Have vendor key if(!vendorkey.empty()){ // Open Vendor registry sub-section if(RegOpenKeyExA(hSoftKey,vendorkey.text(),0,KEY_READ,&hOrgKey)==ERROR_SUCCESS){ // Read Software\Vendor\Vendor if(readFromRegistryGroup(hOrgKey,vendorkey.text())) ok=true; // Have application key if(!applicationkey.empty()){ // Read Software\Vendor\Application if(readFromRegistryGroup(hOrgKey,applicationkey.text(),mark)) ok=true; } RegCloseKey(hOrgKey); } } // No vendor key else{ // Have application key if(!applicationkey.empty()){ // Read Software\Application if(readFromRegistryGroup(hSoftKey,applicationkey.text(),mark)) ok=true; } } RegCloseKey(hSoftKey); } return ok; } // Read from given group bool FXRegistry::readFromRegistryGroup(void* org,const char* groupname,bool mark){ FXchar section[MAXNAME],name[MAXNAME],value[MAXVALUE]; DWORD sectionsize,sectionindex,namesize,valuesize,index,type; HKEY groupkey,sectionkey; FILETIME writetime; FXStringDict *group; if(RegOpenKeyExA((HKEY)org,groupname,0,KEY_READ,&groupkey)==ERROR_SUCCESS){ sectionindex=0; sectionsize=MAXNAME; FXTRACE((100,"Reading registry group %s\n",groupname)); while(RegEnumKeyExA(groupkey,sectionindex,section,§ionsize,NULL,NULL,NULL,&writetime)==ERROR_SUCCESS){ group=insert(section); FXTRACE((100,"[%s]\n",section)); if(RegOpenKeyExA(groupkey,section,0,KEY_READ,§ionkey)==ERROR_SUCCESS){ index=0; namesize=MAXNAME; valuesize=MAXVALUE; while(RegEnumValueA(sectionkey,index,name,&namesize,NULL,&type,(BYTE*)value,&valuesize)!=ERROR_NO_MORE_ITEMS){ FXASSERT(type==REG_SZ); FXTRACE((100,"%s=%s\n",name,value)); group->replace(name,value,mark); namesize=MAXNAME; valuesize=MAXVALUE; index++; } RegCloseKey(sectionkey); } sectionsize=MAXNAME; sectionindex++; } RegCloseKey(groupkey); return true; } return false; } #endif // Write registry bool FXRegistry::write(){ FXString pathname,tempname; // Settings have not changed if(!isModified()) return true; // We can not save if no application key given if(!applicationkey.empty()){ #ifdef WIN32 // Either file based or system registry for WIN32 if(ascii){ FXTRACE((100,"Writing to file based settings database.\n")); // Changes written only in the per-user registry pathname=FXSystem::getEnvironment("USERPROFILE")+PATHSEPSTRING "foxrc"; // If this directory does not exist, make it if(!FXStat::exists(pathname)){ if(!FXDir::create(pathname)){ fxwarning("%s: unable to create directory.\n",pathname.text()); return false; } } else{ if(!FXStat::isDirectory(pathname)){ fxwarning("%s: is not a directory.\n",pathname.text()); return false; } } // Add vendor subdirectory if(!vendorkey.empty()){ pathname.append(PATHSEPSTRING+vendorkey); if(!FXStat::exists(pathname)){ if(!FXDir::create(pathname)){ fxwarning("%s: unable to create directory.\n",pathname.text()); return false; } } else{ if(!FXStat::isDirectory(pathname)){ fxwarning("%s: is not a directory.\n",pathname.text()); return false; } } } // Add application key pathname.append(PATHSEPSTRING+applicationkey+".ini"); // Construct temp name tempname.format("%s_%d",pathname.text(),fxgetpid()); // Unparse settings into temp file first if(unparseFile(tempname)){ // Rename ATOMICALLY to proper name if(!FXFile::rename(tempname,pathname)){ fxwarning("Unable to save registry.\n"); return false; } modified=false; return true; } } else{ FXTRACE((100,"Writing to registry HKEY_CURRENT_USER.\n")); // Write back modified resources for current user if(writeToRegistry(HKEY_CURRENT_USER)) return true; } #else // File based registry for X11 // Changes written only in the per-user registry pathname=FXSystem::getHomeDirectory()+PATHSEPSTRING ".foxrc"; // If this directory does not exist, make it if(!FXStat::exists(pathname)){ if(!FXDir::create(pathname)){ fxwarning("%s: unable to create directory.\n",pathname.text()); return false; } } else{ if(!FXStat::isDirectory(pathname)){ fxwarning("%s: is not a directory.\n",pathname.text()); return false; } } // Add vendor subdirectory if(!vendorkey.empty()){ pathname.append(PATHSEPSTRING+vendorkey); if(!FXStat::exists(pathname)){ if(!FXDir::create(pathname)){ fxwarning("%s: unable to create directory.\n",pathname.text()); return false; } } else{ if(!FXStat::isDirectory(pathname)){ fxwarning("%s: is not a directory.\n",pathname.text()); return false; } } } // Add application key pathname.append(PATHSEPSTRING+applicationkey); // Construct temp name tempname.format("%s_%d",pathname.text(),fxgetpid()); // Unparse settings into temp file first if(unparseFile(tempname)){ // Rename ATOMICALLY to proper name if(!FXFile::rename(tempname,pathname)){ fxwarning("Unable to save registry.\n"); return false; } setModified(false); return true; } #endif } return false; } #ifdef WIN32 // Update current user's settings bool FXRegistry::writeToRegistry(void* hRootKey){ HKEY hSoftKey,hOrgKey; DWORD disp; bool ok=false; // Open Software registry section if(RegOpenKeyExA((HKEY)hRootKey,"Software",0,KEY_WRITE,&hSoftKey)==ERROR_SUCCESS){ // Have vendor key if(!vendorkey.empty()){ // Open Vendor registry sub-section if(RegCreateKeyExA(hSoftKey,vendorkey.text(),0,REG_NONE,REG_OPTION_NON_VOLATILE,KEY_WRITE|KEY_READ,NULL,&hOrgKey,&disp)==ERROR_SUCCESS){ // Have application key if(!applicationkey.empty()){ // Write Software\Vendor\Application if(writeToRegistryGroup(hOrgKey,applicationkey.text())) ok=true; } RegCloseKey(hOrgKey); } } // No vendor key else{ // Have application key if(!applicationkey.empty()){ // Write Software\Application if(writeToRegistryGroup(hSoftKey,applicationkey.text())) ok=true; } } // Done with Software key RegCloseKey(hSoftKey); } return ok; } // Write to registry group bool FXRegistry::writeToRegistryGroup(void* org,const char* groupname){ FXchar section[MAXNAME]; DWORD sectionsize,sectionindex,disp; HKEY groupkey,sectionkey; FXint s,e; FILETIME writetime; FXStringDict *group; if(RegCreateKeyExA((HKEY)org,groupname,0,REG_NONE,REG_OPTION_NON_VOLATILE,KEY_WRITE|KEY_READ,NULL,&groupkey,&disp)==ERROR_SUCCESS){ // First, purge all existing sections while(1){ sectionindex=0; sectionsize=MAXNAME; if(RegEnumKeyExA(groupkey,sectionindex,section,§ionsize,NULL,NULL,NULL,&writetime)!=ERROR_SUCCESS) break; if(RegDeleteKeyA(groupkey,section)!=ERROR_SUCCESS) break; } // Dump the registry, writing only marked entries s=first(); while(sfirst(); esize(); e=group->next(e)){ if(group->mark(e)){ if(sectionkey==NULL){ FXASSERT(key(s)); if(RegCreateKeyExA(groupkey,key(s),0,REG_NONE,REG_OPTION_NON_VOLATILE,KEY_WRITE|KEY_READ,NULL,§ionkey,&disp)!=ERROR_SUCCESS) goto x; } FXASSERT(group->key(e)); FXASSERT(group->data(e)); if(RegSetValueExA(sectionkey,group->key(e),0,REG_SZ,(BYTE*)group->data(e),strlen(group->data(e))+1)!=ERROR_SUCCESS) break; } } // Close this section's key (if it exists) if(sectionkey) RegCloseKey(sectionkey); // Process next registry section x: s=next(s); } RegCloseKey(groupkey); return true; } return false; } #endif } fox1.6-1.6.57/src/FXReplaceDialog.cpp000066400000000000000000000373151326741342000170720ustar00rootroot00000000000000/******************************************************************************** * * * T e x t R e p l a c e D i a l o g * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXReplaceDialog.cpp,v 1.49 2006/03/01 02:13:21 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXFont.h" #include "FXImage.h" #include "FXIcon.h" #include "FXGIFIcon.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXArrowButton.h" #include "FXSeparator.h" #include "FXLabel.h" #include "FXButton.h" #include "FXCheckButton.h" #include "FXRadioButton.h" #include "FXPacker.h" #include "FXScrollBar.h" #include "FXTextField.h" #include "FXVerticalFrame.h" #include "FXHorizontalFrame.h" #include "FXReplaceDialog.h" /* Notes: - Keep history of strings previously searched, and allow up/down arrows to "scroll" back to this history. */ // Padding for buttons #define HORZ_PAD 12 #define VERT_PAD 2 #define SEARCH_MASK (SEARCH_EXACT|SEARCH_IGNORECASE|SEARCH_REGEX) using namespace FX; /*******************************************************************************/ namespace FX { // Search and replace registry group static const FXchar searchgroup[]="SearchReplace"; static const FXchar skey[20][3]={{'S','A','\0'},{'S','B','\0'},{'S','C','\0'},{'S','D','\0'},{'S','E','\0'},{'S','F','\0'},{'S','G','\0'},{'S','H','\0'},{'S','I','\0'},{'S','J','\0'},{'S','K','\0'},{'S','L','\0'},{'S','M','\0'},{'S','N','\0'},{'S','O','\0'},{'S','P','\0'},{'S','Q','\0'},{'S','R','\0'},{'S','S','\0'},{'S','T','\0'}}; static const FXchar rkey[20][3]={{'R','A','\0'},{'R','B','\0'},{'R','C','\0'},{'R','D','\0'},{'R','E','\0'},{'R','F','\0'},{'R','G','\0'},{'R','H','\0'},{'R','I','\0'},{'R','J','\0'},{'R','K','\0'},{'R','L','\0'},{'R','M','\0'},{'R','N','\0'},{'R','O','\0'},{'R','P','\0'},{'R','Q','\0'},{'R','R','\0'},{'R','S','\0'},{'R','T','\0'}}; static const FXchar mkey[20][3]={{'M','A','\0'},{'M','B','\0'},{'M','C','\0'},{'M','D','\0'},{'M','E','\0'},{'M','F','\0'},{'M','G','\0'},{'M','H','\0'},{'M','I','\0'},{'M','J','\0'},{'M','K','\0'},{'M','L','\0'},{'M','M','\0'},{'M','N','\0'},{'M','O','\0'},{'M','P','\0'},{'M','Q','\0'},{'M','R','\0'},{'M','S','\0'},{'M','T','\0'}}; // Map FXDEFMAP(FXReplaceDialog) FXReplaceDialogMap[]={ FXMAPFUNC(SEL_COMMAND,FXReplaceDialog::ID_ACCEPT,FXReplaceDialog::onCmdAccept), FXMAPFUNC(SEL_COMMAND,FXReplaceDialog::ID_REPLACE_TEXT,FXReplaceDialog::onCmdAccept), FXMAPFUNC(SEL_COMMAND,FXReplaceDialog::ID_SEARCH_TEXT,FXReplaceDialog::onCmdAccept), FXMAPFUNC(SEL_COMMAND,FXReplaceDialog::ID_ALL,FXReplaceDialog::onCmdAll), FXMAPFUNCS(SEL_COMMAND,FXReplaceDialog::ID_NEXT,FXReplaceDialog::ID_PREV,FXReplaceDialog::onCmdNext), FXMAPFUNC(SEL_UPDATE,FXReplaceDialog::ID_DIR,FXReplaceDialog::onUpdDir), FXMAPFUNC(SEL_COMMAND,FXReplaceDialog::ID_DIR,FXReplaceDialog::onCmdDir), FXMAPFUNCS(SEL_UPDATE,FXReplaceDialog::ID_MODE+SEARCH_EXACT,FXReplaceDialog::ID_MODE+SEARCH_REGEX,FXReplaceDialog::onUpdMode), FXMAPFUNCS(SEL_COMMAND,FXReplaceDialog::ID_MODE+SEARCH_EXACT,FXReplaceDialog::ID_MODE+SEARCH_REGEX,FXReplaceDialog::onCmdMode), FXMAPFUNC(SEL_KEYPRESS,FXReplaceDialog::ID_SEARCH_TEXT,FXReplaceDialog::onSearchKey), FXMAPFUNC(SEL_KEYPRESS,FXReplaceDialog::ID_REPLACE_TEXT,FXReplaceDialog::onReplaceKey), FXMAPFUNCS(SEL_COMMAND,FXReplaceDialog::ID_SEARCH_UP,FXReplaceDialog::ID_SEARCH_DN,FXReplaceDialog::onCmdSearchHist), FXMAPFUNCS(SEL_COMMAND,FXReplaceDialog::ID_REPLACE_UP,FXReplaceDialog::ID_REPLACE_DN,FXReplaceDialog::onCmdReplaceHist), }; // Object implementation FXIMPLEMENT(FXReplaceDialog,FXDialogBox,FXReplaceDialogMap,ARRAYNUMBER(FXReplaceDialogMap)) // File Open Dialog FXReplaceDialog::FXReplaceDialog(FXWindow* owner,const FXString& caption,FXIcon* ic,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXDialogBox(owner,caption,opts|DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,x,y,w,h,10,10,10,10, 10,10){ FXHorizontalFrame* buttons=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT,0,0,0,0,0,0,0,0); accept=new FXButton(buttons,tr("&Replace"),NULL,this,ID_ACCEPT,BUTTON_INITIAL|BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); every=new FXButton(buttons,tr("Re&place All"),NULL,this,ID_ALL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_RIGHT,0,0,0,0,6,6,VERT_PAD,VERT_PAD); cancel=new FXButton(buttons,tr("&Cancel"),NULL,this,ID_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); FXHorizontalFrame* pair=new FXHorizontalFrame(buttons,LAYOUT_FILL_Y|LAYOUT_RIGHT,0,0,0,0, 0,0,0,0); FXArrowButton* searchlast=new FXArrowButton(pair,this,ID_PREV,ARROW_LEFT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); FXArrowButton* searchnext=new FXArrowButton(pair,this,ID_NEXT,ARROW_RIGHT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXHorizontalSeparator(this,SEPARATOR_GROOVE|LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); FXHorizontalFrame* toppart=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|LAYOUT_CENTER_Y,0,0,0,0, 0,0,0,0, 10,10); new FXLabel(toppart,FXString::null,ic,ICON_BEFORE_TEXT|JUSTIFY_CENTER_X|JUSTIFY_CENTER_Y|LAYOUT_FILL_Y|LAYOUT_FILL_X); FXVerticalFrame* entry=new FXVerticalFrame(toppart,LAYOUT_FILL_X|LAYOUT_CENTER_Y,0,0,0,0, 0,0,0,0); searchlabel=new FXLabel(entry,tr("S&earch for:"),NULL,JUSTIFY_LEFT|ICON_BEFORE_TEXT|LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FILL_X); searchbox=new FXHorizontalFrame(entry,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_CENTER_Y,0,0,0,0, 0,0,0,0, 0,0); searchtext=new FXTextField(searchbox,26,this,ID_SEARCH_TEXT,TEXTFIELD_ENTER_ONLY|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 4,4,4,4); FXVerticalFrame* searcharrows=new FXVerticalFrame(searchbox,LAYOUT_RIGHT|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0, 0,0); FXArrowButton* ar1=new FXArrowButton(searcharrows,this,ID_SEARCH_UP,FRAME_RAISED|FRAME_THICK|ARROW_UP|ARROW_REPEAT|LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH, 0,0,16,0, 1,1,1,1); FXArrowButton* ar2=new FXArrowButton(searcharrows,this,ID_SEARCH_DN,FRAME_RAISED|FRAME_THICK|ARROW_DOWN|ARROW_REPEAT|LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH, 0,0,16,0, 1,1,1,1); ar1->setArrowSize(3); ar2->setArrowSize(3); replacelabel=new FXLabel(entry,tr("Replace &with:"),NULL,LAYOUT_LEFT); replacebox=new FXHorizontalFrame(entry,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_CENTER_Y,0,0,0,0, 0,0,0,0, 0,0); replacetext=new FXTextField(replacebox,26,this,ID_REPLACE_TEXT,TEXTFIELD_ENTER_ONLY|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 4,4,4,4); FXVerticalFrame* replacearrows=new FXVerticalFrame(replacebox,LAYOUT_RIGHT|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0, 0,0); FXArrowButton* ar3=new FXArrowButton(replacearrows,this,ID_REPLACE_UP,FRAME_RAISED|FRAME_THICK|ARROW_UP|ARROW_REPEAT|LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH, 0,0,16,0, 1,1,1,1); FXArrowButton* ar4=new FXArrowButton(replacearrows,this,ID_REPLACE_DN,FRAME_RAISED|FRAME_THICK|ARROW_DOWN|ARROW_REPEAT|LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH, 0,0,16,0, 1,1,1,1); ar3->setArrowSize(3); ar4->setArrowSize(3); FXHorizontalFrame* options1=new FXHorizontalFrame(entry,LAYOUT_FILL_X,0,0,0,0, 0,0,0,0); new FXRadioButton(options1,tr("Ex&act"),this,ID_MODE+SEARCH_EXACT,ICON_BEFORE_TEXT|LAYOUT_CENTER_X); new FXRadioButton(options1,tr("&Ignore Case"),this,ID_MODE+SEARCH_IGNORECASE,ICON_BEFORE_TEXT|LAYOUT_CENTER_X); new FXRadioButton(options1,tr("E&xpression"),this,ID_MODE+SEARCH_REGEX,ICON_BEFORE_TEXT|LAYOUT_CENTER_X); new FXCheckButton(options1,tr("&Backward"),this,ID_DIR,ICON_BEFORE_TEXT|LAYOUT_CENTER_X); searchlast->setTipText("Ctl-B"); searchnext->setTipText("Ctl-F"); searchlast->addHotKey(MKUINT(KEY_b,CONTROLMASK)); searchnext->addHotKey(MKUINT(KEY_f,CONTROLMASK)); searchmode=SEARCH_EXACT|SEARCH_FORWARD; current=0; } // Set text or pattern to search for void FXReplaceDialog::setSearchText(const FXString& text){ searchtext->setText(text); } // Return text or pattern the user has entered FXString FXReplaceDialog::getSearchText() const { return searchtext->getText(); } // Set text or pattern to search with void FXReplaceDialog::setReplaceText(const FXString& text){ replacetext->setText(text); } // Return text or pattern the user has entered FXString FXReplaceDialog::getReplaceText() const { return replacetext->getText(); } // Replace all long FXReplaceDialog::onCmdAll(FXObject*,FXSelector,void*){ appendHistory(getSearchText(),getReplaceText(),getSearchMode()); getApp()->stopModal(this,REPLACE_ALL); hide(); return 1; } // Cause return of modal dialog w/o hiding it long FXReplaceDialog::onCmdNext(FXObject*,FXSelector sel,void*){ if(FXSELID(sel)==ID_NEXT) searchmode&=~SEARCH_BACKWARD; else searchmode|=SEARCH_BACKWARD; appendHistory(getSearchText(),getReplaceText(),getSearchMode()); getApp()->stopModal(this,REPLACE_NEXT); return 1; } // Return from the dialog long FXReplaceDialog::onCmdAccept(FXObject*,FXSelector,void*){ appendHistory(getSearchText(),getReplaceText(),getSearchMode()); getApp()->stopModal(this,REPLACE); hide(); return 1; } // Change search direction long FXReplaceDialog::onCmdDir(FXObject*,FXSelector,void*){ searchmode^=SEARCH_BACKWARD; return 1; } // Update search direction long FXReplaceDialog::onUpdDir(FXObject* sender,FXSelector,void*){ sender->handle(this,(searchmode&SEARCH_BACKWARD)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Change search mode long FXReplaceDialog::onCmdMode(FXObject*,FXSelector sel,void*){ searchmode=(searchmode&~SEARCH_MASK) | (FXSELID(sel)-ID_MODE); return 1; } // Update search mode long FXReplaceDialog::onUpdMode(FXObject* sender,FXSelector sel,void*){ sender->handle(this,((searchmode&SEARCH_MASK)==(FXuint)(FXSELID(sel)-ID_MODE))?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Append entry void FXReplaceDialog::appendHistory(const FXString& search,const FXString& replace,FXuint mode){ register const char* val; register int i; if(!search.empty()){ if(search!=getApp()->reg().readStringEntry(searchgroup,skey[0],FXString::null)){ for(i=19; i>0; i--){ if((val=getApp()->reg().readStringEntry(searchgroup,skey[i-1],NULL))!=NULL) getApp()->reg().writeStringEntry(searchgroup,skey[i],val); if((val=getApp()->reg().readStringEntry(searchgroup,rkey[i-1],NULL))!=NULL) getApp()->reg().writeStringEntry(searchgroup,rkey[i],val); if((val=getApp()->reg().readStringEntry(searchgroup,mkey[i-1],NULL))!=NULL) getApp()->reg().writeStringEntry(searchgroup,mkey[i],val); } } getApp()->reg().writeStringEntry(searchgroup,skey[0],search.text()); getApp()->reg().writeStringEntry(searchgroup,rkey[0],replace.text()); getApp()->reg().writeUnsignedEntry(searchgroup,mkey[0],mode); } } // Scroll back in search history long FXReplaceDialog::onCmdSearchHist(FXObject*,FXSelector sel,void*){ if(FXSELID(sel)==ID_SEARCH_UP){ if(current<20 && getApp()->reg().readStringEntry(searchgroup,skey[current],NULL)) current++; } else{ if(current>0) current--; } if(current){ setSearchText(getApp()->reg().readStringEntry(searchgroup,skey[current-1],FXString::null)); setReplaceText(getApp()->reg().readStringEntry(searchgroup,rkey[current-1],FXString::null)); setSearchMode(getApp()->reg().readUnsignedEntry(searchgroup,mkey[current-1],SEARCH_EXACT|SEARCH_FORWARD)); } else{ setSearchText(FXString::null); setReplaceText(FXString::null); setSearchMode(SEARCH_EXACT|SEARCH_FORWARD); } return 1; } // Scroll back in replace history long FXReplaceDialog::onCmdReplaceHist(FXObject*,FXSelector sel,void*){ if(FXSELID(sel)==ID_REPLACE_UP){ if(current<20 && getApp()->reg().readStringEntry(searchgroup,skey[current],NULL)) current++; } else{ if(current>0) current--; } if(current){ setReplaceText(getApp()->reg().readStringEntry(searchgroup,rkey[current-1],FXString::null)); } else{ setReplaceText(FXString::null); } return 1; } // Keyboard press in search text field long FXReplaceDialog::onSearchKey(FXObject*,FXSelector,void* ptr){ switch(((FXEvent*)ptr)->code){ case KEY_Up: case KEY_KP_Up: onCmdSearchHist(this,FXSEL(SEL_COMMAND,ID_SEARCH_UP),NULL); return 1; case KEY_Down: case KEY_KP_Down: onCmdSearchHist(this,FXSEL(SEL_COMMAND,ID_SEARCH_DN),NULL); return 1; } return 0; } // Keyboard press in replace text field long FXReplaceDialog::onReplaceKey(FXObject*,FXSelector,void* ptr){ switch(((FXEvent*)ptr)->code){ case KEY_Up: case KEY_KP_Up: onCmdReplaceHist(this,FXSEL(SEL_COMMAND,ID_REPLACE_UP),NULL); return 1; case KEY_Down: case KEY_KP_Down: onCmdReplaceHist(this,FXSEL(SEL_COMMAND,ID_REPLACE_DN),NULL); return 1; } return 0; } // Force the initial text to be seleced FXuint FXReplaceDialog::execute(FXuint placement){ create(); searchtext->setFocus(); show(placement); current=0; return getApp()->runModalFor(this); } // Save data void FXReplaceDialog::save(FXStream& store) const { FXDialogBox::save(store); store << searchlabel; store << searchtext; store << searchbox; store << replacelabel; store << replacetext; store << replacebox; store << accept; store << cancel; store << every; store << searchmode; } // Load data void FXReplaceDialog::load(FXStream& store){ FXDialogBox::load(store); store >> searchlabel; store >> searchtext; store >> searchbox; store >> replacelabel; store >> replacetext; store >> replacebox; store >> accept; store >> cancel; store >> every; store >> searchmode; } // Cleanup FXReplaceDialog::~FXReplaceDialog(){ searchlabel=(FXLabel*)-1L; searchtext=(FXTextField*)-1L; searchbox=(FXHorizontalFrame*)-1L; replacelabel=(FXLabel*)-1L; replacetext=(FXTextField*)-1L; replacebox=(FXHorizontalFrame*)-1L; accept=(FXButton*)-1L; cancel=(FXButton*)-1L; every=(FXButton*)-1L; } } fox1.6-1.6.57/src/FXRex.cpp000066400000000000000000002500151326741342000151270ustar00rootroot00000000000000/******************************************************************************** * * * R e g u l a r E x p r e s s i o n C l a s s * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRex.cpp,v 1.98 2006/03/18 01:05:58 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "fxunicode.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXRex.h" /* The Story: ========== As with most regex implementations, this one is inspired by Henry Spencer's original implementation. This is however an ab-initio implementation, with the following goals: o Full C++ implementation, no simple C++ wrapper. o Trade speed and memory in favor of speed, but keep it compact where possible. o Thread-safe: - No global variables used during parsing or execution. - Multiple threads could use same single FXRex at the same time. o Perl-like syntax for character classes. o Additional features such as lazy/greedy/possessive closures, counting repeats, back references, trailing context. o Forward and backward subject string scanning mode. o Single line/multi line matching modes. o 8-bit safe (you can use it to grep binary data!). o No arbitrary limitations. Patterns can be as long as you need them to be, memory allowing. This is possible due to representing the progam as 32-bit integers. o When parsing fails, or when created with default constructor, FXRex is initialized to a "fallback" program; its thus safe to invoke match at any time. o The default fallback program will fail to match anything. o Observe current locale if your "ctype.h" functions support it, by calling all locale-sensitive functions during the match. o Convenient feature: disallow empty string matches; this is nice as it prevents a common problem, for example searching for "a*" in "bbba"; without the REX_NOT_EMPTY option, this matches "" and not the "a". o Another convenient feature is the ability to compile verbatim strings. This is practical as it allows FXRex to be populated with a simple string with no interpretation of special characters ^*?+{}()\$.[]. o Note that FXRex's implementation would naturally move to wide character support... Because this is completely new implementation of regular expressions, and not merely an extension of a previous implementation, some people may want to adapt it for use outside of FOX. This is perfectly OK with me. However: o The Author is not responsible for the consequences of using this software. o Recipient should be clearly informed of the origin of the software; and if alterations have been made, this must be stated clearly. o Software will continue to fall under Lesser GPL, unless specific permission from the Author has been obtained. Implementation notes: ===================== This implementation does not use "nodes" with "next" pointers; instead, the "next" opcode is located implicitly by simple sequentiality. This has beneficial effect on speed, as one can simply add to the program counter instead of performing a memory reference. Sometimes one needs to jump out of sequence; this is implemented by an explicit jump instruction. Because it works with 32-bit offsets, there is no need to distinguish between forward and backward jumps. Henry Spencer implemented a trick to "prefix" simple single-character matching opcodes with a closure operator, by shifting down already generated code and inserting the closure operator in front of it. FXRex uses the same trick of shifting down code; but this same trick is also useful for branches! FXRex only generates a branch node when an alternative has in fact been seen; if no alternative is there, we've saved ourselves both a branch node and a jump node! This has interesting side-effects: o The common case of 1 single branch now no longer needs a branch opcode and corresponding jump opcode at all! o When an alternative is found, we insert a branch node in front and a jump node behind the already generated code. This can be done easily as branches and jumps within the shifted block of code are relative, and have already been resolved! o The matching algorithm for a branch opcode simplifies as well:- either it matches the first branch, or it continues after the jump. o Its easier to dig out some info from the program, and in fact so easy that this digging can be moved to the execute phase. When a repeat is prefixed in front of a simple single-character match, counted repeats are simplified: {1}, {1,1} is eliminated, {}, {0,} becomes *, {1,} becomes +, and {0,1} becomes ?. Because single-character repeats are prefixed with a repeat instruction, there is no recursion needed; single character repeats are therefore very fast. Complex repeats are implemented using branch loop constructs and may involve recursions (in fact only the fixed repeat is non-recursive!). Hence complex repeats should be avoided when single-character repeats will suffice. OP_BRANCH and OP_BRANCHREV implement alternatives. For OP_BRANCH, first the inline code immediately following the offset is executed; if the inline code fails, OP_BRANCH takes a jump to the new location and tries the alternative. For OP_BRANCHREV, it works the opposite way: OP_BRANCHREV takes the alternative first, before trying the inline code. Having both OP_BRANCH and OP_BRANCHREV substantially simplifies the design of complex, greedy or lazy matches:- the greedy and lazy match turn out to have the same code structure, except we're using OP_BRANCHREV for the lazy matches and OP_BRANCH for the greedy ones. OP_JUMP is an unconditional jump to a new location. OP_JUMPLT and OP_JUMPGT jump when the loop counter is less than or greater than the given value, respectively. Atomic Matching Groups ====================== For example, trying to match pattern "\d+foo" against subject string "123456bar", the matcher will eat all digits up till "6", and then backtrack by trying digits up till 5, and so on. A atomic subgroup match will simply fail if the sub-pattern fails to match at the end. This can be written as: "(?>\d+)foo". Atomic groups are thus more efficient since no repeated tries are being made. Greedy, Lazy, and Possessive Matches ==================================== Greedy: the "a*" in pattern "a*ardvark" matching subject string "aardvark" will match "aa", then backtrack and match "a", after which the match succeeds. Lazy: the "a*?" in pattern "a*?ardvark" will first match "", then try match "a" after which the match succeeds. Possessive: the "a*+" in pattern "a*+ardvark" will match "aa", then fail without backing off. Possessive matches and Atomic matching groups are closely related in terms of controlling the recursion depth of the matcher. Syntax: ======= Special Constructs (?i X ) Match sub pattern case insensitive (?I X ) Match sub pattern case sensitive (?n X ) Match sub pattern with newlines (?N X ) Match sub pattern with no newlines (?: X ) Non-capturing parentheses (?= X ) Zero width positive lookahead (?! X ) Zero width negative lookahead (?<= X ) Zero width positive lookbehind (? X ) Atomic grouping (possessive match) Logical Operators X Y X followed by Y X | Y Either X or Y ( X ) Sub pattern (capturing if REX_CAPTURE) Greedy Quantifiers X * Match 0 or more X + Match 1 or more X ? Match 0 or 1 X {} Match 0 or more X {n} Match n times X {,m} Match no more than m times X {n,} Match n or more X {n,m} Match at least n but no more than m times Lazy Quantifiers X *? Match 0 or more X +? Match 1 or more X ?? Match 0 or 1 X {}? Match 0 or more times X {n}? Match n times X {,m}? Match no more than m times X {n,}? Match n or more X {n,m}? Match at least n but no more than m times Possessive (non-backtracking) Quantifiers X *+ Match 0 or more X ++ Match 1 or more X ?+ Match 0 or 1 X {}+ Match 0 or more times X {n}+ Match n times X {,m}+ Match no more than m times X {n,}+ Match n or more X {n,m}+ Match at least n but no more than m times Boundary Matching ^ Match begin of line [if at begin of pattern] $ Match end of line [if at end of pattern] \< Begin of word \> End of word \b Word boundary \B Word interior \A Match only beginning of string \Z Match only and end of string Character Classes [abc] Match a, b, or c [^abc] Match any but a, b, or c [a-zA-Z] Match upper- or lower-case a through z []] Matches ] [-] Matches - Predefined character classes . Match any character \d Digit [0-9] \D Non-digit \s Space \S Non-space \w Word character [a-zA-Z_0-9] \W Non-word character \l Letter [a-zA-Z] \L Non-letter \h Hex digit [0-9a-fA-F] \H Non-hex digit \u Single uppercase character \U Single lowercase character \p Punctuation (not including '_') \P Non punctuation Characters x Any character \\ Back slash character \033 Octal \x1b Hex \u1FD1 Unicode U+1FD1 (GREEK SMALL LETTER IOTA WITH MACRON)) \U00010450 Wide unicode U+10450 (SHAVIAN LETTER PEEP) \a Alarm, bell \e Escape character \t Tab \f Form feed \n Newline \r Return \v Vertical tab \cx Control character Back References \1 Reference to 1st capturing group \2 Reference to 2nd capturing group ... \9 Reference to 9th capturing group POSIX character classes (US-ASCII only) \P{name} Matches anything BUT what \p{name} matches \p{Lower} A lower-case alphabetic character: [a-z] \p{Upper} An upper-case alphabetic character: [A-Z] \p{ASCII} All ASCII: [\x00-\x7F] \p{Alpha} An alphabetic character:[\p{Lower}\p{Upper}] \p{Digit} A decimal digit: [0-9] \p{Alnum} An alphanumeric character: [\p{Alpha}\p{Digit}] \p{Punct} Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ \p{Graph} A visible character: [\p{Alnum}\p{Punct}] \p{Print} A printable character: [\p{Graph}] \p{Blank} A space or a tab: [ \t] \p{Cntrl} A control character: [\x00-\x1F\x7F] \p{XDigit} A hexadecimal digit: [0-9a-fA-F] \p{Space} A whitespace character: [ \t\n\x0B\f\r] Unicode general character categories \p{C} Other (Cc | Cf | Cn | Co | Cs) \p{Cc} Control \p{Cf} Format \p{Cn} Unassigned \p{Co} Private use \p{Cs} Surrogate \p{L} Letter (Ll | Lm | Lo | Lt | Lu) \p{Ll} Lower case letter \p{Lm} Modifier letter \p{Lo} Other letter \p{Lt} Title case letter \p{Lu} Upper case letter \p{M} Mark (Mc | Me | Mn) \p{Mc} Spacing mark \p{Me } Enclosing mark \p{Mn} Non-spacing mark \p{N} Number (Nd | Nl | No) \p{Nd} Decimal number \p{Nl} Letter number \p{No} Other number \p{P} Punctuation (Pc | Pd | Pe | Pf | Pi | Po | Ps) \p{Pc} Connector punctuation \p{Pd} Dash punctuation \p{Pe} Close punctuation \p{Pf} Final punctuation \p{Pi} Initial punctuation \p{Po} Other punctuation \p{Ps} Open punctuation \p{S} Symbol (Sc | Sk | Sm | So) \p{Sc} Currency symbol \p{Sk} Modifier symbol \p{Sm} Mathematical symbol \p{So} Other symbol \p{Z} Separator (Zl | Zp | Zs) \p{Zl} Line separator \p{Zp} Paragraph separator \p{Zs} Space separator Unicode script categories \p{Arab} Arabic \p{Armn} Armenian \p{Beng} Bengali \p{Bopo} Bopomofo \p{Brai} Braille \p{Bugi} Buginese \p{Buhd} Buhid \p{Cans} Canadian_Aboriginal \p{Cher} Cherokee \p{Copt} Coptic (Qaac) \p{Cprt} Cypriot \p{Cyrl} Cyrillic \p{Deva} Devanagari \p{Dsrt} Deseret \p{Ethi} Ethiopic \p{Geor} Georgian \p{Glag} Glagolitic \p{Goth} Gothic \p{Grek} Greek \p{Gujr} Gujarati \p{Guru} Gurmukhi \p{Hang} Hangul \p{Hani} Han \p{Hano} Hanunoo \p{Hebr} Hebrew \p{Hira} Hiragana \p{Hrkt} Katakana_Or_Hiragana \p{Ital} Old_Italic \p{Kana} Katakana \p{Khar} Kharoshthi \p{Khmr} Khmer \p{Knda} Kannada \p{Laoo} Lao \p{Latn} Latin \p{Limb} Limbu \p{Linb} Linear_B \p{Mlym} Malayalam \p{Mong} Mongolian \p{Mymr} Myanmar \p{Ogam} Ogham \p{Orya} Oriya \p{Osma} Osmanya \p{Qaai} Inherited \p{Runr} Runic \p{Shaw} Shavian \p{Sinh} Sinhala \p{Sylo} Syloti_Nagri \p{Syrc} Syriac \p{Tagb} Tagbanwa \p{Tale} Tai_Le \p{Talu} New_Tai_Lue \p{Taml} Tamil \p{Telu} Telugu \p{Tfng} Tifinagh \p{Tglg} Tagalog \p{Thaa} Thaana \p{Thai} Thai \p{Tibt} Tibetan \p{Ugar} Ugaritic \p{Xpeo} Old_Persian \p{Yiii} Yi \p{Zyyy} Common Grammar: ======== exp ::= branch { "|" branch }* branch ::= { piece }* piece ::= atom [ rep ] rep ::= ( "*" | "+" | "?" | counts ) [ "?" ] counts ::= "{" digits ["," [ digits] ] "}" atom ::= "(" exp ")" | "[" [^] range "]" | characters range ::= { character | character "-" character } + characters ::= { character }* digits ::= { digit }* To do: ====== - Look into optimizing character class when possible (e.g. collapse [0-9] to OP_DIGIT and [^A] into OP_NOT_CHAR). - Should \D, \W, \L match newline? - Look behind would be nice... - Repeating back references, only possible if capturing parentheses are known NOT to match "". - Note the \uXXXX is going to be used for UNICODE perhaps: See: http://www.unicode.org/unicode/reports/tr18. - Implement possessive and atomic groups */ // As close to infinity as we're going to get; this seems big // enough. We can not make it MAX_INT as this may wrap around when // added to something else! #define ONEINDIG 1000000 // Number of capturing sub-expressions allowed #define NSUBEXP 10 // Size of string buffer #define MAXCHARS 512 // Set operations #define EXCL(set,ch) (set[((FXuchar)(ch))>>5]&=~(1<<(((FXuchar)(ch))&31))) #define INCL(set,ch) (set[((FXuchar)(ch))>>5]|=(1<<(((FXuchar)(ch))&31))) #define ISIN(set,ch) (set[((FXuchar)(ch))>>5]&(1<<(((FXuchar)(ch))&31))) #define CLEAR(set) (set[0]=set[1]=set[2]=set[3]=set[4]=set[5]=set[6]=set[7]=0) using namespace FX; /*******************************************************************************/ namespace { // Opcodes of the engine enum { OP_END = 0, // End of pattern reached OP_FAIL = 1, // Always fail OP_SUCCEED = 2, // Always succeed OP_LINE_BEG = 3, // Beginning of line OP_LINE_END = 4, // End of line OP_WORD_BEG = 5, // Beginning of word OP_WORD_END = 6, // End of word OP_WORD_BND = 7, // Word boundary OP_WORD_INT = 8, // Word interior OP_STR_BEG = 9, // Beginning of string OP_STR_END = 10, // End of string OP_ANY_OF = 11, // Any character in set OP_ANY_BUT = 12, // Any character not in set OP_ANY = 13, // Any character but no newline OP_ANY_NL = 14, // Any character including newline OP_SPACE = 15, // White space OP_SPACE_NL = 16, // White space including newline OP_NOT_SPACE = 17, // Non-white space OP_DIGIT = 18, // Digit OP_NOT_DIGIT = 19, // Non-digit OP_NOT_DIGIT_NL = 20, // Non-digit including newline OP_LETTER = 21, // Letter OP_NOT_LETTER = 22, // Non-letter OP_NOT_LETTER_NL = 23, // Non-letter including newline OP_WORD = 24, // Word character OP_NOT_WORD = 25, // Non-word character OP_NOT_WORD_NL = 26, // Non-word character including newline OP_HEX = 27, // Hex digit OP_NOT_HEX = 28, // Non hex digit OP_NOT_HEX_NL = 29, // Non hex digit including newline OP_PUNCT = 30, // Punctuation OP_NOT_PUNCT = 31, // Non punctuation OP_NOT_PUNCT_NL = 32, // Non punctuation including newline OP_CHARS = 33, // Match literal string OP_CHARS_CI = 34, // Match literal string, case insensitive OP_CHAR = 35, // Single character OP_CHAR_CI = 36, // Single character, case insensitive OP_JUMP = 37, // Jump to another location OP_BRANCH = 38, // Branch: jump after trying following code OP_BRANCHREV = 39, // Branch: jump before trying following code OP_STAR = 40, // Greedy * (simple) OP_MIN_STAR = 41, // Lazy * (simple) OP_POS_STAR = 42, // Possessive * (simple) OP_PLUS = 43, // Greedy + (simple) OP_MIN_PLUS = 44, // Lazy + (simple) OP_POS_PLUS = 45, // Possessive + (simple) OP_QUEST = 46, // Greedy ? (simple) OP_MIN_QUEST = 47, // Lazy ? (simple) OP_POS_QUEST = 48, // Possessive ? (simple) OP_REP = 49, // Greedy counted repeat (simple) OP_MIN_REP = 50, // Lazy counted repeat (simple) OP_POS_REP = 51, // Possessive counted repeat (simple) OP_LOOK_NEG = 52, // Negative look ahead OP_LOOK_POS = 53, // Positive look ahead OP_UPPER = 54, // Match upper case OP_LOWER = 55, // Match lower case OP_SUB_BEG = 56, // Start of substring i OP_SUB_END = 66, // End of substring i OP_REF = 76, // Back reference to substring i OP_REF_CI = 86, // Match substring i case insensitive OP_ZERO = 96, // Zero count i OP_INCR = 106, // Increment count i OP_JUMPLT = 116, // Jump if count i less than value OP_JUMPGT = 126 // JUmp if count i greater than value }; // Flags enum { FLG_WORST = 0, // Worst case FLG_WIDTH = 1, // Matches >=1 character FLG_SIMPLE = 2 // Simple }; // Structure used during matching struct FXExecute { const FXchar *str; // String const FXchar *str_beg; // Begin of string const FXchar *str_end; // End of string FXint *sub_beg; // Begin of substring i FXint *sub_end; // End of substring i const FXint *code; // Program code FXint npar; // Number of capturing parentheses FXint count[10]; // Counters for counted repeats FXint mode; // Match mode // Attempt to match bool attempt(const FXchar* string); // Match at current string position bool match(const FXint* prog); // Execute bool execute(const FXchar* fm,const FXchar* to); }; // Structure used during compiling struct FXCompile { const FXchar *pat; // Pattern string pointer FXint *code; // Program code FXint *pc; // Program counter FXint mode; // Compile mode FXint nbra; // Number of counting braces FXint npar; // Number of capturing parentheses // Code generation FXint* append(FXint op); FXint* append(FXint op,FXint arg); FXint* append(FXint op,FXint arg1,FXint arg2); FXint* append(FXint op,FXint set[]); FXint* append(FXint op,FXint len,FXint *data); FXint* insert(FXint *ptr,FXint op); FXint* insert(FXint *ptr,FXint op,FXint arg); FXint* insert(FXint *ptr,FXint op,FXint arg1,FXint arg2); // Patch branches void patch(FXint *fm,FXint *to); // Parsing FXRexError compile(FXint& flags); FXRexError expression(FXint& flags); FXRexError verbatim(FXint& flags); FXRexError alternative(FXint& flags); FXRexError piece(FXint& flags); FXRexError atom(FXint& flags); FXRexError charset(); }; /*******************************************************************************/ #ifndef NDEBUG // Dump program void dump(FXint *prog){ FXint op,min,max,no,val; fxmessage("\n"); fxmessage("Program:\n"); fxmessage("%-10p SIZE %d\n",prog,*prog); prog++; while(1){ fxmessage("%-10p ",prog); op=*prog++; switch(op){ case OP_END: fxmessage("OP_END\n"); goto x; case OP_FAIL: fxmessage("OP_FAIL\n"); break; case OP_SUCCEED: fxmessage("OP_SUCCEED\n"); break; case OP_LINE_BEG: fxmessage("OP_LINE_BEG\n"); break; case OP_LINE_END: fxmessage("OP_LINE_END\n"); break; case OP_WORD_BEG: fxmessage("OP_WORD_BEG\n"); break; case OP_WORD_END: fxmessage("OP_WORD_END\n"); break; case OP_WORD_BND: fxmessage("OP_WORD_BND\n"); break; case OP_WORD_INT: fxmessage("OP_WORD_INT\n"); break; case OP_STR_BEG: fxmessage("OP_STR_BEG\n"); break; case OP_STR_END: fxmessage("OP_STR_END\n"); break; case OP_ANY_OF: fxmessage("OP_ANY_OF \""); for(no=0; no<256; no++){ if(ISIN(prog,no)){ if(' '<=no){ fxmessage("%c",no); } else { fxmessage("\\x%02x",no); } } } fxmessage("\"\n"); prog+=8; break; case OP_ANY_BUT: fxmessage("OP_ANY_BUT \""); for(no=0; no<256; no++){ if(ISIN(prog,no)){ if(' '<=no){ fxmessage("%c",no); } else { fxmessage("\\x%02x",no); } } } fxmessage("\"\n"); prog+=8; break; case OP_ANY: fxmessage("OP_ANY\n"); break; case OP_ANY_NL: fxmessage("OP_ANY_NL\n"); break; case OP_SPACE: fxmessage("OP_SPACE\n"); break; case OP_SPACE_NL: fxmessage("OP_SPACE_NL\n"); break; case OP_NOT_SPACE: fxmessage("OP_NOT_SPACE\n"); break; case OP_DIGIT: fxmessage("OP_DIGIT\n"); break; case OP_NOT_DIGIT: fxmessage("OP_NOT_DIGIT\n"); break; case OP_NOT_DIGIT_NL: fxmessage("OP_NOT_DIGIT_NL\n"); break; case OP_LETTER: fxmessage("OP_LETTER\n"); break; case OP_NOT_LETTER: fxmessage("OP_NOT_LETTER\n"); break; case OP_NOT_LETTER_NL: fxmessage("OP_NOT_LETTER_NL\n"); break; case OP_WORD: fxmessage("OP_WORD\n"); break; case OP_NOT_WORD: fxmessage("OP_NOT_WORD\n"); break; case OP_NOT_WORD_NL: fxmessage("OP_NOT_WORD_NL\n"); break; case OP_HEX: fxmessage("OP_HEX\n"); break; case OP_NOT_HEX: fxmessage("OP_NOT_HEX\n"); break; case OP_NOT_HEX_NL: fxmessage("OP_NOT_HEX_NL\n"); break; case OP_PUNCT: fxmessage("OP_PUNCT\n"); break; case OP_NOT_PUNCT: fxmessage("OP_NOT_PUNCT\n"); break; case OP_NOT_PUNCT_NL: fxmessage("OP_NOT_PUNCT_NL\n"); break; case OP_UPPER: fxmessage("OP_UPPER\n"); break; case OP_LOWER: fxmessage("OP_LOWER\n"); break; case OP_CHARS: no=*prog++; fxmessage("OP_CHARS %d,\"",no); while(no>0){ if(' '<=*prog){ fxmessage("%c",*prog); } else { fxmessage("\\x%02x",*prog); } prog++; no--; } fxmessage("\"\n"); break; case OP_CHARS_CI: no=*prog++; fxmessage("OP_CHARS_CI %d,\"",no); while(no>0){ if(' '<=*prog){ fxmessage("%c",*prog); } else { fxmessage("\\x%02x",*prog); } prog++; no--; } fxmessage("\"\n"); break; case OP_CHAR: fxmessage("OP_CHAR \""); if(' '<=*prog){ fxmessage("%c",*prog); } else { fxmessage("\\x%02x",*prog); } fxmessage("\"\n"); prog++; break; case OP_CHAR_CI: fxmessage("OP_CHAR_CI \""); if(' '<=*prog){ fxmessage("%c",*prog); } else { fxmessage("\\x%02x",*prog); } fxmessage("\"\n"); prog++; break; case OP_JUMP: fxmessage("OP_JUMP %-10p\n",*prog ? prog+*prog : 0); prog++; break; case OP_BRANCH: fxmessage("OP_BRANCH %-10p\n",*prog ? prog+*prog : 0); prog++; break; case OP_BRANCHREV: fxmessage("OP_BRANCHREV %-10p\n",*prog ? prog+*prog : 0); prog++; break; case OP_STAR: fxmessage("OP_STAR\n"); break; case OP_MIN_STAR: fxmessage("OP_MIN_STAR\n"); break; case OP_POS_STAR: fxmessage("OP_POS_STAR\n"); break; case OP_PLUS: fxmessage("OP_PLUS\n"); break; case OP_MIN_PLUS: fxmessage("OP_MIN_PLUS\n"); break; case OP_POS_PLUS: fxmessage("OP_POS_PLUS\n"); break; case OP_QUEST: fxmessage("OP_QUEST\n"); break; case OP_MIN_QUEST: fxmessage("OP_MIN_QUEST\n"); break; case OP_POS_QUEST: fxmessage("OP_POS_QUEST\n"); break; case OP_REP: min=*prog++; max=*prog++; fxmessage("OP_REP {%d,%d}\n",min,max); break; case OP_MIN_REP: min=*prog++; max=*prog++; fxmessage("OP_MIN_REP {%d,%d}\n",min,max); break; case OP_POS_REP: min=*prog++; max=*prog++; fxmessage("OP_POS_REP {%d,%d}\n",min,max); break; case OP_LOOK_NEG: fxmessage("OP_LOOK_NEG %-10p\n",*prog ? prog+*prog : 0); prog++; break; case OP_LOOK_POS: fxmessage("OP_LOOK_POS %-10p\n",*prog ? prog+*prog : 0); prog++; break; case OP_SUB_BEG+0: case OP_SUB_BEG+1: case OP_SUB_BEG+2: case OP_SUB_BEG+3: case OP_SUB_BEG+4: case OP_SUB_BEG+5: case OP_SUB_BEG+6: case OP_SUB_BEG+7: case OP_SUB_BEG+8: case OP_SUB_BEG+9: fxmessage("OP_SUB_BEG%d\n",op-OP_SUB_BEG); break; case OP_SUB_END+0: case OP_SUB_END+1: case OP_SUB_END+2: case OP_SUB_END+3: case OP_SUB_END+4: case OP_SUB_END+5: case OP_SUB_END+6: case OP_SUB_END+7: case OP_SUB_END+8: case OP_SUB_END+9: fxmessage("OP_SUB_END%d\n",op-OP_SUB_END); break; case OP_REF+0: case OP_REF+1: case OP_REF+2: case OP_REF+3: case OP_REF+4: case OP_REF+5: case OP_REF+6: case OP_REF+7: case OP_REF+8: case OP_REF+9: fxmessage("OP_REF%d\n",op-OP_REF); break; case OP_REF_CI+0: case OP_REF_CI+1: case OP_REF_CI+2: case OP_REF_CI+3: case OP_REF_CI+4: case OP_REF_CI+5: case OP_REF_CI+6: case OP_REF_CI+7: case OP_REF_CI+8: case OP_REF_CI+9: fxmessage("OP_REF_CI%d\n",op-OP_REF_CI); break; case OP_ZERO+0: case OP_ZERO+1: case OP_ZERO+2: case OP_ZERO+3: case OP_ZERO+4: case OP_ZERO+5: case OP_ZERO+6: case OP_ZERO+7: case OP_ZERO+8: case OP_ZERO+9: fxmessage("OP_ZERO%d\n",op-OP_ZERO); break; case OP_INCR+0: case OP_INCR+1: case OP_INCR+2: case OP_INCR+3: case OP_INCR+4: case OP_INCR+5: case OP_INCR+6: case OP_INCR+7: case OP_INCR+8: case OP_INCR+9: fxmessage("OP_INCR%d\n",op-OP_INCR); break; case OP_JUMPLT+0: case OP_JUMPLT+1: case OP_JUMPLT+2: case OP_JUMPLT+3: case OP_JUMPLT+4: case OP_JUMPLT+5: case OP_JUMPLT+6: case OP_JUMPLT+7: case OP_JUMPLT+8: case OP_JUMPLT+9: val=*prog++; fxmessage("OP_JUMPLT%d %d,%-10p\n",op-OP_JUMPLT,val,*prog ? prog+*prog : 0); prog++; break; case OP_JUMPGT+0: case OP_JUMPGT+1: case OP_JUMPGT+2: case OP_JUMPGT+3: case OP_JUMPGT+4: case OP_JUMPGT+5: case OP_JUMPGT+6: case OP_JUMPGT+7: case OP_JUMPGT+8: case OP_JUMPGT+9: val=*prog++; fxmessage("OP_JUMPGT%d %d,%-10p\n",op-OP_JUMPGT,val,*prog ? prog+*prog : 0); prog++; break; default: fxmessage("OP_%d: error\n",op); goto x; } } x:fxmessage("end\n"); } #endif /*******************************************************************************/ // FXCompile members // Parse hex escape code FXint hex(const FXchar*& pat){ register FXint ch,n; for(ch=0,n=2; Ascii::isHexDigit(*pat) && n; n--){ ch=(ch<<4)+Ascii::digitValue(*pat++); } return ch; } // Parse octal escape code FXint oct(const FXchar*& pat){ register FXint ch,n; for(ch=0,n=3; '0'<=*pat && *pat<='7' && n; n--){ ch=(ch<<3)+(*pat++-'0'); } return ch; } // Compiler main FXRexError FXCompile::compile(FXint& flags){ FXRexError err; if(*pat=='\0') return REGERR_EMPTY; if(mode&REX_VERBATIM) err=verbatim(flags); else err=expression(flags); if(err!=REGERR_OK) return err; if(*pat!='\0') return REGERR_PAREN; append(OP_END); return REGERR_OK; } // Parse without interpretation of magic characters FXRexError FXCompile::verbatim(FXint& flags){ FXint buf[MAXCHARS],ch,len; flags=FLG_WIDTH; while(*pat!='\0'){ len=0; do{ ch=*pat++; if(mode&REX_ICASE) ch=Ascii::toLower(ch); buf[len++]=(FXuchar)ch; } while(*pat!='\0' && lenrep_max) return REGERR_RANGE; // Illegal range if(rep_min==0 && rep_max==0) return REGERR_COUNT; // Bad count } if(*pat!='}') return REGERR_BRACE; // Unmatched brace pat++; break; default: return REGERR_TOKEN; } // Handle greedy, lazy, or possessive forms if(*pat=='?'){ // Lazy lazy=1; pat++; } else if(*pat=='+'){ // Possessive lazy=2; pat++; } else{ // Greedy lazy=0; } // If zero repetitions are allowed, then may have no width if(rep_min==0) flg&=~FLG_WIDTH; // Handle only non-trivial cases if(!(rep_min==1 && rep_max==1)){ // For simple repeats we prefix the last operation if(flg&FLG_SIMPLE){ if(rep_min==0 && rep_max==ONEINDIG){ insert(ptr,OP_STAR+lazy); } else if(rep_min==1 && rep_max==ONEINDIG){ insert(ptr,OP_PLUS+lazy); } else if(rep_min==0 && rep_max==1){ insert(ptr,OP_QUEST+lazy); } else{ insert(ptr,OP_REP+lazy,rep_min,rep_max); } } // For complex repeats we build loop constructs else{ FXASSERT(lazy!=2); // FIXME not yet implemented if(rep_min==0 && rep_max==ONEINDIG){ /* ________ ** | \ ** --B--(...)--J--+-- (...){0,ONEINDIG} ** \___________| */ insert(ptr,lazy?OP_BRANCHREV:OP_BRANCH,pc-ptr+3); append(OP_JUMP,ptr-pc-1); } else if(rep_min==1 && rep_max==ONEINDIG){ /* ________ ** | \ ** --+--(...)--B-- (...){1,ONEINDIG} ** */ append(lazy?OP_BRANCH:OP_BRANCHREV,ptr-pc-1); } else if(rep_min==0 && rep_max==1){ /* ** ** --B--(...)--+-- (...){0,1} ** \________| */ insert(ptr,lazy?OP_BRANCHREV:OP_BRANCH,pc-ptr+1); } else if(0=NSUBEXP) return REGERR_COMPLEX; insert(ptr,OP_ZERO+nbra); append(OP_INCR+nbra); append(OP_JUMPLT+nbra,rep_min,ptr-pc-1); nbra++; } else if(rep_min==0 && rep_max=NSUBEXP) return REGERR_COMPLEX; insert(ptr,OP_ZERO+nbra); insert(ptr+1,lazy?OP_BRANCHREV:OP_BRANCH,pc-ptr+4); append(OP_INCR+nbra); append(OP_JUMPLT+nbra,rep_max,ptr-pc-1); nbra++; } else if(0=NSUBEXP) return REGERR_COMPLEX; insert(ptr,OP_ZERO+nbra); append(OP_INCR+nbra); append(OP_JUMPLT+nbra,rep_min,ptr-pc-1); append(lazy?OP_BRANCH:OP_BRANCHREV,ptr-pc); nbra++; } else{ /* ___________________ ** | ___________ \ ** | | \ \ ** --Z--+--+--(...)--I--L--G--B--+-- (...){n,m} ** \____| */ if(nbra>=NSUBEXP) return REGERR_COMPLEX; insert(ptr,OP_ZERO+nbra); append(OP_INCR+nbra); append(OP_JUMPLT+nbra,rep_min,ptr-pc-1); append(OP_JUMPGT+nbra,rep_max,3); append(lazy?OP_BRANCH:OP_BRANCHREV,ptr-pc); nbra++; } } } } flags=flg&FLG_WIDTH; return REGERR_OK; } // Parse atom FXRexError FXCompile::atom(FXint& flags){ FXint buf[MAXCHARS],level,save,ch,len,flg,*ptr; const FXchar *p; FXRexError err; flags=FLG_WORST; // Assume the worst switch(*pat){ case '(': // Subexpression grouping pat++; if(*pat=='?'){ pat++; ch=*pat++; if(ch==':'){ // Non capturing parentheses err=expression(flg); if(err!=REGERR_OK) return err; // Propagate error } else if(ch=='=' || ch=='!'){ // Positive or negative look ahead append((ch=='=')?OP_LOOK_POS:OP_LOOK_NEG); ptr=append(0); err=expression(flg); if(err!=REGERR_OK) return err; // Propagate error append(OP_SUCCEED); patch(ptr,pc); // If trailing context matches (fails), go here! flg=FLG_WORST; // Look ahead has no width! } else if(ch=='>'){ // Atomic group // FIXME } else if(ch=='i' || ch=='I' || ch=='n' || ch=='N'){ save=mode; // Save flags if(ch=='i') mode|=REX_ICASE; if(ch=='I') mode&=~REX_ICASE; if(ch=='n') mode|=REX_NEWLINE; if(ch=='N') mode&=~REX_NEWLINE; err=expression(flg); if(err!=REGERR_OK) return err; // Propagate error mode=save; // Restore flags } else{ return REGERR_TOKEN; } } else if(mode&REX_CAPTURE){ // Capturing level=++npar; if(level>=NSUBEXP) return REGERR_COMPLEX; // Expression too complex append(OP_SUB_BEG+level); err=expression(flg); if(err!=REGERR_OK) return err; // Propagate error append(OP_SUB_END+level); } else{ // Normal err=expression(flg); if(err!=REGERR_OK) return err; // Propagate error } if(*pat!=')') return REGERR_PAREN; // Unmatched parenthesis pat++; flags=flg&~FLG_SIMPLE; break; case '.': // Any character pat++; append((mode&REX_NEWLINE)?OP_ANY_NL:OP_ANY); flags=FLG_WIDTH|FLG_SIMPLE; break; case '^': // Begin of line pat++; append(OP_LINE_BEG); break; case '$': // End of line pat++; append(OP_LINE_END); break; case '*': // No preceding atom case '+': case '?': case '{': return REGERR_NOATOM; case '\0': // Technically, this can not happen! case '|': case ')': return REGERR_NOATOM; case '}': // Unmatched brace return REGERR_BRACE; case '[': pat++; err=charset(); if(err!=REGERR_OK) return err; // Bad character class if(*pat!=']') return REGERR_BRACK; // Unmatched bracket pat++; flags=FLG_WIDTH|FLG_SIMPLE; break; case ']': // Unmatched bracket return REGERR_BRACK; case '\\': // Escape sequences which are NOT part of simple character-run ch=*(pat+1); switch(ch){ case '\0': // Unexpected pattern end return REGERR_NOATOM; case 'w': // Word character append(OP_WORD); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'W': // Non-word character append((mode&REX_NEWLINE)?OP_NOT_WORD_NL:OP_NOT_WORD); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 's': // Space append((mode&REX_NEWLINE)?OP_SPACE_NL:OP_SPACE); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'S': // Non-space append(OP_NOT_SPACE); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'd': // Digit append(OP_DIGIT); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'D': // Non-digit append((mode&REX_NEWLINE)?OP_NOT_DIGIT_NL:OP_NOT_DIGIT); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'h': // Hex digit append(OP_HEX); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'H': // Non-hex digit append((mode&REX_NEWLINE)?OP_NOT_HEX_NL:OP_NOT_HEX); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'p': // Punctuation append(OP_PUNCT); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'P': // Non-punctuation append((mode&REX_NEWLINE)?OP_NOT_PUNCT_NL:OP_NOT_PUNCT); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'l': // Letter append(OP_LETTER); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'L': // Non-letter append((mode&REX_NEWLINE)?OP_NOT_LETTER_NL:OP_NOT_LETTER); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'u': // Upper case append(OP_UPPER); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'U': // Lower case append(OP_LOWER); pat+=2; flags=FLG_WIDTH|FLG_SIMPLE; return REGERR_OK; case 'b': // Word boundary append(OP_WORD_BND); pat+=2; return REGERR_OK; case 'B': // Word interior append(OP_WORD_INT); pat+=2; return REGERR_OK; case 'A': // Match only beginning of string append(OP_STR_BEG); pat+=2; return REGERR_OK; case 'Z': // Match only and end of string append(OP_STR_END); pat+=2; return REGERR_OK; case '<': // Begin of word append(OP_WORD_BEG); pat+=2; return REGERR_OK; case '>': // End of word append(OP_WORD_END); pat+=2; return REGERR_OK; case '1': // Back reference to previously matched subexpression case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if(!(mode&REX_CAPTURE)) return REGERR_BACKREF; // Can't do backreferences level=ch-'0'; if(level>npar) return REGERR_BACKREF; // Back reference out of range append((mode&REX_ICASE)?(OP_REF_CI+level):(OP_REF+level)); pat+=2; return REGERR_OK; } /*fall*/ default: len=0; do{ p=pat; // In case we need to back up... ch=*pat; switch(ch){ case '^': // Bail out on magic characters case '$': case '.': case '(': case ')': case '[': case ']': case '|': goto x; case '\\': ch=*(pat+1); switch(ch){ case 'w': // Bail out on special matching constructs case 'W': case 's': case 'S': case 'd': case 'D': case 'h': case 'H': case 'p': case 'P': case 'l': case 'L': case 'u': case 'U': case 'b': case 'B': case 'A': case 'Z': case '<': case '>': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto x; case 'a': // Bell pat+=2; ch='\a'; break; case 'e': // Escape pat+=2; ch='\033'; break; case 'f': // Form feed pat+=2; ch='\f'; break; case 'n': // Newline pat+=2; ch='\n'; break; case 'r': // Return pat+=2; ch='\r'; break; case 't': // Tab pat+=2; ch='\t'; break; case 'v': // Vertical tab pat+=2; ch='\v'; break; case 'c': // Control character pat+=2; ch=*pat++; if(ch=='\0') return REGERR_NOATOM;// Unexpected pattern end ch=Ascii::toUpper(ch)-'@'; break; case '0': // Octal digit pat+=2; ch=oct(pat); if(ch>256) return REGERR_TOKEN; // Characters should be 0..255 break; case 'x': // Hex digit pat+=2; ch=hex(pat); if(ch>256) return REGERR_TOKEN; // Characters should be 0..255 break; case '\0': // Unexpected pattern end return REGERR_NOATOM; default: pat+=2; break; } break; case '\0': // Unexpected pattern end return REGERR_NOATOM; default: pat++; break; } // Make lower case? if(mode&REX_ICASE) ch=Ascii::toLower(ch); // Add to buffer buf[len++]=(FXuchar)ch; } while(*pat!='\0' && *pat!='*' && *pat!='+' && *pat!='?' && *pat!='{' && len // ( ) // ( ) // ... ... // ( ) // // Parse character class FXRexError FXCompile::charset(){ register FXint first,last,op,i; FXint set[8]; CLEAR(set); first=-1; if(*pat=='^'){ // Negated character class op=OP_ANY_BUT; pat++; } else{ op=OP_ANY_OF; } if(*pat=='-' || *pat==']') goto in; // '-' and ']' are literal at begin while(*pat!='\0' && *pat!=']'){ in: last=*pat++; if(last=='\\'){ last=*pat++; switch(last){ case 'w': for(i=0; i<256; i++) {if(isword(i)) INCL(set,i); } first=-1; continue; case 'W': for(i=0; i<256; i++){ if(!isword(i)) INCL(set,i); } first=-1; continue; case 's': for(i=0; i<256; i++){ if(Ascii::isSpace(i)) INCL(set,i); } first=-1; continue; case 'S': for(i=0; i<256; i++){ if(!Ascii::isSpace(i)) INCL(set,i); } first=-1; continue; case 'd': for(i=0; i<256; i++){ if(Ascii::isDigit(i)) INCL(set,i); } first=-1; continue; case 'D': for(i=0; i<256; i++){ if(!Ascii::isDigit(i)) INCL(set,i); } first=-1; continue; case 'h': for(i=0; i<256; i++){ if(Ascii::isHexDigit(i)) INCL(set,i); } first=-1; continue; case 'H': for(i=0; i<256; i++){ if(!Ascii::isHexDigit(i)) INCL(set,i); } first=-1; continue; case 'p': for(i=0; i<256; i++){ if(isdelim(i)) INCL(set,i); } first=-1; continue; case 'P': for(i=0; i<256; i++){ if(!isdelim(i)) INCL(set,i); } first=-1; continue; case 'l': for(i=0; i<256; i++){ if(Ascii::isLetter(i)) INCL(set,i); } first=-1; continue; case 'L': for(i=0; i<256; i++){ if(!Ascii::isLetter(i)) INCL(set,i); } first=-1; continue; case 'u': for(i=0; i<256; i++){ if(Ascii::isUpper(i)) INCL(set,i); } first=-1; continue; case 'U': for(i=0; i<256; i++){ if(Ascii::isLower(i)) INCL(set,i); } first=-1; continue; case 'a': // Bell last='\a'; break; case 'e': // Escape last='\033'; break; case 'b': // Backspace last='\b'; break; case 'f': // Form feed last='\f'; break; case 'n': // Newline last='\n'; break; case 'r': // Return last='\r'; break; case 't': // Tab last='\t'; break; case 'v': // Vertical tab last='\v'; break; case 'c': // Control character last=*pat++; if(last=='\0') return REGERR_NOATOM;// Unexpected pattern end last=Ascii::toUpper(last)-'@'; break; case '0': // Octal digit last=oct(pat); break; case 'x': // Hex digit last=hex(pat); break; case '\0': return REGERR_NOATOM; // Unexpected pattern end } } if(first==-1){ if(mode&REX_ICASE){ INCL(set,Ascii::toLower(last)); INCL(set,Ascii::toUpper(last)); } else{ INCL(set,last); } if(*pat=='-' && *(pat+1)!='\0' && *(pat+1)!=']'){ first=last; pat++; } } else{ if(first>=last) return REGERR_RANGE; // Bad range if(mode&REX_ICASE){ for(i=first; i<=last; i++){ INCL(set,Ascii::toLower(i)); INCL(set,Ascii::toUpper(i)); } } else{ for(i=first; i<=last; i++){ INCL(set,i); } } first=-1; } } // Are we matching newlines if((op==OP_ANY_BUT) && !(mode&REX_NEWLINE) && !ISIN(set,'\n')){ INCL(set,'\n'); } // Emit opcode append(op,set); return REGERR_OK; } // Append opcode FXint* FXCompile::append(FXint op){ register FXint *val=pc; if(code){ pc[0]=op; } pc++; return val; } // Append one-argument opcode FXint* FXCompile::append(FXint op,FXint arg){ register FXint *val=pc; if(code){ pc[0]=op; pc[1]=arg; } pc+=2; return val; } // Append two-argument opcode FXint* FXCompile::append(FXint op,FXint arg1,FXint arg2){ register FXint *val=pc; if(code){ pc[0]=op; pc[1]=arg1; pc[2]=arg2; } pc+=3; return val; } // Append character class opcode FXint* FXCompile::append(FXint op,FXint set[]){ register FXint *val=pc; if(code){ pc[0]=op; pc[1]=set[0]; pc[2]=set[1]; pc[3]=set[2]; pc[4]=set[3]; pc[5]=set[4]; pc[6]=set[5]; pc[7]=set[6]; pc[8]=set[7]; } pc+=9; return val; } // Append character array FXint* FXCompile::append(FXint op,FXint len,FXint *data){ register FXint *val=pc; if(code){ pc[0]=op; pc[1]=len; memcpy(pc+2,data,sizeof(FXint)*len); } pc+=len+2; return val; } // Insert opcode at ptr FXint* FXCompile::insert(FXint *ptr,FXint op){ if(code){ memmove(ptr+1,ptr,sizeof(FXint)*(pc-ptr)); ptr[0]=op; } pc+=1; return ptr; } // Insert one-argument opcode at ptr FXint* FXCompile::insert(FXint *ptr,FXint op,FXint arg){ if(code){ memmove(ptr+2,ptr,sizeof(FXint)*(pc-ptr)); ptr[0]=op; ptr[1]=arg; } pc+=2; return ptr; } // Insert two-argument opcode at ptr FXint* FXCompile::insert(FXint *ptr,FXint op,FXint arg1,FXint arg2){ if(code){ memmove(ptr+3,ptr,sizeof(FXint)*(pc-ptr)); ptr[0]=op; ptr[1]=arg1; ptr[2]=arg2; } pc+=3; return ptr; } // Patch linked set of branches or jumps // Example: // // Before: After: // ========================== // 0: OP_JUMP 0: OP_JUMP // 1: 0 1: 9 // 2: .... 2: .... // 3: OP_JUMP 3: OP_JUMP // 4: -3 4: 6 // 5: .... 5: .... // 6: .... 6: .... // 7: OP_JUMP 7: OP_JUMP // fm-> 8: -4 8: 2 // 9: .... 9: .... // to->10: .... 10: .... // void FXCompile::patch(FXint *fm,FXint *to){ register FXint delta; if(code && fm){ do{ delta=*fm; *fm=to-fm; fm+=delta; } while(delta); } } /*******************************************************************************/ // FXExecute members // The workhorse bool FXExecute::match(const FXint* prog){ register FXint no,keep,rep_min,rep_max,greed,op; register const FXchar *save,*beg,*end; register FXchar ch; for(;;){ op=*prog++; switch(op){ case OP_END: return true; case OP_FAIL: // Fail (sub) pattern return false; case OP_SUCCEED: // Succeed (sub) pattern return true; case OP_JUMP: prog+=*prog; break; case OP_BRANCH: // Jump after trying following code save=str; if(match(prog+1)) return true; str=save; prog+=*prog; break; case OP_BRANCHREV: // Jump before trying following code save=str; if(match(prog+*prog)) return true; str=save; prog++; break; case OP_LINE_BEG: // Must be at begin of line if((str==str_beg && (mode&REX_NOT_BOL)) || (str_begstr_end) return false; do{ if(*prog++ != (FXuchar)*str++) return false; } while(--no); break; case OP_CHARS_CI: // Match a run of 1 or more characters, disregard case no=*prog++; if(str+no>str_end) return false; do{ if(*prog++ != Ascii::toLower(*str++)) return false; } while(--no); break; case OP_SPACE: // Match space if(str==str_end || *str=='\n' || !Ascii::isSpace(*str)) return false; str++; break; case OP_SPACE_NL: // Match space including newline if(str==str_end || !Ascii::isSpace(*str)) return false; str++; break; case OP_NOT_SPACE: // Match non-space if(str==str_end || Ascii::isSpace(*str)) return false; str++; break; case OP_DIGIT: // Match a digit 0..9 if(str==str_end || !Ascii::isDigit(*str)) return false; str++; break; case OP_NOT_DIGIT: // Match a non-digit if(str==str_end || *str=='\n' || Ascii::isDigit(*str)) return false; str++; break; case OP_NOT_DIGIT_NL: // Match a non-digit including newline if(str==str_end || Ascii::isDigit(*str)) return false; str++; break; case OP_HEX: // Match a hex digit 0..9A-Fa-f if(str==str_end || !Ascii::isHexDigit(*str)) return false; str++; break; case OP_NOT_HEX: // Match a non-hex digit if(str==str_end || *str=='\n' || Ascii::isHexDigit(*str)) return false; str++; break; case OP_NOT_HEX_NL: // Match a non-hex digit including newline if(str==str_end || Ascii::isHexDigit(*str)) return false; str++; break; case OP_PUNCT: // Match a punctuation if(str==str_end || !isdelim((FXuchar) *str)) return false; str++; break; case OP_NOT_PUNCT: // Match a non-punctuation if(str==str_end || *str=='\n' || isdelim((FXuchar) *str)) return false; str++; break; case OP_NOT_PUNCT_NL: // Match a non-punctuation including newline if(str==str_end || isdelim((FXuchar) *str)) return false; str++; break; case OP_LETTER: // Match a letter a..z, A..Z if(str==str_end || !Ascii::isLetter(*str)) return false; str++; break; case OP_NOT_LETTER: // Match a non-letter if(str==str_end || *str=='\n' || Ascii::isLetter(*str)) return false; str++; break; case OP_NOT_LETTER_NL: // Match a non-letter including newline if(str==str_end || Ascii::isLetter(*str)) return false; str++; break; case OP_WORD: // Match a word character a..z,A..Z,0..9,_ if(str==str_end || !isword((FXuchar) *str)) return false; str++; break; case OP_NOT_WORD: // Match a non-word character if(str==str_end || *str=='\n' || isword((FXuchar) *str)) return false; str++; break; case OP_NOT_WORD_NL: // Match a non-word character including newline if(str==str_end || isword((FXuchar) *str)) return false; str++; break; case OP_UPPER: // Match if uppercase if(str==str_end || !Ascii::isUpper(*str)) return false; str++; break; case OP_LOWER: // Match if lowercase if(str==str_end || !Ascii::isLower(*str)) return false; str++; break; case OP_ANY: // Match any character if(str==str_end || *str=='\n') return false; str++; break; case OP_ANY_NL: // Matches any character including newline if(str==str_end) return false; str++; break; case OP_MIN_PLUS: // Lazy one or more repetitions rep_min=1; rep_max=ONEINDIG; greed=0; goto rep; case OP_POS_PLUS: // Possessive one or more repetitions rep_min=1; rep_max=ONEINDIG; greed=2; goto rep; case OP_PLUS: // Greedy one or more repetitions rep_min=1; rep_max=ONEINDIG; greed=1; goto rep; case OP_MIN_QUEST: // Lazy zero or one rep_min=0; rep_max=1; greed=0; goto rep; case OP_POS_QUEST: // Possessive zero or one rep_min=0; rep_max=1; greed=2; goto rep; case OP_QUEST: // Greedy zero or one rep_min=0; rep_max=1; greed=1; goto rep; case OP_MIN_REP: // Lazy bounded repeat rep_min=*prog++; rep_max=*prog++; greed=0; goto rep; case OP_POS_REP: // Possessive bounded repeat rep_min=*prog++; rep_max=*prog++; greed=2; goto rep; case OP_REP: // Greedy bounded repeat rep_min=*prog++; rep_max=*prog++; greed=1; goto rep; case OP_MIN_STAR: // Lazy zero or more repetitions rep_min=0; rep_max=ONEINDIG; greed=0; goto rep; case OP_POS_STAR: // Possessive zero or more repetitions rep_min=0; rep_max=ONEINDIG; greed=2; goto rep; case OP_STAR: // Greedy zero or more repetitions rep_min=0; rep_max=ONEINDIG; greed=1; // We need to match more characters than are available rep: if(str+rep_min>str_end) return false; beg=str; end=beg+rep_max; if(end>str_end) end=str_end; save=beg; // Find out how much could be matched op=*prog++; switch(op){ case OP_CHAR: // For UTF8 we should have OP_CHAR2, OP_CHAR3, ... OP_CHAR6, for possible UTF8 lengths ch=*prog++; while(save=npar) break; // Match w/o capture if array too small keep=sub_beg[no]; // Keep old value sub_beg[no]=str-str_beg; // Tentatively set new value if(match(prog)) return true; // Match the rest sub_beg[no]=keep; // Restore old value return false; case OP_SUB_END+0: // Capturing close parentheses case OP_SUB_END+1: case OP_SUB_END+2: case OP_SUB_END+3: case OP_SUB_END+4: case OP_SUB_END+5: case OP_SUB_END+6: case OP_SUB_END+7: case OP_SUB_END+8: case OP_SUB_END+9: no=op-OP_SUB_END; if(no>=npar) break; // Match w/o capture if array too small keep=sub_end[no]; sub_end[no]=str-str_beg; // Remember capture end for future back reference if(match(prog)) return true; sub_end[no]=keep; // Restore old value return false; case OP_REF+0: // Back reference to capturing parentheses case OP_REF+1: case OP_REF+2: case OP_REF+3: case OP_REF+4: case OP_REF+5: case OP_REF+6: case OP_REF+7: case OP_REF+8: case OP_REF+9: no=op-OP_REF; if(no>=npar) return false; // Arrays were too small if(sub_beg[no]<0) return false; // Not captured yet if(sub_end[no]<0) return false; // Not captured yet beg=str_beg+sub_beg[no]; end=str_beg+sub_end[no]; if(begstr_end) return false; // Not enough characters left do{ if(*beg != *str) return false; // No match beg++; str++; } while(beg=npar) return false; // Arrays were too small if(sub_beg[no]<0) return false; // Not captured yet if(sub_end[no]<0) return false; // Not captured yet beg=str_beg+sub_beg[no]; end=str_beg+sub_end[no]; if(begstr_end) return false; // Not enough characters left do{ if(*beg != Ascii::toLower(*str)) return false; // No match beg++; str++; } while(beg *prog++) // Compare with value prog+=*prog; else prog++; break; default: fxerror("FXRex::match: bad opcode (%d) at: %p on line: %d\n",op,prog-1,__LINE__); break; } } return false; } // regtry - try match at specific point; 0 failure, 1 success bool FXExecute::attempt(const FXchar* string){ register FXint i=npar; str=string; do{--i;sub_beg[i]=sub_end[i]=-1;}while(i); // Possibly move this to FXExecute::execute? if(match(code+1)){ if(string!=str || !(mode&REX_NOT_EMPTY)){ // Match if non-empty or empty is allowed! sub_beg[0]=string-str_beg; sub_end[0]=str-str_beg; return true; } } return false; } // Match subject string, returning number of matches found bool FXExecute::execute(const FXchar* fm,const FXchar* to){ register FXchar ch; // Simple case if(fm==to) return attempt(fm); // Match backwards if(mode&REX_BACKWARD){ if(code[1]==OP_STR_BEG){ // Anchored at string start return (fm==str_beg) && attempt(str_beg); } if(code[1]==OP_LINE_BEG){ // Anchored at BOL while(fm<=to){ if(((to==str_beg)||(*(to-1)=='\n')) && attempt(to)) return true; to--; } return false; } if(code[1]==OP_CHAR || code[1]==OP_CHARS){ // Known starting character ch=(code[1]==OP_CHAR)?code[2]:code[3]; if(to==str_end) to--; while(fm<=to){ if(*to==ch && attempt(to)) return true; to--; } return false; } if(code[1]==OP_CHAR_CI || code[1]==OP_CHARS_CI){ // Known starting character, ignoring case ch=(code[1]==OP_CHAR_CI)?code[2]:code[3]; if(to==str_end) to--; while(fm<=to){ if(Ascii::toLower(*to)==ch && attempt(to)) return true; to--; } return false; } while(fm<=to){ // General case if(attempt(to)) return true; to--; } } // Match forwards else{ if(code[1]==OP_STR_BEG){ // Anchored at string start return (fm==str_beg) && attempt(str_beg); } if(code[1]==OP_LINE_BEG){ // Anchored at BOL while(fm<=to){ if(((fm==str_beg)||(*(fm-1)=='\n')) && attempt(fm)) return true; fm++; } return false; } if(code[1]==OP_CHAR || code[1]==OP_CHARS){ // Known starting character ch=(code[1]==OP_CHAR)?code[2]:code[3]; if(to==str_end) to--; while(fm<=to){ if(*fm==ch && attempt(fm)) return true; fm++; } return false; } if(code[1]==OP_CHAR_CI || code[1]==OP_CHARS_CI){ // Known starting character, ignoring case ch=(code[1]==OP_CHAR_CI)?code[2]:code[3]; if(to==str_end) to--; while(fm<=to){ if(Ascii::toLower(*fm)==ch && attempt(fm)) return true; fm++; } return false; } while(fm<=to){ // General case if(attempt(fm)) return true; fm++; } } return false; } } /*******************************************************************************/ namespace FX { // Table of error messages const FXchar *const FXRex::errors[]={ "OK", "Empty pattern", "Unmatched parenthesis", "Unmatched bracket", "Unmatched brace", "Bad character range", "Bad escape sequence", "Bad counted repeat", "No atom preceding repetition", "Repeat following repeat", "Bad backward reference", "Bad character class", "Expression too complex", "Out of memory", "Illegal token" }; // Default program always fails const FXint FXRex::fallback[]={2,OP_FAIL}; // Copy regex object FXRex::FXRex(const FXRex& orig){ code=(FXint*)fallback; if(orig.code!=fallback){ FXMEMDUP(&code,orig.code,FXint,orig.code[0]); } } // Compile expression from pattern; fail if error FXRex::FXRex(const FXchar* pattern,FXint mode,FXRexError* error):code((FXint*)fallback){ FXRexError err=parse(pattern,mode); if(error){ *error=err; } } // Compile expression from pattern; fail if error FXRex::FXRex(const FXString& pattern,FXint mode,FXRexError* error):code((FXint*)fallback){ FXRexError err=parse(pattern.text(),mode); if(error){ *error=err; } } // Assignment FXRex& FXRex::operator=(const FXRex& orig){ if(code!=orig.code){ if(code!=fallback) FXFREE(&code); code=(FXint*)fallback; if(orig.code!=fallback){ FXMEMDUP(&code,orig.code,FXint,orig.code[0]); } } return *this; } // Parse pattern FXRexError FXRex::parse(const FXchar* pattern,FXint mode){ FXRexError err=REGERR_EMPTY; FXCompile cs; FXint flags,size; // Free old code, if any if(code!=fallback) FXFREE(&code); code=(FXint*)fallback; // Check if(pattern){ // Fill in compile data cs.code=NULL; cs.pc=NULL; cs.pat=pattern; cs.mode=mode; cs.nbra=0; cs.npar=0; // Unknown size cs.append(0); // Check syntax and amount of memory needed err=cs.compile(flags); if(err==REGERR_OK){ // Compile code unless only syntax checking if(!(mode&REX_SYNTAX)){ // Allocate new code size=cs.pc-((FXint*)NULL); if(!FXMALLOC(&code,FXint,size)){ code=(FXint*)fallback; return REGERR_MEMORY; } // Fill in compile data cs.code=code; cs.pc=code; cs.pat=pattern; cs.mode=mode; cs.nbra=0; cs.npar=0; // Size of program cs.append(size); // Generate program err=cs.compile(flags); // Dump for debugging #ifndef NDEBUG if(fxTraceLevel>100) dump(code); #endif } } } return err; } // Parse pattern, return error code if syntax error is found FXRexError FXRex::parse(const FXString& pattern,FXint mode){ return parse(pattern.text(),mode); } /*******************************************************************************/ // Match subject string, returning number of matches found bool FXRex::match(const FXchar* string,FXint len,FXint* beg,FXint* end,FXint mode,FXint npar,FXint fm,FXint to) const { if(!string || len<0 || npar<1 || NSUBEXPlen) to=len; if(fm<=to){ FXint abeg[NSUBEXP]; FXint aend[NSUBEXP]; FXExecute ms; if(!beg) beg=abeg; if(!end) end=aend; ms.str_beg=string; ms.str_end=string+len; ms.sub_beg=beg; ms.sub_end=end; ms.code=code; ms.npar=npar; ms.mode=mode; return ms.execute(string+fm,string+to); } return false; } // Search for match in string bool FXRex::match(const FXString& string,FXint* beg,FXint* end,FXint mode,FXint npar,FXint fm,FXint to) const { return match(string.text(),string.length(),beg,end,mode,npar,fm,to); } // Return substitution string FXString FXRex::substitute(const FXchar* string,FXint len,FXint* beg,FXint* end,const FXString& replace,FXint npar){ register FXint ch,n,i=0; FXString result; if(!string || len<0 || !beg || !end || npar<1 || NSUBEXP>(FXStream& store,FXRex& s){ FXint size; store >> size; FXMALLOC(&s.code,FXint,size); store.load(s.code+1,size-1); return store; } // Clean up FXRex::~FXRex(){ if(code!=fallback) FXFREE(&code); } } fox1.6-1.6.57/src/FXRootWindow.cpp000066400000000000000000000137701326741342000165110ustar00rootroot00000000000000/******************************************************************************** * * * R o o t W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRootWindow.cpp,v 1.35 2006/01/22 17:58:40 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXVisual.h" #include "FXRootWindow.h" /* Notes: - Size of FXRootWindow is now size of the entire virtual display, which is a tiled virtual area of primary and secondary display adapters. */ #define DISPLAY(app) ((Display*)((app)->display)) using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXRootWindow,FXComposite,NULL,0) // Construct root window FXRootWindow::FXRootWindow(FXApp* a,FXVisual *vis):FXComposite(a,vis){ } #ifdef WIN32 // Returns device context FXID FXRootWindow::GetDC() const { LockWindowUpdate(GetDesktopWindow()); return GetDCEx(GetDesktopWindow(),NULL,DCX_CACHE|DCX_LOCKWINDOWUPDATE); } // Release DC int FXRootWindow::ReleaseDC(FXID hdc) const { int status=::ReleaseDC(GetDesktopWindow(),(HDC)hdc); LockWindowUpdate(NULL); return status; } #endif // When created, create subwindows ONLY void FXRootWindow::create(){ register FXWindow *child; if(!xid){ #ifndef WIN32 // Got to have a visual if(!visual){ fxerror("%s::create: trying to create window without a visual.\n",getClassName()); } // Initialize visual visual->create(); xid=RootWindow(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))); width=DisplayWidth(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))); height=DisplayHeight(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))); #else // Got to have a visual if(!visual){ fxerror("%s::create: trying to create window without a visual.\n",getClassName()); } // Initialize visual visual->create(); // Get HWND of desktop window xid=GetDesktopWindow(); // Obtain size HDC hdc=::GetDC((HWND)xid); width=GetDeviceCaps(hdc,HORZRES); height=GetDeviceCaps(hdc,VERTRES); ::ReleaseDC((HWND)xid,hdc); // The code below returns the size of the entire virtual // screen area instead of just that of the primary display; // thanks to "Steve Granja" . // [Apparently does not work on Win95 and WinNT...] //xpos=GetSystemMetrics(SM_XVIRTUALSCREEN); //ypos=GetSystemMetrics(SM_YVIRTUALSCREEN); //width=GetSystemMetrics(SM_CXVIRTUALSCREEN); //height=GetSystemMetrics(SM_CYVIRTUALSCREEN); #endif // Normally create children for(child=getFirst(); child; child=child->getNext()) child->create(); } } // Detach window void FXRootWindow::detach(){ register FXWindow *child; visual->detach(); if(xid){ for(child=getFirst(); child; child=child->getNext()) child->detach(); xid=0; } } // When deleted, delete subwindows ONLY void FXRootWindow::destroy(){ register FXWindow *child; if(xid){ for(child=getFirst(); child; child=child->getNext()) child->destroy(); xid=0; } } // Get default width FXint FXRootWindow::getDefaultWidth(){ #ifndef WIN32 return DisplayWidth(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))); #else HDC hdc=::GetDC(GetDesktopWindow()); FXint w=GetDeviceCaps(hdc,HORZRES); ::ReleaseDC(GetDesktopWindow(),hdc); return w; #endif } // Get default height FXint FXRootWindow::getDefaultHeight(){ #ifndef WIN32 return DisplayHeight(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))); #else HDC hdc=::GetDC(GetDesktopWindow()); FXint h=GetDeviceCaps(hdc,VERTRES); ::ReleaseDC(GetDesktopWindow(),hdc); return h; #endif } // Moving root has no effect void FXRootWindow::move(FXint,FXint){ } // Move and resize root has no effect void FXRootWindow::position(FXint,FXint,FXint,FXint){ } // Resize root window has no effect void FXRootWindow::resize(FXint,FXint){ } // Layout of root window void FXRootWindow::layout(){ } // Mark as dirty void FXRootWindow::recalc(){ } // Root can not be focused on void FXRootWindow::setFocus(){ } // Root can not be unfocused void FXRootWindow::killFocus(){ } // Does not destroy root window FXRootWindow::~FXRootWindow(){ xid=0; } } fox1.6-1.6.57/src/FXRuler.cpp000066400000000000000000001222411326741342000154610ustar00rootroot00000000000000/******************************************************************************** * * * R u l e r W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRuler.cpp,v 1.55 2006/01/28 20:29:30 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXRuler.h" /* Notes: - If showing arrows for cursor position, draw them down (right) when ticks are centered or bottom (right). Metric: 0 1 2 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | . . . English: 0 1 2 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | . . . - Subdivide repeatedly when zooming in/out: "pi", 1.0, 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 1, 5, 10, 50, 100 "in", 72.0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1, 2, 4, 8, 16 "cm", 28.35, 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 1, 5, 10, 50, 100 - Layout: edgeSpacing edgeSpacing |<-->| |<-->| | | | | +----+-------------------------------------------------------------------+----+ | | | | | | | | | | marginLower marginUpper | | | |<---->| |<---->| | | | | | | | | +------+-----------------------------------------------------+------+ | | | | | | | | | | indentFirst | | | | | |<--------->| | | | | | | | | | | | | | | | | | | | | indentLower indentUpper | | | | | |<---->| | |<---->| | | | | | | | | | | | | | +------+----+----------------------------------+------+ | | | | | | | | | | | | | | | We, The People of the United States, | | | | | | in Order................................. | | | | | | ......................................... | | | | | | ......................................... | | | | | | ......................................... | | | | | | ......................................... | | | | | | | | | | | | | +------+---------------------------------------+------+ | | | | | | | | | | | | | | | | | +------+----------------------------------------------+------+------+ | | | | | | | | | |<--------------------------------------------------->| | | | | printable (must be smaller than docSize) | | | | | | | | | | | |<----------------------------------------------------------------->| | | documentSize | | | | | +-----------------------------------------------------------------------------+ | | | | |<--------------------------------------------------------------------------->| contentSize - Values of indentFirst, indentLower, may be negative, but not less than -marginLower. - Likewise indentUpper may be negative, but not less than -marginUpper. - Content width is documentSize+2*edgeSpacing; this may exceed viewport width, i.e. the width of the ruler itself (we assume the horizontal ruler extends over the entire usable viewport area). - If viewport larger that content, keep document centered in view; otherwise, keep document away from left edge by docSpace (and then we pop scrollbars into the picture). - Tickmarks start counting from left printable margin, i.e. common setting for lowerPara and upperPara would be 0, for full utilization of paper. - Ruler items: o Downpointing triangle is first line indent o Up pointing left triangle is left indent o Up pointing right triangle is right indent o Left, right darker area is margins - Metrics: 1) Document width 2) Document margins 3) Paragraph start/end 4) Paragraph firstline indent 5) Paragraph tab positions and tab types 6) Scroll offset - Should we constrain indent settings to multiples of pixelPerTick? */ #define ARROWBASE 9 // Size of cursor arrows (must be odd) #define ARROWLENGTH 4 // The above divided by two #define MARKERBASE 9 // Base of marker #define MARKERLENGTH 4 // The above divided by two #define EXTRASPACING 3 // Spacing below/above ticks or text #define MAJORTICKSIZE 6 // Length of major ticks #define MEDIUMTICKSIZE 4 // Length of medium ticks #define MINORTICKSIZE 2 // Length of minor ticks #define EDGESPACING 20 // Default space around edges of document #define MARGINSPACE 25 // Default margin space (0.25in x 100dpi) //#define DOCUMENTSIZE 850 // Default document size (8.5in x 100dpi) #define DOCUMENTSIZE 600 // Default document size (8.5in x 100dpi) #define FUDGE 2 // Fudge proximity // Ruler style bits #define RULER_MASK (RULER_HORIZONTAL|RULER_VERTICAL|RULER_TICKS_TOP|RULER_TICKS_BOTTOM|RULER_NUMBERS|RULER_ARROW|RULER_MARKERS|RULER_METRIC|RULER_ENGLISH|RULER_MARGIN_ADJUST) // Ruler alignment bits #define RULER_ALIGN_MASK (RULER_ALIGN_CENTER|RULER_ALIGN_LEFT|RULER_ALIGN_RIGHT|RULER_ALIGN_STRETCH) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXRuler) FXRulerMap[]={ FXMAPFUNC(SEL_PAINT,0,FXRuler::onPaint), FXMAPFUNC(SEL_MOTION,0,FXRuler::onMotion), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXRuler::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXRuler::onLeftBtnRelease), FXMAPFUNC(SEL_QUERY_TIP,0,FXRuler::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXRuler::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXRuler::ID_SETVALUE,FXRuler::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXRuler::ID_SETINTVALUE,FXRuler::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXRuler::ID_GETINTVALUE,FXRuler::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXRuler::ID_SETHELPSTRING,FXRuler::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXRuler::ID_GETHELPSTRING,FXRuler::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXRuler::ID_SETTIPSTRING,FXRuler::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXRuler::ID_GETTIPSTRING,FXRuler::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXRuler,FXFrame,FXRulerMap,ARRAYNUMBER(FXRulerMap)) // Deserialization FXRuler::FXRuler(){ flags|=FLAG_ENABLED|FLAG_SHOWN; font=(FXFont*)-1L; documentSize=DOCUMENTSIZE; edgeSpacing=EDGESPACING; marginLower=MARGINSPACE; marginUpper=MARGINSPACE; indentFirst=0; indentLower=0; indentUpper=0; textColor=0; arrowPos=0; pixelPerTick=10.0; majorTicks=10; mediumTicks=5; tinyTicks=1; shift=0; pos=0; off=0; mode=MOUSE_NONE; } // Make a label FXRuler::FXRuler(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_ENABLED|FLAG_SHOWN; target=tgt; message=sel; font=getApp()->getNormalFont(); backColor=getApp()->getBackColor(); textColor=getApp()->getForeColor(); documentSize=DOCUMENTSIZE; edgeSpacing=EDGESPACING; marginLower=MARGINSPACE; marginUpper=MARGINSPACE; indentFirst=0; indentLower=0; indentUpper=0; arrowPos=0; pixelPerTick=10.0; if(options&RULER_ENGLISH){ numberTicks=8; majorTicks=8; mediumTicks=4; tinyTicks=1; } else{ numberTicks=10; majorTicks=10; mediumTicks=5; tinyTicks=1; } shift=0; pos=0; off=0; mode=MOUSE_NONE; } // Create window void FXRuler::create(){ FXFrame::create(); font->create(); } // Detach window void FXRuler::detach(){ FXFrame::detach(); font->detach(); } // Get lower edge of document FXint FXRuler::getDocumentLower() const { return shift+pos+edgeSpacing; } // Get upper edge of document FXint FXRuler::getDocumentUpper() const { return shift+pos+edgeSpacing+documentSize; } // Get default width FXint FXRuler::getDefaultWidth(){ FXint tw,th,w=0; if(options&RULER_VERTICAL){ // Vertical if(options&RULER_NUMBERS){ tw=font->getTextWidth("0",1); // Ruler should be same width regardless of orientation th=font->getFontAscent(); // Since we use numbers only, don't account for descenders w=FXMAX(tw,th)+2; } if(options&(RULER_TICKS_LEFT|RULER_TICKS_RIGHT)){ if(!(options&RULER_TICKS_LEFT)) w+=MAJORTICKSIZE; // Ticks on right else if(!(options&RULER_TICKS_RIGHT)) w+=MAJORTICKSIZE; // Ticks on left else w=FXMAX(MAJORTICKSIZE,w); // Ticks centered } w+=4; } else{ // FIXME } return w+padleft+padright+(border<<1); } // Get default height FXint FXRuler::getDefaultHeight(){ FXint tw,th,h=0; if(!(options&RULER_VERTICAL)){ // Horizontal if(options&RULER_NUMBERS){ tw=font->getTextWidth("0",1); // Ruler should be same width regardless of orientation th=font->getFontAscent(); // Since we use numbers only, don't account for descenders h=FXMAX(tw,th)+2; } if(options&(RULER_TICKS_TOP|RULER_TICKS_BOTTOM)){ if(!(options&RULER_TICKS_TOP)) h+=MAJORTICKSIZE; // Ticks on bottom else if(!(options&RULER_TICKS_BOTTOM)) h+=MAJORTICKSIZE; // Ticks on top else h=FXMAX(MAJORTICKSIZE,h); // Ticks centered } h+=4; } else{ // FIXME } return h+padtop+padbottom+(border<<1); } // Recalculate layout void FXRuler::layout(){ FXint space=(options&RULER_VERTICAL) ? height : width; // Stretched if((options&RULER_ALIGN_LEFT) && (options&RULER_ALIGN_RIGHT)){ shift=0; setContentSize(space,TRUE); } // Left aligned else if(options&RULER_ALIGN_LEFT){ shift=0; } // Right-aligned else if(options&RULER_ALIGN_RIGHT){ shift=space-getContentSize(); } // Centered else{ shift=(space-getContentSize())>>1; } // Keep positive if(shift<0) shift=0; setValue(arrowPos); // Redraw update(); // Clean flags&=~FLAG_DIRTY; } // Draw left arrow, with point at x,y void FXRuler::drawLeftArrow(FXDCWindow& dc,FXint x,FXint y){ FXPoint points[3]; points[0].x=x+ARROWLENGTH; points[0].y=y-ARROWLENGTH; points[1].x=x+ARROWLENGTH; points[1].y=y+ARROWLENGTH; points[2].x=x; points[2].y=y; dc.fillPolygon(points,3); } // Draw right arrow, with point at x,y void FXRuler::drawRightArrow(FXDCWindow& dc,FXint x,FXint y){ FXPoint points[3]; points[0].x=x-ARROWLENGTH+1; points[0].y=y-ARROWLENGTH; points[1].x=x-ARROWLENGTH+1; points[1].y=y+ARROWLENGTH; points[2].x=x+1; points[2].y=y; dc.fillPolygon(points,3); } // Draw up arrow, with point at x,y void FXRuler::drawUpArrow(FXDCWindow& dc,FXint x,FXint y){ FXPoint points[3]; points[0].x=x; points[0].y=y-1; points[1].x=x-ARROWLENGTH; points[1].y=y+ARROWLENGTH; points[2].x=x+ARROWLENGTH; points[2].y=y+ARROWLENGTH; dc.fillPolygon(points,3); } // Draw down arrow, with point at x,y void FXRuler::drawDownArrow(FXDCWindow& dc,FXint x,FXint y){ FXPoint points[3]; points[0].x=x-ARROWLENGTH+1; points[0].y=y-ARROWLENGTH+1; points[1].x=x+ARROWLENGTH; points[1].y=y-ARROWLENGTH+1; points[2].x=x; points[2].y=y+1; dc.fillPolygon(points,3); } // Draw left marker void FXRuler::drawLeftMarker(FXDCWindow& dc,FXint x,FXint y){ FXPoint points[6]; points[0].x=x; points[0].y=y; points[1].x=x+MARKERLENGTH; points[1].y=y-MARKERLENGTH; points[2].x=x+MARKERLENGTH+MARKERLENGTH-1; points[2].y=y-MARKERLENGTH; points[3].x=x+MARKERLENGTH+MARKERLENGTH-1; points[3].y=y+MARKERLENGTH; points[4].x=x+MARKERLENGTH; points[4].y=y+MARKERLENGTH; points[5].x=x; points[5].y=y; dc.setForeground(baseColor); dc.fillPolygon(points,5); dc.setForeground(textColor); dc.drawLines(points,6); points[0].x=x+1; points[0].y=y; points[1].x=x+MARKERLENGTH; points[1].y=y+MARKERLENGTH-1; points[2].x=x+MARKERLENGTH+MARKERLENGTH-2; points[2].y=y+MARKERLENGTH-1; points[3].x=x+MARKERLENGTH+MARKERLENGTH-2; points[3].y=y-MARKERLENGTH+1; dc.setForeground(shadowColor); dc.drawLines(points,4); points[0].x=x+1; points[0].y=y; points[1].x=x+MARKERLENGTH; points[1].y=y-MARKERLENGTH+1; points[2].x=x+MARKERLENGTH+MARKERLENGTH-2; points[2].y=y-MARKERLENGTH+1; dc.setForeground(hiliteColor); dc.drawLines(points,3); } // Draw right marker void FXRuler::drawRightMarker(FXDCWindow& dc,FXint x,FXint y){ FXPoint points[6]; points[0].x=x; points[0].y=y; points[1].x=x-MARKERLENGTH; points[1].y=y-MARKERLENGTH; points[2].x=x-MARKERLENGTH-MARKERLENGTH+1; points[2].y=y-MARKERLENGTH; points[3].x=x-MARKERLENGTH-MARKERLENGTH+1; points[3].y=y+MARKERLENGTH; points[4].x=x-MARKERLENGTH; points[4].y=y+MARKERLENGTH; points[5].x=x; points[5].y=y; dc.setForeground(baseColor); dc.fillPolygon(points,5); dc.setForeground(textColor); dc.drawLines(points,6); points[0].x=x-1; points[0].y=y; points[1].x=x-MARKERLENGTH; points[1].y=y+MARKERLENGTH-1; points[2].x=x-MARKERLENGTH-MARKERLENGTH+3; points[2].y=y+MARKERLENGTH-1; dc.setForeground(shadowColor); dc.drawLines(points,3); points[0].x=x-1; points[0].y=y; points[1].x=x-MARKERLENGTH; points[1].y=y-MARKERLENGTH+1; points[2].x=x-MARKERLENGTH-MARKERLENGTH+2; points[2].y=y-MARKERLENGTH+1; points[3].x=x-MARKERLENGTH-MARKERLENGTH+2; points[3].y=y+MARKERLENGTH-1; dc.setForeground(hiliteColor); dc.drawLines(points,4); } // Draw up marker void FXRuler::drawUpMarker(FXDCWindow& dc,FXint x,FXint y){ FXPoint points[6]; points[0].x=x; points[0].y=y; points[1].x=x-MARKERLENGTH; points[1].y=y+MARKERLENGTH; points[2].x=x-MARKERLENGTH; points[2].y=y+MARKERLENGTH+MARKERLENGTH-1; points[3].x=x+MARKERLENGTH; points[3].y=y+MARKERLENGTH+MARKERLENGTH-1; points[4].x=x+MARKERLENGTH; points[4].y=y+MARKERLENGTH; points[5].x=x; points[5].y=y; dc.setForeground(baseColor); dc.fillPolygon(points,5); dc.setForeground(textColor); dc.drawLines(points,6); points[0].x=x; points[0].y=y+1; points[1].x=x+MARKERLENGTH-1; points[1].y=y+MARKERLENGTH; points[2].x=x+MARKERLENGTH-1; points[2].y=y+MARKERLENGTH+MARKERLENGTH-2; points[3].x=x-MARKERLENGTH+1; points[3].y=y+MARKERLENGTH+MARKERLENGTH-2; dc.setForeground(shadowColor); dc.drawLines(points,4); points[0].x=x; points[0].y=y+1; points[1].x=x-MARKERLENGTH+1; points[1].y=y+MARKERLENGTH; points[2].x=x-MARKERLENGTH+1; points[2].y=y+MARKERLENGTH+MARKERLENGTH-3; dc.setForeground(hiliteColor); dc.drawLines(points,3); } // Draw down marker void FXRuler::drawDownMarker(FXDCWindow& dc,FXint x,FXint y){ FXPoint points[6]; points[0].x=x; points[0].y=y; points[1].x=x-MARKERLENGTH; points[1].y=y-MARKERLENGTH; points[2].x=x-MARKERLENGTH; points[2].y=y-MARKERLENGTH-MARKERLENGTH+1; points[3].x=x+MARKERLENGTH; points[3].y=y-MARKERLENGTH-MARKERLENGTH+1; points[4].x=x+MARKERLENGTH; points[4].y=y-MARKERLENGTH; points[5].x=x; points[5].y=y; dc.setForeground(baseColor); dc.fillPolygon(points,5); dc.setForeground(textColor); dc.drawLines(points,6); points[0].x=x; points[0].y=y-1; points[1].x=x+MARKERLENGTH-1; points[1].y=y-MARKERLENGTH; points[2].x=x+MARKERLENGTH-1; points[2].y=y-MARKERLENGTH-MARKERLENGTH+3; dc.setForeground(shadowColor); dc.drawLines(points,3); points[0].x=x; points[0].y=y-1; points[1].x=x-MARKERLENGTH+1; points[1].y=y-MARKERLENGTH; points[2].x=x-MARKERLENGTH+1; points[2].y=y-MARKERLENGTH-MARKERLENGTH+2; points[3].x=x+MARKERLENGTH-1; points[3].y=y-MARKERLENGTH-MARKERLENGTH+2; dc.setForeground(hiliteColor); dc.drawLines(points,4); } // Handle repaint long FXRuler::onPaint(FXObject*,FXSelector,void* ptr){ FXint boxx,boxy,boxw,boxh,p,tick,lower,upper,th,tw; FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXchar numeral; // Background dc.setForeground(baseColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); // Set font for numbers dc.setFont(font); th=font->getFontAscent(); // Vertically oriented ruler if(options&RULER_VERTICAL){ // Document well size boxx=border+padleft; boxy=getDocumentLower()+marginLower; boxw=width-padleft-padright-border-border; boxh=documentSize-marginUpper-marginLower; // Draw cartouche drawGrooveRectangle(dc,boxx,boxy-marginLower-1,boxw,documentSize+2); // Draw document well dc.setForeground(backColor); dc.fillRectangle(boxx+2,boxy+1,boxw-4,boxh); dc.setForeground(shadowColor); dc.fillRectangle(boxx,boxy-1,boxw-2,1); dc.fillRectangle(boxx,boxy+boxh-1,boxw-2,1); dc.setForeground(borderColor); dc.fillRectangle(boxx+1,boxy,boxw-3,1); dc.fillRectangle(boxx+1,boxy,1,boxh); dc.setForeground(baseColor); dc.fillRectangle(boxx+2,boxy+boxh-1,boxw-4,1); // Draw ticks or numbers if(options&(RULER_TICKS_TOP|RULER_TICKS_BOTTOM|RULER_NUMBERS)){ FXASSERT(pixelPerTick>0.0); // Determine number of ticks to draw lower=-(FXint)((FXdouble)marginLower/pixelPerTick); upper=(FXint)((FXdouble)(documentSize+pixelPerTick-marginLower-1)/pixelPerTick); dc.setForeground(borderColor); // Draw ticks and numbers for(tick=lower; tickgetTextWidth(&numeral,1); if((options&RULER_TICKS_LEFT)&&(options&RULER_TICKS_RIGHT)){ dc.drawText(boxx+((boxw-tw)>>1),p+(th>>1),&numeral,1); } else if(options&RULER_TICKS_LEFT){ dc.drawText(boxx+2+MAJORTICKSIZE+1,p+(th>>1),&numeral,1); } else{ dc.drawText(boxx+boxw-4-MAJORTICKSIZE-1-tw,p+(th>>1),&numeral,1); } } // Draw major tick if(tick%majorTicks==0){ if((options&RULER_TICKS_TOP)&&(options&RULER_TICKS_RIGHT)){ if(!(options&RULER_NUMBERS) || (tick%numberTicks)) dc.fillRectangle(boxx+(boxw>>1)-(MAJORTICKSIZE>>1),p,MAJORTICKSIZE,1); } else if(options&RULER_TICKS_LEFT){ dc.fillRectangle(boxx+2,p,MAJORTICKSIZE,1); } else{ dc.fillRectangle(boxx+boxw-2-MAJORTICKSIZE,p,MAJORTICKSIZE,1); } } // Draw medium tick else if(tick%mediumTicks==0){ if((options&RULER_TICKS_LEFT)&&(options&RULER_TICKS_RIGHT)){ dc.fillRectangle(boxx+(boxw>>1)-(MEDIUMTICKSIZE>>1),p,MEDIUMTICKSIZE,1); } else if(options&RULER_TICKS_LEFT){ dc.fillRectangle(boxx+2,p,MEDIUMTICKSIZE,1); } else{ dc.fillRectangle(boxx+boxw-2-MEDIUMTICKSIZE,p,MEDIUMTICKSIZE,1); } } // Draw tiny tick else if(tick%tinyTicks==0){ if((options&RULER_TICKS_LEFT)&&(options&RULER_TICKS_RIGHT)){ dc.fillRectangle(boxx+(boxw>>1)-(MINORTICKSIZE>>1),p,MINORTICKSIZE,1); } else if(options&RULER_TICKS_LEFT){ dc.fillRectangle(boxx+2,p,MINORTICKSIZE,1); } else{ dc.fillRectangle(boxx+boxw-2-MINORTICKSIZE,p,MINORTICKSIZE,1); } } } } } // Draw optional arrow to signify cursor location if(options&RULER_ARROW){ dc.setForeground(textColor); if(options&RULER_TICKS_RIGHT) // Ticks on right or center drawRightArrow(dc,boxx+boxw-3,getDocumentLower()+arrowPos); else if(options&RULER_TICKS_LEFT) // Ticks on left drawLeftArrow(dc,boxx+2,getDocumentLower()+arrowPos); } // Draw optional markers for paragraph margins if(options&RULER_MARKERS){ dc.setForeground(textColor); drawLeftMarker(dc,boxx+boxw-MARKERLENGTH-MARKERLENGTH+1,boxy+indentLower); drawLeftMarker(dc,boxx+boxw-MARKERLENGTH-MARKERLENGTH+1,boxy+boxh-indentUpper-1); } } // Horizontally oriented ruler else{ // Document well size boxx=getDocumentLower()+marginLower; boxy=border+padtop; boxw=documentSize-marginUpper-marginLower; boxh=height-padtop-padbottom-border-border; // Draw cartouche drawGrooveRectangle(dc,boxx-marginLower-1,boxy,documentSize+2,boxh); // Draw document well dc.setForeground(backColor); dc.fillRectangle(boxx+1,boxy+2,boxw,boxh-4); dc.setForeground(shadowColor); dc.fillRectangle(boxx-1,boxy,1,boxh-2); dc.fillRectangle(boxx+boxw-1,boxy+1,1,boxh-2); dc.setForeground(borderColor); dc.fillRectangle(boxx,boxy+1,boxw-1,1); dc.fillRectangle(boxx,boxy+1,1,boxh-2); dc.setForeground(baseColor); dc.fillRectangle(boxx+1,boxy+boxh-2,boxw-2,1); // Draw ticks or numbers if(options&(RULER_TICKS_TOP|RULER_TICKS_BOTTOM|RULER_NUMBERS)){ FXASSERT(pixelPerTick>0.0); // Determine number of ticks to draw lower=-(FXint)((FXdouble)marginLower/pixelPerTick); upper=(FXint)((FXdouble)(documentSize+pixelPerTick-marginLower-1)/pixelPerTick); dc.setForeground(borderColor); // Draw ticks and numbers for(tick=lower; tickgetTextWidth(&numeral,1); if((options&RULER_TICKS_TOP)&&(options&RULER_TICKS_BOTTOM)){ dc.drawText(p-(tw>>1),boxy+((boxh-th)>>1)+th-1,&numeral,1); } else if(options&RULER_TICKS_TOP){ dc.drawText(p-(tw>>1),boxy+2+MAJORTICKSIZE+th,&numeral,1); } else{ dc.drawText(p-(tw>>1),boxy+boxh-4-MAJORTICKSIZE,&numeral,1); } } // Draw major tick if(tick%majorTicks==0){ if((options&RULER_TICKS_TOP)&&(options&RULER_TICKS_BOTTOM)){ if(!(options&RULER_NUMBERS) || (tick%numberTicks)) dc.fillRectangle(p,boxy+(boxh>>1)-(MAJORTICKSIZE>>1),1,MAJORTICKSIZE); } else if(options&RULER_TICKS_TOP){ dc.fillRectangle(p,boxy+2,1,MAJORTICKSIZE); } else{ dc.fillRectangle(p,boxy+boxh-2-MAJORTICKSIZE,1,MAJORTICKSIZE); } } // Draw medium tick else if(tick%mediumTicks==0){ if((options&RULER_TICKS_TOP)&&(options&RULER_TICKS_BOTTOM)){ dc.fillRectangle(p,boxy+(boxh>>1)-(MEDIUMTICKSIZE>>1),1,MEDIUMTICKSIZE); } else if(options&RULER_TICKS_TOP){ dc.fillRectangle(p,boxy+2,1,MEDIUMTICKSIZE); } else{ dc.fillRectangle(p,boxy+boxh-2-MEDIUMTICKSIZE,1,MEDIUMTICKSIZE); } } // Draw tiny tick else if(tick%tinyTicks==0){ if((options&RULER_TICKS_TOP)&&(options&RULER_TICKS_BOTTOM)){ dc.fillRectangle(p,boxy+(boxh>>1)-(MINORTICKSIZE>>1),1,MINORTICKSIZE); } else if(options&RULER_TICKS_TOP){ dc.fillRectangle(p,boxy+2,1,MINORTICKSIZE); } else{ dc.fillRectangle(p,boxy+boxh-2-MINORTICKSIZE,1,MINORTICKSIZE); } } } } } // Draw optional arrow to signify cursor location if(options&RULER_ARROW){ dc.setForeground(textColor); if(options&RULER_TICKS_BOTTOM) // Ticks on bottom or center drawDownArrow(dc,getDocumentLower()+arrowPos,boxy+boxh-3); else if(options&RULER_TICKS_TOP) // Ticks on top drawUpArrow(dc,getDocumentLower()+arrowPos,boxy+2); } // Draw optional markers for paragraph margins if(options&RULER_MARKERS){ drawDownMarker(dc,boxx+indentFirst,boxy+MARKERLENGTH+MARKERLENGTH-2); drawUpMarker(dc,boxx+indentLower,boxy+boxh-MARKERLENGTH-MARKERLENGTH+1); drawUpMarker(dc,boxx+boxw-indentUpper-1,boxy+boxh-MARKERLENGTH-MARKERLENGTH+1); } } // Frame it drawFrame(dc,0,0,width,height); return 1; } // Pressed LEFT button long FXRuler::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ register FXEvent* event=(FXEvent*)ptr; register FXint lo,hi; flags&=~FLAG_TIP; if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; mode=picked(event->win_x,event->win_y); if(mode){ lo=pos+edgeSpacing+marginLower; hi=lo+documentSize-marginUpper-marginLower; if(options&RULER_VERTICAL){ setDragCursor(getApp()->getDefaultCursor(DEF_DRAGH_CURSOR)); off=event->win_y; } else{ setDragCursor(getApp()->getDefaultCursor(DEF_DRAGV_CURSOR)); off=event->win_x; } switch(mode){ case MOUSE_MARG_LOWER: off-=lo; break; case MOUSE_MARG_UPPER: off-=hi; break; case MOUSE_PARA_FIRST: off-=lo+indentFirst; break; case MOUSE_PARA_LOWER: off-=lo+indentLower; break; case MOUSE_PARA_UPPER: off-=hi-indentUpper; break; } } return 1; } return 0; } // Released Left button long FXRuler::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; mode=MOUSE_NONE; setDragCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // Determine what was picked FXint FXRuler::picked(FXint x,FXint y){ register FXint wlo,whi,lo,hi; lo=pos+edgeSpacing+marginLower; hi=lo+documentSize-marginUpper-marginLower; if(options&RULER_VERTICAL){ wlo=border+padleft; whi=width-padright; if(xwhi-MARKERLENGTH){ if(lo+indentLower-MARKERLENGTHwhi-MARKERLENGTH){ if(lo+indentLower-MARKERLENGTHwin_y+off):(event->win_x+off); switch(mode){ case MOUSE_NONE: if(picked(event->win_x,event->win_y)){ if(options&RULER_VERTICAL){ setDefaultCursor(getApp()->getDefaultCursor(DEF_DRAGH_CURSOR)); } else{ setDefaultCursor(getApp()->getDefaultCursor(DEF_DRAGV_CURSOR)); } } else{ setDefaultCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); } return 0; case MOUSE_MARG_LOWER: setMarginLower(value-pos-edgeSpacing,TRUE); return 1; case MOUSE_MARG_UPPER: setMarginUpper(pos+edgeSpacing+documentSize-value,TRUE); return 1; case MOUSE_PARA_FIRST: setIndentFirst(value-pos-edgeSpacing-marginLower,TRUE); return 1; case MOUSE_PARA_LOWER: setIndentLower(value-pos-edgeSpacing-marginLower,TRUE); return 1; case MOUSE_PARA_UPPER: setIndentUpper(pos+edgeSpacing+documentSize-marginUpper-value,TRUE); return 1; } return 0; } // Change arrow location void FXRuler::setValue(FXint val){ val=FXCLAMP(0,val,documentSize); if(options&RULER_VERTICAL){ if(arrowPos!=val){ if(options&RULER_ARROW){ update(padleft+border,getDocumentLower()+arrowPos-ARROWLENGTH,width-padleft-padright-(border<<1),ARROWBASE); update(padleft+border,getDocumentLower()+val-ARROWLENGTH,width-padleft-padright-(border<<1),ARROWBASE); } arrowPos=val; } } else{ if(arrowPos!=val){ if(options&RULER_ARROW){ update(getDocumentLower()+arrowPos-ARROWLENGTH,padtop+border,ARROWBASE,height-padtop-padbottom-(border<<1)); update(getDocumentLower()+val-ARROWLENGTH,padtop+border,ARROWBASE,height-padtop-padbottom-(border<<1)); } arrowPos=val; } } } // Update value from a message long FXRuler::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setValue((FXint)(FXival)ptr); return 1; } // Update value from a message long FXRuler::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setValue(*((FXint*)ptr)); return 1; } // Obtain value from text field long FXRuler::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getValue(); return 1; } // Set help using a message long FXRuler::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXRuler::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXRuler::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXRuler::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXRuler::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXFrame::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXRuler::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXFrame::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Change content size void FXRuler::setContentSize(FXint size,FXbool notify){ setDocumentSize(size-edgeSpacing-edgeSpacing,notify); } // Get content size FXint FXRuler::getContentSize() const { return edgeSpacing+documentSize+edgeSpacing; } // Set position, scrolling contents void FXRuler::setPosition(FXint p,FXbool notify){ if(pos!=p){ if(options&RULER_VERTICAL) scroll(0,0,width,height,0,p-pos); else scroll(0,0,width,height,p-pos,0); arrowPos+=p-pos; pos=p; if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change document size void FXRuler::setDocumentSize(FXint size,FXbool notify){ if(size<0) size=0; if(documentSize!=size){ documentSize=size; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change/return document edge spacing void FXRuler::setEdgeSpacing(FXint space,FXbool notify){ if(space<0) space=0; if(edgeSpacing!=space){ edgeSpacing=space; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change/return lower document margin void FXRuler::setMarginLower(FXint mgn,FXbool notify){ if(mgn<0) mgn=0; if(mgn>=documentSize-marginUpper) mgn=documentSize-marginUpper-1; if(marginLower!=mgn){ marginLower=mgn; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change/return upper document margin void FXRuler::setMarginUpper(FXint mgn,FXbool notify){ if(mgn<0) mgn=0; if(mgn>=documentSize-marginLower) mgn=documentSize-marginLower-1; if(marginUpper!=mgn){ marginUpper=mgn; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change/return first line indent void FXRuler::setIndentFirst(FXint ind,FXbool notify){ if(ind<-marginLower) ind=-marginLower; if(ind>documentSize-marginLower) ind=documentSize-marginLower; if(indentFirst!=ind){ indentFirst=ind; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change/return lower indent void FXRuler::setIndentLower(FXint ind,FXbool notify){ if(ind<-marginLower) ind=-marginLower; if(ind>documentSize-marginLower) ind=documentSize-marginLower; if(indentLower!=ind){ indentLower=ind; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change/return upper indent void FXRuler::setIndentUpper(FXint ind,FXbool notify){ if(ind<-marginUpper) ind=-marginUpper; if(ind>documentSize-marginLower) ind=documentSize-marginLower; if(indentUpper!=ind){ indentUpper=ind; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change/return document number placement void FXRuler::setNumberTicks(FXint ticks,FXbool notify){ if(ticks<1){ fxerror("%s::setNumberTicks: illegal tick spacing.\n",getClassName()); } if(numberTicks!=ticks){ numberTicks=ticks; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change/return document major ticks void FXRuler::setMajorTicks(FXint ticks,FXbool notify){ if(ticks<1){ fxerror("%s::setMajorTicks: illegal tick spacing.\n",getClassName()); } if(majorTicks!=ticks){ majorTicks=ticks; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change/return document medium ticks void FXRuler::setMediumTicks(FXint ticks,FXbool notify){ if(ticks<1){ fxerror("%s::setMediumTicks: illegal tick spacing.\n",getClassName()); } if(mediumTicks!=ticks){ mediumTicks=ticks; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change/return document tiny ticks void FXRuler::setTinyTicks(FXint ticks,FXbool notify){ if(ticks<1){ fxerror("%s::setTinyTicks: illegal tick spacing.\n",getClassName()); } if(tinyTicks!=ticks){ tinyTicks=ticks; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change/return pixel per tick spacing void FXRuler::setPixelPerTick(FXdouble space,FXbool notify){ if(space<=0.0){ fxerror("%s::setPixelPerTick: illegal pixel per tick value.\n",getClassName()); } if(pixelPerTick!=space){ pixelPerTick=space; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Change the font void FXRuler::setFont(FXFont *fnt,FXbool notify){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Set text color void FXRuler::setTextColor(FXColor clr){ if(clr!=textColor){ textColor=clr; update(); } } // Set ruler style void FXRuler::setRulerStyle(FXuint style){ FXuint opts=(options&~RULER_MASK) | (style&RULER_MASK); if(options!=opts){ options=opts; recalc(); update(); } } // Get ruler style FXuint FXRuler::getRulerStyle() const { return (options&RULER_MASK); } // Set ruler alignment void FXRuler::setRulerAlignment(FXuint alignment,FXbool notify){ FXuint opts=(options&~RULER_ALIGN_MASK) | (alignment&RULER_ALIGN_MASK); if(options!=opts){ options=opts; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),NULL); } } // Get ruler alignment FXuint FXRuler::getRulerAlignment() const { return (options&RULER_ALIGN_MASK); } // Save object to stream void FXRuler::save(FXStream& store) const { FXFrame::save(store); store << font; store << documentSize; store << edgeSpacing; store << marginLower; store << marginUpper; store << indentFirst; store << indentLower; store << indentUpper; store << pixelPerTick; store << numberTicks; store << majorTicks; store << mediumTicks; store << tinyTicks; store << textColor; store << tip; store << help; } // Load object from stream void FXRuler::load(FXStream& store){ FXFrame::load(store); store >> font; store >> documentSize; store >> edgeSpacing; store >> marginLower; store >> marginUpper; store >> indentFirst; store >> indentLower; store >> indentUpper; store >> pixelPerTick; store >> numberTicks; store >> majorTicks; store >> mediumTicks; store >> tinyTicks; store >> textColor; store >> tip; store >> help; } // Destroy label FXRuler::~FXRuler(){ font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXRulerView.cpp000066400000000000000000000376451326741342000163310ustar00rootroot00000000000000/******************************************************************************** * * * R u l e r V i e w W i d g e t * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXRulerView.cpp,v 1.16 2006/01/28 20:29:30 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXScrollBar.h" #include "FXScrollArea.h" #include "FXRuler.h" #include "FXRulerView.h" /* Notes: - Should implement DND drags/drops, cut/paste - Right-mouse scroll. */ #define RULERVIEW_MASK (RULERVIEW_ALIGN_STRETCH_X|RULERVIEW_ALIGN_STRETCH_Y) #define HSCROLLMASK (HSCROLLER_ALWAYS|HSCROLLER_NEVER|HSCROLLING_ON|HSCROLLING_OFF|SCROLLERS_DONT_TRACK) #define VSCROLLMASK (VSCROLLER_ALWAYS|VSCROLLER_NEVER|VSCROLLING_ON|VSCROLLING_OFF|SCROLLERS_DONT_TRACK) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXRulerView) FXRulerViewMap[]={ FXMAPFUNC(SEL_PAINT,0,FXRulerView::onPaint), FXMAPFUNC(SEL_MOTION,0,FXRulerView::onMotion), FXMAPFUNC(SEL_QUERY_TIP,0,FXRulerView::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXRulerView::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXRulerView::ID_SETHELPSTRING,FXRulerView::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXRulerView::ID_GETHELPSTRING,FXRulerView::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXRulerView::ID_SETTIPSTRING,FXRulerView::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXRulerView::ID_GETTIPSTRING,FXRulerView::onCmdGetTip), FXMAPFUNC(SEL_CHANGED,FXRulerView::ID_HRULER,FXRulerView::onDocChanged), FXMAPFUNC(SEL_CHANGED,FXRulerView::ID_VRULER,FXRulerView::onDocChanged), }; // Object implementation FXIMPLEMENT(FXRulerView,FXScrollArea,FXRulerViewMap,ARRAYNUMBER(FXRulerViewMap)) // Deserialization FXRulerView::FXRulerView(){ flags|=FLAG_ENABLED; hruler=NULL; vruler=NULL; filler=NULL; docColor=0; } // Construct and init FXRulerView::FXRulerView(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h):FXScrollArea(p,opts,x,y,w,h){ hruler=new FXRuler(this,this,ID_HRULER,RULER_HORIZONTAL|RULER_NUMBERS|RULER_ARROW|RULER_TICKS_CENTER|LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); vruler=new FXRuler(this,this,ID_VRULER,RULER_VERTICAL|RULER_NUMBERS|RULER_ARROW|RULER_TICKS_CENTER|LAYOUT_SIDE_LEFT|LAYOUT_FILL_Y|LAYOUT_FILL_ROW); filler=new FXFrame(this,FRAME_NONE); backColor=getApp()->getShadowColor(); docColor=getApp()->getBackColor(); flags|=FLAG_ENABLED; target=tgt; message=sel; } // Get document position X FXint FXRulerView::getDocumentX() const { return vruler->getWidth()+hruler->getDocumentLower(); } // Get document position Y FXint FXRulerView::getDocumentY() const { return hruler->getHeight()+vruler->getDocumentLower(); } // Set document width void FXRulerView::setDocumentWidth(FXint w,FXbool notify){ hruler->setDocumentSize(w,notify); } // Get document width FXint FXRulerView::getDocumentWidth() const { return hruler->getDocumentSize(); } // Set document height void FXRulerView::setDocumentHeight(FXint h,FXbool notify){ vruler->setDocumentSize(h,notify); } // Get document height FXint FXRulerView::getDocumentHeight() const { return vruler->getDocumentSize(); } // Default viewport width FXint FXRulerView::getViewportWidth(){ return width-vruler->getDefaultWidth(); } // Default viewport height FXint FXRulerView::getViewportHeight(){ return height-hruler->getDefaultHeight(); } // Determine minimum content width of scroll area FXint FXRulerView::getContentWidth(){ return hruler->getContentSize(); } // Determine minimum content height of scroll area FXint FXRulerView::getContentHeight(){ return vruler->getContentSize(); } // Move content void FXRulerView::moveContents(FXint x,FXint y){ hruler->setPosition(x); vruler->setPosition(y); scroll(vruler->getDefaultWidth(),hruler->getDefaultHeight(),viewport_w,viewport_h,x-pos_x,y-pos_y); pos_x=x; pos_y=y; } // Recalculate layout void FXRulerView::layout(){ FXint vrw,hrh; // Layout scroll bars and viewport FXScrollArea::layout(); // Place rulers vrw=vruler->getDefaultWidth(); hrh=hruler->getDefaultHeight(); hruler->position(vrw,0,viewport_w,hrh); vruler->position(0,hrh,vrw,viewport_h); filler->position(0,0,vrw,hrh); // Redraw update(); // Clean flags&=~FLAG_DIRTY; } // Draw document background void FXRulerView::drawBackground(FXDCWindow& dc){ FXint docx,docy,docw,doch; // Background dc.setForeground(backColor); docx=getDocumentX(); docy=getDocumentY(); docw=getDocumentWidth(); doch=getDocumentHeight(); dc.fillRectangle(0,0,docx,height); dc.fillRectangle(docx+docw,0,width-docx-docw,height); dc.fillRectangle(docx,0,docw,docy); dc.fillRectangle(docx,docy+doch,docw,height-docy-doch); // Document insides dc.setForeground(docColor); dc.fillRectangle(docx,docy,docw,doch); dc.setForeground(FXRGB(0,0,0)); dc.drawRectangle(docx-1,docy-1,docw+1,doch+1); dc.fillRectangle(docx+1,docy+doch+1,docw+2,2); dc.fillRectangle(docx+docw+1,docy+1,2,doch+2); } // Draw contents void FXRulerView::drawContents(FXDCWindow&){ } // Handle repaint long FXRulerView::onPaint(FXObject*,FXSelector,void* ptr){ FXDCWindow dc(this,(FXEvent*)ptr); drawBackground(dc); drawContents(dc); return 1; } // Moving long FXRulerView::onMotion(FXObject*,FXSelector,void*ptr){ setArrowPosX(((FXEvent*)ptr)->win_x-getDocumentX()); setArrowPosY(((FXEvent*)ptr)->win_y-getDocumentY()); return 0; } // Set help using a message long FXRulerView::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXRulerView::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXRulerView::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXRulerView::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXRulerView::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXScrollArea::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXRulerView::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXScrollArea::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Something in the rulers was changed long FXRulerView::onDocChanged(FXObject*,FXSelector,void* ptr){ return target && target->handle(this,FXSEL(SEL_CHANGED,message),ptr); } // Set the current document color void FXRulerView::setDocumentColor(FXColor clr){ if(clr!=docColor){ docColor=clr; update(); } } // Set horizontal alignment; the default is RULER_ALIGN_NORMAL void FXRulerView::setHAlignment(FXuint align,FXbool notify){ if(hruler->getRulerAlignment()!=align){ if(align==RULER_ALIGN_STRETCH) setScrollStyle(HSCROLLER_NEVER | (getScrollStyle()&VSCROLLMASK)); else setScrollStyle(HSCROLLING_ON | (getScrollStyle()&VSCROLLMASK)); update(); hruler->setRulerAlignment(align,notify); } } // Return horizontal alignment FXuint FXRulerView::getHAlignment() const { return hruler->getRulerAlignment(); } // Set vertical alignment; the default is RULER_ALIGN_NORMAL void FXRulerView::setVAlignment(FXuint align,FXbool notify){ if(vruler->getRulerAlignment()!=align){ if(align==RULER_ALIGN_STRETCH) setScrollStyle(VSCROLLER_NEVER | (getScrollStyle()&HSCROLLMASK)); else setScrollStyle(VSCROLLING_ON | (getScrollStyle()&HSCROLLMASK)); update(); vruler->setRulerAlignment(align,notify); } } // Return vertical alignment FXuint FXRulerView::getVAlignment() const { return vruler->getRulerAlignment(); } // Set X arrow position void FXRulerView::setArrowPosX(FXint x){ hruler->setValue(x); } // Set X arrow position void FXRulerView::setArrowPosY(FXint y){ vruler->setValue(y); } // Get X arrow position FXint FXRulerView::getArrowPosX() const { return hruler->getValue(); } // Get Y arrow position FXint FXRulerView::getArrowPosY() const { return vruler->getValue(); } // Set the horizontal ruler font void FXRulerView::setHRulerFont(FXFont *fnt,FXbool notify){ hruler->setFont(fnt,notify); recalc(); } // Get the horizontal ruler font FXFont* FXRulerView::getHRulerFont() const { return hruler->getFont(); } // Set the vertical ruler font void FXRulerView::setVRulerFont(FXFont *fnt,FXbool notify){ vruler->setFont(fnt,notify); recalc(); } // Get the vertical ruler font FXFont* FXRulerView::getVRulerFont() const { return vruler->getFont(); } // Change edge spacing around document void FXRulerView::setHEdgeSpacing(FXint es,FXbool notify){ hruler->setEdgeSpacing(es,notify); } // Change edge spacing around document void FXRulerView::setVEdgeSpacing(FXint es,FXbool notify){ vruler->setEdgeSpacing(es,notify); } // Return horizontal edge spacing FXint FXRulerView::getHEdgeSpacing() const { return hruler->getEdgeSpacing(); } // Return vertical edge spacing FXint FXRulerView::getVEdgeSpacing() const { return vruler->getEdgeSpacing(); } // Change horizontal lower margin void FXRulerView::setHMarginLower(FXint marg,FXbool notify){ hruler->setMarginLower(marg,notify); } // Change horizontal upper margin void FXRulerView::setHMarginUpper(FXint marg,FXbool notify){ hruler->setMarginUpper(marg,notify); } // Get horizontal lower margin FXint FXRulerView::getHMarginLower() const { return hruler->getMarginLower(); } // Get horizontal upper margin FXint FXRulerView::getHMarginUpper() const { return hruler->getMarginUpper(); } // Change vertical lower margin void FXRulerView::setVMarginLower(FXint marg,FXbool notify){ vruler->setMarginLower(marg,notify); } // Change vertical upper margin void FXRulerView::setVMarginUpper(FXint marg,FXbool notify){ vruler->setMarginUpper(marg,notify); } // Get vertical lower margin FXint FXRulerView::getVMarginLower() const { return vruler->getMarginLower(); } // Get vertical upper margin FXint FXRulerView::getVMarginUpper() const { return vruler->getMarginUpper(); } // Change horizontal document number placement void FXRulerView::setHNumberTicks(FXint ticks,FXbool notify){ hruler->setNumberTicks(ticks,notify); } // Change vertical document number placement void FXRulerView::setVNumberTicks(FXint ticks,FXbool notify){ vruler->setNumberTicks(ticks,notify); } // Return horizontal document number placement FXint FXRulerView::getHNumberTicks() const { return hruler->getNumberTicks(); } // Return vertical document number placement FXint FXRulerView::getVNumberTicks() const { return vruler->getNumberTicks(); } // Change horizontal document major ticks void FXRulerView::setHMajorTicks(FXint ticks,FXbool notify){ hruler->setMajorTicks(ticks,notify); } // Change vertical document major ticks void FXRulerView::setVMajorTicks(FXint ticks,FXbool notify){ vruler->setMajorTicks(ticks,notify); } // Return horizontal document major ticks FXint FXRulerView::getHMajorTicks() const { return hruler->getMajorTicks(); } // Return vertical document major ticks FXint FXRulerView::getVMajorTicks() const { return vruler->getMajorTicks(); } // Change horizontal document medium ticks void FXRulerView::setHMediumTicks(FXint ticks,FXbool notify){ hruler->setMediumTicks(ticks,notify); } // Change vertical document medium ticks void FXRulerView::setVMediumTicks(FXint ticks,FXbool notify){ vruler->setMediumTicks(ticks,notify); } // Return horizontal document medium ticks FXint FXRulerView::getHMediumTicks() const { return hruler->getMediumTicks(); } // Return vertical document medium ticks FXint FXRulerView::getVMediumTicks() const { return vruler->getMediumTicks(); } // Change horizontal document tiny ticks void FXRulerView::setHTinyTicks(FXint ticks,FXbool notify){ hruler->setTinyTicks(ticks,notify); } // Change vertical document tiny ticks void FXRulerView::setVTinyTicks(FXint ticks,FXbool notify){ vruler->setTinyTicks(ticks,notify); } // Return horizontal document tiny ticks FXint FXRulerView::getHTinyTicks() const { return hruler->getTinyTicks(); } // Return vertical document tiny ticks FXint FXRulerView::getVTinyTicks() const { return vruler->getTinyTicks(); } // Change horizontal pixel per tick spacing void FXRulerView::setHPixelPerTick(FXdouble space,FXbool notify){ hruler->setPixelPerTick(space,notify); } // Change vertical pixel per tick spacing void FXRulerView::setVPixelPerTick(FXdouble space,FXbool notify){ vruler->setPixelPerTick(space,notify); } // Return horizontal pixel per tick spacing FXdouble FXRulerView::getHPixelPerTick() const { return hruler->getPixelPerTick(); } // Return vertical pixel per tick spacing FXdouble FXRulerView::getVPixelPerTick() const { return vruler->getPixelPerTick(); } // Set horizontal ruler style void FXRulerView::setHRulerStyle(FXuint style){ hruler->setRulerStyle(style); } // Set vertical ruler style void FXRulerView::setVRulerStyle(FXuint style){ hruler->setRulerStyle(style); } // Get horizontal ruler style FXuint FXRulerView::getHRulerStyle() const { return hruler->getRulerStyle(); } // Get vertical ruler style FXuint FXRulerView::getVRulerStyle() const { return vruler->getRulerStyle(); } // Save object to stream void FXRulerView::save(FXStream& store) const { FXScrollArea::save(store); store << hruler; store << vruler; store << filler; store << docColor; store << tip; store << help; } // Load object from stream void FXRulerView::load(FXStream& store){ FXScrollArea::load(store); store >> hruler; store >> vruler; store >> filler; store >> docColor; store >> tip; store >> help; } // Destroy FXRulerView::~FXRulerView(){ hruler=(FXRuler*)-1L; vruler=(FXRuler*)-1L; filler=(FXFrame*)-1L; } } fox1.6-1.6.57/src/FXScrollArea.cpp000066400000000000000000000357551326741342000164340ustar00rootroot00000000000000/******************************************************************************** * * * S c r o l l A r e a W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXScrollArea.cpp,v 1.49 2006/01/22 17:58:40 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXScrollBar.h" #include "FXScrollArea.h" /* To do: - In new HSCROLLING_OFF mode, default width should be computed from contents (new virtual for that), and presence of scrollbars (determined by flags, as well as need). - The original content size should be returned from getContentWidth(), and getContentHeight(). - When tabbing, we will never put focus on scrollbar. - Perhaps scroll windows should observe FRAME_SUNKEN etc. - Here's a new idea:- perhaps the scrollbars should be GUI-updated from the FXScrollArea. Then layout() will do nothing but place the bars. - What if we want to keep two scrolled windows in sync, i.e. scroll them both the same amount. - Do we need to be able to map mouse wheel to horizontal scrollbar instead? or perhaps even both ways (depending on whether scrolling is possible in one or another direction). */ #define AUTOSCROLL_FUDGE 11 // Proximity to wall at which we start autoscrolling #define SCROLLER_MASK (HSCROLLER_ALWAYS|HSCROLLER_NEVER|VSCROLLER_ALWAYS|VSCROLLER_NEVER|SCROLLERS_DONT_TRACK) using namespace FX; /*******************************************************************************/ namespace FX { FXDEFMAP(FXScrollArea) FXScrollAreaMap[]={ FXMAPFUNC(SEL_MOUSEWHEEL,0,FXScrollArea::onVMouseWheel), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_HSCROLLED,FXScrollArea::onHScrollerChanged), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_VSCROLLED,FXScrollArea::onVScrollerChanged), FXMAPFUNC(SEL_CHANGED,FXWindow::ID_HSCROLLED,FXScrollArea::onHScrollerDragged), FXMAPFUNC(SEL_CHANGED,FXWindow::ID_VSCROLLED,FXScrollArea::onVScrollerDragged), FXMAPFUNC(SEL_TIMEOUT,FXWindow::ID_AUTOSCROLL,FXScrollArea::onAutoScroll), }; // Object implementation FXIMPLEMENT(FXScrollArea,FXComposite,FXScrollAreaMap,ARRAYNUMBER(FXScrollAreaMap)) // Scroll acceleration near edge static const FXint acceleration[AUTOSCROLL_FUDGE+1]={1,1,1,2,3,4,6,7,8,16,32,64}; // Deserialization FXScrollArea::FXScrollArea(){ flags|=FLAG_SHOWN; horizontal=NULL; vertical=NULL; corner=NULL; viewport_w=1; viewport_h=1; pos_x=0; pos_y=0; } // Construct and init FXScrollArea::FXScrollArea(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXComposite(p,opts,x,y,w,h){ FXuint jumpy=0; flags|=FLAG_SHOWN; if(opts&SCROLLERS_DONT_TRACK) jumpy=SCROLLBAR_WHEELJUMP; horizontal=new FXScrollBar(this,this,FXWindow::ID_HSCROLLED,SCROLLBAR_HORIZONTAL|jumpy); vertical=new FXScrollBar(this,this,FXWindow::ID_VSCROLLED,SCROLLBAR_VERTICAL|jumpy); corner=new FXScrollCorner(this); backColor=getApp()->getBackColor(); viewport_w=1; viewport_h=1; pos_x=0; pos_y=0; } // This should really add the scroll bar size only when required; however, // that depends on the actual size. We are potentially being called at // a moment when this is not known yet, so we return a size which reflects // the situation when the scrollbars have been placed; this way, we should // at least have enough space to fully see the contents, and a bit extra // when the scrollbars turn out to have been unnecessary. // Get default width FXint FXScrollArea::getDefaultWidth(){ register FXint w=0; register FXint t; if((options&HSCROLLER_NEVER)&&(options&HSCROLLER_ALWAYS)) w=getContentWidth(); if(!(options&HSCROLLER_NEVER) && (t=horizontal->getDefaultWidth())>w) w=t; if(!(options&VSCROLLER_NEVER)) w+=vertical->getDefaultWidth(); return FXMAX(w,1); } // Get default height FXint FXScrollArea::getDefaultHeight(){ register FXint h=0; register FXint t; if((options&VSCROLLER_NEVER)&&(options&VSCROLLER_ALWAYS)) h=getContentHeight(); if(!(options&VSCROLLER_NEVER) && (t=vertical->getDefaultHeight())>h) h=t; if(!(options&HSCROLLER_NEVER)) h+=horizontal->getDefaultHeight(); return FXMAX(h,1); } // Move content void FXScrollArea::moveContents(FXint x,FXint y){ FXint dx=x-pos_x; FXint dy=y-pos_y; pos_x=x; pos_y=y; scroll(0,0,viewport_w,viewport_h,dx,dy); } // Changed long FXScrollArea::onHScrollerChanged(FXObject*,FXSelector,void* ptr){ FXint new_x=-(FXint)(FXival)ptr; if(new_x!=pos_x){ moveContents(new_x,pos_y); } flags&=~FLAG_TIP; return 1; } // Changed long FXScrollArea::onVScrollerChanged(FXObject*,FXSelector,void* ptr){ FXint new_y=-(FXint)(FXival)ptr; if(new_y!=pos_y){ moveContents(pos_x,new_y); } flags&=~FLAG_TIP; return 1; } // Dragged long FXScrollArea::onHScrollerDragged(FXObject*,FXSelector,void* ptr){ if(!(options&SCROLLERS_DONT_TRACK)){ FXint new_x=-(FXint)(FXival)ptr; if(new_x!=pos_x){ moveContents(new_x,pos_y); } } flags&=~FLAG_TIP; return 1; } // Dragged long FXScrollArea::onVScrollerDragged(FXObject*,FXSelector,void* ptr){ if(!(options&SCROLLERS_DONT_TRACK)){ FXint new_y=-(FXint)(FXival)ptr; if(new_y!=pos_y){ moveContents(pos_x,new_y); } } flags&=~FLAG_TIP; return 1; } // Mouse wheel used for vertical scrolling long FXScrollArea::onVMouseWheel(FXObject* sender,FXSelector sel,void* ptr){ vertical->handle(sender,sel,ptr); return 1; } // Mouse wheel used for horizontal scrolling long FXScrollArea::onHMouseWheel(FXObject* sender,FXSelector sel,void* ptr){ horizontal->handle(sender,sel,ptr); return 1; } // Timeout long FXScrollArea::onAutoScroll(FXObject*,FXSelector sel,void* ptr){ register FXEvent* event=(FXEvent*)ptr; register FXint dx=0; register FXint dy=0; // If scrolling only while inside, and not inside, we stop scrolling if((flags&FLAG_SCROLLINSIDE) && !(0<=event->win_x && 0<=event->win_y && event->win_xwin_ywin_xwin_x; else if(viewport_w-AUTOSCROLL_FUDGE<=event->win_x) dx=viewport_w-AUTOSCROLL_FUDGE-event->win_x; // Figure scroll amount y if(event->win_ywin_y; else if(viewport_h-AUTOSCROLL_FUDGE<=event->win_y) dy=viewport_h-AUTOSCROLL_FUDGE-event->win_y; // Keep autoscrolling if(dx || dy){ FXint oldposx=pos_x; FXint oldposy=pos_y; if(flags&FLAG_SCROLLINSIDE){ FXASSERT(FXABS(dx)<=AUTOSCROLL_FUDGE); FXASSERT(FXABS(dy)<=AUTOSCROLL_FUDGE); dx*=acceleration[FXABS(dx)]; dy*=acceleration[FXABS(dy)]; } // Scroll a bit setPosition(pos_x+dx,pos_y+dy); // Setup next timer if we can still scroll some more if((pos_x!=oldposx) || (pos_y!=oldposy)){ getApp()->addTimeout(this,FXSELID(sel),getApp()->getScrollSpeed(),event); } } // Kill tip flags&=~FLAG_TIP; return 0; } // Start automatic scrolling FXbool FXScrollArea::startAutoScroll(FXEvent *event,FXbool onlywheninside){ register FXbool autoscrolling=FALSE; flags&=~FLAG_SCROLLINSIDE; if(onlywheninside) flags|=FLAG_SCROLLINSIDE; if(horizontal->getPage()getRange()){ if((event->win_xgetPosition())) autoscrolling=TRUE; else if((viewport_w-AUTOSCROLL_FUDGE<=event->win_x) && (horizontal->getPosition()getRange()-horizontal->getPage())) autoscrolling=TRUE; } if(vertical->getPage()getRange()){ if((event->win_ygetPosition())) autoscrolling=TRUE; else if((viewport_h-AUTOSCROLL_FUDGE<=event->win_y) && (vertical->getPosition()getRange()-vertical->getPage())) autoscrolling=TRUE; } if(onlywheninside && (event->win_x<0 || event->win_y<0 || viewport_w<=event->win_x || viewport_h<=event->win_y)) autoscrolling=FALSE; if(autoscrolling){ if(!getApp()->hasTimeout(this,ID_AUTOSCROLL)){ getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); } } else{ getApp()->removeTimeout(this,ID_AUTOSCROLL); } return autoscrolling; } // Stop automatic scrolling void FXScrollArea::stopAutoScroll(){ getApp()->removeTimeout(this,ID_AUTOSCROLL); flags&=~FLAG_SCROLLINSIDE; } // Set scroll style void FXScrollArea::setScrollStyle(FXuint style){ FXuint opts=(options&~SCROLLER_MASK) | (style&SCROLLER_MASK); if(options!=opts){ if(opts&SCROLLERS_DONT_TRACK){ horizontal->setScrollBarStyle(horizontal->getScrollBarStyle()|SCROLLBAR_WHEELJUMP); vertical->setScrollBarStyle(vertical->getScrollBarStyle()|SCROLLBAR_WHEELJUMP); } else{ horizontal->setScrollBarStyle(horizontal->getScrollBarStyle()&~SCROLLBAR_WHEELJUMP); vertical->setScrollBarStyle(vertical->getScrollBarStyle()&~SCROLLBAR_WHEELJUMP); } options=opts; recalc(); } } // Get scroll style FXuint FXScrollArea::getScrollStyle() const { return (options&SCROLLER_MASK); } // True if horizontally scrollable enabled FXbool FXScrollArea::isHorizontalScrollable() const { return !((options&HSCROLLER_NEVER) && (options&HSCROLLER_ALWAYS)); } // True if vertically scrollable enabled FXbool FXScrollArea::isVerticalScrollable() const { return !((options&VSCROLLER_NEVER) && (options&VSCROLLER_ALWAYS)); } // Default viewport width FXint FXScrollArea::getViewportWidth(){ return width; } // Default viewport height FXint FXScrollArea::getViewportHeight(){ return height; } // Determine minimum content width of scroll area FXint FXScrollArea::getContentWidth(){ return 1; } // Determine minimum content height of scroll area FXint FXScrollArea::getContentHeight(){ return 1; } // Recalculate layout void FXScrollArea::layout(){ register FXint new_x,new_y,content_w,content_h; register FXint sh_h=0; register FXint sv_w=0; // Inviolate FXASSERT(pos_x<=0 && pos_y<=0); // Initial viewport size viewport_w=getViewportWidth(); viewport_h=getViewportHeight(); // ALWAYS determine content size content_w=getContentWidth(); content_h=getContentHeight(); // Get dimensions of the scroll bars if(!(options&HSCROLLER_NEVER)) sh_h=horizontal->getDefaultHeight(); if(!(options&VSCROLLER_NEVER)) sv_w=vertical->getDefaultWidth(); // Should we disable the scroll bars? A bit tricky as the scrollbars // may influence each other's presence. Also, we don't allow more than // 50% of the viewport to be taken up by scrollbars; when the scrollbars // take up more than 50% of the available space we simply turn them off. if(!(options&(HSCROLLER_ALWAYS|VSCROLLER_ALWAYS)) && (content_w<=viewport_w) && (content_h<=viewport_h)){sh_h=sv_w=0;} if(!(options&HSCROLLER_ALWAYS) && ((content_w<=viewport_w-sv_w) || (0>=viewport_h-sh_h-sh_h))) sh_h=0; if(!(options&VSCROLLER_ALWAYS) && ((content_h<=viewport_h-sh_h) || (0>=viewport_w-sv_w-sv_w))) sv_w=0; if(!(options&HSCROLLER_ALWAYS) && ((content_w<=viewport_w-sv_w) || (0>=viewport_h-sh_h-sh_h))) sh_h=0; // Viewport size with scroll bars taken into account viewport_w-=sv_w; viewport_h-=sh_h; // Adjust content size, now that we know about those scroll bars if((options&HSCROLLER_NEVER)&&(options&HSCROLLER_ALWAYS)) content_w=viewport_w; if((options&VSCROLLER_NEVER)&&(options&VSCROLLER_ALWAYS)) content_h=viewport_h; // Furthermore, content size won't be smaller than the viewport if(content_wsetRange(content_w); vertical->setRange(content_h); // Page size may have changed horizontal->setPage(viewport_w); vertical->setPage(viewport_h); // Position may have changed horizontal->setPosition(-pos_x); vertical->setPosition(-pos_y); // Get back the adjusted position new_x=-horizontal->getPosition(); new_y=-vertical->getPosition(); // Scroll to force position back into range if(new_x!=pos_x || new_y!=pos_y){ moveContents(new_x,new_y); } // Read back validated position pos_x=-horizontal->getPosition(); pos_y=-vertical->getPosition(); // Hide or show horizontal scroll bar if(sh_h){ horizontal->position(0,height-sh_h,width-sv_w,sh_h); horizontal->show(); horizontal->raise(); } else{ horizontal->hide(); } // Hide or show vertical scroll bar if(sv_w){ vertical->position(width-sv_w,0,sv_w,height-sh_h); vertical->show(); vertical->raise(); } else{ vertical->hide(); } // Hide or show scroll corner if(sv_w && sh_h){ corner->position(width-sv_w,height-sh_h,sv_w,sh_h); corner->show(); corner->raise(); } else{ corner->hide(); } // No more dirty flags&=~FLAG_DIRTY; } // Set position void FXScrollArea::setPosition(FXint x,FXint y){ FXint new_x,new_y; // Set scroll bars horizontal->setPosition(-x); vertical->setPosition(-y); // Then read back valid position from scroll bars new_x=-horizontal->getPosition(); new_y=-vertical->getPosition(); // Move content if there's a change if(new_x!=pos_x || new_y!=pos_y){ moveContents(new_x,new_y); } } // Clean up FXScrollArea::~FXScrollArea(){ getApp()->removeTimeout(this,ID_AUTOSCROLL); horizontal=(FXScrollBar*)-1L; vertical=(FXScrollBar*)-1L; corner=(FXScrollCorner*)-1L; } } fox1.6-1.6.57/src/FXScrollBar.cpp000066400000000000000000000751511326741342000162620ustar00rootroot00000000000000/******************************************************************************** * * * S c r o l l b a r O b j e c t s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXScrollBar.cpp,v 1.27 2006/01/22 17:58:41 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXScrollBar.h" /* Notes: - Should increase/decrease, and slider get messages instead? - Scrollbar items should derive from FXWindow (as they are very simple). - If non-scrollable, but drawn anyway, don't draw thumb! - In case of a coarse range, we have rounding also. - The API's setPosition(), setRange() and setPage() should probably have an optional notify callback. */ #define SCROLLBAR_MASK (SCROLLBAR_HORIZONTAL|SCROLLBAR_WHEELJUMP) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXScrollBar) FXScrollBarMap[]={ FXMAPFUNC(SEL_PAINT,0,FXScrollBar::onPaint), FXMAPFUNC(SEL_MOTION,0,FXScrollBar::onMotion), FXMAPFUNC(SEL_MOUSEWHEEL,0,FXScrollBar::onMouseWheel), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXScrollBar::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXScrollBar::onLeftBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXScrollBar::onMiddleBtnPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXScrollBar::onMiddleBtnRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXScrollBar::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXScrollBar::onRightBtnRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXScrollBar::onUngrabbed), FXMAPFUNC(SEL_TIMEOUT,FXScrollBar::ID_TIMEWHEEL,FXScrollBar::onTimeWheel), FXMAPFUNC(SEL_TIMEOUT,FXScrollBar::ID_AUTOSCROLL,FXScrollBar::onAutoScroll), FXMAPFUNC(SEL_COMMAND,FXScrollBar::ID_SETVALUE,FXScrollBar::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXScrollBar::ID_SETINTVALUE,FXScrollBar::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXScrollBar::ID_GETINTVALUE,FXScrollBar::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXScrollBar::ID_SETINTRANGE,FXScrollBar::onCmdSetIntRange), FXMAPFUNC(SEL_COMMAND,FXScrollBar::ID_GETINTRANGE,FXScrollBar::onCmdGetIntRange), }; // Object implementation FXIMPLEMENT(FXScrollBar,FXWindow,FXScrollBarMap,ARRAYNUMBER(FXScrollBarMap)) // For deserialization FXScrollBar::FXScrollBar(){ flags|=FLAG_ENABLED|FLAG_SHOWN; barsize=15; thumbsize=8; thumbpos=15; dragpoint=0; mode=MODE_NONE; } // Make a scrollbar FXScrollBar::FXScrollBar(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXWindow(p,opts,x,y,w,h){ flags|=FLAG_ENABLED|FLAG_SHOWN; backColor=getApp()->getBaseColor(); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); borderColor=getApp()->getBorderColor(); arrowColor=getApp()->getForeColor(); barsize=getApp()->getScrollBarSize(); thumbpos=barsize; thumbsize=barsize>>1; target=tgt; message=sel; dragpoint=0; range=100; page=1; line=1; pos=0; mode=MODE_NONE; } // Get default size FXint FXScrollBar::getDefaultWidth(){ return (options&SCROLLBAR_HORIZONTAL) ? barsize+barsize+(barsize>>1) : barsize; } FXint FXScrollBar::getDefaultHeight(){ return (options&SCROLLBAR_HORIZONTAL) ? barsize : barsize+barsize+(barsize>>1); } // Layout changed void FXScrollBar::layout(){ setPosition(pos); flags&=~FLAG_DIRTY; } // Update value from a message long FXScrollBar::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setPosition((FXint)(FXival)ptr); return 1; } // Update value from a message long FXScrollBar::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setPosition(*((FXint*)ptr)); return 1; } // Obtain value with a message long FXScrollBar::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getPosition(); return 1; } // Update range from a message long FXScrollBar::onCmdSetIntRange(FXObject*,FXSelector,void* ptr){ setRange(((FXint*)ptr)[1]); return 1; } // Get range with a message long FXScrollBar::onCmdGetIntRange(FXObject*,FXSelector,void* ptr){ ((FXint*)ptr)[0]=0; ((FXint*)ptr)[1]=getRange(); return 1; } // Pressed LEFT button in slider // Note we don't move the focus to the scrollbar widget! long FXScrollBar::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint p=pos; if(isEnabled()){ grab(); getApp()->removeTimeout(this,ID_TIMEWHEEL); getApp()->removeTimeout(this,ID_AUTOSCROLL); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; if(options&SCROLLBAR_HORIZONTAL){ // Horizontal scrollbar if(event->win_xaddTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)-line); p=pos-line; update(); mode=MODE_DEC; } else if(width-height<=event->win_x){ // Right arrow getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)line); p=pos+line; update(); mode=MODE_INC; } else if(event->win_xaddTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)-page); p=pos-page; update(); mode=MODE_PAGE_DEC; } else if(thumbpos+thumbsize<=event->win_x){ // Page right getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)page); p=pos+page; update(); mode=MODE_PAGE_INC; } else{ // Grabbed the puck if(event->state&(CONTROLMASK|SHIFTMASK|ALTMASK)) mode=MODE_FINE_DRAG; dragpoint=event->win_x-thumbpos; mode=MODE_DRAG; } } else{ // Vertical scrollbar if(event->win_yaddTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)-line); p=pos-line; update(); mode=MODE_DEC; } else if(height-width<=event->win_y){ // Down arrow getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)line); p=pos+line; update(); mode=MODE_INC; } else if(event->win_yaddTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)-page); p=pos-page; update(); mode=MODE_PAGE_DEC; } else if(thumbpos+thumbsize<=event->win_y){ // Page down getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)page); p=pos+page; update(); mode=MODE_PAGE_INC; } else{ // Grabbed the puck if(event->state&(CONTROLMASK|SHIFTMASK|ALTMASK)) mode=MODE_FINE_DRAG; dragpoint=event->win_y-thumbpos; mode=MODE_DRAG; } } if(p<0) p=0; if(p>(range-page)) p=range-page; if(p!=pos){ setPosition(p); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } return 1; } return 0; } // Released LEFT button long FXScrollBar::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXuint flgs=flags; if(isEnabled()){ ungrab(); flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; dragpoint=0; mode=MODE_NONE; setPosition(pos); update(); getApp()->removeTimeout(this,ID_TIMEWHEEL); getApp()->removeTimeout(this,ID_AUTOSCROLL); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(flgs&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } return 1; } return 0; } // Pressed MIDDLE button in slider long FXScrollBar::onMiddleBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; register FXint p=pos; register int travel,lo,hi,t; if(isEnabled()){ grab(); getApp()->removeTimeout(this,ID_TIMEWHEEL); getApp()->removeTimeout(this,ID_AUTOSCROLL); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONPRESS,message),ptr)) return 1; mode=MODE_DRAG; flags&=~FLAG_UPDATE; dragpoint=thumbsize/2; if(options&SCROLLBAR_HORIZONTAL){ travel=width-height-height-thumbsize; t=event->win_x-dragpoint; if(t(width-height-thumbsize)) t=width-height-thumbsize; if(t!=thumbpos){ FXMINMAX(lo,hi,t,thumbpos); update(lo,0,hi+thumbsize-lo,height); thumbpos=t; } if(travel>0){ p=(FXint)((((FXdouble)(thumbpos-height))*(range-page))/travel); } else { p=0; } } else{ travel=height-width-width-thumbsize; t=event->win_y-dragpoint; if(t(height-width-thumbsize)) t=height-width-thumbsize; if(t!=thumbpos){ FXMINMAX(lo,hi,t,thumbpos); update(0,lo,width,hi+thumbsize-lo); thumbpos=t; } if(travel>0){ p=(FXint)((((FXdouble)(thumbpos-width))*(range-page))/travel); } else { p=0; } } if(p<0) p=0; if(p>(range-page)) p=range-page; if(pos!=p){ pos=p; flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } return 1; } return 0; } // Released MIDDLE button long FXScrollBar::onMiddleBtnRelease(FXObject*,FXSelector,void* ptr){ FXuint flgs=flags; if(isEnabled()){ ungrab(); flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; dragpoint=0; mode=MODE_NONE; setPosition(pos); update(); getApp()->removeTimeout(this,ID_TIMEWHEEL); getApp()->removeTimeout(this,ID_AUTOSCROLL); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONRELEASE,message),ptr)) return 1; if(flgs&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } return 1; } return 0; } // Pressed RIGHT button in slider long FXScrollBar::onRightBtnPress(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint p=pos; if(isEnabled()){ grab(); getApp()->removeTimeout(this,ID_TIMEWHEEL); getApp()->removeTimeout(this,ID_AUTOSCROLL); if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; if(options&SCROLLBAR_HORIZONTAL){ // Horizontal scrollbar if(event->win_xaddTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)-1); p=pos-1; update(); mode=MODE_DEC; } else if(width-height<=event->win_x){ // Right arrow getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)1); p=pos+1; update(); mode=MODE_INC; } else if(event->win_xaddTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)-line); p=pos-line; update(); mode=MODE_PAGE_DEC; } else if(thumbpos+thumbsize<=event->win_x){ // Page right getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)line); p=pos+line; update(); mode=MODE_PAGE_INC; } else{ // Grabbed the puck dragpoint=event->win_x-thumbpos; mode=MODE_FINE_DRAG; } } else{ // Vertical scrollbar if(event->win_yaddTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)-1); p=pos-1; update(); mode=MODE_DEC; } else if(height-width<=event->win_y){ // Down arrow getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)1); p=pos+1; update(); mode=MODE_INC; } else if(event->win_yaddTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)-line); p=pos-line; update(); mode=MODE_PAGE_DEC; } else if(thumbpos+thumbsize<=event->win_y){ // Page down getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollDelay(),(void*)(FXival)line); p=pos+line; update(); mode=MODE_PAGE_INC; } else{ // Grabbed the puck dragpoint=event->win_y-thumbpos; mode=MODE_FINE_DRAG; } } if(p<0) p=0; if(p>(range-page)) p=range-page; if(p!=pos){ setPosition(p); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } return 1; } return 0; } // Released RIGHT button long FXScrollBar::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ FXuint flgs=flags; if(isEnabled()){ ungrab(); flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; dragpoint=0; mode=MODE_NONE; setPosition(pos); update(); getApp()->removeTimeout(this,ID_TIMEWHEEL); getApp()->removeTimeout(this,ID_AUTOSCROLL); if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; if(flgs&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } return 1; } return 0; } // The widget lost the grab for some reason long FXScrollBar::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXWindow::onUngrabbed(sender,sel,ptr); getApp()->removeTimeout(this,ID_TIMEWHEEL); getApp()->removeTimeout(this,ID_AUTOSCROLL); flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; dragpoint=0; mode=MODE_NONE; return 1; } // Moving long FXScrollBar::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXint travel,hi,lo,t,p; if(!isEnabled()) return 0; if(mode>=MODE_DRAG){ p=0; // If modifiers down, fine scrolling method goes in effect, if // not, switch back to coarse mode (thanks, Tony )! if(event->state&(CONTROLMASK|SHIFTMASK|ALTMASK|RIGHTBUTTONMASK)) mode=MODE_FINE_DRAG; else mode=MODE_DRAG; // Coarse movements if(mode==MODE_DRAG){ if(options&SCROLLBAR_HORIZONTAL){ travel=width-height-height-thumbsize; t=event->win_x-dragpoint; if(t(width-height-thumbsize)) t=width-height-thumbsize; if(t!=thumbpos){ FXMINMAX(lo,hi,t,thumbpos); update(lo,0,hi+thumbsize-lo,height); thumbpos=t; } if(travel>0){ p=(FXint)((((FXdouble)(thumbpos-height))*(range-page)+travel/2)/travel); } } else{ travel=height-width-width-thumbsize; t=event->win_y-dragpoint; if(t(height-width-thumbsize)) t=height-width-thumbsize; if(t!=thumbpos){ FXMINMAX(lo,hi,t,thumbpos); update(0,lo,width,hi+thumbsize-lo); thumbpos=t; } if(travel>0){ p=(FXint)((((FXdouble)(thumbpos-width))*(range-page)+travel/2)/travel); } } } // Fine movements else if(mode==MODE_FINE_DRAG){ if(options&SCROLLBAR_HORIZONTAL){ travel=width-height-height-thumbsize; p=pos+event->win_x-event->last_x; if(p<0) p=0; if(p>(range-page)) p=range-page; if(range>page){ t=height+(FXint)((((FXdouble)pos)*travel)/(range-page)); } else { t=height; } if(t!=thumbpos){ FXMINMAX(lo,hi,t,thumbpos); update(lo,0,hi+thumbsize-lo,height); thumbpos=t; } } else{ travel=height-width-width-thumbsize; p=pos+event->win_y-event->last_y; if(p<0) p=0; if(p>(range-page)) p=range-page; if(range>page){ t=width+(FXint)((((FXdouble)pos)*travel)/(range-page)); } else { t=width; } if(t!=thumbpos){ FXMINMAX(lo,hi,t,thumbpos); update(0,lo,width,hi+thumbsize-lo); thumbpos=t; } } } // Clamp range and issue callbacks if(p<0) p=0; if(p>(range-page)) p=range-page; if(pos!=p){ pos=p; flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); return 1; } } return 0; } // Mouse wheel long FXScrollBar::onMouseWheel(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; FXint jump,dragjump; if(isEnabled()){ getApp()->removeTimeout(this,ID_TIMEWHEEL); getApp()->removeTimeout(this,ID_AUTOSCROLL); if(!(ev->state&(LEFTBUTTONMASK|MIDDLEBUTTONMASK|RIGHTBUTTONMASK))){ if(ev->state&ALTMASK) jump=line; // Fine scrolling else if(ev->state&CONTROLMASK) jump=page; // Coarse scrolling else jump=FXMIN(page,getApp()->getWheelLines()*line); // Normal scrolling if(dragpoint==0) dragpoint=pos; // Were not scrolling already? dragpoint-=ev->code*jump/120; // Move scroll position if(dragpoint<0) dragpoint=0; if(dragpoint>(range-page)) dragpoint=range-page; if(dragpoint!=pos){ if(options&SCROLLBAR_WHEELJUMP){ setPosition(dragpoint); dragpoint=0; if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } else{ dragjump=(dragpoint-pos); if(FXABS(dragjump)>16) dragjump/=16; getApp()->addTimeout(this,ID_TIMEWHEEL,5,(void*)(FXival)dragjump); } } else{ dragpoint=0; } return 1; } } return 0; } // Smoothly scroll to desired value as determined by wheel long FXScrollBar::onTimeWheel(FXObject*,FXSelector,void* ptr){ register FXint p=pos+(FXint)(FXival)ptr; if(dragpointtryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } else{ setPosition(p); getApp()->addTimeout(this,ID_TIMEWHEEL,5,ptr); if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } } else if(dragpoint>pos){ if(p>=dragpoint){ setPosition(dragpoint); dragpoint=0; if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } else{ setPosition(p); getApp()->addTimeout(this,ID_TIMEWHEEL,5,ptr); if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } } else{ dragpoint=0; } return 1; } // Automatic scroll based on timer long FXScrollBar::onAutoScroll(FXObject*,FXSelector,void* ptr){ register FXint p=pos+(FXint)(FXival)ptr; if(p<=0){ p=0; } else if(p>=(range-page)){ p=range-page; } else{ getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),ptr); } if(p!=pos){ setPosition(p); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); return 1; } return 0; } // Draw button in scrollbar; this is slightly different from a raised rectangle void FXScrollBar::drawButton(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXbool down){ dc.setForeground(backColor); dc.fillRectangle(x+2,y+2,w-4,h-4); if(!down){ dc.setForeground(backColor); dc.fillRectangle(x,y,w-1,1); dc.fillRectangle(x,y,1,h-1); dc.setForeground(hiliteColor); dc.fillRectangle(x+1,y+1,w-2,1); dc.fillRectangle(x+1,y+1,1,h-2); dc.setForeground(shadowColor); dc.fillRectangle(x+1,y+h-2,w-2,1); dc.fillRectangle(x+w-2,y+1,1,h-2); dc.setForeground(borderColor); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); } else{ dc.setForeground(borderColor); dc.fillRectangle(x,y,w-2,1); dc.fillRectangle(x,y,1,h-2); dc.setForeground(shadowColor); dc.fillRectangle(x+1,y+1,w-3,1); dc.fillRectangle(x+1,y+1,1,h-3); dc.setForeground(hiliteColor); dc.fillRectangle(x,y+h-1,w-1,1); dc.fillRectangle(x+w-1,y+1,1,h-1); dc.setForeground(backColor); dc.fillRectangle(x+1,y+h-2,w-1,1); dc.fillRectangle(x+w-2,y+2,1,h-2); } } // Draw left arrow void FXScrollBar::drawLeftArrow(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXbool down){ FXPoint points[3]; FXint ah,ab; ab=(h-7)|1; ah=ab>>1; x=x+((w-ah)>>1); y=y+((h-ab)>>1); if(down){ ++x; ++y; } points[0].x=x+ah; points[0].y=y; points[1].x=x+ah; points[1].y=y+ab-1; points[2].x=x; points[2].y=y+(ab>>1); dc.setForeground(arrowColor); dc.fillPolygon(points,3); } // Draw right arrow void FXScrollBar::drawRightArrow(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXbool down){ FXPoint points[3]; FXint ah,ab; ab=(h-7)|1; ah=ab>>1; x=x+((w-ah)>>1); y=y+((h-ab)>>1); if(down){ ++x; ++y; } points[0].x=x; points[0].y=y; points[1].x=x; points[1].y=y+ab-1; points[2].x=x+ah; points[2].y=y+(ab>>1); dc.setForeground(arrowColor); dc.fillPolygon(points,3); } // Draw up arrow void FXScrollBar::drawUpArrow(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXbool down){ FXPoint points[3]; FXint ah,ab; ab=(w-7)|1; ah=ab>>1; x=x+((w-ab)>>1); y=y+((h-ah)>>1); if(down){ ++x; ++y; } points[0].x=x+(ab>>1); points[0].y=y-1; points[1].x=x; points[1].y=y+ah; points[2].x=x+ab; points[2].y=y+ah; dc.setForeground(arrowColor); dc.fillPolygon(points,3); } // Draw down arrow void FXScrollBar::drawDownArrow(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXbool down){ FXPoint points[3]; FXint ah,ab; ab=(w-7)|1; ah=ab>>1; x=x+((w-ab)>>1); y=y+((h-ah)>>1); if(down){ ++x; ++y; } points[0].x=x+1; points[0].y=y; points[1].x=x+ab-1; points[1].y=y; points[2].x=x+(ab>>1); points[2].y=y+ah; dc.setForeground(arrowColor); dc.fillPolygon(points,3); } // Handle repaint long FXScrollBar::onPaint(FXObject*,FXSelector,void* ptr){ register FXEvent *ev=(FXEvent*)ptr; register int total; FXDCWindow dc(this,ev); if(options&SCROLLBAR_HORIZONTAL){ total=width-height-height; if(thumbsizerange) p=range; if(page!=p){ page=p; setPosition(pos); } } // Set line size void FXScrollBar::setLine(FXint l){ if(l<1) l=1; line=l; } // Set position; tricky because the thumb size may have changed // as well; we do the minimal possible update to repaint properly. void FXScrollBar::setPosition(FXint p){ FXint total,travel,lo,hi,l,h; pos=p; if(pos<0) pos=0; if(pos>(range-page)) pos=range-page; lo=thumbpos; hi=thumbpos+thumbsize; if(options&SCROLLBAR_HORIZONTAL){ total=width-height-height; thumbsize=(total*page)/range; if(thumbsize<(barsize>>1)) thumbsize=(barsize>>1); travel=total-thumbsize; if(range>page){ thumbpos=height+(FXint)((((FXdouble)pos)*travel)/(range-page)); } else { thumbpos=height; } l=thumbpos; h=thumbpos+thumbsize; if(l!=lo || h!=hi){ update(FXMIN(l,lo),0,FXMAX(h,hi)-FXMIN(l,lo),height); } } else{ total=height-width-width; thumbsize=(total*page)/range; if(thumbsize<(barsize>>1)) thumbsize=(barsize>>1); travel=total-thumbsize; if(range>page){ thumbpos=width+(FXint)((((FXdouble)pos)*travel)/(range-page)); } else { thumbpos=width; } l=thumbpos; h=thumbpos+thumbsize; if(l!=lo || h!=hi){ update(0,FXMIN(l,lo),width,FXMAX(h,hi)-FXMIN(l,lo)); } } } // Set highlight color void FXScrollBar::setHiliteColor(FXColor clr){ if(hiliteColor!=clr){ hiliteColor=clr; update(); } } // Set shadow color void FXScrollBar::setShadowColor(FXColor clr){ if(shadowColor!=clr){ shadowColor=clr; update(); } } // Set border color void FXScrollBar::setBorderColor(FXColor clr){ if(borderColor!=clr){ borderColor=clr; update(); } } // Set arrow color void FXScrollBar::setArrowColor(FXColor clr){ if(arrowColor!=clr){ arrowColor=clr; update(); } } // Change the scrollbar style FXuint FXScrollBar::getScrollBarStyle() const { return (options&SCROLLBAR_MASK); } // Get the current scrollbar style void FXScrollBar::setScrollBarStyle(FXuint style){ FXuint opts=(options&~SCROLLBAR_MASK) | (style&SCROLLBAR_MASK); if(options!=opts){ options=opts; recalc(); update(); } } // Change the bar size void FXScrollBar::setBarSize(FXint size){ if(barsize!=size){ barsize=size; recalc(); } } // Save object to stream void FXScrollBar::save(FXStream& store) const { FXWindow::save(store); store << barsize; store << hiliteColor; store << shadowColor; store << borderColor; store << arrowColor; store << range; store << page; store << line; store << pos; } // Load object from stream void FXScrollBar::load(FXStream& store){ FXWindow::load(store); store >> barsize; store >> hiliteColor; store >> shadowColor; store >> borderColor; store >> arrowColor; store >> range; store >> page; store >> line; store >> pos; } // Delete FXScrollBar::~FXScrollBar(){ getApp()->removeTimeout(this,ID_TIMEWHEEL); getApp()->removeTimeout(this,ID_AUTOSCROLL); } /*******************************************************************************/ // Map FXDEFMAP(FXScrollCorner) FXScrollCornerMap[]={ FXMAPFUNC(SEL_PAINT,0,FXScrollCorner::onPaint), }; // Object implementation FXIMPLEMENT(FXScrollCorner,FXWindow,FXScrollCornerMap,ARRAYNUMBER(FXScrollCornerMap)) // Deserialization FXScrollCorner::FXScrollCorner(){ flags|=FLAG_ENABLED|FLAG_SHOWN; } // Construct and init FXScrollCorner::FXScrollCorner(FXComposite* p):FXWindow(p){ backColor=getApp()->getBaseColor(); flags|=FLAG_ENABLED|FLAG_SHOWN; } // Slightly different from Frame border long FXScrollCorner::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); dc.setForeground(backColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); return 1; } void FXScrollCorner::enable(){ } void FXScrollCorner::disable(){ } } fox1.6-1.6.57/src/FXScrollPane.cpp000066400000000000000000000213311326741342000164300ustar00rootroot00000000000000/******************************************************************************** * * * S c r o l l i n g M e n u P a n e W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXScrollPane.cpp,v 1.21 2006/01/22 17:58:41 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXArrowButton.h" #include "FXMenuPane.h" #include "FXScrollPane.h" /* Notes: - Should we reset the topmost item each time it is shown? - Don't disable arrows since not catching the event means it gets passed to the grab owner [at least on Windows]. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXScrollPane) FXScrollPaneMap[]={ FXMAPFUNC(SEL_COMMAND,FXScrollPane::ID_SCROLL_DN,FXScrollPane::onCmdIncrement), FXMAPFUNC(SEL_COMMAND,FXScrollPane::ID_SCROLL_UP,FXScrollPane::onCmdDecrement), }; // Object implementation FXIMPLEMENT(FXScrollPane,FXPopup,FXScrollPaneMap,ARRAYNUMBER(FXScrollPaneMap)) // Deserialization FXScrollPane::FXScrollPane(){ visible=10; top=0; } // Build empty one FXScrollPane::FXScrollPane(FXWindow* owner,FXint nvis,FXuint opts):FXMenuPane(owner,opts){ up=new FXArrowButton(this,this,ID_SCROLL_UP,ARROW_UP|ARROW_AUTO|ARROW_REPEAT); dn=new FXArrowButton(this,this,ID_SCROLL_DN,ARROW_DOWN|ARROW_AUTO|ARROW_REPEAT); up->setArrowSize(7); dn->setArrowSize(7); visible=nvis; top=0; } // Show popup and add to popup stack void FXScrollPane::show(){ FXMenuPane::show(); setTopItem(0); } // Get width FXint FXScrollPane::getDefaultWidth(){ register FXWindow* child; register FXint wmax,wcum,w,n; register FXuint hints; wmax=wcum=0; for(child=dn->getNext(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else w=child->getDefaultWidth(); if(wmaxgetNext(),n=0; child && ngetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=wmax; else w=child->getDefaultWidth(); wcum+=w; n++; } } if(options&POPUP_HORIZONTAL){ wcum+=up->getDefaultWidth(); wcum+=dn->getDefaultWidth(); } else{ wcum=wmax; } return wcum+(border<<1); } // Get height FXint FXScrollPane::getDefaultHeight(){ register FXWindow* child; register FXint hmax,hcum,h,n; register FXuint hints; hmax=hcum=0; for(child=dn->getNext(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else h=child->getDefaultHeight(); if(hmaxgetNext(),n=0; child && ngetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=hmax; else h=child->getDefaultHeight(); hcum+=h; n++; } } if(options&POPUP_HORIZONTAL){ hcum=hmax; } else{ hcum+=up->getDefaultHeight(); hcum+=dn->getDefaultHeight(); } return hcum+(border<<1); } // Recalculate layout void FXScrollPane::layout(){ register FXint w,h,x,y,mw,mh,arrowsize,n; register FXWindow *child; register FXuint hints; // Horizontal if(options&POPUP_HORIZONTAL){ // Width of arrow button arrowsize=up->getDefaultWidth(); // Get maximum size for(child=dn->getNext(),mw=0; child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else w=child->getDefaultWidth(); if(mwgetNext(),x=border+arrowsize,n=0; child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if(top<=n && nposition(x,border,w,height-(border<<1)); x+=w; } else{ child->position(0,height,w,height-(border<<1)); } n++; } } // Place arrow buttons up->position(border,border,arrowsize,height-(border<<1)); dn->position(width-border-arrowsize,border,arrowsize,height-(border<<1)); // Point arrows left and right up->setArrowStyle(ARROW_LEFT|ARROW_AUTO|ARROW_REPEAT); dn->setArrowStyle(ARROW_RIGHT|ARROW_AUTO|ARROW_REPEAT); } // Vertical else{ // Height of arrow button arrowsize=up->getDefaultHeight(); // Get maximum size for(child=dn->getNext(),mh=0; child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else h=child->getDefaultHeight(); if(mhgetNext(),y=border+arrowsize,n=0; child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if(top<=n && nposition(border,y,width-(border<<1),h); y+=h; } else{ child->position(width,0,width-(border<<1),h); // Move off to the side } n++; } } // Place arrow buttons up->position(border,border,width-(border<<1),arrowsize); dn->position(border,height-border-arrowsize,width-(border<<1),arrowsize); // Point arrows up and down up->setArrowStyle(ARROW_UP|ARROW_AUTO|ARROW_REPEAT); dn->setArrowStyle(ARROW_DOWN|ARROW_AUTO|ARROW_REPEAT); } // Arrow buttons stay on top up->raise(); dn->raise(); // No more dirty flags&=~FLAG_DIRTY; } // Scroll contents up long FXScrollPane::onCmdIncrement(FXObject*,FXSelector,void*){ setTopItem(top+1); return 1; } // Scroll contents down long FXScrollPane::onCmdDecrement(FXObject*,FXSelector,void*){ setTopItem(top-1); return 1; } // List is multiple of nitems void FXScrollPane::setNumVisible(FXint nvis){ if(nvis<0) nvis=0; if(visible!=nvis){ visible=nvis; setTopItem(top); // FIXME is this enough? } } // Scroll item to top void FXScrollPane::setTopItem(FXint t){ FXint m=numChildren()-visible-2; // FIXME should really be visible children if(t<0) t=0; if(t>=m) t=m; if(t!=top){ top=t; recalc(); } } // Destroy it FXScrollPane::~FXScrollPane(){ dn=(FXArrowButton*)-1L; up=(FXArrowButton*)-1L; } } fox1.6-1.6.57/src/FXScrollWindow.cpp000066400000000000000000000155161326741342000170240ustar00rootroot00000000000000/******************************************************************************** * * * S c r o l l W i n d o w W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXScrollWindow.cpp,v 1.37 2006/01/22 17:58:41 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXScrollBar.h" #include "FXScrollWindow.h" /* Notes: - Intercepts pagedn/pageup to scroll. - We're assuming you're not using LAYOUT_FIX_WIDTH and LAYOUT_FILL_X at the same time... - Note that content window's position is not necessarily the same as the scroll position pos_x and pos_y. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXScrollWindow) FXScrollWindowMap[]={ FXMAPFUNC(SEL_KEYPRESS,0,FXScrollWindow::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXScrollWindow::onKeyRelease), FXMAPFUNC(SEL_FOCUS_SELF,0,FXScrollWindow::onFocusSelf), }; // Object implementation FXIMPLEMENT(FXScrollWindow,FXScrollArea,FXScrollWindowMap,ARRAYNUMBER(FXScrollWindowMap)) // Construct and init FXScrollWindow::FXScrollWindow(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXScrollArea(p,opts,x,y,w,h){ } // Get content window; may be NULL FXWindow* FXScrollWindow::contentWindow() const { return corner->getNext(); } // Determine content width of scroll area FXint FXScrollWindow::getContentWidth(){ register FXuint hints; register FXint w=1; if(contentWindow()){ hints=contentWindow()->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=contentWindow()->getWidth(); else w=contentWindow()->getDefaultWidth(); } return w; } // Determine content height of scroll area FXint FXScrollWindow::getContentHeight(){ register FXuint hints; register FXint h=1; if(contentWindow()){ hints=contentWindow()->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=contentWindow()->getHeight(); else h=contentWindow()->getDefaultHeight(); } return h; } // Move contents; moves child window void FXScrollWindow::moveContents(FXint x,FXint y){ register FXWindow* contents=contentWindow(); register FXint xx,yy,ww,hh; register FXuint hints; if(contents){ // Get hints hints=contents->getLayoutHints(); // Get content size ww=getContentWidth(); hh=getContentHeight(); // Determine x-position xx=x; if(wwmove(xx,yy); } pos_x=x; pos_y=y; } // Recalculate layout void FXScrollWindow::layout(){ register FXWindow* contents=contentWindow(); register FXint xx,yy,ww,hh; register FXuint hints; // Layout scroll bars and viewport FXScrollArea::layout(); // Resize contents if(contents){ // Get hints hints=contents->getLayoutHints(); // Get content size ww=getContentWidth(); hh=getContentHeight(); // Determine x-position xx=pos_x; if(wwposition(xx,yy,ww,hh); // Make sure its under the scroll bars contents->lower(); } flags&=~FLAG_DIRTY; } // When focus moves to scroll window, we actually force the // focus to the content window or a child thereof. long FXScrollWindow::onFocusSelf(FXObject* sender,FXSelector,void* ptr){ FXWindow *child=contentWindow(); ///// FIXME see MDIChild ///// return child && child->handle(sender,FXSEL(SEL_FOCUS_SELF,0),ptr); } // Keyboard press long FXScrollWindow::onKeyPress(FXObject* sender,FXSelector sel,void* ptr){ if(FXScrollArea::onKeyPress(sender,sel,ptr)) return 1; switch(((FXEvent*)ptr)->code){ case KEY_Page_Up: case KEY_KP_Page_Up: setPosition(pos_x,pos_y+verticalScrollBar()->getPage()); return 1; case KEY_Page_Down: case KEY_KP_Page_Down: setPosition(pos_x,pos_y-verticalScrollBar()->getPage()); return 1; } return 0; } // Keyboard release long FXScrollWindow::onKeyRelease(FXObject* sender,FXSelector sel,void* ptr){ if(FXScrollArea::onKeyRelease(sender,sel,ptr)) return 1; switch(((FXEvent*)ptr)->code){ case KEY_Page_Up: case KEY_KP_Page_Up: case KEY_Page_Down: case KEY_KP_Page_Down: return 1; } return 0; } } fox1.6-1.6.57/src/FXSearchDialog.cpp000066400000000000000000000057471326741342000167300ustar00rootroot00000000000000/******************************************************************************** * * * T e x t S e a r c h D i a l o g * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSearchDialog.cpp,v 1.33 2006/01/22 17:58:41 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXFont.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXButton.h" #include "FXPacker.h" #include "FXHorizontalFrame.h" #include "FXTextField.h" #include "FXReplaceDialog.h" #include "FXSearchDialog.h" /* Notes: - Search dialog is essentially a FXReplaceDialog with some of the buttons hidden. */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXSearchDialog,FXReplaceDialog,NULL,0) // File Open Dialog FXSearchDialog::FXSearchDialog(FXWindow* owner,const FXString& caption,FXIcon* ic,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXReplaceDialog(owner,caption,ic,opts,x,y,w,h){ accept->setText(tr("&Search")); every->hide(); replacelabel->hide(); replacebox->hide(); } // Cleanup FXSearchDialog::~FXSearchDialog(){ } } fox1.6-1.6.57/src/FXSeparator.cpp000066400000000000000000000152761326741342000163410ustar00rootroot00000000000000/******************************************************************************** * * * S e p a r a t o r W i d g e t s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSeparator.cpp,v 1.28 2006/01/22 17:58:41 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXSeparator.h" /* Notes: - When changing icon/font/etc, we should only recalc and update when it's different. - When text changes, do we delete the hot key, or parse it from the new label? - It makes sense for certain ``passive'' widgets such as labels to have onUpdate; for example, to show/hide/whatever based on changing data structures. - Why not just have one type of separator, orientation simply being based on the widest dimension? */ #define SEPARATOR_EXTRA 2 #define SEPARATOR_MASK (SEPARATOR_NONE|SEPARATOR_GROOVE|SEPARATOR_RIDGE|SEPARATOR_LINE) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXSeparator) FXSeparatorMap[]={ FXMAPFUNC(SEL_PAINT,0,FXSeparator::onPaint), }; // Object implementation FXIMPLEMENT(FXSeparator,FXFrame,FXSeparatorMap,ARRAYNUMBER(FXSeparatorMap)) // Construct and init FXSeparator::FXSeparator(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ } // Get default size FXint FXSeparator::getDefaultWidth(){ FXint w=(options&(SEPARATOR_GROOVE|SEPARATOR_RIDGE)) ? 2 : 1; return w+padleft+padright+(border<<1); } FXint FXSeparator::getDefaultHeight(){ FXint h=(options&(SEPARATOR_GROOVE|SEPARATOR_RIDGE)) ? 2 : 1; return h+padtop+padbottom+(border<<1); } // Handle repaint long FXSeparator::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); register FXint kk,ll; // Draw background dc.setForeground(backColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); // Draw frame drawFrame(dc,0,0,width,height); // Horizonal orientation if((height-padbottom-padtop) < (width-padleft-padright)){ kk=(options&(SEPARATOR_GROOVE|SEPARATOR_RIDGE)) ? 2 : 1; ll=border+padtop+(height-padbottom-padtop-(border<<1)-kk)/2; if(options&SEPARATOR_GROOVE){ dc.setForeground(shadowColor); dc.fillRectangle(border+padleft,ll,width-padright-padleft-(border<<1),1); dc.setForeground(hiliteColor); dc.fillRectangle(border+padleft,ll+1,width-padright-padleft-(border<<1),1); } else if(options&SEPARATOR_RIDGE){ dc.setForeground(hiliteColor); dc.fillRectangle(border+padleft,ll,width-padright-padleft-(border<<1),1); dc.setForeground(shadowColor); dc.fillRectangle(border+padleft,ll+1,width-padright-padleft-(border<<1),1); } else if(options&SEPARATOR_LINE){ dc.setForeground(borderColor); dc.fillRectangle(border+padleft,ll,width-padright-padleft-(border<<1),1); } } // Vertical orientation else{ kk=(options&(SEPARATOR_GROOVE|SEPARATOR_RIDGE)) ? 2 : 1; ll=border+padleft+(width-padleft-padright-(border<<1)-kk)/2; if(options&SEPARATOR_GROOVE){ dc.setForeground(shadowColor); dc.fillRectangle(ll,padtop+border,1,height-padtop-padbottom-(border<<1)); dc.setForeground(hiliteColor); dc.fillRectangle(ll+1,padtop+border,1,height-padtop-padbottom-(border<<1)); } else if(options&SEPARATOR_RIDGE){ dc.setForeground(hiliteColor); dc.fillRectangle(ll,padtop+border,1,height-padtop-padbottom-(border<<1)); dc.setForeground(shadowColor); dc.fillRectangle(ll+1,padtop+border,1,height-padtop-padbottom-(border<<1)); } else if(options&SEPARATOR_LINE){ dc.setForeground(borderColor); dc.fillRectangle(ll,padtop+border,1,height-padtop-padbottom-(border<<1)); } } return 1; } // Change separator style void FXSeparator::setSeparatorStyle(FXuint style){ FXuint opts=(options&~SEPARATOR_MASK) | (style&SEPARATOR_MASK); if(options!=opts){ options=opts; recalc(); update(); } } // Get separator style FXuint FXSeparator::getSeparatorStyle() const { return (options&SEPARATOR_MASK); } /*******************************************************************************/ // Object implementation FXIMPLEMENT(FXHorizontalSeparator,FXSeparator,0,0) // Construct and init FXHorizontalSeparator::FXHorizontalSeparator(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXSeparator(p,opts,x,y,w,h,pl,pr,pt,pb){ } /*******************************************************************************/ // Object implementation FXIMPLEMENT(FXVerticalSeparator,FXSeparator,0,0) // Construct and init FXVerticalSeparator::FXVerticalSeparator(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXSeparator(p,opts,x,y,w,h,pl,pr,pt,pb){ } } fox1.6-1.6.57/src/FXSettings.cpp000066400000000000000000000514111326741342000161700ustar00rootroot00000000000000/******************************************************************************** * * * S e t t i n g s C l a s s * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSettings.cpp,v 1.54.2.1 2008/07/28 18:24:09 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXStringDict.h" #include "FXFile.h" #include "FXSettings.h" /* Notes: - Format for settings database file: [Section Key] EntryKey=string-with-no-spaces EntryKey="string\nwith a\nnewline in it\n" EntryKey=" string with leading and trailing spaces and \"embedded\" in it " EntryKey=string with no leading or trailing spaces - EntryKey may is of the form "ali baba", "ali-baba", "ali_baba", or "ali.baba". - Leading/trailing spaces are NOT part of the EntryKey. - FXSectionDict should go; FXSettings should simply derive from FXDict. - Escape sequences now allow octal (\377) as well as hex (\xff) codes. - EntryKey format should be like values. - Extensive error checking in unparseFile() to ensure no settings data is lost when disk is full. */ #define MAXBUFFER 2000 #define MAXNAME 200 #define MAXVALUE 2000 using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXSettings,FXDict,NULL,0) // Construct settings database FXSettings::FXSettings(){ modified=false; } // Construct copy of existing database FXSettings::FXSettings(const FXSettings& orig):FXDict(orig){ register FXint i; modified=orig.modified; for(i=0; i=end){ if(bol=eol || line[bol]=='#' || line[bol]==';' || line[bol]=='\n' || line[bol]=='\r') goto next; // Parse section name if(line[bol]=='['){ // Scan section name for(section=++bol; bol=eol || line[bol]!=']'){ fxwarning("%s:%d: illegal section name.\n",filename.text(),lineno); goto next; } // Terminate name line[bol]='\0'; // Add new section dict group=insert(line+section); } // Parse name-value pair else{ // Should have a group if(!group){ fxwarning("%s:%d: settings entry should follow a section.\n",filename.text(),lineno); goto next; } // Scan key name for(name=bol; bol=eol || line[bol]!='='){ fxwarning("%s:%d: expected '=' to follow key.\n",filename.text(),lineno); goto next; } // Remove trailing spaces after name for(p=bol; name

    replace(line+name,dequote(line+value),mark); } next: bol=eol; } // Done return true; } return false; } // Write string static bool writeString(FXFile& file,const FXchar* string){ register FXint len=strlen(string); return file.writeBlock(string,len)==len; } // Unparse registry file bool FXSettings::unparseFile(const FXString& filename){ FXFile file(filename,FXIO::Writing); FXchar line[MAXVALUE]; if(file.isOpen()){ // Loop over all sections for(FXint s=first(); sfirst(); esize(); e=group->next(e)){ // Is key-value pair marked? if(group->mark(e)){ // Write section name if not written yet if(!sec){ if(!writeString(file,"[")) goto x; if(!writeString(file,key(s))) goto x; if(!writeString(file,"]" ENDLINE)) goto x; sec=true; } // Write marked key-value pairs only if(!writeString(file,group->key(e))) goto x; if(!writeString(file,"=")) goto x; if(!writeString(file,enquote(line,group->data(e)))) goto x; if(!writeString(file,ENDLINE)) goto x; } } // Blank line after end if(sec){ if(!writeString(file,ENDLINE)) goto x; } } return true; } x:return false; } // Dequote a value, in situ FXchar* FXSettings::dequote(FXchar* text) const { register FXchar *result=text; register FXchar *ptr=text; register FXuint v; if(*text=='"'){ text++; while((v=*text++)!='\0' && v!='\n' && v!='"'){ if(v=='\\'){ v=*text++; switch(v){ case 'n': v='\n'; break; case 'r': v='\r'; break; case 'b': v='\b'; break; case 'v': v='\v'; break; case 'a': v='\a'; break; case 'f': v='\f'; break; case 't': v='\t'; break; case '\\': v='\\'; break; case '"': v='"'; break; case '\'': v='\''; break; case 'x': v='x'; if(Ascii::isHexDigit(*text)){ v=Ascii::digitValue(*text++); if(Ascii::isHexDigit(*text)){ v=(v<<4)+Ascii::digitValue(*text++); } } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': v=v-'0'; if('0'<=*text && *text<='7'){ v=(v<<3)+*text++-'0'; if('0'<=*text && *text<='7'){ v=(v<<3)+*text++-'0'; } } break; } } *ptr++=v; } *ptr='\0'; } return result; } // Check if quotes are needed static bool needquotes(const FXchar* text){ register const FXchar *ptr=text; register FXuchar c; while((c=*ptr++)!='\0'){ if(0x7f<=c || c<0x20 || c=='"' || c=='\'' || c=='\\' || (c==' ' && (ptr==(text+1) || *ptr=='\0'))) return true; } return false; } // Enquote a value FXchar* FXSettings::enquote(FXchar* result,const FXchar* text){ register FXchar *end=result+MAXVALUE-6; register FXchar *ptr=result; register FXuchar c; if(needquotes(text)){ *ptr++='"'; while((c=*text++)!='\0' && ptr>4]; *ptr++=FXString::HEX[c&15]; } else{ *ptr++=c; } break; } } *ptr++='"'; } else{ while((c=*text++)!='\0' && ptrfind(key); if(value){ result=vsscanf((char*)value,fmt,args); // Cast needed for HP-UX 11, which has wrong prototype for vsscanf } } va_end(args); return result; } // Read a string-valued registry entry const FXchar *FXSettings::readStringEntry(const FXchar *section,const FXchar *key,const FXchar *def){ if(!section || !section[0]){ fxerror("FXSettings::readStringEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::readStringEntry: bad key argument.\n"); } FXStringDict *group=find(section); if(group){ const char *value=group->find(key); if(value) return value; } return def; } // Read a int-valued registry entry FXint FXSettings::readIntEntry(const FXchar *section,const FXchar *key,FXint def){ if(!section || !section[0]){ fxerror("FXSettings::readIntEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::readIntEntry: bad key argument.\n"); } FXStringDict *group=find(section); if(group){ const char *value=group->find(key); if(value){ FXint ivalue; if(value[0]=='0' && (value[1]=='x' || value[1]=='X')){ if(sscanf(value+2,"%x",&ivalue)) return ivalue; } else{ if(sscanf(value,"%d",&ivalue)==1) return ivalue; } } } return def; } // Read a unsigned int-valued registry entry FXuint FXSettings::readUnsignedEntry(const FXchar *section,const FXchar *key,FXuint def){ if(!section || !section[0]){ fxerror("FXSettings::readUnsignedEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::readUnsignedEntry: bad key argument.\n"); } FXStringDict *group=find(section); if(group){ const char *value=group->find(key); if(value){ FXuint ivalue; if(value[0]=='0' && (value[1]=='x' || value[1]=='X')){ if(sscanf(value+2,"%x",&ivalue)) return ivalue; } else{ if(sscanf(value,"%u",&ivalue)==1) return ivalue; } } } return def; } // Read a double-valued registry entry FXdouble FXSettings::readRealEntry(const FXchar *section,const FXchar *key,FXdouble def){ if(!section || !section[0]){ fxerror("FXSettings::readRealEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::readRealEntry: bad key argument.\n"); } FXStringDict *group=find(section); if(group){ const char *value=group->find(key); if(value){ FXdouble dvalue; if(sscanf(value,"%lf",&dvalue)==1) return dvalue; } } return def; } // Read a color registry entry FXColor FXSettings::readColorEntry(const FXchar *section,const FXchar *key,FXColor def){ if(!section || !section[0]){ fxerror("FXSettings::readColorEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::readColorEntry: bad key argument.\n"); } FXStringDict *group=find(section); if(group){ const char *value=group->find(key); if(value){ return fxcolorfromname(value); } } return def; } // Read a boolean registry entry FXbool FXSettings::readBoolEntry(const FXchar *section,const FXchar *key,FXbool def){ if(!section || !section[0]){ fxerror("FXSettings::readBoolEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::readBoolEntry: bad key argument.\n"); } FXStringDict *group=find(section); if(group){ const char *value=group->find(key); if(value){ if(comparecase(value,"true")==0) return TRUE; else if(comparecase(value,"false")==0) return FALSE; else if(comparecase(value,"yes")==0) return TRUE; else if(comparecase(value,"no")==0) return FALSE; else if(comparecase(value,"on")==0) return TRUE; else if(comparecase(value,"off")==0) return FALSE; else if(comparecase(value,"1")==0) return TRUE; else if(comparecase(value,"0")==0) return FALSE; else if(comparecase(value,"maybe")==0) return MAYBE; } } return def; } // Write a formatted registry entry FXint FXSettings::writeFormatEntry(const FXchar *section,const FXchar *key,const FXchar *fmt,...){ if(!section || !section[0]){ fxerror("FXSettings::writeFormatEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::writeFormatEntry: bad key argument.\n"); } if(!fmt){ fxerror("FXSettings::writeFormatEntry: bad fmt argument.\n"); } FXStringDict *group=insert(section); va_list args; va_start(args,fmt); FXint result=0; if(group){ FXchar buffer[2048]; #if defined(WIN32) || defined(HAVE_VSNPRINTF) result=vsnprintf(buffer,sizeof(buffer),fmt,args); #else result=vsprintf(buffer,fmt,args); #endif group->replace(key,buffer,TRUE); modified=true; } va_end(args); return result; } // Write a string-valued registry entry bool FXSettings::writeStringEntry(const FXchar *section,const FXchar *key,const FXchar *val){ if(!section || !section[0]){ fxerror("FXSettings::writeStringEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::writeStringEntry: bad key argument.\n"); } FXStringDict *group=insert(section); if(group){ group->replace(key,val,true); modified=true; return true; } return false; } // Write a int-valued registry entry bool FXSettings::writeIntEntry(const FXchar *section,const FXchar *key,FXint val){ if(!section || !section[0]){ fxerror("FXSettings::writeIntEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::writeIntEntry: bad key argument.\n"); } FXStringDict *group=insert(section); if(group){ FXchar buffer[32]; sprintf(buffer,"%d",val); group->replace(key,buffer,true); modified=true; return true; } return false; } // Write a unsigned int-valued registry entry bool FXSettings::writeUnsignedEntry(const FXchar *section,const FXchar *key,FXuint val){ if(!section || !section[0]){ fxerror("FXSettings::writeUnsignedEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::writeUnsignedEntry: bad key argument.\n"); } FXStringDict *group=insert(section); if(group){ FXchar buffer[32]; sprintf(buffer,"%u",val); group->replace(key,buffer,TRUE); modified=true; return true; } return false; } // Write a double-valued registry entry bool FXSettings::writeRealEntry(const FXchar *section,const FXchar *key,FXdouble val){ if(!section || !section[0]){ fxerror("FXSettings::writeRealEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::writeRealEntry: bad key argument.\n"); } FXStringDict *group=insert(section); if(group){ FXchar buffer[64]; sprintf(buffer,"%.16g",val); group->replace(key,buffer,TRUE); modified=true; return true; } return false; } // Write a color registry entry bool FXSettings::writeColorEntry(const FXchar *section,const FXchar *key,FXColor val){ if(!section || !section[0]){ fxerror("FXSettings::writeColorEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::writeColorEntry: bad key argument.\n"); } FXStringDict *group=insert(section); if(group){ FXchar buffer[64]; group->replace(key,fxnamefromcolor(buffer,val),TRUE); modified=true; return true; } return false; } // Write a boolean registry entry bool FXSettings::writeBoolEntry(const FXchar *section,const FXchar *key,FXbool val){ if(!section || !section[0]){ fxerror("FXSettings::writeBoolEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::writeBoolEntry: bad key argument.\n"); } FXStringDict *group=insert(section); if(group){ group->replace(key,(val==FALSE) ? "false" : (val==TRUE) ? "true" : "maybe",TRUE); modified=true; return true; } return false; } // Delete a registry entry bool FXSettings::deleteEntry(const FXchar *section,const FXchar *key){ if(!section || !section[0]){ fxerror("FXSettings::deleteEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::deleteEntry: bad key argument.\n"); } FXStringDict *group=insert(section); if(group){ group->remove(key); modified=true; return true; } return false; } // Delete section bool FXSettings::deleteSection(const FXchar *section){ if(!section || !section[0]){ fxerror("FXSettings::deleteSection: bad section argument.\n"); } remove(section); modified=true; return true; } // Clear all sections bool FXSettings::clear(){ FXDict::clear(); modified=true; return true; } // See if section exists bool FXSettings::existingSection(const FXchar *section){ if(!section || !section[0]){ fxerror("FXSettings::existingSection: bad section argument.\n"); } return find(section)!=NULL; } // See if entry exists bool FXSettings::existingEntry(const FXchar *section,const FXchar *key){ if(!section || !section[0]){ fxerror("FXSettings::existingEntry: bad section argument.\n"); } if(!key || !key[0]){ fxerror("FXSettings::existingEntry: bad key argument.\n"); } FXStringDict *group=find(section); return group && group->find(key)!=NULL; } // Clean up FXSettings::~FXSettings(){ clear(); } } fox1.6-1.6.57/src/FXShell.cpp000066400000000000000000000172701326741342000154440ustar00rootroot00000000000000/******************************************************************************** * * * S h e l l W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXShell.cpp,v 1.81 2006/01/22 17:58:41 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXShell.h" /* Notes: - FXShell handles keys to implement focus change messages. - The initial size should probably be determined not in create(), but in show(). - Note that Shell is base class for transient ``popup'' override-redirect windows. For top level windows, we should use size hints rather than force the size. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXShell) FXShellMap[]={ FXMAPFUNC(SEL_CONFIGURE,0,FXShell::onConfigure), FXMAPFUNC(SEL_KEYPRESS,0,FXShell::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXShell::onKeyRelease), FXMAPFUNC(SEL_FOCUS_NEXT,0,FXShell::onFocusNext), FXMAPFUNC(SEL_FOCUS_PREV,0,FXShell::onFocusPrev), FXMAPFUNC(SEL_CHORE,FXShell::ID_LAYOUT,FXShell::onLayout), }; // Object implementation FXIMPLEMENT(FXShell,FXComposite,FXShellMap,ARRAYNUMBER(FXShellMap)) // Create a toplevel window FXShell::FXShell(FXApp* a,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXComposite(a,NULL,opts,x,y,w,h){ } // Create a toplevel window FXShell::FXShell(FXWindow* own,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXComposite(own->getApp(),own,opts,x,y,w,h){ } // Create X window void FXShell::create(){ FXint w,h; // Create this widget and all of its children FXComposite::create(); // Adjust size if necessary w=(1removeChore(this,ID_LAYOUT); getApp()->addChore(this,ID_LAYOUT); flags|=FLAG_DIRTY; } // Shell into the focus chain void FXShell::setFocus(){ flags|=FLAG_HELP; } // Shell out of focus chain void FXShell::killFocus(){ if(getFocus()) getFocus()->killFocus(); flags&=~FLAG_HELP; flags|=FLAG_UPDATE; } // Perform layout; return 0 because no GUI update is needed long FXShell::onLayout(FXObject*,FXSelector,void*){ layout(); return 0; } // Handle configure notify long FXShell::onConfigure(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXComposite::onConfigure(sender,sel,ptr); xpos=ev->rect.x; ypos=ev->rect.y; if((ev->rect.w!=width) || (ev->rect.h!=height)){ width=ev->rect.w; // Record new size height=ev->rect.h; // Delayed layout optimization. The delayed layout optimization // currently only works on UNIX. On Windows, the program enters // a modal loop during a window-resize operation. During this // modal loop, which is somewhere inside WIN32 code, we are completely // deaf to other event sources such as timers, chores, file i/o, and // are unable to perform idle processing. So the chore we would set // in recalc() would never fire until we're all done with the resizing. // We'd love to have a fix for this, but it seems difficult because of // the need to pass "non-client" events over to the DefWindowProc... #ifndef WIN32 recalc(); // On UNIX, we process idle messages during a resize #else layout(); // On Windows, we are in a modal loop and we have to force it #endif } return 1; } // Focus moved to next long FXShell::onFocusNext(FXObject* sender,FXSelector,void* ptr){ FXWindow *child; if(getFocus()){ child=getFocus()->getNext(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(sender,FXSEL(SEL_FOCUS_NEXT,0),ptr)) return 1; } child=child->getNext(); } getFocus()->killFocus(); } child=getFirst(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(sender,FXSEL(SEL_FOCUS_NEXT,0),ptr)) return 1; } child=child->getNext(); } return 0; } // Focus moved to previous long FXShell::onFocusPrev(FXObject* sender,FXSelector,void* ptr){ FXWindow *child; if(getFocus()){ child=getFocus()->getPrev(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(sender,FXSEL(SEL_FOCUS_PREV,0),ptr)) return 1; } child=child->getPrev(); } getFocus()->killFocus(); } child=getLast(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(sender,FXSEL(SEL_FOCUS_PREV,0),ptr)) return 1; } child=child->getPrev(); } return 0; } // Keyboard press long FXShell::onKeyPress(FXObject* sender,FXSelector sel,void* ptr){ // Try to handle normally if(FXComposite::onKeyPress(sender,sel,ptr)) return 1; // If not handled yet, try the default button if(((FXEvent*)ptr)->code==KEY_Return || ((FXEvent*)ptr)->code==KEY_KP_Enter){ // Find default widget FXWindow *def=findDefault(this); // Handle default key if(def && def->handle(sender,sel,ptr)) return 1; } return 0; } // Keyboard release long FXShell::onKeyRelease(FXObject* sender,FXSelector sel,void* ptr){ // Try to handle normally if(FXComposite::onKeyRelease(sender,sel,ptr)) return 1; // If not handled yet, try the default button if(((FXEvent*)ptr)->code==KEY_Return || ((FXEvent*)ptr)->code==KEY_KP_Enter){ // Find default widget FXWindow *def=findDefault(this); // Handle default key if(def && def->handle(sender,sel,ptr)) return 1; } return 0; } // Destruct FXShell::~FXShell(){ getApp()->removeChore(this,ID_LAYOUT); } } fox1.6-1.6.57/src/FXShutter.cpp000066400000000000000000000237451326741342000160370ustar00rootroot00000000000000/******************************************************************************** * * * S h u t t e r C o n t a i n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Charles W. Warren. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXShutter.cpp,v 1.43 2006/01/22 17:58:41 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXIcon.h" #include "FXFrame.h" #include "FXPacker.h" #include "FXVerticalFrame.h" #include "FXLabel.h" #include "FXButton.h" #include "FXScrollBar.h" #include "FXScrollWindow.h" #include "FXShutter.h" /* Notes: - Works now by means of integers, i.e. setCurrent(0) instead of having to hang on to pointers to specific shutter items. Advantage: You can make it connect to other widgets. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXShutterItem) FXShutterItemMap[]={ FXMAPFUNC(SEL_FOCUS_UP,0,FXShutterItem::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXShutterItem::onFocusDown), FXMAPFUNC(SEL_COMMAND,FXShutterItem::ID_SHUTTERITEM_BUTTON,FXShutterItem::onCmdButton), }; // Object implementation FXIMPLEMENT(FXShutterItem,FXVerticalFrame,FXShutterItemMap,ARRAYNUMBER(FXShutterItemMap)) FXShutterItem::FXShutterItem(FXShutter* p,const FXString& text,FXIcon* icon,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXVerticalFrame(p,(opts&~(PACK_UNIFORM_HEIGHT|PACK_UNIFORM_WIDTH)),x,y,w,h,0,0,0,0,0,0){ button=new FXButton(this,text,icon,this,FXShutterItem::ID_SHUTTERITEM_BUTTON,FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT,0,0,0,0,0,0,0,0); scrollWindow=new FXScrollWindow(this,VSCROLLER_NEVER|HSCROLLER_NEVER|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_LEFT|LAYOUT_TOP,0,0,0,0); content=new FXVerticalFrame(scrollWindow,LAYOUT_FILL_X|LAYOUT_FILL_Y|(opts&(PACK_UNIFORM_HEIGHT|PACK_UNIFORM_WIDTH)),0,0,0,0,pl,pr,pt,pb,hs,vs); content->setBackColor(getApp()->getShadowColor()); } // Button Pressed long FXShutterItem::onCmdButton(FXObject*,FXSelector,void* ptr){ getParent()->handle(this,FXSEL(SEL_COMMAND,FXShutter::ID_OPEN_SHUTTERITEM),ptr); return 1; } // Focus moved up long FXShutterItem::onFocusUp(FXObject* sender,FXSelector sel,void* ptr){ return FXVerticalFrame::onFocusPrev(sender,sel,ptr); } // Focus moved down long FXShutterItem::onFocusDown(FXObject* sender,FXSelector sel,void* ptr){ return FXVerticalFrame::onFocusNext(sender,sel,ptr); } // Change help text void FXShutterItem::setHelpText(const FXString& text){ button->setHelpText(text); } // Get help text FXString FXShutterItem::getHelpText() const { return button->getHelpText(); } // Change tip text void FXShutterItem::setTipText(const FXString& text){ button->setTipText(text); } // Get tip text FXString FXShutterItem::getTipText() const { return button->getTipText(); } // Thrash it FXShutterItem::~FXShutterItem(){ button=(FXButton*)-1L; scrollWindow=(FXScrollWindow*)-1L; content=(FXVerticalFrame*)-1L; } /*******************************************************************************/ // Map FXDEFMAP(FXShutter) FXShutterMap[]={ FXMAPFUNC(SEL_FOCUS_UP,0,FXShutter::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXShutter::onFocusDown), FXMAPFUNCS(SEL_UPDATE,FXShutter::ID_OPEN_FIRST,FXShutter::ID_OPEN_LAST,FXShutter::onUpdOpen), FXMAPFUNC(SEL_TIMEOUT,FXShutter::ID_SHUTTER_TIMEOUT,FXShutter::onTimeout), FXMAPFUNC(SEL_COMMAND,FXShutter::ID_OPEN_SHUTTERITEM,FXShutter::onOpenItem), FXMAPFUNC(SEL_COMMAND,FXShutter::ID_SETVALUE,FXShutter::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXShutter::ID_SETINTVALUE,FXShutter::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXShutter::ID_GETINTVALUE,FXShutter::onCmdGetIntValue), FXMAPFUNCS(SEL_COMMAND,FXShutter::ID_OPEN_FIRST,FXShutter::ID_OPEN_LAST,FXShutter::onCmdOpen), }; // Object implementation FXIMPLEMENT(FXShutter,FXVerticalFrame,FXShutterMap,ARRAYNUMBER(FXShutterMap)) // Make shutter FXShutter::FXShutter(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXVerticalFrame(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ target=tgt; message=sel; heightIncrement=1; closingHeight=0; closingHadScrollbar=FALSE; current=0; closing=-1; } // Focus moved up long FXShutter::onFocusUp(FXObject* sender,FXSelector sel,void* ptr){ return FXVerticalFrame::onFocusPrev(sender,sel,ptr); } // Focus moved down long FXShutter::onFocusDown(FXObject* sender,FXSelector sel,void* ptr){ return FXVerticalFrame::onFocusNext(sender,sel,ptr); } // Update value from a message long FXShutter::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCurrent((FXint)(FXival)ptr); return 1; } // Update value from a message long FXShutter::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setCurrent(*((FXint*)ptr)); return 1; } // Obtain value from text field long FXShutter::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=current; return 1; } // Open item long FXShutter::onCmdOpen(FXObject*,FXSelector sel,void*){ setCurrent(FXSELID(sel)-ID_OPEN_FIRST); return 1; } // Update the nth button long FXShutter::onUpdOpen(FXObject* sender,FXSelector sel,void* ptr){ sender->handle(this,((FXSELID(sel)-ID_OPEN_FIRST)==current) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),ptr); return 1; } // The sender of the message is the item to open up long FXShutter::onOpenItem(FXObject* sender,FXSelector,void*){ FXint which=indexOfChild((FXWindow*)sender); FXuint speed=getApp()->getAnimSpeed(); FXShutterItem *closingItem; if(current==which) which--; // Clicking on title button of currently active item should close it; "Markus Fleck" if(0<=which){ if(speed){ closing=current; heightIncrement=1; closingItem=(FXShutterItem*)childAtIndex(closing); closingHeight=closingItem->getHeight(); closingHadScrollbar=closingItem->scrollWindow->verticalScrollBar()->shown(); getApp()->addTimeout(this,ID_SHUTTER_TIMEOUT,speed); } current=which; recalc(); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)current); } return 1; } // Shutter Item Animation long FXShutter::onTimeout(FXObject*,FXSelector,void*){ // Closing item got deleted if(closing<0) return 0; // Shrink closing item a bit more closingHeight-=heightIncrement; heightIncrement+=5; // Force layout again recalc(); // Still not fully closed? if(closingHeight>0){ getApp()->addTimeout(this,ID_SHUTTER_TIMEOUT,getApp()->getAnimSpeed()); return 1; } // Now fully closed closing=-1; return 1; } // Layout void FXShutter::layout(){ register FXShutterItem* child; register FXint index,numchildren; numchildren=numChildren(); // One of the children may have disappeared if(current>=numchildren) current=numchildren-1; if(current==-1 && numchildren>0) current=0; // Fix by "Martin Welch" if(closing>=numchildren) closing=-1; // Force only one of the children to be open for(child=(FXShutterItem*)getFirst(),index=0; child; child=(FXShutterItem*)child->getNext(),index++){ if(child->shown()){ if(index==current){ child->setLayoutHints(LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_LEFT|LAYOUT_TOP); child->scrollWindow->setScrollStyle((closing>=0) ? (VSCROLLER_NEVER|HSCROLLER_NEVER) : HSCROLLER_NEVER); child->scrollWindow->show(); } else if(index==closing){ child->setLayoutHints(LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|LAYOUT_LEFT|LAYOUT_TOP); child->scrollWindow->setScrollStyle(closingHadScrollbar ? (VSCROLLER_ALWAYS|HSCROLLER_NEVER) : (VSCROLLER_NEVER|HSCROLLER_NEVER)); child->setHeight(closingHeight); } else{ child->setLayoutHints(LAYOUT_FILL_X|LAYOUT_LEFT|LAYOUT_TOP); child->scrollWindow->hide(); } } } // Then layout normally FXVerticalFrame::layout(); flags&=~FLAG_DIRTY; } // Set current subwindow void FXShutter::setCurrent(FXint panel){ if(0<=panel && current!=panel){ current=panel; recalc(); } } // Clean up FXShutter::~FXShutter() { getApp()->removeTimeout(this,ID_SHUTTER_TIMEOUT); } } fox1.6-1.6.57/src/FXSize.cpp000066400000000000000000000067111326741342000153050ustar00rootroot00000000000000/******************************************************************************** * * * S i z e C l a s s * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSize.cpp,v 1.12 2006/01/22 17:58:41 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxpriv.h" #include "FXHash.h" #include "FXStream.h" #include "FXSize.h" #include "FXPoint.h" using namespace FX; /*******************************************************************************/ namespace FX { // Grow by amount on all sides FXSize& FXSize::grow(FXshort margin){ w+=(margin+margin); h+=(margin+margin); return *this; } // Grow by different amounts horizontally and vertically FXSize& FXSize::grow(FXshort hormargin,FXshort vermargin){ w+=(hormargin+hormargin); h+=(vermargin+vermargin); return *this; } // Grow by different amounts on all sides FXSize& FXSize::grow(FXshort leftmargin,FXshort rightmargin,FXshort topmargin,FXshort bottommargin){ w+=(leftmargin+rightmargin); h+=(topmargin+bottommargin); return *this; } // Shrink by amount FXSize& FXSize::shrink(FXshort margin){ w-=(margin+margin); h-=(margin+margin); return *this; } // Shrink by different amounts horizontally and vertically FXSize& FXSize::shrink(FXshort hormargin,FXshort vermargin){ w-=(hormargin+hormargin); h-=(vermargin+vermargin); return *this; } // Shrink by different amounts on all sides FXSize& FXSize::shrink(FXshort leftmargin,FXshort rightmargin,FXshort topmargin,FXshort bottommargin){ w-=(leftmargin+rightmargin); h-=(topmargin+bottommargin); return *this; } // Save object to a stream FXStream& operator<<(FXStream& store,const FXSize& s){ store << s.w << s.h; return store; } // Load object from a stream FXStream& operator>>(FXStream& store,FXSize& s){ store >> s.w >> s.h; return store; } } fox1.6-1.6.57/src/FXSlider.cpp000066400000000000000000000706241326741342000156210ustar00rootroot00000000000000/******************************************************************************** * * * S l i d e r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSlider.cpp,v 1.65.2.2 2007/08/09 00:37:06 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXSlider.h" /* Notes: - Maybe add bindings for arrow keys for value changes. */ #define TICKSIZE 4 // Length of ticks #define OVERHANG 4 // Default amount of overhang #define MINOVERHANG 3 // Minimal amount of overhang #define HEADINSIDEBAR 20 // Default for inside bar head size #define HEADOVERHANGING 9 // Default for overhanging head size #define SLIDER_MASK (SLIDER_VERTICAL|SLIDER_ARROW_UP|SLIDER_ARROW_DOWN|SLIDER_INSIDE_BAR|SLIDER_TICKS_TOP|SLIDER_TICKS_BOTTOM) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXSlider) FXSliderMap[]={ FXMAPFUNC(SEL_PAINT,0,FXSlider::onPaint), FXMAPFUNC(SEL_MOTION,0,FXSlider::onMotion), FXMAPFUNC(SEL_MOUSEWHEEL,0,FXSlider::onMouseWheel), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXSlider::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXSlider::onLeftBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXSlider::onMiddleBtnPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXSlider::onMiddleBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXSlider::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXSlider::onKeyRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXSlider::onUngrabbed), FXMAPFUNC(SEL_QUERY_TIP,0,FXSlider::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXSlider::onQueryHelp), FXMAPFUNC(SEL_TIMEOUT,FXSlider::ID_AUTOSLIDE,FXSlider::onAutoSlide), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_SETVALUE,FXSlider::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_SETINTVALUE,FXSlider::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_SETREALVALUE,FXSlider::onCmdSetRealValue), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_GETINTVALUE,FXSlider::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_GETREALVALUE,FXSlider::onCmdGetRealValue), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_SETINTRANGE,FXSlider::onCmdSetIntRange), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_GETINTRANGE,FXSlider::onCmdGetIntRange), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_SETREALRANGE,FXSlider::onCmdSetRealRange), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_GETREALRANGE,FXSlider::onCmdGetRealRange), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_SETHELPSTRING,FXSlider::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_GETHELPSTRING,FXSlider::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_SETTIPSTRING,FXSlider::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXSlider::ID_GETTIPSTRING,FXSlider::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXSlider,FXFrame,FXSliderMap,ARRAYNUMBER(FXSliderMap)) // Make a slider FXSlider::FXSlider(){ flags|=FLAG_ENABLED; range[0]=0; range[1]=0; pos=0; incr=1; delta=0; headpos=0; headsize=0; slotsize=0; slotColor=0; dragpoint=0; } // Make a slider FXSlider::FXSlider(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb):FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ flags|=FLAG_ENABLED; baseColor=getApp()->getBaseColor(); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); borderColor=getApp()->getBorderColor(); slotColor=getApp()->getBackColor(); target=tgt; message=sel; range[0]=0; range[1]=100; pos=50; incr=1; delta=0; headpos=0; headsize=(options&SLIDER_INSIDE_BAR)?HEADINSIDEBAR:HEADOVERHANGING; slotsize=5; dragpoint=0; } // Enable the window void FXSlider::enable(){ if(!(flags&FLAG_ENABLED)){ FXFrame::enable(); update(); } } // Disable the window void FXSlider::disable(){ if(flags&FLAG_ENABLED){ FXFrame::disable(); update(); } } // Get default size FXint FXSlider::getDefaultWidth(){ FXint w; if(options&SLIDER_VERTICAL){ if(options&SLIDER_INSIDE_BAR) w=4+headsize/2; else if(options&(SLIDER_ARROW_LEFT|SLIDER_ARROW_RIGHT)) w=slotsize+MINOVERHANG*2+headsize/2; else w=slotsize+MINOVERHANG*2; if(options&SLIDER_TICKS_LEFT) w+=TICKSIZE; if(options&SLIDER_TICKS_RIGHT) w+=TICKSIZE; } else{ w=headsize+4; } return w+padleft+padright+(border<<1); } FXint FXSlider::getDefaultHeight(){ FXint h; if(options&SLIDER_VERTICAL){ h=headsize+4; } else{ if(options&SLIDER_INSIDE_BAR) h=4+headsize/2; else if(options&(SLIDER_ARROW_UP|SLIDER_ARROW_DOWN)) h=slotsize+2*MINOVERHANG+headsize/2; else h=slotsize+MINOVERHANG*2; if(options&SLIDER_TICKS_TOP) h+=TICKSIZE; if(options&SLIDER_TICKS_BOTTOM) h+=TICKSIZE; } return h+padtop+padbottom+(border<<1); } // Returns true because a slider can receive focus bool FXSlider::canFocus() const { return true; } // Layout changed; even though the position is still // the same, the head may have to be moved. void FXSlider::layout(){ setValue(pos); flags&=~FLAG_DIRTY; } // Set help using a message long FXSlider::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXSlider::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXSlider::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXSlider::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXSlider::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXSlider::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Update value from a message long FXSlider::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setValue((FXint)(FXival)ptr); return 1; } // Update value from a message long FXSlider::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setValue(*((FXint*)ptr)); return 1; } // Update value from a message long FXSlider::onCmdSetRealValue(FXObject*,FXSelector,void* ptr){ setValue((FXint)*((FXdouble*)ptr)); return 1; } // Obtain value from text field long FXSlider::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getValue(); return 1; } // Obtain value with a message long FXSlider::onCmdGetRealValue(FXObject*,FXSelector,void* ptr){ *((FXdouble*)ptr)=(FXdouble)getValue(); return 1; } // Update range from a message long FXSlider::onCmdSetIntRange(FXObject*,FXSelector,void* ptr){ setRange(((FXint*)ptr)[0],((FXint*)ptr)[1]); return 1; } // Get range with a message long FXSlider::onCmdGetIntRange(FXObject*,FXSelector,void* ptr){ ((FXint*)ptr)[0]=range[0]; ((FXint*)ptr)[1]=range[1]; return 1; } // Update range from a message long FXSlider::onCmdSetRealRange(FXObject*,FXSelector,void* ptr){ setRange((FXint)((FXdouble*)ptr)[0],(FXint)((FXdouble*)ptr)[1]); return 1; } // Get range with a message long FXSlider::onCmdGetRealRange(FXObject*,FXSelector,void* ptr){ ((FXdouble*)ptr)[0]=(FXdouble)range[0]; ((FXdouble*)ptr)[1]=(FXdouble)range[1]; return 1; } // Pressed LEFT button long FXSlider::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint p=pos; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); getApp()->removeTimeout(this,ID_AUTOSLIDE); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; if(options&SLIDER_VERTICAL){ if(event->win_yaddTimeout(this,ID_AUTOSLIDE,getApp()->getScrollDelay(),(void*)(FXival)incr); p=pos+incr; } else if(event->win_y>(headpos+headsize)){ getApp()->addTimeout(this,ID_AUTOSLIDE,getApp()->getScrollDelay(),(void*)(FXival)-incr); p=pos-incr; } else{ dragpoint=event->win_y-headpos; flags|=FLAG_PRESSED; } } else{ if(event->win_xaddTimeout(this,ID_AUTOSLIDE,getApp()->getScrollDelay(),(void*)(FXival)-incr); p=pos-incr; } else if(event->win_x>(headpos+headsize)){ getApp()->addTimeout(this,ID_AUTOSLIDE,getApp()->getScrollDelay(),(void*)(FXival)incr); p=pos+incr; } else{ dragpoint=event->win_x-headpos; flags|=FLAG_PRESSED; } } if(prange[1]) p=range[1]; if(p!=pos){ setValue(p); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } return 1; } return 0; } // Released Left button long FXSlider::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ register FXuint flgs=flags; if(isEnabled()){ ungrab(); getApp()->removeTimeout(this,ID_AUTOSLIDE); setValue(pos); // Hop to exact position flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(flgs&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } return 1; } return 0; } // Moving long FXSlider::onMotion(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint xx,yy,ww,hh,lo,hi,p,h,travel; if(!isEnabled()) return 0; if(flags&FLAG_PRESSED){ yy=border+padtop+2; xx=border+padleft+2; hh=height-(border<<1)-padtop-padbottom-4; ww=width-(border<<1)-padleft-padright-4; if(options&SLIDER_VERTICAL){ h=event->win_y-dragpoint; travel=hh-headsize; if(hyy+travel) h=yy+travel; if(h!=headpos){ FXMINMAX(lo,hi,headpos,h); headpos=h; update(border,lo-1,width-(border<<1),hi+headsize+2-lo); } if(travel>0) p=range[0]+((range[1]-range[0])*(yy+travel-h)+travel/2)/travel; // Use rounding!! else p=range[0]; } else{ h=event->win_x-dragpoint; travel=ww-headsize; if(hxx+travel) h=xx+travel; if(h!=headpos){ FXMINMAX(lo,hi,headpos,h); headpos=h; update(lo-1,border,hi+headsize+2-lo,height-(border<<1)); } if(travel>0) p=range[0]+((range[1]-range[0])*(h-xx)+travel/2)/travel; // Use rounding!! else p=range[0]; } if(prange[1]) p=range[1]; if(pos!=p){ pos=p; flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } return 1; } return 0; } // Pressed middle or right long FXSlider::onMiddleBtnPress(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint xx,yy,ww,hh,lo,hi,p,h,travel; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONPRESS,message),ptr)) return 1; dragpoint=headsize/2; yy=border+padtop+2; xx=border+padleft+2; hh=height-(border<<1)-padtop-padbottom-4; ww=width-(border<<1)-padleft-padright-4; flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; if(options&SLIDER_VERTICAL){ h=event->win_y-dragpoint; travel=hh-headsize; if(hyy+travel) h=yy+travel; if(h!=headpos){ FXMINMAX(lo,hi,headpos,h); headpos=h; update(border,lo-1,width-(border<<1),hi+headsize+2-lo); } if(travel>0) p=range[0]+((range[1]-range[0])*(yy+travel-h)+travel/2)/travel; // Use rounding!! else p=range[0]; } else{ h=event->win_x-dragpoint; travel=ww-headsize; if(hxx+travel) h=xx+travel; if(h!=headpos){ FXMINMAX(lo,hi,headpos,h); headpos=h; update(lo-1,border,hi+headsize+2-lo,height-(border<<1)); } if(travel>0) p=range[0]+((range[1]-range[0])*(h-xx)+travel/2)/travel; // Use rounding!! else p=range[0]; } if(prange[1]) p=range[1]; if(p!=pos){ pos=p; flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } return 1; } return 0; } // Released middle button long FXSlider::onMiddleBtnRelease(FXObject*,FXSelector,void* ptr){ register FXuint flgs=flags; if(isEnabled()){ ungrab(); getApp()->removeTimeout(this,ID_AUTOSLIDE); flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; setValue(pos); // Hop to exact position if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONRELEASE,message),ptr)) return 1; if(flgs&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } return 1; } return 0; } // Mouse wheel long FXSlider::onMouseWheel(FXObject*,FXSelector,void* ptr){ register FXEvent *event=(FXEvent*)ptr; register FXint p=pos+(event->code*incr)/120; if(prange[1]) p=range[1]; if(pos!=p){ setValue(p); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); } return 1; } // Keyboard press long FXSlider::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; switch(event->code){ case KEY_Left: case KEY_KP_Left: if(!(options&SLIDER_VERTICAL)) goto dec; break; case KEY_Right: case KEY_KP_Right: if(!(options&SLIDER_VERTICAL)) goto inc; break; case KEY_Up: case KEY_KP_Up: if(options&SLIDER_VERTICAL) goto inc; break; case KEY_Down: case KEY_KP_Down: if(options&SLIDER_VERTICAL) goto dec; break; case KEY_plus: case KEY_KP_Add: inc: setValue(pos+incr,true); return 1; case KEY_minus: case KEY_KP_Subtract: dec: setValue(pos-incr,true); return 1; } } return 0; } // Keyboard release long FXSlider::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Left: case KEY_KP_Left: case KEY_Right: case KEY_KP_Right: if(!(options&SLIDER_VERTICAL)) return 1; break; case KEY_Up: case KEY_KP_Up: case KEY_Down: case KEY_KP_Down: if(options&SLIDER_VERTICAL) return 1; break; case KEY_plus: case KEY_KP_Add: case KEY_KP_Subtract: case KEY_minus: return 1; } } return 0; } // The widget lost the grab for some reason long FXSlider::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onUngrabbed(sender,sel,ptr); getApp()->removeTimeout(this,ID_AUTOSLIDE); flags&=~FLAG_PRESSED; flags&=~FLAG_CHANGED; flags|=FLAG_UPDATE; return 1; } // Automatically move slider while holding down mouse long FXSlider::onAutoSlide(FXObject*,FXSelector,void* ptr){ register FXint inc=(FXint)(FXival)ptr; register FXint p=pos+inc; if(p<=range[0]){ p=range[0]; } else if(p>=range[1]){ p=range[1]; } else{ getApp()->addTimeout(this,ID_AUTOSLIDE,getApp()->getScrollSpeed(),(void*)(FXival)inc); } if(p!=pos){ setValue(p); flags|=FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); return 1; } return 0; } // Draw horizontal ticks void FXSlider::drawHorzTicks(FXDCWindow& dc,FXint,FXint y,FXint,FXint){ register FXint interval=range[1]-range[0]; register FXint travel,offset,v,d,p; if(0>1); if(options&SLIDER_ARROW_LEFT){ dc.setForeground(hiliteColor); dc.drawLine(x+m,y,x+w-1,y); dc.drawLine(x,y+m,x+m,y); dc.setForeground(shadowColor); dc.drawLine(x+1,y+h-m-1,x+m+1,y+h-1); dc.drawLine(x+m,y+h-2,x+w-1,y+h-2); dc.drawLine(x+w-2,y+1,x+w-2,y+h-1); dc.setForeground(borderColor); dc.drawLine(x,y+h-m-1,x+m,y+h-1); dc.drawLine(x+w-1,y+h-1,x+w-1,y); dc.fillRectangle(x+m,y+h-1,w-m,1); } else if(options&SLIDER_ARROW_RIGHT){ dc.setForeground(hiliteColor); dc.drawLine(x,y,x+w-m-1,y); dc.drawLine(x,y+1,x,y+h-1); dc.drawLine(x+w-1,y+m,x+w-m-1,y); #ifndef WIN32 dc.setForeground(shadowColor); dc.drawLine(x+w-2,y+h-m-1,x+w-m-2,y+h-1); dc.drawLine(x+1,y+h-2,x+w-m-1,y+h-2); dc.setForeground(borderColor); dc.drawLine(x+w-1,y+h-m-1,x+w-m-1,y+h-1); dc.drawLine(x,y+h-1,x+w-m-1,y+h-1); #else dc.setForeground(shadowColor); dc.drawLine(x+w-1,y+h-m-2,x+w-m-2,y+h-1); dc.drawLine(x+1,y+h-2,x+w-m-1,y+h-2); dc.setForeground(borderColor); dc.drawLine(x+w,y+h-m-2,x+w-m-1,y+h-1); dc.drawLine(x,y+h-1,x+w-m-1,y+h-1); #endif } else if(options&SLIDER_INSIDE_BAR){ drawDoubleRaisedRectangle(dc,x,y,w,h); dc.setForeground(shadowColor); dc.drawLine(x+1,y+m-1,x+w-2,y+m-1); dc.setForeground(hiliteColor); dc.drawLine(x+1,y+m,x+w-2,y+m); } else{ drawDoubleRaisedRectangle(dc,x,y,w,h); } } else{ m=(w>>1); if(options&SLIDER_ARROW_UP){ dc.setForeground(hiliteColor); dc.drawLine(x,y+m,x+m,y); dc.drawLine(x,y+m,x,y+h-1); dc.setForeground(shadowColor); dc.drawLine(x+w-1,y+m+1,x+w-m-1,y+1); dc.drawLine(x+w-2,y+m+1,x+w-2,y+h-1); dc.drawLine(x+1,y+h-2,x+w-2,y+h-2); dc.setForeground(borderColor); dc.drawLine(x+w-1,y+m,x+w-m-1,y); dc.drawLine(x+w-1,y+m,x+w-1,y+h-1); dc.fillRectangle(x,y+h-1,w,1); } else if(options&SLIDER_ARROW_DOWN){ dc.setForeground(hiliteColor); dc.drawLine(x,y,x+w-1,y); dc.drawLine(x,y+1,x,y+h-m-1); dc.drawLine(x,y+h-m-1,x+m,y+h-1); dc.setForeground(shadowColor); dc.drawLine(x+w-2,y+1,x+w-2,y+h-m-1); dc.drawLine(x+w-1,y+h-m-2,x+w-m-1,y+h-2); dc.setForeground(borderColor); dc.drawLine(x+w-1,y+h-m-1,x+w-m-1,y+h-1); dc.fillRectangle(x+w-1,y,1,h-m); } else if(options&SLIDER_INSIDE_BAR){ drawDoubleRaisedRectangle(dc,x,y,w,h); dc.setForeground(shadowColor); dc.drawLine(x+m-1,y+1,x+m-1,y+h-2); dc.setForeground(hiliteColor); dc.drawLine(x+m,y+1,x+m,y+h-1); } else{ drawDoubleRaisedRectangle(dc,x,y,w,h); } } } // Handle repaint long FXSlider::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXint tx,ty,hhs=headsize/2; FXint xx,yy,ww,hh; FXDCWindow dc(this,event); // Repaint background dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); // Repaint border drawFrame(dc,0,0,width,height); // Slot placement xx=border+padleft; yy=border+padtop; ww=width-(border<<1)-padleft-padright; hh=height-(border<<1)-padtop-padbottom; FXASSERT(range[0]<=pos && pos<=range[1]); // Draw the slot if(options&SLIDER_VERTICAL){ // Adjust slot placement for tickmarks if(options&SLIDER_TICKS_LEFT){ xx+=TICKSIZE; ww-=TICKSIZE; } if(options&SLIDER_TICKS_RIGHT){ ww-=TICKSIZE; } // Draw slider if(options&SLIDER_INSIDE_BAR){ drawDoubleSunkenRectangle(dc,xx,yy,ww,hh); dc.setStipple(STIPPLE_GRAY); dc.setForeground(slotColor); dc.setBackground(baseColor); dc.setFillStyle(FILL_OPAQUESTIPPLED); dc.fillRectangle(xx+2,yy+2,ww-4,hh-4); dc.setFillStyle(FILL_SOLID); if(options&SLIDER_TICKS_LEFT) drawVertTicks(dc,border+padleft,yy,ww,hh); if(options&SLIDER_TICKS_RIGHT) drawVertTicks(dc,width-padright-border-TICKSIZE,yy,ww,hh); if(isEnabled()) drawSliderHead(dc,xx+2,headpos,ww-4,headsize); } else{ if(options&SLIDER_ARROW_LEFT) tx=xx+hhs+(ww-slotsize-hhs)/2; else if(options&SLIDER_ARROW_RIGHT) tx=xx+(ww-slotsize-hhs)/2; else tx=xx+(ww-slotsize)/2; drawDoubleSunkenRectangle(dc,tx,yy,slotsize,hh); dc.setForeground(slotColor); dc.fillRectangle(tx+2,yy+2,slotsize-4,hh-4); if(options&SLIDER_TICKS_LEFT) drawVertTicks(dc,border+padleft,yy,ww,hh); if(options&SLIDER_TICKS_RIGHT) drawVertTicks(dc,width-padright-border-TICKSIZE,yy,ww,hh); if(isEnabled()) drawSliderHead(dc,xx,headpos,ww,headsize); } } else{ // Adjust slot placement for tickmarks if(options&SLIDER_TICKS_TOP){ yy+=TICKSIZE; hh-=TICKSIZE; } if(options&SLIDER_TICKS_BOTTOM){ hh-=TICKSIZE; } // Draw slider if(options&SLIDER_INSIDE_BAR){ drawDoubleSunkenRectangle(dc,xx,yy,ww,hh); dc.setForeground(slotColor); dc.setStipple(STIPPLE_GRAY); dc.setForeground(slotColor); dc.setBackground(baseColor); dc.setFillStyle(FILL_OPAQUESTIPPLED); dc.fillRectangle(xx+2,yy+2,ww-4,hh-4); dc.setFillStyle(FILL_SOLID); if(options&SLIDER_TICKS_TOP) drawHorzTicks(dc,xx,border+padtop,ww,hh); if(options&SLIDER_TICKS_BOTTOM) drawHorzTicks(dc,xx,height-border-padbottom-TICKSIZE,ww,hh); if(isEnabled()) drawSliderHead(dc,headpos,yy+2,headsize,hh-4); } else{ if(options&SLIDER_ARROW_UP) ty=yy+hhs+(hh-slotsize-hhs)/2; else if(options&SLIDER_ARROW_DOWN) ty=yy+(hh-slotsize-hhs)/2; else ty=yy+(hh-slotsize)/2; drawDoubleSunkenRectangle(dc,xx,ty,ww,slotsize); dc.setForeground(slotColor); dc.fillRectangle(xx+2,ty+2,ww-4,slotsize-4); if(options&SLIDER_TICKS_TOP) drawHorzTicks(dc,xx,border+padtop,ww,hh); if(options&SLIDER_TICKS_BOTTOM) drawHorzTicks(dc,xx,height-border-padbottom-TICKSIZE,ww,hh); if(isEnabled()) drawSliderHead(dc,headpos,yy,headsize,hh); } } return 1; } // Set slider range; this also revalidates the position, // and possibly moves the head [even if the position was still OK, // the head might still have to be moved to the exact position]. void FXSlider::setRange(FXint lo,FXint hi,FXbool notify){ if(lo>hi){ fxerror("%s::setRange: trying to set negative range.\n",getClassName()); } if(range[0]!=lo || range[1]!=hi){ range[0]=lo; range[1]=hi; setValue(pos,notify); } } // Set position; this should always cause the head to reflect // the exact [discrete] value representing pos, even if several // head positions may represent the same position! // Also, the minimal amount is repainted, as one sometimes as very // large/wide sliders. void FXSlider::setValue(FXint p,FXbool notify){ register FXint interval=range[1]-range[0]; register FXint travel,lo,hi,h; if(prange[1]) p=range[1]; if(options&SLIDER_VERTICAL){ travel=height-(border<<1)-padtop-padbottom-headsize-4; h=height-border-padbottom-2-headsize; if(0tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos);} } } // Get slider options FXuint FXSlider::getSliderStyle() const { return (options&SLIDER_MASK); } // Set slider options void FXSlider::setSliderStyle(FXuint style){ register FXuint opts=(options&~SLIDER_MASK) | (style&SLIDER_MASK); if(options!=opts){ headsize=(opts&SLIDER_INSIDE_BAR)?HEADINSIDEBAR:HEADOVERHANGING; options=opts; recalc(); update(); } } // Set head size void FXSlider::setHeadSize(FXint hs){ if(headsize!=hs){ headsize=hs; recalc(); update(); } } // Set slot size void FXSlider::setSlotSize(FXint bs){ if(slotsize!=bs){ slotsize=bs; recalc(); update(); } } // Set increment void FXSlider::setIncrement(FXint inc){ incr=inc; } // Set slot color void FXSlider::setSlotColor(FXColor clr){ if(slotColor!=clr){ slotColor=clr; update(); } } // Change the delta between ticks void FXSlider::setTickDelta(FXint dist){ if(dist<0) dist=0; if(delta!=dist){ delta=dist; if(options&(SLIDER_TICKS_TOP|SLIDER_TICKS_BOTTOM)){ recalc(); } } } // Save object to stream void FXSlider::save(FXStream& store) const { FXFrame::save(store); store << range[0] << range[1]; store << pos; store << incr; store << delta; store << slotColor; store << headsize; store << slotsize; store << help; store << tip; } // Load object from stream void FXSlider::load(FXStream& store){ FXFrame::load(store); store >> range[0] >> range[1]; store >> pos; store >> incr; store >> delta; store >> slotColor; store >> headsize; store >> slotsize; store >> help; store >> tip; } // Delete FXSlider::~FXSlider(){ getApp()->removeTimeout(this,ID_AUTOSLIDE); } } fox1.6-1.6.57/src/FXSocket.cpp000066400000000000000000000071051326741342000156210ustar00rootroot00000000000000/******************************************************************************** * * * S o c k e t C l a s s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSocket.cpp,v 1.6.2.1 2006/11/07 15:58:53 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXPath.h" #include "FXIO.h" #include "FXSocket.h" /* Notes: - Obviously this will get fleshed out some more... */ #ifdef WIN32 #define BadHandle INVALID_HANDLE_VALUE #else #define BadHandle -1 #endif using namespace FX; /*******************************************************************************/ namespace FX { // Construct file and attach existing handle h FXSocket::FXSocket(FXInputHandle handle,FXuint mode){ FXIO::open(handle,mode); } // Open device with access mode and handle bool FXSocket::open(FXInputHandle handle,FXuint mode){ return FXIO::open(handle,mode); } // Read block FXival FXSocket::readBlock(void* data,FXival count){ FXival nread=-1; if(isOpen()){ #ifdef WIN32 DWORD nr; if(::ReadFile(device,data,(DWORD)count,&nr,NULL)!=0){ nread=(FXival)nr; } #else do{ nread=::read(device,data,count); } while(nread<0 && errno==EINTR); #endif } return nread; } // Write block FXival FXSocket::writeBlock(const void* data,FXival count){ FXival nwritten=-1; if(isOpen()){ #ifdef WIN32 DWORD nw; if(::WriteFile(device,data,(DWORD)count,&nw,NULL)!=0){ nwritten=(FXival)nw; } #else do{ nwritten=::write(device,data,count); } while(nwritten<0 && errno==EINTR); #endif } return nwritten; } // Close socket bool FXSocket::close(){ if(isOpen()){ FXInputHandle dev=device; device=BadHandle; #ifdef WIN32 return ::CloseHandle(dev)!=0; #else return ::close(dev)==0; #endif } return false; } // Destroy FXSocket::~FXSocket(){ close(); } } fox1.6-1.6.57/src/FXSphered.cpp000066400000000000000000000227371326741342000157730ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n S p h e r e C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSphered.cpp,v 1.19.2.2 2006/04/05 15:21:08 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXVec2d.h" #include "FXVec3d.h" #include "FXVec4d.h" #include "FXSphered.h" #include "FXRanged.h" /* Notes: - Negative radius represents empty bounding sphere. */ using namespace FX; /************************** S p h e r e C l a s s *************************/ namespace FX { inline FXdouble sqr(FXdouble x){ return x*x; } // Initialize from bounding box FXSphered::FXSphered(const FXRanged& bounds):center(bounds.center()),radius(bounds.diameter()*0.5){ } // Test if sphere contains point x,y,z bool FXSphered::contains(FXdouble x,FXdouble y,FXdouble z) const { return 0.0<=radius && sqr(center.x-x)+sqr(center.y-y)+sqr(center.z-z)<=sqr(radius); } // Test if sphere contains point p bool FXSphered::contains(const FXVec3d& p) const { return contains(p.x,p.y,p.z); } // Test if sphere contains another box bool FXSphered::contains(const FXRanged& box) const { if(box.lower.x<=box.upper.x && box.lower.y<=box.upper.y && box.lower.z<=box.upper.z){ return contains(box.corner(0)) && contains(box.corner(1)) && contains(box.corner(2)) && contains(box.corner(3)) && contains(box.corner(4)) && contains(box.corner(5)) && contains(box.corner(6)) && contains(box.corner(7)); } return FALSE; } // Test if sphere properly contains another sphere bool FXSphered::contains(const FXSphered& sphere) const { if(0.0<=sphere.radius && sphere.radius<=radius){ register FXdouble dx=center.x-sphere.center.x; register FXdouble dy=center.y-sphere.center.y; register FXdouble dz=center.z-sphere.center.z; return sphere.radius+sqrt(dx*dx+dy*dy+dz*dz)<=radius; } return FALSE; } // Include point FXSphered& FXSphered::include(FXdouble x,FXdouble y,FXdouble z){ register FXdouble dx,dy,dz,dist,delta,newradius; if(0.0<=radius){ dx=x-center.x; dy=y-center.y; dz=z-center.z; dist=sqrt(dx*dx+dy*dy+dz*dz); if(radius=radius) return 1; // Upper point on negative side of plane if(dist<=-radius) return -1; // Overlap return 0; } // Intersect sphere with ray u-v bool FXSphered::intersect(const FXVec3d& u,const FXVec3d& v) const { if(0.0<=radius){ FXdouble rr=radius*radius; FXVec3d uc=center-u; // Vector from u to center FXdouble dd=uc.length2(); if(dd>rr){ // Ray start point outside sphere FXVec3d uv=v-u; // Vector from u to v FXdouble hh=uc*uv; // If hh<0, uv points away from center if(0.0<=hh){ // Not away from sphere FXdouble kk=uv.length2(); FXdouble disc=hh*hh-kk*(dd-rr); // FIXME this needs to be checked again! if(disc<=0.0) return FALSE; return TRUE; } return FALSE; } return TRUE; } return FALSE; } // Test if sphere overlaps with box bool overlap(const FXSphered& a,const FXRanged& b){ if(0.0<=a.radius){ register FXdouble dd=0.0; if(a.center.xb.upper.x) dd+=sqr(a.center.x-b.upper.x); if(a.center.yb.upper.y) dd+=sqr(a.center.y-b.upper.y); if(a.center.zb.upper.z) dd+=sqr(a.center.z-b.upper.z); return dd<=a.radius*a.radius; } return FALSE; } // Test if box overlaps with sphere; algorithm due to Arvo (GEMS I) bool overlap(const FXRanged& a,const FXSphered& b){ return overlap(b,a); } // Test if spheres overlap bool overlap(const FXSphered& a,const FXSphered& b){ if(0.0<=a.radius && 0.0<=b.radius){ register FXdouble dx=a.center.x-b.center.x; register FXdouble dy=a.center.y-b.center.y; register FXdouble dz=a.center.z-b.center.z; return (dx*dx+dy*dy+dz*dz)>(FXStream& store,FXSphered& sphere){ store >> sphere.center >> sphere.radius; return store; } } fox1.6-1.6.57/src/FXSpheref.cpp000066400000000000000000000230121326741342000157600ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n S p h e r e C l a s s * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSpheref.cpp,v 1.20.2.2 2006/04/05 15:21:08 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXSpheref.h" #include "FXRangef.h" /* Notes: - Negative radius represents empty bounding sphere. */ using namespace FX; /************************** S p h e r e C l a s s *************************/ namespace FX { inline FXfloat sqrf(FXfloat x){ return x*x; } // Initialize from bounding box FXSpheref::FXSpheref(const FXRangef& bounds):center(bounds.center()),radius(bounds.diameter()*0.5f){ } // Test if sphere contains point x,y,z bool FXSpheref::contains(FXfloat x,FXfloat y,FXfloat z) const { return 0.0f<=radius && sqrf(center.x-x)+sqrf(center.y-y)+sqrf(center.z-z)<=sqrf(radius); } // Test if sphere contains point p bool FXSpheref::contains(const FXVec3f& p) const { return contains(p.x,p.y,p.z); } // Test if sphere contains another box bool FXSpheref::contains(const FXRangef& box) const { if(box.lower.x<=box.upper.x && box.lower.y<=box.upper.y && box.lower.z<=box.upper.z){ return contains(box.corner(0)) && contains(box.corner(1)) && contains(box.corner(2)) && contains(box.corner(3)) && contains(box.corner(4)) && contains(box.corner(5)) && contains(box.corner(6)) && contains(box.corner(7)); } return FALSE; } // Test if sphere properly contains another sphere bool FXSpheref::contains(const FXSpheref& sphere) const { if(0.0f<=sphere.radius && sphere.radius<=radius){ register FXfloat dx=center.x-sphere.center.x; register FXfloat dy=center.y-sphere.center.y; register FXfloat dz=center.z-sphere.center.z; return sphere.radius+sqrtf(dx*dx+dy*dy+dz*dz)<=radius; } return FALSE; } // Include point FXSpheref& FXSpheref::include(FXfloat x,FXfloat y,FXfloat z){ register FXfloat dx,dy,dz,dist,delta,newradius; if(0.0f<=radius){ dx=x-center.x; dy=y-center.y; dz=z-center.z; dist=sqrtf(dx*dx+dy*dy+dz*dz); if(radius=radius) return 1; // Upper point on negative side of plane if(dist<=-radius) return -1; // Overlap return 0; } // Intersect sphere with ray u-v bool FXSpheref::intersect(const FXVec3f& u,const FXVec3f& v) const { if(0.0f<=radius){ FXfloat rr=radius*radius; FXVec3f uc=center-u; // Vector from u to center FXfloat dd=uc.length2(); if(dd>rr){ // Ray start point outside sphere FXVec3f uv=v-u; // Vector from u to v FXfloat hh=uc*uv; // If hh<0, uv points away from center if(0.0f<=hh){ // Not away from sphere FXfloat kk=uv.length2(); FXfloat disc=hh*hh-kk*(dd-rr); // FIXME this needs to be checked again! if(disc<=0.0) return FALSE; return TRUE; } return FALSE; } return TRUE; } return FALSE; } // Test if box overlaps with sphere; algorithm due to Arvo (GEMS I) bool overlap(const FXSpheref& a,const FXRangef& b){ if(0.0f<=a.radius){ register FXfloat dd=0.0f; if(a.center.xb.upper.x) dd+=sqrf(a.center.x-b.upper.x); if(a.center.yb.upper.y) dd+=sqrf(a.center.y-b.upper.y); if(a.center.zb.upper.z) dd+=sqrf(a.center.z-b.upper.z); return dd<=a.radius*a.radius; } return FALSE; } // Test if box overlaps with sphere; algorithm due to Arvo (GEMS I) bool overlap(const FXRangef& a,const FXSpheref& b){ return overlap(b,a); } // Test if spheres overlap bool overlap(const FXSpheref& a,const FXSpheref& b){ if(0.0f<=a.radius && 0.0f<=b.radius){ register FXfloat dx=a.center.x-b.center.x; register FXfloat dy=a.center.y-b.center.y; register FXfloat dz=a.center.z-b.center.z; return (dx*dx+dy*dy+dz*dz)>(FXStream& store,FXSpheref& sphere){ store >> sphere.center >> sphere.radius; return store; } } fox1.6-1.6.57/src/FXSpinner.cpp000066400000000000000000000405451326741342000160140ustar00rootroot00000000000000/******************************************************************************** * * * S p i n B u t t o n * * * ********************************************************************************* * Copyright (C) 1998,2006 by Lyle Johnson. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSpinner.cpp,v 1.63 2006/02/07 01:17:26 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXLabel.h" #include "FXTextField.h" #include "FXArrowButton.h" #include "FXSpinner.h" /* To do: - Should this also be derived from FXTextField instead? - Sends SEL_COMMAND; should it send SEL_CHANGED for each repeat, then SEL_COMMAND at end? - Should block SEL_UPDATE until after sending SEL_COMMAND. - Make the value->text and text->value virtual. */ #define BUTTONWIDTH 14 #define INTMAX 2147483647 #define INTMIN (-INTMAX-1) #define SPINNER_MASK (SPIN_CYCLIC|SPIN_NOTEXT|SPIN_NOMAX|SPIN_NOMIN) using namespace FX; /*******************************************************************************/ namespace FX { // Message map FXDEFMAP(FXSpinner) FXSpinnerMap[]={ FXMAPFUNC(SEL_KEYPRESS,0,FXSpinner::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXSpinner::onKeyRelease), FXMAPFUNC(SEL_FOCUS_SELF,0,FXSpinner::onFocusSelf), FXMAPFUNC(SEL_COMMAND,FXSpinner::ID_ENTRY,FXSpinner::onCmdEntry), FXMAPFUNC(SEL_CHANGED,FXSpinner::ID_ENTRY,FXSpinner::onChgEntry), FXMAPFUNC(SEL_MOUSEWHEEL,FXSpinner::ID_ENTRY,FXSpinner::onWheelEntry), FXMAPFUNC(SEL_UPDATE,FXSpinner::ID_INCREMENT,FXSpinner::onUpdIncrement), FXMAPFUNC(SEL_COMMAND,FXSpinner::ID_INCREMENT,FXSpinner::onCmdIncrement), FXMAPFUNC(SEL_UPDATE,FXSpinner::ID_DECREMENT,FXSpinner::onUpdDecrement), FXMAPFUNC(SEL_COMMAND,FXSpinner::ID_DECREMENT,FXSpinner::onCmdDecrement), FXMAPFUNC(SEL_COMMAND,FXSpinner::ID_SETVALUE,FXSpinner::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXSpinner::ID_SETINTVALUE,FXSpinner::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXSpinner::ID_GETINTVALUE,FXSpinner::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXSpinner::ID_SETINTRANGE,FXSpinner::onCmdSetIntRange), FXMAPFUNC(SEL_COMMAND,FXSpinner::ID_GETINTRANGE,FXSpinner::onCmdGetIntRange), }; // Object implementation FXIMPLEMENT(FXSpinner,FXPacker,FXSpinnerMap,ARRAYNUMBER(FXSpinnerMap)) // Construct spinner out of two buttons and a text field FXSpinner::FXSpinner(){ flags|=FLAG_ENABLED; textField=(FXTextField*)-1L; upButton=(FXArrowButton*)-1L; downButton=(FXArrowButton*)-1L; range[0]=INTMIN; range[1]=INTMAX; incr=1; pos=0; } // Construct spinner out of two buttons and a text field FXSpinner::FXSpinner(FXComposite *p,FXint cols,FXObject *tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXPacker(p,opts,x,y,w,h,0,0,0,0,0,0){ flags|=FLAG_ENABLED; target=tgt; message=sel; textField=new FXTextField(this,cols,this,ID_ENTRY,TEXTFIELD_INTEGER|JUSTIFY_RIGHT,0,0,0,0,pl,pr,pt,pb); upButton=new FXArrowButton(this,this,FXSpinner::ID_INCREMENT,FRAME_RAISED|FRAME_THICK|ARROW_UP|ARROW_REPEAT, 0,0,0,0, 0,0,0,0); downButton=new FXArrowButton(this,this,FXSpinner::ID_DECREMENT,FRAME_RAISED|FRAME_THICK|ARROW_DOWN|ARROW_REPEAT, 0,0,0,0, 0,0,0,0); range[0]=(options&SPIN_NOMIN) ? INTMIN : 0; range[1]=(options&SPIN_NOMAX) ? INTMAX : 100; textField->setText("0"); incr=1; pos=0; } // Get default width FXint FXSpinner::getDefaultWidth(){ FXint tw=0; if(!(options&SPIN_NOTEXT)) tw=textField->getDefaultWidth(); return tw+BUTTONWIDTH+(border<<1); } // Get default height FXint FXSpinner::getDefaultHeight(){ return textField->getDefaultHeight()+(border<<1); } // Enable the widget void FXSpinner::enable(){ if(!(flags&FLAG_ENABLED)){ FXPacker::enable(); textField->enable(); upButton->enable(); downButton->enable(); } } // Disable the widget void FXSpinner::disable(){ if(flags&FLAG_ENABLED){ FXPacker::disable(); textField->disable(); upButton->disable(); downButton->disable(); } } // Recompute layout void FXSpinner::layout(){ FXint buttonWidth,buttonHeight,textWidth,textHeight; textHeight=height-2*border; buttonHeight=textHeight>>1; // Only the buttons:- place buttons to take up the whole space! if(options&SPIN_NOTEXT){ buttonWidth=width-2*border; upButton->position(border,border,buttonWidth,buttonHeight); downButton->position(border,height-buttonHeight-border,buttonWidth,buttonHeight); } // Buttons plus the text; buttons are default width, text stretches to fill the rest else{ buttonWidth=BUTTONWIDTH; textWidth=width-buttonWidth-2*border; textField->position(border,border,textWidth,textHeight); upButton->position(border+textWidth,border,buttonWidth,buttonHeight); downButton->position(border+textWidth,height-buttonHeight-border,buttonWidth,buttonHeight); } flags&=~FLAG_DIRTY; } // Respond to increment message long FXSpinner::onUpdIncrement(FXObject* sender,FXSelector,void*){ if(isEnabled() && ((options&SPIN_CYCLIC) || (poshandle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Respond to increment message long FXSpinner::onCmdIncrement(FXObject*,FXSelector,void*){ if(isEnabled() && isEditable()){ increment(TRUE); return 1; } return 0; } // Disable decrement if at low end already long FXSpinner::onUpdDecrement(FXObject* sender,FXSelector,void*){ if(isEnabled() && ((options&SPIN_CYCLIC) || (range[0]handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Respond to decrement message long FXSpinner::onCmdDecrement(FXObject*,FXSelector,void*){ if(isEnabled() && isEditable()){ decrement(TRUE); return 1; } return 0; } // Rolling mouse wheel in text field works as if hitting up or down buttons long FXSpinner::onWheelEntry(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && isEditable()){ if(event->code>0){ if(event->state&CONTROLMASK) incrementByAmount(incr*10,TRUE); else increment(TRUE); } else{ if(event->state&CONTROLMASK) decrementByAmount(incr*10,TRUE); else decrement(TRUE); } return 1; } return 0; } // Text field changed long FXSpinner::onChgEntry(FXObject*,FXSelector,void*){ register FXint value=FXIntVal(textField->getText()); if(valuerange[1]) value=range[1]; if(value!=pos){ pos=value; if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)pos); } return 1; } // Text field command long FXSpinner::onCmdEntry(FXObject*,FXSelector,void*){ textField->setText(FXStringVal(pos)); // Put back adjusted value if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos); return 1; } // Keyboard press long FXSpinner::onKeyPress(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; switch(event->code){ case KEY_Up: case KEY_KP_Up: if(isEditable()){ increment(TRUE); } else{ getApp()->beep(); } return 1; case KEY_Down: case KEY_KP_Down: if(isEditable()){ decrement(TRUE); } else{ getApp()->beep(); } return 1; default: return textField->handle(sender,sel,ptr); } } return 0; } // Keyboard release long FXSpinner::onKeyRelease(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Up: case KEY_KP_Up: case KEY_Down: case KEY_KP_Down: return 1; default: return textField->handle(sender,sel,ptr); } } return 0; } // Force focus on the text field long FXSpinner::onFocusSelf(FXObject* sender,FXSelector,void* ptr){ return textField->handle(sender,FXSEL(SEL_FOCUS_SELF,0),ptr); } // Update value from a message long FXSpinner::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setValue((FXint)(FXival)ptr); return 1; } // Update value from a message long FXSpinner::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setValue(*((FXint*)ptr)); return 1; } // Obtain value from spinner long FXSpinner::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getValue(); return 1; } // Update range from a message long FXSpinner::onCmdSetIntRange(FXObject*,FXSelector,void* ptr){ setRange(((FXint*)ptr)[0],((FXint*)ptr)[1]); return 1; } // Get range with a message long FXSpinner::onCmdGetIntRange(FXObject*,FXSelector,void* ptr){ getRange(((FXint*)ptr)[0],((FXint*)ptr)[1]); return 1; } // Increment spinner void FXSpinner::increment(FXbool notify){ incrementByAmount(incr,notify); } // Increment spinner by certain amount void FXSpinner::incrementByAmount(FXint amount,FXbool notify){ if(range[0]hi){ fxerror("%s::setRange: trying to set negative range.\n",getClassName()); } if(range[0]!=lo || range[1]!=hi){ range[0]=lo; range[1]=hi; setValue(pos,notify); } } // Set new value void FXSpinner::setValue(FXint value,FXbool notify){ if(valuerange[1]) value=range[1]; if(pos!=value){ textField->setText(FXStringVal(value)); pos=value; if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)pos);} } } // Change value increment void FXSpinner::setIncrement(FXint inc){ if(inc<=0){ fxerror("%s::setIncrement: negative or zero increment specified.\n",getClassName()); } incr=inc; } // True if text supposed to be visible FXbool FXSpinner::isTextVisible() const { return textField->shown(); } // Change text visibility void FXSpinner::setTextVisible(FXbool shown){ FXuint opts=shown?(options&~SPIN_NOTEXT):(options|SPIN_NOTEXT); if(options!=opts){ options=opts; recalc(); } } // Set the font used in the text field| void FXSpinner::setFont(FXFont *fnt) { textField->setFont(fnt); } // Return the font used in the text field FXFont *FXSpinner::getFont() const { return textField->getFont(); } // Set help text void FXSpinner::setHelpText(const FXString& text){ textField->setHelpText(text); upButton->setHelpText(text); downButton->setHelpText(text); } // Get help text const FXString& FXSpinner::getHelpText() const { return textField->getHelpText(); } // Set tip text void FXSpinner::setTipText(const FXString& text){ textField->setTipText(text); upButton->setTipText(text); downButton->setTipText(text); } // Get tip text const FXString& FXSpinner::getTipText() const { return textField->getTipText(); } // Change spinner style void FXSpinner::setSpinnerStyle(FXuint style){ FXuint opts=(options&~SPINNER_MASK) | (style&SPINNER_MASK); if(options!=opts){ if(opts&SPIN_NOMIN) range[0]=INTMIN; if(opts&SPIN_NOMAX) range[1]=INTMAX; options=opts; recalc(); } } // Get spinner style FXuint FXSpinner::getSpinnerStyle() const { return (options&SPINNER_MASK); } // Allow editing of the text field void FXSpinner::setEditable(FXbool edit){ textField->setEditable(edit); } // Return TRUE if text field is editable FXbool FXSpinner::isEditable() const { return textField->isEditable(); } // Change color of the up arrow void FXSpinner::setUpArrowColor(FXColor clr){ upButton->setArrowColor(clr); } // Return color of the up arrow FXColor FXSpinner::getUpArrowColor() const { return upButton->getArrowColor(); } // Change color of the down arrow void FXSpinner::setDownArrowColor(FXColor clr){ downButton->setArrowColor(clr); } // Return color of the the down arrow FXColor FXSpinner::getDownArrowColor() const { return downButton->getArrowColor(); } // Change text color void FXSpinner::setTextColor(FXColor clr){ textField->setTextColor(clr); } // Return text color FXColor FXSpinner::getTextColor() const { return textField->getTextColor(); } // Change selected background color void FXSpinner::setSelBackColor(FXColor clr){ textField->setSelBackColor(clr); } // Return selected background color FXColor FXSpinner::getSelBackColor() const { return textField->getSelBackColor(); } // Change selected text color void FXSpinner::setSelTextColor(FXColor clr){ textField->setSelTextColor(clr); } // Return selected text color FXColor FXSpinner::getSelTextColor() const { return textField->getSelTextColor(); } // Changes the cursor color void FXSpinner::setCursorColor(FXColor clr){ textField->setCursorColor(clr); } // Return the cursor color FXColor FXSpinner::getCursorColor() const { return textField->getCursorColor(); } // Change number of columns void FXSpinner::setNumColumns(FXint ncols){ textField->setNumColumns(ncols); } // Return number of columns FXint FXSpinner::getNumColumns() const { return textField->getNumColumns(); } // Save object to stream void FXSpinner::save(FXStream& store) const { FXPacker::save(store); store << textField; store << upButton; store << downButton; store << range[0] << range[1]; store << incr; store << pos; } // Load object from stream void FXSpinner::load(FXStream& store){ FXPacker::load(store); store >> textField; store >> upButton; store >> downButton; store >> range[0] >> range[1]; store >> incr; store >> pos; } // Destruct spinner:- trash it! FXSpinner::~FXSpinner(){ textField=(FXTextField*)-1L; upButton=(FXArrowButton*)-1L; downButton=(FXArrowButton*)-1L; } } fox1.6-1.6.57/src/FXSplashWindow.cpp000066400000000000000000000134461326741342000170200ustar00rootroot00000000000000/******************************************************************************** * * * S p l a s h W i n d o w * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSplashWindow.cpp,v 1.9.2.2 2007/07/19 16:53:17 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXAccelTable.h" #include "FXDCWindow.h" #include "FXShell.h" #include "FXIcon.h" #include "FXTopWindow.h" #include "FXSplashWindow.h" /* Notes: - We need to allow some additional widgets inside it (and layout options). - We need to place it anywere, not just center of screen. - Perhaps signal user has clicked or timer expired. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXSplashWindow) FXSplashWindowMap[]={ FXMAPFUNC(SEL_PAINT,0,FXSplashWindow::onPaint), }; // Implementation FXIMPLEMENT(FXSplashWindow,FXTopWindow,FXSplashWindowMap,ARRAYNUMBER(FXSplashWindowMap)) // For deserialization FXSplashWindow::FXSplashWindow(){ flags|=FLAG_ENABLED; } // Splash window FXSplashWindow::FXSplashWindow(FXApp* ap,FXIcon* ic,FXuint opts,FXuint ms):FXTopWindow(ap,FXString::null,NULL,NULL,opts&~DECOR_ALL,0,0,ic->getWidth(),ic->getHeight(),0,0,0,0,0,0){ flags|=FLAG_ENABLED; delay=ms; icon=ic; } // Splash window FXSplashWindow::FXSplashWindow(FXWindow* ow,FXIcon* ic,FXuint opts,FXuint ms):FXTopWindow(ow,FXString::null,NULL,NULL,opts&~DECOR_ALL,0,0,ic->getWidth(),ic->getHeight(),0,0,0,0,0,0){ flags|=FLAG_ENABLED; delay=ms; icon=ic; } // Create and show window void FXSplashWindow::create(){ FXTopWindow::create(); icon->create(); if(options&SPLASH_SHAPED) setShape(icon); } // Detach window void FXSplashWindow::detach(){ FXTopWindow::detach(); icon->detach(); } // Show splash window void FXSplashWindow::show(){ if(!shown()){ FXTopWindow::show(); if(options&SPLASH_DESTROY){ getApp()->addTimeout(this,ID_DELETE,delay); } else{ getApp()->addTimeout(this,ID_HIDE,delay); } } } // Show splash window with a given placement void FXSplashWindow::show(FXuint placement){ if(!shown()){ FXTopWindow::show(placement); if(options&SPLASH_DESTROY){ getApp()->addTimeout(this,ID_DELETE,delay); } else{ getApp()->addTimeout(this,ID_HIDE,delay); } } } // Hide splash window void FXSplashWindow::hide(){ if(shown()){ FXTopWindow::hide(); if(options&SPLASH_DESTROY){ getApp()->removeTimeout(this,ID_DELETE); } else{ getApp()->removeTimeout(this,ID_HIDE); } } } // Get default width FXint FXSplashWindow::getDefaultWidth(){ return icon->getWidth(); } // Get default height FXint FXSplashWindow::getDefaultHeight(){ return icon->getHeight(); } // Handle repaint long FXSplashWindow::onPaint(FXObject*,FXSelector,void* ptr){ FXDCWindow dc(this,(FXEvent*)ptr); dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); dc.drawIcon(icon,0,0); return 1; } // Change icon void FXSplashWindow::setIcon(FXIcon* ic){ if(icon!=ic){ icon=ic; if(options&SPLASH_SHAPED) setShape(icon); resize(icon->getWidth(),icon->getHeight()); update(); } } // Set or change delay void FXSplashWindow::setDelay(FXuint ms){ delay=ms; if(shown()){ if(options&SPLASH_DESTROY){ getApp()->addTimeout(this,ID_DELETE,delay); } else{ getApp()->addTimeout(this,ID_HIDE,delay); } } } // Save object to stream void FXSplashWindow::save(FXStream& store) const { FXTopWindow::save(store); store << icon; store << delay; } // Load object from stream void FXSplashWindow::load(FXStream& store){ FXTopWindow::load(store); store >> icon; store >> delay; } // Destroy main window FXSplashWindow::~FXSplashWindow(){ getApp()->removeTimeout(this,ID_DELETE); getApp()->removeTimeout(this,ID_HIDE); if(options&SPLASH_OWNS_ICON) delete icon; icon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXSplitter.cpp000066400000000000000000000542331326741342000162030ustar00rootroot00000000000000/******************************************************************************** * * * S p l i t t e r W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSplitter.cpp,v 1.55 2006/02/20 03:32:13 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXSplitter.h" /* Notes: - Reversed split option starts parting out from right [bottom]. - Minimal partition of a split is 0 pixels. - Minimum width of horizontal splitter is determined by sum of all visible children's default widths, and height by maximum of all visible children's default heights; analogous for vertical splitter of course. [This can be done because the default width (height) does not depend on the widget's current user-specified actual width (height)]. - For convenience, width/height of <=1 replaced by minimum width/height, but only if both width and height of child is <=1 at the same time. - Should we send SEL_CHANGED and SEL_COMMAND also when splitter arrangement was changed programmatically? When bar size changed? - FXSplitter interprets layout hints on some of the children so that certain children have a minimum width (height) constraint on them. Note that this rule must have one exception: the last (or first if the option SPLITTER_REVERSED has been passed) must necessarily be allowed to be any size. - If we're just re-sizing a split, do we need to incur a GUI-Update? - Do we need to somehow insure that the sum of the sizes of all partitions never exceeds the size of the splitter itself? - Should we drop default parameters on 2nd constructor so as to prevent conflicts on compilers where NULL is defined as 0 instead of __null? */ // Splitter styles #define SPLITTER_MASK (SPLITTER_REVERSED|SPLITTER_VERTICAL|SPLITTER_TRACKING) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXSplitter) FXSplitterMap[]={ FXMAPFUNC(SEL_MOTION,0,FXSplitter::onMotion), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXSplitter::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXSplitter::onLeftBtnRelease), FXMAPFUNC(SEL_FOCUS_NEXT,0,FXSplitter::onFocusNext), FXMAPFUNC(SEL_FOCUS_PREV,0,FXSplitter::onFocusPrev), FXMAPFUNC(SEL_FOCUS_UP,0,FXSplitter::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXSplitter::onFocusDown), FXMAPFUNC(SEL_FOCUS_LEFT,0,FXSplitter::onFocusLeft), FXMAPFUNC(SEL_FOCUS_RIGHT,0,FXSplitter::onFocusRight), }; // Object implementation FXIMPLEMENT(FXSplitter,FXComposite,FXSplitterMap,ARRAYNUMBER(FXSplitterMap)) // Make a splitter FXSplitter::FXSplitter(){ flags|=FLAG_ENABLED|FLAG_SHOWN; window=NULL; split=0; offset=0; barsize=4; } // Make a splitter; it has no interior padding, and no borders FXSplitter::FXSplitter(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXComposite(p,opts,x,y,w,h){ flags|=FLAG_ENABLED|FLAG_SHOWN; defaultCursor=(options&SPLITTER_VERTICAL) ? getApp()->getDefaultCursor(DEF_VSPLIT_CURSOR) : getApp()->getDefaultCursor(DEF_HSPLIT_CURSOR); dragCursor=defaultCursor; window=NULL; split=0; offset=0; barsize=4; } // Make a splitter; it has no interior padding, and no borders FXSplitter::FXSplitter(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXComposite(p,opts,x,y,w,h){ flags|=FLAG_ENABLED|FLAG_SHOWN; defaultCursor=(options&SPLITTER_VERTICAL) ? getApp()->getDefaultCursor(DEF_VSPLIT_CURSOR) : getApp()->getDefaultCursor(DEF_HSPLIT_CURSOR); dragCursor=defaultCursor; target=tgt; message=sel; window=NULL; split=0; offset=0; barsize=4; } // Get default width FXint FXSplitter::getDefaultWidth(){ register FXWindow* child; register FXint wmax,w,numc; wmax=numc=0; if(options&SPLITTER_VERTICAL){ for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ w=child->getDefaultWidth(); if(wmaxgetNext()){ if(child->shown()){ wmax+=child->getDefaultWidth(); numc++; } } if(numc>1) wmax+=(numc-1)*barsize; } return wmax; } // Get default height FXint FXSplitter::getDefaultHeight(){ register FXWindow* child; register FXint hmax,h,numc; hmax=numc=0; if(options&SPLITTER_VERTICAL){ for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hmax+=child->getDefaultHeight(); numc++; } } if(numc>1) hmax+=(numc-1)*barsize; } else{ for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ h=child->getDefaultHeight(); if(hmaxshown()){ stretcher=stretcher->getNext(); } while(child){ if(child->shown()){ w=child->getWidth(); h=child->getHeight(); hints=child->getLayoutHints(); if((hints&LAYOUT_FILL_Y)&&(hints&LAYOUT_FIX_HEIGHT)){ if((t=child->getDefaultHeight())>h) h=t; } if(w<=1 && h<=1) h=child->getDefaultHeight(); if(child==stretcher){ h=pos; if(h<0) h=0; } child->position(0,pos-h,width,h); pos=pos-h-barsize; } child=child->getPrev(); } } else{ pos=0; child=getFirst(); stretcher=getLast(); while(stretcher && !stretcher->shown()){ stretcher=stretcher->getPrev(); } while(child){ if(child->shown()){ w=child->getWidth(); h=child->getHeight(); hints=child->getLayoutHints(); if((hints&LAYOUT_FILL_Y)&&(hints&LAYOUT_FIX_HEIGHT)){ if((t=child->getDefaultHeight())>h) h=t; } if(w<=1 && h<=1) h=child->getDefaultHeight(); if(child==stretcher){ h=height-pos; if(h<0) h=0; } child->position(0,pos,width,h); pos=pos+h+barsize; } child=child->getNext(); } } } else{ // Horizontal if(options&SPLITTER_REVERSED){ pos=width; child=getLast(); stretcher=getFirst(); while(stretcher && !stretcher->shown()){ stretcher=stretcher->getNext(); } while(child){ if(child->shown()){ w=child->getWidth(); h=child->getHeight(); hints=child->getLayoutHints(); if((hints&LAYOUT_FILL_X)&&(hints&LAYOUT_FIX_WIDTH)){ if((t=child->getDefaultWidth())>w) w=t; } if(w<=1 && h<=1) w=child->getDefaultWidth(); if(child==stretcher){ w=pos; if(w<0) w=0; } child->position(pos-w,0,w,height); pos=pos-w-barsize; } child=child->getPrev(); } } else{ pos=0; child=getFirst(); stretcher=getLast(); while(stretcher && !stretcher->shown()){ stretcher=stretcher->getPrev(); } while(child){ if(child->shown()){ w=child->getWidth(); h=child->getHeight(); hints=child->getLayoutHints(); if((hints&LAYOUT_FILL_X)&&(hints&LAYOUT_FIX_WIDTH)){ if((t=child->getDefaultWidth())>w) w=t; } if(w<=1 && h<=1) w=child->getDefaultWidth(); if(child==stretcher){ w=width-pos; if(w<0) w=0; } child->position(pos,0,w,height); pos=pos+w+barsize; } child=child->getNext(); } } } flags&=~FLAG_DIRTY; } // Adjust horizontal layout void FXSplitter::adjustHLayout(){ FXWindow *child,*stretcher; FXint w,h,pos; FXASSERT(window); if(options&SPLITTER_REVERSED){ pos=window->getX()+window->getWidth(); window->position(split,0,pos-split,height); pos=split-barsize; for(stretcher=getFirst(); stretcher && !stretcher->shown(); stretcher=stretcher->getNext()); for(child=window->getPrev(); child; child=child->getPrev()){ if(child->shown()){ w=child->getWidth(); h=child->getHeight(); if(w<=1 && h<=1) w=child->getDefaultWidth(); if(child==stretcher){ w=pos; if(w<0) w=0; } child->position(pos-w,0,w,height); pos=pos-w-barsize; } } } else{ pos=window->getX(); window->position(pos,0,split-pos,height); pos=split+barsize; for(stretcher=getLast(); stretcher && !stretcher->shown(); stretcher=stretcher->getPrev()); for(child=window->getNext(); child; child=child->getNext()){ if(child->shown()){ w=child->getWidth(); h=child->getHeight(); if(w<=1 && h<=1) w=child->getDefaultWidth(); if(child==stretcher){ w=width-pos; if(w<0) w=0; } child->position(pos,0,w,height); pos=pos+w+barsize; } } } } // Adjust vertical layout void FXSplitter::adjustVLayout(){ FXWindow *child,*stretcher; FXint w,h,pos; FXASSERT(window); if(options&SPLITTER_REVERSED){ pos=window->getY()+window->getHeight(); window->position(0,split,width,pos-split); pos=split-barsize; for(stretcher=getFirst(); stretcher && !stretcher->shown(); stretcher=stretcher->getNext()); for(child=window->getPrev(); child; child=child->getPrev()){ if(child->shown()){ w=child->getWidth(); h=child->getHeight(); if(w<=1 && h<=1) h=child->getDefaultHeight(); if(child==stretcher){ h=pos; if(h<0) h=0; } child->position(0,pos-h,width,h); pos=pos-h-barsize; } } } else{ pos=window->getY(); window->position(0,pos,width,split-pos); pos=split+barsize; for(stretcher=getLast(); stretcher && !stretcher->shown(); stretcher=stretcher->getPrev()); for(child=window->getNext(); child; child=child->getNext()){ if(child->shown()){ w=child->getWidth(); h=child->getHeight(); if(w<=1 && h<=1) h=child->getDefaultHeight(); if(child==stretcher){ h=height-pos; if(h<0) h=0; } child->position(0,pos,width,h); pos=pos+h+barsize; } } } } // Find child just before split FXWindow* FXSplitter::findHSplit(FXint pos){ register FXWindow* child=getFirst(); if(options&SPLITTER_REVERSED){ while(child){ if(child->shown()){ if(child->getX()-barsize<=pos && posgetX()) return child; } child=child->getNext(); } } else{ while(child){ if(child->shown()){ if(child->getX()+child->getWidth()<=pos && posgetX()+child->getWidth()+barsize) return child; } child=child->getNext(); } } return NULL; } // Find child just before split FXWindow* FXSplitter::findVSplit(FXint pos){ register FXWindow* child=getFirst(); if(options&SPLITTER_REVERSED){ while(child){ if(child->shown()){ if(child->getY()-barsize<=pos && posgetY()) return child; } child=child->getNext(); } } else{ while(child){ if(child->shown()){ if(child->getY()+child->getHeight()<=pos && posgetY()+child->getHeight()+barsize) return child; } child=child->getNext(); } } return NULL; } // Move the horizontal split intelligently void FXSplitter::moveHSplit(FXint pos){ register FXint smin,smax; register FXuint hints; FXASSERT(window); hints=window->getLayoutHints(); if(options&SPLITTER_REVERSED){ smin=barsize; smax=window->getX()+window->getWidth(); if((hints&LAYOUT_FILL_X)&&(hints&LAYOUT_FIX_WIDTH)) smax-=window->getDefaultWidth(); } else{ smin=window->getX(); smax=width-barsize; if((hints&LAYOUT_FILL_X)&&(hints&LAYOUT_FIX_WIDTH)) smin+=window->getDefaultWidth(); } split=pos; if(splitsmax) split=smax; } // Move the vertical split intelligently void FXSplitter::moveVSplit(FXint pos){ register FXint smin,smax; register FXuint hints; FXASSERT(window); hints=window->getLayoutHints(); if(options&SPLITTER_REVERSED){ smin=barsize; smax=window->getY()+window->getHeight(); if((hints&LAYOUT_FILL_Y)&&(hints&LAYOUT_FIX_HEIGHT)) smax-=window->getDefaultHeight(); } else{ smin=window->getY(); smax=height-barsize; if((hints&LAYOUT_FILL_Y)&&(hints&LAYOUT_FIX_HEIGHT)) smin+=window->getDefaultHeight(); } split=pos; if(splitsmax) split=smax; } // Button being pressed long FXSplitter::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; if(options&SPLITTER_VERTICAL){ window=findVSplit(ev->win_y); if(window){ if(options&SPLITTER_REVERSED) split=window->getY(); else split=window->getY()+window->getHeight(); offset=ev->win_y-split; if(!(options&SPLITTER_TRACKING)){ drawVSplit(split); } flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; } } else{ window=findHSplit(ev->win_x); if(window){ if(options&SPLITTER_REVERSED) split=window->getX(); else split=window->getX()+window->getWidth(); offset=ev->win_x-split; if(!(options&SPLITTER_TRACKING)){ drawHSplit(split); } flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; } } return 1; } return 0; } // Button being released long FXSplitter::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXuint flgs=flags; if(isEnabled()){ ungrab(); flags|=FLAG_UPDATE; flags&=~FLAG_CHANGED; flags&=~FLAG_PRESSED; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; if(flgs&FLAG_PRESSED){ if(!(options&SPLITTER_TRACKING)){ if(options&SPLITTER_VERTICAL){ drawVSplit(split); adjustVLayout(); } else{ drawHSplit(split); adjustHLayout(); } if(flgs&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),window); } } if(flgs&FLAG_CHANGED){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),window); } } return 1; } return 0; } // Button being released long FXSplitter::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; FXint oldsplit; if(flags&FLAG_PRESSED){ oldsplit=split; if(options&SPLITTER_VERTICAL){ moveVSplit(ev->win_y-offset); if(split!=oldsplit){ if(!(options&SPLITTER_TRACKING)){ drawVSplit(oldsplit); drawVSplit(split); } else{ adjustVLayout(); if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),window); } flags|=FLAG_CHANGED; } } else{ moveHSplit(ev->win_x-offset); if(split!=oldsplit){ if(!(options&SPLITTER_TRACKING)){ drawHSplit(oldsplit); drawHSplit(split); } else{ adjustHLayout(); if(target) target->tryHandle(this,FXSEL(SEL_CHANGED,message),window); } flags|=FLAG_CHANGED; } } return 1; } return 0; } // Focus moved to next long FXSplitter::onFocusNext(FXObject* sender,FXSelector sel,void* ptr){ return (options&SPLITTER_VERTICAL) ? onFocusDown(sender,sel,ptr) : onFocusRight(sender,sel,ptr); } // Focus moved to previous long FXSplitter::onFocusPrev(FXObject* sender,FXSelector sel,void* ptr){ return (options&SPLITTER_VERTICAL) ? onFocusUp(sender,sel,ptr) : onFocusLeft(sender,sel,ptr); } // Focus moved up long FXSplitter::onFocusUp(FXObject*,FXSelector,void* ptr){ FXWindow *child=getLast(); if(getFocus()){ if(getFocus()->handle(this,FXSEL(SEL_FOCUS_UP,0),ptr)) return 1; if(!(options&SPLITTER_VERTICAL)) return 0; child=getFocus()->getPrev(); } while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_UP,0),ptr)) return 1; } child=child->getPrev(); } return 0; } // Focus moved down long FXSplitter::onFocusDown(FXObject*,FXSelector,void* ptr){ FXWindow *child=getFirst(); if(getFocus()){ if(getFocus()->handle(this,FXSEL(SEL_FOCUS_DOWN,0),ptr)) return 1; if(!(options&SPLITTER_VERTICAL)) return 0; child=getFocus()->getNext(); } while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_DOWN,0),ptr)) return 1; } child=child->getNext(); } return 0; } // Focus moved to left long FXSplitter::onFocusLeft(FXObject*,FXSelector,void* ptr){ FXWindow *child=getLast(); if(getFocus()){ if(getFocus()->handle(this,FXSEL(SEL_FOCUS_LEFT,0),ptr)) return 1; if(options&SPLITTER_VERTICAL) return 0; child=getFocus()->getPrev(); } while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_LEFT,0),ptr)) return 1; } child=child->getPrev(); } return 0; } // Focus moved to right long FXSplitter::onFocusRight(FXObject*,FXSelector,void* ptr){ FXWindow *child=getFirst(); if(getFocus()){ if(getFocus()->handle(this,FXSEL(SEL_FOCUS_RIGHT,0),ptr)) return 1; if(options&SPLITTER_VERTICAL) return 0; child=getFocus()->getNext(); } while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_RIGHT,0),ptr)) return 1; } child=child->getNext(); } return 0; } // Draw the horizontal split void FXSplitter::drawHSplit(FXint pos){ FXDCWindow dc(this); dc.clipChildren(FALSE); dc.setFunction(BLT_NOT_DST); dc.fillRectangle(pos,0,barsize,height); } // Draw the vertical split void FXSplitter::drawVSplit(FXint pos){ FXDCWindow dc(this); dc.clipChildren(FALSE); dc.setFunction(BLT_NOT_DST); dc.fillRectangle(0,pos,width,barsize); } // Return size of the panel at index FXint FXSplitter::getSplit(FXint index) const { FXWindow *win=childAtIndex(index); if(win){ if(options&SPLITTER_VERTICAL){ return win->getHeight(); } else{ return win->getWidth(); } } return 0; } // Change the size of panel at the given index void FXSplitter::setSplit(FXint index,FXint size){ FXWindow *win=childAtIndex(index); if(win){ if(options&SPLITTER_VERTICAL){ win->setHeight(size); } else{ win->setWidth(size); } win->recalc(); } } // Return splitter style FXuint FXSplitter::getSplitterStyle() const { return (options&SPLITTER_MASK); } // Set horizontal or vertical void FXSplitter::setSplitterStyle(FXuint style){ FXuint opts=(options&~SPLITTER_MASK) | (style&SPLITTER_MASK); if(options!=opts){ // Split direction changed; need re-layout of everything if((opts&SPLITTER_VERTICAL)!=(options&SPLITTER_VERTICAL)){ for(FXWindow *child=getFirst(); child; child=child->getNext()){ if(child->shown()){ child->setWidth(0); child->setHeight(0); } } setDefaultCursor((opts&SPLITTER_VERTICAL) ? getApp()->getDefaultCursor(DEF_VSPLIT_CURSOR) : getApp()->getDefaultCursor(DEF_HSPLIT_CURSOR)); setDragCursor(getDefaultCursor()); recalc(); } // Split mode reversal; re-layout first and last only if((opts&SPLITTER_REVERSED)!=(options&SPLITTER_REVERSED)){ if(getFirst()){ getFirst()->setWidth(0); getFirst()->setHeight(0); getLast()->setWidth(0); getLast()->setHeight(0); } recalc(); } options=opts; } } // Change bar size void FXSplitter::setBarSize(FXint bs){ if(bs!=barsize){ barsize=bs; recalc(); } } // Save object to stream void FXSplitter::save(FXStream& store) const { FXComposite::save(store); store << barsize; } // Load object from stream void FXSplitter::load(FXStream& store){ FXComposite::load(store); store >> barsize; } // Zap it FXSplitter::~FXSplitter(){ window=(FXWindow*)-1L; } } fox1.6-1.6.57/src/FXSpring.cpp000066400000000000000000000070571326741342000156410ustar00rootroot00000000000000/******************************************************************************** * * * S p r i n g C o n t a i n e r W i d g e t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSpring.cpp,v 1.12 2006/01/22 17:58:42 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXPacker.h" #include "FXSpring.h" /* Notes: - Based upon an idea from Amanda Ross. */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXSpring,FXPacker,NULL,0) // Create child frame window FXSpring::FXSpring(FXComposite* p,FXuint opts,FXint relw,FXint relh,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXPacker(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ relWidth=relw; relHeight=relh; } // Compute minimum width based on child layout hints FXint FXSpring::getDefaultWidth(){ return 0> relWidth; store >> relHeight; } } fox1.6-1.6.57/src/FXStat.cpp000066400000000000000000000511731326741342000153100ustar00rootroot00000000000000/******************************************************************************** * * * F i l e S t a t i s t i c s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXStat.cpp,v 1.28 2006/01/22 17:58:42 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXStat.h" #include "FXFile.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Return time anything was changed FXTime FXStat::touched() const { return FXMAX(modifyTime,createTime); } // Return true if it is a hidden file (note: Windows-only attribute) bool FXStat::isHidden() const { return (modeFlags&FXIO::Hidden)!=0; } // Return true if it is a regular file bool FXStat::isFile() const { return (modeFlags&FXIO::File)!=0; } // Return true if it is a link bool FXStat::isLink() const { return (modeFlags&FXIO::SymLink)!=0; } // Return true if character device bool FXStat::isCharacter() const { return (modeFlags&FXIO::Character)!=0; } // Return true if block device bool FXStat::isBlock() const { return (modeFlags&FXIO::Block)!=0; } // Return true if socket device bool FXStat::isSocket() const { return (modeFlags&FXIO::Socket)!=0; } // Return true if fifo device bool FXStat::isFifo() const { return (modeFlags&FXIO::Fifo)!=0; } // Return true if input path is a directory bool FXStat::isDirectory() const { return (modeFlags&FXIO::Directory)!=0; } // Return true if file is readable bool FXStat::isReadable() const { return (modeFlags&(FXIO::OtherRead|FXIO::GroupRead|FXIO::OwnerRead))!=0; } // Return true if file is writable bool FXStat::isWritable() const { return (modeFlags&(FXIO::OtherWrite|FXIO::GroupWrite|FXIO::OwnerWrite))!=0; } // Return true if file is executable bool FXStat::isExecutable() const { return (modeFlags&(FXIO::OtherExec|FXIO::GroupExec|FXIO::OwnerExec))!=0; } // Return true if owner has read-write-execute permissions bool FXStat::isOwnerReadWriteExecute() const { return (modeFlags&FXIO::OwnerExec) && (modeFlags&FXIO::OwnerWrite) && (modeFlags&FXIO::OwnerRead); } // Return true if owner has read permissions bool FXStat::isOwnerReadable() const { return (modeFlags&FXIO::OwnerRead)!=0; } // Return true if owner has write permissions bool FXStat::isOwnerWritable() const { return (modeFlags&FXIO::OwnerWrite)!=0; } // Return true if owner has execute permissions bool FXStat::isOwnerExecutable() const { return (modeFlags&FXIO::OwnerExec)!=0; } // Return true if group has read-write-execute permissions bool FXStat::isGroupReadWriteExecute() const { return (modeFlags&FXIO::GroupExec) && (modeFlags&FXIO::GroupWrite) && (modeFlags&FXIO::GroupRead); } // Return true if group has read permissions bool FXStat::isGroupReadable() const { return (modeFlags&FXIO::GroupRead)!=0; } // Return true if group has write permissions bool FXStat::isGroupWritable() const { return (modeFlags&FXIO::GroupWrite)!=0; } // Return true if group has execute permissions bool FXStat::isGroupExecutable() const { return (modeFlags&FXIO::GroupExec)!=0; } // Return true if others have read-write-execute permissions bool FXStat::isOtherReadWriteExecute() const { return (modeFlags&FXIO::OtherExec) && (modeFlags&FXIO::OtherWrite) && (modeFlags&FXIO::OtherRead); } // Return true if others have read permissions bool FXStat::isOtherReadable() const { return (modeFlags&FXIO::OtherRead)!=0; } // Return true if others have write permissions bool FXStat::isOtherWritable() const { return (modeFlags&FXIO::OtherWrite)!=0; } // Return true if others have execute permissions bool FXStat::isOtherExecutable() const { return (modeFlags&FXIO::OtherExec)!=0; } // Return true if the file sets the user id on execution bool FXStat::isSetUid() const { return (modeFlags&FXIO::SetUser)!=0; } // Return true if the file sets the group id on execution bool FXStat::isSetGid() const { return (modeFlags&FXIO::SetGroup)!=0; } // Return true if the file has the sticky bit set bool FXStat::isSetSticky() const { return (modeFlags&FXIO::Sticky)!=0; } // Convert FILETIME (# 100ns since 01/01/1601) to time_t (# s since 01/01/1970) #ifdef WIN32 static inline time_t fxfiletime(const FILETIME& ft){ FXulong ll=(((FXulong)ft.dwHighDateTime)<<32)|((FXulong)ft.dwLowDateTime); #if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__SC__) ll=ll-116444736000000000ULL; #else ll=ll-116444736000000000UL; #endif ll=ll/10000000; return (time_t)ll; } #endif // Get statistics of given file bool FXStat::statFile(const FXString& file,FXStat& info){ info.modeFlags=0; info.userNumber=0; info.groupNumber=0; info.createTime=0; info.accessTime=0; info.modifyTime=0; info.fileSize=0; if(!file.empty()){ #ifdef WIN32 #ifdef UNICODE TCHAR buffer[MAXPATHLEN]; WIN32_FILE_ATTRIBUTE_DATA data; SHFILEINFO sfi; utf2ncs(buffer,file.text(),file.length()+1); if(::GetFileAttributesExW(buffer,GetFileExInfoStandard,&data)){ info.modeFlags=FXIO::OwnerFull|FXIO::GroupFull|FXIO::OtherFull; if(data.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) info.modeFlags|=FXIO::Hidden; if(data.dwFileAttributes&FILE_ATTRIBUTE_READONLY) info.modeFlags&=~(FXIO::OwnerWrite|FXIO::GroupWrite|FXIO::OtherWrite); if(data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) info.modeFlags|=FXIO::Directory|FXIO::OwnerWrite|FXIO::GroupWrite|FXIO::OtherWrite; else info.modeFlags|=FXIO::File; //if(::SHGetFileInfoW(buffer,0,&sfi,sizeof(SHFILEINFO),SHGFI_EXETYPE)==0) info.modeFlags&=~(FXIO::OwnerExec|FXIO::GroupExec|FXIO::OtherExec); if(comparecase(&file[file.length()-4],".exe")!=0) info.modeFlags&=~(FXIO::OwnerExec|FXIO::GroupExec|FXIO::OtherExec); info.userNumber=0; info.groupNumber=0; info.accessTime=fxfiletime(data.ftLastAccessTime); info.modifyTime=fxfiletime(data.ftLastWriteTime); info.createTime=fxfiletime(data.ftCreationTime); info.fileSize=(((FXlong)data.nFileSizeHigh)<<32)|((FXlong)data.nFileSizeLow); return true; } #else WIN32_FILE_ATTRIBUTE_DATA data; SHFILEINFO sfi; if(::GetFileAttributesExA(file.text(),GetFileExInfoStandard,&data)){ info.modeFlags=FXIO::OwnerFull|FXIO::GroupFull|FXIO::OtherFull; if(data.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) info.modeFlags|=FXIO::Hidden; if(data.dwFileAttributes&FILE_ATTRIBUTE_READONLY) info.modeFlags&=~(FXIO::OwnerWrite|FXIO::GroupWrite|FXIO::OtherWrite); if(data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) info.modeFlags|=FXIO::Directory|FXIO::OwnerWrite|FXIO::GroupWrite|FXIO::OtherWrite; else info.modeFlags|=FXIO::File; //if(::SHGetFileInfoA(file.text(),0,&sfi,sizeof(SHFILEINFO),SHGFI_EXETYPE)==0) info.modeFlags&=~(FXIO::OwnerExec|FXIO::GroupExec|FXIO::OtherExec); if(comparecase(&file[file.length()-4],".exe")!=0) info.modeFlags&=~(FXIO::OwnerExec|FXIO::GroupExec|FXIO::OtherExec); info.userNumber=0; info.groupNumber=0; info.accessTime=fxfiletime(data.ftLastAccessTime); info.modifyTime=fxfiletime(data.ftLastWriteTime); info.createTime=fxfiletime(data.ftCreationTime); info.fileSize=(((FXlong)data.nFileSizeHigh)<<32)|((FXlong)data.nFileSizeLow); return true; } #endif #else struct stat data; if(::stat(file.text(),&data)==0){ info.modeFlags=(data.st_mode&0777); if(S_ISDIR(data.st_mode)) info.modeFlags|=FXIO::Directory; if(S_ISREG(data.st_mode)) info.modeFlags|=FXIO::File; if(S_ISLNK(data.st_mode)) info.modeFlags|=FXIO::SymLink; if(S_ISCHR(data.st_mode)) info.modeFlags|=FXIO::Character; if(S_ISBLK(data.st_mode)) info.modeFlags|=FXIO::Block; if(S_ISFIFO(data.st_mode)) info.modeFlags|=FXIO::Fifo; if(S_ISSOCK(data.st_mode)) info.modeFlags|=FXIO::Socket; if(data.st_mode&S_ISUID) info.modeFlags|=FXIO::SetUser; if(data.st_mode&S_ISGID) info.modeFlags|=FXIO::SetGroup; if(data.st_mode&S_ISVTX) info.modeFlags|=FXIO::Sticky; info.userNumber=data.st_uid; info.groupNumber=data.st_gid; info.accessTime=data.st_atime; info.modifyTime=data.st_mtime; info.createTime=data.st_ctime; info.fileSize=data.st_size; return true; } #endif } return false; } // Get statistice of the linked file bool FXStat::statLink(const FXString& file,FXStat& info){ info.modeFlags=0; info.userNumber=0; info.groupNumber=0; info.createTime=0; info.accessTime=0; info.modifyTime=0; info.fileSize=0; if(!file.empty()){ #ifdef WIN32 #ifdef UNICODE TCHAR buffer[MAXPATHLEN]; WIN32_FILE_ATTRIBUTE_DATA data; SHFILEINFO sfi; utf2ncs(buffer,file.text(),file.length()+1); if(::GetFileAttributesExW(buffer,GetFileExInfoStandard,&data)){ info.modeFlags=FXIO::OwnerFull|FXIO::GroupFull|FXIO::OtherFull; if(data.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) info.modeFlags|=FXIO::Hidden; if(data.dwFileAttributes&FILE_ATTRIBUTE_READONLY) info.modeFlags&=~(FXIO::OwnerWrite|FXIO::GroupWrite|FXIO::OtherWrite); if(data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) info.modeFlags|=FXIO::Directory|FXIO::OwnerWrite|FXIO::GroupWrite|FXIO::OtherWrite; else info.modeFlags|=FXIO::File; //if(::SHGetFileInfoW(buffer,0,&sfi,sizeof(SHFILEINFO),SHGFI_EXETYPE)==0) info.modeFlags&=~(FXIO::OwnerExec|FXIO::GroupExec|FXIO::OtherExec); if(comparecase(&file[file.length()-4],".exe")!=0) info.modeFlags&=~(FXIO::OwnerExec|FXIO::GroupExec|FXIO::OtherExec); info.userNumber=0; info.groupNumber=0; info.accessTime=fxfiletime(data.ftLastAccessTime); info.modifyTime=fxfiletime(data.ftLastWriteTime); info.createTime=fxfiletime(data.ftCreationTime); info.fileSize=(((FXlong)data.nFileSizeHigh)<<32)|((FXlong)data.nFileSizeLow); return true; } #else WIN32_FILE_ATTRIBUTE_DATA data; SHFILEINFO sfi; if(::GetFileAttributesExA(file.text(),GetFileExInfoStandard,&data)){ info.modeFlags=FXIO::OwnerFull|FXIO::GroupFull|FXIO::OtherFull; if(data.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) info.modeFlags|=FXIO::Hidden; if(data.dwFileAttributes&FILE_ATTRIBUTE_READONLY) info.modeFlags&=~(FXIO::OwnerWrite|FXIO::GroupWrite|FXIO::OtherWrite); if(data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) info.modeFlags|=FXIO::Directory|FXIO::OwnerWrite|FXIO::GroupWrite|FXIO::OtherWrite; else info.modeFlags|=FXIO::File; //if(::SHGetFileInfoA(file.text(),0,&sfi,sizeof(SHFILEINFO),SHGFI_EXETYPE)==0) info.modeFlags&=~(FXIO::OwnerExec|FXIO::GroupExec|FXIO::OtherExec); if(comparecase(&file[file.length()-4],".exe")!=0) info.modeFlags&=~(FXIO::OwnerExec|FXIO::GroupExec|FXIO::OtherExec); info.userNumber=0; info.groupNumber=0; info.accessTime=fxfiletime(data.ftLastAccessTime); info.modifyTime=fxfiletime(data.ftLastWriteTime); info.createTime=fxfiletime(data.ftCreationTime); info.fileSize=(((FXlong)data.nFileSizeHigh)<<32)|((FXlong)data.nFileSizeLow); return true; } #endif #else struct stat data; if(::lstat(file.text(),&data)==0){ info.modeFlags=(data.st_mode&0777); if(S_ISDIR(data.st_mode)) info.modeFlags|=FXIO::Directory; if(S_ISREG(data.st_mode)) info.modeFlags|=FXIO::File; if(S_ISLNK(data.st_mode)) info.modeFlags|=FXIO::SymLink; if(S_ISCHR(data.st_mode)) info.modeFlags|=FXIO::Character; if(S_ISBLK(data.st_mode)) info.modeFlags|=FXIO::Block; if(S_ISFIFO(data.st_mode)) info.modeFlags|=FXIO::Fifo; if(S_ISSOCK(data.st_mode)) info.modeFlags|=FXIO::Socket; if(data.st_mode&S_ISUID) info.modeFlags|=FXIO::SetUser; if(data.st_mode&S_ISGID) info.modeFlags|=FXIO::SetGroup; if(data.st_mode&S_ISVTX) info.modeFlags|=FXIO::Sticky; info.userNumber=data.st_uid; info.groupNumber=data.st_gid; info.accessTime=data.st_atime; info.modifyTime=data.st_mtime; info.createTime=data.st_ctime; info.fileSize=data.st_size; return true; } #endif } return false; } // Get statistice of the linked file bool FXStat::stat(const FXFile& file,FXStat& info){ info.modeFlags=0; info.userNumber=0; info.groupNumber=0; info.createTime=0; info.accessTime=0; info.modifyTime=0; info.fileSize=0; #ifdef WIN32 BY_HANDLE_FILE_INFORMATION data; if(::GetFileInformationByHandle(file.handle(),&data)){ info.modeFlags=FXIO::OwnerFull|FXIO::GroupFull|FXIO::OtherFull; if(data.dwFileAttributes&FILE_ATTRIBUTE_HIDDEN) info.modeFlags|=FXIO::Hidden; if(data.dwFileAttributes&FILE_ATTRIBUTE_READONLY) info.modeFlags&=~(FXIO::OwnerWrite|FXIO::GroupWrite|FXIO::OtherWrite); if(data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) info.modeFlags|=FXIO::Directory|FXIO::OwnerWrite|FXIO::GroupWrite|FXIO::OtherWrite; else info.modeFlags|=FXIO::File; info.userNumber=0; info.groupNumber=0; info.accessTime=fxfiletime(data.ftLastAccessTime); info.modifyTime=fxfiletime(data.ftLastWriteTime); info.createTime=fxfiletime(data.ftCreationTime); info.fileSize=(((FXulong)data.nFileSizeHigh)<<32)|((FXulong)data.nFileSizeLow); return true; } #else struct stat data; if(::fstat(file.handle(),&data)==0){ info.modeFlags=(data.st_mode&0777); if(S_ISDIR(data.st_mode)) info.modeFlags|=FXIO::Directory; if(S_ISREG(data.st_mode)) info.modeFlags|=FXIO::File; if(S_ISLNK(data.st_mode)) info.modeFlags|=FXIO::SymLink; if(S_ISCHR(data.st_mode)) info.modeFlags|=FXIO::Character; if(S_ISBLK(data.st_mode)) info.modeFlags|=FXIO::Block; if(S_ISFIFO(data.st_mode)) info.modeFlags|=FXIO::Fifo; if(S_ISSOCK(data.st_mode)) info.modeFlags|=FXIO::Socket; if(data.st_mode&S_ISUID) info.modeFlags|=FXIO::SetUser; if(data.st_mode&S_ISGID) info.modeFlags|=FXIO::SetGroup; if(data.st_mode&S_ISVTX) info.modeFlags|=FXIO::Sticky; info.userNumber=data.st_uid; info.groupNumber=data.st_gid; info.accessTime=data.st_atime; info.modifyTime=data.st_mtime; info.createTime=data.st_ctime; info.fileSize=data.st_size; return true; } #endif return false; } // Return file mode flags FXuint FXStat::mode(const FXString& file){ FXStat data; statFile(file,data); return data.mode(); } // Change the mode flags for this file bool FXStat::mode(const FXString& file,FXuint perm){ if(!file.empty()){ #ifndef WIN32 FXuint bits=perm&0777; if(perm&FXIO::SetUser) bits|=S_ISUID; if(perm&FXIO::SetGroup) bits|=S_ISGID; if(perm&FXIO::Sticky) bits|=S_ISVTX; return ::chmod(file.text(),bits)==0; #else return false; // FIXME Unimplemented yet #endif } return false; } // Return true if file exists bool FXStat::exists(const FXString& file){ if(!file.empty()){ #ifdef WIN32 #ifdef UNICODE FXnchar name[1024]; utf2ncs(name,file.text(),file.length()+1); return ::GetFileAttributesW(name)!=0xffffffff; #else return ::GetFileAttributesA(file.text())!=0xffffffff; #endif #else struct stat status; return ::stat(file.text(),&status)==0; #endif } return false; } // Get file size FXlong FXStat::size(const FXString& file){ FXStat data; statFile(file,data); return data.size(); } // Return time file was last modified FXTime FXStat::modified(const FXString& file){ FXStat data; statFile(file,data); return data.modified(); } // Return time file was last accessed FXTime FXStat::accessed(const FXString& file){ FXStat data; statFile(file,data); return data.accessed(); } // Return time when created FXTime FXStat::created(const FXString& file){ FXStat data; statFile(file,data); return data.created(); } // Return time anything was changed FXTime FXStat::touched(const FXString& file){ FXStat data; statFile(file,data); return data.touched(); } // Return true if file is hidden bool FXStat::isHidden(const FXString& file){ FXStat data; return statFile(file,data) && data.isHidden(); } // Check if file represents a file bool FXStat::isFile(const FXString& file){ FXStat data; return statFile(file,data) && data.isFile(); } // Check if file represents a link bool FXStat::isLink(const FXString& file){ FXStat data; return statLink(file,data) && data.isLink(); } // Check if file represents a directory bool FXStat::isDirectory(const FXString& file){ FXStat data; return statFile(file,data) && data.isDirectory(); } // Return true if file is readable bool FXStat::isReadable(const FXString& file){ FXStat data; return statFile(file,data) && data.isReadable(); } // Return true if file is writable bool FXStat::isWritable(const FXString& file){ FXStat data; return statFile(file,data) && data.isWritable(); } // Return true if file is executable bool FXStat::isExecutable(const FXString& file){ FXStat data; return statFile(file,data) && data.isExecutable(); } // Check if owner has full permissions bool FXStat::isOwnerReadWriteExecute(const FXString& file){ FXStat data; return statFile(file,data) && data.isOwnerReadWriteExecute(); } // Check if owner can read bool FXStat::isOwnerReadable(const FXString& file){ FXStat data; return statFile(file,data) && data.isOwnerReadable(); } // Check if owner can write bool FXStat::isOwnerWritable(const FXString& file){ FXStat data; return statFile(file,data) && data.isOwnerWritable(); } // Check if owner can execute bool FXStat::isOwnerExecutable(const FXString& file){ FXStat data; return statFile(file,data) && data.isOwnerExecutable(); } // Check if group has full permissions bool FXStat::isGroupReadWriteExecute(const FXString& file){ FXStat data; return statFile(file,data) && data.isGroupReadWriteExecute(); } // Check if group can read bool FXStat::isGroupReadable(const FXString& file){ FXStat data; return statFile(file,data) && data.isGroupReadable(); } // Check if group can write bool FXStat::isGroupWritable(const FXString& file){ FXStat data; return statFile(file,data) && data.isGroupWritable(); } // Check if group can execute bool FXStat::isGroupExecutable(const FXString& file){ FXStat data; return statFile(file,data) && data.isGroupExecutable(); } // Check if everybody has full permissions bool FXStat::isOtherReadWriteExecute(const FXString& file){ FXStat data; return statFile(file,data) && data.isOtherReadWriteExecute(); } // Check if everybody can read bool FXStat::isOtherReadable(const FXString& file){ FXStat data; return statFile(file,data) && data.isOtherReadable(); } // Check if everybody can write bool FXStat::isOtherWritable(const FXString& file){ FXStat data; return statFile(file,data) && data.isOtherWritable(); } // Check if everybody can execute bool FXStat::isOtherExecutable(const FXString& file){ FXStat data; return statFile(file,data) && data.isOtherExecutable(); } // Test if suid bit set bool FXStat::isSetUid(const FXString& file){ FXStat data; return statFile(file,data) && data.isSetUid(); } // Test if sgid bit set bool FXStat::isSetGid(const FXString& file){ FXStat data; return statFile(file,data) && data.isSetGid(); } // Test if sticky bit set bool FXStat::isSetSticky(const FXString& file){ FXStat data; return statFile(file,data) && data.isSetSticky(); } } fox1.6-1.6.57/src/FXStatusBar.cpp000066400000000000000000000207501326741342000163020ustar00rootroot00000000000000/******************************************************************************** * * * S t a t u s B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXStatusBar.cpp,v 1.16 2006/01/22 17:58:42 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXDragCorner.h" #include "FXStatusLine.h" #include "FXStatusBar.h" /* Notes: - Drag corner shown whenever option says it is. */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXStatusBar,FXHorizontalFrame,NULL,0) // Make a status bar FXStatusBar::FXStatusBar(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXHorizontalFrame(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ corner=new FXDragCorner(this); status=new FXStatusLine(this); } // Compute minimum width based on child layout hints FXint FXStatusBar::getDefaultWidth(){ register FXint w,wcum,numc; register FXWindow* child; register FXuint hints; wcum=numc=0; for(child=corner->getNext(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else w=child->getDefaultWidth(); wcum+=w; numc++; } } if(numc>1) wcum+=(numc-1)*hspacing; if((options&STATUSBAR_WITH_DRAGCORNER) && (numc>1)) wcum+=corner->getDefaultWidth(); return padleft+padright+wcum+(border<<1); } // Compute minimum height based on child layout hints FXint FXStatusBar::getDefaultHeight(){ register FXint h,hmax; register FXWindow* child; register FXuint hints; hmax=0; for(child=corner->getNext(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else h=child->getDefaultHeight(); if(hmaxgetDefaultHeight())) h=corner->getDefaultHeight(); return h+(border<<1); } // Recalculate layout void FXStatusBar::layout(){ FXint left,right,top,bottom; FXint remain,extra_space,total_space,t; FXint x,y,w,h; FXint numc=0; FXint sumexpand=0; FXint numexpand=0; FXint e=0; FXuint hints; FXWindow* child; // Placement rectangle; right/bottom non-inclusive left=border+padleft; right=width-border-padright; top=border+padtop; bottom=height-border-padbottom; remain=right-left; // Find number of paddable children and total width for(child=corner->getNext(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else w=child->getDefaultWidth(); FXASSERT(w>=0); if((hints&LAYOUT_CENTER_X) || ((hints&LAYOUT_FILL_X) && !(hints&LAYOUT_FIX_WIDTH))){ sumexpand+=w; numexpand+=1; } else{ remain-=w; } numc++; } } // Child spacing if(numc>1) remain-=hspacing*(numc-1); // Substract corner width if((options&STATUSBAR_WITH_DRAGCORNER) && (numc>1)){ right-=corner->getDefaultWidth(); remain-=corner->getDefaultWidth(); } // Do the layout for(child=corner->getNext(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); // Layout child in Y y=child->getY(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else h=child->getDefaultHeight(); extra_space=0; if((hints&LAYOUT_FILL_Y) && !(hints&LAYOUT_FIX_HEIGHT)){ h=bottom-top; if(h<0) h=0; } else if(hints&LAYOUT_CENTER_Y){ if(h<(bottom-top)) extra_space=(bottom-top-h)/2; } if(hints&LAYOUT_BOTTOM) y=bottom-extra_space-h; else /*hints&LAYOUT_TOP*/ y=top+extra_space; // Layout child in X x=child->getX(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else w=child->getDefaultWidth(); extra_space=0; total_space=0; if((hints&LAYOUT_FILL_X) && !(hints&LAYOUT_FIX_WIDTH)){ if(sumexpand>0){ t=w*remain; FXASSERT(sumexpand>0); w=t/sumexpand; e+=t%sumexpand; if(e>=sumexpand){w++;e-=sumexpand;} } else{ FXASSERT(numexpand>0); w=remain/numexpand; e+=remain%numexpand; if(e>=numexpand){w++;e-=numexpand;} } } else if(hints&LAYOUT_CENTER_X){ if(sumexpand>0){ t=w*remain; FXASSERT(sumexpand>0); total_space=t/sumexpand-w; e+=t%sumexpand; if(e>=sumexpand){total_space++;e-=sumexpand;} } else{ FXASSERT(numexpand>0); total_space=remain/numexpand-w; e+=remain%numexpand; if(e>=numexpand){total_space++;e-=numexpand;} } extra_space=total_space/2; } if(hints&LAYOUT_RIGHT){ x=right-w-extra_space; right=right-w-hspacing-total_space; } else{/*hints&LAYOUT_LEFT*/ x=left+extra_space; left=left+w+hspacing+total_space; } child->position(x,y,w,h); } } // Just make sure corner grip's on top if((options&STATUSBAR_WITH_DRAGCORNER)){ if(numc>1) corner->position(width-border-corner->getDefaultWidth(),height-border-corner->getDefaultHeight(),corner->getDefaultWidth(),corner->getDefaultHeight()); else corner->position(width-padright-border-corner->getDefaultWidth(),height-border-padbottom-corner->getDefaultHeight(),corner->getDefaultWidth(),corner->getDefaultHeight()); corner->show(); corner->raise(); } else{ corner->hide(); } flags&=~FLAG_DIRTY; } // Show or hide the drag corner void FXStatusBar::setCornerStyle(FXbool withcorner){ FXuint opts=withcorner ? (options|STATUSBAR_WITH_DRAGCORNER) : (options&~STATUSBAR_WITH_DRAGCORNER); if(options!=opts){ options=opts; recalc(); update(); } } // Return TRUE if drag corner shown FXbool FXStatusBar::getCornerStyle() const { return (options&STATUSBAR_WITH_DRAGCORNER)!=0; } // Save object to stream void FXStatusBar::save(FXStream& store) const { FXHorizontalFrame::save(store); store << corner; store << status; } // Load object from stream void FXStatusBar::load(FXStream& store){ FXHorizontalFrame::load(store); store >> corner; store >> status; } // Destruct FXStatusBar::~FXStatusBar(){ corner=(FXDragCorner*)-1L; status=(FXStatusLine*)-1L; } } fox1.6-1.6.57/src/FXStatusLine.cpp000066400000000000000000000166321326741342000164710ustar00rootroot00000000000000/******************************************************************************** * * * S t a t u s L i n e W i d g e t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXStatusLine.cpp,v 1.28 2006/01/22 17:58:42 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXHorizontalFrame.h" #include "FXDragCorner.h" #include "FXStatusLine.h" /* Notes: - Fallback text is displayed when neither cursor window or target object supply temporary help string. - Show only status line information from same topwindow as where status line is */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXStatusLine) FXStatusLineMap[]={ FXMAPFUNC(SEL_PAINT,0,FXStatusLine::onPaint), FXMAPFUNC(SEL_UPDATE,0,FXStatusLine::onUpdate), FXMAPFUNC(SEL_COMMAND,FXStatusLine::ID_SETSTRINGVALUE,FXStatusLine::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXStatusLine::ID_GETSTRINGVALUE,FXStatusLine::onCmdGetStringValue), }; // Object implementation FXIMPLEMENT(FXStatusLine,FXFrame,FXStatusLineMap,ARRAYNUMBER(FXStatusLineMap)) // Deserialization FXStatusLine::FXStatusLine(){ flags|=FLAG_SHOWN; } // Construct and init FXStatusLine::FXStatusLine(FXComposite* p,FXObject* tgt,FXSelector sel): FXFrame(p,FRAME_SUNKEN|LAYOUT_LEFT|LAYOUT_FILL_Y|LAYOUT_FILL_X,0,0,0,0, 4,4,2,2){ flags|=FLAG_SHOWN; status=normal=tr("Ready."); font=getApp()->getNormalFont(); textColor=getApp()->getForeColor(); textHighlightColor=getApp()->getForeColor(); target=tgt; message=sel; } // Create Window void FXStatusLine::create(){ FXFrame::create(); font->create(); } // Detach Window void FXStatusLine::detach(){ FXFrame::detach(); font->detach(); } // Get default width; as text changes often, exact content does not matter FXint FXStatusLine::getDefaultWidth(){ return padleft+padright+(border<<1)+8; } // Get default height; just care about font height FXint FXStatusLine::getDefaultHeight(){ return font->getFontHeight()+padtop+padbottom+(border<<1); } // Slightly different from Frame border long FXStatusLine::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXint ty=padtop+(height-padtop-padbottom-font->getFontHeight())/2; FXint pos,len; dc.setForeground(backColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); if(!status.empty()){ dc.setFont(font); pos=status.find('\n'); len=status.length(); if(pos>=0){ dc.setForeground(textHighlightColor); dc.drawText(padleft,ty+font->getFontAscent(),status.text(),pos); dc.setForeground(textColor); dc.drawText(padleft+font->getTextWidth(status.text(),pos),ty+font->getFontAscent(),status.text()+pos+1,len-pos-1); } else{ dc.setForeground(textColor); dc.drawText(padleft,ty+font->getFontAscent(),status.text(),len); } } drawFrame(dc,0,0,width,height); return 1; } // If the cursor is inside a widget, flash its help text; // Otherwise, unflash back to the regular status message. long FXStatusLine::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ FXWindow *helpsource=getApp()->getCursorWindow(); // Regular GUI update FXFrame::onUpdate(sender,sel,ptr); // Ask the help source for a new status text first, but only if the // statusline's shell is a direct or indirect owner of the help source if(helpsource && getShell()->isOwnerOf(helpsource) && helpsource->handle(this,FXSEL(SEL_QUERY_HELP,0),NULL)){ return 1; } // Otherwise, supply normal message setText(normal); return 1; } // Update value from a message long FXStatusLine::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setText(*((FXString*)ptr)); return 1; } // Obtain value from text field long FXStatusLine::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getText(); return 1; } // Set currently displayed message void FXStatusLine::setText(const FXString& text){ if(status!=text){ status=text; update(border,border,width-(border<<1),height-(border<<1)); repaint(border,border,width-(border<<1),height-(border<<1)); getApp()->flush(); } } // Set permanently displayed message void FXStatusLine::setNormalText(const FXString& text){ if(normal!=text){ normal=text; update(border,border,width-(border<<1),height-(border<<1)); repaint(border,border,width-(border<<1),height-(border<<1)); getApp()->flush(); } } // Change the font void FXStatusLine::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Set text color void FXStatusLine::setTextColor(FXColor clr){ if(textColor!=clr){ textColor=clr; update(border,border,width-(border<<1),height-(border<<1)); } } // Set text highlight color void FXStatusLine::setTextHighlightColor(FXColor clr){ if(textHighlightColor!=clr){ textHighlightColor=clr; update(border,border,width-(border<<1),height-(border<<1)); } } // Save object to stream void FXStatusLine::save(FXStream& store) const { FXFrame::save(store); store << status; store << normal; store << font; store << textColor; store << textHighlightColor; } // Load object from stream void FXStatusLine::load(FXStream& store){ FXFrame::load(store); store >> status; store >> normal; store >> font; store >> textColor; store >> textHighlightColor; } // Destruct FXStatusLine::~FXStatusLine(){ font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXStream.cpp000066400000000000000000000560671326741342000156370ustar00rootroot00000000000000/******************************************************************************** * * * P e r s i s t e n t S t o r a g e S t r e a m C l a s s e s * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXStream.cpp,v 1.66.2.3 2006/09/13 18:18:52 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXObject.h" /* Notes: - Defer malloc in FXStream::open till object is actually being saved/loaded! - Programming errors are punished by calling fxerror(); for example, saving into a stream which is set for loading, NULL buffer pointers, and so on. - Status codes are set when a correct program encounters errors such as writing to full disk, running out of memory, and so on. - Single character insert/extract operators are virtual so subclasses can overload these specific cases for greater speed. - Copy byte at a time because don't know about alignment of stream buffer; unaligned accesses are disallowed on some RISC cpus. - Buffer can not be written till after first call to writeBuffer(). - Need to haul some memory stream stuff up (buffer mgmt). - Need to have load() and save() API's return number of elements ACTUALLY transferred (not bytes but whole numbers of elements!). */ #define MAXCLASSNAME 256 // Maximum class name length #define DEF_HASH_SIZE 32 // Initial table size (MUST be power of 2) #define MAX_LOAD 80 // Maximum hash table load factor (%) #define FUDGE 5 // Fudge for hash table size #define UNUSEDSLOT 0xffffffff // Unsused slot marker #define CLASSIDFLAG 0x80000000 // Marks it as a class ID #define HASH1(x,n) (((FXuint)(FXuval)(x)*13)%(n)) // Number [0..n-1] #define HASH2(x,n) (1|(((FXuint)(FXuval)(x)*17)%((n)-1))) // Number [1..n-2] using namespace FX; /*******************************************************************************/ namespace FX { // Create PersistentStore object FXStream::FXStream(const FXObject *cont){ parent=cont; begptr=NULL; endptr=NULL; wrptr=NULL; rdptr=NULL; pos=0L; dir=FXStreamDead; code=FXStreamOK; seq=0x80000000; swap=false; owns=false; } // Set stream to big endian mode if true void FXStream::setBigEndian(bool big){ swap=(big^FOX_BIGENDIAN); } // Return true if big endian mode. bool FXStream::isBigEndian() const { return (swap^FOX_BIGENDIAN); } // Destroy PersistentStore object FXStream::~FXStream(){ if(owns){FXFREE(&begptr);} parent=(FXObject*)-1L; begptr=(FXuchar*)-1L; endptr=(FXuchar*)-1L; wrptr=(FXuchar*)-1L; rdptr=(FXuchar*)-1L; } // Write at least count bytes from the buffer; the default // implementation simply discards all data in the buffer. // It returns the amount of room available to be written. FXuval FXStream::writeBuffer(FXuval){ rdptr=begptr; wrptr=begptr; return endptr-wrptr; } // Read at least count bytes into the buffer; the default // implementation reads an endless stream of zero's. // It returns the amount of data available to be read. FXuval FXStream::readBuffer(FXuval){ rdptr=begptr; wrptr=endptr; return wrptr-rdptr; } // Set status code void FXStream::setError(FXStreamStatus err){ code=err; } // Get available space FXuval FXStream::getSpace() const { return endptr-begptr; } // Set available space void FXStream::setSpace(FXuval size){ if(code==FXStreamOK){ // Changed size? if(begptr+size!=endptr){ // Old buffer location register FXuchar *oldbegptr=begptr; // Only resize if owned if(!owns){ fxerror("FXStream::setSpace: cannot resize external data buffer.\n"); } // Resize the buffer if(!FXRESIZE(&begptr,FXuchar,size)){ code=FXStreamAlloc; return; } // Adjust pointers, buffer may have moved endptr=begptr+size; wrptr=begptr+(wrptr-oldbegptr); rdptr=begptr+(rdptr-oldbegptr); if(wrptr>endptr) wrptr=endptr; if(rdptr>endptr) rdptr=endptr; } } } // Open for save or load bool FXStream::open(FXStreamDirection save_or_load,FXuval size,FXuchar* data){ if(save_or_load!=FXStreamSave && save_or_load!=FXStreamLoad){fxerror("FXStream::open: illegal stream direction.\n");} if(!dir){ // Use external buffer space if(data){ begptr=data; if(size==ULONG_MAX) endptr=(FXuchar*)(FXival)-1L; else endptr=begptr+size; wrptr=begptr; rdptr=begptr; owns=false; } // Use internal buffer space else{ if(!FXCALLOC(&begptr,FXuchar,size)){ code=FXStreamAlloc; return false; } endptr=begptr+size; wrptr=begptr; rdptr=begptr; owns=true; } // Reset variables hash.clear(); dir=save_or_load; seq=0x80000000; pos=0; // Append container object to hash table if(parent){ addObject(parent); } // So far, so good code=FXStreamOK; return true; } return false; } // Flush buffer bool FXStream::flush(){ writeBuffer(0); return code==FXStreamOK; } // Close store; return true if no errors have been encountered bool FXStream::close(){ if(dir){ hash.clear(); dir=FXStreamDead; if(owns){FXFREE(&begptr);} begptr=NULL; wrptr=NULL; rdptr=NULL; endptr=NULL; owns=false; return code==FXStreamOK; } return false; } // Move to position bool FXStream::position(FXlong offset,FXWhence whence){ if(dir==FXStreamDead){fxerror("FXStream::position: stream is not open.\n");} if(code==FXStreamOK){ if(whence==FXFromCurrent) offset=offset+pos; else if(whence==FXFromEnd) offset=offset+endptr-begptr; pos=offset; return true; } return false; } /****************************** Save Basic Types *****************************/ // Write one byte FXStream& FXStream::operator<<(const FXuchar& v){ if(code==FXStreamOK){ FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); if(wrptr+1>endptr && writeBuffer(1)<1){ code=FXStreamFull; return *this; } FXASSERT(wrptr+1<=endptr); *wrptr++ = v; pos++; } return *this; } // Write one short FXStream& FXStream::operator<<(const FXushort& v){ if(code==FXStreamOK){ FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); if(wrptr+2>endptr && writeBuffer((wrptr-endptr)+2)<2){ code=FXStreamFull; return *this; } FXASSERT(wrptr+2<=endptr); if(swap){ wrptr[0]=((const FXuchar*)&v)[1]; wrptr[1]=((const FXuchar*)&v)[0]; } else{ wrptr[0]=((const FXuchar*)&v)[0]; wrptr[1]=((const FXuchar*)&v)[1]; } wrptr+=2; pos+=2; } return *this; } // Write one int FXStream& FXStream::operator<<(const FXuint& v){ if(code==FXStreamOK){ FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); if(wrptr+4>endptr && writeBuffer((wrptr-endptr)+4)<4){ code=FXStreamFull; return *this; } FXASSERT(wrptr+4<=endptr); if(swap){ wrptr[0]=((const FXuchar*)&v)[3]; wrptr[1]=((const FXuchar*)&v)[2]; wrptr[2]=((const FXuchar*)&v)[1]; wrptr[3]=((const FXuchar*)&v)[0]; } else{ wrptr[0]=((const FXuchar*)&v)[0]; wrptr[1]=((const FXuchar*)&v)[1]; wrptr[2]=((const FXuchar*)&v)[2]; wrptr[3]=((const FXuchar*)&v)[3]; } wrptr+=4; pos+=4; } return *this; } // Write one double FXStream& FXStream::operator<<(const FXdouble& v){ if(code==FXStreamOK){ FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); if(wrptr+8>endptr && writeBuffer((wrptr-endptr)+8)<8){ code=FXStreamFull; return *this; } FXASSERT(wrptr+8<=endptr); if(swap){ wrptr[0]=((const FXuchar*)&v)[7]; wrptr[1]=((const FXuchar*)&v)[6]; wrptr[2]=((const FXuchar*)&v)[5]; wrptr[3]=((const FXuchar*)&v)[4]; wrptr[4]=((const FXuchar*)&v)[3]; wrptr[5]=((const FXuchar*)&v)[2]; wrptr[6]=((const FXuchar*)&v)[1]; wrptr[7]=((const FXuchar*)&v)[0]; } else{ wrptr[0]=((const FXuchar*)&v)[0]; wrptr[1]=((const FXuchar*)&v)[1]; wrptr[2]=((const FXuchar*)&v)[2]; wrptr[3]=((const FXuchar*)&v)[3]; wrptr[4]=((const FXuchar*)&v)[4]; wrptr[5]=((const FXuchar*)&v)[5]; wrptr[6]=((const FXuchar*)&v)[6]; wrptr[7]=((const FXuchar*)&v)[7]; } wrptr+=8; pos+=8; } return *this; } /************************ Save Blocks of Basic Types *************************/ // Write array of bytes FXStream& FXStream::save(const FXuchar* p,FXuval n){ if(code==FXStreamOK){ FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); while(0endptr && writeBuffer((wrptr-endptr)+n)<1){ code=FXStreamFull; return *this; } FXASSERT(wrptrendptr && writeBuffer((wrptr-endptr)+n)<2){ code=FXStreamFull; return *this; } FXASSERT(wrptr+2<=endptr); do{ wrptr[0]=q[1]; wrptr[1]=q[0]; wrptr+=2; pos+=2; q+=2; n-=2; } while(0endptr && writeBuffer((wrptr-endptr)+n)<2){ code=FXStreamFull; return *this; } FXASSERT(wrptr+2<=endptr); do{ wrptr[0]=q[0]; wrptr[1]=q[1]; wrptr+=2; pos+=2; q+=2; n-=2; } while(0endptr && writeBuffer((wrptr-endptr)+n)<4){ code=FXStreamFull; return *this; } FXASSERT(wrptr+4<=endptr); do{ wrptr[0]=q[3]; wrptr[1]=q[2]; wrptr[2]=q[1]; wrptr[3]=q[0]; wrptr+=4; pos+=4; q+=4; n-=4; } while(0endptr && writeBuffer((wrptr-endptr)+n)<4){ code=FXStreamFull; return *this; } FXASSERT(wrptr+4<=endptr); do{ wrptr[0]=q[0]; wrptr[1]=q[1]; wrptr[2]=q[2]; wrptr[3]=q[3]; wrptr+=4; pos+=4; q+=4; n-=4; } while(0endptr && writeBuffer((wrptr-endptr)+n)<8){ code=FXStreamFull; return *this; } FXASSERT(wrptr+8<=endptr); do{ wrptr[0]=q[7]; wrptr[1]=q[6]; wrptr[2]=q[5]; wrptr[3]=q[4]; wrptr[4]=q[3]; wrptr[5]=q[2]; wrptr[6]=q[1]; wrptr[7]=q[0]; wrptr+=8; pos+=8; q+=8; n-=8; } while(0endptr && writeBuffer((wrptr-endptr)+n)<8){ code=FXStreamFull; return *this; } FXASSERT(wrptr+8<=endptr); do{ wrptr[0]=q[0]; wrptr[1]=q[1]; wrptr[2]=q[2]; wrptr[3]=q[3]; wrptr[4]=q[4]; wrptr[5]=q[5]; wrptr[6]=q[6]; wrptr[7]=q[7]; wrptr+=8; pos+=8; q+=8; n-=8; } while(0>(FXuchar& v){ if(code==FXStreamOK){ FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); if(rdptr+1>wrptr && readBuffer(1)<1){ code=FXStreamEnd; return *this; } FXASSERT(rdptr+1<=wrptr); v=*rdptr++; pos++; } return *this; } // Read one short FXStream& FXStream::operator>>(FXushort& v){ if(code==FXStreamOK){ FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); if(rdptr+2>wrptr && readBuffer((rdptr-wrptr)+2)<2){ code=FXStreamEnd; return *this; } FXASSERT(rdptr+2<=wrptr); if(swap){ ((FXuchar*)&v)[1]=rdptr[0]; ((FXuchar*)&v)[0]=rdptr[1]; } else{ ((FXuchar*)&v)[0]=rdptr[0]; ((FXuchar*)&v)[1]=rdptr[1]; } rdptr+=2; pos+=2; } return *this; } // Read one int FXStream& FXStream::operator>>(FXuint& v){ if(code==FXStreamOK){ FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); if(rdptr+4>wrptr && readBuffer((rdptr-wrptr)+4)<4){ code=FXStreamEnd; return *this; } FXASSERT(rdptr+4<=wrptr); if(swap){ ((FXuchar*)&v)[3]=rdptr[0]; ((FXuchar*)&v)[2]=rdptr[1]; ((FXuchar*)&v)[1]=rdptr[2]; ((FXuchar*)&v)[0]=rdptr[3]; } else{ ((FXuchar*)&v)[0]=rdptr[0]; ((FXuchar*)&v)[1]=rdptr[1]; ((FXuchar*)&v)[2]=rdptr[2]; ((FXuchar*)&v)[3]=rdptr[3]; } rdptr+=4; pos+=4; } return *this; } // Read one double FXStream& FXStream::operator>>(FXdouble& v){ if(code==FXStreamOK){ FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); if(rdptr+8>wrptr && readBuffer((rdptr-wrptr)+8)<8){ code=FXStreamEnd; return *this; } FXASSERT(rdptr+8<=wrptr); if(swap){ ((FXuchar*)&v)[7]=rdptr[0]; ((FXuchar*)&v)[6]=rdptr[1]; ((FXuchar*)&v)[5]=rdptr[2]; ((FXuchar*)&v)[4]=rdptr[3]; ((FXuchar*)&v)[3]=rdptr[4]; ((FXuchar*)&v)[2]=rdptr[5]; ((FXuchar*)&v)[1]=rdptr[6]; ((FXuchar*)&v)[0]=rdptr[7]; } else{ ((FXuchar*)&v)[0]=rdptr[0]; ((FXuchar*)&v)[1]=rdptr[1]; ((FXuchar*)&v)[2]=rdptr[2]; ((FXuchar*)&v)[3]=rdptr[3]; ((FXuchar*)&v)[4]=rdptr[4]; ((FXuchar*)&v)[5]=rdptr[5]; ((FXuchar*)&v)[6]=rdptr[6]; ((FXuchar*)&v)[7]=rdptr[7]; } rdptr+=8; pos+=8; } return *this; } /************************ Load Blocks of Basic Types *************************/ // Read array of bytes FXStream& FXStream::load(FXuchar* p,FXuval n){ if(code==FXStreamOK){ FXASSERT(begptr<=rdptr); FXASSERT(rdptr<=wrptr); FXASSERT(wrptr<=endptr); while(0wrptr && readBuffer((rdptr-wrptr)+n)<1){ code=FXStreamEnd; return *this; } FXASSERT(rdptrwrptr && readBuffer((rdptr-wrptr)+n)<2){ code=FXStreamEnd; return *this; } FXASSERT(rdptr+2<=wrptr); do{ q[1]=rdptr[0]; q[0]=rdptr[1]; rdptr+=2; pos+=2; q+=2; n-=2; } while(0wrptr && readBuffer((rdptr-wrptr)+n)<2){ code=FXStreamEnd; return *this; } FXASSERT(rdptr+2<=wrptr); do{ q[0]=rdptr[0]; q[1]=rdptr[1]; rdptr+=2; pos+=2; q+=2; n-=2; } while(0wrptr && readBuffer((rdptr-wrptr)+n)<4){ code=FXStreamEnd; return *this; } FXASSERT(rdptr+4<=wrptr); do{ q[3]=rdptr[0]; q[2]=rdptr[1]; q[1]=rdptr[2]; q[0]=rdptr[3]; rdptr+=4; pos+=4; q+=4; n-=4; } while(0wrptr && readBuffer((rdptr-wrptr)+n)<4){ code=FXStreamEnd; return *this; } FXASSERT(rdptr+4<=wrptr); do{ q[0]=rdptr[0]; q[1]=rdptr[1]; q[2]=rdptr[2]; q[3]=rdptr[3]; rdptr+=4; pos+=4; q+=4; n-=4; } while(0wrptr && readBuffer((rdptr-wrptr)+n)<8){ code=FXStreamEnd; return *this; } FXASSERT(rdptr+4<=wrptr); do{ q[7]=rdptr[0]; q[6]=rdptr[1]; q[5]=rdptr[2]; q[4]=rdptr[3]; q[3]=rdptr[4]; q[2]=rdptr[5]; q[1]=rdptr[6]; q[0]=rdptr[7]; rdptr+=8; pos+=8; q+=8; n-=8; } while(0wrptr && readBuffer((rdptr-wrptr)+n)<8){ code=FXStreamEnd; return *this; } FXASSERT(rdptr+4<=wrptr); do{ q[0]=rdptr[0]; q[1]=rdptr[1]; q[2]=rdptr[2]; q[3]=rdptr[3]; q[4]=rdptr[4]; q[5]=rdptr[5]; q[6]=rdptr[6]; q[7]=rdptr[7]; rdptr+=8; pos+=8; q+=8; n-=8; } while(0getMetaClass(); name=cls->getClassName(); tag=strlen(name)+1; if(tag>MAXCLASSNAME){ // Class name too long code=FXStreamFormat; return *this; } *this << tag; // Save tag *this << zero; save(name,tag); FXTRACE((100,"%08ld: saveObject(%s)\n",(FXuval)pos,v->getClassName())); v->save(*this); } return *this; } /******************************* Load Object *********************************/ // Load object FXStream& FXStream::loadObject(FXObject*& v){ register const FXMetaClass *cls; FXchar name[MAXCLASSNAME+1]; FXuint tag,esc; if(dir!=FXStreamLoad){ fxerror("FXStream::loadObject: wrong stream direction.\n"); } if(code==FXStreamOK){ *this >> tag; if(tag==0){ // Was a NULL v=NULL; return *this; } if(tag>=0x80000000){ v=(FXObject*)hash.find((void*)(FXuval)tag); if(!v){ code=FXStreamFormat; // Bad format in stream } return *this; } if(tag>MAXCLASSNAME){ // Class name too long code=FXStreamFormat; // Bad format in stream return *this; } *this >> esc; // Read escape code if(esc!=0){ // Escape code is wrong code=FXStreamFormat; // Bad format in stream return *this; } load(name,tag); // Load name cls=FXMetaClass::getMetaClassFromName(name); if(cls==NULL){ // No FXMetaClass with this class name code=FXStreamUnknown; // Unknown class return *this; } v=cls->makeInstance(); // Build some object!! hash.insert((void*)(FXuval)seq++,(void*)v); // Add to table FXTRACE((100,"%08ld: loadObject(%s)\n",(FXuval)pos,v->getClassName())); v->load(*this); } return *this; } } fox1.6-1.6.57/src/FXString.cpp000066400000000000000000002150041326741342000156360ustar00rootroot00000000000000/******************************************************************************** * * * S t r i n g O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXString.cpp,v 1.218.2.1 2006/08/15 05:03:16 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "fxunicode.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" /* Notes: - The special pointer-value null represents an empty "" string. - Strings are never NULL:- this speeds things up a lot as there is no need to check for NULL strings anymore. - In the new representation, '\0' is allowed as a character everywhere; but there is always an (uncounted) '\0' at the end. - The length preceeds the text in the buffer. */ // The string buffer is always rounded to a multiple of ROUNDVAL // which must be 2^n. Thus, small size changes will not result in any // actual resizing of the buffer except when ROUNDVAL is exceeded. #define ROUNDVAL 16 // Round up to nearest ROUNDVAL #define ROUNDUP(n) (((n)+ROUNDVAL-1)&-ROUNDVAL) // This will come in handy #define EMPTY ((FXchar*)&emptystring[1]) using namespace FX; /*******************************************************************************/ namespace FX { // For conversion from UTF16 to UTF32 const FXint SURROGATE_OFFSET=0x10000-(0xD800<<10)-0xDC00; // For conversion of UTF32 to UTF16 const FXint LEAD_OFFSET=0xD800-(0x10000>>10); // Empty string static const FXint emptystring[2]={0,0}; // Special NULL string const FXchar FXString::null[4]={0,0,0,0}; // Numbers for hexadecimal const FXchar FXString::hex[17]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f',0}; const FXchar FXString::HEX[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F',0}; // Length of a utf8 character representation const signed char FXString::utfBytes[256]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,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,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 }; /*******************************************************************************/ // Length of wide character string static inline FXint strlen(const FXchar *src){ return ::strlen(src); } // Length of wide character string static inline FXint strlen(const FXwchar *src){ register FXint i=0; while(src[i]) i++; return i; } // Length of narrow character string static inline FXint strlen(const FXnchar *src){ register FXint i=0; while(src[i]) i++; return i; } /*******************************************************************************/ // Return wide character from utf8 string at ptr FXwchar wc(const FXchar *ptr){ register FXwchar w=(FXuchar)ptr[0]; if(0xC0<=w){ w=(w<<6)^(FXuchar)ptr[1]^0x3080; if(0x800<=w){ w=(w<<6)^(FXuchar)ptr[2]^0x20080; if(0x10000<=w){ w=(w<<6)^(FXuchar)ptr[3]^0x400080; if(0x200000<=w){ w=(w<<6)^(FXuchar)ptr[4]^0x8000080; if(0x4000000<=w){ w=(w<<6)^(FXuchar)ptr[5]^0x80; }}}}} return w; } // Return wide character from utf16 string at ptr FXwchar wc(const FXnchar *ptr){ register FXwchar w=ptr[0]; if(0xD800<=w && w<0xDC00){ w=(w<<10)+ptr[1]+SURROGATE_OFFSET; } return w; } // Return number of FXchar's of wide character at ptr FXint wclen(const FXchar *ptr){ return FXString::utfBytes[(FXuchar)ptr[0]]; } // Return number of FXnchar's of narrow character at ptr FXint wclen(const FXnchar *ptr){ return (0xD800<=ptr[0] && ptr[0]<0xDC00) ? 2 : 1; } // Return start of utf8 character containing position FXint wcvalidate(const FXchar* string,FXint pos){ return (pos<=0 || FXISUTF(string[pos]) || --pos<=0 || FXISUTF(string[pos]) || --pos<=0 || FXISUTF(string[pos]) || --pos<=0 || FXISUTF(string[pos]) || --pos<=0 || FXISUTF(string[pos]) || --pos), pos; } // Return start of utf16 character containing position FXint wcvalidate(const FXnchar *string,FXint pos){ return (pos<=0 || !(0xDC00<=string[pos] && string[pos]<=0xDFFF) || --pos), pos; } // Advance to next utf8 character start FXint wcinc(const FXchar* string,FXint pos){ return (string[pos++]==0 || FXISUTF(string[pos]) || string[pos++]==0 || FXISUTF(string[pos]) || string[pos++]==0 || FXISUTF(string[pos]) || string[pos++]==0 || FXISUTF(string[pos]) || string[pos++]==0 || FXISUTF(string[pos]) || ++pos), pos; } // Advance to next utf16 character start FXint wcinc(const FXnchar *string,FXint pos){ return ((0xDC00<=string[++pos] && string[pos]<=0xDFFF) || ++pos),pos; } // Retreat to previous utf8 character start FXint wcdec(const FXchar* string,FXint pos){ return (--pos<=0 || FXISUTF(string[pos]) || --pos<=0 || FXISUTF(string[pos]) || --pos<=0 || FXISUTF(string[pos]) || --pos<=0 || FXISUTF(string[pos]) || --pos<=0 || FXISUTF(string[pos]) || --pos), pos; } // Retreat to previous utf16 character start FXint wcdec(const FXnchar *string,FXint pos){ return (--pos<=0 || !(0xDC00<=string[pos] && string[pos]<=0xDFFF) || --pos), pos; } // Return true if valid utf8 character sequence bool isutfvalid(const FXchar* str){ if((FXuchar)str[0]<0x80) return true; if((FXuchar)str[0]<0xC0) return false; if((FXuchar)str[1]<0x80) return false; if((FXuchar)str[1]>0xBF) return false; if((FXuchar)str[0]<0xE0) return true; if((FXuchar)str[2]<0x80) return false; if((FXuchar)str[2]>0xBF) return false; if((FXuchar)str[0]<0xF0) return true; if((FXuchar)str[3]<0x80) return false; if((FXuchar)str[3]>0xBF) return false; if((FXuchar)str[0]<0xF8) return true; if((FXuchar)str[4]<0x80) return false; if((FXuchar)str[4]>0xBF) return false; if((FXuchar)str[0]<0xFC) return true; if((FXuchar)str[5]<0x80) return false; if((FXuchar)str[5]>0xBF) return false; return true; } // Length of utf8 representation of wide characters string str of length n FXint utfslen(const FXwchar *str,FXint n){ register FXint len=0; register FXint p=0; register FXwchar w; while(p>10)+LEAD_OFFSET; w=(w&0x3FF)+0xDC00; }}} dst[len++]=w; } return len; } // Copy utf8 string to narrow character string dst FXint utf2ncs(FXnchar *dst,const FXchar *src){ return utf2ncs(dst,src,strlen(src)+1); } /*******************************************************************************/ // Copy wide character substring of length n to dst FXint wc2utfs(FXchar* dst,const FXwchar *src,FXint n){ register FXint len=0; register FXint p=0; register FXwchar w; while(p>6)|0xC0; dst[len++]=(w&0x3F)|0x80; continue; } if(w<0x10000){ dst[len++]=(w>>12)|0xE0; dst[len++]=((w>>6)&0x3F)|0x80; dst[len++]=(w&0x3F)|0x80; continue; } if(w<0x200000){ dst[len++]=(w>>18)|0xF0; dst[len++]=((w>>12)&0x3F)|0x80; dst[len++]=((w>>6)&0x3F)|0x80; dst[len++]=(w&0x3F)|0x80; continue; } if(w<0x4000000){ dst[len++]=(w>>24)|0xF8; dst[len++]=((w>>18)&0x3F)|0x80; dst[len++]=((w>>12)&0x3F)|0x80; dst[len++]=((w>>6)&0x3F)|0x80; dst[len++]=(w&0x3F)|0x80; continue; } dst[len++]=(w>>30)|0xFC; dst[len++]=((w>>24)&0X3F)|0x80; dst[len++]=((w>>18)&0X3F)|0x80; dst[len++]=((w>>12)&0X3F)|0x80; dst[len++]=((w>>6)&0X3F)|0x80; dst[len++]=(w&0X3F)|0x80; } return len; } // Copy wide character string to dst FXint wc2utfs(FXchar* dst,const FXwchar *src){ return wc2utfs(dst,src,strlen(src)+1); } // Copy narrow character substring of length n to dst // Test for surrogates is deferred till code possibly exceeds 0xD800 FXint nc2utfs(FXchar* dst,const FXnchar *src,FXint n){ register FXint len=0; register FXint p=0; register FXwchar w; while(p>6)|0xC0; dst[len++]=(w&0x3F)|0x80; continue; } if(0xD800<=w && w<0xDC00 && p>12)|0xE0; dst[len++]=((w>>6)&0x3F)|0x80; dst[len++]=(w&0x3F)|0x80; continue; } if(w<0x200000){ dst[len++]=(w>>18)|0xF0; dst[len++]=((w>>12)&0x3F)|0x80; dst[len++]=((w>>6)&0x3F)|0x80; dst[len++]=(w&0x3F)|0x80; continue; } if(w<0x4000000){ dst[len++]=(w>>24)|0xF8; dst[len++]=((w>>18)&0x3F)|0x80; dst[len++]=((w>>12)&0x3F)|0x80; dst[len++]=((w>>6)&0x3F)|0x80; dst[len++]=(w&0x3F)|0x80; continue; } dst[len++]=(w>>30)|0xFC; dst[len++]=((w>>24)&0X3F)|0x80; dst[len++]=((w>>18)&0X3F)|0x80; dst[len++]=((w>>12)&0X3F)|0x80; dst[len++]=((w>>6)&0X3F)|0x80; dst[len++]=(w&0X3F)|0x80; } return len; } // Copy narrow character string to dst FXint nc2utfs(FXchar* dst,const FXnchar *src){ return nc2utfs(dst,src,strlen(src)+1); } /*******************************************************************************/ // Change the length of the string to len void FXString::length(FXint len){ if(*(((FXint*)str)-1)!=len){ if(0=0){ if(delim[i]==c){ if(--start==0) goto a; break; } } } } a:e=s; if(0=0){ if(delim[i]==c){ if(--num==0) goto b; break; } } ++e; } } b:return FXString(str+s,e-s); } // Return partition of string separated by delimiters in delim FXString FXString::section(const FXchar* delim,FXint start,FXint num) const { return section(delim,strlen(delim),start,num); } // Return partition of string separated by delimiters in delim FXString FXString::section(const FXString& delim,FXint start,FXint num) const { return section(delim.text(),delim.length(),start,num); } // Adopt string s, leaving s empty FXString& FXString::adopt(FXString& s){ if(this!=&s){ if(str!=EMPTY){ free(str-sizeof(FXint)); } str=s.str; s.str=EMPTY; } return *this; } // Assign input character to this string FXString& FXString::assign(FXchar c){ length(1); str[0]=c; return *this; } // Assign input n characters c to this string FXString& FXString::assign(FXchar c,FXint n){ length(n); memset(str,c,n); return *this; } // Assign first n characters of input string to this string FXString& FXString::assign(const FXchar* s,FXint n){ if(s && 0=len){ str[len]=c; } else{ memmove(str+pos+1,str+pos,len-pos); str[pos]=c; } return *this; } // Insert n characters c at specified position FXString& FXString::insert(FXint pos,FXchar c,FXint n){ if(0=len){ memset(str+len,c,n); } else{ memmove(str+pos+n,str+pos,len-pos); memset(str+pos,c,n); } } return *this; } // Insert string at position FXString& FXString::insert(FXint pos,const FXchar* s,FXint n){ if(s && 0=len){ memcpy(str+len,s,n); } else{ memmove(str+pos+n,str+pos,len-pos); memcpy(str+pos,s,n); } } return *this; } // Insert wide character string at position FXString& FXString::insert(FXint pos,const FXwchar* s,FXint m){ if(s && 0=len){ wc2utfs(str+len,s,m); } else{ memmove(str+pos+n,str+pos,len-pos); wc2utfs(str+pos,s,m); } } return *this; } // Insert narrow character string at position FXString& FXString::insert(FXint pos,const FXnchar* s,FXint m){ if(s && 0=len){ nc2utfs(str+len,s,m); } else{ memmove(str+pos+n,str+pos,len-pos); nc2utfs(str+pos,s,m); } } return *this; } // Insert string at position FXString& FXString::insert(FXint pos,const FXchar* s){ if(s && s[0]){ register FXint len=length(); register FXint n=strlen(s); length(len+n); if(pos<=0){ memmove(str+n,str,len); memcpy(str,s,n); } else if(pos>=len){ memcpy(str+len,s,n); } else{ memmove(str+pos+n,str+pos,len-pos); memcpy(str+pos,s,n); } } return *this; } // Insert wide character string at position FXString& FXString::insert(FXint pos,const FXwchar* s){ if(s && s[0]){ register FXint len=length(); register FXint n=utfslen(s); length(len+n); if(pos<=0){ memmove(str+n,str,len); wc2utfs(str,s); } else if(pos>=len){ wc2utfs(str+len,s); } else{ memmove(str+pos+n,str+pos,len-pos); wc2utfs(str+pos,s); } } return *this; } // Insert narrow character string at position FXString& FXString::insert(FXint pos,const FXnchar* s){ if(s && s[0]){ register FXint len=length(); register FXint n=utfslen(s); length(len+n); if(pos<=0){ memmove(str+n,str,len); nc2utfs(str,s); } else if(pos>=len){ nc2utfs(str+len,s); } else{ memmove(str+pos+n,str+pos,len-pos); nc2utfs(str+pos,s); } } return *this; } // Insert string at position FXString& FXString::insert(FXint pos,const FXString& s){ return insert(pos,s.str,s.length()); } // Append character c to this string FXString& FXString::append(FXchar c){ register FXint len=length(); length(len+1); str[len]=c; return *this; } // Append n characters c to this string FXString& FXString::append(FXchar c,FXint n){ if(0=len){ length(len+1); str[len]=c; } else{ str[pos]=c; } return *this; } // Replace the m characters at pos with n characters c FXString& FXString::replace(FXint pos,FXint m,FXchar c,FXint n){ register FXint len=length(); if(pos<0){ m+=pos; if(m<0) m=0; pos=0; } if(pos+m>len){ if(pos>len) pos=len; m=len-pos; } if(mn){ memmove(str+pos+n,str+pos+m,len-pos-m); length(len+n-m); } memset(str+pos,c,n); return *this; } // Replace part of string FXString& FXString::replace(FXint pos,FXint m,const FXchar* s,FXint n){ register FXint len=length(); if(pos<0){ m+=pos; if(m<0) m=0; pos=0; } if(pos+m>len){ if(pos>len) pos=len; m=len-pos; } if(mn){ memmove(str+pos+n,str+pos+m,len-pos-m); length(len+n-m); } memcpy(str+pos,s,n); return *this; } // Replace part of wide character string FXString& FXString::replace(FXint pos,FXint m,const FXwchar* s,FXint n){ register FXint w=utfslen(s,n); register FXint len=length(); if(pos<0){ m+=pos; if(m<0) m=0; pos=0; } if(pos+m>len){ if(pos>len) pos=len; m=len-pos; } if(mw){ memmove(str+pos+w,str+pos+m,len-pos-m); length(len+w-m); } wc2utfs(str+pos,s,n); return *this; } // Replace part of narrow character string FXString& FXString::replace(FXint pos,FXint m,const FXnchar* s,FXint n){ register FXint w=utfslen(s,n); register FXint len=length(); if(pos<0){ m+=pos; if(m<0) m=0; pos=0; } if(pos+m>len){ if(pos>len) pos=len; m=len-pos; } if(mw){ memmove(str+pos+w,str+pos+m,len-pos-m); length(len+w-m); } nc2utfs(str+pos,s,n); return *this; } // Replace part of string FXString& FXString::replace(FXint pos,FXint m,const FXchar* s){ return replace(pos,m,s,strlen(s)); } // Replace part of string FXString& FXString::replace(FXint pos,FXint m,const FXwchar* s){ return replace(pos,m,s,strlen(s)); } // Replace part of string FXString& FXString::replace(FXint pos,FXint m,const FXnchar* s){ return replace(pos,m,s,strlen(s)); } // Replace part of string FXString& FXString::replace(FXint pos,FXint m,const FXString& s){ return replace(pos,m,s.str,s.length()); } // Move range of m characters from src position to dst position FXString& FXString::move(FXint dst,FXint src,FXint n){ register FXint len=length(); if(0len){ // Move beyond end if(dst>len) dst=len; length(dst+n); memmove(str+dst,str+src,n); } else{ memmove(str+dst,str+src,n); // Move inside } } return *this; } // Remove one character FXString& FXString::erase(FXint pos){ register FXint len=length(); if(0<=pos && pos0){ if(pos<0){n+=pos;pos=0;} if(pos+n>len){n=len-pos;} memmove(str+pos,str+pos+n,len-pos-n); length(len-n); } } return *this; } // Return number of occurrences of ch in string FXint FXString::contains(FXchar ch) const { register FXint len=length(); register FXint c=ch; register FXint m=0; register FXint i=0; while(i=e) break; str[d++]=' '; } length(d); } return *this; } // Remove leading and trailing whitespace FXString& FXString::trim(){ if(str!=EMPTY){ register FXint s=0; register FXint e=length(); while(0len) pos=len; length(pos); return *this; } // Clean string FXString& FXString::clear(){ length(0); return *this; } // Get leftmost part FXString FXString::left(FXint n) const { if(0len) n=len; return FXString(str,n); } return FXString::null; } // Get rightmost part FXString FXString::right(FXint n) const { if(0len) n=len; return FXString(str+len-n,n); } return FXString::null; } // Get some part in the middle FXString FXString::mid(FXint pos,FXint n) const { if(00){ if(pos<0){n+=pos;pos=0;} if(pos+n>len){n=len-pos;} return FXString(str+pos,n); } } return FXString::null; } // Return all characters before the nth occurrence of ch, searching forward FXString FXString::before(FXchar c,FXint n) const { register FXint len=length(); register FXint p=0; if(0 0x80 // so fold using Ascii [leaving upper 128 codes invariant], and // compare; they will be unequal so we'll fall out of the loop. // o Both characters are wide. This is the complex case, and // here we have to obtain the wide character, convert to lower // case using the Unicode, and compare. Skip to the start of // the next character by consulting character-width table. FXint comparecase(const FXchar* s1,const FXchar* s2){ register FXint c1,c2; do{ if((*s1 & 0x80) && (*s2 & 0x80)){ c1=Unicode::toLower(wc(s1)); s1+=wclen(s1); c2=Unicode::toLower(wc(s2)); s2+=wclen(s2); } else{ c1=Ascii::toLower(*s1); s1+=1; c2=Ascii::toLower(*s2); s2+=1; } } while(c1 && (c1==c2)); return c1-c2; } // Compare strings case insensitive up to n FXint comparecase(const FXchar* s1,const FXchar* s2,FXint n){ register FXint c1,c2; if(0(const FXString& s1,const FXString& s2){ return compare(s1.str,s2.str)>0; } bool operator>(const FXString& s1,const FXchar* s2){ return compare(s1.str,s2)>0; } bool operator>(const FXchar* s1,const FXString& s2){ return compare(s1,s2.str)>0; } bool operator>=(const FXString& s1,const FXString& s2){ return compare(s1.str,s2.str)>=0; } bool operator>=(const FXString& s1,const FXchar* s2){ return compare(s1.str,s2)>=0; } bool operator>=(const FXchar* s1,const FXString& s2){ return compare(s1,s2.str)>=0; } // Find n-th occurrence of character, searching forward; return position or -1 FXint FXString::find(FXchar c,FXint pos,FXint n) const { register FXint len=length(); register FXint p=pos; register FXint cc=c; if(p<0) p=0; if(n<=0) return p; while(p=len) p=len-1; if(n<=0) return p; while(0<=p){ if(str[p]==cc){ if(--n==0) return p; } --p; } return -1; } // Find a character, searching forward; return position or -1 FXint FXString::find(FXchar c,FXint pos) const { register FXint len=length(); register FXint p=pos; register FXint cc=c; if(p<0) p=0; while(p=len) p=len-1; while(0<=p){ if(str[p]==cc){ return p; } --p; } return -1; } // Find a substring of length n, searching forward; return position or -1 FXint FXString::find(const FXchar* substr,FXint n,FXint pos) const { register FXint len=length(); if(0<=pos && 0len) pos=len; while(0<=pos){ if(str[pos]==c){ if(!compare(str+pos,substr,n)){ return pos; } } pos--; } } return -1; } // Find a substring, searching backward; return position or -1 FXint FXString::rfind(const FXchar* substr,FXint pos) const { return rfind(substr,strlen(substr),pos); } // Find a substring, searching backward; return position or -1 FXint FXString::rfind(const FXString& substr,FXint pos) const { return rfind(substr.text(),substr.length(),pos); } // Find first character in the set of size n, starting from pos; return position or -1 FXint FXString::find_first_of(const FXchar* set,FXint n,FXint pos) const { register FXint len=length(); register FXint p=pos; if(p<0) p=0; while(p=0){ if(set[i]==c) return p; } p++; } return -1; } // Find first character in the set, starting from pos; return position or -1 FXint FXString::find_first_of(const FXchar* set,FXint pos) const { return find_first_of(set,strlen(set),pos); } // Find first character in the set, starting from pos; return position or -1 FXint FXString::find_first_of(const FXString& set,FXint pos) const { return find_first_of(set.text(),set.length(),pos); } // Find first character, starting from pos; return position or -1 FXint FXString::find_first_of(FXchar c,FXint pos) const { register FXint len=length(); register FXint p=pos; register FXint cc=c; if(p<0) p=0; while(p=len) p=len-1; while(0<=p){ register FXint c=str[p]; register FXint i=n; while(--i>=0){ if(set[i]==c) return p; } p--; } return -1; } // Find last character in the set, starting from pos; return position or -1 FXint FXString::find_last_of(const FXchar* set,FXint pos) const { return find_last_of(set,strlen(set),pos); } // Find last character in the set, starting from pos; return position or -1 FXint FXString::find_last_of(const FXString& set,FXint pos) const { return find_last_of(set.text(),set.length(),pos); } // Find last character, starting from pos; return position or -1 FXint FXString::find_last_of(FXchar c,FXint pos) const { register FXint len=length(); register FXint p=pos; register FXint cc=c; if(p>=len) p=len-1; while(0<=p){ if(str[p]==cc){ return p; } p--; } return -1; } // Find first character NOT in the set of size n, starting from pos; return position or -1 FXint FXString::find_first_not_of(const FXchar* set,FXint n,FXint pos) const { register FXint len=length(); register FXint p=pos; if(p<0) p=0; while(p=0){ if(set[i]==c) goto x; } return p; x: p++; } return -1; } // Find first character NOT in the set, starting from pos; return position or -1 FXint FXString::find_first_not_of(const FXchar* set,FXint pos) const { return find_first_not_of(set,strlen(set),pos); } // Find first character NOT in the set, starting from pos; return position or -1 FXint FXString::find_first_not_of(const FXString& set,FXint pos) const { return find_first_not_of(set.text(),set.length(),pos); } // Find first character NOT equal to c, starting from pos; return position or -1 FXint FXString::find_first_not_of(FXchar c,FXint pos) const { register FXint len=length(); register FXint p=pos; register FXint cc=c; if(p<0) p=0; while(p=len) p=len-1; while(0<=p){ register FXint c=str[p]; register FXint i=n; while(--i>=0){ if(set[i]==c) goto x; } return p; x: p--; } return -1; } // Find last character NOT in the set, starting from pos; return position or -1 FXint FXString::find_last_not_of(const FXchar* set,FXint pos) const { return find_last_not_of(set,strlen(set),pos); } // Find last character NOT in the set, starting from pos; return position or -1 FXint FXString::find_last_not_of(const FXString& set,FXint pos) const { return find_last_not_of(set.text(),set.length(),pos); } // Find last character NOT equal to c, starting from pos; return position or -1 FXint FXString::find_last_not_of(FXchar c,FXint pos) const { register FXint len=length(); register FXint p=pos; register FXint cc=c; if(p>=len) p=len-1; while(0<=p){ if(str[p]!=cc){ return p; } p--; } return -1; } // Get hash value FXuint FXString::hash() const { register FXint len=length(); register FXuint h=0; for(register FXint i=0; i>(FXStream& store,FXString& s){ // Note stream format incompatible with FOX 1.0 FXint len; store >> len; s.length(len); store.load(s.str,len); return store; } #ifdef WIN32 #ifndef va_copy #define va_copy(arg,list) ((arg)=(list)) #endif #endif // Print formatted string a-la vprintf FXString& FXString::vformat(const FXchar* fmt,va_list args){ FXint result=0; if(fmt && *fmt){ #if (_MSC_VER > 1300) // Have _vscprintf() va_list ag; va_copy(ag,args); result=_vscprintf(fmt,ag); va_end(ag); length(result); vsnprintf(str,length()+1,fmt,args); #elif defined(HAVE_VSNPRINTF) // Have vsnprintf() #if (__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1)) va_list ag; va_copy(ag,args); result=vsnprintf(str,empty()?0:length()+1,fmt,ag); va_end(ag); if(length()16){ fxerror("FXStringVal: base out of range.\n"); } if(num<0){nn=(FXulong)(~num)+1;} do{ *--p=FXString::HEX[nn%base]; nn/=base; } while(nn); if(num<0) *--p='-'; FXASSERT(buf<=p); return FXString(p,buf+66-p); } // Conversion of unsigned long to string FXString FXStringVal(FXulong num,FXint base){ FXchar buf[66]; register FXchar *p=buf+66; register FXulong nn=num; if(base<2 || base>16){ fxerror("FXStringVal: base out of range.\n"); } do{ *--p=FXString::HEX[nn%base]; nn/=base; } while(nn); FXASSERT(buf<=p); return FXString(p,buf+66-p); } // Conversion of integer to string FXString FXStringVal(FXint num,FXint base){ FXchar buf[34]; register FXchar *p=buf+34; register FXuint nn=(FXuint)num; if(base<2 || base>16){ fxerror("FXStringVal: base out of range.\n"); } if(num<0){nn=(FXuint)(~num)+1;} do{ *--p=FXString::HEX[nn%base]; nn/=base; } while(nn); if(num<0) *--p='-'; FXASSERT(buf<=p); return FXString(p,buf+34-p); } // Conversion of unsigned integer to string FXString FXStringVal(FXuint num,FXint base){ FXchar buf[34]; register FXchar *p=buf+34; register FXuint nn=num; if(base<2 || base>16){ fxerror("FXStringVal: base out of range.\n"); } do{ *--p=FXString::HEX[nn%base]; nn/=base; } while(nn); FXASSERT(buf<=p); return FXString(p,buf+34-p); } // Formatting for reals static const char *const expo[]={"%.*f","%.*E","%.*G"}; // Conversion of float to string FXString FXStringVal(FXfloat num,FXint prec,FXint exp){ return FXStringFormat(expo[exp],prec,num); } // Conversion of double to string FXString FXStringVal(FXdouble num,FXint prec,FXint exp){ return FXStringFormat(expo[exp],prec,num); } #ifndef HAVE_STRTOLL extern "C" FXlong strtoll(const char *nptr, char **endptr, int base); #endif #ifndef HAVE_STRTOULL extern "C" FXulong strtoull(const char *nptr, char **endptr, int base); #endif // Conversion of string to integer FXlong FXLongVal(const FXString& s,FXint base){ return (FXlong)strtoll(s.str,NULL,base); } // Conversion of string to unsigned integer FXulong FXULongVal(const FXString& s,FXint base){ return (FXulong)strtoull(s.str,NULL,base); } // Conversion of string to integer FXint FXIntVal(const FXString& s,FXint base){ return (FXint)strtol(s.str,NULL,base); } // Conversion of string to unsigned integer FXuint FXUIntVal(const FXString& s,FXint base){ return (FXuint)strtoul(s.str,NULL,base); } // Conversion of string to float FXfloat FXFloatVal(const FXString& s){ return (FXfloat)strtod(s.str,NULL); } // Conversion of string to double FXdouble FXDoubleVal(const FXString& s){ return strtod(s.str,NULL); } // Return utf8 from ascii containing unicode escapes FXString fromAscii(const FXString& s){ register FXint p=0; FXString result; FXwchar c; while(p>12)&15]); result.append(FXString::HEX[(c>>8)&15]); result.append(FXString::HEX[(c>>4)&15]); c=FXString::HEX[c&15]; } result.append(c); p+=s.extent(p); } return result; } // Escape special characters in a string FXString escape(const FXString& s){ register FXint p=0; register FXint c; FXString result; while(p>4)&15]); result.append(FXString::HEX[c&15]); } break; } } return result; } // Unescape special characters in a string FXString unescape(const FXString& s){ register FXint p=0; register FXint c; FXString result; while(p=kind){ register FXint p=0; register FXint n=0; while(pcs){ result[p]=us; result[p+1]=uf; if(p>0) p--; continue; } // Already in right order; advance by one p++; } return result; } // Compose characters from canonical/compatible decomposition static FXint compose(FXwchar* result,FXint len){ register FXint p,q,cc,starterpos,startercc; register FXwchar w; if(0rect.x,ev->rect.y,ev->rect.w,ev->rect.h); drawFrame(dc,0,0,width,height); return 1; } // Update value from a message long FXSwitcher::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCurrent((FXint)(FXuval)ptr); return 1; } // Update value from a message long FXSwitcher::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setCurrent(*((FXint*)ptr)); return 1; } // Obtain value from text field long FXSwitcher::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getCurrent(); return 1; } // Bring nth to the top long FXSwitcher::onCmdOpen(FXObject*,FXSelector sel,void*){ setCurrent(FXSELID(sel)-ID_OPEN_FIRST,TRUE); return 1; } // Update the nth button long FXSwitcher::onUpdOpen(FXObject* sender,FXSelector sel,void* ptr){ sender->handle(this,((FXSELID(sel)-ID_OPEN_FIRST)==current) ? FXSEL(SEL_COMMAND,ID_CHECK) : FXSEL(SEL_COMMAND,ID_UNCHECK),ptr); return 1; } // Get maximum child width FXint FXSwitcher::getDefaultWidth(){ register FXWindow* child; register FXint i,w,wmax=0,wcur=0; for(i=0,child=getFirst(); child; child=child->getNext(),i++){ if(i==current) wcur=child->getDefaultWidth(); if(wmax<(w=child->getDefaultWidth())) wmax=w; } if(options&SWITCHER_HCOLLAPSE) wmax=wcur; return padleft+padright+(border<<1)+wmax; } // Get maximum child height FXint FXSwitcher::getDefaultHeight(){ register FXWindow* child; register FXint i,h,hmax=0,hcur=0; for(i=0,child=getFirst(); child; child=child->getNext(),i++){ if(i==current) hcur=child->getDefaultHeight(); if(hmax<(h=child->getDefaultHeight())) hmax=h; } if(options&SWITCHER_VCOLLAPSE) hmax=hcur; return padtop+padbottom+(border<<1)+hmax; } // Recalculate layout void FXSwitcher::layout(){ register FXWindow *child; register FXint i,x,y,w,h; x=border+padleft; y=border+padtop; w=width-padright-padleft-(border<<1); h=height-padtop-padbottom-(border<<1); for(i=0,child=getFirst(); child; child=child->getNext(),i++){ child->position(x,y,w,h); if(i==current){ child->show(); } else{ child->hide(); } } flags&=~FLAG_DIRTY; } // Set current subwindow void FXSwitcher::setCurrent(FXint panel,FXbool notify){ if(0<=panel && paneltryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)current); } } } // Set switcher style void FXSwitcher::setSwitcherStyle(FXuint style){ FXuint opts=(options&~SWITCHER_MASK) | (style&SWITCHER_MASK); if(options!=opts){ options=opts; recalc(); } } // Get switcher style FXuint FXSwitcher::getSwitcherStyle() const { return (options&SWITCHER_MASK); } // Save object to stream void FXSwitcher::save(FXStream& store) const { FXPacker::save(store); store << current; } // Load object from stream void FXSwitcher::load(FXStream& store){ FXPacker::load(store); store >> current; } } fox1.6-1.6.57/src/FXSystem.cpp000066400000000000000000000273671326741342000156710ustar00rootroot00000000000000/******************************************************************************** * * * M i s c e l l a n e o u s S y s t e m F u n c t i o n s * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXSystem.cpp,v 1.18.2.1 2006/08/09 01:55:08 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxascii.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXIO.h" #include "FXSystem.h" #include "FXStat.h" /* Notes: - A bric-a-brack of various functions we could not place anywhere else. */ #ifndef TIMEFORMAT #define TIMEFORMAT "%m/%d/%Y %H:%M:%S" #endif using namespace FX; /*******************************************************************************/ namespace FX { // Return current time FXTime FXSystem::now(){ return (FXTime)::time(NULL); } // Convert file time to string FXString FXSystem::time(FXTime value){ return FXSystem::time(TIMEFORMAT,value); } // Convert file time to string as per strftime format FXString FXSystem::time(const FXchar *format,FXTime filetime){ #ifndef WIN32 #if defined(FOX_THREAD_SAFE) && !defined(__FreeBSD__) && !defined(__OpenBSD__) time_t tmp=(time_t)FXMAX(filetime,0); struct tm tmresult; FXchar buffer[512]; FXint len=strftime(buffer,sizeof(buffer),format,localtime_r(&tmp,&tmresult)); return FXString(buffer,len); #else time_t tmp=(time_t)FXMAX(filetime,0); FXchar buffer[512]; FXint len=strftime(buffer,sizeof(buffer),format,localtime(&tmp)); return FXString(buffer,len); #endif #else time_t tmp=(time_t)FXMAX(filetime,0); FXchar buffer[512]; FXint len=strftime(buffer,sizeof(buffer),format,localtime(&tmp)); return FXString(buffer,len); #endif } // Get effective user id FXuint FXSystem::user(){ #ifndef WIN32 return geteuid(); #else return 0; #endif } // Get effective group id FXuint FXSystem::group(){ #ifndef WIN32 return getegid(); #else return 0; #endif } // Return owner name from uid FXString FXSystem::userName(FXuint uid){ FXchar result[64]; #ifndef WIN32 #if defined(FOX_THREAD_SAFE) && !defined(__FreeBSD__) && !defined(__OpenBSD__) struct passwd pwdresult,*pwd; char buffer[1024]; if(getpwuid_r(uid,&pwdresult,buffer,sizeof(buffer),&pwd)==0 && pwd) return pwd->pw_name; #else struct passwd *pwd=getpwuid(uid); if(pwd) return pwd->pw_name; #endif #endif sprintf(result,"%u",uid); return result; } // Return group name from gid FXString FXSystem::groupName(FXuint gid){ FXchar result[64]; #ifndef WIN32 #if defined(FOX_THREAD_SAFE) && !defined(__FreeBSD__) && !defined(__OpenBSD__) ::group grpresult; ::group *grp; char buffer[1024]; if(getgrgid_r(gid,&grpresult,buffer,sizeof(buffer),&grp)==0 && grp) return grp->gr_name; #else ::group *grp=getgrgid(gid); if(grp) return grp->gr_name; #endif #endif sprintf(result,"%u",gid); return result; } // Get current user name FXString FXSystem::currentUserName(){ #ifndef WIN32 #if defined(FOX_THREAD_SAFE) && !defined(__FreeBSD__) && !defined(__OpenBSD__) struct passwd pwdresult,*pwd; char buffer[1024]; if(getpwuid_r(geteuid(),&pwdresult,buffer,sizeof(buffer),&pwd)==0 && pwd) return pwd->pw_name; #else struct passwd *pwd=getpwuid(geteuid()); if(pwd) return pwd->pw_name; #endif #else TCHAR buffer[MAXPATHLEN]; DWORD size=MAXPATHLEN; if(GetUserName(buffer,&size)) return buffer; #endif return FXString::null; } // Get current effective group name FXString FXSystem::currentGroupName(){ #ifndef WIN32 #if defined(FOX_THREAD_SAFE) && !defined(__FreeBSD__) && !defined(__OpenBSD__) ::group grpresult; ::group *grp; char buffer[1024]; if(getgrgid_r(getegid(),&grpresult,buffer,sizeof(buffer),&grp)==0 && grp) return grp->gr_name; #else ::group *grp=getgrgid(getegid()); if(grp) return grp->gr_name; #endif #endif return FXString::null; } // Return permissions string FXString FXSystem::modeString(FXuint mode){ FXchar result[11]; result[0]=(mode&FXIO::SymLink) ? 'l' : (mode&FXIO::File) ? '-' : (mode&FXIO::Directory) ? 'd' : (mode&FXIO::Character) ? 'c' : (mode&FXIO::Block) ? 'b' : (mode&FXIO::Fifo) ? 'p' : (mode&FXIO::Socket) ? 's' : '?'; result[1]=(mode&FXIO::OwnerRead) ? 'r' : '-'; result[2]=(mode&FXIO::OwnerWrite) ? 'w' : '-'; result[3]=(mode&FXIO::SetUser) ? 's' : (mode&FXIO::OwnerExec) ? 'x' : '-'; result[4]=(mode&FXIO::GroupRead) ? 'r' : '-'; result[5]=(mode&FXIO::GroupWrite) ? 'w' : '-'; result[6]=(mode&FXIO::SetGroup) ? 's' : (mode&FXIO::GroupExec) ? 'x' : '-'; result[7]=(mode&FXIO::OtherRead) ? 'r' : '-'; result[8]=(mode&FXIO::OtherWrite) ? 'w' : '-'; result[9]=(mode&FXIO::Sticky) ? 't' : (mode&FXIO::OtherExec) ? 'x' : '-'; result[10]=0; return result; } // Return value of environment variable name FXString FXSystem::getEnvironment(const FXString& name){ if(!name.empty()){ #ifndef WIN32 return FXString(getenv(name.text())); #else FXchar value[1024]; DWORD len=GetEnvironmentVariableA(name.text(),value,1024); return FXString(value,len); #endif } return FXString::null; } // Change value of environment variable name bool FXSystem::setEnvironment(const FXString& name,const FXString& value){ if(!name.empty()){ #ifndef WIN32 #ifdef __GNU_LIBRARY__ if(!value.empty()){ return setenv(name.text(),value.text(),TRUE)==0; } unsetenv(name.text()); return true; #endif #else if(!value.empty()){ return SetEnvironmentVariableA(name.text(),value.text())!=0; } return SetEnvironmentVariableA(name.text(),NULL)!=0; #endif } return false; } // Get current working directory FXString FXSystem::getCurrentDirectory(){ #ifndef WIN32 FXchar buffer[MAXPATHLEN]; if(getcwd(buffer,MAXPATHLEN)) return buffer; #else TCHAR buffer[MAXPATHLEN]; if(GetCurrentDirectory(MAXPATHLEN,buffer)) return buffer; #endif return FXString::null; } // Change current directory FXbool FXSystem::setCurrentDirectory(const FXString& path){ if(!path.empty()){ #ifdef WIN32 #ifdef UNICODE TCHAR buffer[MAXPATHLEN]; utf2ncs(buffer,path.text(),path.length()+1); return SetCurrentDirectory(buffer); #else return SetCurrentDirectory(path.text()); #endif #else return chdir(path.text())==0; #endif } return FALSE; } // Get current drive prefix "a:", if any // This is the same method as used in VC++ CRT. FXString FXSystem::getCurrentDrive(){ #ifdef WIN32 FXchar buffer[MAXPATHLEN]; if(GetCurrentDirectoryA(MAXPATHLEN,buffer) && Ascii::isLetter((FXuchar)buffer[0]) && buffer[1]==':') return FXString(buffer,2); #endif return FXString::null; } #ifdef WIN32 // Change current drive prefix "a:" // This is the same method as used in VC++ CRT. FXbool FXSystem::setCurrentDrive(const FXString& prefix){ FXchar buffer[3]; if(!prefix.empty() && Ascii::isLetter(prefix[0]) && prefix[1]==':'){ buffer[0]=prefix[0]; buffer[1]=':'; buffer[2]='\0'; return SetCurrentDirectoryA(buffer); } return FALSE; } #else // Change current drive prefix "a:" FXbool FXSystem::setCurrentDrive(const FXString&){ return TRUE; } #endif // Get executable path FXString FXSystem::getExecPath(){ return FXString(getenv("PATH")); } // Return the home directory for the current user. FXString FXSystem::getHomeDirectory(){ return FXSystem::getUserDirectory(FXString::null); } // Get home directory for a given user FXString FXSystem::getUserDirectory(const FXString& user){ #ifndef WIN32 #if defined(FOX_THREAD_SAFE) && !defined(__FreeBSD__) && !defined(__OpenBSD__) struct passwd pwdresult,*pwd; char buffer[1024]; if(user.empty()){ register const FXchar* str; if((str=getenv("HOME"))!=NULL) return str; if((str=getenv("USER"))!=NULL || (str=getenv("LOGNAME"))!=NULL){ if(getpwnam_r(str,&pwdresult,buffer,sizeof(buffer),&pwd)==0 && pwd) return pwd->pw_dir; } if(getpwuid_r(getuid(),&pwdresult,buffer,sizeof(buffer),&pwd)==0 && pwd) return pwd->pw_dir; return PATHSEPSTRING; } if(getpwnam_r(user.text(),&pwdresult,buffer,sizeof(buffer),&pwd)==0 && pwd) return pwd->pw_dir; return PATHSEPSTRING; #else register struct passwd *pwd; if(user.empty()){ register const FXchar* str; if((str=getenv("HOME"))!=NULL) return str; if((str=getenv("USER"))!=NULL || (str=getenv("LOGNAME"))!=NULL){ if((pwd=getpwnam(str))!=NULL) return pwd->pw_dir; } if((pwd=getpwuid(getuid()))!=NULL) return pwd->pw_dir; return PATHSEPSTRING; } if((pwd=getpwnam(user.text()))!=NULL) return pwd->pw_dir; return PATHSEPSTRING; #endif #else if(user.empty()){ register const FXchar *str1,*str2; FXchar home[MAXPATHLEN]; DWORD size=MAXPATHLEN; HKEY hKey; LONG result; if((str1=getenv("USERPROFILE"))!=NULL) return str1; // Daniël Hörchner if((str1=getenv("HOME"))!=NULL) return str1; if((str2=getenv("HOMEPATH"))!=NULL){ // This should be good for WinNT, Win2K according to MSDN if((str1=getenv("HOMEDRIVE"))==NULL) str1="c:"; strncpy(home,str1,MAXPATHLEN); strncat(home,str2,MAXPATHLEN); return home; } // FXchar buffer[MAX_PATH] // if(SHGetFolderPath(NULL,CSIDL_PERSONAL|CSIDL_FLAG_CREATE,NULL,O,buffer)==S_OK){ // return buffer; // } if(RegOpenKeyExA(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",0,KEY_READ,&hKey)==ERROR_SUCCESS){ result=RegQueryValueExA(hKey,"Personal",NULL,NULL,(LPBYTE)home,&size); // Change "Personal" to "Desktop" if you want... RegCloseKey(hKey); if(result==ERROR_SUCCESS) return home; } return "c:" PATHSEPSTRING; } return "c:" PATHSEPSTRING; #endif } // Return temporary directory. FXString FXSystem::getTempDirectory(){ #ifndef WIN32 const FXchar* dir; if((dir=getenv("TMPDIR"))!=NULL){ return FXString(dir); } return FXString("/tmp"); #else TCHAR buffer[MAXPATHLEN]; DWORD len=GetTempPath(MAXPATHLEN,buffer); if(1makeInstance(); The above is a simplistic view; we will need to set the image's visual, options, and other stuff before this can work. Also, when linking statically, we have to convince the linker to include the referred image code... */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXTGAIcon::fileExt[]="tga"; // Suggested mime type const FXchar FXTGAIcon::mimeType[]="image/targa"; // Object implementation FXIMPLEMENT(FXTGAIcon,FXIcon,NULL,0) // Initialize nicely FXTGAIcon::FXTGAIcon(FXApp* a,const void *pix,FXColor clr,FXuint opts,FXint w,FXint h):FXIcon(a,NULL,clr,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save pixels to stream bool FXTGAIcon::savePixels(FXStream& store) const { if(fxsaveTGA(store,data,width,height)){ return true; } return false; } // Load pixels from stream bool FXTGAIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadTGA(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXTGAIcon::~FXTGAIcon(){ } } fox1.6-1.6.57/src/FXTGAImage.cpp000066400000000000000000000062201326741342000157440ustar00rootroot00000000000000/******************************************************************************** * * * T A R G A I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 by Janusz Ganczarski. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTGAImage.cpp,v 1.26 2006/01/22 17:58:43 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXTGAImage.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXTGAImage::fileExt[]="tga"; // Suggested mime type const FXchar FXTGAImage::mimeType[]="image/targa"; // Object implementation FXIMPLEMENT(FXTGAImage,FXImage,NULL,0) // Initialize FXTGAImage::FXTGAImage(FXApp* a,const void *pix,FXuint opts,FXint w,FXint h):FXImage(a,NULL,opts,w,h){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save pixels to stream bool FXTGAImage::savePixels(FXStream& store) const { if(fxsaveTGA(store,data,width,height)){ return true; } return false; } // Load pixels from stream bool FXTGAImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadTGA(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXTGAImage::~FXTGAImage(){ } } fox1.6-1.6.57/src/FXTIFIcon.cpp000066400000000000000000000065451326741342000156330ustar00rootroot00000000000000/******************************************************************************** * * * T I F F I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 Eric Gillet. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTIFIcon.cpp,v 1.29 2006/01/22 17:58:43 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXTIFIcon.h" /* Notes: - FXTIFIcon has an alpha channel. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXTIFIcon::fileExt[]="tif"; // Suggested mime type const FXchar FXTIFIcon::mimeType[]="image/tiff"; // Object implementation FXIMPLEMENT(FXTIFIcon,FXIcon,NULL,0) #ifdef HAVE_TIFF_H const bool FXTIFIcon::supported=true; #else const bool FXTIFIcon::supported=false; #endif // Initialize FXTIFIcon::FXTIFIcon(FXApp* a,const void *pix,FXColor clr,FXuint opts,FXint w,FXint h):FXIcon(a,NULL,clr,opts,w,h),codec(0){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save pixels only bool FXTIFIcon::savePixels(FXStream& store) const { if(fxsaveTIF(store,data,width,height,codec)){ return true; } return false; } // Load pixels only bool FXTIFIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadTIF(store,pixels,w,h,codec)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXTIFIcon::~FXTIFIcon(){ } } fox1.6-1.6.57/src/FXTIFImage.cpp000066400000000000000000000064611326741342000157620ustar00rootroot00000000000000/******************************************************************************** * * * T I F F I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2001,2006 Eric Gillet. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTIFImage.cpp,v 1.29 2006/01/22 17:58:44 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXTIFImage.h" /* Notes: - FXTIFImage has an alpha channel. */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXTIFImage::fileExt[]="tif"; // Suggested mime type const FXchar FXTIFImage::mimeType[]="image/tiff"; // Object implementation FXIMPLEMENT(FXTIFImage,FXImage,NULL,0) #ifdef HAVE_TIFF_H const bool FXTIFImage::supported=true; #else const bool FXTIFImage::supported=false; #endif // Initialize FXTIFImage::FXTIFImage(FXApp* a,const void *pix,FXuint opts,FXint w,FXint h):FXImage(a,NULL,opts,w,h),codec(0){ if(pix){ FXMemoryStream ms; ms.open(FXStreamLoad,(FXuchar*)pix); loadPixels(ms); ms.close(); } } // Save the pixels only bool FXTIFImage::savePixels(FXStream& store) const { if(fxsaveTIF(store,data,width,height,codec)){ return true; } return false; } // Load pixels only bool FXTIFImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadTIF(store,pixels,w,h,codec)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXTIFImage::~FXTIFImage(){ } } fox1.6-1.6.57/src/FXTabBar.cpp000066400000000000000000000357441326741342000155360ustar00rootroot00000000000000/******************************************************************************** * * * T a b O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTabBar.cpp,v 1.28 2006/01/22 17:58:45 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXTabBar.h" #include "FXTabBook.h" /* Notes: - Should focus go to tab items? - Tab items should observe various border styles. - TAB/TABTAB should go into content, arrow keys navigate between tabs. */ #define TAB_ORIENT_MASK (TAB_TOP|TAB_LEFT|TAB_RIGHT|TAB_BOTTOM) #define TABBOOK_MASK (TABBOOK_SIDEWAYS|TABBOOK_BOTTOMTABS) #define REVEAL_PIXELS 20 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXTabBar) FXTabBarMap[]={ FXMAPFUNC(SEL_PAINT,0,FXTabBar::onPaint), FXMAPFUNC(SEL_FOCUS_NEXT,0,FXTabBar::onFocusNext), FXMAPFUNC(SEL_FOCUS_PREV,0,FXTabBar::onFocusPrev), FXMAPFUNC(SEL_FOCUS_UP,0,FXTabBar::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXTabBar::onFocusDown), FXMAPFUNC(SEL_FOCUS_LEFT,0,FXTabBar::onFocusLeft), FXMAPFUNC(SEL_FOCUS_RIGHT,0,FXTabBar::onFocusRight), FXMAPFUNC(SEL_COMMAND,FXTabBar::ID_OPEN_ITEM,FXTabBar::onCmdOpenItem), FXMAPFUNC(SEL_COMMAND,FXTabBar::ID_SETVALUE,FXTabBar::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXTabBar::ID_SETINTVALUE,FXTabBar::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXTabBar::ID_GETINTVALUE,FXTabBar::onCmdGetIntValue), FXMAPFUNCS(SEL_UPDATE,FXTabBar::ID_OPEN_FIRST,FXTabBar::ID_OPEN_LAST,FXTabBar::onUpdOpen), FXMAPFUNCS(SEL_COMMAND,FXTabBar::ID_OPEN_FIRST,FXTabBar::ID_OPEN_LAST,FXTabBar::onCmdOpen), }; // Object implementation FXIMPLEMENT(FXTabBar,FXPacker,FXTabBarMap,ARRAYNUMBER(FXTabBarMap)) // Make a tab bar FXTabBar::FXTabBar(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXPacker(p,opts,x,y,w,h,pl,pr,pt,pb,0,0){ flags|=FLAG_ENABLED; target=tgt; message=sel; current=0; shift=0; } // Get width FXint FXTabBar::getDefaultWidth(){ register FXint w,wtabs,maxtabw,t,ntabs; register FXuint hints; register FXWindow *child; // Left or right tabs if(options&TABBOOK_SIDEWAYS){ wtabs=0; for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) t=child->getWidth()-2; else t=child->getDefaultWidth()-2; if(t>wtabs) wtabs=t; } } w=wtabs; } // Top or bottom tabs else{ wtabs=maxtabw=ntabs=0; for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) t=child->getWidth(); else t=child->getDefaultWidth(); if(t>maxtabw) maxtabw=t; wtabs+=t; ntabs++; } } if(options&PACK_UNIFORM_WIDTH) wtabs=ntabs*maxtabw; w=wtabs+5; } return w+padleft+padright+(border<<1); } // Get height FXint FXTabBar::getDefaultHeight(){ register FXint h,htabs,maxtabh,t,ntabs; register FXuint hints; register FXWindow *child; // Left or right tabs if(options&TABBOOK_SIDEWAYS){ htabs=maxtabh=ntabs=0; for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) t=child->getHeight(); else t=child->getDefaultHeight(); if(t>maxtabh) maxtabh=t; htabs+=t; ntabs++; } } if(options&PACK_UNIFORM_HEIGHT) htabs=ntabs*maxtabh; h=htabs+5; } // Top or bottom tabs else{ htabs=0; for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) t=child->getHeight()-2; else t=child->getDefaultHeight()-2; if(t>htabs) htabs=t; } } h=htabs; } return h+padtop+padbottom+(border<<1); } // Recalculate layout void FXTabBar::layout(){ register FXint i,px,py,pw,ph,x,y,xx,yy,w,h,maxtabw,maxtabh,cumw,cumh,newcurrent; register FXWindow *raisetab=NULL; register FXWindow *tab; register FXuint hints; newcurrent=-1; // Measure tabs again maxtabw=maxtabh=0; for(tab=getFirst(),i=0; tab; tab=tab->getNext(),i++){ if(tab->shown()){ hints=tab->getLayoutHints(); if(newcurrent<0 || i<=current) newcurrent=i; if(hints&LAYOUT_FIX_WIDTH) w=tab->getWidth(); else w=tab->getDefaultWidth(); if(hints&LAYOUT_FIX_HEIGHT) h=tab->getHeight(); else h=tab->getDefaultHeight(); if(w>maxtabw) maxtabw=w; if(h>maxtabh) maxtabh=h; } } // Changes current only if old current no longer visible current=newcurrent; // Tabs on left or right if(options&TABBOOK_SIDEWAYS){ // Place panel py=border+padtop; ph=height-padtop-padbottom-(border<<1); // Scroll as appropriate for(tab=getFirst(),cumh=i=0; tab; tab=tab->getNext(),i++){ if(tab->shown()){ hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=tab->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=maxtabh; else h=tab->getDefaultHeight(); if(i==current){ if(tab->getNext()){ if(cumh+shift+h>ph-REVEAL_PIXELS-2) shift=ph-cumh-h-REVEAL_PIXELS-2; } else{ if(cumh+shift+h>ph-2) shift=ph-cumh-h-2; } if(tab->getPrev()){ if(cumh+shift0) shift=0; // Place all of the children for(tab=getFirst(),yy=py+shift,i=0; tab; tab=tab->getNext(),i++){ if(tab->shown()){ hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=tab->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=maxtabw; else w=tab->getDefaultWidth(); if(hints&LAYOUT_FIX_HEIGHT) h=tab->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=maxtabh; else h=tab->getDefaultHeight(); if(ipy+ph-2) y=py+ph-2-h; if(yposition(-4,y,w,h); else tab->position(width-w+4,y,w,h); tab->raise(); yy+=h; } else if(i>current){ y=yy+2; if(y+h>py+ph-2) y=py+ph-h-2; if(yposition(-4,y,w,h); else tab->position(width-w+4,y,w,h); tab->lower(); yy+=h; } else{ y=yy; if(y+h>py+ph-2) y=py+ph-h-2; if(yposition(-2,y,w,h); else tab->position(width-w+2,y,w,h); raisetab=tab; yy+=h-3; } } } } // Tabs on top or bottom else{ // Place panel px=border+padleft; pw=width-padleft-padright-(border<<1); // Scroll as appropriate for(tab=getFirst(),cumw=i=0; tab; tab=tab->getNext(),i++){ if(tab->shown()){ hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=tab->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=maxtabw; else w=tab->getDefaultWidth(); if(i==current){ if(tab->getNext()){ if(cumw+shift+w>pw-REVEAL_PIXELS-2) shift=pw-cumw-w-REVEAL_PIXELS-2; } else{ if(cumw+shift+w>pw-2) shift=pw-cumw-w-2; } if(tab->getPrev()){ if(cumw+shift0) shift=0; // Place all of the children for(tab=getFirst(),xx=px+shift,i=0; tab; tab=tab->getNext(),i++){ if(tab->shown()){ hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=tab->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=maxtabw; else w=tab->getDefaultWidth(); if(hints&LAYOUT_FIX_HEIGHT) h=tab->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=maxtabh; else h=tab->getDefaultHeight(); if(ipx+pw-2) x=px+pw-2-w; if(xposition(x,-4,w,h); else tab->position(x,height-h+4,w,h); tab->raise(); xx+=w; } else if(i>current){ x=xx+2; if(x+w>px+pw-2) x=px+pw-w-2; if(xposition(xx+2,-4,w,h); else tab->position(xx+2,height-h+4,w,h); tab->lower(); xx+=w; } else{ x=xx; if(x+w>px+pw-2) x=px+pw-w-2; if(xposition(xx,-2,w,h); else tab->position(xx,height-h+2,w,h); raisetab=tab; xx+=w-3; } } } } // Raise tab if(raisetab) raisetab->raise(); flags&=~FLAG_DIRTY; } // Set current subwindow void FXTabBar::setCurrent(FXint panel,FXbool notify){ register FXint nc=isMemberOf(&FXTabBook::metaClass)?numChildren()>>1:numChildren(); if(panel!=current && 0<=panel && paneltryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXival)current); } } } // Handle repaint long FXTabBar::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); dc.setForeground(backColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); drawFrame(dc,0,0,width,height); return 1; } // Focus moved to next visible tab long FXTabBar::onFocusNext(FXObject*,FXSelector,void* ptr){ FXWindow *child=getFocus(); if(child) child=child->getNext(); else child=getFirst(); while(child && !child->shown()) child=child->getNext(); if(child){ setCurrent(indexOfChild(child),TRUE); child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); return 1; } return 0; } // Focus moved to previous visible tab long FXTabBar::onFocusPrev(FXObject*,FXSelector,void* ptr){ FXWindow *child=getFocus(); if(child) child=child->getPrev(); else child=getLast(); while(child && !child->shown()) child=child->getPrev(); if(child){ setCurrent(indexOfChild(child),TRUE); child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); return 1; } return 0; } // Focus moved up long FXTabBar::onFocusUp(FXObject*,FXSelector,void* ptr){ if(options&TABBOOK_SIDEWAYS){ return handle(this,FXSEL(SEL_FOCUS_PREV,0),ptr); } return 0; } // Focus moved down long FXTabBar::onFocusDown(FXObject*,FXSelector,void* ptr){ if(options&TABBOOK_SIDEWAYS){ return handle(this,FXSEL(SEL_FOCUS_NEXT,0),ptr); } return 0; } // Focus moved left long FXTabBar::onFocusLeft(FXObject*,FXSelector,void* ptr){ if(!(options&TABBOOK_SIDEWAYS)){ return handle(this,FXSEL(SEL_FOCUS_PREV,0),ptr); } return 0; } // Focus moved right long FXTabBar::onFocusRight(FXObject*,FXSelector,void* ptr){ if(!(options&TABBOOK_SIDEWAYS)){ return handle(this,FXSEL(SEL_FOCUS_NEXT,0),ptr); } return 0; } // Update value from a message long FXTabBar::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setCurrent((FXint)(FXival)ptr); return 1; } // Update value from a message long FXTabBar::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setCurrent(*((FXint*)ptr)); return 1; } // Obtain value from text field long FXTabBar::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getCurrent(); return 1; } // Open item long FXTabBar::onCmdOpen(FXObject*,FXSelector sel,void*){ setCurrent(FXSELID(sel)-ID_OPEN_FIRST,TRUE); return 1; } // Update the nth button long FXTabBar::onUpdOpen(FXObject* sender,FXSelector sel,void*){ sender->handle(this,((FXSELID(sel)-ID_OPEN_FIRST)==current)?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // The sender of the message is the item to open up long FXTabBar::onCmdOpenItem(FXObject* sender,FXSelector,void*){ setCurrent(indexOfChild((FXWindow*)sender),TRUE); return 1; } // Get tab style FXuint FXTabBar::getTabStyle() const { return (options&TABBOOK_MASK); } // Set tab style void FXTabBar::setTabStyle(FXuint style){ FXuint opts=(options&~TABBOOK_MASK) | (style&TABBOOK_MASK); if(options!=opts){ options=opts; recalc(); update(); } } // Save object to stream void FXTabBar::save(FXStream& store) const { FXPacker::save(store); store << current; } // Load object from stream void FXTabBar::load(FXStream& store){ FXPacker::load(store); store >> current; } } fox1.6-1.6.57/src/FXTabBook.cpp000066400000000000000000000421341326741342000157130ustar00rootroot00000000000000/******************************************************************************** * * * T a b B o o k W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTabBook.cpp,v 1.25 2006/01/22 17:58:45 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXTabBook.h" /* Notes: - Should focus go to tab items? - Should callbacks come from tab items? - Should redesign this stuff a little. - Tab items should observe various border styles. - TAB/TABTAB should go into content, arrow keys navigate between tabs. - FXTabBook: pane's hints make no sense to observe - We hide the panes in FXTabBook. This way, we don't have to change the position of each pane when the FXTabBook itself changes. Only the active pane needs to be resized, leading to much faster layouts. - Fix setCurrent() to be like FXSwitcher. */ #define TABBOOK_MASK (TABBOOK_SIDEWAYS|TABBOOK_BOTTOMTABS) #define REVEAL_PIXELS 20 using namespace FX; /*******************************************************************************/ namespace FX { FXDEFMAP(FXTabBook) FXTabBookMap[]={ FXMAPFUNC(SEL_PAINT,0,FXTabBook::onPaint), FXMAPFUNC(SEL_FOCUS_NEXT,0,FXTabBook::onFocusNext), FXMAPFUNC(SEL_FOCUS_PREV,0,FXTabBook::onFocusPrev), FXMAPFUNC(SEL_FOCUS_UP,0,FXTabBook::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXTabBook::onFocusDown), FXMAPFUNC(SEL_FOCUS_LEFT,0,FXTabBook::onFocusLeft), FXMAPFUNC(SEL_FOCUS_RIGHT,0,FXTabBook::onFocusRight), FXMAPFUNC(SEL_COMMAND,FXTabBar::ID_OPEN_ITEM,FXTabBook::onCmdOpenItem), }; // Object implementation FXIMPLEMENT(FXTabBook,FXTabBar,FXTabBookMap,ARRAYNUMBER(FXTabBookMap)) // Make a tab book FXTabBook::FXTabBook(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXTabBar(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){ } // Get width FXint FXTabBook::getDefaultWidth(){ register FXint w,wtabs,maxtabw,wpnls,t,ntabs; register FXWindow *tab,*pane; register FXuint hints; // Left or right tabs if(options&TABBOOK_SIDEWAYS){ wtabs=wpnls=0; for(tab=getFirst(); tab && tab->getNext(); tab=tab->getNext()->getNext()){ pane=tab->getNext(); if(tab->shown()){ hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) t=tab->getWidth()-2; else t=tab->getDefaultWidth()-2; if(t>wtabs) wtabs=t; t=pane->getDefaultWidth(); if(t>wpnls) wpnls=t; } } w=wtabs+wpnls; } // Top or bottom tabs else{ wtabs=wpnls=maxtabw=ntabs=0; for(tab=getFirst(); tab && tab->getNext(); tab=tab->getNext()->getNext()){ pane=tab->getNext(); if(tab->shown()){ hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) t=tab->getWidth(); else t=tab->getDefaultWidth(); if(t>maxtabw) maxtabw=t; wtabs+=t; t=pane->getDefaultWidth(); if(t>wpnls) wpnls=t; ntabs++; } } if(options&PACK_UNIFORM_WIDTH) wtabs=ntabs*maxtabw; wtabs+=5; w=FXMAX(wtabs,wpnls); } return w+padleft+padright+(border<<1); } // Get height FXint FXTabBook::getDefaultHeight(){ register FXint h,htabs,maxtabh,hpnls,t,ntabs; register FXWindow *tab,*pane; register FXuint hints; // Left or right tabs if(options&TABBOOK_SIDEWAYS){ htabs=hpnls=maxtabh=ntabs=0; for(tab=getFirst(); tab && tab->getNext(); tab=tab->getNext()->getNext()){ pane=tab->getNext(); if(tab->shown()){ hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) t=tab->getHeight(); else t=tab->getDefaultHeight(); if(t>maxtabh) maxtabh=t; htabs+=t; t=pane->getDefaultHeight(); if(t>hpnls) hpnls=t; ntabs++; } } if(options&PACK_UNIFORM_HEIGHT) htabs=ntabs*maxtabh; htabs+=5; h=FXMAX(htabs,hpnls); } // Top or bottom tabs else{ htabs=hpnls=0; for(tab=getFirst(); tab && tab->getNext(); tab=tab->getNext()->getNext()){ pane=tab->getNext(); if(tab->shown()){ hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) t=tab->getHeight()-2; else t=tab->getDefaultHeight()-2; if(t>htabs) htabs=t; t=pane->getDefaultHeight(); if(t>hpnls) hpnls=t; } } h=htabs+hpnls; } return h+padtop+padbottom+(border<<1); } // Recalculate layout void FXTabBook::layout(){ register FXint i,xx,yy,x,y,w,h,px,py,pw,ph,maxtabw,maxtabh,cumw,cumh,newcurrent; register FXWindow *raisepane=NULL; register FXWindow *raisetab=NULL; register FXWindow *pane,*tab; register FXuint hints; newcurrent=-1; // Measure tabs again maxtabw=maxtabh=0; for(tab=getFirst(),i=0; tab && tab->getNext(); tab=tab->getNext()->getNext(),i++){ if(tab->shown()){ hints=tab->getLayoutHints(); if(newcurrent<0 || i<=current) newcurrent=i; if(hints&LAYOUT_FIX_WIDTH) w=tab->getWidth(); else w=tab->getDefaultWidth(); if(hints&LAYOUT_FIX_HEIGHT) h=tab->getHeight(); else h=tab->getDefaultHeight(); if(w>maxtabw) maxtabw=w; if(h>maxtabh) maxtabh=h; } } // Changes current only if old current no longer visible current=newcurrent; // Left or right tabs if(options&TABBOOK_SIDEWAYS){ // Place panel px=(options&TABBOOK_BOTTOMTABS) ? border+padleft : border+padleft+maxtabw-2; py=border+padtop; pw=width-padleft-padright-(border<<1)-maxtabw+2; ph=height-padtop-padbottom-(border<<1); // Scroll as appropriate for(tab=getFirst(),cumh=i=0; tab && tab->getNext(); tab=tab->getNext()->getNext(),i++){ if(tab->shown()){ hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=tab->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=maxtabh; else h=tab->getDefaultHeight(); if(i==current){ if(tab->getNext()->getNext()){ if(cumh+shift+h>ph-REVEAL_PIXELS-2) shift=ph-cumh-h-REVEAL_PIXELS-2; } else{ if(cumh+shift+h>ph-2) shift=ph-cumh-h-2; } if(tab->getPrev()){ if(cumh+shift0) shift=0; // Place all of the children for(tab=getFirst(),yy=py+shift,i=0; tab && tab->getNext(); tab=tab->getNext()->getNext(),i++){ pane=tab->getNext(); if(tab->shown()){ pane->position(px,py,pw,ph); hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=tab->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=maxtabw; else w=tab->getDefaultWidth(); if(hints&LAYOUT_FIX_HEIGHT) h=tab->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=maxtabh; else h=tab->getDefaultHeight(); if(ipy+ph-2) y=py+ph-2-h; if(yposition(px+pw-4,y+2,w,h); else tab->position(px-w+4,y+2,w,h); tab->raise(); pane->hide(); yy+=h; } else if(i>current){ y=yy+2; if(y+h>py+ph-2) y=py+ph-h-2; if(yposition(px+pw-4,y+2,w,h); else tab->position(px-w+4,y+2,w,h); tab->lower(); pane->hide(); yy+=h; } else{ y=yy; if(y+h>py+ph-2) y=py+ph-h-2; if(yposition(px+pw-2,y,w,h); else tab->position(px-w+2,y,w,h); pane->show(); raisepane=pane; raisetab=tab; yy+=h-3; } } else{ pane->hide(); } } // Hide spurious last tab if(tab) tab->resize(0,0); } // Top or bottom tabs else{ // Place panel px=border+padleft; py=(options&TABBOOK_BOTTOMTABS) ? border+padtop : border+padtop+maxtabh-2; pw=width-padleft-padright-(border<<1); ph=height-padtop-padbottom-(border<<1)-maxtabh+2; // Scroll as appropriate for(tab=getFirst(),cumw=i=0; tab && tab->getNext(); tab=tab->getNext()->getNext(),i++){ if(tab->shown()){ hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=tab->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=maxtabw; else w=tab->getDefaultWidth(); if(i==current){ if(tab->getNext()->getNext()){ if(cumw+shift+w>pw-REVEAL_PIXELS-2) shift=pw-cumw-w-REVEAL_PIXELS-2; } else{ if(cumw+shift+w>pw-2) shift=pw-cumw-w-2; } if(tab->getPrev()){ if(cumw+shift0) shift=0; // Place all of the children for(tab=getFirst(),xx=px+shift,i=0; tab && tab->getNext(); tab=tab->getNext()->getNext(),i++){ pane=tab->getNext(); if(tab->shown()){ pane->position(px,py,pw,ph); hints=tab->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=tab->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=maxtabw; else w=tab->getDefaultWidth(); if(hints&LAYOUT_FIX_HEIGHT) h=tab->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=maxtabh; else h=tab->getDefaultHeight(); if(ipx+pw-2) x=px+pw-2-w; if(xposition(x,py+ph-4,w,h); else tab->position(x,py-h+4,w,h); tab->raise(); pane->hide(); xx+=w; } else if(i>current){ x=xx+2; if(x+w>px+pw-2) x=px+pw-w-2; if(xposition(x,py+ph-4,w,h); else tab->position(x,py-h+4,w,h); tab->lower(); pane->hide(); xx+=w; } else{ x=xx; if(x+w>px+pw-2) x=px+pw-w-2; if(xposition(x,py+ph-2,w,h); else tab->position(x,py-h+2,w,h); pane->show(); raisepane=pane; raisetab=tab; xx+=w-3; } } else{ pane->hide(); } } // Hide spurious last tab if(tab) tab->resize(0,0); } // Raise tab over panel and panel over all other tabs if(raisepane) raisepane->raise(); if(raisetab) raisetab->raise(); flags&=~FLAG_DIRTY; } // The sender of the message is the item to open up long FXTabBook::onCmdOpenItem(FXObject* sender,FXSelector,void*){ setCurrent(indexOfChild((FXWindow*)sender)/2,TRUE); return 1; } // Handle repaint long FXTabBook::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); dc.setForeground(backColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); drawFrame(dc,0,0,width,height); return 1; } // Focus moved to next tab long FXTabBook::onFocusNext(FXObject*,FXSelector,void* ptr){ FXWindow *child=getFocus(); FXint which; if(child){ child=child->getNext(); if(!child) return 0; which=indexOfChild(child); if(which&1){ child=child->getNext(); which++; } } else{ child=getFirst(); which=0; } while(child && child->getNext() && !(child->shown() && child->isEnabled())){ child=child->getNext()->getNext(); which+=2; } if(child){ setCurrent(which>>1,TRUE); child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); return 1; } return 0; } // Focus moved to previous long FXTabBook::onFocusPrev(FXObject*,FXSelector,void* ptr){ FXWindow *child=getFocus(); FXint which; if(child){ child=child->getPrev(); if(!child) return 0; which=indexOfChild(child); } else{ child=getLast(); if(!child) return 0; which=indexOfChild(child); } if(which&1){ child=child->getPrev(); } while(child && child->getPrev() && !(child->shown() && child->isEnabled())){ child=child->getPrev()->getPrev(); which-=2; } if(child){ setCurrent(which>>1,TRUE); child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); return 1; } return 0; } // Focus moved up long FXTabBook::onFocusUp(FXObject*,FXSelector,void* ptr){ if(options&TABBOOK_SIDEWAYS){ return handle(this,FXSEL(SEL_FOCUS_PREV,0),ptr); } if(getFocus()){ FXWindow *child=NULL; if(indexOfChild(getFocus())&1){ // We're on a panel if(!(options&TABBOOK_BOTTOMTABS)) child=getFocus()->getPrev(); } else{ // We're on a tab if(options&TABBOOK_BOTTOMTABS) child=getFocus()->getNext(); } if(child){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_UP,0),ptr)) return 1; } } return 0; } // Focus moved down long FXTabBook::onFocusDown(FXObject*,FXSelector,void* ptr){ if(options&TABBOOK_SIDEWAYS){ return handle(this,FXSEL(SEL_FOCUS_NEXT,0),ptr); } if(getFocus()){ FXWindow *child=NULL; if(indexOfChild(getFocus())&1){ // We're on a panel if(options&TABBOOK_BOTTOMTABS) child=getFocus()->getPrev(); } else{ // We're on a tab if(!(options&TABBOOK_BOTTOMTABS)) child=getFocus()->getNext(); } if(child){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_DOWN,0),ptr)) return 1; } } return 0; } // Focus moved left long FXTabBook::onFocusLeft(FXObject*,FXSelector,void* ptr){ if(!(options&TABBOOK_SIDEWAYS)){ return handle(this,FXSEL(SEL_FOCUS_PREV,0),ptr); } if(getFocus()){ FXWindow *child=NULL; if(indexOfChild(getFocus())&1){ // We're on a panel if(!(options&TABBOOK_BOTTOMTABS)) child=getFocus()->getPrev(); } else{ // We're on a tab if(options&TABBOOK_BOTTOMTABS) child=getFocus()->getNext(); } if(child){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_LEFT,0),ptr)) return 1; } } return 0; } // Focus moved right long FXTabBook::onFocusRight(FXObject*,FXSelector,void* ptr){ if(!(options&TABBOOK_SIDEWAYS)){ return handle(this,FXSEL(SEL_FOCUS_NEXT,0),ptr); } if(getFocus()){ FXWindow *child=NULL; if(indexOfChild(getFocus())&1){ // We're on a panel if(options&TABBOOK_BOTTOMTABS) child=getFocus()->getPrev(); } else{ // We're on a tab if(!(options&TABBOOK_BOTTOMTABS)) child=getFocus()->getNext(); } if(child){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_RIGHT,0),ptr)) return 1; } } return 0; } } fox1.6-1.6.57/src/FXTabItem.cpp000066400000000000000000000227331326741342000157220ustar00rootroot00000000000000/******************************************************************************** * * * T a b I t e m W i d g e t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTabItem.cpp,v 1.29 2006/01/22 17:58:45 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXTabBar.h" #include "FXTabItem.h" /* Notes: - Should focus go to tab items? - Should callbacks come from tab items? - Should redesign this stuff a little. - Tab items should observe various border styles. - TAB/TABTAB should go into content, arrow keys navigate between tabs. - FXTabBook: pane's hints make no sense to observe - We hide the panes in FXTabBook. This way, we don't have to change the position of each pane when the FXTabBook itself changes. Only the active pane needs to be moved. - Maybe honor frame styles. - Perhaps make a bit larger by default? */ #define TAB_ORIENT_MASK (TAB_TOP|TAB_LEFT|TAB_RIGHT|TAB_BOTTOM) #define TABBOOK_MASK (TABBOOK_SIDEWAYS|TABBOOK_BOTTOMTABS) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXTabItem) FXTabItemMap[]={ FXMAPFUNC(SEL_PAINT,0,FXTabItem::onPaint), FXMAPFUNC(SEL_FOCUSIN,0,FXTabItem::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXTabItem::onFocusOut), FXMAPFUNC(SEL_UNGRABBED,0,FXTabItem::onUngrabbed), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXTabItem::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXTabItem::onLeftBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXTabItem::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXTabItem::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXWindow::ID_HOTKEY,FXTabItem::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXWindow::ID_HOTKEY,FXTabItem::onHotKeyRelease), }; // Object implementation FXIMPLEMENT(FXTabItem,FXLabel,FXTabItemMap,ARRAYNUMBER(FXTabItemMap)) // Tab item FXTabItem::FXTabItem(FXTabBar* p,const FXString& text,FXIcon* ic,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXLabel(p,text,ic,opts,x,y,w,h,pl,pr,pt,pb){ border=2; } // If window can have focus bool FXTabItem::canFocus() const { return true; } // Gained focus long FXTabItem::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusIn(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Lost focus long FXTabItem::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusOut(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Pressed mouse button long FXTabItem::onLeftBtnPress(FXObject* sender,FXSelector sel,void* ptr){ if(!FXLabel::onLeftBtnPress(sender,sel,ptr)){ if(isEnabled()){ getParent()->handle(this,FXSEL(SEL_COMMAND,FXTabBar::ID_OPEN_ITEM),ptr); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; return 1; } } return 0; } // Released mouse button long FXTabItem::onLeftBtnRelease(FXObject* sender,FXSelector sel,void* ptr){ if(!FXLabel::onLeftBtnRelease(sender,sel,ptr)){ if(isEnabled()){ flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; return 1; } } return 0; } // Lost the grab for some reason long FXTabItem::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onUngrabbed(sender,sel,ptr); flags&=~FLAG_PRESSED; flags|=FLAG_UPDATE; return 1; } // Key Press long FXTabItem::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ getParent()->handle(this,FXSEL(SEL_COMMAND,FXTabBar::ID_OPEN_ITEM),ptr); return 1; } } return 0; } // Key Release long FXTabItem::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ return 1; } } return 0; } // Hot key combination pressed long FXTabItem::onHotKeyPress(FXObject*,FXSelector,void* ptr){ handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; if(isEnabled()){ getParent()->handle(this,FXSEL(SEL_COMMAND,FXTabBar::ID_OPEN_ITEM),ptr); } return 1; } // Hot key combination released long FXTabItem::onHotKeyRelease(FXObject*,FXSelector,void*){ return 1; } // Handle repaint long FXTabItem::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy; dc.setForeground(backColor); //dc.setForeground(FXRGB(255,0,0)); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); switch(options&TAB_ORIENT_MASK){ case TAB_LEFT: dc.setForeground(hiliteColor); dc.drawLine(2,0,width-1,0); dc.drawLine(0,2,1,1); dc.drawLine(0,height-4,0,2); dc.setForeground(shadowColor); dc.fillRectangle(1,height-3,1,1); dc.fillRectangle(2,height-2,width-3,1); dc.setForeground(borderColor); dc.drawLine(3,height-1,width-1,height-1); break; case TAB_RIGHT: dc.setForeground(hiliteColor); dc.drawLine(0,0,width-3,0); dc.drawLine(width-3,0,width-1,3); dc.setForeground(shadowColor); dc.drawLine(width-2,2,width-2,height-2); dc.drawLine(0,height-2,width-2,height-2); dc.setForeground(borderColor); dc.drawLine(0,height-1,width-3,height-1); dc.drawLine(width-1,3,width-1,height-4); dc.drawLine(width-3,height-1,width-1,height-4); break; case TAB_BOTTOM: dc.setForeground(hiliteColor); dc.drawLine(0,0,0,height-4); dc.drawLine(0,height-4,1,height-2); dc.setForeground(shadowColor); dc.fillRectangle(2,height-2,width-4,1); dc.drawLine(width-2,0,width-2,height-3); dc.fillRectangle(width-2,0,2,1); dc.setForeground(borderColor); dc.drawLine(3,height-1,width-4,height-1); dc.drawLine(width-4,height-1,width-1,height-4); dc.fillRectangle(width-1,1,1,height-4); break; case TAB_TOP: dc.setForeground(hiliteColor); dc.fillRectangle(0,2,1,height-2); dc.drawLine(0,2,2,0); dc.fillRectangle(2,0,width-4,1); dc.setForeground(shadowColor); dc.fillRectangle(width-2,1,1,height-1); dc.setForeground(borderColor); dc.drawLine(width-2,1,width-1,2); dc.fillRectangle(width-1,2,1,height-3); break; } if(!label.empty()){ tw=labelWidth(label); th=labelHeight(label); } if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); } just_x(tx,ix,tw,iw); just_y(ty,iy,th,ih); if(icon){ if(isEnabled()) dc.drawIcon(icon,ix,iy); else dc.drawIconSunken(icon,ix,iy); } if(!label.empty()){ dc.setFont(font); if(isEnabled()){ dc.setForeground(textColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); if(hasFocus()){ dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2); } } else{ dc.setForeground(hiliteColor); drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } } return 1; } // Get tab style FXuint FXTabItem::getTabOrientation() const { return (options&TAB_ORIENT_MASK); } // Set tab style void FXTabItem::setTabOrientation(FXuint style){ FXuint opts=(options&~TAB_ORIENT_MASK) | (style&TAB_ORIENT_MASK); if(options!=opts){ options=opts; recalc(); update(); } } } fox1.6-1.6.57/src/FXTable.cpp000066400000000000000000003762751326741342000154410ustar00rootroot00000000000000/******************************************************************************** * * * T a b l e W i d g e t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTable.cpp,v 1.245.2.6 2009/01/17 10:22:51 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObjectList.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXScrollBar.h" #include "FXTextField.h" #include "FXButton.h" #include "FXHeader.h" #include "FXTable.h" #include "FX88591Codec.h" #include "FXCP1252Codec.h" #include "FXUTF16Codec.h" #include "FXList.h" #include "FXComboBox.h" #include "FXSpinner.h" /* Notes: - Table looks like: +--------+--------+--------+--------+ | | ColHdr | ColHdr | ColHdr | +--------+--------+--------+--------+ | RowHdr | 3.14| |Pi | +--------+--------+--------+--------+ | RowHdr | | | | +--------+--------+--------+--------+ | RowHdr | | | | +--------+--------+--------+--------+ - Grid line have different styles [Similar to frame styles]; normally dotted lines or light grey. - Cells have margins around the text. - Column headers are optional. - Row headers are optional. - Headers stay in place, i.e. column headers stay on top, row headers stay on right. - Cells can contain string or icon or number. - Justification and formatting [for numbers]: - Format same for whole table - Format same for column - Format same for row - Format different for each cell - Resizing columns [same for rows]: - Off, no resizing allowed. - Column bounds. - Adjustment of subsequent columns (proportional to old sizes). - Adjustment of prior columns (proportional to old sizes). - Adjustment of all columns (proportional to old sizes). - Adjustment of first/last column. - Uniform column width, or per-column defined width. - Selection: - Disabled. - Select rows only. - Select columns only. - Select rows and columns. - Select cells only. - Selection ranges: - Single entity (i.e. single row, column, etc.) - Range of entities (multiple rows, multiple columns, blocks) - Reordering: - Disabled. - Reordering of columns allowed. - Reordering of rows allowed. - Both. - Alternating colors: - All the same color - Alternate background/foreground every other row - Alternate background/foreground every other column - Header buttons: - Column header button to select whole column. - Row header button to select whole row. - Fixed columns or rows: - First n columns and last m columns. (e.g. to show totals). - First n rows and last m rows. - Virtual storage capability for HUGE arrays: o When exposing virtual cells, we ask to supply content for the exposed cells. o Keep track of part of table which is visible; this is the actual table. o The actual table keeps REAL cells for those virtual cells which are visible [so you can manipulate them, and for quick repainting]. o When scrolling, we roll over the cells as follows: +---------+ +---------+ +---------+ |XXXXXXXBB| |BBXXXXXXX| |DDCCCCCCC| |XXXXXXXBB| |BBXXXXXXX| |BBXXXXXXX| |XXXXXXXBB| -> |BBXXXXXXX| -> |BBXXXXXXX| |XXXXXXXBB| |BBXXXXXXX| |BBXXXXXXX| |CCCCCCCDD| |DDCCCCCCC| |BBXXXXXXX| +---------+ +---------+ +---------+ Then of course we ask to refill the cells marked B, D, and C. o When resizing, we resize the actual table, and ask to refill the cells on the bottom/right [or top/left, if we're at the maximum scrolled position and new cells are introduced at the top!] o Virtual cell from actual one: vr = ar+firstrow (0<=arisHorzGridShown(); register FXbool vg=table->isVertGridShown(); dc.fillRectangle(x+vg,y+hg,w-vg,h-hg); } // Draw hatch pattern void FXTableItem::drawPattern(const FXTable* table,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const { if(state&0x1f00){ register FXbool hg=table->isHorzGridShown(); register FXbool vg=table->isVertGridShown(); dc.setStipple((FXStipplePattern)((state&0x1f00)>>8),x,y); dc.setFillStyle(FILL_STIPPLED); dc.setForeground(table->getStippleColor()); dc.fillRectangle(x+vg,y+hg,w-vg,h-hg); dc.setFillStyle(FILL_SOLID); } } // Draw borders void FXTableItem::drawBorders(const FXTable* table,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const { if(state&(LBORDER|RBORDER|TBORDER|BBORDER)){ register FXint bb=table->getCellBorderWidth(); register FXbool hg=table->isHorzGridShown(); register FXbool vg=table->isVertGridShown(); dc.setForeground(table->getCellBorderColor()); if(state&LBORDER) dc.fillRectangle(x,y,bb,h+hg); if(state&RBORDER) dc.fillRectangle(x+w+vg-bb,y,bb,h+hg); if(state&TBORDER) dc.fillRectangle(x,y,w+vg,bb); if(state&BBORDER) dc.fillRectangle(x,y+h+hg-bb,w+vg,bb); } } // Draw content; grid lines count on left/top side but not on right/bottom side void FXTableItem::drawContent(const FXTable* table,FXDC& dc,FXint x,FXint y,FXint w,FXint h) const { register FXint tx,ty,tw,th,ix,iy,iw,ih,s,beg,end,t,xx,yy; register FXbool hg=table->isHorzGridShown(); register FXbool vg=table->isVertGridShown(); register FXint ml=table->getMarginLeft()+vg; register FXint mt=table->getMarginTop()+hg; register FXint mr=table->getMarginRight(); register FXint mb=table->getMarginBottom(); register FXFont *font=dc.getFont(); FXString lbl=getText(); FXIcon *icn=getIcon(); // Text width and height beg=tw=th=0; do{ end=beg; while(endgetTextWidth(&lbl[beg],end-beg))>tw) tw=t; th+=font->getFontHeight(); beg=end+1; } while(endgetWidth(); ih=icn->getHeight(); } // Icon-text spacing s=0; if(iw && tw) s=4; // Fix x coordinate if(state&LEFT){ if(state&BEFORE){ ix=x+ml; tx=ix+iw+s; } else if(state&AFTER){ tx=x+ml; ix=tx+tw+s; } else{ ix=x+ml; tx=x+ml; } } else if(state&RIGHT){ if(state&BEFORE){ tx=x+w-mr-tw; ix=tx-iw-s; } else if(state&AFTER){ ix=x+w-mr-iw; tx=ix-tw-s; } else{ ix=x+w-mr-iw; tx=x+w-mr-tw; } } else{ if(state&BEFORE){ ix=x+(ml+w-mr)/2-(tw+iw+s)/2; tx=ix+iw+s; } else if(state&AFTER){ tx=x+(ml+w-mr)/2-(tw+iw+s)/2; ix=tx+tw+s; } else{ ix=x+(ml+w-mr)/2-iw/2; tx=x+(ml+w-mr)/2-tw/2; } } // Fix y coordinate if(state&TOP){ if(state&ABOVE){ iy=y+mt; ty=iy+ih; } else if(state&BELOW){ ty=y+mt; iy=ty+th; } else{ iy=y+mt; ty=y+mt; } } else if(state&BOTTOM){ if(state&ABOVE){ ty=y+h-mb-th; iy=ty-ih; } else if(state&BELOW){ iy=y+h-mb-ih; ty=iy-th; } else{ iy=y+h-mb-ih; ty=y+h-mb-th; } } else{ if(state&ABOVE){ iy=y+(mt+h-mb)/2-(th+ih)/2; ty=iy+ih; } else if(state&BELOW){ ty=y+(mt+h-mb)/2-(th+ih)/2; iy=ty+th; } else{ iy=y+(mt+h-mb)/2-ih/2; ty=y+(mt+h-mb)/2-th/2; } } // Paint icon if(icn){ dc.drawIcon(icn,ix,iy); } // Text color if(state&SELECTED) dc.setForeground(table->getSelTextColor()); else dc.setForeground(table->getTextColor()); // Draw text yy=ty+font->getFontAscent(); beg=0; do{ end=beg; while(endgetTextWidth(&lbl[beg],end-beg); else xx=tx+(tw-font->getTextWidth(&lbl[beg],end-beg))/2; dc.drawText(xx,yy,&lbl[beg],end-beg); yy+=font->getFontHeight(); beg=end+1; } while(endgetMarginLeft(),table->getMarginRight(),table->getMarginTop(),table->getMarginBottom()); if(state&LEFT) justify|=JUSTIFY_LEFT; if(state&RIGHT) justify|=JUSTIFY_RIGHT; if(state&TOP) justify|=JUSTIFY_TOP; if(state&BOTTOM) justify|=JUSTIFY_BOTTOM; field->create(); field->setJustify(justify); field->setFont(table->getFont()); field->setBackColor(table->getBackColor()); field->setTextColor(table->getTextColor()); field->setSelBackColor(table->getSelBackColor()); field->setSelTextColor(table->getSelTextColor()); field->setText(label); field->selectAll(); return field; } // Set value from input control void FXTableItem::setFromControl(FXWindow *control){ register FXTextField *field=static_cast(control); setText(field->getText()); } // Set or kill focus void FXTableItem::setFocus(FXbool focus){ if(focus) state|=FOCUS; else state&=~FOCUS; } // Select or deselect item void FXTableItem::setSelected(FXbool selected){ if(selected) state|=SELECTED; else state&=~SELECTED; } // Enable or disable the item void FXTableItem::setEnabled(FXbool enabled){ if(enabled) state&=~DISABLED; else state|=DISABLED; } // Icon is draggable void FXTableItem::setDraggable(FXbool draggable){ if(draggable) state|=DRAGGABLE; else state&=~DRAGGABLE; } // Change item's text label void FXTableItem::setText(const FXString& txt){ label=txt; } // Change item's icon, deleting the old icon if it was owned void FXTableItem::setIcon(FXIcon* icn,FXbool owned){ if(icon && (state&ICONOWNED)){ if(icon!=icn) delete icon; state&=~ICONOWNED; } icon=icn; if(icon && owned){ state|=ICONOWNED; } } // Change justify mode void FXTableItem::setJustify(FXuint justify){ state=(state&~(RIGHT|LEFT|TOP|BOTTOM)) | (justify&(RIGHT|LEFT|TOP|BOTTOM)); } // Change icon positioning void FXTableItem::setIconPosition(FXuint mode){ state=(state&~(BEFORE|AFTER|ABOVE|BELOW)) | (mode&(BEFORE|AFTER|ABOVE|BELOW)); } // Change border mode void FXTableItem::setBorders(FXuint borders){ state=(state&~(LBORDER|RBORDER|TBORDER|BBORDER)) | (borders&(LBORDER|RBORDER|TBORDER|BBORDER)); } // Set stipple pattern void FXTableItem::setStipple(FXStipplePattern pattern) { state=(state&0xffffe0ff)|((pattern<<8)); } // Get stipple pattern FXStipplePattern FXTableItem::getStipple() const { return (FXStipplePattern)((state>>8)&0x1f); } // Create icon void FXTableItem::create(){ if(icon) icon->create(); } // Destroy icon void FXTableItem::destroy(){ if((state&ICONOWNED) && icon) icon->destroy(); } // Detach from icon resource void FXTableItem::detach(){ if(icon) icon->detach(); } // Get width of item FXint FXTableItem::getWidth(const FXTable* table) const { register FXFont *font=table->getFont(); register FXint beg,end,tw,iw,s,w,t; register FXint ml=table->getMarginLeft(); register FXint mr=table->getMarginRight(); FXString lbl=getText(); FXIcon *icn=getIcon(); tw=iw=beg=s=0; if(icn) iw=icn->getWidth(); do{ end=beg; while(endgetTextWidth(&lbl[beg],end-beg))>tw) tw=t; beg=end+1; } while(endgetFont(); register FXint beg,end,th,ih,h; register FXint mt=table->getMarginTop(); register FXint mb=table->getMarginBottom(); FXString lbl=getText(); FXIcon *icn=getIcon(); th=ih=beg=0; if(icn) ih=icn->getHeight(); do{ end=beg; while(endgetFontHeight(); beg=end+1; } while(end> label; store >> icon; store >> state; } // Delete icon if owned FXTableItem::~FXTableItem(){ if(state&ICONOWNED) delete icon; icon=(FXIcon*)-1L; } /*******************************************************************************/ // Object implementation FXIMPLEMENT(FXComboTableItem,FXTableItem,NULL,0) // Construct new table item FXComboTableItem::FXComboTableItem(const FXString& text,FXIcon* ic,void* ptr):FXTableItem(FXString::null,ic,ptr){ setSelections(text); } // Set selections as newline-separated strings void FXComboTableItem::setSelections(const FXString& strings){ selections=strings; setText(selections.section('\n',0)); } // Create input control for editing this item FXWindow *FXComboTableItem::getControlFor(FXTable* table){ register FXComboBox *combo; register FXuint justify=0; combo=new FXComboBox(table,1,NULL,0,COMBOBOX_STATIC,0,0,0,0,table->getMarginLeft(),table->getMarginRight(),table->getMarginTop(),table->getMarginBottom()); if(state&LEFT) justify|=JUSTIFY_LEFT; if(state&RIGHT) justify|=JUSTIFY_RIGHT; if(state&TOP) justify|=JUSTIFY_TOP; if(state&BOTTOM) justify|=JUSTIFY_BOTTOM; combo->create(); combo->setJustify(justify); combo->setFont(table->getFont()); combo->setBackColor(table->getBackColor()); combo->setTextColor(table->getTextColor()); combo->setSelBackColor(table->getSelBackColor()); combo->setSelTextColor(table->getSelTextColor()); combo->fillItems(selections); combo->setText(label); combo->setNumVisible(FXMIN(20,combo->getNumItems())); return combo; } // Set value from input control void FXComboTableItem::setFromControl(FXWindow *control){ register FXComboBox *combo=static_cast(control); setText(combo->getText()); } /*******************************************************************************/ // Map FXDEFMAP(FXTable) FXTableMap[]={ FXMAPFUNC(SEL_PAINT,0,FXTable::onPaint), FXMAPFUNC(SEL_MOTION,0,FXTable::onMotion), FXMAPFUNC(SEL_TIMEOUT,FXWindow::ID_AUTOSCROLL,FXTable::onAutoScroll), FXMAPFUNC(SEL_UNGRABBED,0,FXTable::onUngrabbed), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXTable::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXTable::onLeftBtnRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXTable::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXTable::onRightBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXTable::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXTable::onKeyRelease), FXMAPFUNC(SEL_FOCUSIN,0,FXTable::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXTable::onFocusOut), FXMAPFUNC(SEL_SELECTION_LOST,0,FXTable::onSelectionLost), FXMAPFUNC(SEL_SELECTION_GAINED,0,FXTable::onSelectionGained), FXMAPFUNC(SEL_SELECTION_REQUEST,0,FXTable::onSelectionRequest), FXMAPFUNC(SEL_CLIPBOARD_LOST,0,FXTable::onClipboardLost), FXMAPFUNC(SEL_CLIPBOARD_GAINED,0,FXTable::onClipboardGained), FXMAPFUNC(SEL_CLIPBOARD_REQUEST,0,FXTable::onClipboardRequest), FXMAPFUNC(SEL_CLICKED,0,FXTable::onClicked), FXMAPFUNC(SEL_DOUBLECLICKED,0,FXTable::onDoubleClicked), FXMAPFUNC(SEL_TRIPLECLICKED,0,FXTable::onTripleClicked), FXMAPFUNC(SEL_COMMAND,0,FXTable::onCommand), FXMAPFUNC(SEL_UPDATE,FXTable::ID_HORZ_GRID,FXTable::onUpdHorzGrid), FXMAPFUNC(SEL_UPDATE,FXTable::ID_VERT_GRID,FXTable::onUpdVertGrid), FXMAPFUNC(SEL_COMMAND,FXTable::ID_HORZ_GRID,FXTable::onCmdHorzGrid), FXMAPFUNC(SEL_COMMAND,FXTable::ID_VERT_GRID,FXTable::onCmdVertGrid), FXMAPFUNC(SEL_COMMAND,FXTable::ID_DELETE_COLUMN,FXTable::onCmdDeleteColumn), FXMAPFUNC(SEL_UPDATE,FXTable::ID_DELETE_COLUMN,FXTable::onUpdDeleteColumn), FXMAPFUNC(SEL_COMMAND,FXTable::ID_DELETE_ROW,FXTable::onCmdDeleteRow), FXMAPFUNC(SEL_UPDATE,FXTable::ID_DELETE_ROW,FXTable::onUpdDeleteRow), FXMAPFUNC(SEL_UPDATE,FXTable::ID_INSERT_COLUMN,FXTable::onUpdInsertColumn), FXMAPFUNC(SEL_COMMAND,FXTable::ID_INSERT_COLUMN,FXTable::onCmdInsertColumn), FXMAPFUNC(SEL_UPDATE,FXTable::ID_INSERT_ROW,FXTable::onUpdInsertRow), FXMAPFUNC(SEL_COMMAND,FXTable::ID_INSERT_ROW,FXTable::onCmdInsertRow), FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_LEFT,FXTable::onCmdMoveLeft), FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_RIGHT,FXTable::onCmdMoveRight), FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_UP,FXTable::onCmdMoveUp), FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_DOWN,FXTable::onCmdMoveDown), FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_HOME,FXTable::onCmdMoveHome), FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_END,FXTable::onCmdMoveEnd), FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_TOP,FXTable::onCmdMoveTop), FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_BOTTOM,FXTable::onCmdMoveBottom), FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_PAGEDOWN,FXTable::onCmdMovePageDown), FXMAPFUNC(SEL_COMMAND,FXTable::ID_MOVE_PAGEUP,FXTable::onCmdMovePageUp), FXMAPFUNC(SEL_COMMAND,FXTable::ID_SELECT_ROW_INDEX,FXTable::onCmdSelectRowIndex), FXMAPFUNC(SEL_COMMAND,FXTable::ID_SELECT_COLUMN_INDEX,FXTable::onCmdSelectColumnIndex), FXMAPFUNC(SEL_UPDATE,FXTable::ID_SELECT_COLUMN,FXTable::onUpdSelectColumn), FXMAPFUNC(SEL_COMMAND,FXTable::ID_SELECT_COLUMN,FXTable::onCmdSelectColumn), FXMAPFUNC(SEL_UPDATE,FXTable::ID_SELECT_ROW,FXTable::onUpdSelectRow), FXMAPFUNC(SEL_COMMAND,FXTable::ID_SELECT_ROW,FXTable::onCmdSelectRow), FXMAPFUNC(SEL_UPDATE,FXTable::ID_SELECT_CELL,FXTable::onUpdSelectCell), FXMAPFUNC(SEL_COMMAND,FXTable::ID_SELECT_CELL,FXTable::onCmdSelectCell), FXMAPFUNC(SEL_UPDATE,FXTable::ID_SELECT_ALL,FXTable::onUpdSelectAll), FXMAPFUNC(SEL_COMMAND,FXTable::ID_SELECT_ALL,FXTable::onCmdSelectAll), FXMAPFUNC(SEL_UPDATE,FXTable::ID_DESELECT_ALL,FXTable::onUpdDeselectAll), FXMAPFUNC(SEL_COMMAND,FXTable::ID_DESELECT_ALL,FXTable::onCmdDeselectAll), FXMAPFUNC(SEL_COMMAND,FXTable::ID_MARK,FXTable::onCmdMark), FXMAPFUNC(SEL_COMMAND,FXTable::ID_EXTEND,FXTable::onCmdExtend), FXMAPFUNC(SEL_COMMAND,FXTable::ID_CUT_SEL,FXTable::onCmdCutSel), FXMAPFUNC(SEL_UPDATE,FXTable::ID_CUT_SEL,FXTable::onUpdHaveSelection), FXMAPFUNC(SEL_COMMAND,FXTable::ID_COPY_SEL,FXTable::onCmdCopySel), FXMAPFUNC(SEL_UPDATE,FXTable::ID_COPY_SEL,FXTable::onUpdHaveSelection), FXMAPFUNC(SEL_COMMAND,FXTable::ID_DELETE_SEL,FXTable::onCmdDeleteSel), FXMAPFUNC(SEL_UPDATE,FXTable::ID_DELETE_SEL,FXTable::onUpdHaveSelection), FXMAPFUNC(SEL_COMMAND,FXTable::ID_PASTE_SEL,FXTable::onCmdPasteSel), FXMAPFUNC(SEL_COMMAND,FXTable::ID_START_INPUT,FXTable::onCmdStartInput), FXMAPFUNC(SEL_UPDATE,FXTable::ID_START_INPUT,FXTable::onUpdStartInput), FXMAPFUNC(SEL_COMMAND,FXTable::ID_CANCEL_INPUT,FXTable::onCmdCancelInput), FXMAPFUNC(SEL_UPDATE,FXTable::ID_CANCEL_INPUT,FXTable::onUpdAcceptInput), FXMAPFUNC(SEL_COMMAND,FXTable::ID_ACCEPT_INPUT,FXTable::onCmdAcceptInput), FXMAPFUNC(SEL_UPDATE,FXTable::ID_ACCEPT_INPUT,FXTable::onUpdAcceptInput), FXMAPFUNC(SEL_UPDATE,FXTable::ID_TOGGLE_EDITABLE,FXTable::onUpdToggleEditable), FXMAPFUNC(SEL_COMMAND,FXTable::ID_TOGGLE_EDITABLE,FXTable::onCmdToggleEditable), }; // Object implementation FXIMPLEMENT(FXTable,FXScrollArea,FXTableMap,ARRAYNUMBER(FXTableMap)) // So we can cut and paste into MS EXCEL const FXchar FXTable::csvTypeName[]="Csv"; // Drag types FXDragType FXTable::csvType=0; /*******************************************************************************/ // Serialization FXTable::FXTable(){ flags|=FLAG_ENABLED; colHeader=NULL; rowHeader=NULL; cornerButton=NULL; FXCALLOC(&cells,FXTableItem*,1); editor=NULL; font=NULL; nrows=0; ncols=0; visiblerows=0; visiblecols=0; margintop=0; marginbottom=0; marginleft=0; marginright=0; textColor=0; baseColor=0; hiliteColor=0; shadowColor=0; borderColor=0; selbackColor=0; seltextColor=0; gridColor=0; stippleColor=0; cellBorderColor=0; cellBorderWidth=0; cellBackColor[0][0]=0; cellBackColor[0][1]=0; cellBackColor[1][0]=0; cellBackColor[1][1]=0; defColWidth=DEFAULTCOLWIDTH; defRowHeight=DEFAULTROWHEIGHT; current.row=-1; current.col=-1; anchor.row=-1; anchor.col=-1; input.fm.row=-1; input.fm.col=-1; input.to.row=-1; input.to.col=-1; selection.fm.row=-1; selection.fm.col=-1; selection.to.row=-1; selection.to.col=-1; mode=MOUSE_NONE; vgrid=TRUE; hgrid=TRUE; grabx=0; graby=0; rowcol=0; } // Build table FXTable::FXTable(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXScrollArea(p,opts,x,y,w,h){ FXuint colhs=HEADER_HORIZONTAL|HEADER_TRACKING|HEADER_BUTTON|FRAME_RAISED|FRAME_THICK|LAYOUT_FIX_HEIGHT; FXuint rowhs=HEADER_VERTICAL|HEADER_TRACKING|HEADER_BUTTON|FRAME_RAISED|FRAME_THICK|LAYOUT_FIX_WIDTH; if(options&TABLE_COL_SIZABLE) colhs|=HEADER_RESIZE; if(options&TABLE_NO_COLSELECT) colhs&=~HEADER_BUTTON; if(options&TABLE_ROW_SIZABLE) rowhs|=HEADER_RESIZE; if(options&TABLE_NO_ROWSELECT) rowhs&=~HEADER_BUTTON; colHeader=new FXHeader(this,this,FXTable::ID_SELECT_COLUMN_INDEX,colhs,0,0,0,DEFAULTROWHEIGHT); rowHeader=new FXHeader(this,this,FXTable::ID_SELECT_ROW_INDEX,rowhs,0,0,DEFAULTCOLWIDTH,0); cornerButton=new FXButton(this,FXString::null,NULL,this,FXTable::ID_SELECT_ALL,FRAME_RAISED|FRAME_THICK); flags|=FLAG_ENABLED; target=tgt; message=sel; editor=NULL; FXCALLOC(&cells,FXTableItem*,1); font=getApp()->getNormalFont(); nrows=0; ncols=0; visiblerows=0; visiblecols=0; margintop=pt; marginbottom=pb; marginleft=pl; marginright=pr; textColor=getApp()->getForeColor(); baseColor=getApp()->getBaseColor(); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); borderColor=getApp()->getBorderColor(); selbackColor=getApp()->getSelbackColor(); seltextColor=getApp()->getSelforeColor(); gridColor=getApp()->getBaseColor(); stippleColor=FXRGB(255,0,0); cellBorderColor=getApp()->getBorderColor(); cellBorderWidth=2; cellBackColor[0][0]=getApp()->getBackColor(); // Even row, even column cellBackColor[0][1]=getApp()->getBackColor(); // Even row, odd column cellBackColor[1][0]=getApp()->getBackColor(); // Odd row, even column cellBackColor[1][1]=getApp()->getBackColor(); // Odd row, odd column defColWidth=DEFAULTCOLWIDTH; defRowHeight=DEFAULTROWHEIGHT; current.row=-1; current.col=-1; anchor.row=-1; anchor.col=-1; input.fm.row=-1; input.fm.col=-1; input.to.row=-1; input.to.col=-1; selection.fm.row=-1; selection.fm.col=-1; selection.to.row=-1; selection.to.col=-1; vgrid=TRUE; hgrid=TRUE; mode=MOUSE_NONE; grabx=0; graby=0; rowcol=0; } // Create item FXTableItem* FXTable::createItem(const FXString& text,FXIcon* icon,void* ptr){ return new FXTableItem(text,icon,ptr); } // Create window void FXTable::create(){ register FXint n=nrows*ncols; register FXint i; FXScrollArea::create(); if(!deleteType){ deleteType=getApp()->registerDragType(deleteTypeName); } if(!textType){ textType=getApp()->registerDragType(textTypeName); } if(!utf8Type){ utf8Type=getApp()->registerDragType(utf8TypeName); } if(!utf16Type){ utf16Type=getApp()->registerDragType(utf16TypeName); } if(!csvType){ csvType=getApp()->registerDragType(csvTypeName); } for(i=0; icreate(); } font->create(); } // Detach window void FXTable::detach(){ register FXint n=nrows*ncols; register FXint i; FXScrollArea::detach(); for(i=0; idetach(); } font->detach(); deleteType=0; textType=0; csvType=0; } // Get default width; logic is as follows: // If we don't honor the visible columns, calculate as FXScrollArea. // If we honor visible columns, calculate the size based on that; // if there MAY be a horizontal scroller AND its minimum size exceeds // this, then that will determine its size. // Finally, if there MAY be a vertical scroller we assume it will be // included in the calculation. FXint FXTable::getDefaultWidth(){ register FXint w,t; if(0getLayoutHints()&LAYOUT_FIX_WIDTH) w+=rowHeader->getWidth(); else w+=rowHeader->getDefaultWidth(); if(!(options&HSCROLLER_NEVER) && (t=horizontal->getDefaultWidth())>w) w=t; if(!(options&VSCROLLER_NEVER)) w+=vertical->getDefaultWidth(); return w; } return FXScrollArea::getDefaultWidth(); } // Get default height; similar logic as above FXint FXTable::getDefaultHeight(){ register FXint h,t; if(0getLayoutHints()&LAYOUT_FIX_HEIGHT) h+=colHeader->getHeight(); else h+=colHeader->getDefaultHeight(); if(!(options&VSCROLLER_NEVER) && (t=vertical->getDefaultHeight())>h) h=t; if(!(options&HSCROLLER_NEVER)) h+=horizontal->getDefaultHeight(); return h; } return FXScrollArea::getDefaultHeight(); } // Can have focus bool FXTable::canFocus() const { return true; } // Into focus chain void FXTable::setFocus(){ FXScrollArea::setFocus(); setDefault(TRUE); } // Out of focus chain void FXTable::killFocus(){ FXScrollArea::killFocus(); setDefault(MAYBE); acceptInput(TRUE); } // Notification that focus moved to new child void FXTable::changeFocus(FXWindow *child){ FXWindow::changeFocus(child); /* // Focus on child if(child){ // Location of item FXint r=rowAtY(child->getY()); FXint c=colAtX(child->getX()); FXTRACE((100,"changeFocus: x=%d y=%d r=%d c=%d\n",child->getX(),child->getY(),r,c)); // Item inside one of the cells if(0<=r && rgetY()+rowHeader->getItemOffset(r))); FXTRACE((100,"changeFocus: xx=%d\n",colHeader->getX()+colHeader->getItemOffset(c))); // Deactivate old item if(0<=current.row && 0<=current.col){ FXASSERT(current.rowsetFocus(FALSE); updateItem(current.row,current.col); } } } // Now is current item current.row=r; current.col=c; // Activate new item if(0<=current.row && 0<=current.col){ FXASSERT(current.rowsetFocus(TRUE); updateItem(current.row,current.col); } } } // Notify item change if(target){ target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)¤t); } } } */ } // Determine scrollable content width FXint FXTable::getContentWidth(){ register FXint w=colHeader->getTotalSize()+vgrid; if(rowHeader->getLayoutHints()&LAYOUT_FIX_WIDTH) w+=rowHeader->getWidth(); else w+=rowHeader->getDefaultWidth(); return w; } // Determine scrollable content height FXint FXTable::getContentHeight(){ register FXint h=rowHeader->getTotalSize()+hgrid; if(colHeader->getLayoutHints()&LAYOUT_FIX_HEIGHT) h+=colHeader->getHeight(); else h+=colHeader->getDefaultHeight(); return h; } // Starting row of multi-column cell FXint FXTable::startRow(FXint row,FXint col) const { register FXTableItem *item=cells[row*ncols+col]; if(item){ while(0setPosition(x); rowHeader->setPosition(y); // Scroll table scroll(colHeader->getX(),rowHeader->getY(),FXMIN(colHeader->getTotalSize()+vgrid,width),FXMIN(rowHeader->getTotalSize()+hgrid,height),dx,dy); // Place editor control if(editor){ editor->move(getColumnX(input.fm.col)+vgrid,getRowY(input.fm.row)+hgrid); } } // Recalculate layout determines item locations and sizes void FXTable::layout(){ register FXint roww,colh,x,y,w,h; // Calculate contents FXScrollArea::layout(); // Size up column header height if(colHeader->getLayoutHints()&LAYOUT_FIX_HEIGHT) colh=colHeader->getHeight(); else colh=colHeader->getDefaultHeight(); // Size up row header width if(rowHeader->getLayoutHints()&LAYOUT_FIX_WIDTH) roww=rowHeader->getWidth(); else roww=rowHeader->getDefaultWidth(); // Place headers colHeader->position(roww,0,viewport_w-roww,colh); rowHeader->position(0,colh,roww,viewport_h-colh); cornerButton->position(0,0,roww,colh); cornerButton->raise(); colHeader->raise(); rowHeader->raise(); // Determine line size for scroll bars vertical->setLine(defRowHeight); horizontal->setLine(defColWidth); // Place editor control if(editor){ x=getColumnX(input.fm.col)+vgrid; y=getRowY(input.fm.row)+hgrid; w=getColumnX(input.to.col)+getColumnWidth(input.to.col)-x; h=getRowY(input.to.row)+getRowHeight(input.to.row)-y; editor->position(x,y,w,h); } // Force repaint update(); // No more dirty flags&=~FLAG_DIRTY; } // Get column containing x FXint FXTable::colAtX(FXint x) const { return colHeader->getItemAt(x-colHeader->getX()); } // Get row containing y FXint FXTable::rowAtY(FXint y) const { return rowHeader->getItemAt(y-rowHeader->getY()); } // Return TRUE if its a spanning cell FXbool FXTable::isItemSpanning(FXint r,FXint c) const { register FXTableItem *item=cells[r*ncols+c]; return item && ((0getItem(c)->getPos(); xhi=colHeader->getItem(c)->getSize()+xlo; if(px+xhi >= viewport_w-colHeader->getX()) px=viewport_w-colHeader->getX()-xhi; if(px+xlo <= 0) px=-xlo; } if(0<=r && rgetItem(r)->getPos(); yhi=rowHeader->getItem(r)->getSize()+ylo; if(py+yhi >= viewport_h-rowHeader->getY()) py=viewport_h-rowHeader->getY()-yhi; if(py+ylo <= 0) py=-ylo; } setPosition(px,py); } } // True if item (partially) visible FXbool FXTable::isItemVisible(FXint r,FXint c) const { register FXint xl,xr,yt,yb; if(r<0 || c<0 || nrows<=r || ncols<=c){ fxerror("%s::isItemVisible: index out of range.\n",getClassName()); } xl=colHeader->getItem(c)->getPos(); xr=colHeader->getItem(c)->getSize()+xl; yt=rowHeader->getItem(r)->getPos(); yb=rowHeader->getItem(r)->getSize()+yt; return 0getX() && pos_y+ytgetY(); } // Repaint cells between grid lines sr,er and grid lines sc,ec void FXTable::updateRange(FXint sr,FXint er,FXint sc,FXint ec) const { FXint xl,xr,yt,yb; if(sr<0 || sc<0 || nrows<=er || ncols<=ec){ fxerror("%s::updateRange: index out of range.\n",getClassName()); } if(sr<=er && sc<=ec){ xl=colHeader->getX()+colHeader->getItemOffset(sc); xr=colHeader->getX()+colHeader->getItemOffset(ec)+colHeader->getItemSize(ec); yt=rowHeader->getY()+rowHeader->getItemOffset(sr); yb=rowHeader->getY()+rowHeader->getItemOffset(er)+rowHeader->getItemSize(er); update(xl,yt,xr-xl+vgrid,yb-yt+hgrid); } } // Repaint void FXTable::updateItem(FXint r,FXint c) const { if(r<0 || c<0 || nrows<=r || ncols<=c){ fxerror("%s::updateItem: index out of range.\n",getClassName()); } updateRange(startRow(r,c),endRow(r,c),startCol(r,c),endCol(r,c)); } // Update column numbers void FXTable::updateColumnNumbers(FXint lo,FXint hi){ FXString label; for(FXint c=lo; csetSelected(FALSE); } if(item->getText()!=text){ if(notify && target){ FXTableRange tablerange; tablerange.fm.row=startRow(r,c); tablerange.fm.col=startCol(r,c); tablerange.to.row=endRow(r,c); tablerange.to.col=endCol(r,c); target->tryHandle(this,FXSEL(SEL_REPLACED,message),(void*)&tablerange); } item->setText(text); updateItem(r,c); } } // Get item text FXString FXTable::getItemText(FXint r,FXint c) const { if(r<0 || c<0 || nrows<=r || ncols<=c){ fxerror("%s::getItemText: index out of range.\n",getClassName()); } if(cells[r*ncols+c]) return cells[r*ncols+c]->getText(); return FXString::null; } // Set item icon void FXTable::setItemIcon(FXint r,FXint c,FXIcon* icon,FXbool owned,FXbool notify){ if(r<0 || c<0 || nrows<=r || ncols<=c){ fxerror("%s::setItemIcon: index out of range.\n",getClassName()); } register FXTableItem* item=cells[r*ncols+c]; if(item==NULL){ cells[r*ncols+c]=item=createItem(FXString::null,NULL,NULL); if(isItemSelected(r,c)) item->setSelected(FALSE); } if(item->getIcon()!=icon){ if(notify && target){ FXTableRange tablerange; tablerange.fm.row=startRow(r,c); tablerange.fm.col=startCol(r,c); tablerange.to.row=endRow(r,c); tablerange.to.col=endCol(r,c); target->tryHandle(this,FXSEL(SEL_REPLACED,message),(void*)&tablerange); } updateItem(r,c); } item->setIcon(icon,owned); } // Get item icon FXIcon* FXTable::getItemIcon(FXint r,FXint c) const { if(r<0 || c<0 || nrows<=r || ncols<=c){ fxerror("%s::getItemIcon: index out of range.\n",getClassName()); } return cells[r*ncols+c] ? cells[r*ncols+c]->getIcon() : NULL; } // Set item data void FXTable::setItemData(FXint r,FXint c,void* ptr){ if(r<0 || c<0 || nrows<=r || ncols<=c){ fxerror("%s::setItemData: index out of range.\n",getClassName()); } register FXTableItem* item=cells[r*ncols+c]; if(item==NULL){ cells[r*ncols+c]=item=createItem(FXString::null,NULL,NULL); if(isItemSelected(r,c)) item->setSelected(FALSE); } item->setData(ptr); } // Get item data void* FXTable::getItemData(FXint r,FXint c) const { if(r<0 || c<0 || nrows<=r || ncols<=c){ fxerror("%s::getItemData: index out of range.\n",getClassName()); } return cells[r*ncols+c] ? cells[r*ncols+c]->getData() : NULL; } // True if item is current FXbool FXTable::isItemCurrent(FXint r,FXint c) const { if(r<0 || c<0 || nrows<=r || ncols<=c){ fxerror("%s::isItemCurrent: index out of range.\n",getClassName()); } return current.row==r && current.col==c; } // True if item is enabled FXbool FXTable::isItemEnabled(FXint r,FXint c) const { return (0<=r && 0<=c && risEnabled())); } // Enable one item FXbool FXTable::enableItem(FXint r,FXint c){ if(0<=r && 0<=c && rsetSelected(FALSE); } if(!item->isEnabled()){ item->setEnabled(TRUE); updateItem(r,c); return TRUE; } } return FALSE; } // Disable one item FXbool FXTable::disableItem(FXint r,FXint c){ if(0<=r && 0<=c && rsetSelected(FALSE); } if(item->isEnabled()){ item->setEnabled(FALSE); updateItem(r,c); return TRUE; } } return FALSE; } // Change item justification void FXTable::setItemJustify(FXint r,FXint c,FXuint justify){ if(r<0 || nrows<=r || c<0 || ncols<=c){ fxerror("%s::setItemJustify: index out of range.\n",getClassName()); } register FXTableItem* item=cells[r*ncols+c]; if(item==NULL){ cells[r*ncols+c]=item=createItem(FXString::null,NULL,NULL); if(isItemSelected(r,c)) item->setSelected(FALSE); } if(item->getJustify()!=justify){ item->setJustify(justify); updateItem(r,c); } } // Return item justification FXuint FXTable::getItemJustify(FXint r,FXint c) const { if(r<0 || nrows<=r || c<0 || ncols<=c){ fxerror("%s::getItemJustify: index out of range.\n",getClassName()); } return cells[r*ncols+c] ? cells[r*ncols+c]->getJustify() : 0; } // Change relative position of icon and text of item void FXTable::setItemIconPosition(FXint r,FXint c,FXuint mode){ if(r<0 || nrows<=r || c<0 || ncols<=c){ fxerror("%s::setItemIconPosition: index out of range.\n",getClassName()); } register FXTableItem* item=cells[r*ncols+c]; if(item==NULL){ cells[r*ncols+c]=item=createItem(FXString::null,NULL,NULL); if(isItemSelected(r,c)) item->setSelected(FALSE); } if(item->getIconPosition()!=mode){ item->setIconPosition(mode); updateItem(r,c); } } // Return relative icon and text position FXuint FXTable::getItemIconPosition(FXint r,FXint c) const { if(r<0 || nrows<=r || c<0 || ncols<=c){ fxerror("%s::getItemIconPosition: index out of range.\n",getClassName()); } return cells[r*ncols+c] ? cells[r*ncols+c]->getIconPosition() : 0; } // Change item border style void FXTable::setItemBorders(FXint r,FXint c,FXuint borders){ if(r<0 || nrows<=r || c<0 || ncols<=c){ fxerror("%s::setItemBorders: index out of range.\n",getClassName()); } register FXTableItem* item=cells[r*ncols+c]; if(item==NULL){ cells[r*ncols+c]=item=createItem(FXString::null,NULL,NULL); if(isItemSelected(r,c)) item->setSelected(FALSE); } if(item->getBorders()!=borders){ item->setBorders(borders); updateItem(r,c); } } // Return item border style FXuint FXTable::getItemBorders(FXint r,FXint c) const { if(r<0 || nrows<=r || c<0 || ncols<=c){ fxerror("%s::getItemBorders: index out of range.\n",getClassName()); } return cells[r*ncols+c] ? cells[r*ncols+c]->getBorders() : 0; } // Change item background stipple style void FXTable::setItemStipple(FXint r,FXint c,FXStipplePattern pattern){ if(r<0 || nrows<=r || c<0 || ncols<=c){ fxerror("%s::setItemStipple: index out of range.\n",getClassName()); } register FXTableItem* item=cells[r*ncols+c]; if(item==NULL){ cells[r*ncols+c]=item=createItem(FXString::null,NULL,NULL); if(isItemSelected(r,c)) item->setSelected(FALSE); } if(item->getStipple()!=pattern){ item->setStipple(pattern); updateItem(r,c); } } // return item background stipple style FXStipplePattern FXTable::getItemStipple(FXint r,FXint c) const { if(r<0 || nrows<=r || c<0 || ncols<=c){ fxerror("%s::getItemStipple: index out of range.\n",getClassName()); } return cells[r*ncols+c] ? cells[r*ncols+c]->getStipple() : STIPPLE_NONE; } // Extract cells from given range as text void FXTable::extractText(FXchar*& text,FXint& size,FXint startrow,FXint endrow,FXint startcol,FXint endcol,const FXchar* cs,const FXchar* rs) const { register FXint ncs,nrs,sz,r,c; register FXchar *ptr; FXString string; // Verify arguments if(cs==NULL || rs==NULL){ fxerror("%s::extractText: bad argument.\n",getClassName()); } // Verify range if(startrow<0 || startcol<0 || nrows<=endrow || ncols<=endcol){ fxerror("%s::extractText: index out of range.\n",getClassName()); } // Initialize text=NULL; size=0; // Non-empty range if(startrow<=endrow && startcol<=endcol){ ncs=strlen(cs); nrs=strlen(rs); // Space for separators sz=(endrow-startrow)*((endcol-startcol)*ncs+nrs); // Space for each cell for(r=startrow; r<=endrow; r++){ for(c=startcol; c<=endcol; c++){ sz+=getItemText(r,c).length(); } } // Fill text from cells if(FXMALLOC(&text,FXchar,sz+1)){ size=sz; ptr=text; for(r=startrow; r<=endrow; r++){ for(c=startcol; c<=endcol; c++){ string=getItemText(r,c); memcpy(ptr,string.text(),string.length()); ptr+=string.length(); if(c==endcol){ memcpy(ptr,rs,nrs); ptr+=nrs; } else{ memcpy(ptr,cs,ncs); ptr+=ncs; } } } *ptr='\0'; // Its there but not accounted for... } } } // Extract cells from given range as text void FXTable::extractText(FXString& text,FXint startrow,FXint endrow,FXint startcol,FXint endcol,const FXchar* cs,const FXchar* rs) const { register FXint ncs,nrs,sz,r,c,p; FXString string; // Verify arguments if(cs==NULL || rs==NULL){ fxerror("%s::extractText: bad argument.\n",getClassName()); } // Verify range if(startrow<0 || startcol<0 || nrows<=endrow || ncols<=endcol){ fxerror("%s::extractText: index out of range.\n",getClassName()); } // Empty it text.clear(); // Non-empty range if(startrow<=endrow && startcol<=endcol){ ncs=strlen(cs); nrs=strlen(rs); // Space for separators sz=(endrow-startrow)*((endcol-startcol)*ncs+nrs); // Space for each cell for(r=startrow; r<=endrow; r++){ for(c=startcol; c<=endcol; c++){ sz+=getItemText(r,c).length(); } } // Fill text from cells text.length(sz); for(r=startrow,p=0; r<=endrow; r++){ for(c=startcol; c<=endcol; c++){ string=getItemText(r,c); text.replace(p,string.length(),string); p+=string.length(); if(c==endcol){ text.replace(p,nrs,rs,nrs); p+=nrs; } else{ text.replace(p,ncs,cs,ncs); p+=ncs; } } } } } // Count rows and columns of a block of text void FXTable::countText(FXint& nr,FXint& nc,const FXchar* text,FXint size,const FXchar* cs,const FXchar* rs) const { register FXint c=0,i=0,item=0; // Verify arguments if(size<0 || text==NULL || cs==NULL || rs==NULL){ fxerror("%s::countText: bad argument.\n",getClassName()); } nr=nc=0; // Count the text while(1){ if(i>=size || text[i]=='\0'){ if(item){ c++; if(c>nc) nc=c; nr++; } break; } else if(strchr(rs,text[i])){ item=0; c++; if(c>nc) nc=c; nr++; c=0; } else if(strchr(cs,text[i])){ item=1; c++; } else{ item=1; } i++; } FXTRACE((100,"countText nr=%d nc=%d\n",nr,nc)); } // Count rows and columns of a block of text void FXTable::countText(FXint& nr,FXint& nc,const FXString& text,const FXchar* cs,const FXchar* rs) const { countText(nr,nc,text.text(),text.length(),cs,rs); } // Overlay text over given cell range void FXTable::overlayText(FXint startrow,FXint endrow,FXint startcol,FXint endcol,const FXchar* text,FXint size,const FXchar* cs,const FXchar* rs,FXbool notify){ register FXint beg=0,end=0,r,c; // Verify arguments if(size<0 || text==NULL || cs==NULL || rs==NULL){ fxerror("%s::overlayText: bad argument.\n",getClassName()); } // Verify range if(startrow<0 || startcol<0 || startrow>endrow || startcol>endcol){ fxerror("%s::overlayText: index out of range.\n",getClassName()); } // Expand number of rows if required if(endrow>=nrows){ insertRows(nrows,endrow-nrows+1,notify); } // Expand number of columns if required if(endcol>=ncols){ insertColumns(ncols,endcol-ncols+1,notify); } // Insert point r=startrow; c=startcol; // Overlay new data while(1){ if(end>=size || text[end]=='\0'){ if(r<=endrow && c<=endcol){ setItemText(r,c,FXString(&text[beg],end-beg),notify); } break; } else if(strchr(rs,text[end])){ if(r<=endrow && c<=endcol){ setItemText(r,c,FXString(&text[beg],end-beg),notify); } beg=end+1; c=startcol; r++; } else if(strchr(cs,text[end])){ if(r<=endrow && c<=endcol){ setItemText(r,c,FXString(&text[beg],end-beg),notify); } beg=end+1; c++; } end++; } } // Overlay text over given cell range void FXTable::overlayText(FXint startrow,FXint endrow,FXint startcol,FXint endcol,const FXString& text,const FXchar* cs,const FXchar* rs,FXbool notify){ overlayText(startrow,endrow,startcol,endcol,text.text(),text.length(),cs,rs,notify); } // Set current item void FXTable::setCurrentItem(FXint r,FXint c,FXbool notify){ register FXTableItem* item; // Verify input indices r=FXCLAMP(-1,r,nrows-1); c=FXCLAMP(-1,c,ncols-1); // End editing acceptInput(notify); // Did it change if(r!=current.row || c!=current.col){ // Deactivate old item if(0<=current.row && 0<=current.col){ FXASSERT(current.rowsetFocus(FALSE); } } updateItem(current.row,current.col); } current.row=r; current.col=c; // Activate new item if(0<=current.row && 0<=current.col){ FXASSERT(current.rowsetFocus(TRUE); } } updateItem(current.row,current.col); } // Notify item change if(notify && target){ target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)¤t); } } } // Set anchor item void FXTable::setAnchorItem(FXint r,FXint c){ anchor.row=FXCLAMP(-1,r,nrows-1); anchor.col=FXCLAMP(-1,c,ncols-1); } // Extend range to include spanning cells void FXTable::spanningRange(FXint& sr,FXint& er,FXint& sc,FXint& ec,FXint anchrow,FXint anchcol,FXint currow,FXint curcol){ register FXint i,t; // Current position in table FXASSERT(0<=currow && currowec){ ec=t; goto a; } } for(i=sc; i<=ec; i++){ if((t=startRow(sr,i))er){ er=t; goto a; } } FXASSERT(0<=sr && sr<=er && errhi) rhi=orhi; if(oclochi) chi=ochi; } // Hopefully FXASSERT(0<=rlo && rlo<=rhi && rhisetSelected(FALSE); } updateItem(tablepos.row,tablepos.col); if(notify && target) target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)&tablepos); } else if(!inold && innew){ if(item){ item->setSelected(TRUE); } updateItem(tablepos.row,tablepos.col); if(notify && target) target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)&tablepos); } } } return TRUE; } return FALSE; } // Kill selection FXbool FXTable::killSelection(FXbool notify){ FXTablePos tablepos; FXTableItem *item; if(isAnythingSelected()){ for(tablepos.row=selection.fm.row; tablepos.row<=selection.to.row; tablepos.row++){ for(tablepos.col=selection.fm.col; tablepos.col<=selection.to.col; tablepos.col++){ item=cells[tablepos.row*ncols+tablepos.col]; if(item){ item->setSelected(FALSE); } updateItem(tablepos.row,tablepos.col); if(notify && target) target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)&tablepos); } } selection.fm.row=-1; selection.fm.col=-1; selection.to.row=-1; selection.to.col=-1; return TRUE; } return FALSE; } // Get input control to edit the item FXWindow *FXTable::getControlForItem(FXint r,FXint c){ register FXTableItem* item=cells[r*ncols+c]; if(item==NULL){ cells[r*ncols+c]=item=createItem(FXString::null,NULL,NULL); if(isItemSelected(r,c)) item->setSelected(FALSE); } return item->getControlFor(this); } // Set the item from the input control void FXTable::setItemFromControl(FXint r,FXint c,FXWindow *control){ register FXTableItem* item=cells[r*ncols+c]; if(item==NULL){ cells[r*ncols+c]=item=createItem(FXString::null,NULL,NULL); if(isItemSelected(r,c)) item->setSelected(FALSE); } item->setFromControl(control); } // Start to edit a cell void FXTable::startInput(FXint r,FXint c){ if(0<=r && 0<=c && !editor){ editor=getControlForItem(r,c); if(editor){ input.fm.row=startRow(r,c); input.fm.col=startCol(r,c); input.to.row=endRow(r,c); input.to.col=endCol(r,c); editor->setTarget(this); editor->setSelector(ID_ACCEPT_INPUT); editor->setFocus(); recalc(); } } } // Cancel editing cell void FXTable::cancelInput(){ if(editor){ delete editor; input.fm.row=-1; input.to.row=-1; input.fm.col=-1; input.to.col=-1; editor=NULL; } } // Done with editing cell void FXTable::acceptInput(FXbool notify){ if(editor){ FXTableRange tablerange=input; setItemFromControl(input.fm.row,input.fm.col,editor); cancelInput(); if(notify && target){ target->tryHandle(this,FXSEL(SEL_REPLACED,message),(void*)&tablerange); } } } // Start edit of current cell long FXTable::onCmdStartInput(FXObject*,FXSelector,void*){ if(isEditable() && isItemEnabled(current.row,current.col)){ startInput(current.row,current.col); } else{ getApp()->beep(); } return 1; } // Update start edit long FXTable::onUpdStartInput(FXObject* sender,FXSelector,void*){ sender->handle(this,(isEditable() && isItemEnabled(current.row,current.col) && !editor)?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Cancel edit long FXTable::onCmdCancelInput(FXObject*,FXSelector,void*){ cancelInput(); return 1; } // End edit long FXTable::onCmdAcceptInput(FXObject*,FXSelector,void*){ acceptInput(TRUE); return 1; } // Update end edit long FXTable::onUpdAcceptInput(FXObject* sender,FXSelector,void*){ sender->handle(this,editor ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Gained focus long FXTable::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ register FXTableItem *item; FXScrollArea::onFocusIn(sender,sel,ptr); if(0<=current.row && 0<=current.col){ FXASSERT(current.rowsetFocus(TRUE); updateItem(current.row,current.col); } return 1; } // Lost focus long FXTable::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ register FXTableItem *item; FXScrollArea::onFocusOut(sender,sel,ptr); if(0<=current.row && 0<=current.col){ FXASSERT(current.rowsetFocus(FALSE); updateItem(current.row,current.col); } return 1; } // We have the selection long FXTable::onSelectionGained(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onSelectionGained(sender,sel,ptr); return 1; } // We lost the selection long FXTable::onSelectionLost(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onSelectionLost(sender,sel,ptr); killSelection(TRUE); return 1; } // Somebody wants our selection long FXTable::onSelectionRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; // Perhaps the target wants to supply its own data for the selection if(FXScrollArea::onSelectionRequest(sender,sel,ptr)) return 1; // Recognize the request? if(event->target==stringType || event->target==textType || event->target==utf8Type || event->target==utf16Type){ FXString string; // Get selected fragment extractText(string,selection.fm.row,selection.to.row,selection.fm.col,selection.to.col); // Return text of the selection as UTF-8 if(event->target==utf8Type){ FXTRACE((100,"Request UTF8\n")); setDNDData(FROM_SELECTION,event->target,string); return 1; } // Return text of the selection translated to 8859-1 if(event->target==stringType || event->target==textType){ FX88591Codec ascii; FXTRACE((100,"Request ASCII\n")); string=ascii.utf2mb(string); setDNDData(FROM_SELECTION,event->target,string); return 1; } // Return text of the selection translated to UTF-16 if(event->target==utf16Type){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Request UTF16\n")); string=unicode.utf2mb(string); setDNDData(FROM_SELECTION,event->target,string); return 1; } } return 0; } // We now really do have the selection long FXTable::onClipboardGained(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onClipboardGained(sender,sel,ptr); return 1; } // We lost the selection somehow long FXTable::onClipboardLost(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onClipboardLost(sender,sel,ptr); clipped.clear(); return 1; } // Somebody wants our selection long FXTable::onClipboardRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; // Try handling it in base class first if(FXScrollArea::onClipboardRequest(sender,sel,ptr)) return 1; // Requested data from clipboard if(event->target==csvType || event->target==stringType || event->target==textType || event->target==utf8Type || event->target==utf16Type){ FXString string=clipped; // Expand newlines to CRLF on Windows #ifdef WIN32 unixToDos(string); #endif // Return clipped text as CSV if(event->target==csvType){ FXTRACE((100,"Request CSV\n")); string.substitute('\t',',',true); setDNDData(FROM_CLIPBOARD,event->target,string); return 1; } // Return clipped text as UTF-8 if(event->target==utf8Type){ FXTRACE((100,"Request UTF8\n")); setDNDData(FROM_CLIPBOARD,event->target,string); return 1; } // Return clipped text translated to 8859-1 if(event->target==stringType || event->target==textType){ FX88591Codec ascii; FXTRACE((100,"Request ASCII\n")); setDNDData(FROM_CLIPBOARD,event->target,ascii.utf2mb(clipped)); return 1; } // Return text of the selection translated to UTF-16 if(event->target==utf16Type){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Request UTF16\n")); setDNDData(FROM_CLIPBOARD,event->target,unicode.utf2mb(clipped)); return 1; } } return 0; } // Update items that operate on the selection long FXTable::onUpdHaveSelection(FXObject* sender,FXSelector,void*){ sender->handle(this,isAnythingSelected()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Cut selection long FXTable::onCmdCutSel(FXObject*,FXSelector,void*){ if(isEditable()){ if(isAnythingSelected()){ FXDragType types[5]; types[0]=stringType; types[1]=textType; types[2]=csvType; types[3]=utf8Type; types[4]=utf16Type; if(acquireClipboard(types,5)){ extractText(clipped,selection.fm.row,selection.to.row,selection.fm.col,selection.to.col); removeRange(selection.fm.row,selection.to.row,selection.fm.col,selection.to.col,TRUE); } } } else{ getApp()->beep(); } return 1; } // Copy selection long FXTable::onCmdCopySel(FXObject*,FXSelector,void*){ if(isAnythingSelected()){ FXDragType types[5]; types[0]=stringType; types[1]=textType; types[2]=csvType; types[3]=utf8Type; types[4]=utf16Type; if(acquireClipboard(types,5)){ extractText(clipped,selection.fm.row,selection.to.row,selection.fm.col,selection.to.col); } } return 1; } // Delete or clear selection long FXTable::onCmdDeleteSel(FXObject*,FXSelector,void*){ if(isEditable()){ if(isAnythingSelected()){ removeRange(selection.fm.row,selection.to.row,selection.fm.col,selection.to.col,TRUE); } } else{ getApp()->beep(); } return 1; } /* // FIXME we need to add another API called insertText which // optionally extends the table to fit ALL of the paste data // instead of only overlaying the selection //PROPOSED FIXME... FXint nr,nc; // Get rows and columns in the text countText(nr,nc,string,len,'\t','\n'); //adjust the selection selection.to.row = selection.fm.row + nr; selection.to.col = selection.fm.col + nc; //ensure that the range does not go beyond the table limits if (selection.to.row>=nrows) selection.to.row = nrows-1; if (selection.to.col>=ncols) selection.to.col = ncols-1; //...PROPOSED FIXME // Delete existing selection if(hasSelection()){ handle(this,FXSEL(SEL_COMMAND,ID_DELETE_SEL),NULL); } Paste ways: (1) Normal means figure size of data to paste, then replace that many cells from current cell toward right/bottom; create more rows and columns as needed. (2) Paste over selection means "overlay selection". (3) Insert paste, means move data down/rightward from current point where selection is pasted. If selected one or more rows, remove these rows and replace with new rows of clipboard. If selected columns, remove selected columns and replace with columns of clipboard. If selected block, clear block and fill with new rows and columns from clipboard, moving stuff right of the block more to the right, and stuff below block more to the bottom by inserting as many columns/rows as needed [but do not remove rows if new data from clipboard is smaller. */ // Paste selection long FXTable::onCmdPasteSel(FXObject*,FXSelector,void*){ if(isEditable()){ if(isAnythingSelected()){ FXTableRange range; FXString string; FXint nr,nc; // Where to paste range.fm=current; if(isAnythingSelected()){ range.fm=selection.fm; } // First, try csv if(getDNDData(FROM_CLIPBOARD,csvType,string)){ FXTRACE((100,"Paste CSV\n")); #ifdef WIN32 dosToUnix(string); #endif countText(nr,nc,string,"\t,""\n"); range.to.row=range.fm.row+nr-1; range.to.col=range.fm.col+nc-1; FXTRACE((100,"range.fm.row=%d range.to.row=%d range.fm.col=%d range.to.col=%d\n",range.fm.row,range.to.row,range.fm.col,range.to.col)); overlayText(range.fm.row,range.to.row,range.fm.col,range.to.col,string,"\t,","\n",TRUE); selectRange(range.fm.row,range.to.row,range.fm.col,range.to.col,TRUE); return 1; } // First, try UTF-8 if(getDNDData(FROM_CLIPBOARD,utf8Type,string)){ FXTRACE((100,"Paste UTF8\n")); #ifdef WIN32 dosToUnix(string); #endif countText(nr,nc,string,"\t,""\n"); range.to.row=range.fm.row+nr-1; range.to.col=range.fm.col+nc-1; FXTRACE((100,"range.fm.row=%d range.to.row=%d range.fm.col=%d range.to.col=%d\n",range.fm.row,range.to.row,range.fm.col,range.to.col)); overlayText(range.fm.row,range.to.row,range.fm.col,range.to.col,string,"\t,","\n",TRUE); selectRange(range.fm.row,range.to.row,range.fm.col,range.to.col,TRUE); return 1; } // Next, try UTF-16 if(getDNDData(FROM_CLIPBOARD,utf16Type,string)){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Paste UTF16\n")); string=unicode.mb2utf(string); #ifdef WIN32 dosToUnix(string); #endif countText(nr,nc,string,"\t,""\n"); range.to.row=range.fm.row+nr-1; range.to.col=range.fm.col+nc-1; FXTRACE((100,"range.fm.row=%d range.to.row=%d range.fm.col=%d range.to.col=%d\n",range.fm.row,range.to.row,range.fm.col,range.to.col)); overlayText(range.fm.row,range.to.row,range.fm.col,range.to.col,string,"\t,","\n",TRUE); selectRange(range.fm.row,range.to.row,range.fm.col,range.to.col,TRUE); return 1; } // Next, try good old Latin-1 if(getDNDData(FROM_CLIPBOARD,stringType,string)){ FX88591Codec ascii; FXTRACE((100,"Paste ASCII\n")); string=ascii.mb2utf(string); #ifdef WIN32 dosToUnix(string); #endif countText(nr,nc,string,"\t,""\n"); range.to.row=range.fm.row+nr-1; range.to.col=range.fm.col+nc-1; FXTRACE((100,"range.fm.row=%d range.to.row=%d range.fm.col=%d range.to.col=%d\n",range.fm.row,range.to.row,range.fm.col,range.to.col)); overlayText(range.fm.row,range.to.row,range.fm.col,range.to.col,string,"\t,","\n",TRUE); selectRange(range.fm.row,range.to.row,range.fm.col,range.to.col,TRUE); return 1; } } } else{ getApp()->beep(); } return 1; } // Draw single cell, possibly spanning multiple rows,columns void FXTable::drawCell(FXDC& dc,FXint sr,FXint er,FXint sc,FXint ec){ register FXTableItem *item=cells[sr*ncols+sc]; register FXint xl,xr,yt,yb; // Verify some stuff FXASSERT(0<=sc && sc<=ec && ecgetY()+rowHeader->getItemOffset(sr); yb=rowHeader->getY()+rowHeader->getItemOffset(er)+rowHeader->getItemSize(er); xl=colHeader->getX()+colHeader->getItemOffset(sc); xr=colHeader->getX()+colHeader->getItemOffset(ec)+colHeader->getItemSize(ec); // Non-empty if(xldraw(this,dc,xl,yt,xr-xl,yb-yt); } // If focus in current cell, draw the focus if(hasFocus()){ if(sr<=current.row && current.row<=er && sc<=current.col && current.col<=ec){ dc.drawFocusRectangle(xl+2,yt+2,xr+vgrid-xl-4,yb+hgrid-yt-4); } } } } // Draw range of cells void FXTable::drawRange(FXDC& dc,FXint rlo,FXint rhi,FXint clo,FXint chi){ register FXTableItem *item; register FXint r,c; for(r=rlo; r<=rhi; r++){ for(c=clo; c<=chi; c++){ item=cells[r*ncols+c]; if(item){ if((r!=rlo && cells[(r-1)*ncols+c]==item) || (c!=clo && cells[r*ncols+c-1]==item)) continue; drawCell(dc,startRow(r,c),endRow(r,c),startCol(r,c),endCol(r,c)); } else{ drawCell(dc,r,r,c,c); } } } } // Draw horizontal grid lines void FXTable::drawHGrid(FXDC& dc,FXint rlo,FXint rhi,FXint clo,FXint chi){ register FXint r,c,xx,yy,ww,hh; register FXTableItem *item,*meti; dc.setForeground(gridColor); for(c=clo; c<=chi; c++){ meti=item=NULL; xx=colHeader->getX()+colHeader->getItemOffset(c); ww=colHeader->getItemSize(c); for(r=rlo; r<=rhi; r++){ yy=rowHeader->getY()+rowHeader->getItemOffset(r); hh=rowHeader->getItemSize(r); if(r==0 || (item=cells[r*ncols+c])==NULL || item!=meti){ dc.fillRectangle(xx,yy,ww,1); } if(rhi==nrows-1){ dc.fillRectangle(xx,yy+hh,ww,1); } meti=item; } } } // Draw horizontal vertical lines void FXTable::drawVGrid(FXDC& dc,FXint rlo,FXint rhi,FXint clo,FXint chi){ register FXint r,c,xx,yy,ww,hh; register FXTableItem *item,*meti; dc.setForeground(gridColor); for(r=rlo; r<=rhi; r++){ meti=item=NULL; yy=rowHeader->getY()+rowHeader->getItemOffset(r); hh=rowHeader->getItemSize(r); for(c=clo; c<=chi; c++){ xx=colHeader->getX()+colHeader->getItemOffset(c); ww=colHeader->getItemSize(c); if(c==0 || (item=cells[r*ncols+c])==NULL || item!=meti){ dc.fillRectangle(xx,yy,1,hh); } if(chi==ncols-1){ dc.fillRectangle(xx+ww,yy,1,hh); } meti=item; } } } // Draw table fragment void FXTable::drawContents(FXDC& dc,FXint x,FXint y,FXint w,FXint h){ register FXint fr,lr,fc,lc; // Find dirty part of table; note we need to back up to one row and // one column before the current cell, because of overlapping of // cell borders when grid lines are turned on. fc=colAtX(x)-1; lc=colAtX(x+w); fr=rowAtY(y)-1; lr=rowAtY(y+h); // Fix ranges if(fc<0) fc=0; if(fr<0) fr=0; if(lc>=ncols) lc=ncols-1; if(lr>=nrows) lr=nrows-1; // FXTRACE((100,"fc=%d lc=%d fr=%d lr=%d\n",fc,lc,fr,lr)); FXASSERT(0<=fc && lcrect.x,event->rect.y,event->rect.w,event->rect.h); // Left/bottom part of table tablew=colHeader->getX()+colHeader->getTotalSize(); tableh=rowHeader->getY()+rowHeader->getTotalSize(); // Fill background right and below the table dc.setForeground(backColor); dc.fillRectangle(tablew,0,width-tablew,height); dc.fillRectangle(0,tableh,tablew,height-tableh); // Draw main part drawContents(dc,event->rect.x,event->rect.y,event->rect.w,event->rect.h); return 1; } // Key Press long FXTable::onKeyPress(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; // Bounce to focus widget if(getFocus() && getFocus()->handle(sender,sel,ptr)) return 1; if(!isEnabled()) return 0; // Try target first if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; // Eat keystroke switch(event->code){ case KEY_Control_L: case KEY_Control_R: case KEY_Shift_L: case KEY_Shift_R: case KEY_Alt_L: case KEY_Alt_R: //if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; case KEY_Home: case KEY_KP_Home: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_MOVE_TOP),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MOVE_HOME),NULL); } if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_End: case KEY_KP_End: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_MOVE_BOTTOM),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MOVE_END),NULL); } if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Page_Up: case KEY_KP_Page_Up: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_MOVE_PAGEUP),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Page_Down: case KEY_KP_Page_Down: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_MOVE_PAGEDOWN),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Up: case KEY_KP_Up: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_MOVE_UP),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Down: case KEY_KP_Down: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_MOVE_DOWN),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Tab: handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); if(event->state&SHIFTMASK) handle(this,FXSEL(SEL_COMMAND,ID_MOVE_LEFT),NULL); else handle(this,FXSEL(SEL_COMMAND,ID_MOVE_RIGHT),NULL); handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); return 1; case KEY_ISO_Left_Tab: handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); handle(this,FXSEL(SEL_COMMAND,ID_MOVE_LEFT),NULL); handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); return 1; case KEY_Right: case KEY_KP_Right: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_MOVE_RIGHT),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Left: case KEY_KP_Left: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_MOVE_LEFT),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Return: case KEY_KP_Enter: handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)¤t); return 1; case KEY_F2: handle(this,FXSEL(SEL_COMMAND,ID_START_INPUT),NULL); return 1; case KEY_Escape: handle(this,FXSEL(SEL_COMMAND,ID_CANCEL_INPUT),NULL); return 1; case KEY_a: if(!(event->state&CONTROLMASK)) goto ins; handle(this,FXSEL(SEL_COMMAND,ID_SELECT_ALL),NULL); return 1; case KEY_x: if(!(event->state&CONTROLMASK)) goto ins; case KEY_F20: // Sun Cut key handle(this,FXSEL(SEL_COMMAND,ID_CUT_SEL),NULL); return 1; case KEY_c: if(!(event->state&CONTROLMASK)) goto ins; case KEY_F16: // Sun Copy key handle(this,FXSEL(SEL_COMMAND,ID_COPY_SEL),NULL); return 1; case KEY_v: if(!(event->state&CONTROLMASK)) goto ins; case KEY_F18: // Sun Paste key handle(this,FXSEL(SEL_COMMAND,ID_PASTE_SEL),NULL); return 1; default: ins: if((event->state&(CONTROLMASK|ALTMASK)) || ((FXuchar)event->text[0]<32)) return 0; handle(this,FXSEL(SEL_COMMAND,ID_START_INPUT),NULL); if(getFocus() && getFocus()->handle(sender,sel,ptr)) return 1; return 1; } return 0; } // Key Release long FXTable::onKeyRelease(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; // Bounce to focus widget if(getFocus() && getFocus()->handle(sender,sel,ptr)) return 1; if(!isEnabled()) return 0; flags|=FLAG_UPDATE; // Try target first if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; // Eat keystroke switch(event->code){ case KEY_Control_L: case KEY_Control_R: case KEY_Shift_L: case KEY_Shift_R: case KEY_Alt_L: case KEY_Alt_R: //if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; case KEY_Home: case KEY_KP_Home: case KEY_End: case KEY_KP_End: case KEY_Page_Up: case KEY_KP_Page_Up: case KEY_Page_Down: case KEY_KP_Page_Down: case KEY_Left: case KEY_KP_Left: case KEY_Right: case KEY_KP_Right: case KEY_Up: case KEY_KP_Up: case KEY_Down: case KEY_KP_Down: case KEY_Tab: case KEY_ISO_Left_Tab: return 1; case KEY_Return: case KEY_KP_Enter: case KEY_Escape: case KEY_F2: return 1; case KEY_a: case KEY_F20: // Sun Cut key case KEY_F16: // Sun Copy key case KEY_F18: // Sun Paste key return 1; case KEY_x: case KEY_c: case KEY_v: if(event->state&CONTROLMASK) return 1; default: if((event->state&(CONTROLMASK|ALTMASK)) || ((FXuchar)event->text[0]<32)) return 0; return 1; } return 0; } // Automatic scroll long FXTable::onAutoScroll(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint r,c; FXScrollArea::onAutoScroll(sender,sel,ptr); switch(mode){ case MOUSE_SELECT: c=colAtX(event->win_x); r=rowAtY(event->win_y); if(0<=r && 0<=c && rwin_x-grabx,event->win_y-graby); return 1; case MOUSE_DRAG: return 1; case MOUSE_SELECT: if(startAutoScroll(event,FALSE)) return 1; // FIXME scroll when near edge of scrollable area c=colAtX(event->win_x); r=rowAtY(event->win_y); if(0<=r && 0<=c && rtryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; // Cell being clicked on tablepos.row=rowAtY(event->win_y); tablepos.col=colAtX(event->win_x); // Outside table if(tablepos.row<0 || tablepos.row>=nrows || tablepos.col<0 || tablepos.col>=ncols){ setCurrentItem(current.row,current.col,true); return 1; } // Change current item setCurrentItem(tablepos.row,tablepos.col,TRUE); // Select or deselect if(event->state&SHIFTMASK){ if(0<=anchor.row && 0<=anchor.col){ if(isItemEnabled(anchor.row,anchor.col)){ extendSelection(current.row,current.col,TRUE); } } else{ setAnchorItem(current.row,current.col); if(isItemEnabled(current.row,current.col)){ extendSelection(current.row,current.col,TRUE); } } mode=MOUSE_SELECT; } /* else if(event->state&CONTROLMASK){ if(isItemEnabled(current.row,current.col)){ // toggleItem(current.row,current.col,TRUE); } setAnchorItem(current.row,current.col); mode=MOUSE_SELECT; } */ else{ if(isItemEnabled(current.row,current.col)){ killSelection(TRUE); setAnchorItem(current.row,current.col); extendSelection(current.row,current.col,TRUE); } else{ setAnchorItem(current.row,current.col); } mode=MOUSE_SELECT; } flags&=~FLAG_UPDATE; flags|=FLAG_PRESSED; return 1; } return 0; } // Released button long FXTable::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ ungrab(); flags&=~FLAG_PRESSED; flags|=FLAG_UPDATE; mode=MOUSE_NONE; stopAutoScroll(); setDragCursor(getApp()->getDefaultCursor(DEF_ARROW_CURSOR)); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; // Scroll to make item visibke makePositionVisible(current.row,current.col); // Update anchor //setAnchorItem(current.row,current.col); // FIXME look into the selection stuff // Generate clicked callbacks if(event->click_count==1){ handle(this,FXSEL(SEL_CLICKED,0),(void*)¤t); } else if(event->click_count==2){ handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)¤t); } else if(event->click_count==3){ handle(this,FXSEL(SEL_TRIPLECLICKED,0),(void*)¤t); } // Command callback only when clicked on item if(0<=current.row && 0<=current.col && isItemEnabled(current.row,current.col)){ handle(this,FXSEL(SEL_COMMAND,0),(void*)¤t); } return 1; } return 0; } // Pressed right button long FXTable::onRightBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; flags|=FLAG_PRESSED; grabx=event->win_x-pos_x; graby=event->win_y-pos_y; mode=MOUSE_SCROLL; return 1; } return 0; } // Released right button long FXTable::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); flags&=~FLAG_PRESSED; flags|=FLAG_UPDATE; mode=MOUSE_NONE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // The widget lost the grab for some reason long FXTable::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onUngrabbed(sender,sel,ptr); flags&=~(FLAG_DODRAG|FLAG_TRYDRAG|FLAG_PRESSED|FLAG_CHANGED|FLAG_SCROLLING); flags|=FLAG_UPDATE; mode=MOUSE_NONE; stopAutoScroll(); return 1; } // Command message long FXTable::onCommand(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); } // Clicked in list long FXTable::onClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_CLICKED,message),ptr); } // Double clicked in list; ptr may or may not point to an item long FXTable::onDoubleClicked(FXObject*,FXSelector,void* ptr){ if(target && target->tryHandle(this,FXSEL(SEL_DOUBLECLICKED,message),ptr)) return 1; handle(this,FXSEL(SEL_COMMAND,ID_START_INPUT),NULL); return 1; } // Triple clicked in list; ptr may or may not point to an item long FXTable::onTripleClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_TRIPLECLICKED,message),ptr); } // Toggle horizontal grid lines long FXTable::onCmdHorzGrid(FXObject*,FXSelector,void*){ showHorzGrid(!hgrid); return 1; } long FXTable::onUpdHorzGrid(FXObject* sender,FXSelector,void*){ sender->handle(this,hgrid?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Toggle vertical grid lines long FXTable::onCmdVertGrid(FXObject*,FXSelector,void*){ showVertGrid(!vgrid); return 1; } long FXTable::onUpdVertGrid(FXObject* sender,FXSelector,void*){ sender->handle(this,vgrid?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Delete current column long FXTable::onCmdDeleteColumn(FXObject*,FXSelector,void*){ if(!isEditable() || current.col<0) return 1; removeColumns(current.col,1,TRUE); setCurrentItem(current.row,current.col,TRUE); makePositionVisible(current.row,current.col); return 1; } // Update delete current column long FXTable::onUpdDeleteColumn(FXObject* sender,FXSelector,void*){ if(0<=current.col && current.colhandle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Delete current row long FXTable::onCmdDeleteRow(FXObject*,FXSelector,void*){ if(!isEditable() || current.row<0) return 1; removeRows(current.row,1,TRUE); setCurrentItem(current.row,current.col,TRUE); makePositionVisible(current.row,current.col); return 1; } // Update delete current row long FXTable::onUpdDeleteRow(FXObject* sender,FXSelector,void*){ if(0<=current.row && current.rowhandle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Insert new column at current long FXTable::onCmdInsertColumn(FXObject*,FXSelector,void*){ if(!isEditable()) return 1; insertColumns(current.col<0?ncols:current.col,1,TRUE); setCurrentItem(current.row,current.col,TRUE); makePositionVisible(current.row,current.col); return 1; } // Update insert column long FXTable::onUpdInsertColumn(FXObject* sender,FXSelector,void*){ sender->handle(this,isEditable()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Insert new row at current long FXTable::onCmdInsertRow(FXObject*,FXSelector,void*){ if(!isEditable()) return 1; insertRows(current.row<0?nrows:current.row,1,TRUE); setCurrentItem(current.row,current.col,TRUE); makePositionVisible(current.row,current.col); return 1; } // Update insert row long FXTable::onUpdInsertRow(FXObject* sender,FXSelector,void*){ sender->handle(this,isEditable()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Move to previous column long FXTable::onCmdMoveLeft(FXObject*,FXSelector,void*){ if(current.col<1) return 1; setCurrentItem(current.row,current.col-1,TRUE); makePositionVisible(current.row,current.col); return 1; } // Move to next column long FXTable::onCmdMoveRight(FXObject*,FXSelector,void*){ if(current.col>ncols-2) return 1; setCurrentItem(current.row,current.col+1,TRUE); makePositionVisible(current.row,current.col); return 1; } // Move to previous row long FXTable::onCmdMoveUp(FXObject*,FXSelector,void*){ if(current.row<1) return 1; setCurrentItem(current.row-1,current.col,TRUE); makePositionVisible(current.row,current.col); return 1; } // Move to next row long FXTable::onCmdMoveDown(FXObject*,FXSelector,void*){ if(current.row>nrows-2) return 1; setCurrentItem(current.row+1,current.col,TRUE); makePositionVisible(current.row,current.col); return 1; } // Move begin of row long FXTable::onCmdMoveHome(FXObject*,FXSelector,void*){ setCurrentItem(current.row,0,TRUE); makePositionVisible(current.row,current.col); return 1; } // Move to end of row long FXTable::onCmdMoveEnd(FXObject*,FXSelector,void*){ setCurrentItem(current.row,ncols-1,TRUE); makePositionVisible(current.row,current.col); return 1; } // Move to top long FXTable::onCmdMoveTop(FXObject*,FXSelector,void*){ setCurrentItem(0,current.col,TRUE); makePositionVisible(current.row,current.col); return 1; } // Move to bottom long FXTable::onCmdMoveBottom(FXObject*,FXSelector,void*){ setCurrentItem(nrows-1,current.col,TRUE); makePositionVisible(current.row,current.col); return 1; } // Move to next page long FXTable::onCmdMovePageDown(FXObject*,FXSelector,void*){ FXint nr=10; setCurrentItem(FXMIN(current.row+nr,nrows-1),current.col,TRUE); makePositionVisible(current.row,current.col); return 1; } // Move to previous page long FXTable::onCmdMovePageUp(FXObject*,FXSelector,void*){ FXint nr=10; setCurrentItem(FXMAX(current.row-nr,0),current.col,TRUE); makePositionVisible(current.row,current.col); return 1; } // Update select cell long FXTable::onUpdSelectCell(FXObject* sender,FXSelector,void*){ sender->handle(this,(0<=current.row && 0<=current.col && current.rowhandle(this,(0<=current.row && current.rowhandle(this,(0<=current.col && current.colhandle(this,(0handle(this,isAnythingSelected() ? FXSEL(SEL_COMMAND,ID_ENABLE) : FXSEL(SEL_COMMAND,ID_DISABLE),NULL); return 1; } // Deselect all cells long FXTable::onCmdDeselectAll(FXObject*,FXSelector,void*){ killSelection(TRUE); return 1; } // Mark long FXTable::onCmdMark(FXObject*,FXSelector,void*){ setAnchorItem(current.row,current.col); return 1; } // Extend long FXTable::onCmdExtend(FXObject*,FXSelector,void*){ extendSelection(current.row,current.col,TRUE); return 1; } // Editable toggle long FXTable::onCmdToggleEditable(FXObject*,FXSelector,void*){ setEditable(!isEditable()); return 1; } // Update editable toggle long FXTable::onUpdToggleEditable(FXObject* sender,FXSelector,void*){ sender->handle(this,isEditable()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // Change table size to nr x nc void FXTable::setTableSize(FXint nr,FXint nc,FXbool notify){ register FXTableItem *item; register FXint r,c; FXTableRange tablerange; // Must be in range if(nr<0 || nc<0){ fxerror("%s::setTableSize: argument out of range.\n",getClassName()); } // End editing cancelInput(); // Notify items will be deleted if(notify && target){ tablerange.fm.row=0; tablerange.fm.col=0; tablerange.to.row=nrows-1; tablerange.to.col=ncols-1; target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)&tablerange); } // Free all cells for(r=0; rclearItems(); colHeader->clearItems(); // Resize it now if(!FXRESIZE(&cells,FXTableItem*,nr*nc+1)){ fxerror("%s::setTableSize: out of memory.\n",getClassName()); } // Initialize cell array for(r=0; rappendItem(FXString::null,NULL,defRowHeight); } // Initialize column headers for(c=0; cappendItem(FXString::null,NULL,defColWidth); } // Update row headers if(options&TABLE_ROW_RENUMBER) updateRowNumbers(0,nr); // Update column headers if(options&TABLE_COL_RENUMBER) updateColumnNumbers(0,nc); // Set size nrows=nr; ncols=nc; // Fix up anchor, extent and current anchor.col=-1; anchor.row=-1; current.col=-1; current.row=-1; // Fix up selection selection.fm.row=-1; selection.fm.col=-1; selection.to.row=-1; selection.to.col=-1; // Notify items have been inserted if(notify && target){ tablerange.fm.row=0; tablerange.fm.col=0; tablerange.to.row=nrows-1; tablerange.to.col=ncols-1; target->tryHandle(this,FXSEL(SEL_INSERTED,message),(void*)&tablerange); } // Current item have changed if(notify && target){ target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)¤t); } // Redo layout recalc(); } // Insert a row void FXTable::insertRows(FXint row,FXint nr,FXbool notify){ register FXint oldrow=current.row; register FXint r,c,n; FXTableItem **oldcells=cells; FXTableRange tablerange; // Nothing to do if(nr<1) return; // Must be in range if(row<0 || row>nrows){ fxerror("%s::insertRows: row out of range.\n",getClassName()); } // Space for nr new rows n=nrows+nr; // Initialize row headers for(r=row; rinsertItem(r,FXString::null,NULL,defRowHeight); } // Update row headers if(options&TABLE_ROW_RENUMBER) updateRowNumbers(row,n); // Allocate new table if(!FXMALLOC(&cells,FXTableItem*,n*ncols+1)){ fxerror("%s::insertRows: out of memory.\n",getClassName()); } // Copy first part for(r=0; r=row) anchor.row+=nr; if(current.row>=row) current.row+=nr; if(current.row<0 && nrows==nr) current.row=0; // Fix up extent of edited cell if(input.fm.row>=row) input.fm.row+=nr; if(input.to.row>=row) input.to.row+=nr; // Fix up selection if(selection.fm.row>=row) selection.fm.row+=nr; if(selection.to.row>=row) selection.to.row+=nr; FXASSERT(-1<=anchor.row && anchor.rowtryHandle(this,FXSEL(SEL_INSERTED,message),(void*)&tablerange); } // Current item may have changed if(oldrow!=current.row){ if(notify && target){ target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)¤t); } } // Redo layout recalc(); } // Insert a column void FXTable::insertColumns(FXint col,FXint nc,FXbool notify){ register FXint oldcol=current.col; register FXint r,c,n; FXTableItem **oldcells=cells; FXTableRange tablerange; // Nothing to do if(nc<1) return; // Must be in range if(col<0 || col>ncols){ fxerror("%s::insertColumns: column out of range.\n",getClassName()); } // Space for nr new rows n=ncols+nc; // Initialize column headers for(c=col; cinsertItem(c,FXString::null,NULL,defColWidth); } // Update column headers if(options&TABLE_COL_RENUMBER) updateColumnNumbers(col,n); // Allocate new table if(!FXMALLOC(&cells,FXTableItem*,nrows*n+1)){ fxerror("%s::insertColumns: out of memory.\n",getClassName()); } // Copy first part for(c=0; c=col) anchor.col+=nc; if(current.col>=col) current.col+=nc; if(current.col<0 && ncols==nc) current.col=0; // Fix up extent of edited cell if(input.fm.col>=col) input.fm.col+=nc; if(input.to.col>=col) input.to.col+=nc; // Fix up selection if(selection.fm.col>=col) selection.fm.col+=nc; if(selection.to.col>=col) selection.to.col+=nc; FXASSERT(-1<=anchor.col && anchor.coltryHandle(this,FXSEL(SEL_INSERTED,message),(void*)&tablerange); } // Current item may have changed if(oldcol!=current.col){ if(notify && target){ target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)¤t); } } // Redo layout recalc(); } // Remove rows of cells void FXTable::removeRows(FXint row,FXint nr,FXbool notify){ register FXint oldrow=current.row; register FXTableItem *item; register FXint r,c,n; FXTableItem **oldcells=cells; FXTableRange tablerange; // Nothing to do if(nr<1) return; // Must be in range if(row<0 || row+nr>nrows){ fxerror("%s::removeRows: row out of range.\n",getClassName()); } // End editing if(row<=input.fm.row && input.to.rowtryHandle(this,FXSEL(SEL_DELETED,message),(void*)&tablerange); } // Number removed n=nrows-nr; // Allocate new table if(!FXMALLOC(&cells,FXTableItem*,n*ncols+1)){ fxerror("%s::removeRows: out of memory.\n",getClassName()); } // Copy first part for(r=0; rgetText().text())); delete item; } } } // Copy last part for(r=row+nr; r=row; r--){ rowHeader->removeItem(r); } // Update row headers if(options&TABLE_ROW_RENUMBER) updateRowNumbers(row,n); // Fix up anchor and current if(anchor.row>=row+nr) anchor.row-=nr; else if(anchor.row>=n) anchor.row=n-1; if(current.row>=row+nr) current.row-=nr; else if(current.row>=n) current.row=n-1; // Fix up edited cell if(input.fm.row>=row+nr) input.fm.row-=nr; else if(input.fm.row>=n) input.fm.row=n-1; if(input.to.row>=row+nr) input.to.row-=nr; else if(input.to.row>=n) input.to.row=n-1; // Fix up selection if(row+nr<=selection.to.row){ selection.to.row-=nr; if(row+nr<=selection.fm.row) selection.fm.row-=nr; else if(row<=selection.fm.row) selection.fm.row=row; } else if(selection.fm.rowtryHandle(this,FXSEL(SEL_CHANGED,message),(void*)¤t); } } // Redo layout recalc(); } // Remove columns of cells void FXTable::removeColumns(FXint col,FXint nc,FXbool notify){ register FXint oldcol=current.col; register FXTableItem *item; register FXint r,c,n; FXTableItem **oldcells=cells; FXTableRange tablerange; // Nothing to do if(nc<1) return; // Must be in range if(col<0 || col+nc>ncols){ fxerror("%s::removeColumns: column out of range.\n",getClassName()); } // End editing if(col<=input.fm.col && input.to.coltryHandle(this,FXSEL(SEL_DELETED,message),(void*)&tablerange); } // Number removed n=ncols-nc; // Allocate new table if(!FXMALLOC(&cells,FXTableItem*,nrows*n+1)){ fxerror("%s::removeColumns: out of memory.\n",getClassName()); } // Copy first part for(r=0; rgetText().text())); delete item; } } } // Copy last part for(r=0; r=col; c--){ colHeader->removeItem(c); } // Update column headers if(options&TABLE_COL_RENUMBER) updateColumnNumbers(col,n); // Fix up anchor and current if(anchor.col>=col+nc) anchor.col-=nc; else if(anchor.col>=n) anchor.col=n-1; if(current.col>=col+nc) current.col-=nc; else if(current.col>=n) current.col=n-1; // Fix up edited cell if(input.fm.col>=col+nc) input.fm.col-=nc; else if(input.fm.col>=n) input.fm.col=n-1; if(input.to.col>=col+nc) input.to.col-=nc; else if(input.to.col>=n) input.to.col=n-1; // Fix up selection if(col+nc<=selection.to.col){ selection.to.col-=nc; if(col+nc<=selection.fm.col) selection.fm.col-=nc; else if(col<=selection.fm.col) selection.fm.col=col; } else if(selection.fm.coltryHandle(this,FXSEL(SEL_CHANGED,message),(void*)¤t); } } // Redo layout recalc(); } // Return the item at the given index FXTableItem *FXTable::getItem(FXint row,FXint col) const { if(row<0 || col<0 || nrowstryHandle(this,FXSEL(SEL_REPLACED,message),(void*)&tablerange); } // Delete cell delete cells[sr*ncols+sc]; // Assign new cell for(r=sr; r<=er; r++){ for(c=sc; c<=ec; c++){ cells[r*ncols+c]=item; } } // Repaint these cells updateRange(sr,er,sc,ec); } // Extract item from table FXTableItem* FXTable::extractItem(FXint row,FXint col,FXbool notify){ register FXint sr,er,sc,ec,r,c; register FXTableItem *result; FXTableRange tablerange; // Must be in range if(row<0 || col<0 || nrows<=row || ncols<=col){ fxerror("%s::extractItem: index out of range.\n",getClassName()); } // Extent of cell sr=startRow(row,col); er=endRow(row,col); sc=startCol(row,col); ec=endCol(row,col); // End editing if(sr<=input.fm.row && sc<=input.fm.col && input.to.row<=er && input.to.col<=ec){ cancelInput(); } // Notify item will be replaced if(notify && target){ tablerange.fm.row=sr; tablerange.to.row=er; tablerange.fm.col=sc; tablerange.to.col=ec; target->tryHandle(this,FXSEL(SEL_REPLACED,message),(void*)&tablerange); } // Delete cell result=cells[sr*ncols+sc]; // Clear entries for(r=sr; r<=er; r++){ for(c=sc; c<=ec; c++){ cells[r*ncols+c]=NULL; } } // Repaint these cells updateRange(sr,er,sc,ec); // Return item return result; } // Remove cell, i.e. replace cell by NULL void FXTable::removeItem(FXint row,FXint col,FXbool notify){ register FXint sr,er,sc,ec,r,c; FXTableRange tablerange; // Must be in range if(row<0 || col<0 || nrows<=row || ncols<=col){ fxerror("%s::removeItem: index out of range.\n",getClassName()); } // Extent of cell sr=startRow(row,col); er=endRow(row,col); sc=startCol(row,col); ec=endCol(row,col); // End editing if(sr<=input.fm.row && sc<=input.fm.col && input.to.row<=er && input.to.col<=ec){ cancelInput(); } // Notify item will be replaced if(notify && target){ tablerange.fm.row=sr; tablerange.to.row=er; tablerange.fm.col=sc; tablerange.to.col=ec; target->tryHandle(this,FXSEL(SEL_REPLACED,message),(void*)&tablerange); } // Delete cell delete cells[sr*ncols+sc]; // Clear entries for(r=sr; r<=er; r++){ for(c=sc; c<=ec; c++){ cells[r*ncols+c]=NULL; } } // Repaint these cells updateRange(sr,er,sc,ec); } // Clear all cells in the given range void FXTable::removeRange(FXint startrow,FXint endrow,FXint startcol,FXint endcol,FXbool notify){ register FXint r,c; // Verify range if(startrow<0 || startcol<0 || nrows<=endrow || ncols<=endcol){ fxerror("%s::removeRange: index out of range.\n",getClassName()); } // Free all cells for(r=startrow; r<=endrow; r++){ for(c=startcol; c<=endcol; c++){ removeItem(r,c,notify); } } } // Clear all items from table void FXTable::clearItems(FXbool notify){ register FXTableItem *item; register FXint r,c; FXTableRange tablerange; // End editing if(0<=input.fm.row && 0<=input.fm.col){ cancelInput(); } // Notify item will be deleted if(notify && target){ tablerange.fm.row=0; tablerange.to.row=nrows-1; tablerange.fm.col=0; tablerange.to.col=ncols-1; target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)&tablerange); } // Free all cells for(r=0; rclearItems(); colHeader->clearItems(); // Resize arrays FXRESIZE(&cells,FXTableItem*,1); // Fix up arrays cells[0]=NULL; // Number of rows and columns nrows=0; ncols=0; // Fix up anchor, extent and current anchor.col=-1; anchor.row=-1; current.col=-1; current.row=-1; // Fix up selection selection.fm.row=-1; selection.fm.col=-1; selection.to.row=-1; selection.to.col=-1; // Notify of change of current item if(notify && target){ target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)¤t); } // Redo layout recalc(); } /* /// Merge cells into one single multi-column cell virtual void mergeCols(FXint row,FXint col,FXint nc,FXbool notify=FALSE); /// Merge cells into one single multi-row cell virtual void mergeRows(FXint row,FXint col,FXint nr,FXbool notify=FALSE); /// Split multi-column cell into single cells virtual void splitCols(FXint row,FXint col,FXbool notify=FALSE); /// Split multi-row cell into single cells virtual void splitRows(FXint row,FXint col,FXbool notify=FALSE); // Merge cells into one single multi-column cell void FXTable::mergeCols(FXint row,FXint col,FXint nc,FXbool notify){ register FXint sr,er,ec,r,c; register FXTableItem *item,*it; if(row<0 || row>=nrows || col<0 || nc<1 || col+nc>ncols){ fxerror("%s::mergeCols: argument out of range\n",getClassName()); } sr=startRow(row,col); er=endRow(row,col); ec=col+nc-1; item=cells[row*ncols+col]; for(r=sr; r<=er; r++){ for(c=col+1; c<=ec; c++){ it=cells[r*ncols+c]; if(it && it!=item){ removeCell(r,c,notify); } cells[r*ncols+c]=item; } } } // Merge cells into one single multi-row cell void FXTable::mergeRows(FXint row,FXint col,FXint nr,FXbool notify){ register FXint er,sc,ec,r,c; register FXTableItem *item,*it; if(col<0 || col>=ncols || row<0 || nr<1 || row+nr>nrows){ fxerror("%s::mergeRows: argument out of range\n",getClassName()); } sc=startCol(row,col); ec=endCol(row,col); er=row+nr-1; item=cells[row*ncols+col]; for(r=row+1; r<=er; r++){ for(c=sc; c<=ec; c++){ it=cells[r*ncols+c]; if(it && it!=item){ removeCell(r,c,notify); } cells[r*ncols+c]=item; } } } // Split multi-column cell into single cells void FXTable::splitCols(FXint row,FXint col,FXbool notify){ if(row<0 || row>=nrows || col<0 || col>=ncols){ fxerror("%s::splitCols: argument out of range\n",getClassName()); } } // Split multi-row cell into single cells void FXTable::splitRows(FXint row,FXint col,FXbool notify){ if(col<0 || col>=ncols || row<0 || row>=nrows){ fxerror("%s::splitRows: argument out of range\n",getClassName()); } } */ // Change column header height mode to fixed or variable void FXTable::setColumnHeaderMode(FXuint hint){ register FXuint hints=(colHeader->getLayoutHints()&~LAYOUT_FIX_HEIGHT) | (hint&LAYOUT_FIX_HEIGHT); colHeader->setLayoutHints(hints); } // Return column header height mode FXuint FXTable::getColumnHeaderMode() const { return (colHeader->getLayoutHints()&LAYOUT_FIX_HEIGHT); } // Change row header width mode to fixed or variable void FXTable::setRowHeaderMode(FXuint hint){ register FXuint hints=(rowHeader->getLayoutHints()&~LAYOUT_FIX_WIDTH) | (hint&LAYOUT_FIX_WIDTH); rowHeader->setLayoutHints(hints); } // Return row header width mode FXuint FXTable::getRowHeaderMode() const { return (rowHeader->getLayoutHints()&LAYOUT_FIX_WIDTH); } // Change column header height void FXTable::setColumnHeaderHeight(FXint h){ if(colHeader->getHeight()!=h){ colHeader->setHeight(h); recalc(); } } // Return column header height FXint FXTable::getColumnHeaderHeight() const { return colHeader->getHeight(); } // Change row header width void FXTable::setRowHeaderWidth(FXint w){ if(rowHeader->getWidth()!=w){ rowHeader->setWidth(w); recalc(); } } // Return row header width FXint FXTable::getRowHeaderWidth() const { return rowHeader->getWidth(); } // X coordinate of column c FXint FXTable::getColumnX(FXint col) const { return colHeader->getX()+colHeader->getItemOffset(col); } // Y coordinate of row r FXint FXTable::getRowY(FXint row) const { return rowHeader->getY()+rowHeader->getItemOffset(row); } // Change width of custom column void FXTable::setColumnWidth(FXint col,FXint cwidth){ if(colHeader->getItemSize(col)!=cwidth){ colHeader->setItemSize(col,cwidth); update(); } } // Change height of custom row void FXTable::setRowHeight(FXint row,FXint rheight){ if(rowHeader->getItemSize(row)!=rheight){ rowHeader->setItemSize(row,rheight); update(); } } // Get width of custom column FXint FXTable::getColumnWidth(FXint col) const { return colHeader->getItemSize(col); } // Get height of custom row FXint FXTable::getRowHeight(FXint row) const { return rowHeader->getItemSize(row); } // Change default column width void FXTable::setDefColumnWidth(FXint cwidth){ if(defColWidth!=cwidth){ defColWidth=cwidth; recalc(); } } // Change default row height void FXTable::setDefRowHeight(FXint rheight){ if(defRowHeight!=rheight){ defRowHeight=rheight; recalc(); } } // Return minimum row height FXint FXTable::getMinRowHeight(FXint r) const { register FXTableItem *item; register FXint h,c,t; if(r<0 || r>=nrows){ fxerror("%s::getMinRowHeight: row out of range\n",getClassName()); } for(c=0,h=0; cgetHeight(this); if(t>h) h=t; } } return h; } // Return minimum column width FXint FXTable::getMinColumnWidth(FXint c) const { register FXTableItem *item; register FXint w,r,t; if(c<0 || c>=ncols){ fxerror("%s::getMinColumnWidth: column out of range\n",getClassName()); } for(r=0,w=0; rgetWidth(this); if(t>w) w=t; } } return w; } // Fit row heights to contents void FXTable::fitRowsToContents(FXint row,FXint nr){ register FXint r; for(r=row; rsetHeaderStyle(hs); hs=HEADER_VERTICAL|HEADER_TRACKING|HEADER_BUTTON; if(opts&TABLE_ROW_SIZABLE) hs|=HEADER_RESIZE; if(opts&TABLE_NO_ROWSELECT) hs&=~HEADER_BUTTON; rowHeader->setHeaderStyle(hs); options=opts; } } // Get list style FXuint FXTable::getTableStyle() const { return (options&TABLE_MASK); } // Set column renumbering void FXTable::setColumnRenumbering(FXbool flag){ FXuint opts=flag?(options|TABLE_COL_RENUMBER):(options&~TABLE_COL_RENUMBER); if(options!=opts){ options=opts; if(flag) updateColumnNumbers(0,ncols); } } // Get column renumbering FXbool FXTable::getColumnRenumbering() const { return (options&TABLE_COL_RENUMBER)!=0; } // Set row renumbering void FXTable::setRowRenumbering(FXbool flag){ FXuint opts=flag?(options|TABLE_ROW_RENUMBER):(options&~TABLE_ROW_RENUMBER); if(options!=opts){ options=opts; if(flag) updateRowNumbers(0,nrows); } } // Get row renumbering FXbool FXTable::getRowRenumbering() const { return (options&TABLE_ROW_RENUMBER)!=0; } // Change cell border width void FXTable::setCellBorderWidth(FXint borderwidth){ if(borderwidth!=cellBorderWidth){ cellBorderWidth=borderwidth; update(); } } // Change column header void FXTable::setColumnText(FXint index,const FXString& text){ colHeader->setItemText(index,text); } // Return text of column header at index FXString FXTable::getColumnText(FXint index) const { return colHeader->getItemText(index); } // Change row header void FXTable::setRowText(FXint index,const FXString& text){ rowHeader->setItemText(index,text); } // Return text of row header at index FXString FXTable::getRowText(FXint index) const{ return rowHeader->getItemText(index); } // Change column header icon void FXTable::setColumnIcon(FXint index,FXIcon* icon){ colHeader->setItemIcon(index,icon); } // Return icon of column header at index FXIcon* FXTable::getColumnIcon(FXint index) const { return colHeader->getItemIcon(index); } // Change row header icon void FXTable::setRowIcon(FXint index,FXIcon* icon){ rowHeader->setItemIcon(index,icon); } // Return icon of row header at index FXIcon* FXTable::getRowIcon(FXint index) const { return rowHeader->getItemIcon(index); } // Change column header icon position void FXTable::setColumnIconPosition(FXint index,FXuint mode){ colHeader->setItemIconPosition(index,mode); } // Return icon position of column header at index FXuint FXTable::getColumnIconPosition(FXint index) const { return colHeader->getItemIconPosition(index); } // Change row header icon position void FXTable::setRowIconPosition(FXint index,FXuint mode){ rowHeader->setItemIconPosition(index,mode); } // Return icon position of row header at index FXuint FXTable::getRowIconPosition(FXint index) const { return rowHeader->getItemIconPosition(index); } // Change column header icon position void FXTable::setColumnJustify(FXint index,FXuint justify){ colHeader->setItemJustify(index,justify); } // Return icon position of column header at index FXuint FXTable::getColumnJustify(FXint index) const { return colHeader->getItemJustify(index); } // Change row header icon position void FXTable::setRowJustify(FXint index,FXuint justify){ rowHeader->setItemJustify(index,justify); } // Return icon position of row header at index FXuint FXTable::getRowJustify(FXint index) const { return rowHeader->getItemJustify(index); } // Set column header font void FXTable::setColumnHeaderFont(FXFont* fnt){ colHeader->setFont(fnt); } // Return column header font FXFont* FXTable::getColumnHeaderFont() const{ return colHeader->getFont(); } // Set row header font void FXTable::setRowHeaderFont(FXFont* fnt){ rowHeader->setFont(fnt); } // Return row header font FXFont* FXTable::getRowHeaderFont() const { return rowHeader->getFont(); } // Change visible rows void FXTable::setVisibleRows(FXint nvrows){ if(nvrows<0) nvrows=0; if(visiblerows!=nvrows){ visiblerows=nvrows; recalc(); } } // Change visible columns void FXTable::setVisibleColumns(FXint nvcols){ if(nvcols<0) nvcols=0; if(visiblecols!=nvcols){ visiblecols=nvcols; recalc(); } } // Show or hide horizontal grid void FXTable::showHorzGrid(FXbool on){ if(hgrid!=on){ hgrid=on; recalc(); } } // Show or hide vertical grid void FXTable::showVertGrid(FXbool on){ if(vgrid!=on){ vgrid=on; recalc(); } } // Return true if editable FXbool FXTable::isEditable() const { return (options&TABLE_READONLY)==0; } // Set widget is editable or not void FXTable::setEditable(FXbool edit){ if(edit) options&=~TABLE_READONLY; else options|=TABLE_READONLY; } // Save data void FXTable::save(FXStream& store) const { register FXint i; FXScrollArea::save(store); store << nrows; store << ncols; for(i=0; i> nrows; store >> ncols; FXMALLOC(&cells,FXTableItem*,nrows*ncols+1); for(i=0; i> cells[i]; store >> visiblerows; store >> visiblecols; store >> margintop; store >> marginbottom; store >> marginleft; store >> marginright; store >> textColor; store >> baseColor; store >> hiliteColor; store >> shadowColor; store >> borderColor; store >> selbackColor; store >> seltextColor; store >> gridColor; store >> cellBackColor[0][0]; store >> cellBackColor[0][1]; store >> cellBackColor[1][0]; store >> cellBackColor[1][1]; store >> font; store >> help; } // Clean up FXTable::~FXTable(){ for(FXint r=0; r visrow[3]=11: length = 11 The last legal position is length = 11. - While resizing window, keep track of a position which should remain visible, i.e. toppos=rowStart(position). The position is changed same as toppos, except during resize. - When changing text, if we're looking at the tail end of the buffer, avoid jumping the top lines when the content hight shrinks. - Add undo capability. (First undo will turn mod flag back off). - Add incremental search, search/replace, selection search. - Style table stuff. - Need to allow for one single routine to update style buffer same as text buffer - Suggested additional bindings: Ctl-F Find Ctl-R Replace Ctl-G Find again (Shift-Ctl-G Find again backward) Ctl-T Replace again (Shift-Ctl-G Replace again backward) Ctl-L Goto line number Ctl-E Goto selected Ctl-I Indent (shift 1 character right) Ctl-U Unindent (shift 1 character left) Ctl-Z undo Ctl-Y redo Ctl-M Goto matching (Shift-Ctl-M backward) Insert toggle overstrike mode Brace matching - Maybe put all keyboard bindings into accelerator table. - Variable cursorcol should take tabcolumns into account. - Italic fonts are bit problematic on border between selected/unselected text due to kerning. - Tab should work as tabcolumns columns when computing a column. - Need rectangular selection capability. - Perhaps split off buffer management into separate text buffer class (allows for multiple views). - Need to implement regex search/replace. - Add better support for subclassing (syntax coloring e.g.). - Add support for line numbers. - Improve book keeping based on line/column numbers, not rows/characters. - If there is a style table, the style buffer is used as index into the style table, allowing for up to 255 styles (style index==0 is the default style). The style member in the FXHiliteStyle struct is used for underlining, strikeouts, and other effects. If there is NO style table but there is a style buffer, the style buffer can still be used for underlining, strikeouts, and other effects. - Sending SEL_CHANGED is pretty useless; should only be sent AFTER text change, and void* should contain some sensible info. - When in overstrike mode and having a selection, entering a character should replace the selection, not delete the selection and then overstrike the character after the selection. - Middle mouse paste does not paste inside selection, and does not kill selection. - When pasting or dropping whole lines, insert at begin of line instead of at cursor; question:- how to know we're pasting whole lines? - Need block cursor when in overstrike mode. - Inserting lots of stuff should show cursor. - Perhaps change text and style buffer to FXString for further complexity reduction. */ #define MINSIZE 80 // Minimum gap size #define NVISROWS 20 // Initial visible rows #define TEXT_MASK (TEXT_FIXEDWRAP|TEXT_WORDWRAP|TEXT_OVERSTRIKE|TEXT_READONLY|TEXT_NO_TABS|TEXT_AUTOINDENT|TEXT_SHOWACTIVE|TEXT_AUTOSCROLL) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXText) FXTextMap[]={ FXMAPFUNC(SEL_PAINT,0,FXText::onPaint), FXMAPFUNC(SEL_MOTION,0,FXText::onMotion), FXMAPFUNC(SEL_DRAGGED,0,FXText::onDragged), FXMAPFUNC(SEL_TIMEOUT,FXText::ID_BLINK,FXText::onBlink), FXMAPFUNC(SEL_TIMEOUT,FXText::ID_AUTOSCROLL,FXText::onAutoScroll), FXMAPFUNC(SEL_TIMEOUT,FXText::ID_FLASH,FXText::onFlash), FXMAPFUNC(SEL_FOCUSIN,0,FXText::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXText::onFocusOut), FXMAPFUNC(SEL_BEGINDRAG,0,FXText::onBeginDrag), FXMAPFUNC(SEL_ENDDRAG,0,FXText::onEndDrag), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXText::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXText::onLeftBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXText::onMiddleBtnPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXText::onMiddleBtnRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXText::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXText::onRightBtnRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXText::onUngrabbed), FXMAPFUNC(SEL_DND_ENTER,0,FXText::onDNDEnter), FXMAPFUNC(SEL_DND_LEAVE,0,FXText::onDNDLeave), FXMAPFUNC(SEL_DND_DROP,0,FXText::onDNDDrop), FXMAPFUNC(SEL_DND_MOTION,0,FXText::onDNDMotion), FXMAPFUNC(SEL_DND_REQUEST,0,FXText::onDNDRequest), FXMAPFUNC(SEL_SELECTION_LOST,0,FXText::onSelectionLost), FXMAPFUNC(SEL_SELECTION_GAINED,0,FXText::onSelectionGained), FXMAPFUNC(SEL_SELECTION_REQUEST,0,FXText::onSelectionRequest), FXMAPFUNC(SEL_CLIPBOARD_LOST,0,FXText::onClipboardLost), FXMAPFUNC(SEL_CLIPBOARD_GAINED,0,FXText::onClipboardGained), FXMAPFUNC(SEL_CLIPBOARD_REQUEST,0,FXText::onClipboardRequest), FXMAPFUNC(SEL_KEYPRESS,0,FXText::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXText::onKeyRelease), FXMAPFUNC(SEL_QUERY_TIP,0,FXText::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXText::onQueryHelp), FXMAPFUNC(SEL_UPDATE,FXText::ID_TOGGLE_EDITABLE,FXText::onUpdToggleEditable), FXMAPFUNC(SEL_UPDATE,FXText::ID_TOGGLE_OVERSTRIKE,FXText::onUpdToggleOverstrike), FXMAPFUNC(SEL_UPDATE,FXText::ID_CURSOR_ROW,FXText::onUpdCursorRow), FXMAPFUNC(SEL_UPDATE,FXText::ID_CURSOR_COLUMN,FXText::onUpdCursorColumn), FXMAPFUNC(SEL_UPDATE,FXText::ID_CUT_SEL,FXText::onUpdHaveSelection), FXMAPFUNC(SEL_UPDATE,FXText::ID_COPY_SEL,FXText::onUpdHaveSelection), FXMAPFUNC(SEL_UPDATE,FXText::ID_PASTE_SEL,FXText::onUpdYes), FXMAPFUNC(SEL_UPDATE,FXText::ID_DELETE_SEL,FXText::onUpdHaveSelection), FXMAPFUNC(SEL_UPDATE,FXText::ID_SELECT_ALL,FXText::onUpdSelectAll), FXMAPFUNC(SEL_UPDATE,FXText::ID_UPPER_CASE,FXText::onUpdHaveSelection), FXMAPFUNC(SEL_UPDATE,FXText::ID_LOWER_CASE,FXText::onUpdHaveSelection), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_TOP,FXText::onCmdCursorTop), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_BOTTOM,FXText::onCmdCursorBottom), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_HOME,FXText::onCmdCursorHome), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_END,FXText::onCmdCursorEnd), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_RIGHT,FXText::onCmdCursorRight), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_LEFT,FXText::onCmdCursorLeft), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_UP,FXText::onCmdCursorUp), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_DOWN,FXText::onCmdCursorDown), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_WORD_LEFT,FXText::onCmdCursorWordLeft), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_WORD_RIGHT,FXText::onCmdCursorWordRight), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_WORD_START,FXText::onCmdCursorWordStart), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_WORD_END,FXText::onCmdCursorWordEnd), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_PAGEDOWN,FXText::onCmdCursorPageDown), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_PAGEUP,FXText::onCmdCursorPageUp), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_SCRNTOP,FXText::onCmdCursorScreenTop), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_SCRNBTM,FXText::onCmdCursorScreenBottom), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_SCRNCTR,FXText::onCmdCursorScreenCenter), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_PAR_HOME,FXText::onCmdCursorParHome), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_PAR_END,FXText::onCmdCursorParEnd), FXMAPFUNC(SEL_COMMAND,FXText::ID_SCROLL_UP,FXText::onCmdScrollUp), FXMAPFUNC(SEL_COMMAND,FXText::ID_SCROLL_DOWN,FXText::onCmdScrollDown), FXMAPFUNC(SEL_COMMAND,FXText::ID_MARK,FXText::onCmdMark), FXMAPFUNC(SEL_COMMAND,FXText::ID_EXTEND,FXText::onCmdExtend), FXMAPFUNC(SEL_COMMAND,FXText::ID_OVERST_STRING,FXText::onCmdOverstString), FXMAPFUNC(SEL_COMMAND,FXText::ID_INSERT_STRING,FXText::onCmdInsertString), FXMAPFUNC(SEL_COMMAND,FXText::ID_INSERT_NEWLINE,FXText::onCmdInsertNewline), FXMAPFUNC(SEL_COMMAND,FXText::ID_INSERT_TAB,FXText::onCmdInsertTab), FXMAPFUNC(SEL_COMMAND,FXText::ID_CUT_SEL,FXText::onCmdCutSel), FXMAPFUNC(SEL_COMMAND,FXText::ID_COPY_SEL,FXText::onCmdCopySel), FXMAPFUNC(SEL_COMMAND,FXText::ID_DELETE_SEL,FXText::onCmdDeleteSel), FXMAPFUNC(SEL_COMMAND,FXText::ID_PASTE_SEL,FXText::onCmdPasteSel), FXMAPFUNC(SEL_COMMAND,FXText::ID_PASTE_MIDDLE,FXText::onCmdPasteMiddle), FXMAPFUNC(SEL_COMMAND,FXText::ID_SELECT_CHAR,FXText::onCmdSelectChar), FXMAPFUNC(SEL_COMMAND,FXText::ID_SELECT_WORD,FXText::onCmdSelectWord), FXMAPFUNC(SEL_COMMAND,FXText::ID_SELECT_LINE,FXText::onCmdSelectLine), FXMAPFUNC(SEL_COMMAND,FXText::ID_SELECT_ALL,FXText::onCmdSelectAll), FXMAPFUNC(SEL_COMMAND,FXText::ID_DESELECT_ALL,FXText::onCmdDeselectAll), FXMAPFUNC(SEL_COMMAND,FXText::ID_BACKSPACE,FXText::onCmdBackspace), FXMAPFUNC(SEL_COMMAND,FXText::ID_BACKSPACE_WORD,FXText::onCmdBackspaceWord), FXMAPFUNC(SEL_COMMAND,FXText::ID_BACKSPACE_BOL,FXText::onCmdBackspaceBol), FXMAPFUNC(SEL_COMMAND,FXText::ID_DELETE,FXText::onCmdDelete), FXMAPFUNC(SEL_COMMAND,FXText::ID_DELETE_WORD,FXText::onCmdDeleteWord), FXMAPFUNC(SEL_COMMAND,FXText::ID_DELETE_EOL,FXText::onCmdDeleteEol), FXMAPFUNC(SEL_COMMAND,FXText::ID_DELETE_ALL,FXText::onCmdDeleteAll), FXMAPFUNC(SEL_COMMAND,FXText::ID_DELETE_LINE,FXText::onCmdDeleteLine), FXMAPFUNC(SEL_COMMAND,FXText::ID_TOGGLE_EDITABLE,FXText::onCmdToggleEditable), FXMAPFUNC(SEL_COMMAND,FXText::ID_TOGGLE_OVERSTRIKE,FXText::onCmdToggleOverstrike), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_ROW,FXText::onCmdCursorRow), FXMAPFUNC(SEL_COMMAND,FXText::ID_CURSOR_COLUMN,FXText::onCmdCursorColumn), FXMAPFUNC(SEL_COMMAND,FXText::ID_SETSTRINGVALUE,FXText::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXText::ID_GETSTRINGVALUE,FXText::onCmdGetStringValue), FXMAPFUNC(SEL_COMMAND,FXText::ID_UPPER_CASE,FXText::onCmdChangeCase), FXMAPFUNC(SEL_COMMAND,FXText::ID_LOWER_CASE,FXText::onCmdChangeCase), FXMAPFUNC(SEL_COMMAND,FXText::ID_GOTO_MATCHING,FXText::onCmdGotoMatching), FXMAPFUNC(SEL_COMMAND,FXText::ID_GOTO_SELECTED,FXText::onCmdGotoSelected), FXMAPFUNC(SEL_COMMAND,FXText::ID_GOTO_LINE,FXText::onCmdGotoLine), FXMAPFUNC(SEL_COMMAND,FXText::ID_SELECT_MATCHING,FXText::onCmdSelectMatching), FXMAPFUNC(SEL_COMMAND,FXText::ID_SEARCH,FXText::onCmdSearch), FXMAPFUNC(SEL_COMMAND,FXText::ID_REPLACE,FXText::onCmdReplace), FXMAPFUNC(SEL_COMMAND,FXText::ID_SEARCH_FORW,FXText::onCmdSearchNext), FXMAPFUNC(SEL_COMMAND,FXText::ID_SEARCH_BACK,FXText::onCmdSearchNext), FXMAPFUNC(SEL_COMMAND,FXText::ID_SEARCH_FORW_SEL,FXText::onCmdSearchSel), FXMAPFUNC(SEL_COMMAND,FXText::ID_SEARCH_BACK_SEL,FXText::onCmdSearchSel), FXMAPFUNCS(SEL_COMMAND,FXText::ID_SELECT_BRACE,FXText::ID_SELECT_ANG,FXText::onCmdSelectBlock), FXMAPFUNCS(SEL_COMMAND,FXText::ID_LEFT_BRACE,FXText::ID_LEFT_ANG,FXText::onCmdBlockBeg), FXMAPFUNCS(SEL_COMMAND,FXText::ID_RIGHT_BRACE,FXText::ID_RIGHT_ANG,FXText::onCmdBlockEnd), FXMAPFUNCS(SEL_COMMAND,FXText::ID_CLEAN_INDENT,FXText::ID_SHIFT_TABRIGHT,FXText::onCmdShiftText), }; // Object implementation FXIMPLEMENT(FXText,FXScrollArea,FXTextMap,ARRAYNUMBER(FXTextMap)) // Delimiters const FXchar FXText::textDelimiters[]="~.,/\\`'!@#$%^&*()-=+{}|[]\":;<>?"; /*******************************************************************************/ // Absolute value static inline FXint fxabs(FXint a){ return a<0?-a:a; } // For deserialization FXText::FXText(){ flags|=FLAG_ENABLED|FLAG_DROPTARGET; buffer=NULL; sbuffer=NULL; visrows=NULL; length=0; nrows=1; nvisrows=0; gapstart=0; gapend=0; toppos=0; keeppos=0; toprow=0; selstartpos=0; selendpos=0; hilitestartpos=0; hiliteendpos=0; anchorpos=0; cursorpos=0; revertpos=0; cursorstart=0; cursorend=0; cursorrow=0; cursorcol=0; prefcol=-1; wrapwidth=80; wrapcolumns=80; tabwidth=8; tabcolumns=8; barwidth=0; barcolumns=0; hilitestyles=NULL; textWidth=0; textHeight=0; searchflags=SEARCH_EXACT; delimiters=textDelimiters; vrows=0; vcols=0; matchtime=0; modified=FALSE; mode=MOUSE_NONE; grabx=0; graby=0; } // Text widget FXText::FXText(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXScrollArea(p,opts,x,y,w,h){ flags|=FLAG_ENABLED|FLAG_DROPTARGET; target=tgt; message=sel; FXCALLOC(&buffer,FXchar,MINSIZE); sbuffer=NULL; FXCALLOC(&visrows,FXint,NVISROWS+1); length=0; nrows=1; nvisrows=NVISROWS; gapstart=0; gapend=MINSIZE; toppos=0; keeppos=0; toprow=0; selstartpos=0; selendpos=0; hilitestartpos=0; hiliteendpos=0; anchorpos=0; cursorpos=0; revertpos=0; cursorstart=0; cursorend=0; cursorrow=0; cursorcol=0; prefcol=-1; margintop=pt; marginbottom=pb; marginleft=pl; marginright=pr; wrapwidth=80; wrapcolumns=80; tabwidth=8; tabcolumns=8; barwidth=0; barcolumns=0; font=getApp()->getNormalFont(); hilitestyles=NULL; defaultCursor=getApp()->getDefaultCursor(DEF_TEXT_CURSOR); dragCursor=getApp()->getDefaultCursor(DEF_TEXT_CURSOR); textColor=getApp()->getForeColor(); selbackColor=getApp()->getSelbackColor(); seltextColor=getApp()->getSelforeColor(); hilitebackColor=FXRGB(255,128,128); hilitetextColor=getApp()->getForeColor(); activebackColor=backColor; cursorColor=getApp()->getForeColor(); numberColor=textColor; barColor=backColor; textWidth=0; textHeight=0; searchflags=SEARCH_EXACT; delimiters=textDelimiters; vrows=0; vcols=0; matchtime=0; modified=FALSE; mode=MOUSE_NONE; grabx=0; graby=0; } // Create window void FXText::create(){ FXScrollArea::create(); font->create(); if(!deleteType){ deleteType=getApp()->registerDragType(deleteTypeName); } if(!textType){ textType=getApp()->registerDragType(textTypeName); } if(!utf8Type){ utf8Type=getApp()->registerDragType(utf8TypeName); } if(!utf16Type){ utf16Type=getApp()->registerDragType(utf16TypeName); } // if(options&TEXT_FIXEDWRAP){ wrapwidth=wrapcolumns*font->getTextWidth("x",1); } tabwidth=tabcolumns*font->getTextWidth(" ",1); barwidth=barcolumns*font->getTextWidth("8",1); recalc(); } // Detach window void FXText::detach(){ FXScrollArea::detach(); font->detach(); deleteType=0; textType=0; utf8Type=0; utf16Type=0; } // If window can have focus bool FXText::canFocus() const { return true; } // Into focus chain void FXText::setFocus(){ FXScrollArea::setFocus(); setDefault(TRUE); flags&=~FLAG_UPDATE; if(getApp()->hasInputMethod()){ createComposeContext(); } } // Out of focus chain void FXText::killFocus(){ FXScrollArea::killFocus(); setDefault(MAYBE); flags|=FLAG_UPDATE; if(getApp()->hasInputMethod()){ destroyComposeContext(); } } // Get default width FXint FXText::getDefaultWidth(){ if(0getTextWidth("8",1); } return FXScrollArea::getDefaultWidth(); } // Get default height FXint FXText::getDefaultHeight(){ if(0getFontHeight(); } return FXScrollArea::getDefaultHeight(); } // Enable the window void FXText::enable(){ if(!(flags&FLAG_ENABLED)){ FXScrollArea::enable(); update(0,0,viewport_w,viewport_h); } } // Disable the window void FXText::disable(){ if(flags&FLAG_ENABLED){ FXScrollArea::disable(); update(0,0,viewport_w,viewport_h); } } // Propagate size change void FXText::recalc(){ FXScrollArea::recalc(); flags|=FLAG_RECALC; } /*******************************************************************************/ // Make a valid position, at the start of a wide character FXint FXText::validPos(FXint pos) const { register const FXchar *ptr=pos=length) return length; return (FXISUTF(ptr[pos]) || --pos<=0 || FXISUTF(ptr[pos]) || --pos<=0 || FXISUTF(ptr[pos]) || --pos<=0 || FXISUTF(ptr[pos]) || --pos<=0 || FXISUTF(ptr[pos]) || --pos), pos; } // Decrement; a wide character does not cross the gap, so if pos is at // or below below the gap, we read from the segment below the gap FXint FXText::dec(FXint pos) const { register const FXchar *ptr=pos<=gapstart ? buffer : buffer-gapstart+gapend; return (--pos<=0 || FXISUTF(ptr[pos]) || --pos<=0 || FXISUTF(ptr[pos]) || --pos<=0 || FXISUTF(ptr[pos]) || --pos<=0 || FXISUTF(ptr[pos]) || --pos<=0 || FXISUTF(ptr[pos]) || --pos), pos; } // Increment; since a wide character does not cross the gap, if we // start under the gap the last character accessed is below the gap FXint FXText::inc(FXint pos) const { register const FXchar *ptr=pos=length || FXISUTF(ptr[pos]) || ++pos>=length || FXISUTF(ptr[pos]) || ++pos>=length || FXISUTF(ptr[pos]) || ++pos>=length || FXISUTF(ptr[pos]) || ++pos>=length || FXISUTF(ptr[pos]) || ++pos), pos; } // Get byte FXint FXText::getByte(FXint pos) const { return (FXuchar)buffer[pos=gaplen){ sz+=MINSIZE; if(!FXRESIZE(&buffer,FXchar,length+sz)){ fxerror("%s::sizegap: out of memory.\n",getClassName()); } memmove(&buffer[gapstart+sz],&buffer[gapend],length-gapstart); if(sbuffer){ if(!FXRESIZE(&sbuffer,FXchar,length+sz)){ fxerror("%s::sizegap: out of memory.\n",getClassName()); } memmove(&sbuffer[gapstart+sz],&sbuffer[gapend],length-gapstart); } gapend=gapstart+sz; } } // Squeeze out the gap by moving it to the end of the buffer void FXText::squeezegap(){ if(gapstart!=length){ memmove(&buffer[gapstart],&buffer[gapend],length-gapstart); if(sbuffer){memmove(&sbuffer[gapstart],&sbuffer[gapend],length-gapstart);} gapend=length+gapend-gapstart; gapstart=length; } } /*******************************************************************************/ // FIXME // Its a little bit more complex than this: // We need to deal with diacritics, i.e. non-spacing stuff. When wrapping, scan till // the next starter-character [the one with charCombining(c)==0]. Then measure the // string from that point on. This means FXFont::getCharWidth() is really quite useless. // Next, we also have the issue of ligatures [fi, AE] and kerning-pairs [VA]. // With possible kerning pairs, we should really measure stuff from the start of the // line [but this is *very* expensive!!]. We may want to just back up a few characters; // perhaps to the start of the word, or just the previous character, if not a space. // Need to investigate this some more; for now assume Normalization Form C. // Character width FXint FXText::charWidth(FXwchar ch,FXint indent) const { if(ch<' '){ if(ch!='\t'){ return font->getCharWidth('^')+font->getCharWidth(ch|0x40); } return (tabwidth-indent%tabwidth); } return font->getCharWidth(ch); } // Start of next wrapped line FXint FXText::wrap(FXint start) const { register FXint lw,cw,p,s,c; FXASSERT(0<=start && start<=length); lw=0; p=s=start; while(pwrapwidth){ // Technically, a tab-before-wrap should be as wide as space! if(s>start) return s; // We remembered the last space we encountered; break there! if(p==start) p++; // Always at least one character on each line! return p; } lw+=cw; p+=getCharLen(p); if(Unicode::isSpace(c)) s=p;// Remember potential break point! } return length; } // Count number of newlines FXint FXText::countLines(FXint start,FXint end) const { register FXint p,nl=0; FXASSERT(0<=start && end<=length+1); p=start; while(p=length) return nl+1; if(getByte(p)=='\n') nl++; p++; } return nl; } // Count number of rows; start should be on a row start FXint FXText::countRows(FXint start,FXint end) const { register FXint p,q,s,w=0,c,cw,nr=0; FXASSERT(0<=start && end<=length+1); if(options&TEXT_WORDWRAP){ p=q=s=start; while(q=length) return nr+1; c=getChar(p); if(c=='\n'){ // Break at newline nr++; w=0; p=q=s=p+1; continue; } cw=charWidth(c,w); if(w+cw>wrapwidth){ // Break due to wrap nr++; w=0; if(s>q){ // Break past last space seen p=q=s; continue; } if(p==q) p+=getCharLen(p); // Break anywhere, but at least one character on each line q=s=p; continue; } w+=cw; p+=getCharLen(p); if(Unicode::isSpace(c)) s=p; } } else{ p=start; while(p=length) return nr+1; c=getByte(p); if(c=='\n') nr++; p++; } } return nr; } // Count number of columns; start should be on a row start FXint FXText::countCols(FXint start,FXint end) const { register FXint nc=0,in=0,ch; FXASSERT(0<=start && end<=length); while(startnc) nc=in; in=0; } else if(ch=='\t'){ in+=(tabcolumns-nc%tabcolumns); } else{ in++; } start+=getCharLen(start); } if(in>nc) nc=in; return nc; } // Measure lines; start and end should be on a row start FXint FXText::measureText(FXint start,FXint end,FXint& wmax,FXint& hmax) const { register FXint nr=0,w=0,c,cw,p,q,s; FXASSERT(0<=start && end<=length+1); if(options&TEXT_WORDWRAP){ wmax=wrapwidth; p=q=s=start; while(q=length){ nr++; break; } c=getChar(p); if(c=='\n'){ // Break at newline nr++; w=0; p=q=s=p+1; continue; } cw=charWidth(c,w); if(w+cw>wrapwidth){ // Break due to wrap nr++; w=0; if(s>q){ // Break past last space seen p=q=s; continue; } if(p==q) p+=getCharLen(p); // Break anywhere, but at least one character on each line q=s=p; continue; } w+=cw; p+=getCharLen(p); if(Unicode::isSpace(c)) s=p; } } else{ wmax=0; p=start; while(p=length){ if(w>wmax) wmax=w; nr++; break; } c=getChar(p); if(c=='\n'){ // Break at newline if(w>wmax) wmax=w; nr++; w=0; } else{ w+=charWidth(c,w); } p+=getCharLen(p); } } hmax=nr*font->getFontHeight(); return nr; } // Check if w is delimiter static FXbool isdelimiter(const FXchar *delimiters,FXwchar w){ return w<128 && strchr(delimiters,w); // FIXME for w>=128 } // Find end of previous word FXint FXText::leftWord(FXint pos) const { register FXint ch; if(pos>length) pos=length; if(0=length) return length; if(0<=pos) c=getChar(pos); else pos=0; if(c==' ' || c=='\t'){ while(posremoveTimeout(this,ID_FLASH); if(matchtime && 0addTimeout(this,ID_FLASH,matchtime); setHighlight(matchpos,1); } } } // Search for text FXbool FXText::findText(const FXString& string,FXint* beg,FXint* end,FXint start,FXuint flgs,FXint npar){ register FXint rexmode; FXRex rex; // Compile flags rexmode=REX_VERBATIM; if(1getFontHeight(); if(row<0) return 0; // Before first row if(row>=nrows) return length; // Below last row if(row=toprow+nvisrows){ // Below visible area ls=nextRow(toppos,row-toprow); le=nextRow(ls,1); } else{ // Inside visible area ls=visrows[row-toprow]; le=visrows[row-toprow+1]; } x=x-pos_x-marginleft-barwidth; // Before begin of line if(x<0) return ls; FXASSERT(0<=ls); FXASSERT(ls<=le); FXASSERT(le<=length); if(ls>1))) return ls; cx+=cw; ls+=getCharLen(ls); } return le; } // Determine Y from position pos FXint FXText::getYOfPos(FXint pos) const { register FXint h=font->getFontHeight(); register FXint n,y; if(pos>length) pos=length; if(pos<0) pos=0; // Above visible part of buffer if(pos=visrows[nvisrows]){ n=countRows(visrows[nvisrows-1],pos); y=(toprow+nvisrows-1+n)*h; FXTRACE((150,"getYOfPos(%d > visrows[%d]=%d) = %d\n",pos,nvisrows,visrows[nvisrows],margintop+y)); } // In visible part of buffer else{ n=posToLine(pos,0); y=(toprow+n)*h; FXTRACE((150,"getYOfPos(visrows[0]=%d <= %d <= visrows[%d]=%d) = %d\n",visrows[0],pos,nvisrows,visrows[nvisrows],margintop+y)); } return margintop+y; } // Calculate X position of pos FXint FXText::getXOfPos(FXint pos) const { register FXint base=rowStart(pos); return marginleft+barwidth+lineWidth(base,pos-base); } // Force position to become fully visible void FXText::makePositionVisible(FXint pos){ register FXint x,y,nx,ny; // Valid position pos=validPos(pos); // Get coordinates of position x=getXOfPos(pos); y=getYOfPos(pos); // Old scroll position ny=pos_y; nx=pos_x; // Check vertical visibility if(pos_y+ygetFontHeight()>viewport_h-marginbottom){ ny=viewport_h-font->getFontHeight()-marginbottom-y; nx=0; } // Check Horizontal visibility if(pos_x+xviewport_w-marginright){ nx=viewport_w-marginright-x; } // If needed, scroll if(nx!=pos_x || ny!=pos_y){ setPosition(nx,ny); } } // Return TRUE if position is visible FXbool FXText::isPosVisible(FXint pos) const { if(visrows[0]<=pos && pos<=visrows[nvisrows]){ register FXint h=font->getFontHeight(); register FXint y=pos_y+margintop+(toprow+posToLine(pos,0))*h; return margintop<=y && y+h<=viewport_h-marginbottom; } return FALSE; } // Make line containing pos the top visible line void FXText::setTopLine(FXint pos){ setPosition(pos_x,margintop-getYOfPos(pos)); } // Make line containing pos the bottom visible line void FXText::setBottomLine(FXint pos){ setPosition(pos_x,viewport_h-font->getFontHeight()-marginbottom-getYOfPos(pos)); } // Center line of pos in the middle of the screen void FXText::setCenterLine(FXint pos){ setPosition(pos_x,viewport_h/2+font->getFontHeight()/2-getYOfPos(pos)); } // Get top line FXint FXText::getTopLine() const { return visrows[0]; } // Get bottom line FXint FXText::getBottomLine() const { return visrows[nvisrows-1]; } // Move content void FXText::moveContents(FXint x,FXint y){ register FXint delta,i,dx,dy; // Erase fragments of cursor overhanging margins eraseCursorOverhang(); // Number of lines scrolled delta=-y/font->getFontHeight() - toprow; // Scrolled up one or more lines if(delta<0){ if(toprow+delta<=0){ toppos=0; toprow=0; } else{ toppos=prevRow(toppos,-delta); toprow=toprow+delta; } if(-delta=-delta; i--) visrows[i]=visrows[delta+i]; calcVisRows(0,-delta); } else{ calcVisRows(0,nvisrows); } } // Scrolled down one or more lines else if(delta>0){ if(toprow+delta>=nrows-1){ toppos=rowStart(length); toprow=nrows-1; } else{ toppos=nextRow(toppos,delta); toprow=toprow+delta; } if(delta0); if(startline<0) startline=0; else if(startline>nvisrows) startline=nvisrows; if(endline<0) endline=0; else if(endline>nvisrows) endline=nvisrows; if(startline<=endline){ if(startline==0){ FXASSERT(0<=toppos && toppos<=length); visrows[0]=toppos; startline=1; } pos=visrows[startline-1]; line=startline; if(options&TEXT_WORDWRAP){ while(line<=endline && posgetFontHeight(); FXASSERT(0<=toppos && toppos<=length); if(nrdelta) update(0,0,barwidth,height); } // Top visible part unchanged else if(visrows[0]<=pos){ line=posToLine(pos,0); FXTRACE((150,"change below visible line %d\n",line)); // More lines means paint the bottom half if(nrdelta>0){ FXTRACE((150,"inserted %d rows\n",nrdelta)); nrows+=nrdelta; for(i=nvisrows; i>line+nrdelta; i--) visrows[i]=visrows[i-nrdelta]+ncdelta; calcVisRows(line+1,line+nrins); FXASSERT(0<=toppos && toppos<=length); y=pos_y+margintop+(toprow+line)*font->getFontHeight(); update(barwidth,y,width-barwidth,height-y); } // Less lines means paint bottom half also else if(nrdelta<0){ FXTRACE((150,"deleted %d rows\n",-nrdelta)); nrows+=nrdelta; for(i=line+1; i<=nvisrows+nrdelta; i++) visrows[i]=visrows[i-nrdelta]+ncdelta; calcVisRows(nvisrows+nrdelta,nvisrows); calcVisRows(line+1,line+nrins); FXASSERT(0<=toppos && toppos<=length); y=pos_y+margintop+(toprow+line)*font->getFontHeight(); update(barwidth,y,width-barwidth,height-y); } // Same lines means paint the changed area only else{ FXTRACE((150,"same number of rows\n")); for(i=line+1; i<=nvisrows; i++) visrows[i]=visrows[i]+ncdelta; calcVisRows(line+1,line+nrins); FXASSERT(0<=toppos && toppos<=length); if(nrins==0){ x=pos_x+marginleft+barwidth+lineWidth(visrows[line],pos-visrows[line]); y=pos_y+margintop+(toprow+line)*font->getFontHeight(); update(x,y,width-x,font->getFontHeight()); FXTRACE((150,"update(%d,%d,%d,%d)\n",x,y,width-x,font->getFontHeight())); } else{ y=pos_y+margintop+(toprow+line)*font->getFontHeight(); update(barwidth,y,width-barwidth,nrins*font->getFontHeight()); FXTRACE((150,"update(%d,%d,%d,%d)\n",0,y,width,nrins*font->getFontHeight())); } } } // Bottom visible part unchanged else if(pos+ncdelgetFontHeight(); calcVisRows(0,nvisrows); FXASSERT(0<=toppos && toppos<=length); update(barwidth,0,width-barwidth,pos_y+margintop+(toprow+line)*font->getFontHeight()); if(nrdelta) update(0,0,barwidth,height); } } // All visible text changed else{ FXTRACE((150,"change all visible lines\n")); nrows+=nrdelta; // Reset to top because too few lines left if(toprow>=nrows){ FXTRACE((150,"reset to top\n")); toprow=0; toppos=0; keeppos=0; FXASSERT(0<=toppos && toppos<=length); pos_y=0; } // Maintain same row as before else{ FXTRACE((150,"set to same row %d\n",toprow)); toppos=nextRow(0,toprow); keeppos=toppos; FXASSERT(0<=toppos && toppos<=length); } calcVisRows(0,nvisrows); update(); } FXTRACE((150,"AFTER : pos=%d ncins=%d ncdel=%d nrins=%d nrdel=%d toppos=%d toprow=%d nrows=%d\n",pos,ncins,ncdel,nrins,nrdel,toppos,toprow,nrows)); } // Replace m characters at pos by n characters void FXText::replace(FXint pos,FXint m,const FXchar *text,FXint n,FXint style){ register FXint nrdel,nrins,ncdel,ncins,wbeg,wend,del; FXint wdel,hdel,wins,hins; drawCursor(0); // FIXME can we do without this? FXTRACE((150,"pos=%d mdel=%d nins=%d\n",pos,m,n)); // Delta in characters del=n-m; // Bracket potentially affected character range for wrapping purposes wbeg=changeBeg(pos); wend=changeEnd(pos+m); // Measure stuff prior to change nrdel=measureText(wbeg,wend,wdel,hdel); ncdel=wend-wbeg; FXTRACE((150,"wbeg=%d wend=%d nrdel=%d ncdel=%d length=%d wdel=%d hdel=%d\n",wbeg,wend,nrdel,ncdel,length,wdel,hdel)); // Modify the buffer sizegap(del); movegap(pos); memcpy(&buffer[pos],text,n); if(sbuffer){memset(&sbuffer[pos],style,n);} gapstart+=n; gapend+=m; length+=del; // Measure stuff after change nrins=measureText(wbeg,wend+n-m,wins,hins); ncins=wend+n-m-wbeg; FXTRACE((150,"wbeg=%d wend+n-m=%d nrins=%d ncins=%d length=%d wins=%d hins=%d\n",wbeg,wend+n-m,nrins,ncins,length,wins,hins)); // Update stuff mutation(wbeg,ncins,ncdel,nrins,nrdel); // Fix text metrics textHeight=textHeight+hins-hdel; textWidth=FXMAX(textWidth,wins); // Fix selection range FXASSERT(selstartpos<=selendpos); if(pos+m<=selstartpos){ selstartpos+=del; selendpos+=del; } else if(postryHandle(this,FXSEL(SEL_REPLACED,message),(void*)&textchange); target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)cursorpos); } FXFREE(&textchange.del); } // Replace m characters at pos by n characters void FXText::replaceStyledText(FXint pos,FXint m,const FXString& text,FXint style,FXbool notify){ replaceStyledText(pos,m,text.text(),text.length(),style,notify); } // Replace text by other text void FXText::replaceText(FXint pos,FXint m,const FXchar *text,FXint n,FXbool notify){ replaceStyledText(pos,m,text,n,0,notify); } // Replace text by other text void FXText::replaceText(FXint pos,FXint m,const FXString& text,FXbool notify){ replaceText(pos,m,text.text(),text.length(),notify); } // Add text at the end void FXText::appendStyledText(const FXchar *text,FXint n,FXint style,FXbool notify){ FXTextChange textchange; if(n<0){ fxerror("%s::appendStyledText: bad argument.\n",getClassName()); } FXTRACE((130,"appendStyledText(text,%d)\n",n)); textchange.pos=length; textchange.ndel=0; textchange.nins=n; textchange.ins=(FXchar*)text; textchange.del=(FXchar*)""; replace(length,0,text,n,style); if(notify && target){ target->tryHandle(this,FXSEL(SEL_INSERTED,message),(void*)&textchange); target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)cursorpos); } } // Add text at the end void FXText::appendStyledText(const FXString& text,FXint style,FXbool notify){ appendStyledText(text.text(),text.length(),style,notify); } // Add text at the end void FXText::appendText(const FXchar *text,FXint n,FXbool notify){ appendStyledText(text,n,0,notify); } // Add text at the end void FXText::appendText(const FXString& text,FXbool notify){ appendText(text.text(),text.length(),notify); } // Insert some text at pos void FXText::insertStyledText(FXint pos,const FXchar *text,FXint n,FXint style,FXbool notify){ FXTextChange textchange; if(n<0 || pos<0 || lengthtryHandle(this,FXSEL(SEL_INSERTED,message),(void*)&textchange); target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)cursorpos); } } // Insert some text at pos void FXText::insertStyledText(FXint pos,const FXString& text,FXint style,FXbool notify){ insertStyledText(pos,text.text(),text.length(),style,notify); } // Insert some text at pos void FXText::insertText(FXint pos,const FXchar *text,FXint n,FXbool notify){ insertStyledText(pos,text,n,0,notify); } // Insert some text at pos void FXText::insertText(FXint pos,const FXString& text,FXbool notify){ insertText(pos,text.text(),text.length(),notify); } // Remove some text at pos void FXText::removeText(FXint pos,FXint n,FXbool notify){ FXTextChange textchange; if(n<0 || pos<0 || lengthtryHandle(this,FXSEL(SEL_DELETED,message),(void*)&textchange); target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)cursorpos); } FXFREE(&textchange.del); } // Grab range of text void FXText::extractText(FXchar *text,FXint pos,FXint n) const { if(n<0 || pos<0 || length=gapstart){ memcpy(text,&buffer[pos-gapstart+gapend],n); } else{ memcpy(text,&buffer[pos],gapstart-pos); memcpy(&text[gapstart-pos],&buffer[gapend],pos+n-gapstart); } } // Grab range of text void FXText::extractText(FXString& text,FXint pos,FXint n) const { if(n<0 || pos<0 || length=gapstart){ text.replace(0,n,&buffer[pos-gapstart+gapend],n); } else{ text.replace(0,gapstart-pos,&buffer[pos],gapstart-pos); text.replace(gapstart-pos,pos+n-gapstart,&buffer[gapend],pos+n-gapstart); } } // Grab range of style void FXText::extractStyle(FXchar *style,FXint pos,FXint n) const { if(n<0 || pos<0 || length=gapstart){ memcpy(style,&sbuffer[pos-gapstart+gapend],n); } else{ memcpy(style,&sbuffer[pos],gapstart-pos); memcpy(&style[gapstart-pos],&sbuffer[gapend],pos+n-gapstart); } } } // Grab range of style void FXText::extractStyle(FXString& style,FXint pos,FXint n) const { if(n<0 || pos<0 || length=gapstart){ style.replace(0,n,&sbuffer[pos-gapstart+gapend],n); } else{ style.replace(0,gapstart-pos,&sbuffer[pos],gapstart-pos); style.replace(gapstart-pos,pos+n-gapstart,&sbuffer[gapend],pos+n-gapstart); } } } // Change style of text range void FXText::changeStyle(FXint pos,FXint n,FXint style){ if(n<0 || pos<0 || length=gapstart){ memset(&sbuffer[pos-gapstart+gapend],style,n); } else{ memset(&sbuffer[pos],style,gapstart-pos); memset(&sbuffer[gapend],style,pos+n-gapstart); } updateRange(pos,pos+n); } } // Change style of text range from style-array void FXText::changeStyle(FXint pos,const FXchar* style,FXint n){ if(n<0 || pos<0 || length=gapstart){ memcpy(&sbuffer[pos-gapstart+gapend],style,n); } else{ memcpy(&sbuffer[pos],style,gapstart-pos); memcpy(&sbuffer[gapend],&style[gapstart-pos],pos+n-gapstart); } updateRange(pos,pos+n); } } // Change style of text range from style-array void FXText::changeStyle(FXint pos,const FXString& style){ changeStyle(pos,style.text(),style.length()); } // Change the text in the buffer to new text void FXText::setStyledText(const FXchar* text,FXint n,FXint style,FXbool notify){ FXTextChange textchange; if(n<0){ fxerror("%s::setStyledText: bad argument.\n",getClassName()); } if(!FXRESIZE(&buffer,FXchar,n+MINSIZE)){ fxerror("%s::setStyledText: out of memory.\n",getClassName()); } memcpy(buffer,text,n); if(sbuffer){ if(!FXRESIZE(&sbuffer,FXchar,n+MINSIZE)){ fxerror("%s::setStyledText: out of memory.\n",getClassName()); } memset(sbuffer,style,n); } gapstart=n; gapend=gapstart+MINSIZE; length=n; toppos=0; toprow=0; keeppos=0; selstartpos=0; selendpos=0; hilitestartpos=0; hiliteendpos=0; anchorpos=0; cursorpos=0; cursorstart=0; cursorend=0; cursorrow=0; cursorcol=0; prefcol=-1; pos_x=0; pos_y=0; textchange.pos=0; textchange.ndel=0; textchange.nins=n; textchange.ins=(FXchar*)text; textchange.del=(FXchar*)""; if(notify && target){ target->tryHandle(this,FXSEL(SEL_INSERTED,message),(void*)&textchange); target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)cursorpos); } recalc(); layout(); update(); } // Change all of the text void FXText::setStyledText(const FXString& text,FXint style,FXbool notify){ setStyledText(text.text(),text.length(),style,notify); } // Change the text in the buffer to new text void FXText::setText(const FXchar* text,FXint n,FXbool notify){ setStyledText(text,n,0,notify); } // Change all of the text void FXText::setText(const FXString& text,FXbool notify){ setText(text.text(),text.length(),notify); } // Retrieve text into buffer void FXText::getText(FXchar* text,FXint n) const { extractText(text,0,n); } // Retrieve text into buffer void FXText::getText(FXString& text) const { extractText(text,0,getLength()); } // We return a constant copy of the buffer FXString FXText::getText() const { FXString value; FXASSERT(0<=gapstart && gapstart<=length); value.append(buffer,gapstart); value.append(&buffer[gapend],length-gapstart); return value; } // Completely reflow the text, because font, wrapwidth, or all of the // text may have changed and everything needs to be recomputed void FXText::recompute(){ FXint ww1,ww2,ww3,hh1,hh2,hh3,hh; // Make it point somewhere sensible if(keeppos<0) keeppos=0; if(keeppos>length) keeppos=length; // Make sure we're pointing to the start of a row again toppos=rowStart(keeppos); // FIXME in log mode, we may want to keep bottom line anchored [if visible] // Font height hh=font->getFontHeight(); // Get start cursorstart=rowStart(cursorpos); cursorend=nextRow(cursorstart); cursorcol=indentFromPos(cursorstart,cursorpos); // Avoid measuring huge chunks of text twice! if(cursorstartgetFontHeight(); FXint fw=font->getFontWidth(); FXint ovv=nvisrows; FXint oww=wrapwidth; // Compute new wrap width; needed to reflow text if(options&TEXT_FIXEDWRAP){ wrapwidth=wrapcolumns*font->getTextWidth("x",1); } else{ wrapwidth=width-marginleft-barwidth-marginright; if(!(options&VSCROLLER_NEVER)) wrapwidth-=vertical->getDefaultWidth(); } // Wrap width changed, so reflow; when using fixed pitch font, // we only reflow if the number of columns has changed. if((options&TEXT_WORDWRAP) && (wrapwidth!=oww)){ if(!font->isFontMono() || (wrapwidth/fw!=oww/fw)) flags|=FLAG_RECALC; } // Scrollbars adjusted FXScrollArea::layout(); // Number of visible lines may have changed nvisrows=(height-margintop-marginbottom+fh+fh-1)/fh; if(nvisrows<1) nvisrows=1; // Number of visible lines changed if(nvisrows!=ovv){ // Resize line start array FXRESIZE(&visrows,FXint,nvisrows+1); // Recompute line starts calcVisRows(0,nvisrows); } // Set line size based on font vertical->setLine(fh); horizontal->setLine(fw); // Force repaint update(); // Done flags&=~FLAG_DIRTY; } /*******************************************************************************/ // Blink the cursor long FXText::onBlink(FXObject*,FXSelector,void*){ drawCursor(flags^FLAG_CARET); getApp()->addTimeout(this,ID_BLINK,getApp()->getBlinkSpeed()); return 0; } // Gained focus long FXText::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onFocusIn(sender,sel,ptr); getApp()->addTimeout(this,ID_BLINK,getApp()->getBlinkSpeed()); drawCursor(FLAG_CARET); return 1; } // Lost focus long FXText::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onFocusOut(sender,sel,ptr); getApp()->removeTimeout(this,ID_BLINK); drawCursor(0); flags|=FLAG_UPDATE; return 1; } // We were asked about tip text long FXText::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXText::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Flash matching brace long FXText::onFlash(FXObject*,FXSelector,void*){ killHighlight(); return 0; } // Pressed left button long FXText::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint pos; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; // Select characters if(event->click_count==1){ pos=getPosAt(event->win_x,event->win_y); FXTRACE((150,"getPosAt(%d,%d) = %d getYOfPos(%d) = %d getXOfPos(%d)=%d\n",event->win_x,event->win_y,pos,pos,getYOfPos(pos),pos,getXOfPos(pos))); setCursorPos(pos,TRUE); makePositionVisible(cursorpos); if(event->state&SHIFTMASK){ extendSelection(cursorpos,SELECT_CHARS,TRUE); } else{ killSelection(TRUE); setAnchorPos(cursorpos); flashMatching(); } mode=MOUSE_CHARS; } // Select words else if(event->click_count==2){ setAnchorPos(cursorpos); extendSelection(cursorpos,SELECT_WORDS,TRUE); mode=MOUSE_WORDS; } // Select lines else{ setAnchorPos(cursorpos); extendSelection(cursorpos,SELECT_LINES,TRUE); mode=MOUSE_LINES; } return 1; } return 0; } // Released left button long FXText::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); mode=MOUSE_NONE; stopAutoScroll(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // Pressed middle button long FXText::onMiddleBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint pos; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONPRESS,message),ptr)) return 1; pos=getPosAt(event->win_x,event->win_y); // Move over setCursorPos(pos,TRUE); makePositionVisible(cursorpos); // Start text drag if(isPosSelected(cursorpos)){ mode=MOUSE_TRYDRAG; } flags&=~FLAG_UPDATE; return 1; } return 0; } // Released middle button long FXText::onMiddleBtnRelease(FXObject*,FXSelector,void* ptr){ FXuint md=mode; if(isEnabled()){ ungrab(); stopAutoScroll(); mode=MOUSE_NONE; if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONRELEASE,message),ptr)) return 1; // Drop text somewhere if(md==MOUSE_DRAG){ handle(this,FXSEL(SEL_ENDDRAG,0),ptr); } // Paste selection else{ handle(this,FXSEL(SEL_COMMAND,ID_PASTE_MIDDLE),NULL); } return 1; } return 0; } // Pressed right button long FXText::onRightBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; grabx=event->win_x-pos_x; graby=event->win_y-pos_y; mode=MOUSE_SCROLL; flags&=~FLAG_UPDATE; return 1; } return 0; } // Released right button long FXText::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); mode=MOUSE_NONE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // The widget lost the grab for some reason long FXText::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onUngrabbed(sender,sel,ptr); mode=MOUSE_NONE; flags|=FLAG_UPDATE; stopAutoScroll(); return 1; } // Autoscroll timer fired long FXText::onAutoScroll(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint pos; FXScrollArea::onAutoScroll(sender,sel,ptr); switch(mode){ case MOUSE_CHARS: if((fxabs(event->win_x-event->click_x)>getApp()->getDragDelta())||(fxabs(event->win_y-event->click_y)>getApp()->getDragDelta())){ pos=getPosAt(event->win_x,event->win_y); setCursorPos(pos,TRUE); extendSelection(cursorpos,SELECT_CHARS,TRUE); } return 1; case MOUSE_WORDS: if((fxabs(event->win_x-event->click_x)>getApp()->getDragDelta())||(fxabs(event->win_y-event->click_y)>getApp()->getDragDelta())){ pos=getPosAt(event->win_x,event->win_y); setCursorPos(pos,TRUE); extendSelection(cursorpos,SELECT_WORDS,TRUE); } return 1; case MOUSE_LINES: if((fxabs(event->win_x-event->click_x)>getApp()->getDragDelta())||(fxabs(event->win_y-event->click_y)>getApp()->getDragDelta())){ pos=getPosAt(event->win_x,event->win_y); setCursorPos(pos,TRUE); extendSelection(cursorpos,SELECT_LINES,TRUE); } return 1; } return 0; } // Handle real or simulated mouse motion long FXText::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint pos; switch(mode){ case MOUSE_CHARS: if(startAutoScroll(event,FALSE)) return 1; if((fxabs(event->win_x-event->click_x)>getApp()->getDragDelta())||(fxabs(event->win_y-event->click_y)>getApp()->getDragDelta())){ pos=getPosAt(event->win_x,event->win_y); setCursorPos(pos,TRUE); extendSelection(cursorpos,SELECT_CHARS,TRUE); } return 1; case MOUSE_WORDS: if(startAutoScroll(event,FALSE)) return 1; if((fxabs(event->win_x-event->click_x)>getApp()->getDragDelta())||(fxabs(event->win_y-event->click_y)>getApp()->getDragDelta())){ pos=getPosAt(event->win_x,event->win_y); setCursorPos(pos,TRUE); extendSelection(cursorpos,SELECT_WORDS,TRUE); } return 1; case MOUSE_LINES: if(startAutoScroll(event,FALSE)) return 1; if((fxabs(event->win_x-event->click_x)>getApp()->getDragDelta())||(fxabs(event->win_y-event->click_y)>getApp()->getDragDelta())){ pos=getPosAt(event->win_x,event->win_y); setCursorPos(pos,TRUE); extendSelection(cursorpos,SELECT_LINES,TRUE); } return 1; case MOUSE_SCROLL: setPosition(event->win_x-grabx,event->win_y-graby); return 1; case MOUSE_DRAG: handle(this,FXSEL(SEL_DRAGGED,0),ptr); return 1; case MOUSE_TRYDRAG: if(event->moved){ mode=MOUSE_NONE; if(handle(this,FXSEL(SEL_BEGINDRAG,0),ptr)){ mode=MOUSE_DRAG; } } return 1; } return 0; } /*******************************************************************************/ // Start a drag operation long FXText::onBeginDrag(FXObject* sender,FXSelector sel,void* ptr){ FXDragType types[4]; if(FXScrollArea::onBeginDrag(sender,sel,ptr)) return 1; types[0]=stringType; types[1]=textType; types[2]=utf8Type; types[3]=utf16Type; beginDrag(types,4); setDragCursor(getApp()->getDefaultCursor(DEF_DNDSTOP_CURSOR)); return 1; } // End drag operation long FXText::onEndDrag(FXObject* sender,FXSelector sel,void* ptr){ if(FXScrollArea::onEndDrag(sender,sel,ptr)) return 1; endDrag((didAccept()!=DRAG_REJECT)); setDragCursor(getApp()->getDefaultCursor(DEF_TEXT_CURSOR)); return 1; } // Dragged stuff around long FXText::onDragged(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXDragAction action; if(FXScrollArea::onDragged(sender,sel,ptr)) return 1; action=DRAG_COPY; if(isEditable()){ if(isDropTarget()) action=DRAG_MOVE; if(event->state&CONTROLMASK) action=DRAG_COPY; if(event->state&SHIFTMASK) action=DRAG_MOVE; } handleDrag(event->root_x,event->root_y,action); if(didAccept()!=DRAG_REJECT){ if(action==DRAG_MOVE) setDragCursor(getApp()->getDefaultCursor(DEF_DNDMOVE_CURSOR)); else setDragCursor(getApp()->getDefaultCursor(DEF_DNDCOPY_CURSOR)); } else{ setDragCursor(getApp()->getDefaultCursor(DEF_DNDSTOP_CURSOR)); } return 1; } // Handle drag-and-drop enter long FXText::onDNDEnter(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onDNDEnter(sender,sel,ptr); drawCursor(FLAG_CARET); revertpos=cursorpos; return 1; } // Handle drag-and-drop leave long FXText::onDNDLeave(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onDNDLeave(sender,sel,ptr); stopAutoScroll(); drawCursor(0); setCursorPos(revertpos,TRUE); return 1; } // Handle drag-and-drop motion long FXText::onDNDMotion(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; // Scroll into view if(startAutoScroll(event,TRUE)) return 1; // Handled elsewhere if(FXScrollArea::onDNDMotion(sender,sel,ptr)) return 1; // Correct drop type if(offeredDNDType(FROM_DRAGNDROP,textType) || offeredDNDType(FROM_DRAGNDROP,stringType) || offeredDNDType(FROM_DRAGNDROP,utf8Type) || offeredDNDType(FROM_DRAGNDROP,utf16Type)){ // Is target editable? if(isEditable()){ FXDragAction action=inquireDNDAction(); // Check for legal DND action if(action==DRAG_COPY || action==DRAG_MOVE){ // Get the suggested drop position FXint pos=getPosAt(event->win_x,event->win_y); // Move cursor to new position setCursorPos(pos,TRUE); makePositionVisible(cursorpos); // We don't accept a drop on the selection if(!isPosSelected(pos)){ acceptDrop(DRAG_ACCEPT); } } } return 1; } // Didn't handle it here return 0; } // Handle drag-and-drop drop long FXText::onDNDDrop(FXObject* sender,FXSelector sel,void* ptr){ // Stop scrolling stopAutoScroll(); drawCursor(0); // Try handling it in base class first if(FXScrollArea::onDNDDrop(sender,sel,ptr)) return 1; // Should really not have gotten this if non-editable if(isEditable()){ FXString string; FXString junk; // First, try UTF-8 if(getDNDData(FROM_DRAGNDROP,utf8Type,string)){ FXTRACE((100,"Paste UTF8\n")); if(inquireDNDAction()==DRAG_MOVE){ getDNDData(FROM_DRAGNDROP,deleteType,junk); } handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)string.text()); return 1; } // Next, try UTF-16 if(getDNDData(FROM_DRAGNDROP,utf16Type,string)){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Paste UTF16\n")); if(inquireDNDAction()==DRAG_MOVE){ getDNDData(FROM_DRAGNDROP,deleteType,junk); } handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)unicode.mb2utf(string).text()); return 1; } // Next, try good old Latin-1 if(getDNDData(FROM_DRAGNDROP,textType,string)){ FX88591Codec ascii; FXTRACE((100,"Paste ASCII\n")); if(inquireDNDAction()==DRAG_MOVE){ getDNDData(FROM_DRAGNDROP,deleteType,junk); } handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)ascii.mb2utf(string).text()); return 1; } return 1; } return 0; } // Service requested DND data long FXText::onDNDRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; // Perhaps the target wants to supply its own data if(FXScrollArea::onDNDRequest(sender,sel,ptr)) return 1; // Recognize the request? if(event->target==stringType || event->target==textType || event->target==utf8Type || event->target==utf16Type){ FXString string; // Get selected fragment extractText(string,selstartpos,selendpos-selstartpos); // Return text of the selection as UTF-8 if(event->target==utf8Type){ FXTRACE((100,"Request UTF8\n")); setDNDData(FROM_DRAGNDROP,event->target,string); return 1; } // Return text of the selection translated to 8859-1 if(event->target==stringType || event->target==textType){ FX88591Codec ascii; FXTRACE((100,"Request ASCII\n")); setDNDData(FROM_DRAGNDROP,event->target,ascii.utf2mb(string)); return 1; } // Return text of the selection translated to UTF-16 if(event->target==utf16Type){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Request UTF16\n")); setDNDData(FROM_DRAGNDROP,event->target,unicode.utf2mb(string)); return 1; } } // Delete dragged text, if editable if(event->target==deleteType){ if(isEditable()){ handle(this,FXSEL(SEL_COMMAND,ID_DELETE_SEL),NULL); } return 1; } return 0; } /*******************************************************************************/ // We now really do have the selection long FXText::onSelectionGained(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onSelectionGained(sender,sel,ptr); return 1; } // We lost the selection somehow long FXText::onSelectionLost(FXObject* sender,FXSelector sel,void* ptr){ FXint what[2]; FXScrollArea::onSelectionLost(sender,sel,ptr); if(target){ what[0]=selstartpos; what[1]=selendpos-selstartpos; target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)what); } updateRange(selstartpos,selendpos); selstartpos=0; selendpos=0; return 1; } // Somebody wants our selection long FXText::onSelectionRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; // Perhaps the target wants to supply its own data for the selection if(FXScrollArea::onSelectionRequest(sender,sel,ptr)) return 1; // Recognize the request? if(event->target==stringType || event->target==textType || event->target==utf8Type || event->target==utf16Type){ FXString string; // Get selected fragment extractText(string,selstartpos,selendpos-selstartpos); // Return text of the selection as UTF-8 if(event->target==utf8Type){ FXTRACE((100,"Request UTF8\n")); setDNDData(FROM_SELECTION,event->target,string); return 1; } // Return text of the selection translated to 8859-1 if(event->target==stringType || event->target==textType){ FX88591Codec ascii; FXTRACE((100,"Request ASCII\n")); string=ascii.utf2mb(string); setDNDData(FROM_SELECTION,event->target,string); return 1; } // Return text of the selection translated to UTF-16 if(event->target==utf16Type){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Request UTF16\n")); string=unicode.utf2mb(string); setDNDData(FROM_SELECTION,event->target,string); return 1; } } return 0; } /*******************************************************************************/ // We now really do have the selection long FXText::onClipboardGained(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onClipboardGained(sender,sel,ptr); return 1; } // We lost the selection somehow long FXText::onClipboardLost(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onClipboardLost(sender,sel,ptr); clipped.clear(); return 1; } // Somebody wants our selection long FXText::onClipboardRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; // Try handling it in base class first if(FXScrollArea::onClipboardRequest(sender,sel,ptr)) return 1; // Requested data from clipboard if(event->target==stringType || event->target==textType || event->target==utf8Type || event->target==utf16Type){ FXString string=clipped; // Expand newlines to CRLF on Windows #ifdef WIN32 unixToDos(string); #endif // Return clipped text as as UTF-8 if(event->target==utf8Type){ FXTRACE((100,"Request UTF8\n")); setDNDData(FROM_CLIPBOARD,event->target,string); return 1; } // Return clipped text translated to 8859-1 if(event->target==stringType || event->target==textType){ FX88591Codec ascii; FXTRACE((100,"Request ASCII\n")); setDNDData(FROM_CLIPBOARD,event->target,ascii.utf2mb(string)); return 1; } // Return text of the selection translated to UTF-16 if(event->target==utf16Type){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Request UTF16\n")); setDNDData(FROM_CLIPBOARD,event->target,unicode.utf2mb(string)); return 1; } } return 0; } /*******************************************************************************/ // Keyboard press long FXText::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled()){ FXTRACE((200,"%s::onKeyPress keysym=0x%04x state=%04x\n",getClassName(),event->code,event->state)); if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; switch(event->code){ case KEY_Shift_L: case KEY_Shift_R: case KEY_Control_L: case KEY_Control_R: if(mode==MOUSE_DRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; case KEY_Up: case KEY_KP_Up: if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_SCROLL_UP),NULL); } else{ if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_UP),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } } return 1; case KEY_Down: case KEY_KP_Down: if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_SCROLL_DOWN),NULL); } else{ if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_DOWN),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } } return 1; case KEY_Left: case KEY_KP_Left: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_WORD_LEFT),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_LEFT),NULL); } if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Right: case KEY_KP_Right: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_WORD_RIGHT),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_RIGHT),NULL); } if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Home: case KEY_KP_Home: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_TOP),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_HOME),NULL); } if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_End: case KEY_KP_End: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_BOTTOM),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_END),NULL); } if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Page_Up: case KEY_KP_Page_Up: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_PAGEUP),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Page_Down: case KEY_KP_Page_Down: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_PAGEDOWN),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Insert: case KEY_KP_Insert: if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_COPY_SEL),NULL); } else if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_PASTE_SEL),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_TOGGLE_OVERSTRIKE),NULL); } return 1; case KEY_Delete: case KEY_KP_Delete: if(isPosSelected(cursorpos)){ if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_CUT_SEL),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_DELETE_SEL),NULL); } } else{ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_DELETE_WORD),NULL); } else if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_DELETE_EOL),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_DELETE),NULL); } } return 1; case KEY_BackSpace: if(isPosSelected(cursorpos)){ handle(this,FXSEL(SEL_COMMAND,ID_DELETE_SEL),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_BACKSPACE_WORD),NULL); } else if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_BACKSPACE_BOL),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_BACKSPACE),NULL); } } return 1; case KEY_Return: case KEY_KP_Enter: handle(this,FXSEL(SEL_COMMAND,ID_INSERT_NEWLINE),NULL); return 1; case KEY_Tab: case KEY_KP_Tab: if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)"\t"); } else{ handle(this,FXSEL(SEL_COMMAND,ID_INSERT_TAB),NULL); } return 1; case KEY_a: if(!(event->state&CONTROLMASK)) goto ins; handle(this,FXSEL(SEL_COMMAND,ID_SELECT_ALL),NULL); return 1; case KEY_x: if(!(event->state&CONTROLMASK)) goto ins; case KEY_F20: // Sun Cut key handle(this,FXSEL(SEL_COMMAND,ID_CUT_SEL),NULL); return 1; case KEY_c: if(!(event->state&CONTROLMASK)) goto ins; case KEY_F16: // Sun Copy key handle(this,FXSEL(SEL_COMMAND,ID_COPY_SEL),NULL); return 1; case KEY_v: if(!(event->state&CONTROLMASK)) goto ins; case KEY_F18: // Sun Paste key handle(this,FXSEL(SEL_COMMAND,ID_PASTE_SEL),NULL); return 1; default: ins: if((event->state&(CONTROLMASK|ALTMASK)) || ((FXuchar)event->text[0]<32)) return 0; if(isOverstrike()){ handle(this,FXSEL(SEL_COMMAND,ID_OVERST_STRING),(void*)event->text.text()); } else{ handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)event->text.text()); } return 1; } } return 0; } // Keyboard release long FXText::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ FXTRACE((200,"%s::onKeyRelease keysym=0x%04x state=%04x\n",getClassName(),event->code,event->state)); if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Shift_L: case KEY_Shift_R: case KEY_Control_L: case KEY_Control_R: if(mode==MOUSE_DRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; } } return 0; } /*******************************************************************************/ // Move cursor to top of buffer long FXText::onCmdCursorTop(FXObject*,FXSelector,void*){ setCursorPos(0,TRUE); makePositionVisible(cursorpos); flashMatching(); return 1; } // Move cursor to bottom of buffer long FXText::onCmdCursorBottom(FXObject*,FXSelector,void*){ setCursorPos(length,TRUE); makePositionVisible(cursorpos); flashMatching(); return 1; } // Move cursor to begin of line long FXText::onCmdCursorHome(FXObject*,FXSelector,void*){ setCursorPos(rowStart(cursorpos),TRUE); makePositionVisible(cursorpos); flashMatching(); return 1; } // Move cursor to end of line long FXText::onCmdCursorEnd(FXObject*,FXSelector,void*){ setCursorPos(rowEnd(cursorpos),TRUE); makePositionVisible(cursorpos); flashMatching(); return 1; } // Move cursor right long FXText::onCmdCursorRight(FXObject*,FXSelector,void*){ if(cursorpos>=length) return 1; setCursorPos(inc(cursorpos),TRUE); makePositionVisible(cursorpos); flashMatching(); return 1; } // Move cursor left long FXText::onCmdCursorLeft(FXObject*,FXSelector,void*){ if(cursorpos<=0) return 1; setCursorPos(dec(cursorpos),TRUE); makePositionVisible(cursorpos); flashMatching(); return 1; } // Move cursor to previous line long FXText::onCmdCursorUp(FXObject*,FXSelector,void*){ FXint newrow,newpos,col; col=(0<=prefcol) ? prefcol : cursorcol; newrow=prevRow(cursorpos); newpos=posFromIndent(newrow,col); setCursorPos(newpos,TRUE); makePositionVisible(cursorpos); flashMatching(); prefcol=col; return 1; } // Move cursor to next line long FXText::onCmdCursorDown(FXObject*,FXSelector,void*){ FXint newrow,newpos,col; col=(0<=prefcol) ? prefcol : cursorcol; newrow=nextRow(cursorpos); newpos=posFromIndent(newrow,col); setCursorPos(newpos,TRUE); makePositionVisible(cursorpos); flashMatching(); prefcol=col; return 1; } // Page down long FXText::onCmdCursorPageDown(FXObject*,FXSelector,void*){ FXint newrow,newpos,col; col=(0<=prefcol) ? prefcol : cursorcol; newrow=nextRow(cursorpos,(viewport_h)/font->getFontHeight()); newpos=posFromIndent(newrow,col); setTopLine(nextRow(toppos,viewport_h/font->getFontHeight())); setCursorPos(newpos,TRUE); makePositionVisible(cursorpos); prefcol=col; return 1; } // Page up long FXText::onCmdCursorPageUp(FXObject*,FXSelector,void*){ FXint newrow,newpos,col; col=(0<=prefcol) ? prefcol : cursorcol; newrow=prevRow(cursorpos,(viewport_h)/font->getFontHeight()); newpos=posFromIndent(newrow,col); setTopLine(prevRow(toppos,viewport_h/font->getFontHeight())); setCursorPos(newpos,TRUE); makePositionVisible(cursorpos); prefcol=col; return 1; } // Word Left long FXText::onCmdCursorWordLeft(FXObject*,FXSelector,void*){ setCursorPos(leftWord(cursorpos),TRUE); makePositionVisible(cursorpos); flashMatching(); return 1; } // Word Right long FXText::onCmdCursorWordRight(FXObject*,FXSelector,void*){ setCursorPos(rightWord(cursorpos),TRUE); makePositionVisible(cursorpos); flashMatching(); return 1; } // Word Start long FXText::onCmdCursorWordStart(FXObject*,FXSelector,void*){ setCursorPos(wordStart(cursorpos),TRUE); makePositionVisible(cursorpos); flashMatching(); return 1; } // Word End long FXText::onCmdCursorWordEnd(FXObject*,FXSelector,void*){ setCursorPos(wordEnd(cursorpos),TRUE); makePositionVisible(cursorpos); flashMatching(); return 1; } // Cursor pos to top of screen long FXText::onCmdCursorScreenTop(FXObject*,FXSelector,void*){ setTopLine(cursorpos); return 1; } // Cursor pos to bottom of screen long FXText::onCmdCursorScreenBottom(FXObject*,FXSelector,void*){ setBottomLine(cursorpos); return 1; } // Cursor pos to center of screen long FXText::onCmdCursorScreenCenter(FXObject*,FXSelector,void*){ setCenterLine(cursorpos); return 1; } // Scroll up one line, leaving cursor in place long FXText::onCmdScrollUp(FXObject*,FXSelector,void*){ setTopLine(prevRow(toppos,1)); return 1; } // Scroll down one line, leaving cursor in place long FXText::onCmdScrollDown(FXObject*,FXSelector,void*){ setTopLine(nextRow(toppos,1)); return 1; } // Move cursor to begin of paragraph long FXText::onCmdCursorParHome(FXObject*,FXSelector,void*){ setCursorPos(lineStart(cursorpos),TRUE); makePositionVisible(cursorpos); return 1; } // Move cursor to end of paragraph long FXText::onCmdCursorParEnd(FXObject*,FXSelector,void*){ setCursorPos(lineEnd(cursorpos),TRUE); makePositionVisible(cursorpos); return 1; } // Mark long FXText::onCmdMark(FXObject*,FXSelector,void*){ setAnchorPos(cursorpos); return 1; } // Extend long FXText::onCmdExtend(FXObject*,FXSelector,void*){ extendSelection(cursorpos,SELECT_CHARS,TRUE); return 1; } // Overstrike a string long FXText::onCmdOverstString(FXObject*,FXSelector,void* ptr){ if(isEditable()){ FXint sindent,oindent,nindent,pos,ch,reppos,replen; FXchar* string=(FXchar*)ptr; FXint len=strlen(string); if(isPosSelected(cursorpos)){ reppos=selstartpos; replen=selendpos-selstartpos; } else{ sindent=0; pos=lineStart(cursorpos); while(posnindent){ // Greater indent if(ch!='\t') pos++; // Don't include last character if it was a tab break; } pos++; } reppos=cursorpos; replen=pos-reppos; } replaceText(reppos,replen,string,len,TRUE); killSelection(TRUE); setCursorPos(reppos+len,TRUE); makePositionVisible(cursorpos); flashMatching(); flags|=FLAG_CHANGED; modified=TRUE; } else{ getApp()->beep(); } return 1; } // Insert a string long FXText::onCmdInsertString(FXObject*,FXSelector,void* ptr){ if(isEditable()){ FXchar* string=(FXchar*)ptr; FXint len=strlen(string); FXint reppos=cursorpos; FXint replen=0; if(isPosSelected(cursorpos)){ reppos=selstartpos; replen=selendpos-selstartpos; } replaceText(reppos,replen,string,len,TRUE); killSelection(TRUE); setCursorPos(reppos+len,TRUE); makePositionVisible(cursorpos); flashMatching(); flags|=FLAG_CHANGED; modified=TRUE; } else{ getApp()->beep(); } return 1; } // Insert a character long FXText::onCmdInsertNewline(FXObject*,FXSelector,void*){ if(isEditable()){ FXint reppos=cursorpos; FXint replen=0; FXint len=1; if(isPosSelected(cursorpos)){ reppos=selstartpos; replen=selendpos-selstartpos; } if(options&TEXT_AUTOINDENT){ FXint start=lineStart(reppos); FXint end=start; FXchar *string; while(endbeep(); } return 1; } // Insert a character long FXText::onCmdInsertTab(FXObject*,FXSelector,void*){ if(isEditable()){ FXint reppos=cursorpos; FXint replen=0; FXint len=1; if(isPosSelected(cursorpos)){ reppos=selstartpos; replen=selendpos-selstartpos; } if(options&TEXT_NO_TABS){ FXint start=lineStart(reppos); FXint indent=0; FXchar *string; while(startbeep(); } return 1; } // Cut long FXText::onCmdCutSel(FXObject*,FXSelector,void*){ if(isEditable()){ if(selstartposbeep(); } return 1; } // Copy long FXText::onCmdCopySel(FXObject*,FXSelector,void*){ if(selstartposbeep(); } return 1; } // Paste clipboard long FXText::onCmdPasteSel(FXObject*,FXSelector,void*){ if(isEditable()){ FXString string; // Delete existing selection if(hasSelection()){ handle(this,FXSEL(SEL_COMMAND,ID_DELETE_SEL),NULL); } // First, try UTF-8 if(getDNDData(FROM_CLIPBOARD,utf8Type,string)){ FXTRACE((100,"Paste UTF8\n")); #ifdef WIN32 dosToUnix(string); #endif handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)string.text()); return 1; } // Next, try UTF-16 if(getDNDData(FROM_CLIPBOARD,utf16Type,string)){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Paste UTF16\n")); string=unicode.mb2utf(string); #ifdef WIN32 dosToUnix(string); #endif handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)string.text()); return 1; } // Next, try good old Latin-1 if(getDNDData(FROM_CLIPBOARD,stringType,string)){ FX88591Codec ascii; FXTRACE((100,"Paste ASCII\n")); string=ascii.mb2utf(string); #ifdef WIN32 dosToUnix(string); #endif handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)string.text()); return 1; } } else{ getApp()->beep(); } return 1; } // Paste selection long FXText::onCmdPasteMiddle(FXObject*,FXSelector,void*){ if(isEditable()){ if(selstartpos==selendpos || cursorpos<=selstartpos || selendpos<=cursorpos){ // Avoid paste inside selection FXString string; // First, try UTF-8 if(getDNDData(FROM_SELECTION,utf8Type,string)){ FXTRACE((100,"Paste UTF8\n")); handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)string.text()); return 1; } // Next, try UTF-16 if(getDNDData(FROM_SELECTION,utf16Type,string)){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Paste UTF16\n")); handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)unicode.mb2utf(string).text()); return 1; } // Finally, try good old 8859-1 if(getDNDData(FROM_SELECTION,stringType,string)){ FX88591Codec ascii; FXTRACE((100,"Paste ASCII\n")); handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)ascii.mb2utf(string).text()); return 1; } } } else{ getApp()->beep(); } return 1; } // Select character long FXText::onCmdSelectChar(FXObject*,FXSelector,void*){ setAnchorPos(cursorpos); extendSelection(inc(cursorpos),SELECT_CHARS,TRUE); return 1; } // Select Word long FXText::onCmdSelectWord(FXObject*,FXSelector,void*){ setAnchorPos(cursorpos); extendSelection(cursorpos,SELECT_WORDS,TRUE); return 1; } // Select Line long FXText::onCmdSelectLine(FXObject*,FXSelector,void*){ setAnchorPos(cursorpos); extendSelection(cursorpos,SELECT_LINES,TRUE); return 1; } // Select All long FXText::onCmdSelectAll(FXObject*,FXSelector,void*){ setAnchorPos(0); extendSelection(length,SELECT_CHARS,TRUE); return 1; } // Deselect All long FXText::onCmdDeselectAll(FXObject*,FXSelector,void*){ killSelection(TRUE); return 1; } // Backspace character long FXText::onCmdBackspace(FXObject*,FXSelector,void*){ if(isEditable() && 0beep(); } return 1; } // Backspace word long FXText::onCmdBackspaceWord(FXObject*,FXSelector,void*){ if(isEditable()){ FXint pos=leftWord(cursorpos); removeText(pos,cursorpos-pos,TRUE); setCursorPos(cursorpos,TRUE); makePositionVisible(cursorpos); flags|=FLAG_CHANGED; modified=TRUE; } else{ getApp()->beep(); } return 1; } // Backspace bol long FXText::onCmdBackspaceBol(FXObject*,FXSelector,void*){ if(isEditable()){ FXint pos=rowStart(cursorpos); removeText(pos,cursorpos-pos,TRUE); setCursorPos(cursorpos,TRUE); makePositionVisible(cursorpos); flags|=FLAG_CHANGED; modified=TRUE; } else{ getApp()->beep(); } return 1; } // Delete character long FXText::onCmdDelete(FXObject*,FXSelector,void*){ if(isEditable() && cursorposbeep(); } return 1; } // Delete word long FXText::onCmdDeleteWord(FXObject*,FXSelector,void*){ if(isEditable()){ FXint pos=rightWord(cursorpos); removeText(cursorpos,pos-cursorpos,TRUE); setCursorPos(cursorpos,TRUE); makePositionVisible(cursorpos); flags|=FLAG_CHANGED; modified=TRUE; } else{ getApp()->beep(); } return 1; } // Delete to end of line long FXText::onCmdDeleteEol(FXObject*,FXSelector,void*){ if(isEditable()){ FXint pos=rowEnd(cursorpos); removeText(cursorpos,pos-cursorpos,TRUE); setCursorPos(cursorpos,TRUE); makePositionVisible(cursorpos); flags|=FLAG_CHANGED; modified=TRUE; } else{ getApp()->beep(); } return 1; } // Delete line long FXText::onCmdDeleteLine(FXObject*,FXSelector,void*){ if(isEditable()){ FXint beg=rowStart(cursorpos); FXint end=nextRow(cursorpos); removeText(beg,end-beg,TRUE); setCursorPos(cursorpos,TRUE); makePositionVisible(cursorpos); flags|=FLAG_CHANGED; modified=TRUE; } else{ getApp()->beep(); } return 1; } // Delete all text long FXText::onCmdDeleteAll(FXObject*,FXSelector,void*){ if(isEditable()){ removeText(0,length,TRUE); setCursorPos(0,TRUE); makePositionVisible(0); flags|=FLAG_CHANGED; modified=TRUE; } else{ getApp()->beep(); } return 1; } // Make selected text upper case long FXText::onCmdChangeCase(FXObject*,FXSelector sel,void*){ if(isEditable()){ FXString text; FXint pos=selstartpos; FXint num=selendpos-selstartpos; extractText(text,pos,num); if(FXSELID(sel)==ID_UPPER_CASE){ text.upper(); } else{ text.lower(); } replaceText(pos,num,text,TRUE); setSelection(pos,text.length(),TRUE); setCursorPos(cursorpos,TRUE); makePositionVisible(cursorpos); flags|=FLAG_CHANGED; modified=TRUE; } else{ getApp()->beep(); } return 1; } // Shift text by certain amount FXint FXText::shiftText(FXint start,FXint end,FXint amount,FXbool notify){ FXint white,p,len,size,c; FXchar *text; if(start<0) start=0; if(end>length) end=length; FXASSERT(0=tabcolumns){ text[len++]='\t'; white-=tabcolumns;} } while(white>0){ text[len++]=' '; white--; } text[len++]=c; while(pbeep(); } return 1; } // Goto matching character long FXText::onCmdGotoMatching(FXObject*,FXSelector,void*){ if(0beep(); return 1; } // Select text till matching character long FXText::onCmdSelectMatching(FXObject*,FXSelector,void*){ if(0cursorpos){ setAnchorPos(cursorpos-1); extendSelection(pos+1,SELECT_CHARS,TRUE); } else{ setAnchorPos(pos); extendSelection(cursorpos,SELECT_CHARS,TRUE); } return 1; } } getApp()->beep(); return 1; } static const FXchar righthand[]="}])>"; static const FXchar lefthand[]="{[(<"; // Select entire enclosing block long FXText::onCmdSelectBlock(FXObject*,FXSelector sel,void*){ FXint beg,end,what,level=1; while(1){ what=FXSELID(sel)-ID_SELECT_BRACE; beg=matchBackward(cursorpos-1,0,lefthand[what],righthand[what],level); end=matchForward(cursorpos,length,lefthand[what],righthand[what],level); if(0<=beg && begbeep(); break; } return 1; } // Goto start of enclosing block long FXText::onCmdBlockBeg(FXObject*,FXSelector sel,void*){ FXint what=FXSELID(sel)-ID_LEFT_BRACE; FXint beg=cursorpos-1; if(0beep(); return 1; } // Goto end of enclosing block long FXText::onCmdBlockEnd(FXObject*,FXSelector sel,void*){ FXint what=FXSELID(sel)-ID_RIGHT_BRACE; FXint start=cursorpos; if(startbeep(); return 1; } // Search for selected text long FXText::onCmdSearchSel(FXObject*,FXSelector sel,void*){ FXString string; FXint pos=cursorpos; FXint beg,end; // First, try UTF-8 if(getDNDData(FROM_SELECTION,utf8Type,string)){ FXTRACE((100,"Search UTF8\n")); searchstring=string; } // Next, try UTF-16 else if(getDNDData(FROM_SELECTION,utf16Type,string)){ FXTRACE((100,"Search UTF16\n")); FXUTF16LECodec unicode; // FIXME maybe other endianness for unix searchstring=unicode.mb2utf(string); } // Finally, try good old 8859-1 else if(getDNDData(FROM_SELECTION,stringType,string)){ FXTRACE((100,"Search ASCII\n")); FX88591Codec ascii; searchstring=ascii.mb2utf(string); } // No dice! else{ goto x; } // Search direction if(FXSELID(sel)==ID_SEARCH_FORW_SEL){ if(isPosSelected(pos)) pos=selendpos; searchflags=SEARCH_EXACT|SEARCH_FORWARD; } else{ if(isPosSelected(pos)) pos=selstartpos-1; searchflags=SEARCH_EXACT|SEARCH_BACKWARD; } // Perform search if(findText(searchstring,&beg,&end,pos,searchflags|SEARCH_WRAP)){ if(beg!=selstartpos || end!=selendpos){ setAnchorPos(beg); extendSelection(end,SELECT_CHARS,TRUE); setCursorPos(end); makePositionVisible(beg); makePositionVisible(end); return 1; } } // Beep x:getApp()->beep(); return 1; } // Search for next occurence long FXText::onCmdSearchNext(FXObject*,FXSelector sel,void*){ if(!searchstring.empty()){ FXint pos=cursorpos; FXint beg[10]; FXint end[10]; if(FXSELID(sel)==ID_SEARCH_FORW){ if(isPosSelected(pos)) pos=selendpos; searchflags&=~SEARCH_BACKWARD; } else{ if(isPosSelected(pos)) pos=selstartpos-1; searchflags|=SEARCH_BACKWARD; } if(findText(searchstring,beg,end,pos,searchflags|SEARCH_WRAP,10)){ if(beg[0]!=selstartpos || end[0]!=selendpos){ setAnchorPos(beg[0]); extendSelection(end[0],SELECT_CHARS,TRUE); setCursorPos(end[0]); makePositionVisible(beg[0]); makePositionVisible(end[0]); return 1; } } } getApp()->beep(); return 1; } // Search text long FXText::onCmdSearch(FXObject*,FXSelector,void*){ FXGIFIcon icon(getApp(),searchicon); FXSearchDialog searchdialog(this,tr("Search"),&icon); FXint beg[10]; FXint end[10]; FXint pos; FXuint code; do{ code=searchdialog.execute(); if(code==FXSearchDialog::DONE) return 1; searchstring=searchdialog.getSearchText(); searchflags=searchdialog.getSearchMode(); pos=isPosSelected(cursorpos) ? (searchflags&SEARCH_BACKWARD) ? selstartpos-1 : selendpos : cursorpos; if(findText(searchstring,beg,end,pos,searchflags|SEARCH_WRAP,10)){ setAnchorPos(beg[0]); extendSelection(end[0],SELECT_CHARS,TRUE); setCursorPos(end[0],TRUE); makePositionVisible(beg[0]); makePositionVisible(end[0]); } else{ getApp()->beep(); } } while(code==FXSearchDialog::SEARCH_NEXT); return 1; } // Replace text; we assume that findText has called squeezegap()! long FXText::onCmdReplace(FXObject*,FXSelector,void*){ FXGIFIcon icon(getApp(),searchicon); FXReplaceDialog replacedialog(this,tr("Replace"),&icon); FXint beg[10],end[10],fm,to,len,pos; FXuint searchflags,code; FXString searchstring; FXString replacestring; FXString replacevalue; do{ code=replacedialog.execute(); if(code==FXReplaceDialog::DONE) return 1; searchflags=replacedialog.getSearchMode(); searchstring=replacedialog.getSearchText(); replacestring=replacedialog.getReplaceText(); replacevalue=FXString::null; fm=-1; to=-1; if(code==FXReplaceDialog::REPLACE_ALL){ searchflags&=~SEARCH_BACKWARD; pos=0; while(findText(searchstring,beg,end,pos,searchflags,10)){ if(0<=fm) replacevalue.append(&buffer[pos],beg[0]-pos); replacevalue.append(FXRex::substitute(buffer,length,beg,end,replacestring,10)); if(fm<0) fm=beg[0]; to=end[0]; pos=end[0]; if(beg[0]==end[0]) pos++; } } else{ pos=isPosSelected(cursorpos) ? (searchflags&SEARCH_BACKWARD) ? selstartpos-1 : selendpos : cursorpos; if(findText(searchstring,beg,end,pos,searchflags|SEARCH_WRAP,10)){ replacevalue=FXRex::substitute(buffer,length,beg,end,replacestring,10); fm=beg[0]; to=end[0]; } } if(0<=fm){ len=replacevalue.length(); replaceText(fm,to-fm,replacevalue.text(),len,TRUE); setCursorPos(fm+len,TRUE); makePositionVisible(getCursorPos()); modified=TRUE; } else{ getApp()->beep(); } } while(code==FXReplaceDialog::REPLACE_NEXT); return 1; } // Goto selected line number long FXText::onCmdGotoSelected(FXObject*,FXSelector,void*){ FXString string; if(getDNDData(FROM_SELECTION,stringType,string)){ FXint s=string.find_first_of("0123456789"); if(0<=s){ FXint row=0; while(Ascii::isDigit(string[s])){ row=row*10+Ascii::digitValue(string[s]); s++; } if(1<=row){ setCursorRow(row-1,TRUE); makePositionVisible(cursorpos); return 1; } } } getApp()->beep(); return 1; } // Goto line number long FXText::onCmdGotoLine(FXObject*,FXSelector,void*){ FXGIFIcon icon(getApp(),gotoicon); FXint row=cursorrow+1; if(FXInputDialog::getInteger(row,this,tr("Goto Line"),tr("&Goto line number:"),&icon,1,2147483647)){ update(); setCursorRow(row-1,TRUE); makePositionVisible(cursorpos); } return 1; } /*******************************************************************************/ // Editable toggle long FXText::onCmdToggleEditable(FXObject*,FXSelector,void*){ setEditable(!isEditable()); return 1; } // Update editable toggle long FXText::onUpdToggleEditable(FXObject* sender,FXSelector,void*){ sender->handle(this,isEditable()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // Overstrike toggle long FXText::onCmdToggleOverstrike(FXObject*,FXSelector,void*){ setOverstrike(!isOverstrike()); return 1; } // Update overstrike toggle long FXText::onUpdToggleOverstrike(FXObject* sender,FXSelector,void*){ sender->handle(this,isOverstrike()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // Move cursor to indicated row long FXText::onCmdCursorRow(FXObject* sender,FXSelector,void*){ FXint row=cursorrow+1; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&row); setCursorRow(row-1,TRUE); makePositionVisible(cursorpos); return 1; } // Being asked about current row number long FXText::onUpdCursorRow(FXObject* sender,FXSelector,void*){ FXint row=cursorrow+1; sender->handle(this,FXSEL(SEL_COMMAND,ID_SETINTVALUE),(void*)&row); return 1; } // Move cursor to indicated column long FXText::onCmdCursorColumn(FXObject* sender,FXSelector,void*){ FXint col=cursorcol; sender->handle(this,FXSEL(SEL_COMMAND,ID_GETINTVALUE),(void*)&col); setCursorColumn(col,TRUE); makePositionVisible(cursorpos); return 1; } // Being asked about current column long FXText::onUpdCursorColumn(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),(void*)&cursorcol); return 1; } // Update somebody who works on the selection long FXText::onUpdHaveSelection(FXObject* sender,FXSelector,void*){ sender->handle(this,(selstartposhandle(this,(length==0)?FXSEL(SEL_COMMAND,ID_DISABLE):FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } /*******************************************************************************/ // FIXME // Runs should preferably be whole combining sequence // Deal with non-rectangular selections. // Draw fragment of text in given style void FXText::drawBufferText(FXDCWindow& dc,FXint x,FXint y,FXint,FXint,FXint pos,FXint n,FXuint style) const { register FXuint index=(style&STYLE_MASK); register FXuint usedstyle=style; // Style flags from style buffer register FXColor color; FXchar str[2]; color=0; if(hilitestyles && index){ // Get colors from style table usedstyle=hilitestyles[index-1].style; // Style flags now from style table if(style&STYLE_SELECTED) color=hilitestyles[index-1].selectForeColor; else if(style&STYLE_HILITE) color=hilitestyles[index-1].hiliteForeColor; if(color==0) color=hilitestyles[index-1].normalForeColor; // Fall back on normal foreground color } if(color==0){ // Fall back to default style if(style&STYLE_SELECTED) color=seltextColor; else if(style&STYLE_HILITE) color=hilitetextColor; if(color==0) color=textColor; // Fall back to normal text color } dc.setForeground(color); if(style&STYLE_CONTROL){ y+=font->getFontAscent(); str[0]='^'; while(posgetTextWidth(str,2); pos++; n--; } while(0getTextWidth(str,2); pos++; n--; } } else{ y+=font->getFontAscent(); if(pos+n<=gapstart){ dc.drawText(x,y,&buffer[pos],n); if(usedstyle&STYLE_BOLD) dc.drawText(x+1,y,&buffer[pos],n); } else if(pos>=gapstart){ dc.drawText(x,y,&buffer[pos-gapstart+gapend],n); if(usedstyle&STYLE_BOLD) dc.drawText(x+1,y,&buffer[pos-gapstart+gapend],n); } else{ dc.drawText(x,y,&buffer[pos],gapstart-pos); if(usedstyle&STYLE_BOLD) dc.drawText(x+1,y,&buffer[pos],gapstart-pos); x+=font->getTextWidth(&buffer[pos],gapstart-pos); dc.drawText(x,y,&buffer[gapend],pos+n-gapstart); if(usedstyle&STYLE_BOLD) dc.drawText(x+1,y,&buffer[gapend],pos+n-gapstart); } } } // Fill fragment of background in given style void FXText::fillBufferRect(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h,FXuint style) const { register FXuint index=(style&STYLE_MASK); register FXuint usedstyle=style; // Style flags from style buffer register FXColor bgcolor,fgcolor; bgcolor=fgcolor=0; if(hilitestyles && index){ // Get colors from style table usedstyle=hilitestyles[index-1].style; // Style flags now from style table if(style&STYLE_SELECTED){ bgcolor=hilitestyles[index-1].selectBackColor; fgcolor=hilitestyles[index-1].selectForeColor; } else if(style&STYLE_HILITE){ bgcolor=hilitestyles[index-1].hiliteBackColor; fgcolor=hilitestyles[index-1].hiliteForeColor; } else if(style&STYLE_ACTIVE){ bgcolor=hilitestyles[index-1].activeBackColor; } else{ bgcolor=hilitestyles[index-1].normalBackColor; } if(fgcolor==0){ // Fall back to normal foreground color fgcolor=hilitestyles[index-1].normalForeColor; } } if(bgcolor==0){ // Fall back to default background colors if(style&STYLE_SELECTED) bgcolor=selbackColor; else if(style&STYLE_HILITE) bgcolor=hilitebackColor; else if(style&STYLE_ACTIVE) bgcolor=activebackColor; else bgcolor=backColor; } if(fgcolor==0){ // Fall back to default foreground colors if(style&STYLE_SELECTED) fgcolor=seltextColor; else if(style&STYLE_HILITE) fgcolor=hilitetextColor; if(fgcolor==0) fgcolor=textColor; // Fall back to text color } dc.setForeground(bgcolor); dc.fillRectangle(x,y,w,h); if(usedstyle&STYLE_UNDERLINE){ dc.setForeground(fgcolor); dc.fillRectangle(x,y+font->getFontAscent()+1,w,1); } if(usedstyle&STYLE_STRIKEOUT){ dc.setForeground(fgcolor); dc.fillRectangle(x,y+font->getFontAscent()/2,w,1); } } // Obtain text style at position pos; note pos may be outside of text // to allow for rectangular selections! FXuint FXText::style(FXint row,FXint,FXint end,FXint pos) const { register FXuint s=0; register FXchar ch; // Selected part of text if(selstartpos<=pos && pos=end) return s; // Special style for control characters ch=getByte(pos); // Get value from style buffer if(sbuffer) s|=getStyle(pos); // Tabs are just fill if(ch == '\t') return s; // Spaces are just fill if(ch == ' ') return s; // Newlines are just fill if(ch == '\n') return s; // Get special style for control codes if((FXuchar)ch < ' ') return s|STYLE_CONTROL|STYLE_TEXT; return s|STYLE_TEXT; } // Draw partial text line with correct style void FXText::drawTextRow(FXDCWindow& dc,FXint line,FXint left,FXint right) const { register FXint x,y,w,h,linebeg,lineend,truelineend,cw,sp,ep,row,edge; register FXuint curstyle,newstyle; linebeg=visrows[line]; lineend=truelineend=visrows[line+1]; if(linebeggetFontHeight(); y=pos_y+margintop+(toprow+line)*h; edge=pos_x+marginleft+barwidth; row=toprow+line; // Scan ahead till until we hit the end or the left edge for(sp=linebeg; sp=left) break; x+=cw; } // First style to display curstyle=style(row,linebeg,lineend,sp); // Draw until we hit the end or the right edge for(ep=sp; ep=right) break; w+=cw; } // Draw unfinished fragment fillBufferRect(dc,edge+x,y,w,h,curstyle); if(curstyle&STYLE_TEXT) drawBufferText(dc,edge+x,y,w,h,sp,ep-sp,curstyle); x+=w; // Fill any left-overs outside of text if(x+edgegetFontHeight(); yt=pos_y+margintop+cursorrow*fh; yb=yt+fh-1; // Cursor can overhang margins but not line number bar dc.setClipRectangle(barwidth,0,viewport_w-barwidth,viewport_h); // Draw I beam if(state&FLAG_CARET){ // Draw I-beam dc.setForeground(cursorColor); dc.fillRectangle(xx,yt,2,yb-yt); dc.fillRectangle(xx-2,yt,6,1); dc.fillRectangle(xx-2,yb,6,1); } // Erase I-beam else{ // Erase I-beam, plus the text immediately surrounding it dc.setForeground(backColor); dc.fillRectangle(xx-2,yt,6,yb-yt+1); // Clip the text to the margins AND the rectangle that was // just erased. We don't want to overdraw any existing // characters, because of ClearType. xlo=FXMAX(xx-2,marginleft+barwidth); xhi=FXMIN(xx+4,viewport_w-marginright); dc.setClipRectangle(xlo,margintop,xhi-xlo,viewport_h-margintop-marginbottom); // Restore text dc.setFont(font); drawTextRow(dc,cursorrow-toprow,xx-3,xx+4); } } } } flags^=FLAG_CARET; } } // Erase cursor overhang outside of margins void FXText::eraseCursorOverhang(){ register FXint xx,yt,yb,fh; FXASSERT(0<=cursorpos && cursorpos<=length); FXASSERT(0<=cursorrow && cursorrow<=nrows); if(toprow<=cursorrow && cursorrowgetFontHeight(); yt=pos_y+margintop+cursorrow*fh; yb=yt+fh-1; dc.setClipRectangle(barwidth,0,viewport_w-barwidth,viewport_h); if(xx-2<=marginleft+barwidth && barwidth<=xx+3){ dc.setForeground(backColor); dc.fillRectangle(barwidth,yt,marginleft,fh); } if(viewport_w-marginright<=xx+3 && xx-2<=viewport_w){ dc.setForeground(backColor); dc.fillRectangle(viewport_w-marginright,yt,marginright,fh); } if(yt<=margintop && 0<=yb){ dc.setForeground(backColor); dc.fillRectangle(xx-2,0,5,margintop); } if(viewport_h-marginbottom<=yb && ytgetFontHeight(); register FXint yy=pos_y+margintop+toprow*hh; register FXint tl=(y-yy)/hh; register FXint bl=(y+h-yy)/hh; register FXint ln; if(tl<0) tl=0; if(bl>=nvisrows) bl=nvisrows-1; for(ln=tl; ln<=bl; ln++){ drawTextRow(dc,ln,x,x+w); } } // Repaint line numbers void FXText::drawNumbers(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h) const { register FXint hh=font->getFontHeight(); register FXint yy=pos_y+margintop+toprow*hh; register FXint tl=(y-yy)/hh; register FXint bl=(y+h-yy)/hh; register FXint ln,n,tw; FXchar lineno[20]; if(tl<0) tl=0; if(bl>=nvisrows) bl=nvisrows-1; dc.setForeground(barColor); dc.fillRectangle(x,y,w,h); dc.setForeground(numberColor); for(ln=tl; ln<=bl; ln++){ n=sprintf(lineno,"%d",toprow+ln+1); tw=font->getTextWidth(lineno,n); dc.drawText(barwidth-tw,yy+ln*hh+font->getFontAscent(),lineno,n); } } // Repaint text range void FXText::updateRange(FXint beg,FXint end) const { register FXint tl,bl,fc,lc,ty,by,lx,rx,t; if(beg>end){t=beg;beg=end;end=t;} if(begvisrows[nvisrows]) end=visrows[nvisrows]; tl=posToLine(beg,0); bl=posToLine(end,tl); if(tl==bl){ fc=beg-visrows[tl]; lc=end-visrows[tl]; ty=pos_y+margintop+(toprow+tl)*font->getFontHeight(); by=ty+font->getFontHeight(); lx=pos_x+marginleft+barwidth+lineWidth(visrows[tl],fc); if(end<=(visrows[tl+1]-1)) rx=pos_x+marginleft+barwidth+lineWidth(visrows[tl],lc); else rx=width; } else{ ty=pos_y+margintop+(toprow+tl)*font->getFontHeight(); by=pos_y+margintop+(toprow+bl+1)*font->getFontHeight(); lx=barwidth; rx=width; } update(lx,ty,rx-lx,by-ty); } } // Draw item list long FXText::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXDCWindow dc(this,event); dc.setFont(font); //dc.setForeground(FXRGB(255,0,0)); //dc.fillRectangle(event->rect.x,event->rect.y,event->rect.w,event->rect.h); // Paint top margin if(event->rect.y<=margintop){ dc.setForeground(backColor); dc.fillRectangle(barwidth,0,viewport_w-barwidth,margintop); } // Paint bottom margin if(event->rect.y+event->rect.h>=viewport_h-marginbottom){ dc.setForeground(backColor); dc.fillRectangle(barwidth,viewport_h-marginbottom,viewport_w-barwidth,marginbottom); } // Paint left margin if(event->rect.xrect.x+event->rect.w>=viewport_w-marginright){ dc.setForeground(backColor); dc.fillRectangle(viewport_w-marginright,margintop,marginright,viewport_h-margintop-marginbottom); } // Paint line numbers if(event->rect.xrect.x,event->rect.y,event->rect.w,event->rect.h); } // Paint text dc.setClipRectangle(marginleft+barwidth,margintop,viewport_w-marginright-marginleft-barwidth,viewport_h-margintop-marginbottom); drawContents(dc,event->rect.x,event->rect.y,event->rect.w,event->rect.h); // FIXME make sure its drawn if we have focus drawCursor(flags); return 1; } /*******************************************************************************/ // Move the cursor void FXText::setCursorPos(FXint pos,FXbool notify){ register FXint cursorstartold,cursorendold; pos=validPos(pos); if(cursorpos!=pos){ drawCursor(0); if(postryHandle(this,FXSEL(SEL_CHANGED,message),(void*)(FXival)cursorpos); } } } // Set cursor row void FXText::setCursorRow(FXint row,FXbool notify){ register FXint col,newrow,newpos; if(row!=cursorrow){ if(row<0) row=0; if(row>=nrows) row=nrows-1; col=(0<=prefcol) ? prefcol : cursorcol; if(row>cursorrow){ newrow=nextRow(cursorpos,row-cursorrow); } else{ newrow=prevRow(cursorpos,cursorrow-row); } newpos=posFromIndent(newrow,col); setCursorPos(newpos,notify); prefcol=col; } } // Set cursor column void FXText::setCursorColumn(FXint col,FXbool notify){ register FXint newpos; if(cursorcol!=col){ newpos=posFromIndent(cursorstart,col); setCursorPos(newpos,notify); } } // Set anchor position void FXText::setAnchorPos(FXint pos){ anchorpos=validPos(pos); } // Select all text FXbool FXText::selectAll(FXbool notify){ return setSelection(0,length,notify); } // Extend selection FXbool FXText::extendSelection(FXint pos,FXTextSelectionMode select,FXbool notify){ register FXint sp,ep; // Validate position pos=validPos(pos); // Did position change? switch(select){ // Selecting words case SELECT_WORDS: if(pos<=anchorpos){ sp=wordStart(pos); ep=wordEnd(anchorpos); } else{ sp=wordStart(anchorpos); ep=wordEnd(pos); } break; // Selecting lines case SELECT_LINES: if(pos<=anchorpos){ sp=rowStart(pos); ep=nextRow(anchorpos); } else{ sp=rowStart(anchorpos); ep=nextRow(pos); } break; // Selecting characters default: if(pos<=anchorpos){ sp=pos; ep=anchorpos; } else{ sp=anchorpos; ep=pos; } break; } // Select the new range return setSelection(sp,ep-sp,notify); } // Set selection FXbool FXText::setSelection(FXint pos,FXint len,FXbool notify){ register FXint ep,sp; FXDragType types[4]; FXint what[2]; // Validate positions sp=validPos(pos); ep=validPos(pos+len); // Something changed? if(selstartpos!=sp || selendpos!=ep){ // Release selection if(sp==ep){ if(notify && target){ what[0]=selstartpos; what[1]=selendpos-selstartpos; target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)what); } if(hasSelection()) releaseSelection(); } // Minimally update if(ep<=selstartpos || selendpos<=sp){ updateRange(selstartpos,selendpos); updateRange(sp,ep); } else{ updateRange(sp,selstartpos); updateRange(selendpos,ep); } selstartpos=sp; selendpos=ep; // Acquire selection if(sp!=ep){ types[0]=stringType; types[1]=textType; types[2]=utf8Type; types[3]=utf16Type; if(!hasSelection()){ acquireSelection(types,4); } if(notify && target){ what[0]=selstartpos; what[1]=selendpos-selstartpos; target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)what); } } return TRUE; } return FALSE; } // Kill the selection FXbool FXText::killSelection(FXbool notify){ FXint what[2]; if(selstartpostryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)what); } if(hasSelection()) releaseSelection(); updateRange(selstartpos,selendpos); selstartpos=0; selendpos=0; return TRUE; } return FALSE; } // Set highlight FXbool FXText::setHighlight(FXint pos,FXint len){ register FXint hs,he; // Validate positions hs=validPos(pos); he=validPos(pos+len); // Anything changed? if(hs!=hilitestartpos || he!=hiliteendpos){ // Minimally update if(he<=hilitestartpos || hiliteendpos<=hs){ updateRange(hilitestartpos,hiliteendpos); updateRange(hs,he); } else{ updateRange(hs,hilitestartpos); updateRange(hiliteendpos,he); } // Keep new range hilitestartpos=hs; hiliteendpos=he; return TRUE; } return FALSE; } // Unhighlight the text FXbool FXText::killHighlight(){ if(hilitestartposgetTextWidth(" ",1); barwidth=barcolumns*font->getTextWidth("8",1); // if(options&TEXT_FIXEDWRAP){ wrapwidth=wrapcolumns*font->getTextWidth("x",1); } recalc(); update(); } } // Set wrap columns void FXText::setWrapColumns(FXint cols){ if(cols<=0) cols=1; if(cols!=wrapcolumns){ wrapcolumns=cols; // if(options&TEXT_FIXEDWRAP){ wrapwidth=wrapcolumns*font->getTextWidth("x",1); } recalc(); update(); } } // Set tab columns void FXText::setTabColumns(FXint cols){ if(cols<=0) cols=1; if(cols!=tabcolumns){ tabcolumns=cols; tabwidth=tabcolumns*font->getTextWidth(" ",1); recalc(); update(); } } // Change number of columns used for line numbers void FXText::setBarColumns(FXint cols){ if(cols<=0) cols=0; if(cols!=barcolumns){ barcolumns=cols; barwidth=barcolumns*font->getTextWidth("8",1); recalc(); update(); } } // Set text color void FXText::setTextColor(FXColor clr){ if(clr!=textColor){ textColor=clr; update(barwidth,0,width-barwidth,height); } } // Set select background color void FXText::setSelBackColor(FXColor clr){ if(clr!=selbackColor){ selbackColor=clr; updateRange(selstartpos,selendpos); } } // Set selected text color void FXText::setSelTextColor(FXColor clr){ if(clr!=seltextColor){ seltextColor=clr; updateRange(selstartpos,selendpos); } } // Change highlighted text color void FXText::setHiliteTextColor(FXColor clr){ if(clr!=hilitetextColor){ hilitetextColor=clr; updateRange(hilitestartpos,hiliteendpos); } } // Change highlighted background color void FXText::setHiliteBackColor(FXColor clr){ if(clr!=hilitebackColor){ hilitebackColor=clr; updateRange(hilitestartpos,hiliteendpos); } } // Change active background color void FXText::setActiveBackColor(FXColor clr){ if(clr!=activebackColor){ activebackColor=clr; update(barwidth,0,width-barwidth,height); } } // Change line number color void FXText::setNumberColor(FXColor clr){ if(clr!=numberColor){ numberColor=clr; update(0,0,barwidth,height); } } // Change bar color void FXText::setBarColor(FXColor clr){ if(clr!=barColor){ barColor=clr; update(0,0,barwidth,height); } } // Set cursor color void FXText::setCursorColor(FXColor clr){ if(clr!=cursorColor){ cursorColor=clr; updateRange(cursorstart,cursorend); } } // Change text style void FXText::setTextStyle(FXuint style){ FXuint opts=(options&~TEXT_MASK) | (style&TEXT_MASK); if(options!=opts){ options=opts; // if(options&TEXT_FIXEDWRAP){ wrapwidth=wrapcolumns*font->getTextWidth("x",1); } recalc(); update(); } } // Get text style FXuint FXText::getTextStyle() const { return (options&TEXT_MASK); } // Return true if editable FXbool FXText::isEditable() const { return (options&TEXT_READONLY)==0; } // Set widget is editable or not void FXText::setEditable(FXbool edit){ if(edit) options&=~TEXT_READONLY; else options|=TEXT_READONLY; } // Return TRUE if text is in overstrike mode FXbool FXText::isOverstrike() const { return (options&TEXT_OVERSTRIKE)!=0; } // Set overstrike mode void FXText::setOverstrike(FXbool over){ if(over) options|=TEXT_OVERSTRIKE; else options&=~TEXT_OVERSTRIKE; } // Set styled text mode void FXText::setStyled(FXbool styled){ if(styled && !sbuffer){ if(!FXCALLOC(&sbuffer,FXchar,length+gapend-gapstart)){fxerror("%s::setStyled: out of memory.\n",getClassName());} update(); } if(!styled && sbuffer){ FXFREE(&sbuffer); update(); } } // Set highlight styles void FXText::setHiliteStyles(const FXHiliteStyle* styles){ hilitestyles=styles; update(); } // Change number of visible rows void FXText::setVisibleRows(FXint rows){ if(rows<0) rows=0; if(vrows!=rows){ vrows=rows; recalc(); } } // Change number of visible columns void FXText::setVisibleColumns(FXint cols){ if(cols<0) cols=0; if(vcols!=cols){ vcols=cols; recalc(); } } /*******************************************************************************/ // Update value from a message long FXText::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setText(*((FXString*)ptr)); return 1; } // Obtain value from text long FXText::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ getText(*((FXString*)ptr)); return 1; } /*******************************************************************************/ // Save object to stream void FXText::save(FXStream& store) const { FXScrollArea::save(store); store << length; store.save(buffer,gapstart); store.save(buffer+gapend,length-gapstart); store << nvisrows; store.save(visrows,nvisrows+1); store << wrapcolumns; store << tabcolumns; store << margintop; store << marginbottom; store << marginleft; store << marginright; store << font; store << textColor; store << selbackColor; store << seltextColor; store << hilitebackColor; store << hilitetextColor; store << cursorColor; store << help; store << tip; store << matchtime; } // Load object from stream void FXText::load(FXStream& store){ FXScrollArea::load(store); store >> length; FXMALLOC(&buffer,FXchar,length+MINSIZE); // FIXME should we save text&style? store.load(buffer,length); gapstart=length; gapend=length+MINSIZE; store >> nvisrows; FXMALLOC(&visrows,FXint,nvisrows+1); store.load(visrows,nvisrows+1); store >> wrapcolumns; store >> tabcolumns; store >> margintop; store >> marginbottom; store >> marginleft; store >> marginright; store >> font; store >> textColor; store >> selbackColor; store >> seltextColor; store >> hilitebackColor; store >> hilitetextColor; store >> cursorColor; store >> help; store >> tip; store >> matchtime; } // Clean up FXText::~FXText(){ getApp()->removeTimeout(this,ID_BLINK); getApp()->removeTimeout(this,ID_FLASH); FXFREE(&buffer); FXFREE(&sbuffer); FXFREE(&visrows); buffer=(FXchar*)-1L; sbuffer=(FXchar*)-1L; visrows=(FXint*)-1L; font=(FXFont*)-1L; hilitestyles=(FXHiliteStyle*)-1L; } } fox1.6-1.6.57/src/FXTextCodec.cpp000066400000000000000000000306011326741342000162500ustar00rootroot00000000000000/******************************************************************************** * * * U n i c o d e T e x t C o d e c * * * ********************************************************************************* * Copyright (C) 2002,2006 by L.Johnson & J.van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTextCodec.cpp,v 1.43 2006/01/22 17:58:47 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXDict.h" #include "FXString.h" #include "FXTextCodec.h" /* Notes: - IANA defined mime names for character sets are found in: http://www.iana.org/assignments/character-sets. - Need API to count expected #characters needed for decode. - UTF-8 Encoding scheme: U-00000000 - U-0000007F 0xxxxxxx U-00000080 - U-000007FF 110xxxxx 10xxxxxx U-00000800 - U-0000FFFF 1110xxxx 10xxxxxx 10xxxxxx U-00010000 - U-001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx U-00200000 - U-03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx U-04000000 - U-7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx The last two cases shouldn't occur since all unicode is between 0 and 0x10FFFF. - Values to add: 0xFFFFD080 - 11111111 11111111 11010000 10000000 0xFFFE0080 - 11111111 11111110 00000000 10000000 0xFFC00080 - 11111111 11000000 00000000 10000000 0xF8000080 - 11111000 00000000 00000000 10000000 0x00000080 - 00000000 00000000 00000000 10000000 - UTF-16 Encoding scheme: W1 = 110110yy yyyyyyyy W2 = 110111xx xxxxxxxx Leading-surrogates or high-surrogates are from D800 to DBFF, and trailing-surrogates or low-surrogates are from DC00 to DFFF. - Unicode Transformation Formats information http://czyborra.com/utf. - The decoder should replace a malformed sequence with U+FFFD - See also: RFC 2279. - See RFC-1759 for printer MIB Enums. - 0x00000000 00000000 0x00003080 00110000 1000000 0x000E2080 00001110 00100000 10000000 0x03C82080 00111100 11001000 00100000 10000000 0xFA082080 11111010 00001000 00100000 10000000 0x82082080 10000010 00001000 00100000 10000000 - FIXME still unhappy with FXTextCodec's API's. Change in FOX 1.8. - Note also, representation (e.g. 8, 16, 32 bit) should be independent of encoding/decoding; need to be able to store ascii in wide characters. */ /*******************************************************************************/ namespace FX { // Base class is not instantiated FXIMPLEMENT_ABSTRACT(FXTextCodec,FXObject,NULL,0) /********* Helpers to convert between unicode transformation formats *********/ // Number of bytes for wide character static inline FXint utflen(FXwchar w){ return (w<0x80 ? 1 : (w<0x800 ? 2 : (w<0x10000 ? 3 : (w<0x200000 ? 4 : (w<0x4000000 ? 5 : 6))))); } // Convert utf8 to wide character FXint FXTextCodec::utf2wc(FXwchar& wc,const FXchar* src,FXint nsrc){ register FXwchar c; if(nsrc<1) return -1; wc=c=(FXuchar)src[0]; if(0x80<=c){ if(c<0xC0) return 0; if(nsrc<2) return -2; if((FXuchar)src[1]<0x80) return 0; if((FXuchar)src[1]>0xBF) return 0; wc=(wc<<6)^(FXuchar)src[1]^0x0003080; if(0xE0<=c){ if(nsrc<3) return -3; if((FXuchar)src[2]<0x80) return 0; if((FXuchar)src[2]>0xBF) return 0; wc=(wc<<6)^(FXuchar)src[2]^0x0020080; if(0xF0<=c){ if(nsrc<4) return -4; if((FXuchar)src[3]<0x80) return 0; if((FXuchar)src[3]>0xBF) return 0; wc=(wc<<6)^(FXuchar)src[3]^0x0400080; if(0xF8<=c){ if(nsrc<5) return -5; if((FXuchar)src[4]<0x80) return 0; if((FXuchar)src[4]>0xBF) return 0; wc=(wc<<6)^(FXuchar)src[4]^0x8000080; if(0xFC<=c){ if(nsrc<6) return -6; if((FXuchar)src[5]<0x80) return 0; if((FXuchar)src[5]>0xBF) return 0; wc=(wc<<6)^(FXuchar)src[5]^0x0000080; return 6; } return 5; } return 4; } return 3; } return 2; } return 1; } // Convert utf16 to wide character FXint FXTextCodec::utf2wc(FXwchar& wc,const FXnchar* src,FXint nsrc){ const FXint SURROGATE_OFFSET=0x10000-(0xD800<<10)-0xDC00; if(nsrc<1) return -1; wc=src[0]; if(0xD800<=wc && wc<0xDC00){ if(nsrc<2) return -2; if(src[1]<0xDC00 || 0xE000<=src[1]) return 0; wc=(wc<<10)+src[1]+SURROGATE_OFFSET; return 2; } return 1; } // Convert utf32 to wide character FXint FXTextCodec::utf2wc(FXwchar& wc,const FXwchar* src,FXint nsrc){ if(nsrc<1) return -1; wc=src[0]; return 1; } // Convert wide character to utf8 FXint FXTextCodec::wc2utf(FXchar* dst,FXint ndst,FXwchar wc){ if(ndst<1) return -1; if(wc>=0x80){ if(ndst<2) return -2; if(wc>=0x800){ if(ndst<3) return -3; if(wc>=0x10000){ if(ndst<4) return -4; if(wc>=0x200000){ if(ndst<5) return -5; if(wc>=0x4000000){ if(ndst<6) return -6; dst[0]=(wc>>30)|0xFC; dst[1]=((wc>>24)&0X3F)|0x80; dst[2]=((wc>>18)&0X3F)|0x80; dst[3]=((wc>>12)&0X3F)|0x80; dst[4]=((wc>>6)&0X3F)|0x80; dst[5]=(wc&0X3F)|0x80; return 6; } dst[0]=(wc>>24)|0xF8; dst[1]=((wc>>18)&0x3F)|0x80; dst[2]=((wc>>12)&0x3F)|0x80; dst[3]=((wc>>6)&0x3F)|0x80; dst[4]=(wc&0x3F)|0x80; return 5; } dst[0]=(wc>>18)|0xF0; dst[1]=((wc>>12)&0x3F)|0x80; dst[2]=((wc>>6)&0x3F)|0x80; dst[3]=(wc&0x3F)|0x80; return 4; } dst[0]=(wc>>12)|0xE0; dst[1]=((wc>>6)&0x3F)|0x80; dst[2]=(wc&0x3F)|0x80; return 3; } dst[0]=(wc>>6)|0xC0; dst[1]=(wc&0x3F)|0x80; return 2; } dst[0]=wc; return 1; } // Convert wide character to utf16 FXint FXTextCodec::wc2utf(FXnchar* dst,FXint ndst,FXwchar wc){ const FXint LEAD_OFFSET=0xD800-(0x10000>>10); if(ndst<1) return -1; dst[0]=wc; if(0xFFFF>10)+LEAD_OFFSET; dst[1]=(wc&0x3FF)+0xDC00; return 2; } return 1; } // Convert wide character to utf32 FXint FXTextCodec::wc2utf(FXwchar* dst,FXint ndst,FXwchar wc){ if(ndst<1) return -1; dst[0]=wc; return 1; } /********* Convert arrays of characters from multi-byte to unicode ***********/ // Convert multi-byte characters from src to single wide character FXint FXTextCodec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { return utf2wc(wc,src,nsrc); } // Count number of utf8 characters needed to convert multi-byte characters from src FXint FXTextCodec::mb2utflen(const FXchar* src,FXint nsrc) const { register FXint nr,len=0; FXwchar w; if(src && 00){ FXString result; result.length(len); if(mb2utf(&result[0],len,src,nsrc)>0){ return result; } } } return FXString::null; } // Convert multi-byte characters from src to utf8 string FXString FXTextCodec::mb2utf(const FXchar* src) const { return mb2utf(src,strlen(src)); } // Convert multi-byte string to utf8 string FXString FXTextCodec::mb2utf(const FXString& src) const { return mb2utf(src.text(),src.length()); } /********* Convert arrays of characters from unicode to multi-byte ***********/ // Convert single wide character to multi-byte characters at dst FXint FXTextCodec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { return wc2utf(dst,ndst,wc); } // Count multi-byte characters characters needed to convert utf8 from src FXint FXTextCodec::utf2mblen(const FXchar* src,FXint nsrc) const { register FXint nr,len=0; FXchar buffer[64]; FXwchar w; if(src && 00){ FXString result; result.length(len); if(utf2mb(&result[0],len,src,nsrc)>0){ return result; } } } return FXString::null; } // Convert utf8 characters at src to multi-byte string FXString FXTextCodec::utf2mb(const FXchar* src) const { return utf2mb(src,strlen(src)); } // Convert utf8 string to multi-byte string FXString FXTextCodec::utf2mb(const FXString& src) const { return utf2mb(src.text(),src.length()); } } fox1.6-1.6.57/src/FXTextField.cpp000066400000000000000000001711331326741342000162640ustar00rootroot00000000000000/******************************************************************************** * * * T e x t F i e l d O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTextField.cpp,v 1.171.2.3 2008/09/22 20:46:59 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "fxascii.h" #include "fxunicode.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXCursor.h" #include "FXTextField.h" #include "FX88591Codec.h" #include "FXCP1252Codec.h" #include "FXUTF16Codec.h" #include "FXComposeContext.h" /* Notes: - TextField passes string ptr in the SEL_COMMAND callback. - Double-click should select word, triple click all of text field. - TextField should return 0 for all unhandled keys! - Pressing mouse button will set the focus w/o claiming selection! - Change of cursor only implies makePositionVisible() if done by user. - Input verify and input verify callback operation: 1) The input is tested to see if it qualifies as an integer or real number. 2) The target is allowed to raise an objection: if a target does NOT handle the message, or handles the message and returns 0, then the new input is accepted. 3) If none of the above applies the input is simply accepted; this is the default mode for generic text type-in. Note that the target callback is called AFTER already having verified that the entry is a number, so a target can simply assume that this has been checked already and just perform additional checks [e.g. numeric range]. Also note that verify callbacks should allow for partially complete inputs, and that these inputs could be built up a character at a time, and in no particular order. - Option to grow/shrink textfield to fit text. - Perhaps need selstartpos,selendpos member variables to keep track of selection. - Maybe also send SEL_SELECTED, SEL_DESELECTED? - Need block cursor when in overstrike mode. */ #define JUSTIFY_MASK (JUSTIFY_HZ_APART|JUSTIFY_VT_APART) #define TEXTFIELD_MASK (TEXTFIELD_PASSWD|TEXTFIELD_INTEGER|TEXTFIELD_REAL|TEXTFIELD_READONLY|TEXTFIELD_ENTER_ONLY|TEXTFIELD_LIMITED|TEXTFIELD_OVERSTRIKE|TEXTFIELD_AUTOHIDE|TEXTFIELD_AUTOGRAY) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXTextField) FXTextFieldMap[]={ FXMAPFUNC(SEL_PAINT,0,FXTextField::onPaint), FXMAPFUNC(SEL_UPDATE,0,FXTextField::onUpdate), FXMAPFUNC(SEL_MOTION,0,FXTextField::onMotion), FXMAPFUNC(SEL_TIMEOUT,FXTextField::ID_BLINK,FXTextField::onBlink), FXMAPFUNC(SEL_TIMEOUT,FXTextField::ID_AUTOSCROLL,FXTextField::onAutoScroll), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXTextField::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXTextField::onLeftBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXTextField::onMiddleBtnPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXTextField::onMiddleBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXTextField::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXTextField::onKeyRelease), FXMAPFUNC(SEL_VERIFY,0,FXTextField::onVerify), FXMAPFUNC(SEL_SELECTION_LOST,0,FXTextField::onSelectionLost), FXMAPFUNC(SEL_SELECTION_GAINED,0,FXTextField::onSelectionGained), FXMAPFUNC(SEL_SELECTION_REQUEST,0,FXTextField::onSelectionRequest), FXMAPFUNC(SEL_CLIPBOARD_LOST,0,FXTextField::onClipboardLost), FXMAPFUNC(SEL_CLIPBOARD_GAINED,0,FXTextField::onClipboardGained), FXMAPFUNC(SEL_CLIPBOARD_REQUEST,0,FXTextField::onClipboardRequest), FXMAPFUNC(SEL_FOCUSIN,0,FXTextField::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXTextField::onFocusOut), FXMAPFUNC(SEL_FOCUS_SELF,0,FXTextField::onFocusSelf), FXMAPFUNC(SEL_QUERY_TIP,0,FXTextField::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXTextField::onQueryHelp), FXMAPFUNC(SEL_UPDATE,FXTextField::ID_TOGGLE_EDITABLE,FXTextField::onUpdToggleEditable), FXMAPFUNC(SEL_UPDATE,FXTextField::ID_TOGGLE_OVERSTRIKE,FXTextField::onUpdToggleOverstrike), FXMAPFUNC(SEL_UPDATE,FXTextField::ID_CUT_SEL,FXTextField::onUpdHaveSelection), FXMAPFUNC(SEL_UPDATE,FXTextField::ID_COPY_SEL,FXTextField::onUpdHaveSelection), FXMAPFUNC(SEL_UPDATE,FXTextField::ID_PASTE_SEL,FXTextField::onUpdYes), FXMAPFUNC(SEL_UPDATE,FXTextField::ID_DELETE_SEL,FXTextField::onUpdHaveSelection), FXMAPFUNC(SEL_UPDATE,FXTextField::ID_SELECT_ALL,FXTextField::onUpdSelectAll), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETVALUE,FXTextField::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETINTVALUE,FXTextField::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETREALVALUE,FXTextField::onCmdSetRealValue), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETSTRINGVALUE,FXTextField::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_GETINTVALUE,FXTextField::onCmdGetIntValue), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_GETREALVALUE,FXTextField::onCmdGetRealValue), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_GETSTRINGVALUE,FXTextField::onCmdGetStringValue), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_HOME,FXTextField::onCmdCursorHome), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_END,FXTextField::onCmdCursorEnd), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_RIGHT,FXTextField::onCmdCursorRight), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_LEFT,FXTextField::onCmdCursorLeft), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_WORD_LEFT,FXTextField::onCmdCursorWordLeft), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_WORD_RIGHT,FXTextField::onCmdCursorWordRight), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_WORD_START,FXTextField::onCmdCursorWordStart), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CURSOR_WORD_END,FXTextField::onCmdCursorWordEnd), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_MARK,FXTextField::onCmdMark), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_EXTEND,FXTextField::onCmdExtend), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SELECT_ALL,FXTextField::onCmdSelectAll), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_DESELECT_ALL,FXTextField::onCmdDeselectAll), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_CUT_SEL,FXTextField::onCmdCutSel), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_COPY_SEL,FXTextField::onCmdCopySel), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_PASTE_SEL,FXTextField::onCmdPasteSel), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_PASTE_MIDDLE,FXTextField::onCmdPasteMiddle), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_DELETE_SEL,FXTextField::onCmdDeleteSel), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_DELETE_ALL,FXTextField::onCmdDeleteAll), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_OVERST_STRING,FXTextField::onCmdOverstString), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_INSERT_STRING,FXTextField::onCmdInsertString), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_BACKSPACE,FXTextField::onCmdBackspace), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_DELETE,FXTextField::onCmdDelete), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_TOGGLE_EDITABLE,FXTextField::onCmdToggleEditable), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_TOGGLE_OVERSTRIKE,FXTextField::onCmdToggleOverstrike), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETHELPSTRING,FXTextField::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_GETHELPSTRING,FXTextField::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_SETTIPSTRING,FXTextField::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXTextField::ID_GETTIPSTRING,FXTextField::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXTextField,FXFrame,FXTextFieldMap,ARRAYNUMBER(FXTextFieldMap)) // Delimiters const FXchar FXTextField::textDelimiters[]="~.,/\\`'!@#$%^&*()-=+{}|[]\":;<>?"; /*******************************************************************************/ // For serialization FXTextField::FXTextField(){ flags|=FLAG_ENABLED; delimiters=textDelimiters; font=(FXFont*)-1L; textColor=0; selbackColor=0; seltextColor=0; cursorColor=0; cursor=0; anchor=0; columns=0; shift=0; } // Construct and init FXTextField::FXTextField(FXComposite* p,FXint ncols,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXFrame(p,opts,x,y,w,h,pl,pr,pt,pb){ if(ncols<0) ncols=0; flags|=FLAG_ENABLED; target=tgt; message=sel; if(!(options&JUSTIFY_RIGHT)) options|=JUSTIFY_LEFT; defaultCursor=getApp()->getDefaultCursor(DEF_TEXT_CURSOR); dragCursor=getApp()->getDefaultCursor(DEF_TEXT_CURSOR); delimiters=textDelimiters; font=getApp()->getNormalFont(); backColor=getApp()->getBackColor(); textColor=getApp()->getForeColor(); selbackColor=getApp()->getSelbackColor(); seltextColor=getApp()->getSelforeColor(); cursorColor=getApp()->getForeColor(); cursor=0; anchor=0; columns=ncols; shift=0; } // Create X window void FXTextField::create(){ FXFrame::create(); if(!textType){ textType=getApp()->registerDragType(textTypeName); } if(!utf8Type){ utf8Type=getApp()->registerDragType(utf8TypeName); } if(!utf16Type){ utf16Type=getApp()->registerDragType(utf16TypeName); } font->create(); } // Change the font void FXTextField::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Enable the window void FXTextField::enable(){ if(!(flags&FLAG_ENABLED)){ FXFrame::enable(); update(); } } // Disable the window void FXTextField::disable(){ if(flags&FLAG_ENABLED){ FXFrame::disable(); update(); } } // Get default width FXint FXTextField::getDefaultWidth(){ return padleft+padright+(border<<1)+columns*font->getTextWidth("8",1); } // Get default height FXint FXTextField::getDefaultHeight(){ return padtop+padbottom+(border<<1)+font->getFontHeight(); } // Implement auto-hide or auto-gray modes long FXTextField::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ if(!FXFrame::onUpdate(sender,sel,ptr)){ if(options&TEXTFIELD_AUTOHIDE){if(shown()){hide();recalc();}} if(options&TEXTFIELD_AUTOGRAY){disable();} } return 1; } // We now really do have the selection; repaint the text field long FXTextField::onSelectionGained(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onSelectionGained(sender,sel,ptr); update(); return 1; } // We lost the selection somehow; repaint the text field long FXTextField::onSelectionLost(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onSelectionLost(sender,sel,ptr); update(); return 1; } // Somebody wants our selection; the text field will furnish it if the target doesn't long FXTextField::onSelectionRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXString string; FXuint start; FXuint len; // Make sure FXASSERT(0<=anchor && anchor<=contents.length()); FXASSERT(0<=cursor && cursor<=contents.length()); // Perhaps the target wants to supply its own data for the selection if(FXFrame::onSelectionRequest(sender,sel,ptr)) return 1; // Recognize the request? if(event->target==stringType || event->target==textType || event->target==utf8Type || event->target==utf16Type){ // Figure selected bytes if(anchortarget==utf8Type){ FXTRACE((100,"Request UTF8\n")); setDNDData(FROM_SELECTION,event->target,string); return 1; } // Return text of the selection translated to 8859-1 if(event->target==stringType || event->target==textType){ FX88591Codec ascii; FXTRACE((100,"Request ASCII\n")); setDNDData(FROM_SELECTION,event->target,ascii.utf2mb(string)); return 1; } // Return text of the selection translated to UTF-16 if(event->target==utf16Type){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Request UTF16\n")); setDNDData(FROM_SELECTION,event->target,unicode.utf2mb(string)); return 1; } } return 0; } // We now really do have the clipboard, keep clipped text long FXTextField::onClipboardGained(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onClipboardGained(sender,sel,ptr); return 1; } // We lost the clipboard, free clipped text long FXTextField::onClipboardLost(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onClipboardLost(sender,sel,ptr); clipped.clear(); return 1; } // Somebody wants our clipped text long FXTextField::onClipboardRequest(FXObject* sender,FXSelector sel,void* ptr){ FXEvent *event=(FXEvent*)ptr; FXString string; // Perhaps the target wants to supply its own data for the clipboard if(FXFrame::onClipboardRequest(sender,sel,ptr)) return 1; // Recognize the request? if(event->target==stringType || event->target==textType || event->target==utf8Type || event->target==utf16Type){ // Get clipped string string=clipped; // If password mode, replace by stars if(options&TEXTFIELD_PASSWD) string.assign('*',string.count()); // Return clipped text as as UTF-8 if(event->target==utf8Type){ FXTRACE((100,"Request UTF8\n")); setDNDData(FROM_CLIPBOARD,event->target,string); return 1; } // Return clipped text translated to 8859-1 if(event->target==stringType || event->target==textType){ FX88591Codec ascii; FXTRACE((100,"Request ASCII\n")); setDNDData(FROM_CLIPBOARD,event->target,ascii.utf2mb(string)); return 1; } // Return text of the selection translated to UTF-16 if(event->target==utf16Type){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Request UTF16\n")); setDNDData(FROM_CLIPBOARD,event->target,unicode.utf2mb(string)); return 1; } } return 0; } // Blink the cursor long FXTextField::onBlink(FXObject*,FXSelector,void*){ drawCursor(flags^FLAG_CARET); getApp()->addTimeout(this,ID_BLINK,getApp()->getBlinkSpeed()); return 0; } // Gained focus long FXTextField::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onFocusIn(sender,sel,ptr); if(isEditable()){ getApp()->addTimeout(this,ID_BLINK,getApp()->getBlinkSpeed()); drawCursor(FLAG_CARET); } if(hasSelection()){ update(border,border,width-(border<<1),height-(border<<1)); } return 1; } // Lost focus long FXTextField::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onFocusOut(sender,sel,ptr); getApp()->removeTimeout(this,ID_BLINK); drawCursor(0); if(hasSelection()){ update(border,border,width-(border<<1),height-(border<<1)); } return 1; } // Focus on widget itself long FXTextField::onFocusSelf(FXObject* sender,FXSelector sel,void* ptr){ if(FXFrame::onFocusSelf(sender,sel,ptr)){ FXEvent *event=(FXEvent*)ptr; if(event->type==SEL_KEYPRESS || event->type==SEL_KEYRELEASE){ handle(this,FXSEL(SEL_COMMAND,ID_SELECT_ALL),NULL); } return 1; } return 0; } // If window can have focus bool FXTextField::canFocus() const { return true; } // Into focus chain void FXTextField::setFocus(){ FXFrame::setFocus(); setDefault(TRUE); flags&=~FLAG_UPDATE; if(getApp()->hasInputMethod()){ createComposeContext(); } } // Out of focus chain void FXTextField::killFocus(){ FXFrame::killFocus(); setDefault(MAYBE); flags|=FLAG_UPDATE; if(flags&FLAG_CHANGED){ flags&=~FLAG_CHANGED; if(!(options&TEXTFIELD_ENTER_ONLY)){ if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)contents.text()); } } if(getApp()->hasInputMethod()){ destroyComposeContext(); } } // Set help using a message long FXTextField::onCmdSetHelp(FXObject*,FXSelector,void* ptr){ setHelpText(*((FXString*)ptr)); return 1; } // Get help using a message long FXTextField::onCmdGetHelp(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getHelpText(); return 1; } // Set tip using a message long FXTextField::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXTextField::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // We were asked about tip text long FXTextField::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // We were asked about status text long FXTextField::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if((flags&FLAG_HELP) && !help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Update value from a message long FXTextField::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setText((const FXchar*)ptr); return 1; } // Update value from a message long FXTextField::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setText(FXStringVal(*((FXint*)ptr))); return 1; } // Update value from a message long FXTextField::onCmdSetRealValue(FXObject*,FXSelector,void* ptr){ setText(FXStringVal(*((FXdouble*)ptr))); return 1; } // Update value from a message long FXTextField::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setText(*((FXString*)ptr)); return 1; } // Obtain value from text field long FXTextField::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=FXIntVal(contents); return 1; } // Obtain value from text field long FXTextField::onCmdGetRealValue(FXObject*,FXSelector,void* ptr){ *((FXdouble*)ptr)=FXDoubleVal(contents); return 1; } // Obtain value from text field long FXTextField::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getText(); return 1; } // Pressed left button long FXTextField::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; if(ev->click_count==1){ setCursorPos(index(ev->win_x)); if(ev->state&SHIFTMASK){ extendSelection(cursor); } else{ killSelection(); setAnchorPos(cursor); } makePositionVisible(cursor); flags|=FLAG_PRESSED; } else{ setAnchorPos(0); setCursorPos(contents.length()); extendSelection(contents.length()); makePositionVisible(cursor); } return 1; } return 0; } // Released left button long FXTextField::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); flags&=~FLAG_PRESSED; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // Pressed middle button to paste long FXTextField::onMiddleBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* ev=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONPRESS,message),ptr)) return 1; setCursorPos(index(ev->win_x)); setAnchorPos(cursor); makePositionVisible(cursor); update(border,border,width-(border<<1),height-(border<<1)); flags&=~FLAG_UPDATE; return 1; } return 0; } // Released middle button causes paste of selection long FXTextField::onMiddleBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONRELEASE,message),ptr)) return 1; handle(this,FXSEL(SEL_COMMAND,ID_PASTE_MIDDLE),NULL); } return 0; } // Moved long FXTextField::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXint t; if(flags&FLAG_PRESSED){ if(event->win_x<(border+padleft) || (width-border-padright)win_x){ if(!getApp()->hasTimeout(this,ID_AUTOSCROLL)){ getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); } } else{ getApp()->removeTimeout(this,ID_AUTOSCROLL); t=index(event->win_x); if(t!=cursor){ drawCursor(0); cursor=t; extendSelection(cursor); } } return 1; } return 0; } // Automatic scroll long FXTextField::onAutoScroll(FXObject*,FXSelector,void* ptr){ register FXEvent* event=(FXEvent*)ptr; if(flags&FLAG_PRESSED){ register FXint newcursor=cursor; register FXint ll=border+padleft; register FXint rr=width-border-padright; register FXint ww=rr-ll; register FXint tw; if(options&TEXTFIELD_PASSWD) tw=font->getTextWidth("*",1)*contents.count(); else tw=font->getTextWidth(contents.text(),contents.length()); // Text right-aligned if(options&JUSTIFY_RIGHT){ // Scroll left if(event->win_xww){ shift+=ll-event->win_x; if(ww>tw-shift) shift=tw-ww; else getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); } newcursor=index(ll); } // Scroll right if(rrwin_x){ if(tw>ww){ shift+=rr-event->win_x; if(shift<=0) shift=0; else getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); } newcursor=index(rr); } } // Text left-aligned else if(options&JUSTIFY_LEFT){ // Scroll left if(event->win_xww){ shift+=ll-event->win_x; if(shift>=0) shift=0; else getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); } newcursor=index(ll); } // Scroll right if(rrwin_x){ if(tw>ww){ shift+=rr-event->win_x; if(shift+twaddTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); } newcursor=index(rr); } } // Text centered else{ // Scroll left if(event->win_xww){ shift+=ll-event->win_x; if(shift>tw/2-ww/2) shift=tw/2-ww/2; else getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); } newcursor=index(ll); } // Scroll right if(rrwin_x){ if(tw>ww){ shift+=rr-event->win_x; if(shift<(ww-ww/2)-tw/2) shift=(ww-ww/2)-tw/2; else getApp()->addTimeout(this,ID_AUTOSCROLL,getApp()->getScrollSpeed(),event); } newcursor=index(rr); } } // Extend the selection if(newcursor!=cursor){ drawCursor(0); cursor=newcursor; extendSelection(cursor); } } return 1; } // Overstrike toggle long FXTextField::onCmdToggleOverstrike(FXObject*,FXSelector,void*){ setOverstrike(!isOverstrike()); return 1; } // Update overstrike toggle long FXTextField::onUpdToggleOverstrike(FXObject* sender,FXSelector,void*){ sender->handle(this,isOverstrike()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // Editable toggle long FXTextField::onCmdToggleEditable(FXObject*,FXSelector,void*){ setEditable(!isEditable()); return 1; } // Update editable toggle long FXTextField::onUpdToggleEditable(FXObject* sender,FXSelector,void*){ sender->handle(this,isEditable()?FXSEL(SEL_COMMAND,ID_CHECK):FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // Update somebody who works on the selection long FXTextField::onUpdHaveSelection(FXObject* sender,FXSelector,void* ptr){ sender->handle(this,hasSelection()?FXSEL(SEL_COMMAND,ID_ENABLE):FXSEL(SEL_COMMAND,ID_DISABLE),ptr); return 1; } // Update somebody who works on the selection long FXTextField::onUpdSelectAll(FXObject* sender,FXSelector,void* ptr){ sender->handle(this,contents.empty()?FXSEL(SEL_COMMAND,ID_DISABLE):FXSEL(SEL_COMMAND,ID_ENABLE),ptr); return 1; } // Move the cursor to new valid position void FXTextField::setCursorPos(FXint pos){ pos=contents.validate(FXCLAMP(0,pos,contents.length())); if(cursor!=pos){ drawCursor(0); cursor=pos; if(isEditable() && hasFocus()) drawCursor(FLAG_CARET); } } // Set anchor position to valid position void FXTextField::setAnchorPos(FXint pos){ anchor=contents.validate(FXCLAMP(0,pos,contents.length())); } // Draw the cursor; need to draw 2 characters around the cursor // due to possible overhanging in certain fonts. Also, need to // completely erase and redraw because of ClearType. // Kudos to Bill Baxter for help with this code. void FXTextField::drawCursor(FXuint state){ FXint cl,ch,xx,xlo,xhi; if((state^flags)&FLAG_CARET){ if(xid){ FXDCWindow dc(this); FXASSERT(0<=cursor && cursor<=contents.length()); FXASSERT(0<=anchor && anchor<=contents.length()); xx=coord(cursor)-1; // Clip rectangle around cursor xlo=FXMAX(xx-2,border); xhi=FXMIN(xx+3,width-border); // Cursor can overhang padding but not borders dc.setClipRectangle(xlo,border,xhi-xlo,height-(border<<1)); // Draw I beam if(state&FLAG_CARET){ // Draw I-beam dc.setForeground(cursorColor); dc.fillRectangle(xx,padtop+border,1,height-padbottom-padtop-(border<<1)); dc.fillRectangle(xx-2,padtop+border,5,1); dc.fillRectangle(xx-2,height-border-padbottom-1,5,1); } // Erase I-beam else{ // Erase I-beam, plus the text immediately surrounding it dc.setForeground(backColor); dc.fillRectangle(xx-2,border,5,height-(border<<1)); // Draw two characters before and after cursor cl=ch=cursor; if(0getTextWidth("*",1)*contents.count(); else tw=font->getTextWidth(contents.text(),contents.length()); // Constrain shift if(options&JUSTIFY_RIGHT){ if(ww>=tw) shift=0; else if(shift<0) shift=0; else if(shift>tw-ww) shift=tw-ww; } else if(options&JUSTIFY_LEFT){ if(ww>=tw) shift=0; else if(shift>0) shift=0; else if(shift=tw) shift=0; else if(shift>tw/2-ww/2) shift=tw/2-ww/2; else if(shift<(ww-ww/2)-tw/2) shift=(ww-ww/2)-tw/2; } // Keep cursor in the picture if resizing field makePositionVisible(cursor); // Always redraw update(); flags&=~FLAG_DIRTY; } // Force position to become fully visible; we assume layout is correct void FXTextField::makePositionVisible(FXint pos){ register FXint rr=width-border-padright; register FXint ll=border+padleft; register FXint ww=rr-ll; register FXint oldshift=shift; register FXint xx; if(!xid) return; pos=contents.validate(FXCLAMP(0,pos,contents.length())); if(options&JUSTIFY_RIGHT){ if(options&TEXTFIELD_PASSWD) xx=font->getTextWidth("*",1)*contents.count(pos,contents.length()); else xx=font->getTextWidth(&contents[pos],contents.length()-pos); if(shift-xx>0) shift=xx; else if(shift-xx<-ww) shift=xx-ww; } else if(options&JUSTIFY_LEFT){ if(options&TEXTFIELD_PASSWD) xx=font->getTextWidth("*",1)*contents.index(pos); else xx=font->getTextWidth(contents.text(),pos); if(shift+xx<0) shift=-xx; else if(shift+xx>=ww) shift=ww-xx; } else{ if(options&TEXTFIELD_PASSWD) xx=font->getTextWidth("*",1)*contents.index(pos)-(font->getTextWidth("*",1)*contents.count())/2; else xx=font->getTextWidth(contents.text(),pos)-font->getTextWidth(contents.text(),contents.length())/2; if(shift+ww/2+xx<0) shift=-ww/2-xx; else if(shift+ww/2+xx>=ww) shift=ww-ww/2-xx; } if(shift!=oldshift){ update(border,border,width-(border<<1),height-(border<<1)); } } // Find index from coord FXint FXTextField::index(FXint x) const { register FXint rr=width-border-padright; register FXint ll=border+padleft; register FXint mm=(ll+rr)/2; register FXint pos,xx,cw; if(options&TEXTFIELD_PASSWD){ cw=font->getTextWidth("*",1); if(options&JUSTIFY_RIGHT) xx=rr-cw*contents.count(); else if(options&JUSTIFY_LEFT) xx=ll; else xx=mm-(cw*contents.count())/2; xx+=shift; pos=contents.offset((x-xx+(cw>>1))/cw); } else{ if(options&JUSTIFY_RIGHT) xx=rr-font->getTextWidth(contents.text(),contents.length()); else if(options&JUSTIFY_LEFT) xx=ll; else xx=mm-font->getTextWidth(contents.text(),contents.length())/2; xx+=shift; for(pos=0; posgetTextWidth(&contents[pos],contents.extent(pos)); if(x<(xx+(cw>>1))) break; xx+=cw; } } if(pos<0) pos=0; if(pos>contents.length()) pos=contents.length(); return pos; } // Find coordinate from index FXint FXTextField::coord(FXint i) const { register FXint rr=width-border-padright; register FXint ll=border+padleft; register FXint mm=(ll+rr)/2; register FXint pos; FXASSERT(0<=i && i<=contents.length()); if(options&JUSTIFY_RIGHT){ if(options&TEXTFIELD_PASSWD){ pos=rr-font->getTextWidth("*",1)*(contents.count()-contents.index(i)); } else{ pos=rr-font->getTextWidth(&contents[i],contents.length()-i); } } else if(options&JUSTIFY_LEFT){ if(options&TEXTFIELD_PASSWD){ pos=ll+font->getTextWidth("*",1)*contents.index(i); } else{ pos=ll+font->getTextWidth(contents.text(),i); } } else{ if(options&TEXTFIELD_PASSWD){ pos=mm+font->getTextWidth("*",1)*contents.index(i)-(font->getTextWidth("*",1)*contents.count())/2; } else{ pos=mm+font->getTextWidth(contents.text(),i)-font->getTextWidth(contents.text(),contents.length())/2; } } return pos+shift; } // Return TRUE if position is visible FXbool FXTextField::isPosVisible(FXint pos) const { if(0<=pos && pos<=contents.length()){ register FXint x=coord(contents.validate(pos)); return border+padleft<=x && x<=width-border-padright; } return FALSE; } // Return TRUE if position pos is selected FXbool FXTextField::isPosSelected(FXint pos) const { return hasSelection() && FXMIN(anchor,cursor)<=pos && pos<=FXMAX(anchor,cursor); } // Draw text fragment void FXTextField::drawTextFragment(FXDCWindow& dc,FXint x,FXint y,FXint fm,FXint to){ x+=font->getTextWidth(contents.text(),fm); y+=font->getFontAscent(); dc.drawText(x,y,&contents[fm],to-fm); } // Draw text fragment in password mode void FXTextField::drawPWDTextFragment(FXDCWindow& dc,FXint x,FXint y,FXint fm,FXint to){ register FXint cw=font->getTextWidth("*",1); register FXint i; y+=font->getFontAscent(); x+=cw*contents.index(fm); for(i=fm; igetFontHeight(); // Text sticks to top of field if(options&JUSTIFY_TOP){ yy=padtop+border; } // Text sticks to bottom of field else if(options&JUSTIFY_BOTTOM){ yy=height-padbottom-border-hh; } // Text centered in y else{ yy=border+padtop+(height-padbottom-padtop-(border<<1)-hh)/2; } if(anchorgetTextWidth("*",1); ww=cw*contents.count(); // Text sticks to right of field if(options&JUSTIFY_RIGHT){ xx=shift+rr-ww; } // Text sticks on left of field else if(options&JUSTIFY_LEFT){ xx=shift+ll; } // Text centered in field else{ xx=shift+mm-ww/2; } // Reduce to avoid drawing excessive amounts of text lx=xx+cw*contents.index(fm); rx=xx+cw*contents.index(to); while(fm=0) break; lx+=cw; fm=contents.inc(fm); } while(fmto) ei=to; // Nothing selected if(!hasSelection() || to<=si || ei<=fm){ drawPWDTextFragment(dc,xx,yy,fm,to); } // Stuff selected else{ if(fmgetTextWidth(contents.text(),contents.length()); // Text sticks to right of field if(options&JUSTIFY_RIGHT){ xx=shift+rr-ww; } // Text sticks on left of field else if(options&JUSTIFY_LEFT){ xx=shift+ll; } // Text centered in field else{ xx=shift+mm-ww/2; } // Reduce to avoid drawing excessive amounts of text lx=xx+font->getTextWidth(&contents[0],fm); rx=lx+font->getTextWidth(&contents[fm],to-fm); while(fmgetTextWidth(&contents[fm],t-fm); if(lx+cw>=0) break; lx+=cw; fm=t; } while(fmgetTextWidth(&contents[t],to-t); if(rx-cwto) ei=to; // Nothing selected if(!hasSelection() || to<=si || ei<=fm){ drawTextFragment(dc,xx,yy,fm,to); } // Stuff selected else{ if(fmgetTextWidth(contents.text(),si); ex=xx+font->getTextWidth(contents.text(),ei); if(hasFocus()){ dc.setForeground(selbackColor); dc.fillRectangle(sx,padtop+border,ex-sx,height-padtop-padbottom-(border<<1)); dc.setForeground(seltextColor); drawTextFragment(dc,xx,yy,si,ei); } else{ dc.setForeground(baseColor); dc.fillRectangle(sx,padtop+border,ex-sx,height-padtop-padbottom-(border<<1)); dc.setForeground(textColor); drawTextFragment(dc,xx,yy,si,ei); } } } } } // Handle repaint long FXTextField::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); // Draw frame drawFrame(dc,0,0,width,height); // Gray background if disabled if(isEnabled()) dc.setForeground(backColor); else dc.setForeground(baseColor); // Draw background dc.fillRectangle(border,border,width-(border<<1),height-(border<<1)); // Draw text, clipped against frame interior dc.setClipRectangle(border,border,width-(border<<1),height-(border<<1)); drawTextRange(dc,0,contents.length()); // Draw caret if(flags&FLAG_CARET){ int xx=coord(cursor)-1; dc.setForeground(cursorColor); dc.fillRectangle(xx,padtop+border,1,height-padbottom-padtop-(border<<1)); dc.fillRectangle(xx-2,padtop+border,5,1); dc.fillRectangle(xx-2,height-border-padbottom-1,5,1); } return 1; } // Move cursor to begin of line long FXTextField::onCmdCursorHome(FXObject*,FXSelector,void*){ setCursorPos(0); makePositionVisible(0); return 1; } // Move cursor to end of line long FXTextField::onCmdCursorEnd(FXObject*,FXSelector,void*){ setCursorPos(contents.length()); makePositionVisible(cursor); return 1; } // Move cursor right long FXTextField::onCmdCursorRight(FXObject*,FXSelector,void*){ setCursorPos(contents.inc(cursor)); makePositionVisible(cursor); return 1; } // Move cursor left long FXTextField::onCmdCursorLeft(FXObject*,FXSelector,void*){ setCursorPos(contents.dec(cursor)); makePositionVisible(cursor); return 1; } // Check if w is delimiter static FXbool isdelimiter(const FXchar *delimiters,FXwchar w){ return w<128 && strchr(delimiters,w); // FIXME for w>=128 } // Find end of previous word FXint FXTextField::leftWord(FXint pos) const { register FXint pp=pos,p; // Ensure input is valid FXASSERT(0<=pos && pos<=contents.length()); // Back up until space or delimiter while(0<=(p=contents.dec(pp)) && !Unicode::isSpace(contents.wc(p)) && !isdelimiter(delimiters,contents.wc(p))) pp=p; // Back up over run of spaces while(0<=(p=contents.dec(pp)) && Unicode::isSpace(contents.wc(p))) pp=p; // One more in case we didn't move if((pos==pp) && 0<=(p=contents.dec(pp))) pp=p; return pp; } // Find begin of next word FXint FXTextField::rightWord(FXint pos) const { register FXint pp=pos; // Ensure input is valid FXASSERT(0<=pos && pos<=contents.length()); // Advance until space or delimiter while(ppbeep(); } return 1; } // Copy onto cliboard long FXTextField::onCmdCopySel(FXObject*,FXSelector,void*){ if(hasSelection()){ FXDragType types[4]; types[0]=stringType; types[1]=textType; types[2]=utf8Type; types[3]=utf16Type; if(acquireClipboard(types,4)){ if(anchorbeep(); } return 1; } // Paste primary selection long FXTextField::onCmdPasteMiddle(FXObject*,FXSelector,void*){ if(isEditable()){ FXString string; // First, try UTF-8 if(getDNDData(FROM_SELECTION,utf8Type,string)){ FXTRACE((100,"Paste UTF8\n")); handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)string.text()); return 1; } // Next, try UTF-16 if(getDNDData(FROM_SELECTION,utf16Type,string)){ FXUTF16LECodec unicode; // FIXME maybe other endianness for unix FXTRACE((100,"Paste UTF16\n")); handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)unicode.mb2utf(string).text()); return 1; } // Finally, try good old 8859-1 if(getDNDData(FROM_SELECTION,stringType,string)){ FX88591Codec ascii; FXTRACE((100,"Paste ASCII\n")); handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)ascii.mb2utf(string).text()); return 1; } } else{ getApp()->beep(); } return 1; } // Delete selection long FXTextField::onCmdDeleteSel(FXObject*,FXSelector,void*){ if(isEditable()){ if(!hasSelection()) return 1; FXint st=FXMIN(anchor,cursor); FXint en=FXMAX(anchor,cursor); setCursorPos(st); setAnchorPos(st); contents.erase(st,en-st); layout(); makePositionVisible(st); killSelection(); flags|=FLAG_CHANGED; if(target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} } else{ getApp()->beep(); } return 1; } // Delete all text long FXTextField::onCmdDeleteAll(FXObject*,FXSelector,void*){ if(isEditable()){ setCursorPos(0); setAnchorPos(0); contents.clear(); layout(); makePositionVisible(0); killSelection(); flags|=FLAG_CHANGED; if(target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} } else{ getApp()->beep(); } return 1; } // Overstrike string long FXTextField::onCmdOverstString(FXObject*,FXSelector,void* ptr){ if(isEditable()){ FXString tentative=contents; FXint len=strlen((FXchar*)ptr); FXint reppos=cursor; FXint replen=len; if(hasSelection()){ reppos=FXMIN(anchor,cursor); replen=FXMAX(anchor,cursor)-reppos; } tentative.replace(reppos,replen,(FXchar*)ptr,len); if(handle(this,FXSEL(SEL_VERIFY,0),(void*)tentative.text())){ getApp()->beep(); return 1; } setCursorPos(reppos); setAnchorPos(reppos); contents=tentative; layout(); setCursorPos(reppos+len); setAnchorPos(reppos+len); makePositionVisible(reppos+len); killSelection(); update(border,border,width-(border<<1),height-(border<<1)); flags|=FLAG_CHANGED; if(target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} } else{ getApp()->beep(); } return 1; } // Insert a string long FXTextField::onCmdInsertString(FXObject*,FXSelector,void* ptr){ if(isEditable()){ FXString tentative=contents; FXint len=strlen((FXchar*)ptr); FXint reppos=cursor; FXint replen=0; if(hasSelection()){ reppos=FXMIN(anchor,cursor); replen=FXMAX(anchor,cursor)-reppos; } tentative.replace(reppos,replen,(FXchar*)ptr,len); if(handle(this,FXSEL(SEL_VERIFY,0),(void*)tentative.text())){ getApp()->beep(); return 1; } setCursorPos(reppos); setAnchorPos(reppos); contents=tentative; layout(); setCursorPos(reppos+len); setAnchorPos(reppos+len); makePositionVisible(reppos+len); killSelection(); update(border,border,width-(border<<1),height-(border<<1)); flags|=FLAG_CHANGED; if(target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} } else{ getApp()->beep(); } return 1; } // Backspace character long FXTextField::onCmdBackspace(FXObject*,FXSelector,void*){ if(isEditable() && 0tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} } else{ getApp()->beep(); } return 1; } // Delete character long FXTextField::onCmdDelete(FXObject*,FXSelector,void*){ if(isEditable() && cursortryHandle(this,FXSEL(SEL_CHANGED,message),(void*)contents.text());} } else{ getApp()->beep(); } return 1; } // Verify tentative input. long FXTextField::onVerify(FXObject*,FXSelector,void* ptr){ register FXchar *p=(FXchar*)ptr; // Limit number of columns if(options&TEXTFIELD_LIMITED){ if((FXint)wcslen(p)>columns) return 1; } // Integer input if(options&TEXTFIELD_INTEGER){ while(Ascii::isSpace(*p)) p++; if(*p=='-' || *p=='+') p++; while(Ascii::isDigit(*p)) p++; while(Ascii::isSpace(*p)) p++; if(*p!='\0') return 1; // Objection! } // Real input if(options&TEXTFIELD_REAL){ while(Ascii::isSpace(*p)) p++; if(*p=='-' || *p=='+') p++; while(Ascii::isDigit(*p)) p++; if(*p=='.') p++; while(Ascii::isDigit(*p)) p++; if(*p=='E' || *p=='e'){ p++; if(*p=='-' || *p=='+') p++; while(Ascii::isDigit(*p)) p++; } while(Ascii::isSpace(*p)) p++; if(*p!='\0') return 1; // Objection! } // Target has chance to object to the proposed change if(target && target->tryHandle(this,FXSEL(SEL_VERIFY,message),ptr)) return 1; // No objections have been raised! return 0; } // Pressed a key long FXTextField::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled()){ FXTRACE((200,"%s::onKeyPress keysym=0x%04x state=%04x\n",getClassName(),event->code,event->state)); if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; flags&=~FLAG_UPDATE; switch(event->code){ case KEY_Right: case KEY_KP_Right: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_WORD_RIGHT),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_RIGHT),NULL); } if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Left: case KEY_KP_Left: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_WORD_LEFT),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_LEFT),NULL); } if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Home: case KEY_KP_Home: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_HOME),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_End: case KEY_KP_End: if(!(event->state&SHIFTMASK)){ handle(this,FXSEL(SEL_COMMAND,ID_DESELECT_ALL),NULL); } handle(this,FXSEL(SEL_COMMAND,ID_CURSOR_END),NULL); if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_EXTEND),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_MARK),NULL); } return 1; case KEY_Insert: case KEY_KP_Insert: if(event->state&CONTROLMASK){ handle(this,FXSEL(SEL_COMMAND,ID_COPY_SEL),NULL); return 1; } else if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_PASTE_SEL),NULL); return 1; } else{ handle(this,FXSEL(SEL_COMMAND,ID_TOGGLE_OVERSTRIKE),NULL); } return 1; case KEY_Delete: case KEY_KP_Delete: if(hasSelection()){ if(event->state&SHIFTMASK){ handle(this,FXSEL(SEL_COMMAND,ID_CUT_SEL),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_DELETE_SEL),NULL); } } else{ handle(this,FXSEL(SEL_COMMAND,ID_DELETE),NULL); } return 1; case KEY_BackSpace: if(hasSelection()){ handle(this,FXSEL(SEL_COMMAND,ID_DELETE_SEL),NULL); } else{ handle(this,FXSEL(SEL_COMMAND,ID_BACKSPACE),NULL); } return 1; case KEY_Return: case KEY_KP_Enter: if(isEditable()){ flags|=FLAG_UPDATE; flags&=~FLAG_CHANGED; if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)contents.text()); } else{ getApp()->beep(); } return 1; case KEY_a: if(!(event->state&CONTROLMASK)) goto ins; handle(this,FXSEL(SEL_COMMAND,ID_SELECT_ALL),NULL); return 1; case KEY_x: if(!(event->state&CONTROLMASK)) goto ins; case KEY_F20: // Sun Cut key handle(this,FXSEL(SEL_COMMAND,ID_CUT_SEL),NULL); return 1; case KEY_c: if(!(event->state&CONTROLMASK)) goto ins; case KEY_F16: // Sun Copy key handle(this,FXSEL(SEL_COMMAND,ID_COPY_SEL),NULL); return 1; case KEY_v: if(!(event->state&CONTROLMASK)) goto ins; case KEY_F18: // Sun Paste key handle(this,FXSEL(SEL_COMMAND,ID_PASTE_SEL),NULL); return 1; default: ins: if((event->state&(CONTROLMASK|ALTMASK)) || ((FXuchar)event->text[0]<32)) return 0; if(isOverstrike()){ handle(this,FXSEL(SEL_COMMAND,ID_OVERST_STRING),(void*)event->text.text()); } else{ handle(this,FXSEL(SEL_COMMAND,ID_INSERT_STRING),(void*)event->text.text()); } return 1; } } return 0; } // Key Release long FXTextField::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ FXTRACE((200,"%s::onKeyRelease keysym=0x%04x state=%04x\n",getClassName(),((FXEvent*)ptr)->code,((FXEvent*)ptr)->state)); if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Right: case KEY_KP_Right: case KEY_Left: case KEY_KP_Left: case KEY_Home: case KEY_KP_Home: case KEY_End: case KEY_KP_End: case KEY_Insert: case KEY_KP_Insert: case KEY_Delete: case KEY_KP_Delete: case KEY_BackSpace: case KEY_Return: case KEY_F20: // Sun Cut key case KEY_F16: // Sun Copy key case KEY_F18: // Sun Paste key return 1; case KEY_a: case KEY_x: case KEY_c: case KEY_v: if(event->state&CONTROLMASK) return 1; default: if((event->state&(CONTROLMASK|ALTMASK)) || ((FXuchar)event->text[0]<32)) return 0; return 1; } } return 0; } // Kill the selection FXbool FXTextField::killSelection(){ if(hasSelection()){ releaseSelection(); update(border,border,width-(border<<1),height-(border<<1)); return TRUE; } return FALSE; } // Select all text FXbool FXTextField::selectAll(){ setAnchorPos(0); setCursorPos(contents.length()); extendSelection(cursor); return TRUE; } // Set selection FXbool FXTextField::setSelection(FXint pos,FXint len){ setAnchorPos(pos); setCursorPos(pos+len); extendSelection(cursor); return TRUE; } // Extend selection FXbool FXTextField::extendSelection(FXint pos){ FXDragType types[4]; // Validate position to start of character pos=contents.validate(FXCLAMP(0,pos,contents.length())); // Got a selection at all? if(anchor!=pos){ types[0]=stringType; types[1]=textType; types[2]=utf8Type; types[3]=utf16Type; if(!hasSelection()){ acquireSelection(types,4); } } else{ if(hasSelection()){ releaseSelection(); } } update(border,border,width-(border<<1),height-(border<<1)); return TRUE; } // Change the text and move cursor to end void FXTextField::setText(const FXString& text,FXbool notify){ killSelection(); if(contents!=text){ contents=text; anchor=contents.length(); cursor=contents.length(); if(xid) layout(); if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)contents.text());} } } // Set text color void FXTextField::setTextColor(FXColor clr){ if(textColor!=clr){ textColor=clr; update(); } } // Set select background color void FXTextField::setSelBackColor(FXColor clr){ if(selbackColor!=clr){ selbackColor=clr; update(); } } // Set selected text color void FXTextField::setSelTextColor(FXColor clr){ if(seltextColor!=clr){ seltextColor=clr; update(); } } // Set cursor color void FXTextField::setCursorColor(FXColor clr){ if(clr!=cursorColor){ cursorColor=clr; update(); } } // Change number of columns void FXTextField::setNumColumns(FXint ncols){ if(ncols<0) ncols=0; if(columns!=ncols){ shift=0; columns=ncols; layout(); // This may not be necessary! recalc(); update(); } } // Return true if editable FXbool FXTextField::isEditable() const { return (options&TEXTFIELD_READONLY)==0; } // Set editable mode void FXTextField::setEditable(FXbool edit){ if(edit) options&=~TEXTFIELD_READONLY; else options|=TEXTFIELD_READONLY; } // Return TRUE if overstrike mode in effect FXbool FXTextField::isOverstrike() const { return (options&TEXTFIELD_OVERSTRIKE)!=0; } // Set overstrike mode void FXTextField::setOverstrike(FXbool over){ if(over) options|=TEXTFIELD_OVERSTRIKE; else options&=~TEXTFIELD_OVERSTRIKE; } // Change text style void FXTextField::setTextStyle(FXuint style){ FXuint opts=(options&~TEXTFIELD_MASK) | (style&TEXTFIELD_MASK); if(options!=opts){ shift=0; options=opts; recalc(); update(); } } // Get text style FXuint FXTextField::getTextStyle() const { return (options&TEXTFIELD_MASK); } // Set text justify style void FXTextField::setJustify(FXuint style){ FXuint opts=(options&~JUSTIFY_MASK) | (style&JUSTIFY_MASK); if(options!=opts){ shift=0; options=opts; recalc(); update(); } } // Get text justify style FXuint FXTextField::getJustify() const { return (options&JUSTIFY_MASK); } // Save object to stream void FXTextField::save(FXStream& store) const { FXFrame::save(store); store << contents; store << font; store << textColor; store << selbackColor; store << seltextColor; store << cursorColor; store << columns; store << help; store << tip; } // Load object from stream void FXTextField::load(FXStream& store){ FXFrame::load(store); store >> contents; store >> font; store >> textColor; store >> selbackColor; store >> seltextColor; store >> cursorColor; store >> columns; store >> help; store >> tip; } // Clean up FXTextField::~FXTextField(){ getApp()->removeTimeout(this,ID_BLINK); getApp()->removeTimeout(this,ID_AUTOSCROLL); font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXThread.cpp000066400000000000000000000544551326741342000156120ustar00rootroot00000000000000/******************************************************************************** * * * M u l i t h r e a d i n g S u p p o r t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXThread.cpp,v 1.53.2.12 2008/06/18 20:03:46 fox Exp $ * ********************************************************************************/ #ifdef WIN32 #if _WIN32_WINNT < 0x0400 #define _WIN32_WINNT 0x0400 #endif #endif #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXThread.h" #ifndef WIN32 #ifdef __APPLE__ #ifdef Status #undef Status #endif #ifdef KeyClass #undef KeyClass #endif #include #include #else #include #include #endif #else #include #endif /* Notes: - We have a amorphous blob of memory reserved for the mutex implementation. Since we're trying to avoid having to include platform-specific headers in application code, we can't easily know how much to allocate for pthread_mutex_t [or CRITICAL_SECTION]. - We don't want to allocate dynamically because of the performance issues, and also because obviously, since heap memory is shared between threads, a malloc itself involves locking another mutex, leaving a potential for an unexpected deadlock. - So we just reserve some memory which we will hope to be enough. If it ever turns out its not, the assert should trigger and we'll just have to change the source a bit. - If you run into this, try to figure out sizeof(pthread_mutex_t) and let me know about it (jeroen@fox-toolkit.org). - I do recommend running this in debug mode first time around on a new platform. - Picked unsigned long so as to ensure alignment issues are taken care off. - I now believe its safe to set tid=0 after run returns; if FXThread is destroyed then the execution is stopped immediately; if the thread exits, tid is also set to 0. If the thread is cancelled, tid is also set to 0. In no circumstance I can see is it possible for run() to return when FXThread no longer exists. */ using namespace FX; namespace FX { /*******************************************************************************/ // Unix implementation #ifndef WIN32 // Initialize mutex FXMutex::FXMutex(FXbool recursive){ pthread_mutexattr_t mutexatt; // If this fails on your machine, determine what value // of sizeof(pthread_mutex_t) is supposed to be on your // machine and mail it to: jeroen@fox-toolkit.org!! //FXTRACE((150,"sizeof(pthread_mutex_t)=%d\n",sizeof(pthread_mutex_t))); FXASSERT(sizeof(data)>=sizeof(pthread_mutex_t)); pthread_mutexattr_init(&mutexatt); pthread_mutexattr_settype(&mutexatt,recursive?PTHREAD_MUTEX_RECURSIVE:PTHREAD_MUTEX_DEFAULT); pthread_mutex_init((pthread_mutex_t*)data,&mutexatt); pthread_mutexattr_destroy(&mutexatt); } // Lock the mutex void FXMutex::lock(){ pthread_mutex_lock((pthread_mutex_t*)data); } // Try lock the mutex FXbool FXMutex::trylock(){ return pthread_mutex_trylock((pthread_mutex_t*)data)==0; } // Unlock mutex void FXMutex::unlock(){ pthread_mutex_unlock((pthread_mutex_t*)data); } // Test if locked FXbool FXMutex::locked(){ if(pthread_mutex_trylock((pthread_mutex_t*)data)==0){ pthread_mutex_unlock((pthread_mutex_t*)data); return false; } return true; } // Delete mutex FXMutex::~FXMutex(){ pthread_mutex_destroy((pthread_mutex_t*)data); } /*******************************************************************************/ #ifdef __APPLE__ // Initialize semaphore FXSemaphore::FXSemaphore(FXint initial){ // If this fails on your machine, determine what value // of sizeof(MPSemaphoreID*) is supposed to be on your // machine and mail it to: jeroen@fox-toolkit.org!! //FXTRACE((150,"sizeof(MPSemaphoreID*)=%d\n",sizeof(MPSemaphoreID*))); FXASSERT(sizeof(data)>=sizeof(MPSemaphoreID*)); MPCreateSemaphore(2147483647,initial,(MPSemaphoreID*)data); } // Decrement semaphore void FXSemaphore::wait(){ MPWaitOnSemaphore(*((MPSemaphoreID*)data),kDurationForever); } // Decrement semaphore but don't block FXbool FXSemaphore::trywait(){ return MPWaitOnSemaphore(*((MPSemaphoreID*)data),kDurationImmediate)==noErr; } // Increment semaphore void FXSemaphore::post(){ MPSignalSemaphore(*((MPSemaphoreID*)data)); } // Delete semaphore FXSemaphore::~FXSemaphore(){ MPDeleteSemaphore(*((MPSemaphoreID*)data)); } #else // Initialize semaphore FXSemaphore::FXSemaphore(FXint initial){ // If this fails on your machine, determine what value // of sizeof(sem_t) is supposed to be on your // machine and mail it to: jeroen@fox-toolkit.org!! //FXTRACE((150,"sizeof(sem_t)=%d\n",sizeof(sem_t))); FXASSERT(sizeof(data)>=sizeof(sem_t)); sem_init((sem_t*)data,0,(unsigned int)initial); } // Decrement semaphore void FXSemaphore::wait(){ sem_wait((sem_t*)data); } // Decrement semaphore but don't block FXbool FXSemaphore::trywait(){ return sem_trywait((sem_t*)data)==0; } // Increment semaphore void FXSemaphore::post(){ sem_post((sem_t*)data); } // Delete semaphore FXSemaphore::~FXSemaphore(){ sem_destroy((sem_t*)data); } #endif /*******************************************************************************/ // Initialize condition FXCondition::FXCondition(){ // If this fails on your machine, determine what value // of sizeof(pthread_cond_t) is supposed to be on your // machine and mail it to: jeroen@fox-toolkit.org!! //FXTRACE((150,"sizeof(pthread_cond_t)=%d\n",sizeof(pthread_cond_t))); FXASSERT(sizeof(data)>=sizeof(pthread_cond_t)); pthread_cond_init((pthread_cond_t*)data,NULL); } // Wake up one single waiting thread void FXCondition::signal(){ pthread_cond_signal((pthread_cond_t*)data); } // Wake up all waiting threads void FXCondition::broadcast(){ pthread_cond_broadcast((pthread_cond_t*)data); } // Wait for condition indefinitely void FXCondition::wait(FXMutex& mtx){ pthread_cond_wait((pthread_cond_t*)data,(pthread_mutex_t*)mtx.data); } // Wait for condition but fall through after timeout FXbool FXCondition::wait(FXMutex& mtx,FXlong nsec){ register int result; struct timespec ts; ts.tv_sec=nsec/1000000000; ts.tv_nsec=nsec%1000000000; x:result=pthread_cond_timedwait((pthread_cond_t*)data,(pthread_mutex_t*)mtx.data,&ts); if(result==EINTR) goto x; return result!=ETIMEDOUT; } // Delete condition FXCondition::~FXCondition(){ pthread_cond_destroy((pthread_cond_t*)data); } /*******************************************************************************/ // Thread local storage key for back-reference to FXThread static pthread_key_t self_key; // Global initializer for the self_key variable struct TLSKEYINIT { TLSKEYINIT(){ pthread_key_create(&self_key,NULL); } ~TLSKEYINIT(){ pthread_key_delete(self_key); } }; // Extern declaration prevents overzealous optimizer from noticing we're // never using this object, and subsequently eliminating it from the code. extern TLSKEYINIT initializer; // Dummy object causes global initializer to run TLSKEYINIT initializer; // Initialize thread FXThread::FXThread():tid(0){ } // Return thread id of this thread object. // Purposefully NOT inlined, the tid may be changed by another // thread and therefore we must force the compiler to fetch // this value fresh each time it is needed! FXThreadID FXThread::id() const { return tid; } // Return TRUE if this thread is running FXbool FXThread::running() const { return tid!=0; } // Start the thread; we associate the FXThread instance with // this thread using thread-local storage accessed with self_key. // Also, we catch any errors thrown by the thread code here. void* FXThread::execute(void* thread){ register FXint code=-1; pthread_setspecific(self_key,thread); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); try{ code=((FXThread*)thread)->run(); } catch(...){ } ((FXThread*)thread)->tid=0; return (void*)(FXival)code; } // Start thread; make sure that stacksize >= PTHREAD_STACK_MIN. // We can't check for it because not all machines have this the // PTHREAD_STACK_MIN definition. FXbool FXThread::start(unsigned long stacksize){ register FXbool code; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setinheritsched(&attr,PTHREAD_INHERIT_SCHED); if(stacksize){ pthread_attr_setstacksize(&attr,stacksize); } //pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); code=pthread_create((pthread_t*)&tid,&attr,FXThread::execute,(void*)this)==0; pthread_attr_destroy(&attr); return code; } // Suspend calling thread until thread is done FXbool FXThread::join(FXint& code){ register pthread_t ttid=(pthread_t)tid; void *trc=NULL; if(ttid && pthread_join(ttid,&trc)==0){ code=(FXint)(FXival)trc; tid=0; return TRUE; } return FALSE; } // Suspend calling thread until thread is done FXbool FXThread::join(){ register pthread_t ttid=(pthread_t)tid; if(ttid && pthread_join(ttid,NULL)==0){ tid=0; return TRUE; } return FALSE; } // Cancel the thread FXbool FXThread::cancel(){ register pthread_t ttid=(pthread_t)tid; if(ttid && pthread_cancel(ttid)==0){ pthread_join(ttid,NULL); tid=0; return TRUE; } return FALSE; } // Detach thread FXbool FXThread::detach(){ register pthread_t ttid=(pthread_t)tid; return ttid && pthread_detach(ttid)==0; } // Exit calling thread void FXThread::exit(FXint code){ if(self()){ self()->tid=0; } pthread_exit((void*)(FXival)code); } // Yield the thread void FXThread::yield(){ sched_yield(); // More portable than pthread_yield() } // Get time in nanoseconds since Epoch FXlong FXThread::time(){ #ifdef __USE_POSIX199309 const FXlong seconds=1000000000; struct timespec ts; clock_gettime(CLOCK_REALTIME,&ts); return ts.tv_sec*seconds+ts.tv_nsec; #else const FXlong seconds=1000000000; const FXlong microseconds=1000; struct timeval tv; gettimeofday(&tv,NULL); return tv.tv_sec*seconds+tv.tv_usec*microseconds; #endif } // Sleep for some time void FXThread::sleep(FXlong nsec){ #ifdef __USE_POSIX199309 const FXlong seconds=1000000000; struct timespec value; value.tv_sec=nsec/seconds; value.tv_nsec=nsec%seconds; nanosleep(&value,NULL); #else const FXlong seconds=1000000000; const FXlong microseconds=1000; const FXlong milliseconds=1000000; struct timeval value; value.tv_usec=(nsec/microseconds)%milliseconds; value.tv_sec=nsec/seconds; select(1,0,0,0,&value); #endif } // Wake at appointed time void FXThread::wakeat(FXlong nsec){ #ifdef __USE_POSIX199309 const FXlong seconds=1000000000; struct timespec value; #ifdef __USE_XOPEN2K value.tv_sec=nsec/seconds; value.tv_nsec=nsec%seconds; clock_nanosleep(CLOCK_REALTIME,TIMER_ABSTIME,&value,NULL); #else nsec-=FXThread::time(); if(nsec<0) nsec=0; value.tv_sec=nsec/seconds; value.tv_nsec=nsec%seconds; nanosleep(&value,NULL); #endif #else const FXlong seconds=1000000000; const FXlong microseconds=1000; const FXlong milliseconds=1000000; struct timeval value; if(nsec<0) nsec=0; value.tv_usec=(nsec/microseconds)%milliseconds; value.tv_sec=nsec/seconds; select(1,0,0,0,&value); #endif } // Return pointer to calling thread's instance FXThread* FXThread::self(){ return (FXThread*)pthread_getspecific(self_key); } // Return thread id of caller FXThreadID FXThread::current(){ return (FXThreadID)pthread_self(); } // Set thread priority void FXThread::priority(FXint prio){ register pthread_t ttid=(pthread_t)tid; if(ttid){ sched_param sched={0}; int pcy=0; pthread_getschedparam(ttid,&pcy,&sched); #if defined(_POSIX_PRIORITY_SCHEDULING) int priomax=sched_get_priority_max(pcy); int priomin=sched_get_priority_min(pcy); sched.sched_priority=FXCLAMP(priomin,prio,priomax); #elif defined(PTHREAD_MINPRIORITY) sched.sched_priority=FXCLAMP(PTHREAD_MIN_PRIORITY,prio,PTHREAD_MAX_PRIORITY); #endif pthread_setschedparam(ttid,pcy,&sched); } } // Return thread priority FXint FXThread::priority(){ register pthread_t ttid=(pthread_t)tid; if(ttid){ sched_param sched={0}; int pcy=0; pthread_getschedparam(ttid,&pcy,&sched); return sched.sched_priority; } return 0; } // Destroy; if it was running, stop it FXThread::~FXThread(){ register pthread_t ttid=(pthread_t)tid; if(ttid){ pthread_cancel(ttid); } } /*******************************************************************************/ // Windows implementation #else // Initialize mutex FXMutex::FXMutex(FXbool){ // If this fails on your machine, determine what value // of sizeof(CRITICAL_SECTION) is supposed to be on your // machine and mail it to: jeroen@fox-toolkit.org!! //FXTRACE((150,"sizeof(CRITICAL_SECTION)=%d\n",sizeof(CRITICAL_SECTION))); FXASSERT(sizeof(data)>=sizeof(CRITICAL_SECTION)); InitializeCriticalSection((CRITICAL_SECTION*)data); } // Lock the mutex void FXMutex::lock(){ EnterCriticalSection((CRITICAL_SECTION*)data); } // Try lock the mutex FXbool FXMutex::trylock(){ #if(_WIN32_WINNT >= 0x0400) return TryEnterCriticalSection((CRITICAL_SECTION*)data)!=0; #else return FALSE; #endif } // Unlock mutex void FXMutex::unlock(){ LeaveCriticalSection((CRITICAL_SECTION*)data); } // Test if locked FXbool FXMutex::locked(){ #if(_WIN32_WINNT >= 0x0400) if(TryEnterCriticalSection((CRITICAL_SECTION*)data)!=0){ LeaveCriticalSection((CRITICAL_SECTION*)data); return false; } #endif return true; } // Delete mutex FXMutex::~FXMutex(){ DeleteCriticalSection((CRITICAL_SECTION*)data); } /*******************************************************************************/ // Initialize semaphore FXSemaphore::FXSemaphore(FXint initial){ data[0]=(FXuval)CreateSemaphore(NULL,initial,0x7fffffff,NULL); } // Decrement semaphore void FXSemaphore::wait(){ WaitForSingleObject((HANDLE)data[0],INFINITE); } // Non-blocking semaphore decrement FXbool FXSemaphore::trywait(){ return WaitForSingleObject((HANDLE)data[0],0)==WAIT_OBJECT_0; } // Increment semaphore void FXSemaphore::post(){ ReleaseSemaphore((HANDLE)data[0],1,NULL); } // Delete semaphore FXSemaphore::~FXSemaphore(){ CloseHandle((HANDLE)data[0]); } /*******************************************************************************/ // This is the solution according to Schmidt, the win32-threads // implementation thereof which is found inside GCC somewhere. // See: (http://www.cs.wustl.edu/~schmidt/win32-cv-1.html). // // Our implementation however initializes the Event objects in // the constructor, under the assumption that you wouldn't be creating // a condition object if you weren't planning to use them somewhere. // Initialize condition FXCondition::FXCondition(){ // If this fails on your machine, notify jeroen@fox-toolkit.org! FXASSERT(sizeof(data)>=sizeof(CRITICAL_SECTION)+sizeof(HANDLE)+sizeof(HANDLE)+sizeof(FXuval)); data[0]=(FXuval)CreateEvent(NULL,0,0,NULL); // Wakes one, autoreset data[1]=(FXuval)CreateEvent(NULL,1,0,NULL); // Wakes all, manual reset data[2]=0; // Blocked count InitializeCriticalSection((CRITICAL_SECTION*)&data[3]); // Critical section } // Wake up one single waiting thread void FXCondition::signal(){ EnterCriticalSection((CRITICAL_SECTION*)&data[3]); int blocked=(data[2]>0); LeaveCriticalSection((CRITICAL_SECTION*)&data[3]); if(blocked) SetEvent((HANDLE)data[0]); } // Wake up all waiting threads void FXCondition::broadcast(){ EnterCriticalSection((CRITICAL_SECTION*)&data[3]); int blocked=(data[2]>0); LeaveCriticalSection((CRITICAL_SECTION*)&data[3]); if(blocked) SetEvent((HANDLE)data[1]); } // Wait void FXCondition::wait(FXMutex& mtx){ EnterCriticalSection((CRITICAL_SECTION*)&data[3]); data[2]++; LeaveCriticalSection((CRITICAL_SECTION*)&data[3]); mtx.unlock(); DWORD result=WaitForMultipleObjects(2,(HANDLE*)data,0,INFINITE); EnterCriticalSection((CRITICAL_SECTION*)&data[3]); data[2]--; int last_waiter=(result==WAIT_OBJECT_0+1)&&(data[2]==0); // Unblocked by broadcast & no other blocked threads LeaveCriticalSection((CRITICAL_SECTION*)&data[3]); if(last_waiter) ResetEvent((HANDLE)data[1]); // Reset signal mtx.lock(); } // Wait using single global mutex FXbool FXCondition::wait(FXMutex& mtx,FXlong nsec){ EnterCriticalSection((CRITICAL_SECTION*)&data[3]); data[2]++; LeaveCriticalSection((CRITICAL_SECTION*)&data[3]); mtx.unlock(); nsec-=FXThread::time(); DWORD result=WaitForMultipleObjects(2,(HANDLE*)data,0,nsec/1000000); EnterCriticalSection((CRITICAL_SECTION*)&data[3]); data[2]--; int last_waiter=(result==WAIT_OBJECT_0+1)&&(data[2]==0); // Unblocked by broadcast & no other blocked threads LeaveCriticalSection((CRITICAL_SECTION*)&data[3]); if(last_waiter) ResetEvent((HANDLE)data[1]); // Reset signal mtx.lock(); return result!=WAIT_TIMEOUT; } // Delete condition FXCondition::~FXCondition(){ CloseHandle((HANDLE)data[0]); CloseHandle((HANDLE)data[1]); DeleteCriticalSection((CRITICAL_SECTION*)&data[3]); } /*******************************************************************************/ // Thread local storage key for back-reference to FXThread static DWORD self_key=0xffffffff; // Global initializer for the self_key variable struct TLSKEYINIT { TLSKEYINIT(){ self_key=TlsAlloc(); } ~TLSKEYINIT(){ TlsFree(self_key); } }; // Extern declaration prevents overzealous optimizer from noticing we're // never using this object, and subsequently eliminating it from the code. extern TLSKEYINIT initializer; // Dummy object causes global initializer to run TLSKEYINIT initializer; // Initialize thread FXThread::FXThread():tid(0){ } // Return thread id of this thread object. // Purposefully NOT inlined, the tid may be changed by another // thread and therefore we must force the compiler to fetch // this value fresh each time it is needed! FXThreadID FXThread::id() const { return tid; } // Return TRUE if this thread is running FXbool FXThread::running() const { return tid!=0; } // Start the thread; we associate the FXThread instance with // this thread using thread-local storage accessed with self_key. // Also, we catch any errors thrown by the thread code here. unsigned int CALLBACK FXThread::execute(void* thread){ register FXint code=-1; TlsSetValue(self_key,thread); try{ code=((FXThread*)thread)->run(); } catch(...){ } ((FXThread*)thread)->tid=0; return code; } // Start thread FXbool FXThread::start(unsigned long stacksize){ DWORD thd; tid=(FXThreadID)CreateThread(NULL,stacksize,(LPTHREAD_START_ROUTINE)FXThread::execute,this,0,&thd); return tid!=NULL; } // Suspend calling thread until thread is done FXbool FXThread::join(FXint& code){ register HANDLE ttid=(HANDLE)tid; if(ttid && WaitForSingleObject(ttid,INFINITE)==WAIT_OBJECT_0){ GetExitCodeThread(ttid,(DWORD*)&code); CloseHandle(ttid); tid=0; return TRUE; } return FALSE; } // Suspend calling thread until thread is done FXbool FXThread::join(){ register HANDLE ttid=(HANDLE)tid; if(ttid && WaitForSingleObject(ttid,INFINITE)==WAIT_OBJECT_0){ CloseHandle(ttid); tid=0; return TRUE; } return FALSE; } // Cancel the thread FXbool FXThread::cancel(){ register HANDLE ttid=(HANDLE)tid; if(ttid && TerminateThread(ttid,0)){ CloseHandle(ttid); tid=0; return TRUE; } return FALSE; } // Detach thread FXbool FXThread::detach(){ return tid!=0; } // Exit calling thread void FXThread::exit(FXint code){ if(self()){ self()->tid=0; } ExitThread(code); } // Yield the thread void FXThread::yield(){ Sleep(0); } // Get time in nanoseconds since Epoch FXlong FXThread::time(){ FXlong now; GetSystemTimeAsFileTime((FILETIME*)&now); #if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__SC__) return (now-116444736000000000LL)*100LL; #else return (now-116444736000000000L)*100L; #endif } // Sleep for some time void FXThread::sleep(FXlong nsec){ Sleep(nsec/1000000); } // Wake at appointed time void FXThread::wakeat(FXlong nsec){ nsec-=FXThread::time(); if(nsec<0) nsec=0; Sleep(nsec/1000000); } // Return thread id of caller FXThreadID FXThread::current(){ return (FXThreadID)GetCurrentThreadId(); } // Return pointer to calling thread's instance FXThread* FXThread::self(){ return (FXThread*)TlsGetValue(self_key); } // Set thread priority void FXThread::priority(FXint prio){ register HANDLE ttid=(HANDLE)tid; if(ttid){ SetThreadPriority(ttid,prio); } } // Return thread priority FXint FXThread::priority(){ register HANDLE ttid=(HANDLE)tid; if(ttid){ return GetThreadPriority(ttid); } return 0; } // Destroy FXThread::~FXThread(){ register HANDLE ttid=(HANDLE)tid; if(ttid){ TerminateThread(ttid,0); CloseHandle(ttid); } } #endif } fox1.6-1.6.57/src/FXToggleButton.cpp000066400000000000000000000430161326741342000170070ustar00rootroot00000000000000/******************************************************************************** * * * T o g g l e B u t t o n O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToggleButton.cpp,v 1.63.2.1 2006/12/11 15:57:26 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXAccelTable.h" #include "FXDCWindow.h" #include "FXIcon.h" #include "FXToggleButton.h" /* Notes: - If the altlabel is empty, the normal label will be used; likewise for the icon. - Setting the alt label will also change the alt hotkey. - The fallback logic needs to be properly adhered to in the size computation. */ // ToggleButton styles #define TOGGLEBUTTON_MASK (TOGGLEBUTTON_AUTOGRAY|TOGGLEBUTTON_AUTOHIDE|TOGGLEBUTTON_TOOLBAR|TOGGLEBUTTON_KEEPSTATE) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXToggleButton) FXToggleButtonMap[]={ FXMAPFUNC(SEL_PAINT,0,FXToggleButton::onPaint), FXMAPFUNC(SEL_UPDATE,0,FXToggleButton::onUpdate), FXMAPFUNC(SEL_ENTER,0,FXToggleButton::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXToggleButton::onLeave), FXMAPFUNC(SEL_FOCUSIN,0,FXToggleButton::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXToggleButton::onFocusOut), FXMAPFUNC(SEL_UNGRABBED,0,FXToggleButton::onUngrabbed), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXToggleButton::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXToggleButton::onLeftBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXToggleButton::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXToggleButton::onKeyRelease), FXMAPFUNC(SEL_KEYPRESS,FXToggleButton::ID_HOTKEY,FXToggleButton::onHotKeyPress), FXMAPFUNC(SEL_KEYRELEASE,FXToggleButton::ID_HOTKEY,FXToggleButton::onHotKeyRelease), FXMAPFUNC(SEL_QUERY_TIP,0,FXToggleButton::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXToggleButton::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXToggleButton::ID_CHECK,FXToggleButton::onCheck), FXMAPFUNC(SEL_COMMAND,FXToggleButton::ID_UNCHECK,FXToggleButton::onUncheck), FXMAPFUNC(SEL_COMMAND,FXToggleButton::ID_SETVALUE,FXToggleButton::onCmdSetValue), FXMAPFUNC(SEL_COMMAND,FXToggleButton::ID_SETINTVALUE,FXToggleButton::onCmdSetIntValue), FXMAPFUNC(SEL_COMMAND,FXToggleButton::ID_GETINTVALUE,FXToggleButton::onCmdGetIntValue), }; // Object implementation FXIMPLEMENT(FXToggleButton,FXLabel,FXToggleButtonMap,ARRAYNUMBER(FXToggleButtonMap)) // Deserialization FXToggleButton::FXToggleButton(){ alticon=(FXIcon*)-1L; state=FALSE; down=FALSE; } // Construct and init FXToggleButton::FXToggleButton(FXComposite* p,const FXString& text1,const FXString& text2,FXIcon* icon1,FXIcon* icon2,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXLabel(p,text1,icon1,opts,x,y,w,h,pl,pr,pt,pb){ FXString string=text2.section('\t',0); target=tgt; message=sel; altlabel=stripHotKey(string); alttip=text2.section('\t',1); althelp=text2.section('\t',2); alticon=icon2; althotkey=parseHotKey(string); althotoff=findHotKey(string); addHotKey(althotkey); state=FALSE; down=FALSE; } // Create window void FXToggleButton::create(){ FXLabel::create(); if(alticon) alticon->create(); } // Detach window void FXToggleButton::detach(){ FXLabel::detach(); if(alticon) alticon->detach(); } // Get default width FXint FXToggleButton::getDefaultWidth(){ FXint tw,iw,s,w1,w2; tw=iw=s=0; if(!label.empty()) tw=labelWidth(label); if(icon) iw=icon->getWidth(); if(iw && tw) s=4; if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w1=FXMAX(tw,iw); else w1=tw+iw+s; if(!altlabel.empty()) tw=labelWidth(altlabel); if(alticon) iw=alticon->getWidth(); if(iw && tw) s=4; if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w2=FXMAX(tw,iw); else w2=tw+iw+s; return FXMAX(w1,w2)+padleft+padright+(border<<1); } // Get default height FXint FXToggleButton::getDefaultHeight(){ FXint th,ih,h1,h2; th=ih=0; if(!label.empty()) th=labelHeight(label); if(icon) ih=icon->getHeight(); if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h1=FXMAX(th,ih); else h1=th+ih; if(!altlabel.empty()) th=labelHeight(altlabel); if(alticon) ih=alticon->getHeight(); if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h2=FXMAX(th,ih); else h2=th+ih; return FXMAX(h1,h2)+padtop+padbottom+(border<<1); } // Set button state void FXToggleButton::setState(FXbool s,FXbool notify){ if(state!=s){ state=s; update(); if(notify && target){target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)state);} } } // Press button void FXToggleButton::press(FXbool dn){ if(down!=dn){ down=dn; update(); } } // If window can have focus bool FXToggleButton::canFocus() const { return true; } // Update value from a message long FXToggleButton::onCmdSetValue(FXObject*,FXSelector,void* ptr){ setState((FXint)(FXuval)ptr); return 1; } // Update value from a message long FXToggleButton::onCmdSetIntValue(FXObject*,FXSelector,void* ptr){ setState(*((FXint*)ptr)); return 1; } // Obtain value from text field long FXToggleButton::onCmdGetIntValue(FXObject*,FXSelector,void* ptr){ *((FXint*)ptr)=getState(); return 1; } // Check the menu button long FXToggleButton::onCheck(FXObject*,FXSelector,void*){ setState(TRUE); return 1; } // Check the menu button long FXToggleButton::onUncheck(FXObject*,FXSelector,void*){ setState(FALSE); return 1; } // Implement auto-hide or auto-gray modes long FXToggleButton::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ if(!FXLabel::onUpdate(sender,sel,ptr)){ if(options&TOGGLEBUTTON_AUTOHIDE){if(shown()){hide();recalc();}} if(options&TOGGLEBUTTON_AUTOGRAY){disable();} } return 1; } // Gained focus long FXToggleButton::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusIn(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Lost focus long FXToggleButton::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onFocusOut(sender,sel,ptr); update(border,border,width-(border<<1),height-(border<<1)); return 1; } // Entered button long FXToggleButton::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onEnter(sender,sel,ptr); if(isEnabled()){ if(flags&FLAG_PRESSED) press(TRUE); if(options&TOGGLEBUTTON_TOOLBAR) update(); } return 1; } // Left button long FXToggleButton::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onLeave(sender,sel,ptr); if(isEnabled()){ if(flags&FLAG_PRESSED) press(FALSE); if(options&TOGGLEBUTTON_TOOLBAR) update(); } return 1; } // Pressed mouse button long FXToggleButton::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; press(TRUE); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; return 1; } return 0; } // Released mouse button long FXToggleButton::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXbool click=down; if(isEnabled() && (flags&FLAG_PRESSED)){ ungrab(); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; press(FALSE); if(click){ setState(!state); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)state); } return 1; } return 0; } // The widget lost the grab for some reason long FXToggleButton::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXLabel::onUngrabbed(sender,sel,ptr); press(FALSE); flags&=~FLAG_PRESSED; flags|=FLAG_UPDATE; return 1; } // Key Press long FXToggleButton::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ press(TRUE); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; return 1; } } return 0; } // Key Release long FXToggleButton::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && (flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ press(FALSE); setState(!state); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)state); return 1; } } return 0; } // Hot key combination pressed long FXToggleButton::onHotKeyPress(FXObject*,FXSelector,void* ptr){ handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); flags&=~FLAG_TIP; FXTRACE((100,"FXToggleButton::onHotKeyPress\n")); if(isEnabled() && !(flags&FLAG_PRESSED)){ press(TRUE); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; } return 1; } // Hot key combination released long FXToggleButton::onHotKeyRelease(FXObject*,FXSelector,void*){ FXTRACE((100,"FXToggleButton::onHotKeyRelease\n")); if(isEnabled() && (flags&FLAG_PRESSED)){ flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; press(FALSE); setState(!state); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)state); } return 1; } // We were asked about status text long FXToggleButton::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if(flags&FLAG_HELP){ if(state){ if(!althelp.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&althelp); return 1; } } if(!help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } } return 0; } // We were asked about tip text long FXToggleButton::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if(flags&FLAG_TIP){ if(state){ if(!alttip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&alttip); return 1; } } if(!tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } } return 0; } // Handle repaint long FXToggleButton::onPaint(FXObject*,FXSelector,void* ptr){ FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy; FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); // Got a border at all? if(options&(FRAME_RAISED|FRAME_SUNKEN)){ // Toolbar style if(options&TOGGLEBUTTON_TOOLBAR){ // Enabled and cursor inside and down if(down || ((options&TOGGLEBUTTON_KEEPSTATE) && state)){ dc.setForeground(hiliteColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height); else drawSunkenRectangle(dc,0,0,width,height); } // Enabled and cursor inside, and up else if(isEnabled() && underCursor()){ dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } // Disabled or unchecked or not under cursor else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } } // Normal style else{ // Draw sunken if pressed if(down || ((options&TOGGLEBUTTON_KEEPSTATE) && state)){ dc.setForeground(hiliteColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height); else drawSunkenRectangle(dc,0,0,width,height); } // Draw raised if not currently pressed down else{ dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } } } // No borders else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } // Place text & icon if(state && !altlabel.empty()){ tw=labelWidth(altlabel); th=labelHeight(altlabel); } else if(!label.empty()){ tw=labelWidth(label); th=labelHeight(label); } if(state && alticon){ iw=alticon->getWidth(); ih=alticon->getHeight(); } else if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); } just_x(tx,ix,tw,iw); just_y(ty,iy,th,ih); // Shift a bit when pressed if((down || ((options&TOGGLEBUTTON_KEEPSTATE) && state)) && (options&(FRAME_RAISED|FRAME_SUNKEN))){ ++tx; ++ty; ++ix; ++iy; } // Draw enabled state if(isEnabled()){ if(state && alticon){ dc.drawIcon(alticon,ix,iy); } else if(icon){ dc.drawIcon(icon,ix,iy); } if(state && !altlabel.empty()){ dc.setFont(font); dc.setForeground(textColor); drawLabel(dc,altlabel,althotoff,tx,ty,tw,th); } else if(!label.empty()){ dc.setFont(font); dc.setForeground(textColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } if(hasFocus()){ dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2); } } // Draw grayed-out state else{ if(state && alticon){ dc.drawIconSunken(alticon,ix,iy); } else if(icon){ dc.drawIconSunken(icon,ix,iy); } if(state && !altlabel.empty()){ dc.setFont(font); dc.setForeground(hiliteColor); drawLabel(dc,altlabel,althotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,altlabel,althotoff,tx,ty,tw,th); } else if(!label.empty()){ dc.setFont(font); dc.setForeground(hiliteColor); drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } } return 1; } // Change text void FXToggleButton::setAltText(const FXString& text){ FXString string=stripHotKey(text); FXHotKey hkey=parseHotKey(text); FXint hoff=findHotKey(text); if(altlabel!=string || althotkey!=hkey || althotoff!=hoff){ altlabel.adopt(string); remHotKey(althotkey); althotkey=hkey; althotoff=hoff; addHotKey(althotkey); recalc(); update(); } } // Change icon void FXToggleButton::setAltIcon(FXIcon* ic){ if(alticon!=ic){ alticon=ic; recalc(); update(); } } // Change help text void FXToggleButton::setAltHelpText(const FXString& text){ althelp=text; } // Change tip text void FXToggleButton::setAltTipText(const FXString& text){ alttip=text; } // Set icon positioning void FXToggleButton::setToggleStyle(FXuint style){ FXuint opts=(options&~TOGGLEBUTTON_MASK) | (style&TOGGLEBUTTON_MASK); if(options!=opts){ options=opts; update(); } } // Get icon positioning FXuint FXToggleButton::getToggleStyle() const { return (options&TOGGLEBUTTON_MASK); } // Save object to stream void FXToggleButton::save(FXStream& store) const { FXLabel::save(store); store << altlabel; store << alticon; store << althotkey; store << althotoff; store << alttip; store << althelp; store << state; } // Load object from stream void FXToggleButton::load(FXStream& store){ FXLabel::load(store); store >> altlabel; store >> alticon; store >> althotkey; store >> althotoff; store >> alttip; store >> althelp; store >> state; } // Destruct FXToggleButton::~FXToggleButton(){ remHotKey(althotkey); alticon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXToolBar.cpp000066400000000000000000000461431326741342000157400ustar00rootroot00000000000000/******************************************************************************** * * * T o o l B a r W i d g e t * * * ********************************************************************************* * Copyright (C) 2004,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToolBar.cpp,v 1.48.2.1 2006/06/20 13:13:06 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXGIFIcon.h" #include "FXDCWindow.h" #include "FXDrawable.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXComposite.h" #include "FXPacker.h" #include "FXPopup.h" #include "FXMenuPane.h" #include "FXMenuCaption.h" #include "FXMenuCommand.h" #include "FXMenuCascade.h" #include "FXMenuSeparator.h" #include "FXMenuRadio.h" #include "FXMenuCheck.h" #include "FXShell.h" #include "FXSeparator.h" #include "FXTopWindow.h" #include "FXDockBar.h" #include "FXToolBar.h" #include "FXDockSite.h" #include "FXToolBarGrip.h" #include "FXToolBarShell.h" #include "icons.h" /* Notes: - May want to add support for centered layout mode. */ // Docking side #define LAYOUT_SIDE_MASK (LAYOUT_SIDE_LEFT|LAYOUT_SIDE_RIGHT|LAYOUT_SIDE_TOP|LAYOUT_SIDE_BOTTOM) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXToolBar) FXToolBarMap[]={ FXMAPFUNC(SEL_UPDATE,FXToolBar::ID_DOCK_FLIP,FXToolBar::onUpdDockFlip), FXMAPFUNC(SEL_COMMAND,FXToolBar::ID_DOCK_FLIP,FXToolBar::onCmdDockFlip), }; // Object implementation FXIMPLEMENT(FXToolBar,FXDockBar,FXToolBarMap,ARRAYNUMBER(FXToolBarMap)) // Make a dockable and, possibly, floatable toolbar FXToolBar::FXToolBar(FXComposite* p,FXComposite* q,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXDockBar(p,q,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ } // Make a non-floatable toolbar FXToolBar::FXToolBar(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXDockBar(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ } // Compute minimum width based on child layout hints FXint FXToolBar::getDefaultWidth(){ register FXint total=0,mw=0,w; register FXWindow* child; register FXuint hints; if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth(); for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(dynamic_cast(child) || dynamic_cast(child)) w=child->getDefaultWidth(); else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if(!(options&LAYOUT_SIDE_LEFT)){ // Horizontal if(total) total+=hspacing; total+=w; } else{ // Vertical if(totalgetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(dynamic_cast(child) || dynamic_cast(child)) h=child->getDefaultHeight(); else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if(options&LAYOUT_SIDE_LEFT){ // Vertical if(total) total+=vspacing; total+=h; } else{ // Horizontal if(totalgetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(dynamic_cast(child)) w=child->getDefaultWidth(); else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if(dynamic_cast(child)) h=child->getDefaultHeight(); else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if(hcum+h>space) hcum=0; if(hcum==0) ngalleys++; hcum+=h+vspacing; if(wmaxgetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(dynamic_cast(child)) w=child->getDefaultWidth(); else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if(dynamic_cast(child)) h=child->getDefaultHeight(); else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if(wcum+w>space) wcum=0; if(wcum==0) ngalleys++; wcum+=w+hspacing; if(hmaxgetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(child->isMemberOf(FXMETACLASS(FXToolBarGrip))) w=child->getDefaultWidth(); else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if(galleywidthgetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(child->isMemberOf(FXMETACLASS(FXToolBarGrip))){ w=galleywidth; h=child->getDefaultHeight(); } else{ if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); } if(hints&LAYOUT_BOTTOM){ if(bbottom-hgalleybottom && ttop!=galleytop){ tleft=tright; tright+=galleywidth; ttop=galleytop; } y=ttop; ttop+=(h+vspacing); x=tleft+(galleywidth-w)/2; } child->position(x,y,w,h); } } } // Horizontal toolbar else{ galleyheight=0; for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(child->isMemberOf(FXMETACLASS(FXToolBarGrip))) h=child->getDefaultHeight(); else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if(galleyheightgetNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(child->isMemberOf(FXMETACLASS(FXToolBarGrip))){ w=child->getDefaultWidth(); h=galleyheight; } else{ if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); } if(hints&LAYOUT_RIGHT){ if(rright-wgalleyright && lleft!=galleyleft){ ltop=lbottom; lbottom+=galleyheight; lleft=galleyleft; } x=lleft; lleft+=(w+hspacing); y=ltop+(galleyheight-h)/2; } child->position(x,y,w,h); } } } flags&=~FLAG_DIRTY; } */ // Recalculate layout void FXToolBar::layout(){ register FXint left,right,top,bottom,remain,expand,mw=0,mh=0,x,y,w,h,e,t; register FXWindow *child; register FXuint hints; // Placement rectangle; right/bottom non-inclusive left=border+padleft; right=width-border-padright; top=border+padtop; bottom=height-border-padbottom; // Get maximum child size if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth(); if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight(); // Vertical toolbar if(options&LAYOUT_SIDE_LEFT){ // Find stretch for(child=getFirst(),remain=bottom-top,expand=0; child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(dynamic_cast(child) || dynamic_cast(child)) h=child->getDefaultHeight(); else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if(hints&LAYOUT_FILL_Y) expand+=h; else remain-=h; remain-=vspacing; } } // Adjust remain+=vspacing; // Placement for(child=getFirst(),e=0; child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); // Determine child width if(dynamic_cast(child) || dynamic_cast(child)) w=right-left; else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else if(hints&LAYOUT_FILL_X) w=right-left; else w=child->getDefaultWidth(); // Determine child x-position if(hints&LAYOUT_CENTER_X) x=left+(right-left-w)/2; else if(hints&LAYOUT_RIGHT) x=right-w; else x=left; // Determine child height if(dynamic_cast(child) || dynamic_cast(child)) h=child->getDefaultHeight(); else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); // Account for fill or center if(hints&LAYOUT_FILL_Y){ t=h*remain; e+=t%expand; h=t/expand+e/expand; e%=expand; } // Determine child x-position if(hints&LAYOUT_BOTTOM){ y=bottom-h; bottom-=h+vspacing; } else{ y=top; top+=h+vspacing; } // Place it child->position(x,y,w,h); } } } // Horizontal toolbar else{ // Find stretch for(child=getFirst(),remain=right-left,expand=0; child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(dynamic_cast(child) || dynamic_cast(child)) w=child->getDefaultWidth(); else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if(hints&LAYOUT_FILL_X) expand+=w; else remain-=w; remain-=hspacing; } } // Adjust remain+=hspacing; // Placement for(child=getFirst(),e=0; child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); // Determine child height if(dynamic_cast(child) || dynamic_cast(child)) h=bottom-top; else if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else if(hints&LAYOUT_FILL_Y) h=bottom-top; else h=child->getDefaultHeight(); // Determine child y-position if(hints&LAYOUT_CENTER_Y) y=top+(bottom-top-h)/2; else if(hints&LAYOUT_BOTTOM) y=bottom-h; else y=top; // Determine child width if(dynamic_cast(child) || dynamic_cast(child)) w=child->getDefaultWidth(); else if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); // Account for fill or center if(hints&LAYOUT_FILL_X){ t=w*remain; e+=t%expand; w=t/expand+e/expand; e%=expand; } // Determine child x-position if(hints&LAYOUT_RIGHT){ x=right-w; right-=w+hspacing; } else{ x=left; left+=w+hspacing; } // Place it child->position(x,y,w,h); } } } flags&=~FLAG_DIRTY; } // Dock the bar before other window void FXToolBar::dock(FXDockSite* docksite,FXWindow* before,FXbool notify){ FXDockBar::dock(docksite,before,notify); setDockingSide(getParent()->getLayoutHints()); } // Dock the bar near position in dock site void FXToolBar::dock(FXDockSite* docksite,FXint localx,FXint localy,FXbool notify){ FXDockBar::dock(docksite,localx,localy,notify); setDockingSide(getParent()->getLayoutHints()); } // Flip orientation long FXToolBar::onCmdDockFlip(FXObject*,FXSelector,void*){ if(wetdock && !isDocked()){ // Flip orientation if(getDockingSide()&LAYOUT_SIDE_LEFT) setDockingSide(LAYOUT_SIDE_TOP); else setDockingSide(LAYOUT_SIDE_LEFT); // Note, this takes wetdock's interpretation of layout hints into account wetdock->resize(wetdock->getDefaultWidth(),wetdock->getDefaultHeight()); } return 1; } // Check for flip long FXToolBar::onUpdDockFlip(FXObject* sender,FXSelector,void*){ sender->handle(this,isDocked()?FXSEL(SEL_COMMAND,ID_DISABLE):FXSEL(SEL_COMMAND,ID_ENABLE),NULL); return 1; } // Change toolbar orientation void FXToolBar::setDockingSide(FXuint side){ side&=LAYOUT_SIDE_MASK; if((options&LAYOUT_SIDE_MASK)!=side){ // New orientation is vertical if(side&LAYOUT_SIDE_LEFT){ if(!(options&LAYOUT_SIDE_LEFT)){ // Was horizontal if((options&LAYOUT_RIGHT) && (options&LAYOUT_CENTER_X)) side|=LAYOUT_FIX_Y; else if(options&LAYOUT_RIGHT) side|=LAYOUT_BOTTOM; else if(options&LAYOUT_CENTER_X) side|=LAYOUT_CENTER_Y; if(options&LAYOUT_FILL_X){ if(options&LAYOUT_FILL_Y) side|=LAYOUT_FILL_X; side|=LAYOUT_FILL_Y; } } else{ // Was vertical already side|=(options&(LAYOUT_BOTTOM|LAYOUT_CENTER_Y|LAYOUT_FILL_Y)); } } // New orientation is horizontal else{ if(options&LAYOUT_SIDE_LEFT){ // Was vertical if((options&LAYOUT_BOTTOM) && (options&LAYOUT_CENTER_Y)) side|=LAYOUT_FIX_X; else if(options&LAYOUT_BOTTOM) side|=LAYOUT_RIGHT; else if(options&LAYOUT_CENTER_Y) side|=LAYOUT_CENTER_X; if(options&LAYOUT_FILL_Y){ if(options&LAYOUT_FILL_X) side|=LAYOUT_FILL_Y; side|=LAYOUT_FILL_X; } } else{ side|=(options&(LAYOUT_RIGHT|LAYOUT_CENTER_X|LAYOUT_FILL_X)); } } // Simply preserve these options side|=(options&(LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT)); // Update the layout setLayoutHints(side); } } // Get toolbar orientation FXuint FXToolBar::getDockingSide() const { return (options&LAYOUT_SIDE_MASK); } } fox1.6-1.6.57/src/FXToolBarGrip.cpp000066400000000000000000000207411326741342000165560ustar00rootroot00000000000000/******************************************************************************** * * * T o o l B a r G r i p W i d g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToolBarGrip.cpp,v 1.29 2006/01/22 17:58:47 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXToolBar.h" #include "FXToolBarGrip.h" /* Notes: - Tool bar grip is a small grabber contained in the toolbar which lets a user move the toolbar around, dock and undock it, and so on. - The convention is to let single-rebar tool bar grips rearrange the bars in a dock site, and double-rebar grips dock and undock. This convention is recommended but not enforced. */ // Size #define GRIP_SINGLE 3 // Single grip for arrangable toolbars #define GRIP_DOUBLE 7 // Double grip for dockable toolbars #define JUSTIFY_MASK (JUSTIFY_HZ_APART|JUSTIFY_VT_APART) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXToolBarGrip) FXToolBarGripMap[]={ FXMAPFUNC(SEL_PAINT,0,FXToolBarGrip::onPaint), FXMAPFUNC(SEL_ENTER,0,FXToolBarGrip::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXToolBarGrip::onLeave), FXMAPFUNC(SEL_MOTION,0,FXToolBarGrip::onMotion), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXToolBarGrip::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXToolBarGrip::onLeftBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXToolBarGrip::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXToolBarGrip::onKeyRelease), FXMAPFUNC(SEL_QUERY_TIP,0,FXToolBarGrip::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXToolBarGrip::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXToolBarGrip::ID_SETHELPSTRING,FXToolBarGrip::onCmdSetHelp), FXMAPFUNC(SEL_COMMAND,FXToolBarGrip::ID_GETHELPSTRING,FXToolBarGrip::onCmdGetHelp), FXMAPFUNC(SEL_COMMAND,FXToolBarGrip::ID_SETTIPSTRING,FXToolBarGrip::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXToolBarGrip::ID_GETTIPSTRING,FXToolBarGrip::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXToolBarGrip,FXDockHandler,FXToolBarGripMap,ARRAYNUMBER(FXToolBarGripMap)) // Deserialization FXToolBarGrip::FXToolBarGrip(){ activeColor=0; } // Construct and init FXToolBarGrip::FXToolBarGrip(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXDockHandler(p,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){ activeColor=FXRGB(0,0,255); } // Get default width FXint FXToolBarGrip::getDefaultWidth(){ return padleft+padright+(border<<1)+((options&TOOLBARGRIP_DOUBLE)?GRIP_DOUBLE:GRIP_SINGLE); } // Get default height FXint FXToolBarGrip::getDefaultHeight(){ return padtop+padbottom+(border<<1)+((options&TOOLBARGRIP_DOUBLE)?GRIP_DOUBLE:GRIP_SINGLE); } // Can have focus bool FXToolBarGrip::canFocus() const { return false; } // Change toolbar orientation void FXToolBarGrip::setDoubleBar(FXbool dbl){ FXuint opts=dbl?(options|TOOLBARGRIP_DOUBLE):(options&~TOOLBARGRIP_DOUBLE); if(opts!=options){ options=opts; recalc(); } } // Return TRUE if toolbar grip is displayed as a double bar FXbool FXToolBarGrip::isDoubleBar() const { return (options&TOOLBARGRIP_DOUBLE)!=0; } // Handle repaint long FXToolBarGrip::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent* event=static_cast(ptr); FXDCWindow dc(this,event); FXint xx,yy,ww,hh; dc.setForeground(backColor); dc.fillRectangle(border,border,width-(border<<1),height-(border<<1)); ww=width-padleft-padright-(border<<1); hh=height-padtop-padbottom-(border<<1); if(width>height){ xx=border+padleft; if(options&TOOLBARGRIP_DOUBLE){ // = yy=border+padtop+(hh-GRIP_DOUBLE)/2; dc.setForeground(hiliteColor); dc.fillRectangle(xx,yy,1,2); dc.fillRectangle(xx,yy+4,1,2); dc.fillRectangle(xx,yy,ww-1,1); dc.fillRectangle(xx,yy+4,ww-1,1); dc.setForeground(shadowColor); dc.fillRectangle(xx+ww-1,yy,1,3); dc.fillRectangle(xx+ww-1,yy+4,1,3); dc.fillRectangle(xx,yy+2,ww-1,1); dc.fillRectangle(xx,yy+6,ww-1,1); if(flags&(FLAG_ACTIVE|FLAG_TRYDRAG|FLAG_DODRAG)){ dc.setForeground(activeColor); dc.fillRectangle(xx+1,yy+1,ww-2,1); dc.fillRectangle(xx+1,yy+5,ww-2,1); } } else{ // - yy=border+padtop+(hh-GRIP_SINGLE)/2; dc.setForeground(hiliteColor); dc.fillRectangle(xx,yy,1,2); dc.fillRectangle(xx,yy,ww-1,1); dc.setForeground(shadowColor); dc.fillRectangle(xx+ww-1,yy,1,3); dc.fillRectangle(xx,yy+2,ww-1,1); if(flags&(FLAG_ACTIVE|FLAG_TRYDRAG|FLAG_DODRAG)){ dc.setForeground(activeColor); dc.fillRectangle(xx+1,yy+1,ww-2,1); } } } else{ yy=border+padtop; if(options&TOOLBARGRIP_DOUBLE){ // || xx=border+padleft+(ww-GRIP_DOUBLE)/2; dc.setForeground(hiliteColor); dc.fillRectangle(xx,yy,2,1); dc.fillRectangle(xx+4,yy,2,1); dc.fillRectangle(xx,yy,1,hh-1); dc.fillRectangle(xx+4,yy,1,hh-1); dc.setForeground(shadowColor); dc.fillRectangle(xx,yy+hh-1,3,1); dc.fillRectangle(xx+4,yy+hh-1,3,1); dc.fillRectangle(xx+2,yy,1,hh-1); dc.fillRectangle(xx+6,yy,1,hh-1); if(flags&(FLAG_ACTIVE|FLAG_TRYDRAG|FLAG_DODRAG)){ dc.setForeground(activeColor); dc.fillRectangle(xx+1,yy+1,1,hh-2); dc.fillRectangle(xx+5,yy+1,1,hh-2); } } else{ // | xx=border+padleft+(ww-GRIP_SINGLE)/2; dc.setForeground(hiliteColor); dc.fillRectangle(xx,yy,2,1); dc.fillRectangle(xx,yy,1,hh-1); dc.setForeground(shadowColor); dc.fillRectangle(xx,yy+hh-1,3,1); dc.fillRectangle(xx+2,yy,1,hh-1); if(flags&(FLAG_ACTIVE|FLAG_TRYDRAG|FLAG_DODRAG)){ dc.setForeground(activeColor); dc.fillRectangle(xx+1,yy+1,1,hh-2); } } } drawFrame(dc,0,0,width,height); return 1; } // Entered button long FXToolBarGrip::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXDockHandler::onEnter(sender,sel,ptr); if(isEnabled()){ flags|=FLAG_ACTIVE; update(); } return 1; } // Leave button long FXToolBarGrip::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXDockHandler::onLeave(sender,sel,ptr); if(isEnabled()){ flags&=~FLAG_ACTIVE; update(); } return 1; } // Set active color void FXToolBarGrip::setActiveColor(FXColor clr){ if(clr!=activeColor){ activeColor=clr; update(); } } // Save data void FXToolBarGrip::save(FXStream& store) const { FXDockHandler::save(store); store << activeColor; } // Load data void FXToolBarGrip::load(FXStream& store){ FXDockHandler::load(store); store >> activeColor; } } fox1.6-1.6.57/src/FXToolBarShell.cpp000066400000000000000000000233731326741342000167300ustar00rootroot00000000000000/******************************************************************************** * * * T o o l B a r S h e l l W i d g e t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToolBarShell.cpp,v 1.16 2006/01/22 17:58:48 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXCursor.h" #include "FXToolBarShell.h" /* Notes: - Managed by Window Manager because it needs to stay on top of window. - Window manager may hide it when application does not have focus. - If it has a child and the child is shown, it will show, otherwise it'll hide. - Need some code to allow grabbing of edges to resize [w/o intervention of WM]. - Allow reshaping FXToolbarShell by pulling on edges. */ #define FRAME_MASK (FRAME_SUNKEN|FRAME_RAISED|FRAME_THICK) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXToolBarShell) FXToolBarShellMap[]={ FXMAPFUNC(SEL_PAINT,0,FXToolBarShell::onPaint), }; // Object implementation FXIMPLEMENT(FXToolBarShell,FXTopWindow,FXToolBarShellMap,ARRAYNUMBER(FXToolBarShellMap)) // Make toolbar shell FXToolBarShell::FXToolBarShell(FXWindow* owner,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint hs,FXint vs): FXTopWindow(owner,FXString::null,NULL,NULL,(opts|DECOR_SHRINKABLE|DECOR_STRETCHABLE)&~(DECOR_TITLE|DECOR_MINIMIZE|DECOR_MAXIMIZE|DECOR_CLOSE|DECOR_BORDER|DECOR_MENU),x,y,w,h,0,0,0,0,hs,vs){ baseColor=getApp()->getBaseColor(); hiliteColor=getApp()->getHiliteColor(); shadowColor=getApp()->getShadowColor(); borderColor=getApp()->getBorderColor(); border=(options&FRAME_THICK)?2:(options&(FRAME_SUNKEN|FRAME_RAISED))?1:0; } // Create window void FXToolBarShell::create(){ FXTopWindow::create(); if(getFirst() && getFirst()->shown()) show(); } void FXToolBarShell::drawBorderRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(borderColor); dc.drawRectangle(x,y,w-1,h-1); } void FXToolBarShell::drawRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(shadowColor); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); dc.setForeground(hiliteColor); dc.fillRectangle(x,y,w,1); dc.fillRectangle(x,y,1,h); } void FXToolBarShell::drawSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(shadowColor); dc.fillRectangle(x,y,w,1); dc.fillRectangle(x,y,1,h); dc.setForeground(hiliteColor); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); } void FXToolBarShell::drawRidgeRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(hiliteColor); dc.fillRectangle(x,y,w,1); dc.fillRectangle(x,y,1,h); dc.fillRectangle(x+1,y+h-2,w-2,1); dc.fillRectangle(x+w-2,y+1,1,h-2); dc.setForeground(shadowColor); dc.fillRectangle(x+1,y+1,w-3,1); dc.fillRectangle(x+1,y+1,1,h-3); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); } void FXToolBarShell::drawGrooveRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(shadowColor); dc.fillRectangle(x,y,w,1); dc.fillRectangle(x,y,1,h); dc.fillRectangle(x+1,y+h-2,w-2,1); dc.fillRectangle(x+w-2,y+1,1,h-2); dc.setForeground(hiliteColor); dc.fillRectangle(x+1,y+1,w-3,1); dc.fillRectangle(x+1,y+1,1,h-3); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); } void FXToolBarShell::drawDoubleRaisedRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(baseColor); dc.fillRectangle(x,y,w-1,1); dc.fillRectangle(x,y,1,h-1); dc.setForeground(hiliteColor); dc.fillRectangle(x+1,y+1,w-2,1); dc.fillRectangle(x+1,y+1,1,h-2); dc.setForeground(shadowColor); dc.fillRectangle(x+1,y+h-2,w-2,1); dc.fillRectangle(x+w-2,y+1,1,h-1); dc.setForeground(borderColor); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); } void FXToolBarShell::drawDoubleSunkenRectangle(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ dc.setForeground(shadowColor); dc.fillRectangle(x,y,w-1,1); dc.fillRectangle(x,y,1,h-1); dc.setForeground(borderColor); dc.fillRectangle(x+1,y+1,w-3,1); dc.fillRectangle(x+1,y+1,1,h-3); dc.setForeground(hiliteColor); dc.fillRectangle(x,y+h-1,w,1); dc.fillRectangle(x+w-1,y,1,h); dc.setForeground(baseColor); dc.fillRectangle(x+1,y+h-2,w-2,1); dc.fillRectangle(x+w-2,y+1,1,h-2); } // Draw border void FXToolBarShell::drawFrame(FXDCWindow& dc,FXint x,FXint y,FXint w,FXint h){ switch(options&FRAME_MASK){ case FRAME_LINE: drawBorderRectangle(dc,x,y,w,h); break; case FRAME_SUNKEN: drawSunkenRectangle(dc,x,y,w,h); break; case FRAME_RAISED: drawRaisedRectangle(dc,x,y,w,h); break; case FRAME_GROOVE: drawGrooveRectangle(dc,x,y,w,h); break; case FRAME_RIDGE: drawRidgeRectangle(dc,x,y,w,h); break; case FRAME_SUNKEN|FRAME_THICK: drawDoubleSunkenRectangle(dc,x,y,w,h); break; case FRAME_RAISED|FRAME_THICK: drawDoubleRaisedRectangle(dc,x,y,w,h); break; } } // Handle repaint long FXToolBarShell::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); drawFrame(dc,0,0,width,height); return 1; } // Get width FXint FXToolBarShell::getDefaultWidth(){ register FXWindow* child=getFirst(); register FXuint hints; register FXint w=0; if(child && child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH){ // Fixed width w=child->getWidth(); } else if(hints&LAYOUT_SIDE_LEFT){ // Vertical w=child->getWidthForHeight((hints&LAYOUT_FIX_HEIGHT) ? child->getHeight() : child->getDefaultHeight()); } else{ // Horizontal w=child->getDefaultWidth(); } } return w+(border<<1); } // Get height FXint FXToolBarShell::getDefaultHeight(){ register FXWindow* child=getFirst(); register FXuint hints; register FXint h=0; if(child && child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT){ // Fixed height h=child->getHeight(); } else if(hints&LAYOUT_SIDE_LEFT){ // Vertical h=child->getDefaultHeight(); } else{ // Horizontal h=child->getHeightForWidth((hints&LAYOUT_FIX_WIDTH) ? child->getWidth() : child->getDefaultWidth()); } } return h+(border<<1); } // Recalculate layout void FXToolBarShell::layout(){ if(getFirst()){ if(getFirst()->shown()){ getFirst()->position(border,border,width-(border<<1),height-(border<<1)); show(); } else{ hide(); } } flags&=~FLAG_DIRTY; } // Change frame border style void FXToolBarShell::setFrameStyle(FXuint style){ FXuint opts=(options&~FRAME_MASK) | (style&FRAME_MASK); if(options!=opts){ FXint b=(opts&FRAME_THICK) ? 2 : (opts&(FRAME_SUNKEN|FRAME_RAISED)) ? 1 : 0; options=opts; if(border!=b){ border=b; recalc(); } update(); } } // Get frame style FXuint FXToolBarShell::getFrameStyle() const { return (options&FRAME_MASK); } // Set base color void FXToolBarShell::setBaseColor(FXColor clr){ if(clr!=baseColor){ baseColor=clr; update(); } } // Set highlight color void FXToolBarShell::setHiliteColor(FXColor clr){ if(clr!=hiliteColor){ hiliteColor=clr; update(); } } // Set shadow color void FXToolBarShell::setShadowColor(FXColor clr){ if(clr!=shadowColor){ shadowColor=clr; update(); } } // Set border color void FXToolBarShell::setBorderColor(FXColor clr){ if(clr!=borderColor){ borderColor=clr; update(); } } // Save data void FXToolBarShell::save(FXStream& store) const { FXTopWindow::save(store); store << baseColor; store << hiliteColor; store << shadowColor; store << borderColor; store << border; } // Load data void FXToolBarShell::load(FXStream& store){ FXTopWindow::load(store); store >> baseColor; store >> hiliteColor; store >> shadowColor; store >> borderColor; store >> border; } } fox1.6-1.6.57/src/FXToolBarTab.cpp000066400000000000000000000351171326741342000163660ustar00rootroot00000000000000/******************************************************************************** * * * T o o l B a r T a b O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToolBarTab.cpp,v 1.22 2006/01/22 17:58:48 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXToolBarTab.h" /* To do: */ // Size #define TOOLBARTAB_WIDTH 9 // Width for horizontal toolbar tab #define TOOLBARTAB_HEIGHT 24 // Height for horizontal toolbar tab // Tool Bar Tab styles #define TOOLBARTAB_MASK TOOLBARTAB_VERTICAL using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXToolBarTab) FXToolBarTabMap[]={ FXMAPFUNC(SEL_PAINT,0,FXToolBarTab::onPaint), FXMAPFUNC(SEL_UPDATE,0,FXToolBarTab::onUpdate), FXMAPFUNC(SEL_ENTER,0,FXToolBarTab::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXToolBarTab::onLeave), FXMAPFUNC(SEL_UNGRABBED,0,FXToolBarTab::onUngrabbed), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXToolBarTab::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXToolBarTab::onLeftBtnRelease), FXMAPFUNC(SEL_KEYPRESS,0,FXToolBarTab::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXToolBarTab::onKeyRelease), FXMAPFUNC(SEL_QUERY_TIP,0,FXToolBarTab::onQueryTip), FXMAPFUNC(SEL_UPDATE,FXToolBarTab::ID_COLLAPSE,FXToolBarTab::onUpdCollapse), FXMAPFUNC(SEL_UPDATE,FXToolBarTab::ID_UNCOLLAPSE,FXToolBarTab::onUpdUncollapse), FXMAPFUNC(SEL_COMMAND,FXToolBarTab::ID_COLLAPSE,FXToolBarTab::onCmdCollapse), FXMAPFUNC(SEL_COMMAND,FXToolBarTab::ID_UNCOLLAPSE,FXToolBarTab::onCmdUncollapse), FXMAPFUNC(SEL_COMMAND,FXToolBarTab::ID_SETTIPSTRING,FXToolBarTab::onCmdSetTip), FXMAPFUNC(SEL_COMMAND,FXToolBarTab::ID_GETTIPSTRING,FXToolBarTab::onCmdGetTip), }; // Object implementation FXIMPLEMENT(FXToolBarTab,FXFrame,FXToolBarTabMap,ARRAYNUMBER(FXToolBarTabMap)) // Deserialization FXToolBarTab::FXToolBarTab(){ flags|=FLAG_ENABLED; activeColor=FXRGB(150,156,224); collapsed=FALSE; down=FALSE; } // Construct and init FXToolBarTab::FXToolBarTab(FXComposite* p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXFrame(p,opts,x,y,w,h){ flags|=FLAG_ENABLED; activeColor=FXRGB(150,156,224); target=tgt; message=sel; collapsed=FALSE; down=FALSE; } // If window can have focus bool FXToolBarTab::canFocus() const { return true; } // Enable the window void FXToolBarTab::enable(){ if(!(flags&FLAG_ENABLED)){ FXFrame::enable(); update(); } } // Disable the window void FXToolBarTab::disable(){ if(flags&FLAG_ENABLED){ FXFrame::disable(); update(); } } // Get default width FXint FXToolBarTab::getDefaultWidth(){ FXWindow *sibling=getNext() ? getNext() : getPrev(); FXint w; if(options&TOOLBARTAB_VERTICAL){ // Vertical if(collapsed){ w=TOOLBARTAB_WIDTH; } else{ w=TOOLBARTAB_HEIGHT; if(sibling) w=sibling->getDefaultWidth(); } } else{ // Horizontal if(collapsed){ w=TOOLBARTAB_HEIGHT; if(sibling) w=sibling->getDefaultHeight(); } else{ w=TOOLBARTAB_WIDTH; } } return w; } // Get default height FXint FXToolBarTab::getDefaultHeight(){ FXWindow *sibling=getNext() ? getNext() : getPrev(); FXint h; if(options&TOOLBARTAB_VERTICAL){ // Vertical if(collapsed){ h=TOOLBARTAB_HEIGHT; if(sibling) h=sibling->getDefaultWidth(); } else{ h=TOOLBARTAB_WIDTH; } } else{ // Horizontal if(collapsed){ h=TOOLBARTAB_WIDTH; } else{ h=TOOLBARTAB_HEIGHT; if(sibling) h=sibling->getDefaultHeight(); } } return h; } // Collapse or uncollapse void FXToolBarTab::collapse(FXbool fold,FXbool notify){ FXWindow *sibling; if(fold!=collapsed){ sibling=getNext() ? getNext() : getPrev(); if(sibling){ if(fold){ sibling->hide(); } else{ sibling->show(); } } collapsed=fold; recalc(); update(); if(notify && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)(FXuval)fold); } } // Update long FXToolBarTab::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ FXWindow *sibling=getNext() ? getNext() : getPrev(); FXFrame::onUpdate(sender,sel,ptr); if(sibling){ if(sibling->shown() && collapsed){ collapsed=FALSE; update(); recalc(); } else if(!sibling->shown() && !collapsed){ collapsed=TRUE; update(); recalc(); } } return 1; } // Entered button long FXToolBarTab::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onEnter(sender,sel,ptr); if(isEnabled()){ if(flags&FLAG_PRESSED) down=TRUE; update(); } return 1; } // Leave button long FXToolBarTab::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onLeave(sender,sel,ptr); if(isEnabled()){ if(flags&FLAG_PRESSED) down=FALSE; update(); } return 1; } // Pressed mouse button long FXToolBarTab::onLeftBtnPress(FXObject* sender,FXSelector sel,void* ptr){ if(!FXFrame::onLeftBtnPress(sender,sel,ptr)){ if(isEnabled() && !(flags&FLAG_PRESSED)){ flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; down=TRUE; update(); return 1; } } return 0; } // Released mouse button long FXToolBarTab::onLeftBtnRelease(FXObject* sender,FXSelector sel,void* ptr){ FXbool click=down; if(!FXFrame::onLeftBtnRelease(sender,sel,ptr)){ if(isEnabled() && (flags&FLAG_PRESSED)){ flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; down=FALSE; update(); if(click) collapse(!collapsed,TRUE); return 1; } } return 0; } // The widget lost the grab for some reason long FXToolBarTab::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXFrame::onUngrabbed(sender,sel,ptr); flags&=~FLAG_PRESSED; flags|=FLAG_UPDATE; down=FALSE; update(); return 1; } // Key Press long FXToolBarTab::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; if(isEnabled() && !(flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ down=TRUE; update(); flags|=FLAG_PRESSED; flags&=~FLAG_UPDATE; return 1; } } return 0; } // Key Release long FXToolBarTab::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled() && (flags&FLAG_PRESSED)){ if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; if(event->code==KEY_space || event->code==KEY_KP_Space){ down=FALSE; update(); flags|=FLAG_UPDATE; flags&=~FLAG_PRESSED; collapse(!collapsed,TRUE); return 1; } } return 0; } // Collapse long FXToolBarTab::onCmdCollapse(FXObject*,FXSelector,void*){ collapse(TRUE,TRUE); return 1; } // Update collapse long FXToolBarTab::onUpdCollapse(FXObject* sender,FXSelector,void*){ if(collapsed) sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // Uncollapse long FXToolBarTab::onCmdUncollapse(FXObject*,FXSelector,void*){ collapse(FALSE,TRUE); return 1; } // Update uncollapse long FXToolBarTab::onUpdUncollapse(FXObject* sender,FXSelector,void*){ if(!collapsed) sender->handle(this,FXSEL(SEL_COMMAND,ID_CHECK),NULL); else sender->handle(this,FXSEL(SEL_COMMAND,ID_UNCHECK),NULL); return 1; } // We were asked about tip text long FXToolBarTab::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } return 0; } // Set tip using a message long FXToolBarTab::onCmdSetTip(FXObject*,FXSelector,void* ptr){ setTipText(*((FXString*)ptr)); return 1; } // Get tip using a message long FXToolBarTab::onCmdGetTip(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTipText(); return 1; } // Draw horizontal speckles void FXToolBarTab::drawHSpeckles(FXDCWindow& dc,FXint x,FXint w){ register FXint i; dc.setForeground(hiliteColor); for(i=0; i> activeColor; store >> tip; store >> collapsed; } } fox1.6-1.6.57/src/FXToolTip.cpp000066400000000000000000000217771326741342000157760ustar00rootroot00000000000000/******************************************************************************** * * * T o o l T i p W i d g e t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXToolTip.cpp,v 1.24.2.4 2007/03/08 01:51:53 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxpriv.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXCursor.h" #include "FXToolTip.h" /* Notes: - Initial colors are now obtained from FXApp and therefore from the system registry. - Do not assume root window is at (0,0); multi-monitor machines may have secondary monitor anywhere relative to primary display. - Text length dependent tooltip display by leonard@hipgraphics.com. */ #define HSPACE 4 #define VSPACE 2 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXToolTip) FXToolTipMap[]={ FXMAPFUNC(SEL_PAINT,0,FXToolTip::onPaint), FXMAPFUNC(SEL_UPDATE,0,FXToolTip::onUpdate), FXMAPFUNC(SEL_TIMEOUT,FXToolTip::ID_TIP_SHOW,FXToolTip::onTipShow), FXMAPFUNC(SEL_TIMEOUT,FXToolTip::ID_TIP_HIDE,FXToolTip::onTipHide), FXMAPFUNC(SEL_COMMAND,FXToolTip::ID_SETSTRINGVALUE,FXToolTip::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXToolTip::ID_GETSTRINGVALUE,FXToolTip::onCmdGetStringValue), }; // Object implementation FXIMPLEMENT(FXToolTip,FXShell,FXToolTipMap,ARRAYNUMBER(FXToolTipMap)) // Deserialization FXToolTip::FXToolTip(){ font=NULL; textColor=0; popped=FALSE; } // Create a toplevel window FXToolTip::FXToolTip(FXApp* a,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXShell(a,opts,x,y,w,h),label("Tooltip"){ font=getApp()->getNormalFont(); textColor=getApp()->getTipforeColor(); backColor=getApp()->getTipbackColor(); popped=FALSE; } // Tooltips do override-redirect bool FXToolTip::doesOverrideRedirect() const { return true; } // Tooltips do save-unders bool FXToolTip::doesSaveUnder() const { return true; } #ifdef WIN32 const char* FXToolTip::GetClass() const { return "FXPopup"; } #endif // Create window void FXToolTip::create(){ FXShell::create(); font->create(); } // Detach window void FXToolTip::detach(){ FXShell::detach(); font->detach(); } // Show window void FXToolTip::show(){ FXShell::show(); raise(); } // Get default width FXint FXToolTip::getDefaultWidth(){ const FXchar *beg,*end; FXint w,tw=0; beg=label.text(); if(beg){ do{ end=beg; while(*end!='\0' && *end!='\n') end++; if((w=font->getTextWidth(beg,end-beg))>tw) tw=w; beg=end+1; } while(*end!='\0'); } return tw+HSPACE+HSPACE+2; } // Get default height FXint FXToolTip::getDefaultHeight(){ const FXchar *beg,*end; FXint th=0; beg=label.text(); if(beg){ do{ end=beg; while(*end!='\0' && *end!='\n') end++; th+=font->getFontHeight(); beg=end+1; } while(*end!='\0'); } return th+VSPACE+VSPACE+2; } // Handle repaint long FXToolTip::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); const FXchar *beg,*end; FXint tx,ty; dc.setForeground(backColor); dc.fillRectangle(ev->rect.x,ev->rect.y,ev->rect.w,ev->rect.h); dc.setForeground(textColor); dc.setFont(font); dc.drawRectangle(0,0,width-1,height-1); beg=label.text(); if(beg){ tx=1+HSPACE; ty=1+VSPACE+font->getFontAscent(); do{ end=beg; while(*end!='\0' && *end!='\n') end++; dc.drawText(tx,ty,beg,end-beg); ty+=font->getFontHeight(); beg=end+1; } while(*end!='\0'); } return 1; } // Place the tool tip void FXToolTip::place(FXint x,FXint y){ FXint rx,ry,rw,rh,px,py,w,h; w=getDefaultWidth(); h=getDefaultHeight(); #ifndef WIN32 rx=getRoot()->getX(); ry=getRoot()->getY(); rw=getRoot()->getWidth(); rh=getRoot()->getHeight(); #else RECT rect; MYMONITORINFO minfo; HANDLE monitor; rect.left=x; rect.right=x+w; rect.top=y; rect.bottom=y+h; // Get monitor info if we have this API monitor=fxMonitorFromRect(&rect,MONITOR_DEFAULTTOPRIMARY); if(monitor){ memset(&minfo,0,sizeof(minfo)); minfo.cbSize=sizeof(minfo); fxGetMonitorInfo(monitor,&minfo); rx=minfo.rcWork.left; ry=minfo.rcWork.top; rw=minfo.rcWork.right-minfo.rcWork.left; rh=minfo.rcWork.bottom-minfo.rcWork.top; } // Otherwise use the work-area else{ SystemParametersInfo(SPI_GETWORKAREA,sizeof(RECT),&rect,0); rx=rect.left; ry=rect.top; rw=rect.right-rect.left; rh=rect.bottom-rect.top; } #endif px=x+16-w/3; py=y+20; if(pxrx+rw) px=rx+rw-w; if(py+h+50>ry+rh){ py=y-h-10; } position(px,py,w,h); } // Automatically place tooltip void FXToolTip::autoplace(){ FXint x,y; FXuint state; getRoot()->getCursorPosition(x,y,state); place(x,y); } // Update tooltip based on widget under cursor long FXToolTip::onUpdate(FXObject* sender,FXSelector sel,void* ptr){ FXWindow *helpsource=getApp()->getCursorWindow(); // Regular GUI update FXWindow::onUpdate(sender,sel,ptr); // Ask the help source for a new status text first if(helpsource && helpsource->handle(this,FXSEL(SEL_QUERY_TIP,0),NULL)){ if(!popped){ popped=TRUE; if(!shown()){ getApp()->addTimeout(this,ID_TIP_SHOW,getApp()->getTooltipPause()); return 1; } autoplace(); } return 1; } getApp()->removeTimeout(this,ID_TIP_SHOW); popped=FALSE; hide(); return 1; } // Pop the tool tip now long FXToolTip::onTipShow(FXObject*,FXSelector,void*){ if(!label.empty()){ autoplace(); show(); if(!(options&TOOLTIP_PERMANENT)){ FXint timeoutms=getApp()->getTooltipTime(); if(options&TOOLTIP_VARIABLE){ timeoutms=timeoutms/4+(timeoutms*label.length())/64; } getApp()->addTimeout(this,ID_TIP_HIDE,timeoutms); } } return 1; } // Tip should hide now long FXToolTip::onTipHide(FXObject*,FXSelector,void*){ hide(); return 1; } // Change value long FXToolTip::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setText(*((FXString*)ptr)); return 1; } // Obtain value long FXToolTip::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getText(); return 1; } // Change text void FXToolTip::setText(const FXString& text){ if(label!=text){ label=text; recalc(); popped=FALSE; // If text changes, pop it up again update(); } } // Change the font void FXToolTip::setFont(FXFont *fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Set text color void FXToolTip::setTextColor(FXColor clr){ if(clr!=textColor){ textColor=clr; update(); } } // Save data void FXToolTip::save(FXStream& store) const { FXShell::save(store); store << label; store << font; store << textColor; } // Load data void FXToolTip::load(FXStream& store){ FXShell::load(store); store >> label; store >> font; store >> textColor; } // Destroy label FXToolTip::~FXToolTip(){ getApp()->removeTimeout(this,ID_TIP_SHOW); getApp()->removeTimeout(this,ID_TIP_HIDE); font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXTopWindow.cpp000066400000000000000000001324141326741342000163250ustar00rootroot00000000000000/******************************************************************************** * * * T o p W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTopWindow.cpp,v 1.175.2.8 2008/05/08 02:00:07 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxpriv.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXCursor.h" #include "FXIcon.h" #include "FXTopWindow.h" #include "FXMainWindow.h" #include "FXToolBar.h" #include "FXToolBarGrip.h" #include "FX88591Codec.h" /* Notes: - Handle zero width/height case similar to FXWindow. - Pass Size Hints to Window Manager as per ICCCM. - Add padding options, as this is convenient for FXDialogBox subclasses; for FXTopWindow/FXMainWindow, padding should default to 0, for FXDialogBox, default to something easthetically pleasing... - Now observes LAYOUT_FIX_X and LAYOUT_FIX_Y hints. - LAYOUT_FIX_WIDTH and LAYOUT_FIX_HEIGHT take precedence over PACK_UNIFORM_WIDTH and PACK_UNIFORM_HEIGHT! */ // Definitions for Motif-style WM Hints. #ifndef WIN32 #define MWM_HINTS_FUNCTIONS (1L << 0) // Definitions for FXMotifHints.flags #define MWM_HINTS_DECORATIONS (1L << 1) #define MWM_HINTS_INPUT_MODE (1L << 2) #define MWM_HINTS_ALL (MWM_HINTS_FUNCTIONS|MWM_HINTS_DECORATIONS|MWM_HINTS_INPUT_MODE) #define MWM_FUNC_ALL (1L << 0) // Definitions for FXMotifHints.functions #define MWM_FUNC_RESIZE (1L << 1) #define MWM_FUNC_MOVE (1L << 2) #define MWM_FUNC_MINIMIZE (1L << 3) #define MWM_FUNC_MAXIMIZE (1L << 4) #define MWM_FUNC_CLOSE (1L << 5) #define MWM_DECOR_ALL (1L << 0) // Definitions for FXMotifHints.decorations #define MWM_DECOR_BORDER (1L << 1) #define MWM_DECOR_RESIZEH (1L << 2) #define MWM_DECOR_TITLE (1L << 3) #define MWM_DECOR_MENU (1L << 4) #define MWM_DECOR_MINIMIZE (1L << 5) #define MWM_DECOR_MAXIMIZE (1L << 6) #define MWM_INPUT_MODELESS 0 // Values for FXMotifHints.inputmode #define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1 #define MWM_INPUT_SYSTEM_MODAL 2 #define MWM_INPUT_FULL_APPLICATION_MODAL 3 #endif // Side layout modes #define LAYOUT_SIDE_MASK (LAYOUT_SIDE_LEFT|LAYOUT_SIDE_RIGHT|LAYOUT_SIDE_TOP|LAYOUT_SIDE_BOTTOM) // Layout modes #define LAYOUT_MASK (LAYOUT_SIDE_MASK|LAYOUT_RIGHT|LAYOUT_CENTER_X|LAYOUT_BOTTOM|LAYOUT_CENTER_Y|LAYOUT_FIX_X|LAYOUT_FIX_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y) #define DISPLAY(app) ((Display*)((app)->display)) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXTopWindow) FXTopWindowMap[]={ FXMAPFUNC(SEL_CLOSE,0,FXTopWindow::onCmdClose), FXMAPFUNC(SEL_FOCUS_UP,0,FXTopWindow::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXTopWindow::onFocusDown), FXMAPFUNC(SEL_FOCUS_LEFT,0,FXTopWindow::onFocusLeft), FXMAPFUNC(SEL_FOCUS_RIGHT,0,FXTopWindow::onFocusRight), FXMAPFUNC(SEL_SESSION_NOTIFY,0,FXTopWindow::onSessionNotify), FXMAPFUNC(SEL_SESSION_CLOSED,0,FXTopWindow::onSessionClosed), FXMAPFUNC(SEL_CHORE,FXTopWindow::ID_CLOSE,FXTopWindow::onCmdClose), FXMAPFUNC(SEL_SIGNAL,FXTopWindow::ID_CLOSE,FXTopWindow::onCmdClose), FXMAPFUNC(SEL_TIMEOUT,FXTopWindow::ID_CLOSE,FXTopWindow::onCmdClose), FXMAPFUNC(SEL_COMMAND,FXTopWindow::ID_CLOSE,FXTopWindow::onCmdClose), FXMAPFUNC(SEL_COMMAND,FXTopWindow::ID_MAXIMIZE,FXTopWindow::onCmdMaximize), FXMAPFUNC(SEL_COMMAND,FXTopWindow::ID_MINIMIZE,FXTopWindow::onCmdMinimize), FXMAPFUNC(SEL_COMMAND,FXTopWindow::ID_RESTORE,FXTopWindow::onCmdRestore), FXMAPFUNC(SEL_COMMAND,FXTopWindow::ID_SETSTRINGVALUE,FXTopWindow::onCmdSetStringValue), FXMAPFUNC(SEL_COMMAND,FXTopWindow::ID_GETSTRINGVALUE,FXTopWindow::onCmdGetStringValue), FXMAPFUNC(SEL_COMMAND,FXTopWindow::ID_SETICONVALUE,FXTopWindow::onCmdSetIconValue), FXMAPFUNC(SEL_COMMAND,FXTopWindow::ID_GETICONVALUE,FXTopWindow::onCmdGetIconValue), }; // Object implementation FXIMPLEMENT_ABSTRACT(FXTopWindow,FXShell,FXTopWindowMap,ARRAYNUMBER(FXTopWindowMap)) // Deserialization FXTopWindow::FXTopWindow(){ icon=NULL; miniIcon=NULL; padtop=0; padbottom=0; padleft=0; padright=0; hspacing=0; vspacing=0; } // Create toplevel window object & add to toplevel window list FXTopWindow::FXTopWindow(FXApp* ap,const FXString& name,FXIcon *ic,FXIcon *mi,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXShell(ap,opts,x,y,w,h){ title=name; icon=ic; miniIcon=mi; accelTable=new FXAccelTable; padtop=pt; padbottom=pb; padleft=pl; padright=pr; hspacing=hs; vspacing=vs; } // Create toplevel window object & add to toplevel window list FXTopWindow::FXTopWindow(FXWindow* ow,const FXString& name,FXIcon *ic,FXIcon *mi,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXShell(ow,opts,x,y,w,h){ title=name; icon=ic; miniIcon=mi; accelTable=new FXAccelTable; padtop=pt; padbottom=pb; padleft=pl; padright=pr; hspacing=hs; vspacing=vs; } #ifdef WIN32 const char* FXTopWindow::GetClass() const { return "FXTopWindow"; } #endif // Create window void FXTopWindow::create(){ FXShell::create(); // Create icons if(icon) icon->create(); if(miniIcon) miniIcon->create(); // Register string types if(!utf8Type){ utf8Type=getApp()->registerDragType(utf8TypeName); } if(xid){ if(getApp()->isInitialized()){ // Set title settitle(); // Set decorations setdecorations(); // Set icon for X-Windows seticons(); // Only shrinkable; size may not be above default size if((options&DECOR_SHRINKABLE) && !(options&DECOR_STRETCHABLE)){ if(width>getDefaultWidth()) width=getDefaultWidth(); if(height>getDefaultHeight()) height=getDefaultHeight(); } // Only stretchable; size may not be below default size else if((options&DECOR_STRETCHABLE) && !(options&DECOR_SHRINKABLE)){ if(widthwmDeleteWindow; protocols[1]=getApp()->wmTakeFocus; protocols[2]=getApp()->wmNetPing; XSetWMProtocols(DISPLAY(getApp()),xid,protocols,3); // Catch delete window #endif } } } // Detach window void FXTopWindow::detach(){ FXShell::detach(); if(icon) icon->detach(); if(miniIcon) miniIcon->detach(); } // Destroy window void FXTopWindow::destroy(){ if(xid){ if(getApp()->isInitialized()){ #ifdef WIN32 HICON icold; if((icold=(HICON)SendMessage((HWND)xid,WM_SETICON,ICON_BIG,0))!=0){ DestroyIcon(icold); } if((icold=(HICON)SendMessage((HWND)xid,WM_SETICON,ICON_SMALL,0))!=0){ DestroyIcon(icold); } #endif } } FXShell::destroy(); } // Focus to this toplevel window void FXTopWindow::setFocus(){ FXShell::setFocus(); if(xid){ #ifdef WIN32 SetActiveWindow((HWND)xid); #else XSetInputFocus(DISPLAY(getApp()),xid,RevertToPointerRoot,CurrentTime); #endif } } // Focus away from this toplevel window void FXTopWindow::killFocus(){ FXShell::killFocus(); if(xid){ #ifdef WIN32 if(GetActiveWindow()==(HWND)xid){ if(getOwner() && getOwner()->id()){ FXTRACE((100,"focus back to owner\n")); SetActiveWindow((HWND)getOwner()->getShell()->id()); // Fix from Sander } } #else Window win; int dum; XGetInputFocus(DISPLAY(getApp()),&win,&dum); if(win==xid){ if(getOwner() && getOwner()->id()){ FXTRACE((100,"focus back to owner\n")); XSetInputFocus(DISPLAY(getApp()),getOwner()->id(),RevertToPointerRoot,CurrentTime); } else{ FXTRACE((100,"focus back to NULL\n")); XSetInputFocus(DISPLAY(getApp()),PointerRoot,RevertToPointerRoot,CurrentTime); } } #endif } } // Show and raise window void FXTopWindow::show(){ FXShell::show(); raise(); } // Show and raise window, placed properly on the screen void FXTopWindow::show(FXuint placement){ place(placement); FXShell::show(); raise(); } // Hide window void FXTopWindow::hide(){ if(flags&FLAG_SHOWN){ killFocus(); flags&=~FLAG_SHOWN; if(xid){ #ifdef WIN32 ShowWindow((HWND)xid,SW_HIDE); #else XWithdrawWindow(DISPLAY(getApp()),xid,DefaultScreen(DISPLAY(getApp()))); #endif } } } // Raise and make foreground window void FXTopWindow::raise(){ FXShell::raise(); if(xid){ #ifdef WIN32 SetForegroundWindow((HWND)xid); #endif } } // Position the window based on placement void FXTopWindow::place(FXuint placement){ FXint rx,ry,rw,rh,ox,oy,ow,oh,wx,wy,ww,wh,x,y; FXuint state; FXWindow *over; // Default placement:- leave it where it was wx=getX(); wy=getY(); ww=getWidth(); wh=getHeight(); // Get root window size #ifdef WIN32 RECT rect; MYMONITORINFO minfo; HANDLE monitor; // Use mouse position to select screen if(placement!=PLACEMENT_OWNER){ getRoot()->getCursorPosition(x,y,state); rect.left=x; rect.right=x+1; rect.top=y; rect.bottom=y+1; } // Use owner to select screen else{ over=getOwner()?getOwner():getRoot(); over->translateCoordinatesTo(ox,oy,getRoot(),0,0); ow=over->getWidth(); oh=over->getHeight(); rect.left=ox; rect.right=ox+ow; rect.top=oy; rect.bottom=oy+oh; } // Get monitor info if we have this API monitor=fxMonitorFromRect(&rect,MONITOR_DEFAULTTOPRIMARY); if(monitor){ memset(&minfo,0,sizeof(minfo)); minfo.cbSize=sizeof(minfo); fxGetMonitorInfo(monitor,&minfo); rx=minfo.rcWork.left; ry=minfo.rcWork.top; rw=minfo.rcWork.right-minfo.rcWork.left; rh=minfo.rcWork.bottom-minfo.rcWork.top; } // Otherwise use the work-area else{ SystemParametersInfo(SPI_GETWORKAREA,sizeof(RECT),&rect,0); rx=rect.left; ry=rect.top; rw=rect.right-rect.left; rh=rect.bottom-rect.top; } #else rx=getRoot()->getX(); ry=getRoot()->getY(); rw=getRoot()->getWidth(); rh=getRoot()->getHeight(); #endif // Placement policy switch(placement){ // Place such that it contains the cursor case PLACEMENT_CURSOR: // Get dialog location in root coordinates translateCoordinatesTo(wx,wy,getRoot(),0,0); // Where's the mouse? getRoot()->getCursorPosition(x,y,state); // Place such that mouse in the middle, placing it as // close as possible in the center of the owner window. // Don't move the window unless the mouse is not inside. if(!shown() || xgetWidth(); oh=over->getHeight(); // Owner's coordinates to root coordinates over->translateCoordinatesTo(ox,oy,getRoot(),0,0); // Adjust position wx=ox+(ow-ww)/2; wy=oy+(oh-wh)/2; // Move by the minimal amount if(xrx+rw) wx=rx+rw-ww-10; if(wy+wh>ry+rh) wy=ry+rh-wh-10; break; // Place centered over the owner case PLACEMENT_OWNER: // Get the owner over=getOwner()?getOwner():getRoot(); // Get owner window size ow=over->getWidth(); oh=over->getHeight(); // Owner's coordinates to root coordinates over->translateCoordinatesTo(ox,oy,getRoot(),0,0); // Adjust position wx=ox+(ow-ww)/2; wy=oy+(oh-wh)/2; // Adjust so dialog is fully visible if(wxrx+rw) wx=rx+rw-ww-10; if(wy+wh>ry+rh) wy=ry+rh-wh-10; break; // Place centered on the screen case PLACEMENT_SCREEN: // Adjust position wx=rx+(rw-ww)/2; wy=ry+(rh-wh)/2; break; // Place to make it fully visible case PLACEMENT_VISIBLE: // Adjust so dialog is fully visible if(wxrx+rw) wx=rx+rw-ww-10; if(wy+wh>ry+rh) wy=ry+rh-wh-10; break; // Place maximized case PLACEMENT_MAXIMIZED: wx=rx; wy=ry; ww=rw; // Yes, I know:- we should substract the borders; wh=rh; // trouble is, no way to know how big those are.... break; // Default placement case PLACEMENT_DEFAULT: default: break; } // Place it position(wx,wy,ww,wh); } // Set large icon(s) void FXTopWindow::seticons(){ #ifdef WIN32 HICON icold,icnew; icnew=NULL; if(icon){ ICONINFO iconinfo; iconinfo.fIcon=true; iconinfo.xHotspot=0; iconinfo.yHotspot=0; iconinfo.hbmMask=(HBITMAP)icon->shape; iconinfo.hbmColor=(HBITMAP)icon->xid; icnew=CreateIconIndirect(&iconinfo); } if((icold=(HICON)SendMessage((HWND)xid,WM_SETICON,ICON_BIG,(LPARAM)icnew))!=0){ DestroyIcon(icold); } icnew=NULL; if(miniIcon){ ICONINFO iconinfo; iconinfo.fIcon=true; iconinfo.xHotspot=0; iconinfo.yHotspot=0; iconinfo.hbmMask=(HBITMAP)miniIcon->shape; iconinfo.hbmColor=(HBITMAP)miniIcon->xid; icnew=CreateIconIndirect(&iconinfo); } if((icold=(HICON)SendMessage((HWND)xid,WM_SETICON,ICON_SMALL,(LPARAM)icnew))!=0){ DestroyIcon(icold); } #else FXWindow *own=this; XWMHints wmhints; wmhints.flags=InputHint|StateHint; wmhints.input=true; // True, but ICCCM says it should be false.... wmhints.initial_state=NormalState; if(icon){ if(!icon->xid || !icon->shape){ fxerror("%s::setIcon: illegal icon specified.\n",getClassName()); } wmhints.flags|=IconPixmapHint|IconMaskHint; wmhints.icon_pixmap=icon->xid; wmhints.icon_mask=icon->shape; } else if(miniIcon){ if(!miniIcon->xid || !miniIcon->shape){ fxerror("%s::setMiniIcon: illegal icon specified.\n",getClassName()); } wmhints.flags|=IconPixmapHint|IconMaskHint; wmhints.icon_pixmap=miniIcon->xid; wmhints.icon_mask=miniIcon->shape; } while(own->getOwner()){ // Find the ultimate owner of the whole chain own=own->getOwner(); } if(own && own->id()){ // Set the window_group id; all windows in the group should be iconified together wmhints.flags|=WindowGroupHint; wmhints.window_group=own->id(); } XSetWMHints(DISPLAY(getApp()),xid,&wmhints); #endif } // Set title void FXTopWindow::settitle(){ if(!title.empty()){ #ifdef WIN32 #ifdef UNICODE FXnchar titlewide[1024]; utf2ncs(titlewide,title.text(),title.length()+1); SetWindowTextW((HWND)xid,titlewide); #else SetWindowTextA((HWND)xid,title.text()); #endif #else FX88591Codec ascii; FXString string=ascii.utf2mb(title); XTextProperty t; if(XStringListToTextProperty((char**)&string,1,&t)){ XSetWMIconName(DISPLAY(getApp()),xid,&t); XSetWMName(DISPLAY(getApp()),xid,&t); XFree(t.value); } // Extended window manager hint for true unicode name in title XChangeProperty(DISPLAY(getApp()),xid,getApp()->wmNetIconName,utf8Type,8,PropModeReplace,(unsigned char*)title.text(),title.length()); XChangeProperty(DISPLAY(getApp()),xid,getApp()->wmNetWindowName,utf8Type,8,PropModeReplace,(unsigned char*)title.text(),title.length()); #endif } } // Set decorations void FXTopWindow::setdecorations(){ #ifdef WIN32 // Get old style DWORD dwStyle=GetWindowLong((HWND)xid,GWL_STYLE); RECT rect; // Moved here just in case the size changes behind our backs SetRect(&rect,0,0,width,height); // Change style setting; note, under Windows, if we want a minimize, // maximize, or close button, we also need a window menu style as well. // Also, if you want a title, you will need a border. if(options&DECOR_BORDER) dwStyle|=WS_BORDER; else dwStyle&=~WS_BORDER; if(options&DECOR_TITLE) dwStyle|=WS_CAPTION; else dwStyle&=~WS_DLGFRAME; if(options&DECOR_RESIZE) dwStyle|=WS_THICKFRAME; else dwStyle&=~WS_THICKFRAME; if(options&DECOR_MENU) dwStyle|=WS_SYSMENU; else dwStyle&=~WS_SYSMENU; if(options&DECOR_CLOSE) dwStyle|=WS_SYSMENU; if(options&DECOR_MINIMIZE) dwStyle|=(WS_MINIMIZEBOX|WS_SYSMENU); else dwStyle&=~WS_MINIMIZEBOX; if(options&DECOR_MAXIMIZE) dwStyle|=(WS_MAXIMIZEBOX|WS_SYSMENU); else dwStyle&=~WS_MAXIMIZEBOX; // Set new style SetWindowLong((HWND)xid,GWL_STYLE,dwStyle); // Patch from Stephane Ancelot and Sander Jansen HMENU sysmenu=GetSystemMenu((HWND)xid,false); if(sysmenu){ if(options&DECOR_CLOSE) EnableMenuItem(sysmenu,SC_CLOSE,MF_ENABLED); else EnableMenuItem(sysmenu,SC_CLOSE,MF_GRAYED); } // Moved here just in case SetWindowLong GWL_STYLE has changed // the GWL_EXSTYLE behind the scenes... DWORD dwExStyle=GetWindowLong((HWND)xid,GWL_EXSTYLE); // Adjust non-client area size based on new style AdjustWindowRectEx(&rect,dwStyle,false,dwExStyle); SetWindowPos((HWND)xid,NULL,0,0,FXMAX(rect.right-rect.left,1),FXMAX(rect.bottom-rect.top,1),SWP_NOMOVE|SWP_NOZORDER|SWP_NOOWNERZORDER); RedrawWindow((HWND)xid,NULL,NULL,RDW_FRAME|RDW_INVALIDATE); #else struct { long flags; long functions; long decorations; long inputmode; } prop; prop.flags=MWM_HINTS_FUNCTIONS|MWM_HINTS_DECORATIONS|MWM_HINTS_INPUT_MODE; prop.decorations=0; prop.functions=MWM_FUNC_MOVE; prop.inputmode=MWM_INPUT_MODELESS; if(options&DECOR_TITLE){ prop.decorations|=MWM_DECOR_TITLE; } if(options&DECOR_MINIMIZE){ prop.decorations|=MWM_DECOR_MINIMIZE; prop.functions|=MWM_FUNC_MINIMIZE; } if(options&DECOR_MAXIMIZE){ prop.decorations|=MWM_DECOR_MAXIMIZE; prop.functions|=MWM_FUNC_MAXIMIZE; } if(options&DECOR_CLOSE){ prop.functions|=MWM_FUNC_CLOSE; } if(options&DECOR_BORDER){ prop.decorations|=MWM_DECOR_BORDER; } if(options&(DECOR_SHRINKABLE|DECOR_STRETCHABLE)){ if(options&DECOR_BORDER) prop.decorations|=MWM_DECOR_RESIZEH; // Only grips if border prop.functions|=MWM_FUNC_RESIZE; } if(options&DECOR_MENU){ prop.decorations|=MWM_DECOR_MENU; prop.functions|=MWM_FUNC_RESIZE; } XChangeProperty(DISPLAY(getApp()),xid,getApp()->wmMotifHints,getApp()->wmMotifHints,32,PropModeReplace,(unsigned char*)&prop,4); #endif } // Obtain border sizes added to our window by the window manager FXbool FXTopWindow::getWMBorders(FXint& left,FXint& right,FXint& top,FXint& bottom){ left=right=top=bottom=0; if(xid){ #ifdef WIN32 #if(WINVER >= 0x0500) WINDOWINFO wi; GetWindowInfo((HWND)xid,&wi); left=wi.rcClient.left-wi.rcWindow.left; top=wi.rcClient.top-wi.rcWindow.top; right=wi.rcWindow.right-wi.rcClient.right; bottom=wi.rcWindow.bottom-wi.rcClient.bottom; #endif #else unsigned int sx,sy,msx,msy,cn,border,depth; Window w,rw,pw,*cw; int ox,oy; w=xid; XGetGeometry(DISPLAY(getApp()),w,&rw,&ox,&oy,&msx,&msy,&border,&depth); do{ XQueryTree(DISPLAY(getApp()),w,&rw,&pw,&cw,&cn); XFree(cw); XGetGeometry(DISPLAY(getApp()),w,&rw,&ox,&oy,&sx,&sy,&border,&depth); if(pw!=rw){ left+=ox; top+=oy; } w=pw; } while(w!=rw); right=(sx-msx-left); bottom=(sy-msy-top); #endif return TRUE; } return FALSE; } // Change decorations void FXTopWindow::setDecorations(FXuint decorations){ FXuint opts=(options&~DECOR_ALL) | (decorations&DECOR_ALL); if(options!=opts){ options=opts; if(xid) setdecorations(); recalc(); } } // Get decorations FXuint FXTopWindow::getDecorations() const { return options&DECOR_ALL; } // Iconify window FXbool FXTopWindow::maximize(FXbool notify){ if(!isMaximized()){ if(xid){ #ifdef WIN32 ShowWindow((HWND)xid,SW_MAXIMIZE); #else XEvent se; se.xclient.type=ClientMessage; se.xclient.display=DISPLAY(getApp()); se.xclient.message_type=getApp()->wmNetState; se.xclient.format=32; se.xclient.window=xid; se.xclient.data.l[0]=2; // 0=_NET_WM_STATE_REMOVE, 1=_NET_WM_STATE_ADD, 2=_NET_WM_STATE_TOGGLE se.xclient.data.l[1]=getApp()->wmNetHMaximized; se.xclient.data.l[2]=getApp()->wmNetVMaximized; se.xclient.data.l[3]=0; se.xclient.data.l[4]=0; XSendEvent(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),false,SubstructureRedirectMask|SubstructureNotifyMask,&se); XMapWindow(DISPLAY(getApp()),xid); #endif } if(notify && target){target->tryHandle(this,FXSEL(SEL_MAXIMIZE,message),NULL);} return TRUE; } return FALSE; } // Miminize or iconify window FXbool FXTopWindow::minimize(FXbool notify){ if(!isMinimized()){ if(xid){ #ifdef WIN32 ShowWindow((HWND)xid,SW_MINIMIZE); #else XIconifyWindow(DISPLAY(getApp()),xid,DefaultScreen(DISPLAY(getApp()))); #endif } if(notify && target){target->tryHandle(this,FXSEL(SEL_MINIMIZE,message),NULL);} return TRUE; } return FALSE; } // Restore window FXbool FXTopWindow::restore(FXbool notify){ if(isMinimized() || isMaximized()){ if(xid){ #ifdef WIN32 ShowWindow((HWND)xid,SW_RESTORE); #else XEvent se; se.xclient.type=ClientMessage; se.xclient.display=DISPLAY(getApp()); se.xclient.message_type=getApp()->wmNetState; se.xclient.format=32; se.xclient.window=xid; se.xclient.data.l[0]=0; // 0=_NET_WM_STATE_REMOVE, 1=_NET_WM_STATE_ADD, 2=_NET_WM_STATE_TOGGLE se.xclient.data.l[1]=getApp()->wmNetHMaximized; se.xclient.data.l[2]=getApp()->wmNetVMaximized; se.xclient.data.l[3]=0; se.xclient.data.l[4]=0; XSendEvent(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),False,SubstructureRedirectMask|SubstructureNotifyMask,&se); XMapWindow(DISPLAY(getApp()),xid); #endif } if(notify && target){target->tryHandle(this,FXSEL(SEL_RESTORE,message),NULL);} return TRUE; } return FALSE; } // Attempt to close the window, return TRUE if actually closed FXbool FXTopWindow::close(FXbool notify){ register FXWindow *window; // Ask target if desired if(!notify || !target || !target->tryHandle(this,FXSEL(SEL_CLOSE,message),NULL)){ // Target will receive no further messages from us setTarget(NULL); setSelector(0); // If there was another main level window still visible, that's all we do for(window=getRoot()->getFirst(); window; window=window->getNext()){ if(window!=this && window->isMemberOf(FXMETACLASS(FXMainWindow))){ goto x; } } // We've just hidden the last remaining top level window:- quit the application getApp()->handle(this,FXSEL(SEL_COMMAND,FXApp::ID_QUIT),NULL); // Self destruct x: delete this; // Was closed return TRUE; } return FALSE; } // Return TRUE if window has been maximized FXbool FXTopWindow::isMaximized() const { FXbool maximized=FALSE; if(xid){ #ifndef WIN32 unsigned long nitems,after,i; FXID *netstate; Atom actualtype; int actualformat; // For Window Managers supporting the Extended Window Manager Hints // See http://www.freedesktop.org/ for the official documentation of EWMH if(Success==XGetWindowProperty(DISPLAY(getApp()),xid,getApp()->wmNetState,0,2,FALSE,AnyPropertyType,&actualtype,&actualformat,&nitems,&after,(unsigned char**)&netstate)){ if(actualtype==XA_ATOM && actualformat==32){ FXTRACE((100,"got _NET_WM_STATE property\n")); for(i=0; iwmNetHMaximized) maximized=TRUE; if(netstate[i]==getApp()->wmNetVMaximized) maximized=TRUE; } FXTRACE((100,"maximized=%d\n",maximized)); } XFree((char*)netstate); } #else maximized=IsZoomed((HWND)xid); #endif } return maximized; } // Return TRUE if window has been minimized FXbool FXTopWindow::isMinimized() const { FXbool minimized=FALSE; if(xid){ #ifndef WIN32 unsigned long length,after; unsigned char *prop; Atom actualtype; int actualformat; // This is ICCCM compliant method to ask about WM_STATE if(Success==XGetWindowProperty(DISPLAY(getApp()),xid,getApp()->wmState,0,2,FALSE,AnyPropertyType,&actualtype,&actualformat,&length,&after,&prop)){ if(actualformat==32){ minimized=(IconicState==*((FXuint*)prop)); } XFree((char*)prop); } #else minimized=IsIconic((HWND)xid); #endif } return minimized; } // Request for toplevel window move void FXTopWindow::move(FXint x,FXint y){ if((x!=xpos) || (y!=ypos)){ xpos=x; ypos=y; if(xid){ #ifdef WIN32 RECT rect; SetRect(&rect,xpos,ypos,0,0); DWORD dwStyle=GetWindowLong((HWND)xid,GWL_STYLE); DWORD dwExStyle=GetWindowLong((HWND)xid,GWL_EXSTYLE); AdjustWindowRectEx(&rect,dwStyle,false,dwExStyle); // Calculate based on *client* rectangle SetWindowPos((HWND)xid,NULL,rect.left,rect.top,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER); #else XWindowChanges cw; cw.x=xpos; cw.y=ypos; XReconfigureWMWindow(DISPLAY(getApp()),xid,DefaultScreen(DISPLAY(getApp())),CWX|CWY,&cw); #endif } } } // Request for toplevel window resize void FXTopWindow::resize(FXint w,FXint h){ if((flags&FLAG_DIRTY) || (w!=width) || (h!=height)){ width=FXMAX(w,1); height=FXMAX(h,1); if(xid){ #ifdef WIN32 RECT rect; SetRect(&rect,0,0,width,height); DWORD dwStyle=GetWindowLong((HWND)xid,GWL_STYLE); DWORD dwExStyle=GetWindowLong((HWND)xid,GWL_EXSTYLE); AdjustWindowRectEx(&rect,dwStyle,false,dwExStyle); // Calculate based on *client* rectangle SetWindowPos((HWND)xid,NULL,0,0,FXMAX(rect.right-rect.left,1),FXMAX(rect.bottom-rect.top,1),SWP_NOMOVE|SWP_NOZORDER|SWP_NOOWNERZORDER); #else XWindowChanges changes; XSizeHints size; size.flags=USSize|PSize|PWinGravity|USPosition|PPosition; size.x=xpos; size.y=ypos; size.width=width; size.height=height; size.min_width=0; size.min_height=0; size.max_width=0; size.max_height=0; size.width_inc=0; size.height_inc=0; size.min_aspect.x=0; size.min_aspect.y=0; size.max_aspect.x=0; size.max_aspect.y=0; size.base_width=0; size.base_height=0; size.win_gravity=NorthWestGravity; // Tim Alexeevsky size.win_gravity=StaticGravity; // Account for border (ICCCM) if(!(options&DECOR_SHRINKABLE)){ if(!(options&DECOR_STRETCHABLE)){ // Cannot change at all size.flags|=PMinSize|PMaxSize; size.min_width=size.max_width=width; size.min_height=size.max_height=height; } else{ // Cannot get smaller than default size.flags|=PMinSize; size.min_width=getDefaultWidth(); size.min_height=getDefaultHeight(); } } else if(!(options&DECOR_STRETCHABLE)){ // Cannot get larger than default size.flags|=PMaxSize; size.max_width=getDefaultWidth(); size.max_height=getDefaultHeight(); } XSetWMNormalHints(DISPLAY(getApp()),xid,&size); changes.x=0; changes.y=0; changes.width=width; changes.height=height; changes.border_width=0; changes.sibling=None; changes.stack_mode=Above; XReconfigureWMWindow(DISPLAY(getApp()),xid,DefaultScreen(DISPLAY(getApp())),CWWidth|CWHeight,&changes); #endif layout(); } } } // Request for toplevel window reposition void FXTopWindow::position(FXint x,FXint y,FXint w,FXint h){ if((flags&FLAG_DIRTY) || (x!=xpos) || (y!=ypos) || (w!=width) || (h!=height)){ xpos=x; ypos=y; width=FXMAX(w,1); height=FXMAX(h,1); if(xid){ #ifdef WIN32 RECT rect; SetRect(&rect,xpos,ypos,xpos+width,ypos+height); DWORD dwStyle=GetWindowLong((HWND)xid,GWL_STYLE); DWORD dwExStyle=GetWindowLong((HWND)xid,GWL_EXSTYLE); AdjustWindowRectEx(&rect,dwStyle,false,dwExStyle); // Calculate based on *client* rectangle SetWindowPos((HWND)xid,NULL,rect.left,rect.top,FXMAX(rect.right-rect.left,1),FXMAX(rect.bottom-rect.top,1),SWP_NOZORDER|SWP_NOOWNERZORDER); #else XWindowChanges changes; XSizeHints size; size.flags=USSize|PSize|PWinGravity|USPosition|PPosition; size.x=xpos; size.y=ypos; size.width=width; size.height=height; size.min_width=0; size.min_height=0; size.max_width=0; size.max_height=0; size.width_inc=0; size.height_inc=0; size.min_aspect.x=0; size.min_aspect.y=0; size.max_aspect.x=0; size.max_aspect.y=0; size.base_width=0; size.base_height=0; size.win_gravity=NorthWestGravity; // Tim Alexeevsky size.win_gravity=StaticGravity; // Account for border (ICCCM) if(!(options&DECOR_SHRINKABLE)){ if(!(options&DECOR_STRETCHABLE)){ // Cannot change at all size.flags|=PMinSize|PMaxSize; size.min_width=size.max_width=width; size.min_height=size.max_height=height; } else{ // Cannot get smaller than default size.flags|=PMinSize; size.min_width=getDefaultWidth(); size.min_height=getDefaultHeight(); } } else if(!(options&DECOR_STRETCHABLE)){ // Cannot get larger than default size.flags|=PMaxSize; size.max_width=getDefaultWidth(); size.max_height=getDefaultHeight(); } XSetWMNormalHints(DISPLAY(getApp()),xid,&size); changes.x=xpos; changes.y=ypos; changes.width=width; changes.height=height; changes.border_width=0; changes.sibling=None; changes.stack_mode=Above; XReconfigureWMWindow(DISPLAY(getApp()),xid,DefaultScreen(DISPLAY(getApp())),CWX|CWY|CWWidth|CWHeight,&changes); #endif layout(); } } } // Compute minimum width based on child layout hints FXint FXTopWindow::getDefaultWidth(){ register FXint w,wcum,wmax,mw; register FXWindow* child; register FXuint hints; wmax=wcum=mw=0; if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth(); for(child=getLast(); child; child=child->getPrev()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if((hints&LAYOUT_RIGHT)&&(hints&LAYOUT_CENTER_X)){ // Fixed X w=child->getX()+w; if(w>wmax) wmax=w; } else if(hints&LAYOUT_SIDE_LEFT){ // Left or right if(child->getNext()) wcum+=hspacing; wcum+=w; } else{ if(w>wcum) wcum=w; } } } wcum+=padleft+padright; return FXMAX(wcum,wmax); } // Compute minimum height based on child layout hints FXint FXTopWindow::getDefaultHeight(){ register FXint h,hcum,hmax,mh; register FXWindow* child; register FXuint hints; hmax=hcum=mh=0; if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight(); for(child=getLast(); child; child=child->getPrev()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if((hints&LAYOUT_BOTTOM)&&(hints&LAYOUT_CENTER_Y)){ // Fixed Y h=child->getY()+h; if(h>hmax) hmax=h; } else if(!(hints&LAYOUT_SIDE_LEFT)){ // Top or bottom if(child->getNext()) hcum+=vspacing; hcum+=h; } else{ if(h>hcum) hcum=h; } } } hcum+=padtop+padbottom; return FXMAX(hcum,hmax); } // Recalculate layout void FXTopWindow::layout(){ register FXint left,right,top,bottom,x,y,w,h; register FXint mw=0,mh=0; register FXWindow* child; register FXuint hints; // Placement rectangle; right/bottom non-inclusive left=padleft; right=width-padright; top=padtop; bottom=height-padbottom; // Get maximum child size if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth(); if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight(); // Pack them in the cavity for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); x=child->getX(); y=child->getY(); // Vertical if(hints&LAYOUT_SIDE_LEFT){ // Height if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else if(hints&LAYOUT_FILL_Y) h=bottom-top; else h=child->getDefaultHeight(); // Width if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else if(hints&LAYOUT_FILL_X) w=right-left; else w=child->getWidthForHeight(h); // Width is a function of height! // Y if(!((hints&LAYOUT_BOTTOM)&&(hints&LAYOUT_CENTER_Y))){ if(hints&LAYOUT_CENTER_Y) y=top+(bottom-top-h)/2; else if(hints&LAYOUT_BOTTOM) y=bottom-h; else y=top; } // X if(!((hints&LAYOUT_RIGHT)&&(hints&LAYOUT_CENTER_X))){ if(hints&LAYOUT_CENTER_X) x=left+(right-left-w)/2; else if(hints&LAYOUT_SIDE_BOTTOM){ // Right x=right-w; right-=(w+hspacing); } else{ // Left x=left; left+=(w+hspacing); } } } // Horizontal else{ // Width if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else if(hints&LAYOUT_FILL_X) w=right-left; else w=child->getDefaultWidth(); // Height if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else if(hints&LAYOUT_FILL_Y) h=bottom-top; else h=child->getHeightForWidth(w); // Height is a function of width! // X if(!((hints&LAYOUT_RIGHT)&&(hints&LAYOUT_CENTER_X))){ if(hints&LAYOUT_CENTER_X) x=left+(right-left-w)/2; else if(hints&LAYOUT_RIGHT) x=right-w; else x=left; } // Y if(!((hints&LAYOUT_BOTTOM)&&(hints&LAYOUT_CENTER_Y))){ if(hints&LAYOUT_CENTER_Y) y=top+(bottom-top-h)/2; else if(hints&LAYOUT_SIDE_BOTTOM){ // Bottom y=bottom-h; bottom-=(h+vspacing); } else{ // Top y=top; top+=(h+vspacing); } } } child->position(x,y,w,h); } } flags&=~FLAG_DIRTY; } // Update value from a message long FXTopWindow::onCmdSetStringValue(FXObject*,FXSelector,void* ptr){ setTitle(*((FXString*)ptr)); return 1; } // Obtain value from text field long FXTopWindow::onCmdGetStringValue(FXObject*,FXSelector,void* ptr){ *((FXString*)ptr)=getTitle(); return 1; } // Update icon from a message long FXTopWindow::onCmdSetIconValue(FXObject*,FXSelector,void* ptr){ setMiniIcon(*((FXIcon**)ptr)); return 1; } // Obtain icon from text field long FXTopWindow::onCmdGetIconValue(FXObject*,FXSelector,void* ptr){ *((FXIcon**)ptr)=getMiniIcon(); return 1; } // Maximize the window long FXTopWindow::onCmdMaximize(FXObject*,FXSelector,void*){ maximize(TRUE); return 1; } // Minimize or iconify the window long FXTopWindow::onCmdMinimize(FXObject*,FXSelector,void*){ minimize(TRUE); return 1; } // Restore the window long FXTopWindow::onCmdRestore(FXObject*,FXSelector,void*){ restore(TRUE); return 1; } // Close window; ask target before doing close long FXTopWindow::onCmdClose(FXObject*,FXSelector,void*){ close(TRUE); return 1; } // Session is about to close, give opportunity to save data long FXTopWindow::onSessionNotify(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_SESSION_NOTIFY,message),ptr); } // Session has closed, close the window with prejudice long FXTopWindow::onSessionClosed(FXObject*,FXSelector,void* ptr){ if(target) target->tryHandle(this,FXSEL(SEL_SESSION_CLOSED,message),ptr); close(FALSE); return 1; } // Focus moved up long FXTopWindow::onFocusUp(FXObject*,FXSelector,void* ptr){ FXWindow *child,*c; FXint cury,childy; if(getFocus()){ cury=getFocus()->getY(); while(1){ child=NULL; childy=-10000000; for(c=getFirst(); c; c=c->getNext()){ if(c->shown() && c->getY()getY()){ childy=c->getY(); child=c; } } if(!child) return 0; if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_UP,0),ptr)) return 1; cury=childy; } } else{ child=getLast(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_UP,0),ptr)) return 1; } child=child->getPrev(); } } return 0; } // Focus moved down long FXTopWindow::onFocusDown(FXObject*,FXSelector,void* ptr){ FXWindow *child,*c; FXint cury,childy; if(getFocus()){ cury=getFocus()->getY(); while(1){ child=NULL; childy=10000000; for(c=getFirst(); c; c=c->getNext()){ if(c->shown() && curygetY() && c->getY()getY(); child=c; } } if(!child) return 0; if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_DOWN,0),ptr)) return 1; cury=childy; } } else{ child=getFirst(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_DOWN,0),ptr)) return 1; } child=child->getNext(); } } return 0; } // Focus moved to left long FXTopWindow::onFocusLeft(FXObject*,FXSelector,void* ptr){ FXWindow *child,*c; FXint curx,childx; if(getFocus()){ curx=getFocus()->getX(); while(1){ child=NULL; childx=-10000000; for(c=getFirst(); c; c=c->getNext()){ if(c->shown() && c->getX()getX()){ childx=c->getX(); child=c; } } if(!child) return 0; if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_LEFT,0),ptr)) return 1; curx=childx; } } else{ child=getLast(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_LEFT,0),ptr)) return 1; } child=child->getPrev(); } } return 0; } // Focus moved to right long FXTopWindow::onFocusRight(FXObject*,FXSelector,void* ptr){ FXWindow *child,*c; FXint curx,childx; if(getFocus()){ curx=getFocus()->getX(); while(1){ child=NULL; childx=10000000; for(c=getFirst(); c; c=c->getNext()){ if(c->shown() && curxgetX() && c->getX()getX(); child=c; } } if(!child) return 0; if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_RIGHT,0),ptr)) return 1; curx=childx; } } else{ child=getFirst(); while(child){ if(child->shown()){ if(child->handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr)) return 1; if(child->handle(this,FXSEL(SEL_FOCUS_RIGHT,0),ptr)) return 1; } child=child->getNext(); } } return 0; } // Change regular icon void FXTopWindow::setIcon(FXIcon* ic){ if(icon!=ic){ icon=ic; if(xid){ #ifdef WIN32 HICON icold=NULL; HICON icnew=NULL; if(icon){ ICONINFO iconinfo; iconinfo.fIcon=true; iconinfo.xHotspot=0; iconinfo.yHotspot=0; iconinfo.hbmMask=(HBITMAP)icon->shape; iconinfo.hbmColor=(HBITMAP)icon->xid; icnew=CreateIconIndirect(&iconinfo); } if((icold=(HICON)SendMessage((HWND)xid,WM_SETICON,ICON_BIG,(LPARAM)icnew))!=0){ DestroyIcon(icold); } #else seticons(); #endif } } } // Change mini icon void FXTopWindow::setMiniIcon(FXIcon *ic){ if(miniIcon!=ic){ miniIcon=ic; if(xid){ #ifdef WIN32 HICON icold=NULL; HICON icnew=NULL; if(miniIcon){ ICONINFO iconinfo; iconinfo.fIcon=true; iconinfo.xHotspot=0; iconinfo.yHotspot=0; iconinfo.hbmMask=(HBITMAP)miniIcon->shape; iconinfo.hbmColor=(HBITMAP)miniIcon->xid; icnew=CreateIconIndirect(&iconinfo); } if((icold=(HICON)SendMessage((HWND)xid,WM_SETICON,ICON_SMALL,(LPARAM)icnew))!=0){ DestroyIcon(icold); } #else seticons(); #endif } } } // Set new window title void FXTopWindow::setTitle(const FXString& name){ if(title!=name){ title=name; if(xid) settitle(); } } // Change packing hints void FXTopWindow::setPackingHints(FXuint ph){ FXuint opts=(options&~(PACK_UNIFORM_HEIGHT|PACK_UNIFORM_WIDTH)) | (ph&(PACK_UNIFORM_HEIGHT|PACK_UNIFORM_WIDTH)); if(opts!=options){ options=opts; recalc(); update(); } } // Get packing hints FXuint FXTopWindow::getPackingHints() const { return (options&(PACK_UNIFORM_HEIGHT|PACK_UNIFORM_WIDTH)); } // Change top padding void FXTopWindow::setPadTop(FXint pt){ if(padtop!=pt){ padtop=pt; recalc(); update(); } } // Change bottom padding void FXTopWindow::setPadBottom(FXint pb){ if(padbottom!=pb){ padbottom=pb; recalc(); update(); } } // Change left padding void FXTopWindow::setPadLeft(FXint pl){ if(padleft!=pl){ padleft=pl; recalc(); update(); } } // Change right padding void FXTopWindow::setPadRight(FXint pr){ if(padright!=pr){ padright=pr; recalc(); update(); } } // Change horizontal spacing void FXTopWindow::setHSpacing(FXint hs){ if(hspacing!=hs){ hspacing=hs; recalc(); update(); } } // Change vertical spacing void FXTopWindow::setVSpacing(FXint vs){ if(vspacing!=vs){ vspacing=vs; recalc(); update(); } } // Save object to stream void FXTopWindow::save(FXStream& store) const { FXShell::save(store); store << title; store << icon; store << miniIcon; store << padtop; store << padbottom; store << padleft; store << padright; store << hspacing; store << vspacing; } // Load object from stream void FXTopWindow::load(FXStream& store){ FXShell::load(store); store >> title; store >> icon; store >> miniIcon; store >> padtop; store >> padbottom; store >> padleft; store >> padright; store >> hspacing; store >> vspacing; } // Remove this one from toplevel window list FXTopWindow::~FXTopWindow(){ #ifdef WIN32 HICON icold; if((icold=(HICON)SendMessage((HWND)xid,WM_SETICON,ICON_BIG,0))!=0){ DestroyIcon(icold); } if((icold=(HICON)SendMessage((HWND)xid,WM_SETICON,ICON_SMALL,0))!=0){ DestroyIcon(icold); } #endif icon=(FXIcon*)-1L; miniIcon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXTranslator.cpp000066400000000000000000000107251326741342000165240ustar00rootroot00000000000000/******************************************************************************** * * * M e s s a g e T r a n s l a t o r * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTranslator.cpp,v 1.13 2006/01/22 17:58:49 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObject.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXTranslator.h" /* Notes: - The input message string may be not UTF-8 but some other code page, the "developer's code page". If we allow for explicit setting of the "developer's code page" we can perform another translation from code-page -> utf-8 here as well. This will be convenient since this allows e.g. a russion programmer to just use his editor in koi8 setting. - The above does mean we need to return FXString instead of a pointer, perhaps... */ using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXTranslator,FXObject,NULL,0) // Construct translator FXTranslator::FXTranslator(FXApp* a):app(a),codec(NULL){ FXTRACE((100,"%p->FXTranslator::FXTranslator\n",this)); } /* #ifdef WIN32 LCID mylcid=GetUserDefaultLCID(); TCHAR buffer[256]; // ISO Standard 639 values language name GetLocaleInfo(mylcid,LOCALE_SISO639LANGNAME,buffer,sizeof(buffer)/sizeof(TCHAR)); // ISO Standard 3166 country names GetLocaleInfo(mylcid,LOCALE_SISO3166CTRYNAME,buffer,sizeof(buffer)/sizeof(TCHAR)); // ISO Standard 4217 currency GetLocaleInfo(mylcid,LOCALE_SINTLSYMBOL,buffer,sizeof(buffer)/sizeof(TCHAR))); #else char *locale=setlocale(LC_ALL, NULL); char *lang=strstr(locale,"LANG="); if(!lang) lang=strstr(locale,"LC_MESSAGES="); if(!lang) lang=strstr(locale,"LC_CTYPE="); if(!lang){ // Try the LANG environment variable lang=getenv("LANG"); if(!lang) break; } else{ lang=strchr(lang, '=')+1; if('"'==*lang) lang++; } while(*lang!='_'){ iso639.append(*lang); lang++; } lang++; while(isalpha(*lang) || '@'==*lang){ iso3166.append(*lang); lang++; } #endif */ // Translate a string const FXchar* FXTranslator::tr(const FXchar* context,const FXchar* message,const FXchar* hint) const { FXTRACE((200,"tr context: '%s' message: '%s' hint: '%s'.\n",context,message,hint?hint:"")); return message; } // Save data void FXTranslator::save(FXStream& store) const { FXObject::save(store); } // Load data void FXTranslator::load(FXStream& store){ FXObject::load(store); } // Destroy translator FXTranslator::~FXTranslator(){ FXTRACE((100,"%p->FXTranslator::~FXTranslator\n",this)); app=(FXApp*)-1L; codec=(FXTextCodec*)-1L; } } fox1.6-1.6.57/src/FXTreeList.cpp000066400000000000000000002047411326741342000161310ustar00rootroot00000000000000/******************************************************************************** * * * T r e e L i s t O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTreeList.cpp,v 1.167 2006/02/17 03:07:00 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "fxascii.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXFont.h" #include "FXIcon.h" #include "FXScrollBar.h" #include "FXTreeList.h" /* Notes: - Tooltip should pop up exactly on top of current item. - Clicking on + does not make it current. - Need translate right-clicks into message with item figured out... - In autoselect mode, all items are expanded. - Sortfunc's will be hard to serialize. - As with FXIconList, it probably shouldn't autoscroll when draggin icons. - Maybe moving (dragging) items around in the treelist is something that should be supported? */ #define ICON_SPACING 4 // Spacing between parent and child in x direction #define TEXT_SPACING 4 // Spacing between icon and text #define SIDE_SPACING 4 // Spacing between side and item #define DEFAULT_INDENT 8 // Indent between parent and child #define HALFBOX_SIZE 4 // Half box size #define BOX_FUDGE 3 // Fudge border around box #define SELECT_MASK (TREELIST_SINGLESELECT|TREELIST_BROWSESELECT) #define TREELIST_MASK (SELECT_MASK|TREELIST_AUTOSELECT|TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|TREELIST_ROOT_BOXES) using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXTreeItem,FXObject,NULL,0) // Draw item void FXTreeItem::draw(const FXTreeList* list,FXDC& dc,FXint xx,FXint yy,FXint,FXint hh) const { register FXIcon *icon=(state&OPENED)?openIcon:closedIcon; register FXFont *font=list->getFont(); register FXint th=0,tw=0,ih=0,iw=0; xx+=SIDE_SPACING/2; if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); dc.drawIcon(icon,xx,yy+(hh-ih)/2); xx+=ICON_SPACING+iw; } if(!label.empty()){ tw=4+font->getTextWidth(label.text(),label.length()); th=4+font->getFontHeight(); yy+=(hh-th)/2; if(isSelected()){ dc.setForeground(list->getSelBackColor()); dc.fillRectangle(xx,yy,tw,th); } if(hasFocus()){ dc.drawFocusRectangle(xx+1,yy+1,tw-2,th-2); } if(!isEnabled()) dc.setForeground(makeShadowColor(list->getBackColor())); else if(isSelected()) dc.setForeground(list->getSelTextColor()); else dc.setForeground(list->getTextColor()); dc.drawText(xx+2,yy+font->getFontAscent()+2,label); } } // See if item got hit, and where:- 1 is icon, 2 is text FXint FXTreeItem::hitItem(const FXTreeList* list,FXint xx,FXint yy) const { register FXint oiw=0,ciw=0,oih=0,cih=0,tw=0,th=0,iw,ih,ix,iy,tx,ty,h; register FXFont *font=list->getFont(); if(openIcon){ oiw=openIcon->getWidth(); oih=openIcon->getHeight(); } if(closedIcon){ ciw=closedIcon->getWidth(); cih=closedIcon->getHeight(); } if(!label.empty()){ tw=4+font->getTextWidth(label.text(),label.length()); th=4+font->getFontHeight(); } iw=FXMAX(oiw,ciw); ih=FXMAX(oih,cih); h=FXMAX(th,ih); ix=SIDE_SPACING/2; tx=SIDE_SPACING/2; if(iw) tx+=iw+ICON_SPACING; iy=(h-ih)/2; ty=(h-th)/2; // In icon? if(ix<=xx && iy<=yy && xxcreate(); if(closedIcon) closedIcon->create(); } // Destroy icon void FXTreeItem::destroy(){ if((state&OPENICONOWNED) && openIcon) openIcon->destroy(); if((state&CLOSEDICONOWNED) && closedIcon) closedIcon->destroy(); } // Detach from icon resource void FXTreeItem::detach(){ if(openIcon) openIcon->detach(); if(closedIcon) closedIcon->detach(); } // Get number of child items FXint FXTreeItem::getNumChildren() const { register FXTreeItem *item=first; register FXint n=0; while(item){item=item->next;n++;} return n; } // Get item (logically) below this one FXTreeItem* FXTreeItem::getBelow() const { register FXTreeItem* item=(FXTreeItem*)this; if(first) return first; while(!item->next && item->parent) item=item->parent; return item->next; } // Get item (logically) above this one FXTreeItem* FXTreeItem::getAbove() const { register FXTreeItem* item=prev; if(!item) return parent; while(item->last) item=item->last; return item; } // Return true if child of parent item FXbool FXTreeItem::isChildOf(const FXTreeItem* item) const { register const FXTreeItem* child=this; while(child){ child=child->parent; if(child==item) return TRUE; } return FALSE; } // Return true if parent of child item FXbool FXTreeItem::isParentOf(const FXTreeItem* item) const { register const FXTreeItem* child=item; while(child){ child=child->parent; if(child==this) return TRUE; } return FALSE; } // Get item width FXint FXTreeItem::getWidth(const FXTreeList* list) const { register FXint w=0,oiw=0,ciw=0; if(openIcon) oiw=openIcon->getWidth(); if(closedIcon) ciw=closedIcon->getWidth(); w=FXMAX(oiw,ciw); if(!label.empty()){ if(w) w+=ICON_SPACING; w+=4+list->getFont()->getTextWidth(label.text(),label.length()); } return SIDE_SPACING+w; } // Get item height FXint FXTreeItem::getHeight(const FXTreeList* list) const { register FXint th=0,oih=0,cih=0; if(openIcon) oih=openIcon->getHeight(); if(closedIcon) cih=closedIcon->getHeight(); if(!label.empty()) th=4+list->getFont()->getFontHeight(); return FXMAX3(th,oih,cih); } // Save data void FXTreeItem::save(FXStream& store) const { FXObject::save(store); store << prev; store << next; store << parent; store << first; store << last; store << label; store << openIcon; store << closedIcon; store << state; } // Load data void FXTreeItem::load(FXStream& store){ FXObject::load(store); store >> prev; store >> next; store >> parent; store >> first; store >> last; store >> label; store >> openIcon; store >> closedIcon; store >> state; } // Delete icons if owned FXTreeItem::~FXTreeItem(){ if(state&OPENICONOWNED) delete openIcon; if(state&CLOSEDICONOWNED) delete closedIcon; parent=(FXTreeItem*)-1L; prev=(FXTreeItem*)-1L; next=(FXTreeItem*)-1L; first=(FXTreeItem*)-1L; last=(FXTreeItem*)-1L; openIcon=(FXIcon*)-1L; closedIcon=(FXIcon*)-1L; } /*******************************************************************************/ // Map FXDEFMAP(FXTreeList) FXTreeListMap[]={ FXMAPFUNC(SEL_PAINT,0,FXTreeList::onPaint), FXMAPFUNC(SEL_MOTION,0,FXTreeList::onMotion), FXMAPFUNC(SEL_TIMEOUT,FXWindow::ID_AUTOSCROLL,FXTreeList::onAutoScroll), FXMAPFUNC(SEL_TIMEOUT,FXTreeList::ID_TIPTIMER,FXTreeList::onTipTimer), FXMAPFUNC(SEL_TIMEOUT,FXTreeList::ID_LOOKUPTIMER,FXTreeList::onLookupTimer), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXTreeList::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXTreeList::onLeftBtnRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXTreeList::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXTreeList::onRightBtnRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXTreeList::onUngrabbed), FXMAPFUNC(SEL_KEYPRESS,0,FXTreeList::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXTreeList::onKeyRelease), FXMAPFUNC(SEL_ENTER,0,FXTreeList::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXTreeList::onLeave), FXMAPFUNC(SEL_FOCUSIN,0,FXTreeList::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXTreeList::onFocusOut), FXMAPFUNC(SEL_CLICKED,0,FXTreeList::onClicked), FXMAPFUNC(SEL_DOUBLECLICKED,0,FXTreeList::onDoubleClicked), FXMAPFUNC(SEL_TRIPLECLICKED,0,FXTreeList::onTripleClicked), FXMAPFUNC(SEL_COMMAND,0,FXTreeList::onCommand), FXMAPFUNC(SEL_QUERY_TIP,0,FXTreeList::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXTreeList::onQueryHelp), }; // Object implementation FXIMPLEMENT(FXTreeList,FXScrollArea,FXTreeListMap,ARRAYNUMBER(FXTreeListMap)) /*******************************************************************************/ // Tree List FXTreeList::FXTreeList(){ flags|=FLAG_ENABLED; firstitem=NULL; lastitem=NULL; anchoritem=NULL; currentitem=NULL; extentitem=NULL; cursoritem=NULL; viewableitem=NULL; font=(FXFont*)-1L; sortfunc=NULL; textColor=0; selbackColor=0; seltextColor=0; lineColor=0; treeWidth=0; treeHeight=0; visible=0; indent=DEFAULT_INDENT; grabx=0; graby=0; state=FALSE; } // Tree List FXTreeList::FXTreeList(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h): FXScrollArea(p,opts,x,y,w,h){ flags|=FLAG_ENABLED; target=tgt; message=sel; firstitem=NULL; lastitem=NULL; anchoritem=NULL; currentitem=NULL; extentitem=NULL; cursoritem=NULL; viewableitem=NULL; font=getApp()->getNormalFont(); sortfunc=NULL; textColor=getApp()->getForeColor(); selbackColor=getApp()->getSelbackColor(); seltextColor=getApp()->getSelforeColor(); lineColor=getApp()->getShadowColor(); treeWidth=0; treeHeight=0; visible=0; indent=DEFAULT_INDENT; grabx=0; graby=0; state=FALSE; } // Create window void FXTreeList::create(){ register FXTreeItem *item=firstitem; FXScrollArea::create(); while(item){ item->create(); if(item->first){item=item->first;continue;} while(!item->next && item->parent){item=item->parent;} item=item->next; } font->create(); } // Detach window void FXTreeList::detach(){ register FXTreeItem *item=firstitem; FXScrollArea::detach(); while(item){ item->detach(); if(item->first){item=item->first;continue;} while(!item->next && item->parent){item=item->parent;} item=item->next; } font->detach(); } // Can have focus bool FXTreeList::canFocus() const { return true; } // Into focus chain void FXTreeList::setFocus(){ FXScrollArea::setFocus(); setDefault(TRUE); } // Out of focus chain void FXTreeList::killFocus(){ FXScrollArea::killFocus(); setDefault(MAYBE); } // Get default width FXint FXTreeList::getDefaultWidth(){ return FXScrollArea::getDefaultWidth(); } // Get default height FXint FXTreeList::getDefaultHeight(){ if(visible) return visible*(4+font->getFontHeight()); return FXScrollArea::getDefaultHeight(); } // Propagate size change void FXTreeList::recalc(){ FXScrollArea::recalc(); flags|=FLAG_RECALC; cursoritem=NULL; } // List is multiple of nitems void FXTreeList::setNumVisible(FXint nvis){ if(nvis<0) nvis=0; if(visible!=nvis){ visible=nvis; recalc(); } } // Get number of toplevel items FXint FXTreeList::getNumItems() const { register FXTreeItem *item=firstitem; register FXint n=0; while(item){ item=item->next; n++; } return n; } // Recompute interior void FXTreeList::recompute(){ register FXTreeItem* item; register FXint x,y,w,h; x=y=0; treeWidth=0; treeHeight=0; item=firstitem; if(options&TREELIST_ROOT_BOXES) x+=(4+indent); while(item){ item->x=x; item->y=y; w=item->getWidth(this); h=item->getHeight(this); if(x+w>treeWidth) treeWidth=x+w; y+=h; if(item->first && ((options&TREELIST_AUTOSELECT) || item->isExpanded())){ x+=(indent+h/2); item=item->first; continue; } while(!item->next && item->parent){ item=item->parent; x-=(indent+item->getHeight(this)/2); } item=item->next; } treeHeight=y; flags&=~FLAG_RECALC; } // Determine content width of tree list FXint FXTreeList::getContentWidth(){ if(flags&FLAG_RECALC) recompute(); return treeWidth; } // Determine content height of tree list FXint FXTreeList::getContentHeight(){ if(flags&FLAG_RECALC) recompute(); return treeHeight; } // Recalculate layout void FXTreeList::layout(){ // Calculate contents FXScrollArea::layout(); // Set line size based on item size if(firstitem){ vertical->setLine(firstitem->getHeight(this)); horizontal->setLine(firstitem->getWidth(this)/10); } // Force repaint update(); // We were supposed to make this item viewable if(viewableitem){ makeItemVisible(viewableitem); } // No more dirty flags&=~FLAG_DIRTY; } // Set item text void FXTreeList::setItemText(FXTreeItem* item,const FXString& text){ if(item==NULL){ fxerror("%s::setItemText: NULL argument.\n",getClassName()); } if(item->getText()!=text){ item->setText(text); recalc(); } } // Get item text FXString FXTreeList::getItemText(const FXTreeItem* item) const { if(item==NULL){ fxerror("%s::getItemText: NULL argument.\n",getClassName()); } return item->getText(); } // Set item open icon void FXTreeList::setItemOpenIcon(FXTreeItem* item,FXIcon* icon,FXbool owned){ if(item==NULL){ fxerror("%s::setItemOpenIcon: NULL argument.\n",getClassName()); } if(item->getOpenIcon()!=icon) recalc(); item->setOpenIcon(icon,owned); } // Get item open icon FXIcon* FXTreeList::getItemOpenIcon(const FXTreeItem* item) const { if(item==NULL){ fxerror("%s::getItemOpenIcon: NULL argument.\n",getClassName()); } return item->getOpenIcon(); } // Set item closed icon void FXTreeList::setItemClosedIcon(FXTreeItem* item,FXIcon* icon,FXbool owned){ if(item==NULL){ fxerror("%s::setItemClosedIcon: NULL argument.\n",getClassName()); } if(item->getClosedIcon()!=icon) recalc(); item->setClosedIcon(icon,owned); } // Get item closed icon FXIcon* FXTreeList::getItemClosedIcon(const FXTreeItem* item) const { if(item==NULL){ fxerror("%s::getItemClosedIcon: NULL argument.\n",getClassName()); } return item->getClosedIcon(); } // Set item data void FXTreeList::setItemData(FXTreeItem* item,void* ptr) const { if(item==NULL){ fxerror("%s::setItemData: NULL argument.\n",getClassName()); } item->setData(ptr); } // Get item data void* FXTreeList::getItemData(const FXTreeItem* item) const { if(item==NULL){ fxerror("%s::getItemData: NULL argument.\n",getClassName()); } return item->getData(); } // True if item is selected FXbool FXTreeList::isItemSelected(const FXTreeItem* item) const { if(!item){ fxerror("%s::isItemSelected: NULL argument.\n",getClassName()); } return item->isSelected(); } // True if item is current FXbool FXTreeList::isItemCurrent(const FXTreeItem* item) const { if(!item){ fxerror("%s::isItemCurrent: NULL argument.\n",getClassName()); } return currentitem==item; } // Check if item is expanded FXbool FXTreeList::isItemExpanded(const FXTreeItem* item) const { if(!item){ fxerror("%s::isItemExpanded: NULL argument.\n",getClassName()); } return (options&TREELIST_AUTOSELECT) || item->isExpanded(); } // Is item a leaf item FXbool FXTreeList::isItemLeaf(const FXTreeItem* item) const { if(!item){ fxerror("%s::isItemLeaf: NULL argument.\n",getClassName()); } return item->first==NULL; } // Check if item is enabled FXbool FXTreeList::isItemEnabled(const FXTreeItem* item) const { if(!item){ fxerror("%s::isItemEnabled: NULL argument.\n",getClassName()); } return item->isEnabled(); } // Check item is open FXbool FXTreeList::isItemOpened(const FXTreeItem* item) const { if(!item){ fxerror("%s::isItemOpen: NULL argument.\n",getClassName()); } return item->isOpened(); } // True if item (partially) visible FXbool FXTreeList::isItemVisible(const FXTreeItem* item) const { if(!item){ fxerror("%s::isItemVisible: NULL argument.\n",getClassName()); } return 0y+item->getHeight(this) && pos_y+item->yparent; par; par=par->parent){ expandTree(par); } } // Was realized if(xid){ // Force layout if dirty if(flags&FLAG_RECALC) layout(); x=pos_x; y=pos_y; w=item->getWidth(this); h=item->getHeight(this); // Horizontal scroll to ensure visibility; the +-box, if shown, should also be visible if(viewport_w<=x+item->x+w) x=viewport_w-item->x-w; if((options&(TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES)) && (item->parent || (options&TREELIST_ROOT_BOXES))){ if(x+item->x-indent-HALFBOX_SIZE<=0) x=-item->x+indent+HALFBOX_SIZE; } else{ if(x+item->x<=0) x=-item->x; } // Vertical scroll to ensure visibility if(viewport_h<=y+item->y+h) y=viewport_h-item->y-h; if(y+item->y<=0) y=-item->y; // Scroll into view setPosition(x,y); // Done it viewableitem=NULL; } } } // Get item at position x,y FXTreeItem* FXTreeList::getItemAt(FXint,FXint y) const { register FXTreeItem* item=firstitem; register FXint ix,iy,ih; ix=pos_x; iy=pos_y; if(options&TREELIST_ROOT_BOXES) ix+=(4+indent); while(item && iy<=y){ ih=item->getHeight(this); if(yfirst && ((options&TREELIST_AUTOSELECT) || item->isExpanded())){ ix+=(indent+ih/2); item=item->first; continue; } while(!item->next && item->parent){ item=item->parent; ix-=(indent+item->getHeight(this)/2); } item=item->next; } return NULL; } // Did we hit the item, and which part of it did we hit (0=outside, 1=icon, 2=text, 3=box) FXint FXTreeList::hitItem(const FXTreeItem* item,FXint x,FXint y) const { register FXint ix,iy,ih,xh,yh,hit=0; if(item){ x-=pos_x; y-=pos_y; ix=item->x; iy=item->y; ih=item->getHeight(this); if(iy<=y && yhasItems() || item->getFirst())){ xh=ix-indent+(SIDE_SPACING/2); yh=iy+ih/2; if(xh-HALFBOX_SIZE-BOX_FUDGE<=x && x<=xh+HALFBOX_SIZE+BOX_FUDGE && yh-HALFBOX_SIZE-BOX_FUDGE<=y && y<=yh+HALFBOX_SIZE+BOX_FUDGE) return 3; } hit=item->hitItem(this,x-ix,y-iy); } } return hit; } // Repaint void FXTreeList::updateItem(FXTreeItem* item) const { if(item) update(0,pos_y+item->y,width,item->getHeight(this)); } // Enable one item FXbool FXTreeList::enableItem(FXTreeItem* item){ if(!item){ fxerror("%s::enableItem: NULL argument.\n",getClassName()); } if(!item->isEnabled()){ item->setEnabled(TRUE); updateItem(item); return TRUE; } return FALSE; } // Disable one item FXbool FXTreeList::disableItem(FXTreeItem* item){ if(!item){ fxerror("%s::disableItem: NULL argument.\n",getClassName()); } if(item->isEnabled()){ item->setEnabled(FALSE); updateItem(item); return TRUE; } return FALSE; } // Select one item FXbool FXTreeList::selectItem(FXTreeItem* item,FXbool notify){ if(!item){ fxerror("%s::selectItem: NULL argument.\n",getClassName()); } if(!item->isSelected()){ switch(options&SELECT_MASK){ case TREELIST_SINGLESELECT: case TREELIST_BROWSESELECT: killSelection(notify); case TREELIST_EXTENDEDSELECT: case TREELIST_MULTIPLESELECT: item->setSelected(TRUE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)item);} break; } return TRUE; } return FALSE; } // Deselect one item FXbool FXTreeList::deselectItem(FXTreeItem* item,FXbool notify){ if(!item){ fxerror("%s::deselectItem: NULL argument.\n",getClassName()); } if(item->isSelected()){ switch(options&SELECT_MASK){ case TREELIST_EXTENDEDSELECT: case TREELIST_MULTIPLESELECT: case TREELIST_SINGLESELECT: item->setSelected(FALSE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)item);} break; } return TRUE; } return FALSE; } // toggle one item FXbool FXTreeList::toggleItem(FXTreeItem* item,FXbool notify){ if(!item){ fxerror("%s::toggleItem: NULL argument.\n",getClassName()); } switch(options&SELECT_MASK){ case TREELIST_BROWSESELECT: if(!item->isSelected()){ killSelection(notify); item->setSelected(TRUE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)item);} } break; case TREELIST_SINGLESELECT: if(!item->isSelected()){ killSelection(notify); item->setSelected(TRUE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)item);} } else{ item->setSelected(FALSE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)item);} } break; case TREELIST_EXTENDEDSELECT: case TREELIST_MULTIPLESELECT: if(!item->isSelected()){ item->setSelected(TRUE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)item);} } else{ item->setSelected(FALSE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)item);} } break; } return TRUE; } // Extend selection FXbool FXTreeList::extendSelection(FXTreeItem* item,FXbool notify){ register FXTreeItem *it,*i1,*i2,*i3; register FXbool changes=FALSE; if(item && anchoritem && extentitem){ it=firstitem; i1=i2=i3=NULL; // Find segments while(it){ if(it==item){i1=i2;i2=i3;i3=it;} if(it==anchoritem){i1=i2;i2=i3;i3=it;} if(it==extentitem){i1=i2;i2=i3;i3=it;} it=it->getBelow(); } FXASSERT(i1 && i2 && i3); // First segment it=i1; while(it!=i2){ // item = extent - anchor // item = anchor - extent if(i1==item){ if(!it->isSelected()){ it->setSelected(TRUE); updateItem(it); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)it);} } } // extent = anchor - item // extent = item - anchor else if(i1==extentitem){ if(it->isSelected()){ it->setSelected(FALSE); updateItem(it); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)it);} } } it=it->getBelow(); } // Second segment it=i2; while(it!=i3){ it=it->getBelow(); // extent - anchor = item // anchor - extent = item if(i3==item){ if(!it->isSelected()){ it->setSelected(TRUE); updateItem(it); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_SELECTED,message),(void*)it);} } } // item - anchor = extent // anchor - item = extent else if(i3==extentitem){ if(it->isSelected()){ it->setSelected(FALSE); updateItem(it); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)it);} } } } extentitem=item; } return changes; } // Kill selection FXbool FXTreeList::killSelection(FXbool notify){ register FXTreeItem *item=firstitem; register FXbool changes=FALSE; while(item){ if(item->isSelected()){ item->setSelected(FALSE); updateItem(item); changes=TRUE; if(notify && target){target->tryHandle(this,FXSEL(SEL_DESELECTED,message),(void*)item);} } item=item->getBelow(); } return changes; } // Open item FXbool FXTreeList::openItem(FXTreeItem* item,FXbool notify){ if(item==NULL){ fxerror("%s::openItem: NULL argument.\n",getClassName()); } if(!item->isOpened()){ item->setOpened(TRUE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_OPENED,message),(void*)item);} return TRUE; } return FALSE; } // Close item FXbool FXTreeList::closeItem(FXTreeItem* item,FXbool notify){ if(item==NULL){ fxerror("%s::closeItem: NULL argument.\n",getClassName()); } if(item->isOpened()){ item->setOpened(FALSE); updateItem(item); if(notify && target){target->tryHandle(this,FXSEL(SEL_CLOSED,message),(void*)item);} return TRUE; } return FALSE; } // Collapse all subtrees under item FXbool FXTreeList::collapseTree(FXTreeItem* tree,FXbool notify){ if(tree==NULL){ fxerror("%s::collapseTree: NULL argument.\n",getClassName()); } if(tree->isExpanded()){ tree->setExpanded(FALSE); if(!(options&TREELIST_AUTOSELECT)){ // In autoselect, already shown as expanded! if(tree->first){ recalc(); } else{ updateItem(tree); } } if(notify && target){target->tryHandle(this,FXSEL(SEL_COLLAPSED,message),(void*)tree);} return TRUE; } return FALSE; } // Expand subtree under item FXbool FXTreeList::expandTree(FXTreeItem* tree,FXbool notify){ if(tree==NULL){ fxerror("%s::expandTree: NULL argument.\n",getClassName()); } if(!tree->isExpanded()){ tree->setExpanded(TRUE); if(!(options&TREELIST_AUTOSELECT)){ // In autoselect, already shown as expanded! if(tree->first){ recalc(); } else{ updateItem(tree); } } if(notify && target){target->tryHandle(this,FXSEL(SEL_EXPANDED,message),(void*)tree);} return TRUE; } return FALSE; } // Start motion timer while in this window long FXTreeList::onEnter(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onEnter(sender,sel,ptr); getApp()->addTimeout(this,ID_TIPTIMER,getApp()->getMenuPause()); cursoritem=NULL; return 1; } // Stop motion timer when leaving window long FXTreeList::onLeave(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onLeave(sender,sel,ptr); getApp()->removeTimeout(this,ID_TIPTIMER); cursoritem=NULL; return 1; } // We timed out, i.e. the user didn't move for a while long FXTreeList::onTipTimer(FXObject*,FXSelector,void*){ FXTRACE((200,"%s::onTipTimer %p\n",getClassName(),this)); flags|=FLAG_TIP; return 1; } // We were asked about tip text long FXTreeList::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if((flags&FLAG_TIP) && !(options&TREELIST_AUTOSELECT)){ // No tip when autoselect! FXint x,y; FXuint buttons; getCursorPosition(x,y,buttons); FXTreeItem *item=getItemAt(x,y); if(item){ FXString string=item->getText(); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&string); return 1; } } return 0; } // We were asked about status text long FXTreeList::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if(!help.empty() && (flags&FLAG_HELP)){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } return 0; } // Gained focus long FXTreeList::onFocusIn(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onFocusIn(sender,sel,ptr); if(currentitem){ currentitem->setFocus(TRUE); updateItem(currentitem); } return 1; } // Lost focus long FXTreeList::onFocusOut(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onFocusOut(sender,sel,ptr); if(currentitem){ currentitem->setFocus(FALSE); updateItem(currentitem); } return 1; } // Draw item list long FXTreeList::onPaint(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXTreeItem* item=firstitem; FXTreeItem* p; FXint yh,xh,x,y,w,h,xp,hh; FXDCWindow dc(this,event); dc.setFont(font); x=pos_x; y=pos_y; if(options&TREELIST_ROOT_BOXES) x+=(4+indent); while(item && yrect.y+event->rect.h){ w=item->getWidth(this); h=item->getHeight(this); if(event->rect.y<=y+h){ // Draw item dc.setForeground(backColor); dc.fillRectangle(0,y,width,h); item->draw(this,dc,x,y,w,h); // Show other paraphernalia such as dotted lines and expand-boxes if((options&(TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES)) && (item->parent || (options&TREELIST_ROOT_BOXES))){ hh=h/2; yh=y+hh; xh=x-indent+(SIDE_SPACING/2); dc.setForeground(lineColor); dc.setBackground(backColor); dc.setStipple(STIPPLE_GRAY,pos_x&1,pos_y&1); if(options&TREELIST_SHOWS_LINES){ // Connect items with lines p=item->parent; xp=xh; dc.setFillStyle(FILL_OPAQUESTIPPLED); while(p){ xp-=(indent+p->getHeight(this)/2); if(p->next) dc.fillRectangle(xp,y,1,h); p=p->parent; } if((options&TREELIST_SHOWS_BOXES) && (item->hasItems() || item->getFirst())){ if(item->prev || item->parent) dc.fillRectangle(xh,y,1,yh-y-HALFBOX_SIZE); if(item->next) dc.fillRectangle(xh,yh+HALFBOX_SIZE,1,y+h-yh-HALFBOX_SIZE); } else{ if(item->prev || item->parent) dc.fillRectangle(xh,y,1,hh); if(item->next) dc.fillRectangle(xh,yh,1,h); dc.fillRectangle(xh,yh,x+(SIDE_SPACING/2)-2-xh,1); } dc.setFillStyle(FILL_SOLID); } // Boxes before items for expand/collapse of item if((options&TREELIST_SHOWS_BOXES) && (item->hasItems() || item->getFirst())){ dc.setFillStyle(FILL_OPAQUESTIPPLED); dc.fillRectangle(xh+4,yh,(SIDE_SPACING/2)-2,1); dc.setFillStyle(FILL_SOLID); dc.drawRectangle(xh-HALFBOX_SIZE,yh-HALFBOX_SIZE,HALFBOX_SIZE+HALFBOX_SIZE,HALFBOX_SIZE+HALFBOX_SIZE); dc.setForeground(textColor); dc.fillRectangle(xh-HALFBOX_SIZE+2,yh,HALFBOX_SIZE+HALFBOX_SIZE-3,1); if(!(options&TREELIST_AUTOSELECT) && !item->isExpanded()){ dc.fillRectangle(xh,yh-HALFBOX_SIZE+2,1,HALFBOX_SIZE+HALFBOX_SIZE-3); } } } } y+=h; // Move on to the next item if(item->first && ((options&TREELIST_AUTOSELECT) || item->isExpanded())){ x+=(indent+h/2); item=item->first; continue; } while(!item->next && item->parent){ item=item->parent; x-=(indent+item->getHeight(this)/2); } item=item->next; } if(yrect.y+event->rect.h){ dc.setForeground(backColor); dc.fillRectangle(event->rect.x,y,event->rect.w,event->rect.y+event->rect.h-y); } return 1; } // Zero out lookup string long FXTreeList::onLookupTimer(FXObject*,FXSelector,void*){ lookup=FXString::null; return 1; } // Key Press long FXTreeList::onKeyPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXTreeItem *item=currentitem; FXTreeItem *succ; FXint page; flags&=~FLAG_TIP; if(!isEnabled()) return 0; if(target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr)) return 1; if(item==NULL) item=firstitem; switch(event->code){ case KEY_Control_L: case KEY_Control_R: case KEY_Shift_L: case KEY_Shift_R: case KEY_Alt_L: case KEY_Alt_R: if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; case KEY_Page_Up: case KEY_KP_Page_Up: for(succ=item,page=verticalScrollBar()->getPage(); succ && 0getHeight(this); if(succ->prev){ succ=succ->prev; while(succ->last && ((options&TREELIST_AUTOSELECT) || succ->isExpanded())) succ=succ->last; } else if(succ->parent){ succ=succ->parent; } } goto hop; case KEY_Page_Down: case KEY_KP_Page_Down: for(succ=item,page=verticalScrollBar()->getPage(); succ && 0getHeight(this); if(succ->first && ((options&TREELIST_AUTOSELECT) || succ->isExpanded())){ succ=succ->first; } else{ while(!succ->next && succ->parent) succ=succ->parent; succ=succ->next; } } goto hop; case KEY_Up: // Move up case KEY_KP_Up: if(item){ if(item->prev){ item=item->prev; while(item->last && ((options&TREELIST_AUTOSELECT) || item->isExpanded())) item=item->last; } else if(item->parent){ item=item->parent; } } goto hop; case KEY_Down: // Move down case KEY_KP_Down: if(item){ if(item->first && ((options&TREELIST_AUTOSELECT) || item->isExpanded())){ item=item->first; } else{ while(!item->next && item->parent) item=item->parent; item=item->next; } } goto hop; case KEY_Right: // Move right/down and open subtree case KEY_KP_Right: if(item){ if(!(options&TREELIST_AUTOSELECT) && !item->isExpanded() && (item->hasItems() || item->getFirst())){ expandTree(item,TRUE); } else if(item->first){ item=item->first; } else{ while(!item->next && item->parent) item=item->parent; item=item->next; } } goto hop; case KEY_Left: // Move left/up and close subtree case KEY_KP_Left: if(item){ if(!(options&TREELIST_AUTOSELECT) && item->isExpanded() && (item->hasItems() || item->getFirst())){ collapseTree(item,TRUE); } else if(item->parent){ item=item->parent; } else if(item->prev){ item=item->prev; } } goto hop; case KEY_Home: // Move to first case KEY_KP_Home: item=firstitem; goto hop; case KEY_End: // Move to last case KEY_KP_End: item=lastitem; while(item){ if(item->last && ((options&TREELIST_AUTOSELECT) || item->isExpanded())){ item=item->last; } else if(item->next){ item=item->next; } else{ break; } } hop: lookup=FXString::null; if(item){ setCurrentItem(item,TRUE); makeItemVisible(item); if((options&SELECT_MASK)==TREELIST_EXTENDEDSELECT){ if(item->isEnabled()){ if(event->state&SHIFTMASK){ if(anchoritem){ selectItem(anchoritem,TRUE); extendSelection(item,TRUE); } else{ selectItem(item,TRUE); setAnchorItem(item); } } else if(!(event->state&CONTROLMASK)){ killSelection(TRUE); selectItem(item,TRUE); setAnchorItem(item); } } } } handle(this,FXSEL(SEL_CLICKED,0),(void*)currentitem); if(currentitem && currentitem->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)currentitem); } return 1; case KEY_space: case KEY_KP_Space: lookup=FXString::null; if(item && item->isEnabled()){ switch(options&SELECT_MASK){ case TREELIST_EXTENDEDSELECT: if(event->state&SHIFTMASK){ if(anchoritem){ selectItem(anchoritem,TRUE); extendSelection(item,TRUE); } else{ selectItem(item,TRUE); } } else if(event->state&CONTROLMASK){ toggleItem(item,TRUE); } else{ killSelection(TRUE); selectItem(item,TRUE); } break; case TREELIST_MULTIPLESELECT: case TREELIST_SINGLESELECT: toggleItem(item,TRUE); break; } setAnchorItem(item); } handle(this,FXSEL(SEL_CLICKED,0),(void*)currentitem); if(currentitem && currentitem->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)currentitem); } return 1; case KEY_Return: case KEY_KP_Enter: lookup=FXString::null; handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)currentitem); if(currentitem && currentitem->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)currentitem); } return 1; default: if((FXuchar)event->text[0]<' ') return 0; if(event->state&(CONTROLMASK|ALTMASK)) return 0; if(!Ascii::isPrint(event->text[0])) return 0; lookup.append(event->text); getApp()->addTimeout(this,ID_LOOKUPTIMER,getApp()->getTypingSpeed()); item=findItem(lookup,currentitem,SEARCH_FORWARD|SEARCH_WRAP|SEARCH_PREFIX); if(item){ setCurrentItem(item,TRUE); makeItemVisible(item); if((options&SELECT_MASK)==TREELIST_EXTENDEDSELECT){ if(item->isEnabled()){ killSelection(TRUE); selectItem(item,TRUE); } } setAnchorItem(item); } handle(this,FXSEL(SEL_CLICKED,0),(void*)currentitem); if(currentitem && currentitem->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)currentitem); } return 1; } return 0; } // Key Release long FXTreeList::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(!isEnabled()) return 0; if(target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr)) return 1; switch(event->code){ case KEY_Shift_L: case KEY_Shift_R: case KEY_Control_L: case KEY_Control_R: case KEY_Alt_L: case KEY_Alt_R: if(flags&FLAG_DODRAG){handle(this,FXSEL(SEL_DRAGGED,0),ptr);} return 1; } return 0; } // Scroll timer long FXTreeList::onAutoScroll(FXObject* sender,FXSelector sel,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXTreeItem *item; FXint xx,yy; // Scroll the content FXScrollArea::onAutoScroll(sender,sel,ptr); // Drag and drop mode if(flags&FLAG_DODRAG){ handle(this,FXSEL(SEL_DRAGGED,0),ptr); return 1; } // In autoselect mode, stop scrolling when mouse outside window if((flags&FLAG_PRESSED) || (options&TREELIST_AUTOSELECT)){ // Validated position xx=event->win_x; if(xx<0) xx=0; else if(xx>=viewport_w) xx=viewport_w-1; yy=event->win_y; if(yy<0) yy=0; else if(yy>=viewport_h) yy=viewport_h-1; // Find item item=getItemAt(xx,yy); // Got item and different from last time if(item && item!=currentitem){ // Make it the current item setCurrentItem(item,TRUE); // Extend the selection if((options&SELECT_MASK)==TREELIST_EXTENDEDSELECT){ state=FALSE; extendSelection(item,TRUE); } } return 1; } return 0; } // Mouse motion long FXTreeList::onMotion(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXTreeItem *oldcursoritem=cursoritem; FXuint flg=flags; FXTreeItem *item; // Kill the tip flags&=~FLAG_TIP; // Kill the tip timer getApp()->removeTimeout(this,ID_TIPTIMER); // Right mouse scrolling if(flags&FLAG_SCROLLING){ setPosition(event->win_x-grabx,event->win_y-graby); return 1; } // Drag and drop mode if(flags&FLAG_DODRAG){ if(startAutoScroll(event,TRUE)) return 1; handle(this,FXSEL(SEL_DRAGGED,0),ptr); return 1; } // Tentative drag and drop if((flags&FLAG_TRYDRAG) && event->moved){ flags&=~FLAG_TRYDRAG; if(handle(this,FXSEL(SEL_BEGINDRAG,0),ptr)){ flags|=FLAG_DODRAG; } return 1; } // Normal operation if((flags&FLAG_PRESSED) || (options&TREELIST_AUTOSELECT)){ // Start auto scrolling? if(startAutoScroll(event,FALSE)) return 1; // Find item item=getItemAt(event->win_x,event->win_y); // Got an item different from before if(item && item!=currentitem){ // Make it the current item setCurrentItem(item,TRUE); // Extend the selection if((options&SELECT_MASK)==TREELIST_EXTENDEDSELECT){ state=FALSE; extendSelection(item,TRUE); } } return 1; } // Reset tip timer if nothing's going on getApp()->addTimeout(this,ID_TIPTIMER,getApp()->getMenuPause()); // Get item we're over cursoritem=getItemAt(event->win_x,event->win_y); // Force GUI update only when needed return (cursoritem!=oldcursoritem)||(flg&FLAG_TIP); } // Pressed a button long FXTreeList::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXTreeItem *item; FXint code; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); flags&=~FLAG_UPDATE; // First chance callback if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; // Not autoselect mode if(options&TREELIST_AUTOSELECT) return 1; // Locate item item=getItemAt(event->win_x,event->win_y); // No item if(item==NULL){ if((options&SELECT_MASK)==TREELIST_EXTENDEDSELECT){ if(!(event->state&(SHIFTMASK|CONTROLMASK))){ killSelection(TRUE); } } return 1; } // Find out where hit code=hitItem(item,event->win_x,event->win_y); // Maybe clicked on box if(code==3){ if(isItemExpanded(item)) collapseTree(item,TRUE); else expandTree(item,TRUE); return 1; } // Change current item setCurrentItem(item,TRUE); // Change item selection state=item->isSelected(); switch(options&SELECT_MASK){ case TREELIST_EXTENDEDSELECT: if(event->state&SHIFTMASK){ if(anchoritem){ if(anchoritem->isEnabled()) selectItem(anchoritem,TRUE); extendSelection(item,TRUE); } else{ if(item->isEnabled()) selectItem(item,TRUE); setAnchorItem(item); } } else if(event->state&CONTROLMASK){ if(item->isEnabled() && !state) selectItem(item,TRUE); setAnchorItem(item); } else{ if(item->isEnabled() && !state){ killSelection(TRUE); selectItem(item,TRUE); } setAnchorItem(item); } break; case TREELIST_MULTIPLESELECT: case TREELIST_SINGLESELECT: if(item->isEnabled() && !state) selectItem(item,TRUE); break; } // Start drag if actually pressed text or icon only if(code && item->isSelected() && item->isDraggable()){ flags|=FLAG_TRYDRAG; } flags|=FLAG_PRESSED; return 1; } return 0; } // Released button long FXTreeList::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXuint flg=flags; if(isEnabled()){ ungrab(); stopAutoScroll(); flags|=FLAG_UPDATE; flags&=~(FLAG_PRESSED|FLAG_TRYDRAG|FLAG_DODRAG); // First chance callback if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; // No activity if(!(flg&FLAG_PRESSED) && !(options&TREELIST_AUTOSELECT)) return 1; // Was dragging if(flg&FLAG_DODRAG){ handle(this,FXSEL(SEL_ENDDRAG,0),ptr); return 1; } // Select only enabled item switch(options&SELECT_MASK){ case TREELIST_EXTENDEDSELECT: if(currentitem && currentitem->isEnabled()){ if(event->state&CONTROLMASK){ if(state) deselectItem(currentitem,TRUE); } else if(!(event->state&SHIFTMASK)){ if(state){ killSelection(TRUE); selectItem(currentitem,TRUE); } } } break; case TREELIST_MULTIPLESELECT: case TREELIST_SINGLESELECT: if(currentitem && currentitem->isEnabled()){ if(state) deselectItem(currentitem,TRUE); } break; } // Scroll to make item visibke makeItemVisible(currentitem); // Update anchor setAnchorItem(currentitem); // Generate clicked callbacks if(event->click_count==1){ handle(this,FXSEL(SEL_CLICKED,0),(void*)currentitem); } else if(event->click_count==2){ handle(this,FXSEL(SEL_DOUBLECLICKED,0),(void*)currentitem); } else if(event->click_count==3){ handle(this,FXSEL(SEL_TRIPLECLICKED,0),(void*)currentitem); } // Command callback only when clicked on item if(currentitem && currentitem->isEnabled()){ handle(this,FXSEL(SEL_COMMAND,0),(void*)currentitem); } return 1; } return 0; } // Pressed right button long FXTreeList::onRightBtnPress(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); flags&=~FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; flags|=FLAG_SCROLLING; grabx=event->win_x-pos_x; graby=event->win_y-pos_y; return 1; } return 0; } // Released right button long FXTreeList::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); flags&=~FLAG_SCROLLING; flags|=FLAG_UPDATE; if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; return 1; } return 0; } // The widget lost the grab for some reason long FXTreeList::onUngrabbed(FXObject* sender,FXSelector sel,void* ptr){ FXScrollArea::onUngrabbed(sender,sel,ptr); flags&=~(FLAG_DODRAG|FLAG_TRYDRAG|FLAG_PRESSED|FLAG_CHANGED|FLAG_SCROLLING); flags|=FLAG_UPDATE; stopAutoScroll(); return 1; } // Command message long FXTreeList::onCommand(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); } // Clicked in list long FXTreeList::onClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_CLICKED,message),ptr); } // Double clicked in list; ptr may or may not point to an item long FXTreeList::onDoubleClicked(FXObject*,FXSelector,void* ptr){ // Double click anywhere in the widget if(target && target->tryHandle(this,FXSEL(SEL_DOUBLECLICKED,message),ptr)) return 1; // Double click on an item if(ptr){ if(isItemExpanded((FXTreeItem*)ptr)) collapseTree((FXTreeItem*)ptr,TRUE); else expandTree((FXTreeItem*)ptr,TRUE); } return 0; } // Triple clicked in list; ptr may or may not point to an item long FXTreeList::onTripleClicked(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_TRIPLECLICKED,message),ptr); } // Sort items in ascending order FXint FXTreeList::ascending(const FXTreeItem* a,const FXTreeItem* b){ return compare(a->getText(),b->getText()); } // Sort items in descending order FXint FXTreeList::descending(const FXTreeItem* a,const FXTreeItem* b){ return compare(b->getText(),a->getText()); } // Sort ascending order, case insensitive FXint FXTreeList::ascendingCase(const FXTreeItem* a,const FXTreeItem* b){ return comparecase(a->getText(),b->getText()); } // Sort descending order, case insensitive FXint FXTreeList::descendingCase(const FXTreeItem* a,const FXTreeItem* b){ return comparecase(b->getText(),a->getText()); } // Sort items void FXTreeList::sort(FXTreeItem*& f1,FXTreeItem*& t1,FXTreeItem*& f2,FXTreeItem*& t2,int n){ FXTreeItem *ff1,*tt1,*ff2,*tt2,*q; FXint m; if(f2==NULL){ f1=NULL; t1=NULL; return; } if(n>1){ m=n/2; n=n-m; sort(ff1,tt1,f2,t2,n); // 1 or more sort(ff2,tt2,f2,t2,m); // 0 or more FXASSERT(ff1); if(ff2 && sortfunc(ff1,ff2)>0){ f1=ff2; ff2->prev=NULL; ff2=ff2->next; } else{ f1=ff1; ff1->prev=NULL; ff1=ff1->next; } t1=f1; t1->next=NULL; while(ff1 || ff2){ if(ff1==NULL){ t1->next=ff2; ff2->prev=t1; t1=tt2; break; } if(ff2==NULL){ t1->next=ff1; ff1->prev=t1; t1=tt1; break; } if(sortfunc(ff1,ff2)>0){ t1->next=ff2; ff2->prev=t1; t1=ff2; ff2=ff2->next; } else{ t1->next=ff1; ff1->prev=t1; t1=ff1; ff1=ff1->next; } t1->next=NULL; } return; } FXASSERT(f2); f1=f2; t1=f2; f2=f2->next; while(f2){ f2->prev=NULL; if(sortfunc(f2,t1)>0){ t1->next=f2; f2->prev=t1; t1=f2; f2=f2->next; continue; } if(sortfunc(f1,f2)>0){ q=f2; f2=f2->next; q->next=f1; f1->prev=q; f1=q; continue; } break; } FXASSERT(f1); FXASSERT(t1); f1->prev=NULL; t1->next=NULL; } // Sort root items void FXTreeList::sortRootItems(){ if(sortfunc){ FXTreeItem* f=firstitem; FXTreeItem* l=lastitem; sort(firstitem,lastitem,f,l,getNumItems()); recalc(); } } // Sort child items void FXTreeList::sortChildItems(FXTreeItem* item){ if(sortfunc){ FXTreeItem* f=item->first; FXTreeItem* l=item->last; sort(item->first,item->last,f,l,item->getNumChildren()); if(item->isExpanded()) recalc(); // No need to recalc if it ain't visible! } } // Sort all items recursively void FXTreeList::sortItems(){ register FXTreeItem *item; if(sortfunc){ sortRootItems(); item=firstitem; while(item){ sortChildItems(item); if(item->first){item=item->first;continue;} while(!item->next && item->parent){item=item->parent;} item=item->next; } } } // Set current item void FXTreeList::setCurrentItem(FXTreeItem* item,FXbool notify){ if(item!=currentitem){ // Deactivate old item if(currentitem){ // No visible change if it doen't have the focus if(hasFocus()){ currentitem->setFocus(FALSE); updateItem(currentitem); } // Close old item closeItem(currentitem,notify); } currentitem=item; // Activate new item if(currentitem){ // No visible change if it doen't have the focus if(hasFocus()){ currentitem->setFocus(TRUE); updateItem(currentitem); } // Open new item openItem(currentitem,notify); } // Notify item change if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)currentitem);} } // Select if browse mode if((options&SELECT_MASK)==TREELIST_BROWSESELECT && currentitem && currentitem->isEnabled()){ selectItem(currentitem,notify); } } // Set anchor item void FXTreeList::setAnchorItem(FXTreeItem* item){ anchoritem=item; extentitem=item; } // Create item FXTreeItem* FXTreeList::createItem(const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr){ return new FXTreeItem(text,oi,ci,ptr); } // Insert item under father before other item FXTreeItem* FXTreeList::insertItem(FXTreeItem* other,FXTreeItem* father,FXTreeItem* item,FXbool notify){ register FXTreeItem* olditem=currentitem; // Verify correctness of arguments if(!item){ fxerror("%s::insertItem: NULL item argument.\n",getClassName()); } if(other && other->parent!=father){ fxerror("%s::insertItem: bad argument.\n",getClassName()); } // Hang item into the list if(father){ if(other){ item->next=other; item->prev=other->prev; other->prev=item; } else{ item->next=NULL; item->prev=father->last; father->last=item; } if(item->prev) item->prev->next=item; else father->first=item; } else{ if(other){ item->next=other; item->prev=other->prev; other->prev=item; } else{ item->next=NULL; item->prev=lastitem; lastitem=item; } if(item->prev) item->prev->next=item; else firstitem=item; } // Fill in the rest item->parent=father; item->first=NULL; item->last=NULL; item->x=0; item->y=0; // Make current if just added if(!currentitem && item==lastitem) currentitem=item; // Notify item has been inserted if(notify && target){target->tryHandle(this,FXSEL(SEL_INSERTED,message),(void*)item);} // Current item may have changed if(olditem!=currentitem){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)currentitem);} } // Was new item if(currentitem==item){ if(hasFocus()){ currentitem->setFocus(TRUE); } if((options&SELECT_MASK)==TREELIST_BROWSESELECT && currentitem->isEnabled()){ selectItem(currentitem,notify); } } // Redo layout recalc(); return item; } // Insert item under father before other item FXTreeItem* FXTreeList::insertItem(FXTreeItem* other,FXTreeItem* father,const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr,FXbool notify){ return insertItem(other,father,createItem(text,oi,ci,ptr),notify); } // Append item under father FXTreeItem* FXTreeList::appendItem(FXTreeItem* father,FXTreeItem* item,FXbool notify){ return insertItem(NULL,father,item,notify); } // Append item under father FXTreeItem* FXTreeList::appendItem(FXTreeItem* father,const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr,FXbool notify){ return insertItem(NULL,father,createItem(text,oi,ci,ptr),notify); } // Prepend item under father FXTreeItem* FXTreeList::prependItem(FXTreeItem* father,FXTreeItem* item,FXbool notify){ return insertItem(father?father->first:firstitem,father,item,notify); } // Prepend item under father FXTreeItem* FXTreeList::prependItem(FXTreeItem* father,const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr,FXbool notify){ return insertItem(father?father->first:firstitem,father,createItem(text,oi,ci,ptr),notify); } // Fill list by appending items from array of strings FXint FXTreeList::fillItems(FXTreeItem* father,const FXchar** strings,FXIcon* oi,FXIcon* ci,void* ptr,FXbool notify){ register FXint n=0; if(strings){ while(strings[n]){ appendItem(father,strings[n++],oi,ci,ptr,notify); } } return n; } // Fill list by appending items from newline separated strings FXint FXTreeList::fillItems(FXTreeItem* father,const FXString& strings,FXIcon* oi,FXIcon* ci,void* ptr,FXbool notify){ register FXint n=0; FXString text; while(!(text=strings.section('\n',n)).empty()){ appendItem(father,text,oi,ci,ptr,notify); n++; } return n; } // Move item under father before other item FXTreeItem *FXTreeList::moveItem(FXTreeItem* other,FXTreeItem* father,FXTreeItem* item){ // Verify arguments if(!item){ fxerror("%s::moveItem: NULL item argument.\n",getClassName()); } if(other && other->parent!=father){ fxerror("%s::moveItem: bad argument.\n",getClassName()); } // Can't move in front of itself if(item!=other){ // Unlink from current spot if(item->prev) item->prev->next=item->next; else if(item->parent) item->parent->first=item->next; else firstitem=item->next; if(item->next) item->next->prev=item->prev; else if(item->parent) item->parent->last=item->prev; else lastitem=item->prev; // Hang item into the list if(father){ if(other){ item->next=other; item->prev=other->prev; other->prev=item; } else{ item->next=NULL; item->prev=father->last; father->last=item; } if(item->prev) item->prev->next=item; else father->first=item; } else{ if(other){ item->next=other; item->prev=other->prev; other->prev=item; } else{ item->next=NULL; item->prev=lastitem; lastitem=item; } if(item->prev) item->prev->next=item; else firstitem=item; } // Fill in the rest item->parent=father; // Redo layout recalc(); } return item; } // Extract node from list FXTreeItem* FXTreeList::extractItem(FXTreeItem* item,FXbool notify){ register FXTreeItem *olditem=currentitem; register FXTreeItem *result=item; register FXTreeItem *prv; register FXTreeItem *nxt; register FXTreeItem *par; if(item){ // Remember hookups nxt=result->next; prv=result->prev; par=result->parent; // Unlink item from tree if(prv) prv->next=nxt; else if(par) par->first=nxt; else firstitem=nxt; if(nxt) nxt->prev=prv; else if(par) par->last=prv; else lastitem=prv; // Is now unhooked result->parent=NULL; result->next=NULL; result->prev=NULL; // Successor value if(prv) par=prv; if(nxt) par=nxt; // Visit all children while(item){ // Adjust pointers if(anchoritem==item) anchoritem=par; if(currentitem==item) currentitem=par; if(extentitem==item) extentitem=par; if(viewableitem==item) viewableitem=par; // Next item if(item->first){ item=item->first; continue; } while(!item->next && item->parent){ item=item->parent; } item=item->next; } // Current item has changed if(olditem!=currentitem){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)currentitem);} } // Extracted current item if(currentitem && currentitem!=olditem){ if(hasFocus()){ currentitem->setFocus(TRUE); } if((options&SELECT_MASK)==TREELIST_BROWSESELECT && currentitem->isEnabled()){ selectItem(currentitem,notify); } } // Redo layout recalc(); } return result; } // Remove all siblings from [fm,to] void FXTreeList::removeItems(FXTreeItem* fm,FXTreeItem* to,FXbool notify){ register FXTreeItem *olditem=currentitem; register FXTreeItem *prv; register FXTreeItem *nxt; register FXTreeItem *par; if(fm && to){ if(fm->parent!=to->parent){ fxerror("%s::removeItems: arguments have different parent.\n",getClassName()); } // Delete items while(1){ // Scan till end while(to->last) to=to->last; do{ // Notify item will be deleted if(notify && target){target->tryHandle(this,FXSEL(SEL_DELETED,message),(void*)to);} // Remember hookups nxt=to->next; prv=to->prev; par=to->parent; // Adjust pointers; suggested by Alan Ott if(anchoritem==to){ anchoritem=par; if(prv) anchoritem=prv; if(nxt) anchoritem=nxt; } if(currentitem==to){ currentitem=par; if(prv) currentitem=prv; if(nxt) currentitem=nxt; } if(extentitem==to){ extentitem=par; if(prv) extentitem=prv; if(nxt) extentitem=nxt; } if(viewableitem==to){ viewableitem=par; if(prv) viewableitem=prv; if(nxt) viewableitem=nxt; } // Remove item from list if(prv) prv->next=nxt; else if(par) par->first=nxt; else firstitem=nxt; if(nxt) nxt->prev=prv; else if(par) par->last=prv; else lastitem=prv; // Delete it delete to; // Was last one? if(to==fm) goto x; to=par; } while(!prv); to=prv; } // Current item has changed x: if(olditem!=currentitem){ if(notify && target){target->tryHandle(this,FXSEL(SEL_CHANGED,message),(void*)currentitem);} } // Deleted current item if(currentitem && currentitem!=olditem){ if(hasFocus()){ currentitem->setFocus(TRUE); } if((options&SELECT_MASK)==TREELIST_BROWSESELECT && currentitem->isEnabled()){ selectItem(currentitem,notify); } } // Redo layout recalc(); } } // Remove node from list void FXTreeList::removeItem(FXTreeItem* item,FXbool notify){ removeItems(item,item,notify); } // Remove all items void FXTreeList::clearItems(FXbool notify){ removeItems(firstitem,lastitem,notify); } typedef FXint (*FXCompareFunc)(const FXString&,const FXString &,FXint); // Get item by name FXTreeItem* FXTreeList::findItem(const FXString& text,FXTreeItem* start,FXuint flgs) const { register FXCompareFunc comparefunc; register FXTreeItem *item; register FXint len; if(firstitem){ comparefunc=(flgs&SEARCH_IGNORECASE) ? (FXCompareFunc)comparecase : (FXCompareFunc)compare; len=(flgs&SEARCH_PREFIX)?text.length():2147483647; if(flgs&SEARCH_BACKWARD){ item=start; while(item!=NULL){ if((*comparefunc)(item->getText(),text,len)==0) return item; item=item->getAbove(); } if(start && !(flgs&SEARCH_WRAP)) return NULL; for(item=lastitem; item->getLast(); item=item->getLast()); while(item!=start){ if((*comparefunc)(item->getText(),text,len)==0) return item; item=item->getAbove(); } } else{ item=start; while(item!=NULL){ if((*comparefunc)(item->getText(),text,len)==0) return item; item=item->getBelow(); } if(start && !(flgs&SEARCH_WRAP)) return NULL; item=firstitem; while(item!=start){ if((*comparefunc)(item->getText(),text,len)==0) return item; item=item->getBelow(); } } } return NULL; } // Get item by data FXTreeItem* FXTreeList::findItemByData(const void *ptr,FXTreeItem* start,FXuint flgs) const { register FXTreeItem *item; if(firstitem){ if(flgs&SEARCH_BACKWARD){ item=start; while(item!=NULL){ if(item->getData()==ptr) return item; item=item->getAbove(); } if(start && !(flgs&SEARCH_WRAP)) return NULL; for(item=lastitem; item->getLast(); item=item->getLast()); while(item!=start){ if(item->getData()==ptr) return item; item=item->getAbove(); } } else{ item=start; while(item!=NULL){ if(item->getData()==ptr) return item; item=item->getBelow(); } if(start && !(flgs&SEARCH_WRAP)) return NULL; item=firstitem; while(item!=start){ if(item->getData()==ptr) return item; item=item->getBelow(); } } } return NULL; } // Change the font void FXTreeList::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL argument.\n",getClassName()); } if(font!=fnt){ font=fnt; recalc(); update(); } } // Change help text void FXTreeList::setHelpText(const FXString& text){ help=text; } // Set text color void FXTreeList::setTextColor(FXColor clr){ if(clr!=textColor){ textColor=clr; update(); } } // Set select background color void FXTreeList::setSelBackColor(FXColor clr){ if(clr!=selbackColor){ selbackColor=clr; update(); } } // Set selected text color void FXTreeList::setSelTextColor(FXColor clr){ if(clr!=seltextColor){ seltextColor=clr; update(); } } // Set line color void FXTreeList::setLineColor(FXColor clr){ if(clr!=lineColor){ lineColor=clr; update(); } } // Set parent to child indent amount void FXTreeList::setIndent(FXint in){ if(indent!=in){ indent=in; recalc(); } } // Change list style void FXTreeList::setListStyle(FXuint style){ FXuint opts=(options&~TREELIST_MASK) | (style&TREELIST_MASK); if(options!=opts){ options=opts; recalc(); } } // Get list style FXuint FXTreeList::getListStyle() const { return (options&TREELIST_MASK); } // Save data void FXTreeList::save(FXStream& store) const { FXScrollArea::save(store); store << firstitem; store << lastitem; store << anchoritem; store << currentitem; store << extentitem; store << font; store << textColor; store << selbackColor; store << seltextColor; store << lineColor; store << treeWidth; store << treeHeight; store << visible; store << indent; store << help; } // Load data void FXTreeList::load(FXStream& store){ FXScrollArea::load(store); store >> firstitem; store >> lastitem; store >> anchoritem; store >> currentitem; store >> extentitem; store >> font; store >> textColor; store >> selbackColor; store >> seltextColor; store >> lineColor; store >> treeWidth; store >> treeHeight; store >> visible; store >> indent; store >> help; } // Cleanup FXTreeList::~FXTreeList(){ getApp()->removeTimeout(this,ID_TIPTIMER); getApp()->removeTimeout(this,ID_LOOKUPTIMER); clearItems(FALSE); firstitem=(FXTreeItem*)-1L; lastitem=(FXTreeItem*)-1L; anchoritem=(FXTreeItem*)-1L; currentitem=(FXTreeItem*)-1L; extentitem=(FXTreeItem*)-1L; currentitem=(FXTreeItem*)-1L; font=(FXFont*)-1L; } } fox1.6-1.6.57/src/FXTreeListBox.cpp000066400000000000000000000461401326741342000165770ustar00rootroot00000000000000/******************************************************************************** * * * T r e e L i s t B o x O b j e c t * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTreeListBox.cpp,v 1.60.2.2 2007/06/07 20:17:57 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXApp.h" #include "FXFont.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXLabel.h" #include "FXTextField.h" #include "FXButton.h" #include "FXMenuButton.h" #include "FXPopup.h" #include "FXScrollBar.h" #include "FXTreeList.h" #include "FXTreeListBox.h" /* Notes: - Handling typed text: a) Pass string to target only. b) Pass string to target & add to list [begin, after/before current, or end]. c) Pass string to target & replace current item's label. - In most other respects, it behaves like a FXTextField. - Need to catch up/down arrow keys. - Need to have mode to pass item* instead of char*. - TreeListBox turns OFF GUI Updating while being manipulated. - Fix this one [and FXComboBox also] the height is the height as determined by the TreeList's item height... - Perhaps may add some access API's to FXTreeItem? - The default height of the treelist box is not good yet. - Perhaps use TWO tree lists, one in the pane, and one in the box; we can then rest assured that the metrics are always computed properly. - Still need some code to make sure always one item shows in box. - No reaction to up and down arrow while disabled. */ #define TREELISTBOX_MASK (0) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXTreeListBox) FXTreeListBoxMap[]={ FXMAPFUNC(SEL_FOCUS_UP,0,FXTreeListBox::onFocusUp), FXMAPFUNC(SEL_FOCUS_DOWN,0,FXTreeListBox::onFocusDown), FXMAPFUNC(SEL_FOCUS_SELF,0,FXTreeListBox::onFocusSelf), FXMAPFUNC(SEL_UPDATE,FXTreeListBox::ID_TREE,FXTreeListBox::onTreeUpdate), FXMAPFUNC(SEL_CHANGED,FXTreeListBox::ID_TREE,FXTreeListBox::onTreeChanged), FXMAPFUNC(SEL_CLICKED,FXTreeListBox::ID_TREE,FXTreeListBox::onTreeClicked), FXMAPFUNC(SEL_COMMAND,FXTreeListBox::ID_TREE,FXTreeListBox::onTreeClicked), FXMAPFUNC(SEL_LEFTBUTTONPRESS,FXTreeListBox::ID_FIELD,FXTreeListBox::onFieldButton), FXMAPFUNC(SEL_MOUSEWHEEL,FXTreeListBox::ID_FIELD,FXTreeListBox::onMouseWheel), }; // Object implementation FXIMPLEMENT(FXTreeListBox,FXPacker,FXTreeListBoxMap,ARRAYNUMBER(FXTreeListBoxMap)) // List box FXTreeListBox::FXTreeListBox(FXComposite *p,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXPacker(p,opts,x,y,w,h, 0,0,0,0, 0,0){ flags|=FLAG_ENABLED; target=tgt; message=sel; field=new FXButton(this," ",NULL,this,FXTreeListBox::ID_FIELD,ICON_BEFORE_TEXT|JUSTIFY_LEFT, 0,0,0,0, pl,pr,pt,pb); field->setBackColor(getApp()->getBackColor()); pane=new FXPopup(this,FRAME_LINE); tree=new FXTreeList(pane,this,FXTreeListBox::ID_TREE,TREELIST_BROWSESELECT|TREELIST_AUTOSELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y|SCROLLERS_TRACK|HSCROLLING_OFF); tree->setIndent(0); button=new FXMenuButton(this,FXString::null,NULL,pane,FRAME_RAISED|FRAME_THICK|MENUBUTTON_DOWN|MENUBUTTON_ATTACH_RIGHT, 0,0,0,0, 0,0,0,0); button->setXOffset(border); button->setYOffset(border); flags&=~FLAG_UPDATE; // Never GUI update } // Create window void FXTreeListBox::create(){ FXPacker::create(); pane->create(); } // Detach window void FXTreeListBox::detach(){ pane->detach(); FXPacker::detach(); } // Destroy window void FXTreeListBox::destroy(){ pane->destroy(); FXPacker::destroy(); } // Enable the window void FXTreeListBox::enable(){ if(!isEnabled()){ FXPacker::enable(); field->setBackColor(getApp()->getBackColor()); field->enable(); button->enable(); } } // Disable the window void FXTreeListBox::disable(){ if(isEnabled()){ FXPacker::disable(); field->setBackColor(getApp()->getBaseColor()); field->disable(); button->disable(); } } // Get default width FXint FXTreeListBox::getDefaultWidth(){ FXint ww,pw; ww=field->getDefaultWidth()+button->getDefaultWidth()+(border<<1); pw=pane->getDefaultWidth(); return FXMAX(ww,pw); } // Get default height FXint FXTreeListBox::getDefaultHeight(){ FXint th,bh; th=field->getDefaultHeight(); bh=button->getDefaultHeight(); return FXMAX(th,bh)+(border<<1); } // Recalculate layout void FXTreeListBox::layout(){ FXint buttonWidth,fieldWidth,itemHeight; itemHeight=height-(border<<1); buttonWidth=button->getDefaultWidth(); fieldWidth=width-buttonWidth-(border<<1); field->position(border,border,fieldWidth,itemHeight); button->position(border+fieldWidth,border,buttonWidth,itemHeight); pane->resize(width,pane->getDefaultHeight()); flags&=~FLAG_DIRTY; } // Forward clicked message from list to target long FXTreeListBox::onTreeClicked(FXObject*,FXSelector sel,void* ptr){ button->handle(this,FXSEL(SEL_COMMAND,ID_UNPOST),NULL); if(FXSELTYPE(sel)==SEL_COMMAND){ field->setText(tree->getItemText((FXTreeItem*)ptr)); field->setIcon(tree->getItemClosedIcon((FXTreeItem*)ptr)); if(target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),ptr); } return 1; } // Forward changed message from list to target long FXTreeListBox::onTreeChanged(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_CHANGED,message),ptr); } // Forward GUI update of tree to target; but only if pane is not popped long FXTreeListBox::onTreeUpdate(FXObject*,FXSelector,void*){ return target && !isPaneShown() && target->tryHandle(this,FXSEL(SEL_UPDATE,message),NULL); } // Pressed left button in text field long FXTreeListBox::onFieldButton(FXObject*,FXSelector,void*){ button->handle(this,FXSEL(SEL_COMMAND,ID_POST),NULL); // Post the list return 1; } // Bounce focus to the field long FXTreeListBox::onFocusSelf(FXObject* sender,FXSelector,void* ptr){ return field->handle(sender,FXSEL(SEL_FOCUS_SELF,0),ptr); } // Select upper item long FXTreeListBox::onFocusUp(FXObject*,FXSelector,void*){ if(isEnabled()){ FXTreeItem *item=getCurrentItem(); if(!item){ for(item=getLastItem(); item->getLast(); item=item->getLast()); } else if(item->getAbove()){ item=item->getAbove(); } if(item){ setCurrentItem(item,TRUE); } return 1; } return 0; } // Select lower item long FXTreeListBox::onFocusDown(FXObject*,FXSelector,void*){ if(isEnabled()){ FXTreeItem *item=getCurrentItem(); if(!item){ item=getFirstItem(); } else if(item->getBelow()){ item=item->getBelow(); } if(item){ setCurrentItem(item,TRUE); } return 1; } return 0; } // Mouse wheel long FXTreeListBox::onMouseWheel(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; if(isEnabled()){ FXTreeItem *item=getCurrentItem(); if(event->code<0){ if(!item){ item=getFirstItem(); } else if(item->getBelow()){ item=item->getBelow(); } } else if(event->code>0){ if(!item){ for(item=getLastItem(); item->getLast(); item=item->getLast()); } else if(item->getAbove()){ item=item->getAbove(); } } if(item){ setCurrentItem(item,TRUE); } return 1; } return 0; } // Is the pane shown FXbool FXTreeListBox::isPaneShown() const { return pane->shown(); } // Set font void FXTreeListBox::setFont(FXFont* fnt){ if(!fnt){ fxerror("%s::setFont: NULL font specified.\n",getClassName()); } field->setFont(fnt); tree->setFont(fnt); recalc(); } // Obtain font FXFont* FXTreeListBox::getFont() const { return field->getFont(); } // Get number of items FXint FXTreeListBox::getNumItems() const { return tree->getNumItems(); } // Get number of visible items FXint FXTreeListBox::getNumVisible() const { return tree->getNumVisible(); } // Set number of visible items void FXTreeListBox::setNumVisible(FXint nvis){ tree->setNumVisible(nvis); } // Get first item FXTreeItem* FXTreeListBox::getFirstItem() const { return tree->getFirstItem(); } // Get last item FXTreeItem* FXTreeListBox::getLastItem() const { return tree->getLastItem(); } // Fill tree list box by appending items from array of strings FXint FXTreeListBox::fillItems(FXTreeItem* father,const FXchar** strings,FXIcon* oi,FXIcon* ci,void* ptr){ register FXTreeItem* currentitem=tree->getCurrentItem(); register FXint n=tree->fillItems(father,strings,oi,ci,ptr); if(currentitem!=tree->getCurrentItem()){ field->setIcon(tree->getItemClosedIcon(tree->getCurrentItem())); field->setText(tree->getItemText(tree->getCurrentItem())); } recalc(); return n; } // Fill tree list box by appending items from newline separated strings FXint FXTreeListBox::fillItems(FXTreeItem* father,const FXString& strings,FXIcon* oi,FXIcon* ci,void* ptr){ register FXTreeItem* currentitem=tree->getCurrentItem(); register FXint n=tree->fillItems(father,strings,oi,ci,ptr); if(currentitem!=tree->getCurrentItem()){ field->setIcon(tree->getItemClosedIcon(tree->getCurrentItem())); field->setText(tree->getItemText(tree->getCurrentItem())); } recalc(); return n; } // Insert item under father before other item FXTreeItem* FXTreeListBox::insertItem(FXTreeItem* other,FXTreeItem* father,FXTreeItem* item){ register FXTreeItem *newitem=tree->insertItem(other,father,item); if(tree->getCurrentItem()==newitem){ field->setIcon(tree->getItemClosedIcon(newitem)); field->setText(tree->getItemText(newitem)); } recalc(); return newitem; } // Insert item with given text and optional icons, and user-data pointer under father before other item FXTreeItem* FXTreeListBox::insertItem(FXTreeItem* other,FXTreeItem* father,const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr){ register FXTreeItem *newitem=tree->insertItem(other,father,text,oi,ci,ptr); if(tree->getCurrentItem()==newitem){ field->setIcon(tree->getItemClosedIcon(newitem)); field->setText(tree->getItemText(newitem)); } recalc(); return newitem; } // Append item as last child of father FXTreeItem* FXTreeListBox::appendItem(FXTreeItem* father,FXTreeItem* item){ register FXTreeItem *newitem=tree->appendItem(father,item); if(tree->getCurrentItem()==newitem){ field->setIcon(tree->getItemClosedIcon(newitem)); field->setText(tree->getItemText(newitem)); } recalc(); return newitem; } // Append item with given text and optional icons, and user-data pointer as last child of father FXTreeItem* FXTreeListBox::appendItem(FXTreeItem* father,const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr){ register FXTreeItem *newitem=tree->appendItem(father,text,oi,ci,ptr); if(tree->getCurrentItem()==newitem){ field->setIcon(tree->getItemClosedIcon(newitem)); field->setText(tree->getItemText(newitem)); } recalc(); return newitem; } // Prepend item as first child of father FXTreeItem* FXTreeListBox::prependItem(FXTreeItem* father,FXTreeItem* item){ register FXTreeItem *newitem=tree->prependItem(father,item); if(tree->getCurrentItem()==newitem){ field->setIcon(tree->getItemClosedIcon(newitem)); field->setText(tree->getItemText(newitem)); } recalc(); return newitem; } // Prepend item with given text and optional icons, and user-data pointer as first child of father FXTreeItem* FXTreeListBox::prependItem(FXTreeItem* father,const FXString& text,FXIcon* oi,FXIcon* ci,void* ptr){ register FXTreeItem *newitem=tree->prependItem(father,text,oi,ci,ptr); if(tree->getCurrentItem()==newitem){ field->setIcon(tree->getItemClosedIcon(newitem)); field->setText(tree->getItemText(newitem)); } recalc(); return newitem; } // Move item under father before other item FXTreeItem *FXTreeListBox::moveItem(FXTreeItem* other,FXTreeItem* father,FXTreeItem* item){ register FXTreeItem *newitem=tree->moveItem(other,father,item); recalc(); return newitem; } // Extract item FXTreeItem* FXTreeListBox::extractItem(FXTreeItem* item){ register FXTreeItem *currentitem=tree->getCurrentItem(); register FXTreeItem *result=tree->extractItem(item); if(item==currentitem){ currentitem=tree->getCurrentItem(); if(currentitem){ field->setIcon(tree->getItemClosedIcon(currentitem)); field->setText(tree->getItemText(currentitem)); } else{ field->setIcon(NULL); field->setText(" "); } } recalc(); return result; } // Remove given item void FXTreeListBox::removeItem(FXTreeItem* item){ register FXTreeItem *currentitem=tree->getCurrentItem(); tree->removeItem(item); if(item==currentitem){ currentitem=tree->getCurrentItem(); if(currentitem){ field->setIcon(tree->getItemClosedIcon(currentitem)); field->setText(tree->getItemText(currentitem)); } else{ field->setIcon(NULL); field->setText(" "); } } recalc(); } // Remove sequence of items void FXTreeListBox::removeItems(FXTreeItem* fm,FXTreeItem* to){ tree->removeItems(fm,to); recalc(); } // Remove all items void FXTreeListBox::clearItems(){ tree->clearItems(); recalc(); } // Get item by name FXTreeItem* FXTreeListBox::findItem(const FXString& text,FXTreeItem* start,FXuint flgs) const { return tree->findItem(text,start,flgs); } // Get item by data FXTreeItem* FXTreeListBox::findItemByData(const void *ptr,FXTreeItem* start,FXuint flgs) const { return tree->findItemByData(ptr,start,flgs); } // Is item current FXbool FXTreeListBox::isItemCurrent(const FXTreeItem* item) const { return tree->isItemCurrent(item); } // Is item a leaf FXbool FXTreeListBox::isItemLeaf(const FXTreeItem* item) const { return tree->isItemLeaf(item); } // Sort all items recursively void FXTreeListBox::sortItems(){ tree->sortItems(); } // Sort item child list void FXTreeListBox::sortChildItems(FXTreeItem* item){ tree->sortChildItems(item); } // Sort item list void FXTreeListBox::sortRootItems(){ tree->sortRootItems(); } // Change current item void FXTreeListBox::setCurrentItem(FXTreeItem* item,FXbool notify){ FXTreeItem* current=tree->getCurrentItem(); if(current!=item){ tree->setCurrentItem(item); tree->makeItemVisible(item); if(item){ field->setIcon(tree->getItemClosedIcon(item)); field->setText(tree->getItemText(item)); } else{ field->setIcon(NULL); field->setText(FXString::null); } if(notify && target) target->tryHandle(this,FXSEL(SEL_COMMAND,message),(void*)item); } } // Get current item FXTreeItem* FXTreeListBox::getCurrentItem() const { return tree->getCurrentItem(); } // Set item text void FXTreeListBox::setItemText(FXTreeItem* item,const FXString& text){ if(item==NULL){ fxerror("%s::setItemText: item is NULL\n",getClassName()); } if(isItemCurrent(item)) field->setText(text); tree->setItemText(item,text); recalc(); } // Get item text FXString FXTreeListBox::getItemText(const FXTreeItem* item) const { if(item==NULL){ fxerror("%s::getItemText: item is NULL\n",getClassName()); } return tree->getItemText(item); } // Change open icon void FXTreeListBox::setItemOpenIcon(FXTreeItem* item,FXIcon* icon,FXbool owned){ tree->setItemOpenIcon(item,icon,owned); } // Get open icon FXIcon* FXTreeListBox::getItemOpenIcon(const FXTreeItem* item) const { return tree->getItemOpenIcon(item); } // Set closed icon void FXTreeListBox::setItemClosedIcon(FXTreeItem* item,FXIcon* icon,FXbool owned){ tree->setItemClosedIcon(item,icon,owned); } // Get closed icon FXIcon* FXTreeListBox::getItemClosedIcon(const FXTreeItem* item) const{ return tree->getItemClosedIcon(item); } // Set item data void FXTreeListBox::setItemData(FXTreeItem* item,void* ptr) const { if(item==NULL){ fxerror("%s::setItemData: item is NULL\n",getClassName()); } tree->setItemData(item,ptr); } // Get item data void* FXTreeListBox::getItemData(const FXTreeItem* item) const { if(item==NULL){ fxerror("%s::getItemData: item is NULL\n",getClassName()); } return tree->getItemData(item); } // Get sort function FXTreeListSortFunc FXTreeListBox::getSortFunc() const { return tree->getSortFunc(); } // Change sort function void FXTreeListBox::setSortFunc(FXTreeListSortFunc func){ tree->setSortFunc(func); } // Change list style void FXTreeListBox::setListStyle(FXuint mode){ FXuint opts=(options&~TREELISTBOX_MASK)|(mode&TREELISTBOX_MASK); if(opts!=options){ options=opts; recalc(); } } // Get list style FXuint FXTreeListBox::getListStyle() const { return (options&TREELISTBOX_MASK); } // Set help text void FXTreeListBox::setHelpText(const FXString& txt){ field->setHelpText(txt); } // Get help text const FXString& FXTreeListBox::getHelpText() const { return field->getHelpText(); } // Set tip text void FXTreeListBox::setTipText(const FXString& txt){ field->setTipText(txt); } // Get tip text const FXString& FXTreeListBox::getTipText() const { return field->getTipText(); } // Save object to stream void FXTreeListBox::save(FXStream& store) const { FXPacker::save(store); store << field; store << button; store << tree; store << pane; } // Load object from stream void FXTreeListBox::load(FXStream& store){ FXPacker::load(store); store >> field; store >> button; store >> tree; store >> pane; } // Delete it FXTreeListBox::~FXTreeListBox(){ delete pane; pane=(FXPopup*)-1L; field=(FXButton*)-1L; button=(FXMenuButton*)-1L; tree=(FXTreeList*)-1L; } } fox1.6-1.6.57/src/FXTriStateButton.cpp000066400000000000000000000311561326741342000173270ustar00rootroot00000000000000/******************************************************************************** * * * T r i - S t a t e B u t t o n W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Charles Warren. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXTriStateButton.cpp,v 1.15 2006/01/22 17:58:50 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXDCWindow.h" #include "FXIcon.h" #include "FXToggleButton.h" #include "FXTriStateButton.h" /* Notes: - Small change from Charles' original code:- normal label and icon are now used as fallback; this means its possible for example to just specify three icons and use same text for all, or vice-versa just specify three labels and use same icons for all. - Likewise, help text and tip text follow similar fallback scheme. - Since there is no way INTO the MAYBE state except programmatically, there is no attempt to install a hotkey for this! - The fallback logic needs to be properly adhered to in the size computation. */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXTriStateButton) FXTriStateButtonMap[]={ FXMAPFUNC(SEL_PAINT,0,FXTriStateButton::onPaint), FXMAPFUNC(SEL_UPDATE,0,FXTriStateButton::onUpdate), FXMAPFUNC(SEL_QUERY_TIP,0,FXTriStateButton::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXTriStateButton::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UNKNOWN,FXTriStateButton::onUnknown) }; // Object implementation FXIMPLEMENT(FXTriStateButton,FXToggleButton,FXTriStateButtonMap,ARRAYNUMBER(FXTriStateButtonMap)) // Deserialization FXTriStateButton::FXTriStateButton(){ maybeicon=(FXIcon*)-1L; } // Construct and init FXTriStateButton::FXTriStateButton(FXComposite* p,const FXString& text1,const FXString& text2,const FXString& text3,FXIcon* icon1,FXIcon* icon2,FXIcon* icon3,FXObject* tgt,FXSelector sel,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb): FXToggleButton(p,text1,text2,icon1,icon2,tgt,sel,opts,x,y,w,h,pl,pr,pt,pb){ maybelabel=text3.section('\t',0); maybetip=text3.section('\t',1); maybehelp=text3.section('\t',2); maybeicon=icon3; } // Create window void FXTriStateButton::create(){ FXToggleButton::create(); if(maybeicon) maybeicon->create(); } // Detach window void FXTriStateButton::detach(){ FXToggleButton::detach(); if(maybeicon) maybeicon->detach(); } // Get default width FXint FXTriStateButton::getDefaultWidth(){ FXint tw,iw,s,w1,w2,w3; tw=iw=s=0; if(!label.empty()) tw=labelWidth(label); if(icon) iw=icon->getWidth(); if(iw && tw) s=4; if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w1=FXMAX(tw,iw); else w1=tw+iw+s; tw=iw=s=0; if(!altlabel.empty()) tw=labelWidth(altlabel); if(alticon) iw=alticon->getWidth(); if(iw && tw) s=4; if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w2=FXMAX(tw,iw); else w2=tw+iw+s; tw=iw=s=0; if(!maybelabel.empty()) tw=labelWidth(maybelabel); if(maybeicon) iw=maybeicon->getWidth(); if(iw && tw) s=4; if(!(options&(ICON_AFTER_TEXT|ICON_BEFORE_TEXT))) w3=FXMAX(tw,iw); else w3=tw+iw+s; return FXMAX3(w1,w2,w3)+padleft+padright+(border<<1); } // Get default height FXint FXTriStateButton::getDefaultHeight(){ FXint th,ih,h1,h2,h3; th=ih=0; if(!label.empty()) th=labelHeight(label); if(icon) ih=icon->getHeight(); if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h1=FXMAX(th,ih); else h1=th+ih; th=ih=0; if(!altlabel.empty()) th=labelHeight(altlabel); if(alticon) ih=alticon->getHeight(); if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h2=FXMAX(th,ih); else h2=th+ih; th=ih=0; if(!maybelabel.empty()) th=labelHeight(maybelabel); if(maybeicon) ih=maybeicon->getHeight(); if(!(options&(ICON_ABOVE_TEXT|ICON_BELOW_TEXT))) h3=FXMAX(th,ih); else h3=th+ih; return FXMAX3(h1,h2,h3)+padtop+padbottom+(border<<1); } // Check the menu button long FXTriStateButton::onUnknown(FXObject*,FXSelector,void*){ setState(MAYBE); return 1; } // We were asked about status text long FXTriStateButton::onQueryHelp(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryHelp(sender,sel,ptr)) return 1; if(flags&FLAG_HELP){ if(state==TRUE){ if(!althelp.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&althelp); return 1; } } else if(state==MAYBE){ if(!maybehelp.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&maybehelp); return 1; } } if(!help.empty()){ if(!help.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&help); return 1; } } } return 0; } // We were asked about tip text long FXTriStateButton::onQueryTip(FXObject* sender,FXSelector sel,void* ptr){ if(FXWindow::onQueryTip(sender,sel,ptr)) return 1; if(flags&FLAG_TIP){ if(state==TRUE){ if(!alttip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&alttip); return 1; } } else if(state==MAYBE){ if(!maybetip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&maybetip); return 1; } } if(!tip.empty()){ sender->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&tip); return 1; } } return 0; } // Handle repaint long FXTriStateButton::onPaint(FXObject*,FXSelector,void* ptr){ FXint tw=0,th=0,iw=0,ih=0,tx,ty,ix,iy; FXEvent *ev=(FXEvent*)ptr; FXDCWindow dc(this,ev); // Got a border at all? if(options&(FRAME_RAISED|FRAME_SUNKEN)){ // Toolbar style if(options&TOGGLEBUTTON_TOOLBAR){ // Enabled and cursor inside and down if(down){ dc.setForeground(hiliteColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height); else drawSunkenRectangle(dc,0,0,width,height); } // Enabled and cursor inside, and up else if(isEnabled() && underCursor()){ dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } // Disabled or unchecked or not under cursor else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } } // Normal style else{ // Draw sunken if pressed if(down){ dc.setForeground(hiliteColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleSunkenRectangle(dc,0,0,width,height); else drawSunkenRectangle(dc,0,0,width,height); } // Draw raised if not currently pressed down else{ dc.setForeground(backColor); dc.fillRectangle(border,border,width-border*2,height-border*2); if(options&FRAME_THICK) drawDoubleRaisedRectangle(dc,0,0,width,height); else drawRaisedRectangle(dc,0,0,width,height); } } } // No borders else{ dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); } // Place text & icon if(state==TRUE && !altlabel.empty()){ tw=labelWidth(altlabel); th=labelHeight(altlabel); } else if(state==MAYBE && !maybelabel.empty()){ tw=labelWidth(maybelabel); th=labelHeight(maybelabel); } else if(!label.empty()){ tw=labelWidth(label); th=labelHeight(label); } if(state==TRUE && alticon){ iw=alticon->getWidth(); ih=alticon->getHeight(); } else if(state==MAYBE && maybeicon){ iw=maybeicon->getWidth(); ih=maybeicon->getHeight(); } else if(icon){ iw=icon->getWidth(); ih=icon->getHeight(); } just_x(tx,ix,tw,iw); just_y(ty,iy,th,ih); // Shift a bit when pressed if(down && (options&(FRAME_RAISED|FRAME_SUNKEN))){ ++tx; ++ty; ++ix; ++iy; } // Draw enabled state if(isEnabled()){ // Paint the right icon if(state==TRUE && alticon){ dc.drawIcon(alticon,ix,iy); } else if(state==MAYBE &&maybeicon){ dc.drawIcon(maybeicon,ix,iy); } else if(icon){ dc.drawIcon(icon,ix,iy); } // Paint the right text if(state==TRUE && !altlabel.empty()){ dc.setFont(font); dc.setForeground(textColor); drawLabel(dc,altlabel,althotoff,tx,ty,tw,th); } else if(state==MAYBE && !maybelabel.empty()){ dc.setFont(font); dc.setForeground(textColor); drawLabel(dc,maybelabel,-1,tx,ty,tw,th); } else if(!label.empty()){ dc.setFont(font); dc.setForeground(textColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } if(hasFocus()){ dc.drawFocusRectangle(border+1,border+1,width-2*border-2,height-2*border-2); } } // Draw grayed-out state else{ // Paint the right icon if(state==TRUE && alticon){ dc.drawIconSunken(alticon,ix,iy); } else if(state==MAYBE &&maybeicon){ dc.drawIconSunken(maybeicon,ix,iy); } else if(icon){ dc.drawIconSunken(icon,ix,iy); } // Paint the right text if(state==TRUE && !altlabel.empty()){ dc.setFont(font); dc.setForeground(hiliteColor); drawLabel(dc,altlabel,althotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,altlabel,althotoff,tx,ty,tw,th); } else if(state==MAYBE && !maybelabel.empty()){ dc.setFont(font); dc.setForeground(hiliteColor); drawLabel(dc,maybelabel,-1,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,maybelabel,-1,tx,ty,tw,th); } else if(!label.empty()){ dc.setFont(font); dc.setForeground(hiliteColor); drawLabel(dc,label,hotoff,tx+1,ty+1,tw,th); dc.setForeground(shadowColor); drawLabel(dc,label,hotoff,tx,ty,tw,th); } } return 1; } // Change text void FXTriStateButton::setMaybeText(const FXString& text){ if(maybelabel!=text){ maybelabel=text; recalc(); update(); } } // Change icon void FXTriStateButton::setMaybeIcon(FXIcon* ic){ if(maybeicon!=ic){ maybeicon=ic; recalc(); update(); } } // Change help text void FXTriStateButton::setMaybeHelpText(const FXString& text){ maybehelp=text; } // Change tip text void FXTriStateButton::setMaybeTipText(const FXString& text){ maybetip=text; } // Save object to stream void FXTriStateButton::save(FXStream& store) const { FXToggleButton::save(store); store << maybelabel; store << maybeicon; store << maybetip; store << maybehelp; } // Load object from stream void FXTriStateButton::load(FXStream& store){ FXToggleButton::load(store); store >> maybelabel; store >> maybeicon; store >> maybetip; store >> maybehelp; } // Destruct FXTriStateButton::~FXTriStateButton(){ maybeicon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXURL.cpp000066400000000000000000000137351326741342000150410ustar00rootroot00000000000000/******************************************************************************** * * * U R L M a n i p u l a t i o n * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXURL.cpp,v 1.32.2.1 2008/02/19 22:13:21 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxpriv.h" #include "fxascii.h" #include "FXHash.h" #include "FXStream.h" #include "FXString.h" #include "FXPath.h" #include "FXURL.h" /* Notes: - Functions contributed by Sean Hubbell and Sander Jansen. - The result of gethostname should be fed into gethostbyname() to obtain the official host name. - About drive letters in URL's, Daniel Gehriger has some some empirical tests, and determined the following: NS = works on Netscape IE = works on IE O = works on Opera - file:///C|/TEMP/ NS, IE, O - file:///C:/TEMP/ NS, IE, O - file://localhost/C:/TEMP/ NS, IE, O - file://localhost/C|/TEMP/ NS, IE, O - file://C:/TEMP/ NS, IE, -- - file:///C/TEMP/ --, --, -- The conclusion seems to be we should probably try to handle all of these possibilities, although keeping the `:' seems favorable. - For now we don't encode any reserved characters. They need to be encoded if they're not part of the scheme. I don't have a way of figuring out if they're part of a scheme or not. */ using namespace FX; /*******************************************************************************/ namespace FX { // Return host name FXString FXURL::hostname(){ FXchar name[512]; if(gethostname(name,sizeof(name))==0){ return name; } return "localhost"; } // Return URL of filename FXString FXURL::fileToURL(const FXString& file){ #ifndef WIN32 return "file:"+file; // UNIX is easy #else FXString absfile=FXPath::absolute(file).substitute(PATHSEP,'/'); if(Ascii::isLetter(absfile[0]) && absfile[1]==':') return "file://"+FXURL::hostname()+"/"+absfile; // Drive letter return "file://"+FXURL::hostname()+absfile; //if(isalpha(absfile[0]) && absfile[1]==':') return "file:///"+absfile; // Drive letter //return "file://"+absfile; #endif } // Return filename from URL, empty if url is not a local file FXString FXURL::fileFromURL(const FXString& url){ #ifndef WIN32 FXint t; if(comparecase("file:",url,5)==0){ if(url[5]==PATHSEP && url[6]==PATHSEP){ t=url.find(PATHSEP,7); if(7='{') && strchr(URL_UNSAFE URL_RESERVED,c)){ result.append('%'); result.append(FXString::HEX[(c>>4)&15]); result.append(FXString::HEX[c&15]); continue; } result.append(c); } return result; } } fox1.6-1.6.57/src/FXUTF16Codec.cpp000066400000000000000000000272251326741342000161410ustar00rootroot00000000000000/******************************************************************************** * * * U T F - 1 6 T e x t C o d e c * * * ********************************************************************************* * Copyright (C) 2002,2006 by L.Johnson & J.van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXUTF16Codec.cpp,v 1.17 2006/01/22 17:58:50 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXDict.h" #include "FXString.h" #include "FXTextCodec.h" #include "FXUTF16Codec.h" /* Notes: - Default byte-order in absence of BOM is big-endian. - UTF-16BE and UTF-16LE do not expect BOM, always same endianness. - Single character wc2mb does not write BOM. - Single character mb2wc does, however, read over BOM. - Error when trying to write surrogate character. */ /*******************************************************************************/ namespace FX { FXIMPLEMENT(FXUTF16BECodec,FXTextCodec,NULL,0) // Convert from utf16be FXint FXUTF16BECodec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { const FXint SURROGATE_OFFSET=0x10000-(0xD800<<10)-0xDC00; register FXwchar w; if(nsrc<2) return -2; wc=(((FXuchar)src[0])<<8)|((FXuchar)src[1]); if(0xD800<=wc && wc<0xDC00){ if(nsrc<2) return -2; w=(((FXuchar)src[2])<<8)|((FXuchar)src[3]); if(w<0xDC00 || 0xE000<=w) return 0; wc=(wc<<10)+w+SURROGATE_OFFSET; return 4; } return 2; } // Convert to utf16be FXint FXUTF16BECodec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { const FXint LEAD_OFFSET=0xD800-(0x10000>>10); register FXwchar w; if(0xD800<=wc && wc<0xE000) return 0; if(ndst<2) return -2; dst[0]=(FXchar)(wc>>8); dst[1]=(FXchar)(wc); if(0xFFFF>10)+LEAD_OFFSET; dst[0]=(FXchar)(w>>8); dst[1]=(FXchar)(w); w=(wc&0x3FF)+0xDC00; dst[2]=(FXchar)(w>>8); dst[3]=(FXchar)(w); return 4; } return 2; } // Return the name for this codec const FXchar* FXUTF16BECodec::name() const { return "UTF-16BE"; } // Return the IANA mime name for this codec const FXchar* FXUTF16BECodec::mimeName() const { return "UTF-16BE"; } // Return code for UTF-16 FXint FXUTF16BECodec::mibEnum() const { return 1013; } // Return aliases const FXchar* const* FXUTF16BECodec::aliases() const { static const FXchar *const list[]={"iso10646-1","UTF-16BE",NULL}; return list; } /*******************************************************************************/ FXIMPLEMENT(FXUTF16LECodec,FXTextCodec,NULL,0) // Convert from utf16le FXint FXUTF16LECodec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { const FXint SURROGATE_OFFSET=0x10000-(0xD800<<10)-0xDC00; register FXwchar w; if(nsrc<2) return -2; wc=(((FXuchar)src[1])<<8)|((FXuchar)src[0]); if(0xD800<=wc && wc<0xDC00){ if(nsrc<2) return -2; w=(((FXuchar)src[3])<<8)|((FXuchar)src[2]); if(w<0xDC00 || 0xE000<=w) return 0; wc=(wc<<10)+w+SURROGATE_OFFSET; return 4; } return 2; } // Convert to utf16le FXint FXUTF16LECodec::wc2mb(FXchar* dst,FXint ndst,FXwchar wc) const { const FXint LEAD_OFFSET=0xD800-(0x10000>>10); register FXwchar w; if(0xD800<=wc && wc<0xE000) return 0; if(ndst<2) return -2; dst[0]=(FXchar)(wc); dst[1]=(FXchar)(wc>>8); if(0xFFFF>10)+LEAD_OFFSET; dst[0]=(FXchar)(w); dst[1]=(FXchar)(w>>8); w=(wc&0x3FF)+0xDC00; dst[2]=(FXchar)(w); dst[3]=(FXchar)(w>>8); return 4; } return 2; } // Return the name for this codec const FXchar* FXUTF16LECodec::name() const { return "UTF-16LE"; } // Return the IANA mime name for this codec const FXchar* FXUTF16LECodec::mimeName() const { return "UTF-16LE"; } // Return code for UTF-16 FXint FXUTF16LECodec::mibEnum() const { return 1014; } // Return aliases const FXchar* const* FXUTF16LECodec::aliases() const { static const FXchar *const list[]={"UTF-16LE",NULL}; return list; } /*******************************************************************************/ FXIMPLEMENT(FXUTF16Codec,FXTextCodec,NULL,0) // Convert utf16 but strip BOM FXint FXUTF16Codec::mb2wc(FXwchar& wc,const FXchar* src,FXint nsrc) const { const FXint SURROGATE_OFFSET=0x10000-(0xD800<<10)-0xDC00; register const FXuchar *s=(const FXuchar*)src; register FXwchar w; if(nsrc<2) return -2; wc=(s[0]<<8)|s[1]; if(wc==0xFEFF){ if(nsrc<4) return -4; wc=(s[2]<<8)|s[3]; if(0xD800<=wc && wc<0xDC00){ if(nsrc<6) return -6; w=(s[4]<<8)|s[5]; if(w<0xDC00 || 0xE000<=w) return 0; wc=(wc<<10)+w+SURROGATE_OFFSET; return 6; } return 4; } if(wc==0xFFFE){ if(nsrc<4) return -4; wc=(s[3]<<8)|s[2]; if(0xD800<=wc && wc<0xDC00){ if(nsrc<6) return -6; w=(s[5]<<8)|s[4]; if(w<0xDC00 || 0xE000<=w) return 0; wc=(wc<<10)+w+SURROGATE_OFFSET; return 6; } return 4; } if(0xD800<=wc && wc<0xDC00){ if(nsrc<4) return -4; w=(s[2]<<8)|s[3]; if(w<0xDC00 || 0xE000<=w) return 0; wc=(wc<<10)+w+SURROGATE_OFFSET; return 4; } return 2; } // Number of bytes for wide character static inline FXint utflen(FXwchar w){ if(w<0x80) return 1; if(w<0x800) return 2; if(w<0x10000) return 3; if(w<0x200000) return 4; if(w<0x4000000) return 5; return 6; } // Count number of utf8 characters needed to convert multi-byte characters from src FXint FXUTF16Codec::mb2utflen(const FXchar* src,FXint nsrc) const { const FXint SURROGATE_OFFSET=0x10000-(0xD800<<10)-0xDC00; register FXint len=0; FXwchar w,v; if(src && 0>10); register FXwchar w; if(0xD800<=wc && wc<0xE000) return 0; if(ndst<2) return -2; dst[0]=(FXchar)(wc>>8); dst[1]=(FXchar)(wc); if(0xFFFF>10)+LEAD_OFFSET; dst[0]=(FXchar)(w>>8); dst[1]=(FXchar)(w); w=(wc&0x3FF)+0xDC00; dst[2]=(FXchar)(w>>8); dst[3]=(FXchar)(w); return 4; } return 2; } // Count multi-byte characters characters needed to convert utf8 from src FXint FXUTF16Codec::utf2mblen(const FXchar* src,FXint nsrc) const { register FXint nr,len=0; FXchar buffer[64]; FXwchar w; if(src && 0next; command->undo(); command->next=redolist; redolist=command; } } // Undoing a command group undoes each sub command void FXCommandGroup::redo(){ register FXCommand *command; while(redolist){ command=redolist; redolist=redolist->next; command->redo(); command->next=undolist; undolist=command; } } // Return the size of the information in the undo command group. FXuint FXCommandGroup::size() const { register FXuint result=sizeof(FXCommandGroup); register FXCommand *command; for(command=undolist; command; command=command->next){ result+=command->size(); } for(command=redolist; command; command=command->next){ result+=command->size(); } return result; } // Destrying the command group destroys the subcommands FXCommandGroup::~FXCommandGroup(){ register FXCommand *command; while(redolist){ command=redolist; redolist=redolist->next; delete command; } while(undolist){ command=undolist; undolist=undolist->next; delete command; } delete group; } /*******************************************************************************/ // Map FXDEFMAP(FXUndoList) FXUndoListMap[]={ FXMAPFUNC(SEL_COMMAND, FXUndoList::ID_CLEAR, FXUndoList::onCmdClear), FXMAPFUNC(SEL_UPDATE, FXUndoList::ID_CLEAR, FXUndoList::onUpdClear), FXMAPFUNC(SEL_COMMAND, FXUndoList::ID_REVERT, FXUndoList::onCmdRevert), FXMAPFUNC(SEL_UPDATE, FXUndoList::ID_REVERT, FXUndoList::onUpdRevert), FXMAPFUNC(SEL_COMMAND, FXUndoList::ID_UNDO, FXUndoList::onCmdUndo), FXMAPFUNC(SEL_UPDATE, FXUndoList::ID_UNDO, FXUndoList::onUpdUndo), FXMAPFUNC(SEL_COMMAND, FXUndoList::ID_REDO, FXUndoList::onCmdRedo), FXMAPFUNC(SEL_UPDATE, FXUndoList::ID_REDO, FXUndoList::onUpdRedo), FXMAPFUNC(SEL_COMMAND, FXUndoList::ID_UNDO_ALL, FXUndoList::onCmdUndoAll), FXMAPFUNC(SEL_UPDATE, FXUndoList::ID_UNDO_ALL, FXUndoList::onUpdUndo), FXMAPFUNC(SEL_COMMAND, FXUndoList::ID_REDO_ALL, FXUndoList::onCmdRedoAll), FXMAPFUNC(SEL_UPDATE, FXUndoList::ID_REDO_ALL, FXUndoList::onUpdRedo), FXMAPFUNC(SEL_UPDATE, FXUndoList::ID_UNDO_COUNT, FXUndoList::onUpdUndoCount), FXMAPFUNC(SEL_UPDATE, FXUndoList::ID_REDO_COUNT, FXUndoList::onUpdRedoCount), }; // Object implementation FXIMPLEMENT(FXUndoList,FXCommandGroup,FXUndoListMap,ARRAYNUMBER(FXUndoListMap)) // Make new empty undo list FXUndoList::FXUndoList(){ undocount=0; redocount=0; marker=NOMARK; space=0; working=false; } // Mark current state void FXUndoList::mark(){ marker=0; } // Unmark undo list void FXUndoList::unmark(){ marker=NOMARK; } // Check if marked bool FXUndoList::marked() const { return (group==NULL) && (marker==0); } // Cut the redo list; can no longer revert to marked // state if mark is inside the redo list. void FXUndoList::cut(){ register FXCommand *command; if(marker<0) marker=NOMARK; while(redolist){ command=redolist; redolist=redolist->next; delete command; } redolist=NULL; redocount=0; } // Add new command, executing if desired void FXUndoList::add(FXCommand* command,bool doit,bool merge){ register FXCommandGroup* g=this; register FXuint size=0; // Must pass a command if(!command){ fxerror("FXCommandGroup::add: NULL command argument.\n"); } // Adding undo while in the middle of doing something! if(working){ fxerror("FXCommandGroup::add: already working on undo or redo.\n"); } working=true; // Cut redo list cut(); // Execute command if(doit) command->redo(); // Hunt for end of group chain while(g->group){ g=g->group; } // Old size of previous record if(g->undolist) size=g->undolist->size(); // Try to merge commands when desired and possible if(merge && g->undolist && !marked() && command->canMerge() && g->undolist->mergeWith(command)){ // Account for merge if(this==g){ // Update space, which is the new size less the old size space+=g->undolist->size()-size; } // Delete incoming command that was merged delete command; } // Append new command to undo list else{ // Append incoming command command->next=g->undolist; g->undolist=command; // Account for one more undo step if(this==g){ // Update space, add the size of the new command space+=command->size(); // Update marker and undo counter if(marker!=NOMARK) marker++; undocount++; } } FXTRACE((100,"FXUndoList::add: space=%d undocount=%d marker=%d\n",space,undocount,marker)); working=false; } // Begin a new undo command group void FXUndoList::begin(FXCommandGroup *command){ register FXCommandGroup* g=this; // Must pass a command group if(!command){ fxerror("FXCommandGroup::begin: NULL command argument.\n"); } // Calling begin while in the middle of doing something! if(working){ fxerror("FXCommandGroup::begin: already working on undo or redo.\n"); } // Cut redo list cut(); // Hunt for end of group chain while(g->group){ g=g->group; } // Add to end g->group=command; } // End undo command group void FXUndoList::end(){ register FXCommandGroup *command; register FXCommandGroup *g=this; // Must have called begin if(!g->group){ fxerror("FXCommandGroup::end: no matching call to begin.\n"); } // Calling end while in the middle of doing something! if(working){ fxerror("FXCommandGroup::end: already working on undo or redo.\n"); } // Hunt for one above end of group chain while(g->group->group){ g=g->group; } // Unlink from group chain command=g->group; g->group=NULL; // Add to group if non-empty if(!command->empty()){ // Append new command to undo list command->next=g->undolist; g->undolist=command; // Update marker and undo count if(this==g){ // Update space of completed command group space+=command->size(); // Update marker and undo counter if(marker!=NOMARK) marker++; undocount++; } } // Or delete if empty else{ // Delete bottom group delete command; } } // Abort undo command group void FXUndoList::abort(){ register FXCommandGroup *g=this; // Must be called after begin if(!g->group){ fxerror("FXCommandGroup::abort: no matching call to begin.\n"); } // Calling abort while in the middle of doing something! if(working){ fxerror("FXCommandGroup::abort: already working on undo or redo.\n"); } // Hunt for one above end of group chain while(g->group->group){ g=g->group; } // Delete bottom group delete g->group; // New end of chain g->group=NULL; } // Undo last command void FXUndoList::undo(){ register FXCommand *command; if(group){ fxerror("FXCommandGroup::undo: cannot call undo inside begin-end block.\n"); } if(undolist){ working=true; command=undolist; // Remove from undolist BEFORE undo undolist=undolist->next; space-=command->size(); // Measure BEFORE undo! command->undo(); command->next=redolist; // Hang into redolist AFTER undo redolist=command; undocount--; redocount++; if(marker!=NOMARK) marker--; FXTRACE((100,"FXUndoList::undo: space=%d undocount=%d redocount=%d marker=%d\n",space,undocount,redocount,marker)); working=false; } } // Redo next command void FXUndoList::redo(){ register FXCommand *command; if(group){ fxerror("FXCommandGroup::redo: cannot call undo inside begin-end block.\n"); } if(redolist){ working=true; command=redolist; // Remove from redolist BEFORE redo redolist=redolist->next; command->redo(); space+=command->size(); // Measure AFTER redo! command->next=undolist; // Hang into undolist AFTER redo undolist=command; undocount++; redocount--; if(marker!=NOMARK) marker++; FXTRACE((100,"FXUndoList::redo: space=%d undocount=%d redocount=%d marker=%d\n",space,undocount,redocount,marker)); working=false; } } // Undo all commands void FXUndoList::undoAll(){ while(canUndo()) undo(); } // Redo all commands void FXUndoList::redoAll(){ while(canRedo()) redo(); } // Revert to marked void FXUndoList::revert(){ if(marker!=NOMARK){ while(marker>0) undo(); while(marker<0) redo(); } } // Can we undo more commands bool FXUndoList::canUndo() const { return undolist!=NULL; } // Can we redo more commands bool FXUndoList::canRedo() const { return redolist!=NULL; } // Can revert to marked bool FXUndoList::canRevert() const { return marker!=NOMARK && marker!=0; } // Return name of the first undo command available, if any FXString FXUndoList::undoName() const { if(undolist) return undolist->undoName(); return FXString::null; } // Return name of the first redo command available, if any FXString FXUndoList::redoName() const { if(redolist) return redolist->redoName(); return FXString::null; } // Clear list void FXUndoList::clear(){ register FXCommand *command; FXTRACE((100,"FXUndoList::clear: space=%d undocount=%d redocount=%d marker=%d\n",space,undocount,redocount,marker)); while(redolist){ command=redolist; redolist=redolist->next; delete command; } while(undolist){ command=undolist; undolist=undolist->next; delete command; } delete group; redolist=NULL; undolist=NULL; marker=NOMARK; undocount=0; redocount=0; group=NULL; space=0; } // Clear undo list long FXUndoList::onCmdClear(FXObject*,FXSelector,void*){ clear(); return 1; } // Update Clear undo list long FXUndoList::onUpdClear(FXObject* sender,FXSelector,void*){ sender->handle(this,(canUndo()||canRedo())?FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE):FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL); return 1; } // Revert to marked long FXUndoList::onCmdRevert(FXObject*,FXSelector,void*){ revert(); return 1; } // Update revert to marked long FXUndoList::onUpdRevert(FXObject* sender,FXSelector,void*){ sender->handle(this,canRevert()?FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE):FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL); return 1; } // Undo last command long FXUndoList::onCmdUndo(FXObject*,FXSelector,void*){ undo(); return 1; } // Undo all commands long FXUndoList::onCmdUndoAll(FXObject*,FXSelector,void*){ undoAll(); return 1; } // Update undo last command long FXUndoList::onUpdUndo(FXObject* sender,FXSelector,void*){ sender->handle(this,canUndo()?FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE):FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL); return 1; } // Redo last command long FXUndoList::onCmdRedo(FXObject*,FXSelector,void*){ redo(); return 1; } // Redo all commands long FXUndoList::onCmdRedoAll(FXObject*,FXSelector,void*){ redoAll(); return 1; } // Update redo last command long FXUndoList::onUpdRedo(FXObject* sender,FXSelector,void*){ sender->handle(this,canRedo()?FXSEL(SEL_COMMAND,FXWindow::ID_ENABLE):FXSEL(SEL_COMMAND,FXWindow::ID_DISABLE),NULL); return 1; } // Update undo count long FXUndoList::onUpdUndoCount(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),(void*)&undocount); return 1; } // Update redo count long FXUndoList::onUpdRedoCount(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,FXWindow::ID_SETINTVALUE),(void*)&redocount); return 1; } // Size of undo information FXuint FXUndoList::size() const { return space; } // Trim undo list down to at most nc records void FXUndoList::trimCount(FXint nc){ FXTRACE((100,"FXUndoList::trimCount: was: space=%d undocount=%d; marker=%d ",space,undocount,marker)); if(undocount>nc){ register FXCommand **pp=&undolist; register FXCommand *p=*pp; register FXint i=0; while(p && inext; p=*pp; i++; } while(*pp){ p=*pp; *pp=p->next; space-=p->size(); undocount--; delete p; } if(marker>undocount) marker=NOMARK; } FXTRACE((100,"now: space=%d undocount=%d; marker=%d\n",space,undocount,marker)); } // Trim undo list down to at most size sz void FXUndoList::trimSize(FXuint sz){ FXTRACE((100,"FXUndoList::trimSize: was: space=%d undocount=%d; marker=%d ",space,undocount,marker)); if(space>sz){ register FXCommand **pp=&undolist; register FXCommand *p=*pp; register FXuint s=0; while(p && (s=s+p->size())<=sz){ pp=&p->next; p=*pp; } while(*pp){ p=*pp; *pp=p->next; space-=p->size(); undocount--; delete p; } if(marker>undocount) marker=NOMARK; } FXTRACE((100,"now: space=%d undocount=%d; marker=%d\n",space,undocount,marker)); } } fox1.6-1.6.57/src/FXVec2d.cpp000066400000000000000000000053031326741342000153320ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n 2 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec2d.cpp,v 1.9 2006/01/22 17:58:51 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXVec2d.h" #include "FXVec3d.h" #include "FXMat3d.h" using namespace FX; /*******************************************************************************/ namespace FX { FXVec2d normalize(const FXVec2d& v){ register FXdouble t=v.length(); if(t>0.0){ return FXVec2d(v.x/t,v.y/t); } return FXVec2d(0.0,0.0); } // Vector times matrix FXVec2d FXVec2d::operator*(const FXMat3d& m) const { FXASSERT(m[0][2]==0.0 && m[1][2]==0.0 && m[2][2]==1.0); return FXVec2d(x*m[0][0]+y*m[1][0]+m[2][0], x*m[0][1]+y*m[1][1]+m[2][1]); } FXStream& operator<<(FXStream& store,const FXVec2d& v){ store << v.x << v.y; return store; } FXStream& operator>>(FXStream& store,FXVec2d& v){ store >> v.x >> v.y; return store; } } fox1.6-1.6.57/src/FXVec2f.cpp000066400000000000000000000053101326741342000153320ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n 2 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec2f.cpp,v 1.9 2006/01/22 17:58:51 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXMat3f.h" using namespace FX; /*******************************************************************************/ namespace FX { FXVec2f normalize(const FXVec2f& v){ register FXfloat t=v.length(); if(t>0.0f){ return FXVec2f(v.x/t,v.y/t); } return FXVec2f(0.0f,0.0f); } // Vector times matrix FXVec2f FXVec2f::operator*(const FXMat3f& m) const { FXASSERT(m[0][2]==0.0f && m[1][2]==0.0f && m[2][2]==1.0f); return FXVec2f(x*m[0][0]+y*m[1][0]+m[2][0], x*m[0][1]+y*m[1][1]+m[2][1]); } FXStream& operator<<(FXStream& store,const FXVec2f& v){ store << v.x << v.y; return store; } FXStream& operator>>(FXStream& store,FXVec2f& v){ store >> v.x >> v.y; return store; } } fox1.6-1.6.57/src/FXVec3d.cpp000066400000000000000000000074551326741342000153450ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n 3 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec3d.cpp,v 1.14 2006/01/22 17:58:51 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXVec2d.h" #include "FXVec3d.h" #include "FXVec4d.h" #include "FXMat3d.h" #include "FXMat4d.h" using namespace FX; /*******************************************************************************/ namespace FX { FXVec3d::FXVec3d(FXColor color){ x=0.003921568627*FXREDVAL(color); y=0.003921568627*FXGREENVAL(color); z=0.003921568627*FXBLUEVAL(color); } FXVec3d& FXVec3d::operator=(FXColor color){ x=0.003921568627*FXREDVAL(color); y=0.003921568627*FXGREENVAL(color); z=0.003921568627*FXBLUEVAL(color); return *this; } FXVec3d::operator FXColor() const { return FXRGB((x*255.0),(y*255.0),(z*255.0)); } FXVec3d normalize(const FXVec3d& v){ register FXdouble t=v.length(); if(t>0.0){ return FXVec3d(v.x/t,v.y/t,v.z/t); } return FXVec3d(0.0,0.0,0.0); } // Compute normal from three points a,b,c FXVec3d normal(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c){ return normalize((b-a)^(c-a)); } // Compute approximate normal from four points a,b,c,d FXVec3d normal(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c,const FXVec3d& d){ return normalize((c-a)^(d-b)); } // Vector times matrix FXVec3d FXVec3d::operator*(const FXMat3d& m) const { return FXVec3d(x*m[0][0]+y*m[1][0]+z*m[2][0], x*m[0][1]+y*m[1][1]+z*m[2][1], x*m[0][2]+y*m[1][2]+z*m[2][2]); } // Vector times matrix FXVec3d FXVec3d::operator*(const FXMat4d& m) const { FXASSERT(m[0][3]==0.0 && m[1][3]==0.0 && m[2][3]==0.0 && m[3][3]==1.0); return FXVec3d(x*m[0][0]+y*m[1][0]+z*m[2][0]+m[3][0], x*m[0][1]+y*m[1][1]+z*m[2][1]+m[3][1], x*m[0][2]+y*m[1][2]+z*m[2][2]+m[3][2]); } // Save vector to stream FXStream& operator<<(FXStream& store,const FXVec3d& v){ store << v.x << v.y << v.z; return store; } // Load vector from stream FXStream& operator>>(FXStream& store,FXVec3d& v){ store >> v.x >> v.y >> v.z; return store; } } fox1.6-1.6.57/src/FXVec3f.cpp000066400000000000000000000074741326741342000153500ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n 3 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec3f.cpp,v 1.15 2006/01/22 17:58:51 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXMat3f.h" #include "FXMat4f.h" using namespace FX; /*******************************************************************************/ namespace FX { FXVec3f::FXVec3f(FXColor color){ x=0.003921568627f*FXREDVAL(color); y=0.003921568627f*FXGREENVAL(color); z=0.003921568627f*FXBLUEVAL(color); } FXVec3f& FXVec3f::operator=(FXColor color){ x=0.003921568627f*FXREDVAL(color); y=0.003921568627f*FXGREENVAL(color); z=0.003921568627f*FXBLUEVAL(color); return *this; } FXVec3f::operator FXColor() const { return FXRGB((x*255.0f),(y*255.0f),(z*255.0f)); } FXVec3f normalize(const FXVec3f& v){ register FXfloat t=v.length(); if(t>0.0f){ return FXVec3f(v.x/t,v.y/t,v.z/t); } return FXVec3f(0.0f,0.0f,0.0f); } // Compute normal from three points a,b,c FXVec3f normal(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c){ return normalize((b-a)^(c-a)); } // Compute approximate normal from four points a,b,c,d FXVec3f normal(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c,const FXVec3f& d){ return normalize((c-a)^(d-b)); } // Vector times matrix FXVec3f FXVec3f::operator*(const FXMat3f& m) const { return FXVec3f(x*m[0][0]+y*m[1][0]+z*m[2][0], x*m[0][1]+y*m[1][1]+z*m[2][1], x*m[0][2]+y*m[1][2]+z*m[2][2]); } // Vector times matrix FXVec3f FXVec3f::operator*(const FXMat4f& m) const { FXASSERT(m[0][3]==0.0f && m[1][3]==0.0f && m[2][3]==0.0f && m[3][3]==1.0f); return FXVec3f(x*m[0][0]+y*m[1][0]+z*m[2][0]+m[3][0], x*m[0][1]+y*m[1][1]+z*m[2][1]+m[3][1], x*m[0][2]+y*m[1][2]+z*m[2][2]+m[3][2]); } // Save vector to stream FXStream& operator<<(FXStream& store,const FXVec3f& v){ store << v.x << v.y << v.z; return store; } // Load vector from stream FXStream& operator>>(FXStream& store,FXVec3f& v){ store >> v.x >> v.y >> v.z; return store; } } fox1.6-1.6.57/src/FXVec4d.cpp000066400000000000000000000106261326741342000153400ustar00rootroot00000000000000/******************************************************************************** * * * D o u b l e - P r e c i s i o n 4 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec4d.cpp,v 1.15 2006/01/22 17:58:51 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXVec2d.h" #include "FXVec3d.h" #include "FXVec4d.h" #include "FXQuatd.h" #include "FXMat4d.h" using namespace FX; /*******************************************************************************/ namespace FX { FXVec4d::FXVec4d(FXColor color){ x=0.003921568627*FXREDVAL(color); y=0.003921568627*FXGREENVAL(color); z=0.003921568627*FXBLUEVAL(color); w=0.003921568627*FXALPHAVAL(color); } FXVec4d& FXVec4d::operator=(FXColor color){ x=0.003921568627*FXREDVAL(color); y=0.003921568627*FXGREENVAL(color); z=0.003921568627*FXBLUEVAL(color); w=0.003921568627*FXALPHAVAL(color); return *this; } FXVec4d::operator FXColor() const { return FXRGBA((x*255.0),(y*255.0),(z*255.0),(w*255.0)); } FXVec4d normalize(const FXVec4d& v){ register FXdouble t=v.length(); if(t>0.0){ return FXVec4d(v.x/t,v.y/t,v.z/t,v.w/t); } return FXVec4d(0.0,0.0,0.0,0.0); } // Compute plane equation from 3 points a,b,c FXVec4d plane(const FXVec3d& a,const FXVec3d& b,const FXVec3d& c){ FXVec3d nm(normal(a,b,c)); return FXVec4d(nm,-(nm.x*a.x+nm.y*a.y+nm.z*a.z)); } // Compute plane equation from vector and distance FXVec4d plane(const FXVec3d& vec,FXdouble dist){ FXVec3d nm(normalize(vec)); return FXVec4d(nm,-dist); } // Compute plane equation from vector and point on plane FXVec4d plane(const FXVec3d& vec,const FXVec3d& p){ FXVec3d nm(normalize(vec)); return FXVec4d(nm,-(nm.x*p.x+nm.y*p.y+nm.z*p.z)); } // Compute plane equation from 4 vector FXVec4d plane(const FXVec4d& vec){ register FXdouble t=sqrt(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z); return FXVec4d(vec.x/t,vec.y/t,vec.z/t,vec.w/t); } // Signed distance normalized plane and point FXdouble FXVec4d::distance(const FXVec3d& p) const { return x*p.x+y*p.y+z*p.z+w; } // Return true if edge a-b crosses plane bool FXVec4d::crosses(const FXVec3d& a,const FXVec3d& b) const { return (distance(a)>=0.0) ^ (distance(b)>=0.0); } // Vector times matrix FXVec4d FXVec4d::operator*(const FXMat4d& m) const { return FXVec4d(x*m[0][0]+y*m[1][0]+z*m[2][0]+w*m[3][0], x*m[0][1]+y*m[1][1]+z*m[2][1]+w*m[3][1], x*m[0][2]+y*m[1][2]+z*m[2][2]+w*m[3][2], x*m[0][3]+y*m[1][3]+z*m[2][3]+w*m[3][3]); } // Save vector to stream FXStream& operator<<(FXStream& store,const FXVec4d& v){ store << v.x << v.y << v.z << v.w; return store; } // Load vector from stream FXStream& operator>>(FXStream& store,FXVec4d& v){ store >> v.x >> v.y >> v.z >> v.w; return store; } } fox1.6-1.6.57/src/FXVec4f.cpp000066400000000000000000000106721326741342000153430ustar00rootroot00000000000000/******************************************************************************** * * * S i n g l e - P r e c i s i o n 4 - E l e m e n t V e c t o r * * * ********************************************************************************* * Copyright (C) 1994,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVec4f.cpp,v 1.17 2006/01/22 17:58:51 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" #include "FXObject.h" #include "FXVec2f.h" #include "FXVec3f.h" #include "FXVec4f.h" #include "FXQuatf.h" #include "FXMat4f.h" using namespace FX; /*******************************************************************************/ namespace FX { FXVec4f::FXVec4f(FXColor color){ x=0.003921568627f*FXREDVAL(color); y=0.003921568627f*FXGREENVAL(color); z=0.003921568627f*FXBLUEVAL(color); w=0.003921568627f*FXALPHAVAL(color); } FXVec4f& FXVec4f::operator=(FXColor color){ x=0.003921568627f*FXREDVAL(color); y=0.003921568627f*FXGREENVAL(color); z=0.003921568627f*FXBLUEVAL(color); w=0.003921568627f*FXALPHAVAL(color); return *this; } FXVec4f::operator FXColor() const { return FXRGBA((x*255.0f),(y*255.0f),(z*255.0f),(w*255.0f)); } // Normalize vector FXVec4f normalize(const FXVec4f& v){ register FXfloat t=v.length(); if(t>0.0f){ return FXVec4f(v.x/t,v.y/t,v.z/t,v.w/t); } return FXVec4f(0.0f,0.0f,0.0f,0.0f); } // Compute plane equation from 3 points a,b,c FXVec4f plane(const FXVec3f& a,const FXVec3f& b,const FXVec3f& c){ FXVec3f nm(normal(a,b,c)); return FXVec4f(nm,-(nm.x*a.x+nm.y*a.y+nm.z*a.z)); } // Compute plane equation from vector and distance FXVec4f plane(const FXVec3f& vec,FXfloat dist){ FXVec3f nm(normalize(vec)); return FXVec4f(nm,-dist); } // Compute plane equation from vector and point on plane FXVec4f plane(const FXVec3f& vec,const FXVec3f& p){ FXVec3f nm(normalize(vec)); return FXVec4f(nm,-(nm.x*p.x+nm.y*p.y+nm.z*p.z)); } // Compute plane equation from 4 vector FXVec4f plane(const FXVec4f& vec){ register FXfloat t=sqrtf(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z); return FXVec4f(vec.x/t,vec.y/t,vec.z/t,vec.w/t); } // Signed distance normalized plane and point FXfloat FXVec4f::distance(const FXVec3f& p) const { return x*p.x+y*p.y+z*p.z+w; } // Return true if edge a-b crosses plane bool FXVec4f::crosses(const FXVec3f& a,const FXVec3f& b) const { return (distance(a)>=0.0f) ^ (distance(b)>=0.0f); } // Vector times matrix FXVec4f FXVec4f::operator*(const FXMat4f& m) const { return FXVec4f(x*m[0][0]+y*m[1][0]+z*m[2][0]+w*m[3][0], x*m[0][1]+y*m[1][1]+z*m[2][1]+w*m[3][1], x*m[0][2]+y*m[1][2]+z*m[2][2]+w*m[3][2], x*m[0][3]+y*m[1][3]+z*m[2][3]+w*m[3][3]); } // Save vector to stream FXStream& operator<<(FXStream& store,const FXVec4f& v){ store << v.x << v.y << v.z << v.w; return store; } // Load vector from stream FXStream& operator>>(FXStream& store,FXVec4f& v){ store >> v.x >> v.y >> v.z >> v.w; return store; } } fox1.6-1.6.57/src/FXVerticalFrame.cpp000066400000000000000000000204161326741342000171150ustar00rootroot00000000000000/******************************************************************************** * * * V e r t i c a l C o n t a i n e r O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVerticalFrame.cpp,v 1.28 2006/01/22 17:58:51 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXVerticalFrame.h" /* Notes: - Filled items shrink as well as stretch. - Stretch is proportional to default size; this way, at default size, it is exactly correct. - Tabbing order takes widget layout into account */ using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXVerticalFrame) FXVerticalFrameMap[]={ FXMAPFUNC(SEL_FOCUS_PREV,0,FXVerticalFrame::onFocusUp), FXMAPFUNC(SEL_FOCUS_NEXT,0,FXVerticalFrame::onFocusDown), }; // Object implementation FXIMPLEMENT(FXVerticalFrame,FXPacker,FXVerticalFrameMap,ARRAYNUMBER(FXVerticalFrameMap)) // Make a vertical one FXVerticalFrame::FXVerticalFrame(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXPacker(p,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ } // Compute minimum width based on child layout hints FXint FXVerticalFrame::getDefaultWidth(){ register FXint w,wmax,wcum,mw; register FXWindow* child; register FXuint hints; wmax=wcum=mw=0; if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth(); for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else w=child->getDefaultWidth(); if((hints&LAYOUT_RIGHT)&&(hints&LAYOUT_CENTER_X)){ // LAYOUT_FIX_X w=child->getX()+w; if(w>wmax) wmax=w; } else{ if(w>wcum) wcum=w; } } } wcum+=padleft+padright+(border<<1); return FXMAX(wcum,wmax); } // Compute minimum height based on child layout hints FXint FXVerticalFrame::getDefaultHeight(){ register FXint h,hcum,hmax,mh; register FXWindow* child; register FXuint hints; hcum=hmax=mh=0; if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight(); for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if((hints&LAYOUT_BOTTOM)&&(hints&LAYOUT_CENTER_Y)){ // LAYOUT_FIX_Y h=child->getY()+h; if(h>hmax) hmax=h; } else{ if(hcum) hcum+=vspacing; hcum+=h; } } } hcum+=padtop+padbottom+(border<<1); return FXMAX(hcum,hmax); } // Recalculate layout void FXVerticalFrame::layout(){ register FXint left,right,top,bottom,remain,extra_space,total_space,t,x,y,w,h; register FXWindow* child; register FXint sumexpand=0; register FXint numexpand=0; register FXint mw=0; register FXint mh=0; register FXint e=0; register FXuint hints; // Placement rectangle; right/bottom non-inclusive left=border+padleft; right=width-border-padright; top=border+padtop; bottom=height-border-padbottom; remain=bottom-top; // Get maximum child size if(options&PACK_UNIFORM_WIDTH) mw=maxChildWidth(); if(options&PACK_UNIFORM_HEIGHT) mh=maxChildHeight(); // Find number of paddable children and total height for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); if(!((hints&LAYOUT_BOTTOM)&&(hints&LAYOUT_CENTER_Y))){ // LAYOUT_FIX_Y if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); FXASSERT(h>=0); if((hints&LAYOUT_CENTER_Y) || ((hints&LAYOUT_FILL_Y) && !(hints&LAYOUT_FIX_HEIGHT))){ sumexpand+=h; numexpand+=1; } else{ remain-=h; } remain-=vspacing; } } } // Child spacing correction remain+=vspacing; // Do the layout for(child=getFirst(); child; child=child->getNext()){ if(child->shown()){ hints=child->getLayoutHints(); // Determine child width if(hints&LAYOUT_FIX_WIDTH) w=child->getWidth(); else if(options&PACK_UNIFORM_WIDTH) w=mw; else if(hints&LAYOUT_FILL_X) w=right-left; else w=child->getDefaultWidth(); // Determine child x-position if((hints&LAYOUT_RIGHT)&&(hints&LAYOUT_CENTER_X)) x=child->getX(); else if(hints&LAYOUT_CENTER_X) x=left+(right-left-w)/2; else if(hints&LAYOUT_RIGHT) x=right-w; else x=left; // Layout child in Y y=child->getY(); if(hints&LAYOUT_FIX_HEIGHT) h=child->getHeight(); else if(options&PACK_UNIFORM_HEIGHT) h=mh; else h=child->getDefaultHeight(); if(!((hints&LAYOUT_BOTTOM)&&(hints&LAYOUT_CENTER_Y))){ // LAYOUT_FIX_Y extra_space=0; total_space=0; if((hints&LAYOUT_FILL_Y) && !(hints&LAYOUT_FIX_HEIGHT)){ if(sumexpand>0){ // Divide space proportionally to height t=h*remain; FXASSERT(sumexpand>0); h=t/sumexpand; e+=t%sumexpand; if(e>=sumexpand){h++;e-=sumexpand;} } else{ // Divide the space equally FXASSERT(numexpand>0); h=remain/numexpand; e+=remain%numexpand; if(e>=numexpand){h++;e-=numexpand;} } } else if(hints&LAYOUT_CENTER_Y){ if(sumexpand>0){ // Divide space proportionally to height t=h*remain; FXASSERT(sumexpand>0); total_space=t/sumexpand-h; e+=t%sumexpand; if(e>=sumexpand){total_space++;e-=sumexpand;} } else{ // Divide the space equally FXASSERT(numexpand>0); total_space=remain/numexpand-h; e+=remain%numexpand; if(e>=numexpand){total_space++;e-=numexpand;} } extra_space=total_space/2; } if(hints&LAYOUT_BOTTOM){ y=bottom-h-extra_space; bottom=bottom-h-hspacing-total_space; } else{ y=top+extra_space; top=top+h+vspacing+total_space; } } child->position(x,y,w,h); } } flags&=~FLAG_DIRTY; } } fox1.6-1.6.57/src/FXVisual.cpp000066400000000000000000001123511326741342000156340ustar00rootroot00000000000000/******************************************************************************** * * * V i s u a l C l a s s * * * ********************************************************************************* * Copyright (C) 1999,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXVisual.cpp,v 1.79.2.1 2007/05/15 05:23:43 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXVisual.h" /* Notes: - Purpose is to provide the illusion of having True Color on all systems. - The visual is what determines how an RGB tuple maps to a color on the device. - Thus, the visual also knows the colormap, and perhaps other lookup mechanisms. - When a drawable is created, it is created with a certain visual. - When painting, graphic contexts are specific for a certain visual; hence, the visual should probably keep track of the gc's. - FIRST set up pseudo color ramp, then read it back and set up the tables. This way, table setup can be reused for read-only colormaps [StaticColor] also... - We try to match the deepest visual not deeper than the specified depth. - For some info on visual setup, see: http://www.wolfram.com/~cwikla/articles/txa/visual.html http://www.wolfram.com/~cwikla/articles/txa/xcc.1.html http://www.wolfram.com/~cwikla/articles/txa/xcc.2.html - Freshly constructed FXVisual sets maxcolors to 1000000 in anticipation of private colormap. [FXApp however sets the default FXVisual's maximum to a lower value as the colormap is shared between lots of apps]. - Always check for Standard Colormap first [even for default colormap], as that (a) makes initialization simpler, and (b) may give us the preferred colors to grab on that system [*** Too bad this does not work! ***]. - Find closest depth to the given depth hint. - RGB Ordering: RGB 111 > | R G B BGR 000 --+-------- RBG 110 R | x 4 2 GBR 001 G | x 1 BRG 100 B | x GRB 011 - Just because I always forget: StaticGray 0 GrayScale 1 StaticColor 2 PseudoColor 3 TrueColor 4 DirectColor 5 - SGI Infinite Reality may have up to 12 bits for red, green, blue each! - With the "depth" we mean number of significant bits per pixel, i.e. padding is not included. */ #define DISPLAY(app) ((Display*)((app)->display)) // Maximum size of the colormap; for high-end graphics systems // you may want to define HIGHENDGRAPHICS to allow large colormaps #ifdef HIGHENDGRAPHICS #define MAX_MAPSIZE 4096 #else #define MAX_MAPSIZE 256 #endif using namespace FX; /*******************************************************************************/ namespace FX { // Object implementation FXIMPLEMENT(FXVisual,FXId,NULL,0) // Deserialization FXVisual::FXVisual(){ flags=0; hint=1; depth=0; numcolors=0; numred=0; numgreen=0; numblue=0; maxcolors=1000000; type=VISUALTYPE_UNKNOWN; info=NULL; visual=NULL; colormap=0; freemap=FALSE; #ifndef WIN32 gc=0; scrollgc=0; #endif } // Construct FXVisual::FXVisual(FXApp* a,FXuint flgs,FXuint d):FXId(a){ FXTRACE((100,"FXVisual::FXVisual %p\n",this)); flags=flgs; hint=FXMAX(1,d); depth=0; numcolors=0; numred=0; numgreen=0; numblue=0; maxcolors=1000000; type=VISUALTYPE_UNKNOWN; info=NULL; visual=NULL; colormap=0; freemap=FALSE; #ifndef WIN32 visual=NULL; gc=0; scrollgc=0; #endif } #ifndef WIN32 /*******************************************************************************/ // X11 Internal helper functions // Standard dither kernel static const FXint dither[16]={ 0*16, 8*16, 2*16, 10*16, 12*16, 4*16, 14*16, 6*16, 3*16, 11*16, 1*16, 9*16, 15*16, 7*16, 13*16, 5*16, }; // Find shift amount static inline FXuint findshift(FXPixel mask){ register FXuint sh=0; while(!(mask&(1<reg().readRealEntry("SETTINGS","displaygamma",1.0); // Arrangement of pixels redmask=((Visual*)visual)->red_mask; greenmask=((Visual*)visual)->green_mask; bluemask=((Visual*)visual)->blue_mask; redshift=findshift(redmask); greenshift=findshift(greenmask); blueshift=findshift(bluemask); redmax=redmask>>redshift; greenmax=greenmask>>greenshift; bluemax=bluemask>>blueshift; numred=redmax+1; numgreen=greenmax+1; numblue=bluemax+1; numcolors=numred*numgreen*numblue; // Make dither tables for(d=0; d<16; d++){ for(i=0; i<256; i++){ c=gamma_adjust(gamma,i,255); r=(redmax*c+dither[d])/255; g=(greenmax*c+dither[d])/255; b=(bluemax*c+dither[d])/255; rpix[d][i]=r << redshift; gpix[d][i]=g << greenshift; bpix[d][i]=b << blueshift; } } // What did we get FXTRACE((150,"True color:\n")); FXTRACE((150," visual id = 0x%02lx\n",((Visual*)visual)->visualid)); FXTRACE((150," depth = %d\n",depth)); FXTRACE((150," gamma = %6f\n",gamma)); FXTRACE((150," map_entries = %d\n",((Visual*)visual)->map_entries)); FXTRACE((150," numcolors = %d\n",numcolors)); FXTRACE((150," BitOrder = %s\n",(BitmapBitOrder(DISPLAY(getApp()))==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150," ByteOrder = %s\n",(ImageByteOrder(DISPLAY(getApp()))==MSBFirst)?"MSBFirst":"LSBFirst")); FXTRACE((150," Padding = %d\n",BitmapPad(DISPLAY(getApp())))); FXTRACE((150," redmax = %3ld; redmask =%08lx; redshift = %-2d\n",redmax,redmask,redshift)); FXTRACE((150," greenmax = %3ld; greenmask =%08lx; greenshift = %-2d\n",greenmax,greenmask,greenshift)); FXTRACE((150," bluemax = %3ld; bluemask =%08lx; blueshift = %-2d\n",bluemax,bluemask,blueshift)); // Set type type=VISUALTYPE_TRUE; } // Setup direct color void FXVisual::setupdirectcolor(){ register FXuint redshift,greenshift,blueshift; register FXPixel redmask,greenmask,bluemask; register FXPixel redmax,greenmax,bluemax; register FXuint mapsize,maxcols,i,j,r,g,b,emax,rr,gg,bb,d; register FXuint bestmatchr,bestmatchg,bestmatchb; register FXdouble mindist,dist,gamma; register FXbool gottable,allocedcolor; XColor *table,color; FXPixel *alloced; // Get gamma gamma=getApp()->reg().readRealEntry("SETTINGS","displaygamma",1.0); // Get map size mapsize=((Visual*)visual)->map_entries; // Arrangement of pixels redmask=((Visual*)visual)->red_mask; greenmask=((Visual*)visual)->green_mask; bluemask=((Visual*)visual)->blue_mask; redshift=findshift(redmask); greenshift=findshift(greenmask); blueshift=findshift(bluemask); redmax=redmask>>redshift; greenmax=greenmask>>greenshift; bluemax=bluemask>>blueshift; // Maximum number of colors to allocate maxcols=FXMIN(maxcolors,mapsize); // No more allocations than allowed if(redmax>=maxcols) redmax=maxcols-1; if(greenmax>=maxcols) greenmax=maxcols-1; if(bluemax>=maxcols) bluemax=maxcols-1; numred=redmax+1; numgreen=greenmax+1; numblue=bluemax+1; numcolors=numred*numgreen*numblue; emax=FXMAX3(redmax,greenmax,bluemax); gottable=0; // Allocate color table FXMALLOC(&table,XColor,mapsize); FXMALLOC(&alloced,FXPixel,mapsize); // Allocate ramp for(i=r=g=b=0; i<=emax; i++){ // We try to get gamma-corrected colors color.red=gamma_adjust(gamma,(r*65535)/redmax,65535); color.green=gamma_adjust(gamma,(g*65535)/greenmax,65535); color.blue=gamma_adjust(gamma,(b*65535)/bluemax,65535); color.flags=DoRed|DoGreen|DoBlue; // First try just using XAllocColor allocedcolor=XAllocColor(DISPLAY(getApp()),colormap,&color); if(!allocedcolor){ // Get colors in the map if(!gottable){ rr=0; gg=0; bb=0; for(j=0; jvisualid)); FXTRACE((150," depth = %d\n",depth)); FXTRACE((150," gamma = %6f\n",gamma)); FXTRACE((150," map_entries = %d\n",mapsize)); FXTRACE((150," numcolors = %d\n",numcolors)); FXTRACE((150," redmax = %3ld; redmask =%08lx; redshift = %-2d\n",redmax,redmask,redshift)); FXTRACE((150," greenmax = %3ld; greenmask =%08lx; greenshift = %-2d\n",greenmax,greenmask,greenshift)); FXTRACE((150," bluemax = %3ld; bluemask =%08lx; blueshift = %-2d\n",bluemax,bluemask,blueshift)); // Set type type=VISUALTYPE_TRUE; } // Setup for pseudo color void FXVisual::setuppseudocolor(){ register FXuint r,g,b,mapsize,bestmatch,maxcols,i,d; register FXdouble mindist,dist,gamma,dr,dg,db; register FXPixel redmax,greenmax,bluemax; register FXbool gottable,allocedcolor; XColor table[256],color; // Get gamma gamma=getApp()->reg().readRealEntry("SETTINGS","displaygamma",1.0); // Get map size mapsize=((Visual*)visual)->map_entries; if(mapsize>256) mapsize=256; // How many colors to allocate maxcols=FXMIN(maxcolors,mapsize); // Find a product of r*g*b which will fit the available map. // We prefer b+1>=g and g>=r>=b; start with 6x7x6 or 252 colors. numred=6; numgreen=7; numblue=6; while(numred*numgreen*numblue>maxcols){ if(numblue==numred && numblue==numgreen) numblue--; else if(numred==numgreen) numred--; else numgreen--; } // We want at most maxcols colors numcolors=numred*numgreen*numblue; redmax=numred-1; greenmax=numgreen-1; bluemax=numblue-1; gottable=0; // Allocate color ramp for(r=0; rvisualid)); FXTRACE((150," depth = %d\n",depth)); FXTRACE((150," gamma = %6f\n",gamma)); FXTRACE((150," map_entries = %d\n",mapsize)); FXTRACE((150," numcolors = %d\n",numcolors)); FXTRACE((150," redmax = %ld\n",redmax)); FXTRACE((150," greenmax = %ld\n",greenmax)); FXTRACE((150," bluemax = %ld\n",bluemax)); // Set type type=VISUALTYPE_INDEX; } // Setup for static color void FXVisual::setupstaticcolor(){ register FXuint mapsize,bestmatch,i,nr,ng,nb,r,g,b,j,d; register FXdouble mindist,dist,gamma,dr,dg,db; register FXPixel redmax,greenmax,bluemax; FXbool rcnt[256],gcnt[256],bcnt[256]; XColor table[256],color; // Get gamma gamma=getApp()->reg().readRealEntry("SETTINGS","displaygamma",1.0); mapsize=((Visual*)visual)->map_entries; if(mapsize>256) mapsize=256; // Read back table for(i=0; i4096){ numred=16; numgreen=16; numblue=16; } else{ numred=nr; numgreen=ng; numblue=nb; } numcolors=numred*numgreen*numblue; redmax=numred-1; greenmax=numgreen-1; bluemax=numblue-1; // Allocate color ramp for(r=0; rvisualid)); FXTRACE((150," depth = %d\n",depth)); FXTRACE((150," gamma = %6f\n",gamma)); FXTRACE((150," map_entries = %d\n",mapsize)); FXTRACE((150," numcolors = %d\n",numcolors)); FXTRACE((150," redmax = %ld\n",redmax)); FXTRACE((150," greenmax = %ld\n",greenmax)); FXTRACE((150," bluemax = %ld\n",bluemax)); // Set type type=VISUALTYPE_INDEX; } // Setup for gray scale void FXVisual::setupgrayscale(){ register FXuint g,bestmatch,mapsize,maxcols,graymax,i,d; register FXdouble mindist,dist,gamma,dr,dg,db; register FXbool gottable,allocedcolor; XColor table[256],color; FXPixel alloced[256]; // Get gamma gamma=getApp()->reg().readRealEntry("SETTINGS","displaygamma",1.0); // Get map size mapsize=((Visual*)visual)->map_entries; if(mapsize>256) mapsize=256; // How many to allocate maxcols=FXMIN(mapsize,maxcolors); // Colors numcolors=maxcols; graymax=numcolors-1; gottable=0; // Allocate gray ramp for(g=0; gvisualid)); FXTRACE((150," depth = %d\n",depth)); FXTRACE((150," gamma = %6f\n",gamma)); FXTRACE((150," map_entries = %d\n",mapsize)); FXTRACE((150," numcolors = %d\n",numcolors)); FXTRACE((150," graymax = %d\n",graymax)); // Set type type=VISUALTYPE_GRAY; } // Setup for static gray void FXVisual::setupstaticgray(){ register FXuint i,d,c,graymax; register FXdouble gamma; // Get gamma gamma=getApp()->reg().readRealEntry("SETTINGS","displaygamma",1.0); // Number of colors numcolors=((Visual*)visual)->map_entries; graymax=(numcolors-1); // Set up color ramps for(d=0; d<16; d++){ for(i=0; i<256; i++){ c=gamma_adjust(gamma,i,255); rpix[d][i]=gpix[d][i]=bpix[d][i]=(graymax*c+dither[d])/255; } } // What did we get FXTRACE((150,"Static Gray:\n")); FXTRACE((150," visual id = 0x%02lx\n",((Visual*)visual)->visualid)); FXTRACE((150," depth = %d\n",depth)); FXTRACE((150," gamma = %6f\n",gamma)); FXTRACE((150," map_entries = %d\n",((Visual*)visual)->map_entries)); FXTRACE((150," numcolors = %d\n",numcolors)); FXTRACE((150," graymax = %d\n",graymax)); type=VISUALTYPE_GRAY; } // Setup for pixmap monochrome; this one has no colormap! void FXVisual::setuppixmapmono(){ register FXuint d,i,c; register FXdouble gamma; // Get gamma gamma=getApp()->reg().readRealEntry("SETTINGS","displaygamma",1.0); // Number of colors numcolors=2; // Set up color ramps for(d=0; d<16; d++){ for(i=0; i<256; i++){ c=gamma_adjust(gamma,i,255); rpix[d][i]=gpix[d][i]=bpix[d][i]=(c+dither[d])/255; } } // What did we get FXTRACE((150,"Pixmap monochrome:\n")); FXTRACE((150," depth = %d\n",depth)); FXTRACE((150," gamma = %6f\n",gamma)); FXTRACE((150," map_entries = %d\n",2)); FXTRACE((150," numcolors = %d\n",2)); FXTRACE((150," black = 0\n")); FXTRACE((150," white = 1\n")); // Set type type=VISUALTYPE_MONO; } /* // Try determine standard colormap static FXbool getstdcolormap(Display *dpy,VisualID visualid,XStandardColormap& map){ XStandardColormap *stdmaps=NULL; int status,count,i; status=XGetRGBColormaps(dpy,RootWindow(dpy,DefaultScreen(dpy)),&stdmaps,&count,XA_RGB_DEFAULT_MAP); if(status){ status=FALSE; for(i=0; ivisualid,stdmap); colormap=DefaultColormap(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))); FXTRACE((150,"%s::create: use default colormap\n",getClassName())); } switch(((Visual*)visual)->c_class){ case TrueColor: setuptruecolor(); break; case DirectColor: setupdirectcolor(); break; case PseudoColor: setuppseudocolor(); break; case StaticColor: setupstaticcolor(); break; case GrayScale: setupgrayscale(); break; case StaticGray: setupstaticgray(); break; } } } // Make GC for given visual and depth; graphics exposures optional void* FXVisual::setupgc(FXbool gex){ XGCValues gval; FXID drawable; GC gg; gval.fill_style=FillSolid; gval.graphics_exposures=gex; // For default visual; this is easy as we already have a matching window if((Visual*)visual==DefaultVisual(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))) && depth==DefaultDepth(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp())))){ gg=XCreateGC(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),GCFillStyle|GCGraphicsExposures,&gval); } // For arbitrary visual; create a temporary pixmap of the same depth as the visual else{ drawable=XCreatePixmap(DISPLAY(getApp()),XDefaultRootWindow(DISPLAY(getApp())),1,1,depth); gg=XCreateGC(DISPLAY(getApp()),drawable,GCFillStyle|GCGraphicsExposures,&gval); XFreePixmap(DISPLAY(getApp()),drawable); } return gg; } #else /*******************************************************************************/ // WIN32 Internal helper functions struct LOGPALETTE256 { WORD palVersion; WORD palNumEntries; PALETTEENTRY palPalEntry[257]; }; struct BITMAPINFO256 { BITMAPINFOHEADER bmiHeader; DWORD bmiColors[256]; }; // Get number of bits in n static inline FXuint findnbits(DWORD n){ register FXuint nb=0; while(n){nb+=(n&1);n>>=1;} return nb; } // Make palette static HPALETTE createAllPurposePalette(){ LOGPALETTE256 palette; HPALETTE hPalette,hStockPalette; FXint num,r,g,b; // We will use the stock palette hStockPalette=(HPALETTE)GetStockObject(DEFAULT_PALETTE); // Fill in first 20 entries from system color palette num=GetPaletteEntries(hStockPalette,0,20,palette.palPalEntry); // Calculate remaining 216 colors, 8 of which match the standard // 20 colors and 4 of which match the gray shades above for(r=0; r<256; r+=51){ for(g=0; g<256; g+=51){ for(b=0; b<256; b+=51){ palette.palPalEntry[num].peRed=r; palette.palPalEntry[num].peGreen=g; palette.palPalEntry[num].peBlue=b; palette.palPalEntry[num].peFlags=0; num++; } } } // Fill in the rest palette.palVersion=0x300; palette.palNumEntries=num; // Create palette and we're done hPalette=CreatePalette((const LOGPALETTE*)&palette); // Return palette return hPalette; } #endif /*******************************************************************************/ // Initialize void FXVisual::create(){ if(!xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::create %p\n",getClassName(),this)); #ifndef WIN32 XVisualInfo vitemplate; XVisualInfo *vi; FXint nvi,i,d,dbest; // Assume the default visual=DefaultVisual(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))); depth=DefaultDepth(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp()))); // True color if(flags&VISUAL_TRUECOLOR){ vitemplate.screen=DefaultScreen(DISPLAY(getApp())); vi=XGetVisualInfo(DISPLAY(getApp()),VisualScreenMask,&vitemplate,&nvi); if(vi){ for(i=0,dbest=1000000; i= hint if(d= hint if(d= hint if(d= hint if(disInitialized()){ FXTRACE((100,"%s::destroy %p\n",getClassName(),this)); #ifndef WIN32 if(freemap){XFreeColormap(DISPLAY(getApp()),colormap);} XFreeGC(DISPLAY(getApp()),(GC)gc); XFreeGC(DISPLAY(getApp()),(GC)scrollgc); #else if(freemap){DeleteObject((HPALETTE)colormap);} #endif colormap=0; freemap=FALSE; } xid=0; } } // Get pixel value for color FXPixel FXVisual::getPixel(FXColor clr){ #ifndef WIN32 switch(type){ case VISUALTYPE_TRUE: return rpix[1][FXREDVAL(clr)] | gpix[1][FXGREENVAL(clr)] | bpix[1][FXBLUEVAL(clr)]; case VISUALTYPE_INDEX: return lut[rpix[1][FXREDVAL(clr)]+gpix[1][FXGREENVAL(clr)]+bpix[1][FXBLUEVAL(clr)]]; case VISUALTYPE_GRAY: return gpix[1][(77*FXREDVAL(clr)+151*FXGREENVAL(clr)+29*FXBLUEVAL(clr))>>8]; case VISUALTYPE_MONO: return gpix[1][(77*FXREDVAL(clr)+151*FXGREENVAL(clr)+29*FXBLUEVAL(clr))>>8]; case VISUALTYPE_UNKNOWN: return 0; } return 0; #else return PALETTERGB(FXREDVAL(clr),FXGREENVAL(clr),FXBLUEVAL(clr)); #endif } // Get color value for pixel FXColor FXVisual::getColor(FXPixel pix){ #ifndef WIN32 XColor color; color.pixel=pix; XQueryColor(DISPLAY(getApp()),colormap,&color); return FXRGB(((color.red+128)/257),((color.green+128)/257),((color.blue+128)/257)); #else return PALETTEINDEX(pix); #endif } // Set maximum number of colors to allocate void FXVisual::setMaxColors(FXuint maxcols){ if(xid){ fxerror("%s::setMaxColors: visual already initialized.\n",getClassName()); } if(maxcols<2) maxcols=2; maxcolors=maxcols; } // Save to stream void FXVisual::save(FXStream& store) const { FXId::save(store); store << flags; store << depth; } // Load from stream void FXVisual::load(FXStream& store){ FXId::load(store); store >> flags; store >> depth; } // Destroy FXVisual::~FXVisual(){ FXTRACE((100,"FXVisual::~FXVisual %p\n",this)); destroy(); } } fox1.6-1.6.57/src/FXWindow.cpp000066400000000000000000003121551326741342000156440ustar00rootroot00000000000000/******************************************************************************** * * * W i n d o w O b j e c t * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXWindow.cpp,v 1.341.2.3 2009/01/14 10:41:48 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxpriv.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegion.h" #include "FXRegistry.h" #include "FXAccelTable.h" #include "FXObjectList.h" #include "FXApp.h" #include "FXVisual.h" #include "FXDCWindow.h" #include "FXImage.h" #include "FXBitmap.h" #include "FXIcon.h" #include "FXCursor.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXComposite.h" #include "FXRootWindow.h" #include "FXShell.h" #include "FXTopWindow.h" #include "FXException.h" #include "FXStatusLine.h" #include "FXTranslator.h" #include "FXComposeContext.h" #include "FXTextField.h" /* Notes: - Major Contributions for Windows NT by Lyle Johnson. - When window is disabled, it should lose focus - When no subclass handles SEL_SELECTION_REQUEST, send back None property here - Update should only happen if widget is not in some sort of transaction. - Not every widget needs help and tip data; move this down to buttons etc. - Default constructors [for serialization] should initialize dynamic member variables same as regular constructor. Dynamic variables are those that are not saved during serialization. - If FLAG_DIRTY gets reset at the END of layout(), it will be safe to have show() and hide() to call recalc(), in case they get called from the application code. - Use INCR mechanism if it gets large. - Perhaps should post CLIPBOARD type list in advance also, just like windows insists. We will need to keep this list some place [perhaps same place as XDND] and clean it after we're done [This would imply the CLIPBOARD type list would be the same as the XDND type list, which is probably OK]. - Add URL jump text also. - Can we call parent->recalc() in the constructor? - Need other focus models: o click to focus (like we have now) o focus only by tabs and arrows (buttons should not move focus when clicking) o point to focus (useful for canvas type widgets) Mouse wheel should probably not cause focus changes... - Close v.s. delete messages are not consistent. */ #ifndef WIN32 // Basic events #define BASIC_EVENT_MASK (StructureNotifyMask|ExposureMask|PropertyChangeMask|EnterWindowMask|LeaveWindowMask|KeyPressMask|KeyReleaseMask|KeymapStateMask) // Additional events for shell widget events #define SHELL_EVENT_MASK (FocusChangeMask|StructureNotifyMask) // Additional events for enabled widgets #define ENABLED_EVENT_MASK (ButtonPressMask|ButtonReleaseMask|PointerMotionMask) // These events are grabbed for mouse grabs #define GRAB_EVENT_MASK (ButtonPressMask|ButtonReleaseMask|PointerMotionMask|EnterWindowMask|LeaveWindowMask) // Do not propagate mask #define NOT_PROPAGATE_MASK (KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask|PointerMotionMask|ButtonMotionMask) #endif // Side layout modes #define LAYOUT_SIDE_MASK (LAYOUT_SIDE_LEFT|LAYOUT_SIDE_RIGHT|LAYOUT_SIDE_TOP|LAYOUT_SIDE_BOTTOM) // Layout modes #define LAYOUT_MASK (LAYOUT_SIDE_MASK|LAYOUT_RIGHT|LAYOUT_CENTER_X|LAYOUT_BOTTOM|LAYOUT_CENTER_Y|LAYOUT_FIX_X|LAYOUT_FIX_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_DOCK_SAME|LAYOUT_DOCK_NEXT) #define DISPLAY(app) ((Display*)((app)->display)) using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXWindow) FXWindowMap[]={ FXMAPFUNC(SEL_UPDATE,0,FXWindow::onUpdate), FXMAPFUNC(SEL_PAINT,0,FXWindow::onPaint), FXMAPFUNC(SEL_MOTION,0,FXWindow::onMotion), FXMAPFUNC(SEL_CONFIGURE,0,FXWindow::onConfigure), FXMAPFUNC(SEL_MOUSEWHEEL,0,FXWindow::onMouseWheel), FXMAPFUNC(SEL_MAP,0,FXWindow::onMap), FXMAPFUNC(SEL_UNMAP,0,FXWindow::onUnmap), FXMAPFUNC(SEL_DRAGGED,0,FXWindow::onDragged), FXMAPFUNC(SEL_ENTER,0,FXWindow::onEnter), FXMAPFUNC(SEL_LEAVE,0,FXWindow::onLeave), FXMAPFUNC(SEL_DESTROY,0,FXWindow::onDestroy), FXMAPFUNC(SEL_FOCUSIN,0,FXWindow::onFocusIn), FXMAPFUNC(SEL_FOCUSOUT,0,FXWindow::onFocusOut), FXMAPFUNC(SEL_SELECTION_LOST,0,FXWindow::onSelectionLost), FXMAPFUNC(SEL_SELECTION_GAINED,0,FXWindow::onSelectionGained), FXMAPFUNC(SEL_SELECTION_REQUEST,0,FXWindow::onSelectionRequest), FXMAPFUNC(SEL_CLIPBOARD_LOST,0,FXWindow::onClipboardLost), FXMAPFUNC(SEL_CLIPBOARD_GAINED,0,FXWindow::onClipboardGained), FXMAPFUNC(SEL_CLIPBOARD_REQUEST,0,FXWindow::onClipboardRequest), FXMAPFUNC(SEL_LEFTBUTTONPRESS,0,FXWindow::onLeftBtnPress), FXMAPFUNC(SEL_LEFTBUTTONRELEASE,0,FXWindow::onLeftBtnRelease), FXMAPFUNC(SEL_MIDDLEBUTTONPRESS,0,FXWindow::onMiddleBtnPress), FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE,0,FXWindow::onMiddleBtnRelease), FXMAPFUNC(SEL_RIGHTBUTTONPRESS,0,FXWindow::onRightBtnPress), FXMAPFUNC(SEL_RIGHTBUTTONRELEASE,0,FXWindow::onRightBtnRelease), FXMAPFUNC(SEL_UNGRABBED,0,FXWindow::onUngrabbed), FXMAPFUNC(SEL_KEYPRESS,0,FXWindow::onKeyPress), FXMAPFUNC(SEL_KEYRELEASE,0,FXWindow::onKeyRelease), FXMAPFUNC(SEL_DND_ENTER,0,FXWindow::onDNDEnter), FXMAPFUNC(SEL_DND_LEAVE,0,FXWindow::onDNDLeave), FXMAPFUNC(SEL_DND_DROP,0,FXWindow::onDNDDrop), FXMAPFUNC(SEL_DND_MOTION,0,FXWindow::onDNDMotion), FXMAPFUNC(SEL_DND_REQUEST,0,FXWindow::onDNDRequest), FXMAPFUNC(SEL_FOCUS_SELF,0,FXWindow::onFocusSelf), FXMAPFUNC(SEL_BEGINDRAG,0,FXWindow::onBeginDrag), FXMAPFUNC(SEL_ENDDRAG,0,FXWindow::onEndDrag), FXMAPFUNC(SEL_QUERY_TIP,0,FXWindow::onQueryTip), FXMAPFUNC(SEL_QUERY_HELP,0,FXWindow::onQueryHelp), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_SHOW,FXWindow::onCmdShow), FXMAPFUNC(SEL_CHORE,FXWindow::ID_SHOW,FXWindow::onCmdShow), FXMAPFUNC(SEL_TIMEOUT,FXWindow::ID_SHOW,FXWindow::onCmdShow), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_HIDE,FXWindow::onCmdHide), FXMAPFUNC(SEL_CHORE,FXWindow::ID_HIDE,FXWindow::onCmdHide), FXMAPFUNC(SEL_TIMEOUT,FXWindow::ID_HIDE,FXWindow::onCmdHide), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_TOGGLESHOWN,FXWindow::onUpdToggleShown), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_TOGGLESHOWN,FXWindow::onCmdToggleShown), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_RAISE,FXWindow::onCmdRaise), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_LOWER,FXWindow::onCmdLower), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_ENABLE,FXWindow::onCmdEnable), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_DISABLE,FXWindow::onCmdDisable), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_TOGGLEENABLED,FXWindow::onUpdToggleEnabled), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_TOGGLEENABLED,FXWindow::onCmdToggleEnabled), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_UPDATE,FXWindow::onCmdUpdate), FXMAPFUNC(SEL_UPDATE,FXWindow::ID_DELETE,FXWindow::onUpdYes), FXMAPFUNC(SEL_COMMAND,FXWindow::ID_DELETE,FXWindow::onCmdDelete), FXMAPFUNC(SEL_CHORE,FXWindow::ID_DELETE,FXWindow::onCmdDelete), FXMAPFUNC(SEL_TIMEOUT,FXWindow::ID_DELETE,FXWindow::onCmdDelete), }; // Object implementation FXIMPLEMENT(FXWindow,FXDrawable,FXWindowMap,ARRAYNUMBER(FXWindowMap)) /*******************************************************************************/ // Drag type names const FXchar FXWindow::deleteTypeName[]="DELETE"; const FXchar FXWindow::textTypeName[]="text/plain"; const FXchar FXWindow::colorTypeName[]="application/x-color"; const FXchar FXWindow::urilistTypeName[]="text/uri-list"; const FXchar FXWindow::utf8TypeName[]="UTF8_STRING"; const FXchar FXWindow::utf16TypeName[]="text/utf16"; const FXchar FXWindow::octetTypeName[]="application/octet-stream"; // Drag type atoms; first widget to need it should register the type FXDragType FXWindow::deleteType=0; FXDragType FXWindow::textType=0; FXDragType FXWindow::colorType=0; FXDragType FXWindow::urilistType=0; FXDragType FXWindow::utf8Type=0; FXDragType FXWindow::octetType=0; // The string type is predefined and hardwired #ifndef WIN32 const FXDragType FXWindow::stringType=XA_STRING; #else const FXDragType FXWindow::stringType=CF_TEXT; #endif // The image type is predefined and hardwired #ifndef WIN32 const FXDragType FXWindow::imageType=XA_PIXMAP; #else const FXDragType FXWindow::imageType=CF_DIB; #endif // The UTF-16 string type is predefined and hardwired #ifndef WIN32 FXDragType FXWindow::utf16Type=0; #else FXDragType FXWindow::utf16Type=CF_UNICODETEXT; #endif /*******************************************************************************/ // For deserialization; note that the deserialized window only // becomes part of the widget tree after its loaded with load(). FXWindow::FXWindow(){ FXTRACE((100,"FXWindow::FXWindow %p\n",this)); parent=NULL; owner=NULL; first=NULL; last=NULL; next=NULL; prev=NULL; focus=NULL; composeContext=NULL; defaultCursor=NULL; dragCursor=NULL; accelTable=NULL; target=NULL; message=0; xpos=0; ypos=0; backColor=0; flags=FLAG_DIRTY|FLAG_UPDATE|FLAG_RECALC; options=0; wk=0; } // Only used for the root window FXWindow::FXWindow(FXApp* a,FXVisual *vis):FXDrawable(a,1,1){ FXTRACE((100,"FXWindow::FXWindow %p\n",this)); getApp()->windowCount++; visual=vis; parent=NULL; owner=NULL; first=last=NULL; next=prev=NULL; focus=NULL; composeContext=NULL; defaultCursor=getApp()->getDefaultCursor(DEF_ARROW_CURSOR); dragCursor=getApp()->getDefaultCursor(DEF_ARROW_CURSOR); accelTable=NULL; target=NULL; message=0; xpos=0; ypos=0; backColor=0; flags=FLAG_DIRTY|FLAG_SHOWN|FLAG_UPDATE|FLAG_RECALC; options=LAYOUT_FIX_X|LAYOUT_FIX_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT; wk=1; } // This constructor is used for shell windows FXWindow::FXWindow(FXApp* a,FXWindow* own,FXuint opts,FXint x,FXint y,FXint w,FXint h):FXDrawable(a,w,h){ FXTRACE((100,"FXWindow::FXWindow %p\n",this)); getApp()->windowCount++; parent=a->root; owner=own; visual=getApp()->getDefaultVisual(); first=last=NULL; prev=parent->last; next=NULL; parent->last=this; if(prev){ wk=prev->wk+1; prev->next=this; } else{ wk=1; parent->first=this; } focus=NULL; composeContext=NULL; defaultCursor=getApp()->getDefaultCursor(DEF_ARROW_CURSOR); dragCursor=getApp()->getDefaultCursor(DEF_ARROW_CURSOR); accelTable=NULL; target=NULL; message=0; xpos=x; ypos=y; backColor=getApp()->getBaseColor(); flags=FLAG_DIRTY|FLAG_UPDATE|FLAG_RECALC|FLAG_SHELL; options=opts; } // This constructor is used for all child windows FXWindow::FXWindow(FXComposite* p,FXuint opts,FXint x,FXint y,FXint w,FXint h):FXDrawable(p->getApp(),w,h){ FXTRACE((100,"FXWindow::FXWindow %p\n",this)); getApp()->windowCount++; parent=p; owner=parent; visual=parent->getVisual(); first=last=NULL; prev=parent->last; next=NULL; parent->last=this; if(prev){ wk=prev->wk+1; prev->next=this; } else{ wk=1; parent->first=this; } focus=NULL; composeContext=NULL; defaultCursor=getApp()->getDefaultCursor(DEF_ARROW_CURSOR); dragCursor=getApp()->getDefaultCursor(DEF_ARROW_CURSOR); accelTable=NULL; target=NULL; message=0; xpos=x; ypos=y; backColor=getApp()->getBaseColor(); flags=FLAG_DIRTY|FLAG_UPDATE|FLAG_RECALC; options=opts; } /*******************************************************************************/ // The idea is to recurse down, but not sideways or upward. Recursing upward // through the parent or owner, or sideways through the left and right sibling, // carries the risk of serializing the entire widget tree instead of just the // one widget and its children. // Each widget only saves its own data and resources, and loops over its child // widgets saving each one in turn. A final NULL child pointer is saved to // indicate the end of the sequence. // When loading back, we deserialize a child pointer and hang it in the widget // tree under this widget. We continue to deserialize child pointers until // we find the NULL child pointer. // Save window to stream void FXWindow::save(FXStream& store) const { FXWindow *child=getFirst(); FXDrawable::save(store); while(child){ store << child; child=child->getNext(); } store << child; store << accelTable; store << defaultCursor; store << dragCursor; store << target; store << message; store << xpos; store << ypos; store << backColor; store << tag; store << options; store << flags; store << wk; } // Load window from stream void FXWindow::load(FXStream& store){ FXWindow *child=NULL; FXDrawable::load(store); getApp()->windowCount++; store >> child; while(child){ child->parent=this; child->owner=this; child->prev=last; child->next=NULL; if(last){ last->next=child; } else{ first=child; } last=child; store >> child; } store >> accelTable; store >> defaultCursor; store >> dragCursor; store >> target; store >> message; store >> xpos; store >> ypos; store >> backColor; store >> tag; store >> options; store >> flags; // FIXME store >> wk; } /*******************************************************************************/ // Return a pointer to the shell window FXWindow* FXWindow::getShell() const { register FXWindow *win=(FXWindow*)this; register FXWindow *p; while((p=win->parent)!=NULL && p->parent) win=p; return win; } // Return a pointer to the root window FXWindow* FXWindow::getRoot() const { register FXWindow *win=(FXWindow*)this; while(win->parent) win=win->parent; return win; } // Test if logically inside bool FXWindow::contains(FXint parentx,FXint parenty) const { return xpos<=parentx && parentxfirst; window && window->wk!=num; window=window->next); } while(*s++ == '.' && window); return window; } // Get Dewey decimal key from window FXString FXWindow::getKeyFromChild(FXWindow* window) const { FXchar buf[1024]; register FXchar *p=buf+1023; register FXuint num; *p='\0'; while(window && window!=this && buf+10<=p){ num=window->getKey(); do{ *--p=num%10+'0'; num/=10; }while(num); window=window->getParent(); *--p='.'; } if(*p=='.') p++; return p; } */ // Return true if this window contains child in its subtree bool FXWindow::containsChild(const FXWindow* child) const { while(child){ if(child==this) return true; child=child->parent; } return false; } // Return true if specified window is owned by this window bool FXWindow::isOwnerOf(const FXWindow* window) const { while(window){ if(window==this) return true; window=window->owner; } return false; } // Return true if specified window is ancestor of this window bool FXWindow::isChildOf(const FXWindow* window) const { register const FXWindow* child=this; while(child){ child=child->parent; if(child==window) return true; } return false; } // Get child at x,y FXWindow* FXWindow::getChildAt(FXint x,FXint y) const { register FXWindow *child; if(0<=x && 0<=y && xprev){ if(child->shown() && child->xpos<=x && child->ypos<=y && xxpos+child->width && yypos+child->height) return child; } } return NULL; } // Count number of children FXint FXWindow::numChildren() const { register const FXWindow *child=first; register FXint num=0; while(child){ child=child->next; num++; } return num; } // Get index of child window FXint FXWindow::indexOfChild(const FXWindow *window) const { register FXint index=0; if(!window || window->parent!=this) return -1; while(window->prev){ window=window->prev; index++; } return index; } // Get child window at index FXWindow* FXWindow::childAtIndex(FXint index) const { register FXWindow* child=first; if(index<0) return NULL; while(index && child){ child=child->next; index--; } return child; } // Find common ancestor between window a and b FXWindow* FXWindow::commonAncestor(FXWindow* a,FXWindow* b){ register FXWindow *p1,*p2; if(a || b){ if(!a) return b->getRoot(); if(!b) return a->getRoot(); p1=a; while(p1){ p2=b; while(p2){ if(p2==p1) return p1; p2=p2->parent; } p1=p1->parent; } } return NULL; } // Return TRUE if sibling a <= sibling b in list bool FXWindow::before(const FXWindow *a,const FXWindow* b){ while(a!=b && a) a=a->next; return a==b; } // Return TRUE if sibling a >= sibling b in list bool FXWindow::after(const FXWindow *a,const FXWindow* b){ while(a!=b && b) b=b->next; return a==b; } // Return true if window is a shell window bool FXWindow::isShell() const { return (flags&FLAG_SHELL)!=0; } /*******************************************************************************/ // Handle repaint long FXWindow::onPaint(FXObject*,FXSelector,void* ptr){ FXDCWindow dc(this,(FXEvent*)ptr); dc.setForeground(backColor); dc.fillRectangle(0,0,width,height); return 1; } // Window was mapped to screen long FXWindow::onMap(FXObject*,FXSelector,void* ptr){ FXTRACE((250,"%s::onMap %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_MAP,message),ptr); } // Window was unmapped; the grab is lost long FXWindow::onUnmap(FXObject*,FXSelector,void* ptr){ FXTRACE((250,"%s::onUnmap %p\n",getClassName(),this)); if(getApp()->mouseGrabWindow==this) getApp()->mouseGrabWindow=NULL; if(getApp()->keyboardGrabWindow==this) getApp()->keyboardGrabWindow=NULL; return target && target->tryHandle(this,FXSEL(SEL_UNMAP,message),ptr); } // Handle configure notify long FXWindow::onConfigure(FXObject*,FXSelector,void* ptr){ FXTRACE((250,"%s::onConfigure %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_CONFIGURE,message),ptr); } // The window was destroyed; the grab is lost long FXWindow::onDestroy(FXObject*,FXSelector,void*){ FXTRACE((250,"%s::onDestroy %p\n",getClassName(),this)); getApp()->hash.remove((void*)xid); if(getApp()->mouseGrabWindow==this) getApp()->mouseGrabWindow=NULL; if(getApp()->keyboardGrabWindow==this) getApp()->keyboardGrabWindow=NULL; if(getApp()->cursorWindow==this) getApp()->cursorWindow=parent; if(getApp()->activeWindow==this) getApp()->activeWindow=NULL; flags&=~FLAG_FOCUSED; xid=0; return 1; } // Left button pressed long FXWindow::onLeftBtnPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONPRESS,message),ptr)) return 1; } return 0; } // Left button released long FXWindow::onLeftBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); if(target && target->tryHandle(this,FXSEL(SEL_LEFTBUTTONRELEASE,message),ptr)) return 1; } return 0; } // Middle button released long FXWindow::onMiddleBtnPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONPRESS,message),ptr)) return 1; } return 0; } // Middle button pressed long FXWindow::onMiddleBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); if(target && target->tryHandle(this,FXSEL(SEL_MIDDLEBUTTONRELEASE,message),ptr)) return 1; } return 0; } // Right button pressed long FXWindow::onRightBtnPress(FXObject*,FXSelector,void* ptr){ flags&=~FLAG_TIP; handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr); if(isEnabled()){ grab(); if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONPRESS,message),ptr)) return 1; } return 0; } // Right button released long FXWindow::onRightBtnRelease(FXObject*,FXSelector,void* ptr){ if(isEnabled()){ ungrab(); if(target && target->tryHandle(this,FXSEL(SEL_RIGHTBUTTONRELEASE,message),ptr)) return 1; } return 0; } // Mouse motion long FXWindow::onMotion(FXObject*,FXSelector,void* ptr){ return isEnabled() && target && target->tryHandle(this,FXSEL(SEL_MOTION,message),ptr); } // Mouse wheel long FXWindow::onMouseWheel(FXObject*,FXSelector,void* ptr){ return isEnabled() && target && target->tryHandle(this,FXSEL(SEL_MOUSEWHEEL,message),ptr); } // Keyboard press long FXWindow::onKeyPress(FXObject*,FXSelector,void* ptr){ FXTRACE((200,"%s::onKeyPress %p keysym=0x%04x state=%04x\n",getClassName(),this,((FXEvent*)ptr)->code,((FXEvent*)ptr)->state)); return isEnabled() && target && target->tryHandle(this,FXSEL(SEL_KEYPRESS,message),ptr); } // Keyboard release long FXWindow::onKeyRelease(FXObject*,FXSelector,void* ptr){ FXTRACE((200,"%s::onKeyRelease %p keysym=0x%04x state=%04x\n",getClassName(),this,((FXEvent*)ptr)->code,((FXEvent*)ptr)->state)); return isEnabled() && target && target->tryHandle(this,FXSEL(SEL_KEYRELEASE,message),ptr); } // Start a drag operation long FXWindow::onBeginDrag(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_BEGINDRAG,message),ptr); } // End drag operation long FXWindow::onEndDrag(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_ENDDRAG,message),ptr); } // Dragged stuff around long FXWindow::onDragged(FXObject*,FXSelector,void* ptr){ return target && target->tryHandle(this,FXSEL(SEL_DRAGGED,message),ptr); } // Entering window long FXWindow::onEnter(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXTRACE((150,"%s::onEnter %p (%s)\n",getClassName(),this, (event->code==CROSSINGNORMAL) ? "CROSSINGNORMAL" : (event->code==CROSSINGGRAB) ? "CROSSINGGRAB" : (event->code==CROSSINGUNGRAB)? "CROSSINGUNGRAB" : "?")); if(event->code!=CROSSINGGRAB){ if(!(event->state&(SHIFTMASK|CONTROLMASK|METAMASK|LEFTBUTTONMASK|MIDDLEBUTTONMASK|RIGHTBUTTONMASK))) flags|=FLAG_TIP; flags|=FLAG_HELP; } if(isEnabled() && target){ target->tryHandle(this,FXSEL(SEL_ENTER,message),ptr); } return 1; } // Leaving window long FXWindow::onLeave(FXObject*,FXSelector,void* ptr){ FXEvent* event=(FXEvent*)ptr; FXTRACE((150,"%s::onLeave %p (%s)\n",getClassName(),this, (event->code==CROSSINGNORMAL) ? "CROSSINGNORMAL" : (event->code==CROSSINGGRAB) ? "CROSSINGGRAB" : (event->code==CROSSINGUNGRAB)? "CROSSINGUNGRAB" : "?")); if(event->code!=CROSSINGUNGRAB){ flags&=~(FLAG_TIP|FLAG_HELP); } if(isEnabled() && target){ target->tryHandle(this,FXSEL(SEL_LEAVE,message),ptr); } return 1; } // We were asked about tip text long FXWindow::onQueryTip(FXObject* sender,FXSelector,void* ptr){ return (flags&FLAG_TIP) && target && target->tryHandle(sender,FXSEL(SEL_QUERY_TIP,message),ptr); } // We were asked about status text long FXWindow::onQueryHelp(FXObject* sender,FXSelector,void* ptr){ return (flags&FLAG_HELP) && target && target->tryHandle(sender,FXSEL(SEL_QUERY_HELP,message),ptr); } // True if window under the cursor bool FXWindow::underCursor() const { return (getApp()->cursorWindow==this); } // Handle drag-and-drop enter long FXWindow::onDNDEnter(FXObject*,FXSelector,void* ptr){ FXTRACE((150,"%s::onDNDEnter %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_DND_ENTER,message),ptr); } // Handle drag-and-drop leave long FXWindow::onDNDLeave(FXObject*,FXSelector,void* ptr){ FXTRACE((150,"%s::onDNDLeave %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_DND_LEAVE,message),ptr); } // Handle drag-and-drop motion long FXWindow::onDNDMotion(FXObject*,FXSelector,void* ptr){ FXTRACE((150,"%s::onDNDMotion %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_DND_MOTION,message),ptr); } // Handle drag-and-drop drop long FXWindow::onDNDDrop(FXObject*,FXSelector,void* ptr){ FXTRACE((150,"%s::onDNDDrop %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_DND_DROP,message),ptr); } // Request for DND data long FXWindow::onDNDRequest(FXObject*,FXSelector,void* ptr){ FXTRACE((150,"%s::onDNDRequest %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_DND_REQUEST,message),ptr); } // Show window long FXWindow::onCmdShow(FXObject*,FXSelector,void*){ if(!shown()){ show(); recalc(); } return 1; } // Hide window long FXWindow::onCmdHide(FXObject*,FXSelector,void*){ if(shown()){ hide(); recalc(); } return 1; } // Hide or show window long FXWindow::onCmdToggleShown(FXObject*,FXSelector,void*){ shown() ? hide() : show(); recalc(); return 1; } // Update hide or show window long FXWindow::onUpdToggleShown(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETVALUE),(void*)(FXuval)shown()); return 1; } // Raise window long FXWindow::onCmdRaise(FXObject*,FXSelector,void*){ raise(); return 1; } // Lower window long FXWindow::onCmdLower(FXObject*,FXSelector,void*){ lower(); return 1; } // Delete window long FXWindow::onCmdDelete(FXObject*,FXSelector,void*){ delete this; return 1; } // Enable window long FXWindow::onCmdEnable(FXObject*,FXSelector,void*){ enable(); return 1; } // Disable window long FXWindow::onCmdDisable(FXObject*,FXSelector,void*){ disable(); return 1; } // Disable or enable window long FXWindow::onCmdToggleEnabled(FXObject*,FXSelector,void*){ isEnabled() ? disable() : enable(); return 1; } // Update disable or enable window long FXWindow::onUpdToggleEnabled(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SETVALUE),(void*)(FXuval)isEnabled()); return 1; } // In combination with autograying/autohiding widgets, // this could be used to ungray or show when you don't want // to write a whole handler routine just to do this. long FXWindow::onUpdYes(FXObject* sender,FXSelector,void*){ sender->handle(this,FXSEL(SEL_COMMAND,ID_ENABLE),NULL); sender->handle(this,FXSEL(SEL_COMMAND,ID_SHOW),NULL); return 1; } // Update (repaint) window long FXWindow::onCmdUpdate(FXObject*,FXSelector,void*){ update(); return 1; } /*******************************************************************************/ // Gained focus long FXWindow::onFocusIn(FXObject*,FXSelector,void* ptr){ FXTRACE((150,"%s::onFocusIn %p\n",getClassName(),this)); flags|=FLAG_FOCUSED; if(target){ target->tryHandle(this,FXSEL(SEL_FOCUSIN,message),ptr); } if(composeContext){ composeContext->focusIn(); } if(focus){ focus->handle(focus,FXSEL(SEL_FOCUSIN,0),NULL); } return 1; } // Lost focus long FXWindow::onFocusOut(FXObject*,FXSelector,void* ptr){ FXTRACE((150,"%s::onFocusOut %p\n",getClassName(),this)); if(focus){ focus->handle(focus,FXSEL(SEL_FOCUSOUT,0),NULL); } if(composeContext){ composeContext->focusOut(); } if(target){ target->tryHandle(this,FXSEL(SEL_FOCUSOUT,message),ptr); } flags&=~FLAG_FOCUSED; return 1; } // Focus on widget itself, if its enabled long FXWindow::onFocusSelf(FXObject*,FXSelector,void*){ FXTRACE((150,"%s::onFocusSelf %p\n",getClassName(),this)); if(isEnabled() && canFocus()){ setFocus(); return 1; } return 0; } // Create compose context void FXWindow::createComposeContext(){ if(!composeContext){ composeContext=new FXComposeContext(getApp(),this,0); composeContext->create(); } } // Destroy compose context void FXWindow::destroyComposeContext(){ if(composeContext){ delete composeContext; composeContext=NULL; } } // If window can have focus bool FXWindow::canFocus() const { return false; } // Has window the focus bool FXWindow::hasFocus() const { return (flags&FLAG_FOCUSED)!=0; } // Window is in focus chain bool FXWindow::inFocusChain() const { return parent->focus==this; } // Set focus to this widget. // The chain of focus from shell down to a control is changed. // Widgets now in the chain may or may not gain real focus, // depending on whether parent window already had a real focus! // Setting the focus to a composite will cause descendants to loose it. void FXWindow::setFocus(){ FXTRACE((140,"%s::setFocus %p\n",getClassName(),this)); if(parent && parent->focus!=this){ if(parent->focus) parent->focus->killFocus(); else parent->setFocus(); parent->changeFocus(this); if(parent->hasFocus()) handle(this,FXSEL(SEL_FOCUSIN,0),NULL); } flags|=FLAG_HELP; } // Kill focus to this widget. void FXWindow::killFocus(){ FXTRACE((140,"%s::killFocus %p\n",getClassName(),this)); if(parent && parent->focus==this){ if(focus) focus->killFocus(); if(hasFocus()) handle(this,FXSEL(SEL_FOCUSOUT,0),NULL); parent->changeFocus(NULL); } flags&=~FLAG_HELP; } // Notification that focus moved to new child void FXWindow::changeFocus(FXWindow *child){ FXTRACE((140,"%s::changeFocus: from %p to %p\n",getClassName(),focus,child)); focus=child; } // Search widget tree for default window FXWindow* FXWindow::findDefault(FXWindow* window){ register FXWindow *win,*def; if(window->flags&FLAG_DEFAULT) return window; for(win=window->first; win; win=win->next){ if((def=findDefault(win))!=NULL) return def; } return NULL; } // Search widget tree for initial window FXWindow* FXWindow::findInitial(FXWindow* window){ register FXWindow *win,*ini; if(window->flags&FLAG_INITIAL) return window; for(win=window->first; win; win=win->next){ if((ini=findInitial(win))!=NULL) return ini; } return NULL; } // Make widget drawn as default void FXWindow::setDefault(FXbool enable){ register FXWindow *win; switch(enable){ case FALSE: flags&=~FLAG_DEFAULT; break; case TRUE: if(!(flags&FLAG_DEFAULT)){ win=findDefault(getShell()); if(win) win->setDefault(FALSE); flags|=FLAG_DEFAULT; } break; case MAYBE: if(flags&FLAG_DEFAULT){ flags&=~FLAG_DEFAULT; win=findInitial(getShell()); if(win) win->setDefault(TRUE); } break; } } // Return true if widget is drawn as default bool FXWindow::isDefault() const { return (flags&FLAG_DEFAULT)!=0; } // Make this window the initial default window void FXWindow::setInitial(bool enable){ register FXWindow *win; if((flags&FLAG_INITIAL) && !enable){ flags&=~FLAG_INITIAL; } if(!(flags&FLAG_INITIAL) && enable){ win=findInitial(getShell()); if(win) win->setInitial(FALSE); flags|=FLAG_INITIAL; } } // Return true if this is the initial default window bool FXWindow::isInitial() const { return (flags&FLAG_INITIAL)!=0; } /*******************************************************************************/ #ifndef WIN32 // Add this window to the list of colormap windows void FXWindow::addColormapWindows(){ Window windows[2],*windowsReturn,*windowList; int countReturn,i; // Check to see if there is already a property Status status=XGetWMColormapWindows(DISPLAY(getApp()),getShell()->id(),&windowsReturn,&countReturn); // If no property, just create one if(!status){ windows[0]=id(); windows[1]=getShell()->id(); XSetWMColormapWindows(DISPLAY(getApp()),getShell()->id(),windows,2); } // There was a property, add myself to the beginning else{ windowList=(Window*)malloc((sizeof(Window))*(countReturn+1)); windowList[0]=id(); for(i=0; iid(),windowList,countReturn+1); XFree((char*)windowsReturn); free(windowList); } } // Remove it from colormap windows void FXWindow::remColormapWindows(){ Window *windowsReturn; int countReturn,i; Status status=XGetWMColormapWindows(DISPLAY(getApp()),getShell()->id(),&windowsReturn,&countReturn); if(status){ for(i=0; iid(),windowsReturn,countReturn-1); break; } } XFree((char*)windowsReturn); } } #endif /*******************************************************************************/ // Create X window void FXWindow::create(){ if(!xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::create %p\n",getClassName(),this)); #ifndef WIN32 XSetWindowAttributes wattr; XClassHint hint; unsigned long mask; // Gotta have a parent already created! if(!parent->id()){ fxerror("%s::create: trying to create window before creating parent window.\n",getClassName()); } // If window has owner, owner should have been created already if(owner && !owner->id()){ fxerror("%s::create: trying to create window before creating owner window.\n",getClassName()); } // Got to have a visual if(!visual){ fxerror("%s::create: trying to create window without a visual.\n",getClassName()); } // Initialize visual visual->create(); // Create default cursor if(defaultCursor) defaultCursor->create(); // Create drag cursor if(dragCursor) dragCursor->create(); // Fill in the attributes mask=CWBackPixmap|CWWinGravity|CWBitGravity|CWBorderPixel|CWEventMask|CWDontPropagate|CWCursor|CWOverrideRedirect|CWSaveUnder|CWColormap; // Events for normal windows wattr.event_mask=BASIC_EVENT_MASK; // Events for shell windows if(flags&FLAG_SHELL) wattr.event_mask|=SHELL_EVENT_MASK; // If enabled, turn on some more events if(flags&FLAG_ENABLED) wattr.event_mask|=ENABLED_EVENT_MASK; // For input methods //#ifndef NO_XIM // if(getApp()->xic){ // long filterevents=0; // XGetICValues((XIC)getApp()->xic,XNFilterEvents,&filterevents,NULL); // wattr.event_mask|=filterevents; // } //#endif // FOX will not propagate events to ancestor windows wattr.do_not_propagate_mask=NOT_PROPAGATE_MASK; // Obtain colormap wattr.colormap=visual->colormap; // This is needed for OpenGL wattr.border_pixel=0; // Background wattr.background_pixmap=None; //wattr.background_pixel=visual->getPixel(backColor); // Preserving content during resize will be faster:- not turned // on yet as we will have to recode all widgets to decide when to // repaint or not to repaint the display when resized... wattr.bit_gravity=NorthWestGravity; wattr.bit_gravity=ForgetGravity; // The window gravity is NorthWestGravity, which means // if a child keeps same position relative to top/left // of its parent window, nothing extra work is incurred. wattr.win_gravity=NorthWestGravity; // Determine override redirect wattr.override_redirect=doesOverrideRedirect(); // Determine save-unders wattr.save_under=doesSaveUnder(); // Set cursor wattr.cursor=defaultCursor->id(); // Finally, create the window xid=XCreateWindow(DISPLAY(getApp()),parent->id(),xpos,ypos,FXMAX(width,1),FXMAX(height,1),0,visual->depth,InputOutput,(Visual*)visual->visual,mask,&wattr); // Uh-oh, we failed if(!xid){ throw FXWindowException("unable to create window."); } // Store for xid to C++ object mapping getApp()->hash.insert((void*)xid,this); // Set resource and class name for toplevel windows. // In a perfect world this would be set in FXTopWindow, but for some strange reasons // some window-managers (e.g. fvwm) this will be too late and they will not recognize them. if(flags&FLAG_SHELL){ hint.res_name=(char*)getApp()->getAppName().text(); // "FoxApp"; hint.res_class=(char*)getApp()->getVendorName().text(); // "FoxWindow"; XSetClassHint(DISPLAY(getApp()),xid,&hint); } // We put the XdndAware property on all toplevel windows, so that // when dragging, we need to search no further than the toplevel window. if(flags&FLAG_SHELL){ Atom propdata=(Atom)XDND_PROTOCOL_VERSION; XChangeProperty(DISPLAY(getApp()),xid,getApp()->xdndAware,XA_ATOM,32,PropModeReplace,(unsigned char*)&propdata,1); } // If window is a shell and it has an owner, make it stay on top of the owner if((flags&FLAG_SHELL) && owner){ XSetTransientForHint(DISPLAY(getApp()),xid,owner->getShell()->id()); } // If colormap different, set WM_COLORMAP_WINDOWS property properly if(visual->colormap!=DefaultColormap(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp())))){ FXTRACE((150,"%s::create: %p: adding to WM_COLORMAP_WINDOWS\n",getClassName(),this)); addColormapWindows(); } // Show if it was supposed to be if((flags&FLAG_SHOWN) && 0id()){ fxerror("%s::create: trying to create window before creating parent window.\n",getClassName()); } // If window has owner, owner should have been created already if(owner && !owner->id()){ fxerror("%s::create: trying to create window before creating owner window.\n",getClassName()); } // Got to have a visual if(!visual){ fxerror("%s::create: trying to create window without a visual.\n",getClassName()); } // Initialize visual visual->create(); // Create default cursor if(defaultCursor) defaultCursor->create(); // Create drag cursor if(dragCursor) dragCursor->create(); // Most windows use these style bits DWORD dwStyle=WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN; DWORD dwExStyle=0; dwExStyle|=WS_EX_NOPARENTNOTIFY; HWND hParent=(HWND)parent->id(); if(flags&FLAG_SHELL){ if(isMemberOf(FXMETACLASS(FXTopWindow))){ dwStyle=WS_OVERLAPPEDWINDOW|WS_CLIPSIBLINGS|WS_CLIPCHILDREN; } else if(doesOverrideRedirect()){ // To control window placement or control decoration, a window manager // often needs to redirect map or configure requests. Popup windows, however, // often need to be mapped without a window manager getting in the way. dwStyle=WS_POPUP|WS_CLIPSIBLINGS|WS_CLIPCHILDREN; dwExStyle=WS_EX_TOOLWINDOW; } else{ // Other top-level shell windows (like dialogs) dwStyle=WS_POPUP|WS_CAPTION|WS_CLIPSIBLINGS|WS_CLIPCHILDREN; dwExStyle=WS_EX_DLGMODALFRAME|WS_EX_TOOLWINDOW; } if(owner) hParent=(HWND)owner->id(); } // Create this window xid=CreateWindowExA(dwExStyle,GetClass(),NULL,dwStyle,xpos,ypos,FXMAX(width,1),FXMAX(height,1),hParent,NULL,(HINSTANCE)(getApp()->display),this); // Uh-oh, we failed if(!xid){ throw FXWindowException("unable to create window."); } // Store for xid to C++ object mapping getApp()->hash.insert((void*)xid,this); // We put the XdndAware property on all toplevel windows, so that // when dragging, we need to search no further than the toplevel window. if(flags&FLAG_SHELL){ HANDLE propdata=(HANDLE)XDND_PROTOCOL_VERSION; SetProp((HWND)xid,(LPCTSTR)MAKELONG(getApp()->xdndAware,0),propdata); } // To keep it on top //SetWindowPos((HWND)xid,HWND_TOPMOST,xpos,ypos,FXMAX(width,1),FXMAX(height,1),0); // Show if it was supposed to be. Apparently, initial state // is neither shown nor hidden, so an explicit hide is needed. // Patch thanks to "Glenn Shen" if(flags&FLAG_SHOWN) ShowWindow((HWND)xid,SW_SHOWNOACTIVATE); else ShowWindow((HWND)xid,SW_HIDE); #endif flags|=FLAG_OWNED; } } } // Attach to a window belonging to another application void FXWindow::attach(FXID w){ if(!xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::attach %p\n",getClassName(),this)); // Gotta have a parent already created! if(!parent->id()){ fxerror("%s::attach: trying to attach window before creating parent window.\n",getClassName()); } // If window has owner, owner should have been created already if(owner && !owner->id()){ fxerror("%s::attach: trying to attach window before creating owner window.\n",getClassName()); } // Got to have a visual if(!visual){ fxerror("%s::attach: trying to attach window without a visual.\n",getClassName()); } // Uh-oh, we failed if(!w){ throw FXWindowException("unable to attach window."); } // Initialize visual visual->create(); // Create default cursor if(defaultCursor) defaultCursor->create(); // Create drag cursor if(dragCursor) dragCursor->create(); // Simply assign to xid xid=w; // Store for xid to C++ object mapping getApp()->hash.insert((void*)xid,this); // Reparent under what WE think the parent is #ifndef WIN32 XReparentWindow(DISPLAY(getApp()),xid,parent->id(),0,0); #else SetParent((HWND)xid,(HWND)parent->id()); #endif } } } // Detach window void FXWindow::detach(){ // Detach visual visual->detach(); // Detach default cursor if(defaultCursor) defaultCursor->detach(); // Detach drag cursor if(dragCursor) dragCursor->detach(); if(xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::detach %p\n",getClassName(),this)); // Remove from xid to C++ object mapping getApp()->hash.remove((void*)xid); } // No longer grabbed if(getApp()->mouseGrabWindow==this) getApp()->mouseGrabWindow=NULL; if(getApp()->keyboardGrabWindow==this) getApp()->keyboardGrabWindow=NULL; if(getApp()->cursorWindow==this) getApp()->cursorWindow=parent; if(getApp()->activeWindow==this) getApp()->activeWindow=NULL; flags&=~FLAG_FOCUSED; flags&=~FLAG_OWNED; xid=0; } } // Destroy; only destroy window if we own it void FXWindow::destroy(){ if(xid){ if(getApp()->isInitialized()){ FXTRACE((100,"%s::destroy %p\n",getClassName(),this)); // Remove from xid to C++ object mapping getApp()->hash.remove((void*)xid); // Its our own window, so destroy it if(flags&FLAG_OWNED){ #ifndef WIN32 // If colormap different, set WM_COLORMAP_WINDOWS property properly if(visual->colormap!=DefaultColormap(DISPLAY(getApp()),DefaultScreen(DISPLAY(getApp())))){ FXTRACE((150,"%s::destroy: %p: removing from WM_COLORMAP_WINDOWS\n",getClassName(),this)); remColormapWindows(); } // Delete the XdndAware property if(flags&FLAG_SHELL){ XDeleteProperty(DISPLAY(getApp()),xid,getApp()->xdndAware); } // Delete the window XDestroyWindow(DISPLAY(getApp()),xid); #else // Delete the XdndAware property if(flags&FLAG_SHELL){ RemoveProp((HWND)xid,(LPCTSTR)MAKELONG(getApp()->xdndAware,0)); } // Zap the window DestroyWindow((HWND)xid); #endif } } // No longer grabbed if(getApp()->mouseGrabWindow==this) getApp()->mouseGrabWindow=NULL; if(getApp()->keyboardGrabWindow==this) getApp()->keyboardGrabWindow=NULL; if(getApp()->cursorWindow==this) getApp()->cursorWindow=parent; if(getApp()->activeWindow==this) getApp()->activeWindow=NULL; flags&=~FLAG_FOCUSED; flags&=~FLAG_OWNED; xid=0; } } #ifdef WIN32 // Get this window's device context FXID FXWindow::GetDC() const { return ::GetDC((HWND)xid); } // Release it int FXWindow::ReleaseDC(FXID hdc) const { return ::ReleaseDC((HWND)xid,(HDC)hdc); } // Window class const char* FXWindow::GetClass() const { return "FXWindow"; } #endif /*******************************************************************************/ // Set window shape by means of region void FXWindow::setShape(const FXRegion& region){ if(xid){ #ifndef WIN32 #ifdef HAVE_XSHAPE_H XShapeCombineRegion(DISPLAY(getApp()),xid,ShapeBounding,0,0,(Region)region.region,ShapeSet); #endif #else // Make a copy so as to leave original region intact HRGN rgn=CreateRectRgn(0,0,0,0); CombineRgn(rgn,(HRGN)region.region,rgn,RGN_COPY); SetWindowRgn((HWND)xid,rgn,FALSE); #endif } } // Builds a region from a bitmap #ifdef WIN32 static HRGN makeregion(HDC hdc,FXint w,FXint h){ const COLORREF clear=RGB(255,255,255); register HRGN shape,run; register FXint x,y,z; shape=CreateRectRgn(0,0,0,0); for(y=0; yid()){ fxerror("%s::setShape: illegal bitmap specified.\n",getClassName()); } if(xid){ #ifndef WIN32 #ifdef HAVE_XSHAPE_H XShapeCombineMask(DISPLAY(getApp()),xid,ShapeBounding,0,0,bitmap->id(),ShapeSet); #endif #else HDC hdc=CreateCompatibleDC(NULL); SelectObject(hdc,bitmap->id()); HRGN rgn=makeregion(hdc,bitmap->getWidth(),bitmap->getHeight()); SetWindowRgn((HWND)xid,rgn,FALSE); DeleteDC(hdc); #endif } } // Set window shape by means of bitmap void FXWindow::setShape(FXIcon* icon){ if(!icon || !icon->shape){ fxerror("%s::setShape: illegal icon specified.\n",getClassName()); } if(xid){ #ifndef WIN32 #ifdef HAVE_XSHAPE_H XShapeCombineMask(DISPLAY(getApp()),xid,ShapeBounding,0,0,icon->shape,ShapeSet); #endif #else HDC hdc=CreateCompatibleDC(NULL); SelectObject(hdc,icon->shape); HRGN rgn=makeregion(hdc,icon->getWidth(),icon->getHeight()); SetWindowRgn((HWND)xid,rgn,FALSE); DeleteDC(hdc); #endif } } // Clear window shape to default rectangle void FXWindow::clearShape(){ if(xid){ #ifndef WIN32 #ifdef HAVE_XSHAPE_H XShapeCombineMask(DISPLAY(getApp()),xid,ShapeBounding,0,0,None,ShapeSet); #endif #else SetWindowRgn((HWND)xid,NULL,FALSE); #endif } } /*******************************************************************************/ // Test if active bool FXWindow::isActive() const { return (flags&FLAG_ACTIVE)!=0; } // Get default width FXint FXWindow::getDefaultWidth(){ return 1; } // Get default height FXint FXWindow::getDefaultHeight(){ return 1; } // Return width for given height FXint FXWindow::getWidthForHeight(FXint){ return getDefaultWidth(); } // Return height for given width FXint FXWindow::getHeightForWidth(FXint){ return getDefaultHeight(); } // Set X position void FXWindow::setX(FXint x){ xpos=x; recalc(); } // Set Y position void FXWindow::setY(FXint y){ ypos=y; recalc(); } // Set width void FXWindow::setWidth(FXint w){ if(w<0) w=0; width=w; recalc(); } // Set height void FXWindow::setHeight(FXint h){ if(h<0) h=0; height=h; recalc(); } // Change layout void FXWindow::setLayoutHints(FXuint lout){ FXuint opts=(options&~LAYOUT_MASK) | (lout&LAYOUT_MASK); if(options!=opts){ options=opts; recalc(); } } // Get layout hints FXuint FXWindow::getLayoutHints() const { return (options&LAYOUT_MASK); } // Is widget a composite bool FXWindow::isComposite() const { return false; } // Window does override-redirect bool FXWindow::doesOverrideRedirect() const { return false; } // Window does save-unders bool FXWindow::doesSaveUnder() const { return false; } /*******************************************************************************/ // Add hot key to closest ancestor's accelerator table void FXWindow::addHotKey(FXHotKey code){ register FXAccelTable *accel=NULL; register FXWindow *win=this; while(win && (accel=win->getAccelTable())==NULL) win=win->parent; if(accel) accel->addAccel(code,this,FXSEL(SEL_KEYPRESS,ID_HOTKEY),FXSEL(SEL_KEYRELEASE,ID_HOTKEY)); } // Remove hot key from closest ancestor's accelerator table void FXWindow::remHotKey(FXHotKey code){ register FXAccelTable *accel=NULL; register FXWindow *win=this; while(win && (accel=win->getAccelTable())==NULL) win=win->parent; if(accel) accel->removeAccel(code); } /*******************************************************************************/ // Set cursor void FXWindow::setDefaultCursor(FXCursor* cur){ if(defaultCursor!=cur){ if(cur==NULL){ fxerror("%s::setDefaultCursor: NULL cursor argument.\n",getClassName()); } if(xid){ if(cur->id()==0){ fxerror("%s::setDefaultCursor: Cursor has not been created yet.\n",getClassName()); } #ifndef WIN32 XDefineCursor(DISPLAY(getApp()),xid,cur->id()); #else if(underCursor() && !grabbed()) SetCursor((HCURSOR)cur->id()); #endif } defaultCursor=cur; } } // Set drag cursor void FXWindow::setDragCursor(FXCursor* cur){ if(dragCursor!=cur){ if(cur==NULL){ fxerror("%s::setDragCursor: NULL cursor argument.\n",getClassName()); } if(xid){ if(cur->id()==0){ fxerror("%s::setDragCursor: Cursor has not been created yet.\n",getClassName()); } #ifndef WIN32 if(grabbed()){ XChangeActivePointerGrab(DISPLAY(getApp()),GRAB_EVENT_MASK,cur->id(),CurrentTime); } #else if(grabbed()) SetCursor((HCURSOR)cur->id()); #endif } dragCursor=cur; } } // Set window background void FXWindow::setBackColor(FXColor clr){ if(clr!=backColor){ backColor=clr; // if(xid){ //#ifndef WIN32 // XSetWindowBackground(DISPLAY(getApp()),xid,visual->getPixel(backColor)); //#else // // FIXME // //#endif // } update(); } } /*******************************************************************************/ // Lost the selection long FXWindow::onSelectionLost(FXObject*,FXSelector,void* ptr){ FXTRACE((100,"%s::onSelectionLost %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_SELECTION_LOST,message),ptr); } // Gained the selection long FXWindow::onSelectionGained(FXObject*,FXSelector,void* ptr){ FXTRACE((100,"%s::onSelectionGained %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_SELECTION_GAINED,message),ptr); } // Somebody wants our the selection long FXWindow::onSelectionRequest(FXObject*,FXSelector,void* ptr){ FXTRACE((100,"%s::onSelectionRequest %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_SELECTION_REQUEST,message),ptr); } // Has this window the selection bool FXWindow::hasSelection() const { return (getApp()->selectionWindow==this); } // Acquire the selection. // We always generate SEL_SELECTION_LOST and SEL_SELECTION_GAINED // because we assume the selection types may have changed, and want // to give target opportunity to allocate the new data for these types. bool FXWindow::acquireSelection(const FXDragType *types,FXuint numtypes){ if(!types || !numtypes){ fxerror("%s::acquireSelection: should have at least one type to select.\n",getClassName()); } if(getApp()->selectionWindow){ getApp()->selectionWindow->handle(getApp(),FXSEL(SEL_SELECTION_LOST,0),&getApp()->event); getApp()->selectionWindow=NULL; FXFREE(&getApp()->xselTypeList); getApp()->xselNumTypes=0; } if(xid){ #ifndef WIN32 XSetSelectionOwner(DISPLAY(getApp()),XA_PRIMARY,xid,getApp()->event.time); if(XGetSelectionOwner(DISPLAY(getApp()),XA_PRIMARY)!=xid) return false; #endif } if(!getApp()->selectionWindow){ getApp()->selectionWindow=this; getApp()->selectionWindow->handle(getApp(),FXSEL(SEL_SELECTION_GAINED,0),&getApp()->event); FXRESIZE(&getApp()->xselTypeList,FXDragType,numtypes); memcpy(getApp()->xselTypeList,types,sizeof(FXDragType)*numtypes); getApp()->xselNumTypes=numtypes; } return true; } // Release the selection bool FXWindow::releaseSelection(){ if(getApp()->selectionWindow==this){ getApp()->selectionWindow->handle(getApp(),FXSEL(SEL_SELECTION_LOST,0),&getApp()->event); getApp()->selectionWindow=NULL; FXFREE(&getApp()->xselTypeList); getApp()->xselNumTypes=0; if(xid){ #ifndef WIN32 XSetSelectionOwner(DISPLAY(getApp()),XA_PRIMARY,None,getApp()->event.time); #endif } return true; } return false; } /*******************************************************************************/ // Lost the selection long FXWindow::onClipboardLost(FXObject*,FXSelector,void* ptr){ FXTRACE((100,"%s::onClipboardLost %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_CLIPBOARD_LOST,message),ptr); } // Gained the selection long FXWindow::onClipboardGained(FXObject*,FXSelector,void* ptr){ FXTRACE((100,"%s::onClipboardGained %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_CLIPBOARD_GAINED,message),ptr); } // Somebody wants our the selection long FXWindow::onClipboardRequest(FXObject*,FXSelector,void* ptr){ FXTRACE((100,"%s::onClipboardRequest %p\n",getClassName(),this)); return target && target->tryHandle(this,FXSEL(SEL_CLIPBOARD_REQUEST,message),ptr); } // Has this window the selection bool FXWindow::hasClipboard() const { return (getApp()->clipboardWindow==this); } // Acquire the clipboard // We always generate SEL_CLIPBOARD_LOST and SEL_CLIPBOARD_GAINED // because we assume the clipboard types may have changed, and want // to give target opportunity to allocate the new data for these types. bool FXWindow::acquireClipboard(const FXDragType *types,FXuint numtypes){ if(!types || !numtypes){ fxerror("%s::acquireClipboard: should have at least one type to select.\n",getClassName()); } if(getApp()->clipboardWindow){ getApp()->clipboardWindow->handle(getApp(),FXSEL(SEL_CLIPBOARD_LOST,0),&getApp()->event); getApp()->clipboardWindow=NULL; #ifndef WIN32 FXFREE(&getApp()->xcbTypeList); getApp()->xcbNumTypes=0; #endif } if(xid){ #ifndef WIN32 XSetSelectionOwner(DISPLAY(getApp()),getApp()->xcbSelection,xid,getApp()->event.time); if(XGetSelectionOwner(DISPLAY(getApp()),getApp()->xcbSelection)!=xid) return false; #else if(!OpenClipboard((HWND)xid)) return false; EmptyClipboard(); for(FXuint i=0; iclipboardWindow){ getApp()->clipboardWindow=this; getApp()->clipboardWindow->handle(getApp(),FXSEL(SEL_CLIPBOARD_GAINED,0),&getApp()->event); #ifndef WIN32 FXRESIZE(&getApp()->xcbTypeList,FXDragType,numtypes); memcpy(getApp()->xcbTypeList,types,sizeof(FXDragType)*numtypes); getApp()->xcbNumTypes=numtypes; #endif } return true; } // Release the clipboard bool FXWindow::releaseClipboard(){ if(getApp()->clipboardWindow==this){ getApp()->clipboardWindow->handle(getApp(),FXSEL(SEL_CLIPBOARD_LOST,0),&getApp()->event); getApp()->clipboardWindow=NULL; #ifndef WIN32 FXFREE(&getApp()->xcbTypeList); getApp()->xcbNumTypes=0; #endif if(xid){ #ifndef WIN32 XSetSelectionOwner(DISPLAY(getApp()),getApp()->xcbSelection,None,getApp()->event.time); #else if(OpenClipboard((HWND)xid)){EmptyClipboard();CloseClipboard();} #endif } return true; } return false; } /*******************************************************************************/ // Get pointer location (in window coordinates) FXint FXWindow::getCursorPosition(FXint& x,FXint& y,FXuint& buttons) const { if(xid){ #ifndef WIN32 Window dum; int rx,ry; return XQueryPointer(DISPLAY(getApp()),xid,&dum,&dum,&rx,&ry,&x,&y,&buttons); #else POINT pt; GetCursorPos(&pt); ScreenToClient((HWND)xid,&pt); x=pt.x; y=pt.y; buttons=fxmodifierkeys(); return TRUE; #endif } return FALSE; } // Set pointer location (in window coordinates) // Contributed by David Heath FXint FXWindow::setCursorPosition(FXint x,FXint y){ if(xid){ #ifndef WIN32 XWarpPointer(DISPLAY(getApp()),None,xid,0,0,0,0,x,y); return TRUE; #else POINT pt; pt.x=x; pt.y=y; ClientToScreen((HWND)xid,&pt); SetCursorPos(pt.x,pt.y); return TRUE; #endif } return FALSE; } // Update this widget by sending SEL_UPDATE to its target. // If there is no target, onUpdate returns 0 on behalf of widgets // which have the autogray feature enabled. If there is a target // but we're not updating because the user is manipulating the // widget, then onUpdate returns 1 to prevent it from graying // out during manipulation when the autogray feature is enabled. // Otherwise, onUpdate returns the value returned by the SEL_UPDATE // callback to the target. long FXWindow::onUpdate(FXObject*,FXSelector,void*){ return target && (!(flags&FLAG_UPDATE) || target->tryHandle(this,FXSEL(SEL_UPDATE,message),NULL)); } // Perform layout immediately void FXWindow::layout(){ flags&=~FLAG_DIRTY; } // Mark this window's layout as dirty for later layout void FXWindow::recalc(){ if(parent) parent->recalc(); flags|=FLAG_DIRTY; } // Force GUI refresh of this window and all of its children void FXWindow::forceRefresh(){ register FXWindow *child; handle(this,FXSEL(SEL_UPDATE,0),NULL); for(child=first; child; child=child->next){ child->forceRefresh(); } } // Update dirty rectangle void FXWindow::update(FXint x,FXint y,FXint w,FXint h) const { if(xid){ // We toss out rectangles outside the visible area if(x>=width || y>=height || x+w<=0 || y+h<=0) return; // Intersect with the window if(x<0){w+=x;x=0;} if(y<0){h+=y;y=0;} if(x+w>width){w=width-x;} if(y+h>height){h=height-y;} // Append the rectangle; it is a synthetic expose event!! if(w>0 && h>0){ #ifndef WIN32 getApp()->addRepaint(xid,x,y,w,h,1); #else RECT r; r.left=x; r.top=y; r.right=x+w; r.bottom=y+h; InvalidateRect((HWND)xid,&r,TRUE); #endif } } } // Update dirty window void FXWindow::update() const { update(0,0,width,height); } // If marked but not yet painted, paint the given area void FXWindow::repaint(FXint x,FXint y,FXint w,FXint h) const { if(xid){ // We toss out rectangles outside the visible area if(x>=width || y>=height || x+w<=0 || y+h<=0) return; // Intersect with the window if(x<0){w+=x;x=0;} if(y<0){h+=y;y=0;} if(x+w>width){w=width-x;} if(y+h>height){h=height-y;} if(w>0 && h>0){ #ifndef WIN32 getApp()->removeRepaints(xid,x,y,w,h); #else RECT r; r.left=x; r.top=y; r.right=x+w; r.bottom=y+h; RedrawWindow((HWND)xid,&r,NULL,RDW_UPDATENOW); #endif } } } // If marked but not yet painted, paint the entire window void FXWindow::repaint() const { repaint(0,0,width,height); } // Move window void FXWindow::move(FXint x,FXint y){ FXTRACE((200,"%s::move: x=%d y=%d\n",getClassName(),x,y)); if((flags&FLAG_DIRTY)||(x!=xpos)||(y!=ypos)){ xpos=x; ypos=y; if(xid){ // Similar as for position(), we have to generate protocol // here so as to make the display reflect reality... #ifndef WIN32 XMoveWindow(DISPLAY(getApp()),xid,x,y); #else SetWindowPos((HWND)xid,NULL,x,y,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOOWNERZORDER); #endif if(flags&FLAG_DIRTY) layout(); } } } // Move and resize void FXWindow::position(FXint x,FXint y,FXint w,FXint h){ register FXint ow=width; register FXint oh=height; FXTRACE((200,"%s::position: x=%d y=%d w=%d h=%d\n",getClassName(),x,y,w,h)); if(w<0) w=0; if(h<0) h=0; if((flags&FLAG_DIRTY)||(x!=xpos)||(y!=ypos)||(w!=ow)||(h!=oh)){ xpos=x; ypos=y; width=w; height=h; if(xid){ // Alas, we have to generate some protocol here even if the placement // as recorded in the widget hasn't actually changed. This is because // there are ways to change the placement w/o going through position()! #ifndef WIN32 if(0addRepaint(xid,x,y,w,h,1); } // Has overlap, so blit contents and repaint the exposed parts else{ FXint tx,ty,fx,fy,ex,ey,ew,eh; XEvent event; // Force server to catch up XSync(DISPLAY(getApp()),False); // Pull any outstanding repaint events into our own repaint rectangle list while(XCheckWindowEvent(DISPLAY(getApp()),xid,ExposureMask,&event)){ if(event.xany.type==NoExpose) continue; getApp()->addRepaint(xid,event.xexpose.x,event.xexpose.y,event.xexpose.width,event.xexpose.height,0); if(event.xgraphicsexpose.count==0) break; } // Scroll all repaint rectangles of this window by the dx,dy getApp()->scrollRepaints(xid,dx,dy); // Compute blitted area if(dx>0){ // Content shifted right fx=x; tx=x+dx; ex=x; ew=dx; } else{ // Content shifted left fx=x-dx; tx=x; ex=x+w+dx; ew=-dx; } if(dy>0){ // Content shifted down fy=y; ty=y+dy; ey=y; eh=dy; } else{ // Content shifted up fy=y-dy; ty=y; ey=y+h+dy; eh=-dy; } // BLIT the contents XCopyArea(DISPLAY(getApp()),xid,xid,(GC)visual->scrollgc,fx,fy,w-ew,h-eh,tx,ty); // Post additional rectangles for the uncovered areas if(dy){ getApp()->addRepaint(xid,x,ey,w,eh,1); } if(dx){ getApp()->addRepaint(xid,ex,y,ew,h,1); } } } } #else // Scroll rectangle x,y,w,h by a shift of dx,dy void FXWindow::scroll(FXint x,FXint y,FXint w,FXint h,FXint dx,FXint dy) const { if(xid && 0mouseGrabWindow==this){ XUngrabPointer(DISPLAY(getApp()),CurrentTime); XFlush(DISPLAY(getApp())); handle(this,FXSEL(SEL_UNGRABBED,0),&getApp()->event); getApp()->mouseGrabWindow=NULL; } if(getApp()->keyboardGrabWindow==this){ XUngrabKeyboard(DISPLAY(getApp()),getApp()->event.time); XFlush(DISPLAY(getApp())); getApp()->keyboardGrabWindow=NULL; } XUnmapWindow(DISPLAY(getApp()),xid); #else if(getApp()->mouseGrabWindow==this){ ReleaseCapture(); SetCursor((HCURSOR)defaultCursor->id()); handle(this,FXSEL(SEL_UNGRABBED,0),&getApp()->event); getApp()->mouseGrabWindow=NULL; } if(getApp()->keyboardGrabWindow==this){ getApp()->keyboardGrabWindow=NULL; } ShowWindow((HWND)xid,SW_HIDE); #endif } } } // Check if logically shown bool FXWindow::shown() const { return (flags&FLAG_SHOWN)!=0; } // Reparent window under a new parent void FXWindow::reparent(FXWindow* father,FXWindow* other){ FXbool hadfocus=inFocusChain(); if(father==NULL){ fxerror("%s::reparent: NULL parent specified.\n",getClassName()); } if(parent==NULL){ fxerror("%s::reparent: cannot reparent root window.\n",getClassName()); } if(parent==getRoot() || father==getRoot()){ fxerror("%s::reparent: cannot reparent toplevel window.\n",getClassName()); } if(other && father!=other->getParent()){ fxerror("%s::reparent: other window has different parent.\n",getClassName()); } if(this!=other){ // Check for funny cases if(containsChild(father)){ fxerror("%s::reparent: new parent is child of window.\n",getClassName()); } // Both windows created or both non-created if(xid && !father->id()){ fxerror("%s::reparent: new parent not created yet.\n",getClassName()); } if(!xid && father->id()){ fxerror("%s::reparent: window not created yet.\n",getClassName()); } // Kill focus chain through this window if(hadfocus) killFocus(); // Recalc old path recalc(); // Unlink from old parent if(prev) prev->next=next; else parent->first=next; if(next) next->prev=prev; else parent->last=prev; // Link to new parent if(other){ next=other; prev=other->prev; other->prev=this; } else{ next=NULL; prev=father->last; father->last=this; } if(prev){ prev->next=this; } else{ father->first=this; } // Moved between parents if(parent!=father){ // New parent and owner parent=father; owner=father; // Hook up to new window in server too if(xid && parent->id()){ #ifndef WIN32 // See remarks in FXToolBarGrip XReparentWindow(DISPLAY(getApp()),xid,parent->id(),0,0); XFlush(DISPLAY(getApp())); #else SetParent((HWND)xid,(HWND)parent->id()); #endif } } // Set focus back if we had it if(hadfocus) setFocus(); // Recalc new path recalc(); } } // Enable the window void FXWindow::enable(){ if(!(flags&FLAG_ENABLED)){ flags|=FLAG_ENABLED; if(xid){ #ifndef WIN32 FXuint events=BASIC_EVENT_MASK|ENABLED_EVENT_MASK; if(flags&FLAG_SHELL) events|=SHELL_EVENT_MASK; XSelectInput(DISPLAY(getApp()),xid,events); #else EnableWindow((HWND)xid,TRUE); #endif } } } // Disable the window void FXWindow::disable(){ killFocus(); if(flags&FLAG_ENABLED){ flags&=~FLAG_ENABLED; if(xid){ #ifndef WIN32 FXuint events=BASIC_EVENT_MASK; if(flags&FLAG_SHELL) events|=SHELL_EVENT_MASK; XSelectInput(DISPLAY(getApp()),xid,events); if(getApp()->mouseGrabWindow==this){ XUngrabPointer(DISPLAY(getApp()),CurrentTime); XFlush(DISPLAY(getApp())); handle(this,FXSEL(SEL_UNGRABBED,0),&getApp()->event); getApp()->mouseGrabWindow=NULL; } if(getApp()->keyboardGrabWindow==this){ XUngrabKeyboard(DISPLAY(getApp()),getApp()->event.time); XFlush(DISPLAY(getApp())); getApp()->keyboardGrabWindow=NULL; } #else EnableWindow((HWND)xid,FALSE); if(getApp()->mouseGrabWindow==this){ ReleaseCapture(); SetCursor((HCURSOR)defaultCursor->id()); handle(this,FXSEL(SEL_UNGRABBED,0),&getApp()->event); getApp()->mouseGrabWindow=NULL; } if(getApp()->keyboardGrabWindow==this){ getApp()->keyboardGrabWindow=NULL; } #endif } } } // Is window enabled bool FXWindow::isEnabled() const { return (flags&FLAG_ENABLED)!=0; } // Raise (but do not activate!) void FXWindow::raise(){ if(xid){ #ifndef WIN32 XRaiseWindow(DISPLAY(getApp()),xid); #else SetWindowPos((HWND)xid,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOOWNERZORDER); #endif } } // Lower void FXWindow::lower(){ if(xid){ #ifndef WIN32 XLowerWindow(DISPLAY(getApp()),xid); #else SetWindowPos((HWND)xid,HWND_BOTTOM,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOOWNERZORDER); #endif } } // Get coordinates from another window (for symmetry) void FXWindow::translateCoordinatesFrom(FXint& tox,FXint& toy,const FXWindow* fromwindow,FXint fromx,FXint fromy) const { if(fromwindow==NULL){ fxerror("%s::translateCoordinatesFrom: from-window is NULL.\n",getClassName()); } if(xid && fromwindow->id()){ #ifndef WIN32 Window tmp; XTranslateCoordinates(DISPLAY(getApp()),fromwindow->id(),xid,fromx,fromy,&tox,&toy,&tmp); #else POINT pt; pt.x=fromx; pt.y=fromy; ClientToScreen((HWND)fromwindow->id(),&pt); ScreenToClient((HWND)xid,&pt); tox=pt.x; toy=pt.y; #endif } } // Get coordinates to another window (for symmetry) void FXWindow::translateCoordinatesTo(FXint& tox,FXint& toy,const FXWindow* towindow,FXint fromx,FXint fromy) const { if(towindow==NULL){ fxerror("%s::translateCoordinatesTo: to-window is NULL.\n",getClassName()); } if(xid && towindow->id()){ #ifndef WIN32 Window tmp; XTranslateCoordinates(DISPLAY(getApp()),xid,towindow->id(),fromx,fromy,&tox,&toy,&tmp); #else POINT pt; pt.x=fromx; pt.y=fromy; ClientToScreen((HWND)xid,&pt); ScreenToClient((HWND)towindow->id(),&pt); tox=pt.x; toy=pt.y; #endif } } /*******************************************************************************/ // Acquire grab; also switches to the drag cursor void FXWindow::grab(){ if(xid){ FXTRACE((150,"%s::grab %p\n",getClassName(),this)); if(dragCursor->id()==0){ fxerror("%s::grab: Cursor has not been created yet.\n",getClassName()); } if(!(flags&FLAG_SHOWN)){ fxwarning("%s::grab: Window is not visible.\n",getClassName()); } #ifndef WIN32 if(GrabSuccess!=XGrabPointer(DISPLAY(getApp()),xid,FALSE,GRAB_EVENT_MASK,GrabModeAsync,GrabModeAsync,None,dragCursor->id(),getApp()->event.time)){ XGrabPointer(DISPLAY(getApp()),xid,FALSE,GRAB_EVENT_MASK,GrabModeAsync,GrabModeAsync,None,dragCursor->id(),CurrentTime); } #else SetCapture((HWND)xid); if(GetCapture()!=(HWND)xid){ SetCapture((HWND)xid); } SetCursor((HCURSOR)dragCursor->id()); #endif getApp()->mouseGrabWindow=this; } } // Release grab; also switches back to the normal cursor void FXWindow::ungrab(){ if(xid){ FXTRACE((150,"%s::ungrab %p\n",getClassName(),this)); getApp()->mouseGrabWindow=NULL; #ifndef WIN32 XUngrabPointer(DISPLAY(getApp()),getApp()->event.time); XFlush(DISPLAY(getApp())); #else ReleaseCapture(); SetCursor((HCURSOR)defaultCursor->id()); #endif } } // Return true if active grab is in effect bool FXWindow::grabbed() const { return getApp()->mouseGrabWindow==this; } // Grab keyboard device; note grabbing keyboard generates // SEL_FOCUSIN on the grab-window and SEL_FOCUSOUT on the old // focus-window void FXWindow::grabKeyboard(){ if(xid){ FXTRACE((150,"%s::grabKeyboard %p\n",getClassName(),this)); if(!(flags&FLAG_SHOWN)){ fxwarning("%s::ungrabKeyboard: Window is not visible.\n",getClassName()); } #ifndef WIN32 XGrabKeyboard(DISPLAY(getApp()),xid,FALSE,GrabModeAsync,GrabModeAsync,getApp()->event.time); #else SetActiveWindow((HWND)xid); // FIXME Check this #endif getApp()->keyboardGrabWindow=this; } } // Ungrab keyboard device; note ungrabbing keyboard generates // SEL_FOCUSOUT on the grab-window and SEL_FOCUSIN on the // current focus-window void FXWindow::ungrabKeyboard(){ if(xid){ FXTRACE((150,"%s::ungrabKeyboard %p\n",getClassName(),this)); getApp()->keyboardGrabWindow=NULL; #ifndef WIN32 XUngrabKeyboard(DISPLAY(getApp()),getApp()->event.time); #else #endif } } // Return true if active grab is in effect bool FXWindow::grabbedKeyboard() const { return getApp()->keyboardGrabWindow==this; } // The widget lost the grab for some reason [Windows]. // Subclasses should try to clean up the mess... long FXWindow::onUngrabbed(FXObject*,FXSelector,void* ptr){ FXTRACE((150,"%s::onUngrabbed\n",getClassName())); if(target) target->tryHandle(this,FXSEL(SEL_UNGRABBED,message),ptr); //#ifdef WIN32 // SetCursor((HCURSOR)defaultCursor->id()); // FIXME Maybe should be done with WM_SETCURSOR? //#endif return 1; } /*******************************************************************************/ // Translate message const FXchar* FXWindow::tr(const FXchar* message,const FXchar* hint) const { FXTranslator *translator=getApp()->getTranslator(); if(translator){ return translator->tr(getClassName(),message,hint); } return message; } /*******************************************************************************/ // Enable widget as drop target void FXWindow::dropEnable(){ flags|=FLAG_DROPTARGET; } // Disable widget as drop target void FXWindow::dropDisable(){ flags&=~FLAG_DROPTARGET; } // Is window drop enabled bool FXWindow::isDropEnabled() const { return (flags&FLAG_DROPTARGET)!=0; } // Set drag rectangle to block events while inside void FXWindow::setDragRectangle(FXint x,FXint y,FXint w,FXint h,bool wantupdates) const { if(xid==0){ fxerror("%s::setDragRectangle: window has not yet been created.\n",getClassName()); } #ifndef WIN32 Window tmp; int tox,toy; XTranslateCoordinates(DISPLAY(getApp()),xid,XDefaultRootWindow(DISPLAY(getApp())),x,y,&tox,&toy,&tmp); getApp()->xdndRect.x=tox; getApp()->xdndRect.y=toy; getApp()->xdndWantUpdates=wantupdates; #else POINT pt; pt.x=x; pt.y=y; ClientToScreen((HWND)parent->id(),&pt); getApp()->xdndRect.x=(short)pt.x; getApp()->xdndRect.y=(short)pt.y; #endif getApp()->xdndRect.w=w; getApp()->xdndRect.h=h; } // Clear drag rectangle void FXWindow::clearDragRectangle() const { if(xid==0){ fxerror("%s::clearDragRectangle: window has not yet been created.\n",getClassName()); } getApp()->xdndRect.x=0; getApp()->xdndRect.y=0; getApp()->xdndRect.w=0; getApp()->xdndRect.h=0; #ifndef WIN32 getApp()->xdndWantUpdates=TRUE; // Isn't this bullshit? #endif } // Get dropped data; called in response to DND enter or DND drop bool FXWindow::getDNDData(FXDNDOrigin origin,FXDragType targettype,FXuchar*& data,FXuint& size) const { if(xid==0){ fxerror("%s::getDNDData: window has not yet been created.\n",getClassName()); } switch(origin){ case FROM_DRAGNDROP: getApp()->dragdropGetData(this,targettype,data,size); break; case FROM_CLIPBOARD: getApp()->clipboardGetData(this,targettype,data,size); break; case FROM_SELECTION: getApp()->selectionGetData(this,targettype,data,size); break; } return data!=NULL; } // Get dropped string; called in response to DND enter or DND drop bool FXWindow::getDNDData(FXDNDOrigin origin,FXDragType targettype,FXString& string) const { FXuchar *data; FXuint size; string=FXString::null; if(getDNDData(origin,targettype,data,size)){ string.assign((FXchar*)data,size); FXFREE(&data); return true; } return false; } // Set drop data; data array will be deleted by the system automatically! bool FXWindow::setDNDData(FXDNDOrigin origin,FXDragType targettype,FXuchar* data,FXuint size) const { if(xid==0){ fxerror("%s::setDNDData: window has not yet been created.\n",getClassName()); } switch(origin){ case FROM_DRAGNDROP: getApp()->dragdropSetData(this,targettype,data,size); break; case FROM_CLIPBOARD: getApp()->clipboardSetData(this,targettype,data,size); break; case FROM_SELECTION: getApp()->selectionSetData(this,targettype,data,size); break; } return true; } // Set drop data; data array will be deleted by the system automatically! bool FXWindow::setDNDData(FXDNDOrigin origin,FXDragType targettype,const FXString& string) const { FXuchar *data; FXuint size; size=string.length(); if(FXCALLOC(&data,FXuchar,size+2)){ memcpy(data,string.text(),size); #ifndef WIN32 setDNDData(origin,targettype,data,size); #else setDNDData(origin,targettype,data,size+2); #endif return true; } return false; } // Inquire about types being dragged or available on the clipboard or selection bool FXWindow::inquireDNDTypes(FXDNDOrigin origin,FXDragType*& types,FXuint& numtypes) const { if(xid==0){ fxerror("%s::inquireDNDTypes: window has not yet been created.\n",getClassName()); } switch(origin){ case FROM_DRAGNDROP: getApp()->dragdropGetTypes(this,types,numtypes); break; case FROM_CLIPBOARD: getApp()->clipboardGetTypes(this,types,numtypes); break; case FROM_SELECTION: getApp()->selectionGetTypes(this,types,numtypes); break; } return types!=NULL; } // Is a certain type being offered via drag and drop, clipboard, or selection? bool FXWindow::offeredDNDType(FXDNDOrigin origin,FXDragType type) const { if(xid==0){ fxerror("%s::offeredDNDType: window has not yet been created.\n",getClassName()); } bool offered=false; FXDragType *types; FXuint i,ntypes; if(inquireDNDTypes(origin,types,ntypes)){ for(i=0; iansAction=DRAG_REJECT; if(action!=DRAG_REJECT){ getApp()->ansAction=getApp()->ddeAction; if(action!=DRAG_ACCEPT) getApp()->ansAction=action; } } // Sent by the drop target void FXWindow::dropFinished(FXDragAction action) const { if(!getApp()->xdndFinishSent){ #ifndef WIN32 XEvent se; se.xclient.type=ClientMessage; se.xclient.display=DISPLAY(getApp()); se.xclient.message_type=getApp()->xdndFinished; se.xclient.format=32; se.xclient.window=getApp()->xdndSource; se.xclient.data.l[0]=xid; se.xclient.data.l[1]=(action==DRAG_REJECT)?0:1; if(action==DRAG_ACCEPT) action=getApp()->ansAction; if(action==DRAG_COPY) se.xclient.data.l[2]=getApp()->xdndActionCopy; else if(action==DRAG_MOVE) se.xclient.data.l[2]=getApp()->xdndActionMove; else if(action==DRAG_LINK) se.xclient.data.l[2]=getApp()->xdndActionLink; else if(action==DRAG_PRIVATE) se.xclient.data.l[2]=getApp()->xdndActionPrivate; else se.xclient.data.l[2]=None; se.xclient.data.l[3]=0; se.xclient.data.l[4]=0; XSendEvent(DISPLAY(getApp()),getApp()->xdndSource,True,NoEventMask,&se); XFlush(DISPLAY(getApp())); #else if(action==DRAG_ACCEPT) action=getApp()->ansAction; PostMessage((HWND)getApp()->xdndSource,WM_DND_FINISH_REJECT+action,0,(LPARAM)xid); #endif getApp()->xdndFinishSent=TRUE; } } // Target wants to know drag action of source FXDragAction FXWindow::inquireDNDAction() const { return getApp()->ddeAction; } // Source wants to find out if target accepted FXDragAction FXWindow::didAccept() const { return getApp()->ansAction; } // True if we're in a drag operation bool FXWindow::isDragging() const { return (getApp()->dragWindow==this); } // True if this window is drop target bool FXWindow::isDropTarget() const { return (getApp()->dropWindow==this); } // Start a drag on the types mentioned bool FXWindow::beginDrag(const FXDragType *types,FXuint numtypes){ if(xid==0){ fxerror("%s::beginDrag: window has not yet been created.\n",getClassName()); } if(!isDragging()){ if(types==NULL || numtypes<1){ fxerror("%s::beginDrag: should have at least one type to drag.\n",getClassName()); } #ifndef WIN32 XSetSelectionOwner(DISPLAY(getApp()),getApp()->xdndSelection,xid,getApp()->event.time); if(XGetSelectionOwner(DISPLAY(getApp()),getApp()->xdndSelection)!=xid){ fxwarning("%s::beginDrag: failed to acquire DND selection.\n",getClassName()); return FALSE; } FXRESIZE(&getApp()->xdndTypeList,FXDragType,numtypes); memcpy(getApp()->xdndTypeList,types,sizeof(FXDragType)*numtypes); getApp()->xdndNumTypes=numtypes; XChangeProperty(DISPLAY(getApp()),xid,getApp()->xdndTypes,XA_ATOM,32,PropModeReplace,(unsigned char*)getApp()->xdndTypeList,getApp()->xdndNumTypes); getApp()->xdndTarget=0; getApp()->xdndProxyTarget=0; getApp()->ansAction=DRAG_REJECT; getApp()->xdndStatusPending=FALSE; getApp()->xdndStatusReceived=FALSE; getApp()->xdndWantUpdates=TRUE; getApp()->xdndRect.x=0; getApp()->xdndRect.y=0; getApp()->xdndRect.w=0; getApp()->xdndRect.h=0; #else getApp()->xdndTypes=CreateFileMappingA(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,(numtypes+1)*sizeof(FXDragType),"XdndTypeList"); if(getApp()->xdndTypes){ FXDragType *dragtypes=(FXDragType*)MapViewOfFile(getApp()->xdndTypes,FILE_MAP_WRITE,0,0,0); if(dragtypes){ dragtypes[0]=numtypes; memcpy(&dragtypes[1],types,numtypes*sizeof(FXDragType)); UnmapViewOfFile(dragtypes); } } getApp()->xdndTarget=0; getApp()->ansAction=DRAG_REJECT; getApp()->xdndStatusPending=FALSE; getApp()->xdndStatusReceived=FALSE; getApp()->xdndRect.x=0; getApp()->xdndRect.y=0; getApp()->xdndRect.w=0; getApp()->xdndRect.h=0; #endif getApp()->dragWindow=this; return true; } return false; } // Drag to new position bool FXWindow::handleDrag(FXint x,FXint y,FXDragAction action){ if(xid==0){ fxerror("%s::handleDrag: window has not yet been created.\n",getClassName()); } if(actionxdndProxy,0,1,False,AnyPropertyType,&typ,&fmt,&ni,&ba,(unsigned char**)&ptr1)==Success){ if(typ==XA_WINDOW && fmt==32 && ni>0){ if(XGetWindowProperty(DISPLAY(getApp()),ptr1[0],getApp()->xdndProxy,0,1,False,AnyPropertyType,&typ,&fmt,&ni,&ba,(unsigned char**)&ptr2)==Success){ if(typ==XA_WINDOW && fmt==32 && ni>0 && ptr2[0] == ptr1[0]){ proxywin=ptr1[0]; } XFree(ptr2); } } XFree(ptr1); } if(XGetWindowProperty(DISPLAY(getApp()),proxywin,getApp()->xdndAware,0,1,False,AnyPropertyType,&typ,&fmt,&ni,&ba,(unsigned char**)&ptr3)==Success){ if(typ==XA_ATOM && fmt==32 && ni>0 && ptr3[0]>=3){ window=win; proxywindow=proxywin; version=FXMIN(ptr3[0],XDND_PROTOCOL_VERSION); if(window!=root){XFree(ptr3);break;} } XFree(ptr3); } if(child==None) break; win=child; } // Changed windows if(window!=getApp()->xdndTarget){ // Moving OUT of XDND aware window? if(getApp()->xdndTarget!=0){ se.xclient.type=ClientMessage; se.xclient.display=DISPLAY(getApp()); se.xclient.message_type=getApp()->xdndLeave; se.xclient.format=32; se.xclient.window=getApp()->xdndTarget; se.xclient.data.l[0]=xid; se.xclient.data.l[1]=0; se.xclient.data.l[2]=0; se.xclient.data.l[3]=0; se.xclient.data.l[4]=0; XSendEvent(DISPLAY(getApp()),getApp()->xdndProxyTarget,True,NoEventMask,&se); } // Reset XDND variables getApp()->xdndTarget=window; getApp()->xdndProxyTarget=proxywindow; getApp()->ansAction=DRAG_REJECT; getApp()->xdndStatusPending=FALSE; getApp()->xdndStatusReceived=FALSE; getApp()->xdndWantUpdates=TRUE; getApp()->xdndRect.x=x; getApp()->xdndRect.y=y; getApp()->xdndRect.w=1; getApp()->xdndRect.h=1; // Moving INTO XDND aware window? if(getApp()->xdndTarget!=0){ se.xclient.type=ClientMessage; se.xclient.display=DISPLAY(getApp()); se.xclient.message_type=getApp()->xdndEnter; se.xclient.format=32; se.xclient.window=getApp()->xdndTarget; se.xclient.data.l[0]=xid; se.xclient.data.l[1]=version<<24; se.xclient.data.l[2]=getApp()->xdndNumTypes>=1 ? getApp()->xdndTypeList[0] : None; se.xclient.data.l[3]=getApp()->xdndNumTypes>=2 ? getApp()->xdndTypeList[1] : None; se.xclient.data.l[4]=getApp()->xdndNumTypes>=3 ? getApp()->xdndTypeList[2] : None; if(getApp()->xdndNumTypes>3) se.xclient.data.l[1]|=1; XSendEvent(DISPLAY(getApp()),getApp()->xdndProxyTarget,True,NoEventMask,&se); forcepos=TRUE; } } // Now send a position message if(getApp()->xdndTarget!=0){ // Send position if we're outside the mouse box or ignoring it if(forcepos || getApp()->xdndRect.w==0 || getApp()->xdndRect.h==0 || getApp()->xdndWantUpdates || xxdndRect.x || yxdndRect.y || getApp()->xdndRect.x+getApp()->xdndRect.w<=x || getApp()->xdndRect.y+getApp()->xdndRect.h<=y){ // No outstanding status message, so send new pos right away if(!getApp()->xdndStatusPending){ se.xclient.type=ClientMessage; se.xclient.display=DISPLAY(getApp()); se.xclient.message_type=getApp()->xdndPosition; se.xclient.format=32; se.xclient.window=getApp()->xdndTarget; se.xclient.data.l[0]=xid; se.xclient.data.l[1]=0; se.xclient.data.l[2]=MKUINT(y,x); // Coordinates se.xclient.data.l[3]=getApp()->event.time; // Time stamp if(action==DRAG_COPY) se.xclient.data.l[4]=getApp()->xdndActionCopy; else if(action==DRAG_MOVE) se.xclient.data.l[4]=getApp()->xdndActionMove; else if(action==DRAG_LINK) se.xclient.data.l[4]=getApp()->xdndActionLink; else if(action==DRAG_PRIVATE) se.xclient.data.l[4]=getApp()->xdndActionPrivate; XSendEvent(DISPLAY(getApp()),getApp()->xdndProxyTarget,True,NoEventMask,&se); getApp()->xdndStatusPending=TRUE; // Waiting for the other app to respond } } } #else FXuval version=0; FXbool forcepos=FALSE; POINT point; HWND window; // Get drop window point.x=x; point.y=y; window=WindowFromPoint(point); // FIXME wrong for disabled windows while(window){ version=(FXuval)GetProp(window,(LPCTSTR)MAKELONG(getApp()->xdndAware,0)); if(version) break; window=GetParent(window); } // Changed windows if(window!=getApp()->xdndTarget){ // Moving OUT of XDND aware window? if(getApp()->xdndTarget!=0){ PostMessage((HWND)getApp()->xdndTarget,WM_DND_LEAVE,0,(LPARAM)xid); } // Reset XDND variables getApp()->xdndTarget=window; getApp()->ansAction=DRAG_REJECT; getApp()->xdndStatusPending=FALSE; getApp()->xdndStatusReceived=FALSE; getApp()->xdndRect.x=x; getApp()->xdndRect.y=y; getApp()->xdndRect.w=1; getApp()->xdndRect.h=1; // Moving INTO XDND aware window? if(getApp()->xdndTarget!=0){ PostMessage((HWND)getApp()->xdndTarget,WM_DND_ENTER,0,(LPARAM)xid); forcepos=TRUE; } } // Now send a position message if(getApp()->xdndTarget!=0){ // Send position if we're outside the mouse box or ignoring it if(forcepos || xxdndRect.x || yxdndRect.y || getApp()->xdndRect.x+getApp()->xdndRect.w<=x || getApp()->xdndRect.y+getApp()->xdndRect.h<=y){ // No outstanding status message, so send new pos right away if(!getApp()->xdndStatusPending){ PostMessage((HWND)getApp()->xdndTarget,WM_DND_POSITION_REJECT+action,MAKELONG(x,y),(LPARAM)xid); getApp()->xdndStatusPending=TRUE; // Waiting for the other app to respond } } } #endif return true; } return false; } #ifndef WIN32 struct XDNDMatch { Atom xdndStatus; Atom xdndPosition; Atom xdndFinished; Atom xdndDrop; Atom xdndEnter; Atom xdndLeave; }; // Scan event queue for XDND messages or selection requests static Bool matchxdnd(Display*,XEvent* event,XPointer ptr){ XDNDMatch *m=(XDNDMatch*)ptr; return event->type==SelectionRequest || (event->type==ClientMessage && (event->xclient.message_type==m->xdndStatus || event->xclient.message_type==m->xdndPosition || event->xclient.message_type==m->xdndFinished || event->xclient.message_type==m->xdndDrop || event->xclient.message_type==m->xdndEnter || event->xclient.message_type==m->xdndLeave)); } #endif // Terminate the drag; if drop flag is false, don't drop even if accepted. FXDragAction FXWindow::endDrag(bool drop){ FXDragAction action=DRAG_REJECT; if(xid==0){ fxerror("%s::endDrag: window has not yet been created.\n",getClassName()); } if(isDragging()){ #ifndef WIN32 FXbool nodrop=TRUE; XEvent se; FXuint loops; XDNDMatch match; // Fill up match struct match.xdndStatus=getApp()->xdndStatus; match.xdndPosition=getApp()->xdndPosition; match.xdndFinished=getApp()->xdndFinished; match.xdndDrop=getApp()->xdndDrop; match.xdndEnter=getApp()->xdndEnter; match.xdndLeave=getApp()->xdndLeave; // Ever received a status if(getApp()->xdndStatusReceived && drop){ // If a status message is still pending, wait for it if(getApp()->xdndStatusPending){ loops=1000; do{ FXTRACE((100,"Waiting for pending XdndStatus\n")); if(XCheckIfEvent(DISPLAY(getApp()),&se,matchxdnd,(char*)&match)){ getApp()->dispatchEvent(se); // We got the status update, finally if(se.xclient.type==ClientMessage && se.xclient.message_type==getApp()->xdndStatus){ FXTRACE((100,"Got XdndStatus\n")); getApp()->xdndStatusPending=FALSE; break; } // We got a selection request message, so there is still hope that // the target is functioning; lets give it a bit more time... if(se.xselection.type==SelectionRequest && se.xselectionrequest.selection==getApp()->xdndSelection){ FXTRACE((100,"Got SelectionRequest\n")); loops=1000; } } FXThread::sleep(10000000); } while(--loops); } // Got our status message if(!getApp()->xdndStatusPending && getApp()->ansAction!=DRAG_REJECT){ FXTRACE((100,"Sending XdndDrop\n")); se.xclient.type=ClientMessage; se.xclient.display=DISPLAY(getApp()); se.xclient.message_type=getApp()->xdndDrop; se.xclient.format=32; se.xclient.window=getApp()->xdndTarget; se.xclient.data.l[0]=xid; se.xclient.data.l[1]=0; se.xclient.data.l[2]=getApp()->event.time; se.xclient.data.l[3]=0; se.xclient.data.l[4]=0; XSendEvent(DISPLAY(getApp()),getApp()->xdndProxyTarget,True,NoEventMask,&se); // Wait until the target has processed the drop; since the // target may be us, we keep processing all XDND related messages // while we're waiting here. After some time, we assume the target // may have core dumped and we fall out of the loop..... loops=1000; do{ FXTRACE((100,"Waiting for XdndFinish\n")); if(XCheckIfEvent(DISPLAY(getApp()),&se,matchxdnd,(char*)&match)){ getApp()->dispatchEvent(se); // Got the finish message; we now know the drop has been completed and processed if(se.xclient.type==ClientMessage && se.xclient.message_type==getApp()->xdndFinished){ action=DRAG_REJECT; // Only for XDnD==5 action=DRAG_ACCEPT; // Only for XDnD<=4 if(se.xclient.data.l[1]&1){ action=DRAG_ACCEPT; if((FXID)se.xclient.data.l[2]==getApp()->xdndActionCopy) action=DRAG_COPY; else if((FXID)se.xclient.data.l[2]==getApp()->xdndActionMove) action=DRAG_MOVE; else if((FXID)se.xclient.data.l[2]==getApp()->xdndActionLink) action=DRAG_LINK; else if((FXID)se.xclient.data.l[2]==getApp()->xdndActionPrivate) action=DRAG_PRIVATE; } FXTRACE((100,"Got XdndFinish action=%u\n",action)); break; } // We got a selection request message, so there is still hope that // the target is functioning; lets give it a bit more time... if(se.xselection.type==SelectionRequest && se.xselectionrequest.selection==getApp()->xdndSelection){ FXTRACE((100,"Got SelectionRequest\n")); loops=1000; } } FXThread::sleep(10000000); } while(--loops); // We tried a drop but failed nodrop=FALSE; } } // Didn't drop, or didn't get any response, so just send a leave if(nodrop){ FXTRACE((100,"Sending XdndLeave\n")); se.xclient.type=ClientMessage; se.xclient.display=DISPLAY(getApp()); se.xclient.message_type=getApp()->xdndLeave; se.xclient.format=32; se.xclient.window=getApp()->xdndTarget; se.xclient.data.l[0]=xid; se.xclient.data.l[1]=0; se.xclient.data.l[2]=0; se.xclient.data.l[3]=0; se.xclient.data.l[4]=0; XSendEvent(DISPLAY(getApp()),getApp()->xdndProxyTarget,True,NoEventMask,&se); } // Clean up XSetSelectionOwner(DISPLAY(getApp()),getApp()->xdndSelection,None,getApp()->event.time); XDeleteProperty(DISPLAY(getApp()),xid,getApp()->xdndTypes); FXFREE(&getApp()->xdndTypeList); getApp()->xdndNumTypes=0; getApp()->xdndTarget=0; getApp()->xdndProxyTarget=0; getApp()->ansAction=DRAG_REJECT; getApp()->xdndStatusPending=FALSE; getApp()->xdndStatusReceived=FALSE; getApp()->xdndWantUpdates=TRUE; getApp()->xdndRect.x=0; getApp()->xdndRect.y=0; getApp()->xdndRect.w=0; getApp()->xdndRect.h=0; getApp()->dragWindow=NULL; #else FXbool nodrop=TRUE; FXuint loops; MSG msg; // Ever received a status if(getApp()->xdndStatusReceived && drop){ // If a status message is still pending, wait for it if(getApp()->xdndStatusPending){ loops=1000; do{ FXTRACE((100,"Waiting for XdndStatus\n")); if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){ getApp()->dispatchEvent(msg); // We got the status update, finally if(WM_DND_STATUS_REJECT<=msg.message && msg.message<=WM_DND_STATUS_PRIVATE){ FXTRACE((100,"Got XdndStatus\n")); getApp()->xdndStatusPending=FALSE; break; } // We got a selection request message, so there is still hope that // the target is functioning; lets give it a bit more time... if(msg.message==WM_DND_REQUEST){ FXTRACE((100,"Got SelectionRequest\n")); loops=1000; } } FXThread::sleep(10000000); } while(--loops); FXTRACE((100,"Waiting for pending XdndStatus\n")); getApp()->xdndStatusPending=FALSE; } // Got our status message if(!getApp()->xdndStatusPending && getApp()->ansAction!=DRAG_REJECT){ FXTRACE((100,"Sending XdndDrop\n")); PostMessage((HWND)getApp()->xdndTarget,WM_DND_DROP,0,(LPARAM)xid); // Wait until the target has processed the drop; since the // target may be us, we keep processing all XDND related messages // while we're waiting here. After some time, we assume the target // may have core dumped and we fall out of the loop..... loops=1000; do{ FXTRACE((100,"Waiting for XdndFinish\n")); if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){ getApp()->dispatchEvent(msg); // Got the finish message; we now know which action was taken if(WM_DND_FINISH_REJECT<=msg.message && msg.message<=WM_DND_FINISH_PRIVATE){ action=(FXDragAction)(msg.message-WM_DND_FINISH_REJECT); FXTRACE((100,"Got XdndFinish action=%d\n",action)); break; } // We got a selection request message, so there is still hope that // the target is functioning; lets give it a bit more time... if(msg.message==WM_DND_REQUEST){ FXTRACE((100,"Got SelectionRequest\n")); loops=1000; } } FXThread::sleep(10000000); } while(--loops); // We tried a drop nodrop=FALSE; } } // Didn't drop, or didn't get any response, so just send a leave if(nodrop){ FXTRACE((100,"Sending XdndLeave\n")); PostMessage((HWND)getApp()->xdndTarget,WM_DND_LEAVE,0,(LPARAM)xid); } // Get rid of the shared memory block containing the types list if(getApp()->xdndTypes) CloseHandle(getApp()->xdndTypes); getApp()->xdndTypes=NULL; // Clean up getApp()->xdndTarget=0; getApp()->ansAction=DRAG_REJECT; getApp()->xdndStatusPending=FALSE; getApp()->xdndStatusReceived=FALSE; getApp()->xdndRect.x=0; getApp()->xdndRect.y=0; getApp()->xdndRect.w=0; getApp()->xdndRect.h=0; getApp()->dragWindow=NULL; #endif } return action; } /*******************************************************************************/ // Delete window FXWindow::~FXWindow(){ FXTRACE((100,"FXWindow::~FXWindow %p\n",this)); getApp()->windowCount--; destroy(); delete accelTable; delete composeContext; if(prev) prev->next=next; else if(parent) parent->first=next; if(next) next->prev=prev; else if(parent) parent->last=prev; if(parent && parent->focus==this) parent->changeFocus(NULL); if(getApp()->activeWindow==this) getApp()->activeWindow=NULL; if(getApp()->cursorWindow==this) getApp()->cursorWindow=parent; if(getApp()->mouseGrabWindow==this) getApp()->mouseGrabWindow=NULL; if(getApp()->keyboardGrabWindow==this) getApp()->keyboardGrabWindow=NULL; if(getApp()->keyWindow==this) getApp()->keyWindow=NULL; if(getApp()->selectionWindow==this) getApp()->selectionWindow=NULL; if(getApp()->clipboardWindow==this) getApp()->clipboardWindow=NULL; if(getApp()->dragWindow==this) getApp()->dragWindow=NULL; if(getApp()->dropWindow==this) getApp()->dropWindow=NULL; if(getApp()->refresherstop==this) getApp()->refresherstop=parent; if(getApp()->refresher==this) getApp()->refresher=parent; if(parent) parent->recalc(); parent=(FXWindow*)-1L; owner=(FXWindow*)-1L; first=last=(FXWindow*)-1L; next=prev=(FXWindow*)-1L; focus=(FXWindow*)-1L; composeContext=(FXComposeContext*)-1L; defaultCursor=(FXCursor*)-1L; dragCursor=(FXCursor*)-1L; accelTable=(FXAccelTable*)-1L; target=(FXObject*)-1L; } } fox1.6-1.6.57/src/FXWizard.cpp000066400000000000000000000174431326741342000156370ustar00rootroot00000000000000/******************************************************************************** * * * W i z a r d W i d g e t * * * ********************************************************************************* * Copyright (C) 2002,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXWizard.cpp,v 1.19 2006/01/22 17:58:52 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "fxkeys.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXImage.h" #include "FXIcon.h" #include "FXGIFIcon.h" #include "FXWindow.h" #include "FXFrame.h" #include "FXImageFrame.h" #include "FXSeparator.h" #include "FXLabel.h" #include "FXButton.h" #include "FXPacker.h" #include "FXVerticalFrame.h" #include "FXHorizontalFrame.h" #include "FXSwitcher.h" #include "FXWizard.h" #include "icons.h" /* Notes: - It may be nice to be able to sensitize/desensitize the "Next" button based on having whether the necessary info has been entered into a pane. - Need callbacks to tell target whether FXWizard has switched panes. - Need to allow for choices in successor panes. */ // Padding for buttons #define HORZ_PAD 12 #define VERT_PAD 2 using namespace FX; /*******************************************************************************/ namespace FX { // Map FXDEFMAP(FXWizard) FXWizardMap[]={ FXMAPFUNC(SEL_COMMAND,FXWizard::ID_NEXT,FXWizard::onCmdNext), FXMAPFUNC(SEL_UPDATE,FXWizard::ID_NEXT,FXWizard::onUpdNext), FXMAPFUNC(SEL_COMMAND,FXWizard::ID_BACK,FXWizard::onCmdBack), FXMAPFUNC(SEL_UPDATE,FXWizard::ID_BACK,FXWizard::onUpdBack), FXMAPFUNC(SEL_UPDATE,FXWizard::ID_ACCEPT,FXWizard::onUpdFinish), }; // Object implementation FXIMPLEMENT(FXWizard,FXDialogBox,FXWizardMap,ARRAYNUMBER(FXWizardMap)) // Construct free-floating Wizard FXWizard::FXWizard(FXApp* a,const FXString& name,FXImage *image,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXDialogBox(a,name,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ construct(); setImage(image); } // Construct Wizard which will always float over the owner window FXWizard::FXWizard(FXWindow* owner,const FXString& name,FXImage *image,FXuint opts,FXint x,FXint y,FXint w,FXint h,FXint pl,FXint pr,FXint pt,FXint pb,FXint hs,FXint vs): FXDialogBox(owner,name,opts,x,y,w,h,pl,pr,pt,pb,hs,vs){ construct(); setImage(image); } // Common part of constructor void FXWizard::construct(){ nexticon=new FXGIFIcon(getApp(),arrownext); backicon=new FXGIFIcon(getApp(),arrowprev); finishicon=new FXGIFIcon(getApp(),entericon); buttons=new FXHorizontalFrame(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT,0,0,0,0,0,0,0,0); finish=new FXButton(buttons,tr("&Finish"),finishicon,this,ID_ACCEPT,ICON_AFTER_TEXT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); advance=new FXButton(buttons,tr("&Next"),nexticon,this,ID_NEXT,BUTTON_INITIAL|BUTTON_DEFAULT|ICON_AFTER_TEXT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); retreat=new FXButton(buttons,tr("&Back"),backicon,this,ID_BACK,ICON_BEFORE_TEXT|FRAME_RAISED|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD+10,HORZ_PAD+10,VERT_PAD,VERT_PAD); new FXFrame(buttons,LAYOUT_FIX_WIDTH|LAYOUT_RIGHT,0,0,10,0); cancel=new FXButton(buttons,tr("&Cancel"),NULL,this,ID_CANCEL,BUTTON_DEFAULT|FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_Y|LAYOUT_RIGHT,0,0,0,0,HORZ_PAD,HORZ_PAD,VERT_PAD,VERT_PAD); new FXHorizontalSeparator(this,SEPARATOR_GROOVE|LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X); sidebar=new FXImageFrame(this,NULL,FRAME_GROOVE|LAYOUT_SIDE_LEFT|LAYOUT_CENTER_Y); panels=new FXSwitcher(this,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0); finish->hide(); } // Update finish panel long FXWizard::onUpdFinish(FXObject* sender,FXSelector,void*){ sender->handle(this,(getCurrentPanel()handle(this,(getCurrentPanel()handle(this,(0numChildren(); } // Bring the child window at index to the top void FXWizard::setCurrentPanel(FXint index){ panels->setCurrent(index); } // Return the index of the child window currently on top FXint FXWizard::getCurrentPanel() const { return panels->getCurrent(); } // Change the image being displayed void FXWizard::setImage(FXImage* img){ sidebar->setImage(img); } // Return the current image FXImage* FXWizard::getImage() const { return sidebar->getImage(); } // Save object to stream void FXWizard::save(FXStream& store) const { FXDialogBox::save(store); store << buttons; store << sidebar; store << advance; store << retreat; store << finish; store << cancel; store << panels; store << finishicon; store << nexticon; store << backicon; } // Load object from stream void FXWizard::load(FXStream& store){ FXDialogBox::load(store); store >> buttons; store >> sidebar; store >> advance; store >> retreat; store >> finish; store >> cancel; store >> panels; store >> finishicon; store >> nexticon; store >> backicon; } // Destroy FXWizard::~FXWizard(){ delete finishicon; delete nexticon; delete backicon; buttons=(FXHorizontalFrame*)-1L; sidebar=(FXImageFrame*)-1L; advance=(FXButton*)-1L; retreat=(FXButton*)-1L; cancel=(FXButton*)-1L; finishicon=(FXIcon*)-1L; nexticon=(FXIcon*)-1L; backicon=(FXIcon*)-1L; } } fox1.6-1.6.57/src/FXXBMIcon.cpp000066400000000000000000000066411326741342000156340ustar00rootroot00000000000000/******************************************************************************** * * * X B M I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXXBMIcon.cpp,v 1.16 2006/01/22 17:58:52 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXObject.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXIcon.h" #include "FXXBMIcon.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXXBMIcon::fileExt[]="xbm"; // Suggested mime type const FXchar FXXBMIcon::mimeType[]="image/xbm"; // Object implementation FXIMPLEMENT(FXXBMIcon,FXIcon,NULL,0) // Initialize nicely FXXBMIcon::FXXBMIcon(FXApp* a,const FXuchar *pixels,const FXuchar *mask,FXColor clr,FXuint opts,FXint w,FXint h):FXIcon(a,NULL,clr,opts,w,h){ if(pixels && mask){ fxloadXBM(data,pixels,mask,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); options|=IMAGE_OWNED; } } // Save object to stream bool FXXBMIcon::savePixels(FXStream& store) const { if(fxsaveXBM(store,data,width,height,-1,-1)){ return true; } return false; } // Load object from stream bool FXXBMIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h,hotx,hoty; if(fxloadXBM(store,pixels,w,h,hotx,hoty)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXXBMIcon::~FXXBMIcon(){ } } fox1.6-1.6.57/src/FXXBMImage.cpp000066400000000000000000000063731326741342000157700ustar00rootroot00000000000000/******************************************************************************** * * * X B M I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2003,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXXBMImage.cpp,v 1.16 2006/01/22 17:58:52 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXSettings.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXId.h" #include "FXDrawable.h" #include "FXImage.h" #include "FXXBMImage.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXXBMImage::fileExt[]="xbm"; // Suggested mime type const FXchar FXXBMImage::mimeType[]="image/xbm"; // Object implementation FXIMPLEMENT(FXXBMImage,FXImage,NULL,0) // Initialize FXXBMImage::FXXBMImage(FXApp* a,const FXuchar *pixels,const FXuchar *mask,FXuint opts,FXint w,FXint h):FXImage(a,NULL,opts,w,h){ if(pixels && mask){ fxloadXBM(data,pixels,mask,w,h); options|=IMAGE_OWNED; } } // Save pixel data only bool FXXBMImage::savePixels(FXStream& store) const { if(fxsaveXBM(store,data,width,height,-1,-1)){ return true; } return false; } // Load pixel data only bool FXXBMImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h,hotx,hoty; if(fxloadXBM(store,pixels,w,h,hotx,hoty)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXXBMImage::~FXXBMImage(){ } } fox1.6-1.6.57/src/FXXPMIcon.cpp000066400000000000000000000063451326741342000156530ustar00rootroot00000000000000/******************************************************************************** * * * X P M I c o n O b j e c t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXXPMIcon.cpp,v 1.33 2006/01/22 17:58:52 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXXPMIcon.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXXPMIcon::fileExt[]="xpm"; // Suggested mime type const FXchar FXXPMIcon::mimeType[]="image/xpm"; // Object implementation FXIMPLEMENT(FXXPMIcon,FXIcon,NULL,0) // Initialize nicely FXXPMIcon::FXXPMIcon(FXApp* a,const FXchar **pix,FXColor clr,FXuint opts,FXint w,FXint h):FXIcon(a,NULL,clr,opts,w,h){ if(pix){ fxloadXPM(pix,data,width,height); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); options|=IMAGE_OWNED; } } // Save object to stream bool FXXPMIcon::savePixels(FXStream& store) const { if(fxsaveXPM(store,data,width,height)){ return true; } return false; } // Load object from stream bool FXXPMIcon::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadXPM(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); if(options&IMAGE_ALPHAGUESS) transp=guesstransp(); return true; } return false; } // Clean up FXXPMIcon::~FXXPMIcon(){ } } fox1.6-1.6.57/src/FXXPMImage.cpp000066400000000000000000000061521326741342000160010ustar00rootroot00000000000000/******************************************************************************** * * * X P M I m a g e O b j e c t * * * ********************************************************************************* * Copyright (C) 2000,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: FXXPMImage.cpp,v 1.33 2006/01/22 17:58:52 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXThread.h" #include "FXStream.h" #include "FXMemoryStream.h" #include "FXString.h" #include "FXSize.h" #include "FXPoint.h" #include "FXRectangle.h" #include "FXRegistry.h" #include "FXApp.h" #include "FXXPMImage.h" /* Notes: */ using namespace FX; /*******************************************************************************/ namespace FX { // Suggested file extension const FXchar FXXPMImage::fileExt[]="xpm"; // Suggested mime type const FXchar FXXPMImage::mimeType[]="image/xpm"; // Object implementation FXIMPLEMENT(FXXPMImage,FXImage,NULL,0) // Initialize FXXPMImage::FXXPMImage(FXApp* a,const FXchar **pix,FXuint opts,FXint w,FXint h):FXImage(a,NULL,opts,w,h){ if(pix){ fxloadXPM(pix,data,width,height); options|=IMAGE_OWNED; } } // Save pixel data only bool FXXPMImage::savePixels(FXStream& store) const { if(fxsaveXPM(store,data,width,height)){ return true; } return false; } // Load pixel data only bool FXXPMImage::loadPixels(FXStream& store){ FXColor *pixels; FXint w,h; if(fxloadXPM(store,pixels,w,h)){ setData(pixels,IMAGE_OWNED,w,h); return true; } return false; } // Clean up FXXPMImage::~FXXPMImage(){ } } fox1.6-1.6.57/src/Makefile.am000066400000000000000000000173461326741342000154730ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp lib_LTLIBRARIES = libFOX-1.6.la libFOX_1_6_la_LIBADD = $(X_LIBS) $(X_BASE_LIBS) $(X_EXTRA_LIBS) $(GL_LIBS) libFOX_1_6_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ -export-dynamic \ -no-undefined CURSORS = \ crosshair.xbm \ crosshair_mask.xbm \ dndcopy.xbm \ dndcopy_mask.xbm \ dndlink.xbm \ dndlink_mask.xbm \ dndmove.xbm \ dndmove_mask.xbm \ dontdrop.xbm \ dontdrop_mask.xbm \ drag.xbm \ drag_mask.xbm \ gray.xbm \ hand.xbm \ hand_mask.xbm \ helparrow.xbm \ helparrow_mask.xbm \ hsplit.xbm \ hsplit_mask.xbm \ move.xbm \ move_mask.xbm \ ne.xbm \ ne_mask.xbm \ se.xbm \ se_mask.xbm \ sw.xbm \ sw_mask.xbm \ nw.xbm \ nw_mask.xbm \ resizeleft.xbm \ resizeleft_mask.xbm \ resizetop.xbm \ resizetop_mask.xbm \ resizetopleft.xbm \ resizetopleft_mask.xbm \ resizetopright.xbm \ resizetopright_mask.xbm \ rotate.xbm \ rotate_mask.xbm \ swatch.xbm \ swatch_mask.xbm \ vsplit.xbm \ vsplit_mask.xbm \ xsplit.xbm \ xsplit_mask.xbm ICONS = \ arrownext.gif \ arrowprev.gif \ bigapp.gif \ bigcdrom.gif \ bigcomputer.gif \ bigdesktop.gif \ bigdoc.gif \ bigfloppy.gif \ bigfolder.gif \ bigfolderopen.gif \ bignetdrive.gif \ bignethood.gif \ bookset.gif \ bookclr.gif \ cmymode.gif \ dialmode.gif \ dirupicon.gif \ deleteicon.gif \ docktop.gif \ dockbottom.gif \ dockleft.gif \ dockright.gif \ dockfree.gif \ dockflip.gif \ entericon.gif \ erroricon.gif \ eyedrop.gif \ filecopy.gif \ filemove.gif \ filehidden.gif \ filelink.gif \ filerename.gif \ filedelete.gif \ fileshown.gif \ foldernew.gif \ gotohome.gif \ gotoicon.gif \ gotowork.gif \ hsvmode.gif \ infoicon.gif \ landscape.gif \ listmode.gif \ miniapp.gif \ minicdrom.gif \ minicomputer.gif \ minidesktop.gif \ minidoc.gif \ minifloppy.gif \ minifolder.gif \ minifolderopen.gif \ miniharddisk.gif \ mininetdrive.gif \ mininethood.gif \ minizipdrive.gif \ portrait.gif \ questionicon.gif \ rgbmode.gif \ searchicon.gif \ showbigicons.gif \ showdetails.gif \ showsmallicons.gif \ warningicon.gif \ winclose.gif \ winmaximize.gif \ winminimize.gif \ winrestore.gif CODECS = \ FX88591Codec.cpp \ FX88592Codec.cpp \ FX88593Codec.cpp \ FX88594Codec.cpp \ FX88595Codec.cpp \ FX88596Codec.cpp \ FX88597Codec.cpp \ FX88598Codec.cpp \ FX88599Codec.cpp \ FX885910Codec.cpp \ FX885911Codec.cpp \ FX885913Codec.cpp \ FX885914Codec.cpp \ FX885915Codec.cpp \ FX885916Codec.cpp \ FXCP437Codec.cpp \ FXCP850Codec.cpp \ FXCP852Codec.cpp \ FXCP855Codec.cpp \ FXCP856Codec.cpp \ FXCP857Codec.cpp \ FXCP860Codec.cpp \ FXCP861Codec.cpp \ FXCP862Codec.cpp \ FXCP863Codec.cpp \ FXCP864Codec.cpp \ FXCP865Codec.cpp \ FXCP866Codec.cpp \ FXCP869Codec.cpp \ FXCP874Codec.cpp \ FXCP1250Codec.cpp \ FXCP1251Codec.cpp \ FXCP1252Codec.cpp \ FXCP1253Codec.cpp \ FXCP1254Codec.cpp \ FXCP1255Codec.cpp \ FXCP1256Codec.cpp \ FXCP1257Codec.cpp \ FXCP1258Codec.cpp \ FXKOI8RCodec.cpp \ FXUTF8Codec.cpp \ FXUTF16Codec.cpp \ FXUTF32Codec.cpp libFOX_1_6_la_SOURCES = \ $(CODECS) \ FX4Splitter.cpp \ FX7Segment.cpp \ FXAccelTable.cpp \ FXApp.cpp \ FXArrowButton.cpp \ FXBMPIcon.cpp \ FXBMPImage.cpp \ FXBitmap.cpp \ FXBitmapFrame.cpp \ FXBitmapView.cpp \ FXButton.cpp \ FXBZFileStream.cpp \ FXCURCursor.cpp \ FXCanvas.cpp \ FXCheckButton.cpp \ FXChoiceBox.cpp \ FXColorBar.cpp \ FXColorDialog.cpp \ FXColorList.cpp \ FXColorNames.cpp \ FXColorRing.cpp \ FXColorSelector.cpp \ FXColorWell.cpp \ FXColorWheel.cpp \ FXComboBox.cpp \ FXComposeContext.cpp \ FXComposite.cpp \ FXCursor.cpp \ FXDataTarget.cpp \ FXDate.cpp \ FXDC.cpp \ FXDCPrint.cpp \ FXDCWindow.cpp \ FXDLL.cpp \ FXDebugTarget.cpp \ FXDelegator.cpp \ FXDial.cpp \ FXDialogBox.cpp \ FXDict.cpp \ FXDir.cpp \ FXDirBox.cpp \ FXDirDialog.cpp \ FXDirList.cpp \ FXDirSelector.cpp \ FXDockBar.cpp \ FXDockSite.cpp \ FXDockHandler.cpp \ FXDockTitle.cpp \ FXDocument.cpp \ FXDragCorner.cpp \ FXDrawable.cpp \ FXDriveBox.cpp \ FXException.cpp \ FXExpression.cpp \ FXExtentd.cpp \ FXExtentf.cpp \ FXFile.cpp \ FXFileDialog.cpp \ FXFileDict.cpp \ FXFileList.cpp \ FXFileSelector.cpp \ FXFileStream.cpp \ FXFoldingList.cpp \ FXFont.cpp \ FXFontDialog.cpp \ FXFontSelector.cpp \ FXFrame.cpp \ FXGIFCursor.cpp \ FXGIFIcon.cpp \ FXGIFImage.cpp \ FXGLCanvas.cpp \ FXGLCone.cpp \ FXGLContext.cpp \ FXGLCube.cpp \ FXGLCylinder.cpp \ FXGLObject.cpp \ FXGLShape.cpp \ FXGLSphere.cpp \ FXGLTriangleMesh.cpp \ FXGLViewer.cpp \ FXGLVisual.cpp \ FXGradientBar.cpp \ FXGroupBox.cpp \ FXGUISignal.cpp \ FXGZFileStream.cpp \ FXHash.cpp \ FXHeader.cpp \ FXHorizontalFrame.cpp \ FXICOIcon.cpp \ FXICOImage.cpp \ FXIFFIcon.cpp \ FXIFFImage.cpp \ FXIcon.cpp \ FXIconDict.cpp \ FXIconList.cpp \ FXIconSource.cpp \ FXId.cpp \ FXImage.cpp \ FXImageFrame.cpp \ FXImageView.cpp \ FXInputDialog.cpp \ FXIO.cpp \ FXJPGIcon.cpp \ FXJPGImage.cpp \ FXKnob.cpp \ FXLabel.cpp \ FXList.cpp \ FXListBox.cpp \ FXMDIButton.cpp \ FXMDIChild.cpp \ FXMDIClient.cpp \ FXMainWindow.cpp \ FXMat3d.cpp \ FXMat4d.cpp \ FXMat3f.cpp \ FXMat4f.cpp \ FXMatrix.cpp \ FXMemMap.cpp \ FXMemoryStream.cpp \ FXMenuBar.cpp \ FXMenuButton.cpp \ FXMenuCaption.cpp \ FXMenuCascade.cpp \ FXMenuCheck.cpp \ FXMenuRadio.cpp \ FXMenuCommand.cpp \ FXMenuPane.cpp \ FXMenuSeparator.cpp \ FXMenuTitle.cpp \ FXMessageBox.cpp \ FXObject.cpp \ FXObjectList.cpp \ FXOptionMenu.cpp \ FXPCXIcon.cpp \ FXPCXImage.cpp \ FXPNGIcon.cpp \ FXPNGImage.cpp \ FXPPMIcon.cpp \ FXPPMImage.cpp \ FXPacker.cpp \ FXPath.cpp \ FXPicker.cpp \ FXPipe.cpp \ FXPopup.cpp \ FXPoint.cpp \ FXPrintDialog.cpp \ FXProgressBar.cpp \ FXProgressDialog.cpp \ FXQuatd.cpp \ FXQuatf.cpp \ FXRASIcon.cpp \ FXRASImage.cpp \ FXRGBIcon.cpp \ FXRGBImage.cpp \ FXRadioButton.cpp \ FXRangef.cpp \ FXRanged.cpp \ FXRealSlider.cpp \ FXRealSpinner.cpp \ FXRecentFiles.cpp \ FXRectangle.cpp \ FXRegion.cpp \ FXRegistry.cpp \ FXReplaceDialog.cpp \ FXRex.cpp \ FXRootWindow.cpp \ FXRuler.cpp \ FXRulerView.cpp \ FXScrollArea.cpp \ FXScrollBar.cpp \ FXScrollPane.cpp \ FXScrollWindow.cpp \ FXSearchDialog.cpp \ FXSeparator.cpp \ FXSettings.cpp \ FXShell.cpp \ FXShutter.cpp \ FXSize.cpp \ FXSlider.cpp \ FXSocket.cpp \ FXSpinner.cpp \ FXSpheref.cpp \ FXSphered.cpp \ FXSplashWindow.cpp \ FXSplitter.cpp \ FXSpring.cpp \ FXStat.cpp \ FXStatusBar.cpp \ FXStatusLine.cpp \ FXStream.cpp \ FXString.cpp \ FXStringDict.cpp \ FXSwitcher.cpp \ FXSystem.cpp \ FXTGAIcon.cpp \ FXTGAImage.cpp \ FXTIFIcon.cpp \ FXTIFImage.cpp \ FXTabBar.cpp \ FXTabBook.cpp \ FXTabItem.cpp \ FXTable.cpp \ FXText.cpp \ FXTextCodec.cpp \ FXTextField.cpp \ FXThread.cpp \ FXToggleButton.cpp \ FXToolBar.cpp \ FXToolBarGrip.cpp \ FXToolBarShell.cpp \ FXToolBarTab.cpp \ FXToolTip.cpp \ FXTopWindow.cpp \ FXTranslator.cpp \ FXTreeList.cpp \ FXTreeListBox.cpp \ FXTriStateButton.cpp \ FXUndoList.cpp \ FXURL.cpp \ FXVec2d.cpp \ FXVec2f.cpp \ FXVec3d.cpp \ FXVec3f.cpp \ FXVec4d.cpp \ FXVec4f.cpp \ FXVerticalFrame.cpp \ FXVisual.cpp \ FXWindow.cpp \ FXWizard.cpp \ FXXBMIcon.cpp \ FXXBMImage.cpp \ FXXPMIcon.cpp \ FXXPMImage.cpp \ fxascii.cpp \ fxbmpio.cpp \ fxfilematch.cpp \ fxgifio.cpp \ fxicoio.cpp \ fxiffio.cpp \ fxjpegio.cpp \ fxkeyboard.cpp \ fxkeysym.cpp \ fxparsegeometry.cpp \ fxpcxio.cpp \ fxpngio.cpp \ fxppmio.cpp \ fxpriv.cpp \ fxpsio.cpp \ fxfsquantize.cpp \ fxezquantize.cpp \ fxwuquantize.cpp \ fxrasio.cpp \ fxrgbio.cpp \ fxtargaio.cpp \ fxtifio.cpp \ fxunicode.cpp \ fxutils.cpp \ fxxbmio.cpp \ fxxpmio.cpp \ icons.cpp \ strtoll.cpp \ vsscanf.cpp \ icons.h \ jitter.h \ version.rc \ version.rc.in \ fxpriv.h \ $(CURSORS) \ $(ICONS) FXApp.cpp: icons.h icons.h: $(ICONS) $(RESWRAP) -i -n FX -o icons.h $(ICONS) icons.cpp: $(ICONS) $(RESWRAP) -e -n FX -o icons.cpp $(ICONS) EXTRA_DIST = Makefile.bc \ Makefile.bc.resp \ Makefile.dmc \ Makefile.wc \ Makefile.dmc.resp fox1.6-1.6.57/src/Makefile.bc000066400000000000000000000177051326741342000154610ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. # ############################################################################## # $Id: Makefile.bc,v 1.132.2.1 2006/08/09 01:55:08 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # Borland C++ CXX = bcc32 RM = del LIB = tlib LD = bcc32 TOPDIR = .. # Uncomment the following two lines for debug builds... #CXXFLAGS = -5 -Od -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu #DEFINES = -DFOX_BIGENDIAN=0 -D_WINDOWS -DWIN32 -DHAVE_GL_H -DHAVE_GLU_H -DHAVE_VSSCANF # Uncomment the following two lines for release builds... CXXFLAGS = -5 -O2 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu DEFINES = -DFOX_BIGENDIAN=0 -DNDEBUG -D_WINDOWS -DWIN32 -DHAVE_GL_H -DHAVE_GLU_H -DHAVE_VSSCANF #-DHAVE_PNG_H -DHAVE_JPEG_H -DHAVE_TIFF_H -DXMD_H INCDIRS = -I$(TOPDIR)/include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe .SUFFIXES: .cpp .c SOURCES = \ FX4Splitter.cpp \ FX7Segment.cpp \ FX885910Codec.cpp \ FX885911Codec.cpp \ FX885913Codec.cpp \ FX885914Codec.cpp \ FX885915Codec.cpp \ FX885916Codec.cpp \ FX88591Codec.cpp \ FX88592Codec.cpp \ FX88593Codec.cpp \ FX88594Codec.cpp \ FX88595Codec.cpp \ FX88596Codec.cpp \ FX88597Codec.cpp \ FX88598Codec.cpp \ FX88599Codec.cpp \ FXAccelTable.cpp \ FXApp.cpp \ FXArrowButton.cpp \ FXBMPIcon.cpp \ FXBMPImage.cpp \ FXBitmap.cpp \ FXBitmapFrame.cpp \ FXBitmapView.cpp \ FXButton.cpp \ FXBZFileStream.cpp \ FXCURCursor.cpp \ FXCanvas.cpp \ FXCheckButton.cpp \ FXChoiceBox.cpp \ FXColorBar.cpp \ FXColorDialog.cpp \ FXColorList.cpp \ FXColorNames.cpp \ FXColorRing.cpp \ FXColorSelector.cpp \ FXColorWell.cpp \ FXColorWheel.cpp \ FXComboBox.cpp \ FXComposeContext.cpp \ FXComposite.cpp \ FXCP1250Codec.cpp \ FXCP1251Codec.cpp \ FXCP1252Codec.cpp \ FXCP1253Codec.cpp \ FXCP1254Codec.cpp \ FXCP1255Codec.cpp \ FXCP1256Codec.cpp \ FXCP1257Codec.cpp \ FXCP1258Codec.cpp \ FXCP437Codec.cpp \ FXCP850Codec.cpp \ FXCP852Codec.cpp \ FXCP855Codec.cpp \ FXCP856Codec.cpp \ FXCP857Codec.cpp \ FXCP860Codec.cpp \ FXCP861Codec.cpp \ FXCP862Codec.cpp \ FXCP863Codec.cpp \ FXCP864Codec.cpp \ FXCP865Codec.cpp \ FXCP866Codec.cpp \ FXCP869Codec.cpp \ FXCP874Codec.cpp \ FXCursor.cpp \ FXDataTarget.cpp \ FXDate.cpp \ FXDC.cpp \ FXDCPrint.cpp \ FXDCWindow.cpp \ FXDLL.cpp \ FXDebugTarget.cpp \ FXDelegator.cpp \ FXDial.cpp \ FXDialogBox.cpp \ FXDict.cpp \ FXDir.cpp \ FXDirBox.cpp \ FXDirDialog.cpp \ FXDirList.cpp \ FXDirSelector.cpp \ FXDockBar.cpp \ FXDockHandler.cpp \ FXDockSite.cpp \ FXDockTitle.cpp \ FXDocument.cpp \ FXDragCorner.cpp \ FXDrawable.cpp \ FXDriveBox.cpp \ FXException.cpp \ FXExpression.cpp \ FXExtentd.cpp \ FXExtentf.cpp \ FXFile.cpp \ FXFileDialog.cpp \ FXFileDict.cpp \ FXFileList.cpp \ FXFileSelector.cpp \ FXFileStream.cpp \ FXFoldingList.cpp \ FXFont.cpp \ FXFontDialog.cpp \ FXFontSelector.cpp \ FXFrame.cpp \ FXGIFCursor.cpp \ FXGIFIcon.cpp \ FXGIFImage.cpp \ FXGLCanvas.cpp \ FXGLCone.cpp \ FXGLContext.cpp \ FXGLCube.cpp \ FXGLCylinder.cpp \ FXGLObject.cpp \ FXGLShape.cpp \ FXGLSphere.cpp \ FXGLTriangleMesh.cpp \ FXGLViewer.cpp \ FXGLVisual.cpp \ FXGradientBar.cpp \ FXGroupBox.cpp \ FXGUISignal.cpp \ FXGZFileStream.cpp \ FXHash.cpp \ FXHeader.cpp \ FXHorizontalFrame.cpp \ FXICOIcon.cpp \ FXICOImage.cpp \ FXIFFIcon.cpp \ FXIFFImage.cpp \ FXIcon.cpp \ FXIconList.cpp \ FXIconDict.cpp \ FXIconSource.cpp \ FXId.cpp \ FXImage.cpp \ FXImageFrame.cpp \ FXImageView.cpp \ FXInputDialog.cpp \ FXIO.cpp \ FXJPGIcon.cpp \ FXJPGImage.cpp \ FXKOI8RCodec.cpp \ FXKnob.cpp \ FXLabel.cpp \ FXList.cpp \ FXListBox.cpp \ FXMDIButton.cpp \ FXMDIChild.cpp \ FXMDIClient.cpp \ FXMainWindow.cpp \ FXMat3d.cpp \ FXMat4d.cpp \ FXMat3f.cpp \ FXMat4f.cpp \ FXMatrix.cpp \ FXMemMap.cpp \ FXMemoryStream.cpp \ FXMenuBar.cpp \ FXMenuButton.cpp \ FXMenuCaption.cpp \ FXMenuCascade.cpp \ FXMenuCheck.cpp \ FXMenuRadio.cpp \ FXMenuCommand.cpp \ FXMenuPane.cpp \ FXMenuSeparator.cpp \ FXMenuTitle.cpp \ FXMessageBox.cpp \ FXObject.cpp \ FXObjectList.cpp \ FXOptionMenu.cpp \ FXPCXIcon.cpp \ FXPCXImage.cpp \ FXPNGIcon.cpp \ FXPNGImage.cpp \ FXPPMIcon.cpp \ FXPPMImage.cpp \ FXPacker.cpp \ FXPath.cpp \ FXPicker.cpp \ FXPipe.cpp \ FXPopup.cpp \ FXPoint.cpp \ FXPrintDialog.cpp \ FXProgressBar.cpp \ FXProgressDialog.cpp \ FXQuatd.cpp \ FXQuatf.cpp \ FXRASIcon.cpp \ FXRASImage.cpp \ FXRGBIcon.cpp \ FXRGBImage.cpp \ FXRadioButton.cpp \ FXRangef.cpp \ FXRanged.cpp \ FXRealSlider.cpp \ FXRealSpinner.cpp \ FXRecentFiles.cpp \ FXRectangle.cpp \ FXRegion.cpp \ FXRegistry.cpp \ FXReplaceDialog.cpp \ FXRex.cpp \ FXRootWindow.cpp \ FXRuler.cpp \ FXRulerView.cpp \ FXScrollArea.cpp \ FXScrollPane.cpp \ FXScrollWindow.cpp \ FXScrollBar.cpp \ FXSearchDialog.cpp \ FXSeparator.cpp \ FXSettings.cpp \ FXShell.cpp \ FXShutter.cpp \ FXSize.cpp \ FXSlider.cpp \ FXSocket.cpp \ FXSpheref.cpp \ FXSphered.cpp \ FXSplashWindow.cpp \ FXSpinner.cpp \ FXSplitter.cpp \ FXSpring.cpp \ FXStat.cpp \ FXStatusBar.cpp \ FXStatusLine.cpp \ FXStream.cpp \ FXString.cpp \ FXStringDict.cpp \ FXSwitcher.cpp \ FXSystem.cpp \ FXTGAIcon.cpp \ FXTGAImage.cpp \ FXTIFIcon.cpp \ FXTIFImage.cpp \ FXTabBar.cpp \ FXTabBook.cpp \ FXTabItem.cpp \ FXTable.cpp \ FXText.cpp \ FXTextCodec.cpp \ FXTextField.cpp \ FXThread.cpp \ FXToggleButton.cpp \ FXToolBar.cpp \ FXToolBarGrip.cpp \ FXToolBarShell.cpp \ FXToolBarTab.cpp \ FXToolTip.cpp \ FXTopWindow.cpp \ FXTranslator.cpp \ FXTreeList.cpp \ FXTreeListBox.cpp \ FXTriStateButton.cpp \ FXUndoList.cpp \ FXURL.cpp \ FXUTF16Codec.cpp \ FXUTF32Codec.cpp \ FXUTF8Codec.cpp \ FXVec2d.cpp \ FXVec2f.cpp \ FXVec3d.cpp \ FXVec3f.cpp \ FXVec4d.cpp \ FXVec4f.cpp \ FXVerticalFrame.cpp \ FXVisual.cpp \ FXWindow.cpp \ FXWizard.cpp \ FXXBMIcon.cpp \ FXXBMImage.cpp \ FXXPMIcon.cpp \ FXXPMImage.cpp \ fxascii.cpp \ fxbmpio.cpp \ fxfilematch.cpp \ fxgifio.cpp \ fxicoio.cpp \ fxiffio.cpp \ fxjpegio.cpp \ fxkeyboard.cpp \ fxkeysym.cpp \ fxparsegeometry.cpp \ fxpcxio.cpp \ fxpngio.cpp \ fxppmio.cpp \ fxpriv.cpp \ fxpsio.cpp \ fxezquantize.cpp \ fxfsquantize.cpp \ fxwuquantize.cpp \ fxrasio.cpp \ fxrgbio.cpp \ fxtargaio.cpp \ fxtifio.cpp \ fxunicode.cpp \ fxutils.cpp \ fxxbmio.cpp \ fxxpmio.cpp \ icons.cpp \ version.rc \ version.rc.in \ strtoll.cpp \ vsscanf.cpp OBJECTS = $(SOURCES:.cpp=.obj) .cpp.obj: $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $< all: $(FOXLIB) clean: del $(FOXLIB) del *.obj # Make the library $(FOXLIB): $(OBJECTS) Makefile.bc.resp touch $(FOXLIB) del $(FOXLIB) $(LIB) "$(FOXLIB)" /P256 @Makefile.bc.resp fox1.6-1.6.57/src/Makefile.bc.resp000066400000000000000000000126231326741342000164230ustar00rootroot00000000000000+FX4Splitter.obj & +FX7Segment.obj & +FX885910Codec.obj & +FX885911Codec.obj & +FX885913Codec.obj & +FX885914Codec.obj & +FX885915Codec.obj & +FX885916Codec.obj & +FX88591Codec.obj & +FX88592Codec.obj & +FX88593Codec.obj & +FX88594Codec.obj & +FX88595Codec.obj & +FX88596Codec.obj & +FX88597Codec.obj & +FX88598Codec.obj & +FX88599Codec.obj & +FXAccelTable.obj & +FXApp.obj & +FXArrowButton.obj & +FXBMPIcon.obj & +FXBMPImage.obj & +FXBitmap.obj & +FXBitmapFrame.obj & +FXBitmapView.obj & +FXButton.obj & +FXBZFileStream.obj & +FXCURCursor.obj & +FXCanvas.obj & +FXCheckButton.obj & +FXChoiceBox.obj & +FXColorBar.obj & +FXColorDialog.obj & +FXColorList.obj & +FXColorNames.obj & +FXColorRing.obj & +FXColorSelector.obj & +FXColorWell.obj & +FXColorWheel.obj & +FXComboBox.obj & +FXComposeContext.obj & +FXComposite.obj & +FXCP1250Codec.obj & +FXCP1251Codec.obj & +FXCP1252Codec.obj & +FXCP1253Codec.obj & +FXCP1254Codec.obj & +FXCP1255Codec.obj & +FXCP1256Codec.obj & +FXCP1257Codec.obj & +FXCP1258Codec.obj & +FXCP437Codec.obj & +FXCP850Codec.obj & +FXCP852Codec.obj & +FXCP855Codec.obj & +FXCP856Codec.obj & +FXCP857Codec.obj & +FXCP860Codec.obj & +FXCP861Codec.obj & +FXCP862Codec.obj & +FXCP863Codec.obj & +FXCP864Codec.obj & +FXCP865Codec.obj & +FXCP866Codec.obj & +FXCP869Codec.obj & +FXCP874Codec.obj & +FXCursor.obj & +FXDataTarget.obj & +FXDate.obj & +FXDC.obj & +FXDCPrint.obj & +FXDCWindow.obj & +FXDLL.obj & +FXDebugTarget.obj & +FXDelegator.obj & +FXDial.obj & +FXDialogBox.obj & +FXDict.obj & +FXDir.obj & +FXDirBox.obj & +FXDirDialog.obj & +FXDirList.obj & +FXDirSelector.obj & +FXDockBar.obj & +FXDockHandler.obj & +FXDockSite.obj & +FXDockTitle.obj & +FXDocument.obj & +FXDragCorner.obj & +FXDrawable.obj & +FXDriveBox.obj & +FXException.obj & +FXExpression.obj & +FXExtentd.obj & +FXExtentf.obj & +FXFile.obj & +FXFileDialog.obj & +FXFileDict.obj & +FXFileList.obj & +FXFileSelector.obj & +FXFileStream.obj & +FXFoldingList.obj & +FXFont.obj & +FXFontDialog.obj & +FXFontSelector.obj & +FXFrame.obj & +FXGIFCursor.obj & +FXGIFIcon.obj & +FXGIFImage.obj & +FXGLCanvas.obj & +FXGLCone.obj & +FXGLContext.obj & +FXGLCube.obj & +FXGLCylinder.obj & +FXGLObject.obj & +FXGLShape.obj & +FXGLSphere.obj & +FXGLTriangleMesh.obj & +FXGLViewer.obj & +FXGLVisual.obj & +FXGradientBar.obj & +FXGroupBox.obj & +FXGUISignal.obj & +FXGZFileStream.obj & +FXHash.obj & +FXHeader.obj & +FXHorizontalFrame.obj & +FXICOIcon.obj & +FXICOImage.obj & +FXIFFIcon.obj & +FXIFFImage.obj & +FXIO.obj & +FXIcon.obj & +FXIconList.obj & +FXIconDict.obj & +FXIconSource.obj & +FXId.obj & +FXImage.obj & +FXImageFrame.obj & +FXImageView.obj & +FXInputDialog.obj & +FXJPGIcon.obj & +FXJPGImage.obj & +FXKOI8RCodec.obj & +FXKnob.obj & +FXLabel.obj & +FXList.obj & +FXListBox.obj & +FXMDIButton.obj & +FXMDIChild.obj & +FXMDIClient.obj & +FXMainWindow.obj & +FXMat3d.obj & +FXMat4d.obj & +FXMat3f.obj & +FXMat4f.obj & +FXMatrix.obj & +FXMemMap.obj & +FXMemoryStream.obj & +FXMenuBar.obj & +FXMenuButton.obj & +FXMenuCaption.obj & +FXMenuCascade.obj & +FXMenuCheck.obj & +FXMenuRadio.obj & +FXMenuCommand.obj & +FXMenuPane.obj & +FXMenuSeparator.obj & +FXMenuTitle.obj & +FXMessageBox.obj & +FXObject.obj & +FXObjectList.obj & +FXOptionMenu.obj & +FXPCXIcon.obj & +FXPCXImage.obj & +FXPNGIcon.obj & +FXPNGImage.obj & +FXPPMIcon.obj & +FXPPMImage.obj & +FXPacker.obj & +FXPath.obj & +FXPicker.obj & +FXPipe.obj & +FXPopup.obj & +FXPoint.obj & +FXPrintDialog.obj & +FXProgressBar.obj & +FXProgressDialog.obj & +FXQuatd.obj & +FXQuatf.obj & +FXRASIcon.obj & +FXRASImage.obj & +FXRGBIcon.obj & +FXRGBImage.obj & +FXRadioButton.obj & +FXRangef.obj & +FXRanged.obj & +FXRealSlider.obj & +FXRealSpinner.obj & +FXRecentFiles.obj & +FXRectangle.obj & +FXRegion.obj & +FXRegistry.obj & +FXReplaceDialog.obj & +FXRex.obj & +FXRootWindow.obj & +FXRuler.obj & +FXRulerView.obj & +FXScrollArea.obj & +FXScrollPane.obj & +FXScrollWindow.obj & +FXScrollBar.obj & +FXSearchDialog.obj & +FXSeparator.obj & +FXSettings.obj & +FXShell.obj & +FXShutter.obj & +FXSize.obj & +FXSlider.obj & +FXSocket.obj & +FXSpheref.obj & +FXSphered.obj & +FXSplashWindow.obj & +FXSpinner.obj & +FXSplitter.obj & +FXSpring.obj & +FXStat.obj & +FXStatusBar.obj & +FXStatusLine.obj & +FXStream.obj & +FXString.obj & +FXStringDict.obj & +FXSwitcher.obj & +FXSystem.obj & +FXTGAIcon.obj & +FXTGAImage.obj & +FXTIFIcon.obj & +FXTIFImage.obj & +FXTabBar.obj & +FXTabBook.obj & +FXTabItem.obj & +FXTable.obj & +FXText.obj & +FXTextCodec.obj & +FXTextField.obj & +FXThread.obj & +FXToggleButton.obj & +FXToolBar.obj & +FXToolBarGrip.obj & +FXToolBarShell.obj & +FXToolBarTab.obj & +FXToolTip.obj & +FXTopWindow.obj & +FXTranslator.obj & +FXTreeList.obj & +FXTreeListBox.obj & +FXTriStateButton.obj & +FXUndoList.obj & +FXURL.obj & +FXUTF16Codec.obj & +FXUTF32Codec.obj & +FXUTF8Codec.obj & +FXVec2d.obj & +FXVec2f.obj & +FXVec3d.obj & +FXVec3f.obj & +FXVec4d.obj & +FXVec4f.obj & +FXVerticalFrame.obj & +FXVisual.obj & +FXWindow.obj & +FXWizard.obj & +FXXBMIcon.obj & +FXXBMImage.obj & +FXXPMIcon.obj & +FXXPMImage.obj & +fxascii.obj & +fxbmpio.obj & +fxfilematch.obj & +fxgifio.obj & +fxicoio.obj & +fxiffio.obj & +fxjpegio.obj & +fxkeyboard.obj & +fxkeysym.obj & +fxparsegeometry.obj & +fxpcxio.obj & +fxpngio.obj & +fxppmio.obj & +fxpriv.obj & +fxpsio.obj & +fxezquantize.obj & +fxfsquantize.obj & +fxwuquantize.obj & +fxrasio.obj & +fxrgbio.obj & +fxtargaio.obj & +fxtifio.obj & +fxunicode.obj & +fxutils.obj & +fxxbmio.obj & +fxxpmio.obj & +icons.obj & +strtoll.obj & +vsscanf.obj fox1.6-1.6.57/src/Makefile.dmc000066400000000000000000000210101326741342000156200ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Contributed by: Andre Fornacon # ############################################################################## # $Id: Makefile.dmc,v 1.50.2.3 2008/03/31 19:34:08 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## # Digital Mars C++ Compiler 8.x or later CXX = dmc RM = del LIB = lib RCC = rcc TOPDIR = .. CXXFLAGS = -mn -WD -5 -a8 -Ae -Ar -Nc -NS -NV DEFINES = -DFOX_BIGENDIAN=0 -DNDEBUG -D_WINDOWS -DWIN32 -DHAVE_VSSCANF -DHAVE_OPENGL #-DHAVE_PNG_H -DHAVE_JPEG_H -DHAVE_ZLIB_H -DHAVE_TIFF_H -DHAVE_BZ2LIB_H -DXMD_H INCDIRS = -I$(TOPDIR)/include FOXLIB = $(TOPDIR)\src\FOX-1.6.lib RESWRAP = $(TOPDIR)\utils\reswrap.exe SUFFIXES = .gif .bmp ICONS = \ arrownext.gif \ arrowprev.gif \ bigapp.gif \ bigcdrom.gif \ bigcomputer.gif \ bigdesktop.gif \ bigdoc.gif \ bigfloppy.gif \ bigfolder.gif \ bigfolderopen.gif \ bignetdrive.gif \ bignethood.gif \ bookset.gif \ bookclr.gif \ cmymode.gif \ dialmode.gif \ dirupicon.gif \ deleteicon.gif \ docktop.gif \ dockbottom.gif \ dockleft.gif \ dockright.gif \ dockfree.gif \ dockflip.gif \ entericon.gif \ erroricon.gif \ eyedrop.gif \ filecopy.gif \ filemove.gif \ filehidden.gif \ filelink.gif \ filerename.gif \ filedelete.gif \ fileshown.gif \ foldernew.gif \ gotohome.gif \ gotoicon.gif \ gotowork.gif \ hsvmode.gif \ infoicon.gif \ landscape.gif \ listmode.gif \ miniapp.gif \ minicdrom.gif \ minicomputer.gif \ minidesktop.gif \ minidoc.gif \ minifloppy.gif \ minifolder.gif \ minifolderopen.gif \ miniharddisk.gif \ mininetdrive.gif \ mininethood.gif \ minizipdrive.gif \ portrait.gif \ questionicon.gif \ rgbmode.gif \ searchicon.gif \ showbigicons.gif \ showdetails.gif \ showsmallicons.gif \ warningicon.gif \ winclose.gif \ winmaximize.gif \ winminimize.gif \ winrestore.gif SOURCES = \ FX4Splitter.cpp \ FX7Segment.cpp \ FX885910Codec.cpp \ FX885911Codec.cpp \ FX885913Codec.cpp \ FX885914Codec.cpp \ FX885915Codec.cpp \ FX885916Codec.cpp \ FX88591Codec.cpp \ FX88592Codec.cpp \ FX88593Codec.cpp \ FX88594Codec.cpp \ FX88595Codec.cpp \ FX88596Codec.cpp \ FX88597Codec.cpp \ FX88598Codec.cpp \ FX88599Codec.cpp \ FXAccelTable.cpp \ FXApp.cpp \ FXArrowButton.cpp \ FXBMPIcon.cpp \ FXBMPImage.cpp \ FXBitmap.cpp \ FXBitmapFrame.cpp \ FXBitmapView.cpp \ FXButton.cpp \ FXBZFileStream.cpp \ FXCURCursor.cpp \ FXCanvas.cpp \ FXCheckButton.cpp \ FXChoiceBox.cpp \ FXColorBar.cpp \ FXColorDialog.cpp \ FXColorList.cpp \ FXColorNames.cpp \ FXColorRing.cpp \ FXColorSelector.cpp \ FXColorWell.cpp \ FXColorWheel.cpp \ FXComboBox.cpp \ FXComposeContext.cpp \ FXComposite.cpp \ FXCP1250Codec.cpp \ FXCP1251Codec.cpp \ FXCP1252Codec.cpp \ FXCP1253Codec.cpp \ FXCP1254Codec.cpp \ FXCP1255Codec.cpp \ FXCP1256Codec.cpp \ FXCP1257Codec.cpp \ FXCP1258Codec.cpp \ FXCP437Codec.cpp \ FXCP850Codec.cpp \ FXCP852Codec.cpp \ FXCP855Codec.cpp \ FXCP856Codec.cpp \ FXCP857Codec.cpp \ FXCP860Codec.cpp \ FXCP861Codec.cpp \ FXCP862Codec.cpp \ FXCP863Codec.cpp \ FXCP864Codec.cpp \ FXCP865Codec.cpp \ FXCP866Codec.cpp \ FXCP869Codec.cpp \ FXCP874Codec.cpp \ FXCursor.cpp \ FXDataTarget.cpp \ FXDate.cpp \ FXDC.cpp \ FXDCPrint.cpp \ FXDCWindow.cpp \ FXDLL.cpp \ FXDebugTarget.cpp \ FXDelegator.cpp \ FXDial.cpp \ FXDialogBox.cpp \ FXDict.cpp \ FXDir.cpp \ FXDirBox.cpp \ FXDirDialog.cpp \ FXDirList.cpp \ FXDirSelector.cpp \ FXDockBar.cpp \ FXDockHandler.cpp \ FXDockSite.cpp \ FXDockTitle.cpp \ FXDocument.cpp \ FXDragCorner.cpp \ FXDrawable.cpp \ FXDriveBox.cpp \ FXException.cpp \ FXExpression.cpp \ FXExtentd.cpp \ FXExtentf.cpp \ FXFile.cpp \ FXFileDialog.cpp \ FXFileDict.cpp \ FXFileList.cpp \ FXFileSelector.cpp \ FXFileStream.cpp \ FXFoldingList.cpp \ FXFont.cpp \ FXFontDialog.cpp \ FXFontSelector.cpp \ FXFrame.cpp \ FXGIFCursor.cpp \ FXGIFIcon.cpp \ FXGIFImage.cpp \ FXGLCanvas.cpp \ FXGLCone.cpp \ FXGLContext.cpp \ FXGLCube.cpp \ FXGLCylinder.cpp \ FXGLObject.cpp \ FXGLShape.cpp \ FXGLSphere.cpp \ FXGLTriangleMesh.cpp \ FXGLViewer.cpp \ FXGLVisual.cpp \ FXGradientBar.cpp \ FXGroupBox.cpp \ FXGUISignal.cpp \ FXGZFileStream.cpp \ FXHash.cpp \ FXHeader.cpp \ FXHorizontalFrame.cpp \ FXICOIcon.cpp \ FXICOImage.cpp \ FXIFFIcon.cpp \ FXIFFImage.cpp \ FXIcon.cpp \ FXIconDict.cpp \ FXIconList.cpp \ FXIconSource.cpp \ FXId.cpp \ FXImage.cpp \ FXImageFrame.cpp \ FXImageView.cpp \ FXInputDialog.cpp \ FXIO.cpp \ FXJPGIcon.cpp \ FXJPGImage.cpp \ FXKOI8RCodec.cpp \ FXKnob.cpp \ FXLabel.cpp \ FXList.cpp \ FXListBox.cpp \ FXMDIButton.cpp \ FXMDIChild.cpp \ FXMDIClient.cpp \ FXMainWindow.cpp \ FXMat3d.cpp \ FXMat4d.cpp \ FXMat3f.cpp \ FXMat4f.cpp \ FXMatrix.cpp \ FXMemMap.cpp \ FXMemoryStream.cpp \ FXMenuBar.cpp \ FXMenuButton.cpp \ FXMenuCaption.cpp \ FXMenuCascade.cpp \ FXMenuCheck.cpp \ FXMenuRadio.cpp \ FXMenuCommand.cpp \ FXMenuPane.cpp \ FXMenuSeparator.cpp \ FXMenuTitle.cpp \ FXMessageBox.cpp \ FXObject.cpp \ FXObjectList.cpp \ FXOptionMenu.cpp \ FXPCXIcon.cpp \ FXPCXImage.cpp \ FXPNGIcon.cpp \ FXPNGImage.cpp \ FXPPMIcon.cpp \ FXPPMImage.cpp \ FXPacker.cpp \ FXPath.cpp \ FXPicker.cpp \ FXPipe.cpp \ FXPopup.cpp \ FXPoint.cpp \ FXPrintDialog.cpp \ FXProgressBar.cpp \ FXProgressDialog.cpp \ FXQuatd.cpp \ FXQuatf.cpp \ FXRASIcon.cpp \ FXRASImage.cpp \ FXRGBIcon.cpp \ FXRGBImage.cpp \ FXRadioButton.cpp \ FXRangef.cpp \ FXRanged.cpp \ FXRealSlider.cpp \ FXRealSpinner.cpp \ FXRecentFiles.cpp \ FXRectangle.cpp \ FXRegion.cpp \ FXRegistry.cpp \ FXReplaceDialog.cpp \ FXRex.cpp \ FXRootWindow.cpp \ FXRuler.cpp \ FXRulerView.cpp \ FXScrollArea.cpp \ FXScrollWindow.cpp \ FXScrollBar.cpp \ FXScrollPane.cpp \ FXSearchDialog.cpp \ FXSeparator.cpp \ FXSettings.cpp \ FXShell.cpp \ FXShutter.cpp \ FXSize.cpp \ FXSlider.cpp \ FXSocket.cpp \ FXSpinner.cpp \ FXSpheref.cpp \ FXSphered.cpp \ FXSplashWindow.cpp \ FXSplitter.cpp \ FXSpring.cpp \ FXStat.cpp \ FXStatusBar.cpp \ FXStatusLine.cpp \ FXStream.cpp \ FXString.cpp \ FXStringDict.cpp \ FXSwitcher.cpp \ FXSystem.cpp \ FXTGAIcon.cpp \ FXTGAImage.cpp \ FXTIFIcon.cpp \ FXTIFImage.cpp \ FXTabBar.cpp \ FXTabBook.cpp \ FXTabItem.cpp \ FXTable.cpp \ FXText.cpp \ FXTextCodec.cpp \ FXTextField.cpp \ FXThread.cpp \ FXToggleButton.cpp \ FXToolBar.cpp \ FXToolBarGrip.cpp \ FXToolBarShell.cpp \ FXToolBarTab.cpp \ FXToolTip.cpp \ FXTopWindow.cpp \ FXTranslator.cpp \ FXTreeList.cpp \ FXTreeListBox.cpp \ FXTriStateButton.cpp \ FXUndoList.cpp \ FXURL.cpp \ FXUTF16Codec.cpp \ FXUTF32Codec.cpp \ FXUTF8Codec.cpp \ FXVec2d.cpp \ FXVec2f.cpp \ FXVec3d.cpp \ FXVec3f.cpp \ FXVec4d.cpp \ FXVec4f.cpp \ FXVerticalFrame.cpp \ FXVisual.cpp \ FXWindow.cpp \ FXWizard.cpp \ FXXBMIcon.cpp \ FXXBMImage.cpp \ FXXPMIcon.cpp \ FXXPMImage.cpp \ fxascii.cpp \ fxbmpio.cpp \ fxfilematch.cpp \ fxgifio.cpp \ fxicoio.cpp \ fxiffio.cpp \ fxjpegio.cpp \ fxkeyboard.cpp \ fxkeysym.cpp \ fxparsegeometry.cpp \ fxpcxio.cpp \ fxpngio.cpp \ fxppmio.cpp \ fxpsio.cpp \ fxpriv.cpp \ fxezquantize.cpp \ fxfsquantize.cpp \ fxwuquantize.cpp \ fxrasio.cpp \ fxrgbio.cpp \ fxtargaio.cpp \ fxtifio.cpp \ fxunicode.cpp \ fxutils.cpp \ fxxbmio.cpp \ fxxpmio.cpp \ icons.cpp \ strtoll.cpp \ vsscanf.cpp OBJECTS = $(SOURCES:.cpp=.obj) .cpp.obj: $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $< all: $(FOXLIB) FXApp.cpp: icons.cpp icons.h: $(ICONS) $(RM) $@ $(RESWRAP) -i -n FX -o icons.h $(ICONS) icons.cpp: $(ICONS) icons.h $(RM) $@ @echo \#include "icons.h" >$@ $(RESWRAP) -n FX -oa $@ $(ICONS) clean: del $(FOXLIB) del *.obj # Make the library $(FOXLIB): $(OBJECTS) Makefile.dmc.resp touch $(FOXLIB) del $(FOXLIB) $(RCC) -32 -oversion.res version.rc $(LIB) -c -p64 $(FOXLIB) $(OBJECTS) fox1.6-1.6.57/src/Makefile.dmc.resp000066400000000000000000000126011326741342000165760ustar00rootroot00000000000000+FX4Splitter.obj & +FX7Segment.obj & +FX885910Codec.obj & +FX885911Codec.obj & +FX885913Codec.obj & +FX885914Codec.obj & +FX885915Codec.obj & +FX885916Codec.obj & +FX88591Codec.obj & +FX88592Codec.obj & +FX88593Codec.obj & +FX88594Codec.obj & +FX88595Codec.obj & +FX88596Codec.obj & +FX88597Codec.obj & +FX88598Codec.obj & +FX88599Codec.obj & +FXAccelTable.obj & +FXApp.obj & +FXArrowButton.obj & +FXBMPIcon.obj & +FXBMPImage.obj & +FXBitmap.obj & +FXBitmapFrame.obj & +FXBitmapView.obj & +FXButton.obj & +FXBZFileStream.obj & +FXCURCursor.obj & +FXCanvas.obj & +FXCheckButton.obj & +FXChoiceBox.obj & +FXColorBar.obj & +FXColorDialog.obj & +FXColorList.obj & +FXColorNames.obj & +FXColorRing.obj & +FXColorSelector.obj & +FXColorWell.obj & +FXColorWheel.obj & +FXComboBox.obj & +FXComposeContext.obj & +FXComposite.obj & +FXCP1250Codec.obj & +FXCP1251Codec.obj & +FXCP1252Codec.obj & +FXCP1253Codec.obj & +FXCP1254Codec.obj & +FXCP1255Codec.obj & +FXCP1256Codec.obj & +FXCP1257Codec.obj & +FXCP1258Codec.obj & +FXCP437Codec.obj & +FXCP850Codec.obj & +FXCP852Codec.obj & +FXCP855Codec.obj & +FXCP856Codec.obj & +FXCP857Codec.obj & +FXCP860Codec.obj & +FXCP861Codec.obj & +FXCP862Codec.obj & +FXCP863Codec.obj & +FXCP864Codec.obj & +FXCP865Codec.obj & +FXCP866Codec.obj & +FXCP869Codec.obj & +FXCP874Codec.obj & +FXCursor.obj & +FXDate.obj & +FXDataTarget.obj & +FXDC.obj & +FXDCPrint.obj & +FXDCWindow.obj & +FXDLL.obj & +FXDebugTarget.obj & +FXDelegator.obj & +FXDial.obj & +FXDialogBox.obj & +FXDict.obj & +FXDir.obj & +FXDirBox.obj & +FXDirDialog.obj & +FXDirList.obj & +FXDirSelector.obj & +FXDockBar.obj & +FXDockHandler.obj & +FXDockSite.obj & +FXDockTitle.obj & +FXDocument.obj & +FXDragCorner.obj & +FXDrawable.obj & +FXDriveBox.obj & +FXException.obj & +FXExpression.obj & +FXExtentd.obj & +FXExtentf.obj & +FXFile.obj & +FXFileDialog.obj & +FXFileDict.obj & +FXFileList.obj & +FXFileSelector.obj & +FXFileStream.obj & +FXFoldingList.obj & +FXFont.obj & +FXFontDialog.obj & +FXFontSelector.obj & +FXFrame.obj & +FXGIFCursor.obj & +FXGIFIcon.obj & +FXGIFImage.obj & +FXGLCanvas.obj & +FXGLCone.obj & +FXGLContext.obj & +FXGLCube.obj & +FXGLCylinder.obj & +FXGLObject.obj & +FXGLShape.obj & +FXGLSphere.obj & +FXGLTriangleMesh.obj & +FXGLViewer.obj & +FXGLVisual.obj & +FXGradientBar.obj & +FXGroupBox.obj & +FXGUISignal.obj & +FXGZFileStream.obj & +FXHash.obj & +FXHeader.obj & +FXHorizontalFrame.obj & +FXICOIcon.obj & +FXICOImage.obj & +FXIFFIcon.obj & +FXIFFImage.obj & +FXIO.obj & +FXIcon.obj & +FXIconDict.obj & +FXIconList.obj & +FXIconSource.obj & +FXId.obj & +FXImage.obj & +FXImageFrame.obj & +FXImageView.obj & +FXInputDialog.obj & +FXJPGIcon.obj & +FXJPGImage.obj & +FXKOI8RCodec.obj & +FXKnob.obj & +FXLabel.obj & +FXList.obj & +FXListBox.obj & +FXMDIButton.obj & +FXMDIChild.obj & +FXMDIClient.obj & +FXMainWindow.obj & +FXMat3d.obj & +FXMat4d.obj & +FXMat3f.obj & +FXMat4f.obj & +FXMatrix.obj & +FXMemMap.obj & +FXMemoryStream.obj & +FXMenuBar.obj & +FXMenuButton.obj & +FXMenuCaption.obj & +FXMenuCascade.obj & +FXMenuCheck.obj & +FXMenuRadio.obj & +FXMenuCommand.obj & +FXMenuPane.obj & +FXMenuSeparator.obj & +FXMenuTitle.obj & +FXMessageBox.obj & +FXObject.obj & +FXObjectList.obj & +FXOptionMenu.obj & +FXPCXIcon.obj & +FXPCXImage.obj & +FXPNGIcon.obj & +FXPNGImage.obj & +FXPPMIcon.obj & +FXPPMImage.obj & +FXPacker.obj & +FXPath.obj & +FXPicker.obj & +FXPipe.obj & +FXPopup.obj & +FXPoint.obj & +FXPrintDialog.obj & +FXProgressBar.obj & +FXProgressDialog.obj & +FXQuatd.obj & +FXQuatf.obj & +FXRASIcon.obj & +FXRASImage.obj & +FXRGBIcon.obj & +FXRGBImage.obj & +FXRadioButton.obj & +FXRangef.obj & +FXRanged.obj & +FXRealSlider.obj & +FXRealSpinner.obj & +FXRecentFiles.obj & +FXRectangle.obj & +FXRegion.obj & +FXRegistry.obj & +FXReplaceDialog.obj & +FXRex.obj & +FXRootWindow.obj & +FXRuler.obj & +FXRulerView.obj & +FXScrollArea.obj & +FXScrollBar.obj & +FXScrollPane.obj & +FXScrollWindow.obj & +FXSearchDialog.obj & +FXSeparator.obj & +FXSettings.obj & +FXShell.obj & +FXShutter.obj & +FXSize.obj & +FXSlider.obj & +FXSocket.obj & +FXSpinner.obj & +FXSpheref.obj & +FXSphered.obj & +FXSplashWindow.obj & +FXSplitter.obj & +FXSpring.obj & +FXStat.obj & +FXStatusBar.obj & +FXStatusLine.obj & +FXStream.obj & +FXString.obj & +FXStringDict.obj & +FXSwitcher.obj & +FXSystem.obj & +FXTGAIcon.obj & +FXTGAImage.obj & +FXTIFIcon.obj & +FXTIFImage.obj & +FXTabBar.obj & +FXTabBook.obj & +FXTabItem.obj & +FXTable.obj & +FXText.obj & +FXTextCodec.obj & +FXTextField.obj & +FXThread.obj & +FXToggleButton.obj & +FXToolBar.obj & +FXToolBarGrip.obj & +FXToolBarShell.obj & +FXToolBarTab.obj & +FXToolTip.obj & +FXTopWindow.obj & +FXTranslator.obj & +FXTreeList.obj & +FXTreeListBox.obj & +FXTriStateButton.obj & +FXUndoList.obj & +FXURL.obj & +FXUTF16Codec.obj & +FXUTF32Codec.obj & +FXUTF8Codec.obj & +FXVec2d.obj & +FXVec2f.obj & +FXVec3d.obj & +FXVec3f.obj & +FXVec4d.obj & +FXVec4f.obj & +FXVerticalFrame.obj & +FXVisual.obj & +FXWindow.obj & +FXWizard.obj & +FXXBMIcon.obj & +FXXBMImage.obj & +FXXPMImage.obj & +FXXPMIcon.obj & +fxascii.obj & +fxbmpio.obj & +fxfilematch.obj & +fxgifio.obj & +fxicoio.obj & +fxiffio.obj & +fxjpegio.obj & +fxkeyboard.obj & +fxkeysym.obj & +fxparsegeometry.obj & +fxpcxio.obj & +fxpngio.obj & +fxppmio.obj & +fxpriv.obj & +fxpsio.obj & +fxezquantize.obj & +fxfsquantize.obj & +fxwuquantize.obj & +fxrasio.obj & +fxrgbio.obj & +fxtargaio.obj & +fxtifio.obj & +fxutils.obj & +fxxbmio.obj & +fxxpmio.obj & +icons.obj & +strtoll.obj & +vsscanf.obj fox1.6-1.6.57/src/Makefile.in000066400000000000000000001564471326741342000155120ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = version.rc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libFOX_1_6_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__objects_1 = FX88591Codec.lo FX88592Codec.lo FX88593Codec.lo \ FX88594Codec.lo FX88595Codec.lo FX88596Codec.lo \ FX88597Codec.lo FX88598Codec.lo FX88599Codec.lo \ FX885910Codec.lo FX885911Codec.lo FX885913Codec.lo \ FX885914Codec.lo FX885915Codec.lo FX885916Codec.lo \ FXCP437Codec.lo FXCP850Codec.lo FXCP852Codec.lo \ FXCP855Codec.lo FXCP856Codec.lo FXCP857Codec.lo \ FXCP860Codec.lo FXCP861Codec.lo FXCP862Codec.lo \ FXCP863Codec.lo FXCP864Codec.lo FXCP865Codec.lo \ FXCP866Codec.lo FXCP869Codec.lo FXCP874Codec.lo \ FXCP1250Codec.lo FXCP1251Codec.lo FXCP1252Codec.lo \ FXCP1253Codec.lo FXCP1254Codec.lo FXCP1255Codec.lo \ FXCP1256Codec.lo FXCP1257Codec.lo FXCP1258Codec.lo \ FXKOI8RCodec.lo FXUTF8Codec.lo FXUTF16Codec.lo FXUTF32Codec.lo am__objects_2 = am_libFOX_1_6_la_OBJECTS = $(am__objects_1) FX4Splitter.lo \ FX7Segment.lo FXAccelTable.lo FXApp.lo FXArrowButton.lo \ FXBMPIcon.lo FXBMPImage.lo FXBitmap.lo FXBitmapFrame.lo \ FXBitmapView.lo FXButton.lo FXBZFileStream.lo FXCURCursor.lo \ FXCanvas.lo FXCheckButton.lo FXChoiceBox.lo FXColorBar.lo \ FXColorDialog.lo FXColorList.lo FXColorNames.lo FXColorRing.lo \ FXColorSelector.lo FXColorWell.lo FXColorWheel.lo \ FXComboBox.lo FXComposeContext.lo FXComposite.lo FXCursor.lo \ FXDataTarget.lo FXDate.lo FXDC.lo FXDCPrint.lo FXDCWindow.lo \ FXDLL.lo FXDebugTarget.lo FXDelegator.lo FXDial.lo \ FXDialogBox.lo FXDict.lo FXDir.lo FXDirBox.lo FXDirDialog.lo \ FXDirList.lo FXDirSelector.lo FXDockBar.lo FXDockSite.lo \ FXDockHandler.lo FXDockTitle.lo FXDocument.lo FXDragCorner.lo \ FXDrawable.lo FXDriveBox.lo FXException.lo FXExpression.lo \ FXExtentd.lo FXExtentf.lo FXFile.lo FXFileDialog.lo \ FXFileDict.lo FXFileList.lo FXFileSelector.lo FXFileStream.lo \ FXFoldingList.lo FXFont.lo FXFontDialog.lo FXFontSelector.lo \ FXFrame.lo FXGIFCursor.lo FXGIFIcon.lo FXGIFImage.lo \ FXGLCanvas.lo FXGLCone.lo FXGLContext.lo FXGLCube.lo \ FXGLCylinder.lo FXGLObject.lo FXGLShape.lo FXGLSphere.lo \ FXGLTriangleMesh.lo FXGLViewer.lo FXGLVisual.lo \ FXGradientBar.lo FXGroupBox.lo FXGUISignal.lo \ FXGZFileStream.lo FXHash.lo FXHeader.lo FXHorizontalFrame.lo \ FXICOIcon.lo FXICOImage.lo FXIFFIcon.lo FXIFFImage.lo \ FXIcon.lo FXIconDict.lo FXIconList.lo FXIconSource.lo FXId.lo \ FXImage.lo FXImageFrame.lo FXImageView.lo FXInputDialog.lo \ FXIO.lo FXJPGIcon.lo FXJPGImage.lo FXKnob.lo FXLabel.lo \ FXList.lo FXListBox.lo FXMDIButton.lo FXMDIChild.lo \ FXMDIClient.lo FXMainWindow.lo FXMat3d.lo FXMat4d.lo \ FXMat3f.lo FXMat4f.lo FXMatrix.lo FXMemMap.lo \ FXMemoryStream.lo FXMenuBar.lo FXMenuButton.lo \ FXMenuCaption.lo FXMenuCascade.lo FXMenuCheck.lo \ FXMenuRadio.lo FXMenuCommand.lo FXMenuPane.lo \ FXMenuSeparator.lo FXMenuTitle.lo FXMessageBox.lo FXObject.lo \ FXObjectList.lo FXOptionMenu.lo FXPCXIcon.lo FXPCXImage.lo \ FXPNGIcon.lo FXPNGImage.lo FXPPMIcon.lo FXPPMImage.lo \ FXPacker.lo FXPath.lo FXPicker.lo FXPipe.lo FXPopup.lo \ FXPoint.lo FXPrintDialog.lo FXProgressBar.lo \ FXProgressDialog.lo FXQuatd.lo FXQuatf.lo FXRASIcon.lo \ FXRASImage.lo FXRGBIcon.lo FXRGBImage.lo FXRadioButton.lo \ FXRangef.lo FXRanged.lo FXRealSlider.lo FXRealSpinner.lo \ FXRecentFiles.lo FXRectangle.lo FXRegion.lo FXRegistry.lo \ FXReplaceDialog.lo FXRex.lo FXRootWindow.lo FXRuler.lo \ FXRulerView.lo FXScrollArea.lo FXScrollBar.lo FXScrollPane.lo \ FXScrollWindow.lo FXSearchDialog.lo FXSeparator.lo \ FXSettings.lo FXShell.lo FXShutter.lo FXSize.lo FXSlider.lo \ FXSocket.lo FXSpinner.lo FXSpheref.lo FXSphered.lo \ FXSplashWindow.lo FXSplitter.lo FXSpring.lo FXStat.lo \ FXStatusBar.lo FXStatusLine.lo FXStream.lo FXString.lo \ FXStringDict.lo FXSwitcher.lo FXSystem.lo FXTGAIcon.lo \ FXTGAImage.lo FXTIFIcon.lo FXTIFImage.lo FXTabBar.lo \ FXTabBook.lo FXTabItem.lo FXTable.lo FXText.lo FXTextCodec.lo \ FXTextField.lo FXThread.lo FXToggleButton.lo FXToolBar.lo \ FXToolBarGrip.lo FXToolBarShell.lo FXToolBarTab.lo \ FXToolTip.lo FXTopWindow.lo FXTranslator.lo FXTreeList.lo \ FXTreeListBox.lo FXTriStateButton.lo FXUndoList.lo FXURL.lo \ FXVec2d.lo FXVec2f.lo FXVec3d.lo FXVec3f.lo FXVec4d.lo \ FXVec4f.lo FXVerticalFrame.lo FXVisual.lo FXWindow.lo \ FXWizard.lo FXXBMIcon.lo FXXBMImage.lo FXXPMIcon.lo \ FXXPMImage.lo fxascii.lo fxbmpio.lo fxfilematch.lo fxgifio.lo \ fxicoio.lo fxiffio.lo fxjpegio.lo fxkeyboard.lo fxkeysym.lo \ fxparsegeometry.lo fxpcxio.lo fxpngio.lo fxppmio.lo fxpriv.lo \ fxpsio.lo fxfsquantize.lo fxezquantize.lo fxwuquantize.lo \ fxrasio.lo fxrgbio.lo fxtargaio.lo fxtifio.lo fxunicode.lo \ fxutils.lo fxxbmio.lo fxxpmio.lo icons.lo strtoll.lo \ vsscanf.lo $(am__objects_2) $(am__objects_2) libFOX_1_6_la_OBJECTS = $(am_libFOX_1_6_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libFOX_1_6_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(libFOX_1_6_la_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libFOX_1_6_la_SOURCES) DIST_SOURCES = $(libFOX_1_6_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/version.rc.in \ $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include RESWRAP = $(top_builddir)/utils/reswrap SUFFIXES = .gif .bmp lib_LTLIBRARIES = libFOX-1.6.la libFOX_1_6_la_LIBADD = $(X_LIBS) $(X_BASE_LIBS) $(X_EXTRA_LIBS) $(GL_LIBS) libFOX_1_6_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ -export-dynamic \ -no-undefined CURSORS = \ crosshair.xbm \ crosshair_mask.xbm \ dndcopy.xbm \ dndcopy_mask.xbm \ dndlink.xbm \ dndlink_mask.xbm \ dndmove.xbm \ dndmove_mask.xbm \ dontdrop.xbm \ dontdrop_mask.xbm \ drag.xbm \ drag_mask.xbm \ gray.xbm \ hand.xbm \ hand_mask.xbm \ helparrow.xbm \ helparrow_mask.xbm \ hsplit.xbm \ hsplit_mask.xbm \ move.xbm \ move_mask.xbm \ ne.xbm \ ne_mask.xbm \ se.xbm \ se_mask.xbm \ sw.xbm \ sw_mask.xbm \ nw.xbm \ nw_mask.xbm \ resizeleft.xbm \ resizeleft_mask.xbm \ resizetop.xbm \ resizetop_mask.xbm \ resizetopleft.xbm \ resizetopleft_mask.xbm \ resizetopright.xbm \ resizetopright_mask.xbm \ rotate.xbm \ rotate_mask.xbm \ swatch.xbm \ swatch_mask.xbm \ vsplit.xbm \ vsplit_mask.xbm \ xsplit.xbm \ xsplit_mask.xbm ICONS = \ arrownext.gif \ arrowprev.gif \ bigapp.gif \ bigcdrom.gif \ bigcomputer.gif \ bigdesktop.gif \ bigdoc.gif \ bigfloppy.gif \ bigfolder.gif \ bigfolderopen.gif \ bignetdrive.gif \ bignethood.gif \ bookset.gif \ bookclr.gif \ cmymode.gif \ dialmode.gif \ dirupicon.gif \ deleteicon.gif \ docktop.gif \ dockbottom.gif \ dockleft.gif \ dockright.gif \ dockfree.gif \ dockflip.gif \ entericon.gif \ erroricon.gif \ eyedrop.gif \ filecopy.gif \ filemove.gif \ filehidden.gif \ filelink.gif \ filerename.gif \ filedelete.gif \ fileshown.gif \ foldernew.gif \ gotohome.gif \ gotoicon.gif \ gotowork.gif \ hsvmode.gif \ infoicon.gif \ landscape.gif \ listmode.gif \ miniapp.gif \ minicdrom.gif \ minicomputer.gif \ minidesktop.gif \ minidoc.gif \ minifloppy.gif \ minifolder.gif \ minifolderopen.gif \ miniharddisk.gif \ mininetdrive.gif \ mininethood.gif \ minizipdrive.gif \ portrait.gif \ questionicon.gif \ rgbmode.gif \ searchicon.gif \ showbigicons.gif \ showdetails.gif \ showsmallicons.gif \ warningicon.gif \ winclose.gif \ winmaximize.gif \ winminimize.gif \ winrestore.gif CODECS = \ FX88591Codec.cpp \ FX88592Codec.cpp \ FX88593Codec.cpp \ FX88594Codec.cpp \ FX88595Codec.cpp \ FX88596Codec.cpp \ FX88597Codec.cpp \ FX88598Codec.cpp \ FX88599Codec.cpp \ FX885910Codec.cpp \ FX885911Codec.cpp \ FX885913Codec.cpp \ FX885914Codec.cpp \ FX885915Codec.cpp \ FX885916Codec.cpp \ FXCP437Codec.cpp \ FXCP850Codec.cpp \ FXCP852Codec.cpp \ FXCP855Codec.cpp \ FXCP856Codec.cpp \ FXCP857Codec.cpp \ FXCP860Codec.cpp \ FXCP861Codec.cpp \ FXCP862Codec.cpp \ FXCP863Codec.cpp \ FXCP864Codec.cpp \ FXCP865Codec.cpp \ FXCP866Codec.cpp \ FXCP869Codec.cpp \ FXCP874Codec.cpp \ FXCP1250Codec.cpp \ FXCP1251Codec.cpp \ FXCP1252Codec.cpp \ FXCP1253Codec.cpp \ FXCP1254Codec.cpp \ FXCP1255Codec.cpp \ FXCP1256Codec.cpp \ FXCP1257Codec.cpp \ FXCP1258Codec.cpp \ FXKOI8RCodec.cpp \ FXUTF8Codec.cpp \ FXUTF16Codec.cpp \ FXUTF32Codec.cpp libFOX_1_6_la_SOURCES = \ $(CODECS) \ FX4Splitter.cpp \ FX7Segment.cpp \ FXAccelTable.cpp \ FXApp.cpp \ FXArrowButton.cpp \ FXBMPIcon.cpp \ FXBMPImage.cpp \ FXBitmap.cpp \ FXBitmapFrame.cpp \ FXBitmapView.cpp \ FXButton.cpp \ FXBZFileStream.cpp \ FXCURCursor.cpp \ FXCanvas.cpp \ FXCheckButton.cpp \ FXChoiceBox.cpp \ FXColorBar.cpp \ FXColorDialog.cpp \ FXColorList.cpp \ FXColorNames.cpp \ FXColorRing.cpp \ FXColorSelector.cpp \ FXColorWell.cpp \ FXColorWheel.cpp \ FXComboBox.cpp \ FXComposeContext.cpp \ FXComposite.cpp \ FXCursor.cpp \ FXDataTarget.cpp \ FXDate.cpp \ FXDC.cpp \ FXDCPrint.cpp \ FXDCWindow.cpp \ FXDLL.cpp \ FXDebugTarget.cpp \ FXDelegator.cpp \ FXDial.cpp \ FXDialogBox.cpp \ FXDict.cpp \ FXDir.cpp \ FXDirBox.cpp \ FXDirDialog.cpp \ FXDirList.cpp \ FXDirSelector.cpp \ FXDockBar.cpp \ FXDockSite.cpp \ FXDockHandler.cpp \ FXDockTitle.cpp \ FXDocument.cpp \ FXDragCorner.cpp \ FXDrawable.cpp \ FXDriveBox.cpp \ FXException.cpp \ FXExpression.cpp \ FXExtentd.cpp \ FXExtentf.cpp \ FXFile.cpp \ FXFileDialog.cpp \ FXFileDict.cpp \ FXFileList.cpp \ FXFileSelector.cpp \ FXFileStream.cpp \ FXFoldingList.cpp \ FXFont.cpp \ FXFontDialog.cpp \ FXFontSelector.cpp \ FXFrame.cpp \ FXGIFCursor.cpp \ FXGIFIcon.cpp \ FXGIFImage.cpp \ FXGLCanvas.cpp \ FXGLCone.cpp \ FXGLContext.cpp \ FXGLCube.cpp \ FXGLCylinder.cpp \ FXGLObject.cpp \ FXGLShape.cpp \ FXGLSphere.cpp \ FXGLTriangleMesh.cpp \ FXGLViewer.cpp \ FXGLVisual.cpp \ FXGradientBar.cpp \ FXGroupBox.cpp \ FXGUISignal.cpp \ FXGZFileStream.cpp \ FXHash.cpp \ FXHeader.cpp \ FXHorizontalFrame.cpp \ FXICOIcon.cpp \ FXICOImage.cpp \ FXIFFIcon.cpp \ FXIFFImage.cpp \ FXIcon.cpp \ FXIconDict.cpp \ FXIconList.cpp \ FXIconSource.cpp \ FXId.cpp \ FXImage.cpp \ FXImageFrame.cpp \ FXImageView.cpp \ FXInputDialog.cpp \ FXIO.cpp \ FXJPGIcon.cpp \ FXJPGImage.cpp \ FXKnob.cpp \ FXLabel.cpp \ FXList.cpp \ FXListBox.cpp \ FXMDIButton.cpp \ FXMDIChild.cpp \ FXMDIClient.cpp \ FXMainWindow.cpp \ FXMat3d.cpp \ FXMat4d.cpp \ FXMat3f.cpp \ FXMat4f.cpp \ FXMatrix.cpp \ FXMemMap.cpp \ FXMemoryStream.cpp \ FXMenuBar.cpp \ FXMenuButton.cpp \ FXMenuCaption.cpp \ FXMenuCascade.cpp \ FXMenuCheck.cpp \ FXMenuRadio.cpp \ FXMenuCommand.cpp \ FXMenuPane.cpp \ FXMenuSeparator.cpp \ FXMenuTitle.cpp \ FXMessageBox.cpp \ FXObject.cpp \ FXObjectList.cpp \ FXOptionMenu.cpp \ FXPCXIcon.cpp \ FXPCXImage.cpp \ FXPNGIcon.cpp \ FXPNGImage.cpp \ FXPPMIcon.cpp \ FXPPMImage.cpp \ FXPacker.cpp \ FXPath.cpp \ FXPicker.cpp \ FXPipe.cpp \ FXPopup.cpp \ FXPoint.cpp \ FXPrintDialog.cpp \ FXProgressBar.cpp \ FXProgressDialog.cpp \ FXQuatd.cpp \ FXQuatf.cpp \ FXRASIcon.cpp \ FXRASImage.cpp \ FXRGBIcon.cpp \ FXRGBImage.cpp \ FXRadioButton.cpp \ FXRangef.cpp \ FXRanged.cpp \ FXRealSlider.cpp \ FXRealSpinner.cpp \ FXRecentFiles.cpp \ FXRectangle.cpp \ FXRegion.cpp \ FXRegistry.cpp \ FXReplaceDialog.cpp \ FXRex.cpp \ FXRootWindow.cpp \ FXRuler.cpp \ FXRulerView.cpp \ FXScrollArea.cpp \ FXScrollBar.cpp \ FXScrollPane.cpp \ FXScrollWindow.cpp \ FXSearchDialog.cpp \ FXSeparator.cpp \ FXSettings.cpp \ FXShell.cpp \ FXShutter.cpp \ FXSize.cpp \ FXSlider.cpp \ FXSocket.cpp \ FXSpinner.cpp \ FXSpheref.cpp \ FXSphered.cpp \ FXSplashWindow.cpp \ FXSplitter.cpp \ FXSpring.cpp \ FXStat.cpp \ FXStatusBar.cpp \ FXStatusLine.cpp \ FXStream.cpp \ FXString.cpp \ FXStringDict.cpp \ FXSwitcher.cpp \ FXSystem.cpp \ FXTGAIcon.cpp \ FXTGAImage.cpp \ FXTIFIcon.cpp \ FXTIFImage.cpp \ FXTabBar.cpp \ FXTabBook.cpp \ FXTabItem.cpp \ FXTable.cpp \ FXText.cpp \ FXTextCodec.cpp \ FXTextField.cpp \ FXThread.cpp \ FXToggleButton.cpp \ FXToolBar.cpp \ FXToolBarGrip.cpp \ FXToolBarShell.cpp \ FXToolBarTab.cpp \ FXToolTip.cpp \ FXTopWindow.cpp \ FXTranslator.cpp \ FXTreeList.cpp \ FXTreeListBox.cpp \ FXTriStateButton.cpp \ FXUndoList.cpp \ FXURL.cpp \ FXVec2d.cpp \ FXVec2f.cpp \ FXVec3d.cpp \ FXVec3f.cpp \ FXVec4d.cpp \ FXVec4f.cpp \ FXVerticalFrame.cpp \ FXVisual.cpp \ FXWindow.cpp \ FXWizard.cpp \ FXXBMIcon.cpp \ FXXBMImage.cpp \ FXXPMIcon.cpp \ FXXPMImage.cpp \ fxascii.cpp \ fxbmpio.cpp \ fxfilematch.cpp \ fxgifio.cpp \ fxicoio.cpp \ fxiffio.cpp \ fxjpegio.cpp \ fxkeyboard.cpp \ fxkeysym.cpp \ fxparsegeometry.cpp \ fxpcxio.cpp \ fxpngio.cpp \ fxppmio.cpp \ fxpriv.cpp \ fxpsio.cpp \ fxfsquantize.cpp \ fxezquantize.cpp \ fxwuquantize.cpp \ fxrasio.cpp \ fxrgbio.cpp \ fxtargaio.cpp \ fxtifio.cpp \ fxunicode.cpp \ fxutils.cpp \ fxxbmio.cpp \ fxxpmio.cpp \ icons.cpp \ strtoll.cpp \ vsscanf.cpp \ icons.h \ jitter.h \ version.rc \ version.rc.in \ fxpriv.h \ $(CURSORS) \ $(ICONS) EXTRA_DIST = Makefile.bc \ Makefile.bc.resp \ Makefile.dmc \ Makefile.wc \ Makefile.dmc.resp all: all-am .SUFFIXES: .SUFFIXES: .gif .bmp .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): version.rc: $(top_builddir)/config.status $(srcdir)/version.rc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libFOX-1.6.la: $(libFOX_1_6_la_OBJECTS) $(libFOX_1_6_la_DEPENDENCIES) $(EXTRA_libFOX_1_6_la_DEPENDENCIES) $(AM_V_CXXLD)$(libFOX_1_6_la_LINK) -rpath $(libdir) $(libFOX_1_6_la_OBJECTS) $(libFOX_1_6_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX4Splitter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX7Segment.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX885910Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX885911Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX885913Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX885914Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX885915Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX885916Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX88591Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX88592Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX88593Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX88594Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX88595Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX88596Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX88597Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX88598Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FX88599Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXAccelTable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXApp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXArrowButton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXBMPIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXBMPImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXBZFileStream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXBitmap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXBitmapFrame.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXBitmapView.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXButton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP1250Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP1251Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP1252Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP1253Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP1254Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP1255Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP1256Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP1257Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP1258Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP437Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP850Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP852Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP855Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP856Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP857Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP860Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP861Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP862Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP863Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP864Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP865Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP866Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP869Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCP874Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCURCursor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCanvas.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCheckButton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXChoiceBox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXColorBar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXColorDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXColorList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXColorNames.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXColorRing.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXColorSelector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXColorWell.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXColorWheel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXComboBox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXComposeContext.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXComposite.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXCursor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDC.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDCPrint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDCWindow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDLL.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDataTarget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDebugTarget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDelegator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDialogBox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDict.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDir.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDirBox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDirDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDirList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDirSelector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDockBar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDockHandler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDockSite.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDockTitle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDocument.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDragCorner.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDrawable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXDriveBox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXException.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXExpression.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXExtentd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXExtentf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXFile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXFileDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXFileDict.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXFileList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXFileSelector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXFileStream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXFoldingList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXFont.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXFontDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXFontSelector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXFrame.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGIFCursor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGIFIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGIFImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGLCanvas.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGLCone.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGLContext.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGLCube.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGLCylinder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGLObject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGLShape.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGLSphere.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGLTriangleMesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGLViewer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGLVisual.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGUISignal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGZFileStream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGradientBar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXGroupBox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXHash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXHeader.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXHorizontalFrame.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXICOIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXICOImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXIFFIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXIFFImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXIO.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXIconDict.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXIconList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXIconSource.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXId.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXImageFrame.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXImageView.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXInputDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXJPGIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXJPGImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXKOI8RCodec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXKnob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXLabel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXListBox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMDIButton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMDIChild.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMDIClient.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMainWindow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMat3d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMat3f.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMat4d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMat4f.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMatrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMemMap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMemoryStream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMenuBar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMenuButton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMenuCaption.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMenuCascade.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMenuCheck.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMenuCommand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMenuPane.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMenuRadio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMenuSeparator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMenuTitle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXMessageBox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXObject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXObjectList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXOptionMenu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPCXIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPCXImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPNGIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPNGImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPPMIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPPMImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPacker.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPath.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPicker.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPipe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPoint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPopup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXPrintDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXProgressBar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXProgressDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXQuatd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXQuatf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRASIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRASImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRGBIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRGBImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRadioButton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRanged.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRangef.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRealSlider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRealSpinner.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRecentFiles.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRectangle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRegion.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRegistry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXReplaceDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRootWindow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRuler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXRulerView.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXScrollArea.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXScrollBar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXScrollPane.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXScrollWindow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSearchDialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSeparator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSettings.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXShell.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXShutter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSlider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSocket.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSphered.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSpheref.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSpinner.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSplashWindow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSplitter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSpring.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXStat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXStatusBar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXStatusLine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXStream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXString.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXStringDict.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSwitcher.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXSystem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTGAIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTGAImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTIFIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTIFImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTabBar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTabBook.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTabItem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXText.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTextCodec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTextField.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXThread.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXToggleButton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXToolBar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXToolBarGrip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXToolBarShell.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXToolBarTab.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXToolTip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTopWindow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTranslator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTreeList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTreeListBox.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXTriStateButton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXURL.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXUTF16Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXUTF32Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXUTF8Codec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXUndoList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXVec2d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXVec2f.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXVec3d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXVec3f.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXVec4d.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXVec4f.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXVerticalFrame.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXVisual.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXWindow.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXWizard.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXXBMIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXXBMImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXXPMIcon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FXXPMImage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxascii.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxbmpio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxezquantize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxfilematch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxfsquantize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxgifio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxicoio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxiffio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxjpegio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxkeyboard.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxkeysym.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxparsegeometry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxpcxio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxpngio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxppmio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxpriv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxpsio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxrasio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxrgbio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxtargaio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxtifio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxunicode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxutils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxwuquantize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxxbmio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxxpmio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icons.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtoll.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsscanf.Plo@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES .PRECIOUS: Makefile FXApp.cpp: icons.h icons.h: $(ICONS) $(RESWRAP) -i -n FX -o icons.h $(ICONS) icons.cpp: $(ICONS) $(RESWRAP) -e -n FX -o icons.cpp $(ICONS) # 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: fox1.6-1.6.57/src/Makefile.wc000066400000000000000000000246521326741342000155050ustar00rootroot00000000000000############################################################################## # # # FOX: A Free C++ Class Library for X # # # ############################################################################## # Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. # ############################################################################## # $Id: Makefile.wc,v 1.35.2.2 2006/08/09 01:55:08 fox Exp $ # ############################################################################## # 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., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################## CXX = wpp386 RM = del LIB = wlib TOPDIR = .. # Uncomment the following two lines for debug builds... #CXXFLAGS = /d3 /w3 #DEFINES = -DFOX_BIGENDIAN=0 -DWIN32 -D_WINDOWS -DHAVE_OPENGL # Uncomment the following two lines for release builds... CXXFLAGS = /w3 /e1 /zq /5r /ei /xs /xr /fp5 /otexan /zp=4 DEFINES = -DFOX_BIGENDIAN=0 -DNDEBUG -D_WINDOWS -DWIN32 -DUNICODE -DHAVE_GL_H -DHAVE_GLU_H -DHAVE_VSSCANF -DHAVE_STRTOLL -DHAVE_STRTOULL #-DHAVE_PNG_H -DHAVE_JPEG_H -DHAVE_TIFF_H -DXMD_H INCDIRS = -I$(TOPDIR)\include LIBFLAGS = -c -n # -c = Case sensitive, -n = Always create new library FOXLIB = $(TOPDIR)\src\FOX-1.6.lib OBJECTS = FX4Splitter.obj OBJECTS += FX7Segment.obj OBJECTS += FX885910Codec.obj OBJECTS += FX885911Codec.obj OBJECTS += FX885913Codec.obj OBJECTS += FX885914Codec.obj OBJECTS += FX885915Codec.obj OBJECTS += FX885916Codec.obj OBJECTS += FX88591Codec.obj OBJECTS += FX88592Codec.obj OBJECTS += FX88593Codec.obj OBJECTS += FX88594Codec.obj OBJECTS += FX88595Codec.obj OBJECTS += FX88596Codec.obj OBJECTS += FX88597Codec.obj OBJECTS += FX88598Codec.obj OBJECTS += FX88599Codec.obj OBJECTS += FXAccelTable.obj OBJECTS += FXApp.obj OBJECTS += FXArrowButton.obj OBJECTS += fxascii.obj OBJECTS += FXBitmap.obj OBJECTS += FXBitmapFrame.obj OBJECTS += FXBitmapView.obj OBJECTS += FXBMPIcon.obj OBJECTS += FXBMPImage.obj OBJECTS += fxbmpio.obj OBJECTS += FXButton.obj OBJECTS += FXBZFileStream.obj OBJECTS += FXCanvas.obj OBJECTS += FXCheckButton.obj OBJECTS += FXChoiceBox.obj OBJECTS += FXColorBar.obj OBJECTS += FXColorDialog.obj OBJECTS += FXColorList.obj OBJECTS += FXColorNames.obj OBJECTS += FXColorRing.obj OBJECTS += FXColorSelector.obj OBJECTS += FXColorWell.obj OBJECTS += FXColorWheel.obj OBJECTS += FXComboBox.obj OBJECTS += FXComposeContext.obj OBJECTS += FXComposite.obj OBJECTS += FXCP1250Codec.obj OBJECTS += FXCP1251Codec.obj OBJECTS += FXCP1252Codec.obj OBJECTS += FXCP1253Codec.obj OBJECTS += FXCP1254Codec.obj OBJECTS += FXCP1255Codec.obj OBJECTS += FXCP1256Codec.obj OBJECTS += FXCP1257Codec.obj OBJECTS += FXCP1258Codec.obj OBJECTS += FXCP437Codec.obj OBJECTS += FXCP850Codec.obj OBJECTS += FXCP852Codec.obj OBJECTS += FXCP855Codec.obj OBJECTS += FXCP856Codec.obj OBJECTS += FXCP857Codec.obj OBJECTS += FXCP860Codec.obj OBJECTS += FXCP861Codec.obj OBJECTS += FXCP862Codec.obj OBJECTS += FXCP863Codec.obj OBJECTS += FXCP864Codec.obj OBJECTS += FXCP865Codec.obj OBJECTS += FXCP866Codec.obj OBJECTS += FXCP869Codec.obj OBJECTS += FXCP874Codec.obj OBJECTS += FXCURCursor.obj OBJECTS += FXCursor.obj OBJECTS += FXDataTarget.obj OBJECTS += FXDate.obj OBJECTS += FXDC.obj OBJECTS += FXDCPrint.obj OBJECTS += FXDCWindow.obj OBJECTS += FXDebugTarget.obj OBJECTS += FXDelegator.obj OBJECTS += FXDial.obj OBJECTS += FXDialogBox.obj OBJECTS += FXDict.obj OBJECTS += FXDir.obj OBJECTS += FXDirBox.obj OBJECTS += FXDirDialog.obj OBJECTS += FXDirList.obj OBJECTS += FXDirSelector.obj OBJECTS += FXDLL.obj OBJECTS += FXDockBar.obj OBJECTS += FXDockHandler.obj OBJECTS += FXDockSite.obj OBJECTS += FXDockTitle.obj OBJECTS += FXDocument.obj OBJECTS += FXDragCorner.obj OBJECTS += FXDrawable.obj OBJECTS += FXDriveBox.obj OBJECTS += FXException.obj OBJECTS += FXExpression.obj OBJECTS += FXExtentd.obj OBJECTS += FXExtentf.obj OBJECTS += fxezquantize.obj OBJECTS += FXFile.obj OBJECTS += FXFileDialog.obj OBJECTS += FXFileDict.obj OBJECTS += FXFileList.obj OBJECTS += fxfilematch.obj OBJECTS += FXFileSelector.obj OBJECTS += FXFileStream.obj OBJECTS += FXFoldingList.obj OBJECTS += FXFont.obj OBJECTS += FXFontDialog.obj OBJECTS += FXFontSelector.obj OBJECTS += FXFrame.obj OBJECTS += fxfsquantize.obj OBJECTS += FXGIFCursor.obj OBJECTS += FXGIFIcon.obj OBJECTS += FXGIFImage.obj OBJECTS += fxgifio.obj OBJECTS += FXGLCanvas.obj OBJECTS += FXGLCone.obj OBJECTS += FXGLContext.obj OBJECTS += FXGLCube.obj OBJECTS += FXGLCylinder.obj OBJECTS += FXGLObject.obj OBJECTS += FXGLShape.obj OBJECTS += FXGLSphere.obj OBJECTS += FXGLTriangleMesh.obj OBJECTS += FXGLViewer.obj OBJECTS += FXGLVisual.obj OBJECTS += FXGradientBar.obj OBJECTS += FXGroupBox.obj OBJECTS += FXGUISignal.obj OBJECTS += FXGZFileStream.obj OBJECTS += FXHash.obj OBJECTS += FXHeader.obj OBJECTS += FXHorizontalFrame.obj OBJECTS += FXICOIcon.obj OBJECTS += FXICOImage.obj OBJECTS += fxicoio.obj OBJECTS += FXIcon.obj OBJECTS += FXIconDict.obj OBJECTS += FXIconList.obj OBJECTS += FXIconSource.obj OBJECTS += FXId.obj OBJECTS += FXIFFIcon.obj OBJECTS += FXIFFImage.obj OBJECTS += fxiffio.obj OBJECTS += FXImage.obj OBJECTS += FXImageFrame.obj OBJECTS += FXImageView.obj OBJECTS += FXInputDialog.obj OBJECTS += FXIO.obj OBJECTS += fxjpegio.obj OBJECTS += FXJPGIcon.obj OBJECTS += FXJPGImage.obj OBJECTS += FXKnob.obj OBJECTS += FXKOI8RCodec.obj OBJECTS += FXLabel.obj OBJECTS += FXList.obj OBJECTS += FXListBox.obj OBJECTS += FXMainWindow.obj OBJECTS += FXMat3d.obj OBJECTS += FXMat3f.obj OBJECTS += FXMat4d.obj OBJECTS += FXMat4f.obj OBJECTS += FXMatrix.obj OBJECTS += FXMDIButton.obj OBJECTS += FXMDIChild.obj OBJECTS += FXMDIClient.obj OBJECTS += FXMemMap.obj OBJECTS += FXMemoryStream.obj OBJECTS += FXMenuBar.obj OBJECTS += FXMenuButton.obj OBJECTS += FXMenuCaption.obj OBJECTS += FXMenuCascade.obj OBJECTS += FXMenuCheck.obj OBJECTS += FXMenuCommand.obj OBJECTS += FXMenuPane.obj OBJECTS += FXMenuRadio.obj OBJECTS += FXMenuSeparator.obj OBJECTS += FXMenuTitle.obj OBJECTS += FXMessageBox.obj OBJECTS += FXObject.obj OBJECTS += FXObjectList.obj OBJECTS += FXOptionMenu.obj OBJECTS += FXPacker.obj OBJECTS += fxparsegeometry.obj OBJECTS += FXPath.obj OBJECTS += FXPCXIcon.obj OBJECTS += FXPCXImage.obj OBJECTS += fxpcxio.obj OBJECTS += FXPicker.obj OBJECTS += FXPipe.obj OBJECTS += FXPNGIcon.obj OBJECTS += FXPNGImage.obj OBJECTS += fxpngio.obj OBJECTS += FXPoint.obj OBJECTS += FXPopup.obj OBJECTS += FXPPMIcon.obj OBJECTS += FXPPMImage.obj OBJECTS += fxppmio.obj OBJECTS += FXPrintDialog.obj OBJECTS += fxpriv.obj OBJECTS += FXProgressBar.obj OBJECTS += FXProgressDialog.obj OBJECTS += fxpsio.obj OBJECTS += FXQuatd.obj OBJECTS += FXQuatf.obj OBJECTS += FXRadioButton.obj OBJECTS += FXRanged.obj OBJECTS += FXRangef.obj OBJECTS += FXRASIcon.obj OBJECTS += FXRASImage.obj OBJECTS += fxrasio.obj OBJECTS += FXRealSlider.obj OBJECTS += FXRealSpinner.obj OBJECTS += FXRecentFiles.obj OBJECTS += FXRectangle.obj OBJECTS += FXRegion.obj OBJECTS += FXRegistry.obj OBJECTS += FXReplaceDialog.obj OBJECTS += FXRex.obj OBJECTS += FXRGBIcon.obj OBJECTS += FXRGBImage.obj OBJECTS += fxrgbio.obj OBJECTS += FXRootWindow.obj OBJECTS += FXRuler.obj OBJECTS += FXRulerView.obj OBJECTS += FXScrollArea.obj OBJECTS += FXScrollBar.obj OBJECTS += FXScrollPane.obj OBJECTS += FXScrollWindow.obj OBJECTS += FXSearchDialog.obj OBJECTS += FXSeparator.obj OBJECTS += FXSettings.obj OBJECTS += FXShell.obj OBJECTS += FXShutter.obj OBJECTS += FXSize.obj OBJECTS += FXSlider.obj OBJECTS += FXSocket.obj OBJECTS += FXSphered.obj OBJECTS += FXSpheref.obj OBJECTS += FXSpinner.obj OBJECTS += FXSplashWindow.obj OBJECTS += FXSplitter.obj OBJECTS += FXSpring.obj OBJECTS += FXStat.obj OBJECTS += FXStatusBar.obj OBJECTS += FXStatusLine.obj OBJECTS += FXStream.obj OBJECTS += FXString.obj OBJECTS += FXStringDict.obj OBJECTS += FXSwitcher.obj OBJECTS += FXSystem.obj OBJECTS += FXTabBar.obj OBJECTS += FXTabBook.obj OBJECTS += FXTabItem.obj OBJECTS += FXTable.obj OBJECTS += fxtargaio.obj OBJECTS += FXText.obj OBJECTS += FXTextCodec.obj OBJECTS += FXTextField.obj OBJECTS += FXTGAIcon.obj OBJECTS += FXTGAImage.obj OBJECTS += FXThread.obj OBJECTS += FXTIFIcon.obj OBJECTS += FXTIFImage.obj OBJECTS += fxtifio.obj OBJECTS += FXToggleButton.obj OBJECTS += FXToolBar.obj OBJECTS += FXToolBarGrip.obj OBJECTS += FXToolBarShell.obj OBJECTS += FXToolBarTab.obj OBJECTS += FXToolTip.obj OBJECTS += FXTopWindow.obj OBJECTS += FXTranslator.obj OBJECTS += FXTreeList.obj OBJECTS += FXTreeListBox.obj OBJECTS += FXTriStateButton.obj OBJECTS += FXUndoList.obj OBJECTS += fxunicode.obj OBJECTS += FXURL.obj OBJECTS += FXUTF16Codec.obj OBJECTS += FXUTF32Codec.obj OBJECTS += FXUTF8Codec.obj OBJECTS += fxutils.obj OBJECTS += FXVec2d.obj OBJECTS += FXVec2f.obj OBJECTS += FXVec3d.obj OBJECTS += FXVec3f.obj OBJECTS += FXVec4d.obj OBJECTS += FXVec4f.obj OBJECTS += FXVerticalFrame.obj OBJECTS += FXVisual.obj OBJECTS += FXWindow.obj OBJECTS += fxkeyboard.obj OBJECTS += fxkeysym.obj OBJECTS += FXWizard.obj OBJECTS += fxwuquantize.obj OBJECTS += FXXBMIcon.obj OBJECTS += FXXBMImage.obj OBJECTS += fxxbmio.obj OBJECTS += FXXPMIcon.obj OBJECTS += FXXPMImage.obj OBJECTS += fxxpmio.obj OBJECTS += icons.obj OBJECTS += strtoll.obj OBJECTS += vsscanf.obj .cpp.obj: .AUTODEPEND $(CXX) $(INCDIRS) $(CXXFLAGS) $(DEFINES) $< all: $(FOXLIB) clean: .SYMBOLIC del $(FOXLIB) del *.err del *.obj # Make the library $(FOXLIB): $(OBJECTS) $(LIB) $(LIBFLAGS) $(FOXLIB) $(OBJECTS) fox1.6-1.6.57/src/arrownext.gif000066400000000000000000000001111326741342000161350ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙˙,"„Ź©Ë­Â'IíĄ@oč}L(FÂYš'6®śĹ6çĐ\;fox1.6-1.6.57/src/arrowprev.gif000066400000000000000000000001071326741342000161400ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙˙, „Ź©Ëí4AHXíĚşńľ|`(”#Y^^:Q§§n-T;fox1.6-1.6.57/src/bigapp.gif000066400000000000000000000002461326741342000153570ustar00rootroot00000000000000GIF87a €€€ŔŔŔ€˙˙˙, sşÜţ+A«˝8 Ĺř`(Ž$7‘hHëjziÚ ,ýĆi ďű«ýŔMB, '‚rÉl:›ÇÍsJUF“Ő,óŞí¸Ţ,8L“źć3ô…U;Ón+;ţžÓ·ö»|¨_ÂănjgQA&EŚD<Ź‘’; ;fox1.6-1.6.57/src/bigcdrom.gif000066400000000000000000000014131326741342000157000ustar00rootroot00000000000000GIF89a Őüţü„†„ĚţśüţśüţĚĚÎd´˛´´¶´dÎśĽş¬ÄĆĤ¦¤džśÔÖÔ„‚„4žĚ4Μĺ¬äâääćä4Î̜Μ¤˘¤śţĚĚÎĚśžś”–”ÜŢÜ\Z\424trtěęěTRTlnldbdüúűôňôěîěôöôžśtvtĚÎśĚţĚÎĚžĚdÎĚÔĘşÔÎĽ4š”,*,ĚÎübd¬Ş”ÜÎĽĚÎ4ţ†dždbŚŽŚPŻLí˙ Í!ů, ˙@€pHŽH¤ Čl ŹB`¨ÁŇé $(ŐŞ@,[.1Đř†ŁÖëqp¤ŐŹ†Ţ Żb wM{acs …Dz b~’‘h]™š‰ťŚ‚ ’X–¨›«c€‚ˇ¦E¸™›žTľŔˇ… ÇɛހÄO Řٸ!C Ňćé‘×, 0A„<" ŔHP†;4ŚÓ áE #ÎáÁ„)¸ó@ @3€}Đ($á° @hM!$@€pa‚˙nó:¬ăsf $ožŘŮÓ'‚Ýľá"ŞsH‹MâétśĎ#>T@ %&jIńÁŔ…ě™Qa€ŔŠ ,Čâ2Q‡4)ňM[Ŕđ 2¨°›©… \H¨đ"Ĺ „UڤxńŠ.Z Đ‹áŻLDŰ€xÁ ‹ Ü;úqš[3č^PN– H*‚ŰMPA´h€ý2 đĘuât7Ž!ăĂíI‚őéËwaFâŕ±gÓ¨Nmn;ZҧPŁŽ 7ě®HŕMPy!¸'¨9Ő›˙˘p¨q€94 śă Ěů4 nčĂ‘D"Č, tx(úĽ"`r ŘÓá‰&˘X≊’Ć(ăŚ.`‰z8ć¨czL;fox1.6-1.6.57/src/bigcomputer.gif000066400000000000000000000020531326741342000164330ustar00rootroot00000000000000GIF89a ć˙˙˙dR4śžŇśŽÔ&$&ĚÎüüţ¤ěâĚdd :8:ěÖÄüţüäćăD2<žÎędbüd2ś42Ă4ś44bľ¶·µdbˇdžÝdÎüdţü4žđ4Îůśţü¬«šÎü42džśžéśžĚţü„†„„ztdÎĂ4büĚîü„†¬®¬śb4aaad2––e31«šlńîçśZ$)dSźĺÜÉÔÎĽlf\lnlśbdśr$ĚÎd"$|ž|Trt+ď@PŻLX$ ąL8í˙üÝ@ ąLX$ř†'¤ţ!¤ Xí˙†¬ř$ ąLë8Xŕ0őPŻLxí˙ Í™+ď@PŻLŕ`! ąLí˙üÝ@ ąLŕ`!ř$¤ţI¤ ¸í˙†¬! ąLë8Xŕ0őPŻLŘí˙ Í™+ď@PŻLČN$ ąL+ď@PŻL°a$ ąLî˙üÝ@ ąL°a$î˙†¬!ů, ˙€†…‡†‹Š‚‘—šś›žť’   Ş­ ݱ°ł– ’¦ —ÁÂĂ—¶‘ ą ÓÓ×Č‚ĘË•čęÔÚÚÜŕ’ ÍçëęčÔďâÉŁ—ě^>Đ4ôcGíÁ; ń*t (NŔ˝rüúýsČáĂ6nĂáÁbłÓ4˘“ö)p`Q@Ą„é6jp÷îcL‘ F\€AÚż•ízş„IBfBož«F­]Ź+4:bŔfТ=FÖ]¶m/µ:…j“(‡k×˙ŢĘ=»AÄ6µ" ”€ęÁŔ!B¤k·.ŢzLX\p‚[…Ç!Ł\a "G^(Ń·@‡źI,MÚ@ЧIXYł bXʶ€Ű,´@ŕ"% Nśř‹â ‚ŹJŁ‚ 1‚_ž ňč2°păB‚[šł¸ @ňń3f˘±€Fă…ł PăB2ái¸/ŕÁ{Ń@Ćp¨§ 6s~î)`Ę„* ,úá`!&Ň‚8-\ BŔđ‚‰&"€ŠŢµ¨Ý/ćN :\ ę]ŕAn´`ÓměP@3<Ç €đa$´P@wŔ¨ 4ŔBîŮ„ŔCÎŔIŽb ô7^(6yC6±¦=$XŔ’Łŕťs4P) >@Ăš6•’’,Ě @ŁC ę Ěé¤3ô°Ł;ŔÖ_˘üP …âp‰¨±Ă 0^ j7p*ްĆ*ëAĚzA ;fox1.6-1.6.57/src/bigdesktop.gif000066400000000000000000000007751326741342000162570ustar00rootroot00000000000000GIF89a Ä˙˙˙˙RR˙śÎ˙Î1ÎśśśÎcś1ś­­”˙˙ś˙Îś˙˙cÎ˙ÎÎś˙˙Îśc1cÎ1ś„„„1Δ””sssśścĆĆĆ1cśÎ˙˙BBB1c˙µµµ!ů, ˙ ŽdiŽ0g뎅1‰Ü8’(Kď˙ľŁa0ü ÇăqŰAH@4BŤ$sBŃ2uŠçh*­X퍫‹EäŞu­@Ö‰.Î •–©giv yHn}Sft„†z|"—u‘ť’]•–'Wś„¦¨]aP&¤Źžť¨F}­$hYʧ„ł µ cR¸#Y °§Ŕ´¶~QĆ"Ę˝˛¨ Á¶qÓ×~ËÎŰÂqÓQ ě°łÜńÝĂŚéŃâíďÚňĎ őédŘ Ľfgß¶ÂţPiµ®ťĂqĺÍ“ł°á@wvJ솀"„V>ŇxĐdžDU"z]9IN&éŘ鼛Fn\€ŕLhFč@´¨Ń.ąÁd"S B@˘úPÚŁç ™Kšř‚G’*Ď/°Ţđŕ!Ał%«‚Ý s,ŮCżĐzµŠ ,[‡ňęĹŔ·Żßľl .B¸°áĂX̸±ăÇż<9;fox1.6-1.6.57/src/bigdoc.gif000066400000000000000000000002641326741342000153440ustar00rootroot00000000000000GIF89a ˘˙˙˙€€€˙˙˙ŔŔŔŢ !ů, y Ńţđ­I™¸8ëF­Á&fŤ÷-á8Dw*©ş…­ůĹ2yŐ'žs đö“l_1s$.EMĐŠDM7QŠršM^5]농ÉUóYP¶¬ŰŰ'|ÍN»Ďó·=ľĚă÷t~c‚_„W†\€z7ŤŽŹ‘ŤvB•–— ;fox1.6-1.6.57/src/bigfloppy.gif000066400000000000000000000007031326741342000161060ustar00rootroot00000000000000GIF89a Ä˙˙˙üţü„†„´˛´žśÄĆÄ„‚„śţü´¶´Ěţü”–”trtĚÎĚtvt¤˘¤¤¦¤ěęěěćÜÜŢÜäâäÔÖÔüś2ĚÎślnlÔÎĽ„Ľş¬üúűě˙ô !ů, ˙ ŽdižhŞ®l[p,ϰ`ß8Nď˛ „ pX0x<_Ál:FäÎH(®Řlń(ť) °8¬H¸Ý/ál#¶é^  5Łăk·sŤ×ćVcb g~0T ŠŚ‹„|wi>  —— „†5 ꎠŁk  — 5±ł˛µ± ¨ ¸† ĂÄĹĹĄ  ʬ®F>~´FŐŐ´>Ű   ĺÖčéŐŃÝńĺőć—§|\>ݶ͛@0ś˝r\ŘĐ`? ţÁx׍B3Ę2— A ůiâB%‚-ŚęŞ@Éše ‘˙ěH©JNčŽG…Ž@>ŚÉ.†ŁH“*]Šô,[P§E]),Í«WiÝʵ«×Ż;B;fox1.6-1.6.57/src/bigfolder.gif000066400000000000000000000004351326741342000160520ustar00rootroot00000000000000GIF89a łüţüśžüţ¤ĚÎdőĐ’42üÎĚŢÇ|Ńşx WgŚ -H!ů, ĘČI«˝8ë-˙źŔe0śčcU¦đ°¶ÓĂs|ď˙ `°Ck‰l·ä©°D1 ¤rŔ¬:Ż‚A:Ť1©ß–۵6ťc“҆±Ó]7u~nŐŢTű ¦Â§_fWzes}~wIl}mvR{ŚŽU…|tšY‹”†–•sp‚śN–U–rtUuŞŠ6¦M`‚ž%{·KąÁź›ľ±ŔL¬­wŤ›Čl˘»?Ö×>Ú <âăäĺćçâEęëěí;fox1.6-1.6.57/src/bigfolderopen.gif000066400000000000000000000004661326741342000167400ustar00rootroot00000000000000GIF89a ł˙˙˙üţüś›ôóôĚÎdüţśüÎś„… WgŚ1 -H!ů, ăČI«˝8ëşB(Š_ižÂ¨Kg\ÂEmŰŻ,§w_çşYŔW3 Ż‘öá},ÖŠuh{ĆBÖ¸Ő ‚jÇůôeż…°‡fëz˝]®V˝¬Ű•řkůŁS-‚-|/|eenFa‡‰hgrsŽOgDF•aŹXrzZś‡ ‰˘7‹|UźX—‹zž®mаośt¨ąˇ^»bݶ—Zq¬ÂG°©[\łĘŞp“ÎzrśŇoĹĆm׬kÓŐEÖ×zác©pÄŁç×jcwóő#bŃűüýţ˙A H°`Á;fox1.6-1.6.57/src/bignetdrive.gif000066400000000000000000000005711326741342000164200ustar00rootroot00000000000000GIF89a Äüţü˙˙˙trttvt”–”„†„´˛´´¶´„‚„ěęěäâäÔÖÔĚÎĚÄĆĤ¦¤ţ†śžśÜŢÜ4b¤˘¤ÜŇÁÔĘş„†„‚üţśüţüÎdĚž4ě˙ô !ů, ö ŽdižhަAëľp,ĎtMŻx. {Ď˙ľ pPŽČ¤r™F†Bz¨ZŻŘlÂ)2äp(Śtcíh#ŢHíŕť¨× m‚pqacehj„r›xz] ˘Ł<٦§ŠŚ{e_'wyc^ˇB¶C˘Ş {}Ż&±ž|ĹĆÇĹxc| ÎĐĎŇŃÔÓĚ"ŮÚŰÜÝÜżŘ {ŕ*ăä( çŻ^ďđńôńřđ|‚ţ‚4lŕСŔżü<ń¦-ĂŔn€E·t3jÜȱŁGŹ!;fox1.6-1.6.57/src/bignethood.gif000066400000000000000000000021421326741342000162340ustar00rootroot00000000000000GIF89a ć˙˙˙Ľ2Î2<ľ<üţüĚţÉ4ţd4ž4bédSźdb˘dţśR:89„†„đíçüţ¤ĚÎüţ4Î4bb„–„ÔÎĽdžÜśbś42HGHĚîü¬ţ¬5c5ží4ÎüśţüdţüdÎüťÎćUţU†––dbü $ÄŢÄĚţübŐ4ţü v .e™4žńlnlf40"$fĚÎdĚťĚ2gd1śžd4"iĺÜÉ4Îd%#&¬®­ëÖÄäćäÄĆÄÖ×Ô42dR```XVXd2lf\śb4śžÓśŽÔśšd™™füf¶¶łŘÚř42d22ŔśÎśŞ©śÍž›)„†D2<ĎƶüÎĚśbd„zt¸`&¤ţI¤ ¸í˙†¬ ąLë8Xŕ0őPŻLŘí˙ Í™+ď@PŻLpy& ąL+ď@PŻLĐč" ąLî˙üÝ@ ąLĐč"î˙†¬!ů, ˙€‚‚†„ŚŤŽ“— š››ťŤ†’ •–— ¬®Ż„‘•  Ë’— !"Ŕ!Ş #ß$%$´‚&'•ÔÖ"Ö(Ú)Ä*ŕ#%"#+ç,–,´{'Ŷn$F‡Ż…9ZŚřWa x5G@E‰Ź÷2¸ @ b‹/^TÁFEŔ(ŕ† †Ś d @@€É”,Yľ«bg° `Ĺ" Ë™‰- µF5 (8Ě QC‚WŻ6ľž‹zëĆ ŞîB (€â@8˙r4ĐQcÇ 5jđčáS€Ź ¸n¸K«ö‡a fÁ DČB!€ÁČ:R5DQ ?.ÉôşĂ$I”,a"ˇ‡€ĚšČnâÄ íŰO@áuŘ""¤€ÂQ°Z©sVŔDDŠdS¤Pŕ  ¸Ah˘€ŠůóTŞtŕPf đăË˙ŢŔ7 ż}”!Ă îYQ %ŕHRpăM=÷č4VXQÁ€‚W #áIQL~ ÝST \q…€ŚXĹ ÁM -4‚P´ŔbQ` 6šp!jA 1”AQ4× š€ż…)r#CPBy6Ž$ÉČhXBM;Ĺ`O@8Ra ; ‚eLÖÜšLŃ-9âxŁŽ:žŔZäĄçžyy@!čťWz‚lÁ…9 AC;d‘…4xĐE^)ć pá…ńŔ<đE§Üai#*Đ|;Ńę60ˇ•ťÚb@ÁD; 1Dp „ak#á@;H!ED4ÁxŃDÇŢÚDlÜ61y¨zl ;fox1.6-1.6.57/src/bookclr.gif000066400000000000000000000001651326741342000155500ustar00rootroot00000000000000GIF87aÂ˙˙˙ŃŠŠ˙˙€,Bş!,.Ą ŠĘ%îcÔiJ(zĄiÎ@jöÉoÜĚn@6îîžJ1 ‚Áš˘¸8&•%ĐÖ” ~*[óşéF;fox1.6-1.6.57/src/bookset.gif000066400000000000000000000001221326741342000155540ustar00rootroot00000000000000GIF87aˇ˙˙˙˙€,+„Ź©Ëíމú‚éÝ)ź0„Đ7¤—hi BÓ»qÇ­řaf»Ş( ;fox1.6-1.6.57/src/cmymode.gif000066400000000000000000000024671326741342000155610ustar00rootroot00000000000000GIF87a(÷˛ŔÜ˙˙˙đüřčřřŕüřŘřřĐřřČřř¸ôř°ôř¨ôř ôřôřđřđřđř€đřxđřpěřpđřhěř`ěřXěřPěřHčř@ěř@čř8čř0čř(čřŕäŕčččäřäřäřčüřŘüřĐüřŔřř¸řř°řřôřôř€ôřhđřXđřHěř€€€848čř řř`đř8ěřŕčč048čř(ěř¨řř840čřřřřřđřřěřřäřŕčŕřÄřřĽřř¸řđ´řř¬řř¤řđ řřřđŚřřřđ„řđ|řđtřđlřđhřđ`řđXřđPřđHřđDřđ<řđ8řč0řđ(řč řčřđřč řčřčřřčřřČřřŔřř´řř řřřř„řř|řřtřřlřřhřř`řđTřđLřđ0řđ řđřđ řđřđřř”řřŚřř€řřpřřTřřDřđ@řčřř¨řřśřđ€řřXřřLřř8řđ$řđřřŕřđxřđřřüčřüŘřüČřü¸řü°řü¨řü řřřüřüččŕřühřř`řřPřüHřř@řř8řř(řř řřřřřüřřřüřüđřüŕřüĐřüŔřüřüpřü`řüXřüPřü@řü8řü0řü(řüřüřřHřü řřřřpřř0řřX,(ţH° Á  `@€ ‚ 8x!‚„ *X¸€!† :xřŕD,A€DLś@â"*VtśŔ˘B‹ \d@ŮáĂ 1^Ćś9‚‰:O(P #СDgŚTJFĘ/l¸Ľ1•!‡%LčD‘`Ć„F j©R”8śÂ!&™h0€őĉ9îŞŕ8ďŘ KĎÂĐb‡á„ CŔهŹ@> "d‘"FŽ I˘d “&Nž@‰"e •*V®`ɢe —.^b–ţňC00CÄŔ„Ś’2fΠIŁ&Ę6ż­ţ´ÁâćÍ8qä(7Ýüi0B¤3‡ ť:fšŘŃĺÎéÓYjŠ^PX9"_YňhQvjÎ(T ÁŞVe0µÍy—»˘ř 6pŤhšúśu›GăŻ|Ť˝ĆË󧝲·"ÁöC¸DÄőÇ6Ĺ•Ăř€7Ă3)Wi9˘ ©Et2ůąÉ‰‡1ŃĐpşĘÚęjP;fox1.6-1.6.57/src/eyedrop.gif000066400000000000000000000003101326741342000155540ustar00rootroot00000000000000GIF87a(ă˙˙˙řý ü§ůŠ HűţűłŞťŐÚń„‚„,(}ČI«˝8ëÂţ žŐ8„‰ž*[¸ď…A×XGĘ:ŢfTXá‚¡ pÜ%-b9{j˘ „B€´BY…ÇT(› O¬Öy6 ŐbL»\;)ó—=ä†×'} {tq s‚w‹CaŹmC BŚ=‰Ih^^;fox1.6-1.6.57/src/filecopy.gif000066400000000000000000000001371326741342000157260ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙˙˙˙Ë,8„Ź Á­„ě™8c°şW…MŇRĚŘ|‹8îđyíŔ+[3pĘë/ýČĄl °Č#&jF%¤Ç(;fox1.6-1.6.57/src/filedelete.gif000066400000000000000000000001051326741342000162110ustar00rootroot00000000000000GIF87a€˛ŔÜ„,$„ŹiÁzńL Éą0­Ő«y’g]äÇ…‘Ö­JhľĄ*žô‰+;fox1.6-1.6.57/src/filehidden.gif000066400000000000000000000001231326741342000162020ustar00rootroot00000000000000GIF87aˇ˘µÍ  ¤ŔŔ˙ŃŃŃ,,„yË!ŘIIXçŘň®}"Śb懪ëÖľpřƲ]Ó+ľë&šÂ;fox1.6-1.6.57/src/filelink.gif000066400000000000000000000001071326741342000157060ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙, „Ź©ËíO3Ń‚Řűj> H‰Y‚ŮeQŃ ÇňŚ;fox1.6-1.6.57/src/filemove.gif000066400000000000000000000001641326741342000157220ustar00rootroot00000000000000GIF87a²ŔÜełłŽ˙˙Ë,AşÜ0:„pŞzkĐ^9Üe}$YCë.ĺ54Ńn*7×óđ,[Ď)îj4źcč˛MŽHeŮr.‘Ľ§k;H;fox1.6-1.6.57/src/filerename.gif000066400000000000000000000001431326741342000162200ustar00rootroot00000000000000GIF87aˇ˛ŔÜ˙˙˙˙˙Ë,<„Ź Á­„ě™8c°ŃŞhR÷hÍ×l5RĂ;€"ŔqĽLYĚđé Şµlľ‡boY˛KżF;fox1.6-1.6.57/src/fileshown.gif000066400000000000000000000001661326741342000161140ustar00rootroot00000000000000GIF87a¢µÍŔŔ˙˙˙˙ŔŔŔ˙˙Ŕ˙€,CŞŃű0ŕjMh\ďřF€€(ZžZ놦™ÎMŃ nĆ=“Ľ +· 2~»ž‡®h„á™Ă`Gä§dâxą ;fox1.6-1.6.57/src/foldernew.gif000066400000000000000000000001271326741342000161000ustar00rootroot00000000000000GIF87aˇ˘µÍ˙˙˙˙˙,0„ŹÉíąž‰‡Ş€§ÚU -F–á|ŞŽěú‰üžĘ‹[ ­ęľň™L’˘ńP;fox1.6-1.6.57/src/fxascii.cpp000066400000000000000000000137341326741342000155660ustar00rootroot00000000000000/******************************************************************************** * * * A S C I I C h a r a c t e r I n f o * * * ********************************************************************************* * Copyright (C) 2005,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: fxascii.cpp,v 1.5.2.2 2006/08/09 20:01:07 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxdefs.h" #include "fxascii.h" /* Notes: - We need this to support non-locale sensitive ctype-like API's to operate on the lower 128 code points of UTF8-encoded unicode. In other words, we need to work on characters and be secure that the multi-byte encoded UTF8 will be left uninterpreted regardless of locale. - This file is pretty much cast in stone. */ /*******************************************************************************/ using namespace FX; namespace FX { namespace Ascii { // Ascii table const unsigned short ascii_data[256]={ 0x2004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004, 0x0004,0x0904,0x0104,0x0104,0x0104,0x0104,0x0004,0x0004, 0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004, 0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004,0x0004, 0x0940,0x00d0,0x00d0,0x00d0,0x20d0,0x00d0,0x00d0,0x00d0, 0x00d0,0x00d0,0x00d0,0x20d0,0x00d0,0x00d0,0x00d0,0x00d0, 0x0459,0x0459,0x0459,0x0459,0x0459,0x0459,0x0459,0x0459, 0x0459,0x0459,0x00d0,0x00d0,0x20d0,0x20d0,0x20d0,0x00d0, 0x00d0,0x4653,0x4653,0x4653,0x4653,0x4653,0x4653,0x4253, 0x4253,0x4253,0x4253,0x4253,0x4253,0x4253,0x4253,0x4253, 0x4253,0x4253,0x4253,0x4253,0x4253,0x4253,0x4253,0x4253, 0x4253,0x4253,0x4253,0x00d0,0x00d0,0x00d0,0x20d0,0x00d0, 0x20d0,0x4473,0x4473,0x4473,0x4473,0x4473,0x4473,0x4073, 0x4073,0x4073,0x4073,0x4073,0x4073,0x4073,0x4073,0x4073, 0x4073,0x4073,0x4073,0x4073,0x4073,0x4073,0x4073,0x4073, 0x4073,0x4073,0x4073,0x00d0,0x20d0,0x00d0,0x20d0,0x0004, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, }; FXint digitValue(FXchar asc){ return ('0'<=asc && asc<='9') ? (asc-'0') : ('a'<=asc && asc<='z') ? (asc-'a'+10) : ('A'<=asc && asc<='Z') ? asc-'A'+10 : -1; } bool hasCase(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x4000)!=0; } bool isUpper(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x200)!=0; } bool isLower(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x20)!=0; } bool isTitle(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x200)!=0; } bool isAscii(FXchar asc){ return ((FXuchar)asc)<128; } bool isLetter(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x2)!=0; } bool isDigit(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x8)!=0; } bool isAlphaNumeric(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x1)!=0; } bool isControl(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x4)!=0; } bool isSpace(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x100)!=0; } bool isBlank(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x800)!=0; } bool isPunct(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x80)!=0; } bool isGraph(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x10)!=0; } bool isPrint(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x40)!=0; } bool isHexDigit(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x400)!=0; } bool isSymbol(FXchar asc){ return (ascii_data[(FXuchar)asc]&0x2000)!=0; } bool isSep(FXchar asc){ return asc==' '; } FXchar toUpper(FXchar asc){ return ('a'<=asc && asc<='z') ? (asc-'a'+'A') : asc; } FXchar toLower(FXchar asc){ return ('A'<=asc && asc<='Z') ? (asc-'A'+'a') : asc; } FXchar toTitle(FXchar asc){ return ('a'<=asc && asc<='z') ? (asc-'a'+'A') : asc; } } } fox1.6-1.6.57/src/fxbmpio.cpp000066400000000000000000000352271326741342000156050ustar00rootroot00000000000000/******************************************************************************** * * * B M P I n p u t / O u t p u t * * * ********************************************************************************* * Copyright (C) 1998,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser 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. * ********************************************************************************* * $Id: fxbmpio.cpp,v 1.53 2006/01/22 17:58:52 fox Exp $ * ********************************************************************************/ #include "xincs.h" #include "fxver.h" #include "fxdefs.h" #include "FXHash.h" #include "FXStream.h" /* Notes: - Writer should use fxezquantize() and if the number of colors is less than 256, use 8bpp RLE compressed output; if less that 4, use 4bpp RLE compressed output, else if less than 2, use monochrome. - Writer should do this only when no loss of fidelity occurs. - Find documentation on 32-bpp bitmap. - When new FXStream is here, update reader/writer for byte-swapped i/o. - Need to have a pass, save as 32-bit when alpha present. - Need to have checks in RLE decoder for out-of-bounds checking. - To map from 5-bit to 8-bit, we use value*8+floor(value/4) which is almost the same as the correct value*8.225806. */ #define BIH_RGB 0 // biCompression values #define BIH_RLE8 1 #define BIH_RLE4 2 #define BIH_BITFIELDS 3 #define OS2_OLD 12 // biSize values #define WIN_NEW 40 #define OS2_NEW 64 using namespace FX; /*******************************************************************************/ namespace FX { extern FXAPI bool fxcheckBMP(FXStream& store); extern FXAPI bool fxloadBMP(FXStream& store,FXColor*& data,FXint& width,FXint& height); extern FXAPI bool fxsaveBMP(FXStream& store,const FXColor *data,FXint width,FXint height); // Check if stream contains a BMP bool fxcheckBMP(FXStream& store){ FXuchar signature[2]; store.load(signature,2); store.position(-2,FXFromCurrent); return signature[0]=='B' && signature[1]=='M'; } // Load image from stream bool fxloadBMP(FXStream& store,FXColor*& data,FXint& width,FXint& height){ FXint biXPelsPerMeter,biYPelsPerMeter,biClrUsed,biClrImportant,biCompression,biSize; FXint biWidth,biHeight,biSizeImage,bfOffBits,bfSize,i,j,x,y,maxpixels,colormaplen,padw,pad; FXushort bfType,bfReserved,biBitCount,biPlanes,rgb16; FXColor colormap[256],*pp; FXuchar padding[3],c1,c2; FXlong base,header; bool swap; bool ok=false; // Null out data=NULL; width=0; height=0; // Start of bitmap file header base=store.position(); // Bitmaps are little-endian swap=store.swapBytes(); store.setBigEndian(FALSE); // Get size and offset store >> bfType; store >> bfSize; store >> bfReserved; store >> bfReserved; store >> bfOffBits; // Check signature if(bfType!=0x4d42) goto x; // Start of bitmap info header header=store.position(); // Read bitmap info header store >> biSize; if(biSize==OS2_OLD){ // Old format store >> bfReserved; biWidth=bfReserved; store >> bfReserved; biHeight=bfReserved; store >> biPlanes; store >> biBitCount; biCompression = BIH_RGB; biSizeImage = (((biPlanes*biBitCount*biWidth)+31)/32)*4*biHeight; biXPelsPerMeter = 0; biYPelsPerMeter = 0; biClrUsed = 0; biClrImportant = 0; } else{ // New format store >> biWidth; store >> biHeight; store >> biPlanes; store >> biBitCount; store >> biCompression; store >> biSizeImage; store >> biXPelsPerMeter; store >> biYPelsPerMeter; store >> biClrUsed; store >> biClrImportant; } // FXTRACE((1,"fxloadBMP: biWidth=%d biHeight=%d biPlanes=%d biBitCount=%d biCompression=%d biClrUsed=%d biClrImportant=%d\n",biWidth,biHeight,biPlanes,biBitCount,biCompression,biClrUsed,biClrImportant)); // Ought to be 1 if(biPlanes!=1) goto x; // Check for supported depths if(biBitCount!=1 && biBitCount!=4 && biBitCount!=8 && biBitCount!=16 && biBitCount!=24 && biBitCount!=32) goto x; // Check for supported compression methods if(biCompression!=BIH_RGB && biCompression!=BIH_RLE4 && biCompression!=BIH_RLE8 && biCompression!=BIH_BITFIELDS) goto x; // Skip ahead to colormap store.position(header+biSize); // Load up colormap, if needed colormaplen=0; if(biBitCount<=8){ colormaplen = biClrUsed ? biClrUsed : 1<> c1; ((FXuchar*)(colormap+i))[2]=c1; // Blue store >> c1; ((FXuchar*)(colormap+i))[1]=c1; // Green store >> c1; ((FXuchar*)(colormap+i))[0]=c1; // Red store >> c1; ((FXuchar*)(colormap+i))[3]=255; // Opaque } } else{ for(i=0; i> c1; ((FXuchar*)(colormap+i))[2]=c1; // Blue store >> c1; ((FXuchar*)(colormap+i))[1]=c1; // Green store >> c1; ((FXuchar*)(colormap+i))[0]=c1; // Red ((FXuchar*)(colormap+i))[3]=255; // Opaque } } } // Jump to start of actual bitmap data if(biSize!=OS2_OLD){ store.position(base+bfOffBits); } // Total number of pixels maxpixels=biWidth*biHeight; // Allocate memory if(!FXMALLOC(&data,FXColor,maxpixels)) goto x; // Width and height width=biWidth; height=biHeight; // Handle various depths switch(biBitCount){ case 1: // 1-bit/pixel padw=(biWidth+31)&~31; for(i=biHeight-1; i>=0; i--){ pp=data+i*biWidth; for(j=0; j> c1; } if(j>7]; c1<<=1; } } } break; case 4: // 4-bit/pixel if(biCompression==BIH_RGB){ // Read uncompressed data padw=(biWidth+7)&~7; for(i=biHeight-1; i>=0; i--){ pp=data+i*biWidth; for(j=0; j> c1; } if(j>4]; c1<<=4; } } } } else{ // Read RLE4 compressed data x=y=0; pp=data+(biHeight-1)*biWidth; while(y> c2; if(c2){ // Encoded mode store >> c1; for(i=0; i>4)&0x0f)]; } } else{ // Escape codes store >> c2; if(c2==0){ // End of line x=0; y++; pp=data+(biHeight-y-1)*biWidth; } else if(c2==0x01){ // End of pic8 break; } else if(c2==0x02){ // Delta store >> c2; x+=c2; store >> c2; y+=c2; pp=data+x+(biHeight-y-1)*biWidth; } else{ // Absolute mode for(i=0; i> c1; } *pp++=colormap[(i&1)?(c1&0x0f):((c1>>4)&0x0f)]; } if(((c2&3)==1) || ((c2&3)==2)) store >> c1; // Read pad byte } } } } break; case 8: // 8-bit/pixel if(biCompression==BIH_RGB){ // Read uncompressed data padw=(biWidth+3)&~3; for(i=biHeight-1; i>=0; i--){ pp=data+i*biWidth; for(j=0; j> c1; if(j> c2; if(c2){ // Encoded mode store >> c1; for(i=0; i> c2; if(c2==0x00){ // End of line x=0; y++; pp=data+(biHeight-y-1)*biWidth; } else if(c2==0x01){ // End of pic8 break; } else if(c2==0x02){ // delta store >> c2; x+=c2; store >> c2; y+=c2; pp=data+x+(biHeight-y-1)*biWidth; } else{ // Absolute mode for(i=0; i> c1; *pp++=colormap[c1]; } if(c2&1) store >> c1; // Odd length run: read an extra pad byte } } } } break; case 16: // 16-bit/pixel pad=(4-((biWidth*2)&3))&3; for(i=biHeight-1; i>=0; i--){ pp=data+i*biWidth; for(j=0; j> rgb16; ((FXuchar*)pp)[0]=((rgb16>>7)&0xf8)+((rgb16>>12)&7); // Red ((FXuchar*)pp)[1]=((rgb16>>2)&0xf8)+((rgb16>> 7)&7); // Green ((FXuchar*)pp)[2]=((rgb16<<3)&0xf8)+((rgb16>> 2)&7); // Blue ((FXuchar*)pp)[3]=255; // Alpha } store.load(padding,pad); } break; case 24: // 24-bit/pixel pad=(4-((biWidth*3)&3))&3; for(i=biHeight-1; i>=0; i--){ pp=data+i*biWidth; for(j=0; j> ((FXuchar*)pp)[2]; // Blue store >> ((FXuchar*)pp)[1]; // Green store >> ((FXuchar*)pp)[0]; // Red ((FXuchar*)pp)[3]=255; // Alpha } store.load(padding,pad); } break; case 32: // 32-bit/pixel for(i=biHeight-1; i>=0; i--){ pp=data+i*biWidth; for(j=0; j> ((FXuchar*)pp)[2]; // Blue store >> ((FXuchar*)pp)[1]; // Green store >> ((FXuchar*)pp)[0]; // Red store >> ((FXuchar*)pp)[3]; // Alpha } } break; } // Done ok=true; x:store.swapBytes(swap); return ok; } /*******************************************************************************/ // Save a bmp file to a stream bool fxsaveBMP(FXStream& store,const FXColor *data,FXint width,FXint height){ const FXshort biPlanes=1; const FXshort bfReserved=0; const FXint biXPelsPerMeter=75*39; const FXint biYPelsPerMeter=75*39; const FXint biClrUsed=0; const FXint biClrImportant=0; const FXint biCompression=BIH_RGB; const FXint biSize=40; const FXint bfHeader=14; const FXuchar padding[3]={0,0,0}; const FXColor *pp; FXint bperlin,i,j,pad; FXint bfSize; FXint biSizeImage; FXint bfOffBits; FXshort biBitCount=24; bool swap; // Must make sense if(!data || width<=0 || height<=0) return false; // Quick pass to see if alpha<255 anywhere for(i=width*height-1; i>=0; i--){ if(((FXuchar*)(data+i))[3]<255){ biBitCount=32; break; } } // Number of bytes written per line bperlin=((width*biBitCount+31)/32)*4; // Size of raw image data biSizeImage=bperlin*height; // Offset to image data bfOffBits=bfHeader+biSize+biClrUsed*4; // Compute file size// size of bitmap file bfSize=bfHeader+biSize+biClrUsed*4+biSizeImage; // Bitmaps are little-endian swap=store.swapBytes(); store.setBigEndian(FALSE); // BitmapFileHeader store << 'B'; // Magic number store << 'M'; store << bfSize; // bfSize: size of file store << bfReserved; // bfReserved1 store << bfReserved; // bfReserved2 store << bfOffBits; // bfOffBits // BitmapInfoHeader store << biSize; // biSize: size of bitmap info header store << width; // biWidth store << height; // biHeight store << biPlanes; // biPlanes: must be '1' store << biBitCount; // biBitCount (1,4,8,24, or 32) store << biCompression; // biCompression: BIH_RGB, BIH_RLE8, BIH_RLE4, or BIH_BITFIELDS store << biSizeImage; // biSizeImage: size of raw image data store << biXPelsPerMeter; // biXPelsPerMeter: (75dpi * 39" per meter) store << biYPelsPerMeter; // biYPelsPerMeter: (75dpi * 39" per meter) store << biClrUsed; // biClrUsed store << biClrImportant; // biClrImportant // 24-bit/pixel if(biBitCount==24){ pad=(4-((width*3)&3))&3; for(i=height-1; i>=0; i--){ pp=data+i*width; for(j=0; j=0; i--){ pp=data+i*width; for(j=0; j=maxcolors) return FALSE; // Add new color colortable[p]=color; // Add color to color hash table colormap[ncolors]=color; // Add color to color map mapindex[p]=ncolors; // Remember map index of this color ncolors++; // Next pixel nxt:continue; } // Now loop through image, assigning map indices; all colors // must be in the map, so each lookup will be successful. for(i=0; i

    FOX Class Hierarchy

    END
    
    showChildren ('FXObject', 0);
    
    print "
    \n"; sub showChildren() { my $class=shift; my $indent=shift; my $tab = "| " x $indent; print "$tab$class\n"; my @child = split (/,/, $children{$class}); shift @child; sort @child; for (my $i=0; $i<@child; $i++) { showChildren($child[$i], $indent+1); } } fox1.6-1.6.57/utils/reswrap.1000066400000000000000000000116661326741342000155540ustar00rootroot00000000000000.TH reswrap 1 "Sept 2005" "The FOX C++ GUI Toolkit" "FOX Programmers Manual" .SH NAME reswrap \- wrap icon resources into C code .SH SYNOPSIS .B reswrap .RB [ options ] .RB [ \-o [ a "] " .IR outfile ] .I files... .SH DESCRIPTION .B Reswrap is a tool to turn images, text, and other resource files into C++ data arrays. This allows various binary resources to be embedded in the source code, and compiled into an application. In development of graphical applications with FOX, it is used to embed icons and images for the user interface into the executable and eliminate the need to distribute separate icon and image files. .B Reswrap is typically invoked as a part of the build process to generate C++ source files from a collection of icons and images and other binary resources. By default reswrap will interpret the .I files listed as a stream of raw bytes and output them as an initialized data array to stdout. .SH OPTIONS .TP \fB\-o\fR[\fBa\fR]\fI outfile\fR Write the result into the file .I outfile instead of writing to stdout. With \fB\-o\fR the .I outfile will be overwritten with the data from the input. With the \fB\-oa\fR option, the resulting code is appended to the .I output file, allowing multiple input files to be placed into one single source file. .TP \fB\-h\fR Print a short usage message. .TP \fB\-v\fR Just print out the version number and license information. .TP \fB\-d\fR Write data as decimal numbers instead of using the default hexadecimal numbers. .TP \fB\-m\fR Read files with MS-DOS mode (default is binary). This replaces "\\r\\n" with "\\n" when reading the resource file. .TP \fB\-x\fR Write data as hexadecimal numbers (default). .TP \fB\-t\fR[\fBa\fR]\fI Write data as a text string, with each byte represented as a hexadecimal excape sequence, as in "\\x33". Note that the C++ compiler appends a nul-character at the end of the text string, thus making the data array one character longer than the file. With the \fBa\fR option, printable ascii characters are passed unescaped, while special characters like tabs and newlines are given the usual escape codes. .TP \fB\-e\fR Places the storage modifier .I extern in front of the data array, ensuring that the data array can be linked with other compilation units. Normally, constant declarations are not visible in other compilation units. .TP \fB\-i\fR Instead of generating an array definition only write a declaration, which can be included as a header file. .TP \fB\-k\fR This option causes reswrap to keep the file extension, replacing the "." with an underscore "_". Usage of this option is recommended as it reduces errors when using the data arrays. .TP \fB\-s\fR This option suppresses comments inserted by reswrap to indicate the original file name from which the data statement was generated. .TP \fB\-p\fI prefix\fR Prepend the given .I prefix in front of the name of the resource; this may be used to generate class names or namespace names in front of symbols. .TP \fB\-n\fI namespace\fR Generate all declarations inside the given C++ .I namespace declaration. Using a .I namespace may be used to ensure that declarations are only accessible within the given scope, and thus won't clash with symbols. .TP \fB\-c\fI cols\fR Writes .I cols columns instead of the default number of columns in the data statements generated by reswrap. The default number of columns for decimal and hex printout is 16 characters; the default for text string printout is 80 characters. .TP \fB\-u\fR Force output as unsigned chars in text mode. .TP \fB\-z\fR Output the size of the resource in the declaration of a resource-array. This allows the C++ sizeof() operator to return the correct size of the resource even for external declarations. Note that in text mode, (-t option), an extra byte is added to the size for the end of string character. .TP \fB\-r\fI name\fR Instead of using a resource name based on the filename, reswrap substitutes .I name for the resource name used in the declaration or definition for the following resource file. This is useful if the filename can not be used as an identifier, for example if the filename is a reserved word in C or C++, like "while". .SH CAVEATS When using the text string mode, please remember the C compiler appends one nul-character after the string, making the data array one element longer than the resource file. .SH AUTHOR This manpage was originally written by Torsten Landschoff (torsten@debian.org) for the Debian distribution of the FOX Toolkit, and is currently maintained by Jeroen van der Zijp (jeroen@fox-toolkit.org). .SH COPYRIGHT Copyright \(co 1997,2005 Jeroen van der Zijp. .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH SEE ALSO The reswrap program is a part of the FOX GUI Toolkit. Further information about reswrap can be found at: .B http://www.fox-toolkit.org The FOX Toolkit website includes detailed information about reswrap and its use. fox1.6-1.6.57/utils/reswrap.cpp000066400000000000000000000343331326741342000161720ustar00rootroot00000000000000/******************************************************************************** * * * R e s o u r c e W r a p p i n g U t i l i t y * * * ********************************************************************************* * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * ********************************************************************************* * $Id: reswrap.cpp,v 1.17 2006/01/22 17:59:02 fox Exp $ * ********************************************************************************/ #include "stdio.h" #include "stdlib.h" #include "string.h" #include "ctype.h" /* Notes: - Updated to version 4.0. - Can now also generate output as a text string. - When ASCII option is used with text string option, it prints human readable C-style string, with non-ASCII characters escaped as appropriate. - Removed PPM feature as that was never really used in FOX. - License changed to GPL from LGPL because this is a standalone program that does not need to be linked to anything. - Added MSDOS mode, useful for wrapping ASCII text. - Added option to keep extension (separated by '_'). - Need option to place #include "icons.h" or something into icons.cpp - Always prepend prefix in front of resource name, even if name was overrided because prefix may be namespace name. */ /*******************************************************************************/ #define MODE_DECIMAL 0 #define MODE_HEX 1 #define MODE_TEXT 2 const char version[]="4.0.0"; /* Print some help */ void printusage(){ fprintf(stderr,"Usage: reswrap [options] [-o[a] outfile] files...\n"); fprintf(stderr,"Convert files containing images, text, or binary data into C/C++ data arrays.\n"); fprintf(stderr,"\n"); fprintf(stderr,"Options:\n"); fprintf(stderr," -o[a] outfile Output [append] to outfile instead of stdout\n"); fprintf(stderr," -h Print help\n"); fprintf(stderr," -v Print version number\n"); fprintf(stderr," -d Output as decimal\n"); fprintf(stderr," -m Read files with MS-DOS mode (default is binary)\n"); fprintf(stderr," -x Output as hex (default)\n"); fprintf(stderr," -t[a] Output as [ascii] text string\n"); fprintf(stderr," -e Generate external reference declaration\n"); fprintf(stderr," -i Build an include file\n"); fprintf(stderr," -k Keep extension, separated by underscore\n"); fprintf(stderr," -s Suppress header in output file\n"); fprintf(stderr," -p prefix Place prefix in front of names of declarations and definitions\n"); fprintf(stderr," -n namespace Place declarations and definitions inside given namespace\n"); fprintf(stderr," -c cols Change number of columns in output to cols\n"); fprintf(stderr," -u Force unsigned char even for text mode\n"); fprintf(stderr," -z Output size in declarations\n"); fprintf(stderr,"\n"); fprintf(stderr,"Each file may be preceded by the following extra option:\n"); fprintf(stderr," -r name Override resource name of following resource file\n"); fprintf(stderr,"\n"); } /* Print version information */ void printversion(){ fprintf(stderr,"Reswrap %s %s.\n",version,__DATE__); fprintf(stderr,"Copyright (C) 1997,2005 Jeroen van der Zijp. All Rights Reserved.\n"); fprintf(stderr,"Please visit: http://www.fox-toolkit.org for further information.\n"); fprintf(stderr,"\n"); fprintf(stderr,"This program is free software; you can redistribute it and/or modify\n"); fprintf(stderr,"it under the terms of the GNU General Public License as published by\n"); fprintf(stderr,"the Free Software Foundation; either version 2 of the License, or\n"); fprintf(stderr,"(at your option) any later version.\n"); fprintf(stderr,"\n"); fprintf(stderr,"This program is distributed in the hope that it will be useful,\n"); fprintf(stderr,"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); fprintf(stderr,"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); fprintf(stderr,"GNU General Public License for more details.\n"); fprintf(stderr,"\n"); fprintf(stderr,"You should have received a copy of the GNU General Public License\n"); fprintf(stderr,"along with this program; if not, write to the Free Software\n"); fprintf(stderr,"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.\n"); } /* Build resource name */ void resourcename(char *name,const char* prefix,const char* filename,int keepdot){ const char* begin=name; const char* ptr; /* Copy prefix */ while(*prefix){ *name++=*prefix++; } /* Get name only; take care of mixed path separator characters on mswindows */ if((ptr=strrchr(filename,'/'))!=0) filename=ptr; if((ptr=strrchr(filename,'\\'))!=0) filename=ptr; /* Copy filename */ while(*filename){ /* C++ identifier may contain _, alpha, digit (if not first), or namespace separator : */ if(*filename==':' || *filename=='_' || isalpha(*filename) || (isdigit(*filename) && (begin!=name))){ *name++=*filename; } /* We can squash dot extension to _ */ else if(*filename=='.'){ if(!keepdot) break; *name++='_'; } filename++; } *name=0; } /* Main */ int main(int argc,char **argv){ char *outfilename,*resfilename; FILE *resfile,*outfile; int i,b,first,col,append,maxcols,external,header,include,mode,colsset,ascii,msdos,keepext,hex,forceunsigned,declaresize,resfilesize; const char *thenamespace,*theprefix; char resname[1000]; /* Initialize */ outfilename=0; outfile=stdout; maxcols=16; colsset=0; external=0; header=1; include=0; ascii=0; mode=MODE_HEX; msdos=0; keepext=0; thenamespace=0; theprefix=""; append=0; forceunsigned=0; declaresize=0; /* Check arguments */ if(argc<2){ printusage(); exit(1); } /* Process all options first, except for the -r option */ for(i=1; i=argc){ fprintf(stderr,"reswrap: missing argument for -o option\n"); exit(1); } outfilename=argv[i]; } /* Print help */ else if(argv[i][1]=='h'){ printusage(); exit(0); } /* Print version */ else if(argv[i][1]=='v'){ printversion(); exit(0); } /* Switch to decimal */ else if(argv[i][1]=='d'){ mode=MODE_DECIMAL; if(!colsset) maxcols=10; } /* Switch to hex */ else if(argv[i][1]=='x'){ mode=MODE_HEX; if(!colsset) maxcols=16; } /* Switch to text */ else if(argv[i][1]=='t'){ if(argv[i][2]=='a') ascii=1; mode=MODE_TEXT; if(!colsset) maxcols=80; } /* Suppress header */ else if(argv[i][1]=='s'){ header=0; } /* Force unsigned */ else if(argv[i][1]=='u'){ forceunsigned=1; } /* Declare size */ else if(argv[i][1]=='z'){ declaresize=1; } /* Generate as external reference */ else if(argv[i][1]=='e'){ external=1; } /* Building include file implies also extern */ else if(argv[i][1]=='i'){ include=1; external=1; } /* Read resource with MS-DOS mode */ else if(argv[i][1]=='m'){ msdos=1; } /* Keep extension */ else if(argv[i][1]=='k'){ keepext=1; } /* Change number of columns */ else if(argv[i][1]=='c'){ i++; if(i>=argc){ fprintf(stderr,"reswrap: missing argument for -c option\n"); exit(1); } if(sscanf(argv[i],"%d",&maxcols)==1 && maxcols<1){ fprintf(stderr,"reswrap: illegal argument for number of columns\n"); exit(1); } colsset=1; } /* Embed in namespace */ else if(argv[i][1]=='n'){ i++; if(i>=argc){ fprintf(stderr,"reswrap: missing argument for -n option\n"); exit(1); } thenamespace=argv[i]; } /* Prefix in front of declarations */ else if(argv[i][1]=='p'){ i++; if(i>=argc){ fprintf(stderr,"reswrap: missing argument for -p option\n"); exit(1); } theprefix=argv[i]; } } /* To file instead out stdout */ if(outfilename){ outfile=fopen(outfilename,append?"a":"w"); if(!outfile){ fprintf(stderr,"reswrap: unable to open output file %s\n",outfilename); exit(1); } } /* Output header */ if(header){ fprintf(outfile,"/* Generated by reswrap version %s */\n\n",version); } /* Output namespace begin */ if(thenamespace){ fprintf(outfile,"namespace %s {\n\n",thenamespace); } /* Process resource files next */ for(; i=argc){ fprintf(stderr,"reswrap: missing name argument for -r option\n"); exit(1); } /* Get resource name */ resourcename(resname,theprefix,argv[i],keepext); /* Must have following file name */ if(++i>=argc){ fprintf(stderr,"reswrap: missing resource file name\n"); exit(1); } /* Get resource file name */ resfilename=argv[i]; } else{ /* Get resource file name */ resfilename=argv[i]; /* Get resource name */ resourcename(resname,theprefix,resfilename,keepext); } /* Check resource name not empty */ if(*resname==0){ fprintf(stderr,"reswrap: empty resource name for %s\n",resfilename); exit(1); } /* Open resource file; always open as binary */ resfile=fopen(resfilename,"rb"); if(!resfile){ fprintf(stderr,"reswrap: unable to open input file %s\n",resfilename); exit(1); } /* Get the size */ fseek(resfile,0,SEEK_END); resfilesize=ftell(resfile); fseek(resfile,0,SEEK_SET); /* Add one if text mode, for end of string */ if(mode==MODE_TEXT){ resfilesize++; } /* Output header */ if(header){ fprintf(outfile,"/* created by reswrap from file %s */\n",resfilename); } /* Generate external reference for #include's */ if(external){ fprintf(outfile,"extern "); } /* In text mode, output a 'char' declaration */ if((mode==MODE_TEXT) && !forceunsigned){ if(declaresize){ fprintf(outfile,"const char %s[%d]",resname,resfilesize); } else{ fprintf(outfile,"const char %s[]",resname); } } /* In binary mode, output a 'unsigned char' declaration */ else{ if(declaresize){ fprintf(outfile,"const unsigned char %s[%d]",resname,resfilesize); } else{ fprintf(outfile,"const unsigned char %s[]",resname); } } /* Generate resource array */ if(!include){ if(mode==MODE_TEXT){ col=0; hex=0; fprintf(outfile,"=\n \""); while((b=fgetc(resfile))!=EOF){ if(msdos && (b=='\r')) continue; if(col>=maxcols){ fprintf(outfile,"\"\n \""); col=0; } if(ascii){ if(b=='\\'){ fprintf(outfile,"\\\\"); col+=2; hex=0; } else if(b=='\a'){ fprintf(outfile,"\\a"); col+=2; hex=0; } else if(b=='\t'){ fprintf(outfile,"\\t"); col+=2; hex=0; } else if(b=='\r'){ fprintf(outfile,"\\r"); col+=2; hex=0; } else if(b=='\f'){ fprintf(outfile,"\\f"); col+=2; hex=0; } else if(b=='\v'){ fprintf(outfile,"\\v"); col+=2; hex=0; } else if(b=='\"'){ fprintf(outfile,"\\\""); col+=2; hex=0; } else if(b=='\n'){ fprintf(outfile,"\\n\"\n \""); col=0; hex=0; } else if(b<32 || b>=127){ fprintf(outfile,"\\x%02x",b); col+=4; hex=1; } else if(hex && isxdigit(b)){ fprintf(outfile,"\\x%02x",b); col+=4; hex=1; } else{ fprintf(outfile,"%c",b); col+=1; hex=0; } } else{ fprintf(outfile,"\\x%02x",b); col+=4; } } fprintf(outfile,"\"\n "); } else{ col=0; first=1; fprintf(outfile,"={\n "); while((b=fgetc(resfile))!=EOF){ if(msdos && (b=='\r')) continue; if(!first){ fprintf(outfile,","); } if(col>=maxcols){ fprintf(outfile,"\n "); col=0; } if(mode==MODE_HEX) fprintf(outfile,"0x%02x",b); else fprintf(outfile,"%3d",b); first=0; col++; } fprintf(outfile,"\n }"); } } fprintf(outfile,";\n\n"); /* Close resource file */ fclose(resfile); } /* Output namespace end */ if(thenamespace){ fprintf(outfile,"}\n"); } /* To file instead out stdout */ if(outfilename){ fclose(outfile); } return 0; } fox1.6-1.6.57/windows/000077500000000000000000000000001326741342000143275ustar00rootroot00000000000000fox1.6-1.6.57/windows/Makefile.am000066400000000000000000000027451326741342000163730ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in htmldir = $(prefix)/@PACKAGE@/html # Windows files BCPP_FILES = \ borland/Makefile # IBM Visual Age C++ VAGE_FILES = \ vacpp/Makefile # Microsoft Visual C++ VCPP_FILES = \ vcpp/adie/adie.dsp \ vcpp/bitmapviewer/bitmapviewer.dsp \ vcpp/button/button.dsp \ vcpp/calculator/calculator.dsp \ vcpp/chart/chart.dsp \ vcpp/chartdll/chartdll.dsp \ vcpp/datatarget/datatarget.dsp \ vcpp/dctest/dctest.dsp \ vcpp/dialog/dialog.dsp \ vcpp/dirlist/dirlist.dsp \ vcpp/expression/expression.dsp \ vcpp/foursplit/foursplit.dsp \ vcpp/fox/fox.dsp \ vcpp/foxdll/foxdll.dsp \ vcpp/gltest/gltest.dsp \ vcpp/glviewer/glviewer.dsp \ vcpp/groupbox/groupbox.dsp \ vcpp/header/header.dsp \ vcpp/hello/hello.dsp \ vcpp/hello2/hello2.dsp \ vcpp/iconlist/iconlist.dsp \ vcpp/image/image.dsp \ vcpp/imageviewer/imageviewer.dsp \ vcpp/layout/layout.dsp \ vcpp/mditest/mditest.dsp \ vcpp/memmap/memmap.dsp \ vcpp/minheritance/minheritance.dsp \ vcpp/pathfinder/pathfinder.dsp \ vcpp/ratio/ratio.dsp \ vcpp/reswrap/reswrap.dsp \ vcpp/scribble/scribble.dsp \ vcpp/shutter/shutter.dsp \ vcpp/shutterbug/shutterbug.dsp \ vcpp/splitter/splitter.dsp \ vcpp/switcher/switcher.dsp \ vcpp/tabbook/tabbook.dsp \ vcpp/table/table.dsp \ vcpp/wizard/wizard.dsp \ vcpp/win32.dsw # Digital Mars C++ DMC_FILES = \ dmc/Makefile # Open Watcom C++ WATCOM_FILES = \ watcom/Makefile EXTRA_DIST = $(BCPP_FILES) $(VAGE_FILES) $(VCPP_FILES) $(DMC_FILES) $(WATCOM_FILES) fox1.6-1.6.57/windows/Makefile.in000066400000000000000000000324541326741342000164040ustar00rootroot00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = windows ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOX_BYTEORDER = @FOX_BYTEORDER@ FOX_MAJOR_VERSION = @FOX_MAJOR_VERSION@ FOX_MINOR_VERSION = @FOX_MINOR_VERSION@ FOX_PATCH_LEVEL = @FOX_PATCH_LEVEL@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_BASE_LIBS = @X_BASE_LIBS@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = $(prefix)/@PACKAGE@/html includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Windows files BCPP_FILES = \ borland/Makefile # IBM Visual Age C++ VAGE_FILES = \ vacpp/Makefile # Microsoft Visual C++ VCPP_FILES = \ vcpp/adie/adie.dsp \ vcpp/bitmapviewer/bitmapviewer.dsp \ vcpp/button/button.dsp \ vcpp/calculator/calculator.dsp \ vcpp/chart/chart.dsp \ vcpp/chartdll/chartdll.dsp \ vcpp/datatarget/datatarget.dsp \ vcpp/dctest/dctest.dsp \ vcpp/dialog/dialog.dsp \ vcpp/dirlist/dirlist.dsp \ vcpp/expression/expression.dsp \ vcpp/foursplit/foursplit.dsp \ vcpp/fox/fox.dsp \ vcpp/foxdll/foxdll.dsp \ vcpp/gltest/gltest.dsp \ vcpp/glviewer/glviewer.dsp \ vcpp/groupbox/groupbox.dsp \ vcpp/header/header.dsp \ vcpp/hello/hello.dsp \ vcpp/hello2/hello2.dsp \ vcpp/iconlist/iconlist.dsp \ vcpp/image/image.dsp \ vcpp/imageviewer/imageviewer.dsp \ vcpp/layout/layout.dsp \ vcpp/mditest/mditest.dsp \ vcpp/memmap/memmap.dsp \ vcpp/minheritance/minheritance.dsp \ vcpp/pathfinder/pathfinder.dsp \ vcpp/ratio/ratio.dsp \ vcpp/reswrap/reswrap.dsp \ vcpp/scribble/scribble.dsp \ vcpp/shutter/shutter.dsp \ vcpp/shutterbug/shutterbug.dsp \ vcpp/splitter/splitter.dsp \ vcpp/switcher/switcher.dsp \ vcpp/tabbook/tabbook.dsp \ vcpp/table/table.dsp \ vcpp/wizard/wizard.dsp \ vcpp/win32.dsw # Digital Mars C++ DMC_FILES = \ dmc/Makefile # Open Watcom C++ WATCOM_FILES = \ watcom/Makefile EXTRA_DIST = $(BCPP_FILES) $(VAGE_FILES) $(VCPP_FILES) $(DMC_FILES) $(WATCOM_FILES) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign windows/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign windows/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fox1.6-1.6.57/windows/borland/000077500000000000000000000000001326741342000157505ustar00rootroot00000000000000fox1.6-1.6.57/windows/borland/Makefile000066400000000000000000000011161326741342000174070ustar00rootroot00000000000000# # Top-level makefile for Borland C++ # all: cd ..\..\utils make -fMakefile.bc cd ..\src make -fMakefile.bc cd ..\tests make -fMakefile.bc cd ..\adie make -fMakefile.bc cd ..\pathfinder make -fMakefile.bc cd ..\calculator make -fMakefile.bc cd ..\shutterbug make -fMakefile.bc clean: cd ..\..\utils make -fMakefile.bc clean cd ..\src make -fMakefile.bc clean cd ..\tests make -fMakefile.bc clean cd ..\adie make -fMakefile.bc clean cd ..\pathfinder make -fMakefile.bc clean cd ..\calculator make -fMakefile.bc clean cd ..\shutterbug make -fMakefile.bc clean fox1.6-1.6.57/windows/dmc/000077500000000000000000000000001326741342000150725ustar00rootroot00000000000000fox1.6-1.6.57/windows/dmc/Makefile000066400000000000000000000010311326741342000165250ustar00rootroot00000000000000# # Top-level makefile for Digital Mars C++ # all: cd ..\utils smake -fMakefile.dmc cd ..\..\src smake -fMakefile.dmc cd ..\tests smake -fMakefile.dmc cd ..\adie smake -fMakefile.dmc cd ..\pathfinder smake -fMakefile.dmc cd ..\calculator smake -fMakefile.dmc clean: cd ..\..\src smake -fMakefile.dmc clean cd ..\utils smake -fMakefile.dmc clean cd ..\tests smake -fMakefile.dmc clean cd ..\adie smake -fMakefile.dmc clean cd ..\pathfinder smake -fMakefile.dmc clean cd ..\calculator smake -fMakefile.dmc clean fox1.6-1.6.57/windows/vacpp/000077500000000000000000000000001326741342000154405ustar00rootroot00000000000000fox1.6-1.6.57/windows/vacpp/Makefile000066400000000000000000000005211326741342000170760ustar00rootroot00000000000000# # Top-level makefile for IBM VisualAge C++ 3.5 # all: cd ..\..\src nmake -f Makefile.icc cd ..\utils nmake -f Makefile.icc cd ..\tests nmake -f Makefile.icc clean: cd ..\..\src nmake -f Makefile.icc clean cd ..\utils nmake -f Makefile.icc clean cd ..\tests nmake -f Makefile.icc clean fox1.6-1.6.57/windows/vcpp/000077500000000000000000000000001326741342000152775ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/adie/000077500000000000000000000000001326741342000162015ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/adie/adie.dsp000077500000000000000000000255111326741342000176220ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="adie" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=adie - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "adie.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "adie.mak" CFG="adie - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "adie - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "adie - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "adie - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 winspool.lib comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /nologo /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 !ELSEIF "$(CFG)" == "adie - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "adie - Win32 Release" # Name "adie - Win32 Debug" # Begin Source File SOURCE=..\..\..\adie\Adie.cpp # End Source File # Begin Source File SOURCE=..\..\..\adie\Adie.h # End Source File # Begin Source File SOURCE=..\..\..\adie\adie_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\big_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\bookdel_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\booknext_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\bookprev_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\bookset_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\close_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\colors_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\Commands.cpp # End Source File # Begin Source File SOURCE=..\..\..\adie\Commands.h # End Source File # Begin Source File SOURCE=..\..\..\adie\copy_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\cut_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\delete_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\delimit_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\fonts_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\help.cpp # End Source File # Begin Source File SOURCE=..\..\..\adie\help.h # End Source File # Begin Source File SOURCE=..\..\..\adie\help_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\HelpWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\adie\HelpWindow.h # End Source File # Begin Source File SOURCE=..\..\..\adie\Hilite.cpp # End Source File # Begin Source File SOURCE=..\..\..\adie\Hilite.h # End Source File # Begin Source File SOURCE=.\icons !IF "$(CFG)" == "adie - Win32 Release" # Begin Custom Build WkspDir=. InputPath=.\icons BuildCmds= \ cd ..\..\..\adie \ $(WkspDir)\reswrap\Release\reswrap -e -o icons.cpp adie_gif.gif big_gif.gif bookdel_gif.gif booknext_gif.gif bookprev_gif.gif bookset_gif.gif close_gif.gif colors_gif.gif copy_gif.gif cut_gif.gif delete_gif.gif fonts_gif.gif help_gif.gif indent_gif.gif info_gif.gif lang_gif.gif new_gif.gif open_gif.gif palette_gif.gif paste_gif.gif pattern_gif.gif print_gif.gif quit_gif.gif redo_gif.gif reload_gif.gif save_gif.gif saveas_gif.gif saveall_gif.gif search_gif.gif searchnext_gif.gif searchprev_gif.gif shiftleft_gif.gif shiftright_gif.gif small_gif.gif styles_gif.gif syntax_gif.gif undo_gif.gif \ $(WkspDir)\reswrap\Release\reswrap -i -o icons.h adie_gif.gif big_gif.gif bookdel_gif.gif booknext_gif.gif bookprev_gif.gif bookset_gif.gif close_gif.gif colors_gif.gif copy_gif.gif cut_gif.gif delete_gif.gif fonts_gif.gif help_gif.gif indent_gif.gif info_gif.gif lang_gif.gif new_gif.gif open_gif.gif palette_gif.gif paste_gif.gif pattern_gif.gif print_gif.gif quit_gif.gif redo_gif.gif reload_gif.gif save_gif.gif saveas_gif.gif saveall_gif.gif search_gif.gif searchnext_gif.gif searchprev_gif.gif shiftleft_gif.gif shiftright_gif.gif small_gif.gif styles_gif.gif syntax_gif.gif undo_gif.gif \ "icons.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "icons.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "adie - Win32 Debug" # Begin Custom Build WkspDir=. InputPath=.\icons BuildCmds= \ cd ..\..\..\adie \ $(WkspDir)\reswrap\Debug\reswrap -e -o icons.cpp adie_gif.gif big_gif.gif bookdel_gif.gif booknext_gif.gif bookprev_gif.gif bookset_gif.gif close_gif.gif colors_gif.gif copy_gif.gif cut_gif.gif delete_gif.gif fonts_gif.gif help_gif.gif indent_gif.gif info_gif.gif lang_gif.gif new_gif.gif open_gif.gif palette_gif.gif paste_gif.gif pattern_gif.gif print_gif.gif quit_gif.gif redo_gif.gif reload_gif.gif save_gif.gif saveas_gif.gif saveall_gif.gif search_gif.gif searchnext_gif.gif searchprev_gif.gif shiftleft_gif.gif shiftright_gif.gif small_gif.gif styles_gif.gif syntax_gif.gif undo_gif.gif \ $(WkspDir)\reswrap\Debug\reswrap -i -o icons.h adie_gif.gif big_gif.gif bookdel_gif.gif booknext_gif.gif bookprev_gif.gif bookset_gif.gif close_gif.gif colors_gif.gif copy_gif.gif cut_gif.gif delete_gif.gif fonts_gif.gif help_gif.gif indent_gif.gif info_gif.gif lang_gif.gif new_gif.gif open_gif.gif palette_gif.gif paste_gif.gif pattern_gif.gif print_gif.gif quit_gif.gif redo_gif.gif reload_gif.gif save_gif.gif saveas_gif.gif saveall_gif.gif search_gif.gif searchnext_gif.gif searchprev_gif.gif shiftleft_gif.gif shiftright_gif.gif small_gif.gif styles_gif.gif syntax_gif.gif undo_gif.gif \ "icons.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "icons.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=..\..\..\adie\icons.cpp # End Source File # Begin Source File SOURCE=..\..\..\adie\icons.h # End Source File # Begin Source File SOURCE=..\..\..\adie\indent_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\info_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\lang_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\main.cpp # End Source File # Begin Source File SOURCE=..\..\..\adie\new_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\open_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\palette_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\parsesyntax.cpp # End Source File # Begin Source File SOURCE=..\..\..\adie\paste_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\pattern_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\Preferences.cpp # End Source File # Begin Source File SOURCE=..\..\..\adie\Preferences.h # End Source File # Begin Source File SOURCE=..\..\..\adie\print_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\quit_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\redo_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\reload_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\save_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\saveall_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\saveas_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\search_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\searchnext_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\searchprev_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\shiftleft_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\shiftright_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\small_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\styles_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\syntax_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\adie\TextWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\adie\TextWindow.h # End Source File # Begin Source File SOURCE=..\..\..\adie\undo_gif.gif # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/bitmapviewer/000077500000000000000000000000001326741342000177755ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/bitmapviewer/bitmapviewer.dsp000066400000000000000000000074511326741342000232120ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="bitmapviewer" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=bitmapviewer - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "bitmapviewer.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "bitmapviewer.mak" CFG="bitmapviewer - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "bitmapviewer - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "bitmapviewer - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "bitmapviewer - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "bitmapviewer - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /GZ /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "bitmapviewer - Win32 Release" # Name "bitmapviewer - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\bitmapviewer.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/button/000077500000000000000000000000001326741342000166125ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/button/button.dsp000066400000000000000000000073161326741342000206440ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="button" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=button - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "button.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "button.mak" CFG="button - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "button - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "button - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "button - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "button - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "button - Win32 Release" # Name "button - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\button.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/calculator/000077500000000000000000000000001326741342000174305ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/calculator/calculator.dsp000066400000000000000000000134141326741342000222740ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="calculator" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=calculator - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "calculator.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "calculator.mak" CFG="calculator - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "calculator - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "calculator - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "calculator - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 winspool.lib comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "calculator - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "calculator - Win32 Release" # Name "calculator - Win32 Debug" # Begin Source File SOURCE=..\..\..\calculator\bigcalc.gif # End Source File # Begin Source File SOURCE=..\..\..\calculator\Calculator.cpp # End Source File # Begin Source File SOURCE=..\..\..\calculator\Calculator.h # End Source File # Begin Source File SOURCE=..\..\..\calculator\colors.gif # End Source File # Begin Source File SOURCE=..\..\..\calculator\constmem.bmp # End Source File # Begin Source File SOURCE=.\gifs.list !IF "$(CFG)" == "calculator - Win32 Release" # Begin Custom Build WkspDir=. InputPath=.\gifs.list BuildCmds= \ cd ..\..\..\calculator \ $(WkspDir)\reswrap\Release\reswrap -o icons.h bigcalc.gif tinycalc.gif constmem.bmp question.gif colors.gif information.gif \ "icons.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "icons.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "calculator - Win32 Debug" # Begin Custom Build WkspDir=. InputPath=.\gifs.list BuildCmds= \ cd ..\..\..\calculator \ $(WkspDir)\reswrap\Debug\reswrap -o icons.h bigcalc.gif tinycalc.gif constmem.bmp question.gif colors.gif information.gif \ "icons.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "icons.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=..\..\..\calculator\help.cpp # End Source File # Begin Source File SOURCE=..\..\..\calculator\HelpWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\calculator\HelpWindow.h # End Source File # Begin Source File SOURCE=..\..\..\calculator\information.gif # End Source File # Begin Source File SOURCE=..\..\..\calculator\main.cpp # End Source File # Begin Source File SOURCE=..\..\..\calculator\Preferences.cpp # End Source File # Begin Source File SOURCE=..\..\..\calculator\Preferences.h # End Source File # Begin Source File SOURCE=..\..\..\calculator\question.gif # End Source File # Begin Source File SOURCE=..\..\..\calculator\tinycalc.gif # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/chart/000077500000000000000000000000001326741342000164005ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/chart/chart.dsp000066400000000000000000000056041326741342000202160ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="chart" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=chart - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "chart.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "chart.mak" CFG="chart - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "chart - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "chart - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "chart - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /Ox /Og /Oi /Os /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_LIB" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /out:"..\..\..\lib\CHART-1.6.lib" # SUBTRACT LIB32 /nologo !ELSEIF "$(CFG)" == "chart - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_LIB" /D "UNICODE" /FD /GZ /c # SUBTRACT CPP /nologo /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /out:"..\..\..\lib\CHARTD-1.6.lib" # SUBTRACT LIB32 /nologo !ENDIF # Begin Target # Name "chart - Win32 Release" # Name "chart - Win32 Debug" # Begin Source File SOURCE=..\..\..\chart\FXChart.cpp # End Source File # Begin Source File SOURCE=..\..\..\chart\FXChart.h # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/chartdll/000077500000000000000000000000001326741342000170745ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/chartdll/chartdll.dsp000066400000000000000000000100311326741342000213740ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="chartdll" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=chartdll - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "chartdll.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "chartdll.mak" CFG="chartdll - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "chartdll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "chartdll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "chartdll - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CHARTDLL_EXPORTS" /YX /FD /c # ADD CPP /MD /W3 /GR /GX /Ox /Og /Oi /Os /Gf /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "FOXDLL" /D "CHARTDLL_EXPORTS" /FAcs /FD /c # SUBTRACT CPP /nologo /Gy /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # SUBTRACT BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib winspool.lib comdlg32.lib FOXDLL-1.1.lib /dll /pdb:none /map /machine:I386 /out:"..\..\..\lib\CHARTDLL-1.1.dll" /implib:"..\..\..\lib\CHARTDLL-1.1.lib" # SUBTRACT LINK32 /verbose /profile /nodefaultlib !ELSEIF "$(CFG)" == "chartdll - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CHARTDLL_EXPORTS" /YX /FD /GZ /c # ADD CPP /MDd /W3 /GR /GX /Z7 /Od /Gf /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "FOXDLL" /D "CHARTDLL_EXPORTS" /FD /GZ /c # SUBTRACT CPP /nologo /Gy /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /dll /pdb:none /debug /machine:I386 /out:"..\..\..\lib\CHARTDLLD-1.1.dll" # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "chartdll - Win32 Release" # Name "chartdll - Win32 Debug" # Begin Source File SOURCE=..\..\..\chart\FXChart.cpp # End Source File # Begin Source File SOURCE=..\..\..\chart\FXChart.h # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/datatarget/000077500000000000000000000000001326741342000174175ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/datatarget/datatarget.dsp000066400000000000000000000074151326741342000222560ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="datatarget" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=datatarget - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "datatarget.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "datatarget.mak" CFG="datatarget - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "datatarget - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "datatarget - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "datatarget - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "datatarget - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "datatarget - Win32 Release" # Name "datatarget - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\datatarget.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/dctest/000077500000000000000000000000001326741342000165655ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/dctest/dctest.dsp000066400000000000000000000074271326741342000205750ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="dctest" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=dctest - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "dctest.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "dctest.mak" CFG="dctest - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "dctest - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "dctest - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "dctest - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib winspool.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "dctest - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "dctest - Win32 Release" # Name "dctest - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\dctest.cpp # End Source File # Begin Source File SOURCE=..\..\..\tests\dippy.h # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/dialog/000077500000000000000000000000001326741342000165365ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/dialog/dialog.dsp000066400000000000000000000073401326741342000205110ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="dialog" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=dialog - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "dialog.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "dialog.mak" CFG="dialog - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "dialog - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "dialog - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "dialog - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "dialog - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "dialog - Win32 Release" # Name "dialog - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\dialog.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/dirlist/000077500000000000000000000000001326741342000167515ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/dirlist/dirlist.dsp000066400000000000000000000073541326741342000211440ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="dirlist" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=dirlist - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "dirlist.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "dirlist.mak" CFG="dirlist - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "dirlist - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "dirlist - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "dirlist - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "dirlist - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "dirlist - Win32 Release" # Name "dirlist - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\dirlist.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/expression/000077500000000000000000000000001326741342000174765ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/expression/expression.dsp000077500000000000000000000073621326741342000224200ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="expression" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=expression - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "expression.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "expression.mak" CFG="expression - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "expression - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "expression - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "expression - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "UNICODE" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 winspool.lib comdlg32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /subsystem:console /pdb:none /machine:I386 !ELSEIF "$(CFG)" == "expression - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "UNICODE" /FD /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib comdlg32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /subsystem:console /pdb:none /debug /machine:I386 !ENDIF # Begin Target # Name "expression - Win32 Release" # Name "expression - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\expression.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/foursplit/000077500000000000000000000000001326741342000173265ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/foursplit/foursplit.dsp000066400000000000000000000073761326741342000221020ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="foursplit" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=foursplit - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "foursplit.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "foursplit.mak" CFG="foursplit - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "foursplit - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "foursplit - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "foursplit - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "foursplit - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "foursplit - Win32 Release" # Name "foursplit - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\foursplit.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/fox/000077500000000000000000000000001326741342000160735ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/fox/fox.dsp000066400000000000000000001410571326741342000174070ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="fox" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Static Library" 0x0104 CFG=FOX - WIN32 RELEASE !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "fox.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "fox.mak" CFG="FOX - WIN32 RELEASE" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "fox - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "fox - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "fox - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /Ox /Og /Oi /Os /Gf /Gy /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /D "HAVE_GL_H" /D "HAVE_GLU_H" /FD /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /out:"..\..\..\lib\FOX-1.6.lib" !ELSEIF "$(CFG)" == "fox - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /D "HAVE_GL_H" /D "HAVE_GLU_H" /FD /c # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /out:"..\..\..\lib\FOXD-1.6.lib" !ENDIF # Begin Target # Name "fox - Win32 Release" # Name "fox - Win32 Debug" # Begin Source File SOURCE=..\..\..\include\fx.h # End Source File # Begin Source File SOURCE=..\..\..\include\fx3d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX4Splitter.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX4Splitter.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX7Segment.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX7Segment.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885910Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885910Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885911Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885911Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885913Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885913Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885914Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885914Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885915Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885915Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885916Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885916Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88591Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88591Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88592Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88592Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88593Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88593Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88594Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88594Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88595Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88595Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88596Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88596Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88597Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88597Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88598Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88598Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88599Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88599Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXAccelTable.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXAccelTable.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXApp.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXApp.h # End Source File # Begin Source File SOURCE=..\..\..\include\FXArray.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXArrowButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXArrowButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxascii.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\fxascii.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBitmap.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBitmap.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBitmapFrame.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBitmapFrame.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBitmapView.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBitmapView.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBMPIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBMPIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBMPImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBMPImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxbmpio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBZFileStream.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBZFileStream.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCanvas.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCanvas.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCheckButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCheckButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXChoiceBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXChoiceBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorNames.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorRing.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorRing.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorSelector.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorSelector.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorWell.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorWell.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorWheel.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorWheel.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXComboBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXComboBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXComposeContext.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXComposeContext.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXComposite.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXComposite.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1250Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1250Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1251Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1251Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1252Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1252Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1253Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1253Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1254Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1254Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1255Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1255Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1256Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1256Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1257Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1257Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1258Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1258Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP437Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP437Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP850Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP850Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP852Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP852Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP855Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP855Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP856Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP856Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP857Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP857Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP860Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP860Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP861Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP861Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP862Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP862Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP863Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP863Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP864Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP864Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP865Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP865Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP866Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP866Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP869Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP869Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP874Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP874Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCURCursor.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCURCursor.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCursor.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCursor.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDataTarget.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDataTarget.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDate.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDate.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDC.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDC.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDCPrint.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDCPrint.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDCWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDCWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDebugTarget.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDebugTarget.h # End Source File # Begin Source File SOURCE=..\..\..\include\fxdefs.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDelegator.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDelegator.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDial.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDial.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDialogBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDialogBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDict.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDict.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDir.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDir.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDirBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDirBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDirDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDirDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDirList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDirList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDirSelector.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDirSelector.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDLL.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDLL.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDockBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDockBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDockHandler.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDockHandler.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDockSite.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDockSite.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDockTitle.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDockTitle.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDocument.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDocument.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDragCorner.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDragCorner.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDrawable.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDrawable.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDriveBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDriveBox.h # End Source File # Begin Source File SOURCE=..\..\..\include\FXElement.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXException.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXException.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXExpression.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXExpression.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXExtentd.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXExtentd.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXExtentf.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXExtentf.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxezquantize.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXFile.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFile.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFileDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFileDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFileDict.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFileDict.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFileList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFileList.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxfilematch.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXFileSelector.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFileSelector.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFileStream.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFileStream.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFoldingList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFoldingList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFont.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFont.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFontDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFontDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFontSelector.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFontSelector.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFrame.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFrame.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxfsquantize.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXGIFCursor.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGIFCursor.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGIFIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGIFIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGIFImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGIFImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxgifio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLCanvas.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLCanvas.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLCone.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLCone.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLContext.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLContext.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLCube.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLCube.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLCylinder.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLCylinder.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLObject.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLObject.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLShape.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLShape.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLSphere.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLSphere.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLTriangleMesh.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLTriangleMesh.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLViewer.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLViewer.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLVisual.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLVisual.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGradientBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGradientBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGroupBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGroupBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGUISignal.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGUISignal.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGZFileStream.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGZFileStream.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXHash.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXHash.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXHeader.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXHeader.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXHorizontalFrame.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXHorizontalFrame.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXICOIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXICOIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXICOImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXICOImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxicoio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIconDict.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIconDict.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIconList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIconList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIconSource.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIconSource.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXId.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXId.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIFFIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIFFIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIFFImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIFFImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxiffio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXImageFrame.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXImageFrame.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXImageView.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXImageView.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXInputDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXInputDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIO.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIO.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxjpegio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXJPGIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXJPGIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXJPGImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXJPGImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxkeyboard.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\fxkeys.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxkeysym.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXKnob.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXKnob.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXKOI8RCodec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXKOI8RCodec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXLabel.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXLabel.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXListBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXListBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMainWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMainWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMat3d.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMat3d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMat3f.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMat3f.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMat4d.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMat4d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMat4f.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMat4f.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMatrix.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMatrix.h # End Source File # Begin Source File SOURCE=..\..\..\include\FXMBCSCodec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMDIButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMDIButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMDIChild.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMDIChild.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMDIClient.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMDIClient.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMemMap.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMemMap.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMemoryStream.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMemoryStream.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuCaption.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuCaption.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuCascade.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuCascade.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuCheck.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuCheck.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuCommand.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuCommand.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuPane.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuPane.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuRadio.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuRadio.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuSeparator.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuSeparator.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuTitle.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuTitle.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMessageBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMessageBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXObject.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXObject.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXObjectList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXObjectList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXOptionMenu.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXOptionMenu.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPacker.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPacker.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxparsegeometry.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXPath.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPath.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPCXIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPCXIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPCXImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPCXImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxpcxio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXPicker.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPicker.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPipe.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPipe.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPNGIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPNGIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPNGImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPNGImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxpngio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXPoint.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPoint.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPopup.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPopup.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPPMIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPPMIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPPMImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPPMImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxppmio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXPrintDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPrintDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxpriv.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\fxpriv.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXProgressBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXProgressBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXProgressDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXProgressDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxpsio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXQuatd.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXQuatd.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXQuatf.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXQuatf.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRadioButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRadioButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRanged.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRanged.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRangef.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRangef.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRASIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRASIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRASImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRASImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxrasio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXRealSlider.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRealSlider.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRealSpinner.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRealSpinner.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRecentFiles.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRecentFiles.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRectangle.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRectangle.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRegion.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRegion.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRegistry.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRegistry.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXReplaceDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXReplaceDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRex.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRex.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRGBIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRGBIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRGBImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRGBImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxrgbio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXRootWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRootWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRuler.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRuler.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRulerView.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRulerView.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXScrollArea.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXScrollArea.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXScrollBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXScrollBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXScrollPane.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXScrollPane.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXScrollWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXScrollWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSearchDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSearchDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSeparator.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSeparator.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSettings.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSettings.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXShell.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXShell.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXShutter.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXShutter.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSize.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSize.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSlider.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSlider.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSocket.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSocket.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSphered.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSphered.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSpheref.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSpheref.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSpinner.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSpinner.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSplashWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSplashWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSplitter.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSplitter.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSpring.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSpring.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXStat.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXStat.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXStatusBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXStatusBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXStatusLine.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXStatusLine.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXStream.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXStream.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXString.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXString.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXStringDict.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXStringDict.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSwitcher.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSwitcher.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSystem.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSystem.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTabBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTabBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTabBook.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTabBook.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTabItem.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTabItem.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTable.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTable.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxtargaio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXText.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXText.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTextCodec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTextCodec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTextField.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTextField.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTGAIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTGAIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTGAImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTGAImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXThread.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXThread.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTIFIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTIFIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTIFImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTIFImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxtifio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXToggleButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToggleButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXToolBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToolBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXToolBarGrip.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToolBarGrip.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXToolBarShell.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToolBarShell.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXToolBarTab.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToolBarTab.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXToolTip.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToolTip.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTopWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTopWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTranslator.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTranslator.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTreeList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTreeList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTreeListBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTreeListBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTriStateButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTriStateButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXUndoList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXUndoList.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxunicode.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\fxunicode.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXURL.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXURL.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXUTF16Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXUTF16Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXUTF32Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXUTF32Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXUTF8Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXUTF8Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxutils.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec2d.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec2d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec2f.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec2f.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec3d.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec3d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec3f.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec3f.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec4d.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec4d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec4f.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec4f.h # End Source File # Begin Source File SOURCE=..\..\..\include\fxver.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVerticalFrame.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVerticalFrame.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVisual.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVisual.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXWizard.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXWizard.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxwuquantize.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXXBMIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXXBMIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXXBMImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXXBMImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxxbmio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXXPMIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXXPMIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXXPMImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXXPMImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxxpmio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\icons.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\icons.h # End Source File # Begin Source File SOURCE=..\..\..\src\jitter.h # End Source File # Begin Source File SOURCE=..\..\..\src\strtoll.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\version.rc # End Source File # Begin Source File SOURCE=..\..\..\src\vsscanf.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\xincs.h # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/foxdll/000077500000000000000000000000001326741342000165675ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/foxdll/foxdll.dsp000066400000000000000000001436421326741342000206010ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="foxdll" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=FOXDLL - WIN32 RELEASE !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "foxdll.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "foxdll.mak" CFG="FOXDLL - WIN32 RELEASE" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "foxdll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "foxdll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "foxdll - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\..\..\lib" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "FOXDLL_EXPORTS" /YX /FD /c # ADD CPP /MD /W3 /GR /GX /Ox /Og /Oi /Os /Gf /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "FOXDLL" /D "FOXDLL_EXPORTS" /D "HAVE_GL_H" /D "HAVE_GLU_H" /FD /c # SUBTRACT CPP /nologo /Gy /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib opengl32.lib glu32.lib comctl32.lib winspool.lib wsock32.lib /nologo /dll /pdb:none /machine:I386 /out:"..\..\..\lib\FOXDLL-1.6.dll" !ELSEIF "$(CFG)" == "foxdll - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\..\..\lib" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "FOXDLL_EXPORTS" /YX /FD /GZ /c # ADD CPP /MDd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /D "_USRDLL" /D "FOXDLL" /D "FOXDLL_EXPORTS" /D "HAVE_GL_H" /D "HAVE_GLU_H" /FD /GZ /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib opengl32.lib glu32.lib comctl32.lib winspool.lib wsock32.lib /nologo /dll /pdb:none /debug /machine:I386 /out:"..\..\..\lib\FOXDLLD-1.6.dll" !ENDIF # Begin Target # Name "foxdll - Win32 Release" # Name "foxdll - Win32 Debug" # Begin Source File SOURCE=..\..\..\include\fx.h # End Source File # Begin Source File SOURCE=..\..\..\include\fx3d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX4Splitter.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX4Splitter.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX7Segment.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX7Segment.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885910Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885910Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885911Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885911Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885913Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885913Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885914Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885914Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885915Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885915Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX885916Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX885916Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88591Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88591Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88592Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88592Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88593Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88593Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88594Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88594Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88595Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88595Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88596Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88596Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88597Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88597Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88598Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88598Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FX88599Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FX88599Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXAccelTable.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXAccelTable.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXApp.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXApp.h # End Source File # Begin Source File SOURCE=..\..\..\include\FXArray.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXArrowButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXArrowButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxascii.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\fxascii.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBitmap.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBitmap.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBitmapFrame.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBitmapFrame.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBitmapView.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBitmapView.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBMPIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBMPIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBMPImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBMPImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxbmpio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXBZFileStream.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXBZFileStream.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCanvas.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCanvas.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCheckButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCheckButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXChoiceBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXChoiceBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorNames.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorRing.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorRing.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorSelector.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorSelector.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorWell.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorWell.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXColorWheel.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXColorWheel.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXComboBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXComboBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXComposeContext.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXComposeContext.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXComposite.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXComposite.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1250Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1250Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1251Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1251Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1252Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1252Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1253Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1253Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1254Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1254Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1255Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1255Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1256Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1256Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1257Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1257Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP1258Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP1258Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP437Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP437Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP850Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP850Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP852Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP852Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP855Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP855Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP856Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP856Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP857Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP857Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP860Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP860Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP861Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP861Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP862Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP862Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP863Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP863Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP864Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP864Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP865Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP865Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP866Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP866Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP869Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP869Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCP874Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCP874Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCURCursor.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCURCursor.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXCursor.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXCursor.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDataTarget.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDataTarget.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDate.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDate.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDC.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDC.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDCPrint.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDCPrint.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDCWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDCWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDebugTarget.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDebugTarget.h # End Source File # Begin Source File SOURCE=..\..\..\include\fxdefs.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDelegator.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDelegator.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDial.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDial.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDialogBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDialogBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDict.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDict.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDir.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDir.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDirBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDirBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDirDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDirDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDirList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDirList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDirSelector.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDirSelector.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDLL.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDLL.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDockBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDockBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDockHandler.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDockHandler.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDockSite.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDockSite.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDockTitle.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDockTitle.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDocument.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDocument.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDragCorner.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDragCorner.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDrawable.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDrawable.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXDriveBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXDriveBox.h # End Source File # Begin Source File SOURCE=..\..\..\include\FXElement.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXException.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXException.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXExpression.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXExpression.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXExtentd.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXExtentd.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXExtentf.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXExtentf.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxezquantize.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXFile.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFile.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFileDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFileDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFileDict.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFileDict.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFileList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFileList.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxfilematch.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXFileSelector.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFileSelector.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFileStream.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFileStream.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFoldingList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFoldingList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFont.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFont.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFontDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFontDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFontSelector.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFontSelector.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXFrame.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXFrame.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxfsquantize.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXGIFCursor.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGIFCursor.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGIFIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGIFIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGIFImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGIFImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxgifio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLCanvas.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLCanvas.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLCone.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLCone.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLContext.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLContext.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLCube.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLCube.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLCylinder.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLCylinder.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLObject.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLObject.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLShape.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLShape.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLSphere.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLSphere.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLTriangleMesh.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLTriangleMesh.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLViewer.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLViewer.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGLVisual.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGLVisual.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGradientBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGradientBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGroupBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGroupBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGUISignal.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGUISignal.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXGZFileStream.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXGZFileStream.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXHash.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXHash.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXHeader.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXHeader.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXHorizontalFrame.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXHorizontalFrame.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXICOIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXICOIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXICOImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXICOImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxicoio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIconDict.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIconDict.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIconList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIconList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIconSource.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIconSource.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXId.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXId.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIFFIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIFFIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIFFImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIFFImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxiffio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXImageFrame.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXImageFrame.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXImageView.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXImageView.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXInputDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXInputDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXIO.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXIO.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxjpegio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXJPGIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXJPGIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXJPGImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXJPGImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxkeyboard.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\fxkeys.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxkeysym.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXKnob.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXKnob.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXKOI8RCodec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXKOI8RCodec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXLabel.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXLabel.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXListBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXListBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMainWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMainWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMat3d.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMat3d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMat3f.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMat3f.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMat4d.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMat4d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMat4f.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMat4f.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMatrix.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMatrix.h # End Source File # Begin Source File SOURCE=..\..\..\include\FXMBCSCodec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMDIButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMDIButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMDIChild.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMDIChild.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMDIClient.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMDIClient.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMemMap.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMemMap.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMemoryStream.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMemoryStream.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuCaption.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuCaption.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuCascade.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuCascade.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuCheck.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuCheck.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuCommand.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuCommand.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuPane.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuPane.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuRadio.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuRadio.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuSeparator.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuSeparator.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMenuTitle.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMenuTitle.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXMessageBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXMessageBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXObject.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXObject.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXObjectList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXObjectList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXOptionMenu.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXOptionMenu.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPacker.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPacker.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxparsegeometry.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXPath.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPath.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPCXIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPCXIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPCXImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPCXImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxpcxio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXPicker.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPicker.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPipe.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPipe.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPNGIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPNGIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPNGImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPNGImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxpngio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXPoint.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPoint.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPopup.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPopup.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPPMIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPPMIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXPPMImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPPMImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxppmio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXPrintDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXPrintDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxpriv.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\fxpriv.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXProgressBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXProgressBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXProgressDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXProgressDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxpsio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXQuatd.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXQuatd.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXQuatf.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXQuatf.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRadioButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRadioButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRanged.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRanged.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRangef.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRangef.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRASIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRASIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRASImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRASImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxrasio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXRealSlider.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRealSlider.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRealSpinner.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRealSpinner.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRecentFiles.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRecentFiles.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRectangle.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRectangle.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRegion.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRegion.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRegistry.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRegistry.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXReplaceDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXReplaceDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRex.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRex.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRGBIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRGBIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRGBImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRGBImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxrgbio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXRootWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRootWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRuler.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRuler.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXRulerView.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXRulerView.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXScrollArea.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXScrollArea.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXScrollBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXScrollBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXScrollPane.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXScrollPane.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXScrollWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXScrollWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSearchDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSearchDialog.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSeparator.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSeparator.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSettings.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSettings.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXShell.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXShell.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXShutter.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXShutter.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSize.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSize.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSlider.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSlider.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSocket.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSocket.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSphered.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSphered.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSpheref.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSpheref.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSpinner.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSpinner.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSplashWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSplashWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSplitter.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSplitter.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSpring.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSpring.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXStat.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXStat.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXStatusBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXStatusBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXStatusLine.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXStatusLine.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXStream.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXStream.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXString.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXString.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXStringDict.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXStringDict.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSwitcher.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSwitcher.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXSystem.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXSystem.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTabBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTabBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTabBook.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTabBook.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTabItem.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTabItem.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTable.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTable.h # End Source File # Begin Source File SOURCE=..\..\..\include\FXTableItem.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxtargaio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXText.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXText.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTextCodec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTextCodec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTextField.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTextField.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTGAIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTGAIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTGAImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTGAImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXThread.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXThread.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTIFIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTIFIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTIFImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTIFImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxtifio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXToggleButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToggleButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXToolBar.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToolBar.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXToolBarGrip.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToolBarGrip.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXToolBarShell.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToolBarShell.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXToolBarTab.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToolBarTab.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXToolTip.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXToolTip.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTopWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTopWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTranslator.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTranslator.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTreeList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTreeList.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTreeListBox.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTreeListBox.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXTriStateButton.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXTriStateButton.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXUndoList.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXUndoList.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxunicode.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\fxunicode.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXURL.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXURL.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXUTF16Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXUTF16Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXUTF32Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXUTF32Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXUTF8Codec.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXUTF8Codec.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxutils.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec2d.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec2d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec2f.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec2f.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec3d.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec3d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec3f.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec3f.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec4d.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec4d.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVec4f.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVec4f.h # End Source File # Begin Source File SOURCE=..\..\..\include\fxver.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVerticalFrame.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVerticalFrame.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXVisual.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXVisual.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXWindow.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXWindow.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXWizard.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXWizard.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxwuquantize.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXXBMIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXXBMIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXXBMImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXXBMImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxxbmio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\FXXPMIcon.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXXPMIcon.h # End Source File # Begin Source File SOURCE=..\..\..\src\FXXPMImage.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\FXXPMImage.h # End Source File # Begin Source File SOURCE=..\..\..\src\fxxpmio.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\icons.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\icons.h # End Source File # Begin Source File SOURCE=..\..\..\src\jitter.h # End Source File # Begin Source File SOURCE=..\..\..\src\strtoll.cpp # End Source File # Begin Source File SOURCE=..\..\..\src\version.rc # End Source File # Begin Source File SOURCE=..\..\..\src\vsscanf.cpp # End Source File # Begin Source File SOURCE=..\..\..\include\xincs.h # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/gltest/000077500000000000000000000000001326741342000166015ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/gltest/gltest.dsp000066400000000000000000000077601326741342000206250ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="gltest" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=GLTEST - WIN32 DEBUG !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "gltest.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "gltest.mak" CFG="GLTEST - WIN32 DEBUG" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "gltest - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "gltest - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "gltest - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /D "HAVE_GL_H" /D "HAVE_GLU_H" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 winspool.lib comdlg32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "gltest - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /D "HAVE_GL_H" /D "HAVE_GLU_H" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib comdlg32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "gltest - Win32 Release" # Name "gltest - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\gltest.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/glviewer/000077500000000000000000000000001326741342000171235ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/glviewer/glviewer.dsp000066400000000000000000000077001326741342000214630ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="glviewer" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=GLVIEWER - WIN32 DEBUG !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "glviewer.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "glviewer.mak" CFG="GLVIEWER - WIN32 DEBUG" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "glviewer - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "glviewer - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "glviewer - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /D "HAVE_GL_H" /D "HAVE_GLU_H" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 winspool.lib comdlg32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib opengl32.lib glu32.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "glviewer - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /D "HAVE_GL_H" /D "HAVE_GLU_H" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib opengl32.lib glu32.lib comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "glviewer - Win32 Release" # Name "glviewer - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\glviewer.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/groupbox/000077500000000000000000000000001326741342000171445ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/groupbox/groupbox.dsp000066400000000000000000000073741326741342000215340ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="groupbox" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=groupbox - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "groupbox.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "groupbox.mak" CFG="groupbox - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "groupbox - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "groupbox - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "groupbox - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "groupbox - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /Fr /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "groupbox - Win32 Release" # Name "groupbox - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\groupbox.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/header/000077500000000000000000000000001326741342000165275ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/header/header.dsp000066400000000000000000000073401326741342000204730ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="header" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=header - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "header.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "header.mak" CFG="header - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "header - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "header - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "header - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "header - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "header - Win32 Release" # Name "header - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\header.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/hello/000077500000000000000000000000001326741342000164025ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/hello/hello.dsp000066400000000000000000000073241326741342000202230ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="hello" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=hello - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "hello.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "hello.mak" CFG="hello - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "hello - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "hello - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "hello - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "hello - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "hello - Win32 Release" # Name "hello - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\hello.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/hello2/000077500000000000000000000000001326741342000164645ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/hello2/hello2.dsp000066400000000000000000000073401326741342000203650ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="hello2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=hello2 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "hello2.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "hello2.mak" CFG="hello2 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "hello2 - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "hello2 - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "hello2 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "hello2 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "hello2 - Win32 Release" # Name "hello2 - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\hello2.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/iconlist/000077500000000000000000000000001326741342000171235ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/iconlist/iconlist.dsp000066400000000000000000000073701326741342000214660ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="iconlist" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=iconlist - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "iconlist.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "iconlist.mak" CFG="iconlist - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "iconlist - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "iconlist - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "iconlist - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "iconlist - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "iconlist - Win32 Release" # Name "iconlist - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\iconlist.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/image/000077500000000000000000000000001326741342000163615ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/image/image.dsp000066400000000000000000000073211326741342000201560ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="image" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=image - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "image.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "image.mak" CFG="image - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "image - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "image - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "image - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "image - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "image - Win32 Release" # Name "image - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\image.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/imageviewer/000077500000000000000000000000001326741342000176035ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/imageviewer/imageviewer.dsp000066400000000000000000000073601326741342000226250ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="imageviewer" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=imageviewer - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "imageviewer.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "imageviewer.mak" CFG="imageviewer - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "imageviewer - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "imageviewer - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "imageviewer - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "imageviewer - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "imageviewer - Win32 Release" # Name "imageviewer - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\imageviewer.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/layout/000077500000000000000000000000001326741342000166145ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/layout/layout.dsp000066400000000000000000000073011326741342000206420ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="layout" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=layout - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "layout.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "layout.mak" CFG="layout - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "layout - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "layout - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "layout - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "layout - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "layout - Win32 Release" # Name "layout - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\layout.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/mditest/000077500000000000000000000000001326741342000167505ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/mditest/mditest.dsp000066400000000000000000000073511326741342000211370ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="mditest" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=mditest - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "mditest.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "mditest.mak" CFG="mditest - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "mditest - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "mditest - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "mditest - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "mditest - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "mditest - Win32 Release" # Name "mditest - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\mditest.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/memmap/000077500000000000000000000000001326741342000165535ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/memmap/memmap.dsp000066400000000000000000000074211326741342000205430ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="memmap" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=memmap - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "memmap.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "memmap.mak" CFG="memmap - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "memmap - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "memmap - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "memmap - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "UNICODE" /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 winspool.lib comdlg32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /subsystem:console /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "memmap - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "UNICODE" /FD /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib comdlg32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /subsystem:console /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "memmap - Win32 Release" # Name "memmap - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\memmap.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/minheritance/000077500000000000000000000000001326741342000177455ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/minheritance/minheritance.dsp000066400000000000000000000075261326741342000231350ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="minheritance" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=minheritance - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "minheritance.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "minheritance.mak" CFG="minheritance - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "minheritance - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "minheritance - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "minheritance - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 winspool.lib comdlg32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /subsystem:console /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "minheritance - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "UNICODE" /FD /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib comdlg32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /subsystem:console /pdb:none /debug /machine:I386 !ENDIF # Begin Target # Name "minheritance - Win32 Release" # Name "minheritance - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\minheritance.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/pathfinder/000077500000000000000000000000001326741342000174235ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/pathfinder/pathfinder.dsp000066400000000000000000000244331326741342000222650ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="pathfinder" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=pathfinder - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "pathfinder.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "pathfinder.mak" CFG="pathfinder - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "pathfinder - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "pathfinder - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "pathfinder - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 winspool.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "pathfinder - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "pathfinder - Win32 Release" # Name "pathfinder - Win32 Debug" # Begin Source File SOURCE=..\..\..\pathfinder\bigicons.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\closepanel.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\clrbook.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\copy.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\CopyDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\CopyDialog.h # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\copyit.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\cut.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\deleteit.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\desktop.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\details.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\dirup.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\enter.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\file_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\foxbig.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\foxmini.gif # End Source File # Begin Source File SOURCE=.\gifs.list !IF "$(CFG)" == "pathfinder - Win32 Release" # Begin Custom Build WkspDir=. InputPath=.\gifs.list BuildCmds= \ cd ..\..\..\pathfinder \ $(WkspDir)\reswrap\Release\reswrap -e -o icons.cpp bigicons.bmp copy.bmp cut.bmp deleteit.bmp desktop.bmp details.bmp dirup.bmp goback.bmp goforw.bmp gotodir.bmp hosts.bmp maphost.bmp paste.bmp properties.bmp smallicons.bmp unmaphost.bmp closepanel.gif clrbook.gif copyit.gif enter.gif file_gif.gif foxbig.gif foxmini.gif home.gif iconpath.gif linkit.gif location.gif mimetype.gif moveit.gif pattern_gif.gif quit_gif.gif renameit.gif rotateleft.gif rotateright.gif setbook.gif setdir.gif work.gif \ $(WkspDir)\reswrap\Release\reswrap -i -o icons.h bigicons.bmp copy.bmp cut.bmp deleteit.bmp desktop.bmp details.bmp dirup.bmp goback.bmp goforw.bmp gotodir.bmp hosts.bmp maphost.bmp paste.bmp properties.bmp smallicons.bmp unmaphost.bmp closepanel.gif clrbook.gif copyit.gif enter.gif file_gif.gif foxbig.gif foxmini.gif home.gif iconpath.gif linkit.gif location.gif mimetype.gif moveit.gif pattern_gif.gif quit_gif.gif renameit.gif rotateleft.gif rotateright.gif setbook.gif setdir.gif work.gif \ "icons.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "icons.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "pathfinder - Win32 Debug" # Begin Custom Build WkspDir=. InputPath=.\gifs.list BuildCmds= \ cd ..\..\..\pathfinder \ $(WkspDir)\reswrap\Debug\reswrap -e -o icons.cpp bigicons.bmp copy.bmp cut.bmp deleteit.bmp desktop.bmp details.bmp dirup.bmp goback.bmp goforw.bmp gotodir.bmp hosts.bmp maphost.bmp paste.bmp properties.bmp smallicons.bmp unmaphost.bmp closepanel.gif clrbook.gif copyit.gif enter.gif file_gif.gif foxbig.gif foxmini.gif home.gif iconpath.gif linkit.gif location.gif mimetype.gif moveit.gif pattern_gif.gif quit_gif.gif renameit.gif rotateleft.gif rotateright.gif setbook.gif setdir.gif work.gif \ $(WkspDir)\reswrap\Debug\reswrap -i -o icons.h bigicons.bmp copy.bmp cut.bmp deleteit.bmp desktop.bmp details.bmp dirup.bmp goback.bmp goforw.bmp gotodir.bmp hosts.bmp maphost.bmp paste.bmp properties.bmp smallicons.bmp unmaphost.bmp closepanel.gif clrbook.gif copyit.gif enter.gif file_gif.gif foxbig.gif foxmini.gif home.gif iconpath.gif linkit.gif location.gif mimetype.gif moveit.gif pattern_gif.gif quit_gif.gif renameit.gif rotateleft.gif rotateright.gif setbook.gif setdir.gif work.gif \ "icons.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "icons.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\goback.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\goforw.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\gotodir.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\home.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\hosts.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\iconpath.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\icons.cpp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\icons.h # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\linkit.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\location.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\Makefile.am # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\Makefile.bc # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\maphost.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\mimetype.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\moveit.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\paste.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\PathFinder.cpp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\PathFinder.h # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\pattern_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\Preferences.cpp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\Preferences.h # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\properties.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\PropertyDialog.cpp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\PropertyDialog.h # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\quit_gif.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\renameit.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\rotateleft.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\rotateright.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\setbook.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\setdir.gif # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\smallicons.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\unmaphost.bmp # End Source File # Begin Source File SOURCE=..\..\..\pathfinder\work.gif # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/ratio/000077500000000000000000000000001326741342000164155ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/ratio/ratio.dsp000066400000000000000000000072031326741342000202450ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="ratio" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=ratio - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "ratio.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ratio.mak" CFG="ratio - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ratio - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "ratio - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "ratio - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 winspool.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /machine:I386 # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "ratio - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 winspool.lib comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 !ENDIF # Begin Target # Name "ratio - Win32 Release" # Name "ratio - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\ratio.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/reswrap/000077500000000000000000000000001326741342000167625ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/reswrap/reswrap.dsp000066400000000000000000000067071326741342000211670ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="reswrap" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=reswrap - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "reswrap.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "reswrap.mak" CFG="reswrap - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "reswrap - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "reswrap - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "reswrap - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /subsystem:console /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "reswrap - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /MTd /W3 /Gm- /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:console /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "reswrap - Win32 Release" # Name "reswrap - Win32 Debug" # Begin Source File SOURCE=..\..\..\utils\reswrap.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/scribble/000077500000000000000000000000001326741342000170645ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/scribble/scribble.dsp000066400000000000000000000073701326741342000213700ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="scribble" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=scribble - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "scribble.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "scribble.mak" CFG="scribble - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "scribble - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "scribble - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "scribble - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "scribble - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "scribble - Win32 Release" # Name "scribble - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\scribble.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/shutter/000077500000000000000000000000001326741342000167755ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/shutter/shutter.dsp000066400000000000000000000073511326741342000212110ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="shutter" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=shutter - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "shutter.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "shutter.mak" CFG="shutter - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "shutter - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "shutter - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "shutter - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "shutter - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "shutter - Win32 Release" # Name "shutter - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\shutter.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/shutterbug/000077500000000000000000000000001326741342000174735ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/shutterbug/shutterbug.dsp000066400000000000000000000147261326741342000224110ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="shutterbug" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=shutterbug - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "shutterbug.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "shutterbug.mak" CFG="shutterbug - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "shutterbug - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "shutterbug - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "shutterbug - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "shutterbug - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /GZ /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "shutterbug - Win32 Release" # Name "shutterbug - Win32 Debug" # Begin Source File SOURCE=..\shutterbug\icons !IF "$(CFG)" == "shutterbug - Win32 Release" # Begin Custom Build WkspDir=. InputPath=..\shutterbug\icons BuildCmds= \ cd ..\..\..\shutterbug \ $(WkspDir)\reswrap\Release\reswrap -e -o icons.cpp line_0.gif line_1.gif line_2.gif line_3.gif line_4.gif line_5.gif line_6.gif line_7.gif line_8.gif shutterbug.gif tinyshutterbug.gif \ $(WkspDir)\reswrap\Release\reswrap -i -o icons.h line_0.gif line_1.gif line_2.gif line_3.gif line_4.gif line_5.gif line_6.gif line_7.gif line_8.gif shutterbug.gif tinyshutterbug.gif \ "icons.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "icons.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ELSEIF "$(CFG)" == "shutterbug - Win32 Debug" # Begin Custom Build WkspDir=. InputPath=..\shutterbug\icons BuildCmds= \ cd ..\..\..\shutterbug \ $(WkspDir)\reswrap\Debug\reswrap -e -o icons.cpp line_0.gif line_1.gif line_2.gif line_3.gif line_4.gif line_5.gif line_6.gif line_7.gif line_8.gif shutterbug.gif tinyshutterbug.gif \ $(WkspDir)\reswrap\Debug\reswrap -i -o icons.h line_0.gif line_1.gif line_2.gif line_3.gif line_4.gif line_5.gif line_6.gif line_7.gif line_8.gif shutterbug.gif tinyshutterbug.gif \ "icons.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) "icons.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" $(BuildCmds) # End Custom Build !ENDIF # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\icons.cpp # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\icons.h # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\line_0.gif # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\line_1.gif # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\line_2.gif # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\line_3.gif # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\line_4.gif # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\line_5.gif # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\line_6.gif # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\line_7.gif # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\line_8.gif # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\ShutterBug.cpp # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\shutterbug.gif # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\ShutterBug.h # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\Snapper.cpp # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\Snapper.h # End Source File # Begin Source File SOURCE=..\..\..\shutterbug\tinyshutterbug.gif # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/splitter/000077500000000000000000000000001326741342000171455ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/splitter/splitter.dsp000066400000000000000000000073701326741342000215320ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="splitter" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=splitter - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "splitter.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "splitter.mak" CFG="splitter - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "splitter - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "splitter - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "splitter - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "splitter - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "splitter - Win32 Release" # Name "splitter - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\splitter.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/switcher/000077500000000000000000000000001326741342000171275ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/switcher/switcher.dsp000066400000000000000000000073621326741342000214770ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="switcher" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=switcher - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "switcher.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "switcher.mak" CFG="switcher - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "switcher - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "switcher - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "switcher - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "switcher - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "switcher - Win32 Release" # Name "switcher - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\switcher.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/tabbook/000077500000000000000000000000001326741342000167205ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/tabbook/tabbook.dsp000066400000000000000000000073541326741342000210620ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="tabbook" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=tabbook - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "tabbook.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "tabbook.mak" CFG="tabbook - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "tabbook - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "tabbook - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "tabbook - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "tabbook - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "tabbook - Win32 Release" # Name "tabbook - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\tabbook.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/table/000077500000000000000000000000001326741342000163665ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/table/table.dsp000066400000000000000000000073241326741342000201730ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="table" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=table - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "table.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "table.mak" CFG="table - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "table - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "table - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "table - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 # SUBTRACT LINK32 /nologo !ELSEIF "$(CFG)" == "table - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /X /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 # SUBTRACT LINK32 /nologo !ENDIF # Begin Target # Name "table - Win32 Release" # Name "table - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\table.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/vcpp/win32.dsw000077500000000000000000000254311326741342000167700ustar00rootroot00000000000000Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "adie"=".\adie\adie.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name reswrap End Project Dependency Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "bitmapviewer"=".\bitmapviewer\bitmapviewer.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "button"=".\button\button.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "calculator"=".\calculator\calculator.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency Begin Project Dependency Project_Dep_Name reswrap End Project Dependency }}} ############################################################################### Project: "chart"=".\chart\chart.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "datatarget"=".\datatarget\datatarget.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "dctest"=".\dctest\dctest.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "dialog"=".\dialog\dialog.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "dirlist"=".\dirlist\dirlist.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "expression"=".\expression\expression.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "foursplit"=".\foursplit\foursplit.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "fox"=".\fox\fox.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "foxdll"=".\foxdll\foxdll.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Project: "gltest"=".\gltest\gltest.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "glviewer"=".\glviewer\glviewer.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "groupbox"=".\groupbox\groupbox.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "header"=".\header\header.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "hello"=".\hello\hello.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "hello2"=".\hello2\hello2.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "iconlist"=".\iconlist\iconlist.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "image"=".\image\image.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "imageviewer"=".\imageviewer\imageviewer.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "layout"=".\layout\layout.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "mditest"=".\mditest\mditest.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "memmap"=".\memmap\memmap.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "minheritance"=".\minheritance\minheritance.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "pathfinder"=".\pathfinder\pathfinder.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name reswrap End Project Dependency Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "ratio"=".\ratio\ratio.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "reswrap"=".\reswrap\reswrap.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "scribble"=".\scribble\scribble.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "shutter"=".\shutter\shutter.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "shutterbug"=".\shutterbug\shutterbug.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency Begin Project Dependency Project_Dep_Name reswrap End Project Dependency }}} ############################################################################### Project: "splitter"=".\splitter\splitter.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "switcher"=".\switcher\switcher.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "tabbook"=".\tabbook\tabbook.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "table"=".\table\table.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Project: "wizard"=".\wizard\wizard.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name fox End Project Dependency }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### fox1.6-1.6.57/windows/vcpp/wizard/000077500000000000000000000000001326741342000165775ustar00rootroot00000000000000fox1.6-1.6.57/windows/vcpp/wizard/wizard.dsp000066400000000000000000000072361326741342000206170ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="wizard" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=wizard - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "wizard.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "wizard.mak" CFG="wizard - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "wizard - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "wizard - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "wizard - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD CPP /MT /W3 /GR /GX /O2 /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "UNICODE" /FD /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /machine:I386 !ELSEIF "$(CFG)" == "wizard - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /MTd /W3 /GR /GX /ZI /Od /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "UNICODE" /FD /GZ /c # SUBTRACT CPP /nologo /YX # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 comctl32.lib wsock32.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib mpr.lib /entry:"mainCRTStartup" /subsystem:windows /pdb:none /debug /machine:I386 !ENDIF # Begin Target # Name "wizard - Win32 Release" # Name "wizard - Win32 Debug" # Begin Source File SOURCE=..\..\..\tests\wizard.cpp # End Source File # End Target # End Project fox1.6-1.6.57/windows/watcom/000077500000000000000000000000001326741342000156215ustar00rootroot00000000000000fox1.6-1.6.57/windows/watcom/Makefile000066400000000000000000000010561326741342000172630ustar00rootroot00000000000000# # Top-level makefile for (Open)Watcom C++ # all: .SYMBOLIC cd ..\..\src wmake -f makefile.wc cd ..\utils wmake -f makefile.wc cd ..\tests wmake -f makefile.wc cd ..\adie wmake -f makefile.wc cd ..\pathfinder wmake -f makefile.wc cd ..\calculator wmake -f makefile.wc clean: .SYMBOLIC cd ..\..\src wmake -f makefile.wc clean cd ..\utils wmake -f makefile.wc clean cd ..\tests wmake -f makefile.wc clean cd ..\adie wmake -f makefile.wc clean cd ..\pathfinder wmake -f makefile.wc clean cd ..\calculator wmake -f makefile.wc clean